commit 6a777d54df0b4b6d5ac4fc4346206319572a785b Author: str1k3r <115313679+S1l3ntStr1ke87@users.noreply.github.com> Date: Thu Jul 9 04:15:40 2026 -0400 Init diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..15820ac8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,35 @@ +/ORBIS_Debug +/ORBIS_Release +/PS3_Debug +/PS3_Release +/X360_Debug +/X360_Release +/Release +/Debug +/x64 +/ipch +.vs/ + +/Minecraft.Client/ORBIS_Debug +/Minecraft.Client/ORBIS_Release +/Minecraft.Client/PS3_Debug +/Minecraft.Client/PS3_Release +/Minecraft.Client/X360_Debug +/Minecraft.Client/X360_Release +/Minecraft.Client/Debug +/Minecraft.Client/Release +/Minecraft.Client/x64 + +/Minecraft.World/ORBIS_Debug +/Minecraft.World/ORBIS_Release +/Minecraft.World/PS3_Debug +/Minecraft.World/PS3_Release +/Minecraft.World/X360_Debug +/Minecraft.World/X360_Release +/Minecraft.World/Debug +/Minecraft.World/Release +/Minecraft.World/x64_Debug +/Minecraft.World/x64_Release +MinecraftConsoles.opensdf +MinecraftConsoles.v11.suo +MinecraftConsoles.sdf diff --git a/Minecraft.Client/AbstractContainerScreen.cpp b/Minecraft.Client/AbstractContainerScreen.cpp new file mode 100644 index 00000000..2b3e0837 --- /dev/null +++ b/Minecraft.Client/AbstractContainerScreen.cpp @@ -0,0 +1,235 @@ +#include "stdafx.h" +#include "AbstractContainerScreen.h" +#include "ItemRenderer.h" +#include "MultiplayerLocalPlayer.h" +#include "Lighting.h" +#include "GameMode.h" +#include "KeyMapping.h" +#include "Options.h" +#include "..\Minecraft.World\net.minecraft.world.inventory.h" +#include "..\Minecraft.World\net.minecraft.locale.h" +#include "..\Minecraft.World\net.minecraft.world.item.h" + +ItemRenderer *AbstractContainerScreen::itemRenderer = new ItemRenderer(); + +AbstractContainerScreen::AbstractContainerScreen(AbstractContainerMenu *menu) +{ + // 4J - added initialisers + imageWidth = 176; + imageHeight = 166; + + this->menu = menu; +} + +void AbstractContainerScreen::init() +{ + Screen::init(); + minecraft->player->containerMenu = menu; +// leftPos = (width - imageWidth) / 2; +// topPos = (height - imageHeight) / 2; + +} + +void AbstractContainerScreen::render(int xm, int ym, float a) +{ + // 4J Stu - Not used +#if 0 + renderBackground(); + int xo = (width - imageWidth) / 2; + int yo = (height - imageHeight) / 2; + + renderBg(a); + + glPushMatrix(); + glRotatef(120, 1, 0, 0); + Lighting::turnOn(); + glPopMatrix(); + + glPushMatrix(); + glTranslatef((float)xo, (float)yo, 0); + + glColor4f(1, 1, 1, 1); + glEnable(GL_RESCALE_NORMAL); + + Slot *hoveredSlot = NULL; + + AUTO_VAR(itEnd, menu->slots->end()); + for (AUTO_VAR(it, menu->slots->begin()); it != itEnd; it++) + { + Slot *slot = *it; //menu->slots->at(i); + + renderSlot(slot); + + if (isHovering(slot, xm, ym)) + { + hoveredSlot = slot; + + glDisable(GL_LIGHTING); + glDisable(GL_DEPTH_TEST); + + int x = slot->x; + int y = slot->y; + fillGradient(x, y, x + 16, y + 16, 0x80ffffff, 0x80ffffff); + glEnable(GL_LIGHTING); + glEnable(GL_DEPTH_TEST); + } + } + + shared_ptr inventory = minecraft->player->inventory; + if (inventory->getCarried() != NULL) + { + glTranslatef(0, 0, 32); + // Slot old = carriedSlot; + // carriedSlot = null; + itemRenderer->renderGuiItem(font, minecraft->textures, inventory->getCarried(), xm - xo - 8, ym - yo - 8); + itemRenderer->renderGuiItemDecorations(font, minecraft->textures, inventory->getCarried(), xm - xo - 8, ym - yo - 8); + // carriedSlot = old; + } + glDisable(GL_RESCALE_NORMAL); + Lighting::turnOff(); + + glDisable(GL_LIGHTING); + glDisable(GL_DEPTH_TEST); + + renderLabels(); + + if (inventory->getCarried() == NULL && hoveredSlot != NULL && hoveredSlot->hasItem()) + { + + wstring elementName = trimString(Language::getInstance()->getElementName(hoveredSlot->getItem()->getDescriptionId())); + + if (elementName.length() > 0) + { + int x = xm - xo + 12; + int y = ym - yo - 12; + int width = font->width(elementName); + fillGradient(x - 3, y - 3, x + width + 3, y + 8 + 3, 0xc0000000, 0xc0000000); + + font->drawShadow(elementName, x, y, 0xffffffff); + } + + } + + glPopMatrix(); + + Screen::render(xm, ym, a); + glEnable(GL_LIGHTING); + glEnable(GL_DEPTH_TEST); +#endif +} + +void AbstractContainerScreen::renderLabels() +{ +} + +void AbstractContainerScreen::renderSlot(Slot *slot) +{ + // 4J Unused +#if 0 + int x = slot->x; + int y = slot->y; + shared_ptr item = slot->getItem(); + + if (item == NULL) + { + int icon = slot->getNoItemIcon(); + if (icon >= 0) + { + glDisable(GL_LIGHTING); + minecraft->textures->bind(minecraft->textures->loadTexture(TN_GUI_ITEMS));//L"/gui/items.png")); + blit(x, y, icon % 16 * 16, icon / 16 * 16, 16, 16); + glEnable(GL_LIGHTING); + return; + } + } + + itemRenderer->renderGuiItem(font, minecraft->textures, item, x, y); + itemRenderer->renderGuiItemDecorations(font, minecraft->textures, item, x, y); +#endif +} + +Slot *AbstractContainerScreen::findSlot(int x, int y) +{ + AUTO_VAR(itEnd, menu->slots->end()); + for (AUTO_VAR(it, menu->slots->begin()); it != itEnd; it++) + { + Slot *slot = *it; //menu->slots->at(i); + if (isHovering(slot, x, y)) return slot; + } + return NULL; +} + +bool AbstractContainerScreen::isHovering(Slot *slot, int xm, int ym) +{ + int xo = (width - imageWidth) / 2; + int yo = (height - imageHeight) / 2; + xm -= xo; + ym -= yo; + + return xm >= slot->x - 1 && xm < slot->x + 16 + 1 && ym >= slot->y - 1 && ym < slot->y + 16 + 1; + +} + +void AbstractContainerScreen::mouseClicked(int x, int y, int buttonNum) +{ + Screen::mouseClicked(x, y, buttonNum); + if (buttonNum == 0 || buttonNum == 1) + { + Slot *slot = findSlot(x, y); + + int xo = (width - imageWidth) / 2; + int yo = (height - imageHeight) / 2; + bool clickedOutside = (x < xo || y < yo || x >= xo + imageWidth || y >= yo + imageHeight); + + int slotId = -1; + if (slot != NULL) slotId = slot->index; + + if (clickedOutside) + { + slotId = AbstractContainerMenu::CLICKED_OUTSIDE; + } + + if (slotId != -1) + { + bool quickKey = slotId != AbstractContainerMenu::CLICKED_OUTSIDE && (Keyboard::isKeyDown(Keyboard::KEY_LSHIFT) || Keyboard::isKeyDown(Keyboard::KEY_RSHIFT)); + minecraft->gameMode->handleInventoryMouseClick(menu->containerId, slotId, buttonNum, quickKey, minecraft->player); + } + } + +} + +void AbstractContainerScreen::mouseReleased(int x, int y, int buttonNum) +{ + if (buttonNum == 0) + { + } +} + +void AbstractContainerScreen::keyPressed(wchar_t eventCharacter, int eventKey) +{ + if (eventKey == Keyboard::KEY_ESCAPE || eventKey == minecraft->options->keyBuild->key) + { + minecraft->player->closeContainer(); + } +} + +void AbstractContainerScreen::removed() +{ + if (minecraft->player == NULL) return; +} + +void AbstractContainerScreen::slotsChanged(shared_ptr container) +{ +} + +bool AbstractContainerScreen::isPauseScreen() +{ + return false; +} + +void AbstractContainerScreen::tick() +{ + Screen::tick(); + if (!minecraft->player->isAlive() || minecraft->player->removed) minecraft->player->closeContainer(); + +} \ No newline at end of file diff --git a/Minecraft.Client/AbstractContainerScreen.h b/Minecraft.Client/AbstractContainerScreen.h new file mode 100644 index 00000000..2ba9cdcd --- /dev/null +++ b/Minecraft.Client/AbstractContainerScreen.h @@ -0,0 +1,38 @@ +#pragma once +#include "Screen.h" +class ItemRenderer; +class AbstractContainerMenu; +class Slot; +class Container; + +class AbstractContainerScreen : public Screen +{ +private: + static ItemRenderer *itemRenderer; +protected: + int imageWidth; + int imageHeight; + //int leftPos, topPos; +public: + AbstractContainerMenu *menu; + + AbstractContainerScreen(AbstractContainerMenu *menu); + virtual void init(); + virtual void render(int xm, int ym, float a); +protected: + virtual void renderLabels(); + virtual void renderBg(float a) = 0; +private: + virtual void renderSlot(Slot *slot); + virtual Slot *findSlot(int x, int y); + virtual bool isHovering(Slot *slot, int xm, int ym); +protected: + virtual void mouseClicked(int x, int y, int buttonNum); + virtual void mouseReleased(int x, int y, int buttonNum); + virtual void keyPressed(wchar_t eventCharacter, int eventKey); +public: + virtual void removed(); + virtual void slotsChanged(shared_ptr container); + virtual bool isPauseScreen(); + virtual void tick(); +}; \ No newline at end of file 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 new file mode 100644 index 00000000..80799a4c --- /dev/null +++ b/Minecraft.Client/AbstractTexturePack.cpp @@ -0,0 +1,410 @@ +#include "stdafx.h" +#include "Textures.h" +#include "AbstractTexturePack.h" +#include "..\Minecraft.World\InputOutputStream.h" +#include "..\Minecraft.World\StringHelpers.h" + +AbstractTexturePack::AbstractTexturePack(DWORD id, File *file, const wstring &name, TexturePack *fallback) : id(id), name(name) +{ + // 4J init + textureId = -1; + m_colourTable = NULL; + + + this->file = file; + this->fallback = fallback; + + m_iconData = NULL; + m_iconSize = 0; + + m_comparisonData = NULL; + m_comparisonSize = 0; + + // 4J Stu - These calls need to be in the most derived version of the class + //loadIcon(); + //loadDescription(); +} + +wstring AbstractTexturePack::trim(wstring line) +{ + if (!line.empty() && line.length() > 34) + { + line = line.substr(0, 34); + } + return line; +} + +void AbstractTexturePack::loadIcon() +{ +#ifdef _XBOX + // 4J Stu - Temporary only + const DWORD LOCATOR_SIZE = 256; // Use this to allocate space to hold a ResourceLocator string + WCHAR szResourceLocator[ LOCATOR_SIZE ]; + + const ULONG_PTR c_ModuleHandle = (ULONG_PTR)GetModuleHandle(NULL); + swprintf(szResourceLocator, LOCATOR_SIZE ,L"section://%X,%ls#%ls",c_ModuleHandle,L"media", L"media/Graphics/TexturePackIcon.png"); + + UINT size = 0; + HRESULT hr = XuiResourceLoadAllNoLoc(szResourceLocator, &m_iconData, &size); + m_iconSize = size; +#endif +} + +void AbstractTexturePack::loadComparison() +{ +#ifdef _XBOX + // 4J Stu - Temporary only + const DWORD LOCATOR_SIZE = 256; // Use this to allocate space to hold a ResourceLocator string + WCHAR szResourceLocator[ LOCATOR_SIZE ]; + + const ULONG_PTR c_ModuleHandle = (ULONG_PTR)GetModuleHandle(NULL); + swprintf(szResourceLocator, LOCATOR_SIZE ,L"section://%X,%ls#%ls",c_ModuleHandle,L"media", L"media/Graphics/DefaultPack_Comparison.png"); + + UINT size = 0; + HRESULT hr = XuiResourceLoadAllNoLoc(szResourceLocator, &m_comparisonData, &size); + m_comparisonSize = size; +#endif +} + +void AbstractTexturePack::loadDescription() +{ + // 4J Unused currently +#if 0 + InputStream *inputStream = NULL; + BufferedReader *br = NULL; + //try { + inputStream = getResourceImplementation(L"/pack.txt"); + br = new BufferedReader(new InputStreamReader(inputStream)); + desc1 = trim(br->readLine()); + desc2 = trim(br->readLine()); + //} catch (IOException ignored) { + //} finally { + // TODO [EB]: use IOUtils.closeSilently() + // try { + if (br != NULL) + { + br->close(); + delete br; + } + if (inputStream != NULL) + { + inputStream->close(); + delete inputStream; + } + // } catch (IOException ignored) { + // } + //} +#endif +} + +void AbstractTexturePack::loadName() +{ +} + +InputStream *AbstractTexturePack::getResource(const wstring &name, bool allowFallback) //throws IOException +{ + app.DebugPrintf("texture - %ls\n",name.c_str()); + InputStream *is = getResourceImplementation(name); + if (is == NULL && fallback != NULL && allowFallback) + { + is = fallback->getResource(name, true); + } + + return is; +} + +// 4J Currently removed due to override in TexturePack class +//InputStream *AbstractTexturePack::getResource(const wstring &name) //throws IOException +//{ +// return getResource(name, true); +//} + +void AbstractTexturePack::unload(Textures *textures) +{ + if (iconImage != NULL && textureId != -1) + { + textures->releaseTexture(textureId); + } +} + +void AbstractTexturePack::load(Textures *textures) +{ + if (iconImage != NULL) + { + if (textureId == -1) + { + textureId = textures->getTexture(iconImage); + } + glBindTexture(GL_TEXTURE_2D, textureId); + textures->clearLastBoundId(); + } + else + { + // 4J Stu - Don't do this + //textures->bindTexture(L"/gui/unknown_pack.png"); + } +} + +bool AbstractTexturePack::hasFile(const wstring &name, bool allowFallback) +{ + bool hasFile = this->hasFile(name); + + return !hasFile && (allowFallback && fallback != NULL) ? fallback->hasFile(name, allowFallback) : hasFile; +} + +DWORD AbstractTexturePack::getId() +{ + return id; +} + +wstring AbstractTexturePack::getName() +{ + return texname; +} + +wstring AbstractTexturePack::getWorldName() +{ + return m_wsWorldName; +} + +wstring AbstractTexturePack::getDesc1() +{ + return desc1; +} + +wstring AbstractTexturePack::getDesc2() +{ + return desc2; +} + +wstring AbstractTexturePack::getAnimationString(const wstring &textureName, const wstring &path, bool allowFallback) +{ + return getAnimationString(textureName, path); +} + +wstring AbstractTexturePack::getAnimationString(const wstring &textureName, const wstring &path) +{ + wstring animationDefinitionFile = textureName + L".txt"; + + bool requiresFallback = !hasFile(L"\\" + textureName + L".png", false); + + wstring result = L""; + + InputStream *fileStream = getResource(L"\\" + path + animationDefinitionFile, requiresFallback); + + if(fileStream) + { + //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()) + { + line = trimString(line); + if (line.length() > 0) + { + result.append(L","); + result.append(line); + } + line = br.readLine(); + } + delete fileStream; + } + + return result; +} + +BufferedImage *AbstractTexturePack::getImageResource(const wstring& File, bool filenameHasExtension /*= false*/, bool bTitleUpdateTexture /*=false*/, const wstring &drive /*=L""*/) +{ + const char *pchTexture=wstringtofilename(File); + app.DebugPrintf("AbstractTexturePack::getImageResource - %s, drive is %s\n",pchTexture, wstringtofilename(drive)); + + return new BufferedImage(TexturePack::getResource(L"/" + File),filenameHasExtension,bTitleUpdateTexture,drive); +} + +void AbstractTexturePack::loadDefaultUI() +{ +#ifdef _XBOX + // load from the .xzp file + const ULONG_PTR c_ModuleHandle = (ULONG_PTR)GetModuleHandle(NULL); + + // Load new skin + const DWORD LOCATOR_SIZE = 256; // Use this to allocate space to hold a ResourceLocator string + WCHAR szResourceLocator[ LOCATOR_SIZE ]; + + swprintf(szResourceLocator, LOCATOR_SIZE,L"section://%X,%ls#%ls",c_ModuleHandle,L"media", L"media/skin_Minecraft.xur"); + + XuiFreeVisuals(L""); + app.LoadSkin(szResourceLocator,NULL);//L"TexturePack"); + //CXuiSceneBase::GetInstance()->SetVisualPrefix(L"TexturePack"); + CXuiSceneBase::GetInstance()->SkinChanged(CXuiSceneBase::GetInstance()->m_hObj); +#else + ui.ReloadSkin(); +#endif +} + +void AbstractTexturePack::loadColourTable() +{ + loadDefaultColourTable(); + loadDefaultHTMLColourTable(); +} + +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()) + { + DWORD dwLength = coloursFile.length(); + byteArray data(dwLength); + + FileInputStream fis(coloursFile); + fis.read(data,0,dwLength); + fis.close(); + if(m_colourTable != NULL) delete m_colourTable; + m_colourTable = new ColourTable(data.data, dwLength); + + delete [] data.data; + } + else + { + app.DebugPrintf("Failed to load the default colours table\n"); + app.FatalLoadError(); + } +} + +void AbstractTexturePack::loadDefaultHTMLColourTable() +{ +#ifdef _XBOX + // load from the .xzp file + const ULONG_PTR c_ModuleHandle = (ULONG_PTR)GetModuleHandle(NULL); + + const DWORD LOCATOR_SIZE = 256; // Use this to allocate space to hold a ResourceLocator string + WCHAR szResourceLocator[ LOCATOR_SIZE ]; + + // Try and load the HTMLColours.col based off the common XML first, before the deprecated xuiscene_colourtable + wsprintfW(szResourceLocator,L"section://%X,%s#%s",c_ModuleHandle,L"media", L"media/HTMLColours.col"); + BYTE *data; + UINT dataLength; + if(XuiResourceLoadAll(szResourceLocator, &data, &dataLength) == S_OK) + { + m_colourTable->loadColoursFromData(data,dataLength); + + XuiFree(data); + } + else + { + wsprintfW(szResourceLocator,L"section://%X,%s#%s",c_ModuleHandle,L"media", L"media/"); + HXUIOBJ hScene; + HRESULT hr = XuiSceneCreate(szResourceLocator,L"xuiscene_colourtable.xur", NULL, &hScene); + + if(HRESULT_SUCCEEDED(hr)) + { + loadHTMLColourTableFromXuiScene(hScene); + } + } +#else + if(app.hasArchiveFile(L"HTMLColours.col")) + { + byteArray textColours = app.getArchiveFile(L"HTMLColours.col"); + m_colourTable->loadColoursFromData(textColours.data,textColours.length); + + delete [] textColours.data; + } +#endif +} + +#ifdef _XBOX +void AbstractTexturePack::loadHTMLColourTableFromXuiScene(HXUIOBJ hObj) +{ + HXUIOBJ child; + HRESULT hr = XuiElementGetFirstChild(hObj, &child); + + while(HRESULT_SUCCEEDED(hr) && child != NULL) + { + LPCWSTR childName; + XuiElementGetId(child,&childName); + m_colourTable->setColour(childName,XuiTextElementGetText(child)); + + //eMinecraftTextColours colourIndex = eTextColor_NONE; + //for(int i = 0; i < (int)eTextColor_MAX; i++) + //{ + // if(wcscmp(HTMLColourTableElements[i],childName)==0) + // { + // colourIndex = (eMinecraftTextColours)i; + // break; + // } + //} + + //LPCWSTR stringValue = XuiTextElementGetText(child); + + //m_htmlColourTable[colourIndex] = XuiTextElementGetText(child); + + hr = XuiElementGetNext(child, &child); + } +} +#endif + +void AbstractTexturePack::loadUI() +{ + loadColourTable(); + +#ifdef _XBOX + CXuiSceneBase::GetInstance()->SkinChanged(CXuiSceneBase::GetInstance()->m_hObj); +#endif +} + +void AbstractTexturePack::unloadUI() +{ + // Do nothing +} + +wstring AbstractTexturePack::getXuiRootPath() +{ + const ULONG_PTR c_ModuleHandle = (ULONG_PTR)GetModuleHandle(NULL); + + // Load new skin + const DWORD LOCATOR_SIZE = 256; // Use this to allocate space to hold a ResourceLocator string + WCHAR szResourceLocator[ LOCATOR_SIZE ]; + + swprintf(szResourceLocator, LOCATOR_SIZE,L"section://%X,%ls#%ls",c_ModuleHandle,L"media", L"media/"); + return szResourceLocator; +} + +PBYTE AbstractTexturePack::getPackIcon(DWORD &dwImageBytes) +{ + if(m_iconSize == 0 || m_iconData == NULL) loadIcon(); + dwImageBytes = m_iconSize; + return m_iconData; +} + +PBYTE AbstractTexturePack::getPackComparison(DWORD &dwImageBytes) +{ + if(m_comparisonSize == 0 || m_comparisonData == NULL) loadComparison(); + + dwImageBytes = m_comparisonSize; + return m_comparisonData; +} + +unsigned int AbstractTexturePack::getDLCParentPackId() +{ + return 0; +} + +unsigned char AbstractTexturePack::getDLCSubPackId() +{ + return 0; +} \ No newline at end of file diff --git a/Minecraft.Client/AbstractTexturePack.h b/Minecraft.Client/AbstractTexturePack.h new file mode 100644 index 00000000..e6410c19 --- /dev/null +++ b/Minecraft.Client/AbstractTexturePack.h @@ -0,0 +1,93 @@ +#pragma once +using namespace std; + +#include "TexturePack.h" + +class BufferedImage; + +class AbstractTexturePack : public TexturePack +{ +private: + const DWORD id; + const wstring name; + +protected: + File *file; + wstring texname; + wstring m_wsWorldName; + + wstring desc1; + wstring desc2; + + PBYTE m_iconData; + DWORD m_iconSize; + + PBYTE m_comparisonData; + DWORD m_comparisonSize; + + TexturePack *fallback; + + ColourTable *m_colourTable; + +protected: + BufferedImage *iconImage; + +private: + int textureId; + +protected: + AbstractTexturePack(DWORD id, File *file, const wstring &name, TexturePack *fallback); + +private: + static wstring trim(wstring line); + +protected: + virtual void loadIcon(); + virtual void loadComparison(); + virtual void loadDescription(); + virtual void loadName(); + +public: + virtual InputStream *getResource(const wstring &name, bool allowFallback); //throws IOException + // 4J Removed do to current override in TexturePack class + //virtual InputStream *getResource(const wstring &name); //throws IOException + virtual DLCPack * getDLCPack() =0; + + +protected: + virtual InputStream *getResourceImplementation(const wstring &name) = 0; // throws IOException; +public: + virtual void unload(Textures *textures); + virtual void load(Textures *textures); + virtual bool hasFile(const wstring &name, bool allowFallback); + virtual bool hasFile(const wstring &name) = 0; + virtual DWORD getId(); + virtual wstring getName(); + virtual wstring getDesc1(); + virtual wstring getDesc2(); + virtual wstring getWorldName(); + + virtual wstring getAnimationString(const wstring &textureName, const wstring &path, bool allowFallback); + +protected: + virtual wstring getAnimationString(const wstring &textureName, const wstring &path); + void loadDefaultUI(); + void loadDefaultColourTable(); + void loadDefaultHTMLColourTable(); +#ifdef _XBOX + void loadHTMLColourTableFromXuiScene(HXUIOBJ hObj); +#endif + +public: + virtual BufferedImage *getImageResource(const wstring& File, bool filenameHasExtension = false, bool bTitleUpdateTexture=false, const wstring &drive =L""); + virtual void loadColourTable(); + virtual void loadUI(); + virtual void unloadUI(); + virtual wstring getXuiRootPath(); + virtual PBYTE getPackIcon(DWORD &dwImageBytes); + virtual PBYTE getPackComparison(DWORD &dwImageBytes); + virtual unsigned int getDLCParentPackId(); + virtual unsigned char getDLCSubPackId(); + virtual ColourTable *getColourTable() { return m_colourTable; } + virtual ArchiveFile *getArchiveFile() { return NULL; } +}; diff --git a/Minecraft.Client/AchievementPopup.cpp b/Minecraft.Client/AchievementPopup.cpp new file mode 100644 index 00000000..04f822ab --- /dev/null +++ b/Minecraft.Client/AchievementPopup.cpp @@ -0,0 +1,151 @@ +#include "stdafx.h" +#include "AchievementPopup.h" +#include "ItemRenderer.h" +#include "Font.h" +#include "Textures.h" +#include "Lighting.h" +#include "..\Minecraft.World\System.h" +#include "..\Minecraft.World\net.minecraft.locale.h" +#include "..\Minecraft.World\net.minecraft.stats.h" +#include "..\Minecraft.World\SharedConstants.h" + +AchievementPopup::AchievementPopup(Minecraft *mc) +{ + // 4J - added initialisers + width = 0; + height = 0; + ach = NULL; + startTime = 0; + isHelper = false; + + this->mc = mc; + ir = new ItemRenderer(); +} + +void AchievementPopup::popup(Achievement *ach) +{ + title = I18n::get(L"achievement.get"); + desc = ach->name; + startTime = System::currentTimeMillis(); + this->ach = ach; + isHelper = false; +} + +void AchievementPopup::permanent(Achievement *ach) +{ + title = ach->name; + desc = ach->getDescription(); + + startTime = System::currentTimeMillis() - 2500; + this->ach = ach; + isHelper = true; +} + +void AchievementPopup::prepareWindow() +{ + glViewport(0, 0, mc->width, mc->height); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + this->width = mc->width; + this->height = mc->height; + + ScreenSizeCalculator ssc(mc->options, mc->width, mc->height); + width = ssc.getWidth(); + height = ssc.getHeight(); + + glClear(GL_DEPTH_BUFFER_BIT); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho(0, (float)width, (float)height, 0, 1000, 3000); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glTranslatef(0, 0, -2000); + +} + +void AchievementPopup::render() +{ +// 4J Unused +#if 0 + if (Minecraft::warezTime > 0) + { + glDisable(GL_DEPTH_TEST); + glDepthMask(false); + Lighting::turnOff(); + prepareWindow(); + + wstring title = L"Minecraft " + SharedConstants::VERSION_STRING + L" Unlicensed Copy :("; + wstring msg1 = L"(Or logged in from another location)"; + wstring msg2 = L"Purchase at minecraft.net"; + + mc->font->drawShadow(title, 2, 2 + 9 * 0, 0xffffff); + mc->font->drawShadow(msg1, 2, 2 + 9 * 1, 0xffffff); + mc->font->drawShadow(msg2, 2, 2 + 9 * 2, 0xffffff); + + glDepthMask(true); + glEnable(GL_DEPTH_TEST); + } + if (ach == NULL || startTime == 0) return; + + double time = (System::currentTimeMillis() - startTime) / 3000.0; + if (isHelper) + { + } + else if (!isHelper && (time < 0 || time > 1)) + { + startTime = 0; + return; + } + + + prepareWindow(); + glDisable(GL_DEPTH_TEST); + glDepthMask(false); + + double yo = time * 2; + if (yo > 1) yo = 2 - yo; + yo = yo * 4; + yo = 1 - yo; + if (yo < 0) yo = 0; + yo = yo * yo; + yo = yo * yo; + + int xx = width - 160; + int yy = 0 - (int) (yo * 36); + int tex = mc->textures->loadTexture(L"/achievement/bg.png"); + glColor4f(1, 1, 1, 1); + glEnable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, tex); + glDisable(GL_LIGHTING); + + blit(xx, yy, 96, 202, 160, 32); + + if (isHelper) + { + mc->font->drawWordWrap(desc, xx + 30, yy + 7, 120, 0xffffffff); + } + else + { + mc->font->draw(title, xx + 30, yy + 7, 0xffffff00); + mc->font->draw(desc, xx + 30, yy + 18, 0xffffffff); + } + + glPushMatrix(); + glRotatef(180, 1, 0, 0); + Lighting::turnOn(); + glPopMatrix(); + glDisable(GL_LIGHTING); + glEnable(GL_RESCALE_NORMAL); + glEnable(GL_COLOR_MATERIAL); + + glEnable(GL_LIGHTING); + ir->renderGuiItem(mc->font, mc->textures, ach->icon, xx + 8, yy + 8); + glDisable(GL_LIGHTING); + + glDepthMask(true); + glEnable(GL_DEPTH_TEST); +#endif +} \ No newline at end of file diff --git a/Minecraft.Client/AchievementPopup.h b/Minecraft.Client/AchievementPopup.h new file mode 100644 index 00000000..3085dc6e --- /dev/null +++ b/Minecraft.Client/AchievementPopup.h @@ -0,0 +1,28 @@ +#pragma once +#include "GuiComponent.h" +class Achievement; +class ItemRenderer; +using namespace std; + +class AchievementPopup : public GuiComponent +{ +private: + Minecraft *mc; + int width, height; + + wstring title; + wstring desc; + Achievement *ach; + __int64 startTime; + ItemRenderer *ir; + bool isHelper; + +public: + AchievementPopup(Minecraft *mc); + void popup(Achievement *ach); + void permanent(Achievement *ach); +private: + void prepareWindow(); +public: + void render(); +}; \ No newline at end of file diff --git a/Minecraft.Client/AchievementScreen.cpp b/Minecraft.Client/AchievementScreen.cpp new file mode 100644 index 00000000..26f20326 --- /dev/null +++ b/Minecraft.Client/AchievementScreen.cpp @@ -0,0 +1,426 @@ +#include "stdafx.h" +#include "AchievementScreen.h" +#include "SmallButton.h" +#include "Options.h" +#include "KeyMapping.h" +#include "Font.h" +#include "Lighting.h" +#include "Textures.h" +#include "StatsCounter.h" +#include "ItemRenderer.h" +#include "..\Minecraft.World\System.h" +#include "..\Minecraft.World\net.minecraft.locale.h" +#include "..\Minecraft.World\net.minecraft.world.level.tile.h" +#include "..\Minecraft.World\JavaMath.h" + + + +AchievementScreen::AchievementScreen(StatsCounter *statsCounter) +{ + // 4J - added initialisers + imageWidth = 256; + imageHeight = 202; + xLastScroll = 0; + yLastScroll = 0; + scrolling = 0; + + // 4J - TODO - investigate - these were static final ints before, but based on members of Achievements which + // aren't final Or actually initialised + xMin = Achievements::xMin * ACHIEVEMENT_COORD_SCALE - BIGMAP_WIDTH / 2; + yMin = Achievements::yMin * ACHIEVEMENT_COORD_SCALE - BIGMAP_WIDTH / 2; + xMax = Achievements::xMax * ACHIEVEMENT_COORD_SCALE - BIGMAP_HEIGHT / 2; + yMax = Achievements::yMax * ACHIEVEMENT_COORD_SCALE - BIGMAP_HEIGHT / 2; + + this->statsCounter = statsCounter; + int wBigMap = 141; + int hBigMap = 141; + + xScrollO = xScrollP = xScrollTarget = Achievements::openInventory->x * ACHIEVEMENT_COORD_SCALE - wBigMap / 2 - 12; + yScrollO = yScrollP = yScrollTarget = Achievements::openInventory->y * ACHIEVEMENT_COORD_SCALE - hBigMap / 2; + +} + +void AchievementScreen::init() +{ + buttons.clear(); +// buttons.add(new SmallButton(0, width / 2 - 80 - 24, height / 2 + 74, 110, 20, I18n.get("gui.achievements"))); + buttons.push_back(new SmallButton(1, width / 2 + 24, height / 2 + 74, 80, 20, I18n::get(L"gui.done"))); + +} + +void AchievementScreen::buttonClicked(Button *button) +{ + if (button->id == 1) + { + minecraft->setScreen(NULL); +// minecraft->grabMouse(); // 4J removed + } + Screen::buttonClicked(button); +} + +void AchievementScreen::keyPressed(char eventCharacter, int eventKey) +{ + if (eventKey == minecraft->options->keyBuild->key) + { + minecraft->setScreen(NULL); +// minecraft->grabMouse(); // 4J removed + } + else + { + Screen::keyPressed(eventCharacter, eventKey); + } +} + +void AchievementScreen::render(int mouseX, int mouseY, float a) +{ + if (Mouse::isButtonDown(0)) + { + int xo = (width - imageWidth) / 2; + int yo = (height - imageHeight) / 2; + + int xBigMap = xo + 8; + int yBigMap = yo + 17; + + if (scrolling == 0 || scrolling == 1) + { + if (mouseX >= xBigMap && mouseX < xBigMap + BIGMAP_WIDTH && mouseY >= yBigMap && mouseY < yBigMap + BIGMAP_HEIGHT) + { + if (scrolling == 0) + { + scrolling = 1; + } + else + { + xScrollP -= mouseX - xLastScroll; + yScrollP -= mouseY - yLastScroll; + xScrollTarget = xScrollO = xScrollP; + yScrollTarget = yScrollO = yScrollP; + } + xLastScroll = mouseX; + yLastScroll = mouseY; + } + } + + if (xScrollTarget < xMin) xScrollTarget = xMin; + if (yScrollTarget < yMin) yScrollTarget = yMin; + if (xScrollTarget >= xMax) xScrollTarget = xMax - 1; + if (yScrollTarget >= yMax) yScrollTarget = yMax - 1; + } + else + { + scrolling = 0; + } + + renderBackground(); + + renderBg(mouseX, mouseY, a); + + glDisable(GL_LIGHTING); + glDisable(GL_DEPTH_TEST); + + renderLabels(); + + glEnable(GL_LIGHTING); + glEnable(GL_DEPTH_TEST); + +} + +void AchievementScreen::tick() +{ + xScrollO = xScrollP; + yScrollO = yScrollP; + + double xd = (xScrollTarget - xScrollP); + double yd = (yScrollTarget - yScrollP); + if (xd * xd + yd * yd < 4) + { + xScrollP += xd; + yScrollP += yd; + } + else + { + xScrollP += xd * 0.85; + yScrollP += yd * 0.85; + } +} + +void AchievementScreen::renderLabels() +{ + int xo = (width - imageWidth) / 2; + int yo = (height - imageHeight) / 2; + font->draw(L"Achievements", xo + 15, yo + 5, 0x404040); + +// font.draw(xScrollP + ", " + yScrollP, xo + 5, yo + 5 + BIGMAP_HEIGHT + 18, 0x404040); +// font.drawWordWrap("Ride a pig off a cliff.", xo + 5, yo + 5 + BIGMAP_HEIGHT + 16, BIGMAP_WIDTH, 0x404040); + +} + +void AchievementScreen::renderBg(int xm, int ym, float a) +{ + // 4J Unused +#if 0 + int xScroll = Mth::floor(xScrollO + (xScrollP - xScrollO) * a); + int yScroll = Mth::floor(yScrollO + (yScrollP - yScrollO) * a); + + if (xScroll < xMin) xScroll = xMin; + if (yScroll < yMin) yScroll = yMin; + if (xScroll >= xMax) xScroll = xMax - 1; + if (yScroll >= yMax) yScroll = yMax - 1; + + + int terrainTex = minecraft->textures->loadTexture(L"/terrain.png"); + int tex = minecraft->textures->loadTexture(L"/achievement/bg.png"); + + int xo = (width - imageWidth) / 2; + int yo = (height - imageHeight) / 2; + + int xBigMap = xo + BIGMAP_X; + int yBigMap = yo + BIGMAP_Y; + + blitOffset = 0; +// glDisable(GL_DEPTH_TEST); + glDepthFunc(GL_GEQUAL); + glPushMatrix(); + glTranslatef(0, 0, -200); + + { + glEnable(GL_TEXTURE_2D); + glDisable(GL_LIGHTING); + glEnable(GL_RESCALE_NORMAL); + glEnable(GL_COLOR_MATERIAL); + + minecraft->textures->bind(terrainTex); + + int leftTile = (xScroll + EDGE_VALUE_X) >> 4; + int topTile = (yScroll + EDGE_VALUE_Y) >> 4; + int xMod = (xScroll + EDGE_VALUE_X) % 16; + int yMod = (yScroll + EDGE_VALUE_Y) % 16; + + const int rockLevel = (Achievements::ACHIEVEMENT_HEIGHT_POSITION * 4) / 10; + const int coalLevel = (Achievements::ACHIEVEMENT_HEIGHT_POSITION * 7) / 10; + const int ironLevel = (Achievements::ACHIEVEMENT_HEIGHT_POSITION * 9) / 10; + const int diamondLevel = (Achievements::ACHIEVEMENT_HEIGHT_POSITION * 19) / 10; + const int bedrockLevel = (Achievements::ACHIEVEMENT_HEIGHT_POSITION * 31) / 10; + + Random *random = new Random(); + + for (int tileY = 0; (tileY * 16) - yMod < BIGMAP_HEIGHT; tileY++) + { + + float amount = .6f - (float) (topTile + tileY) / (float) (Achievements::ACHIEVEMENT_HEIGHT_POSITION * 2 + 1) * .3f; + glColor4f(amount, amount, amount, 1); + + for (int tileX = 0; (tileX * 16) - xMod < BIGMAP_WIDTH; tileX++) + { + + random->setSeed(1234 + leftTile + tileX); + random->nextInt(); + int heightValue = random->nextInt(1 + topTile + tileY) + (topTile + tileY) / 2; + int tileType = Tile::sand->tex; + + if (heightValue > bedrockLevel || (topTile + tileY) == MAX_BG_TILE_Y) + { + tileType = Tile::unbreakable->tex; + } + else if (heightValue == diamondLevel) + { + if (random->nextInt(2) == 0) + { + tileType = Tile::diamondOre->tex; + } + else + { + tileType = Tile::redStoneOre->tex; + } + } + else if (heightValue == ironLevel) + { + tileType = Tile::ironOre->tex; + } + else if (heightValue == coalLevel) + { + tileType = Tile::coalOre->tex; + } + else if (heightValue > rockLevel) + { + tileType = Tile::rock->tex; + } + else if (heightValue > 0) + { + tileType = Tile::dirt->tex; + } + + this->blit(xBigMap + tileX * 16 - xMod, yBigMap + tileY * 16 - yMod, (tileType % 16) << 4, (tileType >> 4) << 4, 16, 16); + } + } + + } + glEnable(GL_DEPTH_TEST); + + + glDepthFunc(GL_LEQUAL); + + glDisable(GL_TEXTURE_2D); + + AUTO_VAR(itEnd, Achievements::achievements->end()); + for (AUTO_VAR(it, Achievements::achievements->begin()); it != itEnd; it++) + { + Achievement *ach = *it; //Achievements::achievements->at(i); + if (ach->requires == NULL) continue; + + int x1 = ach->x * ACHIEVEMENT_COORD_SCALE - (int) xScroll + 11 + xBigMap; + int y1 = ach->y * ACHIEVEMENT_COORD_SCALE - (int) yScroll + 11 + yBigMap; + + int x2 = ach->requires->x * ACHIEVEMENT_COORD_SCALE - (int) xScroll + 11 + xBigMap; + int y2 = ach->requires->y * ACHIEVEMENT_COORD_SCALE - (int) yScroll + 11 + yBigMap; + + int color = 0; + + bool taken = statsCounter->hasTaken(ach); + bool canTake = statsCounter->canTake(ach); + + int alph = (int) (sin(System::currentTimeMillis() % 600 / 600.0 * PI * 2) > 0.6 ? 255 : 130); + if (taken) color = 0xff707070; + else if (canTake) color = 0x00ff00 + (alph << 24); + else color = 0xff000000; + + hLine(x1, x2, y1, color); + vLine(x2, y1, y2, color); + } + + Achievement *hoveredAchievement = NULL; + ItemRenderer *ir = new ItemRenderer(); + + glPushMatrix(); + glRotatef(180, 1, 0, 0); + Lighting::turnOn(); + glPopMatrix(); + glDisable(GL_LIGHTING); + glEnable(GL_RESCALE_NORMAL); + glEnable(GL_COLOR_MATERIAL); + + itEnd = Achievements::achievements->end(); + for (AUTO_VAR(it, Achievements::achievements->begin()); it != itEnd; it++) + { + Achievement *ach = *it; //Achievements::achievements->at(i); + + int x = ach->x * ACHIEVEMENT_COORD_SCALE - (int) xScroll; + int y = ach->y * ACHIEVEMENT_COORD_SCALE - (int) yScroll; + + if (x >= -24 && y >= -24 && x <= BIGMAP_WIDTH && y <= BIGMAP_HEIGHT) + { + + if (statsCounter->hasTaken(ach)) + { + float br = 1.0f; + glColor4f(br, br, br, 1); + } + else if (statsCounter->canTake(ach)) + { + float br = (sin(System::currentTimeMillis() % 600 / 600.0 * PI * 2) < 0.6 ? 0.6f : 0.8f); + glColor4f(br, br, br, 1); + } + else + { + float br = 0.3f; + glColor4f(br, br, br, 1); + } + + minecraft->textures->bind(tex); + int xx = xBigMap + x; + int yy = yBigMap + y; + if (ach->isGolden()) + { + this->blit(xx - 2, yy - 2, 26, 202, 26, 26); + } + else + { + this->blit(xx - 2, yy - 2, 0, 202, 26, 26); + } + + if (!statsCounter->canTake(ach)) + { + float br = 0.1f; + glColor4f(br, br, br, 1); + ir->setColor = false; + } + glEnable(GL_LIGHTING); + glEnable(GL_CULL_FACE); + ir->renderGuiItem(minecraft->font, minecraft->textures, ach->icon, xx + 3, yy + 3); + glDisable(GL_LIGHTING); + if (!statsCounter->canTake(ach)) + { + ir->setColor = true; + } + glColor4f(1, 1, 1, 1); + + + if (xm >= xBigMap && ym >= yBigMap && xm < xBigMap + BIGMAP_WIDTH && ym < yBigMap + BIGMAP_HEIGHT && xm >= xx && xm <= xx + 22 && ym >= yy && ym <= yy + 22) { + hoveredAchievement = ach; + } + } + } + + glDisable(GL_DEPTH_TEST); + glEnable(GL_BLEND); + glColor4f(1, 1, 1, 1); + minecraft->textures->bind(tex); + blit(xo, yo, 0, 0, imageWidth, imageHeight); + + + glPopMatrix(); + + blitOffset = 0; + glDepthFunc(GL_LEQUAL); + + glDisable(GL_DEPTH_TEST); + glEnable(GL_TEXTURE_2D); + Screen::render(xm, ym, a); + + if (hoveredAchievement != NULL) + { + Achievement *ach = hoveredAchievement; + wstring name = ach->name; + wstring descr = ach->getDescription(); + + int x = xm + 12; + int y = ym - 4; + + if (statsCounter->canTake(ach)) + { + int width = Math::_max(font->width(name), 120); + int height = font->wordWrapHeight(descr, width); + if (statsCounter->hasTaken(ach)) + { + height += 12; + } + fillGradient(x - 3, y - 3, x + width + 3, y + height + 3 + 12, 0xc0000000, 0xc0000000); + + font->drawWordWrap(descr, x, y + 12, width, 0xffa0a0a0); + if (statsCounter->hasTaken(ach)) + { + font->drawShadow(I18n::get(L"achievement.taken"), x, y + height + 4, 0xff9090ff); + } + } + else + { + int width = Math::_max(font->width(name), 120); + wstring msg = I18n::get(L"achievement.requires", ach->requires->name); + int height = font->wordWrapHeight(msg, width); + fillGradient(x - 3, y - 3, x + width + 3, y + height + 12 + 3, 0xc0000000, 0xc0000000); + font->drawWordWrap(msg, x, y + 12, width, 0xff705050); + } + font->drawShadow(name, x, y, statsCounter->canTake(ach) ? ach->isGolden() ? 0xffffff80 : 0xffffffff : ach->isGolden() ? 0xff808040 : 0xff808080); + + + } + glEnable(GL_DEPTH_TEST); + glEnable(GL_LIGHTING); + Lighting::turnOff(); +#endif +} + +bool AchievementScreen::isPauseScreen() +{ + return true; +} \ No newline at end of file diff --git a/Minecraft.Client/AchievementScreen.h b/Minecraft.Client/AchievementScreen.h new file mode 100644 index 00000000..3c4412e3 --- /dev/null +++ b/Minecraft.Client/AchievementScreen.h @@ -0,0 +1,57 @@ +#pragma once +#include "Screen.h" +#include "..\Minecraft.World\net.minecraft.stats.h" +class StatsCounter; + +class AchievementScreen : public Screen +{ +private: + static const int BIGMAP_X = 16; + static const int BIGMAP_Y = 17; + static const int BIGMAP_WIDTH = 224; + static const int BIGMAP_HEIGHT = 155; + + // number of pixels per achievement + static const int ACHIEVEMENT_COORD_SCALE = 24; + static const int EDGE_VALUE_X = Achievements::ACHIEVEMENT_WIDTH_POSITION * ACHIEVEMENT_COORD_SCALE; + static const int EDGE_VALUE_Y = Achievements::ACHIEVEMENT_HEIGHT_POSITION * ACHIEVEMENT_COORD_SCALE; + + int xMin; + int yMin; + int xMax; + int yMax; + + static const int MAX_BG_TILE_Y = (EDGE_VALUE_Y * 2 - 1) / 16; + +protected: + int imageWidth; + int imageHeight; + int xLastScroll; + int yLastScroll; + +protected: + double xScrollO, yScrollO; + double xScrollP, yScrollP; + double xScrollTarget, yScrollTarget; + +private: + int scrolling; + StatsCounter *statsCounter; + +public: + using Screen::keyPressed; + + AchievementScreen(StatsCounter *statsCounter); + virtual void init(); +protected: + virtual void buttonClicked(Button *button); + virtual void keyPressed(char eventCharacter, int eventKey); +public: + virtual void render(int mouseX, int mouseY, float a); + virtual void tick(); +protected: + virtual void renderLabels(); + virtual void renderBg(int xm, int ym, float a); +public: + virtual bool isPauseScreen(); +}; diff --git a/Minecraft.Client/AllowAllCuller.cpp b/Minecraft.Client/AllowAllCuller.cpp new file mode 100644 index 00000000..7627af3b --- /dev/null +++ b/Minecraft.Client/AllowAllCuller.cpp @@ -0,0 +1,21 @@ +#include "stdafx.h" +#include "AllowAllCuller.h" + +bool AllowAllCuller::isVisible(AABB *bb) +{ + return true; +} + +bool AllowAllCuller::cubeInFrustum(double x0, double y0, double z0, double x1, double y1, double z1) +{ + return true; +} + +bool AllowAllCuller::cubeFullyInFrustum(double x0, double y0, double z0, double x1, double y1, double z1) +{ + return true; +} + +void AllowAllCuller::prepare(double xOff, double yOff, double zOff) +{ +} \ No newline at end of file diff --git a/Minecraft.Client/AllowAllCuller.h b/Minecraft.Client/AllowAllCuller.h new file mode 100644 index 00000000..5b866049 --- /dev/null +++ b/Minecraft.Client/AllowAllCuller.h @@ -0,0 +1,11 @@ +#pragma once +#include "Culler.h" + +class AllowAllCuller +{ +public: + 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); + virtual void prepare(double xOff, double yOff, double zOff); +}; \ No newline at end of file diff --git a/Minecraft.Client/ArchiveFile.cpp b/Minecraft.Client/ArchiveFile.cpp new file mode 100644 index 00000000..642471a4 --- /dev/null +++ b/Minecraft.Client/ArchiveFile.cpp @@ -0,0 +1,215 @@ +#include "stdafx.h" + +#include "..\Minecraft.World\StringHelpers.h" +#include "..\Minecraft.World\compression.h" + +#include "ArchiveFile.h" + +void ArchiveFile::_readHeader(DataInputStream *dis) +{ + int numberOfFiles = dis->readInt(); + + for (int i = 0; i < numberOfFiles; i++) + { + MetaData *meta = new MetaData(); + meta->filename = dis->readUTF(); + meta->ptr = dis->readInt(); + meta->filesize = dis->readInt(); + + // Filenames preceeded by an asterisk have been compressed. + if (meta->filename[0] == '*') + { + meta->filename = meta->filename.substr(1); + meta->isCompressed = true; + } + else meta->isCompressed = false; + + m_index.insert( pair(meta->filename,meta) ); + } +} + +ArchiveFile::ArchiveFile(File file) +{ + m_cachedData = NULL; + m_sourcefile = file; + app.DebugPrintf("Loading archive file...\n"); +#ifndef _CONTENT_PACKAGE + char buf[256]; + wcstombs(buf, file.getPath().c_str(), 256); + app.DebugPrintf("archive file - %s\n",buf); +#endif + + if(!file.exists()) + { + app.DebugPrintf("Failed to load archive file!\n");//,file.getPath()); + app.FatalLoadError(); + } + + FileInputStream fis(file); + +#if defined _XBOX_ONE || defined __ORBIS__ || defined _WINDOWS64 + byteArray readArray(file.length()); + fis.read(readArray,0,file.length()); + + ByteArrayInputStream bais(readArray); + DataInputStream dis(&bais); + + m_cachedData = readArray.data; +#else + DataInputStream dis(&fis); +#endif + + _readHeader(&dis); + + dis.close(); + fis.close(); +#if defined _XBOX_ONE || defined __ORBIS__ || defined _WINDOWS64 + bais.reset(); +#endif + app.DebugPrintf("Finished loading archive file\n"); +} + +ArchiveFile::~ArchiveFile() +{ + delete m_cachedData; +} + +vector *ArchiveFile::getFileList() +{ + vector *out = new vector(); + + for ( AUTO_VAR(it, m_index.begin()); + it != m_index.end(); + it++ ) + + out->push_back( it->first ); + + return out; +} + +bool ArchiveFile::hasFile(const wstring &filename) +{ + return m_index.find(filename) != m_index.end(); +} + +int ArchiveFile::getFileSize(const wstring &filename) +{ + return hasFile(filename) ? m_index.at(filename)->filesize : -1; +} + +byteArray ArchiveFile::getFile(const wstring &filename) +{ + byteArray out; + AUTO_VAR(it,m_index.find(filename)); + + if(it == m_index.end()) + { + app.DebugPrintf("Couldn't find file in archive\n"); + app.DebugPrintf("Failed to find file '%ls' in archive\n", filename.c_str()); +#ifndef _CONTENT_PACKAGE + __debugbreak(); +#endif + app.FatalLoadError(); + } + else + { + PMetaData data = it->second; + +#if defined _XBOX_ONE || defined __ORBIS__ || defined _WINDOWS64 + out = byteArray(data->filesize ); + + memcpy( out.data, m_cachedData + data->ptr, data->filesize ); +#else + +#ifdef _UNICODE + HANDLE hfile = CreateFile( m_sourcefile.getPath().c_str(), + GENERIC_READ, + 0, + NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, + NULL + ); +#else + app.DebugPrintf("Createfile archive\n"); + HANDLE hfile = CreateFile( wstringtofilename(m_sourcefile.getPath()), + GENERIC_READ, + 0, + NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, + NULL + ); +#endif + + if (hfile != INVALID_HANDLE_VALUE) + { + app.DebugPrintf("hfile ok\n"); + DWORD ok = SetFilePointer( hfile, + data->ptr, + NULL, + FILE_BEGIN + ); + + if (ok != INVALID_SET_FILE_POINTER) + { + PBYTE pbData = new BYTE[ data->filesize ]; + + DWORD bytesRead = -1; + BOOL bSuccess = ReadFile( hfile, + (LPVOID) pbData, + data->filesize, + &bytesRead, + NULL + ); + + if(bSuccess==FALSE) + { + app.FatalLoadError(); + } + assert(bytesRead == data->filesize); + out = byteArray(pbData, data->filesize); + } + else + { + app.FatalLoadError(); + } + + CloseHandle(hfile); + } + else + { + app.DebugPrintf("bad hfile\n"); + app.FatalLoadError(); + } +#endif + + // Compressed filenames are preceeded with an asterisk. + if ( data->isCompressed && out.data != NULL ) + { + /* 4J-JEV: + * If a compressed file is accessed before compression object is + * initialized it will crash here (Compression::getCompression). + */ + ///4 279 553 556 + + ByteArrayInputStream bais(out); + DataInputStream dis(&bais); + unsigned int decompressedSize = dis.readInt(); + dis.close(); + + PBYTE uncompressedBuffer = new BYTE[decompressedSize]; + Compression::getCompression()->Decompress(uncompressedBuffer, &decompressedSize, out.data+4, out.length-4); + + delete [] out.data; + + out.data = uncompressedBuffer; + out.length = decompressedSize; + } + + assert(out.data != NULL); // THERE IS NO FILE WITH THIS NAME! + + } + + return out; +} diff --git a/Minecraft.Client/ArchiveFile.h b/Minecraft.Client/ArchiveFile.h new file mode 100644 index 00000000..722d570d --- /dev/null +++ b/Minecraft.Client/ArchiveFile.h @@ -0,0 +1,38 @@ +#pragma once + +#include +#include + +#include "..\Minecraft.World\File.h" +#include "..\Minecraft.World\ArrayWithLength.h" + +using namespace std; + +class ArchiveFile +{ +protected: + File m_sourcefile; + BYTE *m_cachedData; + + typedef struct _MetaData + { + wstring filename; + int ptr; + int filesize; + bool isCompressed; + + } MetaData, *PMetaData; + + unordered_map m_index; + +public: + void _readHeader(DataInputStream *dis); + + ArchiveFile(File file); + ~ArchiveFile(); + + vector *getFileList(); + bool hasFile(const wstring &filename); + int getFileSize(const wstring &filename); + byteArray getFile(const wstring &filename); +}; \ No newline at end of file diff --git a/Minecraft.Client/ArrowRenderer.cpp b/Minecraft.Client/ArrowRenderer.cpp new file mode 100644 index 00000000..4698cd6e --- /dev/null +++ b/Minecraft.Client/ArrowRenderer.cpp @@ -0,0 +1,93 @@ +#include "stdafx.h" +#include "ArrowRenderer.h" +#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(_arrow); // 4J - was L"/item/arrows.png" + + glPushMatrix(); + + float yRot = arrow->yRot; + float xRot = arrow->xRot; + float yRotO = arrow->yRotO; + float xRotO = arrow->xRotO; + if( ( yRot - yRotO ) > 180.0f ) yRot -= 360.0f; + else if( ( yRot - yRotO ) < -180.0f ) yRot += 360.0f; + if( ( xRot - xRotO ) > 180.0f ) xRot -= 360.0f; + else if( ( xRot - xRotO ) < -180.0f ) xRot += 360.0f; + + glTranslatef((float)x, (float)y, (float)z); + glRotatef(yRotO + (yRot - yRotO) * a - 90, 0, 1, 0); + glRotatef(xRotO + (xRot - xRotO) * a, 0, 0, 1); + + Tesselator *t = Tesselator::getInstance(); + int type = 0; + + float u0 = 0 / 32.0f; + float u1 = 16 / 32.0f; + float v0 = (0 + type * 10) / 32.0f; + float v1 = (5 + type * 10) / 32.0f; + + float u02 = 0 / 32.0f; + float u12 = 5 / 32.0f; + float v02 = (5 + type * 10) / 32.0f; + float v12 = (10 + type * 10) / 32.0f; + float ss = 0.9f / 16.0f; + glEnable(GL_RESCALE_NORMAL); + float shake = arrow->shakeTime-a; + if (shake>0) + { + float pow = -Mth::sin(shake*3)*shake; + glRotatef(pow, 0, 0, 1); + } + glRotatef(45, 1, 0, 0); + glScalef(ss, ss, ss); + + glTranslatef(-4, 0, 0); + +// glNormal3f(ss, 0, 0); // 4J - changed to use tesselator + t->begin(); + t->normal(1,0,0); + t->vertexUV((float)(-7), (float)( -2), (float)( -2), (float)( u02), (float)( v02)); + t->vertexUV((float)(-7), (float)( -2), (float)( +2), (float)( u12), (float)( v02)); + t->vertexUV((float)(-7), (float)( +2), (float)( +2), (float)( u12), (float)( v12)); + t->vertexUV((float)(-7), (float)( +2), (float)( -2), (float)( u02), (float)( v12)); + t->end(); + +// glNormal3f(-ss, 0, 0); // 4J - changed to use tesselator + t->begin(); + t->normal(-1,0,0); + t->vertexUV((float)(-7), (float)( +2), (float)( -2), (float)( u02), (float)( v02)); + t->vertexUV((float)(-7), (float)( +2), (float)( +2), (float)( u12), (float)( v02)); + t->vertexUV((float)(-7), (float)( -2), (float)( +2), (float)( u12), (float)( v12)); + t->vertexUV((float)(-7), (float)( -2), (float)( -2), (float)( u02), (float)( v12)); + t->end(); + + for (int i = 0; i < 4; i++) + { + + glRotatef(90, 1, 0, 0); +// glNormal3f(0, 0, ss); // 4J - changed to use tesselator + t->begin(); + t->normal(0,0,1); + t->vertexUV((float)(-8), (float)( -2), (float)( 0), (float)( u0), (float)( v0)); + t->vertexUV((float)(+8), (float)( -2), (float)( 0), (float)( u1), (float)( v0)); + t->vertexUV((float)(+8), (float)( +2), (float)( 0), (float)( u1), (float)( v1)); + t->vertexUV((float)(-8), (float)( +2), (float)( 0), (float)( u0), (float)( v1)); + t->end(); + } + 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 new file mode 100644 index 00000000..95867f5e --- /dev/null +++ b/Minecraft.Client/ArrowRenderer.h @@ -0,0 +1,12 @@ +#pragma once +#include "EntityRenderer.h" + +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 new file mode 100644 index 00000000..68d9ef46 --- /dev/null +++ b/Minecraft.Client/BlazeModel.cpp @@ -0,0 +1,75 @@ +#include "stdafx.h" +#include "..\Minecraft.World\Mth.h" +#include "BlazeModel.h" +#include "ModelPart.h" + +BlazeModel::BlazeModel() : Model() +{ + upperBodyParts = ModelPartArray(12); + + for (unsigned int i = 0; i < upperBodyParts.length; i++) + { + upperBodyParts[i] = new ModelPart(this, 0, 16); + upperBodyParts[i]->addBox(0, 0, 0, 2, 8, 2); + } + + head = new ModelPart(this, 0, 0); + head->addBox(-4, -4, -4, 8, 8, 8); + + // 4J added - compile now to avoid random performance hit first time cubes are rendered + // 4J Stu - Not just performance, but alpha+depth tests don't work right unless we compile here + for (unsigned int i = 0; i < upperBodyParts.length; i++) + { + upperBodyParts[i]->compile(1.0f/16.0f); + } + head->compile(1.0f/16.0f); +} + +int BlazeModel::modelVersion() +{ + return 8; +} + +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, entity); + + 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, shared_ptr entity, unsigned int uiBitmaskOverrideAnim) +{ + float angle = bob * PI * -.1f; + for (int i = 0; i < 4; i++) + { + upperBodyParts[i]->y = -2 + Mth::cos((i * 2 + bob) * .25f); + upperBodyParts[i]->x = Mth::cos(angle) * 9.0f; + upperBodyParts[i]->z = Mth::sin(angle) * 9.0f; + angle += PI * 0.5f; + } + angle = .25f * PI + bob * PI * .03f; + for (int i = 4; i < 8; i++) + { + upperBodyParts[i]->y = 2 + Mth::cos((i * 2 + bob) * .25f); + upperBodyParts[i]->x = Mth::cos(angle) * 7.0f; + upperBodyParts[i]->z = Mth::sin(angle) * 7.0f; + angle += PI * 0.5f; + } + + angle = .15f * PI + bob * PI * -.05f; + for (int i = 8; i < 12; i++) + { + upperBodyParts[i]->y = 11 + Mth::cos((i * 1.5f + bob) * .5f); + upperBodyParts[i]->x = Mth::cos(angle) * 5.0f; + upperBodyParts[i]->z = Mth::sin(angle) * 5.0f; + angle += PI * 0.5f; + } + + head->yRot = yRot / (float) (180 / PI); + head->xRot = xRot / (float) (180 / PI); +} + diff --git a/Minecraft.Client/BlazeModel.h b/Minecraft.Client/BlazeModel.h new file mode 100644 index 00000000..9895801a --- /dev/null +++ b/Minecraft.Client/BlazeModel.h @@ -0,0 +1,16 @@ +#pragma once +#include "Model.h" + +class BlazeModel : public Model +{ + +private: + ModelPartArray upperBodyParts; + ModelPart *head; + +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, shared_ptr entity, unsigned int uiBitmaskOverrideAnim = 0); +}; diff --git a/Minecraft.Client/BlazeRenderer.cpp b/Minecraft.Client/BlazeRenderer.cpp new file mode 100644 index 00000000..8e0da036 --- /dev/null +++ b/Minecraft.Client/BlazeRenderer.cpp @@ -0,0 +1,31 @@ +#include "stdafx.h" +#include "BlazeModel.h" +#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) +{ + modelVersion = ((BlazeModel *) model)->modelVersion(); +} + +void BlazeRenderer::render(shared_ptr _mob, double x, double y, double z, float rot, float a) +{ + // 4J - original version used generics and thus had an input parameter of type Blaze rather than shared_ptr we have here - + // do some casting around instead + shared_ptr mob = dynamic_pointer_cast(_mob); + + int modelVersion = ((BlazeModel *) model)->modelVersion(); + if (modelVersion != this->modelVersion) + { + this->modelVersion = modelVersion; + 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 new file mode 100644 index 00000000..5a009b74 --- /dev/null +++ b/Minecraft.Client/BlazeRenderer.h @@ -0,0 +1,15 @@ +#pragma once +#include "MobRenderer.h" + +class BlazeRenderer : public MobRenderer +{ +private: + 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/BoatModel.cpp b/Minecraft.Client/BoatModel.cpp new file mode 100644 index 00000000..d0d465e5 --- /dev/null +++ b/Minecraft.Client/BoatModel.cpp @@ -0,0 +1,51 @@ +#include "stdafx.h" +#include "BoatModel.h" + +BoatModel::BoatModel() : Model() +{ + cubes[0] = new ModelPart(this, 0, 8); + cubes[1] = new ModelPart(this, 0, 0); + cubes[2] = new ModelPart(this, 0, 0); + cubes[3] = new ModelPart(this, 0, 0); + cubes[4] = new ModelPart(this, 0, 0); + + int w = 24; + int d = 6; + int h = 20; + int yOff = 4; + + cubes[0]->addBox((float)(-w / 2), (float)(-h / 2 + 2), -3, w, h - 4, 4, 0); + cubes[0]->setPos(0, (float)(0 + yOff), 0); + + cubes[1]->addBox((float)(-w / 2 + 2), (float)(-d - 1), -1, w - 4, d, 2, 0); + cubes[1]->setPos((float)(-w / 2 + 1), (float)(0 + yOff), 0); + + cubes[2]->addBox((float)(-w / 2 + 2), (float)(-d - 1), -1, w - 4, d, 2, 0); + cubes[2]->setPos((float)(+w / 2 - 1), (float)(0 + yOff), 0); + + cubes[3]->addBox((float)(-w / 2 + 2), (float)(-d - 1), -1, w - 4, d, 2, 0); + cubes[3]->setPos(0, (float)(0 + yOff), (float)(-h / 2 + 1)); + + cubes[4]->addBox((float)(-w / 2 + 2), (float)(-d - 1), -1, w - 4, d, 2, 0); + cubes[4]->setPos(0, (float)(0 + yOff), (float)(+h / 2 - 1)); + + cubes[0]->xRot = PI / 2; + cubes[1]->yRot = PI / 2 * 3; + cubes[2]->yRot = PI / 2 * 1; + cubes[3]->yRot = PI / 2 * 2; + + // 4J added - compile now to avoid random performance hit first time cubes are rendered + cubes[0]->compile(1.0f/16.0f); + cubes[1]->compile(1.0f/16.0f); + cubes[2]->compile(1.0f/16.0f); + cubes[3]->compile(1.0f/16.0f); + cubes[4]->compile(1.0f/16.0f); +} + +void BoatModel::render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) +{ + for (int i = 0; i < 5; i++) + { + cubes[i]->render(scale, usecompiled); + } +} \ No newline at end of file diff --git a/Minecraft.Client/BoatModel.h b/Minecraft.Client/BoatModel.h new file mode 100644 index 00000000..4298b643 --- /dev/null +++ b/Minecraft.Client/BoatModel.h @@ -0,0 +1,11 @@ +#pragma once +#include "Model.h" +#include "ModelPart.h" + +class BoatModel : public Model +{ +public: + ModelPart *cubes[5]; + BoatModel(); + virtual void render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); +}; \ No newline at end of file diff --git a/Minecraft.Client/BoatRenderer.cpp b/Minecraft.Client/BoatRenderer.cpp new file mode 100644 index 00000000..4c2e9baf --- /dev/null +++ b/Minecraft.Client/BoatRenderer.cpp @@ -0,0 +1,47 @@ +#include "stdafx.h" +#include "BoatRenderer.h" +#include "BoatModel.h" +#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; + model = new BoatModel(); +} + +void BoatRenderer::render(shared_ptr _boat, double x, double y, double z, float rot, float a) +{ + // 4J - original version used generics and thus had an input parameter of type Boat rather than shared_ptr we have here - + // do some casting around instead + shared_ptr boat = dynamic_pointer_cast(_boat); + + glPushMatrix(); + + glTranslatef((float) x, (float) y, (float) z); + + glRotatef(180-rot, 0, 1, 0); + float hurt = boat->getHurtTime() - a; + float dmg = boat->getDamage() - a; + if (dmg<0) dmg = 0; + if (hurt>0) + { + glRotatef(Mth::sin(hurt)*hurt*dmg/10*boat->getHurtDir(), 1, 0, 0); + } + + float ss = 12/16.0f; + glScalef(ss, ss, ss); + glScalef(1/ss, 1/ss, 1/ss); + + 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 new file mode 100644 index 00000000..9396b477 --- /dev/null +++ b/Minecraft.Client/BoatRenderer.h @@ -0,0 +1,16 @@ +#pragma once +#include "EntityRenderer.h" + +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 new file mode 100644 index 00000000..d032a7f5 --- /dev/null +++ b/Minecraft.Client/BookModel.cpp @@ -0,0 +1,68 @@ +#include "stdafx.h" +#include "..\Minecraft.World\Mth.h" +#include "BookModel.h" +#include "ModelPart.h" + +BookModel::BookModel() +{ + leftLid = (new ModelPart(this))->texOffs(0, 0)->addBox(-6, -5, 0, 6, 10, 0); + rightLid = (new ModelPart(this))->texOffs(16, 0)->addBox(0, -5, 0, 6, 10, 0); + + seam = (new ModelPart(this))->texOffs(12, 0)->addBox(-1, -5, 0, 2, 10, 0); + + // 4J - added faceMasks here to remove sides of these page boxes which end up being nearly coplanar to the cover of the book and flickering when rendering at a distance + leftPages = (new ModelPart(this))->texOffs(0, 10)->addBoxWithMask(0, -4, -1 + 0.01f, 5, 8, 1, 47); // 4J - faceMask is binary 101111 + rightPages = (new ModelPart(this))->texOffs(12, 10)->addBoxWithMask(0, -4, -0.01f, 5, 8, 1, 31); // 4J - faceMask is binary 011111 + + flipPage1 = (new ModelPart(this))->texOffs(24, 10)->addBox(0, -4, 0, 5, 8, 0); + flipPage2 = (new ModelPart(this))->texOffs(24, 10)->addBox(0, -4, 0, 5, 8, 0); + + leftLid->setPos(0, 0, -1); + rightLid->setPos(0, 0, 1); + + seam->yRot = PI / 2; + + // 4J added - compile now to avoid random performance hit first time cubes are rendered + leftLid->compile(1.0f/16.0f); + rightLid->compile(1.0f/16.0f); + seam->compile(1.0f/16.0f); + leftPages->compile(1.0f/16.0f); + rightPages->compile(1.0f/16.0f); + flipPage1->compile(1.0f/16.0f); + flipPage2->compile(1.0f/16.0f); + +} + +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, entity); + + leftLid->render(scale,usecompiled); + rightLid->render(scale,usecompiled); + seam->render(scale,usecompiled); + + leftPages->render(scale,usecompiled); + rightPages->render(scale,usecompiled); + + flipPage1->render(scale,usecompiled); + flipPage2->render(scale,usecompiled); +} + +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; + + leftLid->yRot = PI + openness; + rightLid->yRot = -openness; + leftPages->yRot = +openness; + rightPages->yRot = -openness; + + flipPage1->yRot = +openness - openness * 2 * r; + flipPage2->yRot = +openness - openness * 2 * bob; + + leftPages->x = Mth::sin(openness); + rightPages->x = Mth::sin(openness); + flipPage1->x = Mth::sin(openness); + flipPage2->x = Mth::sin(openness); +} + diff --git a/Minecraft.Client/BookModel.h b/Minecraft.Client/BookModel.h new file mode 100644 index 00000000..e35e7def --- /dev/null +++ b/Minecraft.Client/BookModel.h @@ -0,0 +1,16 @@ + +#pragma once +#include "Model.h" + +class BookModel : public Model +{ +public: + ModelPart *leftLid, *rightLid; + ModelPart *leftPages, *rightPages; + ModelPart *flipPage1, *flipPage2; + ModelPart *seam; + + 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, 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/BreakingItemParticle.cpp b/Minecraft.Client/BreakingItemParticle.cpp new file mode 100644 index 00000000..51b721f5 --- /dev/null +++ b/Minecraft.Client/BreakingItemParticle.cpp @@ -0,0 +1,64 @@ +#include "stdafx.h" +#include "BreakingItemParticle.h" +#include "Tesselator.h" +#include "..\Minecraft.World\net.minecraft.world.level.tile.h" +#include "..\Minecraft.World\net.minecraft.world.item.h" +#include "..\Minecraft.World\net.minecraft.world.h" + +void BreakingItemParticle::_init(Item *item, Textures *textures, int data) +{ + this->setTex(textures, item->getIcon(data)); + rCol = gCol = bCol = 1.0f; + gravity = Tile::snow->gravity; + size /= 2; +} + +BreakingItemParticle::BreakingItemParticle(Level *level, double x, double y, double z, Item *item, Textures *textures, int data) : Particle(level, x, y, z, 0, 0, 0) +{ + _init(item, textures, data); +} + +BreakingItemParticle::BreakingItemParticle(Level *level, double x, double y, double z, double xa, double ya, double za, Item *item, Textures *textures, int data) : Particle(level, x, y, z, 0, 0, 0) +{ + _init(item, textures, data); + xd *= 0.1f; + yd *= 0.1f; + zd *= 0.1f; + xd += xa; + yd += ya; + zd += za; +} + +int BreakingItemParticle::getParticleTexture() +{ + return ParticleEngine::ITEM_TEXTURE; +} + +void BreakingItemParticle::render(Tesselator *t, float a, float xa, float ya, float za, float xa2, float za2) +{ + float u0 = (texX + uo / 4.0f) / 16.0f; + float u1 = u0 + 0.999f / 16.0f / 4; + float v0 = (texY + vo / 4.0f) / 16.0f; + float v1 = v0 + 0.999f / 16.0f / 4; + float r = 0.1f * size; + + if (tex != NULL) + { + u0 = tex->getU((uo / 4.0f) * SharedConstants::WORLD_RESOLUTION); + u1 = tex->getU(((uo + 1) / 4.0f) * SharedConstants::WORLD_RESOLUTION); + v0 = tex->getV((vo / 4.0f) * SharedConstants::WORLD_RESOLUTION); + v1 = tex->getV(((vo + 1) / 4.0f) * SharedConstants::WORLD_RESOLUTION); + } + + 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); + float br = SharedConstants::TEXTURE_LIGHTING ? 1 : getBrightness(a); // 4J - change brought forward from 1.8.2 + t->color(br * rCol, br * gCol, br * bCol); + + t->vertexUV((float)(x - xa * r - xa2 * r), (float)( y - ya * r), (float)( z - za * r - za2 * r), (float)( u0), (float)( v1)); + t->vertexUV((float)(x - xa * r + xa2 * r), (float)( y + ya * r), (float)( z - za * r + za2 * r), (float)( u0), (float)( v0)); + t->vertexUV((float)(x + xa * r + xa2 * r), (float)( y + ya * r), (float)( z + za * r + za2 * r), (float)( u1), (float)( v0)); + t->vertexUV((float)(x + xa * r - xa2 * r), (float)( y - ya * r), (float)( z + za * r - za2 * r), (float)( u1), (float)( v1)); + +} \ No newline at end of file diff --git a/Minecraft.Client/BreakingItemParticle.h b/Minecraft.Client/BreakingItemParticle.h new file mode 100644 index 00000000..390426d4 --- /dev/null +++ b/Minecraft.Client/BreakingItemParticle.h @@ -0,0 +1,15 @@ +#pragma once +#include "Particle.h" + +class BreakingItemParticle : public Particle +{ + // virtual eINSTANCEOF GetType(); // 4J-IB/JEV TODO needs implementation + +public: + virtual eINSTANCEOF GetType() { return eType_BREAKINGITEMPARTICLE; } + void _init(Item *item, Textures *textures, int data); + BreakingItemParticle(Level *level, double x, double y, double z, Item *item, Textures *textures, int data = 0); + BreakingItemParticle(Level *level, double x, double y, double z, double xa, double ya, double za, Item *item, Textures *textures, int data = 0); + virtual int getParticleTexture(); + virtual void render(Tesselator *t, float a, float xa, float ya, float za, float xa2, float za2); +}; diff --git a/Minecraft.Client/BubbleParticle.cpp b/Minecraft.Client/BubbleParticle.cpp new file mode 100644 index 00000000..2d1380eb --- /dev/null +++ b/Minecraft.Client/BubbleParticle.cpp @@ -0,0 +1,41 @@ +#include "stdafx.h" +#include "BubbleParticle.h" +#include "..\Minecraft.World\Random.h" +#include "..\Minecraft.World\Mth.h" +#include "..\Minecraft.World\JavaMath.h" +#include "..\Minecraft.World\net.minecraft.world.level.h" +#include "..\Minecraft.World\net.minecraft.world.level.material.h" + +BubbleParticle::BubbleParticle(Level *level, double x, double y, double z, double xa, double ya, double za) : Particle(level, x, y, z, xa, ya, za) + { + rCol = 1.0f; + gCol = 1.0f; + bCol = 1.0f; + setMiscTex(32); + this->setSize(0.02f, 0.02f); + + size = size*(random->nextFloat()*0.6f+0.2f); + + xd = xa*0.2f+(float)(Math::random()*2-1)*0.02f; + yd = ya*0.2f+(float)(Math::random()*2-1)*0.02f; + zd = za*0.2f+(float)(Math::random()*2-1)*0.02f; + + lifetime = (int) (8 / (Math::random() * 0.8 + 0.2)); +} + +void BubbleParticle::tick() +{ + xo = x; + yo = y; + zo = z; + + yd += 0.002; + move(xd, yd, zd); + xd *= 0.85f; + yd *= 0.85f; + zd *= 0.85f; + + if (level->getMaterial(Mth::floor(x), Mth::floor(y), Mth::floor(z)) != Material::water) remove(); + + if (lifetime-- <= 0) remove(); +} \ No newline at end of file diff --git a/Minecraft.Client/BubbleParticle.h b/Minecraft.Client/BubbleParticle.h new file mode 100644 index 00000000..0e786d9d --- /dev/null +++ b/Minecraft.Client/BubbleParticle.h @@ -0,0 +1,10 @@ +#pragma once +#include "Particle.h" + +class BubbleParticle : public Particle +{ +public: + virtual eINSTANCEOF GetType() { return eType_BUBBLEPARTICLE; } + BubbleParticle(Level *level, double x, double y, double z, double xa, double ya, double za); + virtual void tick(); +}; \ No newline at end of file diff --git a/Minecraft.Client/BufferedImage.cpp b/Minecraft.Client/BufferedImage.cpp new file mode 100644 index 00000000..37662d8a --- /dev/null +++ b/Minecraft.Client/BufferedImage.cpp @@ -0,0 +1,400 @@ +#include "stdafx.h" +#include "..\Minecraft.World\StringHelpers.h" +#include "Textures.h" +#include "..\Minecraft.World\ArrayWithLength.h" +#include "BufferedImage.h" + +#ifdef _XBOX +typedef struct +{ + unsigned int filesz; + unsigned short creator1; + unsigned short creator2; + unsigned int bmp_offset; + unsigned int header_sz; + unsigned int width; + unsigned int height; + unsigned short nplanes; + unsigned short bitspp; + unsigned int compress_type; + unsigned int bmp_bytesz; + int hres; + int vres; + unsigned int ncolors; + unsigned int nimpcolors; +} BITMAPINFOHEADER; +#endif + +BufferedImage::BufferedImage(int width,int height,int type) +{ + data[0] = new int[width*height]; + + for( int i = 1 ; i < 10; i++ ) + { + data[i] = NULL; + } + this->width = width; + this->height = height; +} + +void BufferedImage::ByteFlip4(unsigned int &data) +{ + data = ( data >> 24 ) | + ( ( data >> 8 ) & 0x0000ff00 ) | + ( ( data << 8 ) & 0x00ff0000 ) | + ( data << 24 ); +} +// Loads a bitmap into a buffered image - only currently supports the 2 types of 32-bit image that we've made so far +// and determines which of these is which by the compression method. Compression method 3 is a 32-bit image with only +// 24-bits used (ie no alpha channel) whereas method 0 is a full 32-bit image with a valid alpha channel. +BufferedImage::BufferedImage(const wstring& File, bool filenameHasExtension /*=false*/, bool bTitleUpdateTexture /*=false*/, const wstring &drive /*=L""*/) +{ + HRESULT hr; + wstring wDrive; + wstring filePath; + filePath = File; + + wDrive = drive; + if(wDrive.empty()) + { +#ifdef _XBOX + if(bTitleUpdateTexture) + { + // Make the content package point to to the UPDATE: drive is needed +#ifdef _TU_BUILD + wDrive=L"UPDATE:\\"; +#else + + wDrive=L"GAME:\\res\\TitleUpdate\\"; +#endif + } + else + { + wDrive=L"GAME:\\"; + } +#else + +#ifdef __PS3__ + + char *pchUsrDir; + if(app.GetBootedFromDiscPatch()) + { + const char *pchTextureName=wstringtofilename(File); + pchUsrDir = app.GetBDUsrDirPath(pchTextureName); + } + else + { + 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(); + + 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/"; + }*/ + + if(bTitleUpdateTexture) + { + // Make the content package point to to the UPDATE: drive is needed + wDrive= L"Common\\res\\TitleUpdate\\"; + } + else + { + wDrive= L"Common/"; + } +#else + if(bTitleUpdateTexture) + { + // Make the content package point to to the UPDATE: drive is needed + wDrive= L"Common\\res\\TitleUpdate\\"; + } + else + { + wDrive= L"Common/"; + } +#endif + +#endif + } + + for( int l = 0 ; l < 10; l++ ) + { + data[l] = NULL; + } + + for( int l = 0; l < 10; l++ ) + { + wstring name; + wstring mipMapPath = L""; + if( l != 0 ) + { + mipMapPath = L"MipMapLevel" + _toString(l+1); + } + if( filenameHasExtension ) + { + name = wDrive + L"res" + filePath.substr(0,filePath.length()); + } + else + { + name = wDrive + L"res" + filePath.substr(0,filePath.length()-4) + mipMapPath + L".png"; + } + + const char *pchTextureName=wstringtofilename(name); + +#ifndef _CONTENT_PACKAGE + app.DebugPrintf("\n--- Loading TEXTURE - %s\n\n",pchTextureName); +#endif + + D3DXIMAGE_INFO ImageInfo; + ZeroMemory(&ImageInfo,sizeof(D3DXIMAGE_INFO)); + hr=RenderManager.LoadTextureData(pchTextureName,&ImageInfo,&data[l]); + + + if(hr!=ERROR_SUCCESS) + { + // 4J - If we haven't loaded the non-mipmap version then exit the game + if( l == 0 ) + { + app.FatalLoadError(); + } + return; + } + + if( l == 0 ) + { + width=ImageInfo.Width; + height=ImageInfo.Height; + } + } +} + +BufferedImage::BufferedImage(DLCPack *dlcPack, const wstring& File, bool filenameHasExtension /*= false*/ ) +{ + HRESULT hr; + wstring filePath = File; + BYTE *pbData = NULL; + DWORD dwBytes = 0; + + for( int l = 0 ; l < 10; l++ ) + { + data[l] = NULL; + } + + for( int l = 0; l < 10; l++ ) + { + wstring name; + wstring mipMapPath = L""; + if( l != 0 ) + { + mipMapPath = L"MipMapLevel" + _toString(l+1); + } + if( filenameHasExtension ) + { + name = L"res" + filePath.substr(0,filePath.length()); + } + else + { + name = L"res" + filePath.substr(0,filePath.length()-4) + mipMapPath + L".png"; + } + + if(!dlcPack->doesPackContainFile(DLCManager::e_DLCType_All, name)) + { + // 4J - If we haven't loaded the non-mipmap version then exit the game + if( l == 0 ) + { + app.FatalLoadError(); + } + return; + } + + DLCFile *dlcFile = dlcPack->getFile(DLCManager::e_DLCType_All, name); + pbData = dlcFile->getData(dwBytes); + if(pbData == NULL || dwBytes == 0) + { + // 4J - If we haven't loaded the non-mipmap version then exit the game + if( l == 0 ) + { + app.FatalLoadError(); + } + return; + } + + D3DXIMAGE_INFO ImageInfo; + ZeroMemory(&ImageInfo,sizeof(D3DXIMAGE_INFO)); + hr=RenderManager.LoadTextureData(pbData,dwBytes,&ImageInfo,&data[l]); + + + if(hr!=ERROR_SUCCESS) + { + // 4J - If we haven't loaded the non-mipmap version then exit the game + if( l == 0 ) + { + app.FatalLoadError(); + } + return; + } + + if( l == 0 ) + { + width=ImageInfo.Width; + height=ImageInfo.Height; + } + } +} + + +BufferedImage::BufferedImage(BYTE *pbData, DWORD dwBytes) +{ + int iCurrentByte=0; + for( int l = 0 ; l < 10; l++ ) + { + data[l] = NULL; + } + + D3DXIMAGE_INFO ImageInfo; + ZeroMemory(&ImageInfo,sizeof(D3DXIMAGE_INFO)); + HRESULT hr=RenderManager.LoadTextureData(pbData,dwBytes,&ImageInfo,&data[0]); + + if(hr==ERROR_SUCCESS) + { + width=ImageInfo.Width; + height=ImageInfo.Height; + } + else + { + app.FatalLoadError(); + } +} + +BufferedImage::~BufferedImage() +{ + for(int i = 0; i < 10; i++ ) + { + delete[] data[i]; + } +} + +int BufferedImage::getWidth() +{ + return width; +} + +int BufferedImage::getHeight() +{ + return height; +} + +void BufferedImage::getRGB(int startX, int startY, int w, int h, intArray out,int offset,int scansize, int level) +{ + int ww = width >> level; + for( int y = 0; y < h; y++ ) + { + for( int x = 0; x < w; x++ ) + { + out[ y * scansize + offset + x] = data[level][ startX + x + ww * ( startY + y ) ]; + } + } +} + +int *BufferedImage::getData() +{ + return data[0]; +} + +int *BufferedImage::getData(int level) +{ + return data[level]; +} + +Graphics *BufferedImage::getGraphics() +{ + return NULL; +} + +//Returns the transparency. Returns either OPAQUE, BITMASK, or TRANSLUCENT. +//Specified by: +//getTransparency in interface Transparency +//Returns: +//the transparency of this BufferedImage. +int BufferedImage::getTransparency() +{ + // TODO - 4J Implement? + return 0; +} + +//Returns a subimage defined by a specified rectangular region. The returned BufferedImage shares the same data array as the original image. +//Parameters: +//x, y - the coordinates of the upper-left corner of the specified rectangular region +//w - the width of the specified rectangular region +//h - the height of the specified rectangular region +//Returns: +//a BufferedImage that is the subimage of this BufferedImage. +BufferedImage *BufferedImage::getSubimage(int x ,int y, int w, int h) +{ + // TODO - 4J Implement + + BufferedImage *img = new BufferedImage(w,h,0); + intArray arrayWrapper(img->data[0], w*h); + this->getRGB(x, y, w, h, arrayWrapper,0,w); + + int level = 1; + while(getData(level) != NULL) + { + int ww = w >> level; + int hh = h >> level; + int xx = x >> level; + int yy = y >> level; + img->data[level] = new int[ww*hh]; + intArray arrayWrapper(img->data[level], ww*hh); + this->getRGB(xx, yy, ww, hh, arrayWrapper,0,ww,level); + + ++level; + } + + return img; +} + + +void BufferedImage::preMultiplyAlpha() +{ + int *curData = data[0]; + + int cur = 0; + int alpha = 0; + int r = 0; + int g = 0; + int b = 0; + + int total = width * height; + for(unsigned int i = 0; i < total; ++i) + { + cur = curData[i]; + alpha = (cur >> 24) & 0xff; + r = ((cur >> 16) & 0xff) * (float)alpha/255; + g = ((cur >> 8) & 0xff) * (float)alpha/255; + b = (cur & 0xff) * (float)alpha/255; + + curData[i] = (r << 16) | (g << 8) | (b ) | (alpha << 24); + } +} diff --git a/Minecraft.Client/BufferedImage.h b/Minecraft.Client/BufferedImage.h new file mode 100644 index 00000000..a0227fe2 --- /dev/null +++ b/Minecraft.Client/BufferedImage.h @@ -0,0 +1,33 @@ +#pragma once +using namespace std; + +class Graphics; +class DLCPack; + +class BufferedImage +{ +private: + int *data[10]; // Arrays for mipmaps - NULL if not used + int width; + int height; + void ByteFlip4(unsigned int &data); // 4J added +public: + static const int TYPE_INT_ARGB = 0; + static const int TYPE_INT_RGB = 1; + BufferedImage(int width,int height,int type); + BufferedImage(const wstring& File, bool filenameHasExtension = false, bool bTitleUpdateTexture=false, const wstring &drive =L""); // 4J added + BufferedImage(DLCPack *dlcPack, const wstring& File, bool filenameHasExtension = false ); // 4J Added + BufferedImage(BYTE *pbData, DWORD dwBytes); // 4J added + ~BufferedImage(); + + int getWidth(); + int getHeight(); + void getRGB(int startX, int startY, int w, int h, intArray out,int offset,int scansize, int level = 0); // 4J Added level param + int *getData(); // 4J added + int *getData(int level); // 4J added + Graphics *getGraphics(); + int getTransparency(); + BufferedImage *getSubimage(int x, int y, int w, int h); + + void preMultiplyAlpha(); +}; \ No newline at end of file diff --git a/Minecraft.Client/Button.cpp b/Minecraft.Client/Button.cpp new file mode 100644 index 00000000..7de105c1 --- /dev/null +++ b/Minecraft.Client/Button.cpp @@ -0,0 +1,85 @@ +#include "stdafx.h" +#include "Button.h" +#include "Textures.h" + +Button::Button(int id, int x, int y, const wstring& msg) +{ + init(id, x, y, 200, 20, msg); +} + +Button::Button(int id, int x, int y, int w, int h, const wstring& msg) +{ + init(id, x, y, w, h, msg); +} + +// 4J - added +void Button::init(int id, int x, int y, int w, int h, const wstring& msg) +{ + active = true; + visible = true; + + // this bit of code from original ctor + this->id = id; + this->x = x; + this->y = y; + this->w = w; + this->h = h; + this->msg = msg; +} + +int Button::getYImage(bool hovered) +{ + int res = 1; + if (!active) res = 0; + else if (hovered) res = 2; + return res; +} + +void Button::render(Minecraft *minecraft, int xm, int ym) +{ + if (!visible) return; + + Font *font = minecraft->font; + + glBindTexture(GL_TEXTURE_2D, minecraft->textures->loadTexture(TN_GUI_GUI)); // 4J was L"/gui/gui.png" + glColor4f(1, 1, 1, 1); + + + bool hovered = xm >= x && ym >= y && xm < x + w && ym < y + h; + int yImage = getYImage(hovered); + + blit(x, y, 0, 46 + yImage * 20, w / 2, h); + blit(x + w / 2, y, 200 - w / 2, 46 + yImage * 20, w / 2, h); + + renderBg(minecraft, xm, ym); + + if (!active) + { + drawCenteredString(font, msg, x + w / 2, y + (h - 8) / 2, 0xffa0a0a0); + } + else + { + if (hovered) + { + drawCenteredString(font, msg, x + w / 2, y + (h - 8) / 2, 0xffffa0); + } + else + { + drawCenteredString(font, msg, x + w / 2, y + (h - 8) / 2, 0xe0e0e0); + } + } + +} + +void Button::renderBg(Minecraft *minecraft, int xm, int ym) +{ +} + +void Button::released(int mx, int my) +{ +} + +bool Button::clicked(Minecraft *minecraft, int mx, int my) +{ + return active && mx >= x && my >= y && mx < x + w && my < y + h; +} \ No newline at end of file diff --git a/Minecraft.Client/Button.h b/Minecraft.Client/Button.h new file mode 100644 index 00000000..0bef133c --- /dev/null +++ b/Minecraft.Client/Button.h @@ -0,0 +1,30 @@ +#pragma once +#include "GuiComponent.h" +using namespace std; + +class Button : public GuiComponent +{ +protected: + int w; + int h; +public: + int x, y; + wstring msg; + int id; + bool active; + bool visible; + + Button(int id, int x, int y, const wstring& msg); + Button(int id, int x, int y, int w, int h, const wstring& msg); + void init(int id, int x, int y, int w, int h, const wstring& msg); // 4J - added +protected: + virtual int getYImage(bool hovered); +public: + virtual void render(Minecraft *minecraft, int xm, int ym); + +protected: + virtual void renderBg(Minecraft *minecraft, int xm, int ym); +public: + virtual void released(int mx, int my); + virtual bool clicked(Minecraft *minecraft, int mx, int my); +}; diff --git a/Minecraft.Client/Camera.cpp b/Minecraft.Client/Camera.cpp new file mode 100644 index 00000000..4de96349 --- /dev/null +++ b/Minecraft.Client/Camera.cpp @@ -0,0 +1,124 @@ +#include "stdafx.h" +#include "Camera.h" +#include "MemoryTracker.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.tile.h" +#include "..\Minecraft.World\TilePos.h" + +float Camera::xPlayerOffs = 0.0f; +float Camera::yPlayerOffs = 0.0f; +float Camera::zPlayerOffs = 0.0f; + +//IntBuffer *Camera::viewport = MemoryTracker::createIntBuffer(16); +FloatBuffer *Camera::modelview = MemoryTracker::createFloatBuffer(16); +FloatBuffer *Camera::projection = MemoryTracker::createFloatBuffer(16); +//FloatBuffer *Camera::position = MemoryTracker::createFloatBuffer(3); + +float Camera::xa = 0.0f; +float Camera::ya = 0.0f; +float Camera::za = 0.0f; +float Camera::xa2 = 0.0f; +float Camera::za2 = 0.0f; + +void Camera::prepare(shared_ptr player, bool mirror) +{ + glGetFloat(GL_MODELVIEW_MATRIX, modelview); + glGetFloat(GL_PROJECTION_MATRIX, projection); + + /* Original java code for reference + glGetInteger(GL_VIEWPORT, viewport); + + float x = (viewport.get(0) + viewport.get(2)) / 2; + float y = (viewport.get(1) + viewport.get(3)) / 2; + gluUnProject(x, y, 0, modelview, projection, viewport, position); + + xPlayerOffs = position->get(0); + yPlayerOffs = position->get(1); + zPlayerOffs = position->get(2); + */ + + // Xbox conversion here... note that we don't bother getting the viewport as this is just working out how to get a (0,0,0) point in clip space to pass into the inverted + // combined model/view/projection matrix, so we just need to get this matrix and get its translation as an equivalent. + XMMATRIX _modelview, _proj, _final, _invert; + XMVECTOR _det; + XMFLOAT4 trans; + + memcpy( &_modelview, modelview->_getDataPointer(), 64 ); + memcpy( &_proj, projection->_getDataPointer(), 64 ); + +#if ( defined __ORBIS__ ) || ( defined __PSVITA__ ) + _modelview = transpose(_modelview); + _proj = transpose(_proj); + _final = _modelview * _proj; + _invert = sce::Vectormath::Simd::Aos::inverse(_final); + xPlayerOffs = _invert.getElem(0,3) / _invert.getElem(3,3); + yPlayerOffs = _invert.getElem(1,3) / _invert.getElem(3,3); + zPlayerOffs = _invert.getElem(2,3) / _invert.getElem(3,3); +#elif defined __PS3__ + _modelview = transpose(_modelview); + _proj = transpose(_proj); + _final = _modelview * _proj; + _invert = Vectormath::Aos::inverse(_final); + xPlayerOffs = _invert.getElem(0,3) / _invert.getElem(3,3); + yPlayerOffs = _invert.getElem(1,3) / _invert.getElem(3,3); + zPlayerOffs = _invert.getElem(2,3) / _invert.getElem(3,3); +#else + _final = XMMatrixMultiply( _modelview, _proj ); + _det = XMMatrixDeterminant(_final); + _invert = XMMatrixInverse(&_det, _final); + + XMStoreFloat4(&trans,_invert.r[3]); + + xPlayerOffs = trans.x / trans.w; + yPlayerOffs = trans.y / trans.w; + zPlayerOffs = trans.z / trans.w; +#endif + + int flipCamera = mirror ? 1 : 0; + + float xRot = player->xRot; + float yRot = player->yRot; + + xa = cosf(yRot * PI / 180.0f) * (1 - flipCamera * 2); + za = sinf(yRot * PI / 180.0f) * (1 - flipCamera * 2); + + xa2 = -za * sinf(xRot * PI / 180.0f) * (1 - flipCamera * 2); + za2 = xa * sinf(xRot * PI / 180.0f) * (1 - flipCamera * 2); + ya = cosf(xRot * PI / 180.0f); +} + +TilePos *Camera::getCameraTilePos(shared_ptr player, double alpha) +{ + return new TilePos(getCameraPos(player, 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(); + double zz = player->zo + (player->z - player->zo) * alpha; + + double xt = xx + Camera::xPlayerOffs * 1; + double yt = yy + Camera::yPlayerOffs * 1; + double zt = zz + Camera::zPlayerOffs * 1; + + return Vec3::newTemp(xt, yt, zt); +} + +int Camera::getBlockAt(Level *level, shared_ptr player, float alpha) +{ + Vec3 *p = Camera::getCameraPos(player, alpha); + TilePos tp = TilePos(p); + int t = level->getTile(tp.x, tp.y, tp.z); + if (t != 0 && Tile::tiles[t]->material->isLiquid()) + { + float hh = LiquidTile::getHeight(level->getData(tp.x, tp.y, tp.z)) - 1 / 9.0f; + float h = tp.y + 1 - hh; + if (p->y >= h) + { + t = level->getTile(tp.x, tp.y + 1, tp.z); + } + } + return t; +} \ No newline at end of file diff --git a/Minecraft.Client/Camera.h b/Minecraft.Client/Camera.h new file mode 100644 index 00000000..456c8858 --- /dev/null +++ b/Minecraft.Client/Camera.h @@ -0,0 +1,32 @@ +#pragma once +#include "..\Minecraft.World\FloatBuffer.h" +#include "..\Minecraft.World\IntBuffer.h" + + +class TilePos; +class Vec3; +class Player; +class Mob; + +class Camera +{ +public: + static float xPlayerOffs; + static float yPlayerOffs; + static float zPlayerOffs; + +private: +// static IntBuffer *viewport; + static FloatBuffer *modelview; + static FloatBuffer *projection; +// static FloatBuffer *position; + +public: + static float xa, ya, za, xa2, za2; + + 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); +}; \ 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/ChatScreen.cpp b/Minecraft.Client/ChatScreen.cpp new file mode 100644 index 00000000..b68e6cac --- /dev/null +++ b/Minecraft.Client/ChatScreen.cpp @@ -0,0 +1,89 @@ +#include "stdafx.h" +#include "ChatScreen.h" +#include "MultiplayerLocalPlayer.h" +#include "..\Minecraft.World\SharedConstants.h" +#include "..\Minecraft.World\StringHelpers.h" + +const wstring ChatScreen::allowedChars = SharedConstants::acceptableLetters; + +ChatScreen::ChatScreen() +{ + frame = 0; +} + +void ChatScreen::init() +{ + Keyboard::enableRepeatEvents(true); +} + +void ChatScreen::removed() +{ + Keyboard::enableRepeatEvents(false); +} + +void ChatScreen::tick() +{ + frame++; +} + +void ChatScreen::keyPressed(wchar_t ch, int eventKey) +{ + if (eventKey == Keyboard::KEY_ESCAPE) + { + minecraft->setScreen(NULL); + return; + } + if (eventKey == Keyboard::KEY_RETURN) + { + wstring msg = trimString(message); + if (msg.length() > 0) + { + wstring trim = trimString(message); + if (!minecraft->handleClientSideCommand(trim)) + { + minecraft->player->chat(trim); + } + } + minecraft->setScreen(NULL); + return; + } + if (eventKey == Keyboard::KEY_BACK && message.length() > 0) message = message.substr(0, message.length() - 1); + if (allowedChars.find(ch) >= 0 && message.length() < SharedConstants::maxChatLength) + { + message += ch; + } + +} + +void ChatScreen::render(int xm, int ym, float a) +{ + fill(2, height - 14, width - 2, height - 2, 0x80000000); + drawString(font, L"> " + message + (frame / 6 % 2 == 0 ? L"_" : L""), 4, height - 12, 0xe0e0e0); + + Screen::render(xm, ym, a); +} + +void ChatScreen::mouseClicked(int x, int y, int buttonNum) +{ + if (buttonNum == 0) + { + if (minecraft->gui->selectedName != L"") // 4J - was NULL comparison + { + if (message.length() > 0 && message[message.length()-1]!=L' ') + { + message += L" "; + } + message += minecraft->gui->selectedName; + unsigned int maxLength = SharedConstants::maxChatLength; + if (message.length() > maxLength) + { + message = message.substr(0, maxLength); + } + } + else + { + Screen::mouseClicked(x, y, buttonNum); + } + } + +} \ No newline at end of file diff --git a/Minecraft.Client/ChatScreen.h b/Minecraft.Client/ChatScreen.h new file mode 100644 index 00000000..d7158478 --- /dev/null +++ b/Minecraft.Client/ChatScreen.h @@ -0,0 +1,25 @@ +#pragma once +#include "Screen.h" +using namespace std; + +class ChatScreen : public Screen +{ +protected: + wstring message; +private: + int frame; + +public: + ChatScreen(); //4J added + virtual void init(); + virtual void removed(); + virtual void tick(); +private: + static const wstring allowedChars; +protected: + void keyPressed(wchar_t ch, int eventKey); +public: + void render(int xm, int ym, float a); +protected: + void mouseClicked(int x, int y, int buttonNum); +}; \ No newline at end of file diff --git a/Minecraft.Client/ChestModel.cpp b/Minecraft.Client/ChestModel.cpp new file mode 100644 index 00000000..63f27c44 --- /dev/null +++ b/Minecraft.Client/ChestModel.cpp @@ -0,0 +1,43 @@ +#include "stdafx.h" +#include "ChestModel.h" +#include "ModelPart.h" + +ChestModel::ChestModel() +{ + lid = ((new ModelPart(this, 0, 0)))->setTexSize(64, 64); + lid->addBox(0.0f, -5.0f, -14.0f, 14, 5, 14, 0.0f); + lid->x = 1; + lid->y = 7; + lid->z = 15; + + lock = ((new ModelPart(this, 0, 0)))->setTexSize(64, 64); + lock->addBox(-1.0f, -2.0f, -15.0f, 2, 4, 1, 0.0f); + lock->x = 8; + lock->y = 7; + lock->z = 15; + + bottom = ((new ModelPart(this, 0, 19)))->setTexSize(64, 64); + bottom->addBox(0.0f, 0.0f, 0.0f, 14, 10, 14, 0.0f); + bottom->x = 1; + bottom->y = 6; + bottom->z = 1; + + + // 4J added - compile now to avoid random performance hit first time cubes are rendered + lid->compile(1.0f/16.0f); + lock->compile(1.0f/16.0f); + bottom->compile(1.0f/16.0f); +} + +void ChestModel::render(bool usecompiled) +{ + lock->xRot = lid->xRot; + + lock->render(1 / 16.0f, usecompiled); + bottom->render(1 / 16.0f, usecompiled); + + // 4J - moved lid to last and added z-bias to avoid glitching caused by z-fighting between the area of overlap between the lid & bottom of the chest + glPolygonOffset(-0.3f, -0.3f); + lid->render(1 / 16.0f, usecompiled); + glPolygonOffset(0.0f, 0.0f); +} \ No newline at end of file diff --git a/Minecraft.Client/ChestModel.h b/Minecraft.Client/ChestModel.h new file mode 100644 index 00000000..416ccf75 --- /dev/null +++ b/Minecraft.Client/ChestModel.h @@ -0,0 +1,18 @@ +#pragma once + +#include "Model.h" + +class Cube; + +class ChestModel : public Model +{ +public: + using Model::render; + + ModelPart *lid; + ModelPart *bottom; + ModelPart *lock; + + ChestModel(); + void render(bool usecompiled); +}; diff --git a/Minecraft.Client/ChestRenderer.cpp b/Minecraft.Client/ChestRenderer.cpp new file mode 100644 index 00000000..97954b55 --- /dev/null +++ b/Minecraft.Client/ChestRenderer.cpp @@ -0,0 +1,146 @@ +#include "stdafx.h" +#include "ChestRenderer.h" +#include "ChestModel.h" +#include "LargeChestModel.h" +#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" + +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() +{ + delete chestModel; + delete largeChestModel; +} + +void ChestRenderer::render(shared_ptr _chest, double x, double y, double z, float a, bool setColor, float alpha, bool useCompiled) +{ + // 4J Convert as we aren't using a templated class + shared_ptr chest = dynamic_pointer_cast(_chest); + + int data; + + if (!chest->hasLevel()) + { + data = 0; + } + else + { + Tile *tile = chest->getTile(); + data = chest->getData(); + + if (dynamic_cast(tile) != NULL && data == 0) + { + ((ChestTile *) tile)->recalcLockDir(chest->getLevel(), chest->x, chest->y, chest->z); + data = chest->getData(); + } + + chest->checkNeighbors(); + } + if (chest->n.lock() != NULL || chest->w.lock() != NULL) return; + + + ChestModel *model; + if (chest->e.lock() != NULL || chest->s.lock() != NULL) + { + model = largeChestModel; + + 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; + if (chest->getType() == ChestTile::TYPE_TRAP) + { + bindTexture(&CHEST_TRAP_LOCATION); + } + //else if (xmasTextures) + //{ + // bindTexture(&CHEST_XMAS_LOCATION); + //} + else + { + bindTexture(&CHEST_LOCATION); + } + } + + glPushMatrix(); + glEnable(GL_RESCALE_NORMAL); + //if( setColor ) glColor4f(1, 1, 1, 1); + if( setColor ) glColor4f(1, 1, 1, alpha); + glTranslatef((float) x, (float) y + 1, (float) z + 1); + glScalef(1, -1, -1); + + glTranslatef(0.5f, 0.5f, 0.5f); + int rot = 0; + if (data == 2) rot = 180; + if (data == 3) rot = 0; + if (data == 4) rot = 90; + if (data == 5) rot = -90; + + if (data == 2 && chest->e.lock() != NULL) + { + glTranslatef(1, 0, 0); + } + if (data == 5 && chest->s.lock() != NULL) + { + glTranslatef(0, 0, -1); + } + glRotatef(rot, 0, 1, 0); + glTranslatef(-0.5f, -0.5f, -0.5f); + + float open = chest->oOpenness + (chest->openness - chest->oOpenness) * a; + if (chest->n.lock() != NULL) + { + float open2 = chest->n.lock()->oOpenness + (chest->n.lock()->openness - chest->n.lock()->oOpenness) * a; + if (open2 > open) open = open2; + } + if (chest->w.lock() != NULL) + { + float open2 = chest->w.lock()->oOpenness + (chest->w.lock()->openness - chest->w.lock()->oOpenness) * a; + if (open2 > open) open = open2; + } + + open = 1 - open; + open = 1 - open * open * open; + + model->lid->xRot = -(open * PI / 2); + model->render(useCompiled); + glDisable(GL_RESCALE_NORMAL); + glPopMatrix(); + if( setColor ) glColor4f(1, 1, 1, 1); +} diff --git a/Minecraft.Client/ChestRenderer.h b/Minecraft.Client/ChestRenderer.h new file mode 100644 index 00000000..3d9345b9 --- /dev/null +++ b/Minecraft.Client/ChestRenderer.h @@ -0,0 +1,25 @@ +#pragma once +#include "TileEntityRenderer.h" + +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(); + ~ChestRenderer(); + + void render(shared_ptr _chest, double x, double y, double z, float a, bool setColor, float alpha=1.0f, bool useCompiled = true); // 4J added setColor param +}; diff --git a/Minecraft.Client/ChickenModel.cpp b/Minecraft.Client/ChickenModel.cpp new file mode 100644 index 00000000..98ef9358 --- /dev/null +++ b/Minecraft.Client/ChickenModel.cpp @@ -0,0 +1,104 @@ +#include "stdafx.h" +#include "..\Minecraft.World\Mth.h" +#include "ChickenModel.h" +#include "ModelPart.h" + +ChickenModel::ChickenModel() : Model() +{ + int yo = 16; + head = new ModelPart(this, 0, 0); + head->addBox(-2.0f, -6.0f, -2.0f, 4, 6, 3, 0.0f); // Head + head->setPos(0, (float)(-1 + yo), -4); + + beak = new ModelPart(this, 14, 0); + beak->addBox(-2.0f, -4.0f, -4.0f, 4, 2, 2, 0.0f); // Beak + beak->setPos(0, (float)(-1 + yo), -4); + + redThing = new ModelPart(this, 14, 4); + redThing->addBox(-1.0f, -2.0f, -3.0f, 2, 2, 2, 0.0f); // Beak + redThing->setPos(0, (float)(-1 + yo), -4); + + body = new ModelPart(this, 0, 9); + body->addBox(-3.0f, -4.0f, -3.0f, 6, 8, 6, 0.0f); // Body + body->setPos(0, (float)(0 + yo), 0); + + leg0 = new ModelPart(this, 26, 0); + leg0->addBox(-1.0f, 0.0f, -3.0f, 3, 5, 3); // Leg0 + leg0->setPos(-2, (float)(3 + yo), 1); + + leg1 = new ModelPart(this, 26, 0); + leg1->addBox(-1.0f, 0.0f, -3.0f, 3, 5, 3); // Leg1 + leg1->setPos(1, (float)(3 + yo), 1); + + wing0 = new ModelPart(this, 24, 13); + wing0->addBox(0.0f, 0.0f, -3.0f, 1, 4, 6); // Wing0 + wing0->setPos(-4, (float)(-3 + yo), 0); + + wing1 = new ModelPart(this, 24, 13); + wing1->addBox(-1.0f, 0.0f, -3.0f, 1, 4, 6); // Wing1 + wing1->setPos(4, (float)(-3 + yo), 0); + + // 4J added - compile now to avoid random performance hit first time cubes are rendered + head->compile(1.0f/16.0f); + beak->compile(1.0f/16.0f); + redThing->compile(1.0f/16.0f); + body->compile(1.0f/16.0f); + leg0->compile(1.0f/16.0f); + leg1->compile(1.0f/16.0f); + wing0->compile(1.0f/16.0f); + wing1->compile(1.0f/16.0f); +} + +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, entity); + if (young) + { + float ss = 2; + glPushMatrix(); + glTranslatef(0, 5 * scale, 2 * scale); + head->render(scale,usecompiled); + beak->render(scale,usecompiled); + redThing->render(scale,usecompiled); + glPopMatrix(); + glPushMatrix(); + glScalef(1 / ss, 1 / ss, 1 / ss); + glTranslatef(0, 24 * scale, 0); + body->render(scale,usecompiled); + leg0->render(scale,usecompiled); + leg1->render(scale,usecompiled); + wing0->render(scale,usecompiled); + wing1->render(scale,usecompiled); + glPopMatrix(); + } + else + { + head->render(scale,usecompiled); + beak->render(scale,usecompiled); + redThing->render(scale,usecompiled); + body->render(scale,usecompiled); + leg0->render(scale,usecompiled); + leg1->render(scale,usecompiled); + wing0->render(scale,usecompiled); + wing1->render(scale,usecompiled); + } +} + +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); + + beak->xRot = head->xRot; + beak->yRot = head->yRot; + + redThing->xRot = head->xRot; + redThing->yRot = head->yRot; + + body->xRot = 90 / (float) (180 / PI); + + leg0->xRot = (Mth::cos(time * 0.6662f) * 1.4f) * r; + leg1->xRot = ( Mth::cos(time * 0.6662f + PI) * 1.4f) * r; + wing0->zRot = bob; + wing1->zRot = -bob; +} diff --git a/Minecraft.Client/ChickenModel.h b/Minecraft.Client/ChickenModel.h new file mode 100644 index 00000000..60d9c262 --- /dev/null +++ b/Minecraft.Client/ChickenModel.h @@ -0,0 +1,11 @@ +#include "Model.h" + +class ChickenModel : public Model +{ +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, shared_ptr entity, unsigned int uiBitmaskOverrideAnim = 0); +}; diff --git a/Minecraft.Client/ChickenRenderer.cpp b/Minecraft.Client/ChickenRenderer.cpp new file mode 100644 index 00000000..4f369df3 --- /dev/null +++ b/Minecraft.Client/ChickenRenderer.cpp @@ -0,0 +1,31 @@ +#include "stdafx.h" +#include "..\Minecraft.World\Mth.h" +#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) +{ +} + +void ChickenRenderer::render(shared_ptr _mob, double x, double y, double z, float rot, float a) +{ + MobRenderer::render(_mob, x, y, z, rot, a); +} + +float ChickenRenderer::getBob(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 flap = mob->oFlap+(mob->flap-mob->oFlap)*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 new file mode 100644 index 00000000..7e0a5d9a --- /dev/null +++ b/Minecraft.Client/ChickenRenderer.h @@ -0,0 +1,16 @@ +#pragma once +#include "MobRenderer.h" + +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); +}; \ No newline at end of file diff --git a/Minecraft.Client/Chunk.cpp b/Minecraft.Client/Chunk.cpp new file mode 100644 index 00000000..d039227b --- /dev/null +++ b/Minecraft.Client/Chunk.cpp @@ -0,0 +1,1038 @@ +#include "stdafx.h" +#include "Chunk.h" +#include "TileRenderer.h" +#include "TileEntityRenderDispatcher.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\net.minecraft.world.level.tile.entity.h" +#include "LevelRenderer.h" + +#ifdef __PS3__ +#include "PS3\SPU_Tasks\ChunkUpdate\ChunkRebuildData.h" +#include "PS3\SPU_Tasks\ChunkUpdate\TileRenderer_SPU.h" +#include "PS3\SPU_Tasks\CompressedTile\CompressedTileStorage_SPU.h" + +#include "C4JThread_SPU.h" +#include "C4JSpursJob.h" +//#define DISABLE_SPU_CODE + +#endif + +int Chunk::updates = 0; + +#ifdef _LARGE_WORLDS +DWORD Chunk::tlsIdx = TlsAlloc(); + +void Chunk::CreateNewThreadStorage() +{ + unsigned char *tileIds = new unsigned char[16 * 16 * Level::maxBuildHeight]; + TlsSetValue(tlsIdx, tileIds); +} + +void Chunk::ReleaseThreadStorage() +{ + unsigned char *tileIds = (unsigned char *)TlsGetValue(tlsIdx); + delete tileIds; +} + +unsigned char *Chunk::GetTileIdsStorage() +{ + unsigned char *tileIds = (unsigned char *)TlsGetValue(tlsIdx); + return tileIds; +} +#else +// 4J Stu - Don't want this when multi-threaded +Tesselator *Chunk::t = Tesselator::getInstance(); +#endif +LevelRenderer *Chunk::levelRenderer; + +// TODO - 4J see how input entity vector is set up and decide what way is best to pass this to the function +Chunk::Chunk(Level *level, LevelRenderer::rteMap &globalRenderableTileEntities, CRITICAL_SECTION& globalRenderableTileEntities_cs, int x, int y, int z, ClipChunk *clipChunk) + : globalRenderableTileEntities( &globalRenderableTileEntities ), globalRenderableTileEntities_cs(&globalRenderableTileEntities_cs) +{ + clipChunk->visible = false; + bb = NULL; + id = 0; + + this->level = level; + //this->globalRenderableTileEntities = globalRenderableTileEntities; + + assigned = false; + this->clipChunk = clipChunk; + setPos(x, y, z); +} + +void Chunk::setPos(int x, int y, int z) +{ + if(assigned && (x == this->x && y == this->y && z == this->z)) return; + + reset(); + + this->x = x; + this->y = y; + this->z = z; + xm = x + XZSIZE / 2; + ym = y + SIZE / 2; + zm = z + XZSIZE / 2; + clipChunk->xm = xm; + clipChunk->ym = ym; + clipChunk->zm = zm; + + clipChunk->globalIdx = LevelRenderer::getGlobalIndexForChunk(x, y, z, level); + +#if 1 + // 4J - we're not using offsetted renderlists anymore, so just set the full position of this chunk into x/y/zRenderOffs where + // it will be used directly in the renderlist of this chunk + xRenderOffs = x; + yRenderOffs = y; + zRenderOffs = z; + xRender = 0; + yRender = 0; + zRender = 0; +#else + xRenderOffs = x & 1023; + yRenderOffs = y; + zRenderOffs = z & 1023; + xRender = x - xRenderOffs; + yRender = y - yRenderOffs; + zRender = z - zRenderOffs; +#endif + + float g = 6.0f; + // 4J - changed to just set the value rather than make a new one, if we've already created storage + if( bb == NULL ) + { + bb = AABB::newPermanent(-g, -g, -g, XZSIZE+g, SIZE+g, XZSIZE+g); + } + else + { + // 4J MGH - bounds are relative to the position now, so the AABB will be setup already, either above, or from the tesselator bounds. +// bb->set(-g, -g, -g, SIZE+g, SIZE+g, SIZE+g); + } + clipChunk->aabb[0] = bb->x0 + x; + clipChunk->aabb[1] = bb->y0 + y; + clipChunk->aabb[2] = bb->z0 + z; + clipChunk->aabb[3] = bb->x1 + x; + clipChunk->aabb[4] = bb->y1 + y; + clipChunk->aabb[5] = bb->z1 + z; + + assigned = true; + + EnterCriticalSection(&levelRenderer->m_csDirtyChunks); + unsigned char refCount = levelRenderer->incGlobalChunkRefCount(x, y, z, level); +// printf("\t\t [inc] refcount %d at %d, %d, %d\n",refCount,x,y,z); + +// int idx = levelRenderer->getGlobalIndexForChunk(x, y, z, level); + + // If we're the first thing to be referencing this, mark it up as dirty to get rebuilt + if( refCount == 1 ) + { +// printf("Setting %d %d %d dirty [%d]\n",x,y,z, idx); + // Chunks being made dirty in this way can be very numerous (eg the full visible area of the world at start up, or a whole edge of the world when moving). + // On account of this, don't want to stick them into our lock free queue that we would normally use for letting the render update thread know about this chunk. + // Instead, just set the flag to say this is dirty, and then pass a special value of 1 through to the lock free stack which lets that thread know that at least + // one chunk other than the ones in the stack itself have been made dirty. + levelRenderer->setGlobalChunkFlag(x, y, z, level, LevelRenderer::CHUNK_FLAG_DIRTY ); +#ifdef _XBOX + PIXSetMarker(0,"Non-stack event pushed"); +#else + PIXSetMarkerDeprecated(0,"Non-stack event pushed"); +#endif + } + + LeaveCriticalSection(&levelRenderer->m_csDirtyChunks); + + +} + +void Chunk::translateToPos() +{ + glTranslatef((float)xRenderOffs, (float)yRenderOffs, (float)zRenderOffs); +} + + +Chunk::Chunk() +{ +} + +void Chunk::makeCopyForRebuild(Chunk *source) +{ + this->level = source->level; + this->x = source->x; + this->y = source->y; + this->z = source->z; + this->xRender = source->xRender; + this->yRender = source->yRender; + this->zRender = source->zRender; + this->xRenderOffs = source->xRenderOffs; + this->yRenderOffs = source->yRenderOffs; + this->zRenderOffs = source->zRenderOffs; + this->xm = source->xm; + this->ym = source->ym; + this->zm = source->zm; + this->bb = source->bb; + this->clipChunk = NULL; + this->id = source->id; + this->globalRenderableTileEntities = source->globalRenderableTileEntities; + this->globalRenderableTileEntities_cs = source->globalRenderableTileEntities_cs; +} + +void Chunk::rebuild() +{ + PIXBeginNamedEvent(0,"Rebuilding chunk %d, %d, %d", x, y, z); +#if defined __PS3__ && !defined DISABLE_SPU_CODE + rebuild_SPU(); + return; +#endif // __PS3__ + +// if (!dirty) return; + PIXBeginNamedEvent(0,"Rebuild section A"); + +#ifdef _LARGE_WORLDS + Tesselator *t = Tesselator::getInstance(); +#else + Chunk::t = Tesselator::getInstance(); // 4J - added - static initialiser being set at the wrong time +#endif + + updates++; + + int x0 = x; + int y0 = y; + int z0 = z; + int x1 = x + XZSIZE; + int y1 = y + SIZE; + int z1 = z + XZSIZE; + + LevelChunk::touchedSky = false; + +// unordered_set > oldTileEntities(renderableTileEntities.begin(),renderableTileEntities.end()); // 4J removed this & next line +// renderableTileEntities.clear(); + + vector > renderableTileEntities; // 4J - added + + int r = 1; + + int lists = levelRenderer->getGlobalIndexForChunk(this->x,this->y,this->z,level) * 2; + lists += levelRenderer->chunkLists; + + PIXEndNamedEvent(); + + PIXBeginNamedEvent(0,"Rebuild section B"); + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // 4J - optimisation begins. + + // Get the data for the level chunk that this render chunk is it (level chunk is 16 x 16 x 128, + // render chunk is 16 x 16 x 16. We wouldn't have to actually get all of it if the data was ordered differently, but currently + // it is ordered by x then z then y so just getting a small range of y out of it would involve getting the whole thing into + // the cache anyway. + +#ifdef _LARGE_WORLDS + unsigned char *tileIds = GetTileIdsStorage(); +#else + static unsigned char tileIds[16 * 16 * Level::maxBuildHeight]; +#endif + 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, 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 + // Basically we're storing of copy of the tileIDs array inside the region so that calls to Region::getTile can grab data + // more quickly from this array rather than calling CompressedTileStorage. On the Vita the total thread time spent in + // Region::getTile went from 20% to 4%. +#ifdef __PSVITA__ + int xc = x >> 4; + int zc = z >> 4; + ((Region*)region)->setCachedTiles(tileIds, xc, zc); +#endif + + // We now go through the vertical section of this level chunk that we are interested in and try and establish + // (1) if it is completely empty + // (2) if any of the tiles can be quickly determined to not need rendering because they are in the middle of other tiles and + // so can't be seen. A large amount (> 60% in tests) of tiles that call tesselateInWorld in the unoptimised version + // of this function fall into this category. By far the largest category of these are tiles in solid regions of rock. + bool empty = true; + for( int yy = y0; yy < y1; yy++ ) + { + for( int zz = 0; zz < 16; zz++ ) + { + for( int xx = 0; xx < 16; xx++ ) + { + // 4J Stu - tile data is ordered in 128 blocks of full width, lower 128 then upper 128 + int indexY = yy; + int offset = 0; + if(indexY >= Level::COMPRESSED_CHUNK_SECTION_HEIGHT) + { + indexY -= Level::COMPRESSED_CHUNK_SECTION_HEIGHT; + offset = Level::COMPRESSED_CHUNK_SECTION_TILES; + } + + unsigned char tileId = tileIds[ offset + ( ( ( xx + 0 ) << 11 ) | ( ( zz + 0 ) << 7 ) | ( indexY + 0 ) ) ]; + if( tileId > 0 ) empty = false; + + // Don't bother trying to work out neighbours for this tile if we are at the edge of the chunk - apart from the very + // bottom of the world where we shouldn't ever be able to see + if( yy == (Level::maxBuildHeight - 1) ) continue; + if(( xx == 0 ) || ( xx == 15 )) continue; + if(( zz == 0 ) || ( zz == 15 )) continue; + + // Establish whether this tile and its neighbours are all made of rock, dirt, unbreakable tiles, or have already + // been determined to meet this criteria themselves and have a tile of 255 set. + if( !( ( tileId == Tile::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::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::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::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::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 ) + { + int indexYMinusOne = yy - 1; + int yMinusOneOffset = 0; + if(indexYMinusOne >= Level::COMPRESSED_CHUNK_SECTION_HEIGHT) + { + indexYMinusOne -= Level::COMPRESSED_CHUNK_SECTION_HEIGHT; + yMinusOneOffset = Level::COMPRESSED_CHUNK_SECTION_TILES; + } + tileId = tileIds[ yMinusOneOffset + ( ( ( xx + 0 ) << 11 ) | ( ( zz + 0 ) << 7 ) | indexYMinusOne ) ]; + if( !( ( tileId == Tile::stone_Id ) || ( tileId == Tile::dirt_Id ) || ( tileId == Tile::unbreakable_Id ) || ( tileId == 255) ) ) continue; + } + int indexYPlusOne = yy + 1; + int yPlusOneOffset = 0; + if(indexYPlusOne >= Level::COMPRESSED_CHUNK_SECTION_HEIGHT) + { + indexYPlusOne -= Level::COMPRESSED_CHUNK_SECTION_HEIGHT; + yPlusOneOffset = Level::COMPRESSED_CHUNK_SECTION_TILES; + } + tileId = tileIds[ yPlusOneOffset + ( ( ( xx + 0 ) << 11 ) | ( ( zz + 0 ) << 7 ) | indexYPlusOne ) ]; + 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; + } + } + } + PIXEndNamedEvent(); + // Nothing at all to do for this chunk? + if( empty ) + { + // 4J - added - clear any renderer data associated with this + for (int currentLayer = 0; currentLayer < 2; currentLayer++) + { + levelRenderer->setGlobalChunkFlag(this->x, this->y, this->z, level, LevelRenderer::CHUNK_FLAG_EMPTY0, currentLayer); + RenderManager.CBuffClear(lists + currentLayer); + } + + delete region; + delete tileRenderer; + return; + } + // 4J - optimisation ends + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + PIXBeginNamedEvent(0,"Rebuild section C"); + Tesselator::Bounds bounds; // 4J MGH - added + { + // this was the old default clip bounds for the chunk, set in Chunk::setPos. + float g = 6.0f; + bounds.boundingBox[0] = -g; + bounds.boundingBox[1] = -g; + bounds.boundingBox[2] = -g; + bounds.boundingBox[3] = XZSIZE+g; + bounds.boundingBox[4] = SIZE+g; + bounds.boundingBox[5] = XZSIZE+g; + } + for (int currentLayer = 0; currentLayer < 2; currentLayer++) + { + bool renderNextLayer = false; + bool rendered = false; + + bool started = false; + + // 4J - changed loop order here to leave y as the innermost loop for better cache performance + for (int z = z0; z < z1; z++) + { + for (int x = x0; x < x1; x++) + { + for (int y = y0; y < y1; y++) + { + // 4J Stu - tile data is ordered in 128 blocks of full width, lower 128 then upper 128 + int indexY = y; + int offset = 0; + if(indexY >= Level::COMPRESSED_CHUNK_SECTION_HEIGHT) + { + indexY -= Level::COMPRESSED_CHUNK_SECTION_HEIGHT; + offset = Level::COMPRESSED_CHUNK_SECTION_TILES; + } + + // 4J - get tile from those copied into our local array in earlier optimisation + unsigned char tileId = tileIds[ offset + ( ( ( x - x0 ) << 11 ) | ( ( z - z0 ) << 7 ) | indexY) ]; + // If flagged as not visible, drop out straight away + if( tileId == 0xff ) continue; +// int tileId = region->getTile(x,y,z); + if (tileId > 0) + { + if (!started) + { + started = true; + + MemSect(31); + glNewList(lists + currentLayer, GL_COMPILE); + MemSect(0); + glPushMatrix(); + glDepthMask(true); // 4J added + t->useCompactVertices(true); // 4J added + translateToPos(); + float ss = 1.000001f; + // 4J - have removed this scale as I don't think we should need it, and have now optimised the vertex + // shader so it doesn't do anything other than translate with this matrix anyway +#if 0 + glTranslatef(-zs / 2.0f, -ys / 2.0f, -zs / 2.0f); + glScalef(ss, ss, ss); + glTranslatef(zs / 2.0f, ys / 2.0f, zs / 2.0f); +#endif + t->begin(); + t->offset((float)(-this->x), (float)(-this->y), (float)(-this->z)); + } + + Tile *tile = Tile::tiles[tileId]; + if (currentLayer == 0 && tile->isEntityTile()) + { + shared_ptr et = region->getTileEntity(x, y, z); + if (TileEntityRenderDispatcher::instance->hasRenderer(et)) + { + renderableTileEntities.push_back(et); + } + } + int renderLayer = tile->getRenderLayer(); + + if (renderLayer != currentLayer) + { + renderNextLayer = true; + } + else if (renderLayer == currentLayer) + { + rendered |= tileRenderer->tesselateInWorld(tile, x, y, z); + } + } + } + } + } + +#ifdef __PSVITA__ + if( currentLayer==0 ) + { + levelRenderer->clearGlobalChunkFlag(this->x, this->y, this->z, level, LevelRenderer::CHUNK_FLAG_CUT_OUT); + } +#endif + + if (started) + { +#ifdef __PSVITA__ + // AP - make sure we don't attempt to render chunks without cutout geometry + if( t->getCutOutFound() ) + { + levelRenderer->setGlobalChunkFlag(this->x, this->y, this->z, level, LevelRenderer::CHUNK_FLAG_CUT_OUT); + } +#endif + t->end(); + bounds.addBounds(t->bounds); // 4J MGH - added + glPopMatrix(); + glEndList(); + t->useCompactVertices(false); // 4J added + t->offset(0, 0, 0); + } + else + { + rendered = false; + } + + if (rendered) + { + levelRenderer->clearGlobalChunkFlag(this->x, this->y, this->z, level, LevelRenderer::CHUNK_FLAG_EMPTY0, currentLayer); + } + else + { + // 4J - added - clear any renderer data associated with this unused list + levelRenderer->setGlobalChunkFlag(this->x, this->y, this->z, level, LevelRenderer::CHUNK_FLAG_EMPTY0, currentLayer); + RenderManager.CBuffClear(lists + currentLayer); + } + if((currentLayer==0)&&(!renderNextLayer)) + { + levelRenderer->setGlobalChunkFlag(this->x, this->y, this->z, level, LevelRenderer::CHUNK_FLAG_EMPTY1); + RenderManager.CBuffClear(lists + 1); + break; + } + } + + // 4J MGH - added this to take the bound from the value calc'd in the tesselator + if( bb ) + { + bb->set(bounds.boundingBox[0], bounds.boundingBox[1], bounds.boundingBox[2], + bounds.boundingBox[3], bounds.boundingBox[4], bounds.boundingBox[5]); + } + + delete tileRenderer; + delete region; + + PIXEndNamedEvent(); + PIXBeginNamedEvent(0,"Rebuild section D"); + + // 4J - have rewritten the way that tile entities are stored globally to make it work more easily with split screen. Chunks are now + // stored globally in the levelrenderer, in a hashmap with a special key made up from the dimension and chunk position (using same index + // as is used for global flags) +#if 1 + int key = levelRenderer->getGlobalIndexForChunk(this->x,this->y,this->z,level); + EnterCriticalSection(globalRenderableTileEntities_cs); + if( renderableTileEntities.size() ) + { + AUTO_VAR(it, globalRenderableTileEntities->find(key)); + if( it != globalRenderableTileEntities->end() ) + { + // We've got some renderable tile entities that we want associated with this chunk, and an existing list of things that used to be. + // We need to flag any that we don't need any more to be removed, keep those that we do, and add any new ones + + // First pass - flag everything already existing to be removed + for( AUTO_VAR(it2, it->second.begin()); it2 != it->second.end(); it2++ ) + { + (*it2)->setRenderRemoveStage(TileEntity::e_RenderRemoveStageFlaggedAtChunk); + } + + // Now go through the current list. If these are already in the list, then unflag the remove flag. If they aren't, then add + for( int i = 0; i < renderableTileEntities.size(); i++ ) + { + AUTO_VAR(it2, find( it->second.begin(), it->second.end(), renderableTileEntities[i] )); + if( it2 == it->second.end() ) + { + (*globalRenderableTileEntities)[key].push_back(renderableTileEntities[i]); + } + else + { + (*it2)->setRenderRemoveStage(TileEntity::e_RenderRemoveStageKeep); + } + } + } + else + { + // Easy case - nothing already existing for this chunk. Add them all in. + for( int i = 0; i < renderableTileEntities.size(); i++ ) + { + (*globalRenderableTileEntities)[key].push_back(renderableTileEntities[i]); + } + } + } + else + { + // Another easy case - we don't want any renderable tile entities associated with this chunk. Flag all to be removed. + AUTO_VAR(it, globalRenderableTileEntities->find(key)); + if( it != globalRenderableTileEntities->end() ) + { + for( AUTO_VAR(it2, it->second.begin()); it2 != it->second.end(); it2++ ) + { + (*it2)->setRenderRemoveStage(TileEntity::e_RenderRemoveStageFlaggedAtChunk); + } + } + } + LeaveCriticalSection(globalRenderableTileEntities_cs); + PIXEndNamedEvent(); +#else + // Find the removed ones: + + // 4J - original code for this section: + /* + Set newTileEntities = new HashSet(); + newTileEntities.addAll(renderableTileEntities); + newTileEntities.removeAll(oldTileEntities); + globalRenderableTileEntities.addAll(newTileEntities); + + oldTileEntities.removeAll(renderableTileEntities); + globalRenderableTileEntities.removeAll(oldTileEntities); + */ + + + unordered_set > newTileEntities(renderableTileEntities.begin(),renderableTileEntities.end()); + + AUTO_VAR(endIt, oldTileEntities.end()); + for( unordered_set >::iterator it = oldTileEntities.begin(); it != endIt; it++ ) + { + newTileEntities.erase(*it); + } + + // 4J - newTileEntities is now renderableTileEntities with any old ones from oldTileEntitesRemoved (so just new things added) + + EnterCriticalSection(globalRenderableTileEntities_cs); + endIt = newTileEntities.end(); + for( unordered_set >::iterator it = newTileEntities.begin(); it != endIt; it++ ) + { + globalRenderableTileEntities->push_back(*it); + } + + // 4J - All these new things added to globalRenderableTileEntities + + AUTO_VAR(endItRTE, renderableTileEntities.end()); + for( vector >::iterator it = renderableTileEntities.begin(); it != endItRTE; it++ ) + { + oldTileEntities.erase(*it); + } + // 4J - oldTileEntities is now the removed items + vector >::iterator it = globalRenderableTileEntities->begin(); + while( it != globalRenderableTileEntities->end() ) + { + if( oldTileEntities.find(*it) != oldTileEntities.end() ) + { + it = globalRenderableTileEntities->erase(it); + } + else + { + ++it; + } + } + + LeaveCriticalSection(globalRenderableTileEntities_cs); +#endif + + // 4J - These removed items are now also removed from globalRenderableTileEntities + + if( LevelChunk::touchedSky ) + { + levelRenderer->clearGlobalChunkFlag(x, y, z, level, LevelRenderer::CHUNK_FLAG_NOTSKYLIT); + } + else + { + levelRenderer->setGlobalChunkFlag(x, y, z, level, LevelRenderer::CHUNK_FLAG_NOTSKYLIT); + } + levelRenderer->setGlobalChunkFlag(x, y, z, level, LevelRenderer::CHUNK_FLAG_COMPILED); + PIXEndNamedEvent(); + return; + +} + + +#ifdef __PS3__ +ChunkRebuildData g_rebuildDataIn __attribute__((__aligned__(16))); +ChunkRebuildData g_rebuildDataOut __attribute__((__aligned__(16))); +TileCompressData_SPU g_tileCompressDataIn __attribute__((__aligned__(16))); +unsigned char* g_tileCompressDataOut = (unsigned char*)&g_rebuildDataIn.m_tileIds; + + +void RunSPURebuild() +{ + + static C4JSpursJobQueue::Port p("C4JSpursJob_ChunkUpdate"); + C4JSpursJob_CompressedTile tileJob(&g_tileCompressDataIn,g_tileCompressDataOut); + C4JSpursJob_ChunkUpdate chunkJob(&g_rebuildDataIn, &g_rebuildDataOut); + + if(g_rebuildDataIn.m_currentLayer == 0) // only need to create the tiles on the first layer + { + p.submitJob(&tileJob); + p.submitSync(); + } + + p.submitJob(&chunkJob); + p.waitForCompletion(); + + assert(g_rebuildDataIn.m_x0 == g_rebuildDataOut.m_x0); +} + +void Chunk::rebuild_SPU() +{ + +// if (!dirty) return; + Chunk::t = Tesselator::getInstance(); // 4J - added - static initialiser being set at the wrong time + updates++; + + int x0 = x; + int y0 = y; + int z0 = z; + int x1 = x + SIZE; + int y1 = y + SIZE; + int z1 = z + SIZE; + + LevelChunk::touchedSky = false; + +// unordered_set > oldTileEntities(renderableTileEntities.begin(),renderableTileEntities.end()); // 4J removed this & next line +// renderableTileEntities.clear(); + + vector > renderableTileEntities; // 4J - added + +// List newTileEntities = new ArrayList(); +// newTileEntities.clear(); +// renderableTileEntities.clear(); + + int r = 1; + + 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; + lists += levelRenderer->chunkLists; + + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // 4J - optimisation begins. + + // Get the data for the level chunk that this render chunk is it (level chunk is 16 x 16 x 128, + // render chunk is 16 x 16 x 16. We wouldn't have to actually get all of it if the data was ordered differently, but currently + // it is ordered by x then z then y so just getting a small range of y out of it would involve getting the whole thing into + // the cache anyway. + ChunkRebuildData* pOutData = NULL; + g_rebuildDataIn.buildForChunk(®ion, level, x0, y0, z0); + + Tesselator::Bounds bounds; + { + // this was the old default clip bounds for the chunk, set in Chunk::setPos. + float g = 6.0f; + bounds.boundingBox[0] = -g; + bounds.boundingBox[1] = -g; + bounds.boundingBox[2] = -g; + bounds.boundingBox[3] = SIZE+g; + bounds.boundingBox[4] = SIZE+g; + bounds.boundingBox[5] = SIZE+g; + } + + for (int currentLayer = 0; currentLayer < 2; currentLayer++) + { + bool rendered = false; + + { + glNewList(lists + currentLayer, GL_COMPILE); + MemSect(0); + glPushMatrix(); + glDepthMask(true); // 4J added + t->useCompactVertices(true); // 4J added + translateToPos(); + float ss = 1.000001f; + // 4J - have removed this scale as I don't think we should need it, and have now optimised the vertex + // shader so it doesn't do anything other than translate with this matrix anyway + #if 0 + glTranslatef(-zs / 2.0f, -ys / 2.0f, -zs / 2.0f); + glScalef(ss, ss, ss); + glTranslatef(zs / 2.0f, ys / 2.0f, zs / 2.0f); + #endif + t->begin(); + t->offset((float)(-this->x), (float)(-this->y), (float)(-this->z)); + } + + g_rebuildDataIn.copyFromTesselator(); + intArray_SPU tesselatorArray((unsigned int*)g_rebuildDataIn.m_tesselator.m_PPUArray); + g_rebuildDataIn.m_tesselator._array = &tesselatorArray; + g_rebuildDataIn.m_currentLayer = currentLayer; + g_tileCompressDataIn.setForChunk(®ion, x0, y0, z0); + RunSPURebuild(); + g_rebuildDataOut.storeInTesselator(); + pOutData = &g_rebuildDataOut; + + 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 + for (int z = z0; z < z1; z++) + { + for (int x = x0; x < x1; x++) + { + for (int y = y0; y < y1; y++) + { + // 4J - get tile from those copied into our local array in earlier optimisation + unsigned char tileId = pOutData->getTile(x,y,z); + if (tileId > 0) + { + if (currentLayer == 0 && Tile::tiles[tileId]->isEntityTile()) + { + shared_ptr et = region.getTileEntity(x, y, z); + if (TileEntityRenderDispatcher::instance->hasRenderer(et)) + { + renderableTileEntities.push_back(et); + } + } + int flags = pOutData->getFlags(x,y,z); + if(flags & ChunkRebuildData::e_flag_SPURenderCodeMissing) + { + + Tile *tile = Tile::tiles[tileId]; + int renderLayer = tile->getRenderLayer(); + + if (renderLayer != currentLayer) + { + // renderNextLayer = true; + } + else if (renderLayer == currentLayer) + { + //if(currentLayer == 0) + // numRenderedLayer0++; + rendered |= tileRenderer.tesselateInWorld(tile, x, y, z); + } + } + } + } + } + } + + + { + t->end(); + bounds.addBounds(t->bounds); + glPopMatrix(); + glEndList(); + t->useCompactVertices(false); // 4J added + t->offset(0, 0, 0); + } + if (rendered) + { + levelRenderer->clearGlobalChunkFlag(this->x, this->y, this->z, level, LevelRenderer::CHUNK_FLAG_EMPTY0, currentLayer); + } + else + { + // 4J - added - clear any renderer data associated with this unused list + levelRenderer->setGlobalChunkFlag(this->x, this->y, this->z, level, LevelRenderer::CHUNK_FLAG_EMPTY0, currentLayer); + RenderManager.CBuffClear(lists + currentLayer); + } + + } + + if( bb ) + { + bb->set(bounds.boundingBox[0], bounds.boundingBox[1], bounds.boundingBox[2], + bounds.boundingBox[3], bounds.boundingBox[4], bounds.boundingBox[5]); + } + + + if(pOutData->m_flags & ChunkRebuildData::e_flag_TouchedSky) + LevelChunk::touchedSky = true; + + + // 4J - have rewritten the way that tile entities are stored globally to make it work more easily with split screen. Chunks are now + // stored globally in the levelrenderer, in a hashmap with a special key made up from the dimension and chunk position (using same index + // as is used for global flags) +#if 1 + int key = levelRenderer->getGlobalIndexForChunk(this->x,this->y,this->z,level); + EnterCriticalSection(globalRenderableTileEntities_cs); + if( renderableTileEntities.size() ) + { + AUTO_VAR(it, globalRenderableTileEntities->find(key)); + if( it != globalRenderableTileEntities->end() ) + { + // We've got some renderable tile entities that we want associated with this chunk, and an existing list of things that used to be. + // We need to flag any that we don't need any more to be removed, keep those that we do, and add any new ones + + // First pass - flag everything already existing to be removed + for( AUTO_VAR(it2, it->second.begin()); it2 != it->second.end(); it2++ ) + { + (*it2)->setRenderRemoveStage(TileEntity::e_RenderRemoveStageFlaggedAtChunk); + } + + // Now go through the current list. If these are already in the list, then unflag the remove flag. If they aren't, then add + for( int i = 0; i < renderableTileEntities.size(); i++ ) + { + AUTO_VAR(it2, find( it->second.begin(), it->second.end(), renderableTileEntities[i] )); + if( it2 == it->second.end() ) + { + (*globalRenderableTileEntities)[key].push_back(renderableTileEntities[i]); + } + else + { + (*it2)->setRenderRemoveStage(TileEntity::e_RenderRemoveStageKeep); + } + } + } + else + { + // Easy case - nothing already existing for this chunk. Add them all in. + for( int i = 0; i < renderableTileEntities.size(); i++ ) + { + (*globalRenderableTileEntities)[key].push_back(renderableTileEntities[i]); + } + } + } + else + { + // Another easy case - we don't want any renderable tile entities associated with this chunk. Flag all to be removed. + AUTO_VAR(it, globalRenderableTileEntities->find(key)); + if( it != globalRenderableTileEntities->end() ) + { + for( AUTO_VAR(it2, it->second.begin()); it2 != it->second.end(); it2++ ) + { + (*it2)->setRenderRemoveStage(TileEntity::e_RenderRemoveStageFlaggedAtChunk); + } + } + } + LeaveCriticalSection(globalRenderableTileEntities_cs); +#else + // Find the removed ones: + + // 4J - original code for this section: + /* + Set newTileEntities = new HashSet(); + newTileEntities.addAll(renderableTileEntities); + newTileEntities.removeAll(oldTileEntities); + globalRenderableTileEntities.addAll(newTileEntities); + + oldTileEntities.removeAll(renderableTileEntities); + globalRenderableTileEntities.removeAll(oldTileEntities); + */ + + + unordered_set > newTileEntities(renderableTileEntities.begin(),renderableTileEntities.end()); + + AUTO_VAR(endIt, oldTileEntities.end()); + for( unordered_set >::iterator it = oldTileEntities.begin(); it != endIt; it++ ) + { + newTileEntities.erase(*it); + } + + // 4J - newTileEntities is now renderableTileEntities with any old ones from oldTileEntitesRemoved (so just new things added) + + EnterCriticalSection(globalRenderableTileEntities_cs); + endIt = newTileEntities.end(); + for( unordered_set >::iterator it = newTileEntities.begin(); it != endIt; it++ ) + { + globalRenderableTileEntities.push_back(*it); + } + + // 4J - All these new things added to globalRenderableTileEntities + + AUTO_VAR(endItRTE, renderableTileEntities.end()); + for( vector >::iterator it = renderableTileEntities.begin(); it != endItRTE; it++ ) + { + oldTileEntities.erase(*it); + } + // 4J - oldTileEntities is now the removed items + vector >::iterator it = globalRenderableTileEntities->begin(); + while( it != globalRenderableTileEntities->end() ) + { + if( oldTileEntities.find(*it) != oldTileEntities.end() ) + { + it = globalRenderableTileEntities->erase(it); + } + else + { + ++it; + } + } + + LeaveCriticalSection(globalRenderableTileEntities_cs); +#endif + + // 4J - These removed items are now also removed from globalRenderableTileEntities + + if( LevelChunk::touchedSky ) + { + levelRenderer->clearGlobalChunkFlag(x, y, z, level, LevelRenderer::CHUNK_FLAG_NOTSKYLIT); + } + else + { + levelRenderer->setGlobalChunkFlag(x, y, z, level, LevelRenderer::CHUNK_FLAG_NOTSKYLIT); + } + levelRenderer->setGlobalChunkFlag(x, y, z, level, LevelRenderer::CHUNK_FLAG_COMPILED); + return; + +} +#endif // _PS3_ + + +float Chunk::distanceToSqr(shared_ptr player) const +{ + float xd = (float) (player->x - xm); + float yd = (float) (player->y - ym); + float zd = (float) (player->z - zm); + return xd * xd + yd * yd + zd * zd; +} + +float Chunk::squishedDistanceToSqr(shared_ptr player) +{ + float xd = (float) (player->x - xm); + float yd = (float) (player->y - ym) * 2; + float zd = (float) (player->z - zm); + return xd * xd + yd * yd + zd * zd; +} + +void Chunk::reset() +{ + if( assigned ) + { + EnterCriticalSection(&levelRenderer->m_csDirtyChunks); + unsigned char refCount = levelRenderer->decGlobalChunkRefCount(x, y, z, level); + assigned = false; +// printf("\t\t [dec] refcount %d at %d, %d, %d\n",refCount,x,y,z); + if( refCount == 0 ) + { + int lists = levelRenderer->getGlobalIndexForChunk(x, y, z, level) * 2; + if(lists >= 0) + { + lists += levelRenderer->chunkLists; + for (int i = 0; i < 2; i++) + { + // 4J - added - clear any renderer data associated with this unused list + RenderManager.CBuffClear(lists + i); + } + levelRenderer->setGlobalChunkFlags(x, y, z, level, 0); + } + } + LeaveCriticalSection(&levelRenderer->m_csDirtyChunks); + } + + clipChunk->visible = false; +} + +void Chunk::_delete() +{ + reset(); + level = NULL; +} + +int Chunk::getList(int layer) +{ + if (!clipChunk->visible) return -1; + + int lists = levelRenderer->getGlobalIndexForChunk(x, y, z,level) * 2; + lists += levelRenderer->chunkLists; + + bool empty = levelRenderer->getGlobalChunkFlag(x, y, z, level, LevelRenderer::CHUNK_FLAG_EMPTY0, layer); + if (!empty) return lists + layer; + return -1; +} + +void Chunk::cull(Culler *culler) +{ + clipChunk->visible = culler->isVisible(bb); +} + +void Chunk::renderBB() +{ +// glCallList(lists + 2); // 4J - removed - TODO put back in +} + +bool Chunk::isEmpty() +{ + if (!levelRenderer->getGlobalChunkFlag(x, y, z, level, LevelRenderer::CHUNK_FLAG_COMPILED)) return false; + return levelRenderer->getGlobalChunkFlag(x, y, z, level, LevelRenderer::CHUNK_FLAG_EMPTYBOTH); +} + +void Chunk::setDirty() +{ + // 4J - not used, but if this starts being used again then we'll need to investigate how best to handle it. + __debugbreak(); + levelRenderer->setGlobalChunkFlag(x, y, z, level, LevelRenderer::CHUNK_FLAG_DIRTY); +} + +void Chunk::clearDirty() +{ + levelRenderer->clearGlobalChunkFlag(x, y, z, level, LevelRenderer::CHUNK_FLAG_DIRTY); +#ifdef _CRITICAL_CHUNKS + levelRenderer->clearGlobalChunkFlag(x, y, z, level, LevelRenderer::CHUNK_FLAG_CRITICAL); +#endif +} + +Chunk::~Chunk() +{ + delete bb; +} + +bool Chunk::emptyFlagSet(int layer) +{ + return levelRenderer->getGlobalChunkFlag(x, y, z, level, LevelRenderer::CHUNK_FLAG_EMPTY0, layer); +} diff --git a/Minecraft.Client/Chunk.h b/Minecraft.Client/Chunk.h new file mode 100644 index 00000000..f7947156 --- /dev/null +++ b/Minecraft.Client/Chunk.h @@ -0,0 +1,87 @@ +#pragma once +#include "AllowAllCuller.h" +#include "Tesselator.h" +#include "..\Minecraft.World\ArrayWithLength.h" +#include "LevelRenderer.h" + +class Level; +class TileEntity; +class Entity; +using namespace std; + +class ClipChunk +{ +public: + Chunk *chunk; + int globalIdx; + bool visible; + float aabb[6]; + int xm, ym, zm; +}; + +class Chunk +{ +private: + static const int XZSIZE = LevelRenderer::CHUNK_XZSIZE; + static const int SIZE = LevelRenderer::CHUNK_SIZE; + +public: + Level *level; + static LevelRenderer *levelRenderer; +private: +#ifndef _LARGE_WORLDS + static Tesselator *t; +#else + static DWORD tlsIdx; +public: + static void CreateNewThreadStorage(); + static void ReleaseThreadStorage(); + static unsigned char *GetTileIdsStorage(); +#endif + +public: + static int updates; + + int x, y, z; + int xRender, yRender, zRender; + int xRenderOffs, yRenderOffs, zRenderOffs; + + int xm, ym, zm; + AABB *bb; + ClipChunk *clipChunk; + + int id; +//public: +// vector > renderableTileEntities; // 4J - removed + +private: + LevelRenderer::rteMap *globalRenderableTileEntities; + CRITICAL_SECTION *globalRenderableTileEntities_cs; + bool assigned; +public: + Chunk(Level *level, LevelRenderer::rteMap &globalRenderableTileEntities, CRITICAL_SECTION &globalRenderableTileEntities_cs, int x, int y, int z, ClipChunk *clipChunk); + Chunk(); + + void setPos(int x, int y, int z); +private: + void translateToPos(); +public: + void makeCopyForRebuild(Chunk *source); + void rebuild(); +#ifdef __PS3__ + void rebuild_SPU(); +#endif // __PS3__ + float distanceToSqr(shared_ptr player) const; + float squishedDistanceToSqr(shared_ptr player); + void reset(); + void _delete(); + + int getList(int layer); + void cull(Culler *culler); + void renderBB() ; + bool isEmpty(); + void setDirty(); + void clearDirty(); // 4J added + bool emptyFlagSet(int layer); + ~Chunk(); +}; diff --git a/Minecraft.Client/ClassDiagram.cd b/Minecraft.Client/ClassDiagram.cd new file mode 100644 index 00000000..7b894197 --- /dev/null +++ b/Minecraft.Client/ClassDiagram.cd @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Minecraft.Client/ClientConnection.cpp b/Minecraft.Client/ClientConnection.cpp new file mode 100644 index 00000000..5d7c03b5 --- /dev/null +++ b/Minecraft.Client/ClientConnection.cpp @@ -0,0 +1,3886 @@ +#include "stdafx.h" +#include "ClientConnection.h" +#include "MultiPlayerLevel.h" +#include "MultiPlayerLocalPlayer.h" +#include "StatsCounter.h" +#include "ReceivingLevelScreen.h" +#include "RemotePlayer.h" +#include "DisconnectedScreen.h" +#include "TakeAnimationParticle.h" +#include "CritParticle.h" +#include "User.h" +#include "..\Minecraft.World\net.minecraft.world.level.storage.h" +#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" +#include "..\Minecraft.World\net.minecraft.world.entity.global.h" +#include "..\Minecraft.World\net.minecraft.world.entity.boss.enderdragon.h" +#include "..\Minecraft.World\net.minecraft.world.entity.monster.h" +#include "..\Minecraft.World\net.minecraft.world.level.tile.entity.h" +#include "..\Minecraft.World\net.minecraft.world.item.h" +#include "..\Minecraft.World\net.minecraft.world.item.trading.h" +#include "..\Minecraft.World\net.minecraft.world.level.tile.h" +#include "..\Minecraft.World\net.minecraft.world.inventory.h" +#include "..\Minecraft.World\net.minecraft.world.h" +#include "..\Minecraft.World\net.minecraft.world.level.saveddata.h" +#include "..\Minecraft.World\net.minecraft.world.level.dimension.h" +#include "..\Minecraft.World\net.minecraft.world.effect.h" +#include "..\Minecraft.World\net.minecraft.world.food.h" +#include "..\Minecraft.World\SharedConstants.h" +#include "..\Minecraft.World\AABB.h" +#include "..\Minecraft.World\Pos.h" +#include "..\Minecraft.World\Socket.h" +#include "Minecraft.h" +#include "ProgressRenderer.h" +#include "LevelRenderer.h" +#include "Options.h" +#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" +#else +#include "Common\UI\UI.h" +#endif +#ifdef __PS3__ +#include "PS3/Network/SonyVoiceChat.h" +#endif +#include "DLCTexturePack.h" + +#ifdef _DURANGO +#include "..\Minecraft.World\DurangoStats.h" +#include "..\Minecraft.World\GenericStats.h" +#endif + +ClientConnection::ClientConnection(Minecraft *minecraft, const wstring& ip, int port) +{ + // 4J Stu - No longer used as we use the socket version below. + assert(FALSE); +#if 0 + // 4J - added initiliasers + random = new Random(); + done = false; + level = false; + started = false; + + this->minecraft = minecraft; + + Socket *socket; + if( gNetworkManager.IsHost() ) + { + socket = new Socket(); // 4J - Local connection + } + else + { + socket = new Socket(ip); // 4J - Connection over xrnm - hardcoded IP at present + } + createdOk = socket->createdOk; + if( createdOk ) + { + connection = new Connection(socket, L"Client", this); + } + else + { + connection = NULL; + delete socket; + } +#endif +} + +ClientConnection::ClientConnection(Minecraft *minecraft, Socket *socket, int iUserIndex /*= -1*/) +{ + // 4J - added initiliasers + random = new Random(); + done = false; + level = NULL; + started = false; + savedDataStorage = new SavedDataStorage(NULL); + maxPlayers = 20; + + this->minecraft = minecraft; + + if( iUserIndex < 0 ) + { + m_userIndex = ProfileManager.GetPrimaryPad(); + } + else + { + m_userIndex = iUserIndex; + } + + if( socket == NULL ) + { + socket = new Socket(); // 4J - Local connection + } + + createdOk = socket->createdOk; + if( createdOk ) + { + connection = new Connection(socket, L"Client", this); + } + else + { + connection = NULL; + // TODO 4J Stu - This will cause issues since the session player owns the socket + //delete socket; + } + + deferredEntityLinkPackets = vector(); +} + +ClientConnection::~ClientConnection() +{ + delete connection; + delete random; + delete savedDataStorage; +} + +void ClientConnection::tick() +{ + if (!done) connection->tick(); + connection->flush(); +} + +INetworkPlayer *ClientConnection::getNetworkPlayer() +{ + if( connection != NULL && connection->getSocket() != NULL) return connection->getSocket()->getPlayer(); + else return NULL; +} + +void ClientConnection::handleLogin(shared_ptr packet) +{ + if (done) return; + + PlayerUID OnlineXuid; + ProfileManager.GetXUID(m_userIndex,&OnlineXuid,true); // online xuid + MOJANG_DATA *pMojangData = NULL; + + if(!g_NetworkManager.IsLocalGame()) + { + pMojangData=app.GetMojangDataForXuid(OnlineXuid); + } + + if(!g_NetworkManager.IsHost() ) + { + Minecraft::GetInstance()->progressRenderer->progressStagePercentage((eCCLoginReceived * 100)/ (eCCConnected)); + } + + // 4J-PB - load the local player skin (from the global title user storage area) if there is one + // the primary player on the host machine won't have a qnet player from the socket + INetworkPlayer *networkPlayer = connection->getSocket()->getPlayer(); + int iUserID=-1; + + if( m_userIndex == ProfileManager.GetPrimaryPad() ) + { + iUserID=m_userIndex; + + TelemetryManager->SetMultiplayerInstanceId(packet->m_multiplayerInstanceId); + } + else + { + if(!networkPlayer->IsGuest() && networkPlayer->IsLocal()) + { + // find the pad number of this local player + for(int i=0;iwchSkin[0]!=0L) + { + wstring wstr=pMojangData->wchSkin; + // check the file is not already in + bRes=app.IsFileInMemoryTextures(wstr); + if(!bRes) + { +#ifdef _XBOX + C4JStorage::ETMSStatus eTMSStatus; + eTMSStatus=StorageManager.ReadTMSFile(iUserID,C4JStorage::eGlobalStorage_Title,C4JStorage::eTMS_FileType_Graphic,pMojangData->wchSkin,&pBuffer, &dwSize); + + bRes=(eTMSStatus==C4JStorage::ETMSStatus_Idle); +#endif + } + + if(bRes) + { + app.AddMemoryTextureFile(wstr,pBuffer,dwSize); + } + } + + // a cloak? + if(pMojangData->wchCape[0]!=0L) + { + wstring wstr=pMojangData->wchCape; + // check the file is not already in + bRes=app.IsFileInMemoryTextures(wstr); + if(!bRes) + { +#ifdef _XBOX + C4JStorage::ETMSStatus eTMSStatus; + eTMSStatus=StorageManager.ReadTMSFile(iUserID,C4JStorage::eGlobalStorage_Title,C4JStorage::eTMS_FileType_Graphic,pMojangData->wchCape,&pBuffer, &dwSize); + bRes=(eTMSStatus==C4JStorage::ETMSStatus_Idle); +#endif + } + + if(bRes) + { + app.AddMemoryTextureFile(wstr,pBuffer,dwSize); + } + } + } + + // If we're online, read the banned game list + app.ReadBannedList(iUserID); + // mark the level as not checked against banned levels - it'll be checked once the level starts + app.SetBanListCheck(iUserID,false); + } + + if( m_userIndex == ProfileManager.GetPrimaryPad() ) + { + if( app.GetTutorialMode() ) + { + minecraft->gameMode = new FullTutorialMode(ProfileManager.GetPrimaryPad(), minecraft, this); + } + // check if we're in the trial version + else if(ProfileManager.IsFullVersion()==false) + { + minecraft->gameMode = new TrialMode(ProfileManager.GetPrimaryPad(), minecraft, this); + } + else + { + MemSect(13); + minecraft->gameMode = new ConsoleGameMode(ProfileManager.GetPrimaryPad(), minecraft, this); + MemSect(0); + } + + + Level *dimensionLevel = minecraft->getLevel( packet->dimension ); + if( dimensionLevel == NULL ) + { + level = new MultiPlayerLevel(this, new LevelSettings(packet->seed, GameType::byId(packet->gameType), false, false, packet->m_newSeaLevel, packet->m_pLevelType, packet->m_xzSize, packet->m_hellScale), packet->dimension, packet->difficulty); + + // 4J Stu - We want to share the SavedDataStorage between levels + int otherDimensionId = packet->dimension == 0 ? -1 : 0; + Level *activeLevel = minecraft->getLevel(otherDimensionId); + if( activeLevel != NULL ) + { + // Don't need to delete it here as it belongs to a client connection while will delete it when it's done + //if( level->savedDataStorage != NULL ) delete level->savedDataStorage; + level->savedDataStorage = activeLevel->savedDataStorage; + } + + app.DebugPrintf("ClientConnection - DIFFICULTY --- %d\n",packet->difficulty); + level->difficulty = packet->difficulty; // 4J Added + level->isClientSide = true; + minecraft->setLevel(level); + } + + minecraft->player->setPlayerIndex( packet->m_playerIndex ); + minecraft->player->setCustomSkin( app.GetPlayerSkinId(m_userIndex) ); + minecraft->player->setCustomCape( app.GetPlayerCapeId(m_userIndex) ); + + + minecraft->createPrimaryLocalPlayer(ProfileManager.GetPrimaryPad()); + + minecraft->player->dimension = packet->dimension; + //minecraft->setScreen(new ReceivingLevelScreen(this)); + minecraft->player->entityId = packet->clientVersion; + + BYTE networkSmallId = getSocket()->getSmallId(); + app.UpdatePlayerInfo(networkSmallId, packet->m_playerIndex, packet->m_uiGamePrivileges); + minecraft->player->setPlayerGamePrivilege(Player::ePlayerGamePrivilege_All, packet->m_uiGamePrivileges); + + // Assume all privileges are on, so that the first message we see only indicates things that have been turned off + unsigned int startingPrivileges = 0; + Player::enableAllPlayerPrivileges(startingPrivileges,true); + + if(networkPlayer->IsHost()) + { + Player::setPlayerGamePrivilege(startingPrivileges, Player::ePlayerGamePrivilege_HOST,1); + } + + displayPrivilegeChanges(minecraft->player,startingPrivileges); + + // update the debugoptions + app.SetGameSettingsDebugMask(ProfileManager.GetPrimaryPad(),app.GetGameSettingsDebugMask(-1,true)); + } + else + { + // 4J-PB - this isn't the level we want + //level = (MultiPlayerLevel *)minecraft->level; + level = (MultiPlayerLevel *)minecraft->getLevel( packet->dimension ); + shared_ptr player; + + if(level==NULL) + { + int otherDimensionId = packet->dimension == 0 ? -1 : 0; + MultiPlayerLevel *activeLevel = minecraft->getLevel(otherDimensionId); + + if(activeLevel == NULL) + { + otherDimensionId = packet->dimension == 0 ? 1 : (packet->dimension == -1 ? 1 : -1); + activeLevel = minecraft->getLevel(otherDimensionId); + } + + MultiPlayerLevel *dimensionLevel = new MultiPlayerLevel(this, new LevelSettings(packet->seed, GameType::byId(packet->gameType), false, false, packet->m_newSeaLevel, packet->m_pLevelType, packet->m_xzSize, packet->m_hellScale), packet->dimension, packet->difficulty); + + dimensionLevel->savedDataStorage = activeLevel->savedDataStorage; + + dimensionLevel->difficulty = packet->difficulty; // 4J Added + dimensionLevel->isClientSide = true; + level = dimensionLevel; + // 4J Stu - At time of writing ProfileManager.GetGamertag() does not always return the correct name, + // if sign-ins are turned off while the player signed in. Using the qnetPlayer instead. + // need to have a level before create extra local player + MultiPlayerLevel *levelpassedin=(MultiPlayerLevel *)level; + player = minecraft->createExtraLocalPlayer(m_userIndex, networkPlayer->GetOnlineName(), m_userIndex, packet->dimension, this,levelpassedin); + + // need to have a player before the setlevel + shared_ptr lastPlayer = minecraft->player; + minecraft->player = minecraft->localplayers[m_userIndex]; + minecraft->setLevel(level); + minecraft->player = lastPlayer; + } + else + { + player = minecraft->createExtraLocalPlayer(m_userIndex, networkPlayer->GetOnlineName(), m_userIndex, packet->dimension, this); + } + + + //level->addClientConnection( this ); + player->dimension = packet->dimension; + player->entityId = packet->clientVersion; + + player->setPlayerIndex( packet->m_playerIndex ); + player->setCustomSkin( app.GetPlayerSkinId(m_userIndex) ); + player->setCustomCape( app.GetPlayerCapeId(m_userIndex) ); + + + BYTE networkSmallId = getSocket()->getSmallId(); + app.UpdatePlayerInfo(networkSmallId, packet->m_playerIndex, packet->m_uiGamePrivileges); + player->setPlayerGamePrivilege(Player::ePlayerGamePrivilege_All, packet->m_uiGamePrivileges); + + // Assume all privileges are on, so that the first message we see only indicates things that have been turned off + unsigned int startingPrivileges = 0; + Player::enableAllPlayerPrivileges(startingPrivileges,true); + + displayPrivilegeChanges(minecraft->localplayers[m_userIndex],startingPrivileges); + } + + maxPlayers = packet->maxPlayers; + + // need to have a player before the setLocalCreativeMode + shared_ptr lastPlayer = minecraft->player; + minecraft->player = minecraft->localplayers[m_userIndex]; + ((MultiPlayerGameMode *)minecraft->localgameModes[m_userIndex])->setLocalMode(GameType::byId(packet->gameType)); + minecraft->player = lastPlayer; + + // make sure the UI offsets for this player are set correctly + if(iUserID!=-1) + { + ui.UpdateSelectedItemPos(iUserID); + } + + TelemetryManager->RecordLevelStart(m_userIndex, eSen_FriendOrMatch_Playing_With_Invited_Friends, eSen_CompeteOrCoop_Coop_and_Competitive, Minecraft::GetInstance()->getLevel(packet->dimension)->difficulty, app.GetLocalPlayerCount(), g_NetworkManager.GetOnlinePlayerCount()); +} + +void ClientConnection::handleAddEntity(shared_ptr packet) +{ + 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: + e = Minecart::createMinecart(level, x, y, z, packet->data); + break; + case AddEntityPacket::FISH_HOOK: + { + // 4J Stu - Brought forward from 1.4 to be able to drop XP from fishing + shared_ptr owner = getEntity(packet->data); + + // 4J - check all local players to find match + if( owner == NULL ) + { + for( int i = 0; i < XUSER_MAX_COUNT; i++ ) + { + if( minecraft->localplayers[i] ) + { + if( minecraft->localplayers[i]->entityId == packet->data ) + { + + owner = minecraft->localplayers[i]; + break; + } + } + } + } + + 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' + player->fishing = hook; + } + packet->data = 0; + } + break; + case AddEntityPacket::ARROW: + e = shared_ptr( new Arrow(level, x, y, z) ); + break; + case AddEntityPacket::SNOWBALL: + e = shared_ptr( new Snowball(level, x, y, z) ); + break; + 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; + case AddEntityPacket::THROWN_ENDERPEARL: + e = shared_ptr( new ThrownEnderpearl(level, x, y, z) ); + break; + case AddEntityPacket::EYEOFENDERSIGNAL: + e = shared_ptr( new EyeOfEnderSignal(level, x, y, z) ); + break; + case AddEntityPacket::FIREBALL: + 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: + e = shared_ptr( new SmallFireball(level, x, y, z, packet->xa / 8000.0, packet->ya / 8000.0, packet->za / 8000.0) ); + packet->data = 0; + break; + case AddEntityPacket::DRAGON_FIRE_BALL: + e = shared_ptr( new DragonFireball(level, x, y, z, packet->xa / 8000.0, packet->ya / 8000.0, packet->za / 8000.0) ); + packet->data = 0; + break; + case AddEntityPacket::EGG: + e = shared_ptr( new ThrownEgg(level, x, y, z) ); + break; + case AddEntityPacket::THROWN_POTION: + e = shared_ptr( new ThrownPotion(level, x, y, z, packet->data) ); + packet->data = 0; + break; + case AddEntityPacket::THROWN_EXPBOTTLE: + e = shared_ptr( new ThrownExpBottle(level, x, y, z) ); + packet->data = 0; + break; + case AddEntityPacket::BOAT: + e = shared_ptr( new Boat(level, x, y, z) ); + break; + case AddEntityPacket::PRIMED_TNT: + e = shared_ptr( new PrimedTnt(level, x, y, z, nullptr) ); + break; + case AddEntityPacket::ENDER_CRYSTAL: + e = shared_ptr( new EnderCrystal(level, x, y, z) ); + break; + case AddEntityPacket::ITEM: + e = shared_ptr( new ItemEntity(level, x, y, z) ); + break; + case AddEntityPacket::FALLING: + 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) + { + // 4J Stu - Brought forward from 1.4 to be able to drop XP from fishing + shared_ptr owner = getEntity(packet->data); + + // 4J - check all local players to find match + if( owner == NULL ) + { + for( int i = 0; i < XUSER_MAX_COUNT; i++ ) + { + if( minecraft->localplayers[i] ) + { + if( minecraft->localplayers[i]->entityId == packet->data ) + { + + owner = minecraft->localplayers[i]; + break; + } + } + } + } + shared_ptr player = dynamic_pointer_cast(owner); + if (player != NULL) + { + shared_ptr hook = shared_ptr( new FishingHook(level, x, y, z, player) ); + e = hook; + // 4J Stu - Move the player->fishing out of the ctor as we cannot reference 'this' + player->fishing = hook; + } + packet->data = 0; + } + + if (packet->type == AddEntityPacket::ARROW) e = shared_ptr( new Arrow(level, x, y, z) ); + if (packet->type == AddEntityPacket::SNOWBALL) e = shared_ptr( new Snowball(level, x, y, z) ); + if (packet->type == AddEntityPacket::THROWN_ENDERPEARL) e = shared_ptr( new ThrownEnderpearl(level, x, y, z) ); + if (packet->type == AddEntityPacket::EYEOFENDERSIGNAL) e = shared_ptr( new EyeOfEnderSignal(level, x, y, z) ); + if (packet->type == AddEntityPacket::FIREBALL) + { + e = 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::THROWN_POTION) + { + e = shared_ptr( new ThrownPotion(level, x, y, z, packet->data) ); + packet->data = 0; + } + if (packet->type == AddEntityPacket::THROWN_EXPBOTTLE) + { + 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::ENDER_CRYSTAL) e = shared_ptr( new EnderCrystal(level, x, y, z) ); + if (packet->type == AddEntityPacket::FALLING_SAND) e = shared_ptr( new FallingTile(level, x, y, z, Tile::sand->id) ); + if (packet->type == AddEntityPacket::FALLING_GRAVEL) e = shared_ptr( new FallingTile(level, x, y, z, Tile::gravel->id) ); + if (packet->type == AddEntityPacket::FALLING_EGG) e = shared_ptr( new FallingTile(level, x, y, z, Tile::dragonEgg_Id) ); + + */ + + if (e != NULL) + { + 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; + e->yRotp = packet->yRot; + e->xRotp = packet->xRot; + + if (setRot) + { + e->yRot = 0.0f; + e->xRot = 0.0f; + } + + vector > *subEntities = e->getSubEntities(); + if (subEntities != NULL) + { + int offs = packet->id - e->entityId; + //for (int i = 0; i < subEntities.length; i++) + for(AUTO_VAR(it, subEntities->begin()); it != subEntities->end(); ++it) + { + (*it)->entityId += offs; + //subEntities[i].entityId += offs; + //System.out.println(subEntities[i].entityId); + } + } + + if (packet->type == AddEntityPacket::LEASH_KNOT) + { + // 4J: "Move" leash knot to it's current position, this sets old position (like frame, leash has adjusted position) + e->absMoveTo(e->x, e->y, e->z, yRot, xRot); + } + else if(packet->type == AddEntityPacket::ITEM_FRAME) + { + // Not doing this move for frame, as the ctor for these objects does some adjustments on the position based on direction to move the object out slightly from what it is attached to, and this just overwrites it + } + else + { + // 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->type == AddEntityPacket::ARROW) + { + shared_ptr owner = getEntity(packet->data); + + // 4J - check all local players to find match + if( owner == NULL ) + { + for( int i = 0; i < XUSER_MAX_COUNT; i++ ) + { + if( minecraft->localplayers[i] ) + { + if( minecraft->localplayers[i]->entityId == packet->data ) + { + owner = minecraft->localplayers[i]; + break; + } + } + } + } + + if ( owner != NULL && owner->instanceof(eTYPE_LIVINGENTITY) ) + { + dynamic_pointer_cast(e)->owner = dynamic_pointer_cast(owner); + } + } + + 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) +{ + shared_ptr e = shared_ptr( new ExperienceOrb(level, packet->x / 32.0, packet->y / 32.0, packet->z / 32.0, packet->value) ); + e->xp = packet->x; + e->yp = packet->y; + e->zp = packet->z; + e->yRot = 0; + e->xRot = 0; + e->entityId = packet->id; + level->putEntity(packet->id, e); +} + +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) + { + 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); +} + +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); +} + +void ClientConnection::handleSetEntityData(shared_ptr packet) +{ + shared_ptr e = getEntity(packet->id); + if (e != NULL && packet->getUnpackedData() != NULL) + { + e->getEntityData()->assignValues(packet->getUnpackedData()); + } +} + +void ClientConnection::handleAddPlayer(shared_ptr packet) +{ + // Some remote players could actually be local players that are already added + for(unsigned int idx = 0; idx < XUSER_MAX_COUNT; ++idx) + { + // need to use the XUID here + PlayerUID playerXUIDOnline = INVALID_XUID, playerXUIDOffline = INVALID_XUID; + ProfileManager.GetXUID(idx,&playerXUIDOnline,true); + ProfileManager.GetXUID(idx,&playerXUIDOffline,false); + if( (playerXUIDOnline != INVALID_XUID && ProfileManager.AreXUIDSEqual(playerXUIDOnline,packet->xuid) ) || + (playerXUIDOffline != INVALID_XUID && ProfileManager.AreXUIDSEqual(playerXUIDOffline,packet->xuid) ) ) + { + app.DebugPrintf("AddPlayerPacket received with XUID of local player\n"); + return; + } + } + + 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; + player->setXuid(packet->xuid); + +#ifdef _DURANGO + // On Durango request player display name from network manager + INetworkPlayer *networkPlayer = g_NetworkManager.GetPlayerByXuid(player->getXuid()); + 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->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) + { + 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->setPlayerIndex( packet->m_playerIndex ); + player->setCustomSkin( packet->m_skinId ); + player->setCustomCape( packet->m_capeId ); + player->setPlayerGamePrivilege(Player::ePlayerGamePrivilege_All, packet->m_uiGamePrivileges); + + if(!player->customTextureUrl.empty() && player->customTextureUrl.substr(0,3).compare(L"def") != 0 && !app.IsFileInMemoryTextures(player->customTextureUrl)) + { + if( minecraft->addPendingClientTextureRequest(player->customTextureUrl) ) + { + app.DebugPrintf("Client sending TextureAndGeometryPacket to get custom skin %ls for player %ls\n",player->customTextureUrl.c_str(), player->name.c_str()); + + send(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); + } + + app.DebugPrintf("Custom skin for player %ls is %ls\n",player->name.c_str(),player->customTextureUrl.c_str()); + + if(!player->customTextureUrl2.empty() && player->customTextureUrl2.substr(0,3).compare(L"def") != 0 && !app.IsFileInMemoryTextures(player->customTextureUrl2)) + { + if( minecraft->addPendingClientTextureRequest(player->customTextureUrl2) ) + { + app.DebugPrintf("Client sending texture packet to get custom cape %ls for player %ls\n",player->customTextureUrl2.c_str(), player->name.c_str()); + send(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); + } + + app.DebugPrintf("Custom cape for player %ls is %ls\n",player->name.c_str(),player->customTextureUrl2.c_str()); + + level->putEntity(packet->id, player); + + vector > *unpackedData = packet->getUnpackedData(); + if (unpackedData != NULL) + { + player->getEntityData()->assignValues(unpackedData); + } + +} + +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; + // 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; + 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); +} + +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; + // 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; + // 4J - have changed rotation to be relative here too + e->yRotp += packet->yRot; + e->xRotp += packet->xRot; + float yRot = ( e->yRotp * 360 ) / 256.0f; + 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); +} + +void ClientConnection::handleRotateMob(shared_ptr packet) +{ + shared_ptr e = getEntity(packet->id); + if (e == NULL) return; + float yHeadRot = packet->yHeadRot * 360 / 256.f; + e->setYHeadRot(yHeadRot); +} + +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; + // 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; + // 4J - have changed rotation to be relative here too + e->yRotp += packet->yRot; + e->xRotp += packet->xRot; + float yRot = ( e->yRotp * 360 ) / 256.0f; + 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); +} + +void ClientConnection::handleRemoveEntity(shared_ptr packet) +{ + for (int i = 0; i < packet->ids.length; i++) + { + level->removeEntity(packet->ids[i]); + } +} + +void ClientConnection::handleMovePlayer(shared_ptr packet) +{ + shared_ptr player = minecraft->localplayers[m_userIndex]; //minecraft->player; + + double x = player->x; + double y = player->y; + double z = player->z; + float yRot = player->yRot; + float xRot = player->xRot; + + if (packet->hasPos) + { + x = packet->x; + y = packet->y; + z = packet->z; + } + if (packet->hasRot) + { + yRot = packet->yRot; + xRot = packet->xRot; + } + + player->ySlideOffset = 0; + player->xd = player->yd = player->zd = 0; + player->absMoveTo(x, y, z, yRot, xRot); + packet->x = player->x; + packet->y = player->bb->y0; + packet->z = player->z; + packet->yView = player->y; + connection->send(packet); + if (!started) + { + + if(!g_NetworkManager.IsHost() ) + { + Minecraft::GetInstance()->progressRenderer->progressStagePercentage((eCCConnected * 100)/ (eCCConnected)); + } + 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); + + // Fix for #105852 - TU12: Content: Gameplay: Local splitscreen Players are spawned at incorrect places after re-joining previously saved and loaded "Mass Effect World". + // Move this check from Minecraft::createExtraLocalPlayer + // 4J-PB - can't call this when this function is called from the qnet thread (GetGameStarted will be false) + if(app.GetGameStarted()) + { + ui.CloseUIScenes(m_userIndex); + } + } + +} + +// 4J Added +void ClientConnection::handleChunkVisibilityArea(shared_ptr packet) +{ + for(int z = packet->m_minZ; z <= packet->m_maxZ; ++z) + for(int x = packet->m_minX; x <= packet->m_maxX; ++x) + level->setChunkVisible(x, z, true); +} + +void ClientConnection::handleChunkVisibility(shared_ptr packet) +{ + level->setChunkVisible(packet->x, packet->z, packet->visible); +} + +void ClientConnection::handleChunkTilesUpdate(shared_ptr packet) +{ + // 4J - changed to encode level in packet + MultiPlayerLevel *dimensionLevel = (MultiPlayerLevel *)minecraft->levels[packet->levelIdx]; + if( dimensionLevel ) + { + PIXBeginNamedEvent(0,"Handle chunk tiles update"); + LevelChunk *lc = dimensionLevel->getChunk(packet->xc, packet->zc); + int xo = packet->xc * 16; + int zo = packet->zc * 16; + // 4J Stu - Unshare before we make any changes incase the server is already another step ahead of us + // Fix for #7904 - Gameplay: Players can dupe torches by throwing them repeatedly into water. + // This is quite expensive to do, so only consider unsharing if this tile setting is going to actually + // change something + bool forcedUnshare = false; + for (int i = 0; i < packet->count; i++) + { + int pos = packet->positions[i]; + int tile = packet->blocks[i] & 0xff; + int data = packet->data[i]; + + + int x = (pos >> 12) & 15; + int z = (pos >> 8) & 15; + int y = ((pos) & 255); + + // If this is going to actually change a tile, we'll need to unshare + int prevTile = lc->getTile(x, y, z); + if( ( tile != prevTile && !forcedUnshare ) ) + { + PIXBeginNamedEvent(0,"Chunk data unsharing\n"); + dimensionLevel->unshareChunkAt(xo,zo); + PIXEndNamedEvent(); + forcedUnshare = true; + } + + // 4J - Changes now that lighting is done at the client side of things... + // Note - the java version now calls the doSetTileAndData method from the level here rather than the levelchunk, which ultimately ends up + // calling checkLight for the altered tile. For us this doesn't always work as when sharing tile data between a local server & client, the + // tile might not be considered to be being changed on the client as the server already has changed the shared data, and so the checkLight + // doesn't happen. Hence doing an explicit checkLight here instead. + lc->setTileAndData(x, y, z, tile, data); + dimensionLevel->checkLight(x + xo, y, z + zo); + + dimensionLevel->clearResetRegion(x + xo, y, z + zo, x + xo, y, z + zo); + + // 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 + if(!( ( ( 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 ) ) ) ) + { + dimensionLevel->setTilesDirty(x + xo, y, z + zo, x + xo, y, z + zo); + } + + // 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(xo + x, y, zo + z, xo + x+1, y+1, zo + z+1); + } + PIXBeginNamedEvent(0,"Chunk data sharing\n"); + dimensionLevel->shareChunkAt(xo,zo); // 4J - added - only shares if chunks are same on server & client + PIXEndNamedEvent(); + + PIXEndNamedEvent(); + } +} + +void ClientConnection::handleBlockRegionUpdate(shared_ptr packet) +{ + // 4J - changed to encode level in packet + MultiPlayerLevel *dimensionLevel = (MultiPlayerLevel *)minecraft->levels[packet->levelIdx]; + if( dimensionLevel ) + { + PIXBeginNamedEvent(0,"Handle block region update"); + + int y1 = packet->y + packet->ys; + if(packet->bIsFullChunk) + { + y1 = Level::maxBuildHeight; + 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(); + } +} + +void ClientConnection::handleTileUpdate(shared_ptr packet) +{ + // 4J added - using a block of 255 to signify that this is a packet for destroying a tile, where we need to inform the level renderer that we are about to do so. + // This is used in creative mode as the point where a tile is first destroyed at the client end of things. Packets formed like this are potentially sent from + // ServerPlayerGameMode::destroyBlock + bool destroyTilePacket = false; + if( packet->block == 255 ) + { + packet->block = 0; + destroyTilePacket = true; + } + // 4J - changed to encode level in packet + MultiPlayerLevel *dimensionLevel = (MultiPlayerLevel *)minecraft->levels[packet->levelIdx]; + if( dimensionLevel ) + { + PIXBeginNamedEvent(0,"Handle tile update"); + + if( g_NetworkManager.IsHost() ) + { + // 4J Stu - Unshare before we make any changes incase the server is already another step ahead of us + // Fix for #7904 - Gameplay: Players can dupe torches by throwing them repeatedly into water. + // This is quite expensive to do, so only consider unsharing if this tile setting is going to actually + // change something + int prevTile = dimensionLevel->getTile(packet->x, packet->y, packet->z); + int prevData = dimensionLevel->getData(packet->x, packet->y, packet->z); + if( packet->block != prevTile || packet->data != prevData ) + { + PIXBeginNamedEvent(0,"Chunk data unsharing\n"); + dimensionLevel->unshareChunkAt(packet->x,packet->z); + PIXEndNamedEvent(); + } + } + + // 4J - In creative mode, we don't update the tile locally then get it confirmed by the server - the first point that we know we are about to destroy a tile is here. Let + // the rendering side of thing know so we can synchronise collision with async render data upates. + if( destroyTilePacket ) + { + minecraft->levelRenderer->destroyedTileManager->destroyingTileAt(dimensionLevel, packet->x, packet->y, packet->z); + } + + PIXBeginNamedEvent(0,"Setting data\n"); + bool tileWasSet = dimensionLevel->doSetTileAndData(packet->x, packet->y, packet->z, packet->block, packet->data); + + PIXEndNamedEvent(); + + // 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+1, packet->y+1, packet->z+1 ); + + PIXBeginNamedEvent(0,"Sharing data\n"); + dimensionLevel->shareChunkAt(packet->x,packet->z); // 4J - added - only shares if chunks are same on server & client + PIXEndNamedEvent(); + + PIXEndNamedEvent(); + } +} + +void ClientConnection::handleDisconnect(shared_ptr packet) +{ + connection->close(DisconnectPacket::eDisconnect_Kicked); + done = true; + + Minecraft *pMinecraft = Minecraft::GetInstance(); + pMinecraft->connectionDisconnected( m_userIndex , packet->reason ); + app.SetDisconnectReason( packet->reason ); + + app.SetAction(m_userIndex,eAppAction_ExitWorld,(void *)TRUE); + //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; + + Minecraft *pMinecraft = Minecraft::GetInstance(); + pMinecraft->connectionDisconnected( m_userIndex , reason ); + + // 4J Stu - TU-1 hotfix + // Fix for #13191 - The host of a game can get a message informing them that the connection to the server has been lost + // In the (now unlikely) event that the host connections times out, allow the player to save their game + if(g_NetworkManager.IsHost() && + (reason == DisconnectPacket::eDisconnect_TimeOut || reason == DisconnectPacket::eDisconnect_Overflow) && + m_userIndex == ProfileManager.GetPrimaryPad() && + !MinecraftServer::saveOnExitAnswered() ) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + 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)); +} + +void ClientConnection::sendAndDisconnect(shared_ptr packet) +{ + if (done) return; + connection->send(packet); + connection->sendAndQuit(); +} + +void ClientConnection::send(shared_ptr 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)); + + // 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 + bool isLocalPlayer = false; + for( int i = 0; i < XUSER_MAX_COUNT; i++ ) + { + if( minecraft->localplayers[i] ) + { + if( minecraft->localplayers[i]->entityId == packet->playerId ) + { + isLocalPlayer = true; + to = minecraft->localplayers[i]; + break; + } + } + } + + 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; + } + + 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 + // "from" reference if we've already removed the item for an earlier processed connection + if( isLocalPlayer ) + { + shared_ptr player = dynamic_pointer_cast(to); + + // 4J Stu - Fix for #10213 - UI: Local clients cannot progress through the tutorial normally. + // We only send this packet once if many local players can see the event, so make sure we update + // the tutorial for the player that actually picked up the item + int playerPad = player->GetXboxPad(); + + if( minecraft->localgameModes[playerPad] != NULL ) + { + // 4J-PB - add in the XP orb sound + if(from->GetType() == eTYPE_EXPERIENCEORB) + { + float fPitch=((random->nextFloat() - random->nextFloat()) * 0.7f + 1.0f) * 2.0f; + app.DebugPrintf("XP Orb with pitch %f\n",fPitch); + level->playSound(from, eSoundType_RANDOM_ORB, 0.2f, fPitch); + } + else + { + level->playSound(from, eSoundType_RANDOM_POP, 0.2f, ((random->nextFloat() - random->nextFloat()) * 0.7f + 1.0f) * 2.0f); + } + + minecraft->particleEngine->add( shared_ptr( new TakeAnimationParticle(minecraft->level, from, to, -0.5f) ) ); + level->removeEntity(packet->itemId); + } + else + { + // Don't know if this should ever really happen, but seems safest to try and remove the entity that has been collected even if it + // somehow isn't an itementity + level->removeEntity(packet->itemId); + } + } + else + { + level->playSound(from, eSoundType_RANDOM_POP, 0.2f, ((random->nextFloat() - random->nextFloat()) * 0.7f + 1.0f) * 2.0f); + minecraft->particleEngine->add( shared_ptr( new TakeAnimationParticle(minecraft->level, from, to, -0.5f) ) ); + level->removeEntity(packet->itemId); + } + } + +} + +void ClientConnection::handleChat(shared_ptr packet) +{ + wstring message; + int iPos; + bool displayOnGui = true; + + bool replacePlayer = false; + bool replaceEntitySource = false; + bool replaceItem = false; + + wstring playerDisplayName = L""; + wstring sourceDisplayName = L""; + + // On platforms other than Xbox One this just sets display name to gamertag + if (packet->m_stringArgs.size() >= 1) playerDisplayName = GetDisplayNameByGamertag(packet->m_stringArgs[0]); + if (packet->m_stringArgs.size() >= 2) sourceDisplayName = GetDisplayNameByGamertag(packet->m_stringArgs[1]); + + switch(packet->m_messageType) + { + case ChatPacket::e_ChatBedOccupied: + message = app.GetString(IDS_TILE_BED_OCCUPIED); + break; + case ChatPacket::e_ChatBedNoSleep: + message = app.GetString(IDS_TILE_BED_NO_SLEEP); + break; + case ChatPacket::e_ChatBedNotValid: + message = app.GetString(IDS_TILE_BED_NOT_VALID); + break; + case ChatPacket::e_ChatBedNotSafe: + message = app.GetString(IDS_TILE_BED_NOTSAFE); + break; + case ChatPacket::e_ChatBedPlayerSleep: + message=app.GetString(IDS_TILE_BED_PLAYERSLEEP); + iPos=message.find(L"%s"); + message.replace(iPos,2,playerDisplayName); + break; + case ChatPacket::e_ChatBedMeSleep: + message=app.GetString(IDS_TILE_BED_MESLEEP); + break; + case ChatPacket::e_ChatPlayerJoinedGame: + message=app.GetString(IDS_PLAYER_JOINED); + iPos=message.find(L"%s"); + message.replace(iPos,2,playerDisplayName); + break; + case ChatPacket::e_ChatPlayerLeftGame: + message=app.GetString(IDS_PLAYER_LEFT); + iPos=message.find(L"%s"); + message.replace(iPos,2,playerDisplayName); + break; + case ChatPacket::e_ChatPlayerKickedFromGame: + message=app.GetString(IDS_PLAYER_KICKED); + iPos=message.find(L"%s"); + message.replace(iPos,2,playerDisplayName); + break; + case ChatPacket::e_ChatCannotPlaceLava: + displayOnGui = false; + app.SetGlobalXuiAction(eAppAction_DisplayLavaMessage); + break; + case ChatPacket::e_ChatDeathInFire: + message=app.GetString(IDS_DEATH_INFIRE); + replacePlayer = true; + break; + case ChatPacket::e_ChatDeathOnFire: + message=app.GetString(IDS_DEATH_ONFIRE); + replacePlayer = true; + break; + case ChatPacket::e_ChatDeathLava: + message=app.GetString(IDS_DEATH_LAVA); + replacePlayer = true; + break; + case ChatPacket::e_ChatDeathInWall: + message=app.GetString(IDS_DEATH_INWALL); + replacePlayer = true; + break; + case ChatPacket::e_ChatDeathDrown: + message=app.GetString(IDS_DEATH_DROWN); + replacePlayer = true; + break; + case ChatPacket::e_ChatDeathStarve: + message=app.GetString(IDS_DEATH_STARVE); + replacePlayer = true; + break; + case ChatPacket::e_ChatDeathCactus: + message=app.GetString(IDS_DEATH_CACTUS); + replacePlayer = true; + break; + case ChatPacket::e_ChatDeathFall: + message=app.GetString(IDS_DEATH_FALL); + replacePlayer = true; + break; + case ChatPacket::e_ChatDeathOutOfWorld: + message=app.GetString(IDS_DEATH_OUTOFWORLD); + replacePlayer = true; + break; + case ChatPacket::e_ChatDeathGeneric: + message=app.GetString(IDS_DEATH_GENERIC); + replacePlayer = true; + break; + case ChatPacket::e_ChatDeathExplosion: + message=app.GetString(IDS_DEATH_EXPLOSION); + replacePlayer = true; + break; + case ChatPacket::e_ChatDeathMagic: + message=app.GetString(IDS_DEATH_MAGIC); + replacePlayer = true; + break; + case ChatPacket::e_ChatDeathAnvil: + message=app.GetString(IDS_DEATH_FALLING_ANVIL); + replacePlayer = true; + break; + case ChatPacket::e_ChatDeathFallingBlock: + message=app.GetString(IDS_DEATH_FALLING_TILE); + replacePlayer = true; + break; + case ChatPacket::e_ChatDeathDragonBreath: + message=app.GetString(IDS_DEATH_DRAGON_BREATH); + replacePlayer = true; + break; + case ChatPacket::e_ChatDeathMob: + message=app.GetString(IDS_DEATH_MOB); + replacePlayer = true; + replaceEntitySource = true; + break; + case ChatPacket::e_ChatDeathPlayer: + message=app.GetString(IDS_DEATH_PLAYER); + replacePlayer = true; + replaceEntitySource = true; + break; + case ChatPacket::e_ChatDeathArrow: + message=app.GetString(IDS_DEATH_ARROW); + replacePlayer = true; + replaceEntitySource = true; + break; + case ChatPacket::e_ChatDeathFireball: + message=app.GetString(IDS_DEATH_FIREBALL); + replacePlayer = true; + replaceEntitySource = true; + break; + case ChatPacket::e_ChatDeathThrown: + message=app.GetString(IDS_DEATH_THROWN); + replacePlayer = true; + replaceEntitySource = true; + break; + case ChatPacket::e_ChatDeathIndirectMagic: + message=app.GetString(IDS_DEATH_INDIRECT_MAGIC); + replacePlayer = true; + replaceEntitySource = true; + break; + case ChatPacket::e_ChatDeathThorns: + message=app.GetString(IDS_DEATH_THORNS); + 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"); + message.replace(iPos,2,playerDisplayName); + break; + case ChatPacket::e_ChatPlayerLeftEnd: + message=app.GetString(IDS_PLAYER_LEFT_END); + iPos=message.find(L"%s"); + message.replace(iPos,2,playerDisplayName); + break; + + case ChatPacket::e_ChatPlayerMaxEnemies: + message=app.GetString(IDS_MAX_ENEMIES_SPAWNED); + break; + // Spawn eggs + case ChatPacket::e_ChatPlayerMaxVillagers: + message=app.GetString(IDS_MAX_VILLAGERS_SPAWNED); + break; + case ChatPacket::e_ChatPlayerMaxPigsSheepCows: + message=app.GetString(IDS_MAX_PIGS_SHEEP_COWS_CATS_SPAWNED); + break; + case ChatPacket::e_ChatPlayerMaxChickens: + message=app.GetString(IDS_MAX_CHICKENS_SPAWNED); + break; + case ChatPacket::e_ChatPlayerMaxSquid: + message=app.GetString(IDS_MAX_SQUID_SPAWNED); + break; + case ChatPacket::e_ChatPlayerMaxMooshrooms: + message=app.GetString(IDS_MAX_MOOSHROOMS_SPAWNED); + break; + 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: + message=app.GetString(IDS_MAX_PIGS_SHEEP_COWS_CATS_BRED); + break; + case ChatPacket::e_ChatPlayerMaxBredChickens: + message=app.GetString(IDS_MAX_CHICKENS_BRED); + break; + case ChatPacket::e_ChatPlayerMaxBredMooshrooms: + message=app.GetString(IDS_MAX_MUSHROOMCOWS_BRED); + break; + + case ChatPacket::e_ChatPlayerMaxBredWolves: + message=app.GetString(IDS_MAX_WOLVES_BRED); + break; + + // can't shear the mooshroom + case ChatPacket::e_ChatPlayerCantShearMooshroom: + message=app.GetString(IDS_CANT_SHEAR_MOOSHROOM); + break; + + // Paintings/Item Frames + case ChatPacket::e_ChatPlayerMaxHangingEntities: + message=app.GetString(IDS_MAX_HANGINGENTITIES); + break; + // Enemy spawn eggs in peaceful + case ChatPacket::e_ChatPlayerCantSpawnInPeaceful: + message=app.GetString(IDS_CANT_SPAWN_IN_PEACEFUL); + break; + + // Enemy spawn eggs in peaceful + case ChatPacket::e_ChatPlayerMaxBoats: + message=app.GetString(IDS_MAX_BOATS); + break; + + case ChatPacket::e_ChatCommandTeleportSuccess: + message=app.GetString(IDS_COMMAND_TELEPORT_SUCCESS); + replacePlayer = true; + if(packet->m_intArgs[0] == eTYPE_SERVERPLAYER) + { + message = replaceAll(message,L"{*DESTINATION*}", sourceDisplayName); + } + else + { + message = replaceAll(message,L"{*DESTINATION*}", app.getEntityName((eINSTANCEOF)packet->m_intArgs[0])); + } + break; + case ChatPacket::e_ChatCommandTeleportMe: + message=app.GetString(IDS_COMMAND_TELEPORT_ME); + replacePlayer = true; + break; + case ChatPacket::e_ChatCommandTeleportToMe: + message=app.GetString(IDS_COMMAND_TELEPORT_TO_ME); + replacePlayer = true; + break; + + default: + message = playerDisplayName; + 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_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) + { + if (e->instanceof(eTYPE_LIVINGENTITY)) dynamic_pointer_cast(e)->swing(); + } + else if (packet->action == AnimatePacket::HURT) + { + e->animateHurt(); + } + else if (packet->action == AnimatePacket::WAKE_UP) + { + if (e->instanceof(eTYPE_PLAYER)) dynamic_pointer_cast(e)->stopSleepInBed(false, false, false); + } + else if (packet->action == AnimatePacket::RESPAWN) + { + } + else if (packet->action == AnimatePacket::CRITICAL_HIT) + { + shared_ptr critParticle = shared_ptr( new CritParticle(minecraft->level, e) ); + critParticle->CritParticlePostConstructor(); + minecraft->particleEngine->add( critParticle ); + } + else if (packet->action == AnimatePacket::MAGIC_CRITICAL_HIT) + { + shared_ptr critParticle = shared_ptr( new CritParticle(minecraft->level, e, eParticleType_magicCrit) ); + critParticle->CritParticlePostConstructor(); + minecraft->particleEngine->add(critParticle); + } + 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 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) +{ +// printf("Client: handlePreLogin\n"); +#if 1 + // 4J - Check that we can play with all the players already in the game who have Friends-Only UGC set + BOOL canPlay = TRUE; + BOOL canPlayLocal = TRUE; + BOOL isAtLeastOneFriend = g_NetworkManager.IsHost(); + BOOL isFriendsWithHost = TRUE; + BOOL cantPlayContentRestricted = FALSE; + + if(!g_NetworkManager.IsHost()) + { + // set the game host settings + app.SetGameHostOption(eGameHostOption_All,packet->m_serverSettings); + + // 4J-PB - if we go straight in from the menus via an invite, we won't have the DLC info + if(app.GetTMSGlobalFileListRead()==false) + { + app.SetTMSAction(ProfileManager.GetPrimaryPad(),eTMSAction_TMSPP_RetrieveFiles_RunPlayGame); + } + } + +#ifdef _XBOX + if(!g_NetworkManager.IsHost() && !app.GetGameHostOption(eGameHostOption_FriendsOfFriends)) + { + if(m_userIndex == ProfileManager.GetPrimaryPad() ) + { + for(DWORD idx = 0; idx < XUSER_MAX_COUNT; ++idx) + { + if(ProfileManager.IsSignedIn(m_userIndex) && ProfileManager.IsGuest(idx)) + { + canPlay = FALSE; + isFriendsWithHost = FALSE; + } + else + { + PlayerUID playerXuid = INVALID_XUID; + if( ProfileManager.IsSignedInLive(idx) ) + { + ProfileManager.GetXUID(idx,&playerXuid,true); + } + if( playerXuid != INVALID_XUID ) + { + // Is this user friends with the host player? + BOOL result; + DWORD error; + error = XUserAreUsersFriends(idx,&packet->m_playerXuids[packet->m_hostIndex],1,&result,NULL); + if(error == ERROR_SUCCESS && result != TRUE) + { + canPlay = FALSE; + isFriendsWithHost = FALSE; + } + } + } + if(!canPlay) break; + } + } + else + { + if(ProfileManager.IsSignedIn(m_userIndex) && ProfileManager.IsGuest(m_userIndex)) + { + canPlay = FALSE; + isFriendsWithHost = FALSE; + } + else + { + PlayerUID playerXuid = INVALID_XUID; + if( ProfileManager.IsSignedInLive(m_userIndex) ) + { + ProfileManager.GetXUID(m_userIndex,&playerXuid,true); + } + if( playerXuid != INVALID_XUID ) + { + // Is this user friends with the host player? + BOOL result; + DWORD error; + error = XUserAreUsersFriends(m_userIndex,&packet->m_playerXuids[packet->m_hostIndex],1,&result,NULL); + if(error == ERROR_SUCCESS && result != TRUE) + { + canPlay = FALSE; + isFriendsWithHost = FALSE; + } + } + } + } + } + + if( canPlay ) + { + for(DWORD i = 0; i < packet->m_dwPlayerCount; ++i) + { + bool localPlayer = false; + for(DWORD idx = 0; idx < XUSER_MAX_COUNT; ++idx) + { + if( ProfileManager.IsSignedInLive(idx) ) + { + // need to use the XUID here + 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); + } + if( ProfileManager.AreXUIDSEqual(playerXUID,packet->m_playerXuids[i]) ) localPlayer = true; + } + else if (ProfileManager.IsSignedIn(idx)) + { + // If we aren't signed into live then they have to be a local player + localPlayer = true; + } + } + if(!localPlayer) + { + // First check our own permissions to see if we can play with this player + if(m_userIndex == ProfileManager.GetPrimaryPad() ) + { + canPlayLocal = ProfileManager.CanViewPlayerCreatedContent(m_userIndex,false,&packet->m_playerXuids[i],1); + + // 4J Stu - Everyone joining needs to have at least one friend in the game + // Local players are implied friends + if( isAtLeastOneFriend != TRUE ) + { + BOOL result; + DWORD error; + for(DWORD idx = 0; idx < XUSER_MAX_COUNT; ++idx) + { + if( ProfileManager.IsSignedIn(idx) && !ProfileManager.IsGuest(idx) ) + { + error = XUserAreUsersFriends(idx,&packet->m_playerXuids[i],1,&result,NULL); + if(error == ERROR_SUCCESS && result == TRUE) isAtLeastOneFriend = TRUE; + } + } + } + } + else + { + // Friends with the primary player on this system + isAtLeastOneFriend = true; + + canPlayLocal = ProfileManager.CanViewPlayerCreatedContent(m_userIndex,true,&packet->m_playerXuids[i],1); + } + + // If we can play with them, then check if they can play with us + if( canPlayLocal && ( packet->m_friendsOnlyBits & (1<m_playerXuids[i],1,&result,NULL); + if(error == ERROR_SUCCESS) canPlay &= result; + } + if(!canPlay) break; + } + } + if(!canPlay || !canPlayLocal) break; + } + } + } +#else + // TODO - handle this kind of things for non-360 platforms + canPlay = TRUE; + canPlayLocal = TRUE; + isAtLeastOneFriend = TRUE; + cantPlayContentRestricted= FALSE; + +#if ( defined __PS3__ || defined __ORBIS__ || defined __PSVITA__) + + if(!g_NetworkManager.IsHost() && !app.GetGameHostOption(eGameHostOption_FriendsOfFriends)) + { + bool bChatRestricted=false; + + ProfileManager.GetChatAndContentRestrictions(m_userIndex,true,&bChatRestricted,NULL,NULL); + + // Chat restricted orbis players can still play online +#ifndef __ORBIS__ + canPlay = !bChatRestricted; +#endif + + if(m_userIndex == ProfileManager.GetPrimaryPad() ) + { + // Is this user friends with the host player? + bool isFriend = true; + unsigned int friendCount = 0; +#ifdef __PS3__ + int ret = sceNpBasicGetFriendListEntryCount(&friendCount); +#elif defined __PSVITA__ + sce::Toolkit::NP::Utilities::Future friendList; + int ret = -1; + if(!CGameNetworkManager::usingAdhocMode()) // we don't need to be friends in PSN for adhoc mode + { + int ret = sce::Toolkit::NP::Friends::Interface::getFriendslist(&friendList, false); + if(ret == SCE_TOOLKIT_NP_SUCCESS) + { + if( friendList.hasResult() ) + { + friendCount = friendList.get()->size(); + } + } + } +#else // __ORBIS__ + + sce::Toolkit::NP::Utilities::Future friendList; + + sce::Toolkit::NP::FriendInfoRequest requestParam; + memset(&requestParam,0,sizeof(requestParam)); + requestParam.flag = SCE_TOOLKIT_NP_FRIENDS_LIST_ALL; + requestParam.limit = 0; + requestParam.offset = 0; + requestParam.userInfo.userId = ProfileManager.getUserID(ProfileManager.GetPrimaryPad()); + + int ret = sce::Toolkit::NP::Friends::Interface::getFriendslist(&friendList, &requestParam, false); + if( ret == 0 ) + { + if( friendList.hasResult() ) + { + friendCount = friendList.get()->size(); + } + } +#endif + if( ret == 0 ) + { + isFriend = false; + SceNpId npid; + for( unsigned int i = 0; i < friendCount; i++ ) + { +#ifdef __PS3__ + ret = sceNpBasicGetFriendListEntry( i, &npid ); +#else + npid = friendList.get()->at(i).npid; +#endif + if( ret == 0 ) + { + if(strcmp(npid.handle.data, packet->m_playerXuids[packet->m_hostIndex].getOnlineID()) == 0) + { + isFriend = true; + break; + } + } + } + } + + if( !isFriend ) + { + canPlay = FALSE; + isFriendsWithHost = FALSE; + } + } + } + // is it an online game, and a player has chat restricted? + else if(!g_NetworkManager.IsLocalGame()) + { + // if the player is chat restricted, then they can't play an online game + bool bChatRestricted=false; + bool bContentRestricted=false; + + // If this is a pre-login packet for the first player on the machine, then accumulate up these flags for everyone signed in. We can handle exiting the game + // much more cleanly at this point by exiting the level, rather than waiting for a prelogin packet for the other players, when we have to exit the player + // which seems to be very unstable at the point of starting up the game + if(m_userIndex == ProfileManager.GetPrimaryPad()) + { + ProfileManager.GetChatAndContentRestrictions(m_userIndex,false,&bChatRestricted,&bContentRestricted,NULL); + } + else + { + ProfileManager.GetChatAndContentRestrictions(m_userIndex,true,&bChatRestricted,&bContentRestricted,NULL); + } + + // Chat restricted orbis players can still play online +#ifndef __ORBIS__ + canPlayLocal = !bChatRestricted; +#endif + + cantPlayContentRestricted = bContentRestricted ? 1 : 0; + } + + +#endif + +#ifdef _XBOX_ONE + if(!g_NetworkManager.IsHost() && m_userIndex == ProfileManager.GetPrimaryPad()) + { + long long startTime = System::currentTimeMillis(); + + auto friendsXuids = DQRNetworkManager::GetFriends(); + + if (app.GetGameHostOption(eGameHostOption_FriendsOfFriends)) + { + // Check that the user has at least one friend in the game + isAtLeastOneFriend = false; + + for (int i = 0; i < friendsXuids->Size; i++) + { + auto friendsXuid = friendsXuids->GetAt(i); + + // Check this friend against each player, if we find them we have at least one friend + for (int j = 0; j < g_NetworkManager.GetPlayerCount(); j++) + { + Platform::String^ xboxUserId = ref new Platform::String(g_NetworkManager.GetPlayerByIndex(j)->GetUID().toString().data()); + if (friendsXuid == xboxUserId) + { + isAtLeastOneFriend = true; + break; + } + } + } + + app.DebugPrintf("ClientConnection::handlePreLogin: User has at least one friend? %s\n", isAtLeastOneFriend ? "Yes" : "No"); + } + else + { + // Check that the user is friends with the host + bool isFriend = false; + + Platform::String^ hostXboxUserId = ref new Platform::String(g_NetworkManager.GetHostPlayer()->GetUID().toString().data()); + + for (int i = 0; i < friendsXuids->Size; i++) + { + if (friendsXuids->GetAt(i) == hostXboxUserId) + { + isFriend = true; + break; + } + } + + if( !isFriend ) + { + canPlay = FALSE; + isFriendsWithHost = FALSE; + } + + app.DebugPrintf("ClientConnection::handlePreLogin: User is friends with the host? %s\n", isFriendsWithHost ? "Yes" : "No"); + } + + app.DebugPrintf("ClientConnection::handlePreLogin: Friendship checks took %i ms\n", System::currentTimeMillis() - startTime); + } +#endif + +#endif // _XBOX + + if(!canPlay || !canPlayLocal || !isAtLeastOneFriend || cantPlayContentRestricted) + { +#ifndef __PS3__ + DisconnectPacket::eDisconnectReason reason = DisconnectPacket::eDisconnect_NoUGC_Remote; +#else + DisconnectPacket::eDisconnectReason reason = DisconnectPacket::eDisconnect_None; +#endif + if(m_userIndex == ProfileManager.GetPrimaryPad()) + { + if(!isFriendsWithHost) reason = DisconnectPacket::eDisconnect_NotFriendsWithHost; + else if(!isAtLeastOneFriend) reason = DisconnectPacket::eDisconnect_NoFriendsInGame; + else if(!canPlayLocal) reason = DisconnectPacket::eDisconnect_NoUGC_AllLocal; + else if(cantPlayContentRestricted) reason = DisconnectPacket::eDisconnect_ContentRestricted_AllLocal; + + app.DebugPrintf("Exiting world on handling Pre-Login packet due UGC privileges: %d\n", reason); + app.SetDisconnectReason( reason ); + app.SetAction(ProfileManager.GetPrimaryPad(),eAppAction_ExitWorld,(void *)TRUE); + } + else + { + if(!isFriendsWithHost) reason = DisconnectPacket::eDisconnect_NotFriendsWithHost; + else if(!canPlayLocal) reason = DisconnectPacket::eDisconnect_NoUGC_Single_Local; + else if(cantPlayContentRestricted) reason = DisconnectPacket::eDisconnect_ContentRestricted_Single_Local; + + 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.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 ); + + // 4J-PB - this locks up on the read and write threads not closing down, because they are trying to lock the incoming critsec when it's already locked by this thread +// Minecraft::GetInstance()->connectionDisconnected( m_userIndex , reason ); +// done = true; +// connection->flush(); +// connection->close(reason); +// app.SetAction(m_userIndex,eAppAction_ExitPlayer); + + // 4J-PB - doing this instead + app.SetAction(m_userIndex,eAppAction_ExitPlayerPreLogin); + } + } + else + { + // Texture pack handling + // If we have the texture pack for the game, load it + // If we don't then send a packet to the host to request it. We need to send this before the LoginPacket so that it gets handled first, + // as once the LoginPacket is received on the client the game is close to starting + if(m_userIndex == ProfileManager.GetPrimaryPad()) + { + Minecraft *pMinecraft = Minecraft::GetInstance(); + if( pMinecraft->skins->selectTexturePackById(packet->m_texturePackId) ) + { + app.DebugPrintf("Selected texture pack %d from Pre-Login packet\n", packet->m_texturePackId); + } + else + { + 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 +#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 + } + } + + if(!g_NetworkManager.IsHost() ) + { + Minecraft::GetInstance()->progressRenderer->progressStagePercentage((eCCPreLoginReceived * 100)/ (eCCConnected)); + } + // need to use the XUID here + 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); + } +#ifdef __PSVITA__ + if(CGameNetworkManager::usingAdhocMode() && onlineXUID.getOnlineID()[0] == 0) + { + // player doesn't have an online UID, set it from the player name + onlineXUID.setForAdhoc(); + } +#endif + + // On PS3, all non-signed in players (even guests) can get a useful offlineXUID +#if !(defined __PS3__ || defined _DURANGO ) + if( !ProfileManager.IsGuest( m_userIndex ) ) +#endif + { + // All other players we use their offline XUID so that they can play the game offline + ProfileManager.GetXUID(m_userIndex,&offlineXUID,false); + } + BOOL allAllowed, friendsAllowed; + ProfileManager.AllowedPlayerCreatedContent(m_userIndex,true,&allAllowed,&friendsAllowed); + send( shared_ptr( new LoginPacket(minecraft->user->name, SharedConstants::NETWORK_PROTOCOL_VERSION, offlineXUID, onlineXUID, (allAllowed!=TRUE && friendsAllowed==TRUE), + packet->m_ugcPlayersVersion, app.GetPlayerSkinId(m_userIndex), app.GetPlayerCapeId(m_userIndex), ProfileManager.IsGuest( m_userIndex )))); + + if(!g_NetworkManager.IsHost() ) + { + Minecraft::GetInstance()->progressRenderer->progressStagePercentage((eCCLoginSent * 100)/ (eCCConnected)); + } + } +#else + // 4J - removed + if (packet->loginKey.equals("-")) { + send(new LoginPacket(minecraft->user.name, SharedConstants.NETWORK_PROTOCOL_VERSION)); + } else { + try { + URL url = new URL("http://www.minecraft->net/game/joinserver.jsp?user=" + minecraft->user.name + "&sessionId=" + minecraft->user.sessionId + "&serverId=" + packet->loginKey); + BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream())); + String msg = br.readLine(); + br.close(); + + if (msg.equalsIgnoreCase("ok")) { + send(new LoginPacket(minecraft->user.name, SharedConstants.NETWORK_PROTOCOL_VERSION)); + } else { + connection.close("disconnect.loginFailedInfo", msg); + } + } catch (Exception e) { + e.printStackTrace(); + connection.close("disconnect.genericReason", "Internal client error: " + e.toString()); + } + } +#endif +} + +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(); + connection->close(DisconnectPacket::eDisconnect_Closed); +} + +void ClientConnection::handleAddMob(shared_ptr packet) +{ + 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 mob = dynamic_pointer_cast(EntityIO::newById(packet->type, level)); + mob->xp = packet->x; + mob->yp = packet->y; + mob->zp = packet->z; + mob->yHeadRot = packet->yHeadRot * 360 / 256.0f; + mob->yRotp = packet->yRot; + mob->xRotp = packet->xRot; + + vector > *subEntities = mob->getSubEntities(); + if (subEntities != NULL) + { + int offs = packet->id - mob->entityId; + //for (int i = 0; i < subEntities.length; i++) + for(AUTO_VAR(it, subEntities->begin()); it != subEntities->end(); ++it) + { + //subEntities[i].entityId += offs; + (*it)->entityId += offs; + } + } + + mob->entityId = packet->id; + +// printf("\t\t\t\t%d: Add mob rot %d\n",packet->id,packet->yRot); + + mob->absMoveTo(x, y, z, yRot, xRot); + mob->xd = packet->xd / 8000.0f; + mob->yd = packet->yd / 8000.0f; + mob->zd = packet->zd / 8000.0f; + level->putEntity(packet->id, mob); + + vector > *unpackedData = packet->getUnpackedData(); + if (unpackedData != NULL) + { + mob->getEntityData()->assignValues(unpackedData); + } + + // Fix for #65236 - TU8: Content: Gameplay: Magma Cubes' have strange hit boxes. + // 4J Stu - Slimes have a different BB depending on their size which is set in the entity data, so update the BB + if(mob->GetType() == eTYPE_SLIME || mob->GetType() == eTYPE_LAVASLIME) + { + shared_ptr slime = dynamic_pointer_cast(mob); + slime->setSize( slime->getSize() ); + } +} + +void ClientConnection::handleSetTime(shared_ptr packet) +{ + 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), true); + minecraft->level->getLevelData()->setSpawn(packet->x, packet->y, packet->z); + +} + +void ClientConnection::handleEntityLinkPacket(shared_ptr packet) +{ + shared_ptr sourceEntity = getEntity(packet->sourceId); + shared_ptr destEntity = getEntity(packet->destId); + + // 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) + { + // We don't handle missing source entities because it shouldn't happen + assert(!(sourceEntity == NULL && packet->sourceId >= 0)); + + deferredEntityLinkPackets.push_back(DeferredEntityLinkPacket(packet)); + return; + } + + if (packet->type == SetEntityLinkPacket::RIDING) + { + bool displayMountMessage = false; + if (packet->sourceId == Minecraft::GetInstance()->localplayers[m_userIndex].get()->entityId) + { + sourceEntity = Minecraft::GetInstance()->localplayers[m_userIndex]; + + 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 ClientConnection::getEntity(int entityId) +{ + //if (entityId == minecraft->player->entityId) + if(entityId == minecraft->localplayers[m_userIndex]->entityId) + { + //return minecraft->player; + return minecraft->localplayers[m_userIndex]; + } + return level->getEntity(entityId); +} + +void ClientConnection::handleSetHealth(shared_ptr packet) +{ + //minecraft->player->hurtTo(packet->health); + minecraft->localplayers[m_userIndex]->hurtTo(packet->health,packet->damageSource); + minecraft->localplayers[m_userIndex]->getFoodData()->setFoodLevel(packet->food); + minecraft->localplayers[m_userIndex]->getFoodData()->setSaturation(packet->saturation); + + // We need food + if(packet->food < FoodConstants::HEAL_LEVEL - 1) + { + if(minecraft->localgameModes[m_userIndex] != NULL && !minecraft->localgameModes[m_userIndex]->hasInfiniteItems() ) + { + minecraft->localgameModes[m_userIndex]->getTutorial()->changeTutorialState(e_Tutorial_State_Food_Bar); + } + } +} + +void ClientConnection::handleSetExperience(shared_ptr packet) +{ + minecraft->localplayers[m_userIndex]->setExperienceValues(packet->experienceProgress, packet->totalExperience, packet->experienceLevel); +} + +void ClientConnection::handleTexture(shared_ptr packet) +{ + // Both PlayerConnection and ClientConnection should handle this mostly the same way + // Server side also needs to store a list of those clients waiting to get a texture the server doesn't have yet + // so that it can send it out to them when it comes in + + if(packet->dwBytes==0) + { + // Request for texture +#ifndef _CONTENT_PACKAGE + wprintf(L"Client received request for custom texture %ls\n",packet->textureName.c_str()); +#endif + PBYTE pbData=NULL; + DWORD dwBytes=0; + app.GetMemFileDetails(packet->textureName,&pbData,&dwBytes); + + if(dwBytes!=0) + { + send( shared_ptr( new TexturePacket(packet->textureName,pbData,dwBytes) ) ); + } + } + else + { + // Response with texture data +#ifndef _CONTENT_PACKAGE + wprintf(L"Client received custom texture %ls\n",packet->textureName.c_str()); +#endif + app.AddMemoryTextureFile(packet->textureName,packet->pbData,packet->dwBytes); + Minecraft::GetInstance()->handleClientTextureReceived(packet->textureName); + } +} + +void ClientConnection::handleTextureAndGeometry(shared_ptr packet) +{ + // Both PlayerConnection and ClientConnection should handle this mostly the same way + // Server side also needs to store a list of those clients waiting to get a texture the server doesn't have yet + // so that it can send it out to them when it comes in + + if(packet->dwTextureBytes==0) + { + // Request for texture +#ifndef _CONTENT_PACKAGE + wprintf(L"Client received request for custom texture and geometry %ls\n",packet->textureName.c_str()); +#endif + PBYTE pbData=NULL; + DWORD dwBytes=0; + app.GetMemFileDetails(packet->textureName,&pbData,&dwBytes); + DLCSkinFile *pDLCSkinFile = app.m_dlcManager.getSkinFile(packet->textureName); + + if(dwBytes!=0) + { + if(pDLCSkinFile) + { + if(pDLCSkinFile->getAdditionalBoxesCount()!=0) + { + send( shared_ptr( new TextureAndGeometryPacket(packet->textureName,pbData,dwBytes,pDLCSkinFile) ) ); + } + else + { + send( shared_ptr( new TextureAndGeometryPacket(packet->textureName,pbData,dwBytes) ) ); + } + } + else + { + unsigned int uiAnimOverrideBitmask= app.GetAnimOverrideBitmask(packet->dwSkinID); + + send( shared_ptr( new TextureAndGeometryPacket(packet->textureName,pbData,dwBytes,app.GetAdditionalSkinBoxes(packet->dwSkinID),uiAnimOverrideBitmask) ) ); + } + } + } + else + { + // Response with texture data +#ifndef _CONTENT_PACKAGE + wprintf(L"Client received custom TextureAndGeometry %ls\n",packet->textureName.c_str()); +#endif + // Add the texture data + app.AddMemoryTextureFile(packet->textureName,packet->pbData,packet->dwTextureBytes); + // Add the geometry data + if(packet->dwBoxC!=0) + { + app.SetAdditionalSkinBoxes(packet->dwSkinID,packet->BoxDataA,packet->dwBoxC); + } + // Add the anim override + app.SetAnimOverrideBitmask(packet->dwSkinID,packet->uiAnimOverrideBitmask); + + // clear out the pending texture request + Minecraft::GetInstance()->handleClientTextureReceived(packet->textureName); + } +} + +void ClientConnection::handleTextureChange(shared_ptr packet) +{ + shared_ptr e = getEntity(packet->id); + if ( (e == NULL) || !e->instanceof(eTYPE_PLAYER) ) return; + shared_ptr player = dynamic_pointer_cast(e); + + bool isLocalPlayer = false; + for( int i = 0; i < XUSER_MAX_COUNT; i++ ) + { + if( minecraft->localplayers[i] ) + { + if( minecraft->localplayers[i]->entityId == packet->id ) + { + isLocalPlayer = true; + break; + } + } + } + if(isLocalPlayer) return; + + switch(packet->action) + { + case TextureChangePacket::e_TextureChange_Skin: + player->setCustomSkin( app.getSkinIdFromPath( packet->path ) ); +#ifndef _CONTENT_PACKAGE + wprintf(L"Skin for remote 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 remote player %ls has changed to %ls\n", player->name.c_str(), player->customTextureUrl2.c_str() ); +#endif + break; + } + + if(!packet->path.empty() && packet->path.substr(0,3).compare(L"def") != 0 && !app.IsFileInMemoryTextures(packet->path)) + { + if( minecraft->addPendingClientTextureRequest(packet->path) ) + { +#ifndef _CONTENT_PACKAGE + wprintf(L"handleTextureChange - Client sending texture packet to get custom skin %ls for player %ls\n",packet->path.c_str(), player->name.c_str()); +#endif + send(shared_ptr( new TexturePacket(packet->path,NULL,0) ) ); + } + } + else if(!packet->path.empty() && app.IsFileInMemoryTextures(packet->path)) + { + // Update the ref count on the memory texture data + app.AddMemoryTextureFile(packet->path,NULL,0); + } +} + +void ClientConnection::handleTextureAndGeometryChange(shared_ptr packet) +{ + shared_ptr e = getEntity(packet->id); + if (e == NULL) return; + shared_ptr player = dynamic_pointer_cast(e); + if( e == NULL) return; + + bool isLocalPlayer = false; + for( int i = 0; i < XUSER_MAX_COUNT; i++ ) + { + if( minecraft->localplayers[i] ) + { + if( minecraft->localplayers[i]->entityId == packet->id ) + { + isLocalPlayer = true; + break; + } + } + } + if(isLocalPlayer) return; + + + player->setCustomSkin( app.getSkinIdFromPath( packet->path ) ); + +#ifndef _CONTENT_PACKAGE + wprintf(L"Skin for remote 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( minecraft->addPendingClientTextureRequest(packet->path) ) + { +#ifndef _CONTENT_PACKAGE + wprintf(L"handleTextureAndGeometryChange - Client sending TextureAndGeometryPacket to get custom skin %ls for player %ls\n",packet->path.c_str(), player->name.c_str()); +#endif + send(shared_ptr( new TextureAndGeometryPacket(packet->path,NULL,0) ) ); + } + } + else if(!packet->path.empty() && app.IsFileInMemoryTextures(packet->path)) + { + // Update the ref count on the memory texture data + app.AddMemoryTextureFile(packet->path,NULL,0); + + } +} + +void ClientConnection::handleRespawn(shared_ptr packet) +{ + //if (packet->dimension != minecraft->player->dimension) + if( packet->dimension != minecraft->localplayers[m_userIndex]->dimension || packet->mapSeed != minecraft->localplayers[m_userIndex]->level->getSeed() ) + { + int oldDimension = minecraft->localplayers[m_userIndex]->dimension; + started = false; + + // Remove client connection from this level + level->removeClientConnection(this, false); + + MultiPlayerLevel *dimensionLevel = (MultiPlayerLevel *)minecraft->getLevel( packet->dimension ); + if( dimensionLevel == NULL ) + { + dimensionLevel = new MultiPlayerLevel(this, new LevelSettings(packet->mapSeed, packet->playerGameType, false, minecraft->level->getLevelData()->isHardcore(), packet->m_newSeaLevel, packet->m_pLevelType, packet->m_xzSize, packet->m_hellScale), packet->dimension, packet->difficulty); + + // 4J Stu - We want to shared the savedDataStorage between both levels + //if( dimensionLevel->savedDataStorage != NULL ) + //{ + // Don't need to delete it here as it belongs to a client connection while will delete it when it's done + // delete dimensionLevel->savedDataStorage;+ + //} + dimensionLevel->savedDataStorage = level->savedDataStorage; + + dimensionLevel->difficulty = packet->difficulty; // 4J Added + app.DebugPrintf("dimensionLevel->difficulty - Difficulty = %d\n",packet->difficulty); + + dimensionLevel->isClientSide = true; + } + else + { + dimensionLevel->addClientConnection(this); + } + + // Remove the player entity from the current level + level->removeEntity( shared_ptr(minecraft->localplayers[m_userIndex]) ); + + level = dimensionLevel; + + // Whilst calling setLevel, make sure that minecraft::player is set up to be correct for this + // connection + shared_ptr lastPlayer = minecraft->player; + minecraft->player = minecraft->localplayers[m_userIndex]; + minecraft->setLevel(dimensionLevel); + minecraft->player = lastPlayer; + + TelemetryManager->RecordLevelExit(m_userIndex, eSen_LevelExitStatus_Succeeded); + + //minecraft->player->dimension = packet->dimension; + minecraft->localplayers[m_userIndex]->dimension = packet->dimension; + //minecraft->setScreen(new ReceivingLevelScreen(this)); +// minecraft->addPendingLocalConnection(m_userIndex, this); + +#ifdef _XBOX + TelemetryManager->RecordLevelStart(m_userIndex, eSen_FriendOrMatch_Playing_With_Invited_Friends, eSen_CompeteOrCoop_Coop_and_Competitive, Minecraft::GetInstance()->getLevel(packet->dimension)->difficulty, app.GetLocalPlayerCount(), g_NetworkManager.GetOnlinePlayerCount()); +#endif + + if( minecraft->localgameModes[m_userIndex] != NULL ) + { + TutorialMode *gameMode = (TutorialMode *)minecraft->localgameModes[m_userIndex]; + gameMode->getTutorial()->showTutorialPopup(false); + } + + // 4J-JEV: Fix for Durango #156334 - Content: UI: Rich Presence 'In the Nether' message is updating with a 3 to 10 minute delay. + minecraft->localplayers[m_userIndex]->updateRichPresence(); + + ConnectionProgressParams *param = new ConnectionProgressParams(); + param->iPad = m_userIndex; + if( packet->dimension == -1) + { + param->stringId = IDS_PROGRESS_ENTERING_NETHER; + } + else if( oldDimension == -1) + { + param->stringId = IDS_PROGRESS_LEAVING_NETHER; + } + else if( packet->dimension == 1) + { + param->stringId = IDS_PROGRESS_ENTERING_END; + } + else if( oldDimension == 1) + { + param->stringId = IDS_PROGRESS_LEAVING_END; + } + param->showTooltips = false; + param->setFailTimer = false; + + // 4J Stu - Fix for #13543 - Crash: Game crashes if entering a portal with the inventory menu open + ui.CloseUIScenes( m_userIndex ); + + if(app.GetLocalPlayerCount()>1) + { + ui.NavigateToScene(m_userIndex, eUIScene_ConnectingProgress, param); + } + else + { + ui.NavigateToScene(m_userIndex, eUIScene_ConnectingProgress, param); + } + + app.SetAction( m_userIndex, eAppAction_WaitForDimensionChangeComplete); + } + + //minecraft->respawnPlayer(minecraft->player->GetXboxPad(),true, packet->dimension); + + // Wrap respawnPlayer call up in code to set & restore the player/gamemode etc. as some things + // in there assume that we are set up for the player that the respawn is coming in for + int oldIndex = minecraft->getLocalPlayerIdx(); + minecraft->setLocalPlayerIdx(m_userIndex); + minecraft->respawnPlayer(minecraft->localplayers[m_userIndex]->GetXboxPad(),packet->dimension,packet->m_newEntityId); + ((MultiPlayerGameMode *) minecraft->localgameModes[m_userIndex])->setLocalMode(packet->playerGameType); + minecraft->setLocalPlayerIdx(oldIndex); +} + +void ClientConnection::handleExplosion(shared_ptr packet) +{ + if(!packet->m_bKnockbackOnly) + { + //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); + 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. + // The changes we are making here have been decided by the server, so we don't need to add them to the vector that resets tiles changes made + // on the client as we KNOW that the server is matching these changes + MultiPlayerLevel *mpLevel = (MultiPlayerLevel *)minecraft->level; + mpLevel->enableResetChanges(false); + // 4J - now directly pass a pointer to the toBlow array in the packet rather than copying around + e->finalizeExplosion(true, &packet->toBlow); + mpLevel->enableResetChanges(true); + PIXEndNamedEvent(); + PIXEndNamedEvent(); + delete e; + } + else + { + //app.DebugPrintf("Received ExplodePacket with knockback only data\n"); + } + + //app.DebugPrintf("Adding knockback (%f,%f,%f) for player %d\n", packet->getKnockbackX(), packet->getKnockbackY(), packet->getKnockbackZ(), m_userIndex); + minecraft->localplayers[m_userIndex]->xd += packet->getKnockbackX(); + minecraft->localplayers[m_userIndex]->yd += packet->getKnockbackY(); + minecraft->localplayers[m_userIndex]->zd += packet->getKnockbackZ(); +} + +void ClientConnection::handleContainerOpen(shared_ptr packet) +{ + bool failed = false; + 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: + { + 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; + } + else + { + failed = true; + } + } + break; + case ContainerOpenPacket::FURNACE: + { + shared_ptr furnace = shared_ptr(new FurnaceTileEntity()); + if (packet->customName) furnace->setCustomName(packet->title); + if(player->openFurnace(furnace)) + { + player->containerMenu->containerId = packet->containerId; + } + else + { + failed = true; + } + } + break; + case ContainerOpenPacket::BREWING_STAND: + { + shared_ptr brewingStand = shared_ptr(new BrewingStandTileEntity()); + if (packet->customName) brewingStand->setCustomName(packet->title); + + if( player->openBrewingStand(brewingStand)) + { + player->containerMenu->containerId = packet->containerId; + } + else + { + failed = true; + } + } + 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: + { + shared_ptr dispenser = shared_ptr(new DispenserTileEntity()); + if (packet->customName) dispenser->setCustomName(packet->title); + + if( player->openTrap(dispenser)) + { + player->containerMenu->containerId = packet->containerId; + } + else + { + failed = true; + } + } + break; + case ContainerOpenPacket::WORKBENCH: + { + if( player->startCrafting(Mth::floor(player->x), Mth::floor(player->y), Mth::floor(player->z)) ) + { + player->containerMenu->containerId = packet->containerId; + } + else + { + failed = true; + } + } + break; + case ContainerOpenPacket::ENCHANTMENT: + { + 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; + } + else + { + failed = true; + } + } + break; + case ContainerOpenPacket::TRADER_NPC: + { + shared_ptr csm = shared_ptr(new ClientSideMerchant(player, packet->title)); + csm->createContainer(); + if(player->openTrading(csm, packet->customName ? packet->title : L"")) + { + player->containerMenu->containerId = packet->containerId; + } + else + { + failed = true; + } + } + 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))) + { + player->containerMenu->containerId = packet->containerId; + } + else + { + failed = true; + } + } + 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) + { + // Failed - if we've got a non-inventory container currently here, close that, which locally should put us back + // to not having a container open, and should send a containerclose to the server so it doesn't have a container open. + // If we don't have a non-inventory container open, just send the packet, and again we ought to be in sync with the server. + if( player->containerMenu != player->inventoryMenu ) + { + ui.CloseUIScenes(m_userIndex); + } + else + { + send(shared_ptr(new ContainerClosePacket(packet->containerId))); + } + } +} + +void ClientConnection::handleContainerSetSlot(shared_ptr packet) +{ + shared_ptr player = minecraft->localplayers[m_userIndex]; + if (packet->containerId == AbstractContainerMenu::CONTAINER_ID_CARRIED ) + { + player->inventory->setCarried(packet->item); + } + else + { + 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) + { + shared_ptr lastItem = player->inventoryMenu->getSlot(packet->slot)->getItem(); + if (packet->item != NULL) + { + if (lastItem == NULL || lastItem->count < packet->item->count) + { + packet->item->popTime = Inventory::POP_TIME_DURATION; + } + } + } + player->inventoryMenu->setItem(packet->slot, packet->item); + } + else if (packet->containerId == player->containerMenu->containerId) + { + 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) + { + menu = player->inventoryMenu; + } + else if (packet->containerId == player->containerMenu->containerId) + { + menu = player->containerMenu; + } + if (menu != NULL) + { + if (!packet->accepted) + { + 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) + { + player->inventoryMenu->setAll(&packet->items); + } + else if (packet->containerId == player->containerMenu->containerId) + { + 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)) + { + 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) + { + 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(); + } + else + { + app.DebugPrintf("dynamic_pointer_cast(te) == NULL\n"); + } + } + else + { + app.DebugPrintf("hasChunkAt failed\n"); + } +} + +void ClientConnection::handleTileEntityData(shared_ptr packet) +{ + if (minecraft->level->hasChunkAt(packet->x, packet->y, packet->z)) + { + shared_ptr te = minecraft->level->getTileEntity(packet->x, packet->y, packet->z); + + if (te != NULL) + { + if (packet->type == TileEntityDataPacket::TYPE_MOB_SPAWNER && dynamic_pointer_cast(te) != NULL) + { + dynamic_pointer_cast(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); + } + } + } +} + +void ClientConnection::handleContainerSetData(shared_ptr packet) +{ + 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); + } +} + +void ClientConnection::handleSetEquippedItem(shared_ptr packet) +{ + 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() ); + } +} + +void ClientConnection::handleContainerClose(shared_ptr packet) +{ + minecraft->localplayers[m_userIndex]->clientSideCloseContainer(); +} + +void ClientConnection::handleTileEvent(shared_ptr packet) +{ + PIXBeginNamedEvent(0,"Handle tile event\n"); + minecraft->level->tileEvent(packet->x, packet->y, packet->z, packet->tile, packet->b0, packet->b1); + PIXEndNamedEvent(); +} + +void ClientConnection::handleTileDestruction(shared_ptr packet) +{ + minecraft->level->destroyTileProgress(packet->getEntityId(), packet->getX(), packet->getY(), packet->getZ(), packet->getState()); +} + +bool ClientConnection::canHandleAsyncPackets() +{ + return minecraft != NULL && minecraft->level != NULL && minecraft->localplayers[m_userIndex] != NULL && level != NULL; +} + +void ClientConnection::handleGameEvent(shared_ptr gameEventPacket) +{ + int event = gameEventPacket->_event; + int param = gameEventPacket->param; + if (event >= 0 && event < GameEventPacket::EVENT_LANGUAGE_ID_LENGTH) + { + 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) + { + level->getLevelData()->setRaining(true); + level->setRainLevel(1); + } + else if (event == GameEventPacket::STOP_RAINING) + { + level->getLevelData()->setRaining(false); + level->setRainLevel(0); + } + else if (event == GameEventPacket::CHANGE_GAME_MODE) + { + minecraft->localgameModes[m_userIndex]->setLocalMode(GameType::byId(param)); + } + else if (event == GameEventPacket::WIN_GAME) + { + ui.SetWinUserIndex( (BYTE)gameEventPacket->param ); + +#ifdef _XBOX + + // turn off the gamertags in splitscreen for the primary player, since they are about to be made fullscreen + ui.HideAllGameUIElements(); + + // Hide the other players scenes + ui.ShowOtherPlayersBaseScene(ProfileManager.GetPrimaryPad(), false); + + // This just allows it to be shown + if(minecraft->localgameModes[ProfileManager.GetPrimaryPad()] != NULL) minecraft->localgameModes[ProfileManager.GetPrimaryPad()]->getTutorial()->showTutorialPopup(false); + // Temporarily make this scene fullscreen + CXuiSceneBase::SetPlayerBaseScenePosition( ProfileManager.GetPrimaryPad(), CXuiSceneBase::e_BaseScene_Fullscreen ); + + app.CloseXuiScenesAndNavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_EndPoem); +#else + app.DebugPrintf("handleGameEvent packet for WIN_GAME - %d\n", m_userIndex); + // This just allows it to be shown + if(minecraft->localgameModes[ProfileManager.GetPrimaryPad()] != NULL) minecraft->localgameModes[ProfileManager.GetPrimaryPad()]->getTutorial()->showTutorialPopup(false); + ui.NavigateToScene(ProfileManager.GetPrimaryPad(), eUIScene_EndPoem, NULL, eUILayer_Scene, eUIGroup_Fullscreen); +#endif + } + else if( event == GameEventPacket::START_SAVING ) + { + if(!g_NetworkManager.IsHost()) + { + // Move app started to here so that it happens immediately otherwise back-to-back START/STOP packets + // leave the client stuck in the loading screen + app.SetGameStarted(false); + app.SetAction( ProfileManager.GetPrimaryPad(), eAppAction_RemoteServerSave ); + } + } + else if( event == GameEventPacket::STOP_SAVING ) + { + 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) +{ + if (packet->itemType == Item::map->id) + { + MapItem::getSavedData(packet->itemId, minecraft->level)->handleComplexItemData(packet->data); + } + else + { +// System.out.println("Unknown itemid: " + packet->itemId); // 4J removed + } +} + + + +void ClientConnection::handleLevelEvent(shared_ptr packet) +{ + if (packet->type == LevelEvent::SOUND_DRAGON_DEATH) + { + 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) + { + minecraft->localplayers[i]->awardStat(GenericStats::completeTheEnd(),GenericStats::param_noArgs()); + } + } + } + + 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) +{ + minecraft->localplayers[m_userIndex]->awardStatFromServer(GenericStats::stat(packet->statId), packet->getParamData()); +} + +void ClientConnection::handleUpdateMobEffect(shared_ptr packet) +{ + shared_ptr e = getEntity(packet->entityId); + if ( (e == NULL) || !e->instanceof(eTYPE_LIVINGENTITY) ) return; + + //( 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) || !e->instanceof(eTYPE_LIVINGENTITY) ) return; + + ( dynamic_pointer_cast(e) )->removeEffectNoUpdate(packet->effectId); +} + +bool ClientConnection::isServerPacketListener() +{ + return false; +} + +void ClientConnection::handlePlayerInfo(shared_ptr packet) +{ + unsigned int startingPrivileges = app.GetPlayerPrivileges(packet->m_networkSmallId); + + INetworkPlayer *networkPlayer = g_NetworkManager.GetPlayerBySmallId(packet->m_networkSmallId); + + if(networkPlayer != NULL && networkPlayer->IsHost()) + { + // Some settings should always be considered on for the host player + Player::enableAllPlayerPrivileges(startingPrivileges,true); + Player::setPlayerGamePrivilege(startingPrivileges,Player::ePlayerGamePrivilege_HOST,1); + } + + // 4J Stu - Repurposed this packet for player info that we want + app.UpdatePlayerInfo(packet->m_networkSmallId, packet->m_playerColourIndex, packet->m_playerPrivileges); + + shared_ptr entity = getEntity(packet->m_entityId); + if(entity != NULL && entity->instanceof(eTYPE_PLAYER)) + { + shared_ptr player = dynamic_pointer_cast(entity); + player->setPlayerGamePrivilege(Player::ePlayerGamePrivilege_All, packet->m_playerPrivileges); + } + if(networkPlayer != NULL && networkPlayer->IsLocal()) + { + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + shared_ptr localPlayer = minecraft->localplayers[i]; + if(localPlayer != NULL && localPlayer->connection != NULL && localPlayer->connection->getNetworkPlayer() == networkPlayer ) + { + localPlayer->setPlayerGamePrivilege(Player::ePlayerGamePrivilege_All,packet->m_playerPrivileges); + displayPrivilegeChanges(localPlayer,startingPrivileges); + break; + } + } + } + + // 4J Stu - I don't think we care about this, so not converting it (came from 1.8.2) +#if 0 + PlayerInfo pi = playerInfoMap.get(packet.name); + if (pi == null && packet.add) { + pi = new PlayerInfo(packet.name); + playerInfoMap.put(packet.name, pi); + playerInfos.add(pi); + } + if (pi != null && !packet.add) { + playerInfoMap.remove(packet.name); + playerInfos.remove(pi); + } + if (packet.add && pi != null) { + pi.latency = packet.latency; + } +#endif +} + + +void ClientConnection::displayPrivilegeChanges(shared_ptr player, unsigned int oldPrivileges) +{ + int userIndex = player->GetXboxPad(); + unsigned int newPrivileges = player->getAllPlayerGamePrivileges(); + Player::EPlayerGamePrivileges priv = (Player::EPlayerGamePrivileges)0; + bool privOn = false; + for(unsigned int i = 0; i < Player::ePlayerGamePrivilege_MAX; ++i) + { + priv = (Player::EPlayerGamePrivileges) i; + if( Player::getPlayerGamePrivilege(newPrivileges,priv) != Player::getPlayerGamePrivilege(oldPrivileges,priv)) + { + privOn = Player::getPlayerGamePrivilege(newPrivileges,priv); + wstring message = L""; + if(app.GetGameHostOption(eGameHostOption_TrustPlayers) == 0) + { + switch(priv) + { + case Player::ePlayerGamePrivilege_CannotMine: + if(privOn) message = app.GetString(IDS_PRIV_MINE_TOGGLE_ON); + else message = app.GetString(IDS_PRIV_MINE_TOGGLE_OFF); + break; + case Player::ePlayerGamePrivilege_CannotBuild: + if(privOn) message = app.GetString(IDS_PRIV_BUILD_TOGGLE_ON); + else message = app.GetString(IDS_PRIV_BUILD_TOGGLE_OFF); + break; + case Player::ePlayerGamePrivilege_CanUseDoorsAndSwitches: + if(privOn) message = app.GetString(IDS_PRIV_USE_DOORS_TOGGLE_ON); + else message = app.GetString(IDS_PRIV_USE_DOORS_TOGGLE_OFF); + break; + case Player::ePlayerGamePrivilege_CanUseContainers: + if(privOn) message = app.GetString(IDS_PRIV_USE_CONTAINERS_TOGGLE_ON); + else message = app.GetString(IDS_PRIV_USE_CONTAINERS_TOGGLE_OFF); + break; + case Player::ePlayerGamePrivilege_CannotAttackAnimals: + if(privOn) message = app.GetString(IDS_PRIV_ATTACK_ANIMAL_TOGGLE_ON); + else message = app.GetString(IDS_PRIV_ATTACK_ANIMAL_TOGGLE_OFF); + break; + case Player::ePlayerGamePrivilege_CannotAttackMobs: + if(privOn) message = app.GetString(IDS_PRIV_ATTACK_MOB_TOGGLE_ON); + else message = app.GetString(IDS_PRIV_ATTACK_MOB_TOGGLE_OFF); + break; + case Player::ePlayerGamePrivilege_CannotAttackPlayers: + if(privOn) message = app.GetString(IDS_PRIV_ATTACK_PLAYER_TOGGLE_ON); + else message = app.GetString(IDS_PRIV_ATTACK_PLAYER_TOGGLE_OFF); + break; + }; + } + switch(priv) + { + case Player::ePlayerGamePrivilege_Op: + if(privOn) message = app.GetString(IDS_PRIV_MODERATOR_TOGGLE_ON); + else message = app.GetString(IDS_PRIV_MODERATOR_TOGGLE_OFF); + break; + }; + if(app.GetGameHostOption(eGameHostOption_CheatsEnabled) != 0) + { + switch(priv) + { + case Player::ePlayerGamePrivilege_CanFly: + if(privOn) message = app.GetString(IDS_PRIV_FLY_TOGGLE_ON); + else message = app.GetString(IDS_PRIV_FLY_TOGGLE_OFF); + break; + case Player::ePlayerGamePrivilege_ClassicHunger: + if(privOn) message = app.GetString(IDS_PRIV_EXHAUSTION_TOGGLE_ON); + else message = app.GetString(IDS_PRIV_EXHAUSTION_TOGGLE_OFF); + break; + case Player::ePlayerGamePrivilege_Invisible: + if(privOn) message = app.GetString(IDS_PRIV_INVISIBLE_TOGGLE_ON); + else message = app.GetString(IDS_PRIV_INVISIBLE_TOGGLE_OFF); + break; + case Player::ePlayerGamePrivilege_Invulnerable: + if(privOn) message = app.GetString(IDS_PRIV_INVULNERABLE_TOGGLE_ON); + else message = app.GetString(IDS_PRIV_INVULNERABLE_TOGGLE_OFF); + break; + case Player::ePlayerGamePrivilege_CanToggleInvisible: + if(privOn) message = app.GetString(IDS_PRIV_CAN_INVISIBLE_TOGGLE_ON); + else message = app.GetString(IDS_PRIV_CAN_INVISIBLE_TOGGLE_OFF); + break; + case Player::ePlayerGamePrivilege_CanToggleFly: + if(privOn) message = app.GetString(IDS_PRIV_CAN_FLY_TOGGLE_ON); + else message = app.GetString(IDS_PRIV_CAN_FLY_TOGGLE_OFF); + break; + case Player::ePlayerGamePrivilege_CanToggleClassicHunger: + if(privOn) message = app.GetString(IDS_PRIV_CAN_EXHAUSTION_TOGGLE_ON); + else message = app.GetString(IDS_PRIV_CAN_EXHAUSTION_TOGGLE_OFF); + break; + case Player::ePlayerGamePrivilege_CanTeleport: + if(privOn) message = app.GetString(IDS_PRIV_CAN_TELEPORT_TOGGLE_ON); + else message = app.GetString(IDS_PRIV_CAN_TELEPORT_TOGGLE_OFF); + break; + }; + } + if(!message.empty()) minecraft->gui->addMessage(message,userIndex); + } + } +} + +void ClientConnection::handleKeepAlive(shared_ptr packet) +{ + send(shared_ptr(new KeepAlivePacket(packet->id))); +} + +void ClientConnection::handlePlayerAbilities(shared_ptr playerAbilitiesPacket) +{ + shared_ptr player = minecraft->localplayers[m_userIndex]; + player->abilities.flying = playerAbilitiesPacket->isFlying(); + player->abilities.instabuild = playerAbilitiesPacket->canInstabuild(); + 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(), false); +} + +void ClientConnection::handleCustomPayload(shared_ptr customPayloadPacket) +{ + if (CustomPayloadPacket::TRADER_LIST_PACKET.compare(customPayloadPacket->identifier) == 0) + { + ByteArrayInputStream bais(customPayloadPacket->data); + DataInputStream input(&bais); + int containerId = input.readInt(); + if (ui.IsSceneInStack(m_userIndex, eUIScene_TradingMenu) && containerId == minecraft->localplayers[m_userIndex]->containerMenu->containerId) + { + shared_ptr trader = nullptr; + +#ifdef _XBOX + HXUIOBJ scene = app.GetCurrentScene(m_userIndex); + HXUICLASS thisClass = XuiFindClass( L"CXuiSceneTrading" ); + HXUICLASS objClass = XuiGetObjectClass( scene ); + + // Also returns TRUE if they are the same (which is what we want) + if( XuiClassDerivesFrom( objClass, thisClass ) ) + { + CXuiSceneTrading *screen; + HRESULT hr = XuiObjectFromHandle(scene, (void **) &screen); + if (FAILED(hr)) return; + trader = screen->getMerchant(); + } +#else + UIScene *scene = ui.GetTopScene(m_userIndex, eUILayer_Scene); + UIScene_TradingMenu *screen = (UIScene_TradingMenu *)scene; + trader = screen->getMerchant(); +#endif + + MerchantRecipeList *recipeList = MerchantRecipeList::createFromStream(&input); + trader->overrideOffers(recipeList); + } + } +} + +Connection *ClientConnection::getConnection() +{ + return connection; +} + +// 4J Added +void ClientConnection::handleServerSettingsChanged(shared_ptr packet) +{ + if(packet->action==ServerSettingsChangedPacket::HOST_IN_GAME_SETTINGS) + { + app.SetGameHostOption(eGameHostOption_All, packet->data); + } + else if(packet->action==ServerSettingsChangedPacket::HOST_DIFFICULTY) + { + for(unsigned int i = 0; i < minecraft->levels.length; ++i) + { + if( minecraft->levels[i] != NULL ) + { + app.DebugPrintf("ClientConnection::handleServerSettingsChanged - Difficulty = %d",packet->data); + minecraft->levels[i]->difficulty = packet->data; + } + } + } + else + { + //options + //minecraft->options->SetGamertagSetting((packet->data==0)?false:true); + app.SetGameHostOption(eGameHostOption_Gamertags, packet->data); + } + +} + +void ClientConnection::handleXZ(shared_ptr packet) +{ + if(packet->action==XZPacket::STRONGHOLD) + { + minecraft->levels[0]->getLevelData()->setXStronghold(packet->x); + minecraft->levels[0]->getLevelData()->setZStronghold(packet->z); + minecraft->levels[0]->getLevelData()->setHasStronghold(); + } +} + +void ClientConnection::handleUpdateProgress(shared_ptr packet) +{ + if(!g_NetworkManager.IsHost() ) Minecraft::GetInstance()->progressRenderer->progressStagePercentage( packet->m_percentage ); +} + +void ClientConnection::handleUpdateGameRuleProgressPacket(shared_ptr packet) +{ + LPCWSTR string = app.GetGameRulesString(packet->m_messageId); + if(string != NULL) + { + wstring message(string); + message = GameRuleDefinition::generateDescriptionString(packet->m_definitionType,message,packet->m_data.data,packet->m_data.length); + if(minecraft->localgameModes[m_userIndex]!=NULL) + { + minecraft->localgameModes[m_userIndex]->getTutorial()->setMessage(message, packet->m_icon, packet->m_auxValue); + } + } + // If this rule has a data tag associated with it, then we save that in user profile data + if(packet->m_dataTag > 0 && packet->m_dataTag <= 32) + { + app.DebugPrintf("handleUpdateGameRuleProgressPacket: Data tag is in range, so updating profile data\n"); + app.SetSpecialTutorialCompletionFlag(m_userIndex, packet->m_dataTag - 1); + } + delete [] packet->m_data.data; +} + +// 4J Stu - TU-1 hotfix +// Fix for #13191 - The host of a game can get a message informing them that the connection to the server has been lost +int ClientConnection::HostDisconnectReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + // 4J-PB - if they have a trial texture pack, they don't get to save the world + if(!Minecraft::GetInstance()->skins->isUsingDefaultSkin()) + { + TexturePack *tPack = Minecraft::GetInstance()->skins->getSelected(); + DLCTexturePack *pDLCTexPack=(DLCTexturePack *)tPack; + + DLCPack *pDLCPack=pDLCTexPack->getDLCInfoParentPack();//tPack->getDLCPack(); + if(!pDLCPack->hasPurchasedFile( DLCManager::e_DLCType_Texture, L"" )) + { + // no upsell, we're about to quit + MinecraftServer::getInstance()->setSaveOnExit( false ); + // flag a app action of exit game + app.SetAction(iPad,eAppAction_ExitWorld); + } + } + +#if defined(_XBOX_ONE) || defined(__ORBIS__) + // Give the player the option to save their game + // does the save exist? + bool bSaveExists; + StorageManager.DoesSaveExist(&bSaveExists); + // 4J-PB - we check if the save exists inside the libs + // we need to ask if they are sure they want to overwrite the existing game + if(bSaveExists && StorageManager.GetSaveDisabled()) + { + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + ui.RequestErrorMessage(IDS_TITLE_SAVE_GAME, IDS_CONFIRM_SAVE_GAME, uiIDA, 2, ProfileManager.GetPrimaryPad(),&ClientConnection::ExitGameAndSaveReturned,NULL); + } + else +#else + // Give the player the option to save their game + // does the save exist? + bool bSaveExists; + StorageManager.DoesSaveExist(&bSaveExists); + // 4J-PB - we check if the save exists inside the libs + // we need to ask if they are sure they want to overwrite the existing game + if(bSaveExists) + { + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + ui.RequestErrorMessage(IDS_TITLE_SAVE_GAME, IDS_CONFIRM_SAVE_GAME, uiIDA, 2, ProfileManager.GetPrimaryPad(),&ClientConnection::ExitGameAndSaveReturned,NULL); + } + else +#endif + { +#if defined(_XBOX_ONE) || defined(__ORBIS__) + StorageManager.SetSaveDisabled(false); +#endif + MinecraftServer::getInstance()->setSaveOnExit( true ); + // flag a app action of exit game + app.SetAction(iPad,eAppAction_ExitWorld); + } + + return 0; +} + +int ClientConnection::ExitGameAndSaveReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + // results switched for this dialog + if(result==C4JStorage::EMessage_ResultDecline) + { + //INT saveOrCheckpointId = 0; + //bool validSave = StorageManager.GetSaveUniqueNumber(&saveOrCheckpointId); + //SentientManager.RecordLevelSaveOrCheckpoint(ProfileManager.GetPrimaryPad(), saveOrCheckpointId); +#if defined(_XBOX_ONE) || defined(__ORBIS__) + StorageManager.SetSaveDisabled(false); +#endif + MinecraftServer::getInstance()->setSaveOnExit( true ); + } + else + { + MinecraftServer::getInstance()->setSaveOnExit( false ); + } + // flag a app action of exit game + app.SetAction(iPad,eAppAction_ExitWorld); + return 0; +} + +// +wstring ClientConnection::GetDisplayNameByGamertag(wstring gamertag) +{ +#ifdef _DURANGO + wstring displayName = g_NetworkManager.GetDisplayNameByGamertag(gamertag); + return displayName; +#else + 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 new file mode 100644 index 00000000..a80c10f7 --- /dev/null +++ b/Minecraft.Client/ClientConnection.h @@ -0,0 +1,166 @@ +#pragma once +#include "..\Minecraft.World\net.minecraft.network.h" +class Minecraft; +class MultiPlayerLevel; +class SavedDataStorage; +class Socket; +class MultiplayerLocalPlayer; + +class ClientConnection : public PacketListener +{ +private: + enum eClientConnectionConnectingState + { + eCCPreLoginSent = 0, + eCCPreLoginReceived, + eCCLoginSent, + eCCLoginReceived, + eCCConnected + }; + +private: + bool done; + Connection *connection; +public: + wstring message; + bool createdOk; // 4J added +private: + Minecraft *minecraft; + MultiPlayerLevel *level; + bool started; + + // 4J Stu - I don't think we are interested in the PlayerInfo data, so I'm not going to use it at the moment + //Map playerInfoMap = new HashMap(); +public: + //List playerInfos = new ArrayList(); + + int maxPlayers; + +public: + bool isStarted() { return started; } // 4J Added + bool isClosed() { return done; } // 4J Added + Socket *getSocket() { return connection->getSocket(); } // 4J Added + +private: + DWORD m_userIndex; // 4J Added +public: + SavedDataStorage *savedDataStorage; + ClientConnection(Minecraft *minecraft, const wstring& ip, int port); + ClientConnection(Minecraft *minecraft, Socket *socket, int iUserIndex = -1); + ~ClientConnection(); + void tick(); + INetworkPlayer *getNetworkPlayer(); + virtual void handleLogin(shared_ptr packet); + virtual void handleAddEntity(shared_ptr packet); + virtual void handleAddExperienceOrb(shared_ptr packet); + virtual void handleAddGlobalEntity(shared_ptr packet); + virtual void handleAddPainting(shared_ptr packet); + virtual void handleSetEntityMotion(shared_ptr packet); + virtual void handleSetEntityData(shared_ptr packet); + virtual void handleAddPlayer(shared_ptr packet); + virtual void handleTeleportEntity(shared_ptr packet); + virtual void handleSetCarriedItem(shared_ptr packet); + virtual void handleMoveEntity(shared_ptr packet); + virtual void handleRotateMob(shared_ptr packet); + virtual void handleMoveEntitySmall(shared_ptr packet); + virtual void handleRemoveEntity(shared_ptr packet); + virtual void handleMovePlayer(shared_ptr packet); + + Random *random; + + // 4J Added + virtual void handleChunkVisibilityArea(shared_ptr packet); + + virtual void handleChunkVisibility(shared_ptr packet); + virtual void handleChunkTilesUpdate(shared_ptr packet); + virtual void handleBlockRegionUpdate(shared_ptr packet); + virtual void handleTileUpdate(shared_ptr packet); + virtual void handleDisconnect(shared_ptr packet); + virtual void onDisconnect(DisconnectPacket::eDisconnectReason reason, void *reasonObjects); + void sendAndDisconnect(shared_ptr packet); + void send(shared_ptr packet); + virtual void handleTakeItemEntity(shared_ptr packet); + virtual void handleChat(shared_ptr packet); + virtual void handleAnimate(shared_ptr packet); + virtual void handleEntityActionAtPosition(shared_ptr packet); + virtual void handlePreLogin(shared_ptr packet); + void close(); + virtual void handleAddMob(shared_ptr packet); + virtual void handleSetTime(shared_ptr packet); + virtual void handleSetSpawn(shared_ptr packet); + virtual void handleEntityLinkPacket(shared_ptr packet); + virtual void handleEntityEvent(shared_ptr packet); +private: + shared_ptr getEntity(int entityId); + wstring GetDisplayNameByGamertag(wstring gamertag); +public: + virtual void handleSetHealth(shared_ptr packet); + virtual void handleSetExperience(shared_ptr packet); + virtual void handleRespawn(shared_ptr packet); + virtual void handleExplosion(shared_ptr packet); + virtual void handleContainerOpen(shared_ptr packet); + virtual void handleContainerSetSlot(shared_ptr packet); + virtual void handleContainerAck(shared_ptr packet); + virtual void handleContainerContent(shared_ptr packet); + virtual void handleTileEditorOpen(shared_ptr packet); + virtual void handleSignUpdate(shared_ptr packet); + virtual void handleTileEntityData(shared_ptr packet); + virtual void handleContainerSetData(shared_ptr packet); + virtual void handleSetEquippedItem(shared_ptr packet); + virtual void handleContainerClose(shared_ptr packet); + virtual void handleTileEvent(shared_ptr packet); + virtual void handleTileDestruction(shared_ptr packet); + virtual bool canHandleAsyncPackets(); + virtual void handleGameEvent(shared_ptr gameEventPacket); + virtual void handleComplexItemData(shared_ptr packet); + virtual void handleLevelEvent(shared_ptr packet); + virtual void handleAwardStat(shared_ptr packet); + virtual void handleUpdateMobEffect(shared_ptr packet); + virtual void handleRemoveMobEffect(shared_ptr packet); + virtual bool isServerPacketListener(); + virtual void handlePlayerInfo(shared_ptr packet); + virtual void handleKeepAlive(shared_ptr packet); + virtual void handlePlayerAbilities(shared_ptr playerAbilitiesPacket); + virtual void handleSoundEvent(shared_ptr packet); + virtual void handleCustomPayload(shared_ptr customPayloadPacket); + virtual Connection *getConnection(); + + // 4J Added + virtual void handleServerSettingsChanged(shared_ptr packet); + virtual void handleTexture(shared_ptr packet); + virtual void handleTextureAndGeometry(shared_ptr packet); + virtual void handleUpdateProgress(shared_ptr packet); + + // 4J Added + static int HostDisconnectReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int ExitGameAndSaveReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + virtual void handleTextureChange(shared_ptr packet); + virtual void handleTextureAndGeometryChange(shared_ptr packet); + virtual void handleUpdateGameRuleProgressPacket(shared_ptr packet); + 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/ClientConstants.cpp b/Minecraft.Client/ClientConstants.cpp new file mode 100644 index 00000000..41c4b125 --- /dev/null +++ b/Minecraft.Client/ClientConstants.cpp @@ -0,0 +1,4 @@ +#include "stdafx.h" +#include "ClientConstants.h" + +const wstring ClientConstants::VERSION_STRING = wstring(L"Minecraft Xbox ") + VER_FILEVERSION_STR_W;//+ SharedConstants::VERSION_STRING; \ No newline at end of file diff --git a/Minecraft.Client/ClientConstants.h b/Minecraft.Client/ClientConstants.h new file mode 100644 index 00000000..82bba386 --- /dev/null +++ b/Minecraft.Client/ClientConstants.h @@ -0,0 +1,18 @@ +#pragma once +using namespace std; + +class ClientConstants +{ + + // This file holds global constants used by the client. + // The file should be replaced at compile-time with the + // proper settings for the given compilation. For example, + // release builds should replace this file with no-cheat + // settings. + + // INTERNAL DEVELOPMENT SETTINGS +public: + static const wstring VERSION_STRING; + + static const bool DEADMAU5_CAMERA_CHEATS = false; +}; \ No newline at end of file diff --git a/Minecraft.Client/ClockTexture.cpp b/Minecraft.Client/ClockTexture.cpp new file mode 100644 index 00000000..837532fb --- /dev/null +++ b/Minecraft.Client/ClockTexture.cpp @@ -0,0 +1,119 @@ +#include "stdafx.h" +#include "Minecraft.h" +#include "..\Minecraft.World\net.minecraft.world.level.h" +#include "..\Minecraft.World\net.minecraft.world.level.dimension.h" +#include "MultiplayerLocalPlayer.h" +#include "..\Minecraft.World\JavaMath.h" +#include "Texture.h" +#include "ClockTexture.h" + +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"clock", L"clock") +{ + rot = rota = 0.0; + m_dataTexture = dataTexture; + m_iPad = iPad; +} + +void ClockTexture::cycleFrames() +{ + + Minecraft *mc = Minecraft::GetInstance(); + + double rott = 0; + if (m_iPad >= 0 && m_iPad < XUSER_MAX_COUNT && mc->level != NULL && mc->localplayers[m_iPad] != NULL) + { + float time = mc->localplayers[m_iPad]->level->getTimeOfDay(1); + rott = time; + if (!mc->localplayers[m_iPad]->level->dimension->isNaturalDimension()) + { + rott = Math::random(); + } + } + else + { + // 4J Stu - For the static version, pretend we are already on a frame other than 0 + frame = 1; + } + + double rotd = rott - rot; + while (rotd < -.5) + rotd += 1.0; + while (rotd >= .5) + rotd -= 1.0; + if (rotd < -1) rotd = -1; + if (rotd > 1) rotd = 1; + rota += rotd * 0.1; + rota *= 0.8; + + rot += rota; + + // 4J Stu - We share data with another texture + if(m_dataTexture != NULL) + { + int newFrame = (int) ((rot + 1.0) * m_dataTexture->frames->size()) % m_dataTexture->frames->size(); + while (newFrame < 0) + { + newFrame = (newFrame + m_dataTexture->frames->size()) % m_dataTexture->frames->size(); + } + if (newFrame != frame) + { + frame = newFrame; + m_dataTexture->source->blit(x, y, m_dataTexture->frames->at(this->frame), rotated); + } + } + else + { + int newFrame = (int) ((rot + 1.0) * frames->size()) % frames->size(); + while (newFrame < 0) + { + newFrame = (newFrame + frames->size()) % frames->size(); + } + if (newFrame != frame) + { + frame = newFrame; + source->blit(x, y, frames->at(this->frame), rotated); + } + } +} + +int ClockTexture::getSourceWidth() const +{ + return source->getWidth(); +} + +int ClockTexture::getSourceHeight() const +{ + return source->getHeight(); +} + +int ClockTexture::getFrames() +{ + if(m_dataTexture == NULL) + { + return StitchedTexture::getFrames(); + } + else + { + return m_dataTexture->getFrames(); + } +} + +void ClockTexture::freeFrameTextures() +{ + if(m_dataTexture == NULL) + { + StitchedTexture::freeFrameTextures(); + } +} + +bool ClockTexture::hasOwnData() +{ + return m_dataTexture == NULL; +} \ No newline at end of file diff --git a/Minecraft.Client/ClockTexture.h b/Minecraft.Client/ClockTexture.h new file mode 100644 index 00000000..e042887c --- /dev/null +++ b/Minecraft.Client/ClockTexture.h @@ -0,0 +1,21 @@ +#pragma once +#include "StitchedTexture.h" + +class ClockTexture : public StitchedTexture +{ +private: + double rot, rota; + int m_iPad; + ClockTexture* m_dataTexture; + +public: + ClockTexture(); + ClockTexture(int iPad, ClockTexture *dataTexture); + void cycleFrames(); + + virtual int getSourceWidth() const; + virtual int getSourceHeight() const; + virtual int getFrames(); + virtual void freeFrameTextures(); // 4J added + virtual bool hasOwnData(); // 4J Added +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/App_Defines.h b/Minecraft.Client/Common/App_Defines.h new file mode 100644 index 00000000..7e96896c --- /dev/null +++ b/Minecraft.Client/Common/App_Defines.h @@ -0,0 +1,156 @@ +#pragma once + + +// 4J Stu - For non-splitscreen menus, default to this screen +#define DEFAULT_XUI_MENU_USER 0 +#define MULTITHREAD_ENABLE +#define MAX_CAPENAME_SIZE 32 +#define MAX_BANNERNAME_SIZE 32 +#define MAX_TMSFILENAME_SIZE 40 +#define MAX_TYPE_SIZE 32 +#define MAX_EXTENSION_TYPES 3 + +#ifdef __PSVITA__ +#define MAX_LOCAL_PLAYERS 1 +#else +#define MAX_LOCAL_PLAYERS 4 +#endif + +// 4J Stu - Required for sentient reporting of whether the volume level has been changed or not +#define DEFAULT_VOLUME_LEVEL 100 + +#define GAME_HOST_OPTION_BITMASK_DIFFICULTY 0x00000003 // 0 - 3 +#define GAME_HOST_OPTION_BITMASK_FRIENDSOFFRIENDS 0x00000004 +#define GAME_HOST_OPTION_BITMASK_GAMERTAGS 0x00000008 +#define GAME_HOST_OPTION_BITMASK_GAMETYPE 0x00000030 +#define GAME_HOST_OPTION_BITMASK_LEVELTYPE 0x00000040 +#define GAME_HOST_OPTION_BITMASK_STRUCTURES 0x00000080 +#define GAME_HOST_OPTION_BITMASK_BONUSCHEST 0x00000100 +#define GAME_HOST_OPTION_BITMASK_BEENINCREATIVE 0x00000200 +#define GAME_HOST_OPTION_BITMASK_PVP 0x00000400 +#define GAME_HOST_OPTION_BITMASK_TRUSTPLAYERS 0x00000800 +#define GAME_HOST_OPTION_BITMASK_TNT 0x00001000 +#define GAME_HOST_OPTION_BITMASK_FIRESPREADS 0x00002000 +#define GAME_HOST_OPTION_BITMASK_HOSTFLY 0x00004000 +#define GAME_HOST_OPTION_BITMASK_HOSTHUNGER 0x00008000 +#define GAME_HOST_OPTION_BITMASK_HOSTINVISIBLE 0x00010000 +#define GAME_HOST_OPTION_BITMASK_BEDROCKFOG 0x00020000 +#define GAME_HOST_OPTION_BITMASK_DISABLESAVE 0x00040000 +#define GAME_HOST_OPTION_BITMASK_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 +#define PROFILE_VERSION_3 3 +#define PROFILE_VERSION_4 4 +#define PROFILE_VERSION_5 6 +#define PROFILE_VERSION_6 7 +#define PROFILE_VERSION_7 8 +#endif +#define PROFILE_VERSION_8 10 +#define PROFILE_VERSION_9 11 + +#define PROFILE_VERSION_10 12 + +// 4J-JEV: New Statistics and Achievements for 'NexGen' platforms. +#define PROFILE_VERSION_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 + + + + + +// defines for game settings - uiBitmaskValues + +#define GAMESETTING_CLOUDS 0x00000001 +#define GAMESETTING_ONLINE 0x00000002 +#define GAMESETTING_INVITEONLY 0x00000004 +#define GAMESETTING_FRIENDSOFFRIENDS 0x00000008 +#define GAMESETTING_DISPLAYUPDATEMSG 0x00000030 +#define GAMESETTING_BEDROCKFOG 0x00000040 +#define GAMESETTING_DISPLAYHUD 0x00000080 +#define GAMESETTING_DISPLAYHAND 0x00000100 +#define GAMESETTING_CUSTOMSKINANIM 0x00000200 +#define GAMESETTING_DEATHMESSAGES 0x00000400 +#define GAMESETTING_UISIZE 0x00001800 +#define GAMESETTING_UISIZE_SPLITSCREEN 0x00006000 +#define GAMESETTING_ANIMATEDCHARACTER 0x00008000 +#define GAMESETTING_PS3EULAREAD 0x00010000 +#define GAMESETTING_PSVITANETWORKMODEADHOC 0x00020000 + + +// defines for languages + +#define MINECRAFT_LANGUAGE_DEFAULT 0x00 +#define MINECRAFT_LANGUAGE_ENGLISH 0x01 +#define MINECRAFT_LANGUAGE_JAPANESE 0x02 +#define MINECRAFT_LANGUAGE_GERMAN 0x03 +#define MINECRAFT_LANGUAGE_FRENCH 0x04 +#define MINECRAFT_LANGUAGE_SPANISH 0x05 +#define MINECRAFT_LANGUAGE_ITALIAN 0x06 +#define MINECRAFT_LANGUAGE_KOREAN 0x07 +#define MINECRAFT_LANGUAGE_TCHINESE 0x08 +#define MINECRAFT_LANGUAGE_PORTUGUESE 0x09 +#define MINECRAFT_LANGUAGE_BRAZILIAN 0x0A +#define MINECRAFT_LANGUAGE_RUSSIAN 0x0B +#define MINECRAFT_LANGUAGE_DUTCH 0x0C +#define MINECRAFT_LANGUAGE_FINISH 0x0D +#define MINECRAFT_LANGUAGE_SWEDISH 0x0E +#define MINECRAFT_LANGUAGE_DANISH 0x0F +#define MINECRAFT_LANGUAGE_NORWEGIAN 0x10 +#define MINECRAFT_LANGUAGE_POLISH 0x11 +#define MINECRAFT_LANGUAGE_TURKISH 0x12 +#define MINECRAFT_LANGUAGE_LATINAMERICANSPANISH 0x13 +#define MINECRAFT_LANGUAGE_GREEK 0x14 + + + /* Match these + + const int XC_LANGUAGE_ENGLISH =1; + const int XC_LANGUAGE_JAPANESE =2; + const int XC_LANGUAGE_GERMAN =3; + const int XC_LANGUAGE_FRENCH =4; + const int XC_LANGUAGE_SPANISH =5; + const int XC_LANGUAGE_ITALIAN =6; + const int XC_LANGUAGE_KOREAN =7; + const int XC_LANGUAGE_TCHINESE =8; + const int XC_LANGUAGE_PORTUGUESE =9; + const int XC_LANGUAGE_BRAZILIAN =10; + const int XC_LANGUAGE_RUSSIAN =11; + const int XC_LANGUAGE_DUTCH =12; + const int XC_LANGUAGE_FINISH =13; + const int XC_LANGUAGE_SWEDISH =14; + const int XC_LANGUAGE_DANISH =15; + const int XC_LANGUAGE_NORWEGIAN =16; + const int XC_LANGUAGE_POLISH =17; + const int XC_LANGUAGE_TURKISH =18; + const int XC_LANGUAGE_LATINAMERICANSPANISH =19; + const int XC_LANGUAGE_GREEK =20; + */ diff --git a/Minecraft.Client/Common/App_enums.h b/Minecraft.Client/Common/App_enums.h new file mode 100644 index 00000000..db7bf70b --- /dev/null +++ b/Minecraft.Client/Common/App_enums.h @@ -0,0 +1,948 @@ +#pragma once + +enum eFileExtensionType +{ + eFileExtensionType_PNG=0, + eFileExtensionType_INF, + eFileExtensionType_DAT, +}; + +enum eTMSFileType +{ + eTMSFileType_MinecraftStore=0, + eTMSFileType_TexturePack, + eTMSFileType_All +}; + +enum eTPDFileType +{ + eTPDFileType_Loc=0, + eTPDFileType_Icon, +// eTPDFileType_Banner, + eTPDFileType_Comparison, +}; + +enum eFont +{ + eFont_European=0, + eFont_Korean, + eFont_Japanese, + eFont_Chinese, + eFont_None, // to fallback to nothing +}; + +enum eXuiAction +{ + eAppAction_Idle=0, + eAppAction_SaveGame, + eAppAction_SaveGameCapturedThumbnail, + eAppAction_ExitWorld, + eAppAction_ExitWorldCapturedThumbnail, + eAppAction_ExitWorldTrial, + //eAppAction_ExitGameFatalLoadError, + eAppAction_Respawn, + eAppAction_WaitForRespawnComplete, + eAppAction_PrimaryPlayerSignedOut, + eAppAction_PrimaryPlayerSignedOutReturned, + eAppAction_PrimaryPlayerSignedOutReturned_Menus, + eAppAction_ExitPlayer, // secondary player + eAppAction_ExitPlayerPreLogin, + eAppAction_TrialOver, + eAppAction_ExitTrial, + eAppAction_WaitForDimensionChangeComplete, + eAppAction_SocialPost, + eAppAction_SocialPostScreenshot, + eAppAction_EthernetDisconnected, + eAppAction_EthernetDisconnectedReturned, + eAppAction_EthernetDisconnectedReturned_Menus, + eAppAction_ExitAndJoinFromInvite, + eAppAction_DashboardTrialJoinFromInvite, + eAppAction_ExitAndJoinFromInviteConfirmed, + eAppAction_JoinFromInvite, + eAppAction_ChangeSessionType, + eAppAction_SetDefaultOptions, + eAppAction_LocalPlayerJoined, + eAppAction_RemoteServerSave, + eAppAction_WaitRemoteServerSaveComplete, + eAppAction_FailedToJoinNoPrivileges, + eAppAction_AutosaveSaveGame, + eAppAction_AutosaveSaveGameCapturedThumbnail, + eAppAction_ProfileReadError, + eAppAction_DisplayLavaMessage, + eAppAction_BanLevel, + eAppAction_LevelInBanLevelList, + + eAppAction_ReloadTexturePack, + eAppAction_ReloadFont, + eAppAction_TexturePackRequired, // when the user has joined from invite, but doesn't have the texture pack + +#ifdef __ORBIS__ + eAppAction_OptionsSaveNoSpace, +#endif + eAppAction_DebugText, + +}; + + + +enum eTMSAction +{ + eTMSAction_Idle=0, + eTMSAction_TMS_RetrieveFiles_Complete, + eTMSAction_TMSPP_RetrieveFiles_CreateLoad_SignInReturned, + eTMSAction_TMSPP_RetrieveFiles_RunPlayGame, + eTMSAction_TMSPP_RetrieveFiles_HelpAndOptions, + eTMSAction_TMSPP_RetrieveFiles_DLCMain, + eTMSAction_TMSPP_GlobalFileList, + eTMSAction_TMSPP_GlobalFileList_Waiting, +// eTMSAction_TMSPP_ConfigFile, +// eTMSAction_TMSPP_ConfigFile_Waiting, + eTMSAction_TMSPP_UserFileList, + eTMSAction_TMSPP_UserFileList_Waiting, + eTMSAction_TMSPP_XUIDSFile, + eTMSAction_TMSPP_XUIDSFile_Waiting, + eTMSAction_TMSPP_DLCFile, + eTMSAction_TMSPP_DLCFile_Waiting, + eTMSAction_TMSPP_BannedListFile, + eTMSAction_TMSPP_BannedListFile_Waiting, + eTMSAction_TMSPP_RetrieveFiles_Complete, + eTMSAction_TMSPP_DLCFileOnly, + eTMSAction_TMSPP_RetrieveUserFilelist_DLCFileOnly, +}; + +// The server runs on its own thread, so we need to call its actions there rather than where all other Xui actions are performed +// In general these are debugging options +enum eXuiServerAction +{ + eXuiServerAction_Idle=0, + eXuiServerAction_DropItem, // Debug + eXuiServerAction_SaveGame, + eXuiServerAction_AutoSaveGame, + eXuiServerAction_SpawnMob, // Debug + eXuiServerAction_PauseServer, + eXuiServerAction_ToggleRain, // Debug + eXuiServerAction_ToggleThunder, // Debug + eXuiServerAction_ServerSettingChanged_Gamertags, + eXuiServerAction_ServerSettingChanged_Difficulty, + eXuiServerAction_ExportSchematic, //Debug + eXuiServerAction_ServerSettingChanged_BedrockFog, + eXuiServerAction_SetCameraLocation, //Debug +}; + +enum eGameSetting +{ + eGameSetting_MusicVolume=0, + eGameSetting_SoundFXVolume, + eGameSetting_Gamma, + eGameSetting_Difficulty, + eGameSetting_Sensitivity_InGame, + eGameSetting_Sensitivity_InMenu, + eGameSetting_ViewBob, + eGameSetting_ControlScheme, + eGameSetting_ControlInvertLook, + eGameSetting_ControlSouthPaw, + eGameSetting_SplitScreenVertical, + eGameSetting_GamertagsVisible, + // Interim TU 1.6.6 + eGameSetting_Autosave, + eGameSetting_DisplaySplitscreenGamertags, + eGameSetting_Hints, + eGameSetting_InterfaceOpacity, + eGameSetting_Tooltips, + // TU5 + eGameSetting_Clouds, + eGameSetting_Online, + eGameSetting_InviteOnly, + eGameSetting_FriendsOfFriends, + eGameSetting_DisplayUpdateMessage, + + // TU6 + eGameSetting_BedrockFog, + eGameSetting_DisplayHUD, + eGameSetting_DisplayHand, + + // TU7 + eGameSetting_CustomSkinAnim, + + // TU9 + eGameSetting_DeathMessages, + eGameSetting_UISize, + eGameSetting_UISizeSplitscreen, + eGameSetting_AnimatedCharacter, + + // PS3 + eGameSetting_PS3_EULA_Read, + + // PSVita + eGameSetting_PSVita_NetworkModeAdhoc, + + +}; + + + +enum eGameMode +{ + eMode_Singleplayer, + eMode_Multiplayer +}; + + +enum eMinecraftColour +{ + eMinecraftColour_NOT_SET, + + eMinecraftColour_Foliage_Evergreen, + eMinecraftColour_Foliage_Birch, + eMinecraftColour_Foliage_Default, + eMinecraftColour_Foliage_Common, + eMinecraftColour_Foliage_Ocean, + eMinecraftColour_Foliage_Plains, + eMinecraftColour_Foliage_Desert, + eMinecraftColour_Foliage_ExtremeHills, + eMinecraftColour_Foliage_Forest, + eMinecraftColour_Foliage_Taiga, + eMinecraftColour_Foliage_Swampland, + eMinecraftColour_Foliage_River, + eMinecraftColour_Foliage_Hell, + eMinecraftColour_Foliage_Sky, + eMinecraftColour_Foliage_FrozenOcean, + eMinecraftColour_Foliage_FrozenRiver, + eMinecraftColour_Foliage_IcePlains, + eMinecraftColour_Foliage_IceMountains, + eMinecraftColour_Foliage_MushroomIsland, + eMinecraftColour_Foliage_MushroomIslandShore, + eMinecraftColour_Foliage_Beach, + eMinecraftColour_Foliage_DesertHills, + eMinecraftColour_Foliage_ForestHills, + eMinecraftColour_Foliage_TaigaHills, + eMinecraftColour_Foliage_ExtremeHillsEdge, + eMinecraftColour_Foliage_Jungle, + eMinecraftColour_Foliage_JungleHills, + + eMinecraftColour_Grass_Common, + eMinecraftColour_Grass_Ocean, + eMinecraftColour_Grass_Plains, + eMinecraftColour_Grass_Desert, + eMinecraftColour_Grass_ExtremeHills, + eMinecraftColour_Grass_Forest, + eMinecraftColour_Grass_Taiga, + eMinecraftColour_Grass_Swampland, + eMinecraftColour_Grass_River, + eMinecraftColour_Grass_Hell, + eMinecraftColour_Grass_Sky, + eMinecraftColour_Grass_FrozenOcean, + eMinecraftColour_Grass_FrozenRiver, + eMinecraftColour_Grass_IcePlains, + eMinecraftColour_Grass_IceMountains, + eMinecraftColour_Grass_MushroomIsland, + eMinecraftColour_Grass_MushroomIslandShore, + eMinecraftColour_Grass_Beach, + eMinecraftColour_Grass_DesertHills, + eMinecraftColour_Grass_ForestHills, + eMinecraftColour_Grass_TaigaHills, + eMinecraftColour_Grass_ExtremeHillsEdge, + eMinecraftColour_Grass_Jungle, + eMinecraftColour_Grass_JungleHills, + + eMinecraftColour_Water_Ocean, + eMinecraftColour_Water_Plains, + eMinecraftColour_Water_Desert, + eMinecraftColour_Water_ExtremeHills, + eMinecraftColour_Water_Forest, + eMinecraftColour_Water_Taiga, + eMinecraftColour_Water_Swampland, + eMinecraftColour_Water_River, + eMinecraftColour_Water_Hell, + eMinecraftColour_Water_Sky, + eMinecraftColour_Water_FrozenOcean, + eMinecraftColour_Water_FrozenRiver, + eMinecraftColour_Water_IcePlains, + eMinecraftColour_Water_IceMountains, + eMinecraftColour_Water_MushroomIsland, + eMinecraftColour_Water_MushroomIslandShore, + eMinecraftColour_Water_Beach, + eMinecraftColour_Water_DesertHills, + eMinecraftColour_Water_ForestHills, + eMinecraftColour_Water_TaigaHills, + eMinecraftColour_Water_ExtremeHillsEdge, + eMinecraftColour_Water_Jungle, + eMinecraftColour_Water_JungleHills, + + eMinecraftColour_Sky_Ocean, + eMinecraftColour_Sky_Plains, + eMinecraftColour_Sky_Desert, + eMinecraftColour_Sky_ExtremeHills, + eMinecraftColour_Sky_Forest, + eMinecraftColour_Sky_Taiga, + eMinecraftColour_Sky_Swampland, + eMinecraftColour_Sky_River, + eMinecraftColour_Sky_Hell, + eMinecraftColour_Sky_Sky, + eMinecraftColour_Sky_FrozenOcean, + eMinecraftColour_Sky_FrozenRiver, + eMinecraftColour_Sky_IcePlains, + eMinecraftColour_Sky_IceMountains, + eMinecraftColour_Sky_MushroomIsland, + eMinecraftColour_Sky_MushroomIslandShore, + eMinecraftColour_Sky_Beach, + eMinecraftColour_Sky_DesertHills, + eMinecraftColour_Sky_ForestHills, + eMinecraftColour_Sky_TaigaHills, + eMinecraftColour_Sky_ExtremeHillsEdge, + eMinecraftColour_Sky_Jungle, + eMinecraftColour_Sky_JungleHills, + + eMinecraftColour_Tile_RedstoneDust, + eMinecraftColour_Tile_RedstoneDustUnlit, + eMinecraftColour_Tile_RedstoneDustLitMin, + eMinecraftColour_Tile_RedstoneDustLitMax, + eMinecraftColour_Tile_StemMin, + eMinecraftColour_Tile_StemMax, + eMinecraftColour_Tile_WaterLily, + + eMinecraftColour_Sky_Dawn_Dark, + eMinecraftColour_Sky_Dawn_Bright, + + eMinecraftColour_Material_None, + eMinecraftColour_Material_Grass, + eMinecraftColour_Material_Sand, + eMinecraftColour_Material_Cloth, + eMinecraftColour_Material_Fire, + eMinecraftColour_Material_Ice, + eMinecraftColour_Material_Metal, + eMinecraftColour_Material_Plant, + eMinecraftColour_Material_Snow, + eMinecraftColour_Material_Clay, + eMinecraftColour_Material_Dirt, + eMinecraftColour_Material_Stone, + eMinecraftColour_Material_Water, + eMinecraftColour_Material_Wood, + eMinecraftColour_Material_Emerald, + + eMinecraftColour_Particle_Note_00, + eMinecraftColour_Particle_Note_01, + eMinecraftColour_Particle_Note_02, + eMinecraftColour_Particle_Note_03, + eMinecraftColour_Particle_Note_04, + eMinecraftColour_Particle_Note_05, + eMinecraftColour_Particle_Note_06, + eMinecraftColour_Particle_Note_07, + eMinecraftColour_Particle_Note_08, + eMinecraftColour_Particle_Note_09, + eMinecraftColour_Particle_Note_10, + eMinecraftColour_Particle_Note_11, + eMinecraftColour_Particle_Note_12, + eMinecraftColour_Particle_Note_13, + eMinecraftColour_Particle_Note_14, + eMinecraftColour_Particle_Note_15, + eMinecraftColour_Particle_Note_16, + eMinecraftColour_Particle_Note_17, + eMinecraftColour_Particle_Note_18, + eMinecraftColour_Particle_Note_19, + eMinecraftColour_Particle_Note_20, + eMinecraftColour_Particle_Note_21, + eMinecraftColour_Particle_Note_22, + eMinecraftColour_Particle_Note_23, + eMinecraftColour_Particle_Note_24, + + eMinecraftColour_Particle_NetherPortal, + eMinecraftColour_Particle_EnderPortal, + eMinecraftColour_Particle_Smoke, + eMinecraftColour_Particle_Ender, + eMinecraftColour_Particle_Explode, + eMinecraftColour_Particle_HugeExplosion, + eMinecraftColour_Particle_DripWater, + eMinecraftColour_Particle_DripLavaStart, + eMinecraftColour_Particle_DripLavaEnd, + eMinecraftColour_Particle_EnchantmentTable, + eMinecraftColour_Particle_DragonBreathMin, + eMinecraftColour_Particle_DragonBreathMax, + eMinecraftColour_Particle_Suspend, + eMinecraftColour_Particle_CritStart, + eMinecraftColour_Particle_CritEnd, + + eMinecraftColour_Effect_MovementSpeed, + eMinecraftColour_Effect_MovementSlowDown, + eMinecraftColour_Effect_DigSpeed, + eMinecraftColour_Effect_DigSlowdown, + eMinecraftColour_Effect_DamageBoost, + eMinecraftColour_Effect_Heal, + eMinecraftColour_Effect_Harm, + eMinecraftColour_Effect_Jump, + eMinecraftColour_Effect_Confusion, + eMinecraftColour_Effect_Regeneration, + eMinecraftColour_Effect_DamageResistance, + eMinecraftColour_Effect_FireResistance, + eMinecraftColour_Effect_WaterBreathing, + eMinecraftColour_Effect_Invisiblity, + eMinecraftColour_Effect_Blindness, + eMinecraftColour_Effect_NightVision, + eMinecraftColour_Effect_Hunger, + eMinecraftColour_Effect_Weakness, + eMinecraftColour_Effect_Poison, + eMinecraftColour_Effect_Wither, + eMinecraftColour_Effect_HealthBoost, + eMinecraftColour_Effect_Absoprtion, + eMinecraftColour_Effect_Saturation, + + eMinecraftColour_Potion_BaseColour, + + eMinecraftColour_Mob_Creeper_Colour1, + eMinecraftColour_Mob_Creeper_Colour2, + eMinecraftColour_Mob_Skeleton_Colour1, + eMinecraftColour_Mob_Skeleton_Colour2, + eMinecraftColour_Mob_Spider_Colour1, + eMinecraftColour_Mob_Spider_Colour2, + eMinecraftColour_Mob_Zombie_Colour1, + eMinecraftColour_Mob_Zombie_Colour2, + eMinecraftColour_Mob_Slime_Colour1, + eMinecraftColour_Mob_Slime_Colour2, + eMinecraftColour_Mob_Ghast_Colour1, + eMinecraftColour_Mob_Ghast_Colour2, + eMinecraftColour_Mob_PigZombie_Colour1, + eMinecraftColour_Mob_PigZombie_Colour2, + eMinecraftColour_Mob_Enderman_Colour1, + eMinecraftColour_Mob_Enderman_Colour2, + eMinecraftColour_Mob_CaveSpider_Colour1, + eMinecraftColour_Mob_CaveSpider_Colour2, + eMinecraftColour_Mob_Silverfish_Colour1, + eMinecraftColour_Mob_Silverfish_Colour2, + eMinecraftColour_Mob_Blaze_Colour1, + eMinecraftColour_Mob_Blaze_Colour2, + eMinecraftColour_Mob_LavaSlime_Colour1, + eMinecraftColour_Mob_LavaSlime_Colour2, + eMinecraftColour_Mob_Pig_Colour1, + eMinecraftColour_Mob_Pig_Colour2, + eMinecraftColour_Mob_Sheep_Colour1, + eMinecraftColour_Mob_Sheep_Colour2, + eMinecraftColour_Mob_Cow_Colour1, + eMinecraftColour_Mob_Cow_Colour2, + eMinecraftColour_Mob_Chicken_Colour1, + eMinecraftColour_Mob_Chicken_Colour2, + eMinecraftColour_Mob_Squid_Colour1, + eMinecraftColour_Mob_Squid_Colour2, + eMinecraftColour_Mob_Wolf_Colour1, + eMinecraftColour_Mob_Wolf_Colour2, + eMinecraftColour_Mob_MushroomCow_Colour1, + eMinecraftColour_Mob_MushroomCow_Colour2, + eMinecraftColour_Mob_Ocelot_Colour1, + eMinecraftColour_Mob_Ocelot_Colour2, + eMinecraftColour_Mob_Villager_Colour1, + eMinecraftColour_Mob_Villager_Colour2, + eMinecraftColour_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, + + eMinecraftColour_Under_Water_Clear_Colour, + eMinecraftColour_Under_Lava_Clear_Colour, + eMinecraftColour_In_Cloud_Base_Colour, + + eMinecraftColour_Under_Water_Fog_Colour, + eMinecraftColour_Under_Lava_Fog_Colour, + eMinecraftColour_In_Cloud_Fog_Colour, + + eMinecraftColour_Default_Fog_Colour, + eMinecraftColour_Nether_Fog_Colour, + eMinecraftColour_End_Fog_Colour, + + eMinecraftColour_Sign_Text, + eMinecraftColour_Map_Text, + + eMinecraftColour_Leash_Light_Colour, + eMinecraftColour_Leash_Dark_Colour, + + eMinecraftColour_Fire_Overlay, + + eHTMLColor_0, + eHTMLColor_1, + eHTMLColor_2, + eHTMLColor_3, + eHTMLColor_4, + eHTMLColor_5, + eHTMLColor_6, + eHTMLColor_7, + eHTMLColor_8, + eHTMLColor_9, + eHTMLColor_a, + eHTMLColor_b, + eHTMLColor_c, + eHTMLColor_d, + eHTMLColor_e, + eHTMLColor_f, + eHTMLColor_0_dark, + eHTMLColor_1_dark, + eHTMLColor_2_dark, + eHTMLColor_3_dark, + eHTMLColor_4_dark, + eHTMLColor_5_dark, + eHTMLColor_6_dark, + eHTMLColor_7_dark, + eHTMLColor_8_dark, + eHTMLColor_9_dark, + eHTMLColor_a_dark, + eHTMLColor_b_dark, + eHTMLColor_c_dark, + eHTMLColor_d_dark, + eHTMLColor_e_dark, + eHTMLColor_f_dark, + eHTMLColor_T1, + eHTMLColor_T2, + eHTMLColor_T3, + eHTMLColor_Black, + eHTMLColor_White, + + eTextColor_Enchant, + eTextColor_EnchantFocus, + eTextColor_EnchantDisabled, + eTextColor_RenamedItemTitle, + + //eHTMLColor_0 = 0x000000, //r:0 , g: 0, b: 0, i: 0 + //eHTMLColor_1 = 0x0000aa, //r:0 , g: 0, b: aa, i: 1 // 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 + //eHTMLColor_2_dark = 0x002a00, //r:0 , g: 2a, b: 0, i: 12 + //eHTMLColor_3_dark = 0x002a2a, //r:0 , g: 2a, b: 2a, i: 13 + //eHTMLColor_4_dark = 0x2a0000, //r:2a , g: 0, b: 0, i: 14 + //eHTMLColor_5_dark = 0x2a002a, //r:2a , g: 0, b: 2a, i: 15 + //eHTMLColor_6_dark = 0x2a2a00, //r:2a , g: 2a, b: 0, i: 16 + //eHTMLColor_7_dark = 0x2a2a2a, //r:2a , g: 2a, b: 2a, i: 17 // 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 // 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 + + eMinecraftColour_COUNT, +}; + +enum eDLCContentType +{ + e_DLC_SkinPack=0, + e_DLC_TexturePacks, + e_DLC_MashupPacks, + e_DLC_Themes, + e_DLC_AvatarItems, + e_DLC_Gamerpics, + e_DLC_MAX_MinecraftStore, + e_DLC_TexturePackData, // for the icon, banner and text + e_DLC_MAX, + e_DLC_NotDefined, +}; + +enum eDLCMarketplaceType +{ + e_Marketplace_Content=0, // skins, texture packs and mashup packs + e_Marketplace_Themes, + e_Marketplace_AvatarItems, + e_Marketplace_Gamerpics, + e_Marketplace_MAX, + e_Marketplace_NotDefined, +}; + +enum eDLCContentState +{ + e_DLC_ContentState_Idle = 0, + e_DLC_ContentState_Retrieving, + e_DLC_ContentState_Retrieved +}; + +enum eTMSContentState +{ + e_TMS_ContentState_Idle = 0, + e_TMS_ContentState_Queued, + e_TMS_ContentState_Retrieving, + e_TMS_ContentState_Retrieved +}; + +enum eXUID +{ + eXUID_Undefined=0, + eXUID_NoName, // name not needed + eXUID_Notch, + eXUID_Carl, + eXUID_Daniel, + eXUID_Deadmau5, + eXUID_DannyBStyle, + eXUID_JulianClark, + eXUID_Millionth, + eXUID_4JPaddy, + eXUID_4JStuart, + eXUID_4JDavid, + eXUID_4JRichard, + eXUID_4JSteven, +}; + + +enum _eTerrainFeatureType +{ + eTerrainFeature_None=0, + eTerrainFeature_Stronghold, + eTerrainFeature_Mineshaft, + eTerrainFeature_Village, + eTerrainFeature_Ravine, + eTerrainFeature_NetherFortress, + eTerrainFeature_StrongholdEndPortal, + eTerrainFeature_Count +}; + +// 4J Stu - Whend adding new options you should consider whether having them on should disable achievements, and if so add them to the CanRecordStatsAndAchievements function +// 4J Stu - These options are now saved in save data, so new options can ONLY be added to the end +enum eGameHostOption +{ + eGameHostOption_Difficulty=0, + eGameHostOption_OnlineGame, // Unused + eGameHostOption_InviteOnly, // Unused + eGameHostOption_FriendsOfFriends, + eGameHostOption_Gamertags, + eGameHostOption_Tutorial, // special case + eGameHostOption_GameType, + eGameHostOption_LevelType, // flat or default + eGameHostOption_Structures, + eGameHostOption_BonusChest, + eGameHostOption_HasBeenInCreative, + eGameHostOption_PvP, + eGameHostOption_TrustPlayers, + eGameHostOption_TNT, + eGameHostOption_FireSpreads, + eGameHostOption_CheatsEnabled, // special case + eGameHostOption_HostCanFly, + eGameHostOption_HostCanChangeHunger, + eGameHostOption_HostCanBeInvisible, + eGameHostOption_BedrockFog, + eGameHostOption_NoHUD, + eGameHostOption_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 +#ifdef _XBOX +enum _TMSFILES +{ + TMS_SP1=0, + TMS_SP2, + TMS_SP3, + TMS_SP4, + TMS_SP5, + TMS_SP6, + TMS_SPF, + TMS_SPB, + TMS_SPC, + TMS_SPZ, + TMS_SPM, + TMS_SPI, + TMS_SPG, + TMS_SPD1, + TMS_SPSW1, + + TMS_THST, + TMS_THIR, + TMS_THGO, + TMS_THDI, + TMS_THAW, + + TMS_GPAN, + TMS_GPCO, + TMS_GPEN, + TMS_GPFO, + TMS_GPTO, + TMS_GPBA, + TMS_GPFA, + TMS_GPME, + TMS_GPMF, + TMS_GPMM, + TMS_GPSE, + TMS_GPOr, + TMS_GPMi, + TMS_GPMB, + TMS_GPBr, + TMS_GPM1, + TMS_GPM2, + TMS_GPM3, + + TMS_AH_0001, + TMS_AH_0002, + TMS_AH_0003, + TMS_AH_0004, + TMS_AH_0005, + TMS_AH_0006, + TMS_AH_0007, + TMS_AH_0008, + TMS_AH_0009, + TMS_AH_0010, + TMS_AH_0011, + TMS_AH_0012, + TMS_AH_0013, + + TMS_AT_0001, + TMS_AT_0002, + TMS_AT_0003, + TMS_AT_0004, + TMS_AT_0005, + TMS_AT_0006, + TMS_AT_0007, + TMS_AT_0008, + TMS_AT_0009, + TMS_AT_0010, + TMS_AT_0011, + TMS_AT_0012, + TMS_AT_0013, + TMS_AT_0014, + TMS_AT_0015, + TMS_AT_0016, + TMS_AT_0017, + TMS_AT_0018, + TMS_AT_0019, + TMS_AT_0020, + TMS_AT_0021, + TMS_AT_0022, + TMS_AT_0023, + TMS_AT_0024, + TMS_AT_0025, + TMS_AT_0026, + + TMS_AP_0001, + TMS_AP_0002, + TMS_AP_0003, + TMS_AP_0004, + TMS_AP_0005, + TMS_AP_0006, + TMS_AP_0007, + TMS_AP_0009, + TMS_AP_0010, + TMS_AP_0011, + TMS_AP_0012, + TMS_AP_0013, + TMS_AP_0014, + TMS_AP_0015, + TMS_AP_0016, + TMS_AP_0017, + TMS_AP_0018, + + TMS_AP_0019, + TMS_AP_0020, + TMS_AP_0021, + TMS_AP_0022, + TMS_AP_0023, + TMS_AP_0024, + TMS_AP_0025, + TMS_AP_0026, + TMS_AP_0027, + TMS_AP_0028, + TMS_AP_0029, + TMS_AP_0030, + TMS_AP_0031, + TMS_AP_0032, + TMS_AP_0033, + + TMS_AA_0001, + + TMS_MPMA, + TMS_MPMA_DAT, + TMS_MPSR, + TMS_MPSR_DAT, + TMS_MPHA, + TMS_MPHA_DAT, + TMS_MPFE, + TMS_MPFE_DAT, + + TMS_TP01, + TMS_TP01_DAT, + TMS_TP02, + TMS_TP02_DAT, + TMS_TP04, + TMS_TP04_DAT, + TMS_TP05, + TMS_TP05_DAT, + TMS_TP06, + TMS_TP06_DAT, + TMS_TP07, + TMS_TP07_DAT, + TMS_TP08, + TMS_TP08_DAT, + + TMS_COUNT +}; +#endif + +enum EHTMLFontSize +{ + eHTMLSize_Normal, + eHTMLSize_Splitscreen, + eHTMLSize_Tutorial, + eHTMLSize_EndPoem, + + eHTMLSize_COUNT, +}; + +enum EControllerActions +{ + ACTION_MENU_A, + ACTION_MENU_B, + ACTION_MENU_X, + ACTION_MENU_Y, + ACTION_MENU_UP, + ACTION_MENU_DOWN, + ACTION_MENU_RIGHT, + ACTION_MENU_LEFT, + ACTION_MENU_PAGEUP, + ACTION_MENU_PAGEDOWN, + ACTION_MENU_RIGHT_SCROLL, + ACTION_MENU_LEFT_SCROLL, + ACTION_MENU_STICK_PRESS, + ACTION_MENU_OTHER_STICK_PRESS, + ACTION_MENU_OTHER_STICK_UP, + ACTION_MENU_OTHER_STICK_DOWN, + ACTION_MENU_OTHER_STICK_LEFT, + ACTION_MENU_OTHER_STICK_RIGHT, + ACTION_MENU_PAUSEMENU, + +#ifdef _DURANGO + ACTION_MENU_GTC_PAUSE, + ACTION_MENU_GTC_RESUME, +#endif + +#ifdef __ORBIS__ + ACTION_MENU_TOUCHPAD_PRESS, +#endif + + ACTION_MENU_OK, + ACTION_MENU_CANCEL, + ACTION_MAX_MENU = ACTION_MENU_CANCEL, + + MINECRAFT_ACTION_JUMP, + MINECRAFT_ACTION_FORWARD, + MINECRAFT_ACTION_BACKWARD, + MINECRAFT_ACTION_LEFT, + MINECRAFT_ACTION_RIGHT, + MINECRAFT_ACTION_LOOK_LEFT, + MINECRAFT_ACTION_LOOK_RIGHT, + MINECRAFT_ACTION_LOOK_UP, + MINECRAFT_ACTION_LOOK_DOWN, + MINECRAFT_ACTION_USE, + MINECRAFT_ACTION_ACTION, + MINECRAFT_ACTION_LEFT_SCROLL, + MINECRAFT_ACTION_RIGHT_SCROLL, + MINECRAFT_ACTION_INVENTORY, + MINECRAFT_ACTION_PAUSEMENU, + MINECRAFT_ACTION_DROP, + MINECRAFT_ACTION_SNEAK_TOGGLE, + MINECRAFT_ACTION_CRAFTING, + MINECRAFT_ACTION_RENDER_THIRD_PERSON, + MINECRAFT_ACTION_GAME_INFO, + MINECRAFT_ACTION_DPAD_LEFT, + MINECRAFT_ACTION_DPAD_RIGHT, + MINECRAFT_ACTION_DPAD_UP, + MINECRAFT_ACTION_DPAD_DOWN, + + MINECRAFT_ACTION_MAX, + + // These 4 aren't mapped to the input manager directly but are created from the dpad controls if required in Minecraft::run_middle + // Don't use them with the input manager directly, just through LocalPlayer::ullButtonsPressed + MINECRAFT_ACTION_SPAWN_CREEPER, + MINECRAFT_ACTION_CHANGE_SKIN, + MINECRAFT_ACTION_FLY_TOGGLE, + MINECRAFT_ACTION_RENDER_DEBUG +}; + +enum eMCLang +{ + eMCLang_null=0, + eMCLang_enUS, + eMCLang_enGB, + eMCLang_enIE, + eMCLang_enAU, + eMCLang_enNZ, + eMCLang_enCA, + eMCLang_jaJP, + eMCLang_deDE, + eMCLang_deAT, + eMCLang_frFR, + eMCLang_frCA, + eMCLang_esES, + eMCLang_esMX, + eMCLang_itIT, + eMCLang_koKR, + eMCLang_ptPT, + eMCLang_ptBR, + eMCLang_ruRU, + eMCLang_nlNL, + eMCLang_fiFI, + eMCLang_svSV, + eMCLang_daDA, + eMCLang_noNO, + eMCLang_plPL, + eMCLang_trTR, + eMCLang_elEL, + eMCLang_csCS, + eMCLang_zhCHT, + eMCLang_laLAS, + + eMCLang_zhSG, + eMCLang_zhCN, + eMCLang_zhHK, + eMCLang_zhTW, + eMCLang_nlBE, + eMCLang_daDK, + eMCLang_frBE, + eMCLang_frCH, + eMCLang_deCH, + eMCLang_nbNO, + eMCLang_enGR, + eMCLang_enHK, + eMCLang_enSA, + eMCLang_enHU, + eMCLang_enIN, + eMCLang_enIL, + eMCLang_enSG, + eMCLang_enSK, + eMCLang_enZA, + eMCLang_enCZ, + eMCLang_enAE, + eMCLang_esAR, + eMCLang_esCL, + eMCLang_esCO, + eMCLang_esUS, + eMCLang_svSE, + + eMCLang_csCZ, + eMCLang_elGR, + eMCLang_nnNO, + eMCLang_skSK, + + 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 new file mode 100644 index 00000000..a7552ec0 --- /dev/null +++ b/Minecraft.Client/Common/App_structs.h @@ -0,0 +1,231 @@ +#pragma once + +typedef struct +{ + wchar_t *wchFilename; + eFileExtensionType eEXT; + eTMSFileType eTMSType; + PBYTE pbData; + UINT uiSize; + int iConfig; // used for texture pack data files +} +TMS_FILE; + +typedef struct +{ + PBYTE pbData; + DWORD dwBytes; + BYTE ucRefCount; +} +MEMDATA,*PMEMDATA; + +typedef struct +{ + DWORD dwNotification; + UINT uiParam; +} +NOTIFICATION,*PNOTIFICATION; + +typedef struct +{ + bool bSettingsChanged; + unsigned char ucMusicVolume; + unsigned char ucSoundFXVolume; + unsigned char ucSensitivity; + unsigned char ucGamma; + unsigned char ucPad01; // 1 byte of padding inserted here + unsigned short usBitmaskValues; // bit 0,1 - difficulty + // bit 2 - view bob + // bit 3 - player visible in a map + // bit 4,5 - control scheme + // bit 6 - invert look + // bit 7 - southpaw + // bit 8 - splitscreen vertical + + // 4J-PB - Adding new values for interim TU for 1.6.6 + // bit 9 - Display gamertags in splitscreen + // bit 10 - Disable/Enable hints + // bit 11,12,13,14 - Autosave frequency - 0 = Off, 8 = (8*15 minutes) = 2 hours + // bit 15 Tooltips + + // debug values + unsigned int uiDebugBitmask; + + // block off space to use for whatever we want (e.g bitflags for storing things the player has done in the game, so we can flag the first time they do things, such as sleep) + union + { + struct + { + unsigned char ucTutorialCompletion[TUTORIAL_PROFILE_STORAGE_BYTES]; + // adding new flags for interim TU to 1.6.6 + + // A value that encodes the skin that the player has set as their default + DWORD dwSelectedSkin; + + // In-Menu sensitivity + unsigned char ucMenuSensitivity; + unsigned char ucInterfaceOpacity; + unsigned char ucPad02;//2 bytes of padding added here + unsigned char usPad03; + + // Adding another bitmask flag for more settings for 1.8.2 + unsigned int uiBitmaskValues; // 0x00000001 - eGameSetting_Clouds - on + // 0x00000002 - eGameSetting_GameSetting_Online - on + // 0x00000004 - eGameSetting_GameSetting_Invite - off + // 0x00000008 - eGameSetting_GameSetting_FriendsOfFriends - on + // 0x00000010 - eGameSetting_PSVita_NetworkModeAdhoc - on + + // TU 5 + // 0x00000030 - eGameSetting_DisplayUpdateMessage - 3 - counts down to zero + // TU 6 + // 0x00000040 - eGameSetting_BedrockFog - off + // 0x00000080 - eGameSetting_DisplayHUD - on + // 0x00000100 - eGameSetting_DisplayHand - on + // TU 7 + // 0x00000200 - eGameSetting_CustomSkinAnim - on + + // TU9 // 0x00000400 - eGameSetting_DeathMessages - on + + // Adding another bitmask to store "special" completion tasks for the tutorial + unsigned int uiSpecialTutorialBitmask; + + // A value that encodes the cape that the player has set + DWORD dwSelectedCape; + + unsigned int uiFavoriteSkinA[MAX_FAVORITE_SKINS]; + unsigned char ucCurrentFavoriteSkinPos; + + // TU13 + unsigned int uiMashUpPackWorldsDisplay; // bitmask to enable/disable the display of the individual mash-up pack worlds + + // PS3 1.05 - Adding Greek, so need a language + unsigned char ucLanguage; + + // 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)]; + // 4J-PB - don't need to define the padded space, the union with ucReservedSpace will make the sizeof GAME_SETTINGS correct + }; + + unsigned char ucReservedSpace[192]; + + + }; +} +GAME_SETTINGS; + +#ifdef _XBOX_ONE +typedef struct +{ + WCHAR wchPlayerUID[64]; + char pszLevelName[14]; +} +BANNEDLISTDATA,*PBANNEDLISTDATA; +#else +typedef struct +{ + PlayerUID xuid; + char pszLevelName[14]; +} +BANNEDLISTDATA,*PBANNEDLISTDATA; +#endif + +typedef std::vector VBANNEDLIST; + +typedef struct +{ + int iPad; + eXuiAction action; +} +XuiActionParam; + +// tips +typedef struct +{ + int iSortValue; + UINT uiStringID; +} +TIPSTRUCT; + + +typedef struct +{ + eXUID eXuid; + WCHAR wchCape[MAX_CAPENAME_SIZE]; + WCHAR wchSkin[MAX_CAPENAME_SIZE]; +} +MOJANG_DATA; + +typedef struct +{ + eDLCContentType eDLCType; +#if defined( __PS3__) || defined(__ORBIS__) || defined (__PSVITA__) + char chImageURL[256];//SCE_NP_COMMERCE2_URL_LEN +#else + +#ifdef _XBOX_ONE + + wstring wsProductId; + wstring wsDisplayName; + + // add a store for the local DLC image + PBYTE pbImageData; + DWORD dwImageBytes; +#else + ULONGLONG ullOfferID_Full; + ULONGLONG ullOfferID_Trial; +#endif + WCHAR wchBanner[MAX_BANNERNAME_SIZE]; + WCHAR wchDataFile[MAX_BANNERNAME_SIZE]; + int iGender; +#endif + int iConfig; + unsigned int uiSortIndex; +} +DLC_INFO; + + +typedef struct +{ + int x,z; + _eTerrainFeatureType eTerrainFeature; +} +FEATURE_DATA; + +// banned list +typedef struct +{ + BYTE *pBannedList; + DWORD dwBytes; +} +BANNEDLIST; + +typedef struct _DLCRequest +{ + DWORD dwType; + eDLCContentState eState; +} +DLCRequest; + +typedef struct _TMSPPRequest +{ + eTMSContentState eState; + eDLCContentType eType; + C4JStorage::eGlobalStorage eStorageFacility; + C4JStorage::eTMS_FILETYPEVAL eFileTypeVal; + //char szFilename[MAX_TMSFILENAME_SIZE]; +#ifdef _XBOX_ONE + int( *CallbackFunc)(LPVOID,int,int,LPVOID, WCHAR *); +#else + int( *CallbackFunc)(LPVOID,int,int,C4JStorage::PTMSPP_FILEDATA, LPCSTR szFilename); +#endif + WCHAR wchFilename[MAX_TMSFILENAME_SIZE]; + + LPVOID lpCallbackParam; +} +TMSPPRequest; + +typedef pair SceneStackPair; diff --git a/Minecraft.Client/Common/Audio/Consoles_SoundEngine.cpp b/Minecraft.Client/Common/Audio/Consoles_SoundEngine.cpp new file mode 100644 index 00000000..e440316d --- /dev/null +++ b/Minecraft.Client/Common/Audio/Consoles_SoundEngine.cpp @@ -0,0 +1,77 @@ +#include "stdafx.h" +#include "Consoles_SoundEngine.h" + + +bool ConsoleSoundEngine::GetIsPlayingStreamingCDMusic() +{ + return m_bIsPlayingStreamingCDMusic; +} +bool ConsoleSoundEngine::GetIsPlayingStreamingGameMusic() +{ + return m_bIsPlayingStreamingGameMusic; +} +void ConsoleSoundEngine::SetIsPlayingStreamingCDMusic(bool bVal) +{ + m_bIsPlayingStreamingCDMusic=bVal; +} +void ConsoleSoundEngine::SetIsPlayingStreamingGameMusic(bool bVal) +{ + m_bIsPlayingStreamingGameMusic=bVal; +} +bool ConsoleSoundEngine::GetIsPlayingEndMusic() +{ + return m_bIsPlayingEndMusic; +} +bool ConsoleSoundEngine::GetIsPlayingNetherMusic() +{ + return m_bIsPlayingNetherMusic; +} +void ConsoleSoundEngine::SetIsPlayingEndMusic(bool bVal) +{ + m_bIsPlayingEndMusic=bVal; +} +void ConsoleSoundEngine::SetIsPlayingNetherMusic(bool bVal) +{ + m_bIsPlayingNetherMusic=bVal; +} + +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 new file mode 100644 index 00000000..b29b4378 --- /dev/null +++ b/Minecraft.Client/Common/Audio/Consoles_SoundEngine.h @@ -0,0 +1,100 @@ +#pragma once + +#include "..\..\..\Minecraft.World\SoundTypes.h" + +#ifdef _XBOX + +#elif defined (__PS3__) +#undef __in +#undef __out +#include "..\..\PS3\Miles\include\mss.h" +#elif defined (__PSVITA__) +#include "..\..\PSVITA\Miles\include\mss.h" +#elif defined _DURANGO +// 4J Stu - Temp define to get Miles to link, can likely be removed when we get a new version of Miles +#define _SEKRIT +#include "..\..\Durango\Miles\include\mss.h" +#elif defined _WINDOWS64 +#include "..\..\windows64\Miles\include\mss.h" +#else // PS4 +// 4J Stu - Temp define to get Miles to link, can likely be removed when we get a new version of Miles +#define _SEKRIT2 +#include "..\..\Orbis\Miles\include\mss.h" +#endif + +typedef struct +{ + float x,y,z; +} +AUDIO_VECTOR; + +typedef struct +{ + bool bValid; + AUDIO_VECTOR vPosition; + AUDIO_VECTOR vOrientFront; +} +AUDIO_LISTENER; + +class Options; + +class ConsoleSoundEngine +{ +public: + + ConsoleSoundEngine() : m_bIsPlayingStreamingCDMusic(false),m_bIsPlayingStreamingGameMusic(false), m_bIsPlayingEndMusic(false),m_bIsPlayingNetherMusic(false){}; + virtual void tick(shared_ptr *players, float a) =0; + virtual void destroy()=0; + virtual void play(int iSound, float x, float y, float z, float volume, float pitch) =0; + virtual void playStreaming(const wstring& name, float x, float y , float z, float volume, float pitch, bool bMusicDelay=true) =0; + virtual void playUI(int iSound, float volume, float pitch) =0; + virtual void updateMusicVolume(float fVal) =0; + virtual void updateSystemMusicPlaying(bool isPlaying) = 0; + virtual void updateSoundEffectVolume(float fVal) =0; + virtual void init(Options *) =0 ; + virtual void add(const wstring& name, File *file) =0; + virtual void addMusic(const wstring& name, File *file) =0; + virtual void addStreaming(const wstring& name, File *file) =0; + virtual char *ConvertSoundPathToName(const wstring& name, bool bConvertSpaces) =0; + virtual void playMusicTick() =0; + + virtual bool GetIsPlayingStreamingCDMusic() ; + virtual bool GetIsPlayingStreamingGameMusic() ; + virtual void SetIsPlayingStreamingCDMusic(bool bVal) ; + virtual void SetIsPlayingStreamingGameMusic(bool bVal) ; + virtual bool GetIsPlayingEndMusic() ; + virtual bool GetIsPlayingNetherMusic() ; + virtual void SetIsPlayingEndMusic(bool bVal) ; + virtual void SetIsPlayingNetherMusic(bool bVal) ; + static const WCHAR *wchSoundNames[eSoundType_MAX]; + static const WCHAR *wchUISoundNames[eSFX_MAX]; + +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 + + virtual int initAudioHardware(int iMinSpeakers)=0; + + bool m_bIsPlayingStreamingCDMusic; + bool m_bIsPlayingStreamingGameMusic; + bool m_bIsPlayingEndMusic; + bool m_bIsPlayingNetherMusic; +}; diff --git a/Minecraft.Client/Common/Audio/SoundEngine.cpp b/Minecraft.Client/Common/Audio/SoundEngine.cpp new file mode 100644 index 00000000..cd087cea --- /dev/null +++ b/Minecraft.Client/Common/Audio/SoundEngine.cpp @@ -0,0 +1,1684 @@ +#include "stdafx.h" + +#include "SoundEngine.h" +#include "..\Consoles_App.h" +#include "..\..\MultiplayerLocalPlayer.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.h" +#include "..\..\Minecraft.World\leveldata.h" +#include "..\..\Minecraft.World\mth.h" +#include "..\..\TexturePackRepository.h" +#include "..\..\DLCTexturePack.h" +#include "Common\DLC\DLCAudioFile.h" + +#ifdef __PSVITA__ +#include +#endif + +#ifdef _WINDOWS64 +#include "..\..\Minecraft.Client\Windows64\Windows64_App.h" +#include "..\..\Minecraft.Client\Windows64\Miles\include\imssapi.h" +#endif + +#ifdef __ORBIS__ +#include +//#define __DISABLE_MILES__ // MGH disabled for now as it crashes if we call sceNpMatching2Initialize +#endif + +// take out Orbis until they are done +#if defined _XBOX + +SoundEngine::SoundEngine() {} +void SoundEngine::init(Options *pOptions) +{ +} + +void SoundEngine::tick(shared_ptr *players, float a) +{ +} +void SoundEngine::destroy() {} +void SoundEngine::play(int iSound, float x, float y, float z, float volume, float pitch) +{ + app.DebugPrintf("PlaySound - %d\n",iSound); +} +void SoundEngine::playStreaming(const wstring& name, float x, float y , float z, float volume, float pitch, bool bMusicDelay) {} +void SoundEngine::playUI(int iSound, float volume, float pitch) {} + +void SoundEngine::updateMusicVolume(float fVal) {} +void SoundEngine::updateSoundEffectVolume(float fVal) {} + +void SoundEngine::add(const wstring& name, File *file) {} +void SoundEngine::addMusic(const wstring& name, File *file) {} +void SoundEngine::addStreaming(const wstring& name, File *file) {} +char *SoundEngine::ConvertSoundPathToName(const wstring& name, bool bConvertSpaces) { return NULL; } +bool SoundEngine::isStreamingWavebankReady() { return true; } +void SoundEngine::playMusicTick() {}; + +#else + +#ifdef _WINDOWS64 +char SoundEngine::m_szSoundPath[]={"Durango\\Sound\\"}; +char SoundEngine::m_szMusicPath[]={"music\\"}; +char SoundEngine::m_szRedistName[]={"redist64"}; +#elif defined _DURANGO +char SoundEngine::m_szSoundPath[]={"Sound\\"}; +char SoundEngine::m_szMusicPath[]={"music\\"}; +char SoundEngine::m_szRedistName[]={"redist64"}; +#elif defined __ORBIS__ + +#ifdef _CONTENT_PACKAGE +char SoundEngine::m_szSoundPath[]={"Sound/"}; +#elif defined _ART_BUILD +char SoundEngine::m_szSoundPath[]={"Sound/"}; +#else +// just use the host Durango folder for the sound. In the content package, we'll have moved this in the .gp4 file +char SoundEngine::m_szSoundPath[]={"Durango/Sound/"}; +#endif +char SoundEngine::m_szMusicPath[]={"music/"}; +char SoundEngine::m_szRedistName[]={"redist64"}; +#elif defined __PSVITA__ +char SoundEngine::m_szSoundPath[]={"PSVita/Sound/"}; +char SoundEngine::m_szMusicPath[]={"music/"}; +char SoundEngine::m_szRedistName[]={"redist"}; +#elif defined __PS3__ +//extern const char* getPS3HomePath(); +char SoundEngine::m_szSoundPath[]={"PS3/Sound/"}; +char SoundEngine::m_szMusicPath[]={"music/"}; +char SoundEngine::m_szRedistName[]={"redist"}; + +#define USE_SPURS + +#ifdef USE_SPURS +#include +#else +#include +#endif + +#endif + +F32 AILCALLBACK custom_falloff_function (HSAMPLE S, + F32 distance, + F32 rolloff_factor, + F32 min_dist, + F32 max_dist); + +char *SoundEngine::m_szStreamFileA[eStream_Max]= +{ + "calm1", + "calm2", + "calm3", + "hal1", + "hal2", + "hal3", + "hal4", + "nuance1", + "nuance2", +#ifndef _XBOX + // add the new music tracks + "creative1", + "creative2", + "creative3", + "creative4", + "creative5", + "creative6", + "menu1", + "menu2", + "menu3", + "menu4", +#endif + "piano1", + "piano2", + "piano3", + + // Nether + "nether1", + "nether2", + "nether3", + "nether4", + // The End + "the_end_dragon_alive", + "the_end_end", + // CDs + "11", + "13", + "blocks", + "cat", + "chirp", + "far", + "mall", + "mellohi", + "stal", + "strad", + "ward", + "where_are_we_now" +}; + +///////////////////////////////////////////// +// +// ErrorCallback +// +///////////////////////////////////////////// +void AILCALL ErrorCallback(S64 i_Id, char const* i_Details) +{ + char *pchLastError=AIL_last_error(); + + if(pchLastError[0]!=0) + { + app.DebugPrintf("\rErrorCallback Error Category: %s\n", pchLastError); + } + + if (i_Details) + { + app.DebugPrintf("ErrorCallback - Details: %s\n", i_Details); + } +} + +#ifdef __PSVITA__ +// AP - this is the callback when the driver is about to mix. At this point the mutex is locked by Miles so we can now call all Miles functions without +// the possibility of incurring a stall. +static bool SoundEngine_Change = false; // has tick been called? +static CRITICAL_SECTION SoundEngine_MixerMutex; + +void AILCALL MilesMixerCB(HDIGDRIVER dig) +{ + // has the tick function been called since the last callback + if( SoundEngine_Change ) + { + SoundEngine_Change = false; + + EnterCriticalSection(&SoundEngine_MixerMutex); + + Minecraft *pMinecraft = Minecraft::GetInstance(); + pMinecraft->soundEngine->updateMiles(); + pMinecraft->soundEngine->playMusicUpdate(); + + LeaveCriticalSection(&SoundEngine_MixerMutex); + } +} +#endif + +///////////////////////////////////////////// +// +// init +// +///////////////////////////////////////////// +void SoundEngine::init(Options *pOptions) +{ + app.DebugPrintf("---SoundEngine::init\n"); +#ifdef __DISABLE_MILES__ + return; +#endif +#ifdef __ORBIS__ + C4JThread::PushAffinityAllCores(); +#endif +#if defined _DURANGO || defined __ORBIS__ || defined __PS3__ || defined __PSVITA__ + Register_RIB(BinkADec); +#endif + + char *redistpath; + +#if (defined _WINDOWS64 || defined __PSVITA__)// || defined _DURANGO || defined __ORBIS__ ) + redistpath=AIL_set_redist_directory(m_szRedistName); +#endif + + app.DebugPrintf("---SoundEngine::init - AIL_startup\n"); + S32 ret = AIL_startup(); + + int iNumberOfChannels=initAudioHardware(8); + + // Create a driver to render our audio - 44khz, 16 bit, +#ifdef __PS3__ + // On the Sony PS3, the driver is always opened in 48 kHz, 32-bit floating point. The only meaningful configurations are MSS_MC_STEREO, MSS_MC_51_DISCRETE, and MSS_MC_71_DISCRETE. + m_hDriver = AIL_open_digital_driver( 48000, 16, iNumberOfChannels, AIL_OPEN_DIGITAL_USE_SPU0 ); +#elif defined __PSVITA__ + + // maximum of 16 samples + AIL_set_preference(DIG_MIXER_CHANNELS, 16); + + m_hDriver = AIL_open_digital_driver( 48000, 16, MSS_MC_STEREO, 0 ); + + // AP - For some reason the submit thread defaults to a priority of zero (invalid). Make sure it has the highest priority to avoid audio breakup. + SceUID threadID; + AIL_platform_property( m_hDriver, PSP2_SUBMIT_THREAD, &threadID, 0, 0); + S32 g_DefaultCPU = sceKernelGetThreadCpuAffinityMask(threadID); + S32 Old = sceKernelChangeThreadPriority(threadID, 64); + + // AP - register a callback when the mixer starts + AILMIXERCB temp = AIL_register_mix_callback(m_hDriver, MilesMixerCB); + + InitializeCriticalSection(&SoundEngine_MixerMutex); + +#elif defined(__ORBIS__) + m_hDriver = AIL_open_digital_driver( 48000, 16, 2, 0 ); + app.DebugPrintf("---SoundEngine::init - AIL_open_digital_driver\n"); + +#else + m_hDriver = AIL_open_digital_driver(44100, 16, MSS_MC_USE_SYSTEM_CONFIG, 0); +#endif + if (m_hDriver == 0) + { + app.DebugPrintf("Couldn't open digital sound driver. (%s)\n", AIL_last_error()); + AIL_shutdown(); +#ifdef __ORBIS__ + C4JThread::PopAffinity(); +#endif + return; + } + app.DebugPrintf("---SoundEngine::init - driver opened\n"); + +#ifdef __PSVITA__ + + // set high falloff power for maximum spatial effect in software mode + AIL_set_speaker_configuration( m_hDriver, 0, 0, 4.0F ); + +#endif + + AIL_set_event_error_callback(ErrorCallback); + + AIL_set_3D_rolloff_factor(m_hDriver,1.0); + + // Create an event system tied to that driver - let Miles choose memory defaults. + //if (AIL_startup_event_system(m_hDriver, 0, 0, 0) == 0) + // 4J-PB - Durango complains that the default memory (64k)isn't enough + // Error: MilesEvent: Out of event system memory (pool passed to event system startup exhausted). + // AP - increased command buffer from the default 5K to 20K for Vita + + if (AIL_startup_event_system(m_hDriver, 1024*20, 0, 1024*128) == 0) + { + app.DebugPrintf("Couldn't init event system (%s).\n", AIL_last_error()); + AIL_close_digital_driver(m_hDriver); + AIL_shutdown(); +#ifdef __ORBIS__ + C4JThread::PopAffinity(); +#endif + app.DebugPrintf("---SoundEngine::init - AIL_startup_event_system failed\n"); + return; + } + char szBankName[255]; +#if defined __PS3__ + if(app.GetBootedFromDiscPatch()) + { + char szTempSoundFilename[255]; + sprintf(szTempSoundFilename,"%s%s",m_szSoundPath, "Minecraft.msscmp" ); + + app.DebugPrintf("SoundEngine::playMusicUpdate - (booted from disc patch) looking for %s\n",szTempSoundFilename); + sprintf(szBankName,"%s/%s",app.GetBDUsrDirPath(szTempSoundFilename), m_szSoundPath ); + app.DebugPrintf("SoundEngine::playMusicUpdate - (booted from disc patch) music path - %s\n",szBankName); + } + else + { + sprintf(szBankName,"%s/%s",getUsrDirPath(), m_szSoundPath ); + } + +#elif defined __PSVITA__ + sprintf(szBankName,"%s/%s",getUsrDirPath(), m_szSoundPath ); +#elif defined __ORBIS__ + sprintf(szBankName,"%s/%s",getUsrDirPath(), m_szSoundPath ); +#else + strcpy((char *)szBankName,m_szSoundPath); +#endif + + strcat((char *)szBankName,"Minecraft.msscmp"); + + m_hBank=AIL_add_soundbank(szBankName, 0); + + if(m_hBank == NULL) + { + char *Error=AIL_last_error(); + app.DebugPrintf("Couldn't open soundbank: %s (%s)\n", szBankName, Error); + AIL_close_digital_driver(m_hDriver); + AIL_shutdown(); +#ifdef __ORBIS__ + C4JThread::PopAffinity(); +#endif + return; + } + + //#ifdef _DEBUG + HMSSENUM token = MSS_FIRST; + char const* Events[1] = {0}; + S32 EventCount = 0; + while (AIL_enumerate_events(m_hBank, &token, 0, &Events[0])) + { + app.DebugPrintf(4,"%d - %s\n", EventCount, Events[0]); + + EventCount++; + } + //#endif + + U64 u64Result; + u64Result=AIL_enqueue_event_by_name("Minecraft/CacheSounds"); + + m_MasterMusicVolume=1.0f; + m_MasterEffectsVolume=1.0f; + + //AIL_set_variable_float(0,"UserEffectVol",1); + + m_bSystemMusicPlaying = false; + + m_openStreamThread = NULL; + +#ifdef __ORBIS__ + C4JThread::PopAffinity(); +#endif + +#ifdef __PSVITA__ + // AP - By default the mixer won't start up and nothing will process. Kick off a blank sample to force the mixer to start up. + HSAMPLE Sample = AIL_allocate_sample_handle(m_hDriver); + AIL_init_sample(Sample, DIG_F_STEREO_16); + static U64 silence = 0; + AIL_set_sample_address(Sample, &silence, sizeof(U64)); + AIL_start_sample(Sample); + + // wait for 1 mix... + AIL_release_sample_handle(Sample); +#endif +} + +#ifdef __ORBIS__ +// void SoundEngine::SetHandle(int32_t hAudio) +// { +// //m_hAudio=hAudio; +// } +#endif + +void SoundEngine::SetStreamingSounds(int iOverworldMin, int iOverWorldMax, int iNetherMin, int iNetherMax, int iEndMin, int iEndMax, int iCD1) +{ + m_iStream_Overworld_Min=iOverworldMin; + m_iStream_Overworld_Max=iOverWorldMax; + m_iStream_Nether_Min=iNetherMin; + m_iStream_Nether_Max=iNetherMax; + m_iStream_End_Min=iEndMin; + m_iStream_End_Max=iEndMax; + m_iStream_CD_1=iCD1; + + // array to monitor recently played tracks + if(m_bHeardTrackA) + { + delete [] m_bHeardTrackA; + } + m_bHeardTrackA = new bool[iEndMax+1]; + memset(m_bHeardTrackA,0,sizeof(bool)*iEndMax+1); +} + +// AP - moved to a separate function so it can be called from the mixer callback on Vita +void SoundEngine::updateMiles() +{ +#ifdef __PSVITA__ + //CD - We must check for Background Music [BGM] at any point + //If it's playing disable our audio, otherwise enable + int NoBGMPlaying = sceAudioOutGetAdopt(SCE_AUDIO_OUT_PORT_TYPE_BGM); + updateSystemMusicPlaying( !NoBGMPlaying ); +#elif defined __ORBIS__ + // is the system playing background music? + SceAudioOutPortState outPortState; + sceAudioOutGetPortState(m_hBGMAudio,&outPortState); + updateSystemMusicPlaying( outPortState.output==SCE_AUDIO_OUT_STATE_OUTPUT_UNKNOWN ); +#endif + + if( m_validListenerCount == 1 ) + { + for( int i = 0; i < MAX_LOCAL_PLAYERS; i++ ) + { + // set the listener as the first player we find + if( m_ListenerA[i].bValid ) + { + AIL_set_listener_3D_position(m_hDriver,m_ListenerA[i].vPosition.x,m_ListenerA[i].vPosition.y,-m_ListenerA[i].vPosition.z); // Flipped sign of z as Miles is expecting left handed coord system + AIL_set_listener_3D_orientation(m_hDriver,-m_ListenerA[i].vOrientFront.x,m_ListenerA[i].vOrientFront.y,m_ListenerA[i].vOrientFront.z,0,1,0); // Flipped sign of z as Miles is expecting left handed coord system + break; + } + } + } + else + { + // 4J-PB - special case for splitscreen + // the shortest distance between any listener and a sound will be used to play a sound a set distance away down the z axis. + // The listener position will be set to 0,0,0, and the orientation will be facing down the z axis + + AIL_set_listener_3D_position(m_hDriver,0,0,0); + AIL_set_listener_3D_orientation(m_hDriver,0,0,1,0,1,0); + } + + AIL_begin_event_queue_processing(); + + // Iterate over the sounds + S32 StartedCount = 0, CompletedCount = 0, TotalCount = 0; + HMSSENUM token = MSS_FIRST; + MILESEVENTSOUNDINFO SoundInfo; + int Playing = 0; + while (AIL_enumerate_sound_instances(0, &token, 0, 0, 0, &SoundInfo)) + { + AUDIO_INFO* game_data= (AUDIO_INFO*)( SoundInfo.UserBuffer ); + + if( SoundInfo.Status == MILESEVENT_SOUND_STATUS_PLAYING ) + { + Playing += 1; + } + + if ( SoundInfo.Status != MILESEVENT_SOUND_STATUS_COMPLETE ) + { + // apply the master volume + // watch for the 'special' volume levels + bool isThunder = false; + if( game_data->volume == 10000.0f ) + { + isThunder = true; + } + if(game_data->volume>1) + { + game_data->volume=1; + } + AIL_set_sample_volume_levels( SoundInfo.Sample, game_data->volume*m_MasterEffectsVolume, game_data->volume*m_MasterEffectsVolume); + + float distanceScaler = 16.0f; + switch(SoundInfo.Status) + { + case MILESEVENT_SOUND_STATUS_PENDING: + // 4J-PB - causes the falloff to be calculated on the PPU instead of the SPU, and seems to resolve our distorted sound issue + AIL_register_falloff_function_callback(SoundInfo.Sample,&custom_falloff_function); + + if(game_data->bIs3D) + { + AIL_set_sample_is_3D( SoundInfo.Sample, 1 ); + + int iSound = game_data->iSound - eSFX_MAX; + switch(iSound) + { + // Is this the Dragon? + case eSoundType_MOB_ENDERDRAGON_GROWL: + case eSoundType_MOB_ENDERDRAGON_MOVE: + case eSoundType_MOB_ENDERDRAGON_END: + case eSoundType_MOB_ENDERDRAGON_HIT: + distanceScaler=100.0f; + break; + case eSoundType_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: + case eSoundType_MOB_GHAST_CHARGE: + case eSoundType_MOB_GHAST_FIREBALL: + distanceScaler=30.0f; + break; + } + + // Set a special distance scaler for thunder, which we respond to by having no attenutation + if( isThunder ) + { + distanceScaler = 10000.0f; + } + } + else + { + AIL_set_sample_is_3D( SoundInfo.Sample, 0 ); + } + + AIL_set_sample_3D_distances(SoundInfo.Sample,distanceScaler,1,0); + // set the pitch + if(!game_data->bUseSoundsPitchVal) + { + AIL_set_sample_playback_rate_factor(SoundInfo.Sample,game_data->pitch); + } + + if(game_data->bIs3D) + { + if(m_validListenerCount>1) + { + float fClosest=10000.0f; + int iClosestListener=0; + float fClosestX=0.0f,fClosestY=0.0f,fClosestZ=0.0f,fDist; + // need to calculate the distance from the sound to the nearest listener - use Manhattan Distance as the decision + for( int i = 0; i < MAX_LOCAL_PLAYERS; i++ ) + { + if( m_ListenerA[i].bValid ) + { + float x,y,z; + + x=fabs(m_ListenerA[i].vPosition.x-game_data->x); + y=fabs(m_ListenerA[i].vPosition.y-game_data->y); + z=fabs(m_ListenerA[i].vPosition.z-game_data->z); + fDist=x+y+z; + + if(fDistx, game_data->y, -game_data->z ); // Flipped sign of z as Miles is expecting left handed coord system + } + } + break; + + default: + if(game_data->bIs3D) + { + if(m_validListenerCount>1) + { + float fClosest=10000.0f; + int iClosestListener=0; + float fClosestX=0.0f,fClosestY=0.0f,fClosestZ=0.0f,fDist; + // need to calculate the distance from the sound to the nearest listener - use Manhattan Distance as the decision + for( int i = 0; i < MAX_LOCAL_PLAYERS; i++ ) + { + if( m_ListenerA[i].bValid ) + { + float x,y,z; + + x=fabs(m_ListenerA[i].vPosition.x-game_data->x); + y=fabs(m_ListenerA[i].vPosition.y-game_data->y); + z=fabs(m_ListenerA[i].vPosition.z-game_data->z); + fDist=x+y+z; + + if(fDistx, game_data->y, -game_data->z ); // Flipped sign of z as Miles is expecting left handed coord system + } + } + break; + } + } + } + AIL_complete_event_queue_processing(); +} + +//#define DISTORTION_TEST +#ifdef DISTORTION_TEST +static float fVal=0.0f; +#endif +///////////////////////////////////////////// +// +// tick +// +///////////////////////////////////////////// + +#ifdef __PSVITA__ +static S32 running = AIL_ms_count(); +#endif + +void SoundEngine::tick(shared_ptr *players, float a) +{ + ConsoleSoundEngine::tick(); +#ifdef __DISABLE_MILES__ + return; +#endif + +#ifdef __PSVITA__ + EnterCriticalSection(&SoundEngine_MixerMutex); +#endif + + // update the listener positions + int listenerCount = 0; +#ifdef DISTORTION_TEST + float fX,fY,fZ; +#endif + if( players ) + { + bool bListenerPostionSet=false; + for( int i = 0; i < MAX_LOCAL_PLAYERS; i++ ) + { + if( players[i] != NULL ) + { + m_ListenerA[i].bValid=true; + F32 x,y,z; + x=players[i]->xo + (players[i]->x - players[i]->xo) * a; + y=players[i]->yo + (players[i]->y - players[i]->yo) * a; + z=players[i]->zo + (players[i]->z - players[i]->zo) * a; + + float yRot = players[i]->yRotO + (players[i]->yRot - players[i]->yRotO) * a; + float yCos = (float)cos(-yRot * Mth::RAD_TO_GRAD - PI); + float ySin = (float)sin(-yRot * Mth::RAD_TO_GRAD - PI); + + // store the listener positions for splitscreen + m_ListenerA[i].vPosition.x = x; + m_ListenerA[i].vPosition.y = y; + m_ListenerA[i].vPosition.z = z; + + m_ListenerA[i].vOrientFront.x = ySin; + m_ListenerA[i].vOrientFront.y = 0; + m_ListenerA[i].vOrientFront.z = yCos; + + listenerCount++; + } + else + { + m_ListenerA[i].bValid=false; + } + } + } + + + // If there were no valid players set, make up a default listener + if( listenerCount == 0 ) + { + m_ListenerA[0].vPosition.x = 0; + m_ListenerA[0].vPosition.y = 0; + m_ListenerA[0].vPosition.z = 0; + m_ListenerA[0].vOrientFront.x = 0; + m_ListenerA[0].vOrientFront.y = 0; + m_ListenerA[0].vOrientFront.z = 1.0f; + listenerCount++; + } + m_validListenerCount = listenerCount; + +#ifdef __PSVITA__ + // AP - Show that a change has occurred so we know to update the values at the next Mixer callback + SoundEngine_Change = true; + + LeaveCriticalSection(&SoundEngine_MixerMutex); +#else + updateMiles(); +#endif +} + +///////////////////////////////////////////// +// +// SoundEngine +// +///////////////////////////////////////////// +SoundEngine::SoundEngine() +{ + random = new Random(); + m_hStream=0; + m_StreamState=eMusicStreamState_Idle; + m_iMusicDelay=0; + m_validListenerCount=0; + + m_bHeardTrackA=NULL; + + // Start the streaming music playing some music from the overworld + SetStreamingSounds(eStream_Overworld_Calm1,eStream_Overworld_piano3, + eStream_Nether1,eStream_Nether4, + eStream_end_dragon,eStream_end_end, + eStream_CD_1); + + m_musicID=getMusicID(LevelData::DIMENSION_OVERWORLD); + + m_StreamingAudioInfo.bIs3D=false; + m_StreamingAudioInfo.x=0; + m_StreamingAudioInfo.y=0; + m_StreamingAudioInfo.z=0; + m_StreamingAudioInfo.volume=1; + m_StreamingAudioInfo.pitch=1; + + memset(CurrentSoundsPlaying,0,sizeof(int)*(eSoundType_MAX+eSFX_MAX)); + memset(m_ListenerA,0,sizeof(AUDIO_LISTENER)*XUSER_MAX_COUNT); + +#ifdef __ORBIS__ + m_hBGMAudio=GetAudioBGMHandle(); +#endif +} + +void SoundEngine::destroy() {} + +#ifdef _DEBUG +void SoundEngine::GetSoundName(char *szSoundName,int iSound) +{ + strcpy((char *)szSoundName,"Minecraft/"); + wstring name = wchSoundNames[iSound]; + char *SoundName = (char *)ConvertSoundPathToName(name); + strcat((char *)szSoundName,SoundName); +} +#endif + +///////////////////////////////////////////// +// +// play +// +///////////////////////////////////////////// +void SoundEngine::play(int iSound, float x, float y, float z, float volume, float pitch) +{ + U8 szSoundName[256]; + + if(iSound==-1) + { + app.DebugPrintf(6,"PlaySound with sound of -1 !!!!!!!!!!!!!!!\n"); + return; + } + + // AP removed old counting system. Now relying on Miles' Play Count Limit + /* // if we are already playing loads of this sounds ignore this one + if(CurrentSoundsPlaying[iSound+eSFX_MAX]>MAX_SAME_SOUNDS_PLAYING) + { + // wstring name = wchSoundNames[iSound]; + // char *SoundName = (char *)ConvertSoundPathToName(name); + // app.DebugPrintf("Too many %s sounds playing!\n",SoundName); + return; + }*/ + + //if (iSound != eSoundType_MOB_IRONGOLEM_WALK) return; + + // build the name + strcpy((char *)szSoundName,"Minecraft/"); + +#ifdef DISTORTION_TEST + wstring name = wchSoundNames[eSoundType_MOB_ENDERDRAGON_GROWL]; +#else + wstring name = wchSoundNames[iSound]; +#endif + + char *SoundName = (char *)ConvertSoundPathToName(name); + strcat((char *)szSoundName,SoundName); + +// app.DebugPrintf(6,"PlaySound - %d - %s - %s (%f %f %f, vol %f, pitch %f)\n",iSound, SoundName, szSoundName,x,y,z,volume,pitch); + + AUDIO_INFO AudioInfo; + AudioInfo.x=x; + AudioInfo.y=y; + AudioInfo.z=z; + AudioInfo.volume=volume; + AudioInfo.pitch=pitch; + AudioInfo.bIs3D=true; + AudioInfo.bUseSoundsPitchVal=false; + AudioInfo.iSound=iSound+eSFX_MAX; +#ifdef _DEBUG + strncpy(AudioInfo.chName,(char *)szSoundName,64); +#endif + + S32 token = AIL_enqueue_event_start(); + AIL_enqueue_event_buffer(&token, &AudioInfo, sizeof(AUDIO_INFO), 0); + AIL_enqueue_event_end_named(token, (char *)szSoundName); +} + +///////////////////////////////////////////// +// +// playUI +// +///////////////////////////////////////////// +void SoundEngine::playUI(int iSound, float volume, float pitch) +{ + U8 szSoundName[256]; + wstring name; + // we have some game sounds played as UI sounds... + // Not the best way to do this, but it seems to only be the portal sounds + + if(iSound>=eSFX_MAX) + { + // AP removed old counting system. Now relying on Miles' Play Count Limit + /* // if we are already playing loads of this sounds ignore this one + if(CurrentSoundsPlaying[iSound+eSFX_MAX]>MAX_SAME_SOUNDS_PLAYING) return;*/ + + // build the name + strcpy((char *)szSoundName,"Minecraft/"); + name = wchSoundNames[iSound]; + } + else + { + // AP removed old counting system. Now relying on Miles' Play Count Limit + /* // if we are already playing loads of this sounds ignore this one + if(CurrentSoundsPlaying[iSound]>MAX_SAME_SOUNDS_PLAYING) return;*/ + + // build the name + strcpy((char *)szSoundName,"Minecraft/UI/"); + name = wchUISoundNames[iSound]; + } + + char *SoundName = (char *)ConvertSoundPathToName(name); + strcat((char *)szSoundName,SoundName); +// app.DebugPrintf("UI: Playing %s, volume %f, pitch %f\n",SoundName,volume,pitch); + + //app.DebugPrintf("PlaySound - %d - %s\n",iSound, SoundName); + + AUDIO_INFO AudioInfo; + memset(&AudioInfo,0,sizeof(AUDIO_INFO)); + AudioInfo.volume=volume; // will be multiplied by the master volume + AudioInfo.pitch=pitch; + AudioInfo.bUseSoundsPitchVal=true; + if(iSound>=eSFX_MAX) + { + AudioInfo.iSound=iSound+eSFX_MAX; + } + else + { + AudioInfo.iSound=iSound; + } +#ifdef _DEBUG + strncpy(AudioInfo.chName,(char *)szSoundName,64); +#endif + + // 4J-PB - not going to stop UI events happening based on the number of currently playing sounds + S32 token = AIL_enqueue_event_start(); + AIL_enqueue_event_buffer(&token, &AudioInfo, sizeof(AUDIO_INFO), 0); + AIL_enqueue_event_end_named(token, (char *)szSoundName); +} + +///////////////////////////////////////////// +// +// playStreaming +// +///////////////////////////////////////////// +void SoundEngine::playStreaming(const wstring& name, float x, float y , float z, float volume, float pitch, bool bMusicDelay) +{ + // This function doesn't actually play a streaming sound, just sets states and an id for the music tick to play it + // Level audio will be played when a play with an empty name comes in + // CD audio will be played when a named stream comes in + + m_StreamingAudioInfo.x=x; + m_StreamingAudioInfo.y=y; + m_StreamingAudioInfo.z=z; + m_StreamingAudioInfo.volume=volume; + m_StreamingAudioInfo.pitch=pitch; + + if(m_StreamState==eMusicStreamState_Playing) + { + m_StreamState=eMusicStreamState_Stop; + } + else if(m_StreamState==eMusicStreamState_Opening) + { + m_StreamState=eMusicStreamState_OpeningCancel; + } + + if(name.empty()) + { + // music, or stop CD + m_StreamingAudioInfo.bIs3D=false; + + // we need a music id + // random delay of up to 3 minutes for music + m_iMusicDelay = random->nextInt(20 * 60 * 3);//random->nextInt(20 * 60 * 10) + 20 * 60 * 10; + +#ifdef _DEBUG + m_iMusicDelay=0; +#endif + Minecraft *pMinecraft=Minecraft::GetInstance(); + + bool playerInEnd=false; + bool playerInNether=false; + + for(unsigned int i=0;ilocalplayers[i]!=NULL) + { + if(pMinecraft->localplayers[i]->dimension==LevelData::DIMENSION_END) + { + playerInEnd=true; + } + else if(pMinecraft->localplayers[i]->dimension==LevelData::DIMENSION_NETHER) + { + playerInNether=true; + } + } + } + if(playerInEnd) + { + m_musicID = getMusicID(LevelData::DIMENSION_END); + } + else if(playerInNether) + { + m_musicID = getMusicID(LevelData::DIMENSION_NETHER); + } + else + { + m_musicID = getMusicID(LevelData::DIMENSION_OVERWORLD); + } + } + else + { + // jukebox + m_StreamingAudioInfo.bIs3D=true; + m_musicID=getMusicID(name); + m_iMusicDelay=0; + } +} + + +int SoundEngine::GetRandomishTrack(int iStart,int iEnd) +{ + // 4J-PB - make it more likely that we'll get a track we've not heard for a while, although repeating tracks sometimes is fine + + // if all tracks have been heard, clear the flags + bool bAllTracksHeard=true; + int iVal=iStart; + for(int i=iStart;i<=iEnd;i++) + { + if(m_bHeardTrackA[i]==false) + { + bAllTracksHeard=false; + app.DebugPrintf("Not heard all tracks yet\n"); + break; + } + } + + if(bAllTracksHeard) + { + app.DebugPrintf("Heard all tracks - resetting the tracking array\n"); + + for(int i=iStart;i<=iEnd;i++) + { + m_bHeardTrackA[i]=false; + } + } + + // trying to get a track we haven't heard, but not too hard + for(int i=0;i<=((iEnd-iStart)/2);i++) + { + // random->nextInt(1) will always return 0 + iVal=random->nextInt((iEnd-iStart)+1)+iStart; + if(m_bHeardTrackA[iVal]==false) + { + // not heard this + app.DebugPrintf("(%d) Not heard track %d yet, so playing it now\n",i,iVal); + m_bHeardTrackA[iVal]=true; + break; + } + else + { + app.DebugPrintf("(%d) Skipping track %d already heard it recently\n",i,iVal); + } + } + + app.DebugPrintf("Select track %d\n",iVal); + return iVal; +} +///////////////////////////////////////////// +// +// getMusicID +// +///////////////////////////////////////////// +int SoundEngine::getMusicID(int iDomain) +{ + int iRandomVal=0; + Minecraft *pMinecraft=Minecraft::GetInstance(); + + // Before the game has started? + if(pMinecraft==NULL) + { + // any track from the overworld + return GetRandomishTrack(m_iStream_Overworld_Min,m_iStream_Overworld_Max); + } + + if(pMinecraft->skins->isUsingDefaultSkin()) + { + switch(iDomain) + { + case LevelData::DIMENSION_END: + // the end isn't random - it has different music depending on whether the dragon is alive or not, but we've not added the dead dragon music yet + return m_iStream_End_Min; + case LevelData::DIMENSION_NETHER: + return GetRandomishTrack(m_iStream_Nether_Min,m_iStream_Nether_Max); + //return m_iStream_Nether_Min + random->nextInt(m_iStream_Nether_Max-m_iStream_Nether_Min); + default: //overworld + //return m_iStream_Overworld_Min + random->nextInt(m_iStream_Overworld_Max-m_iStream_Overworld_Min); + return GetRandomishTrack(m_iStream_Overworld_Min,m_iStream_Overworld_Max); + } + } + else + { + // using a texture pack - may have multiple End music tracks + switch(iDomain) + { + case LevelData::DIMENSION_END: + return GetRandomishTrack(m_iStream_End_Min,m_iStream_End_Max); + case LevelData::DIMENSION_NETHER: + //return m_iStream_Nether_Min + random->nextInt(m_iStream_Nether_Max-m_iStream_Nether_Min); + return GetRandomishTrack(m_iStream_Nether_Min,m_iStream_Nether_Max); + default: //overworld + //return m_iStream_Overworld_Min + random->nextInt(m_iStream_Overworld_Max-m_iStream_Overworld_Min); + return GetRandomishTrack(m_iStream_Overworld_Min,m_iStream_Overworld_Max); + } + } +} + +///////////////////////////////////////////// +// +// getMusicID +// +///////////////////////////////////////////// +// check what the CD is +int SoundEngine::getMusicID(const wstring& name) +{ + int iCD=0; + char *SoundName = (char *)ConvertSoundPathToName(name,true); + + // 4J-PB - these will always be the game cds, so use the m_szStreamFileA for this + for(int i=0;i<12;i++) + { + if(strcmp(SoundName,m_szStreamFileA[i+eStream_CD_1])==0) + { + iCD=i; + break; + } + } + + // adjust for cd start position on normal or mash-up pack + return iCD+m_iStream_CD_1; +} + +///////////////////////////////////////////// +// +// getMasterMusicVolume +// +///////////////////////////////////////////// +float SoundEngine::getMasterMusicVolume() +{ + if( m_bSystemMusicPlaying ) + { + return 0.0f; + } + else + { + return m_MasterMusicVolume; + } +} + +///////////////////////////////////////////// +// +// updateMusicVolume +// +///////////////////////////////////////////// +void SoundEngine::updateMusicVolume(float fVal) +{ + m_MasterMusicVolume=fVal; +} + +///////////////////////////////////////////// +// +// updateSystemMusicPlaying +// +///////////////////////////////////////////// +void SoundEngine::updateSystemMusicPlaying(bool isPlaying) +{ + m_bSystemMusicPlaying = isPlaying; +} + +///////////////////////////////////////////// +// +// updateSoundEffectVolume +// +///////////////////////////////////////////// +void SoundEngine::updateSoundEffectVolume(float fVal) +{ + m_MasterEffectsVolume=fVal; + //AIL_set_variable_float(0,"UserEffectVol",fVal); +} + +void SoundEngine::add(const wstring& name, File *file) {} +void SoundEngine::addMusic(const wstring& name, File *file) {} +void SoundEngine::addStreaming(const wstring& name, File *file) {} +bool SoundEngine::isStreamingWavebankReady() { return true; } + +int SoundEngine::OpenStreamThreadProc( void* lpParameter ) +{ +#ifdef __DISABLE_MILES__ + return 0; +#endif + SoundEngine *soundEngine = (SoundEngine *)lpParameter; + soundEngine->m_hStream = AIL_open_stream(soundEngine->m_hDriver,soundEngine->m_szStreamName,0); + + if(soundEngine->m_hStream==0) + { + app.DebugPrintf("SoundEngine::OpenStreamThreadProc - Could not open - %s\n",soundEngine->m_szStreamName); + } + return 0; +} + +///////////////////////////////////////////// +// +// playMusicTick +// +///////////////////////////////////////////// +void SoundEngine::playMusicTick() +{ +// AP - vita will update the music during the mixer callback +#ifndef __PSVITA__ + playMusicUpdate(); +#endif +} + +// AP - moved to a separate function so it can be called from the mixer callback on Vita +void SoundEngine::playMusicUpdate() +{ + //return; + static bool firstCall = true; + static float fMusicVol = 0.0f; + if( firstCall ) + { + fMusicVol = getMasterMusicVolume(); + firstCall = false; + } + + switch(m_StreamState) + { + case eMusicStreamState_Idle: + + // start a stream playing + if (m_iMusicDelay > 0) + { + m_iMusicDelay--; + return; + } + + if(m_musicID!=-1) + { + // start playing it + + +#if ( defined __PS3__ || defined __PSVITA__ || defined __ORBIS__ ) + +#ifdef __PS3__ + // 4J-PB - Need to check if we are a patched BD build + if(app.GetBootedFromDiscPatch()) + { + sprintf(m_szStreamName,"%s/%s",app.GetBDUsrDirPath(m_szMusicPath), m_szMusicPath ); + app.DebugPrintf("SoundEngine::playMusicUpdate - (booted from disc patch) music path - %s",m_szStreamName); + } + else + { + sprintf(m_szStreamName,"%s/%s",getUsrDirPath(), m_szMusicPath ); + } +#else + sprintf(m_szStreamName,"%s/%s",getUsrDirPath(), m_szMusicPath ); +#endif + +#else + strcpy((char *)m_szStreamName,m_szMusicPath); +#endif + // are we using a mash-up pack? + //if(pMinecraft && !pMinecraft->skins->isUsingDefaultSkin() && pMinecraft->skins->getSelected()->hasAudio()) + if(Minecraft::GetInstance()->skins->getSelected()->hasAudio()) + { + // It's a mash-up - need to use the DLC path for the music + TexturePack *pTexPack=Minecraft::GetInstance()->skins->getSelected(); + DLCTexturePack *pDLCTexPack=(DLCTexturePack *)pTexPack; + DLCPack *pack = pDLCTexPack->getDLCInfoParentPack(); + DLCAudioFile *dlcAudioFile = (DLCAudioFile *) pack->getFile(DLCManager::e_DLCType_Audio, 0); + + app.DebugPrintf("Mashup pack \n"); + + // build the name + + // if the music ID is beyond the end of the texture pack music files, then it's a CD + if(m_musicIDGetSoundName(m_musicID); + wstring wstrFile=L"TPACK:\\Data\\" + wstrSoundName +L".binka"; + std::wstring mountedPath = StorageManager.GetMountedPath(wstrFile); + wcstombs(m_szStreamName,mountedPath.c_str(),255); +#else + wstring &wstrSoundName=dlcAudioFile->GetSoundName(m_musicID); + char szName[255]; + wcstombs(szName,wstrSoundName.c_str(),255); + +#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 + } + else + { + SetIsPlayingStreamingGameMusic(false); + SetIsPlayingStreamingCDMusic(true); + m_MusicType=eMusicType_CD; + m_StreamingAudioInfo.bIs3D=true; + + // Need to adjust to index into the cds in the game's m_szStreamFileA + strcat((char *)m_szStreamName,"cds/"); + strcat((char *)m_szStreamName,m_szStreamFileA[m_musicID-m_iStream_CD_1+eStream_CD_1]); + strcat((char *)m_szStreamName,".binka"); + } + } + else + { + // 4J-PB - if this is a PS3 disc patch, we have to check if the music file is in the patch data +#ifdef __PS3__ + if(app.GetBootedFromDiscPatch() && (m_musicIDRun(); + m_StreamState = eMusicStreamState_Opening; + } + break; + + case eMusicStreamState_Opening: + // If the open stream thread is complete, then we are ready to proceed to actually playing + if( !m_openStreamThread->isRunning() ) + { + delete m_openStreamThread; + m_openStreamThread = NULL; + + HSAMPLE hSample = AIL_stream_sample_handle( m_hStream); + + // 4J-PB - causes the falloff to be calculated on the PPU instead of the SPU, and seems to resolve our distorted sound issue + AIL_register_falloff_function_callback(hSample,&custom_falloff_function); + + if(m_StreamingAudioInfo.bIs3D) + { + AIL_set_sample_3D_distances(hSample,64.0f,1,0); // Larger distance scaler for music discs + if(m_validListenerCount>1) + { + float fClosest=10000.0f; + int iClosestListener=0; + float fClosestX=0.0f,fClosestY=0.0f,fClosestZ=0.0f,fDist; + // need to calculate the distance from the sound to the nearest listener - use Manhattan Distance as the decision + for( int i = 0; i < MAX_LOCAL_PLAYERS; i++ ) + { + if( m_ListenerA[i].bValid ) + { + float x,y,z; + + x=fabs(m_ListenerA[i].vPosition.x-m_StreamingAudioInfo.x); + y=fabs(m_ListenerA[i].vPosition.y-m_StreamingAudioInfo.y); + z=fabs(m_ListenerA[i].vPosition.z-m_StreamingAudioInfo.z); + fDist=x+y+z; + + if(fDistisRunning() ) + { + delete m_openStreamThread; + m_openStreamThread = NULL; + m_StreamState = eMusicStreamState_Stop; + } + break; + case eMusicStreamState_Stop: + // should gradually take the volume down in steps + AIL_pause_stream(m_hStream,1); + AIL_close_stream(m_hStream); + m_hStream=0; + SetIsPlayingStreamingCDMusic(false); + SetIsPlayingStreamingGameMusic(false); + m_StreamState=eMusicStreamState_Idle; + break; + case eMusicStreamState_Stopping: + break; + case eMusicStreamState_Play: + break; + case eMusicStreamState_Playing: + if(GetIsPlayingStreamingGameMusic()) + { + //if(m_MusicInfo.pCue!=NULL) + { + bool playerInEnd = false; + bool playerInNether=false; + Minecraft *pMinecraft = Minecraft::GetInstance(); + for(unsigned int i = 0; i < MAX_LOCAL_PLAYERS; ++i) + { + if(pMinecraft->localplayers[i]!=NULL) + { + if(pMinecraft->localplayers[i]->dimension==LevelData::DIMENSION_END) + { + playerInEnd=true; + } + else if(pMinecraft->localplayers[i]->dimension==LevelData::DIMENSION_NETHER) + { + playerInNether=true; + } + } + } + + if(playerInEnd && !GetIsPlayingEndMusic()) + { + m_StreamState=eMusicStreamState_Stop; + + // Set the end track + m_musicID = getMusicID(LevelData::DIMENSION_END); + SetIsPlayingEndMusic(true); + SetIsPlayingNetherMusic(false); + } + else if(!playerInEnd && GetIsPlayingEndMusic()) + { + if(playerInNether) + { + m_StreamState=eMusicStreamState_Stop; + + // Set the end track + m_musicID = getMusicID(LevelData::DIMENSION_NETHER); + SetIsPlayingEndMusic(false); + SetIsPlayingNetherMusic(true); + } + else + { + m_StreamState=eMusicStreamState_Stop; + + // Set the end track + m_musicID = getMusicID(LevelData::DIMENSION_OVERWORLD); + SetIsPlayingEndMusic(false); + SetIsPlayingNetherMusic(false); + } + } + else if (playerInNether && !GetIsPlayingNetherMusic()) + { + m_StreamState=eMusicStreamState_Stop; + // set the Nether track + m_musicID = getMusicID(LevelData::DIMENSION_NETHER); + SetIsPlayingNetherMusic(true); + SetIsPlayingEndMusic(false); + } + else if(!playerInNether && GetIsPlayingNetherMusic()) + { + if(playerInEnd) + { + m_StreamState=eMusicStreamState_Stop; + // set the Nether track + m_musicID = getMusicID(LevelData::DIMENSION_END); + SetIsPlayingNetherMusic(false); + SetIsPlayingEndMusic(true); + } + else + { + m_StreamState=eMusicStreamState_Stop; + // set the Nether track + m_musicID = getMusicID(LevelData::DIMENSION_OVERWORLD); + SetIsPlayingNetherMusic(false); + SetIsPlayingEndMusic(false); + } + } + + // volume change required? + if(fMusicVol!=getMasterMusicVolume()) + { + fMusicVol=getMasterMusicVolume(); + HSAMPLE hSample = AIL_stream_sample_handle( m_hStream); + //AIL_set_sample_3D_position( hSample, m_StreamingAudioInfo.x, m_StreamingAudioInfo.y, m_StreamingAudioInfo.z ); + AIL_set_sample_volume_levels( hSample, fMusicVol, fMusicVol); + } + } + } + else + { + // Music disc playing - if it's a 3D stream, then set the position - we don't have any streaming audio in the world that moves, so this isn't + // required unless we have more than one listener, and are setting the listening position to the origin and setting a fake position + // for the sound down the z axis + if(m_StreamingAudioInfo.bIs3D) + { + if(m_validListenerCount>1) + { + float fClosest=10000.0f; + int iClosestListener=0; + float fClosestX=0.0f,fClosestY=0.0f,fClosestZ=0.0f,fDist; + + // need to calculate the distance from the sound to the nearest listener - use Manhattan Distance as the decision + for( int i = 0; i < MAX_LOCAL_PLAYERS; i++ ) + { + if( m_ListenerA[i].bValid ) + { + float x,y,z; + + x=fabs(m_ListenerA[i].vPosition.x-m_StreamingAudioInfo.x); + y=fabs(m_ListenerA[i].vPosition.y-m_StreamingAudioInfo.y); + z=fabs(m_ListenerA[i].vPosition.z-m_StreamingAudioInfo.z); + fDist=x+y+z; + + if(fDistnextInt(20 * 60 * 3);//random->nextInt(20 * 60 * 10) + 20 * 60 * 10; + // Check if we have a local player in The Nether or in The End, and play that music if they are + Minecraft *pMinecraft=Minecraft::GetInstance(); + bool playerInEnd=false; + bool playerInNether=false; + + for(unsigned int i=0;ilocalplayers[i]!=NULL) + { + if(pMinecraft->localplayers[i]->dimension==LevelData::DIMENSION_END) + { + playerInEnd=true; + } + else if(pMinecraft->localplayers[i]->dimension==LevelData::DIMENSION_NETHER) + { + playerInNether=true; + } + } + } + if(playerInEnd) + { + m_musicID = getMusicID(LevelData::DIMENSION_END); + SetIsPlayingEndMusic(true); + SetIsPlayingNetherMusic(false); + } + else if(playerInNether) + { + m_musicID = getMusicID(LevelData::DIMENSION_NETHER); + SetIsPlayingNetherMusic(true); + SetIsPlayingEndMusic(false); + } + else + { + m_musicID = getMusicID(LevelData::DIMENSION_OVERWORLD); + SetIsPlayingNetherMusic(false); + SetIsPlayingEndMusic(false); + } + + m_StreamState=eMusicStreamState_Idle; + } + break; + } + + // check the status of the stream - this is for when a track completes rather than is stopped by the user action + + if(m_hStream!=0) + { + if(AIL_stream_status(m_hStream)==SMP_DONE ) // SMP_DONE + { + AIL_close_stream(m_hStream); + m_hStream=0; + SetIsPlayingStreamingCDMusic(false); + SetIsPlayingStreamingGameMusic(false); + + m_StreamState=eMusicStreamState_Completed; + } + } +} + + +///////////////////////////////////////////// +// +// ConvertSoundPathToName +// +///////////////////////////////////////////// +char *SoundEngine::ConvertSoundPathToName(const wstring& name, bool bConvertSpaces) +{ + static char buf[256]; + assert(name.length()<256); + for(unsigned int i = 0; i < name.length(); i++ ) + { + wchar_t c = name[i]; + if(c=='.') c='/'; + if(bConvertSpaces) + { + if(c==' ') c='_'; + } + buf[i] = (char)c; + } + buf[name.length()] = 0; + return buf; +} + +#endif + + +F32 AILCALLBACK custom_falloff_function (HSAMPLE S, + F32 distance, + F32 rolloff_factor, + F32 min_dist, + F32 max_dist) +{ + F32 result; + + // This is now emulating the linear fall-off function that we used on the Xbox 360. The parameter which is passed as "max_dist" is the only one actually used, + // and is generally used as CurveDistanceScaler is used on XACT on the Xbox. A special value of 10000.0f is passed for thunder, which has no attenuation + + if( max_dist == 10000.0f ) + { + return 1.0f; + } + + result = 1.0f - ( distance / max_dist ); + if( result < 0.0f ) result = 0.0f; + if( result > 1.0f ) result = 1.0f; + + return result; +} diff --git a/Minecraft.Client/Common/Audio/SoundEngine.h b/Minecraft.Client/Common/Audio/SoundEngine.h new file mode 100644 index 00000000..92c99d23 --- /dev/null +++ b/Minecraft.Client/Common/Audio/SoundEngine.h @@ -0,0 +1,168 @@ +#pragma once +class Mob; +class Options; +using namespace std; +#include "..\..\Minecraft.World\SoundTypes.h" + +enum eMUSICFILES +{ + eStream_Overworld_Calm1 = 0, + eStream_Overworld_Calm2, + eStream_Overworld_Calm3, + eStream_Overworld_hal1, + eStream_Overworld_hal2, + eStream_Overworld_hal3, + eStream_Overworld_hal4, + eStream_Overworld_nuance1, + eStream_Overworld_nuance2, +#ifndef _XBOX + // Add the new music tracks + eStream_Overworld_Creative1, + eStream_Overworld_Creative2, + eStream_Overworld_Creative3, + eStream_Overworld_Creative4, + eStream_Overworld_Creative5, + eStream_Overworld_Creative6, + eStream_Overworld_Menu1, + eStream_Overworld_Menu2, + eStream_Overworld_Menu3, + eStream_Overworld_Menu4, +#endif + eStream_Overworld_piano1, + eStream_Overworld_piano2, + eStream_Overworld_piano3, // <-- make piano3 the last overworld one + // Nether + eStream_Nether1, + eStream_Nether2, + eStream_Nether3, + eStream_Nether4, + // The End + eStream_end_dragon, + eStream_end_end, + eStream_CD_1, + eStream_CD_2, + eStream_CD_3, + eStream_CD_4, + eStream_CD_5, + eStream_CD_6, + eStream_CD_7, + eStream_CD_8, + eStream_CD_9, + eStream_CD_10, + eStream_CD_11, + eStream_CD_12, + eStream_Max, +}; + +enum eMUSICTYPE +{ + eMusicType_None, + eMusicType_Game, + eMusicType_CD, +}; + + +enum MUSIC_STREAMSTATE +{ + eMusicStreamState_Idle=0, + eMusicStreamState_Stop, + eMusicStreamState_Stopping, + eMusicStreamState_Opening, + eMusicStreamState_OpeningCancel, + eMusicStreamState_Play, + eMusicStreamState_Playing, + eMusicStreamState_Completed +}; + +typedef struct +{ + F32 x,y,z,volume,pitch; + int iSound; + bool bIs3D; + bool bUseSoundsPitchVal; +#ifdef _DEBUG + char chName[64]; +#endif +} +AUDIO_INFO; + +class SoundEngine : public ConsoleSoundEngine +{ + static const int MAX_SAME_SOUNDS_PLAYING = 8; // 4J added +public: + SoundEngine(); + virtual void destroy(); +#ifdef _DEBUG + void GetSoundName(char *szSoundName,int iSound); +#endif + virtual void play(int iSound, float x, float y, float z, float volume, float pitch); + virtual void playStreaming(const wstring& name, float x, float y , float z, float volume, float pitch, bool bMusicDelay=true); + virtual void playUI(int iSound, float volume, float pitch); + virtual void playMusicTick(); + virtual void updateMusicVolume(float fVal); + virtual void updateSystemMusicPlaying(bool isPlaying); + virtual void updateSoundEffectVolume(float fVal); + virtual void init(Options *); + virtual void tick(shared_ptr *players, float a); // 4J - updated to take array of local players rather than single one + virtual void add(const wstring& name, File *file); + virtual void addMusic(const wstring& name, File *file); + virtual void addStreaming(const wstring& name, File *file); + virtual char *ConvertSoundPathToName(const wstring& name, bool bConvertSpaces=false); + bool isStreamingWavebankReady(); // 4J Added + int getMusicID(int iDomain); + int getMusicID(const wstring& name); + void SetStreamingSounds(int iOverworldMin, int iOverWorldMax, int iNetherMin, int iNetherMax, int iEndMin, int iEndMax, int iCD1); + void updateMiles(); // AP added so Vita can update all the Miles functions during the mixer callback + void playMusicUpdate(); + +private: + float getMasterMusicVolume(); + // platform specific functions +#ifdef __PS3__ + int initAudioHardware(int iMinSpeakers); +#else + int initAudioHardware(int iMinSpeakers) { return iMinSpeakers;} +#endif + + int GetRandomishTrack(int iStart,int iEnd); + + HMSOUNDBANK m_hBank; + HDIGDRIVER m_hDriver; + HSTREAM m_hStream; + + static char m_szSoundPath[]; + static char m_szMusicPath[]; + static char m_szRedistName[]; + static char *m_szStreamFileA[eStream_Max]; + + AUDIO_LISTENER m_ListenerA[MAX_LOCAL_PLAYERS]; + int m_validListenerCount; + + + Random *random; + int m_musicID; + int m_iMusicDelay; + int m_StreamState; + int m_MusicType; + AUDIO_INFO m_StreamingAudioInfo; + wstring m_CDMusic; + BOOL m_bSystemMusicPlaying; + float m_MasterMusicVolume; + float m_MasterEffectsVolume; + + C4JThread *m_openStreamThread; + static int OpenStreamThreadProc( void* lpParameter ); + char m_szStreamName[255]; + int CurrentSoundsPlaying[eSoundType_MAX+eSFX_MAX]; + + // streaming music files - will be different for mash-up packs + int m_iStream_Overworld_Min,m_iStream_Overworld_Max; + int m_iStream_Nether_Min,m_iStream_Nether_Max; + int m_iStream_End_Min,m_iStream_End_Max; + int m_iStream_CD_1; + bool *m_bHeardTrackA; + +#ifdef __ORBIS__ + int32_t m_hBGMAudio; +#endif +}; diff --git a/Minecraft.Client/Common/Audio/SoundNames.cpp b/Minecraft.Client/Common/Audio/SoundNames.cpp new file mode 100644 index 00000000..1ab709b2 --- /dev/null +++ b/Minecraft.Client/Common/Audio/SoundNames.cpp @@ -0,0 +1,237 @@ +#include "stdafx.h" + +#include "Consoles_SoundEngine.h" + + + +const WCHAR *ConsoleSoundEngine::wchSoundNames[eSoundType_MAX]= +{ + L"mob.chicken", // eSoundType_MOB_CHICKEN_AMBIENT + L"mob.chickenhurt", // eSoundType_MOB_CHICKEN_HURT + L"mob.chickenplop", // eSoundType_MOB_CHICKENPLOP + L"mob.cow", // eSoundType_MOB_COW_AMBIENT + L"mob.cowhurt", // eSoundType_MOB_COW_HURT + L"mob.pig", // eSoundType_MOB_PIG_AMBIENT + L"mob.pigdeath", // eSoundType_MOB_PIG_DEATH + L"mob.sheep", // eSoundType_MOB_SHEEP_AMBIENT + L"mob.wolf.growl", // eSoundType_MOB_WOLF_GROWL + L"mob.wolf.whine", // eSoundType_MOB_WOLF_WHINE + L"mob.wolf.panting", // eSoundType_MOB_WOLF_PANTING + L"mob.wolf.bark", // eSoundType_MOB_WOLF_BARK + L"mob.wolf.hurt", // eSoundType_MOB_WOLF_HURT + L"mob.wolf.death", // eSoundType_MOB_WOLF_DEATH + L"mob.wolf.shake", // eSoundType_MOB_WOLF_SHAKE + L"mob.blaze.breathe", // eSoundType_MOB_BLAZE_BREATHE + L"mob.blaze.hit", // eSoundType_MOB_BLAZE_HURT + L"mob.blaze.death", // eSoundType_MOB_BLAZE_DEATH + L"mob.ghast.moan", // eSoundType_MOB_GHAST_MOAN + L"mob.ghast.scream", // eSoundType_MOB_GHAST_SCREAM + L"mob.ghast.death", // eSoundType_MOB_GHAST_DEATH + L"mob.ghast.fireball", // eSoundType_MOB_GHAST_FIREBALL + L"mob.ghast.charge", // eSoundType_MOB_GHAST_CHARGE + L"mob.endermen.idle", // eSoundType_MOB_ENDERMEN_IDLE + L"mob.endermen.hit", // eSoundType_MOB_ENDERMEN_HIT + L"mob.endermen.death", // eSoundType_MOB_ENDERMEN_DEATH + L"mob.endermen.portal", // eSoundType_MOB_ENDERMEN_PORTAL + L"mob.zombiepig.zpig", // eSoundType_MOB_ZOMBIEPIG_AMBIENT + L"mob.zombiepig.zpighurt", // eSoundType_MOB_ZOMBIEPIG_HURT + L"mob.zombiepig.zpigdeath", // eSoundType_MOB_ZOMBIEPIG_DEATH + L"mob.zombiepig.zpigangry", // eSoundType_MOB_ZOMBIEPIG_ZPIGANGRY + L"mob.silverfish.say", // eSoundType_MOB_SILVERFISH_AMBIENT, + L"mob.silverfish.hit", // eSoundType_MOB_SILVERFISH_HURT + L"mob.silverfish.kill", // eSoundType_MOB_SILVERFISH_DEATH, + L"mob.silverfish.step", // eSoundType_MOB_SILVERFISH_STEP, + L"mob.skeleton", // eSoundType_MOB_SKELETON_AMBIENT, + L"mob.skeletonhurt", // eSoundType_MOB_SKELETON_HURT, + L"mob.spider", // eSoundType_MOB_SPIDER_AMBIENT, + L"mob.spiderdeath", // eSoundType_MOB_SPIDER_DEATH, + L"mob.slime", // eSoundType_MOB_SLIME, + L"mob.slimeattack", // eSoundType_MOB_SLIME_ATTACK, + L"mob.creeper", // eSoundType_MOB_CREEPER_HURT, + L"mob.creeperdeath", // eSoundType_MOB_CREEPER_DEATH, + L"mob.zombie", // eSoundType_MOB_ZOMBIE_AMBIENT, + L"mob.zombiehurt", // eSoundType_MOB_ZOMBIE_HURT, + L"mob.zombiedeath", // eSoundType_MOB_ZOMBIE_DEATH, + L"mob.zombie.wood", // eSoundType_MOB_ZOMBIE_WOOD, + L"mob.zombie.woodbreak", // eSoundType_MOB_ZOMBIE_WOOD_BREAK, + L"mob.zombie.metal", // eSoundType_MOB_ZOMBIE_METAL, + L"mob.magmacube.big", // eSoundType_MOB_MAGMACUBE_BIG, + L"mob.magmacube.small", // eSoundType_MOB_MAGMACUBE_SMALL, + L"mob.cat.purr", // eSoundType_MOB_CAT_PURR + L"mob.cat.purreow", // eSoundType_MOB_CAT_PURREOW + L"mob.cat.meow", // eSoundType_MOB_CAT_MEOW + // 4J-PB - correct the name of the event for hitting ocelots + L"mob.cat.hit", // eSoundType_MOB_CAT_HITT +// L"mob.irongolem.throw", // eSoundType_MOB_IRONGOLEM_THROW +// L"mob.irongolem.hit", // eSoundType_MOB_IRONGOLEM_HIT +// L"mob.irongolem.death", // eSoundType_MOB_IRONGOLEM_DEATH +// L"mob.irongolem.walk", // eSoundType_MOB_IRONGOLEM_WALK + L"random.bow", // eSoundType_RANDOM_BOW, + L"random.bowhit", // eSoundType_RANDOM_BOW_HIT, + L"random.explode", // eSoundType_RANDOM_EXPLODE, + L"random.fizz", // eSoundType_RANDOM_FIZZ, + L"random.pop", // eSoundType_RANDOM_POP, + L"random.fuse", // eSoundType_RANDOM_FUSE, + L"random.drink", // eSoundType_RANDOM_DRINK, + L"random.eat", // eSoundType_RANDOM_EAT, + L"random.burp", // eSoundType_RANDOM_BURP, + L"random.splash", // eSoundType_RANDOM_SPLASH, + L"random.click", // eSoundType_RANDOM_CLICK, + L"random.glass", // eSoundType_RANDOM_GLASS, + L"random.orb", // eSoundType_RANDOM_ORB, + L"random.break", // eSoundType_RANDOM_BREAK, + L"random.chestopen", // eSoundType_RANDOM_CHEST_OPEN, + L"random.chestclosed", // eSoundType_RANDOM_CHEST_CLOSE, + L"random.door_open", // eSoundType_RANDOM_DOOR_OPEN, + L"random.door_close", // eSoundType_RANDOM_DOOR_CLOSE, + L"ambient.weather.rain", // eSoundType_AMBIENT_WEATHER_RAIN, + L"ambient.weather.thunder", // eSoundType_AMBIENT_WEATHER_THUNDER, + L"ambient.cave.cave", // eSoundType_CAVE_CAVE, DON'T USE FOR XBOX 360!!! +#ifdef _XBOX + L"ambient.cave.cave2", // eSoundType_CAVE_CAVE2 - removed the two sounds that were at 192k in the first ambient cave event +#endif + L"portal.portal", // eSoundType_PORTAL_PORTAL, + // 4J-PB - added a couple that were still using wstring + L"portal.trigger", // eSoundType_PORTAL_TRIGGER + L"portal.travel", // eSoundType_PORTAL_TRAVEL + + L"fire.ignite", // eSoundType_FIRE_IGNITE, + L"fire.fire", // eSoundType_FIRE_FIRE, + L"damage.hurtflesh", // eSoundType_DAMAGE_HURT, + L"damage.fallsmall", // eSoundType_DAMAGE_FALL_SMALL, + L"damage.fallbig", // eSoundType_DAMAGE_FALL_BIG, + L"note.harp", // eSoundType_NOTE_HARP, + L"note.bd", // eSoundType_NOTE_BD, + L"note.snare", // eSoundType_NOTE_SNARE, + L"note.hat", // eSoundType_NOTE_HAT, + L"note.bassattack", // eSoundType_NOTE_BASSATTACK, + L"tile.piston.in", // eSoundType_TILE_PISTON_IN, + L"tile.piston.out", // eSoundType_TILE_PISTON_OUT, + L"liquid.water", // eSoundType_LIQUID_WATER, + L"liquid.lavapop", // eSoundType_LIQUID_LAVA_POP, + L"liquid.lava", // eSoundType_LIQUID_LAVA, + L"step.stone", // eSoundType_STEP_STONE, + L"step.wood", // eSoundType_STEP_WOOD, + L"step.gravel", // eSoundType_STEP_GRAVEL, + L"step.grass", // eSoundType_STEP_GRASS, + L"step.metal", // eSoundType_STEP_METAL, + L"step.cloth", // eSoundType_STEP_CLOTH, + L"step.sand", // eSoundType_STEP_SAND, + + // below this are the additional sounds from the second soundbank + L"mob.enderdragon.end", // eSoundType_MOB_ENDERDRAGON_END + L"mob.enderdragon.growl", // eSoundType_MOB_ENDERDRAGON_GROWL + L"mob.enderdragon.hit", // eSoundType_MOB_ENDERDRAGON_HIT + L"mob.enderdragon.wings", // eSoundType_MOB_ENDERDRAGON_MOVE + L"mob.irongolem.throw", // eSoundType_MOB_IRONGOLEM_THROW + L"mob.irongolem.hit", // eSoundType_MOB_IRONGOLEM_HIT + L"mob.irongolem.death", // eSoundType_MOB_IRONGOLEM_DEATH + L"mob.irongolem.walk", // eSoundType_MOB_IRONGOLEM_WALK + + // TU14 + L"damage.thorns", // eSoundType_DAMAGE_THORNS + L"random.anvil_break", // eSoundType_RANDOM_ANVIL_BREAK + L"random.anvil_land", // eSoundType_RANDOM_ANVIL_LAND + L"random.anvil_use", // eSoundType_RANDOM_ANVIL_USE + L"mob.villager.haggle", // eSoundType_MOB_VILLAGER_HAGGLE + L"mob.villager.idle", // eSoundType_MOB_VILLAGER_IDLE + L"mob.villager.hit", // eSoundType_MOB_VILLAGER_HIT + L"mob.villager.death", // eSoundType_MOB_VILLAGER_DEATH + L"mob.villager.yes", // eSoundType_MOB_VILLAGER_YES + L"mob.villager.no", // eSoundType_MOB_VILLAGER_NO + L"mob.zombie.infect", // eSoundType_MOB_ZOMBIE_INFECT + L"mob.zombie.unfect", // eSoundType_MOB_ZOMBIE_UNFECT + L"mob.zombie.remedy", // eSoundType_MOB_ZOMBIE_REMEDY + L"step.snow", // eSoundType_STEP_SNOW + L"step.ladder", // eSoundType_STEP_LADDER + L"dig.cloth", // eSoundType_DIG_CLOTH + L"dig.grass", // eSoundType_DIG_GRASS + L"dig.gravel", // eSoundType_DIG_GRAVEL + L"dig.sand", // eSoundType_DIG_SAND + L"dig.snow", // eSoundType_DIG_SNOW + L"dig.stone", // eSoundType_DIG_STONE + L"dig.wood", // eSoundType_DIG_WOOD + + // 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", +}; + + +const WCHAR *ConsoleSoundEngine::wchUISoundNames[eSFX_MAX]= +{ + L"back", + L"craft", + L"craftfail", + L"focus", + L"press", + L"scroll", +}; diff --git a/Minecraft.Client/Common/BuildVer.h b/Minecraft.Client/Common/BuildVer.h new file mode 100644 index 00000000..9248a8eb --- /dev/null +++ b/Minecraft.Client/Common/BuildVer.h @@ -0,0 +1,57 @@ + +#pragma once + + +#define VER_PRODUCTMAJORVERSION 0 +#define VER_PRODUCTMINORVERSION 0 + +// This goes up with each build +// 4J-JEV: This value is extracted with a regex so it can be placed as the version in the AppX manifest on Durango. +#define VER_PRODUCTBUILD 560 +// This goes up if there is any change to network traffic or code in a build +#define VER_NETWORK 560 +#define VER_PRODUCTBUILD_QFE 0 + +#define VER_FILEVERSION_STRING "1.6" +#define VER_PRODUCTVERSION_STRING VER_FILEVERSION_STRING +#define VER_FILEVERSION_STRING_W L"1.6" +#define VER_PRODUCTVERSION_STRING_W VER_FILEVERSION_STRING_W +#define VER_FILEBETA_STR "" +#undef VER_FILEVERSION +#define VER_FILEVERSION VER_PRODUCTMAJORVERSION, VER_PRODUCTMINORVERSION, VER_PRODUCTBUILD, VER_PRODUCTBUILD_QFE +#define VER_PRODUCTVERSION VER_PRODUCTMAJORVERSION, VER_PRODUCTMINORVERSION, VER_PRODUCTBUILD, VER_PRODUCTBUILD_QFE + +#if (VER_PRODUCTBUILD < 10) +#define VER_FILEBPAD "000" +#define VER_FILEBPAD_W L"000" +#elif (VER_PRODUCTBUILD < 100) +#define VER_FILEBPAD "00" +#define VER_FILEBPAD_W L"00" +#elif (VER_PRODUCTBUILD < 1000) +#define VER_FILEBPAD "0" +#define VER_FILEBPAD_W L"0" +#else +#define VER_FILEBPAD +#define VER_FILEBPAD_W +#endif + +#define VER_WIDE_PREFIX(x) L##x + +#define VER_FILEVERSION_STR2(x,y) VER_FILEVERSION_STRING "." VER_FILEBPAD #x "." #y +#define VER_FILEVERSION_STR2_W(x,y) VER_FILEVERSION_STRING_W L"." VER_FILEBPAD_W VER_WIDE_PREFIX(#x) L"." VER_WIDE_PREFIX(#y) +#define VER_FILEVERSION_STR1(x,y) VER_FILEVERSION_STR2(x, y) +#define VER_FILEVERSION_STR1_W(x,y) VER_FILEVERSION_STR2_W(x, y) + +#undef VER_FILEVERSION_STR +#define VER_FILEVERSION_STR VER_FILEVERSION_STR1(VER_PRODUCTBUILD, VER_PRODUCTBUILD_QFE) +#define VER_PRODUCTVERSION_STR VER_FILEVERSION_STR1(VER_PRODUCTBUILD, VER_PRODUCTBUILD_QFE) + +#define VER_FILEVERSION_STR_W VER_FILEVERSION_STR1_W(VER_PRODUCTBUILD, VER_PRODUCTBUILD_QFE) +#define VER_PRODUCTVERSION_STR_W VER_FILEVERSION_STR1_W(VER_PRODUCTBUILD, VER_PRODUCTBUILD_QFE) + +#if (VER_PRODUCTBUILD_QFE >= 256) +#error "QFE number cannot exceed 255" +#endif + + + diff --git a/Minecraft.Client/Common/C4JMemoryPool.h b/Minecraft.Client/Common/C4JMemoryPool.h new file mode 100644 index 00000000..e1e795ec --- /dev/null +++ b/Minecraft.Client/Common/C4JMemoryPool.h @@ -0,0 +1,176 @@ + +#pragma once + + +#include + +class C4JMemoryPool +{ +public: + unsigned int Align(unsigned int val, unsigned int align) { return int((val+(align-1))/align) * align; } + virtual void* Alloc(size_t size) = 0; + virtual void Free(void* ptr) = 0; +}; + + + +// Fast Efficient Fixed-Size Memory Pool : No Loops and No Overhead +// http://www.alogicalmind.com/memory_pools/index.htm +class C4JMemoryPoolFixed : public C4JMemoryPool +{ + // Basic type define + typedef unsigned int uint; + typedef unsigned char uchar; + uint m_numOfBlocks; // Num of blocks + uint m_sizeOfEachBlock; // Size of each block + uint m_numFreeBlocks; // Num of remaining blocks + uint m_numInitialized; // Num of initialized blocks + uchar* m_memStart; // Beginning of memory pool + uchar* m_memEnd; // End of memory pool + uchar* m_next; // Num of next free block +// CRITICAL_SECTION m_CS; +public: + C4JMemoryPoolFixed() + { + m_numOfBlocks = 0; + m_sizeOfEachBlock = 0; + m_numFreeBlocks = 0; + m_numInitialized = 0; + m_memStart = NULL; + m_memEnd = NULL; + m_next = 0; + } + + C4JMemoryPoolFixed(uint sizeOfEachBlock, uint numOfBlocks) + { + CreatePool(sizeOfEachBlock, numOfBlocks); + } + + ~C4JMemoryPoolFixed() { DestroyPool(); } + + void CreatePool(uint sizeOfEachBlock, uint numOfBlocks) + { + assert(sizeOfEachBlock >= 4); // has to be at least the size of an int, for book keeping + m_numOfBlocks = numOfBlocks; + m_sizeOfEachBlock = sizeOfEachBlock; + m_numFreeBlocks = numOfBlocks; + m_numInitialized = 0; + m_memStart = new uchar[ m_sizeOfEachBlock * + m_numOfBlocks ]; + m_memEnd = m_memStart + (m_sizeOfEachBlock * m_numOfBlocks); + m_next = m_memStart; +// InitializeCriticalSection(&m_CS); + } + + void DestroyPool() + { + delete[] m_memStart; + m_memStart = NULL; + } + + uchar* AddrFromIndex(uint i) const + { + return m_memStart + ( i * m_sizeOfEachBlock ); + } + + uint IndexFromAddr(const uchar* p) const + { + return (((uint)(p - m_memStart)) / m_sizeOfEachBlock); + } + + virtual void* Alloc(size_t size) + { + if(size > m_sizeOfEachBlock) + return ::malloc(size); +// EnterCriticalSection(&m_CS); + if (m_numInitialized < m_numOfBlocks ) + { + uint* p = (uint*)AddrFromIndex( m_numInitialized ); + *p = m_numInitialized + 1; + m_numInitialized++; + } + void* ret = NULL; + if ( m_numFreeBlocks > 0 ) + { + ret = (void*)m_next; + --m_numFreeBlocks; + if (m_numFreeBlocks!=0) + { + m_next = AddrFromIndex( *((uint*)m_next) ); + } + else + { + m_next = NULL; + } + } +// LeaveCriticalSection(&m_CS); + return ret; + } + + virtual void Free(void* ptr) + { + if(ptr < m_memStart || ptr > m_memEnd) + { + ::free(ptr); + return; + } +// EnterCriticalSection(&m_CS); + if (m_next != NULL) + { + (*(uint*)ptr) = IndexFromAddr( m_next ); + m_next = (uchar*)ptr; + } + else + { + *((uint*)ptr) = m_numOfBlocks; + m_next = (uchar*)ptr; + } + ++m_numFreeBlocks; +// LeaveCriticalSection(&m_CS); + } +}; // End pool class + + +// this pool will constantly grow until it is reset (automatically when all allocs have been "freed") +class C4JMemoryPoolGrow : public C4JMemoryPool +{ + uint32_t m_totalSize; + uint32_t m_memUsed; + uint32_t m_numAllocations; + uint8_t* m_pMemory; + uint32_t m_currentOffset; + +public: + C4JMemoryPoolGrow(uint32_t size = 64*1024) + { + size = Align(size, 4); + m_totalSize = size; + m_pMemory = new uint8_t[size]; + m_currentOffset = 0; + m_memUsed = 0; + m_numAllocations = 0; + } + + virtual void* Alloc(size_t size) + { + size = Align(size, 4); // 4 byte align the memory + assert((m_currentOffset + size) < m_totalSize); // make sure we haven't ran out of space + void* returnMem = &m_pMemory[m_currentOffset]; // grab the return memory + m_currentOffset += size; + m_numAllocations++; + return returnMem; + } + virtual void Free(void* ptr) + { + m_numAllocations--; + if(m_numAllocations == 0) + m_currentOffset = 0; // reset the pool when we reach zero allocations + } +}; + + + + + + + diff --git a/Minecraft.Client/Common/C4JMemoryPoolAllocator.h b/Minecraft.Client/Common/C4JMemoryPoolAllocator.h new file mode 100644 index 00000000..a46cc76d --- /dev/null +++ b/Minecraft.Client/Common/C4JMemoryPoolAllocator.h @@ -0,0 +1,113 @@ + + +#pragma once +#include "..\Minecraft.Client\Common\C4JMemoryPool.h" + +// Custom allocator, takes a C4JMemoryPool class, which can be one of a number of pool implementations. + +template +class C4JPoolAllocator +{ +public: + typedef T value_type; + typedef size_t size_type; + typedef ptrdiff_t difference_type; + + typedef T* pointer; + typedef const T* const_pointer; + + typedef T& reference; + typedef const T& const_reference; + + //! A struct to construct an allocator for a different type. + template + struct rebind { typedef C4JPoolAllocator other; }; + + + C4JMemoryPool* m_pPool; + bool m_selfAllocated; + + C4JPoolAllocator( C4JMemoryPool* pool = new C4JMemoryPoolFixed(32, 4096 )) : m_pPool( pool ), m_selfAllocated(true) + { + printf("allocated mempool\n"); + } + + template + C4JPoolAllocator(C4JPoolAllocator const& obj) : m_pPool( obj.m_pPool ), m_selfAllocated(false) // copy constructor + { + printf("C4JPoolAllocator constructed from 0x%08x\n", &obj); + assert(obj.m_pPool); + } +private: + +public: + + ~C4JPoolAllocator() + { + if(m_selfAllocated) + delete m_pPool; + } + + pointer address( reference r ) const { return &r; } + const_pointer address( const_reference r ) const { return &r; } + + pointer allocate( size_type n, const void* /*hint*/=0 ) + { + assert(m_pPool); + return (pointer)m_pPool->Alloc(n * sizeof(T)); + } + + void deallocate( pointer p, size_type /*n*/ ) + { + assert(m_pPool); + m_pPool->Free(p); + } + + void construct( pointer p, const T& val ) + { + new (p) T(val); + } + + void destroy( pointer p ) + { + p->~T(); + } + + size_type max_size() const + { + return ULONG_MAX / sizeof(T); + } + +}; + + +template +bool +operator==( const C4JPoolAllocator& left, const C4JPoolAllocator& right ) +{ + if (left.m_pPool == right.m_pPool) + { + return true; + } + return false; +} + +template +bool +operator!=( const C4JPoolAllocator& left, const C4JPoolAllocator& right) +{ + if (left.m_pPool != right.m_pPool) + { + return true; + } + return false; +} + + + + + + + + + diff --git a/Minecraft.Client/Common/Colours/ColourTable.cpp b/Minecraft.Client/Common/Colours/ColourTable.cpp new file mode 100644 index 00000000..5c74d5ec --- /dev/null +++ b/Minecraft.Client/Common/Colours/ColourTable.cpp @@ -0,0 +1,381 @@ +#include "stdafx.h" +#include "ColourTable.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" + +unordered_map ColourTable::s_colourNamesMap; + +wchar_t *ColourTable::ColourTableElements[eMinecraftColour_COUNT] = +{ + L"NOTSET", + + L"Foliage_Evergreen", + L"Foliage_Birch", + L"Foliage_Default", + L"Foliage_Common", + L"Foliage_Ocean", + L"Foliage_Plains", + L"Foliage_Desert", + L"Foliage_ExtremeHills", + L"Foliage_Forest", + L"Foliage_Taiga", + L"Foliage_Swampland", + L"Foliage_River", + L"Foliage_Hell", + L"Foliage_Sky", + L"Foliage_FrozenOcean", + L"Foliage_FrozenRiver", + L"Foliage_IcePlains", + L"Foliage_IceMountains", + L"Foliage_MushroomIsland", + L"Foliage_MushroomIslandShore", + L"Foliage_Beach", + L"Foliage_DesertHills", + L"Foliage_ForestHills", + L"Foliage_TaigaHills", + L"Foliage_ExtremeHillsEdge", + L"Foliage_Jungle", + L"Foliage_JungleHills", + + L"Grass_Common", + L"Grass_Ocean", + L"Grass_Plains", + L"Grass_Desert", + L"Grass_ExtremeHills", + L"Grass_Forest", + L"Grass_Taiga", + L"Grass_Swampland", + L"Grass_River", + L"Grass_Hell", + L"Grass_Sky", + L"Grass_FrozenOcean", + L"Grass_FrozenRiver", + L"Grass_IcePlains", + L"Grass_IceMountains", + L"Grass_MushroomIsland", + L"Grass_MushroomIslandShore", + L"Grass_Beach", + L"Grass_DesertHills", + L"Grass_ForestHills", + L"Grass_TaigaHills", + L"Grass_ExtremeHillsEdge", + L"Grass_Jungle", + L"Grass_JungleHills", + + L"Water_Ocean", + L"Water_Plains", + L"Water_Desert", + L"Water_ExtremeHills", + L"Water_Forest", + L"Water_Taiga", + L"Water_Swampland", + L"Water_River", + L"Water_Hell", + L"Water_Sky", + L"Water_FrozenOcean", + L"Water_FrozenRiver", + L"Water_IcePlains", + L"Water_IceMountains", + L"Water_MushroomIsland", + L"Water_MushroomIslandShore", + L"Water_Beach", + L"Water_DesertHills", + L"Water_ForestHills", + L"Water_TaigaHills", + L"Water_ExtremeHillsEdge", + L"Water_Jungle", + L"Water_JungleHills", + + L"Sky_Ocean", + L"Sky_Plains", + L"Sky_Desert", + L"Sky_ExtremeHills", + L"Sky_Forest", + L"Sky_Taiga", + L"Sky_Swampland", + L"Sky_River", + L"Sky_Hell", + L"Sky_Sky", + L"Sky_FrozenOcean", + L"Sky_FrozenRiver", + L"Sky_IcePlains", + L"Sky_IceMountains", + L"Sky_MushroomIsland", + L"Sky_MushroomIslandShore", + L"Sky_Beach", + L"Sky_DesertHills", + L"Sky_ForestHills", + L"Sky_TaigaHills", + L"Sky_ExtremeHillsEdge", + L"Sky_Jungle", + L"Sky_JungleHills", + + L"Tile_RedstoneDust", + L"Tile_RedstoneDustUnlit", + L"Tile_RedstoneDustLitMin", + L"Tile_RedstoneDustLitMax", + L"Tile_StemMin", + L"Tile_StemMax", + L"Tile_WaterLily", + + L"Sky_Dawn_Dark", + L"Sky_Dawn_Bright", + + L"Material_None", + L"Material_Grass", + L"Material_Sand", + L"Material_Cloth", + L"Material_Fire", + L"Material_Ice", + L"Material_Metal", + L"Material_Plant", + L"Material_Snow", + L"Material_Clay", + L"Material_Dirt", + L"Material_Stone", + L"Material_Water", + L"Material_Wood", + L"Material_Emerald", + + L"Particle_Note_00", + L"Particle_Note_01", + L"Particle_Note_02", + L"Particle_Note_03", + L"Particle_Note_04", + L"Particle_Note_05", + L"Particle_Note_06", + L"Particle_Note_07", + L"Particle_Note_08", + L"Particle_Note_09", + L"Particle_Note_10", + L"Particle_Note_11", + L"Particle_Note_12", + L"Particle_Note_13", + L"Particle_Note_14", + L"Particle_Note_15", + L"Particle_Note_16", + L"Particle_Note_17", + L"Particle_Note_18", + L"Particle_Note_19", + L"Particle_Note_20", + L"Particle_Note_21", + L"Particle_Note_22", + L"Particle_Note_23", + L"Particle_Note_24", + + L"Particle_NetherPortal", + L"Particle_EnderPortal", + L"Particle_Smoke", + L"Particle_Ender", + + L"Particle_Explode", + L"Particle_HugeExplosion", + + L"Particle_DripWater", + L"Particle_DripLavaStart", + L"Particle_DripLavaEnd", + + L"Particle_EnchantmentTable", + L"Particle_DragonBreathMin", + L"Particle_DragonBreathMax", + L"Particle_Suspend", + + L"Particle_CritStart", // arrow in air + L"Particle_CritEnd", // arrow in air + + L"Effect_MovementSpeed", + L"Effect_MovementSlowDown", + L"Effect_DigSpeed", + L"Effect_DigSlowdown", + L"Effect_DamageBoost", + L"Effect_Heal", + L"Effect_Harm", + L"Effect_Jump", + L"Effect_Confusion", + L"Effect_Regeneration", + L"Effect_DamageResistance", + L"Effect_FireResistance", + L"Effect_WaterBreathing", + L"Effect_Invisiblity", + L"Effect_Blindness", + L"Effect_NightVision", + L"Effect_Hunger", + L"Effect_Weakness", + L"Effect_Poison", + L"Effect_Wither", + L"Effect_HealthBoost", + L"Effect_Absorption", + L"Effect_Saturation", + + L"Potion_BaseColour", + + L"Mob_Creeper_Colour1", + L"Mob_Creeper_Colour2", + L"Mob_Skeleton_Colour1", + L"Mob_Skeleton_Colour2", + L"Mob_Spider_Colour1", + L"Mob_Spider_Colour2", + L"Mob_Zombie_Colour1", + L"Mob_Zombie_Colour2", + L"Mob_Slime_Colour1", + L"Mob_Slime_Colour2", + L"Mob_Ghast_Colour1", + L"Mob_Ghast_Colour2", + L"Mob_PigZombie_Colour1", + L"Mob_PigZombie_Colour2", + L"Mob_Enderman_Colour1", + L"Mob_Enderman_Colour2", + L"Mob_CaveSpider_Colour1", + L"Mob_CaveSpider_Colour2", + L"Mob_Silverfish_Colour1", + L"Mob_Silverfish_Colour2", + L"Mob_Blaze_Colour1", + L"Mob_Blaze_Colour2", + L"Mob_LavaSlime_Colour1", + L"Mob_LavaSlime_Colour2", + L"Mob_Pig_Colour1", + L"Mob_Pig_Colour2", + L"Mob_Sheep_Colour1", + L"Mob_Sheep_Colour2", + L"Mob_Cow_Colour1", + L"Mob_Cow_Colour2", + L"Mob_Chicken_Colour1", + L"Mob_Chicken_Colour2", + L"Mob_Squid_Colour1", + L"Mob_Squid_Colour2", + L"Mob_Wolf_Colour1", + L"Mob_Wolf_Colour2", + L"Mob_MushroomCow_Colour1", + L"Mob_MushroomCow_Colour2", + L"Mob_Ocelot_Colour1", + L"Mob_Ocelot_Colour2", + L"Mob_Villager_Colour1", + L"Mob_Villager_Colour2", + L"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", + L"Under_Lava_Clear_Colour", + L"In_Cloud_Base_Colour", + + L"Under_Water_Fog_Colour", + L"Under_Lava_Fog_Colour", + L"In_Cloud_Fog_Colour", + + L"Default_Fog_Colour", + L"Nether_Fog_Colour", + L"End_Fog_Colour", + + L"Sign_Text", + L"Map_Text", + + L"Leash_Light_Colour", + L"Leash_Dark_Colour", + + L"Fire_Overlay", + + L"HTMLColor_0", + L"HTMLColor_1", + L"HTMLColor_2", + L"HTMLColor_3", + L"HTMLColor_4", + L"HTMLColor_5", + L"HTMLColor_6", + L"HTMLColor_7", + L"HTMLColor_8", + L"HTMLColor_9", + L"HTMLColor_a", + L"HTMLColor_b", + L"HTMLColor_c", + L"HTMLColor_d", + L"HTMLColor_e", + L"HTMLColor_f", + L"HTMLColor_dark_0", + L"HTMLColor_dark_1", + L"HTMLColor_dark_2", + L"HTMLColor_dark_3", + L"HTMLColor_dark_4", + L"HTMLColor_dark_5", + L"HTMLColor_dark_6", + L"HTMLColor_dark_7", + L"HTMLColor_dark_8", + L"HTMLColor_dark_9", + L"HTMLColor_dark_a", + L"HTMLColor_dark_b", + L"HTMLColor_dark_c", + L"HTMLColor_dark_d", + L"HTMLColor_dark_e", + L"HTMLColor_dark_f", + L"HTMLColor_T1", + L"HTMLColor_T2", + L"HTMLColor_T3", + L"HTMLColor_Black", + L"HTMLColor_White", + L"Color_EnchantText", + L"Color_EnchantTextFocus", + L"Color_EnchantTextDisabled", + L"Color_RenamedItemTitle", +}; + +void ColourTable::staticCtor() +{ + for(unsigned int i = eMinecraftColour_NOT_SET; i < eMinecraftColour_COUNT; ++i) + { + s_colourNamesMap.insert( unordered_map::value_type( ColourTableElements[i], (eMinecraftColour)i) ); + } +} + +ColourTable::ColourTable(PBYTE pbData, DWORD dwLength) +{ + loadColoursFromData(pbData, dwLength); +} + +ColourTable::ColourTable(ColourTable *defaultColours, PBYTE pbData, DWORD dwLength) +{ + // 4J Stu - Default the colours that of the table passed in + XMemCpy( (void *)m_colourValues, (void *)defaultColours->m_colourValues, sizeof(int) * eMinecraftColour_COUNT); + loadColoursFromData(pbData, dwLength); +} +void ColourTable::loadColoursFromData(PBYTE pbData, DWORD dwLength) +{ + byteArray src(pbData, dwLength); + + ByteArrayInputStream bais(src); + DataInputStream dis(&bais); + + int versionNumber = dis.readInt(); + int coloursCount = dis.readInt(); + + for(int i = 0; i < coloursCount; ++i) + { + wstring colourId = dis.readUTF(); + int colourValue = dis.readInt(); + setColour(colourId, colourValue); + AUTO_VAR(it,s_colourNamesMap.find(colourId)); + } + + bais.reset(); +} + +void ColourTable::setColour(const wstring &colourName, int value) +{ + AUTO_VAR(it,s_colourNamesMap.find(colourName)); + if(it != s_colourNamesMap.end()) + { + m_colourValues[(int)it->second] = value; + } +} + +void ColourTable::setColour(const wstring &colourName, const wstring &value) +{ + setColour(colourName, _fromHEXString(value)); +} + +unsigned int ColourTable::getColour(eMinecraftColour id) +{ + return m_colourValues[(int)id]; +} diff --git a/Minecraft.Client/Common/Colours/ColourTable.h b/Minecraft.Client/Common/Colours/ColourTable.h new file mode 100644 index 00000000..8e0a348c --- /dev/null +++ b/Minecraft.Client/Common/Colours/ColourTable.h @@ -0,0 +1,23 @@ +#pragma once + +class ColourTable +{ +private: + unsigned int m_colourValues[eMinecraftColour_COUNT]; + + static wchar_t *ColourTableElements[eMinecraftColour_COUNT]; + static unordered_map s_colourNamesMap; + +public: + static void staticCtor(); + + ColourTable(PBYTE pbData, DWORD dwLength); + ColourTable(ColourTable *defaultColours, PBYTE pbData, DWORD dwLength); + + unsigned int getColour(eMinecraftColour id); + unsigned int getColor(eMinecraftColour id) { return getColour(id); } + + void loadColoursFromData(PBYTE pbData, DWORD dwLength); + void setColour(const wstring &colourName, int value); + void setColour(const wstring &colourName, const wstring &value); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/CommonMedia.sln b/Minecraft.Client/Common/CommonMedia.sln new file mode 100644 index 00000000..9f83988e --- /dev/null +++ b/Minecraft.Client/Common/CommonMedia.sln @@ -0,0 +1,28 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2012 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CommonMedia", "CommonMedia.vcxproj", "{21BBD32C-AF5E-4741-8B80-3B73FC0D0F27}" +EndProject +Global + GlobalSection(TeamFoundationVersionControl) = preSolution + SccNumberOfProjects = 2 + SccEnterpriseProvider = {4CA58AB2-18FA-4F8D-95D4-32DDF27D184C} + SccTeamFoundationServer = http://tfs_server:8080/tfs/storiespark + SccProjectUniqueName0 = CommonMedia.vcxproj + SccLocalPath0 = . + SccLocalPath1 = . + EndGlobalSection + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {21BBD32C-AF5E-4741-8B80-3B73FC0D0F27}.Debug|Win32.ActiveCfg = Debug|Win32 + {21BBD32C-AF5E-4741-8B80-3B73FC0D0F27}.Debug|Win32.Build.0 = Debug|Win32 + {21BBD32C-AF5E-4741-8B80-3B73FC0D0F27}.Release|Win32.ActiveCfg = Release|Win32 + {21BBD32C-AF5E-4741-8B80-3B73FC0D0F27}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Minecraft.Client/Common/CommonMedia.vcxproj b/Minecraft.Client/Common/CommonMedia.vcxproj new file mode 100644 index 00000000..5a472e0b --- /dev/null +++ b/Minecraft.Client/Common/CommonMedia.vcxproj @@ -0,0 +1,115 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {21BBD32C-AF5E-4741-8B80-3B73FC0D0F27} + MakeFileProj + SAK + SAK + SAK + SAK + + + + Makefile + true + v110 + + + Makefile + false + v110 + + + + + + + + + + + + + WIN32;_DEBUG;$(NMakePreprocessorDefinitions) + echo Creating languages.loc +copy .\Media\strings.resx .\Media\en-EN.lang +copy .\Media\fr-FR\strings.resx .\Media\fr-FR\fr-FR.lang +copy .\Media\ja-JP\strings.resx .\Media\ja-JP\ja-JP.lang +..\..\..\Tools\NewLocalisationPacker.exe --static .\Media .\Media\languages.loc + +echo Making archive +..\..\..\Tools\ArchiveFilePacker.exe -cd $(ProjectDir)\Media media.arc media.txt + +echo Copying Durango strings.h +copy .\Media\strings.h ..\Durango\strings.h + +echo Copying PS3 strings.h +copy .\Media\strings.h ..\PS3\strings.h + +echo Copying PS4 strings.h +copy .\Media\strings.h ..\Orbis\strings.h + +echo Copying Win strings.h +copy .\Media\strings.h ..\Windows64\strings.h + + + WIN32;NDEBUG;$(NMakePreprocessorDefinitions) + + + + + + + \ No newline at end of file diff --git a/Minecraft.Client/Common/CommonMedia.vcxproj.filters b/Minecraft.Client/Common/CommonMedia.vcxproj.filters new file mode 100644 index 00000000..9fb0927d --- /dev/null +++ b/Minecraft.Client/Common/CommonMedia.vcxproj.filters @@ -0,0 +1,136 @@ + + + + + {55c7ab2e-b3e5-4aed-9ffe-3308591d9c34} + + + {eaa0eb72-0b27-4080-ad53-f68e42f37ba8} + + + {711ad95b-eb56-4e18-b001-34ad7b8075a3} + + + {1432ec3d-c5d0-46da-91b6-e7737095a97e} + + + {4b2aeaf1-04d7-454d-b2d9-08364799831c} + + + {4b0eaef6-fa2f-4605-b0da-a81ffb5659bc} + + + {bf1c74da-21f1-4bdd-98ed-83457946e4cc} + + + + + IggyMedia + + + IggyMedia + + + IggyMedia + + + IggyMedia + + + IggyMedia + + + IggyMedia + + + IggyMedia + + + Archive + + + Archive + + + IggyMedia + + + IggyMedia + + + IggyMedia + + + IggyMedia + + + IggyMedia + + + IggyMedia + + + IggyMedia + + + + + Strings + + + + + Strings + + + Strings + + + Strings + + + Strings + + + Strings + + + Strings + + + Strings + + + Strings + + + Strings + + + Strings + + + Strings + + + Strings + + + Archive + + + + + Archive\Durango + + + Archive\PS3 + + + Archive\PS4 + + + Archive\Win64 + + + \ No newline at end of file diff --git a/Minecraft.Client/Common/ConsoleGameMode.cpp b/Minecraft.Client/Common/ConsoleGameMode.cpp new file mode 100644 index 00000000..b080e628 --- /dev/null +++ b/Minecraft.Client/Common/ConsoleGameMode.cpp @@ -0,0 +1,9 @@ +#include "stdafx.h" +#include "ConsoleGameMode.h" +#include "..\Common\Tutorial\Tutorial.h" + +ConsoleGameMode::ConsoleGameMode(int iPad, Minecraft *minecraft, ClientConnection *connection) + : TutorialMode(iPad, minecraft, connection) +{ + tutorial = new Tutorial(iPad); +} \ No newline at end of file diff --git a/Minecraft.Client/Common/ConsoleGameMode.h b/Minecraft.Client/Common/ConsoleGameMode.h new file mode 100644 index 00000000..3e486cbf --- /dev/null +++ b/Minecraft.Client/Common/ConsoleGameMode.h @@ -0,0 +1,10 @@ +#pragma once +#include "..\Common\Tutorial\TutorialMode.h" + +class ConsoleGameMode : public TutorialMode +{ +public: + ConsoleGameMode(int iPad, Minecraft *minecraft, ClientConnection *connection); + + virtual bool isImplemented() { return true; } +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Console_Awards_enum.h b/Minecraft.Client/Common/Console_Awards_enum.h new file mode 100644 index 00000000..9597c717 --- /dev/null +++ b/Minecraft.Client/Common/Console_Awards_enum.h @@ -0,0 +1,72 @@ +#pragma once + +enum eAward +{ + eAward_TakingInventory=0, + eAward_GettingWood, + eAward_Benchmarking, + eAward_TimeToMine, + eAward_HotTopic, + eAward_AquireHardware, + eAward_TimeToFarm, + eAward_BakeBread, + eAward_TheLie, + eAward_GettingAnUpgrade, + eAward_DeliciousFish, + eAward_OnARail, + eAward_TimeToStrike, + eAward_MonsterHunter, + eAward_CowTipper, + eAward_WhenPigsFly, + eAward_LeaderOfThePack, + eAward_MOARTools, + eAward_DispenseWithThis, + eAward_InToTheNether, + + eAward_mine100Blocks, + eAward_kill10Creepers, + eAward_eatPorkChop, + eAward_play100Days, + eAward_arrowKillCreeper, + eAward_socialPost, + +#ifndef _XBOX + // 4J Stu - Does not map to any Xbox achievements + eAward_snipeSkeleton, + eAward_diamonds, + eAward_portal, + eAward_ghast, + eAward_blazeRod, + eAward_potion, + eAward_theEnd, + eAward_winGame, + eAward_enchantments, + eAward_overkill, + eAward_bookcase, +#endif + +#ifdef _EXTENDED_ACHIEVEMENTS + eAward_adventuringTime, + eAward_repopulation, + //eAward_porkChop, + eAward_diamondsToYou, + //eAward_passingTheTime, + //eAward_archer, + eAward_theHaggler, + eAward_potPlanter, + eAward_itsASign, + eAward_ironBelly, + eAward_haveAShearfulDay, + eAward_rainbowCollection, + eAward_stayinFrosty, + eAward_chestfulOfCobblestone, + eAward_renewableEnergy, + eAward_musicToMyEars, + eAward_bodyGuard, + eAward_ironMan, + eAward_zombieDoctor, + eAward_lionTamer, +#endif + + eAward_Max, +}; diff --git a/Minecraft.Client/Common/Console_Debug_enum.h b/Minecraft.Client/Common/Console_Debug_enum.h new file mode 100644 index 00000000..3d2b97af --- /dev/null +++ b/Minecraft.Client/Common/Console_Debug_enum.h @@ -0,0 +1,42 @@ +#pragma once + +enum eDebugSetting +{ + eDebugSetting_LoadSavesFromDisk, + eDebugSetting_WriteSavesToDisk, + eDebugSetting_FreezePlayers, //eDebugSetting_InterfaceOff, + eDebugSetting_Safearea, + eDebugSetting_MobsDontAttack, + eDebugSetting_FreezeTime, + eDebugSetting_DisableWeather, + eDebugSetting_CraftAnything, + eDebugSetting_UseDpadForDebug, + eDebugSetting_MobsDontTick, + eDebugSetting_ArtTools, //eDebugSetting_InstantDestroy, + eDebugSetting_ShowUIConsole, + eDebugSetting_DistributableSave, + eDebugSetting_DebugLeaderboards, + eDebugSetting_EnableHeightWaterOverride, //eDebugSetting_TipsAlwaysOn, + eDebugSetting_SuperflatNether, + //eDebugSetting_LightDarkBackground, + eDebugSetting_RegularLightning, + eDebugSetting_EnableBiomeOverride, //eDebugSetting_GoToNether, + //eDebugSetting_GoToEnd, + eDebugSetting_GoToOverworld, + eDebugSetting_UnlockAllDLC, // eDebugSetting_ToggleFont, + eDebugSetting_ShowUIMarketingGuide, + eDebugSetting_Max, +}; + +enum eDebugButton +{ + eDebugButton_Theme=0, + eDebugButton_Avatar_Item_1, + eDebugButton_Avatar_Item_2, + eDebugButton_Avatar_Item_3, + eDebugButton_Gamerpic_1, + eDebugButton_Gamerpic_2, + eDebugButton_CheckTips, + eDebugButton_WipeLeaderboards, + eDebugButton_Max, +}; diff --git a/Minecraft.Client/Common/Console_Utils.cpp b/Minecraft.Client/Common/Console_Utils.cpp new file mode 100644 index 00000000..cb0f1b58 --- /dev/null +++ b/Minecraft.Client/Common/Console_Utils.cpp @@ -0,0 +1,40 @@ +#include "stdafx.h" + +//-------------------------------------------------------------------------------------- +// Name: DebugSpewV() +// Desc: Internal helper function +//-------------------------------------------------------------------------------------- +#ifndef _CONTENT_PACKAGE +static VOID DebugSpewV( const CHAR* strFormat, const va_list pArgList ) +{ +#if defined __PS3__ || defined __ORBIS__ || defined __PSVITA__ + assert(0); +#else + CHAR str[2048]; + // Use the secure CRT to avoid buffer overruns. Specify a count of + // _TRUNCATE so that too long strings will be silently truncated + // rather than triggering an error. + _vsnprintf_s( str, _TRUNCATE, strFormat, pArgList ); + OutputDebugStringA( str ); +#endif +} +#endif + +//-------------------------------------------------------------------------------------- +// Name: DebugSpew() +// Desc: Prints formatted debug spew +//-------------------------------------------------------------------------------------- +#ifdef _Printf_format_string_ // VC++ 2008 and later support this annotation +VOID CDECL DebugSpew( _In_z_ _Printf_format_string_ const CHAR* strFormat, ... ) +#else +VOID CDECL DebugPrintf( const CHAR* strFormat, ... ) +#endif +{ +#ifndef _CONTENT_PACKAGE + va_list pArgList; + va_start( pArgList, strFormat ); + DebugSpewV( strFormat, pArgList ); + va_end( pArgList ); +#endif +} + diff --git a/Minecraft.Client/Common/Consoles_App.cpp b/Minecraft.Client/Common/Consoles_App.cpp new file mode 100644 index 00000000..06463a69 --- /dev/null +++ b/Minecraft.Client/Common/Consoles_App.cpp @@ -0,0 +1,10123 @@ + +#include "stdafx.h" +#include "..\..\Minecraft.World\net.minecraft.world.entity.item.h" +#include "..\..\Minecraft.World\net.minecraft.world.entity.player.h" +#include "..\..\Minecraft.World\net.minecraft.world.level.tile.entity.h" +#include "..\..\Minecraft.World\net.minecraft.world.phys.h" +#include "..\..\Minecraft.World\InputOutputStream.h" +#include "..\..\Minecraft.World\compression.h" +#include "..\Options.h" +#include "..\MinecraftServer.h" +#include "..\MultiPlayerLevel.h" +#include "..\GameRenderer.h" +#include "..\ProgressRenderer.h" +#include "..\LevelRenderer.h" +#include "..\MobSkinMemTextureProcessor.h" +#include "..\Minecraft.h" +#include "..\ClientConnection.h" +#include "..\MultiPlayerLocalPlayer.h" +#include "..\StatsCounter.h" +#include "..\GameMode.h" +#include "..\Xbox\Social\SocialManager.h" +#include "Tutorial\TutorialMode.h" +#if defined _XBOX || defined _WINDOWS64 +#include "..\Xbox\XML\ATGXmlParser.h" +#include "..\Xbox\XML\xmlFilesCallback.h" +#endif +#include "Minecraft_Macros.h" +#include "..\PlayerList.h" +#include "..\ServerPlayer.h" +#include "GameRules\ConsoleGameRules.h" +#include "GameRules\ConsoleSchematicFile.h" +#include "..\User.h" +#include "..\\EntityRenderDispatcher.h" +#include "..\TexturePackRepository.h" +#include "..\DLCTexturePack.h" +#include "DLC\DLCPack.h" +#include "..\StringTable.h" +#ifndef _XBOX +#include "..\ArchiveFile.h" +#endif +#include "..\Minecraft.h" +#ifdef _XBOX +#include "..\Xbox\GameConfig\Minecraft.spa.h" +#include "..\Xbox\Network\NetworkPlayerXbox.h" +#include "XUI\XUI_TextEntry.h" +#include "XUI\XUI_XZP_Icons.h" +#include "XUI\XUI_PauseMenu.h" +#else +#include "UI\UI.h" +#include "UI\UIScene_PauseMenu.h" +#endif +#ifdef __PS3__ +#include +#endif +#ifdef __ORBIS__ +#include +#endif + +#include "..\Common\Leaderboards\LeaderboardManager.h" + +//CMinecraftApp app; +unsigned int CMinecraftApp::m_uiLastSignInData = 0; + +const float CMinecraftApp::fSafeZoneX = 64.0f; // 5% of 1280 +const float CMinecraftApp::fSafeZoneY = 36.0f; // 5% of 720 + +int CMinecraftApp::s_iHTMLFontSizesA[eHTMLSize_COUNT] = +{ +#ifdef _XBOX + 14,12,14,24 +#else + //20,15,20,24 + 20,13,20,26 +#endif +}; + + +CMinecraftApp::CMinecraftApp() +{ + if(GAME_SETTINGS_PROFILE_DATA_BYTES != sizeof(GAME_SETTINGS)) + { + // 4J Stu - See comment for GAME_SETTINGS_PROFILE_DATA_BYTES in Xbox_App.h + DebugPrintf("WARNING: The size of the profile GAME_SETTINGS struct has changed, so all stat data is likely incorrect. Is: %d, Should be: %d\n",sizeof(GAME_SETTINGS),GAME_SETTINGS_PROFILE_DATA_BYTES); +#ifndef _CONTENT_PACKAGE + __debugbreak(); +#endif + } + + for(int i=0;i; + } + + LocaleAndLanguageInit(); + +#ifdef _XBOX_ONE + m_hasReachedMainMenu = false; +#endif +} + + + +void CMinecraftApp::DebugPrintf(const char *szFormat, ...) +{ + +#ifndef _FINAL_BUILD + char buf[1024]; + va_list ap; + va_start(ap, szFormat); + vsnprintf(buf, sizeof(buf), szFormat, ap); + va_end(ap); + OutputDebugStringA(buf); +#endif + +} + +void CMinecraftApp::DebugPrintf(int user, const char *szFormat, ...) +{ +#ifndef _FINAL_BUILD + if(user == USER_NONE) + return; + char buf[1024]; + va_list ap; + va_start(ap, szFormat); + vsnprintf(buf, sizeof(buf), szFormat, ap); + va_end(ap); +#ifdef __PS3__ + unsigned int writelen; + sys_tty_write(SYS_TTYP_USER1 + ( user - 1 ), buf, strlen(buf), &writelen ); +#elif defined __PSVITA__ + switch(user) + { + case 0: + { + SceUID tty2 = sceIoOpen("tty2:", SCE_O_WRONLY, 0); + if(tty2>=0) + { + std::string string1(buf); + sceIoWrite(tty2, string1.c_str(), string1.length()); + sceIoClose(tty2); + } + } + break; + case 1: + { + SceUID tty3 = sceIoOpen("tty3:", SCE_O_WRONLY, 0); + if(tty3>=0) + { + std::string string1(buf); + sceIoWrite(tty3, string1.c_str(), string1.length()); + sceIoClose(tty3); + } + } + break; + default: + OutputDebugStringA(buf); + break; + } +#else + OutputDebugStringA(buf); +#endif +#ifndef _XBOX + if(user == USER_UI) + { + ui.logDebugString(buf); + } +#endif +#endif +} + +LPCWSTR CMinecraftApp::GetString(int iID) +{ + //return L"Değişiklikler ve Yenilikler"; + //return L"ÕÕÕÕÖÖÖÖ"; + return app.m_stringTable->getString(iID); +} + +void CMinecraftApp::SetAction(int iPad, eXuiAction action, LPVOID param) +{ + if( ( m_eXuiAction[iPad] == eAppAction_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); + } + else + { + app.DebugPrintf("Changing App action for pad %d from %d to %d\n", iPad, m_eXuiAction[iPad], action); + m_eXuiAction[iPad]=action; + m_eXuiActionParam[iPad] = param; + } +} + +bool CMinecraftApp::IsAppPaused() +{ +#if defined(_XBOX_ONE) || defined(__ORBIS__) + bool paused = m_bIsAppPaused; + EnterCriticalSection(&m_saveNotificationCriticalSection); + if( g_NetworkManager.IsLocalGame() && g_NetworkManager.GetPlayerCount() == 1 ) + { + paused |= m_saveNotificationDepth > 0; + } + LeaveCriticalSection(&m_saveNotificationCriticalSection); + return paused; +#else + return m_bIsAppPaused; +#endif +} + +void CMinecraftApp::SetAppPaused(bool val) +{ + m_bIsAppPaused = val; +} + +void CMinecraftApp::HandleButtonPresses() +{ + for(int i=0;i<4;i++) + { + HandleButtonPresses(i); + } +} + +void CMinecraftApp::HandleButtonPresses(int iPad) +{ + + // // test an update of the profile data + // void *pData=ProfileManager.GetGameDefinedProfileData(iPad); + // + // unsigned char *pchData= (unsigned char *)pData; + // int iCount=0; + // for(int i=0;i player,bool bNavigateBack) +{ + bool success = true; + + InventoryScreenInput* initData = new InventoryScreenInput(); + initData->player = player; + initData->bNavigateBack=bNavigateBack; + initData->iPad = iPad; + + if(app.GetLocalPlayerCount()>1) + { + initData->bSplitscreen=true; + success = ui.NavigateToScene(iPad,eUIScene_InventoryMenu,initData); + } + else + { + initData->bSplitscreen=false; + success = ui.NavigateToScene(iPad,eUIScene_InventoryMenu,initData); + } + + return success; +} + +bool CMinecraftApp::LoadCreativeMenu(int iPad,shared_ptr player,bool bNavigateBack) +{ + bool success = true; + + InventoryScreenInput* initData = new InventoryScreenInput(); + initData->player = player; + initData->bNavigateBack=bNavigateBack; + initData->iPad = iPad; + + if(app.GetLocalPlayerCount()>1) + { + initData->bSplitscreen=true; + success = ui.NavigateToScene(iPad,eUIScene_CreativeMenu,initData); + } + else + { + initData->bSplitscreen=false; + success = ui.NavigateToScene(iPad,eUIScene_CreativeMenu,initData); + } + + return success; +} + +bool CMinecraftApp::LoadCrafting2x2Menu(int iPad,shared_ptr player) +{ + bool success = true; + + CraftingPanelScreenInput* initData = new CraftingPanelScreenInput(); + initData->player = player; + initData->iContainerType=RECIPE_TYPE_2x2; + initData->iPad = iPad; + initData->x = 0; + initData->y = 0; + initData->z = 0; + + if(app.GetLocalPlayerCount()>1) + { + initData->bSplitscreen=true; + success = ui.NavigateToScene(iPad,eUIScene_Crafting2x2Menu, initData); + } + else + { + initData->bSplitscreen=false; + success = ui.NavigateToScene(iPad,eUIScene_Crafting2x2Menu, initData); + } + + return success; +} + +bool CMinecraftApp::LoadCrafting3x3Menu(int iPad,shared_ptr player, int x, int y, int z) +{ + bool success = true; + + CraftingPanelScreenInput* initData = new CraftingPanelScreenInput(); + initData->player = player; + initData->iContainerType=RECIPE_TYPE_3x3; + initData->iPad = iPad; + initData->x = x; + initData->y = y; + initData->z = z; + + if(app.GetLocalPlayerCount()>1) + { + initData->bSplitscreen=true; + success = ui.NavigateToScene(iPad,eUIScene_Crafting3x3Menu, initData); + } + else + { + initData->bSplitscreen=false; + success = ui.NavigateToScene(iPad,eUIScene_Crafting3x3Menu, initData); + } + + return success; +} + +bool CMinecraftApp::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; + + EnchantingScreenInput* initData = new EnchantingScreenInput(); + initData->inventory = inventory; + initData->level = level; + initData->x = x; + initData->y = y; + initData->z = z; + initData->iPad = iPad; + initData->name = name; + + if(app.GetLocalPlayerCount()>1) + { + initData->bSplitscreen=true; + success = ui.NavigateToScene(iPad,eUIScene_EnchantingMenu, initData); + } + else + { + initData->bSplitscreen=false; + success = ui.NavigateToScene(iPad,eUIScene_EnchantingMenu, initData); + } + + return success; +} + +bool CMinecraftApp::LoadFurnaceMenu(int iPad,shared_ptr inventory, shared_ptr furnace) +{ + bool success = true; + + FurnaceScreenInput* initData = new FurnaceScreenInput(); + + initData->furnace = furnace; + initData->inventory = inventory; + initData->iPad = iPad; + + // Load the scene. + if(app.GetLocalPlayerCount()>1) + { + initData->bSplitscreen=true; + success = ui.NavigateToScene(iPad,eUIScene_FurnaceMenu, initData); + } + else + { + initData->bSplitscreen=false; + success = ui.NavigateToScene(iPad,eUIScene_FurnaceMenu, initData); + } + + return success; +} + +bool CMinecraftApp::LoadBrewingStandMenu(int iPad,shared_ptr inventory, shared_ptr brewingStand) +{ + bool success = true; + + BrewingScreenInput* initData = new BrewingScreenInput(); + + initData->brewingStand = brewingStand; + initData->inventory = inventory; + initData->iPad = iPad; + + // Load the scene. + if(app.GetLocalPlayerCount()>1) + { + initData->bSplitscreen=true; + success = ui.NavigateToScene(iPad,eUIScene_BrewingStandMenu, initData); + } + else + { + initData->bSplitscreen=false; + success = ui.NavigateToScene(iPad,eUIScene_BrewingStandMenu, initData); + } + + return success; +} + + +bool CMinecraftApp::LoadContainerMenu(int iPad,shared_ptr inventory, shared_ptr container) +{ + bool success = true; + + ContainerScreenInput* initData = new ContainerScreenInput(); + + initData->inventory = inventory; + initData->container = container; + initData->iPad = iPad; + + // Load the scene. + if(app.GetLocalPlayerCount()>1) + { + initData->bSplitscreen=true; + + bool bLargeChest = (initData->container->getContainerSize() > 3*9)?true:false; + if(bLargeChest) + { + success = ui.NavigateToScene(iPad,eUIScene_LargeContainerMenu,initData); + } + else + { + success = ui.NavigateToScene(iPad,eUIScene_ContainerMenu,initData); + } + } + else + { + initData->bSplitscreen=false; + success = ui.NavigateToScene(iPad,eUIScene_ContainerMenu,initData); + } + + return success; +} + +bool CMinecraftApp::LoadTrapMenu(int iPad,shared_ptr inventory, shared_ptr trap) +{ + bool success = true; + + TrapScreenInput* initData = new TrapScreenInput(); + + initData->inventory = inventory; + initData->trap = trap; + initData->iPad = iPad; + + // Load the scene. + if(app.GetLocalPlayerCount()>1) + { + initData->bSplitscreen=true; + success = ui.NavigateToScene(iPad,eUIScene_DispenserMenu, initData); + } + else + { + initData->bSplitscreen=false; + success = ui.NavigateToScene(iPad,eUIScene_DispenserMenu, initData); + } + + return success; +} + +bool CMinecraftApp::LoadSignEntryMenu(int iPad,shared_ptr sign) +{ + bool success = true; + + SignEntryScreenInput* initData = new SignEntryScreenInput(); + + initData->sign = sign; + initData->iPad = iPad; + + success = ui.NavigateToScene(iPad,eUIScene_SignEntryMenu, initData); + + delete initData; + + return success; +} + +bool CMinecraftApp::LoadRepairingMenu(int iPad,shared_ptr inventory, Level *level, int x, int y, int z) +{ + bool success = true; + + AnvilScreenInput *initData = new AnvilScreenInput(); + initData->inventory = inventory; + initData->level = level; + initData->x = x; + initData->y = y; + initData->z = z; + initData->iPad = iPad; + if(app.GetLocalPlayerCount()>1) initData->bSplitscreen=true; + else initData->bSplitscreen=false; + + success = ui.NavigateToScene(iPad,eUIScene_AnvilMenu, initData); + + return success; +} + +bool CMinecraftApp::LoadTradingMenu(int iPad, shared_ptr inventory, shared_ptr trader, Level *level, const wstring &name) +{ + bool success = true; + + TradingScreenInput *initData = new TradingScreenInput(); + initData->inventory = inventory; + initData->trader = trader; + initData->level = level; + initData->iPad = iPad; + if(app.GetLocalPlayerCount()>1) initData->bSplitscreen=true; + else initData->bSplitscreen=false; + + success = ui.NavigateToScene(iPad,eUIScene_TradingMenu, initData); + + return success; +} + +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 +////////////////////////////////////////////// +void CMinecraftApp::InitGameSettings() +{ + for(int i=0;ibSettingsChanged=false; + + //SetDefaultGameSettings(i); - done on a callback from the profile manager + + // 4J-PB - adding in for Windows & PS3 to set the defaults for the joypad +#if defined _WINDOWS64// || defined __PSVITA__ + C_4JProfile::PROFILESETTINGS *pProfileSettings=ProfileManager.GetDashboardProfileSettings(i); + // clear this for now - it will come from reading the system values + memset(pProfileSettings,0,sizeof(C_4JProfile::PROFILESETTINGS)); + SetDefaultOptions(pProfileSettings,i); +#elif defined __PS3__ || defined __ORBIS__ || defined _DURANGO || defined __PSVITA__ + C4JStorage::PROFILESETTINGS *pProfileSettings=StorageManager.GetDashboardProfileSettings(i); + // 4J-PB - don't cause an options write to happen here + SetDefaultOptions(pProfileSettings,i,false); + +#endif + } +} + +#if (defined __PS3__ || defined __ORBIS__ || defined _DURANGO || defined __PSVITA__) +int CMinecraftApp::SetDefaultOptions(C4JStorage::PROFILESETTINGS *pSettings,const int iPad,bool bWriteProfile) +#else +int CMinecraftApp::SetDefaultOptions(C_4JProfile::PROFILESETTINGS *pSettings,const int iPad) +#endif +{ + SetGameSettings(iPad,eGameSetting_MusicVolume,DEFAULT_VOLUME_LEVEL); + SetGameSettings(iPad,eGameSetting_SoundFXVolume,DEFAULT_VOLUME_LEVEL); + SetGameSettings(iPad,eGameSetting_Gamma,50); + + // 4J-PB - Don't reset the difficult level if we're in-game + if(Minecraft::GetInstance()->level==NULL) + { + app.DebugPrintf("SetDefaultOptions - Difficulty = 1\n"); + SetGameSettings(iPad,eGameSetting_Difficulty,1); + } + SetGameSettings(iPad,eGameSetting_Sensitivity_InGame,100); + SetGameSettings(iPad,eGameSetting_ViewBob,1); + SetGameSettings(iPad,eGameSetting_ControlScheme,0); + SetGameSettings(iPad,eGameSetting_ControlInvertLook,(pSettings->iYAxisInversion!=0)?1:0); + SetGameSettings(iPad,eGameSetting_ControlSouthPaw,pSettings->bSwapSticks?1:0); + SetGameSettings(iPad,eGameSetting_SplitScreenVertical,0); + SetGameSettings(iPad,eGameSetting_GamertagsVisible,1); + + // Interim TU 1.6.6 + SetGameSettings(iPad,eGameSetting_Sensitivity_InMenu,100); + SetGameSettings(iPad,eGameSetting_DisplaySplitscreenGamertags,1); + SetGameSettings(iPad,eGameSetting_Hints,1); + SetGameSettings(iPad,eGameSetting_Autosave,2); + SetGameSettings(iPad,eGameSetting_Tooltips,1); + SetGameSettings(iPad,eGameSetting_InterfaceOpacity,80); + + // TU 5 + SetGameSettings(iPad,eGameSetting_Clouds,1); + SetGameSettings(iPad,eGameSetting_Online,1); + SetGameSettings(iPad,eGameSetting_InviteOnly,0); + SetGameSettings(iPad,eGameSetting_FriendsOfFriends,1); + + // default the update changes message to zero + // 4J-PB - We'll only display the message if the profile is pre-TU5 + //SetGameSettings(iPad,eGameSetting_DisplayUpdateMessage,0); + + // TU 6 + SetGameSettings(iPad,eGameSetting_BedrockFog,0); + SetGameSettings(iPad,eGameSetting_DisplayHUD,1); + SetGameSettings(iPad,eGameSetting_DisplayHand,1); + + // TU 7 + SetGameSettings(iPad,eGameSetting_CustomSkinAnim,1); + + // TU 9 + SetGameSettings(iPad,eGameSetting_DeathMessages,1); + SetGameSettings(iPad,eGameSetting_UISize,1); + SetGameSettings(iPad,eGameSetting_UISizeSplitscreen,2); + SetGameSettings(iPad,eGameSetting_AnimatedCharacter,1); + + // TU 12 + GameSettingsA[iPad]->ucCurrentFavoriteSkinPos=0; + for(int i=0;iuiFavoriteSkinA[i]=0xFFFFFFFF; + } + + // TU 13 + GameSettingsA[iPad]->uiMashUpPackWorldsDisplay=0xFFFFFFFF; + + // 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__ + // PS3DEC13 + SetGameSettings(iPad,eGameSetting_PS3_EULA_Read,0); // EULA not read + + // PS3 1.05 - added Greek + + // 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; +#endif + + return 0; +} + +#if ( defined __PS3__ || defined __ORBIS__ || defined _DURANGO || defined __PSVITA__) +int CMinecraftApp::DefaultOptionsCallback(LPVOID pParam,C4JStorage::PROFILESETTINGS *pSettings, const int iPad) +#else +int CMinecraftApp::DefaultOptionsCallback(LPVOID pParam,C_4JProfile::PROFILESETTINGS *pSettings, const int iPad) +#endif +{ + CMinecraftApp *pApp=(CMinecraftApp *)pParam; + + // flag the default options to be set + + pApp->DebugPrintf("Setting default options for player %d", iPad); + pApp->SetAction(iPad,eAppAction_SetDefaultOptions, (LPVOID)pSettings); + //pApp->SetDefaultOptions(pSettings,iPad); + + // if the profile data has been changed, then force a profile write + // It seems we're allowed to break the 5 minute rule if it's the result of a user action + //pApp->CheckGameSettingsChanged(); + + return 0; +} + +#if ( defined __PS3__ || defined __ORBIS__ || defined _DURANGO || defined __PSVITA__) + +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) +{ + CMinecraftApp *pApp=(CMinecraftApp *)pParam; + pApp->m_eOptionsStatusA[iPad]=eStatus; + pApp->m_eOptionsBlocksRequiredA[iPad]=iBlocksRequired; + return 0; +} + +int CMinecraftApp::GetOptionsBlocksRequired(int iPad) +{ + return m_eOptionsBlocksRequiredA[iPad]; +} + +#else +int CMinecraftApp::OptionsDataCallback(LPVOID pParam,int iPad,unsigned short usVersion,C4JStorage::eOptionsCallback eStatus) +{ + CMinecraftApp *pApp=(CMinecraftApp *)pParam; + +#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 + +C4JStorage::eOptionsCallback CMinecraftApp::GetOptionsCallbackStatus(int iPad) +{ + return m_eOptionsStatusA[iPad]; +} + +void CMinecraftApp::SetOptionsCallbackStatus(int iPad, C4JStorage::eOptionsCallback eStatus) +{ + m_eOptionsStatusA[iPad]=eStatus; +} +#endif + +int CMinecraftApp::OldProfileVersionCallback(LPVOID pParam,unsigned char *pucData, const unsigned short usVersion, const int iPad) +{ + // check what needs to be done with this version to update to the current one + + switch(usVersion) + { +#ifdef _XBOX + case PROFILE_VERSION_1: + case PROFILE_VERSION_2: + // need to fill in values for the new profile data. No need to save the profile - that'll happen if they get changed, or if the auto save for the profile kicks in + { + GAME_SETTINGS *pGameSettings=(GAME_SETTINGS *)pucData; + pGameSettings->ucMenuSensitivity=100; //eGameSetting_Sensitivity_InMenu + pGameSettings->ucInterfaceOpacity=80; //eGameSetting_Sensitivity_InMenu + pGameSettings->usBitmaskValues|=0x0200; //eGameSetting_DisplaySplitscreenGamertags - on + pGameSettings->usBitmaskValues|=0x0400; //eGameSetting_Hints - on + pGameSettings->usBitmaskValues|=0x1000; //eGameSetting_Autosave - 2 + pGameSettings->usBitmaskValues|=0x8000; //eGameSetting_Tooltips - on + + // 4J-PB - Let's also award all the achievements they have again because of the profile bug that seemed to stop the awards of some + // Changing this to check the system achievements at sign-in and award any that the game says we have and the system says we haven't + //ProfileManager.ReAwardAchievements(iPad); + + pGameSettings->uiBitmaskValues=0L; // reset + pGameSettings->uiBitmaskValues|=GAMESETTING_CLOUDS; //eGameSetting_Clouds - on + pGameSettings->uiBitmaskValues|=GAMESETTING_ONLINE; //eGameSetting_GameSetting_Online - on + //eGameSetting_GameSetting_Invite - off + pGameSettings->uiBitmaskValues|=GAMESETTING_FRIENDSOFFRIENDS; //eGameSetting_GameSetting_FriendsOfFriends - on + pGameSettings->uiBitmaskValues|=GAMESETTING_DISPLAYUPDATEMSG; //eGameSetting_DisplayUpdateMessage (counter) + // TU6 + pGameSettings->uiBitmaskValues&=~GAMESETTING_BEDROCKFOG; //eGameSetting_BedrockFog - off + pGameSettings->uiBitmaskValues|=GAMESETTING_DISPLAYHUD; //eGameSetting_DisplayHUD - on + pGameSettings->uiBitmaskValues|=GAMESETTING_DISPLAYHAND; //eGameSetting_DisplayHand - on + // TU7 + pGameSettings->uiBitmaskValues|=GAMESETTING_CUSTOMSKINANIM; //eGameSetting_CustomSkinAnim - on + // TU9 + pGameSettings->uiBitmaskValues|=GAMESETTING_DEATHMESSAGES; //eGameSetting_DeathMessages - on + pGameSettings->uiBitmaskValues|=(GAMESETTING_UISIZE&0x00000800); // uisize 2 + pGameSettings->uiBitmaskValues|=(GAMESETTING_UISIZE_SPLITSCREEN&0x00004000); // splitscreen ui size 3 + pGameSettings->uiBitmaskValues|=GAMESETTING_ANIMATEDCHARACTER; //eGameSetting_AnimatedCharacter - on + // TU12 + // favorite skins added, but only set in TU12 - set to FFs + for(int i=0;iuiFavoriteSkinA[i]=0xFFFFFFFF; + } + pGameSettings->ucCurrentFavoriteSkinPos=0; + // Added a bitmask in TU13 to enable/disable display of the Mash-up pack worlds in the saves list + pGameSettings->uiMashUpPackWorldsDisplay = 0xFFFFFFFF; + + // PS3 1.05 - added Greek + pGameSettings->ucLanguage = MINECRAFT_LANGUAGE_DEFAULT; // use the system language + } + break; + case PROFILE_VERSION_3: + + { + GAME_SETTINGS *pGameSettings=(GAME_SETTINGS *)pucData; + pGameSettings->uiBitmaskValues=0L; // reset + pGameSettings->uiBitmaskValues|=GAMESETTING_CLOUDS; //eGameSetting_Clouds - on + pGameSettings->uiBitmaskValues|=GAMESETTING_ONLINE; //eGameSetting_GameSetting_Online - on + //eGameSetting_GameSetting_Invite - off + pGameSettings->uiBitmaskValues|=GAMESETTING_FRIENDSOFFRIENDS; //eGameSetting_GameSetting_FriendsOfFriends - on + pGameSettings->uiBitmaskValues|=GAMESETTING_DISPLAYUPDATEMSG; //eGameSetting_DisplayUpdateMessage (counter) + // TU6 + pGameSettings->uiBitmaskValues&=~GAMESETTING_BEDROCKFOG; //eGameSetting_BedrockFog - off + pGameSettings->uiBitmaskValues|=GAMESETTING_DISPLAYHUD; //eGameSetting_DisplayHUD - on + pGameSettings->uiBitmaskValues|=GAMESETTING_DISPLAYHAND; //eGameSetting_DisplayHand - on + // TU7 + pGameSettings->uiBitmaskValues|=GAMESETTING_CUSTOMSKINANIM; //eGameSetting_CustomSkinAnim - on + // TU9 + pGameSettings->uiBitmaskValues|=GAMESETTING_DEATHMESSAGES; //eGameSetting_DeathMessages - on + pGameSettings->uiBitmaskValues|=(GAMESETTING_UISIZE&0x00000800); // uisize 2 + pGameSettings->uiBitmaskValues|=(GAMESETTING_UISIZE_SPLITSCREEN&0x00004000); // splitscreen ui size 3 + pGameSettings->uiBitmaskValues|=GAMESETTING_ANIMATEDCHARACTER; //eGameSetting_AnimatedCharacter - on + // TU12 + // favorite skins added, but only set in TU12 - set to FFs + for(int i=0;iuiFavoriteSkinA[i]=0xFFFFFFFF; + } + pGameSettings->ucCurrentFavoriteSkinPos=0; + // Added a bitmask in TU13 to enable/disable display of the Mash-up pack worlds in the saves list + pGameSettings->uiMashUpPackWorldsDisplay = 0xFFFFFFFF; + + // PS3 1.05 - added Greek + pGameSettings->ucLanguage = MINECRAFT_LANGUAGE_DEFAULT; // use the system language + + } + break; + case PROFILE_VERSION_4: + { + GAME_SETTINGS *pGameSettings=(GAME_SETTINGS *)pucData; + + pGameSettings->uiBitmaskValues&=~GAMESETTING_BEDROCKFOG; //eGameSetting_BedrockFog - off + pGameSettings->uiBitmaskValues|=GAMESETTING_DISPLAYHUD; //eGameSetting_DisplayHUD - on + pGameSettings->uiBitmaskValues|=GAMESETTING_DISPLAYHAND; //eGameSetting_DisplayHand - on + // TU7 + pGameSettings->uiBitmaskValues|=GAMESETTING_CUSTOMSKINANIM; //eGameSetting_CustomSkinAnim - on + // TU9 + pGameSettings->uiBitmaskValues|=GAMESETTING_DEATHMESSAGES; //eGameSetting_DeathMessages - on + pGameSettings->uiBitmaskValues|=(GAMESETTING_UISIZE&0x00000800); // uisize 2 + pGameSettings->uiBitmaskValues|=(GAMESETTING_UISIZE_SPLITSCREEN&0x00004000); // splitscreen ui size 3 + pGameSettings->uiBitmaskValues|=GAMESETTING_ANIMATEDCHARACTER; //eGameSetting_AnimatedCharacter - on + + // Set the online flag to on, so it's not saved if a game starts offline when the user didn't change it to be offline (xbox disconnected from LIVE) + pGameSettings->uiBitmaskValues|=GAMESETTING_ONLINE; //eGameSetting_GameSetting_Online - on + // TU12 + // favorite skins added, but only set in TU12 - set to FFs + for(int i=0;iuiFavoriteSkinA[i]=0xFFFFFFFF; + } + pGameSettings->ucCurrentFavoriteSkinPos=0; + // Added a bitmask in TU13 to enable/disable display of the Mash-up pack worlds in the saves list + pGameSettings->uiMashUpPackWorldsDisplay = 0xFFFFFFFF; + + // PS3 1.05 - added Greek + pGameSettings->ucLanguage = MINECRAFT_LANGUAGE_DEFAULT; // use the system language + + } + + break; + case PROFILE_VERSION_5: + { + GAME_SETTINGS *pGameSettings=(GAME_SETTINGS *)pucData; + + // reset the display new message counter + pGameSettings->uiBitmaskValues|=GAMESETTING_DISPLAYUPDATEMSG; //eGameSetting_DisplayUpdateMessage (counter) + // TU7 + pGameSettings->uiBitmaskValues|=GAMESETTING_CUSTOMSKINANIM; //eGameSetting_CustomSkinAnim - on + // TU9 + pGameSettings->uiBitmaskValues|=GAMESETTING_DEATHMESSAGES; //eGameSetting_DeathMessages - on + pGameSettings->uiBitmaskValues|=(GAMESETTING_UISIZE&0x00000800); // uisize 2 + pGameSettings->uiBitmaskValues|=(GAMESETTING_UISIZE_SPLITSCREEN&0x00004000); // splitscreen ui size 3 + pGameSettings->uiBitmaskValues|=GAMESETTING_ANIMATEDCHARACTER; //eGameSetting_AnimatedCharacter - on + // Set the online flag to on, so it's not saved if a game starts offline when the user didn't change it to be offline (xbox disconnected from LIVE) + pGameSettings->uiBitmaskValues|=GAMESETTING_ONLINE; //eGameSetting_GameSetting_Online - on + // TU12 + // favorite skins added, but only set in TU12 - set to FFs + for(int i=0;iuiFavoriteSkinA[i]=0xFFFFFFFF; + } + pGameSettings->ucCurrentFavoriteSkinPos=0; + // Added a bitmask in TU13 to enable/disable display of the Mash-up pack worlds in the saves list + pGameSettings->uiMashUpPackWorldsDisplay = 0xFFFFFFFF; + + // PS3 1.05 - added Greek + pGameSettings->ucLanguage = MINECRAFT_LANGUAGE_DEFAULT; // use the system language + + + } + + break; + case PROFILE_VERSION_6: + { + GAME_SETTINGS *pGameSettings=(GAME_SETTINGS *)pucData; + + // Added gui size for splitscreen and fullscreen + // Added death messages toggle + + // reset the display new message counter + pGameSettings->uiBitmaskValues|=GAMESETTING_DISPLAYUPDATEMSG; //eGameSetting_DisplayUpdateMessage (counter) + // TU9 + pGameSettings->uiBitmaskValues|=GAMESETTING_DEATHMESSAGES; //eGameSetting_DeathMessages - on + pGameSettings->uiBitmaskValues|=(GAMESETTING_UISIZE&0x00000800); // uisize 2 + pGameSettings->uiBitmaskValues|=(GAMESETTING_UISIZE_SPLITSCREEN&0x00004000); // splitscreen ui size 3 + pGameSettings->uiBitmaskValues|=GAMESETTING_ANIMATEDCHARACTER; //eGameSetting_AnimatedCharacter - on + // Set the online flag to on, so it's not saved if a game starts offline when the user didn't change it to be offline (xbox disconnected from LIVE) + pGameSettings->uiBitmaskValues|=GAMESETTING_ONLINE; //eGameSetting_GameSetting_Online - on + // TU12 + // favorite skins added, but only set in TU12 - set to FFs + for(int i=0;iuiFavoriteSkinA[i]=0xFFFFFFFF; + } + pGameSettings->ucCurrentFavoriteSkinPos=0; + // Added a bitmask in TU13 to enable/disable display of the Mash-up pack worlds in the saves list + pGameSettings->uiMashUpPackWorldsDisplay = 0xFFFFFFFF; + + // PS3 1.05 - added Greek + pGameSettings->ucLanguage = MINECRAFT_LANGUAGE_DEFAULT; // use the system language + + + } + + break; + + case PROFILE_VERSION_7: + { + GAME_SETTINGS *pGameSettings=(GAME_SETTINGS *)pucData; + // reset the display new message counter + pGameSettings->uiBitmaskValues|=GAMESETTING_DISPLAYUPDATEMSG; //eGameSetting_DisplayUpdateMessage (counter) + + // TU12 + // favorite skins added, but only set in TU12 - set to FFs + for(int i=0;iuiFavoriteSkinA[i]=0xFFFFFFFF; + } + pGameSettings->ucCurrentFavoriteSkinPos=0; + // Added a bitmask in TU13 to enable/disable display of the Mash-up pack worlds in the saves list + pGameSettings->uiMashUpPackWorldsDisplay = 0xFFFFFFFF; + + // PS3 1.05 - added Greek + pGameSettings->ucLanguage = MINECRAFT_LANGUAGE_DEFAULT; // use the system language + + + } + break; +#endif + case PROFILE_VERSION_8: + { + GAME_SETTINGS *pGameSettings=(GAME_SETTINGS *)pucData; + // reset the display new message counter + pGameSettings->uiBitmaskValues|=GAMESETTING_DISPLAYUPDATEMSG; //eGameSetting_DisplayUpdateMessage (counter) + + // Added a bitmask in TU13 to enable/disable display of the Mash-up pack worlds in the saves list + pGameSettings->uiMashUpPackWorldsDisplay = 0xFFFFFFFF; + + // PS3DEC13 + pGameSettings->uiBitmaskValues&=~GAMESETTING_PS3EULAREAD; //eGameSetting_PS3_EULA_Read - off + + // PS3 1.05 - added Greek + pGameSettings->ucLanguage = MINECRAFT_LANGUAGE_DEFAULT; // use the system language + + } + break; + case PROFILE_VERSION_9: + // PS3DEC13 + { + GAME_SETTINGS *pGameSettings=(GAME_SETTINGS *)pucData; + pGameSettings->uiBitmaskValues|=GAMESETTING_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 + + } + break; + 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 + + GAME_SETTINGS *pGameSettings=(GAME_SETTINGS *)pucData; + pGameSettings->ucMenuSensitivity=100; //eGameSetting_Sensitivity_InMenu + pGameSettings->ucInterfaceOpacity=80; //eGameSetting_Sensitivity_InMenu + pGameSettings->usBitmaskValues|=0x0200; //eGameSetting_DisplaySplitscreenGamertags - on + pGameSettings->usBitmaskValues|=0x0400; //eGameSetting_Hints - on + pGameSettings->usBitmaskValues|=0x1000; //eGameSetting_Autosave - 2 + pGameSettings->usBitmaskValues|=0x8000; //eGameSetting_Tooltips - on + + pGameSettings->uiBitmaskValues=0L; // reset + pGameSettings->uiBitmaskValues|=GAMESETTING_CLOUDS; //eGameSetting_Clouds - on + pGameSettings->uiBitmaskValues|=GAMESETTING_ONLINE; //eGameSetting_GameSetting_Online - on + //eGameSetting_GameSetting_Invite - off + pGameSettings->uiBitmaskValues|=GAMESETTING_FRIENDSOFFRIENDS; //eGameSetting_GameSetting_FriendsOfFriends - on + pGameSettings->uiBitmaskValues|=GAMESETTING_DISPLAYUPDATEMSG; //eGameSetting_DisplayUpdateMessage (counter) + pGameSettings->uiBitmaskValues&=~GAMESETTING_BEDROCKFOG; //eGameSetting_BedrockFog - off + pGameSettings->uiBitmaskValues|=GAMESETTING_DISPLAYHUD; //eGameSetting_DisplayHUD - on + pGameSettings->uiBitmaskValues|=GAMESETTING_DISPLAYHAND; //eGameSetting_DisplayHand - on + pGameSettings->uiBitmaskValues|=GAMESETTING_CUSTOMSKINANIM; //eGameSetting_CustomSkinAnim - on + pGameSettings->uiBitmaskValues|=GAMESETTING_DEATHMESSAGES; //eGameSetting_DeathMessages - on + pGameSettings->uiBitmaskValues|=(GAMESETTING_UISIZE&0x00000800); // uisize 2 + pGameSettings->uiBitmaskValues|=(GAMESETTING_UISIZE_SPLITSCREEN&0x00004000); // splitscreen ui size 3 + pGameSettings->uiBitmaskValues|=GAMESETTING_ANIMATEDCHARACTER; //eGameSetting_AnimatedCharacter - on + // TU12 + // favorite skins added, but only set in TU12 - set to FFs + for(int i=0;iuiFavoriteSkinA[i]=0xFFFFFFFF; + } + pGameSettings->ucCurrentFavoriteSkinPos=0; + // Added a bitmask in TU13 to enable/disable display of the Mash-up pack worlds in the saves list + pGameSettings->uiMashUpPackWorldsDisplay = 0xFFFFFFFF; + + // PS3DEC13 + pGameSettings->uiBitmaskValues&=~GAMESETTING_PS3EULAREAD; //eGameSetting_PS3_EULA_Read - off + + // PS3 1.05 - added Greek + pGameSettings->ucLanguage = MINECRAFT_LANGUAGE_DEFAULT; // use the system language + + } + break; + } + + return 0; +} + +void CMinecraftApp::ApplyGameSettingsChanged(int iPad) +{ + ActionGameSettings(iPad,eGameSetting_MusicVolume ); + ActionGameSettings(iPad,eGameSetting_SoundFXVolume ); + ActionGameSettings(iPad,eGameSetting_Gamma ); + ActionGameSettings(iPad,eGameSetting_Difficulty ); + ActionGameSettings(iPad,eGameSetting_Sensitivity_InGame ); + ActionGameSettings(iPad,eGameSetting_ViewBob ); + ActionGameSettings(iPad,eGameSetting_ControlScheme ); + ActionGameSettings(iPad,eGameSetting_ControlInvertLook); + ActionGameSettings(iPad,eGameSetting_ControlSouthPaw); + ActionGameSettings(iPad,eGameSetting_SplitScreenVertical); + ActionGameSettings(iPad,eGameSetting_GamertagsVisible); + + // Interim TU 1.6.6 + ActionGameSettings(iPad,eGameSetting_Sensitivity_InMenu ); + ActionGameSettings(iPad,eGameSetting_DisplaySplitscreenGamertags); + ActionGameSettings(iPad,eGameSetting_Hints); + ActionGameSettings(iPad,eGameSetting_InterfaceOpacity); + ActionGameSettings(iPad,eGameSetting_Tooltips); + + ActionGameSettings(iPad,eGameSetting_Clouds); + ActionGameSettings(iPad,eGameSetting_BedrockFog); + ActionGameSettings(iPad,eGameSetting_DisplayHUD); + ActionGameSettings(iPad,eGameSetting_DisplayHand); + ActionGameSettings(iPad,eGameSetting_CustomSkinAnim); + ActionGameSettings(iPad,eGameSetting_DeathMessages); + ActionGameSettings(iPad,eGameSetting_UISize); + ActionGameSettings(iPad,eGameSetting_UISizeSplitscreen); + ActionGameSettings(iPad,eGameSetting_AnimatedCharacter); + + ActionGameSettings(iPad,eGameSetting_PS3_EULA_Read); + +} + +void CMinecraftApp::ActionGameSettings(int iPad,eGameSetting eVal) +{ + Minecraft *pMinecraft=Minecraft::GetInstance(); + switch(eVal) + { + case eGameSetting_MusicVolume: + if(iPad==ProfileManager.GetPrimaryPad()) + { + pMinecraft->options->set(Options::Option::MUSIC,((float)GameSettingsA[iPad]->ucMusicVolume)/100.0f); + } + break; + case eGameSetting_SoundFXVolume: + if(iPad==ProfileManager.GetPrimaryPad()) + { + pMinecraft->options->set(Options::Option::SOUND,((float)GameSettingsA[iPad]->ucSoundFXVolume)/100.0f); + } + break; + case eGameSetting_Gamma: + if(iPad==ProfileManager.GetPrimaryPad()) + { + // ucGamma range is 0-100, UpdateGamma is 0 - 32768 + float fVal=((float)GameSettingsA[iPad]->ucGamma)*327.68f; + RenderManager.UpdateGamma((unsigned short)fVal); + } + + break; + case eGameSetting_Difficulty: + if(iPad==ProfileManager.GetPrimaryPad()) + { + pMinecraft->options->toggle(Options::Option::DIFFICULTY,GameSettingsA[iPad]->usBitmaskValues&0x03); + app.DebugPrintf("Difficulty toggle to %d\n",GameSettingsA[iPad]->usBitmaskValues&0x03); + + // Update the Game Host setting + app.SetGameHostOption(eGameHostOption_Difficulty,pMinecraft->options->difficulty); + + // send this to the other players if we are in-game + bool bInGame=pMinecraft->level!=NULL; + + // Game Host only (and for now we can't change the diff while in game, so this shouldn't happen) + if(bInGame && g_NetworkManager.IsHost() && (iPad==ProfileManager.GetPrimaryPad())) + { + app.SetXuiServerAction(iPad,eXuiServerAction_ServerSettingChanged_Difficulty); + } + } + else + { + app.DebugPrintf("NOT ACTIONING DIFFICULTY - Primary pad is %d, This pad is %d\n",ProfileManager.GetPrimaryPad(),iPad); + } + + break; + case eGameSetting_Sensitivity_InGame: + // 4J-PB - we don't use the options value + // tell the input that we've changed the sensitivity - range of the slider is 0 to 200, default is 100 + pMinecraft->options->set(Options::Option::SENSITIVITY,((float)GameSettingsA[iPad]->ucSensitivity)/100.0f); + //InputManager.SetJoypadSensitivity(iPad,((float)GameSettingsA[iPad]->ucSensitivity)/100.0f); + + break; + case eGameSetting_ViewBob: + // 4J-PB - not handled here any more - it's read from the gamesettings per player + //pMinecraft->options->toggle(Options::Option::VIEW_BOBBING,GameSettingsA[iPad]->usBitmaskValues&0x04); + break; + case eGameSetting_ControlScheme: + InputManager.SetJoypadMapVal(iPad,(GameSettingsA[iPad]->usBitmaskValues&0x30)>>4); + break; + + case eGameSetting_ControlInvertLook: + // Nothing specific to do for this setting. + break; + + case eGameSetting_ControlSouthPaw: + // What is the setting? + if ( GameSettingsA[iPad]->usBitmaskValues & 0x80 ) + { + // Southpaw. + InputManager.SetJoypadStickAxisMap( iPad, AXIS_MAP_LX, AXIS_MAP_RX ); + InputManager.SetJoypadStickAxisMap( iPad, AXIS_MAP_LY, AXIS_MAP_RY ); + InputManager.SetJoypadStickAxisMap( iPad, AXIS_MAP_RX, AXIS_MAP_LX ); + InputManager.SetJoypadStickAxisMap( iPad, AXIS_MAP_RY, AXIS_MAP_LY ); + InputManager.SetJoypadStickTriggerMap( iPad, TRIGGER_MAP_0, TRIGGER_MAP_1 ); + InputManager.SetJoypadStickTriggerMap( iPad, TRIGGER_MAP_1, TRIGGER_MAP_0 ); + } + else + { + // Right handed. + InputManager.SetJoypadStickAxisMap( iPad, AXIS_MAP_LX, AXIS_MAP_LX ); + InputManager.SetJoypadStickAxisMap( iPad, AXIS_MAP_LY, AXIS_MAP_LY ); + InputManager.SetJoypadStickAxisMap( iPad, AXIS_MAP_RX, AXIS_MAP_RX ); + InputManager.SetJoypadStickAxisMap( iPad, AXIS_MAP_RY, AXIS_MAP_RY ); + InputManager.SetJoypadStickTriggerMap( iPad, TRIGGER_MAP_0, TRIGGER_MAP_0 ); + InputManager.SetJoypadStickTriggerMap( iPad, TRIGGER_MAP_1, TRIGGER_MAP_1 ); + } + break; + case eGameSetting_SplitScreenVertical: + if(iPad==ProfileManager.GetPrimaryPad()) + { + pMinecraft->updatePlayerViewportAssignments(); + } + break; + case eGameSetting_GamertagsVisible: + { + bool bInGame=pMinecraft->level!=NULL; + + // Game Host only + if(bInGame && g_NetworkManager.IsHost() && (iPad==ProfileManager.GetPrimaryPad())) + { + // Update the Game Host setting if you are the host and you are in-game + app.SetGameHostOption(eGameHostOption_Gamertags,((GameSettingsA[iPad]->usBitmaskValues&0x0008)!=0)?1:0); + app.SetXuiServerAction(iPad,eXuiServerAction_ServerSettingChanged_Gamertags); + + PlayerList *players = MinecraftServer::getInstance()->getPlayerList(); + for(AUTO_VAR(it3, players->players.begin()); it3 != players->players.end(); ++it3) + { + shared_ptr decorationPlayer = *it3; + decorationPlayer->setShowOnMaps((app.GetGameHostOption(eGameHostOption_Gamertags)!=0)?true:false); + } + } + } + break; + // Interim TU 1.6.6 + case eGameSetting_Sensitivity_InMenu: + // 4J-PB - we don't use the options value + // tell the input that we've changed the sensitivity - range of the slider is 0 to 200, default is 100 + //pMinecraft->options->set(Options::Option::SENSITIVITY,((float)GameSettingsA[iPad]->ucSensitivity)/100.0f); + //InputManager.SetJoypadSensitivity(iPad,((float)GameSettingsA[iPad]->ucSensitivity)/100.0f); + + break; + + case eGameSetting_DisplaySplitscreenGamertags: + for( BYTE idx = 0; idx < XUSER_MAX_COUNT; ++idx) + { + if(pMinecraft->localplayers[idx] != NULL) + { + if(pMinecraft->localplayers[idx]->m_iScreenSection==C4JRender::VIEWPORT_TYPE_FULLSCREEN) + { + ui.DisplayGamertag(idx,false); + } + else + { + ui.DisplayGamertag(idx,true); + } + } + } + + break; + case eGameSetting_InterfaceOpacity: + // update the tooltips display + ui.RefreshTooltips( iPad); + + break; + case eGameSetting_Hints: + //nothing to do here + break; + case eGameSetting_Tooltips: + if((GameSettingsA[iPad]->usBitmaskValues&0x8000)!=0) + { + ui.SetEnableTooltips(iPad,TRUE); + } + else + { + ui.SetEnableTooltips(iPad,FALSE); + } + break; + case eGameSetting_Clouds: + //nothing to do here + break; + case eGameSetting_Online: + //nothing to do here + break; + case eGameSetting_InviteOnly: + //nothing to do here + break; + case eGameSetting_FriendsOfFriends: + //nothing to do here + break; + case eGameSetting_BedrockFog: + { + bool bInGame=pMinecraft->level!=NULL; + + // Game Host only + if(bInGame && g_NetworkManager.IsHost() && (iPad==ProfileManager.GetPrimaryPad())) + { + // Update the Game Host setting if you are the host and you are in-game + app.SetGameHostOption(eGameHostOption_BedrockFog,GetGameSettings(iPad,eGameSetting_BedrockFog)?1:0); + app.SetXuiServerAction(iPad,eXuiServerAction_ServerSettingChanged_BedrockFog); + } + } + break; + case eGameSetting_DisplayHUD: + //nothing to do here + break; + case eGameSetting_DisplayHand: + //nothing to do here + break; + case eGameSetting_CustomSkinAnim: + //nothing to do here + break; + case eGameSetting_DeathMessages: + //nothing to do here + break; + case eGameSetting_UISize: + //nothing to do here + break; + case eGameSetting_UISizeSplitscreen: + //nothing to do here + break; + case eGameSetting_AnimatedCharacter: + //nothing to do here + break; + case eGameSetting_PS3_EULA_Read: + //nothing to do here + break; + case eGameSetting_PSVita_NetworkModeAdhoc: + //nothing to do here + break; + } +} + +void CMinecraftApp::SetPlayerSkin(int iPad,const wstring &name) +{ + DWORD skinId = app.getSkinIdFromPath(name); + + SetPlayerSkin(iPad,skinId); +} + +void CMinecraftApp::SetPlayerSkin(int iPad,DWORD dwSkinId) +{ + DebugPrintf("Setting skin for %d to %08X\n", iPad, dwSkinId); + + GameSettingsA[iPad]->dwSelectedSkin = dwSkinId; + GameSettingsA[iPad]->bSettingsChanged = true; + + TelemetryManager->RecordSkinChanged(iPad, GameSettingsA[iPad]->dwSelectedSkin); + + if(Minecraft::GetInstance()->localplayers[iPad]!=NULL) Minecraft::GetInstance()->localplayers[iPad]->setAndBroadcastCustomSkin(dwSkinId); +} + + +wstring CMinecraftApp::GetPlayerSkinName(int iPad) +{ + return app.getSkinPathFromId(GameSettingsA[iPad]->dwSelectedSkin); +} + +DWORD CMinecraftApp::GetPlayerSkinId(int iPad) +{ + // 4J-PB -check the user has rights to use this skin - they may have had at some point but the entitlement has been removed. + DLCPack *Pack=NULL; + DLCSkinFile *skinFile=NULL; + DWORD dwSkin=GameSettingsA[iPad]->dwSelectedSkin; + wchar_t chars[256]; + + if( GET_IS_DLC_SKIN_FROM_BITMASK(dwSkin) ) + { + // 4J Stu - DLC skins are numbered using decimal rather than hex to make it easier to number manually + swprintf(chars, 256, L"dlcskin%08d.png", GET_DLC_SKIN_ID_FROM_BITMASK(dwSkin)); + + Pack=app.m_dlcManager.getPackContainingSkin(chars); + + if(Pack) + { + skinFile = Pack->getSkinFile(chars); + + bool bSkinIsFree = skinFile->getParameterAsBool( DLCManager::e_DLCParamType_Free ); + bool bLicensed = Pack->hasPurchasedFile( DLCManager::e_DLCType_Skin, skinFile->getPath() ); + + if(bSkinIsFree || bLicensed) + { + return dwSkin; + } + else + { + return 0; + } + } + } + + + return dwSkin; +} + +DWORD CMinecraftApp::GetAdditionalModelParts(int iPad) +{ + return m_dwAdditionalModelParts[iPad]; +} + + +void CMinecraftApp::SetPlayerCape(int iPad,const wstring &name) +{ + DWORD capeId = Player::getCapeIdFromPath(name); + + SetPlayerCape(iPad,capeId); +} + +void CMinecraftApp::SetPlayerCape(int iPad,DWORD dwCapeId) +{ + DebugPrintf("Setting cape for %d to %08X\n", iPad, dwCapeId); + + GameSettingsA[iPad]->dwSelectedCape = dwCapeId; + GameSettingsA[iPad]->bSettingsChanged = true; + + //SentientManager.RecordSkinChanged(iPad, GameSettingsA[iPad]->dwSelectedSkin); + + if(Minecraft::GetInstance()->localplayers[iPad]!=NULL) Minecraft::GetInstance()->localplayers[iPad]->setAndBroadcastCustomCape(dwCapeId); +} + +wstring CMinecraftApp::GetPlayerCapeName(int iPad) +{ + return Player::getCapePathFromId(GameSettingsA[iPad]->dwSelectedCape); +} + +DWORD CMinecraftApp::GetPlayerCapeId(int iPad) +{ + return GameSettingsA[iPad]->dwSelectedCape; +} + +void CMinecraftApp::SetPlayerFavoriteSkin(int iPad, int iIndex,unsigned int uiSkinID) +{ + DebugPrintf("Setting favorite skin for %d to %08X\n", iPad, uiSkinID); + + GameSettingsA[iPad]->uiFavoriteSkinA[iIndex] = uiSkinID; + GameSettingsA[iPad]->bSettingsChanged = true; +} + +unsigned int CMinecraftApp::GetPlayerFavoriteSkin(int iPad,int iIndex) +{ + return GameSettingsA[iPad]->uiFavoriteSkinA[iIndex]; +} + +unsigned char CMinecraftApp::GetPlayerFavoriteSkinsPos(int iPad) +{ + return GameSettingsA[iPad]->ucCurrentFavoriteSkinPos; +} + +void CMinecraftApp::SetPlayerFavoriteSkinsPos(int iPad, int iPos) +{ + GameSettingsA[iPad]->ucCurrentFavoriteSkinPos=(unsigned char)iPos; + GameSettingsA[iPad]->bSettingsChanged = true; +} + +unsigned int CMinecraftApp::GetPlayerFavoriteSkinsCount(int iPad) +{ + unsigned int uiCount=0; + for(int i=0;iuiFavoriteSkinA[i]!=0xFFFFFFFF) + { + uiCount++; + } + else + { + break; + } + } + return uiCount; +} + +void CMinecraftApp::ValidateFavoriteSkins(int iPad) +{ + unsigned int uiCount=GetPlayerFavoriteSkinsCount(iPad); + + // remove invalid skins + unsigned int uiValidSkin=0; + wchar_t chars[256]; + + for(unsigned int i=0;igetFile(DLCManager::e_DLCType_Skin,chars); + DLCSkinFile *pSkinFile = pDLCPack->getSkinFile(chars); + + if( pDLCPack->hasPurchasedFile(DLCManager::e_DLCType_Skin, L"") || (pSkinFile && pSkinFile->isFree())) + { + GameSettingsA[iPad]->uiFavoriteSkinA[uiValidSkin++]=GameSettingsA[iPad]->uiFavoriteSkinA[i]; + } + } + } + + for(unsigned int i=uiValidSkin;iuiFavoriteSkinA[i]=0xFFFFFFFF; + } +} + +// Mash-up pack worlds +void CMinecraftApp::HideMashupPackWorld(int iPad, unsigned int iMashupPackID) +{ + unsigned int uiPackID=iMashupPackID - 1024; // mash-up ids start at 1024 + GameSettingsA[iPad]->uiMashUpPackWorldsDisplay&=~(1<bSettingsChanged = true; +} + +void CMinecraftApp::EnableMashupPackWorlds(int iPad) +{ + GameSettingsA[iPad]->uiMashUpPackWorldsDisplay=0xFFFFFFFF; + GameSettingsA[iPad]->bSettingsChanged = true; +} + +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 + if(GameSettingsA[iPad]==NULL) + { + return 0; + } + else + { + return GameSettingsA[iPad]->ucLanguage; + } +} + +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(); + + switch(eVal) + { + case eGameSetting_MusicVolume: + if(GameSettingsA[iPad]->ucMusicVolume!=ucVal) + { + GameSettingsA[iPad]->ucMusicVolume=ucVal; + if(iPad==ProfileManager.GetPrimaryPad()) + { + ActionGameSettings(iPad,eVal); + } + GameSettingsA[iPad]->bSettingsChanged=true; + } + break; + case eGameSetting_SoundFXVolume: + if(GameSettingsA[iPad]->ucSoundFXVolume!=ucVal) + { + GameSettingsA[iPad]->ucSoundFXVolume=ucVal; + if(iPad==ProfileManager.GetPrimaryPad()) + { + ActionGameSettings(iPad,eVal); + } + GameSettingsA[iPad]->bSettingsChanged=true; + } + break; + case eGameSetting_Gamma: + if(GameSettingsA[iPad]->ucGamma!=ucVal) + { + GameSettingsA[iPad]->ucGamma=ucVal; + if(iPad==ProfileManager.GetPrimaryPad()) + { + ActionGameSettings(iPad,eVal); + } + GameSettingsA[iPad]->bSettingsChanged=true; + } + break; + case eGameSetting_Difficulty: + if((GameSettingsA[iPad]->usBitmaskValues&0x03)!=(ucVal&0x03)) + { + GameSettingsA[iPad]->usBitmaskValues&=~0x03; + GameSettingsA[iPad]->usBitmaskValues|=ucVal&0x03; + if(iPad==ProfileManager.GetPrimaryPad()) + { + ActionGameSettings(iPad,eVal); + } + GameSettingsA[iPad]->bSettingsChanged=true; + } + break; + case eGameSetting_Sensitivity_InGame: + if(GameSettingsA[iPad]->ucSensitivity!=ucVal) + { + GameSettingsA[iPad]->ucSensitivity=ucVal; + ActionGameSettings(iPad,eVal); + GameSettingsA[iPad]->bSettingsChanged=true; + } + break; + case eGameSetting_ViewBob: + if((GameSettingsA[iPad]->usBitmaskValues&0x0004)!=((ucVal&0x01)<<2)) + { + if(ucVal!=0) + { + GameSettingsA[iPad]->usBitmaskValues|=0x0004; + } + else + { + GameSettingsA[iPad]->usBitmaskValues&=~0x0004; + } + ActionGameSettings(iPad,eVal); + GameSettingsA[iPad]->bSettingsChanged=true; + } + break; + case eGameSetting_ControlScheme: // bits 5 and 6 + if((GameSettingsA[iPad]->usBitmaskValues&0x30)!=((ucVal&0x03)<<4)) + { + GameSettingsA[iPad]->usBitmaskValues&=~0x0030; + if(ucVal!=0) + { + GameSettingsA[iPad]->usBitmaskValues|=(ucVal&0x03)<<4; + } + ActionGameSettings(iPad,eVal); + GameSettingsA[iPad]->bSettingsChanged=true; + } + break; + + case eGameSetting_ControlInvertLook: + if((GameSettingsA[iPad]->usBitmaskValues&0x0040)!=((ucVal&0x01)<<6)) + { + if(ucVal!=0) + { + GameSettingsA[iPad]->usBitmaskValues|=0x0040; + } + else + { + GameSettingsA[iPad]->usBitmaskValues&=~0x0040; + } + ActionGameSettings(iPad,eVal); + GameSettingsA[iPad]->bSettingsChanged=true; + } + break; + + case eGameSetting_ControlSouthPaw: + if((GameSettingsA[iPad]->usBitmaskValues&0x0080)!=((ucVal&0x01)<<7)) + { + if(ucVal!=0) + { + GameSettingsA[iPad]->usBitmaskValues|=0x0080; + } + else + { + GameSettingsA[iPad]->usBitmaskValues&=~0x0080; + } + ActionGameSettings(iPad,eVal); + GameSettingsA[iPad]->bSettingsChanged=true; + } + break; + case eGameSetting_SplitScreenVertical: + if((GameSettingsA[iPad]->usBitmaskValues&0x0100)!=((ucVal&0x01)<<8)) + { + if(ucVal!=0) + { + GameSettingsA[iPad]->usBitmaskValues|=0x0100; + } + else + { + GameSettingsA[iPad]->usBitmaskValues&=~0x0100; + } + ActionGameSettings(iPad,eVal); + GameSettingsA[iPad]->bSettingsChanged=true; + } + break; + case eGameSetting_GamertagsVisible: + if((GameSettingsA[iPad]->usBitmaskValues&0x0008)!=((ucVal&0x01)<<3)) + { + if(ucVal!=0) + { + GameSettingsA[iPad]->usBitmaskValues|=0x0008; + } + else + { + GameSettingsA[iPad]->usBitmaskValues&=~0x0008; + } + ActionGameSettings(iPad,eVal); + GameSettingsA[iPad]->bSettingsChanged=true; + } + break; + + // 4J-PB - Added for Interim TU for 1.6.6 + case eGameSetting_Sensitivity_InMenu: + if(GameSettingsA[iPad]->ucMenuSensitivity!=ucVal) + { + GameSettingsA[iPad]->ucMenuSensitivity=ucVal; + ActionGameSettings(iPad,eVal); + GameSettingsA[iPad]->bSettingsChanged=true; + } + break; + case eGameSetting_DisplaySplitscreenGamertags: + if((GameSettingsA[iPad]->usBitmaskValues&0x0200)!=((ucVal&0x01)<<9)) + { + if(ucVal!=0) + { + GameSettingsA[iPad]->usBitmaskValues|=0x0200; + } + else + { + GameSettingsA[iPad]->usBitmaskValues&=~0x0200; + } + ActionGameSettings(iPad,eVal); + GameSettingsA[iPad]->bSettingsChanged=true; + } + break; + case eGameSetting_Hints: + if((GameSettingsA[iPad]->usBitmaskValues&0x0400)!=((ucVal&0x01)<<10)) + { + if(ucVal!=0) + { + GameSettingsA[iPad]->usBitmaskValues|=0x0400; + } + else + { + GameSettingsA[iPad]->usBitmaskValues&=~0x0400; + } + ActionGameSettings(iPad,eVal); + GameSettingsA[iPad]->bSettingsChanged=true; + } + break; + case eGameSetting_Autosave: + if((GameSettingsA[iPad]->usBitmaskValues&0x7800)!=((ucVal&0x0F)<<11)) + { + GameSettingsA[iPad]->usBitmaskValues&=~0x7800; + if(ucVal!=0) + { + GameSettingsA[iPad]->usBitmaskValues|=(ucVal&0x0F)<<11; + } + ActionGameSettings(iPad,eVal); + GameSettingsA[iPad]->bSettingsChanged=true; + } + break; + + case eGameSetting_Tooltips: + if((GameSettingsA[iPad]->usBitmaskValues&0x8000)!=((ucVal&0x01)<<15)) + { + if(ucVal!=0) + { + GameSettingsA[iPad]->usBitmaskValues|=0x8000; + } + else + { + GameSettingsA[iPad]->usBitmaskValues&=~0x8000; + } + ActionGameSettings(iPad,eVal); + GameSettingsA[iPad]->bSettingsChanged=true; + } + break; + case eGameSetting_InterfaceOpacity: + if(GameSettingsA[iPad]->ucInterfaceOpacity!=ucVal) + { + GameSettingsA[iPad]->ucInterfaceOpacity=ucVal; + ActionGameSettings(iPad,eVal); + GameSettingsA[iPad]->bSettingsChanged=true; + } + + break; + case eGameSetting_Clouds: + if((GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_CLOUDS)!=(ucVal&0x01)) + { + if(ucVal==1) + { + GameSettingsA[iPad]->uiBitmaskValues|=GAMESETTING_CLOUDS; + } + else + { + GameSettingsA[iPad]->uiBitmaskValues&=~GAMESETTING_CLOUDS; + } + ActionGameSettings(iPad,eVal); + GameSettingsA[iPad]->bSettingsChanged=true; + } + + break; + + case eGameSetting_Online: + if((GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_ONLINE)!=(ucVal&0x01)<<1) + { + if(ucVal==1) + { + GameSettingsA[iPad]->uiBitmaskValues|=GAMESETTING_ONLINE; + } + else + { + GameSettingsA[iPad]->uiBitmaskValues&=~GAMESETTING_ONLINE; + } + ActionGameSettings(iPad,eVal); + GameSettingsA[iPad]->bSettingsChanged=true; + } + + break; + case eGameSetting_InviteOnly: + if((GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_INVITEONLY)!=(ucVal&0x01)<<2) + { + if(ucVal==1) + { + GameSettingsA[iPad]->uiBitmaskValues|=GAMESETTING_INVITEONLY; + } + else + { + GameSettingsA[iPad]->uiBitmaskValues&=~GAMESETTING_INVITEONLY; + } + ActionGameSettings(iPad,eVal); + GameSettingsA[iPad]->bSettingsChanged=true; + } + + break; + case eGameSetting_FriendsOfFriends: + if((GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_FRIENDSOFFRIENDS)!=(ucVal&0x01)<<3) + { + if(ucVal==1) + { + GameSettingsA[iPad]->uiBitmaskValues|=GAMESETTING_FRIENDSOFFRIENDS; + } + else + { + GameSettingsA[iPad]->uiBitmaskValues&=~GAMESETTING_FRIENDSOFFRIENDS; + } + ActionGameSettings(iPad,eVal); + GameSettingsA[iPad]->bSettingsChanged=true; + } + + break; + case eGameSetting_DisplayUpdateMessage: + if((GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_DISPLAYUPDATEMSG)!=(ucVal&0x03)<<4) + { + GameSettingsA[iPad]->uiBitmaskValues&=~GAMESETTING_DISPLAYUPDATEMSG; + if(ucVal>0) + { + GameSettingsA[iPad]->uiBitmaskValues|=(ucVal&0x03)<<4; + } + + ActionGameSettings(iPad,eVal); + GameSettingsA[iPad]->bSettingsChanged=true; + } + + break; + + case eGameSetting_BedrockFog: + if((GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_BEDROCKFOG)!=(ucVal&0x01)<<6) + { + if(ucVal==1) + { + GameSettingsA[iPad]->uiBitmaskValues|=GAMESETTING_BEDROCKFOG; + } + else + { + GameSettingsA[iPad]->uiBitmaskValues&=~GAMESETTING_BEDROCKFOG; + } + ActionGameSettings(iPad,eVal); + GameSettingsA[iPad]->bSettingsChanged=true; + } + + break; + case eGameSetting_DisplayHUD: + if((GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_DISPLAYHUD)!=(ucVal&0x01)<<7) + { + if(ucVal==1) + { + GameSettingsA[iPad]->uiBitmaskValues|=GAMESETTING_DISPLAYHUD; + } + else + { + GameSettingsA[iPad]->uiBitmaskValues&=~GAMESETTING_DISPLAYHUD; + } + ActionGameSettings(iPad,eVal); + GameSettingsA[iPad]->bSettingsChanged=true; + } + + break; + case eGameSetting_DisplayHand: + if((GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_DISPLAYHAND)!=(ucVal&0x01)<<8) + { + if(ucVal==1) + { + GameSettingsA[iPad]->uiBitmaskValues|=GAMESETTING_DISPLAYHAND; + } + else + { + GameSettingsA[iPad]->uiBitmaskValues&=~GAMESETTING_DISPLAYHAND; + } + ActionGameSettings(iPad,eVal); + GameSettingsA[iPad]->bSettingsChanged=true; + } + + break; + + case eGameSetting_CustomSkinAnim: + if((GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_CUSTOMSKINANIM)!=(ucVal&0x01)<<9) + { + if(ucVal==1) + { + GameSettingsA[iPad]->uiBitmaskValues|=GAMESETTING_CUSTOMSKINANIM; + } + else + { + GameSettingsA[iPad]->uiBitmaskValues&=~GAMESETTING_CUSTOMSKINANIM; + } + ActionGameSettings(iPad,eVal); + GameSettingsA[iPad]->bSettingsChanged=true; + } + + break; + // TU9 + case eGameSetting_DeathMessages: + if((GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_DEATHMESSAGES)!=(ucVal&0x01)<<10) + { + if(ucVal==1) + { + GameSettingsA[iPad]->uiBitmaskValues|=GAMESETTING_DEATHMESSAGES; + } + else + { + GameSettingsA[iPad]->uiBitmaskValues&=~GAMESETTING_DEATHMESSAGES; + } + ActionGameSettings(iPad,eVal); + GameSettingsA[iPad]->bSettingsChanged=true; + } + break; + case eGameSetting_UISize: + if((GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_UISIZE)!=((ucVal&0x03)<<11)) + { + GameSettingsA[iPad]->uiBitmaskValues&=~GAMESETTING_UISIZE; + if(ucVal!=0) + { + GameSettingsA[iPad]->uiBitmaskValues|=(ucVal&0x03)<<11; + } + ActionGameSettings(iPad,eVal); + GameSettingsA[iPad]->bSettingsChanged=true; + } + break; + case eGameSetting_UISizeSplitscreen: + if((GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_UISIZE_SPLITSCREEN)!=((ucVal&0x03)<<13)) + { + GameSettingsA[iPad]->uiBitmaskValues&=~GAMESETTING_UISIZE_SPLITSCREEN; + if(ucVal!=0) + { + GameSettingsA[iPad]->uiBitmaskValues|=(ucVal&0x03)<<13; + } + ActionGameSettings(iPad,eVal); + GameSettingsA[iPad]->bSettingsChanged=true; + } + break; + case eGameSetting_AnimatedCharacter: + if((GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_ANIMATEDCHARACTER)!=(ucVal&0x01)<<15) + { + if(ucVal==1) + { + GameSettingsA[iPad]->uiBitmaskValues|=GAMESETTING_ANIMATEDCHARACTER; + } + else + { + GameSettingsA[iPad]->uiBitmaskValues&=~GAMESETTING_ANIMATEDCHARACTER; + } + ActionGameSettings(iPad,eVal); + GameSettingsA[iPad]->bSettingsChanged=true; + } + break; + case eGameSetting_PS3_EULA_Read: + if((GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_PS3EULAREAD)!=(ucVal&0x01)<<16) + { + if(ucVal==1) + { + GameSettingsA[iPad]->uiBitmaskValues|=GAMESETTING_PS3EULAREAD; + } + else + { + GameSettingsA[iPad]->uiBitmaskValues&=~GAMESETTING_PS3EULAREAD; + } + ActionGameSettings(iPad,eVal); + GameSettingsA[iPad]->bSettingsChanged=true; + } + break; + case eGameSetting_PSVita_NetworkModeAdhoc: + if((GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_PSVITANETWORKMODEADHOC)!=(ucVal&0x01)<<17) + { + if(ucVal==1) + { + GameSettingsA[iPad]->uiBitmaskValues|=GAMESETTING_PSVITANETWORKMODEADHOC; + } + else + { + GameSettingsA[iPad]->uiBitmaskValues&=~GAMESETTING_PSVITANETWORKMODEADHOC; + } + ActionGameSettings(iPad,eVal); + GameSettingsA[iPad]->bSettingsChanged=true; + } + break; + + } +} + +unsigned char CMinecraftApp::GetGameSettings(eGameSetting eVal) +{ + int iPad=ProfileManager.GetPrimaryPad(); + + return GetGameSettings(iPad,eVal); +} + +unsigned char CMinecraftApp::GetGameSettings(int iPad,eGameSetting eVal) +{ + switch(eVal) + { + case eGameSetting_MusicVolume: + return GameSettingsA[iPad]->ucMusicVolume; + break; + case eGameSetting_SoundFXVolume: + return GameSettingsA[iPad]->ucSoundFXVolume; + break; + case eGameSetting_Gamma: + return GameSettingsA[iPad]->ucGamma; + break; + case eGameSetting_Difficulty: + return GameSettingsA[iPad]->usBitmaskValues&0x0003; + break; + case eGameSetting_Sensitivity_InGame: + return GameSettingsA[iPad]->ucSensitivity; + break; + case eGameSetting_ViewBob: + return ((GameSettingsA[iPad]->usBitmaskValues&0x0004)>>2); + break; + case eGameSetting_GamertagsVisible: + return ((GameSettingsA[iPad]->usBitmaskValues&0x0008)>>3); + break; + case eGameSetting_ControlScheme: + return ((GameSettingsA[iPad]->usBitmaskValues&0x0030)>>4); // 2 bits + break; + case eGameSetting_ControlInvertLook: + return ((GameSettingsA[iPad]->usBitmaskValues&0x0040)>>6); + break; + case eGameSetting_ControlSouthPaw: + return ((GameSettingsA[iPad]->usBitmaskValues&0x0080)>>7); + break; + case eGameSetting_SplitScreenVertical: + return ((GameSettingsA[iPad]->usBitmaskValues&0x0100)>>8); + break; + // 4J-PB - Added for Interim TU for 1.6.6 + case eGameSetting_Sensitivity_InMenu: + return GameSettingsA[iPad]->ucMenuSensitivity; + break; + + case eGameSetting_DisplaySplitscreenGamertags: + return ((GameSettingsA[iPad]->usBitmaskValues&0x0200)>>9); + break; + + case eGameSetting_Hints: + return ((GameSettingsA[iPad]->usBitmaskValues&0x0400)>>10); + break; + case eGameSetting_Autosave: + { + unsigned char ucVal=(GameSettingsA[iPad]->usBitmaskValues&0x7800)>>11; + return ucVal; + } + break; + case eGameSetting_Tooltips: + return ((GameSettingsA[iPad]->usBitmaskValues&0x8000)>>15); + break; + + case eGameSetting_InterfaceOpacity: + return GameSettingsA[iPad]->ucInterfaceOpacity; + break; + + case eGameSetting_Clouds: + return (GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_CLOUDS); + break; + case eGameSetting_Online: + return (GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_ONLINE)>>1; + break; + case eGameSetting_InviteOnly: + return (GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_INVITEONLY)>>2; + break; + case eGameSetting_FriendsOfFriends: + return (GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_FRIENDSOFFRIENDS)>>3; + break; + case eGameSetting_DisplayUpdateMessage: + return (GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_DISPLAYUPDATEMSG)>>4; + break; + case eGameSetting_BedrockFog: + return (GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_BEDROCKFOG)>>6; + break; + case eGameSetting_DisplayHUD: + return (GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_DISPLAYHUD)>>7; + break; + case eGameSetting_DisplayHand: + return (GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_DISPLAYHAND)>>8; + break; + case eGameSetting_CustomSkinAnim: + return (GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_CUSTOMSKINANIM)>>9; + break; + // TU9 + case eGameSetting_DeathMessages: + return (GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_DEATHMESSAGES)>>10; + break; + case eGameSetting_UISize: + { + unsigned char ucVal=(GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_UISIZE)>>11; + return ucVal; + } + break; + case eGameSetting_UISizeSplitscreen: + { + unsigned char ucVal=(GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_UISIZE_SPLITSCREEN)>>13; + return ucVal; + } + break; + case eGameSetting_AnimatedCharacter: + return (GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_ANIMATEDCHARACTER)>>15; + + case eGameSetting_PS3_EULA_Read: + return (GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_PS3EULAREAD)>>16; + + case eGameSetting_PSVita_NetworkModeAdhoc: + return (GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_PSVITANETWORKMODEADHOC)>>17; + + } + return 0; +} + +void CMinecraftApp::CheckGameSettingsChanged(bool bOverride5MinuteTimer, int iPad) +{ + // If the settings have changed, write them to the profile + + if(iPad==XUSER_INDEX_ANY) + { + for(int i=0;ibSettingsChanged) + { +#if ( defined __PS3__ || defined __ORBIS__ || defined _DURANGO || defined __PSVITA__ ) + StorageManager.WriteToProfile(i,true, bOverride5MinuteTimer); +#else + ProfileManager.WriteToProfile(i,true, bOverride5MinuteTimer); +#endif + GameSettingsA[i]->bSettingsChanged=false; + } + } + } + else + { + if(GameSettingsA[iPad]->bSettingsChanged) + { +#if ( defined __PS3__ || defined __ORBIS__ || defined _DURANGO || defined __PSVITA__) + StorageManager.WriteToProfile(iPad,true, bOverride5MinuteTimer); +#else + ProfileManager.WriteToProfile(iPad,true, bOverride5MinuteTimer); +#endif + GameSettingsA[iPad]->bSettingsChanged=false; + } + } +} + +void CMinecraftApp::ClearGameSettingsChangedFlag(int iPad) +{ + GameSettingsA[iPad]->bSettingsChanged=false; +} + +/////////////////////////// +// +// Remove the debug settings in the content package build +// +//////////////////////////// +#ifndef _DEBUG_MENUS_ENABLED +unsigned int CMinecraftApp::GetGameSettingsDebugMask(int iPad,bool bOverridePlayer) //bOverridePlayer is to force the send for the server to get the read options +{ + return 0; +} + +void CMinecraftApp::SetGameSettingsDebugMask(int iPad, unsigned int uiVal) +{ +} + +void CMinecraftApp::ActionDebugMask(int iPad,bool bSetAllClear) +{ +} + +#else + +unsigned int CMinecraftApp::GetGameSettingsDebugMask(int iPad,bool bOverridePlayer) //bOverridePlayer is to force the send for the server to get the read options +{ + if(iPad==-1) + { + iPad=ProfileManager.GetPrimaryPad(); + } + if(iPad < 0) iPad = 0; + + shared_ptr player = Minecraft::GetInstance()->localplayers[iPad]; + + if(bOverridePlayer || player==NULL) + { + return GameSettingsA[iPad]->uiDebugBitmask; + } + else + { + return player->GetDebugOptions(); + } +} + + +void CMinecraftApp::SetGameSettingsDebugMask(int iPad, unsigned int uiVal) +{ +#ifndef _CONTENT_PACKAGE + GameSettingsA[iPad]->bSettingsChanged=true; + GameSettingsA[iPad]->uiDebugBitmask=uiVal; + + // update the value so the network server can use it + shared_ptr player = Minecraft::GetInstance()->localplayers[iPad]; + + if(player) + { + Minecraft::GetInstance()->localgameModes[iPad]->handleDebugOptions(uiVal,player); + } +#endif +} + +void CMinecraftApp::ActionDebugMask(int iPad,bool bSetAllClear) +{ + unsigned int ulBitmask=app.GetGameSettingsDebugMask(iPad); + + if(bSetAllClear) ulBitmask=0L; + + + + // these settings should only be actioned for the primary player + if(ProfileManager.GetPrimaryPad()!=iPad) return; + + for(int i=0;iiPad, actionInfo->action); +} + + +void CMinecraftApp::HandleXuiActions(void) +{ + eXuiAction eAction; + eTMSAction eTMS; + LPVOID param; + Minecraft *pMinecraft=Minecraft::GetInstance(); + shared_ptr player; + + // are there any global actions to deal with? + eAction = app.GetGlobalXuiAction(); + if(eAction!=eAppAction_Idle) + { + switch(eAction) + { + case eAppAction_DisplayLavaMessage: + // Display a warning about placing lava in the spawn area + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + C4JStorage::EMessageResult result = ui.RequestErrorMessage( IDS_CANT_PLACE_NEAR_SPAWN_TITLE, IDS_CANT_PLACE_NEAR_SPAWN_TEXT, uiIDA,1,XUSER_INDEX_ANY); + if(result != C4JStorage::EMessage_Busy) SetGlobalXuiAction(eAppAction_Idle); + + } + break; + default: + break; + } + } + + // are there any app actions to deal with? + for(int i=0;iIsTitleAllowedToPostImages() && CSocialManager::Instance()->AreAllUsersAllowedToPostImages() ) + { + // disable character name tags for the shot + //m_bwasHidingGui = pMinecraft->options->hideGui; // 4J Stu - Removed 1.8.2 bug fix (TU6) as don't need this + pMinecraft->options->hideGui = true; + + SetAction(i,eAppAction_SocialPostScreenshot); + } + else + { + SetAction(i,eAppAction_Idle); + } + } + else + { + SetAction(i,eAppAction_Idle); + } + break; + case eAppAction_SocialPostScreenshot: + { + SetAction(i,eAppAction_Idle); + bool bKeepHiding = false; + for(int j=0; j < XUSER_MAX_COUNT;++j) + { + if(app.GetXuiAction(j) == eAppAction_SocialPostScreenshot) + { + bKeepHiding = true; + break; + } + } + pMinecraft->options->hideGui=bKeepHiding; + + // Facebook Share + + if(app.GetLocalPlayerCount()>1) + { + ui.NavigateToScene(i,eUIScene_SocialPost); + } + else + { + ui.NavigateToScene(i,eUIScene_SocialPost); + } + } + break; + case eAppAction_SaveGame: + SetAction(i,eAppAction_Idle); + if(!GetChangingSessionType()) + { + // If this is the trial game, do an upsell + if(ProfileManager.IsFullVersion()) + { + + // flag the render to capture the screenshot for the save + SetAction(i,eAppAction_SaveGameCapturedThumbnail); + } + else + { + // ask the player if they would like to upgrade, or they'll lose the level + + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_OK; + uiIDA[1]=IDS_CONFIRM_CANCEL; + ui.RequestErrorMessage(IDS_UNLOCK_TITLE, IDS_UNLOCK_TOSAVE_TEXT, uiIDA, 2,i,&CMinecraftApp::UnlockFullSaveReturned,this); + } + } + + break; + case eAppAction_AutosaveSaveGame: + { + // Need to run a check to see if the save exists in order to stop the dialog asking if we want to overwrite it coming up on an autosave + bool bSaveExists; + StorageManager.DoesSaveExist(&bSaveExists); + + SetAction(i,eAppAction_Idle); + if(!GetChangingSessionType()) + { + + // flag the render to capture the screenshot for the save + SetAction(i,eAppAction_AutosaveSaveGameCapturedThumbnail); + } + } + + break; + + case eAppAction_SaveGameCapturedThumbnail: + // reset the autosave timer + app.SetAutosaveTimerTime(); + SetAction(i,eAppAction_Idle); + // Check that there is a name for the save - if we're saving from the tutorial and this is the first save from the tutorial, we'll not have a name + /*if(StorageManager.GetSaveName()==NULL) + { + app.NavigateToScene(i,eUIScene_SaveWorld); + } + else*/ + { + // turn off the gamertags in splitscreen for the primary player, since they are about to be made fullscreen + ui.HideAllGameUIElements(); + + // Hide the other players scenes + ui.ShowOtherPlayersBaseScene(ProfileManager.GetPrimaryPad(), false); + + //INT saveOrCheckpointId = 0; + //bool validSave = StorageManager.GetSaveUniqueNumber(&saveOrCheckpointId); + //SentientManager.RecordLevelSaveOrCheckpoint(ProfileManager.GetPrimaryPad(), saveOrCheckpointId); + + LoadingInputParams *loadingParams = new LoadingInputParams(); + loadingParams->func = &UIScene_PauseMenu::SaveWorldThreadProc; + loadingParams->lpParam = (LPVOID)false; + + // 4J-JEV - PS4: Fix for #5708 - [ONLINE] - If the user pulls their network cable out while saving the title will hang. + loadingParams->waitForThreadToDelete = true; + + UIFullscreenProgressCompletionData *completionData = new UIFullscreenProgressCompletionData(); + completionData->bShowBackground=TRUE; + completionData->bShowLogo=TRUE; + completionData->type = e_ProgressCompletion_NavigateBackToScene; + completionData->iPad = ProfileManager.GetPrimaryPad(); + + if( ui.IsSceneInStack( ProfileManager.GetPrimaryPad(), eUIScene_EndPoem ) ) + { + completionData->scene = eUIScene_EndPoem; + } + else + { + completionData->scene = eUIScene_PauseMenu; + } + + loadingParams->completionData = completionData; + + // 4J Stu - Xbox only +#ifdef _XBOX + // Temporarily make this scene fullscreen + CXuiSceneBase::SetPlayerBaseScenePosition( ProfileManager.GetPrimaryPad(), CXuiSceneBase::e_BaseScene_Fullscreen ); +#endif + + ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_FullscreenProgress, loadingParams , eUILayer_Fullscreen, eUIGroup_Fullscreen); + + } + break; + case eAppAction_AutosaveSaveGameCapturedThumbnail: + + { + app.SetAutosaveTimerTime(); + SetAction(i,eAppAction_Idle); + +#if defined(_XBOX_ONE) || defined(__ORBIS__) + app.SetXuiServerAction(ProfileManager.GetPrimaryPad(),eXuiServerAction_AutoSaveGame); + + if(app.GetGameHostOption(eGameHostOption_DisableSaving)) StorageManager.SetSaveDisabled(true); +#else + // turn off the gamertags in splitscreen for the primary player, since they are about to be made fullscreen + ui.HideAllGameUIElements(); + + //app.CloseAllPlayersXuiScenes(); + // Hide the other players scenes + ui.ShowOtherPlayersBaseScene(ProfileManager.GetPrimaryPad(), false); + + // This just allows it to be shown + if(pMinecraft->localgameModes[ProfileManager.GetPrimaryPad()] != NULL) pMinecraft->localgameModes[ProfileManager.GetPrimaryPad()]->getTutorial()->showTutorialPopup(false); + + //INT saveOrCheckpointId = 0; + //bool validSave = StorageManager.GetSaveUniqueNumber(&saveOrCheckpointId); + //SentientManager.RecordLevelSaveOrCheckpoint(ProfileManager.GetPrimaryPad(), saveOrCheckpointId); + + + LoadingInputParams *loadingParams = new LoadingInputParams(); + loadingParams->func = &UIScene_PauseMenu::SaveWorldThreadProc; + + loadingParams->lpParam = (LPVOID)true; + + UIFullscreenProgressCompletionData *completionData = new UIFullscreenProgressCompletionData(); + completionData->bShowBackground=TRUE; + completionData->bShowLogo=TRUE; + completionData->type = e_ProgressCompletion_AutosaveNavigateBack; + completionData->iPad = ProfileManager.GetPrimaryPad(); + //completionData->bAutosaveWasMenuDisplayed=ui.GetMenuDisplayed(ProfileManager.GetPrimaryPad()); + loadingParams->completionData = completionData; + + // 4J Stu - Xbox only +#ifdef _XBOX + // Temporarily make this scene fullscreen + CXuiSceneBase::SetPlayerBaseScenePosition( ProfileManager.GetPrimaryPad(), CXuiSceneBase::e_BaseScene_Fullscreen ); +#endif + + ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_FullscreenProgress, loadingParams , eUILayer_Fullscreen, eUIGroup_Fullscreen); +#endif + } + break; + case eAppAction_ExitPlayer: + // a secondary player has chosen to quit + { + int iPlayerC=g_NetworkManager.GetPlayerCount(); + + // Since the player is exiting, let's flush any profile writes for them, and hope we're not breaking TCR 136... +#if (defined __PS3__ || defined __ORBIS__ || defined _DURANGO || defined __PSVITA__) + StorageManager.ForceQueuedProfileWrites(i); + LeaderboardManager::Instance()->OpenSession(); + for (int j = 0; j < XUSER_MAX_COUNT; j++) + { + if( ProfileManager.IsSignedIn(j) ) + { + app.DebugPrintf("Stats save for an offline game for the player at index %d\n", 0); + Minecraft::GetInstance()->forceStatsSave(j); + } + } + LeaderboardManager::Instance()->CloseSession(); +#else + ProfileManager.ForceQueuedProfileWrites(i); +#endif + + // not required - it's done within the removeLocalPlayerIdx + // if(pMinecraft->level->isClientSide) + // { + // // we need to remove the qnetplayer, or this player won't be able to get back into the game until qnet times out and removes them + // g_NetworkManager.NotifyPlayerLeaving(g_NetworkManager.GetLocalPlayerByUserIndex(i)); + // } + + // if there are any tips showing, we need to close them + + pMinecraft->gui->clearMessages(i); + + // Make sure we've not got this player selected as current - this shouldn't be the case anyway + pMinecraft->setLocalPlayerIdx(ProfileManager.GetPrimaryPad()); + pMinecraft->removeLocalPlayerIdx(i); + +#ifdef _XBOX + // tell the xui scenes a splitscreen player left - has to come after removeLocalPlayerIdx which calls updatePlayerViewportAssignments + XUIMessage xuiMsg; + CustomMessage_Splitscreenplayer_Struct myMsgData; + CustomMessage_Splitscreenplayer( &xuiMsg, &myMsgData, false); + + // send the message + for(int idx=0;idxlocalplayers[idx]!=NULL)) + { + XuiBroadcastMessage( CXuiSceneBase::GetPlayerBaseScene(idx), &xuiMsg ); + } + } +#endif + +#ifndef _XBOX + // Wipe out the tooltips + ui.SetTooltips(i, -1); +#endif + + // Change the presence info + // Are we offline or online, and how many players are there + if(iPlayerC>2) // one player is about to leave here - they'll be set to idle in the qnet manager player leave + { + for(int iPlayer=0;iPlayerlocalplayers[iPlayer]) + { + if(g_NetworkManager.IsLocalGame()) + { + ProfileManager.SetCurrentGameActivity(iPlayer,CONTEXT_PRESENCE_MULTIPLAYEROFFLINE,false); + } + else + { + ProfileManager.SetCurrentGameActivity(iPlayer,CONTEXT_PRESENCE_MULTIPLAYER,false); + } + } + } + } + else + { + for(int iPlayer=0;iPlayerlocalplayers[iPlayer]) + { + if(g_NetworkManager.IsLocalGame()) + { + ProfileManager.SetCurrentGameActivity(iPlayer,CONTEXT_PRESENCE_MULTIPLAYER_1POFFLINE,false); + } + else + { + ProfileManager.SetCurrentGameActivity(iPlayer,CONTEXT_PRESENCE_MULTIPLAYER_1P,false); + } + } + } + } + +#ifdef _DURANGO + ProfileManager.RemoveGamepadFromGame(i); +#endif + + SetAction(i,eAppAction_Idle); + } + break; + case eAppAction_ExitPlayerPreLogin: + { + int iPlayerC=g_NetworkManager.GetPlayerCount(); + // Since the player is exiting, let's flush any profile writes for them, and hope we're not breaking TCR 136... +#if (defined __PS3__ || defined __ORBIS__ || defined _DURANGO || defined __PSVITA__) + StorageManager.ForceQueuedProfileWrites(i); +#else + ProfileManager.ForceQueuedProfileWrites(i); +#endif + // if there are any tips showing, we need to close them + + pMinecraft->gui->clearMessages(i); + + // Make sure we've not got this player selected as current - this shouldn't be the case anyway + pMinecraft->setLocalPlayerIdx(ProfileManager.GetPrimaryPad()); + pMinecraft->removeLocalPlayerIdx(i); + +#ifdef _XBOX + // tell the xui scenes a splitscreen player left - has to come after removeLocalPlayerIdx which calls updatePlayerViewportAssignments + XUIMessage xuiMsg; + CustomMessage_Splitscreenplayer_Struct myMsgData; + CustomMessage_Splitscreenplayer( &xuiMsg, &myMsgData, false); + + // send the message + for(int idx=0;idxlocalplayers[idx]!=NULL)) + { + XuiBroadcastMessage( CXuiSceneBase::GetPlayerBaseScene(idx), &xuiMsg ); + } + } +#endif + +#ifndef _XBOX + // Wipe out the tooltips + ui.SetTooltips(i, -1); +#endif + + // Change the presence info + // Are we offline or online, and how many players are there + if(iPlayerC>2) // one player is about to leave here - they'll be set to idle in the qnet manager player leave + { + for(int iPlayer=0;iPlayerlocalplayers[iPlayer]) + { + if(g_NetworkManager.IsLocalGame()) + { + ProfileManager.SetCurrentGameActivity(iPlayer,CONTEXT_PRESENCE_MULTIPLAYEROFFLINE,false); + } + else + { + ProfileManager.SetCurrentGameActivity(iPlayer,CONTEXT_PRESENCE_MULTIPLAYER,false); + } + } + } + } + else + { + for(int iPlayer=0;iPlayerlocalplayers[iPlayer]) + { + if(g_NetworkManager.IsLocalGame()) + { + ProfileManager.SetCurrentGameActivity(iPlayer,CONTEXT_PRESENCE_MULTIPLAYER_1POFFLINE,false); + } + else + { + ProfileManager.SetCurrentGameActivity(iPlayer,CONTEXT_PRESENCE_MULTIPLAYER_1P,false); + } + } + } + } + SetAction(i,eAppAction_Idle); + } + break; + +#ifdef __ORBIS__ + case eAppAction_OptionsSaveNoSpace: + { + SetAction(i,eAppAction_Idle); + + SceSaveDataDialogParam param; + SceSaveDataDialogSystemMessageParam sysParam; + SceSaveDataDialogItems items; + SceSaveDataDirName dirName; + + sceSaveDataDialogParamInitialize(¶m); + param.mode = SCE_SAVE_DATA_DIALOG_MODE_SYSTEM_MSG; + param.dispType = SCE_SAVE_DATA_DIALOG_TYPE_SAVE; + memset(&sysParam,0,sizeof(sysParam)); + param.sysMsgParam = &sysParam; + param.sysMsgParam->sysMsgType = SCE_SAVE_DATA_DIALOG_SYSMSG_TYPE_NOSPACE_CONTINUABLE; + param.sysMsgParam->value = app.GetOptionsBlocksRequired(i); + memset(&items, 0, sizeof(items)); + param.items = &items; + param.items->userId = ProfileManager.getUserID(i); + + int ret = sceSaveDataDialogInitialize(); + ret = sceSaveDataDialogOpen(¶m); + + app.SetOptionsSaveDataDialogRunning(true);//m_bOptionsSaveDataDialogRunning = true; + //pClass->m_eSaveIncompleteType = saveIncompleteType; + + //StorageManager.SetSaveDisabled(true); + //pClass->EnterSaveNotificationSection(); + + } + break; +#endif + + case eAppAction_ExitWorld: + + SetAction(i,eAppAction_Idle); + + // If we're already leaving don't exit + if (g_NetworkManager.IsLeavingGame()) + { + break; + } + + pMinecraft->gui->clearMessages(); + + // turn off the gamertags in splitscreen for the primary player, since they are about to be made fullscreen + ui.HideAllGameUIElements(); + + // reset the flag stopping new dlc message being shown if you've seen the message before + DisplayNewDLCTipAgain(); + + // clear the autosave timer that might be on screen + ui.ShowAutosaveCountdownTimer(false); + + // Hide the selected item text + ui.HideAllGameUIElements(); + + // Since the player forced the exit, let's flush any profile writes, and hope we're not breaking TCR 136... +#if (defined __PS3__ || defined __ORBIS__ || defined _DURANGO || defined __PSVITA__) + StorageManager.ForceQueuedProfileWrites(); + LeaderboardManager::Instance()->OpenSession(); + for (int j = 0; j < XUSER_MAX_COUNT; j++) + { + if( ProfileManager.IsSignedIn(j) ) + { + app.DebugPrintf("Stats save for an offline game for the player at index %d\n", 0); + Minecraft::GetInstance()->forceStatsSave(j); + } + } + LeaderboardManager::Instance()->CloseSession(); +#elif (defined _XBOX) + ProfileManager.ForceQueuedProfileWrites(); +#endif + + // 4J-PB - cancel any possible string verifications queued with LIVE + //InputManager.CancelAllVerifyInProgress(); + + if(ProfileManager.IsFullVersion()) + { + + // In a split screen, only the primary player actually quits the game, others just remove their players + if( i != ProfileManager.GetPrimaryPad() ) + { + // Make sure we've not got this player selected as current - this shouldn't be the case anyway + pMinecraft->setLocalPlayerIdx(ProfileManager.GetPrimaryPad()); + pMinecraft->removeLocalPlayerIdx(i); + +#ifdef _DURANGO + ProfileManager.RemoveGamepadFromGame(i); +#endif + SetAction(i,eAppAction_Idle); + return; + } + // flag to capture the save thumbnail + SetAction(i,eAppAction_ExitWorldCapturedThumbnail, param); + } + else + { + // ask the player if they would like to upgrade, or they'll lose the level + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_OK; + uiIDA[1]=IDS_CONFIRM_CANCEL; + ui.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;jlocalplayers[j]) + { + if(g_NetworkManager.IsLocalGame()) + { + app.SetRichPresenceContext(j,CONTEXT_GAME_STATE_BLANK); + ProfileManager.SetCurrentGameActivity(j,CONTEXT_PRESENCE_MULTIPLAYEROFFLINE,false); + } + else + { + app.SetRichPresenceContext(j,CONTEXT_GAME_STATE_BLANK); + ProfileManager.SetCurrentGameActivity(j,CONTEXT_PRESENCE_MULTIPLAYER,false); + } + TelemetryManager->RecordLevelExit(j, eSen_LevelExitStatus_Exited); + } + } + } + else + { + app.SetRichPresenceContext(i,CONTEXT_GAME_STATE_BLANK); + if(g_NetworkManager.IsLocalGame()) + { + ProfileManager.SetCurrentGameActivity(i,CONTEXT_PRESENCE_MULTIPLAYER_1POFFLINE,false); + } + else + { + ProfileManager.SetCurrentGameActivity(i,CONTEXT_PRESENCE_MULTIPLAYER_1P,false); + } + TelemetryManager->RecordLevelExit(i, eSen_LevelExitStatus_Exited); + } + break; + case eAppAction_ExitWorldCapturedThumbnail: + { + SetAction(i,eAppAction_Idle); + // Stop app running + SetGameStarted(false); + SetChangingSessionType(true); // Added to stop handling ethernet disconnects + + ui.CloseAllPlayersScenes(); + + // turn off the gamertags in splitscreen for the primary player, since they are about to be made fullscreen + ui.HideAllGameUIElements(); + + // 4J Stu - Fix for #12368 - Crash: Game crashes when saving then exiting and selecting to save + for(unsigned int idx = 0; idx < XUSER_MAX_COUNT; ++idx) + { +#ifdef _XBOX + app.TutorialSceneNavigateBack(idx,true); +#endif + + // 4J Stu - Fix for #13257 - CRASH: Gameplay: Title crashed after exiting the tutorial + // It doesn't matter if they were in the tutorial already + pMinecraft->playerLeftTutorial( idx ); + } + + LoadingInputParams *loadingParams = new LoadingInputParams(); + loadingParams->func = &UIScene_PauseMenu::ExitWorldThreadProc; + loadingParams->lpParam = param; + + UIFullscreenProgressCompletionData *completionData = new UIFullscreenProgressCompletionData(); + // If param is non-null then this is a forced exit by the server, so make sure the player knows why + // 4J Stu - Changed - Don't use the FullScreenProgressScreen for action, use a dialog instead + completionData->bRequiresUserAction = FALSE;//(param != NULL) ? TRUE : FALSE; + completionData->bShowTips = (param != NULL) ? FALSE : TRUE; + completionData->bShowBackground=TRUE; + completionData->bShowLogo=TRUE; + completionData->type = e_ProgressCompletion_NavigateToHomeMenu; + completionData->iPad = DEFAULT_XUI_MENU_USER; + loadingParams->completionData = completionData; + + ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_FullscreenProgress, loadingParams); + } + break; + case eAppAction_ExitWorldTrial: + { + SetAction(i,eAppAction_Idle); + + pMinecraft->gui->clearMessages(); + + // turn off the gamertags in splitscreen for the primary player, since they are about to be made fullscreen + ui.HideAllGameUIElements(); + + // Stop app running + SetGameStarted(false); + + ui.CloseAllPlayersScenes(); + + // 4J Stu - Fix for #12368 - Crash: Game crashes when saving then exiting and selecting to save + for(unsigned int idx = 0; idx < XUSER_MAX_COUNT; ++idx) + { +#ifdef _XBOX + app.TutorialSceneNavigateBack(idx,true); +#endif + + // 4J Stu - Fix for #13257 - CRASH: Gameplay: Title crashed after exiting the tutorial + // It doesn't matter if they were in the tutorial already + pMinecraft->playerLeftTutorial( idx ); + } + + LoadingInputParams *loadingParams = new LoadingInputParams(); + loadingParams->func = &UIScene_PauseMenu::ExitWorldThreadProc; + loadingParams->lpParam = param; + + UIFullscreenProgressCompletionData *completionData = new UIFullscreenProgressCompletionData(); + completionData->bShowBackground=TRUE; + completionData->bShowLogo=TRUE; + completionData->type = e_ProgressCompletion_NavigateToHomeMenu; + completionData->iPad = DEFAULT_XUI_MENU_USER; + loadingParams->completionData = completionData; + + ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_FullscreenProgress, loadingParams); + } + + break; + case eAppAction_ExitTrial: + //XLaunchNewImage(XLAUNCH_KEYWORD_DASH_ARCADE, 0); + ExitGame(); + break; + + case eAppAction_Respawn: + { + ConnectionProgressParams *param = new ConnectionProgressParams(); + param->iPad = i; + param->stringId = IDS_PROGRESS_RESPAWNING; + param->showTooltips = false; + param->setFailTimer = false; + ui.NavigateToScene(i,eUIScene_ConnectingProgress, param); + + // Need to reset this incase the player has already died and respawned + pMinecraft->localplayers[i]->SetPlayerRespawned(false); + + SetAction(i,eAppAction_WaitForRespawnComplete); + if( app.GetLocalPlayerCount()>1 ) + { + // In split screen mode, we don't want to do any async loading or flushing of the cache, just a simple respawn + pMinecraft->localplayers[i]->respawn(); + + // If the respawn requires a dimension change then the action will have changed + //if(app.GetXuiAction(i) == eAppAction_Respawn) + //{ + // SetAction(i,eAppAction_Idle); + // CloseXuiScenes(i); + //} + } + else + { + //SetAction(i,eAppAction_WaitForRespawnComplete); + + //LoadingInputParams *loadingParams = new LoadingInputParams(); + //loadingParams->func = &CScene_Death::RespawnThreadProc; + //loadingParams->lpParam = (LPVOID)i; + + // Disable game & update thread whilst we do any of this + //app.SetGameStarted(false); + pMinecraft->gameRenderer->DisableUpdateThread(); + + // 4J Stu - We don't need this on a thread in multiplayer as respawning is asynchronous. + pMinecraft->localplayers[i]->respawn(); + + //app.SetGameStarted(true); + pMinecraft->gameRenderer->EnableUpdateThread(); + + //UIFullscreenProgressCompletionData *completionData = new UIFullscreenProgressCompletionData(); + //completionData->bShowBackground=TRUE; + //completionData->bShowLogo=TRUE; + //completionData->type = e_ProgressCompletion_CloseUIScenes; + //completionData->iPad = i; + //loadingParams->completionData = completionData; + + //app.NavigateToScene(i,eUIScene_FullscreenProgress, loadingParams, true); + } + } + break; + case eAppAction_WaitForRespawnComplete: + player = pMinecraft->localplayers[i]; + if(player != NULL && player->GetPlayerRespawned()) + { + SetAction(i,eAppAction_Idle); + + if(ui.IsSceneInStack(i, eUIScene_EndPoem)) + { + ui.NavigateBack(i,false,eUIScene_EndPoem); + } + else + { + ui.CloseUIScenes(i); + } + + // clear the progress messages + + // pMinecraft->progressRenderer->progressStart(-1); + // pMinecraft->progressRenderer->progressStage(-1); + } + else if(!g_NetworkManager.IsInGameplay()) + { + SetAction(i,eAppAction_Idle); + } + break; + case eAppAction_WaitForDimensionChangeComplete: + player = pMinecraft->localplayers[i]; + if(player != NULL && player->connection && player->connection->isStarted()) + { + SetAction(i,eAppAction_Idle); + ui.CloseUIScenes(i); + } + else if(!g_NetworkManager.IsInGameplay()) + { + SetAction(i,eAppAction_Idle); + } + break; + case eAppAction_PrimaryPlayerSignedOut: + { + //SetAction(i,eAppAction_Idle); + + // clear the autosavetimer that might be displayed + ui.ShowAutosaveCountdownTimer(false); + + // If the player signs out before the game started the server can be killed a bit earlier to stop + // the loading or saving of a new game continuing running while the UI/Guide is up + if(!app.GetGameStarted()) MinecraftServer::HaltServer(true); + + // inform the player they are being returned to the menus because they signed out + StorageManager.SetSaveDeviceSelected(i,false); + // need to clear the player stats - can't assume it'll be done in setlevel - we may not be in the game + StatsCounter* pStats = Minecraft::GetInstance()->stats[ i ]; + pStats->clear(); + + // 4J-PB - the libs will display the Returned to Title screen + // UINT uiIDA[1]; + // uiIDA[0]=IDS_CONFIRM_OK; + // + // ui.RequestMessageBox(IDS_RETURNEDTOMENU_TITLE, IDS_RETURNEDTOTITLESCREEN_TEXT, uiIDA, 1, i,&CMinecraftApp::PrimaryPlayerSignedOutReturned,this,app.GetStringTable()); + if( g_NetworkManager.IsInSession() ) + { + app.SetAction(i,eAppAction_PrimaryPlayerSignedOutReturned); + } + else + { + app.SetAction(i,eAppAction_PrimaryPlayerSignedOutReturned_Menus); + MinecraftServer::resetFlags(); + } + } + break; + case eAppAction_EthernetDisconnected: + { + app.DebugPrintf("Handling eAppAction_EthernetDisconnected\n"); + SetAction(i,eAppAction_Idle); + + // 4J Stu - Fix for #12530 -TCR 001 BAS Game Stability: Title will crash if the player disconnects while starting a new world and then opts to play the tutorial once they have been returned to the Main Menu. + if(!g_NetworkManager.IsLeavingGame()) + { + app.DebugPrintf("Handling eAppAction_EthernetDisconnected - Not leaving game\n"); + // 4J-PB - not the same as a signout. We should only leave the game if this machine is not the host. We shouldn't get rid of the save device either. + if( g_NetworkManager.IsHost() ) + { + app.DebugPrintf("Handling eAppAction_EthernetDisconnected - Is Host\n"); + // If it's already a local game, then an ethernet disconnect should have no effect + if( !g_NetworkManager.IsLocalGame() && g_NetworkManager.IsInGameplay() ) + { + // Change the session to an offline session + SetAction(i,eAppAction_ChangeSessionType); + } + else if(!g_NetworkManager.IsLocalGame() && !g_NetworkManager.IsInGameplay() ) + { + // There are two cases here, either: + // 1. We're early enough in the create/load game that we can do a really minimal shutdown or + // 2. We're far enough in (game has started but the actual game started flag hasn't been set) that we should just wait until we're in the game and switch to offline mode + + // If there's a non-null level then, for our purposes, the game has started + bool gameStarted = false; + for(int j = 0; j < pMinecraft->levels.length; j++) + { + if (pMinecraft->levels.data[j] != NULL) + { + gameStarted = true; + break; + } + } + + if (!gameStarted) + { + // 1. Exit + MinecraftServer::HaltServer(); + + // Fix for #12530 - TCR 001 BAS Game Stability: Title will crash if the player disconnects while starting a new world and then opts to play the tutorial once they have been returned to the Main Menu. + // 4J Stu - Leave the session + g_NetworkManager.LeaveGame(FALSE); + + // need to clear the player stats - can't assume it'll be done in setlevel - we may not be in the game + StatsCounter* pStats = Minecraft::GetInstance()->stats[ i ]; + pStats->clear(); + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + + ui.RequestErrorMessage(g_NetworkManager.CorrectErrorIDS(IDS_CONNECTION_LOST), g_NetworkManager.CorrectErrorIDS(IDS_CONNECTION_LOST_LIVE), uiIDA, 1, i,&CMinecraftApp::EthernetDisconnectReturned,this); + } + else + { + // 2. Switch to offline + SetAction(i,eAppAction_ChangeSessionType); + } + } + } + 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 ]; + pStats->clear(); + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + + 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. + case eAppAction_EthernetDisconnectedReturned: + case eAppAction_PrimaryPlayerSignedOutReturned: + { + SetAction(i,eAppAction_Idle); + + pMinecraft->gui->clearMessages(); + + // turn off the gamertags in splitscreen for the primary player, since they are about to be made fullscreen + ui.HideAllGameUIElements(); + + // set the state back to pre-game + ProfileManager.ResetProfileProcessState(); + + + if( g_NetworkManager.IsLeavingGame() ) + { + // 4J Stu - If we are already leaving the game, then we just need to signal that the player signed out to stop saves + pMinecraft->progressRenderer->progressStartNoAbort( IDS_EXITING_GAME ); + pMinecraft->progressRenderer->progressStage(-1); + // This has no effect on client machines + MinecraftServer::HaltServer(true); + } + else + { + // Stop app running + SetGameStarted(false); + + // turn off the gamertags in splitscreen for the primary player, since they are about to be made fullscreen + ui.HideAllGameUIElements(); + + ui.CloseAllPlayersScenes(); + + // 4J Stu - Fix for #12368 - Crash: Game crashes when saving then exiting and selecting to save + for(unsigned int idx = 0; idx < XUSER_MAX_COUNT; ++idx) + { +#ifdef _XBOX + app.TutorialSceneNavigateBack(idx,true); +#endif + + // 4J Stu - Fix for #13257 - CRASH: Gameplay: Title crashed after exiting the tutorial + // It doesn't matter if they were in the tutorial already + pMinecraft->playerLeftTutorial( idx ); + } + + LoadingInputParams *loadingParams = new LoadingInputParams(); + loadingParams->func = &CMinecraftApp::SignoutExitWorldThreadProc; + + UIFullscreenProgressCompletionData *completionData = new UIFullscreenProgressCompletionData(); + completionData->bShowBackground=TRUE; + completionData->bShowLogo=TRUE; + completionData->iPad=DEFAULT_XUI_MENU_USER; + completionData->type = e_ProgressCompletion_NavigateToHomeMenu; + loadingParams->completionData = completionData; + + ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_FullscreenProgress, loadingParams); + } + } + break; + case eAppAction_PrimaryPlayerSignedOutReturned_Menus: + SetAction(i,eAppAction_Idle); + // set the state back to pre-game + ProfileManager.ResetProfileProcessState(); + // clear the save device + StorageManager.SetSaveDeviceSelected(i,false); + + ui.UpdatePlayerBasePositions(); + // there are multiple layers in the help menu, so a navigate back isn't enough + ui.NavigateToHomeMenu(); + + break; + case eAppAction_EthernetDisconnectedReturned_Menus: + SetAction(i,eAppAction_Idle); + // set the state back to pre-game + ProfileManager.ResetProfileProcessState(); + + ui.UpdatePlayerBasePositions(); + + // there are multiple layers in the help menu, so a navigate back isn't enough + ui.NavigateToHomeMenu(); + + break; + + case eAppAction_TrialOver: + { + SetAction(i,eAppAction_Idle); + UINT uiIDA[2]; + uiIDA[0]=IDS_UNLOCK_TITLE; + uiIDA[1]=IDS_EXIT_GAME; + + ui.RequestErrorMessage(IDS_TRIALOVER_TITLE, IDS_TRIALOVER_TEXT, uiIDA, 2, i,&CMinecraftApp::TrialOverReturned,this); + } + break; + + // INVITES + case eAppAction_DashboardTrialJoinFromInvite: + { + TelemetryManager->RecordUpsellPresented(i, eSen_UpsellID_Full_Version_Of_Game, app.m_dwOfferID); + + SetAction(i,eAppAction_Idle); + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_OK; + uiIDA[1]=IDS_CONFIRM_CANCEL; + + ui.RequestErrorMessage(IDS_UNLOCK_TITLE, IDS_UNLOCK_ACCEPT_INVITE, uiIDA, 2, i,&CMinecraftApp::UnlockFullInviteReturned,this); + } + break; + case eAppAction_ExitAndJoinFromInvite: + { + UINT uiIDA[3]; + + SetAction(i,eAppAction_Idle); + // Check the player really wants to do this + +#if defined(_XBOX_ONE) || defined(__ORBIS__) + // Show save option is saves ARE disabled + if(ProfileManager.IsFullVersion() && StorageManager.GetSaveDisabled() && i==ProfileManager.GetPrimaryPad() && g_NetworkManager.IsHost() && GetGameStarted() ) + { + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_EXIT_GAME_SAVE; + uiIDA[2]=IDS_EXIT_GAME_NO_SAVE; + + ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_LEAVE_VIA_INVITE, uiIDA, 3, i,&CMinecraftApp::ExitAndJoinFromInviteSaveDialogReturned,this); + } + else +#else + if(ProfileManager.IsFullVersion() && !StorageManager.GetSaveDisabled() && i==ProfileManager.GetPrimaryPad() && g_NetworkManager.IsHost() && GetGameStarted() ) + { + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_EXIT_GAME_SAVE; + uiIDA[2]=IDS_EXIT_GAME_NO_SAVE; + + ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_LEAVE_VIA_INVITE, uiIDA, 3, i,&CMinecraftApp::ExitAndJoinFromInviteSaveDialogReturned,this); + } + else +#endif + { + if(!ProfileManager.IsFullVersion()) + { + TelemetryManager->RecordUpsellPresented(i, eSen_UpsellID_Full_Version_Of_Game, app.m_dwOfferID); + + // upsell + uiIDA[0]=IDS_CONFIRM_OK; + uiIDA[1]=IDS_CONFIRM_CANCEL; + ui.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.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_LEAVE_VIA_INVITE, uiIDA, 2,i,&CMinecraftApp::ExitAndJoinFromInvite,this); + } + } + } + break; + case eAppAction_ExitAndJoinFromInviteConfirmed: + { + SetAction(i,eAppAction_Idle); + + pMinecraft->gui->clearMessages(); + + // turn off the gamertags in splitscreen for the primary player, since they are about to be made fullscreen + ui.HideAllGameUIElements(); + + // Stop app running + SetGameStarted(false); + + ui.CloseAllPlayersScenes(); + + // 4J Stu - Fix for #12368 - Crash: Game crashes when saving then exiting and selecting to save + for(unsigned int idx = 0; idx < XUSER_MAX_COUNT; ++idx) + { +#ifdef _XBOX + app.TutorialSceneNavigateBack(idx,true); +#endif + + // 4J Stu - Fix for #13257 - CRASH: Gameplay: Title crashed after exiting the tutorial + // It doesn't matter if they were in the tutorial already + pMinecraft->playerLeftTutorial( idx ); + } + + // 4J-PB - may have been using a texture pack with audio , so clean up anything texture pack related here + + // unload any texture pack audio + // if there is audio in use, clear out the audio, and unmount the pack + TexturePack *pTexPack=Minecraft::GetInstance()->skins->getSelected(); + DLCTexturePack *pDLCTexPack=NULL; + + if(pTexPack->hasAudio()) + { + // get the dlc texture pack, and store it + pDLCTexPack=(DLCTexturePack *)pTexPack; + } + + // change to the default texture pack + pMinecraft->skins->selectTexturePackById(TexturePackRepository::DEFAULT_TEXTURE_PACK_ID); + + if(pTexPack->hasAudio()) + { + // need to stop the streaming audio - by playing streaming audio from the default texture pack now + // reset the streaming sounds back to the normal ones +#ifndef _XBOX + pMinecraft->soundEngine->SetStreamingSounds(eStream_Overworld_Calm1,eStream_Overworld_piano3, + eStream_Nether1,eStream_Nether4, + eStream_end_dragon,eStream_end_end, + eStream_CD_1); +#endif + pMinecraft->soundEngine->playStreaming(L"", 0, 0, 0, 1, 1); + +#ifdef _XBOX + if(pDLCTexPack->m_pStreamedWaveBank!=NULL) + { + pDLCTexPack->m_pStreamedWaveBank->Destroy(); + } + if(pDLCTexPack->m_pSoundBank!=NULL) + { + pDLCTexPack->m_pSoundBank->Destroy(); + } +#endif +#ifdef _DURANGO + DWORD result = StorageManager.UnmountInstalledDLC(L"TPACK"); +#else + DWORD result = StorageManager.UnmountInstalledDLC("TPACK"); +#endif + app.DebugPrintf("Unmount result is %d\n",result); + } + +#ifdef _XBOX_ONE + // 4J Stu - It's possible that we can sign in/remove players between the mask initially being set and this point + m_InviteData.dwLocalUsersMask = 0; + for(unsigned int index = 0; index < XUSER_MAX_COUNT; ++index) + { + if(ProfileManager.IsSignedIn(index) ) + { + if(index==i || pMinecraft->localplayers[index]!=NULL ) + { + m_InviteData.dwLocalUsersMask |= g_NetworkManager.GetLocalPlayerMask( index ); + } + } + } +#endif + + LoadingInputParams *loadingParams = new LoadingInputParams(); + loadingParams->func = &CGameNetworkManager::ExitAndJoinFromInviteThreadProc; + loadingParams->lpParam = (LPVOID)&m_InviteData; + + UIFullscreenProgressCompletionData *completionData = new UIFullscreenProgressCompletionData(); + completionData->bShowBackground=TRUE; + completionData->bShowLogo=TRUE; + completionData->iPad=DEFAULT_XUI_MENU_USER; + completionData->type = e_ProgressCompletion_NoAction; + loadingParams->completionData = completionData; + + ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_FullscreenProgress, loadingParams); + } + + break; + case eAppAction_JoinFromInvite: + { + SetAction(i,eAppAction_Idle); + + // 4J Stu - Move this state block from CPlatformNetworkManager::ExitAndJoinFromInviteThreadProc, as g_NetworkManager.JoinGameFromInviteInfo ultimately can call NavigateToScene, + /// and we should only be calling that from the main thread + app.SetTutorialMode( false ); + + g_NetworkManager.SetLocalGame(false); + + JoinFromInviteData *inviteData = (JoinFromInviteData *)param; + // 4J-PB - clear any previous connection errors + Minecraft::GetInstance()->clearConnectionFailed(); + + app.DebugPrintf( "Changing Primary Pad on an invite accept - pad was %d, and is now %d\n", ProfileManager.GetPrimaryPad(), inviteData->dwUserIndex ); + ProfileManager.SetLockedProfile(inviteData->dwUserIndex); + ProfileManager.SetPrimaryPad(inviteData->dwUserIndex); + +#ifdef _XBOX_ONE + // 4J Stu - If a player is signed in (i.e. locked) but not in the mask, unlock them + for(unsigned int index = 0; index < XUSER_MAX_COUNT; ++index) + { + if( index != inviteData->dwUserIndex && ProfileManager.IsSignedIn(index) ) + { + if( (m_InviteData.dwLocalUsersMask & g_NetworkManager.GetLocalPlayerMask( index ) ) == 0 ) + { + ProfileManager.RemoveGamepadFromGame(index); + } + } + } +#endif + + // change the minecraft player name + Minecraft::GetInstance()->user->name = convStringToWstring( ProfileManager.GetGamertag(ProfileManager.GetPrimaryPad())); + + bool success = g_NetworkManager.JoinGameFromInviteInfo( + inviteData->dwUserIndex, // dwUserIndex + inviteData->dwLocalUsersMask, // dwUserMask + inviteData->pInviteInfo ); // pInviteInfo + + if( !success ) + { + app.DebugPrintf( "Failed joining game from invite\n" ); + //return hr; + + // 4J Stu - Copied this from XUI_FullScreenProgress to properly handle the fail case, as the thread will no longer be failing + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestErrorMessage( IDS_CONNECTION_FAILED, IDS_CONNECTION_LOST_SERVER, uiIDA,1,ProfileManager.GetPrimaryPad()); + + ui.NavigateToHomeMenu(); + ui.UpdatePlayerBasePositions(); + } + } + break; + case eAppAction_ChangeSessionType: + { + // If we are not in gameplay yet, then wait until the server is setup before changing the session type + if( g_NetworkManager.IsInGameplay() ) + { + // This kicks off a thread that waits for the server to end, then closes the current session, starts a new one and joins the local players into it + + SetAction(i,eAppAction_Idle); + + if( !GetChangingSessionType() && !g_NetworkManager.IsLocalGame() ) + { + SetGameStarted(false); + SetChangingSessionType(true); + SetReallyChangingSessionType(true); + + // turn off the gamertags in splitscreen for the primary player, since they are about to be made fullscreen + ui.HideAllGameUIElements(); + + if( !ui.IsSceneInStack( ProfileManager.GetPrimaryPad(), eUIScene_EndPoem ) ) + { + ui.CloseAllPlayersScenes(); + } + ui.ShowOtherPlayersBaseScene(ProfileManager.GetPrimaryPad(), true); + + // Remove this line to fix: + // #49084 - TU5: Code: Gameplay: The title crashes every time client navigates to 'Play game' menu and loads/creates new game after a "Connection to Xbox LIVE was lost" message has appeared. + //app.NavigateToScene(0,eUIScene_Main); + + LoadingInputParams *loadingParams = new LoadingInputParams(); + loadingParams->func = &CGameNetworkManager::ChangeSessionTypeThreadProc; + loadingParams->lpParam = NULL; + + UIFullscreenProgressCompletionData *completionData = new UIFullscreenProgressCompletionData(); +#ifdef __PS3__ + completionData->bRequiresUserAction=FALSE; +#else + completionData->bRequiresUserAction=TRUE; +#endif + completionData->bShowBackground=TRUE; + completionData->bShowLogo=TRUE; + completionData->iPad=DEFAULT_XUI_MENU_USER; + if( ui.IsSceneInStack( ProfileManager.GetPrimaryPad(), eUIScene_EndPoem ) ) + { + completionData->type = e_ProgressCompletion_NavigateBackToScene; + completionData->scene = eUIScene_EndPoem; + } + else + { + completionData->type = e_ProgressCompletion_CloseAllPlayersUIScenes; + } + loadingParams->completionData = completionData; + + ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_FullscreenProgress, loadingParams); + } + } + else if( g_NetworkManager.IsLeavingGame() ) + { + // If we are leaving the game, then ignore the state change + SetAction(i,eAppAction_Idle); + } +#if 0 + // 4J-HG - Took this out since ChangeSessionType is only set in two places (both in EthernetDisconnected) and this case is handled there, plus this breaks + // this if statements original purpose (to allow us to wait for IsInGameplay before actioning switching to offline + + // QNet must do this kind of thing automatically by itself, but on PS3 at least, we need the disconnection to definitely end up with us out of the game one way or another, + // and the other two cases above don't catch the case where we are just starting the game and get a disconnection during the loading/creation + else + { + if( g_NetworkManager.IsInSession() ) + { + g_NetworkManager._LeaveGame(); + } + } +#endif + } + break; + case eAppAction_SetDefaultOptions: + SetAction(i,eAppAction_Idle); +#if ( defined __PS3__ || defined __ORBIS__ || defined _DURANGO || defined __PSVITA__) + SetDefaultOptions((C4JStorage::PROFILESETTINGS *)param,i); +#else + SetDefaultOptions((C_4JProfile::PROFILESETTINGS *)param,i); +#endif + + // if the profile data has been changed, then force a profile write + // It seems we're allowed to break the 5 minute rule if it's the result of a user action + CheckGameSettingsChanged(true,i); + + break; + + case eAppAction_RemoteServerSave: + { + // If the remote server save has already finished, don't complete the action + if (GetGameStarted()) + { + SetAction(ProfileManager.GetPrimaryPad(), eAppAction_Idle); + break; + } + + SetAction(i,eAppAction_WaitRemoteServerSaveComplete); + + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + ui.CloseUIScenes(i, true); + } + + // turn off the gamertags in splitscreen for the primary player, since they are about to be made fullscreen + ui.HideAllGameUIElements(); + + LoadingInputParams *loadingParams = new LoadingInputParams(); + loadingParams->func = &CMinecraftApp::RemoteSaveThreadProc; + loadingParams->lpParam = NULL; + + UIFullscreenProgressCompletionData *completionData = new UIFullscreenProgressCompletionData(); + completionData->bRequiresUserAction=FALSE; + completionData->bShowBackground=TRUE; + completionData->bShowLogo=TRUE; + completionData->iPad=DEFAULT_XUI_MENU_USER; + if( ui.IsSceneInStack( ProfileManager.GetPrimaryPad(), eUIScene_EndPoem ) ) + { + completionData->type = e_ProgressCompletion_NavigateBackToScene; + completionData->scene = eUIScene_EndPoem; + } + else + { + completionData->type = e_ProgressCompletion_CloseAllPlayersUIScenes; + } + loadingParams->completionData = completionData; + + loadingParams->cancelFunc = &CMinecraftApp::ExitGameFromRemoteSave; + loadingParams->cancelText = IDS_TOOLTIPS_EXIT; + + ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_FullscreenProgress, loadingParams); + } + break; + case eAppAction_WaitRemoteServerSaveComplete: + // Do nothing + break; + case eAppAction_FailedToJoinNoPrivileges: + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + C4JStorage::EMessageResult result = ui.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; + case eAppAction_ProfileReadError: + // Return player to the main menu - code largely copied from that for handling + // eAppAction_PrimaryPlayerSignedOut, although I don't think we should have got as + // far as needing to halt the server, or running the game, before returning to the menu + if(!app.GetGameStarted()) MinecraftServer::HaltServer(true); + + if( g_NetworkManager.IsInSession() ) + { + app.SetAction(i,eAppAction_PrimaryPlayerSignedOutReturned); + } + else + { + app.SetAction(i,eAppAction_PrimaryPlayerSignedOutReturned_Menus); + MinecraftServer::resetFlags(); + } + break; + + case eAppAction_BanLevel: + { + // It's possible that this state can get set after the game has been exited (e.g. by network disconnection) so we can't ban the level at that point + if(g_NetworkManager.IsInGameplay() && !g_NetworkManager.IsLeavingGame()) + { + TelemetryManager->RecordBanLevel(i); + +#if defined _XBOX + INetworkPlayer *pHost=g_NetworkManager.GetHostPlayer(); + // write the level to the banned level list, and exit the world + AddLevelToBannedLevelList(i,((NetworkPlayerXbox *)pHost)->GetUID(),GetUniqueMapName(),true); +#elif defined _XBOX_ONE + INetworkPlayer *pHost=g_NetworkManager.GetHostPlayer(); + AddLevelToBannedLevelList(i,pHost->GetUID(),GetUniqueMapName(),true); +#endif + // primary player would exit the world, secondary would exit the player + if(ProfileManager.GetPrimaryPad()==i) + { + SetAction(i,eAppAction_ExitWorld); + } + else + { + SetAction(i,eAppAction_ExitPlayer); + } + } + } + break; + case eAppAction_LevelInBanLevelList: + { + UINT uiIDA[2]; + uiIDA[0]=IDS_BUTTON_REMOVE_FROM_BAN_LIST; + uiIDA[1]=IDS_EXIT_GAME; + + // pass in the gamertag format string + WCHAR wchFormat[40]; + INetworkPlayer *player = g_NetworkManager.GetLocalPlayerByUserIndex(i); + + // If not the primary player, but the primary player has banned this level and decided not to unban + // then we may have left the game by now + if(player) + { + swprintf(wchFormat, 40, L"%ls\n\n%%ls",player->GetOnlineName()); + + C4JStorage::EMessageResult result = ui.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 + { + SetAction(i,eAppAction_Idle); + } + } + break; + case eAppAction_DebugText: + // launch the xui for text entry + { +#ifdef _XBOX + CScene_TextEntry::XuiTextInputParams *pDebugTextParams= new CScene_TextEntry::XuiTextInputParams; + pDebugTextParams->iPad=i; + pDebugTextParams->wch=(WCHAR)param; + + app.NavigateToScene(i,eUIScene_TextEntry,pDebugTextParams); +#endif + SetAction(i,eAppAction_Idle); + } + break; + + case eAppAction_ReloadTexturePack: + { + SetAction(i,eAppAction_Idle); + Minecraft *pMinecraft = Minecraft::GetInstance(); + pMinecraft->textures->reloadAll(); + pMinecraft->skins->updateUI(); + + if(!pMinecraft->skins->isUsingDefaultSkin()) + { + TexturePack *pTexturePack = pMinecraft->skins->getSelected(); + + DLCPack *pDLCPack=pTexturePack->getDLCPack(); + + bool purchased = false; + // do we have a license? + if(pDLCPack && pDLCPack->hasPurchasedFile( DLCManager::e_DLCType_Texture, L"" )) + { + purchased = true; + } +#ifdef _XBOX + TelemetryManager->RecordTexturePackLoaded(i, pTexturePack->getId(), purchased?1:0); +#endif + } + + // 4J-PB - If the texture pack has audio, we need to switch to this + if(pMinecraft->skins->getSelected()->hasAudio()) + { + Minecraft::GetInstance()->soundEngine->playStreaming(L"", 0, 0, 0, 1, 1); + } + } + break; + + case eAppAction_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); + + TelemetryManager->RecordUpsellPresented(ProfileManager.GetPrimaryPad(), eSet_UpsellID_Texture_DLC, ullOfferID_Full & 0xFFFFFFFF); +#endif + UINT uiIDA[2]; + + uiIDA[0]=IDS_TEXTUREPACK_FULLVERSION; + uiIDA[1]=IDS_TEXTURE_PACK_TRIALVERSION; + + // Give the player a warning about the texture pack missing + ui.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; + } + } + + // Any TMS actions? + + eTMS = app.GetTMSAction(i); + + if(eTMS!=eTMSAction_Idle) + { + switch(eTMS) + { + // TMS++ actions + case eTMSAction_TMSPP_RetrieveFiles_CreateLoad_SignInReturned: + case eTMSAction_TMSPP_RetrieveFiles_RunPlayGame: +#ifdef _XBOX + app.TMSPP_SetTitleGroupID(GROUP_ID); + SetTMSAction(i,eTMSAction_TMSPP_GlobalFileList); +#elif defined _XBOX_ONE + SetTMSAction(i,eTMSAction_TMSPP_GlobalFileList_Waiting); + app.TMSPP_RetrieveFileList(i,C4JStorage::eGlobalStorage_Title,eTMSAction_TMSPP_UserFileList); +#else + SetTMSAction(i,eTMSAction_TMSPP_UserFileList); +#endif + break; + +#ifdef _XBOX + case eTMSAction_TMSPP_GlobalFileList: + SetTMSAction(i,eTMSAction_TMSPP_GlobalFileList_Waiting); + app.TMSPP_RetrieveFileList(i,C4JStorage::eGlobalStorage_Title,"\\",eTMSAction_TMSPP_UserFileList); + break; +#endif + case eTMSAction_TMSPP_UserFileList: + // retrieve the file list first +#if defined _XBOX + SetTMSAction(i,eTMSAction_TMSPP_UserFileList_Waiting); + app.TMSPP_RetrieveFileList(i,C4JStorage::eGlobalStorage_TitleUser,"\\",eTMSAction_TMSPP_XUIDSFile); +#elif defined _XBOX_ONE + SetTMSAction(i,eTMSAction_TMSPP_UserFileList_Waiting); + app.TMSPP_RetrieveFileList(i,C4JStorage::eGlobalStorage_TitleUser,eTMSAction_TMSPP_DLCFile); +#else + SetTMSAction(i,eTMSAction_TMSPP_XUIDSFile); +#endif + break; + case eTMSAction_TMSPP_XUIDSFile: +#ifdef _XBOX + SetTMSAction(i,eTMSAction_TMSPP_XUIDSFile_Waiting); + // pass in the next app action on the call or callback completing + app.TMSPP_ReadXuidsFile(i,eTMSAction_TMSPP_DLCFile); +#else + SetTMSAction(i,eTMSAction_TMSPP_DLCFile); +#endif + + break; + case eTMSAction_TMSPP_DLCFile: +#if defined _XBOX || defined _XBOX_ONE + SetTMSAction(i,eTMSAction_TMSPP_DLCFile_Waiting); + // pass in the next app action on the call or callback completing + app.TMSPP_ReadDLCFile(i,eTMSAction_TMSPP_BannedListFile); +#else + SetTMSAction(i,eTMSAction_TMSPP_BannedListFile); +#endif + break; + case eTMSAction_TMSPP_BannedListFile: + // If we have one in TMSPP, then we can assume we can ignore TMS +#if defined _XBOX + SetTMSAction(i,eTMSAction_TMSPP_BannedListFile_Waiting); + // pass in the next app action on the call or callback completing + if(app.TMSPP_ReadBannedList(i,eTMSAction_TMS_RetrieveFiles_Complete)==false) + { + // we don't have a banned list in TMSPP, so we should check TMS + app.ReadBannedList(i, eTMSAction_TMS_RetrieveFiles_Complete,true); + } +#elif defined _XBOX_ONE + SetTMSAction(i,eTMSAction_TMSPP_BannedListFile_Waiting); + // pass in the next app action on the call or callback completing + app.TMSPP_ReadBannedList(i,eTMSAction_TMS_RetrieveFiles_Complete); + +#else + SetTMSAction(i,eTMSAction_TMS_RetrieveFiles_Complete); +#endif + break; + + // SPECIAL CASE - where the user goes directly in to Help & Options from the main menu + case eTMSAction_TMSPP_RetrieveFiles_HelpAndOptions: + case eTMSAction_TMSPP_RetrieveFiles_DLCMain: + // retrieve the file list first +#if defined _XBOX + // pass in the next app action on the call or callback completing + SetTMSAction(i,eTMSAction_TMSPP_XUIDSFile_Waiting); + app.TMSPP_RetrieveFileList(i,C4JStorage::eGlobalStorage_Title,"\\",eTMSAction_TMSPP_DLCFileOnly); +#elif defined _XBOX_ONE + SetTMSAction(i,eTMSAction_TMSPP_GlobalFileList_Waiting); + app.TMSPP_RetrieveFileList(i,C4JStorage::eGlobalStorage_Title,eTMSAction_TMSPP_RetrieveUserFilelist_DLCFileOnly); +#else + SetTMSAction(i,eTMSAction_TMSPP_DLCFileOnly); +#endif + break; + case eTMSAction_TMSPP_RetrieveUserFilelist_DLCFileOnly: +#if defined _XBOX + SetTMSAction(i,eTMSAction_TMSPP_UserFileList_Waiting); + app.TMSPP_RetrieveFileList(i,C4JStorage::eGlobalStorage_TitleUser,"\\",eTMSAction_TMSPP_XUIDSFile); +#elif defined _XBOX_ONE + //StorageManager.TMSPP_DeleteFile(i,C4JStorage::eGlobalStorage_TitleUser,C4JStorage::TMS_FILETYPE_BINARY,L"TP06.png",NULL,NULL, 0); + SetTMSAction(i,eTMSAction_TMSPP_UserFileList_Waiting); + app.TMSPP_RetrieveFileList(i,C4JStorage::eGlobalStorage_TitleUser,eTMSAction_TMSPP_DLCFileOnly); +#else + SetTMSAction(i,eTMSAction_TMSPP_DLCFileOnly); +#endif + + break; + + case eTMSAction_TMSPP_DLCFileOnly: +#if defined _XBOX || defined _XBOX_ONE + SetTMSAction(i,eTMSAction_TMSPP_DLCFile_Waiting); + // pass in the next app action on the call or callback completing + app.TMSPP_ReadDLCFile(i,eTMSAction_TMSPP_RetrieveFiles_Complete); +#else + SetTMSAction(i,eTMSAction_TMSPP_RetrieveFiles_Complete); +#endif + break; + + + case eTMSAction_TMSPP_RetrieveFiles_Complete: + SetTMSAction(i,eTMSAction_Idle); + break; + + + // TMS files + /* case eTMSAction_TMS_RetrieveFiles_CreateLoad_SignInReturned: + case eTMSAction_TMS_RetrieveFiles_RunPlayGame: + #ifdef _XBOX + SetTMSAction(i,eTMSAction_TMS_XUIDSFile_Waiting); + // pass in the next app action on the call or callback completing + app.ReadXuidsFileFromTMS(i,eTMSAction_TMS_DLCFile,true); + #else + SetTMSAction(i,eTMSAction_TMS_DLCFile); + #endif + break; + + case eTMSAction_TMS_DLCFile: + #ifdef _XBOX + SetTMSAction(i,eTMSAction_TMS_DLCFile_Waiting); + // pass in the next app action on the call or callback completing + app.ReadDLCFileFromTMS(i,eTMSAction_TMS_BannedListFile,true); + #else + SetTMSAction(i,eTMSAction_TMS_BannedListFile); + #endif + + break; + + case eTMSAction_TMS_RetrieveFiles_HelpAndOptions: + case eTMSAction_TMS_RetrieveFiles_DLCMain: + #ifdef _XBOX + SetTMSAction(i,eTMSAction_TMS_DLCFile_Waiting); + // pass in the next app action on the call or callback completing + app.ReadDLCFileFromTMS(i,eTMSAction_Idle,true); + #else + SetTMSAction(i,eTMSAction_Idle); + #endif + + break; + case eTMSAction_TMS_BannedListFile: + #ifdef _XBOX + SetTMSAction(i,eTMSAction_TMS_BannedListFile_Waiting); + // pass in the next app action on the call or callback completing + app.ReadBannedList(i, eTMSAction_TMS_RetrieveFiles_Complete,true); + #else + SetTMSAction(i,eTMSAction_TMS_RetrieveFiles_Complete); + #endif + + break; + + */ + case eTMSAction_TMS_RetrieveFiles_Complete: + SetTMSAction(i,eTMSAction_Idle); + // if(StorageManager.SetSaveDevice(&CScene_Main::DeviceSelectReturned,pClass)) + // { + // // save device already selected + // // ensure we've applied this player's settings + // app.ApplyGameSettingsChanged(ProfileManager.GetPrimaryPad()); + // app.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_MultiGameJoinLoad); + // } + break; + } + } + + } +} + +int CMinecraftApp::BannedLevelDialogReturned(void *pParam,int iPad,const C4JStorage::EMessageResult result) +{ + CMinecraftApp* pApp = (CMinecraftApp*)pParam; + //Minecraft *pMinecraft=Minecraft::GetInstance(); + + if(result==C4JStorage::EMessage_ResultAccept) + { +#if defined _XBOX || defined _XBOX_ONE + INetworkPlayer *pHost = g_NetworkManager.GetHostPlayer(); + // unban the level + if (pHost != NULL) + { +#if defined _XBOX + pApp->RemoveLevelFromBannedLevelList(iPad,((NetworkPlayerXbox *)pHost)->GetUID(),pApp->GetUniqueMapName()); +#else + pApp->RemoveLevelFromBannedLevelList(iPad,pHost->GetUID(),pApp->GetUniqueMapName()); +#endif + } +#endif + } + else + { + if( iPad == ProfileManager.GetPrimaryPad() ) + { + pApp->SetAction(iPad,eAppAction_ExitWorld); + } + else + { + pApp->SetAction(iPad,eAppAction_ExitPlayer); + } + } + + return 0; +} + +void CMinecraftApp::loadMediaArchive() +{ + wstring mediapath = L""; + +#ifdef __PS3__ + mediapath = L"Common\\Media\\MediaPS3.arc"; +#elif _WINDOWS64 + mediapath = L"Common\\Media\\MediaWindows64.arc"; +#elif __ORBIS__ + mediapath = L"Common\\Media\\MediaOrbis.arc"; +#elif _DURANGO + mediapath = L"Common\\Media\\MediaDurango.arc"; +#elif __PSVITA__ + mediapath = L"Common\\Media\\MediaPSVita.arc"; +#endif + + if (!mediapath.empty()) + { + m_mediaArchive = new ArchiveFile( File(mediapath) ); + } +#if 0 + string path = "Common\\media.arc"; + HANDLE hFile = CreateFile( path.c_str(), + GENERIC_READ, + FILE_SHARE_READ, + NULL, + OPEN_EXISTING, + FILE_FLAG_SEQUENTIAL_SCAN, + NULL ); + + if( hFile != INVALID_HANDLE_VALUE ) + { + File fileHelper(convStringToWstring(path)); + DWORD dwFileSize = fileHelper.length(); + + // Initialize memory. + PBYTE m_fBody = new BYTE[ dwFileSize ]; + ZeroMemory(m_fBody, dwFileSize); + + DWORD m_fSize = 0; + BOOL hr = ReadFile( hFile, + m_fBody, + dwFileSize, + &m_fSize, + NULL ); + + assert( m_fSize == dwFileSize ); + + CloseHandle( hFile ); + + m_mediaArchive = new ArchiveFile(m_fBody, m_fSize); + } + else + { + assert( false ); + // AHHHHHHHHHHHH + m_mediaArchive = NULL; + } +#endif +} + +void CMinecraftApp::loadStringTable() +{ +#ifndef _XBOX + + if(m_stringTable!=NULL) + { + // we need to unload the current string table, this is a reload + delete m_stringTable; + } + wstring localisationFile = L"languages.loc"; + if (m_mediaArchive->hasFile(localisationFile)) + { + byteArray locFile = m_mediaArchive->getFile(localisationFile); + m_stringTable = new StringTable(locFile.data, locFile.length); + delete locFile.data; + } + else + { + m_stringTable = NULL; + assert(false); + // AHHHHHHHHH. + } +#endif +} + +int CMinecraftApp::PrimaryPlayerSignedOutReturned(void *pParam,int iPad,const C4JStorage::EMessageResult) +{ + //CMinecraftApp* pApp = (CMinecraftApp*)pParam; + //Minecraft *pMinecraft=Minecraft::GetInstance(); + + // if the player is null, we're in the menus + //if(Minecraft::GetInstance()->player!=NULL) + + // We always create a session before kicking of any of the game code, so even though we may still be joining/creating a game + // at this point we want to handle it differently from just being in a menu + if( g_NetworkManager.IsInSession() ) + { + app.SetAction(iPad,eAppAction_PrimaryPlayerSignedOutReturned); + } + else + { + app.SetAction(iPad,eAppAction_PrimaryPlayerSignedOutReturned_Menus); + } + return 0; +} + +int CMinecraftApp::EthernetDisconnectReturned(void *pParam,int iPad,const C4JStorage::EMessageResult) +{ + //CMinecraftApp* pApp = (CMinecraftApp*)pParam; + Minecraft *pMinecraft=Minecraft::GetInstance(); + + // if the player is null, we're in the menus + if(Minecraft::GetInstance()->player!=NULL) + { + app.SetAction(pMinecraft->player->GetXboxPad(),eAppAction_EthernetDisconnectedReturned); + } + else + { + // 4J-PB - turn off the PSN store icon just in case this happened when we were in one of the DLC menus +#if defined __ORBIS__ || defined __PSVITA__ + app.GetCommerce()->HidePsStoreIcon(); +#endif + app.SetAction(iPad,eAppAction_EthernetDisconnectedReturned_Menus); + } + return 0; +} + +int CMinecraftApp::SignoutExitWorldThreadProc( void* lpParameter ) +{ + + // Share AABB & Vec3 pools with default (main thread) - should be ok as long as we don't tick the main thread whilst this thread is running + AABB::UseDefaultThreadStorage(); + Vec3::UseDefaultThreadStorage(); + Compression::UseDefaultThreadStorage(); + + //app.SetGameStarted(false); + + Minecraft *pMinecraft=Minecraft::GetInstance(); + + int exitReasonStringId = -1; + + bool saveStats = false; + if (pMinecraft->isClientSide() || g_NetworkManager.IsInSession() ) + { + if(lpParameter != NULL ) + { + switch( app.GetDisconnectReason() ) + { + case DisconnectPacket::eDisconnect_Kicked: + exitReasonStringId = IDS_DISCONNECTED_KICKED; + break; + case DisconnectPacket::eDisconnect_NoUGC_AllLocal: + exitReasonStringId = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_ALL_LOCAL; + break; + case DisconnectPacket::eDisconnect_NoUGC_Single_Local: + exitReasonStringId = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_SINGLE_LOCAL; + break; +#ifdef _XBOX + case DisconnectPacket::eDisconnect_NoUGC_Remote: + exitReasonStringId = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_REMOTE; + break; +#endif + case DisconnectPacket::eDisconnect_NoFlying: + exitReasonStringId = IDS_DISCONNECTED_FLYING; + break; + case DisconnectPacket::eDisconnect_OutdatedServer: + exitReasonStringId = IDS_DISCONNECTED_SERVER_OLD; + break; + case DisconnectPacket::eDisconnect_OutdatedClient: + exitReasonStringId = IDS_DISCONNECTED_CLIENT_OLD; + break; + default: + exitReasonStringId = IDS_DISCONNECTED; + } + pMinecraft->progressRenderer->progressStartNoAbort( exitReasonStringId ); + // 4J - Force a disconnection, this handles the situation that the server has already disconnected + if( pMinecraft->levels[0] != NULL ) pMinecraft->levels[0]->disconnect(false); + if( pMinecraft->levels[1] != NULL ) pMinecraft->levels[1]->disconnect(false); + } + else + { + exitReasonStringId = IDS_EXITING_GAME; + pMinecraft->progressRenderer->progressStartNoAbort( IDS_EXITING_GAME ); + + if( pMinecraft->levels[0] != NULL ) pMinecraft->levels[0]->disconnect(); + if( pMinecraft->levels[1] != NULL ) pMinecraft->levels[1]->disconnect(); + } + + // 4J Stu - This only does something if we actually have a server, so don't need to do any other checks + MinecraftServer::HaltServer(true); + + // We need to call the stats & leaderboards save before we exit the session + //pMinecraft->forceStatsSave(); + saveStats = false; + + // 4J Stu - Leave the session once the disconnect packet has been sent + g_NetworkManager.LeaveGame(FALSE); + } + else + { + if(lpParameter != NULL ) + { + switch( app.GetDisconnectReason() ) + { + case DisconnectPacket::eDisconnect_Kicked: + exitReasonStringId = IDS_DISCONNECTED_KICKED; + break; + case DisconnectPacket::eDisconnect_NoUGC_AllLocal: + exitReasonStringId = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_ALL_LOCAL; + break; + case DisconnectPacket::eDisconnect_NoUGC_Single_Local: + exitReasonStringId = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_SINGLE_LOCAL; + break; +#if defined(__PS3__) || defined(__ORBIS__) || defined (__PSVITA__) + case DisconnectPacket::eDisconnect_ContentRestricted_AllLocal: + exitReasonStringId = IDS_CONTENT_RESTRICTION_MULTIPLAYER; + break; + case DisconnectPacket::eDisconnect_ContentRestricted_Single_Local: + exitReasonStringId = IDS_CONTENT_RESTRICTION; + break; +#endif +#ifdef _XBOX + case DisconnectPacket::eDisconnect_NoUGC_Remote: + exitReasonStringId = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_REMOTE; + break; +#endif + case DisconnectPacket::eDisconnect_OutdatedServer: + exitReasonStringId = IDS_DISCONNECTED_SERVER_OLD; + break; + case DisconnectPacket::eDisconnect_OutdatedClient: + exitReasonStringId = IDS_DISCONNECTED_CLIENT_OLD; + default: + exitReasonStringId = IDS_DISCONNECTED; + } + pMinecraft->progressRenderer->progressStartNoAbort( exitReasonStringId ); + } + } + pMinecraft->setLevel(NULL,exitReasonStringId,nullptr,saveStats,true); + + // 4J-JEV: Fix for #106402 - TCR #014 BAS Debug Output: + // TU12: Mass Effect Mash-UP: Save file "Default_DisplayName" is created on all storage devices after signing out from a re-launched pre-generated world + app.m_gameRules.unloadCurrentGameRules(); // + + MinecraftServer::resetFlags(); + + // We can't start/join a new game until the session is destroyed, so wait for it to be idle again + while( g_NetworkManager.IsInSession() ) + { + Sleep(1); + } + + return S_OK; +} + +int CMinecraftApp::UnlockFullInviteReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + //CMinecraftApp* pApp = (CMinecraftApp*)pParam; + Minecraft *pMinecraft=Minecraft::GetInstance(); + bool bNoPlayer; + + // bug 11285 - TCR 001: BAS Game Stability: CRASH - When trying to join a full version game with a trial version, the trial crashes + // 4J-PB - we may be in the main menus here, and we don't have a pMinecraft->player + + if(pMinecraft->player==NULL) + { + bNoPlayer=true; + } + + if(result==C4JStorage::EMessage_ResultAccept) + { + if(ProfileManager.IsSignedInLive(iPad)) + { + // 4J-PB - need to check this user can access the store +#if defined(__PS3__) || defined(__PSVITA__) + bool bContentRestricted; + ProfileManager.GetChatAndContentRestrictions(ProfileManager.GetPrimaryPad(),true,NULL,&bContentRestricted,NULL); + if(bContentRestricted) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad()); + } + else +#endif + { + ProfileManager.DisplayFullVersionPurchase(false,iPad,eSen_UpsellID_Full_Version_Of_Game); + } + } +#if defined(__PS3__) + else + { + // you're not signed in to PSN! + UINT uiIDA[2]; + uiIDA[0]=IDS_PRO_NOTONLINE_ACCEPT; + uiIDA[1]=IDS_PRO_NOTONLINE_DECLINE; + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&CMinecraftApp::MustSignInFullVersionPurchaseReturned,&app); + + } +#endif + } + else + { + TelemetryManager->RecordUpsellResponded(iPad, eSen_UpsellID_Full_Version_Of_Game, app.m_dwOfferID, eSen_UpsellOutcome_Declined); + } + + return 0; +} + +int CMinecraftApp::UnlockFullSaveReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + //CMinecraftApp* pApp = (CMinecraftApp*)pParam; + Minecraft *pMinecraft=Minecraft::GetInstance(); + + if(result==C4JStorage::EMessage_ResultAccept) + { + if(ProfileManager.IsSignedInLive(pMinecraft->player->GetXboxPad())) + { + // 4J-PB - need to check this user can access the store +#if defined(__PS3__) || defined(__PSVITA__) + bool bContentRestricted; + ProfileManager.GetChatAndContentRestrictions(ProfileManager.GetPrimaryPad(),true,NULL,&bContentRestricted,NULL); + if(bContentRestricted) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad()); + } + else +#endif + { + ProfileManager.DisplayFullVersionPurchase(false,pMinecraft->player->GetXboxPad(),eSen_UpsellID_Full_Version_Of_Game); + } + } +#if defined(__PS3__) + else + { + // you're not signed in to PSN! + UINT uiIDA[2]; + uiIDA[0]=IDS_PRO_NOTONLINE_ACCEPT; + uiIDA[1]=IDS_PRO_NOTONLINE_DECLINE; + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&CMinecraftApp::MustSignInFullVersionPurchaseReturned,&app); + } +#elif defined(__ORBIS__) + else + { + // Determine why they're not "signed in live" + if (ProfileManager.isSignedInPSN(iPad)) + { + // Signed in to PSN but not connected (no internet access) + assert(!ProfileManager.isConnectedToPSN(iPad)); + + UINT uiIDA[1]; + uiIDA[0] = IDS_OK; + ui.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.RequestAlertMessage( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, iPad, &CMinecraftApp::MustSignInFullVersionPurchaseReturned,&app); + } + } +#endif + } + else + { + TelemetryManager->RecordUpsellResponded(iPad, eSen_UpsellID_Full_Version_Of_Game, app.m_dwOfferID, eSen_UpsellOutcome_Declined); + } + + return 0; +} + +int CMinecraftApp::UnlockFullExitReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + CMinecraftApp* pApp = (CMinecraftApp*)pParam; + Minecraft *pMinecraft=Minecraft::GetInstance(); + + if(result==C4JStorage::EMessage_ResultAccept) + { + if(ProfileManager.IsSignedInLive(pMinecraft->player->GetXboxPad())) + { + // 4J-PB - need to check this user can access the store +#if defined(__PS3__) || defined(__PSVITA__) + bool bContentRestricted; + ProfileManager.GetChatAndContentRestrictions(ProfileManager.GetPrimaryPad(),true,NULL,&bContentRestricted,NULL); + if(bContentRestricted) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad()); + } + else +#endif + { + ProfileManager.DisplayFullVersionPurchase(false,pMinecraft->player->GetXboxPad(),eSen_UpsellID_Full_Version_Of_Game); +#if defined __ORBIS__ || defined __PS3__ || defined __PSVITA__ + // still need to exit the trial or we'll be in the Pause menu with input ignored + pApp->SetAction(pMinecraft->player->GetXboxPad(),eAppAction_ExitWorldTrial); +#endif + } + } +#if defined(__PS3__) || defined __PSVITA__ + else + { + // you're not signed in to PSN! + UINT uiIDA[2]; + uiIDA[0]=IDS_PRO_NOTONLINE_ACCEPT; + uiIDA[1]=IDS_PRO_NOTONLINE_DECLINE; + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&CMinecraftApp::MustSignInFullVersionPurchaseReturnedExitTrial,&app); + } +#elif defined(__ORBIS__) + else + { + // Determine why they're not "signed in live" + if (ProfileManager.isSignedInPSN(iPad)) + { + // Signed in to PSN but not connected (no internet access) + assert(!ProfileManager.isConnectedToPSN(iPad)); + + UINT uiIDA[1]; + uiIDA[0] = IDS_OK; + ui.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); + } + else + { + // Not signed in to PSN + UINT uiIDA[1]; + uiIDA[0] = IDS_PRO_NOTONLINE_ACCEPT; + ui.RequestAlertMessage( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, iPad, &CMinecraftApp::MustSignInFullVersionPurchaseReturnedExitTrial,&app); + } + } +#endif + } + else + { + TelemetryManager->RecordUpsellResponded(iPad, eSen_UpsellID_Full_Version_Of_Game, app.m_dwOfferID, eSen_UpsellOutcome_Declined); + pApp->SetAction(pMinecraft->player->GetXboxPad(),eAppAction_ExitWorldTrial); + } + + return 0; +} + +int CMinecraftApp::TrialOverReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + CMinecraftApp* pApp = (CMinecraftApp*)pParam; + Minecraft *pMinecraft=Minecraft::GetInstance(); + + if(result==C4JStorage::EMessage_ResultAccept) + { + // we need a signed in user for the unlock + if(ProfileManager.IsSignedInLive(pMinecraft->player->GetXboxPad())) + { + // 4J-PB - need to check this user can access the store +#if defined(__PS3__) || defined(__PSVITA__) + bool bContentRestricted; + ProfileManager.GetChatAndContentRestrictions(ProfileManager.GetPrimaryPad(),true,NULL,&bContentRestricted,NULL); + if(bContentRestricted) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad()); + } + else +#endif + { + ProfileManager.DisplayFullVersionPurchase(false,pMinecraft->player->GetXboxPad(),eSen_UpsellID_Full_Version_Of_Game); + } + } + else + { +#if defined(__PS3__) + + // you're not signed in to PSN! + UINT uiIDA[2]; + uiIDA[0]=IDS_PRO_NOTONLINE_ACCEPT; + uiIDA[1]=IDS_PRO_NOTONLINE_DECLINE; + ui.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); +#else + pApp->SetAction(pMinecraft->player->GetXboxPad(),eAppAction_ExitTrial); +#endif + } + } + else + { + TelemetryManager->RecordUpsellResponded(iPad, eSen_UpsellID_Full_Version_Of_Game, app.m_dwOfferID, eSen_UpsellOutcome_Declined); + +#if defined(__PS3__) || defined(__ORBIS__) + // 4J Stu - We can't actually exit the game, so just exit back to the main menu + pApp->SetAction(pMinecraft->player->GetXboxPad(),eAppAction_ExitWorldTrial); +#else + pApp->SetAction(pMinecraft->player->GetXboxPad(),eAppAction_ExitTrial); +#endif + } + + return 0; +} + +void CMinecraftApp::ProfileReadErrorCallback(void *pParam) +{ + CMinecraftApp *pApp=(CMinecraftApp *)pParam; + int iPrimaryPlayer=ProfileManager.GetPrimaryPad(); + pApp->SetAction(iPrimaryPlayer, eAppAction_ProfileReadError); +} + +void CMinecraftApp::ClearSignInChangeUsersMask() +{ + // 4J-PB - When in the main menu, the user is on pad 0, and any change they make to their profile will be to pad 0 data + // If they then go in as a secondary player to a splitscreen game, their profile will not be read again on pad 1 if they were previously in a splitscreen game + // This is because m_uiLastSignInData remembers they were in previously, and doesn't read the profile data for them again + // Fix this by resetting the m_uiLastSignInData on pressing play game for secondary users. The Primary user does a read profile on play game anyway + int iPrimaryPlayer=ProfileManager.GetPrimaryPad(); + + if(m_uiLastSignInData!=0) + { + if(iPrimaryPlayer>=0) + { + m_uiLastSignInData=1<user->name = convStringToWstring( ProfileManager.GetGamertag(ProfileManager.GetPrimaryPad())); +#endif + + CMinecraftApp *pApp=(CMinecraftApp *)pParam; + // check if the primary player signed out + int iPrimaryPlayer=ProfileManager.GetPrimaryPad(); + + if((ProfileManager.GetLockedProfile()!=-1) && iPrimaryPlayer!=-1) + { + if ( ((uiSignInData & (1<SetAction(iPrimaryPlayer,eAppAction_PrimaryPlayerSignedOut); + + // 4J-PB - invalidate their banned level list + pApp->InvalidateBannedList(iPrimaryPlayer); + + // need to ditch any DLCOffers info + StorageManager.ClearDLCOffers(); + pApp->ClearAndResetDLCDownloadQueue(); + pApp->ClearDLCInstalled(); + } + else + { + unsigned int uiChangedPlayers = uiSignInData ^ m_uiLastSignInData; + + if( g_NetworkManager.IsInSession() ) + { + bool hasGuestIdChanged = false; + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + DWORD guestNumber = 0; + if(ProfileManager.IsSignedIn(i)) + { + XUSER_SIGNIN_INFO info; + XUserGetSigninInfo(i,XUSER_GET_SIGNIN_INFO_OFFLINE_XUID_ONLY ,&info); + pApp->DebugPrintf("Player at index %d has guest number %d\n", i,info.dwGuestNumber ); + guestNumber = info.dwGuestNumber; + } + if( pApp->m_currentSigninInfo[i].dwGuestNumber != 0 && guestNumber != 0 && pApp->m_currentSigninInfo[i].dwGuestNumber != guestNumber ) + { + hasGuestIdChanged = true; + } + } + + if( hasGuestIdChanged ) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.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 + // we are going to switch to an offline game as it will likely crash due to incompatible parallel processes + bool switchToOffline = false; + // If it's an online game, and the primary profile is no longer signed into LIVE then we act as if disconnected + if( !ProfileManager.IsSignedInLive( ProfileManager.GetLockedProfile() ) && !g_NetworkManager.IsLocalGame() ) + { + switchToOffline = true; + } + + //printf("Old: %x, New: %x, Changed: %x\n", m_ulLastSignInData, ulSignInData, changedPlayers); + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + // Primary player shouldn't be subjected to these checks, and shouldn't call ExitPlayer + if(i == iPrimaryPlayer) continue; + + // A guest a signed in or out, out of order which invalidates all the guest players we have in the game + if(hasGuestIdChanged && pApp->m_currentSigninInfo[i].dwGuestNumber != 0 && g_NetworkManager.GetLocalPlayerByUserIndex(i)!=NULL) + { + pApp->DebugPrintf("Recommending removal of player at index %d because their guest id changed\n",i); + pApp->SetAction(i, eAppAction_ExitPlayer); + } + else + { + XUSER_SIGNIN_INFO info; + XUserGetSigninInfo(i,XUSER_GET_SIGNIN_INFO_OFFLINE_XUID_ONLY ,&info); + // 4J Stu - Also need to detect the case where the sign in mask is the same, but the player has swapped users (eg still signed in but xuid different) + // Fix for #48451 - TU5: Code: UI: Splitscreen: Title crashes when switching to a profile previously signed out via splitscreen profile selection + + // 4J-PB - compiler complained about if below ('&&' within '||') - making it easier to read + bool bPlayerChanged=(uiChangedPlayers&(1<m_currentSigninInfo[i].xuid, info.xuid) ) )) + { + // 4J-PB - invalidate their banned level list + pApp->DebugPrintf("Player at index %d Left - invalidating their banned list\n",i); + pApp->InvalidateBannedList(i); + + // 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); + } + } + } +#ifdef __ORBIS__ + // check if any of the addition players have signed out of PSN (primary player is handled below) + if(!switchToOffline && i != ProfileManager.GetLockedProfile() && !g_NetworkManager.IsLocalGame()) + { + if(g_NetworkManager.GetLocalPlayerByUserIndex(i)!=NULL) + { + if(ProfileManager.IsSignedInLive(i) == false) + { + pApp->DebugPrintf("Recommending removal of player at index %d because they're no longer signed into PSNd\n",i); + pApp->SetAction(i,eAppAction_ExitPlayer); + } + } + } +#endif + } + + // If it's an online game, and the primary profile is no longer signed into LIVE then we act as if disconnected + if( switchToOffline ) + { + pApp->SetAction(iPrimaryPlayer,eAppAction_EthernetDisconnected); + } + + + g_NetworkManager.HandleSignInChange(); + } + // Some menus require the player to be signed in to live, so if this callback happens and the primary player is + // no longer signed in then nav back + else if ( pApp->GetLiveLinkRequired() && !ProfileManager.IsSignedInLive( ProfileManager.GetLockedProfile() ) ) + { +#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. + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + if( i != iPrimaryPlayer + && ( uiChangedPlayers & (1<InvalidateBannedList(iPrimaryPlayer); + + // need to ditch any DLCOffers info + StorageManager.ClearDLCOffers(); + pApp->ClearAndResetDLCDownloadQueue(); + pApp->ClearDLCInstalled(); + + } + + // Update the guest numbers to the current state + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + if(FAILED(XUserGetSigninInfo(i,XUSER_GET_SIGNIN_INFO_OFFLINE_XUID_ONLY,&pApp->m_currentSigninInfo[i]))) + { + pApp->m_currentSigninInfo[i].xuid = INVALID_XUID; + pApp->m_currentSigninInfo[i].dwGuestNumber = 0; + } + app.DebugPrintf("Player at index %d has guest number %d\n", i,pApp->m_currentSigninInfo[i].dwGuestNumber ); + } +} + +void CMinecraftApp::NotificationsCallback(LPVOID pParam,DWORD dwNotification, unsigned int uiParam) +{ + CMinecraftApp* pClass = (CMinecraftApp*)pParam; + + // push these on to the notifications to be handled in qnet's dowork + + PNOTIFICATION pNotification = new NOTIFICATION; + + pNotification->dwNotification=dwNotification; + pNotification->uiParam=uiParam; + + switch( dwNotification ) + { + case XN_SYS_SIGNINCHANGED: + { + pClass->DebugPrintf("Signing changed - %d\n", uiParam ); + } + break; + case XN_SYS_INPUTDEVICESCHANGED: + if(app.GetGameStarted() && g_NetworkManager.IsInSession()) + { + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + if(!InputManager.IsPadConnected(i) && + Minecraft::GetInstance()->localplayers[i] != NULL && + !ui.IsPauseMenuDisplayed(i) && !ui.IsSceneInStack(i, eUIScene_EndPoem) ) + { + ui.CloseUIScenes(i); + ui.NavigateToScene(i,eUIScene_PauseMenu); + } + } + } + break; + case XN_LIVE_CONTENT_INSTALLED: + // Need to inform xuis that we've possibly had DLC installed + { + //app.m_dlcManager.SetNeedsUpdated(true); + // Clear the DLC installed flag to cause a GetDLC to run if it's called + app.ClearDLCInstalled(); + + ui.HandleDLCInstalled(ProfileManager.GetPrimaryPad()); + } + break; + case XN_SYS_STORAGEDEVICESCHANGED: + { +#ifdef _XBOX + // If the devices have changed, and we've got a dlc pack with audio selected, and that pack's content device is no longer valid... then pull the plug on + // audio streaming, as if we leave this until later xact gets locked up attempting to destroy the streamed wave bank. + TexturePack *pTexPack=Minecraft::GetInstance()->skins->getSelected(); + if(pTexPack->hasAudio()) + { + DLCTexturePack *pDLCTexPack=(DLCTexturePack *)pTexPack; + XCONTENTDEVICEID deviceID = pDLCTexPack->GetDLCDeviceID(); + if( XContentGetDeviceState( deviceID, NULL ) != ERROR_SUCCESS ) + { + // Set texture pack flag so that it is now considered as not having audio - this is critical so that the next playStreaming does what it is meant to do, + // and also so that we don't try and unmount this again, or play any sounds from it in the future + pTexPack->setHasAudio(false); + // need to stop the streaming audio - by playing streaming audio from the default texture pack now + Minecraft::GetInstance()->soundEngine->playStreaming(L"", 0, 0, 0, 0, 0); + + if(pDLCTexPack->m_pStreamedWaveBank!=NULL) + { + pDLCTexPack->m_pStreamedWaveBank->Destroy(); + } + if(pDLCTexPack->m_pSoundBank!=NULL) + { + pDLCTexPack->m_pSoundBank->Destroy(); + } + DWORD result = StorageManager.UnmountInstalledDLC("TPACK"); + app.DebugPrintf("Unmount result is %d\n",result); + } + } +#endif + } + break; + } + + pClass->m_vNotifications.push_back(pNotification); +} + +#if defined __PS3__ || defined __PSVITA__ || defined __ORBIS__ +int CMinecraftApp::MustSignInFullVersionPurchaseReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + if(result==C4JStorage::EMessage_ResultAccept) + { +#ifdef __PS3__ + SQRNetworkManager_PS3::AttemptPSNSignIn(&CMinecraftApp::NowDisplayFullVersionPurchase, &app,true); +#elif defined __PSVITA__ + SQRNetworkManager_Vita::AttemptPSNSignIn(&CMinecraftApp::NowDisplayFullVersionPurchase, &app,true); +#else // __PS4__ + SQRNetworkManager_Orbis::AttemptPSNSignIn(&CMinecraftApp::NowDisplayFullVersionPurchase, &app,true); +#endif + } + + return 0; +} + +#if defined __PS3__ || defined __PSVITA__ || defined __ORBIS__ +int CMinecraftApp::MustSignInFullVersionPurchaseReturnedExitTrial(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + if(result==C4JStorage::EMessage_ResultAccept) + { +#ifdef __PS3__ + SQRNetworkManager_PS3::AttemptPSNSignIn(&CMinecraftApp::NowDisplayFullVersionPurchase, &app,true); +#elif defined __PSVITA__ + SQRNetworkManager_Vita::AttemptPSNSignIn(&CMinecraftApp::NowDisplayFullVersionPurchase, &app,true); +#else // __PS4__ + SQRNetworkManager_Orbis::AttemptPSNSignIn(&CMinecraftApp::NowDisplayFullVersionPurchase, &app,true); +#endif + } + + //4J-PB - we need to exit the trial, or we'll be in the pause menu with ignore input true + app.SetAction(iPad,eAppAction_ExitWorldTrial); + + return 0; +} +#endif + +int CMinecraftApp::NowDisplayFullVersionPurchase(void *pParam, bool bContinue, int iPad) +{ + app.m_bDisplayFullVersionPurchase=true; + return 0; +} +#endif +void CMinecraftApp::UpsellReturnedCallback(LPVOID pParam, eUpsellType type, eUpsellResponse result, int iUserData) +{ + ESen_UpsellID senType; + ESen_UpsellOutcome senResponse; +#ifdef __PS3__ + UINT uiIDA[2]; +#endif + + // Map the eUpsellResponse to the enum we use for sentient + switch(result) + { + case eUpsellResponse_Accepted_NoPurchase: + senResponse = eSen_UpsellOutcome_Went_To_Guide; + break; + case eUpsellResponse_Accepted_Purchase: + senResponse = eSen_UpsellOutcome_Accepted; + break; +#ifdef __PS3__ + // special case for people who are not signed in to the PSN while playing the trial game + case eUpsellResponse_UserNotSignedInPSN: + + uiIDA[0]=IDS_PRO_NOTONLINE_ACCEPT; + uiIDA[1]=IDS_PRO_NOTONLINE_DECLINE; + ui.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.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad()); + break; +#endif + case eUpsellResponse_Declined: + default: + senResponse = eSen_UpsellOutcome_Declined; + break; + }; + + // Map the eUpsellType to the enum we use for sentient + switch(type) + { + case eUpsellType_Custom: + senType = eSen_UpsellID_Full_Version_Of_Game; + break; + default: + senType = eSen_UpsellID_Undefined; + break; + }; + + // Always the primary pad that gets an upsell + TelemetryManager->RecordUpsellResponded(ProfileManager.GetPrimaryPad(), eSen_UpsellID_Full_Version_Of_Game, app.m_dwOfferID, senResponse); +} + +#ifdef _DEBUG_MENUS_ENABLED +bool CMinecraftApp::DebugArtToolsOn() +{ + return DebugSettingsOn() && (GetGameSettingsDebugMask(ProfileManager.GetPrimaryPad())&(1L<m_bDebugOptions=!pClass->m_bDebugOptions; + + for(int i=0;ilocalplayers[i] != NULL) + { + iPlayerC++; + } + } + + return iPlayerC; +} + +int CMinecraftApp::MarketplaceCountsCallback(LPVOID pParam,C4JStorage::DLC_TMS_DETAILS *pTMSDetails, int iPad) +{ + app.DebugPrintf("Marketplace Counts= New - %d Total - %d\n",pTMSDetails->dwNewOffers,pTMSDetails->dwTotalOffers); + + if(pTMSDetails->dwNewOffers>0) + { + app.m_bNewDLCAvailable=true; + app.m_bSeenNewDLCTip=false; + } + else + { + app.m_bNewDLCAvailable=false; + app.m_bSeenNewDLCTip=true; + } + + return 0; +} + +bool CMinecraftApp::StartInstallDLCProcess(int iPad) +{ + app.DebugPrintf("--- CMinecraftApp::StartInstallDLCProcess: pad=%i.\n", iPad); + + // If there is already a call to this in progress, then do nothing + // If the app says dlc is installed, then there has been no new system message to tell us there's new DLC since the last call to StartInstallDLCProcess + if((app.DLCInstallProcessCompleted()==false) && (m_bDLCInstallPending==false)) + { + app.m_dlcManager.resetUnnamedCorruptCount(); + m_bDLCInstallPending = true; + m_iTotalDLC = 0; + m_iTotalDLCInstalled = 0; + app.DebugPrintf("--- CMinecraftApp::StartInstallDLCProcess - StorageManager.GetInstalledDLC\n"); + + StorageManager.GetInstalledDLC(iPad,&CMinecraftApp::DLCInstalledCallback,this); + return true; + } + else + { + app.DebugPrintf("--- CMinecraftApp::StartInstallDLCProcess - nothing to do\n"); + + return false; + } + +} + +// Installed DLC callback +int CMinecraftApp::DLCInstalledCallback(LPVOID pParam,int iInstalledC,int iPad) +{ + app.DebugPrintf("--- CMinecraftApp::DLCInstalledCallback: totalDLC=%i, pad=%i.\n", iInstalledC, iPad); + app.m_iTotalDLC = iInstalledC; + app.MountNextDLC(iPad); + return 0; +} + +void CMinecraftApp::MountNextDLC(int iPad) +{ + app.DebugPrintf("--- CMinecraftApp::MountNextDLC: pad=%i.\n", iPad); + if(m_iTotalDLCInstalled < m_iTotalDLC) + { + // Mount it + // We also need to match the ones the user wants to mount with the installed DLC + // We're supposed to use a generic save game as a cache of these to do this, with XUSER_ANY + + if(StorageManager.MountInstalledDLC(iPad,m_iTotalDLCInstalled,&CMinecraftApp::DLCMountedCallback,this)!=ERROR_IO_PENDING ) + { + // corrupt DLC + app.DebugPrintf("Failed to mount DLC %d for pad %d\n",m_iTotalDLCInstalled,iPad); + ++m_iTotalDLCInstalled; + app.MountNextDLC(iPad); + } + else + { + app.DebugPrintf("StorageManager.MountInstalledDLC ok\n"); + } + } + else + { + /* Removed - now loading these on demand instead of as each pack is mounted + if(m_iTotalDLCInstalled > 0) + { + Minecraft *pMinecraft=Minecraft::GetInstance(); + pMinecraft->levelRenderer->AddDLCSkinsToMemTextures(); + } + */ + + m_bDLCInstallPending = false; + m_bDLCInstallProcessCompleted=true; + + ui.HandleDLCMountingComplete(); + +#if defined(_XBOX_ONE) || defined(__ORBIS__) + // Check if the current texture pack is now installed + if(!Minecraft::GetInstance()->skins->isUsingDefaultSkin()) + { + TexturePack *tPack = Minecraft::GetInstance()->skins->getSelected(); + DLCTexturePack *pDLCTexPack=(DLCTexturePack *)tPack; + + DLCPack *pParentPack=pDLCTexPack->getDLCInfoParentPack();//tPack->getDLCPack(); + + if(pParentPack->hasPurchasedFile( DLCManager::e_DLCType_Texture, L"" )) + { + StorageManager.SetSaveDisabled(false); + } + } +#endif +#if defined __PS3__ || defined __ORBIS__ || defined __PSVITA__ + { + TexturePack* currentTPack = Minecraft::GetInstance()->skins->getSelected(); + TexturePack* requiredTPack = Minecraft::GetInstance()->skins->getTexturePackById(app.GetRequiredTexturePackID()); + if(currentTPack != requiredTPack) + { + Minecraft::GetInstance()->skins->selectTexturePackById(app.GetRequiredTexturePackID()); + } + } +#endif + } +} + +// 4J-JEV: For the sake of clarity in DLCMountedCallback. +#if defined(_XBOX) || defined(__PS3__) || defined(_WINDOWS64) +#define CONTENT_DATA_DISPLAY_NAME(a) (a.szDisplayName) +#else +#define CONTENT_DATA_DISPLAY_NAME(a) (a.wszDisplayName) +#endif + +int CMinecraftApp::DLCMountedCallback(LPVOID pParam,int iPad,DWORD dwErr,DWORD dwLicenceMask) +{ +#if defined(_XBOX) || defined(_DURANGO) || defined(__PS3__) || defined(__ORBIS__) || defined(_WINDOWS64) || defined (__PSVITA__) //Chris TODO + app.DebugPrintf("--- CMinecraftApp::DLCMountedCallback\n"); + + if(dwErr!=ERROR_SUCCESS) + { + // corrupt DLC + app.DebugPrintf("Failed to mount DLC for pad %d: %d\n",iPad,dwErr); + app.m_dlcManager.incrementUnnamedCorruptCount(); + } + else + { + XCONTENT_DATA ContentData = StorageManager.GetDLC(app.m_iTotalDLCInstalled); + + DLCPack *pack = app.m_dlcManager.getPack( CONTENT_DATA_DISPLAY_NAME(ContentData) ); + + if( pack != NULL && pack->IsCorrupt() ) + { + app.DebugPrintf("Pack '%ls' is corrupt, removing it from the DLC Manager.\n", CONTENT_DATA_DISPLAY_NAME(ContentData)); + + app.m_dlcManager.removePack(pack); + pack = NULL; + } + + if(pack == NULL) + { + app.DebugPrintf("Pack \"%ls\" is not installed, so adding it\n", CONTENT_DATA_DISPLAY_NAME(ContentData)); + +#if defined(_XBOX) || defined(__PS3__) || defined(_WINDOWS64) + pack = new DLCPack(ContentData.szDisplayName,dwLicenceMask); +#elif defined _XBOX_ONE + pack = new DLCPack(ContentData.wszDisplayName,ContentData.wszProductID,dwLicenceMask); +#else + pack = new DLCPack(ContentData.wszDisplayName,dwLicenceMask); +#endif + pack->SetDLCMountIndex(app.m_iTotalDLCInstalled); + pack->SetDLCDeviceID(ContentData.DeviceID); + app.m_dlcManager.addPack(pack); + + app.HandleDLC(pack); + + if(pack->getDLCItemsCount(DLCManager::e_DLCType_Texture) > 0) + { + Minecraft::GetInstance()->skins->addTexturePackFromDLC(pack, pack->GetPackId() ); + } + } + else + { + app.DebugPrintf("Pack \"%ls\" is already installed. Updating license to %d\n", CONTENT_DATA_DISPLAY_NAME(ContentData), dwLicenceMask); + + pack->SetDLCMountIndex(app.m_iTotalDLCInstalled); + pack->SetDLCDeviceID(ContentData.DeviceID); + pack->updateLicenseMask(dwLicenceMask); + } + + StorageManager.UnmountInstalledDLC(); + } + ++app.m_iTotalDLCInstalled; + app.MountNextDLC(iPad); + +#endif // __PSVITA__ + return 0; +} +#undef CONTENT_DATA_DISPLAY_NAME + +// void CMinecraftApp::InstallDefaultCape() +// { +// if(!m_bDefaultCapeInstallAttempted) +// { +// // we only attempt to install the cape once per launch of the game +// m_bDefaultCapeInstallAttempted=true; +// +// wstring wTemp=L"Default_Cape.png"; +// bool bRes=app.IsFileInMemoryTextures(wTemp); +// // if the file is not already in the memory textures, then read it from TMS +// if(!bRes) +// { +// BYTE *pBuffer=NULL; +// DWORD dwSize=0; +// // 4J-PB - out for now for DaveK so he doesn't get the birthday cape +// #ifdef _CONTENT_PACKAGE +// C4JStorage::ETMSStatus eTMSStatus; +// eTMSStatus=StorageManager.ReadTMSFile(ProfileManager.GetPrimaryPad(),C4JStorage::eGlobalStorage_Title,C4JStorage::eTMS_FileType_Graphic, L"Default_Cape.png",&pBuffer, &dwSize); +// if(eTMSStatus==C4JStorage::ETMSStatus_Idle) +// { +// app.AddMemoryTextureFile(wTemp,pBuffer,dwSize); +// } +// #endif +// } +// } +// } + +void CMinecraftApp::HandleDLC(DLCPack *pack) +{ + DWORD dwFilesProcessed = 0; +#ifndef _XBOX +#if defined(__PS3__) || defined(__ORBIS__) || defined(_WINDOWS64) || defined (__PSVITA__) + std::vector dlcFilenames; +#elif defined _DURANGO + std::vector dlcFilenames; +#endif + StorageManager.GetMountedDLCFileList("DLCDrive", dlcFilenames); +#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; ieXuid==eXUID_Deadmau5) + { + return true; + } + } + + return false; +} + +void CMinecraftApp::AddMemoryTextureFile(const wstring &wName,PBYTE pbData,DWORD dwBytes) +{ + EnterCriticalSection(&csMemFilesLock); + // check it's not already in + PMEMDATA pData=NULL; + AUTO_VAR(it, m_MEM_Files.find(wName)); + if(it != m_MEM_Files.end()) + { +#ifndef _CONTENT_PACKAGE + wprintf(L"Incrementing the memory texture file count for %ls\n", wName.c_str()); +#endif + pData = (*it).second; + + if(pData->dwBytes == 0 && dwBytes != 0) + { + // This should never be NULL if dwBytes is 0 + if(pData->pbData!=NULL) delete [] pData->pbData; + + pData->pbData=pbData; + pData->dwBytes=dwBytes; + } + + ++pData->ucRefCount; + LeaveCriticalSection(&csMemFilesLock); + return; + } + +#ifndef _CONTENT_PACKAGE + //wprintf(L"Adding the memory texture file data for %ls\n", wName.c_str()); +#endif + // this is a texture (png) file + + // add this texture to the list of memory texture files - it will then be picked up by the level renderer's AddEntity + + pData = (PMEMDATA)new BYTE[sizeof(MEMDATA)]; + ZeroMemory( pData, sizeof(MEMDATA) ); + pData->pbData=pbData; + pData->dwBytes=dwBytes; + pData->ucRefCount = 1; + + // use the xuid to access the skin data + m_MEM_Files[wName]=pData; + + LeaveCriticalSection(&csMemFilesLock); +} + +void CMinecraftApp::RemoveMemoryTextureFile(const wstring &wName) +{ + EnterCriticalSection(&csMemFilesLock); + + AUTO_VAR(it, m_MEM_Files.find(wName)); + if(it != m_MEM_Files.end()) + { +#ifndef _CONTENT_PACKAGE + wprintf(L"Decrementing the memory texture file count for %ls\n", wName.c_str()); +#endif + PMEMDATA pData = (*it).second; + --pData->ucRefCount; + if(pData->ucRefCount <= 0) + { +#ifndef _CONTENT_PACKAGE + wprintf(L"Erasing the memory texture file data for %ls\n", wName.c_str()); +#endif + delete [] pData; + m_MEM_Files.erase(wName); + } + } + LeaveCriticalSection(&csMemFilesLock); +} + +bool CMinecraftApp::DefaultCapeExists() +{ + wstring wTex=L"Special_Cape.png"; + bool val = false; + + EnterCriticalSection(&csMemFilesLock); + AUTO_VAR(it, m_MEM_Files.find(wTex)); + if(it != m_MEM_Files.end()) val = true; + LeaveCriticalSection(&csMemFilesLock); + + return val; +} + +bool CMinecraftApp::IsFileInMemoryTextures(const wstring &wName) +{ + bool val = false; + + EnterCriticalSection(&csMemFilesLock); + AUTO_VAR(it, m_MEM_Files.find(wName)); + if(it != m_MEM_Files.end()) val = true; + LeaveCriticalSection(&csMemFilesLock); + + return val; +} + +void CMinecraftApp::GetMemFileDetails(const wstring &wName,PBYTE *ppbData,DWORD *pdwBytes) +{ + EnterCriticalSection(&csMemFilesLock); + AUTO_VAR(it, m_MEM_Files.find(wName)); + if(it != m_MEM_Files.end()) + { + PMEMDATA pData = (*it).second; + *ppbData=pData->pbData; + *pdwBytes=pData->dwBytes; + } + LeaveCriticalSection(&csMemFilesLock); +} + +void CMinecraftApp::AddMemoryTPDFile(int iConfig,PBYTE pbData,DWORD dwBytes) +{ + EnterCriticalSection(&csMemTPDLock); + // check it's not already in + PMEMDATA pData=NULL; + AUTO_VAR(it, m_MEM_TPD.find(iConfig)); + if(it == m_MEM_TPD.end()) + { + pData = (PMEMDATA)new BYTE[sizeof(MEMDATA)]; + ZeroMemory( pData, sizeof(MEMDATA) ); + pData->pbData=pbData; + pData->dwBytes=dwBytes; + pData->ucRefCount = 1; + + m_MEM_TPD[iConfig]=pData; + } + + LeaveCriticalSection(&csMemTPDLock); +} + +void CMinecraftApp::RemoveMemoryTPDFile(int iConfig) +{ + EnterCriticalSection(&csMemTPDLock); + // check it's not already in + PMEMDATA pData=NULL; + AUTO_VAR(it, m_MEM_TPD.find(iConfig)); + if(it != m_MEM_TPD.end()) + { + pData=m_MEM_TPD[iConfig]; + delete [] pData; + m_MEM_TPD.erase(iConfig); + } + + LeaveCriticalSection(&csMemTPDLock); +} + +#ifdef _XBOX +int CMinecraftApp::GetTPConfigVal(WCHAR *pwchDataFile) +{ + DLC_INFO *pDLCInfo=NULL; + // run through the DLC info to find the right texture pack/mash-up pack + for(unsigned int i = 0; i < app.GetDLCInfoTexturesOffersCount(); ++i) + { + ULONGLONG ull=app.GetDLCInfoTexturesFullOffer(i); + pDLCInfo=app.GetDLCInfoForFullOfferID(ull); + + if(wcscmp(pwchDataFile,pDLCInfo->wchDataFile)==0) + { + return pDLCInfo->iConfig; + } + } + + return -1; +} +#elif defined _XBOX_ONE +int CMinecraftApp::GetTPConfigVal(WCHAR *pwchDataFile) +{ + DLC_INFO *pDLCInfo=NULL; + // run through the DLC info to find the right texture pack/mash-up pack + for(unsigned int i = 0; i < app.GetDLCInfoTexturesOffersCount(); ++i) + { + pDLCInfo=app.GetDLCInfoForFullOfferID((WCHAR *)app.GetDLCInfoTexturesFullOffer(i).c_str()); + + if(wcscmp(pwchDataFile,pDLCInfo->wchDataFile)==0) + { + return pDLCInfo->iConfig; + } + } + + return -1; +} +#elif defined _WINDOWS64 +int CMinecraftApp::GetTPConfigVal(WCHAR *pwchDataFile) +{ + return -1; +} +#endif +bool CMinecraftApp::IsFileInTPD(int iConfig) +{ + bool val = false; + + EnterCriticalSection(&csMemTPDLock); + AUTO_VAR(it, m_MEM_TPD.find(iConfig)); + if(it != m_MEM_TPD.end()) val = true; + LeaveCriticalSection(&csMemTPDLock); + + return val; +} + +void CMinecraftApp::GetTPD(int iConfig,PBYTE *ppbData,DWORD *pdwBytes) +{ + EnterCriticalSection(&csMemTPDLock); + AUTO_VAR(it, m_MEM_TPD.find(iConfig)); + if(it != m_MEM_TPD.end()) + { + PMEMDATA pData = (*it).second; + *ppbData=pData->pbData; + *pdwBytes=pData->dwBytes; + } + LeaveCriticalSection(&csMemTPDLock); +} + + +// bool CMinecraftApp::UploadFileToGlobalStorage(int iQuadrant, C4JStorage::eGlobalStorage eStorageFacility, wstring *wsFile ) +// { +// bool bRes=false; +// #ifndef _CONTENT_PACKAGE +// // read the local file +// File gtsFile( wsFile->c_str() ); +// +// __int64 fileSize = gtsFile.length(); +// +// if(fileSize!=0) +// { +// FileInputStream fis(gtsFile); +// byteArray ba((int)fileSize); +// fis.read(ba); +// fis.close(); +// +// bRes=StorageManager.WriteTMSFile(iQuadrant,eStorageFacility,(WCHAR *)wsFile->c_str(),ba.data, ba.length); +// +// } +// #endif +// return bRes; +// } + + + + + + +void CMinecraftApp::StoreLaunchData() +{ + +} + +void CMinecraftApp::ExitGame() +{ +} + +// Invites + +void CMinecraftApp::ProcessInvite(DWORD dwUserIndex, DWORD dwLocalUsersMask, const INVITE_INFO * pInviteInfo) +{ + m_InviteData.dwUserIndex=dwUserIndex; + m_InviteData.dwLocalUsersMask=dwLocalUsersMask; + m_InviteData.pInviteInfo=pInviteInfo; + //memcpy(&m_InviteData,pJoinData,sizeof(JoinFromInviteData)); + SetAction(dwUserIndex,eAppAction_ExitAndJoinFromInvite); +} + +int CMinecraftApp::ExitAndJoinFromInvite(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + CMinecraftApp* pApp = (CMinecraftApp*)pParam; + //Minecraft *pMinecraft=Minecraft::GetInstance(); + + // buttons are swapped on this menu + if(result==C4JStorage::EMessage_ResultDecline) + { + pApp->SetAction(iPad,eAppAction_ExitAndJoinFromInviteConfirmed); + } + + return 0; +} + +int CMinecraftApp::ExitAndJoinFromInviteSaveDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + CMinecraftApp *pClass = (CMinecraftApp *)pParam; + // Exit with or without saving + // Decline means save in this dialog + if(result==C4JStorage::EMessage_ResultDecline || result==C4JStorage::EMessage_ResultThirdOption) + { + if( result==C4JStorage::EMessage_ResultDecline ) // Save + { + // Check they have the full texture pack if they are using one + // 4J-PB - Is the player trying to save but they are using a trial texturepack ? + if(!Minecraft::GetInstance()->skins->isUsingDefaultSkin()) + { + TexturePack *tPack = Minecraft::GetInstance()->skins->getSelected(); + + DLCPack * pDLCPack=tPack->getDLCPack(); + if(!pDLCPack->hasPurchasedFile( DLCManager::e_DLCType_Texture, L"" )) + { + // upsell + // get the dlc texture pack + +#ifdef _XBOX + DLCTexturePack *pDLCTexPack=(DLCTexturePack *)tPack; + ULONGLONG ullOfferID_Full; + app.GetDLCFullOfferIDForPackID(pDLCTexPack->getDLCParentPackId(),&ullOfferID_Full); + + // tell sentient about the upsell of the full version of the skin pack + TelemetryManager->RecordUpsellPresented(iPad, eSet_UpsellID_Texture_DLC, ullOfferID_Full & 0xFFFFFFFF); +#endif + + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_OK; + uiIDA[1]=IDS_CONFIRM_CANCEL; + + // Give the player a warning about the trial version of the texture pack + ui.RequestErrorMessage(IDS_WARNING_DLC_TRIALTEXTUREPACK_TITLE, IDS_WARNING_DLC_TRIALTEXTUREPACK_TEXT, uiIDA, 2, iPad,&CMinecraftApp::WarningTrialTexturePackReturned,pClass); + + return S_OK; + } + } +#ifndef _XBOX_ONE + // does the save exist? + bool bSaveExists; + StorageManager.DoesSaveExist(&bSaveExists); + // 4J-PB - we check if the save exists inside the libs + // we need to ask if they are sure they want to overwrite the existing game + if(bSaveExists) + { + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + ui.RequestErrorMessage(IDS_TITLE_SAVE_GAME, IDS_CONFIRM_SAVE_GAME, uiIDA, 2, ProfileManager.GetPrimaryPad(),&CMinecraftApp::ExitAndJoinFromInviteAndSaveReturned,pClass); + return 0; + } + else +#endif + { +#if defined(_XBOX_ONE) || defined(__ORBIS__) + StorageManager.SetSaveDisabled(false); +#endif + MinecraftServer::getInstance()->setSaveOnExit( true ); + } + } + else + { + // been a few requests for a confirm on exit without saving + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + ui.RequestErrorMessage(IDS_TITLE_DECLINE_SAVE_GAME, IDS_CONFIRM_DECLINE_SAVE_GAME, uiIDA, 2, ProfileManager.GetPrimaryPad(),&CMinecraftApp::ExitAndJoinFromInviteDeclineSaveReturned,pClass); + return 0; + } + + app.SetAction(ProfileManager.GetPrimaryPad(),eAppAction_ExitAndJoinFromInviteConfirmed); + } + return 0; +} + +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; + + TexturePack *tPack = Minecraft::GetInstance()->skins->getSelected(); + // get the dlc texture pack + DLCTexturePack *pDLCTexPack=(DLCTexturePack *)tPack; + ULONGLONG ullIndexA[1]; + + // Need to get the parent packs id, since this may be one of many child packs with their own ids + app.GetDLCFullOfferIDForPackID(pDLCTexPack->getDLCParentPackId(),&ullIndexA[0]); + + if(result==C4JStorage::EMessage_ResultAccept) + { + if(ProfileManager.IsSignedIn(iPad)) + { + // need to allow downloads here, or the player would need to quit the game to let the download of a texture pack happen. This might affect the network traffic, since the download could take all the bandwidth... + XBackgroundDownloadSetMode(XBACKGROUND_DOWNLOAD_MODE_ALWAYS_ALLOW); + + StorageManager.InstallOffer(1,ullIndexA,NULL,NULL); + } + } + else + { + TelemetryManager->RecordUpsellResponded(iPad, eSet_UpsellID_Texture_DLC, ( ullIndexA[0] & 0xFFFFFFFF ), eSen_UpsellOutcome_Declined); + } +#endif + return 0; +} + +int CMinecraftApp::ExitAndJoinFromInviteAndSaveReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + //CMinecraftApp* pClass = (CMinecraftApp*)pParam; + + // results switched for this dialog + if(result==C4JStorage::EMessage_ResultDecline) + { + INT saveOrCheckpointId = 0; + + // Check they have the full texture pack if they are using one + // 4J-PB - Is the player trying to save but they are using a trial texturepack ? + if(!Minecraft::GetInstance()->skins->isUsingDefaultSkin()) + { + TexturePack *tPack = Minecraft::GetInstance()->skins->getSelected(); + + DLCPack * pDLCPack=tPack->getDLCPack(); + if(!pDLCPack->hasPurchasedFile( DLCManager::e_DLCType_Texture, L"" )) + { + // upsell + // get the dlc texture pack + +#ifdef _XBOX + DLCTexturePack *pDLCTexPack=(DLCTexturePack *)tPack; + ULONGLONG ullOfferID_Full; + app.GetDLCFullOfferIDForPackID(pDLCTexPack->getDLCParentPackId(),&ullOfferID_Full); + + // tell sentient about the upsell of the full version of the skin pack + TelemetryManager->RecordUpsellPresented(iPad, eSet_UpsellID_Texture_DLC, ullOfferID_Full & 0xFFFFFFFF); +#endif + + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_OK; + uiIDA[1]=IDS_CONFIRM_CANCEL; + + // Give the player a warning about the trial version of the texture pack + ui.RequestErrorMessage(IDS_WARNING_DLC_TRIALTEXTUREPACK_TITLE, IDS_WARNING_DLC_TRIALTEXTUREPACK_TEXT, uiIDA, 2, iPad,&CMinecraftApp::WarningTrialTexturePackReturned,NULL); + + return S_OK; + } + } + //bool validSave = StorageManager.GetSaveUniqueNumber(&saveOrCheckpointId); + //SentientManager.RecordLevelSaveOrCheckpoint(ProfileManager.GetPrimaryPad(), saveOrCheckpointId); + MinecraftServer::getInstance()->setSaveOnExit( true ); + // flag a app action of exit and join game from invite + app.SetAction(iPad,eAppAction_ExitAndJoinFromInviteConfirmed); + } + return 0; +} + +int CMinecraftApp::ExitAndJoinFromInviteDeclineSaveReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + // results switched for this dialog + if(result==C4JStorage::EMessage_ResultDecline) + { +#if defined(_XBOX_ONE) || defined(__ORBIS__) + StorageManager.SetSaveDisabled(false); +#endif + MinecraftServer::getInstance()->setSaveOnExit( false ); + // flag a app action of exit and join game from invite + app.SetAction(iPad,eAppAction_ExitAndJoinFromInviteConfirmed); + } + return 0; +} + +////////////////////////////////////////////////////////////////////////// +// +// FatalLoadError +// +// This is called when we can't load one of the required files at startup +// It tends to mean the files have been corrupted. +// We have to assume that we've not been able to load the text for the game. +// +////////////////////////////////////////////////////////////////////////// +void CMinecraftApp::FatalLoadError() +{ + +} + +TIPSTRUCT CMinecraftApp::m_GameTipA[MAX_TIPS_GAMETIP]= +{ + { 0, IDS_TIPS_GAMETIP_1}, + { 0, IDS_TIPS_GAMETIP_2}, + { 0, IDS_TIPS_GAMETIP_3}, + { 0, IDS_TIPS_GAMETIP_4}, + { 0, IDS_TIPS_GAMETIP_5}, + { 0, IDS_TIPS_GAMETIP_6}, + { 0, IDS_TIPS_GAMETIP_7}, + { 0, IDS_TIPS_GAMETIP_8}, + { 0, IDS_TIPS_GAMETIP_9}, + { 0, IDS_TIPS_GAMETIP_10}, + { 0, IDS_TIPS_GAMETIP_11}, + { 0, IDS_TIPS_GAMETIP_12}, + { 0, IDS_TIPS_GAMETIP_13}, + { 0, IDS_TIPS_GAMETIP_14}, + { 0, IDS_TIPS_GAMETIP_15}, + { 0, IDS_TIPS_GAMETIP_16}, + { 0, IDS_TIPS_GAMETIP_17}, + { 0, IDS_TIPS_GAMETIP_18}, + { 0, IDS_TIPS_GAMETIP_19}, + { 0, IDS_TIPS_GAMETIP_20}, + { 0, IDS_TIPS_GAMETIP_21}, + { 0, IDS_TIPS_GAMETIP_22}, + { 0, IDS_TIPS_GAMETIP_23}, + { 0, IDS_TIPS_GAMETIP_24}, + { 0, IDS_TIPS_GAMETIP_25}, + { 0, IDS_TIPS_GAMETIP_26}, + { 0, IDS_TIPS_GAMETIP_27}, + { 0, IDS_TIPS_GAMETIP_28}, + { 0, IDS_TIPS_GAMETIP_29}, + { 0, IDS_TIPS_GAMETIP_30}, + { 0, IDS_TIPS_GAMETIP_31}, + { 0, IDS_TIPS_GAMETIP_32}, + { 0, IDS_TIPS_GAMETIP_33}, + { 0, IDS_TIPS_GAMETIP_34}, + { 0, IDS_TIPS_GAMETIP_35}, + { 0, IDS_TIPS_GAMETIP_36}, + { 0, IDS_TIPS_GAMETIP_37}, + { 0, IDS_TIPS_GAMETIP_38}, + { 0, IDS_TIPS_GAMETIP_39}, + { 0, IDS_TIPS_GAMETIP_40}, + { 0, IDS_TIPS_GAMETIP_41}, + { 0, IDS_TIPS_GAMETIP_42}, + { 0, IDS_TIPS_GAMETIP_43}, + { 0, IDS_TIPS_GAMETIP_44}, + { 0, IDS_TIPS_GAMETIP_45}, + { 0, IDS_TIPS_GAMETIP_46}, + { 0, IDS_TIPS_GAMETIP_47}, + { 0, IDS_TIPS_GAMETIP_48}, + { 0, IDS_TIPS_GAMETIP_49}, + { 0, IDS_TIPS_GAMETIP_50}, +}; + +TIPSTRUCT CMinecraftApp::m_TriviaTipA[MAX_TIPS_TRIVIATIP]= +{ + { 0, IDS_TIPS_TRIVIA_1}, + { 0, IDS_TIPS_TRIVIA_2}, + { 0, IDS_TIPS_TRIVIA_3}, + { 0, IDS_TIPS_TRIVIA_4}, + { 0, IDS_TIPS_TRIVIA_5}, + { 0, IDS_TIPS_TRIVIA_6}, + { 0, IDS_TIPS_TRIVIA_7}, + { 0, IDS_TIPS_TRIVIA_8}, + { 0, IDS_TIPS_TRIVIA_9}, + { 0, IDS_TIPS_TRIVIA_10}, + { 0, IDS_TIPS_TRIVIA_11}, + { 0, IDS_TIPS_TRIVIA_12}, + { 0, IDS_TIPS_TRIVIA_13}, + { 0, IDS_TIPS_TRIVIA_14}, + { 0, IDS_TIPS_TRIVIA_15}, + { 0, IDS_TIPS_TRIVIA_16}, + { 0, IDS_TIPS_TRIVIA_17}, + { 0, IDS_TIPS_TRIVIA_18}, + { 0, IDS_TIPS_TRIVIA_19}, + { 0, IDS_TIPS_TRIVIA_20}, +}; + +Random *CMinecraftApp::TipRandom = new Random(); + +int CMinecraftApp::TipsSortFunction(const void* a, const void* b) +{ + return ((TIPSTRUCT*)a)->iSortValue - ((TIPSTRUCT*)b)->iSortValue; +} + +void CMinecraftApp::InitialiseTips() +{ + // We'll randomise the tips at start up based on their priority + + ZeroMemory(m_TipIDA,sizeof(UINT)*MAX_TIPS_GAMETIP+MAX_TIPS_TRIVIATIP); + + // Make the first tip tell you that you can play splitscreen in HD modes if you are in SD + if(!RenderManager.IsHiDef()) + { + m_GameTipA[0].uiStringID=IDS_TIPS_GAMETIP_0; + } + // randomise then quicksort + // going to leave the multiplayer tip so it is always first + + // Only randomise the content package build +#ifdef _CONTENT_PACKAGE + + for(int i=1;inextInt(); + } + qsort( &m_GameTipA[1], MAX_TIPS_GAMETIP-1, sizeof(TIPSTRUCT), TipsSortFunction ); +#endif + + for(int i=0;inextInt(); + } + qsort( m_TriviaTipA, MAX_TIPS_TRIVIATIP, sizeof(TIPSTRUCT), TipsSortFunction ); + + + int iCurrentGameTip=0; + int iCurrentTriviaTip=0; + + for(int i=0;iskins->getSelected()->getColourTable()->getColour(colour); +} + +int CMinecraftApp::GetHTMLFontSize(EHTMLFontSize size) +{ + return s_iHTMLFontSizesA[size]; +} + +wstring CMinecraftApp::FormatHTMLString(int iPad, const wstring &desc, int shadowColour /*= 0xFFFFFFFF*/) +{ + wstring text(desc); + + wchar_t replacements[64]; + // We will also insert line breaks here as couldn't figure out how to get them to come through from strings.resx ! + text = replaceAll(text, L"{*B*}", L"
" ); + swprintf(replacements,64,L"", GetHTMLColour(eHTMLColor_T1)); + text = replaceAll(text, L"{*T1*}", replacements ); + swprintf(replacements,64,L"", GetHTMLColour(eHTMLColor_T2)); + text = replaceAll(text, L"{*T2*}", replacements ); + swprintf(replacements,64,L"", GetHTMLColour(eHTMLColor_T3)); + text = replaceAll(text, L"{*T3*}", replacements ); // for How To Play + swprintf(replacements,64,L"", GetHTMLColour(eHTMLColor_Black)); + text = replaceAll(text, L"{*ETB*}", replacements ); + swprintf(replacements,64,L"", GetHTMLColour(eHTMLColor_White)); + text = replaceAll(text, L"{*ETW*}", replacements ); + text = replaceAll(text, L"{*EF*}", L"" ); + + swprintf(replacements,64,L"", GetHTMLColour(eHTMLColor_0), shadowColour); + text = replaceAll(text, L"{*C0*}", replacements ); + swprintf(replacements,64,L"", GetHTMLColour(eHTMLColor_1), shadowColour); + text = replaceAll(text, L"{*C1*}", replacements ); + swprintf(replacements,64,L"", GetHTMLColour(eHTMLColor_2), shadowColour); + text = replaceAll(text, L"{*C2*}", replacements ); + swprintf(replacements,64,L"", GetHTMLColour(eHTMLColor_3), shadowColour); + text = replaceAll(text, L"{*C3*}", replacements ); + swprintf(replacements,64,L"", GetHTMLColour(eHTMLColor_4), shadowColour); + text = replaceAll(text, L"{*C4*}", replacements ); + swprintf(replacements,64,L"", GetHTMLColour(eHTMLColor_5), shadowColour); + text = replaceAll(text, L"{*C5*}", replacements ); + swprintf(replacements,64,L"", GetHTMLColour(eHTMLColor_6), shadowColour); + text = replaceAll(text, L"{*C6*}", replacements ); + swprintf(replacements,64,L"", GetHTMLColour(eHTMLColor_7), shadowColour); + text = replaceAll(text, L"{*C7*}", replacements ); + swprintf(replacements,64,L"", GetHTMLColour(eHTMLColor_8), shadowColour); + text = replaceAll(text, L"{*C8*}", replacements ); + swprintf(replacements,64,L"", GetHTMLColour(eHTMLColor_9), shadowColour); + text = replaceAll(text, L"{*C9*}", replacements ); + swprintf(replacements,64,L"", GetHTMLColour(eHTMLColor_a), shadowColour); + text = replaceAll(text, L"{*CA*}", replacements ); + swprintf(replacements,64,L"", GetHTMLColour(eHTMLColor_b), shadowColour); + text = replaceAll(text, L"{*CB*}", replacements ); + swprintf(replacements,64,L"", GetHTMLColour(eHTMLColor_c), shadowColour); + text = replaceAll(text, L"{*CC*}", replacements ); + swprintf(replacements,64,L"", GetHTMLColour(eHTMLColor_d), shadowColour); + text = replaceAll(text, L"{*CD*}", replacements ); + swprintf(replacements,64,L"", GetHTMLColour(eHTMLColor_e), shadowColour); + text = replaceAll(text, L"{*CE*}", replacements ); + swprintf(replacements,64,L"", GetHTMLColour(eHTMLColor_f), shadowColour); + text = replaceAll(text, L"{*CF*}", replacements ); + + // Swap for southpaw. + if ( app.GetGameSettings(iPad,eGameSetting_ControlSouthPaw) ) + { + text = replaceAll(text, L"{*CONTROLLER_ACTION_MOVE*}", GetActionReplacement(iPad,MINECRAFT_ACTION_LOOK_RIGHT ) ); + text = replaceAll(text, L"{*CONTROLLER_ACTION_LOOK*}", GetActionReplacement(iPad,MINECRAFT_ACTION_RIGHT ) ); + + text = replaceAll(text, L"{*CONTROLLER_MENU_NAVIGATE*}", GetVKReplacement(VK_PAD_RTHUMB_LEFT) ); + } + else // Normal right handed. + { + text = replaceAll(text, L"{*CONTROLLER_ACTION_MOVE*}", GetActionReplacement(iPad,MINECRAFT_ACTION_RIGHT ) ); + text = replaceAll(text, L"{*CONTROLLER_ACTION_LOOK*}", GetActionReplacement(iPad,MINECRAFT_ACTION_LOOK_RIGHT ) ); + + text = replaceAll(text, L"{*CONTROLLER_MENU_NAVIGATE*}", GetVKReplacement(VK_PAD_LTHUMB_LEFT) ); + } + + text = replaceAll(text, L"{*CONTROLLER_ACTION_JUMP*}", GetActionReplacement(iPad,MINECRAFT_ACTION_JUMP ) ); + text = replaceAll(text, L"{*CONTROLLER_ACTION_SNEAK*}", GetActionReplacement(iPad,MINECRAFT_ACTION_SNEAK_TOGGLE ) ); + text = replaceAll(text, L"{*CONTROLLER_ACTION_USE*}", GetActionReplacement(iPad,MINECRAFT_ACTION_USE ) ); + text = replaceAll(text, L"{*CONTROLLER_ACTION_ACTION*}", GetActionReplacement(iPad,MINECRAFT_ACTION_ACTION ) ); + text = replaceAll(text, L"{*CONTROLLER_ACTION_LEFT_SCROLL*}", GetActionReplacement(iPad,MINECRAFT_ACTION_LEFT_SCROLL ) ); + text = replaceAll(text, L"{*CONTROLLER_ACTION_RIGHT_SCROLL*}", GetActionReplacement(iPad,MINECRAFT_ACTION_RIGHT_SCROLL ) ); + text = replaceAll(text, L"{*CONTROLLER_ACTION_INVENTORY*}", GetActionReplacement(iPad,MINECRAFT_ACTION_INVENTORY ) ); + text = replaceAll(text, L"{*CONTROLLER_ACTION_CRAFTING*}", GetActionReplacement(iPad,MINECRAFT_ACTION_CRAFTING ) ); + text = replaceAll(text, L"{*CONTROLLER_ACTION_DROP*}", GetActionReplacement(iPad,MINECRAFT_ACTION_DROP ) ); + text = replaceAll(text, L"{*CONTROLLER_ACTION_CAMERA*}", GetActionReplacement(iPad,MINECRAFT_ACTION_RENDER_THIRD_PERSON ) ); + text = replaceAll(text, L"{*CONTROLLER_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) ); + text = replaceAll(text, L"{*CONTROLLER_VK_Y*}", GetVKReplacement(VK_PAD_Y) ); + text = replaceAll(text, L"{*CONTROLLER_VK_LB*}", GetVKReplacement(VK_PAD_LSHOULDER) ); + text = replaceAll(text, L"{*CONTROLLER_VK_RB*}", GetVKReplacement(VK_PAD_RSHOULDER) ); + text = replaceAll(text, L"{*CONTROLLER_VK_LS*}", GetVKReplacement(VK_PAD_LTHUMB_UP) ); + text = replaceAll(text, L"{*CONTROLLER_VK_RS*}", GetVKReplacement(VK_PAD_RTHUMB_UP) ); + text = replaceAll(text, L"{*CONTROLLER_VK_LT*}", GetVKReplacement(VK_PAD_LTRIGGER) ); + text = replaceAll(text, L"{*CONTROLLER_VK_RT*}", GetVKReplacement(VK_PAD_RTRIGGER) ); + text = replaceAll(text, L"{*ICON_SHANK_01*}", GetIconReplacement(XZP_ICON_SHANK_01) ); + text = replaceAll(text, L"{*ICON_SHANK_03*}", GetIconReplacement(XZP_ICON_SHANK_03) ); + text = replaceAll(text, L"{*CONTROLLER_ACTION_DPAD_UP*}", GetActionReplacement(iPad,MINECRAFT_ACTION_DPAD_UP ) ); + text = replaceAll(text, L"{*CONTROLLER_ACTION_DPAD_DOWN*}", GetActionReplacement(iPad,MINECRAFT_ACTION_DPAD_DOWN ) ); + text = replaceAll(text, L"{*CONTROLLER_ACTION_DPAD_RIGHT*}", GetActionReplacement(iPad,MINECRAFT_ACTION_DPAD_RIGHT ) ); + text = replaceAll(text, L"{*CONTROLLER_ACTION_DPAD_LEFT*}", GetActionReplacement(iPad,MINECRAFT_ACTION_DPAD_LEFT ) ); +#if defined _XBOX_ONE || defined __PSVITA__ + text = replaceAll(text, L"{*CONTROLLER_VK_START*}", GetVKReplacement(VK_PAD_START ) ); + text = replaceAll(text, L"{*CONTROLLER_VK_BACK*}", GetVKReplacement(VK_PAD_BACK ) ); +#endif + +#ifdef _XBOX + wstring imageRoot = L""; + + Minecraft *pMinecraft = Minecraft::GetInstance(); + imageRoot = pMinecraft->skins->getSelected()->getXuiRootPath(); + + text = replaceAll(text, L"{*IMAGEROOT*}", imageRoot); +#endif // _XBOX + + // Fix for #8903 - UI: Localization: KOR/JPN/CHT: Button Icons are rendered with padding space, which looks no good + DWORD dwLanguage = XGetLanguage( ); + switch(dwLanguage) + { + case XC_LANGUAGE_KOREAN: + case XC_LANGUAGE_JAPANESE: + case XC_LANGUAGE_TCHINESE: + text = replaceAll(text, L" ", L"" ); + break; + } + + return text; +} + +wstring CMinecraftApp::GetActionReplacement(int iPad, unsigned char ucAction) +{ + unsigned int input = InputManager.GetGameJoypadMaps(InputManager.GetJoypadMapVal(iPad) ,ucAction); + +#ifdef _XBOX + switch(input) + { + case _360_JOY_BUTTON_A: + return app.GetString( IDS_CONTROLLER_A ); + case _360_JOY_BUTTON_B: + return app.GetString( IDS_CONTROLLER_B ); + case _360_JOY_BUTTON_X: + return app.GetString( IDS_CONTROLLER_X ); + case _360_JOY_BUTTON_Y: + return app.GetString( IDS_CONTROLLER_Y ); + case _360_JOY_BUTTON_LSTICK_UP: + case _360_JOY_BUTTON_LSTICK_DOWN: + case _360_JOY_BUTTON_LSTICK_LEFT: + case _360_JOY_BUTTON_LSTICK_RIGHT: + return app.GetString( IDS_CONTROLLER_LEFT_STICK ); + case _360_JOY_BUTTON_RSTICK_LEFT: + case _360_JOY_BUTTON_RSTICK_RIGHT: + case _360_JOY_BUTTON_RSTICK_UP: + case _360_JOY_BUTTON_RSTICK_DOWN: + return app.GetString( IDS_CONTROLLER_RIGHT_STICK ); + case _360_JOY_BUTTON_LT: + return app.GetString( IDS_CONTROLLER_LEFT_TRIGGER ); + case _360_JOY_BUTTON_RT: + return app.GetString( IDS_CONTROLLER_RIGHT_TRIGGER ); + case _360_JOY_BUTTON_RB: + return app.GetString( IDS_CONTROLLER_RIGHT_BUMPER ); + case _360_JOY_BUTTON_LB: + return app.GetString( IDS_CONTROLLER_LEFT_BUMPER ); + case _360_JOY_BUTTON_BACK: + return app.GetString( IDS_CONTROLLER_BACK ); + case _360_JOY_BUTTON_START: + return app.GetString( IDS_CONTROLLER_START ); + case _360_JOY_BUTTON_RTHUMB: + return app.GetString( IDS_CONTROLLER_RIGHT_THUMBSTICK ); + case _360_JOY_BUTTON_LTHUMB: + return app.GetString( IDS_CONTROLLER_LEFT_THUMBSTICK ); + case _360_JOY_BUTTON_DPAD_LEFT: + return app.GetString( IDS_CONTROLLER_DPAD_L ); + case _360_JOY_BUTTON_DPAD_RIGHT: + return app.GetString( IDS_CONTROLLER_DPAD_R ); + case _360_JOY_BUTTON_DPAD_UP: + return app.GetString( IDS_CONTROLLER_DPAD_U ); + case _360_JOY_BUTTON_DPAD_DOWN: + return app.GetString( IDS_CONTROLLER_DPAD_D ); + }; + return L""; +#else + wstring replacement = L""; + + // 4J Stu - Some of our actions can be mapped to multiple physical buttons, so replaces the switch that was here + if (input & _360_JOY_BUTTON_A) replacement = L"ButtonA"; + else if(input &_360_JOY_BUTTON_B) replacement = L"ButtonB"; + else if(input &_360_JOY_BUTTON_X) replacement = L"ButtonX"; + else if(input &_360_JOY_BUTTON_Y) replacement = L"ButtonY"; + else if( + (input &_360_JOY_BUTTON_LSTICK_UP) || + (input &_360_JOY_BUTTON_LSTICK_DOWN) || + (input &_360_JOY_BUTTON_LSTICK_LEFT) || + (input &_360_JOY_BUTTON_LSTICK_RIGHT) + ) + { + replacement = L"ButtonLeftStick"; + } + else if( + (input &_360_JOY_BUTTON_RSTICK_LEFT) || + (input &_360_JOY_BUTTON_RSTICK_RIGHT) || + (input &_360_JOY_BUTTON_RSTICK_UP) || + (input &_360_JOY_BUTTON_RSTICK_DOWN) + ) + { + replacement = L"ButtonRightStick"; + } + else if(input &_360_JOY_BUTTON_DPAD_LEFT) replacement = L"ButtonDpadL"; + else if(input &_360_JOY_BUTTON_DPAD_RIGHT) replacement = L"ButtonDpadR"; + else if(input &_360_JOY_BUTTON_DPAD_UP) replacement = L"ButtonDpadU"; + else if(input &_360_JOY_BUTTON_DPAD_DOWN) replacement = L"ButtonDpadD"; + else if(input &_360_JOY_BUTTON_LT) replacement = L"ButtonLeftTrigger"; + else if(input &_360_JOY_BUTTON_RT) replacement = L"ButtonRightTrigger"; + else if(input &_360_JOY_BUTTON_RB) replacement = L"ButtonRightBumper"; + else if(input &_360_JOY_BUTTON_LB) replacement = L"ButtonLeftBumper"; + else if(input &_360_JOY_BUTTON_BACK) replacement = L"ButtonBack"; + else if(input &_360_JOY_BUTTON_START) replacement = L"ButtonStart"; + else if(input &_360_JOY_BUTTON_RTHUMB) replacement = L"ButtonRS"; + else if(input &_360_JOY_BUTTON_LTHUMB) replacement = L"ButtonLS"; + + wchar_t string[128]; + +#ifdef __PS3__ + int size = 30; +#elif defined _WIN64 + int size = 45; + if(ui.getScreenWidth() < 1920) size = 30; +#else + int size = 45; +#endif + + swprintf(string,128,L"", replacement.c_str(), size, size); + + return string; +#endif +} + +wstring CMinecraftApp::GetVKReplacement(unsigned int uiVKey) +{ +#ifdef _XBOX + switch(uiVKey) + { + case VK_PAD_A: + return app.GetString( IDS_CONTROLLER_A ); + case VK_PAD_B: + return app.GetString( IDS_CONTROLLER_B ); + case VK_PAD_X: + return app.GetString( IDS_CONTROLLER_X ); + case VK_PAD_Y: + return app.GetString( IDS_CONTROLLER_Y ); + case VK_PAD_LSHOULDER: + return app.GetString( IDS_CONTROLLER_LEFT_BUMPER ); + case VK_PAD_RSHOULDER: + return app.GetString( IDS_CONTROLLER_RIGHT_BUMPER ); + case VK_PAD_LTRIGGER: + return app.GetString( IDS_CONTROLLER_LEFT_TRIGGER ); + case VK_PAD_RTRIGGER: + return app.GetString( IDS_CONTROLLER_RIGHT_TRIGGER ); + case VK_PAD_LTHUMB_UP : + case VK_PAD_LTHUMB_DOWN : + case VK_PAD_LTHUMB_RIGHT : + case VK_PAD_LTHUMB_LEFT : + case VK_PAD_LTHUMB_UPLEFT : + case VK_PAD_LTHUMB_UPRIGHT : + case VK_PAD_LTHUMB_DOWNRIGHT: + case VK_PAD_LTHUMB_DOWNLEFT : + return app.GetString( IDS_CONTROLLER_LEFT_STICK ); + case VK_PAD_RTHUMB_UP : + case VK_PAD_RTHUMB_DOWN : + case VK_PAD_RTHUMB_RIGHT : + case VK_PAD_RTHUMB_LEFT : + case VK_PAD_RTHUMB_UPLEFT : + case VK_PAD_RTHUMB_UPRIGHT : + case VK_PAD_RTHUMB_DOWNRIGHT: + case VK_PAD_RTHUMB_DOWNLEFT : + return app.GetString( IDS_CONTROLLER_RIGHT_STICK ); + default: + break; + } + return NULL; +#else + wstring replacement = L""; + switch(uiVKey) + { + case VK_PAD_A: +#if defined(__PS3__) || defined(__ORBIS__) || defined (__PSVITA__) + if( InputManager.IsCircleCrossSwapped() ) replacement = L"ButtonB"; + else replacement = L"ButtonA"; +#else + replacement = L"ButtonA"; +#endif + break; + case VK_PAD_B: +#if defined(__PS3__) || defined(__ORBIS__) || defined (__PSVITA__) + if( InputManager.IsCircleCrossSwapped() ) replacement = L"ButtonA"; + else replacement = L"ButtonB"; +#else + replacement = L"ButtonB"; +#endif + break; + case VK_PAD_X: + replacement = L"ButtonX"; + break; + case VK_PAD_Y: + replacement = L"ButtonY"; + break; + case VK_PAD_LSHOULDER: + replacement = L"ButtonLeftBumper"; + break; + case VK_PAD_RSHOULDER: + replacement = L"ButtonRightBumper"; + break; + case VK_PAD_LTRIGGER: + replacement = L"ButtonLeftTrigger"; + break; + case VK_PAD_RTRIGGER: + replacement = L"ButtonRightTrigger"; + break; + case VK_PAD_LTHUMB_UP : + case VK_PAD_LTHUMB_DOWN : + case VK_PAD_LTHUMB_RIGHT : + case VK_PAD_LTHUMB_LEFT : + case VK_PAD_LTHUMB_UPLEFT : + case VK_PAD_LTHUMB_UPRIGHT : + case VK_PAD_LTHUMB_DOWNRIGHT: + case VK_PAD_LTHUMB_DOWNLEFT : + replacement = L"ButtonLeftStick"; + break; + case VK_PAD_RTHUMB_UP : + case VK_PAD_RTHUMB_DOWN : + case VK_PAD_RTHUMB_RIGHT : + case VK_PAD_RTHUMB_LEFT : + case VK_PAD_RTHUMB_UPLEFT : + case VK_PAD_RTHUMB_UPRIGHT : + case VK_PAD_RTHUMB_DOWNRIGHT: + case VK_PAD_RTHUMB_DOWNLEFT : + replacement = L"ButtonRightStick"; + break; +#if defined _XBOX_ONE || defined __PSVITA__ + case VK_PAD_START: + replacement = L"ButtonStart"; + break; + case VK_PAD_BACK: + replacement = L"ButtonBack"; + break; +#endif + default: + break; + } + wchar_t string[128]; + +#ifdef __PS3__ + int size = 30; +#elif defined _WIN64 + int size = 45; + if(ui.getScreenWidth() < 1920) size = 30; +#else + int size = 45; +#endif + + swprintf(string,128,L"", replacement.c_str(), size, size); + + return string; +#endif +} + +wstring CMinecraftApp::GetIconReplacement(unsigned int uiIcon) +{ +#ifdef _XBOX + switch(uiIcon) + { + case XZP_ICON_SHANK_01: + return app.GetString( IDS_ICON_SHANK_01 ); + case XZP_ICON_SHANK_03: + return app.GetString( IDS_ICON_SHANK_03 ); + default: + break; + } + return NULL; +#else + wchar_t string[128]; + +#ifdef __PS3__ + int size = 22; +#elif defined _WIN64 + int size = 33; + if(ui.getScreenWidth() < 1920) size = 22; +#else + int size = 33; +#endif + + swprintf(string,128,L"", size, size); + wstring result = L""; + switch(uiIcon) + { + case XZP_ICON_SHANK_01: + result = string; + break; + case XZP_ICON_SHANK_03: + result.append(string).append(string).append(string); + break; + default: + break; + } + return result; +#endif +} + +#if defined(__PS3__) || defined(__ORBIS__) || defined (__PSVITA__) +unordered_map CMinecraftApp::MojangData; +unordered_map CMinecraftApp::DLCTextures_PackID; +unordered_map CMinecraftApp::DLCInfo; +unordered_map CMinecraftApp::DLCInfo_SkinName; +#elif defined(_DURANGO) +unordered_map CMinecraftApp::MojangData; +unordered_map CMinecraftApp::DLCTextures_PackID; // for mash-up packs & texture packs +//unordered_map CMinecraftApp::DLCInfo_Trial; // full offerid, dlc_info +unordered_map CMinecraftApp::DLCInfo_Full; // full offerid, dlc_info +unordered_map CMinecraftApp::DLCInfo_SkinName; // skin name, full offer id +#else +unordered_map CMinecraftApp::MojangData; +unordered_map CMinecraftApp::DLCTextures_PackID; +unordered_map CMinecraftApp::DLCInfo_Trial; +unordered_map CMinecraftApp::DLCInfo_Full; +unordered_map CMinecraftApp::DLCInfo_SkinName; +#endif + + + +HRESULT CMinecraftApp::RegisterMojangData(WCHAR *pXuidName, PlayerUID xuid, WCHAR *pSkin, WCHAR *pCape) +{ + HRESULT hr=S_OK; + eXUID eTempXuid=eXUID_Undefined; + MOJANG_DATA *pMojangData=NULL; + + // ignore the names if we don't recognize them + if(pXuidName!=NULL) + { + if( wcscmp( pXuidName, L"XUID_NOTCH" ) == 0 ) + { + eTempXuid = eXUID_Notch; // might be needed for the apple at some point + } + else if( wcscmp( pXuidName, L"XUID_DEADMAU5" ) == 0 ) + { + eTempXuid = eXUID_Deadmau5; // Needed for the deadmau5 ears + } + else + { + eTempXuid=eXUID_NoName; + } + } + + if(eTempXuid!=eXUID_Undefined) + { + pMojangData = new MOJANG_DATA; + ZeroMemory(pMojangData,sizeof(MOJANG_DATA)); + pMojangData->eXuid=eTempXuid; + + wcsncpy( pMojangData->wchSkin, pSkin, MAX_CAPENAME_SIZE); + wcsncpy( pMojangData->wchCape, pCape, MAX_CAPENAME_SIZE); + MojangData[xuid]=pMojangData; + } + + return hr; +} + +MOJANG_DATA *CMinecraftApp::GetMojangDataForXuid(PlayerUID xuid) +{ + return MojangData[xuid]; +} + +HRESULT CMinecraftApp::RegisterConfigValues(WCHAR *pType, int iValue) +{ + HRESULT hr=S_OK; + + // #ifdef _XBOX + // if(pType!=NULL) + // { + // if(wcscmp(pType,L"XboxOneTransfer")==0) + // { + // if(iValue>0) + // { + // app.m_bTransferSavesToXboxOne=true; + // } + // else + // { + // app.m_bTransferSavesToXboxOne=false; + // } + // } + // else if(wcscmp(pType,L"TransferSlotCount")==0) + // { + // app.m_uiTransferSlotC=iValue; + // } + // + // } + // #endif + + + return hr; +} + +#if (defined _XBOX || defined _WINDOWS64) +HRESULT CMinecraftApp::RegisterDLCData(WCHAR *pType, WCHAR *pBannerName, int iGender, __uint64 ullOfferID_Full, __uint64 ullOfferID_Trial, WCHAR *pFirstSkin, unsigned int uiSortIndex, int iConfig, WCHAR *pDataFile) +{ + HRESULT hr=S_OK; + DLC_INFO *pDLCData=new DLC_INFO; + ZeroMemory(pDLCData,sizeof(DLC_INFO)); + pDLCData->ullOfferID_Full=ullOfferID_Full; + pDLCData->ullOfferID_Trial=ullOfferID_Trial; + pDLCData->eDLCType=e_DLC_NotDefined; + pDLCData->iGender=iGender; + pDLCData->uiSortIndex=uiSortIndex; + pDLCData->iConfig=iConfig; + +#ifndef __ORBIS__ + // ignore the names if we don't recognize them + if(pBannerName!=L"") + { + wcsncpy_s( pDLCData->wchBanner, pBannerName, MAX_BANNERNAME_SIZE); + } + + if(pDataFile[0]!=0) + { + wcsncpy_s( pDLCData->wchDataFile, pDataFile, MAX_BANNERNAME_SIZE); + } +#endif + + if(pType!=NULL) + { + if(wcscmp(pType,L"Skin")==0) + { + pDLCData->eDLCType=e_DLC_SkinPack; + } + else if(wcscmp(pType,L"Gamerpic")==0) + { + pDLCData->eDLCType=e_DLC_Gamerpics; + } + else if(wcscmp(pType,L"Theme")==0) + { + pDLCData->eDLCType=e_DLC_Themes; + } + else if(wcscmp(pType,L"Avatar")==0) + { + pDLCData->eDLCType=e_DLC_AvatarItems; + } + else if(wcscmp(pType,L"MashUpPack")==0) + { + pDLCData->eDLCType=e_DLC_MashupPacks; + DLCTextures_PackID[pDLCData->iConfig]=ullOfferID_Full; + } + else if(wcscmp(pType,L"TexturePack")==0) + { + pDLCData->eDLCType=e_DLC_TexturePacks; + DLCTextures_PackID[pDLCData->iConfig]=ullOfferID_Full; + } + + + } + + if(ullOfferID_Trial!=0ll) DLCInfo_Trial[ullOfferID_Trial]=pDLCData; + if(ullOfferID_Full!=0ll) DLCInfo_Full[ullOfferID_Full]=pDLCData; + if(pFirstSkin[0]!=0) DLCInfo_SkinName[pFirstSkin]=ullOfferID_Full; + + return hr; +} +#elif defined _XBOX_ONE + +unordered_map *CMinecraftApp::GetDLCInfo() +{ + return &DLCInfo_Full; +} + +HRESULT CMinecraftApp::RegisterDLCData(eDLCContentType eType, WCHAR *pwchBannerName,WCHAR *pwchProductId, WCHAR *pwchProductName, WCHAR *pwchFirstSkin, int iConfig, unsigned int uiSortIndex) +{ + HRESULT hr=S_OK; + // 4J-PB - need to convert the product id to uppercase because the catalog calls come back with upper case + WCHAR wchUppercaseProductID[64]; + if(pwchProductId[0]!=0) + { + for(int i=0;i<64;i++) + { + wchUppercaseProductID[i]=towupper((wchar_t)pwchProductId[i]); + } + } + + // check if we already have this info from the local DLC file + wstring wsTemp=wchUppercaseProductID; + + AUTO_VAR(it, DLCInfo_Full.find(wsTemp)); + if( it == DLCInfo_Full.end() ) + { + // Not found + + DLC_INFO *pDLCData=new DLC_INFO; + ZeroMemory(pDLCData,sizeof(DLC_INFO)); + + pDLCData->eDLCType=e_DLC_NotDefined; + pDLCData->uiSortIndex=uiSortIndex; + pDLCData->iConfig=iConfig; + + if(pwchProductId[0]!=0) + { + pDLCData->wsProductId=wchUppercaseProductID; + } + + // ignore the names if we don't recognize them + if(pwchBannerName!=L"") + { + wcsncpy_s( pDLCData->wchBanner, pwchBannerName, MAX_BANNERNAME_SIZE); + } + + if(pwchProductName[0]!=0) + { + pDLCData->wsDisplayName=pwchProductName; + } + + pDLCData->eDLCType=eType; + + switch(eType) + { + case e_DLC_MashupPacks: + case e_DLC_TexturePacks: + DLCTextures_PackID[iConfig]=pDLCData->wsProductId; + break; + } + + if(pwchFirstSkin[0]!=0) DLCInfo_SkinName[pwchFirstSkin]=pDLCData->wsProductId; + +#ifdef _XBOX_ONE + // ignore the names, and use the product id instead + DLCInfo_Full[pDLCData->wsProductId]=pDLCData; +#else + DLCInfo_Full[pDLCData->wsDisplayName]=pDLCData; +#endif + } + app.DebugPrintf("DLCInfo - type - %d, productID - %ls, name - %ls , banner - %ls, iconfig - %d, sort index - %d\n",eType,pwchProductId, pwchProductName,pwchBannerName, iConfig, uiSortIndex); + return hr; +} +#else + +HRESULT CMinecraftApp::RegisterDLCData(char *pchDLCName, unsigned int uiSortIndex,char *pchImageURL) +{ + // on PS3 we get all the required info from the name + char chDLCType[3]; + HRESULT hr=S_OK; + DLC_INFO *pDLCData=new DLC_INFO; + ZeroMemory(pDLCData,sizeof(DLC_INFO)); + + chDLCType[0]=pchDLCName[0]; + chDLCType[1]=pchDLCName[1]; + chDLCType[2]=0; + + pDLCData->iConfig = app.GetiConfigFromName(pchDLCName); + pDLCData->uiSortIndex=uiSortIndex; + pDLCData->eDLCType = app.GetDLCTypeFromName(pchDLCName); + strcpy(pDLCData->chImageURL,pchImageURL); + //bool bIsTrialDLC = app.GetTrialFromName(pchDLCName); + + switch(pDLCData->eDLCType) + { + case e_DLC_TexturePacks: + { + char *pchName=(char *)malloc(strlen(pchDLCName)+1); + strcpy(pchName,pchDLCName); + DLCTextures_PackID[pDLCData->iConfig]=pchName; + } + break; + case e_DLC_MashupPacks: + { + char *pchName=(char *)malloc(strlen(pchDLCName)+1); + strcpy(pchName,pchDLCName); + DLCTextures_PackID[pDLCData->iConfig]=pchName; + } + break; + default: + break; + } + + app.DebugPrintf(5,"Adding DLC - %s\n",pchDLCName); + DLCInfo[pchDLCName]=pDLCData; + + // if(ullOfferID_Trial!=0ll) DLCInfo_Trial[ullOfferID_Trial]=pDLCData; + // if(ullOfferID_Full!=0ll) DLCInfo_Full[ullOfferID_Full]=pDLCData; + // if(pFirstSkin[0]!=0) DLCInfo_SkinName[pFirstSkin]=ullOfferID_Full; + + // DLCInfo[ullOfferID_Trial]=pDLCData; + + return hr; +} +#endif + + + +#if defined( __PS3__) || defined(__ORBIS__) || defined(__PSVITA__) +bool CMinecraftApp::GetDLCFullOfferIDForSkinID(const wstring &FirstSkin,ULONGLONG *pullVal) +{ + AUTO_VAR(it, DLCInfo_SkinName.find(FirstSkin)); + if( it == DLCInfo_SkinName.end() ) + { + return false; + } + else + { + *pullVal=(ULONGLONG)it->second; + return true; + } +} +bool CMinecraftApp::GetDLCNameForPackID(const int iPackID,char **ppchKeyID) +{ + AUTO_VAR(it, DLCTextures_PackID.find(iPackID)); + if( it == DLCTextures_PackID.end() ) + { + *ppchKeyID=NULL; + return false; + } + else + { + *ppchKeyID=(char *)it->second; + return true; + } +} +DLC_INFO *CMinecraftApp::GetDLCInfo(char *pchDLCName) +{ + string tempString=pchDLCName; + + if(DLCInfo.size()>0) + { + AUTO_VAR(it, DLCInfo.find(tempString)); + + if( it == DLCInfo.end() ) + { + // nothing for this + return NULL; + } + else + { + return it->second; + } + } + else return NULL; +} + +DLC_INFO *CMinecraftApp::GetDLCInfoFromTPackID(int iTPID) +{ + unordered_map::iterator it= DLCInfo.begin(); + + for(int i=0;isecond)->iConfig==iTPID) + { + return it->second; + } + ++it; + } + return NULL; +} + +DLC_INFO *CMinecraftApp::GetDLCInfo(int iIndex) +{ + unordered_map::iterator it= DLCInfo.begin(); + + for(int i=0;isecond; +} + +char *CMinecraftApp::GetDLCInfoTextures(int iIndex) +{ + unordered_map::iterator it= DLCTextures_PackID.begin(); + + for(int i=0;isecond; +} + +#elif defined _XBOX_ONE +bool CMinecraftApp::GetDLCFullOfferIDForSkinID(const wstring &FirstSkin,wstring &ProductId) +{ + AUTO_VAR(it, DLCInfo_SkinName.find(FirstSkin)); + if( it == DLCInfo_SkinName.end() ) + { + return false; + } + else + { + ProductId=it->second; + return true; + } +} +bool CMinecraftApp::GetDLCFullOfferIDForPackID(const int iPackID,wstring &ProductId) +{ + AUTO_VAR(it, DLCTextures_PackID.find(iPackID)); + if( it == DLCTextures_PackID.end() ) + { + return false; + } + else + { + ProductId=it->second; + return true; + } +} +// DLC_INFO *CMinecraftApp::GetDLCInfoForTrialOfferID(wstring &ProductId) +// { +// return NULL; +// } + +DLC_INFO *CMinecraftApp::GetDLCInfoTrialOffer(int iIndex) +{ + return NULL; +} +DLC_INFO *CMinecraftApp::GetDLCInfoFullOffer(int iIndex) +{ + unordered_map::iterator it= DLCInfo_Full.begin(); + + for(int i=0;isecond; +} +wstring CMinecraftApp::GetDLCInfoTexturesFullOffer(int iIndex) +{ + unordered_map::iterator it= DLCTextures_PackID.begin(); + + for(int i=0;isecond; +} +#else +bool CMinecraftApp::GetDLCFullOfferIDForSkinID(const wstring &FirstSkin,ULONGLONG *pullVal) +{ + AUTO_VAR(it, DLCInfo_SkinName.find(FirstSkin)); + if( it == DLCInfo_SkinName.end() ) + { + return false; + } + else + { + *pullVal=(ULONGLONG)it->second; + return true; + } +} +bool CMinecraftApp::GetDLCFullOfferIDForPackID(const int iPackID,ULONGLONG *pullVal) +{ + AUTO_VAR(it, DLCTextures_PackID.find(iPackID)); + if( it == DLCTextures_PackID.end() ) + { + *pullVal=(ULONGLONG)0; + return false; + } + else + { + *pullVal=(ULONGLONG)it->second; + return true; + } +} +DLC_INFO *CMinecraftApp::GetDLCInfoForTrialOfferID(ULONGLONG ullOfferID_Trial) +{ + //DLC_INFO *pDLCInfo=NULL; + if(DLCInfo_Trial.size()>0) + { + AUTO_VAR(it, DLCInfo_Trial.find(ullOfferID_Trial)); + + if( it == DLCInfo_Trial.end() ) + { + // nothing for this + return NULL; + } + else + { + return it->second; + } + } + else return NULL; +} + +DLC_INFO *CMinecraftApp::GetDLCInfoTrialOffer(int iIndex) +{ + unordered_map::iterator it= DLCInfo_Trial.begin(); + + for(int i=0;isecond; +} +DLC_INFO *CMinecraftApp::GetDLCInfoFullOffer(int iIndex) +{ + unordered_map::iterator it= DLCInfo_Full.begin(); + + for(int i=0;isecond; +} +ULONGLONG CMinecraftApp::GetDLCInfoTexturesFullOffer(int iIndex) +{ + unordered_map::iterator it= DLCTextures_PackID.begin(); + + for(int i=0;isecond; +} +#endif + +#ifdef _XBOX_ONE + +DLC_INFO *CMinecraftApp::GetDLCInfoForFullOfferID(WCHAR *pwchProductID) +{ + wstring wsTemp = pwchProductID; + if(DLCInfo_Full.size()>0) + { + AUTO_VAR(it, DLCInfo_Full.find(wsTemp)); + + if( it == DLCInfo_Full.end() ) + { + // nothing for this + return NULL; + } + else + { + return it->second; + } + } + else return NULL; +} +DLC_INFO *CMinecraftApp::GetDLCInfoForProductName(WCHAR *pwchProductName) +{ + unordered_map::iterator it= DLCInfo_Full.begin(); + wstring wsProductName=pwchProductName; + + for(int i=0;isecond; + if(wsProductName==pDLCInfo->wsDisplayName) + { + return pDLCInfo; + } + ++it; + } + + return NULL; +} + +#elif defined(__PS3__) || defined(__ORBIS__) || defined (__PSVITA__) +#else + +DLC_INFO *CMinecraftApp::GetDLCInfoForFullOfferID(ULONGLONG ullOfferID_Full) +{ + + if(DLCInfo_Full.size()>0) + { + AUTO_VAR(it, DLCInfo_Full.find(ullOfferID_Full)); + + if( it == DLCInfo_Full.end() ) + { + // nothing for this + return NULL; + } + else + { + return it->second; + } + } + else return NULL; +} +#endif + +void CMinecraftApp::EnterSaveNotificationSection() +{ + EnterCriticalSection(&m_saveNotificationCriticalSection); + if( m_saveNotificationDepth++ == 0 ) + { + 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 ) + { + app.SetXuiServerAction(ProfileManager.GetPrimaryPad(),eXuiServerAction_PauseServer,(void *)TRUE); + } + } + } + LeaveCriticalSection(&m_saveNotificationCriticalSection); +} + +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 ) + { + app.SetXuiServerAction(ProfileManager.GetPrimaryPad(),eXuiServerAction_PauseServer,(void *)FALSE); + } + } + } + LeaveCriticalSection(&m_saveNotificationCriticalSection); +} + + +int CMinecraftApp::RemoteSaveThreadProc( void* lpParameter ) +{ + // The game should be stopped while we are doing this, but the connections ticks may try to create some AABB's or Vec3's + AABB::UseDefaultThreadStorage(); + Vec3::UseDefaultThreadStorage(); + Compression::UseDefaultThreadStorage(); + + // 4J-PB - Xbox 360 - 163153 - [CRASH] TU17: Code: Multiplayer: During the Autosave in an online Multiplayer session, the game occasionally crashes for one or more Clients + // callstack - > if(tls->tileId != this->id) updateDefaultShape(); + // callstack - > default.exe!WaterlilyTile::getAABB(Level * level, int x, int y, int z) line 38 + 8 bytes C++ + // ... + // default.exe!CMinecraftApp::RemoteSaveThreadProc(void * lpParameter) line 6694 C++ + // host autosave, and the clients can crash on receiving handleMoveEntity when it's a tile within this thread, so need to do the tls for tiles + Tile::CreateNewThreadStorage(); + + Minecraft *pMinecraft = Minecraft::GetInstance(); + + pMinecraft->progressRenderer->progressStartNoAbort( IDS_PROGRESS_HOST_SAVING ); + pMinecraft->progressRenderer->progressStage( -1 ); + pMinecraft->progressRenderer->progressStagePercentage(0); + + while( !app.GetGameStarted() && app.GetXuiAction( ProfileManager.GetPrimaryPad() ) == eAppAction_WaitRemoteServerSaveComplete ) + { + // Tick all the games connections + pMinecraft->tickAllConnections(); + Sleep( 100 ); + } + + if( app.GetXuiAction( ProfileManager.GetPrimaryPad() ) != eAppAction_WaitRemoteServerSaveComplete ) + { + // Something cancelled us? + return ERROR_CANCELLED; + } + app.SetAction(ProfileManager.GetPrimaryPad(),eAppAction_Idle); + + ui.UpdatePlayerBasePositions(); + + Tile::ReleaseThreadStorage(); + + return S_OK; +} + +void CMinecraftApp::ExitGameFromRemoteSave( LPVOID lpParameter ) +{ + int primaryPad = ProfileManager.GetPrimaryPad(); + + UINT uiIDA[3]; + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + + ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME, uiIDA, 2, primaryPad,&CMinecraftApp::ExitGameFromRemoteSaveDialogReturned,NULL); +} + +int CMinecraftApp::ExitGameFromRemoteSaveDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + //CScene_Pause* pClass = (CScene_Pause*)pParam; + + // results switched for this dialog + if(result==C4JStorage::EMessage_ResultDecline) + { + app.SetAction(iPad,eAppAction_ExitWorld); + } + else + { +#ifndef _XBOX + // Inform fullscreen progress scene that it's not being cancelled after all + UIScene_FullscreenProgress *pScene = (UIScene_FullscreenProgress *)ui.FindScene(eUIScene_FullscreenProgress); +#ifdef __PS3__ + if(pScene!=NULL) +#else + if (pScene != nullptr) +#endif + { + pScene->SetWasCancelled(false); + } +#else + // Don't have to worry about this on Xbox +#endif + } + return 0; +} + +void CMinecraftApp::SetSpecialTutorialCompletionFlag(int iPad, int index) +{ + if(index >= 0 && index < 32 && GameSettingsA[iPad] != NULL) + { + GameSettingsA[iPad]->uiSpecialTutorialBitmask |= (1<clear(); + + if(BannedListA[iPad].pBannedList) + { + delete [] BannedListA[iPad].pBannedList; + BannedListA[iPad].pBannedList=NULL; + } + } +} + +#ifdef _XBOX_ONE +void CMinecraftApp::AddLevelToBannedLevelList(int iPad, PBANNEDLISTDATA pBannedListData, bool bWriteToTMS) +{ + PlayerUID xuid= pBannedListData->wchPlayerUID; + + AddLevelToBannedLevelList(iPad,xuid,pBannedListData->pszLevelName,bWriteToTMS); +} +#endif + +void CMinecraftApp::AddLevelToBannedLevelList(int iPad, PlayerUID xuid, char *pszLevelName, bool bWriteToTMS) +{ + // we will have retrieved the banned level list from TMS, so add this one to it and write it back to TMS + + BANNEDLISTDATA *pBannedListData = new BANNEDLISTDATA; + memset(pBannedListData,0,sizeof(BANNEDLISTDATA)); + +#ifdef _DURANGO + memcpy(&pBannedListData->wchPlayerUID, xuid.toString().c_str(), sizeof(WCHAR)*64); +#else + memcpy(&pBannedListData->xuid, &xuid, sizeof(PlayerUID)); +#endif + strcpy(pBannedListData->pszLevelName,pszLevelName); + m_vBannedListA[iPad]->push_back(pBannedListData); + + if(bWriteToTMS) + { + DWORD dwDataBytes=(DWORD)(sizeof(BANNEDLISTDATA)*m_vBannedListA[iPad]->size()); + PBANNEDLISTDATA pBannedList = (BANNEDLISTDATA *)(new CHAR [dwDataBytes]); + int iCount=0; + for(AUTO_VAR(it, m_vBannedListA[iPad]->begin()); it != m_vBannedListA[iPad]->end(); ++it) + { + PBANNEDLISTDATA pData=*it; + memcpy(&pBannedList[iCount++],pData,sizeof(BANNEDLISTDATA)); + } + + // 4J-PB - write to TMS++ now + + //bool bRes=StorageManager.WriteTMSFile(iPad,C4JStorage::eGlobalStorage_TitleUser,L"BannedList",(PBYTE)pBannedList, dwDataBytes); +#ifdef _XBOX + StorageManager.TMSPP_WriteFile(iPad,C4JStorage::eGlobalStorage_TitleUser,C4JStorage::TMS_FILETYPE_BINARY,C4JStorage::TMS_UGCTYPE_NONE,"BannedList",(PCHAR) pBannedList, dwDataBytes,NULL,NULL, 0); +#elif defined _XBOX_ONE + StorageManager.TMSPP_WriteFile(iPad,C4JStorage::eGlobalStorage_TitleUser,C4JStorage::TMS_FILETYPE_BINARY,L"BannedList",(PBYTE) pBannedList, dwDataBytes,NULL,NULL, 0); +#endif + } + // update telemetry too +} + +bool CMinecraftApp::IsInBannedLevelList(int iPad, PlayerUID xuid, char *pszLevelName) +{ + for(AUTO_VAR(it, m_vBannedListA[iPad]->begin()); it != m_vBannedListA[iPad]->end(); ++it) + { + PBANNEDLISTDATA pData=*it; +#ifdef _XBOX_ONE + PlayerUID bannedPlayerUID = pData->wchPlayerUID; + if(IsEqualXUID (bannedPlayerUID,xuid) && (strcmp(pData->pszLevelName,pszLevelName)==0)) +#else + if(IsEqualXUID (pData->xuid,xuid) && (strcmp(pData->pszLevelName,pszLevelName)==0)) +#endif + { + return true; + } + } + + return false; +} + +void CMinecraftApp::RemoveLevelFromBannedLevelList(int iPad, PlayerUID xuid, char *pszLevelName) +{ + //bool bFound=false; + //bool bRes; + + // we will have retrieved the banned level list from TMS, so remove this one from it and write it back to TMS + for(AUTO_VAR(it, m_vBannedListA[iPad]->begin()); it != m_vBannedListA[iPad]->end(); ) + { + PBANNEDLISTDATA pBannedListData = *it; + + if(pBannedListData!=NULL) + { +#ifdef _XBOX_ONE + PlayerUID bannedPlayerUID = pBannedListData->wchPlayerUID; + if(IsEqualXUID (bannedPlayerUID,xuid) && (strcmp(pBannedListData->pszLevelName,pszLevelName)==0)) +#else + if(IsEqualXUID (pBannedListData->xuid,xuid) && (strcmp(pBannedListData->pszLevelName,pszLevelName)==0)) +#endif + { + TelemetryManager->RecordUnBanLevel(iPad); + + // match found, so remove this entry + it = m_vBannedListA[iPad]->erase(it); + } + else + { + ++it; + } + } + else + { + ++it; + } + } + + DWORD dwDataBytes=(DWORD)(sizeof(BANNEDLISTDATA)*m_vBannedListA[iPad]->size()); + if(dwDataBytes==0) + { + // wipe the file +#ifdef _XBOX + StorageManager.DeleteTMSFile(iPad,C4JStorage::eGlobalStorage_TitleUser,L"BannedList"); +#elif defined _XBOX_ONE + StorageManager.TMSPP_DeleteFile(iPad,C4JStorage::eGlobalStorage_TitleUser,C4JStorage::TMS_FILETYPE_BINARY,L"BannedList",NULL,NULL, 0); +#endif + } + else + { + PBANNEDLISTDATA pBannedList = (BANNEDLISTDATA *)(new BYTE [dwDataBytes]); + + int iSize=(int)m_vBannedListA[iPad]->size(); + for(int i=0;iat(i); + + memcpy(&pBannedList[i],pBannedListData,sizeof(BANNEDLISTDATA)); + } +#ifdef _XBOX + StorageManager.WriteTMSFile(iPad,C4JStorage::eGlobalStorage_TitleUser,L"BannedList",(PBYTE)pBannedList, dwDataBytes); +#elif defined _XBOX_ONE + StorageManager.TMSPP_WriteFile(iPad,C4JStorage::eGlobalStorage_TitleUser,C4JStorage::TMS_FILETYPE_BINARY,L"BannedList",(PBYTE) pBannedList, dwDataBytes,NULL,NULL, 0); +#endif + delete [] pBannedList; + } + + // update telemetry too +} + +// function to add credits for the DLC packs +void CMinecraftApp::AddCreditText(LPCWSTR lpStr) +{ + DebugPrintf("ADDING CREDIT - %ls\n",lpStr); + // add a string from the DLC to a credits vector + SCreditTextItemDef *pCreditStruct = new SCreditTextItemDef; + pCreditStruct->m_eType=eSmallText; + pCreditStruct->m_iStringID[0]=NO_TRANSLATED_STRING; + pCreditStruct->m_iStringID[1]=NO_TRANSLATED_STRING; + pCreditStruct->m_Text=new WCHAR [wcslen(lpStr)+1]; + wcscpy((WCHAR *)pCreditStruct->m_Text,lpStr); + + vDLCCredits.push_back(pCreditStruct); +} + +bool CMinecraftApp::AlreadySeenCreditText(const wstring &wstemp) +{ + + for(unsigned int i=0;i>4; + break; + case eGameHostOption_All: + return (uiHostSettings&GAME_HOST_OPTION_BITMASK_ALL); + break; + case eGameHostOption_Tutorial: + // special case - tutorial is offline, but we want the gamertag option, and set Easy mode, structures on, fire on, tnt on, pvp on, trust players on + return ((uiHostSettings&GAME_HOST_OPTION_BITMASK_GAMERTAGS)| + GAME_HOST_OPTION_BITMASK_TRUSTPLAYERS| + GAME_HOST_OPTION_BITMASK_FIRESPREADS| + GAME_HOST_OPTION_BITMASK_TNT| + GAME_HOST_OPTION_BITMASK_PVP| + GAME_HOST_OPTION_BITMASK_STRUCTURES|1); + break; + case eGameHostOption_LevelType: + return (uiHostSettings&GAME_HOST_OPTION_BITMASK_LEVELTYPE); + break; + case eGameHostOption_Structures: + return (uiHostSettings&GAME_HOST_OPTION_BITMASK_STRUCTURES); + break; + case eGameHostOption_BonusChest: + return (uiHostSettings&GAME_HOST_OPTION_BITMASK_BONUSCHEST); + break; + case eGameHostOption_HasBeenInCreative: + return (uiHostSettings&GAME_HOST_OPTION_BITMASK_BEENINCREATIVE); + break; + case eGameHostOption_PvP: + return (uiHostSettings&GAME_HOST_OPTION_BITMASK_PVP); + break; + case eGameHostOption_TrustPlayers: + return (uiHostSettings&GAME_HOST_OPTION_BITMASK_TRUSTPLAYERS); + break; + case eGameHostOption_TNT: + return (uiHostSettings&GAME_HOST_OPTION_BITMASK_TNT); + break; + case eGameHostOption_FireSpreads: + return (uiHostSettings&GAME_HOST_OPTION_BITMASK_FIRESPREADS); + break; + case eGameHostOption_CheatsEnabled: + return (uiHostSettings&(GAME_HOST_OPTION_BITMASK_HOSTFLY|GAME_HOST_OPTION_BITMASK_HOSTHUNGER|GAME_HOST_OPTION_BITMASK_HOSTINVISIBLE)); + break; + case eGameHostOption_HostCanFly: + return (uiHostSettings&GAME_HOST_OPTION_BITMASK_HOSTFLY); + break; + case eGameHostOption_HostCanChangeHunger: + return (uiHostSettings&GAME_HOST_OPTION_BITMASK_HOSTHUNGER); + break; + case eGameHostOption_HostCanBeInvisible: + return (uiHostSettings&GAME_HOST_OPTION_BITMASK_HOSTINVISIBLE); + break; + case eGameHostOption_BedrockFog: + return (uiHostSettings&GAME_HOST_OPTION_BITMASK_BEDROCKFOG); + break; + case eGameHostOption_DisableSaving: + return (uiHostSettings&GAME_HOST_OPTION_BITMASK_DISABLESAVE); + break; + case eGameHostOption_WasntSaveOwner: + return (uiHostSettings&GAME_HOST_OPTION_BITMASK_NOTOWNER); + case eGameHostOption_WorldSize: + return (uiHostSettings&GAME_HOST_OPTION_BITMASK_WORLDSIZE) >> 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; +} + +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_WasntSaveOwner) || + !app.GetGameHostOption(eGameHostOption_MobGriefing) || + app.GetGameHostOption(eGameHostOption_KeepInventory) || + !app.GetGameHostOption(eGameHostOption_DoMobSpawning) || + (!app.GetGameHostOption(eGameHostOption_DoDaylightCycle) && !isTutorial ) + ); +} + +void CMinecraftApp::processSchematics(LevelChunk *levelChunk) +{ + m_gameRules.processSchematics(levelChunk); +} + +void CMinecraftApp::processSchematicsLighting(LevelChunk *levelChunk) +{ + m_gameRules.processSchematicsLighting(levelChunk); +} + +void CMinecraftApp::loadDefaultGameRules() +{ + m_gameRules.loadDefaultGameRules(); +} + +void CMinecraftApp::setLevelGenerationOptions(LevelGenerationOptions *levelGen) +{ + m_gameRules.setLevelGenerationOptions(levelGen); +} + +LPCWSTR CMinecraftApp::GetGameRulesString(const wstring &key) +{ + return m_gameRules.GetGameRulesString(key); +} + +unsigned char CMinecraftApp::m_szPNG[8]= +{ + 137,80,78,71,13,10,26,10 +}; + +#define PNG_TAG_tEXt 0x74455874 + +unsigned int CMinecraftApp::FromBigEndian(unsigned int uiValue) +{ +#if defined(__PS3__) || defined(_XBOX) + // Keep it in big endian + return uiValue; +#else + unsigned int uiReturn = ( ( uiValue >> 24 ) & 0x000000ff ) | + ( ( uiValue >> 8 ) & 0x0000ff00 ) | + ( ( uiValue << 8 ) & 0x00ff0000 ) | + ( ( uiValue << 24 ) & 0xff000000 ); + return uiReturn; +#endif +} + +void CMinecraftApp::GetImageTextData(PBYTE pbImageData, DWORD dwImageBytes,unsigned char *pszSeed,unsigned int &uiHostOptions,bool &bHostOptionsRead,DWORD &uiTexturePack) +{ + unsigned char *ucPtr=pbImageData; + unsigned int uiCount=0; + unsigned int uiChunkLen; + unsigned int uiChunkType; + unsigned int uiCRC; + char szKeyword[80]; + + // check it's a png + for(int i=0;i<8;i++) + { + if(m_szPNG[i]!=ucPtr[i]) return; + } + + uiCount+=8; + + while(uiCount> std::hex >> uiHostOptions; + } + else if(strcmp(szKeyword,"4J_TEXTUREPACK")==0) + { + // read the texture pack value + unsigned int uiValueC=0; + unsigned char pszTexturePack[9]; // Hex representation of unsigned int + ZeroMemory(&pszTexturePack,9); + while(*pszKeyword!=0 && (pszKeyword < ucPtr + uiCount + uiChunkLen) && uiValueC < 8) + { + pszTexturePack[uiValueC++]=*pszKeyword; + pszKeyword++; + } + + std::stringstream ss; + ss << pszTexturePack; + ss >> std::hex >> uiTexturePack; + } + } + } + uiCount+=uiChunkLen; + uiCRC=*(unsigned int*)&ucPtr[uiCount]; + uiCRC=FromBigEndian(uiCRC); + uiCount+=sizeof(int); + } + + return; +} + +unsigned int CMinecraftApp::CreateImageTextData(PBYTE bTextMetadata, __int64 seed, bool hasSeed, unsigned int uiHostOptions, unsigned int uiTexturePackId) +{ + int iTextMetadataBytes = 0; + if(hasSeed) + { + strcpy((char *)bTextMetadata,"4J_SEED"); + _i64toa_s(seed,(char *)&bTextMetadata[8],42,10); + + // get the length + iTextMetadataBytes+=8; + while(bTextMetadata[iTextMetadataBytes]!=0) iTextMetadataBytes++; + ++iTextMetadataBytes; // Add a null terminator at the end of the seed value + } + + // Save the host options that this world was last played with + strcpy((char *)&bTextMetadata[iTextMetadataBytes],"4J_HOSTOPTIONS"); + _itoa_s(uiHostOptions,(char *)&bTextMetadata[iTextMetadataBytes+15],9,16); + + iTextMetadataBytes += 15; + while(bTextMetadata[iTextMetadataBytes]!=0) iTextMetadataBytes++; + ++iTextMetadataBytes; // Add a null terminator at the end of the host options value + + // Save the texture pack id + strcpy((char *)&bTextMetadata[iTextMetadataBytes],"4J_TEXTUREPACK"); + _itoa_s(uiTexturePackId,(char *)&bTextMetadata[iTextMetadataBytes+15],9,16); + + iTextMetadataBytes += 15; + while(bTextMetadata[iTextMetadataBytes]!=0) iTextMetadataBytes++; + + return iTextMetadataBytes; +} + +void CMinecraftApp::AddTerrainFeaturePosition(_eTerrainFeatureType eFeatureType,int x,int z) +{ + // check we don't already have this in + for(AUTO_VAR(it, m_vTerrainFeatures.begin()); it < m_vTerrainFeatures.end(); ++it) + { + FEATURE_DATA *pFeatureData=*it; + + if((pFeatureData->eTerrainFeature==eFeatureType) &&(pFeatureData->x==x) && (pFeatureData->z==z)) return; + } + + FEATURE_DATA *pFeatureData= new FEATURE_DATA; + pFeatureData->eTerrainFeature=eFeatureType; + pFeatureData->x=x; + pFeatureData->z=z; + + m_vTerrainFeatures.push_back(pFeatureData); +} + +_eTerrainFeatureType CMinecraftApp::IsTerrainFeature(int x,int z) +{ + for(AUTO_VAR(it, m_vTerrainFeatures.begin()); it < m_vTerrainFeatures.end(); ++it) + { + FEATURE_DATA *pFeatureData=*it; + + if((pFeatureData->x==x) && (pFeatureData->z==z)) return pFeatureData->eTerrainFeature; + } + + return eTerrainFeature_None; +} + +bool CMinecraftApp::GetTerrainFeaturePosition(_eTerrainFeatureType eType,int *pX, int *pZ) +{ + for(AUTO_VAR(it, m_vTerrainFeatures.begin()); it < m_vTerrainFeatures.end(); ++it) + { + FEATURE_DATA *pFeatureData=*it; + + if(pFeatureData->eTerrainFeature==eType) + { + *pX=pFeatureData->x; + *pZ=pFeatureData->z; + return true; + } + } + + return false; +} + +void CMinecraftApp::ClearTerrainFeaturePosition() +{ + FEATURE_DATA *pFeatureData; + while(m_vTerrainFeatures.size()>0) + { + pFeatureData = m_vTerrainFeatures.back(); + m_vTerrainFeatures.pop_back(); + delete pFeatureData; + } +} + +void CMinecraftApp::UpdatePlayerInfo(BYTE networkSmallId, SHORT playerColourIndex, unsigned int playerGamePrivileges) +{ + for(unsigned int i = 0; i < MINECRAFT_NET_MAX_PLAYERS; ++i) + { + if(m_playerColours[i]==networkSmallId) + { + m_playerColours[i] = 0; + m_playerGamePrivileges[i] = 0; + } + } + if(playerColourIndex >=0 && playerColourIndex < MINECRAFT_NET_MAX_PLAYERS) + { + m_playerColours[playerColourIndex] = networkSmallId; + m_playerGamePrivileges[playerColourIndex] = playerGamePrivileges; + } +} + +short CMinecraftApp::GetPlayerColour(BYTE networkSmallId) +{ + short index = -1; + for(unsigned int i = 0; i < MINECRAFT_NET_MAX_PLAYERS; ++i) + { + if(m_playerColours[i]==networkSmallId) + { + index = i; + break; + } + } + return index; +} + + +unsigned int CMinecraftApp::GetPlayerPrivileges(BYTE networkSmallId) +{ + unsigned int privileges = 0; + for(unsigned int i = 0; i < MINECRAFT_NET_MAX_PLAYERS; ++i) + { + if(m_playerColours[i]==networkSmallId) + { + privileges = m_playerGamePrivileges[i]; + break; + } + } + return privileges; +} + +wstring CMinecraftApp::getEntityName(eINSTANCEOF type) +{ + switch(type) + { + case eTYPE_WOLF: + return app.GetString(IDS_WOLF); + case eTYPE_CREEPER: + return app.GetString(IDS_CREEPER); + case eTYPE_SKELETON: + return app.GetString(IDS_SKELETON); + case eTYPE_SPIDER: + return app.GetString(IDS_SPIDER); + case eTYPE_ZOMBIE: + return app.GetString(IDS_ZOMBIE); + case eTYPE_PIGZOMBIE: + return app.GetString(IDS_PIGZOMBIE); + case eTYPE_ENDERMAN: + return app.GetString(IDS_ENDERMAN); + case eTYPE_SILVERFISH: + return app.GetString(IDS_SILVERFISH); + case eTYPE_CAVESPIDER: + return app.GetString(IDS_CAVE_SPIDER); + case eTYPE_GHAST: + return app.GetString(IDS_GHAST); + case eTYPE_SLIME: + return app.GetString(IDS_SLIME); + case eTYPE_ARROW: + return app.GetString(IDS_ITEM_ARROW); + case eTYPE_ENDERDRAGON: + return app.GetString(IDS_ENDERDRAGON); + case eTYPE_BLAZE: + return app.GetString(IDS_BLAZE); + case eTYPE_LAVASLIME: + return app.GetString(IDS_LAVA_SLIME); + // 4J-PB - fix for #107167 - Customer Encountered: TU12: Content: UI: There is no information what killed Player after being slain by Iron Golem. + case eTYPE_VILLAGERGOLEM: + return app.GetString(IDS_IRONGOLEM); + 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""; +} + +DWORD CMinecraftApp::m_dwContentTypeA[e_Marketplace_MAX]= +{ + XMARKETPLACE_OFFERING_TYPE_CONTENT, // e_DLC_SkinPack, e_DLC_TexturePacks, e_DLC_MashupPacks +#ifndef _XBOX_ONE + XMARKETPLACE_OFFERING_TYPE_THEME, // e_DLC_Themes + XMARKETPLACE_OFFERING_TYPE_AVATARITEM, // e_DLC_AvatarItems + XMARKETPLACE_OFFERING_TYPE_TILE, // e_DLC_Gamerpics +#endif +}; + +unsigned int CMinecraftApp::AddDLCRequest(eDLCMarketplaceType eType, bool bPromote) +{ + // lock access + EnterCriticalSection(&csDLCDownloadQueue); + + // If it's already in there, promote it to the top of the list + int iPosition=0; + for(AUTO_VAR(it, m_DLCDownloadQueue.begin()); it != m_DLCDownloadQueue.end(); ++it) + { + DLCRequest *pCurrent = *it; + + if(pCurrent->dwType==m_dwContentTypeA[eType]) + { + // already got this in the list + if(pCurrent->eState == e_DLC_ContentState_Retrieving || pCurrent->eState == e_DLC_ContentState_Retrieved) + { + // already retrieved this + LeaveCriticalSection(&csDLCDownloadQueue); + return 0; + } + else + { + // promote + if(bPromote) + { + m_DLCDownloadQueue.erase(m_DLCDownloadQueue.begin()+iPosition); + m_DLCDownloadQueue.insert(m_DLCDownloadQueue.begin(),pCurrent); + } + LeaveCriticalSection(&csDLCDownloadQueue); + return 0; + } + } + iPosition++; + } + + DLCRequest *pDLCreq = new DLCRequest; + pDLCreq->dwType=m_dwContentTypeA[eType]; + pDLCreq->eState=e_DLC_ContentState_Idle; + + m_DLCDownloadQueue.push_back(pDLCreq); + + m_bAllDLCContentRetrieved=false; + LeaveCriticalSection(&csDLCDownloadQueue); + + app.DebugPrintf("[Consoles_App] Added DLC request.\n"); + return 1; +} + +unsigned int CMinecraftApp::AddTMSPPFileTypeRequest(eDLCContentType eType, bool bPromote) +{ +#if !defined(__PS3__) && !defined(__ORBIS__) && !defined(__PSVITA__) + // lock access + EnterCriticalSection(&csTMSPPDownloadQueue); + + // If it's already in there, promote it to the top of the list + int iPosition=0; + //ignore promoting for now + /* + bool bPromoted=false; + + + for(AUTO_VAR(it, m_TMSPPDownloadQueue.begin()); it != m_TMSPPDownloadQueue.end(); ++it) + { + TMSPPRequest *pCurrent = *it; + + if(pCurrent->eType==eType) + { + if(!(pCurrent->eState == e_TMS_ContentState_Retrieving || pCurrent->eState == e_TMS_ContentState_Retrieved)) + { + // promote + if(bPromote) + { + m_TMSPPDownloadQueue.erase(m_TMSPPDownloadQueue.begin()+iPosition); + m_TMSPPDownloadQueue.insert(m_TMSPPDownloadQueue.begin(),pCurrent); + bPromoted=true; + } + } + } + iPosition++; + } + + if(bPromoted) + { + // re-ordered the list, so leave now + LeaveCriticalSection(&csTMSPPDownloadQueue); + return 0; + } + */ + + // special case for data files (not image files) + if(eType==e_DLC_TexturePackData) + { + + + int iCount=GetDLCInfoFullOffersCount(); + + for(int i=0;ieDLCType==e_DLC_TexturePacks) || (pDLC->eDLCType==e_DLC_MashupPacks)) + { + // first check if the image is already in the memory textures, since we might be loading some from the Title Update partition + if(pDLC->wchDataFile[0]!=0) + { + //WCHAR *cString = pDLC->wchDataFile; + // 4J-PB - shouldn't check this here - let the TMS files override it, so if they are on TMS, we'll take them first + //int iIndex = app.GetLocalTMSFileIndex(pDLC->wchDataFile,true); + + //if(iIndex!=-1) + { + bool bPresent = app.IsFileInTPD(pDLC->iConfig); + + if(!bPresent) + { + // this may already be present in the vector because of a previous trial/full offer + + bool bAlreadyInQueue=false; + for(AUTO_VAR(it, m_TMSPPDownloadQueue.begin()); it != m_TMSPPDownloadQueue.end(); ++it) + { + TMSPPRequest *pCurrent = *it; + + if(wcscmp(pDLC->wchDataFile,pCurrent->wchFilename)==0) + { + bAlreadyInQueue=true; + break; + } + } + + if(!bAlreadyInQueue) + { + TMSPPRequest *pTMSPPreq = new TMSPPRequest; + + pTMSPPreq->CallbackFunc=&CMinecraftApp::TMSPPFileReturned; + pTMSPPreq->lpCallbackParam=this; + pTMSPPreq->eStorageFacility=C4JStorage::eGlobalStorage_Title; + pTMSPPreq->eFileTypeVal=C4JStorage::TMS_FILETYPE_BINARY; + memcpy(pTMSPPreq->wchFilename,pDLC->wchDataFile,sizeof(WCHAR)*MAX_BANNERNAME_SIZE); + pTMSPPreq->eType=e_DLC_TexturePackData; + pTMSPPreq->eState=e_TMS_ContentState_Queued; + m_bAllTMSContentRetrieved=false; + m_TMSPPDownloadQueue.push_back(pTMSPPreq); + } + } + else + { + app.DebugPrintf("Texture data already present in the TPD\n"); + } + } + } + } + } + } + else + { // for all the files of type eType, add them to the download list + + // run through the trial offers first, then the full offers. Any duplicates won't be added to the download queue + int iCount; +#ifdef _XBOX // Only trial offers on Xbox 360 + iCount=GetDLCInfoTrialOffersCount(); + for(int i=0;ieDLCType==eType) + { + + WCHAR *cString = pDLC->wchBanner; + + // 4J-PB - shouldn't check this here - let the TMS files override it, so if they are on TMS, we'll take them first + // is the file in the TMS XZP? + //int iIndex = app.GetLocalTMSFileIndex(cString,true); + + //if(iIndex!=-1) + { + bool bPresent = app.IsFileInMemoryTextures(cString); + + if(!bPresent) // retrieve it from TMSPP + { + bool bAlreadyInQueue=false; + for(AUTO_VAR(it, m_TMSPPDownloadQueue.begin()); it != m_TMSPPDownloadQueue.end(); ++it) + { + TMSPPRequest *pCurrent = *it; + + if(wcscmp(pDLC->wchBanner,pCurrent->wchFilename)==0) + { + bAlreadyInQueue=true; + break; + } + } + + if(!bAlreadyInQueue) + { + TMSPPRequest *pTMSPPreq = new TMSPPRequest; + + pTMSPPreq->CallbackFunc=&CMinecraftApp::TMSPPFileReturned; + pTMSPPreq->lpCallbackParam=this; + pTMSPPreq->eStorageFacility=C4JStorage::eGlobalStorage_Title; + pTMSPPreq->eFileTypeVal=C4JStorage::TMS_FILETYPE_BINARY; + //wcstombs(pTMSPPreq->szFilename,pDLC->wchBanner,MAX_TMSFILENAME_SIZE); + memcpy(pTMSPPreq->wchFilename,pDLC->wchBanner,sizeof(WCHAR)*MAX_BANNERNAME_SIZE); + pTMSPPreq->eType=eType; + pTMSPPreq->eState=e_TMS_ContentState_Queued; + + m_bAllTMSContentRetrieved=false; + m_TMSPPDownloadQueue.push_back(pTMSPPreq); + app.DebugPrintf("===m_TMSPPDownloadQueue Adding %ls, q size is %d\n",pTMSPPreq->wchFilename,m_TMSPPDownloadQueue.size()); + } + } + } + } + } +#endif + // and the full offers + + iCount=GetDLCInfoFullOffersCount(); + for(int i=0;iwchType,wchDLCTypeNames[eType])==0) + if(pDLC->eDLCType==eType) + { + // first check if the image is already in the memory textures, since we might be loading some from the Title Update partition + + WCHAR *cString = pDLC->wchBanner; + // 4J-PB - shouldn't check this here - let the TMS files override it, so if they are on TMS, we'll take them first + //int iIndex = app.GetLocalTMSFileIndex(cString,true); + + //if(iIndex!=-1) + { + bool bPresent = app.IsFileInMemoryTextures(cString); + + if(!bPresent) + { + // this may already be present in the vector because of a previous trial/full offer + + bool bAlreadyInQueue=false; + for(AUTO_VAR(it, m_TMSPPDownloadQueue.begin()); it != m_TMSPPDownloadQueue.end(); ++it) + { + TMSPPRequest *pCurrent = *it; + + if(wcscmp(pDLC->wchBanner,pCurrent->wchFilename)==0) + { + bAlreadyInQueue=true; + break; + } + } + + if(!bAlreadyInQueue) + { + //app.DebugPrintf("Adding a request to the TMSPP download queue - %ls\n",pDLC->wchBanner); + TMSPPRequest *pTMSPPreq = new TMSPPRequest; + ZeroMemory(pTMSPPreq,sizeof(TMSPPRequest)); + + pTMSPPreq->CallbackFunc=&CMinecraftApp::TMSPPFileReturned; + pTMSPPreq->lpCallbackParam=this; + // 4J-PB - testing for now + //pTMSPPreq->eStorageFacility=C4JStorage::eGlobalStorage_TitleUser; + pTMSPPreq->eStorageFacility=C4JStorage::eGlobalStorage_Title; + pTMSPPreq->eFileTypeVal=C4JStorage::TMS_FILETYPE_BINARY; + //wcstombs(pTMSPPreq->szFilename,pDLC->wchBanner,MAX_TMSFILENAME_SIZE); + + memcpy(pTMSPPreq->wchFilename,pDLC->wchBanner,sizeof(WCHAR)*MAX_BANNERNAME_SIZE); + pTMSPPreq->eType=eType; + pTMSPPreq->eState=e_TMS_ContentState_Queued; + m_bAllTMSContentRetrieved=false; + m_TMSPPDownloadQueue.push_back(pTMSPPreq); + app.DebugPrintf("===m_TMSPPDownloadQueue Adding %ls, q size is %d\n",pTMSPPreq->wchFilename,m_TMSPPDownloadQueue.size()); + } + } + } + } + } + } + + LeaveCriticalSection(&csTMSPPDownloadQueue); +#endif + return 1; +} + +bool CMinecraftApp::CheckTMSDLCCanStop() +{ + EnterCriticalSection(&csTMSPPDownloadQueue); + for(AUTO_VAR(it, m_TMSPPDownloadQueue.begin()); it != m_TMSPPDownloadQueue.end(); ++it) + { + TMSPPRequest *pCurrent = *it; + + if(pCurrent->eState==e_TMS_ContentState_Retrieving) + { + LeaveCriticalSection(&csTMSPPDownloadQueue); + return false; + } + } + LeaveCriticalSection(&csTMSPPDownloadQueue); + + return true; +} + + +bool CMinecraftApp::RetrieveNextDLCContent() +{ + // If there's already a retrieve in progress, quit + // we may have re-ordered the list, so need to check every item + + // is there a primary player and a network connection? + int primPad = ProfileManager.GetPrimaryPad(); + if ( primPad == -1 || !ProfileManager.IsSignedInLive(primPad) ) + { + return true; // 4J-JEV: We need to wait until the primary player is online. + } + + EnterCriticalSection(&csDLCDownloadQueue); + for(AUTO_VAR(it, m_DLCDownloadQueue.begin()); it != m_DLCDownloadQueue.end(); ++it) + { + DLCRequest *pCurrent = *it; + + if(pCurrent->eState==e_DLC_ContentState_Retrieving) + { + LeaveCriticalSection(&csDLCDownloadQueue); + return true; + } + } + + // Now look for the next retrieval + for(AUTO_VAR(it, m_DLCDownloadQueue.begin()); it != m_DLCDownloadQueue.end(); ++it) + { + DLCRequest *pCurrent = *it; + + if(pCurrent->eState==e_DLC_ContentState_Idle) + { +#ifdef _DEBUG + app.DebugPrintf("RetrieveNextDLCContent - type = %d\n",pCurrent->dwType); +#endif + + C4JStorage::EDLCStatus status = StorageManager.GetDLCOffers(ProfileManager.GetPrimaryPad(), &CMinecraftApp::DLCOffersReturned, this, pCurrent->dwType); + if(status==C4JStorage::EDLC_Pending) + { + pCurrent->eState=e_DLC_ContentState_Retrieving; + } + else + { + // no content of this type, or some other problem + app.DebugPrintf("RetrieveNextDLCContent - PROBLEM\n"); + pCurrent->eState=e_DLC_ContentState_Retrieved; + } + LeaveCriticalSection(&csDLCDownloadQueue); + return true; + } + } + LeaveCriticalSection(&csDLCDownloadQueue); + + app.DebugPrintf("[Consoles_App] Finished downloading dlc content.\n"); + return false; +} + +#if !defined(__PS3__) && !defined(__ORBIS__) && !defined(__PSVITA__) +#ifdef _XBOX_ONE +int CMinecraftApp::TMSPPFileReturned(LPVOID pParam,int iPad,int iUserData,LPVOID lpvData, WCHAR* wchFilename) +{ + C4JStorage::PTMSPP_FILEDATA pFileData=(C4JStorage::PTMSPP_FILEDATA)lpvData; +#else +int CMinecraftApp::TMSPPFileReturned(LPVOID pParam,int iPad,int iUserData,C4JStorage::PTMSPP_FILEDATA pFileData, LPCSTR szFilename) +{ +#endif + + CMinecraftApp* pClass = (CMinecraftApp *) pParam; + + // find the right one in the vector + EnterCriticalSection(&pClass->csTMSPPDownloadQueue); + for(AUTO_VAR(it, pClass->m_TMSPPDownloadQueue.begin()); it != pClass->m_TMSPPDownloadQueue.end(); ++it) + { + TMSPPRequest *pCurrent = *it; +#if defined(_XBOX) || defined(_WINDOWS64) + char szFile[MAX_TMSFILENAME_SIZE]; + wcstombs(szFile,pCurrent->wchFilename,MAX_TMSFILENAME_SIZE); + + + if(strcmp(szFilename,szFile)==0) +#elif _XBOX_ONE + if(wcscmp(wchFilename,pCurrent->wchFilename)==0) +#endif + { + // set this to retrieved whether it found it or not + pCurrent->eState=e_TMS_ContentState_Retrieved; + + if(pFileData!=NULL) + { + +#ifdef _XBOX_ONE + + + switch(pCurrent->eType) + { + case e_DLC_TexturePackData: + { + // 4J-PB - we need to allocate memory for the file data and copy into it, since the current data is a reference into the blob download memory + PBYTE pbData = new BYTE [pFileData->dwSize]; + memcpy(pbData,pFileData->pbData,pFileData->dwSize); + + pClass->m_vTMSPPData.push_back(pbData); + app.DebugPrintf("Got texturepack data\n"); + // get the config value for the texture pack + int iConfig=app.GetTPConfigVal(pCurrent->wchFilename); + app.AddMemoryTPDFile(iConfig, pbData, pFileData->dwSize); + } + break; + default: + // 4J-PB - check the data is an image + if(pFileData->pbData[0]==0x89) + { + // 4J-PB - we need to allocate memory for the file data and copy into it, since the current data is a reference into the blob download memory + PBYTE pbData = new BYTE [pFileData->dwSize]; + memcpy(pbData,pFileData->pbData,pFileData->dwSize); + + pClass->m_vTMSPPData.push_back(pbData); + app.DebugPrintf("Got image data - %ls\n",pCurrent->wchFilename); + app.AddMemoryTextureFile(pCurrent->wchFilename, pbData, pFileData->dwSize); + } + else + { + app.DebugPrintf("Got image data, but it's not a png - %ls\n",pCurrent->wchFilename); + } + break; + } + +#else + switch(pCurrent->eType) + { + case e_DLC_TexturePackData: + { + app.DebugPrintf("--- Got texturepack data %ls\n",pCurrent->wchFilename); + // get the config value for the texture pack + int iConfig=app.GetTPConfigVal(pCurrent->wchFilename); + app.AddMemoryTPDFile(iConfig, pFileData->pbData, pFileData->dwSize); + } + break; + default: + app.DebugPrintf("--- Got image data - %ls\n",pCurrent->wchFilename); + app.AddMemoryTextureFile(pCurrent->wchFilename, pFileData->pbData, pFileData->dwSize); + break; + } +#endif + } + else + { +#ifdef _XBOX_ONE + app.DebugPrintf("TMSImageReturned failed (%ls)...\n",wchFilename); +#else + app.DebugPrintf("TMSImageReturned failed (%s)...\n",szFilename); +#endif + } + break; + } + + } + LeaveCriticalSection(&pClass->csTMSPPDownloadQueue); + + return 0; +} +#endif + +bool CMinecraftApp::RetrieveNextTMSPPContent() +{ +#if defined _XBOX || defined _XBOX_ONE + // If there's already a retrieve in progress, quit + // we may have re-ordered the list, so need to check every item + + // is there a primary player and a network connection? + if(ProfileManager.GetPrimaryPad()==-1) return false; + + if(ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad())==false) return false; + + EnterCriticalSection(&csTMSPPDownloadQueue); + for(AUTO_VAR(it, m_TMSPPDownloadQueue.begin()); it != m_TMSPPDownloadQueue.end(); ++it) + { + TMSPPRequest *pCurrent = *it; + + if(pCurrent->eState==e_TMS_ContentState_Retrieving) + { + app.DebugPrintf("."); + LeaveCriticalSection(&csTMSPPDownloadQueue); + return true; + } + } + + // Now look for the next retrieval + for(AUTO_VAR(it, m_TMSPPDownloadQueue.begin()); it != m_TMSPPDownloadQueue.end(); ++it) + { + TMSPPRequest *pCurrent = *it; + + if(pCurrent->eState==e_TMS_ContentState_Queued) + { + // 4J-PB - the file may be in the local TMS files, but try to retrieve it from the remote TMS in case it's been changed. If it's not in the list of TMS files, this will + // return right away with a ETMSStatus_Fail_ReadDetailsNotRetrieved +#ifdef _XBOX + char szFilename[MAX_TMSFILENAME_SIZE]; + wcstombs(szFilename,pCurrent->wchFilename,MAX_TMSFILENAME_SIZE); + + app.DebugPrintf("\nRetrieveNextTMSPPContent - type = %d, %s\n",pCurrent->eType,szFilename); + + C4JStorage::ETMSStatus status=StorageManager.TMSPP_ReadFile(ProfileManager.GetPrimaryPad(),pCurrent->eStorageFacility,pCurrent->eFileTypeVal,szFilename,pCurrent->CallbackFunc,this); + switch(status) + { + case C4JStorage::ETMSStatus_Pending: + pCurrent->eState=e_TMS_ContentState_Retrieving; + break; + case C4JStorage::ETMSStatus_Idle: + pCurrent->eState=e_TMS_ContentState_Retrieved; + break; + case C4JStorage::ETMSStatus_Fail_ReadInProgress: + case C4JStorage::ETMSStatus_ReadInProgress: + pCurrent->eState=e_TMS_ContentState_Retrieving; + if(pCurrent->eState==C4JStorage::ETMSStatus_Fail_ReadInProgress) + { + app.DebugPrintf("TMSPP_ReadFile failed - read in progress\n"); + Sleep(50); + LeaveCriticalSection(&csTMSPPDownloadQueue); + return false; + } + break; + default: + pCurrent->eState=e_TMS_ContentState_Retrieved; + break; + } +#else + eTitleStorageState status; + app.DebugPrintf("RetrieveNextTMSPPContent - type = %d, %ls\n",pCurrent->eType,pCurrent->wchFilename); + //eTitleStorageState status=StorageManager.TMSPP_ReadFile(ProfileManager.GetPrimaryPad(),pCurrent->eStorageFacility,pCurrent->eFileTypeVal,pCurrent->wchFilename,pCurrent->CallbackFunc,this,0); + if(0)//wcscmp(pCurrent->wchFilename,L"TP01.png")==0) + { + // TP01 fails because the blob size returned is bigger than the global metadata says it should be + status=eTitleStorage_readerror; + } + else + { + status=StorageManager.TMSPP_ReadFile(ProfileManager.GetPrimaryPad(),pCurrent->eStorageFacility,pCurrent->eFileTypeVal,pCurrent->wchFilename,pCurrent->CallbackFunc,this,0); + } + switch(status) + { + case eTitleStorage_pending: + pCurrent->eState=e_TMS_ContentState_Retrieving; + break; + case eTitleStorage_idle: + pCurrent->eState=e_TMS_ContentState_Retrieved; + break; + case eTitleStorage_busy: + // try again next time + { + app.DebugPrintf("@@@@@@@@@@@@@@@@@ TMSPP_ReadFile failed - busy (probably reading already)\n"); + Sleep(50); + LeaveCriticalSection(&csTMSPPDownloadQueue); + return false; + } + break; + default: + pCurrent->eState=e_TMS_ContentState_Retrieved; + break; + } +#endif + + + + LeaveCriticalSection(&csTMSPPDownloadQueue); + return true; + } + } + + LeaveCriticalSection(&csTMSPPDownloadQueue); + +#endif + return false; +} + +void CMinecraftApp::TickDLCOffersRetrieved() +{ + if(!m_bAllDLCContentRetrieved) + { + if (!app.RetrieveNextDLCContent()) + { + app.DebugPrintf("[Consoles_App] All content retrieved.\n"); + m_bAllDLCContentRetrieved=true; + } + } +} +void CMinecraftApp::ClearAndResetDLCDownloadQueue() +{ + app.DebugPrintf("[Consoles_App] Clear and reset download queue.\n"); + + int iPosition=0; + EnterCriticalSection(&csTMSPPDownloadQueue); + for(AUTO_VAR(it, m_DLCDownloadQueue.begin()); it != m_DLCDownloadQueue.end(); ++it) + { + DLCRequest *pCurrent = *it; + + delete pCurrent; + iPosition++; + } + m_DLCDownloadQueue.clear(); + m_bAllDLCContentRetrieved=true; + LeaveCriticalSection(&csTMSPPDownloadQueue); +} + +void CMinecraftApp::TickTMSPPFilesRetrieved() +{ + if(m_bTickTMSDLCFiles && !m_bAllTMSContentRetrieved) + { + if(app.RetrieveNextTMSPPContent()==false) + { + m_bAllTMSContentRetrieved=true; + } + } +} +void CMinecraftApp::ClearTMSPPFilesRetrieved() +{ + int iPosition=0; + EnterCriticalSection(&csTMSPPDownloadQueue); + for(AUTO_VAR(it, m_TMSPPDownloadQueue.begin()); it != m_TMSPPDownloadQueue.end(); ++it) + { + TMSPPRequest *pCurrent = *it; + + delete pCurrent; + iPosition++; + } + m_TMSPPDownloadQueue.clear(); + m_bAllTMSContentRetrieved=true; + LeaveCriticalSection(&csTMSPPDownloadQueue); +} + +int CMinecraftApp::DLCOffersReturned(void *pParam, int iOfferC, DWORD dwType, int iPad) +{ + CMinecraftApp* pClass = (CMinecraftApp *) pParam; + + // find the right one in the vector + EnterCriticalSection(&pClass->csTMSPPDownloadQueue); + for(AUTO_VAR(it, pClass->m_DLCDownloadQueue.begin()); it != pClass->m_DLCDownloadQueue.end(); ++it) + { + DLCRequest *pCurrent = *it; + + // avatar items are coming back as type Content, so we can't trust the type setting + if(pCurrent->dwType==dwType) + { + pClass->m_iDLCOfferC = iOfferC; + app.DebugPrintf("DLCOffersReturned - type %d, count %d - setting to retrieved\n",dwType,iOfferC); + pCurrent->eState=e_DLC_ContentState_Retrieved; + break; + } + } + LeaveCriticalSection(&pClass->csTMSPPDownloadQueue); + return 0; +} + +eDLCContentType CMinecraftApp::Find_eDLCContentType(DWORD dwType) +{ + for(int i=0;idwType==m_dwContentTypeA[eType]) && (pCurrent->eState==e_DLC_ContentState_Retrieved)) + { + LeaveCriticalSection(&csDLCDownloadQueue); + return true; + } + } + LeaveCriticalSection(&csDLCDownloadQueue); + return false; +} + +void CMinecraftApp::SetAdditionalSkinBoxes(DWORD dwSkinID, SKIN_BOX *SkinBoxA, DWORD dwSkinBoxC) +{ + EntityRenderer *renderer = EntityRenderDispatcher::instance->getRenderer(eTYPE_PLAYER); + Model *pModel = renderer->getModel(); + vector *pvModelPart = new vector; + vector *pvSkinBoxes = new vector; + + EnterCriticalSection( &csAdditionalModelParts ); + EnterCriticalSection( &csAdditionalSkinBoxes ); + + app.DebugPrintf("*** SetAdditionalSkinBoxes - Inserting model parts for skin %d from array of Skin Boxes\n",dwSkinID&0x0FFFFFFF); + + // convert the skin boxes into model parts, and add to the humanoid model + for(unsigned int i=0;iAddOrRetrievePart(&SkinBoxA[i]); + pvModelPart->push_back(pModelPart); + pvSkinBoxes->push_back(&SkinBoxA[i]); + } + } + + + m_AdditionalModelParts.insert( std::pair *>(dwSkinID, pvModelPart) ); + m_AdditionalSkinBoxes.insert( std::pair *>(dwSkinID, pvSkinBoxes) ); + + LeaveCriticalSection( &csAdditionalSkinBoxes ); + LeaveCriticalSection( &csAdditionalModelParts ); + +} + +vector * CMinecraftApp::SetAdditionalSkinBoxes(DWORD dwSkinID, vector *pvSkinBoxA) +{ + EntityRenderer *renderer = EntityRenderDispatcher::instance->getRenderer(eTYPE_PLAYER); + Model *pModel = renderer->getModel(); + vector *pvModelPart = new vector; + + EnterCriticalSection( &csAdditionalModelParts ); + EnterCriticalSection( &csAdditionalSkinBoxes ); + app.DebugPrintf("*** SetAdditionalSkinBoxes - Inserting model parts for skin %d from array of Skin Boxes\n",dwSkinID&0x0FFFFFFF); + + // convert the skin boxes into model parts, and add to the humanoid model + for(AUTO_VAR(it, pvSkinBoxA->begin());it != pvSkinBoxA->end(); ++it) + { + if(pModel) + { + ModelPart *pModelPart=pModel->AddOrRetrievePart(*it); + pvModelPart->push_back(pModelPart); + } + } + + m_AdditionalModelParts.insert( std::pair *>(dwSkinID, pvModelPart) ); + m_AdditionalSkinBoxes.insert( std::pair *>(dwSkinID, pvSkinBoxA) ); + + LeaveCriticalSection( &csAdditionalSkinBoxes ); + LeaveCriticalSection( &csAdditionalModelParts ); + return pvModelPart; +} + + +vector *CMinecraftApp::GetAdditionalModelParts(DWORD dwSkinID) +{ + EnterCriticalSection( &csAdditionalModelParts ); + vector *pvModelParts=NULL; + if(m_AdditionalModelParts.size()>0) + { + AUTO_VAR(it, m_AdditionalModelParts.find(dwSkinID)); + if(it!=m_AdditionalModelParts.end()) + { + pvModelParts = (*it).second; + } + } + + LeaveCriticalSection( &csAdditionalModelParts ); + return pvModelParts; +} + +vector *CMinecraftApp::GetAdditionalSkinBoxes(DWORD dwSkinID) +{ + EnterCriticalSection( &csAdditionalSkinBoxes ); + vector *pvSkinBoxes=NULL; + if(m_AdditionalSkinBoxes.size()>0) + { + AUTO_VAR(it,m_AdditionalSkinBoxes.find(dwSkinID)); + if(it!=m_AdditionalSkinBoxes.end()) + { + pvSkinBoxes = (*it).second; + } + } + + LeaveCriticalSection( &csAdditionalSkinBoxes ); + return pvSkinBoxes; +} + +unsigned int CMinecraftApp::GetAnimOverrideBitmask(DWORD dwSkinID) +{ + EnterCriticalSection( &csAnimOverrideBitmask ); + unsigned int uiAnimOverrideBitmask=0L; + + if(m_AnimOverrides.size()>0) + { + AUTO_VAR(it, m_AnimOverrides.find(dwSkinID)); + if(it!=m_AnimOverrides.end()) + { + uiAnimOverrideBitmask = (*it).second; + } + } + + LeaveCriticalSection( &csAnimOverrideBitmask ); + return uiAnimOverrideBitmask; +} + +void CMinecraftApp::SetAnimOverrideBitmask(DWORD dwSkinID,unsigned int uiAnimOverrideBitmask) +{ + // Make thread safe + EnterCriticalSection( &csAnimOverrideBitmask ); + + if(m_AnimOverrides.size()>0) + { + AUTO_VAR(it, m_AnimOverrides.find(dwSkinID)); + if(it!=m_AnimOverrides.end()) + { + LeaveCriticalSection( &csAnimOverrideBitmask ); + return; // already in here + } + } + m_AnimOverrides.insert( std::pair(dwSkinID, uiAnimOverrideBitmask) ); + LeaveCriticalSection( &csAnimOverrideBitmask ); +} + +DWORD CMinecraftApp::getSkinIdFromPath(const wstring &skin) +{ + bool dlcSkin = false; + unsigned int skinId = 0; + + if(skin.size() >= 14) + { + dlcSkin = skin.substr(0,3).compare(L"dlc") == 0; + + wstring skinValue = skin.substr(7,skin.size()); + skinValue = skinValue.substr(0,skinValue.find_first_of(L'.')); + + std::wstringstream ss; + // 4J Stu - dlc skins are numbered using decimal to make it easier for artists/people to number manually + // Everything else is numbered using hex + if(dlcSkin) + ss << std::dec << skinValue.c_str(); + else + ss << std::hex << skinValue.c_str(); + ss >> skinId; + + skinId = MAKE_SKIN_BITMASK(dlcSkin, skinId); + } + return skinId; +} + +wstring CMinecraftApp::getSkinPathFromId(DWORD skinId) +{ + // 4J Stu - This function maps the encoded DWORD we store in the player profile + // to a filename that is stored as a memory texture and shared between systems in game + wchar_t chars[256]; + if( GET_IS_DLC_SKIN_FROM_BITMASK(skinId) ) + { + // 4J Stu - DLC skins are numbered using decimal rather than hex to make it easier to number manually + swprintf(chars, 256, L"dlcskin%08d.png", GET_DLC_SKIN_ID_FROM_BITMASK(skinId)); + + } + else + { + DWORD ugcSkinIndex = GET_UGC_SKIN_ID_FROM_BITMASK(skinId); + DWORD defaultSkinIndex = GET_DEFAULT_SKIN_ID_FROM_BITMASK(skinId); + if( ugcSkinIndex == 0 ) + { + swprintf(chars, 256, L"defskin%08X.png",defaultSkinIndex); + } + else + { + swprintf(chars, 256, L"ugcskin%08X.png",ugcSkinIndex); + } + } + return chars; +} + + +int CMinecraftApp::TexturePackDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + + +#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) + { + if(app.GetRequiredTexturePackID()!=0) + { + // we need to enable background downloading for the DLC + XBackgroundDownloadSetMode(XBACKGROUND_DOWNLOAD_MODE_ALWAYS_ALLOW); + + ULONGLONG ullOfferID_Full; + ULONGLONG ullIndexA[1]; + app.GetDLCFullOfferIDForPackID(app.GetRequiredTexturePackID(),&ullOfferID_Full); + + if( result==C4JStorage::EMessage_ResultAccept ) // Full version + { + ullIndexA[0]=ullOfferID_Full; + StorageManager.InstallOffer(1,ullIndexA,NULL,NULL); + } + else // trial version + { + DLC_INFO *pDLCInfo=app.GetDLCInfoForFullOfferID(ullOfferID_Full); + ullIndexA[0]=pDLCInfo->ullOfferID_Trial; + StorageManager.InstallOffer(1,ullIndexA,NULL,NULL); + } + } + } +#endif + return 0; +} + +int CMinecraftApp::getArchiveFileSize(const wstring &filename) +{ + TexturePack *tPack = NULL; + Minecraft *pMinecraft = Minecraft::GetInstance(); + if(pMinecraft && pMinecraft->skins) tPack = pMinecraft->skins->getSelected(); + if(tPack && tPack->hasData() && tPack->getArchiveFile() && tPack->getArchiveFile()->hasFile(filename)) + { + return tPack->getArchiveFile()->getFileSize(filename); + } + else return m_mediaArchive->getFileSize(filename); +} + +bool CMinecraftApp::hasArchiveFile(const wstring &filename) +{ + TexturePack *tPack = NULL; + Minecraft *pMinecraft = Minecraft::GetInstance(); + if(pMinecraft && pMinecraft->skins) tPack = pMinecraft->skins->getSelected(); + if(tPack && tPack->hasData() && tPack->getArchiveFile() && tPack->getArchiveFile()->hasFile(filename)) return true; + else return m_mediaArchive->hasFile(filename); +} + +byteArray CMinecraftApp::getArchiveFile(const wstring &filename) +{ + TexturePack *tPack = NULL; + Minecraft *pMinecraft = Minecraft::GetInstance(); + if(pMinecraft && pMinecraft->skins) tPack = pMinecraft->skins->getSelected(); + if(tPack && tPack->hasData() && tPack->getArchiveFile() && tPack->getArchiveFile()->hasFile(filename)) + { + return tPack->getArchiveFile()->getFile(filename); + } + else return m_mediaArchive->getFile(filename); +} + +// DLC + +#if defined(__PS3__) || defined(__ORBIS__) || defined (__PSVITA__) +int CMinecraftApp::GetDLCInfoCount() +{ + return (int)DLCInfo.size(); +} +#elif defined _XBOX_ONE +int CMinecraftApp::GetDLCInfoTrialOffersCount() +{ + return 0; +} + +int CMinecraftApp::GetDLCInfoFullOffersCount() +{ + return (int)DLCInfo_Full.size(); +} +#else +int CMinecraftApp::GetDLCInfoTrialOffersCount() +{ + return (int)DLCInfo_Trial.size(); +} + +int CMinecraftApp::GetDLCInfoFullOffersCount() +{ + return (int)DLCInfo_Full.size(); +} +#endif + +int CMinecraftApp::GetDLCInfoTexturesOffersCount() +{ + return (int)DLCTextures_PackID.size(); +} + +// AUTOSAVE +void CMinecraftApp::SetAutosaveTimerTime(void) +{ +#if defined(_XBOX_ONE) || defined(__ORBIS__) + m_uiAutosaveTimer= GetTickCount()+1000*60; +#else + m_uiAutosaveTimer= GetTickCount()+GetGameSettings(ProfileManager.GetPrimaryPad(),eGameSetting_Autosave)*1000*60*15; +#endif +}// value x 15 to get mins, x60 for secs + +bool CMinecraftApp::AutosaveDue(void) +{ + return (GetTickCount()>m_uiAutosaveTimer); +} + +unsigned int CMinecraftApp::SecondsToAutosave() +{ + return (m_uiAutosaveTimer - GetTickCount() ) / 1000; +} + +void CMinecraftApp::SetTrialTimerStart(void) +{ + m_fTrialTimerStart=m_Time.fAppTime; mfTrialPausedTime=0.0f; +} + +float CMinecraftApp::getTrialTimer(void) +{ + return m_Time.fAppTime-m_fTrialTimerStart-mfTrialPausedTime; +} + +bool CMinecraftApp::IsLocalMultiplayerAvailable() +{ + DWORD connectedControllers = 0; + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + if( InputManager.IsPadConnected(i) || ProfileManager.IsSignedIn(i) ) ++connectedControllers; + } + + bool available = RenderManager.IsHiDef() && connectedControllers > 1; + +#ifdef __ORBIS__ + // Check for remote play + available = available && InputManager.IsLocalMultiplayerAvailable(); +#endif + + return available; + + // Found this in GameNetworkManager? + //#ifdef _DURANGO + // iOtherConnectedControllers = InputManager.GetConnectedGamepadCount(); + // if((InputManager.IsPadConnected(userIndex) || ProfileManager.IsSignedIn(userIndex))) + // { + // --iOtherConnectedControllers; + // } + //#else + // for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + // { + // if( (i!=userIndex) && (InputManager.IsPadConnected(i) || ProfileManager.IsSignedIn(i)) ) + // { + // iOtherConnectedControllers++; + // } + // } + //#endif +} + + +// 4J-PB - language and locale function + +void CMinecraftApp::getLocale(vector &vecWstrLocales) +{ + vector locales; + + DWORD dwSystemLanguage = XGetLanguage( ); + + // 4J-PB - restrict the 360 language until we're ready to have them in + +#ifdef _XBOX + switch(dwSystemLanguage) + { + case XC_LANGUAGE_FRENCH : + locales.push_back(eMCLang_frFR); + break; + case XC_LANGUAGE_ITALIAN : + locales.push_back(eMCLang_itIT); + break; + case XC_LANGUAGE_GERMAN : + locales.push_back(eMCLang_deDE); + break; + case XC_LANGUAGE_SPANISH : + locales.push_back(eMCLang_esES); + break; + case XC_LANGUAGE_PORTUGUESE : + if(XGetLocale()==XC_LOCALE_BRAZIL) + { + locales.push_back(eMCLang_ptBR); + } + locales.push_back(eMCLang_ptPT); + break; + case XC_LANGUAGE_JAPANESE : + locales.push_back(eMCLang_jaJP); + break; + case XC_LANGUAGE_KOREAN : + locales.push_back(eMCLang_koKR); + break; + case XC_LANGUAGE_TCHINESE : + locales.push_back(eMCLang_zhCHT); + break; + } +#else + switch(dwSystemLanguage) + { + + case XC_LANGUAGE_ENGLISH: + switch(XGetLocale()) + { + case XC_LOCALE_AUSTRALIA: + case XC_LOCALE_CANADA: + case XC_LOCALE_CZECH_REPUBLIC: + case XC_LOCALE_GREECE: + case XC_LOCALE_HONG_KONG: + case XC_LOCALE_HUNGARY: + case XC_LOCALE_INDIA: + case XC_LOCALE_IRELAND: + case XC_LOCALE_ISRAEL: + case XC_LOCALE_NEW_ZEALAND: + case XC_LOCALE_SAUDI_ARABIA: + case XC_LOCALE_SINGAPORE: + case XC_LOCALE_SLOVAK_REPUBLIC: + case XC_LOCALE_SOUTH_AFRICA: + case XC_LOCALE_UNITED_ARAB_EMIRATES: + case XC_LOCALE_GREAT_BRITAIN: + locales.push_back(eMCLang_enGB); + break; + default: //XC_LOCALE_UNITED_STATES + break; + } + break; + case XC_LANGUAGE_JAPANESE : + locales.push_back(eMCLang_jaJP); + break; + case XC_LANGUAGE_GERMAN : + switch(XGetLocale()) + { + case XC_LOCALE_AUSTRIA: + locales.push_back(eMCLang_deAT); + break; + case XC_LOCALE_SWITZERLAND: + locales.push_back(eMCLang_deCH); + break; + default:// XC_LOCALE_GERMANY: + break; + } + locales.push_back(eMCLang_deDE); + break; + case XC_LANGUAGE_FRENCH : + switch(XGetLocale()) + { + case XC_LOCALE_BELGIUM: + locales.push_back(eMCLang_frBE); + break; + case XC_LOCALE_CANADA: + locales.push_back(eMCLang_frCA); + break; + case XC_LOCALE_SWITZERLAND: + locales.push_back(eMCLang_frCH); + break; + default:// XC_LOCALE_FRANCE: + break; + } + locales.push_back(eMCLang_frFR); + break; + case XC_LANGUAGE_SPANISH : + switch(XGetLocale()) + { + case XC_LOCALE_MEXICO: + case XC_LOCALE_ARGENTINA: + case XC_LOCALE_CHILE: + case XC_LOCALE_COLOMBIA: + case XC_LOCALE_UNITED_STATES: + case XC_LOCALE_LATIN_AMERICA: + locales.push_back(eMCLang_laLAS); + locales.push_back(eMCLang_esMX); + break; + default://XC_LOCALE_SPAIN + break; + } + locales.push_back(eMCLang_esES); + break; + case XC_LANGUAGE_ITALIAN : + locales.push_back(eMCLang_itIT); + break; + case XC_LANGUAGE_KOREAN : + locales.push_back(eMCLang_koKR); + break; + case XC_LANGUAGE_TCHINESE : + switch(XGetLocale()) + { + case XC_LOCALE_HONG_KONG: + locales.push_back(eMCLang_zhHK); + locales.push_back(eMCLang_zhTW); + break; + case XC_LOCALE_TAIWAN: + locales.push_back(eMCLang_zhTW); + locales.push_back(eMCLang_zhHK); + default: + break; + } + locales.push_back(eMCLang_hant); + locales.push_back(eMCLang_zhCHT); + break; + case XC_LANGUAGE_PORTUGUESE : + if(XGetLocale()==XC_LOCALE_BRAZIL) + { + locales.push_back(eMCLang_ptBR); + } + locales.push_back(eMCLang_ptPT); + break; + case XC_LANGUAGE_POLISH : + locales.push_back(eMCLang_plPL); + break; + case XC_LANGUAGE_RUSSIAN : + locales.push_back(eMCLang_ruRU); + break; + case XC_LANGUAGE_SWEDISH : + locales.push_back(eMCLang_svSV); + locales.push_back(eMCLang_svSE); + break; + case XC_LANGUAGE_TURKISH : + locales.push_back(eMCLang_trTR); + break; + case XC_LANGUAGE_BNORWEGIAN : + locales.push_back(eMCLang_nbNO); + locales.push_back(eMCLang_noNO); + locales.push_back(eMCLang_nnNO); + break; + case XC_LANGUAGE_DUTCH : + switch(XGetLocale()) + { + case XC_LOCALE_BELGIUM: + locales.push_back(eMCLang_nlBE); + break; + default: + break; + } + locales.push_back(eMCLang_nlNL); + break; + case XC_LANGUAGE_SCHINESE : + switch(XGetLocale()) + { + case XC_LOCALE_SINGAPORE: + locales.push_back(eMCLang_zhSG); + break; + default: + break; + } + locales.push_back(eMCLang_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_FINISH : + locales.push_back(eMCLang_fiFI); + break; + + case XC_LANGUAGE_CZECH : + locales.push_back(eMCLang_csCZ); + locales.push_back(eMCLang_enCZ); + break; + + case XC_LANGUAGE_SLOVAK : + locales.push_back(eMCLang_skSK); + locales.push_back(eMCLang_enSK); + break; + + case XC_LANGUAGE_GREEK : + locales.push_back(eMCLang_elEL); + locales.push_back(eMCLang_elGR); + locales.push_back(eMCLang_enGR); + locales.push_back(eMCLang_enGB); + break; +#endif + } +#endif + + locales.push_back(eMCLang_enUS); + locales.push_back(eMCLang_null); + + for (int i=0; i +#include "..\Common\Tutorial\TutorialEnum.h" + +#ifdef _XBOX +#include "..\Common\XUI\XUI_Helper.h" +#include "..\Common\XUI\XUI_HelpCredits.h" +#endif +#include "UI\UIStructs.h" + +#include "..\..\Minecraft.World\DisconnectPacket.h" +#include + +#include "..\StringTable.h" +#include "..\Common\DLC\DLCManager.h" +#include "..\Common\GameRules\ConsoleGameRulesConstants.h" +#include "..\Common\GameRules\GameRuleManager.h" +#include "..\SkinBox.h" +#include "..\ArchiveFile.h" + +typedef struct _JoinFromInviteData +{ + DWORD dwUserIndex; // dwUserIndex + DWORD dwLocalUsersMask; // dwUserMask + const INVITE_INFO *pInviteInfo; // pInviteInfo +} +JoinFromInviteData; + +class Player; +class Inventory; +class Level; +class FurnaceTileEntity; +class Container; +class DispenserTileEntity; +class SignTileEntity; +class BrewingStandTileEntity; +class CommandBlockEntity; +class HopperTileEntity; +class MinecartHopper; +class EntityHorse; +class BeaconTileEntity; +class LocalPlayer; +class DLCPack; +class LevelRuleset; +class ConsoleSchematicFile; +class Model; +class ModelPart; +class StringTable; +class Merchant; + +class CMinecraftAudio; + +class CMinecraftApp + +#ifdef _XBOX + : public CXuiModule +#endif +{ +private: + static int s_iHTMLFontSizesA[eHTMLSize_COUNT]; + +public: + + CMinecraftApp(); + + static const float fSafeZoneX; // 5% of 1280 + static const float fSafeZoneY; // 5% of 720 + + typedef std::vector VMEMFILES; + typedef std::vector VNOTIFICATIONS; + + // storing skin files + std::vector vSkinNames; + DLCManager m_dlcManager; + + // storing credits text from the DLC + std::vector m_vCreditText; // hold the credit text lines so we can avoid duplicating them + + + // In builds prior to TU5, the size of the GAME_SETTINGS struct was 204 bytes. We added a few new values to the internal struct in TU5, and even though we + // changed the size of the ucUnused array to be decreased by the size of the values we added, the packing of the struct has introduced some extra + // padding that resulted in the GAME_SETTINGS struct being 208 bytes. The knock-on effect from this was that all the stats, which come after the game settings + // in the profile data, we being read offset by 4 bytes. We need to ensure that the GAME_SETTINGS struct does not grow larger than 204 bytes or if we need it + // to then we need to rebuild the profile data completely and increase the profile version. There should be enough free space to grow larger for a few more updates + // as long as we take into account the padding issues and check that settings are still stored at the same positions when we read them + static const int GAME_SETTINGS_PROFILE_DATA_BYTES = 204; + +#ifdef _EXTENDED_ACHIEVEMENTS + /* 4J-JEV: + * We need more space in the profile data because of the new achievements and statistics + * necessary for the new expanded achievement set. + */ + static const int GAME_DEFINED_PROFILE_DATA_BYTES = 2*972; // per user +#else + static const int GAME_DEFINED_PROFILE_DATA_BYTES = 972; // per user +#endif + unsigned int uiGameDefinedDataChangedBitmask; + + void DebugPrintf(const char *szFormat, ...); + void DebugPrintfVerbose(bool bVerbose, const char *szFormat, ...); // Conditional printf + void DebugPrintf(int user, const char *szFormat, ...); + + static const int USER_NONE = 0; // disables printf + static const int USER_GENERAL = 1; + static const int USER_JV = 2; + static const int USER_MH = 3; + static const int USER_PB = 4; + static const int USER_RR = 5; + static const int USER_SR = 6; + static const int USER_UI = 7; // 4J Stu - This also makes it appear on the UI console + + void HandleButtonPresses(); + bool IntroRunning() { return m_bIntroRunning;} + void SetIntroRunning(bool bSet) {m_bIntroRunning=bSet;} +#ifdef _CONTENT_PACKAGE +#ifndef _FINAL_BUILD + bool PartnernetPasswordRunning() { return m_bPartnernetPasswordRunning;} + void SetPartnernetPasswordRunning(bool bSet) {m_bPartnernetPasswordRunning=bSet;} +#endif +#endif + + bool IsAppPaused(); + void SetAppPaused(bool val); + static int DisplaySavingMessage(LPVOID pParam,const C4JStorage::ESavingMessage eMsg, int iPad); + bool GetGameStarted() {return m_bGameStarted;} + void SetGameStarted(bool bVal) { if(bVal) DebugPrintf("SetGameStarted - true\n"); else DebugPrintf("SetGameStarted - false\n"); m_bGameStarted = bVal; m_bIsAppPaused = !bVal;} + int GetLocalPlayerCount(void); + bool LoadInventoryMenu(int iPad,shared_ptr player, bool bNavigateBack=false); + bool LoadCreativeMenu(int iPad,shared_ptr player,bool bNavigateBack=false); + bool LoadEnchantingMenu(int iPad,shared_ptr inventory, int x, int y, int z, Level *level, 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, 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); + + eGameMode GetGameMode() { return m_eGameMode;} + void SetGameMode(eGameMode eMode) { m_eGameMode=eMode;} + + eXuiAction GetGlobalXuiAction() {return m_eGlobalXuiAction;} + void SetGlobalXuiAction(eXuiAction action) {m_eGlobalXuiAction=action;} + eXuiAction GetXuiAction(int iPad) {return m_eXuiAction[iPad];} + void SetAction(int iPad, eXuiAction action, LPVOID param = NULL); + void SetTMSAction(int iPad, eTMSAction action) {m_eTMSAction[iPad]=action; } + eTMSAction GetTMSAction(int iPad) {return m_eTMSAction[iPad];} + eXuiServerAction GetXuiServerAction(int iPad) {return m_eXuiServerAction[iPad];} + LPVOID GetXuiServerActionParam(int iPad) {return m_eXuiServerActionParam[iPad];} + void SetXuiServerAction(int iPad, eXuiServerAction action, LPVOID param = NULL) {m_eXuiServerAction[iPad]=action; m_eXuiServerActionParam[iPad] = param;} + eXuiServerAction GetGlobalXuiServerAction() {return m_eGlobalXuiServerAction;} + void SetGlobalXuiServerAction(eXuiServerAction action) {m_eGlobalXuiServerAction=action;} + + DisconnectPacket::eDisconnectReason GetDisconnectReason() { return m_disconnectReason; } + void SetDisconnectReason(DisconnectPacket::eDisconnectReason bVal) { m_disconnectReason = bVal; } + + bool GetChangingSessionType() { return m_bChangingSessionType; } + void SetChangingSessionType(bool bVal) { m_bChangingSessionType = bVal; } + + bool GetReallyChangingSessionType() { return m_bReallyChangingSessionType; } + void SetReallyChangingSessionType(bool bVal) { m_bReallyChangingSessionType = bVal; } + + + // 4J Stu - Added so that we can call this when a confirmation box is selected + static void SetActionConfirmed(LPVOID param); + void HandleXuiActions(void); + + // 4J Stu - Functions used for Minecon and other promo work + bool GetLoadSavesFromFolderEnabled() { return m_bLoadSavesFromFolderEnabled; } + void SetLoadSavesFromFolderEnabled(bool bVal) { m_bLoadSavesFromFolderEnabled = bVal; } + + // 4J Stu - Useful for debugging + bool GetWriteSavesToFolderEnabled() { return m_bWriteSavesToFolderEnabled; } + void SetWriteSavesToFolderEnabled(bool bVal) { m_bWriteSavesToFolderEnabled = bVal; } + bool GetMobsDontAttackEnabled() { return m_bMobsDontAttack; } + void SetMobsDontAttackEnabled(bool bVal) { m_bMobsDontAttack = bVal; } + bool GetUseDPadForDebug() { return m_bUseDPadForDebug; } + void SetUseDPadForDebug(bool bVal) { m_bUseDPadForDebug = bVal; } + bool GetMobsDontTickEnabled() { return m_bMobsDontTick; } + void SetMobsDontTickEnabled(bool bVal) { m_bMobsDontTick = bVal; } + + bool GetFreezePlayers() { return m_bFreezePlayers; } + void SetFreezePlayers(bool bVal) { m_bFreezePlayers = bVal; } + + // debug -0 show safe area + void ShowSafeArea(BOOL bShow) + { +#ifdef _XBOX + CXuiSceneBase::ShowSafeArea( bShow ); +#endif + } + // 4J-PB - to capture the social post screenshot + virtual void CaptureScreenshot(int iPad) {}; + //void GetPreviewImage(int iPad,XSOCIAL_PREVIEWIMAGE *preview); + + void InitGameSettings(); + static int OldProfileVersionCallback(LPVOID pParam,unsigned char *pucData, const unsigned short usVersion, const int iPad); + +#if ( defined __PS3__ || defined __ORBIS__ || defined _DURANGO || defined __PSVITA__ ) + 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__ + static int OptionsDataCallback(LPVOID pParam,int iPad,unsigned short usVersion,C4JStorage::eOptionsCallback eStatus,int iBlocksRequired); + int GetOptionsBlocksRequired(int iPad); +#else + static int OptionsDataCallback(LPVOID pParam,int iPad,unsigned short usVersion,C4JStorage::eOptionsCallback eStatus); +#endif + + C4JStorage::eOptionsCallback GetOptionsCallbackStatus(int iPad); + + void SetOptionsCallbackStatus(int iPad, C4JStorage::eOptionsCallback eStatus); +#else + static int DefaultOptionsCallback(LPVOID pParam,C_4JProfile::PROFILESETTINGS *pSettings, const int iPad); + int SetDefaultOptions(C_4JProfile::PROFILESETTINGS *pSettings,const int iPad); +#endif + virtual void SetRichPresenceContext(int iPad, int contextId) = 0; + + + void SetGameSettings(int iPad,eGameSetting eVal,unsigned char ucVal); + unsigned char GetGameSettings(int iPad,eGameSetting eVal); + unsigned char GetGameSettings(eGameSetting eVal); // for the primary pad + void SetPlayerSkin(int iPad,const wstring &name); + void SetPlayerSkin(int iPad,DWORD dwSkinId); + void SetPlayerCape(int iPad,const wstring &name); + void SetPlayerCape(int iPad,DWORD dwCapeId); + void SetPlayerFavoriteSkin(int iPad, int iIndex,unsigned int uiSkinID); + unsigned int GetPlayerFavoriteSkin(int iPad,int iIndex); + unsigned char GetPlayerFavoriteSkinsPos(int iPad); + void SetPlayerFavoriteSkinsPos(int iPad,int iPos); + unsigned int GetPlayerFavoriteSkinsCount(int iPad); + void ValidateFavoriteSkins(int iPad); // check the DLC is available for the skins + + // Mash-up pack worlds hide/display + void HideMashupPackWorld(int iPad, unsigned int iMashupPackID); + void EnableMashupPackWorlds(int iPad); + unsigned int GetMashupPackWorlds(int iPad); + + // Minecraft language select + void SetMinecraftLanguage(int iPad, unsigned char ucLanguage); + unsigned char GetMinecraftLanguage(int iPad); + 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]; } + void SetOpacityTimer(int iPad) { m_uiOpacityCountDown[iPad]=120; } // 6 seconds + void TickOpacityTimer(int iPad) { if(m_uiOpacityCountDown[iPad]>0) m_uiOpacityCountDown[iPad]--;} + +public: + wstring GetPlayerSkinName(int iPad); + DWORD GetPlayerSkinId(int iPad); + wstring GetPlayerCapeName(int iPad); + DWORD GetPlayerCapeId(int iPad); + DWORD GetAdditionalModelParts(int iPad); + void CheckGameSettingsChanged(bool bOverride5MinuteTimer=false, int iPad=XUSER_INDEX_ANY); + void ApplyGameSettingsChanged(int iPad); + void ClearGameSettingsChangedFlag(int iPad); + void ActionGameSettings(int iPad,eGameSetting eVal); + unsigned int GetGameSettingsDebugMask(int iPad=-1,bool bOverridePlayer=false); + void SetGameSettingsDebugMask(int iPad, unsigned int uiVal); + void ActionDebugMask(int iPad, bool bSetAllClear=false); + + // + bool IsLocalMultiplayerAvailable(); + + // for sign in change monitoring + static void SignInChangeCallback(LPVOID pParam, bool bVal, unsigned int uiSignInData); + static void ClearSignInChangeUsersMask(); + static int SignoutExitWorldThreadProc( void* lpParameter ); + static int PrimaryPlayerSignedOutReturned(void *pParam, int iPad, const C4JStorage::EMessageResult); + static int EthernetDisconnectReturned(void *pParam, int iPad, const C4JStorage::EMessageResult); + static void ProfileReadErrorCallback(void *pParam); + + // FATAL LOAD ERRORS + virtual void FatalLoadError(); + + // Notifications from the game listener to be passed to the qnet listener + static void NotificationsCallback(LPVOID pParam,DWORD dwNotification, unsigned int uiParam); + + // for the ethernet being disconnected + static void LiveLinkChangeCallback(LPVOID pParam,BOOL bConnected); + bool GetLiveLinkRequired() {return m_bLiveLinkRequired;} + void SetLiveLinkRequired(bool required) {m_bLiveLinkRequired=required;} + + static void UpsellReturnedCallback(LPVOID pParam, eUpsellType type, eUpsellResponse result, int iUserData); + +#if defined __PS3__ || defined __PSVITA__ || defined __ORBIS__ + static int NowDisplayFullVersionPurchase(void *pParam, bool bContinue, int iPad); + static int MustSignInFullVersionPurchaseReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); +#endif +#if defined __PS3__ || defined __PSVITA__ || defined __ORBIS__ + static int MustSignInFullVersionPurchaseReturnedExitTrial(void *pParam,int iPad,C4JStorage::EMessageResult result); +#endif + +#ifdef _DEBUG_MENUS_ENABLED + bool DebugSettingsOn() { return m_bDebugOptions;} + bool DebugArtToolsOn(); +#else + bool DebugSettingsOn() { return false;} + bool DebugArtToolsOn() { return false;} +#endif + void SetDebugSequence(const char *pchSeq); + static int DebugInputCallback(LPVOID pParam); + //bool UploadFileToGlobalStorage(int iQuadrant, C4JStorage::eGlobalStorage eStorageFacility, wstring *wsFile ); + + // Installed DLC + bool StartInstallDLCProcess(int iPad); + static int DLCInstalledCallback(LPVOID pParam,int iOfferC,int iPad); + void HandleDLCLicenseChange(); + static int DLCMountedCallback(LPVOID pParam,int iPad,DWORD dwErr,DWORD dwLicenceMask); + void MountNextDLC(int iPad); + //static int DLCReadCallback(LPVOID pParam,C4JStorage::DLC_FILE_DETAILS *pDLCData); + void HandleDLC(DLCPack *pack); + bool DLCInstallPending() {return m_bDLCInstallPending;} + bool DLCInstallProcessCompleted() {return m_bDLCInstallProcessCompleted;} + void ClearDLCInstalled() { m_bDLCInstallProcessCompleted=false;} + static int MarketplaceCountsCallback(LPVOID pParam,C4JStorage::DLC_TMS_DETAILS *,int iPad); + + bool AlreadySeenCreditText(const wstring &wstemp); + + void ClearNewDLCAvailable(void) { m_bNewDLCAvailable=false; m_bSeenNewDLCTip=true;} + bool GetNewDLCAvailable() { return m_bNewDLCAvailable;} + void DisplayNewDLCTipAgain() { m_bSeenNewDLCTip=false;} + bool DisplayNewDLCTip() { if(!m_bSeenNewDLCTip) { m_bSeenNewDLCTip=true; return true;} else return false;} + + // functions to store launch data, and to exit the game - required due to possibly being on a demo disc + virtual void StoreLaunchData(); + virtual void ExitGame(); + + bool isXuidNotch(PlayerUID xuid); + bool isXuidDeadmau5(PlayerUID xuid); + + void AddMemoryTextureFile(const wstring &wName, PBYTE pbData, DWORD dwBytes); + void RemoveMemoryTextureFile(const wstring &wName); + void GetMemFileDetails(const wstring &wName,PBYTE *ppbData,DWORD *pdwBytes); + bool IsFileInMemoryTextures(const wstring &wName); + + // Texture Pack Data files (icon, banner, comparison shot & text) + void AddMemoryTPDFile(int iConfig,PBYTE pbData,DWORD dwBytes); + void RemoveMemoryTPDFile(int iConfig); + bool IsFileInTPD(int iConfig); + void GetTPD(int iConfig,PBYTE *ppbData,DWORD *pdwBytes); + int GetTPDSize() {return m_MEM_TPD.size();} +#ifndef __PS3__ + int GetTPConfigVal(WCHAR *pwchDataFile); +#endif + + bool DefaultCapeExists(); + //void InstallDefaultCape(); // attempt to install the default cape once per game launch + + // invites + //void ProcessInvite(JoinFromInviteData *pJoinData); + void ProcessInvite(DWORD dwUserIndex, DWORD dwLocalUsersMask, const INVITE_INFO * pInviteInfo); + + // Add credits for DLC installed + void AddCreditText(LPCWSTR lpStr); + +private: + PlayerUID m_xuidNotch; +#ifdef _DURANGO + unordered_map m_GTS_Files; +#else + unordered_map m_GTS_Files; +#endif + + // for storing memory textures - player skin + unordered_map m_MEM_Files; + // for storing texture pack data files + unordered_map m_MEM_TPD; + CRITICAL_SECTION csMemFilesLock; // For locking access to the above map + CRITICAL_SECTION csMemTPDLock; // For locking access to the above map + + VNOTIFICATIONS m_vNotifications; + +public: + // launch data + BYTE* m_pLaunchData; + DWORD m_dwLaunchDataSize; + +public: + // BAN LIST + void AddLevelToBannedLevelList(int iPad,PlayerUID xuid, char *pszLevelName, bool bWriteToTMS); + bool IsInBannedLevelList(int iPad, PlayerUID xuid, char *pszLevelName); + void RemoveLevelFromBannedLevelList(int iPad, PlayerUID xuid, char *pszLevelName); + void InvalidateBannedList(int iPad); + void SetUniqueMapName(char *pszUniqueMapName); + char *GetUniqueMapName(void); +#ifdef _XBOX_ONE + void AddLevelToBannedLevelList(int iPad, PBANNEDLISTDATA pBannedListData, bool bWriteToTMS); +#endif + + +public: + bool GetResourcesLoaded() {return m_bResourcesLoaded;} + void SetResourcesLoaded(bool bVal) {m_bResourcesLoaded=bVal;} + +public: + bool m_bGameStarted; + bool m_bIntroRunning; + bool m_bTutorialMode; + bool m_bIsAppPaused; + + bool m_bChangingSessionType; + bool m_bReallyChangingSessionType; + + bool m_bDisplayFullVersionPurchase; // for after signing in during the trial, and trying to unlock full version on an upsell + + void loadMediaArchive(); + void loadStringTable(); + +protected: + ArchiveFile *m_mediaArchive; + StringTable *m_stringTable; + +public: + int getArchiveFileSize(const wstring &filename); + bool hasArchiveFile(const wstring &filename); + byteArray getArchiveFile(const wstring &filename); + +private: + + static int BannedLevelDialogReturned(void *pParam,int iPad,const C4JStorage::EMessageResult); + static int TexturePackDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + + VBANNEDLIST *m_vBannedListA[XUSER_MAX_COUNT]; + + void HandleButtonPresses(int iPad); + + bool m_bResourcesLoaded; + + // Global string table for this application. + //CXuiStringTable StringTable; + + + // Container scene for some menu + + // CXuiScene debugContainerScene; + + + //bool m_bSplitScreenEnabled; + + +#ifdef _CONTENT_PACKAGE +#ifndef _FINAL_BUILD + bool m_bPartnernetPasswordRunning; +#endif +#endif + + eGameMode m_eGameMode; // single or multiplayer + + static unsigned int m_uiLastSignInData; + + // We've got sizeof(GAME_SETTINGS) bytes reserved at the start of the gamedefined data per player for settings + GAME_SETTINGS *GameSettingsA[XUSER_MAX_COUNT]; + + // For promo work + bool m_bLoadSavesFromFolderEnabled; + + // For debugging + bool m_bWriteSavesToFolderEnabled; + bool m_bMobsDontAttack; + bool m_bUseDPadForDebug; + bool m_bMobsDontTick; + bool m_bFreezePlayers; + + // 4J : WESTY : For taking screen shots. + //bool m_bInterfaceRenderingOff; + //bool m_bHandRenderingOff; + + DisconnectPacket::eDisconnectReason m_disconnectReason; + +public: + virtual void RunFrame() {}; + + + + static const DWORD m_dwOfferID = 0x00000001; + + // timer + void InitTime(); + void UpdateTime(); + + // trial timer + void SetTrialTimerStart(void); + float getTrialTimer(void); + + // notifications from the game for qnet + VNOTIFICATIONS *GetNotifications() {return &m_vNotifications;} + +private: + + + // To avoid problems with threads being kicked off from xuis that alter things that may be in progress within the run_middle, + // we'll action these at the end of the game loop + eXuiAction m_eXuiAction[XUSER_MAX_COUNT]; + eTMSAction m_eTMSAction[XUSER_MAX_COUNT]; + LPVOID m_eXuiActionParam[XUSER_MAX_COUNT]; + eXuiAction m_eGlobalXuiAction; + eXuiServerAction m_eXuiServerAction[XUSER_MAX_COUNT]; + LPVOID m_eXuiServerActionParam[XUSER_MAX_COUNT]; + eXuiServerAction m_eGlobalXuiServerAction; + + bool m_bLiveLinkRequired; + + static int UnlockFullExitReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int UnlockFullSaveReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int UnlockFullInviteReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int TrialOverReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int ExitAndJoinFromInvite(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int ExitAndJoinFromInviteSaveDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int ExitAndJoinFromInviteAndSaveReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int ExitAndJoinFromInviteDeclineSaveReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int FatalErrorDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int WarningTrialTexturePackReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + + JoinFromInviteData m_InviteData; + bool m_bDebugOptions; // toggle debug things on or off + + // Trial timer + float m_fTrialTimerStart,mfTrialPausedTime; + typedef struct TimeInfo + { + LARGE_INTEGER qwTime; + LARGE_INTEGER qwAppTime; + + float fAppTime; + float fElapsedTime; + float fSecsPerTick; + } TIMEINFO; + + TimeInfo m_Time; + +protected: + static const int MAX_TIPS_GAMETIP = 50; + static const int MAX_TIPS_TRIVIATIP = 20; + static TIPSTRUCT m_GameTipA[MAX_TIPS_GAMETIP]; + static TIPSTRUCT m_TriviaTipA[MAX_TIPS_TRIVIATIP]; + static Random *TipRandom; +public: + void InitialiseTips(); + UINT GetNextTip(); + int GetHTMLColour(eMinecraftColour colour); + int GetHTMLColor(eMinecraftColour colour) { return GetHTMLColour(colour); } + int GetHTMLFontSize(EHTMLFontSize size); + wstring FormatHTMLString(int iPad, const wstring &desc, int shadowColour = 0xFFFFFFFF); + wstring GetActionReplacement(int iPad, unsigned char ucAction); + wstring GetVKReplacement(unsigned int uiVKey); + wstring GetIconReplacement(unsigned int uiIcon); + + float getAppTime() { return m_Time.fAppTime; } + void UpdateTrialPausedTimer() { mfTrialPausedTime+= m_Time.fElapsedTime;} + + static int RemoteSaveThreadProc( void* lpParameter ); + static void ExitGameFromRemoteSave( LPVOID lpParameter ); + static int ExitGameFromRemoteSaveDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); +private: + UINT m_TipIDA[MAX_TIPS_GAMETIP+MAX_TIPS_TRIVIATIP]; + UINT m_uiCurrentTip; + static int TipsSortFunction(const void* a, const void* b); + + // XML +public: + + // Hold a vector of terrain feature positions + void AddTerrainFeaturePosition(_eTerrainFeatureType,int,int); + void ClearTerrainFeaturePosition(); + _eTerrainFeatureType IsTerrainFeature(int x,int z); + bool GetTerrainFeaturePosition(_eTerrainFeatureType eType, int *pX, int *pZ); + std::vector m_vTerrainFeatures; + + static HRESULT RegisterMojangData(WCHAR *, PlayerUID, WCHAR *, WCHAR *); + MOJANG_DATA *GetMojangDataForXuid(PlayerUID xuid); + static HRESULT RegisterConfigValues(WCHAR *pType, int iValue); + +#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) + HRESULT RegisterDLCData(char *pchDLCName, unsigned int uiSortIndex, char *pchImageURL); + bool GetDLCFullOfferIDForSkinID(const wstring &FirstSkin,ULONGLONG *pullVal); + DLC_INFO *GetDLCInfoForTrialOfferID(ULONGLONG ullOfferID_Trial); + DLC_INFO *GetDLCInfoForFullOfferID(ULONGLONG ullOfferID_Full); +#elif defined(_XBOX_ONE) + static HRESULT RegisterDLCData(eDLCContentType, WCHAR *, WCHAR *, WCHAR *, WCHAR *, int, unsigned int); + //bool GetDLCFullOfferIDForSkinID(const wstring &FirstSkin,WCHAR *pwchProductId); + bool GetDLCFullOfferIDForSkinID(const wstring &FirstSkin,wstring &wsProductId); + DLC_INFO *GetDLCInfoForFullOfferID(WCHAR *pwchProductId); + DLC_INFO *GetDLCInfoForProductName(WCHAR *pwchProductName); +#else + static HRESULT RegisterDLCData(WCHAR *, WCHAR *, int, __uint64, __uint64, WCHAR *, unsigned int, int, WCHAR *pDataFile); + bool GetDLCFullOfferIDForSkinID(const wstring &FirstSkin,ULONGLONG *pullVal); + DLC_INFO *GetDLCInfoForTrialOfferID(ULONGLONG ullOfferID_Trial); + DLC_INFO *GetDLCInfoForFullOfferID(ULONGLONG ullOfferID_Full); +#endif + + unsigned int GetDLCCreditsCount(); + SCreditTextItemDef * GetDLCCredits(int iIndex); + + // TMS + void ReadDLCFileFromTMS(int iPad,eTMSAction action, bool bCallback=false); + void ReadXuidsFileFromTMS(int iPad,eTMSAction action,bool bCallback=false); + + // images for save thumbnail/social post + virtual void CaptureSaveThumbnail() =0; + virtual void GetSaveThumbnail(PBYTE*,DWORD*)=0; + virtual void ReleaseSaveThumbnail()=0; + virtual void GetScreenshot(int iPad,PBYTE *pbData,DWORD *pdwSize)=0; + + virtual void ReadBannedList(int iPad, eTMSAction action=(eTMSAction)0, bool bCallback=false)=0; + +private: + + std::vector vDLCCredits; + +#if defined(__PS3__) || defined(__ORBIS__) || defined (__PSVITA__) + static unordered_map MojangData; + static unordered_map DLCTextures_PackID; // for mash-up packs & texture packs + static unordered_map DLCInfo; + static unordered_map DLCInfo_SkinName; // skin name, full offer id +#elif defined(_DURANGO) + static unordered_map MojangData; + static unordered_map DLCTextures_PackID; // for mash-up packs & texture packs + //static unordered_map DLCInfo_Trial; // full offerid, dlc_info + static unordered_map DLCInfo_Full; // full offerid, dlc_info + static unordered_map DLCInfo_SkinName; // skin name, full offer id +#else + static unordered_map MojangData; + static unordered_map DLCTextures_PackID; // for mash-up packs & texture packs + static unordered_map DLCInfo_Trial; // full offerid, dlc_info + static unordered_map DLCInfo_Full; // full offerid, dlc_info + static unordered_map DLCInfo_SkinName; // skin name, full offer id +#endif + // bool m_bRead_TMS_XUIDS_XML; // track whether we have already read the TMS xuids.xml file + // bool m_bRead_TMS_DLCINFO_XML; // track whether we have already read the TMS DLC.xml file + + bool m_bDefaultCapeInstallAttempted; // have we attempted to install the default cape from tms + + //bool m_bwasHidingGui; // 4J Stu - Removed 1.8.2 bug fix (TU6) as not needed + bool m_bDLCInstallProcessCompleted; + bool m_bDLCInstallPending; + int m_iTotalDLC; + int m_iTotalDLCInstalled; + +public: + // 4J Stu - We need to be able to detect when a guest player signs in or out causing other guest players to change their xuid + // The simplest way to do this is to check if their guest number has changed, so store the last known one here + // 4J Stu - Now storing the whole XUSER_SIGNIN_INFO so we can detect xuid changes + XUSER_SIGNIN_INFO m_currentSigninInfo[XUSER_MAX_COUNT]; + + //void OverrideFontRenderer(bool set, bool immediate = true); + // void ToggleFontRenderer() { OverrideFontRenderer(!m_bFontRendererOverridden,false); } + BANNEDLIST BannedListA[XUSER_MAX_COUNT]; + +private: + // XUI_FontRenderer *m_fontRenderer; + // bool m_bFontRendererOverridden; + // bool m_bOverrideFontRenderer; + + + bool m_bRead_BannedListA[XUSER_MAX_COUNT]; + char m_pszUniqueMapName[14]; + bool m_BanListCheck[XUSER_MAX_COUNT]; + +public: + void SetBanListCheck(int iPad,bool bVal) {m_BanListCheck[iPad]=bVal;} + bool GetBanListCheck(int iPad) { return m_BanListCheck[iPad];} + // AUTOSAVE +public: + void SetAutosaveTimerTime(void); + bool AutosaveDue(void); + unsigned int SecondsToAutosave(); +private: + unsigned int m_uiAutosaveTimer; + unsigned int m_uiOpacityCountDown[XUSER_MAX_COUNT]; + + // DLC + bool m_bNewDLCAvailable; + bool m_bSeenNewDLCTip; + + // Host options +private: + unsigned int m_uiGameHostSettings; + static unsigned char m_szPNG[8]; + +#ifdef _LARGE_WORLDS + unsigned int m_GameNewWorldSize; + bool m_bGameNewWorldSizeUseMoat; + unsigned int m_GameNewHellScale; +#endif + unsigned int FromBigEndian(unsigned int uiValue); + +public: + + + void SetGameHostOption(eGameHostOption eVal,unsigned int uiVal); + void SetGameHostOption(unsigned int &uiHostSettings, eGameHostOption eVal,unsigned int uiVal); + unsigned int GetGameHostOption(eGameHostOption eVal); + unsigned int GetGameHostOption(unsigned int uiHostSettings, eGameHostOption eVal); + +#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(); + + // World seed from png image + void GetImageTextData(PBYTE pbImageData, DWORD dwImageBytes,unsigned char *pszSeed,unsigned int &uiHostOptions,bool &bHostOptionsRead,DWORD &uiTexturePack); + unsigned int CreateImageTextData(PBYTE bTextMetadata, __int64 seed, bool hasSeed, unsigned int uiHostOptions, unsigned int uiTexturePackId); + + // Game rules + GameRuleManager m_gameRules; + +public: + void processSchematics(LevelChunk *levelChunk); + void processSchematicsLighting(LevelChunk *levelChunk); + void loadDefaultGameRules(); + vector *getLevelGenerators() { return m_gameRules.getLevelGenerators(); } + void setLevelGenerationOptions(LevelGenerationOptions *levelGen); + LevelRuleset *getGameRuleDefinitions() { return m_gameRules.getGameRuleDefinitions(); } + LevelGenerationOptions *getLevelGenerationOptions() { return m_gameRules.getLevelGenerationOptions(); } + LPCWSTR GetGameRulesString(const wstring &key); + +private: + BYTE m_playerColours[MINECRAFT_NET_MAX_PLAYERS]; // An array of QNet small-id's + unsigned int m_playerGamePrivileges[MINECRAFT_NET_MAX_PLAYERS]; + +public: + void UpdatePlayerInfo(BYTE networkSmallId, SHORT playerColourIndex, unsigned int playerGamePrivileges); + short GetPlayerColour(BYTE networkSmallId); + unsigned int GetPlayerPrivileges(BYTE networkSmallId); + + wstring getEntityName(eINSTANCEOF type); + + + + unsigned int AddDLCRequest(eDLCMarketplaceType eContentType, bool bPromote=false); + bool RetrieveNextDLCContent(); + bool CheckTMSDLCCanStop(); + static int DLCOffersReturned(void *pParam, int iOfferC, DWORD dwType, int iPad); + DWORD GetDLCContentType(eDLCContentType eType) { return m_dwContentTypeA[eType];} + eDLCContentType Find_eDLCContentType(DWORD dwType); + int GetDLCOffersCount() { return m_iDLCOfferC;} + bool DLCContentRetrieved(eDLCMarketplaceType eType); + void TickDLCOffersRetrieved(); + void ClearAndResetDLCDownloadQueue(); + bool RetrieveNextTMSPPContent(); + void TickTMSPPFilesRetrieved(); + void ClearTMSPPFilesRetrieved(); + unsigned int AddTMSPPFileTypeRequest(eDLCContentType eType, bool bPromote=false); + int GetDLCInfoTexturesOffersCount(); +#if defined( __PS3__) || defined(__ORBIS__) || defined(__PSVITA__) + DLC_INFO *GetDLCInfo(int iIndex); + DLC_INFO *GetDLCInfo(char *); + DLC_INFO *GetDLCInfoFromTPackID(int iTPID); + bool GetDLCNameForPackID(const int iPackID,char **ppchKeyID); + char * GetDLCInfoTextures(int iIndex); + int GetDLCInfoCount(); +#else + +#ifdef _XBOX_ONE + static int TMSPPFileReturned(LPVOID pParam,int iPad,int iUserData,LPVOID, WCHAR *wchFilename); + unordered_map *GetDLCInfo(); +#else + static int TMSPPFileReturned(LPVOID pParam,int iPad,int iUserData,C4JStorage::PTMSPP_FILEDATA pFileData, LPCSTR szFilename); +#endif + DLC_INFO *GetDLCInfoTrialOffer(int iIndex); + DLC_INFO *GetDLCInfoFullOffer(int iIndex); + + int GetDLCInfoTrialOffersCount(); + int GetDLCInfoFullOffersCount(); +#ifdef _XBOX_ONE + bool GetDLCFullOfferIDForPackID(const int iPackID,wstring &wsProductId); + wstring GetDLCInfoTexturesFullOffer(int iIndex); + +#else + bool GetDLCFullOfferIDForPackID(const int iPackID,ULONGLONG *pullVal); + ULONGLONG GetDLCInfoTexturesFullOffer(int iIndex); +#endif +#endif + + void SetCorruptSaveDeleted(bool bVal) {m_bCorruptSaveDeleted=bVal;} + bool GetCorruptSaveDeleted(void) {return m_bCorruptSaveDeleted;} + + void EnterSaveNotificationSection(); + void LeaveSaveNotificationSection(); +private: + CRITICAL_SECTION m_saveNotificationCriticalSection; + int m_saveNotificationDepth; + // Download Status + + //Request current_download; + vector m_DLCDownloadQueue; + vector m_TMSPPDownloadQueue; + static DWORD m_dwContentTypeA[e_Marketplace_MAX]; + int m_iDLCOfferC; + bool m_bAllDLCContentRetrieved; + bool m_bAllTMSContentRetrieved; + bool m_bTickTMSDLCFiles; + CRITICAL_SECTION csDLCDownloadQueue; + CRITICAL_SECTION csTMSPPDownloadQueue; + CRITICAL_SECTION csAdditionalModelParts; + CRITICAL_SECTION csAdditionalSkinBoxes; + CRITICAL_SECTION csAnimOverrideBitmask; + bool m_bCorruptSaveDeleted; + + DWORD m_dwAdditionalModelParts[XUSER_MAX_COUNT]; + + BYTE *m_pBannedListFileBuffer; + DWORD m_dwBannedListFileSize; + +public: + DWORD m_dwDLCFileSize; + BYTE *m_pDLCFileBuffer; + + // static int CallbackReadXuidsFileFromTMS(LPVOID lpParam, WCHAR *wchFilename, int iPad, bool bResult, int iAction); + // static int CallbackDLCFileFromTMS(LPVOID lpParam, WCHAR *wchFilename, int iPad, bool bResult, int iAction); + // static int CallbackBannedListFileFromTMS(LPVOID lpParam, WCHAR *wchFilename, int iPad, bool bResult, int iAction); + + // Storing additional model parts per skin texture + void SetAdditionalSkinBoxes(DWORD dwSkinID, SKIN_BOX *SkinBoxA, DWORD dwSkinBoxC); + vector * SetAdditionalSkinBoxes(DWORD dwSkinID, vector *pvSkinBoxA); + vector *GetAdditionalModelParts(DWORD dwSkinID); + vector *GetAdditionalSkinBoxes(DWORD dwSkinID); + void SetAnimOverrideBitmask(DWORD dwSkinID,unsigned int uiAnimOverrideBitmask); + unsigned int GetAnimOverrideBitmask(DWORD dwSkinID); + + static DWORD getSkinIdFromPath(const wstring &skin); + static wstring getSkinPathFromId(DWORD skinId); + + virtual int LoadLocalTMSFile(WCHAR *wchTMSFile)=0; + virtual int LoadLocalTMSFile(WCHAR *wchTMSFile, eFileExtensionType eExt)=0; + virtual void FreeLocalTMSFiles(eTMSFileType eType)=0; + virtual int GetLocalTMSFileIndex(WCHAR *wchTMSFile,bool bFilenameIncludesExtension,eFileExtensionType eEXT)=0; + + virtual bool GetTMSGlobalFileListRead() { return true;} + virtual bool GetTMSDLCInfoRead() { return true;} + virtual bool GetTMSXUIDsFileRead() { return true;} + + bool GetBanListRead(int iPad) { return m_bRead_BannedListA[iPad];} + void SetBanListRead(int iPad,bool bVal) { m_bRead_BannedListA[iPad]=bVal;} + void ClearBanList(int iPad) { BannedListA[iPad].pBannedList=NULL;BannedListA[iPad].dwBytes=0;} + + DWORD GetRequiredTexturePackID() {return m_dwRequiredTexturePackID;} + void SetRequiredTexturePackID(DWORD dwID) {m_dwRequiredTexturePackID=dwID;} + + virtual void GetFileFromTPD(eTPDFileType eType,PBYTE pbData,DWORD dwBytes,PBYTE *ppbData,DWORD *pdwBytes ) {*ppbData = NULL; *pdwBytes = 0;} + + //XTITLE_DEPLOYMENT_TYPE getDeploymentType() { return m_titleDeploymentType; } + +private: + // vector of additional skin model parts, indexed by the skin texture id + unordered_map *> m_AdditionalModelParts; + unordered_map *> m_AdditionalSkinBoxes; + unordered_map m_AnimOverrides; + + + bool m_bResetNether; + DWORD m_dwRequiredTexturePackID; +#ifdef _XBOX_ONE + vector m_vTMSPPData; +#endif + +#if ( defined __PS3__ || defined __ORBIS__ || defined _DURANGO || defined __PSVITA__) + C4JStorage::eOptionsCallback m_eOptionsStatusA[XUSER_MAX_COUNT]; + +#ifdef __ORBIS__ + int m_eOptionsBlocksRequiredA[XUSER_MAX_COUNT]; +#endif +#endif + + + // 4J-PB - language and locale functions +public: + + void LocaleAndLanguageInit(); + void getLocale(vector &vecWstrLocales); + DWORD get_eMCLang(WCHAR *pwchLocale); + DWORD get_xcLang(WCHAR *pwchLocale); + + void SetTickTMSDLCFiles(bool bVal); + + wstring getFilePath(DWORD packId, wstring filename, bool bAddDataFolder, wstring mountPoint = L"TPACK:"); + +private: + 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; + +#elif defined (__PS3__) + +#elif defined _DURANGO + +#elif defined _WINDOWS64 + //CMinecraftAudio audio; +#else // PS4 + +#endif + +#ifdef _XBOX_ONE +public: + void SetReachedMainMenu(); + bool HasReachedMainMenu(); +private: + bool m_hasReachedMainMenu; +#endif +}; + +//singleton +//extern CMinecraftApp app; diff --git a/Minecraft.Client/Common/DLC/DLCAudioFile.cpp b/Minecraft.Client/Common/DLC/DLCAudioFile.cpp new file mode 100644 index 00000000..49ba52cd --- /dev/null +++ b/Minecraft.Client/Common/DLC/DLCAudioFile.cpp @@ -0,0 +1,216 @@ +#include "stdafx.h" +#include "DLCManager.h" +#include "DLCAudioFile.h" +#if defined _XBOX || defined _WINDOWS64 +#include "..\..\Xbox\XML\ATGXmlParser.h" +#include "..\..\Xbox\XML\xmlFilesCallback.h" +#endif + +DLCAudioFile::DLCAudioFile(const wstring &path) : DLCFile(DLCManager::e_DLCType_Audio,path) +{ + m_pbData = NULL; + m_dwBytes = 0; +} + +void DLCAudioFile::addData(PBYTE pbData, DWORD dwBytes) +{ + m_pbData = pbData; + m_dwBytes = dwBytes; + + processDLCDataFile(pbData,dwBytes); +} + +PBYTE DLCAudioFile::getData(DWORD &dwBytes) +{ + dwBytes = m_dwBytes; + return m_pbData; +} + +WCHAR *DLCAudioFile::wchTypeNamesA[]= +{ + L"CUENAME", + L"CREDIT", +}; + +DLCAudioFile::EAudioParameterType DLCAudioFile::getParameterType(const wstring ¶mName) +{ + EAudioParameterType type = e_AudioParamType_Invalid; + + for(DWORD i = 0; i < e_AudioParamType_Max; ++i) + { + if(paramName.compare(wchTypeNamesA[i]) == 0) + { + type = (EAudioParameterType)i; + break; + } + } + + return type; +} + +void DLCAudioFile::addParameter(EAudioType type, EAudioParameterType ptype, const wstring &value) +{ + switch(ptype) + { + + case e_AudioParamType_Credit: // If this parameter exists, then mark this as free + //add it to the DLC credits list + + // we'll need to justify this text since we don't have a lot of room for lines of credits + { + // don't look for duplicate in the music credits + + //if(app.AlreadySeenCreditText(value)) break; + + int maximumChars = 55; + + bool bIsSDMode=!RenderManager.IsHiDef() && !RenderManager.IsWidescreen(); + + if(bIsSDMode) + { + maximumChars = 45; + } + + switch(XGetLanguage()) + { + case XC_LANGUAGE_JAPANESE: + case XC_LANGUAGE_TCHINESE: + case XC_LANGUAGE_KOREAN: + maximumChars = 35; + break; + } + wstring creditValue = value; + while (creditValue.length() > maximumChars) + { + unsigned int i = 1; + while (i < creditValue.length() && (i + 1) <= maximumChars) + { + i++; + } + int iLast=(int)creditValue.find_last_of(L" ",i); + switch(XGetLanguage()) + { + case XC_LANGUAGE_JAPANESE: + case XC_LANGUAGE_TCHINESE: + case XC_LANGUAGE_KOREAN: + iLast = maximumChars; + break; + default: + iLast=(int)creditValue.find_last_of(L" ",i); + break; + } + + // if a space was found, include the space on this line + if(iLast!=i) + { + iLast++; + } + + app.AddCreditText((creditValue.substr(0, iLast)).c_str()); + creditValue = creditValue.substr(iLast); + } + app.AddCreditText(creditValue.c_str()); + + } + break; + case e_AudioParamType_Cuename: + m_parameters[type].push_back(value); + //m_parameters[(int)type] = value; + break; + } +} + +bool DLCAudioFile::processDLCDataFile(PBYTE pbData, DWORD dwLength) +{ + unordered_map parameterMapping; + unsigned int uiCurrentByte=0; + + // File format defined in the AudioPacker + // File format: Version 1 + + unsigned int uiVersion=*(unsigned int *)pbData; + uiCurrentByte+=sizeof(int); + + if(uiVersion < CURRENT_AUDIO_VERSION_NUM) + { + if(pbData!=NULL) delete [] pbData; + app.DebugPrintf("DLC version of %d is too old to be read\n", uiVersion); + return false; + } + + unsigned int uiParameterTypeCount=*(unsigned int *)&pbData[uiCurrentByte]; + uiCurrentByte+=sizeof(int); + C4JStorage::DLC_FILE_PARAM *pParams = (C4JStorage::DLC_FILE_PARAM *)&pbData[uiCurrentByte]; + + for(unsigned int i=0;iwchData); + EAudioParameterType type = getParameterType(parameterName); + if( type != e_AudioParamType_Invalid ) + { + parameterMapping[pParams->dwType] = type; + } + uiCurrentByte+= sizeof(C4JStorage::DLC_FILE_PARAM)+(pParams->dwWchCount*sizeof(WCHAR)); + pParams = (C4JStorage::DLC_FILE_PARAM *)&pbData[uiCurrentByte]; + } + unsigned int uiFileCount=*(unsigned int *)&pbData[uiCurrentByte]; + uiCurrentByte+=sizeof(int); + C4JStorage::DLC_FILE_DETAILS *pFile = (C4JStorage::DLC_FILE_DETAILS *)&pbData[uiCurrentByte]; + + DWORD dwTemp=uiCurrentByte; + for(unsigned int i=0;idwWchCount*sizeof(WCHAR); + pFile = (C4JStorage::DLC_FILE_DETAILS *)&pbData[dwTemp]; + } + PBYTE pbTemp=((PBYTE )pFile); + pFile = (C4JStorage::DLC_FILE_DETAILS *)&pbData[uiCurrentByte]; + + for(unsigned int i=0;idwType; + // Params + unsigned int uiParameterCount=*(unsigned int *)pbTemp; + pbTemp+=sizeof(int); + pParams = (C4JStorage::DLC_FILE_PARAM *)pbTemp; + for(unsigned int j=0;jdwType )); + + if(it != parameterMapping.end() ) + { + addParameter(type,(EAudioParameterType)pParams->dwType,(WCHAR *)pParams->wchData); + } + pbTemp+=sizeof(C4JStorage::DLC_FILE_PARAM)+(sizeof(WCHAR)*pParams->dwWchCount); + pParams = (C4JStorage::DLC_FILE_PARAM *)pbTemp; + } + // Move the pointer to the start of the next files data; + pbTemp+=pFile->uiFileSize; + uiCurrentByte+=sizeof(C4JStorage::DLC_FILE_DETAILS)+pFile->dwWchCount*sizeof(WCHAR); + + pFile=(C4JStorage::DLC_FILE_DETAILS *)&pbData[uiCurrentByte]; + + } + + return true; +} + +int DLCAudioFile::GetCountofType(DLCAudioFile::EAudioType eType) +{ + return m_parameters[eType].size(); +} + + +wstring &DLCAudioFile::GetSoundName(int iIndex) +{ + int iWorldType=e_AudioType_Overworld; + while(iIndex>=m_parameters[iWorldType].size()) + { + iIndex-=m_parameters[iWorldType].size(); + iWorldType++; + } + return m_parameters[iWorldType].at(iIndex); +} \ No newline at end of file diff --git a/Minecraft.Client/Common/DLC/DLCAudioFile.h b/Minecraft.Client/Common/DLC/DLCAudioFile.h new file mode 100644 index 00000000..728512d7 --- /dev/null +++ b/Minecraft.Client/Common/DLC/DLCAudioFile.h @@ -0,0 +1,54 @@ +#pragma once +#include "DLCFile.h" + +class DLCAudioFile : public DLCFile +{ + +public: + + // If you add to the Enum,then you need to add the array of type names + // These are the names used in the XML for the parameters + enum EAudioType + { + e_AudioType_Invalid = -1, + + e_AudioType_Overworld = 0, + e_AudioType_Nether, + e_AudioType_End, + + e_AudioType_Max, + }; + enum EAudioParameterType + { + e_AudioParamType_Invalid = -1, + + e_AudioParamType_Cuename = 0, + e_AudioParamType_Credit, + + e_AudioParamType_Max, + + }; + static WCHAR *wchTypeNamesA[e_AudioParamType_Max]; + + DLCAudioFile(const wstring &path); + + virtual void addData(PBYTE pbData, DWORD dwBytes); + virtual PBYTE getData(DWORD &dwBytes); + + bool processDLCDataFile(PBYTE pbData, DWORD dwLength); + int GetCountofType(DLCAudioFile::EAudioType ptype); + wstring &GetSoundName(int iIndex); + +private: + using DLCFile::addParameter; + + PBYTE m_pbData; + DWORD m_dwBytes; + static const int CURRENT_AUDIO_VERSION_NUM=1; + //unordered_map m_parameters; + vector m_parameters[e_AudioType_Max]; + + // use the EAudioType to order these + void addParameter(DLCAudioFile::EAudioType type, DLCAudioFile::EAudioParameterType ptype, const wstring &value); + DLCAudioFile::EAudioParameterType getParameterType(const wstring ¶mName); +}; diff --git a/Minecraft.Client/Common/DLC/DLCCapeFile.cpp b/Minecraft.Client/Common/DLC/DLCCapeFile.cpp new file mode 100644 index 00000000..29a50ad4 --- /dev/null +++ b/Minecraft.Client/Common/DLC/DLCCapeFile.cpp @@ -0,0 +1,12 @@ +#include "stdafx.h" +#include "DLCManager.h" +#include "DLCCapeFile.h" + +DLCCapeFile::DLCCapeFile(const wstring &path) : DLCFile(DLCManager::e_DLCType_Cape,path) +{ +} + +void DLCCapeFile::addData(PBYTE pbData, DWORD dwBytes) +{ + app.AddMemoryTextureFile(m_path,pbData,dwBytes); +} \ No newline at end of file diff --git a/Minecraft.Client/Common/DLC/DLCCapeFile.h b/Minecraft.Client/Common/DLC/DLCCapeFile.h new file mode 100644 index 00000000..8373d340 --- /dev/null +++ b/Minecraft.Client/Common/DLC/DLCCapeFile.h @@ -0,0 +1,10 @@ +#pragma once +#include "DLCFile.h" + +class DLCCapeFile : public DLCFile +{ +public: + DLCCapeFile(const wstring &path); + + virtual void addData(PBYTE pbData, DWORD dwBytes); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/DLC/DLCColourTableFile.cpp b/Minecraft.Client/Common/DLC/DLCColourTableFile.cpp new file mode 100644 index 00000000..ec800dac --- /dev/null +++ b/Minecraft.Client/Common/DLC/DLCColourTableFile.cpp @@ -0,0 +1,26 @@ +#include "stdafx.h" +#include "DLCManager.h" +#include "DLCColourTableFile.h" +#include "..\..\Minecraft.h" +#include "..\..\TexturePackRepository.h" +#include "..\..\TexturePack.h" + +DLCColourTableFile::DLCColourTableFile(const wstring &path) : DLCFile(DLCManager::e_DLCType_ColourTable,path) +{ + m_colourTable = NULL; +} + +DLCColourTableFile::~DLCColourTableFile() +{ + if(m_colourTable != NULL) + { + app.DebugPrintf("Deleting DLCColourTableFile data\n"); + delete m_colourTable; + } +} + +void DLCColourTableFile::addData(PBYTE pbData, DWORD dwBytes) +{ + ColourTable *defaultColourTable = Minecraft::GetInstance()->skins->getDefault()->getColourTable(); + m_colourTable = new ColourTable(defaultColourTable, pbData, dwBytes); +} \ No newline at end of file diff --git a/Minecraft.Client/Common/DLC/DLCColourTableFile.h b/Minecraft.Client/Common/DLC/DLCColourTableFile.h new file mode 100644 index 00000000..84269739 --- /dev/null +++ b/Minecraft.Client/Common/DLC/DLCColourTableFile.h @@ -0,0 +1,18 @@ +#pragma once +#include "DLCFile.h" + +class ColourTable; + +class DLCColourTableFile : public DLCFile +{ +private: + ColourTable *m_colourTable; + +public: + DLCColourTableFile(const wstring &path); + ~DLCColourTableFile(); + + virtual void addData(PBYTE pbData, DWORD dwBytes); + + ColourTable *getColourTable() { return m_colourTable; } +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/DLC/DLCFile.cpp b/Minecraft.Client/Common/DLC/DLCFile.cpp new file mode 100644 index 00000000..e7bbace0 --- /dev/null +++ b/Minecraft.Client/Common/DLC/DLCFile.cpp @@ -0,0 +1,26 @@ +#include "stdafx.h" +#include "DLCFile.h" + +DLCFile::DLCFile(DLCManager::EDLCType type, const wstring &path) +{ + m_type = type; + m_path = path; + + // store the id + bool dlcSkin = path.substr(0,3).compare(L"dlc") == 0; + + if(dlcSkin) + { + wstring skinValue = path.substr(7,path.size()); + skinValue = skinValue.substr(0,skinValue.find_first_of(L'.')); + std::wstringstream ss; + ss << std::dec << skinValue.c_str(); + ss >> m_dwSkinId; + m_dwSkinId = MAKE_SKIN_BITMASK(true, m_dwSkinId); + + } + else + { + m_dwSkinId=0; + } +} \ No newline at end of file diff --git a/Minecraft.Client/Common/DLC/DLCFile.h b/Minecraft.Client/Common/DLC/DLCFile.h new file mode 100644 index 00000000..3a40dbc7 --- /dev/null +++ b/Minecraft.Client/Common/DLC/DLCFile.h @@ -0,0 +1,25 @@ +#pragma once +#include "DLCManager.h" + +class DLCFile +{ +protected: + DLCManager::EDLCType m_type; + wstring m_path; + DWORD m_dwSkinId; + +public: + DLCFile(DLCManager::EDLCType type, const wstring &path); + virtual ~DLCFile() {} + + DLCManager::EDLCType getType() { return m_type; } + wstring getPath() { return m_path; } + DWORD getSkinID() { return m_dwSkinId; } + + virtual void addData(PBYTE pbData, DWORD dwBytes) {} + virtual PBYTE getData(DWORD &dwBytes) { dwBytes = 0; return NULL; } + virtual void addParameter(DLCManager::EDLCParameterType type, const wstring &value) {} + + virtual wstring getParameterAsString(DLCManager::EDLCParameterType type) { return L""; } + virtual bool getParameterAsBool(DLCManager::EDLCParameterType type) { return false;} +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/DLC/DLCGameRules.h b/Minecraft.Client/Common/DLC/DLCGameRules.h new file mode 100644 index 00000000..9d3bbaad --- /dev/null +++ b/Minecraft.Client/Common/DLC/DLCGameRules.h @@ -0,0 +1,10 @@ +#pragma once + +#include "DLCFile.h" +#include "..\GameRules\LevelGenerationOptions.h" + +class DLCGameRules : public DLCFile +{ +public: + DLCGameRules(DLCManager::EDLCType type, const wstring &path) : DLCFile(type,path) {} +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/DLC/DLCGameRulesFile.cpp b/Minecraft.Client/Common/DLC/DLCGameRulesFile.cpp new file mode 100644 index 00000000..8ca520d6 --- /dev/null +++ b/Minecraft.Client/Common/DLC/DLCGameRulesFile.cpp @@ -0,0 +1,21 @@ +#include "stdafx.h" +#include "DLCManager.h" +#include "DLCGameRulesFile.h" + +DLCGameRulesFile::DLCGameRulesFile(const wstring &path) : DLCGameRules(DLCManager::e_DLCType_GameRules,path) +{ + m_pbData = NULL; + m_dwBytes = 0; +} + +void DLCGameRulesFile::addData(PBYTE pbData, DWORD dwBytes) +{ + m_pbData = pbData; + m_dwBytes = dwBytes; +} + +PBYTE DLCGameRulesFile::getData(DWORD &dwBytes) +{ + dwBytes = m_dwBytes; + return m_pbData; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/DLC/DLCGameRulesFile.h b/Minecraft.Client/Common/DLC/DLCGameRulesFile.h new file mode 100644 index 00000000..e6456d73 --- /dev/null +++ b/Minecraft.Client/Common/DLC/DLCGameRulesFile.h @@ -0,0 +1,15 @@ +#pragma once +#include "DLCGameRules.h" + +class DLCGameRulesFile : public DLCGameRules +{ +private: + PBYTE m_pbData; + DWORD m_dwBytes; + +public: + DLCGameRulesFile(const wstring &path); + + virtual void addData(PBYTE pbData, DWORD dwBytes); + virtual PBYTE getData(DWORD &dwBytes); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/DLC/DLCGameRulesHeader.cpp b/Minecraft.Client/Common/DLC/DLCGameRulesHeader.cpp new file mode 100644 index 00000000..39b85219 --- /dev/null +++ b/Minecraft.Client/Common/DLC/DLCGameRulesHeader.cpp @@ -0,0 +1,92 @@ +#include "stdafx.h" + +#include + +#include "..\..\..\Minecraft.World\File.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\..\Minecraft.World\InputOutputStream.h" + +#include "DLCManager.h" +#include "DLCGameRulesHeader.h" + +DLCGameRulesHeader::DLCGameRulesHeader(const wstring &path) : DLCGameRules(DLCManager::e_DLCType_GameRulesHeader,path) +{ + m_pbData = NULL; + m_dwBytes = 0; + + m_hasData = false; + + m_grfPath = path.substr(0, path.length() - 4) + L".grf"; + + lgo = NULL; +} + +void DLCGameRulesHeader::addData(PBYTE pbData, DWORD dwBytes) +{ + m_pbData = pbData; + m_dwBytes = dwBytes; + + +#if 0 + byteArray data(m_pbData, m_dwBytes); + ByteArrayInputStream bais(data); + DataInputStream dis(&bais); + + // Init values. + int version_number; + byte compression_type; + wstring texturepackid; + + // Read Datastream. + version_number = dis.readInt(); + compression_type = dis.readByte(); + m_defaultSaveName = dis.readUTF(); + m_displayName = dis.readUTF(); + texturepackid = dis.readUTF(); + m_grfPath = dis.readUTF(); + + // Debug printout. + app.DebugPrintf ( + "DLCGameRulesHeader::readHeader:\n" + "\tversion_number = '%d',\n" + "\tcompression_type = '%d',\n" + "\tdefault_savename = '%s',\n" + "\tdisplayname = '%s',\n" + "\ttexturepackid = '%s',\n" + "\tgrf_path = '%s',\n", + + version_number, compression_type, + + wstringtofilename(m_defaultSaveName), + wstringtofilename(m_displayName), + wstringtofilename(texturepackid), + wstringtofilename(m_grfPath) + ); + + // Texture Pack. + m_requiredTexturePackId = _fromString(texturepackid); + m_bRequiresTexturePack = m_requiredTexturePackId > 0; + + dis.close(); + bais.close(); + bais.reset(); +#endif +} + +PBYTE DLCGameRulesHeader::getData(DWORD &dwBytes) +{ + dwBytes = m_dwBytes; + return m_pbData; +} + +void DLCGameRulesHeader::setGrfData(PBYTE fData, DWORD fSize, StringTable *st) +{ + if (!m_hasData) + { + m_hasData = true; + + //app.m_gameRules.loadGameRules(lgo, fData, fSize); + + app.m_gameRules.readRuleFile(lgo, fData, fSize, st); + } +} \ No newline at end of file diff --git a/Minecraft.Client/Common/DLC/DLCGameRulesHeader.h b/Minecraft.Client/Common/DLC/DLCGameRulesHeader.h new file mode 100644 index 00000000..4521ae11 --- /dev/null +++ b/Minecraft.Client/Common/DLC/DLCGameRulesHeader.h @@ -0,0 +1,42 @@ +#pragma once + +#include "DLCGameRules.h" +#include "..\GameRules\LevelGenerationOptions.h" + +class DLCGameRulesHeader : public DLCGameRules, public JustGrSource +{ +private: + + // GR-Header + PBYTE m_pbData; + DWORD m_dwBytes; + + bool m_hasData; + +public: + virtual bool requiresTexturePack() {return m_bRequiresTexturePack;} + virtual UINT getRequiredTexturePackId() {return m_requiredTexturePackId;} + virtual wstring getDefaultSaveName() {return m_defaultSaveName;} + virtual LPCWSTR getWorldName() {return m_worldName.c_str();} + virtual LPCWSTR getDisplayName() {return m_displayName.c_str();} + virtual wstring getGrfPath() {return L"GameRules.grf";} + + virtual void setRequiresTexturePack(bool x) {m_bRequiresTexturePack = x;} + virtual void setRequiredTexturePackId(UINT x) {m_requiredTexturePackId = x;} + virtual void setDefaultSaveName(const wstring &x) {m_defaultSaveName = x;} + virtual void setWorldName(const wstring & x) {m_worldName = x;} + virtual void setDisplayName(const wstring & x) {m_displayName = x;} + virtual void setGrfPath(const wstring & x) {m_grfPath = x;} + + LevelGenerationOptions *lgo; + +public: + DLCGameRulesHeader(const wstring &path); + + virtual void addData(PBYTE pbData, DWORD dwBytes); + virtual PBYTE getData(DWORD &dwBytes); + + void setGrfData(PBYTE fData, DWORD fSize, StringTable *); + + virtual bool ready() { return m_hasData; } +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/DLC/DLCLocalisationFile.cpp b/Minecraft.Client/Common/DLC/DLCLocalisationFile.cpp new file mode 100644 index 00000000..358a93e5 --- /dev/null +++ b/Minecraft.Client/Common/DLC/DLCLocalisationFile.cpp @@ -0,0 +1,14 @@ +#include "stdafx.h" +#include "DLCManager.h" +#include "DLCLocalisationFile.h" +#include "..\..\StringTable.h" + +DLCLocalisationFile::DLCLocalisationFile(const wstring &path) : DLCFile(DLCManager::e_DLCType_LocalisationData,path) +{ + m_strings = NULL; +} + +void DLCLocalisationFile::addData(PBYTE pbData, DWORD dwBytes) +{ + m_strings = new StringTable(pbData, dwBytes); +} \ No newline at end of file diff --git a/Minecraft.Client/Common/DLC/DLCLocalisationFile.h b/Minecraft.Client/Common/DLC/DLCLocalisationFile.h new file mode 100644 index 00000000..083e60d8 --- /dev/null +++ b/Minecraft.Client/Common/DLC/DLCLocalisationFile.h @@ -0,0 +1,18 @@ +#pragma once +#include "DLCFile.h" + +class StringTable; + +class DLCLocalisationFile : public DLCFile +{ +private: + StringTable *m_strings; + +public: + DLCLocalisationFile(const wstring &path); + DLCLocalisationFile(PBYTE pbData, DWORD dwBytes); // when we load in a texture pack details file from TMS++ + + virtual void addData(PBYTE pbData, DWORD dwBytes); + + StringTable *getStringTable() { return m_strings; } +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/DLC/DLCManager.cpp b/Minecraft.Client/Common/DLC/DLCManager.cpp new file mode 100644 index 00000000..17c9fc6d --- /dev/null +++ b/Minecraft.Client/Common/DLC/DLCManager.cpp @@ -0,0 +1,693 @@ +#include "stdafx.h" +#include +#include "DLCManager.h" +#include "DLCPack.h" +#include "DLCFile.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\Minecraft.h" +#include "..\..\TexturePackRepository.h" + +WCHAR *DLCManager::wchTypeNamesA[]= +{ + L"DISPLAYNAME", + L"THEMENAME", + L"FREE", + L"CREDIT", + L"CAPEPATH", + L"BOX", + L"ANIM", + L"PACKID", + L"NETHERPARTICLECOLOUR", + L"ENCHANTTEXTCOLOUR", + L"ENCHANTTEXTFOCUSCOLOUR", + L"DATAPATH", + L"PACKVERSION", +}; + +DLCManager::DLCManager() +{ + //m_bNeedsUpdated = true; + m_bNeedsCorruptCheck = true; +} + +DLCManager::~DLCManager() +{ + for(AUTO_VAR(it, m_packs.begin()); it != m_packs.end(); ++it) + { + DLCPack *pack = *it; + delete pack; + } +} + +DLCManager::EDLCParameterType DLCManager::getParameterType(const wstring ¶mName) +{ + EDLCParameterType type = e_DLCParamType_Invalid; + + for(DWORD i = 0; i < e_DLCParamType_Max; ++i) + { + if(paramName.compare(wchTypeNamesA[i]) == 0) + { + type = (EDLCParameterType)i; + break; + } + } + + return type; +} + +DWORD DLCManager::getPackCount(EDLCType type /*= e_DLCType_All*/) +{ + DWORD packCount = 0; + if( type != e_DLCType_All ) + { + for(AUTO_VAR(it, m_packs.begin()); it != m_packs.end(); ++it) + { + DLCPack *pack = *it; + if( pack->getDLCItemsCount(type) > 0 ) + { + ++packCount; + } + } + } + else + { + packCount = (DWORD)m_packs.size(); + } + return packCount; +} + +void DLCManager::addPack(DLCPack *pack) +{ + m_packs.push_back(pack); +} + +void DLCManager::removePack(DLCPack *pack) +{ + if(pack != NULL) + { + AUTO_VAR(it, find(m_packs.begin(),m_packs.end(),pack)); + if(it != m_packs.end() ) m_packs.erase(it); + delete pack; + } +} + +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; + //DWORD currentIndex = 0; + DLCPack *currentPack = NULL; + for(AUTO_VAR(it, m_packs.begin()); it != m_packs.end(); ++it) + { + currentPack = *it; + wstring wsName=currentPack->getName(); + + if(wsName.compare(name) == 0) + { + pack = currentPack; + break; + } + } + return pack; +} + +#ifdef _XBOX_ONE +DLCPack *DLCManager::getPackFromProductID(const wstring &productID) +{ + DLCPack *pack = NULL; + //DWORD currentIndex = 0; + DLCPack *currentPack = NULL; + for(AUTO_VAR(it, m_packs.begin()); it != m_packs.end(); ++it) + { + currentPack = *it; + wstring wsName=currentPack->getPurchaseOfferId(); + + if(wsName.compare(productID) == 0) + { + pack = currentPack; + break; + } + } + return pack; +} +#endif + +DLCPack *DLCManager::getPack(DWORD index, EDLCType type /*= e_DLCType_All*/) +{ + DLCPack *pack = NULL; + if( type != e_DLCType_All ) + { + DWORD currentIndex = 0; + DLCPack *currentPack = NULL; + for(AUTO_VAR(it, m_packs.begin()); it != m_packs.end(); ++it) + { + currentPack = *it; + if(currentPack->getDLCItemsCount(type)>0) + { + if(currentIndex == index) + { + pack = currentPack; + break; + } + ++currentIndex; + } + } + } + else + { + if(index >= m_packs.size()) + { + app.DebugPrintf("DLCManager: Trying to access a DLC pack beyond the range of valid packs\n"); + __debugbreak(); + } + pack = m_packs[index]; + } + + return pack; +} + +DWORD DLCManager::getPackIndex(DLCPack *pack, bool &found, EDLCType type /*= e_DLCType_All*/) +{ + DWORD foundIndex = 0; + found = false; + if(pack == NULL) + { + app.DebugPrintf("DLCManager: Attempting to find the index for a NULL pack\n"); + //__debugbreak(); + return foundIndex; + } + if( type != e_DLCType_All ) + { + DWORD index = 0; + for(AUTO_VAR(it, m_packs.begin()); it != m_packs.end(); ++it) + { + DLCPack *thisPack = *it; + if(thisPack->getDLCItemsCount(type)>0) + { + if(thisPack == pack) + { + found = true; + foundIndex = index; + break; + } + ++index; + } + } + } + else + { + DWORD index = 0; + for(AUTO_VAR(it, m_packs.begin()); it != m_packs.end(); ++it) + { + DLCPack *thisPack = *it; + if(thisPack == pack) + { + found = true; + foundIndex = index; + break; + } + ++index; + } + } + return foundIndex; +} + +DWORD DLCManager::getPackIndexContainingSkin(const wstring &path, bool &found) +{ + DWORD foundIndex = 0; + found = false; + DWORD index = 0; + for(AUTO_VAR(it, m_packs.begin()); it != m_packs.end(); ++it) + { + DLCPack *pack = *it; + if(pack->getDLCItemsCount(e_DLCType_Skin)>0) + { + if(pack->doesPackContainSkin(path)) + { + foundIndex = index; + found = true; + break; + } + ++index; + } + } + return foundIndex; +} + +DLCPack *DLCManager::getPackContainingSkin(const wstring &path) +{ + DLCPack *foundPack = NULL; + for(AUTO_VAR(it, m_packs.begin()); it != m_packs.end(); ++it) + { + DLCPack *pack = *it; + if(pack->getDLCItemsCount(e_DLCType_Skin)>0) + { + if(pack->doesPackContainSkin(path)) + { + foundPack = pack; + break; + } + } + } + return foundPack; +} + +DLCSkinFile *DLCManager::getSkinFile(const wstring &path) +{ + DLCSkinFile *foundSkinfile = NULL; + for(AUTO_VAR(it, m_packs.begin()); it != m_packs.end(); ++it) + { + DLCPack *pack = *it; + foundSkinfile=pack->getSkinFile(path); + if(foundSkinfile!=NULL) + { + break; + } + } + return foundSkinfile; +} + +DWORD DLCManager::checkForCorruptDLCAndAlert(bool showMessage /*= true*/) +{ + DWORD corruptDLCCount = m_dwUnnamedCorruptDLCCount; + DLCPack *pack = NULL; + DLCPack *firstCorruptPack = NULL; + + for(AUTO_VAR(it, m_packs.begin()); it != m_packs.end(); ++it) + { + pack = *it; + if( pack->IsCorrupt() ) + { + ++corruptDLCCount; + if(firstCorruptPack == NULL) firstCorruptPack = pack; + } + } + + if(corruptDLCCount > 0 && showMessage) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + if(corruptDLCCount == 1 && firstCorruptPack != NULL) + { + // pass in the pack format string + WCHAR wchFormat[132]; + swprintf(wchFormat, 132, L"%ls\n\n%%ls", firstCorruptPack->getName().c_str()); + + C4JStorage::EMessageResult result = ui.RequestErrorMessage( IDS_CORRUPT_DLC_TITLE, IDS_CORRUPT_DLC, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL,wchFormat); + + } + else + { + C4JStorage::EMessageResult result = ui.RequestErrorMessage( IDS_CORRUPT_DLC_TITLE, IDS_CORRUPT_DLC_MULTIPLE, uiIDA,1,ProfileManager.GetPrimaryPad()); + } + } + + SetNeedsCorruptCheck(false); + + return corruptDLCCount; +} + +bool DLCManager::readDLCDataFile(DWORD &dwFilesProcessed, const wstring &path, DLCPack *pack, bool fromArchive) +{ + return readDLCDataFile( dwFilesProcessed, wstringtofilename(path), pack, fromArchive); +} + + +bool DLCManager::readDLCDataFile(DWORD &dwFilesProcessed, const string &path, DLCPack *pack, bool fromArchive) +{ + wstring wPath = convStringToWstring(path); + if (fromArchive && app.getArchiveFileSize(wPath) >= 0) + { + byteArray bytes = app.getArchiveFile(wPath); + return processDLCDataFile(dwFilesProcessed, bytes.data, bytes.length, pack); + } + else if (fromArchive) return false; + +#ifdef _WINDOWS64 + string finalPath = StorageManager.GetMountedPath(path.c_str()); + if(finalPath.size() == 0) finalPath = path; + HANDLE file = CreateFile(finalPath.c_str(), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); +#elif defined(_DURANGO) + wstring finalPath = StorageManager.GetMountedPath(wPath.c_str()); + if(finalPath.size() == 0) finalPath = wPath; + HANDLE file = CreateFile(finalPath.c_str(), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); +#else + HANDLE file = CreateFile(path.c_str(), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); +#endif + if( file == INVALID_HANDLE_VALUE ) + { + DWORD error = GetLastError(); + app.DebugPrintf("Failed to open DLC data file with error code %d (%x)\n", error, error); + if( dwFilesProcessed == 0 ) removePack(pack); + assert(false); + return false; + } + + DWORD bytesRead,dwFileSize = GetFileSize(file,NULL); + PBYTE pbData = (PBYTE) new BYTE[dwFileSize]; + BOOL bSuccess = ReadFile(file,pbData,dwFileSize,&bytesRead,NULL); + if(bSuccess==FALSE) + { + // need to treat the file as corrupt, and flag it, so can't call fatal error + //app.FatalLoadError(); + } + else + { + CloseHandle(file); + } + if(bSuccess==FALSE) + { + // Corrupt or some other error. In any case treat as corrupt + app.DebugPrintf("Failed to read %s from DLC content package\n", path.c_str()); + pack->SetIsCorrupt( true ); + SetNeedsCorruptCheck(true); + return false; + } + return processDLCDataFile(dwFilesProcessed, pbData, bytesRead, pack); +} + +bool DLCManager::processDLCDataFile(DWORD &dwFilesProcessed, PBYTE pbData, DWORD dwLength, DLCPack *pack) +{ + unordered_map parameterMapping; + unsigned int uiCurrentByte=0; + + // File format defined in the DLC_Creator + // File format: Version 2 + // unsigned long, version number + // unsigned long, t = number of parameter types + // t * DLC_FILE_PARAM structs mapping strings to id's + // unsigned long, n = number of files + // n * DLC_FILE_DETAILS describing each file in the pack + // n * files of the form + // // unsigned long, p = number of parameters + // // p * DLC_FILE_PARAM describing each parameter for this file + // // ulFileSize bytes of data blob of the file added + unsigned int uiVersion=*(unsigned int *)pbData; + uiCurrentByte+=sizeof(int); + + if(uiVersion < CURRENT_DLC_VERSION_NUM) + { + if(pbData!=NULL) delete [] pbData; + app.DebugPrintf("DLC version of %d is too old to be read\n", uiVersion); + return false; + } + pack->SetDataPointer(pbData); + unsigned int uiParameterCount=*(unsigned int *)&pbData[uiCurrentByte]; + uiCurrentByte+=sizeof(int); + C4JStorage::DLC_FILE_PARAM *pParams = (C4JStorage::DLC_FILE_PARAM *)&pbData[uiCurrentByte]; + //DWORD dwwchCount=0; + for(unsigned int i=0;iwchData); + DLCManager::EDLCParameterType type = DLCManager::getParameterType(parameterName); + if( type != DLCManager::e_DLCParamType_Invalid ) + { + parameterMapping[pParams->dwType] = type; + } + uiCurrentByte+= sizeof(C4JStorage::DLC_FILE_PARAM)+(pParams->dwWchCount*sizeof(WCHAR)); + pParams = (C4JStorage::DLC_FILE_PARAM *)&pbData[uiCurrentByte]; + } + //ulCurrentByte+=ulParameterCount * sizeof(C4JStorage::DLC_FILE_PARAM); + + unsigned int uiFileCount=*(unsigned int *)&pbData[uiCurrentByte]; + uiCurrentByte+=sizeof(int); + C4JStorage::DLC_FILE_DETAILS *pFile = (C4JStorage::DLC_FILE_DETAILS *)&pbData[uiCurrentByte]; + + DWORD dwTemp=uiCurrentByte; + for(unsigned int i=0;idwWchCount*sizeof(WCHAR); + pFile = (C4JStorage::DLC_FILE_DETAILS *)&pbData[dwTemp]; + } + PBYTE pbTemp=((PBYTE )pFile);//+ sizeof(C4JStorage::DLC_FILE_DETAILS)*ulFileCount; + pFile = (C4JStorage::DLC_FILE_DETAILS *)&pbData[uiCurrentByte]; + + for(unsigned int i=0;idwType; + + DLCFile *dlcFile = NULL; + DLCPack *dlcTexturePack = NULL; + + if(type == e_DLCType_TexturePack) + { + dlcTexturePack = new DLCPack(pack->getName(), pack->getLicenseMask()); + } + else if(type != e_DLCType_PackConfig) + { + dlcFile = pack->addFile(type,(WCHAR *)pFile->wchFile); + } + + // Params + uiParameterCount=*(unsigned int *)pbTemp; + pbTemp+=sizeof(int); + pParams = (C4JStorage::DLC_FILE_PARAM *)pbTemp; + for(unsigned int j=0;jdwType )); + + if(it != parameterMapping.end() ) + { + if(type == e_DLCType_PackConfig) + { + pack->addParameter(it->second,(WCHAR *)pParams->wchData); + } + else + { + if(dlcFile != NULL) dlcFile->addParameter(it->second,(WCHAR *)pParams->wchData); + else if(dlcTexturePack != NULL) dlcTexturePack->addParameter(it->second, (WCHAR *)pParams->wchData); + } + } + pbTemp+=sizeof(C4JStorage::DLC_FILE_PARAM)+(sizeof(WCHAR)*pParams->dwWchCount); + pParams = (C4JStorage::DLC_FILE_PARAM *)pbTemp; + } + //pbTemp+=ulParameterCount * sizeof(C4JStorage::DLC_FILE_PARAM); + + if(dlcTexturePack != NULL) + { + DWORD texturePackFilesProcessed = 0; + bool validPack = processDLCDataFile(texturePackFilesProcessed,pbTemp,pFile->uiFileSize,dlcTexturePack); + pack->SetDataPointer(NULL); // If it's a child pack, it doesn't own the data + if(!validPack || texturePackFilesProcessed == 0) + { + delete dlcTexturePack; + dlcTexturePack = NULL; + } + else + { + pack->addChildPack(dlcTexturePack); + + if(dlcTexturePack->getDLCItemsCount(DLCManager::e_DLCType_Texture) > 0) + { + Minecraft::GetInstance()->skins->addTexturePackFromDLC(dlcTexturePack, dlcTexturePack->GetPackId() ); + } + } + ++dwFilesProcessed; + } + else if(dlcFile != NULL) + { + // Data + dlcFile->addData(pbTemp,pFile->uiFileSize); + + // TODO - 4J Stu Remove the need for this vSkinNames vector, or manage it differently + switch(pFile->dwType) + { + case DLCManager::e_DLCType_Skin: + app.vSkinNames.push_back((WCHAR *)pFile->wchFile); + break; + } + + ++dwFilesProcessed; + } + + // Move the pointer to the start of the next files data; + pbTemp+=pFile->uiFileSize; + uiCurrentByte+=sizeof(C4JStorage::DLC_FILE_DETAILS)+pFile->dwWchCount*sizeof(WCHAR); + + pFile=(C4JStorage::DLC_FILE_DETAILS *)&pbData[uiCurrentByte]; + } + + if( pack->getDLCItemsCount(DLCManager::e_DLCType_GameRules) > 0 + || pack->getDLCItemsCount(DLCManager::e_DLCType_GameRulesHeader) > 0) + { + app.m_gameRules.loadGameRules(pack); + } + + if(pack->getDLCItemsCount(DLCManager::e_DLCType_Audio) > 0) + { + //app.m_Audio.loadAudioDetails(pack); + } + // TODO Should be able to delete this data, but we can't yet due to how it is added to the Memory textures (MEM_file) + + return true; +} + +DWORD DLCManager::retrievePackIDFromDLCDataFile(const string &path, DLCPack *pack) +{ + DWORD packId = 0; + wstring wPath = convStringToWstring(path); + +#ifdef _WINDOWS64 + string finalPath = StorageManager.GetMountedPath(path.c_str()); + if(finalPath.size() == 0) finalPath = path; + HANDLE file = CreateFile(finalPath.c_str(), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); +#elif defined(_DURANGO) + wstring finalPath = StorageManager.GetMountedPath(wPath.c_str()); + if(finalPath.size() == 0) finalPath = wPath; + HANDLE file = CreateFile(finalPath.c_str(), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); +#else + HANDLE file = CreateFile(path.c_str(), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); +#endif + if( file == INVALID_HANDLE_VALUE ) + { + return 0; + } + + DWORD bytesRead,dwFileSize = GetFileSize(file,NULL); + PBYTE pbData = (PBYTE) new BYTE[dwFileSize]; + BOOL bSuccess = ReadFile(file,pbData,dwFileSize,&bytesRead,NULL); + if(bSuccess==FALSE) + { + // need to treat the file as corrupt, and flag it, so can't call fatal error + //app.FatalLoadError(); + } + else + { + CloseHandle(file); + } + if(bSuccess==FALSE) + { + // Corrupt or some other error. In any case treat as corrupt + app.DebugPrintf("Failed to read %s from DLC content package\n", path.c_str()); + delete [] pbData; + return 0; + } + packId=retrievePackID(pbData, bytesRead, pack); + delete [] pbData; + + return packId; +} + +DWORD DLCManager::retrievePackID(PBYTE pbData, DWORD dwLength, DLCPack *pack) +{ + DWORD packId=0; + bool bPackIDSet=false; + unordered_map parameterMapping; + unsigned int uiCurrentByte=0; + + // File format defined in the DLC_Creator + // File format: Version 2 + // unsigned long, version number + // unsigned long, t = number of parameter types + // t * DLC_FILE_PARAM structs mapping strings to id's + // unsigned long, n = number of files + // n * DLC_FILE_DETAILS describing each file in the pack + // n * files of the form + // // unsigned long, p = number of parameters + // // p * DLC_FILE_PARAM describing each parameter for this file + // // ulFileSize bytes of data blob of the file added + unsigned int uiVersion=*(unsigned int *)pbData; + uiCurrentByte+=sizeof(int); + + if(uiVersion < CURRENT_DLC_VERSION_NUM) + { + app.DebugPrintf("DLC version of %d is too old to be read\n", uiVersion); + return 0; + } + pack->SetDataPointer(pbData); + unsigned int uiParameterCount=*(unsigned int *)&pbData[uiCurrentByte]; + uiCurrentByte+=sizeof(int); + C4JStorage::DLC_FILE_PARAM *pParams = (C4JStorage::DLC_FILE_PARAM *)&pbData[uiCurrentByte]; + for(unsigned int i=0;iwchData); + DLCManager::EDLCParameterType type = DLCManager::getParameterType(parameterName); + if( type != DLCManager::e_DLCParamType_Invalid ) + { + parameterMapping[pParams->dwType] = type; + } + uiCurrentByte+= sizeof(C4JStorage::DLC_FILE_PARAM)+(pParams->dwWchCount*sizeof(WCHAR)); + pParams = (C4JStorage::DLC_FILE_PARAM *)&pbData[uiCurrentByte]; + } + + unsigned int uiFileCount=*(unsigned int *)&pbData[uiCurrentByte]; + uiCurrentByte+=sizeof(int); + C4JStorage::DLC_FILE_DETAILS *pFile = (C4JStorage::DLC_FILE_DETAILS *)&pbData[uiCurrentByte]; + + DWORD dwTemp=uiCurrentByte; + for(unsigned int i=0;idwWchCount*sizeof(WCHAR); + pFile = (C4JStorage::DLC_FILE_DETAILS *)&pbData[dwTemp]; + } + PBYTE pbTemp=((PBYTE )pFile); + pFile = (C4JStorage::DLC_FILE_DETAILS *)&pbData[uiCurrentByte]; + + for(unsigned int i=0;idwType; + + // Params + uiParameterCount=*(unsigned int *)pbTemp; + pbTemp+=sizeof(int); + pParams = (C4JStorage::DLC_FILE_PARAM *)pbTemp; + for(unsigned int j=0;jdwType )); + + if(it != parameterMapping.end() ) + { + if(type==e_DLCType_PackConfig) + { + if(it->second==e_DLCParamType_PackId) + { + wstring wsTemp=(WCHAR *)pParams->wchData; + std::wstringstream ss; + // 4J Stu - numbered using decimal to make it easier for artists/people to number manually + ss << std::dec << wsTemp.c_str(); + ss >> packId; + bPackIDSet=true; + break; + } + } + } + pbTemp+=sizeof(C4JStorage::DLC_FILE_PARAM)+(sizeof(WCHAR)*pParams->dwWchCount); + pParams = (C4JStorage::DLC_FILE_PARAM *)pbTemp; + } + + if(bPackIDSet) break; + // Move the pointer to the start of the next files data; + pbTemp+=pFile->uiFileSize; + uiCurrentByte+=sizeof(C4JStorage::DLC_FILE_DETAILS)+pFile->dwWchCount*sizeof(WCHAR); + + pFile=(C4JStorage::DLC_FILE_DETAILS *)&pbData[uiCurrentByte]; + } + + parameterMapping.clear(); + return packId; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/DLC/DLCManager.h b/Minecraft.Client/Common/DLC/DLCManager.h new file mode 100644 index 00000000..27765232 --- /dev/null +++ b/Minecraft.Client/Common/DLC/DLCManager.h @@ -0,0 +1,101 @@ +#pragma once +using namespace std; +#include +class DLCPack; +class DLCSkinFile; + +class DLCManager +{ +public: + enum EDLCType + { + e_DLCType_Skin = 0, + e_DLCType_Cape, + e_DLCType_Texture, + e_DLCType_UIData, + e_DLCType_PackConfig, + e_DLCType_TexturePack, + e_DLCType_LocalisationData, + e_DLCType_GameRules, + e_DLCType_Audio, + e_DLCType_ColourTable, + e_DLCType_GameRulesHeader, + + e_DLCType_Max, + e_DLCType_All, + }; + + // If you add to the Enum,then you need to add the array of type names + // These are the names used in the XML for the parameters + enum EDLCParameterType + { + e_DLCParamType_Invalid = -1, + + e_DLCParamType_DisplayName = 0, + e_DLCParamType_ThemeName, + e_DLCParamType_Free, // identify free skins + e_DLCParamType_Credit, // legal credits for DLC + e_DLCParamType_Cape, + e_DLCParamType_Box, + e_DLCParamType_Anim, + e_DLCParamType_PackId, + e_DLCParamType_NetherParticleColour, + e_DLCParamType_EnchantmentTextColour, + e_DLCParamType_EnchantmentTextFocusColour, + e_DLCParamType_DataPath, + e_DLCParamType_PackVersion, + + e_DLCParamType_Max, + + }; + static WCHAR *wchTypeNamesA[e_DLCParamType_Max]; + +private: + vector m_packs; + //bool m_bNeedsUpdated; + bool m_bNeedsCorruptCheck; + DWORD m_dwUnnamedCorruptDLCCount; +public: + DLCManager(); + ~DLCManager(); + + static EDLCParameterType getParameterType(const wstring ¶mName); + + DWORD getPackCount(EDLCType type = e_DLCType_All); + + //bool NeedsUpdated() { return m_bNeedsUpdated; } + //void SetNeedsUpdated(bool val) { m_bNeedsUpdated = val; } + + bool NeedsCorruptCheck() { return m_bNeedsCorruptCheck; } + void SetNeedsCorruptCheck(bool val) { m_bNeedsCorruptCheck = val; } + + void resetUnnamedCorruptCount() { m_dwUnnamedCorruptDLCCount = 0; } + void incrementUnnamedCorruptCount() { ++m_dwUnnamedCorruptDLCCount; } + + void addPack(DLCPack *pack); + void removePack(DLCPack *pack); + void removeAllPacks(void); + void LanguageChanged(void); + + DLCPack *getPack(const wstring &name); +#ifdef _XBOX_ONE + DLCPack *DLCManager::getPackFromProductID(const wstring &productID); +#endif + DLCPack *getPack(DWORD index, EDLCType type = e_DLCType_All); + DWORD getPackIndex(DLCPack *pack, bool &found, EDLCType type = e_DLCType_All); + DLCSkinFile *getSkinFile(const wstring &path); // Will hunt all packs of type skin to find the right skinfile + + DLCPack *getPackContainingSkin(const wstring &path); + DWORD getPackIndexContainingSkin(const wstring &path, bool &found); + + DWORD checkForCorruptDLCAndAlert(bool showMessage = true); + + bool readDLCDataFile(DWORD &dwFilesProcessed, const wstring &path, DLCPack *pack, bool fromArchive = false); + bool readDLCDataFile(DWORD &dwFilesProcessed, const string &path, DLCPack *pack, bool fromArchive = false); + DWORD retrievePackIDFromDLCDataFile(const string &path, DLCPack *pack); + +private: + bool processDLCDataFile(DWORD &dwFilesProcessed, PBYTE pbData, DWORD dwLength, DLCPack *pack); + + DWORD retrievePackID(PBYTE pbData, DWORD dwLength, DLCPack *pack); +}; diff --git a/Minecraft.Client/Common/DLC/DLCPack.cpp b/Minecraft.Client/Common/DLC/DLCPack.cpp new file mode 100644 index 00000000..187b1ee6 --- /dev/null +++ b/Minecraft.Client/Common/DLC/DLCPack.cpp @@ -0,0 +1,428 @@ +#include "stdafx.h" +#include "DLCPack.h" +#include "DLCSkinFile.h" +#include "DLCCapeFile.h" +#include "DLCTextureFile.h" +#include "DLCUIDataFile.h" +#include "DLCLocalisationFile.h" +#include "DLCGameRulesFile.h" +#include "DLCGameRulesHeader.h" +#include "DLCAudioFile.h" +#include "DLCColourTableFile.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" + +DLCPack::DLCPack(const wstring &name,DWORD dwLicenseMask) +{ + m_dataPath = L""; + m_packName = name; + m_dwLicenseMask=dwLicenseMask; +#ifdef _XBOX_ONE + m_wsProductId = L""; +#else + m_ullFullOfferId = 0LL; +#endif + m_isCorrupt = false; + m_packId = 0; + m_packVersion = 0; + m_parentPack = NULL; + m_dlcMountIndex = -1; +#ifdef _XBOX + m_dlcDeviceID = XCONTENTDEVICE_ANY; +#endif + + // This pointer is for all the data used for this pack, so deleting it invalidates ALL of it's children. + m_data = NULL; +} + +#ifdef _XBOX_ONE +DLCPack::DLCPack(const wstring &name,const wstring &productID,DWORD dwLicenseMask) +{ + m_dataPath = L""; + m_packName = name; + m_dwLicenseMask=dwLicenseMask; + m_wsProductId = productID; + m_isCorrupt = false; + m_packId = 0; + m_packVersion = 0; + m_parentPack = NULL; + m_dlcMountIndex = -1; + + // This pointer is for all the data used for this pack, so deleting it invalidates ALL of it's children. + m_data = NULL; +} +#endif + +DLCPack::~DLCPack() +{ + for(AUTO_VAR(it, m_childPacks.begin()); it != m_childPacks.end(); ++it) + { + delete *it; + } + + for(unsigned int i = 0; i < DLCManager::e_DLCType_Max; ++i) + { + for(AUTO_VAR(it,m_files[i].begin()); it != m_files[i].end(); ++it) + { + delete *it; + } + } + + // This pointer is for all the data used for this pack, so deleting it invalidates ALL of it's children. + if(m_data) + { +#ifndef _CONTENT_PACKAGE + wprintf(L"Deleting data for DLC pack %ls\n", m_packName.c_str()); +#endif + // For the same reason, don't delete data pointer for any child pack as it just points to a region within the parent pack that has already been freed + if( m_parentPack == NULL ) + { + delete [] m_data; + } + } +} + +DWORD DLCPack::GetDLCMountIndex() +{ + if(m_parentPack != NULL) + { + return m_parentPack->GetDLCMountIndex(); + } + return m_dlcMountIndex; +} + +XCONTENTDEVICEID DLCPack::GetDLCDeviceID() +{ + if(m_parentPack != NULL ) + { + return m_parentPack->GetDLCDeviceID(); + } + return m_dlcDeviceID; +} + +void DLCPack::addChildPack(DLCPack *childPack) +{ + int packId = childPack->GetPackId(); +#ifndef _CONTENT_PACKAGE + if(packId < 0 || packId > 15) + { + __debugbreak(); + } +#endif + childPack->SetPackId( (packId<<24) | m_packId ); + m_childPacks.push_back(childPack); + childPack->setParentPack(this); + childPack->m_packName = m_packName + childPack->getName(); +} + +void DLCPack::setParentPack(DLCPack *parentPack) +{ + m_parentPack = parentPack; +} + +void DLCPack::addParameter(DLCManager::EDLCParameterType type, const wstring &value) +{ + switch(type) + { + case DLCManager::e_DLCParamType_PackId: + { + DWORD packId = 0; + + std::wstringstream ss; + // 4J Stu - numbered using decimal to make it easier for artists/people to number manually + ss << std::dec << value.c_str(); + ss >> packId; + + SetPackId(packId); + } + break; + case DLCManager::e_DLCParamType_PackVersion: + { + DWORD version = 0; + + std::wstringstream ss; + // 4J Stu - numbered using decimal to make it easier for artists/people to number manually + ss << std::dec << value.c_str(); + ss >> version; + + SetPackVersion(version); + } + break; + case DLCManager::e_DLCParamType_DisplayName: + m_packName = value; + break; + case DLCManager::e_DLCParamType_DataPath: + m_dataPath = value; + break; + default: + m_parameters[(int)type] = value; + break; + } +} + +bool DLCPack::getParameterAsUInt(DLCManager::EDLCParameterType type, unsigned int ¶m) +{ + AUTO_VAR(it,m_parameters.find((int)type)); + if(it != m_parameters.end()) + { + switch(type) + { + case DLCManager::e_DLCParamType_NetherParticleColour: + case DLCManager::e_DLCParamType_EnchantmentTextColour: + case DLCManager::e_DLCParamType_EnchantmentTextFocusColour: + { + std::wstringstream ss; + ss << std::hex << it->second.c_str(); + ss >> param; + } + break; + default: + param = _fromString(it->second); + } + return true; + } + return false; +} + +DLCFile *DLCPack::addFile(DLCManager::EDLCType type, const wstring &path) +{ + DLCFile *newFile = NULL; + + switch(type) + { + case DLCManager::e_DLCType_Skin: + { + wstring newPath = replaceAll(path, L"\\", L"/"); + std::vector splitPath = stringSplit(newPath,L'/'); + wstring strippedPath = splitPath.back(); + + newFile = new DLCSkinFile(strippedPath); + + // check to see if we can get the full offer id using this skin name +#ifdef _XBOX_ONE + app.GetDLCFullOfferIDForSkinID(strippedPath,m_wsProductId); +#else + ULONGLONG ullVal=0LL; + + if(app.GetDLCFullOfferIDForSkinID(strippedPath,&ullVal)) + { + m_ullFullOfferId=ullVal; + } +#endif + } + break; + case DLCManager::e_DLCType_Cape: + { + wstring newPath = replaceAll(path, L"\\", L"/"); + std::vector splitPath = stringSplit(newPath,L'/'); + wstring strippedPath = splitPath.back(); + newFile = new DLCCapeFile(strippedPath); + } + break; + case DLCManager::e_DLCType_Texture: + newFile = new DLCTextureFile(path); + break; + case DLCManager::e_DLCType_UIData: + newFile = new DLCUIDataFile(path); + break; + case DLCManager::e_DLCType_LocalisationData: + newFile = new DLCLocalisationFile(path); + break; + case DLCManager::e_DLCType_GameRules: + newFile = new DLCGameRulesFile(path); + break; + case DLCManager::e_DLCType_Audio: + newFile = new DLCAudioFile(path); + break; + case DLCManager::e_DLCType_ColourTable: + newFile = new DLCColourTableFile(path); + break; + case DLCManager::e_DLCType_GameRulesHeader: + newFile = new DLCGameRulesHeader(path); + break; + }; + + if( newFile != NULL ) + { + m_files[newFile->getType()].push_back(newFile); + } + + return newFile; +} + +// MGH - added this comp func, as the embedded func in find_if was confusing the PS3 compiler +static const wstring *g_pathCmpString = NULL; +static bool pathCmp(DLCFile *val) +{ + return (g_pathCmpString->compare(val->getPath()) == 0); +} + +bool DLCPack::doesPackContainFile(DLCManager::EDLCType type, const wstring &path) +{ + bool hasFile = false; + if(type == DLCManager::e_DLCType_All) + { + for(DLCManager::EDLCType currentType = (DLCManager::EDLCType)0; currentType < DLCManager::e_DLCType_Max; currentType = (DLCManager::EDLCType)(currentType + 1)) + { + hasFile = doesPackContainFile(currentType,path); + if(hasFile) break; + } + } + else + { + g_pathCmpString = &path; + AUTO_VAR(it, find_if( m_files[type].begin(), m_files[type].end(), pathCmp )); + hasFile = it != m_files[type].end(); + if(!hasFile && m_parentPack ) + { + hasFile = m_parentPack->doesPackContainFile(type,path); + } + } + return hasFile; +} + +DLCFile *DLCPack::getFile(DLCManager::EDLCType type, DWORD index) +{ + DLCFile *file = NULL; + if(type == DLCManager::e_DLCType_All) + { + for(DLCManager::EDLCType currentType = (DLCManager::EDLCType)0; currentType < DLCManager::e_DLCType_Max; currentType = (DLCManager::EDLCType)(currentType + 1)) + { + file = getFile(currentType,index); + if(file != NULL) break; + } + } + else + { + if(m_files[type].size() > index) file = m_files[type][index]; + if(!file && m_parentPack) + { + file = m_parentPack->getFile(type,index); + } + } + return file; +} + +DLCFile *DLCPack::getFile(DLCManager::EDLCType type, const wstring &path) +{ + DLCFile *file = NULL; + if(type == DLCManager::e_DLCType_All) + { + for(DLCManager::EDLCType currentType = (DLCManager::EDLCType)0; currentType < DLCManager::e_DLCType_Max; currentType = (DLCManager::EDLCType)(currentType + 1)) + { + file = getFile(currentType,path); + if(file != NULL) break; + } + } + else + { + g_pathCmpString = &path; + AUTO_VAR(it, find_if( m_files[type].begin(), m_files[type].end(), pathCmp )); + + if(it == m_files[type].end()) + { + // Not found + file = NULL; + } + else + { + file = *it; + } + if(!file && m_parentPack) + { + file = m_parentPack->getFile(type,path); + } + } + return file; +} + +DWORD DLCPack::getDLCItemsCount(DLCManager::EDLCType type /*= DLCManager::e_DLCType_All*/) +{ + DWORD count = 0; + + switch(type) + { + case DLCManager::e_DLCType_All: + for(int i = 0; i < DLCManager::e_DLCType_Max; ++i) + { + count += getDLCItemsCount((DLCManager::EDLCType)i); + } + break; + default: + count = (DWORD)m_files[(int)type].size(); + break; + }; + return count; +}; + +DWORD DLCPack::getFileIndexAt(DLCManager::EDLCType type, const wstring &path, bool &found) +{ + if(type == DLCManager::e_DLCType_All) + { + app.DebugPrintf("Unimplemented\n"); +#ifndef __CONTENT_PACKAGE + __debugbreak(); +#endif + return 0; + } + + DWORD foundIndex = 0; + found = false; + DWORD index = 0; + for(AUTO_VAR(it, m_files[type].begin()); it != m_files[type].end(); ++it) + { + if(path.compare((*it)->getPath()) == 0) + { + foundIndex = index; + found = true; + break; + } + ++index; + } + + return foundIndex; +} + +bool DLCPack::hasPurchasedFile(DLCManager::EDLCType type, const wstring &path) +{ + if(type == DLCManager::e_DLCType_All) + { + app.DebugPrintf("Unimplemented\n"); +#ifndef _CONTENT_PACKAGE + __debugbreak(); +#endif + return false; + } +#ifndef _CONTENT_PACKAGE + if( app.GetGameSettingsDebugMask(ProfileManager.GetPrimaryPad())&(1L< 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 new file mode 100644 index 00000000..df1f65f0 --- /dev/null +++ b/Minecraft.Client/Common/DLC/DLCPack.h @@ -0,0 +1,95 @@ +#pragma once +using namespace std; +#include "DLCManager.h" + +class DLCFile; +class DLCSkinFile; + +class DLCPack +{ +private: + vector m_files[DLCManager::e_DLCType_Max]; + vector m_childPacks; + DLCPack *m_parentPack; + + unordered_map m_parameters; + + wstring m_packName; + wstring m_dataPath; + DWORD m_dwLicenseMask; + int m_dlcMountIndex; + XCONTENTDEVICEID m_dlcDeviceID; +#ifdef _XBOX_ONE + wstring m_wsProductId; +#else + ULONGLONG m_ullFullOfferId; +#endif + bool m_isCorrupt; + DWORD m_packId; + DWORD m_packVersion; + + PBYTE m_data; // This pointer is for all the data used for this pack, so deleting it invalidates ALL of it's children. +public: + + DLCPack(const wstring &name,DWORD dwLicenseMask); +#ifdef _XBOX_ONE + DLCPack(const wstring &name,const wstring &productID,DWORD dwLicenseMask); +#endif + ~DLCPack(); + + wstring getFullDataPath() { return m_dataPath; } + + void SetDataPointer(PBYTE pbData) { m_data = pbData; } + + bool IsCorrupt() { return m_isCorrupt; } + void SetIsCorrupt(bool val) { m_isCorrupt = val; } + + void SetPackId(DWORD id) { m_packId = id; } + DWORD GetPackId() { return m_packId; } + + void SetPackVersion(DWORD version) { m_packVersion = version; } + DWORD GetPackVersion() { return m_packVersion; } + + DLCPack * GetParentPack() { return m_parentPack; } + DWORD GetParentPackId() { return m_parentPack->m_packId; } + + void SetDLCMountIndex(DWORD id) { m_dlcMountIndex = id; } + DWORD GetDLCMountIndex(); + void SetDLCDeviceID(XCONTENTDEVICEID deviceId) { m_dlcDeviceID = deviceId; } + XCONTENTDEVICEID GetDLCDeviceID(); + + void addChildPack(DLCPack *childPack); + void setParentPack(DLCPack *parentPack); + + void addParameter(DLCManager::EDLCParameterType type, const wstring &value); + bool getParameterAsUInt(DLCManager::EDLCParameterType type, unsigned int ¶m); + + void updateLicenseMask( DWORD dwLicenseMask ) { m_dwLicenseMask = dwLicenseMask; } + DWORD getLicenseMask( ) { return m_dwLicenseMask; } + + wstring getName() { return m_packName; } + + void UpdateLanguage(); +#ifdef _XBOX_ONE + wstring getPurchaseOfferId() { return m_wsProductId; } +#else + ULONGLONG getPurchaseOfferId() { return m_ullFullOfferId; } +#endif + + DLCFile *addFile(DLCManager::EDLCType type, const wstring &path); + DLCFile *getFile(DLCManager::EDLCType type, DWORD index); + DLCFile *getFile(DLCManager::EDLCType type, const wstring &path); + + DWORD getDLCItemsCount(DLCManager::EDLCType type = DLCManager::e_DLCType_All); + DWORD getFileIndexAt(DLCManager::EDLCType type, const wstring &path, bool &found); + bool doesPackContainFile(DLCManager::EDLCType type, const wstring &path); + DWORD GetPackID() {return m_packId;} + + DWORD getSkinCount() { return getDLCItemsCount(DLCManager::e_DLCType_Skin); } + DWORD getSkinIndexAt(const wstring &path, bool &found) { return getFileIndexAt(DLCManager::e_DLCType_Skin, path, found); } + DLCSkinFile *getSkinFile(const wstring &path) { return (DLCSkinFile *)getFile(DLCManager::e_DLCType_Skin, path); } + DLCSkinFile *getSkinFile(DWORD index) { return (DLCSkinFile *)getFile(DLCManager::e_DLCType_Skin, index); } + bool doesPackContainSkin(const wstring &path) { return doesPackContainFile(DLCManager::e_DLCType_Skin, path); } + + bool hasPurchasedFile(DLCManager::EDLCType type, const wstring &path); +}; diff --git a/Minecraft.Client/Common/DLC/DLCSkinFile.cpp b/Minecraft.Client/Common/DLC/DLCSkinFile.cpp new file mode 100644 index 00000000..f3768a34 --- /dev/null +++ b/Minecraft.Client/Common/DLC/DLCSkinFile.cpp @@ -0,0 +1,212 @@ +#include "stdafx.h" +#include "DLCManager.h" +#include "DLCSkinFile.h" +#include "..\..\ModelPart.h" +#include "..\..\EntityRenderer.h" +#include "..\..\EntityRenderDispatcher.h" +#include "..\..\..\Minecraft.World\Player.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" + +DLCSkinFile::DLCSkinFile(const wstring &path) : DLCFile(DLCManager::e_DLCType_Skin,path) +{ + m_displayName = L""; + m_themeName = L""; + m_cape = L""; + m_bIsFree = false; + m_uiAnimOverrideBitmask=0L; +} + +void DLCSkinFile::addData(PBYTE pbData, DWORD dwBytes) +{ + app.AddMemoryTextureFile(m_path,pbData,dwBytes); +} + +void DLCSkinFile::addParameter(DLCManager::EDLCParameterType type, const wstring &value) +{ + switch(type) + { + case DLCManager::e_DLCParamType_DisplayName: + { + // 4J Stu - In skin pack 2, the name for Zap is mis-spelt with two p's as Zapp + // dlcskin00000109.png + if( m_path.compare(L"dlcskin00000109.png") == 0) + { + m_displayName = L"Zap"; + } + else + { + m_displayName = value; + } + } + break; + case DLCManager::e_DLCParamType_ThemeName: + m_themeName = value; + break; + case DLCManager::e_DLCParamType_Free: // If this parameter exists, then mark this as free + m_bIsFree = true; + break; + case DLCManager::e_DLCParamType_Credit: // If this parameter exists, then mark this as free + //add it to the DLC credits list + + // we'll need to justify this text since we don't have a lot of room for lines of credits + { + if(app.AlreadySeenCreditText(value)) break; + // first add a blank string for spacing + app.AddCreditText(L""); + + int maximumChars = 55; + + bool bIsSDMode=!RenderManager.IsHiDef() && !RenderManager.IsWidescreen(); + + if(bIsSDMode) + { + maximumChars = 45; + } + + switch(XGetLanguage()) + { + case XC_LANGUAGE_JAPANESE: + case XC_LANGUAGE_TCHINESE: + case XC_LANGUAGE_KOREAN: + maximumChars = 35; + break; + } + wstring creditValue = value; + while (creditValue.length() > maximumChars) + { + unsigned int i = 1; + while (i < creditValue.length() && (i + 1) <= maximumChars) + { + i++; + } + int iLast=(int)creditValue.find_last_of(L" ",i); + switch(XGetLanguage()) + { + case XC_LANGUAGE_JAPANESE: + case XC_LANGUAGE_TCHINESE: + case XC_LANGUAGE_KOREAN: + iLast = maximumChars; + break; + default: + iLast=(int)creditValue.find_last_of(L" ",i); + break; + } + + // if a space was found, include the space on this line + if(iLast!=i) + { + iLast++; + } + + app.AddCreditText((creditValue.substr(0, iLast)).c_str()); + creditValue = creditValue.substr(iLast); + } + app.AddCreditText(creditValue.c_str()); + + } + break; + case DLCManager::e_DLCParamType_Cape: + m_cape = value; + break; + case DLCManager::e_DLCParamType_Box: + { + WCHAR wchBodyPart[10]; + SKIN_BOX *pSkinBox = new SKIN_BOX; + ZeroMemory(pSkinBox,sizeof(SKIN_BOX)); + +#ifdef __PS3__ + // 4J Stu - The Xbox version used swscanf_s which isn't available in GCC. + swscanf(value.c_str(), L"%10ls%f%f%f%f%f%f%f%f", wchBodyPart, +#else + swscanf_s(value.c_str(), L"%9ls%f%f%f%f%f%f%f%f", wchBodyPart,10, +#endif + &pSkinBox->fX, + &pSkinBox->fY, + &pSkinBox->fZ, + &pSkinBox->fW, + &pSkinBox->fH, + &pSkinBox->fD, + &pSkinBox->fU, + &pSkinBox->fV); + + if(wcscmp(wchBodyPart,L"HEAD")==0) + { + pSkinBox->ePart=eBodyPart_Head; + } + else if(wcscmp(wchBodyPart,L"BODY")==0) + { + pSkinBox->ePart=eBodyPart_Body; + } + else if(wcscmp(wchBodyPart,L"ARM0")==0) + { + pSkinBox->ePart=eBodyPart_Arm0; + } + else if(wcscmp(wchBodyPart,L"ARM1")==0) + { + pSkinBox->ePart=eBodyPart_Arm1; + } + else if(wcscmp(wchBodyPart,L"LEG0")==0) + { + pSkinBox->ePart=eBodyPart_Leg0; + } + else if(wcscmp(wchBodyPart,L"LEG1")==0) + { + pSkinBox->ePart=eBodyPart_Leg1; + } + + // add this to the skin's vector of parts + m_AdditionalBoxes.push_back(pSkinBox); + } + break; + case DLCManager::e_DLCParamType_Anim: +#ifdef __PS3__ + // 4J Stu - The Xbox version used swscanf_s which isn't available in GCC. + swscanf(value.c_str(), L"%X", &m_uiAnimOverrideBitmask); +#else + swscanf_s(value.c_str(), L"%X", &m_uiAnimOverrideBitmask,sizeof(unsigned int)); +#endif + DWORD skinId = app.getSkinIdFromPath(m_path); + app.SetAnimOverrideBitmask(skinId, m_uiAnimOverrideBitmask); + break; + } +} + +// vector *DLCSkinFile::getAdditionalModelParts() +// { +// return &m_AdditionalModelParts; +// } + +int DLCSkinFile::getAdditionalBoxesCount() +{ + return (int)m_AdditionalBoxes.size(); +} +vector *DLCSkinFile::getAdditionalBoxes() +{ + return &m_AdditionalBoxes; +} + +wstring DLCSkinFile::getParameterAsString(DLCManager::EDLCParameterType type) +{ + switch(type) + { + case DLCManager::e_DLCParamType_DisplayName: + return m_displayName; + case DLCManager::e_DLCParamType_ThemeName: + return m_themeName; + case DLCManager::e_DLCParamType_Cape: + return m_cape; + default: + return L""; + } +} + +bool DLCSkinFile::getParameterAsBool(DLCManager::EDLCParameterType type) +{ + switch(type) + { + case DLCManager::e_DLCParamType_Free: + return m_bIsFree; + default: + return false; + } +} diff --git a/Minecraft.Client/Common/DLC/DLCSkinFile.h b/Minecraft.Client/Common/DLC/DLCSkinFile.h new file mode 100644 index 00000000..c8dcf0e9 --- /dev/null +++ b/Minecraft.Client/Common/DLC/DLCSkinFile.h @@ -0,0 +1,29 @@ +#pragma once +#include "DLCFile.h" +#include "..\..\..\Minecraft.Client\HumanoidModel.h" + +class DLCSkinFile : public DLCFile +{ + +private: + wstring m_displayName; + wstring m_themeName; + wstring m_cape; + unsigned int m_uiAnimOverrideBitmask; + bool m_bIsFree; + vector m_AdditionalBoxes; + +public: + + DLCSkinFile(const wstring &path); + + virtual void addData(PBYTE pbData, DWORD dwBytes); + virtual void addParameter(DLCManager::EDLCParameterType type, const wstring &value); + + virtual wstring getParameterAsString(DLCManager::EDLCParameterType type); + virtual bool getParameterAsBool(DLCManager::EDLCParameterType type); + vector *getAdditionalBoxes(); + int getAdditionalBoxesCount(); + unsigned int getAnimOverrideBitmask() { return m_uiAnimOverrideBitmask;} + bool isFree() {return m_bIsFree;} +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/DLC/DLCTextureFile.cpp b/Minecraft.Client/Common/DLC/DLCTextureFile.cpp new file mode 100644 index 00000000..edf071c6 --- /dev/null +++ b/Minecraft.Client/Common/DLC/DLCTextureFile.cpp @@ -0,0 +1,60 @@ +#include "stdafx.h" +#include "DLCManager.h" +#include "DLCTextureFile.h" + +DLCTextureFile::DLCTextureFile(const wstring &path) : DLCFile(DLCManager::e_DLCType_Texture,path) +{ + m_bIsAnim = false; + m_animString = L""; + + m_pbData = NULL; + m_dwBytes = 0; +} + +void DLCTextureFile::addData(PBYTE pbData, DWORD dwBytes) +{ + //app.AddMemoryTextureFile(m_path,pbData,dwBytes); + m_pbData = pbData; + m_dwBytes = dwBytes; +} + +PBYTE DLCTextureFile::getData(DWORD &dwBytes) +{ + dwBytes = m_dwBytes; + return m_pbData; +} + +void DLCTextureFile::addParameter(DLCManager::EDLCParameterType type, const wstring &value) +{ + switch(type) + { + case DLCManager::e_DLCParamType_Anim: + m_animString = value; + if(m_animString.empty()) m_animString = L","; + m_bIsAnim = true; + + break; + } +} + +wstring DLCTextureFile::getParameterAsString(DLCManager::EDLCParameterType type) +{ + switch(type) + { + case DLCManager::e_DLCParamType_Anim: + return m_animString; + default: + return L""; + } +} + +bool DLCTextureFile::getParameterAsBool(DLCManager::EDLCParameterType type) +{ + switch(type) + { + case DLCManager::e_DLCParamType_Anim: + return m_bIsAnim; + default: + return false; + } +} \ No newline at end of file diff --git a/Minecraft.Client/Common/DLC/DLCTextureFile.h b/Minecraft.Client/Common/DLC/DLCTextureFile.h new file mode 100644 index 00000000..bc791686 --- /dev/null +++ b/Minecraft.Client/Common/DLC/DLCTextureFile.h @@ -0,0 +1,24 @@ +#pragma once +#include "DLCFile.h" + +class DLCTextureFile : public DLCFile +{ + +private: + bool m_bIsAnim; + wstring m_animString; + + PBYTE m_pbData; + DWORD m_dwBytes; + +public: + DLCTextureFile(const wstring &path); + + virtual void addData(PBYTE pbData, DWORD dwBytes); + virtual PBYTE getData(DWORD &dwBytes); + + virtual void addParameter(DLCManager::EDLCParameterType type, const wstring &value); + + virtual wstring getParameterAsString(DLCManager::EDLCParameterType type); + virtual bool getParameterAsBool(DLCManager::EDLCParameterType type); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/DLC/DLCUIDataFile.cpp b/Minecraft.Client/Common/DLC/DLCUIDataFile.cpp new file mode 100644 index 00000000..a2a56bca --- /dev/null +++ b/Minecraft.Client/Common/DLC/DLCUIDataFile.cpp @@ -0,0 +1,32 @@ +#include "stdafx.h" +#include "DLCManager.h" +#include "DLCUIDataFile.h" + +DLCUIDataFile::DLCUIDataFile(const wstring &path) : DLCFile(DLCManager::e_DLCType_UIData,path) +{ + m_pbData = NULL; + m_dwBytes = 0; + m_canDeleteData = false; +} + +DLCUIDataFile::~DLCUIDataFile() +{ + if(m_canDeleteData && m_pbData != NULL) + { + app.DebugPrintf("Deleting DLCUIDataFile data\n"); + delete [] m_pbData; + } +} + +void DLCUIDataFile::addData(PBYTE pbData, DWORD dwBytes,bool canDeleteData) +{ + m_pbData = pbData; + m_dwBytes = dwBytes; + m_canDeleteData = canDeleteData; +} + +PBYTE DLCUIDataFile::getData(DWORD &dwBytes) +{ + dwBytes = m_dwBytes; + return m_pbData; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/DLC/DLCUIDataFile.h b/Minecraft.Client/Common/DLC/DLCUIDataFile.h new file mode 100644 index 00000000..105ad0df --- /dev/null +++ b/Minecraft.Client/Common/DLC/DLCUIDataFile.h @@ -0,0 +1,20 @@ +#pragma once +#include "DLCFile.h" + +class DLCUIDataFile : public DLCFile +{ +private: + PBYTE m_pbData; + DWORD m_dwBytes; + bool m_canDeleteData; + +public: + DLCUIDataFile(const wstring &path); + ~DLCUIDataFile(); + + using DLCFile::addData; + using DLCFile::addParameter; + + virtual void addData(PBYTE pbData, DWORD dwBytes,bool canDeleteData = false); + virtual PBYTE getData(DWORD &dwBytes); +}; diff --git a/Minecraft.Client/Common/GameRules/AddEnchantmentRuleDefinition.cpp b/Minecraft.Client/Common/GameRules/AddEnchantmentRuleDefinition.cpp new file mode 100644 index 00000000..eabc1401 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/AddEnchantmentRuleDefinition.cpp @@ -0,0 +1,70 @@ +#include "stdafx.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.enchantment.h" +#include "AddEnchantmentRuleDefinition.h" + +AddEnchantmentRuleDefinition::AddEnchantmentRuleDefinition() +{ + m_enchantmentId = m_enchantmentLevel = 0; +} + +void AddEnchantmentRuleDefinition::writeAttributes(DataOutputStream *dos, UINT numAttributes) +{ + GameRuleDefinition::writeAttributes(dos, numAttributes + 2); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_enchantmentId); + dos->writeUTF( _toString( m_enchantmentId ) ); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_enchantmentLevel); + dos->writeUTF( _toString( m_enchantmentLevel ) ); +} + +void AddEnchantmentRuleDefinition::addAttribute(const wstring &attributeName, const wstring &attributeValue) +{ + if(attributeName.compare(L"enchantmentId") == 0) + { + int value = _fromString(attributeValue); + if(value < 0) value = 0; + if(value >= 256) value = 255; + m_enchantmentId = value; + app.DebugPrintf("AddEnchantmentRuleDefinition: Adding parameter enchantmentId=%d\n",m_enchantmentId); + } + else if(attributeName.compare(L"enchantmentLevel") == 0) + { + int value = _fromString(attributeValue); + if(value < 0) value = 0; + m_enchantmentLevel = value; + app.DebugPrintf("AddEnchantmentRuleDefinition: Adding parameter enchantmentLevel=%d\n",m_enchantmentLevel); + } + else + { + GameRuleDefinition::addAttribute(attributeName, attributeValue); + } +} + +bool AddEnchantmentRuleDefinition::enchantItem(shared_ptr item) +{ + bool enchanted = false; + if (item != NULL) + { + // 4J-JEV: Ripped code from enchantmenthelpers + // Maybe we want to add an addEnchantment method to EnchantmentHelpers + if (item->id == Item::enchantedBook_Id) + { + Item::enchantedBook->addEnchantment( item, new EnchantmentInstance(m_enchantmentId, m_enchantmentLevel) ); + } + else if (item->isEnchantable()) + { + Enchantment *e = Enchantment::enchantments[m_enchantmentId]; + + if(e != NULL && e->category->canEnchant(item->getItem())) + { + int level = min(e->getMaxLevel(), m_enchantmentLevel); + item->enchant(e, m_enchantmentLevel); + enchanted = true; + } + } + } + return enchanted; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/AddEnchantmentRuleDefinition.h b/Minecraft.Client/Common/GameRules/AddEnchantmentRuleDefinition.h new file mode 100644 index 00000000..3beece10 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/AddEnchantmentRuleDefinition.h @@ -0,0 +1,23 @@ +#pragma once + +#include "GameRuleDefinition.h" + +class ItemInstance; + +class AddEnchantmentRuleDefinition : public GameRuleDefinition +{ +private: + int m_enchantmentId; + int m_enchantmentLevel; + +public: + AddEnchantmentRuleDefinition(); + + virtual ConsoleGameRules::EGameRuleType getActionType() { return ConsoleGameRules::eGameRuleType_AddEnchantment; } + + virtual void writeAttributes(DataOutputStream *, UINT numAttrs); + + virtual void addAttribute(const wstring &attributeName, const wstring &attributeValue); + + bool enchantItem(shared_ptr item); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/AddItemRuleDefinition.cpp b/Minecraft.Client/Common/GameRules/AddItemRuleDefinition.cpp new file mode 100644 index 00000000..0d14884a --- /dev/null +++ b/Minecraft.Client/Common/GameRules/AddItemRuleDefinition.cpp @@ -0,0 +1,127 @@ +#include "stdafx.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.entity.player.h" +#include "AddItemRuleDefinition.h" +#include "AddEnchantmentRuleDefinition.h" + +AddItemRuleDefinition::AddItemRuleDefinition() +{ + m_itemId = m_quantity = m_auxValue = m_dataTag = 0; + m_slot = -1; +} + +void AddItemRuleDefinition::writeAttributes(DataOutputStream *dos, UINT numAttrs) +{ + GameRuleDefinition::writeAttributes(dos, numAttrs + 5); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_itemId); + dos->writeUTF( _toString( m_itemId ) ); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_quantity); + dos->writeUTF( _toString( m_quantity ) ); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_auxValue); + dos->writeUTF( _toString( m_auxValue ) ); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_dataTag); + dos->writeUTF( _toString( m_dataTag ) ); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_slot); + dos->writeUTF( _toString( m_slot ) ); +} + +void AddItemRuleDefinition::getChildren(vector *children) +{ + GameRuleDefinition::getChildren( children ); + for (AUTO_VAR(it, m_enchantments.begin()); it != m_enchantments.end(); it++) + children->push_back( *it ); +} + +GameRuleDefinition *AddItemRuleDefinition::addChild(ConsoleGameRules::EGameRuleType ruleType) +{ + GameRuleDefinition *rule = NULL; + if(ruleType == ConsoleGameRules::eGameRuleType_AddEnchantment) + { + rule = new AddEnchantmentRuleDefinition(); + m_enchantments.push_back((AddEnchantmentRuleDefinition *)rule); + } + else + { +#ifndef _CONTENT_PACKAGE + //wprintf(L"AddItemRuleDefinition: Attempted to add invalid child rule - %d\n", ruleType ); +#endif + } + return rule; +} + +void AddItemRuleDefinition::addAttribute(const wstring &attributeName, const wstring &attributeValue) +{ + if(attributeName.compare(L"itemId") == 0) + { + int value = _fromString(attributeValue); + m_itemId = value; + //app.DebugPrintf(2,"AddItemRuleDefinition: Adding parameter itemId=%d\n",m_itemId); + } + else if(attributeName.compare(L"quantity") == 0) + { + int value = _fromString(attributeValue); + m_quantity = value; + //app.DebugPrintf(2,"AddItemRuleDefinition: Adding parameter quantity=%d\n",m_quantity); + } + else if(attributeName.compare(L"auxValue") == 0) + { + int value = _fromString(attributeValue); + m_auxValue = value; + //app.DebugPrintf(2,"AddItemRuleDefinition: Adding parameter auxValue=%d\n",m_auxValue); + } + else if(attributeName.compare(L"dataTag") == 0) + { + int value = _fromString(attributeValue); + m_dataTag = value; + //app.DebugPrintf(2,"AddItemRuleDefinition: Adding parameter dataTag=%d\n",m_dataTag); + } + else if(attributeName.compare(L"slot") == 0) + { + int value = _fromString(attributeValue); + m_slot = value; + //app.DebugPrintf(2,"AddItemRuleDefinition: Adding parameter slot=%d\n",m_slot); + } + else + { + GameRuleDefinition::addAttribute(attributeName, attributeValue); + } +} + +bool AddItemRuleDefinition::addItemToContainer(shared_ptr container, int slotId) +{ + bool added = false; + if(Item::items[m_itemId] != NULL) + { + int quantity = min(m_quantity, Item::items[m_itemId]->getMaxStackSize()); + shared_ptr newItem = shared_ptr(new ItemInstance(m_itemId,quantity,m_auxValue) ); + newItem->set4JData(m_dataTag); + + for(AUTO_VAR(it, m_enchantments.begin()); it != m_enchantments.end(); ++it) + { + (*it)->enchantItem(newItem); + } + + if(m_slot >= 0 && m_slot < container->getContainerSize() ) + { + container->setItem( m_slot, newItem ); + added = true; + } + else if(slotId >= 0 && slotId < container->getContainerSize() ) + { + container->setItem( slotId, newItem ); + added = true; + } + else if(dynamic_pointer_cast(container) != NULL) + { + added = dynamic_pointer_cast(container)->add(newItem); + } + } + return added; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/AddItemRuleDefinition.h b/Minecraft.Client/Common/GameRules/AddItemRuleDefinition.h new file mode 100644 index 00000000..602f2d82 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/AddItemRuleDefinition.h @@ -0,0 +1,30 @@ +#pragma once + +#include "GameRuleDefinition.h" + +class Container; +class AddEnchantmentRuleDefinition; + +class AddItemRuleDefinition : public GameRuleDefinition +{ +private: + int m_itemId; + int m_quantity; + int m_auxValue; + int m_dataTag; + int m_slot; + vector m_enchantments; + +public: + AddItemRuleDefinition(); + + virtual void writeAttributes(DataOutputStream *, UINT numAttributes); + virtual void getChildren(vector *children); + + virtual ConsoleGameRules::EGameRuleType getActionType() { return ConsoleGameRules::eGameRuleType_AddItem; } + + virtual GameRuleDefinition *addChild(ConsoleGameRules::EGameRuleType ruleType); + virtual void addAttribute(const wstring &attributeName, const wstring &attributeValue); + + bool addItemToContainer(shared_ptr container, int slotId); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/ApplySchematicRuleDefinition.cpp b/Minecraft.Client/Common/GameRules/ApplySchematicRuleDefinition.cpp new file mode 100644 index 00000000..aa4a8fb2 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/ApplySchematicRuleDefinition.cpp @@ -0,0 +1,249 @@ +#include "stdafx.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.phys.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.dimension.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.chunk.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.tile.entity.h" +#include "ApplySchematicRuleDefinition.h" +#include "LevelGenerationOptions.h" +#include "ConsoleSchematicFile.h" + +ApplySchematicRuleDefinition::ApplySchematicRuleDefinition(LevelGenerationOptions *levelGenOptions) +{ + m_levelGenOptions = levelGenOptions; + m_location = Vec3::newPermanent(0,0,0); + m_locationBox = NULL; + m_totalBlocksChanged = 0; + m_totalBlocksChangedLighting = 0; + m_rotation = ConsoleSchematicFile::eSchematicRot_0; + m_completed = false; + m_dimension = 0; + m_schematic = NULL; +} + +ApplySchematicRuleDefinition::~ApplySchematicRuleDefinition() +{ + app.DebugPrintf("Deleting ApplySchematicRuleDefinition.\n"); + if(!m_completed) m_levelGenOptions->releaseSchematicFile(m_schematicName); + m_schematic = NULL; + delete m_location; +} + +void ApplySchematicRuleDefinition::writeAttributes(DataOutputStream *dos, UINT numAttrs) +{ + GameRuleDefinition::writeAttributes(dos, numAttrs + 5); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_filename); + dos->writeUTF(m_schematicName); + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_x); + dos->writeUTF(_toString(m_location->x)); + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_y); + dos->writeUTF(_toString(m_location->y)); + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_z); + dos->writeUTF(_toString(m_location->z)); + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_rot); + + switch (m_rotation) + { + case ConsoleSchematicFile::eSchematicRot_0: dos->writeUTF(_toString( 0 )); break; + case ConsoleSchematicFile::eSchematicRot_90: dos->writeUTF(_toString( 90 )); break; + case ConsoleSchematicFile::eSchematicRot_180: dos->writeUTF(_toString( 180 )); break; + case ConsoleSchematicFile::eSchematicRot_270: dos->writeUTF(_toString( 270 )); break; + } +} + +void ApplySchematicRuleDefinition::addAttribute(const wstring &attributeName, const wstring &attributeValue) +{ + if(attributeName.compare(L"filename") == 0) + { + m_schematicName = attributeValue; + //app.DebugPrintf("ApplySchematicRuleDefinition: Adding parameter filename=%s\n",m_schematicName.c_str()); + + if(!m_schematicName.empty()) + { + if(m_schematicName.substr( m_schematicName.length() - 4, m_schematicName.length()).compare(L".sch") != 0) + { + m_schematicName.append(L".sch"); + } + m_schematic = m_levelGenOptions->getSchematicFile(m_schematicName); + } + } + else if(attributeName.compare(L"x") == 0) + { + m_location->x = _fromString(attributeValue); + if( ((int)abs(m_location->x))%2 != 0) m_location->x -=1; + //app.DebugPrintf("ApplySchematicRuleDefinition: Adding parameter x=%f\n",m_location->x); + } + else if(attributeName.compare(L"y") == 0) + { + m_location->y = _fromString(attributeValue); + if( ((int)abs(m_location->y))%2 != 0) m_location->y -= 1; + if(m_location->y < 0) m_location->y = 0; + //app.DebugPrintf("ApplySchematicRuleDefinition: Adding parameter y=%f\n",m_location->y); + } + else if(attributeName.compare(L"z") == 0) + { + m_location->z = _fromString(attributeValue); + if(((int)abs(m_location->z))%2 != 0) m_location->z -= 1; + //app.DebugPrintf("ApplySchematicRuleDefinition: Adding parameter z=%f\n",m_location->z); + } + else if(attributeName.compare(L"rot") == 0) + { + int degrees = _fromString(attributeValue); + + while(degrees < 0) degrees += 360; + while(degrees >= 360) degrees -= 360; + float quad = degrees/90; + degrees = (int)(quad + 0.5f); + switch(degrees) + { + case 1: + m_rotation = ConsoleSchematicFile::eSchematicRot_90; + break; + case 2: + m_rotation = ConsoleSchematicFile::eSchematicRot_180; + break; + case 3: + case 4: + m_rotation = ConsoleSchematicFile::eSchematicRot_270; + break; + case 0: + default: + m_rotation = ConsoleSchematicFile::eSchematicRot_0; + break; + }; + + //app.DebugPrintf("ApplySchematicRuleDefinition: Adding parameter rot=%d\n",m_rotation); + } + else if(attributeName.compare(L"dim") == 0) + { + m_dimension = _fromString(attributeValue); + if(m_dimension > 1 || m_dimension < -1) m_dimension = 0; + //app.DebugPrintf("ApplySchematicRuleDefinition: Adding parameter dimension=%d\n",m_dimension); + } + else + { + GameRuleDefinition::addAttribute(attributeName, attributeValue); + } +} + +void ApplySchematicRuleDefinition::updateLocationBox() +{ + if(m_schematic == NULL) m_schematic = m_levelGenOptions->getSchematicFile(m_schematicName); + + m_locationBox = AABB::newPermanent(0,0,0,0,0,0); + + m_locationBox->x0 = m_location->x; + m_locationBox->y0 = m_location->y; + m_locationBox->z0 = m_location->z; + + m_locationBox->y1 = m_location->y + m_schematic->getYSize(); + + switch(m_rotation) + { + case ConsoleSchematicFile::eSchematicRot_90: + case ConsoleSchematicFile::eSchematicRot_270: + m_locationBox->x1 = m_location->x + m_schematic->getZSize(); + m_locationBox->z1 = m_location->z + m_schematic->getXSize(); + break; + case ConsoleSchematicFile::eSchematicRot_0: + case ConsoleSchematicFile::eSchematicRot_180: + default: + m_locationBox->x1 = m_location->x + m_schematic->getXSize(); + m_locationBox->z1 = m_location->z + m_schematic->getZSize(); + break; + }; +} + +void ApplySchematicRuleDefinition::processSchematic(AABB *chunkBox, LevelChunk *chunk) +{ + if( m_completed ) return; + if(chunk->level->dimension->id != m_dimension) return; + + PIXBeginNamedEvent(0, "Processing ApplySchematicRuleDefinition"); + if(m_schematic == NULL) m_schematic = m_levelGenOptions->getSchematicFile(m_schematicName); + + if(m_locationBox == NULL) updateLocationBox(); + if(chunkBox->intersects( m_locationBox )) + { + m_locationBox->y1 = min((double)Level::maxBuildHeight, m_locationBox->y1 ); + +#ifdef _DEBUG + app.DebugPrintf("Applying schematic %ls to chunk (%d,%d)\n",m_schematicName.c_str(),chunk->x, chunk->z); +#endif + PIXBeginNamedEvent(0,"Applying blocks and data"); + m_totalBlocksChanged += m_schematic->applyBlocksAndData(chunk, chunkBox, m_locationBox, m_rotation); + PIXEndNamedEvent(); + + // Add the tileEntities + PIXBeginNamedEvent(0,"Applying tile entities"); + m_schematic->applyTileEntities(chunk, chunkBox, m_locationBox, m_rotation); + PIXEndNamedEvent(); + + // TODO This does not take into account things that go outside the bounds of the world + int targetBlocks = (m_locationBox->x1 - m_locationBox->x0) + * (m_locationBox->y1 - m_locationBox->y0) + * (m_locationBox->z1 - m_locationBox->z0); + if( (m_totalBlocksChanged == targetBlocks) && (m_totalBlocksChangedLighting == targetBlocks) ) + { + m_completed = true; + //m_levelGenOptions->releaseSchematicFile(m_schematicName); + //m_schematic = NULL; + } + } + PIXEndNamedEvent(); +} + +void ApplySchematicRuleDefinition::processSchematicLighting(AABB *chunkBox, LevelChunk *chunk) +{ + if( m_completed ) return; + if(chunk->level->dimension->id != m_dimension) return; + + PIXBeginNamedEvent(0, "Processing ApplySchematicRuleDefinition (lighting)"); + if(m_schematic == NULL) m_schematic = m_levelGenOptions->getSchematicFile(m_schematicName); + + if(m_locationBox == NULL) updateLocationBox(); + if(chunkBox->intersects( m_locationBox )) + { + m_locationBox->y1 = min((double)Level::maxBuildHeight, m_locationBox->y1 ); + +#ifdef _DEBUG + app.DebugPrintf("Applying schematic %ls to chunk (%d,%d)\n",m_schematicName.c_str(),chunk->x, chunk->z); +#endif + PIXBeginNamedEvent(0,"Patching lighting"); + m_totalBlocksChangedLighting += m_schematic->applyLighting(chunk, chunkBox, m_locationBox, m_rotation); + PIXEndNamedEvent(); + + // TODO This does not take into account things that go outside the bounds of the world + int targetBlocks = (m_locationBox->x1 - m_locationBox->x0) + * (m_locationBox->y1 - m_locationBox->y0) + * (m_locationBox->z1 - m_locationBox->z0); + if( (m_totalBlocksChanged == targetBlocks) && (m_totalBlocksChangedLighting == targetBlocks) ) + { + m_completed = true; + //m_levelGenOptions->releaseSchematicFile(m_schematicName); + //m_schematic = NULL; + } + } + PIXEndNamedEvent(); +} + +bool ApplySchematicRuleDefinition::checkIntersects(int x0, int y0, int z0, int x1, int y1, int z1) +{ + if( m_locationBox == NULL ) updateLocationBox(); + return m_locationBox->intersects(x0,y0,z0,x1,y1,z1); +} + +int ApplySchematicRuleDefinition::getMinY() +{ + if( m_locationBox == NULL ) updateLocationBox(); + return m_locationBox->y0; +} + +void ApplySchematicRuleDefinition::reset() +{ + m_totalBlocksChanged = 0; + m_totalBlocksChangedLighting = 0; + m_completed = false; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/ApplySchematicRuleDefinition.h b/Minecraft.Client/Common/GameRules/ApplySchematicRuleDefinition.h new file mode 100644 index 00000000..21c42dea --- /dev/null +++ b/Minecraft.Client/Common/GameRules/ApplySchematicRuleDefinition.h @@ -0,0 +1,51 @@ +#pragma once +#include "GameRuleDefinition.h" +#include "ConsoleSchematicFile.h" + +class AABB; +class Vec3; +class LevelChunk; +class LevelGenerationOptions; +class GRFObject; + +class ApplySchematicRuleDefinition : public GameRuleDefinition +{ +private: + LevelGenerationOptions *m_levelGenOptions; + wstring m_schematicName; + ConsoleSchematicFile *m_schematic; + Vec3 *m_location; + AABB *m_locationBox; + ConsoleSchematicFile::ESchematicRotation m_rotation; + int m_dimension; + + __int64 m_totalBlocksChanged; + __int64 m_totalBlocksChangedLighting; + bool m_completed; + + void updateLocationBox(); +public: + ApplySchematicRuleDefinition(LevelGenerationOptions *levelGenOptions); + ~ApplySchematicRuleDefinition(); + + virtual ConsoleGameRules::EGameRuleType getActionType() { return ConsoleGameRules::eGameRuleType_ApplySchematic; } + + virtual void writeAttributes(DataOutputStream *dos, UINT numAttrs); + virtual void addAttribute(const wstring &attributeName, const wstring &attributeValue); + + void processSchematic(AABB *chunkBox, LevelChunk *chunk); + void processSchematicLighting(AABB *chunkBox, LevelChunk *chunk); + + bool checkIntersects(int x0, int y0, int z0, int x1, int y1, int z1); + int getMinY(); + + bool isComplete() { return m_completed; } + + wstring getSchematicName() { return m_schematicName; } + + /** 4J-JEV: + * This GameRuleDefinition contains limited game state. + * Reset any state to how it should be before a new game. + */ + void reset(); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/BiomeOverride.cpp b/Minecraft.Client/Common/GameRules/BiomeOverride.cpp new file mode 100644 index 00000000..22cc0c7a --- /dev/null +++ b/Minecraft.Client/Common/GameRules/BiomeOverride.cpp @@ -0,0 +1,59 @@ +#include "stdafx.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "BiomeOverride.h" + +BiomeOverride::BiomeOverride() +{ + m_tile = 0; + m_topTile = 0; + m_biomeId = 0; +} + +void BiomeOverride::writeAttributes(DataOutputStream *dos, UINT numAttrs) +{ + GameRuleDefinition::writeAttributes(dos, numAttrs + 3); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_biomeId); + dos->writeUTF(_toString(m_biomeId)); + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_tileId); + dos->writeUTF(_toString(m_tile)); + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_topTileId); + dos->writeUTF(_toString(m_topTile)); +} + +void BiomeOverride::addAttribute(const wstring &attributeName, const wstring &attributeValue) +{ + if(attributeName.compare(L"tileId") == 0) + { + int value = _fromString(attributeValue); + m_tile = value; + app.DebugPrintf("BiomeOverride: Adding parameter tileId=%d\n",m_tile); + } + else if(attributeName.compare(L"topTileId") == 0) + { + int value = _fromString(attributeValue); + m_topTile = value; + app.DebugPrintf("BiomeOverride: Adding parameter topTileId=%d\n",m_topTile); + } + else if(attributeName.compare(L"biomeId") == 0) + { + int value = _fromString(attributeValue); + m_biomeId = value; + app.DebugPrintf("BiomeOverride: Adding parameter biomeId=%d\n",m_biomeId); + } + else + { + GameRuleDefinition::addAttribute(attributeName, attributeValue); + } +} + +bool BiomeOverride::isBiome(int id) +{ + return m_biomeId == id; +} + +void BiomeOverride::getTileValues(BYTE &tile, BYTE &topTile) +{ + if(m_tile != 0) tile = (BYTE)m_tile; + if(m_topTile != 0) topTile = (BYTE)m_topTile; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/BiomeOverride.h b/Minecraft.Client/Common/GameRules/BiomeOverride.h new file mode 100644 index 00000000..5ad9263c --- /dev/null +++ b/Minecraft.Client/Common/GameRules/BiomeOverride.h @@ -0,0 +1,23 @@ +#pragma once +using namespace std; + +#include "GameRuleDefinition.h" + +class BiomeOverride : public GameRuleDefinition +{ +private: + BYTE m_topTile; + BYTE m_tile; + int m_biomeId; + +public: + BiomeOverride(); + + virtual ConsoleGameRules::EGameRuleType getActionType() { return ConsoleGameRules::eGameRuleType_BiomeOverride; } + + virtual void writeAttributes(DataOutputStream *dos, UINT numAttrs); + virtual void addAttribute(const wstring &attributeName, const wstring &attributeValue); + + bool isBiome(int id); + void getTileValues(BYTE &tile, BYTE &topTile); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/CollectItemRuleDefinition.cpp b/Minecraft.Client/Common/GameRules/CollectItemRuleDefinition.cpp new file mode 100644 index 00000000..66abefbb --- /dev/null +++ b/Minecraft.Client/Common/GameRules/CollectItemRuleDefinition.cpp @@ -0,0 +1,117 @@ +#include "stdafx.h" +#include "..\..\WstringLookup.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "CollectItemRuleDefinition.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.h" +#include "..\..\..\Minecraft.World\Connection.h" +#include "..\..\..\Minecraft.World\net.minecraft.network.packet.h" + +CollectItemRuleDefinition::CollectItemRuleDefinition() +{ + m_itemId = 0; + m_auxValue = 0; + m_quantity = 0; +} + +CollectItemRuleDefinition::~CollectItemRuleDefinition() +{ +} + +void CollectItemRuleDefinition::writeAttributes(DataOutputStream *dos, UINT numAttributes) +{ + GameRuleDefinition::writeAttributes(dos, numAttributes + 3); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_itemId); + dos->writeUTF( _toString( m_itemId ) ); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_auxValue); + dos->writeUTF( _toString( m_auxValue ) ); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_quantity); + dos->writeUTF( _toString( m_quantity ) ); +} + +void CollectItemRuleDefinition::addAttribute(const wstring &attributeName, const wstring &attributeValue) +{ + if(attributeName.compare(L"itemId") == 0) + { + m_itemId = _fromString(attributeValue); + app.DebugPrintf("CollectItemRule: Adding parameter itemId=%d\n",m_itemId); + } + else if(attributeName.compare(L"auxValue") == 0) + { + m_auxValue = _fromString(attributeValue); + app.DebugPrintf("CollectItemRule: Adding parameter m_auxValue=%d\n",m_auxValue); + } + else if(attributeName.compare(L"quantity") == 0) + { + m_quantity = _fromString(attributeValue); + app.DebugPrintf("CollectItemRule: Adding parameter m_quantity=%d\n",m_quantity); + } + else + { + GameRuleDefinition::addAttribute(attributeName, attributeValue); + } +} + +int CollectItemRuleDefinition::getGoal() +{ + return m_quantity; +} + +int CollectItemRuleDefinition::getProgress(GameRule *rule) +{ + GameRule::ValueType value = rule->getParameter(L"iQuantity"); + return value.i; +} + +void CollectItemRuleDefinition::populateGameRule(GameRulesInstance::EGameRulesInstanceType type, GameRule *rule) +{ + GameRule::ValueType value; + value.i = 0; + rule->setParameter(L"iQuantity",value); + + GameRuleDefinition::populateGameRule(type, rule); +} + +bool CollectItemRuleDefinition::onCollectItem(GameRule *rule, shared_ptr item) +{ + bool statusChanged = false; + if(item != NULL && item->id == m_itemId && item->getAuxValue() == m_auxValue && item->get4JData() == m_4JDataValue) + { + if(!getComplete(rule)) + { + GameRule::ValueType value = rule->getParameter(L"iQuantity"); + int quantityCollected = (value.i += item->count); + rule->setParameter(L"iQuantity",value); + + statusChanged = true; + + if(quantityCollected >= m_quantity) + { + setComplete(rule, true); + app.DebugPrintf("Completed CollectItemRule with info - itemId:%d, auxValue:%d, quantity:%d, dataTag:%d\n", m_itemId,m_auxValue,m_quantity,m_4JDataValue); + + if(rule->getConnection() != NULL) + { + rule->getConnection()->send( shared_ptr( new UpdateGameRuleProgressPacket(getActionType(), this->m_descriptionId, m_itemId, m_auxValue, this->m_4JDataValue,NULL,0))); + } + } + } + } + return statusChanged; +} + +wstring CollectItemRuleDefinition::generateXml(shared_ptr item) +{ + // 4J Stu - This should be kept in sync with the GameRulesDefinition.xsd + wstring xml = L""; + if(item != NULL) + { + xml = L"(item->id) + L"\" quantity=\"SET\" descriptionName=\"OPTIONAL\" promptName=\"OPTIONAL\""; + if(item->getAuxValue() != 0) xml += L" auxValue=\"" + _toString(item->getAuxValue()) + L"\""; + if(item->get4JData() != 0) xml += L" dataTag=\"" + _toString(item->get4JData()) + L"\""; + xml += L"/>\n"; + } + return xml; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/CollectItemRuleDefinition.h b/Minecraft.Client/Common/GameRules/CollectItemRuleDefinition.h new file mode 100644 index 00000000..5ee6f4c5 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/CollectItemRuleDefinition.h @@ -0,0 +1,40 @@ +#pragma once + +#include "GameRuleDefinition.h" + +class Pos; +class UseTileRuleDefinition; +class ItemInstance; + +class CollectItemRuleDefinition : public GameRuleDefinition +{ +private: + // These values should map directly to the xsd definition for this Rule + int m_itemId; + unsigned char m_auxValue; + int m_quantity; + +public: + CollectItemRuleDefinition(); + ~CollectItemRuleDefinition(); + + ConsoleGameRules::EGameRuleType getActionType() { return ConsoleGameRules::eGameRuleType_CollectItemRule; } + + virtual void writeAttributes(DataOutputStream *, UINT numAttributes); + virtual void addAttribute(const wstring &attributeName, const wstring &attributeValue); + + virtual int getGoal(); + virtual int getProgress(GameRule *rule); + + virtual int getIcon() { return m_itemId; } + virtual int getAuxValue() { return m_auxValue; } + + void populateGameRule(GameRulesInstance::EGameRulesInstanceType type, GameRule *rule); + + bool onCollectItem(GameRule *rule, shared_ptr item); + + static wstring generateXml(shared_ptr item); + +private: + //static wstring generateXml(CollectItemRuleDefinition *ruleDef); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/CompleteAllRuleDefinition.cpp b/Minecraft.Client/Common/GameRules/CompleteAllRuleDefinition.cpp new file mode 100644 index 00000000..adaf70c8 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/CompleteAllRuleDefinition.cpp @@ -0,0 +1,66 @@ +#include "stdafx.h" +#include "CompleteAllRuleDefinition.h" +#include "ConsoleGameRules.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\..\Minecraft.World\Connection.h" +#include "..\..\..\Minecraft.World\net.minecraft.network.packet.h" + +void CompleteAllRuleDefinition::getChildren(vector *children) +{ + CompoundGameRuleDefinition::getChildren(children); +} + +bool CompleteAllRuleDefinition::onUseTile(GameRule *rule, int tileId, int x, int y, int z) +{ + bool statusChanged = CompoundGameRuleDefinition::onUseTile(rule,tileId,x,y,z); + if(statusChanged) updateStatus(rule); + return statusChanged; +} + +bool CompleteAllRuleDefinition::onCollectItem(GameRule *rule, shared_ptr item) +{ + bool statusChanged = CompoundGameRuleDefinition::onCollectItem(rule,item); + if(statusChanged) updateStatus(rule); + return statusChanged; +} + +void CompleteAllRuleDefinition::updateStatus(GameRule *rule) +{ + int goal = 0; + int progress = 0; + for(AUTO_VAR(it, rule->m_parameters.begin()); it != rule->m_parameters.end(); ++it) + { + if(it->second.isPointer) + { + goal += it->second.gr->getGameRuleDefinition()->getGoal(); + progress += it->second.gr->getGameRuleDefinition()->getProgress(it->second.gr); + } + } + if(rule->getConnection() != NULL) + { + PacketData data; + data.goal = goal; + data.progress = progress; + + int icon = -1; + int auxValue = 0; + + if(m_lastRuleStatusChanged != NULL) + { + icon = m_lastRuleStatusChanged->getIcon(); + auxValue = m_lastRuleStatusChanged->getAuxValue(); + m_lastRuleStatusChanged = NULL; + } + rule->getConnection()->send( shared_ptr( new UpdateGameRuleProgressPacket(getActionType(), this->m_descriptionId,icon, auxValue, 0,&data,sizeof(PacketData)))); + } + app.DebugPrintf("Updated CompleteAllRule - Completed %d of %d\n", progress, goal); +} + +wstring CompleteAllRuleDefinition::generateDescriptionString(const wstring &description, void *data, int dataLength) +{ + PacketData *values = (PacketData *)data; + wstring newDesc = description; + newDesc = replaceAll(newDesc,L"{*progress*}",_toString(values->progress)); + newDesc = replaceAll(newDesc,L"{*goal*}",_toString(values->goal)); + return newDesc; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/CompleteAllRuleDefinition.h b/Minecraft.Client/Common/GameRules/CompleteAllRuleDefinition.h new file mode 100644 index 00000000..b2cb8847 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/CompleteAllRuleDefinition.h @@ -0,0 +1,26 @@ +#pragma once + +#include "CompoundGameRuleDefinition.h" + +class CompleteAllRuleDefinition : public CompoundGameRuleDefinition +{ +private: + typedef struct _packetData + { + int goal; + int progress; + } PacketData; + +public: + ConsoleGameRules::EGameRuleType getActionType() { return ConsoleGameRules::eGameRuleType_CompleteAllRule; } + + virtual void getChildren(vector *children); + + virtual bool onUseTile(GameRule *rule, int tileId, int x, int y, int z); + virtual bool onCollectItem(GameRule *rule, shared_ptr item); + + static wstring generateDescriptionString(const wstring &description, void *data, int dataLength); + +private: + void updateStatus(GameRule *rule); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/CompoundGameRuleDefinition.cpp b/Minecraft.Client/Common/GameRules/CompoundGameRuleDefinition.cpp new file mode 100644 index 00000000..0481a54b --- /dev/null +++ b/Minecraft.Client/Common/GameRules/CompoundGameRuleDefinition.cpp @@ -0,0 +1,118 @@ +#include "stdafx.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.h" +#include "CompoundGameRuleDefinition.h" +#include "ConsoleGameRules.h" + +CompoundGameRuleDefinition::CompoundGameRuleDefinition() +{ + m_lastRuleStatusChanged = NULL; +} + +CompoundGameRuleDefinition::~CompoundGameRuleDefinition() +{ + for(AUTO_VAR(it, m_children.begin()); it != m_children.end(); ++it) + { + delete (*it); + } +} + +void CompoundGameRuleDefinition::getChildren(vector *children) +{ + GameRuleDefinition::getChildren(children); + for (AUTO_VAR(it, m_children.begin()); it != m_children.end(); it++) + children->push_back(*it); +} + +GameRuleDefinition *CompoundGameRuleDefinition::addChild(ConsoleGameRules::EGameRuleType ruleType) +{ + GameRuleDefinition *rule = NULL; + if(ruleType == ConsoleGameRules::eGameRuleType_CompleteAllRule) + { + rule = new CompleteAllRuleDefinition(); + } + else if(ruleType == ConsoleGameRules::eGameRuleType_CollectItemRule) + { + rule = new CollectItemRuleDefinition(); + } + else if(ruleType == ConsoleGameRules::eGameRuleType_UseTileRule) + { + rule = new UseTileRuleDefinition(); + } + else if(ruleType == ConsoleGameRules::eGameRuleType_UpdatePlayerRule) + { + rule = new UpdatePlayerRuleDefinition(); + } + else + { +#ifndef _CONTENT_PACKAGE + wprintf(L"CompoundGameRuleDefinition: Attempted to add invalid child rule - %d\n", ruleType ); +#endif + } + if(rule != NULL) m_children.push_back(rule); + return rule; +} + +void CompoundGameRuleDefinition::populateGameRule(GameRulesInstance::EGameRulesInstanceType type, GameRule *rule) +{ + GameRule *newRule = NULL; + int i = 0; + for(AUTO_VAR(it, m_children.begin()); it != m_children.end(); ++it) + { + newRule = new GameRule(*it, rule->getConnection() ); + (*it)->populateGameRule(type,newRule); + + GameRule::ValueType value; + value.gr = newRule; + value.isPointer = true; + + // Somehow add the newRule to the current rule + rule->setParameter(L"rule" + _toString(i),value); + ++i; + } + GameRuleDefinition::populateGameRule(type, rule); +} + +bool CompoundGameRuleDefinition::onUseTile(GameRule *rule, int tileId, int x, int y, int z) +{ + bool statusChanged = false; + for(AUTO_VAR(it, rule->m_parameters.begin()); it != rule->m_parameters.end(); ++it) + { + if(it->second.isPointer) + { + bool changed = it->second.gr->getGameRuleDefinition()->onUseTile(it->second.gr,tileId,x,y,z); + if(!statusChanged && changed) + { + m_lastRuleStatusChanged = it->second.gr->getGameRuleDefinition(); + statusChanged = true; + } + } + } + return statusChanged; +} + +bool CompoundGameRuleDefinition::onCollectItem(GameRule *rule, shared_ptr item) +{ + bool statusChanged = false; + for(AUTO_VAR(it, rule->m_parameters.begin()); it != rule->m_parameters.end(); ++it) + { + if(it->second.isPointer) + { + bool changed = it->second.gr->getGameRuleDefinition()->onCollectItem(it->second.gr,item); + if(!statusChanged && changed) + { + m_lastRuleStatusChanged = it->second.gr->getGameRuleDefinition(); + statusChanged = true; + } + } + } + return statusChanged; +} + +void CompoundGameRuleDefinition::postProcessPlayer(shared_ptr player) +{ + for(AUTO_VAR(it, m_children.begin()); it != m_children.end(); ++it) + { + (*it)->postProcessPlayer(player); + } +} \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/CompoundGameRuleDefinition.h b/Minecraft.Client/Common/GameRules/CompoundGameRuleDefinition.h new file mode 100644 index 00000000..bfedfd09 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/CompoundGameRuleDefinition.h @@ -0,0 +1,23 @@ +#pragma once + +#include "GameRuleDefinition.h" + +class CompoundGameRuleDefinition : public GameRuleDefinition +{ +protected: + vector m_children; +protected: + GameRuleDefinition *m_lastRuleStatusChanged; +public: + CompoundGameRuleDefinition(); + virtual ~CompoundGameRuleDefinition(); + + virtual void getChildren(vector *children); + virtual GameRuleDefinition *addChild(ConsoleGameRules::EGameRuleType ruleType); + + virtual void populateGameRule(GameRulesInstance::EGameRulesInstanceType type, GameRule *rule); + + virtual bool onUseTile(GameRule *rule, int tileId, int x, int y, int z); + virtual bool onCollectItem(GameRule *rule, shared_ptr item); + virtual void postProcessPlayer(shared_ptr player); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/ConsoleGameRules.h b/Minecraft.Client/Common/GameRules/ConsoleGameRules.h new file mode 100644 index 00000000..41c5e557 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/ConsoleGameRules.h @@ -0,0 +1,32 @@ +#pragma once +#include "ConsoleGameRulesConstants.h" + +#include "GameRuleManager.h" + +#include "GameRule.h" + +#include "GameRuleDefinition.h" + +#include "LevelRuleset.h" +#include "NamedAreaRuleDefinition.h" + +#include "CollectItemRuleDefinition.h" +#include "CompleteAllRuleDefinition.h" +#include "CompoundGameRuleDefinition.h" +#include "UseTileRuleDefinition.h" +#include "UpdatePlayerRuleDefinition.h" +#include "AddItemRuleDefinition.h" +#include "AddEnchantmentRuleDefinition.h" + +#include "LevelGenerationOptions.h" +#include "ApplySchematicRuleDefinition.h" +#include "ConsoleGenerateStructure.h" +#include "ConsoleGenerateStructureAction.h" +#include "XboxStructureActionGenerateBox.h" +#include "XboxStructureActionPlaceBlock.h" +#include "XboxStructureActionPlaceContainer.h" +#include "XboxStructureActionPlaceSpawner.h" +#include "BiomeOverride.h" +#include "StartFeature.h" + +#include "GameRulesInstance.h" diff --git a/Minecraft.Client/Common/GameRules/ConsoleGameRulesConstants.h b/Minecraft.Client/Common/GameRules/ConsoleGameRulesConstants.h new file mode 100644 index 00000000..a7111f04 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/ConsoleGameRulesConstants.h @@ -0,0 +1,119 @@ +#pragma once + +//#include " + +class ConsoleGameRules +{ +public: + enum EGameRuleType + { + eGameRuleType_Invalid = -1, + eGameRuleType_Root = 0, // This is the top level rule that defines a game mode, this is used to generate data for new players + + eGameRuleType_LevelGenerationOptions, + eGameRuleType_ApplySchematic, + eGameRuleType_GenerateStructure, + eGameRuleType_GenerateBox, + eGameRuleType_PlaceBlock, + eGameRuleType_PlaceContainer, + eGameRuleType_PlaceSpawner, + eGameRuleType_BiomeOverride, + eGameRuleType_StartFeature, + + eGameRuleType_AddItem, + eGameRuleType_AddEnchantment, + + eGameRuleType_LevelRules, + eGameRuleType_NamedArea, + + eGameRuleType_UseTileRule, + eGameRuleType_CollectItemRule, + eGameRuleType_CompleteAllRule, + eGameRuleType_UpdatePlayerRule, + + eGameRuleType_Count + }; + + enum EGameRuleAttr + { + eGameRuleAttr_Invalid = -1, + + eGameRuleAttr_descriptionName = 0, + eGameRuleAttr_promptName, + eGameRuleAttr_dataTag, + + eGameRuleAttr_enchantmentId, + eGameRuleAttr_enchantmentLevel, + + eGameRuleAttr_itemId, + eGameRuleAttr_quantity, + eGameRuleAttr_auxValue, + eGameRuleAttr_slot, + + eGameRuleAttr_name, + + eGameRuleAttr_food, + eGameRuleAttr_health, + + eGameRuleAttr_tileId, + eGameRuleAttr_useCoords, + + eGameRuleAttr_seed, + eGameRuleAttr_flatworld, + + eGameRuleAttr_filename, + eGameRuleAttr_rot, + + eGameRuleAttr_data, + eGameRuleAttr_block, + eGameRuleAttr_entity, + + eGameRuleAttr_facing, + + eGameRuleAttr_edgeTile, + eGameRuleAttr_fillTile, + eGameRuleAttr_skipAir, + + eGameRuleAttr_x, + eGameRuleAttr_x0, + eGameRuleAttr_x1, + + eGameRuleAttr_y, + eGameRuleAttr_y0, + eGameRuleAttr_y1, + + eGameRuleAttr_z, + eGameRuleAttr_z0, + eGameRuleAttr_z1, + + eGameRuleAttr_chunkX, + eGameRuleAttr_chunkZ, + + eGameRuleAttr_yRot, + + eGameRuleAttr_spawnX, + eGameRuleAttr_spawnY, + eGameRuleAttr_spawnZ, + + eGameRuleAttr_orientation, + eGameRuleAttr_dimension, + + eGameRuleAttr_topTileId, + eGameRuleAttr_biomeId, + + eGameRuleAttr_feature, + + eGameRuleAttr_Count + }; + + static void write(DataOutputStream *dos, ConsoleGameRules::EGameRuleType eType) + { + dos->writeInt(eType); + } + + static void write(DataOutputStream *dos, ConsoleGameRules::EGameRuleAttr eAttr) + { + dos->writeInt( eGameRuleType_Count + eAttr ); + } + +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/ConsoleGenerateStructure.cpp b/Minecraft.Client/Common/GameRules/ConsoleGenerateStructure.cpp new file mode 100644 index 00000000..0476b0e3 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/ConsoleGenerateStructure.cpp @@ -0,0 +1,181 @@ +#include "stdafx.h" +#include "ConsoleGenerateStructure.h" +#include "ConsoleGameRules.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.dimension.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.levelgen.structure.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\..\Minecraft.World\net.minecraft.h" + +ConsoleGenerateStructure::ConsoleGenerateStructure() : StructurePiece(0) +{ + m_x = m_y = m_z = 0; + boundingBox = NULL; + orientation = Direction::NORTH; + m_dimension = 0; +} + +void ConsoleGenerateStructure::getChildren(vector *children) +{ + GameRuleDefinition::getChildren(children); + + for(AUTO_VAR(it, m_actions.begin()); it != m_actions.end(); it++) + children->push_back( *it ); +} + +GameRuleDefinition *ConsoleGenerateStructure::addChild(ConsoleGameRules::EGameRuleType ruleType) +{ + GameRuleDefinition *rule = NULL; + if(ruleType == ConsoleGameRules::eGameRuleType_GenerateBox) + { + rule = new XboxStructureActionGenerateBox(); + m_actions.push_back((XboxStructureActionGenerateBox *)rule); + } + else if(ruleType == ConsoleGameRules::eGameRuleType_PlaceBlock) + { + rule = new XboxStructureActionPlaceBlock(); + m_actions.push_back((XboxStructureActionPlaceBlock *)rule); + } + else if(ruleType == ConsoleGameRules::eGameRuleType_PlaceContainer) + { + rule = new XboxStructureActionPlaceContainer(); + m_actions.push_back((XboxStructureActionPlaceContainer *)rule); + } + else if(ruleType == ConsoleGameRules::eGameRuleType_PlaceSpawner) + { + rule = new XboxStructureActionPlaceSpawner(); + m_actions.push_back((XboxStructureActionPlaceSpawner *)rule); + } + else + { +#ifndef _CONTENT_PACKAGE + wprintf(L"ConsoleGenerateStructure: Attempted to add invalid child rule - %d\n", ruleType ); +#endif + } + return rule; +} + +void ConsoleGenerateStructure::writeAttributes(DataOutputStream *dos, UINT numAttrs) +{ + GameRuleDefinition::writeAttributes(dos, numAttrs + 5); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_x); + dos->writeUTF(_toString(m_x)); + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_y); + dos->writeUTF(_toString(m_y)); + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_z); + dos->writeUTF(_toString(m_z)); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_orientation); + dos->writeUTF(_toString(orientation)); + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_dimension); + dos->writeUTF(_toString(m_dimension)); +} + +void ConsoleGenerateStructure::addAttribute(const wstring &attributeName, const wstring &attributeValue) +{ + if(attributeName.compare(L"x") == 0) + { + int value = _fromString(attributeValue); + m_x = value; + app.DebugPrintf("ConsoleGenerateStructure: Adding parameter x=%d\n",m_x); + } + else if(attributeName.compare(L"y") == 0) + { + int value = _fromString(attributeValue); + m_y = value; + app.DebugPrintf("ConsoleGenerateStructure: Adding parameter y=%d\n",m_y); + } + else if(attributeName.compare(L"z") == 0) + { + int value = _fromString(attributeValue); + m_z = value; + app.DebugPrintf("ConsoleGenerateStructure: Adding parameter z=%d\n",m_z); + } + else if(attributeName.compare(L"orientation") == 0) + { + int value = _fromString(attributeValue); + orientation = value; + app.DebugPrintf("ConsoleGenerateStructure: Adding parameter orientation=%d\n",orientation); + } + else if(attributeName.compare(L"dim") == 0) + { + m_dimension = _fromString(attributeValue); + if(m_dimension > 1 || m_dimension < -1) m_dimension = 0; + app.DebugPrintf("ApplySchematicRuleDefinition: Adding parameter dimension=%d\n",m_dimension); + } + else + { + GameRuleDefinition::addAttribute(attributeName, attributeValue); + } +} + +BoundingBox* ConsoleGenerateStructure::getBoundingBox() +{ + if(boundingBox == NULL) + { + // Find the max bounds + int maxX, maxY, maxZ; + maxX = maxY = maxZ = 1; + for(AUTO_VAR(it, m_actions.begin()); it != m_actions.end(); ++it) + { + ConsoleGenerateStructureAction *action = *it; + maxX = max(maxX,action->getEndX()); + maxY = max(maxY,action->getEndY()); + maxZ = max(maxZ,action->getEndZ()); + } + + boundingBox = new BoundingBox(m_x, m_y, m_z, m_x + maxX, m_y + maxY, m_z + maxZ); + } + return boundingBox; +} + +bool ConsoleGenerateStructure::postProcess(Level *level, Random *random, BoundingBox *chunkBB) +{ + if(level->dimension->id != m_dimension) return false; + + for(AUTO_VAR(it, m_actions.begin()); it != m_actions.end(); ++it) + { + ConsoleGenerateStructureAction *action = *it; + + switch(action->getActionType()) + { + case ConsoleGameRules::eGameRuleType_GenerateBox: + { + XboxStructureActionGenerateBox *genBox = (XboxStructureActionGenerateBox *)action; + genBox->generateBoxInLevel(this,level,chunkBB); + } + break; + case ConsoleGameRules::eGameRuleType_PlaceBlock: + { + XboxStructureActionPlaceBlock *pPlaceBlock = (XboxStructureActionPlaceBlock *)action; + pPlaceBlock->placeBlockInLevel(this,level,chunkBB); + } + break; + case ConsoleGameRules::eGameRuleType_PlaceContainer: + { + XboxStructureActionPlaceContainer *pPlaceContainer = (XboxStructureActionPlaceContainer *)action; + pPlaceContainer->placeContainerInLevel(this,level,chunkBB); + } + break; + case ConsoleGameRules::eGameRuleType_PlaceSpawner: + { + XboxStructureActionPlaceSpawner *pPlaceSpawner = (XboxStructureActionPlaceSpawner *)action; + pPlaceSpawner->placeSpawnerInLevel(this,level,chunkBB); + } + break; + }; + } + + return false; +} + +bool ConsoleGenerateStructure::checkIntersects(int x0, int y0, int z0, int x1, int y1, int z1) +{ + return getBoundingBox()->intersects(x0,y0,z0,x1,y1,z1); +} + +int ConsoleGenerateStructure::getMinY() +{ + return getBoundingBox()->y0; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/ConsoleGenerateStructure.h b/Minecraft.Client/Common/GameRules/ConsoleGenerateStructure.h new file mode 100644 index 00000000..91c4ef35 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/ConsoleGenerateStructure.h @@ -0,0 +1,42 @@ +#pragma once +#include "GameRuleDefinition.h" +#include "..\..\..\Minecraft.World\StructurePiece.h" + +class Level; +class Random; +class BoundingBox; +class ConsoleGenerateStructureAction; +class XboxStructureActionPlaceContainer; +class GRFObject; + +class ConsoleGenerateStructure : public GameRuleDefinition, public StructurePiece +{ +private: + int m_x, m_y, m_z; + vector m_actions; + int m_dimension; +public: + ConsoleGenerateStructure(); + + virtual ConsoleGameRules::EGameRuleType getActionType() { return ConsoleGameRules::eGameRuleType_GenerateStructure; } + + virtual void getChildren(vector *children); + virtual GameRuleDefinition *addChild(ConsoleGameRules::EGameRuleType ruleType); + + virtual void writeAttributes(DataOutputStream *dos, UINT numAttrs); + virtual void addAttribute(const wstring &attributeName, const wstring &attributeValue); + + // StructurePiece + virtual BoundingBox *getBoundingBox(); + virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); + + void createContainer(XboxStructureActionPlaceContainer *action, Level *level, BoundingBox *chunkBB); + + bool checkIntersects(int x0, int y0, int z0, int x1, int y1, int z1); + + virtual int getMinY(); + + 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/ConsoleGenerateStructureAction.h b/Minecraft.Client/Common/GameRules/ConsoleGenerateStructureAction.h new file mode 100644 index 00000000..14eb2fd8 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/ConsoleGenerateStructureAction.h @@ -0,0 +1,11 @@ +#pragma once + +#include "GameRuleDefinition.h" + +class ConsoleGenerateStructureAction : public GameRuleDefinition +{ +public: + virtual int getEndX() = 0; + virtual int getEndY() = 0; + virtual int getEndZ() = 0; +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/ConsoleSchematicFile.cpp b/Minecraft.Client/Common/GameRules/ConsoleSchematicFile.cpp new file mode 100644 index 00000000..3b995000 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/ConsoleSchematicFile.cpp @@ -0,0 +1,1024 @@ +#include "stdafx.h" +#include +#include "..\..\..\Minecraft.World\com.mojang.nbt.h" +#include "..\..\..\Minecraft.World\System.h" +#include "ConsoleSchematicFile.h" +#include "..\..\..\Minecraft.World\InputOutputStream.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.chunk.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.tile.entity.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.entity.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.entity.item.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.phys.h" +#include "..\..\..\Minecraft.World\compression.h" + +ConsoleSchematicFile::ConsoleSchematicFile() +{ + m_xSize = m_ySize = m_zSize = 0; + m_refCount = 1; + m_data.data = NULL; +} + +ConsoleSchematicFile::~ConsoleSchematicFile() +{ + app.DebugPrintf("Deleting schematic file\n"); + if(m_data.data != NULL) delete [] m_data.data; +} + +void ConsoleSchematicFile::save(DataOutputStream *dos) +{ + if(dos != NULL) + { + dos->writeInt(XBOX_SCHEMATIC_CURRENT_VERSION); + + dos->writeByte(APPROPRIATE_COMPRESSION_TYPE); + + dos->writeInt(m_xSize); + dos->writeInt(m_ySize); + dos->writeInt(m_zSize); + + byteArray ba(new BYTE[ m_data.length ], m_data.length); + Compression::getCompression()->CompressLZXRLE( ba.data, &ba.length, + m_data.data, m_data.length); + + dos->writeInt(ba.length); + dos->write(ba); + + save_tags(dos); + + delete [] ba.data; + } +} + +void ConsoleSchematicFile::load(DataInputStream *dis) +{ + if(dis != NULL) + { + // VERSION CHECK // + int version = dis->readInt(); + + Compression::ECompressionTypes compressionType = Compression::eCompressionType_LZXRLE; + + if (version > XBOX_SCHEMATIC_ORIGINAL_VERSION) // Or later versions + { + compressionType = (Compression::ECompressionTypes)dis->readByte(); + } + + if (version > XBOX_SCHEMATIC_CURRENT_VERSION) + assert(false && "Unrecognised schematic version!!"); + + m_xSize = dis->readInt(); + m_ySize = dis->readInt(); + m_zSize = dis->readInt(); + + int compressedSize = dis->readInt(); + byteArray compressedBuffer(compressedSize); + dis->readFully(compressedBuffer); + + if(m_data.data != NULL) + { + delete [] m_data.data; + m_data.data = NULL; + } + + if(compressionType == Compression::eCompressionType_None) + { + m_data = compressedBuffer; + } + else + { + unsigned int outputSize = m_xSize * m_ySize * m_zSize * 3/2; + m_data = byteArray(outputSize); + + switch(compressionType) + { + case Compression::eCompressionType_RLE: + Compression::getCompression()->DecompressRLE( m_data.data, &m_data.length, compressedBuffer.data, compressedSize); + break; + case APPROPRIATE_COMPRESSION_TYPE: + Compression::getCompression()->DecompressLZXRLE( m_data.data, &m_data.length, compressedBuffer.data, compressedSize); + break; + default: + app.DebugPrintf("Unrecognized compression type for Schematic file (%d)\n", (int)compressionType); + Compression::getCompression()->SetDecompressionType( (Compression::ECompressionTypes)compressionType ); + Compression::getCompression()->DecompressLZXRLE( m_data.data, &m_data.length, compressedBuffer.data, compressedSize); + Compression::getCompression()->SetDecompressionType( APPROPRIATE_COMPRESSION_TYPE ); + }; + + delete [] compressedBuffer.data; + } + + // READ TAGS // + CompoundTag *tag = NbtIo::read(dis); + ListTag *tileEntityTags = (ListTag *) tag->getList(L"TileEntities"); + if (tileEntityTags != NULL) + { + for (int i = 0; i < tileEntityTags->size(); i++) + { + CompoundTag *teTag = tileEntityTags->get(i); + shared_ptr te = TileEntity::loadStatic(teTag); + + if(te == NULL) + { +#ifndef _CONTENT_PACKAGE + app.DebugPrintf("ConsoleSchematicFile has read a NULL tile entity\n"); + __debugbreak(); +#endif + } + else + { + m_tileEntities.push_back(te); + } + } + } + ListTag *entityTags = (ListTag *) tag->getList(L"Entities"); + if (entityTags != NULL) + { + for (int i = 0; i < entityTags->size(); i++) + { + CompoundTag *eTag = entityTags->get(i); + eINSTANCEOF type = EntityIO::getType(eTag->getString(L"id")); + ListTag *pos = (ListTag *) eTag->getList(L"Pos"); + + double x = pos->get(0)->data; + double y = pos->get(1)->data; + double z = pos->get(2)->data; + + if( type == eTYPE_PAINTING || type == eTYPE_ITEM_FRAME ) + { + x = ((IntTag *) eTag->get(L"TileX") )->data; + y = ((IntTag *) eTag->get(L"TileY") )->data; + z = ((IntTag *) eTag->get(L"TileZ") )->data; + } +#ifdef _DEBUG + //app.DebugPrintf(1,"Loaded entity type %d at (%f,%f,%f)\n",(int)type,x,y,z); +#endif + m_entities.push_back( pair(Vec3::newPermanent(x,y,z),(CompoundTag *)eTag->copy())); + } + } + delete tag; + } +} + +void ConsoleSchematicFile::save_tags(DataOutputStream *dos) +{ + CompoundTag *tag = new CompoundTag(); + + ListTag *tileEntityTags = new ListTag(); + tag->put(L"TileEntities", tileEntityTags); + + for (AUTO_VAR(it, m_tileEntities.begin()); it != m_tileEntities.end(); it++) + { + CompoundTag *cTag = new CompoundTag(); + (*it)->save(cTag); + tileEntityTags->add(cTag); + } + + ListTag *entityTags = new ListTag(); + tag->put(L"Entities", entityTags); + + for (AUTO_VAR(it, m_entities.begin()); it != m_entities.end(); it++) + entityTags->add( (CompoundTag *)(*it).second->copy() ); + + NbtIo::write(tag,dos); + delete tag; +} + +__int64 ConsoleSchematicFile::applyBlocksAndData(LevelChunk *chunk, AABB *chunkBox, AABB *destinationBox, ESchematicRotation rot) +{ + int xStart = max(destinationBox->x0, (double)chunk->x*16); + int xEnd = min(destinationBox->x1, (double)((xStart>>4)<<4) + 16); + + int yStart = destinationBox->y0; + int yEnd = destinationBox->y1; + if(yEnd > Level::maxBuildHeight) yEnd = Level::maxBuildHeight; + + int zStart = max(destinationBox->z0, (double)chunk->z*16); + int zEnd = min(destinationBox->z1, (double)((zStart>>4)<<4) + 16); + +#ifdef _DEBUG + app.DebugPrintf("Range is (%d,%d,%d) to (%d,%d,%d)\n",xStart,yStart,zStart,xEnd-1,yEnd-1,zEnd-1); +#endif + + int rowBlocksIncluded = (yEnd-yStart)*(zEnd-zStart); + int blocksIncluded = (xEnd-xStart)*rowBlocksIncluded; + + int rowBlockCount = getYSize() * getZSize(); + int totalBlockCount = getXSize() * rowBlockCount; + + byteArray blockData = byteArray(Level::CHUNK_TILE_COUNT); + PIXBeginNamedEvent(0,"Getting block data"); + chunk->getBlockData(blockData); + PIXEndNamedEvent(); + byteArray dataData = byteArray(Level::HALF_CHUNK_TILE_COUNT); + PIXBeginNamedEvent(0,"Getting Data data"); + chunk->getDataData(dataData); + PIXEndNamedEvent(); + + // Ignore light data + int blockLightP = -1; + int skyLightP = -1; + if( rot == eSchematicRot_90 || rot == eSchematicRot_180 || rot == eSchematicRot_270 ) + { + int schematicXRow = 0; + int schematicZRow = 0; + int blocksP = 0; + int dataP = 0; + + for(int x = xStart; x < xEnd; ++x) + { + int x0 = x - chunk->x*16; + int x1 = x0 + 1; + + for(int z = zStart; z < zEnd; ++z) + { + int z0 = z - chunk->z*16; + int z1 = z0 + 1; + + chunkCoordToSchematicCoord(destinationBox, x, z, rot, schematicXRow, schematicZRow); + blocksP = (schematicXRow*rowBlockCount) + (schematicZRow*getYSize()); + dataP = totalBlockCount + (blocksP)/2; + + ConsoleSchematicFile::setBlocksAndData(chunk,blockData,dataData,m_data, x0, yStart, z0, x1, yEnd, z1, blocksP, dataP, blockLightP, skyLightP); + } + } + } + else if( rot == eSchematicRot_0 ) + { + // The initial pointer offsets for the different data types + int schematicXRow = xStart - destinationBox->x0; + int schematicZRow = zStart - destinationBox->z0; + int blocksP = (schematicXRow*rowBlockCount) + (schematicZRow*getYSize()); + int dataP = totalBlockCount + (schematicXRow*rowBlockCount + (schematicZRow*getYSize()))/2; + + for(int x = xStart; x < xEnd; ++x) + { + int x0 = x - chunk->x*16; + int x1 = x0 + 1; + + int z0 = zStart - chunk->z*16; + int z1 = zEnd - chunk->z*16; + + ConsoleSchematicFile::setBlocksAndData(chunk,blockData,dataData,m_data, x0, yStart, z0, x1, yEnd, z1, blocksP, dataP, blockLightP, skyLightP); + // update all pointer positions + // For z start to z end + // Set blocks and data + // increment z by the right amount + blocksP += (rowBlockCount-rowBlocksIncluded); + dataP += (rowBlockCount-rowBlocksIncluded)/2; + } + } + else + { + app.DebugPrintf("ERROR: Rotation of block and data not implemented!!\n"); + } + + // 4J Stu - Hack for ME pack to replace sand with end stone in schematics + //for(int i = 0; i < blockData.length; ++i) + //{ + // if(blockData[i] == Tile::sand_Id || blockData[i] == Tile::sandStone_Id) + // { + // blockData[i] = Tile::endStone_Id; + // } + //} + + PIXBeginNamedEvent(0,"Setting Block data"); + chunk->setBlockData(blockData); + PIXEndNamedEvent(); + delete blockData.data; + chunk->recalcHeightmapOnly(); + PIXBeginNamedEvent(0,"Setting Data data"); + chunk->setDataData(dataData); + PIXEndNamedEvent(); + delete dataData.data; + + // A basic pass through to roughly do the lighting. At this point of post-processing, we don't have all the neighbouring chunks loaded in, + // so any lighting here should be things that won't propagate out of this chunk. + for( int xx = xStart ; xx < xEnd; xx++ ) + for( int y = yStart ; y < yEnd; y++ ) + for( int zz = zStart ; zz < zEnd; zz++ ) + { + int x = xx - chunk->x * 16; + int z = zz - chunk->z * 16; + chunk->setBrightness(LightLayer::Block,x,y,z,0); + if( chunk->getTile(x,y,z) ) + { + chunk->setBrightness(LightLayer::Sky,x,y,z,0); + } + else + { + if( chunk->isSkyLit(x,y,z) ) + { + chunk->setBrightness(LightLayer::Sky,x,y,z,15); + } + else + { + chunk->setBrightness(LightLayer::Sky,x,y,z,0); + } + } + } + + return blocksIncluded; +} + +// At the point that this is called, we have all the neighbouring chunks loaded in (and generally post-processed, apart from this lighting pass), so +// we can do the sort of lighting that might propagate out of the chunk. +__int64 ConsoleSchematicFile::applyLighting(LevelChunk *chunk, AABB *chunkBox, AABB *destinationBox, ESchematicRotation rot) +{ + int xStart = max(destinationBox->x0, (double)chunk->x*16); + int xEnd = min(destinationBox->x1, (double)((xStart>>4)<<4) + 16); + + int yStart = destinationBox->y0; + int yEnd = destinationBox->y1; + if(yEnd > Level::maxBuildHeight) yEnd = Level::maxBuildHeight; + + int zStart = max(destinationBox->z0, (double)chunk->z*16); + int zEnd = min(destinationBox->z1, (double)((zStart>>4)<<4) + 16); + + int rowBlocksIncluded = (yEnd-yStart)*(zEnd-zStart); + int blocksIncluded = (xEnd-xStart)*rowBlocksIncluded; + + // Now actually do a checkLight on blocks that might need it, which should more accurately put everything in place + for( int xx = xStart ; xx < xEnd; xx++ ) + for( int y = yStart ; y < yEnd; y++ ) + for( int zz = zStart ; zz < zEnd; zz++ ) + { + int x = xx - chunk->x * 16; + int z = zz - chunk->z * 16; + + if( y <= chunk->getHeightmap( x, z ) ) + { + chunk->level->checkLight(LightLayer::Sky, xx, y, zz, true); + } + if( Tile::lightEmission[chunk->getTile(x,y,z)] ) + { + // Note that this lighting passes a rootOnlyEmissive flag of true, which means that only the location xx/y/zz is considered + // as possibly being a source of emissive light, not other tiles that we might encounter whilst propagating the light from + // the start location. If we don't do this, and Do encounter another emissive source in the radius of influence that the first + // light source had, then we'll start also lighting from that tile but won't actually be able to progatate that second light + // fully since checkLight only has a finite radius of 17 from the start position that it can light. Then when we do a checkLight + // on the second light later, it won't bother doing anything because the light level at the location of the tile itself will be correct. + chunk->level->checkLight(LightLayer::Block, xx, y, zz, true, true); + } + } + + return blocksIncluded; +} + +void ConsoleSchematicFile::chunkCoordToSchematicCoord(AABB *destinationBox, int chunkX, int chunkZ, ESchematicRotation rot, int &schematicX, int &schematicZ) +{ + switch(rot) + { + case eSchematicRot_90: + // schematicX decreases as chunkZ increases + // schematicZ increases as chunkX increases + schematicX = chunkZ - destinationBox->z0; + schematicZ = (destinationBox->x1 - 1 - destinationBox->x0) - (chunkX - destinationBox->x0); + break; + case eSchematicRot_180: + // schematicX decreases as chunkX increases + // schematicZ decreases as chunkZ increases + schematicX = (destinationBox->x1 - 1 - destinationBox->x0) - (chunkX - destinationBox->x0); + schematicZ = (destinationBox->z1 - 1 - destinationBox->z0) - (chunkZ - destinationBox->z0); + break; + case eSchematicRot_270: + // schematicX increases as chunkZ increases + // shcematicZ decreases as chunkX increases + schematicX = (destinationBox->z1 - 1 - destinationBox->z0) - (chunkZ - destinationBox->z0); + schematicZ = chunkX - destinationBox->x0; + break; + case eSchematicRot_0: + default: + // schematicX increases as chunkX increases + // schematicZ increases as chunkZ increases + schematicX = chunkX - destinationBox->x0; + schematicZ = chunkZ - destinationBox->z0; + break; + }; +} + +void ConsoleSchematicFile::schematicCoordToChunkCoord(AABB *destinationBox, double schematicX, double schematicZ, ESchematicRotation rot, double &chunkX, double &chunkZ) +{ + switch(rot) + { + case eSchematicRot_90: + // schematicX decreases as chunkZ increases + // schematicZ increases as chunkX increases + chunkX = (destinationBox->x1 - 1 - schematicZ); + chunkZ = schematicX + destinationBox->z0; + break; + case eSchematicRot_180: + // schematicX decreases as chunkX increases + // schematicZ decreases as chunkZ increases + chunkX = (destinationBox->x1 - 1 - schematicX); + chunkZ = (destinationBox->z1 - 1 - schematicZ); + break; + case eSchematicRot_270: + // schematicX increases as chunkZ increases + // shcematicZ decreases as chunkX increases + chunkX = schematicZ + destinationBox->x0; + chunkZ = (destinationBox->z1 - 1 - schematicX); + break; + case eSchematicRot_0: + default: + // schematicX increases as chunkX increases + // schematicZ increases as chunkZ increases + chunkX = schematicX + destinationBox->x0; + chunkZ = schematicZ + destinationBox->z0; + break; + }; +} + +void ConsoleSchematicFile::applyTileEntities(LevelChunk *chunk, AABB *chunkBox, AABB *destinationBox, ESchematicRotation rot) +{ + for(AUTO_VAR(it, m_tileEntities.begin()); it != m_tileEntities.end();++it) + { + shared_ptr te = *it; + + double targetX = te->x; + double targetY = te->y + destinationBox->y0; + double targetZ = te->z; + + schematicCoordToChunkCoord(destinationBox, te->x, te->z, rot, targetX, targetZ); + + Vec3 *pos = Vec3::newTemp(targetX,targetY,targetZ); + if( chunkBox->containsIncludingLowerBound(pos) ) + { + shared_ptr teCopy = chunk->getTileEntity( (int)targetX & 15, (int)targetY & 15, (int)targetZ & 15 ); + + if ( teCopy != NULL ) + { + CompoundTag *teData = new CompoundTag(); + te->save(teData); + + teCopy->load(teData); + + delete teData; + + // Adjust the tileEntity position to world coords from schematic co-ords + teCopy->x = targetX; + teCopy->y = targetY; + teCopy->z = targetZ; + + // Remove the current tile entity + //chunk->removeTileEntity( (int)targetX & 15, (int)targetY & 15, (int)targetZ & 15 ); + } + else + { + teCopy = te->clone(); + + // Adjust the tileEntity position to world coords from schematic co-ords + teCopy->x = targetX; + teCopy->y = targetY; + teCopy->z = targetZ; + chunk->addTileEntity(teCopy); + } + + teCopy->setChanged(); + } + } + for(AUTO_VAR(it, m_entities.begin()); it != m_entities.end();) + { + Vec3 *source = it->first; + + double targetX = source->x; + double targetY = source->y + destinationBox->y0; + double targetZ = source->z; + schematicCoordToChunkCoord(destinationBox, source->x, source->z, rot, targetX, targetZ); + + // Add 0.01 as the AABB::contains function returns false if a value is <= the lower bound + Vec3 *pos = Vec3::newTemp(targetX+0.01,targetY+0.01,targetZ+0.01); + if( !chunkBox->containsIncludingLowerBound(pos) ) + { + ++it; + continue; + } + + CompoundTag *eTag = it->second; + shared_ptr e = EntityIO::loadStatic(eTag, NULL); + + if( e->GetType() == eTYPE_PAINTING ) + { + shared_ptr painting = dynamic_pointer_cast(e); + + double tileX = painting->xTile; + double tileZ = painting->zTile; + schematicCoordToChunkCoord(destinationBox, painting->xTile, painting->zTile, rot, tileX, tileZ); + + painting->yTile += destinationBox->y0; + painting->xTile = tileX; + painting->zTile = tileZ; + painting->setDir(painting->dir); + } + else if( e->GetType() == eTYPE_ITEM_FRAME ) + { + shared_ptr frame = dynamic_pointer_cast(e); + + double tileX = frame->xTile; + double tileZ = frame->zTile; + schematicCoordToChunkCoord(destinationBox, frame->xTile, frame->zTile, rot, tileX, tileZ); + + frame->yTile += destinationBox->y0; + frame->xTile = tileX; + frame->zTile = tileZ; + frame->setDir(frame->dir); + } + else + { + e->absMoveTo(targetX, targetY, targetZ,e->yRot,e->xRot); + } +#ifdef _DEBUG + app.DebugPrintf("Adding entity type %d at (%f,%f,%f)\n",e->GetType(),e->x,e->y,e->z); +#endif + e->setLevel(chunk->level); + e->resetSmallId(); + e->setDespawnProtected(); // default to being protected against despawning + chunk->level->addEntity(e); + + // 4J Stu - Until we can copy every type of entity, remove them from this vector + // This means that the entities will only exist in the first use of the schematic that is processed + //it = m_entities.erase(it); + ++it; + } +} + +void ConsoleSchematicFile::generateSchematicFile(DataOutputStream *dos, Level *level, int xStart, int yStart, int zStart, int xEnd, int yEnd, int zEnd, bool bSaveMobs, Compression::ECompressionTypes compressionType) +{ + assert(xEnd > xStart); + assert(yEnd > yStart); + assert(zEnd > zStart); + // 4J Stu - Enforce even numbered positions to start with to avoid problems with half-bytes in data + + // We want the start to be even + if(xStart > 0 && xStart%2 != 0) + xStart-=1; + else if(xStart < 0 && xStart%2 !=0) + xStart-=1; + if(yStart < 0) yStart = 0; + else if(yStart > 0 && yStart%2 != 0) + yStart-=1; + if(zStart > 0 && zStart%2 != 0) + zStart-=1; + else if(zStart < 0 && zStart%2 !=0) + zStart-=1; + + // We want the end to be odd to have a total size that is even + if(xEnd > 0 && xEnd%2 == 0) + xEnd+=1; + else if(xEnd < 0 && xEnd%2 ==0) + xEnd+=1; + if(yEnd > Level::maxBuildHeight) + yEnd = Level::maxBuildHeight; + else if(yEnd > 0 && yEnd%2 == 0) + yEnd+=1; + else if(yEnd < 0 && yEnd%2 ==0) + yEnd+=1; + if(zEnd > 0 && zEnd%2 == 0) + zEnd+=1; + else if(zEnd < 0 && zEnd%2 ==0) + zEnd+=1; + + int xSize = xEnd - xStart + 1; + int ySize = yEnd - yStart + 1; + int zSize = zEnd - zStart + 1; + + app.DebugPrintf("Generating schematic file for area (%d,%d,%d) to (%d,%d,%d), %dx%dx%d\n",xStart,yStart,zStart,xEnd,yEnd,zEnd,xSize,ySize,zSize); + + if(dos != NULL) dos->writeInt(XBOX_SCHEMATIC_CURRENT_VERSION); + + if(dos != NULL) dos->writeByte(compressionType); + + //Write xSize + if(dos != NULL) dos->writeInt(xSize); + + //Write ySize + if(dos != NULL) dos->writeInt(ySize); + + //Write zSize + if(dos != NULL) dos->writeInt(zSize); + + //byteArray rawBuffer = level->getBlocksAndData(xStart, yStart, zStart, xSize, ySize, zSize, false); + int xRowSize = ySize * zSize; + int blockCount = xSize * xRowSize; + byteArray result( blockCount * 3 / 2 ); + + // Position pointers into the data when not ordered by chunk + int p = 0; + int dataP = blockCount; + int blockLightP = -1; + int skyLightP = -1; + + int y0 = yStart; + int y1 = yStart + ySize; + if (y0 < 0) y0 = 0; + if (y1 > Level::maxBuildHeight) y1 = Level::maxBuildHeight; + + // Every x is a whole row + for(int xPos = xStart; xPos < xStart + xSize; ++xPos) + { + int xc = xPos >> 4; + + int x0 = xPos - xc * 16; + if (x0 < 0) x0 = 0; + int x1 = x0 + 1; + if (x1 > 16) x1 = 16; + + for(int zPos = zStart; zPos < zStart + zSize;) + { + int zc = zPos >> 4; + + int z0 = zStart - zc * 16; + int z1 = zStart + zSize - zc * 16; + if (z0 < 0) z0 = 0; + if (z1 > 16) z1 = 16; + getBlocksAndData(level->getChunk(xc, zc), &result, x0, y0, z0, x1, y1, z1, p, dataP, blockLightP, skyLightP); + zPos += (z1-z0); + } + } + +#ifndef _CONTENT_PACKAGE + if(p!=blockCount) __debugbreak(); +#endif + + // We don't know how this will compress - just make a fixed length buffer to initially decompress into + // Some small sets of blocks can end up compressing into something bigger than their source + unsigned int inputSize = blockCount * 3 / 2; + unsigned char *ucTemp = new unsigned char[inputSize]; + + switch(compressionType) + { + case Compression::eCompressionType_LZXRLE: + Compression::getCompression()->CompressLZXRLE( ucTemp, &inputSize, result.data, (unsigned int) result.length ); + break; + case Compression::eCompressionType_RLE: + Compression::getCompression()->CompressRLE( ucTemp, &inputSize, result.data, (unsigned int) result.length ); + break; + case Compression::eCompressionType_None: + default: + memcpy( ucTemp, result.data, inputSize ); + break; + }; + + delete [] result.data; + byteArray buffer = byteArray(ucTemp,inputSize); + + if(dos != NULL) dos->writeInt(inputSize); + if(dos != NULL) dos->write(buffer); + delete [] buffer.data; + + CompoundTag tag; + ListTag *tileEntitiesTag = new ListTag(L"tileEntities"); + + int xc0 = xStart >> 4; + int zc0 = zStart >> 4; + int xc1 = (xStart + xSize - 1) >> 4; + int zc1 = (zStart + zSize - 1) >> 4; + + for (int xc = xc0; xc <= xc1; xc++) + { + for (int zc = zc0; zc <= zc1; zc++) + { + vector > *tileEntities = getTileEntitiesInRegion(level->getChunk(xc, zc), xStart, yStart, zStart, xStart + xSize, yStart + ySize, zStart + zSize); + for(AUTO_VAR(it, tileEntities->begin()); it != tileEntities->end(); ++it) + { + shared_ptr te = *it; + CompoundTag *teTag = new CompoundTag(); + shared_ptr teCopy = te->clone(); + + // Adjust the tileEntity position to schematic coords from world co-ords + teCopy->x -= xStart; + teCopy->y -= yStart; + teCopy->z -= zStart; + teCopy->save(teTag); + tileEntitiesTag->add(teTag); + } + delete tileEntities; + } + } + tag.put(L"TileEntities", tileEntitiesTag); + + AABB *bb = AABB::newTemp(xStart,yStart,zStart,xEnd,yEnd,zEnd); + vector > *entities = level->getEntities(nullptr, bb); + ListTag *entitiesTag = new ListTag(L"entities"); + + for(AUTO_VAR(it, entities->begin()); it != entities->end(); ++it) + { + shared_ptr e = *it; + + bool mobCanBeSaved = false; + if (bSaveMobs) + { + if ( e->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; + } + } + + // 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) ) + { + ListTag *pos = (ListTag *) eTag->getList(L"Pos"); + + pos->get(0)->data -= xStart; + pos->get(1)->data -= yStart; + pos->get(2)->data -= zStart; + + if( e->instanceof(eTYPE_HANGING_ENTITY) ) + { + ((IntTag *) eTag->get(L"TileX") )->data -= xStart; + ((IntTag *) eTag->get(L"TileY") )->data -= yStart; + ((IntTag *) eTag->get(L"TileZ") )->data -= zStart; + } + + entitiesTag->add(eTag); + } + } + } + + tag.put(L"Entities", entitiesTag); + + if(dos != NULL) NbtIo::write(&tag,dos); +} + +void ConsoleSchematicFile::getBlocksAndData(LevelChunk *chunk, byteArray *data, int x0, int y0, int z0, int x1, int y1, int z1, int &blocksP, int &dataP, int &blockLightP, int &skyLightP) +{ + // 4J Stu - Needs updated to work with higher worlds, should still work with non-optimised version below + //int xs = x1 - x0; + //int ys = y1 - y0; + //int zs = z1 - z0; + //if (xs * ys * zs == LevelChunk::BLOCKS_LENGTH) + //{ + // byteArray blockData = byteArray(data->data + blocksP, Level::CHUNK_TILE_COUNT); + // chunk->getBlockData(blockData); + // blocksP += blockData.length; + + // byteArray dataData = byteArray(data->data + dataP, 16384); + // chunk->getBlockLightData(dataData); + // dataP += dataData.length; + + // byteArray blockLightData = byteArray(data->data + blockLightP, 16384); + // chunk->getBlockLightData(blockLightData); + // blockLightP += blockLightData.length; + + // byteArray skyLightData = byteArray(data->data + skyLightP, 16384); + // chunk->getSkyLightData(skyLightData); + // skyLightP += skyLightData.length; + // return; + //} + + bool bHasLower, bHasUpper; + bHasLower = bHasUpper = false; + int lowerY0, lowerY1, upperY0, upperY1; + lowerY0 = upperY0 = y0; + lowerY1 = upperY1 = y1; + + int compressedHeight = Level::COMPRESSED_CHUNK_SECTION_HEIGHT; + if(y0 < Level::COMPRESSED_CHUNK_SECTION_HEIGHT) + { + lowerY0 = y0; + lowerY1 = min(y1, compressedHeight); + bHasLower = true; + } + if(y1 >= Level::COMPRESSED_CHUNK_SECTION_HEIGHT) + { + upperY0 = max(y0, compressedHeight) - Level::COMPRESSED_CHUNK_SECTION_HEIGHT; + upperY1 = y1 - Level::COMPRESSED_CHUNK_SECTION_HEIGHT; + bHasUpper = true; + } + + byteArray blockData = byteArray(Level::CHUNK_TILE_COUNT); + chunk->getBlockData(blockData); + for (int x = x0; x < x1; x++) + for (int z = z0; z < z1; z++) + { + if(bHasLower) + { + int slot = x << Level::genDepthBitsPlusFour | z << Level::genDepthBits | lowerY0; + int len = lowerY1 - lowerY0; + System::arraycopy(blockData, slot, data, blocksP, len); + blocksP += len; + } + if(bHasUpper) + { + int slot = (x << Level::genDepthBitsPlusFour | z << Level::genDepthBits | upperY0) + Level::COMPRESSED_CHUNK_SECTION_TILES; + int len = upperY1 - upperY0; + System::arraycopy(blockData, slot, data, blocksP, len); + blocksP += len; + } + } + delete blockData.data; + + byteArray dataData = byteArray(Level::CHUNK_TILE_COUNT); + chunk->getDataData(dataData); + for (int x = x0; x < x1; x++) + for (int z = z0; z < z1; z++) + { + if(bHasLower) + { + int slot = (x << Level::genDepthBitsPlusFour | z << Level::genDepthBits | lowerY0) >> 1; + int len = (lowerY1 - lowerY0) / 2; + System::arraycopy(dataData, slot, data, dataP, len); + dataP += len; + } + if(bHasUpper) + { + int slot = ((x << Level::genDepthBitsPlusFour | z << Level::genDepthBits | upperY0) + Level::COMPRESSED_CHUNK_SECTION_TILES) >> 1; + int len = (upperY1 - upperY0) / 2; + System::arraycopy(dataData, slot, data, dataP, len); + dataP += len; + } + } + delete dataData.data; + + // 4J Stu - Allow ignoring light data + if(blockLightP > -1) + { + byteArray blockLightData = byteArray(Level::HALF_CHUNK_TILE_COUNT); + chunk->getBlockLightData(blockLightData); + for (int x = x0; x < x1; x++) + for (int z = z0; z < z1; z++) + { + if(bHasLower) + { + int slot = (x << Level::genDepthBitsPlusFour | z << Level::genDepthBits | lowerY0) >> 1; + int len = (lowerY1 - lowerY0) / 2; + System::arraycopy(blockLightData, slot, data, blockLightP, len); + blockLightP += len; + } + if(bHasUpper) + { + int slot = ((x << Level::genDepthBitsPlusFour | z << Level::genDepthBits | upperY0) >> 1) + (Level::COMPRESSED_CHUNK_SECTION_TILES/2); + int len = (upperY1 - upperY0) / 2; + System::arraycopy(blockLightData, slot, data, blockLightP, len); + blockLightP += len; + } + } + delete blockLightData.data; + } + + + // 4J Stu - Allow ignoring light data + if(skyLightP > -1) + { + byteArray skyLightData = byteArray(Level::HALF_CHUNK_TILE_COUNT); + chunk->getSkyLightData(skyLightData); + for (int x = x0; x < x1; x++) + for (int z = z0; z < z1; z++) + { + if(bHasLower) + { + int slot = (x << Level::genDepthBitsPlusFour | z << Level::genDepthBits | lowerY0) >> 1; + int len = (lowerY1 - lowerY0) / 2; + System::arraycopy(skyLightData, slot, data, skyLightP, len); + skyLightP += len; + } + if(bHasUpper) + { + int slot = ((x << Level::genDepthBitsPlusFour | z << Level::genDepthBits | upperY0) >> 1) + (Level::COMPRESSED_CHUNK_SECTION_TILES/2); + int len = (upperY1 - upperY0) / 2; + System::arraycopy(skyLightData, slot, data, skyLightP, len); + skyLightP += len; + } + } + delete skyLightData.data; + } + + return; +} + +void ConsoleSchematicFile::setBlocksAndData(LevelChunk *chunk, byteArray blockData, byteArray dataData, byteArray inputData, int x0, int y0, int z0, int x1, int y1, int z1, int &blocksP, int &dataP, int &blockLightP, int &skyLightP) +{ + bool bHasLower, bHasUpper; + bHasLower = bHasUpper = false; + int lowerY0, lowerY1, upperY0, upperY1; + lowerY0 = upperY0 = y0; + lowerY1 = upperY1 = y1; + + int compressedHeight = Level::COMPRESSED_CHUNK_SECTION_HEIGHT; + if(y0 < Level::COMPRESSED_CHUNK_SECTION_HEIGHT) + { + lowerY0 = y0; + lowerY1 = min(y1, compressedHeight); + bHasLower = true; + } + if(y1 >= Level::COMPRESSED_CHUNK_SECTION_HEIGHT) + { + upperY0 = max(y0, compressedHeight) - Level::COMPRESSED_CHUNK_SECTION_HEIGHT; + upperY1 = y1 - Level::COMPRESSED_CHUNK_SECTION_HEIGHT; + bHasUpper = true; + } + PIXBeginNamedEvent(0,"Applying block data"); + for (int x = x0; x < x1; x++) + for (int z = z0; z < z1; z++) + { + if(bHasLower) + { + int slot = x << Level::genDepthBitsPlusFour | z << Level::genDepthBits | lowerY0; + int len = lowerY1 - lowerY0; + System::arraycopy(inputData, blocksP, &blockData, slot, len); + blocksP += len; + } + if(bHasUpper) + { + int slot = (x << Level::genDepthBitsPlusFour | z << Level::genDepthBits | upperY0) + Level::COMPRESSED_CHUNK_SECTION_TILES; + int len = upperY1 - upperY0; + System::arraycopy(inputData, blocksP, &blockData, slot, len); + blocksP += len; + } + } + PIXEndNamedEvent(); + + PIXBeginNamedEvent(0,"Applying Data data"); + for (int x = x0; x < x1; x++) + for (int z = z0; z < z1; z++) + { + if(bHasLower) + { + int slot = (x << Level::genDepthBitsPlusFour | z << Level::genDepthBits | lowerY0) >> 1; + int len = (lowerY1 - lowerY0) / 2; + System::arraycopy(inputData, dataP, &dataData, slot, len); + dataP += len; + } + if(bHasUpper) + { + int slot = ((x << Level::genDepthBitsPlusFour | z << Level::genDepthBits | upperY0) + Level::COMPRESSED_CHUNK_SECTION_TILES) >> 1; + int len = (upperY1 - upperY0) / 2; + System::arraycopy(inputData, dataP, &dataData, slot, len); + dataP += len; + } + } + PIXEndNamedEvent(); + // 4J Stu - Allow ignoring light data + if(blockLightP > -1) + { + byteArray blockLightData = byteArray(Level::HALF_CHUNK_TILE_COUNT); + chunk->getBlockLightData(blockLightData); + for (int x = x0; x < x1; x++) + for (int z = z0; z < z1; z++) + { + if(bHasLower) + { + int slot = (x << Level::genDepthBitsPlusFour | z << Level::genDepthBits | lowerY0) >> 1; + int len = (lowerY1 - lowerY0) / 2; + System::arraycopy(inputData, blockLightP, &blockLightData, slot, len); + blockLightP += len; + } + if(bHasUpper) + { + int slot = ( (x << Level::genDepthBitsPlusFour | z << Level::genDepthBits | upperY0) >> 1) + (Level::COMPRESSED_CHUNK_SECTION_TILES/2); + int len = (upperY1 - upperY0) / 2; + System::arraycopy(inputData, blockLightP, &blockLightData, slot, len); + blockLightP += len; + } + } + chunk->setBlockLightData(blockLightData); + delete blockLightData.data; + } + + // 4J Stu - Allow ignoring light data + if(skyLightP > -1) + { + byteArray skyLightData = byteArray(Level::HALF_CHUNK_TILE_COUNT); + chunk->getSkyLightData(skyLightData); + for (int x = x0; x < x1; x++) + for (int z = z0; z < z1; z++) + { + if(bHasLower) + { + int slot = (x << Level::genDepthBitsPlusFour | z << Level::genDepthBits | lowerY0) >> 1; + int len = (lowerY1 - lowerY0) / 2; + System::arraycopy(inputData, skyLightP, &skyLightData, slot, len); + skyLightP += len; + } + if(bHasUpper) + { + int slot = (x << Level::genDepthBitsPlusFour | z << Level::genDepthBits | upperY0) + (Level::COMPRESSED_CHUNK_SECTION_TILES/2); + int len = (upperY1 - upperY0) / 2; + System::arraycopy(inputData, skyLightP, &skyLightData, slot, len); + skyLightP += len; + } + } + chunk->setSkyLightData(skyLightData); + delete skyLightData.data; + } +} + +vector > *ConsoleSchematicFile::getTileEntitiesInRegion(LevelChunk *chunk, int x0, int y0, int z0, int x1, int y1, int z1) +{ + vector > *result = new vector >; + for (AUTO_VAR(it, chunk->tileEntities.begin()); it != chunk->tileEntities.end(); ++it) + { + shared_ptr te = it->second; + if (te->x >= x0 && te->y >= y0 && te->z >= z0 && te->x < x1 && te->y < y1 && te->z < z1) + { + result->push_back(te); + } + } + return result; +} diff --git a/Minecraft.Client/Common/GameRules/ConsoleSchematicFile.h b/Minecraft.Client/Common/GameRules/ConsoleSchematicFile.h new file mode 100644 index 00000000..f37a6058 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/ConsoleSchematicFile.h @@ -0,0 +1,90 @@ +#pragma once +using namespace std; + +#define XBOX_SCHEMATIC_ORIGINAL_VERSION 1 +#define XBOX_SCHEMATIC_CURRENT_VERSION 2 + +#include "..\..\..\Minecraft.World\ArrayWithLength.h" + +class Level; +class DataOutputStream; +class DataInputStream; +class TileEntity; +class LevelChunk; +class AABB; +class Vec3; + +class ConsoleSchematicFile +{ +public: + enum ESchematicRotation + { + eSchematicRot_0, + eSchematicRot_90, + eSchematicRot_180, + eSchematicRot_270 + }; +private: + int m_refCount; + +public: + void incrementRefCount() { ++m_refCount; } + void decrementRefCount() { --m_refCount; } + bool shouldDelete() { return m_refCount <= 0; } + + typedef struct _XboxSchematicInitParam + { + wchar_t name[64]; + int startX; + int startY; + int startZ; + int endX; + int endY; + int endZ; + bool bSaveMobs; + + Compression::ECompressionTypes compressionType; + + _XboxSchematicInitParam() + { + ZeroMemory(name,64*(sizeof(wchar_t))); + startX = startY = startZ = endX = endY = endZ = 0; + bSaveMobs = false; + compressionType = Compression::eCompressionType_None; + } + } XboxSchematicInitParam; +private: + int m_xSize, m_ySize, m_zSize; + vector > m_tileEntities; + vector< pair > m_entities; + +public: + byteArray m_data; + +public: + ConsoleSchematicFile(); + ~ConsoleSchematicFile(); + + int getXSize() { return m_xSize; } + int getYSize() { return m_ySize; } + int getZSize() { return m_zSize; } + + void save(DataOutputStream *dos); + void load(DataInputStream *dis); + + __int64 applyBlocksAndData(LevelChunk *chunk, AABB *chunkBox, AABB *destinationBox, ESchematicRotation rot); + __int64 applyLighting(LevelChunk *chunk, AABB *chunkBox, AABB *destinationBox, ESchematicRotation rot); + void applyTileEntities(LevelChunk *chunk, AABB *chunkBox, AABB *destinationBox, ESchematicRotation rot); + + static void generateSchematicFile(DataOutputStream *dos, Level *level, int xStart, int yStart, int zStart, int xEnd, int yEnd, int zEnd, bool bSaveMobs, Compression::ECompressionTypes); + static void setBlocksAndData(LevelChunk *chunk, byteArray blockData, byteArray dataData, byteArray data, int x0, int y0, int z0, int x1, int y1, int z1, int &blocksP, int &dataP, int &blockLightP, int &skyLightP); +private: + void save_tags(DataOutputStream *dos); + void load_tags(DataInputStream *dis); + + static void getBlocksAndData(LevelChunk *chunk, byteArray *data, int x0, int y0, int z0, int x1, int y1, int z1, int &blocksP, int &dataP, int &blockLightP, int &skyLightP); + static vector > *getTileEntitiesInRegion(LevelChunk *chunk, int x0, int y0, int z0, int x1, int y1, int z1); + + void chunkCoordToSchematicCoord(AABB *destinationBox, int chunkX, int chunkZ, ESchematicRotation rot, int &schematicX, int &schematicZ); + void schematicCoordToChunkCoord(AABB *destinationBox, double schematicX, double schematicZ, ESchematicRotation rot, double &chunkX, double &chunkZ); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/GameRule.cpp b/Minecraft.Client/Common/GameRules/GameRule.cpp new file mode 100644 index 00000000..34d6196c --- /dev/null +++ b/Minecraft.Client/Common/GameRules/GameRule.cpp @@ -0,0 +1,97 @@ +#include "stdafx.h" +#include "ConsoleGameRules.h" + +GameRule::GameRule(GameRuleDefinition *definition, Connection *connection) +{ + m_definition = definition; + m_connection = connection; +} + +GameRule::~GameRule() +{ + for(AUTO_VAR(it, m_parameters.begin()); it != m_parameters.end(); ++it) + { + if(it->second.isPointer) + { + delete it->second.gr; + } + } +} + +GameRule::ValueType GameRule::getParameter(const wstring ¶meterName) +{ + if(m_parameters.find(parameterName) == m_parameters.end()) + { +#ifndef _CONTENT_PACKAGE + wprintf(L"WARNING: Parameter %ls was not set before being fetched\n", parameterName.c_str()); + __debugbreak(); +#endif + } + return m_parameters[parameterName]; +} + +void GameRule::setParameter(const wstring ¶meterName,ValueType value) +{ + if(m_parameters.find(parameterName) == m_parameters.end()) + { +#ifndef _CONTENT_PACKAGE + wprintf(L"Adding parameter %ls to GameRule\n", parameterName.c_str()); +#endif + } + else + { +#ifndef _CONTENT_PACKAGE + wprintf(L"Setting parameter %ls for GameRule\n", parameterName.c_str()); +#endif + } + m_parameters[parameterName] = value; +} + +GameRuleDefinition *GameRule::getGameRuleDefinition() +{ + return m_definition; +} + +void GameRule::onUseTile(int tileId, int x, int y, int z) { m_definition->onUseTile(this,tileId,x,y,z); } +void GameRule::onCollectItem(shared_ptr item) { m_definition->onCollectItem(this,item); } + +void GameRule::write(DataOutputStream *dos) +{ + // Find required parameters. + dos->writeInt(m_parameters.size()); + for (AUTO_VAR(it, m_parameters.begin()); it != m_parameters.end(); it++) + { + wstring pName = (*it).first; + ValueType vType = (*it).second; + + dos->writeUTF( (*it).first ); + dos->writeBoolean( vType.isPointer ); + + if (vType.isPointer) + vType.gr->write(dos); + else + dos->writeLong( vType.i64 ); + } +} + +void GameRule::read(DataInputStream *dis) +{ + int savedParams = dis->readInt(); + for (int i = 0; i < savedParams; i++) + { + wstring pNames = dis->readUTF(); + + ValueType vType = getParameter(pNames); + + if (dis->readBoolean()) + { + vType.gr->read(dis); + } + else + { + vType.isPointer = false; + vType.i64 = dis->readLong(); + setParameter(pNames, vType); + } + } +} diff --git a/Minecraft.Client/Common/GameRules/GameRule.h b/Minecraft.Client/Common/GameRules/GameRule.h new file mode 100644 index 00000000..bdc2ceff --- /dev/null +++ b/Minecraft.Client/Common/GameRules/GameRule.h @@ -0,0 +1,62 @@ +#pragma once +using namespace std; + +#include + +class CompoundTag; +class GameRuleDefinition; +class Connection; + +// A game rule maintains the state for one particular definition +class GameRule +{ +public: + typedef struct _ValueType + { + union{ + __int64 i64; + int i; + char c; + bool b; + float f; + double d; + GameRule *gr; + }; + bool isPointer; + + _ValueType() + { + i64 = 0; + isPointer = false; + } + } ValueType; + +private: + GameRuleDefinition *m_definition; + Connection *m_connection; + +public: + typedef unordered_map stringValueMapType; + stringValueMapType m_parameters; // These are the members of this rule that maintain it's state + +public: + GameRule(GameRuleDefinition *definition, Connection *connection = NULL); + virtual ~GameRule(); + + Connection *getConnection() { return m_connection; } + + ValueType getParameter(const wstring ¶meterName); + void setParameter(const wstring ¶meterName,ValueType value); + GameRuleDefinition *getGameRuleDefinition(); + + // All the hooks go here + void onUseTile(int tileId, int x, int y, int z); + void onCollectItem(shared_ptr item); + + // 4J-JEV: For saving. + //CompoundTag *toTags(unordered_map *map); + //static GameRule *fromTags(Connection *c, CompoundTag *cTag, vector *grds); + + void write(DataOutputStream *dos); + void read(DataInputStream *dos); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/GameRuleDefinition.cpp b/Minecraft.Client/Common/GameRules/GameRuleDefinition.cpp new file mode 100644 index 00000000..b63687c2 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/GameRuleDefinition.cpp @@ -0,0 +1,151 @@ +#include "stdafx.h" +#include "..\..\WstringLookup.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "ConsoleGameRules.h" + +GameRuleDefinition::GameRuleDefinition() +{ + m_descriptionId = L""; + m_promptId = L""; + m_4JDataValue = 0; +} + +void GameRuleDefinition::write(DataOutputStream *dos) +{ + // Write EGameRuleType. + ConsoleGameRules::EGameRuleType eType = getActionType(); + assert( eType != ConsoleGameRules::eGameRuleType_Invalid ); + ConsoleGameRules::write(dos, eType); // stringID + + writeAttributes(dos, 0); + + // 4J-JEV: Get children. + vector *children = new vector(); + getChildren( children ); + + // Write children. + dos->writeInt( children->size() ); + for (AUTO_VAR(it, children->begin()); it != children->end(); it++) + (*it)->write(dos); +} + +void GameRuleDefinition::writeAttributes(DataOutputStream *dos, UINT numAttributes) +{ + dos->writeInt(numAttributes + 3); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_descriptionName); + dos->writeUTF(m_descriptionId); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_promptName); + dos->writeUTF(m_promptId); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_dataTag); + dos->writeUTF(_toString(m_4JDataValue)); +} + +void GameRuleDefinition::getChildren(vector *children) {} + +GameRuleDefinition *GameRuleDefinition::addChild(ConsoleGameRules::EGameRuleType ruleType) +{ +#ifndef _CONTENT_PACKAGE + wprintf(L"GameRuleDefinition: Attempted to add invalid child rule - %d\n", ruleType ); +#endif + return NULL; +} + +void GameRuleDefinition::addAttribute(const wstring &attributeName, const wstring &attributeValue) +{ + if(attributeName.compare(L"descriptionName") == 0) + { + m_descriptionId = attributeValue; +#ifndef _CONTENT_PACKAGE + wprintf(L"GameRuleDefinition: Adding parameter descriptionId=%ls\n",m_descriptionId.c_str()); +#endif + } + else if(attributeName.compare(L"promptName") == 0) + { + m_promptId = attributeValue; +#ifndef _CONTENT_PACKAGE + wprintf(L"GameRuleDefinition: Adding parameter m_promptId=%ls\n",m_promptId.c_str()); +#endif + } + else if(attributeName.compare(L"dataTag") == 0) + { + m_4JDataValue = _fromString(attributeValue); + app.DebugPrintf("GameRuleDefinition: Adding parameter m_4JDataValue=%d\n",m_4JDataValue); + } + else + { +#ifndef _CONTENT_PACKAGE + wprintf(L"GameRuleDefinition: Attempted to add invalid attribute: %ls\n", attributeName.c_str()); +#endif + } +} + +void GameRuleDefinition::populateGameRule(GameRulesInstance::EGameRulesInstanceType type, GameRule *rule) +{ + GameRule::ValueType value; + value.b = false; + rule->setParameter(L"bComplete",value); +} + +bool GameRuleDefinition::getComplete(GameRule *rule) +{ + GameRule::ValueType value; + value = rule->getParameter(L"bComplete"); + return value.b; +} + +void GameRuleDefinition::setComplete(GameRule *rule, bool val) +{ + GameRule::ValueType value; + value = rule->getParameter(L"bComplete"); + value.b = val; + rule->setParameter(L"bComplete",value); +} + +vector *GameRuleDefinition::enumerate() +{ + // Get Vector. + vector *gRules; + gRules = new vector(); + gRules->push_back(this); + getChildren(gRules); + return gRules; +} + +unordered_map *GameRuleDefinition::enumerateMap() +{ + unordered_map *out + = new unordered_map(); + + int i = 0; + vector *gRules = enumerate(); + for (AUTO_VAR(it, gRules->begin()); it != gRules->end(); it++) + out->insert( pair( *it, i++ ) ); + + return out; +} + +GameRulesInstance *GameRuleDefinition::generateNewGameRulesInstance(GameRulesInstance::EGameRulesInstanceType type, LevelRuleset *rules, Connection *connection) +{ + GameRulesInstance *manager = new GameRulesInstance(rules, connection); + + rules->populateGameRule(type, manager); + + return manager; +} + +wstring GameRuleDefinition::generateDescriptionString(ConsoleGameRules::EGameRuleType defType, const wstring &description, void *data, int dataLength) +{ + wstring formatted = description; + switch(defType) + { + case ConsoleGameRules::eGameRuleType_CompleteAllRule: + formatted = CompleteAllRuleDefinition::generateDescriptionString(description,data,dataLength); + break; + default: + break; + }; + return formatted; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/GameRuleDefinition.h b/Minecraft.Client/Common/GameRules/GameRuleDefinition.h new file mode 100644 index 00000000..afec8fbc --- /dev/null +++ b/Minecraft.Client/Common/GameRules/GameRuleDefinition.h @@ -0,0 +1,66 @@ +#pragma once +using namespace std; +#include +#include + +#include "..\..\..\Minecraft.World\ItemInstance.h" +#include "ConsoleGameRulesConstants.h" + +#include "GameRulesInstance.h" + +class GameRule; +class LevelRuleset; +class Player; +class WstringLookup; + +class GameRuleDefinition +{ +private: + // Owner type defines who this rule applies to + GameRulesInstance::EGameRulesInstanceType m_ownerType; + +protected: + // These attributes should map to those in the XSD GameRuleType + wstring m_descriptionId; + wstring m_promptId; + int m_4JDataValue; + +public: + GameRuleDefinition(); + + virtual ConsoleGameRules::EGameRuleType getActionType() = 0; + + void setOwnerType(GameRulesInstance::EGameRulesInstanceType ownerType) { m_ownerType = ownerType;} + + virtual void write(DataOutputStream *); + + virtual void writeAttributes(DataOutputStream *dos, UINT numAttributes); + virtual void getChildren(vector *); + + virtual GameRuleDefinition *addChild(ConsoleGameRules::EGameRuleType ruleType); + virtual void addAttribute(const wstring &attributeName, const wstring &attributeValue); + + virtual void populateGameRule(GameRulesInstance::EGameRulesInstanceType type, GameRule *rule); + + bool getComplete(GameRule *rule); + void setComplete(GameRule *rule, bool val); + + virtual int getGoal() { return 0; } + virtual int getProgress(GameRule *rule) { return 0; } + + virtual int getIcon() { return -1; } + virtual int getAuxValue() { return 0; } + + // Here we should have functions for all the hooks, with a GameRule* as the first parameter + virtual bool onUseTile(GameRule *rule, int tileId, int x, int y, int z) { return false; } + virtual bool onCollectItem(GameRule *rule, shared_ptr item) { return false; } + virtual void postProcessPlayer(shared_ptr player) { } + + vector *enumerate(); + unordered_map *enumerateMap(); + + // Static functions + static GameRulesInstance *generateNewGameRulesInstance(GameRulesInstance::EGameRulesInstanceType type, LevelRuleset *rules, Connection *connection); + static wstring generateDescriptionString(ConsoleGameRules::EGameRuleType defType, const wstring &description, void *data = NULL, int dataLength = 0); + +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/GameRuleManager.cpp b/Minecraft.Client/Common/GameRules/GameRuleManager.cpp new file mode 100644 index 00000000..6e5688cc --- /dev/null +++ b/Minecraft.Client/Common/GameRules/GameRuleManager.cpp @@ -0,0 +1,775 @@ +#include "stdafx.h" +#include "..\..\..\Minecraft.World\compression.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\..\Minecraft.World\File.h" +#include "..\..\..\Minecraft.World\compression.h" +#include "..\DLC\DLCPack.h" +#include "..\DLC\DLCLocalisationFile.h" +#include "..\DLC\DLCGameRulesFile.h" +#include "..\DLC\DLCGameRules.h" +#include "..\DLC\DLCGameRulesHeader.h" +#include "..\..\StringTable.h" +#include "ConsoleGameRules.h" +#include "GameRuleManager.h" + +WCHAR *GameRuleManager::wchTagNameA[] = +{ + L"", // eGameRuleType_Root + L"MapOptions", // eGameRuleType_LevelGenerationOptions + L"ApplySchematic", // eGameRuleType_ApplySchematic + L"GenerateStructure", // eGameRuleType_GenerateStructure + L"GenerateBox", // eGameRuleType_GenerateBox + L"PlaceBlock", // eGameRuleType_PlaceBlock + L"PlaceContainer", // eGameRuleType_PlaceContainer + L"PlaceSpawner", // eGameRuleType_PlaceSpawner + L"BiomeOverride", // eGameRuleType_BiomeOverride + L"StartFeature", // eGameRuleType_StartFeature + L"AddItem", // eGameRuleType_AddItem + L"AddEnchantment", // eGameRuleType_AddEnchantment + L"LevelRules", // eGameRuleType_LevelRules + L"NamedArea", // eGameRuleType_NamedArea + L"UseTile", // eGameRuleType_UseTileRule + L"CollectItem", // eGameRuleType_CollectItemRule + L"CompleteAll", // eGameRuleType_CompleteAllRule + L"UpdatePlayer", // eGameRuleType_UpdatePlayerRule +}; + +WCHAR *GameRuleManager::wchAttrNameA[] = +{ + L"descriptionName", // eGameRuleAttr_descriptionName + L"promptName", // eGameRuleAttr_promptName + L"dataTag", // eGameRuleAttr_dataTag + L"enchantmentId", // eGameRuleAttr_enchantmentId + L"enchantmentLevel", // eGameRuleAttr_enchantmentLevel + L"itemId", // eGameRuleAttr_itemId + L"quantity", // eGameRuleAttr_quantity + L"auxValue", // eGameRuleAttr_auxValue + L"slot", // eGameRuleAttr_slot + L"name", // eGameRuleAttr_name + L"food", // eGameRuleAttr_food + L"health", // eGameRuleAttr_health + L"tileId", // eGameRuleAttr_tileId + L"useCoords", // eGameRuleAttr_useCoords + L"seed", // eGameRuleAttr_seed + L"flatworld", // eGameRuleAttr_flatworld + L"filename", // eGameRuleAttr_filename + L"rot", // eGameRuleAttr_rot + L"data", // eGameRuleAttr_data + L"block", // eGameRuleAttr_block + L"entity", // eGameRuleAttr_entity + L"facing", // eGameRuleAttr_facing + L"edgeTile", // eGameRuleAttr_edgeTile + L"fillTile", // eGameRuleAttr_fillTile + L"skipAir", // eGameRuleAttr_skipAir + L"x", // eGameRuleAttr_x + L"x0", // eGameRuleAttr_x0 + L"x1", // eGameRuleAttr_x1 + L"y", // eGameRuleAttr_y + L"y0", // eGameRuleAttr_y0 + L"y1", // eGameRuleAttr_y1 + L"z", // eGameRuleAttr_z + L"z0", // eGameRuleAttr_z0 + L"z1", // eGameRuleAttr_z1 + L"chunkX", // eGameRuleAttr_chunkX + L"chunkZ", // eGameRuleAttr_chunkZ + L"yRot", // eGameRuleAttr_yRot + L"spawnX", // eGameRuleAttr_spawnX + L"spawnY", // eGameRuleAttr_spawnY + L"spawnZ", // eGameRuleAttr_spawnZ + L"orientation", + L"dimension", + L"topTileId", // eGameRuleAttr_topTileId + L"biomeId", // eGameRuleAttr_biomeId + L"feature", // eGameRuleAttr_feature +}; + +GameRuleManager::GameRuleManager() +{ + m_currentGameRuleDefinitions = NULL; + m_currentLevelGenerationOptions = NULL; +} + +void GameRuleManager::loadGameRules(DLCPack *pack) +{ + StringTable *strings = NULL; + + if(pack->doesPackContainFile(DLCManager::e_DLCType_LocalisationData,L"languages.loc")) + { + DLCLocalisationFile *localisationFile = (DLCLocalisationFile *)pack->getFile(DLCManager::e_DLCType_LocalisationData, L"languages.loc"); + strings = localisationFile->getStringTable(); + } + + int gameRulesCount = pack->getDLCItemsCount(DLCManager::e_DLCType_GameRulesHeader); + for(int i = 0; i < gameRulesCount; ++i) + { + DLCGameRulesHeader *dlcHeader = (DLCGameRulesHeader *)pack->getFile(DLCManager::e_DLCType_GameRulesHeader, i); + DWORD dSize; + byte *dData = dlcHeader->getData(dSize); + + LevelGenerationOptions *createdLevelGenerationOptions = new LevelGenerationOptions(pack); + // = loadGameRules(dData, dSize); //, strings); + + createdLevelGenerationOptions->setGrSource( dlcHeader ); + createdLevelGenerationOptions->setSrc( LevelGenerationOptions::eSrc_fromDLC ); + + readRuleFile(createdLevelGenerationOptions, dData, dSize, strings); + + dlcHeader->lgo = createdLevelGenerationOptions; + } + + gameRulesCount = pack->getDLCItemsCount(DLCManager::e_DLCType_GameRules); + for (int i = 0; i < gameRulesCount; ++i) + { + DLCGameRulesFile *dlcFile = (DLCGameRulesFile *)pack->getFile(DLCManager::e_DLCType_GameRules, i); + + DWORD dSize; + byte *dData = dlcFile->getData(dSize); + + LevelGenerationOptions *createdLevelGenerationOptions = new LevelGenerationOptions(pack); + // = loadGameRules(dData, dSize); //, strings); + + createdLevelGenerationOptions->setGrSource( new JustGrSource() ); + createdLevelGenerationOptions->setSrc( LevelGenerationOptions::eSrc_tutorial ); + + readRuleFile(createdLevelGenerationOptions, dData, dSize, strings); + + createdLevelGenerationOptions->setLoadedData(); + } +} + +LevelGenerationOptions *GameRuleManager::loadGameRules(byte *dIn, UINT dSize) +{ + LevelGenerationOptions *lgo = new LevelGenerationOptions(); + lgo->setGrSource( new JustGrSource() ); + lgo->setSrc( LevelGenerationOptions::eSrc_fromSave ); + loadGameRules(lgo, dIn, dSize); + lgo->setLoadedData(); + return lgo; +} + +// 4J-JEV: Reverse of saveGameRules. +void GameRuleManager::loadGameRules(LevelGenerationOptions *lgo, byte *dIn, UINT dSize) +{ + app.DebugPrintf("GameRuleManager::LoadingGameRules:\n"); + + ByteArrayInputStream bais( byteArray(dIn,dSize) ); + DataInputStream dis(&bais); + + // Read file header. + + //dis.readInt(); // File Size + + short version = dis.readShort(); + assert( 0x1 == version ); + app.DebugPrintf("\tversion=%d.\n", version); + + for (int i = 0; i < 8; i++) dis.readByte(); + + BYTE compression_type = dis.readByte(); + + app.DebugPrintf("\tcompressionType=%d.\n", compression_type); + + UINT compr_len, decomp_len; + compr_len = dis.readInt(); + decomp_len = dis.readInt(); + + app.DebugPrintf("\tcompr_len=%d.\n\tdecomp_len=%d.\n", compr_len, decomp_len); + + + // Decompress File Body + + byteArray content(new BYTE[decomp_len], decomp_len), + compr_content(new BYTE[compr_len], compr_len); + dis.read(compr_content); + + Compression::getCompression()->SetDecompressionType( (Compression::ECompressionTypes)compression_type ); + Compression::getCompression()->DecompressLZXRLE( content.data, &content.length, + compr_content.data, compr_content.length); + Compression::getCompression()->SetDecompressionType( SAVE_FILE_PLATFORM_LOCAL ); + + dis.close(); + bais.close(); + + delete [] compr_content.data; + + ByteArrayInputStream bais2( content ); + DataInputStream dis2( &bais2 ); + + // Read StringTable. + byteArray bStringTable; + bStringTable.length = dis2.readInt(); + bStringTable.data = new BYTE[ bStringTable.length ]; + dis2.read(bStringTable); + StringTable *strings = new StringTable(bStringTable.data, bStringTable.length); + + // Read RuleFile. + byteArray bRuleFile; + bRuleFile.length = content.length - bStringTable.length; + bRuleFile.data = new BYTE[ bRuleFile.length ]; + dis2.read(bRuleFile); + + // 4J-JEV: I don't believe that the path-name is ever used. + //DLCGameRulesFile *dlcgr = new DLCGameRulesFile(L"__PLACEHOLDER__"); + //dlcgr->addData(bRuleFile.data,bRuleFile.length); + + if (readRuleFile(lgo, bRuleFile.data, bRuleFile.length, strings)) + { + // Set current gen options and ruleset. + //createdLevelGenerationOptions->setFromSaveGame(true); + lgo->setSrc(LevelGenerationOptions::eSrc_fromSave); + setLevelGenerationOptions( lgo ); + //m_currentGameRuleDefinitions = lgo->getRequiredGameRules(); + } + else + { + delete lgo; + } + + //delete [] content.data; + + // Close and return. + dis2.close(); + bais2.close(); + + return ; +} + +// 4J-JEV: Reverse of loadGameRules. +void GameRuleManager::saveGameRules(byte **dOut, UINT *dSize) +{ + if (m_currentGameRuleDefinitions == NULL && + m_currentLevelGenerationOptions == NULL) + { + app.DebugPrintf("GameRuleManager:: Nothing here to save."); + *dOut = NULL; + *dSize = 0; + return; + } + + app.DebugPrintf("GameRuleManager::saveGameRules:\n"); + + // Initialise output stream. + ByteArrayOutputStream baos; + DataOutputStream dos(&baos); + + // Write header. + + // VERSION NUMBER + dos.writeShort( 0x1 ); // version_number + + // Write 8 bytes of empty space in case we need them later. + // Mainly useful for the ones we save embedded in game saves. + for (UINT i = 0; i < 8; i++) + dos.writeByte(0x0); + + dos.writeByte(APPROPRIATE_COMPRESSION_TYPE); // m_compressionType + + // -- START COMPRESSED -- // + ByteArrayOutputStream compr_baos; + DataOutputStream compr_dos(&compr_baos); + + if (m_currentGameRuleDefinitions == NULL) + { + compr_dos.writeInt( 0 ); // numStrings for StringTable + compr_dos.writeInt( version_number ); + compr_dos.writeByte(Compression::eCompressionType_None); // compression type + for (int i=0; i<2; i++) compr_dos.writeByte(0x0); // Padding. + compr_dos.writeInt( 0 ); // StringLookup.length + compr_dos.writeInt( 0 ); // SchematicFiles.length + compr_dos.writeInt( 0 ); // XmlObjects.length + } + else + { + StringTable *st = m_currentGameRuleDefinitions->getStringTable(); + + if (st == NULL) + { + app.DebugPrintf("GameRuleManager::saveGameRules: StringTable == NULL!"); + } + else + { + // Write string table. + byteArray stba; + m_currentGameRuleDefinitions->getStringTable()->getData(&stba.data, &stba.length); + compr_dos.writeInt( stba.length ); + compr_dos.write( stba ); + + // Write game rule file to second + // buffer and generate string lookup. + writeRuleFile(&compr_dos); + } + } + + // Compress compr_dos and write to dos. + byteArray compr_ba(new BYTE[ compr_baos.buf.length ], compr_baos.buf.length); + Compression::getCompression()->CompressLZXRLE( compr_ba.data, &compr_ba.length, + compr_baos.buf.data, compr_baos.buf.length ); + + app.DebugPrintf("\tcompr_ba.length=%d.\n\tcompr_baos.buf.length=%d.\n", + compr_ba.length, compr_baos.buf.length ); + + dos.writeInt( compr_ba.length ); // Write length + dos.writeInt( compr_baos.buf.length ); + dos.write(compr_ba); + + delete [] compr_ba.data; + + compr_dos.close(); + compr_baos.close(); + // -- END COMPRESSED -- // + + // return + *dSize = baos.buf.length; + *dOut = baos.buf.data; + + baos.buf.data = NULL; + + dos.close(); baos.close(); +} + +// 4J-JEV: Reverse of readRuleFile. +void GameRuleManager::writeRuleFile(DataOutputStream *dos) +{ + // Write Header + dos->writeShort(version_number); // Version number. + dos->writeByte(Compression::eCompressionType_None); // compression type + for (int i=0; i<8; i++) dos->writeBoolean(false); // Padding. + + // Write string lookup. + int numStrings = ConsoleGameRules::eGameRuleType_Count + ConsoleGameRules::eGameRuleAttr_Count; + dos->writeInt(numStrings); + for (int i = 0; i < ConsoleGameRules::eGameRuleType_Count; i++) dos->writeUTF( wchTagNameA[i] ); + for (int i = 0; i < ConsoleGameRules::eGameRuleAttr_Count; i++) dos->writeUTF( wchAttrNameA[i] ); + + // Write schematic files. + unordered_map *files; + files = getLevelGenerationOptions()->getUnfinishedSchematicFiles(); + dos->writeInt( files->size() ); + for (AUTO_VAR(it, files->begin()); it != files->end(); it++) + { + wstring filename = it->first; + ConsoleSchematicFile *file = it->second; + + ByteArrayOutputStream fileBaos; + DataOutputStream fileDos(&fileBaos); + file->save(&fileDos); + + dos->writeUTF(filename); + //dos->writeInt(file->m_data.length); + dos->writeInt(fileBaos.buf.length); + dos->write((byteArray)fileBaos.buf); + + fileDos.close(); fileBaos.close(); + } + + // Write xml objects. + dos->writeInt( 2 ); // numChildren + m_currentLevelGenerationOptions->write(dos); + m_currentGameRuleDefinitions->write(dos); +} + +bool GameRuleManager::readRuleFile(LevelGenerationOptions *lgo, byte *dIn, UINT dSize, StringTable *strings) //(DLCGameRulesFile *dlcFile, StringTable *strings) +{ + bool levelGenAdded = false; + bool gameRulesAdded = false; + LevelGenerationOptions *levelGenerator = lgo;//new LevelGenerationOptions(); + LevelRuleset *gameRules = new LevelRuleset(); + + //DWORD dwLen = 0; + //PBYTE pbData = dlcFile->getData(dwLen); + //byteArray data(pbData,dwLen); + + byteArray data(dIn, dSize); + ByteArrayInputStream bais(data); + DataInputStream dis(&bais); + + // Read File. + + // version_number + __int64 version = dis.readShort(); + unsigned char compressionType = 0; + if(version == 0) + { + for (int i = 0; i < 14; i++) dis.readByte(); // Read padding. + } + else + { + compressionType = dis.readByte(); + + // Read the spare bytes we inserted for future use + for(int i = 0; i < 8; ++i) dis.readBoolean(); + } + + ByteArrayInputStream *contentBais = NULL; + DataInputStream *contentDis = NULL; + + if(compressionType == Compression::eCompressionType_None) + { + // No compression + // No need to read buffer size, as we can read the stream as it is; + app.DebugPrintf("De-compressing game rules with: None\n"); + contentDis = &dis; + } + else + { + unsigned int uncompressedSize = dis.readInt(); + unsigned int compressedSize = dis.readInt(); + byteArray compressedBuffer(compressedSize); + dis.read(compressedBuffer); + + byteArray decompressedBuffer = byteArray(uncompressedSize); + + switch(compressionType) + { + case Compression::eCompressionType_None: + memcpy(decompressedBuffer.data, compressedBuffer.data, uncompressedSize); + break; + + case Compression::eCompressionType_RLE: + app.DebugPrintf("De-compressing game rules with: RLE\n"); + Compression::getCompression()->Decompress( decompressedBuffer.data, &decompressedBuffer.length, compressedBuffer.data, compressedSize); + break; + + default: + app.DebugPrintf("De-compressing game rules."); +#ifndef _CONTENT_PACKAGE + assert( compressionType == APPROPRIATE_COMPRESSION_TYPE ); +#endif + // 4J-JEV: DecompressLZXRLE uses the correct platform specific compression type. (need to assert that the data is compressed with it though). + Compression::getCompression()->DecompressLZXRLE(decompressedBuffer.data, &decompressedBuffer.length, compressedBuffer.data, compressedSize); + break; +/* 4J-JEV: + Each platform has only 1 method of compression, 'compression.h' file deals with it. + + case Compression::eCompressionType_LZXRLE: + app.DebugPrintf("De-compressing game rules with: LZX+RLE\n"); + Compression::getCompression()->DecompressLZXRLE( decompressedBuffer.data, &uncompressedSize, compressedBuffer.data, compressedSize); + break; + default: + app.DebugPrintf("Invalid compression type %d found\n", compressionType); + __debugbreak(); + + delete [] compressedBuffer.data; delete [] decompressedBuffer.data; + dis.close(); bais.reset(); + + if(!gameRulesAdded) delete gameRules; + return false; + */ + }; + + delete [] compressedBuffer.data; + + contentBais = new ByteArrayInputStream(decompressedBuffer); + contentDis = new DataInputStream(contentBais); + } + + // string lookup. + UINT numStrings = contentDis->readInt(); + vector tagsAndAtts; + for (UINT i = 0; i < numStrings; i++) + tagsAndAtts.push_back( contentDis->readUTF() ); + + unordered_map tagIdMap; + for(int type = (int)ConsoleGameRules::eGameRuleType_Root; type < (int)ConsoleGameRules::eGameRuleType_Count; ++type) + { + for(UINT i = 0; i < numStrings; ++i) + { + if(tagsAndAtts[i].compare(wchTagNameA[type]) == 0) + { + tagIdMap.insert( unordered_map::value_type(i, (ConsoleGameRules::EGameRuleType)type) ); + break; + } + } + } + + // 4J-JEV: TODO: As yet unused. + /* + unordered_map attrIdMap; + for(int attr = (int)ConsoleGameRules::eGameRuleAttr_descriptionName; attr < (int)ConsoleGameRules::eGameRuleAttr_Count; ++attr) + { + for (UINT i = 0; i < numStrings; i++) + { + if (tagsAndAtts[i].compare(wchAttrNameA[attr]) == 0) + { + tagIdMap.insert( unordered_map::value_type(i , (ConsoleGameRules::EGameRuleAttr)attr) ); + break; + } + } + }*/ + + // subfile + UINT numFiles = contentDis->readInt(); + for (UINT i = 0; i < numFiles; i++) + { + wstring sFilename = contentDis->readUTF(); + int length = contentDis->readInt(); + byteArray ba( length ); + + contentDis->read(ba); + + levelGenerator->loadSchematicFile(sFilename, ba.data, ba.length); + + } + + LEVEL_GEN_ID lgoID = LEVEL_GEN_ID_NULL; + + // xml objects + UINT numObjects = contentDis->readInt(); + for(UINT i = 0; i < numObjects; ++i) + { + int tagId = contentDis->readInt(); + ConsoleGameRules::EGameRuleType tagVal = ConsoleGameRules::eGameRuleType_Invalid; + AUTO_VAR(it,tagIdMap.find(tagId)); + if(it != tagIdMap.end()) tagVal = it->second; + + GameRuleDefinition *rule = NULL; + + if(tagVal == ConsoleGameRules::eGameRuleType_LevelGenerationOptions) + { + rule = levelGenerator; + levelGenAdded = true; + //m_levelGenerators.addLevelGenerator(L"",levelGenerator); + lgoID = addLevelGenerationOptions(levelGenerator); + levelGenerator->loadStringTable(strings); + } + else if(tagVal == ConsoleGameRules::eGameRuleType_LevelRules) + { + rule = gameRules; + gameRulesAdded = true; + m_levelRules.addLevelRule(L"",gameRules); + levelGenerator->setRequiredGameRules(gameRules); + gameRules->loadStringTable(strings); + } + + readAttributes(contentDis, &tagsAndAtts, rule); + readChildren(contentDis, &tagsAndAtts, &tagIdMap, rule); + } + + if(compressionType != 0) + { + // Not default + contentDis->close(); + if(contentBais != NULL) delete contentBais; + delete contentDis; + } + + dis.close(); + bais.reset(); + + //if(!levelGenAdded) { delete levelGenerator; levelGenerator = NULL; } + if(!gameRulesAdded) delete gameRules; + + return true; + //return levelGenerator; +} + +LevelGenerationOptions *GameRuleManager::readHeader(DLCGameRulesHeader *grh) +{ + LevelGenerationOptions *out = + new LevelGenerationOptions(); + + + out->setSrc(LevelGenerationOptions::eSrc_fromDLC); + out->setGrSource(grh); + addLevelGenerationOptions(out); + + return out; +} + +void GameRuleManager::readAttributes(DataInputStream *dis, vector *tagsAndAtts, GameRuleDefinition *rule) +{ + int numAttrs = dis->readInt(); + for (UINT att = 0; att < numAttrs; ++att) + { + int attID = dis->readInt(); + wstring value = dis->readUTF(); + + if(rule != NULL) rule->addAttribute(tagsAndAtts->at(attID),value); + } +} + +void GameRuleManager::readChildren(DataInputStream *dis, vector *tagsAndAtts, unordered_map *tagIdMap, GameRuleDefinition *rule) +{ + int numChildren = dis->readInt(); + for(UINT child = 0; child < numChildren; ++child) + { + int tagId = dis->readInt(); + ConsoleGameRules::EGameRuleType tagVal = ConsoleGameRules::eGameRuleType_Invalid; + AUTO_VAR(it,tagIdMap->find(tagId)); + if(it != tagIdMap->end()) tagVal = it->second; + + GameRuleDefinition *childRule = NULL; + if(rule != NULL) childRule = rule->addChild(tagVal); + + readAttributes(dis,tagsAndAtts,childRule); + readChildren(dis,tagsAndAtts,tagIdMap,childRule); + } +} + +void GameRuleManager::processSchematics(LevelChunk *levelChunk) +{ + if(getLevelGenerationOptions() != NULL) + { + LevelGenerationOptions *levelGenOptions = getLevelGenerationOptions(); + levelGenOptions->processSchematics(levelChunk); + } +} + +void GameRuleManager::processSchematicsLighting(LevelChunk *levelChunk) +{ + if(getLevelGenerationOptions() != NULL) + { + LevelGenerationOptions *levelGenOptions = getLevelGenerationOptions(); + levelGenOptions->processSchematicsLighting(levelChunk); + } +} + +void GameRuleManager::loadDefaultGameRules() +{ +#ifdef _XBOX +#ifdef _TU_BUILD + wstring fileRoot = L"UPDATE:\\res\\GameRules\\Tutorial.pck"; +#else + wstring fileRoot = L"GAME:\\res\\TitleUpdate\\GameRules\\Tutorial.pck"; +#endif + File packedTutorialFile(fileRoot); + if(loadGameRulesPack(&packedTutorialFile)) + { + m_levelGenerators.getLevelGenerators()->at(0)->setWorldName(app.GetString(IDS_PLAY_TUTORIAL)); + //m_levelGenerators.getLevelGenerators()->at(0)->setDefaultSaveName(L"Tutorial"); + m_levelGenerators.getLevelGenerators()->at(0)->setDefaultSaveName(app.GetString(IDS_TUTORIALSAVENAME)); + } + +#ifndef _CONTENT_PACKAGE + // 4J Stu - Remove these just now + //File testRulesPath(L"GAME:\\GameRules"); + //vector *packFiles = testRulesPath.listFiles(); + + //for(AUTO_VAR(it,packFiles->begin()); it != packFiles->end(); ++it) + //{ + // loadGameRulesPack(*it); + //} + //delete packFiles; +#endif + +#else // _XBOX + +#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) + { + DLCPack *pack = new DLCPack(L"",0xffffffff); + DWORD dwFilesProcessed = 0; + if ( app.m_dlcManager.readDLCDataFile(dwFilesProcessed,fpTutorial,pack,true) ) + { + app.m_dlcManager.addPack(pack); + //m_levelGenerators.getLevelGenerators()->at(0)->setWorldName(app.GetString(IDS_PLAY_TUTORIAL)); + //m_levelGenerators.getLevelGenerators()->at(0)->setDefaultSaveName(app.GetString(IDS_TUTORIALSAVENAME)); + } + else delete pack; + } +#endif +#endif +} + +bool GameRuleManager::loadGameRulesPack(File *path) +{ + bool success = false; + if(path->exists()) + { + DLCPack *pack = new DLCPack(L"",0xffffffff); + DWORD dwFilesProcessed = 0; + if( app.m_dlcManager.readDLCDataFile(dwFilesProcessed, path->getPath(),pack)) + { + app.m_dlcManager.addPack(pack); + success = true; + } + else + { + delete pack; + } + } + return success; +} + +void GameRuleManager::setLevelGenerationOptions(LevelGenerationOptions *levelGen) +{ + unloadCurrentGameRules(); + + m_currentGameRuleDefinitions = NULL; + m_currentLevelGenerationOptions = levelGen; + + if(m_currentLevelGenerationOptions != NULL && m_currentLevelGenerationOptions->requiresGameRules() ) + { + m_currentGameRuleDefinitions = m_currentLevelGenerationOptions->getRequiredGameRules(); + } + + if(m_currentLevelGenerationOptions != NULL) + m_currentLevelGenerationOptions->reset_start(); +} + +LPCWSTR GameRuleManager::GetGameRulesString(const wstring &key) +{ + if(m_currentGameRuleDefinitions != NULL && !key.empty() ) + { + return m_currentGameRuleDefinitions->getString(key); + } + else + { + return L""; + } +} + +LEVEL_GEN_ID GameRuleManager::addLevelGenerationOptions(LevelGenerationOptions *lgo) +{ + vector *lgs = m_levelGenerators.getLevelGenerators(); + + for (int i = 0; isize(); i++) + if (lgs->at(i) == lgo) + return i; + + lgs->push_back(lgo); + return lgs->size() - 1; +} + +void GameRuleManager::unloadCurrentGameRules() +{ + if (m_currentLevelGenerationOptions != NULL) + { + if (m_currentGameRuleDefinitions != NULL + && m_currentLevelGenerationOptions->isFromSave()) + m_levelRules.removeLevelRule( m_currentGameRuleDefinitions ); + + if (m_currentLevelGenerationOptions->isFromSave()) + { + m_levelGenerators.removeLevelGenerator( m_currentLevelGenerationOptions ); + + delete m_currentLevelGenerationOptions; + } + else if (m_currentLevelGenerationOptions->isFromDLC()) + { + m_currentLevelGenerationOptions->reset_finish(); + } + } + + m_currentGameRuleDefinitions = NULL; + m_currentLevelGenerationOptions = NULL; +} diff --git a/Minecraft.Client/Common/GameRules/GameRuleManager.h b/Minecraft.Client/Common/GameRules/GameRuleManager.h new file mode 100644 index 00000000..e9e983b8 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/GameRuleManager.h @@ -0,0 +1,80 @@ +#pragma once +using namespace std; + +#include "LevelGenerators.h" +#include "LevelRules.h" +class LevelGenerationOptions; +class RootGameRulesDefinition; +class LevelChunk; +class DLCPack; +class DLCGameRulesFile; +class DLCGameRulesHeader; +class StringTable; +class GameRuleDefinition; +class DataInputStream; +class DataOutputStream; +class WstringLookup; + +#define GAME_RULE_SAVENAME L"requiredGameRules.grf" + +// 4J-JEV: +#define LEVEL_GEN_ID int +#define LEVEL_GEN_ID_NULL 0 + +class GameRuleManager +{ +public: + static WCHAR *wchTagNameA[ConsoleGameRules::eGameRuleType_Count]; + static WCHAR *wchAttrNameA[ConsoleGameRules::eGameRuleAttr_Count]; + + static const short version_number = 2; + +private: + LevelGenerationOptions *m_currentLevelGenerationOptions; + LevelRuleset *m_currentGameRuleDefinitions; + LevelGenerators m_levelGenerators; + LevelRules m_levelRules; + +public: + GameRuleManager(); + + void loadGameRules(DLCPack *); + + LevelGenerationOptions *loadGameRules(byte *dIn, UINT dSize); + void loadGameRules(LevelGenerationOptions *lgo, byte *dIn, UINT dSize); + + void saveGameRules(byte **dOut, UINT *dSize); + +private: + LevelGenerationOptions *readHeader(DLCGameRulesHeader *grh); + + void writeRuleFile(DataOutputStream *dos); + +public: + bool readRuleFile(LevelGenerationOptions *lgo, byte *dIn, UINT dSize, StringTable *strings); //(DLCGameRulesFile *dlcFile, StringTable *strings); + +private: + void readAttributes(DataInputStream *dis, vector *tagsAndAtts, GameRuleDefinition *rule); + void readChildren(DataInputStream *dis, vector *tagsAndAtts, unordered_map *tagIdMap, GameRuleDefinition *rule); + +public: + void processSchematics(LevelChunk *levelChunk); + void processSchematicsLighting(LevelChunk *levelChunk); + void loadDefaultGameRules(); + +private: + bool loadGameRulesPack(File *path); + + LEVEL_GEN_ID addLevelGenerationOptions(LevelGenerationOptions *); + +public: + vector *getLevelGenerators() { return m_levelGenerators.getLevelGenerators(); } + void setLevelGenerationOptions(LevelGenerationOptions *levelGen); + LevelRuleset *getGameRuleDefinitions() { return m_currentGameRuleDefinitions; } + LevelGenerationOptions *getLevelGenerationOptions() { return m_currentLevelGenerationOptions; } + LPCWSTR GetGameRulesString(const wstring &key); + + // 4J-JEV: + // Properly cleans-up and unloads the current set of gameRules. + void unloadCurrentGameRules(); +}; diff --git a/Minecraft.Client/Common/GameRules/GameRulesInstance.h b/Minecraft.Client/Common/GameRules/GameRulesInstance.h new file mode 100644 index 00000000..064e086d --- /dev/null +++ b/Minecraft.Client/Common/GameRules/GameRulesInstance.h @@ -0,0 +1,24 @@ +#pragma once +using namespace std; +#include +#include "GameRule.h" + +class GameRuleDefinition; + +// The game rule manager belongs to a player/server or other object, and maintains their current state for each of +// the rules that apply to them +class GameRulesInstance : public GameRule +{ +public: + // These types are used by the GameRuleDefinition to know which rules to add to this GameRulesInstance + enum EGameRulesInstanceType + { + eGameRulesInstanceType_ServerPlayer, + eGameRulesInstanceType_Server, + eGameRulesInstanceType_Count + }; + +public: + GameRulesInstance(GameRuleDefinition *definition, Connection *connection) : GameRule(definition,connection) {} + // Functions for all the hooks should go here +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/LevelGenerationOptions.cpp b/Minecraft.Client/Common/GameRules/LevelGenerationOptions.cpp new file mode 100644 index 00000000..9ebd3428 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/LevelGenerationOptions.cpp @@ -0,0 +1,715 @@ +#include "stdafx.h" + +#include + +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\..\Minecraft.World\Pos.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.phys.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.chunk.h" +#include "Common\DLC\DLCGameRulesHeader.h" +#include "..\..\StringTable.h" +#include "LevelGenerationOptions.h" +#include "ConsoleGameRules.h" + +JustGrSource::JustGrSource() +{ + m_displayName = L"Default_DisplayName"; + m_worldName= L"Default_WorldName"; + m_defaultSaveName = L"Default_DefaultSaveName"; + m_bRequiresTexturePack = false; + m_requiredTexturePackId = 0; + m_grfPath = L"__NO_GRF_PATH__"; + m_bRequiresBaseSave = false; +} + +bool JustGrSource::requiresTexturePack() {return m_bRequiresTexturePack;} +UINT JustGrSource::getRequiredTexturePackId() {return m_requiredTexturePackId;} +wstring JustGrSource::getDefaultSaveName() {return m_defaultSaveName;} +LPCWSTR JustGrSource::getWorldName() {return m_worldName.c_str();} +LPCWSTR JustGrSource::getDisplayName() {return m_displayName.c_str();} +wstring JustGrSource::getGrfPath() {return m_grfPath;} +bool JustGrSource::requiresBaseSave() { return m_bRequiresBaseSave; }; +wstring JustGrSource::getBaseSavePath() { return m_baseSavePath; }; + +void JustGrSource::setRequiresTexturePack(bool x) {m_bRequiresTexturePack = x;} +void JustGrSource::setRequiredTexturePackId(UINT x) {m_requiredTexturePackId = x;} +void JustGrSource::setDefaultSaveName(const wstring &x) {m_defaultSaveName = x;} +void JustGrSource::setWorldName(const wstring &x) {m_worldName = x;} +void JustGrSource::setDisplayName(const wstring &x) {m_displayName = x;} +void JustGrSource::setGrfPath(const wstring &x) {m_grfPath = x;} +void JustGrSource::setBaseSavePath(const wstring &x) { m_baseSavePath = x; m_bRequiresBaseSave = true; } + +bool JustGrSource::ready() { return true; } + +LevelGenerationOptions::LevelGenerationOptions(DLCPack *parentPack) +{ + m_spawnPos = NULL; + m_stringTable = NULL; + + m_hasLoadedData = false; + + m_seed = 0; + m_bHasBeenInCreative = true; + m_useFlatWorld = false; + m_bHaveMinY = false; + m_minY = INT_MAX; + m_bRequiresGameRules = false; + + m_pbBaseSaveData = NULL; + m_dwBaseSaveSize = 0; + + m_parentDLCPack = parentPack; + m_bLoadingData = false; +} + +LevelGenerationOptions::~LevelGenerationOptions() +{ + clearSchematics(); + if(m_spawnPos != NULL) delete m_spawnPos; + for(AUTO_VAR(it, m_schematicRules.begin()); it != m_schematicRules.end(); ++it) + { + delete *it; + } + for(AUTO_VAR(it, m_structureRules.begin()); it != m_structureRules.end(); ++it) + { + delete *it; + } + + for(AUTO_VAR(it, m_biomeOverrides.begin()); it != m_biomeOverrides.end(); ++it) + { + delete *it; + } + + for(AUTO_VAR(it, m_features.begin()); it != m_features.end(); ++it) + { + delete *it; + } + + if (m_stringTable) + if (!isTutorial()) + delete m_stringTable; + + if (isFromSave()) delete m_pSrc; +} + +ConsoleGameRules::EGameRuleType LevelGenerationOptions::getActionType() { return ConsoleGameRules::eGameRuleType_LevelGenerationOptions; } + +void LevelGenerationOptions::writeAttributes(DataOutputStream *dos, UINT numAttrs) +{ + GameRuleDefinition::writeAttributes(dos, numAttrs + 5); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_spawnX); + dos->writeUTF(_toString(m_spawnPos->x)); + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_spawnY); + dos->writeUTF(_toString(m_spawnPos->y)); + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_spawnZ); + dos->writeUTF(_toString(m_spawnPos->z)); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_seed); + dos->writeUTF(_toString(m_seed)); + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_flatworld); + dos->writeUTF(_toString(m_useFlatWorld)); +} + +void LevelGenerationOptions::getChildren(vector *children) +{ + GameRuleDefinition::getChildren(children); + + vector used_schematics; + for (AUTO_VAR(it, m_schematicRules.begin()); it != m_schematicRules.end(); it++) + if ( !(*it)->isComplete() ) + used_schematics.push_back( *it ); + + for(AUTO_VAR(it, m_structureRules.begin()); it!=m_structureRules.end(); it++) + children->push_back( *it ); + for(AUTO_VAR(it, used_schematics.begin()); it!=used_schematics.end(); it++) + children->push_back( *it ); + for(AUTO_VAR(it, m_biomeOverrides.begin()); it != m_biomeOverrides.end(); ++it) + children->push_back( *it ); + for(AUTO_VAR(it, m_features.begin()); it != m_features.end(); ++it) + children->push_back( *it ); +} + +GameRuleDefinition *LevelGenerationOptions::addChild(ConsoleGameRules::EGameRuleType ruleType) +{ + GameRuleDefinition *rule = NULL; + if(ruleType == ConsoleGameRules::eGameRuleType_ApplySchematic) + { + rule = new ApplySchematicRuleDefinition(this); + m_schematicRules.push_back((ApplySchematicRuleDefinition *)rule); + } + else if(ruleType == ConsoleGameRules::eGameRuleType_GenerateStructure) + { + rule = new ConsoleGenerateStructure(); + m_structureRules.push_back((ConsoleGenerateStructure *)rule); + } + else if(ruleType == ConsoleGameRules::eGameRuleType_BiomeOverride) + { + rule = new BiomeOverride(); + m_biomeOverrides.push_back((BiomeOverride *)rule); + } + else if(ruleType == ConsoleGameRules::eGameRuleType_StartFeature) + { + rule = new StartFeature(); + m_features.push_back((StartFeature *)rule); + } + else + { +#ifndef _CONTENT_PACKAGE + wprintf(L"LevelGenerationOptions: Attempted to add invalid child rule - %d\n", ruleType ); +#endif + } + return rule; +} + +void LevelGenerationOptions::addAttribute(const wstring &attributeName, const wstring &attributeValue) +{ + if(attributeName.compare(L"seed") == 0) + { + m_seed = _fromString<__int64>(attributeValue); + app.DebugPrintf("LevelGenerationOptions: Adding parameter m_seed=%I64d\n",m_seed); + } + else if(attributeName.compare(L"spawnX") == 0) + { + if(m_spawnPos == NULL) m_spawnPos = new Pos(); + int value = _fromString(attributeValue); + m_spawnPos->x = value; + app.DebugPrintf("LevelGenerationOptions: Adding parameter spawnX=%d\n",value); + } + else if(attributeName.compare(L"spawnY") == 0) + { + if(m_spawnPos == NULL) m_spawnPos = new Pos(); + int value = _fromString(attributeValue); + m_spawnPos->y = value; + app.DebugPrintf("LevelGenerationOptions: Adding parameter spawnY=%d\n",value); + } + else if(attributeName.compare(L"spawnZ") == 0) + { + if(m_spawnPos == NULL) m_spawnPos = new Pos(); + int value = _fromString(attributeValue); + m_spawnPos->z = value; + app.DebugPrintf("LevelGenerationOptions: Adding parameter spawnZ=%d\n",value); + } + else if(attributeName.compare(L"flatworld") == 0) + { + if(attributeValue.compare(L"true") == 0) m_useFlatWorld = true; + app.DebugPrintf("LevelGenerationOptions: Adding parameter flatworld=%s\n",m_useFlatWorld?"TRUE":"FALSE"); + } + else if(attributeName.compare(L"saveName") == 0) + { + wstring string(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(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(attributeValue); + if(!string.empty()) setDisplayName( string ); + else setDisplayName( attributeValue ); + app.DebugPrintf("LevelGenerationOptions: Adding parameter displayName=%ls\n", getDisplayName()); + } + else if(attributeName.compare(L"texturePackId") == 0) + { + setRequiredTexturePackId( _fromString(attributeValue) ); + setRequiresTexturePack( true ); + app.DebugPrintf("LevelGenerationOptions: Adding parameter texturePackId=%0x\n", getRequiredTexturePackId()); + } + else if(attributeName.compare(L"isTutorial") == 0) + { + if(attributeValue.compare(L"true") == 0) setSrc(eSrc_tutorial); + app.DebugPrintf("LevelGenerationOptions: Adding parameter isTutorial=%s\n",isTutorial()?"TRUE":"FALSE"); + } + else if(attributeName.compare(L"baseSaveName") == 0) + { + setBaseSavePath( attributeValue ); + app.DebugPrintf("LevelGenerationOptions: Adding parameter baseSaveName=%ls\n", getBaseSavePath().c_str()); + } + else 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); + } +} + +void LevelGenerationOptions::processSchematics(LevelChunk *chunk) +{ + PIXBeginNamedEvent(0,"Processing schematics for chunk (%d,%d)", chunk->x, chunk->z); + AABB *chunkBox = AABB::newTemp(chunk->x*16,0,chunk->z*16,chunk->x*16 + 16,Level::maxBuildHeight,chunk->z*16 + 16); + for( AUTO_VAR(it, m_schematicRules.begin()); it != m_schematicRules.end();++it) + { + ApplySchematicRuleDefinition *rule = *it; + rule->processSchematic(chunkBox, chunk); + } + + int cx = (chunk->x << 4); + int cz = (chunk->z << 4); + + for( AUTO_VAR(it, m_structureRules.begin()); it != m_structureRules.end(); it++ ) + { + ConsoleGenerateStructure *structureStart = *it; + + if (structureStart->getBoundingBox()->intersects(cx, cz, cx + 15, cz + 15)) + { + BoundingBox *bb = new BoundingBox(cx, cz, cx + 15, cz + 15); + structureStart->postProcess(chunk->level, NULL, bb); + delete bb; + } + } + PIXEndNamedEvent(); +} + +void LevelGenerationOptions::processSchematicsLighting(LevelChunk *chunk) +{ + PIXBeginNamedEvent(0,"Processing schematics (lighting) for chunk (%d,%d)", chunk->x, chunk->z); + AABB *chunkBox = AABB::newTemp(chunk->x*16,0,chunk->z*16,chunk->x*16 + 16,Level::maxBuildHeight,chunk->z*16 + 16); + for( AUTO_VAR(it, m_schematicRules.begin()); it != m_schematicRules.end();++it) + { + ApplySchematicRuleDefinition *rule = *it; + rule->processSchematicLighting(chunkBox, chunk); + } + PIXEndNamedEvent(); +} + +bool LevelGenerationOptions::checkIntersects(int x0, int y0, int z0, int x1, int y1, int z1) +{ + PIXBeginNamedEvent(0,"Check Intersects"); + + // As an optimisation, we can quickly discard things below a certain y which makes most ore checks faster due to + // a) ores generally being below ground/sea level and b) tutorial world additions generally being above ground/sea level + if(!m_bHaveMinY) + { + for(AUTO_VAR(it, m_schematicRules.begin()); it != m_schematicRules.end();++it) + { + ApplySchematicRuleDefinition *rule = *it; + int minY = rule->getMinY(); + if(minY < m_minY) m_minY = minY; + } + + for( AUTO_VAR(it, m_structureRules.begin()); it != m_structureRules.end(); it++ ) + { + ConsoleGenerateStructure *structureStart = *it; + int minY = structureStart->getMinY(); + if(minY < m_minY) m_minY = minY; + } + + m_bHaveMinY = true; + } + + // 4J Stu - We DO NOT intersect if our upper bound is below the lower bound for all schematics + if( y1 < m_minY ) return false; + + bool intersects = false; + for(AUTO_VAR(it, m_schematicRules.begin()); it != m_schematicRules.end();++it) + { + ApplySchematicRuleDefinition *rule = *it; + intersects = rule->checkIntersects(x0,y0,z0,x1,y1,z1); + if(intersects) break; + } + + if(!intersects) + { + for( AUTO_VAR(it, m_structureRules.begin()); it != m_structureRules.end(); it++ ) + { + ConsoleGenerateStructure *structureStart = *it; + intersects = structureStart->checkIntersects(x0,y0,z0,x1,y1,z1); + if(intersects) break; + } + } + PIXEndNamedEvent(); + return intersects; +} + +void LevelGenerationOptions::clearSchematics() +{ + for(AUTO_VAR(it, m_schematics.begin()); it != m_schematics.end(); ++it) + { + delete it->second; + } + m_schematics.clear(); +} + +ConsoleSchematicFile *LevelGenerationOptions::loadSchematicFile(const wstring &filename, PBYTE pbData, DWORD dwLen) +{ + // If we have already loaded this, just return + AUTO_VAR(it, m_schematics.find(filename)); + if(it != m_schematics.end()) + { +#ifndef _CONTENT_PACKAGE + wprintf(L"We have already loaded schematic file %ls\n", filename.c_str() ); +#endif + it->second->incrementRefCount(); + return it->second; + } + + ConsoleSchematicFile *schematic = NULL; + byteArray data(pbData,dwLen); + ByteArrayInputStream bais(data); + DataInputStream dis(&bais); + schematic = new ConsoleSchematicFile(); + schematic->load(&dis); + m_schematics[filename] = schematic; + bais.reset(); + return schematic; +} + +ConsoleSchematicFile *LevelGenerationOptions::getSchematicFile(const wstring &filename) +{ + ConsoleSchematicFile *schematic = NULL; + // If we have already loaded this, just return + AUTO_VAR(it, m_schematics.find(filename)); + if(it != m_schematics.end()) + { + schematic = it->second; + } + return schematic; +} + +void LevelGenerationOptions::releaseSchematicFile(const wstring &filename) +{ + // 4J Stu - We don't want to delete them when done, but probably want to keep a set of active schematics for the current world + //AUTO_VAR(it, m_schematics.find(filename)); + //if(it != m_schematics.end()) + //{ + // ConsoleSchematicFile *schematic = it->second; + // schematic->decrementRefCount(); + // if(schematic->shouldDelete()) + // { + // delete schematic; + // m_schematics.erase(it); + // } + //} +} + +void LevelGenerationOptions::loadStringTable(StringTable *table) +{ + m_stringTable = table; +} + +LPCWSTR LevelGenerationOptions::getString(const wstring &key) +{ + if(m_stringTable == NULL) + { + return L""; + } + else + { + return m_stringTable->getString(key); + } +} + +void LevelGenerationOptions::getBiomeOverride(int biomeId, BYTE &tile, BYTE &topTile) +{ + for(AUTO_VAR(it, m_biomeOverrides.begin()); it != m_biomeOverrides.end(); ++it) + { + BiomeOverride *bo = *it; + if(bo->isBiome(biomeId)) + { + bo->getTileValues(tile,topTile); + break; + } + } +} + +bool LevelGenerationOptions::isFeatureChunk(int chunkX, int chunkZ, StructureFeature::EFeatureTypes feature, 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, orientation)) + { + isFeature = true; + break; + } + } + return isFeature; +} + +unordered_map *LevelGenerationOptions::getUnfinishedSchematicFiles() +{ + // Clean schematic rules. + unordered_set usedFiles = unordered_set(); + for (AUTO_VAR(it, m_schematicRules.begin()); it!=m_schematicRules.end(); it++) + if ( !(*it)->isComplete() ) + usedFiles.insert( (*it)->getSchematicName() ); + + // Clean schematic files. + unordered_map *out + = new unordered_map(); + for (AUTO_VAR(it, usedFiles.begin()); it!=usedFiles.end(); it++) + out->insert( pair(*it, getSchematicFile(*it)) ); + + return out; +} + +void LevelGenerationOptions::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)->reset(); + } +} + +void LevelGenerationOptions::reset_finish() +{ + //if (m_spawnPos) { delete m_spawnPos; m_spawnPos = NULL; } + //if (m_stringTable) { delete m_stringTable; m_stringTable = NULL; } + + if (isFromDLC()) + { + m_hasLoadedData = false; + } +} + + +GrSource *LevelGenerationOptions::info() { return m_pSrc; } +void LevelGenerationOptions::setSrc(eSrc src) { m_src = src; } +LevelGenerationOptions::eSrc LevelGenerationOptions::getSrc() { return m_src; } + +bool LevelGenerationOptions::isTutorial() { return getSrc() == eSrc_tutorial; } +bool LevelGenerationOptions::isFromSave() { return getSrc() == eSrc_fromSave; } +bool LevelGenerationOptions::isFromDLC() { return getSrc() == eSrc_fromDLC; } + +bool LevelGenerationOptions::requiresTexturePack() { return info()->requiresTexturePack(); } +UINT LevelGenerationOptions::getRequiredTexturePackId() { return info()->getRequiredTexturePackId(); } + +wstring LevelGenerationOptions::getDefaultSaveName() +{ + 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(); } + +void LevelGenerationOptions::setGrSource(GrSource *grs) { m_pSrc = grs; } + +void LevelGenerationOptions::setRequiresTexturePack(bool x) { info()->setRequiresTexturePack(x); } +void LevelGenerationOptions::setRequiredTexturePackId(UINT x) { info()->setRequiredTexturePackId(x); } +void LevelGenerationOptions::setDefaultSaveName(const wstring &x) { info()->setDefaultSaveName(x); } +void LevelGenerationOptions::setWorldName(const wstring &x) { info()->setWorldName(x); } +void LevelGenerationOptions::setDisplayName(const wstring &x) { info()->setDisplayName(x); } +void LevelGenerationOptions::setGrfPath(const wstring &x) { info()->setGrfPath(x); } +void LevelGenerationOptions::setBaseSavePath(const wstring &x) { info()->setBaseSavePath(x); } + +bool LevelGenerationOptions::ready() { return info()->ready(); } + +void LevelGenerationOptions::setBaseSaveData(PBYTE pbData, DWORD dwSize) { m_pbBaseSaveData = pbData; m_dwBaseSaveSize = dwSize; } +PBYTE LevelGenerationOptions::getBaseSaveData(DWORD &size) { size = m_dwBaseSaveSize; return m_pbBaseSaveData; } +bool LevelGenerationOptions::hasBaseSaveData() { return m_dwBaseSaveSize > 0 && m_pbBaseSaveData != NULL; } +void LevelGenerationOptions::deleteBaseSaveData() { if(m_pbBaseSaveData) delete m_pbBaseSaveData; m_pbBaseSaveData = NULL; m_dwBaseSaveSize = 0; } + +bool LevelGenerationOptions::hasLoadedData() { return m_hasLoadedData; } +void LevelGenerationOptions::setLoadedData() { m_hasLoadedData = true; } + +__int64 LevelGenerationOptions::getLevelSeed() { return m_seed; } +int LevelGenerationOptions::getLevelHasBeenInCreative() { return m_bHasBeenInCreative; } +Pos *LevelGenerationOptions::getSpawnPos() { return m_spawnPos; } +bool LevelGenerationOptions::getuseFlatWorld() { return m_useFlatWorld; } + +bool LevelGenerationOptions::requiresGameRules() { return m_bRequiresGameRules; } +void LevelGenerationOptions::setRequiredGameRules(LevelRuleset *rules) { m_requiredGameRules = rules; m_bRequiresGameRules = true; } +LevelRuleset *LevelGenerationOptions::getRequiredGameRules() { return m_requiredGameRules; } \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/LevelGenerationOptions.h b/Minecraft.Client/Common/GameRules/LevelGenerationOptions.h new file mode 100644 index 00000000..aa128ff8 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/LevelGenerationOptions.h @@ -0,0 +1,224 @@ +#pragma once +using namespace std; + +#pragma message("LevelGenerationOptions.h ") + +#include "GameRuleDefinition.h" +#include "..\..\..\Minecraft.World\StructureFeature.h" + +class ApplySchematicRuleDefinition; +class LevelChunk; +class ConsoleGenerateStructure; +class ConsoleSchematicFile; +class LevelRuleset; +class BiomeOverride; +class StartFeature; + +class GrSource +{ +public: + // 4J-JEV: + // Moved all this here; I didn't like that all this header information + // was being mixed in with all the game information as they have + // completely different lifespans. + + virtual bool requiresTexturePack()=0; + virtual UINT getRequiredTexturePackId()=0; + virtual wstring getDefaultSaveName()=0; + virtual LPCWSTR getWorldName()=0; + virtual LPCWSTR getDisplayName()=0; + virtual wstring getGrfPath()=0; + virtual bool requiresBaseSave() = 0; + virtual wstring getBaseSavePath() = 0; + + virtual void setRequiresTexturePack(bool)=0; + virtual void setRequiredTexturePackId(UINT)=0; + virtual void setDefaultSaveName(const wstring &)=0; + virtual void setWorldName(const wstring &)=0; + virtual void setDisplayName(const wstring &)=0; + virtual void setGrfPath(const wstring &)=0; + virtual void setBaseSavePath(const wstring &)=0; + + virtual bool ready()=0; + + //virtual void getGrfData(PBYTE &pData, DWORD &pSize)=0; +}; + +class JustGrSource : public GrSource +{ +protected: + wstring m_worldName; + wstring m_displayName; + wstring m_defaultSaveName; + bool m_bRequiresTexturePack; + int m_requiredTexturePackId; + wstring m_grfPath; + wstring m_baseSavePath; + bool m_bRequiresBaseSave; + +public: + virtual bool requiresTexturePack(); + virtual UINT getRequiredTexturePackId(); + virtual wstring getDefaultSaveName(); + virtual LPCWSTR getWorldName(); + virtual LPCWSTR getDisplayName(); + virtual wstring getGrfPath(); + virtual bool requiresBaseSave(); + virtual wstring getBaseSavePath(); + + virtual void setRequiresTexturePack(bool x); + virtual void setRequiredTexturePackId(UINT x); + virtual void setDefaultSaveName(const wstring &x); + virtual void setWorldName(const wstring &x); + virtual void setDisplayName(const wstring &x); + virtual void setGrfPath(const wstring &x); + virtual void setBaseSavePath(const wstring &x); + + virtual bool ready(); + + JustGrSource(); +}; + +class LevelGenerationOptions : public GameRuleDefinition +{ +public: + enum eSrc + { + eSrc_none, + + eSrc_fromSave, // Neither content or header is persistent. + + eSrc_fromDLC, // Header is persistent, content should be deleted to conserve space. + + eSrc_tutorial, // Both header and content is persistent, content cannot be reloaded. + + eSrc_MAX + }; + +private: + eSrc m_src; + + GrSource *m_pSrc; + GrSource *info(); + + bool m_hasLoadedData; + + PBYTE m_pbBaseSaveData; + DWORD m_dwBaseSaveSize; + +public: + + void setSrc(eSrc src); + eSrc getSrc(); + + bool isTutorial(); + bool isFromSave(); + bool isFromDLC(); + + bool requiresTexturePack(); + UINT getRequiredTexturePackId(); + wstring getDefaultSaveName(); + LPCWSTR getWorldName(); + LPCWSTR getDisplayName(); + wstring getGrfPath(); + bool requiresBaseSave(); + wstring getBaseSavePath(); + + void setGrSource(GrSource *grs); + + void setRequiresTexturePack(bool x); + void setRequiredTexturePackId(UINT x); + void setDefaultSaveName(const wstring &x); + void setWorldName(const wstring &x); + void setDisplayName(const wstring &x); + void setGrfPath(const wstring &x); + void setBaseSavePath(const wstring &x); + + bool ready(); + + void setBaseSaveData(PBYTE pbData, DWORD dwSize); + PBYTE getBaseSaveData(DWORD &size); + bool hasBaseSaveData(); + void deleteBaseSaveData(); + + bool hasLoadedData(); + void setLoadedData(); + +private: + // This should match the "MapOptionsRule" definition in the XML schema + __int64 m_seed; + bool m_useFlatWorld; + Pos *m_spawnPos; + int m_bHasBeenInCreative; + vector m_schematicRules; + vector m_structureRules; + bool m_bHaveMinY; + int m_minY; + unordered_map m_schematics; + vector m_biomeOverrides; + vector m_features; + + bool m_bRequiresGameRules; + LevelRuleset *m_requiredGameRules; + + StringTable *m_stringTable; + + DLCPack *m_parentDLCPack; + bool m_bLoadingData; + +public: + LevelGenerationOptions(DLCPack *parentPack = NULL); + ~LevelGenerationOptions(); + + virtual ConsoleGameRules::EGameRuleType getActionType(); + + virtual void writeAttributes(DataOutputStream *dos, UINT numAttributes); + virtual void getChildren(vector *children); + virtual GameRuleDefinition *addChild(ConsoleGameRules::EGameRuleType ruleType); + virtual void addAttribute(const wstring &attributeName, const wstring &attributeValue); + + __int64 getLevelSeed(); + int getLevelHasBeenInCreative(); + Pos *getSpawnPos(); + bool getuseFlatWorld(); + + void processSchematics(LevelChunk *chunk); + void processSchematicsLighting(LevelChunk *chunk); + + bool checkIntersects(int x0, int y0, int z0, int x1, int y1, int z1); + +private: + void clearSchematics(); + +public: + ConsoleSchematicFile *loadSchematicFile(const wstring &filename, PBYTE pbData, DWORD dwLen); + +public: + ConsoleSchematicFile *getSchematicFile(const wstring &filename); + void releaseSchematicFile(const wstring &filename); + + bool requiresGameRules(); + void setRequiredGameRules(LevelRuleset *rules); + LevelRuleset *getRequiredGameRules(); + + void getBiomeOverride(int biomeId, BYTE &tile, BYTE &topTile); + bool isFeatureChunk(int chunkX, int chunkZ, StructureFeature::EFeatureTypes feature, 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 + // which needs to be reset BEFORE a new game starts. + void reset_start(); + + // 4J-JEV: + // This file contains state that needs to be deleted + // or reset once a game has finished. + void reset_finish(); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/LevelGenerators.cpp b/Minecraft.Client/Common/GameRules/LevelGenerators.cpp new file mode 100644 index 00000000..653a26d0 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/LevelGenerators.cpp @@ -0,0 +1,26 @@ +#include "stdafx.h" +#include "LevelGenerationOptions.h" +#include "LevelGenerators.h" + + +LevelGenerators::LevelGenerators() +{ +} + +void LevelGenerators::addLevelGenerator(const wstring &displayName, LevelGenerationOptions *generator) +{ + if(!displayName.empty()) generator->setDisplayName(displayName); + m_levelGenerators.push_back(generator); +} + +void LevelGenerators::removeLevelGenerator(LevelGenerationOptions *generator) +{ + vector::iterator it; + while ( (it = find( m_levelGenerators.begin(), + m_levelGenerators.end(), + generator ) ) + != m_levelGenerators.end() ) + { + m_levelGenerators.erase(it); + } +} \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/LevelGenerators.h b/Minecraft.Client/Common/GameRules/LevelGenerators.h new file mode 100644 index 00000000..824b8387 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/LevelGenerators.h @@ -0,0 +1,19 @@ +#pragma once + +using namespace std; + +class LevelGenerationOptions; + +class LevelGenerators +{ +private: + vector m_levelGenerators; + +public: + LevelGenerators(); + + void addLevelGenerator(const wstring &displayName, LevelGenerationOptions *generator); + void removeLevelGenerator(LevelGenerationOptions *generator); + + vector *getLevelGenerators() { return &m_levelGenerators; } +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/LevelRules.cpp b/Minecraft.Client/Common/GameRules/LevelRules.cpp new file mode 100644 index 00000000..b7c8a8a5 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/LevelRules.cpp @@ -0,0 +1,20 @@ +#include "stdafx.h" +#include "LevelRules.h" + + +LevelRules::LevelRules() +{ +} + +void LevelRules::addLevelRule(const wstring &displayName, PBYTE pbData, DWORD dwLen) +{ +} + +void LevelRules::addLevelRule(const wstring &displayName, LevelRuleset *rootRule) +{ +} + +void LevelRules::removeLevelRule(LevelRuleset *removing) +{ + // TODO ? +} \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/LevelRules.h b/Minecraft.Client/Common/GameRules/LevelRules.h new file mode 100644 index 00000000..a94a2123 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/LevelRules.h @@ -0,0 +1,14 @@ +#pragma once + +class LevelRuleset; + +class LevelRules +{ +public: + LevelRules(); + + void addLevelRule(const wstring &displayName, PBYTE pbData, DWORD dwLen); + void addLevelRule(const wstring &displayName, LevelRuleset *rootRule); + + void removeLevelRule(LevelRuleset *removing); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/LevelRuleset.cpp b/Minecraft.Client/Common/GameRules/LevelRuleset.cpp new file mode 100644 index 00000000..1c7ecd47 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/LevelRuleset.cpp @@ -0,0 +1,71 @@ +#include "stdafx.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\StringTable.h" +#include "ConsoleGameRules.h" +#include "LevelRuleset.h" + +LevelRuleset::LevelRuleset() +{ + m_stringTable = NULL; +} + +LevelRuleset::~LevelRuleset() +{ + for(AUTO_VAR(it, m_areas.begin()); it != m_areas.end(); ++it) + { + delete *it; + } +} + +void LevelRuleset::getChildren(vector *children) +{ + CompoundGameRuleDefinition::getChildren(children); + for (AUTO_VAR(it, m_areas.begin()); it != m_areas.end(); it++) + children->push_back(*it); +} + +GameRuleDefinition *LevelRuleset::addChild(ConsoleGameRules::EGameRuleType ruleType) +{ + GameRuleDefinition *rule = NULL; + if(ruleType == ConsoleGameRules::eGameRuleType_NamedArea) + { + rule = new NamedAreaRuleDefinition(); + m_areas.push_back((NamedAreaRuleDefinition *)rule); + } + else + { + rule = CompoundGameRuleDefinition::addChild(ruleType); + } + return rule; +} + +void LevelRuleset::loadStringTable(StringTable *table) +{ + m_stringTable = table; +} + +LPCWSTR LevelRuleset::getString(const wstring &key) +{ + if(m_stringTable == NULL) + { + return L""; + } + else + { + return m_stringTable->getString(key); + } +} + +AABB *LevelRuleset::getNamedArea(const wstring &areaName) +{ + AABB *area = NULL; + for(AUTO_VAR(it, m_areas.begin()); it != m_areas.end(); ++it) + { + if( (*it)->getName().compare(areaName) == 0 ) + { + area = (*it)->getArea(); + break; + } + } + return area; +} diff --git a/Minecraft.Client/Common/GameRules/LevelRuleset.h b/Minecraft.Client/Common/GameRules/LevelRuleset.h new file mode 100644 index 00000000..bbb17c43 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/LevelRuleset.h @@ -0,0 +1,27 @@ +#pragma once + +#include "CompoundGameRuleDefinition.h" + +class NamedAreaRuleDefinition; + +class LevelRuleset : public CompoundGameRuleDefinition +{ +private: + vector m_areas; + StringTable *m_stringTable; +public: + LevelRuleset(); + ~LevelRuleset(); + + virtual void getChildren(vector *children); + virtual GameRuleDefinition *addChild(ConsoleGameRules::EGameRuleType ruleType); + + virtual ConsoleGameRules::EGameRuleType getActionType() { return ConsoleGameRules::eGameRuleType_LevelRules; } + + void loadStringTable(StringTable *table); + LPCWSTR getString(const wstring &key); + + AABB *getNamedArea(const wstring &areaName); + + StringTable *getStringTable() { return m_stringTable; } +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/NamedAreaRuleDefinition.cpp b/Minecraft.Client/Common/GameRules/NamedAreaRuleDefinition.cpp new file mode 100644 index 00000000..41ff15e8 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/NamedAreaRuleDefinition.cpp @@ -0,0 +1,84 @@ +#include "stdafx.h" +#include "NamedAreaRuleDefinition.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.phys.h" + +NamedAreaRuleDefinition::NamedAreaRuleDefinition() +{ + m_name = L""; + m_area = AABB::newPermanent(0,0,0,0,0,0); +} + +NamedAreaRuleDefinition::~NamedAreaRuleDefinition() +{ + delete m_area; +} + +void NamedAreaRuleDefinition::writeAttributes(DataOutputStream *dos, UINT numAttributes) +{ + GameRuleDefinition::writeAttributes(dos, numAttributes + 7); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_name); + dos->writeUTF(m_name); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_x0); + dos->writeUTF(_toString(m_area->x0)); + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_y0); + dos->writeUTF(_toString(m_area->y0)); + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_z0); + dos->writeUTF(_toString(m_area->z0)); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_x1); + dos->writeUTF(_toString(m_area->x1)); + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_y1); + dos->writeUTF(_toString(m_area->y1)); + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_z1); + dos->writeUTF(_toString(m_area->z1)); +} + +void NamedAreaRuleDefinition::addAttribute(const wstring &attributeName, const wstring &attributeValue) +{ + if(attributeName.compare(L"name") == 0) + { + m_name = attributeValue; +#ifndef _CONTENT_PACKAGE + wprintf(L"NamedAreaRuleDefinition: Adding parameter name=%ls\n",m_name.c_str()); +#endif + } + else if(attributeName.compare(L"x0") == 0) + { + m_area->x0 = _fromString(attributeValue); + app.DebugPrintf("NamedAreaRuleDefinition: Adding parameter x0=%f\n",m_area->x0); + } + else if(attributeName.compare(L"y0") == 0) + { + m_area->y0 = _fromString(attributeValue); + if(m_area->y0 < 0) m_area->y0 = 0; + app.DebugPrintf("NamedAreaRuleDefinition: Adding parameter y0=%f\n",m_area->y0); + } + else if(attributeName.compare(L"z0") == 0) + { + m_area->z0 = _fromString(attributeValue); + app.DebugPrintf("NamedAreaRuleDefinition: Adding parameter z0=%f\n",m_area->z0); + } + else if(attributeName.compare(L"x1") == 0) + { + m_area->x1 = _fromString(attributeValue); + app.DebugPrintf("NamedAreaRuleDefinition: Adding parameter x1=%f\n",m_area->x1); + } + else if(attributeName.compare(L"y1") == 0) + { + m_area->y1 = _fromString(attributeValue); + if(m_area->y1 < 0) m_area->y1 = 0; + app.DebugPrintf("NamedAreaRuleDefinition: Adding parameter y1=%f\n",m_area->y1); + } + else if(attributeName.compare(L"z1") == 0) + { + m_area->z1 = _fromString(attributeValue); + app.DebugPrintf("NamedAreaRuleDefinition: Adding parameter z1=%f\n",m_area->z1); + } + else + { + GameRuleDefinition::addAttribute(attributeName, attributeValue); + } +} diff --git a/Minecraft.Client/Common/GameRules/NamedAreaRuleDefinition.h b/Minecraft.Client/Common/GameRules/NamedAreaRuleDefinition.h new file mode 100644 index 00000000..7cf7db19 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/NamedAreaRuleDefinition.h @@ -0,0 +1,23 @@ +#pragma once + +#include "GameRuleDefinition.h" + +class NamedAreaRuleDefinition : public GameRuleDefinition +{ +private: + wstring m_name; + AABB *m_area; + +public: + NamedAreaRuleDefinition(); + ~NamedAreaRuleDefinition(); + + virtual void writeAttributes(DataOutputStream *dos, UINT numAttributes); + + virtual ConsoleGameRules::EGameRuleType getActionType() { return ConsoleGameRules::eGameRuleType_NamedArea; } + + virtual void addAttribute(const wstring &attributeName, const wstring &attributeValue); + + AABB *getArea() { return m_area; } + wstring getName() { return m_name; } +}; diff --git a/Minecraft.Client/Common/GameRules/StartFeature.cpp b/Minecraft.Client/Common/GameRules/StartFeature.cpp new file mode 100644 index 00000000..7f0c8b5c --- /dev/null +++ b/Minecraft.Client/Common/GameRules/StartFeature.cpp @@ -0,0 +1,63 @@ +#include "stdafx.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "StartFeature.h" + +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 + 4); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_chunkX); + dos->writeUTF(_toString(m_chunkX)); + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_chunkZ); + dos->writeUTF(_toString(m_chunkZ)); + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_feature); + dos->writeUTF(_toString((int)m_feature)); + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_orientation); + dos->writeUTF(_toString(m_orientation)); +} + +void StartFeature::addAttribute(const wstring &attributeName, const wstring &attributeValue) +{ + if(attributeName.compare(L"chunkX") == 0) + { + int value = _fromString(attributeValue); + m_chunkX = value; + app.DebugPrintf("StartFeature: Adding parameter chunkX=%d\n",m_chunkX); + } + else if(attributeName.compare(L"chunkZ") == 0) + { + int value = _fromString(attributeValue); + m_chunkZ = value; + app.DebugPrintf("StartFeature: Adding parameter chunkZ=%d\n",m_chunkZ); + } + else if(attributeName.compare(L"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); + m_feature = (StructureFeature::EFeatureTypes)value; + app.DebugPrintf("StartFeature: Adding parameter feature=%d\n",m_feature); + } + else + { + GameRuleDefinition::addAttribute(attributeName, attributeValue); + } +} + +bool StartFeature::isFeatureChunk(int chunkX, int chunkZ, StructureFeature::EFeatureTypes feature, 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 new file mode 100644 index 00000000..b198a2fa --- /dev/null +++ b/Minecraft.Client/Common/GameRules/StartFeature.h @@ -0,0 +1,22 @@ +#pragma once +using namespace std; + +#include "GameRuleDefinition.h" +#include "..\..\..\Minecraft.World\StructureFeature.h" + +class StartFeature : public GameRuleDefinition +{ +private: + int m_chunkX, m_chunkZ, m_orientation; + StructureFeature::EFeatureTypes m_feature; + +public: + StartFeature(); + + virtual ConsoleGameRules::EGameRuleType getActionType() { return ConsoleGameRules::eGameRuleType_StartFeature; } + + virtual void writeAttributes(DataOutputStream *dos, UINT numAttrs); + virtual void addAttribute(const wstring &attributeName, const wstring &attributeValue); + + bool isFeatureChunk(int chunkX, int chunkZ, StructureFeature::EFeatureTypes feature, int *orientation); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/UpdatePlayerRuleDefinition.cpp b/Minecraft.Client/Common/GameRules/UpdatePlayerRuleDefinition.cpp new file mode 100644 index 00000000..6e55cd45 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/UpdatePlayerRuleDefinition.cpp @@ -0,0 +1,171 @@ +#include "stdafx.h" +#include "UpdatePlayerRuleDefinition.h" +#include "ConsoleGameRules.h" +#include "..\..\..\Minecraft.World\Pos.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.entity.player.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.food.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.h" + +UpdatePlayerRuleDefinition::UpdatePlayerRuleDefinition() +{ + m_bUpdateHealth = m_bUpdateFood = m_bUpdateYRot = false;; + m_health = 0; + m_food = 0; + m_spawnPos = NULL; + m_yRot = 0.0f; +} + +UpdatePlayerRuleDefinition::~UpdatePlayerRuleDefinition() +{ + for(AUTO_VAR(it, m_items.begin()); it != m_items.end(); ++it) + { + delete *it; + } +} + +void UpdatePlayerRuleDefinition::writeAttributes(DataOutputStream *dos, UINT numAttributes) +{ + int attrCount = 3; + if(m_bUpdateHealth) ++attrCount; + if(m_bUpdateFood) ++attrCount; + if(m_bUpdateYRot) ++attrCount; + GameRuleDefinition::writeAttributes(dos, numAttributes + attrCount ); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_spawnX); + dos->writeUTF(_toString(m_spawnPos->x)); + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_spawnY); + dos->writeUTF(_toString(m_spawnPos->y)); + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_spawnZ); + dos->writeUTF(_toString(m_spawnPos->z)); + + if(m_bUpdateYRot) + { + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_yRot); + dos->writeUTF(_toString(m_yRot)); + } + if(m_bUpdateHealth) + { + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_food); + dos->writeUTF(_toString(m_health)); + } + if(m_bUpdateFood) + { + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_health); + dos->writeUTF(_toString(m_food)); + } +} + +void UpdatePlayerRuleDefinition::getChildren(vector *children) +{ + GameRuleDefinition::getChildren(children); + for(AUTO_VAR(it, m_items.begin()); it!=m_items.end(); it++) + children->push_back(*it); +} + +GameRuleDefinition *UpdatePlayerRuleDefinition::addChild(ConsoleGameRules::EGameRuleType ruleType) +{ + GameRuleDefinition *rule = NULL; + if(ruleType == ConsoleGameRules::eGameRuleType_AddItem) + { + rule = new AddItemRuleDefinition(); + m_items.push_back((AddItemRuleDefinition *)rule); + } + else + { +#ifndef _CONTENT_PACKAGE + wprintf(L"UpdatePlayerRuleDefinition: Attempted to add invalid child rule - %d\n", ruleType ); +#endif + } + return rule; +} + +void UpdatePlayerRuleDefinition::addAttribute(const wstring &attributeName, const wstring &attributeValue) +{ + if(attributeName.compare(L"spawnX") == 0) + { + if(m_spawnPos == NULL) m_spawnPos = new Pos(); + int value = _fromString(attributeValue); + m_spawnPos->x = value; + app.DebugPrintf("UpdatePlayerRuleDefinition: Adding parameter spawnX=%d\n",value); + } + else if(attributeName.compare(L"spawnY") == 0) + { + if(m_spawnPos == NULL) m_spawnPos = new Pos(); + int value = _fromString(attributeValue); + m_spawnPos->y = value; + app.DebugPrintf("UpdatePlayerRuleDefinition: Adding parameter spawnY=%d\n",value); + } + else if(attributeName.compare(L"spawnZ") == 0) + { + if(m_spawnPos == NULL) m_spawnPos = new Pos(); + int value = _fromString(attributeValue); + m_spawnPos->z = value; + app.DebugPrintf("UpdatePlayerRuleDefinition: Adding parameter spawnZ=%d\n",value); + } + else if(attributeName.compare(L"health") == 0) + { + int value = _fromString(attributeValue); + m_health = value; + m_bUpdateHealth = true; + app.DebugPrintf("UpdatePlayerRuleDefinition: Adding parameter health=%d\n",value); + } + else if(attributeName.compare(L"food") == 0) + { + int value = _fromString(attributeValue); + m_food = value; + m_bUpdateFood = true; + app.DebugPrintf("UpdatePlayerRuleDefinition: Adding parameter health=%d\n",value); + } + else if(attributeName.compare(L"yRot") == 0) + { + float value = _fromString(attributeValue); + m_yRot = value; + m_bUpdateYRot = true; + app.DebugPrintf("UpdatePlayerRuleDefinition: Adding parameter yRot=%f\n",value); + } + else + { + GameRuleDefinition::addAttribute(attributeName, attributeValue); + } +} + +void UpdatePlayerRuleDefinition::postProcessPlayer(shared_ptr player) +{ + if(m_bUpdateHealth) + { + player->lastHealth = m_health; + player->setHealth(m_health); + } + + if(m_bUpdateFood) + { + player->getFoodData()->setFoodLevel(m_food); + } + + double x = player->x; + double y = player->y; + double z = player->z; + float yRot = player->yRot; + float xRot = player->xRot; + if(m_spawnPos != NULL) + { + x = m_spawnPos->x; + y = m_spawnPos->y; + z = m_spawnPos->z; + } + + if(m_bUpdateYRot) + { + yRot = m_yRot; + } + + if(m_spawnPos != NULL || m_bUpdateYRot) player->absMoveTo(x,y,z,yRot,xRot); + + for(AUTO_VAR(it, m_items.begin()); it != m_items.end(); ++it) + { + AddItemRuleDefinition *addItem = *it; + + addItem->addItemToContainer(player->inventory, -1); + } +} \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/UpdatePlayerRuleDefinition.h b/Minecraft.Client/Common/GameRules/UpdatePlayerRuleDefinition.h new file mode 100644 index 00000000..538aefa1 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/UpdatePlayerRuleDefinition.h @@ -0,0 +1,33 @@ +#pragma once +using namespace std; + +#include "GameRuleDefinition.h" + +class AddItemRuleDefinition; +class Pos; + +class UpdatePlayerRuleDefinition : public GameRuleDefinition +{ +private: + vector m_items; + + bool m_bUpdateHealth, m_bUpdateFood, m_bUpdateYRot, m_bUpdateInventory; + int m_health; + int m_food; + Pos *m_spawnPos; + float m_yRot; + +public: + UpdatePlayerRuleDefinition(); + ~UpdatePlayerRuleDefinition(); + + virtual ConsoleGameRules::EGameRuleType getActionType() { return ConsoleGameRules::eGameRuleType_UpdatePlayerRule; } + + virtual void getChildren(vector *children); + virtual GameRuleDefinition *addChild(ConsoleGameRules::EGameRuleType ruleType); + + virtual void writeAttributes(DataOutputStream *dos, UINT numAttributes); + virtual void addAttribute(const wstring &attributeName, const wstring &attributeValue); + + virtual void postProcessPlayer(shared_ptr player); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/UseTileRuleDefinition.cpp b/Minecraft.Client/Common/GameRules/UseTileRuleDefinition.cpp new file mode 100644 index 00000000..965405ae --- /dev/null +++ b/Minecraft.Client/Common/GameRules/UseTileRuleDefinition.cpp @@ -0,0 +1,82 @@ +#include "stdafx.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "UseTileRuleDefinition.h" + +UseTileRuleDefinition::UseTileRuleDefinition() +{ + m_tileId = -1; + m_useCoords = false; +} + +void UseTileRuleDefinition::writeAttributes(DataOutputStream *dos, UINT numAttributes) +{ + GameRuleDefinition::writeAttributes(dos, numAttributes + 5); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_tileId); + dos->writeUTF(_toString(m_tileId)); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_useCoords); + dos->writeUTF(_toString(m_useCoords)); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_x); + dos->writeUTF(_toString(m_coordinates.x)); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_y); + dos->writeUTF(_toString(m_coordinates.y)); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_z); + dos->writeUTF(_toString(m_coordinates.z)); +} + +void UseTileRuleDefinition::addAttribute(const wstring &attributeName, const wstring &attributeValue) +{ + if(attributeName.compare(L"tileId") == 0) + { + m_tileId = _fromString(attributeValue); + app.DebugPrintf("UseTileRule: Adding parameter tileId=%d\n",m_tileId); + } + else if(attributeName.compare(L"useCoords") == 0) + { + m_useCoords = _fromString(attributeValue); + app.DebugPrintf("UseTileRule: Adding parameter useCoords=%s\n",m_useCoords?"TRUE":"FALSE"); + } + else if(attributeName.compare(L"x") == 0) + { + m_coordinates.x = _fromString(attributeValue); + app.DebugPrintf("UseTileRule: Adding parameter x=%d\n",m_coordinates.x); + } + else if(attributeName.compare(L"y") == 0) + { + m_coordinates.y = _fromString(attributeValue); + app.DebugPrintf("UseTileRule: Adding parameter y=%d\n",m_coordinates.y); + } + else if(attributeName.compare(L"z") == 0) + { + m_coordinates.z = _fromString(attributeValue); + app.DebugPrintf("UseTileRule: Adding parameter z=%d\n",m_coordinates.z); + } + else + { + GameRuleDefinition::addAttribute(attributeName, attributeValue); + } +} + +bool UseTileRuleDefinition::onUseTile(GameRule *rule, int tileId, int x, int y, int z) +{ + bool statusChanged = false; + if( m_tileId == tileId ) + { + if( !m_useCoords || (m_coordinates.x == x && m_coordinates.y == y && m_coordinates.z == z) ) + { + if(!getComplete(rule)) + { + statusChanged = true; + setComplete(rule,true); + app.DebugPrintf("Completed UseTileRule with info - t:%d, coords:%s, x:%d, y:%d, z:%d\n", m_tileId,m_useCoords?"TRUE":"FALSE",m_coordinates.x,m_coordinates.y,m_coordinates.z); + + // Send a packet or some other announcement here + } + } + } + return statusChanged; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/UseTileRuleDefinition.h b/Minecraft.Client/Common/GameRules/UseTileRuleDefinition.h new file mode 100644 index 00000000..ad64bfe4 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/UseTileRuleDefinition.h @@ -0,0 +1,24 @@ +#pragma once +using namespace std; + +#include "GameRuleDefinition.h" +#include "..\..\..\Minecraft.World\Pos.h" + +class UseTileRuleDefinition : public GameRuleDefinition +{ +private: + // These values should map directly to the xsd definition for this Rule + int m_tileId; + bool m_useCoords; + Pos m_coordinates; + +public: + UseTileRuleDefinition(); + + ConsoleGameRules::EGameRuleType getActionType() { return ConsoleGameRules::eGameRuleType_UseTileRule; } + + virtual void writeAttributes(DataOutputStream *dos, UINT numAttributes); + virtual void addAttribute(const wstring &attributeName, const wstring &attributeValue); + + virtual bool onUseTile(GameRule *rule, int tileId, int x, int y, int z); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/XboxStructureActionGenerateBox.cpp b/Minecraft.Client/Common/GameRules/XboxStructureActionGenerateBox.cpp new file mode 100644 index 00000000..6d687b36 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/XboxStructureActionGenerateBox.cpp @@ -0,0 +1,104 @@ +#include "stdafx.h" +#include "XboxStructureActionGenerateBox.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.levelgen.structure.h" + +XboxStructureActionGenerateBox::XboxStructureActionGenerateBox() +{ + m_x0 = m_y0 = m_z0 = m_x1 = m_y1 = m_z1 = m_edgeTile = m_fillTile = 0; + m_skipAir = false; +} + +void XboxStructureActionGenerateBox::writeAttributes(DataOutputStream *dos, UINT numAttrs) +{ + ConsoleGenerateStructureAction::writeAttributes(dos, numAttrs + 9); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_x0); + dos->writeUTF(_toString(m_x0)); + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_y0); + dos->writeUTF(_toString(m_y0)); + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_z0); + dos->writeUTF(_toString(m_z0)); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_x1); + dos->writeUTF(_toString(m_x1)); + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_y1); + dos->writeUTF(_toString(m_y1)); + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_z1); + dos->writeUTF(_toString(m_z1)); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_edgeTile); + dos->writeUTF(_toString(m_edgeTile)); + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_fillTile); + dos->writeUTF(_toString(m_fillTile)); + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_skipAir); + dos->writeUTF(_toString(m_skipAir)); +} + +void XboxStructureActionGenerateBox::addAttribute(const wstring &attributeName, const wstring &attributeValue) +{ + if(attributeName.compare(L"x0") == 0) + { + int value = _fromString(attributeValue); + m_x0 = value; + app.DebugPrintf("XboxStructureActionGenerateBox: Adding parameter x0=%d\n",m_x0); + } + else if(attributeName.compare(L"y0") == 0) + { + int value = _fromString(attributeValue); + m_y0 = value; + app.DebugPrintf("XboxStructureActionGenerateBox: Adding parameter y0=%d\n",m_y0); + } + else if(attributeName.compare(L"z0") == 0) + { + int value = _fromString(attributeValue); + m_z0 = value; + app.DebugPrintf("XboxStructureActionGenerateBox: Adding parameter z0=%d\n",m_z0); + } + else if(attributeName.compare(L"x1") == 0) + { + int value = _fromString(attributeValue); + m_x1 = value; + app.DebugPrintf("XboxStructureActionGenerateBox: Adding parameter x1=%d\n",m_x1); + } + else if(attributeName.compare(L"y1") == 0) + { + int value = _fromString(attributeValue); + m_y1 = value; + app.DebugPrintf("XboxStructureActionGenerateBox: Adding parameter y1=%d\n",m_y1); + } + else if(attributeName.compare(L"z1") == 0) + { + int value = _fromString(attributeValue); + m_z1 = value; + app.DebugPrintf("XboxStructureActionGenerateBox: Adding parameter z1=%d\n",m_z1); + } + else if(attributeName.compare(L"edgeTile") == 0) + { + int value = _fromString(attributeValue); + m_edgeTile = value; + app.DebugPrintf("XboxStructureActionGenerateBox: Adding parameter edgeTile=%d\n",m_edgeTile); + } + else if(attributeName.compare(L"fillTile") == 0) + { + int value = _fromString(attributeValue); + m_fillTile = value; + app.DebugPrintf("XboxStructureActionGenerateBox: Adding parameter fillTile=%d\n",m_fillTile); + } + else if(attributeName.compare(L"skipAir") == 0) + { + if(attributeValue.compare(L"true") == 0) m_skipAir = true; + app.DebugPrintf("XboxStructureActionGenerateBox: Adding parameter skipAir=%s\n",m_skipAir?"TRUE":"FALSE"); + } + else + { + GameRuleDefinition::addAttribute(attributeName, attributeValue); + } +} + +bool XboxStructureActionGenerateBox::generateBoxInLevel(StructurePiece *structure, Level *level, BoundingBox *chunkBB) +{ + app.DebugPrintf("XboxStructureActionGenerateBox - generating a box\n"); + structure->generateBox(level,chunkBB,m_x0,m_y0,m_z0,m_x1,m_y1,m_z1,m_edgeTile,m_fillTile,m_skipAir); + return true; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/XboxStructureActionGenerateBox.h b/Minecraft.Client/Common/GameRules/XboxStructureActionGenerateBox.h new file mode 100644 index 00000000..78664d42 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/XboxStructureActionGenerateBox.h @@ -0,0 +1,26 @@ +#pragma once +#include "ConsoleGenerateStructureAction.h" + +class StructurePiece; +class Level; +class BoundingBox; + +class XboxStructureActionGenerateBox : public ConsoleGenerateStructureAction +{ +private: + int m_x0, m_y0, m_z0, m_x1, m_y1, m_z1, m_edgeTile, m_fillTile; + bool m_skipAir; +public: + XboxStructureActionGenerateBox(); + + virtual ConsoleGameRules::EGameRuleType getActionType() { return ConsoleGameRules::eGameRuleType_GenerateBox; } + + virtual int getEndX() { return m_x1; } + virtual int getEndY() { return m_y1; } + virtual int getEndZ() { return m_z1; } + + virtual void writeAttributes(DataOutputStream *dos, UINT numAttrs); + virtual void addAttribute(const wstring &attributeName, const wstring &attributeValue); + + bool generateBoxInLevel(StructurePiece *structure, Level *level, BoundingBox *chunkBB); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceBlock.cpp b/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceBlock.cpp new file mode 100644 index 00000000..b816d5b6 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceBlock.cpp @@ -0,0 +1,72 @@ +#include "stdafx.h" +#include "XboxStructureActionPlaceBlock.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.levelgen.structure.h" + +XboxStructureActionPlaceBlock::XboxStructureActionPlaceBlock() +{ + m_x = m_y = m_z = m_tile = m_data = 0; +} + +void XboxStructureActionPlaceBlock::writeAttributes(DataOutputStream *dos, UINT numAttrs) +{ + ConsoleGenerateStructureAction::writeAttributes(dos, numAttrs + 5); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_x); + dos->writeUTF(_toString(m_x)); + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_y); + dos->writeUTF(_toString(m_y)); + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_z); + dos->writeUTF(_toString(m_z)); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_data); + dos->writeUTF(_toString(m_data)); + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_block); + dos->writeUTF(_toString(m_tile)); +} + + +void XboxStructureActionPlaceBlock::addAttribute(const wstring &attributeName, const wstring &attributeValue) +{ + if(attributeName.compare(L"x") == 0) + { + int value = _fromString(attributeValue); + m_x = value; + app.DebugPrintf("XboxStructureActionPlaceBlock: Adding parameter x=%d\n",m_x); + } + else if(attributeName.compare(L"y") == 0) + { + int value = _fromString(attributeValue); + m_y = value; + app.DebugPrintf("XboxStructureActionPlaceBlock: Adding parameter y=%d\n",m_y); + } + else if(attributeName.compare(L"z") == 0) + { + int value = _fromString(attributeValue); + m_z = value; + app.DebugPrintf("XboxStructureActionPlaceBlock: Adding parameter z=%d\n",m_z); + } + else if(attributeName.compare(L"block") == 0) + { + int value = _fromString(attributeValue); + m_tile = value; + app.DebugPrintf("XboxStructureActionPlaceBlock: Adding parameter block=%d\n",m_tile); + } + else if(attributeName.compare(L"data") == 0) + { + int value = _fromString(attributeValue); + m_data = value; + app.DebugPrintf("XboxStructureActionPlaceBlock: Adding parameter data=%d\n",m_data); + } + else + { + GameRuleDefinition::addAttribute(attributeName, attributeValue); + } +} + +bool XboxStructureActionPlaceBlock::placeBlockInLevel(StructurePiece *structure, Level *level, BoundingBox *chunkBB) +{ + app.DebugPrintf("XboxStructureActionPlaceBlock - placing a block\n"); + structure->placeBlock(level,m_tile,m_data,m_x,m_y,m_z,chunkBB); + return true; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceBlock.h b/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceBlock.h new file mode 100644 index 00000000..3ee377b9 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceBlock.h @@ -0,0 +1,25 @@ +#pragma once +#include "ConsoleGenerateStructureAction.h" + +class StructurePiece; +class Level; +class BoundingBox; + +class XboxStructureActionPlaceBlock : public ConsoleGenerateStructureAction +{ +protected: + int m_x, m_y, m_z, m_tile, m_data; +public: + XboxStructureActionPlaceBlock(); + + virtual ConsoleGameRules::EGameRuleType getActionType() { return ConsoleGameRules::eGameRuleType_PlaceBlock; } + + virtual int getEndX() { return m_x; } + virtual int getEndY() { return m_y; } + virtual int getEndZ() { return m_z; } + + virtual void writeAttributes(DataOutputStream *dos, UINT numAttrs); + virtual void addAttribute(const wstring &attributeName, const wstring &attributeValue); + + bool placeBlockInLevel(StructurePiece *structure, Level *level, BoundingBox *chunkBB); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceContainer.cpp b/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceContainer.cpp new file mode 100644 index 00000000..d81a2b03 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceContainer.cpp @@ -0,0 +1,99 @@ +#include "stdafx.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "XboxStructureActionPlaceContainer.h" +#include "AddItemRuleDefinition.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.levelgen.structure.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.tile.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" + +XboxStructureActionPlaceContainer::XboxStructureActionPlaceContainer() +{ + m_tile = Tile::chest_Id; +} + +XboxStructureActionPlaceContainer::~XboxStructureActionPlaceContainer() +{ + for(AUTO_VAR(it, m_items.begin()); it != m_items.end(); ++it) + { + delete *it; + } +} + +// 4J-JEV: Super class handles attr-facing fine. +//void XboxStructureActionPlaceContainer::writeAttributes(DataOutputStream *dos, UINT numAttrs) + + +void XboxStructureActionPlaceContainer::getChildren(vector *children) +{ + XboxStructureActionPlaceBlock::getChildren(children); + for(AUTO_VAR(it, m_items.begin()); it!=m_items.end(); it++) + children->push_back( *it ); +} + +GameRuleDefinition *XboxStructureActionPlaceContainer::addChild(ConsoleGameRules::EGameRuleType ruleType) +{ + GameRuleDefinition *rule = NULL; + if(ruleType == ConsoleGameRules::eGameRuleType_AddItem) + { + rule = new AddItemRuleDefinition(); + m_items.push_back((AddItemRuleDefinition *)rule); + } + else + { +#ifndef _CONTENT_PACKAGE + wprintf(L"XboxStructureActionPlaceContainer: Attempted to add invalid child rule - %d\n", ruleType ); +#endif + } + return rule; +} + +void XboxStructureActionPlaceContainer::addAttribute(const wstring &attributeName, const wstring &attributeValue) +{ + if(attributeName.compare(L"facing") == 0) + { + int value = _fromString(attributeValue); + m_data = value; + app.DebugPrintf("XboxStructureActionPlaceContainer: Adding parameter facing=%d\n",m_data); + } + else + { + XboxStructureActionPlaceBlock::addAttribute(attributeName, attributeValue); + } +} + +bool XboxStructureActionPlaceContainer::placeContainerInLevel(StructurePiece *structure, Level *level, BoundingBox *chunkBB) +{ + int worldX = structure->getWorldX( m_x, m_z ); + int worldY = structure->getWorldY( m_y ); + int worldZ = structure->getWorldZ( m_x, m_z ); + + if ( chunkBB->isInside( worldX, worldY, worldZ ) ) + { + if ( level->getTileEntity( worldX, worldY, worldZ ) != NULL ) + { + // Remove the current tile entity + level->removeTileEntity( worldX, worldY, worldZ ); + level->setTileAndData( worldX, worldY, worldZ, 0, 0, Tile::UPDATE_ALL ); + } + + 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, Tile::UPDATE_CLIENTS); + // Add items + int slotId = 0; + for(AUTO_VAR(it, m_items.begin()); it != m_items.end() && (slotId < container->getContainerSize()); ++it, ++slotId ) + { + AddItemRuleDefinition *addItem = *it; + + addItem->addItemToContainer(container,slotId); + } + } + return true; + } + return false; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceContainer.h b/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceContainer.h new file mode 100644 index 00000000..6355ca11 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceContainer.h @@ -0,0 +1,29 @@ +#pragma once + +#include "XboxStructureActionPlaceBlock.h" + +class AddItemRuleDefinition; +class StructurePiece; +class Level; +class BoundingBox; + +class XboxStructureActionPlaceContainer : public XboxStructureActionPlaceBlock +{ +private: + vector m_items; +public: + XboxStructureActionPlaceContainer(); + ~XboxStructureActionPlaceContainer(); + + virtual ConsoleGameRules::EGameRuleType getActionType() { return ConsoleGameRules::eGameRuleType_PlaceContainer; } + + virtual void getChildren(vector *children); + virtual GameRuleDefinition *addChild(ConsoleGameRules::EGameRuleType ruleType); + + // 4J-JEV: Super class handles attr-facing fine. + //virtual void writeAttributes(DataOutputStream *dos, UINT numAttributes); + + virtual void addAttribute(const wstring &attributeName, const wstring &attributeValue); + + bool placeContainerInLevel(StructurePiece *structure, Level *level, BoundingBox *chunkBB); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceSpawner.cpp b/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceSpawner.cpp new file mode 100644 index 00000000..3f6204af --- /dev/null +++ b/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceSpawner.cpp @@ -0,0 +1,69 @@ +#include "stdafx.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "XboxStructureActionPlaceSpawner.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.levelgen.structure.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.tile.entity.h" + +XboxStructureActionPlaceSpawner::XboxStructureActionPlaceSpawner() +{ + m_tile = Tile::mobSpawner_Id; + m_entityId = L"Pig"; +} + +XboxStructureActionPlaceSpawner::~XboxStructureActionPlaceSpawner() +{ +} + +void XboxStructureActionPlaceSpawner::writeAttributes(DataOutputStream *dos, UINT numAttrs) +{ + XboxStructureActionPlaceBlock::writeAttributes(dos, numAttrs + 1); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_entity); + dos->writeUTF(m_entityId); +} + +void XboxStructureActionPlaceSpawner::addAttribute(const wstring &attributeName, const wstring &attributeValue) +{ + if(attributeName.compare(L"entity") == 0) + { + m_entityId = attributeValue; +#ifndef _CONTENT_PACKAGE + wprintf(L"XboxStructureActionPlaceSpawner: Adding parameter entity=%ls\n",m_entityId.c_str()); +#endif + } + else + { + XboxStructureActionPlaceBlock::addAttribute(attributeName, attributeValue); + } +} + +bool XboxStructureActionPlaceSpawner::placeSpawnerInLevel(StructurePiece *structure, Level *level, BoundingBox *chunkBB) +{ + int worldX = structure->getWorldX( m_x, m_z ); + int worldY = structure->getWorldY( m_y ); + int worldZ = structure->getWorldZ( m_x, m_z ); + + if ( chunkBB->isInside( worldX, worldY, worldZ ) ) + { + if ( level->getTileEntity( worldX, worldY, worldZ ) != NULL ) + { + // Remove the current tile entity + level->removeTileEntity( worldX, worldY, worldZ ); + level->setTileAndData( worldX, worldY, worldZ, 0, 0, Tile::UPDATE_ALL ); + } + + 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 + wprintf(L"XboxStructureActionPlaceSpawner - placing a %ls spawner at (%d,%d,%d)\n", m_entityId.c_str(), worldX, worldY, worldZ); +#endif + if( entity != NULL ) + { + entity->setEntityId(m_entityId); + } + return true; + } + return false; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceSpawner.h b/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceSpawner.h new file mode 100644 index 00000000..16000980 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceSpawner.h @@ -0,0 +1,24 @@ +#pragma once + +#include "XboxStructureActionPlaceBlock.h" + +class StructurePiece; +class Level; +class BoundingBox; +class GRFObject; + +class XboxStructureActionPlaceSpawner : public XboxStructureActionPlaceBlock +{ +private: + wstring m_entityId; +public: + XboxStructureActionPlaceSpawner(); + ~XboxStructureActionPlaceSpawner(); + + virtual ConsoleGameRules::EGameRuleType getActionType() { return ConsoleGameRules::eGameRuleType_PlaceSpawner; } + + virtual void writeAttributes(DataOutputStream *dos, UINT numAttrs); + virtual void addAttribute(const wstring &attributeName, const wstring &attributeValue); + + bool placeSpawnerInLevel(StructurePiece *structure, Level *level, BoundingBox *chunkBB); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Leaderboards/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/LeaderboardManager.cpp b/Minecraft.Client/Common/Leaderboards/LeaderboardManager.cpp new file mode 100644 index 00000000..33707b14 --- /dev/null +++ b/Minecraft.Client/Common/Leaderboards/LeaderboardManager.cpp @@ -0,0 +1,106 @@ +#include "stdafx.h" + +#include "..\..\..\Minecraft.World\StringHelpers.h" + +#include "LeaderboardManager.h" + +const wstring LeaderboardManager::filterNames[eNumFilterModes] = + { + L"Friends", L"MyScore", L"TopRank" + }; + +void LeaderboardManager::DeleteInstance() +{ + delete m_instance; + m_instance = NULL; +} + +LeaderboardManager::LeaderboardManager() +{ + zeroReadParameters(); + + m_myXUID = INVALID_XUID; +} + +void LeaderboardManager::zeroReadParameters() +{ + m_difficulty = -1; + m_statsType = eStatsType_UNDEFINED; + m_readListener = NULL; + m_startIndex = 0; + m_readCount = 0; + m_eFilterMode = eFM_UNDEFINED; +} + +bool LeaderboardManager::ReadStats_Friends(LeaderboardReadListener *listener, int difficulty, EStatsType type, PlayerUID myUID, unsigned int startIndex, unsigned int readCount) +{ + zeroReadParameters(); + + m_readListener = listener; + m_difficulty = difficulty; + m_statsType = type; + + m_eFilterMode = eFM_Friends; + return true; +} + +bool LeaderboardManager::ReadStats_MyScore(LeaderboardReadListener *listener, int difficulty, EStatsType type, PlayerUID myUID, unsigned int readCount) +{ + zeroReadParameters(); + + m_readListener = listener; + m_difficulty = difficulty; + m_statsType = type; + + m_readCount = readCount; + + m_eFilterMode = eFM_MyScore; + return true; +} + +bool LeaderboardManager::ReadStats_TopRank(LeaderboardReadListener *listener, int difficulty, EStatsType type, unsigned int startIndex, unsigned int readCount) +{ + zeroReadParameters(); + + m_readListener = listener; + m_difficulty = difficulty; + m_statsType = type; + + m_startIndex = startIndex; + m_readCount = readCount; + + m_eFilterMode = eFM_TopRank; + return true; +} + +#ifndef _XBOX +void LeaderboardManager::printStats(ReadView &view) +{ + app.DebugPrintf("[LeaderboardManager] Printing stats:\n" + "\tnumQueries=%i\n", view.m_numQueries); + + for (int i=0; i +#include +//#include + +#include "SonyLeaderboardManager.h" + +#include "base64.h" + +#include "Common\Consoles_App.h" +#include "Common\Network\Sony\SQRNetworkManager.h" + +#include "..\..\..\Minecraft.World\StringHelpers.h" + + +#ifdef __ORBIS__ +#include "Orbis\OrbisExtras\ShutdownManager.h" +#include "Orbis\Orbis_App.h" +#elif defined __PSVITA__ +#include "PSVita\PSVitaExtras\ShutdownManager.h" +#include "PSVita\PSVita_App.h" +#elif defined __PS3__ +#include "PS3\PS3Extras\ShutdownManager.h" +#include "PS3\PS3_App.h" +#else +#error "SonyLeaderboardManager is included for a non-sony platform." +#endif + +SonyLeaderboardManager::SonyLeaderboardManager() +{ + m_eStatsState = eStatsState_Idle; + + m_titleContext = -1; + + m_myXUID = INVALID_XUID; + + m_scores = NULL; + + m_statsType = eStatsType_Kills; + m_difficulty = 0; + + m_requestId = 0; + + m_openSessions = 0; + + InitializeCriticalSection(&m_csViewsLock); + + m_running = false; + m_threadScoreboard = NULL; +} + +SonyLeaderboardManager::~SonyLeaderboardManager() +{ + m_running = false; + + // 4J-JEV: Wait for thread to stop and hope it doesn't take too long. + long long startShutdown = System::currentTimeMillis(); + while (m_threadScoreboard->isRunning()) + { + Sleep(1); + assert( (System::currentTimeMillis() - startShutdown) < 16 ); + } + + delete m_threadScoreboard; + + DeleteCriticalSection(&m_csViewsLock); +} + +int SonyLeaderboardManager::scoreboardThreadEntry(LPVOID lpParam) +{ + ShutdownManager::HasStarted(ShutdownManager::eLeaderboardThread); + SonyLeaderboardManager *self = reinterpret_cast(lpParam); + + self->m_running = true; + app.DebugPrintf("[SonyLeaderboardManager] Thread started.\n"); + + bool needsWriting = false; + do + { + if (self->m_openSessions > 0 || needsWriting) + { + self->scoreboardThreadInternal(); + } + + EnterCriticalSection(&self->m_csViewsLock); + needsWriting = self->m_views.size() > 0; + LeaveCriticalSection(&self->m_csViewsLock); + + // 4J Stu - We can't write while we aren't signed in to live + if (!ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad())) + { + needsWriting = false; + } + + if ( (!needsWriting) && (self->m_eStatsState != eStatsState_Getting) ) + { + Sleep(50); // 4J-JEV: When we're not reading or writing. + } + + } while ( (self->m_running || self->m_eStatsState == eStatsState_Getting || needsWriting) + && ShutdownManager::ShouldRun(ShutdownManager::eLeaderboardThread) + ); + + // 4J-JEV, moved this here so setScore can finish up. + self->destroyTitleContext(self->m_titleContext); + + // TODO sceNpScoreTerm(); + app.DebugPrintf("[SonyLeaderboardManager] Thread closed.\n"); + ShutdownManager::HasFinished(ShutdownManager::eLeaderboardThread); + return 0; +} + +void SonyLeaderboardManager::scoreboardThreadInternal() +{ + // 4J-JEV: Just initialise the context the once now. + if (m_titleContext == -1) + { + int primaryPad = ProfileManager.GetPrimaryPad(); + + if (!ProfileManager.IsSignedInLive(primaryPad)) return; + + int ret = initialiseScoreUtility(); + if (ret < 0) + { + if ( !scoreUtilityAlreadyInitialised(ret) ) + { + app.DebugPrintf("[SonyLeaderboardManager] initialiseScoreUtility() failed. ret = 0x%x\n", ret); + return; + } + else + { + app.DebugPrintf("[SonyLeaderboardManager] initialiseScoreUtility() already initialised, (0x%x)\n", ret); + } + } + + SceNpId npId; + ProfileManager.GetSceNpId(primaryPad,&npId); + + ret = createTitleContext(npId); + + if (ret < 0) return; + else m_titleContext = ret; + } + else assert( m_titleContext > 0 ); //Paranoia + + + switch (m_eStatsState) + { + case eStatsState_Getting: + // Player starts using async multiplayer feature + // 4J-PB - Fix for SCEA FQA #4 - TRC R4064 - Incorrect usage of AsyncMultiplay + // Note 1: + // The following NP call should be reserved for asynchronous multiplayer modes that require PS Plus to be accessed. + // + // Note 2: + // The message is not displayed with a user without PlayStationPlus subscription and they are able to access the Leaderboards. + + // NotifyAsyncPlusFeature(); + + switch(m_eFilterMode) + { + case eFM_MyScore: + case eFM_Friends: + getScoreByIds(); + break; + case eFM_TopRank: + getScoreByRange(); + break; + } + break; + + case eStatsState_Canceled: + case eStatsState_Failed: + case eStatsState_Ready: + case eStatsState_Idle: + + // 4J-JEV: Moved this here, I don't want reading and + // writing going on at the same time. + // -- + // 4J-JEV: Writing no longer changes the manager state, + // we'll manage the write queue seperately. + + EnterCriticalSection(&m_csViewsLock); + bool hasWork = !m_views.empty(); + LeaveCriticalSection(&m_csViewsLock); + + if (hasWork) + { + setScore(); + } + + break; + } +} + +HRESULT SonyLeaderboardManager::fillByIdsQuery(const SceNpId &myNpId, SceNpId* &npIds, uint32_t &len) +{ + HRESULT ret; + + // Get queried users. + switch(m_eFilterMode) + { + case eFM_Friends: + { + // 4J-JEV: Implementation for Orbis & Vita as they a very similar. +#if (defined __ORBIS__) || (defined __PSVITA__) + + sce::Toolkit::NP::Utilities::Future s_friendList; + ret = getFriendsList(s_friendList); + + if(ret != SCE_TOOLKIT_NP_SUCCESS) + { + // Error handling + if (m_eStatsState != eStatsState_Canceled) m_eStatsState = eStatsState_Failed; + app.DebugPrintf("[SonyLeaderboardManager] 'getFriendslist' fail, 0x%x.\n", ret); + return false; + } + else if (s_friendList.hasResult()) + { + // 4J-JEV: Friends list doesn't include player, leave space for them. + len = s_friendList.get()->size() + 1; + + npIds = new SceNpId[len]; + + int i = 0; + + sce::Toolkit::NP::FriendsList::const_iterator itr; + for (itr = s_friendList.get()->begin(); itr != s_friendList.get()->end(); itr++) + { + npIds[i] = itr->npid; + i++; + } + + npIds[len-1] = myNpId; // 4J-JEV: Append player to end of query. + } + else + { + // 4J-JEV: Something terrible must have happend, + // 'getFriendslist' was supposed to be a synchronous operation. + __debugbreak(); + + // 4J-JEV: We can at least fall-back to just the players score. + len = 1; + npIds = new SceNpId[1]; + + npIds[0] = myNpId; + } + +#elif (defined __PS3__) + // PS3 + + // 4J-JEV: Doesn't include the player (its just their friends). + ret = sceNpBasicGetFriendListEntryCount(&len); + len += 1; + + npIds = new SceNpId[len]; + + + for (uint32_t i = 0; i < len-1; i++) + { + ret = sceNpBasicGetFriendListEntry(i, npIds+i); + if (ret<0) return ret; + + } + npIds[len-1] = myNpId; // 4J-JEV: Append player to end of query. + +#endif + } + break; + case eFM_MyScore: + { + len = 1; + npIds = new SceNpId[1]; + npIds[0] = myNpId; + } + break; + } + + return S_OK; +} + +bool SonyLeaderboardManager::getScoreByIds() +{ + if (m_eStatsState == eStatsState_Canceled) return false; + + // ---------------------------- + SonyRtcTick last_sort_date; + SceNpScoreRankNumber mTotalRecord; + + SceNpId *npIds = NULL; + + int ret; + uint32_t num = 0; + + SceNpScorePlayerRankData *ptr; + SceNpScoreComment *comments; + // ---------------------------- + + // Check for invalid LManager state. + assert( m_eFilterMode == eFM_Friends + || m_eFilterMode == eFM_MyScore); + + SceNpId myNpId; + // 4J-PB - should it be user 0? + if(!ProfileManager.IsSignedInLive(0)) + { + app.DebugPrintf("[SonyLeaderboardManager] OpenSession() fail: User isn't signed in to PSN\n"); + return false; + } + ProfileManager.GetSceNpId(0,&myNpId); + + ret = fillByIdsQuery(myNpId, npIds, num); +#ifdef __PS3__ + if (ret < 0) goto error2; +#endif + + ptr = new SceNpScorePlayerRankData[num]; + comments = new SceNpScoreComment[num]; + + ZeroMemory(ptr, sizeof(SceNpScorePlayerRankData) * num); + ZeroMemory(comments, sizeof(SceNpScoreComment) * num); + + /* app.DebugPrintf("sceNpScoreGetRankingByNpId(\n\t transaction=%i,\n\t boardID=0,\n\t npId=%i,\n\t friendCount*sizeof(SceNpId)=%i*%i=%i,\ + rankData=%i,\n\t friendCount*sizeof(SceNpScorePlayerRankData)=%i,\n\t NULL, 0, NULL, 0,\n\t friendCount=%i,\n...\n", + transaction, npId, friendCount, sizeof(SceNpId), friendCount*sizeof(SceNpId), + rankData, friendCount*sizeof(SceNpScorePlayerRankData), friendCount + ); */ + + int boardId = getBoardId(m_difficulty, m_statsType); + + // 4J-JEV: Orbis can only do with 100 ids max, so we use batches. +#ifdef __ORBIS__ + for (int batch=0; batchrankData.scoreValue + ); + + // Sort scores + std::sort(m_scores, m_scores + m_readCount, SortByRank); + + delete [] ptr; + delete [] comments; + delete [] npIds; + + m_eStatsState = eStatsState_Ready; + return true; + + // Error. +error3: + if (ret!=SCE_NP_COMMUNITY_ERROR_ABORTED) //0x8002a109 + destroyTransactionContext(m_requestId); + m_requestId = 0; + delete [] ptr; + delete [] comments; +error2: + if (npIds != NULL) delete [] npIds; +error1: + if (m_eStatsState != eStatsState_Canceled) m_eStatsState = eStatsState_Failed; + app.DebugPrintf("[SonyLeaderboardManager] getScoreByIds() FAILED, ret=0x%X\n", ret); + return false; +} + +bool SonyLeaderboardManager::getScoreByRange() +{ + SonyRtcTick last_sort_date; + SceNpScoreRankNumber mTotalRecord; + + unsigned int num = m_readCount; + SceNpScoreRankData *ptr; + SceNpScoreComment *comments; + + assert(m_eFilterMode == eFM_TopRank); + + int ret = createTransactionContext(m_titleContext); + if (m_eStatsState == eStatsState_Canceled) + { + // Cancel operation has been called, abort. + app.DebugPrintf("[SonyLeaderboardManager]\tgetScoreByRange() - m_eStatsState == eStatsState_Canceled.\n"); + destroyTransactionContext(ret); + return false; + } + else if (ret < 0) + { + // Error occurred creating a transaction, abort. + m_eStatsState = eStatsState_Failed; + app.DebugPrintf("[SonyLeaderboardManager]\tgetScoreByRange() - createTransaction failed, ret=0x%X\n", ret); + return false; + } + else + { + // Transaction created successfully, continue. + m_requestId = ret; + } + + ptr = new SceNpScoreRankData[num]; + comments = new SceNpScoreComment[num]; + + int boardId = getBoardId(m_difficulty, m_statsType); + ret = sceNpScoreGetRankingByRange( + m_requestId, + boardId, // BoardId + + m_startIndex, + + ptr, sizeof(SceNpScoreRankData) * num, //OUT: Rank Data + + comments, sizeof(SceNpScoreComment) * num, //OUT: Comment Data + + NULL, 0, // GameData. + + num, + + &last_sort_date, + &m_maxRank, // 'Total number of players registered in the target scoreboard.' + + NULL // Reserved, specify null. + ); + + if (ret == SCE_NP_COMMUNITY_ERROR_ABORTED) + { + ret = destroyTransactionContext(m_requestId); + app.DebugPrintf("[SonyLeaderboardManager] getScoreByRange(): 'sceNpScoreGetRankingByRange' aborted (0x%X).\n", ret); + + delete [] ptr; + delete [] comments; + + return false; + } + else if (ret == SCE_NP_COMMUNITY_SERVER_ERROR_GAME_RANKING_NOT_FOUND) + { + ret = destroyTransactionContext(m_requestId); + app.DebugPrintf("[SonyLeaderboardManager] getScoreByRange(): Game ranking not found."); + + delete [] ptr; + delete [] comments; + + m_scores = NULL; + m_readCount = 0; + + m_eStatsState = eStatsState_Ready; + return false; + } + else if (ret<0) goto error2; + else + { + app.DebugPrintf("[SonyLeaderboardManager] getScoreByRange(), success, 1stScore=%i.\n", ptr->scoreValue); + } + + // Return. + destroyTransactionContext(m_requestId); + m_requestId = 0; + + //m_stats = ptr; //Maybe: addPadding(num,ptr); + + if (m_scores != NULL) delete [] m_scores; + m_readCount = ret; + m_scores = new ReadScore[m_readCount]; + for (int i=0; i 0) + ret = eStatsReturn_Success; + + if (m_readListener != NULL) + { + app.DebugPrintf("[SonyLeaderboardManager] OnStatsReadComplete(%i, %i, _), m_readCount=%i.\n", ret, m_maxRank, m_readCount); + m_readListener->OnStatsReadComplete(ret, m_maxRank, view); + } + + m_eStatsState = eStatsState_Idle; + + delete [] m_scores; + m_scores = NULL; + } + break; + + case eStatsState_Failed: + { + view.m_numQueries = 0; + view.m_queries = NULL; + + if ( m_readListener != NULL ) + m_readListener->OnStatsReadComplete(eStatsReturn_NetworkError, 0, view); + + m_eStatsState = eStatsState_Idle; + } + break; + + case eStatsState_Canceled: + { + m_eStatsState = eStatsState_Idle; + } + break; + + default: // Getting or Idle. + break; + } +} + +bool SonyLeaderboardManager::OpenSession() +{ + if (m_openSessions == 0) + { + if (m_threadScoreboard == NULL) + { + m_threadScoreboard = new C4JThread(&scoreboardThreadEntry, this, "4JScoreboard"); + m_threadScoreboard->SetProcessor(CPU_CORE_LEADERBOARDS); + m_threadScoreboard->SetPriority(THREAD_PRIORITY_BELOW_NORMAL); + m_threadScoreboard->Run(); + } + + app.DebugPrintf("[SonyLeaderboardManager] OpenSession(): Starting sceNpScore utility.\n"); + } + else + { + app.DebugPrintf("[SonyLeaderboardManager] OpenSession(): Another session opened, total=%i\n", m_openSessions+1); + } + + m_openSessions++; + return true; +} + +void SonyLeaderboardManager::CloseSession() +{ + m_openSessions--; + + if (m_openSessions == 0) app.DebugPrintf("[SonyLeaderboardManager] CloseSession(): Quitting sceNpScore utility.\n"); + else app.DebugPrintf("[SonyLeaderboardManager] CloseSession(): %i sessions still open.\n", m_openSessions); +} + +void SonyLeaderboardManager::DeleteSession() {} + +bool SonyLeaderboardManager::WriteStats(unsigned int viewCount, ViewIn views) +{ + // Need to cancel read/write operation first. + //if (m_eStatsState != eStatsState_Idle) return false; + + // Write relevant parameters. + //RegisterScore *regScore = reinterpret_cast(views); + + EnterCriticalSection(&m_csViewsLock); + for (int i=0; i> (8-dIndex); + + fivebits = (fivebits>>3) & 0x1F; + + if (fivebits < 10) // 0 - 9 + chars[i] = '0' + fivebits; + else if (fivebits < 32) // A - V + chars[i] = 'A' + (fivebits-10); + else + assert(false); + } + + toSymbols( getComment(out) ); +} + +void SonyLeaderboardManager::fromBase32(void *out, SceNpScoreComment *in) +{ + PBYTE bytes = (PBYTE) out; + ZeroMemory(bytes, RECORD_SIZE); + + fromSymbols( getComment(in) ); + + char ch[2] = { 0, 0 }; + for (int i = 0; i < SCE_NP_SCORE_COMMENT_MAXLEN; i++) + { + ch[0] = getComment(in)[i]; + unsigned char fivebits = strtol(ch, NULL, 32) << 3; + + int sByte = (i*5) / 8; + int eByte = (5+(i*5)) / 8; + int dIndex = (i*5) % 8; + + *(bytes + sByte) = *(bytes+sByte) | (fivebits >> dIndex); + + if (eByte != sByte) + *(bytes + eByte) = fivebits << (8-dIndex); + } +} + +char symbBase32[32] = { + ' ', '!','\"', '#', '$', '%', '&','\'', '(', ')', + '*', '+', '`', '-', '.', '/', ':', ';', '<', '=', + '>', '?', '[','\\', ']', '^', '_', '{', '|', '}', + '~', '@' +}; + +char charBase32[32] = { + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', + 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', + 'U', 'V' +}; + +void SonyLeaderboardManager::toSymbols(char *str) +{ + for (int i = 0; i < 63; i++) + { + for (int j=0; j < 32; j++) + { + if (str[i]==charBase32[j]) + str[i] =symbBase32[j]; + } + } +} + +void SonyLeaderboardManager::fromSymbols(char *str) +{ + for (int i = 0; i < 63; i++) + { + for (int j=0; j < 32; j++) + { + if (str[i]==symbBase32[j]) + str[i] =charBase32[j]; + } + } +} + +bool SonyLeaderboardManager::test_string(string testing) +{ +#ifndef _CONTENT_PACKAGE + static SceNpScoreComment comment; + ZeroMemory(&comment, sizeof(SceNpScoreComment)); + memcpy(&comment, testing.c_str(), SCE_NP_SCORE_COMMENT_MAXLEN); + + int ctx = createTransactionContext(m_titleContext); + if (ctx<0) return false; + + int ret = sceNpScoreCensorComment(ctx, (const char *) &comment, NULL); + + if (ret == SCE_NP_COMMUNITY_SERVER_ERROR_CENSORED) + { + app.DebugPrintf("\n[TEST_STRING]: REJECTED "); + } + else if (ret < 0) + { + destroyTransactionContext(ctx); + return false; + } + else + { + app.DebugPrintf("\n[TEST_STRING]: permitted "); + } + + app.DebugPrintf("'%s'\n", getComment(&comment)); + destroyTransactionContext(ctx); + return true; +#else + return true; +#endif +} + +void SonyLeaderboardManager::initReadScoreStruct(ReadScore &out, SceNpScoreRankData &rankData) +{ + ZeroMemory(&out, sizeof(ReadScore)); + + // Init rank and onlineID + out.m_uid.setOnlineID( rankData.npId.handle, true ); + out.m_rank = rankData.rank; + + // Convert to wstring and copy name. + wstring wstrName = convStringToWstring( string(rankData.npId.handle.data) ).c_str(); + //memcpy(&out.m_name, wstrName.c_str(), XUSER_NAME_SIZE); + out.m_name=wstrName; +} + +void SonyLeaderboardManager::fillReadScoreStruct(ReadScore &out, SceNpScoreComment &comment) +{ + StatsData statsData; + fromBase32( (void *) &statsData, &comment ); + + switch (statsData.m_statsType) + { + case eStatsType_Farming: + out.m_statsSize = 6; + out.m_statsData[0] = statsData.m_farming.m_eggs; + out.m_statsData[1] = statsData.m_farming.m_wheat; + out.m_statsData[2] = statsData.m_farming.m_mushroom; + out.m_statsData[3] = statsData.m_farming.m_sugarcane; + out.m_statsData[4] = statsData.m_farming.m_milk; + out.m_statsData[5] = statsData.m_farming.m_pumpkin; + break; + case eStatsType_Mining: + out.m_statsSize = 7; + out.m_statsData[0] = statsData.m_mining.m_dirt; + out.m_statsData[1] = statsData.m_mining.m_cobblestone; + out.m_statsData[2] = statsData.m_mining.m_sand; + out.m_statsData[3] = statsData.m_mining.m_stone; + out.m_statsData[4] = statsData.m_mining.m_gravel; + out.m_statsData[5] = statsData.m_mining.m_clay; + out.m_statsData[6] = statsData.m_mining.m_obsidian; + break; + case eStatsType_Kills: + out.m_statsSize = 7; + out.m_statsData[0] = statsData.m_kills.m_zombie; + out.m_statsData[1] = statsData.m_kills.m_skeleton; + out.m_statsData[2] = statsData.m_kills.m_creeper; + out.m_statsData[3] = statsData.m_kills.m_spider; + out.m_statsData[4] = statsData.m_kills.m_spiderJockey; + out.m_statsData[5] = statsData.m_kills.m_zombiePigman; + out.m_statsData[6] = statsData.m_kills.m_slime; + break; + case eStatsType_Travelling: + out.m_statsSize = 4; + out.m_statsData[0] = statsData.m_travelling.m_walked; + out.m_statsData[1] = statsData.m_travelling.m_fallen; + out.m_statsData[2] = statsData.m_travelling.m_minecart; + out.m_statsData[3] = statsData.m_travelling.m_boat; + break; + } +} + +bool SonyLeaderboardManager::SortByRank(const ReadScore &lhs, const ReadScore &rhs) +{ + return lhs.m_rank < rhs.m_rank; +} diff --git a/Minecraft.Client/Common/Leaderboards/SonyLeaderboardManager.h b/Minecraft.Client/Common/Leaderboards/SonyLeaderboardManager.h new file mode 100644 index 00000000..3b2c26c5 --- /dev/null +++ b/Minecraft.Client/Common/Leaderboards/SonyLeaderboardManager.h @@ -0,0 +1,133 @@ +#pragma once + +#include "Common\Leaderboards\LeaderboardManager.h" + +#ifdef __PS3__ +typedef CellRtcTick SonyRtcTick; +#else +typedef SceRtcTick SonyRtcTick; +#endif + +class SonyLeaderboardManager : public LeaderboardManager +{ +protected: + enum EStatsState + { + eStatsState_Idle, + eStatsState_Getting, + eStatsState_Failed, + eStatsState_Ready, + eStatsState_Canceled, + eStatsState_Max + }; + +public: + SonyLeaderboardManager(); + virtual ~SonyLeaderboardManager(); + +protected: + unsigned short m_openSessions; + + C4JThread *m_threadScoreboard; + bool m_running; + + int m_titleContext; + int32_t m_requestId; + + //SceNpId m_myNpId; + + static int scoreboardThreadEntry(LPVOID lpParam); + void scoreboardThreadInternal(); + + virtual bool getScoreByIds(); + virtual bool getScoreByRange(); + + virtual bool setScore(); + + queue m_views; + + CRITICAL_SECTION m_csViewsLock; + + EStatsState m_eStatsState; //State of the stats read + // EFilterMode m_eFilterMode; + + ReadScore *m_scores; + unsigned int m_maxRank; + //SceNpScoreRankData *m_stats; + +public: + virtual void Tick(); + + //Open a session + virtual bool OpenSession(); + + //Close a session + virtual void CloseSession(); + + //Delete a session + virtual void DeleteSession(); + + //Write the given stats + //This is called synchronously and will not free any memory allocated for views when it is done + + virtual bool WriteStats(unsigned int viewCount, ViewIn views); + + virtual bool ReadStats_Friends(LeaderboardReadListener *callback, int difficulty, EStatsType type, PlayerUID myUID, unsigned int startIndex, unsigned int readCount); + virtual bool ReadStats_MyScore(LeaderboardReadListener *callback, int difficulty, EStatsType type, PlayerUID myUID, unsigned int readCount); + virtual bool ReadStats_TopRank(LeaderboardReadListener *callback, int difficulty, EStatsType type, unsigned int startIndex, unsigned int readCount); + + //Perform a flush of the stats + virtual void FlushStats(); + + //Cancel the current operation + virtual void CancelOperation(); + + //Is the leaderboard manager idle. + virtual bool isIdle(); + +protected: + int getBoardId(int difficulty, EStatsType); + + SceNpScorePlayerRankData *addPadding(unsigned int num, SceNpScoreRankData *rankData); + + void convertToOutput(unsigned int &num, ReadScore *out, SceNpScorePlayerRankData *rankData, SceNpScoreComment *comm); + + void toBinary(void *out, SceNpScoreComment *in); + void fromBinary(SceNpScoreComment **out, void *in); + + void toBase32(SceNpScoreComment *out, void *in); + void fromBase32(void *out, SceNpScoreComment *in); + + void toSymbols(char *); + void fromSymbols(char *); + + bool test_string(string); + + void initReadScoreStruct(ReadScore &out, SceNpScoreRankData &); + void fillReadScoreStruct(ReadScore &out, SceNpScoreComment &comment); + + static bool SortByRank(const ReadScore &lhs, const ReadScore &rhs); + + +protected: + // 4J-JEV: Interface differences: + + // Sce NP score library function redirects. + virtual HRESULT initialiseScoreUtility() { return ERROR_SUCCESS; } + virtual bool scoreUtilityAlreadyInitialised(HRESULT hr) { return false; } + + virtual HRESULT createTitleContext(const SceNpId &npId) = 0; + virtual HRESULT destroyTitleContext(int titleContext) = 0; + + virtual HRESULT createTransactionContext(int titleContext) = 0; + virtual HRESULT abortTransactionContext(int transactionContext) = 0; + virtual HRESULT destroyTransactionContext(int transactionContext) = 0; + + virtual HRESULT fillByIdsQuery(const SceNpId &myNpId, SceNpId* &npIds, uint32_t &len); + +#if (defined __ORBIS__) || (defined __PSVITA__) + virtual HRESULT getFriendsList(sce::Toolkit::NP::Utilities::Future &friendsList) = 0; +#endif + + virtual char * getComment(SceNpScoreComment *comment) = 0; +}; diff --git a/Minecraft.Client/Common/Leaderboards/base64.cpp b/Minecraft.Client/Common/Leaderboards/base64.cpp new file mode 100644 index 00000000..19106cc4 --- /dev/null +++ b/Minecraft.Client/Common/Leaderboards/base64.cpp @@ -0,0 +1,131 @@ +/* + base64.cpp and base64.h + + Copyright (C) 2004-2008 Ren Nyffenegger + + This source code is provided 'as-is', without any express or implied + warranty. In no event will the author be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this source code must not be misrepresented; you must not + claim that you wrote the original source code. If you use this source code + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original source code. + + 3. This notice may not be removed or altered from any source distribution. + + Ren Nyffenegger rene.nyffenegger@adp-gmbh.ch + +*/ + +#include "stdafx.h" + +#include "base64.h" +#include + +static const std::string base64_chars = + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "0123456789+/"; + + +static inline bool is_base64(unsigned char c) { + return (isalnum(c) || (c == '+') || (c == '/')); +} + +// 4J ADDED, +std::string base64_encode(std::string str) +{ + return base64_encode( reinterpret_cast(str.c_str()), str.length() ); +} + +std::string base64_encode(unsigned char const* bytes_to_encode, unsigned int in_len) { + std::string ret; + int i = 0; + int j = 0; + unsigned char char_array_3[3]; + unsigned char char_array_4[4]; + + while (in_len--) { + char_array_3[i++] = *(bytes_to_encode++); + if (i == 3) { + char_array_4[0] = (char_array_3[0] & 0xfc) >> 2; + char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4); + char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6); + char_array_4[3] = char_array_3[2] & 0x3f; + + for(int ii = 0; (ii <4) ; ii++) + ret += base64_chars[char_array_4[ii]]; + i = 0; + } + } + + if (i) + { + for(j = i; j < 3; j++) + char_array_3[j] = '\0'; + + char_array_4[0] = (char_array_3[0] & 0xfc) >> 2; + char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4); + char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6); + char_array_4[3] = char_array_3[2] & 0x3f; + + for (j = 0; (j < i + 1); j++) + ret += base64_chars[char_array_4[j]]; + + while((i++ < 3)) + ret += '='; + + } + + return ret; + +} + +std::string base64_decode(std::string const& encoded_string) { + int in_len = encoded_string.size(); + int i = 0; + int j = 0; + int in_ = 0; + unsigned char char_array_4[4], char_array_3[3]; + std::string ret; + + while (in_len-- && ( encoded_string[in_] != '=') && is_base64(encoded_string[in_])) { + char_array_4[i++] = encoded_string[in_]; in_++; + if (i ==4) { + for (i = 0; i <4; i++) + char_array_4[i] = base64_chars.find(char_array_4[i]); + + char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4); + char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2); + char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3]; + + for (i = 0; (i < 3); i++) + ret += char_array_3[i]; + i = 0; + } + } + + if (i) { + for (j = i; j <4; j++) + char_array_4[j] = 0; + + for (j = 0; j <4; j++) + char_array_4[j] = base64_chars.find(char_array_4[j]); + + char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4); + char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2); + char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3]; + + for (j = 0; (j < i - 1); j++) ret += char_array_3[j]; + } + + return ret; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Leaderboards/base64.h b/Minecraft.Client/Common/Leaderboards/base64.h new file mode 100644 index 00000000..7f6a1e49 --- /dev/null +++ b/Minecraft.Client/Common/Leaderboards/base64.h @@ -0,0 +1,7 @@ +#pragma once + +#include + +std::string base64_encode(std::string str); +std::string base64_encode(unsigned char const* , unsigned int len); +std::string base64_decode(std::string const& s); \ No newline at end of file diff --git a/Minecraft.Client/Common/Media/4J_strings.resx b/Minecraft.Client/Common/Media/4J_strings.resx new file mode 100644 index 00000000..ecafab86 --- /dev/null +++ b/Minecraft.Client/Common/Media/4J_strings.resx @@ -0,0 +1,171 @@ + + + + Not Used + + + + OK + + + Back + + + Cancel + + + Yes + + + No + + + Corrupt Save + + + Your save data appears to be corrupt. Create a new save and overwrite the corrupt one? + + + No Free Space + + + Your selected storage device doesn't have enough free space to create a game save. + + + Select again + + + Play without saving + + + Create a new save + + + Overwrite save? + + + Your selected storage device already contains this save. Is it OK to overwrite it? + + + No - don't overwrite + + + Overwrite and save + + + Save failed + + + Storage Device Problem + + + Your storage device is unavailable or has an error + + + Your storage device is unavailable or has an error. Please select a new storage device. + + + Select a new storage device + + + No storage device selected + + + If you do not select a storage device, game saves will be disabled + + + Select a storage device + + + Continue without saving + + + Your storage device has been removed. Please select a new one. + + + Loading failed + + + Name the save + + + Enter a name for your savegame + + + Return to Xbox Dashboard + + + Are you sure you want to exit the game? + + + + Signed out + + + You have been returned to the title screen because your gamer profile was signed out + + + The match has ended because a gamer profile was signed out + + + Continue playing + + + + Gamer profile not online + + + This game has some features which require an Xbox Live enabled gamer profile, but you are currently offline. + + + This feature requires a gamer profile which is signed into Xbox Live. + + + Connect to Xbox Live + + + Continue playing offline + + + + + Achievement Award Problem + + + There was a problem accessing your gamer profile. Your achievement could not be awarded at this time. + + + + + Gamer profile problem + + + Saving of settings to gamer profile has failed. + + + + Guest Gamer Profile + + + Guest gamer profile cannot access this feature. Please use a different gamer profile. + + + + Saving… + + + Saving content. Please don't turn off your console. + + + Unlock Full Game + + + This is the Minecraft trial game. If you had the full game, you would just have earned an achievement! +Unlock the full game to experience the joy of Minecraft and to play with your friends across the globe through Xbox Live. +Would you like to unlock the full game? + + + You are being returned to the main menu because of a problem reading your profile. + + + diff --git a/Minecraft.Client/Common/Media/AnvilMenu1080.swf b/Minecraft.Client/Common/Media/AnvilMenu1080.swf new file mode 100644 index 00000000..1776eda9 Binary files /dev/null and b/Minecraft.Client/Common/Media/AnvilMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/AnvilMenu480.swf b/Minecraft.Client/Common/Media/AnvilMenu480.swf new file mode 100644 index 00000000..21a2533b Binary files /dev/null and b/Minecraft.Client/Common/Media/AnvilMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/AnvilMenu720.swf b/Minecraft.Client/Common/Media/AnvilMenu720.swf new file mode 100644 index 00000000..76492f7c Binary files /dev/null and b/Minecraft.Client/Common/Media/AnvilMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/AnvilMenuSplit1080.swf b/Minecraft.Client/Common/Media/AnvilMenuSplit1080.swf new file mode 100644 index 00000000..3830d0c1 Binary files /dev/null and b/Minecraft.Client/Common/Media/AnvilMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/AnvilMenuSplit720.swf b/Minecraft.Client/Common/Media/AnvilMenuSplit720.swf new file mode 100644 index 00000000..68539765 Binary files /dev/null and b/Minecraft.Client/Common/Media/AnvilMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/AnvilMenuVita.swf b/Minecraft.Client/Common/Media/AnvilMenuVita.swf new file mode 100644 index 00000000..d35a6f3b Binary files /dev/null and b/Minecraft.Client/Common/Media/AnvilMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/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/BrewingStandMenu1080.swf b/Minecraft.Client/Common/Media/BrewingStandMenu1080.swf new file mode 100644 index 00000000..0aa8d2d3 Binary files /dev/null and b/Minecraft.Client/Common/Media/BrewingStandMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/BrewingStandMenu480.swf b/Minecraft.Client/Common/Media/BrewingStandMenu480.swf new file mode 100644 index 00000000..000dfe02 Binary files /dev/null and b/Minecraft.Client/Common/Media/BrewingStandMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/BrewingStandMenu720.swf b/Minecraft.Client/Common/Media/BrewingStandMenu720.swf new file mode 100644 index 00000000..178b3e16 Binary files /dev/null and b/Minecraft.Client/Common/Media/BrewingStandMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/BrewingStandMenuSplit1080.swf b/Minecraft.Client/Common/Media/BrewingStandMenuSplit1080.swf new file mode 100644 index 00000000..71e95d90 Binary files /dev/null and b/Minecraft.Client/Common/Media/BrewingStandMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/BrewingStandMenuSplit720.swf b/Minecraft.Client/Common/Media/BrewingStandMenuSplit720.swf new file mode 100644 index 00000000..97a9c6f0 Binary files /dev/null and b/Minecraft.Client/Common/Media/BrewingStandMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/BrewingStandMenuVita.swf b/Minecraft.Client/Common/Media/BrewingStandMenuVita.swf new file mode 100644 index 00000000..8d1d0e44 Binary files /dev/null and b/Minecraft.Client/Common/Media/BrewingStandMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/ChestLargeMenu1080.swf b/Minecraft.Client/Common/Media/ChestLargeMenu1080.swf new file mode 100644 index 00000000..951a5633 Binary files /dev/null and b/Minecraft.Client/Common/Media/ChestLargeMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/ChestLargeMenu480.swf b/Minecraft.Client/Common/Media/ChestLargeMenu480.swf new file mode 100644 index 00000000..9fcdf7e1 Binary files /dev/null and b/Minecraft.Client/Common/Media/ChestLargeMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/ChestLargeMenu720.swf b/Minecraft.Client/Common/Media/ChestLargeMenu720.swf new file mode 100644 index 00000000..ad21db18 Binary files /dev/null and b/Minecraft.Client/Common/Media/ChestLargeMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/ChestLargeMenuSplit1080.swf b/Minecraft.Client/Common/Media/ChestLargeMenuSplit1080.swf new file mode 100644 index 00000000..ab687d9b Binary files /dev/null and b/Minecraft.Client/Common/Media/ChestLargeMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/ChestLargeMenuSplit720.swf b/Minecraft.Client/Common/Media/ChestLargeMenuSplit720.swf new file mode 100644 index 00000000..c38cdada Binary files /dev/null and b/Minecraft.Client/Common/Media/ChestLargeMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/ChestLargeMenuVita.swf b/Minecraft.Client/Common/Media/ChestLargeMenuVita.swf new file mode 100644 index 00000000..6e8795dd Binary files /dev/null and b/Minecraft.Client/Common/Media/ChestLargeMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/ChestMenu1080.swf b/Minecraft.Client/Common/Media/ChestMenu1080.swf new file mode 100644 index 00000000..6f1672e0 Binary files /dev/null and b/Minecraft.Client/Common/Media/ChestMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/ChestMenu480.swf b/Minecraft.Client/Common/Media/ChestMenu480.swf new file mode 100644 index 00000000..89f13de5 Binary files /dev/null and b/Minecraft.Client/Common/Media/ChestMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/ChestMenu720.swf b/Minecraft.Client/Common/Media/ChestMenu720.swf new file mode 100644 index 00000000..c4b694ec Binary files /dev/null and b/Minecraft.Client/Common/Media/ChestMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/ChestMenuSplit1080.swf b/Minecraft.Client/Common/Media/ChestMenuSplit1080.swf new file mode 100644 index 00000000..3b2d3d84 Binary files /dev/null and b/Minecraft.Client/Common/Media/ChestMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/ChestMenuSplit720.swf b/Minecraft.Client/Common/Media/ChestMenuSplit720.swf new file mode 100644 index 00000000..5ca9b178 Binary files /dev/null and b/Minecraft.Client/Common/Media/ChestMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/ChestMenuVita.swf b/Minecraft.Client/Common/Media/ChestMenuVita.swf new file mode 100644 index 00000000..63e76142 Binary files /dev/null and b/Minecraft.Client/Common/Media/ChestMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/ComponentLogo1080.swf b/Minecraft.Client/Common/Media/ComponentLogo1080.swf new file mode 100644 index 00000000..9e93b929 Binary files /dev/null and b/Minecraft.Client/Common/Media/ComponentLogo1080.swf differ diff --git a/Minecraft.Client/Common/Media/ComponentLogo480.swf b/Minecraft.Client/Common/Media/ComponentLogo480.swf new file mode 100644 index 00000000..037a51f4 Binary files /dev/null and b/Minecraft.Client/Common/Media/ComponentLogo480.swf differ diff --git a/Minecraft.Client/Common/Media/ComponentLogo720.swf b/Minecraft.Client/Common/Media/ComponentLogo720.swf new file mode 100644 index 00000000..3e65120f Binary files /dev/null and b/Minecraft.Client/Common/Media/ComponentLogo720.swf differ diff --git a/Minecraft.Client/Common/Media/ComponentLogoSplit1080.swf b/Minecraft.Client/Common/Media/ComponentLogoSplit1080.swf new file mode 100644 index 00000000..b3c19b34 Binary files /dev/null and b/Minecraft.Client/Common/Media/ComponentLogoSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/ComponentLogoSplit720.swf b/Minecraft.Client/Common/Media/ComponentLogoSplit720.swf new file mode 100644 index 00000000..982fc19b Binary files /dev/null and b/Minecraft.Client/Common/Media/ComponentLogoSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/ComponentLogoVita.swf b/Minecraft.Client/Common/Media/ComponentLogoVita.swf new file mode 100644 index 00000000..d1d8e5a4 Binary files /dev/null and b/Minecraft.Client/Common/Media/ComponentLogoVita.swf differ diff --git a/Minecraft.Client/Common/Media/Controls1080.swf b/Minecraft.Client/Common/Media/Controls1080.swf new file mode 100644 index 00000000..9ec38f92 Binary files /dev/null and b/Minecraft.Client/Common/Media/Controls1080.swf differ diff --git a/Minecraft.Client/Common/Media/Controls480.swf b/Minecraft.Client/Common/Media/Controls480.swf new file mode 100644 index 00000000..5785e2c6 Binary files /dev/null and b/Minecraft.Client/Common/Media/Controls480.swf differ diff --git a/Minecraft.Client/Common/Media/Controls720.swf b/Minecraft.Client/Common/Media/Controls720.swf new file mode 100644 index 00000000..61eb9c83 Binary files /dev/null and b/Minecraft.Client/Common/Media/Controls720.swf differ diff --git a/Minecraft.Client/Common/Media/ControlsRemotePlay1080.swf b/Minecraft.Client/Common/Media/ControlsRemotePlay1080.swf new file mode 100644 index 00000000..a1d21f0f Binary files /dev/null and b/Minecraft.Client/Common/Media/ControlsRemotePlay1080.swf differ diff --git a/Minecraft.Client/Common/Media/ControlsSplit1080.swf b/Minecraft.Client/Common/Media/ControlsSplit1080.swf new file mode 100644 index 00000000..e7c1c971 Binary files /dev/null and b/Minecraft.Client/Common/Media/ControlsSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/ControlsSplit720.swf b/Minecraft.Client/Common/Media/ControlsSplit720.swf new file mode 100644 index 00000000..8f657ac9 Binary files /dev/null and b/Minecraft.Client/Common/Media/ControlsSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/ControlsTVVita.swf b/Minecraft.Client/Common/Media/ControlsTVVita.swf new file mode 100644 index 00000000..32488a79 Binary files /dev/null and b/Minecraft.Client/Common/Media/ControlsTVVita.swf differ diff --git a/Minecraft.Client/Common/Media/ControlsVita.swf b/Minecraft.Client/Common/Media/ControlsVita.swf new file mode 100644 index 00000000..a3b37256 Binary files /dev/null and b/Minecraft.Client/Common/Media/ControlsVita.swf differ diff --git a/Minecraft.Client/Common/Media/Crafting2x2Menu1080.swf b/Minecraft.Client/Common/Media/Crafting2x2Menu1080.swf new file mode 100644 index 00000000..e462de70 Binary files /dev/null and b/Minecraft.Client/Common/Media/Crafting2x2Menu1080.swf differ diff --git a/Minecraft.Client/Common/Media/Crafting2x2Menu480.swf b/Minecraft.Client/Common/Media/Crafting2x2Menu480.swf new file mode 100644 index 00000000..0a6047d9 Binary files /dev/null and b/Minecraft.Client/Common/Media/Crafting2x2Menu480.swf differ diff --git a/Minecraft.Client/Common/Media/Crafting2x2Menu720.swf b/Minecraft.Client/Common/Media/Crafting2x2Menu720.swf new file mode 100644 index 00000000..6a2a0aae Binary files /dev/null and b/Minecraft.Client/Common/Media/Crafting2x2Menu720.swf differ diff --git a/Minecraft.Client/Common/Media/Crafting2x2MenuSplit1080.swf b/Minecraft.Client/Common/Media/Crafting2x2MenuSplit1080.swf new file mode 100644 index 00000000..5e427387 Binary files /dev/null and b/Minecraft.Client/Common/Media/Crafting2x2MenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/Crafting2x2MenuSplit720.swf b/Minecraft.Client/Common/Media/Crafting2x2MenuSplit720.swf new file mode 100644 index 00000000..a50730af Binary files /dev/null and b/Minecraft.Client/Common/Media/Crafting2x2MenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/Crafting2x2MenuVita.swf b/Minecraft.Client/Common/Media/Crafting2x2MenuVita.swf new file mode 100644 index 00000000..27a0b580 Binary files /dev/null and b/Minecraft.Client/Common/Media/Crafting2x2MenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/Crafting3x3Menu1080.swf b/Minecraft.Client/Common/Media/Crafting3x3Menu1080.swf new file mode 100644 index 00000000..4d4d4255 Binary files /dev/null and b/Minecraft.Client/Common/Media/Crafting3x3Menu1080.swf differ diff --git a/Minecraft.Client/Common/Media/Crafting3x3Menu480.swf b/Minecraft.Client/Common/Media/Crafting3x3Menu480.swf new file mode 100644 index 00000000..00f03d75 Binary files /dev/null and b/Minecraft.Client/Common/Media/Crafting3x3Menu480.swf differ diff --git a/Minecraft.Client/Common/Media/Crafting3x3Menu720.swf b/Minecraft.Client/Common/Media/Crafting3x3Menu720.swf new file mode 100644 index 00000000..e7888d13 Binary files /dev/null and b/Minecraft.Client/Common/Media/Crafting3x3Menu720.swf differ diff --git a/Minecraft.Client/Common/Media/Crafting3x3MenuSplit1080.swf b/Minecraft.Client/Common/Media/Crafting3x3MenuSplit1080.swf new file mode 100644 index 00000000..155db47e Binary files /dev/null and b/Minecraft.Client/Common/Media/Crafting3x3MenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/Crafting3x3MenuSplit720.swf b/Minecraft.Client/Common/Media/Crafting3x3MenuSplit720.swf new file mode 100644 index 00000000..f2224ec8 Binary files /dev/null and b/Minecraft.Client/Common/Media/Crafting3x3MenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/Crafting3x3MenuVita.swf b/Minecraft.Client/Common/Media/Crafting3x3MenuVita.swf new file mode 100644 index 00000000..09a25f7e Binary files /dev/null and b/Minecraft.Client/Common/Media/Crafting3x3MenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/CreateWorldMenu1080.swf b/Minecraft.Client/Common/Media/CreateWorldMenu1080.swf new file mode 100644 index 00000000..282c51f8 Binary files /dev/null and b/Minecraft.Client/Common/Media/CreateWorldMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/CreateWorldMenu480.swf b/Minecraft.Client/Common/Media/CreateWorldMenu480.swf new file mode 100644 index 00000000..2773341d Binary files /dev/null and b/Minecraft.Client/Common/Media/CreateWorldMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/CreateWorldMenu720.swf b/Minecraft.Client/Common/Media/CreateWorldMenu720.swf new file mode 100644 index 00000000..985ef7a1 Binary files /dev/null and b/Minecraft.Client/Common/Media/CreateWorldMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/CreateWorldMenuVita.swf b/Minecraft.Client/Common/Media/CreateWorldMenuVita.swf new file mode 100644 index 00000000..f7fe1071 Binary files /dev/null and b/Minecraft.Client/Common/Media/CreateWorldMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/CreativeMenu1080.swf b/Minecraft.Client/Common/Media/CreativeMenu1080.swf new file mode 100644 index 00000000..cdd0b9de Binary files /dev/null and b/Minecraft.Client/Common/Media/CreativeMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/CreativeMenu480.swf b/Minecraft.Client/Common/Media/CreativeMenu480.swf new file mode 100644 index 00000000..4f6094b2 Binary files /dev/null and b/Minecraft.Client/Common/Media/CreativeMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/CreativeMenu720.swf b/Minecraft.Client/Common/Media/CreativeMenu720.swf new file mode 100644 index 00000000..04cb96f6 Binary files /dev/null and b/Minecraft.Client/Common/Media/CreativeMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/CreativeMenuSplit1080.swf b/Minecraft.Client/Common/Media/CreativeMenuSplit1080.swf new file mode 100644 index 00000000..51bab154 Binary files /dev/null and b/Minecraft.Client/Common/Media/CreativeMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/CreativeMenuSplit720.swf b/Minecraft.Client/Common/Media/CreativeMenuSplit720.swf new file mode 100644 index 00000000..b0a06ceb Binary files /dev/null and b/Minecraft.Client/Common/Media/CreativeMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/CreativeMenuVita.swf b/Minecraft.Client/Common/Media/CreativeMenuVita.swf new file mode 100644 index 00000000..01797a06 Binary files /dev/null and b/Minecraft.Client/Common/Media/CreativeMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/Credits1080.swf b/Minecraft.Client/Common/Media/Credits1080.swf new file mode 100644 index 00000000..20b2027e Binary files /dev/null and b/Minecraft.Client/Common/Media/Credits1080.swf differ diff --git a/Minecraft.Client/Common/Media/Credits480.swf b/Minecraft.Client/Common/Media/Credits480.swf new file mode 100644 index 00000000..3bfee952 Binary files /dev/null and b/Minecraft.Client/Common/Media/Credits480.swf differ diff --git a/Minecraft.Client/Common/Media/Credits720.swf b/Minecraft.Client/Common/Media/Credits720.swf new file mode 100644 index 00000000..9396df05 Binary files /dev/null and b/Minecraft.Client/Common/Media/Credits720.swf differ diff --git a/Minecraft.Client/Common/Media/CreditsVita.swf b/Minecraft.Client/Common/Media/CreditsVita.swf new file mode 100644 index 00000000..aa877899 Binary files /dev/null and b/Minecraft.Client/Common/Media/CreditsVita.swf differ diff --git a/Minecraft.Client/Common/Media/DLCMainMenu1080.swf b/Minecraft.Client/Common/Media/DLCMainMenu1080.swf new file mode 100644 index 00000000..5d7e40fa Binary files /dev/null and b/Minecraft.Client/Common/Media/DLCMainMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/DLCMainMenu480.swf b/Minecraft.Client/Common/Media/DLCMainMenu480.swf new file mode 100644 index 00000000..3697b7c4 Binary files /dev/null and b/Minecraft.Client/Common/Media/DLCMainMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/DLCMainMenu720.swf b/Minecraft.Client/Common/Media/DLCMainMenu720.swf new file mode 100644 index 00000000..512301ec Binary files /dev/null and b/Minecraft.Client/Common/Media/DLCMainMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/DLCMainMenuVita.swf b/Minecraft.Client/Common/Media/DLCMainMenuVita.swf new file mode 100644 index 00000000..145a7194 Binary files /dev/null and b/Minecraft.Client/Common/Media/DLCMainMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/DLCOffersMenu1080.swf b/Minecraft.Client/Common/Media/DLCOffersMenu1080.swf new file mode 100644 index 00000000..07094b53 Binary files /dev/null and b/Minecraft.Client/Common/Media/DLCOffersMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/DLCOffersMenu480.swf b/Minecraft.Client/Common/Media/DLCOffersMenu480.swf new file mode 100644 index 00000000..7ceb2c8f Binary files /dev/null and b/Minecraft.Client/Common/Media/DLCOffersMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/DLCOffersMenu720.swf b/Minecraft.Client/Common/Media/DLCOffersMenu720.swf new file mode 100644 index 00000000..aabfdfef Binary files /dev/null and b/Minecraft.Client/Common/Media/DLCOffersMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/DLCOffersMenuVita.swf b/Minecraft.Client/Common/Media/DLCOffersMenuVita.swf new file mode 100644 index 00000000..9dfa6d89 Binary files /dev/null and b/Minecraft.Client/Common/Media/DLCOffersMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/DeathMenu1080.swf b/Minecraft.Client/Common/Media/DeathMenu1080.swf new file mode 100644 index 00000000..10c097dd Binary files /dev/null and b/Minecraft.Client/Common/Media/DeathMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/DeathMenu480.swf b/Minecraft.Client/Common/Media/DeathMenu480.swf new file mode 100644 index 00000000..1faa7a04 Binary files /dev/null and b/Minecraft.Client/Common/Media/DeathMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/DeathMenu720.swf b/Minecraft.Client/Common/Media/DeathMenu720.swf new file mode 100644 index 00000000..c9e323dc Binary files /dev/null and b/Minecraft.Client/Common/Media/DeathMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/DeathMenuSplit1080.swf b/Minecraft.Client/Common/Media/DeathMenuSplit1080.swf new file mode 100644 index 00000000..b9aba4c0 Binary files /dev/null and b/Minecraft.Client/Common/Media/DeathMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/DeathMenuSplit720.swf b/Minecraft.Client/Common/Media/DeathMenuSplit720.swf new file mode 100644 index 00000000..fd912891 Binary files /dev/null and b/Minecraft.Client/Common/Media/DeathMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/DeathMenuVita.swf b/Minecraft.Client/Common/Media/DeathMenuVita.swf new file mode 100644 index 00000000..08fb19ec Binary files /dev/null and b/Minecraft.Client/Common/Media/DeathMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/DebugCreateSchematic1080.swf b/Minecraft.Client/Common/Media/DebugCreateSchematic1080.swf new file mode 100644 index 00000000..191bbddd Binary files /dev/null and b/Minecraft.Client/Common/Media/DebugCreateSchematic1080.swf differ diff --git a/Minecraft.Client/Common/Media/DebugCreateSchematic720.swf b/Minecraft.Client/Common/Media/DebugCreateSchematic720.swf new file mode 100644 index 00000000..f7f59c57 Binary files /dev/null and b/Minecraft.Client/Common/Media/DebugCreateSchematic720.swf differ diff --git a/Minecraft.Client/Common/Media/DebugMenu1080.swf b/Minecraft.Client/Common/Media/DebugMenu1080.swf new file mode 100644 index 00000000..f9de2197 Binary files /dev/null and b/Minecraft.Client/Common/Media/DebugMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/DebugMenu720.swf b/Minecraft.Client/Common/Media/DebugMenu720.swf new file mode 100644 index 00000000..0bf908b6 Binary files /dev/null and b/Minecraft.Client/Common/Media/DebugMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/DebugOptionsMenu1080.swf b/Minecraft.Client/Common/Media/DebugOptionsMenu1080.swf new file mode 100644 index 00000000..62c663a6 Binary files /dev/null and b/Minecraft.Client/Common/Media/DebugOptionsMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/DebugOptionsMenu720.swf b/Minecraft.Client/Common/Media/DebugOptionsMenu720.swf new file mode 100644 index 00000000..a22e81b2 Binary files /dev/null and b/Minecraft.Client/Common/Media/DebugOptionsMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/DebugSetCamera1080.swf b/Minecraft.Client/Common/Media/DebugSetCamera1080.swf new file mode 100644 index 00000000..093b1b8e Binary files /dev/null and b/Minecraft.Client/Common/Media/DebugSetCamera1080.swf differ diff --git a/Minecraft.Client/Common/Media/DebugSetCamera720.swf b/Minecraft.Client/Common/Media/DebugSetCamera720.swf new file mode 100644 index 00000000..6505d3f0 Binary files /dev/null and b/Minecraft.Client/Common/Media/DebugSetCamera720.swf differ diff --git a/Minecraft.Client/Common/Media/DebugUIConsoleComponent1080.swf b/Minecraft.Client/Common/Media/DebugUIConsoleComponent1080.swf new file mode 100644 index 00000000..51c1c0ea Binary files /dev/null and b/Minecraft.Client/Common/Media/DebugUIConsoleComponent1080.swf differ diff --git a/Minecraft.Client/Common/Media/DebugUIConsoleComponent720.swf b/Minecraft.Client/Common/Media/DebugUIConsoleComponent720.swf new file mode 100644 index 00000000..430060d6 Binary files /dev/null and b/Minecraft.Client/Common/Media/DebugUIConsoleComponent720.swf differ diff --git a/Minecraft.Client/Common/Media/DebugUIMarketingGuide1080.swf b/Minecraft.Client/Common/Media/DebugUIMarketingGuide1080.swf new file mode 100644 index 00000000..7406ae55 Binary files /dev/null and b/Minecraft.Client/Common/Media/DebugUIMarketingGuide1080.swf differ diff --git a/Minecraft.Client/Common/Media/DebugUIMarketingGuide720.swf b/Minecraft.Client/Common/Media/DebugUIMarketingGuide720.swf new file mode 100644 index 00000000..945020ec Binary files /dev/null and b/Minecraft.Client/Common/Media/DebugUIMarketingGuide720.swf differ diff --git a/Minecraft.Client/Common/Media/DispenserMenu1080.swf b/Minecraft.Client/Common/Media/DispenserMenu1080.swf new file mode 100644 index 00000000..1833b868 Binary files /dev/null and b/Minecraft.Client/Common/Media/DispenserMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/DispenserMenu480.swf b/Minecraft.Client/Common/Media/DispenserMenu480.swf new file mode 100644 index 00000000..cdd1d587 Binary files /dev/null and b/Minecraft.Client/Common/Media/DispenserMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/DispenserMenu720.swf b/Minecraft.Client/Common/Media/DispenserMenu720.swf new file mode 100644 index 00000000..28d8664c Binary files /dev/null and b/Minecraft.Client/Common/Media/DispenserMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/DispenserMenuSplit1080.swf b/Minecraft.Client/Common/Media/DispenserMenuSplit1080.swf new file mode 100644 index 00000000..4619e30a Binary files /dev/null and b/Minecraft.Client/Common/Media/DispenserMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/DispenserMenuSplit720.swf b/Minecraft.Client/Common/Media/DispenserMenuSplit720.swf new file mode 100644 index 00000000..9e0af4b4 Binary files /dev/null and b/Minecraft.Client/Common/Media/DispenserMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/DispenserMenuVita.swf b/Minecraft.Client/Common/Media/DispenserMenuVita.swf new file mode 100644 index 00000000..fcf62ed2 Binary files /dev/null and b/Minecraft.Client/Common/Media/DispenserMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/EULA1080.swf b/Minecraft.Client/Common/Media/EULA1080.swf new file mode 100644 index 00000000..f05c71ed Binary files /dev/null and b/Minecraft.Client/Common/Media/EULA1080.swf differ diff --git a/Minecraft.Client/Common/Media/EULA480.swf b/Minecraft.Client/Common/Media/EULA480.swf new file mode 100644 index 00000000..fc079444 Binary files /dev/null and b/Minecraft.Client/Common/Media/EULA480.swf differ diff --git a/Minecraft.Client/Common/Media/EULA720.swf b/Minecraft.Client/Common/Media/EULA720.swf new file mode 100644 index 00000000..2deba6fd Binary files /dev/null and b/Minecraft.Client/Common/Media/EULA720.swf differ diff --git a/Minecraft.Client/Common/Media/EULAVita.swf b/Minecraft.Client/Common/Media/EULAVita.swf new file mode 100644 index 00000000..525ad6d5 Binary files /dev/null and b/Minecraft.Client/Common/Media/EULAVita.swf differ diff --git a/Minecraft.Client/Common/Media/EnchantingMenu1080.swf b/Minecraft.Client/Common/Media/EnchantingMenu1080.swf new file mode 100644 index 00000000..c86b678b Binary files /dev/null and b/Minecraft.Client/Common/Media/EnchantingMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/EnchantingMenu480.swf b/Minecraft.Client/Common/Media/EnchantingMenu480.swf new file mode 100644 index 00000000..eeee87ad Binary files /dev/null and b/Minecraft.Client/Common/Media/EnchantingMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/EnchantingMenu720.swf b/Minecraft.Client/Common/Media/EnchantingMenu720.swf new file mode 100644 index 00000000..f309fec9 Binary files /dev/null and b/Minecraft.Client/Common/Media/EnchantingMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/EnchantingMenuSplit1080.swf b/Minecraft.Client/Common/Media/EnchantingMenuSplit1080.swf new file mode 100644 index 00000000..31078758 Binary files /dev/null and b/Minecraft.Client/Common/Media/EnchantingMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/EnchantingMenuSplit720.swf b/Minecraft.Client/Common/Media/EnchantingMenuSplit720.swf new file mode 100644 index 00000000..e1e9aaa4 Binary files /dev/null and b/Minecraft.Client/Common/Media/EnchantingMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/EnchantingMenuVita.swf b/Minecraft.Client/Common/Media/EnchantingMenuVita.swf new file mode 100644 index 00000000..14a91482 Binary files /dev/null and b/Minecraft.Client/Common/Media/EnchantingMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/EndPoem1080.swf b/Minecraft.Client/Common/Media/EndPoem1080.swf new file mode 100644 index 00000000..64ca91eb Binary files /dev/null and b/Minecraft.Client/Common/Media/EndPoem1080.swf differ diff --git a/Minecraft.Client/Common/Media/EndPoem480.swf b/Minecraft.Client/Common/Media/EndPoem480.swf new file mode 100644 index 00000000..a957a040 Binary files /dev/null and b/Minecraft.Client/Common/Media/EndPoem480.swf differ diff --git a/Minecraft.Client/Common/Media/EndPoem720.swf b/Minecraft.Client/Common/Media/EndPoem720.swf new file mode 100644 index 00000000..d985e66a Binary files /dev/null and b/Minecraft.Client/Common/Media/EndPoem720.swf differ diff --git a/Minecraft.Client/Common/Media/EndPoemVita.swf b/Minecraft.Client/Common/Media/EndPoemVita.swf new file mode 100644 index 00000000..26f37bf9 Binary files /dev/null and b/Minecraft.Client/Common/Media/EndPoemVita.swf differ diff --git a/Minecraft.Client/Common/Media/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/FullscreenProgress1080.swf b/Minecraft.Client/Common/Media/FullscreenProgress1080.swf new file mode 100644 index 00000000..2f2f85be Binary files /dev/null and b/Minecraft.Client/Common/Media/FullscreenProgress1080.swf differ diff --git a/Minecraft.Client/Common/Media/FullscreenProgress480.swf b/Minecraft.Client/Common/Media/FullscreenProgress480.swf new file mode 100644 index 00000000..4e2ccb6c Binary files /dev/null and b/Minecraft.Client/Common/Media/FullscreenProgress480.swf differ diff --git a/Minecraft.Client/Common/Media/FullscreenProgress720.swf b/Minecraft.Client/Common/Media/FullscreenProgress720.swf new file mode 100644 index 00000000..39250572 Binary files /dev/null and b/Minecraft.Client/Common/Media/FullscreenProgress720.swf differ diff --git a/Minecraft.Client/Common/Media/FullscreenProgressSplit1080.swf b/Minecraft.Client/Common/Media/FullscreenProgressSplit1080.swf new file mode 100644 index 00000000..811c2dea Binary files /dev/null and b/Minecraft.Client/Common/Media/FullscreenProgressSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/FullscreenProgressSplit720.swf b/Minecraft.Client/Common/Media/FullscreenProgressSplit720.swf new file mode 100644 index 00000000..1daa0eab Binary files /dev/null and b/Minecraft.Client/Common/Media/FullscreenProgressSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/FullscreenProgressVita.swf b/Minecraft.Client/Common/Media/FullscreenProgressVita.swf new file mode 100644 index 00000000..a15a2e3e Binary files /dev/null and b/Minecraft.Client/Common/Media/FullscreenProgressVita.swf differ diff --git a/Minecraft.Client/Common/Media/FurnaceMenu1080.swf b/Minecraft.Client/Common/Media/FurnaceMenu1080.swf new file mode 100644 index 00000000..e21c3dea Binary files /dev/null and b/Minecraft.Client/Common/Media/FurnaceMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/FurnaceMenu480.swf b/Minecraft.Client/Common/Media/FurnaceMenu480.swf new file mode 100644 index 00000000..802e7940 Binary files /dev/null and b/Minecraft.Client/Common/Media/FurnaceMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/FurnaceMenu720.swf b/Minecraft.Client/Common/Media/FurnaceMenu720.swf new file mode 100644 index 00000000..f0e76da3 Binary files /dev/null and b/Minecraft.Client/Common/Media/FurnaceMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/FurnaceMenuSplit1080.swf b/Minecraft.Client/Common/Media/FurnaceMenuSplit1080.swf new file mode 100644 index 00000000..0b78826e Binary files /dev/null and b/Minecraft.Client/Common/Media/FurnaceMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/FurnaceMenuSplit720.swf b/Minecraft.Client/Common/Media/FurnaceMenuSplit720.swf new file mode 100644 index 00000000..b9fe506b Binary files /dev/null and b/Minecraft.Client/Common/Media/FurnaceMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/FurnaceMenuVita.swf b/Minecraft.Client/Common/Media/FurnaceMenuVita.swf new file mode 100644 index 00000000..25d6d8ec Binary files /dev/null and b/Minecraft.Client/Common/Media/FurnaceMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/GamertagSplit720.swf b/Minecraft.Client/Common/Media/GamertagSplit720.swf new file mode 100644 index 00000000..0373d5a6 Binary files /dev/null and b/Minecraft.Client/Common/Media/GamertagSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/Graphics/AnvilCross.png b/Minecraft.Client/Common/Media/Graphics/AnvilCross.png new file mode 100644 index 00000000..6e78dfaf Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/AnvilCross.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/AnvilHammer.png b/Minecraft.Client/Common/Media/Graphics/AnvilHammer.png new file mode 100644 index 00000000..94ec647c Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/AnvilHammer.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/AnvilPlus.png b/Minecraft.Client/Common/Media/Graphics/AnvilPlus.png new file mode 100644 index 00000000..261176d2 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/AnvilPlus.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Armour_Slot_Body.png b/Minecraft.Client/Common/Media/Graphics/Armour_Slot_Body.png new file mode 100644 index 00000000..c1fbf884 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Armour_Slot_Body.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Armour_Slot_Feet.png b/Minecraft.Client/Common/Media/Graphics/Armour_Slot_Feet.png new file mode 100644 index 00000000..0180d560 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Armour_Slot_Feet.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Armour_Slot_Head.png b/Minecraft.Client/Common/Media/Graphics/Armour_Slot_Head.png new file mode 100644 index 00000000..d96b0423 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Armour_Slot_Head.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Armour_Slot_Legs.png b/Minecraft.Client/Common/Media/Graphics/Armour_Slot_Legs.png new file mode 100644 index 00000000..71b6df34 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Armour_Slot_Legs.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Arrow_Off.png b/Minecraft.Client/Common/Media/Graphics/Arrow_Off.png new file mode 100644 index 00000000..fe0ffb41 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Arrow_Off.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Arrow_On.png b/Minecraft.Client/Common/Media/Graphics/Arrow_On.png new file mode 100644 index 00000000..356edd0c Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Arrow_On.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Arrow_Small_Off.png b/Minecraft.Client/Common/Media/Graphics/Arrow_Small_Off.png new file mode 100644 index 00000000..c27d89ab Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Arrow_Small_Off.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Arrow_Small_On.png b/Minecraft.Client/Common/Media/Graphics/Arrow_Small_On.png new file mode 100644 index 00000000..653f1a10 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Arrow_Small_On.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/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/BrewingArrow_Off.png b/Minecraft.Client/Common/Media/Graphics/BrewingArrow_Off.png new file mode 100644 index 00000000..890db0a8 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/BrewingArrow_Off.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/BrewingArrow_On.png b/Minecraft.Client/Common/Media/Graphics/BrewingArrow_On.png new file mode 100644 index 00000000..a57b2d37 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/BrewingArrow_On.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/BrewingArrow_Small_Off.png b/Minecraft.Client/Common/Media/Graphics/BrewingArrow_Small_Off.png new file mode 100644 index 00000000..43b85846 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/BrewingArrow_Small_Off.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/BrewingArrow_Small_On.png b/Minecraft.Client/Common/Media/Graphics/BrewingArrow_Small_On.png new file mode 100644 index 00000000..c921bcfe Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/BrewingArrow_Small_On.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/BrewingBubbles_Off.png b/Minecraft.Client/Common/Media/Graphics/BrewingBubbles_Off.png new file mode 100644 index 00000000..4aa026c2 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/BrewingBubbles_Off.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/BrewingBubbles_On.png b/Minecraft.Client/Common/Media/Graphics/BrewingBubbles_On.png new file mode 100644 index 00000000..0c910850 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/BrewingBubbles_On.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/BrewingBubbles_Small_Off.png b/Minecraft.Client/Common/Media/Graphics/BrewingBubbles_Small_Off.png new file mode 100644 index 00000000..616774c1 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/BrewingBubbles_Small_Off.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/BrewingBubbles_Small_On.png b/Minecraft.Client/Common/Media/Graphics/BrewingBubbles_Small_On.png new file mode 100644 index 00000000..91fbf090 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/BrewingBubbles_Small_On.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/BrewingStand.png b/Minecraft.Client/Common/Media/Graphics/BrewingStand.png new file mode 100644 index 00000000..419dac9d Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/BrewingStand.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/BrewingStand_small.png b/Minecraft.Client/Common/Media/Graphics/BrewingStand_small.png new file mode 100644 index 00000000..91794485 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/BrewingStand_small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Controller_Message_Frame_L.png b/Minecraft.Client/Common/Media/Graphics/Controller_Message_Frame_L.png new file mode 100644 index 00000000..bc5f8c4a Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Controller_Message_Frame_L.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Controller_Quadrant_Icon_Empty.png b/Minecraft.Client/Common/Media/Graphics/Controller_Quadrant_Icon_Empty.png new file mode 100644 index 00000000..777eeec9 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Controller_Quadrant_Icon_Empty.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Controller_Quadrant_Icon_Segment.png b/Minecraft.Client/Common/Media/Graphics/Controller_Quadrant_Icon_Segment.png new file mode 100644 index 00000000..611be0bb Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Controller_Quadrant_Icon_Segment.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_Materials.png b/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_Materials.png new file mode 100644 index 00000000..fffdde5e Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_Materials.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_Redstone_and_Transport.png b/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_Redstone_and_Transport.png new file mode 100644 index 00000000..45a89584 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_Redstone_and_Transport.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_armour.png b/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_armour.png new file mode 100644 index 00000000..62dd6431 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_armour.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_brewing.png b/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_brewing.png new file mode 100644 index 00000000..b8536a3d Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_brewing.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_decoration.png b/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_decoration.png new file mode 100644 index 00000000..65c802d6 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_decoration.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_food.png b/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_food.png new file mode 100644 index 00000000..038d8aad Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_food.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_mechanisms.png b/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_mechanisms.png new file mode 100644 index 00000000..1eb81a27 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_mechanisms.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_misc.png b/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_misc.png new file mode 100644 index 00000000..e0737cb2 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_misc.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_structures.png b/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_structures.png new file mode 100644 index 00000000..b69b5d04 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_structures.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_tools.png b/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_tools.png new file mode 100644 index 00000000..7a59c7ce Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_tools.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_transport.png b/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_transport.png new file mode 100644 index 00000000..c60f9303 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_transport.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/CraftScene/Craft_Highlight_L_ExtraSmall.png b/Minecraft.Client/Common/Media/Graphics/CraftScene/Craft_Highlight_L_ExtraSmall.png new file mode 100644 index 00000000..bffd9a7f Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/CraftScene/Craft_Highlight_L_ExtraSmall.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/CraftScene/Craft_Highlight_L_Small.png b/Minecraft.Client/Common/Media/Graphics/CraftScene/Craft_Highlight_L_Small.png new file mode 100644 index 00000000..a7981af7 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/CraftScene/Craft_Highlight_L_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/CraftScene/Crafting_2SlotLargeV.png b/Minecraft.Client/Common/Media/Graphics/CraftScene/Crafting_2SlotLargeV.png new file mode 100644 index 00000000..32144c33 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/CraftScene/Crafting_2SlotLargeV.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/CraftScene/Crafting_2SlotSmallV.png b/Minecraft.Client/Common/Media/Graphics/CraftScene/Crafting_2SlotSmallV.png new file mode 100644 index 00000000..ea93b91c Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/CraftScene/Crafting_2SlotSmallV.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/CraftScene/Crafting_3SlotLargeV.png b/Minecraft.Client/Common/Media/Graphics/CraftScene/Crafting_3SlotLargeV.png new file mode 100644 index 00000000..034ff80d Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/CraftScene/Crafting_3SlotLargeV.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/CreditBackground.png b/Minecraft.Client/Common/Media/Graphics/CreditBackground.png new file mode 100644 index 00000000..d979ebe7 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/CreditBackground.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/DLCBackground.png b/Minecraft.Client/Common/Media/Graphics/DLCBackground.png new file mode 100644 index 00000000..636a4d10 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/DLCBackground.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/DLC_Tick.png b/Minecraft.Client/Common/Media/Graphics/DLC_Tick.png new file mode 100644 index 00000000..2645bdf8 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/DLC_Tick.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/DLC_TickSmall.png b/Minecraft.Client/Common/Media/Graphics/DLC_TickSmall.png new file mode 100644 index 00000000..efa3b796 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/DLC_TickSmall.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/DefaultPack_Comparison.png b/Minecraft.Client/Common/Media/Graphics/DefaultPack_Comparison.png new file mode 100644 index 00000000..c654f994 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/DefaultPack_Comparison.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Dirt_Tile.png b/Minecraft.Client/Common/Media/Graphics/Dirt_Tile.png new file mode 100644 index 00000000..bd311a10 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Dirt_Tile.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Enchant_Slot.png b/Minecraft.Client/Common/Media/Graphics/Enchant_Slot.png new file mode 100644 index 00000000..77797bd0 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Enchant_Slot.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Enchant_Slot_Small.png b/Minecraft.Client/Common/Media/Graphics/Enchant_Slot_Small.png new file mode 100644 index 00000000..249667f0 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Enchant_Slot_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/EnchantmentButtonActive.png b/Minecraft.Client/Common/Media/Graphics/EnchantmentButtonActive.png new file mode 100644 index 00000000..08204edf Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/EnchantmentButtonActive.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/EnchantmentButtonActive_small.png b/Minecraft.Client/Common/Media/Graphics/EnchantmentButtonActive_small.png new file mode 100644 index 00000000..ee49147c Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/EnchantmentButtonActive_small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/EnchantmentButtonEmpty.png b/Minecraft.Client/Common/Media/Graphics/EnchantmentButtonEmpty.png new file mode 100644 index 00000000..96a16143 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/EnchantmentButtonEmpty.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/EnchantmentButtonEmpty_small.png b/Minecraft.Client/Common/Media/Graphics/EnchantmentButtonEmpty_small.png new file mode 100644 index 00000000..c9eb657d Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/EnchantmentButtonEmpty_small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/EnchantmentButtonSelected.png b/Minecraft.Client/Common/Media/Graphics/EnchantmentButtonSelected.png new file mode 100644 index 00000000..8d29377f Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/EnchantmentButtonSelected.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/EnchantmentButtonSelected_small.png b/Minecraft.Client/Common/Media/Graphics/EnchantmentButtonSelected_small.png new file mode 100644 index 00000000..766eef60 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/EnchantmentButtonSelected_small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Flame_Off.png b/Minecraft.Client/Common/Media/Graphics/Flame_Off.png new file mode 100644 index 00000000..81b42fc3 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Flame_Off.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Flame_Off_Small.png b/Minecraft.Client/Common/Media/Graphics/Flame_Off_Small.png new file mode 100644 index 00000000..cf866b2e Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Flame_Off_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Flame_On.png b/Minecraft.Client/Common/Media/Graphics/Flame_On.png new file mode 100644 index 00000000..535042d7 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Flame_On.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Flame_On_Small.png b/Minecraft.Client/Common/Media/Graphics/Flame_On_Small.png new file mode 100644 index 00000000..b108c261 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Flame_On_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Empty.png b/Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Empty.png new file mode 100644 index 00000000..ab636b94 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Empty.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Empty2.png b/Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Empty2.png new file mode 100644 index 00000000..a310ab47 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Empty2.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Empty3.png b/Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Empty3.png new file mode 100644 index 00000000..8b8e8273 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Empty3.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Empty4.png b/Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Empty4.png new file mode 100644 index 00000000..fe31e319 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Empty4.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Empty6.png b/Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Empty6.png new file mode 100644 index 00000000..e51f5d2b Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Empty6.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Full.png b/Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Full.png new file mode 100644 index 00000000..8102b176 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Full.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Full2.png b/Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Full2.png new file mode 100644 index 00000000..7b408c9c Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Full2.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Full3.png b/Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Full3.png new file mode 100644 index 00000000..089f3a3a Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Full3.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Full4.png b/Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Full4.png new file mode 100644 index 00000000..0d6b0a33 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Full4.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Full6.png b/Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Full6.png new file mode 100644 index 00000000..04661f35 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Full6.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Air_Bubble.png b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Air_Bubble.png new file mode 100644 index 00000000..1f89ad90 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Air_Bubble.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Air_Pop.png b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Air_Pop.png new file mode 100644 index 00000000..4832f1ba Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Air_Pop.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Armour_Empty.png b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Armour_Empty.png new file mode 100644 index 00000000..7c5391d9 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Armour_Empty.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Armour_Full.png b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Armour_Full.png new file mode 100644 index 00000000..ebe39150 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Armour_Full.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Armour_Half.png b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Armour_Half.png new file mode 100644 index 00000000..3aab8fce Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Armour_Half.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Crosshair.png b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Crosshair.png new file mode 100644 index 00000000..e9345c06 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Crosshair.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Background.png b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Background.png new file mode 100644 index 00000000..a145f2b5 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Background.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Background_Flash.png b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Background_Flash.png new file mode 100644 index 00000000..9ffbb1e4 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Background_Flash.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Background_Poison.png b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Background_Poison.png new file mode 100644 index 00000000..718e6837 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Background_Poison.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Full.png b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Full.png new file mode 100644 index 00000000..5f54c070 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Full.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Full_Flash.png b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Full_Flash.png new file mode 100644 index 00000000..24a0304a Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Full_Flash.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Full_Poison.png b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Full_Poison.png new file mode 100644 index 00000000..d7bb5e4e Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Full_Poison.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Full_Poison_Flash.png b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Full_Poison_Flash.png new file mode 100644 index 00000000..07369fa6 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Full_Poison_Flash.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Half.png b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Half.png new file mode 100644 index 00000000..aa5e441f Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Half.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Half_Flash.png b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Half_Flash.png new file mode 100644 index 00000000..f0c60abf Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Half_Flash.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Half_Poison.png b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Half_Poison.png new file mode 100644 index 00000000..8ab93558 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Half_Poison.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Half_Poison_Flash.png b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Half_Poison_Flash.png new file mode 100644 index 00000000..7dc3928f Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Half_Poison_Flash.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/Health_Background.png b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Background.png new file mode 100644 index 00000000..a51c4ee5 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Background.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/Health_Background_Flash.png b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Background_Flash.png new file mode 100644 index 00000000..4fe90f0f Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Background_Flash.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/Health_Full.png b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Full.png new file mode 100644 index 00000000..ce369f6e Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Full.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/Health_Full_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_Flash.png b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Full_Flash.png new file mode 100644 index 00000000..acca4c9c Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Full_Flash.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/Health_Full_Poison.png b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Full_Poison.png new file mode 100644 index 00000000..cc46064c Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Full_Poison.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/Health_Full_Poison_Flash.png b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Full_Poison_Flash.png new file mode 100644 index 00000000..aeda7180 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Full_Poison_Flash.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/Health_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.png b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Half.png new file mode 100644 index 00000000..3fe9bcd0 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Half.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/Health_Half_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_Flash.png b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Half_Flash.png new file mode 100644 index 00000000..0fc541fc Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Half_Flash.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/Health_Half_Poison.png b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Half_Poison.png new file mode 100644 index 00000000..17e08c82 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Half_Poison.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/Health_Half_Poison_Flash.png b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Half_Poison_Flash.png new file mode 100644 index 00000000..ed2e5b4c Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Half_Poison_Flash.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/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/HUD/experience_bar_empty.png b/Minecraft.Client/Common/Media/Graphics/HUD/experience_bar_empty.png new file mode 100644 index 00000000..eb85721f Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/experience_bar_empty.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/experience_bar_full.png b/Minecraft.Client/Common/Media/Graphics/HUD/experience_bar_full.png new file mode 100644 index 00000000..1f54f9c9 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/experience_bar_full.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/hotbar_item_back.png b/Minecraft.Client/Common/Media/Graphics/HUD/hotbar_item_back.png new file mode 100644 index 00000000..280e222c Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/hotbar_item_back.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/hotbar_item_selected.png b/Minecraft.Client/Common/Media/Graphics/HUD/hotbar_item_selected.png new file mode 100644 index 00000000..aebf7a5a Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/hotbar_item_selected.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/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_Anvil.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Anvil.png new file mode 100644 index 00000000..c1b009d5 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Anvil.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Anvil_Small.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Anvil_Small.png new file mode 100644 index 00000000..e6904e65 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Anvil_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_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_Breeding.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Breeding.png new file mode 100644 index 00000000..c5d29dd0 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Breeding.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Breeding_Small.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Breeding_Small.png new file mode 100644 index 00000000..edcbf28e Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Breeding_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Brewing.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Brewing.png new file mode 100644 index 00000000..aaba0108 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Brewing.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Brewing_Small.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Brewing_Small.png new file mode 100644 index 00000000..b2d04ac6 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Brewing_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Chest.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Chest.png new file mode 100644 index 00000000..da5088a7 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Chest.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Chest_Small.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Chest_Small.png new file mode 100644 index 00000000..07c14cf6 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Chest_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_CraftTable.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_CraftTable.png new file mode 100644 index 00000000..3ed1c675 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_CraftTable.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_CraftTable_Small.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_CraftTable_Small.png new file mode 100644 index 00000000..96574c40 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_CraftTable_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Crafting.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Crafting.png new file mode 100644 index 00000000..eab2b7b0 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Crafting.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Crafting_Small.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Crafting_Small.png new file mode 100644 index 00000000..6cb70610 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Crafting_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Creative.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Creative.png new file mode 100644 index 00000000..a9a1bed8 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Creative.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Creative_Small.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Creative_Small.png new file mode 100644 index 00000000..701e28d4 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Creative_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Dispenser.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Dispenser.png new file mode 100644 index 00000000..3bcb373a Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Dispenser.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Dispenser_Small.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Dispenser_Small.png new file mode 100644 index 00000000..fb13dee0 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Dispenser_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Enchantment.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Enchantment.png new file mode 100644 index 00000000..cd3491aa Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Enchantment.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Enchantment_Small.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Enchantment_Small.png new file mode 100644 index 00000000..07d8be5f Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Enchantment_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Enderchest.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Enderchest.png new file mode 100644 index 00000000..9c874ef6 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Enderchest.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Enderchest_small.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Enderchest_small.png new file mode 100644 index 00000000..80e78728 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Enderchest_small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_FarmingAnimals.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_FarmingAnimals.png new file mode 100644 index 00000000..ba818027 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_FarmingAnimals.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_FarmingAnimals_Small.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_FarmingAnimals_Small.png new file mode 100644 index 00000000..6990f79e Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_FarmingAnimals_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_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_Furnace.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Furnace.png new file mode 100644 index 00000000..ba88862d Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Furnace.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Furnace_Small.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Furnace_Small.png new file mode 100644 index 00000000..4a3a2c92 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Furnace_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_HUD.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_HUD.png new file mode 100644 index 00000000..8b5eddfc Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_HUD.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_HUD_Small.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_HUD_Small.png new file mode 100644 index 00000000..a5a32cf4 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_HUD_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_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/HowToPlay/HowToPlay_Inventory.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Inventory.png new file mode 100644 index 00000000..d9773340 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Inventory.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Inventory_Small.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Inventory_Small.png new file mode 100644 index 00000000..7422272c Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Inventory_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_LargeChest.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_LargeChest.png new file mode 100644 index 00000000..e3226dbe Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_LargeChest.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_LargeChest_Small.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_LargeChest_Small.png new file mode 100644 index 00000000..c3690d3c Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_LargeChest_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_NetherPortal.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_NetherPortal.png new file mode 100644 index 00000000..3ccb9355 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_NetherPortal.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_NetherPortal_Small.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_NetherPortal_Small.png new file mode 100644 index 00000000..cb0cf4b6 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_NetherPortal_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_TheEnd.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_TheEnd.png new file mode 100644 index 00000000..2252890a Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_TheEnd.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_TheEnd_Small.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_TheEnd_Small.png new file mode 100644 index 00000000..aa542456 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_TheEnd_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Trading.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Trading.png new file mode 100644 index 00000000..b3182edd Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Trading.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Trading_Small.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Trading_Small.png new file mode 100644 index 00000000..d5e1a315 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Trading_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/IconHolder.png b/Minecraft.Client/Common/Media/Graphics/IconHolder.png new file mode 100644 index 00000000..e395f3a5 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/IconHolder.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/IconHolderRed.png b/Minecraft.Client/Common/Media/Graphics/IconHolderRed.png new file mode 100644 index 00000000..0123804c Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/IconHolderRed.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/IconHolderRed_Small.png b/Minecraft.Client/Common/Media/Graphics/IconHolderRed_Small.png new file mode 100644 index 00000000..e7efa119 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/IconHolderRed_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/IconHolder_Small.png b/Minecraft.Client/Common/Media/Graphics/IconHolder_Small.png new file mode 100644 index 00000000..f664d06f Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/IconHolder_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_0.png b/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_0.png new file mode 100644 index 00000000..2252f115 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_0.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_1.png b/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_1.png new file mode 100644 index 00000000..9f18fce6 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_1.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_10.png b/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_10.png new file mode 100644 index 00000000..9f450187 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_10.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_11.png b/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_11.png new file mode 100644 index 00000000..6b9714c9 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_11.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_12.png b/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_12.png new file mode 100644 index 00000000..d402fe5d Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_12.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_13.png b/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_13.png new file mode 100644 index 00000000..9f618d75 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_13.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_14.png b/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_14.png new file mode 100644 index 00000000..c637d2ef Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_14.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_15.png b/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_15.png new file mode 100644 index 00000000..4eda9274 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_15.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_2.png b/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_2.png new file mode 100644 index 00000000..9f450187 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_2.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_3.png b/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_3.png new file mode 100644 index 00000000..6b9714c9 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_3.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_4.png b/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_4.png new file mode 100644 index 00000000..d402fe5d Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_4.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_5.png b/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_5.png new file mode 100644 index 00000000..9f618d75 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_5.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_6.png b/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_6.png new file mode 100644 index 00000000..c637d2ef Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_6.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_7.png b/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_7.png new file mode 100644 index 00000000..4eda9274 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_7.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_8.png b/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_8.png new file mode 100644 index 00000000..2252f115 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_8.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_9.png b/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_9.png new file mode 100644 index 00000000..9f18fce6 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_9.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/InGameInfo/voiceMuted.png b/Minecraft.Client/Common/Media/Graphics/InGameInfo/voiceMuted.png new file mode 100644 index 00000000..39e0c552 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/InGameInfo/voiceMuted.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/InGameInfo/voiceNotSpeaking.png b/Minecraft.Client/Common/Media/Graphics/InGameInfo/voiceNotSpeaking.png new file mode 100644 index 00000000..e3dd7736 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/InGameInfo/voiceNotSpeaking.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/InGameInfo/voiceSpeaking.png b/Minecraft.Client/Common/Media/Graphics/InGameInfo/voiceSpeaking.png new file mode 100644 index 00000000..1af233a5 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/InGameInfo/voiceSpeaking.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/LayoutButton_Norm.png b/Minecraft.Client/Common/Media/Graphics/LayoutButton_Norm.png new file mode 100644 index 00000000..b6153e9e Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/LayoutButton_Norm.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/LayoutButton_Over.png b/Minecraft.Client/Common/Media/Graphics/LayoutButton_Over.png new file mode 100644 index 00000000..04fec073 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/LayoutButton_Over.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Climbed.png b/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Climbed.png new file mode 100644 index 00000000..23b9071a Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Climbed.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Creeper.png b/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Creeper.png new file mode 100644 index 00000000..b8469b73 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Creeper.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Fallen.png b/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Fallen.png new file mode 100644 index 00000000..dcf912c2 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Fallen.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Ghast.png b/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Ghast.png new file mode 100644 index 00000000..07f3e3c0 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Ghast.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Portal.png b/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Portal.png new file mode 100644 index 00000000..fd4b4fea Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Portal.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Skeleton.png b/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Skeleton.png new file mode 100644 index 00000000..a13247a9 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Skeleton.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Slime.png b/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Slime.png new file mode 100644 index 00000000..7c295a2c Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Slime.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Spider.png b/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Spider.png new file mode 100644 index 00000000..0f2a304d Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Spider.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_SpiderJockey.png b/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_SpiderJockey.png new file mode 100644 index 00000000..d84e1681 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_SpiderJockey.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Swam.png b/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Swam.png new file mode 100644 index 00000000..5584b533 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Swam.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Walked.png b/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Walked.png new file mode 100644 index 00000000..15248d97 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Walked.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Zombie.png b/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Zombie.png new file mode 100644 index 00000000..3a46db7e Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Zombie.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_ZombiePigman.png b/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_ZombiePigman.png new file mode 100644 index 00000000..01ec5f37 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_ZombiePigman.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/LeaderboardButton_Norm.png b/Minecraft.Client/Common/Media/Graphics/LeaderboardButton_Norm.png new file mode 100644 index 00000000..b1dff805 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/LeaderboardButton_Norm.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/LeaderboardButton_Over.png b/Minecraft.Client/Common/Media/Graphics/LeaderboardButton_Over.png new file mode 100644 index 00000000..ee3aa1fc Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/LeaderboardButton_Over.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/ListButton_Norm.png b/Minecraft.Client/Common/Media/Graphics/ListButton_Norm.png new file mode 100644 index 00000000..736a4be4 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/ListButton_Norm.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/ListButton_Over.png b/Minecraft.Client/Common/Media/Graphics/ListButton_Over.png new file mode 100644 index 00000000..7101b42a Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/ListButton_Over.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Logos/4JStudios_logo.png b/Minecraft.Client/Common/Media/Graphics/Logos/4JStudios_logo.png new file mode 100644 index 00000000..48ca3fe7 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Logos/4JStudios_logo.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Logos/ESRB_10_Large.png b/Minecraft.Client/Common/Media/Graphics/Logos/ESRB_10_Large.png new file mode 100644 index 00000000..ace11862 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Logos/ESRB_10_Large.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Logos/MS_Studios_MC.png b/Minecraft.Client/Common/Media/Graphics/Logos/MS_Studios_MC.png new file mode 100644 index 00000000..8c4e84c2 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Logos/MS_Studios_MC.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Logos/XBLA_MC.png b/Minecraft.Client/Common/Media/Graphics/Logos/XBLA_MC.png new file mode 100644 index 00000000..71d9a2bd Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Logos/XBLA_MC.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Logos/mojang.png b/Minecraft.Client/Common/Media/Graphics/Logos/mojang.png new file mode 100644 index 00000000..564750d2 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Logos/mojang.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/MSPoints.png b/Minecraft.Client/Common/Media/Graphics/MSPoints.png new file mode 100644 index 00000000..03212188 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/MSPoints.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/MainMenuButton_Norm.png b/Minecraft.Client/Common/Media/Graphics/MainMenuButton_Norm.png new file mode 100644 index 00000000..943946d5 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/MainMenuButton_Norm.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/MainMenuButton_Over.png b/Minecraft.Client/Common/Media/Graphics/MainMenuButton_Over.png new file mode 100644 index 00000000..bcd15d54 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/MainMenuButton_Over.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/MenuTitle.png b/Minecraft.Client/Common/Media/Graphics/MenuTitle.png new file mode 100644 index 00000000..7996704c Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/MenuTitle.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/MinecraftBrokenIcon.png b/Minecraft.Client/Common/Media/Graphics/MinecraftBrokenIcon.png new file mode 100644 index 00000000..a4a7de1f Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/MinecraftBrokenIcon.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/MinecraftIcon.png b/Minecraft.Client/Common/Media/Graphics/MinecraftIcon.png new file mode 100644 index 00000000..0244c448 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/MinecraftIcon.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Padlock_Small.png b/Minecraft.Client/Common/Media/Graphics/Padlock_Small.png new file mode 100644 index 00000000..5854426d Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Padlock_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Crafting_Panel.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Crafting_Panel.png new file mode 100644 index 00000000..50079c96 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Crafting_Panel.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Crafting_Panel2x2.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Crafting_Panel2x2.png new file mode 100644 index 00000000..c83a4e7e Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Crafting_Panel2x2.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Crafting_Panel_Small.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Crafting_Panel_Small.png new file mode 100644 index 00000000..f8380133 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Crafting_Panel_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Crafting_Panel_Small_2x2.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Crafting_Panel_Small_2x2.png new file mode 100644 index 00000000..998396e6 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Crafting_Panel_Small_2x2.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Creative_Panel_8.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Creative_Panel_8.png new file mode 100644 index 00000000..38c7579f Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Creative_Panel_8.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Creative_Panel_8_Small.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Creative_Panel_8_Small.png new file mode 100644 index 00000000..cb9c62c9 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Creative_Panel_8_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/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/Panel_BL.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_BL.png new file mode 100644 index 00000000..9e5da6ed Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_BL.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_BM.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_BM.png new file mode 100644 index 00000000..db4a2820 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_BM.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_BR.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_BR.png new file mode 100644 index 00000000..f81959fc Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_BR.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Bot_L.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Bot_L.png new file mode 100644 index 00000000..b7f14d8e Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Bot_L.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Bot_M.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Bot_M.png new file mode 100644 index 00000000..5e2a638a Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Bot_M.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Bot_R.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Bot_R.png new file mode 100644 index 00000000..6d789dc5 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Bot_R.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_ML.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_ML.png new file mode 100644 index 00000000..8a0c7058 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_ML.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_MM.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_MM.png new file mode 100644 index 00000000..af398ff3 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_MM.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_MR.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_MR.png new file mode 100644 index 00000000..78608fad Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_MR.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Mid_L.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Mid_L.png new file mode 100644 index 00000000..c7c25dd5 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Mid_L.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Mid_M.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Mid_M.png new file mode 100644 index 00000000..d5159253 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Mid_M.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Mid_R.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Mid_R.png new file mode 100644 index 00000000..b5c4ef0c Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Mid_R.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Recess_Bot_L.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Recess_Bot_L.png new file mode 100644 index 00000000..b496f73c Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Recess_Bot_L.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Recess_Bot_M.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Recess_Bot_M.png new file mode 100644 index 00000000..85065ce2 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Recess_Bot_M.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Recess_Bot_R.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Recess_Bot_R.png new file mode 100644 index 00000000..a89eaba7 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Recess_Bot_R.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Recess_Mid_L.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Recess_Mid_L.png new file mode 100644 index 00000000..c93b0208 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Recess_Mid_L.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Recess_Mid_M.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Recess_Mid_M.png new file mode 100644 index 00000000..e612b855 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Recess_Mid_M.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Recess_Mid_R.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Recess_Mid_R.png new file mode 100644 index 00000000..804c6336 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Recess_Mid_R.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Recess_Top_L.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Recess_Top_L.png new file mode 100644 index 00000000..6ca2500e Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Recess_Top_L.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Recess_Top_M.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Recess_Top_M.png new file mode 100644 index 00000000..a99240c7 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Recess_Top_M.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Recess_Top_R.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Recess_Top_R.png new file mode 100644 index 00000000..7f01f01d Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Recess_Top_R.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_TL.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_TL.png new file mode 100644 index 00000000..8a81d9dd Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_TL.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_TM.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_TM.png new file mode 100644 index 00000000..7e67370b Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_TM.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_TR.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_TR.png new file mode 100644 index 00000000..90229029 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_TR.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Top_L.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Top_L.png new file mode 100644 index 00000000..afc0f322 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Top_L.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Top_M.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Top_M.png new file mode 100644 index 00000000..6758a5f4 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Top_M.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Top_R.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Top_R.png new file mode 100644 index 00000000..307897fe Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Top_R.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/PointerTextPanel_BL.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/PointerTextPanel_BL.png new file mode 100644 index 00000000..4099dae6 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/PointerTextPanel_BL.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/PointerTextPanel_BM.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/PointerTextPanel_BM.png new file mode 100644 index 00000000..8b08e0c0 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/PointerTextPanel_BM.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/PointerTextPanel_BR.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/PointerTextPanel_BR.png new file mode 100644 index 00000000..8c0b09ec Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/PointerTextPanel_BR.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/PointerTextPanel_ML.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/PointerTextPanel_ML.png new file mode 100644 index 00000000..b9452f91 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/PointerTextPanel_ML.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/PointerTextPanel_MM.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/PointerTextPanel_MM.png new file mode 100644 index 00000000..df2ce955 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/PointerTextPanel_MM.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/PointerTextPanel_MR.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/PointerTextPanel_MR.png new file mode 100644 index 00000000..2d2f752e Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/PointerTextPanel_MR.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/PointerTextPanel_TL.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/PointerTextPanel_TL.png new file mode 100644 index 00000000..7828db7e Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/PointerTextPanel_TL.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/PointerTextPanel_TM.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/PointerTextPanel_TM.png new file mode 100644 index 00000000..48cf0cc3 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/PointerTextPanel_TM.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/PointerTextPanel_TR.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/PointerTextPanel_TR.png new file mode 100644 index 00000000..cd93f3ce Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/PointerTextPanel_TR.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabBar.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabBar.png new file mode 100644 index 00000000..54e19629 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabBar.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabBarSmall.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabBarSmall.png new file mode 100644 index 00000000..fec365c2 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabBarSmall.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabBarSmallPanel.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabBarSmallPanel.png new file mode 100644 index 00000000..d5d7e30d Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabBarSmallPanel.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabBarSmallPanel_Selected.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabBarSmallPanel_Selected.png new file mode 100644 index 00000000..16f7e088 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabBarSmallPanel_Selected.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabBarSmall_Selected.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabBarSmall_Selected.png new file mode 100644 index 00000000..2b9d9ad0 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabBarSmall_Selected.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabBar_Selected.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabBar_Selected.png new file mode 100644 index 00000000..aa9d5421 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabBar_Selected.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabNormal.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabNormal.png new file mode 100644 index 00000000..cc61e51e Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabNormal.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabNormalSmall.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabNormalSmall.png new file mode 100644 index 00000000..af897247 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabNormalSmall.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabNormalSmall_Selected.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabNormalSmall_Selected.png new file mode 100644 index 00000000..4bd1a612 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabNormalSmall_Selected.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabNormal_Selected.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabNormal_Selected.png new file mode 100644 index 00000000..62d34b66 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabNormal_Selected.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabOver.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabOver.png new file mode 100644 index 00000000..b66af841 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabOver.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabOverSmall.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabOverSmall.png new file mode 100644 index 00000000..64a4b9ea Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabOverSmall.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabOverSmall_Selected.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabOverSmall_Selected.png new file mode 100644 index 00000000..04b12e14 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabOverSmall_Selected.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabOver_Selected.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabOver_Selected.png new file mode 100644 index 00000000..e829610f Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabOver_Selected.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Square_Recess_Bot_L.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Square_Recess_Bot_L.png new file mode 100644 index 00000000..d80e35ec Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Square_Recess_Bot_L.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Square_Recess_Bot_M.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Square_Recess_Bot_M.png new file mode 100644 index 00000000..65dad94f Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Square_Recess_Bot_M.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Square_Recess_Bot_R.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Square_Recess_Bot_R.png new file mode 100644 index 00000000..7da1873b Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Square_Recess_Bot_R.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Square_Recess_Mid_L.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Square_Recess_Mid_L.png new file mode 100644 index 00000000..ab1361e3 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Square_Recess_Mid_L.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Square_Recess_Mid_M.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Square_Recess_Mid_M.png new file mode 100644 index 00000000..7ec34e51 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Square_Recess_Mid_M.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Square_Recess_Mid_R.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Square_Recess_Mid_R.png new file mode 100644 index 00000000..8d91f426 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Square_Recess_Mid_R.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Square_Recess_Top_L.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Square_Recess_Top_L.png new file mode 100644 index 00000000..523e0640 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Square_Recess_Top_L.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Square_Recess_Top_M.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Square_Recess_Top_M.png new file mode 100644 index 00000000..8be05151 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Square_Recess_Top_M.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Square_Recess_Top_R.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Square_Recess_Top_R.png new file mode 100644 index 00000000..23428b0f Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Square_Recess_Top_R.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Creative8_L.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Creative8_L.png new file mode 100644 index 00000000..9a2f0f12 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Creative8_L.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Creative8_M.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Creative8_M.png new file mode 100644 index 00000000..1bcfdc00 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Creative8_M.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Creative8_R.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Creative8_R.png new file mode 100644 index 00000000..b0da3c70 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Creative8_R.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Creative8_Small_L.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Creative8_Small_L.png new file mode 100644 index 00000000..7331cece Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Creative8_Small_L.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Creative8_Small_M.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Creative8_Small_M.png new file mode 100644 index 00000000..d4f65311 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Creative8_Small_M.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Creative8_Small_R.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Creative8_Small_R.png new file mode 100644 index 00000000..c3ff209c Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Creative8_Small_R.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Left.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Left.png new file mode 100644 index 00000000..a8719aa9 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Left.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Middle.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Middle.png new file mode 100644 index 00000000..b9b8e874 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Middle.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Right.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Right.png new file mode 100644 index 00000000..6a1eff9a Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Right.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Small_Left.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Small_Left.png new file mode 100644 index 00000000..32a332b2 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Small_Left.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Small_Middle.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Small_Middle.png new file mode 100644 index 00000000..1fd69b08 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Small_Middle.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Small_Right.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Small_Right.png new file mode 100644 index 00000000..54d958ae Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Small_Right.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/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/Panorama_Background_N.png b/Minecraft.Client/Common/Media/Graphics/Panorama_Background_N.png new file mode 100644 index 00000000..2acd010d Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Panorama_Background_N.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Panorama_Background_S.png b/Minecraft.Client/Common/Media/Graphics/Panorama_Background_S.png new file mode 100644 index 00000000..6bbe3dee Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Panorama_Background_S.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Pointer.png b/Minecraft.Client/Common/Media/Graphics/Pointer.png new file mode 100644 index 00000000..81de2572 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Pointer.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Blindness.png b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Blindness.png new file mode 100644 index 00000000..793b16d1 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Blindness.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Fire_Resistance.png b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Fire_Resistance.png new file mode 100644 index 00000000..d33df82a Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Fire_Resistance.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Haste.png b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Haste.png new file mode 100644 index 00000000..2b4c91ac Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Haste.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_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_Hunger.png b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Hunger.png new file mode 100644 index 00000000..af3fed50 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Hunger.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Invisibility.png b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Invisibility.png new file mode 100644 index 00000000..c09cdcbd Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Invisibility.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Jump_Boost.png b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Jump_Boost.png new file mode 100644 index 00000000..0389e26e Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Jump_Boost.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Mining_Fatigue.png b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Mining_Fatigue.png new file mode 100644 index 00000000..7387d71d Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Mining_Fatigue.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Nausea.png b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Nausea.png new file mode 100644 index 00000000..d45d34ef Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Nausea.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Night_Vision.png b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Night_Vision.png new file mode 100644 index 00000000..9789a799 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Night_Vision.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Poison.png b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Poison.png new file mode 100644 index 00000000..32a04f6d Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Poison.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Regeneration.png b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Regeneration.png new file mode 100644 index 00000000..57d69bb0 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Regeneration.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Resistance.png b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Resistance.png new file mode 100644 index 00000000..e79e5df4 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Resistance.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Slowness.png b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Slowness.png new file mode 100644 index 00000000..356c60d6 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Slowness.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Speed.png b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Speed.png new file mode 100644 index 00000000..874b43c6 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Speed.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Strength.png b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Strength.png new file mode 100644 index 00000000..48dc8e0b Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Strength.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Water_Breathing.png b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Water_Breathing.png new file mode 100644 index 00000000..cd6bd0d9 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Water_Breathing.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Weakness.png b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Weakness.png new file mode 100644 index 00000000..26830ed7 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Weakness.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/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/SaveArrow.png b/Minecraft.Client/Common/Media/Graphics/SaveArrow.png new file mode 100644 index 00000000..01b336df Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/SaveArrow.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/SaveChest.png b/Minecraft.Client/Common/Media/Graphics/SaveChest.png new file mode 100644 index 00000000..04e46ee9 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/SaveChest.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/SignEditBackground.png b/Minecraft.Client/Common/Media/Graphics/SignEditBackground.png new file mode 100644 index 00000000..edb55585 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/SignEditBackground.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Slider_Button.png b/Minecraft.Client/Common/Media/Graphics/Slider_Button.png new file mode 100644 index 00000000..524b6a8e Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Slider_Button.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Slider_Track.png b/Minecraft.Client/Common/Media/Graphics/Slider_Track.png new file mode 100644 index 00000000..41865e50 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Slider_Track.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/TexturePackIcon.png b/Minecraft.Client/Common/Media/Graphics/TexturePackIcon.png new file mode 100644 index 00000000..5ee74794 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/TexturePackIcon.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Tick.png b/Minecraft.Client/Common/Media/Graphics/Tick.png new file mode 100644 index 00000000..fcf3697f Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Tick.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Tickbox_Norm.png b/Minecraft.Client/Common/Media/Graphics/Tickbox_Norm.png new file mode 100644 index 00000000..54ee164f Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Tickbox_Norm.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Tickbox_Over.png b/Minecraft.Client/Common/Media/Graphics/Tickbox_Over.png new file mode 100644 index 00000000..7702fa23 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Tickbox_Over.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/TutorialExitScreenshot.png b/Minecraft.Client/Common/Media/Graphics/TutorialExitScreenshot.png new file mode 100644 index 00000000..4052436a Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/TutorialExitScreenshot.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot1.png b/Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot1.png new file mode 100644 index 00000000..4c817af2 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot1.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot10.png b/Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot10.png new file mode 100644 index 00000000..85295c59 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot10.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot2.png b/Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot2.png new file mode 100644 index 00000000..550d8adb Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot2.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot3.png b/Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot3.png new file mode 100644 index 00000000..dbc999eb Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot3.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot4.png b/Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot4.png new file mode 100644 index 00000000..343272b1 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot4.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot5.png b/Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot5.png new file mode 100644 index 00000000..98a3b719 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot5.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot6.png b/Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot6.png new file mode 100644 index 00000000..6a8fb7f1 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot6.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot7.png b/Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot7.png new file mode 100644 index 00000000..2afc7bfe Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot7.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot8.png b/Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot8.png new file mode 100644 index 00000000..5cba153b Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot8.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot9.png b/Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot9.png new file mode 100644 index 00000000..383c6d21 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot9.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Warning.png b/Minecraft.Client/Common/Media/Graphics/Warning.png new file mode 100644 index 00000000..2fda44c1 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Warning.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/360ctrl.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/360ctrl.png new file mode 100644 index 00000000..b7c7ce2b Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/360ctrl.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonA.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonA.png new file mode 100644 index 00000000..f3b5328f Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonA.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonB.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonB.png new file mode 100644 index 00000000..a6aa753a Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonB.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonBack.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonBack.png new file mode 100644 index 00000000..d12b7f42 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonBack.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonDpadD.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonDpadD.png new file mode 100644 index 00000000..dcca6773 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonDpadD.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonDpadL.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonDpadL.png new file mode 100644 index 00000000..5497dd8d Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonDpadL.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonDpadR.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonDpadR.png new file mode 100644 index 00000000..12c11236 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonDpadR.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonDpadU.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonDpadU.png new file mode 100644 index 00000000..21ef0fd2 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonDpadU.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonLS.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonLS.png new file mode 100644 index 00000000..fa97097f Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonLS.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonLeftBumper.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonLeftBumper.png new file mode 100644 index 00000000..aa3b1a9a Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonLeftBumper.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonLeftBumper_TT.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonLeftBumper_TT.png new file mode 100644 index 00000000..45baccfc Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonLeftBumper_TT.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonLeftStick.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonLeftStick.png new file mode 100644 index 00000000..ce32bf05 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonLeftStick.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonLeftStick_Navigate.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonLeftStick_Navigate.png new file mode 100644 index 00000000..81881801 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonLeftStick_Navigate.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonLeftStick_sides.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonLeftStick_sides.png new file mode 100644 index 00000000..b9855f21 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonLeftStick_sides.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonLeftTrigger.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonLeftTrigger.png new file mode 100644 index 00000000..e95acd1c Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonLeftTrigger.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonLeftTrigger_TT.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonLeftTrigger_TT.png new file mode 100644 index 00000000..067e139c Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonLeftTrigger_TT.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonRS.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonRS.png new file mode 100644 index 00000000..652a03cc Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonRS.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/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/Graphics/X360ControllerIcons/ButtonRightBumper.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonRightBumper.png new file mode 100644 index 00000000..acdb4a8c Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonRightBumper.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonRightBumper_TT.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonRightBumper_TT.png new file mode 100644 index 00000000..154b57db Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonRightBumper_TT.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonRightStick.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonRightStick.png new file mode 100644 index 00000000..3de652ea Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonRightStick.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonRightTrigger.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonRightTrigger.png new file mode 100644 index 00000000..05dd8940 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonRightTrigger.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonRightTrigger_TT.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonRightTrigger_TT.png new file mode 100644 index 00000000..44880854 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonRightTrigger_TT.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonStart.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonStart.png new file mode 100644 index 00000000..1e8d2020 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonStart.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonX.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonX.png new file mode 100644 index 00000000..79170139 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonX.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonY.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonY.png new file mode 100644 index 00000000..31d17ec1 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonY.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/Legend_Button_Blu_Focus.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/Legend_Button_Blu_Focus.png new file mode 100644 index 00000000..7ea10c25 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/Legend_Button_Blu_Focus.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/Legend_Button_Blu_Normal.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/Legend_Button_Blu_Normal.png new file mode 100644 index 00000000..5c983d68 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/Legend_Button_Blu_Normal.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/Legend_Button_Disable.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/Legend_Button_Disable.png new file mode 100644 index 00000000..afbf9757 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/Legend_Button_Disable.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/Legend_Button_Green_Focus.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/Legend_Button_Green_Focus.png new file mode 100644 index 00000000..c14a1062 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/Legend_Button_Green_Focus.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/Legend_Button_Green_Normal.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/Legend_Button_Green_Normal.png new file mode 100644 index 00000000..2b0b6efa Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/Legend_Button_Green_Normal.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/Legend_Button_Red_Focus.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/Legend_Button_Red_Focus.png new file mode 100644 index 00000000..85875ee1 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/Legend_Button_Red_Focus.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/Legend_Button_Red_Normal.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/Legend_Button_Red_Normal.png new file mode 100644 index 00000000..8f284813 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/Legend_Button_Red_Normal.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/Legend_Button_Yello_Focus.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/Legend_Button_Yello_Focus.png new file mode 100644 index 00000000..300252bf Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/Legend_Button_Yello_Focus.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/Legend_Button_Yello_Normal.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/Legend_Button_Yello_Normal.png new file mode 100644 index 00000000..dd37a19f Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/Legend_Button_Yello_Normal.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/a_graphic.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/a_graphic.png new file mode 100644 index 00000000..126e1b02 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/a_graphic.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/b_graphic.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/b_graphic.png new file mode 100644 index 00000000..e7721e48 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/b_graphic.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/x_graphic.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/x_graphic.png new file mode 100644 index 00000000..3d1b50cd Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/x_graphic.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/y_graphic.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/y_graphic.png new file mode 100644 index 00000000..6213c53c Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/y_graphic.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/icon_shank.png b/Minecraft.Client/Common/Media/Graphics/icon_shank.png new file mode 100644 index 00000000..d5b4e32e Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/icon_shank.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/scrollDown.png b/Minecraft.Client/Common/Media/Graphics/scrollDown.png new file mode 100644 index 00000000..dac9905c Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/scrollDown.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/scrollLeft.png b/Minecraft.Client/Common/Media/Graphics/scrollLeft.png new file mode 100644 index 00000000..d87ecd7d Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/scrollLeft.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/scrollRight.png b/Minecraft.Client/Common/Media/Graphics/scrollRight.png new file mode 100644 index 00000000..0496bf8a Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/scrollRight.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/scrollUp.png b/Minecraft.Client/Common/Media/Graphics/scrollUp.png new file mode 100644 index 00000000..3a7a51e7 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/scrollUp.png differ diff --git a/Minecraft.Client/Common/Media/HTMLColours.col b/Minecraft.Client/Common/Media/HTMLColours.col new file mode 100644 index 00000000..21db75ae Binary files /dev/null and b/Minecraft.Client/Common/Media/HTMLColours.col differ diff --git a/Minecraft.Client/Common/Media/HTMLColours.xml b/Minecraft.Client/Common/Media/HTMLColours.xml new file mode 100644 index 00000000..8f17132c --- /dev/null +++ b/Minecraft.Client/Common/Media/HTMLColours.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Minecraft.Client/Common/Media/HUD1080.swf b/Minecraft.Client/Common/Media/HUD1080.swf new file mode 100644 index 00000000..261be0e6 Binary files /dev/null and b/Minecraft.Client/Common/Media/HUD1080.swf differ diff --git a/Minecraft.Client/Common/Media/HUD480.swf b/Minecraft.Client/Common/Media/HUD480.swf new file mode 100644 index 00000000..25cc211c Binary files /dev/null and b/Minecraft.Client/Common/Media/HUD480.swf differ diff --git a/Minecraft.Client/Common/Media/HUD720.swf b/Minecraft.Client/Common/Media/HUD720.swf new file mode 100644 index 00000000..b044e31f Binary files /dev/null and b/Minecraft.Client/Common/Media/HUD720.swf differ diff --git a/Minecraft.Client/Common/Media/HUDSplit1080.swf b/Minecraft.Client/Common/Media/HUDSplit1080.swf new file mode 100644 index 00000000..c22cfc85 Binary files /dev/null and b/Minecraft.Client/Common/Media/HUDSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/HUDSplit720.swf b/Minecraft.Client/Common/Media/HUDSplit720.swf new file mode 100644 index 00000000..ba9937e1 Binary files /dev/null and b/Minecraft.Client/Common/Media/HUDSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/HUDVita.swf b/Minecraft.Client/Common/Media/HUDVita.swf new file mode 100644 index 00000000..03b05f42 Binary files /dev/null and b/Minecraft.Client/Common/Media/HUDVita.swf differ diff --git a/Minecraft.Client/Common/Media/HelpAndOptionsMenu1080.swf b/Minecraft.Client/Common/Media/HelpAndOptionsMenu1080.swf new file mode 100644 index 00000000..956277c5 Binary files /dev/null and b/Minecraft.Client/Common/Media/HelpAndOptionsMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/HelpAndOptionsMenu480.swf b/Minecraft.Client/Common/Media/HelpAndOptionsMenu480.swf new file mode 100644 index 00000000..26df9a49 Binary files /dev/null and b/Minecraft.Client/Common/Media/HelpAndOptionsMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/HelpAndOptionsMenu720.swf b/Minecraft.Client/Common/Media/HelpAndOptionsMenu720.swf new file mode 100644 index 00000000..cdd6849f Binary files /dev/null and b/Minecraft.Client/Common/Media/HelpAndOptionsMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/HelpAndOptionsMenuSplit1080.swf b/Minecraft.Client/Common/Media/HelpAndOptionsMenuSplit1080.swf new file mode 100644 index 00000000..6073ec66 Binary files /dev/null and b/Minecraft.Client/Common/Media/HelpAndOptionsMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/HelpAndOptionsMenuSplit720.swf b/Minecraft.Client/Common/Media/HelpAndOptionsMenuSplit720.swf new file mode 100644 index 00000000..be8993c6 Binary files /dev/null and b/Minecraft.Client/Common/Media/HelpAndOptionsMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/HelpAndOptionsMenuVita.swf b/Minecraft.Client/Common/Media/HelpAndOptionsMenuVita.swf new file mode 100644 index 00000000..6027b19b Binary files /dev/null and b/Minecraft.Client/Common/Media/HelpAndOptionsMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/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 new file mode 100644 index 00000000..db0f4d36 Binary files /dev/null and b/Minecraft.Client/Common/Media/HorseInventoryMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/HorseInventoryMenu480.swf b/Minecraft.Client/Common/Media/HorseInventoryMenu480.swf new file mode 100644 index 00000000..599c3e38 Binary files /dev/null and b/Minecraft.Client/Common/Media/HorseInventoryMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/HorseInventoryMenu720.swf b/Minecraft.Client/Common/Media/HorseInventoryMenu720.swf new file mode 100644 index 00000000..eee79a2f Binary files /dev/null and b/Minecraft.Client/Common/Media/HorseInventoryMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/HorseInventoryMenuSplit1080.swf b/Minecraft.Client/Common/Media/HorseInventoryMenuSplit1080.swf new file mode 100644 index 00000000..edfa8430 Binary files /dev/null and b/Minecraft.Client/Common/Media/HorseInventoryMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/HorseInventoryMenuSplit720.swf b/Minecraft.Client/Common/Media/HorseInventoryMenuSplit720.swf new file mode 100644 index 00000000..5883cba4 Binary files /dev/null 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 new file mode 100644 index 00000000..c1e91110 Binary files /dev/null and b/Minecraft.Client/Common/Media/HowToPlay1080.swf differ diff --git a/Minecraft.Client/Common/Media/HowToPlay480.swf b/Minecraft.Client/Common/Media/HowToPlay480.swf new file mode 100644 index 00000000..e7cbe808 Binary files /dev/null and b/Minecraft.Client/Common/Media/HowToPlay480.swf differ diff --git a/Minecraft.Client/Common/Media/HowToPlay720.swf b/Minecraft.Client/Common/Media/HowToPlay720.swf new file mode 100644 index 00000000..3e12dbb0 Binary files /dev/null and b/Minecraft.Client/Common/Media/HowToPlay720.swf differ diff --git a/Minecraft.Client/Common/Media/HowToPlayMenu1080.swf b/Minecraft.Client/Common/Media/HowToPlayMenu1080.swf new file mode 100644 index 00000000..6e128ffa Binary files /dev/null and b/Minecraft.Client/Common/Media/HowToPlayMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/HowToPlayMenu480.swf b/Minecraft.Client/Common/Media/HowToPlayMenu480.swf new file mode 100644 index 00000000..5e25feaf Binary files /dev/null and b/Minecraft.Client/Common/Media/HowToPlayMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/HowToPlayMenu720.swf b/Minecraft.Client/Common/Media/HowToPlayMenu720.swf new file mode 100644 index 00000000..ef85f005 Binary files /dev/null and b/Minecraft.Client/Common/Media/HowToPlayMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/HowToPlayMenuSplit1080.swf b/Minecraft.Client/Common/Media/HowToPlayMenuSplit1080.swf new file mode 100644 index 00000000..f44140b6 Binary files /dev/null and b/Minecraft.Client/Common/Media/HowToPlayMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/HowToPlayMenuSplit720.swf b/Minecraft.Client/Common/Media/HowToPlayMenuSplit720.swf new file mode 100644 index 00000000..fe33c20e Binary files /dev/null and b/Minecraft.Client/Common/Media/HowToPlayMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/HowToPlayMenuVita.swf b/Minecraft.Client/Common/Media/HowToPlayMenuVita.swf new file mode 100644 index 00000000..aa1ca7a7 Binary files /dev/null and b/Minecraft.Client/Common/Media/HowToPlayMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/HowToPlaySplit1080.swf b/Minecraft.Client/Common/Media/HowToPlaySplit1080.swf new file mode 100644 index 00000000..3ba64d5a Binary files /dev/null and b/Minecraft.Client/Common/Media/HowToPlaySplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/HowToPlaySplit720.swf b/Minecraft.Client/Common/Media/HowToPlaySplit720.swf new file mode 100644 index 00000000..bc9542e3 Binary files /dev/null and b/Minecraft.Client/Common/Media/HowToPlaySplit720.swf differ diff --git a/Minecraft.Client/Common/Media/HowToPlayVita.swf b/Minecraft.Client/Common/Media/HowToPlayVita.swf new file mode 100644 index 00000000..51f2397d Binary files /dev/null and b/Minecraft.Client/Common/Media/HowToPlayVita.swf differ diff --git a/Minecraft.Client/Common/Media/InGameHostOptions1080.swf b/Minecraft.Client/Common/Media/InGameHostOptions1080.swf new file mode 100644 index 00000000..207c86a7 Binary files /dev/null and b/Minecraft.Client/Common/Media/InGameHostOptions1080.swf differ diff --git a/Minecraft.Client/Common/Media/InGameHostOptions480.swf b/Minecraft.Client/Common/Media/InGameHostOptions480.swf new file mode 100644 index 00000000..f0d0e0c6 Binary files /dev/null and b/Minecraft.Client/Common/Media/InGameHostOptions480.swf differ diff --git a/Minecraft.Client/Common/Media/InGameHostOptions720.swf b/Minecraft.Client/Common/Media/InGameHostOptions720.swf new file mode 100644 index 00000000..f4e55bf4 Binary files /dev/null and b/Minecraft.Client/Common/Media/InGameHostOptions720.swf differ diff --git a/Minecraft.Client/Common/Media/InGameHostOptionsSplit1080.swf b/Minecraft.Client/Common/Media/InGameHostOptionsSplit1080.swf new file mode 100644 index 00000000..a45e8a37 Binary files /dev/null and b/Minecraft.Client/Common/Media/InGameHostOptionsSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/InGameHostOptionsSplit720.swf b/Minecraft.Client/Common/Media/InGameHostOptionsSplit720.swf new file mode 100644 index 00000000..7f76aaaf Binary files /dev/null and b/Minecraft.Client/Common/Media/InGameHostOptionsSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/InGameHostOptionsVita.swf b/Minecraft.Client/Common/Media/InGameHostOptionsVita.swf new file mode 100644 index 00000000..a7276f10 Binary files /dev/null and b/Minecraft.Client/Common/Media/InGameHostOptionsVita.swf differ diff --git a/Minecraft.Client/Common/Media/InGameInfoMenu1080.swf b/Minecraft.Client/Common/Media/InGameInfoMenu1080.swf new file mode 100644 index 00000000..5f74a102 Binary files /dev/null and b/Minecraft.Client/Common/Media/InGameInfoMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/InGameInfoMenu480.swf b/Minecraft.Client/Common/Media/InGameInfoMenu480.swf new file mode 100644 index 00000000..ecd2384e Binary files /dev/null and b/Minecraft.Client/Common/Media/InGameInfoMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/InGameInfoMenu720.swf b/Minecraft.Client/Common/Media/InGameInfoMenu720.swf new file mode 100644 index 00000000..e6f1dc54 Binary files /dev/null and b/Minecraft.Client/Common/Media/InGameInfoMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/InGameInfoMenuSplit1080.swf b/Minecraft.Client/Common/Media/InGameInfoMenuSplit1080.swf new file mode 100644 index 00000000..dc435457 Binary files /dev/null and b/Minecraft.Client/Common/Media/InGameInfoMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/InGameInfoMenuSplit720.swf b/Minecraft.Client/Common/Media/InGameInfoMenuSplit720.swf new file mode 100644 index 00000000..17de71d8 Binary files /dev/null and b/Minecraft.Client/Common/Media/InGameInfoMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/InGameInfoMenuVita.swf b/Minecraft.Client/Common/Media/InGameInfoMenuVita.swf new file mode 100644 index 00000000..f148ea66 Binary files /dev/null and b/Minecraft.Client/Common/Media/InGameInfoMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/InGamePlayerOptions1080.swf b/Minecraft.Client/Common/Media/InGamePlayerOptions1080.swf new file mode 100644 index 00000000..601cc467 Binary files /dev/null and b/Minecraft.Client/Common/Media/InGamePlayerOptions1080.swf differ diff --git a/Minecraft.Client/Common/Media/InGamePlayerOptions480.swf b/Minecraft.Client/Common/Media/InGamePlayerOptions480.swf new file mode 100644 index 00000000..9e0b0ad9 Binary files /dev/null and b/Minecraft.Client/Common/Media/InGamePlayerOptions480.swf differ diff --git a/Minecraft.Client/Common/Media/InGamePlayerOptions720.swf b/Minecraft.Client/Common/Media/InGamePlayerOptions720.swf new file mode 100644 index 00000000..bc9c4f6b Binary files /dev/null and b/Minecraft.Client/Common/Media/InGamePlayerOptions720.swf differ diff --git a/Minecraft.Client/Common/Media/InGamePlayerOptionsSplit1080.swf b/Minecraft.Client/Common/Media/InGamePlayerOptionsSplit1080.swf new file mode 100644 index 00000000..c4187a09 Binary files /dev/null and b/Minecraft.Client/Common/Media/InGamePlayerOptionsSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/InGamePlayerOptionsSplit720.swf b/Minecraft.Client/Common/Media/InGamePlayerOptionsSplit720.swf new file mode 100644 index 00000000..ab0b3a7e Binary files /dev/null and b/Minecraft.Client/Common/Media/InGamePlayerOptionsSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/InGamePlayerOptionsVita.swf b/Minecraft.Client/Common/Media/InGamePlayerOptionsVita.swf new file mode 100644 index 00000000..13c0b653 Binary files /dev/null and b/Minecraft.Client/Common/Media/InGamePlayerOptionsVita.swf differ diff --git a/Minecraft.Client/Common/Media/InGameTeleportMenu1080.swf b/Minecraft.Client/Common/Media/InGameTeleportMenu1080.swf new file mode 100644 index 00000000..8a65f8aa Binary files /dev/null and b/Minecraft.Client/Common/Media/InGameTeleportMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/InGameTeleportMenu480.swf b/Minecraft.Client/Common/Media/InGameTeleportMenu480.swf new file mode 100644 index 00000000..2c1a9cfd Binary files /dev/null and b/Minecraft.Client/Common/Media/InGameTeleportMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/InGameTeleportMenu720.swf b/Minecraft.Client/Common/Media/InGameTeleportMenu720.swf new file mode 100644 index 00000000..bc1e957c Binary files /dev/null and b/Minecraft.Client/Common/Media/InGameTeleportMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/InGameTeleportMenuSplit1080.swf b/Minecraft.Client/Common/Media/InGameTeleportMenuSplit1080.swf new file mode 100644 index 00000000..0516dcb4 Binary files /dev/null and b/Minecraft.Client/Common/Media/InGameTeleportMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/InGameTeleportMenuSplit720.swf b/Minecraft.Client/Common/Media/InGameTeleportMenuSplit720.swf new file mode 100644 index 00000000..078b3e59 Binary files /dev/null and b/Minecraft.Client/Common/Media/InGameTeleportMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/InGameTeleportMenuVita.swf b/Minecraft.Client/Common/Media/InGameTeleportMenuVita.swf new file mode 100644 index 00000000..8d97ccab Binary files /dev/null and b/Minecraft.Client/Common/Media/InGameTeleportMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/Intro1080.swf b/Minecraft.Client/Common/Media/Intro1080.swf new file mode 100644 index 00000000..c9f2d3ba Binary files /dev/null and b/Minecraft.Client/Common/Media/Intro1080.swf differ diff --git a/Minecraft.Client/Common/Media/Intro480.swf b/Minecraft.Client/Common/Media/Intro480.swf new file mode 100644 index 00000000..425c01fe Binary files /dev/null and b/Minecraft.Client/Common/Media/Intro480.swf differ diff --git a/Minecraft.Client/Common/Media/Intro720.swf b/Minecraft.Client/Common/Media/Intro720.swf new file mode 100644 index 00000000..0c2bb3eb Binary files /dev/null and b/Minecraft.Client/Common/Media/Intro720.swf differ diff --git a/Minecraft.Client/Common/Media/IntroVita.swf b/Minecraft.Client/Common/Media/IntroVita.swf new file mode 100644 index 00000000..8229640d Binary files /dev/null and b/Minecraft.Client/Common/Media/IntroVita.swf differ diff --git a/Minecraft.Client/Common/Media/InventoryMenu1080.swf b/Minecraft.Client/Common/Media/InventoryMenu1080.swf new file mode 100644 index 00000000..47434cc3 Binary files /dev/null and b/Minecraft.Client/Common/Media/InventoryMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/InventoryMenu480.swf b/Minecraft.Client/Common/Media/InventoryMenu480.swf new file mode 100644 index 00000000..5c129e1d Binary files /dev/null and b/Minecraft.Client/Common/Media/InventoryMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/InventoryMenu720.swf b/Minecraft.Client/Common/Media/InventoryMenu720.swf new file mode 100644 index 00000000..3de2da83 Binary files /dev/null and b/Minecraft.Client/Common/Media/InventoryMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/InventoryMenuSplit1080.swf b/Minecraft.Client/Common/Media/InventoryMenuSplit1080.swf new file mode 100644 index 00000000..efe2d484 Binary files /dev/null and b/Minecraft.Client/Common/Media/InventoryMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/InventoryMenuSplit720.swf b/Minecraft.Client/Common/Media/InventoryMenuSplit720.swf new file mode 100644 index 00000000..a9d13a05 Binary files /dev/null and b/Minecraft.Client/Common/Media/InventoryMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/InventoryMenuVita.swf b/Minecraft.Client/Common/Media/InventoryMenuVita.swf new file mode 100644 index 00000000..1eae726a Binary files /dev/null and b/Minecraft.Client/Common/Media/InventoryMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/JoinMenu1080.swf b/Minecraft.Client/Common/Media/JoinMenu1080.swf new file mode 100644 index 00000000..817c3633 Binary files /dev/null and b/Minecraft.Client/Common/Media/JoinMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/JoinMenu480.swf b/Minecraft.Client/Common/Media/JoinMenu480.swf new file mode 100644 index 00000000..f93a4f52 Binary files /dev/null and b/Minecraft.Client/Common/Media/JoinMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/JoinMenu720.swf b/Minecraft.Client/Common/Media/JoinMenu720.swf new file mode 100644 index 00000000..21be70a4 Binary files /dev/null and b/Minecraft.Client/Common/Media/JoinMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/JoinMenuVita.swf b/Minecraft.Client/Common/Media/JoinMenuVita.swf new file mode 100644 index 00000000..ddf2641f Binary files /dev/null and b/Minecraft.Client/Common/Media/JoinMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/Keyboard1080.swf b/Minecraft.Client/Common/Media/Keyboard1080.swf new file mode 100644 index 00000000..e9b6107e Binary files /dev/null and b/Minecraft.Client/Common/Media/Keyboard1080.swf differ diff --git a/Minecraft.Client/Common/Media/KeyboardSplit1080.swf b/Minecraft.Client/Common/Media/KeyboardSplit1080.swf new file mode 100644 index 00000000..fdeea502 Binary files /dev/null and b/Minecraft.Client/Common/Media/KeyboardSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/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 new file mode 100644 index 00000000..07d81207 Binary files /dev/null and b/Minecraft.Client/Common/Media/LaunchMoreOptionsMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/LaunchMoreOptionsMenu480.swf b/Minecraft.Client/Common/Media/LaunchMoreOptionsMenu480.swf new file mode 100644 index 00000000..666f1127 Binary files /dev/null and b/Minecraft.Client/Common/Media/LaunchMoreOptionsMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/LaunchMoreOptionsMenu720.swf b/Minecraft.Client/Common/Media/LaunchMoreOptionsMenu720.swf new file mode 100644 index 00000000..e77beb4e Binary files /dev/null and b/Minecraft.Client/Common/Media/LaunchMoreOptionsMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/LaunchMoreOptionsMenuVita.swf b/Minecraft.Client/Common/Media/LaunchMoreOptionsMenuVita.swf new file mode 100644 index 00000000..5c1d44d9 Binary files /dev/null and b/Minecraft.Client/Common/Media/LaunchMoreOptionsMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/LeaderboardMenu1080.swf b/Minecraft.Client/Common/Media/LeaderboardMenu1080.swf new file mode 100644 index 00000000..ca956284 Binary files /dev/null and b/Minecraft.Client/Common/Media/LeaderboardMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/LeaderboardMenu480.swf b/Minecraft.Client/Common/Media/LeaderboardMenu480.swf new file mode 100644 index 00000000..04c32493 Binary files /dev/null and b/Minecraft.Client/Common/Media/LeaderboardMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/LeaderboardMenu720.swf b/Minecraft.Client/Common/Media/LeaderboardMenu720.swf new file mode 100644 index 00000000..8418ec5e Binary files /dev/null and b/Minecraft.Client/Common/Media/LeaderboardMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/LeaderboardMenuVita.swf b/Minecraft.Client/Common/Media/LeaderboardMenuVita.swf new file mode 100644 index 00000000..9310c89d Binary files /dev/null and b/Minecraft.Client/Common/Media/LeaderboardMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/LoadMenu1080.swf b/Minecraft.Client/Common/Media/LoadMenu1080.swf new file mode 100644 index 00000000..d0d61ec7 Binary files /dev/null and b/Minecraft.Client/Common/Media/LoadMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/LoadMenu480.swf b/Minecraft.Client/Common/Media/LoadMenu480.swf new file mode 100644 index 00000000..e105c9e7 Binary files /dev/null and b/Minecraft.Client/Common/Media/LoadMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/LoadMenu720.swf b/Minecraft.Client/Common/Media/LoadMenu720.swf new file mode 100644 index 00000000..ef33463e Binary files /dev/null and b/Minecraft.Client/Common/Media/LoadMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/LoadMenuVita.swf b/Minecraft.Client/Common/Media/LoadMenuVita.swf new file mode 100644 index 00000000..a5be6f3f Binary files /dev/null and b/Minecraft.Client/Common/Media/LoadMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/LoadOrJoinMenu1080.swf b/Minecraft.Client/Common/Media/LoadOrJoinMenu1080.swf new file mode 100644 index 00000000..5ad47f8a Binary files /dev/null and b/Minecraft.Client/Common/Media/LoadOrJoinMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/LoadOrJoinMenu480.swf b/Minecraft.Client/Common/Media/LoadOrJoinMenu480.swf new file mode 100644 index 00000000..a424e7f3 Binary files /dev/null and b/Minecraft.Client/Common/Media/LoadOrJoinMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/LoadOrJoinMenu720.swf b/Minecraft.Client/Common/Media/LoadOrJoinMenu720.swf new file mode 100644 index 00000000..5d2cdf5e Binary files /dev/null and b/Minecraft.Client/Common/Media/LoadOrJoinMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/LoadOrJoinMenuVita.swf b/Minecraft.Client/Common/Media/LoadOrJoinMenuVita.swf new file mode 100644 index 00000000..d888f666 Binary files /dev/null and b/Minecraft.Client/Common/Media/LoadOrJoinMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/MainMenu1080.swf b/Minecraft.Client/Common/Media/MainMenu1080.swf new file mode 100644 index 00000000..a3c55273 Binary files /dev/null and b/Minecraft.Client/Common/Media/MainMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/MainMenu480.swf b/Minecraft.Client/Common/Media/MainMenu480.swf new file mode 100644 index 00000000..adc8e52a Binary files /dev/null and b/Minecraft.Client/Common/Media/MainMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/MainMenu720.swf b/Minecraft.Client/Common/Media/MainMenu720.swf new file mode 100644 index 00000000..3823791e Binary files /dev/null and b/Minecraft.Client/Common/Media/MainMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/MainMenuVita.swf b/Minecraft.Client/Common/Media/MainMenuVita.swf new file mode 100644 index 00000000..c9477bce Binary files /dev/null and b/Minecraft.Client/Common/Media/MainMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/MediaDurango.arc b/Minecraft.Client/Common/Media/MediaDurango.arc new file mode 100644 index 00000000..50240c42 Binary files /dev/null and b/Minecraft.Client/Common/Media/MediaDurango.arc differ diff --git a/Minecraft.Client/Common/Media/MediaOrbis.arc b/Minecraft.Client/Common/Media/MediaOrbis.arc new file mode 100644 index 00000000..aea52dc1 Binary files /dev/null and b/Minecraft.Client/Common/Media/MediaOrbis.arc differ diff --git a/Minecraft.Client/Common/Media/MediaPS3.arc b/Minecraft.Client/Common/Media/MediaPS3.arc new file mode 100644 index 00000000..5eb550f8 Binary files /dev/null and b/Minecraft.Client/Common/Media/MediaPS3.arc differ diff --git a/Minecraft.Client/Common/Media/MediaPSVita.arc b/Minecraft.Client/Common/Media/MediaPSVita.arc new file mode 100644 index 00000000..8683db23 Binary files /dev/null and b/Minecraft.Client/Common/Media/MediaPSVita.arc differ diff --git a/Minecraft.Client/Common/Media/MediaWindows64.arc b/Minecraft.Client/Common/Media/MediaWindows64.arc new file mode 100644 index 00000000..b72fed4e Binary files /dev/null and b/Minecraft.Client/Common/Media/MediaWindows64.arc differ diff --git a/Minecraft.Client/Common/Media/MenuBackground1080.swf b/Minecraft.Client/Common/Media/MenuBackground1080.swf new file mode 100644 index 00000000..5f8c6a7d Binary files /dev/null and b/Minecraft.Client/Common/Media/MenuBackground1080.swf differ diff --git a/Minecraft.Client/Common/Media/MenuBackground480.swf b/Minecraft.Client/Common/Media/MenuBackground480.swf new file mode 100644 index 00000000..e41d429b Binary files /dev/null and b/Minecraft.Client/Common/Media/MenuBackground480.swf differ diff --git a/Minecraft.Client/Common/Media/MenuBackground720.swf b/Minecraft.Client/Common/Media/MenuBackground720.swf new file mode 100644 index 00000000..9668b865 Binary files /dev/null and b/Minecraft.Client/Common/Media/MenuBackground720.swf differ diff --git a/Minecraft.Client/Common/Media/MenuBackgroundVita.swf b/Minecraft.Client/Common/Media/MenuBackgroundVita.swf new file mode 100644 index 00000000..9067027b Binary files /dev/null and b/Minecraft.Client/Common/Media/MenuBackgroundVita.swf differ diff --git a/Minecraft.Client/Common/Media/MessageBox1080.swf b/Minecraft.Client/Common/Media/MessageBox1080.swf new file mode 100644 index 00000000..eba77b2f Binary files /dev/null and b/Minecraft.Client/Common/Media/MessageBox1080.swf differ diff --git a/Minecraft.Client/Common/Media/MessageBox480.swf b/Minecraft.Client/Common/Media/MessageBox480.swf new file mode 100644 index 00000000..4190c5ee Binary files /dev/null and b/Minecraft.Client/Common/Media/MessageBox480.swf differ diff --git a/Minecraft.Client/Common/Media/MessageBox720.swf b/Minecraft.Client/Common/Media/MessageBox720.swf new file mode 100644 index 00000000..5b0dd657 Binary files /dev/null and b/Minecraft.Client/Common/Media/MessageBox720.swf differ diff --git a/Minecraft.Client/Common/Media/MessageBoxSplit1080.swf b/Minecraft.Client/Common/Media/MessageBoxSplit1080.swf new file mode 100644 index 00000000..7a968050 Binary files /dev/null and b/Minecraft.Client/Common/Media/MessageBoxSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/MessageBoxSplit720.swf b/Minecraft.Client/Common/Media/MessageBoxSplit720.swf new file mode 100644 index 00000000..17106ae6 Binary files /dev/null and b/Minecraft.Client/Common/Media/MessageBoxSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/MessageBoxVita.swf b/Minecraft.Client/Common/Media/MessageBoxVita.swf new file mode 100644 index 00000000..e032b5d2 Binary files /dev/null and b/Minecraft.Client/Common/Media/MessageBoxVita.swf differ diff --git a/Minecraft.Client/Common/Media/NewUpdateMessage1080.swf b/Minecraft.Client/Common/Media/NewUpdateMessage1080.swf new file mode 100644 index 00000000..4ac9b9b4 Binary files /dev/null and b/Minecraft.Client/Common/Media/NewUpdateMessage1080.swf differ diff --git a/Minecraft.Client/Common/Media/NewUpdateMessage480.swf b/Minecraft.Client/Common/Media/NewUpdateMessage480.swf new file mode 100644 index 00000000..30920167 Binary files /dev/null and b/Minecraft.Client/Common/Media/NewUpdateMessage480.swf differ diff --git a/Minecraft.Client/Common/Media/NewUpdateMessage720.swf b/Minecraft.Client/Common/Media/NewUpdateMessage720.swf new file mode 100644 index 00000000..a2a44878 Binary files /dev/null and b/Minecraft.Client/Common/Media/NewUpdateMessage720.swf differ diff --git a/Minecraft.Client/Common/Media/NewUpdateMessageVita.swf b/Minecraft.Client/Common/Media/NewUpdateMessageVita.swf new file mode 100644 index 00000000..4e8dfdf0 Binary files /dev/null and b/Minecraft.Client/Common/Media/NewUpdateMessageVita.swf differ diff --git a/Minecraft.Client/Common/Media/Panorama1080.swf b/Minecraft.Client/Common/Media/Panorama1080.swf new file mode 100644 index 00000000..a73b2b85 Binary files /dev/null and b/Minecraft.Client/Common/Media/Panorama1080.swf differ diff --git a/Minecraft.Client/Common/Media/Panorama480.swf b/Minecraft.Client/Common/Media/Panorama480.swf new file mode 100644 index 00000000..9cd162a2 Binary files /dev/null and b/Minecraft.Client/Common/Media/Panorama480.swf differ diff --git a/Minecraft.Client/Common/Media/Panorama720.swf b/Minecraft.Client/Common/Media/Panorama720.swf new file mode 100644 index 00000000..07cc2e36 Binary files /dev/null and b/Minecraft.Client/Common/Media/Panorama720.swf differ diff --git a/Minecraft.Client/Common/Media/PanoramaSplit1080.swf b/Minecraft.Client/Common/Media/PanoramaSplit1080.swf new file mode 100644 index 00000000..f0178099 Binary files /dev/null and b/Minecraft.Client/Common/Media/PanoramaSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/PanoramaSplit720.swf b/Minecraft.Client/Common/Media/PanoramaSplit720.swf new file mode 100644 index 00000000..459e7bc9 Binary files /dev/null and b/Minecraft.Client/Common/Media/PanoramaSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/PanoramaVita.swf b/Minecraft.Client/Common/Media/PanoramaVita.swf new file mode 100644 index 00000000..281d0cf7 Binary files /dev/null and b/Minecraft.Client/Common/Media/PanoramaVita.swf differ diff --git a/Minecraft.Client/Common/Media/PauseMenu1080.swf b/Minecraft.Client/Common/Media/PauseMenu1080.swf new file mode 100644 index 00000000..9259be16 Binary files /dev/null and b/Minecraft.Client/Common/Media/PauseMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/PauseMenu480.swf b/Minecraft.Client/Common/Media/PauseMenu480.swf new file mode 100644 index 00000000..747ea97e Binary files /dev/null and b/Minecraft.Client/Common/Media/PauseMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/PauseMenu720.swf b/Minecraft.Client/Common/Media/PauseMenu720.swf new file mode 100644 index 00000000..aa60f80c Binary files /dev/null and b/Minecraft.Client/Common/Media/PauseMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/PauseMenuSplit1080.swf b/Minecraft.Client/Common/Media/PauseMenuSplit1080.swf new file mode 100644 index 00000000..31c8a99d Binary files /dev/null and b/Minecraft.Client/Common/Media/PauseMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/PauseMenuSplit720.swf b/Minecraft.Client/Common/Media/PauseMenuSplit720.swf new file mode 100644 index 00000000..fec48456 Binary files /dev/null and b/Minecraft.Client/Common/Media/PauseMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/PauseMenuVita.swf b/Minecraft.Client/Common/Media/PauseMenuVita.swf new file mode 100644 index 00000000..bb811234 Binary files /dev/null and b/Minecraft.Client/Common/Media/PauseMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/PressStartToPlay1080.swf b/Minecraft.Client/Common/Media/PressStartToPlay1080.swf new file mode 100644 index 00000000..87de331d Binary files /dev/null and b/Minecraft.Client/Common/Media/PressStartToPlay1080.swf differ diff --git a/Minecraft.Client/Common/Media/PressStartToPlay480.swf b/Minecraft.Client/Common/Media/PressStartToPlay480.swf new file mode 100644 index 00000000..dab6c326 Binary files /dev/null and b/Minecraft.Client/Common/Media/PressStartToPlay480.swf differ diff --git a/Minecraft.Client/Common/Media/PressStartToPlay720.swf b/Minecraft.Client/Common/Media/PressStartToPlay720.swf new file mode 100644 index 00000000..2554a31d Binary files /dev/null and b/Minecraft.Client/Common/Media/PressStartToPlay720.swf differ diff --git a/Minecraft.Client/Common/Media/PressStartToPlayVita.swf b/Minecraft.Client/Common/Media/PressStartToPlayVita.swf new file mode 100644 index 00000000..339d134b Binary files /dev/null and b/Minecraft.Client/Common/Media/PressStartToPlayVita.swf differ diff --git a/Minecraft.Client/Common/Media/QuadrantSignin1080.swf b/Minecraft.Client/Common/Media/QuadrantSignin1080.swf new file mode 100644 index 00000000..92e2f348 Binary files /dev/null and b/Minecraft.Client/Common/Media/QuadrantSignin1080.swf differ diff --git a/Minecraft.Client/Common/Media/QuadrantSignin720.swf b/Minecraft.Client/Common/Media/QuadrantSignin720.swf new file mode 100644 index 00000000..d22c12a2 Binary files /dev/null and b/Minecraft.Client/Common/Media/QuadrantSignin720.swf differ diff --git a/Minecraft.Client/Common/Media/ReinstallMenu1080.swf b/Minecraft.Client/Common/Media/ReinstallMenu1080.swf new file mode 100644 index 00000000..cff53681 Binary files /dev/null and b/Minecraft.Client/Common/Media/ReinstallMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/ReinstallMenu480.swf b/Minecraft.Client/Common/Media/ReinstallMenu480.swf new file mode 100644 index 00000000..d7c580e9 Binary files /dev/null and b/Minecraft.Client/Common/Media/ReinstallMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/ReinstallMenu720.swf b/Minecraft.Client/Common/Media/ReinstallMenu720.swf new file mode 100644 index 00000000..3d3ccd82 Binary files /dev/null and b/Minecraft.Client/Common/Media/ReinstallMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/ReinstallMenuSplit1080.swf b/Minecraft.Client/Common/Media/ReinstallMenuSplit1080.swf new file mode 100644 index 00000000..fc77e2a2 Binary files /dev/null and b/Minecraft.Client/Common/Media/ReinstallMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/ReinstallMenuSplit720.swf b/Minecraft.Client/Common/Media/ReinstallMenuSplit720.swf new file mode 100644 index 00000000..9749eb8e Binary files /dev/null and b/Minecraft.Client/Common/Media/ReinstallMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/ReinstallMenuVita.swf b/Minecraft.Client/Common/Media/ReinstallMenuVita.swf new file mode 100644 index 00000000..8df38f63 Binary files /dev/null and b/Minecraft.Client/Common/Media/ReinstallMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/SaveMenu1080.swf b/Minecraft.Client/Common/Media/SaveMenu1080.swf new file mode 100644 index 00000000..ff546d74 Binary files /dev/null and b/Minecraft.Client/Common/Media/SaveMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/SaveMessage1080.swf b/Minecraft.Client/Common/Media/SaveMessage1080.swf new file mode 100644 index 00000000..1108359d Binary files /dev/null and b/Minecraft.Client/Common/Media/SaveMessage1080.swf differ diff --git a/Minecraft.Client/Common/Media/SaveMessage480.swf b/Minecraft.Client/Common/Media/SaveMessage480.swf new file mode 100644 index 00000000..094e4811 Binary files /dev/null and b/Minecraft.Client/Common/Media/SaveMessage480.swf differ diff --git a/Minecraft.Client/Common/Media/SaveMessage720.swf b/Minecraft.Client/Common/Media/SaveMessage720.swf new file mode 100644 index 00000000..dc0cec49 Binary files /dev/null and b/Minecraft.Client/Common/Media/SaveMessage720.swf differ diff --git a/Minecraft.Client/Common/Media/SaveMessageVita.swf b/Minecraft.Client/Common/Media/SaveMessageVita.swf new file mode 100644 index 00000000..f4017ed2 Binary files /dev/null and b/Minecraft.Client/Common/Media/SaveMessageVita.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsAudioMenu1080.swf b/Minecraft.Client/Common/Media/SettingsAudioMenu1080.swf new file mode 100644 index 00000000..cc3330ab Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsAudioMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsAudioMenu480.swf b/Minecraft.Client/Common/Media/SettingsAudioMenu480.swf new file mode 100644 index 00000000..aaa79aee Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsAudioMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsAudioMenu720.swf b/Minecraft.Client/Common/Media/SettingsAudioMenu720.swf new file mode 100644 index 00000000..45993245 Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsAudioMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsAudioMenuSplit1080.swf b/Minecraft.Client/Common/Media/SettingsAudioMenuSplit1080.swf new file mode 100644 index 00000000..6115bf4f Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsAudioMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsAudioMenuSplit720.swf b/Minecraft.Client/Common/Media/SettingsAudioMenuSplit720.swf new file mode 100644 index 00000000..7dd3f025 Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsAudioMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsAudioMenuVita.swf b/Minecraft.Client/Common/Media/SettingsAudioMenuVita.swf new file mode 100644 index 00000000..86e7295c Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsAudioMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsControlMenu1080.swf b/Minecraft.Client/Common/Media/SettingsControlMenu1080.swf new file mode 100644 index 00000000..19f88ec2 Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsControlMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsControlMenu480.swf b/Minecraft.Client/Common/Media/SettingsControlMenu480.swf new file mode 100644 index 00000000..1e05af61 Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsControlMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsControlMenu720.swf b/Minecraft.Client/Common/Media/SettingsControlMenu720.swf new file mode 100644 index 00000000..983e879e Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsControlMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsControlMenuSplit1080.swf b/Minecraft.Client/Common/Media/SettingsControlMenuSplit1080.swf new file mode 100644 index 00000000..58770d0a Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsControlMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsControlMenuSplit720.swf b/Minecraft.Client/Common/Media/SettingsControlMenuSplit720.swf new file mode 100644 index 00000000..2893aac0 Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsControlMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsControlMenuVita.swf b/Minecraft.Client/Common/Media/SettingsControlMenuVita.swf new file mode 100644 index 00000000..dcf91a67 Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsControlMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsGraphicsMenu1080.swf b/Minecraft.Client/Common/Media/SettingsGraphicsMenu1080.swf new file mode 100644 index 00000000..3a48abc9 Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsGraphicsMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsGraphicsMenu480.swf b/Minecraft.Client/Common/Media/SettingsGraphicsMenu480.swf new file mode 100644 index 00000000..4fb884a9 Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsGraphicsMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsGraphicsMenu720.swf b/Minecraft.Client/Common/Media/SettingsGraphicsMenu720.swf new file mode 100644 index 00000000..94996803 Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsGraphicsMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsGraphicsMenuSplit1080.swf b/Minecraft.Client/Common/Media/SettingsGraphicsMenuSplit1080.swf new file mode 100644 index 00000000..6037882d Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsGraphicsMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsGraphicsMenuSplit720.swf b/Minecraft.Client/Common/Media/SettingsGraphicsMenuSplit720.swf new file mode 100644 index 00000000..133dae45 Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsGraphicsMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsGraphicsMenuVita.swf b/Minecraft.Client/Common/Media/SettingsGraphicsMenuVita.swf new file mode 100644 index 00000000..5e937d4d Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsGraphicsMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsMenu1080.swf b/Minecraft.Client/Common/Media/SettingsMenu1080.swf new file mode 100644 index 00000000..9e922acd Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsMenu480.swf b/Minecraft.Client/Common/Media/SettingsMenu480.swf new file mode 100644 index 00000000..4f94774b Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsMenu720.swf b/Minecraft.Client/Common/Media/SettingsMenu720.swf new file mode 100644 index 00000000..38371275 Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsMenuSplit1080.swf b/Minecraft.Client/Common/Media/SettingsMenuSplit1080.swf new file mode 100644 index 00000000..467b2e1f Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsMenuSplit720.swf b/Minecraft.Client/Common/Media/SettingsMenuSplit720.swf new file mode 100644 index 00000000..7c504168 Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsMenuVita.swf b/Minecraft.Client/Common/Media/SettingsMenuVita.swf new file mode 100644 index 00000000..b8bd51b7 Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsOptionsMenu1080.swf b/Minecraft.Client/Common/Media/SettingsOptionsMenu1080.swf new file mode 100644 index 00000000..ede96935 Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsOptionsMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsOptionsMenu480.swf b/Minecraft.Client/Common/Media/SettingsOptionsMenu480.swf new file mode 100644 index 00000000..d3d5b93e Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsOptionsMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsOptionsMenu720.swf b/Minecraft.Client/Common/Media/SettingsOptionsMenu720.swf new file mode 100644 index 00000000..ce8434bf Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsOptionsMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsOptionsMenuSplit1080.swf b/Minecraft.Client/Common/Media/SettingsOptionsMenuSplit1080.swf new file mode 100644 index 00000000..b435a238 Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsOptionsMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsOptionsMenuSplit720.swf b/Minecraft.Client/Common/Media/SettingsOptionsMenuSplit720.swf new file mode 100644 index 00000000..d178d4cb Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsOptionsMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsOptionsMenuVita.swf b/Minecraft.Client/Common/Media/SettingsOptionsMenuVita.swf new file mode 100644 index 00000000..562a0c22 Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsOptionsMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsUIMenu1080.swf b/Minecraft.Client/Common/Media/SettingsUIMenu1080.swf new file mode 100644 index 00000000..a72537df Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsUIMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsUIMenu480.swf b/Minecraft.Client/Common/Media/SettingsUIMenu480.swf new file mode 100644 index 00000000..a25ea999 Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsUIMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsUIMenu720.swf b/Minecraft.Client/Common/Media/SettingsUIMenu720.swf new file mode 100644 index 00000000..b1987781 Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsUIMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsUIMenuSplit1080.swf b/Minecraft.Client/Common/Media/SettingsUIMenuSplit1080.swf new file mode 100644 index 00000000..18128a0e Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsUIMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsUIMenuSplit720.swf b/Minecraft.Client/Common/Media/SettingsUIMenuSplit720.swf new file mode 100644 index 00000000..5ca09874 Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsUIMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsUIMenuVita.swf b/Minecraft.Client/Common/Media/SettingsUIMenuVita.swf new file mode 100644 index 00000000..76eaf79d Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsUIMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/SignEntryMenu1080.swf b/Minecraft.Client/Common/Media/SignEntryMenu1080.swf new file mode 100644 index 00000000..710de35e Binary files /dev/null and b/Minecraft.Client/Common/Media/SignEntryMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/SignEntryMenu480.swf b/Minecraft.Client/Common/Media/SignEntryMenu480.swf new file mode 100644 index 00000000..9e980151 Binary files /dev/null and b/Minecraft.Client/Common/Media/SignEntryMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/SignEntryMenu720.swf b/Minecraft.Client/Common/Media/SignEntryMenu720.swf new file mode 100644 index 00000000..7118faef Binary files /dev/null and b/Minecraft.Client/Common/Media/SignEntryMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/SignEntryMenuSplit1080.swf b/Minecraft.Client/Common/Media/SignEntryMenuSplit1080.swf new file mode 100644 index 00000000..4bea3fcd Binary files /dev/null and b/Minecraft.Client/Common/Media/SignEntryMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/SignEntryMenuSplit720.swf b/Minecraft.Client/Common/Media/SignEntryMenuSplit720.swf new file mode 100644 index 00000000..a26f2534 Binary files /dev/null and b/Minecraft.Client/Common/Media/SignEntryMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/SignEntryMenuVita.swf b/Minecraft.Client/Common/Media/SignEntryMenuVita.swf new file mode 100644 index 00000000..1c7e5efa Binary files /dev/null and b/Minecraft.Client/Common/Media/SignEntryMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/SkinSelectMenu1080.swf b/Minecraft.Client/Common/Media/SkinSelectMenu1080.swf new file mode 100644 index 00000000..5eaf67fb Binary files /dev/null and b/Minecraft.Client/Common/Media/SkinSelectMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/SkinSelectMenu480.swf b/Minecraft.Client/Common/Media/SkinSelectMenu480.swf new file mode 100644 index 00000000..236bb593 Binary files /dev/null and b/Minecraft.Client/Common/Media/SkinSelectMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/SkinSelectMenu720.swf b/Minecraft.Client/Common/Media/SkinSelectMenu720.swf new file mode 100644 index 00000000..059ae199 Binary files /dev/null and b/Minecraft.Client/Common/Media/SkinSelectMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/SkinSelectMenuSplit1080.swf b/Minecraft.Client/Common/Media/SkinSelectMenuSplit1080.swf new file mode 100644 index 00000000..03c532fe Binary files /dev/null and b/Minecraft.Client/Common/Media/SkinSelectMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/SkinSelectMenuSplit720.swf b/Minecraft.Client/Common/Media/SkinSelectMenuSplit720.swf new file mode 100644 index 00000000..a49f20e8 Binary files /dev/null and b/Minecraft.Client/Common/Media/SkinSelectMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/SkinSelectMenuVita.swf b/Minecraft.Client/Common/Media/SkinSelectMenuVita.swf new file mode 100644 index 00000000..f46cda9b Binary files /dev/null and b/Minecraft.Client/Common/Media/SkinSelectMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/SocialPost1080.swf b/Minecraft.Client/Common/Media/SocialPost1080.swf new file mode 100644 index 00000000..58377378 Binary files /dev/null and b/Minecraft.Client/Common/Media/SocialPost1080.swf differ diff --git a/Minecraft.Client/Common/Media/SocialPost480.swf b/Minecraft.Client/Common/Media/SocialPost480.swf new file mode 100644 index 00000000..90711844 Binary files /dev/null and b/Minecraft.Client/Common/Media/SocialPost480.swf differ diff --git a/Minecraft.Client/Common/Media/SocialPost720.swf b/Minecraft.Client/Common/Media/SocialPost720.swf new file mode 100644 index 00000000..8f96a982 Binary files /dev/null and b/Minecraft.Client/Common/Media/SocialPost720.swf differ diff --git a/Minecraft.Client/Common/Media/SocialPostSplit1080.swf b/Minecraft.Client/Common/Media/SocialPostSplit1080.swf new file mode 100644 index 00000000..68d7cc5d Binary files /dev/null and b/Minecraft.Client/Common/Media/SocialPostSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/SocialPostSplit720.swf b/Minecraft.Client/Common/Media/SocialPostSplit720.swf new file mode 100644 index 00000000..0fa023d1 Binary files /dev/null and b/Minecraft.Client/Common/Media/SocialPostSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/SocialPostVita.swf b/Minecraft.Client/Common/Media/SocialPostVita.swf new file mode 100644 index 00000000..94f79ae4 Binary files /dev/null and b/Minecraft.Client/Common/Media/SocialPostVita.swf differ diff --git a/Minecraft.Client/Common/Media/Sound/MenuSounds.xap b/Minecraft.Client/Common/Media/Sound/MenuSounds.xap new file mode 100644 index 00000000..998e0090 --- /dev/null +++ b/Minecraft.Client/Common/Media/Sound/MenuSounds.xap @@ -0,0 +1,808 @@ +Signature = XACT3; +Version = 18; +Content Version = 46; +Release = February 2010; + +Options +{ + Verbose Report = 0; + Generate C/C++ Headers = 1; +} + +Global Settings +{ + Xbox File = Xbox\MenuSounds.xgs; + Windows File = Win\MenuSounds.xgs; + Header File = C:\Work\4J\Mojang\Minecraft\Minecraft360\Minecraft.Client\Xbox\Media\Sound\MenuSounds.h; + Exclude Category Names = 0; + Exclude Variable Names = 0; + Last Modified Low = 30214254; + Last Modified High = 4282487269; + + Category + { + Name = Global; + Public = 1; + Background Music = 0; + Volume = 0; + + Category Entry + { + } + + Instance Limit + { + Max Instances = 255; + Behavior = 0; + + Crossfade + { + Fade In = 0; + Fade Out = 0; + Crossfade Type = 0; + } + } + } + + Category + { + Name = Default; + Public = 1; + Background Music = 0; + Volume = 0; + + Category Entry + { + Name = Global; + } + + Instance Limit + { + Max Instances = 255; + Behavior = 0; + + Crossfade + { + Fade In = 0; + Fade Out = 0; + Crossfade Type = 0; + } + } + } + + Category + { + Name = Music; + Public = 1; + Background Music = 1; + Volume = 0; + + Category Entry + { + Name = Global; + } + + Instance Limit + { + Max Instances = 255; + Behavior = 0; + + Crossfade + { + Fade In = 0; + Fade Out = 0; + Crossfade Type = 0; + } + } + } + + Variable + { + Name = OrientationAngle; + Public = 1; + Global = 0; + Internal = 0; + External = 0; + Monitored = 1; + Reserved = 1; + Read Only = 0; + Time = 0; + Value = 0.000000; + Initial Value = 0.000000; + Min = -180.000000; + Max = 180.000000; + } + + Variable + { + Name = DopplerPitchScalar; + Public = 1; + Global = 0; + Internal = 0; + External = 0; + Monitored = 1; + Reserved = 1; + Read Only = 0; + Time = 0; + Value = 1.000000; + Initial Value = 1.000000; + Min = 0.000000; + Max = 4.000000; + } + + Variable + { + Name = SpeedOfSound; + Public = 1; + Global = 1; + Internal = 0; + External = 0; + Monitored = 1; + Reserved = 1; + Read Only = 0; + Time = 0; + Value = 343.500000; + Initial Value = 343.500000; + Min = 0.000000; + Max = 1000000.000000; + } + + Variable + { + Name = ReleaseTime; + Public = 1; + Global = 0; + Internal = 1; + External = 1; + Monitored = 1; + Reserved = 1; + Read Only = 1; + Time = 1; + Value = 0.000000; + Initial Value = 0.000000; + Min = 0.000000; + Max = 15000.000000; + } + + Variable + { + Name = AttackTime; + Public = 1; + Global = 0; + Internal = 1; + External = 1; + Monitored = 1; + Reserved = 1; + Read Only = 1; + Time = 1; + Value = 0.000000; + Initial Value = 0.000000; + Min = 0.000000; + Max = 15000.000000; + } + + Variable + { + Name = NumCueInstances; + Public = 1; + Global = 0; + Internal = 1; + External = 1; + Monitored = 1; + Reserved = 1; + Read Only = 1; + Time = 0; + Value = 0.000000; + Initial Value = 0.000000; + Min = 0.000000; + Max = 1024.000000; + } + + Variable + { + Name = Distance; + Public = 1; + Global = 0; + Internal = 0; + External = 0; + Monitored = 1; + Reserved = 1; + Read Only = 0; + Time = 0; + Value = 0.000000; + Initial Value = 0.000000; + Min = 0.000000; + Max = 1000000.000000; + } + + RPC + { + Name = Pitch; + } + + Compression Preset + { + Name = Default; + Xbox Format Tag = 357; + Target Sample Rate = 48000; + XMA Quality = 60; + Find Best Quality = 0; + High Freq Cut = 0; + Loop = 0; + PC Format Tag = 2; + Samples Per Block = 128; + } +} + +Wave Bank +{ + Name = MenuSounds; + Xbox File = Xbox\MenuSounds.xwb; + Windows File = Win\MenuSounds.xwb; + Xbox Bank Path Edited = 0; + Windows Bank Path Edited = 0; + Entry Names = 1; + Seek Tables = 1; + Compression Preset Name = Default; + Bank Last Revised Low = 4141013591; + Bank Last Revised High = 30214257; + + Wave + { + Name = wood click; + File = wood click.wav; + Build Settings Last Modified Low = 4121320074; + Build Settings Last Modified High = 30213378; + + Cache + { + Format Tag = 0; + Channels = 1; + Sampling Rate = 44100; + Bits Per Sample = 1; + Play Region Offset = 44; + Play Region Length = 13868; + Loop Region Offset = 0; + Loop Region Length = 0; + File Type = 1; + Last Modified Low = 2058846419; + Last Modified High = 30205926; + } + } + + Wave + { + Name = btn_Back; + File = btn_Back.wav; + Build Settings Last Modified Low = 1085331294; + Build Settings Last Modified High = 30213595; + + Cache + { + Format Tag = 0; + Channels = 2; + Sampling Rate = 48000; + Bits Per Sample = 1; + Play Region Offset = 44; + Play Region Length = 47368; + Loop Region Offset = 0; + Loop Region Length = 0; + File Type = 1; + Last Modified Low = 2645456735; + Last Modified High = 30170504; + } + } + + Wave + { + Name = pop; + File = pop.wav; + Build Settings Last Modified Low = 1085336294; + Build Settings Last Modified High = 30213595; + + Cache + { + Format Tag = 0; + Channels = 1; + Sampling Rate = 44100; + Bits Per Sample = 1; + Play Region Offset = 44; + Play Region Length = 15340; + Loop Region Offset = 0; + Loop Region Length = 0; + File Type = 1; + Last Modified Low = 2055455989; + Last Modified High = 30205926; + } + } + + Wave + { + Name = Scroll1; + File = Scroll1.wav; + Build Settings Last Modified Low = 2362955424; + Build Settings Last Modified High = 30214253; + + Cache + { + Format Tag = 0; + Channels = 1; + Sampling Rate = 44100; + Bits Per Sample = 1; + Play Region Offset = 112; + Play Region Length = 18228; + Loop Region Offset = 0; + Loop Region Length = 0; + File Type = 1; + Last Modified Low = 3761304897; + Last Modified High = 30214252; + } + } + + Wave + { + Name = Back3; + File = Back3.wav; + Build Settings Last Modified Low = 2362965426; + Build Settings Last Modified High = 30214253; + + Cache + { + Format Tag = 0; + Channels = 2; + Sampling Rate = 44100; + Bits Per Sample = 1; + Play Region Offset = 112; + Play Region Length = 43272; + Loop Region Offset = 0; + Loop Region Length = 0; + File Type = 1; + Last Modified Low = 3722514971; + Last Modified High = 30214252; + } + } + + Wave + { + Name = Scroll3; + File = Scroll3.wav; + Build Settings Last Modified Low = 3498867049; + Build Settings Last Modified High = 30214257; + + Cache + { + Format Tag = 0; + Channels = 2; + Sampling Rate = 44100; + Bits Per Sample = 1; + Play Region Offset = 112; + Play Region Length = 5828; + Loop Region Offset = 0; + Loop Region Length = 0; + File Type = 1; + Last Modified Low = 3757184373; + Last Modified High = 30214252; + } + } +} + +Sound Bank +{ + Name = MenuSounds; + Xbox File = Xbox\MenuSounds.xsb; + Windows File = Win\MenuSounds.xsb; + Xbox Bank Path Edited = 0; + Windows Bank Path Edited = 0; + Header Last Modified High = 0; + Header Last Modified Low = 0; + + Sound + { + Name = ButtonPress; + Volume = -1670; + Pitch = 0; + Priority = 0; + + Category Entry + { + Name = Default; + } + + Track + { + Volume = 0; + Use Filter = 0; + + Play Wave Event + { + Break Loop = 0; + Use Speaker Position = 0; + Use Center Speaker = 1; + New Speaker Position On Loop = 1; + Speaker Position Angle = 0.000000; + Speaker Position Arc = 0.000000; + + Event Header + { + Timestamp = 0; + Relative = 0; + Random Recurrence = 0; + Random Offset = 0; + } + + Wave Entry + { + Bank Name = MenuSounds; + Bank Index = 0; + Entry Name = wood click; + Entry Index = 0; + Weight = 255; + Weight Min = 0; + } + } + } + } + + Sound + { + Name = ButtonFocus; + Volume = -320; + Pitch = 531; + Priority = 0; + + Category Entry + { + Name = Default; + } + + Track + { + Volume = 0; + Use Filter = 0; + + Play Wave Event + { + Break Loop = 0; + Use Speaker Position = 0; + Use Center Speaker = 1; + New Speaker Position On Loop = 1; + Speaker Position Angle = 0.000000; + Speaker Position Arc = 0.000000; + + Event Header + { + Timestamp = 0; + Relative = 0; + Random Recurrence = 0; + Random Offset = 0; + } + + Pitch Variation + { + Min = -100; + Max = 100; + Operator = 0; + New Variation On Loop = 0; + } + + Wave Entry + { + Bank Name = MenuSounds; + Bank Index = 0; + Entry Name = Scroll1; + Entry Index = 3; + Weight = 255; + Weight Min = 0; + } + } + } + } + + Sound + { + Name = ButtonCraft; + Volume = -1200; + Pitch = 0; + Priority = 0; + + Category Entry + { + Name = Default; + } + + Track + { + Volume = 0; + Use Filter = 0; + + Play Wave Event + { + Break Loop = 0; + Use Speaker Position = 0; + Use Center Speaker = 1; + New Speaker Position On Loop = 1; + Speaker Position Angle = 0.000000; + Speaker Position Arc = 0.000000; + + Event Header + { + Timestamp = 0; + Relative = 0; + Random Recurrence = 0; + Random Offset = 0; + } + + Wave Entry + { + Bank Name = MenuSounds; + Bank Index = 0; + Entry Name = pop; + Entry Index = 2; + Weight = 255; + Weight Min = 0; + } + } + } + } + + Sound + { + Name = ButtonCraftFail; + Volume = -1200; + Pitch = 0; + Priority = 0; + + Category Entry + { + Name = Default; + } + + Track + { + Volume = 0; + Use Filter = 0; + + Play Wave Event + { + Break Loop = 0; + Use Speaker Position = 0; + Use Center Speaker = 1; + New Speaker Position On Loop = 1; + Speaker Position Angle = 0.000000; + Speaker Position Arc = 0.000000; + + Event Header + { + Timestamp = 0; + Relative = 0; + Random Recurrence = 0; + Random Offset = 0; + } + + Wave Entry + { + Bank Name = MenuSounds; + Bank Index = 0; + Entry Name = btn_Back; + Entry Index = 1; + Weight = 255; + Weight Min = 0; + } + } + } + } + + Sound + { + Name = ButtonBack; + Volume = -1200; + Pitch = 0; + Priority = 0; + + Category Entry + { + Name = Default; + } + + Track + { + Volume = 0; + Use Filter = 0; + + Play Wave Event + { + Break Loop = 0; + Use Speaker Position = 0; + Use Center Speaker = 1; + New Speaker Position On Loop = 1; + Speaker Position Angle = 0.000000; + Speaker Position Arc = 0.000000; + + Event Header + { + Timestamp = 0; + Relative = 0; + Random Recurrence = 0; + Random Offset = 0; + } + + Wave Entry + { + Bank Name = MenuSounds; + Bank Index = 0; + Entry Name = Back3; + Entry Index = 4; + Weight = 255; + Weight Min = 0; + } + } + } + } + + Sound + { + Name = Scroll; + Volume = -1200; + Pitch = 0; + Priority = 0; + + Category Entry + { + Name = Default; + } + + Track + { + Volume = 0; + Use Filter = 0; + + Play Wave Event + { + Break Loop = 0; + Use Speaker Position = 0; + Use Center Speaker = 1; + New Speaker Position On Loop = 1; + Speaker Position Angle = 0.000000; + Speaker Position Arc = 0.000000; + + Event Header + { + Timestamp = 0; + Relative = 0; + Random Recurrence = 0; + Random Offset = 0; + } + + Wave Entry + { + Bank Name = MenuSounds; + Bank Index = 0; + Entry Name = Scroll3; + Entry Index = 5; + Weight = 255; + Weight Min = 0; + } + } + } + } + + Cue + { + Name = ButtonPress; + + Variation + { + Variation Type = 3; + Variation Table Type = 1; + New Variation on Loop = 0; + } + + Sound Entry + { + Name = ButtonPress; + Index = 0; + Weight Min = 0; + Weight Max = 255; + } + } + + Cue + { + Name = ButtonFocus; + + Variation + { + Variation Type = 3; + Variation Table Type = 1; + New Variation on Loop = 0; + } + + Sound Entry + { + Name = ButtonFocus; + Index = 1; + Weight Min = 0; + Weight Max = 255; + } + } + + Cue + { + Name = ButtonCraft; + + Variation + { + Variation Type = 3; + Variation Table Type = 1; + New Variation on Loop = 0; + } + + Sound Entry + { + Name = ButtonCraft; + Index = 2; + Weight Min = 0; + Weight Max = 255; + } + } + + Cue + { + Name = ButtonCraftFail; + + Variation + { + Variation Type = 3; + Variation Table Type = 1; + New Variation on Loop = 0; + } + + Sound Entry + { + Name = ButtonCraftFail; + Index = 3; + Weight Min = 0; + Weight Max = 255; + } + } + + Cue + { + Name = ButtonBack; + + Variation + { + Variation Type = 3; + Variation Table Type = 1; + New Variation on Loop = 0; + } + + Sound Entry + { + Name = ButtonBack; + Index = 4; + Weight Min = 0; + Weight Max = 255; + } + } + + Cue + { + Name = Scroll; + + Variation + { + Variation Type = 3; + Variation Table Type = 1; + New Variation on Loop = 0; + } + + Sound Entry + { + Name = Scroll; + Index = 5; + Weight Min = 0; + Weight Max = 255; + } + } +} diff --git a/Minecraft.Client/Common/Media/Sound/Xbox/MenuSounds.xgs b/Minecraft.Client/Common/Media/Sound/Xbox/MenuSounds.xgs new file mode 100644 index 00000000..0a676adc Binary files /dev/null and b/Minecraft.Client/Common/Media/Sound/Xbox/MenuSounds.xgs differ diff --git a/Minecraft.Client/Common/Media/Sound/Xbox/MenuSounds.xsb b/Minecraft.Client/Common/Media/Sound/Xbox/MenuSounds.xsb new file mode 100644 index 00000000..3ec3310a Binary files /dev/null and b/Minecraft.Client/Common/Media/Sound/Xbox/MenuSounds.xsb differ diff --git a/Minecraft.Client/Common/Media/Sound/Xbox/MenuSounds.xwb b/Minecraft.Client/Common/Media/Sound/Xbox/MenuSounds.xwb new file mode 100644 index 00000000..e3a7b39b Binary files /dev/null and b/Minecraft.Client/Common/Media/Sound/Xbox/MenuSounds.xwb differ diff --git a/Minecraft.Client/Common/Media/Sound/btn_Back.wav b/Minecraft.Client/Common/Media/Sound/btn_Back.wav new file mode 100644 index 00000000..2bb8100e Binary files /dev/null and b/Minecraft.Client/Common/Media/Sound/btn_Back.wav differ diff --git a/Minecraft.Client/Common/Media/Sound/click.wav b/Minecraft.Client/Common/Media/Sound/click.wav new file mode 100644 index 00000000..0b708578 Binary files /dev/null and b/Minecraft.Client/Common/Media/Sound/click.wav differ diff --git a/Minecraft.Client/Common/Media/Sound/pop.wav b/Minecraft.Client/Common/Media/Sound/pop.wav new file mode 100644 index 00000000..387f1329 Binary files /dev/null and b/Minecraft.Client/Common/Media/Sound/pop.wav differ diff --git a/Minecraft.Client/Common/Media/Sound/wood click.wav b/Minecraft.Client/Common/Media/Sound/wood click.wav new file mode 100644 index 00000000..7a71ba9f Binary files /dev/null and b/Minecraft.Client/Common/Media/Sound/wood click.wav differ diff --git a/Minecraft.Client/Common/Media/Timer1080.swf b/Minecraft.Client/Common/Media/Timer1080.swf new file mode 100644 index 00000000..613908c6 Binary files /dev/null and b/Minecraft.Client/Common/Media/Timer1080.swf differ diff --git a/Minecraft.Client/Common/Media/Timer480.swf b/Minecraft.Client/Common/Media/Timer480.swf new file mode 100644 index 00000000..d86c8a95 Binary files /dev/null and b/Minecraft.Client/Common/Media/Timer480.swf differ diff --git a/Minecraft.Client/Common/Media/Timer720.swf b/Minecraft.Client/Common/Media/Timer720.swf new file mode 100644 index 00000000..3ec17805 Binary files /dev/null and b/Minecraft.Client/Common/Media/Timer720.swf differ diff --git a/Minecraft.Client/Common/Media/TimerSplit1080.swf b/Minecraft.Client/Common/Media/TimerSplit1080.swf new file mode 100644 index 00000000..31c8c742 Binary files /dev/null and b/Minecraft.Client/Common/Media/TimerSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/TimerSplit720.swf b/Minecraft.Client/Common/Media/TimerSplit720.swf new file mode 100644 index 00000000..55e608f0 Binary files /dev/null and b/Minecraft.Client/Common/Media/TimerSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/TimerVita.swf b/Minecraft.Client/Common/Media/TimerVita.swf new file mode 100644 index 00000000..6eddd47e Binary files /dev/null and b/Minecraft.Client/Common/Media/TimerVita.swf differ diff --git a/Minecraft.Client/Common/Media/ToolTips1080.swf b/Minecraft.Client/Common/Media/ToolTips1080.swf new file mode 100644 index 00000000..2251f80e Binary files /dev/null and b/Minecraft.Client/Common/Media/ToolTips1080.swf differ diff --git a/Minecraft.Client/Common/Media/ToolTips480.swf b/Minecraft.Client/Common/Media/ToolTips480.swf new file mode 100644 index 00000000..3ebebb9b Binary files /dev/null and b/Minecraft.Client/Common/Media/ToolTips480.swf differ diff --git a/Minecraft.Client/Common/Media/ToolTips720.swf b/Minecraft.Client/Common/Media/ToolTips720.swf new file mode 100644 index 00000000..7c5a5ba4 Binary files /dev/null and b/Minecraft.Client/Common/Media/ToolTips720.swf differ diff --git a/Minecraft.Client/Common/Media/ToolTipsSplit1080.swf b/Minecraft.Client/Common/Media/ToolTipsSplit1080.swf new file mode 100644 index 00000000..820fdda1 Binary files /dev/null and b/Minecraft.Client/Common/Media/ToolTipsSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/ToolTipsSplit720.swf b/Minecraft.Client/Common/Media/ToolTipsSplit720.swf new file mode 100644 index 00000000..7c5ae7ea Binary files /dev/null and b/Minecraft.Client/Common/Media/ToolTipsSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/ToolTipsVita.swf b/Minecraft.Client/Common/Media/ToolTipsVita.swf new file mode 100644 index 00000000..c2b9dfe8 Binary files /dev/null and b/Minecraft.Client/Common/Media/ToolTipsVita.swf differ diff --git a/Minecraft.Client/Common/Media/TradingMenu1080.swf b/Minecraft.Client/Common/Media/TradingMenu1080.swf new file mode 100644 index 00000000..75b6292e Binary files /dev/null and b/Minecraft.Client/Common/Media/TradingMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/TradingMenu480.swf b/Minecraft.Client/Common/Media/TradingMenu480.swf new file mode 100644 index 00000000..035b4747 Binary files /dev/null and b/Minecraft.Client/Common/Media/TradingMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/TradingMenu720.swf b/Minecraft.Client/Common/Media/TradingMenu720.swf new file mode 100644 index 00000000..774e14b8 Binary files /dev/null and b/Minecraft.Client/Common/Media/TradingMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/TradingMenuSplit1080.swf b/Minecraft.Client/Common/Media/TradingMenuSplit1080.swf new file mode 100644 index 00000000..2545ebb0 Binary files /dev/null and b/Minecraft.Client/Common/Media/TradingMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/TradingMenuSplit720.swf b/Minecraft.Client/Common/Media/TradingMenuSplit720.swf new file mode 100644 index 00000000..5677b19b Binary files /dev/null and b/Minecraft.Client/Common/Media/TradingMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/TradingMenuVita.swf b/Minecraft.Client/Common/Media/TradingMenuVita.swf new file mode 100644 index 00000000..e93787ae Binary files /dev/null and b/Minecraft.Client/Common/Media/TradingMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/TrialExitUpsell480.swf b/Minecraft.Client/Common/Media/TrialExitUpsell480.swf new file mode 100644 index 00000000..ef85c9f3 Binary files /dev/null and b/Minecraft.Client/Common/Media/TrialExitUpsell480.swf differ diff --git a/Minecraft.Client/Common/Media/TrialExitUpsell720.swf b/Minecraft.Client/Common/Media/TrialExitUpsell720.swf new file mode 100644 index 00000000..d564d461 Binary files /dev/null and b/Minecraft.Client/Common/Media/TrialExitUpsell720.swf differ diff --git a/Minecraft.Client/Common/Media/TutorialPopup1080.swf b/Minecraft.Client/Common/Media/TutorialPopup1080.swf new file mode 100644 index 00000000..edd94f4f Binary files /dev/null and b/Minecraft.Client/Common/Media/TutorialPopup1080.swf differ diff --git a/Minecraft.Client/Common/Media/TutorialPopup480.swf b/Minecraft.Client/Common/Media/TutorialPopup480.swf new file mode 100644 index 00000000..321dd391 Binary files /dev/null and b/Minecraft.Client/Common/Media/TutorialPopup480.swf differ diff --git a/Minecraft.Client/Common/Media/TutorialPopup720.swf b/Minecraft.Client/Common/Media/TutorialPopup720.swf new file mode 100644 index 00000000..94b6958e Binary files /dev/null and b/Minecraft.Client/Common/Media/TutorialPopup720.swf differ diff --git a/Minecraft.Client/Common/Media/TutorialPopupSplit1080.swf b/Minecraft.Client/Common/Media/TutorialPopupSplit1080.swf new file mode 100644 index 00000000..bb088d8c Binary files /dev/null and b/Minecraft.Client/Common/Media/TutorialPopupSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/TutorialPopupSplit720.swf b/Minecraft.Client/Common/Media/TutorialPopupSplit720.swf new file mode 100644 index 00000000..3626e9c7 Binary files /dev/null and b/Minecraft.Client/Common/Media/TutorialPopupSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/TutorialPopupVita.swf b/Minecraft.Client/Common/Media/TutorialPopupVita.swf new file mode 100644 index 00000000..e4866163 Binary files /dev/null and b/Minecraft.Client/Common/Media/TutorialPopupVita.swf differ diff --git a/Minecraft.Client/Common/Media/de-DE/4J_strings.resx b/Minecraft.Client/Common/Media/de-DE/4J_strings.resx new file mode 100644 index 00000000..8c11837c --- /dev/null +++ b/Minecraft.Client/Common/Media/de-DE/4J_strings.resx @@ -0,0 +1,108 @@ + +Nicht verwendet + +OK + +Zurück + +Abbrechen + +Ja + +Nein + +Beschädigte Speicherdatei + +Deine Speicherdatei ist beschädigt. Beschädigte Speicherdatei überschreiben und neue erstellen? + +Kein freier Speicherplatz + +Auf dem ausgewählten Speichergerät steht nicht genug freier Speicherplatz zur Verfügung, um eine Speicherdatei für das Spiel zu erstellen. + +Erneut auswählen + +Ohne Speichern spielen + +Neue Speicherdatei erstellen + +Speicherdatei überschreiben? + +Diese Speicherdatei existiert bereits auf deinem ausgewählten Speichergerät. Möchtest du sie überschreiben? + +Nein, nicht überschreiben + +Überschreiben und speichern + +Fehler beim Speichern + +Problem mit dem Speichergerät + +Dein Speichergerät ist nicht verfügbar oder hat einen Fehler verursacht. + +Dein Speichergerät ist nicht verfügbar oder hat einen Fehler verursacht. Wähl ein neues Speichergerät aus. + +Neues Speichergerät auswählen + +Kein Speichergerät ausgewählt + +Wenn du kein Speichergerät auswählst, wird die Speicherfunktion deaktiviert. + +Speichergerät auswählen + +Ohne Speichern fortsetzen + +Dein Speichergerät wurde entfernt. Wähl ein neues aus. + +Fehler beim Laden + +Speicherdatei benennen + +Gib einen Namen für deine Speicherdatei ein. + +Zurück zur Xbox Steuerung + +Bist du sicher, dass du das Spiel verlassen möchtest? + +Abgemeldet + +Du bist zum Titelbildschirm zurückgekehrt, weil dein Spielerprofil abgemeldet wurde. + +Das Spiel wurde beendet, weil ein Spielerprofil abgemeldet wurde. + +Weiterspielen + +Spielerprofil nicht online + +Dieses Spiel verfügt über Funktionen, die ein Spielerprofil mit Xbox Live-Berechtigung erfordern, du bist derzeit aber offline. + +Diese Funktion erfordert ein Spielerprofil, das bei Xbox Live angemeldet ist. + +Mit Xbox Live verbinden + +Offline weiterspielen + +Verleihen des Erfolgs misslungen + + Beim Zugriff auf dein Spielerprofil ist ein Problem aufgetreten. Dein Erfolg kann derzeit nicht verliehen werden. + +Problem mit Spielerprofil + +Fehler beim Speichern der Einstellungen im Spielerprofil. + +Gast-Spielerprofil + +Ein Gast-Spielerprofil kann diese Funktion nicht verwenden. Verwende bitte ein anderes Spielerprofil. + +Speichern ... + +Inhalt wird gespeichert. Bitte schalten Sie Ihre Konsole nicht aus. + +Vollständiges Spiel freischalten + +Dies ist die Testversion von Minecraft. Würdest du das vollständige Spiel besitzen, hättest du dir gerade einen Erfolg verdient! +Schalte das vollständige Spiel frei, um den ganzen Spaß von Minecraft zu erleben und zusammen mit deinen Freunden auf der ganzen Welt über Xbox Live zu spielen. +Jetzt das vollständige Spiel freischalten? + +Du bist zum Hauptmenü zurückgekehrt, weil beim Lesen deines Profils ein Fehler aufgetreten ist. + + diff --git a/Minecraft.Client/Common/Media/de-DE/strings.resx b/Minecraft.Client/Common/Media/de-DE/strings.resx new file mode 100644 index 00000000..430711f8 --- /dev/null +++ b/Minecraft.Client/Common/Media/de-DE/strings.resx @@ -0,0 +1,5168 @@ + +Es sind neue Inhalte zum Herunterladen verfügbar! Du kannst sie im Hauptmenü über die Schaltfläche "Minecraft Store" herunterladen. + +Du kannst das Aussehen deiner Spielfigur mit einem Skinpaket aus dem Minecraft Store anpassen. Wähle "Minecraft Store" im Hauptmenü, um zu sehen, was verfügbar ist. + +Wenn du dieses Spiel im HD-Modus spielst, können auf einer Konsole mit geteiltem Bildschirm bis zu vier Spieler spielen! + +Schließ zusätzliche Controller an deine Konsole an und drück auf ihnen START, um jederzeit einem Spiel beizutreten. + +Ändere die Gamma-Einstellung, um das Spiel heller oder dunkler anzeigen zu lassen. + +Wenn du die Spielschwierigkeit auf Friedlich setzt, wird deine Gesundheit automatisch regeneriert und nachts tauchen keine Monster auf! + +Füttere einen Wolf mit einem Knochen, um ihn zu zähmen. Du kannst ihm dann befehlen, sich zu setzen oder dir zu folgen. + +Du kannst vom Inventarmenü aus Gegenstände ablegen, indem du den Cursor aus dem Menü hinaus bewegst und{*CONTROLLER_VK_A*}drückst. + +Wenn du nachts in einem Bett schläfst, wird die Zeit bis zum Sonnenaufgang vorgedreht. In einem Multiplayer-Spiel müssen sich dafür aber alle Spieler gleichzeitig im Bett befinden. + +Hol dir Schweinefleisch von Schweinen. Koch und iss es, um deine Gesundheit zu regenerieren. + +Hol dir Leder von Kühen und stell daraus Rüstungen her. + +Wenn du einen leeren Eimer hast, kannst du ihn mit Milch von einer Kuh, Wasser oder Lava füllen! + +Bereite mit einer Hacke den Boden aufs Bepflanzen vor. + +Spinnen werden dich tagsüber nicht angreifen, es sei denn, du greifst sie an! + +Erde oder Sand lässt sich mit einem Spaten schneller abbauen als per Hand! + +Mit gekochtem Schweinefleisch regeneriert die Gesundheit besser als mit rohem. + +Stelle Fackeln her, um nachts die Gegend zu erhellen. Monster werden die Bereiche rund um diese Fackeln meiden. + +Mit einer Lore und Schienen erreichst du dein Ziel schneller! + +Pflanz ein paar Setzlinge. Sie werden zu Bäumen heranwachsen. + +Pigmen greifen dich nicht an, es sei denn, du greifst sie an. + +Du kannst deinen Wiedereintrittspunkt ändern und zum Sonnenaufgang vorspringen, indem du in einem Bett schläfst. + +Schleudere die Feuerbälle auf den Ghast zurück! + +Wenn du ein Portal baust, kannst du damit in eine andere Dimension reisen - den Nether. + +Drück{*CONTROLLER_VK_B*}, um den Gegenstand abzulegen, den du derzeit in der Hand hältst! + +Verwende für jede Arbeit das geeignete Werkzeug! + +Wenn du keine Kohle für deine Fackeln findest, kannst du immer noch im Ofen aus Bäumen Holzkohle herstellen. + +Gerade nach unten oder oben zu graben, ist keine so gute Idee. + +Knochenmehl (hergestellt aus einem Skelettknochen) kann als Dünger verwendet werden und lässt Pflanzen sofort wachsen! + +Creeper explodieren, wenn sie dir zu nahe kommen! + +Obsidian entsteht, wenn Wasser auf eine Lavaquelle trifft. + +Es kann Minuten dauern, bis die Lava VOLLSTÄNDIG verschwindet, nachdem die Lavaquelle entfernt wurde. + +Pflasterstein ist immun gegen die Feuerbälle von Ghasts und eignet sich daher zum Schutz von Portalen. + +Alle Blöcke, die als Lichtquelle verwendet werden können, schmelzen Schnee und Eis. Dazu zählen Fackeln, Glowstone und Kürbislaternen. + +Sei vorsichtig, wenn du unter freiem Himmel Strukturen aus Wolle baust, da Gewitterblitze Wolle entzünden können. + +Ein einziger Eimer Lava reicht als Brennmaterial, um in einem Ofen 100 Blöcke zu schmelzen. + +Das Instrument, das ein Notenblock spielt, hängt von dem Material unter dem Block ab. + +Zombies und Skelette können den Kontakt mit Tageslicht überleben, wenn sie sich im Wasser befinden. + +Wenn du einen Wolf angreifst, werden alle Wölfe in der unmittelbaren Umgebung aggressiv und greifen dich an. Das Gleiche gilt für Zombie Pigmen. + +Wölfe können nicht den Nether betreten. + +Wölfe werden keine Creeper angreifen. + +Hühner legen alle 5 bis 10 Minuten ein Ei. + +Obsidian kann nur mit einer Diamantspitzhacke abgebaut werden. + +Creeper sind die einfachste Möglichkeit, zu Schießpulver zu kommen. + +Wenn du zwei Truhen direkt nebeneinander stellst, entsteht eine große Truhe. + +Zahme Wölfe zeigen ihre Gesundheit durch die Haltung ihres Schwanzes an. Füttere sie mit Fleisch, um sie zu heilen. + +Koche Kaktus im Ofen, um grüne Farbe zu erhalten. + +Die neuesten Informationen von 4J Studios und Kappische zu diesem Spiel findest du auf Twitter! + +Beeindrucke deine Freunde, indem du vom Pause-Menü aus Screenshots deiner Minecraft-Werke auf Facebook freigibst! + +Lies dir den Abschnitt „Was ist neu“ im Menü „So wird gespielt“ durch, um die aktuellen Update-Informationen über das Spiel zu erfahren. + +Es gibt jetzt stapelbare Zäune im Spiel! + +minecraftforum hat einen eigenen Bereich zur Xbox 360 Edition. + +Manche Tiere folgen dir, wenn du Weizen in deiner Hand hältst. + +Wenn ein Tier sich nicht mehr als 20 Blöcke in eine beliebige Richtung bewegen kann, verschwindet es nicht. + +Musik von C418! + +Notch hat mehr als eine Million Follower auf Twitter! + +Nicht alle Schweden sind blond. Manche wie Jens von Mojang haben sogar rote Haare! + +Wir glauben, dass 4J Studios Herobrine aus dem Xbox 360 Konsolenspiel entfernt haben, aber wir sind uns nicht ganz sicher. + +Irgendwann wird es ein Update für dieses Spiel geben! + +Wer ist Notch? + +Mojang hat mehr Preise als Mitarbeiter! + +Es gibt berühmte Personen, die Minecraft spielen! + +deadmau5 mag Minecraft! + +Bitte schau nicht direkt auf die Bugs. + +Creeper wurden aus einem Programmierfehler geboren. + +Ist es ein Huhn oder eine Ente? + +Warst du auf der MineCon? + +Niemand bei Mojang hat je das Gesicht von Junkboy gesehen. + +Wusstest du schon, dass es ein Minecraft Wiki gibt? + +Mojangs neues Büro ist cool! + +Minecraft: Xbox 360 Edition hat jede Menge Rekorde gebrochen! + +Die Minecon 2013 fand in Orlando, Florida (USA) statt! + +.party() war exzellent! + +Gerüchte sind sicherlich immer eher falsch als wahr! + +{*T3*}SO WIRD GESPIELT: GRUNDLAGEN{*ETW*}{*B*}{*B*} +Minecraft ist ein Spiel, bei dem du Blöcke platzierst, um alles zu bauen, was du dir vorstellen kannst. Nachts treiben sich Monster herum, du solltest dir eine Zuflucht bauen, bevor sie herauskommen.{*B*}{*B*} +Mit{*CONTROLLER_ACTION_LOOK*} kannst du dich umsehen.{*B*}{*B*} +Mit{*CONTROLLER_ACTION_MOVE*} kannst du dich bewegen.{*B*}{*B*} +Drück{*CONTROLLER_ACTION_JUMP*}, um zu springen.{*B*}{*B*} +Drück{*CONTROLLER_ACTION_MOVE*} zweimal schnell nacheinander nach vorn, um zu sprinten. Solange du{*CONTROLLER_ACTION_MOVE*} nach vorn gedrückt hältst, sprintest du weiter, bis dir die Sprintzeit ausgeht oder deine Hungerleiste weniger als{*ICON_SHANK_03*} anzeigt..{*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. + +{*T3*}SO WIRD GESPIELT: DISPLAY{*ETW*}{*B*}{*B*} +Das Display auf dem Bildschirm zeigt dir Informationen zu deinem Zustand: deine Gesundheit, deinen restlichen Sauerstoff, wenn du unter Wasser bist, deinen Hunger (du musst etwas essen, um ihn zu stillen) und deine Rüstung, wenn du eine trägst. Wenn du Gesundheit verlierst, du aber 9 oder mehr{*ICON_SHANK_01*} in deiner Hungerleiste hast, regeneriert deine Gesundheit sich automatisch. Wenn du Nahrung isst, wird deine Hungerleiste aufgefüllt.{*B*} +Hier wird auch die Erfahrungsleiste angezeigt. Ein Zahlenwert gibt deinen Erfahrungslevel an; die Länge der Leiste zeigt an, wie viele Erfahrungspunkte du benötigst, um deinen Erfahrungslevel zu steigern. Du erhältst Erfahrungspunkte durch Einsammeln von Erfahrungskugeln, die entstehen, wenn NPCs sterben oder wenn du bestimmte Blocktypen abbaust, Tiere züchtest, angelst oder Erze im Ofen schmilzt.{*B*}{*B*} +Das Display zeigt auch die Gegenstände an, die du verwenden kannst. Wechsle mit{*CONTROLLER_ACTION_LEFT_SCROLL*} oder{*CONTROLLER_ACTION_RIGHT_SCROLL*} den Gegenstand in deiner Hand. + +{*T3*}SO WIRD GESPIELT: INVENTAR{*ETW*}{*B*}{*B*} +Sieh dir mit{*CONTROLLER_ACTION_INVENTORY*} dein Inventar an.{*B*}{*B*} +Auf diesem Bildschirm siehst du die Gegenstände, die du in deiner Hand verwenden kannst, und alle anderen Gegenstände, die du bei dir trägst. Außerdem wird hier deine Rüstung angezeigt.{*B*}{*B*} +Beweg den Cursor mit{*CONTROLLER_MENU_NAVIGATE*}. Wähl mit{*CONTROLLER_VK_A*} den Gegenstand unter dem Cursor aus. Wenn sich mehr als ein Gegenstand unter dem Cursor befindet, werden alle aufgenommen. Mit{*CONTROLLER_VK_X*} kannst du nur die Hälfte von ihnen aufnehmen.{*B*}{*B*} +Beweg den Gegenstand mit dem Cursor an einen anderen Platz im Inventar, und leg ihn dort mit{*CONTROLLER_VK_A*} ab. Wenn unter dem Cursor mehrere Gegenstände liegen, kannst du mit{*CONTROLLER_VK_A*} alle ablegen oder mit{*CONTROLLER_VK_X*} nur einen.{*B*}{*B*} +Wenn du den Cursor über eine Rüstung bewegst, informiert eine QuickInfo dich über die Möglichkeit zum Aktivieren des schnellen Bewegens der Rüstung an den richtigen Rüstungsplatz im Inventar.{*B*}{*B*} +Du kannst deine Lederrüstung einfärben, indem du im Inventarmenü die Farbe mit dem Cursor hältst und sie dann mit{*CONTROLLER_VK_X*} auf das Teil anwendest, über dem sich der Cursor befindet. + + +{*T3*}SO WIRD GESPIELT: TRUHE{*ETW*}{*B*}{*B*} +Wenn du eine Truhe erschaffen hast, kannst du sie in der Welt platzieren und dann mit{*CONTROLLER_ACTION_USE*}verwenden, um Gegenstände aus deinem Inventar hineinzulegen.{*B*}{*B*} +Verwende den Cursor, um Gegenstände zwischen deinem Inventar und der Truhe zu verschieben.{*B*}{*B*} +Du kannst Gegenstände in der Truhe lagern, um sie später wieder deinem Inventar hinzuzufügen. + + +{*T3*}SO WIRD GESPIELT: GROSSE TRUHE{*ETW*}{*B*}{*B*} +Wenn du zwei Truhen nebeneinander stellst, werden sie zu einer großen Truhe zusammengefügt. In ihr kannst du noch mehr Gegenstände lagern.{*B*}{*B*} +Sie funktioniert genauso wie eine normale Truhe. + + +{*T3*}SO WIRD GESPIELT: CRAFTING{*ETW*}{*B*}{*B*} +Auf der Crafting-Oberfläche kannst du Gegenstände aus deinem Inventar kombinieren, um neue Arten von Gegenständen zu erschaffen. Öffne die Crafting-Oberfläche mit{*CONTROLLER_ACTION_CRAFTING*}.{*B*}{*B*} +Wechsle mit{*CONTROLLER_VK_LB*} und{*CONTROLLER_VK_RB*} zwischen den Reitern am oberen Rand, um die Art des Gegenstands auszuwählen, den du herstellen möchtest. Wähl dann mit{*CONTROLLER_MENU_NAVIGATE*}den Gegenstand aus, den du herstellen möchtest.{*B*}{*B*} +Der Crafting-Bereich zeigt dir die Gegenstände, die du brauchst, um den neuen Gegenstand herzustellen. Drück{*CONTROLLER_VK_A*}, um den Gegenstand herzustellen und ihn in deinem Inventar abzulegen. + + +{*T3*}SO WIRD GESPIELT: WERKBANK{*ETW*}{*B*}{*B*} +Mit einer Werkbank kannst du größere Gegenstände herstellen.{*B*}{*B*} +Platzier die Werkbank in der Welt und drück{*CONTROLLER_ACTION_USE*}, um sie zu verwenden.{*B*}{*B*} +Crafting auf der Werkbank funktioniert genauso wie einfaches Crafting, allerdings bietet sie mehr Platz und dadurch eine größere Auswahl an Gegenständen, die du herstellen kannst. + + +{*T3*}SO WIRD GESPIELT: OFEN{*ETW*}{*B*}{*B*} +Mit einem Ofen kannst du Gegenstände durch Erhitzen verändern. Zum Beispiel kannst du im Ofen aus Eisenerz Eisenbarren herstellen.{*B*}{*B*} +Platzier den Ofen in der Welt und drück{*CONTROLLER_ACTION_USE*}, um ihn zu verwenden.{*B*}{*B*} +Du musst unten in den Ofen etwas Brennstoff legen und oben in den Ofen den Gegenstand, den du erhitzen möchtest. Der Ofen wird dann angeheizt und beginnt zu arbeiten.{*B*}{*B*} +Wenn deine Gegenstände erhitzt sind, kannst du sie aus dem Ausgangsbereich in dein Inventar verschieben.{*B*}{*B*} +Wenn du den Cursor über eine Zutat oder einen Brennstoff für den Ofen bewegst, informiert eine Quickinfo dich über die Möglichkeit zum Aktivieren des schnellen Bewegens des Gegenstands in den Ofen. + + +{*T3*}SO WIRD GESPIELT: DISPENSER{*ETW*}{*B*}{*B*} +Ein Dispenser wird verwendet, um Gegenstände zu verschießen. Du musst einen Schalter wie zum Beispiel einen Hebel neben den Dispenser platzieren, um diesen auszulösen.{*B*}{*B*} +Um den Dispenser mit Gegenständen zu befüllen, drück{*CONTROLLER_ACTION_USE*}, und beweg dann die zu verschießenden Gegenstände aus deinem Inventar in den Dispenser.{*B*}{*B*} +Wenn du jetzt den Schalter betätigst, wird der Dispenser einen Gegenstand verschießen. + + +{*T3*}SO WIRD GESPIELT: BRAUEN{*ETW*}{*B*}{*B*} +Zum Brauen von Tränken brauchst du einen Braustand, den du an der Werkbank herstellen kannst. Jeder Trank beginnt mit einer Flasche Wasser, die man erhält, indem man eine Glasflasche mit Wasser aus einem Kessel oder einer Wasserquelle füllt. {*B*} +Ein Braustand hat drei Plätze für Flaschen, du kannst also drei Tränke auf einmal herstellen. Eine Zutat reicht für alle drei Flaschen aus, du solltest also immer drei Tränke auf einmal brauchen, um deine Rohstoffe optimal auszunutzen. {*B*} +Wenn du eine Trankzutat in das obere Feld des Braustandes legst, wird nach kurzer Zeit ein Grundtrank gebraut. Dieser hat noch keinen Effekt, aber du kannst aus diesem Grundtrank und einer weiteren Zutat einen Trank mit einem Effekt brauen. {*B*} +Wenn du diesen Trank hast, kannst du ihm noch eine dritte Zutat hinzufügen, damit der Effekt länger anhält (durch Redstone-Staub), stärker wirkt (durch Glowstone-Staub) oder zu einem schädlichen Trank wird (durch ein Fermentiertes Spinnenauge). {*B*} +Du kannst jedem Trank auch Schießpulver hinzufügen, wodurch er zu einem Wurftrank wird. Wenn du ihn wirfst, wird der Effekt des Tranks auf das Gebiet angewendet, in dem der Trank landet. {*B*} + +Die Grundzutaten für Tränke sind:{*B*}{*B*} +* {*T2*}Netherwarze{*ETW*}{*B*} +* {*T2*}Spinnenauge{*ETW*}{*B*} +* {*T2*}Zucker{*ETW*}{*B*} +* {*T2*}Ghastträne{*ETW*}{*B*} +* {*T2*}Lohenstaub{*ETW*}{*B*} +* {*T2*}Magmacreme{*ETW*}{*B*} +* {*T2*}Funkelnde Melone{*ETW*}{*B*} +* {*T2*}Redstone-Staub{*ETW*}{*B*} +* {*T2*}Glowstone-Staub{*ETW*}{*B*} +* {*T2*}Fermentiertes Spinnenauge{*ETW*}{*B*}{*B*} + +Du wirst selbst mit Kombinationen von Zutaten experimentieren müssen, um alle verschiedenen Tränke zu finden, die du brauen kannst. + + +{*T3*}SO WIRD GESPIELT: VERZAUBERN{*ETW*}{*B*}{*B*} +Mithilfe der Erfahrungspunkte, die du erhältst, wenn ein NPC stirbt oder wenn du bestimmte Blöcke abbaust oder im Ofen einschmilzt, kannst du einige Werkzeuge, Waffen, Rüstungen und Bücher verzaubern.{*B*} +Wenn ein Schwert, ein Bogen, eine Axt, eine Spitzhacke, eine Schaufel, eine Rüstung oder ein Buch in das Feld unter dem Buch in den Zaubertisch gelegt werden, zeigen die drei Schaltflächen rechts des Feldes ein paar Zauber und ihre Kosten in Erfahrungsleveln an.{*B*} +Wenn du für einen der Zauber nicht genug Erfahrungslevel hast, werden seine Kosten in Rot angezeigt, sonst in Grün.{*B*}{*B*} +Die tatsächlich angewendete Verzauberung wird zufällig aus den angezeigten Verzauberungen ausgewählt.{*B*}{*B*} +Wenn der Zaubertisch von Bücherregalen umgeben ist (bis hin zu maximal 15 Bücherregalen), wobei zwischen Zaubertisch und Bücherregal ein Block Abstand sein muss, werden die Verzauberungen verstärkt und man kann sehen, wie arkane Schriftzeichen aus dem Buch auf dem Zaubertisch herausfliegen.{*B*}{*B*} +Alle Zutaten für einen Zaubertisch kann man in den Dörfern einer Welt finden oder indem man die Welt abbaut und bewirtschaftet.{*B*}{*B*} +Zauberbücher werden beim Amboss benutzt, um Verzauberungen auf Gegenstände anzuwenden. Das gibt dir mehr Kontrolle darüber, welche Verzauberungen du auf deinen Gegenständen möchtest.{*B*} + + +{*T3*}SO WIRD GESPIELT: TIERHALTUNG{*ETW*}{*B*}{*B*} +Wenn du deine Tiere an einer Stelle halten willst, solltest du einen eingezäunten Bereich von mindestens 20x20 Blöcke anlegen und deine Tiere dort unterbringen. Dann sind sie das nächste Mal auch noch da, wenn du sie besuchen willst. + + +{*T3*}SO WIRD GESPIELT: TIERZUCHT{*ETW*}{*B*}{*B*} +Die Tiere in Minecraft können sich vermehren und werden Babyversionen von sich selbst in die Welt setzen!{*B*} +Damit Tiere sich paaren, musst du sie mit dem richtigen Futter füttern, um sie in den "Liebesmodus" zu versetzen.{*B*} +Füttere eine Kuh, eine Pilzkuh oder ein Schaf mit Weizen, ein Schwein mit Karotten, ein Huhn mit Weizensamen oder Netherwarzen, einen Wolf mit beliebigem Fleisch und schon ziehen sie los und suchen in der Nähe nach einem anderen Tier derselben Gattung, das auch im Liebesmodus ist.{*B*} +Wenn sich zwei Tiere derselben Gattung begegnen und beide im Liebesmodus sind, küssen sie sich für ein paar Sekunden und dann erscheint ein Babytier. Das Babytier folgt seinen Eltern für eine Weile, bevor es zu einem ausgewachsenen Tier heranwächst.{*B*} +Nachdem ein Tier im Liebesmodus war, dauert es fünf Minuten, bis das Tier den Liebesmodus erneut annehmen kann.{*B*} +Du kannst in einer Welt maximal eine bestimmte Anzahl an Tieren haben; es kann also sein, dass Tiere sich nicht vermehren, wenn du schon viele hast. + +{*T3*}SO WIRD GESPIELT: NETHERPORTAL{*ETW*}{*B*}{*B*} +Mithilfe eines Netherportals kannst du zwischen der oberirdischen Welt und dem Nether hin und her reisen. Wenn du im Nether eine Entfernung von einem Block reist, entspricht das einer Reise von drei Blöcken in der oberirdischen Welt. Wenn du also ein Portal in die Netherwelt baust und sie darüber verlässt, wirst du dich dreimal so weit von deinem Startpunkt entfernt befinden.{*B*}{*B*} +Du brauchst mindestens 10 Blöcke Obsidian, um ein Portal zu bauen. Das Portal muss 5 Blöcke hoch, 4 Blöcke breit und 1 Block tief sein. Wenn der Rahmen des Portals gebaut ist, muss der Inhalt des Rahmens angezündet werden, um das Portal zu aktivieren. Dies kannst du mit dem Feuerzeug oder einer Feuerkugel tun.{*B*}{*B*} +Beispiele für Portale sind im Bild rechts dargestellt. + + +{*T3*}SO WIRD GESPIELT: MULTIPLAYER{*ETW*}{*B*}{*B*} +Minecraft auf der Xbox 360 Konsole ist als Standard ein Multiplayer-Spiel. Wenn du in einem HD-Modus spielst, weitere Controller anschließt und START drückst, können lokale Spieler jederzeit deinem Spiel beitreten.{*B*}{*B*} +Wenn du ein Onlinespiel startest oder einem beitrittst, können die Spieler in deiner Freundesliste es sehen (es sei denn, du hostest das Spiel und hast "Nur mit Einladung" ausgewählt), und wenn sie dem Spiel beitreten, können Spieler in ihrer Freundesliste es auch sehen (falls du die Option "Freunde von Freunden zulassen" ausgewählt hast).{*B*} +Wenn du in einem Spiel bist, kannst du durch Drücken der BACK-Taste eine Liste aller anderen Spieler im Spiel aufrufen, dir ihre Spielerkarten ansehen, Spieler aus dem Spiel ausschließen und andere ins Spiel einladen. + + +{*T3*}SO WIRD GESPIELT: SCREENSHOTS GETEILT{*ETW*}{*B*} {*B*} +Du kannst einen Screenshot von deinem Spiel erstellen, indem du das Pause-Menü aufrufst und{*CONTROLLER_VK_Y*} drückst, um den Screenshot auf Facebook zu veröffentlichen. Es wird eine verkleinerte Version deines Screenshots angezeigt, und du kannst den Begleittext deines Facebook-Beitrags bearbeiten.{*B*}{*B*} +Es gibt einen eigenen Kameramodus für das Erstellen solcher Screenshots, damit du auf dem Bild deine Spielfigur von vorn sehen kannst. Drück{*CONTROLLER_ACTION_CAMERA*}, bis du deine Spielfigur von vorn siehst, bevor du zum Teilen{*CONTROLLER_VK_Y*} drückst.{*B*}{*B*} +Gamertags werden auf Screenshots nicht angezeigt. + + +{*T3*}SO WIRD GESPIELT: LEVEL SPERREN{*ETW*}{*B*}{*B*} +Wenn du in einem Level, den du spielst, anstößige Inhalte findest, kannst du den Level deiner Liste der gesperrten Level hinzufügen. +Ruf dafür das Pause-Menü auf, und drück dann{*CONTROLLER_VK_RB*}, um die QuickInfo zum Sperren eines Levels aufzurufen. +Wenn du in Zukunft versuchst, diesem Level beizutreten, wirst du darüber benachrichtigt, dass dieser Level sich auf deiner Liste der gesperrten Level befindet, und du erhältst die Wahl, den Level von der Liste zu entfernen und ihn zu betreten oder abzubrechen. + +{*T3*}SO WIRD GESPIELT: KREATIVMODUS{*ETW*}{*B*}{*B*} +Die Oberfläche des Kreativmodus erlaubt es dir, alle Gegenstände im Spiel in dein Inventar zu verschieben, ohne dass du sie vorher abbauen oder herstellen musst. +Die Gegenstände werden nicht aus deinem Inventar entfernt, wenn du sie in der Welt platzierst oder sie verbrauchst. Dadurch kannst du dich ganz aufs Bauen konzentrieren anstatt auf das Sammeln von Ressourcen. {*B*} +Wenn du eine Welt im Kreativmodus erstellst, lädst oder speicherst, sind Erfolge und Bestenlisten- +Aktualisierungen in dieser Welt deaktiviert, selbst wenn du die Welt später im Überlebensmodus lädst.{*B*} +Um im Kreativmodus zu fliegen, drücke zweimal schnell {*CONTROLLER_ACTION_JUMP*}. Um das Fliegen zu beenden, wiederhole die Aktion. Um schneller zu fliegen, drück beim Fliegen{*CONTROLLER_ACTION_MOVE*} zweimal schnell nach vorn. +Im Flugmodus halte{*CONTROLLER_ACTION_JUMP*} nach unten gedrückt, um dich nach oben zu bewegen, und{*CONTROLLER_ACTION_SNEAK*}, um dich nach unten zu bewegen. Oder verwende{*CONTROLLER_ACTION_DPAD_UP*}, um dich nach oben zu bewegen, {*CONTROLLER_ACTION_DPAD_DOWN*}, um dich nach unten zu bewegen, +{*CONTROLLER_ACTION_DPAD_LEFT*}, um dich nach links zu bewegen, und {*CONTROLLER_ACTION_DPAD_RIGHT*}, um dich nach rechts zu bewegen. + +{*T3*}SO WIRD GESPIELT: HOST- UND SPIELEROPTIONEN{*ETW*}{*B*}{*B*} + +{*T1*}Spieloptionen{*ETW*}{*B*} +Beim Laden oder Erstellen einer Welt kannst du mit der Schaltfläche "Weitere Optionen" ein Menü aufrufen, mit dem du mehr Kontrolle über dein Spiel hast.{*B*}{*B*} + + {*T2*}Spieler gegen Spieler{*ETW*}{*B*} + Aktiviert, dass Spieler anderen Spielern Schaden zufügen können. Diese Option betrifft nur den Überlebensmodus.{*B*}{*B*} + + {*T2*}Spielern vertrauen{*ETW*}{*B*} + Ist diese Option deaktiviert, sind Spieler, die dem Spiel beitreten, in ihren Handlungen eingeschränkt. Folgende Handlungen sind nicht möglich: Vorkommen abbauen, Gegenstände verwenden, Blöcke platzieren, Türen und Schalter verwenden, Container verwenden, Spieler angreifen, Tiere angreifen. Über das Spielmenü kannst du die Privilegien für einen speziellen Spieler ändern.{*B*}{*B*} + + {*T2*}Feuer breitet sich aus{*ETW*}{*B*} + Aktiviert, dass Feuer auf brennbare Blöcke in der Nähe übergreifen kann. Diese Option kann ebenfalls über das Spielmenü geändert werden.{*B*}{*B*} + + {*T2*}TNT explodiert{*ETW*}{*B*} + Aktiviert, dass TNT nach dem Zünden explodiert. Diese Option kann ebenfalls über das Spielmenü geändert werden.{*B*}{*B*} + + {*T2*}Hostprivilegien{*ETW*}{*B*} + Aktiviert, dass der Host das Fliegen nutzen, Erschöpfung deaktivieren und sich selbst im Spielmenü unsichtbar machen kann. {*DISABLES_ACHIEVEMENTS*}{*B*}{*B*} + + {*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*} + + {*T2*}Strukturen erzeugen{*ETW*}{*B*} + Aktiviert, dass Strukturen wie Dörfer und Festungen in der Welt erstellt werden.{*B*}{*B*} + + {*T2*}Superflache Welt{*ETW*}{*B*} + Aktiviert, dass eine völlig flache Welt in der Oberwelt und im Nether erschaffen wird.{*B*}{*B*} + + {*T2*}Bonustruhe{*ETW*}{*B*} + Aktiviert, dass eine Truhe mit nützlichen Gegenständen in der Nähe des Startpunkts des Spielers erstellt wird.{*B*}{*B*} + + {*T2*}Nether zurücksetzen{*ETW*}{*B*} + Bei Aktivierung wird der Nether neu erstellt. Das ist nützlich, wenn du einen älteren Spielstand ohne Netherfestungen hast.{*B*}{*B*} + + {*T1*}Optionen im Spiel{*ETW*}{*B*} + Während des Spielens hast du Zugriff auf eine Reihe von Optionen, indem du mit {*BACK_BUTTON*} das Spielmenü aufrufst.{*B*}{*B*} + + {*T2*}Hostoptionen{*ETW*}{*B*} + Der Host-Spieler und alle anderen als Moderatoren eingesetzten Spieler haben Zugriff auf das Menü "Hostoptionen". In diesem Menü können "Feuer breitet sich aus" und "TNT explodiert" aktiviert und deaktiviert werden.{*B*}{*B*} + +{*T1*}Spieleroptionen{*ETW*}{*B*} +Um die Privilegien für einen Spieler zu bearbeiten, rufst du mit {*CONTROLLER_VK_A*} das Privilegien-Menü eines Spielers auf, wo du die folgenden Optionen benutzen kannst.{*B*}{*B*} + + {*T2*}Kann bauen und abbauen{*ETW*}{*B*} + Diese Option ist nur verfügbar, wenn "Spielern vertrauen" ausgeschaltet ist. Ist diese Option aktiviert, kann der Spieler wie gewöhnlich mit der Welt interagieren. Ist diese Option deaktiviert, kann der Spieler keine Blöcke platzieren und vernichten und auch nicht mit vielen Gegenständen und Blöcken interagieren.{*B*}{*B*} + + {*T2*}Kann Türen und Schalter verwenden{*ETW*}{*B*} + Diese Option ist nur verfügbar, wenn "Spielern vertrauen" ausgeschaltet ist. Ist diese Option deaktiviert, kann der Spieler keine Türen und Schalter verwenden.{*B*}{*B*} + + {*T2*}Kann Container öffnen{*ETW*}{*B*} + Diese Option ist nur verfügbar, wenn "Spielern vertrauen" ausgeschaltet ist. Ist diese Option deaktiviert, kann der Spieler keine Container wie etwa Truhen öffnen.{*B*}{*B*} + + {*T2*}Kann Spieler angreifen{*ETW*}{*B*} + Diese Option ist nur verfügbar, wenn "Spielern vertrauen" ausgeschaltet ist. Ist diese Option deaktiviert, kann der Spieler anderen Spielern keinen Schaden zufügen.{*B*}{*B*} + + {*T2*}Kann Tiere angreifen{*ETW*}{*B*} + Diese Option ist nur verfügbar, wenn "Spielern vertrauen" ausgeschaltet ist. Ist diese Option deaktiviert, kann der Spieler Tieren keinen Schaden zufügen.{*B*}{*B*} + + {*T2*}Moderator{*ETW*}{*B*} + Ist diese Option aktiviert, kann der Spieler Privilegien für andere Spieler (den Host ausgenommen) ändern, wenn "Spielern vertrauen" ausgeschaltet ist. Der Spieler kann andere Spieler ausschließen und "Feuer breitet sich aus" sowie "TNT explodiert" an- und ausschalten.{*B*}{*B*} + + {*T2*}Spieler ausschließen{*ETW*}{*B*} + {*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*} + 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 + +Grundlagen + +Display + +Inventar + +Truhen + +Crafting + +Ofen + +Dispenser + +Tierhaltung + +Tierzucht + +Brauen + +Verzaubern + +Nether-Portal + +Multiplayer + +Screenshots teilen + +Level sperren + +Kreativmodus + +Host- und Spieleroptionen + +Handel + +Amboss + +Das Ende + +{*T3*}SO WIRD GESPIELT: DAS ENDE{*ETW*}{*B*}{*B*} +Das Ende ist eine andere Dimension im Spiel, die durch ein aktives Endportal erreicht wird. Das Endportal findest du in einer Festung tief unter der Oberwelt.{*B*} +Um das Endportal zu aktivieren, musst du eine Enderperle in einen Endportalrahmen einsetzen, in dem keine ist.{*B*} +Wenn das Portal aktiv ist, kannst du hindurch in Das Ende springen.{*B*}{*B*} +Im Ende begegnest du dem Enderdrachen, einem bösen, mächtigen Feind, und vielen Endermen; bereite dich also gut auf den Kampf vor, bevor du dich aufmachst!{*B*}{*B*} +Der Enderdrache heilt sich mithilfe von Enderkristallen, die auf acht Obsidianstacheln ruhen; +du musst diese zuallererst einzeln zerstören.{*B*} +Die ersten paar davon erreichst du mit Pfeilen, doch die späteren werden durch einen Eisengitterkäfig geschützt, und du musst dich zu ihnen hochbauen.{*B*}{*B*} +Dabei greift dich der Enderdrache aus der Luft mit Endersäurekugeln an!{*B*} +Nähere dich dem Eierpodest inmitten der Stacheln; der Enderdrache fliegt herab und greift dich an, und du kannst ihm nun einigen Schaden zufügen!{*B*} +Nimm dich vor dem Säureatem in Acht und ziele auf die Augen des Enderdrachens, um wirkungsvolle Treffer zu landen. Bring, wenn du kannst, einen Freund mit in Das Ende, der dir im Kampf beisteht!{*B*}{*B*} +Sobald du Das Ende besuchst, sehen deine Freunde die Lage des Endportals in den Festungen auf ihren Karten; +sie können dir also leicht zu Hilfe kommen. + + +Sprinten + +Neuigkeiten + +{*T3*}Veränderungen und Neuerungen{*ETW*}{*B*}{*B*} +- Neue Gegenstände hinzugefügt: 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*} – 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. + +Wird benötigt, um Stein- und Erzblöcke abzubauen. + +Wird verwendet, um Holzblöcke schneller als per Hand abzubauen. + +Wird verwendet, um Erd- und Grasblöcke umzugraben und sie damit fürs Bepflanzen vorzubereiten. + +Holztüren werden geöffnet, indem du sie verwendest, dagegen schlägst oder mittels Redstone. + +Eisentüren können nur mit Redstone, Knöpfen oder Schaltern geöffnet werden. + +NOT USED + +NOT USED + +NOT USED + +NOT USED + +Verleiht dem Träger 1 Rüstungspunkt. + +Verleiht dem Spieler beim Tragen 3 Rüstungspunkte. + +Verleiht dem Träger 2 Rüstungspunkte. + +Verleihen dem Träger 1 Rüstungspunkt. + +Verleiht dem Träger 2 Rüstungspunkte. + +Verleiht dem Träger 5 Rüstungspunkte. + +Verleiht dem Spieler beim Tragen 4 Rüstungspunkte. + +Verleihen dem Träger 1 Rüstungspunkt. + +Verleiht dem Träger 2 Rüstungspunkte. + +Verleiht dem Träger 6 Rüstungspunkte. + +Verleiht dem Träger 5 Rüstungspunkte. + +Verleihen dem Träger 2 Rüstungspunkte. + +Verleiht dem Träger 2 Rüstungspunkte. + +Verleiht dem Träger 5 Rüstungspunkte. + +Verleiht dem Spieler beim Tragen 3 Rüstungspunkte. + +Verleiht dem Träger 1 Rüstungspunkt. + +Verleiht dem Spieler beim Tragen 3 Rüstungspunkte. + +Verleiht dem Träger 8 Rüstungspunkte. + +Verleiht dem Träger 6 Rüstungspunkte. + +Verleiht dem Spieler beim Tragen 3 Rüstungspunkte. + +Ein glänzender Barren, aus dem du Werkzeuge herstellen kannst, die aus diesem Material bestehen. Entsteht, wenn du im Ofen Erz schmilzt. + +Ermöglicht es, aus Barren, Diamanten oder Farben platzierbare Blöcke zu erzeugen. Kann als teurer Baublock oder kompakter Erzspeicher +verwendet werden. + +Wird verwendet, um einen elektrischen Impuls zu erzeugen, wenn ein Spieler, ein Tier oder ein Monster darauftritt. Hölzerne Druckplatten können auch aktiviert werden, indem etwas darauf abgelegt wird. + +Wird zum Bau platzsparender Treppen verwendet. + +Wird zum Bau langer Treppen verwendet. Zwei Stufen, die aufeinandergelegt werden, werden zu einem normal großen Doppelstufen-Block verschmolzen. + +Wird zum Bau langer Treppen verwendet. Zwei aufeinander platzierte Stufen erzeugen einen normal großen Doppelstufen-Block. + +Wird verwendet, um Licht zu erzeugen. Fackeln schmelzen außerdem Schnee und Eis. + +Wird als Baumaterial und zur Herstellung vieler Dinge verwendet. Kann aus jeder Art von Holz hergestellt werden. + +Wird als Baumaterial verwendet. Zerfällt nicht wie normaler Sand durch die Schwerkraft. + +Wird als Baumaterial verwendet. + +Wird zur Herstellung von +Fackeln, Pfeilen, Schildern, +Leitern, Zäunen und als Griff +für Werkzeuge und Waffen +verwendet. + +Kann die Zeit von einem beliebigen Zeitpunkt in der Nacht bis zum Morgen vorstellen, wenn alle Spieler in der Welt im Bett liegen. Kann auch deinen Wiedereintrittspunkt ändern. +Das Bett hat immer dieselbe Farbe, egal aus Wolle welcher Farbe es hergestellt wurde. + +Erlaubt dir, eine größere Auswahl von Gegenständen zu erschaffen als beim normalen Crafting. + +Erlaubt dir, Erz zu schmelzen, Holzkohle und Glas herzustellen sowie Fisch und Schweinefleisch zu kochen. + +Lässt dich in ihrem Inneren Blöcke und Gegenstände lagern. Platzier zwei Truhen nebeneinander, um eine größere Truhe mit der doppelten Kapazität zu erschaffen. + +Wird als Barriere verwendet, über die nicht hinübergesprungen werden kann. Hat für Spieler, Tiere und Monster eine Höhe von 1,5 Blöcken, für andere Blöcke aber die normale Höhe von 1 Block. + +Verwendet, um sich in vertikaler Richtung zu bewegen. + +Wird durch Verwenden, Dagegenschlagen oder mittels Redstone aktiviert. Funktioniert wie eine normale Tür, ist 1 x 1 Block groß und liegt flach auf dem Boden. + +Zeigt den Text an, den du oder andere Spieler eingegeben +haben. + +Erzeugt helleres Licht als Fackeln. Schmilzt Schnee und Eis und kann unter Wasser verwendet werden. + +Erzeugt eine Explosion. Wird nach Platzieren mit dem Feuerzeug oder elektrisch gezündet. + +Wird verwendet, um Pilzsuppe aufzubewahren. Wenn die Suppe aufgegessen ist, behältst du die Schüssel. + +Wird zum Aufbewahren und zum Transport von Wasser, Lava und Milch verwendet. + +Wird zum Aufbewahren und zum Transport von Wasser verwendet. + +Wird zum Aufbewahren und zum Transport von Lava verwendet. + +Wird zum Aufbewahren und zum Transport von Milch verwendet. + +Kann Feuer erzeugen, TNT zünden und ein Portal nach dem Bau öffnen. + +Wird verwendet, um Fische zu fangen. + +Zeigt die Position der Sonne und des Mondes an. + +Zeigt auf deinen Startpunkt. + +Erzeugt ein Abbild einer Gegend, bei deren Erforschung du sie in der Hand hattest. Nützlich, um den Weg zu finden. + +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. + +Regeneriert 1{*ICON_SHANK_01*}. + +Regeneriert 1{*ICON_SHANK_01*}. + +Regeneriert 3{*ICON_SHANK_01*}. + +Regeneriert 1{*ICON_SHANK_01*}, kann dich aber krankmachen. Kann im Ofen gebraten werden. + +Regeneriert 3{*ICON_SHANK_01*}. Entsteht, wenn man rohes Hühnchen im Ofen brät. + +Regeneriert 1,5{*ICON_SHANK_01*}. Kann im Ofen gebraten werden. + +Regeneriert 4{*ICON_SHANK_01*}. Entsteht, wenn man rohes Rindfleisch im Ofen brät. + +Regeneriert 1,5{*ICON_SHANK_01*}. Kann im Ofen gebraten werden. + +Regeneriert 4{*ICON_SHANK_01*}. Entsteht, wenn man rohes Schweinefleisch im Ofen brät. + +Regeneriert 1{*ICON_SHANK_01*}. Kann im Ofen gebraten werden. Füttere einen Ozelot damit, um ihn zu zähmen. + +Regeneriert 2,5{*ICON_SHANK_01*}. Entsteht, wenn man rohen Fisch im Ofen brät. + +Regeneriert 2{*ICON_SHANK_01*} und kann zu einem goldenen Apfel verarbeitet werden. + +Regeneriert 2{*ICON_SHANK_01*} und regeneriert 4 Sekunden lang Gesundheit. Wird aus einem Apfel und Goldnuggets hergestellt. + +Regeneriert 2{*ICON_SHANK_01*}, kann dich aber krankmachen. + +Wird für das Kuchenrezept und als Zutat für Tränke benötigt. + +Erzeugt einen elektrischen Impuls, wenn er gedrückt wird. Bleibt ein- oder ausgeschaltet, bis er erneut gedrückt wird. + +Konstante Stromquelle. Kann als Empfänger/Sender verwendet werden, wenn sie mit der Seite eines Blocks verbunden ist. +Kann auch genutzt werden, um ein wenig Licht zu erzeugen. + +Wird in Redstone-Schaltkreisen als Repeater, Verzögerer und/oder als Diode eingesetzt. + +Erzeugt ein elektrisches Signal, wenn er gedrückt wird. Bleibt für ungefähr eine Sekunde aktiv, bevor er sich wieder deaktiviert. + +Kann Gegenstände in zufälliger Reihenfolge verschießen, wenn er einen Impuls von einem Redstone-Stromkreis erhält. + +Spielt beim Auslösen eine Note ab. Schlag auf den Block, um die Tonhöhe zu ändern. Wenn du diesen Block auf verschiedenen Untergründen platzierst, ändert sich das verwendete Instrument. + +Wird verwendet, um Loren eine Richtung vorzugeben. + +Beschleunigt darüberfahrende Loren, wenn sie unter Strom steht. Wenn kein Strom anliegt, bewirkt sie, dass Loren auf ihr anhalten. + +Funktioniert wie eine Druckplatte – sendet ein Redstone-Signal, wenn sie aktiviert wird, kann aber nur durch Loren aktiviert werden. + +Kann dich, ein Tier oder ein Monster auf Schienen transportieren. + +Wird verwendet, um Waren auf Schienen zu transportieren. + +Bewegt sich auf Schienen und kann andere Loren schieben, wenn du Kohle hineinlegst. + +Wird verwendet, um schneller als schwimmend übers Wasser zu reisen. + +Wird von Schafen eingesammelt und kann mit Farben gefärbt werden. + +Wird als Baumaterial verwendet und kann mit Farben gefärbt werden. Dieses Rezept ist nicht empfehlenswert, da man Wolle leicht von Schafen erhalten +kann. + +Wird als Farbe verwendet, um Wolle schwarz zu färben. + +Wird als Farbe verwendet, um Wolle grün zu färben. + +Werden als Farbe verwendet, um Wolle braun zu färben, als Zutat für Kekse und um Kakaoschoten wachsen zu lassen. + +Wird als Farbe verwendet, um Wolle silbern zu färben. + +Wird als Farbe verwendet, um Wolle gelb zu färben. + +Wird als Farbe verwendet, um Wolle rot zu färben. + +Wird verwendet, um Getreide, Bäume, hohes Gras, riesige Pilze und Blumen fast augenblicklich wachsen zu lassen. Kann außerdem als Zutat in Farbrezepten verwendet werden. + +Wird als Farbe verwendet, um Wolle rosa zu färben. + +Wird als Farbe verwendet, um Wolle orange zu färben. + +Wird als Farbe verwendet, um Wolle hellgrün zu färben. + +Wird als Farbe verwendet, um Wolle grau zu färben. + +Wird als Farbe verwendet, um Wolle hellgrau zu färben. +(Hinweis: Hellgraue Farbe kann auch aus grauer Farbe und Knochenmehl erzeugt werden. So erhältst du aus jedem +Tintensack 4 hellgraue Farbe +statt nur 3.) + +Wird als Farbe verwendet, um Wolle hellblau zu färben. + +Wird als Farbe verwendet, um Wolle cyanfarben zu färben. + +Wird als Farbe verwendet, um Wolle lila zu färben. + +Wird als Farbe verwendet, um Wolle magentafarben zu färben. + +Wird als Farbe verwendet, um Wolle blau zu färben. + +Spielt Schallplatten ab. + +Hieraus kannst du sehr beständige Werkzeuge, Waffen und Rüstungen herstellen. + +Erzeugt helleres Licht als Fackeln. Schmilzt Schnee und Eis und kann unter Wasser verwendet werden. + +Wird zur Herstellung von Büchern und Karten verwendet. + +Wird zur Herstellung eines Bücherregals verwendet oder verzaubert, um Zauberbücher herzustellen. + +Ermöglicht die Herstellung mächtigerer Verzauberungen bei Anordnung um den Zaubertisch. + +Wird als Dekoration eingesetzt. + +Muss mit mindestens einer Eisenspitzhacke abgebaut und dann in einem Ofen geschmolzen werden, um Goldbarren zu erzeugen. + +Muss mit mindestens einer Steinspitzhacke abgebaut und dann in einem Ofen geschmolzen werden, um Eisenbarren zu erzeugen. + +Kann mit einer Spitzhacke abgebaut werden, um Kohle zu erhalten. + +Muss mit mindestens einer Steinspitzhacke abgebaut werden, um Lapislazuli zu erhalten. + +Muss mit mindestens einer Eisenspitzhacke abgebaut werden, um Diamanten zu erhalten. + +Muss mit mindestens einer Eisenspitzhacke abgebaut werden, um Redstone-Staub zu erhalten. + +Kann mit einer Spitzhacke abgebaut werden, um Pflasterstein zu erhalten. + +Wird mithilfe einer Schaufel abgebaut. Kann für Bauarbeiten verwendet werden. + +Kann gepflanzt werden und wächst mit der Zeit zu einem Baum heran. + +Ist unzerstörbar. + +Setzt alles in Brand, was es berührt. Kann in einem Eimer eingesammelt werden. + +Wird mithilfe einer Schaufel abgebaut. Kann im Ofen zu Glas geschmolzen werden. Wird unter dem Einfluss der Schwerkraft nach unten fallen, wenn sich kein anderer Block darunter befindet. + +Wird mithilfe einer Schaufel abgebaut, wodurch man gelegentlich Feuerstein erhält. Fällt unter dem Einfluss der Schwerkraft nach unten, wenn es darunter keinen anderen Block gibt. + +Kann mit einer Axt abgebaut und zur Herstellung von Holz oder als Brennstoff verwendet werden. + +Wird im Ofen durch Schmelzen von Sand hergestellt. Kann zum Bauen verwendet werden, bricht aber weg, wenn du versuchst, ihn abzubauen. + +Kann aus Stein mit einer Spitzhacke abgebaut werden. Kann zum Bau von Öfen oder Steinwerkzeugen verwendet werden. + +Wird in einem Ofen aus Lehm gebacken. + +Kann in einem Ofen zu Ziegeln gebacken werden. + +Wenn er zerstört wird, entstehen Lehmbälle, die in einem Ofen zu Lehmziegeln gebacken werden können. + +Eine platzsparende Art, Schneebälle zu lagern. + +Kann mit einer Schaufel abgebaut werden, um Schneebälle zu erzeugen. + +Erzeugt beim Abbauen gelegentlich Weizensamen. + +Kann zu Farbe verarbeitet werden. + +Kann mithilfe einer Schüssel zu Suppe verarbeitet werden. + +Kann nur mit einer Diamantspitzhacke abgebaut werden. Entsteht, wenn fließendes Wasser und ruhende Lava aufeinandertreffen. Wird zum Bauen von Portalen verwendet. + +Erschafft Monster und setzt sie in die Welt. + +Wird auf den Boden gelegt, um eine elektrische Ladung zu erzeugen. Verlängert die Dauer eines Trankeffekts bei Verwendung als Zutat. + +Im reifen Zustand kann Getreide geerntet werden, wodurch man Weizen erhält. + +Boden, der vorbereitet wurde, um bepflanzt zu werden. + +Kann im Ofen gekocht werden, um grüne Farbe herzustellen. + +Kann zu Zucker verarbeitet werden. + +Kann als Helm getragen oder mit einer Fackel zu einer Kürbislaterne verarbeitet werden. Ist außerdem die Hauptzutat von Kürbiskuchen. + +Brennt unendlich lange, wenn er angezündet wird. + +Verlangsamt die Bewegung von allem, was darüber läuft. + +Mit einem Portal kannst du dich zwischen der oberirdischen Welt und dem Nether hin und her bewegen. + +Kann im Ofen als Brennstoff verwendet oder zu einer Fackel verarbeitet werden. + +Erhält man durch Töten einer Spinne. Kann zu einem Bogen oder einer Angel verarbeitet oder auf den Boden gelegt werden, um Stolperdraht zu erschaffen. + +Erhält man durch Töten eines Huhns. Kann zu einem Pfeil verarbeitet werden. + +Erhält man durch Töten eines Creepers. Kann zu TNT verarbeitet oder als Zutat für Tränke verwendet werden. + +Kann auf Ackerboden gepflanzt werden, um Getreide wachsen zu lassen. Achte darauf, dass es genügend Licht gibt, damit die Pflanzen wachsen können! + +Erhält man durch Ernten von Getreide. Kann zu Nahrung verarbeitet werden. + +Erhält man beim Abbauen von Kies. Kann zu einem Feuerzeug verarbeitet werden. + +Kann mit einem Schwein verwendet werden, wodurch es möglich ist, auf ihm zu reiten. Gesteuert wird dabei mit einer Karottenangel. + +Entsteht beim Abbauen von Schnee. Kann geworfen werden. + +Erhält man durch Töten einer Kuh. Kann zu Rüstungen oder Büchern verarbeitet werden. + +Erhält man durch Töten eines Slimes. Wird als Zutat für Tränke oder haftende Kolben verwendet. + +Wird zufällig von Hühnern fallen gelassen. Kann zu Nahrung verarbeitet werden. + +Erhält man durch Abbauen von Glowstone. Kann verarbeitet werden, um wieder Glowstone-Blöcke zu bilden oder zum Brauen eines Tranks verwendet werden, um dessen Effekt zu verstärken. + +Erhält man durch Töten eines Skeletts. Kann zu Knochenmehl verarbeitet werden. Kann an einen Wolf verfüttert werden, um ihn zu zähmen. + +Entsteht, wenn ein Creeper von einem Skelett getötet wird. Kann in einer Jukebox abgespielt werden. + +Löscht Feuer und lässt Getreide wachsen. Kann in einem Eimer eingesammelt werden. + +Wenn sie abgebaut werden, erscheint manchmal ein Setzling, den man wieder einpflanzen kann, woraus ein neuer Baum wächst. + +Kann in Dungeons gefunden und für Bauarbeiten und als Dekoration verwendet werden. + +Wird verwendet, um Wolle von Schafen zu erhalten und Blätterblöcke zu ernten. + +Wenn Strom an einen Kolben angelegt wird (mit einem Schalter, einem Hebel, einer Druckplatte, einer Redstone-Fackel oder Redstone mit einem der vorgenannten Dinge), wird der Kolben länger, falls möglich, und verschiebt Blöcke. + +Wenn Strom an einen Kolben angelegt wird (mit einem Schalter, einem Hebel, einer Druckplatte, einer Redstone-Fackel oder Redstone mit einem der vorgenannten Dinge), wird der Kolben länger, falls möglich, und verschiebt Blöcke. Wenn der Kolben zurückgezogen wird, zieht er den Block mit zurück, der den Kolben berührt. + +Hergestellt aus Steinblöcken, findet man oft in Festungen. + +Wird als Absperrung verwendet, ähnlich wie Zäune. + +Wie eine Tür, findet aber hauptsächlich in Zäunen Verwendung. + +Kann aus Melonenscheiben hergestellt werden. + +Transparente Blöcke, können als Alternative zu Glasblöcken verwendet werden. + +Kann gepflanzt werden, um Kürbisse wachsen zu lassen. + +Kann gepflanzt werden, um Melonen wachsen zu lassen. + +Wird von einem sterbenden Enderman fallen gelassen. Wenn du die Enderperle wirfst, wirst du an die Stelle teleportiert, wo sie landet, und verlierst etwas Gesundheit. + +Ein Block Erde, auf dem Gras wächst. Wird mithilfe einer Schaufel abgebaut. Kann für Bauarbeiten verwendet werden. + +Kann für Bauarbeiten und als Dekoration verwendet werden. + +Verlangsamt beim Darüberlaufen die Bewegung. Kann mit einer Schere zerstört werden, um Faden zu erhalten. + +Lässt bei Zerstörung einen Silberfisch entstehen. Kann auch Silberfische entstehen lassen, wenn in der Nähe Silberfische angegriffen werden. + +Wächst nach Platzierung mit der Zeit. Kann mit einer Schere eingesammelt werden. Du kannst daran wie an einer Leiter klettern. + +Ist beim Darüberlaufen rutschig. Wird bei Zerstörung zu Wasser, wenn darunter ein anderer Block ist. Schmilzt in der Nähe einer Lichtquelle oder bei Platzierung im Nether. + +Kann als Dekoration verwendet werden. + +Kann zum Brauen verwendet werden und zum Finden von Festungen. Wird von Lohen hinterlassen, die sich meist in oder nahe von Netherfestungen aufhalten. + +Kann zum Brauen verwendet werden. Wird von sterbenden Ghasts fallen gelassen. + +Wird von sterbenden Zombie Pigmen fallen gelassen. Zombie Pigmen findest du im Nether. Wird als Zutat für Tränke verwendet. + +Kann zum Brauen verwendet werden. Wächst auf natürliche Weise in Netherfestungen. Kann auch auf Seelensand gepflanzt werden. + +Kann verschiedene Effekte haben, abhängig davon, worauf er angewendet wird. + +Kann mit Wasser gefüllt werden und wird als Startzutat zum Brauen von Tränken am Braustand verwendet. + +Giftige Nahrung und Brauzutat. Wird von Spinnen und Höhlenspinnen fallen gelassen, wenn sie von einem Spieler getötet werden. + +Kann zum Brauen verwendet werden, hauptsächlich, um Tränke mit einem negativen Effekt herzustellen. + +Kann zum Brauen verwendet werden oder um mit anderen Gegenständen Enderaugen oder Magmacreme herzustellen. + +Kann zum Brauen verwendet werden. + +Wird verwendet, um Tränke und Wurftränke herzustellen. + +Kann mithilfe von Regen oder eines Eimers mit Wasser gefüllt werden, und kann dann verwendet werden, um Glasflaschen mit Wasser zu füllen. + +Wenn man es wirft, zeigt es die Richtung zu einem Endportal an. Wenn zwölf davon in die Endportalblöcke gelegt werden, wird das Endportal aktiviert. + +Kann zum Brauen verwendet werden. + +Ähnlich wie Grasblöcke, eignet sich aber gut, um Pilze darauf wachsen zu lassen. + +Schwimmt auf dem Wasser, und man kann darüber laufen. + +Wird verwendet, um Netherfestungen zu bauen. Immun gegenüber den Feuerbällen von Ghasts. + +Wird in Netherfestungen verwendet. + +Findet man in Netherfestungen. Wenn man ihn zerbricht, erhält man Netherwarzen. + +Erlaubt es Spielern, Schwerter, Spitzhacken, Schaufeln, Äxte und Bögen sowie Rüstungen mithilfe der Erfahrungspunkte des Spielers zu verzaubern. + +Kann mit zwölf Enderaugen aktiviert werden, und erlaubt es dem Spieler, in die Enddimension zu reisen. + +Wird verwendet, um ein Endportal zu bilden. + +Ein Block, den man im Ende findet. Ist sehr widerstandsfähig gegenüber Explosionen und daher ein nützliches Baumaterial. + +Dieser Block entsteht, wenn der Spieler im Ende den Drachen besiegt. + +Wenn man sie wirft, erscheint eine Erfahrungskugel, die deine Erfahrungspunkte steigert, wenn du sie einsammelst. + +Nützlich, um Dinge in Brand zu stecken oder beim Abschuss durch einen Dispenser, um willkürlich Feuer zu erzeugen. + +Ähnelt einem Schaukasten und zeigt den Gegenstand oder Block, der darin platziert wurde. + +Wirft man damit, kann eine Kreatur des angegebenen Typs erscheinen. + +Wird zum Bau langer Treppen verwendet. Zwei Stufen, die aufeinandergelegt werden, werden zu einem normal großen Doppelstufen-Block verschmolzen. + +Wird zum Bau langer Treppen verwendet. Zwei Stufen, die aufeinandergelegt werden, werden zu einem normal großen Doppelstufen-Block verschmolzen. + +Entsteht, wenn du im Ofen Netherstein schmilzt. Kann zu Netherziegelblöcken verarbeitet werden. + +Sie leuchten, wenn sie unter Strom stehen. + +Kann angebaut werden, um Kakaobohnen zu erhalten. + +NPC-Köpfe können als Dekoration platziert werden oder als Maske anstatt eines Helms getragen werden. + +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 + +Number Crunching and Statistics + +Bully Coordinator + +Original Design and Code by + +Project Manager/Producer + +Rest of Mojang Office + +Lead Game Programmer Minecraft PC + +Ninja Coder + +CEO + +White Collar Worker + +Customer Support + +Office DJ + +Designer/Programmer Minecraft - Pocket Edition + +Developer + +Chief Architect + +Art Developer + +Game Crafter + +Director of Fun + +Music and Sounds + +Programming + +Art + +QA + +Executive Producer + +Lead Producer + +Producer + +Test Lead + +Lead Tester + +Design Team + +Development Team + +Release Management + +Director, XBLA Publishing + +Business Development + +Portfolio Director + +Product Manager + +Marketing + + Community Manager + +Europe Localization Team + +Redmond Localization Team + +Asia Localization Team + +User Research Team + +MGS Central Teams + +Milestone Acceptance Tester + +Special Thanks + +Test Manager + +Senior Test Lead + +SDET + +Project STE + +Additional STE + +Test Associates + +Jon Kågström + +Tobias Möllstam + +Risë Lugo + +Holzschwert + +Steinschwert + +Eisenschwert + +Diamantschwert + +Goldschwert + +Holzschaufel + +Steinschaufel + +Eisenschaufel + +Diamantschaufel + +Goldschaufel + +Holzspitzhacke + +Steinspitzhacke + +Eisenspitzhacke + +Diamantspitzhacke + +Goldspitzhacke + +Holzaxt + +Steinaxt + +Eisenaxt + +Diamantaxt + +Goldaxt + +Holzhacke + +Steinhacke + +Eisenhacke + +Diamanthacke + +Goldhacke + +Holztür + +Eisentür + +Kettenhelm + +Kettenbrustplatte + +Kettenhose + +Kettenstiefel + +Lederkappe + +Eisenhelm + +Diamanthelm + +Goldhelm + +Ledertunika + +Eisenbrustplatte + +Diamantbrustplatte + +Goldbrustplatte + +Lederhose + +Eisenhose + +Diamanthose + +Goldhose + +Lederstiefel + +Eisenstiefel + +Diamantstiefel + +Goldstiefel + +Eisenbarren + +Goldbarren + +Eimer + +Wassereimer + +Lavaeimer + +Feuerzeug + +Apfel + +Bogen + +Pfeil + +Kohle + +Holzkohle + +Diamant + +Stock + +Schüssel + +Pilzsuppe + +Faden + +Feder + +Schießpulver + +Weizensamen + +Weizen + +Brot + +Feuerstein + +Rohes Schweinefleisch + +Gekochtes Schweinefleisch + +Gemälde + +Goldener Apfel + +Schild + +Lore + +Sattel + +Redstone + +Schneeball + +Boot + +Leder + +Milcheimer + +Ziegel + +Lehm + +Zuckerrohr + +Papier + +Buch + +Schleimball + +Lore mit Truhe + +Lore mit Ofen + +Ei + +Kompass + +Angel + +Uhr + +Glowstone-Staub + +Roher Fisch + +Gekochter Fisch + +Farbpulver + +Tintensack + +Rosenrot + +Kaktusgrün + +Kakaobohnen + +Lapislazuli + +Lila Farbe + +Farbe Cyan + +Hellgraue Farbe + +Graue Farbe + +Rosa Farbe + +Hellgrüne Farbe + +Löwenzahngelb + +Hellblaue Farbe + +Farbe Magenta + +Farbe Orange + +Knochenmehl + +Knochen + +Zucker + +Kuchen + +Bett + +Redstone-Repeater + +Keks + +Karte + +Leere Karte + +Schallplatte - "13" + +Schallplatte - "cat" + +Schallplatte - "blocks" + +Schallplatte - "chirp" + +Schallplatte - "far" + +Schallplatte - "mall" + +Schallplatte - "mellohi" + +Schallplatte - "stal" + +Schallplatte - "strad" + +Schallplatte - "ward" + +Schallplatte - "11" + +Schallplatte - "where are we now" + +Schere + +Kürbissamen + +Melonensamen + +Rohes Hühnchen + +Gebratenes Hühnchen + +Rohes Rindfleisch + +Steak + +Verrottetes Fleisch + +Enderperle + +Melonenscheibe + +Lohenrute + +Ghastträne + +Goldklumpen + +Netherwarze + +{*prefix*} {*splash*}Trank {*postfix*} + +Glasflasche + +Wasserflasche + +Spinnenauge + +Fermentiertes Spinnenauge + +Lohenstaub + +Magmacreme + +Braustand + +Kessel + +Enderauge + +Funkelnde Melone + +Erfahrungsfläschchen + +Feuerkugel + +Feuerkugel (Holzkohle) + +Feuerkugel (Kohle) + +Gegenstandsrahmen + +{*CREATURE*} erzeugen + +Netherziegel + +Schädel + +Skelettschädel + +Dörrskelettschädel + +Zombiekopf + +Kopf + +Kopf von %s + +Creeper-Kopf + +Netherstern + +Feuerwerksrakete + +Feuerwerksstern + +Redstone-Vergleicher + +Lore mit TNT + +Lore mit Trichter + +Eisen-Pferderüstung + +Gold-Pferderüstung + +Diamant-Pferderüstung + +Leine + +Namensschild + +Stein + +Grasblock + +Erde + +Pflasterstein + +Eichenholzbretter + +Fichtenholzbretter + +Birkenholzbretter + +Dschungelholzbretter + +Holzbretter (jeder Typ) + +Setzling + +Eichensetzling + +Fichtensetzling + +Birkensetzling + +Dschungelbaumsetzling + +Bedrock + +Wasser + +Lava + +Sand + +Sandstein + +Kies + +Golderz + +Eisenerz + +Kohlenerz + +Baumstamm + +Eichenholz + +Fichtenholz + +Birkenholz + +Dschungelholz + +Eiche + +Fichte + +Birke + +Blätter + +Eichenblätter + +Fichtenblätter + +Birkenblätter + +Dschungelblätter + +Schwamm + +Glas + +Wolle + +Schwarze Wolle + +Rote Wolle + +Grüne Wolle + +Braune Wolle + +Blaue Wolle + +Lila Wolle + +Cyanfarbene Wolle + +Hellgraue Wolle + +Graue Wolle + +Rosa Wolle + +Hellgrüne Wolle + +Gelbe Wolle + +Hellblaue Wolle + +Magentafarbene Wolle + +Orangefarbene Wolle + +Weiße Wolle + +Blume + +Rose + +Pilz + +Goldblock + +Eine kompakte Lagermöglichkeit für Gold. + +Eine kompakte Lagermöglichkeit für Eisen. + +Eisenblock + +Steinstufe + +Steinstufe + +Sandsteinstufe + +Eichenholzstufe + +Pflastersteinstufe + +Ziegelstufe + +Steinziegelstufe + +Eichenholzstufe + +Fichtenholzstufe + +Birkenholzstufe + +Dschungelholzstufe + +Netherziegelstufe + +Ziegel + +TNT + +Bücherregal + +Bemooster Pflasterstein + +Obsidian + +Fackel + +Fackel (Kohle) + +Fackel (Holzkohle) + +Feuer + +Monster-Spawner + +Eichenholztreppe + +Truhe + +Redstone-Staub + +Diamanterz + +Diamantblock + +Eine kompakte Lagermöglichkeit für Diamanten. + +Werkbank + +Getreide + +Ackerland + +Ofen + +Schild + +Holztür + +Leiter + +Schiene + +Booster-Schiene + +Detektor-Schiene + +Steintreppe + +Hebel + +Druckplatte + +Eisentür + +Redstone-Erz + +Redstone-Fackel + +Schalter + +Schnee + +Eis + +Kaktus + +Lehm + +Zuckerrohr + +Jukebox + +Zaun + +Kürbis + +Kürbislaterne + +Netherrack + +Soul Sand + +Glowstone + +Portal + +Lapislazulierz + +Lapislazuliblock + +Eine kompakte Lagermöglichkeit für Lapislazuli. + +Dispenser + +Notenblock + +Kuchen + +Bett + +Netz + +Hohes Gras + +Toter Strauch + +Diode + +Verschlossene Truhe + +Falltür + +Wolle (beliebige Farbe) + +Kolben + +Haftender Kolben + +Silberfischblock + +Steinziegel + +Bemooste Steinziegel + +Rissige Steinziegel + +Gemeißelter Steinziegel + +Pilz + +Pilz + +Eisengitter + +Glasscheibe + +Melone + +Kürbispflanze + +Melonenpflanze + +Ranken + +Zauntor + +Ziegeltreppe + +Steinziegeltreppe + +Silberfischstein + +Silberfisch-Pflasterstein + +Silberfisch-Steinziegel + +Myzel + +Seerosenblatt + +Netherziegel + +Netherzaun + +Netherziegeltreppe + +Netherwarze + +Zaubertisch + +Braustand + +Kessel + +Endportal + +Endportalrahmen + +Endstein + +Drachenei + +Strauch + +Hohes Gras + +Sandsteintreppe + +Fichtenholztreppe + +Birkenholztreppe + +Dschungelholztreppe + +Redstone-Lampe + +Kakao + +Schädel + +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 + +Bewegen/Sprinten + +Schauen + +Pause + +Springen + +Springen/Hochfliegen + +Inventar + +Gegenstand wechseln + +Aktion + +Verwenden + +Crafting + +Ablegen + +Schleichen + +Schleichen/Runterfliegen + +Kameramodus ändern + +Spieler/Einladen + +Bewegen (Beim Fliegen) + +Layout 1 + +Layout 2 + +Layout 3 + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +{*B*}Drück zum Fortfahren{*CONTROLLER_VK_A*}. + +{*B*}Drück{*CONTROLLER_VK_A*}, um das Tutorial zu starten.{*B*} + Drück{*CONTROLLER_VK_B*}, wenn du denkst, dass du so weit bist, dass du allein spielen kannst. + +Minecraft ist ein Spiel, bei dem du Blöcke platzierst, um alles zu bauen, was du dir vorstellen kannst. +Nachts treiben sich Monster herum, du solltest dir einen Unterstand bauen, bevor sie herauskommen. + +Mit{*CONTROLLER_ACTION_LOOK*}kannst du nach oben, unten und in die anderen Richtungen schauen. + +Mit{*CONTROLLER_ACTION_MOVE*}kannst du dich umherbewegen. + +Um zu sprinten, drücke {*CONTROLLER_ACTION_MOVE*} zweimal schnell nacheinander nach vorn. Solange du {*CONTROLLER_ACTION_MOVE*} nach vorn gedrückt hältst, sprintest du, bis dir die Sprintzeit oder die Nahrung ausgeht. + +Drück{*CONTROLLER_ACTION_JUMP*}, um zu springen. + +Halte{*CONTROLLER_ACTION_ACTION*}gedrückt, um mit deiner Hand oder dem Werkzeug in deiner Hand zu graben oder zu hacken. Um manche Blöcke abbauen zu können, wirst du dir ein Werkzeug herstellen müssen. + +Halte{*CONTROLLER_ACTION_ACTION*}gedrückt, um 4 Blöcke von Baumstämmen abzuhacken.{*B*}Wenn ein Block abbricht, kannst du ihn aufnehmen, indem du dich dicht neben das auftauchende, schwebende Objekt stellst, wodurch es in deinem Inventar erscheint. + +Drück{*CONTROLLER_ACTION_CRAFTING*}, um die Crafting-Oberfläche zu öffnen. + +Wenn du zunehmend mehr Gegenstände einsammelst und herstellst, wird sich dein Inventar langsam füllen.{*B*} + Drück{*CONTROLLER_ACTION_INVENTORY*}, um das Inventar zu öffnen. + +Durch Umherlaufen, Graben und Angreifen leerst du deine Hungerleiste {*ICON_SHANK_01*}. Durch Sprinten und Sprint-Springen verbrauchst du viel mehr Nahrung als durch normales Laufen und Springen. + +Wenn du Gesundheit verlierst, aber eine Hungerleiste mit 9 oder mehr{*ICON_SHANK_01*} darin hast, regeneriert sich deine Gesundheit automatisch. Wenn du Nahrung isst, regeneriert sich deine Hungerleiste. + +Halte{*CONTROLLER_ACTION_USE*} gedrückt, wenn du Nahrung in der Hand hast, um sie zu essen und deine Hungerleiste aufzufüllen. Du kannst nichts essen, wenn deine Hungerleiste voll ist. + +Deine Hungerleiste ist fast leer, und du hast etwas Gesundheit verloren. Iss das Steak aus deinem Inventar, um deine Hungerleiste aufzufüllen und deine Gesundheit zu regenerieren.{*ICON*}364{*/ICON*} + +Die eingesammelten Baumstämme können zu Holz verarbeitet werden. Öffne dazu die Crafting-Oberfläche.{*PlanksIcon*} + +Viele Crafting-Vorgänge bestehen aus mehreren Schritten. Jetzt, da du etwas Holz hast, kannst du weitere Gegenstände herstellen. Erstell eine Werkbank.{*CraftingTableIcon*} + +Um Blöcke schneller einsammeln zu können, kannst du dir besser geeignete Werkzeuge herstellen. Manche Werkzeuge haben einen Griff, der aus Stöcken hergestellt wird. Stell jetzt ein paar Stöcke her.{*SticksIcon*} + +Wechsle mit{*CONTROLLER_ACTION_LEFT_SCROLL*} oder{*CONTROLLER_ACTION_RIGHT_SCROLL*} den Gegenstand in deiner Hand. + +Drück{*CONTROLLER_ACTION_USE*}, um Gegenstände zu verwenden, mit Objekten zu interagieren und geeignete Gegenstände zu platzieren. Platzierte Gegenstände kannst du wieder aufnehmen, indem du sie mit dem geeigneten Werkzeug abbaust. + +Wenn du die Werkbank ausgewählt hast, zeig mit dem Fadenkreuz dahin, wo du sie aufstellen möchtest, und platzier sie, indem du{*CONTROLLER_ACTION_USE*} drückst. + +Zeig mit dem Fadenkreuz auf die Werkbank und drück{*CONTROLLER_ACTION_USE*}, um sie zu öffnen. + +Eine Schaufel hilft dir, weiche Blöcke wie Erde und Schnee schneller abzubauen. Wenn du weitere Materialien gesammelt hast, kannst du Werkzeuge herstellen, mit denen du schneller arbeiten kannst und die länger halten. Stell eine Holzschaufel her.{*WoodenShovelIcon*} + +Mit einer Axt kannst du schneller Stämme und hölzerne Gegenstände bearbeiten. Wenn du weitere Materialien gesammelt hast, kannst du Werkzeuge herstellen, mit denen du schneller arbeiten kannst und die länger halten. Stell eine Holzaxt her.{*WoodenHatchetIcon*} + +Eine Spitzhacke hilft dir, harte Blöcke wie Stein und Erz schneller abzubauen. Wenn du weitere Materialien gesammelt hast, kannst du Werkzeuge herstellen, mit denen du schneller arbeiten sowie härtere Materialien abbauen kannst und die länger halten. Stell eine Holzspitzhacke her.{*WoodenPickaxeIcon*} + +Container öffnen + + + Die Nacht kann schnell hereinbrechen, und dann wird es gefährlich, sich unvorbereitet im Freien aufzuhalten. Du kannst Rüstungen und Waffen herstellen, es ist aber eine gute Idee, einen sicheren Unterstand zu haben. + + + + In der Nähe gibt es einen verlassenen Unterstand von Minenarbeitern, den du fertigstellen kannst, um nachts in Sicherheit zu sein. + + + + Du wirst die nötigen Materialien sammeln müssen, um den Unterstand fertig zu bauen. Wände und Dach können aus beliebigem Material bestehen, aber du wirst eine Tür, ein paar Fenster und Beleuchtung brauchen. + + +Bau mithilfe deiner Spitzhacke ein paar Steinblöcke ab. Steinblöcke erzeugen beim Abbauen Pflastersteine. Wenn du 8 Blöcke Pflasterstein sammelst, kannst du einen Ofen bauen. Möglicherweise musst du dich durch Erde graben, um auf Stein zu stoßen. Verwende dazu deine Schaufel.{*StoneIcon*} + +Du hast genügend Pflastersteine gesammelt, um einen Ofen zu bauen. Verwende deine Werkbank, um einen herzustellen. + +Drück{*CONTROLLER_ACTION_USE*}, um den Ofen in der Welt zu platzieren, und öffne ihn dann. + +Verwende den Ofen, um etwas Holzkohle herzustellen. Wie wäre es, wenn du noch weitere Materialien für deinen Unterstand sammelst, während du wartest? + +Verwende den Ofen, um etwas Glas herzustellen. Wie wäre es, wenn du noch weitere Materialien für deinen Unterstand sammelst, während du wartest? + +Eine gute Unterkunft sollte eine Tür haben, damit du leicht hinaus- und hineingehen kannst, ohne immer die Wände abbauen und wieder ersetzen zu müssen. Stell jetzt eine Holztür her.{*WoodenDoorIcon*} + +Drück{*CONTROLLER_ACTION_USE*}, um die Tür zu platzieren. Du kannst {*CONTROLLER_ACTION_USE*}verwenden, um eine Holztür zu öffnen oder zu schließen. + +Nachts kann es sehr dunkel werden, du wirst daher deine Unterkunft beleuchten wollen, damit du etwas sehen kannst. Stell auf der Crafting-Oberfläche eine Fackel aus Stöcken und Holzkohle her.{*TorchIcon*} + + + Du hast den ersten Teil des Tutorials abgeschlossen. + + + + {*B*} + Drück{*CONTROLLER_VK_A*}, um das Tutorial fortzusetzen.{*B*} + Drück{*CONTROLLER_VK_B*}, wenn du denkst, dass du so weit bist, dass du allein spielen kannst. + + + + Dies ist dein Inventar. Hier werden die Gegenstände angezeigt, die du in deiner Hand verwenden kannst, sowie alle anderen Gegenstände, die du bei dir trägst. Außerdem wird hier deine Rüstung angezeigt. + +{*B*} + Drück zum Fortfahren{*CONTROLLER_VK_A*}.{*B*} + Drück{*CONTROLLER_VK_B*}, wenn du bereits weißt, wie das Inventar verwendet wird. + + + + Beweg den Cursor mit{*CONTROLLER_MENU_NAVIGATE*}. Drück{*CONTROLLER_VK_A*}, um einen Gegenstand unter dem Cursor aufzunehmen. + Falls es dort mehr als einen Gegenstand gibt, werden alle aufgenommen. Du kannst auch {*CONTROLLER_VK_X*}drücken, um nur die Hälfte von ihnen aufzunehmen. + + + + Beweg diesen Gegenstand mit dem Cursor an einen anderen Platz im Inventar, und platzier ihn dort, indem du{*CONTROLLER_VK_A*} drückst. + Wenn sich mehrere Gegenstände unter dem Cursor befinden, drück{*CONTROLLER_VK_A*}, um alle abzulegen, oder{*CONTROLLER_VK_X*}, um nur einen abzulegen. + + + + Wenn du den Cursor mit einem Gegenstand über den Rand der Oberfläche hinaus bewegst, kannst du den Gegenstand ablegen. + + + + Wenn du mehr Informationen über einen Gegenstand brauchst, beweg den Cursor über den Gegenstand und drück{*CONTROLLER_ACTION_MENU_PAGEDOWN*}. + + + + 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_ACTION_MENU_PAGEDOWN*}. + + + + Drück jetzt{*CONTROLLER_VK_B*}, um das Kreativmodus-Inventar zu verlassen. + + + + Dies ist die Crafting-Oberfläche. Hier kannst du gesammelte Gegenstände kombinieren, um neue Gegenstände herzustellen. + + +{*B*} + Drück zum Fortfahren{*CONTROLLER_VK_A*}.{*B*} + Drück{*CONTROLLER_VK_B*}, wenn du bereits weißt, wie man craftet. + + +{*B*} + Drück{*CONTROLLER_VK_X*}, um eine Beschreibung des Gegenstands anzuzeigen. + + +{*B*} + Drück{*CONTROLLER_VK_X*}, um die Zutaten anzuzeigen, die du für den aktuellen Gegenstand benötigst. + + +{*B*} + Drück{*CONTROLLER_VK_X*}, um wieder das Inventar anzuzeigen. + + + + Wechsle mit{*CONTROLLER_VK_LB*} und{*CONTROLLER_VK_RB*} zwischen den Reitern der einzelnen Gruppen, um die Gruppe des gewünschten Gegenstands auszuwählen, und wähl dann den herzustellenden Gegenstand mit{*CONTROLLER_MENU_NAVIGATE*} aus. + + + + Der Crafting-Bereich zeigt die Gegenstände an, die du brauchst, um den neuen Gegenstand herzustellen. Drück{*CONTROLLER_VK_A*}, um den Gegenstand herzustellen und in deinem Inventar abzulegen. + + + + Mithilfe einer Werkbank kannst du eine größere Auswahl an Gegenständen herstellen. Crafting auf einer Werkbank funktioniert genau wie einfaches Crafting, du hast aber einen größeren Crafting-Bereich, der mehr Zutatenkombinationen erlaubt. + + + + Der untere rechte Bereich der Crafting-Oberfläche zeigt dein Inventar an. In diesem Bereich kannst du dir auch eine Beschreibung des derzeit ausgewählten Gegenstands samt der dafür benötigten Zutaten anzeigen lassen. + + + + Jetzt wird die Beschreibung des derzeit ausgewählten Gegenstands angezeigt. Die Beschreibung hilft dir zu verstehen, wofür der Gegenstand eingesetzt werden kann. + + + + Jetzt wird die Liste der Zutaten angezeigt, die benötigt werden, um den ausgewählten Gegenstand herzustellen. + + +Die eingesammelten Baumstämme können zu Holz verarbeitet werden. Wähl das Holzsymbol aus und drück{*CONTROLLER_VK_A*}, um Holz herzustellen.{*PlanksIcon*} + + + Du solltest deine Werkbank jetzt in der Welt platzieren, damit du eine größere Auswahl an Gegenständen herstellen kannst.{*B*} + Drück jetzt{*CONTROLLER_VK_B*}, um die Crafting-Oberfläche zu verlassen. + + + + Drück{*CONTROLLER_VK_LB*} und{*CONTROLLER_VK_RB*}, um zur Gruppe der Gegenstände zu wechseln, die du herstellen möchtest. Wähl die Gruppe „Werkzeuge“ aus.{*ToolsIcon*} + + + + Drück{*CONTROLLER_VK_LB*} und{*CONTROLLER_VK_RB*}, um zur Gruppe der Gegenstände zu wechseln, die du herstellen möchtest. Wähl die Gruppe „Strukturen“ aus.{*StructuresIcon*} + + + + Ändere mit{*CONTROLLER_MENU_NAVIGATE*} den Gegenstand, den du herstellen möchtest. Von manchen Gegenständen gibt es mehrere Versionen, abhängig vom verwendeten Material. Wähl die Holzschaufel aus.{*WoodenShovelIcon*} + + + + Viele Crafting-Vorgänge bestehen aus mehreren Schritten. Jetzt, da du etwas Holz hast, kannst du weitere Gegenstände herstellen. Ändere mit{*CONTROLLER_MENU_NAVIGATE*} den Gegenstand, den du herstellen möchtest. Wähl die Werkbank aus.{*CraftingTableIcon*} + + + + Mit den Werkzeugen, die du gebaut hast, hast du einen guten Start hingelegt. Du bist jetzt in der Lage, eine Vielzahl verschiedener Materialien effektiver zu sammeln.{*B*} + Drück jetzt{*CONTROLLER_VK_B*}, um die Crafting-Oberfläche zu verlassen. + + + + Manche Gegenstände kannst du nicht mit der Werkbank herstellen, sondern brauchst dafür einen Ofen. Stell jetzt einen Ofen her.{*FurnaceIcon*} + + + + Platzier den hergestellten Ofen in der Welt. Du wirst ihn in deinen Unterstand stellen wollen.{*B*} + Drück jetzt{*CONTROLLER_VK_B*}, um die Crafting-Oberfläche zu verlassen. + + + + Dies ist die Ofen-Oberfläche. Ein Ofen erlaubt dir, Gegenstände zu verändern, indem du sie erhitzt. Du kannst im Ofen zum Beispiel Eisenbarren aus Eisenerz herstellen. + + +{*B*} + Drück zum Fortfahren{*CONTROLLER_VK_A*}.{*B*} + Drück{*CONTROLLER_VK_B*}, wenn du bereits weißt, wie man einen Ofen verwendet. + + + + Du musst in das untere Feld des Ofens Brennstoff legen und in das obere den Gegenstand, den du verändern möchtest. Der Ofen wird dann angeheizt und beginnt zu arbeiten, wodurch das Ergebnis im rechten Feld erscheint. + + + + Du kannst viele Holzgegenstände als Brennstoff verwenden, aber nicht alles brennt gleich lange. Du wirst auch andere Gegenstände in der Welt finden, die du als Brennstoff verwenden kannst. + + + + Wenn dein Gegenstand fertig erhitzt ist, kannst du ihn aus dem Ausgabefeld in dein Inventar verschieben. Du solltest mit verschiedenen Zutaten experimentieren, um zu sehen, was du alles herstellen kannst. + + + + Wenn du Baumstämme als Zutat verwendest, kannst du Holzkohle herstellen. Leg Brennstoff in den Ofen und einen Baumstamm in das Zutatenfeld. Es wird eine Weile dauern, bis der Ofen die Holzkohle fertig hat, du kannst währenddessen etwas anderes tun und später wiederkommen, um dir den Fortschritt anzusehen. + + + + Holzkohle kann als Brennstoff verwendet werden, du kannst daraus aber auch mit einem Stock eine Fackel herstellen. + + + + Wenn du Sand ins Zutatenfeld legst, kannst du Glas herstellen. Erschaff ein paar Glasblöcke, die du als Fenster in deinem Unterstand verwenden kannst. + + + + Dies ist die Brau-Oberfläche. Hier kannst du Tränke erschaffen, die die verschiedensten Effekte haben können. + + +{*B*} + Drück zum Fortfahren{*CONTROLLER_VK_A*}. {*B*} + Drück{*CONTROLLER_VK_B*}, wenn du schon weißt, wie man den Braustand verwendet. + + + + Du braust Tränke, indem du in das obere Feld eine Zutat legst und in die unteren Felder je einen Trank oder eine Wasserflasche (du kannst gleichzeitig bis zu 3 Tränke brauen). Sobald eine funktionierende Kombination eingelegt wurde, beginnt der Brauprozess und nach kurzer Zeit entsteht der Trank. + + + + Basis aller Tränke ist eine Wasserflasche. Die meisten Tränke werden hergestellt, indem zuerst mit einer Netherwarze ein Seltsamer Trank hergestellt wird. Sie erfordern mindestens eine weitere Zutat, bevor der Trank fertig ist. + + + + Wenn du einen Trank fertig hast, kannst du seinen Effekt noch weiter modifizieren. Wenn du ihm Redstone-Staub hinzufügst, steigerst du die Dauer seines Effekts. Wenn du ihm Glowstone-Staub hinzufügst, machst du ihn stärker. + + + + Wenn du dem Trank ein Fermentiertes Spinnenauge hinzufügst, verdirbt der Trank und kann den entgegengesetzten Effekt hervorrufen. Wenn du dem Trank Schießpulver hinzufügst, wird aus dem Trank ein Wurftrank und du kannst seinen Effekt auf einen ganzen Bereich entfalten. + + + + Erzeuge einen Trank der Feuerresistenz, indem du zuerst eine Netherwarze zu einer Wasserflasche hinzufügst und dann Magmacreme. + + + + Drück jetzt{*CONTROLLER_VK_B*}, um die Brauoberfläche zu verlassen. + + + + In diesem Gebiet gibt es einen Braustand, einen Kessel sowie eine Truhe mit Gegenständen zum Brauen. + + +{*B*} + Drück{*CONTROLLER_VK_A*}, wenn du mehr über das Brauen und Tränke erfahren möchtest. {*B*} + Drück{*CONTROLLER_VK_B*}, wenn du schon alles über das Brauen und Tränke weißt. + + + + Der erste Schritt zum Brauen eines Trankes ist es, eine Wasserflasche zu erschaffen. Nimm eine Glasflasche aus der Truhe. + + + + Du kannst eine Glasflasche aus einem Kessel mit Wasser füllen oder aus einem Wasserblock. Fülle jetzt deine Glasflasche, indem du damit auf eine Wasserquelle zeigst und{*CONTROLLER_ACTION_USE*} drückst. + + + + Wenn ein Kessel leer ist, kannst du ihn mit einem Wassereimer wieder auffüllen. + + + + Braue mithilfe des Braustandes einen Trank der Feuerresistenz. Du brauchst dazu eine Wasserflasche, eine Netherwarze und Magmacreme. + + + + Nimm einen Trank in deine Hand und halte{*CONTROLLER_ACTION_USE*} gedrückt, um ihn zu verwenden. Einen normalen Trank wirst du trinken und den Effekt auf dich selbst anwenden, Wurftränke wirst du werfen und den Effekt auf die Kreaturen in der Nähe der Aufschlagstelle anwenden. + Wurftränke kannst du herstellen, indem du zu einem normalen Trank Schießpulver hinzufügst. + + + + Verwende deinen Trank der Feuerresistenz für dich selbst. + + + + Jetzt bist du resistent gegenüber Feuer und Lava. Probier doch mal aus, ob du jetzt Orte erreichen kannst, die dir vorher versperrt geblieben sind. + + + + Dies ist die Verzauberoberfläche, über die du Waffen, Rüstungen und einige Werkzeuge verzaubern kannst. + + +{*B*} + Drück{*CONTROLLER_VK_A*}, wenn du mehr über die Verzauberoberfläche erfahren möchtest. {*B*} + Drück{*CONTROLLER_VK_B*}, wenn du schon alles über die Verzauberoberfläche weißt. + + + + Um einen Gegenstand zu verzaubern, lege ihn in das Verzauberfeld. Waffen, Rüstungen und manche Werkzeuge können verzaubert werden, um Spezialeffekte zu erhalten wie einen verbesserten Widerstand gegenüber Schaden oder eine Steigerung der Anzahl der Gegenstände, die du erhältst, wenn du einen Block abbaust. + + + + Wenn ein Gegenstand in das Verzauberfeld gelegt wird, ändern sich die Schaltflächen rechts und zeigen eine Auswahl zufälliger Verzauberungen an. + + + + Die Zahl auf den Schaltflächen symbolisiert die Kosten in Erfahrungsleveln, um die Verzauberung auf den Gegenstand anzuwenden. Wenn dein Erfahrungslevel nicht hoch genug ist, ist die Schaltfläche deaktiviert. + + + + Wähl eine Verzauberung aus und drück{*CONTROLLER_VK_A*}, um den Gegenstand zu verzaubern. Dadurch sinkt dein Erfahrungslevel um die Kosten der Verzauberung. + + + + Auch wenn alle Verzauberungen zufällig sind, sind einige der besseren doch nur verfügbar, wenn du einen hohen Erfahrungslevel und viele Bücherregale rund um den Zaubertisch errichtet hast, um die Stärke des Zaubers zu vergrößern. + + + + In diesem Gebiet stehen ein Zaubertisch und weitere Gegenstände, die dir helfen, etwas über das Verzaubern zu lernen. + + +{*B*} + Drücke {*CONTROLLER_VK_A*}, um mehr über das Verzaubern zu erfahren.{*B*} + Drücke {*CONTROLLER_VK_B*}, wenn du bereits alles über das Verzaubern weißt. + + + + Mithilfe eines Zaubertisches kannst du Waffen, Rüstungen und manchen Werkzeugen Spezialeffekte hinzufügen wie einen verbesserten Widerstand gegenüber Schaden oder eine Steigerung der Anzahl der Gegenstände, die du erhältst, wenn du einen Block abbaust. + + + + Wenn du Bücherregale rund um den Zaubertisch baust, steigerst du seine Zauberkraft und kannst Verzauberungen höherer Level erhalten. + + + + Gegenstände verzaubern kostet Erfahrungslevel, die du durch das Sammeln von Erfahrungskugeln steigerst. Erfahrungskugeln entstehen, wenn du Monster und Tiere tötest, Erz abbaust, Tiere züchtest, angelst und manche Dinge in einem Ofen kochst/einschmilzt. + + + + Du kannst Erfahrung auch durch den Einsatz von Erfahrungsflaschen erhalten. Wenn diese geworfen werden, entstehen Erfahrungskugeln rund um die Stelle, wo sie gelandet ist. Diese Kugeln können eingesammelt werden. + + + + In den Truhen in dieser Gegend findest du ein paar verzauberte Gegenstände, Erfahrungsflaschen und ein paar Gegenstände, die noch verzaubert werden müssen – also alles, was du brauchst, um mit dem Zaubertisch zu experimentieren. + + + + Du fährst jetzt in einer Lore. Um die Lore zu verlassen, platzier den Cursor darauf und drück{*CONTROLLER_ACTION_USE*}.{*MinecartIcon*} + + +{*B*} + Drück{*CONTROLLER_VK_A*}, um mehr über Loren zu erfahren.{*B*} + Drück{*CONTROLLER_VK_B*}, wenn du bereits alles über Loren weißt. + + + + Loren fahren auf Schienen. Mit einem Ofen und einer Lore kannst du eine angetriebene Lore erschaffen. Du kannst auch eine Lore mit einer Truhe darin erschaffen. + {*RailIcon*} + + + + Du kannst auch Booster-Schienen erschaffen, die Loren mit Strom aus Redstone-Fackeln und -Stromkreisen beschleunigen. Sie können mit Schaltern, Hebeln und Druckplatten verbunden werden, um komplexe Systeme zu erschaffen. + {*PoweredRailIcon*} + + + + Du segelst jetzt in einem Boot. Um das Boot zu verlassen, platzier den Cursor darauf und drück{*CONTROLLER_ACTION_USE*}.{*BoatIcon*} + + + + {*B*} + Drück{*CONTROLLER_VK_A*}, um mehr über Boote zu erfahren.{*B*} + Drück{*CONTROLLER_VK_B*}, wenn du bereits alles über Boote weißt. + + + + Ein Boot erlaubt dir, schneller übers Wasser zu reisen. Du kannst es mit{*CONTROLLER_ACTION_MOVE*} und{*CONTROLLER_ACTION_LOOK*} steuern. + {*BoatIcon*} + + + + Du verwendest jetzt eine Angel. Drück{*CONTROLLER_ACTION_USE*}, um sie einzusetzen.{*FishingRodIcon*} + + + + {*B*} + Drück{*CONTROLLER_VK_A*}, um mehr übers Angeln zu erfahren.{*B*} + Drück{*CONTROLLER_VK_B*}, wenn du bereits alles übers Angeln weißt. + + + + Drück{*CONTROLLER_ACTION_USE*}, um deine Angel auszuwerfen und mit dem Angeln zu beginnen. Drück erneut{*CONTROLLER_ACTION_USE*}, um die Angel einzuholen. + {*FishingRodIcon*} + + + + Wenn du mit dem Einholen wartest, bis der Schwimmer unter die Wasseroberfläche versunken ist, kannst du einen Fisch fangen. Fische können roh gegessen oder in einem Ofen gekocht werden, um deine Gesundheit zu regenerieren. + {*FishIcon*} + + + + Genau wie viele andere Werkzeuge kann eine Angel nicht unbegrenzt oft eingesetzt werden. Ihr Einsatz beschränkt sich aber nicht aufs Fangen von Fischen. Du solltest mit ihr experimentieren, um zu sehen, was du sonst noch so fangen oder aktivieren kannst ... + {*FishingRodIcon*} + + + + Dies ist ein Bett. Drück{*CONTROLLER_ACTION_USE*}, während du nachts darauf zeigst, um die Nacht zu verschlafen und am Morgen wieder zu erwachen.{*ICON*}355{*/ICON*} + + + + {*B*} + Drück{*CONTROLLER_VK_A*}, um mehr über Betten zu erfahren.{*B*} + Drück{*CONTROLLER_VK_B*}, wenn du bereits alles über Betten weißt. + + + + Ein Bett sollte an einem sicheren, gut beleuchteten Ort stehen, damit du nicht mitten in der Nacht von Monstern geweckt wirst. Sobald du einmal ein Bett verwendet hast und später stirbst, erscheinst du in diesem Bett wieder in der Spielwelt. + {*ICON*}355{*/ICON*} + + + + Wenn es in deinem Spiel noch weitere Spieler gibt, müssen sich alle gleichzeitig im Bett befinden, um schlafen zu können. + {*ICON*}355{*/ICON*} + + + + In diesem Gebiet gibt es ein paar einfache Redstone- und Kolben-Schaltkreise sowie eine Truhe mit weiteren Gegenständen, um diese Schaltkreise zu erweitern. + + + + {*B*} + Drück{*CONTROLLER_VK_A*}, um mehr über Redstone-Schaltkreise und Kolben zu erfahren.{*B*} + Drück{*CONTROLLER_VK_B*}, wenn du bereits alles über Redstone-Schaltkreise und Kolben weißt. + + + + Hebel, Schalter, Druckplatten und auch Redstone-Fackeln können Schaltkreise mit Strom versorgen, indem du sie entweder direkt oder mithilfe von Redstone-Staub mit dem Gegenstand verbindest, den du aktivieren möchtest. + + + + Sowohl Position als auch Ausrichtung einer Stromquelle können einen Einfluss darauf haben, welchen Effekt sie auf die umgebenden Blöcke hat. Wenn du zum Beispiel eine Redstone-Fackel seitlich an einem Block anbringst, kann sie ausgeschaltet werden, wenn der Block Strom von einer anderen Quelle erhält. + + + + Redstone-Staub kannst du beim Abbauen von Redstone-Erz mit einer Spitzhacke aus Eisen, Diamant oder Gold erhalten. Mit seiner Hilfe kannst du Strom 15 Blöcke weit und einen Block nach oben oder unten übertragen. + {*ICON*}331{*/ICON*} + + + + Mit Redstone-Repeatern kannst du die Distanz verlängern, über die du Strom übertragen kannst, oder eine Verzögerung in einem Schaltkreis verursachen. + {*ICON*}356{*/ICON*} + + + + Wenn Strom an den Kolben angelegt wird, wird der Kolben länger und verschiebt bis zu 12 Blöcke. Wenn ein haftender Kolben zurückgezogen wird, zieht er einen Block der meisten Typen mit sich zurück. + {*ICON*}33{*/ICON*} + + + + In der Truhe in diesem Gebiet findest du Komponenten, um Schaltkreise mit Kolben herzustellen. Versuch, die Schaltkreise in diesem Gebiet zu verwenden oder sie fertigzustellen, oder bau deine eigenen zusammen. Außerhalb des Tutorial-Gebiets findest du weitere Beispiele. + + + + In diesem Gebiet gibt es ein Portal in den Nether! + + + + {*B*} + Drück {*CONTROLLER_VK_A*}, um mehr über das Portal und den Nether zu erfahren.{*B*} + Drück {*CONTROLLER_VK_B*}, wenn du schon alles über das Portal und den Nether weißt. + + + + Portale werden erzeugt, indem man Obsidian-Blöcke zu einem vier Blöcke breiten und fünf Blöcke hohen Rahmen anordnet. Die Eckblöcke können dabei weggelassen werden. + + + + Um ein Nether-Portal zu aktivieren, entzünde die Obsidian-Blöcke in dem Rahmen mit einem Feuerzeug. Portale können deaktiviert werden, wenn ihr Rahmen zerbrochen wird, wenn sich in der Nähe eine Explosion ereignet oder wenn eine Flüssigkeit hindurchfließt. + + + + Um ein Nether-Portal zu verwenden, stell dich hinein. Dein Bildschirm wird sich lila färben, und du hörst ein Geräusch. Nach ein paar Sekunden wirst du in eine andere Dimension transportiert. + + + + Der Nether kann ein gefährlicher Ort sein, voller Lava. Er ist aber auch nützlich, um Netherstein zu sammeln, der nach dem Anzünden ewig brennt, sowie Glowstone, der Licht produziert. + + + + Mithilfe der Netherwelt kann man in der oberirdischen Welt schneller reisen – eine Entfernung von einem Block im Nether entspricht drei Blöcken in der oberirdischen Welt. + + + + Du bist jetzt im Kreativmodus. + + + + {*B*} + Drück{*CONTROLLER_VK_A*}, wenn du mehr über den Kreativmodus erfahren möchtest. {*B*} + Drück{*CONTROLLER_VK_B*}, wenn du schon alles über den Kreativmodus weißt. + + +Im Kreativmodus hast du einen unbegrenzten Vorrat aller verfügbaren Gegenstände und Blöcke, du kannst Blöcke ohne Werkzeug mit einem Klick zerstören, bist unverwundbar und kannst fliegen. + +Drücke zweimal schnell nacheinander {*CONTROLLER_ACTION_JUMP*}, um zu fliegen. Um das Fliegen zu beenden, wiederhole die Aktion. Um schneller zu fliegen, drück{*CONTROLLER_ACTION_MOVE*} beim Fliegen zweimal schnell nach vorn. +Im Flugmodus halte{*CONTROLLER_ACTION_JUMP*} nach unten gedrückt, um dich nach oben zu bewegen, und{*CONTROLLER_ACTION_SNEAK*}, um dich nach unten zu bewegen, oder verwende das Steuerkreuz, um dich nach oben, nach unten, nach links oder nach rechts zu bewegen. + +Drück{*CONTROLLER_ACTION_CRAFTING*}, um die Kreativinventar-Oberfläche zu öffnen. + +Begib dich auf die andere Seite dieses Lochs. + +Du hast jetzt das Tutorial zum Kreativmodus abgeschlossen. + + + In diesem Gebiet wurde eine Farm errichtet. Mithilfe von Landwirtschaft kannst du eine erneuerbare Quelle von Nahrung und anderen Gegenständen erschaffen. + + + + {*B*} + Drück {*CONTROLLER_VK_A*}, um mehr über Landwirtschaft zu erfahren.{*B*} + Drück {*CONTROLLER_VK_B*}, wenn du bereits alles über Landwirtschaft weißt. + + +Weizen, Kürbisse und Melonen zieht man aus Samen. Weizensamen kann man sammeln, indem man Weizen erntet oder Hohes Gras abbaut. Kürbis- und Melonensamen kann man aus Kürbissen bzw. Melonen herstellen. + +Bevor du Samen pflanzt, musst du Erdblöcke mithilfe einer Hacke in Ackerboden umwandeln. Wenn sich in der Nähe eine Wasserquelle befindet, wird sie den Ackerboden befeuchten, wodurch die Pflanzen schneller wachsen. Denselben Effekt erzielt man, indem man die Gegend permanent beleuchtet. + +Weizen durchläuft beim Wachstum mehrere Phasen. Er kann geerntet werden, wenn er dunkler aussieht.{*ICON*}59:7{*/ICON*} + +Kürbisse und Melonen benötigen einen Block Platz neben der Stelle, wo du den Samen gepflanzt hast, damit die Frucht wachsen kann, nachdem der Stängel voll ausgewachsen ist. + +Zuckerrohr muss auf einem Gras-, Erd- oder Sandblock gepflanzt werden, der sich direkt neben einem Wasserblock befindet. Wenn man einen Zuckerrohrblock entfernt, zerfallen auch alle darüber liegenden Zuckerrohrblöcke.{*ICON*}83{*/ICON*} + +Kakteen müssen auf Sand gepflanzt werden. Sie wachsen bis zu drei Blöcke hoch. Genau wie bei Zuckerrohrblock musst du nur den untersten Block zerstören, um auch die darüber liegenden Blöcke einsammeln zu können.{*ICON*}81{*/ICON*} + +Pilze solltest du in einem spärlich beleuchteten Gebiet pflanzen. Sie breiten sich auf umliegende spärlich beleuchtete Blöcke aus.{*ICON*}39{*/ICON*} + +Man kann Knochenmehl verwenden, um Pflanzen schneller auswachsen zu lassen oder um Pilze zu Riesigen Pilzen wachsen zu lassen.{*ICON*}351:15{*/ICON*} + +Du hast jetzt das Tutorial zur Landwirtschaft abgeschlossen. + + + In diesem Gebiet sind Tiere untergebracht. Du kannst Tiere dazu bringen, dass sie Tierbabys produzieren. + + + +{*B*} + Drücke {*CONTROLLER_VK_A*}, um mehr über Tiere und ihre Zucht zu erfahren.{*B*} + Drücke {*CONTROLLER_VK_B*}, wenn du bereits alles über Tiere und ihre Zucht weißt. + + +Damit Tiere sich paaren, musst du sie mit dem richtigen Futter füttern, um sie in den "Liebesmodus" zu versetzen. + +Füttere eine Kuh, eine Pilzkuh oder ein Schaf mit Weizen, ein Schwein mit Karotten, ein Huhn mit Weizensamen bzw. Netherwarzen oder einen Wolf mit beliebigem Fleisch und schon ziehen sie los und suchen in der Nähe nach einem anderen Tier derselben Gattung, das auch im Liebesmodus ist. + +Wenn sich zwei Tiere derselben Gattung begegnen und beide im Liebesmodus sind, küssen sie sich für ein paar Sekunden und dann erscheint ein Babytier. Das Babytier folgt seinen Eltern für eine Weile, bevor es zu einem ausgewachsenen Tier heranwächst. + +Nachdem ein Tier im Liebesmodus war, dauert es fünf Minuten, bis das Tier den Liebesmodus erneut annehmen kann. + +Manche Tiere folgen dir, wenn du ihr Futter in deiner Hand hältst. Das erleichtert es, Tiere zu Gruppen zu versammeln, um die Paarung zu erleichtern.{*ICON*}296{*/ICON*} + + + Gib wilden Wölfen Knochen, um sie zu zähmen. Wenn sie gezähmt sind, erscheinen Liebesherzen um sie herum. Gezähmte Wölfe folgen dir und verteidigen dich, wenn ihnen nicht befohlen wurde, Sitz zu machen. + + +Du hast jetzt das Tutorial zu Tieren und ihrer Zucht abgeschlossen. + + + In dieser Gegend gibt es Kürbisse und Blöcke, um einen Schneegolem und einen Eisengolem zu erstellen. + + + + {*B*} + Drück {*CONTROLLER_VK_A*}, um mehr über Golems zu erfahren.{*B*} + Drück {*CONTROLLER_VK_B*}, wenn du bereits alles über Golems weißt. + + +Du erstellst Golems, indem du einen Kürbis auf einen Stapel Blöcke legst. + +Schneegolems bestehen aus zwei aufeinanderliegenden Schneeblöcken mit einem Kürbis darauf. Schneegolems bewerfen deine Feinde mit Schneebällen. + +Eisengolems bestehen aus vier Eisenblöcken im gezeigten Muster mit einem Kürbis auf dem mittleren Block. Eisengolems greifen deine Feinde an. + +Eisengolems erscheinen auch auf natürliche Art, um Dörfer zu verteidigen, und greifen dich an, falls du Dorfbewohner attackierst. + +Du kannst diesen Bereich erst verlassen, wenn du das Tutorial abgeschlossen hast. + +Verschiedene Werkzeuge eignen sich verschieden gut für verschiedene Materialien. Du solltest eine Schaufel verwenden, um weiches Material wie Erde und Sand abzubauen. + +Verschiedene Werkzeuge eignen sich verschieden gut für verschiedene Materialien. Du solltest eine Axt verwenden, um Baumstämme abzuhacken. + +Verschiedene Werkzeuge eignen sich verschieden gut für verschiedene Materialien. Du solltest eine Spitzhacke verwenden, um Steine und Erz abzubauen. Möglicherweise musst du eine Spitzhacke aus besserem Material herstellen, um aus manchen Blöcken Rohstoffe gewinnen zu können. + +Manche Werkzeuge eignen sich besser, um Gegner anzugreifen. Probier zum Angreifen mal ein Schwert aus. + +Tipp: Halte {*CONTROLLER_ACTION_ACTION*}gedrückt, um mit deiner Hand oder dem Werkzeug in deiner Hand zu graben oder zu hacken. Um manche Blöcke abbauen zu können, wirst du dir ein Werkzeug anfertigen müssen. + +Das verwendete Werkzeug ist beschädigt worden. Jedes Mal, wenn du ein Werkzeug einsetzt, erhält es ein wenig Schaden, und irgendwann geht es kaputt. Die farbige Leiste unterhalb des Gegenstands in deinem Inventar zeigt seinen aktuellen Zustand an. + +Halte{*CONTROLLER_ACTION_JUMP*} gedrückt, um nach oben zu schwimmen. + +In diesem Gebiet gibt es Schienen, auf denen eine Lore steht. Um die Lore zu betreten, platzier den Cursor darauf und drück{*CONTROLLER_ACTION_USE*}. Verwende{*CONTROLLER_ACTION_USE*} auf dem Schalter, um die Lore in Bewegung zu setzen. + +In der Truhe neben dem Fluss befindet sich ein Boot. Um das Boot zu verwenden, platzier den Cursor auf Wasser und drück{*CONTROLLER_ACTION_USE*}. Verwende{*CONTROLLER_ACTION_USE*}, während du auf das Boot zeigst, um es zu betreten. + +In der Truhe neben dem Teich befindet sich eine Angel. Nimm die Angel aus der Truhe, und nimm sie in deine Hand, um sie zu verwenden. + +Dieser kompliziertere Kolbenmechanismus erzeugt eine selbstreparierende Brücke! Drück zum Aktivieren den Schalter und schau dir dann an, wie die Komponenten interagieren, um alles besser zu verstehen. + +Wenn du den Cursor über den Rand der Oberfläche hinaus bewegst, während du einen Gegenstand trägst, kannst du den Gegenstand ablegen. + +Du hast nicht alle Zutaten, die du brauchst, um diesen Gegenstand herzustellen. Das Feld unten links zeigt dir die benötigten Zutaten an. + + + Glückwunsch, du hast das Tutorial abgeschlossen. Die Spielzeit vergeht jetzt mit normaler Geschwindigkeit, und du hast nicht mehr viel Zeit, bis die Nacht hereinbricht und Monster auftauchen! Stell deinen Unterstand fertig! + + +{*EXIT_PICTURE*} Wenn du bereit bist, dich weiter umzusehen, gibt es in der Nähe des Unterstands der Minenarbeiter eine Treppe, die zu einer kleinen Burg führt. + +Erinnerung: + +]]> + +Mit der aktuellen Version wurden dem Spiel neue Features hinzugefügt, darunter neue Gebiete in der Tutorial-Welt. + +{*B*}Drück{*CONTROLLER_VK_A*}, um das Tutorial ganz normal zu spielen.{*B*} + Drück{*CONTROLLER_VK_B*}, um das Haupt-Tutorial zu überspringen. + +In diesem Gebiet gibt es Bereiche, in denen du mehr über das Angeln, Boote, Kolben und Redstone erfahren kannst. + +Außerhalb dieses Gebiets findest du Beispiele für Gebäude, Landwirtschaft, Loren und Schienen sowie zum Verzaubern, Brauen, Handeln, Schmieden und noch einiges mehr! + + + Deine Hungerleiste ist so weit geleert, dass du dich nicht mehr regenerieren kannst. + + + + {*B*} + Drück{*CONTROLLER_VK_A*}, um mehr über die Hungerleiste und die Nahrungsaufnahme zu erfahren.{*B*} + Drück{*CONTROLLER_VK_B*}, wenn du schon alles über die Hungerleiste und die Nahrungsaufnahme weißt. + + + + 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 + +Zurück + +Verlassen + +Abbrechen + +Beitritt abbrechen + +Speichergerät auswählen + +Gerät wechseln + +Onlinespiele aktualisieren + +Partyspiele + +Alle Spiele + +Gruppe wechseln + +Inventar + +Beschreibg. + +Zutaten + +Crafting + +Erschaffen + +Nehmen/Ablegen + +Nehmen + +Alles nehmen + +Hälfte nehmen + +Platzieren + +Alles platzieren + +Eins platzieren + +Ablegen + +Alles ablegen + +Eins ablegen + +Tauschen + +Verschieben + +Schnellauswahl leeren + +Was ist das? + +Auf Facebook teilen + +Filter ändern + +Spielerkarte + +Spielerprofil ansehen + +Freundschaftsanfrage + +Seite runter + +Seite hoch + +Weiter + +Zurück + +Spieler ausschließen + +Färben + +Abbauen + +Füttern + +Zähmen + +Heilen + +Sitz + +Folge mir + +Auswerfen + +Leeren + +Sattel + +Platzieren + +Treffen + +Melken + +Sammeln + +Essen + +Schlafen + +Aufwachen + +Spielen + +Reiten + +Segeln + +Anbauen + +Hochschwimmen + +Öffnen + +Tonhöhe ändern + +Explodieren + +Lesen + +Hängen + +Werfen + +Pflanzen + +Umgraben + +Ernten + +Weiter + +Vollständiges Spiel freischalten + +Spielstand löschen + +Löschen + +Optionen + +Xbox Live Party Einladung + +Freunde einladen + +Annehmen + +Schere + +Level sperren + +Skin auswählen + +Anzünden + +Navigieren + +Vollständiges Spiel installieren + +Testversion installieren + +Installieren + +Neu installieren + +Speicheroptionen + +Kommando ausführen + +Kreativ + +Zutat verschieben + +Brennstoff verschieben + +Beweg-Werkzeug + +Rüstung bewegen + +Waffe bewegen + +Verwenden + +Ziehen + +Loslassen + +Privilegien + +Blocken + +Seite hoch + +Seite runter + +Liebesmodus + +Trinken + +Drehen + +Ausblenden + +Spielstand für Xbox One hochladen + +Alle Slots leeren + +Spielstand für Xbox One hochladen + +Aufsteigen + +Absteigen + +Truhe befestigen + +Starten + +Festbinden + +Losbinden + +Befestigen + +Name + +OK + +Abbrechen + +Minecraft Store + +Möchtest du dieses Spiel wirklich verlassen und dem neuen beitreten? Dabei gehen nicht gespeicherte Fortschritte verloren. + +Spiel verlassen + +Spiel speichern + +Verlassen ohne Speichern + +Willst du wirklich mit der aktuellen Version dieser Welt alle früheren Speicherdateien für diese Welt überschreiben? + +Möchtest du wirklich ohne Speichern aufhören? Du verlierst dabei alle Fortschritte in dieser Welt! + +Spiel starten + +Wenn du eine Welt im Kreativmodus erstellst, lädst oder speicherst, sind in dieser Welt Erfolge und Bestenlisten-Aktualisierungen deaktiviert, selbst wenn sie später im Überlebensmodus geladen wird. Möchtest du wirklich fortfahren? + +Diese Welt wurde früher im Kreativmodus gespeichert, Erfolge und Bestenlisten-Aktualisierungen sind deaktiviert. Möchtest du wirklich fortfahren? + +Diese Welt wurde im Kreativmodus gespeichert, Erfolge und Bestenlisten-Aktualisierungen sind deaktiviert. + +Wenn du eine Welt mit aktivierten Hostprivilegien erstellst, lädst oder speicherst, sind in diese Welt Erfolge und Bestenlisten-Aktualisierungen deaktiviert, selbst wenn sie später ohne diese Privilegien geladen wird. Möchtest du wirklich fortfahren? + +Datei beschädigt + +Diese Speicherdatei ist ungültig oder beschädigt. Möchtest du sie löschen? + +Möchtest du wirklich zum Hauptmenü zurückkehren und alle Spieler vom Spiel trennen? Dabei gehen nicht gespeicherte Fortschritte verloren. + +Verlassen und speichern + +Verlassen ohne speichern + +Möchtest du das Spiel wirklich verlassen und zum Hauptmenü zurückkehren? Dabei gehen nicht gespeicherte Fortschritte verloren. + +Möchtest du das Spiel wirklich verlassen und zum Hauptmenü zurückkehren? Dabei geht dein Fortschritt verloren! + +Neue Welt erschaffen + +Tutorial spielen + +Tutorial + +Benenne deine Welt + +Gib einen Namen für deine Welt ein. + +Gib den Seed fürs Erstellen deiner Welt ein + +Gespeicherte Welt laden + +Drück START, um dem Spiel beizutreten + +Spiel verlassen + +Es ist ein Fehler aufgetreten. Zurück zum Hauptmenü. + +Fehler beim Herstellen der Verbindung + +Verbindung verloren. + +Die Verbindung zum Server wurde unterbrochen. Zurück zum Hauptmenü. + +Die Verbindung zu Xbox Live wurde unterbrochen. Zurück zum Hauptmenü. + +Die Verbindung zu Xbox Live wurde unterbrochen. + +Die Verbindung zum Server wurde getrennt. + +Du wurdest aus dem Spiel ausgeschlossen. + +Du wurdest wegen Fliegens aus dem Spiel ausgeschlossen. + +Verbindungsversuch dauert zu lange. + +Der Server ist voll. + +Der Host hat das Spiel verlassen. + +Du kannst diesem Spiel nicht beitreten, da du mit niemandem in diesem Spiel befreundet bist. + +Du kannst diesem Spiel nicht beitreten, da du vom Host aus dem Spiel ausgeschlossen wurdest. + +Du kannst diesem Spiel nicht beitreten, da der Spieler, zu dem du zu gelangen versuchst, eine ältere Spielversion verwendet. + +Du kannst diesem Spiel nicht beitreten, da der Spieler, zu dem du zu gelangen versuchst, eine neuere Spielversion verwendet. + +Neue Welt + +Preis freigeschaltet! + +Hurra - du hast ein Spielerbild mit Steve von Minecraft gewonnen! + +Hurra - du hast ein Spielerbild mit einem Creeper gewonnen! + +Hurra – du hast einen Avatar-Gegenstand gewonnen – ein Minecraft: Xbox 360 Edition-T-Shirt! +Geh zur Xbox Steuerung, um es deinem Avatar anzuziehen! + +Hurra – du hast einen Avatar-Gegenstand gewonnen – eine Minecraft: Xbox 360 Edition-Uhr! +Geh zur Xbox Steuerung, um sie deinem Avatar anzulegen! + +Hurra – du hast einen Avatar-Gegenstand gewonnen – eine Creeper-Basecap! +Geh zur Xbox Steuerung, um sie deinem Avatar aufzusetzen! + +Hurra – du hast das Minecraft: Xbox 360 Edition-Design gewonnen! +Geh zur Xbox Steuerung, um dieses Design auszuwählen! + +Vollständiges Spiel freischalten + +Du spielst die Testversion, kannst deinen Spielstand aber nur im vollständigen Spiel speichern. +Möchtest du jetzt das vollständige Spiel freischalten? + +Dies ist die Testversion von Minecraft: Xbox 360 Edition. Würdest du das vollständige Spiel besitzen, hättest du dir gerade einen Erfolg verdient! +Jetzt das vollständige Spiel freischalten? + +Dies ist die Testversion von Minecraft: Xbox 360 Edition. Würdest du das vollständige Spiel besitzen, hättest du dir gerade eine Avatar-Auszeichnung verdient! +Jetzt das vollständige Spiel freischalten? + +Dies ist die Testversion von Minecraft: Xbox 360 Edition. Würdest du das vollständige Spiel besitzen, hättest du dir gerade ein Spielerbild verdient! +Jetzt das vollständige Spiel freischalten? + +Dies ist die Testversion von Minecraft: Xbox 360 Edition. Würdest du das vollständige Spiel besitzen, hättest du dir gerade ein Design verdient! +Jetzt das vollständige Spiel freischalten? + +Dies ist die Testversion von Minecraft: Xbox 360 Edition. Du brauchst das vollständige Spiel, um diese Einladung anzunehmen. +Möchtest du das vollständige Spiel freischalten? + +Gastspieler können das vollständige Spiel nicht freischalten. Melde dich mit einer Xbox Live-Benutzer-ID an. + +Bitte warten + +Keine Ergebnisse + +Filter: + +Freunde + +Meine Punkte + +Insgesamt + +Einträge: + +Rang + +Gamertag + +Vorbereiten fürs Speichern des Levels + +Teile werden vorbereitet ... + +Wird finalisiert ... + +Gelände bauen + +Welt simulieren + +Server initialisieren + +Startbereich generieren + +Startbereich laden + +Nether betreten + +Nether verlassen + +Erneut erscheinen + +Level generieren + +Level laden + +Spieler speichern + +Mit dem Host verbinden + +Gelände herunterladen + +Wechsel in den Offline-Modus. + +Warte bitte, bis der Host das Spiel gespeichert hat. + +Das ENDE betreten + +Das ENDE verlassen + +Seed für den Weltengenerator finden + +Dieses Bett ist belegt. + +Du kannst nur nachts schlafen. + +%s schläft in einem Bett. Um zum Sonnenaufgang vorzuspringen, müssen alle Spieler gleichzeitig in Betten schlafen. + +Dein Bett fehlt oder ist versperrt. + +Du kannst dich jetzt nicht ausruhen, es sind Monster in der Nähe. + +Du schläfst in einem Bett. Um zum Sonnenaufgang zu wechseln, müssen alle Spieler gleichzeitig schlafen. + +Werkzeuge und Waffen + +Waffen + +Nahrung + +Strukturen + +Rüstung + +Mechanismen + +Transport + +Dekorationen + +Blöcke bauen + +Redstone & Transport + +Verschiedenes + +Brauen + +Brauen + +Werkzeuge, Waffen & Rüstungen + +Materialien + +Abgemeldet + +Du bist zum Titelbildschirm zurückgekehrt, weil dein Spielerprofil abgemeldet wurde. + +Schwierigkeit + +Musik + +Sound + +Gamma + +Spielempfindlichkeit + +Menüempfindlichkeit + +Friedlich + +Leicht + +Normal + +Schwierig + +In diesem Modus regeneriert sich deine Gesundheit mit der Zeit, und es gibt keine Gegner in der Welt. + +In diesem Modus erscheinen Gegner in der Umgebung, sie fügen dem Spieler aber weniger Schaden zu als im normalen Modus. + +In diesem Modus erscheinen Gegner in der Umgebung und fügen dem Spieler eine normale Menge Schaden zu. + +In diesem Modus erscheinen Gegner in der Umgebung und fügen dem Spieler eine große Menge Schaden zu. Achte auch auf die Creeper, sie brechen ihren Explosionsangriff nicht ab, wenn du dich von ihnen entfernst! + +Testversion abgelaufen + +Du hast die Testversion von Minecraft: Xbox 360 Edition die maximal erlaubte Zeit lang gespielt! Möchtest du jetzt das vollständige Spiel freischalten, um weiterhin Minecraft spielen zu können? + +Spiel voll + +Fehler beim Spielbeitritt, da keine Plätze mehr frei sind. + +Schildtext eingeben + +Gib eine Textzeile für dein Schild ein. + +Titel eingeben + +Gib einen Titel für deinen Beitrag ein. + +Überschrift eingeben + +Gib eine Überschrift für deinen Beitrag ein. + +Beschreibung eingeben + +Gib eine Beschreibung für deinen Beitrag ein. + +Inventar + +Zutaten + +Braustand + +Truhe + +Verzaubern + +Ofen + +Zutat + +Brennstoff + +Dispenser + +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. + +%s hat das Spiel verlassen. + +%s wurde aus dem Spiel ausgeschlossen. + +Möchtest du diesen Spielstand wirklich löschen? + +Wird genehmigt ... + +Zensiert + +Jetzt wird gespielt: + +Einstellungen zurücksetzen + +Möchtest du deine Einstellungen wirklich auf die Standardwerte zurücksetzen? + +Ladefehler + +Minecraft: Xbox 360 Edition konnte nicht geladen werden und kann daher nicht fortgesetzt werden. + +Spiel von %s + +Unbekanntes Hostspiel + +Gast abgemeldet + +Ein Gastspieler hat sich abgemeldet, dadurch wurden alle Gastspieler aus dem Spiel entfernt. + +Anmelden + +Du bist derzeit nicht angemeldet. Du musst angemeldet sein, um dieses Spiel zu spielen. Möchtest du dich jetzt anmelden? + +Multiplayer nicht möglich + +Beitritt zum Spiel nicht möglich: Einer oder mehrere Spieler haben keine Multiplayer-Berechtigung für Xbox Live. + +Erstellen des Online-Spiels nicht möglich: Einer oder mehrere Spieler haben keine Multiplayer-Berechtigung für Xbox Live. Deaktiviere die Option "Onlinespiel", um offline zu spielen. + +Du kannst dieser Spielsitzung nicht beitreten, weil deine Rechteeinstellung für Inhalte von Mitgliedern zu streng ist. Ändere diese Einstellung bitte unter den Datenschutz- und Onlineeinstellungen in der Xbox Steuerung, wenn du dieser Sitzung beitreten möchtest. + +Du kannst dieser Spielsitzung nicht beitreten, weil die Rechteeinstellung für Inhalte von Mitgliedern eines deiner lokalen Spieler zu streng ist. + +Du kannst dieser Spielsitzung nicht beitreten, weil die Rechteeinstellung für Inhalte von Mitgliedern eines Spielers in der Sitzung "Nur Freunde" ist und du nicht auf seiner Freundesliste bist. + +Fehler beim Erstellen des Spiels + +Du kannst diese Spielsitzung nicht erstellen, weil die Rechteeinstellung für Inhalte von Mitgliedern eines deiner lokalen Spieler zu streng ist. Entferne die Markierung bei "Online-Spiel", um ein Offline-Spiel zu starten, oder ändere diese Einstellung unter den Datenschutz- und Onlineeinstellungen in der Xbox Steuerung. + +Automatisch ausgewählt + +Kein Paket: Standard-Skins + +Skin-Favoriten + +Gesperrter Level + +Das Spiel, dem du beitrittst, steht auf deiner Liste gesperrter Level. +Wenn du dem Spiel beitrittst, wird der Level von deiner Liste gesperrter Level entfernt. + +Diesen Level sperren? + +Möchtest du diesen Level wirklich deiner Liste gesperrter Level hinzufügen? +Wenn du OK auswählst, verlässt du dieses Spiel. + +Von Liste gesperrter Level entfernen + +Intervall für automatisches Speichern + +Speicherintervall: AUS + +Min + +Kann hier nicht platziert werden! + +Das Platzieren von Lava neben dem Wiedereintrittspunkt ist nicht gestattet, das sonst Spieler beim Wiedereintritt in den Level sofort sterben könnten. + +Dieses Spiel verfügt eine automatische Levelspeicherfunktion. Wenn du das obige Symbol siehst, speichert das Spiel deine Daten. +Bitte schalte deine Xbox 360 Konsole nicht aus, solange dieses Symbol angezeigt wird. + +Oberflächen-Undurchsichtigkeit + +Autospeichern des Levels wird vorbereitet + +Displaygröße + +Displaygröße (geteilter Bildschirm) + +Seed + +Skinpaket freischalten + +Um die ausgewählte Skin zu verwenden, musst du dieses Skinpaket freischalten. +Möchtest du dieses Skinpaket jetzt freischalten? + +Texturpaket freischalten + +Du musst das Texturpaket freischalten, um es für deine Welt zu verwenden. +Möchtest du es jetzt freischalten? + +Texturpaket-Testversion + +Du verwendest nun eine Testversion des Texturpakets. Du kannst diese Welt erst speichern, wenn du die Vollversion freischaltest. +Möchtest du die Vollversion des Texturpakets freischalten? + +Texturpaket nicht verfügbar + +Vollversion freischalten + +Testversion herunterladen + +Vollversion herunterladen + +Diese Welt verwendet ein Mash-up-Paket oder Texturpaket, das dir fehlt! +Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? + +Testversion holen + +Vollständiges Spiel holen + +Spieler ausschließen + +Möchtest du diesen Spieler wirklich aus dem Spiel ausschließen? Er wird bis zum Neustart der Welt dem Spiel nicht mehr beitreten können. + +Spielerbilder-Paket + +Themen + +Skinpaket + +Freunde von Freunden zulassen + +Du kannst diesem Spiel nicht beitreten, da es auf Spieler beschränkt wurde, die mit dem Host befreundet sind. + +Spielbeitritt nicht möglich + +Ausgewählt + +Ausgewählte Skin: + +Inhalte zum Herunterladen def. + +Diese Inhalte zum Herunterladen sind beschädigt und können nicht verwendet werden. Du musst sie löschen und dann vom Menü "Minecraft Store" aus neu installieren. + +Einige deiner Inhalte zum Herunterladen sind beschädigt und können nicht verwendet werden. Du musst sie löschen und dann vom Menü "Minecraft Store" aus neu installieren. + +Dein Spielmodus wurde geändert. + +Welt umbenennen + +Gib den neuen Namen für deine Welt ein. + +Spielmodus: Überleben + +Spielmodus: Kreativ + +Spielmodus: Abenteuer + +Überleben + +Kreativ + +Abenteuer + +Im Überlebensmodus + +Im Kreativmodus + +Wolken erstellen + +Was möchtest du mit diesem Spielstand tun? + +Spielstand umbenennen + +Automatisches Speichern in %d ... + +Ein + +Aus + +Normal + +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. + +Wenn dies aktiviert ist, können nur Freunde von Leuten auf deiner Freundesliste dem Spiel beitreten. + +Aktiviert, dass Spieler sich gegenseitig Schaden zufügen können. Hat nur Einfluss auf den Überlebensmodus. + +Wenn deaktiviert, können Spieler, die dem Spiel beitreten, nicht bauen oder abbauen, bis sie autorisiert wurden. + +Aktiviert, dass Feuer auf brennbare Blöcke in der Nähe übergreifen kann. + +Aktiviert, dass aktiviertes TNT explodieret. + +Aktiviert, dass der Host das Fliegen nutzen, Erschöpfung deaktivieren und sich selbst im Spielmenü unsichtbar machen kann. Deaktiviert Erfolge und Bestenlisten-Aktualisierungen. + +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. + +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. + +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 + +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*} 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 + +Display anzeigen + +Hand anzeigen + +Gamertags auf geteiltem Bildschirm + +Todesmeldungen + +Animierte Spielfigur + +Eigene Skin-Animation + +Du kannst nicht mehr graben und keine Gegenstände mehr verwenden. + +Du kannst jetzt graben und Gegenstände verwenden. + +Du kannst keine Blöcke mehr platzieren. + +Du kannst jetzt Blöcke platzieren. + +Du kannst jetzt Türen und Schalter verwenden. + +Du kannst keine Türen und Schalter mehr verwenden. + +Du kannst jetzt Container (z. B. Truhen) verwenden. + +Du kannst keine Container (z. B. Truhen) mehr verwenden. + +Du kannst keine NPCs mehr angreifen. + +Du kannst jetzt NPCs angreifen. + +Du kannst keine Spieler mehr angreifen. + +Du kannst jetzt Spieler angreifen. + +Du kannst keine Tiere mehr angreifen. + +Du kannst jetzt Tiere angreifen. + +Du bist jetzt ein Moderator. + +Du bist kein Moderator mehr. + +Du kannst jetzt fliegen. + +Du kannst nicht mehr fliegen. + +Du wirst keine Erschöpfung mehr spüren. + +Du wirst jetzt wieder Erschöpfung spüren. + +Du bist jetzt unsichtbar. + +Du bist nicht mehr unsichtbar. + +Du bist jetzt unverwundbar. + +Du bist nicht mehr unverwundbar. + +%d MSP + +Enderdrache + +%s hat das Ende betreten. + +%s hat das Ende verlassen. + + +{*C3*}Ich sehe das spielende Wesen, das du meinst.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}?{*EF*}{*B*}{*B*} +{*C3*}Ja. Sei auf der Hut. Es hat eine höhere Stufe erreicht. Es kann unsere Gedanken lesen.{*EF*}{*B*}{*B*} +{*C2*}Das ist gleichgültig. Es denkt, wir gehören zum Spiel.{*EF*}{*B*}{*B*} +{*C3*}Ich mag dieses spielende Wesen. Es hat gut gespielt. Es hat nicht aufgegeben.{*EF*}{*B*}{*B*} +{*C2*}Es liest unsere Gedanken, als wären sie Worte auf einem Bildschirm.{*EF*}{*B*}{*B*} +{*C3*}So stellt es sich vielerlei Dinge vor, wenn es sich tief im Traum eines Spiels befindet.{*EF*}{*B*}{*B*} +{*C2*}Worte sind eine wunderbare Schnittstelle. Äußerst flexibel. Und weniger furchteinflößend, als auf die Realität hinter dem Bildschirm zu starren.{*EF*}{*B*}{*B*} +{*C3*}Früher haben sie Stimmen gehört. Eher die spielenden Wesen lesen konnten. Damals, als jene, die nicht spielten, die spielenden Wesen als Hexen und Hexer beschimpften. Und die spielenden Wesen träumten, sie flögen durch die Luft, auf Stöcken, die von Dämonen angetrieben waren.{*EF*}{*B*}{*B*} +{*C2*}Was hat dieses spielende Wesen geträumt?{*EF*}{*B*}{*B*} +{*C3*}Dieses spielende Wesen hat von Sonnenlicht und Bäumen geträumt. Von Feuer und Wasser. Es hat davon geträumt, etwas zu erschaffen. Und es hat davon geträumt zu zerstören. Es hat davon geträumt zu jagen und gejagt zu werden. Es hat von einem Unterschlupf geträumt.{*EF*}{*B*}{*B*} +{*C2*}Ha, die ursprüngliche Schnittstelle. Eine Million Jahre alt, und doch funktioniert sie immer noch. Aber welche Struktur hat dieses spielende Wesen wirklich geschaffen, in der Realität jenseits des Bildschirms?{*EF*}{*B*}{*B*} +{*C3*}Es hat, zusammen mit Millionen anderen, daran gearbeitet, eine wahre Welt in einer Falte des {*EF*}{*NOISE*}{*C3*} zu bauen und erschuf eine{*EF*}{*NOISE*}{*C3*} für {*EF*}{*NOISE*}{*C3*}, in der {*EF*}{*NOISE*}{*C3*}.{*EF*}{*B*}{*B*} +{*C2*}Es kann diesen Gedanken nicht lesen.{*EF*}{*B*}{*B*} +{*C3*}Nein. Es hat die höchste Stufe noch nicht erreicht. Diese muss es im langen Traum des Lebens erreichen, nicht im kurzen Traum eines Spiels.{*EF*}{*B*}{*B*} +{*C2*}Weiß es, dass wir es lieben? Dass das Universum gütig ist?{*EF*}{*B*}{*B*} +{*C3*}Manchmal hört es, durch den Lärm seiner Gedanken hindurch, das Universum, ja.{*EF*}{*B*}{*B*} +{*C2*}Aber bisweilen ist es auch traurig, im langen Traum. Es erschafft Welten, in denen es keinen Sommer gibt, und es zittert unter einer schwarzen Sonne. Und es hält seine erbärmliche Schöpfung für die Wirklichkeit.{*EF*}{*B*}{*B*} +{*C3*}Es vom Kummer zu erlösen, würde es zerstören. Der Kummer ist Teil seiner eigenen, ganz privaten Aufgabe. Da können wir uns nicht einmischen.{*EF*}{*B*}{*B*} +{*C2*}Manchmal, wenn sie sich in den Tiefen der Träume befinden, möchte ich ihnen sagen, dass sie echte Welten in der Realität bauen. Manchmal möchte ich ihnen mitteilen, wie wichtig sie dem Universum sind. Manchmal, wenn sie schon eine Weile keine richtige Verbindung mehr aufgebaut haben, möchte ich ihnen helfen, das Wort auszusprechen, das sie fürchten.{*EF*}{*B*}{*B*} +{*C3*}Es liest unsere Gedanken.{*EF*}{*B*}{*B*} +{*C2*}Manchmal ist es mir gleichgültig. Manchmal möchte ich es ihnen sagen: Diese Welt, die ihr für die Wahrheit haltet, ist lediglich {*EF*}{*NOISE*}{*C2*} und {*EF*}{*NOISE*}{*C2*}, ich möchte ihnen sagen, dass sie {*EF*}{*NOISE*}{*C2*} in der {*EF*}{*NOISE*}{*C2*} sind. Sie sehen so wenig von der Realität in ihrem langen Traum.{*EF*}{*B*}{*B*} +{*C3*}Und dennoch spielen sie das Spiel.{*EF*}{*B*}{*B*} +{*C2*}Aber es wäre so leicht, es ihnen zu sagen ...{*EF*}{*B*}{*B*} +{*C3*}Zu stark für diesen Traum. Ihnen zu sagen, wie sie leben sollen, würde sie davon abhalten zu leben.{*EF*}{*B*}{*B*} +{*C2*}Ich werde dem spielenden Wesen nicht sagen, wie es leben soll.{*EF*}{*B*}{*B*} +{*C3*}Das spielende Wesen wird langsam ungeduldig.{*EF*}{*B*}{*B*} +{*C2*}Ich werde dem spielenden Wesen eine Geschichte erzählen.{*EF*}{*B*}{*B*} +{*C3*}Aber nicht die Wahrheit.{*EF*}{*B*}{*B*} +{*C2*}Nein. Eine Geschichte, in der die Wahrheit sicher aufgehoben ist, in einem Käfig aus Worten. Nicht die nackte Wahrheit, die aus beliebiger Entfernung Feuer entzünden kann.{*EF*}{*B*}{*B*} +{*C3*}Ihm einen neuen Körper geben.{*EF*}{*B*}{*B*} +{*C2*}Ja. Spielendes Wesen ...{*EF*}{*B*}{*B*} +{*C3*}Benutze seinen Namen.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}. Wesen, das Spiele spielt.{*EF*}{*B*}{*B*} +{*C3*}Gut.{*EF*}{*B*}{*B*} + + + +{*C2*}Atme jetzt tief ein. Atme noch einmal ein. Fühle die Luft in deine Lungen strömen. Lass deine Gliedmaßen aufwachen. Ja, bewege die Finger. Erhalte einen Körper zurück, in der Schwerkraft, in der Luft. Erscheine erneut im langen Traum. Da bist du nun. Dein Körper berührt das Universum wieder, an jedem Punkt, als würdet ihr getrennt existieren. Als würden wir getrennt existieren.{*EF*}{*B*}{*B*} +{*C3*}Wer sind wir? Einst nannte man uns den Geist des Berges. Vater Sonne, Mutter Mond. Uralte Geister, Tiergeister. Dschinnen. Gespenster. Grüne Männchen. Dann Götter, Dämonen. Engel. Poltergeister. Aliens, Außerirdische. Leptonen, Quarks. Die Worte ändern sich. Wir ändern uns nicht.{*EF*}{*B*}{*B*} +{*C2*}Wir sind das Universum. Wir sind alles, von dem du denkst, dass es nicht du sei. Du siehst uns jetzt an, durch deine Haut und deine Augen. Und wieso berührt das Universum deine Haut und wirft Licht auf dich? Um dich zu sehen, spielendes Wesen. Um dich zu kennen. Und um selbst gekannt zu werden. Ich werde dir eine Geschichte erzählen.{*EF*}{*B*}{*B*} +{*C2*}Es war einmal ein spielendes Wesen.{*EF*}{*B*}{*B*} +{*C3*}Dieses spielende Wesen warst du, {*PLAYER*}.{*EF*}{*B*}{*B*} +{*C2*}Manchmal hielt es sich für einen Menschen, auf der dünnen Kruste einer sich drehenden Kugel aus geschmolzenem Gestein. Dieser Globus aus flüssigem Fels drehte sich um einen Ball aus brennendem Gas, der dreihundertdreißigtausendmal so viel Masse besaß wie er selbst. Sie waren so weit voneinander entfernt, dass das Licht acht Minuten benötigte, um die Strecke zurückzulegen. Das Licht war Information von einem Stern, und es konnte deine Haut aus einer Entfernung von hundertfünfzig Millionen Kilometer verbrennen.{*EF*}{*B*}{*B*} +{*C2*}Manchmal träumte das spielende Wesen, es wäre ein Bergarbeiter, auf der Oberfläche einer Welt, die flach und unendlich war. Die Sonne war ein weißes Quadrat. Die Tage waren kurz, es gab viel zu tun, und der Tod war ein vorübergehendes Ärgernis.{*EF*}{*B*}{*B*} +{*C3*}Manchmal träumte das spielende Wesen, es hätte sich in einer Geschichte verirrt.{*EF*}{*B*}{*B*} +{*C2*}Manchmal träumte das spielende Wesen, es wäre etwas anderes, an anderen Orten. Manchmal waren diese Träume beunruhigend. Manchmal wirklich wunderschön. Manchmal erwachte das spielende Wesen aus einem Traum und glitt in einen anderen hinein, und aus diesem in einen dritten.{*EF*}{*B*}{*B*} +{*C3*}Manchmal träumte das spielende Wesen, es würde Worte auf einem Bildschirm betrachten.{*EF*}{*B*}{*B*} +{*C2*}Aber nun zurück.{*EF*}{*B*}{*B*} +{*C2*}Die Atome des spielenden Wesens waren im Gras verstreut, in den Flüssen, in der Luft, im Boden. Eine Frau sammelte die Atome; sie trank und aß und atmete ein; und die Frau setzte das spielende Wesen in ihrem Körper zusammen.{*EF*}{*B*}{*B*} +{*C2*}Und das spielende Wesen erwachte, aus der warmen, dunklen Welt des Körpers seiner Mutter, in den langen Traum hinein.{*EF*}{*B*}{*B*} +{*C2*}Und das spielende Wesen war eine neue Geschichte, die noch nie zuvor erzählt worden war, in den Buchstaben der DNA geschrieben. Und das spielende Wesen war ein neues Programm, das noch nie zuvor ausgeführt worden war, von einem Source-Code erzeugt, der eine Milliarde Jahre alt war. Und das spielende Wesen war ein neuer Mensch, der noch nie lebendig gewesen war, aus nichts als Milch und Liebe erschaffen.{*EF*}{*B*}{*B*} +{*C3*}Du bist das spielende Wesen. Die Geschichte. Das Programm. Der Mensch. Aus nichts als Milch und Liebe erschaffen.{*EF*}{*B*}{*B*} +{*C2*}Gehen wir nun noch weiter zurück.{*EF*}{*B*}{*B*} +{*C2*}Die sieben Milliarden Milliarden Milliarden Atome des Körpers des spielenden Wesens wurden lange vor diesem Spiel im Herzen eines Sterns erschaffen. Also repräsentiert auch das spielende Wesen Information aus einem Stern. Und das spielende Wesen bewegt sich durch eine Geschichte, die einen Wald aus Informationen darstellt, von einem Mann namens Julian gepflanzt, in einer flachen, unendlichen Welt, die von einem Mann namens Markus erschaffen wurde, die wiederum innerhalb einer kleinen, privaten Welt existiert, die vom spielenden Wesen erschaffen wurde, das ein Universum bewohnt, erschaffen von ...{*EF*}{*B*}{*B*} +{*C3*}Pssst. Manchmal erschuf das spielende Wesen eine kleine, private Welt, die weich war, warm und einfach. Manchmal war sie hart und kalt und kompliziert. Manchmal baute es ein Modell des Universums in seinem Kopf; Flecken aus Energie, die sich durch weite, leere Räume bewegen. Manchmal nannte es diese Flecken "Elektronen" und "Protonen".{*EF*}{*B*}{*B*} + + + +{*C2*}Manchmal nannte es sie "Planeten" und "Sterne".{*EF*}{*B*}{*B*} +{*C2*}Manchmal glaubte es, es befände sich in einem Universum, das aus Energie bestand, welche wiederum aus Aus- und An-Zuständen bestand, aus Nullen und Einsen; Programmzeilen. Manchmal glaubte es, dass es ein Spiel spielte. Manchmal glaubte es, dass es Worte auf einem Bildschirm las.{*EF*}{*B*}{*B*} +{*C3*}Du bist das spielende Wesen, das die Worte liest ...{*EF*}{*B*}{*B*} +{*C2*}Pssst ... Manchmal las das spielende Wesen Programmzeilen auf einem Bildschirm. Entschlüsselte sie, um Worte zu erhalten; entschlüsselte die Worte, um deren Bedeutung zu erfahren; entschlüsselte die Bedeutung, und gewann daraus Gefühle, Emotionen, Theorien, Ideen. Und das spielende Wesen begann schneller zu atmen, tiefer zu atmen, und es erkannte, dass es am Leben war. Jene tausend Tode waren nicht reell gewesen, das spielende Wesen lebte.{*EF*}{*B*}{*B*} +{*C3*}Du. Du. Du lebst.{*EF*}{*B*}{*B*} +{*C2*}Und manchmal glaubte das spielende Wesen, das Universum habe durch das Sonnenlicht, das durch die raschelnden Blätter der sommerlichen Bäume drang, zu ihm gesprochen.{*EF*}{*B*}{*B*} +{*C3*}Und manchmal glaubte das spielende Wesen, das Universum habe durch das Licht, welches aus dem klaren Nachthimmel des Winters herabschien, zu ihm gesprochen, wo ein Lichtfleck, den das spielende Wesen aus dem Augenwinkel erhaschte, ein Stern sein könnte, dessen Masse die der Sonne um ein Millionenfaches übertrifft und der seine Planeten zu Plasma zerkocht, um für einen kurzen Moment vom spielenden Wesen wahrgenommen zu werden, das am anderen Ende des Universums nach Hause geht, plötzlich Essen riecht, kurz vor der vertrauten Tür, hinter der es bald wieder träumen wird.{*EF*}{*B*}{*B*} +{*C2*}Und manchmal glaubte das spielende Wesen, das Universum habe durch die Nullen und Einsen, durch die Elektrizität der Welt, durch die über den Bildschirm huschenden Worte am Ende eines Traumes zu ihm gesprochen.{*EF*}{*B*}{*B*} +{*C3*}Und das Universum sprach: Ich liebe dich.{*EF*}{*B*}{*B*} +{*C2*}Und das Universum sprach: Du hast gut gespielt.{*EF*}{*B*}{*B*} +{*C3*}Und das Universum sprach: Alles, was du brauchst, befindet sich in deinem Innern.{*EF*}{*B*}{*B*} +{*C2*}Und das Universum sprach: Du bist stärker, als du denkst.{*EF*}{*B*}{*B*} +{*C3*}Und das Universum sprach: Du bist das Tageslicht.{*EF*}{*B*}{*B*} +{*C2*}Und das Universum sprach: Du bist die Nacht.{*EF*}{*B*}{*B*} +{*C3*}Und das Universum sprach: Die Finsternis, gegen die du kämpfst, befindet sich in deinem Innern.{*EF*}{*B*}{*B*} +{*C2*}Und das Universum sprach: Das Licht, nach dem du trachtest, befindet sich in deinem Innern.{*EF*}{*B*}{*B*} +{*C3*}Und das Universum sprach: Du bist nicht allein.{*EF*}{*B*}{*B*} +{*C2*}Und das Universum sprach: Du existierst nicht getrennt von allem anderen.{*EF*}{*B*}{*B*} +{*C3*}Und das Universum sprach: Du bist das Universum, das von sich selbst kostet, das mit sich selbst spricht und seinen eigenen Code liest.{*EF*}{*B*}{*B*} +{*C2*}Und das Universum sprach: Ich liebe dich, denn du bist die Liebe.{*EF*}{*B*}{*B*} +{*C3*}Und das Spiel war vorbei und das spielende Wesen erwachte aus dem Traum. Und das spielende Wesen begann einen neuen Traum. Und das spielende Wesen träumte wieder, träumte besser. Und das spielende Wesen war das Universum. Und das spielende Wesen war Liebe.{*EF*}{*B*}{*B*} +{*C3*}Du bist das spielende Wesen.{*EF*}{*B*}{*B*} +{*C2*}Wach auf.{*EF*} + + +Nether zurücksetzen + +Möchtest du wirklich den Nether in diesem Spielstand auf den ursprünglichen Zustand zurücksetzen? Alles, was du im Nether gebaut hast, geht verloren! + +Nether zurücksetzen + +Nether nicht zurücksetzen + +Pilzkuh kann momentan nicht geschoren werden. Die Höchstanzahl von Schweinen, Schafen, Kühen, Katzen und Pferden 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. + +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 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. + +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ü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. + +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 + +Spieloptionen + +NPC-Griefing + +Inventar behalten + +NPC-Eintritt + +NPC-Beute + +Felderertrag + +Natürliche Erholung + +Tageslichtzyklus + +Kann bauen und abbauen + +Kann Türen und Schalter verwenden + +Kann Container öffnen + +Kann Spieler angreifen + +Kann Tiere angreifen + +Moderator + +Spieler ausschließen + +Kann fliegen + +Erschöpfung deaktivieren + +Unsichtbar + +Hostoptionen + +Spieler/Einladen + +Onlinespiel + +Nur mit Einladung + +Weitere Optionen + +Laden + +Neue Welt + +Weltname + +Seed für den Weltengenerator + +Freilassen für zufälligen Seed + +Spieler + +Spiel beitreten + +Spiel starten + +Keine Spiele gefunden + +Spielen + +Bestenlisten + +Erfolge + +Hilfe & Optionen + +Vollständiges Spiel freischalten + +Spiel fortsetzen + +Spiel speichern + +Schwierigkeit: + +Spieltyp: + +Gamertags: + +Strukturen: + +Leveltyp: + +PvP: + +Spielern vertrauen: + +TNT: + +Feuer breitet sich aus: + +Design neu installieren + +Spielerbild 1 neu installieren + +Spielerbild 2 neu installieren + +Avatar-Gegenstand 1 neu installieren + +Avatar-Gegenstand 2 neu installieren + +Avatar-Gegenstand 3 neu installieren + +Optionen + +Audio + +Steuerung + +Grafik + +Benutzeroberfläche + +Standardeinstellungen + +Kamerabewegung ansehen + +Tipps + +Spiel-QuickInfos + +Gamertags im Spiel + +2 Spieler auf geteiltem Bildschirm vertikal + +Fertig + +Schildnachricht ändern: + +Gib erklärende Texte zu deinem Screenshot ein. + +Überschrift + +Screenshot aus dem Spiel + +Schildnachricht ändern: + +Schau mal, was ich in Minecraft: Xbox 360 Edition erschaffen habe! + +Die klassischen Texturen, Symbole und Benutzeroberfläche aus Minecraft! + +Alle Mash-up-Welten zeigen + +Spielstandtransferslot auswählen + +Slot leeren + +Spielstand-Metadaten hochladen + +Spielstand hochladen + +Spielstand für Xbox One hochladen + +Upload abgebrochen + +Du hast den Upload dieses Spielstands in den Transferslot abgebrochen. + +Keine Effekte + +Geschwindigkeit + +Langsamkeit + +Grabeile + +Grabmüdigkeit + +Stärke + +Schwäche + +Sofortgesundheit + +Sofortschaden + +Sprungverstärkung + +Verwirrtheit + +Regeneration + +Widerstand + +Feuerwiderstand + +Wasseratmung + +Unsichtbarkeit + +Blindheit + +Nachtsicht + +Hunger + +Gift + +Dürre + +Gesundheitsbonus + +Absorption + +Sättigung + +der Geschwindigkeit + +der Langsamkeit + +der Grabeile + +der Langsamkeit + +der Stärke + +der Schwäche + +der Heilung + +des Schadens + +der Sprungverstärkung + +der Verwirrtheit + +der Regeneration + +des Widerstands + +des Feuerwiderstands + +der Wasseratmung + +der Unsichtbarkeit + +der Blindheit + +der Nachtsicht + +des Hungers + +des Gifts + +des Verfalls + +des Gesundheitsbonus + +der Absorption + +der Sättigung + + + +II + +III + +IV + +Wurf- + +Mondäner + +Uninteressanter + +Fader + +Farbloser + +Milchiger + +Diffuser + +Schlichter + +Dünner + +Seltsamer + +Flacher + +Bauchiger + +Gepfuschter + +Gebutterter + +Glatter + +Sanfter + +Gefälliger + +Dicker + +Eleganter + +Aparter + +Charmanter + +Schneidiger + +Veredelter + +Belebender + +Prickelnder + +Potenter + +Fauler + +Geruchloser + +Kräftiger + +Harscher + +Beißender + +Ekliger + +Stinkender + +Dient als Basis für alle Tränke. Wird in einem Braustand verwendet, um Tränke zu brauen. + +Hat keinen Effekt. Kann in einem Braustand verwendet werden, um durch Zugabe weiterer Zutaten Tränke zu brauen. + +Vergrößert die Bewegungsgeschwindigkeit betroffener Spieler, Tiere und Monster sowie die Sprintgeschwindigkeit, die Sprungweite und das Gesichtsfeld von Spielern. + +Verkleinert die Bewegungsgeschwindigkeit betroffener Spieler, Tiere und Monster sowie die Sprintgeschwindigkeit, die Sprungweite und das Gesichtsfeld von Spielern. + +Vergrößert den Schaden, den betroffene Spieler und Monster beim Angreifen anrichten. + +Verringert den Schaden, den betroffene Spieler und Monster beim Angreifen anrichten. + +Verbessert sofort die Gesundheit betroffener Spieler, Tiere und Monster. + +Verschlechtert sofort die Gesundheit betroffener Spieler, Tiere und Monster. + +Stellt mit der Zeit die Gesundheit von betroffenen Spielern, Tieren und Monstern wieder her. + +Macht die betroffenen Spieler, Tiere und Monster immun gegen Schaden durch Feuer, Lava und Fernangriffe von Lohen. + +Verringert mit der Zeit die Gesundheit von betroffenen Spielern, Tieren und Monstern. + +Bei Anwendung: + +Pferdesprungstärke + +Zombie-Verstärkungen + +Max. Gesundheit + +NPC-Folgereichweite + +Rückstoßwiderstand + +Geschwindigkeit + +Angriffsschaden + +Schärfe + +Bann + +Nemesis der Gliederfüßer + +Rückstoß + +Verbrennung + +Schutz + +Feuerschutz + +Federfall + +Explosionsschutz + +Schusssicher + +Atmung + +Wasseraffinität + +Effizienz + +Behutsamkeit + +Haltbarkeit + +Plünderung + +Glück + +Stärke + +Feuer + +Schlag + +Unendlichkeit + +I + +II + +III + +IV + +V + +VI + +VII + +VIII + +IX + +X + +Muss mit mindestens einer Eisenspitzhacke abgebaut werden, um Smaragde zu erhalten. + +Ähnlich wie eine Truhe, doch Gegenstände, die in eine Endertruhe gelegt werden, sind in jeder Endertruhe des Spielers verfügbar, auch in anderen Dimensionen. + +Wird aktiviert, wenn etwas oder jemand einen verbundenen Stolperdraht durchquert. + +Aktiviert einen verbundenen Stolperdrahthaken, wenn etwas oder jemand ihn durchquert. + +Eine kompakte Lagermöglichkeit für Smaragde. + +Eine Mauer aus Pflasterstein. + +Damit kann man Waffen, Werkzeuge und Rüstungen reparieren. + +Kann in einem Ofen geschmolzen werden, um Netherquarz herzustellen. + +Wird als Dekoration verwendet. + +Kann mit Dorfbewohnern gehandelt werden. + +Wird als Dekoration verwendet. Blumen, Setzlinge, Kakteen und Pilze können darin eingepflanzt werden. + +Regeneriert 2{*ICON_SHANK_01*} und kann zu einer goldenen Karotte verarbeitet werden. Kann auf Ackerland gepflanzt werden. + +Regeneriert 0,5{*ICON_SHANK_01*}. Kann in einem Ofen gebraten oder auf Ackerland gepflanzt werden. + +Regeneriert 3{*ICON_SHANK_01*}. Entsteht, wenn man eine Kartoffel im Ofen brät. + +Regeneriert 1{*ICON_SHANK_01*}, doch du kannst dich damit vergiften. + +Regeneriert 3{*ICON_SHANK_01*}. Wird aus einer Karotte und Goldnuggets hergestellt. + +Hiermit steuerst du beim Reiten auf einem gesattelten Schwein. + +Regeneriert 4{*ICON_SHANK_01*}. + +Hiermit kannst du auf einem Amboss Waffen, Werkzeuge und Rüstungen verzaubern. + +Kann von Netherquarzerz abgebaut und zu Quarzblöcken verarbeitet werden. + +Wird aus Wolle hergestellt und als Dekoration verwendet. + +Smaragd + +Blumentopf + +Karotte + +Kartoffel + +Ofenkartoffel + +Giftige Kartoffel + +Goldene Karotte + +Karottenangel + +Kürbiskuchen + +Zauberbuch + +Netherquarz + +Smaragderz + +Endertruhe + +Stolperdrahthaken + +Stolperdraht + +Smaragdblock + +Pflastersteinmauer + +Bemooste Pflastersteinmauer + +Blumentopf + +Karotten + +Kartoffeln + +Amboss + +Amboss + +Leicht beschädigter Amboss + +Schwer beschädigter Amboss + +Netherquarzerz + +Quarzblock + +Gemeißelter Quarzblock + +Säulen-Quarzblock + +Quarztreppe + +Teppich + +Schwarzer Teppich + +Roter Teppich + +Grüner Teppich + +Brauner Teppich + +Blauer Teppich + +Lila Teppich + +Cyanfarbener Teppich + +Hellgrauer Teppich + +Grauer Teppich + +Rosa Teppich + +Hellgrüner Teppich + +Gelber Teppich + +Hellblauer Teppich + +Magentafarbener Teppich + +Oranger Teppich + +Weißer Teppich + +Gemeißelter Sandstein + +Glatter Sandstein + +{*PLAYER*} wurde beim Versuch, {*SOURCE*} zu verletzen, getötet. + +{*PLAYER*} wurde von einem fallenden Amboss erschlagen. + +{*PLAYER*} wurde von einem fallenden Block erschlagen. + +{*PLAYER*} zu {*DESTINATION*} teleportiert. + +{*PLAYER*} hat dich zu sich teleportiert. + +{*PLAYER*} ist zu dir teleportiert. + +Dornen + +Quarzstufe + +Lässt dunkle Stellen taghell erscheinen, auch unter Wasser. + +Macht betroffene Spieler, Tiere und Monster unsichtbar. + +Reparieren & benennen + +Verzauberungskosten: %d + +Zu teuer! + +Umbenennen + +Du hast: + +Benötigte Handelsgüter + +{*VILLAGER_TYPE*} bietet: %s + +Reparieren + +Handeln + +Halsband einfärben + + + Dies ist das Ambossmenü, über das du Waffen, Rüstungen und Werkzeuge für Erfahrungspunkte umbenennen, reparieren und verzaubern kannst. + + + + {*B*} + Drücke {*CONTROLLER_VK_A*}, wenn du mehr über das Ambossmenü erfahren möchtest. {*B*} + Drücke {*CONTROLLER_VK_B*}, wenn du schon alles über das Ambossmenü weißt. + + + + Lege einen Gegenstand in den ersten Eingabeplatz, um ihn zu bearbeiten. + + + + Wenn das richtige Rohmaterial in den zweiten Eingabeplatz gelegt wird (z. B. Eisenbarren für ein Eisenschwert), erscheint die vorgeschlagene Reparatur im Ausgabeplatz. + + + + Stattdessen kannst du auch einen identischen Gegenstand in den zweiten Eingabeplatz legen, um beide Gegenstände zu kombinieren. + + + + Um Gegenstände auf dem Amboss zu verzaubern, legst du ein Zauberbuch in den zweiten Eingabeplatz. + + + + Unter der Ausgabe siehst du, wie viele Erfahrungslevel der Vorgang kostet. Wenn du nicht genug davon hast, ist die Reparatur nicht möglich. + + + + Ändere den Namen im Textfeld, um den Gegenstand, den du bearbeitest, umzubenennen. + + + + Wenn du den reparierten Gegenstand aufhebst, werden beide Gegenstände vom Amboss verbraucht und dein Erfahrungslevel sinkt um den angegebenen Wert. + + + + Hier sind ein Amboss und eine Truhe mit Werkzeugen und Waffen zur Bearbeitung. + + + + {*B*} + Drücke {*CONTROLLER_VK_A*}, wenn du mehr über den Amboss erfahren möchtest. {*B*} + Drücke {*CONTROLLER_VK_B*}, wenn du schon alles über den Amboss weißt. + + + + Auf einem Amboss können Waffen und Werkzeuge repariert und so wieder haltbar gemacht, umbenannt oder mithilfe von Zauberbüchern verzaubert werden. + + + + Zauberbücher findest du in Truhen in Dungeons. Du kannst auch normale Bücher auf dem Zaubertisch verzaubern. + + + + Die Nutzung des Ambosses kostet Erfahrungslevel. Bei jeder Nutzung besteht das Risiko, dass der Amboss beschädigt wird. + + + + Die Kosten der Reparatur hängen von der Art der Bearbeitung, dem Wert des Gegenstands, der Anzahl an Verzauberungen und der Anzahl an vorherigen Bearbeitungen ab. + + + + Wenn du einen Gegenstand umbenennst, wird der neue Name allen Spielern angezeigt und die Kosten für vorherige Bearbeitungen sinken dauerhaft. + + + + In dieser Truhe findest du beschädigte Spitzhacken, Rohmaterialien, Erfahrungsfläschchen und Zauberbücher, mit denen du experimentieren kannst. + + + + Dies ist das Handelsmenü, wo du siehst, was mit einem Dorfbewohner gehandelt werden kann. + + + + {*B*} + Drücke {*CONTROLLER_VK_A*}, wenn du mehr über das Handelsmenü erfahren möchtest. {*B*} + Drücke {*CONTROLLER_VK_B*}, wenn du schon alles über das Handelsmenü weißt. + + + + Alle Handel, auf die sich der Dorfbewohner momentan einlässt, werden oben angezeigt. + + + + Wenn du die benötigten Gegenstände nicht hast, sind die Handel rot markiert und nicht verfügbar. + + + + In den zwei Kästen links siehst du, wie viele und welche Gegenstände du dem Dorfbewohner anbietest. + + + + In den zwei Kästen links siehst du, wie viele der Gegenstände für den Handel benötigt werden. + + + + Drücke {*CONTROLLER_VK_A*}, um die benötigten Gegenstände mit dem Dorfbewohner zu tauschen. + + + + Hier sind ein Dorfbewohner und eine Truhe mit Papier zum Kauf von Gegenständen. + + + + {*B*} + Drücke {*CONTROLLER_VK_A*}, um mehr über das Handeln zu erfahren.{*B*} + Drücke {*CONTROLLER_VK_B*}, wenn du bereits alles über das Handeln weißt. + + + + Spieler können Gegenstände aus ihrem Inventar mit Dorfbewohnern handeln. + + + + Mit welchen Gegenständen ein Dorfbewohner handelt, hängt wahrscheinlich von seinem Beruf ab. + + + + Wenn du mit verschiedenen Dingen handelst, ändern oder erweitern sich zufällig die verfügbaren Handelsangebote des Dorfbewohners. + + + + Zu oft genutzte Angebote werden mitunter vorübergehend ausgesetzt, doch der Dorfbewohner hat stets mindestens einen Handel, auf den er sich einlässt. + + + + Nimm etwas Papier aus der Truhe und handle mit dem Dorfbewohner. + + + + Hier sind zwei Endertruhen. + + + + {*B*} + Drücke {*CONTROLLER_VK_A*}, um mehr über Endertruhen zu erfahren.{*B*} + Drücke {*CONTROLLER_VK_B*}, wenn du bereits alles über Endertruhen weißt. + + + + Alle Endertruhen in einer Welt sind verknüpft, sodass Gegenstände, die in eine Endertruhe gelegt werden, in jeder anderen verfügbar werden. + + + + Allerdings sind die Inhalte der Endertruhen für jeden Spieler unterschiedlich. + + + + So können Spieler Gegenstände in eine beliebige Endertruhe legen und aus einer anderen Endertruhe irgendwo auf der Welt herausnehmen. Versuche dies jetzt, indem du einen Gegenstand in eine der beiden Endertruhen legst. + + +Regeneriert 2{*ICON_SHANK_01*}, regeneriert 30 Sekunden lang Gesundheit und gewährt 5 Minuten lang Widerstand gegen Feuer und Schaden. Wird aus einem Apfel und Goldblöcken hergestellt. + +Kann teleportieren + +Teleportieren + +Zu Spieler teleportieren + +Zu mir teleportieren + +Kann Erschöpfung deaktivieren + +Kann unsichtbar werden + +Du kannst jetzt Unsichtbarkeit aktivieren. + +Du kannst nicht länger Unsichtbarkeit aktivieren. + +Du kannst jetzt das Fliegen aktivieren. + +Du kannst nicht länger das Fliegen aktivieren. + +Du kannst jetzt Erschöpfung deaktivieren. + +Du kannst nicht länger Erschöpfung deaktivieren. + +Du kannst jetzt teleportieren. + +Du kannst nicht mehr teleportieren. + +{*T3*}SO WIRD GESPIELT: AMBOSS{*ETW*}{*B*}{*B*} +Erfahrungslevel können auch dafür genutzt werden, Gegenstände auf dem Amboss zu reparieren, verzaubern oder umzubenennen.{*B*} +Jeder Gegenstand kann umbenannt werden, doch nur haltbare Gegenstände können repariert oder mithilfe von Zauberbüchern verzaubert werden.{*B*} +Lege den Gegenstand, der repariert werden soll, in einen der Eingabeplätze links und füge entweder Rohmaterialien des Gegenstands, zum Beispiel Eisenbarren für ein Eisenschwert, oder einen Gegenstand desselben Typs hinzu.{*B*} +Gegenstände können auf einem Amboss effizienter kombiniert werden, und falls einer der Gegenstände verzaubert ist, erbt der kombinierte Gegenstand mitunter Verzauberungen von beiden Ursprungsgegenständen.{*B*} +Wenn Gegenstände auf einem Amboss mit passenden Zauberbüchern kombiniert werden, werden sie verzaubert. Zauberbücher findest du in Truhen in Dungeons, du kannst aber auch normale Bücher auf dem Zaubertisch verzaubern.{*B*} +Bei jeder Nutzung des Ambosses besteht die Gefahr, dass er beschädigt wird. Ist er zu stark beschädigt, geht er kaputt.{*B*} + + +{*T3*}SO WIRD GESPIELT: HANDEL{*ETW*}{*B*}{*B*} +Du kannst Gegenstände mit Dorfbewohnern handeln. Jeder Dorfbewohner hat einen Beruf. Es gibt Farmer, Metzger, Schmiede, Bibliothekare und Priester. Je nach Beruf handeln sie mit verschiedenen Gegenständen.{*B*} +Im Handelsmenü findest du eine Liste mit allen Handelsangeboten eines Dorfbewohners. Eventuell verändern oder erweitern Dorfbewohner beim Handeln ihr Angebot, doch wird ein Angebot zu häufig genutzt, so kann es vorübergehend ausgesetzt werden.{*B*} +Beim Handeln werden üblicherweise diverse Gegenstände für Smaragde ge- oder verkauft.{*B*} +Falls du die Gegenstände nicht besitzt, die für einen Handel benötigt werden, werden die Gegenstände rot markiert.{*B*} + + +{*T3*}SO WIRD GESPIELT: ENDERTRUHE{*ETW*}{*B*}{*B*} +Alle Endertruhen in einer Welt sind verknüpft, sodass Gegenstände, die in eine Endertruhe gelegt werden, in jeder anderen verfügbar werden. Allerdings sind die Inhalte der Endertruhen für jeden Spieler unterschiedlich; so können Spieler Gegenstände in jeder beliebigen Endertruhe verstauen und sie aus anderen Endertruhen in der Welt wieder entnehmen. + + +Farmer + +Bibliothekar + +Priester + +Schmied + +Metzger + +In Dörfern zu finden. Dorfbewohner verkaufen je nach Beruf verschiedene Gegenstände. + +Große Truhe + + + Du kannst auf dem Zaubertisch auch Zauberbücher herstellen, mit denen du später auf dem Amboss Gegenstände verzaubern kannst. + + + + Während sie von etwas ausgelöst werden, versorgen Stolperdrahthaken Kreisläufe mit Strom. + + + + Ein gezähmter Wolf trägt stets sein Halsband. Du kannst das Halsband beliebig einfärben. + + +Karotten und Kartoffeln müssen angebaut werden. Wenn das Gemüse an die Oberfläche dringt, ist es erntereif. + + + Du kannst Schweine auch satteln und reiten. Verwende eine Karottenangel, um sie in die gewünschte Richtung zu locken. + + + + Mit {*CONTROLLER_ACTION_MOVE*} kannst du deine Lore falls nötig langsam weiterbewegen. Das hilft beim Starten einer Lore, indem sie auf eine Booster-Schiene bewegt wird. + + +Du kannst diesem Spiel nicht beitreten, da Spielen mit geteiltem Bildschirm nur im HD-Modus unterstützt wird. Alle anderen Spieler müssen sich abmelden, wenn du beitreten möchtest. + +Heilen + +Xbox 360 + +BACK + +Diese Option deaktiviert für diese Welt Erfolge und Bestenlisten-Aktualisierungen während des Spielens und wenn nach dem Speichern mit aktivierter Option erneut geladen wird. + +Spielstand für Xbox One hochladen + +Spielstand hochladen + +Nur ein Spielstand der Xbox 360 Konsole kann jeweils im Spielstandtransferslot gespeichert werden. Bitte vergewissere dich, dass du den Spielstand auf deine Xbox One Konsole heruntergeladen hast, bevor du einen weiteren Spielstand hochlädst. + +Hochladen ... + +Upload abgeschlossen! + +Fehler beim Upload. Bitte versuche es später erneut. + + diff --git a/Minecraft.Client/Common/Media/en-EN.lang b/Minecraft.Client/Common/Media/en-EN.lang new file mode 100644 index 00000000..a51600cb --- /dev/null +++ b/Minecraft.Client/Common/Media/en-EN.lang @@ -0,0 +1,5772 @@ + + + + + New Downloadable Content is available! Access it from the Minecraft Store button on the Main Menu. + + + You can change the look of your character with a Skin Pack from the Minecraft Store. Select 'Minecraft Store' on the Main Menu to see what's available. + + + + If you play this game in High Definition mode, you can have up to four players in split-screen on the same console! + + + Connect extra controllers to your console and press START on them to join a game at any point. + + + Alter the gamma settings to make the game brighter or darker. + + + If you set the game difficulty to Peaceful, your health will automatically regenerate, and no monsters will come out at night! + + + Feed a bone to a wolf to tame it. You can then make it sit or follow you. + + + You can drop items when in the Inventory menu by moving the cursor off the menu and pressing{*CONTROLLER_VK_A*} + + + Sleeping in a bed at night will fast forward the game to dawn, but all players in a multiplayer game need to sleep in beds at the same time. + + + Harvest pork chops from pigs, and cook and eat them to regain health. + + + Harvest leather from cows, and use it to make armor. + + + If you have an empty bucket, you can fill it with milk from a cow, or water, or lava! + + + Use a hoe to prepare areas of ground for planting. + + + Spiders won't attack you during the day - unless you attack them. + + + Digging soil or sand with a spade is faster than with your hand! + + + Eating cooked pork chops gives more health than eating raw pork chops. + + + Make some torches to light up areas at night. Monsters will avoid the areas around these torches. + + + Get to destinations faster with a minecart and rail! + + + Plant some saplings and they'll grow into trees. + + + Pigmen won't attack you, unless you attack them. + + + You can change your game spawn point and skip to dawn by sleeping in a bed. + + + Hit those fireballs back at the Ghast! + + + Building a portal will allow you to travel to another dimension - The Nether. + + + Press{*CONTROLLER_VK_B*} to drop the item currently in your hand! + + + Use the right tool for the job! + + + If you can't find any coal for your torches, you can always make charcoal from trees in a furnace. + + + Digging straight down or straight up is not a great idea. + + + Bonemeal (crafted from a Skeleton bone) can be used as a fertilizer, and can make things grow instantly! + + + Creepers explode when they get close to you! + + + Obsidian is created when water hits a lava source block. + + + Lava can take minutes to disappear COMPLETELY when the source block is removed. + + + Cobblestone is resistant to Ghast fireballs, making it useful for guarding portals. + + + Blocks that can be used as a light source will melt snow and ice. This includes torches, glowstone, and Jack-O-Lanterns. + + + Take caution when building structures made of wool in open air, as lightning from thunderstorms can set wool on fire. + + + A single bucket of lava can be used in a furnace to smelt 100 blocks. + + + The instrument played by a note block depends on the material beneath it. + + + Zombies and Skeletons can survive daylight if they are in water. + + + Attacking a wolf will cause any wolves in the immediate vicinity to turn hostile and attack you. This trait is also shared by Zombie Pigmen. + + + Wolves cannot enter the Nether. + + + Wolves won't attack Creepers. + + + Chickens lay an egg every 5 to 10 minutes. + + + Obsidian can only be mined with a diamond pickaxe. + + + Creepers are the easiest obtainable source of gunpowder. + + + Placing two chests side by side will make one large chest. + + + Tame wolves show their health with the position of their tail. Feed them meat to heal them. + + + Cook cactus in a furnace to get green dye. + + + You'll get the latest info on this game from 4J Studios and Kappische on twitter! + + + Impress your friends by posting screenshots of your Minecraft creations to Facebook from the in-game Pause menu! + + + Read the What's New section in the How To Play menus to see the latest update information about the game. + + + Stackable fences are in the game now! + + + minecraftforum has a section dedicated to the Xbox 360 Edition. + + + Some animals will follow you if you have wheat in your hand. + + + If an animal can't move more than 20 blocks in any direction, it won't despawn. + + + + Music by C418! + + + Notch has over a million followers on twitter! + + + Not all Swedish people have blonde hair. Some, like Jens from Mojang, even have ginger hair! + + + We think 4J Studios has removed Herobrine from the Xbox 360 console game, but we're not too sure. + + + There will be an update to this game eventually! + + + Who is Notch? + + + Mojang has more awards than staff! + + + Some famous people play Minecraft! + + + deadmau5 likes Minecraft! + + + Do not look directly at the bugs. + + + Creepers were born from a coding bug. + + + Is it a chicken or is it a duck? + + + Were you at Minecon? + + + No-one at Mojang has ever seen junkboy's face. + + + Did you know there's a Minecraft Wiki? + + + Mojang's new office is cool! + + + Minecraft: Xbox 360 Edition broke lots of records! + + + Minecon 2013 is in Orlando, Florida, USA! + + + .party() was excellent! + + + Always assume rumors are false, rather than assuming they're true! + + + + {*T3*}HOW TO PLAY : BASICS{*ETW*}{*B*}{*B*} +Minecraft is a game about placing blocks to build anything you can imagine. At night monsters come out, make sure to build a shelter before that happens.{*B*}{*B*} +Use{*CONTROLLER_ACTION_LOOK*} to look around.{*B*}{*B*} +Use{*CONTROLLER_ACTION_MOVE*} to move around.{*B*}{*B*} +Press{*CONTROLLER_ACTION_JUMP*} to jump.{*B*}{*B*} +Push{*CONTROLLER_ACTION_MOVE*} forward twice in rapid succession to sprint. While you hold {*CONTROLLER_ACTION_MOVE*} forward, the character will continue to sprint unless they run out of sprint time or the Food Bar has less than{*ICON_SHANK_03*}.{*B*}{*B*} +Hold{*CONTROLLER_ACTION_ACTION*} to mine and chop using your hand or whatever you are holding. You may need to craft a tool to mine some blocks.{*B*}{*B*} +If you are holding an item in your hand, use{*CONTROLLER_ACTION_USE*} to use that item, or press{*CONTROLLER_ACTION_DROP*} to drop that item. + + + {*T3*}HOW TO PLAY : HUD{*ETW*}{*B*}{*B*} +The HUD shows information about your status; your health, your remaining oxygen when you are under water, your hunger level (you need to eat to replenish this), and your armor if you are wearing any. +If you lose some health, but have a food bar with 9 or more{*ICON_SHANK_01*} in it, your health will automatically replenish. Eating food will replenish your food bar.{*B*} +The Experience Bar is also shown here, with a numeric value to show your Experience Level, and the bar indicating how many Experience Points are required to increase your Experience Level. +Experience Points are gained by collecting the Experience Orbs dropped by mobs when they die, mining certain block types, breeding animals, fishing, and smelting ores in a furnace.{*B*}{*B*} +It also shows the items that are available to use. Use{*CONTROLLER_ACTION_LEFT_SCROLL*} and{*CONTROLLER_ACTION_RIGHT_SCROLL*} to change the item in your hand. + + + {*T3*}HOW TO PLAY : INVENTORY{*ETW*}{*B*}{*B*} +Use{*CONTROLLER_ACTION_INVENTORY*} to view your inventory.{*B*}{*B*} +This screen shows items available for use in your hand, and all the other items that you are carrying. Your armor is also shown here.{*B*}{*B*} +Use{*CONTROLLER_MENU_NAVIGATE*} to move the pointer. Use{*CONTROLLER_VK_A*} to pick an item under the pointer. If there is more than one item here this will pick them all up, or you can use{*CONTROLLER_VK_X*} to pick up just half of them.{*B*}{*B*} +Move the item with the pointer over another space in the inventory and place it there using{*CONTROLLER_VK_A*}. With multiple items on the pointer, use{*CONTROLLER_VK_A*} to place them all, or{*CONTROLLER_VK_X*} to place just one.{*B*}{*B*} +If an item you are over is armor, you will be shown a tooltip to enable a quick move of this to the right armor slot in the inventory. + + + + {*T3*}HOW TO PLAY : CHEST{*ETW*}{*B*}{*B*} +Once you have crafted a Chest, you can place this in the world and then use it with{*CONTROLLER_ACTION_USE*} to store items from your inventory.{*B*}{*B*} +Use the pointer to move items between your inventory and the chest.{*B*}{*B*} +Items in the chest will be stored there for you to swap back into your inventory again later. + + + + {*T3*}HOW TO PLAY : LARGE CHEST{*ETW*}{*B*}{*B*} +Two chests placed next to each other will be combined to form a Large Chest. This can store even more items.{*B*}{*B*} +It is used in the same way as a normal chest. + + + + {*T3*}HOW TO PLAY : CRAFTING{*ETW*}{*B*}{*B*} +In the Crafting interface, you can combine items from your inventory to create new types of items. Use{*CONTROLLER_ACTION_CRAFTING*} to open the crafting interface.{*B*}{*B*} +Scroll through the tabs at the top using{*CONTROLLER_VK_LB*} and{*CONTROLLER_VK_RB*} to select the type of item you wish to craft, then use{*CONTROLLER_MENU_NAVIGATE*} to select the item to craft.{*B*}{*B*} +The crafting area shows the items required to craft the new item. Press{*CONTROLLER_VK_A*} to craft the item and place it in your inventory. + + + + {*T3*}HOW TO PLAY : CRAFTING TABLE{*ETW*}{*B*}{*B*} +You can craft larger items using a Crafting Table.{*B*}{*B*} +Place the table in the world and press{*CONTROLLER_ACTION_USE*} to use it.{*B*}{*B*} +Crafting on a table works in the same way as basic crafting, but you have a larger crafting area, and a more varied selection of items to craft. + + + + {*T3*}HOW TO PLAY : FURNACE{*ETW*}{*B*}{*B*} +A Furnace allows you to change items by firing them. For example, you can turn iron ore into iron ingots in the furnace.{*B*}{*B*} +Place the furnace in the world and press{*CONTROLLER_ACTION_USE*} to use it.{*B*}{*B*} +You need to put some fuel into the bottom of the furnace, and the item to be fired in the top. The furnace will then fire up and start working.{*B*}{*B*} +When your items have been fired, you can move them from the output area into your inventory.{*B*}{*B*} +If an item you are over is an ingredient or fuel for the furnace, you will be shown tooltips to enable a quick move of this to the furnace. + + + + {*T3*}HOW TO PLAY : DISPENSER{*ETW*}{*B*}{*B*} +A Dispenser is used to shoot out items. You will need to place a switch, for example a lever, next to the dispenser to trigger it.{*B*}{*B*} +To fill the dispenser with items press{*CONTROLLER_ACTION_USE*}, then move the items that you want to dispense from your inventory into the dispenser.{*B*}{*B*} +Now when you use the switch, the dispenser will shoot out an item. + + + + + {*T3*}HOW TO PLAY : BREWING{*ETW*}{*B*}{*B*} +Brewing potions requires a Brewing Stand, which can be built at a crafting table. Every potion starts off with a bottle of water, which is made by filling a Glass Bottle with water from a Cauldron, or a water source.{*B*} +A Brewing Stand has three slots for bottles, so can make three potions at the same time. One ingredient can be used over all three bottles, so always brew three potions at the same time to best use your resources.{*B*} +Putting a potion ingredient in the top position at the Brewing Stand will make a base potion after a short time. This doesn't have any effect by itself, but brewing another ingredient with this base potion will give you a potion with an effect.{*B*} +Once you have this potion you can add a third ingredient to make the effect last longer (using Redstone Dust), be more intense (using Glowstone Dust), or turn into a harmful potion (using a Fermented Spider Eye).{*B*} +You can also add gunpowder to any potion to turn it into a Splash Potion, which can then be thrown. The thrown Splash Potion will cause the potion effect to apply over the area it lands in.{*B*} + +The source ingredients for potions are :-{*B*}{*B*} +* {*T2*}Nether Wart{*ETW*}{*B*} +* {*T2*}Spider Eye{*ETW*}{*B*} +* {*T2*}Sugar{*ETW*}{*B*} +* {*T2*}Ghast Tear{*ETW*}{*B*} +* {*T2*}Blaze Powder{*ETW*}{*B*} +* {*T2*}Magma Cream{*ETW*}{*B*} +* {*T2*}Glistering Melon{*ETW*}{*B*} +* {*T2*}Redstone Dust{*ETW*}{*B*} +* {*T2*}Glow Stone Dust{*ETW*}{*B*} +* {*T2*}Fermented Spider Eye{*ETW*}{*B*}{*B*} + +You'll need to experiment with combinations of ingredients in order to find out all the different potions you can make. + + + + + {*T3*}HOW TO PLAY : ENCHANTING{*ETW*}{*B*}{*B*} +The Experience Points collected when a mob dies, or when certain blocks are mined or smelted in a furnace, can be used to enchant some tools, weapons and armor.{*B*} +When the Sword, Bow, Axe, Pickaxe, Shovel or Armor is placed in the slot below the book in the Enchantment Table, the three buttons to the right of the slot will display some enchantments and their Experience Levels costs.{*B*} +If you do not have enough Experience Levels to use some of these, the cost will appear in red, otherwise it will be shown in green.{*B*}{*B*} +The actual enchantment applied is randomly selected based on the cost displayed.{*B*}{*B*} +If the Enchantment Table is surrounded by Bookshelves (up to a maximum of 15 Bookshelves), with a one block gap between the Bookcase and the Enchantment Table, the potency of the enchantments will be increased, and arcane glyphs will be seen coming from the book on the Enchantment Table.{*B*}{*B*} +All the ingredients for an enchantment table can be found within the villages in a world, or by mining and cultivation of the world.{*B*} + + + + + {*T3*}HOW TO PLAY : FARMING ANIMALS{*ETW*}{*B*}{*B*} +If you want to keep your animals in the one place, build a fenced area of less than 20x20 blocks and have your animals inside it. This ensures they will still be there when you come back to see them. + + + + + {*T3*}HOW TO PLAY : BREEDING ANIMALS{*ETW*}{*B*}{*B*} +The animals in Minecraft can breed, and will produce baby versions of themselves!{*B*} +To get the animals to breed, you will need to feed them with the right food to get them to go into 'Love Mode'.{*B*} +Feed Wheat to a cow, mooshroom, pig or sheep, Wheat Seeds or Nether Wart to a chicken, or any kind of meat to a wolf, and they'll start looking for another animal of the same species near them that is also in Love Mode.{*B*} +When two animals of the same species meet, and both are in Love Mode, they will kiss for a few seconds, and then a baby animal will appear. The baby animal will follow their parents for a while before growing into a full sized animal itself.{*B*} +After being in Love Mode, an animal will not be able to enter it again for about five minutes.{*B*} +There is a limit on the number of animals it is possible to have in a world, so you may find the animals don't breed when you have a lot of them. + + + + {*T3*}HOW TO PLAY : NETHER PORTAL{*ETW*}{*B*}{*B*} +A Nether Portal allows the player to travel between the Overworld and the Nether world. The Nether world can be used to fast-travel in the Overworld - traveling one block distance in the Nether is equivalent to traveling 3 blocks in the Overworld, so when you build a portal +in the Nether world and exit through it, you will be 3 times further away from your entry point.{*B*}{*B*} +A minimum of 10 Obsidian blocks are required to build the portal, and the portal needs to be 5 blocks high by 4 blocks wide by 1 block deep. Once the portal frame is built, the space inside the frame needs to be set on fire to activate it. This can be done using the Flint and Steel item, or the Fire Charge item.{*B*}{*B*} +Examples of portal construction are shown in the picture to the right. + + + + + {*T3*}HOW TO PLAY : MULTIPLAYER{*ETW*}{*B*}{*B*} +Minecraft on the Xbox 360 console is a multiplayer game by default. If you are playing in a High Definition mode, you can have local players join your game by attaching controllers and pressing START at any point during the game.{*B*}{*B*} +When you start or join an online game, it will be visible to people in your friends list (unless you've selected Invite Only when hosting the game), and if they join the game, it will also be visible to people in their friends list (if you have selected the Allow Friends of Friends option). +When you are in a game, you can press the BACK button to bring up a list of all other players in the game, view their Gamer Cards, Kick players from the game, and invite others to the game. + + + + + {*T3*}HOW TO PLAY : SHARING SCREENSHOTS{*ETW*}{*B*}{*B*} +You can capture a screenshot from your game by bringing up the Pause Menu, and pressing{*CONTROLLER_VK_Y*} to Share to Facebook. You'll be presented with a miniature version of your screenshot, and can edit the text associated with the Facebook post.{*B*}{*B*} +There's a camera mode especially for taking these screenshots, so that you can see the front of your character in the shot - press{*CONTROLLER_ACTION_CAMERA*} until you can see the front view of your character before pressing{*CONTROLLER_VK_Y*} to Share.{*B*}{*B*} +Gamertags will not be displayed in the screenshot. + + + + + {*T3*}HOW TO PLAY : BANNING LEVELS{*ETW*}{*B*}{*B*} +If you find offensive content within a level you are playing, you can choose to add the level to your Banned Levels list. +If you would like to do this, bring up the Pause menu, then press{*CONTROLLER_VK_RB*} to select the Ban Level tooltip. +When you attempt to join this level in future, you will be notified that the level is in your Banned Levels list, and given the option to remove it from the list and continue into the level, or back out. + + + {*T3*}HOW TO PLAY : CREATIVE MODE{*ETW*}{*B*}{*B*} +The creative mode interface allows any item in the game to be moved into the player’s inventory without the need for mining or crafting the item. +The items in the player's inventory will not be removed when they are placed or used in the world, and this allows the player to focus on building rather than resource gathering.{*B*} +If you create, load or save a world in Creative Mode, that world will have achievements and leaderboard updates disabled, even if it is then loaded in Survival Mode.{*B*} +To fly when in Creative Mode, press{*CONTROLLER_ACTION_JUMP*} twice quickly. To exit flying, repeat the action. To fly faster, push{*CONTROLLER_ACTION_MOVE*} forward twice in rapid succession while flying. +When in flying mode, you can hold down{*CONTROLLER_ACTION_JUMP*} to move up and{*CONTROLLER_ACTION_SNEAK*} to move down, or use{*CONTROLLER_ACTION_DPAD_UP*} to move up, {*CONTROLLER_ACTION_DPAD_DOWN*} to move down, +{*CONTROLLER_ACTION_DPAD_LEFT*} to move left, and {*CONTROLLER_ACTION_DPAD_RIGHT*} to move right. + + + {*T3*}HOW TO PLAY : HOST AND PLAYER OPTIONS{*ETW*}{*B*}{*B*} + +{*T1*}Game Options{*ETW*}{*B*} +When loading or creating a world, you can press the "More Options" button to enter a menu that allows more control over your game.{*B*}{*B*} + + {*T2*}Player vs Player{*ETW*}{*B*} + When enabled, players can inflict damage on other players. This option only affects Survival mode.{*B*}{*B*} + + {*T2*}Trust Players{*ETW*}{*B*} + When disabled, players joining the game are restricted in what they can do. They are not able to mine or use items, place blocks, use doors and switches, use containers, attack players or attack animals. You can change these options for a specific player using the in-game menu.{*B*}{*B*} + + {*T2*}Fire Spreads{*ETW*}{*B*} + When enabled, fire may spread to nearby flammable blocks. This option can also be changed from within the game.{*B*}{*B*} + + {*T2*}TNT Explodes{*ETW*}{*B*} + When enabled, TNT will explode when detonated. This option can also be changed from within the game.{*B*}{*B*} + + {*T2*}Host Privileges{*ETW*}{*B*} + When enabled, the host can toggle their ability to fly, disable exhaustion, and make themselves invisible from the in-game menu. This option disables achievements and leaderboard updates for this world while playing, and if loading it again after saving with this option on.{*B*}{*B*} + +{*T1*}World Generation Options{*ETW*}{*B*} +When creating a new world there are some additional options.{*B*}{*B*} + + {*T2*}Generate Structures{*ETW*}{*B*} + When enabled, structures such as Villages and Strongholds will generate in the world.{*B*}{*B*} + + {*T2*}Superflat World{*ETW*}{*B*} + When enabled, a completely flat world will be generated in the Overworld and in the Nether.{*B*}{*B*} + + {*T2*}Bonus Chest{*ETW*}{*B*} + When enabled, a chest containing some useful items will be created near the player spawn point.{*B*}{*B*} + + {*T2*}Reset Nether{*ETW*}{*B*} + When enabled, the Nether will be re-generated. This is useful if you have an older save where Nether Fortresses were not present.{*B*}{*B*} + + {*T1*}In-Game Options{*ETW*}{*B*} + While in the game a number of options can be accessed by pressing BACK to bring up the in-game menu.{*B*}{*B*} + + {*T2*}Host Options{*ETW*}{*B*} + The host player, and any players set as moderators can access the "Host Option" menu. In this menu they can enable and disable fire spreading and TNT exploding.{*B*}{*B*} + +{*T1*}Player Options{*ETW*}{*B*} +To modify the privileges for a player, select their name and press{*CONTROLLER_VK_A*} to bring up the player privileges menu where you can use the following options.{*B*}{*B*} + + {*T2*}Can Build And Mine{*ETW*}{*B*} + This option is only available when "Trust Players" is turned off. When this option is enabled, the player is able to interact with the world as normal. When disabled the player will not be able to place or destroy blocks, or interact with many items and blocks.{*B*}{*B*} + + {*T2*}Can Use Doors and Switches{*ETW*}{*B*} + This option is only available when "Trust Players" is turned off. When this option is disabled, the player will not be able to use doors and switches.{*B*}{*B*} + + {*T2*}Can Open Containers{*ETW*}{*B*} + This option is only available when "Trust Players" is turned off. When this option is disabled, the player will not be able to open containers, such as chests.{*B*}{*B*} + + {*T2*}Can Attack Players{*ETW*}{*B*} + This option is only available when "Trust Players" is turned off. When this option is disabled the player will not be able to cause damage to other players.{*B*}{*B*} + + {*T2*}Can Attack Animals{*ETW*}{*B*} + This option is only available when "Trust Players" is turned off. When this option is disabled the player will not be able to cause damage to animals.{*B*}{*B*} + + {*T2*}Moderator{*ETW*}{*B*} + When this option is enabled, the player is able to change privileges for other players (except the host) if "Trust Players" is turned off, kick players and they can enable and disable fire spreading and TNT exploding.{*B*}{*B*} + + {*T2*}Kick Player{*ETW*}{*B*} + For players that are not on the same Xbox 360 console as the host player, selecting this option will kick the player from the game and any other players on their Xbox 360 console. This player will not be able to rejoin the game until it is restarted.{*B*}{*B*} + +{*T1*}Host Player Options{*ETW*}{*B*} +If "Host Privileges" is enabled the host player can modify some privileges for themselves. To modify the privileges for a player, select their name and press{*CONTROLLER_VK_A*} to bring up the player privileges menu where you can use the following options.{*B*}{*B*} + + {*T2*}Can Fly{*ETW*}{*B*} + When this option is enabled, the player is able to fly. This option is only relevant to Survival mode, as flying is enabled for all players in Creative mode.{*B*}{*B*} + + {*T2*}Disable Exhaustion{*ETW*}{*B*} + This option only affects Survival mode. When enabled, physical activities (walking/sprinting/jumping etc.) do not decrease the food bar. However, if the player becomes injured, the food bar will slowly decrease while the player is healing.{*B*}{*B*} + + {*T2*}Invisible{*ETW*}{*B*} + When this option is enabled, the player is not visible to other players and is invulnerable.{*B*}{*B*} + + + + + Next Page + + + Previous Page + + + Basics + + + HUD + + + Inventory + + + Chests + + + Crafting + + + Furnace + + + Dispenser + + + + Farming Animals + + + Breeding Animals + + + Brewing + + + Enchantment + + + + Nether Portal + + + Multiplayer + + + Sharing Screenshots + + + Banning Levels + + + Creative Mode + + + Host and Player Options + + + + The End + + + + {*T3*}HOW TO PLAY : The End{*ETW*}{*B*}{*B*} +The End is another dimension in the game, which is reached through an active End Portal. The End Portal can be found in a Stronghold, which is deep underground in the Overworld.{*B*} +To activate the End Portal, you'll need to put an Eye of Ender into any End Portal Frame without one.{*B*} +Once the portal is active, jump in to it to go to The End.{*B*}{*B*} +In The End you will meet the Enderdragon, a fierce and powerful enemy, along with many Enderman, so you will have to be well prepared for the battle before going there!{*B*}{*B*} +You'll find that there are Ender Crystals on top of eight Obsidian spikes that the Enderdragon uses to heal itself, +so the first step in the battle is to destroy each of these.{*B*} +The first few can be reached with arrows, but the later ones are protected by an Iron Fence cage, and you will need to build up to them.{*B*}{*B*} +While you are doing this, the Enderdragon will be attacking you by flying at you and spitting Ender acid balls!{*B*} +If you approach the Egg Podium in the centre of the spikes, the Enderdragon will fly down and attack you and this is where you can really do some damage to it!{*B*} +Avoid the acid breath, and target the Enderdragon's eyes for the best results. If possible, bring some friends in to The End to help you with the battle!{*B*}{*B*} +Once you are in The End, your friends will be able to see the location of the End Portal within the Stronghold on their maps, +so they can easily join you. + + + + Sprint + + + + What's New + + + + +{*T3*}TITLE UPDATE 12{*ETW*}{*B*}{*B*} +{*T3*}Changes and Additions{*ETW*}{*B*}{*B*} +- New map height limit (256 instead of 128).{*B*} +- New Jungle biome.{*B*} +- Added Jungle trees.{*B*} +- Added new items - Redstone Lamp, Jungle Wood Stairs, Jungle Wood Half Slab, Jungle Wood Block, Jungle Wood Planks, Jungle Tree Sapling, and Ocelot Spawn Egg.{*B*} +- Added new items (only available in Creative Mode at the moment) - Chiseled Stone Brick, Mob Heads (Skeleton, Wither Skeleton, Zombie, Human and Creeper).{*B*} +- Added new Mobs - Ocelots/Cats, Iron Golems and Baby Villagers.{*B*} +- Slabs and Stairs can be placed upside down by placing them below a block.{*B*} +- Added Corner Stairs and upside down Corner Stairs.{*B*} +- Cocoa Beans grow on Jungle trees.{*B*} +- Added 3D dropped items.{*B*} +- Added dispensing boats and minecarts to Dispenser.{*B*} +- New ambient cave sounds.{*B*} +- New AI for Mobs.{*B*} +- Added rare drops for Mobs.{*B*} +- Villagers will have children if there is room in their village.{*B*} +- Zombie sieges will occur occasionally at night.{*B*} +- Zombies break down doors on Hard Mode.{*B*} +- Crafting recipe for ladder now yields 3 ladders instead of 2.{*B*} +- Placing blocks on grass will replace it.{*B*} +- Lava now has a faint rumbling sound effect, and large particles that hop out of the lava produce a popping sound.{*B*} +- Very rare Desert Wells can be found in Desert biomes.{*B*} +- When in the Nether, Snow Golems will melt and die same as when they are in Desert biomes.{*B*} +- Abandoned Mineshafts can generate with wooden bridges now when generated over a cave or over top another tunnel.{*B*} +- Added a Favorites tab to the Skin Selector menu, storing most recently used skins.{*B*} +- Added support for Texture Packs and Mash-up Packs.{*B*} +- New Tutorial World.{*B*} +- Fixed local player shadows.{*B*} +- Fixed a few issues with the Privileges settings.{*B*} +- Fixed Minecart speed being double what it should be.{*B*} + + + + + {*ETB*}Welcome back! You may not have noticed but your Minecraft has just been updated.{*B*}{*B*} +There are lots of new features for you and friends to play with so here’s just a few highlights. Have a read and then go and have fun!{*B*}{*B*} +{*T1*}New Items{*ETB*} - Redstone Lamp, Jungle Wood Stairs, Jungle Wood Half Slab, Jungle Wood Block, Jungle Wood Planks, Jungle Tree Sapling, and Ocelot Spawn Egg.{*B*}{*B*} +{*T1*}New Items (only available in Creative Mode at the moment){*ETB*} - Chiseled Stone Brick, Mob Heads (Skelton, Wither Skeleton, Zombie, Human and Creeper).{*B*}{*B*} +{*T1*}New Mobs{*ETB*} - Ocelot/Cat, Iron Golem and Baby Villager.{*B*}{*B*} +{*T1*}New Jungle Biome{*ETB*} - Jungle trees grow here!{*B*}{*B*} +{*T1*}Doubled map height limit{*ETB*} - You can now build to 256 blocks high!{*B*}{*B*} +{*T1*}New Tutorial World{*ETB*} – A brand new Tutorial World to explore!{*B*}{*B*} +{*T1*}New 'Easter Eggs'{*ETB*} – You may have found all the Music Discs in the previous Tutorial World, but you'll need to see if you can find them in the new Tutorial World!{*B*}{*B*} + + + + + + Deals more damage than by hand. + + + Used to dig dirt, grass, sand, gravel and snow faster than by hand. Shovels are required to dig snowballs. + + + Required to mine stone-related blocks and ore. + + + Used to chop wood-related blocks faster than by hand. + + + Used to till dirt and grass blocks to prepare for crops. + + + Wooden doors are activated by using, hitting them or with Redstone. + + + Iron doors can only be opened by Redstone, buttons or switches. + + + + Gives the user 1.5 Armor when worn. + + + Gives the user 4 Armor when worn. + + + Gives the user 3 Armor when worn. + + + Gives the user 1.5 Armor when worn. + + + A shiny ingot which can be used to craft tools made from this material. Created by smelting ore in a furnace. + + + Allows ingots, gems, or dyes to be crafted into placeable blocks. Can be used as an expensive building block or compact storage of the ore. + + + Used to send an electrical charge when stepped on by a player, an animal, or a monster. Wooden Pressure Plates can also be activated by dropping something on them. + + + Used for compact staircases. + + + Used for making long staircases. Two slabs placed on top of each other will create a normal-sized double slab block. + + + Used for compact staircases. + + + Used to create light. Torches also melt snow and ice. + + + + Used as a building material and can be crafted into many things. Can be crafted from any form of wood. + + + Used as a building material. Is not influenced by gravity like normal Sand. + + + Used as a building material. + + + Used to craft torches, arrows, signs, ladders, fences and as handles for tools and weapons. + + + Used to forward time from any time at night to morning if all the players in the world are in bed, and changes the spawn point of the player. +The colors of the bed are always the same, regardless of the colors of wool used. + + + Allows you to craft a more varied selection of items than the normal crafting. + + + Allows you to smelt ore, create charcoal and glass, and cook fish and porkchops. + + + Stores blocks and items inside. Place two chests side by side to create a larger chest with double the capacity. + + + Used as a barrier that cannot be jumped over. Counts as 1.5 blocks high for players, animals and monsters, but 1 block high for other blocks. + + + Used to climb vertically. + + + Activated by using, hitting them or with redstone. They function as normal doors, but are a one by one block and lay flat on the ground. + + + Shows text entered by you or other players. + + + + Used to create brighter light than torches. Melts snow/ice and can be used underwater. + + + Used to cause explosions. Activated after placing by igniting with Flint and Steel item, or with an electrical charge. + + + Used to hold mushroom stew. You keep the bowl when the stew has been eaten. + + + Used to hold and transport water, lava and milk. + + + Used to hold and transport water. + + + Used to hold and transport lava. + + + Used to hold and transport milk. + + + + Used to create fire, ignite TNT, and open a portal once it has been built. + + + Used to catch fish. + + + Displays positions of the Sun and Moon. + + + Points to your start point. + + + Will create an image of an area explored while held. This can be used for path-finding. + + + + Allows for ranged attacks by using arrows. + + + Used as ammunition for bows. + + + + Restores 2.5{*ICON_SHANK_01*}. + + + Restores 1{*ICON_SHANK_01*}. Can be used 6 times. + + + Restores 0.5{*ICON_SHANK_01*}. + + + Restores 1{*ICON_SHANK_01*}. + + + Restores 4{*ICON_SHANK_01*}. + + + Restores 1{*ICON_SHANK_01*}, but can make you ill. Cook in a furnace. + + + Restores 3{*ICON_SHANK_01*}. + + + Restores 1.5{*ICON_SHANK_01*}, but can make you ill. Cook in a furnace. + + + Restores 4{*ICON_SHANK_01*}. + + + Collected by killing a pig, restores 1.5{*ICON_SHANK_01*}, and can be cooked in a furnace. + + + Created by cooking a porkchop in a furnace. Restores 4{*ICON_SHANK_01*}. + + + Can be eaten to restore 1{*ICON_SHANK_01*}, or cooked in a furnace. Can also be fed to an Ocelot to tame it. + + + Created by cooking a raw fish in a furnace. Can be eaten to restore 2.5{*ICON_SHANK_01*}. + + + Restores 2{*ICON_SHANK_01*}, and can be crafted into a golden apple. + + + Restores 2{*ICON_SHANK_01*}, and regenerates health for 4 seconds. + + + Restores 2{*ICON_SHANK_01*}, but can make you ill. + + + + Used in the cake recipe. + + + Used to send an electrical charge by being turned on or off. Stays in the on or off state until pressed again. + + + Constantly sends an electrical charge, or can be used as a receiver/transmitter when connected to the side of a block. +Can also be used for low-level lighting. + + + Used in Redstone circuits as repeater, a delayer, and/or a diode. + + + Used to send an electrical charge by being pressed. Stays activated for approximately a second before shutting off again. + + + Used to hold and shoot out items in a random order when given a Redstone charge. + + + Plays a note when triggered. Hit it to change the pitch of the note. Placing this on top of different blocks will change the type of instrument. + + + + Used to guide minecarts. + + + When powered, accelerates minecarts that pass over it. When unpowered, causes minecarts to stop on it. + + + Functions like a Pressure Plate (sends a Redstone signal when powered) but can only be activated by a minecart. + + + Used to transport you, an animal, or a monster along rails. + + + Used to transport goods along rails. + + + Will move along rails and can push other minecarts when coal is put in it. + + + Used to travel in water more quickly than swimming. + + + + Collected from sheep, and can be colored with dyes. + + + Used as a building material and can be colored with dyes. This recipe is not recommended because Wool can be easily obtained from Sheep. + + + Used as a dye to create black wool. + + + Used as a dye to create green wool. + + + Used as a dye to create brown wool. + + + Used as a dye to create silver wool. + + + Used as a dye to create yellow wool. + + + Used as a dye to create red wool. + + + Used to instantly grow crops, trees, tall grass, huge mushrooms and flowers, and can be used in dye recipes. + + + Used as a dye to create pink wool. + + + Used as a dye to create orange wool. + + + Used as a dye to create lime wool. + + + Used as a dye to create gray wool. + + + Used as a dye to create light gray wool. +(Note: light gray dye can also be made by combining gray dye with bone meal, letting you make four light gray dyes from every ink sac instead of three.) + + + Used as a dye to create light blue wool. + + + Used as a dye to create cyan wool. + + + Used as a dye to create purple wool. + + + Used as a dye to create magenta wool. + + + Used as dye to create Blue Wool. + + + Plays Music Discs. + + + Use these to create very strong tools, weapons or armor. + + + Used to create brighter light than torches. Melts snow/ice and can be used underwater. + + + Used to create books and maps. + + + Used to create a bookshelf. + + + Used as decoration. + + + Used as decoration. + + + + Can be mined with an iron pickaxe or better, then smelted in a furnace to produce gold ingots. + + + Can be mined with a stone pickaxe or better, then smelted in a furnace to produce iron ingots. + + + Can be mined with a pickaxe to collect coal. + + + Can be mined with a stone pickaxe or better to collect lapis lazuli. + + + Can be mined with an iron pickaxe or better to collect diamonds. + + + Can be mined with an iron pickaxe or better to collect redstone dust. + + + Can be mined with a pickaxe to collect cobblestone. + + + Collected using a shovel. Can be used for construction. + + + Can be planted and it will eventually grow into a tree. + + + This cannot be broken. + + + Sets fire to anything that touches it. Can be collected in a bucket. + + + Collected using a shovel. Can be smelted into glass using the furnace. Is affected by gravity if there is no other tile underneath it. + + + Collected using a shovel. Sometimes produces flint when dug up. Is affected by gravity if there is no other tile underneath it. + + + Chopped using an axe, and can be crafted into planks or used as a fuel. + + + Created in a furnace by smelting sand. Can be used for construction, but will break if you try to mine it. + + + Mined from stone using a pickaxe. Can be used to construct a furnace or stone tools. + + + Baked from clay in a furnace. + + + Can be baked into bricks in a furnace. + + + When broken drops clay balls which can be baked into bricks in a furnace. + + + A compact way to store snowballs. + + + Can be dug with a shovel to create snowballs. + + + Sometimes produces wheat seeds when broken. + + + Can be crafted into a dye. + + + Can be crafted with a bowl to make stew. + + + Can only be mined with a diamond pickaxe. Is produced by the meeting of water and still lava, and is used to build a portal. + + + Spawns monsters into the world. + + + Is placed on the ground to carry an electrical charge. + + + When fully grown, crops can be harvested to collect wheat. + + + Ground that has been prepared ready to plant seeds. + + + Can be cooked in a furnace to create a green dye. + + + Can be crafted to create sugar. + + + Can be worn as a helmet or crafted with a torch to create a Jack-O-Lantern. + + + Burns forever if set alight. + + + Slows the movement of anything walking over it. + + + Standing in the portal allows you to pass between the Overworld and the Nether. + + + + Used as a fuel in a furnace, or crafted to make a torch. + + + Collected by killing a spider, and can be crafted into a bow. + + + Collected by killing a chicken, and can be crafted into an arrow. + + + Collected by killing a Creeper, and can be crafted into TNT. + + + Can be planted in farmland to grow crops. Make sure there's enough light for the seeds to grow! + + + Harvested from crops, and can be used to craft food items. + + + Collected by digging gravel, and can be used to craft a flint and steel. + + + When used on a pig it allows you to ride the pig. + + + Collected by digging snow, and can be thrown. + + + Collected by killing a cow, and can be crafted into armor. + + + Collected by killing a Slime. + + + Dropped randomly by chickens, and can be crafted into food items. + + + Collected by mining Glowstone, and can be crafted to make Glowstone blocks again. + + + Collected by killing a Skeleton. Can be crafted into bone meal. Can be fed to a wolf to tame it. + + + Collected by getting a Skeleton to kill a Creeper. Can be played in a jukebox. + + + Extinguishes fire and helps crops grow. Can be collected in a bucket. + + + When broken sometimes drops a sapling which can then be replanted to grow into a tree. + + + Can be used for construction and decoration. + + + Used to obtain wool from sheep and harvest leaf blocks. + + + When powered (using a button, a lever, a pressure plate, a redstone torch, or redstone with any one of these), a piston extends if it can and pushes blocks. + + + When powered (using a button, a lever, a pressure plate, a redstone torch, or redstone with any one of these), a piston extends if it can and pushes blocks. When it retracts it pulls back the block touching the extended part of the piston. + + + Made from Stone blocks, and commonly found in Strongholds. + + + Used as a barrier, similar to fences. + + + Similar to a door, but used primarily with fences. + + + Can be crafted from Melon Slices. + + + Transparent blocks that can be used as an alternative to Glass Blocks. + + + Can be planted to grow pumpkins. + + + Can be planted to grow melons. + + + Dropped by Enderman when they die. When thrown, the player will be teleported to the position the Ender Pearl lands at, and will lose some health. + + + A block of dirt with grass growing on top. Collected using a shovel. Can be used for construction. + + + Can be used for construction and decoration. + + + Slows movement when walking through it. Can be destroyed using shears to collect string. + + + Spawns a Silverfish when destroyed. May also spawn Silverfish if nearby to another Silverfish being attacked. + + + Grows over time when placed. Can be collected using shears. Can be climbed like a ladder. + + + Slippery when walked on. Turns into water if above another block when destroyed. Melts if close enough to a light source. + + + Can be used as decoration. + + + Used in potion brewing, and for locating Strongholds. Dropped by Blazes who tend to be found near or in Nether Fortresses. + + + Used in potion brewing. Dropped by Ghasts when they die. + + + Dropped by Zombie Pigmen when they die. Zombie Pigmen can be found in the Nether. + + + Used in potion brewing. This can be found naturally growing in Nether Fortresses. It can also be planted on Soul Sand. + + + When used, can have various effects, depending on what it is used on. + + + Can be filled with water, and used as the starting ingredient for a potion in the Brewing Stand. + + + This is a poisonous food and brewing item. Dropped when a Spider or Cave Spider is killed by a player. + + + Used in potion brewing, mainly to create potions with a negative effect. + + + Used in potion brewing, or crafted with other items to make Eye of Ender or Magma Cream. + + + Used in potion brewing. + + + Used for making Potions and Splash Potions. + + + Can be filled with water using a bucket of water, and can then be used to fill Glass Bottles with water. + + + When thrown, will show the direction to an End Portal. When twelve of these are placed in the End Portal Frames, the End Portal will be activated. + + + Used in potion brewing. + + + Similar to Grass Blocks, but very good for growing mushrooms on. + + + Floats on water, and can be walked on. + + + Used to build Nether Fortresses. Immune to Ghast's fireballs. + + + Used in Nether Fortresses. + + + Found in Nether Fortresses, and will drop Nether Wart when broken. + + + This allows players to enchant Swords, Pickaxes, Axes, Shovels, Bows and Armor, using the player's Experience Points. + + + This can be activated using twelve Eye of Ender, and will allow the player to travel to The End dimension. + + + Used to form an End Portal. + + + A block type found in The End. It has a very high blast resistance, so is useful for building with. + + + This block is created by the defeat of the Dragon in The End. + + + When thrown, it drops Experience Orbs which increase your experience points when collected. + + + Useful for setting things on fire. + + + These are similar to a display case, and will display the item of block placed in it. + + + When thrown can spawn a creature of the type indicated. + + + Used for making long staircases. Two slabs placed on top of each other will create a normal-sized double slab block. + + + Used for making long staircases. Two slabs placed on top of each other will create a normal-sized double slab block. + + + Created by smelting Netherrack in a furnace. Can be crafted into Nether Brick blocks. + + + When powered they emit light. + + + Can be farmed to collect Cocoa Beans. + + + Mob Heads can be placed as a decoration, or worn as a mask in the helmet slot. + + + + + Squid + + + Drops ink sacs when killed. + + + Cow + + + Drops leather when killed. Can also be milked with a bucket. + + + Sheep + + + Drops wool when sheared (if it has not already been sheared). Can be dyed to make its wool a different color. + + + Chicken + + + Drops feathers when killed, and also randomly lays eggs. + + + Pig + + + Drops porkchops when killed. Can be ridden by using a saddle. + + + Wolf + + + Docile until attacked, when they will attack you back. Can be tamed using bones which causes the wolf to follow you around and attack anything that attacks you. + + + Creeper + + + Explodes if you get too close! + + + Skeleton + + + Fires arrows at you. Drops arrows when killed. + + + Spider + + + Attacks you when you are close to it. Can climb walls. Drops string when killed. + + + Zombie + + + Attacks you when you are close to it. + + + Zombie Pigman + + + Initially docile, but will attack in groups if you attack one. + + + Ghast + + + Fires flaming balls at you that explode on contact. + + + Slime + + + Split into smaller Slimes when damaged. + + + Enderman + + + Will attack you if you look at it. Can also move blocks around. + + + Silverfish + + + Attracts nearby hidden Silverfish when attacked. Hides in stone blocks. + + + Cave Spider + + + Has a venomous bite. + + + Mooshroom + + + Makes mushroom stew when used with a bowl. Drops mushrooms and becomes a normal cow when sheared. + + + Snow Golem + + + The Snow Golem can be created by players using snow blocks and a pumpkin. They will throw snowballs at their creators enemies. + + + Enderdragon + + + This is a large black dragon found in The End. + + + Blaze + + + These are enemies found in the Nether, mostly inside Nether Fortresses. They will drop Blaze Rods when killed. + + + Magma Cube + + + These can be found in The Nether. Similar to Slimes, they will break up into smaller versions when killed. + + + Villager + + + Ocelot + + + These can be found in Jungles. They can be tamed by feeding them Raw Fish. You will need to let the Ocelot approach you though, since any sudden movements will scare it away. + + + Iron Golem + + + Appear in Villages to protect them, and can be created using Iron Blocks and Pumpkins. + + + + + Explosives Animator + + + Concept Artist + + + + Number Crunching and Statistics + + + + Bully Coordinator + + + + Original Design and Code by + + + Project Manager/Producer + + + Rest of Mojang Office + + + Lead game programmer Minecraft PC + + + Ninja Coder + + + CEO + + + White Collar Worker + + + Customer Support + + + Office DJ + + + Designer/Programmer Minecraft - Pocket Edition + + + Developer + + + Chief Architect + + + Art Developer + + + Game Crafter + + + Director of Fun + + + Music and Sounds + + + Programming + + + Art + + + QA + + + Executive Producer + + + Lead Producer + + + Producer + + + Test Lead + + + Lead Tester + + + Design Team + + + Development Team + + + Release Management + + + Director, XBLA Publishing + + + Business Development + + + Portfolio Director + + + Product Manager + + + Marketing + + + Community Manager + + + Europe Localization Team + + + Redmond Localization Team + + + Asia Localization Team + + + User Research Team + + + MGS Central Teams + + + Milestone Acceptance Tester + + + Special Thanks + + + Test Manager + + + Senior Test Lead + + + SDET + + + Project STE + + + Additional STE + + + Test Associates + + + Jon Kågström + + + Tobias Möllstam + + + Risë Lugo + + + + Wooden Sword + + + + Stone Sword + + + Iron Sword + + + Diamond Sword + + + Golden Sword + + + Wooden Shovel + + + Stone Shovel + + + Iron Shovel + + + Diamond Shovel + + + Golden Shovel + + + Wooden Pickaxe + + + Stone Pickaxe + + + Iron Pickaxe + + + Diamond Pickaxe + + + Golden Pickaxe + + + Wooden Axe + + + Stone Axe + + + Iron Axe + + + Diamond Axe + + + Golden Axe + + + Wooden Hoe + + + Stone Hoe + + + Iron Hoe + + + Diamond Hoe + + + Golden Hoe + + + Wooden Door + + + Iron Door + + + Chain Helmet + + + Chain Chestplate + + + Chain Leggings + + + Chain Boots + + + Leather Cap + + + Iron Helmet + + + Diamond Helmet + + + Golden Helmet + + + Leather Tunic + + + Iron Chestplate + + + Diamond Chestplate + + + Golden Chestplate + + + Leather Pants + + + Iron Leggings + + + Diamond Leggings + + + Golden Leggings + + + Leather Boots + + + Iron Boots + + + Diamond Boots + + + Golden Boots + + + Iron Ingot + + + Gold Ingot + + + Bucket + + + Water Bucket + + + Lava Bucket + + + Flint and Steel + + + Apple + + + Bow + + + Arrow + + + Coal + + + Charcoal + + + Diamond + + + Stick + + + Bowl + + + Mushroom Stew + + + String + + + Feather + + + Gunpowder + + + Wheat Seeds + + + Wheat + + + Bread + + + Flint + + + Raw Porkchop + + + Cooked Porkchop + + + Painting + + + Golden Apple + + + Sign + + + Minecart + + + Saddle + + + Redstone + + + Snowball + + + Boat + + + Leather + + + Milk Bucket + + + Brick + + + Clay + + + Sugar Canes + + + Paper + + + Book + + + Slimeball + + + Minecart with Chest + + + Minecart with Furnace + + + Egg + + + Compass + + + Fishing Rod + + + Clock + + + Glowstone Dust + + + Raw Fish + + + Cooked Fish + + + Dye Powder + + + Ink Sac + + + Rose Red + + + Cactus Green + + + Cocoa Beans + + + Lapis Lazuli + + + Purple Dye + + + Cyan Dye + + + Light Gray Dye + + + Gray Dye + + + Pink Dye + + + Lime Dye + + + Dandelion Yellow + + + Light Blue Dye + + + Magenta Dye + + + Orange Dye + + + Bone Meal + + + Bone + + + Sugar + + + Cake + + + Bed + + + Redstone Repeater + + + Cookie + + + Map + + + Music Disc - "13" + + + Music Disc - "cat" + + + Music Disc - "blocks" + + + Music Disc - "chirp" + + + Music Disc - "far" + + + Music Disc - "mall" + + + Music Disc - "mellohi" + + + Music Disc - "stal" + + + Music Disc - "strad" + + + Music Disc - "ward" + + + Music Disc - "11" + + + Music Disc - "where are we now" + + + Shears + + + Pumpkin Seeds + + + Melon Seeds + + + Raw Chicken + + + Cooked Chicken + + + Raw Beef + + + Steak + + + Rotten Flesh + + + Ender Pearl + + + Melon Slice + + + Blaze Rod + + + Ghast Tear + + + Gold Nugget + + + Nether Wart + + + {*splash*}{*prefix*}Potion {*postfix*} + + + Glass Bottle + + + Water Bottle + + + Spider Eye + + + Fermented Spider Eye + + + Blaze Powder + + + Magma Cream + + + Brewing Stand + + + Cauldron + + + Eye of Ender + + + Glistering Melon + + + Bottle o' Enchanting + + + Fire Charge + + + Fire Charge (Charcoal) + + + Fire Charge (Coal) + + + Item Frame + + + Spawn {*CREATURE*} + + + Nether Brick + + + Skull + + + Skeleton Skull + + + Wither Skeleton Skull + + + Zombie Head + + + Head + + + %s's Head + + + Creeper Head + + + + Stone + + + Grass Block + + + Dirt + + + Cobblestone + + + Oak Wood Planks + + + Spruce Wood Planks + + + Birch Wood Planks + + + Jungle Wood Planks + + + Sapling + + + Oak Sapling + + + Spruce Sapling + + + Birch Sapling + + + Jungle Tree Sapling + + + Bedrock + + + Water + + + Lava + + + Sand + + + Sandstone + + + Gravel + + + Gold Ore + + + Iron Ore + + + Coal Ore + + + Wood + + + Oak Wood + + + Spruce Wood + + + Birch Wood + + + Jungle Wood + + + Oak + + + Spruce + + + Birch + + + Leaves + + + Oak Leaves + + + Spruce Leaves + + + Birch Leaves + + + Jungle Leaves + + + Sponge + + + Glass + + + Wool + + + Black Wool + + + Red Wool + + + Green Wool + + + Brown Wool + + + Blue Wool + + + Purple Wool + + + Cyan Wool + + + Light Gray Wool + + + Gray Wool + + + Pink Wool + + + Lime Wool + + + Yellow Wool + + + Light Blue Wool + + + Magenta Wool + + + Orange Wool + + + White Wool + + + Flower + + + Rose + + + Mushroom + + + Block of Gold + + + Block of Iron + + + Stone Slab + + + Stone Slab + + + Sandstone Slab + + + Oak Wood Slab + + + Cobblestone Slab + + + Bricks Slab + + + Stone Bricks Slab + + + Oak Wood Slab + + + Spruce Wood Slab + + + Birch Wood Slab + + + Jungle Wood Slab + + + Nether Brick Slab + + + Bricks + + + TNT + + + Bookshelf + + + Moss Stone + + + Obsidian + + + Torch + + + + Torch (Coal) + + + Torch (Charcoal) + + + Fire + + + Monster Spawner + + + Oak Wood Stairs + + + Chest + + + Redstone Dust + + + Diamond Ore + + + Block of Diamond + + + Crafting Table + + + Crops + + + Farmland + + + Furnace + + + Sign + + + Wooden Door + + + Ladder + + + Rail + + + Powered Rail + + + Detector Rail + + + Stone Stairs + + + Lever + + + Pressure Plate + + + Iron Door + + + Redstone Ore + + + Redstone Torch + + + Button + + + Snow + + + Ice + + + Cactus + + + Clay + + + Sugar Cane + + + Jukebox + + + Fence + + + Pumpkin + + + Jack-O-Lantern + + + Netherrack + + + Soul Sand + + + Glowstone + + + Portal + + + Lapis Lazuli Ore + + + Lapis Lazuli Block + + + Dispenser + + + Note Block + + + Cake + + + Bed + + + Web + + + Tall Grass + + + Dead Bush + + + Diode + + + Locked Chest + + + Trapdoor + + + Wool (any color) + + + Piston + + + Sticky Piston + + + Silverfish Block + + + Stone Bricks + + + Mossy Stone Bricks + + + Cracked Stone Bricks + + + Chiseled Stone Bricks + + + Mushroom + + + Mushroom + + + Iron Bars + + + Glass Pane + + + Melon + + + Pumpkin Stem + + + Melon Stem + + + Vines + + + Fence Gate + + + Brick Stairs + + + Stone Brick Stairs + + + Silverfish Stone + + + Silverfish Cobblestone + + + Silverfish Stone Brick + + + Mycelium + + + Lily Pad + + + Nether Brick + + + Nether Brick Fence + + + Nether Brick Stairs + + + Nether Wart + + + Enchantment Table + + + Brewing Stand + + + Cauldron + + + End Portal + + + End Portal Frame + + + End Stone + + + Dragon Egg + + + Shrub + + + Fern + + + Sandstone Stairs + + + Spruce Wood Stairs + + + Birch Wood Stairs + + + Jungle Wood Stairs + + + Redstone Lamp + + + Cocoa + + + Skull + + + + + Current Controls + + + Layout + + + Move/Sprint + + + Look + + + Pause + + + Jump + + + Jump/Fly Up + + + Inventory + + + Cycle Held Item + + + Action + + + Use + + + Crafting + + + Drop + + + Sneak + + + Sneak/Fly Down + + + Change Camera Mode + + + Players/Invite + + + Movement (When Flying) + + + Layout 1 + + + Layout 2 + + + Layout 3 + + + ]]> + + + ]]> + + + ]]> + + + ]]> + + + ]]> + + + ]]> + + + ]]> + + + ]]> + + + ]]> + + + ]]> + + + ]]> + + + ]]> + + + ]]> + + + ]]> + + + ]]> + + + ]]> + + + ]]> + + + ]]> + + + + ]]> + + + ]]> + + + + + {*B*}Press{*CONTROLLER_VK_A*} to continue. + + + {*B*}Press{*CONTROLLER_VK_A*} to start the tutorial.{*B*} + Press{*CONTROLLER_VK_B*} if you think you are ready to play on your own. + + + + Minecraft is a game about placing blocks to build anything you can imagine. +At night monsters come out, make sure to build a shelter before that happens. + + + Use{*CONTROLLER_ACTION_LOOK*} to look up, down and around. + + + Use{*CONTROLLER_ACTION_MOVE*} to move around. + + + To sprint, push{*CONTROLLER_ACTION_MOVE*} forward twice quickly. While you hold{*CONTROLLER_ACTION_MOVE*} forward, the character will continue to sprint unless they run out of sprint time or food. + + + Press{*CONTROLLER_ACTION_JUMP*} to jump. + + + Hold{*CONTROLLER_ACTION_ACTION*} to mine and chop using your hand or whatever you are holding. You may need to craft a tool to mine some blocks... + + + Hold{*CONTROLLER_ACTION_ACTION*} to chop down 4 blocks of wood (tree trunks).{*B*}When a block breaks you can pick it up by standing near to the floating item that appears, causing it to appear in your inventory. + + + Press{*CONTROLLER_ACTION_CRAFTING*} to open the crafting interface. + + + As you collect and craft more items, your inventory will fill up.{*B*} + Press{*CONTROLLER_ACTION_INVENTORY*} to open the inventory. + + + As you move around, mine and attack, you will deplete your food bar{*ICON_SHANK_01*}. Sprinting and sprint jumping use a lot more food than walking and jumping normally. + + + If you lose some health, but have a food bar with 9 or more{*ICON_SHANK_01*} in it, your health will automatically replenish. Eating food will replenish your food bar. + + + With a food item in your hand, hold{*CONTROLLER_ACTION_USE*} to eat it and replenish your food bar. You cannot eat if your food bar is full. + + + Your food bar is low, and you have lost some health. Eat the steak in your inventory to replenish your food bar and start healing.{*ICON*}364{*/ICON*} + + + The wood that you have collected can be crafted into planks. Open the crafting interface to craft them.{*PlanksIcon*} + + + A lot of crafting can involve multiple steps. Now that you have some planks there are more items that you can craft. Create a crafting table.{*CraftingTableIcon*} + + + To make collecting blocks faster you can build tools designed for the job. Some tools have a handle made of sticks. Craft some sticks now.{*SticksIcon*} + + + Use{*CONTROLLER_ACTION_LEFT_SCROLL*} and{*CONTROLLER_ACTION_RIGHT_SCROLL*} to change the current held item. + + + Use{*CONTROLLER_ACTION_USE*} to use items, interact with objects and place some items. Items that have been placed can be picked up again by mining them with the right tool. + + + With the crafting table selected, point the crosshair where you want it and use{*CONTROLLER_ACTION_USE*} to place a crafting table. + + + Point the crosshair at the crafting table and press{*CONTROLLER_ACTION_USE*} to open it. + + + A shovel helps dig soft blocks, like dirt and snow, faster. As you collect more materials you can craft tools that work faster and last longer. Create a wooden shovel.{*WoodenShovelIcon*} + + + An axe helps chop wood and wooden tiles, faster. As you collect more materials you can craft tools that work faster and last longer. Create a wooden axe.{*WoodenHatchetIcon*} + + + A pickaxe helps dig hard blocks, like stone and ore, faster. As you collect more materials you can craft tools that work faster and last longer, and allow you to mine harder materials. Create a wooden pickaxe.{*WoodenPickaxeIcon*} + + + Open the container + + + + Night time can approach quickly, and it is dangerous to be outside unprepared. You can craft armor and weapons, but it is sensible to have a safe shelter. + + + + + Nearby there is an abandoned Miner's shelter that you can complete to be safe overnight. + + + + + You will need to collect the resources to complete the shelter. Walls and roof can be made of any tile type, but you will want to create a door, some windows and lighting. + + + + Use your pickaxe to mine some stone blocks. Stone blocks will produce cobblestone when mined. If you collect 8 cobblestone blocks you can build a furnace. You may need to dig through some dirt to reach the stone, so use your shovel for this.{*StoneIcon*} + + + You have collected enough cobblestone to build a furnace. Use your crafting table to create one. + + + Use{*CONTROLLER_ACTION_USE*} to place the furnace in the world, and then open it. + + + Use the furnace to create some charcoal. If you are waiting for it to finish how about using the time to collect more materials to finish the shelter? + + + Use the furnace to create some glass. If you are waiting for it to finish how about using the time to collect more materials to finish the shelter? + + + A good shelter will have a door so that you can easily go in and out without having to mine and replace the walls. Craft a wooden door now.{*WoodenDoorIcon*} + + + Use{*CONTROLLER_ACTION_USE*} to place the door. You can use{*CONTROLLER_ACTION_USE*} to open and close a wooden door in the world. + + + It can get very dark at night, so you will want some lighting inside your shelter so that you can see. Craft a torch now from sticks and charcoal using the crafting interface.{*TorchIcon*} + + + + You have completed the first part of the tutorial. + + + + + {*B*} + Press{*CONTROLLER_VK_A*} to continue with the tutorial.{*B*} + Press{*CONTROLLER_VK_B*} if you think you are ready to play on your own. + + + + + + This is your inventory. It shows items available for use in your hand, and all the other items that you are carrying. Your armor is also shown here. + + + + {*B*} + Press{*CONTROLLER_VK_A*} to continue.{*B*} + Press{*CONTROLLER_VK_B*} if you already know how to use the inventory. + + + + + Use{*CONTROLLER_MENU_NAVIGATE*} to move the pointer. Use{*CONTROLLER_VK_A*} to pick an item under the pointer. + If there is more than one item here this will pick them all up, or you can use{*CONTROLLER_VK_X*} to pick up just half of them. + + + + + Move this item with the pointer over another space in the inventory and place it down using{*CONTROLLER_VK_A*}. + With multiple items on the pointer, use{*CONTROLLER_VK_A*} to place them all, or{*CONTROLLER_VK_X*} to place just one. + + + + + If you move the pointer outside the edge of the interface with an item on the pointer, you can drop the item. + + + + + If you want more information about an item, move the pointer over the item and press{*CONTROLLER_VK_RT*} . + + + + + Press{*CONTROLLER_VK_B*} now to exit the inventory. + + + + + + + + This is the creative mode inventory. It shows items available for use in your hand, and all the other items that you can choose from. + + + + {*B*} + Press{*CONTROLLER_VK_A*} to continue.{*B*} + Press{*CONTROLLER_VK_B*} if you already know how to use the creative mode inventory. + + + + + Use{*CONTROLLER_MENU_NAVIGATE*} to move the pointer. + When on the item list, use{*CONTROLLER_VK_A*} to pick an item under the pointer, and use{*CONTROLLER_VK_Y*} to pick up a full stack of that item. + + + + + The pointer will automatically move over a space in the use row. You can place it down using{*CONTROLLER_VK_A*}. Once you have placed the item, the pointer will return to the item list where you can select another item. + + + + + If you move the pointer outside the edge of the interface with an item on the pointer, you can drop the item into the world. To clear all items in the quick select bar, press{*CONTROLLER_VK_X*}. + + + + + Scroll through the Group Type tabs at the top using{*CONTROLLER_VK_LB*} and{*CONTROLLER_VK_RB*} to select the group type of the item you wish to pickup. + + + + + If you want more information about an item, move the pointer over the item and press{*CONTROLLER_VK_RT*} . + + + + + Press{*CONTROLLER_VK_B*} now to exit the creative mode inventory. + + + + + + This is the crafting interface. This interface allows you to combine the items you've collected to make new items. + + + + {*B*} + Press{*CONTROLLER_VK_A*} to continue.{*B*} + Press{*CONTROLLER_VK_B*} if you already know how to craft. + + + + {*B*} + Press{*CONTROLLER_VK_X*} to show the item description. + + + + {*B*} + Press{*CONTROLLER_VK_X*} to show the ingredients required to make the current item. + + + + {*B*} + Press{*CONTROLLER_VK_X*} to show the inventory again. + + + + + Scroll through the Group Type tabs at the top using{*CONTROLLER_VK_LB*} and{*CONTROLLER_VK_RB*} to select the group type of the item you wish to craft, then use{*CONTROLLER_MENU_NAVIGATE*} to select the item to craft. + + + + + The crafting area shows the items you require in order to craft the new item. Press{*CONTROLLER_VK_A*} to craft the item and place it in your inventory. + + + + + You can craft a larger selection of items using a crafting table. Crafting on a table works in the same way as basic crafting, but you have a larger crafting area allowing more combinations of ingredients. + + + + + The bottom right part of the crafting interface shows your inventory. This area can also show a description of the currently selected item, and the ingredients required to craft it. + + + + + The description of the currently selected item is now displayed. The description can give you an idea of what the item can be used for. + + + + + The list of ingredients required to craft the selected item are now displayed. + + + + The wood that you have collected can be crafted into planks. Select the planks icon and press{*CONTROLLER_VK_A*} to create them.{*PlanksIcon*} + + + + Now you have built a crafting table you should place it in the world to enable you to build a larger selection of items.{*B*} + Press{*CONTROLLER_VK_B*} now to exit the crafting interface. + + + + + Press{*CONTROLLER_VK_LB*} and{*CONTROLLER_VK_RB*} to change to the group type of the items you wish to craft. Select the tools group.{*ToolsIcon*} + + + + + Press{*CONTROLLER_VK_LB*} and{*CONTROLLER_VK_RB*} to change to the group type of the items you wish to craft. Select the structures group.{*StructuresIcon*} + + + + + Use{*CONTROLLER_MENU_NAVIGATE*} to change to the item you wish to craft. Some items have multiple versions depending on the materials used. Select the wooden shovel.{*WoodenShovelIcon*} + + + + + A lot of crafting can involve multiple steps. Now that you have some planks there are more items that you can craft. Use{*CONTROLLER_MENU_NAVIGATE*} to change to the item you wish to craft. Select the crafting table.{*CraftingTableIcon*} + + + + + With the tools you have built you are off to a great start, and are able to collect a variety of different materials more efficiently.{*B*} + Press{*CONTROLLER_VK_B*} now to exit the crafting interface. + + + + + Some items can not be created using the crafting table, but require a furnace. Craft a furnace now.{*FurnaceIcon*} + + + + + Place the furnace you have crafted in the world. You will want to put this inside your shelter.{*B*} + Press{*CONTROLLER_VK_B*} now to exit the crafting interface. + + + + + + This is the furnace interface. A furnace allows you to change items by firing them. For example, you can turn iron ore into iron ingots in the furnace. + + + + {*B*} + Press{*CONTROLLER_VK_A*} to continue.{*B*} + Press{*CONTROLLER_VK_B*} if you already know how to use a furnace. + + + + + You need to put some fuel into the bottom slot of the furnace, and the item to be changed in the top slot. The furnace will then fire up and start working, putting the result in the right-hand slot. + + + + + Many wooden items can be used as fuels, but not everything burns for the same time. You may also discover other items in the world that can be used as a fuel. + + + + + When your items have been fired, you can move them from the output area into your inventory. You should experiment with different ingredients to see what you can make. + + + + + If you use wood as the ingredient then you can make charcoal. Put some fuel in the furnace and wood in the ingredient slot. It can take some time for the furnace to create the charcoal, so feel free to do something else and come back to check the progress. + + + + + Charcoal can be used as a fuel, as well as being crafted into a torch with a stick. + + + + + Placing sand in the ingredient slot allows you to make glass. Create some glass blocks to use as windows in your shelter. + + + + + + This is the brewing interface. You can use this to create potions that have a variety of different effects. + + + + {*B*} + Press{*CONTROLLER_VK_A*} to continue.{*B*} + Press{*CONTROLLER_VK_B*} if you already know how to use the brewing stand. + + + + + You brew potions by placing an ingredient in the top slot, and a potion or water bottle in the bottom slots (up to 3 can be brewed at one time). Once a valid combination is entered the brewing process will start and create the potion after a short time. + + + + + All potions start with a Water Bottle. Most potions are created by first using a Nether Wart to make an Awkward Potion, and will require at least one more ingredient to make the final potion. + + + + + Once you have a potion you can modify its effects. Adding Redstone Dust increases the duration of its effect and adding Glowstone Dust can make its effect more powerful. + + + + + Adding Fermented Spider Eye corrupts the potion and can turn it into a potion with the opposite effect, and adding Gunpowder turns the potion into a Splash Potion which can be thrown to apply its affect to a nearby area. + + + + + Create a Potion of Fire Resistance by first adding Nether Wart to a Water Bottle, and then adding Magma Cream. + + + + + Press{*CONTROLLER_VK_B*} now to exit the brewing interface. + + + + + + In this area there is a Brewing Stand, a Cauldron and a chest full of items for brewing. + + + + {*B*} + Press{*CONTROLLER_VK_A*} to learn more about brewing and potions.{*B*} + Press{*CONTROLLER_VK_B*} if you already know about brewing and potions. + + + + + The first step in brewing a potion is to create a Water Bottle. Take a Glass Bottle from the chest. + + + + + You can fill a glass bottle from a Cauldron that has water in it, or from a block of water. Fill your glass bottle now by pointing at a water source and pressing{*CONTROLLER_ACTION_USE*}. + + + + + If a cauldron becomes empty, you can refill it with a Water Bucket. + + + + + Use the Brewing Stand to create a Potion of Fire Resistance. You will need a Water Bottle, Nether Wart and Magma Cream. + + + + + With a potion in your hand, hold{*CONTROLLER_ACTION_USE*} to use it. For a normal potion you will drink it and apply the effect to yourself, and for a Splash potion you will throw it and apply the effect to creatures near where it hits. + Splash potions can be created by adding gunpowder to normal potions. + + + + + Use your Potion of Fire Resistance on yourself. + + + + + Now that you are resistant to fire and lava, you should see if there are places you can get to that you couldn't before. + + + + + + This is the enchanting interface which you can use to add enchantments to weapons, armor and some tools. + + + + {*B*} + Press{*CONTROLLER_VK_A*} to learn more about the enchanting interface.{*B*} + Press{*CONTROLLER_VK_B*} if you already know about the enchanting interface. + + + + + To enchant an item, first place it in the enchanting slot. Weapons, armor and some tools can be enchanted to add special effects such as improved damage resistance or increasing the number of items produced when mining a block. + + + + + When an item is placed in the enchanting slot, the buttons on the right will change to show a selection of random enchantments. + + + + + The number on the button represents the cost in experience levels to apply that enchantment to the item. If you do not have a high enough level the button will be disabled. + + + + + Select an enchantment and press{*CONTROLLER_VK_A*} to enchant the item. This will decrease your experience level by the cost of the enchantment. + + + + + Although the enchantments are all random, some of the better enchantments are only available when you have a high experience level and have lots of bookcases around the Enchantment Table to increase its power. + + + + + + In this area there is an Enchantment Table and some other items to help you learn about enchanting. + + + + {*B*} + Press{*CONTROLLER_VK_A*} to learn more about the enchanting.{*B*} + Press{*CONTROLLER_VK_B*} if you already know about the enchanting. + + + + + Using an Enchantment Table allows you to add special effects such as increasing the number of items produced when mining a block, or improved damage resistance for weapons, armor and some tools. + + + + + Placing bookcases around the Enchantment Table increases its power and allows access to higher level enchantments. + + + + + Enchanting items costs Experience Levels, which can be built up by collecting Experience Orbs which are produced by killing monsters and animals, mining ores, breeding animals, fishing and smelting/cooking some things in a furnace. + + + + + You can also build experience levels using a Bottle O' Enchanting, which, when thrown, creates Experience Orbs around where it lands. These orbs can then be collected. + + + + + In the chests in this area you can find some enchanted items, Bottles O' Enchanting, and some items that have yet to be enchanted for you to experiment with at the Enchantment Table. + + + + + + You are now riding in a minecart. To exit the minecart, point the cursor at it and press{*CONTROLLER_ACTION_USE*} .{*MinecartIcon*} + + + + {*B*} + Press{*CONTROLLER_VK_A*} to learn more about minecarts.{*B*} + Press{*CONTROLLER_VK_B*} if you already know about minecarts. + + + + + A minecart runs on rails. You can also craft a powered minecart with a furnace and a minecart with a chest in it. + {*RailIcon*} + + + + + You can also craft powered rails, which take power from redstone torches and circuits to accelerate the cart. These can be connected to switches, levers and pressure plates to make complex systems. + {*PoweredRailIcon*} + + + + + + You are now sailing a boat. To exit the boat, point the cursor at it and press{*CONTROLLER_ACTION_USE*} .{*BoatIcon*} + + + + + {*B*} + Press{*CONTROLLER_VK_A*} to learn more about boats.{*B*} + Press{*CONTROLLER_VK_B*} if you already know about boats. + + + + + A boat allows you to travel quicker over water. You can steer it using{*CONTROLLER_ACTION_MOVE*} and{*CONTROLLER_ACTION_LOOK*}. + {*BoatIcon*} + + + + + + You are now using a fishing rod. Press{*CONTROLLER_ACTION_USE*} to use it.{*FishingRodIcon*} + + + + + {*B*} + Press{*CONTROLLER_VK_A*} to learn more about fishing.{*B*} + Press{*CONTROLLER_VK_B*} if you already know about fishing. + + + + + Press{*CONTROLLER_ACTION_USE*} to cast your line and start fishing. Press{*CONTROLLER_ACTION_USE*} again to reel in the fishing line. + {*FishingRodIcon*} + + + + + If you wait until the float sinks below the surface of the water before reeling in you can catch a fish. Fish can be eaten raw, or cooked by a furnace, to restore health. + {*FishIcon*} + + + + + As with many other tools a fishing rod has a fixed number of uses. Those uses are not limited to catching fish though. You should experiment with it to see what else can be caught or activated... + {*FishingRodIcon*} + + + + + + This is a bed. Press{*CONTROLLER_ACTION_USE*} while pointing at it at night to sleep through the night and awake in the morning.{*ICON*}355{*/ICON*} + + + + + {*B*} + Press{*CONTROLLER_VK_A*} to learn more about beds.{*B*} + Press{*CONTROLLER_VK_B*} if you already know about beds. + + + + + A bed should be placed in a safe, well-lit place so that monsters do not wake you in the middle of the night. Once you have used a bed, if you die you will respawn at that bed. + {*ICON*}355{*/ICON*} + + + + + If there are other players in your game, everyone must be in a bed at the same time to be able to sleep. + {*ICON*}355{*/ICON*} + + + + + + In this area there are some simple Redstone and Piston circuits, and a chest with more items to extend these circuits. + + + + + {*B*} + Press{*CONTROLLER_VK_A*} to learn more about Redstone circuits and Pistons.{*B*} + Press{*CONTROLLER_VK_B*} if you already know about Redstone circuits and Pistons. + + + + + Levers, Buttons, Pressure Plates and Redstone Torches can all provide power to circuits, either by directly attaching them to the item you want to activate or by connecting them with Redstone dust. + + + + + The position and direction that you place a power source can change how it affects the surrounding blocks. For example a Redstone torch on the side of a block can be turned off if the block is powered by another source. + + + + + Redstone dust is collected by mining redstone ore with a pickaxe made of Iron, Diamond or Gold. You can use it to carry power up to 15 blocks, and it can travel up or down one block in height. + {*ICON*}331{*/ICON*} + + + + + Redstone repeaters can be used to extend the distance that the power is carried, or put a delay in a circuit. + {*ICON*}356{*/ICON*} + + + + + When powered, a Piston will extend, pushing up to 12 blocks. When they retract, Sticky Pistons can pull back one block of most types. + {*ICON*}33{*/ICON*} + + + + + In the chest in this area there are some components for making circuits with pistons. Try using or completing the circuits in this area, or put together your own. There are more examples outside the tutorial area. + + + + + + In this area there is a Portal to the Nether! + + + + + {*B*} + Press{*CONTROLLER_VK_A*} to learn more about Portals and The Nether.{*B*} + Press{*CONTROLLER_VK_B*} if you already know about Portals and The Nether. + + + + + Portals are created by placing Obsidian blocks into a frame four blocks wide and five blocks tall. The corner blocks are not required. + + + + + To activate a Nether Portal, set fire to the Obisidian blocks inside the frame with a Flint and Steel. Portals can be deactivated if their frame is broken, an explosion happens nearby or a liquid flows through them. + + + + + To use a Nether Portal, stand inside it. Your screen will go purple and a sound will play. After a few seconds you will be transported to another dimension. + + + + + The Nether can be a dangerous place, full of lava, but can be useful to collect Netherrack which burns forever when lit, and Glowstone which produces light. + + + + + The Nether world can be used to fast-travel in the Overworld - traveling one block distance in the Nether is equivalent to traveling 3 blocks in the Overworld. + + + + + + You are now in Creative mode. + + + + + {*B*} + Press{*CONTROLLER_VK_A*} to learn more about Creative mode.{*B*} + Press{*CONTROLLER_VK_B*} if you already know about Creative mode. + + + + When in Creative mode you have in infinite number of all available items and blocks, you can destroy blocks with one click without a tool, you are invulnerable and you can fly. + + + Pressing{*CONTROLLER_ACTION_JUMP*} twice quickly will allow you to fly. To exit flying, repeat the action. To fly faster, push{*CONTROLLER_ACTION_MOVE*} forward twice in rapid succession while flying. +When in flying mode, you can hold down{*CONTROLLER_ACTION_JUMP*} to move up and{*CONTROLLER_ACTION_SNEAK*} to move down, or use the D-pad to move up, down, left or right. + + + Press{*CONTROLLER_ACTION_CRAFTING*} to open the creative inventory interface. + + + Make your way to the opposite side of this hole to continue. + + + You have now completed the Creative mode tutorial. + + + + + In this area a farm has been set up. Farming enables you to create a renewable source of food and other items. + + + + + {*B*} + Press{*CONTROLLER_VK_A*} to learn more about farming.{*B*} + Press{*CONTROLLER_VK_B*} if you already know about farming. + + + + Wheat, Pumpkins and Melons are grown from seeds. Wheat seeds are collected by breaking Tall Grass or harvesting wheat, and Pumpkin and Melon seeds are crafted from Pumpkins and Melons respectively. + + + Before planting seeds the dirt blocks need to be turned into Farmland by using a Hoe. A nearby source of water will help keep the Farmland hydrated and make the crops grow faster, as will keeping the area lit. + + + Wheat goes through several stages when growing, and is ready to be harvested when it appears darker.{*ICON*}59:7{*/ICON*} + + + Pumpkins and Melons also need a block next to where you planted the seed for the fruit to grow once the stem has fully grown. + + + Sugarcane must be planted on a Grass, Dirt or Sand block that is right next to water block. Chopping a Sugarcane block will also drop all blocks that are above it.{*ICON*}83{*/ICON*} + + + Cacti must be planted on Sand, and will grow up to three blocks high. Like Sugarcane, destroying the lowest block will also allow you to collect the blocks that are above it.{*ICON*}81{*/ICON*} + + + Mushrooms should be planted in a dimly lit area, and will spread to nearby dimly lit blocks.{*ICON*}39{*/ICON*} + + + Bonemeal can be used to grow crops to their fully grown state, or grow Mushrooms into Huge Mushrooms.{*ICON*}351:15{*/ICON*} + + + You have now completed the farming tutorial. + + + + + In this area animals have been penned in. You can breed animals to produce baby versions of themselves. + + + + + {*B*} + Press{*CONTROLLER_VK_A*} to learn more about breeding.{*B*} + Press{*CONTROLLER_VK_B*} if you already know about breeding. + + + + To get the animals to breed, you will need to feed them with the right food to get them to go into 'Love Mode'. + + + Feed Wheat to a cow, mooshroom, pig or sheep, Wheat Seeds or Nether Wart to a chicken, or any kind of meat to a wolf, and they'll start looking for another animal of the same species near them that is also in Love Mode. + + + When two animals of the same species meet, and both are in Love Mode, they will kiss for a few seconds, and then a baby animal will appear. The baby animal will follow their parents for a while before growing into a full sized animal itself. + + + After being in Love Mode, an animal will not be able to enter it again for about five minutes. + + + Some animals will follow you if you are holding Wheat in your hand. This makes it easier to group animals together to breed them.{*ICON*}296{*/ICON*} + + + You have now completed the breeding tutorial. + + + + + In this area are some pumpkins and blocks to make a Snow Golem and an Iron Golem. + + + + + {*B*} + Press{*CONTROLLER_VK_A*} to learn more about Golems.{*B*} + Press{*CONTROLLER_VK_B*} if you already know about Golems. + + + + Golems are created by placing a pumpkin on top of a stack of blocks. + + + Snow Golems are created with two Snow Blocks, one of top of the other, with a pumpkin on top. Snow Golems throw snowballs at your enemies. + + + Iron Golems are created with four Iron Blocks in the pattern shown, with a pumpkin on top of the middle block. Iron Golems attack your enemies. + + + Iron Golems also appear naturally to protect villages, and will attack you if you attack any villagers. + + + + You cannot leave this area until you have completed the tutorial. + + + + Different tools are better for different materials. You should use a shovel to mine soft materials like earth and sand. + + + Different tools are better for different materials. You should use an axe to chop tree trunks. + + + Different tools are better for different materials. You should use a pickaxe to mine stone and ore. You may need to make your pickaxe from better materials to get resources from some blocks. + + + Certain tools are better for attacking enemies. Consider using a sword to attack. + + + Hint: Hold {*CONTROLLER_ACTION_ACTION*}to mine and chop using your hand or whatever you are holding. You may need to craft a tool to mine some blocks... + + + The tool you are using has become damaged. Every time you use a tool it becomes damaged, and will eventually break. The colored bar below the item in your inventory shows the current damage state. + + + Hold{*CONTROLLER_ACTION_JUMP*} to swim up. + + + In this area there is a minecart on a track. To enter the minecart, point the cursor at it and press{*CONTROLLER_ACTION_USE*}. Use{*CONTROLLER_ACTION_USE*} on the button to make the minecart move. + + + In the chest beside the river there is a boat. To use the boat, point the cursor at water and press{*CONTROLLER_ACTION_USE*}. Use{*CONTROLLER_ACTION_USE*} while pointing at the boat to enter it. + + + In the chest beside the pond there is a fishing rod. Take the fishing rod from the chest and select it as the current item in your hand to use it. + + + This more advanced piston mechanism creates a self-repairing bridge! Push the button to activate, then investigate how the components interact to learn more. + + + + If you move the pointer outside of the interface while carrying an item, you can drop that item. + + + + You do not have all the ingredients required to make this item. The box on the bottom left shows the ingredients required to craft this. + + + + + Congratulations, you have completed the tutorial. Time in the game is now passing normally, and you don't have long until night time and the monsters come out! Finish your shelter! + + + + {*EXIT_PICTURE*} When you are ready to explore further, there is a doorway in this area near the Miner's shelter that leads to a small castle. + + + Reminder: + + + + ]]> + + + + + New features have been added to the game in the latest version, including new areas in the tutorial world. + + + {*B*}Press{*CONTROLLER_VK_A*} to play through the tutorial as normal.{*B*} + Press{*CONTROLLER_VK_B*} to skip the main tutorial. + + + In this area you will find areas setup to help you learn about fishing, boats, pistons and redstone. + + + Outside of this area you will find examples of buildings, farming, minecarts and tracks, enchanting, brewing and more! + + + + + Your food bar has depleted to a level where you will no longer heal. + + + + + {*B*} + Press{*CONTROLLER_VK_A*} to learn more about the food bar and eating food.{*B*} + Press{*CONTROLLER_VK_B*} if you already know about the food bar and eating food. + + + + + Select + + + Use + + + Back + + + Exit + + + Cancel + + + Cancel Join + + + Select Storage Device + + + Change Storage Device + + + Refresh Online Games List + + + Party Games + + + All Games + + + Change Group + + + Show Inventory + + + Show Description + + + Show Ingredients + + + Crafting + + + Create + + + Take/Place + + + Take + + + Take All + + + Take Half + + + Place + + + Place All + + + Place One + + + Drop + + + Drop All + + + Drop One + + + Swap + + + Quick Move + + + Clear Quick Select + + + What's This? + + + Share To Facebook + + + Change Filter + + + View Gamer Card + + + View Gamer Profile + + + Send Friend Request + + + Page Down + + + Page Up + + + Next + + + Previous + + + Kick Player + + + Dye + + + Mine + + + Feed + + + Tame + + + Heal + + + Sit + + + Follow Me + + + Eject + + + Empty + + + Saddle + + + Place + + + Hit + + + Milk + + + Collect + + + Eat + + + Sleep + + + Wake Up + + + Play + + + Ride + + + Sail + + + Grow + + + Swim Up + + + Open + + + Change Pitch + + + Detonate + + + Read + + + Hang + + + Throw + + + Plant + + + Till + + + Harvest + + + Continue + + + Unlock Full Game + + + Delete Save + + + Delete + + + Options + + + Invite Xbox LIVE Party + + + Invite Friends + + + Accept + + + Shear + + + Ban Level + + + Select Skin + + + Ignite + + + Navigate + + + Install Full Version + + + Install Trial Version + + + Install + + + Reinstall + + + + Save Options + + + Execute Command + + + Creative + + + Move Ingredient + + + Move Fuel + + + Move Tool + + + Move Armor + + + Move Weapon + + + + Equip + + + Draw + + + Release + + + Privileges + + + Block + + + Page Up + + + Page Down + + + Love Mode + + + Drink + + + Rotate + + + + OK + + + Cancel + + + Minecraft Store + + + + Are you sure you want to leave your current game and join the new one? Any unsaved progress will be lost. + + + Exit Game + + + + Save Game + + + Exit Without Saving + + + + Are you sure you want to overwrite any previous save for this world with the current version of this world? + + + Are you sure you want to exit without saving? You will lose all progress in this world! + + + + Start Game + + + If you create, load or save a world in Creative Mode, that world will have achievements and leaderboard updates disabled, even if it is then loaded in Survival Mode. Are you sure you want to continue? + + + This world has previously been saved in Creative Mode, and it will have achievements and leaderboard updates disabled. Are you sure you want to continue? + + + This world has previously been saved in Creative Mode, and it will have achievements and leaderboard updates disabled. + + + If you create, load or save a world with Host Privileges enabled, that world will have achievements and leaderboard updates disabled, even if it is then loaded with those options off. Are you sure you want to continue? + + + + Damaged Save + + + This save is corrupt or damaged. Would you like to delete it? + + + + Are you sure you want to exit to the main menu and disconnect all players from the game? Any unsaved progress will be lost. + + + + Exit and save + + + Exit without saving + + + + Are you sure you want to exit to the main menu? Any unsaved progress will be lost. + + + Are you sure you want to exit to the main menu? Your progress will be lost! + + + Create New World + + + Play Tutorial + + + Tutorial + + + Name Your World + + + + Enter a name for your world + + + Input the seed for your world generation + + + + Load Saved World + + + Press START to join game + + + + Exiting the game + + + + An error occurred. Exiting to the main menu. + + + + Connection failed + + + Connection lost + + + + Connection to the server was lost. Exiting to the main menu. + + + Connection to Xbox LIVE was lost. Exiting to the main menu. + + + Connection to Xbox LIVE was lost. + + + + Disconnected by the server + + + You were kicked from the game + + + You were kicked from the game for flying + + + Connection attempt took too long + + + The server is full + + + The host has exited the game. + + + You cannot join this game as you are not friends with anybody in the game. + + + You cannot join this game as you have previously been kicked by the host. + + + You cannot join this game as the player you are trying to join is running an older version of the game. + + + You cannot join this game as the player you are trying to join is running a newer version of the game. + + + + New World + + + Award Unlocked! + + + + Hurray - you've been awarded a gamerpic featuring Steve from Minecraft! + + + Hurray - you've been awarded a gamerpic featuring a Creeper! + + + Hurray - you've been awarded an avatar item - a Minecraft: Xbox 360 Edition t-shirt! +Go to the dashboard to put the t-shirt on your avatar. + + + Hurray - you've been awarded an avatar item - a Minecraft: Xbox 360 Edition watch! +Go to the dashboard to put the watch on your avatar. + + + Hurray - you've been awarded an avatar item - a Creeper baseball cap! +Go to the dashboard to put the cap on your avatar. + + + Hurray - you've been awarded the Minecraft: Xbox 360 Edition theme! +Go to the dashboard to select this theme. + + + + Unlock Full Game + + + You're playing the trial game, but you'll need the full game to be able to save your game. +Would you like to unlock the full game now? + + + This is the Minecraft: Xbox 360 Edition trial game. If you had the full game, you would just have earned an achievement! +Unlock the full game to experience the joy of Minecraft: Xbox 360 Edition and to play with your friends across the globe through Xbox LIVE. +Would you like to unlock the full game? + + + This is the Minecraft: Xbox 360 Edition trial game. If you had the full game, you would just have earned an avatar award! +Unlock the full game to experience the joy of Minecraft: Xbox 360 Edition and to play with your friends across the globe through Xbox LIVE. +Would you like to unlock the full game? + + + This is the Minecraft: Xbox 360 Edition trial game. If you had the full game, you would just have earned a gamerpic! +Unlock the full game to experience the joy of Minecraft: Xbox 360 Edition and to play with your friends across the globe through Xbox LIVE. +Would you like to unlock the full game? + + + This is the Minecraft: Xbox 360 Edition trial game. If you had the full game, you would just have earned a theme! +Unlock the full game to experience the joy of Minecraft: Xbox 360 Edition and to play with your friends across the globe through Xbox LIVE. +Would you like to unlock the full game? + + + This is the Minecraft: Xbox 360 Edition trial game. You need the full game to be able to accept this invite. +Would you like to unlock the full game? + + + Guest players cannot unlock the full game. Please sign in with an Xbox LIVE user ID. + + + + Please wait + + + No results + + + Filter: + + + Friends + + + My Score + + + Overall + + + Entries: + + + Rank + + + Gamertag + + + + Preparing to Save Level + + + Preparing Chunks... + + + Finalizing... + + + Building Terrain + + + Simulating world for a bit + + + Initializing server + + + Generating spawn area + + + Loading spawn area + + + Entering The Nether + + + Leaving The Nether + + + Respawning + + + Generating level + + + Loading level + + + Saving players + + + Connecting to host + + + Downloading terrain + + + Switching to offline game + + + Please wait while the host saves the game + + + Entering The END + + + Leaving The END + + + + This bed is occupied + + + You can only sleep at night + + + %s is sleeping in a bed. To skip to dawn, all players need to sleep in beds at the same time. + + + Your home bed was missing or obstructed + + + You may not rest now, there are monsters nearby + + + + You are sleeping in a bed. To skip to dawn, all players need to sleep in beds at the same time. + + + + Tools and Weapons + + + Weapons + + + Food + + + Structures + + + Armor + + + Mechanisms + + + Transport + + + Decorations + + + Building Blocks + + + Redstone & Transportation + + + Miscellaneous + + + Brewing - Press{*CONTROLLER_VK_LT*} to cycle strength + + + Brewing - Press LT to cycle strength + + + + Tools, Weapons & Armor + + + Materials + + + + Signed out + + + You have been returned to the title screen because your gamer profile was signed out + + + + Difficulty + + + Music + + + Sound + + + Gamma + + + Game Sensitivity + + + Interface Sensitivity + + + Peaceful + + + Easy + + + Normal + + + Hard + + + + In this mode, the player regains health over time, and there are no enemies in the environment. + + + In this mode, enemies spawn in the environment, but will do less damage to the player than in the Normal mode. + + + In this mode, enemies spawn in the environment and will do a standard amount of damage to the player. + + + In this mode, enemies will spawn in the environment, and will do a great deal of damage to the player. Watch out for the Creepers too, since they are unlikely to cancel their exploding attack when you move away from them! + + + + Trial Timeout + + + You've been playing the Minecraft: Xbox 360 Edition Trial Game for the maximum time allowed! To continue the fun, would you like to unlock the full game? + + + + Game full + + + Failed to join game as there are no spaces left + + + + Enter Sign Text + + + Enter a line of text for your sign + + + + Enter Title + + + Enter a title for your post + + + Enter Caption + + + Enter a caption for your post + + + Enter Description + + + Enter a description for your post + + + + Inventory + + + Ingredients + + + Brewing Stand + + + Chest + + + Enchant + + + Furnace + + + Ingredient + + + Fuel + + + Dispenser + + + + There are no downloadable content offers of this type available for this title at the moment. + + + %s has joined the game. + + + %s has left the game. + + + %s was kicked from the game. + + + Are you sure you want to delete this save game? + + + Awaiting approval + + + Censored + + + + Now playing: + + + + Reset Settings + + + Are you sure you would like to reset your settings to their default values? + + + + Loading Error + + + + "Minecraft: Xbox 360 Edition" has failed to load, and cannot continue. + + + + %s's Game + + + Unknown host game + + + + Guest signed out + + + A guest player has signed out causing all guest players to be removed from the game. + + + Sign in + + + You are not signed in. In order to play this game, you will need to be signed in. Do you want to sign in now? + + + Multiplayer not allowed + + + Failed to join the game as one or more players are not allowed to play multiplayer games on Xbox LIVE. + + + Failed to create an online game as one or more players are not allowed to play multiplayer games on Xbox LIVE. Uncheck the "Online Game" box to start an offline game. + + + You are not allowed to join this game session because your Member Content privilege setting is too restrictive. Please change this setting in the Privacy and Online Settings portion of the Xbox dashboard if you would like to join this session. + + + You are not allowed to join this game session because one of your local players has a Member Content privilege setting that is too restrictive. + + + You are not allowed to join this game session because a player in the session has a Member Content privilege setting of Friends Only, and you are not on their Friends List. + + + Failed to create game + + + You are not allowed to create this game session because one of your local players has a Member Content privilege setting that is too restrictive. Uncheck the "Online Game" box to start an offline game, or change this setting in the Privacy and Online Settings portion of the Xbox dashboard. + + + + Auto Selected + + + No Pack: Default Skins + + + Favorite Skins + + + + + Banned Level + + + + The game you are joining is in your banned level list. +If you choose to join this game, the level will be removed from your banned level list. + + + + Ban This Level? + + + + Are you sure you want to add this level to your banned level list? +Selecting OK will also exit this game. + + + + Remove from Banned List + + + + Autosave Interval + + + + Autosave Interval: OFF + + + Mins + + + Can't Place Here! + + + Placing lava close to the level spawn point is not allowed due to the possibility of instant death for spawning players. + + + + This game has a level autosave feature. When you see the icon above displayed, the game is saving your data. +Please do not turn off your Xbox 360 console while this icon is on-screen. + + + + Interface Opacity + + + + Preparing to Autosave Level + + + + HUD Size + + + HUD Size (Splitscreen) + + + + Seed + + + + Unlock Skin Pack + + + To use the skin you have selected, you need to unlock this skin pack. +Would you like to unlock this skin pack now? + + + Unlock Texture Pack + + + To use this texture pack for your world, you need to unlock it. +Would you like to unlock it now? + + + Trial Texture Pack + + + You are using a trial version of the texture pack. You will not be able to save this world unless you unlock the full version. +Would you like to unlock the full version of the texture pack? + + + + Texture Pack Not Present + + + + Unlock Full Version + + + + Download Trial Version + + + Download Full Version + + + This world uses a mash-up pack or texture pack you don't have! +Would you like to install the mash-up pack or texture pack now? + + + + Get Trial Version + + + Get Full Version + + + + Kick player + + + Are you sure you want to kick this player from the game? They will not be able to rejoin until you restart the world. + + + + Gamerpics Packs + + + Themes + + + Skins Packs + + + Allow friends of friends + + + You cannot join this game because it has been limited to players who are friends of the host. + + + Can't Join Game + + + + Selected + + + Selected skin: + + + + Corrupt Downloadable Content + + + This downloadable content is corrupt and cannot be used. You need to delete it, then re-install it from the Minecraft Store menu. + + + Some of your downloadable content is corrupt and cannot be used. You need to delete them, then re-install them from the Minecraft Store menu. + + + Your game mode has been changed + + + Rename Your World + + + Enter the new name for your world + + + + Game Mode: Survival + + + Game Mode: Creative + + + Survival + + + Creative + + + Created in Survival Mode + + + Created in Creative Mode + + + Render Clouds + + + What would you like to do with this save game? + + + Rename Save + + + Autosaving in %d... + + + + On + + + Off + + + Normal + + + Superflat + + + When enabled, the game will be an online game. + + + When enabled, only invited players can join. + + + When enabled, friends of people on your Friends List can join the game. + + + When enabled, players can inflict damage on other players. Only affects Survival mode. + + + When disabled, players joining the game cannot build or mine until authorised. + + + When enabled, fire may spread to nearby flammable blocks. + + + When enabled, TNT will explode when activated. + + + When enabled, the host can toggle their ability to fly, disable exhaustion, and make themselves invisible from the in-game menu. Disables achievements and leaderboard updates. + + + When enabled, the Nether world will be re-generated. This is useful if you have an older save where Nether Fortresses were not present. + + + When enabled, structures such as Villages and Strongholds will generate in the world. + + + When enabled, a completely flat world will be generated in the Overworld and in the Nether. + + + When enabled, a chest containing some useful items will be created near the player spawn point. + + + Skin Packs + + + Themes + + + Gamerpics + + + Avatar Items + + + Texture Packs + + + Mash-Up Packs + + + + + {*PLAYER*} went up in flames + + + {*PLAYER*} burned to death + + + {*PLAYER*} tried to swim in lava + + + {*PLAYER*} suffocated in a wall + + + {*PLAYER*} drowned + + + {*PLAYER*} starved to death + + + {*PLAYER*} was pricked to death + + + {*PLAYER*} hit the ground too hard + + + {*PLAYER*} fell out of the world + + + {*PLAYER*} died + + + {*PLAYER*} blew up + + + {*PLAYER*} was killed by magic + + + {*PLAYER*} was killed by Enderdragon breath + + + {*PLAYER*} was slain by {*SOURCE*} + + + {*PLAYER*} was slain by {*SOURCE*} + + + {*PLAYER*} was shot by {*SOURCE*} + + + {*PLAYER*} was fireballed by {*SOURCE*} + + + {*PLAYER*} was pummeled by {*SOURCE*} + + + {*PLAYER*} was killed by {*SOURCE*} + + + + Bedrock Fog + + + + Display HUD + + + + Display Hand + + + + Splitscreen Gamertags + + + + Death Messages + + + + Animated Character + + + + Custom Skin Animation + + + + You can no longer mine or use items + + + You can now mine and use items + + + You can no longer place blocks + + + You can now place blocks + + + You can now use doors and switches + + + You can no longer use doors and switches + + + You can now use containers (e.g. chests) + + + You can no longer use containers (e.g. chests) + + + You can no longer attack mobs + + + You can now attack mobs + + + You can no longer attack players + + + You can now attack players + + + You can no longer attack animals + + + You can now attack animals + + + You are now a moderator + + + You are no longer a moderator + + + You can now fly + + + You can no longer fly + + + You will no longer get exhausted + + + You will now get exhausted + + + You are now invisible + + + You are no longer invisible + + + You are now invulnerable + + + You are no longer invulnerable + + + %d MSP + + + Enderdragon + + + %s has entered The End + + + %s has left The End + + + + +{*C3*}I see the player you mean.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}?{*EF*}{*B*}{*B*} +{*C3*}Yes. Take care. It has reached a higher level now. It can read our thoughts.{*EF*}{*B*}{*B*} +{*C2*}That doesn't matter. It thinks we are part of the game.{*EF*}{*B*}{*B*} +{*C3*}I like this player. It played well. It did not give up.{*EF*}{*B*}{*B*} +{*C2*}It is reading our thoughts as though they were words on a screen.{*EF*}{*B*}{*B*} +{*C3*}That is how it chooses to imagine many things, when it is deep in the dream of a game.{*EF*}{*B*}{*B*} +{*C2*}Words make a wonderful interface. Very flexible. And less terrifying than staring at the reality behind the screen.{*EF*}{*B*}{*B*} +{*C3*}They used to hear voices. Before players could read. Back in the days when those who did not play called the players witches, and warlocks. And players dreamed they flew through the air, on sticks powered by demons.{*EF*}{*B*}{*B*} +{*C2*}What did this player dream?{*EF*}{*B*}{*B*} +{*C3*}This player dreamed of sunlight and trees. Of fire and water. It dreamed it created. And it dreamed it destroyed. It dreamed it hunted, and was hunted. It dreamed of shelter.{*EF*}{*B*}{*B*} +{*C2*}Hah, the original interface. A million years old, and it still works. But what true structure did this player create, in the reality behind the screen?{*EF*}{*B*}{*B*} +{*C3*}It worked, with a million others, to sculpt a true world in a fold of the {*EF*}{*NOISE*}{*C3*}, and created a {*EF*}{*NOISE*}{*C3*} for {*EF*}{*NOISE*}{*C3*}, in the {*EF*}{*NOISE*}{*C3*}.{*EF*}{*B*}{*B*} +{*C2*}It cannot read that thought.{*EF*}{*B*}{*B*} +{*C3*}No. It has not yet achieved the highest level. That, it must achieve in the long dream of life, not the short dream of a game.{*EF*}{*B*}{*B*} +{*C2*}Does it know that we love it? That the universe is kind?{*EF*}{*B*}{*B*} +{*C3*}Sometimes, through the noise of its thoughts, it hears the universe, yes.{*EF*}{*B*}{*B*} +{*C2*}But there are times it is sad, in the long dream. It creates worlds that have no summer, and it shivers under a black sun, and it takes its sad creation for reality.{*EF*}{*B*}{*B*} +{*C3*}To cure it of sorrow would destroy it. The sorrow is part of its own private task. We cannot interfere.{*EF*}{*B*}{*B*} +{*C2*}Sometimes when they are deep in dreams, I want to tell them, they are building true worlds in reality. Sometimes I want to tell them of their importance to the universe. Sometimes, when they have not made a true connection in a while, I want to help them to speak the word they fear.{*EF*}{*B*}{*B*} +{*C3*}It reads our thoughts.{*EF*}{*B*}{*B*} +{*C2*}Sometimes I do not care. Sometimes I wish to tell them, this world you take for truth is merely {*EF*}{*NOISE*}{*C2*} and {*EF*}{*NOISE*}{*C2*}, I wish to tell them that they are {*EF*}{*NOISE*}{*C2*} in the {*EF*}{*NOISE*}{*C2*}. They see so little of reality, in their long dream.{*EF*}{*B*}{*B*} +{*C3*}And yet they play the game.{*EF*}{*B*}{*B*} +{*C2*}But it would be so easy to tell them...{*EF*}{*B*}{*B*} +{*C3*}Too strong for this dream. To tell them how to live is to prevent them living.{*EF*}{*B*}{*B*} +{*C2*}I will not tell the player how to live.{*EF*}{*B*}{*B*} +{*C3*}The player is growing restless.{*EF*}{*B*}{*B*} +{*C2*}I will tell the player a story.{*EF*}{*B*}{*B*} +{*C3*}But not the truth.{*EF*}{*B*}{*B*} +{*C2*}No. A story that contains the truth safely, in a cage of words. Not the naked truth that can burn over any distance.{*EF*}{*B*}{*B*} +{*C3*}Give it a body, again.{*EF*}{*B*}{*B*} +{*C2*}Yes. Player...{*EF*}{*B*}{*B*} +{*C3*}Use its name.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}. Player of games.{*EF*}{*B*}{*B*} +{*C3*}Good.{*EF*}{*B*}{*B*} + + + + + +{*C2*}Take a breath, now. Take another. Feel air in your lungs. Let your limbs return. Yes, move your fingers. Have a body again, under gravity, in air. Respawn in the long dream. There you are. Your body touching the universe again at every point, as though you were separate things. As though we were separate things.{*EF*}{*B*}{*B*} +{*C3*}Who are we? Once we were called the spirit of the mountain. Father sun, mother moon. Ancestral spirits, animal spirits. Jinn. Ghosts. The green man. Then gods, demons. Angels. Poltergeists. Aliens, extraterrestrials. Leptons, quarks. The words change. We do not change.{*EF*}{*B*}{*B*} +{*C2*}We are the universe. We are everything you think isn't you. You are looking at us now, through your skin and your eyes. And why does the universe touch your skin, and throw light on you? To see you, player. To know you. And to be known. I shall tell you a story.{*EF*}{*B*}{*B*} +{*C2*}Once upon a time, there was a player.{*EF*}{*B*}{*B*} +{*C3*}The player was you, {*PLAYER*}.{*EF*}{*B*}{*B*} +{*C2*}Sometimes it thought itself human, on the thin crust of a spinning globe of molten rock. The ball of molten rock circled a ball of blazing gas that was three hundred and thirty thousand times more massive than it. They were so far apart that light took eight minutes to cross the gap. The light was information from a star, and it could burn your skin from a hundred and fifty million kilometres away.{*EF*}{*B*}{*B*} +{*C2*}Sometimes the player dreamed it was a miner, on the surface of a world that was flat, and infinite. The sun was a square of white. The days were short; there was much to do; and death was a temporary inconvenience.{*EF*}{*B*}{*B*} +{*C3*}Sometimes the player dreamed it was lost in a story.{*EF*}{*B*}{*B*} +{*C2*}Sometimes the player dreamed it was other things, in other places. Sometimes these dreams were disturbing. Sometimes very beautiful indeed. Sometimes the player woke from one dream into another, then woke from that into a third.{*EF*}{*B*}{*B*} +{*C3*}Sometimes the player dreamed it watched words on a screen.{*EF*}{*B*}{*B*} +{*C2*}Let's go back.{*EF*}{*B*}{*B*} +{*C2*}The atoms of the player were scattered in the grass, in the rivers, in the air, in the ground. A woman gathered the atoms; she drank and ate and inhaled; and the woman assembled the player, in her body.{*EF*}{*B*}{*B*} +{*C2*}And the player awoke, from the warm, dark world of its mother's body, into the long dream.{*EF*}{*B*}{*B*} +{*C2*}And the player was a new story, never told before, written in letters of DNA. And the player was a new program, never run before, generated by a sourcecode a billion years old. And the player was a new human, never alive before, made from nothing but milk and love.{*EF*}{*B*}{*B*} +{*C3*}You are the player. The story. The program. The human. Made from nothing but milk and love.{*EF*}{*B*}{*B*} +{*C2*}Let's go further back.{*EF*}{*B*}{*B*} +{*C2*}The seven billion billion billion atoms of the player's body were created, long before this game, in the heart of a star. So the player, too, is information from a star. And the player moves through a story, which is a forest of information planted by a man called Julian, on a flat, infinite world created by a man called Markus, that exists inside a small, private world created by the player, who inhabits a universe created by...{*EF*}{*B*}{*B*} +{*C3*}Shush. Sometimes the player created a small, private world that was soft and warm and simple. Sometimes hard, and cold, and complicated. Sometimes it built a model of the universe in its head; flecks of energy, moving through vast empty spaces. Sometimes it called those flecks "electrons" and "protons".{*EF*}{*B*}{*B*} + + + + + +{*C2*}Sometimes it called them "planets" and "stars".{*EF*}{*B*}{*B*} +{*C2*}Sometimes it believed it was in a universe that was made of energy that was made of offs and ons; zeros and ones; lines of code. Sometimes it believed it was playing a game. Sometimes it believed it was reading words on a screen.{*EF*}{*B*}{*B*} +{*C3*}You are the player, reading words...{*EF*}{*B*}{*B*} +{*C2*}Shush... Sometimes the player read lines of code on a screen. Decoded them into words; decoded words into meaning; decoded meaning into feelings, emotions, theories, ideas, and the player started to breathe faster and deeper and realised it was alive, it was alive, those thousand deaths had not been real, the player was alive{*EF*}{*B*}{*B*} +{*C3*}You. You. You are alive.{*EF*}{*B*}{*B*} +{*C2*}and sometimes the player believed the universe had spoken to it through the sunlight that came through the shuffling leaves of the summer trees{*EF*}{*B*}{*B*} +{*C3*}and sometimes the player believed the universe had spoken to it through the light that fell from the crisp night sky of winter, where a fleck of light in the corner of the player's eye might be a star a million times as massive as the sun, boiling its planets to plasma in order to be visible for a moment to the player, walking home at the far side of the universe, suddenly smelling food, almost at the familiar door, about to dream again{*EF*}{*B*}{*B*} +{*C2*}and sometimes the player believed the universe had spoken to it through the zeros and ones, through the electricity of the world, through the scrolling words on a screen at the end of a dream{*EF*}{*B*}{*B*} +{*C3*}and the universe said I love you{*EF*}{*B*}{*B*} +{*C2*}and the universe said you have played the game well{*EF*}{*B*}{*B*} +{*C3*}and the universe said everything you need is within you{*EF*}{*B*}{*B*} +{*C2*}and the universe said you are stronger than you know{*EF*}{*B*}{*B*} +{*C3*}and the universe said you are the daylight{*EF*}{*B*}{*B*} +{*C2*}and the universe said you are the night{*EF*}{*B*}{*B*} +{*C3*}and the universe said the darkness you fight is within you{*EF*}{*B*}{*B*} +{*C2*}and the universe said the light you seek is within you{*EF*}{*B*}{*B*} +{*C3*}and the universe said you are not alone{*EF*}{*B*}{*B*} +{*C2*}and the universe said you are not separate from every other thing{*EF*}{*B*}{*B*} +{*C3*}and the universe said you are the universe tasting itself, talking to itself, reading its own code{*EF*}{*B*}{*B*} +{*C2*}and the universe said I love you because you are love.{*EF*}{*B*}{*B*} +{*C3*}And the game was over and the player woke up from the dream. And the player began a new dream. And the player dreamed again, dreamed better. And the player was the universe. And the player was love.{*EF*}{*B*}{*B*} +{*C3*}You are the player.{*EF*}{*B*}{*B*} +{*C2*}Wake up.{*EF*} + + + + + Reset Nether + + + + Are you sure you want to reset the Nether in this savegame to its default state? You will lose anything you have built in the Nether! + + + + Reset Nether + + + Don't Reset Nether + + + + Can't shear this Mooshroom at the moment. The maximum number of Pigs, Sheep, Cows and Cats has been reached. + + + Can't use Spawn Egg at the moment. The maximum number of Pigs, Sheep, Cows and Cats has been reached. + + + Can't use Spawn Egg at the moment. The maximum number of Mooshrooms has been reached. + + + + Can't use Spawn Egg at the moment. The maximum number of Wolves in a world has been reached. + + + Can't use Spawn Egg at the moment. The maximum number of Chickens in a world has been reached. + + + + Can't use Spawn Egg at the moment. The maximum number of Squid in a world has been reached. + + + + Can't use Spawn Egg at the moment. The maximum number of enemies in a world has been reached. + + + Can't use Spawn Egg at the moment. The maximum number of villagers in a world has been reached. + + + The maximum number of Paintings/Item Frames in a world has been reached. + + + You can't spawn enemies in Peaceful mode. + + + This animal can't enter Love Mode. The maximum number of breeding Pigs, Sheep, Cows and Cats has been reached. + + + This animal can't enter Love Mode. The maximum number of breeding Wolves has been reached. + + + This animal can't enter Love Mode. The maximum number of breeding Chickens has been reached. + + + + This animal can't enter Love Mode. The maximum number of breeding Mooshrooms has been reached. + + + The maximum number of Boats in a world has been reached. + + + The maximum number of Mob Heads in a world has been reached. + + + + Invert Look + + + Southpaw + + + You Died! + + + Respawn + + + Downloadable Content Offers + + + + Change Skin + + + How To Play + + + Controls + + + Settings + + + Credits + + + Reinstall Content + + + Debug Settings + + + + Fire Spreads + + + TNT Explodes + + + Player vs Player + + + Trust Players + + + Host Privileges + + + Generate Structures + + + Superflat World + + + Bonus Chest + + + World Options + + + + Can Build and Mine + + + Can Use Doors and Switches + + + Can Open Containers + + + Can Attack Players + + + Can Attack Animals + + + Moderator + + + Kick Player + + + Can Fly + + + Disable Exhaustion + + + Invisible + + + Host Options + + + Players/Invite + + + + Online Game + + + Invite Only + + + More Options + + + Load + + + New World + + + World Name + + + Seed for the World Generator + + + Leave blank for a random seed + + + Players + + + Join Game + + + Start Game + + + No Games Found + + + + Play Game + + + Leaderboards + + + Achievements + + + Help & Options + + + Unlock Full Game + + + Resume Game + + + Save Game + + + + Difficulty: + + + Game Type: + + + Gamertags: + + + Structures: + + + Level Type: + + + PvP: + + + Trust Players: + + + TNT: + + + Fire Spreads: + + + + + Reinstall Theme + + + Reinstall Gamerpic 1 + + + Reinstall Gamerpic 2 + + + Reinstall Avatar Item 1 + + + Reinstall Avatar Item 2 + + + Reinstall Avatar Item 3 + + + + Options + + + Audio + + + Control + + + Graphics + + + User Interface + + + Reset to Defaults + + + + View Bobbing + + + Hints + + + In-Game Tooltips + + + In-Game Gamertags + + + 2 Player Split-screen Vertical + + + + Done + + + Edit sign message: + + + + Fill in the details to accompany your screenshot + + + Caption + + + Screenshot from in-game + + + Edit sign message: + + + Look what I made in Minecraft: Xbox 360 Edition! + + + + + The classic Minecraft textures, icons and user interface! + + + + + No Effects + + + Swiftness + + + Slowness + + + Haste + + + Mining Fatigue + + + Strength + + + Weakness + + + Instant Health + + + Instant Damage + + + Jump Boost + + + Nausea + + + Regeneration + + + Resistance + + + Fire Resistance + + + Water Breathing + + + Invisibility + + + Blindness + + + Night Vision + + + Hunger + + + Poison + + + + of Swiftness + + + of Slowness + + + of Haste + + + of Dullness + + + of Strength + + + of Weakness + + + of Healing + + + of Harming + + + of Leaping + + + of Nausea + + + of Regeneration + + + of Resistance + + + of Fire Resistance + + + of Water Breathing + + + of Invisibility + + + of Blindness + + + of Night Vision + + + of Hunger + + + of Poison + + + + + + + II + + + III + + + IV + + + + + Splash + + + Mundane + + + Uninteresting + + + Bland + + + Clear + + + Milky + + + Diffuse + + + Artless + + + Thin + + + Awkward + + + Flat + + + Bulky + + + Bungling + + + Buttered + + + Smooth + + + Suave + + + Debonair + + + Thick + + + Elegant + + + Fancy + + + Charming + + + Dashing + + + Refined + + + Cordial + + + Sparkling + + + Potent + + + Foul + + + Odorless + + + Rank + + + Harsh + + + Acrid + + + Gross + + + Stinky + + + + Used as the base of all potions. Use in a brewing stand to create potions. + + + Has no effects, can be used in a brewing stand to create potions by adding more ingredients. + + + Increases affected players, animals and monsters movement speed, and players sprinting speed, jumping length and field of view. + + + Reduces affected players, animals and monsters movement speed, and players sprinting speed, jumping length and field of view. + + + Increase the damage caused by affected players and monsters when attacking. + + + Reduces the damage cause by affected players and monsters when attacking. + + + Instantly increases the affected players, animals and monsters health. + + + Instantly reduces the affected players, animals and monsters health. + + + Restores health to the affected players, animals and monsters over time. + + + Makes the affected players, animals and monsters immune to damage from fire, lava, and ranged Blaze attacks. + + + Reduces health of the affected players, animals and monsters over time. + + + + Sharpness + + + Smite + + + Bane of Arthropods + + + Knockback + + + Fire Aspect + + + Protection + + + Fire Protection + + + Feather Falling + + + Blast Protection + + + Projectile Protection + + + Respiration + + + Aqua Affinity + + + Efficiency + + + Silk Touch + + + Unbreaking + + + Looting + + + Fortune + + + Power + + + Flame + + + Punch + + + Infinity + + + + I + + + II + + + III + + + IV + + + V + + + VI + + + VII + + + VIII + + + IX + + + X + + + + + diff --git a/Minecraft.Client/Common/Media/es-ES/4J_strings.resx b/Minecraft.Client/Common/Media/es-ES/4J_strings.resx new file mode 100644 index 00000000..4882271b --- /dev/null +++ b/Minecraft.Client/Common/Media/es-ES/4J_strings.resx @@ -0,0 +1,108 @@ + +Sin usar + +Aceptar + +Atrás + +Cancelar + + + +No + +Archivo dañado + +Parece que tus datos guardados están dañados. ¿Crear un nuevo archivo de guardado y sobrescribir el archivo dañado? + +No hay espacio libre + +El dispositivo de almacenamiento seleccionado no tiene suficiente espacio libre para crear un archivo de guardado. + +Volver a seleccionar + +Jugar sin guardar + +Crear nuevo archivo de guardado + +¿Sobrescribir archivo guardado? + +El dispositivo de almacenamiento seleccionado ya contiene este archivo guardado. ¿Te parece bien sobrescribirlo? + +No, no sobrescribir. + +Sobrescribir y guardar. + +Error al guardar + +Problema con disp. almacenaje + +El dispositivo de almacenamiento no está disponible o produce un error. + +El dispositivo de almacenamiento no está disponible o produce un error. Selecciona un nuevo dispositivo de almacenamiento. + +Sel. nuevo disp. almacenamiento. + +No disp. de almacenaje selec. + +Si no seleccionas un dispositivo de almacenamiento, se deshabilitará la función de guardado de juegos. + +Selecciona disp. almacenamiento + +Continuar sin guardar + +Se ha extraído el dispositivo de almacenamiento. Selecciona uno nuevo. + +Error al cargar + +Nombrar el archivo de guardado + +Escribe un nombre para tu archivo de guardado. + +Volver a la Interfaz Xbox + +¿Seguro que quieres salir del juego? + +Sesión cerrada + +Has vuelto a la pantalla de título porque tu perfil de jugador ha cerrado la sesión. + +La partida ha finalizado porque un perfil de jugador ha cerrado la sesión. + +Seguir jugando + +Perfil de jugador no en línea + +Este juego ofrece características que requieren un perfil de jugador habilitado para Xbox LIVE, pero en estos momentos estás desconectado. + +Esta característica requiere un perfil de jugador con sesión iniciada en Xbox LIVE. + +Conectarse a Xbox LIVE + +Seguir jugando sin conexión + +Problema con el premio de logro + + Se ha producido un problema al acceder a tu perfil de jugador. No se puede conceder tu logro en este momento. + +Problema con perfil de jugador + +Se ha producido un error al guardar la configuración en el perfil de jugador. + +Perfil de jugador de invitado + +El perfil de jugador de invitado no puede acceder a esta característica. Usa un perfil de jugador diferente. + +Guardando… + +Guardando contenido. No apagues tu consola. + +Desbloquear juego completo + +Esta es la versión de prueba de Minecraft. Si tuvieras el juego completo, ¡habrías conseguido un logro! +Desbloquea el juego completo para vivir toda la emoción de Minecraft y jugar con amigos de todo el mundo a través de Xbox LIVE. +¿Te gustaría desbloquear el juego completo? + +Volverás al menú principal porque se ha producido un error al leer tu perfil. + + diff --git a/Minecraft.Client/Common/Media/es-ES/strings.resx b/Minecraft.Client/Common/Media/es-ES/strings.resx new file mode 100644 index 00000000..1e07927c --- /dev/null +++ b/Minecraft.Client/Common/Media/es-ES/strings.resx @@ -0,0 +1,5170 @@ + +¡Nueva descarga de contenido disponible! Utiliza el botón Tienda de Minecraft del menú principal para acceder a él. + +Puedes cambiar el aspecto de tu personaje con el pack de aspecto de la tienda Minecraft. Ve a "Tienda Minecraft" en el menú principal para ver qué hay disponible. + +¡Si juegas en el modo de alta definición puedes incluir a un máximo de cuatro jugadores en pantalla dividida en la misma consola! + +Conecta más mandos a tu consola y pulsa START sobre ellos para unirte al juego en cualquier momento. + +Varía la configuración de gamma para que la visualización del juego sea más clara o más oscura. + +Si estableces la dificultad del juego en Pacífico, tu salud se regenerará automáticamente. ¡Además, no saldrán monstruos por la noche! + +Dale un hueso a un lobo para 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*}. + +Si duermes en una cama de noche, el juego avanzará hasta el amanecer, pero en los juegos multijugador todos los jugadores tienen que dormir en camas a la vez. + +Extrae chuletas de los cerdos y cocínalas para comerlas y recuperar tu salud. + +Extrae cuero de las vacas y úsalo para fabricar armaduras. + +Si tienes un cubo vacío, puedes llenarlo con leche de vaca, agua ¡o lava! + +Usa una azada para preparar el terreno para la cosecha. + +Las arañas no atacan por el día, a no ser que tú las ataques a ellas. + +¡Es más fácil excavar arena o tierra con un azadón que a mano! + +Si comes las chuletas de cerdo cocinadas, recuperarás más salud que si las comes crudas. + +Crea antorchas para iluminar áreas oscuras de noche. Los monstruos evitarán las áreas cercanas a las antorchas. + +¡Con una vagoneta y un raíl llegarás a tu destino más rápido! + +Planta arbolillos y se convertirán en árboles. + +Los cerdos no te atacarán a no ser que tú los ataques a ellos. + +Puedes echarte a dormir en una cama para cambiar el punto de generación del juego y avanzar hasta el amanecer. + +¡Golpea esas bolas de fuego de vuelta al Ghast! + +Si construyes un portal podrás viajar a otra dimensión: el mundo inferior. + +¡Pulsa {*CONTROLLER_VK_B*} para soltar el objeto que llevas en la mano! + +¡Usa la herramienta correcta para el trabajo! + +Si no encuentras hulla para las antorchas, siempre puedes convertir árboles en carbón en un horno. + +Excavar en línea recta hacia abajo o hacia arriba no es buena idea. + +La carne de hueso (se fabrica con hueso de esqueleto) se puede usar como fertilizante, y hace que las cosas crezcan al instante. + +¡Los Creepers explotan cuando se acercan a ti! + +La obsidiana se crea cuando el agua alcanza un bloque de origen de lava. + +Al eliminar el bloque de origen, la lava puede tardar varios minutos en desaparecer por completo. + +Los guijarros son resistentes a las bolas de fuego del Ghast, lo que los hace útiles para defender portales. + +Los bloques que se pueden usar como fuente de luz derriten la nieve y el hielo. Entre ellos se incluyen las antorchas, las piedras brillantes y los fuegos fatuos. + +Ten cuidado cuando construyas estructuras de lana al aire libre, ya que los rayos de las tormentas pueden prenderles fuego. + +Un solo cubo de lava se puede usar para fundir 100 bloques en un horno. + +El instrumento que toca un bloque de nota depende del material que tenga debajo. + +Los zombis y los esqueletos pueden sobrevivir a la luz del día si están en el agua. + +Si atacas a un lobo provocarás que todos los lobos de los alrededores se vuelvan hostiles hacia ti y te ataquen. Esta característica la comparten también los porqueros zombis. + +Los lobos no pueden entrar en el mundo inferior. + +Los lobos no atacan a los Creepers. + +Las gallinas ponen huevos cada 5 o 10 minutos. + +La obsidiana solo se puede perforar con un pico de diamante. + +Los Creepers son la fuente de pólvora de más sencilla obtención. + +Si colocas dos cofres juntos crearás un cofre grande. + +Los lobos 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. + +¡En Twitter obtendrás la información más reciente sobre 4J Studios y Kappische! + +¡Impresiona a tus amigos publicando capturas de pantalla de tus creaciones de Minecraft en Facebook desde el menú de pausa del juego! + +Lee la sección Novedades en el menú Cómo se juega para ver la información más reciente sobre el juego. + +¡Ahora hay vallas apilables en el juego! + +minecraftforum cuenta con una sección dedicada a la edición para Xbox 360. + +Algunos animales te seguirán si llevas trigo en la mano. + +Si un animal no pude desplazarse más de 20 bloques en cualquier dirección, no se degenerará. + +¡Música de C418! + +¡Notch tiene más de un millón de seguidores en Twitter! + +No todos los suecos son rubios. ¡Algunos, como Jens de Mojang, son pelirrojos! + +Creemos que 4J Studios ha eliminado a Herobrine del juego para la Consola Xbox 360, pero no estamos seguros. + +¡Pronto habrá una actualización de este juego! + +¿Quién es Notch? + +¡Mojang tiene más premios que empleados! + +¡Hay famosos que juegan a Minecraft! + +¡A deadmau5 le gusta Minecraft! + +No mires directamente a los bichos. + +Los Creepers surgieron de un fallo de código. + +¿Es una gallina o es un pato? + +¿Estuviste en la Minecon? + +Nadie de Mojang ha visto jamás la cara a junkboy. + +¿Sabías que hay una Wiki de Minecraft? + +¡El nuevo despacho de Mojang mola! + +¡Minecraft: Xbox 360 Edition ha batido todos los récords! + +¡Minecon 2013 tuvo lugar en Orlando, Florida! + +.party() fue excelente. + +Supón siempre que los rumores son falsos, ¡no creas que son ciertos! + +{*T3*}CÓMO SE JUEGA: FUNDAMENTOS{*ETW*}{*B*}{*B*} +Minecraft es un juego que consiste en colocar bloques para construir cualquier cosa que puedas imaginar. De noche salen los monstruos, así que procura construir un refugio antes de que eso suceda.{*B*}{*B*} +Usa{*CONTROLLER_ACTION_LOOK*} para mirar a tu alrededor.{*B*}{*B*} +Usa{*CONTROLLER_ACTION_MOVE*} para moverte.{*B*}{*B*} +Pulsa{*CONTROLLER_ACTION_JUMP*} para saltar.{*B*}{*B*} +Pulsa{*CONTROLLER_ACTION_MOVE*} dos veces hacia delante en sucesión rápida para correr. Mientras mantienes pulsado {*CONTROLLER_ACTION_MOVE*} hacia delante, el personaje seguirá corriendo a menos que se agote el tiempo de carrera o la barra de comida tenga menos de {*ICON_SHANK_03*}.{*B*}{*B*} +Mantén pulsado{*CONTROLLER_ACTION_ACTION*} para perforar y picar con la mano o con cualquier objeto que sostengas. Quizá necesites crear una herramienta para perforar algunos bloques.{*B*}{*B*} +Si tienes un objeto en la mano, usa{*CONTROLLER_ACTION_USE*} para utilizar ese objeto o pulsa{*CONTROLLER_ACTION_DROP*} para soltarlo. + +{*T3*}CÓMO SE JUEGA: HUD{*ETW*}{*B*}{*B*} +El HUD muestra información sobre tu estado, tu salud, el oxígeno que te queda cuando estás bajo el agua, tu nivel de hambre (para llenarlo tienes que comer) y la armadura, si la llevas. Si pierdes salud pero tienes una barra de comida con 9 o más{*ICON_SHANK_01*}, tu salud se recargará automáticamente. Si comes, se recargará la barra de comida.{*B*} +Aquí también aparece la barra de experiencia, con un valor numérico que indica tu nivel de experiencia y la barra que señala los puntos de experiencia que necesitas para subir de nivel. Los puntos de experiencia se obtienen al recoger los orbes de experiencia que sueltan los enemigos al morir, al extraer cierto tipo de bloques, al criar nuevos animales, al pescar y al fundir mineral en un horno.{*B*}{*B*} +También muestra los objetos que puedes utilizar. Usa{*CONTROLLER_ACTION_LEFT_SCROLL*} y{*CONTROLLER_ACTION_RIGHT_SCROLL*} para cambiar el objeto que llevas en la mano. + +{*T3*}CÓMO SE JUEGA: INVENTARIO{*ETW*}{*B*}{*B*} +Usa{*CONTROLLER_ACTION_INVENTORY*} para ver el inventario.{*B*}{*B*} +Esta pantalla muestra los objetos que puedes llevar en la mano y todos los objetos que ya llevas. También aparece tu armadura.{*B*}{*B*} +Usa{*CONTROLLER_MENU_NAVIGATE*} para mover el foco. Usa{*CONTROLLER_VK_A*} para coger el objeto que se encuentra bajo el foco. Si hay más de un objeto, los cogerá todos; también puedes usar{*CONTROLLER_VK_X*} para coger solo la mitad de ellos.{*B*}{*B*} +Mueve el objeto con el foco hacia otro espacio del inventario y colócalo con{*CONTROLLER_VK_A*}. Si hay varios objetos en el foco, usa{*CONTROLLER_VK_A*} para colocarlos todos o{*CONTROLLER_VK_X*} para colocar solo uno.{*B*}{*B*} +Si un objeto sobre el que estás es una armadura, aparecerá un mensaje de función para activar un movimiento rápido y enviarla al espacio de armadura correspondiente del inventario.{*B*}{*B*} +Puedes teñir tu armadura de cuero para cambiarla de color. Para ello, accede al menú del inventario, mantén el foco sobre el tinte y después pulsa{*CONTROLLER_VK_X*} mientras señalas con el foco la prenda que quieres teñir. + + +{*T3*}CÓMO SE JUEGA: COFRE{*ETW*}{*B*}{*B*} +Cuando creas un cofre, puedes colocarlo en el mundo y usarlo con{*CONTROLLER_ACTION_USE*} para almacenar objetos de tu inventario.{*B*}{*B*} +Usa el foco para mover objetos del inventario al cofre y viceversa.{*B*}{*B*} +Los objetos del cofre se almacenan para que puedas volver a colocarlos en el inventario más tarde. + + +{*T3*}CÓMO SE JUEGA: COFRE GRANDE{*ETW*}{*B*}{*B*} +Si se colocan dos cofres normales, uno junto a otro, se combinarán para formar un cofre grande.{*B*}{*B*} +Se usa como si fuera un cofre normal. + + +{*T3*}CÓMO SE JUEGA: CREACIÓN{*ETW*}{*B*}{*B*} +En la interfaz de creación puedes combinar objetos del inventario para crear nuevos tipos de objetos. Usa{*CONTROLLER_ACTION_CRAFTING*} para abrir la interfaz de creación.{*B*}{*B*} +Desplázate por las pestañas de la parte superior con {*CONTROLLER_VK_LB*} y {*CONTROLLER_VK_RB*} para seleccionar el tipo de objeto que quieres crear; a continuación, usa{*CONTROLLER_MENU_NAVIGATE*} para seleccionar el objeto y crearlo.{*B*}{*B*} +La zona de creación indica los objetos que se necesitan para crear el nuevo objeto. Pulsa{*CONTROLLER_VK_A*} para crear el objeto y colocarlo en tu inventario. + + +{*T3*}CÓMO SE JUEGA: MESA DE CREACIÓN{*ETW*}{*B*}{*B*} +Con una mesa de creación puedes crear objetos más grandes.{*B*}{*B*} +Coloca la mesa en el mundo y pulsa{*CONTROLLER_ACTION_USE*} para usarla.{*B*}{*B*} +La creación en una mesa se realiza igual que la creación normal, pero dispones de un área de creación mayor y una selección de objetos para crear más amplia. + + +{*T3*}CÓMO SE JUEGA: HORNO{*ETW*}{*B*}{*B*} +En el horno puedes cambiar objetos con fuego. Por ejemplo, puedes convertir mineral de hierro en lingotes de hierro.{*B*}{*B*} +Coloca el horno en el mundo y pulsa{*CONTROLLER_ACTION_USE*} para usarlo.{*B*}{*B*} +En la parte inferior del horno debes colocar combustible y el objeto que quieres fundir en la parte superior. El horno se encenderá y empezará a funcionar.{*B*}{*B*} +Después de fundir los objetos puedes trasladarlos de la zona de producción a tu inventario.{*B*}{*B*} +Si un objeto sobre el que estás es un ingrediente o combustible para el horno, aparecerán mensajes de función para activar un movimiento rápido y enviarlo al horno. + + +{*T3*}CÓMO SE JUEGA: DISPENSADOR{*ETW*}{*B*}{*B*} +El dispensador se usa para arrojar objetos. Para ello tendrás que colocar un interruptor, como por ejemplo una palanca, junto al dispensador para accionarlo.{*B*}{*B*} +Para llenar el dispensador con objetos, pulsa{*CONTROLLER_ACTION_USE*} y mueve los objetos que quieres arrojar desde tu inventario al dispensador.{*B*}{*B*} +A partir de ese momento, cuando uses el interruptor, el dispensador arrojará un objeto. + + +{*T3*}CÓMO SE JUEGA: DESTILACIÓN{*ETW*}{*B*}{*B*} +Para destilar pociones se necesita un puesto de destilado, que se puede construir en la mesa de creación. Todas las pociones se empiezan con una botella de agua, que se obtiene al llenar una botella de cristal con agua de un caldero o una fuente.{*B*} +Los puestos de destilado tienen tres espacios para botellas, de forma que puedes hacer tres pociones a la vez. Se puede usar un ingrediente en las tres botellas, así que procura destilar siempre tres pociones a la vez para aprovechar mejor tus recursos.{*B*} +Si colocas un ingrediente de poción en la posición superior del puesto de destilado, tras un breve periodo de tiempo obtendrás una poción básica. Esto no tiene ningún efecto por sí mismo, pero si destilas otro ingrediente con esta poción básica, obtendrás una poción con un efecto.{*B*} +Cuando obtengas esa poción, podrás añadir un tercer ingrediente para que el efecto sea más duradero (usando polvo de piedra rojiza), más intenso (con polvo de piedra brillante) o convertirlo en una poción perjudicial (con un ojo de araña fermentado).{*B*} +También puedes añadir pólvora a cualquier poción para convertirla en una poción de salpicadura, que después podrás arrojar. Si lanzas una poción de salpicadura, su efecto se aplicará sobre toda la zona donde caiga.{*B*} + +Los ingredientes originales de las pociones son :{*B*}{*B*} +* {*T2*}Verruga del mundo inferior{*ETW*}{*B*} +* {*T2*}Ojo de araña{*ETW*}{*B*} +* {*T2*}Azúcar{*ETW*}{*B*} +* {*T2*}Lágrima de Ghast{*ETW*}{*B*} +* {*T2*}Polvo de llama{*ETW*}{*B*} +* {*T2*}Crema de magma{*ETW*}{*B*} +* {*T2*}Melón resplandeciente{*ETW*}{*B*} +* {*T2*}Polvo de piedra rojiza{*ETW*}{*B*} +* {*T2*}Polvo p. brillante{*ETW*}{*B*} +* {*T2*}Ojo de araña fermentado{*ETW*}{*B*}{*B*} + +Tendrás que experimentar y combinar ingredientes para averiguar cuántas pociones diferentes puedes crear. + + +{*T3*}CÓMO SE JUEGA: HECHIZOS{*ETW*}{*B*}{*B*} +Los puntos de experiencia que se recogen cuando muere un enemigo, o cuando se extraen o se funden determinados bloques en un horno, se pueden usar para hechizar herramientas, armas, armaduras y libros.{*B*} +Cuando la espada, el arco, el hacha, el pico, la pala, la armadura o el libro se colocan en el espacio que está debajo del libro en la mesa de hechizos, los tres botones de la parte derecha del espacio mostrarán algunos hechizos y sus niveles de experiencia correspondientes.{*B*} +Si no tienes suficientes niveles de experiencia para usarlos, el coste aparecerá en rojo; si no, aparecerá en verde.{*B*}{*B*} +El hechizo real que se aplica se selecciona aleatoriamente en función del coste que aparece.{*B*}{*B*} +Si la mesa de hechizos está rodeada de estanterías (hasta un máximo de 15), con un espacio de un bloque entre la estantería y la mesa de hechizos, la intensidad de los hechizos aumentará y aparecerán glifos arcanos en el libro de la mesa de hechizos.{*B*}{*B*} +Todos los ingredientes para la mesa de hechizos se pueden encontrar en las aldeas de un mundo o al extraer mineral y cultivar en él.{*B*}{*B*} +Usa los libros hechizados en el yunque para aplicar hechizos a los objetos. De este modo tendrás más control sobre los hechizos que te gustaría aplicar a tus objetos.{*B*} + + +{*T3*}CÓMO SE JUEGA: CUIDAR ANIMALES{*ETW*}{*B*}{*B*} +Si quieres guardar a tus animales en un único lugar, construye una zona vallada de menos de 20x20 bloques y coloca a tus animales dentro. Así te asegurarás de que estén allí cuando vuelvas. + + +{*T3*}CÓMO SE JUEGA: CRIAR ANIMALES{*ETW*}{*B*}{*B*} +¡Los animales de Minecraft pueden reproducirse y tener crías que son sus réplicas exactas!{*B*} +Para que los animales tengan crías, tienes que alimentarles con la comida correcta para que pasen a estar en el "modo Amor".{*B*} +Si alimentas con trigo a las vacas, champiñacas u ovejas, con zanahorias a un cerdo, con semillas de trigo o verrugas del mundo inferior a los pollos, o con cualquier tipo de carne a los lobos, estos animales empezarán a buscar a otros animales de la misma especie que también estén en el modo Amor.{*B*} +Cuando dos animales de la misma especie se encuentran, y ambos están en el modo Amor, se besarán durante unos segundos y luego aparecerá una cría. La cría seguirá a sus padres durante un tiempo antes de crecer y convertirse en adulto.{*B*} +Tras dejar de estar en modo Amor, un animal no podrá volver a estarlo hasta pasados 5 minutos.{*B*} +Existe un límite para la cantidad de animales que puedes tener en un mundo, por lo que es posible que tus animales no tengan más crías cuando tengas muchos. + +{*T3*}CÓMO SE JUEGA: PORTAL INFERIOR{*ETW*}{*B*}{*B*} +El portal inferior permite al jugador viajar entre el mundo superior y el mundo inferior. El mundo inferior sirve para viajar a toda velocidad por el mundo superior, ya que un bloque de distancia en el mundo inferior equivale a 3 bloques en el mundo superior, así que cuando construyas un portal en el mundo inferior y salgas por él, estarás 3 veces más lejos del punto de entrada.{*B*}{*B*} +Se necesita un mínimo de 10 bloques de obsidiana para construir el portal, y el portal tiene que tener 5 bloques de alto, 4 de ancho y 1 de profundidad. Una vez construida la estructura del portal, tendrás que prender fuego al espacio interior para activarlo. Para ello, usa el objeto "chisquero de pedernal" o "descarga de fuego".{*B*}{*B*} +En la imagen de la derecha dispones de ejemplos de construcción de un portal. + + +{*T3*}CÓMO SE JUEGA: MULTIJUGADOR{*ETW*}{*B*}{*B*} +Minecraft para la consola Xbox 360 es, de forma predeterminada, un juego multijugador. En el modo de alta definición los jugadores locales pueden unirse a tu partida conectando un mando y pulsando START en cualquier momento del juego.{*B*}{*B*} +Si inicias o te unes a una partida en línea, los miembros de tu lista de amigos podrán verla (a menos que selecciones Solo por invitación cuando crees la partida), y si ellos se unen a la partida, los miembros de su lista de amigos también podrán verla (a menos que selecciones la opción Permitir amigos de amigos).{*B*} +Una vez en la partida, pulsa el Botón BACK para mostrar la lista de todos los jugadores, ver sus tarjetas de jugador, expulsar a jugadores de la partida e invitar a otros miembros a la partida. + + +{*T3*}CÓMO SE JUEGA: COMPARTIR CAPTURAS DE PANTALLA{*ETW*}{*B*}{*B*} +Si quieres realizar una captura de pantalla de tu partida, ve al menú de pausa y pulsa {*CONTROLLER_VK_Y*} para compartirla en Facebook. Obtendrás una versión en miniatura de tu captura y podrás editar el texto asociado a la publicación de Facebook.{*B*}{*B*} +Existe un modo de cámara especial para tomar estas capturas, de forma que podrás ver la parte frontal de tu personaje en la imagen. Pulsa{*CONTROLLER_ACTION_CAMERA*} hasta que veas la parte frontal del personaje y después pulsa{*CONTROLLER_VK_Y*} para compartir.{*B*}{*B*} +En la captura de pantalla no se mostrarán los gamertags. + + +{*T3*}CÓMO SE JUEGA: BLOQUEAR NIVELES{*ETW*}{*B*}{*B*} +Si detectas contenido ofensivo en algún nivel, puedes añadirlo a la lista de niveles bloqueados. +Si quieres hacerlo, accede al menú de pausa y pulsa {*CONTROLLER_VK_RB*} para seleccionar el mensaje de información sobre herramientas Bloquear nivel. +Si en un momento posterior quieres unirte a este nivel, recibirás una notificación de que se encuentra en la lista de niveles bloqueados y tendrás la opción de eliminarlo de la lista y continuarlo, o dejarlo bloqueado. + +{*T3*}CÓMO SE JUEGA: MODO CREATIVO{*ETW*}{*B*}{*B*} +La interfaz de modo Creativo del juego permite mover cualquier objeto del juego al inventario del jugador sin tener que extraerlo o crearlo. +Los objetos del inventario del jugador no se eliminan cuando se colocan o se usan en el mundo, lo que permite al jugador centrarse en la construcción más que en la recolección de recursos.{*B*} +Si creas, cargas o guardas un mundo en el modo Creativo, ese mundo tendrá deshabilitado los logros y las actualizaciones de marcador, aunque después lo cargues en el modo Supervivencia.{*B*} +Para volar en el modo Creativo, pulsa {*CONTROLLER_ACTION_JUMP*} dos veces con rapidez. Para dejar de volar, repite la acción. Para volar más rápido, pulsa{*CONTROLLER_ACTION_MOVE*} dos veces en una sucesión rápida mientras vuelas. +En modo de vuelo, puedes mantener pulsado{*CONTROLLER_ACTION_JUMP*} para subir y{*CONTROLLER_ACTION_SNEAK*} para bajar, o usa{*CONTROLLER_ACTION_DPAD_UP*} para subir, {*CONTROLLER_ACTION_DPAD_DOWN*} para bajar, +{*CONTROLLER_ACTION_DPAD_LEFT*} para ir a la izquierda y {*CONTROLLER_ACTION_DPAD_RIGHT*} para ir a la derecha. + +{*T3*}CÓMO SE JUEGA: OPCIONES DE HOST Y DE JUGADOR{*ETW*}{*B*}{*B*} + +{*T1*}Opciones de juego{*ETW*}{*B*} +Al cargar o crear un mundo, pulsa el botón "Más opciones" para entrar en un menú donde podrás tener más control sobre tu juego.{*B*}{*B*} + + {*T2*}Jugador contra jugador{*ETW*}{*B*} + Si está 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 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á 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 denota. Esta opción también se puede cambiar dentro del juego.{*B*}{*B*} + + {*T2*}Privilegios de host{*ETW*}{*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*} + + {*T2*}Genera estructuras{*ETW*}{*B*} + Si está habilitada, se generarán estructuras como aldeas y fortalezas en el mundo.{*B*}{*B*} + + {*T2*}Mundo superplano{*ETW*}{*B*} + Si está habilitada, se generará un mundo completamente plano en el mundo superior y en el mundo inferior.{*B*}{*B*} + + {*T2*}Cofre de bonificación{*ETW*}{*B*} + Si está habilitada, se creará un cofre con objetos útiles cerca del punto de generación del jugador.{*B*}{*B*} + + {*T2*}Restablecer mundo inferior{*ETW*}{*B*} + Si está 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_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*} + +{*T1*}Opciones del jugador{*ETW*}{*B*} +Para modificar los privilegios de un jugador, selecciona su nombre y pulsa{*CONTROLLER_VK_A*} para mostrar el menú de privilegios donde podrás usar las siguientes opciones.{*B*}{*B*} + + {*T2*}Puede construir y extraer{*ETW*}{*B*} + Esta opción solo está disponible cuando "Confiar en jugadores" está 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á 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á 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á 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á 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*} + {*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*}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*} + 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 + +Fundamentos + +HUD + +Inventario + +Cofres + +Creando + +Horno + +Dispensador + +Cuidar animales + +Reproducción de animales + +Destilación + +Hechizo + +Portal inferior + +Multijugador + +Compartir capturas de pantalla + +Bloquear niveles + +Modo Creativo + +Opciones de host y de jugador + +Comerciar + +Yunque + +El Fin + +{*T3*}CÓMO SE JUEGA: EL FIN{*ETW*}{*B*}{*B*} +El Fin es otra dimensión del juego, a la que se llega a través de un portal final activo. Puedes encontrar el portal final en una fortaleza, en lo más profundo del mundo superior.{*B*} +Para activar el portal final, debes colocar un ojo de Ender en la estructura de un portal final que no tenga uno.{*B*} +Una vez que el portal esté activo, introdúcete en él para ir a El fin.{*B*}{*B*} +En El Fin te encontrarás con el dragón de Ender, un feroz y poderoso enemigo, además de muchos finalizadores, por lo que tendrás que estar preparado para la batalla antes de ir allí.{*B*}{*B*} +En lo alto de ocho pilares obsidianos, verás cristales finalizadores que el dragón de Ender usa para curarse, +así que lo primero que deberás hacer será destruirlos todos.{*B*} +Podrás alcanzar a los primeros con flechas, pero los últimos están en una jaula con barrotes de hierro. Tendrás que subir a lo alto para llegar a ellos.{*B*}{*B*} +Mientras lo haces, el dragón de Ender volará hacia ti y te atacará escupiendo bolas de ácido de Ender.{*B*} +Si te acercas al nido de huevos en el centro de los pilares, el dragón de Ender irá hacia abajo y te atacará. ¡Tienes que aprovechar ese momento para hacerle daño!{*B*} +Esquiva su aliento de ácido y apunta a los ojos del dragón de Ender para hacerle el máximo daño posible. Si puedes, ¡tráete amigos a El Fin para que te echen una mano en la batalla!{*B*}{*B*} +En cuanto hayas llegado a El Fin, tus amigos podrán ver la ubicación del portal final dentro de la fortaleza en sus mapas, +para que puedan unirse a ti con facilidad. + + +Correr + +Novedades + +{*T3*}Cambios e incorporaciones{*ETW*}{*B*}{*B*} +- 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*}: 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. + +Se usa para excavar tierra, hierba, arena, gravilla y nieve más rápido que a mano. La pala es necesaria para excavar bolas de nieve. + +Necesario para perforar bloques de piedra y mineral. + +Se usa para picar bloques de madera más rápido que a mano. + +Se usa para labrar tierra y hierba y prepararla para el cultivo. + +Las puertas de madera se activan usándolas, golpeándolas o con piedra rojiza. + +Las puertas de hierro solo se pueden abrir con piedra rojiza, botones o interruptores. + +NOT USED + +NOT USED + +NOT USED + +NOT USED + +Cuando lo lleva puesto, el usuario recibe 1 de armadura. + +Cuando lo lleva puesto, el usuario recibe 3 de armadura. + +Cuando lo lleva puesto, el usuario recibe 2 de armadura. + +Cuando lo lleva puesto, el usuario recibe 1 de armadura. + +Cuando lo lleva puesto, el usuario recibe 2 de armadura. + +Cuando lo lleva puesto, el usuario recibe 5 de armadura. + +Cuando lo lleva puesto, el usuario recibe 4 de armadura. + +Cuando lo lleva puesto, el usuario recibe 1 de armadura. + +Cuando lo lleva puesto, el usuario recibe 2 de armadura. + +Cuando lo lleva puesto, el usuario recibe 6 de armadura. + +Cuando lo lleva puesto, el usuario recibe 5 de armadura. + +Cuando lo lleva puesto, el usuario recibe 2 de armadura. + +Cuando lo lleva puesto, el usuario recibe 2 de armadura. + +Cuando lo lleva puesto, el usuario recibe 5 de armadura. + +Cuando lo lleva puesto, el usuario recibe 3 de armadura. + +Cuando lo lleva puesto, el usuario recibe 1 de armadura. + +Cuando lo lleva puesto, el usuario recibe 3 de armadura. + +Cuando lo lleva puesto, el usuario recibe 8 de armadura. + +Cuando lo lleva puesto, el usuario recibe 6 de armadura. + +Cuando lo lleva puesto, el usuario recibe 3 de armadura. + +Un lingote brillante que se usa para crear herramientas de este material. Se crea fundiendo mineral en un horno. + +Permite convertir lingotes, gemas o tintes en bloques utilizables. Se puede usar como bloque de construcción de precio elevado o como almacenamiento compacto del mineral. + +Se usa para aplicar una descarga eléctrica cuando un jugador, un animal o un monstruo lo pisa. Los platos de presión de madera también se activan soltando algo sobre ellos. + +Se usan en escaleras compactas. + +Se usan para crear escaleras largas. Si colocas dos losas, una sobre otra, crearás un bloque de losa doble de tamaño normal. + +Se usan para crear escaleras largas. Si colocas dos losas, una sobre otra, crearás un bloque de losa doble de tamaño normal. + +Se usa para crear luz. Las antorchas derriten la nieve y el hielo. + +Se usan como material de construcción y se pueden convertir en muchas cosas. Se crean a partir de cualquier tipo de madera. + +Se usa como material de construcción. No recibe la influencia de la gravedad, como la arena normal. + +Se usa como material de construcción. + +Se usa para crear antorchas, flechas, señales, escaleras, vallas y mangos para armas y herramientas. + +Se usa para avanzar en el tiempo, desde cualquier momento de la noche hasta la mañana, si todos los jugadores del mundo están en cama; además cambia el punto de generación del jugador. +Los colores de la cama siempre son los mismos, independientemente del color de la lana que se use. + +Te permite crear una selección más variada de objetos que la creación normal. + +Te permite fundir mineral, crear carbón y cristal y cocinar pescado y chuletas. + +Almacena bloques y objetos en su interior. Coloca dos cofres uno junto a otro para crear un cofre más grande con el doble de capacidad. + +Se usa como barrera sobre la que no se puede saltar. Cuenta como 1,5 bloques de alto para jugadores, animales y monstruos, pero solo 1 bloque de alto para otros bloques. + +Se usa para escalar en vertical. + +Se activan mediante el uso, el golpe o la piedra rojiza. Funcionan como puertas normales, pero consisten en un bloque tras otro y se apoyan en el suelo. + +Muestra el texto introducido por ti o por otros jugadores. + +Se usa para crear luz más brillante que la de las antorchas. Derrite la nieve y el hielo y se puede usar bajo el agua. + +Se usa para provocar explosiones. Se activa después de su colocación golpeándola con el objeto eslabón y pedernal o con una descarga eléctrica. + +Se usa para contener estofado de champiñón. Te quedas el cuenco después de comer el estofado. + +Se usa para contener y transportar agua, lava y leche. + +Se usa para contener y transportar agua. + +Se usa para contener y transportar lava. + +Se usa para contener y transportar leche. + +Se usa para crear fuego, detonar dinamita y abrir un portal después de construirlo. + +Se usa para pescar peces. + +Muestra la posición del sol y de la luna. + +Indica tu punto de inicio. + +Cuando se porta, crea una imagen del área explorada. Se puede usar para buscar rutas. + +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. + +Restablece 1{*ICON_SHANK_01*}. + +Restablece 1{*ICON_SHANK_01*}. + +Restablece 3{*ICON_SHANK_01*}. + +Restablece 1{*ICON_SHANK_01*}o se puede cocinar en el horno. Si comes esto puede que te envenene. + +Restablece 3{*ICON_SHANK_01*}. Se crea cocinando pollo crudo en el horno. + +Restablece 1.5{*ICON_SHANK_01*}, o se puede cocinar en el horno. + +Restablece 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. + +Restablece 4{*ICON_SHANK_01*}. Se crea cocinando una chuleta de cerdo cruda en el horno. + +Restablece 1{*ICON_SHANK_01*}o se puede cocinar en el horno. Se puede dar de comer a un ocelote para domarlo. + +Restablece 2,5{*ICON_SHANK_01*}. Se crea cocinando pescado crudo en el horno. + +Restablece 2{*ICON_SHANK_01*} y se puede convertir en una manzana de oro. + +Restablece 2{*ICON_SHANK_01*} y regenera la salud durante 4 segundos. Creada con una manzana y pepitas de oro. + +Restablece 2{*ICON_SHANK_01*}. Si comes esto puede que te envenene. + +Se usa en la receta de pasteles como ingrediente para destilar pociones. + +Se activa y desactiva para aplicar una descarga eléctrica. Se mantiene en estado activado o desactivado hasta que se vuelve a pulsar. + +Da una descarga eléctrica +constante o puede usarse +de receptor/transmisor si +se conecta al lateral de +un bloque. También puede +usarse de iluminación +de nivel bajo. + + +Se usa en circuitos de piedra rojiza como repetidor, retardador o diodo. + +Se usa para enviar una descarga eléctrica cuando se pulsa. Se mantiene activo durante un segundo aproximadamente antes de volver a cerrarse. + +Se usa para sujetar y arrojar objetos en orden aleatorio cuando recibe una descarga de piedra rojiza. + +Reproduce una nota cuando se activa. Si lo golpeas cambiarás el tono de la nota. Colócalo en la parte superior de los bloques para cambiar el tipo de instrumento. + +Se usa para conducir vagonetas. + +Cuando se activa, acelera las vagonetas que pasan por encima. Si no está activado, las vagonetas se detendrán. + +Funciona como un plato de presión, 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. + +Se usa para transportar mercancías por los raíles. + +Se mueve por raíles y empujará a otras vagonetas si se le añade hulla. + +Se usa para desplazarte por el agua más rápido que nadando. + +Se obtiene de las ovejas y se puede colorear con tinte. + +Se usa como material de construcción y se puede colorear con tinte. Esta receta no es muy recomendable porque la lana se puede obtener con facilidad de las ovejas. + +Se usa como tinte para crear lana negra. + +Se usa como tinte para crear lana verde. + +Se usa como tinte para crear lana marrón, como ingrediente para cocinar galletas o para cultivar granos de cacao. + +Se usa como tinte para crear lana plateada. + +Se usa como tinte para crear lana amarilla. + +Se usa como tinte para crear lana roja. + +Se usa para que las cosechas, árboles, hierba alta, champiñones gigantes y flores crezcan al instante, y se puede usar en recetas de tinte. + +Se usa como tinte para crear lana rosa. + +Se usa como tinte para crear lana naranja. + +Se usa como tinte para crear lana lima. + +Se usa como tinte para crear lana gris. + +Se usa como tinte para +crear lana gris clara. + +(Nota: También se obtiene +combinando tinte gris con +carne de hueso, lo que +permite crear 4 tintes +gris claro de cada bolsa +de tinta en vez de 3). + +Se usa como tinte para crear lana azul clara. + +Se usa como tinte para crear lana cian. + +Se usa como tinte para crear lana púrpura. + +Se usa como tinte para crear lana magenta. + +Se usa como tinte para crear lana azul. + +Reproduce discos. + +Úsalos para crear herramientas, armas o armaduras sólidas. + +Se usa para crear luz más brillante que la de las antorchas. Derrite la nieve y el hielo y se puede usar bajo el agua. + +Se usa para crear libros y mapas. + +Se usa para crear estanterías o libros hechizados. + +Permite crear hechizos más potentes cuando se coloca alrededor de una mesa de hechizos. + +Se usa como elemento decorativo. + +Se puede perforar con un pico de hierro o un objeto mejor y después fundir en un horno para producir lingotes de oro. + +Se puede perforar con un pico de piedra o un objeto mejor y después fundir en un horno para producir lingotes de hierro. + +Se puede perforar con un pico para extraer hulla. + +Se puede perforar con un pico de piedra o un objeto mejor para extraer lapislázuli. + +Se puede perforar con un pico de hierro o un objeto mejor para extraer diamantes. + +Se puede perforar con un pico de hierro o un objeto mejor para extraer polvo de piedra rojiza. + +Se puede perforar con un pico para extraer guijarros. + +Se recoge con una pala. Se puede emplear en la construcción. + +Se puede plantar y con el tiempo se convierte en un árbol. + +No se puede romper. + +Incendia cualquier cosa que toque. Se puede recoger en un cubo. + +Se recoge con una pala. Se puede fundir y convertir en cristal en el horno. Recibe la influencia de la gravedad si no hay ninguna otra casilla por debajo. + +Se recoge con una pala. A veces produce pedernal cuando se excava. Recibe la influencia de la gravedad si no hay ninguna otra casilla por debajo. + +Se pica con un hacha y se puede convertir en tablones o usar como combustible. + +Se crea en el horno al fundir arena. Se puede usar en la construcción, pero si intentas perforarlo se romperá. + +Se extrae de la piedra con un pico. Se puede usar para construir un horno o herramientas de madera. + +Se cuecen con arcilla en un horno. + +Se cuece y convierte en ladrillo en un horno. + +Cuando se rompe suelta bolas de arcilla que se pueden cocer y convertir en ladrillos en un horno. + +Una forma compacta de almacenar bolas de nieve. + +Se puede excavar con una pala para crear bolas de nieve. + +A veces produce semillas de trigo cuando se rompe. + +Se puede convertir en tinte. + +Se puede convertir con un cuenco para hacer estofado. + +Solo se puede perforar con un pico de diamante. Se produce al combinar agua con lava inmóvil y se usa para construir portales. + +Genera monstruos en el mundo. + +Se coloca en el suelo para portar una descarga eléctrica. Cuando se destila con una poción, aumenta la duración del efecto. + +Cuando están completamente maduras, las cosechas se pueden recoger para obtener trigo. + +Terreno que se ha preparado para plantar semillas. + +Se pueden cocinar en un horno para crear tinte verde. + +Se pueden usar para crear azúcar. + +Se puede vestir como casco o convertir en antorcha para crear un fuego fatuo. También es el ingrediente principal del pastel de calabaza. + +Si se enciende, arderá para siempre. + +Ralentiza el movimiento de cualquier cosa que camina sobre ella. + +Si te colocas en el portal podrás trasladarte del mundo superior al inferior y viceversa. + +Se usa como combustible en un horno o se trabaja para crear una antorcha. + +Se consigue al matar una araña y se puede convertir en arco o caña de pescar, así como colocarlo en el suelo para crear un cable trampa. + +Se consigue al matar una gallina y se puede convertir en una flecha. + +Se consigue al matar un Creeper y se puede convertir en dinamita o utilizar como ingrediente para destilar pociones. + +Se puede plantar en una granja para hacer crecer los cultivos. ¡Asegúrate de que hay luz suficiente para que las semillas crezcan! + +Se cosecha de los cultivos y se puede usar para crear objetos de comida. + +Se obtiene al excavar gravilla y se puede usar para crear chisquero de pedernal. + +Si se usa con un cerdo te permite montarlo. Para controlarlo, usa un palo y una zanahoria. + +Se obtiene al excavar nieve y se puede arrojar. + +Se obtiene al matar una vaca y se puede convertir en armadura o utilizarlo para fabricar libros. + +Se obtiene al matar un limo y se usa como ingrediente para destilar pociones o para crear pistones adhesivos. + +Las gallinas lo sueltan al azar y se puede convertir en alimentos. + +Se obtiene al perforar una piedra brillante y se puede trabajar para crear bloques de piedra brillante otra vez o destilarlo en una poción para aumentar la potencia del efecto. + +Se obtiene al matar un esqueleto. Se puede convertir en carne de hueso. Se puede dar de comer a un lobo para domarlo. + +Se obtiene al hacer que un esqueleto mate un Creeper. Se puede reproducir en un tocadiscos. + +Extingue el fuego y ayuda a que crezcan las cosechas. Se puede recoger en un cubo. + +Si se rompen, a veces sueltan un arbolillo que se puede plantar para cultivar un árbol. + +Presente en las mazmorras, se puede emplear en la construcción y en la decoración. + +Se usa para obtener lana de las ovejas y cosechar bloques de hoja. + +Cuando se activa (por medio de un botón, una palanca, un plato de presión, una antorcha de piedra rojiza o piedra rojiza con cualquiera de ellos), se extiende un pistón y empuja los bloques. + +Cuando se activa (por medio de un botón, una palanca, un plato de presión, una antorcha de piedra rojiza o piedra rojiza con cualquiera de ellos), se extiende un pistón y empuja los bloques. Cuando se repliega, tira hacia atrás del bloque que está en contacto con la parte extendida del pistón. + +Creado con bloques de piedra y se encuentra normalmente en fortalezas. + +Se usa como barrera, igual que las vallas. + +Es como una puerta, pero se usa principalmente con vallas. + +Se puede crear a partir de rodajas de melón. + +Bloques transparentes que se pueden usar como alternativa a los bloques de cristal. + +Se puede plantar para cultivar calabazas. + +Se puede plantar para cultivar melones. + +Lo suelta el Finalizador cuando muere. Cuando se lanza, el jugador se teletransporta a la posición donde cae la perla finalizadora y pierde parte de la salud. + +Un bloque de tierra con hierba encima. Se recoge con una pala y se puede usar para construir. + +Se puede emplear en la construcción y en la decoración. + +Ralentiza el movimiento cuando pasas sobre él. Se puede destruir con unas tijeras para recoger la cuerda. + +Genera un pez plateado cuando se destruye. También puede generar un pez plateado si está cerca de otro al que están atacando. + +Una vez colocada, va creciendo con el paso del tiempo. Se puede recoger con tijeras. Puede usarse como una escalera para trepar por ella. + +Cuando se pasa sobre él se resbala. Se convierte en agua cuando se destruye si está sobre otro bloque. Se derrite si está cerca de una fuente de luz o si se coloca en el mundo inferior. + +Se puede usar como elemento decorativo. + +Se usa para destilar pociones y para localizar fortalezas. Lo sueltan las llamas, que se suelen encontrar en las fortalezas del mundo inferior o cerca. + +Se usa para destilar pociones. Lo sueltan los 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. + +Se usa para destilar pociones. Crecen de forma natural en las fortalezas del mundo inferior, donde pueden encontrarse. También se pueden plantar en arena de alma. + +Cuando se usa puede tener diversos efectos, dependiendo de con qué se use. + +Se puede llenar con agua y se usa como ingrediente inicial para crear una poción en el puesto de destilado. + +Es una comida venenosa y un objeto de destilado. Aparece cuando el jugador mata una araña o una araña de las cuevas. + +Se usa para destilar pociones, principalmente para crear pociones con efecto negativo. + +Se usa para destilar pociones o se combina con otros objetos para crear el ojo de Ender o crema de magma. + +Se usa para destilar pociones. + +Se usa para crear pociones y pociones de salpicadura. + +Se puede llenar con agua de lluvia o con un cubo y usar para llenar de agua las botellas de cristal. + +Cuando se lanza indica la dirección a un portal final. Si se colocan doce de ellos en estructuras de portal final, se activará el portal final. + +Se usa para destilar pociones. + +Son similares a los bloques de hierba pero fantásticos para cultivar champiñones. + +Flota en el agua y se puede caminar sobre él. + +Se usa para construir fortalezas del mundo inferior. Inmume a las bolas de fuego del Ghast. + +Se usa en las fortalezas del mundo inferior. + +Se encuentra en las fortalezas del mundo inferior si suelta verrugas del mundo inferior cuando se rompe. + +Esto permite a los jugadores hechizar espadas, picos, hachas, palas, arcos y armaduras utilizando puntos de experiencia del jugador. + +Se puede activar con doce ojos de Ender y permite al jugador viajar a la dimensión El Fin. + +Se usa para crear un portal final. + +Un tipo de bloque que se encuentra en El Fin. Tiene una resistencia a la ráfaga alta, así que es útil para utilizar en la construcción. + +Este bloque se crea al derrotar al dragón en El Fin. + +Cuando se lanza, suelta orbes de experiencia que aumentan tus puntos de experiencia al recogerlos. + +Útil para prender fuego a las cosas o para causar incendios de forma indiscriminada cuando se arroja mediante un dispensador. + +Son similares a una vitrina y mostrarán el objeto o bloque situado encima. + +Al lanzarse, puede generar una criatura del tipo indicado. + +Se usan para crear escaleras largas. Si colocas dos losas, una sobre otra, crearás un bloque de losa doble de tamaño normal. + +Se usan para crear escaleras largas. Si colocas dos losas, una sobre otra, crearás un bloque de losa doble de tamaño normal. + +Creado al fundir un bloque inferior en un horno. Puedeted by smelting Netherrack in a furnace. Se puede convertir en bloques de ladrillo del mundo inferior. + +Al recibir energía, emiten luz. + +Puede plantarse en la granja para cosechar granos de cacao. + +Las cabezas de enemigos pueden colocarse como decoración o llevarse como una máscara en el espacio de casco. + +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 + +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 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 + +Number Crunching and Statistics + +Bully Coordinator + +Original Design and Code by + +Project Manager/Producer + +Rest of Mojang Office + +Lead game programmer Minecraft PC + +Ninja Coder + +CEO + +White Collar Worker + +Customer Support + +Office DJ + +Designer/Programmer Minecraft - Pocket Edition + +Developer + +Chief Architect + +Art Developer + +Game Crafter + +Director of Fun + +Music and Sounds + +Programming + +Art + +QA + +Executive Producer + +Lead Producer + +Producer + +Test Lead + +Lead Tester + +Design Team + +Development Team + +Release Management + +Director, XBLA Publishing + +Business Development + +Portfolio Director + +Product Manager + +Marketing + + Community Manager + +Europe Localization Team + +Redmond Localization Team + +Asia Localization Team + +User Research Team + +MGS Central Teams + +Milestone Acceptance Tester + +Special Thanks + +Test Manager + +Senior Test Lead + +SDET + +Project STE + +Additional STE + +Test Associates + +Jon Kågström + +Tobias Möllstam + +Risë Lugo + +Espada de madera + +Espada de piedra + +Espada de hierro + +Espada de diamante + +Espada de oro + +Pala de madera + +Pala de piedra + +Pala de hierro + +Pala de diamante + +Pala de oro + +Pico de madera + +Pico de piedra + +Pico de hierro + +Pico de diamante + +Pico de oro + +Hacha de madera + +Hacha de piedra + +Hacha de hierro + +Hacha de diamante + +Hacha de oro + +Azada de madera + +Azada de piedra + +Azada de hierro + +Azada de diamante + +Azada de oro + +Puerta de madera + +Puerta de hierro + +Casco de malla + +Coraza de malla + +Mallas de malla + +Botas de malla + +Gorra de cuero + +Casco de hierro + +Casco de diamante + +Casco de oro + +Túnica de cuero + +Coraza de hierro + +Coraza de diamante + +Coraza de oro + +Pantalones de cuero + +Mallas de hierro + +Mallas de diamante + +Mallas de oro + +Botas de cuero + +Botas de hierro + +Botas de diamante + +Botas de oro + +Lingote de hierro + +Lingote de oro + +Cubo + +Cubo de agua + +Cubo de lava + +Chisquero de pedernal + +Manzana + +Arco + +Flecha + +Hulla + +Carbón + +Diamante + +Palo + +Cuenco + +Estofado de champiñón + +Cuerda + +Pluma + +Pólvora + +Semillas de trigo + +Trigo + +Pan + +Pedernal + +Chuleta de cerdo cruda + +Chuleta de cerdo cocinada + +Pintura + +Manzana de oro + +Señal + +Vagoneta + +Silla + +Piedra rojiza + +Bola de nieve + +Barco + +Cuero + +Cubo de leche + +Ladrillo + +Arcilla + +Cañas de azúcar + +Papel + +Libro + +Bola de limo + +Vagoneta con cofre + +Vagoneta con horno + +Huevo + +Brújula + +Caña de pescar + +Reloj + +Polvo p. brillante + +Pescado crudo + +Pescado cocinado + +Polvo de tinte + +Bolsa de tinta + +Rojo rosa + +Verde cactus + +Granos de cacao + +Lapislázuli + +Tinte púrpura + +Tinte cian + +Tinte gris claro + +Tinte gris + +Tinte rosa + +Tinte lima + +Amarillo amargo + +Tinte azul claro + +Tinte magenta + +Tinte naranja + +Carne de hueso + +Hueso + +Azúcar + +Pastel + +Cama + +Repetidor de p. rojiza + +Galleta + +Mapa + +Mapa vacío + +Disco: "13" + +Disco: "gato" + +Disco: "bloques" + +Disco: "gorjeo" + +Disco: "lejos" + +Disco: "galería" + +Disco: "mellohi" + +Disco: "establo" + +Disco: "strad" + +Disco: "pabellón" + +Disco: "11" + +Disco: "estamos" + +Tijeras + +Semillas de calabaza + +Semillas de melón + +Pollo crudo + +Pollo cocinado + +Ternera cruda + +Filete + +Carne podrida + +Ender Pearl + +Rodaja de melón + +Barra de llama + +Lágrima de Ghast + +Pepita de oro + +Verruga del mundo inferior + +{*splash*}{*prefix*}Poción {*postfix*} + +Botella de cristal + +Botella de agua + +Ojo de araña + +Ojo de araña fermentado + +Polvo de llama + +Crema de magma + +Puesto de destilado + +Caldero + +Ojo de Ender + +Melón resplandeciente + +Botella de hechizo + +Descarga de fuego + +Descarga de fuego (carbón) + +Descarga de fuego (hulla) + +Estructura de objeto + +Generar {*CREATURE*} + +Ladrillo del mundo inferior + +Calavera + +Calavera de esqueleto + +Calavera de esqueleto atrofiado + +Cabeza de zombi + +Cabeza + +Cabeza de %s + +Cabeza de Creeper + +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 + +Tierra + +Guijarro + +Tablones de roble + +Tablones de abeto + +Tablones de abedul + +Tablones de la jungla + +Tablones (de cualquier tipo) + +Arbolillo + +Arbolillo de roble + +Arbolillo de abeto + +Arbolillo de abedul + +Arbolillo de la jungla + +Lecho de roca + +Agua + +Lava + +Arena + +Arenisca + +Grava + +Mineral de oro + +Mineral de hierro + +Mineral de hulla + +Madera + +Madera de roble + +Madera de abeto + +Madera de abedul + +Madera de la jungla + +Roble + +Abeto + +Abedul + +Hojas + +Hojas de roble + +Hojas de abeto + +Hojas de abedul + +Hojas de la jungla + +Esponja + +Cristal + +Lana + +Lana negra + +Lana roja + +Lana verde + +Lana marrón + +Lana azul + +Lana púrpura + +Lana cian + +Lana gris claro + +Lana gris + +Lana rosa + +Lana lima + +Lana amarilla + +Lana azul claro + +Lana magenta + +Lana naranja + +Lana blanca + +Flor + +Rosa + +Champiñón + +Bloque de oro + +Una manera de almacenar oro de forma compacta. + +Una manera de almacenar hierro de forma compacta. + +Bloque de hierro + +Losa de piedra + +Losa de piedra + +Losa de arenisca + +Losa de roble + +Losa de guijarros + +Losa de ladrillos + +Losa ladr. piedra + +Losa de roble + +Losa de abeto + +Losa de abedul + +Losa de madera de la jungla + +Losa de ladrillo del mundo inferior + +Ladrillos + +Dinamita + +Estantería + +Piedra musgosa + +Obsidiana + +Antorcha + +Antorcha (hulla) + +Antorcha (carbón) + +Fuego + +Generador de monstruos + +Escaleras de roble + +Cofre + +Polvo de piedra rojiza + +Mineral de diamante + +Bloque de diamante + +Una manera de almacenar diamantes de forma compacta. + +Mesa de creación + +Cultivos + +Granja + +Horno + +Señal + +Puerta de madera + +Escalera + +Raíl + +Raíl propulsado + +Raíl detector + +Escaleras de piedra + +Palanca + +Plato de presión + +Puerta de hierro + +Mineral de piedra rojiza + +Ant. de piedra rojiza + +Botón + +Nieve + +Hielo + +Cactus + +Arcilla + +Caña de azúcar + +Tocadiscos + +Valla + +Calabaza + +Fuego fatuo + +Bloque inferior + +Arena de alma + +Piedra brillante + +Portal + +Mineral de lapislázuli + +Bloque lapislázuli + +Una manera de almacenar lapislázuli de forma compacta. + +Dispensador + +Bloque de nota + +Pastel + +Cama + +Tela + +Hierba alta + +Arbusto muerto + +Diodo + +Cofre cerrado + +Escotilla + +Lana + +Pistón + +Pistón adhesivo + +Bloque de pez plateado + +Ladrillos de piedra + +Ladrillos de piedra musgosa + +Ladrillos de piedra resquebrajada + +Ladrillos de piedra cincelados + +Champiñón + +Champiñón + +Barras de hierro + +Panel de cristal + +Melón + +Tallo de calabaza + +Tallo de melón + +Hiedras + +Puerta de valla + +Escaleras de ladrillo + +Esc. ladrillo de piedra + +Piedra pez plateado + +Guijarro de pez plateado + +Ladrillo de piedra de pez plateado + +Micelio + +Vaina de lila + +Ladrillo del mundo inferior + +Valla del mundo inferior + +Escaleras del mundo inferior + +Verruga del mundo inferior + +Mesa de hechizos + +Puesto de destilado + +Caldero + +Portal final + +Estructura de portal final + +Piedra final + +Huevo de dragón + +Arbusto + +Helecho + +Escaleras de arenisca + +Escaleras de abeto + +Escaleras de abedul + +Escaleras de madera de la jungla + +Lámpara de piedra rojiza + +Cacao + +Calavera + +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 + +Movimiento/Correr + +Mirar + +Pausa + +Salto + +Saltar/Volar hacia arriba + +Inventario + +Cambiar objeto + +Acción + +Usar + +Creación + +Soltar + +Acechar + +Acechar/Volar hacia abajo + +Cambiar modo de cámara + +Jugadores/Invitar + +Movimiento (al volar) + +Diseño 1 + +Diseño 2 + +Diseño 3 + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +{*B*}Pulsa{*CONTROLLER_VK_A*} para continuar. + +{*B*}Pulsa{*CONTROLLER_VK_A*} para comenzar el tutorial.{*B*} + Pulsa{*CONTROLLER_VK_B*} si crees que ya estás listo para jugar tú solo. + +Minecraft es un juego que consiste en colocar bloques para construir cualquier cosa que puedas imaginar. +De noche salen los monstruos, así que procura construir un refugio antes de que eso suceda. + +Usa{*CONTROLLER_ACTION_LOOK*} para mirar hacia arriba, hacia abajo o a tu alrededor. + +Usa{*CONTROLLER_ACTION_MOVE*} para moverte. + +Para correr, pulsa{*CONTROLLER_ACTION_MOVE*} hacia delante dos veces con rapidez. Mientras mantienes pulsado{*CONTROLLER_ACTION_MOVE*} hacia delante, el personaje seguirá corriendo a menos que te quedes sin tiempo de carrera o sin comida. + +Pulsa{*CONTROLLER_ACTION_JUMP*} para saltar. + +Mantén pulsado{*CONTROLLER_ACTION_ACTION*} para perforar y picar a mano o con el objeto que sostengas. Quizá tengas que crear una herramienta para perforar algunos bloques... + +Mantén pulsado{*CONTROLLER_ACTION_ACTION*} para talar 4 bloques de madera (troncos de árbol).{*B*}Cuando un bloque se rompe, puedes colocarte junto al objeto flotante que aparece para recogerlo y así hacer que salga en tu inventario. + +Pulsa{*CONTROLLER_ACTION_CRAFTING*} para abrir la interfaz de creación. + +A medida que recojas y crees más objetos, llenarás tu inventario.{*B*} + Pulsa{*CONTROLLER_ACTION_INVENTORY*} para abrir el inventario. + +Cuando te mueves, extraes o atacas, tu barra de comida se vacía{*ICON_SHANK_01*}. Si corres y saltas en carrera consumes más comida que si caminas y saltas de forma normal. + +Si pierdes salud pero tienes una barra de comida con 9 o más{*ICON_SHANK_01*} en ella, la salud se repondrá automáticamente. Si comes se recargará la barra de comida. + +Con un objeto de comida en la mano, mantén pulsado{*CONTROLLER_ACTION_USE*} para comerlo y recargar la barra de comida. No puedes comer si la barra de comida está llena. + +Tu barra de comida está baja y has perdido salud. Come el filete de tu inventario para recargar tu barra de comida y empezar a curarte.{*ICON*}364{*/ICON*} + +La leña que recojas se puede convertir en tablones. Abre la interfaz de creación para crearlos.{*PlanksIcon*} + +Si creas mucho, necesitarás repetir la acción muchas veces. Ahora que tienes tablones, hay más objetos que puedes crear. Crea una mesa de creación.{*CraftingTableIcon*} + +Para que la recolección de bloques sea más rápida, puedes construir herramientas diseñadas a tal efecto. Algunas herramientas tienen un mando de palo. Crea algunos palos ahora.{*SticksIcon*} + +Usa{*CONTROLLER_ACTION_LEFT_SCROLL*} y{*CONTROLLER_ACTION_RIGHT_SCROLL*} para cambiar el objeto que llevas en ese momento. + +Utiliza{*CONTROLLER_ACTION_USE*} para usar objetos, interaccionar con ellos y colocarlos. Los objetos colocados se pueden volver a coger perforándolos con la herramienta adecuada. + +Para colocar una mesa de creación, selecciónala, apunta donde la quieras y usa{*CONTROLLER_ACTION_USE*}. + +Apunta hacia la mesa de creación y pulsa{*CONTROLLER_ACTION_USE*} para abrirla. + +Con una pala puedes excavar bloques blandos, como tierra y nieve, más rápido. A medida que recoges más materiales puedes crear herramientas para trabajar más rápido y durante más tiempo. Crea una pala de madera.{*WoodenShovelIcon*} + +Con un hacha puedes picar madera y casillas de madera más rápido. A medida que recoges más materiales puedes crear herramientas para trabajar más rápido y durante más tiempo. Crea un hacha de madera.{*WoodenHatchetIcon*} + +Con un pico puedes excavar bloques duros, como piedra y mineral, más rápido. A medida que recoges más materiales puedes crear herramientas para trabajar más rápido y durante más tiempo. Crea un pico de madera.{*WoodenPickaxeIcon*} + +Abre el contenedor + + + La noche cae enseguida, y es un momento peligroso para salir sin estar preparado. Puedes crear armadura y armas, pero lo más sensato es disponer de un refugio seguro. + + + + Cerca de aquí hay un refugio de minero abandonado que puedes finalizar para mantenerte a salvo por la noche. + + + + Para finalizar el refugio tendrás que recoger recursos. Los muros y los tejados se fabrican con cualquier tipo de casilla, pero tendrás que crear una puerta, ventanas e iluminación. + + +Usa tu pico para perforar bloques de piedra. Estos bloques producirán guijarros al perforarlos. Si recoges 8 bloques de guijarro podrás construir un horno. Para llegar a la piedra quizá debas excavar algo de tierra, así que usa una pala para esta tarea.{*StoneIcon*} + +Ya has recogido suficientes guijarros para construir un horno. Usa la mesa de creación para construir uno. + +Usa{*CONTROLLER_ACTION_USE*} para colocar un horno en el mundo y después ábrelo. + +Usa el horno para crear carbón. Si estás esperando a que termine, ¿por qué no empleas ese tiempo en recoger más materiales para finalizar el refugio? + +Usa el horno para crear cristal. Si estás esperando a que termine, ¿por qué no empleas ese tiempo en recoger más materiales para finalizar el refugio? + +Un buen refugio debe tener una puerta para que puedas entrar y salir con facilidad sin tener que perforar y sustituir los muros. Crea ahora una puerta de madera.{*WoodenDoorIcon*} + +Usa{*CONTROLLER_ACTION_USE*} para colocar la puerta. Puedes usar {*CONTROLLER_ACTION_USE*}para abrir y cerrar una puerta de madera en el mundo. + +La noche puede ser muy oscura, así que necesitarás iluminación en el refugio si quieres ver. Crea una antorcha con palos y carbón mediante la interfaz de creación.{*TorchIcon*} + + + Has completado la primera parte del tutorial. + + + + {*B*} +Pulsa{*CONTROLLER_VK_A*} para continuar el tutorial.{*B*} + Pulsa{*CONTROLLER_VK_B*} si crees que ya estás listo para jugar tú solo. + + + + Este es tu inventario. Muestra los objetos que llevas en la mano y los demás objetos que portas. Aquí también aparece tu armadura. + +{*B*} + Pulsa{*CONTROLLER_VK_A*} para continuar.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo usar el inventario. + + + + Usa{*CONTROLLER_MENU_NAVIGATE*}para mover el foco. Usa{*CONTROLLER_VK_A*}para recoger un objeto señalado con el foco. + Si hay más de un objeto, los cogerás todos; también puedes usar{*CONTROLLER_VK_X*}para coger solo la mitad de ellos. + + + + Mueve el objeto con el foco hacia otro espacio del inventario y colócalo con{*CONTROLLER_VK_A*}. + Si hay varios objetos en el foco, usa{*CONTROLLER_VK_A*} para colocarlos todos o{*CONTROLLER_VK_X*} para colocar solo uno. + + + + Si desplazas el foco por fuera del borde de la interfaz con un objeto en él, podrás soltarlo. + + + + Si quieres obtener más información sobre un objeto, mueve el foco sobre él y pulsa{*CONTROLLER_ACTION_MENU_PAGEDOWN*} . + + + + Pulsa{*CONTROLLER_VK_B*} ahora para salir del inventario. + + + + Este es el inventario del modo Creativo. Muestra los objetos que llevas en la mano y los demás objetos que puedes elegir. + + +{*B*} + Pulsa{*CONTROLLER_VK_A*} para continuar.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo usar el inventario del modo Creativo. + + + + Usa{*CONTROLLER_MENU_NAVIGATE*} para mover el foco. + En una lista de objetos, usa{*CONTROLLER_VK_A*} para recoger un objeto que esté bajo el foco y usa{*CONTROLLER_VK_Y*} para recoger un montón entero de ese objeto. + + + + El foco se desplazará automáticamente sobre un espacio de la fila de uso. Usa{*CONTROLLER_VK_A*} para colocarlo. Después de colocar el objeto, el foco volverá a la lista de objetos y podrás seleccionar otro. + + + + Si desplazas el foco por fuera del borde de la interfaz con un objeto en él, podrás soltarlo en el mundo. Para borrar todos los objetos de la barra de selección rápida, pulsa{*CONTROLLER_VK_X*}. + + + + Desplázate por las pestañas de tipo de grupo de la parte superior con{*CONTROLLER_VK_LB*} y{*CONTROLLER_VK_RB*} para seleccionar el tipo de grupo del objeto que quieres recoger. + + + + Si quieres obtener más información sobre un objeto, mueve el foco sobre él y pulsa{*CONTROLLER_ACTION_MENU_PAGEDOWN*} . + + + + Pulsa{*CONTROLLER_VK_B*} ahora para salir del inventario del modo Creativo. + + + + Esta es la interfaz de creación. En esta interfaz puedes combinar los objetos que has recogido para crear objetos nuevos. + + +{*B*} + Pulsa{*CONTROLLER_VK_A*} para continuar.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo crear. + + +{*B*} + Pulsa{*CONTROLLER_VK_X*} para mostrar la descripción del objeto. + + +{*B*} + Pulsa{*CONTROLLER_VK_X*} para mostrar los ingredientes necesarios para fabricar el objeto actual. + + +{*B*} + Pulsa{*CONTROLLER_VK_X*} para mostrar de nuevo el inventario. + + + + Desplázate por las pestañas de tipo de grupo de la parte superior con{*CONTROLLER_VK_LB*} y{*CONTROLLER_VK_RB*} para seleccionar el tipo de grupo del objeto que quieres crear; a continuación usa{*CONTROLLER_MENU_NAVIGATE*} para seleccionar el objeto y crearlo. + + + + La zona de creación indica los objetos que se necesitan para crear el nuevo objeto. Pulsa{*CONTROLLER_VK_A*} para crear el objeto y colocarlo en tu inventario. + + + + Con una mesa de creación puedes crear objetos más grandes. La creación en una mesa se realiza igual que la creación normal, pero dispones de un área de creación mayor que permite una mayor combinación de ingredientes. + + + + La parte inferior derecha de la interfaz de creación muestra tu inventario. Aquí puede aparecer también una descripción del objeto seleccionado en ese momento y los ingredientes necesarios para crearlo. + + + + Ahora aparece la descripción del objeto seleccionado actualmente. Esta descripción puede darte una idea de la utilidad de ese objeto. + + + + Ahora aparece la lista de ingredientes necesarios para crear el objeto actual. + + +La leña que recojas se puede convertir en tablones. Selecciona el icono de tablones y pulsa{*CONTROLLER_VK_A*} para crearlos.{*PlanksIcon*} + + + Ahora que has construido una mesa de creación, deberías colocarla en el mundo para poder construir una selección mayor de objetos.{*B*} + Pulsa{*CONTROLLER_VK_B*} ahora para salir de la interfaz de creación. + + + + Pulsa{*CONTROLLER_VK_LB*} y{*CONTROLLER_VK_RB*} para cambiar el tipo de grupo de los objetos que quieres crear. Selecciona el grupo de herramientas.{*ToolsIcon*} + + + + Pulsa{*CONTROLLER_VK_LB*} y{*CONTROLLER_VK_RB*} para cambiar el tipo de grupo de los objetos que quieres crear. Selecciona el grupo de estructuras.{*StructuresIcon*} + + + + Usa{*CONTROLLER_MENU_NAVIGATE*}para cambiar al objeto que quieres crear. Algunos objetos tienen varias versiones, en función de los materiales utilizados. Selecciona la pala de madera.{*WoodenShovelIcon*} + + + + Si creas mucho necesitarás repetir la acción muchas veces. Ahora que tienes tablones, hay más objetos que puedes crear. Usa{*CONTROLLER_MENU_NAVIGATE*}para desplazarte al objeto que quieres crear. Selecciona la mesa de creación.{*CraftingTableIcon*} + + + + Con las herramientas que has creado ya estás listo para empezar y podrás recoger varios materiales de forma más eficaz.{*B*} + Pulsa{*CONTROLLER_VK_B*} ahora para salir de la interfaz de creación. + + + + Hay objetos que no se pueden crear con la mesa de creación, sino que requieren un horno. Crea un horno ahora.{*FurnaceIcon*} + + + + Coloca el horno que has creado en el mundo. Te conviene colocarlo en el interior del refugio.{*B*} + Pulsa{*CONTROLLER_VK_B*} ahora para salir de la interfaz de creación. + + + + Esta es la interfaz del horno. En el horno puedes modificar objetos fundiéndolos. En el horno puedes, por ejemplo, convertir mineral de hierro en lingotes de hierro. + + +{*B*} + Pulsa{*CONTROLLER_VK_A*} para continuar.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo usar el horno. + + + + Tienes que colocar combustible en el espacio de la parte inferior del horno y el objeto que quieres modificar en el espacio superior. El horno se encenderá y empezará a funcionar, y colocará el resultado en el espacio de la parte derecha. + + + + Muchos objetos de madera se pueden usar como combustible, pero no todos arden la misma cantidad de tiempo. También es posible descubrir otros objetos en el mundo que funcionen como combustible. + + + + Después de fundir los objetos puedes trasladarlos de la zona de producción a tu inventario. Experimenta con distintos ingredientes para comprobar lo que puedes crear. + + + + Si usas la madera como ingrediente podrás crear carbón. Coloca combustible en el horno y la madera en el espacio de ingredientes. Puede que el horno tarde un tiempo en crear el carbón, así que puedes aprovechar para hacer alguna otra cosa y volver más tarde a comprobar el progreso. + + + + El carbón se puede usar como combustible y convertir en una antorcha con un palo. + + + + Si colocas arena en el espacio de ingredientes podrás crear cristal. Crea bloques de cristal para usarlos a modo de ventana en el refugio. + + + + Esta es la interfaz de destilado. Se puede usar para crear pociones con efectos diversos. + + +{*B*} + Pulsa{*CONTROLLER_VK_A*} para continuar.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo usar el puesto de destilado. + + + + Para destilar pociones, coloca un ingrediente en la parte superior y una botella de agua o una poción en los espacios inferiores (se pueden destilar hasta 3 a la vez). Cuando se introduce una combinación válida, comienza el destilado y al cabo de poco tiempo se creará una poción. + + + + Todas las pociones se empiezan con una botella de agua. La mayoría de pociones se crean usando primero una verruga del mundo inferior para crear una poción rara y requieren como mínimo un ingrediente más para obtener la poción final. + + + + Una vez que tengas una poción, podrás modificar sus efectos. Si añades polvo de piedra rojiza, aumentas la duración del efecto, y si añades polvo de piedra brillante su efecto será más potente. + + + + Si añades ojo de araña fermentado dañarás la poción y puede que la conviertas en otra con el efecto contrario, y si añades pólvora quizá la conviertas en una poción de salpicadura que se puede lanzar para aplicar su efecto sobre un área cercana. + + + + Para crear una poción de resistencia al fuego, primero añade una verruga del mundo inferior a una botella de agua y luego añade crema de magma. + + + + Pulsa{*CONTROLLER_VK_B*} ahora para salir de la interfaz de destilación. + + + + En esta zona hay un puesto de destilado, un caldero y un cofre lleno de objetos para destilar. + + +{*B*} + Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre el destilado y las pociones.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo destilar y crear pociones. + + + + El primer paso para destilar una poción es crear una botella de agua. Toma una botella de agua del cofre. + + + + Puedes llenar una botella de agua con un caldero que tenga agua o con un bloque de agua. Ahora, para llenar la botella de agua, apunta a una fuente de agua y pulsa{*CONTROLLER_ACTION_USE*}. + + + + Si un caldero se vacía, puedes rellenarlo con un cubo de agua. + + + + Usa el puesto de destilado para crear una poción de resistencia al fuego. Necesitarás una botella de agua, verruga del mundo inferior y crema de magma. + + + + Toma una poción en la mano y mantén pulsado{*CONTROLLER_ACTION_USE*} para usarla. Si es una poción normal, bébela y te aplicarás el efecto a ti mismo; si es una poción de salpicadura, la lanzarás y aplicarás el efecto a las criaturas que estén cerca en el momento del impacto. + Las pociones de salpicadura se crean añadiendo pólvora a las pociones normales. + + + + Usa una poción de resistencia al fuego contigo mismo. + + + Ahora eres resistente al fuego y a la lava, así que comprueba si puedes acceder a lugares a los que antes no podías. + + + + Esta es la interfaz de hechizo, que puedes usar para añadir hechizos a armas, armadura y a algunas herramientas. + + +{*B*} + Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre la interfaz de hechizos.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo utilizar la interfaz de hechizos. + + + + Para hechizar un objeto, primero colócalo en el espacio de hechizado. Las armas, las armaduras y algunas herramientas se pueden hechizar para añadirles efectos especiales, como resistencia mejorada al daño o aumentar el número de objetos que se generan al extraer un bloque. + + + + Cuando se coloca un objeto en el espacio de hechizado, los botones de la parte derecha cambian y muestran una selección de hechizos aleatorios. + + + + El número que está sobre el botón representa el coste en niveles de experiencia que tiene que aplicar ese hechizo al objeto. Si no tienes un nivel suficiente, el botón no estará activo. + + + + Selecciona un hechizo y pulsa{*CONTROLLER_VK_A*} para hechizar el objeto. Con ello se reducirá el nivel de experiencia en función del coste del hechizo. + + + + Aunque los hechizos son aleatorios, algunos de los mejores hechizos solo están disponibles cuando tienes el nivel de experiencia adecuado y muchas estanterías alrededor de la mesa de hechizos para aumentar su poder. + + + + En esta zona hay una mesa de hechizos y otros objetos que te ayudarán a entender y aprender los hechizos. + + +{*B*} + Pulsa {*CONTROLLER_VK_A*} para obtener más información sobre los hechizos.{*B*} + Pulsa {*CONTROLLER_VK_B*} si ya sabes cómo utilizar los hechizos. + + + + Con una mesa de hechizos podrás añadir efectos especiales, como aumentar el número de objetos que se obtienen al extraer un bloque o mejorar la resistencia al daño de armas, armaduras y algunas herramientas. + + + + Coloca estanterías alrededor de la mesa de hechizos para aumentar su poder y acceder a hechizos de nivel superior. + + + + Hechizar objetos cuesta niveles de experiencia, que se aumentan al acumular orbes de experiencia. Estos orbes se generan al matar monstruos y animales, extraer mineral, criar nuevos animales, pescar y fundir o cocinar algunos objetos en un horno. + + + + También puedes aumentar niveles de experiencia con una botella de hechizo que, una vez arrojada, crea orbes de experiencia donde cae. Después podrás recoger esos orbes. + + + + En los cofres de esta zona encontrarás objetos hechizados, botellas de hechizos y objetos que aún están sin hechizar para que experimentes con ellos en la mesa de hechizos. + + + + Ahora vas subido en una vagoneta. Para salir de ella, apunta el cursor hacia ella y pulsa{*CONTROLLER_ACTION_USE*}.{*MinecartIcon*} + + +{*B*} + Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre las vagonetas.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo funcionan las vagonetas. + + + + Las vagonetas van sobre raíles. También puedes crear una vagoneta propulsada con un horno y una vagoneta con un cofre en ella. + {*RailIcon*} + + + + También puedes crear raíles propulsados, que absorben energía de las antorchas y circuitos de piedra rojiza para acelerar las vagonetas. Se pueden conectar a interruptores, palancas y platos de presión para crear sistemas complejos. + {*PoweredRailIcon*} + + + + Ahora navegas en un barco. Para salir de él, apunta el cursor hacia él y pulsa{*CONTROLLER_ACTION_USE*}.{*BoatIcon*} + + + + {*B*} + Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre los barcos.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo funcionan los barcos. + + + + Los barcos te permiten viajar más deprisa por el agua. Usa{*CONTROLLER_ACTION_MOVE*} y{*CONTROLLER_ACTION_LOOK*} para pilotarlo. + {*BoatIcon*} + + + + Ahora usas una caña de pescar. Pulsa{*CONTROLLER_ACTION_USE*} para usarla.{*FishingRodIcon*} + + + + {*B*} + Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre la pesca.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo pescar. + + + + Pulsa{*CONTROLLER_ACTION_USE*} para lanzar la caña y empezar a pescar. Pulsa{*CONTROLLER_ACTION_USE*} de nuevo para recoger sedal. + {*FishingRodIcon*} + + + + Si esperas a que el corcho se hunda por debajo de la superficie del agua antes de recoger, podrás pescar un pez. Los peces se pueden comer crudos o cocinados en un horno para recuperar salud. + {*FishIcon*} + + + + Al igual que muchas otras herramientas, la caña tiene muchos usos distintos. Sus usos no se limitan a pescar peces. Puedes experimentar con ella e investigar qué se puede pescar o activar... + {*FishingRodIcon*} + + + + Esto es una cama. Pulsa{*CONTROLLER_ACTION_USE*} y apunta hacia ella de noche para dormir y despertar por la mañana.{*ICON*}355{*/ICON*} + + + + {*B*} + Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre las camas.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo funcionan las camas. + + + + Las camas deben colocarse en un lugar seguro y bien iluminado para que los monstruos no te despierten en mitad de la noche. Después de usar una cama, si mueres te regenerarás en ella. + {*ICON*}355{*/ICON*} + + + + Si hay más jugadores en tu juego, todos deben estar en una cama al mismo tiempo para poder dormir. + {*ICON*}355{*/ICON*} + + + + En esta área hallarás circuitos sencillos de pistones y piedra rojiza, así como un cofre con más objetos para ampliar estos circuitos. + + + + {*B*} + Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre los circuitos de piedra rojiza y los pistones.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya tienes información sobre los circuitos de piedra rojiza y los pistones. + + + + Las palancas, botones, platos de presión y antorchas de piedra rojiza proporcionan energía a los circuitos, bien acoplándolos directamente al objeto que quieres activar o conectándolos con polvo de piedra rojiza. + + + + La posición y dirección en que colocas la fuente de energía puede cambiar la forma en que afecta a los bloques que la rodean. Por ejemplo, una antorcha de piedra rojiza en un lado de un bloque se puede desactivar si el bloque recibe energía de otra fuente. + + + + El polvo de piedra rojiza se consigue al extraer mineral de piedra rojiza con un pico hecho de hierro, diamante u oro. Puedes usarlo para proporcionar energía a un máximo de 15 bloques, y se puede desplazar hacia arriba o hacia abajo un bloque de altura. + {*ICON*}331{*/ICON*} + + + + Los repetidores de piedra rojiza se usan para ampliar la distancia a la que se puede transportar la energía o para colocar un retardo en un circuito. + {*ICON*}356{*/ICON*} + + + + Al recibir energía, los pistones se extienden y empujan hasta 12 bloques. Cuando se repliegan, los pistones adhesivos pueden tirar de bloques de casi cualquier tipo. + {*ICON*}33{*/ICON*} + + + + En el cofre de esta área encontrarás componentes para fabricar circuitos con pistones. Prueba a usar o completar los circuitos de esta área o coloca los tuyos propios. Fuera del área de tutorial encontrarás más ejemplos. + + + + ¡En esta área hay un portal al mundo inferior! + + + + {*B*} + Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre los portales y el mundo inferior.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya conoces los portales y el mundo inferior. + + + + Los portales se crean colocando obsidiana en una estructura de cuatro bloques de ancho y cinco de alto. No se necesitan bloques de esquina. + + + + Para activar el portal inferior, prende fuego a los bloques de obsidiana del interior de la estructura con eslabón y pedernal. Los portales se pueden desactivar si se rompe la estructura, si se produce una explosión cerca y si fluye un líquido a través de ellos. + + + + Para usar un portal inferior, colócate en su interior. La pantalla se pondrá púrpura y se reproducirá un sonido. Al cabo de unos segundos, te transportarás a otra dimensión. + + + + El mundo inferior es un lugar peligroso, repleto de lava, pero puede recoger un bloque inferior, que arde para siempre una vez que se enciende, y piedra brillante que genera luz. + + + + El mundo inferior sirve para desplazarte con rapidez por el mundo superior. Una distancia de un bloque en el mundo inferior equivale a desplazarte 3 bloques en el mundo superior. + + + + Ahora estás en el modo Creativo. + + + + {*B*} + Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre el modo Creativo.{*B*} + Pulsa{*CONTROLLER_VK_B*}si ya sabes cómo funciona el modo Creativo. + + +En el modo Creativo posees un número infinito de los objetos y bloques disponibles, puedes destruir bloques con un clic y sin herramientas, eres invulnerable y puedes volar. + +Pulsa{*CONTROLLER_ACTION_JUMP*} dos veces con rapidez para volar. Para dejar de volar, repite la acción. Para volar más rápido, pulsa{*CONTROLLER_ACTION_MOVE*} dos veces en una sucesión rápida mientras vuelas. +En el modo de vuelo, mantén pulsado{*CONTROLLER_ACTION_JUMP*} para moverte hacia arriba y{*CONTROLLER_ACTION_SNEAK*} para moverte hacia abajo, o usa el mando D para moverte hacia arriba, hacia abajo, hacia la izquierda o hacia la derecha. + +Pulsa{*CONTROLLER_ACTION_CRAFTING*} para abrir la interfaz del inventario creativo. + +Para continuar, cruza al otro lado de este agujero. + +Has completado el tutorial del modo creativo. + + + En esta área se ha colocado una granja. Cultivar en la granja te permite crear una fuente renovable de comida y otros objetos. + + + + {*B*} + Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre los cultivos.{*B*} + Pulsa{*CONTROLLER_VK_B*}si ya sabes cómo funcionan los cultivos. + + +El trigo, las calabazas y los melones se cultivan a partir de semillas. Las semillas de trigo se obtienen al romper hierba alta o al cosechar trigo, y las semillas de calabaza y melón se consiguen a partir de calabazas y melones respectivamente. + +Antes de plantar semillas, debes convertir los bloques de tierra en tierra de cultivo por medio de una azada. Una fuente cercana de agua te ayudará a mantener la tierra de cultivo hidratada y hará que los cultivos crezcan más rápido, además de mantener la zona iluminada. + +El trigo pasa por distintas fases durante su crecimiento. Cuando aparece más oscuro es que está listo para la cosecha.{*ICON*}59:7{*/ICON*} + +Las calabazas y los melones también necesitan un bloque cerca de donde hayas plantado la semilla para que el fruto crezca cuando el tallo se haya desarrollado por completo. + +La caña de azúcar debe plantarse en un bloque de hierba, tierra o arena que esté junto a un bloque de agua. Cortar un bloque de caña de azúcar provocará que todos los bloques que estén sobre él caigan.{*ICON*}83{*/ICON*} + +Los cactus deben plantarse en arena y crecerán hasta tres bloques de alto. Al igual que con la caña de azúcar, si se destruye el bloque más bajo podrás recoger los bloques que estén sobre él.{*ICON*}81{*/ICON*} + +Los champiñones deben plantarse en una zona con luz tenue y se extenderán a los bloques de luz tenue cercanos.{*ICON*}39{*/ICON*} + +La carne de hueso se puede usar para germinar cultivos hasta su estado de mayor crecimiento o cultivar champiñones hasta que se hagan gigantes.{*ICON*}351:15{*/ICON*} + +Has completado el tutorial de los cultivos. + + + En esta área se han guardado animales en corrales. Puedes hacer que los animales se reproduzcan para crear crías de sí mismos. + + + + {*B*} + Pulsa {*CONTROLLER_VK_A*} para obtener más información sobre la reproducción de animales.{*B*} + Pulsa {*CONTROLLER_VK_B*} si ya sabes cómo funciona la reproducción de animales. + + +Para que los animales se reproduzcan, tendrás que alimentarlos con la comida adecuada para que entren en el "modo Amor". + +Si alimentas con trigo a las vacas, champiñacas u ovejas, con zanahorias a los cerdos, con semillas de trigo o verrugas del mundo inferior a los pollos, o con cualquier tipo de carne a los lobos, estos animales empezarán a buscar a otros animales de la misma especie que también estén en el modo Amor. + +Cuando dos animales de la misma especie se encuentran, y ambos están en el modo Amor, se besarán durante unos segundos y luego aparecerá una cría. La cría seguirá a sus padres durante un tiempo antes de convertirse en un animal adulto. + +Después de estar en el modo Amor los animales no podrán volver a él durante cinco minutos como mínimo. + +Algunos animales te seguirán si tienes su comida en la mano. Así te será más fácil agrupar animales para hacer que se reproduzcan.{*ICON*}296{*/ICON*} + + + Los lobos salvajes se pueden 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. + + + En esta zona hay algunas calabazas y bloques para crear un gólem de nieve y otro de hierro. + + + + {*B*} + Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre los gólems.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo funcionan los gólems. + + +Los gólems se crean colocando una calabaza encima de un montón de bloques. + +Los gólems de nieve se crean con dos bloques de nieve, uno sobre el otro, y encima una calabaza. Estos gólems lanzan bolas de nieve a tus enemigos. + +Los gólems de hierro se crean con cuatro bloques de hierro colocados como muestra el modelo y con una calabaza encima del bloque central. Estos gólems atacan a tus enemigos. + +Los gólems de hierro aparecen en las aldeas para protegerlas, y te atacarán si atacas a los aldeanos. + +No puedes salir de esta área hasta que completes el tutorial. + +Cada herramienta funciona mejor con distintos materiales. Deberías usar una pala para perforar materiales blandos como tierra y arena. + +Cada herramienta funciona mejor con distintos materiales. Deberías usar un hacha para cortar troncos de árboles. + +Cada herramienta funciona mejor con distintos materiales. Deberías usar un pico para perforar piedra y mineral. Quizá debas fabricar tu pico con mejores materiales para obtener recursos de algunos bloques. + +Hay herramientas que son mejores para atacar enemigos. Plantéate usar una espada para atacar. + +Consejo: mantén pulsado {*CONTROLLER_ACTION_ACTION*}para perforar y picar a mano o con el objeto que sostengas. Quizá tengas que crear una herramienta para perforar algunos bloques... + +La herramienta que usas está dañada. Cada vez que usas una herramienta le causarás daños y con el tiempo se romperá. La barra de colores que está debajo del objeto en el inventario muestra el estado de daños actual. + +Mantén pulsado{*CONTROLLER_ACTION_JUMP*} para nadar. + +En esta área hay una vagoneta en una pista. Para subir a una vagoneta, apunta el cursor hacia ella y puls{*CONTROLLER_ACTION_USE*}. Usa{*CONTROLLER_ACTION_USE*} sobre el botón para que la vagoneta se mueva. + +En el cofre que está junto al río hay un barco. Para usar el barco, apunta el cursor al agua y pulsa{*CONTROLLER_ACTION_USE*}. Usa{*CONTROLLER_ACTION_USE*} mientras apuntas al barco para subir a él. + +En el cofre que está junto al estanque hay una caña de pescar. Coge la caña del cofre y selecciónala para que sea el objeto que quieres llevar en la mano para usarla. + +¡Este mecanismo de pistones más avanzado crea un puente autorreparable! Pulsa el botón para activarlo e investiga la forma en que los componentes interaccionan para averiguar su funcionamiento. + +Si desplazas el foco por fuera del borde de la interfaz con un objeto en él, podrás soltarlo. + +No tienes todos los ingredientes necesarios para crear este objeto. El cuadro de la parte inferior izquierda muestra los ingredientes necesarios para crearlo. + + + ¡Enhorabuena! Has completado el tutorial. El tiempo del juego transcurre ahora a velocidad normal, ¡y no falta mucho para la noche y para que salgan los monstruos! ¡Acaba el refugio! + + +{*EXIT_PICTURE*} Cuando estés dispuesto a seguir explorando, hay una escalera en esta zona, cerca del refugio del minero, que conduce a un pequeño castillo. + +Recordatorio: + +]]> + +Se han añadido nuevas características en la última versión del juego, como áreas nuevas en el tutorial. + +{*B*}Pulsa{*CONTROLLER_VK_A*} para jugar el tutorial de forma normal.{*B*} + Pulsa{*CONTROLLER_VK_B*} para omitir el tutorial principal. + +En esta área encontrarás otras áreas configuradas para que aprendas el funcionamiento de la pesca, los barcos y la piedra rojiza. + +Fuera de esta área encontrarás ejemplos de edificios, cultivos, vagonetas y pistas, hechizos, destilación, intercambios comerciales, herrería y mucho más. + + + La barra de comida se ha agotado hasta un nivel a partir del cual ya no te puedes curar. + + + + {*B*} + Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre la barra de comida y cómo comer.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya tienes información sobre la barra de comida y cómo comer. + + + + 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 + +Atrás + +Salir + +Cancelar + +Cancelar unión + +Seleccionar disp. de alm. + +Cambiar disp. de alm. + +Actualizar juegos en línea + +Juegos en grupo + +Todos los juegos + +Cambiar grupo + +Mostrar inventario + +Mostrar descripción + +Mostrar ingredientes + +Creación + +Crear + +Coger/colocar + +Coger + +Coger todo + +Coger la mitad + +Colocar + +Colocar todo + +Colocar uno + +Soltar + +Soltar todo + +Soltar uno + +Cambiar + +Movimiento rápido + +Borrar selección rápida + +? + +Compartir en Facebook + +Cambiar filtro + +Ver tarjeta de jugador + +Ver perfil de jugador + +Enviar solicitud de amigo + +Avanzar página + +Retroceder página + +Siguiente + +Anterior + +Expulsar jugador + +Teñir + +Recoger + +Alimentar + +Domar + +Curar + +Sentarse + +Sígueme + +Expulsar + +Vacío + +Silla + +Colocar + +Golpear + +Leche + +Recoger + +Comer + +Dormir + +Despertar + +Jugar + +Montar + +Navegar + +Crecer + +Nadar + +Abrir + +Cambiar tono + +Detonar + +Leer + +Colgar + +Arrojar + +Plantar + +Labrar + +Cosechar + +Continuar + +Desbloquear juego completo + +Borrar juego guardado + +Borrar + +Opciones + +Invitar a Xbox Live Party + +Invitar a amigos + +Aceptar + +Tijera + +Bloquear nivel + +Seleccionar aspecto + +Poner en marcha + +Desplazar + +Instalar versión completa + +Instalar versión de prueba + +Instalar + +Resinstalar + +Opc. de guardado + +Ejecutar comando + +Creativo + +Mover ingrediente + +Mover combustible + +Herramienta Mover + +Mover armadura + +Mover arma + +Equipar + +Tensar + +Soltar + +Privilegios + +Bloque + +Retroceder página + +Avanzar página + +Modo Amor + +Beber + +Rotar + +Ocultar + +Cargar part. para Xbox One + +Eliminar todos los espacios + +Cargar partida guardada para Xbox One + +Montar + +Desmontar + +Colocar cofre + +Lanzar + +Atar + +Soltar + +Colocar + +Nombre + +Aceptar + +Cancelar + +Tienda de Minecraft + +¿Seguro que quieres salir del juego actual y unirte al nuevo? Se perderán todos los progresos no guardados. + +Salir del juego + +Guardar juego + +Salir sin guardar + +¿Seguro que quieres sobrescribir los archivos de guardado anteriores de este mundo con su versión actual? + +¿Seguro que quieres salir sin guardar? ¡Perderás todos los progresos en este mundo! + +Iniciar juego + +Si creas, cargas o guardas un mundo en el modo Creativo, ese mundo tendrá deshabilitado los logros y las actualizaciones de marcador, aunque después lo cargues en el modo Supervivencia. ¿Seguro que quieres continuar? + +Este mundo se ha guardado en el modo Creativo y tiene deshabilitados los logros y las actualizaciones de marcador. ¿Seguro que quieres continuar? + +Este mundo se ha guardado en el modo Creativo y tiene deshabilitados los logros y las actualizaciones de marcador. + +Si creas, cargas o guardas un mundo con los privilegios de host habilitados, ese mundo tendrá deshabilitado los logros y las actualizaciones de marcador, aunque después lo cargues con esas opciones deshabilitadas. ¿Seguro que quieres continuar? + +Archivo dañado + +El archivo de guardado está dañado. ¿Quieres borrarlo? + +¿Seguro que quieres salir al menú principal y desconectar a todos los jugadores del juego? Se perderán todos los progresos no guardados. + +Salir y guardar + +Salir sin guardar + +¿Seguro que quieres salir al menú principal? Se perderán todos los progresos no guardados. + +¿Seguro que quieres salir al menú principal? ¡Se perderán tus progresos! + +Crear nuevo mundo + +Jugar tutorial + +Tutorial + +Dar nombre al mundo + +Escribe un nombre para tu mundo. + +Introduce la semilla para la generación del mundo. + +Cargar mundo guardado + +Pulsa START para unirte al juego. + +Saliendo del juego + +Se ha producido un error. Saliendo al menú principal. + +Error de conexión + +Se ha perdido la conexión + +Se ha perdido la conexión con el servidor. Saliendo al menú principal. + +Se ha perdido la conexión con Xbox Live. Saliendo al menú principal. + +Se ha perdido la conexión con Xbox Live. + +Desconectado por el servidor. + +Has sido expulsado del juego. + +Has sido expulsado del juego por volar. + +El intento de conexión ha tardado demasiado. + +El servidor está lleno. + +El host ha salido del juego. + +No puedes unirte a este juego porque no tienes ningún amigo en él. + +No puedes unirte a este juego porque el host te ha expulsado anteriormente. + +No puedes unirte a este juego porque el jugador al que quieres unirte usa una versión más antigua. + +No puedes unirte a este juego porque el jugador al que quieres unirte usa una versión más antigua. + +Nuevo mundo + +¡Premio desbloqueado! + +¡Hurra! ¡Has obtenido una imagen de jugador de Steve, de Minecraft! + +¡Hurra! ¡Has obtenido una imagen de jugador de un Creeper! + +¡Hurra! ¡Has obtenido un objeto de avatar: una camiseta de Minecraft: Xbox 360 Edition! +Ve a la Interfaz para ponerle la camiseta a tu avatar. + +¡Hurra! ¡Has obtenido un objeto de avatar: un reloj de Minecraft: Xbox 360 Edition! +Ve a la Interfaz para ponerle el reloj a tu avatar. + +¡Hurra! ¡Has obtenido un objeto de avatar: una gorra de béisbol de Creeper! +Ve a la Interfaz para ponerle la gorra a tu avatar. + +¡Hurra! ¡Has obtenido el tema de Minecraft: Xbox 360 Edition! +Ve a la Interfaz para seleccionar este tema. + +Desbloquear juego completo + +Estás jugando la versión de prueba, pero necesitarás el juego completo para guardar tu juego. +¿Quieres desbloquear el juego completo? + +Esta es la versión de prueba de Minecraft: Xbox 360 Edition. Si tuvieras el juego completo, ¡habrías conseguido un logro! +¿Te gustaría desbloquear el juego completo? + +Esta es la versión de prueba de Minecraft: Xbox 360 Edition. Si tuvieras el juego completo, ¡habrías conseguido un premio de avatar! +¿Te gustaría desbloquear el juego completo? + +Esta es la versión de prueba de Minecraft: Xbox 360 Edition. Si tuvieras el juego completo, ¡habrías conseguido una imagen de jugador! +¿Te gustaría desbloquear el juego completo? + +Esta es la versión de prueba de Minecraft: Xbox 360 Edition. Si tuvieras el juego completo, ¡habrías conseguido un tema! +¿Te gustaría desbloquear el juego completo? + +Esta es la versión de prueba de Minecraft: Xbox 360 Edition. Necesitas la versión completa para aceptar esta invitación. +¿Quieres desbloquear la versión completa del juego? + +Los jugadores invitados no pueden desbloquear el juego completo. Inicia sesión con un ID de usuario de Xbox Live. + +Espera + +No hay resultados + +Filtro: + +Amigos + +Mi puntuación + +Total + +Entradas: + +Clasif. + +Gamertag + +Preparando para guardar nivel + +Preparando fragmento... + +Finalizando... + +Construyendo terreno + +Simulando mundo durante un instante + +Inicializando servidor + +Generando zona de generación + +Cargando zona de generación + +Entrando en el mundo inferior + +Saliendo del mundo inferior + +Regenerando + +Generando nivel + +Cargando nivel + +Guardando jugadores + +Conectando al host + +Descargando terreno + +Cambiando a juego sin conexión + +Espera mientras el host guarda el juego. + +Entrando en El FIN + +Saliendo de El FIN + +Buscando semilla para el generador de mundos + +Esta cama está ocupada. + +Solo puedes dormir por la noche. + +%s está en cama durmiendo. Para avanzar al amanecer, todos los jugadores deben dormir en camas a la vez. + +¡Tu casa original ha desaparecido o está obstruida! + +Ahora no puedes descansar, hay monstruos cerca. + +Estás en cama durmiendo. Para avanzar al amanecer, todos los jugadores deben dormir en camas a la vez. + +Herramientas y armas + +Armas + +Comida + +Estructuras + +Armadura + +Mecanismos + +Transporte + +Decoraciones + +Construir bloques + +Piedra rojiza y transporte + +Varios + +Destilación + +Destilado + +Herramientas, armas y armadura + +Materiales + +Sesión cerrada + +Has vuelto a la pantalla de título porque tu perfil de jugador ha cerrado la sesión. + +Dificultad + +Música + +Sonido + +Gamma + +Sensibilidad del juego + +Sensibilidad de la interfaz + +Pacífico + +Fácil + +Normal + +Difícil + +En este modo, el jugador recupera la salud con el paso del tiempo y no hay enemigos en el entorno. + +En este modo, el entorno genera enemigos, pero causarán menos daño al jugador que en el modo normal. + +En este modo, el entorno genera enemigos que infligirán al jugador una cantidad de daño normal. + +En este modo, el entorno genera enemigos que infligirán al jugador una cantidad de daño elevada. ¡Ten cuidado también con los Creepers, ya que no es probable que cancelen su ataque explosivo cuando te alejes de ellos! + +Límite de tiempo alcanzado + +Has jugado a la versión de prueba de Minecraft: Xbox 360 Edition durante la cantidad máxima de tiempo permitida. Para continuar divirtiéndote, ¿quieres desbloquear el juego completo? + +Juego completo + +No te has podido unir al juego y no quedan más espacios. + +Introducir texto de señal + +Introduce una línea de texto para tu señal. + +Introducir título + +Introduce un título para tu publicación. + +Introducir subtítulo + +Introduce un subtítulo para tu publicación. + +Introducir descripción + +Introduce una descripción para tu publicación. + +Inventario + +Ingredientes + +Puesto de destilado + +Cofre + +Hechizar + +Horno + +Ingrediente + +Combustible + +Dispensador + +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. + +%s ha abandonado el juego. + +Han expulsado a %s del juego. + +¿Seguro que quieres borrar este juego guardado? + +Aprobando... + +Censurado + +Ahora jugando: + +Restablecer configuración + +¿Seguro que quieres restablecer la configuración a los valores predeterminados? + +Error al cargar + +Minecraft: Xbox 360 Edition ha experimentado un error al cargar y no puede continuar. + +Juego de %s + +Juego de host desconocido + +Un invitado ha cerrado la sesión + +Un jugador invitado ha cerrado la sesión, lo que ha provocado que todos los invitados queden excluidos del juego. + +Iniciar sesión + +No has iniciado sesión. Para jugar tienes que iniciar sesión. ¿Quieres hacerlo ahora? + +Multijugador no admitido + +No te has podido unir al juego porque uno o más jugadores no tienen autorización para participar en juegos multijugador en Xbox Live. + +No has podido crear un juego en línea porque uno o más jugadores no tienen autorización para participar en juegos multijugador en Xbox Live. Desmarca la casilla "Juego en línea" para jugar sin conexión. + +No te puedes unir a esta sesión de juego porque la configuración de privilegios de Contenido de miembro es demasiado restrictiva. Cambia esta configuración en la sección Privacidad, Privacidad y conexión de la Interfaz Xbox si quieres unirte a la sesión. + +No te puedes unir a esta sesión de juego porque uno de los jugadores locales tiene una configuración de privilegios de Contenido de miembro demasiado restrictiva. + +No te puedes unir a esta sesión de juego porque uno de los jugadores de la sesión tiene una configuración de privilegios de Contenido de miembro de Solo amigos y no estás en su lista de amigos. + +No se ha podido crear el juego. + +No puedes crear esta sesión de juego porque uno de los jugadores locales tiene una configuración de privilegios de Contenido de miembro demasiado restrictiva. Desmarca la casilla "Juego en línea" para iniciar un juego sin conexión o cambia este ajuste en la sección Privacidad, Privacidad y conexión de la Interfaz Xbox + +Seleccionado automáticamente + +Sin pack: aspectos pred. + +Aspectos favoritos + +Nivel bloqueado + +El juego al que te estás uniendo está en la lista de niveles bloqueados. +Si decides unirte a este juego, se eliminará el nivel de la lista de niveles bloqueados. + +¿Bloquear este nivel? + +¿Seguro que quieres añadir este nivel a la lista de niveles bloqueados? +Selecciona ACEPTAR para salir del juego. + +Eliminar de la lista de bloqueados + +Intervalo de autoguardado + +Intervalo de autoguardado: NO + +Minutos + +¡No se puede colocar aquí! + +No se puede colocar lava cerca del punto de generación del nivel porque se puede producir la muerte instantánea de los jugadores que se regeneran. + +Este juego utiliza la función de autoguardado. Si ves este icono, el juego está guardando los datos. +No apagues la Consola Xbox 360 cuando aparezca este icono en pantalla. + +Opacidad de la interfaz + +Preparación de autoguardado del nivel + +Tamaño de HUD + +Tamaño de HUD (pantalla dividida) + +Semilla + +Desbloquear pack de aspecto + +Para usar el aspecto que has seleccionado tienes que desbloquear este pack de aspecto. +¿Quieres desbloquear este pack de aspecto ahora? + +Desbloquear pack de textura + +Desbloquea este pack de textura para usarlo en tu mundo. +¿Te gustaría desbloquearlo ahora? + +Pack de textura de prueba + +Estás usando una versión de prueba del pack de textura. No podrás guardar este mundo a menos que desbloquees la versión completa. +¿Te gustaría desbloquear la versión completa de este pack de textura? + +Pack de textura no disponible + +Desbloquear versión completa + +Descargar versión de prueba + +Descargar versión completa + +¡Este mundo usa un pack de textura o de popurrí que no tienes! +¿Quieres instalar el pack de textura o de popurrí ahora? + +Conseguir versión de prueba + +Conseguir versión completa + +Expulsar jugador + +¿Seguro que quieres expulsar a este jugador del juego? No podrá volver a unirse hasta que reinicies el mundo. + +Packs de imágenes de jugador + +Temas + +Packs de aspectos + +Permitir amigos de amigos + +No puedes unirte a este juego porque está limitado a jugadores que son amigos del host. + +No te puedes unir al juego + +Seleccionado + +Aspecto seleccionado: + +Descarga de contenido dañada + +La descarga de contenido está dañada y no se puede utilizar. Debes eliminarla y volver a instalarla en el menú de Tienda de Minecraft. + +Alguna descarga de contenido está dañada y no se puede utilizar. Debes eliminarla y volver a instalarla en el menú de Tienda de Minecraft. + +Se ha cambiado el modo de juego. + +Cambiar nombre al mundo + +Escribe un nuevo nombre para tu mundo. + +Modo juego: Supervivencia + +Modo juego: Creativo + +Modo juego: Aventura + +Supervivencia + +Creativo + +Aventura + +En modo Supervivencia + +En modo Creativo + +Generar nubes + +¿Qué quieres hacer con este juego guardado? + +Cambiar nombre a juego guardado + +Autoguardando en %d... + + + +No + +Normal + +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. + +Si está habilitado, los amigos de la gente en tu lista de amigos pueden unirse. + +Si está habilitado, los jugadores pueden causar daño a otros jugadores. Solo afecta al modo Supervivencia. + +Si está deshabilitado, los jugadores que se unan al juego no pueden construir ni extraer sin autorización. + +Si está habilitado, el fuego se puede propagar a los bloques inflamables cercanos. + +Si está habilitado, la dinamita explota cuando se activa. + +Si está habilitado, el host puede volar, deshabilitar la extenuación y hacerse invisible. Deshabilita los logros y actualizaciones del marcador. + +Si se activa, el mundo inferior se regenerará. Esto es útil si tienes una partida guardada antigua donde no está presente la fortaleza del mundo inferior. + +Si está habilitado, se generarán estructuras como aldeas y fortalezas en el mundo. + +Si está habilitado, se generará un mundo completamente plano en el mundo superior y en el inferior. + +Si está habilitado, se creará un cofre con objetos útiles cerca del punto de generación del jugador. + +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 + +Imágenes de jugador + +Objetos de avatar + +Packs de textura + +Packs de popurrí + +{*PLAYER*} ha entrado en combustión + +{*PLAYER*} se quemó hasta morir + +{*PLAYER*} intentó nadar en la lava + +{*PLAYER*} se asfixió en un muro + +{*PLAYER*} se ahogó + +{*PLAYER*} se murió de hambre + +{*PLAYER*} se pinchó hasta morir + +{*PLAYER*} se golpeó demasiado fuerte contra el suelo + +{*PLAYER*} se cayó del mundo + +{*PLAYER*} murió + +{*PLAYER*} explotó + +{*PLAYER*} murió a causa de la magia + +{*PLAYER*} murió a causa del aliento del dragón de Ender. + +{*SOURCE*} asesinó a {*PLAYER*} + +{*SOURCE*} asesinó a {*PLAYER*} + +{*SOURCE*} disparó a {*PLAYER*} + +{*SOURCE*} quemó con bolas de fuego a {*PLAYER*} + +{*SOURCE*} apaleó a {*PLAYER*} + +{*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 + +Mostrar HUD + +Mostrar mano + +Gamertags en pantalla dividida + +Mensajes de muerte + +Personaje animado + +Animación de aspecto personalizada + +Ya no puedes perforar ni usar objetos. + +Ahora puedes perforar y usar objetos. + +Ya no puedes colocar bloques. + +Ahora puedes colocar bloques. + +Ahora puedes usar puertas e interruptores. + +Ya no puedes usar puertas ni interruptores. + +Ahora puedes usar contenedores (p. ej. cofres). + +Ya no puedes usar contenedores (p. ej. cofres). + +Ya no puedes atacar a enemigos. + +Ahora puedes atacar a enemigos. + +Ya no puedes atacar a jugadores. + +Ahora puedes atacar a jugadores. + +Ya no puedes atacar a animales. + +Ahora puedes atacar a animales. + +Ahora eres un moderador. + +Ya no eres un moderador. + +Ahora puedes volar. + +Ya no puedes volar. + +Ya no te fatigarás. + +Ahora te fatigarás. + +Ahora eres invisible. + +Ya no eres invisible. + +Ahora eres invulnerable. + +Ya no eres invulnerable. + +%d MSP + +Dragón de Ender + +%s ha entrado en El Fin. + +%s ha salido de El Fin. + + +{*C3*}Veo a ese jugador al que te referías.{*EF*}{*B*}{*B*} +{*C2*}¿{*PLAYER*}?{*EF*}{*B*}{*B*} +{*C3*}Sí. Cuidado. Ha alcanzado un nivel superior. Puede leer nuestros pensamientos.{*EF*}{*B*}{*B*} +{*C2*}No importa. Cree que somos parte del juego.{*EF*}{*B*}{*B*} +{*C3*}Me gusta. Ha jugado bien. No se ha rendido.{*EF*}{*B*}{*B*} +{*C2*}Lee nuestros pensamientos como si fueran textos en una pantalla.{*EF*}{*B*}{*B*} +{*C3*}Así le gusta imaginar muchas cosas, cuando está en lo más profundo del sueño del juego.{*EF*}{*B*}{*B*} +{*C2*}Las palabras son una interfaz maravillosa. Muy flexibles. Y asustan menos que contemplar la realidad que se oculta detrás de la pantalla.{*EF*}{*B*}{*B*} +{*C3*}Antes oían voces. Antes de que los jugadores pudieran leer. En aquellos tiempos en los que los que no jugaban llamaban a los jugadores hechiceros y brujas. Y en los que los jugadores soñaban que volaban sobre palos impulsados por demonios.{*EF*}{*B*}{*B*} +{*C2*}¿Qué soñaba este jugador?{*EF*}{*B*}{*B*} +{*C3*}Soñaba la luz del sol y los árboles. Fuego y agua. Soñaba que creaba. Y soñaba que destruía. Soñaba que cazaba y que le daban caza. Soñaba un refugio.{*EF*}{*B*}{*B*} +{*C2*}Ja, la interfaz original. Tiene un millón de años y sigue funcionando. Pero ¿qué estructura verdadera ha creado en la realidad tras la pantalla?{*EF*}{*B*}{*B*} +{*C3*}Colaboró con muchos más para esculpir un mundo real en un pliego de {*EF*}{*NOISE*}{*C3*} y creó un {*EF*}{*NOISE*}{*C3*} para {*EF*}{*NOISE*}{*C3*} en {*EF*}{*NOISE*}{*C3*}.{*EF*}{*B*}{*B*} +{*C2*}Pero eso no lo puede leer.{*EF*}{*B*}{*B*} +{*C3*}No. Todavía no ha alcanzado el nivel superior. Debe conseguirlo en el largo sueño de la vida, no el corto sueño de un juego.{*EF*}{*B*}{*B*} +{*C2*}¿Sabe que lo queremos? ¿Que el universo es amable?{*EF*}{*B*}{*B*} +{*C3*}A veces, entre el ruido de sus pensamientos, escucha al universo, sí.{*EF*}{*B*}{*B*} +{*C2*}Pero, a veces, está triste en el sueño largo. Crea mundos que no tienen verano y tiembla bajo un sol negro, y confunde su creación triste con la realidad.{*EF*}{*B*}{*B*} +{*C3*}Quitarle la pena lo destruiría. La pena es parte de su propia misión. No podemos interferir.{*EF*}{*B*}{*B*} +{*C2*}A veces, cuando están en un sueño muy profundo, quiero decírselo, decirles que están construyendo mundos de verdad en la realidad. A veces, quiero decirles que son importantes para el universo. A veces, cuando no han creado una conexión real en mucho tiempo, quiero ayudarles a decir la palabra que temen.{*EF*}{*B*}{*B*} +{*C3*}Lee nuestros pensamientos.{*EF*}{*B*}{*B*} +{*C2*}A veces, no me importa. A veces, quiero decirles que este mundo que toman por real tan solo es {*EF*}{*NOISE*}{*C2*} y {*EF*}{*NOISE*}{*C2*}, quiero decirles que son {*EF*}{*NOISE*}{*C2*} en {*EF*}{*NOISE*}{*C2*}. Ven tan poco de la realidad en su sueño largo.{*EF*}{*B*}{*B*} +{*C3*}Pero siguen jugando.{*EF*}{*B*}{*B*} +{*C2*}Y sería tan fácil decirles que...{*EF*}{*B*}{*B*} +{*C3*}Demasiado fuerte para este sueño. Decirles que vivir es impedir que vivan.{*EF*}{*B*}{*B*} +{*C2*}Nunca diré a un jugador cómo vivir.{*EF*}{*B*}{*B*} +{*C3*}Se está inquietando.{*EF*}{*B*}{*B*} +{*C2*}Le contaré una historia.{*EF*}{*B*}{*B*} +{*C3*}Pero no la verdad.{*EF*}{*B*}{*B*} +{*C2*}No. Una historia que contenga la verdad de forma segura, en una jaula de palabras. No la verdad desnuda que puede quemar a cualquier distancia.{*EF*}{*B*}{*B*} +{*C3*}Dale un cuerpo, otra vez.{*EF*}{*B*}{*B*} +{*C2*}Sí. Jugador...{*EF*}{*B*}{*B*} +{*C3*}Utiliza su nombre.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}. Jugador de juegos.{*EF*}{*B*}{*B*} +{*C3*}Bien.{*EF*}{*B*}{*B*} + + + +{*C2*}Ahora, respira. Vuelve a respirar. Siente el aire en los pulmones. Permite que tus extremidades regresen. Sí, mueve los dedos. Vuelve a tener un cuerpo sometido a la gravedad, en el aire. Vuelve a generarte en el sueño largo. Ahí estás. Todo tu cuerpo vuelve a tocar el universo, como si fuerais cosas distintas. Como si fuerais cosas distintas.{*EF*}{*B*}{*B*} +{*C3*}¿Quiénes somos? Otrora nos llamaron espíritu de la montaña. Padre sol, madre luna. Espíritus ancestrales, espíritus animales. Genios. Fantasmas. Los hombrecillos verdes. Después, dioses, demonios. Ángeles. Fenómenos paranormales. Alienígenas, extraterrestres. Leptones, quarks. Las palabras cambian. Nosotros no.{*EF*}{*B*}{*B*} +{*C2*}Somos el universo. Somos todo lo que piensas que no eres tú. Nos estás mirando a través de tu piel y tus ojos. ¿Y por qué toca el universo tu piel y te ilumina? Para verte, jugador. Para conocerte. Y para que nos conozcas. Te contaré una historia.{*EF*}{*B*}{*B*} +{*C2*}Érase una vez un jugador.{*EF*}{*B*}{*B*} +{*C3*}El jugador eras tú, {*PLAYER*}.{*EF*}{*B*}{*B*} +{*C2*}A veces, el jugador se consideraba un ser humano, en la fina corteza de una esfera de roca derretida. La esfera de roca derretida giraba alrededor de una esfera de gas ardiente que era trescientas treinta mil veces mayor que ella. Estaban tan separadas que la luz tardaba ocho minutos en llegar de una a otra. La luz era información de una estrella y podía quemar la piel a cincuenta millones de kilómetros de distancia.{*EF*}{*B*}{*B*} +{*C2*}A veces, el jugador soñaba que era un minero, sobre la superficie de un mundo plano e infinito. El sol era un cuadrado blanco. Los días eran cortos; había mucho que hacer y la muerte no era más que un inconveniente temporal.{*EF*}{*B*}{*B*} +{*C3*}A veces, el jugador soñaba que estaba perdido en una historia.{*EF*}{*B*}{*B*} +{*C2*}A veces, el jugador soñaba que era otras cosas, en otros lugares. A veces, esos sueños eran perturbadores. A veces, realmente bellos. A veces, el jugador se despertaba de un sueño en otro, y después de ese en un tercero.{*EF*}{*B*}{*B*} +{*C3*}A veces, el jugador soñaba que veía palabras en una pantalla.{*EF*}{*B*}{*B*} +{*C2*}Retrocedamos.{*EF*}{*B*}{*B*} +{*C2*}Los átomos del jugador estaban esparcidos en la hierba, en los ríos, en el aire, en la tierra. Una mujer recogió los átomos, bebió y comió y respiró; y la mujer ensamblo al jugador en su cuerpo.{*EF*}{*B*}{*B*} +{*C2*}Y el jugador despertó del mundo oscuro y cálido del cuerpo de su madre en el sueño largo.{*EF*}{*B*}{*B*} +{*C2*}Y el jugador fue una nueva historia, nunca antes contada, escrita con ADN. Y el jugador era un nuevo programa, que nunca se había ejecutado, generado por un código fuente con un billón de años. Y el jugador era un nuevo ser humano, que nunca había vivido antes, hecho tan solo de leche y amor.{*EF*}{*B*}{*B*} +{*C3*}Tú eres el jugador. La historia. El programa. El humano. Hecho tan solo de leche y amor.{*EF*}{*B*}{*B*} +{*C2*}Retrocedamos más.{*EF*}{*B*}{*B*} +{*C2*}Los siete trillones de trillones de trillones de átomos del jugador se crearon, mucho antes de este juego, en el corazón de una estrella. Así que el jugador también es información de una estrella. Y el jugador se mueve a través de una historia que es un bosque de información colocada por un tipo llamado Julian, en un mundo infinito y plano creado por un hombre llamado Markus que existe en un mundo pequeño y privado creado por el jugador que habita un universo creado por...{*EF*}{*B*}{*B*} +{*C3*}Sssh. A veces, el jugador creaba un mundo pequeño y privado que era suave, cálido y sencillo. A veces, frío, duro y complicado. A veces, creaba un modelo del universo en su cabeza; motas de energía moviéndose a través de vastos espacios vacíos. A veces llamaba a esas motas "electrones" y "protones".{*EF*}{*B*}{*B*} + + + +{*C2*}A veces, las llamaba "planetas" y "estrellas".{*EF*}{*B*}{*B*} +{*C2*}A veces, creía que estaba en un universo hecho de energía que estaba compuesto de encendidos y apagados, de ceros y unos, de líneas de código. A veces, creía que jugaba a un juego. A veces, creía que leía palabras en una pantalla.{*EF*}{*B*}{*B*} +{*C3*}Tú eres el jugador, que lee palabras...{*EF*}{*B*}{*B*} +{*C2*}Sssh... A veces, el jugador leía líneas de código en una pantalla. Las decodificaba en palabras, decodificaba las palabras en significados; decodificaba los significados en sentimientos, teorías, ideas... y el jugador comenzó a respirar cada vez más deprisa y más profundamente cuando se dio cuenta de que estaba vivo, estaba vivo, esas miles de muertes no habían sido reales, el jugador estaba vivo.{*EF*}{*B*}{*B*} +{*C3*}Tú. Tú. Tú estás vivo.{*EF*}{*B*}{*B*} +{*C2*}Y, a veces, el jugador creía que el universo le había hablado a través de la luz del sol del verano que se colaba entre las hojas al viento.{*EF*}{*B*}{*B*} +{*C3*}Y, a veces, el jugador creía que el universo le había hablado a través de la luz que llegaba del frío cielo nocturno del invierno, donde una mota de luz en el rabillo del ojo del jugador podría ser una estrella un millón de veces más grande que el sol, quemando sus planetas, convirtiéndolos en plasma, para que el jugador pudiera verla un instante desde el otro extremo del universo mientras volvía a casa, mientras olía comida de pronto, casi en su puerta, a punto de volver a soñar.{*EF*}{*B*}{*B*} +{*C2*}Y, a veces, el jugador creía que el universo le había hablado a través de los ceros y los unos, a través de la electricidad del mundo, a través de las palabras deslizándose por una pantalla al final de un sueño.{*EF*}{*B*}{*B*} +{*C3*}Y el universo le decía te quiero.{*EF*}{*B*}{*B*} +{*C2*}Y el universo le decía has jugado bien.{*EF*}{*B*}{*B*} +{*C3*}Y el universo le decía cuanto necesitas está en tu interior.{*EF*}{*B*}{*B*} +{*C2*}Y el universo le decía eres más fuerte de lo que crees.{*EF*}{*B*}{*B*} +{*C3*}Y el universo le decía eres la luz del día.{*EF*}{*B*}{*B*} +{*C2*}Y el universo le decía eres la noche.{*EF*}{*B*}{*B*} +{*C3*}Y el universo le decía tu lucha está en tu interior.{*EF*}{*B*}{*B*} +{*C2*}Y el universo le decía la luz que buscas está en tu interior.{*EF*}{*B*}{*B*} +{*C3*}Y el universo le decía no estás solo.{*EF*}{*B*}{*B*} +{*C2*}Y el universo le decía no estás separado del resto de las cosas.{*EF*}{*B*}{*B*} +{*C3*}Y el universo le decía eres el universo probándose a sí mismo, hablando consigo mismo, leyendo su propio código.{*EF*}{*B*}{*B*} +{*C2*}Y el universo le decía te quiero porque eres amor.{*EF*}{*B*}{*B*} +{*C3*}Y el juego había acabado y el jugador se despertó del sueño. Y el jugador comenzó un nuevo sueño. Y el jugador volvió a soñar, soñó mejor. Y el jugador era el universo. Y el jugador era amor.{*EF*}{*B*}{*B*} +{*C3*}Tú eres el jugador.{*EF*}{*B*}{*B*} +{*C2*}Despierta.{*EF*} + + +Restablecer mundo inferior + +¿Seguro que quieres restablecer el mundo inferior de este archivo de guardado a sus valores predeterminados? Perderás todo lo que has construido en el mundo inferior. + +Restablecer mundo inferior + +No restablecer mundo inferior + +No se puede trasquilar esta champiñaca en este momento. Límite de cerdos, ovejas, vacas y gatos alcanzado. + +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. + +No se pueden usar huevos generadores en este momento. Se ha alcanzado el límite de lobos en un mundo. + +No se pueden usar huevos generadores en este momento. Se ha alcanzado el límite de gallinas en un mundo. + +No se pueden usar huevos generadores en este momento. Se ha alcanzado el límite de calamares en un mundo. + +No se pueden usar huevos generadores en este momento. Se ha alcanzado el límite de 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. + +Se ha alcanzado el límite de pinturas y estructuras de objeto en un mundo. + +No puedes generar enemigos en el modo pacífico. + +Este animal no puede 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. + +Se ha alcanzado el límite de cabezas de enemigos en un mundo. + +Invertir vista + +Zurdo + +¡Has muerto! + +Regenerar + +Descarga de contenido + +Cambiar aspecto + +Cómo se juega + +Controles + +Configuración + +Créditos + +Volver a instalar contenido + +Configuración de depuración + +El fuego se propaga + +La dinamita explota + +Jugador contra jugador + +Confiar en jugadores + +Privilegios de host + +Genera estructuras + +Mundo superplano + +Cofre de bonificación + +Opciones del mundo + +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 + +Puede usar puertas e interruptores + +Puede abrir contenedores + +Puede atacar a jugadores + +Puede atacar a animales + +Moderador + +Expulsar jugador + +Puede volar + +Desactiva la extenuación + +Invisible + +Opciones de host + +Jugadores/Invitar + +Juego en línea + +Solo por invitación + +Más opciones + +Carga + +Nuevo mundo + +Nombre del mundo + +Semilla para el generador de mundos + +Dejar vacío para semilla aleatoria + +Jugadores + +Unirse al juego + +Iniciar juego + +No se encontraron juegos + +Jugar al juego + +Marcadores + +Logros + +Ayuda y opciones + +Desbloquear juego completo + +Reanudar juego + +Guardar juego + +Dificultad: + +Tipo de juego: + +Gamertags: + +Estructuras: + +Tipo de nivel: + +JcJ: + +Confiar en jugadores: + +Dinamita: + +El fuego se propaga: + +Volver a instalar tema + +Volver a instalar imagen de jugador 1 + +Volver a instalar imagen de jugador 2 + +Volver a instalar objeto de avatar 1 + +Volver a instalar objeto de avatar 2 + +Volver a instalar objeto de avatar 3 + +Opciones + +Sonido + +Control + +Gráficos + +Interfaz de usuario + +Valores predeterminados + +Ver oscilación + +Consejos + +Información sobre herramientas del juego + +Gamertags del juego + +Pantalla dividida vertical para 2 jugadores + +Listo + +Editar mensaje de señal: + +Completa la información que irá junto a tu captura. + +Subtítulo + +Captura de pantalla del juego + +Editar mensaje de señal: + +¡Mira lo que he hecho en Minecraft: Xbox 360 Edition! + +¡Con la interfaz de usuario, los iconos y la textura clásica de Minecraft! + +Mostrar todos los mundos de popurrí + +Seleccionar espacio de transferencia + +Vaciar espacio + +Subiendo metadatos guardados + +Subiendo datos guardados + +Subiendo partida guardada para Xbox One + +Carga cancelada + +Has cancelado la carga de este archivo de guardado al área de transferencia. + +Sin efectos + +Velocidad + +Lentitud + +Rapidez + +Fatiga de extracción + +Fuerza + +Debilidad + +Salud instantánea + +Daño instantáneo + +Impulso en salto + +Náusea + +Regeneración + +Resistencia + +Resistente al fuego + +Respiración en agua + +Invisibilidad + +Ceguera + +Visión nocturna + +Hambre + +Veneno + +Wither + +Mejora de salud + +Absorción + +Saturación + +de rapidez + +de lentitud + +de rapidez + +de torpeza + +de fortaleza + +de debilidad + +de curación + +de daño + +de salto + +de náusea + +de regeneración + +de resistencia + +de resistencia al fuego + +de respiración en agua + +de invisibilidad + +de ceguera + +de visión nocturna + +de hambre + +de veneno + +de decadencia + +de mejora de salud + +de absorción + +de saturación + + + +II + +III + +IV + +Salpicadura + +Mundano + +Aburrido + +Blando + +Nítido + +Lechoso + +Difuso + +Natural + +Fino + +Raro + +Plano + +Voluminoso + +Chapucero + +Untado + +Liso + +Suave + +Cortés + +Grueso + +Elegante + +Sofisticado + +Encantador + +Enérgico + +Refinado + +Cordial + +Resplandeciente + +Potente + +Repugnante + +Inodoro + +Rancio + +Áspero + +Acre + +Asqueroso + +Hediondo + +Se usa como base para todas las pociones. Úsala en un puesto de destilado para crear pociones. + +No tiene efectos. Se puede usar en un puesto de destilado para crear pociones añadiendo más ingredientes. + +Aumenta la velocidad de movimiento de los jugadores, animales y monstruos afectados y la velocidad de carrera, longitud de salto y campo de visión de los jugadores. + +Disminuye la velocidad de movimiento de los jugadores, animales y monstruos afectados y la velocidad de carrera, longitud de salto y campo de visión de los jugadores. + +Aumenta el daño causado por los jugadores y monstruos afectados cuanto atacan. + +Disminuye el daño causado por los jugadores y monstruos afectados cuanto atacan. + +Aumenta al instante la salud de los jugadores y monstruos afectados. + +Disminuye al instante la salud de los jugadores y monstruos afectados. + +Restablece la salud de los jugadores, animales y monstruos afectados con el tiempo. + +Hace que los jugadores, animales y monstruos afectados sean inmunes al daño causado por fuego, lava y ataques de llama a distancia. + +Disminuye la salud de los jugadores, animales y monstruos afectados con el tiempo. + +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 + +Maldición de los artrópodos + +Derribar + +Aspecto del fuego + +Protección + +Protección del fuego + +Caída de hojas + +Protección de ráfagas + +Protección de proyectiles + +Respiración + +Afinidad al agua + +Eficiencia + +Toque sedoso + +Irrompible + +Saqueo + +Fortuna + +Poder + +Llama + +Puñetazo + +Infinidad + +I + +II + +III + +IV + +V + +VI + +VII + +VIII + +IX + +X + +Se puede perforar con un pico de hierro o un objeto mejor para extraer esmeraldas. + +Similar a los cofres, pero los objetos colocados en un cofre de Ender estarán disponibles en los cofres del mismo tipo del resto de jugadores, incluso en dimensiones distintas. + +Se activa cuando una entidad tropieza con un cable trampa conectado. + +Activa un gancho de cable trampa conectado cuando una entidad choca con él. + +Una manera de almacenar esmeraldas de forma compacta. + +Una pared hecha de adoquines. + +Se puede usar para reparar armas, herramientas y armaduras. + +Se funde en un horno para producir cuarzo del mundo inferior. + +Se usa como decoración. + +Se puede intercambiar con los aldeanos. + +Se usa como decoración. En ella se pueden plantar flores, arbolillos, cactus y champiñones. + +Restablece 2{*ICON_SHANK_01*} y se puede convertir en una zanahoria dorada. Se puede plantar en tierras de cultivo. + +Restablece 0.5{*ICON_SHANK_01*}o se puede cocinar en el horno. Se puede plantar en tierras de cultivo. + +Restablece 3{*ICON_SHANK_01*}. Se crea cocinando una patata en el horno. + +Restablece 1{*ICON_SHANK_01*}. Si comes esto puede que te envenene. + +Restablece 3{*ICON_SHANK_01*}. Se produce a partir de una zanahoria y pepitas de oro. Restablece 3. + +Se usa para controlar los cerdos ensillados mientras montas sobre ellos. + +Restablece 4{*ICON_SHANK_01*}. + +Se usa junto con un yunque para hechizar armas, herramientas o armaduras. + +Se crea fundiendo minerales de cuarzo del mundo inferior. Se le puede dar forma de bloque de cuarzo. + +Se fabrica con lana. Se usa como decoración. + +Esmeralda + +Maceta + +Zanahoria + +Patata + +Patata asada + +Patata venenosa + +Zanahoria dorada + +Palo y zanahoria + +Pastel de zanahoria + +Libro hechizado + +Cuarzo del mundo inferior + +Mineral de esmeralda + +Cofre de Ender + +Gancho de cable trampa + +Cable trampa + +Bloque de esmeralda + +Pared de adoquines + +Pared de adoquines musgosa + +Maceta + +Zanahorias + +Patatas + +Yunque + +Yunque + +Yunque ligeramente dañado + +Yunque muy dañado + +Mineral de cuarzo del mundo inferior + +Bloque de cuarzo + +Bloque de cuarzo cincelado + +Pilar de cuarzo + +Escaleras de cuarzo + +Alfombra + +Alfombra negra + +Alfombra roja + +Alfombra verde + +Alfombra marrón + +Alfombra azul + +Alfombra púrpura + +Alfombra cian + +Alfombra gris claro + +Alfombra gris + +Alfombra rosa + +Alfombra lima + +Alfombra amarilla + +Alfombra azul claro + +Alfombra magenta + +Alfombra naranja + +Alfombra blanca + +Arenisca cincelada + +Arenisca lisa + +{*PLAYER*} murió intentando herir a {*SOURCE*} + +{*PLAYER*} fue aplastado por un yunque caído. + +{*PLAYER*} fue aplastado por un bloque caído. + +Se ha teleetransportado a {*PLAYER*} a {*DESTINATION*}. + +{*PLAYER*} te ha teletransportado a su posición. + +{*PLAYER*} se ha teletransportado a tu posición. + +Espinas + +Losa de cuarzo + +Ilumina las zonas oscuras como si fuera de día, incluso bajo el agua. + +Vuelve invisibles a los jugadores, animales y monstruos afectados. + +Reparar y nombrar + +Coste del hechizo: %d + +¡Demasiado caro! + +Renombrar + +Tienes: + +Objetos necesarios + +{*VILLAGER_TYPE*} ofrece %s + +Reparar + +Intercambiar + +Teñir collar + + + Esta es la interfaz del yunque, en la que podrás renombrar, reparar y aplicar hechizos a armas, armaduras o herramientas a cambio de niveles de experiencia. + + + + {*B*} + Pulsa {*CONTROLLER_VK_A*} para obtener más información sobre la interfaz del yunque.{*B*} + Pulsa {*CONTROLLER_VK_B*} si ya sabes cómo funciona la interfaz del yunque. + + + + Para empezar a trabajar sobre un objeto, colócalo en el primer espacio. + + + + Cuando coloques la materia prima correcta en el segundo espacio (p. ej., lingotes de hierro para una espada de hierro dañada), la reparación sugerida aparecerá en el espacio de salida. + + + + También puedes colocar un segundo objeto idéntico en el segundo espacio para combinar ambos objetos. + + + + Para hechizar los objetos sobre el yunque, coloca un libro hechizado en el segundo espacio. + + + + El número de niveles de experiencia que costará el trabajo se muestra bajo el espacio de salida. Si no tienes suficientes niveles de experiencia, no podrás completar la reparación. + + + + Puedes renombrar un objeto editando el nombre que aparece en el cuadro de texto. + + + + Recoger el objeto reparado consumirá los dos objetos utilizados por el yunque y reducirá tu nivel de experiencia en la cantidad establecida. + + + + Esta zona contiene un yunque y un cofre con las herramientas y armas necesarias para trabajar. + + + + {*B*} + Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre el yunque.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo utilizar el yunque. + + + + El yunque te permite reparar armas y herramientas para hacerlas más duraderas, así como renombrarlas o hechizarlas mediante libros hechizados. + + + + Los libros hechizados se encuentran dentro de los cofres en las mazmorras y también en forma de libros normales que han sido hechizados en la mesa de hechizos. + + + + El uso del yunque consume niveles de experiencia y puede provocar daños al mismo. + + + + El tipo de trabajo, el valor del objeto, el número de hechizos y la cantidad de trabajo realizado previamente afectan al coste de la reparación. + + + + Renombrar un objeto modifica su nombre para todos los jugadores y reduce de forma permanente el coste del trabajo previo. + + + + En el cofre de esta zona encontrarás picos dañados, materias primas, botellas de hechizos y libros hechizados con los que experimentar. + + + + Esta es la interfaz de comercio, que muestra los intercambios comerciales que puedes realizar con un aldeano. + + + + {*B*} + Pulsa {*CONTROLLER_VK_A*} para obtener más información sobre la interfaz de comercio.{*B*} + Pulsa {*CONTROLLER_VK_B*} si ya sabes cómo funciona la interfaz de comercio. + + + + En la parte superior se muestran los intercambios comerciales que el aldeano está dispuesto a hacer en este momento. + + + + Los intercambios comerciales aparecerán en rojo y no estarán disponibles si no tienes los objetos requeridos. + + + + La cantidad y la clase de objetos que le das al aldeano se muestran en dos cuadros a la izquierda. + + + + La cantidad total de objetos necesarios para el intercambio se muestra en los dos cuadros de la izquierda. + + + + Pulsa {*CONTROLLER_VK_A*} para intercambiar los objetos que demanda el aldeano por el objeto que ofrece. + + + + En esta zona hay un aldeano y un cofre que contiene papel para comprar objetos. + + + + {*B*} + Pulsa {*CONTROLLER_VK_A*} para obtener más información sobre el comercio.{*B*} + Pulsa {*CONTROLLER_VK_B*} si ya sabes cómo se comercia. + + + + Los jugadores pueden intercambiar objetos de su inventario con los aldeanos. + + + + Los objetos que los aldeanos pueden ofrecer dependen de su profesión. + + + + La realización de diferentes intercambios hará que los objetos disponibles del aldeano aumenten o se actualicen al azar. + + + + Los intercambios realizados con más frecuencia pueden deshabilitarse de forma temporal, aunque los aldeanos siempre ofrecerán como mínimo un objeto. + + + + Coge un papel del cofre e intenta comerciar con este aldeano. + + + + Esta zona contiene dos cofres de Ender. + + + + {*B*} + Pulsa {*CONTROLLER_VK_A*} para obtener más información sobre los cofres de Ender.{*B*} + Pulsa {*CONTROLLER_VK_B*} si ya sabes cómo utilizar los cofres de Ender. + + + + Todos los cofres de Ender están vinculados, incluso los de dimensiones diferentes. Los objetos colocados en un cofre de Ender estarán disponibles en cualquier otro cofre del mismo tipo. + + + + No obstante, el contenido de los cofres de Ender es diferente para cada jugador. + + + + Esto permite a los jugadores almacenar objetos en cualquier cofre de Ender y recuperarlos en otros cofres repartidos por el mundo. Para comprobarlo, coloca objetos en cualquiera de los cofres de Ender. + + +Restablece 2{*ICON_SHANK_01*}, regenera la salud durante 30 segundos y concede resistencia al fuego y al daño durante 5 minutos. Creada con una manzana y bloques de oro. + +Puede teletransportarse. + +Teletransportarse + +Teletransportar hacia el jugador + +Teletransportar hacia mí + +Puede desactivar la extenuación. + +Puede volverse invisible. + +Ahora puedes activar la invisibilidad. + +Ya no puedes activar la invisibilidad. + +Ahora puedes volar. + +Ya no puedes volar. + +Ahora puedes desactivar la extenuación. + +Ya no puedes desactivar la extenuación. + +Ahora puedes teletransportarte. + +Ya no puedes teletransportarte. + +{*T3*}CÓMO SE JUEGA: YUNQUE{*ETW*}{*B*}{*B*} +Los niveles de experiencia se pueden usar para reparar, hechizar o renombrar objetos mediante el yunque.{*B*} +Todos los objetos pueden ser renombrados, aunque solo los duraderos pueden ser reparados o hechizados mediante libros de hechizos.{*B*} +Para reparar un objeto, colócalo en uno de los espacios a la izquierda junto con algunas materias primas del mismo, como por ejemplo lingotes de hierro para la espada de hierro, o combinados con otro objeto del mismo tipo.{*B*} +La combinación de objetos resulta más eficaz cuando se lleva a cabo con un yunque. Además, si alguno de los objetos estaba bajo un hechizo, el producto resultante incluirá hechizos pertenecientes a cualquiera de los espacios.{*B*} +Para aplicar hechizos de los libros a los objetos, combina los libros en un yunque si el hechizo del libro es el adecuado. Los libros hechizados se encuentran en los cofres dentro de las mazmorras y también en forma de libros normales que han sido hechizados en la mesa de hechizos.{*B*} +Los yunques pueden sufrir daños después de cada uso. También pueden destruirse si se abusa de ellos.{*B*} + + +{*T3*}CÓMO SE JUEGA: COMERCIAR{*ETW*}{*B*}{*B*} +Es posible intercambiar objetos con los aldeanos. Cada aldeano tiene una profesión (granjero, carnicero, herrero, bibliotecario o sacerdote) y esta afecta al tipo de objetos con los que comercian.{*B*} +El menú de comercio contiene una lista de todos los objetos que cada aldeano ofrece. Los aldeanos pueden modificar o ampliar sus intercambios comerciales cada vez que comercian con un jugador, aunque los intercambios comerciales se pueden deshabilitar de forma temporal si se abusa de ellos.{*B*} +Los intercambios suelen consistir en la compra o venta de una serie de objetos a cambio de esmeraldas.{*B*} +Si no posees los objetos necesarios para realizar el intercambio, los objetos aparecerán en rojo.{*B*} + + +{*T3*}CÓMO SE JUEGA: COFRE DE ENDER {*ETW*}{*B*}{*B*} +Todos los cofres de Ender de un mundo están vinculados, y los objetos que contiene cada uno están disponibles en el resto de cofres. No obstante, el contenido de cada cofre de Ender varía para cada jugador, lo que permite almacenar objetos en cualquiera de ellos y recuperarlos en otro cofre de Ender situado en una parte distinta del mundo. + + +Granjero + +Bibliotecario + +Sacerdote + +Herrero + +Carnicero + +Los objetos que los habitantes de las aldeas venden al jugador varían en función de sus profesiones. + +Cofre grande + + + La mesa de hechizos también te permite crear libros hechizados, que podrás usar más adelante en un yunque para aplicar sus hechizos a un objeto. + + + + Los ganchos de cables trampa también proporcionarán energía constantemente a un circuito mientras algo active la cuerda que los une. + + + + Una vez 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. + + + Además, los jugadores pueden ensillar a los cerdos y montar sobre ellos. Para controlarlos, utiliza un palo y una zanahoria. + + + + En caso de necesidad, puedes mover tu vagoneta usando {*CONTROLLER_ACTION_MOVE*}. Esta acción hará que la vagoneta empiece a moverse por un raíl propulsado. + + +No puedes unirte a esta partida porque la pantalla dividida solo se admite en el modo de alta definición. Cierra la sesión del resto de jugadores para unirte. + +Curar + +Xbox 360 + +Atrás + +Esta opción deshabilita los logros y las actualizaciones del marcador de este mundo cuando se juega y si se vuelve a cargar después de guardarlo con esta opción activada. + +Cargar partida guardada para Xbox One + +Subir datos guardados + +En el área de transferencia de datos solo se pueden almacenar los datos guardados de una Consola Xbox 360. Asegúrate de haber descargado los datos guardados de tu Consola Xbox One antes de cargar los de la Consola Xbox 360. + +Cargando... + +¡Carga completada! + +Error al cargar. Inténtalo más tarde. + + diff --git a/Minecraft.Client/Common/Media/font/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/font/CHT/DFHeiMedium-B5.ttf b/Minecraft.Client/Common/Media/font/CHT/DFHeiMedium-B5.ttf new file mode 100644 index 00000000..f9fb4894 Binary files /dev/null and b/Minecraft.Client/Common/Media/font/CHT/DFHeiMedium-B5.ttf differ diff --git a/Minecraft.Client/Common/Media/font/CHT/DFTT_R5.TTC b/Minecraft.Client/Common/Media/font/CHT/DFTT_R5.TTC new file mode 100644 index 00000000..34839685 Binary files /dev/null and b/Minecraft.Client/Common/Media/font/CHT/DFTT_R5.TTC differ diff --git a/Minecraft.Client/Common/Media/font/JPN/DF-DotDotGothic16.ttf b/Minecraft.Client/Common/Media/font/JPN/DF-DotDotGothic16.ttf new file mode 100644 index 00000000..1be2b4b3 Binary files /dev/null and b/Minecraft.Client/Common/Media/font/JPN/DF-DotDotGothic16.ttf differ diff --git a/Minecraft.Client/Common/Media/font/JPN/DFGMaruGothic-Md.ttf b/Minecraft.Client/Common/Media/font/JPN/DFGMaruGothic-Md.ttf new file mode 100644 index 00000000..4eb4eef7 Binary files /dev/null and b/Minecraft.Client/Common/Media/font/JPN/DFGMaruGothic-Md.ttf differ diff --git a/Minecraft.Client/Common/Media/font/KOR/BOKMSD.ttf b/Minecraft.Client/Common/Media/font/KOR/BOKMSD.ttf new file mode 100644 index 00000000..83fe8699 Binary files /dev/null and b/Minecraft.Client/Common/Media/font/KOR/BOKMSD.ttf differ diff --git a/Minecraft.Client/Common/Media/font/KOR/candadite2.ttf b/Minecraft.Client/Common/Media/font/KOR/candadite2.ttf new file mode 100644 index 00000000..f2ba094f Binary files /dev/null and b/Minecraft.Client/Common/Media/font/KOR/candadite2.ttf differ diff --git a/Minecraft.Client/Common/Media/font/Mojang Font_11.ttf b/Minecraft.Client/Common/Media/font/Mojang Font_11.ttf new file mode 100644 index 00000000..969cee58 Binary files /dev/null and b/Minecraft.Client/Common/Media/font/Mojang Font_11.ttf differ diff --git a/Minecraft.Client/Common/Media/font/Mojang Font_7.ttf b/Minecraft.Client/Common/Media/font/Mojang Font_7.ttf new file mode 100644 index 00000000..727c5fb6 Binary files /dev/null and b/Minecraft.Client/Common/Media/font/Mojang Font_7.ttf differ diff --git a/Minecraft.Client/Common/Media/font/Mojangles.ttf b/Minecraft.Client/Common/Media/font/Mojangles.ttf new file mode 100644 index 00000000..e7b87e9f Binary files /dev/null and b/Minecraft.Client/Common/Media/font/Mojangles.ttf differ diff --git a/Minecraft.Client/Common/Media/font/Mojangles_11.abc b/Minecraft.Client/Common/Media/font/Mojangles_11.abc new file mode 100644 index 00000000..016fdf99 Binary files /dev/null and b/Minecraft.Client/Common/Media/font/Mojangles_11.abc differ diff --git a/Minecraft.Client/Common/Media/font/Mojangles_7.abc b/Minecraft.Client/Common/Media/font/Mojangles_7.abc new file mode 100644 index 00000000..6ce06673 Binary files /dev/null and b/Minecraft.Client/Common/Media/font/Mojangles_7.abc differ diff --git a/Minecraft.Client/Common/Media/font/RU/SpaceMace.ttf b/Minecraft.Client/Common/Media/font/RU/SpaceMace.ttf new file mode 100644 index 00000000..70cd3f7d Binary files /dev/null and b/Minecraft.Client/Common/Media/font/RU/SpaceMace.ttf differ diff --git a/Minecraft.Client/Common/Media/font/chars.txt b/Minecraft.Client/Common/Media/font/chars.txt new file mode 100644 index 00000000..f7ba12ae Binary files /dev/null and b/Minecraft.Client/Common/Media/font/chars.txt differ diff --git a/Minecraft.Client/Common/Media/fr-FR/4J_strings.resx b/Minecraft.Client/Common/Media/fr-FR/4J_strings.resx new file mode 100644 index 00000000..9ae2bb13 --- /dev/null +++ b/Minecraft.Client/Common/Media/fr-FR/4J_strings.resx @@ -0,0 +1,108 @@ + +Inutilisé + +O.K. + +Retour + +Annuler + +Oui + +Non + +Sauvegarde endommagée + +Vos données de sauvegarde semblent endommagées. Créer une nouvelle sauvegarde et écraser le fichier endommagé ? + +Espace libre insuffisant + +Le périphérique de stockage sélectionné ne dispose pas de suffisamment d'espace libre pour créer une sauvegarde. + +Resélectionner + +Jouer sans sauvegarder + +Créer une sauvegarde + +Écraser la sauvegarde ? + +Le périphérique de stockage sélectionné contient déjà une sauvegarde. L'écraser ? + +Non, ne pas écraser + +Écraser et sauvegarder + +Échec de la sauvegarde + +Problème de périph. de stockage + +Votre périphérique de stockage n'est pas disponible ou présente une erreur. + +Votre périphérique de stockage est inaccessible ou présente une erreur. Veuillez sélectionner un autre périphérique de stockage. + +Sélectionner autre périphérique + +Aucun périph. sélectionné + +Si vous ne sélectionnez pas de périphérique de stockage, la fonction de sauvegarde sera désactivée. + +Sélectionner un périphérique + +Continuer sans sauvegarder + +Votre périphérique de stockage a été retiré. Sélectionnez-en un autre. + +Échec du chargement + +Nommer la sauvegarde + +Saisir un nom pour la sauvegarde + +Retour à l'Interface Xbox + +Voulez-vous vraiment quitter le jeu ? + +Déconnexion + +Votre profil de joueur a été déconnecté : retour à l'écran titre + +Un profil de joueur s'est déconnecté : partie interrompue + +Continuer à jouer + +Profil de joueur hors ligne + +Ce jeu intègre des fonctionnalités qui nécessitent un profil de joueur autorisé sur Xbox Live, mais vous êtes actuellement hors ligne. + +Cette fonctionnalité nécessite un profil de joueur connecté à Xbox Live. + +Connexion à Xbox Live + +Continuer à jouer hors ligne + +Problème d'attribution de succès + + Un problème est survenu lors de l'accès à votre profil du joueur. Votre succès n'a pas pu être attribué. + +Problème de profil du joueur + +La sauvegarde des paramètres sur le profil du joueur a échoué. + +Profil du joueur invité + +Le profil du joueur invité ne peut pas accéder à cette fonctionnalité. Veuillez utiliser un autre profil de joueur. + +Sauvegarde... + +Enregistrement en cours. N'éteignez pas votre console. + +Déverrouiller le jeu complet + +Vous jouez à la version d'évaluation de Minecraft. Si vous possédiez le jeu complet, vous auriez déjà remporté un succès ! +Déverrouillez le jeu complet pour profiter au mieux de Minecraft et jouer avec vos amis partout dans le monde via Xbox Live. +Voulez-vous déverrouiller le jeu complet ? + +Un problème s'est produit lors de la lecture de votre profil : retour au menu principal. + + diff --git a/Minecraft.Client/Common/Media/fr-FR/strings.resx b/Minecraft.Client/Common/Media/fr-FR/strings.resx new file mode 100644 index 00000000..541bbb7d --- /dev/null +++ b/Minecraft.Client/Common/Media/fr-FR/strings.resx @@ -0,0 +1,5164 @@ + +Un nouveau contenu téléchargeable est disponible ! Pour y accéder, utilisez le bouton Magasin Minecraft dans le menu principal. + +Changez l'apparence de votre personnage avec un pack de skins depuis le Magasin Minecraft. Sélectionnez-le dans le menu principal pour voir ce qui est disponible. + +Si vous jouez en mode Haute définition, votre partie peut accueillir jusqu'à quatre joueurs sur écran partagé, le tout sur une seule console ! + +Connectez des manettes supplémentaires à votre console et appuyez sur START pour rejoindre une partie à tout moment. + +Modifie les paramètres de gamma pour augmenter/réduire la luminosité de l'écran. + +Si vous avez réglé la difficulté du jeu sur Pacifique, votre santé se régénérera automatiquement, et aucun monstre ne sera de sortie à la nuit tombée ! + +Donnez un os à un loup pour l'amadouer. Ensuite, donnez-lui l'ordre de s'asseoir ou de vous suivre. + +Depuis l'inventaire, déplacez le curseur à l'extérieur de la fenêtre d'inventaire et appuyez sur{*CONTROLLER_VK_A*} pour vous séparer d'un objet. + +À la nuit tombée, dormir dans un lit accélère le défilement du temps jusqu'au matin suivant. En mode multijoueur, tous les joueurs doivent dormir dans leur lit en même temps. + +Prélevez de la viande de porc sur les cochons puis cuisinez-la. Mangez-la pour récupérer de la santé. + +Prélevez du cuir sur les vaches et utilisez-le pour confectionner des armures. + +Si vous avez un seau vide, remplissez-le de lait, d'eau ou de lave ! + +Utilisez une houe pour préparer des terres arables à la culture. + +Les araignées ne vous attaqueront pas de jour, sauf pour se défendre. + +Creuser le sol ou le sable avec une pelle, c'est plus rapide qu'à mains nues ! + +Préférez la viande de porc cuite à la viande crue ; vous récupérerez plus de santé. + +Fabriquez des torches pour vous éclairer la nuit. Les monstres se tiendront à l'écart des zones éclairées. + +Rendez-vous plus rapidement à bon port dans un chariot de mine propulsé sur des rails ! + +Plantez de jeunes pousses et elles produiront des arbres. + +Les hommes-cochons ne s'en prendront pas à vous, sauf si vous les attaquez. + +Dormez dans un lit pour changer votre point d'apparition dans le jeu et accélérer le temps jusqu'à l'aube. + +Retournez ces boules de feu à l'envoyeur ! + +Construire un portail vous permettra de voyager jusqu'à une autre dimension : le Nether. + +Appuyez sur{*CONTROLLER_VK_B*} pour lâcher l'objet que vous tenez en main ! + +Utilisez un outil adapté à la tâche ! + +Si vous ne trouvez pas de charbon pour embraser vos torches, vous pouvez toujours placer du bois dans le four pour obtenir du charbon de bois. + +Creuser juste sous vos pieds, ou au-dessus de vous, c'est rarement très judicieux. + +La poudre d'os (obtenue depuis un os de squelette) peut servir d'engrais : vos cultures arrivent instantanément à maturité ! + +Les creepers explosent au contact ! + +Au contact de l'eau, une source de lave produit de l'obsidienne. + +La lave peut mettre plusieurs minutes à disparaître TOTALEMENT lorsque le bloc source est détruit. + +La pierre taillée résiste aux boules de feu des ghasts et convient donc très bien à la protection des portails. + +Les blocs susceptibles d'émettre de la lumière (torches, glowstone et citrouilles-lanternes, entre autres) peuvent fondre la neige et la glace. + +Si vous bâtissez des structures de laine à l'air libre, méfiez-vous : les éclairs peuvent y mettre le feu. + +Un seul seau de lave suffit à fondre 100 blocs dans un four. + +L'instrument joué par un bloc musical dépend du matériau sur lequel il est posé. + +Les zombies et squelettes peuvent survivre à la lumière du jour s'ils sont dans l'eau. + +Si vous attaquez un loup, tous les loups à proximité immédiate deviendront aussitôt agressifs ; une propriété qu'ils partagent avec les cochons zombies. + +Les loups ne peuvent pas entrer dans le Nether. + +Les loups n'attaquent pas les creepers. + +Les poules pondent un œuf toutes les 5 à 10 minutes. + +L'obsidienne ne peut se miner qu'à l'aide d'une pioche en diamant. + +Les creepers sont la source de poudre à canon la plus facilement exploitable. + +Deux coffres placés côte à côte formeront un grand coffre. + +La santé des loups apprivoisés est illustrée par la position de leur queue. Donnez-leur de la viande pour les soigner. + +Passez du cactus au four pour obtenir du colorant vert. + +Suivez 4J Studios et Kappische sur Twitter pour rester au courant des dernières actus du jeu ! + +Depuis le menu Pause, publiez les captures d'écran de vos créations Minecraft sur Facebook et impressionnez vos amis ! + +Reportez-vous à la rubrique Nouveautés des menus Comment jouer pour consulter les dernières notes de mise à jour du jeu. + +Les barrières superposables sont désormais disponibles dans le jeu ! + +minecraftforum consacre toute une section à l'édition Xbox 360. + +Certains animaux vous suivrons si vous tenez du blé dans votre main. + +Si un animal ne peut se déplacer de plus de 20 blocs dans chaque direction, il ne disparaîtra pas. + +Musique par C418 ! + +Notch a plus d'un million d'abonnés sur Twitter ! + +Les Suédois ne sont pas tous blonds. Certains sont même roux, comme Jens de Mojang ! + +Il paraîtrait que 4J Studios a supprimé Herobrine du jeu sur console Xbox 360, mais rien n'est moins sûr. + +Une mise à jour du jeu sera déployée un jour ou l'autre ! + +Qui c'est, Notch ? + +Mojang a reçu plus de récompenses qu'il n'a d'employés ! + +De vraies célébrités jouent à Minecraft ! + +deadmau5 aime Minecraft ! + +Ne regardez pas les bugs dans les yeux. + +Les creepers sont nés d'un bug d'encodage. + +C'est une poule ou un canard ? + +Vous étiez à la Minecon ? + +Personne de chez Mojang n'a jamais vu le visage de junkboy. + +Vous saviez qu'il existait un Wiki Minecraft ? + +Le nouveau bureau de Mojang, il déchire ! + +Minecraft: Xbox 360 Edition a battu (presque) tous les records ! + +La Minecon 2013 s'est déroulée à Orlando, Floride, États-Unis ! + +La .party() était réussie ! + +N'oubliez pas : les rumeurs tiennent plus de l'invention que de la réalité ! + +{*T3*}COMMENT JOUER : PRINCIPES{*ETW*}{*B*}{*B*} +Le principe de Minecraft consiste à placer des blocs pour construire tout ce qu'on peut imaginer. La nuit, les monstres sont de sortie ; tâchez donc d'aménager un abri avant le coucher du soleil.{*B*}{*B*} +Utilisez{*CONTROLLER_ACTION_LOOK*} pour regarder autour de vous.{*B*}{*B*} +Utilisez{*CONTROLLER_ACTION_MOVE*} pour vous déplacer.{*B*}{*B*} +Appuyez sur{*CONTROLLER_ACTION_JUMP*} pour sauter.{*B*}{*B*} +Orientez{*CONTROLLER_ACTION_MOVE*} deux fois vers l'avant pour sprinter. Tant que vous maintenez {*CONTROLLER_ACTION_MOVE*} vers l'avant, le personnage continuera de sprinter jusqu'à ce que sa durée de sprint soit écoulée ou que sa jauge de nourriture compte moins de{*ICON_SHANK_03*}.{*B*}{*B*} +Maintenez{*CONTROLLER_ACTION_ACTION*} pour miner ou frapper à mains nues ou à l'aide d'un ustensile. Vous devrez parfois façonner des outils pour miner certains blocs.{*B*}{*B*} +Si vous tenez un objet à la main, utilisez{*CONTROLLER_ACTION_USE*} pour vous en servir, ou appuyez sur{*CONTROLLER_ACTION_DROP*} pour vous en débarrasser. + +{*T3*}COMMENT JOUER : INTERFACE PRINCIPALE{*ETW*}{*B*}{*B*} +L'interface principale affiche diverses informations, comme votre état, votre santé, l'oxygène qu'il vous reste quand vous nagez sous l'eau, votre niveau de satiété (vous devez manger pour remplir cette jauge) et votre armure, si vous en portez une. Si vous perdez de la santé, mais que votre jauge de nourriture comporte au moins 9{*ICON_SHANK_01*}, votre santé se reconstituera automatiquement. Manger de la nourriture reconstituera votre jauge de nourriture.{*B*} +L'interface principale affiche également la barre d'expérience, assortie d'une valeur numérique qui représente votre niveau d'expérience, ainsi qu'une jauge indiquant combien de points d'expérience sont nécessaires pour passer au niveau supérieur. Pour obtenir de l'expérience, ramassez les orbes d'expérience abandonnés par les monstres à leur mort, minez certains types de blocs, élevez des animaux, pêchez et fondez du minerai dans le four.{*B*}{*B*} +Les objets utilisables sont également répertoriés ici. Utilisez{*CONTROLLER_ACTION_LEFT_SCROLL*} et{*CONTROLLER_ACTION_RIGHT_SCROLL*} pour sélectionner un autre objet à tenir en main. + +{*T3*}COMMENT JOUER : INVENTAIRE{*ETW*}{*B*}{*B*} +Utilisez{*CONTROLLER_ACTION_INVENTORY*} pour consulter votre inventaire.{*B*}{*B*} +Cet écran affiche les objets susceptibles d'être tenus en main ainsi que tous les autres objets que vous portez, armure comprise.{*B*}{*B*} +Utilisez{*CONTROLLER_MENU_NAVIGATE*} pour déplacer le curseur. Utilisez{*CONTROLLER_VK_A*} pour saisir l'objet placé sous le curseur. S'il s'agit de plusieurs objets, vous sélectionnerez toute la pile. Vous pouvez aussi utiliser{*CONTROLLER_VK_X*} pour n'en sélectionner que la moitié.{*B*}{*B*} +Déplacez l'objet annexé au curseur jusqu'à un autre emplacement de l'inventaire et déposez-le avec{*CONTROLLER_VK_A*}. Si plusieurs objets sont annexés au curseur, utilisez{*CONTROLLER_VK_A*} pour tous les déposer, ou{*CONTROLLER_VK_X*} pour n'en déposer qu'un seul.{*B*}{*B*} +Si l'objet pointé est une armure, une infobulle s'affichera pour l'affecter rapidement à l'emplacement d'armure correspondant de votre inventaire. +{*B*}{*B*} +Vous pouvez modifier la couleur de votre armure en cuir en utilisant un colorant. Pour cela, sélectionnez le colorant dans votre inventaire et maintenez le curseur puis appuyez sur{*CONTROLLER_VK_X*} lorsque le curseur est sur la pièce à teindre. + + +{*T3*}COMMENT JOUER : COFFRE{*ETW*}{*B*}{*B*} +Dès que vous aurez fabriqué un coffre, vous pourrez le placer dans votre environnement puis l'utiliser avec{*CONTROLLER_ACTION_USE*} pour entreposer des objets de votre inventaire.{*B*}{*B*} +Utilisez le pointeur pour déplacer des objets entre votre coffre et votre inventaire.{*B*}{*B*} +Les objets remisés dans le coffre peuvent ensuite être réintégrés à l'inventaire. + + +{*T3*}COMMENT JOUER : GRAND COFFRE{*ETW*}{*B*}{*B*} +Deux coffres placés côte à côte se combineront pour former un grand coffre où vous pourrez entreposer toujours plus d'objets.{*B*}{*B*} +Son mode d'utilisation est identique à celui du coffre de base. + + +{*T3*}COMMENT JOUER : ARTISANAT{*ETW*}{*B*}{*B*} +Depuis l'interface d'artisanat, vous pouvez combiner divers objets de votre inventaire pour en créer de nouveaux. Utilisez{*CONTROLLER_ACTION_CRAFTING*} pour afficher l'interface d'artisanat.{*B*}{*B*} +Parcourez les onglets, en haut, à l'aide de{*CONTROLLER_VK_LB*} et{*CONTROLLER_VK_RB*} pour sélectionner la catégorie d'objets que vous souhaitez confectionner, puis utilisez{*CONTROLLER_MENU_NAVIGATE*} pour choisir l'article à créer.{*B*}{*B*} +La grille d'artisanat indique quels objets sont nécessaires à la production du nouvel article. Appuyez sur{*CONTROLLER_VK_A*} pour confectionner l'objet et le placer dans votre inventaire. + + +{*T3*}COMMENT JOUER : ATELIER{*ETW*}{*B*}{*B*} +Vous pouvez utiliser un atelier pour confectionner des objets plus grands.{*B*}{*B*} +Placez l'atelier dans votre environnement et appuyez sur{*CONTROLLER_ACTION_USE*} pour l'utiliser.{*B*}{*B*} +L'artisanat sur atelier fonctionne de la même manière que l'artisanat classique, mais vous disposez d'une grille d'artisanat plus étendue et d'un éventail plus riche d'objets à créer. + + +{*T3*}COMMENT JOUER : FOUR{*ETW*}{*B*}{*B*} +Un four vous permet de fondre des objets pour les modifier. Par exemple, vous pouvez y déposer du minerai de fer pour fondre des lingots de fer.{*B*}{*B*} +Placez le four dans votre environnement et appuyez sur{*CONTROLLER_ACTION_USE*} pour l'utiliser.{*B*}{*B*} +Vous devrez alimenter le four avec du combustible, en bas, et déposer l'objet à fondre en haut. Le four s'actionnera alors.{*B*}{*B*} +Une fois les objets fondus, vous pouvez les déplacer depuis la zone de production jusqu'à votre inventaire.{*B*}{*B*} +Si l'objet pointé est un ingrédient ou du combustible pour le four, une infobulle s'affichera pour transférer l'objet dans le four. + + +{*T3*}COMMENT JOUER : DISTRIBUTEUR{*ETW*}{*B*}{*B*} +Un distributeur sert à... distribuer des objets. Pour l'actionner, vous devrez placer un interrupteur ou levier à proximité.{*B*}{*B*} +Pour remplir d'objets le distributeur, appuyez sur{*CONTROLLER_ACTION_USE*}, puis placez-y les articles de votre inventaire que vous souhaitez distribuer.{*B*}{*B*} +Le distributeur crachera un objet dès que vous actionnerez l'interrupteur dédié. + + +{*T3*}COMMENT JOUER : ALCHIMIE{*ETW*}{*B*}{*B*} +La concoction de potions nécessite un alambic, à construire dans un atelier. Toutes les potions ont pour base une fiole d'eau, qu'on obtient en remplissant une fiole avec de l'eau tirée d'un chaudron ou d'une source d'eau.{*B*} +Un alambic peut accueillir jusqu'à trois fioles ; vous pouvez donc distiller jusqu'à trois potions à la fois. Un même ingrédient peut servir aux trois fioles. Pensez à toujours distiller trois potions à la fois pour optimiser vos ressources.{*B*} +Placer un ingrédient de potion dans l'emplacement du haut de l'alambic produira une potion de base au bout de quelques instants. Celle-ci n'a aucun effet, mais si vous distillez un autre ingrédient avec cette fiole de base, vous produirez une potion avec un principe actif.{*B*} +Ajoutez alors un troisième ingrédient pour allonger la durée d'effet de la potion (à l'aide de poudre de redstone), renforcer son intensité (à l'aide de poudre de glowstone) ou bien en faire une potion offensive (à l'aide d'un œil d'araignée fermenté).{*B*} +Vous pouvez aussi y incorporer de la poudre à canon pour en faire une potion volatile que vous pouvez lancer. Une fois lancées, les potions volatiles appliquent leurs effets à la zone d'impact.{*B*} + +Les matières premières pour les potions sont :{*B*}{*B*} +* {*T2*}Verrue du Nether{*ETW*}{*B*} +* {*T2*}Œil d'araignée{*ETW*}{*B*} +* {*T2*}Sucre{*ETW*}{*B*} +* {*T2*}Larme de Ghast{*ETW*}{*B*} +* {*T2*}Poudre de feu{*ETW*}{*B*} +* {*T2*}Crème de magma{*ETW*}{*B*} +* {*T2*}Pastèque scintillante{*ETW*}{*B*} +* {*T2*}Poudre de redstone{*ETW*}{*B*} +* {*T2*}Poudre de glowstone{*ETW*}{*B*} +* {*T2*}Œil d'araignée fermenté{*ETW*}{*B*}{*B*} + +Vous devrez essayer diverses combinaisons d'ingrédients pour découvrir toutes les recettes de potions à concocter. + + +{*T3*}COMMENT JOUER : ENCHANTEMENT{*ETW*}{*B*}{*B*} +Les points d'expérience obtenus à la mort d'un monstre, ou lorsque certains blocs sont minés ou fondus dans un four, peuvent servir à enchanter les outils, armes, armures et livres.{*B*} +Lorsqu'une épée, une hache, une pioche, une pelle, une armure ou un livre est placé dans l'emplacement situé sous le livre de la table d'enchantement, les trois boutons à sa droite afficheront certains enchantements ainsi que leur coût en niveaux d'expérience.{*B*} +Si vous n'avez pas assez de niveaux d'expérience pour utiliser certains d'entre eux, le coût apparaîtra en rouge ; sinon, en vert.{*B*}{*B*} +L'enchantement appliqué par défaut est choisi aléatoirement d'après le coût affiché.{*B*}{*B*} +Si la table d'enchantement est entourée de bibliothèques (jusqu'à 15) avec un intervalle d'un bloc entre la table et la bibliothèque, la puissance des enchantements sera renforcée et des glyphes arcaniques apparaîtront, projetés par le livre sur la table d'enchantement.{*B*}{*B*} +Tous les ingrédients nécessaires à une table d'enchantement peuvent se trouver dans les villages, ou bien en minant et cultivant.{*B*}{*B*} +Utilisez les livres d'enchantement à l'enclume pour enchanter des objets. Ainsi, vous contrôlez mieux quels enchantements vous désirez utiliser sur vos objets.{*B*} + + +{*T3*}COMMENT JOUER : ANIMAUX DE LA FERME{*ETW*}{*B*}{*B*} +Si vous souhaitez garder vos animaux au même endroit, construisez une zone clôturée de moins de 20x20 blocs pour y parquer vos animaux. Avec la clôture, vous serez sûr de retrouver vos animaux quand vous viendrez les voir. + + +{*T3*}COMMENT JOUER : ÉLEVER DES ANIMAUX{*ETW*}{*B*}{*B*} +Les animaux de Minecraft peuvent se reproduirent et donner naissance à des petits !{*B*} +Pour faire en sorte que les animaux se reproduisent, vous devez leur donner à manger la nourriture appropriée ; ils basculeront alors en mode « Romance ».{*B*} +Donnez du blé aux vaches, Champimeuh et moutons, des carottes aux cochons, des graines de blé ou des verrues du Nether aux poulets et n'importe quelle variété de viande aux loups : ils se mettront alors en chasse d'un autre animal de leur espèce, lui aussi disposé à se reproduire.{*B*} +Lorsque deux animaux d'une même espèce se rencontrent, et pourvu qu'ils soient tous les deux en mode Romance, ils s'embrassent quelques secondes, et un bébé apparaît. Le jeune animal suivra ses parents quelque temps avant de devenir adulte.{*B*} +Une fois qu'un animal est passé en mode Romance, il faut patienter cinq minutes environ pour qu'il soit à nouveau apte.{*B*} +Le nombre d'animaux dans un monde est limité ; il est donc possible que vos animaux ne se reproduisent pas s'ils sont déjà nombreux. + +{*T3*}COMMENT JOUER : PORTAIL DU NETHER{*ETW*}{*B*}{*B*} +Un portail du Nether permet au joueur de circuler entre la Surface et le Nether. Vous pouvez emprunter le Nether pour voyager rapidement à la Surface : parcourir un bloc de distance dans le Nether équivaut à voyager sur trois blocs de la Surface. Lorsque vous empruntez un portail pour quitter le Nether, vous aurez voyagé sur une distance 3 fois supérieure à celle réellement parcourue.{*B*}{*B*} +Vous devrez disposer d'au moins 10 blocs d'obsidienne pour construire le portail : celui-ci doit être haut de 5 blocs et large de 4, pour une épaisseur d'1 bloc. Une fois le contour achevé, l'espace contenu à l'intérieur doit être enflammé pour activer le portail. Pour ce faire, vous pouvez utiliser un briquet à silex ou une boule de feu.{*B*}{*B*} +Des exemples de construction de portail sont illustrés à droite. + + +{*T3*}COMMENT JOUER : MULTIJOUEUR{*ETW*}{*B*}{*B*} +Par défaut, Minecraft sur console Xbox 360 est un jeu multijoueur. Si vous jouez en mode haute définition, vous pouvez raccorder des manettes supplémentaires et appuyer sur START à n'importe quel moment pour que d'autres joueurs rejoignent la partie.{*B*}{*B*} +Lorsque vous démarrez ou rejoignez une partie en ligne, elle apparaîtra à tous les joueurs de votre liste d'amis (à moins que vous n'ayez sélectionné l'option Sur invitation lors de la création de la partie) ; s'ils rejoignent la partie, elle apparaîtra également aux membres de leur propre liste d'amis (si vous avez sélectionné l'option Autoriser les amis d'amis).{*B*} +En cours de partie, vous pouvez appuyer sur la touche BACK pour afficher la liste des joueurs qui figurent dans la partie, consulter leurs cartes du joueur, exclure des joueurs et en inviter d'autres à rejoindre la partie. + + +{*T3*}COMMENT JOUER : PARTAGE DE CAPTURES D'ÉCRAN{*ETW*}{*B*}{*B*} +Pour saisir une capture d'écran de votre partie, affichez le menu Pause et appuyez sur{*CONTROLLER_VK_Y*} pour partager sur Facebook. Vous verrez apparaître une version miniature de votre capture d'écran ; vous pourrez alors modifier le texte associé à votre publication sur Facebook.{*B*}{*B*} +Un mode Caméra est tout spécialement conçu pour saisir ces captures d'écran. Appuyez sur{*CONTROLLER_ACTION_CAMERA*} jusqu'à ce que s'affiche la vue de devant du personnage. Ensuite, appuyez sur{*CONTROLLER_VK_Y*} pour partager.{*B*}{*B*} +Les gamertags ne seront pas affichés sur la capture d'écran. + + +{*T3*}COMMENT JOUER : EXCLUSION DE NIVEAUX{*ETW*}{*B*}{*B*} +Si vous découvrez du contenu inapproprié dans un niveau auquel vous jouez, vous pouvez choisir de l'ajouter à votre liste de niveaux exclus. +Pour ce faire, affichez le menu Pause puis appuyez sur{*CONTROLLER_VK_RB*} pour sélectionner l'option d'exclusion de niveaux. +Si vous tentez de rejoindre ce niveau à l'avenir, un message vous indiquera qu'il figure dans votre liste de niveaux exclus. Vous pourrez alors décider de le supprimer de la liste et d'y accéder, ou bien d'annuler. + +{*T3*}COMMENT JOUER : MODE CRÉATIF{*ETW*}{*B*}{*B*} +L'interface du mode Créatif permet de déplacer dans l'inventaire du joueur n'importe quel objet du jeu sans qu'il soit besoin de le miner ou de le fabriquer. +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. +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*} + +{*T1*}Options du joueur{*ETW*}{*B*} +Lorsque vous chargez ou créez un monde, appuyez sur le bouton Plus d'options pour accéder à un menu où figurent d'autres paramètres de configuration de la partie.{*B*}{*B*} + + {*T2*}Joueur contre joueur{*ETW*}{*B*} + Lorsque cette option est activée, les joueurs peuvent infliger des dégâts aux autres joueurs. Cette option ne s'applique qu'au mode Survie.{*B*}{*B*} + + {*T2*}Joueurs de confiance{*ETW*}{*B*} + Lorsque cette option est désactivée, les joueurs sont limités dans leurs activités. Ils ne peuvent pas miner ou utiliser des objets, placer des blocs ou des interrupteurs, utiliser des conteneurs, attaquer des joueurs ou des animaux. Vous pouvez modifier les options applicables à un joueur donné depuis le menu de jeu.{*B*}{*B*} + + {*T2*}Propagation du feu{*ETW*}{*B*} + Lorsque cette option est activée, le feu peut se propager aux blocs voisins inflammables. Vous pouvez aussi modifier cette option depuis le menu de jeu.{*B*}{*B*} + + {*T2*}Explosion de TNT{*ETW*}{*B*} + Lorsque cette option est activée, le TNT peut exploser lorsqu'il est activé. Vous pouvez aussi modifier cette option depuis le menu de jeu.{*B*}{*B*} + + {*T2*}Privilèges d'hôte{*ETW*}{*B*} + Lorsque cette option est activée, l'hôte peut activer/désactiver sa capacité à voler, désactiver la fatigue et se rendre invisible depuis le menu de jeu. {*DISABLES_ACHIEVEMENTS*}{*B*}{*B*} + + {*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*} + + {*T2*}Génération de structures{*ETW*}{*B*} + Lorsque cette option est activée, les structures comme les villages et les forts apparaîtront dans le monde.{*B*}{*B*} + + {*T2*}Monde superplat{*ETW*}{*B*} + Lorsque cette option est activée, un monde complètement plat apparaîtra à la Surface et dans le Nether.{*B*}{*B*} + + {*T2*}Coffre bonus{*ETW*}{*B*} + Lorsque cette option est activée, un coffre renfermant des objets utiles sera créé à proximité du point d'apparition du joueur.{*B*}{*B*} + + {*T2*}Réinitialiser le Nether{*ETW*}{*B*} + 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 {*BACK_BUTTON*} pour afficher le menu de jeu et accéder à diverses options.{*B*}{*B*} + + {*T2*}Options de l'hôte{*ETW*}{*B*} + Le joueur hôte et les joueurs au statut de modérateur peuvent accéder au menu Options de l'hôte. Depuis ce menu, ils peuvent activer/désactiver la propagation du feu et l'explosion de TNT.{*B*}{*B*} + +{*T1*}Options du joueur{*ETW*}{*B*} +Pour modifier les privilèges d'un joueur, sélectionnez son nom et appuyez sur{*CONTROLLER_VK_A*} pour afficher le menu des privilèges et paramétrer les options suivantes.{*B*}{*B*} + + {*T2*}Peut construire et miner{*ETW*}{*B*} + Uniquement disponible si l'option Joueurs de confiance est désactivée. Lorsque cette option est activée, le joueur peut interagir normalement avec le monde. Sinon, il ne pourra ni placer ni détruire des blocs, ni même interagir avec de nombreux objets et blocs.{*B*}{*B*} + + {*T2*}Peut utiliser les portes et les interrupteurs{*ETW*}{*B*} + Uniquement disponible quand l'option Joueurs de confiance est désactivée. Quand cette option est désactivée, le joueur ne pourra pas utiliser les portes ou les interrupteurs.{*B*}{*B*} + + {*T2*}Peut ouvrir les conteneurs{*ETW*}{*B*} + Uniquement disponible quand l'option Joueurs de confiance est désactivée. Quand cette option est désactivée, le joueur ne pourra pas ouvrir les conteneurs, tels que les coffres.{*B*}{*B*} + + {*T2*}Peut attaquer les joueurs{*ETW*}{*B*} + Uniquement disponible si l'option Joueurs de confiance est désactivée. Cette option désactivée, le joueur ne pourra pas infliger de dégâts aux autres joueurs.{*B*}{*B*} + + {*T2*}Peut attaquer 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*} + {*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*} + 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 + +Inventaire + +Coffres + +Artisanat + +Four + +Distributeur + +Animaux de la ferme + +Élever des animaux + +Alchimie + +Enchantement + +Portail du Nether + +Multijoueur + +Partage des captures d'écran + +Exclusion de niveaux + +Mode Créatif + +Options de l'hôte et du joueur + +Transactions + +Enclume + +La Fin + +{*T3*}COMMENT JOUER : L'ENDER{*ETW*}{*B*}{*B*} +L'Ender est une autre dimension du jeu, atteinte par un portail de l'Ender actif. Le portail de l'Ender se trouve dans un fort, profondément enfoui sous la Surface.{*B*} +Pour activer le portail de l'Ender, vous devrez placer un œil d'Ender dans n'importe quel cadre de portail de l'Ender qui n'en contient pas.{*B*} +Quand le portail est actif, sautez dedans pour vous rendre dans l'Ender.{*B*}{*B*} +Dans l'Ender, vous rencontrerez le dragon de l'Ender, un ennemi féroce et puissant, et de nombreux Enderman. Vous devrez donc être préparé au combat avant de vous y rendre !{*B*}{*B*} +Vous découvrirez qu'il existe des cristaux d'Ender à l'extrémité de huit pics d'obsidienne que le dragon utilise pour se soigner. +La première étape est donc de détruire chacun d'entre eux.{*B*} +Les premiers peuvent être atteints par des flèches, mais les derniers sont protégés par une cage d'acier, et vous devrez les atteindre par étapes.{*B*}{*B*} +Ce faisant, le dragon de l'Ender vous attaquera en volant vers vous et en crachant des boules d'acide de l'Ender !{*B*} +Si vous vous approchez du podium aux œufs au centre des pics, le dragon volera vers vous pour vous attaquer, ce qui vous donnera une bonne occasion de le blesser !{*B*} +Évitez son souffle acide et visez ses yeux pour de meilleurs résultats. Si possible, demandez à des amis de vous suivre dans l'Ender pour vous aider dans votre combat !{*B*}{*B*} +Une fois que vous serez dans l'Ender, vos amis pourront voir l'emplacement du portail de l'Ender dans le fort sur leurs cartes, +et ils pourront facilement vous rejoindre. + + +Sprint + +Nouveautés + +{*T3*}Modifications et ajouts{*ETW*}{*B*}{*B*} +- Ajout de nouveaux objets : 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 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. + +Nécessaire pour miner les blocs de pierre et le minerai. + +Sert à travailler les blocs de bois plus vite qu'à mains nues. + +Sert à faucher les blocs de terre et d'herbe pour les préparer à la culture. + +Pour activer les portes en bois, vous devez les actionner, les frapper ou utiliser une redstone. + +Les portes en fer ne peuvent s'ouvrir qu'au moyen d'une redstone, de boutons ou d'interrupteurs. + +NOT USED + +NOT USED + +NOT USED + +NOT USED + +Confère au porteur une armure de 1. + +Confère au porteur une armure de 3. + +Confère au porteur une armure de 2. + +Confère au porteur une armure de 1. + +Confère au porteur une armure de 2. + +Confère au porteur une armure de 5. + +Confère au porteur une armure de 4. + +Confère au porteur une armure de 1. + +Confère au porteur une armure de 2. + +Confère au porteur une armure de 6. + +Confère au porteur une armure de 5. + +Confère au porteur une armure de 2. + +Confère au porteur une armure de 2. + +Confère au porteur une armure de 5. + +Confère au porteur une armure de 3. + +Confère au porteur une armure de 1. + +Confère au porteur une armure de 3. + +Confère au porteur une armure de 8. + +Confère au porteur une armure de 6. + +Confère au porteur une armure de 3. + +Un lingot étincelant qui sert à la confection d'outils. Créé en fondant du minerai dans le four. + +Permet de transformer les lingots, gemmes ou colorants en blocs aménageables. Peut servir de bloc de construction précieux ou d'entrepôt compact pour le minerai. + +Sert à infliger une décharge électrique au joueur, animal ou monstre qui marche dessus. Les plaques de détection en bois se déclenchent également si vous laissez tomber un objet dessus. + +Sert à la création d'escaliers compacts. + +Sert à la création d'escaliers longs. Deux dalles placées l'une sur l'autre formeront une dalle double de taille normale. + +Sert à la création d'escaliers longs. Deux blocs placés l'un sur l'autre créent un bloc double de taille normale. + +Sert à produire de la lumière. Les torches permettent aussi de fondre la neige et la glace. + +Sert de matériau de construction ; transformable en de nombreux objets. Se taille dans n'importe quel type de bois. + +Sert de matériau de +construction. La gravité n'a pas d'effet sur lui, contrairement au sable normal. + +Sert de matériau de construction. + +Sert à la confection des torches, flèches, panneaux, échelles, barrières, ainsi que +des poignées d'armes et manches d'outils. + +Permet d'accélérer le cycle nuit/jour jusqu'à l'aube suivante pourvu que tous les joueurs soient couchés ; modifie également le point d'apparition du joueur. +La couleur des lits est toujours la même. + +Permet de créer un éventail d'objets plus riche que l'artisanat classique. + +Permet de fondre le minerai, de créer du charbon et du verre, de cuisiner le poisson et la viande de porc. + +Permet d'entreposer des blocs et objets. Placez deux coffres côte à côte pour former un grand coffre à la capacité doublée. + +Sert de rempart impossible à franchir. Compte pour 1,5 bloc de hauteur pour les joueurs, animaux et monstres, mais pour un seul bloc de hauteur pour les autres blocs. + +Permet de grimper et de descendre. + +Actionnez, frappez la trappe ou utilisez une redstone pour l'activer. La trappe fonctionne à la manière d'une porte classique, sauf qu'elle occupe un espace d'1x1 bloc et repose à même le sol. + +Affiche les messages que les autres joueurs et vous saisissez. + +Sert à produire une lumière plus vive que celle des torches. Permet de fondre la neige et la glace ; peut s'utiliser sous l'eau. + +Sert à déclencher des explosions. Une fois placé, appliquez une décharge électrique ou utilisez un briquet à silex pour l'activer. + +Sert à contenir du ragoût de champignons. Vous conservez le bol une fois le ragoût avalé. + +Sert à contenir et transporter eau, lave et lait. + +Sert à contenir et transporter de l'eau. + +Sert à contenir et transporter de la lave. + +Sert à contenir et transporter du lait. + +Sert à faire du feu et à allumer la mèche du TNT ; ouvre un portail sitôt fabriqué. + +Sert à pêcher le poisson. + +Affiche la position du soleil et de la lune. + +Indique la position de votre point de départ. + +Tenue en main, la carte crée l'image d'une zone explorée. Peut servir à la détermination d'un trajet. + +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*}. + +Restitue 1{*ICON_SHANK_01*}. + +Restitue 3{*ICON_SHANK_01*}. + +Restitue 1{*ICON_SHANK_01*} mais peut vous empoisonner. Se cuisine dans un four. + +Restitue 3{*ICON_SHANK_01*}. Obtenu en cuisinant de la viande de poulet cru dans un four. + +Restitue 1,5{*ICON_SHANK_01*}. Se cuisine dans un four. + +Restitue 4{*ICON_SHANK_01*}. Obtenu en cuisinant de la viande de bœuf cru dans un four. + +Restitue 1,5{*ICON_SHANK_01*} ou se cuisine dans un four. + +Restitue 4{*ICON_SHANK_01*}. Obtenue en cuisinant de la viande de porc cru dans un four. + +Restitue 1{*ICON_SHANK_01*} ou se cuisine dans un four. Sert également à nourrir un ocelot pour l'apprivoiser. + +Restitue 2,5{*ICON_SHANK_01*}. Résulte de la cuisson de poisson cru dans un four. + +Restitue 2{*ICON_SHANK_01*} ; transformable en pomme dorée. + +Restitue 2{*ICON_SHANK_01*} et régénère la santé pendant 4 secondes. Se fabrique avec une carotte et des pépites d'or. + +Restitue 2{*ICON_SHANK_01*} mais peut vous empoisonner. + +Sert d'ingrédient dans la recette du gâteau et à la préparation de potions. + +Si activé, permet de produire une décharge électrique. Reste activé/désactivé jusqu'à nouvelle utilisation. + +Produit une décharge électrique constante ; peut aussi servir de récepteur/ +transmetteur si connectée à la façade d'un bloc. +Génère également une faible luminosité. + +Sert dans les circuits de redstone comme répéteur, retardateur et/ou diode. + +Sert à produire une décharge électrique une fois actionné. Reste activé pendant environ une seconde avant de se désactiver. + +Sert à entreposer et distribuer aléatoirement des objets lorsqu'on lui applique une charge de redstone. + +Joue une note une fois actionné. Frappez-le pour changer la hauteur de note. Déposez-le sur des blocs différents pour changer le type d'instrument. + +Sert à diriger les chariots de mine. + +Une fois alimenté en énergie, accélère les chariots de mine qui l'empruntent. Si le rail n'est pas alimenté, les chariots interrompent aussitôt leur trajet. + +Fonctionne comme une plaque de détection (diffuse un signal de redstone si alimenté), mais ne peut être activé que par un chariot de mine. + +Sert à véhiculer sur les rails joueurs, animaux et monstres. + +Sert à acheminer des marchandises sur les rails. + +Se déplace sur les rails et propulse les autres chariots de mine lorsqu'on l'alimente au charbon. + +Sert à circuler dans l'eau plus rapidement qu'à la nage. + +Prélevée sur les moutons ; se teint avec les colorants. + +Sert de matériau de construction et se teint avec les colorants. Cette recette n'est pas recommandée, puisque la laine s'obtient facilement sur les moutons. + +Sert de colorant pour la confection de laine noire. + +Sert de colorant pour la confection de laine verte. + +Utilisé comme colorant pour la confection de laine marron, d'ingrédient pour la préparation de cookies et pour faire pousser des fèves de chocolat. + +Sert de colorant pour la confection de laine argentée. + +Sert de colorant pour la confection de laine jaune. + +Sert de colorant pour la confection de laine rouge. + +Fait instantanément arriver à maturité les cultures, arbres, herbes hautes, champignons géants et fleurs ; peut aussi servir dans les recettes de colorant. + +Sert de colorant pour la confection de laine rose. + +Sert de colorant pour la confection de laine orange. + +Sert de colorant pour la confection de laine vert lime. + +Sert de colorant pour la confection de laine grise. + +Sert de colorant pour créer de la laine gris clair. +Remarque : vous pouvez aussi combiner colorant gris et poudre d'os pour en produire. Vous pouvez ainsi en confectionner quatre par poche d'encre au lieu de trois. + +Sert de colorant pour la confection de laine bleu ciel. + +Sert de colorant pour la confection de laine bleu cyan. + +Sert de colorant pour la confection de laine violette. + +Sert de colorant pour la confection de laine magenta. + +Sert de colorant pour la confection de laine bleue. + +Permet d'écouter des disques. + +Utiles pour confectionner des outils, armes et armures très robustes. + +Sert à produire une lumière plus vive que celle des torches. Permet de fondre la neige et la glace ; peut s'utiliser sous l'eau. + +Sert à créer des livres et cartes. + +Sert à créer des bibliothèques ou est utilisé enchanté pour fabriquer des livres enchantés. + +Placée dans la table d'enchantement, permet de créer des enchantements encore plus puissants. + +Sert de décoration. + +Se mine à l'aide d'une pioche en fer (ou mieux) ; transformé en lingots d'or dans le four. + +Se mine à l'aide d'une pioche en pierre (ou mieux) ; transformé en lingots de fer dans le four. + +Se mine avec une pioche pour prélever du charbon. + +Se mine avec une pioche en pierre pour prélever du lapis-lazuli. + +Se mine avec une pioche en fer pour prélever des diamants. + +Se mine avec une pioche en fer pour prélever de la poudre de redstone. + +Se mine avec une pioche pour prélever de la pierre taillée. + +Prélevée à l'aide d'une pelle. Sert de matériau de construction. + +Une fois plantée, peut prospérer et devenir un arbre. + +Impossible à briser. + +Enflamme n'importe quoi à son contact. Peut être prélevée dans un seau. + +Prélevé à l'aide d'une pelle. Peut être fondu en verre dans le four. Soumis à la gravité s'il ne repose sur aucun autre bloc. + +Prélevé à l'aide d'une pelle. Donne parfois du silex lorsqu'il est travaillé. Soumis à la gravité s'il ne repose sur aucun autre bloc. + +Travaillé à la hache. Transformé en planches ou utilisé comme combustible. + +Créé par la fusion du sable dans un four. Peut servir de matériau de construction, mais sera détruit si vous tentez de le miner. + +Obtenue en travaillant la pierre à l'aide d'une pioche. Peut servir à la construction d'un four ou à la fabrication d'outils en pierre. + +Obtenue par la cuisson d'argile dans un four. + +Peut être transformée en briques à la chaleur d'un four. + +Une fois brisé, produit des boules d'argile qui peuvent être transformées en briques dans le four. + +Un moyen peu encombrant d'entreposer des boules de neige. + +Se creuse à l'aide d'une pelle pour créer des boules de neige. + +Produit parfois des graines de blé si détruite. + +Transformable en colorant. + +Combiné à un bol, sert à la préparation de ragoûts. + +Ne peut être travaillée qu'à l'aide d'une pioche en diamant. Résulte d'un mélange d'eau et de lave inerte. Sert à la construction des portails. + +Libère des monstres dans l'environnement. + +Se place au sol pour créer un câble conducteur d'électricité. Utilisé dans une potion, permet d'augmenter la durée de l'effet. + +Une fois arrivées à maturité, les cultures peuvent être récoltées pour produire du blé. + +Un sol fertile préparé pour la culture des graines. + +Passé au four, sert à la confection d'un colorant vert. + +Sert à la confection de sucre. + +Peut servir de casque ou se combiner avec une torche pour produire une citrouille-lanterne. C'est également l'ingrédient principal de la tarte à la citrouille. + +Brûle indéfiniment si embrasé. + +Ralentit le mouvement de toute créature qui circule dessus. + +Emprunter un portail permet de circuler entre la Surface et le Nether. + +Alimente le four en combustible ; sert à la confection des torches. + +Prélevé sur les cadavres d'araignées. Sert à la confection d'arcs ou de cannes à pêche ou se dépose au sol pour fabriquer un crochet. + +Prélevé sur les cadavres de poulets ; sert à la confection des flèches. + +Prélevée sur les cadavres de creepers. Sert à la confection de TNT ou comme ingrédient dans la confection de potions. + +Plantées dans une terre labourée, produisent des cultures. Assurez-vous que les graines soient assez exposées au soleil ! + +Obtenu par la récolte des cultures ; sert à la préparation d'aliments. + +Obtenu en creusant le gravier ; sert à la confection d'un briquet à silex. + +Utilisée sur un cochon, vous permet de le chevaucher. Vous pouvez ensuite diriger votre monture à l'aide d'une carotte sur un bâton. + +Obtenue en creusant la neige ; peut servir de projectile. + +Prélevé sur les cadavres de vaches. Sert à la confection d'armures ou de livres. + +Prélevé sur les cadavres de slimes. Sert comme ingrédient dans la confection de potions ou pour fabriquer des pistons collants. + +Produit aléatoirement par les poules ; sert à la préparation d'aliments. + +Obtenue en minant un bloc de glowstone. Sert à la reconstitution de blocs de glowstone ou comme ingrédient dans la confection de potions pour accroître leur effet. + +Prélevé sur les cadavres de squelettes ; sert à la confection de poudre d'os. Donnez-en à manger à un loup pour le domestiquer. + +Obtenu sur les creepers tués par un squelette ; à lire dans un juke-box. + +Éteint les flammes et contribue à la prospérité des cultures ; à prélever dans un seau. + +Une fois détruit, produit une pousse d'arbre à replanter pour créer un nouvel arbre. + +Se trouve dans les donjons et sert à la construction et à la décoration. + +Sert à tondre la laine des moutons et à exploiter les blocs de feuillage. + +Une fois alimenté (moyennant un bouton, un levier, une plaque de détection, une torche de redstone ou une redstone avec l'un ou l'autre de ces éléments), le piston s'allonge si possible pour pousser des blocs. + +Une fois alimenté (moyennant un bouton, un levier, une plaque de détection, une torche de redstone ou une redstone avec l'un ou l'autre de ces éléments), le piston s'allonge si possible pour pousser des blocs. Lorsque le piston se rétracte, le bloc en contact avec la tête du piston retrouve son emplacement initial. + +À tailler dans les blocs de pierre ; on en trouve généralement dans les forts. + +Sert de clôture, comparable aux barrières. + +Comparable à une porte, mais s'utilise principalement avec une barrière. + +Se fabrique avec des tranches de pastèque. + +Des blocs transparents qui peuvent servir d'alternative aux blocs de verre. + +À planter pour faire pousser des citrouilles. + +À planter pour faire pousser des pastèques. + +Produite par les Enderman à leur mort. Lorsqu'elle est lancée, le joueur est téléporté jusqu'à la zone d'impact de la perle du néant et perdra un peu de santé. + +Un bloc de terre couronnée de gazon. Se prélève à l'aide d'une pelle. Sert de matériau de construction. + +Sert à la construction et à la décoration. + +Ralentit vos mouvements lorsque vous passez à travers. Utilisez des cisailles pour la détruire et prélever du fil. + +Produit un poisson d'argent lorsqu'elle est détruite. Peut également produire un poisson d'argent si à proximité d'un autre poisson d'argent en train d'être attaqué. + +Lorsqu'il est placé, pousse sans interruption. Se prélève avec des cisailles. Peut-être utilisé comme une échelle. + +Glissante lorsque vous marchez dessus. Se transforme en eau si elle est placée au-dessus d'un autre bloc lorsqu'elle est détruite. Fond si elle est trop voisine d'une source de lumière ou si elle est placée dans le Nether. + +Peut servir de décoration. + +Sert en alchimie ; sert aussi à localiser les forts. Produit par les Blazes qu'on trouve à proximité ou à l'intérieur des forteresses du Nether. + +Sert en alchimie. Produite par les Ghasts à leur mort. + +Produite par les Cochons zombies à leur mort. Les Cochons zombies se rencontrent dans le Nether. Sert d'ingrédient dans la préparation de potions. + +Sert en alchimie. Pousse dans les forteresses du Nether. Peut aussi être plantée dans du sable des âmes. + +Peut avoir divers effets selon ce sur quoi elle est utilisée. + +Peut être remplie d'eau et servir d'ingrédient de base d'une potion distillée dans l'alambic. + +Aliment vénéneux et ingrédient alchimique. Se trouve sur les cadavres d'araignées ou d'araignées bleues. + +Sert en alchimie ; intervient principalement dans la création de potions néfastes. + +Sert en alchimie et intervient dans la fabrication d'objets comme l'œil d'Ender ou la crème de magma. + +Sert en alchimie. + +Sert à la création de potions simples et volatiles. + +Rempli d'eau par la pluie ou à l'aide d'un seau d'eau. Sert aussi à remplir des fioles. + +Lancé, indique la direction d'un portail de l'Ender. Quand douze de ces yeux sont placés dans des cadres de portail de l'Ender, le portail de l'Ender s'ouvrira. + +Sert en alchimie. + +Comparable aux blocs d'herbe, mais très efficace pour faire pousser des champignons. + +Flotte sur l'eau et permet de marcher dessus. + +Sert à construire des forteresses du Nether. Invulnérable aux boules de feu des Ghasts. + +Sert dans les forteresses du Nether. + +Se trouve dans les forteresses du Nether et produit des verrues du Nether lorsqu'elle est brisée. + +Permet au joueur, moyennant ses points d'expérience, d'enchanter épées, pioches, haches, pelles, arcs et armures. + +S'active à l'aide de l'œil d'Ender et permet au joueur de voyager jusqu'à la dimension de l'Ender. + +Sert à créer un portail de l'Ender. + +Un type de bloc rencontré dans l'Ender. Elle est dotée d'une résistance très élevée aux explosions et constitue donc un matériau de construction très utile. + +Ce bloc est créé lorsque le Dragon de l'Ender est terrassé. + +Lancé, il produit des orbes d'expérience qui augmentent vos points d'expérience une fois ramassés. + +Utile pour enflammer des choses ou pour démarrer des incendies sans faire de distinction depuis un distributeur. + +Similaires à une vitrine, affichent les objets et blocs qui y sont placés. + +Lancez-le pour faire apparaître une créature du type indiqué. + +Sert à la création d'escaliers longs. Deux dalles placées l'une sur l'autre formeront une dalle double de taille normale. + +Sert à la création d'escaliers longs. Deux dalles placées l'une sur l'autre formeront une dalle double de taille normale. + +Créé en fusionnant du netherrack dans un fourneau. Peut être transformés en blocs de briques du Nether. + +Émettent de la lumière lors de leur activation. + +Leur récolte permet d'obtenir des fèves de cacao. + +Les crânes peuvent servir de décoration ou être portés comme masques dans l'emplacement pour le casque. + +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 + +Number Crunching and Statistics + +Bully Coordinator + +Original Design and Code by + +Project Manager/Producer + +Rest of Mojang Office + +Lead game programmer Minecraft PC + +Ninja Coder + +CEO + +White Collar Worker + +Customer Support + +Office DJ + +Designer/Programmer Minecraft - Pocket Edition + +Developer + +Chief Architect + +Art Developer + +Game Crafter + +Director of Fun + +Music and Sounds + +Programming + +Art + +QA + +Executive Producer + +Lead Producer + +Producer + +Test Lead + +Lead Tester + +Design Team + +Development Team + +Release Management + +Director, XBLA Publishing + +Business Development + +Portfolio Director + +Product Manager + +Marketing + + Community Manager + +Europe Localization Team + +Redmond Localization Team + +Asia Localization Team + +User Research Team + +MGS Central Teams + +Milestone Acceptance Tester + +Special Thanks + +Test Manager + +Senior Test Lead + +SDET + +Project STE + +Additional STE + +Test Associates + +Jon Kågström + +Tobias Möllstam + +Risë Lugo + +Épée en bois + +Épée en pierre + +Épée en fer + +Épée en diamant + +Épée en or + +Pelle en bois + +Pelle en pierre + +Pelle en fer + +Pelle en diamant + +Pelle en or + +Pioche en bois + +Pioche en pierre + +Pioche en fer + +Pioche en diamant + +Pioche en or + +Hache en bois + +Hache en pierre + +Hache en fer + +Hache en diamant + +Hache en or + +Houe en bois + +Houe en pierre + +Houe en fer + +Houe en diamant + +Houe en or + +Porte en bois + +Porte en fer + +Casque en mailles + +Plastron en mailles + +Jambières en mailles + +Bottes en mailles + +Coiffe en cuir + +Casque en fer + +Casque en diamant + +Casque en or + +Tunique de cuir + +Plastron en fer + +Plastron en diamant + +Plastron en or + +Pantalon en cuir + +Jambières en fer + +Jambières en diamant + +Jambières en or + +Bottes en cuir + +Bottes en fer + +Bottes en diamant + +Bottes en or + +Lingot de fer + +Lingot d'or + +Seau + +Seau d'eau + +Seau de lave + +Briquet à silex + +Pomme + +Arc + +Flèche + +Charbon + +Charbon de bois + +Diamant + +Bâton + +Bol + +Ragoût de champignons + +Fil + +Plume + +Poudre à canon + +Graines de blé + +Blé + +Pain + +Silex + +Viande de porc crue + +Viande de porc cuite + +Peinture + +Pomme dorée + +Panneau + +Chariot de mine + +Selle + +Redstone + +Boule de neige + +Bateau + +Cuir + +Seau de lait + +Brique + +Argile + +Canne à sucre + +Papier + +Livre + +Boule de slime + +Chariot de mine avec coffre + +Chariot de mine avec four + +Œuf + +Boussole + +Canne à pêche + +Montre + +Poudre glowstone + +Poisson cru + +Poisson cuit + +Poudre de colorant + +Poche d'encre + +Pétale de rose + +Vert de cactus + +Fèves de cacao + +Lapis-lazuli + +Colorant violet + +Colorant bleu cyan + +Colorant gris clair + +Colorant gris + +Colorant rose + +Colorant vert lime + +Pétale de pissenlit + +Colorant bleu ciel + +Colorant magenta + +Colorant orange + +Poudre d'os + +Os + +Sucre + +Gâteau + +Lit + +Répéteur de redstone + +Cookie + +Carte + +Carte vide + +Disque vinyle "13" + +Disque vinyle "cat" + +Disque vinyle "blocks" + +Disque vinyle "chirp" + +Disque vinyle "far" + +Disque vinyle "mall" + +Disque vinyle "mellohi" + +Disque vinyle "stal" + +Disque vinyle "strad" + +Disque vinyle "ward" + +Disque vinyle "11" + +Disque vinyle "where are we now" + +Cisailles + +Graines de citrouille + +Graines de pastèque + +Poulet cru + +Poulet cuit + +Bœuf cru + +Steak + +Chair putréfiée + +Ender Pearl + +Tranche de pastèque + +Bâton de feu + +Larme de Ghast + +Pépite d'or + +Verrue du Nether + +Potion{*splash*}{*prefix*} {*postfix*} + +Fiole + +Fiole d'eau + +Œil d'araignée + +Œil d'araignée fermenté + +Poudre de feu + +Crème de magma + +Alambic + +Chaudron + +Œil d'Ender + +Pastèque scintillante + +Fiole d'expérience + +Boule de feu + +Boule de feu (charbon de bois) + +Boule de feu (charbon) + +Cadre + +Fait apparaître {*CREATURE*} + +Brique du Nether + +Crâne + +Crâne de squelette + +Crâne de wither squelette + +Tête de zombie + +Crâne + +Crâne de %s + +Crâne de creeper + +É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 + +Terre + +Pierre taillée + +Planches en chêne + +Planches en sapin + +Planches en bouleau + +Planches de bois tropical + +Planches de bois (tout type) + +Pousse d'arbre + +Pousse de chêne + +Pousse d'épicéa + +Pousse de bouleau + +Pousse d'arbre tropical + +Adminium + +Eau + +Lave + +Sable + +Grès + +Gravier + +Minerai d'or + +Minerai de fer + +Minerai de charbon + +Bois + +Bois de chêne + +Bois d'épicéa + +Bois de bouleau + +Bois tropical + +Chêne + +Sapin + +Bouleau + +Feuillage + +Feuilles de chêne + +Feuilles d'épicéa + +Feuilles de bouleau + +Feuilles tropicales + +Éponge + +Verre + +Laine + +Laine noire + +Laine rouge + +Laine verte + +Laine marron + +Laine bleue + +Laine violette + +Laine bleu cyan + +Laine gris clair + +Laine grise + +Laine rose + +Laine vert lime + +Laine jaune + +Laine bleu ciel + +Laine magenta + +Laine orange + +Laine blanche + +Fleur + +Rose + +Champignon + +Bloc d'or + +Un moyen peu encombrant d'entreposer de l'or. + +Un moyen peu encombrant d'entreposer du fer. + +Bloc de fer + +Dalle de pierre + +Dalle de pierre + +Dalle de grès + +Dalle de chêne + +Dalle de pierre taillée + +Dalle en briques + +Dalle en briques de pierre + +Dalle de chêne + +Dalle de sapin + +Dalle de bouleau + +Dalle de bois tropical + +Dalles du Nether + +Briques + +TNT + +Bibliothèque + +Pierre moussue + +Obsidienne + +Torche + +Torche (charbon) + +Torche (charbon de bois) + +Feu + +Générateur de monstres + +Escalier en chêne + +Coffre + +Poudre de redstone + +Minerai de diamant + +Bloc de diamant + +Un moyen peu encombrant d'entreposer des diamants. + +Atelier + +Cultures + +Terre labourée + +Four + +Panneau + +Porte en bois + +Échelle + +Rail + +Rail de propulsion + +Rail de détection + +Escalier en pierre + +Levier + +Plaque de détection + +Porte en fer + +Minerai de redstone + +Torche de redstone + +Bouton + +Neige + +Glace + +Cactus + +Argile + +Canne à sucre + +Juke-box + +Barrière + +Citrouille + +Citrouille-lanterne + +Netherrack + +Sable des âmes + +Glowstone + +Portail + +Minerai de lapis-lazuli + +Bloc de lapis-lazuli + +Un moyen peu encombrant d'entreposer du Lapis-lazuli. + +Distributeur + +Bloc musical + +Gâteau + +Lit + +Toile + +Herbes hautes + +Arbuste mort + +Diode + +Coffre verrouillé + +Trappe + +Laine (toutes couleurs) + +Piston + +Piston collant + +Bloc de poisson d'argent + +Briques de pierre + +Pierres taillées moussues + +Pierres craquelées + +Blocs de pierre taillée + +Champignon + +Champignon + +Barreaux de fer + +Vitre + +Pastèque + +Queue de citrouille + +Queue de pastèque + +Lierre + +Portillon + +Escalier en briques + +Escalier en briques de pierre + +Pierre de poisson d'argent + +Pierre taillée de poisson d'argent + +Brique en pierre de poisson d'argent + +Mycélium + +Nénuphar + +Brique du Nether + +Barrière en brique du Nether + +Escaliers en brique du Nether + +Verrue du Nether + +Table d'enchantement + +Alambic + +Chaudron + +Portail de l'Ender + +Cadre de portail de l'Ender + +Pierre blanche + +Œuf de Dragon + +Arbuste + +Fougère + +Escaliers en grès + +Escaliers en sapin + +Escaliers en bouleau + +Escalier en bois tropical + +Lampe de redstone + +Cacao + +Crâne + +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. + +Se déplacer/Sprinter + +Regarder + +Pause + +Sauter + +Sauter/Voler Haut + +Inventaire + +Changer d'objet + +Action + +Utiliser + +Artisanat + +Lâcher + +Se faufiler + +Se faufiler/Voler Bas + +Changer mode caméra + +Joueurs/Invitation + +Déplacement (en vol) + +Config. 1 + +Config. 2 + +Config. 3 + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +{*B*}Appuyez sur{*CONTROLLER_VK_A*} pour continuer. + +{*B*}Appuyez sur{*CONTROLLER_VK_A*} pour commencer le didacticiel.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si vous pensez pouvoir vous en passer. + +Le principe de Minecraft consiste à placer des blocs pour construire tout ce qu'on peut imaginer. +La nuit, les monstres sont de sortie ; tâchez donc d'aménager un abri avant le coucher du soleil. + +Utilisez{*CONTROLLER_ACTION_LOOK*} pour regarder vers le haut, vers le bas et autour de vous. + +Utilisez{*CONTROLLER_ACTION_MOVE*} pour vous déplacer. + +Pour sprinter, orientez rapidement{*CONTROLLER_ACTION_MOVE*} deux fois vers l'avant. Tant que vous maintenez{*CONTROLLER_ACTION_MOVE*} vers l'avant, le personnage continuera de sprinter jusqu'à ce que sa durée de sprint soit écoulée ou que sa jauge de nourriture se vide. + +Appuyez sur{*CONTROLLER_ACTION_JUMP*} pour sauter. + +Maintenez{*CONTROLLER_ACTION_ACTION*} pour miner ou frapper à mains nues ou à l'aide d'un ustensile. Vous devrez parfois façonner des outils pour miner certains blocs. + +Maintenez{*CONTROLLER_ACTION_ACTION*} pour détruire 4 blocs de bois (troncs d'arbre).{*B*}Lorsqu'un bloc est détruit, tenez-vous à proximité de l'objet flottant apparu pour le ramasser : l'objet est alors déposé dans votre inventaire. + +Appuyez sur{*CONTROLLER_ACTION_CRAFTING*} pour ouvrir l'interface d'artisanat. + +Votre inventaire se remplira à mesure que vous prélèverez des ressources et confectionnerez des objets.{*B*} + Appuyez sur{*CONTROLLER_ACTION_INVENTORY*} pour ouvrir l'inventaire. + +À force de vous déplacer, de miner et d'attaquer, la barre de nourriture{*ICON_SHANK_01*} se vide progressivement. Sprinter et sauter après un sprint épuisent bien plus rapidement la barre de nourriture que la marche et les sauts classiques. + +Si vous perdez de la santé, mais que votre jauge de nourriture comporte au moins 9{*ICON_SHANK_01*}, votre santé se reconstituera automatiquement. Manger des aliments remplira votre barre de nourriture. + +Un aliment à la main, maintenez{*CONTROLLER_ACTION_USE*} pour le manger et remplir votre barre de nourriture. Vous ne pouvez pas manger si votre barre de nourriture est pleine. + +Votre barre de nourriture est presque vide et vous avez perdu de la santé. Mangez le steak qui apparaît dans votre inventaire pour remplir votre barre de nourriture et vous soigner.{*ICON*}364{*/ICON*} + +Le bois que vous avez recueilli peut être taillé en planches. Ouvrez l'interface d'artisanat pour en fabriquer.{*PlanksIcon*} + +La confection d'un certain nombre d'objets implique plusieurs étapes. Maintenant que vous avez des planches à disposition, l'éventail d'objets à fabriquer s'est enrichi. Créez un atelier.{*CraftingTableIcon*} + +Pour accélérer la collecte de ressources, vous pouvez fabriquer des outils dédiés à cette tâche. Certains outils possèdent un manche taillé dans un bâton. Fabriquez maintenant des bâtons.{*SticksIcon*} + +Utilisez{*CONTROLLER_ACTION_LEFT_SCROLL*} et{*CONTROLLER_ACTION_RIGHT_SCROLL*} pour sélectionner un autre objet à manier. + +Utilisez{*CONTROLLER_ACTION_USE*} pour vous servir d'objets, interagir avec les éléments du décor et placer vos créations. Travaillez les objets déjà placés avec un outil adapté pour les ramasser. + +L'atelier sélectionné, placez le réticule à l'emplacement voulu et utilisez{*CONTROLLER_ACTION_USE*} pour placer un atelier. + +Pointez le réticule sur l'atelier et appuyez sur{*CONTROLLER_ACTION_USE*} pour l'ouvrir. + +La pelle vous permet de creuser plus rapidement les matériaux meubles, comme la terre et la neige. À mesure que vous accumulerez des ressources, vous pourrez créer des outils plus efficaces et robustes. Créez une pelle en bois.{*WoodenShovelIcon*} + +La hache accélère le travail du bois et des blocs en bois. À mesure que vous accumulerez des ressources, vous pourrez créer des outils plus efficaces et robustes. Créez une hache en bois.{*WoodenHatchetIcon*} + +La pioche accélère le travail des matériaux solides, comme la pierre et le minerai. À mesure que vous accumulerez des ressources, vous pourrez créer des outils plus efficaces et robustes pour miner les matériaux les plus coriaces. Créez une pioche en bois.{*WoodenPickaxeIcon*} + +Ouvrir le conteneur + + + Évitez de vous laisser surprendre par la nuit. Vous pouvez confectionner des armes et armures, mais le plus sûr reste de vous aménager un abri. + + + + Un refuge de mineur se trouve à proximité : finissez de l'aménager pour passer la nuit à l'abri. + + + + Vous aurez besoin de ressources pour achever la construction du refuge. Vous pouvez utiliser n'importe quel type de bloc pour les murs et le toit, mais vous voudrez sans doute aménager une porte et des fenêtres, sans compter qu'il vous faudra un peu d'éclairage. + + +Utilisez votre pioche pour miner des blocs de pierre. Une fois minés, les blocs de pierre produiront de la pierre taillée. Récupérez 8 blocs de pierre taillée et vous pourrez construire un four. Vous risquez d'avoir à déblayer la terre avant de pouvoir attaquer la pierre. Justement, la pelle est faite pour ça !{*StoneIcon*} + +Vous avez désormais une quantité suffisante de pierres taillées pour fabriquer un four. Utilisez votre atelier pour le créer. + +Utilisez{*CONTROLLER_ACTION_USE*} pour placer le four dans l'environnement, puis ouvrez-le. + +Utilisez le four pour produire du charbon de bois. Le temps que la production aboutisse, profitez-en pour vous procurer les ressources nécessaires à vos travaux sur le refuge. + +Utilisez le four pour produire du verre. Le temps que la production aboutisse, profitez-en pour vous procurer les ressources nécessaires à vos travaux sur le refuge. + +Un refuge digne de ce nom sera pourvu d'une porte pour faciliter vos allées et venues. Faute de quoi, vous devrez percer à travers les murs pour entrer et sortir. Fabriquez une porte en bois.{*WoodenDoorIcon*} + +Utilisez{*CONTROLLER_ACTION_USE*} pour placer la porte et{*CONTROLLER_ACTION_USE*} pour l'ouvrir et la fermer. + +La nuit, l'obscurité est quasi totale. Pour y voir clair dans votre refuge, vous aurez besoin de lumière. Utilisez des bâtons et du charbon de bois pour créer une torche. Pour ce faire, commencez par ouvrir l'interface d'artisanat et fabriquez une torche.{*TorchIcon*} + + + Vous avez terminé la première partie du didacticiel. + + + + {*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour continuer le didacticiel.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si vous pensez pouvoir vous en passer. + + + + Voici votre inventaire. Il affiche les objets susceptibles d'être tenus en main ainsi que tous les autres objets que vous portez, armure comprise. + +{*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour continuer.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si vous savez déjà utiliser l'inventaire. + + + + Utilisez{*CONTROLLER_MENU_NAVIGATE*} pour déplacer le pointeur. Utilisez{*CONTROLLER_VK_A*} pour saisir l'objet placé sous le pointeur. + S'il s'agit de plusieurs objets, vous sélectionnerez toute la pile. Vous pouvez aussi utiliser{*CONTROLLER_VK_X*} pour n'en sélectionner que la moitié. + + + + Déplacez l'objet annexé au pointeur jusqu'à un autre emplacement de l'inventaire et déposez-le avec{*CONTROLLER_VK_A*}. + Si plusieurs objets sont annexés au pointeur, utilisez{*CONTROLLER_VK_A*} pour tous les déposer, ou{*CONTROLLER_VK_X*} pour n'en déposer qu'un seul. + + + + Si vous déplacez le pointeur à l'extérieur de l'interface alors qu'un objet lui est annexé, vous jetterez l'objet. + + + + Si vous voulez en savoir plus sur un objet, déplacez le pointeur sur l'objet en question et appuyez sur{*CONTROLLER_ACTION_MENU_PAGEDOWN*}. + + + + Appuyez sur{*CONTROLLER_VK_B*} pour quitter l'inventaire. + + + + L'inventaire du mode Créatif, où figurent les objets utilisables, ainsi que tous les objets à sélectionner. + + +{*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour continuer.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si vous savez déjà utiliser l'inventaire du mode Créatif. + + + + Utilisez{*CONTROLLER_MENU_NAVIGATE*} pour déplacer le pointeur. + Lorsque la liste des objets est affichée, utilisez{*CONTROLLER_VK_A*} pour saisir un objet sous le pointeur. Utilisez {*CONTROLLER_VK_Y*} pour en saisir toute une pile. + + + + Le pointeur se déplacera automatiquement sur un espace de la colonne d'utilisation. Vous pouvez le déplacer vers le bas avec{*CONTROLLER_VK_A*}. Une fois l'objet déplacé, le pointeur retournera à la liste d'objets, où vous pourrez sélectionner un autre article. + + + + Si vous déplacez le curseur à l'extérieur de l'interface alors qu'un objet lui est annexé, vous jetterez l'objet. Pour supprimer tous les objets de la barre de sélection rapide, appuyez sur{*CONTROLLER_VK_X*}. + + + + Parcourez les onglets de catégorie, en haut, à l'aide de{*CONTROLLER_VK_LB*} et{*CONTROLLER_VK_RB*} pour sélectionner la catégorie de l'objet que vous souhaitez saisir. + + + + Si vous voulez en savoir plus sur un objet, déplacez le pointeur sur l'objet en question et appuyez sur{*CONTROLLER_ACTION_MENU_PAGEDOWN*}. + + + + Appuyez sur{*CONTROLLER_VK_B*} pour quitter l'inventaire du mode Créatif. + + + + Vous êtes dans l'interface d'artisanat. Cette interface vous permet de combiner les ressources récoltées pour confectionner de nouveaux objets. + + +{*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour continuer.{*B*} + Appuyez sur {*CONTROLLER_VK_B*}si vous savez déjà utiliser l'interface d'artisanat. + + +{*B*} + Appuyez sur{*CONTROLLER_VK_X*} pour afficher la description de l'objet. + + +{*B*} + Appuyez sur{*CONTROLLER_VK_X*} pour afficher les ingrédients nécessaires à la confection de l'objet sélectionné. + + +{*B*} + Appuyez sur{*CONTROLLER_VK_X*} pour à nouveau afficher l'inventaire. + + + + Parcourez les onglets de catégorie, en haut, à l'aide de{*CONTROLLER_VK_LB*} et{*CONTROLLER_VK_RB*} pour sélectionner la catégorie d'objets que vous souhaitez confectionner puis utilisez{*CONTROLLER_MENU_NAVIGATE*} pour choisir l'article à créer. + + + + La grille d'artisanat indique quels objets sont nécessaires à la production du nouvel article. Appuyez sur{*CONTROLLER_VK_A*} pour confectionner l'objet et le placer dans votre inventaire. + + + + Vous pouvez utiliser un atelier pour confectionner des objets plus grands. L'artisanat sur atelier fonctionne de la même manière que l'artisanat classique, mais vous disposez d'une grille d'artisanat plus étendue pour combiner un plus vaste éventail d'ingrédients. + + + + Votre inventaire apparaît en bas à droite de l'interface d'artisanat. Cette zone peut également afficher la description de l'objet sélectionné ainsi que les ingrédients nécessaires à sa fabrication. + + + + La description de l'objet sélectionné est maintenant affichée. Elle vous indique pour quels usages l'objet est conçu. + + + + La liste des ingrédients nécessaires à la fabrication de l'objet sélectionné est maintenant affichée. + + +Le bois que vous avez coupé peut être transformé en planches. Sélectionnez l'icône en forme de planches et appuyez sur{*CONTROLLER_VK_A*} pour les produire.{*PlanksIcon*} + + + Maintenant que votre atelier est fabriqué, il vous reste à le placer dans l'environnement. Vous pourrez ensuite accéder à une gamme plus vaste d'objets à créer.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} pour quitter l'interface d'artisanat. + + + + Appuyez sur{*CONTROLLER_VK_LB*} et{*CONTROLLER_VK_RB*} pour accéder à la catégorie d'objets que vous souhaitez créer. Sélectionnez la catégorie Outils.{*ToolsIcon*} + + + + Appuyez sur{*CONTROLLER_VK_LB*} et{*CONTROLLER_VK_RB*} pour accéder à la catégorie d'objets que vous souhaitez créer. Sélectionnez la catégorie Structures.{*StructuresIcon*} + + + + Utilisez{*CONTROLLER_MENU_NAVIGATE*} pour sélectionner l'objet à créer. Certains objets présentent plusieurs variantes selon le type de matériau utilisé. Sélectionnez la pelle en bois.{*WoodenShovelIcon*} + + + + La confection d'un certain nombre d'objets implique plusieurs étapes. Maintenant que vous avez des planches à disposition, l'éventail d'objets à fabriquer s'est enrichi. Utilisez{*CONTROLLER_MENU_NAVIGATE*} pour sélectionner l'objet à créer. Sélectionnez l'atelier.{*CraftingTableIcon*} + + + + Vous êtes sur la bonne voie. Grâce aux outils que vous avez fabriqués, vous pourrez prélever diverses ressources plus efficacement.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} pour quitter l'interface d'artisanat. + + + + La fabrication de certains objets nécessite un four plutôt qu'un atelier. Fabriquez un four.{*FurnaceIcon*} + + + + Placez le four que vous avez créé dans l'environnement, à l'intérieur de votre refuge, de préférence.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} pour quitter l'interface d'artisanat. + + + + Vous êtes dans l'interface du four. Un four vous permet de fondre des objets pour les modifier. Par exemple, vous pouvez y déposer du minerai de fer pour fondre des lingots de fer. + + +{*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour continuer.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si vous savez déjà utiliser le four. + + + + Vous devrez alimenter le four en combustible (partie inférieure du four), et déposer l'objet à transformer dans la partie supérieure. Le four s'actionnera alors : l'objet produit apparaîtra dans l'emplacement de droite. + + + + La plupart des objets en bois peuvent servir de combustible. Au fil de vos aventures, vous découvrirez d'autres variétés de matériaux qui feront d'excellents combustibles. + + + + Une fois les objets fondus, vous pouvez les déplacer depuis la zone de production jusqu'à votre inventaire. Essayez divers ingrédients et observez les résultats. + + + + Si vous utilisez du bois en guise d'ingrédient, vous pouvez produire du charbon de bois. Alimentez le four en combustible et déposez le bois dans l'emplacement dédié. L'opération peut durer quelque temps ; profitez de ce délai pour vaquer à d'autres tâches et repassez régulièrement pour vérifier l'état d'avancement de la production. + + + + Le charbon de bois peut servir de combustible et se combiner à un bâton pour créer une torche. + + + + Placer du sable à l'emplacement dévolu aux ingrédients vous permet de fabriquer du verre. Créez des blocs de verre qui serviront de fenêtres dans votre refuge. + + + + Vous êtes dans l'interface d'alchimie. Cette interface vous permet de créer des potions aux effets variés. + + +{*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour continuer.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si vous savez déjà utiliser l'alambic. + + + + Pour distiller une potion, placez un ingrédient dans l'emplacement du haut, ainsi qu'une potion ou une fiole d'eau dans les emplacements du bas (vous pouvez créer jusqu'à 3 potions à la fois). Une fois qu'une combinaison correcte est choisie, le processus de distillation commence et la potion est créée au bout de quelques instants. + + + + La création d'une potion commence toujours avec une fiole d'eau. Pour créer la plupart des potions, il s'agit d'abord de confectionner une potion étrange à l'aide d'une verrue du Nether. Ensuite, il s'y ajoute au moins un autre ingrédient pour créer la potion finale. + + + + Une fois la potion créée, vous pouvez modifier ses effets. Ajoutez de la poudre de redstone pour allonger la durée d'effet ou de la poudre de glowstone pour en renforcer la puissance. + + + + Ajouter un œil d'araignée fermenté corrompt la potion et inverse l'effet initial. Ajouter de la poudre à canon transforme la potion en potion volatile qu'on peut lancer pour appliquer l'effet à toute la zone d'impact. + + + + Pour créer une potion de résistance au feu, commencez par ajouter une verrue du Nether à une fiole d'eau, puis incorporez de la crème de magma. + + + + Appuyez sur{*CONTROLLER_VK_B*} pour quitter l'interface d'alchimie. + + + + Dans cette zone se trouvent un alambic, un chaudron et un coffre rempli d'articles d'alchimie. + + +{*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur l'alchimie et les potions.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si l'alchimie et les potions n'ont déjà plus de secrets pour vous. + + + + Pour distiller une potion, il faut d'abord créer une fiole d'eau. Prenez une fiole dans le coffre. + + + + Vous pouvez remplir une fiole d'eau depuis un chaudron qui en contient, ou bien en prélever sur les blocs d'eau. Pointez le curseur sur une source d'eau et appuyez sur{*CONTROLLER_ACTION_USE*} pour remplir votre fiole. + + + + Si un chaudron se vide, vous pouvez le remplir à l'aide d'un seau d'eau. + + + + Utilisez l'alambic pour créer une potion de résistance au feu. Vous aurez besoin d'une fiole d'eau, d'une verrue du Nether et de crème de magma. + + + + Une potion à la main, maintenez{*CONTROLLER_ACTION_USE*} pour l'utiliser. Dans le cas d'une potion normale, il suffit de la boire pour bénéficier de ses effets. Quant aux potions volatiles, lancez-les pour appliquer leurs effets aux créatures proches de la zone d'impact. + Mélangez de la poudre à canon aux potions normales pour créer des potions volatiles. + + + + Utilisez votre potion de résistance au feu sur vous-même. + + + + Maintenant que vous résistez au feu et à la lave, peut-être pourrez-vous rejoindre des lieux jusque-là inaccessibles. + + + + Vous êtes dans l'interface d'enchantement qui vous permet d'appliquer des enchantements aux armes et armures, ainsi qu'à certains outils. + + +{*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur l'interface d'enchantement.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si l'interface d'enchantement n'a déjà plus de secrets pour vous. + + + + Pour enchanter un objet, commencez par le placer dans l'emplacement d'enchantement. Les armes et armures, ainsi que certains outils, peuvent être enchantés pour leur appliquer certains effets spéciaux, comme renforcer la résistance aux dégâts ou augmenter le nombre de ressources produites lorsque vous minez un bloc. + + + + Lorsqu'un objet est disposé dans l'emplacement d'enchantement, les boutons sur la droite afficheront un éventail d'enchantements aléatoires. + + + + Le chiffre qui figure sur le bouton indique le coût d'enchantement de l'objet, exprimé en niveaux d'expérience. Si votre niveau est insuffisant, le bouton sera désactivé. + + + + Sélectionnez un enchantement et appuyez sur{*CONTROLLER_VK_A*} pour enchanter l'objet. Le coût de l'enchantement sera déduit de votre niveau d'expérience. + + + + Les enchantements sont tous aléatoires, mais les meilleurs d'entre eux ne seront disponibles qu'à haut niveau d'expérience et nécessiteront de très nombreuses bibliothèques disposées autour de la table d'enchantement pour en augmenter la puissance. + + + + Dans cette zone, vous trouverez une table d'enchantement ainsi que plusieurs objets qui vous aideront à vous familiariser avec l'enchantement. + + +{*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur l'enchantement.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si vous savez déjà tout ce qu'il y a à savoir sur l'enchantement. + + + + L'utilisation d'une table d'enchantement vous permet d'appliquer aux objets certains effets spéciaux, comme renforcer la résistance aux dégâts ou augmenter le nombre de ressources produites lorsque vous minez un bloc. + + + + Placer des bibliothèques autour de la table d'enchantement augmente sa puissance et permet d'accéder aux niveaux d'enchantement supérieurs. + + + + L'enchantement d'objets coûte des niveaux d'expérience qu'on obtient au moyen d'orbes d'expérience. Pour obtenir ces orbes, tuez des monstres et animaux, prélevez du minerai, élevez des animaux, pêchez ou fondez/cuisinez certains objets dans un four. + + + + Vous pouvez aussi engranger de l'expérience à l'aide d'une fiole d'expérience. Lorsque vous la lancez, elle crée un orbe d'expérience à l'endroit où elle tombe, que vous n'avez plus qu'à ramasser. + + + + Dans les coffres de cette zone, vous trouverez certains objets enchantés, des fioles d'expérience ainsi que certains objets qui restent à enchanter sur la table d'enchantement. + + + + Vous êtes à bord d'un chariot de mine. Pour descendre, pointez le curseur sur le chariot et appuyez sur{*CONTROLLER_ACTION_USE*}.{*MinecartIcon*} + + +{*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur les chariots de mine.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si les chariots de mine n'ont déjà plus de secrets pour vous. + + + + Le chariot de mine circule sur des rails. Vous pouvez fabriquer des chariots motorisés et des chariots de transport. + {*RailIcon*} + + + + Vous pouvez aussi aménager des rails de propulsion ; alimentés par les torches et circuits de redstone, ils augmentent la vitesse du chariot. Ces rails peuvent être associés à des interrupteurs, leviers et plaques de détection pour mettre en œuvre des systèmes complexes. + {*PoweredRailIcon*} + + + + Vous naviguez à bord d'un bateau. Pour descendre, pointez le curseur sur le bateau et appuyez sur{*CONTROLLER_ACTION_USE*}.{*BoatIcon*} + + + + {*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur les bateaux.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si vous savez déjà tout ce qu'il faut savoir sur les bateaux. + + + + Le bateau vous permet de circuler plus rapidement sur l'eau. Vous pouvez le diriger à l'aide de{*CONTROLLER_ACTION_MOVE*} et{*CONTROLLER_ACTION_LOOK*}. + {*BoatIcon*} + + + + Vous maniez une canne à pêche. Appuyez{*CONTROLLER_ACTION_USE*} pour l'utiliser.{*FishingRodIcon*} + + + + {*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur la pêche.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si vous savez déjà tout ce qu'il faut savoir sur la pêche. + + + + Appuyez sur{*CONTROLLER_ACTION_USE*} pour lancer la ligne et commencer à pêcher. Appuyez à nouveau sur{*CONTROLLER_ACTION_USE*} pour relever la ligne. + {*FishingRodIcon*} + + + + Si vous attendez que le flotteur plonge sous l'eau avant de relever la ligne, vous pourrez attraper un poisson. Mangé cru ou cuit au four, le poisson restitue de la santé. + {*FishIcon*} + + + + Comme de nombreux outils, la canne à pêche a un nombre d'utilisations limité, mais elle n'a pas pour seule vocation d'attraper du poisson. Testez par vous-même et observez quels autres objets ou créatures elle est capable d'actionner ou de capturer... + {*FishingRodIcon*} + + + + C'est un lit. La nuit, pointez le curseur sur le lit et appuyez sur{*CONTROLLER_ACTION_USE*} pour dormir jusqu'au matin.{*ICON*}355{*/ICON*} + + + + {*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur les lits.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si vous savez déjà tout ce qu'il faut savoir sur les lits. + + + + Placez votre lit dans un lieu sûr et bien éclairé pour éviter que les monstres ne vous tirent du sommeil au beau milieu de la nuit. Si vous avez déjà utilisé un lit, vous réapparaîtrez à son emplacement si vous mourez. + {*ICON*}355{*/ICON*} + + + + Si votre partie compte d'autres joueurs, tous devront être au lit au même moment avant de pouvoir dormir. + {*ICON*}355{*/ICON*} + + + + Dans cette zone, vous trouverez des circuits de redstone avec piston, ainsi qu'un coffre qui renferme les objets nécessaires pour développer ces circuits. + + + + {*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur les circuits de redstone et les pistons.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si vous savez déjà tout ce qu'il y a à savoir sur les circuits de redstone et les pistons. + + + + Les leviers, boutons, plaques de détection et torches de redstone permettent d'alimenter les circuits. Pour ce faire, reliez-les directement à l'objet que vous souhaitez activer, ou bien connectez-les moyennant de la poudre de redstone. + + + + La position et l'orientation d'une source d'alimentation peuvent modifier l'effet qu'elle exerce sur les blocs voisins. Par exemple, une torche de redstone placée sur le côté d'un bloc peut être désactivée si le bloc en question est raccordé à une autre source d'alimentation. + + + + Pour obtenir de la poudre de redstone, creusez du minerai de redstone avec une pioche en fer, en diamant ou en or. Elle permet de conduire le courant sur une longueur maximale de 15 blocs et sur une hauteur d'1 bloc. + {*ICON*}331{*/ICON*} + + + + Les répéteurs de redstone permettent de prolonger la distance de conduction du courant, ou de retarder les signaux de redstone. + {*ICON*}356{*/ICON*} + + + + Une fois alimenté, le piston s'allonge et pousse jusqu'à 12 blocs. Lorsqu'il se rétracte, le piston collant rabat sur lui un bloc (tous types de blocs confondus, ou presque). + {*ICON*}33{*/ICON*} + + + + Le coffre de cette zone renferme les composants nécessaires à la fabrication de circuits avec pistons. Essayez d'utiliser ou de développer les circuits de cette zone, ou bien d'assembler votre propre circuit. Vous trouverez d'autres exemples de ces circuits en dehors de la zone didacticielle. + + + + Un portail vers le Nether se trouve dans cette zone ! + + + + {*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur les portails et le Nether.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si vous savez déjà tout ce qu'il y a à savoir sur les portails et le Nether. + + + + Pour créer un portail, placez des blocs d'obsidienne dans un cadre large de quatre blocs et haut de cinq. Les blocs d'angle n'ont qu'une fonction esthétique. + + + + Pour activer un portail du Nether, embrasez les blocs contenus dans le cadre à l'aide d'un briquet à silex. Les portails se désactivent si leur cadre est brisé, si une explosion se produit à proximité ou si un liquide les franchit. + + + + Pour emprunter un portail du Nether, tenez-vous à l'intérieur du cadre. L'écran deviendra violet et un son sera déclenché. Au bout de quelques secondes, vous serez propulsé dans une autre dimension. + + + + Le Nether est un lieu de tous les dangers, inondé de lave, mais c'est le seul endroit où prélever du Netherrack, un matériau qui brûle indéfiniment une fois qu'il est enflammé, et de la glowstone, qui produit de la lumière. + + + + Vous pouvez emprunter le Nether pour voyager rapidement à la Surface : parcourir un bloc de distance dans le Nether équivaut à voyager sur trois blocs de la Surface. + + + + Vous êtes désormais en mode Créatif. + + + + {*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur le mode Créatif.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si vous n'avez plus rien à apprendre sur ce mode. + + +En mode Créatif, vous disposez d'un nombre infini d'objets et de blocs, vous pouvez détruire des blocs d'un seul clic sans utiliser d'outil, vous êtes invulnérable et vous pouvez voler. + +Appuyez deux fois rapidement sur{*CONTROLLER_ACTION_JUMP*} pour voler. Pour ne plus voler, répétez l'opération. Pour voler plus vite, orientez rapidement{*CONTROLLER_ACTION_MOVE*} deux fois vers l'avant en cours de vol. +En mode Vol, maintenez{*CONTROLLER_ACTION_JUMP*} pour monter et{*CONTROLLER_ACTION_SNEAK*} pour descendre, ou bien utilisez le BMD pour monter/descendre et virer à gauche et à droite. + +Appuyez sur{*CONTROLLER_ACTION_CRAFTING*} pour ouvrir l'interface d'inventaire du mode Créatif. + +Rejoignez l'autre extrémité de ce trou pour continuer. + +Vous êtes arrivé à la fin du didacticiel du mode Créatif. + + + Une ferme a été aménagée dans cette zone. La culture vous permet de créer une source renouvelable de nourriture et d'autres objets. + + + + {*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur la culture.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si vous n'avez plus rien à apprendre sur la question. + + +Le blé, les citrouilles et les pastèques sont créés à partir de graines. Exploitez des herbes hautes ou moissonnez du blé pour recueillir des graines de blé. Les graines de citrouille et de pastèque s'obtiennent respectivement sur les citrouilles et les pastèques. + +Avant de planter les graines, les blocs de terre doivent être transformés en terre labourée à l'aide d'une houe. Une source d'eau voisine permettra d'irriguer la terre labourée. Les cultures pousseront d'autant plus vite si elles sont abondamment irriguées et exposées à la lumière. + +Le blé passe par plusieurs stades de croissance. Il est prêt à la moisson lorsque son aspect s'assombrit.{*ICON*}59:7{*/ICON*} + +Les citrouilles et les pastèques nécessitent de laisser vacant un bloc adjacent pour accueillir le fruit une fois le plant arrivé à maturité. + +La canne à sucre doit être plantée dans un bloc d'herbe, de terre ou de sable adjacent à un bloc d'eau. Détruire un bloc de canne à sucre vous permet de récolter tous les blocs qui lui sont superposés.{*ICON*}83{*/ICON*} + +Les cactus doivent être plantés dans le sable et pousseront jusqu'à atteindre trois blocs de hauteur. Tout comme pour le sucre de canne, détruire le bloc inférieur vous permettra de récolter les blocs qui lui sont superposés.{*ICON*}81{*/ICON*} + +Les champignons doivent être plantés dans des zones faiblement éclairées et se propageront aux blocs adjacents peu exposés à la lumière.{*ICON*}39{*/ICON*} + +Vous pouvez utiliser de la poudre d'os pour accélérer l'arrivée à maturité de vos cultures, ou pour transformer vos champignons en champignons géants.{*ICON*}351:15{*/ICON*} + +Le didacticiel consacré aux cultures est maintenant terminé. + + + Des animaux ont été placés en enclos dans cette zone. Vous pouvez élever des animaux pour en faire apparaître des versions miniatures. + + + + {*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur les animaux et l'élevage.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si les animaux et l'élevage n'ont déjà plus de secrets pour vous. + + +Pour faire en sorte que les animaux se reproduisent, vous devez leur donner à manger la nourriture appropriée ; ils basculeront alors en mode « Romance ». + +Donnez du blé aux vaches, Champimeuh et moutons, des carottes aux cochons, des graines de blé ou des verrues du Nether aux poulets et n'importe quelle variété de viande aux loups : ils chercheront alors un autre animal de leur espèce, lui aussi disposé à se reproduire. + +Lorsque deux animaux d'une même espèce se rencontrent, et pourvu qu'ils soient tous les deux en mode Romance, ils s'embrassent quelques secondes, et un bébé apparaît. Le jeune animal suivra ses parents quelque temps avant de devenir adulte. + +Une fois qu'un animal est passé en mode Romance, il faut patienter cinq minutes environ pour qu'il soit à nouveau apte. + +Certains animaux vous suivront si vous tenez leur nourriture dans la main. Il vous sera alors plus facile de réunir des animaux pour qu'ils se reproduisent.{*ICON*}296{*/ICON*} + + + Il est possible d'apprivoiser les loups sauvages en leur donnant des os. Des cœurs apparaissent alors autour d'eux pour symboliser leur état. Les loups apprivoisés suivent le joueur et le défendent s'ils n'ont pas reçu l'ordre de s'asseoir. + + +Le didacticiel consacré aux animaux et à l'élevage est maintenant terminé. + + + Cette zone comporte des citrouilles et des blocs pour créer un golem de neige et un golem de fer. + + + + {*B*} + Appuyez sur {*CONTROLLER_VK_A*} pour en savoir plus sur les golems.{*B*} + Appuyez sur {*CONTROLLER_VK_B*} si vous savez déjà ce que sont les golems. + + +Les golems sont créés en plaçant une citrouille sur une pile de blocs. + +Les golems de neige sont créés en empilant de blocs de neige puis une citrouille. Les golems de neige lancent des boules de neige à vos ennemis. + +Les golems de fer sont créés à partir de quatre blocs de fer selon un certain modèle, avec une citrouille au-dessus du bloc central. Les golems de fer attaquent vos ennemis. + +Les golems de fer apparaissent naturellement pour protéger les villages. Ils vous attaqueront si vous attaquez les villageois. + +Vous devez poursuivre jusqu'à la fin de ce didacticiel avant de quitter cette zone. + +Certains outils conviennent mieux que d'autres au travail de ressources spécifiques. Par exemple, utilisez plutôt une pelle pour creuser les matériaux meubles comme la terre et le sable. + +Certains outils conviennent mieux que d'autres au travail de ressources spécifiques. Utilisez une hache pour couper les troncs d'arbre. + +Certains outils conviennent mieux que d'autres au travail de ressources spécifiques. Utilisez une pioche pour creuser le minerai et la pierre. Vous devrez sûrement confectionner une pioche dans des matériaux de meilleure qualité pour exploiter certains blocs. + +Certains outils sont plus efficaces que d'autres pour attaquer des ennemis. Pour attaquer, songez à vous équiper d'une épée. + +Maintenez {*CONTROLLER_ACTION_ACTION*}pour miner ou frapper à mains nues ou à l'aide d'un ustensile. Vous devrez parfois façonner des outils pour miner certains blocs. + +L'outil que vous maniez est endommagé. Chaque fois que vous utilisez un outil, son état se dégrade, jusqu'à se briser. Dans l'inventaire, la jauge colorée située sous l'objet illustre son niveau d'intégrité. + +Maintenez{*CONTROLLER_ACTION_JUMP*} pour nager vers le haut. + +Dans cette zone, un chariot de mine est placé sur des rails. Pour monter à bord, pointez le curseur sur le chariot et appuyez sur{*CONTROLLER_ACTION_USE*}. Utilisez{*CONTROLLER_ACTION_USE*} sur le bouton pour déplacer le chariot. + +Le coffre sur la rive contient un bateau. Pour l'utiliser, pointez le curseur sur l'eau et appuyez sur{*CONTROLLER_ACTION_USE*}. Pour embarquer, pointez le curseur sur le bateau et appuyez sur{*CONTROLLER_ACTION_USE*}. + +Vous trouverez une canne à pêche dans le coffre situé près de l'étang. Prenez-la et sélectionnez-la pour la tenir en main. + +Ce mécanisme à piston, plus complexe, crée un pont capable de s'auto-réparer ! Appuyez sur le bouton pour l'activer puis tâchez de comprendre comment les composants interagissent. + +Si vous déplacez le pointeur hors des limites de l'interface alors qu'un objet lui est annexé, vous pouvez jeter cet objet. + +Vous ne disposez pas des ingrédients nécessaires pour confectionner cet objet. Le champ situé en bas à gauche de l'écran répertorie les ingrédients requis pour cette tâche d'artisanat. + + + Félicitations, vous êtes arrivé à la fin de ce didacticiel. Désormais, le temps s'écoule normalement dans le jeu et la nuit ne va pas tarder à tomber avec son cortège de monstres ! Terminez votre refuge ! + + +{*EXIT_PICTURE*} Dès que vous serez prêt à explorer plus avant, un escalier, près du refuge de mineur, donne sur un petit château. + +Rappel : + +]]> + +De nouvelles fonctionnalités ont été ajoutées à la dernière version du jeu, dont de nouvelles zones dans le monde didacticiel. + +{*B*}Appuyez sur{*CONTROLLER_VK_A*} pour parcourir normalement le didacticiel.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} pour passer le didacticiel principal. + +Ici, vous trouverez des zones déjà configurées qui vous en apprendront davantage sur la pêche, les bateaux, les pistons et la redstone. + +À l'extérieur de cette zone, vous trouverez des exemples de bâtiments, de terres labourées, de chariots de mine et de rails, ainsi que des tables d'enchantement, des alambics, des partenaires commerciaux, des enclumes... et bien plus encore ! + + + Votre barre de nourriture est à un niveau où votre santé ne se régénère plus. + + + + {*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur la barre de nourriture et les aliments.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si vous savez déjà tout ce qu'il y a à savoir sur la barre de nourriture et les aliments. + + + + 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 + +Retour + +Quitter + +Annuler + +Annuler connexion + +Sélectionner un périphérique + +Changer périph. + +Actualiser jeux + +Party Games + +Tous les jeux + +Changer catégorie + +Inventaire + +Description + +Ingrédients + +Artisanat + +Créer + +Prendre/Placer + +Prendre + +Prendre tout + +Prendre la moitié + +Placer + +Placer tout + +Placer un + +Lâcher + +Jeter tout + +Jeter un + +Permuter + +Dépl. rapide + +Vider la barre de sélection rapide + +? + +Partager sur Facebook + +Changer de filtre + +Carte du joueur + +Voir profil du joueur + +Envoyer requête d'ami + +Page Bas + +Page Haut + +Suivant + +Précédent + +Exclure joueur + +Teindre + +Miner + +Nourrir + +Apprivoiser + +Soigner + +Assis + +Suis-moi + +Éjecter + +Vider + +Seller + +Placer + +Frapper + +Traire + +Prélever + +Manger + +Dormir + +Se réveiller + +Jouer + +Monter + +Naviguer + +Faire pousser + +Nager (haut) + +Ouvrir + +Changer hauteur + +Exploser + +Lire + +Suspendre + +Lancer + +Planter + +Faucher + +Récolter + +Continuer + +Déverrouiller le jeu complet + +Supp. sauvegarde + +Supprimer + +Options + +Inviter Groupe d'amis Xbox Live + +Inviter des amis + +Accepter + +Tondre + +Exclure le niveau + +Sélectionner skin + +Allumer + +Naviguer + +Installer la version complète + +Installer la version d'évaluation + +Installer + +Réinstaller + +Enregistrer options + +Exécuter ordre + +Créatif + +Déplacer ingrédient + +Déplacer combustible + +Outil Déplacement + +Déplacer l'armure + +Déplacer l'arme + +Équiper + +Bander + +Lâcher + +Privilèges + +Bloc + +Page Haut + +Page Bas + +Mode Romance + +Boire + +Faire pivoter + +Masquer + +Charger la sauvegarde pour Xbox One + +Libérer tous les emplacements + +Charger la sauvegarde pour Xbox One + +Monter + +Descendre + +Associer un coffre + +Lancer + +Tenir en laisse + +Lâcher + +Fixer + +Nom + +O.K. + +Annuler + +Magasin Minecraft + +Voulez-vous vraiment quitter la partie en cours et rejoindre la nouvelle ? Toute progression non sauvegardée sera perdue. + +Quitter le jeu + +Sauvegarder la partie + +Quitter sans sauvegarder + +Voulez-vous vraiment supprimer toute sauvegarde préalable pour ce monde et la remplacer par la version actuelle de ce monde ? + +Voulez-vous vraiment quitter sans sauvegarder ? Vous perdrez toute progression dans ce monde ! + +Commencer la partie + +Si vous créez, chargez ou sauvegardez un monde en mode Créatif, les mises à jour des succès et des classements seront désactivées pour ce monde, même s'il est ensuite chargé en mode Survie. Voulez-vous vraiment continuer ? + +Ce monde a déjà été sauvegardé en mode Créatif : les mises à jour des succès et des classements seront désactivées. Voulez-vous vraiment continuer ? + +Ce monde a déjà été sauvegardé en mode Créatif : les mises à jour des succès et du classement seront désactivées. + +Si vous créez, chargez ou sauvegardez un monde avec des privilèges d'hôte, les mises à jour des succès et des classements seront désactivées pour ce monde, même s'il est ensuite chargé avec ces options désactivées. Voulez-vous vraiment continuer ? + +Sauv. endommagée + +Cette sauvegarde semble corrompue ou endommagée. La supprimer ? + +Voulez-vous vraiment retourner au menu principal et déconnecter tous les joueurs de la partie ? Toute progression non sauvegardée sera perdue. + +Quitter et sauvegarder + +Quitter sans sauvegarder + +Voulez-vous vraiment retourner au menu principal ? Toute progression non sauvegardée sera perdue. + +Voulez-vous vraiment retourner au menu principal ? Votre progression sera perdue ! + +Créer un monde + +Lancer le didacticiel + +Didacticiel + +Nommer votre monde + +Saisir le nom de votre monde + +Saisir une graine pour la génération de votre monde + +Charger monde sauvegardé + +Appuyez sur START pour rejoindre la partie + +Sortie du jeu + +Une erreur s'est produite. Retour au menu principal. + +Échec de la connexion + +Connexion perdue + +La connexion au serveur a été interrompue. Retour au menu principal. + +La connexion à Xbox Live a été interrompue. Retour au menu principal. + +La connexion à Xbox Live a été interrompue. + +Déconnexion par le serveur + +Vous avez été exclu de la partie + +Vous avez été exclu de la partie. Motif : vol. + +Expiration du délai de connexion + +Le serveur est au complet. + +L'hôte a quitté la partie. + +Vous ne pouvez pas rejoindre cette partie, car vous n'êtes l'ami d'aucun des joueurs présents. + +Vous ne pouvez pas rejoindre cette partie car l'hôte vous en a déjà exclu. + +Vous ne pouvez pas rejoindre cette partie car le joueur avec qui vous essayez de jouer utilise une version antérieure du jeu. + +Vous ne pouvez pas rejoindre cette partie car le joueur avec qui vous essayez de jouer utilise une version supérieure du jeu. + +Nouveau monde + +Récompense déverrouillée ! + +Hourra, vous avez reçu une image de joueur représentant Steve de Minecraft ! + +Hourra, vous avez reçu une image de joueur représentant un creeper ! + +Hourra, vous avez reçu une récompense pour avatar : un T-shirt Minecraft: Xbox 360 Edition ! +Accédez à l'Interface pour en habiller votre avatar. + +Hourra, vous avez reçu une récompense pour avatar : une montre Minecraft: Xbox 360 Edition ! +Accédez à l'Interface pour la mettre au poignet de votre avatar. + +Hourra, vous avez reçu une récompense pour avatar : une casquette de base-ball Creeper ! +Accédez à l'Interface pour en coiffer votre avatar. + +Hourra, vous avez reçu le thème Minecraft: Xbox 360 Edition ! +Accédez à l'Interface pour sélectionner ce thème. + +Déverrouiller le jeu complet + +Vous jouez à la version d'évaluation. Vous devrez vous procurer le jeu complet pour sauvegarder votre partie. +Déverrouiller le jeu complet ? + +Vous jouez à la version d'évaluation de Minecraft: Xbox 360 Edition. Si vous possédiez le jeu complet, vous auriez déjà remporté un succès ! +Voulez-vous déverrouiller le jeu complet ? + +Vous jouez à la version d'évaluation de Minecraft: Xbox 360 Edition. Si vous possédiez le jeu complet, vous auriez déjà remporté une récompense pour avatar ! +Voulez-vous déverrouiller le jeu complet ? + +Vous jouez à la version d'évaluation de Minecraft: Xbox 360 Edition. Si vous possédiez le jeu complet, vous auriez déjà remporté une image de joueur ! +Voulez-vous déverrouiller le jeu complet ? + +Vous jouez à la version d'évaluation de Minecraft: Xbox 360 Edition. Si vous possédiez le jeu complet, vous auriez déjà remporté un thème ! +Voulez-vous déverrouiller le jeu complet ? + +Vous jouez à la version d'évaluation de Minecraft: Xbox 360 Edition. Vous devez disposer du jeu complet pour accepter cette invitation. +Voulez-vous déverrouiller le jeu complet ? + +Les joueurs invités ne peuvent pas déverrouiller le jeu complet. Veuillez vous connecter à un profil de joueur Xbox Live. + +Veuillez patienter + +Aucun résultat + +Filtre : + +Amis + +Mon score + +Général + +Entrées : + +Rang + +Gamertag + +Sauvegarde du niveau en préparation + +Préparation des tronçons... + +Finalisation... + +Aménagement du terrain + +Brève simulation du monde + +Initialisation du serveur + +Génération de la zone d'apparition + +Chargement de la zone d'apparition + +Entrée dans le Nether + +Sortie du Nether + +Réapparition + +Génération du niveau + +Chargement du niveau + +Sauvegarde des joueurs + +Connexion à l'hôte + +Téléchargement du terrain + +Passage en mode hors ligne + +Veuillez patienter pendant que l'hôte sauvegarde la partie + +Entrée dans l'ENDER + +Sortie de l'ENDER + +Recherche de graines pour le générateur de monde + +Ce lit est occupé + +Vous ne pouvez dormir que la nuit + +%s dort dans un lit. Pour vous réveiller directement à l'aube, tous les joueurs doivent dormir dans leur lit au même moment. + +Le lit de votre refuge est absent ou inaccessible + +Vous ne pouvez pas vous reposer : des monstres rôdent dans les parages + +Vous dormez dans un lit. Pour vous réveiller directement à l'aube, tous les joueurs doivent dormir dans leur lit au même moment. + +Outils et armes + +Armes + +Nourriture + +Structures + +Armures + +Mécanismes + +Transports + +Décorations + +Construction de blocs + +Redstone et transport + +Divers + +Alchimie + +Alchimie + +Outils, armes et armures + +Matériaux + +Déconnexion + +Votre profil de joueur a été déconnecté : retour à l'écran titre + +Difficulté + +Musique + +Son + +Gamma + +Sensibilité jeu + +Sensibilité interface + +Pacifique + +Facile + +Normal + +Difficile + +Dans ce mode, la santé du joueur se régénère au fil du temps et aucun ennemi ne rôde dans les parages. + +Dans ce mode, des ennemis apparaissent dans l'environnement mais infligent moins de dégâts qu'en mode Normal. + +Dans ce mode, des ennemis apparaissent dans l'environnement et infligent des dégâts normaux. + +Dans ce mode, des ennemis apparaissent dans l'environnement et infligent des dégâts considérables. Méfiez-vous des creepers : même si vous prenez vos distances, ils ne renonceront pas à vous attaquer ! + +Expiration de la version d'évaluation + +La durée impartie de la version d'évaluation de Minecraft: Xbox 360 Edition est écoulée ! Pour continuer à en profiter, voulez-vous déverrouiller le jeu complet ? + +Partie au complet + +Impossible de rejoindre la partie : aucune place vacante + +Saisir un message sur le panneau + +Saisir une ligne de texte à inscrire sur votre panneau + +Saisir un titre + +Saisir le titre de votre message + +Saisir un sous-titre + +Saisir le sous-titre de votre message + +Saisir une description + +Saisir la description de votre message + +Inventaire + +Ingrédients + +Alambic + +Coffre + +Enchantement + +Four + +Ingrédient + +Combustible + +Distributeur + +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. + +%s a quitté la partie. + +%s s'est fait exclure de la partie. + +Voulez-vous vraiment supprimer cette sauvegarde ? + +Attente d'accord + +Censuré + +En jeu : + +Réinitialiser paramètres + +Voulez-vous vraiment rétablir les paramètres par défaut ? + +Échec du chargement + +Le chargement de Minecraft: Xbox 360 Edition a échoué : impossible de continuer. + +Jeu de %s + +Partie d'un hôte inconnu + +Invité déconnecté + +Un joueur invité s'est déconnecté : tous les joueurs invités ont été exclus de la partie. + +Se connecter + +Vous n'êtes pas connecté. Pour jouer, vous devez d'abord vous connecter. Vous connecter ? + +Multijoueur non autorisé + +Impossible de rejoindre la partie : l'un des joueurs au moins n'est pas autorisé à jouer en multijoueur sur Xbox Live. + +Impossible de créer une partie en ligne : l'un des joueurs au moins n'est pas autorisé à jouer en multijoueur sur Xbox Live. Décochez la case Jeu en ligne pour commencer une partie hors ligne. + +Vous n'êtes pas autorisé à rejoindre cette session de jeu : vos privilèges d'accès au contenu sont trop restrictifs. Si vous souhaitez rejoindre cette session, modifiez ces paramètres dans la section Confidentialité et connexion Xbox 360 de l'Interface Xbox. + +Vous n'êtes pas autorisé à rejoindre cette session de jeu : les privilèges d'accès au contenu d'un de vos joueurs locaux sont trop restrictifs. + +Vous n'êtes pas autorisé à rejoindre cette session de jeu : les privilèges d'accès au contenu d'un des joueurs de la session sont réglés sur Amis uniquement et vous ne figurez pas sur sa liste d'amis. + +Impossible de créer la partie + +Vous n'êtes pas autorisé à créer cette session de jeu : les privilèges d'accès au contenu d'un des joueurs locaux sont trop restrictifs. Décochez la case Jeu en ligne pour commencer une partie hors ligne. Vous pouvez aussi modifier ces paramètres dans la section Confidentialité et connexion Xbox 360 de l'Interface Xbox. + +Sélection auto + +Non pack : skins stand. + +Skins préférées + +Niveau exclu + +La partie que vous tentez de rejoindre figure dans votre liste de niveaux exclus. +Si vous choisissez de rejoindre cette partie, le niveau sera retiré de votre liste de niveaux exclus. + +Exclure ce niveau ? + +Voulez-vous vraiment ajouter ce niveau à votre liste de niveaux exclus ? +Si vous sélectionnez O.K., vous quitterez cette partie. + +Retirer de la liste d'exclusion + +Intervalle de sauvegarde auto + +Intervalle de sauvegarde auto : NON + +min + +Placement impossible à cet endroit ! + +Pour éviter la mort instantanée dès l'apparition des joueurs, il n'est pas autorisé de placer de la lave aussi près du point d'apparition du niveau. + +Le jeu comporte une fonction de sauvegarde automatique du niveau. Quand l'icône ci-dessus apparaît, le jeu sauvegarde vos données. +Ne pas éteindre la console Xbox 360 quand cette icône apparaît. + +Opacité interface + +Préparation de sauvegarde auto du niveau + +Taille de l'interface + +Taille de l'interface (écran partagé) + +Graine + +Déverrouiller pack de skins + +Pour utiliser la skin que vous avez sélectionnée, vous devez d'abord déverrouiller le pack correspondant. +Déverrouiller ce pack de skins ? + +Débloquer le pack de textures + +Pour utiliser ce pack de textures dans votre monde, vous devez le débloquer. +Le débloquer maintenant ? + +Pack de textures d'essai + +Vous utilisez une version d'essai du pack de textures. Vous ne pourrez pas sauvegarder ce monde si vous ne déverrouillez pas la version complète. +Déverrouiller la version complète du pack de textures ? + +Pack de textures introuvable + +Déverrouiller la version complète + +Télécharger la version d'essai + +Télécharger la version complète + +Ce monde utilise un pack mash-up ou de textures que vous ne possédez pas. +Voulez-vous installer le pack mash-up ou le pack de textures maintenant ? + +Obtenir la version d'essai + +Obtenir la version complète + +Exclure joueur + +Voulez-vous vraiment exclure ce joueur de la partie ? Il ne pourra plus rejoindre la partie jusqu'au redémarrage du monde. + +Packs d'images de joueur + +Thèmes + +Packs de skins + +Autoriser les amis d'amis + +Vous ne pouvez pas rejoindre cette partie : elle est réservée aux seuls amis de l'hôte. + +Impossible de rejoindre la partie + +Sélectionnée + +Skin sélectionnée : + +Contenu téléchargeable corrompu + +Ce contenu téléchargeable est endommagé et inutilisable. Supprimez-le puis réinstallez-le depuis le menu Magasin Minecraft. + +Votre contenu téléchargeable est partiellement endommagé et inutilisable. Supprimez-le puis réinstallez-le depuis le menu Magasin Minecraft. + +Votre mode de jeu a été modifié + +Renommer votre monde + +Saisir le nouveau nom de votre monde + +Mode de jeu : Survie + +Mode de jeu : Créatif + +Mode de jeu : Aventure + +Survie + +Créatif + +Aventure + +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 + +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. + +Une fois activé, les amis des personnes présentes sur votre liste d'amis peuvent rejoindre la partie. + +Lorsque cette option est activée, les joueurs peuvent infliger des dégâts aux autres joueurs. Ne s'applique qu'au mode Survie. + +Lorsque cette option est désactivée, les joueurs qui rejoignent la partie ne peuvent ni construire ni miner sans autorisation. + +Lorsque cette option est activée, le feu peut se propager aux blocs voisins inflammables. + +Lorsque cette option est activée, le TNT peut exploser lorsqu'il est activé. + +Cette option permet à l'hôte d'activer sa capacité à voler et à se rendre un invisible, et de désactiver la fatigue. Elle désactive la mise à jour des succès et classements. + +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. + +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. + +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 + +Images du joueur + +Objets pour avatar + +Packs de textures + +Packs mash-up + +{*PLAYER*} s'est fait descendre en flammes + +{*PLAYER*} a joué les allumettes + +{*PLAYER*} a piqué une tête dans la lave + +{*PLAYER*} a suffoqué dans un mur + +{*PLAYER*} a péri par noyade + +{*PLAYER*} a crevé de faim + +{*PLAYER*} a reçu une piqûre mortelle + +{*PLAYER*} a percuté le sol + +{*PLAYER*} a chuté du bout du monde + +{*PLAYER*} a péri + +{*PLAYER*} a explosé + +{*PLAYER*} a trépassé par magie + +{*PLAYER*} a été tué(e) par le souffle du Dragon de l'Ender. + +{*PLAYER*} s'est fait tuer par {*SOURCE*} + +{*PLAYER*} s'est fait tuer par {*SOURCE*} + +{*PLAYER*} s'est fait tirer dessus par {*SOURCE*} + +{*PLAYER*} a encaissé une boule de feu décochée par {*SOURCE*} + +{*PLAYER*} s'est fait rouer de coups par {*SOURCE*} + +{*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 + +Afficher interface + +Afficher main + +Gamertags écran partagé + +Messages mortuaires + +Personnage animé + +Anim. pers. pour skin + +Vous ne pouvez plus miner ou utiliser d'objet + +Vous pouvez maintenant miner et utiliser des objets + +Vous ne pouvez plus placer de blocs + +Vous pouvez maintenant placer des blocs + +Vous pouvez maintenant utiliser portes et leviers + +Vous ne pouvez plus utiliser portes et leviers + +Vous pouvez maintenant utiliser des conteneurs (coffres, par exemple) + +Vous ne pouvez plus utiliser de conteneurs (coffres, par exemple) + +Vous ne pouvez plus attaquer des monstres + +Vous pouvez maintenant attaquer des monstres + +Vous ne pouvez plus attaquer des joueurs + +Vous pouvez maintenant attaquer des joueurs + +Vous ne pouvez plus attaquer les animaux + +Vous pouvez maintenant attaquer les animaux + +Vous êtes désormais modérateur + +Vous n'êtes plus modérateur + +Vous pouvez maintenant voler + +Vous ne pouvez plus voler + +Vous ne vous fatiguerez plus + +Vous allez maintenant vous fatiguer + +Vous êtes maintenant invisible + +Vous n'êtes plus invisible + +Vous êtes maintenant invulnérable + +Vous n'êtes plus invulnérable + +%d MSP + +Dragon de l'Ender + +%s est entré(e) dans l'Ender + +%s a quitté l'Ender + + +{*C3*}Je vois le joueur dont tu parles.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*} ?{*EF*}{*B*}{*B*} +{*C3*}Oui. Fais attention. Son niveau est plus élevé maintenant. Il peut lire nos pensées.{*EF*}{*B*}{*B*} +{*C2*}Ça ne fait rien. Il pense qu'on fait partie du jeu.{*EF*}{*B*}{*B*} +{*C3*}Je l'aime bien, ce joueur. Il a bien joué. Il n'a jamais baissé les bras.{*EF*}{*B*}{*B*} +{*C2*}Il lit nos pensées comme des mots sur un écran.{*EF*}{*B*}{*B*} +{*C3*}C'est sa façon d'imaginer bien des choses quand il est plongé dans le rêve d'un jeu.{*EF*}{*B*}{*B*} +{*C2*}Les mots font une interface remarquable. Très flexible. Et bien moins terrifiante que d'observer la réalité qui se trouve derrière l'écran.{*EF*}{*B*}{*B*} +{*C3*}Ils entendaient des voix, avant que les joueurs ne sachent lire. C'était l'époque où ceux qui ne jouaient pas appelaient les joueurs sorcières et sorciers. Et eux, rêvaient de voler dans les airs, sur des bâtons envoûtés par des démons. {*EF*}{*B*}{*B*} +{*C2*}De quoi rêvait ce joueur ?{*EF*}{*B*}{*B*} +{*C3*}De la lumière du soleil et des arbres. Du feu et de l'eau. Il l'a rêvé et l'a créé. Puis il a rêvé de destruction. Il a rêvé de chasser et d'être chassé. Il a rêvé d'un refuge.{*EF*}{*B*}{*B*} +{*C2*}Ah, l'interface originale. Vieille d'un million d'années et elle fonctionne encore. Mais quelle structure ce joueur a-t-il créée, dans la réalité qui se trouve derrière l'écran ?{*EF*}{*B*}{*B*} +{*C3*}Il a travaillé aux côtés de milliers d'autres, pour créer un véritable monde d'un pli de {*EF*}{*NOISE*}{*C3*}, et créé {*EF*}{*NOISE*}{*C3*} pour {*EF*}{*NOISE*}{*C3*}, dans {*EF*}{*NOISE*}{*C3*}.{*EF*}{*B*}{*B*} +{*C2*}Il n'arrive pas à lire ces pensées.{*EF*}{*B*}{*B*} +{*C3*}Non. Il n'a pas encore atteint le niveau le plus élevé. Pour cela, il doit accomplir le long rêve de la vie, pas le court rêve d'un jeu.{*EF*}{*B*}{*B*} +{*C2*}Sait-il que nous l'aimons ? Que l'univers est bon ?{*EF*}{*B*}{*B*} +{*C3*}Parfois, à travers les sons de sa pensée, il entend l'univers, oui.{*EF*}{*B*}{*B*} +{*C2*}Mais il est des moments où il est en peine, dans le long rêve. Il crée des mondes sans étés et frissonne sous un soleil noir, il prend ses tristes créations pour la réalité.{*EF*}{*B*}{*B*} +{*C3*}Soigner sa tristesse causerait sa perte. Le chagrin est une tâche personnelle. Nous ne pouvons interférer.{*EF*}{*B*}{*B*} +{*C2*}Parfois, quand les joueurs sont plongés dans leurs rêves, je veux leur dire qu'en réalité, ils construisent de véritables mondes. Parfois, je veux leur dire à quel point ils sont importants pour l'univers. Parfois, lorsqu'ils ne se sont pas vraiment connectés pendant un long moment, je veux les aider à exprimer leur peur.{*EF*}{*B*}{*B*} +{*C3*}Il lit nos pensées.{*EF*}{*B*}{*B*} +{*C2*}Parfois, cela m'indiffère. Parfois, j'aimerais leur dire que ce monde qu'ils croient véritable n'est que {*EF*}{*NOISE*}{*C2*} et {*EF*}{*NOISE*}{*C2*}, j'aimerais leur dire qu'ils sont {*EF*}{*NOISE*}{*C2*} dans {*EF*}{*NOISE*}{*C2*}. Leur vision de la réalité est tellement limitée dans leur long rêve.{*EF*}{*B*}{*B*} +{*C3*}Et pourtant, ils jouent le jeu.{*EF*}{*B*}{*B*} +{*C2*}Mais il serait tellement facile de leur dire...{*EF*}{*B*}{*B*} +{*C3*}Ce serait trop puissant pour ce rêve. Leur dire comment vivre revient à les empêcher de vivre.{*EF*}{*B*}{*B*} +{*C2*}Je ne dirai pas au joueur comment vivre.{*EF*}{*B*}{*B*} +{*C3*}Le joueur commence à s'agiter.{*EF*}{*B*}{*B*} +{*C2*}Je vais lui conter une histoire.{*EF*}{*B*}{*B*} +{*C3*}Mais pas la vérité.{*EF*}{*B*}{*B*} +{*C2*}Non. Une histoire qui protège la vérité dans une cage de mots. Pas la vérité à nue qui peut brûler sur une infinie distance.{*EF*}{*B*}{*B*} +{*C3*}Donne-lui à nouveau un corps.{*EF*}{*B*}{*B*} +{*C2*}Oui. Joueur...{*EF*}{*B*}{*B*} +{*C3*}Utilise son nom.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}. Joueur de jeux.{*EF*}{*B*}{*B*} +{*C3*}Bien.{*EF*}{*B*}{*B*} + + + + + +{*C2*}Prenez une inspiration, maintenant. Prenez-en une autre. Sentez l'air dans vos poumons. Laissez vos membres se ranimer. Oui, bougez vos doigts. Ressentez à nouveau votre corps, la gravité, l'air. Réapparaissez dans le long rêve. Vous y êtes. Votre corps touche à présent l'univers de toute part, comme si vous étiez deux choses séparées. Comme si nous étions deux choses séparées.{*EF*}{*B*}{*B*} +{*C3*}Qui sommes-nous ? Nous étions jadis appelés esprits de la montagne. Père soleil et mère lune. Esprits ancestraux, esprits animaux. Génies. Fantômes. Homme vert. Puis dieux, démons. Anges. Poltergeists. Aliens, extraterrestres. Leptons, quarks. Les mots changent mais nous restons les mêmes.{*EF*}{*B*}{*B*} +{*C2*}Nous sommes l'univers. Nous sommes tout ce que vous considérez ne pas être vous. Vous nous regardez à présent, à travers votre peau et vos yeux. Et pourquoi l'univers touche-t-il votre peau et vous éclaire de sa lumière ? Pour vous voir, joueur. Pour vous connaître. Et pour être connu. Je vais vous raconter une histoire.{*EF*}{*B*}{*B*} +{*C2*}Il était une fois un joueur.{*EF*}{*B*}{*B*} +{*C3*}Ce joueur, c'était vous, {*PLAYER*}.{*EF*}{*B*}{*B*} +{*C2*}Parfois il se croyait humain, sur la fine croûte d'un globe tournant fait de roche en fusion. La boule de roche en fusion tournait autour d'une autre boule de gaz embrasé qui était trois cent trente trois millions de fois plus massive qu'elle. Elles étaient si éloignées l'une de l'autre que la lumière mettait huit minutes à traverser l'intervalle. La lumière était les données d'une étoile et pouvait brûler la peau à plus de cent cinquante millions de kilomètres de distance.{*EF*}{*B*}{*B*} +{*C2*}Parfois, le joueur rêvait qu'il était un mineur, à la surface d'un monde plat et infini. Le soleil était un carré blanc. Les jours étaient courts, il y avait beaucoup à faire et la mort n'était qu'un inconvénient temporaire.{*EF*}{*B*}{*B*} +{*C3*}Parfois le joueur rêvait qu'il était perdu dans une histoire.{*EF*}{*B*}{*B*} +{*C2*}Parfois, le joueur rêvait qu'il était d'autres choses, en d'autres lieux. Parfois ces rêves étaient perturbants. Parfois vraiment beaux. Parfois le joueur se réveillait dans un rêve pour se retrouver dans un autre et se réveiller dans un troisième.{*EF*}{*B*}{*B*} +{*C3*}Parfois, le joueur rêvait qu'il lisait des mots sur un écran.{*EF*}{*B*}{*B*} +{*C2*}Revenons en arrière.{*EF*}{*B*}{*B*} +{*C2*}Les atomes du joueur étaient éparpillés dans l'herbe, les rivières, l'air, le sol. Une femme a rassemblé les atomes, elle a bu et respiré, et a assemblé le joueur dans son corps.{*EF*}{*B*}{*B*} +{*C2*}Et le joueur s'est réveillé, passant du monde maternel chaud et sombre à celui du long rêve.{*EF*}{*B*}{*B*} +{*C2*}Et le joueur était une nouvelle histoire, jamais racontée avant, écrite en lettres ADN. Et le joueur était un nouveau programme, jamais utilisé auparavant, généré par un code source d'un milliard d'années. Et le joueur était un nouvel humain n'ayant encore jamais vécu, uniquement fait d'amour et de lait.{*EF*}{*B*}{*B*} +{*C3*}Vous êtes le joueur. L'histoire. Le programme. L'humain. Uniquement fait d'amour et de lait.{*EF*}{*B*}{*B*} +{*C2*}Allons un peu plus loin.{*EF*}{*B*}{*B*} +{*C2*}Les sept quadrilliards d'atomes qui forment le corps du joueur ont été créés, bien longtemps avant ce jeu, au cœur d'une étoile. Le joueur est donc, lui aussi, les données d'une étoile. Et le joueur évolue dans une histoire, faite d'une forêt de données plantées par un homme nommé Julian, dans un monde plat et infini, créé par un homme nommé Markus, qui existe dans un petit monde privé créé par le joueur qui habite lui-même un univers créé par...{*EF*}{*B*}{*B*} +{*C3*}Chut. Parfois, le joueur créait un petit monde privé doux, simple et chaleureux. Parfois difficile, froid et compliqué. Parfois, il construisait le modèle d'un univers dans sa tête ; éclats d'énergie se déplaçant dans de vastes espaces vides. Parfois, il appelait ces éclats « électrons » et « protons ».{*EF*}{*B*}{*B*} + + + +{*C2*}Parfois, il les appelait « planètes » et « étoiles ».{*EF*}{*B*}{*B*} +{*C2*}Parfois, il se croyait dans un univers fait d'énergie, elle-même faite de zéros et de uns ; d'allumages et de mises en veille ; de lignes de codes. Parfois, il se croyait en train de jouer. Parfois il se croyait en train de lire des mots sur un écran.{*EF*}{*B*}{*B*} +{*C3*}Vous êtes le joueur lisant des mots...{*EF*}{*B*}{*B*} +{*C2*}Chut... Parfois, le joueur lisait les lignes de code d'un écran, les décodait pour en faire des mots, puis décodait les mots pour en tirer un sens, lui-même décodé en sentiments, émotions, théories, idées, et le joueur se mettait à respirer plus vite et plus profondément alors qu'il réalisait qu'il était vivant, il était vivant. Ces milliers de morts n'étaient pas réelles, le joueur était en vie.{*EF*}{*B*}{*B*} +{*C3*}Vous. Vous êtes en vie.{*EF*}{*B*}{*B*} +{*C2*}Et parfois, le joueur pensait que l'univers lui avait parlé par la lumière qui passait à travers les feuilles mouvantes des arbres en été.{*EF*}{*B*}{*B*} +{*C3*}Et parfois, le joueur pensait que l'univers lui avait parlé par la lumière qui tombait de la fraîcheur du ciel nocturne de l'hiver, où un éclat de lumière dans l'angle de l'œil du joueur pouvait être une étoile un million de fois plus massive que le soleil, fusionnant ses planètes en plasma pour les rendre visibles un instant au joueur rentrant chez lui de l'autre côté de l'univers, une odeur de nourriture lui chatouillant les narines, presque arrivé au pas de la porte familière, sur le point de se mettre à rêver à nouveau.{*EF*}{*B*}{*B*} +{*C2*}Et parfois, le joueur pensait que l'univers lui avait parlé par les zéros et les uns, par l'électricité du monde, par les mots défilant sur un écran à la fin d'un rêve.{*EF*}{*B*}{*B*} +{*C3*}Et l'univers disait : je vous aime ;{*EF*}{*B*}{*B*} +{*C2*}Et l'univers disait : vous avez bien joué ;{*EF*}{*B*}{*B*} +{*C3*}Et l'univers disait : tout ce dont vous avez besoin est en vous ;{*EF*}{*B*}{*B*} +{*C2*}Et l'univers disait : votre force est plus grande que vous ne le pensez ;{*EF*}{*B*}{*B*} +{*C3*}Et l'univers disait : vous êtes la lumière du jour ;{*EF*}{*B*}{*B*} +{*C2*}Et l'univers disait : vous êtes la nuit ;{*EF*}{*B*}{*B*} +{*C3*}Et l'univers disait : les ténèbres que vous combattez sont en vous ;{*EF*}{*B*}{*B*} +{*C2*}Et l'univers disait : la lumière que vous cherchez est en vous ;{*EF*}{*B*}{*B*} +{*C3*}Et l'univers disait : vous n'êtes pas seul ;{*EF*}{*B*}{*B*} +{*C2*}Et l'univers disait : vous êtes lié à tout ce qui vous entoure ;{*EF*}{*B*}{*B*} +{*C3*}Et l'univers disait : vous êtes l'univers se goûtant lui-même, se parlant à lui-même, listant son propre code ;{*EF*}{*B*}{*B*} +{*C2*}Et l'univers disait : je vous aime, car vous êtes amour.{*EF*}{*B*}{*B*} +{*C3*}Et la partie se termina et le joueur sortit du rêve. Et le joueur en commença un nouveau. Et le joueur rêva à nouveau, et rêva mieux. Et le joueur était l'univers. Et le joueur était amour.{*EF*}{*B*}{*B*} +{*C3*}Vous êtes le joueur.{*EF*}{*B*}{*B*} +{*C2*}Réveillez-vous.{*EF*} + + +Réinitialiser le Nether + +Voulez-vous vraiment réinitialiser le Nether de cette sauvegarde à ses paramètres par défaut ? Vous perdrez tout ce que vous avez construit dans le Nether ! + +Réinitialiser le Nether + +Ne pas réinitialiser le Nether + +Pas de tonte de champimeuh pour le moment. Le nombre max de cochons, moutons, vaches 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, chats et chevaux. + +Impossible d'utiliser l'œuf d'apparition pour le moment. Vous avez atteint le nombre maximum de champimeuh. + +Impossible d'utiliser l'œuf d'apparition pour le moment. Vous avez atteint le nombre maximum de loups dans un monde. + +Impossible d'utiliser l'œuf d'apparition pour le moment. Vous avez atteint le nombre maximum de poulets dans un monde. + +Impossible d'utiliser l'œuf d'apparition pour le moment. Vous avez atteint le nombre maximum de pieuvres dans un monde. + +Impossible d'utiliser 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. + +Le nombre maximum de tableaux/objets encadrés dans un monde a été atteint. + +Vous ne pouvez pas faire apparaître des ennemis en mode Paisible. + +Cet animal ne peut pas entrer en mode amour. Le nombre maximum de cochons, moutons, vaches, 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. + +Le nombre maximum de crânes dans un monde a été atteint. + +Inverser + +Gaucher + +Vous êtes mort ! + +Réapparaître + +Contenu téléchargeable + +Changer de skin + +Comment jouer + +Commandes + +Paramètres + +Crédits + +Réinstaller le contenu + +Debug Settings + +Propagation du feu + +Explosion de TNT + +PvP + +Joueurs de confiance + +Privilèges d'hôte + +Génération de structures + +Monde superplat + +Coffre bonus + +Options mondiales + +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 + +Ouverture de conteneurs possible + +Peut attaquer les joueurs + +Peut attaquer les animaux + +Modérateur + +Exclure joueur + +Peut voler + +Fatigue désactivée + +Invisible + +Options de l'hôte + +Joueurs/Invitation + +Jeu en ligne + +Sur invitation + +Plus d'options + +Charger + +Nouveau monde + +Nom du monde + +Graine pour le générateur de monde + +Champ vide pour une graine aléatoire + +Joueurs + +Rejoindre la partie + +Commencer la partie + +Aucune partie trouvée + +Jouer + +Classements + +Succès + +Aide et options + +Déverrouiller le jeu complet + +Reprendre le jeu + +Sauvegarder la partie + +Difficulté : + +Type de partie : + +Gamertags : + +Structures : + +Type de niveau : + +PvP : + +Joueurs de confiance : + +TNT : + +Propagation du feu : + +Réinstaller le thème + +Réinstaller l'image du joueur 1 + +Réinstaller l'image du joueur 2 + +Réinstaller l'article pour avatar 1 + +Réinstaller l'article pour avatar 2 + +Réinstaller l'article pour avatar 3 + +Options + +Audio + +Contrôle + +Vidéo + +Interface utilisateur + +Paramètres par défaut + +Afficher flottement + +Conseils + +Infobulles en jeu + +Gamertags en jeu + +Écran partagé vertical (2 joueurs) + +Terminé + +Modifier le message : + +Renseigner la légende de votre capture d'écran + +Sous-titre + +Capture d'écran du jeu + +Modifier le message : + +Regardez où j'en suis dans Minecraft: Xbox 360 Edition ! + +Les textures, icônes et interface utilisateur classiques de Minecraft ! + +Afficher tous les mondes Mash-up + +Sélectionner Transférer l'emplacement de sauvegarde + +Emplacement vide + +Chargement des métadonnées sauvegardées + +Chargement des données sauvegardées + +Chargement de la sauvegarde pour Xbox One + +Chargement annulé + +Vous avez annulé le chargement de cette sauvegarde vers la zone de transfert de sauvegarde. + +Pas d'effet + +Vitesse + +Lenteur + +Hâte + +Fatigue de mineur + +Force + +Faiblesse + +Santé + +Dégâts + +Saut + +Nausée + +Régénération + +Résistance + +Résistance au feu + +Respiration aquatique + +Invisibilité + +Cécité + +Vision nocturne + +Faim + +Poison + +Wither + +Boost de santé + +Absorption + +Saturation + +de rapidité + +de lenteur + +de hâte + +de lassitude + +de force + +de faiblesse + +de santé + +de dégâts + +de saut + +de nausée + +de régénération + +de résistance + +de résistance au feu + +de respiration aquatique + +d'invisibilité + +de cécité + +de vision nocturne + +de faim + +de poison + +de flétrissure + +de boost de santé + +d'absorption + +de saturation + + + +II + +III + +IV + + vol. + +banale + +triviale + +insipide + +claire + +laiteuse + +diffuse + +naïve + +mince + +étrange + +plate + +volumineuse + +maladroite + +beurrée + +lisse + +suave + +débonnaire + +épaisse + +élégante + +fantasque + +de charme + +fringante + +raffinée + +cordiale + +mousseuse + +puissante + +viciée + +inodore + +rang + +rude + +âcre + +brute + +puante + +Sert de base à toutes les potions. À utiliser dans un alambic pour distiller des potions. + +N'a pas d'effet. Combinée à d'autres ingrédients, peut servir à distiller des potions dans un alambic. + +Augmente la vitesse de déplacement des joueurs, animaux et monstres affectés ; augmente la vitesse de sprint, la longueur des sauts et le champ de vision des joueurs. + +Réduit la vitesse de déplacement des joueurs, animaux et monstres affectés ; réduit la vitesse de sprint, la longueur des sauts et le champ de vision des joueurs. + +Augmente les dégâts infligés par les attaques des joueurs et des monstres affectés. + +Réduit les dégâts infligés par les attaques des joueurs et des monstres affectés. + +Augmente instantanément la santé des joueurs, animaux et monstres affectés. + +Réduit instantanément la santé des joueurs, animaux et monstres affectés. + +Rend progressivement de la santé aux joueurs, animaux et monstres affectés. + +Rend les joueurs, animaux et monstres affectés résistants au feu, à la lave et aux attaques à distance des Blazes. + +Réduit progressivement la santé des joueurs, animaux et monstres affectés. + +À 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 + +Fléau des arthropodes + +Recul + +Aura de Feu + +Protection + +Protection contre le feu + +Chute amortie + +Protection contre les explosions + +Protection contre les projectiles + +Respiration + +Aisance aquatique + +Efficacité + +Délicatesse + +Solidité + +Butin + +Fortune + +Puissance + +Flamme + +Repoussoir + +Infinité + +I + +II + +III + +IV + +V + +VI + +VII + +VIII + +IX + +X + +Se mine à l'aide d'une pioche en fer (ou mieux) pour prélever des émeraudes. + +Semblable à un coffre normal, hormis que les objets placés dans un coffre du Néant sont récupérables dans tous les coffres du Néant du joueur, même dans une autre dimension. + +S'active quand une entité traverse un fil de déclenchement connecté. + +Active un crochet connecté quand une entité le traverse. + +Un moyen peu encombrant d'entreposer des émeraudes. + +Un muret en pierre taillée. + +Peut servir à réparer les armes, outils et armures. + +À fondre dans un four pour produire du quartz du Nether. + +Sert de décoration. + +À échanger avec les villageois. + +Sert de décoration. Vous pouvez y planter des fleurs, des pousses d'arbre, des cactus et des champignons. + +Restitue 2{*ICON_SHANK_01*}; transformable en carotte dorée. À planter dans une terre labourée. + +Restitue 0,5{*ICON_SHANK_01*}. À cuire dans un four. À planter dans une terre labourée. + +Restitue 3{*ICON_SHANK_01*}. Obtenu en cuisinant une pomme de terre dans un four. + +Restitue 1{*ICON_SHANK_01*} mais peut vous rendre malade. + +Restitue 3{*ICON_SHANK_01*}. Se fabrique avec une carotte et des pépites d'or. + +Sert à contrôler un cochon sellé quand vous le montez. + +Restitue 4{*ICON_SHANK_01*}. + +À utiliser en conjonction avec une enclume pour enchanter des armes, outils ou armures. + +Se crée en minant du minerai de quartz du Nether dans un four. Peut produire un bloc de quartz. + +Se fabrique avec de la laine. Sert de décoration. + +Émeraude + +Pot de fleurs + +Carotte + +Pomme de terre + +Pomme de terre cuite + +Pomme de terre empoisonnée + +Carotte dorée + +Carotte sur un bâton + +Tarte à la citrouille + +Livre enchanté + +Quartz du Nether + +Minerai d'émeraude + +Coffre du Néant + +Crochet + +Fil de déclenchement + +Bloc d'émeraude + +Muret + +Muret moussu + +Pot de fleurs + +Carottes + +Pommes de terre + +Enclume + +Enclume + +Enclume légèrement abîmée + +Enclume très abîmée + +Minerai de quartz du Nether + +Bloc de quartz + +Bloc de quartz taillé + +Pilier de blocs de quartz + +Escalier en quartz + +Tapis + +Tapis noir + +Tapis rouge + +Tapis vert + +Tapis marron + +Tapis bleu + +Tapis violet + +Tapis cyan + +Tapis gris clair + +Tapis gris + +Tapis rose + +Tapis vert clair + +Tapis jaune + +Tapis bleu ciel + +Tapis magenta + +Tapis orange + +Tapis blanc + +Grès taillé + +Grès lisse + +{*PLAYER*} s'est fait tuer en tentant de frapper {*SOURCE*} + +{*PLAYER*} s'est fait écraser par la chute d'une enclume. + +{*PLAYER*} s'est fait écraser par la chute d'un bloc + +{*PLAYER*} s'est fait téléporter vers : {*DESTINATION*} + +{*PLAYER*} vient de vous téléporter jusqu'à son emplacement + +{*PLAYER*} vient de se téléporter jusqu'à vous + +Épines + +Dalle de quartz + +Les zones sombres apparaissent comme en plein jour, même sous l'eau. + +Les joueurs, animaux et monstres affectés deviennent invisibles. + +Réparer et nommer + +Coût : %d + +Trop cher ! + +Renommer + +Vous avez : + +Objets nécessaires à la transaction + +{*VILLAGER_TYPE*} propose %s + +Réparer + +Commercer + +Teindre le collier + + + Voici l'interface de l'enclume qui vous permet de renommer, réparer et appliquer des enchantements aux armes, armures ou outils, moyennant des niveaux d'expérience. + + + + {*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur l'interface de l'enclume.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si l'interface de l'enclume n'a déjà plus de secrets pour vous. + + + + Pour commencer à travailler sur un objet, placez-le dans la première case. + + + + Placez la bonne matière première dans la deuxième case (par exemple des lingots de fer pour une épée en fer endommagée) et une proposition de réparation apparaîtra dans la case de résultat. + + + + Vous pouvez aussi placer un deuxième objet identique dans la deuxième case pour combiner les deux. + + + + Pour enchanter des objets sur l'enclume, placez un livre enchanté dans la deuxième case. + + + + Le nombre de niveaux d'expérience que coûte l'opération s'affiche sous le résultat. Si vous n'avez pas assez de niveaux d'expérience, l'opération ne peut pas aboutir. + + + + Il est possible de renommer l'objet en modifiant le nom qui s'affiche dans la case de texte. + + + + Quand vous ramassez l'objet réparé, les deux objets placés sur l'enclume sont consommés et vous perdez le nombre de niveaux d'expérience indiqué. + + + + Cette zone contient une enclume et un coffre renfermant des outils et armes à modifier. + + + + {*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur l'enclume.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si l'enclume n'a déjà plus de secrets pour vous. + + + + Une enclume permet de réparer vos armes et outils afin de reconstituer leur durabilité, de les renommer ou de les enchanter à l'aide de livres enchantés. + + + + Vous pouvez trouver des livres enchantés dans les coffres des donjons, ou enchanter un livre normal sur la table d'enchantement. + + + + L'utilisation de l'enclume coûte des niveaux d'expérience et chaque utilisation est susceptible d'abîmer l'enclume. + + + + Le type d'opération, la valeur de l'objet, le nombre d'enchantements et la quantité de travail déjà effectué ont tous une incidence sur le coût des réparations. + + + + Quand vous renommez un objet, le nom qui s'affiche pour tous les joueurs est modifié et le coût du travail déjà effectué est réduit de façon définitive. + + + + Le coffre de cette zone contient des pioches abîmées, des matières premières, des fioles d'expérience ainsi que des livres enchantés pour vous permettre de faire des tests. + + + + Voici l'interface de commerce, qui affiche les transactions disponibles auprès d'un villageois. + + + + {*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur l'interface de commerce.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si l'interface de commerce n'a déjà plus de secrets pour vous. + + + + Toutes les transactions que le villageois est disposé à effectuer en ce moment s'affichent en haut de l'écran. + + + + Les transactions apparaissent en rouge et sont indisponibles si vous n'avez pas les objets nécessaires. + + + + La quantité et le type d'objets que vous donnez au villageois s'affichent dans les deux cases à gauche. + + + + Vous pouvez voir le total des objets nécessaires à la transaction dans les deux cases à gauche. + + + + Appuyez sur{*CONTROLLER_VK_A*} pour échanger les objets que demande le villageois contre ce qu'il offre. + + + + Cette zone contient un villageois et un coffre renfermant du papier pour acheter des objets. + + + + {*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur le commerce.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si le commerce n'a déjà plus de secrets pour vous. + + + + Les joueurs peuvent échanger des objets de leur inventaire avec les villageois. + + + + Les transactions qu'un villageois est susceptible de vous proposer dépendent de sa profession. + + + + Au fur et à mesure des transactions, l'éventail d'échanges proposés par le villageois est complété ou mis à jour aléatoirement. + + + + Les transactions effectuées fréquemment sont susceptibles d'être temporairement désactivées, mais le villageois en propose toujours au moins une. + + + + Prenez du papier dans le coffre et essayez de commercer avec le villageois. + + + + Cette zone contient deux coffres du Néant. + + + + {*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur les coffres du Néant.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si les coffres du Néant n'ont déjà plus de secrets pour vous. + + + + Tous les coffres du Néant d'un monde sont liés, y compris d'une dimension à l'autre. Les objets placés dans un coffre du Néant sont accessibles depuis n'importe quel autre coffre du Néant. + + + + Cependant, le contenu des coffres du Néant diffère pour chaque joueur. + + + + Il est ainsi possible de stocker des objets dans n'importe quel coffre du Néant pour ensuite les récupérer dans un autre situé ailleurs dans le monde. Testez ce principe en plaçant des objets dans l'un des deux coffres du Néant. + + +Restitue 2{*ICON_SHANK_01*}, régénère la santé pendant 30 secondes et octroie une résistance au feu ainsi qu'aux dégâts pendant 5 minutes. Fabriqué avec une pomme et des blocs d'or. + +Peut se téléporter + +Se téléporter + +Téléporter vers le joueur + +Téléporter vers moi + +Peut désactiver la fatigue + +Peut devenir invisible + +Vous pouvez maintenant activer l'invisibilité + +Vous ne pouvez plus activer l'invisibilité + +Vous pouvez maintenant activer la lévitation + +Vous ne pouvez plus activer la lévitation + +Vous pouvez maintenant désactiver la fatigue + +Vous ne pouvez plus désactiver la fatigue + +Vous pouvez maintenant vous téléporter + +Vous ne pouvez plus vous téléporter + +{*T3*}COMMENT JOUER : ENCLUME{*ETW*}{*B*}{*B*} +Vous pouvez également utiliser vos niveaux pour réparer, enchanter ou renommer un objet à l'aide de l'enclume.{*B*} +Il est possible de renommer tous les objets, mais seuls ceux disposant d'une durabilité peuvent être réparés ou enchantés à l'aide d'un livre enchanté.{*B*} +Pour réparer un objet, placez-le dans l'une des cases à gauche, accompagné de sa matière première (par exemple un lingot de fer pour une épée en fer) ou combiné à un autre objet de même type.{*B*} +Les combinaisons d'objets sont plus efficaces quand vous utilisez une enclume. En outre, si l'un des objets était déjà enchanté, le produit fini est susceptible de conserver les enchantements de l'un ou l'autre des objets d'origine.{*B*} +Les livres enchantés peuvent appliquer des enchantements aux objets en les combinant sur une enclume, tant que l'enchantement en question convient à l'objet. Vous pouvez trouver des livres enchantés dans les donjons, ou enchanter des livres normaux sur une table d'enchantement.{*B*} +Chaque utilisation de l'enclume est susceptible de l'abîmer. Après une certaine quantité de dégâts, elle devient inutilisable.{*B*} + + +{*T3*}COMMENT JOUER : COMMERCE{*ETW*}{*B*}{*B*} +Il est possible de faire du commerce avec les villageois. À chaque villageois correspond une profession : fermier, boucher, forgeron, bibliothécaire ou prêtre. Cette profession influe sur le type d'objets dont ils font le commerce.{*B*} +Vous trouverez une liste de toutes les transactions que propose un villageois dans le menu de commerce. Un villageois peut modifier ou compléter son panel d'objets quand un joueur commerce avec lui. Si une transaction spécifique est utilisée trop fréquemment, elle est susceptible d'être temporairement désactivée.{*B*} +Les transactions impliquent généralement d'acheter ou de vendre un certain nombre d'objets contre des émeraudes.{*B*} +Si vous ne possédez pas les objets nécessaires à une transaction, ces cases apparaissent en rouge.{*B*} + + +{*T3*}COMMENT JOUER : COFFRE DU NÉANT{*ETW*}{*B*}{*B*} +Tous les coffres du Néant d'un monde sont liés. Les objets placés dans un coffre du Néant sont accessibles dans n'importe quel autre. Cependant, le contenu des coffres du Néant diffère pour chaque joueur. Ainsi, les joueurs peuvent y stocker des objets et les récupérer dans d'autres coffres du Néant disséminés à travers le monde. + + +Fermier + +Bibliothécaire + +Prêtre + +Forgeron + +Boucher + +Présents dans les villages, les villageois vendent des objets au joueur selon leur profession. + +Grand coffre + + + Vous pouvez aussi créer des livres enchantés sur la table d'enchantement, livres dont vous pouvez ensuite appliquer l'enchantement à un objet sur l'enclume. + + + + Les crochets alimentent également en continu un circuit tant que quelque chose déclenche le fil connecté. + + + + Une fois apprivoisé, un loup porte toujours son collier, que vous pouvez teindre pour en changer la couleur. + + +Pour récolter des carottes et des pommes de terre, vous devez d'abord les planter. Elles sont prêtes à la récolte quand le légume pointe à la surface. + + + Vous pouvez aussi seller les cochons pour ensuite les chevaucher. Utilisez alors une carotte sur un bâton pour les diriger. + + + + Si nécessaire, vous pouvez déplacer lentement votre chariot de mine en utilisant {*CONTROLLER_ACTION_MOVE*}. Ceci vous aidera à lancer le chariot de mine en le mettant sur un rail alimenté. + + +Vous ne pouvez pas rejoindre cette partie car l'écran partagé n'est pris en charge qu'en mode Haute définition. Déconnectez tous les autres joueurs si vous désirez la rejoindre. + +Guérison + +Xbox 360 + +BACK + +Cette option désactive les mises à jour des succès et des classements pour le monde en cours ; ces mises à jour resteront désactivées si vous chargez ce monde après l'avoir sauvegardé avec cette option activée. + +Charger la sauvegarde pour Xbox One + +Charger la sauvegarde + +La zone de transfert de sauvegarde ne peut stocker qu'une seule sauvegarde Xbox 360 à la fois. Assurez-vous d'avoir téléchargé la sauvegarde sur votre console Xbox One avant de charger une autre sauvegarde Xbox 360. + +Chargement en cours... + +Chargement terminé ! + +Échec du chargement. Veuillez réessayer ultérieurement. + + diff --git a/Minecraft.Client/Common/Media/it-IT/4J_strings.resx b/Minecraft.Client/Common/Media/it-IT/4J_strings.resx new file mode 100644 index 00000000..18d7ab69 --- /dev/null +++ b/Minecraft.Client/Common/Media/it-IT/4J_strings.resx @@ -0,0 +1,108 @@ + +Non utilizzato + +OK + +Indietro + +Annulla + + + +No + +Salvataggio danneggiato + +I dati salvati sono danneggiati. Vuoi creare un nuovo salvataggio, sovrascrivendo quello danneggiato? + +Spazio libero insufficiente + +La periferica di memorizzazione selezionata non dispone di spazio libero sufficiente per creare un salvataggio. + +Seleziona di nuovo + +Gioca senza salvare + +Crea un nuovo salvataggio + +Sovrascrivere? + +La periferica di memorizzazione selezionata contiene già questo salvataggio. Vuoi sovrascriverlo? + +No, non sovrascrivere + +Sovrascrivi e salva + +Salvataggio non riuscito + +Problema periferica + +La periferica di memorizzazione non è disponibile o si è verificato un errore. + +La periferica di memorizzazione non è disponibile o si è verificato un errore. Seleziona una nuova periferica di memorizzazione. + +Seleziona un'altra periferica + +Nessuna periferica selezionata + +Se non selezioni una periferica di memorizzazione, il salvataggio sarà disattivato. + +Seleziona una periferica + +Continua senza salvare + +La periferica di memorizzazione è stata rimossa. Selezionane un'altra. + +Caricamento non riuscito + +Nomina il salvataggio + +Inserisci un nome per il salvataggio + +Torna a Xbox Dashboard + +Vuoi davvero uscire dal gioco? + +Disconnesso + +Sei tornato alla schermata iniziale perché il tuo profilo giocatore si è disconnesso. + +La partita è terminata perché un profilo giocatore si è disconnesso. + +Continua a giocare + +Profilo giocatore non online + +Alcune funzionalità di questo gioco richiedono un profilo giocatore abilitato per Xbox Live, ma tu sei offline. + +Questa funzionalità richiede un profilo giocatore connesso a Xbox Live. + +Connettiti a Xbox Live + +Continua a giocare offline + +Problema assegnazione obiettivo + +Si è verificato un problema durante l'accesso al tuo profilo giocatore. Per il momento non è stato possibile sbloccare l'obiettivo. + +Problema profilo giocatore + +Salvataggio delle impostazioni sul profilo giocatore non riuscito. + +Profilo giocatore ospite + +Il profilo giocatore ospite non può accedere a questa funzionalità. Usa un altro profilo giocatore. + +Salvataggio... + +Salvataggio del contenuto. Non spegnere la console. + +Sblocca gioco completo + +Questa è una versione di prova di Minecraft. Se avessi il gioco completo, avresti sbloccato un obiettivo! +Sblocca il gioco completo per provare le gioie di Minecraft e per giocare con amici di tutto il mondo su Xbox Live. +Vuoi sbloccare il gioco completo? + +Verrai riportato al menu principale per un problema di lettura del tuo profilo. + + diff --git a/Minecraft.Client/Common/Media/it-IT/strings.resx b/Minecraft.Client/Common/Media/it-IT/strings.resx new file mode 100644 index 00000000..6eb30dc3 --- /dev/null +++ b/Minecraft.Client/Common/Media/it-IT/strings.resx @@ -0,0 +1,5158 @@ + +Sono disponibili nuovi contenuti scaricabili! Per accedervi, seleziona il pulsante Negozio di Minecraft nel menu principale. + +Puoi cambiare l'aspetto del tuo personaggio con il pacchetto Skin disponibile nel Negozio. Seleziona "Negozio di Minecraft" per sapere che cosa è disponibile. + +Se giochi in modalità Alta definizione, fino a quattro giocatori possono divertirsi a schermo diviso sulla stessa console! + +Collega i controller extra alla tua console e premi START su ciascuno per entrare in una partita in qualsiasi momento. + +Modifica le impostazioni gamma per aumentare o diminuire la luminosità del gioco. + +Impostando la difficoltà del gioco su Relax, la salute verrà reintegrata automaticamente e di notte non usciranno mostri! + +Dai un osso a un lupo per ammansirlo. Potrai chiedergli di sedersi o di seguirti. + +Per mettere degli oggetti nel menu Inventario, sposta il cursore dal menu e premi{*CONTROLLER_VK_A*} + +Se di notte dormi in un letto, il gioco scorrerà velocemente fino all'alba, ma tutti i giocatori in modalità multiplayer devono dormire in un letto contemporaneamente. + +Ottieni costolette di maiale dai maiali, cucinale e mangiale per reintegrare la salute. + +Ottieni della pelle dalle mucche e usala per costruire un'armatura. + +Se hai un secchio vuoto, puoi riempirlo di latte di mucca, acqua o lava! + +Usa una zappa per preparare un appezzamento di terreno pronto per la coltura. + +I ragni non attaccano durante il giorno, a meno che non vengano attaccati per primi. + +Se per scavare nella terra o nella sabbia usi una vanga invece delle mani farai più in fretta! + +Le costolette di maiale arrostite reintegrano più salute di quelle crude. + +Costruisci delle torce per fare luce durante la notte. I mostri staranno alla larga dalle aree illuminate. + +Arriva prima a destinazione con un carrello da miniera e un binario! + +Pianta degli arbusti e cresceranno fino a diventare alberi. + +Gli uomini-maiale non attaccano, a meno che non vengano attaccati per primi. + +Puoi modificare il punto di generazione del gioco e saltare all'alba dormendo in un letto. + +Rispondi all'attacco del ghast con queste palle di fuoco! + +Costruendo un portale potrai accedere a un'altra dimensione, il Sottomondo. + +Premi{*CONTROLLER_VK_B*} per far cadere l'oggetto che stai tenendo in mano! + +Usa l'attrezzo giusto per il lavoro giusto! + +Se non trovi il carbone per le torce, puoi sempre crearne un po' utilizzando gli alberi e la fornace. + +Scavare in linea retta verso l'alto o verso il basso non è una grande idea. + +La farina d'ossa (creata da un osso di scheletro) può essere utilizzata come fertilizzante e tutto crescerà in un istante! + +I creeper esplodono man mano che ti si avvicinano! + +L'ossidiana si crea quando l'acqua entra in contatto con un blocco di lava. + +Una volta rimosso il blocco di lava, servono alcuni minuti prima che quest'ultima scompaia COMPLETAMENTE. + +I ciottoli non subiscono danni dalle sfere di fuoco dei ghast, quindi sono utili per proteggere i portali. + +I blocchi utilizzabili come fonti di luce sciolgono neve e ghiaccio. Tra questi vi sono torce, pietre brillanti e zucche di Halloween. + +Fai attenzione quando costruisci strutture di lana all'aria aperta: i fulmini dei temporali possono incendiarle. + +Usa un secchio di lava in una fornace per fondere 100 blocchi. + +Lo strumento suonato dal blocco nota dipende dal materiale sottostante. + +Zombie e scheletri possono sopravvivere alla luce del giorno, se si trovano nell'acqua. + +Se attacchi un lupo, gli altri membri del suo branco si rivolteranno contro di te e ti assaliranno. Questo vale anche per gli uomini-maiali zombie. + +I lupi non possono accedere al Sottomondo. + +I lupi non attaccano i creeper. + +Le galline depongono uova a intervalli di 5-10 minuti. + +L'ossidiana si scava solo con una piccozza di diamante. + +I creeper sono la fonte di polvere da sparo più facile da ottenere. + +Colloca due casse vicine per creare una cassa grande. + +Lo stato di salute dei lupi addomesticati è riconoscibile dalla posizione della coda. Dagli della carne per curarli. + +Cuoci un cactus in una fornace per ottenere tintura verde. + +Segui 4J Studios e Kappische su twitter per le ultime notizie sul gioco! + +Fai bella figura con gli amici: pubblica su Facebook screenshot delle tue creazioni Minecraft dal menu di pausa nel gioco! + +Per le ultime informazioni sugli aggiornamenti del gioco, leggi la sezione Novità nei menu Come giocare. + +Il gioco ora contiene recinzioni impilabili! + +minecraftforum contiene una sezione dedicata alla Xbox 360 Edition. + +Alcuni animali ti seguiranno se hai del grano in mano. + +Se un animale non può spostarsi per più di 20 blocchi in qualsiasi direzione non sparirà. + +Musica di C418! + +Oltre un milione di persone seguono Notch su Twitter! + +Non tutti gli svedesi sono biondi. Alcuni, come Jens della Mojang, hanno addirittura i capelli rossi! + +Riteniamo che 4J Studios abbia rimosso Herobrine dal gioco per Xbox 360, ma non ne siamo sicuri. + +Presto verrà rilasciato un aggiornamento per questo gioco! + +Chi è Notch? + +La Mojang ha più premi che dipendenti! + +Alcune celebrità giocano a Minecraft! + +A deadmau5 piace Minecraft! + +Non guardare direttamente i bug. + +I creeper sono il risultato di un bug di codifica. + +È una gallina o un'anatra? + +Hai partecipato alla Minecon? + +Nessuno a Mojang ha mai visto una faccia del genere. + +Sapevi che c'è anche una Wiki di Minecraft? + +Il nuovo ufficio di Mojang è fico! + +Minecraft: Xbox 360 Edition ha battuto diversi record! + +La Minecon 2013 si è svolta a Orlando, Florida, negli Stati Uniti d'America! + +.party() è stato fantastico! + +Invece di dare credito ai pettegolezzi, dai sempre per scontato che siano falsi! + +{*T3*}COME GIOCARE: BASI{*ETW*}{*B*}{*B*} +In Minecraft si posizionano blocchi per costruire tutto ciò che vuoi. Di notte i mostri vagano in libertà, quindi costruisci un riparo per tempo.{*B*}{*B*} +Usa{*CONTROLLER_ACTION_LOOK*} per guardarti intorno.{*B*}{*B*} +Usa{*CONTROLLER_ACTION_MOVE*} per muoverti.{*B*}{*B*} +Premi{*CONTROLLER_ACTION_JUMP*} per saltare.{*B*}{*B*} +Sposta in avanti{*CONTROLLER_ACTION_MOVE*} due volte in rapida successione per scattare. Finché tieni premuto {*CONTROLLER_ACTION_MOVE*}, il personaggio continuerà a scattare, a meno che il tempo per lo scatto non si esaurisca o nella barra del cibo restino meno di{*ICON_SHANK_03*}.{*B*}{*B*} +Tieni premuto{*CONTROLLER_ACTION_ACTION*} per scavare e abbattere alberi usando la mano o un oggetto. Potresti dover creare un attrezzo per scavare i blocchi.{*B*}{*B*} +Se tieni un oggetto in mano, usa{*CONTROLLER_ACTION_USE*} per utilizzarlo, oppure premi{*CONTROLLER_ACTION_DROP*} per posarlo. + +{*T3*}COME GIOCARE: INTERFACCIA{*ETW*}{*B*}{*B*} +L'interfaccia mostra informazioni sul tuo stato: salute, ossigeno rimasto (quando sei sott'acqua), livello di fame (devi mangiare per reintegrare la barra) e armatura (se la indossi). Se subisci dei danni, ma nella tua barra del cibo ci sono 9 o più{*ICON_SHANK_01*}, la tua salute si ripristinerà automaticamente. Mangiare reintegrerà la barra del cibo.{*B*} +Qui è visualizzata anche la barra dell'esperienza, che mostra il tuo livello di Esperienza corrente e quanti punti Esperienza ti mancano per raggiungere il livello successivo. Guadagni punti Esperienza raccogliendo le sfere Esperienza abbandonate dai nemici uccisi, scavando certi tipi di blocchi, facendo riprodurre animali, pescando e fondendo minerali in una fornace.{*B*}{*B*} +L'interfaccia mostra anche gli oggetti disponibili. Usa{*CONTROLLER_ACTION_LEFT_SCROLL*} e{*CONTROLLER_ACTION_RIGHT_SCROLL*} per cambiare l'oggetto che tieni in mano. + +{*T3*}COME GIOCARE: INVENTARIO{*ETW*}{*B*}{*B*} +Usa{*CONTROLLER_ACTION_INVENTORY*} per visualizzare l'inventario.{*B*}{*B*} +Questa schermata mostra gli oggetti che puoi tenere in mano e quelli che trasporti, nonché la tua eventuale armatura.{*B*}{*B*} +Usa{*CONTROLLER_MENU_NAVIGATE*} per muovere il puntatore. Usa{*CONTROLLER_VK_A*} per prendere l'oggetto sotto il puntatore. Se c'è più di un oggetto, verranno raccolti tutti; per raccoglierne solo la metà, premi{*CONTROLLER_VK_X*}.{*B*}{*B*} +Sposta l'oggetto in un'altra casella dell'inventario usando il puntatore e collocalo con{*CONTROLLER_VK_A*}. Se il puntatore ha selezionato più oggetti, usa{*CONTROLLER_VK_A*} per collocarli tutti oppure{*CONTROLLER_VK_X*} per collocarne uno solo.{*B*}{*B*} +Se il puntatore è posizionato su un'armatura, un aiuto contestuale ti consentirà di spostarla rapidamente nello slot appropriato dell'inventario.{*B*}{*B*} +Puoi cambiare il colore dell'armatura di pelle usando una tintura. Per farlo, prendi la tintura nell'inventario usando il puntatore, poi premi{*CONTROLLER_VK_X*} mentre il puntatore è sull'oggetto il cui colore desideri cambiare. + + +{*T3*}COME GIOCARE: CASSA{*ETW*}{*B*}{*B*} +Una volta creata una cassa, puoi collocarla nel mondo e usarla con{*CONTROLLER_ACTION_USE*} per conservare gli oggetti dell'inventario.{*B*}{*B*} +Usa il puntatore per spostare oggetti dall'inventario alla cassa e viceversa.{*B*}{*B*} +Gli oggetti nella cassa resteranno a tua disposizione e potrai riportarli nell'inventario in seguito. + + +{*T3*}COME GIOCARE: CASSA GRANDE{*ETW*}{*B*}{*B*} +Due casse collocate una accanto all'altra si combinano per formare una cassa grande in grado di contenere più oggetti.{*B*}{*B*} +Puoi usarla come la cassa normale. + + +{*T3*}COME GIOCARE: CRAFTING{*ETW*}{*B*}{*B*} +Nell'interfaccia Crafting, puoi combinare oggetti dell'inventario per creare nuovi tipi di oggetti. Usa{*CONTROLLER_ACTION_CRAFTING*} per aprire l'interfaccia Crafting.{*B*}{*B*} +Scorri le schede in alto usando{*CONTROLLER_VK_LB*} e{*CONTROLLER_VK_RB*} per selezionare il tipo di oggetto, poi usa{*CONTROLLER_MENU_NAVIGATE*} per selezionare l'oggetto da creare.{*B*}{*B*} +L'area crafting mostra gli ingredienti richiesti per creare il nuovo oggetto. Premi{*CONTROLLER_VK_A*} per creare l'oggetto e inserirlo nell'inventario. + + +{*T3*}COME GIOCARE: TAVOLO DA LAVORO{*ETW*}{*B*}{*B*} +Puoi creare oggetti più grandi usando il tavolo da lavoro.{*B*}{*B*} +Colloca il tavolo nel mondo e premi{*CONTROLLER_ACTION_USE*} per usarlo.{*B*}{*B*} +La creazione al tavolo funziona come il crafting di base, ma hai a disposizione un'area più ampia e una più vasta selezione di oggetti da creare. + + +{*T3*}COME GIOCARE: FORNACE{*ETW*}{*B*}{*B*} +La fornace ti consente di modificare oggetti cuocendoli. Per esempio, nella fornace puoi trasformare il minerale di ferro in lingotti di ferro.{*B*}{*B*} +Colloca la fornace nel mondo e premi{*CONTROLLER_ACTION_USE*} per usarla.{*B*}{*B*} +Dovrai inserire del combustibile nella parte inferiore della fornace e l'oggetto da modificare nella parte superiore. A quel punto, la fornace si attiverà.{*B*}{*B*} +Una volta fusi i tuoi oggetti, puoi spostarli dall'area di produzione all'inventario.{*B*}{*B*} +Se il puntatore è posizionato su ingredienti o combustibili per la fornace, degli aiuti contestuali ti consentiranno di spostarli rapidamente nella fornace. + + +{*T3*}COME GIOCARE: DISPENSER{*ETW*}{*B*}{*B*} +Il dispenser serve per far uscire gli oggetti. Per attivare il dispenser, dovrai collocarvi accanto un interruttore, per esempio una leva.{*B*}{*B*} +Per riempire il dispenser di oggetti, premi{*CONTROLLER_ACTION_USE*}, quindi sposta gli oggetti desiderati dall'inventario al dispenser.{*B*}{*B*} +Ora, quando userai l'interruttore, il dispenser farà uscire un oggetto. + + +{*T3*}COME GIOCARE: DISTILLAZIONE{*ETW*}{*B*}{*B*} +Per distillare pozioni occorre munirsi di un Banco di distillazione, costruendolo presso un tavolo da lavoro. L'ingrediente principale di tutte le pozioni è una bottiglia d'acqua, che si ottiene riempiendo una Bottiglia di vetro con acqua attinta da un Calderone o da un'altra fonte.{*B*} +Il Banco di distillazione ha tre slot e permette di realizzare tre pozioni contemporaneamente. Dal momento che uno stesso ingrediente può essere usato in tutte e tre le bottiglie, è consigliabile produrre sempre tre pozioni insieme, in modo da ottimizzare l'uso delle risorse.{*B*} +Inserendo un ingrediente nella posizione più alta del Banco di distillazione si otterrà, dopo un breve periodo di tempo, una pozione di base. La pozione così ottenuta non ha alcun effetto; per renderla efficace, bisognerà distillare un secondo ingrediente.{*B*} +L'aggiunta di un terzo ingrediente può rendere l'effetto della pozione più durevole (se si usa Polvere di pietra rossa) o più intenso (se si usa Polvere di pietra brillante), o rendere nociva la pozione (se si usa un Occhio di ragno fermentato).{*B*} +Aggiungendo della polvere da sparo, si può trasformare una qualsiasi pozione in una Bomba pozione che, una volta lanciata, diffonderà il suo effetto nell'area colpita.{*B*} + +Gli ingredienti utilizzabili nelle pozioni sono :{*B*}{*B*} +* {*T2*}Verruca del Sottomondo{*ETW*}{*B*} +* {*T2*}Occhio di ragno{*ETW*}{*B*} +* {*T2*}Zucchero{*ETW*}{*B*} +* {*T2*}Lacrima di Ghast{*ETW*}{*B*} +* {*T2*}Polvere di Vampe{*ETW*}{*B*} +* {*T2*}Crema di magma{*ETW*}{*B*} +* {*T2*}Melone scintillante{*ETW*}{*B*} +* {*T2*}Polvere di pietra rossa{*ETW*}{*B*} +* {*T2*}Polvere di pietra brillante{*ETW*}{*B*} +* {*T2*}Occhio di ragno fermentato{*ETW*}{*B*}{*B*} + +Le combinazioni possibili sono numerose, e ognuna produce una pozione con un effetto diverso. + + +{*T3*}COME GIOCARE: INCANTESIMI{*ETW*}{*B*}{*B*} +I punti Esperienza guadagnati uccidendo i nemici, oppure scavando o fondendo in una fornace determinati tipi di blocchi, possono essere usati per incantare attrezzi, armi, armature e libri.{*B*} +Quando posizioni una Spada, un Arco, un'Ascia, una Piccozza, una Pala, un'Armatura o un Libro nello slot sotto il libro nel Tavolo per incantesimi, sui tre pulsanti a destra saranno visualizzati alcuni incantesimi e il livello di Esperienza che richiedono.{*B*} +Se hai abbastanza Esperienza per applicare un incantesimo all'oggetto, la cifra apparirà in verde; in caso contrario, apparirà in rosso.{*B*}{*B*} +L'incantesimo sarà selezionato casualmente in base al costo indicato.{*B*}{*B*} +Se il Tavolo per incantesimi è circondato da Scaffali (fino a un massimo di 15), con uno spazio pari a un blocco tra lo Scaffale e il Tavolo, la potenza degli incantesimi aumenterà e dal libro posto sul Tavolo scaturiranno dei simboli arcani.{*B*}{*B*} +Tutti gli ingredienti per un Tavolo per incantesimi possono essere trovati nei villaggi oppure ottenuti scavando e coltivando.{*B*}{*B*} +I Libri incantati si usano con l'incudine per lanciare incantesimi sugli oggetti. In questo modo avrai maggiori possibilità di scegliere gli incantesimi di cui vuoi che i tuoi oggetti siano dotati.{*B*} + + +{*T3*}COME GIOCARE: ALLEVARE GLI ANIMALI{*ETW*}{*B*}{*B*} +Se vuoi che gli animali rimangano nel solito posto, crea una zona recintata di 20x20 blocchi e sistema gli animali là dentro. In questo modo sarai sicuro di ritrovarli dove li hai lasciati. + + +{*T3*}COME GIOCARE: RIPRODUZIONE{*ETW*}{*B*}{*B*} +Gli animali di Minecraft possono riprodursi e dar vita a versioni in miniatura di se stessi!{*B*} +Per far riprodurre un animale, devi prima farlo entrare in "modalità Amore" nutrendolo con l'alimento adatto.{*B*} +Dai Grano a una mucca, muccafungo o pecora, Carote ai maiali, Semi di grano o Verruche del Sottomondo a una gallina, o qualsiasi tipo di carne a un lupo, e cominceranno a cercare nei dintorni un altro animale della stessa specie che sia a sua volta in modalità Amore.{*B*} +Quando l'avrà trovato, i due si scambieranno effusioni per qualche secondo e poi apparirà un cucciolo. Il piccolo seguirà i genitori per un certo periodo di tempo prima di diventare adulto.{*B*} +Devono passare circa cinque minuti prima che un animale possa entrare nuovamente in modalità Amore.{*B*} +C'è un limite al numero di animali che si può avere in un mondo, e questo potrebbe essere il motivo per cui non si riproducono. + +{*T3*}COME GIOCARE: SOTTOPORTALE{*ETW*}{*B*}{*B*} +Il sottoportale consente al giocatore di spostarsi tra il Sopramondo e il Sottomondo. Il Sottomondo serve per viaggiare velocemente nel Sopramondo: una distanza di un blocco nel Sottomondo equivale a 3 blocchi nel Sopramondo, quindi quando costruisci un portale nel Sottomondo e lo usi per uscire, ti troverai a una distanza triplicata rispetto al punto di entrata.{*B*}{*B*} +La costruzione del portale richiede un minimo di 10 blocchi di ossidiana. Il portale deve essere alto 5 blocchi, largo 4 e profondo 1. Una volta costruita la struttura del portale, lo spazio interno dev'essere incendiato per attivarlo. Per farlo, usa pietra focaia e acciarino oppure l'oggetto Scarica di fuoco.{*B*}{*B*} +L'immagine a destra mostra alcuni esempi di costruzione di un portale. + + +{*T3*}COME GIOCARE: MULTIPLAYER{*ETW*}{*B*}{*B*} +Minecraft per Xbox 360 è un gioco multiplayer per impostazione predefinita. Se giochi in alta definizione, puoi aggiungere giocatori locali alla partita collegando altri controller e premendo START in qualsiasi momento.{*B*}{*B*} +Quando avvii o accedi a una partita online, essa sarà visibile alle persone incluse nella tua lista amici (a meno che, come host, tu non abbia selezionato l'opzione "Solo invito") e, se entreranno nella partita, essa sarà visibile alle persone incluse nella loro lista amici (se hai selezionato l'opzione "Accetta amici di amici"){*B*} +Durante una partita, premi il pulsante BACK per richiamare un elenco di tutti i giocatori e visualizzarne la scheda giocatore, e per espellere o invitare altri utenti. + + +{*T3*}COME GIOCARE: CONDIVISIONE DI SCREENSHOT{*ETW*}{*B*}{*B*} +Puoi salvare uno screenshot del gioco visualizzando il menu di pausa e premendo{*CONTROLLER_VK_Y*} per condividerlo su Facebook. Apparirà un'anteprima in miniatura dello screenshot e potrai modificare il testo associato al post di Facebook.{*B*}{*B*} +Esiste una modalità fotografica appositamente progettata per il salvataggio di screenshot, che ti consente di vedere il tuo personaggio frontalmente: premi{*CONTROLLER_ACTION_CAMERA*} finché non vedi la parte frontale del personaggio, poi premi{*CONTROLLER_VK_Y*} per condividere.{*B*}{*B*} +I gamertag non vengono visualizzati nello screenshot. + + +{*T3*}COME GIOCARE: ESCLUSIONE DI LIVELLI{*ETW*}{*B*}{*B*} +Se trovi dei contenuti offensivi all'interno di un livello che stai giocando, puoi scegliere di aggiungere questo livello all'elenco dei livelli esclusi. +Per farlo, visualizza il menu di pausa, quindi premi{*CONTROLLER_VK_RB*} per selezionare lo strumento Escludi livello. +Quando tenterai di accedere a questo livello in futuro, verrà visualizzata una notifica per segnalarti che quel livello fa parte dell'elenco dei livelli esclusi e potrai scegliere se annullare l'operazione o rimuovere il livello dall'elenco e accedervi. + +{*T3*}COME GIOCARE: MODALITÀ CREATIVA{*ETW*}{*B*}{*B*} +L'interfaccia della modalità Creativa consente al giocatore di spostare nel proprio inventario qualsiasi oggetto senza doverlo scavare o creare. +Gli oggetti presenti nell'inventario non saranno rimossi quando vengono posizionati o usati nel mondo; in questo modo, il giocatore non dovrà preoccuparsi di raccogliere risorse e potrà concentrarsi sulla costruzione.{*B*} +Se crei, carichi o salvi un mondo in modalità Creativa, gli obiettivi e gli aggiornamenti di classifica saranno disabilitati e lo resteranno anche se quel mondo verrà successivamente caricato in modalità Sopravvivenza.{*B*} +Per volare mentre sei in modalità Creativa, premi rapidamente {*CONTROLLER_ACTION_JUMP*} due volte. Ripeti l'azione per interrompere il volo. Per volare più rapidamente, sposta in avanti{*CONTROLLER_ACTION_MOVE*} due volte in rapida successione mentre stai volando. +Durante il volo, puoi tenere premuto{*CONTROLLER_ACTION_JUMP*} per salire e{*CONTROLLER_ACTION_SNEAK*} per scendere, oppure usare{*CONTROLLER_ACTION_DPAD_UP*} per salire e {*CONTROLLER_ACTION_DPAD_DOWN*} per scendere, +{*CONTROLLER_ACTION_DPAD_LEFT*} per andare a sinistra e {*CONTROLLER_ACTION_DPAD_RIGHT*} per andare a destra. + +{*T3*}COME GIOCARE: OPZIONI DELL'HOST E DEL GIOCATORE{*ETW*}{*B*}{*B*} + +{*T1*}Opzioni di gioco{*ETW*}{*B*} +Quando carichi o crei un mondo, se premi il pulsante "Altre opzioni" accederai a un menu che ti consente di avere maggior controllo sul gioco.{*B*}{*B*} + + {*T2*}Giocatore vs Giocatore{*ETW*}{*B*} + Se l'opzione è attivata, è possibile infliggere danni agli altri giocatori. Quest'opzione ha effetto esclusivamente nella modalità Sopravvivenza.{*B*}{*B*} + + {*T2*}Autorizza giocatori{*ETW*}{*B*} + Se l'opzione non è attivata, i giocatori che si uniscono alla partita non potranno svolgere determinate azioni, come scavare, usare oggetti, posizionare blocchi, utilizzare porte, interruttori e contenitori, attaccare gli altri giocatori o gli animali. È possibile modificare le opzioni dei singoli giocatori accedendo al menu di gioco.{*B*}{*B*} + + {*T2*}Diffusione incendio{*ETW*}{*B*} + Se l'opzione è attivata, il fuoco può propagarsi ai blocchi infiammabili vicini. Quest'opzione può essere modificata anche durante il gioco.{*B*}{*B*} + + {*T2*}Esplosione TNT{*ETW*}{*B*} + Se l'opzione è attivata, il TNT esplode quando viene fatto detonare. Quest'opzione può essere modificata anche durante il gioco.{*B*}{*B*} + + {*T2*}Privilegi dell'host{*ETW*}{*B*} + Se l'opzione è abilitata, l'host, tramite il menu di gioco, può attivare o disattivare la possibilità di volare, disabilitare la stanchezza e rendersi invisibile. {*DISABLES_ACHIEVEMENTS*}{*B*}{*B*} + + {*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*} + + {*T2*}Genera strutture{*ETW*}{*B*} + Se l'opzione è abilitata, nel mondo saranno generate strutture come Villaggi e Fortezze.{*B*}{*B*} + + {*T2*}Mondo superpiatto{*ETW*}{*B*} + Se l'opzione è attivata, sarà generato un mondo completamente piatto, sia nel Sopramondo sia nel Sottomondo.{*B*}{*B*} + + {*T2*}Cassa bonus{*ETW*}{*B*} + Se l'opzione è attivata, vicino al punto di generazione del giocatore apparirà una cassa contenente alcuni oggetti utili.{*B*}{*B*} + + {*T1*}Resetta Sottomondo{*ETW*}{*B*} + Quando è attivato, il Sottomondo sarà rigenerato. Questa funzionalità può essere molto utile se hai dei vecchi salvataggi in cui le Fortezze del Sottomondo non erano presenti.{*B*}{*B*} + + {*T1*}Opzioni di gioco{*ETW*}{*B*} + Durante la partita, premi{*BACK_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*} + +{*T1*}Opzioni del giocatore{*ETW*}{*B*} +Per modificare i privilegi di un giocatore, seleziona il suo nome e premi{*CONTROLLER_VK_A*} per accedere al menu dei privilegi del giocatore, dove potrai agire sulle seguenti opzioni.{*B*}{*B*} + + {*T2*}Può costruire e scavare{*ETW*}{*B*} + 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*} + 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*} + 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*} + 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*} + 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*} + {*KICK_PLAYER_DESCRIPTION*}{*B*}{*B*} + +{*T1*}Opzioni del giocatore host{*ETW*}{*B*} +Se l'opzione "Privilegi dell'host" è attivata, l'host può modificare da solo alcuni privilegi. Per modificare i privilegi di un giocatore, seleziona il suo nome e premi{*CONTROLLER_VK_A*} per aprire il menu dei privilegi del giocatore e accedere alle seguenti opzioni.{*B*}{*B*} + + {*T2*}Può volare{*ETW*}{*B*} + Se l'opzione è attivata, il giocatore è in grado di volare. L'opzione ha effetto esclusivamente sulla modalità Sopravvivenza, perché in modalità Creativa, tutti i giocatori possono volare.{*B*}{*B*} + + {*T2*}Disabilita stanchezza{*ETW*}{*B*} + L'opzione ha effetto esclusivamente sulla modalità Sopravvivenza. Se attivata, le attività fisiche (camminare, correre, saltare e altre ancora) non fanno 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 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 + +Basi + +Interfaccia + +Inventario + +Casse + +Crafting + +Fornace + +Dispenser + +Allevare gli animali + +Riproduzione animali + +Distillazione + +Incantesimi + +Sottoportale + +Multiplayer + +Condivisione di screenshot + +Esclusione di livelli + +Modalità Creativa + +Opzioni dell'host e del giocatore + +Commercio + +Incudine + +Limite + +{*T3*}COME GIOCARE : IL LIMITE{*ETW*}{*B*}{*B*} +Il Limite è un'altra dimensione del gioco, che può essere raggiunta tramite un Portale del Limite attivo. Il Portale del Limite si trova in una fortezza posta nelle profondità sotterranee del Sopramondo.{*B*} +Per attivare il portale è necessario inserire un Occhio di Ender nei Telai del Portale del Limite che non ne hanno uno.{*B*} +Una volta che il Portale del Limite è attivo, ti basterà attraversarlo per raggiungere il Limite.{*B*}{*B*} +Nel Limite incontrerai il Drago di Ender, nemico forte e fiero, oltre agli Enderman, quindi dovrai prepararti a dovere prima di intraprendere il viaggio!{*B*}{*B*} +Scoprirai che, per rigenerarsi, il Drago di Ender usa i Cristalli di Ender che si trovano su otto punte di ossidiana, +quindi la prima cosa che dovrai fare è distruggere tutti i cristalli.{*B*} +Puoi colpire i primi con le frecce, ma i successivi sono protetti da una gabbia di metallo, e quindi dovrai trovare il modo di avvicinarti.{*B*}{*B*} +Nel frattempo, il Drago di Ender ti attaccherà dall'alto e ti lancerà contro delle sfere di acido!{*B*} +Se ti avvicini al piedistallo dell'uovo posto al centro delle punte, il Drago di Ender scenderà in picchiata per affrontarti: quello sarà il momento giusto per attaccarlo e infliggergli pesanti danni!{*B*} +Evita l'acido e mira agli occhi del Drago di Ender per ottenere i risultati migliori. Se puoi, porta degli amici con te nel Limite, così ti aiuteranno a trionfare in questa difficile battaglia!{*B*}{*B*} +Una volta che sarai nel Limite, i tuoi amici potranno vedere sulla loro mappa l'ubicazione del Portale del Limite nella Fortezza, +così saranno in grado di raggiungerti facilmente. + + +Scatto + +Novità + +{*T3*}Modifiche e aggiunte{*ETW*}{*B*}{*B*} +- 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*} - 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. + +Serve per scavare blocchi di pietra e minerali. + +Si usa per abbattere blocchi di legno più in fretta che a mano. + +Si usa per arare blocchi di terra ed erba e prepararli per il raccolto. + +Le porte di legno si attivano usandole, colpendole o con una pietra rossa. + +Le porte di ferro si aprono solo con pietra rossa, pulsanti o interruttori. + +NOT USED + +NOT USED + +NOT USED + +NOT USED + +Si indossa per ottenere 1 punto armatura. + +Si indossano per ottenere 3 punti armatura. + +Si indossa per ottenere 2 punti armatura. + +Si indossa per ottenere 1 punto armatura. + +Si indossa per ottenere 2 punti armatura. + +Si indossa per ottenere 5 punti armatura. + +Si indossa per ottenere 4 punti armatura. + +Si indossa per ottenere 1 punto armatura. + +Si indossa per ottenere 2 punti armatura. + +Si indossa per ottenere 6 punti armatura. + +Si indossa per ottenere 5 punti armatura. + +Si indossa per ottenere 2 punti armatura. + +Si indossa per ottenere 2 punti armatura. + +Si indossa per ottenere 5 punti armatura. + +Si indossano per ottenere 3 punti armatura. + +Si indossa per ottenere 1 punto armatura. + +Si indossano per ottenere 3 punti armatura. + +Si indossa per ottenere 8 punti armatura. + +Si indossa per ottenere 6 punti armatura. + +Si indossano per ottenere 3 punti armatura. + +Lingotto lucente utilizzabile per creare oggetti di questo materiale. Si crea fondendo minerali nella fornace. + +Consente di trasformare lingotti, gemme o tinture in blocchi collocabili. Si può usare come blocco da costruzione costoso o come magazzino compatto per minerali. + +Quando un giocatore, un animale o un mostro ci passa sopra, prende la scossa. La piastra a pressione di legno si attiva anche facendoci cadere sopra qualcosa. + +Si usa per le scale compatte. + +Si usa per creare scale lunghe. Due lastre una sopra l'altra creano un blocco doppio di dimensioni normali. + +Si usa per 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. + +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. + +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. + +Reintegra 1{*ICON_SHANK_01*}. + +Reintegra 1{*ICON_SHANK_01*}. + +Fa recuperare 3 {*ICON_SHANK_01*}. + +Reintegra 1{*ICON_SHANK_01*}, o può essere cucinato nella fornace. Può farti star male. + +Reintegra 3{*ICON_SHANK_01*}. Si crea cucinando il pollo crudo nella fornace. + +Reintegra 1,5{*ICON_SHANK_01*}, o può essere cucinato in una fornace. + +Reintegra 4{*ICON_SHANK_01*}. Si crea cucinando il manzo crudo nella fornace. + +Reintegra 1,5{*ICON_SHANK_01*}, o può essere cucinato in una fornace. + +Reintegra 4{*ICON_SHANK_01*}. Si crea cucinando una costoletta di maiale in una fornace. + +Reintegra 1{*ICON_SHANK_01*} o si può cucinare in una fornace. Può essere dato a un ocelot per ammansirlo. + +Reintegra 2,5{*ICON_SHANK_01*}. Si crea cucinando pesce crudo in una fornace. + +Reintegra 2{*ICON_SHANK_01*} e si può usare per creare una mela d'oro. + +Reintegra 2{*ICON_SHANK_01*} e rigenera la salute per 4 secondi. Si crea usando una mela e dalle pepite d'oro. + +Reintegra 2{*ICON_SHANK_01*}, ma può avvelenarti. + +Si usa nella ricetta per la torta come ingrediente per preparare pozioni. + +Accendila o spegnila per generare una scarica elettrica. Rimane accesa o spenta finché non la premi di nuovo. + +Invia costantemente una scarica elettrica e si può usare anche come ricevitore/trasmettitore se collegata a un lato del blocco. +È anche una debole fonte di illuminazione. + +Si usa nei circuiti a pietre rosse come ripetitore, ritardante e/o diodo. + +Premilo per generare una scarica elettrica. Rimane attivo per circa un secondo prima di spegnersi di nuovo. + +Si usa per conservare e distribuire oggetti in ordine casuale quando riceve una carica di pietra rossa. + +Quando si attiva, suona una nota. Colpiscilo per cambiare tonalità. Mettilo sopra blocchi diversi per cambiare il tipo di strumento. + +Si usano per guidare i carrelli da miniera. + +Accesi, fanno accelerare i carrelli da miniera che ci passano sopra. Spenti, fanno fermare i carrelli da miniera. + +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. + +Si usa per trasportare merci sui binari. + +Si muove sui binari e spinge altri carrelli da miniera se ci metti del carbone. + +Si usa per spostarsi nell'acqua più velocemente che a nuoto. + +Si ottiene dalle pecore e si può colorare con le tinture. + +Si usa come materiale da costruzione e si può colorare con le tinture. Ricetta sconsigliata, in quanto la lana è facilmente ottenibile dalle pecore. + +Si usa come tintura per creare lana nera. + +Si usa come tintura per creare lana verde. + +Si usano come tintura per creare lana marrone, come ingrediente per preparare biscotti e per far crescere frutti di cacao. + +Si usa come tintura per creare lana argento. + +Si usa come tintura per creare lana gialla. + +Si usa come tintura per creare lana rossa. + +Si usa per far crescere immediatamente colture, alberi, erba alta, funghi giganti e fiori e si impiega nelle ricette delle tinture. + +Si usa come tintura per creare lana rosa. + +Si usa come tintura per creare lana arancione. + +Si usa come tintura per creare lana verde lime. + +Si usa come tintura per creare lana grigia. + +Usata come tintura per la lana grigio chiaro. +(Nota: si può anche preparare con tintura grigia e farina d'ossa, avendone quattro per sacca di inchiostro, invece di tre.) + +Si usa come tintura per creare lana azzurra. + +Si usa come tintura per creare lana turchese. + +Si usa come tintura per creare lana viola. + +Si usa come tintura per creare lana magenta. + +Si usa come tintura per creare lana blu. + +Suona dischi. + +Utilizzabile per creare attrezzi, armi o armature molto robusti. + +Fa più luce della torcia. Scioglie ghiaccio e neve e si può usare anche sott'acqua. + +Si usa per creare libri e mappe. + +Si usa per costruire scaffali o si può incantare per creare Libri incantati. + +Permette di creare incantesimi più potenti se lo si mette intorno al Tavolo per incantesimi. + +Si usa come decorazione. + +Si scava con una piccozza di ferro o migliore, poi si fonde nella fornace per produrre lingotti d'oro. + +Si scava con una piccozza di pietra o migliore, poi si fonde nella fornace per produrre lingotti di ferro. + +Si scava con una piccozza per ottenere carbone. + +Si scava con una piccozza di pietra o migliore per ottenere lapislazzuli. + +Si scava con una piccozza di ferro o migliore per ottenere diamanti. + +Si scava con una piccozza di ferro o migliore per ottenere polvere di pietra rossa. + +Si scava con una piccozza per ottenere ciottoli. + +Si ottiene con la pala. Si può usare per la costruzione. + +Si può piantare per far crescere un albero. + +Non si rompe. + +Dà fuoco a qualsiasi cosa tocca. Si può raccogliere in un secchio. + +Si ottiene con la pala. Si fonde in vetro usando la fornace. Subisce la gravità se sotto non ci sono altre tessere. + +Si ottiene con la pala. A volte produce una pietra focaia. Subisce la gravità se sotto non ci sono altre tessere. + +Si abbatte con l'ascia e si può tagliare in assi o usare come combustibile. + +Si crea nella fornace fondendo la sabbia. Si può usare per la costruzione, ma si rompe se cerchi di prenderlo. + +Si estrae dalla pietra usando la piccozza. Si può usare per costruire una fornace o attrezzi di pietra. + +Risultato della cottura dell'argilla in una fornace. + +Si inserisce nella fornace per creare mattoni. + +Quando viene rotta, rilascia delle sfere di argilla che possono essere cotte in una fornace per creare dei mattoni. + +Per conservare le palle di neve in poco spazio. + +Si può scavare con una pala per creare palle di neve. + +Può produrre Semi di grano quando viene tagliata. + +Si usa per creare tinture. + +Si usa con la ciotola per fare la zuppa. + +Si scava solo con una piccozza di diamante. Nasce dall'incontro tra acqua e lava e si usa per creare portali. + +Genera mostri nel mondo. + +Si posa a terra per condurre elettricità. Se si usa per preparare una pozione, aumenta la durata dell'effetto. + +Le colture si possono mietere per ottenere grano. + +Terreno pronto per piantare semi. + +Si può cuocere in fornace per produrre tintura verde. + +Si può usare per produrre zucchero. + +Si può indossare come elmo o unire a una torcia per creare una zucca di Halloween. È anche l'ingrediente principale per la torta di zucca. + +Una volta accesa, brucia per sempre. + +Rallentano il movimento di qualsiasi cosa ci passi sopra. + +Entra nel portale per spostarti tra il Sopramondo e il Sottomondo. + +Si usa come combustibile per la fornace o per creare una torcia. + +Si ottiene uccidendo un ragno e si usa per creare archi o canne da pesca. Si può anche mettere per terra per creare un filo. + +Si ottiene uccidendo una gallina e si usa per creare una freccia. + +Si ottiene uccidendo un creeper e si usa per creare del TNT, oppure come ingrediente per preparare pozioni. + +Si possono piantare e coltivare su una zolla. Assicurati che vi sia luce a sufficienza per far crescere i semi! + +Si ottiene dalle colture e si può usare per creare cibo. + +Si ottiene scavando nella ghiaia e si può usare per creare acciarino e pietra focaia. + +Si usa sui maiali per poterli cavalcare. Il maiale cavalcato può essere controllato usando carota e bastone. + +Si ottiene scavando nella neve e si può lanciare. + +Si ottiene uccidendo una mucca e si usa per creare un'armatura o per fare libri. + +Si ottiene uccidendo uno slime e si usa come ingrediente per preparare pozioni o per costruire pistoni appiccicosi. + +Viene deposto casualmente dalle galline e si può usare per creare cibi. + +Si ottiene scavando nella pietra brillante e si può usare per creare blocchi di pietra brillante. Si può anche utilizzare insieme alle pozioni per rendere più potente il loro effetto. + +Si ottiene uccidendo uno scheletro. Si usa per produrre farina d'ossa. Può essere dato in pasto a un lupo per ammansirlo. + +Si ottiene facendo uccidere un creeper da uno scheletro. Si può suonare in un jukebox. + +Spegne il fuoco e favorisce la crescita delle colture. Si può raccogliere in un secchio. + +Quando si rompono, a volte fanno cadere un arbusto che può essere trapiantato per far crescere un albero. + +Si trova nei dungeon e si può usare per costruire e decorare. + +Si usa per ottenere lana dalle pecore e ottenere blocchi foglia. + +Quando è alimentato (attraverso un pulsante, una leva, una piastra a pressione, una torcia pietra rossa o pietra rossa con uno qualsiasi di questi), se possibile il pistone si estende e spinge i blocchi. + +Quando è alimentato (attraverso un pulsante, una leva, una piastra a pressione, una torcia pietra rossa o pietra rossa con uno qualsiasi di questi), se possibile il pistone si estende e spinge i blocchi. Quando si ritrae, tira anche il blocco a contatto con la parte estesa del pistone. + +Creato utilizzando blocchi di pietra. Si trova comunemente nelle fortezze. + +Si usa come barriera, analogamente alle recinzioni. + +Simile a una porta, ma usato principalmente nelle recinzioni. + +Può essere creato usando Fette di melone. + +Blocchi trasparenti che possono essere usati come alternativa ai blocchi di vetro. + +Si possono piantare per far crescere delle zucche. + +Si possono piantare per far crescere dei meloni. + +Viene deposta dagli Enderman quando muoiono. Lanciando la Perla di Ender, il giocatore verrà teletrasportato nel punto in cui essa atterra, ma perderà un po' di salute. + +Un blocco di terra coperto d'erba. Si ottiene con la pala. Si può usare per la costruzione. + +Si può usare per costruire e decorare. + +Attraversarla rallenta i movimenti. Può essere distrutta con le forbici per raccogliere corda. + +Genera un Pesciolino d'argento quando viene distrutto. Può anche generare un Pesciolino d'argento se nelle vicinanze c'è un altro Pesciolino d'argento sotto attacco. + +Una volta posizionato, cresce nel corso del tempo. Si può raccogliere usando le forbici. Ci si può salire come su una scala. + +Superficie scivolosa. Si trasforma in acqua se si trova sopra un altro blocco quando questo viene distrutto. Si scioglie se posizionato nei pressi di una fonte di luce o nel Sottomondo. + +Si può usare come decorazione. + +Si usa come ingrediente di pozioni e per individuare Fortezze. Viene abbandonata dalle Vampe che si trovano nei pressi delle Fortezze del Sottomondo o al loro interno. + +Si usa come ingrediente di pozioni. Viene deposta dai Ghast quando muoiono. + +Viene deposta dagli uomini-maiale zombie quando muoiono. Gli uomini-maiale zombie si trovano nel Sottomondo. Si può usare come ingrediente per preparare pozioni. + +Si usa come ingrediente di pozioni. Cresce spontaneamente nelle Fortezze del Sottomondo. Si può piantare anche nelle Sabbie mobili. + +Può avere effetti diversi a seconda dell'oggetto su cui viene usata. + +Può essere riempita d'acqua e usata come ingrediente di base per preparare pozioni nel Banco di distillazione. + +Cibo velenoso e ingrediente per pozioni tossiche. Viene deposto dai Ragni o Ragni delle grotte uccisi dal giocatore. + +Si usa come ingrediente di pozioni, soprattutto nelle pozioni con effetti negativi. + +Si usa come ingrediente di pozioni o insieme ad altri oggetti per creare l'Occhio di Ender o la Crema di magma. + +Si usa come ingrediente di pozioni. + +Si usa per produrre Pozioni e Bombe pozione. + +Può essere riempito d'acqua mettendolo sotto la pioggia oppure usando un secchio, poi lo si può utilizzare per riempire d'acqua Bottiglie di vetro. + +Quando viene lanciato, l'Occhio di Ender mostra la posizione di un Portale del Limite. Dodici Occhi inseriti nel Telaio di un portale del Limite attivano il Portale stesso. + +Si usa come ingrediente di pozioni. + +Simili ai blocchi Erba, questi blocchi sono ideali come terreno di coltura per i funghi. + +Galleggia e può essere usata per guadare un corso d'acqua. + +Si usa per costruire Fortezze del Sottomondo. È immune alle palle di fuoco lanciate dai Ghast. + +Si usa nelle Fortezze del Sottomondo. + +Si trova nelle Fortezze del Sottomondo. Quando viene distrutto, rilascia una Verruca del Sottomondo. + +Permette al giocatore di incantare spade, piccozze, asce, pale, archi e armature usando i punti Esperienza guadagnati. + +Si attiva usando dodici Occhi di Ender e permette di raggiungere la dimensione Limite. + +Si usa per costruire un Portale del Limite. + +Un tipo di blocco che si trova nel Limite. Estremamente resistente alle esplosioni, è molto utile per costruire. + +Questo blocco si crea dopo aver sconfitto il Drago nel Limite. + +Quando viene lanciata, lascia cadere delle sfere Esperienza; raccogliendole, il giocatore può aumentare i propri punti Esperienza. + +Utile per appiccare il fuoco alle cose. Se si spara da un dispenser può scatenare incendi tutt'intorno in modo casuale. + +Simile a un espositore, mostra l'oggetto o il blocco messo al suo interno. + +Quando è lanciato può generare una creatura del tipo indicato. + +Si usa per creare scale lunghe. Due lastre una sopra l'altra creano un blocco doppio di dimensioni normali. + +Si usa per creare scale lunghe. Due lastre una sopra l'altra creano un blocco doppio di dimensioni normali. + +Creato dalla fusione della Sottogriglia nella fornace. Può generare blocchi di mattoni del Sottomondo. + +Se alimentate, emettono una luce. + +Può essere coltivato per raccogliere Semi di cacao. + +Le teste di Mob si possono collocare come decorazioni o indossare come maschere nello slot per l'elmo. + +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 + +Number Crunching and Statistics + +Bully Coordinator + +Original Design and Code by + +Project Manager/Producer + +Rest of Mojang Office + +Capo programmatore Minecraft PC + +Ninja Coder + +CEO + +White Collar Worker + +Customer Support + +Office DJ + +Designer/Programmer Minecraft - Pocket Edition + +Developer + +Chief Architect + +Art Developer + +Game Crafter + +Director of Fun + +Music and Sounds + +Programming + +Art + +QA + +Executive Producer + +Lead Producer + +Producer + +Test Lead + +Lead Tester + +Design Team + +Development Team + +Release Management + +Director, XBLA Publishing + +Business Development + +Portfolio Director + +Product Manager + +Marketing + + Community Manager + +Europe Localization Team + +Redmond Localization Team + +Asia Localization Team + +User Research Team + +MGS Central Teams + +Milestone Acceptance Tester + +Special Thanks + +Test Manager + +Senior Test Lead + +SDET + +Project STE + +Additional STE + +Test Associates + +Jon Kågström + +Tobias Möllstam + +Risë Lugo + +Spada di legno + +Spada di pietra + +Spada di ferro + +Spada di diamante + +Spada d'oro + +Pala di legno + +Pala di pietra + +Pala di ferro + +Pala di diamante + +Pala d'oro + +Piccozza di legno + +Piccozza di pietra + +Piccozza di ferro + +Piccozza di diamante + +Piccozza d'oro + +Ascia di legno + +Ascia di pietra + +Ascia di ferro + +Ascia di diamante + +Ascia d'oro + +Zappa di legno + +Zappa di pietra + +Zappa di ferro + +Zappa di diamante + +Zappa d'oro + +Porta di legno + +Porta di ferro + +Elmo di maglia metallica + +Corazza di maglia metallica + +Gambali di maglia metallica + +Stivali di maglia metallica + +Cappello di pelle + +Elmo di ferro + +Elmo di diamante + +Elmo d'oro + +Tunica di pelle + +Corsaletto di ferro + +Corsaletto di diamante + +Corsaletto d'oro + +Pantaloni di pelle + +Gambali di ferro + +Gambali di diamante + +Gambali d'oro + +Stivali di cuoio + +Stivali di ferro + +Stivali di diamante + +Stivali d'oro + +Lingotto di ferro + +Lingotto d'oro + +Secchio + +Secchio d'acqua + +Secchio di lava + +Pietra focaia e acciarino + +Mela + +Arco + +Freccia + +Carbone + +Antracite + +Diamante + +Bastone + +Ciotola + +Zuppa di funghi + +Corda + +Piuma + +Polvere da sparo + +Semi di grano + +Grano + +Pane + +Pietra focaia + +Costoletta di maiale cruda + +Costoletta di maiale cotta + +Dipinto + +Mela d'oro + +Cartello + +Carrello da miniera + +Sella + +Pietra rossa + +Palla di neve + +Barca + +Pelle + +Secchio di latte + +Mattone + +Argilla + +Canna da zucchero + +Carta + +Libro + +Palla di slime + +Carrello con cassa + +Carrello con fornace + +Uovo + +Bussola + +Canna da pesca + +Orologio + +Polvere di pietra brillante + +Pesce crudo + +Pesce cotto + +Tintura in polvere + +Sacca d'inchiostro + +Rosso rosa + +Verde cactus + +Semi di cacao + +Lapislazzulo + +Tintura viola + +Tintura turchese + +Tintura grigiastra + +Tintura grigia + +Tintura rosa + +Tintura verde lime + +Giallo mimosa + +Tintura azzurra + +Tintura magenta + +Tintura arancione + +Farina d'ossa + +Osso + +Zucchero + +Torta + +Letto + +Ripetitore pietra rossa + +Biscotto + +Mappa + +Mappa vuota + +Disco - "13" + +Disco - "gatto" + +Disco - "blocchi" + +Disco - "cip" + +Disco - "lontano" + +Disco - "centro commerciale" + +Disco - "mellohi" + +Disco - "stal" + +Disco - "strad" + +Disco - "reparto" + +Disco - "11" + +Disco - "dove siamo adesso" + +Tosatrice + +Semi di zucca + +Semi di melone + +Pollo crudo + +Pollo cotto + +Manzo crudo + +Bistecca + +Carne guasta + +Ender Pearl + +Fetta di melone + +Bacchetta di Vampe + +Lacrima di Ghast + +Pepita d'oro + +Verruca del Sottomondo + +{*splash*}{*prefix*}Pozione {*postfix*} + +Bottiglia di vetro + +Bottiglia d'acqua + +Occhio di ragno + +Occhio di ragno fermentato + +Polvere di Vampe + +Crema di magma + +Banco di distillazione + +Calderone + +Occhio di Ender + +Melone scintillante + +Bottiglia magica + +Scarica di fuoco + +Scarica fuoco (carbone veg.) + +Scarica fuoco (carbone) + +Espositore + +Genera {*CREATURE*} + +Mattone del Sottomondo + +Teschio + +Teschio di scheletro + +Teschio di scheletro avvizzito + +Testa di zombie + +Testa + +Testa di %s + +Testa di Creeper + +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 + +Terra + +Ciottolo + +Assi di legno di quercia + +Assi di legno di abete + +Assi di legno di betulla + +Assi di legno della giungla + +Assi di legno (qualsiasi tipo) + +Arbusto + +Arbusto di quercia + +Arbusto di abete + +Arbusto di betulla + +Arbusto della giungla + +Substrato roccioso + +Acqua + +Lava + +Sabbia + +Arenaria + +Ghiaia + +Minerale d'oro + +Minerale di ferro + +Minerale carbone + +Legno + +Legno di quercia + +Legno di abete + +Legno di betulla + +Legno della giungla + +Quercia + +Abete + +Betulla + +Foglie + +Foglie di quercia + +Foglie d'abete + +Foglie di betulla + +Foglie della giungla + +Spugna + +Vetro + +Lana + +Lana nera + +Lana rossa + +Lana verde + +Lana marrone + +Lana blu + +Lana viola + +Lana turchese + +Lana grigio chiaro + +Lana grigia + +Lana rosa + +Lana verde lime + +Lana gialla + +Lana azzurra + +Lana magenta + +Lana arancione + +Lana bianca + +Fiore + +Rosa + +Fungo + +Blocco d'oro + +Un modo compatto di riporre l'oro. + +Un modo compatto di riporre il ferro. + +Blocco di ferro + +Lastra di pietra + +Lastra di pietra + +Lastra di arenaria + +Lastra di legno di quercia + +Lastra acciottolata + +Lastra di mattoni + +Lastra di mattoni di pietra + +Lastra di legno di quercia + +Lastra di arbusto + +Lastra di legno di betulla + +Lastra di legno tropicale + +Lastra matt. Sottomondo + +Mattoni + +TNT + +Scaffale + +Pietra di muschio + +Ossidiana + +Torcia + +Torcia (carbone) + +Torcia (antracite) + +Fuoco + +Generatore di mostri + +Scala di legno di quercia + +Cassa + +Polvere di pietra rossa + +Minerale di diamante + +Blocco di diamante + +Un modo compatto di riporre i diamanti. + +Tavolo da lavoro + +Coltura + +Zolla + +Fornace + +Cartello + +Porta di legno + +Scala a pioli + +Binari + +Binari potenziati + +Binari rilevatori + +Scala di pietra + +Leva + +Piastra a pressione + +Porta di ferro + +Minerale pietra rossa + +Torcia pietra rossa + +Pulsante + +Neve + +Ghiaccio + +Cactus + +Argilla + +Canna da zucchero + +Jukebox + +Recinzione + +Zucca + +Zucca di halloween + +Sottogriglia + +Sabbie mobili + +Pietra brillante + +Portale + +Minerale di lapislazzulo + +Blocco lapislazzulo + +Un modo compatto di riporre i lapislazzuli. + +Dispenser + +Blocco nota + +Torta + +Letto + +Ragnatela + +Erba alta + +Cespuglio secco + +Diodo + +Cassa chiusa + +Botola + +Lana (qualsiasi colore) + +Pistone + +Pistone appiccicoso + +Blocco Pesciolino d'argento + +Mattoni di pietra + +Mattoni di pietra muschiati + +Mattoni di pietra lesionati + +Mattoni di pietra cesellati + +Fungo + +Fungo + +Barre di ferro + +Lastra di vetro + +Melone + +Picciolo di zucca + +Picciolo di melone + +Rampicanti + +Cancello per recinzioni + +Scale di mattoni + +Scale di mattoni di pietra + +Pietra Pesciolino d'argento + +Ciottolo Pesciolino d'argento + +Mattone di pietra Pesciolino d'argento + +Micelio + +Ninfea + +Mattone del Sottomondo + +Recinzione matt. Sottomondo + +Scale matt. Sottomondo + +Verruca del Sottomondo + +Tavolo per incantesimi + +Banco di distillazione + +Calderone + +Portale del Limite + +Telaio per portale del Limite + +Pietra del Limite + +Uovo di drago + +Arbusto + +Felce + +Scala di arenaria + +Scale di abete + +Scale di legno di betulla + +Scala di legno tropicale + +Torcia di pietra rossa + +Cacao + +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 + +Muoviti/Scatta + +Guarda + +Pausa + +Salta + +Salta/Vola su + +Inventario + +Scorri oggetti in mano + +Azione + +Usa + +Crafting + +Posa + +Furtività + +Muoviti furtivamente/Vola giù + +Cambia modalità telecamera + +Giocatori/Invito + +Movimento (durante il volo) + +Layout 1 + +Layout 2 + +Layout 3 + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +{*B*}Premi{*CONTROLLER_VK_A*} per continuare. + +{*B*}Premi{*CONTROLLER_VK_A*} per avviare il tutorial.{*B*} + Premi{*CONTROLLER_VK_B*} se sei pronto a giocare da solo. + +In Minecraft si posizionano blocchi per costruire tutto ciò che vuoi. +Di notte, i mostri vagano in libertà, quindi costruisci un riparo per tempo. + +Usa{*CONTROLLER_ACTION_LOOK*} per guardare su, giù e intorno. + +Usa{*CONTROLLER_ACTION_MOVE*} per muoverti. + +Per scattare, sposta in avanti {*CONTROLLER_ACTION_MOVE*} due volte rapidamente. Finché tieni premuto {*CONTROLLER_ACTION_MOVE*}, il personaggio continuerà a scattare, a meno che non esaurisca il tempo per lo scatto o il cibo. + +Premi{*CONTROLLER_ACTION_JUMP*} per saltare. + +Tieni premuto{*CONTROLLER_ACTION_ACTION*} per scavare e abbattere alberi usando la mano o un oggetto. Potresti dover creare un attrezzo per scavare alcuni blocchi... + +Tieni premuto{*CONTROLLER_ACTION_ACTION*} per abbattere 4 blocchi di legno (tronchi).{*B*}Quando un blocco si rompe, puoi raccoglierlo avvicinandoti all'oggetto fluttuante che appare, inserendolo così nel tuo inventario. + +Premi{*CONTROLLER_ACTION_CRAFTING*} per aprire l'interfaccia Crafting. + +Man mano che raccogli e crei oggetti, l'inventario si riempie.{*B*} + Premi{*CONTROLLER_ACTION_INVENTORY*} per aprire l'inventario. + +Via via che ti sposti, scavi e attacchi i nemici, il livello della barra del cibo diminuisce {*ICON_SHANK_01*}. Scattando e saltando durante uno scatto si consuma molto più cibo che non camminando e saltando normalmente. + +Se subisci dei danni, ma nella tua barra del cibo ci sono 9 o più{*ICON_SHANK_01*}, la tua salute si ripristinerà automaticamente. Mangiare farà risalire la tua barra del cibo. + +Tenendo in mano un cibo, tieni premuto{*CONTROLLER_ACTION_USE*} per mangiarlo e reintegrare la tua barra del cibo. Se la barra del cibo è piena, non potrai mangiare. + +Il livello della tua barra del cibo è sceso e hai perso energia. Mangia la bistecca nel tuo inventario per reintegrare la barra del cibo e riacquistare le forze.{*ICON*}364{*/ICON*} + +Il legno ottenuto si può tagliare in assi. Apri l'interfaccia Crafting per crearle.{*PlanksIcon*} + +Il crafting può richiedere diverse operazioni. Ora che hai delle assi, puoi creare nuovi oggetti. Crea un tavolo da lavoro.{*CraftingTableIcon*} + +Per velocizzare la raccolta di blocchi, puoi costruire attrezzi appositi. Alcuni attrezzi hanno un manico creato con dei bastoni. Crea dei bastoni.{*SticksIcon*} + +Usa{*CONTROLLER_ACTION_LEFT_SCROLL*} e{*CONTROLLER_ACTION_RIGHT_SCROLL*} per cambiare l'oggetto che tieni in mano. + +Usa{*CONTROLLER_ACTION_USE*} per utilizzare gli oggetti, interagire e collocarli. Gli oggetti collocati possono essere raccolti scavando con l'attrezzo appropriato. + +Una volta selezionato il tavolo da lavoro, sposta il puntatore nel punto desiderato e usa{*CONTROLLER_ACTION_USE*} per collocarlo. + +Sposta il puntatore sul tavolo da lavoro e premi{*CONTROLLER_ACTION_USE*} per aprirlo. + +La pala aiuta a scavare più in fretta i blocchi cedevoli come terra e neve. Raccogliendo materiali, potrai creare attrezzi più robusti e durevoli. Crea una pala di legno.{*WoodenShovelIcon*} + +L'ascia ti aiuta a tagliare più in fretta la legna e le tessere di legno. Raccogliendo materiali, potrai creare attrezzi più robusti e durevoli. Crea un'ascia di legno.{*WoodenHatchetIcon*} + +La piccozza aiuta a scavare più in fretta i blocchi duri come pietra e minerale. Raccogliendo materiali, potrai creare attrezzi più robusti e durevoli, inoltre potrai scavare anche i materiali più duri. Crea una piccozza di legno.{*WoodenPickaxeIcon*} + +Apri il contenitore + + + La notte arriva in fretta ed è pericoloso restare all'aperto impreparati. Puoi creare armi e armature, ma conviene avere un riparo sicuro. + + + + Nelle vicinanze c'è un rifugio di minatori abbandonato che puoi completare entro sera. + + + + Dovrai raccogliere le risorse per completare il rifugio. Per muri e tetto si può usare qualsiasi materiale, ma ti converrà creare una porta, delle finestre e un po' di luce. + + +Usa la piccozza per scavare dei blocchi di pietra. I blocchi di pietra producono ciottoli. Con 8 blocchi di ciottoli puoi costruire una fornace. Potresti dover scavare nella terra per raggiungere la pietra: usa la pala.{*StoneIcon*} + +Hai abbastanza ciottoli per costruire una fornace. Usa il tavolo da lavoro. + +Usa{*CONTROLLER_ACTION_USE*} per collocare la fornace nel mondo, poi aprila. + +Usa la fornace per creare l'antracite. Mentre aspetti che sia pronta, che ne dici di raccogliere altri materiali per completare il rifugio? + +Usa la fornace per creare del vetro. Mentre aspetti che sia pronto, che ne dici di raccogliere altri materiali per completare il rifugio? + +Un buon rifugio ha una porta per entrare e uscire agilmente senza dover ogni volta scavare e sostituire i muri. Crea una porta di legno.{*WoodenDoorIcon*} + +Usa{*CONTROLLER_ACTION_USE*} per collocare la porta. Puoi usare{*CONTROLLER_ACTION_USE*} per aprire e chiudere una porta di legno nel mondo. + +Di notte è buio, quindi serve della luce per poterci vedere nel rifugio. Crea una torcia usando bastoni e antracite dall'interfaccia Crafting.{*TorchIcon*} + + + Hai completato la prima parte del tutorial. + + + + {*B*} + Premi{*CONTROLLER_VK_A*} per continuare il tutorial.{*B*} + Premi{*CONTROLLER_VK_B*} se sei pronto a giocare da solo. + + + + Questo è il tuo inventario. Mostra gli oggetti che puoi tenere in mano e quelli che trasporti, nonché la tua eventuale armatura. + +{*B*} + Premi{*CONTROLLER_VK_A*} per continuare.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già come si usa l'inventario. + + + + Usa{*CONTROLLER_MENU_NAVIGATE*} per muovere il puntatore. Usa{*CONTROLLER_VK_A*} per raccogliere un oggetto sotto il puntatore. + Se c'è più di un oggetto, verranno raccolti tutti, oppure premi{*CONTROLLER_VK_X*} per raccoglierne soltanto la metà. + + + + Sposta l'oggetto in un'altra casella dell'inventario usando il puntatore e collocalo con{*CONTROLLER_VK_A*}. + Se il puntatore seleziona più oggetti, usa{*CONTROLLER_VK_A*} per collocarli tutti o{*CONTROLLER_VK_X*} per collocarne solo uno. + + + + Sposta il puntatore fuori dal bordo dell'interfaccia mentre è selezionato un oggetto per posarlo. + + + + Se vuoi maggiori informazioni su un oggetto, spostaci sopra il puntatore e premi{*CONTROLLER_ACTION_MENU_PAGEDOWN*} . + + + + Ora premi{*CONTROLLER_VK_B*} per uscire dall'inventario. + + + + Questo è l'inventario della modalità Creativa. Mostra gli oggetti che hai in mano e tutti quelli a tua disposizione. + + +{*B*} + Premi{*CONTROLLER_VK_A*} per continuare.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già come si usa l'inventario della modalità Creativa. + + + + Usa{*CONTROLLER_MENU_NAVIGATE*} per muovere il puntatore. + Quando sei nell'elenco degli oggetti, usa{*CONTROLLER_VK_A*} per selezionare l'oggetto sotto il puntatore e{*CONTROLLER_VK_Y*} per prenderne la quantità massima. + + + + Il puntatore si sposterà automaticamente su uno spazio nella riga per l'uso. Posiziona l'oggetto usando{*CONTROLLER_VK_A*}. Una volta completata questa operazione, il puntatore tornerà all'elenco degli oggetti e potrai selezionarne un altro. + + + + Sposta il puntatore fuori dal bordo dell'interfaccia mentre è selezionato un oggetto per posizionarlo nel mondo. Per eliminare tutti gli oggetti nella barra di scelta rapida, premi{*CONTROLLER_VK_X*}. + + + + Scorri le schede dei tipi di oggetti usando{*CONTROLLER_VK_LB*} e{*CONTROLLER_VK_RB*} per selezionare il tipo di oggetto che vuoi prendere. + + + + Se vuoi maggiori informazioni su un oggetto, spostaci sopra il puntatore e premi{*CONTROLLER_ACTION_MENU_PAGEDOWN*} . + + + + Ora premi{*CONTROLLER_VK_B*} per uscire dall'inventario della modalità Creativa. + + + + Questa è l'interfaccia Crafting, che ti consente di combinare gli oggetti raccolti per crearne di nuovi. + + +{*B*} + Premi {*CONTROLLER_VK_A*}per continuare.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già come funziona il crafting. + + +{*B*} + Premi{*CONTROLLER_VK_X*} per visualizzare la descrizione dell'oggetto. + + +{*B*} + Premi{*CONTROLLER_VK_X*} per visualizzare gli ingredienti necessari per creare l'oggetto corrente. + + +{*B*} + Premi{*CONTROLLER_VK_X*} per visualizzare di nuovo l'inventario. + + + + Scorri le schede dei tipi di oggetti usando{*CONTROLLER_VK_LB*} e{*CONTROLLER_VK_RB*} per selezionare il tipo di oggetto, poi usa{*CONTROLLER_MENU_NAVIGATE*} per scegliere l'oggetto da creare. + + + + L'area crafting mostra gli elementi richiesti per creare il nuovo oggetto. Premi{*CONTROLLER_VK_A*} per creare l'oggetto e inserirlo nell'inventario. + + + + Il tavolo da lavoro consente di creare una selezione di oggetti più vasta. Lavorare al tavolo funziona come il normale crafting, ma avrai un'area di lavoro più ampia, che consente una maggiore combinazione di ingredienti. + + + + La parte in basso a destra dell'interfaccia Crafting mostra il tuo inventario. Qui puoi anche vedere una descrizione dell'oggetto selezionato e gli ingredienti necessari per crearlo. + + + + Ora è visualizzata la descrizione dell'oggetto selezionato, che ti dà un'idea del suo possibile utilizzo. + + + + Ora è visualizzato l'elenco degli ingredienti necessari per creare l'oggetto selezionato. + + +Il legno ottenuto si può tagliare in assi. Seleziona l'icona delle assi e premi{*CONTROLLER_VK_A*} per crearle.{*PlanksIcon*} + + + Ora che hai costruito un tavolo da lavoro, collocalo nel mondo per creare una selezione di oggetti più vasta.{*B*} + Ora premi{*CONTROLLER_VK_B*} per uscire dall'interfaccia Crafting. + + + + Premi{*CONTROLLER_VK_LB*} e{*CONTROLLER_VK_RB*} per cambiare il tipo di oggetto da creare. Seleziona il gruppo attrezzi.{*ToolsIcon*} + + + + Premi{*CONTROLLER_VK_LB*} e{*CONTROLLER_VK_RB*} per cambiare il tipo di oggetto da creare. Seleziona il gruppo strutture.{*StructuresIcon*} + + + + Usa{*CONTROLLER_MENU_NAVIGATE*} per cambiare l'oggetto da creare. Alcuni oggetti esistono in varie versioni, a seconda dei materiali impiegati. Seleziona la pala di legno.{*WoodenShovelIcon*} + + + + Il crafting può richiedere diverse operazioni. Ora che hai delle assi, puoi creare nuovi oggetti. Usa{*CONTROLLER_MENU_NAVIGATE*} per cambiare l'oggetto da creare. Seleziona il tavolo da lavoro.{*CraftingTableIcon*} + + + + Grazie agli attrezzi che hai creato, puoi partire alla grande e raccogliere diversi materiali in modo più efficiente.{*B*} + Ora premi{*CONTROLLER_VK_B*} per uscire dall'interfaccia Crafting. + + + + Alcuni oggetti non possono essere creati con il tavolo da lavoro, ma è necessaria una fornace. Ora crea una fornace.{*FurnaceIcon*} + + + + Colloca la fornace creata nel mondo. Ti conviene metterla nel tuo rifugio.{*B*} + Ora premi{*CONTROLLER_VK_B*} per uscire dall'interfaccia Crafting. + + + + Questa è l'interfaccia fornace, dove puoi modificare gli oggetti attraverso il fuoco. Per esempio, puoi trasformare il minerale di ferro in lingotti di ferro. + + +{*B*} + Premi{*CONTROLLER_VK_A*} per continuare.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già come si usa la fornace. + + + + Dovrai inserire del combustibile nella parte inferiore della fornace e l'oggetto da modificare nella parte superiore. A questo punto, la fornace si accenderà e si metterà in funzione, fornendo il risultato nella parte destra. + + + + Puoi usare molti oggetti di legno come combustibile, ma ciascuno brucia per un tempo diverso. Puoi anche scoprire altri oggetti nel mondo da usare come combustibile. + + + + Gli oggetti nell'area di produzione possono essere trasferiti nell'inventario. Sperimenta con diversi ingredienti e vedi cosa riesci a creare. + + + + Usando il legno come ingrediente, puoi produrre l'antracite. Inserisci del combustibile nella fornace e del legno nello slot ingrediente. La fornace può richiedere tempo per creare l'antracite, quindi sentiti libero di fare altro e di tornare in seguito a controllare l'avanzamento. + + + + L'antracite può essere usata come combustibile o combinata con un bastone per creare una torcia. + + + + Inserisci la sabbia nello slot ingrediente per produrre del vetro. Crea dei blocchi di vetro da usare come finestre nel tuo rifugio. + + + + Questa è l'interfaccia di distillazione. Puoi usarla per creare pozioni di vario tipo. + + +{*B*} + Premi{*CONTROLLER_VK_A*} per continuare.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già come si usa il Banco di distillazione. + + + + Per distillare una pozione, posiziona un ingrediente nello slot superiore e una pozione o una Bottiglia d'acqua negli slot inferiori. Puoi preparare fino a tre pozioni contemporaneamente. Una volta inserita una combinazione di ingredienti corretta, il processo di distillazione si avvierà e, dopo un breve periodo di tempo, potrai ritirare la tua pozione. + + + + Il punto di partenza di tutte le pozioni è una Bottiglia d'acqua. Quasi tutte le pozioni vengono preparate utilizzando prima una Verruca del Sottomondo per creare una Maldestra pozione e aggiungendo poi almeno un altro ingrediente per ottenere il prodotto finale. + + + + È possibile modificare gli effetti di una pozione aggiungendo altri ingredienti. La Polvere di pietra rossa, ad esempio, rende più duraturi gli effetti della pozione, mentre la Polvere di pietra brillante li rende più potenti. + + + + L'Occhio di ragno fermentato inquina la pozione e può farle acquisire effetti diametralmente opposti, mentre la Polvere da sparo la trasforma in una Bomba pozione che, una volta lanciata, diffonderà il suo effetto nella zona colpita. + + + + Crea una Pozione di Resistenza al fuoco aggiungendo prima una Verruca del Sottomondo a una Bottiglia d'acqua e completando poi la pozione con della Crema di magma. + + + + Ora premi{*CONTROLLER_VK_B*} per uscire dall'interfaccia di distillazione. + + + + In quest'area troverai un Banco di distillazione, un Calderone e una cassa pieni di oggetti da utilizzare per la preparazione di pozioni. + + +{*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sulla distillazione di pozioni.{*B*} + Premi{*CONTROLLER_VK_B*} se non hai bisogno di spiegazioni al riguardo. + + + + Prima di poter distillare una pozione, devi creare una Bottiglia d'acqua. Prendi una Bottiglia di vetro dalla cassa. + + + + Puoi riempire una Bottiglia di vetro attingendo acqua da un Calderone che ne contenga o da un blocco d'acqua. Riempi la tua bottiglia posizionando il cursore su una fonte d'acqua e premendo{*CONTROLLER_ACTION_USE*}. + + + + Se il Calderone si svuota, puoi riempirlo con un Secchio d'acqua. + + + + Usa il Banco di distillazione per creare una Pozione di Resistenza al fuoco. Ti serviranno una Bottiglia d'acqua, una Verruca del Sottomondo e Crema di magma. + + + + Prendi una pozione e tieni premuto{*CONTROLLER_ACTION_USE*} per usarla. Le pozioni normali vengono ingerite e producono i propri effetti sul giocatore stesso; le pozioni Area, invece, vengono lanciate e il loro effetto si applica alle creature che si trovano nella zona dell'impatto. + È possibile creare delle Bombe pozione aggiungendo polvere da sparo a una pozione normale. + + + + Usa la Pozione di Resistenza al fuoco su te stesso. + + + + Ora che sei resistente al fuoco e alla lava, approfittane per raggiungere dei luoghi che prima ti risultavano inaccessibili. + + + + Questa è l'interfaccia di incantamento. Puoi usarla per incantare armi, armature e alcuni attrezzi. + + +{*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sull'interfaccia per gli incantesimi.{*B*} + Premi{*CONTROLLER_VK_B*} se non hai bisogno di spiegazioni al riguardo. + + + + Per applicare un incantesimo a un oggetto, posizionalo nello slot di incantamento. È possibile incantare armi, armature e alcuni attrezzi per dotarli di proprietà speciali, come una maggiore resistenza ai danni o la capacità di raccogliere più oggetti quando si scava un blocco. + + + + Quando un oggetto viene posizionato nello slot di incantamento, i pulsanti a destra mostreranno una selezione casuale di incantesimi. + + + + La cifra sul pulsante indica il costo in punti Esperienza dell'incantesimo. Se non hai un livello di Esperienza sufficiente, il pulsante non sarà selezionabile. + + + + Seleziona un incantesimo e premi{*CONTROLLER_VK_A*} per applicarlo all'oggetto. Il costo dell'incantesimo verrà detratto dai tuoi punti Esperienza. + + + + Gli incantesimi sono casuali, ma alcuni dei più potenti sono disponibili solo quando hai un livello elevato di Esperienza e intorno al Tavolo per incantesimi ci sono molti scaffali che ne aumentano la potenza. + + + + In quest'area troverai un Tavolo per incantesimi e alcuni altri oggetti che potrai utilizzare per familiarizzarti con questa nuova funzionalità. + + +{*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sugli incantesimi.{*B*} + Premi{*CONTROLLER_VK_B*} se non hai bisogno di spiegazioni al riguardo. + + + + Utilizzando un Tavolo per incantesimi è possibile incantare armi, armature e alcuni attrezzi per dotarli di proprietà speciali, come una maggiore resistenza ai danni o la capacità di raccogliere più oggetti quando si scava un blocco. + + + + Posizionare degli scaffali intorno al Tavolo per incantesimi ne aumenta la potenza e consente di accedere agli incantesimi di livello più alto. + + + + Gli incantesimi richiedono un certo livello di Esperienza; puoi far salire di livello la tua Esperienza raccogliendo le sfere di Esperienza che vengono abbandonate da mostri e animali uccisi, estraendo metalli, facendo riprodurre animali, pescando e fondendo/cuocendo alcuni oggetti in una fornace. + + + + Puoi guadagnare Esperienza anche usando una Bottiglia magica. Quando viene lanciata, la Bottiglia magica rilascia attorno a sé Sfere di Esperienza che possono essere raccolte. + + + + Le casse che troverai in quest'area contengono oggetti già incantati, Bottiglie magiche e alcuni oggetti da incantare per acquisire dimestichezza con il Tavolo per incantesimi. + + + + Ora viaggi in un carrello da miniera. Per smontare, punta il cursore verso il carrello e premi{*CONTROLLER_ACTION_USE*}.{*MinecartIcon*} + + +{*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sul carrello da miniera.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già come funziona il carrello da miniera. + + + + Il carrello da miniera viaggia sui binari. Puoi creare un carrello potenziato usando una fornace e un carrello da miniera contenente una cassa. + {*RailIcon*} + + + + Puoi anche creare binari potenziati, che traggono energia dai circuiti e dalle torce di pietre rosse per far accelerare il carrello. Potrai quindi collegarli a interruttori, leve e piastre a pressione per realizzare sistemi complessi. + {*PoweredRailIcon*} + + + + Ora navighi su una barca. Per scendere, punta il cursore verso la barca e premi{*CONTROLLER_ACTION_USE*}.{*BoatIcon*} + + + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sulla barca.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già come funziona la barca. + + + + La barca consente di viaggiare velocemente sull'acqua. Per virare, usa{*CONTROLLER_ACTION_MOVE*} e{*CONTROLLER_ACTION_LOOK*}. + {*BoatIcon*} + + + + Ora stai utilizzando la canna da pesca. Premi{*CONTROLLER_ACTION_USE*} per usarla.{*FishingRodIcon*} + + + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sulla pesca.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già come funziona la pesca. + + + + Premi{*CONTROLLER_ACTION_USE*} per lanciare la lenza e iniziare a pescare. Premi di nuovo{*CONTROLLER_ACTION_USE*} per tirare la lenza. + {*FishingRodIcon*} + + + + Se aspetti che il galleggiante affondi sotto la superficie dell'acqua prima di tirare, potresti prendere un pesce. Il pesce si può mangiare crudo o cucinato nella fornace per reintegrare la salute. + {*FishIcon*} + + + + Come nel caso di molti altri attrezzi, la canna da pesca ha un numero di utilizzi prestabilito, non limitato alla pesca. Sperimenta e scopri cos'altro puoi prendere o attivare... + {*FishingRodIcon*} + + + + Questo è un letto. Premi{*CONTROLLER_ACTION_USE*} mentre punti verso di esso di notte per dormire e risvegliarti il mattino successivo.{*ICON*}355{*/ICON*} + + + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sul letto.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già come funziona il letto. + + + + Il letto dovrebbe trovarsi in un punto sicuro e ben illuminato, in modo che i mostri non ti sveglino nel cuore della notte. Una volta usato un letto, se dovessi morire, tornerai in quel punto. + {*ICON*}355{*/ICON*} + + + + Se ci sono altri giocatori nel gioco, per dormire devono essere tutti a letto nello stesso momento. + {*ICON*}355{*/ICON*} + + + + In quest'area ci sono dei semplici circuiti con pietre rosse e pistoni, oltre a un forziere contenente altri oggetti per ampliare i circuiti. + + + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sui circuiti con pietre rosse e pistoni.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già come funzionano. + + + + Leve, pulsanti, piastre a pressione e torce a pietre rosse alimentano i circuiti collegandoli direttamente all'oggetto da attivare o connettendoli con la polvere di pietra rossa. + + + + Posizione e direzione delle fonti di alimentazione modificano il loro effetto sui blocchi circostanti. Per esempio, una torcia a pietre rosse sul lato di un blocco può essere spenta se il blocco è alimentato da un'altra fonte. + + + + La polvere di pietra rossa si raccoglie estraendo il minerale di pietra rossa con una piccozza di ferro, diamante o oro. Puoi usarla per alimentare fino a 15 blocchi e può salire o scendere di un blocco in altezza. + {*ICON*}331{*/ICON*} + + + + I ripetitori a pietre rosse si usano per aumentare la distanza di alimentazione o per inserire un ritardo in un circuito. + {*ICON*}356{*/ICON*} + + + + Quando è alimentato, un pistone si estende, spingendo fino a 12 blocchi. Quando si ritira, un pistone appiccicoso può tirare un blocco di quasi tutti i tipi. + {*ICON*}33{*/ICON*} + + + + Nel forziere in quest'area ci sono dei componenti per creare dei circuiti con i pistoni. Prova a usare o completare i circuiti in quest'area, oppure creane uno personalizzato. Troverai altri esempi al di fuori dell'area del tutorial. + + + + In quest'area c'è un Portale per il Sottomondo! + + + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sui Portali e sul Sottomondo.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già come funzionano i Portali e il Sottomondo. + + + + I Portali si creano posizionando blocchi di ossidiana in una struttura larga quattro blocchi e alta cinque. I blocchi d'angolo non sono necessari. + + + + Per attivare un Sottoportale, dai fuoco ai blocchi di ossidiana dentro la struttura, usando acciarino e pietra focaia. I Portali possono essere disattivati se la struttura si rompe, se c'è un'esplosione nelle vicinanze o se del liquido vi scorre dentro. + + + + Per usare un Sottoportale, mettiti in piedi all'interno. Lo schermo diventerà viola e sentirai un suono. Dopo qualche secondo sarai trasportato in un'altra dimensione. + + + + Il Sottomondo può essere pericoloso e pieno di lava, ma può essere utile per raccogliere Sottogriglia, che una volta accesa brucia all'infinito, e Pietra brillante, che produce luce. + + + + Si può usare il Sottomondo per viaggiare velocemente nel Sopramondo: una distanza di un blocco nel Sottomondo equivale a 3 blocchi nel Sopramondo. + + + + Ora sei in modalità Creativa. + + + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sulla modalità Creativa.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già come funziona la modalità Creativa. + + +In modalità Creativa avrai a disposizione una quantità infinita di oggetti e blocchi, potrai distruggere blocchi con un clic, senza usare alcun attrezzo, sarai invulnerabile e potrai volare. + +In modalità Creativa, premi due volte rapidamente{*CONTROLLER_ACTION_JUMP*} per volare. Ripeti l'azione per interrompere il volo. Per volare più rapidamente, sposta in avanti{*CONTROLLER_ACTION_MOVE*} due volte in rapida successione mentre stai volando. +Durante il volo, puoi tenere premuto{*CONTROLLER_ACTION_JUMP*} per salire e{*CONTROLLER_ACTION_SNEAK*} per scendere, oppure utilizzare il tasto D per salire, scendere e spostarti lateralmente. + +Premi{*CONTROLLER_ACTION_CRAFTING*} per aprire l'interfaccia dell'inventario in modalità Creativa. + +Raggiungi l'altra estremità di questo fosso per continuare. + +Hai completato il tutorial della modalità Creativa. + + + In quest'area è stata allestita una fattoria. Coltivare la terra ti permette di avere una fonte rinnovabile di cibo e altri oggetti. + + + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sulla coltivazione.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già come funziona. + + +Grano, Zucche e Meloni crescono a partire dai semi. I Semi di grano si ottengono tagliando l'Erba alta o raccogliendo Grano maturo, mentre quelli di Zucca e di Melone si ricavano dai rispettivi ortaggi. + +Prima di poter procedere alla semina, devi lavorare i blocchi di terra con la Zappa per trasformarli in Zolle. Una fonte d'acqua nei pressi manterrà umide le zolle, farà crescere i raccolti più rapidamente e illuminerà l'area. + +Il Grano attraversa vari stadi prima di giungere a maturazione. È pronto ad essere raccolto quando ha assunto una tinta più scura.{*ICON*}59:7{*/ICON*} + +Zucche e Meloni richiedono un blocco libero accanto a quello in cui sono stati piantati i semi in modo che il frutto abbia spazio per crescere una volta che il picciolo è giunto a maturazione. + +La Canna da zucchero deve essere piantata su un blocco di erba, terra o sabbia attiguo a un blocco d'acqua. Tagliare un blocco di Canna da zucchero fa cadere anche tutti i blocchi che lo sovrastano.{*ICON*}83{*/ICON*} + +I Cactus si piantano nella sabbia e crescono fino a raggiungere un'altezza di tre blocchi. Come per la Canna da zucchero, distruggere il blocco inferiore ti permetterà di raccogliere anche i blocchi che lo sovrastano.{*ICON*}81{*/ICON*} + +I Funghi vanno piantati in un'area scarsamente illuminata. Crescendo, si allargano verso i blocchi vicini, purché siano anch'essi in penombra.{*ICON*}39{*/ICON*} + +La Farina d'ossa può essere usata per portare a maturità i raccolti o per trasformare i Funghi in Funghi giganti.{*ICON*}351:15{*/ICON*} + +Hai completato il tutorial sulla coltivazione. + + + In quest'area troverai alcuni animali rinchiusi in un recinto. Se li fai riprodurre, gli animali metteranno al mondo delle versioni in miniatura di se stessi. + + + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sugli animali e sulla riproduzione.{*B*} + Premi{*CONTROLLER_VK_B*} se non hai bisogno di spiegazioni al riguardo. + + +Per far riprodurre un animale, devi prima farlo entrare in "modalità Amore" nutrendolo con l'alimento adatto. + +Dai grano a una mucca, a un muccafungo o a una pecora, carote a un maiale, semi di grano o verruche del Sottomondo a una gallina, e qualsiasi tipo di carne a un lupo, e le creature cominceranno a cercare nei dintorni un altro animale della stessa specie che sia a sua volta in modalità Amore. + +Quando l'avrà trovato, i due si scambieranno effusioni per qualche secondo e poi apparirà un cucciolo. Il piccolo seguirà i genitori per un certo periodo di tempo prima di diventare adulto. + +Devono passare circa cinque minuti prima che un animale possa entrare nuovamente in modalità Amore. + +Alcuni animali ti seguiranno quando hai in mano il loro cibo. In questo modo ti sarà più semplice raggrupparli per farli riprodurre.{*ICON*}296{*/ICON*} + + + I lupi selvatici possono essere ammansiti dando loro degli ossi. Una volta ammansiti, intorno ai lupi compariranno dei cuoricini. I lupi ammansiti seguono il giocatore e lo difendono, a meno che non sia stato loro ordinato di stare seduti. + + +Hai completato il tutorial sugli animali e sulla riproduzione. + + + In questa area ci sono zucche e blocchi per creare un golem di neve e uno di ferro. + + + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sui golem.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già tutto sui golem. + + +I golem si creano sistemando una zucca in cima a una pila di blocchi. + +I golem di neve si creano con due blocchi di neve, uno sull'altro, con in cima una zucca. I golem di neve scagliano palle di neve contro i nemici. + +I golem di ferro si creano con quattro blocchi di ferro, come mostrato, con una zucca sopra il blocco centrale. I golem di ferro attaccano i tuoi nemici. + +I golem di ferro compaiono per aiutare i villaggi e ti attaccheranno se proverai ad attaccare un abitante. + +Non puoi abbandonare l'area finché non avrai completato il tutorial. + +Attrezzi diversi sono indicati per materiali diversi. Usa la pala per scavare materiali cedevoli come terra e sabbia. + +Attrezzi diversi sono indicati per materiali diversi. Usa l'ascia per abbattere gli alberi. + +Attrezzi diversi sono indicati per materiali diversi. Usa la piccozza per scavare pietra e minerali. Per ottenere risorse da alcuni blocchi, potrebbe rendersi necessario costruire piccozze con materiali migliori. + +Alcuni attrezzi sono perfetti per attaccare i nemici. La spada è uno di questi. + +Suggerimento: tieni premuto {*CONTROLLER_ACTION_ACTION*}per scavare e abbattere alberi usando la mano o un oggetto. Potresti dover creare un attrezzo per scavare alcuni blocchi... + +L'attrezzo che stai usando si è danneggiato. Ogni volta che usi un attrezzo, esso si danneggia e, alla fine, si rompe. La barra colorata sotto l'oggetto nell'inventario mostra lo stato corrente. + +Tieni premuto{*CONTROLLER_ACTION_JUMP*} per nuotare verso l'alto. + +In quest'area c'è un carrello da miniera sui binari. Per salirci, punta il cursore verso i binari e premi{*CONTROLLER_ACTION_USE*}. Usa{*CONTROLLER_ACTION_USE*} sul pulsante per far muovere il carrello. + +Nella cassa accanto al fiume c'è una barca. Per usarla, punta il cursore verso l'acqua e premi{*CONTROLLER_ACTION_USE*}. Usa{*CONTROLLER_ACTION_USE*} mentre punti verso la barca per salirci. + +Nella cassa accanto al laghetto c'è una canna da pesca. Prendi la canna da pesca dalla cassa e selezionala come oggetto in mano per usarla. + +Questo pistone con un meccanismo più avanzato crea un ponte auto-riparante! Premi il pulsante per attivarlo, poi scopri in che modo i componenti interagiscono tra loro per saperne di più. + +Se sposti il puntatore fuori dall'interfaccia mentre trasporti un oggetto, puoi posarlo. + +Non hai tutti gli ingredienti necessari per creare questo oggetto. La casella in basso a sinistra mostra gli ingredienti necessari. + + + Congratulazioni, hai completato il tutorial. Il tempo nel gioco scorre normalmente, e tra poco sarà notte e i mostri usciranno allo scoperto! Completa il rifugio! + + +{*EXIT_PICTURE*} Quando vorrai proseguire l'esplorazione, vicino al rifugio di minatori, in quest'area, troverai una scala che conduce a un piccolo castello. + +Promemoria: + +]]> + +Nell'ultima versione del gioco, sono state aggiunte nuove funzionalità, tra cui nuove aree nel mondo tutorial. + +{*B*}Premi{*CONTROLLER_VK_A*} per giocare normalmente il tutorial.{*B*} + Premi{*CONTROLLER_VK_B*} per saltare il tutorial principale. + +In quest'area, troverai delle zone che ti aiuteranno a scoprire la pesca, le barche, i pistoni e le pietre rosse. + +Fuori da quest'area troverai esempi di edifici, coltivazioni, carrelli da miniera e binari, oltre a incantesimi, pozioni da distillare, scambi da effettuare, metalli da lavorare e molto altro ancora! + + + La tua barra del cibo è scesa a un livello troppo basso e non potrai più recuperare energia. + + + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sulla barra del cibo e sull'alimentazione.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già come funzionano la barra del cibo e l'alimentazione. + + + + 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 + +Indietro + +Esci + +Annulla + +Annulla accesso + +Seleziona periferica + +Cambia periferica + +Aggiorna elenco partite + +Giochi Party + +Tutti i giochi + +Cambia gruppo + +Mostra inventario + +Mostra descrizione + +Mostra ingredienti + +Crafting + +Crea + +Prendi/Colloca + +Prendi + +Prendi tutto + +Prendi metà + +Colloca + +Colloca tutti + +Colloca uno + +Posa + +Posa tutti + +Posa uno + +Scambia + +Spost. veloce + +Elimina scelta rapida + +Cos'è? + +Condividi su Facebook + +Cambia filtro + +Scheda giocatore + +Visualizza profilo giocatore + +Invia richiesta amico + +Pagina giù + +Pagina su + +Avanti + +Indietro + +Espelli giocatore + +Tingi + +Scava + +Nutri + +Addomestica + +Cura + +Siediti + +Seguimi + +Espelli + +Svuota + +Sella + +Colloca + +Colpisci + +Mungi + +Raccogli + +Mangia + +Dormi + +Svegliati + +Suona + +Cavalca + +Naviga + +Coltiva + +Nuota su + +Apri + +Cambia tonalità + +Fai esplodere + +Leggi + +Appendi + +Lancia + +Pianta + +Ara + +Mieti + +Continua + +Sblocca gioco completo + +Elimina salvataggio + +Elimina + +Opzioni + +Invito Party Xbox Live + +Invita amici + +Accetta + +Tosa + +Escludi livello + +Seleziona skin + +Accendi + +Naviga + +Installa versione completa + +Installa versione di prova + +Installa + +Reinstalla + +Opzioni di salvataggio + +Esegui comando + +Creativa + +Sposta ingrediente + +Sposta combustibile + +Sposta attrezzo + +Sposta armatura + +Sposta arma + +Equipaggia + +Tendi + +Rilascia + +Privilegi + +Blocco + +Pagina su + +Pagina giù + +Modalità Amore + +Bevi + +Ruota + +Nascondi + +Carica salvataggio per Xbox One + +Svuota tutti gli slot + +Carica salvataggio per Xbox One + +Sali + +Scendi + +Posiziona cassa + +Lancia + +Guinzaglio + +Rilascia + +Attacca + +Nomina + +OK + +Annulla + +Negozio di Minecraft + +Vuoi davvero uscire dalla partita attuale e accedere a quella nuova? Tutti i progressi non salvati andranno persi. + +Esci dal gioco + +Salva gioco + +Esci senza salvare + +Vuoi davvero sovrascrivere qualsiasi salvataggio precedente di questo mondo con la versione del mondo corrente? + +Vuoi davvero uscire senza salvare? Perderai tutti i progressi in questo mondo! + +Avvia gioco + +Se crei, carichi o salvi un mondo in modalità Creativa, gli obiettivi e gli aggiornamenti della classifica saranno disabilitati e lo resteranno anche se quel mondo verrà successivamente caricato in modalità Sopravvivenza. Vuoi davvero continuare? + +Questo mondo è stato precedentemente salvato in modalità Creativa. Gli obiettivi e gli aggiornamenti della classifica sono disabilitati. Vuoi davvero continuare? + +Questo mondo è stato precedentemente salvato in modalità Creativa. Gli obiettivi e gli aggiornamenti della classifica sono disabilitati. + +Se crei, carichi o salvi un mondo con l'opzione Privilegi dell'host abilitata, gli obiettivi e gli aggiornamenti della classifica saranno disabilitati e lo resteranno anche se quel mondo verrà successivamente caricato con l'opzione disattivata. Vuoi davvero continuare? + +Salvataggio dannegg. + +Questo salvataggio è danneggiato. Vuoi eliminarlo? + +Vuoi davvero tornare al menu principale e disconnettere tutti i giocatori? Tutti i progressi non salvati andranno persi. + +Esci e salva + +Esci senza salvare + +Vuoi davvero tornare al menu principale? Tutti i progressi non salvati andranno persi. + +Vuoi davvero tornare al menu principale? I progressi andranno persi! + +Crea nuovo mondo + +Avvia tutorial + +Tutorial + +Nomina il tuo mondo + +Immetti un nome per il tuo mondo + +Pianta il seme per la generazione del tuo mondo + +Carica mondo salvato + +Premi START per accedere alla partita + +Uscita dal gioco + +Si è verificato un errore. Tornerai al menu principale. + +Connessione non riuscita + +Connessione persa + +Connessione al server persa. Tornerai al menu principale. + +Connessione a Xbox Live persa. Tornerai al menu principale. + +Connessione a Xbox Live persa. + +Disconnesso dal server + +Sei stato espulso dalla partita + +Sei stato espulso dalla partita per comportamento scorretto + +Timeout del tentativo di connessione + +Server pieno + +L'host è uscito dal gioco. + +Non puoi accedere a questa partita perché non hai amici tra i partecipanti. + +Non puoi accedere a questa partita perché sei stato espulso dall'host in precedenza. + +Non puoi partecipare alla partita perché il giocatore a cui vuoi unirti ha una versione più vecchia del gioco. + +Non puoi partecipare alla partita perché il giocatore a cui vuoi unirti a una versione più nuova del gioco. + +Nuovo mondo + +Premio sbloccato! + +Evviva, hai ottenuto un'immagine del giocatore con Steve di Minecraft! + +Evviva, hai ottenuto un'immagine del giocatore con un creeper! + +Evviva, hai ottenuto un oggetto avatar: una t-shirt Minecraft: Xbox 360 Edition! +Vai alla dashboard per farla indossare al tuo avatar. + +Evviva, hai ottenuto un oggetto avatar: un orologio Minecraft: Xbox 360 Edition! +Vai alla dashboard per farlo indossare al tuo avatar. + +Evviva, hai ottenuto un oggetto avatar: un cappellino creeper! +Vai alla dashboard per farlo indossare al tuo avatar. + +Evviva, hai ottenuto il tema di Minecraft: Xbox 360 Edition! +Vai alla dashboard per selezionarlo. + +Sblocca gioco completo + +Stai giocando con la versione di prova, ma serve la versione completa per salvare i progressi. +Vuoi sbloccare il gioco completo ora? + +Questa è la versione di prova di Minecraft: Xbox 360 Edition. Se avessi il gioco completo, avresti sbloccato un obiettivo! +Vuoi sbloccare il gioco completo? + +Questa è la versione di prova di Minecraft: Xbox 360 Edition. Se avessi il gioco completo, avresti ottenuto un premio avatar! +Vuoi sbloccare il gioco completo? + +Questa è la versione di prova di Minecraft: Xbox 360 Edition. Se avessi il gioco completo, avresti ottenuto un'immagine del giocatore! +Vuoi sbloccare il gioco completo? + +Questa è la versione di prova di Minecraft: Xbox 360 Edition. Se avessi il gioco completo, avresti ottenuto un tema! +Vuoi sbloccare il gioco completo? + +Questa è la versione di prova di Minecraft: Xbox 360 Edition. Per accettare questo invito è necessario il gioco completo. +Vuoi sbloccare il gioco completo? + +I giocatori ospiti non possono sbloccare il gioco completo. Effettua l'accesso con un ID utente di Xbox Live. + +Attendi + +Nessun risultato + +Filtro: + +Amici + +Punt. personale + +Generale + +Totale: + +Posiz. + +Gamertag + +Preparazione al salvataggio livello + +Preparazione blocchi... + +Finalizzazione... + +Creazione terreno + +Simulazione mondo + +Inizializzazione server + +Creazione area di generazione + +Caricamento area di generazione + +Ingresso nel Sottomondo + +Uscita dal Sottomondo + +Rigenerazione + +Generazione livello + +Caricamento livello + +Salvataggio giocatori + +Connessione all'host + +Download terreno + +Passaggio a gioco offline + +Attendi mentre l'host salva il gioco + +Ingresso nel LIMITE + +Uscita dal LIMITE + +Ricerca Seme per generatore mondo + +Questo letto è occupato + +Puoi dormire solo di notte + +%s dorme in un letto. Per saltare all'alba, tutti i giocatori devono dormire in un letto contemporaneamente. + +Letto mancante o passaggio ostruito + +Non puoi riposare adesso: ci sono mostri nei paraggi + +Stai dormendo in un letto. Per saltare all'alba, tutti i giocatori devono dormire in un letto contemporaneamente. + +Attrezzi e armi + +Armi + +Cibo + +Strutture + +Armature + +Meccanismi + +Trasporto + +Decorazioni + +Blocchi da costruzione + +Pietra rossa e trasporti + +Varie + +Distillazione + +Distillazione + +Attrezzi, armi e armature + +Materiali + +Disconnesso + +Sei tornato alla schermata iniziale perché il tuo profilo giocatore si è disconnesso. + +Difficoltà + +Musica + +Effetti + +Gamma + +Sensibilità gioco + +Sensibilità interfaccia + +Relax + +Facile + +Normale + +Difficile + +In questa modalità, il giocatore recupera salute col tempo e non ci sono nemici nell'ambiente. + +In questa modalità, vengono generati nemici nell'ambiente, ma infliggono danni minori rispetto alla modalità normale. + +In questa modalità, nell'ambiente vengono generati nemici che infliggono un danno standard al giocatore. + +In questa modalità, nell'ambiente vengono generati nemici che infliggono gravi danni al giocatore. Fai attenzione anche ai creeper: è improbabile che annullino il loro attacco esplosivo quando ti allontani! + +Timeout prova + +Hai giocato alla versione di prova di Minecraft: Xbox 360 Edition per il tempo massimo consentito! Per continuare a divertirti, vuoi sbloccare il gioco completo? + +Partita al completo + +Impossibile accedere: nessuno spazio rimasto + +Inserisci testo cartello + +Inserisci il testo per il cartello + +Inserisci titolo + +Inserisci un titolo per il tuo messaggio + +Inserisci didascalia + +Inserisci una didascalia per il tuo messaggio + +Inserisci descrizione + +Inserisci una descrizione per il tuo messaggio + +Inventario + +Ingredienti + +Banco di distillazione + +Cassa + +Incanta + +Fornace + +Ingrediente + +Combustibile + +Dispenser + +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. + +%s ha abbandonato la partita. + +%s è stato espulso dal gioco. + +Vuoi davvero eliminare questo salvataggio? + +Da approvare + +Censurato + +In gioco: + +Resetta impostazioni + +Vuoi davvero ripristinare le impostazioni predefinite? + +Errore caricamento + +Caricamento "Minecraft: "Minecraft: Xbox 360 Edition" non riuscito, impossibile continuare. + +Gioco di %s + +Gioco con host sconosciuto + +Ospite disconnesso + +Un giocatore ospite si è disconnesso, rimuovendo tutti i giocatori ospite dal gioco. + +Accedi + +Non hai effettuato l'accesso. Per partecipare a questo gioco, devi prima accedere. Vuoi accedere ora? + +Multiplayer non consentito + +Impossibile accedere alla partita: uno o più giocatori non possono disputare partite multiplayer su Xbox Live. + +Impossibile creare una partita online: uno o più giocatori non possono disputare partite multiplayer su Xbox Live. Deseleziona la casella "Gioco online" per avviare una partita offline. + +Non ti è consentito accedere a questa sessione di gioco perché l'impostazione per i privilegi dei contenuti dell'abbonato è troppo restrittiva. Modificala nella sezione Impostazioni privacy e online della Xbox Dashboard se desideri accedere a questa sessione. + +Non ti è consentito accedere a questa sessione di gioco perché uno dei giocatori locali ha un'impostazione per i privilegi dei contenuti dell'abbonato troppo restrittiva. + +Non ti è consentito accedere a questa sessione di gioco perché uno dei giocatori nella sessione ha i privilegi dei contenuti dell'abbonato impostati su Solo amici, e tu non sei nella sua lista amici. + +Creazione di partita non riuscita + +Non ti è consentito creare questa sessione di gioco perché uno dei giocatori locali ha un'impostazione per i privilegi dei contenuti dell'abbonato troppo restrittiva. Deseleziona la casella "Gioco online" per avviare una partita offline, oppure modifica questa impostazione nella sezione Impostazioni privacy e online della Xbox Dashboard. + +Selezionato automaticamente + +No pacchetto: skin predef. + +Skin preferite + +Livello escluso + +Il gioco a cui stai cercando di accedere è nell'elenco dei livelli esclusi. +Se scegli di entrarvi comunque, il livello verrà rimosso dall'elenco dei livelli esclusi. + +Escludere questo livello? + +Vuoi davvero aggiungere questo livello all'elenco dei livelli esclusi? +Selezionando OK, uscirai da questa partita. + +Rimuovi da elenco esclusi + +Intervallo autosalvataggio + +Intervallo autosalvataggio: NO + +Min + +Impossibile collocare qui! + +Non è consentito collocare la lava accanto al punto di generazione del livello: i giocatori appena generati potrebbero morire immediatamente. + +Questo gioco utilizza una funzione di autosalvataggio. Quando appare l'icona qui sopra, il gioco sta salvando i dati. +Non spegnere la console Xbox 360 mentre l'icona è visualizzata. + +Opacità interfaccia + +Preparazione salvataggio livello + +Dimensioni dell'interfaccia + +Dimensioni dell'interfaccia (schermo diviso) + +Seme + +Sblocca pacchetto Skin + +Per usare la skin che hai selezionato, devi sbloccare questo pacchetto Skin. +Vuoi sbloccare il pacchetto Skin ora? + +Sblocca pacchetto texture + +Per usare questo pacchetto texture nel tuo mondo, devi prima sbloccarlo. +Vuoi sbloccarlo ora? + +Versione di prova pacchetto texture + +Stai usando una versione di prova del pacchetto texture. Non potrai salvare questo mondo, a meno che non sblocchi la versione completa. +Vuoi sbloccare la versione completa del pacchetto texture? + +Nessun pacchetto texture + +Sblocca versione completa + +Scarica versione di prova + +Scarica versione completa + +Questo mondo usa un pacchetto texture o mash-up che non hai! +Vuoi installare uno dei due pacchetti ora? + +Ottieni la versione di prova + +Ottieni la versione completa + +Espelli giocatore + +Sei sicuro di voler espellere questo giocatore dalla partita? Non potrà accedere finché non riavvii il mondo. + +Pacchetti Immagini del giocatore + +Temi + +Pacchetti Skin + +Accetta amici di amici + +Non puoi unirti a questa partita. L'host ha limitato l'accesso ai propri amici. + +Impossibile accedere alla partita + +Selezionato + +Skin selezionata: + +Contenuto scaricabile danneg. + +Questo contenuto scaricabile è danneggiato e non può essere usato. Cancellalo e installalo nuovamente dal menu del Negozio di Minecraft. + +Parte del contenuto scaricabile è danneggiato e non può essere usato. Cancella il contenuto e installalo nuovamente dal menu del Negozio di Minecraft. + +La modalità di gioco è cambiata + +Rinomina il mondo + +Inserisci il nuovo nome del tuo mondo + +Modalità: Sopravvivenza + +Modalità: Creativa + +Modalità: Avventura + +Sopravvivenza + +Creativa + +Avventura + +In modalità Sopravvivenza + +In modalità Creativa + +Renderizza nuvole + +Cosa vuoi fare con questo salvataggio? + +Rinomina salvataggio + +Autosalvataggio tra %d... + + + +No + +Normale + +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. + +Se attivato, gli amici delle persone nella Lista amici potranno unirsi alla partita. + +Se l'opzione è abilitata, è possibile infliggere danni agli altri giocatori. Efficace solo in modalità Sopravvivenza. + +Se l'opzione è disabilitata, i giocatori che si uniscono alla partita non possono costruire o scavare fino a quando non vengono autorizzati. + +Se l'opzione è abilitata, il fuoco può propagarsi ai blocchi infiammabili vicini. + +Se l'opzione è abilitata, il TNT esplode quando viene attivato. + +Se l'opzione é abilitata, l'host può att./dis. la possibilità di volare, disabilitare la stanchezza e rendersi invisibile. Obiettivi e aggiornamenti della classifica verranno disabilitati. + +Quando è attivato, il Sottomondo viene rigenerato. È molto utile nel caso tu abbia un vecchio salvataggio nel quale non sono presenti Fortezze del Sottomondo. + +Se l'opzione è abilitata, nel mondo si genereranno strutture come Villaggi e Fortezze. + +Se l'opzione è abilitata, verrà generato un mondo completamente piatto tanto nel Sopramondo che nel Sottomondo. + +Se l'opzione è abilitata, vicino al punto di generazione del giocatore apparirà una cassa contenente alcuni oggetti utili. + +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 + +Immagini del giocatore + +Oggetti avatar + +Pacchetti Texture + +Pacchetti Mash-Up + +{*PLAYER*} ha preso fuoco + +{*PLAYER*} è bruciato vivo + +{*PLAYER*} ha cercato di nuotare nella lava + +{*PLAYER*} è soffocato dentro un muro + +{*PLAYER*} è affogato + +{*PLAYER*} è morto di fame + +{*PLAYER*} è morto in seguito a una puntura + +{*PLAYER*} si è schiantato al suolo + +{*PLAYER*} è caduto fuori dal mondo + +{*PLAYER*} è morto + +{*PLAYER*} è saltato in aria + +{*PLAYER*} è stato ucciso dalla magia + +Il Drago di Ender ha ucciso {*PLAYER*} con il suo alito + +{*PLAYER*} è stato ucciso da {*SOURCE*} + +{*PLAYER*} è stato ucciso da {*SOURCE*} + +{*PLAYER*} è stato colpito da un proiettile di {*SOURCE*} + +{*PLAYER*} è stato colpito con una palla di fuoco da {*SOURCE*} + +{*PLAYER*} è stato pestato a morte da {*SOURCE*} + +{*PLAYER*} è stato ucciso da {*SOURCE*} 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 + +Mostra interfaccia + +Mostra mano + +Gamertag schermo diviso + +Messaggi di morte + +Personaggio animato + +Animazione skin personalizzata + +Non puoi più scavare né usare oggetti + +Ora puoi scavare e usare oggetti + +Non puoi più posizionare blocchi + +Ora puoi posizionare blocchi + +Ora puoi usare porte e interruttori + +Non puoi più usare porte e interruttori + +Ora puoi usare contenitori (es. casse) + +Non puoi più usare contenitori (es. casse) + +Non puoi più attaccare i nemici + +Ora puoi attaccare i nemici + +Non puoi più attaccare i giocatori + +Ora puoi attaccare i giocatori + +Non puoi più attaccare gli animali + +Ora puoi attaccare gli animali + +Ora sei un moderatore + +Non sei più un moderatore + +Ora puoi volare + +Non puoi più volare + +Non sentirai più la stanchezza + +Ora sentirai la stanchezza + +Ora sei invisibile + +Non sei più invisibile + +Ora sei invulnerabile + +Non sei più invulnerabile + +%d MSP + +Drago di Ender + +%s si trova ora nel Limite + +%s ha lasciato il Limite + + +{*C3*}Ho capito a quale giocatore ti riferisci.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}?{*EF*}{*B*}{*B*} +{*C3*}Sì. Fai attenzione. Ha raggiunto un livello superiore. Può leggere le nostre menti.{*EF*}{*B*}{*B*} +{*C2*}Non importa. Crede che siamo parte del gioco.{*EF*}{*B*}{*B*} +{*C3*}Mi piace, questo giocatore. Ha giocato bene. Non si è arreso.{*EF*}{*B*}{*B*} +{*C2*}Sta leggendo i nostri pensieri come se fossero parole su uno schermo.{*EF*}{*B*}{*B*} +{*C3*}È così che riesce a immaginare molte cose, quando è immerso nel sogno di un gioco.{*EF*}{*B*}{*B*} +{*C2*}Le parole sono un'interfaccia meravigliosa, estremamente flessibile e molto meno spaventosa del guardare la realtà oltre lo schermo.{*EF*}{*B*}{*B*} +{*C3*}Prima erano soliti ascoltare voci. Prima i giocatori erano in grado di leggere. Un tempo, chi non giocava chiamava i giocatori "streghe" e "stregoni", e i giocatori sognavano di volare su bastoni alimentati dall'energia dei demoni.{*EF*}{*B*}{*B*} +{*C2*}Cosa sognava questo giocatore?{*EF*}{*B*}{*B*} +{*C3*}Sognava la luce del sole, gli alberi... Sognava l'acqua e il fuoco... Sognava di creare, e sognava di distruggere... Sognava di cacciare e di essere preda... Sognava un riparo.{*EF*}{*B*}{*B*} +{*C2*}Ah, l'interfaccia originale... È vecchia di un milione di anni, ma ancora funziona. Ma quale vera struttura ha creato questo giocatore, nella realtà oltre lo schermo?{*EF*}{*B*}{*B*} +{*C3*}Ha funzionato, con oltre un milione di altri individui, per scolpire un vero mondo in una piega di {*EF*}{*NOISE*}{*C3*}, e ha creato {*EF*}{*NOISE*}{*C3*} per {*EF*}{*NOISE*}{*C3*}, in {*EF*}{*NOISE*}{*C3*}.{*EF*}{*B*}{*B*} +{*C2*}Non può leggere quel pensiero.{*EF*}{*B*}{*B*} +{*C3*}No. Non ha ancora raggiunto il livello più alto. Deve arrivarci nel lungo sogno della vita, non nella brevità di un gioco.{*EF*}{*B*}{*B*} +{*C2*}Sa che lo amiamo? Che l'universo è buono?{*EF*}{*B*}{*B*} +{*C3*}A volte, attraverso il rumore dei suoi pensieri, egli ascolta l'universo, sì.{*EF*}{*B*}{*B*} +{*C2*}Capita, però, che nel lungo sogno sia triste. Crea mondi senza estate, trema sotto un sole nero, e crede che la sua triste creazione sia la realtà.{*EF*}{*B*}{*B*} +{*C3*}Se lo guarissimo dal dolore lo distruggeremmo. Il dolore è parte del suo compito personale. Noi non possiamo interferire.{*EF*}{*B*}{*B*} +{*C2*}A volte, quando sognano profondamente, vorrei dire loro che in realtà stanno costruendo dei veri mondi. Vorrei svelare l'importanza che essi hanno per l'universo. E quando non hanno effettuato un vero collegamento per molto tempo, vorrei aiutarli a pronunciare la parola che temono.{*EF*}{*B*}{*B*} +{*C3*}Legge i nostri pensieri.{*EF*}{*B*}{*B*} +{*C2*}Non me ne importa. Certe volte vorrei dire loro che questo mondo che ritengono reale è solo {*EF*}{*NOISE*}{*C2*} e {*EF*}{*NOISE*}{*C2*}. Mi piacerebbe dire loro che sono {*EF*}{*NOISE*}{*C2*} nel {*EF*}{*NOISE*}{*C2*}. Vedono una parte minuscola della realtà, nel loro lungo sogno...{*EF*}{*B*}{*B*} +{*C3*}Eppure, essi continuano a giocare.{*EF*}{*B*}{*B*} +{*C2*}Sarebbe così facile dire tutto...{*EF*}{*B*}{*B*} +{*C3*}La rivelazione sarebbe troppo forte per questo sogno. Dire come vivere impedirebbe loro di vivere.{*EF*}{*B*}{*B*} +{*C2*}Non dirò al giocatore come vivere.{*EF*}{*B*}{*B*} +{*C3*}Il giocatore si sta inquietando.{*EF*}{*B*}{*B*} +{*C2*}Narrerò una storia al giocatore.{*EF*}{*B*}{*B*} +{*C3*}Ma non racconterò la verità.{*EF*}{*B*}{*B*} +{*C2*}No. Sarà una storia che conterrà la verità in modo sicuro, protetta da una gabbia di parole. Non dirò la cruda verità che può bruciare a qualsiasi distanza.{*EF*}{*B*}{*B*} +{*C3*}Dagli di nuovo un corpo.{*EF*}{*B*}{*B*} +{*C2*}Sì. Giocatore...{*EF*}{*B*}{*B*} +{*C3*}Usa il suo nome.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}. Giocatore.{*EF*}{*B*}{*B*} +{*C3*}Bene.{*EF*}{*B*}{*B*} + + + +{*C2*}Ora respira profondamente. Respira ancora. Senti l'aria nei polmoni. I tuoi arti stanno tornando. Sì, muovi le dita... Hai di nuovo un corpo, nell'aria, soggetto alla forza di gravità. Rigenerati nel lungo sogno. Eccoti. Il tuo corpo tocca ancora una volta l'universo, in tutti i suoi punti, come se foste cose separate. Come se noi fossimo entità separate.{*EF*}{*B*}{*B*} +{*C3*}Chi siamo? Un tempo eravamo chiamati gli spiriti della montagna. Padre Sole, Madre Luna. Spiriti ancestrali... Spiriti animali... Jinn, fantasmi. Poi l'uomo verde. E ancora dei, demoni, angeli... Spiriti, alieni, extraterrestri... Infine leptoni, quark... Le parole cambiano. Noi non cambiamo.{*EF*}{*B*}{*B*} +{*C2*}Noi siamo l'universo. Siamo tutto ciò che credi non sia te. Ora ci stai guardando, attraverso la tua pelle e i tuoi occhi. Perché l'universo sfiora la tua pelle e ti inonda di luce? Per guardarti, giocatore. Per conoscersi e per farsi conoscere. Voglio raccontarti una storia.{*EF*}{*B*}{*B*} +{*C2*}Un tempo c'era un giocatore...{*EF*}{*B*}{*B*} +{*C3*}Quel giocatore eri tu, {*PLAYER*}.{*EF*}{*B*}{*B*} +{*C2*}A volte il giocatore pensava di essere una creatura umana sulla sottile crosta di un globo rotante fatto di roccia fusa. Il globo di roccia fusa girava intorno a una sfera di gas fiammeggianti che era trecentotrentamila volte più grande di esso. La sfera era talmente distante dal globo che la luce impiegava otto minuti per viaggiare dall'una all'altro. La luce era informazione che veniva da una stella, e poteva bruciarti la pelle da una distanza di centocinquanta milioni di chilometri.{*EF*}{*B*}{*B*} +{*C2*}A volte il giocatore sognava di essere un minatore sulla superficie di un mondo piatto e infinito. Il sole era un quadrato bianco. I giorni erano brevi. C'era sempre molto da fare, e la morte non era altro che un inconveniente temporaneo.{*EF*}{*B*}{*B*} +{*C3*}A volte il giocatore credeva di essere parte di una storia.{*EF*}{*B*}{*B*} +{*C2*}A volte il giocatore sognava di essere altre cose in luoghi diversi. Alcuni di quei sogni erano sgradevoli, altri meravigliosi. Capitava anche che il giocatore si svegliasse da un sogno e si ritrovasse in un altro, per poi destarsi anche da quello e scoprirsi in un terzo sogno.{*EF*}{*B*}{*B*} +{*C3*}A volte il giocatore sognava di guardare delle parole su uno schermo.{*EF*}{*B*}{*B*} +{*C2*}Torniamo indietro.{*EF*}{*B*}{*B*} +{*C2*}Gli atomi del giocatore erano sparsi nell'erba, nei fiumi, nell'aria, nel suolo. Una donna raccolse gli atomi; li bevve, li mangiò, li respirò. La donna ricostruì il giocatore nel proprio corpo.{*EF*}{*B*}{*B*} +{*C2*}Il giocatore si svegliò dal caldo, buio mondo del corpo di sua madre e si ritrovò nel lungo sogno.{*EF*}{*B*}{*B*} +{*C2*}Il giocatore era una nuova storia, mai narrata prima, scritta con lettere di DNA. E il giocatore era un nuovo programma, mai eseguito prima, generato da un codice sorgente vecchio di miliardi di anni. E il giocatore era un nuovo essere umano, che non aveva mai vissuto prima, fatto solo di latte e amore.{*EF*}{*B*}{*B*} +{*C3*}Tu sei il giocatore. La storia. Il programma. L'essere umano. Sei fatto solo di latte e amore.{*EF*}{*B*}{*B*} +{*C2*}Torniamo ancora più indietro.{*EF*}{*B*}{*B*} +{*C2*}I sette miliardi di miliardi di miliardi di atomi che compongono il corpo del giocatore furono creati molto tempo prima di questo gioco, nel cuore di una stella. Quindi, anche il giocatore è informazione che proviene da una stella. Il giocatore si muove in una storia, che è una foresta di informazioni seminata da un uomo di nome Julian su un mondo piatto e infinito creato da un altro uomo chiamato Markus, che esiste nel piccolo mondo personale creato dal giocatore, che vive in un universo creato da...{*EF*}{*B*}{*B*} +{*C3*}Silenzio... A volte il giocatore creava il suo piccolo mondo personale, e lo faceva caldo, tenero, semplice. Altre volte lo faceva duro, freddo e complesso. A volte creava un modello dell'universo che aveva in mente, punti di energia che si muovono attraverso ampi spazi vuoti. A volte chiamava questi punti "elettroni" e "protoni".{*EF*}{*B*}{*B*} + + + +{*C2*}A volte li chiamava "pianeti" e "stelle".{*EF*}{*B*}{*B*} +{*C2*}A volte credeva di esistere in un universo fatto di energia composta da serie di on e di off, di zero e di uno, di linee di codice. A volte credeva di giocare a un gioco. A volte credeva di leggere parole su uno schermo.{*EF*}{*B*}{*B*} +{*C3*}Tu sei il giocatore che legge le parole...{*EF*}{*B*}{*B*} +{*C2*}Silenzio... A volte il giocatore leggeva linee di codice su uno schermo, le scomponeva in parole e da esse ricavava un significato, che diventava sensazioni, emozioni, teorie e idee. Il giocatore iniziò a respirare più velocemente, più profondamente... Si era reso conto di essere vivo. Era vivo. Le migliaia di morti attraverso le quali era passato non erano reali. Il giocatore era vivo{*EF*}{*B*}{*B*} +{*C3*}Tu... Tu... sei... vivo.{*EF*}{*B*}{*B*} +{*C2*}E a volte il giocatore credeva che l'universo gli avesse parlato mediante i raggi di sole che filtravano tra le foglie ondeggianti sugli alberi d'estate...{*EF*}{*B*}{*B*} +{*C3*}E a volte il giocatore pensava che l'universo gli avesse parlato tramite la luce che cadeva dal limpido cielo delle notti invernali, quando un puntino luminoso nell'angolo del suo occhio poteva essere una stella milioni di volte più grande del sole, che trasformava i suoi pianeti in plasma incandescente per essere visibile per un solo istante al giocatore, che tornava a casa, dall'altro lato dell'universo, e sentiva il profumo dei cibi sulla porta a lui familiare, poco prima di rimettersi a sognare.{*EF*}{*B*}{*B*} +{*C2*}E a volte il giocatore credeva che l'universo gli avesse parlato con serie di zero e di uno, attraverso l'elettricità del mondo, con le parole che comparivano su uno schermo alla fine di un sogno.{*EF*}{*B*}{*B*} +{*C3*}L'universo gli diceva "ti amo"...{*EF*}{*B*}{*B*} +{*C2*}E l'universo gli diceva "hai giocato bene"...{*EF*}{*B*}{*B*} +{*C3*}E l'universo gli diceva "tutto ciò di cui hai bisogno è dentro di te"...{*EF*}{*B*}{*B*} +{*C2*}E l'universo gli diceva "sei più forte di quanto tu creda"...{*EF*}{*B*}{*B*} +{*C3*}E l'universo gli diceva "sei la luce del giorno"...{*EF*}{*B*}{*B*} +{*C2*}E l'universo gli diceva "tu sei la notte"...{*EF*}{*B*}{*B*} +{*C3*}E l'universo gli diceva "l'oscurità che combatti è dentro di te"...{*EF*}{*B*}{*B*} +{*C2*}E l'universo gli diceva "la luce che cerchi è dentro di te"...{*EF*}{*B*}{*B*} +{*C3*}E l'universo gli diceva "non sei solo"...{*EF*}{*B*}{*B*} +{*C2*}E l'universo gli diceva "tu non sei separato da tutte le altre cose"...{*EF*}{*B*}{*B*} +{*C3*}E l'universo gli diceva "tu sei l'universo che assapora sé stesso, che parla a sé stesso, che legge il proprio codice"...{*EF*}{*B*}{*B*} +{*C2*}E l'universo gli diceva "ti amo perché tu sei amore"...{*EF*}{*B*}{*B*} +{*C3*}E il gioco terminò, e il giocatore si svegliò dal sogno. Il giocatore iniziò un nuovo sogno, migliore del precedente. Il giocatore era l'universo. Il giocatore era amore.{*EF*}{*B*}{*B*} +{*C3*}Tu sei il giocatore.{*EF*}{*B*}{*B*} +{*C2*}Svegliati.{*EF*} + + +Resetta Sottomondo + +Ripristinare le impostazioni iniziali del Sottomondo in questo salvataggio? Tutto ciò che hai creato nel Sottomondo andrà perso! + +Resetta Sottomondo + +Non ripristinare il Sottomondo + +Impossibile tosare il muccafungo al momento. Hai raggiunto il numero massimo di maiali, pecore, mucche, gatti e cavalli. + +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. + +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 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. + +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. + +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. + +Hai raggiunto il numero massimo di teste di Mob in un mondo. + +Inverti + +Mancino + +Sei morto! + +Rigenera + +Offerte contenuto scaricabile + +Cambia skin + +Come giocare + +Comandi + +Impostazioni + +Riconoscimenti + +Reinstalla contenuto + +Impostazioni debug + +Diffusione incendio + +Esplosione TNT + +Giocatore vs Giocatore + +Autorizza giocatori + +Privilegi dell'host + +Genera strutture + +Mondo superpiatto + +Cassa bonus + +Opzioni mondo + +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 + +Può aprire contenitori + +Può attaccare i giocatori + +Può attaccare gli animali + +Moderatore + +Espelli giocatore + +Può volare + +Disabilita stanchezza + +Invisibile + +Opzioni host + +Giocatori/Invito + +Partita online + +Solo invito + +Altre opzioni + +Carica + +Nuovo mondo + +Nome mondo + +Seme per generatore mondo + +Lascia vuoto per seme casuale + +Giocatori + +Unisciti alla partita + +Avvia gioco + +Nessuna partita trovata + +Gioca + +Classifiche + +Obiettivi + +Guida e opzioni + +Sblocca gioco completo + +Riprendi gioco + +Salva gioco + +Difficoltà: + +Tipo di gioco: + +Gamertag: + +Strutture: + +Tipo di livello: + +GvG: + +Autorizza giocatori: + +TNT: + +Diffusione incendio: + +Reinstalla tema + +Reinstalla immagine del giocatore 1 + +Reinstalla immagine del giocatore 2 + +Reinstalla oggetto avatar 1 + +Reinstalla oggetto avatar 2 + +Reinstalla oggetto avatar 3 + +Opzioni + +Audio + +Comando + +Grafica + +Interfaccia utente + +Ripristina predefinite + +Vedi bobbing + +Aiuti + +Aiuti contestuali del gioco + +Gamertag nel gioco + +2 giocatori schermo diviso verticale + +Fatto + +Modifica messaggio cartello: + +Inserisci i dettagli del tuo screenshot + +Didascalia + +Screenshot del gioco + +Modifica messaggio cartello: + +Guarda cosa ho fatto a Minecraft: Xbox 360 Edition! + +Texture, icone e interfaccia classiche di Minecraft! + +Mostra tutti i mondi Mash-up + +Seleziona Trasferisci slot salvataggio + +Slot vuoto + +Caricamento metadati salvataggio + +Caricamento dati salvati + +Caricamento salvataggio per Xbox One + +Caricamento annullato + +Hai annullato il caricamento di questo salvataggio sull'area trasferimento salvataggio. + +Nessun effetto + +Velocità + +Lentezza + +Fretta + +Fatica del minatore + +Forza + +Debolezza + +Guarigione istantanea + +Danno istantaneo + +Salto potenziato + +Nausea + +Rigenerazione + +Resistenza + +Resistenza al fuoco + +Apnea + +Invisibilità + +Cecità + +Visione notturna + +Fame + +Veleno + +Avvizzito + +Bonus salute + +Assorbimento + +Saturazione + +della Velocità + +della Lentezza + +della Fretta + +dell'Opacità + +della Forza + +della Debolezza + +della Guarigione + +del Danno + +del Salto + +della Nausea + +della Rigenerazione + +della Resistenza + +della Resistenza al fuoco + +dell'Apnea + +dell'Invisibilità + +della Cecità + +della Visione notturna + +della Fame + +del Veleno + +del decadimento + +del bonus salute + +dell'assorbimento + +della saturazione + + + +II + +III + +IV + +Bomba + +Prosaica + +Banale + +Blanda + +Chiara + +Opaca + +Diffusa + +Rozza + +Sottile + +Maldestra + +Insipida + +Voluminosa + +Pasticciata + +Imburrata + +Amabile + +Affabile + +Distinta + +Densa + +Elegante + +Elaborata + +Affascinante + +Prestante + +Raffinata + +Cordiale + +Frizzante + +Potente + +Pessima + +Inodore + +Rancida + +Aspra + +Acida + +Disgustosa + +Puzzolente + +Si usa in un Banco di distillazione come base per tutte le pozioni. + +Non ha effetti; può essere usata in un Banco di distillazione per creare pozioni aggiungendo altri ingredienti. + +Aumenta la velocità di movimento di giocatori, animali e mostri affetti. Nei giocatori affetti aumenta inoltre la velocità di scatto, la lunghezza dei salti e il campo visivo. + +Riduce la velocità di movimento di giocatori, animali e mostri affetti. Nei giocatori affetti riduce inoltre la velocità di scatto, la lunghezza dei salti e il campo visivo. + +Aumenta i danni provocati con l'attacco da giocatori e mostri affetti. + +Riduce i danni provocati con l'attacco da giocatori e mostri affetti. + +Aumenta istantaneamente la salute di giocatori, animali e mostri affetti. + +Riduce istantaneamente la salute di giocatori, animali e mostri affetti. + +Restituisce progressivamente salute a giocatori, animali e mostri affetti. + +Rende giocatori, animali e mostri affetti immuni ai danni causati da fuoco, lava e attacchi a distanza di Vampe. + +Riduce progressivamente la salute di giocatori, animali e mostri affetti. + +Quando applicato: + +Forza salto cavallo + +Rinforzi zombie + +Salute massima + +Distanza inseguimento mostri + +Resistenza ad atterramento + +Velocità + +Danno attacco + +Acutezza + +Percossa + +Flagello degli Artropodi + +Atterramento + +Aspetto di Fuoco + +Protezione + +Protezione dal Fuoco + +Caduta della Piuma + +Protezione dalle esplosioni + +Protezione dai proiettili + +Respirazione + +Affinità con l'acqua + +Efficienza + +Tocco di Seta + +Durezza + +Saccheggio + +Fortuna + +Potenza + +Fiamma + +Pugno + +Infinito + +I + +II + +III + +IV + +V + +VI + +VII + +VIII + +IX + +X + +Si scava con una piccozza di ferro o migliore, per ottenere smeraldi. + +È simile a un forziere, ma gli oggetti posti in un forziere di Ender sono disponibili in tutti i forzieri di Ender, anche se di dimensioni diverse. + +Si attiva quando qualcosa passa sul filo collegato. + +Attiva un gancio a filo collegato quando qualcosa ci passa sopra. + +Una soluzione compatta per conservare gli smeraldi. + +Un muro fatto di ciottoli. + +Si può usare per riparare armi, attrezzi e armature. + +Si può fondere nelle fornaci per produrre quarzo del Sottomondo. + +Si usa come decorazione. + +Si usa per commerciare con gli abitanti dei villaggi. + +Si usa come decorazione. Al suo interno si possono piantare fiori, arbusti, cactus e funghi. + +Fa recuperare 2 {*ICON_SHANK_01*} e si può creare da una carota d'oro. Si può piantare sulle zolle. + +Fa recuperare 0,5 {*ICON_SHANK_01*} o si può cuocere nelle fornaci. Si può piantare sulle zolle. + +Fa recuperare 3 {*ICON_SHANK_01*}. Si crea cucinando una patata nella fornace. + +Fa recuperare 1 {*ICON_SHANK_01*}. Può avvelenarti. + +Reintegra 3 {*ICON_SHANK_01*}. Si realizza usando una carota e delle pepite d'oro. + +Si usa per controllare un maiale sellato quando lo si cavalca. + +Fa recuperare 4 {*ICON_SHANK_01*}. + +Si usa con un'incudine per incantare armi, attrezzi e armature. + +Si crea scavando il minerale di quarzo del Sottomondo. Si può trasformare in un blocco di quarzo. + +Si realizza con la lana. Si usa come decorazione. + +Smeraldo + +Vaso di fiori + +Carota + +Patata + +Patata arrostita + +Patata velenosa + +Carota d'oro + +Carota e bastone + +Torta di zucca + +Libro incantato + +Quarzo del Sottomondo + +Minerale di smeraldo + +Forziere di Ender + +Gancio a filo + +Filo + +Blocco di smeraldo + +Muro di ciottoli + +Muro di ciottoli muschiato + +Vaso di fiori + +Carote + +Patate + +Incudine + +Incudine + +Incudine poco danneggiata + +Incudine molto danneggiata + +Minerale di quarzo del Sottomondo + +Blocco di quarzo + +Blocco di quarzo cesellato + +Blocco portante di quarzo + +Scale di quarzo + +Tappeto + +Tappeto nero + +Tappeto rosso + +Tappeto verde + +Tappeto marrone + +Tappeto blu + +Tappeto viola + +Tappeto ciano + +Tappeto grigio chiaro + +Tappeto grigio + +Tappeto rosa + +Tappeto lime + +Tappeto giallo + +Tappeto azzurro + +Tappeto magenta + +Tappeto arancione + +Tappeto bianco + +Arenaria cesellata + +Arenaria liscia + +{*PLAYER*} ha perso la vita mentre cercava di far male a {*SOURCE*} + +Un'incudine è caduta e ha schiacciato {*PLAYER*}. + +Un blocco è caduto e ha schiacciato {*PLAYER*}. + +{*PLAYER*} ha raggiunto {*DESTINATION*} grazie al teletrasporto + +{*PLAYER*} ti ha fatto raggiungere il luogo dove si trova usando il teletrasporto + +{*PLAYER*} ti ha teletrasportato + +Spine + +Lastra di quarzo + +Le aree buie appaiono come se fossero alla luce del giorno, anche sott'acqua. + +Rende invisibili i giocatori, gli animali e i mostri che subiscono l'effetto. + +Ripara e dai un nome + +Costo incantesimo: %d + +Troppo caro! + +Cambia il nome + +Hai: + +Oggetti richiesti per lo scambio + +{*VILLAGER_TYPE*} offre %s + +Ripara + +Scambia + +Tingi il collare + + + Questa è l'interfaccia dell'incudine, che puoi usare per riparare, cambiare nome e applicare incantesimi ad armi, armature e attrezzi, al costo di livelli di esperienza. + + + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sull'interfaccia incudine.{*B*} + Premi{*CONTROLLER_VK_B*} se non hai bisogno di spiegazioni al riguardo. + + + + Per iniziare a lavorare su un oggetto, ponilo nel primo slot di inserimento. + + + + Quando la corretta materia prima (ad esempio, dei lingotti di ferro per riparare una spada di ferro danneggiata) è messa nel secondo slot di inserimento, la riparazione proposta comparirà nello slot di uscita. + + + + In alternativa, è possibile mettere nel secondo slot di inserimento un oggetto uguale a quello posto nel primo slot. I due oggetti saranno combinati tra loro. + + + + Per incantare un oggetto sull'incudine, posiziona un libro incantato nel secondo slot di inserimento. + + + + Sotto il risultato compare il numero di livelli di esperienza che il lavoro ti costerà. Se non hai livelli di esperienza a sufficienza, la riparazione non potrà essere completata. + + + + Puoi cambiare nome all'oggetto modificando quello che compare nel riquadro del testo. + + + + Quando prendi l'oggetto riparato, gli oggetti usati dall'incudine scompaiono e il tuo livello di esperienza si riduce della quantità indicata. + + + + In quest'area ci sono un'incudine e un forziere che contengono attrezzi e armi su cui puoi lavorare. + + + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sull'incudine.{*B*} + Premi{*CONTROLLER_VK_B*} se non hai bisogno di spiegazioni al riguardo. + + + + Usando l'incudine è possibile riparare armi e attrezzi per ripristinarne la durata, cambiare il loro nome e aggiungere incantesimi mediante i libri incantati. + + + + È possibile trovare i libri incantati all'interno di forzieri posti nei dungeon, oppure puoi crearli al Tavolo per incantesimi lanciando incantesimi sui libri normali. + + + + Usare l'incudine costa livelli di esperienza e, a ogni utilizzo, c'è la possibilità che essa si danneggi. + + + + Il tipo di lavoro da svolgere, il valore dell'oggetto, il numero di incantesimi e la quantità di lavoro precedente influiscono sul costo della riparazione. + + + + Cambiare il nome a un oggetto modifica il nome mostrato per tutti i giocatori e riduce in modo permanente il costo del lavoro precedente. + + + + Nel forziere in quest'area troverai piccozze danneggiate, materie prime, bottiglie magiche e libri incantati, tutti oggetti con i quali potrai condurre qualche esperimento. + + + + Questa è l'interfaccia del commercio, che mostra quali scambi puoi fare con un abitante del villaggio. + + + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sull'interfaccia del commercio.{*B*} + Premi{*CONTROLLER_VK_B*} se non hai bisogno di spiegazioni al riguardo. + + + + Nella parte superiore compaiono gli scambi che l'abitante del villaggio è disposto a fare in questo momento. + + + + Gli scambi indicati in rosso sono quelli che non puoi fare perché non disponi degli oggetti richiesti. + + + + Il tipo e la quantità di oggetti che offri all'abitante del villaggio compaiono nei due slot a sinistra. + + + + Nei due slot a sinistra è indicato il numero totale di oggetti richiesti per lo scambio. + + + + Premi{*CONTROLLER_VK_A*} per scambiare gli oggetti chiesti dall'abitante del villaggio con quello offerto. + + + + In quest'area ci sono un abitante del villaggio e un forziere contenente carta per acquistare oggetti. + + + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sul commercio.{*B*} + Premi{*CONTROLLER_VK_B*} se non hai bisogno di spiegazioni al riguardo. + + + + I giocatori possono scambiare con gli abitanti dei villaggi gli oggetti presenti nell'inventario. + + + + Gli oggetti che gli abitanti dei villaggi sono propensi a scambiare dipendono in massima parte dal mestiere che essi svolgono. + + + + Effettuare più scambi modifica in modo casuale l'elenco degli oggetti (anche aggiungendone di nuovi) che l'abitante del villaggio è disposto a scambiare. + + + + Il commercio degli oggetti che sono stati scambiati molto di frequente può essere temporaneamente sospeso. In ogni caso, l'abitante del villaggio avrà comunque almeno un oggetto da scambiare. + + + + Prendi della carta dal forziere e prova a scambiarla con l'abitante del villaggio. + + + + In quest'area ci sono due forzieri di Ender. + + + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sui forzieri di Ender.{*B*} + Premi{*CONTROLLER_VK_B*} se non hai bisogno di spiegazioni al riguardo. + + + + Tutti i forzieri di Ender presenti in un mondo sono collegati tra loro, anche attraverso dimensioni diverse. Attraverso uno qualsiasi dei forzieri di Ender, è possibile accedere agli oggetti messi in uno qualunque dei forzieri di Ender. + + + + Comunque, il contenuto dei forzieri di Ender è diverso per ciascun giocatore. + + + + In tal modo, i giocatori possono riporre i loro oggetti in qualsiasi forziere di Ender, e prenderli da qualsiasi forziere di Ender posto in qualsivoglia parte del mondo. Prova a mettere degli oggetti in uno dei forzieri di Ender. + + +Fa recuperare 2 {*ICON_SHANK_01*}, rigenera la salute per 30 secondi e dona resistenza al fuoco e resistenza ai danni per 5 minuti. Si crea usando una mela e dei blocchi d'oro. + +Può usare il teletrasporto + +Teletrasporto + +Teletrasporto verso il giocatore + +Teletrasporto verso di me + +Può disabilitare la stanchezza + +Può diventare invisibile + +Ora puoi attivare l'invisibilità + +Non puoi più attivare l'invisibilità + +Ora puoi attivare il volo + +Non puoi più attivare il volo + +Ora puoi disabilitare la stanchezza + +Non puoi più disabilitare la stanchezza + +Ora puoi usare il teletrasporto + +Non puoi più usare il teletrasporto + +{*T3*}COME GIOCARE: L'INCUDINE{*ETW*}{*B*}{*B*} +I livelli Esperienza possono anche essere usati per riparare o incantare gli oggetti con l'incudine, o per dar loro un nuovo nome.{*B*} +È possibile cambiare il nome a tutti gli oggetti, ma solo quelli durevoli possono essere riparati o ricevere incantesimi tramite i libri incantati.{*B*} +Per riparare un oggetto, mettilo in uno degli slot di inserimento posti sulla sinistra insieme a qualcuna delle materie prime da cui è composto (ad esempio, dei lingotti di ferro nel caso l'oggetto da riparare sia una spada di ferro) oppure combinalo con un altro oggetto dello stesso tipo.{*B*} +Usare un'incudine per combinare gli oggetti permette di lavorare con maggiore efficienza. Inoltre, gli incantesimi eventualmente presenti negli oggetti usati per la combinazione potrebbero passare al prodotto finito.{*B*} +I libri incantati possono incantare gli oggetti se combinati mediante un'incudine, a patto che l'incantesimo del libro sia adatto. È possibile trovare i libri incantati nei forzieri all'interno dei dungeon, ma si può anche incantare un libro normale usando il Tavolo per incantesimi.{*B*} +L'incudine può subire danni ogni volta che viene usata, e si romperà definitivamente dopo numerosi utilizzi.{*B*} + + +{*T3*}COME GIOCARE: COMMERCIO{*ETW*}{*B*}{*B*} +Puoi scambiare oggetti con gli abitanti dei villaggi. Ciascun abitante svolge un mestiere: ci sono contadini, macellai, fabbri, librai e sacerdoti, e il loro lavoro determina il tipo di oggetti che ciascuno di essi potrebbe scambiare.{*B*} +Nel menu del commercio troverai l'elenco di tutti gli oggetti che un abitante del villaggio offre. Quando un giocatore effettua scambi con un abitante di un villaggio, costui può modificare l'elenco degli oggetti offerti, anche aggiungendone di nuovi. Se un oggetto fosse scambiato troppo di frequente, il suo commercio potrebbe essere temporaneamente sospeso.{*B*} +Di norma, i commerci si svolgono acquistando o vendendo una certa quantità di oggetti in cambio di smeraldi.{*B*} +Se non disponi degli oggetti necessari per concludere uno scambio, gli oggetti sono colorati in rosso.{*B*} + + +{*T3*}COME GIOCARE: FORZIERI DI ENDER {*ETW*}{*B*}{*B*} +Tutti i forzieri di Ender presenti in un mondo sono collegati tra loro, quindi puoi accedere al contenuto di uno di essi tramite qualsiasi forziere di Ender. Il contenuto dei forzieri di Ender è diverso per ogni giocatore. I giocatori possono usare i forzieri di Ender per custodire i loro oggetti in tutta sicurezza e recuperarli da altri forzieri di Ender posti in qualsiasi parte del mondo. + + +Contadino + +Libraio + +Sacerdote + +Fabbro + +Macellaio + +Si trovano nei villaggi. Gli abitanti dei villaggi si offrono di vendere al giocatore oggetti che cambiano in base al loro mestiere. + +Forziere grande + + + È anche possibile creare i libri incantati al Tavolo per incantesimi. Successivamente, potrai usare i libri incantati con l'incudine per applicare i loro incantesimi agli oggetti. + + + + I ganci a filo forniscono anche energia costante a un circuito mentre qualcosa aziona la corda posta tra di essi. + + + + Dopo che sono stati ammansiti, i lupi indossano sempre il collare. Il colore del collare può essere cambiato usando le tinture. + + +Le carote e le patate si coltivano piantando carote e patate. Il raccolto è pronto quando i vegetali spuntano dal suolo. + + + Inoltre, i maiali possono essere sellati e poi cavalcati dai giocatori. È possibile controllare i maiali cavalcati dirigendoli con carota e bastone. + + + + Se necessario, puoi far muovere lentamente il carrello da miniera con {*CONTROLLER_ACTION_MOVE*}. In questo modo aiuterai il carrello a partire facendolo arrivare su un binario potenziato. + + +Non puoi unirti a questa partita perché lo schermo diviso è supportato solo in modalità Alta definizione. Se vuoi prendere parte al gioco, fai uscire tutti gli altri giocatori. + +Cura + +Xbox 360 + +Indietro + +L'opzione disabilita gli obiettivi e gli aggiornamenti della classifica durante il gioco e, se la partita viene salvata con l'opzione abilitata, l'impostazione rimane anche quando lo stesso mondo viene caricato di nuovo successivamente. + +Carica salvataggio per Xbox One + +Carica salvataggio + +Solo un salvataggio Xbox 360 può essere caricato nell'area trasferimento salvataggio. Assicurati di aver scaricato il salvataggio sulla tua console Xbox One prima di caricare un altro salvataggio Xbox 360. + +Caricamento... + +Caricamento completo! + +Caricamento non riuscito. Riprova più tardi. + + diff --git a/Minecraft.Client/Common/Media/ja-JP/4J_strings.resx b/Minecraft.Client/Common/Media/ja-JP/4J_strings.resx new file mode 100644 index 00000000..5ef7111d --- /dev/null +++ b/Minecraft.Client/Common/Media/ja-JP/4J_strings.resx @@ -0,0 +1,108 @@ + +未使用 + +OK + +戻る + +キャンセル + +はい + +いいえ + +破損したセーブデータ + +セーブデータが破損しています。新しいセーブデータを作成し、破損したデータを上書きしますか? + +空き容量が不足しています + +選択されているデータ保存機器には、新しいセーブデータを作成するための空き容量がありません + +別のデータ保存機器を選択 + +セーブなしでプレイ + +新しいセーブデータを作成 + +セーブデータを上書きしますか? + +選択したデータ保存機器にすでにセーブデータがあります。上書きしてもよろしいですか? + +上書きしない + +上書きしてセーブ + +セーブに失敗 + +データ保存機器のエラー + +データ保存機器が見つからないか、エラーが起きています + +データ保存機器が見つからないか、エラーが起きています。別のデータ保存機器を選択してください + +別のデータ保存機器を選択 + +データ保存機器が選択されていません + +データ保存機器を選択しない場合、ゲームはセーブできなくなります + +データ保存機器を選択 + +セーブなしでプレイ + +データ保存機器が取り外されています。新しいデータ保存機器を選択してください + +ロードに失敗 + +セーブデータの名前を入力 + +セーブデータの名前を入力してください + +Xbox ダッシュボードに戻る + +本当にゲームを終了してもよろしいですか? + +サインアウト + +ゲーマー プロフィールからサインアウトしました。タイトル画面に戻ります + +ゲーマー プロフィールからサインアウトしました。マッチを終了します + +プレイを続ける + +Xbox LIVE にサインインしていません + +このゲームの一部の機能では、Xbox LIVE にサインインしているゲーマー プロフィールが必要となります。現在は Xbox LIVE にサインインしていません。 + +この機能を使うには、Xbox LIVE にサインインしているゲーマー プロフィールが必要です。 + +Xbox LIVE にサインイン + +サインインせずにプレイを続ける + +実績獲得のエラー + +ゲーマー プロフィールに正常にアクセスできませんでした。現在は実績を獲得できません + +ゲーマー プロフィールのエラー + +ゲーマー プロフィールに設定を保存できませんでした + +ゲストのゲーマー プロフィール + +ゲストのゲーマー プロフィールではこの機能を利用できません。別のゲーマー プロフィールを使用してください + +保存中... + +保存しています。本体の電源を切らないでください + +完全版を購入 + +これは Minecraft のお試し版です。完全版であれば、今すぐ獲得できる実績があります! +完全版を購入して、Xbox LIVE を通じて世界中のフレンドと一緒に遊べる Minecraft の楽しさを体験してください。 +完全版を購入しますか? + +プロフィールの読み込みに問題が発生したため、メイン メニューに戻ります + + diff --git a/Minecraft.Client/Common/Media/ja-JP/strings.resx b/Minecraft.Client/Common/Media/ja-JP/strings.resx new file mode 100644 index 00000000..5326fb11 --- /dev/null +++ b/Minecraft.Client/Common/Media/ja-JP/strings.resx @@ -0,0 +1,5163 @@ + +新しいダウンロード コンテンツが追加されました! メイン メニューの [Minecraft ストア] からアクセスできます + +Minecraft ストアのスキン パックを使えば、あなたのキャラクターの外見を変えられます。メイン メニューの [Minecraft ストア] から品ぞろえを確認してくださいね + +高解像度モードを使うと、1 台の Xbox 360 本体で最大 4 人のプレイヤーが分割画面プレイ可能! + +Xbox 360 本体に別のコントローラーを接続し START を押すと、いつでもゲームに参加できます + +ガンマ設定を変更すると、ゲームの明るさを調整できます + +難易度を「ピース」に設定すると、HP が自動的に回復し、夜間にモンスターが出現しなくなります! + +オオカミに骨を与えて、手なずけましょう。おすわりさせたり、あなたについてこさせたりできます + +持ち物メニューで、カーソルをメニュー外に動かして、{*CONTROLLER_VK_A*} を押すと、アイテムを落とすことができます + +夜間にベッドで寝ると、朝まで時間をスキップすることができます。マルチプレイヤー ゲームでは、すべてのプレイヤーが寝ている必要があります + +豚から取れる豚肉を調理して食べると HP が回復します + +牛から取った革を使用して防具を作りましょう + +空のバケツがあれば、牛のミルクを搾ったり、水を汲んだり、溶岩を入れたりできます + +くわを使って、土地を耕しましょう + +クモは日中は、こちらから攻撃しない限り攻撃してきません + +手で地面や砂を掘るよりも、シャベルを使ったほうが速く掘れます + +豚肉は生で食べるよりも、調理したほうが HP を多く回復します + +たいまつを作って、夜に明かりとして使いましょう。たいまつの回りにはモンスターが近寄ってこなくなります + +トロッコとレールを使えば、早く目的地に着けます + +苗木を植えれば、成長して木になります + +Pigman は、こちらから攻撃しない限り、攻撃してきません + +ベッドで寝ることで、復活地点の変更と、夜から朝へ時間を早回しすることができます + +Ghast に火の玉を打ち返してやりましょう! + +闇のポータルを作れば、別の世界である暗黒界に行くことができます + +{*CONTROLLER_VK_B*} を押すと、手に持っているアイテムを落とします! + +目的にあった道具を使いましょう! + +たいまつに使う石炭が見つからないときには、かまどを使って木から木炭を作ることができます + +真下や真上に掘り進むのは、賢いとはいえません + +ガイコツの骨から作れる骨粉は、肥料として使って、色々なものを一瞬で成長させることができます! + +Creeper は近づくと爆発します! + +溶岩の源のブロックに水が触れると、黒曜石ができます + +溶岩の源のブロックを取り除くと、溶岩はしばらくして消えてしまいます + +丸石は Ghast の火の玉を防いでくれます。ポータルを守るのに使えます + +光源に使用できるブロックは、雪や氷を溶かすことができます。たいまつ、光石、カボチャ ランタンなどのブロックです + +屋外にウールで建物を建てる場合には、注意しましょう。雷が当たると燃えてしまいます + +バケツ 1 杯の溶岩があれば、かまどで 100 個のブロックを精錬できます + +音ブロックで演奏される楽器は、ブロックの下の材質で変化します + +ゾンビやガイコツは、水の中では太陽の光に当たっても大丈夫です + +オオカミを攻撃すると、近くにいるすべてのオオカミが襲い掛かってきます。ゾンビ Pigman も同じ習性を持っています + +オオカミは暗黒界に入ることができません + +オオカミは Creeper を攻撃しません + +ニワトリは 5~10 分ごとにタマゴを生みます + +黒曜石を掘り出すには、ダイヤモンドのツルハシが必要です + +Creeper からは火薬が簡単に手に入ります + +チェスト 2 つを並べて配置すれば、1 つの大きなチェストになります + +手なずけたオオカミの HP は尻尾の状態で分かります。回復するには、肉を与えましょう + +緑色の染料を作るには、サボテンをかまどで調理します + +ゲームの最新情報は 4J Studios と Kappische のTwitter でゲット! + +ポーズ メニューから Minecraft のスクリーンショットを Facebook に公開できます + +[遊び方] の最新情報で、更新情報をチェックできます + +柵を積み重ね可能としました + +minecraftforum には、Xbox 360 版専用セクションがあります + +動物の中には、小麦を持っているとついてくるものがいます + +いずれかの方向に 20 ブロック以上動けない動物は消滅しません + +BGM 制作: C418 + +Notch の Twitter には 100 万人以上のフォロワーがいます! + +スウェーデン人みんなが金髪というわけではありません。たとえば、Mojang の Jens は赤毛です + +4J Studios の Xbox 360 向け超ホラー大作「Herobrine」はまさかのキャンセル... というウワサ + +アップデートも予定中です。お楽しみに! + +Notch って誰? + +Mojang はスタッフの数より受けた賞の数の方が多かったりします + +有名人も Minecraft をプレイ中! + +deadmau5 は Minecraft が大好き! + +虫と目を合わせてはいけません + +Creeper はプログラムのバグから発生します + +ニワトリ? それともアヒル? + +MineCon には参加しましたか? + +Mojang のスタッフですらジャンクボーイの素顔は知りません + +Minecraft Wiki があるのを知っていますか? + +Mojang の新しい事務所はとっても最高 + +Minecraft: Xbox 360 版はさまざまな記録を更新しています! + +MineCon 2013 はフロリダ州オーランド (アメリカ合衆国) で開催されました! + +.party() は最高でした! + +ウワサは鵜呑みにしないこと。ほどほどに信じるのが一番! + +{*T3*}遊び方: 基本{*ETW*}{*B*}{*B*} +Minecraft は自由な発想でブロックを積み上げて、探検したり、いろいろな物を作ったりするゲームです。夜になるとモンスターが現れるので、その前に必ず安全な場所を作っておかなければなりません。{*B*}{*B*} +周囲を見回すには、{*CONTROLLER_ACTION_LOOK*} を押します。{*B*}{*B*} +歩き回るには、{*CONTROLLER_ACTION_MOVE*} を押します。{*B*}{*B*} +ジャンプするには、{*CONTROLLER_ACTION_JUMP*} を押します。{*B*}{*B*} +ダッシュするには、{*CONTROLLER_ACTION_MOVE*} を前方向にすばやく2回連続で押します。{*CONTROLLER_ACTION_MOVE*} を前に押している間、キャラクターはダッシュを続けます。ただし一定時間が過ぎるか空腹ゲージが{*ICON_SHANK_03*}.以下になると、そこでやめてしまいます。{*B*}{*B*} +手や、手に持ったアイテムで物を掘ったり、木を切ったりするには、 {*CONTROLLER_ACTION_ACTION*} を押し続けます。ブロックの中には、特別な道具を作らないと、掘ることができないものもあります。{*B*}{*B*} +手に持ったアイテムは、{*CONTROLLER_ACTION_USE*} で使うことができます。また、{*CONTROLLER_ACTION_DROP*} を押すと、そのアイテムを落とします + +{*T3*}遊び方: 画面の表示{*ETW*}{*B*}{*B*} +画面上にはプレイヤーのステータスが表示されています。HP、空気の残り (水中の場合)、空腹度 (何か食べると回復する)、装備している防具などです。 空腹ゲージの {*ICON_SHANK_01*} が 9 個以上ある状態では、HP が自然に回復します。食べ物を食べると空腹ゲージは回復します。{*B*} +経験値ゲージも画面に表示され、現在の経験値レベルと次のレベルまでに必要な値を確認できます。 経験値は、生き物を倒した時、特定のブロックを採掘した時、動物を繁殖させた時、釣り、かまどで鉱石を製錬した時などに獲得できる経験値オーブを集めると貯まっていきます。{*B*}{*B*} +さらに使用できるアイテムも表示され、{*CONTROLLER_ACTION_LEFT_SCROLL*} と {*CONTROLLER_ACTION_RIGHT_SCROLL*} で手に持つアイテムを切り替えられます + +{*T3*}遊び方: 持ち物{*ETW*}{*B*}{*B*} +持ち物は {*CONTROLLER_ACTION_INVENTORY*} で見ることができます。{*B*}{*B*} +この画面では、手にしている使用可能なアイテム、所有しているアイテムのリスト、現在装備している防具を確認できます。{*B*}{*B*} +ポインターを {*CONTROLLER_MENU_NAVIGATE*} で動かして、アイテムに合わせてから {*CONTROLLER_VK_A*} を押すと、アイテムを選択できます。そのアイテムを複数所有している場合は、そのすべてが選択されます。半分だけ選択するには {*CONTROLLER_VK_X*} を使用します。{*B*}{*B*} +ポインターで選んだアイテムを持ち物の別の場所に移動させるには、移動先で {*CONTROLLER_VK_A*} を押します。 ポインターに複数のアイテムがある場合は、{*CONTROLLER_VK_A*} を押すと全部、 {*CONTROLLER_VK_X*} を押すと 1 つだけ移動させることができます。{*B*}{*B*} +ポインターで選んだアイテムが防具の場合、適切な防具スロットに移すためのボタンガイドが表示されます。{*B*}{*B*} +革のアーマーは染色することができます。持ち物メニューのポインターで染料を選び、染色するアイテムの上にポインターを移動させて{*CONTROLLER_VK_X*} を押すと染色することができます + + +{*T3*}使い方: チェスト{*ETW*}{*B*}{*B*} +チェストを作ったら、それをゲームの世界に置きましょう。{*CONTROLLER_ACTION_USE*} でチェストを使って、中にアイテムを保管できます。{*B*}{*B*} +ポインターを使って、アイテムを持ち物からチェストに、あるいはその逆に移せます。{*B*}{*B*} +チェストに入れたアイテムは、そのまま保管されるので、後で、チェストから、自分の持ち物にアイテムを取り出せます + + +{*T3*}使い方: チェスト (大){*ETW*}{*B*}{*B*} +2 つのチェストを横に並べて置くと、チェスト (大) になります。よりたくさんのアイテムを保管できます。{*B*}{*B*} +使い方は普通のチェストと同じです + + +{*T3*}遊び方: 工作{*ETW*}{*B*}{*B*} +工作画面では、持ち物のアイテムを組み合わせて新しいアイテムを作れます。 工作画面を開くには {*CONTROLLER_ACTION_CRAFTING*} を押します。{*B*}{*B*} +画面上部のタブを {*CONTROLLER_VK_LB*} と {*CONTROLLER_VK_RB*} で切り替えて、作りたいアイテムのグループを選んでから {*CONTROLLER_MENU_NAVIGATE*} で作るアイテムを選びます。{*B*}{*B*} +工作ウィンドウに、そのアイテムを作るのに必要なアイテムが表示されます。{*CONTROLLER_VK_A*} を押すと、アイテムが作られ、持ち物に追加されます + + +{*T3*}使い方: 作業台{*ETW*}{*B*}{*B*} +作業台を使うと、もっと大きなアイテムを作ることができます{*B*}{*B*} +ゲームの世界に作業台を置いて {*CONTROLLER_ACTION_USE*} を押すと、使うことができます{*B*}{*B*} +作業台での作業も通常の工作と流れは同じですが、工作ウィンドウが大きくなり、より多くのアイテムを作れるようになります + + +{*T3*}使い方: かまど{*ETW*}{*B*}{*B*} +かまどを使ってアイテムに熱を加えることで、そのアイテムを加工できます。例えば、鉄鉱石を鉄の延べ棒に変えることができます。{*B*}{*B*} +ゲームの世界にかまどを置いて {*CONTROLLER_ACTION_USE*} を押すと使うことができます。{*B*}{*B*} +かまどの下に燃料を入れ、上には加工したいアイテムを入れてください。するとかまどに火が入り、加工が始まります。{*B*}{*B*} +加工が終わると、そのアイテムをかまどの取り出し口から持ち物に移すことができます。{*B*}{*B*} +ポインターで選んだアイテムがかまどで使用する素材または燃料の場合、かまどへ移動するためのボタンガイドが表示されます + + +{*T3*}使い方: 発射装置{*ETW*}{*B*}{*B*} +発射装置を使うと、アイテムを撃ち出すことができます。そのためには発射装置の横にレバーなどのスイッチ部分を取り付ける必要があります。{*B*}{*B*} +発射装置にアイテムを入れるには、{*CONTROLLER_ACTION_USE*} を押してから、持ち物からアイテムを発射装置に移します。{*B*}{*B*} +それから取り付けたスイッチを使うと、発射装置がアイテムを撃ち出します + + +{*T3*}使い方: 調合{*ETW*}{*B*}{*B*} +ポーションの調合には作業台で作れる調合台を使います。ポーションの調合にはまず水のビンが必要なので、大釜や水源からガラスビンに水を移し、水のビンを用意しましょう。{*B*} +調合台にはビンを置く枠が 3 つあり、1 回の調合で最大 3 つのポーションを調合できます。1 つの材料でビン 3 本分のポーションが作れるので、資源を効率よく使うには一度に 3 つのポーションを作りましょう。{*B*} +調合台の上の枠にポーションの材料を置いて少し待つと、基剤となるポーションができます。基剤自体に効果はありませんが、別の材料を加えて調合すると、効力を持つポーションを作れます。{*B*} +このポーションが完成したら、3 つめの材料を加えてさらなる効果をつけてみましょう。レッドストーンの粉を足せば効果の持続時間が長くなり、光石の粉を足せばポーションの効力が高まり、発酵したクモの目を足せばマイナス効果のあるポーションが作れます。{*B*} +また、どのポーションでも火薬を加えればスプラッシュポーションになります。スプラッシュポーションは投げて使用し、落ちた場所に効果を発揮します。{*B*}ポーションの原材料となるものは以下の通りです:-{*B*}{*B*} +* {*T2*}暗黒茸{*ETW*}{*B*} +* {*T2*}クモの目{*ETW*}{*B*} +* {*T2*}砂糖{*ETW*}{*B*} +* {*T2*}Ghast の涙{*ETW*}{*B*} +* {*T2*}Blaze パウダー{*ETW*}{*B*} +* {*T2*}マグマクリーム{*ETW*}{*B*} +* {*T2*}輝くスイカ{*ETW*}{*B*} +* {*T2*}レッドストーンの粉{*ETW*}{*B*} +* {*T2*}光石の粉{*ETW*}{*B*} +* {*T2*}発酵したクモの目{*ETW*}{*B*}{*B*} + +調合できる材料の組み合わせはたくさんありますので、色々と実験してみてください! + + +{*T3*}使い方: エンチャント{*ETW*}{*B*}{*B*} +モンスターや動物を倒したり、採掘したり、かまどを使った精錬や料理で獲得した経験値は、一部の道具や武器、防具のエンチャントに使えます。{*B*} +剣、弓、斧、ツルハシ、シャベルまたは防具をエンチャントテーブルの本の下の枠に置くと、右側のボタンにエンチャントとエンチャントで消費される経験値が示されます。{*B*} +エンチャントに必要な経験値は、不足している場合は赤、足りている場合は緑で表示されます。{*B*}{*B*} +エンチャントは消費可能な経験値の範囲でランダムに選択されます。{*B*}{*B*} +エンチャントテーブルの周囲に、テーブルとブロック 1 つ分のすき間を空けて本棚 (最大 15 台) を並べることで、エンチャントのレベルが上がります。また本棚からテーブル上の本に向けて文字が流れ込むエフェクトが表示されます。{*B*}{*B*} +エンチャントテーブルに必要な材料はすべて村や採掘、農耕などで手に入ります。{*B*}{*B*} +エンチャントした本は金床を使ってアイテムをエンチャントすることができます。これによりアイテムにより多くのエンチャントを選択することができます{*B*} + + +{*T3*}遊び方: 動物の飼育{*ETW*}{*B*}{*B*} +動物を特定の場所で飼うには 20 x 20 ブロック未満のエリアに柵を立て、その中に動物を入れます。これで動物は柵の中にとどまり、いつでも様子を見ることができます + + +{*T3*}遊び方: 動物の繁殖{*ETW*}{*B*}{*B*} +Minecraft に登場する動物は繁殖能力を持ち、自分たちの赤ちゃんバージョンを産み出します!{*B*} +動物を繁殖させるには、その動物にあった餌を与えて、動物たちを「求愛モード」に導く必要があります。{*B*} +牛、Mooshroom、羊には小麦、豚にはニンジン、ニワトリには小麦の種か暗黒茸、オオカミには肉を与えましょう。すると、近くにいる求愛モードの仲間を探し始めます。{*B*} +求愛モードになっている同じ種類の動物が出会うと、少しの間キスをして赤ちゃんが誕生します。赤ちゃんは、成長するまでは両親の後ろをついて回ります。{*B*} +一度求愛モードになった動物は 5 分間は再び求愛モードになることはありません。{*B*} +世界全体で出現する動物の数には制限があるため、たくさんいる動物は繁殖しないことがあります + +{*T3*}使い方: 闇のポータル{*ETW*}{*B*}{*B*} +闇のポータルを使うと、地上界と暗黒界の間を行き来できます。暗黒界は地上界の場所をすばやく移動したい時に便利です。暗黒界での 1 ブロックの移動は、地上界での 3 ブロックの移動に相当します。つまり暗黒界にもポータルを作って +地上界に出ると、同じ時間で 3 倍離れた場所に出ることができます。{*B*}{*B*} +ポータルを作るには、少なくとも黒曜石が 10 個必要で、ポータルは高さ 5 ブロック x 横 4 ブロック x 奥行 1 ブロックでなければいけません。ポータルの枠を作ったら、枠の中に火を付けることでポータルが起動します。火は、火打ち石と打ち金または発火剤で付けられます。{*B*}{*B*} +右の図は、完成したポータルの見本です + + +{*T3*}遊び方: マルチプレイヤー{*ETW*}{*B*}{*B*} +Minecraft Xbox 360 版は、初期設定でマルチプレイヤー ゲームになっています。高解像度でプレイしている場合はコントローラーを接続して START を押すと、いつでもローカル プレイヤーがゲームに参加できます。{*B*}{*B*} +開始または参加したオンライン ゲームはフレンド リストに表示されます (ホストとしてゲームを開始するときに [招待者のみ] を選択した場合を除きます)。フレンドが参加するとそのフレンド リストにもゲームが表示され、フレンドからフレンドにゲームが広がっていきます (オプションで [フレンドのフレンドを許可] を選択している場合)。{*B*} +ゲーム中に BACK ボタンを押すと、参加中のプレイヤーのリストを開けます。リストからゲーマー カードを確認したり、プレイヤーを追放したり、ゲームに招待したりできます + + +{*T3*}遊び方: スクリーンショットの公開{*ETW*}{*B*}{*B*} +ポーズ メニューで {*CONTROLLER_VK_Y*} を押してスクリーンショットを撮影し、Facebook で公開することができます。投稿の前に、撮影したスクリーンショットの縮小版が表示され、投稿に添えるメッセージを編集できます。{*B*}{*B*} +スクリーンショット撮影に適したカメラ モードも用意されています。キャラクターの正面からのショットを撮影して公開するには、{*CONTROLLER_ACTION_CAMERA*} を何度か押して正面からのカメラに切り替え、{*CONTROLLER_VK_Y*} を押します。{*B*}{*B*} +スクリーンショットにゲーマータグは表示されません + + +{*T3*}遊び方: 世界へのアクセス禁止{*ETW*}{*B*}{*B*} +プレイ中の世界が不適切なコンテンツを含んでいる場合、その世界をアクセス禁止リストに登録できます。 +世界をアクセス禁止リストに登録するには、ポーズ メニューを開き、{*CONTROLLER_VK_RB*} を押して、[アクセスを禁止] を選択します。 +次にその世界でプレイしようとすると、アクセス禁止リストに登録されていることが通知され、リストから外してプレイするか、プレイをキャンセルして戻るか選択できます + +{*T3*}遊び方: クリエイティブ モード{*ETW*}{*B*}{*B*} +クリエイティブ モード画面では採掘や工作をしなくても、ゲーム内のあらゆるアイテムを持ち物に加えられます。 +プレイヤーの持ち物内にあるアイテムは、世界に置いたり使ったりしても持ち物から消えないため、材料集めの面倒がなく建設そのものに集中できます。{*B*} +クリエイティブ モードで作成、ロード、セーブした世界は、たとえ後でサバイバル モードでロードしたとしても、実績やランキング更新の対象になりません。{*B*} +クリエイティブ モードで飛行するには、{*CONTROLLER_ACTION_JUMP*} をすばやく 2 回押します。飛行をやめるには、同じ操作をもう一度行います。より速く飛ぶには、飛行中に {*CONTROLLER_ACTION_MOVE*} を前方向にすばやく 2 回押します。 +飛行モードでは、{*CONTROLLER_ACTION_JUMP*} で上昇、{*CONTROLLER_ACTION_SNEAK*} で下降できます。または、{*CONTROLLER_ACTION_DPAD_UP*} で上昇、 {*CONTROLLER_ACTION_DPAD_DOWN*} で下降、 +{*CONTROLLER_ACTION_DPAD_LEFT*} で左に、{*CONTROLLER_ACTION_DPAD_RIGHT*} で右に飛べます + +{*T3*}遊び方: ホストとプレイヤーのオプション{*ETW*}{*B*}{*B*} + +{*T1*}ゲーム オプション{*ETW*}{*B*} +世界をロードまたは生成する際、[その他のオプション] を選択して、さらに詳細な設定ができるようになりました。{*B*}{*B*} + + {*T2*}PvP{*ETW*}{*B*} + 有効にすると、プレイヤーが他のプレイヤーにダメージを与えられるようになります (サバイバル モードのみ)。{*B*}{*B*} + + {*T2*}高度な操作を許可{*ETW*}{*B*} + 無効にするとゲームに参加したプレイヤーの行動が制限され、採掘やアイテムの使用、ブロックの設置、ドアとスイッチや入れ物の使用、他のプレイヤーや動物に対する攻撃ができなくなります。ゲーム内のメニューにより特定のプレイヤーに対する設定を変更できます。{*B*}{*B*} + + {*T2*}火の延焼{*ETW*}{*B*} + 有効にすると近くの可燃性ブロックに火が延焼します。この設定はゲーム内のメニューで変更できます。{*B*}{*B*} + + {*T2*}TNT の爆発{*ETW*}{*B*} + 有効にすると起爆した TNT が爆発します。この設定はゲーム内のメニューで変更できます。{*B*}{*B*} + + {*T2*}ホスト特権{*ETW*}{*B*} + 有効にすると、ホストの飛行能力、疲労無効、ゲーム内メニューでの非表示を切り替えられます。{*DISABLES_ACHIEVEMENTS*}{*B*}{*B*} + + {*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*} + + {*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*} + 自分や他のプレイヤーを世界にいる他のプレイヤーの場所に移動することができます。 + + + +ホストプレイヤーと同じ {*PLATFORM_NAME*} を使用していないプレイヤーに対してこのオプションを選択すると、そのプレイヤーおよび対象プレイヤーと同じ {*PLATFORM_NAME*} を使用している他のプレイヤーがゲームから追放されます。追放されたプレイヤーは、ゲームが再起動されるまでは再び参加できません + +次へ + +前へ + +基本 + +画面の表示 + +持ち物 + +チェスト + +工作 + +かまど + +発射装置 + +動物の飼育 + +動物の繁殖 + +調合 + +エンチャント + +闇のポータル + +マルチプレイヤー + +スクリーンショットの公開 + +世界へのアクセス禁止 + +クリエイティブ モード + +ホストとプレイヤーのオプション + +取引 + +金床 + +果ての世界 + +{*T3*}遊び方: 果ての世界{*ETW*}{*B*}{*B*} +果ての世界は別世界の 1 つで、果てのポータルを起動して行くことができます。果てのポータルは地上界の地下深くの要塞にあります。{*B*} +果てのポータルを起動するには、エンダーアイを果てのポータルの枠内にはめ込む必要があります。{*B*} +ポータルが起動したら、飛び込んで果ての世界に行きましょう。{*B*}{*B*} +果ての世界では、恐ろしく手ごわい Enderman たちが待ち構えているだけでなく、エンダー ドラゴンが出現します。果ての世界に進む前にしっかり準備を整えましょう!{*B*}{*B*} +8 本の黒曜石の柱の上にはエンダー クリスタルがあり、エンダー ドラゴンはこれを使って回復します。 +戦いが始まったら最初にエンダー クリスタルをひとつずつ破壊しましょう。{*B*} +手前の数個は矢が届く場所にありますが、残りは鉄の柵で囲まれています。届く高さまで足場を積み上げましょう。{*B*}{*B*} +その間、エンダー ドラゴンが飛びかかってきたり、エンダー アシッド ブレスを吐いて攻撃してきます!{*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*} - 堅焼き粘土、色付き粘土、石炭のブロック、干し草の俵、アクティベーター レール、レッドストーンのブロック、日照センサー、ドロッパー、ホッパー、ホッパー付きトロッコ、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*} +ドロッパーがチェストまたは他の種類の入れ物に面している場合、アイテムはドロッパーではなく、そちらへ投入されます。ドロッパーを多数つなげて設置すれば、離れた場所との間でアイテムを運べます。そのように動作させるには、電源を交互にオンとオフにする必要があります。 + + +手よりも攻撃力が高い + +土、草、砂、砂利や雪を掘るのに使う。手で掘るより速い。雪玉を掘るにはシャベルが必要 + +石でできているブロックと鉱石を掘るのに必要 + +木でできているブロックを切り出すのに使う。手で切り出すより速い + +土や草のブロックを耕して作物を育てられるようにする + +木のドアは、使用したり、叩いたり、レッドストーンを使うことで開きます + +鉄のドアを開くには、レッドストーンや、ボタン、スイッチを使う必要があります + +NOT USED + +NOT USED + +NOT USED + +NOT USED + +装備するとアーマーポイント +1 + +装備するとアーマーポイント +3。 + +装備するとアーマーポイント +2 + +装備するとアーマーポイント +1 + +装備するとアーマーポイント +2 + +装備するとアーマーポイント +5 + +装備するとアーマーポイント +4。 + +装備するとアーマーポイント +1 + +装備するとアーマーポイント +2 + +装備するとアーマーポイント +6 + +装備するとアーマーポイント +5 + +装備するとアーマーポイント +2 + +装備するとアーマーポイント +2 + +装備するとアーマーポイント +5 + +装備するとアーマーポイント +3。 + +装備するとアーマーポイント +1 + +装備するとアーマーポイント +3。 + +装備するとアーマーポイント +8 + +装備するとアーマーポイント +6 + +装備するとアーマーポイント +3。 + +光沢を放つ延べ棒、道具を作る材料として使う。かまどで鉱石を精錬して作る + +延べ棒、宝石、染料などを、世界に置けるブロックに変えられる。高級な建築用ブロックや、鉱石の保管用として使うことができる + +プレイヤーや動物、モンスターなどが上を通ると電気を送り出す。木の重量感知板は、物を上に置くことでも作動する + +小さな階段を作るのに使う + +長い階段を作るのに使う。それぞれの上部に 2 つの厚板を置くことで、通常サイズの 2 倍の厚板ブロックを作ることができる + +長い階段を作るのに使う。それぞれの上部に 2 つの厚板を置くことで、通常サイズの 2 倍の厚板ブロックを作ることができる + +明かりを照らすのに使う。たいまつは、雪や氷も溶かすことができる + +建築用素材。様々な物の材料になる。どんな形の木からでも切り出せる + +建築用素材。通常の砂のように重力の影響を受けない + +建築用素材 + +たいまつ、矢、看板、はしご、柵を作る、または道具や武器の握り部分を作るのに使う + +ゲーム内の全てのプレイヤーがベッドで寝ている時に使うと、夜から朝へ時間を早回しすることができる。そして、使用したプレイヤーの復活地点が変わる。 +ベッドの色は使われたウールの色に関係なく、常に同じ + +通常の工作よりも、さらに多くの種類のアイテムを作ることができる + +鉱石を精錬して木炭やガラスを作ったり、魚や豚肉を調理することができる + +中にブロックやアイテムを保管できる。2 つのチェストを横に並べることで、2 倍の容量のチェスト (大) ができる + +「障害物」として機能し、ジャンプで飛び越えることができない。プレイヤーや動物、モンスターに対しては、高さ 1.5 ブロックとして機能し、他のブロックに対しては高さ 1 ブロックとして機能する + +垂直方向に登るのに使う + +使用したり、叩いたり、レッドストーンで開く。普通のドアとして機能するが、ブロック 1 個分であり、平らな床面として置ける + +自分や他のプレイヤーの入力したテキストを表示できる + +たいまつよりも明るい光で照らすことができる。雪や氷を溶かしたり、水中でも使える + +爆発を起こすのに使う。置いてから火打石と打ち金を使ったり、電気を通すことで起爆する + +きのこシチューを入れるのに使う。シチューを食べてしまっても、おわんは残る + +水や溶岩、ミルクを貯めて移動するのに使う + +水を入れて運ぶのに使う + +溶岩を入れて運ぶのに使う + +ミルクを入れて運ぶのに使う + +火を起こしたり、TNT を起爆したり、建築済みのポータルを開くのに使う + +魚を獲るのに使う + +太陽と月の位置を表示する + +自分のスタート地点を示す + +手に持っていると、探索済みのエリアの地図を表示する。道を確認するのに使う + +使用すると、プレイヤーの世界内での現在位置周辺の地図になる。探検するにつれて図面が埋まっていく + +矢を射る攻撃ができる + +弓と組み合わせて、武器として使う + +ウィザーが落とす。ビーコンを作るのに使う。 + +作動すると、色とりどりの火花を作り出す。その色、形状、色変化は、花火を作る際に使う花火の星によって決まる。 + +花火の色、効果、形状を決めるために使う。 + +レッドストーン回路で、信号強度を維持、比較、または減算したり、特定のブロックの状態を測定したりするために使う。 + +移動する TNT ブロックとして機能する、トロッコの一種。 + +日光 (またはその不足) に応じてレッドストーン信号を出力するブロック。 + +ホッパーと同じように機能する特別な種類のトロッコ。軌道上に落ちているアイテムや、上に位置する入れ物からのアイテムを収集する。 + +馬に装着できる特別な種類の防具。防御力 +5。 + +馬に装着できる特別な種類の防具。防御力 +7。 + +馬に装着できる特別な種類の防具。防御力 +11。 + +生き物をプレイヤーまたはフェンスの柱につなぐために使う。 + +世界内の生き物に名前をつけるのに使う。 + +2.5{*ICON_SHANK_01*} 回復する。 + +1{*ICON_SHANK_01*} 回復する。6 回まで使用できる。 + +1{*ICON_SHANK_01*} 回復する。 + +1{*ICON_SHANK_01*} 回復する。 + +3{*ICON_SHANK_01*} 回復する。 + +1{*ICON_SHANK_01*} 回復する。かまどで調理することも可能。病気になる場合もある + +3{*ICON_SHANK_01*} 回復する。鶏肉をかまどで調理するとできる + +1.5{*ICON_SHANK_01*} 回復する。かまどで調理することも可能 + +4{*ICON_SHANK_01*} 回復する。牛肉をかまどで調理するとできる + +1.5{*ICON_SHANK_01*} 回復する。かまどで調理することも可能 + +4{*ICON_SHANK_01*} 回復する。生の豚肉をかまどで調理するとできる + +1{*ICON_SHANK_01*} 回復する。かまどで調理することも可能。ヤマネコに与えて手なずけることもできる + +2.5{*ICON_SHANK_01*} 回復する。生魚をかまどで調理するとできる + +2{*ICON_SHANK_01*} 回復する。金のリンゴの材料となる。 + +2{*ICON_SHANK_01*} 回復し、さらに HP が 4 秒間、自動回復する。リンゴと金の塊から作る + +2{*ICON_SHANK_01*} 回復するが、病気になる場合もある + +ケーキの材料の 1 つ。ポーションの調合としても使うことができる + +オン/オフを切り替えて、電気を送れる。もう一度押すまでオンまたはオフの状態が保たれる + +ブロックの横に取り付けて、常に電気を送ったり、送信機、受信機として使える。 +弱い明かりとしても使用可能 + +反復装置、遅延装置、ダイオードとして単体で、または組み合わせて、レッドストーンの回路に使われる + +押すと電気を送れる。約 1 秒間起動した後、自動的にオフになる + +レッドストーンを電源として使い、ランダムな順番でアイテムを撃ち出す + +音を奏でる。叩くと音程を変えられる。種類の違うブロックの上に置くことで、楽器の種類を変えることができる + +トロッコを走らせるのに使う + +電源が入っている時、上を走るトロッコを加速させる。電源が入っていない時は、上でトロッコが止まる + +トロッコ専用の重量感知板として機能する。電源が入っている時にレッドストーンの信号を送る。 + +プレイヤーや動物、モンスターを乗せて、レールの上を移動できる + +物を運んで、レール上を移動できる + +レールの上を移動する。石炭を使うことで他のトロッコを押すことができる + +泳ぐよりも速く水上を移動できる + +羊から採れる。染料を使って色を変えることができる + +建築用素材。染料で色を変えることができる。ウールは羊から簡単に入手できるので、この作り方はあまりお勧めできない + +黒のウールを作るのに使う染料 + +緑のウールを作るのに使う染料 + +茶色のウールを作るのに使う染料。クッキーの材料やカカオポッドを育てるのために使うこともできる + +銀のウールを作るのに使う染料 + +黄色のウールを作るのに使う染料 + +赤のウールを作るのに使う染料 + +即座に作物や木、背の高い草、巨大なきのこ、花などを育てるのに使う。染料の材料にもなる + +ピンクのウールを作るのに使う染料 + +オレンジのウールを作るのに使う染料 + +黄緑のウールを作るのに使う染料 + +灰色のウールを作るのに使う染料 + +薄灰色のウールを作るのに使う染料 +(注意: 薄灰色の染料は灰色の染料と骨粉を混ぜて作ることもできる。この方法だと 3 つではなく 1 つの墨袋から 4 つの薄灰色の染料を作ることができる) + +空色のウールを作るのに使う染料 + +水色のウールを作るのに使う染料 + +紫のウールを作るのに使う染料 + +赤紫のウールを作るのに使う染料 + +青のウールを作るのに使う染料 + +音楽ディスクを聞ける + +強力な道具、武器や防具を作ることができる + +たいまつよりも明るい光で照らすことができる。雪や氷を溶かしたり、水中でも使える + +本や地図を作るのに使う + +本棚を作るのに使ったり、エンチャントしてエンチャントした本を作るために使う。 + +エンチャントテーブルの周囲に置いて、より強力なエンチャントを作る + +飾り付けとして使う + +鉄のツルハシ以上で掘れる。かまどに入れて精錬すると、金の延べ棒になる + +石のツルハシ以上で掘れる。かまどに入れて精錬すると、鉄の延べ棒になる + +ツルハシで掘れる。石炭が採れる + +石のツルハシ以上で掘れる。ラピスラズリが採れる + +鉄のツルハシ以上で掘れる。ダイヤモンドが採れる + +鉄のツルハシ以上で掘れる。レッドストーンの粉が採れる + +ツルハシで掘れる。丸石が採れる + +シャベルを使って集める。建築用に使われる + +植えると、最終的に木に成長する + +破壊することができない + +様々な物に火をつけることができる。バケツを使って集める + +シャベルを使って集める。かまどに入れて精錬するとガラスになる。下に何もないと重力に引かれる + +シャベルを使って集める。掘っていると、時々火打ち石が出てくる。下に何もないと重力に引かれる + +斧を使って切る。木の板の材料になったり、燃料としても使われる + +かまどで砂を精錬するとできる。建築用素材として使えるが、掘ると壊れる + +ツルハシを使って石から掘り出す。かまどや石の道具を作るのに使う + +かまどで粘土を焼いて作る + +かまどで焼くとレンガになる + +破壊されると粘土の塊を落とします。粘土はかまどで焼くとレンガになります + +雪玉を保管するのに使える + +シャベルで掘り出して雪玉を作る + +壊すと時々、小麦の種が出てくる + +染料の材料になる + +おわんに入れてシチューを作れる + +ダイヤモンドのツルハシのみで掘れる。水と溶岩が混ざることで生まれる。ポータルの材料になる + +モンスターを出現させる + +地面に置いて、電気を伝えられる。ポーションと調合すると効果の持続時間が延長される + +十分に育つと作物が実り、小麦を収穫できる + +耕された地面。種を植えられる + +かまどで調理することで、緑色の染料になる + +砂糖を作るための材料になる + +ヘルメットとしてかぶったり、たいまつと組み合わせてカボチャ ランタンにできる。パンプキンパイの主な材料でもある + +いったん火がつくと、燃え続ける + +上を歩くもののスピードを遅くする + +ポータルを通過すると、地上界と暗黒界を行き来できる + +かまどの燃料として使用する。たいまつの材料にもなる + +クモを倒すと手に入る。弓や釣り竿の材料になったり、地面に置いてトリップワイヤーを作る + +ニワトリを倒すと手に入る。矢の材料になる + +Creeper を倒すと手に入る。TNT 火薬の材料になる。ポーションを調合する材料として使う + +農地にまくと作物ができる。日光が十分に当たるようにしよう! + +作物から収穫できる。食べ物アイテムを作るのに使われる + +砂利を掘ると手に入る。火打ち石と打ち金の材料になる + +豚に向かって使うと、その豚に乗れるようになる。豚は棒付きのニンジンを使って操縦できる + +雪を掘ると手に入る。投げることができる + +牛を倒すと手に入る。防具の材料となる。本を作ることができる + +スライムを倒すと手に入る。ポーションを調合する材料として使う。吸着ピストンの材料にもなる + +ニワトリがランダムで落とす。食べ物アイテムの材料になる + +光石を掘ると手に入る。光石のブロックに戻すことができる。ポーションと調合すると効果が上がる + +ガイコツを倒すと手に入る。骨粉の材料となる。オオカミに使うと手懐けることができる + +ガイコツに Creeper を倒させると手に入る。ジュークボックスで再生できる + +火を消し、作物の成長を促進する。バケツで集めることができる + +壊すと時々、苗木を落とす。苗木は植えると木へと成長する + +ダンジョンにある。建設、飾り付けに使う + +羊からウールを刈り取ったり、葉っぱのブロックを収穫するのに使う + +(ボタン、レバー、重量感知板、レッドストーンのたいまつなどで) 電気が送られると、ピストンが伸びてブロックを押すことができる + +(ボタン、レバー、重量感知板、レッドストーンのたいまつなどで) 電気が送られると、ピストンが伸びてブロックを押すことができる。また、ピストンが戻るときに、その時に触れているブロックを引き戻す + +石ブロックから作る。要塞で見かけることが多い + +柵と同じく、障害物として使う + +ドアと似ているが、主に柵と組み合わせて使う + +切ったスイカから作れる + +透明なブロックで、ガラスブロックの代わりに使える + +植えるとカボチャが生える + +植えるとスイカが生える + +Enderman が倒されたときに落とす。投げると、落ちた場所に使用者がテレポートされ、HP が少し減る + +上面に草が生えた土ブロック。シャベルを使って集める。建築用に使われる + +建設と飾り付けに使う + +上を歩くと移動が遅くなる。ハサミで破壊でき、ひもが採れる + +破壊されると Silverfish を出現させる。近くで別の Silverfish が攻撃を受けたときにも、Silverfish を出現させる場合がある + +置くと徐々に茂る。ハサミを使って集める。はしごのように登ることができる + +上面を歩くと滑る。上に載ったブロックが壊れると水になる。光源にあまり近づけたり暗黒界に置くと溶ける + +飾り付けとして使う + +ポーションの調合や要塞を探すのに使う。暗黒砦の周囲にいる Blaze が落とす + +ポーションの調合に使う。Ghast が倒されたときに落とす + +ゾンビ Pigman が倒されたときに落とす。ゾンビ Pigman は暗黒界にいる。ポーションを調合する材料として使う + +ポーションの調合に使う。暗黒砦に生えている。また、ソウルサンドでも育つ + +何に使うかにより、様々な効果が現れる + +水を入れるビン。調合台でポーションを作る時、最初に必要になる + +食べ物や薬の材料となる有毒のアイテム。クモや洞窟グモが倒されたときに落とす + +主にマイナス効果のポーションを調合するのに使う + +ポーションの調合や、他のアイテムと合わせてエンダーアイまたはマグマクリームを作るのに使う + +ポーションの調合に使う + +ポーションやスプラッシュポーションの調合に使う + +雨または水バケツを使って水を入れた後、水をガラスビンに詰めることができる + +投げると果てのポータルがある方角を示す。果てのポータルの枠内に 12 個置くと、果てのポータルが起動する + +ポーションの調合に使う + +草ブロックに似ているが、きのこ栽培に最適 + +水に浮く植物。上を歩くことができる + +暗黒砦を建てるのに使う。Ghast の火の玉が効かない + +暗黒砦で使う + +暗黒砦で手に入る。壊すと暗黒茸を落とす + +プレイヤーの経験値を消費して剣やツルハシ、斧、シャベル、弓、防具にエンチャントを行います + +エンダーアイを 12 個使って起動すると、果ての世界へ行くためのポータルができる + +果てのポータルを作るのに使う + +果ての世界に存在するブロックの一種。爆発に対する耐性が高いので建材として便利 + +果ての世界でエンダー ドラゴンを倒すと出現するブロック + +投げると経験値オーブを落とす。経験値オーブを貯めると経験値が上がる + +火をつけるのに便利です。発射装置を使って無差別に放火することができる + +表示枠に似ていて、ここには設置されたアイテムまたはブロックが表示される + +投げると特定の種類の生き物が出現します + +長い階段を作るのに使う。それぞれの上部に 2 つの厚板を置くことで、通常サイズの 2 倍の厚板ブロックを作ることができる + +長い階段を作るのに使う。それぞれの上部に 2 つの厚板を置くことで、通常サイズの 2 倍の厚板ブロックを作ることができる + +かまどで暗黒石を精錬すると出来上がる。暗黒レンガ ブロックの材料となる + +動力を受けると点灯する + +栽培して、カカオ豆を収穫できる + +ヘッド類は飾り付けとして並べたり、ヘルメットのスロットからマスクとして着用もできる + +コマンドを実行するのに使う。 + +空に向けて光線を放ち、付近のプレイヤーにステータス効果をもたらすことができる。 + +中にブロックとアイテムを保管する。2 つのチェストを隣同士に置くと、容量 2 倍の大きなチェストを作ることができる。トラップ チェストは開いた時に、レッドストーン電源も供給する。 + +レッドストーンによる電源を供給する。板上のアイテムが多いほど、チャージは強力になる。 + +レッドストーンによる電源を供給する。板上のアイテムが多いほど、チャージは強力になる。軽量板よりも重さを必要とする。 + +レッドストーン電源として使う。レッドストーンに作り戻すことができる。 + +アイテムの受け取り、または入れ物からのアイテムの出し入れに使われる。 + +レールの一種。ホッパー付きトロッコを有効または無効にしたり、TNT 付きトロッコを動作させたりできる。 + +アイテムを保管または落とすのに使われる。レッドストーン電源がある場合には、他の入れ物へアイテムを移すのにも使える。 + +カラフルなブロック。堅焼き粘土を染色して作る。 + +馬、ロバ、またはラバに餌として与えることができ、10 ハートまで回復させる。子馬や子ロバの成長を早める効果もある。 + +かまどの中で粘土を精錬して作られる。 + +ガラスと染料から作られる。 + +ステンドグラスから作られる。 + +木炭を保管するのに使える。かまどで燃料として使用することができる + +イカ + +倒すと墨袋を落とす + + + +倒すと革を落とす。バケツがあればミルクも取れる + + + +毛を刈るときウールを落とす (毛が残っている場合)。ウールはいろいろな色に染められる + +ニワトリ + +倒すと羽根を落とす。タマゴを持っている場合もある + + + +倒すと豚肉を落とす。鞍があれば乗ることもできる + +オオカミ + +普段はおとなしいが、攻撃すると反撃してくる。骨を使うと手なずけることができ、プレイヤーについて回って、プレイヤーを攻撃してくる敵を攻撃してくれる + +Creeper + +近づきすぎると爆発する! + +ガイコツ + +矢を放ってくる。倒すと矢を落とす + +クモ + +近づくと攻撃してくる。壁を登ることができる。倒すと糸を落とす + +ゾンビ + +近づくと攻撃してくる + +ゾンビ Pigman + +最初はおとなしいが、1 匹を攻撃すると集団で反撃してくる + +Ghast + +当たると爆発する火の玉を放ってくる + +スライム + +ダメージを与えると、小さなスライムに分裂する + +Enderman + +照準を向けると攻撃してくる。ブロックを移動できる + +Silverfish + +攻撃すると、近くに隠れている Silverfish も集まってくる。石ブロックの中に隠れている + +洞窟グモ + +牙に毒がある + +Mooshroom + +空のおわんを使うときのこシチューが採れる。ハサミで毛刈りをするときのこを落とすが、普通の牛になってしまう + +スノー ゴーレム + +雪ブロックとカボチャで作れるゴーレム。作った人の敵に向かって雪玉を投げつける + +エンダー ドラゴン + +果ての世界に存在する大きな黒竜 + +Blaze + +暗黒界に出現する敵。主に暗黒砦内にいる。倒すと Blaze ロッドを落とす + +マグマ キューブ + +暗黒界に出現する。Slime 同様、倒すと小さな Lava Slime に分裂する + +村人 + +ヤマネコ + +ジャングルに生息。生魚を与えて飼い慣らせる。不意な動きに驚いてすぐに逃げるため、接近するのは簡単ではない + +アイアン ゴーレム + +村に出現して村人を守ってくれる。鉄のブロックとカボチャで作ることもできる + +コウモリ + +この空飛ぶ生き物は、洞窟やその他の大きな閉じた空間で見つかる。 + +ウィッチ + +この敵は沼地で見られ、ポーションを投げて攻撃してくる。倒すとポーションを落とす。 + + + +この動物は手なずけて、乗ることができる。 + +ロバ + +この動物は手なずけて、乗ることができる。チェストを装着することもできる。 + +ラバ + +馬とロバの交配によって生まれる。この動物は手なずけて、乗ったり、チェストを運ばせたりすることができる。 + +馬のゾンビ + +馬のスケルトン + +ウィザー + +ウィザー スカルとソウル サンドから作られる。爆発するスカルを撃ってくる。 + +Explosives Animator + +Concept Artist + +Number Crunching and Statistics + +Bully Coordinator + +Original Design and Code by + +Project Manager/Producer + +Rest of Mojang Office + +Lead game programmer Minecraft PC + +Ninja Coder + +CEO + +White Collar Worker + +Customer Support + +Office DJ + +Designer/Programmer Minecraft - Pocket Edition + +Developer + +Chief Architect + +Art Developer + +Game Crafter + +Director of Fun + +Music and Sounds + +Programming + +Art + +QA + +Executive Producer + +Lead Producer + +Producer + +Test Lead + +Lead Tester + +Design Team + +Development Team + +Release Management + +Director, XBLA Publishing + +Business Development + +Portfolio Director + +Product Manager + +Marketing + + Community Manager + +Europe Localization Team + +Redmond Localization Team + +Asia Localization Team + +User Research Team + +MGS Central Teams + +Milestone Acceptance Tester + +Special Thanks + +Test Manager + +Senior Test Lead + +SDET + +Project STE + +Additional STE + +Test Associates + +Jon Kagstrom + +Tobias Mollstam + +Rise Lugo + +木の剣 + +石の剣 + +鉄の剣 + +ダイヤモンドの剣 + +金の剣 + +木のシャベル + +石のシャベル + +鉄のシャベル + +ダイヤモンドのシャベル + +金のシャベル + +木のツルハシ + +石のツルハシ + +鉄のツルハシ + +ダイヤモンドのツルハシ + +金のツルハシ + +木の斧 + +石の斧 + +鉄の斧 + +ダイヤモンドの斧 + +金の斧 + +木のくわ + +石のくわ + +鉄のくわ + +ダイヤモンドのくわ + +金のくわ + +木のドア + +鉄のドア + +チェーンヘルメット + +チェーンチェストプレート + +チェーンレギンス + +チェーンブーツ + +革の帽子 + +鉄の兜 + +ダイヤモンドの兜 + +金の兜 + +革の服 + +鉄の胸当て + +ダイヤモンドの胸当て + +金の胸当て + +革のパンツ + +鉄の脚甲 + +ダイヤモンドの脚甲 + +金の脚甲 + +革のブーツ + +鉄のブーツ + +ダイヤモンドのブーツ + +金のブーツ + +鉄の延べ棒 + +金の延べ棒 + +バケツ + +水バケツ + +溶岩バケツ + +火打ち石と打ち金 + +リンゴ + + + + + +石炭 + +木炭 + +ダイヤモンド + + + +おわん + +きのこシチュー + +ひも + +羽根 + +火薬 + +小麦の種 + +小麦 + +パン + +火打ち石 + +生の豚肉 + +調理した豚肉 + + + +金のリンゴ + +看板 + +トロッコ + + + +レッドストーン + +雪玉 + +ボート + + + +ミルク バケツ + +レンガ + +粘土 + +サトウキビ + + + + + +スライムボール + +チェストつきトロッコ + +かまどつきトロッコ + +タマゴ + +コンパス + +釣り竿 + +時計 + +光石の粉 + +生魚 + +調理した魚 + +染色粉 + +墨袋 + +ローズ レッド + +サボテン グリーン + +ココア ビーンズ + +ラピスラズリ + +紫の染料 + +水色の染料 + +薄灰色の染料 + +灰色の染料 + +ピンクの染料 + +黄緑の染料 + +たんぽぽイエロー + +空色の染料 + +赤紫の染料 + +オレンジの染料 + +骨粉 + + + +砂糖 + +ケーキ + +ベッド + +レッドストーン反復装置 + +クッキー + +地図 + +空っぽの地図 + +音楽ディスク: 13 + +音楽ディスク: cat + +音楽ディスク: blocks + +音楽ディスク: chirp + +音楽ディスク: far + +音楽ディスク: mall + +音楽ディスク: mellohi + +音楽ディスク: stal + +音楽ディスク: strad + +音楽ディスク: ward + +音楽ディスク: 11 + +音楽ディスク: where are we now + +ハサミ + +カボチャの種 + +スイカの種 + +鶏肉 + +焼き鳥 + +牛肉 + +ステーキ + +腐肉 + +エンダーパール + +切ったスイカ + +Blaze ロッド + +Ghast の涙 + +金の塊 + +暗黒茸 + +{*prefix*}{*postfix*}ポーション{*splash*} + +ガラスビン + +水のビン + +クモの目 + +発酵したクモの目 + +Blaze パウダー + +マグマクリーム + +調合台 + +大釜 + +エンダーアイ + +輝くスイカ + +エンチャントのビン + +発火剤 + +発火剤 (木炭) + +発火剤 (石炭) + +額縁 + +{*CREATURE*}出現 + +暗黒レンガ + +スカル + +ガイコツ スカル + +ウィザー ガイコツ スカル + +ゾンビ ヘッド + +ヘッド + +%sのヘッド + +Creeper ヘッド + +ネザースター + +ロケット花火 + +花火の星 + +レッドストーン コンパレーター + +TNT 付きトロッコ + +ホッパー付きトロッコ + +鉄の馬よろい + +金の馬よろい + +ダイヤモンドの馬よろい + +首ひも + +名札 + + + +草ブロック + + + +丸石 + +樫の板 + +トウヒの板 + +樺の板 + +ジャングルの木の板 + + 木の板 (全種類) + +苗木 + +樫の苗木 + +トウヒの苗木 + +樺の苗木 + +ジャングルの木の苗木 + +岩盤 + + + +溶岩 + + + +砂岩 + +砂利 + +金鉱石 + +鉄鉱石 + +石炭の原石 + + + +樫の木 + +トウヒの木 + +樺の木 + +ジャングルの木 + + + +トウヒ + + + +葉っぱ + +樫の葉 + +トウヒの葉 + +樺の葉 + +ジャングルの木の葉 + +スポンジ + +ガラス + +ウール + +黒のウール + +赤のウール + +緑のウール + +茶色のウール + +青のウール + +紫のウール + +水色のウール + +薄灰色のウール + +灰色のウール + +ピンクのウール + +黄緑のウール + +黄色のウール + +空色のウール + +赤紫のウール + +オレンジのウール + +白のウール + + + +バラ + +きのこ + +金のブロック + +金を保管するのに使える + +鉄を保管するのに使える + +鉄のブロック + +石の厚板 + +石の厚板 + +砂岩の厚板 + +樫の厚板 + +丸石の厚板 + +レンガの厚板 + +石レンガの厚板 + +樫の厚板 + +トウヒの厚板 + +樺の厚板 + +ジャングルの木の厚板 + +暗黒レンガの厚板 + +レンガ + +TNT 火薬 + +本棚 + +コケ石 + +黒曜石 + +たいまつ + +たいまつ (石炭) + +たいまつ (木炭) + + + +モンスター発生器 + +樫の階段 + +チェスト + +レッドストーンの粉 + +ダイヤモンド鉱石 + +ダイヤモンドのブロック + +ダイヤモンドを保管するのに使える + +作業台 + +作物 + +農地 + +かまど + +看板 + +木のドア + +はしご + +レール + +加速レール + +感知レール + +石の階段 + +レバー + +重量感知板 + +鉄のドア + +レッドストーン鉱石 + +レッドストーンのたいまつ + +ボタン + + + + + +サボテン + +粘土 + +サトウキビ + +ジュークボックス + + + +カボチャ + +カボチャ ランタン + +暗黒石 + +ソウルサンド + +光石 + +ポータル + +ラピスラズリ鉱石 + +ラピスラズリのブロック + +ラピスラズリを保管するのに使える + +発射装置 + +音ブロック + +ケーキ + +ベッド + +クモの巣 + +背の高い草 + +枯れた茂み + +ダイオード + +鍵つきチェスト + +トラップドア + +ウール (すべての色) + +ピストン + +吸着ピストン + +Silverfish ブロック + +石レンガ + +苔の生えた石レンガ + +ひび割れた石レンガ + +模様入り石レンガ + +きのこ + +きのこ + +鉄格子 + +ガラス板 + +スイカ + +カボチャの茎 + +スイカの茎 + +つた + +フェンスゲート + +レンガ階段 + +石レンガ階段 + +Silverfish 石 + +Silverfish の丸石 + +Silverfish の石レンガ + +菌糸 + +スイレンの葉 + +暗黒レンガ + +暗黒レンガの柵 + +暗黒レンガ階段 + +暗黒茸 + +エンチャントテーブル + +調合台 + +大釜 + +果てのポータル + +果てのポータルの枠 + +果ての石 + +ドラゴンの卵 + +低木 + +シダ + +砂岩の階段 + +トウヒの階段 + +樺の階段 + +ジャングルの木の階段 + +レッドストーン ランプ + +ココア + +スカル + +コマンド ブロック + +ビーコン + +トラップ チェスト + +重量感知板 (軽) + +重量感知板 (重) + +レッドストーン コンパレーター + +日照センサー + +レッドストーンのブロック + +ホッパー + +アクティベーター レール + +ドロッパー + +色付き粘土 + +干し草の俵 + +堅焼き粘土 + +石炭のブロック + +黒の色付き粘土 + +赤の色付き粘土 + +緑の色付き粘土 + +茶色の色付き粘土 + +青の色付き粘土 + +紫の色付き粘土 + +青緑の色付き粘土 + +薄灰色の色付き粘土 + +灰色の色付き粘土 + +ピンクの色付き粘土 + +黄緑の色付き粘土 + +黄色の色付き粘土 + +空色の色付き粘土 + +赤紫の色付き粘土 + +オレンジの色付き粘土 + +白の色付き粘土 + +ステンドグラス + +黒のステンドグラス + +赤のステンドグラス + +緑のステンドグラス + +茶色のステンドグラス + +青のステンドグラス + +紫のステンドグラス + +赤紫のステンドグラス + +薄灰色のステンドグラス + +灰色のステンドグラス + +ピンクのステンドグラス + +黄緑のステンドグラス + +黄色のステンドグラス + +空色のステンドグラス + +赤紫のステンドグラス + +オレンジのステンドグラス + +白のステンドグラス + +ステンドグラス窓 + +黒のステンドグラス窓 + +赤のステンドグラス窓 + +緑のステンドグラス窓 + +茶色のステンドグラス窓 + +青のステンドグラス窓 + +紫のステンドグラス窓 + +赤紫のステンドグラス窓 + +薄灰色のステンドグラス窓 + +灰色のステンドグラス窓 + +ピンクのステンドグラス窓 + +黄緑のステンドグラス窓 + +黄色のステンドグラス窓 + +空色のステンドグラス窓 + +赤紫のステンドグラス窓 + +オレンジのステンドグラス窓 + +白のステンドグラス窓 + +小玉 + +大玉 + +星形 + +Creeper 形 + +破裂 + +未知の形 + + + + + + + +茶色 + + + + + +青緑 + +薄灰色 + +灰色 + +ピンク + +黄緑 + +黄色 + +空色 + +赤紫 + +オレンジ + + + +カスタム + +変化後の色 + +点滅 + +光跡 + +滞空時間: +  +現在の操作方法 + +レイアウト + +動く/ダッシュ + +見る + +ポーズ + +ジャンプ + +ジャンプ/上昇 (飛行時) + +持ち物 + +手持ちアイテムの切り替え + +アクション + +使う + +工作 + +落とす + +しのび足 + +しのび足/下降 (飛行時) + +カメラ モードの変更 + +プレイヤー/招待 + +移動 (飛行時) + +レイアウト 1 + +レイアウト 2 + +レイアウト 3 + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +{*B*}続けるには {*CONTROLLER_VK_A*} を押してください + +{*B*}チュートリアルを始める: {*CONTROLLER_VK_A*}{*B*} + チュートリアルを飛ばす: {*CONTROLLER_VK_B*} + +Minecraft は自由な発想でブロックを積み上げて、探検したり、いろいろな物を作ったりするゲームです。 +夜になるとモンスターが現れるので、その前に必ず安全な場所を作っておかなければなりません + +{*CONTROLLER_ACTION_LOOK*} で周囲を見回せます + +{*CONTROLLER_ACTION_MOVE*} 動き回れます + +ダッシュするには {*CONTROLLER_ACTION_MOVE*} を前方向にすばやく 2 回押します。{*CONTROLLER_ACTION_MOVE*} を前方向に押し続ける間ダッシュできます。ただし一定時間が過ぎるか食べ物が尽きるとそこでやめてしまいます。 + +{*CONTROLLER_ACTION_JUMP*} でジャンプ + +手や、手に持っているアイテムを使って、掘ったり切ったりするには、{*CONTROLLER_ACTION_ACTION*} を押し続けます。道具を作らないと、掘れないブロックもあります + +{*CONTROLLER_ACTION_ACTION*} を押し続けて木を 4 ブロック (木の幹に相当) 切ってみましょう。{*B*}ブロックを壊すと、アイテムが浮かんだ状態で現れます。アイテムの近くに立つと、アイテムを集められます。集めたアイテムは、持ち物に追加されます + +{*CONTROLLER_ACTION_CRAFTING*} で工作画面を開きましょう + +アイテムを集めたり、作ったりすることで持ち物は増えます。{*B*} + {*CONTROLLER_ACTION_INVENTORY*} で持ち物を開きましょう + +移動、採掘、攻撃などの行動で空腹ゲージ {*ICON_SHANK_01*} が減っていきます。ダッシュやダッシュ ジャンプは普通に歩いたりジャンプしたりするよりもゲージが減ります + +HP が減っても空腹ゲージの {*ICON_SHANK_01*} が 9 個以上ある状態では、HP が自然に回復します。 食べ物を食べると空腹ゲージは回復します + +食べ物アイテムを持っているときに {*CONTROLLER_ACTION_USE*} を押し続けると、アイテムを食べて空腹ゲージが回復します。ゲージが満タンのときは食べられません + +空腹ゲージが低いため HP が減り始めました。持ち物に入っているステーキを食べて空腹ゲージを回復させれば、HP が回復し始めます。{*ICON*}364{*/ICON*} + +集めた木は、木の板の材料になります。工作画面を開いて、工作を始めましょう{*PlanksIcon*} + +工作にはいくつもの工程があります。木の板が手に入ったので、これで、いろいろ作ることができます。まずは作業台を作ってみましょう{*CraftingTableIcon*} + +作業に合った道具を使うことで、ブロックをより効率よく集めることができます。道具には棒の持ち手が必要な物があるので、棒を作りましょう{*SticksIcon*} + +手に持っているアイテムを変更するには {*CONTROLLER_ACTION_LEFT_SCROLL*} と {*CONTROLLER_ACTION_RIGHT_SCROLL*} を使います + +アイテムを使用したり、置いたり、オブジェクトにアクションを取ったりするには {*CONTROLLER_ACTION_USE*} を使います。置いたアイテムは、適切な道具を使用して拾うことができます + +作業台を置きましょう。作業台を選択して、置きたい場所にポインターを合わせてから {*CONTROLLER_ACTION_USE*} を押します + +作業台にポインターを合わせてから {*CONTROLLER_ACTION_USE*} を押して、作業台を開きましょう + +シャベルを使えば、土や雪のような柔らかいブロックを手早く掘れます。より多くの材料を手に入れることで、より丈夫で効率の良い道具を作ることができます。木のシャベルを作ってみましょう{*WoodenShovelIcon*} + +斧を使えば、木や木のブロックを手早く切り出せます。より多くの材料を手に入れることで、より丈夫で効率の良い道具を作ることができます。木の斧を作ってみましょう{*WoodenHatchetIcon*} + +ツルハシを使えば、石や鉱石のような堅いブロックを早く掘り出せます。より多くの材料を手に入れることで、さらに堅い材料を掘ることのできる、より丈夫で効率の良い道具を作ることができます。木のツルハシを作ってみましょう{*WoodenPickaxeIcon*} + +入れ物を開く + + + 夜はすぐに訪れます。何の準備もなしに外にいるのは危険です。武器や防具を作ることもできますが、まずは安全な場所を作ることが賢明です + + + + 近くに、昔に鉱山の働き手が住んでいた小屋があります。それを修復すれば夜でも安全です + + + + 小屋を修復するための材料を集めましょう。壁や屋根はどのブロックでも作れますが、ドアや窓、明かりも作りたいところです + + +ツルハシを使って、石のブロックを掘り出してみましょう。石のブロックを掘り出していると、丸石も出てきます。丸石を 8 つ集めると、かまどを作ることができます。石のある場所にたどり着くには、土を掘っていく必要があるので、シャベルを使いましょう{*StoneIcon*} + +かまどを作るのに必要な数の丸石が集まりました。作業台を使って、かまどを作りましょう + +{*CONTROLLER_ACTION_USE*} でかまどを置いて、開きましょう + +かまどを使って、木炭を作りましょう。出来上がりを待っている間に、小屋を修復するための材料をもっと集めてみましょう + +かまどを使って、ガラスを作りましょう。出来上がりを待っている間に、小屋を修復するための材料をもっと集めてみましょう + +小屋にドアをつけると、いちいち壁を掘ったり移動させたりせずに、簡単に出入りすることができます。木のドアを作ってみましょう{*WoodenDoorIcon*} + +ドアを {*CONTROLLER_ACTION_USE*} で設置します。ドアは {*CONTROLLER_ACTION_USE*} で開け閉めできます + +夜は外が真っ暗になります。小屋の中には明かりが欲しいところです。工作画面で、棒と木炭からたいまつを作りましょう{*TorchIcon*} + + + チュートリアルの最初のパートが完了です! + + + + {*B*} + チュートリアルを続ける: {*CONTROLLER_VK_A*}{*B*} + チュートリアルを飛ばす: {*CONTROLLER_VK_B*} + + + + これがあなたの持ち物です。手で持って使用できるアイテムと、所有しているアイテムのリスト、現在装備している防具を確認できます + +{*B*} + 持ち物の説明を続ける: {*CONTROLLER_VK_A*}{*B*} + 持ち物の説明を飛ばす: {*CONTROLLER_VK_B*} + + + + ポインターを {*CONTROLLER_MENU_NAVIGATE*} で動かして、アイテムに合わせてから {*CONTROLLER_VK_A*} を押すと、アイテムを選択できます。 + そのアイテムを複数所有している場合は、そのすべてが選択されます。半分だけ選択するには {*CONTROLLER_VK_X*} を使用します + + + + ポインターで選んだアイテムを持ち物の別の場所に移動させるには、移動先で {*CONTROLLER_VK_A*} を押します。 + ポインターに複数のアイテムがある場合は、{*CONTROLLER_VK_A*} を押すと全部、 {*CONTROLLER_VK_X*} を押すと 1 つだけ移動させることができます + + + + ポインターでアイテムを選択したまま、持ち物のウィンドウの外にポインターを動かすことで、アイテムを外に落とすことができます + + + + アイテムの説明を見たい時は、ポインターをアイテムの上に動かしてから {*CONTROLLER_ACTION_MENU_PAGEDOWN*} を押してください + + + + 持ち物画面を閉じるには {*CONTROLLER_VK_B*} を押します + + + + これがクリエイティブ モードの持ち物です。手で持って使用できるアイテムと、所有しているアイテムのリストを確認できます + + +{*B*} + 持ち物の説明を続ける: {*CONTROLLER_VK_A*}{*B*} + クリエイティブ モードの持ち物の説明を飛ばす: {*CONTROLLER_VK_B*} + + + + ポインターを {*CONTROLLER_MENU_NAVIGATE*} で動かしてアイテムに合わせます。 + {*CONTROLLER_VK_A*} を押すと、アイテムを選択します。 + そのアイテムを複数所有している場合は、{*CONTROLLER_VK_Y*} を押すと、すべてが選択されます + + + + ポインターは自動的に使用欄へ移動します。{*CONTROLLER_VK_A*} でそこに選択アイテムを置きます。アイテムを置くとポインターはアイテム一覧に戻るので、そこから他のアイテムを選ぶこともできます + + + + アイテムの上にポインターを置いた状態で、持ち物画面の外へポインターを動かすと、そのアイテムを落とすことができます。クイック選択バーを一度に空にするには{*CONTROLLER_VK_X*}を押してください。 + + + + 使うアイテムのグループを変更するには {*CONTROLLER_VK_LB*} と {*CONTROLLER_VK_RB*} で、上にあるグループのタブを切り替え、{*CONTROLLER_VK_LS*} でアイテムを選択します + + + + アイテムの説明を見たい時は、ポインターをアイテムの上に動かしてから {*CONTROLLER_ACTION_MENU_PAGEDOWN*} を押してください + + + + クリエイティブ モード持ち物画面を閉じるには {*CONTROLLER_VK_B*} を押します + + + + これが工作画面です。この画面では、これまでに集めたアイテムを組み合わせて、新しいアイテムを作ることができます + + +{*B*} + 工作の説明を続ける: {*CONTROLLER_VK_A*}{*B*} + 工作の説明を飛ばす: {*CONTROLLER_VK_B*} + + +{*B*} + アイテムの説明を見るには {*CONTROLLER_VK_X*} を押します + + +{*B*} + このアイテムを作るのに必要なアイテムのリストを見るには {*CONTROLLER_VK_X*} を押します + + +{*B*} + 持ち物に戻るには {*CONTROLLER_VK_X*} を押します + + + + 作りたいアイテムのグループを変更するには {*CONTROLLER_VK_LB*} と {*CONTROLLER_VK_RB*} で、上にあるグループのタブを切り替え、{*CONTROLLER_MENU_NAVIGATE*} で作るアイテムを選択します + + + + 工作ウィンドウには、新しいアイテムを作るのに必要なアイテムのリストが表示されます。{*CONTROLLER_VK_A*} を押すとアイテムが作られ、持ち物に追加されます + + + + 作業台を使うと、より多くの種類のアイテムを作れるようになります。作業台での工作も普通の工作と変わりません。ですが作業スペースが広い分、より多くの材料を組み合わせてアイテムを作ることができます + + + + 工作画面の右下には、持ち物が表示されます。さらに、選択しているアイテムの説明と、それを作るのに必要な材料も表示されます + + + + 選択しているアイテムの説明が表示されています。説明から、そのアイテムが何に使えるかが分かります + + + + 選択したアイテムを作るのに必要なアイテムのリストです + + +集めた木を使って、木の板を作ることができます。作るには、木の板のアイコンを選んでから {*CONTROLLER_VK_A*} を押してください{*PlanksIcon*} + + + これで 作業台が完成です! ゲームの世界に置いて、いろいろなアイテムを作れるようにしましょう。{*B*} + 工作画面から出るには {*CONTROLLER_VK_B*} を押します + + + + 作るアイテムのグループを切り替えるには {*CONTROLLER_VK_LB*} と {*CONTROLLER_VK_RB*} を使います。道具のグループを選択しましょう{*ToolsIcon*} + + + + 作るアイテムのグループを切り替えるには {*CONTROLLER_VK_LB*} と {*CONTROLLER_VK_RB*} を使います。建物のグループを選択しましょう{*StructuresIcon*} + + + + 作るアイテムを変えるには {*CONTROLLER_MENU_NAVIGATE*} を使います。アイテムによっては、使う材料によって、できる物が変わります。それでは木のシャベルを選びましょう{*WoodenShovelIcon*} + + + + 工作にはいくつもの工程があります。木の板が何枚か手元にあるので、さらにいろいろなアイテムを作れます。作るアイテムは {*CONTROLLER_MENU_NAVIGATE*} で変更できます。それでは作業台を選びましょう{*CraftingTableIcon*} + + + + 道具が完成しました。順調です。これで様々な材料をさらに効率よく集めることができます。{*B*} + 工作画面を閉じるには {*CONTROLLER_VK_B*} を押してください + + + + 一部のアイテムは作業台ではなく、かまどで作ります。それではかまどを作りましょう{*FurnaceIcon*} + + + + 完成したかまどをゲームの世界に置きましょう。小屋の中に置くとよいかもしれません。{*B*} + 工作画面を閉じるには {*CONTROLLER_VK_B*} を押してください + + + + これがかまどの画面です。かまどを使ってアイテムに熱を加えることで、そのアイテムを加工できます。例えば、鉄鉱石を鉄の延べ棒に変えることができます + + +{*B*} + かまどの説明を続ける: {*CONTROLLER_VK_A*}{*B*} + かまどの説明を飛ばす: {*CONTROLLER_VK_B*} + + + + かまどの下に燃料を入れ、上には加工したいアイテムを入れてください。するとかまどに火が入り、加工が始まります。完成したアイテムは右のスロットに入ります + + + + 木でできているアイテムの多くが燃料として使えますが、同時に違う種類のアイテムを燃やすことはできません。さらに木以外にも燃料として使えるアイテムがあります + + + + アイテムの加工が終わると、その完成したアイテムを持ち物へ移動できます。様々な材料を使って、何が出来上がるのかいろいろ実験してみましょう + + + + 木を材料に使うと、木炭が出来上がります。かまどに燃料を入れ、材料を入れる所に木を入れてください。木炭が出来上がるには少し時間がかるので、その間は他のことをしながら、時々進み具合を確かめに戻って来ましょう + + + + 木炭は燃料として使えます。棒と組み合わせると、たいまつになります + + + + 材料を入れる所に砂を入れると、ガラスを作ることができます。小屋の窓用にガラスを作ってみましょう + + + + これが調合の画面です。さまざまな効果を発揮するポーションを作ることができます + + +{*B*} + 調合台の説明を続ける: {*CONTROLLER_VK_A*}{*B*} + 調合台の説明を飛ばす: {*CONTROLLER_VK_B*} + + + + 調合を行うには、上の枠に材料を入れ、下の枠にポーションまたは水のビンを入れます (一度に 3 つまで調合可能)。正しい組み合わせの材料が置かれると調合が始まり、少し待てばポーションの出来上がりです + + + + ポーションの調合にはまず水のビンが必要です。また、ほとんどのポーションは暗黒茸から不完全なポーションを作るところから始め、完成させるには少なくともあと 1 種類の材料を必要とします + + + + ポーションを作ったら、その効果を変えることができます。レッドストーンの粉を加えると効果の持続時間が延長され、光石の粉を加えると効果がより強くなります + + + + 発酵したクモの目を加えると、ポーションが腐敗して効果が反転します。また、火薬を加えるとポーションがスプラッシュポーションになり、投げると落ちた場所の周囲に効果を発揮するようになります + + + + 暗黒茸を水のビンに加えて耐火ポーションを作り、それからマグマクリームを足してみましょう + + + + 調合画面を閉じるには {*CONTROLLER_VK_B*} を押します + + + + ここには調合台、大釜と調合に必要なアイテムが詰まったチェストがあります. + + +{*B*} + 調合とポーションの説明を続ける: {*CONTROLLER_VK_A*}{*B*} + 調合とポーションの説明を飛ばす: {*CONTROLLER_VK_B*} + + + + 調合では、最初に水のビンを作ります。チェストからガラスビンを出しましょう + + + + 水の入った大釜か水のブロックからガラスビンに水を移します。水源をクリックし、{*CONTROLLER_ACTION_USE*} を押してガラスビンに水を詰めてください + + + + 大釜が空になったら、水バケツを使って水を溜めてください + + + + 調合台を使って耐火ポーションを作りましょう。水のビン、暗黒茸とマグマクリームを用意してください + + + + ポーションを使うには、ポーション手に持って {*CONTROLLER_ACTION_USE*} を押します。普通のポーションは飲んで自分に効果を発揮します。スプラッシュポーションの場合は、投げて落ちた所の周囲にいるクリーチャーに効果を発揮します + スプラッシュポーションは普通のポーションに火薬を混ぜ合わせると作れます + + + + 耐火ポーションを自分に使ってみましょう + + + + 火と溶岩に対する耐性が上がりました。これまで行けなかった場所にも行けるので試してみましょう + + + + これがエンチャントの画面です。武器や防具、一部の道具にエンチャントすることで、特別なボーナスを付加できます + + +{*B*} + エンチャント画面の説明を続ける: {*CONTROLLER_VK_A*}{*B*} + エンチャント画面の説明を飛ばす: {*CONTROLLER_VK_B*} + + + + アイテムをエンチャントするには、まずアイテムをエンチャントの枠に入れてください。武器や防具、一部の道具にエンチャントすることで、ダメージ耐性を上げたり、採掘量を増やしたりなどの特別なボーナスを付加できます + + + + エンチャントの枠にアイテムを入れると、右側のボタンにランダムなエンチャントが表示されます + + + + ボタンに表示される数値はそのエンチャントを行うのに必要な経験値を表します。経験値が足りない場合、使えないボタンは無効になります + + + + エンチャントを行うには、エンチャントを選んで {*CONTROLLER_VK_A*} を押してください。エンチャントのコストに応じて経験値レベルが下がります + + + + エンチャントは基本的にランダムですが、一部の強力なエンチャントは経験値レベルが高く、エンチャントテーブルの周囲にテーブルを強化する本棚がたくさん設置されていないと表示されません + + + + ここにはエンチャントテーブルと、エンチャントについて学ぶためのいくつかのアイテムがあります + + +{*B*} + エンチャントの説明を続けるには {*CONTROLLER_VK_A*} を押してください。{*B*} + エンチャントの説明を飛ばすには {*CONTROLLER_VK_B*} を押してください + + + + エンチャントテーブルを使うと、採掘量を増やしたり、武器や防具、一部の道具のダメージ耐性を上げたりなどの特別なボーナスを付加できます + + + + エンチャントテーブルの周囲に本棚を置くと、テーブルが強化されてより高レベルのエンチャントができるようになります + + + + エンチャントは経験値を消費します。経験値は、モンスターや動物を倒したり、採掘したり、動物を繁殖させたり、釣りをしたり、かまどを使った精錬や料理などで生成される経験値オーブを集めることで、貯まっていきます + + + + エンチャントのビンを使って経験値を貯めることもできます。投げると落ちた場所に経験値オーブが出現するので、集めて経験値を貯めましょう + + + + ここにあるチェストにはエンチャントされたアイテムや、エンチャントのビンのほか、エンチャントを試してみることのできるアイテムがあります + + + + 今トロッコに乗っています。トロッコから降りるには、ポインターをトロッコに合わせてから {*CONTROLLER_ACTION_USE*} を押してください{*MinecartIcon*} + + +{*B*} + トロッコの説明を続ける: {*CONTROLLER_VK_A*}{*B*} + トロッコの説明を飛ばす: {*CONTROLLER_VK_B*} + + + + トロッコはレールの上を走ります。かまどを乗せた動力つきのトロッコや、チェストがついたトロッコを作ることもできます + {*RailIcon*} + + + + トロッコのスピードを上げるために、レッドストーンのたいまつや回路から動力を得る加速用レールを作ることができます。これはスイッチやレバー、重量感知板などを組み合わせた、複雑な装置になります + {*PoweredRailIcon*} + + + + 今ボートに乗っています。ボートから降りるには、ポインターをボートに合わせてから {*CONTROLLER_ACTION_USE*} を押してください{*BoatIcon*} + + + + {*B*} + ボートの説明を続ける: {*CONTROLLER_VK_A*}{*B*} + ボートの説明を飛ばす: {*CONTROLLER_VK_B*} + + + + ボートを使えば、水上を速く移動することができます。舵を取るには {*CONTROLLER_ACTION_MOVE*} と {*CONTROLLER_ACTION_LOOK*} を使います + {*BoatIcon*} + + + + 釣り竿を手にしました。使うには {*CONTROLLER_ACTION_USE*} を押します{*FishingRodIcon*} + + + + {*B*} + 魚釣りの説明を続ける: {*CONTROLLER_VK_A*}{*B*} + 魚釣りの説明を飛ばす: {*CONTROLLER_VK_B*} + + + + 釣りを始めるには {*CONTROLLER_ACTION_USE*} を押します。リールを巻き上げるときも {*CONTROLLER_ACTION_USE*} を押してください + {*FishingRodIcon*} + + + + 水の表面にある浮きが沈むまで待ってから、釣り糸を巻き上げて魚を釣り上げます。魚は生でも食べられますし、かまどで調理することもできます。食べると HP が回復します + {*FishIcon*} + + + + 釣り竿は 様々な道具と組み合わせることができますが、その用途は比較的限られています。しかし魚を釣る以外のこともできます。釣り竿を使って他に何が釣れるのか、どんなことができるのか、いろいろ試してみましょう + {*FishingRodIcon*} + + + + これがベッドです。夜になってからベッドにポインターを当てて {*CONTROLLER_ACTION_USE*} を押すと、朝まで眠ることができます{*ICON*}355{*/ICON*} + + + + {*B*} + ベッドの説明を続ける: {*CONTROLLER_VK_A*}{*B*} + ベッドの説明を飛ばす: {*CONTROLLER_VK_B*} + + + + ベッドは安全で明るい場所に置かないといけません。さもないと、夜中にモンスターに襲われてしまいます。ベッドで眠ると、次の力尽きた時の復活地点が、そのベッドに変更されます + {*ICON*}355{*/ICON*} + + + + ゲーム内に他のプレイヤーがいる場合、眠るためには全員が同時にベッドに入っていなければなりません + {*ICON*}355{*/ICON*} + + + + このエリアには、レッドストーンとピストンの回路、回路に使うアイテムの入ったチェストがあります + + + + {*B*} + レッドストーン回路とピストンの説明を続ける: {*CONTROLLER_VK_A*}{*B*} + レッドストーン回路とピストンの説明を飛ばす: {*CONTROLLER_VK_B*} + + + + レバー、ボタン、重量感知版、レッドストーンのたいまつは、起動したいアイテムに直接とりつけたり、レッドストーンの粉でつなげることで、電気を送ることができます + + + + 電気の源を配置する位置や向きで、周囲のブロックへの効果が変わります。たとえば、ブロックに設置されたレッドストーンのたいまつは、そのブロックに電気が送られると消えます + + + + レッドストーンの粉は、鉄、ダイヤモンド、金のツルハシでレッドストーン鉱石を掘ると手に入ります。レッドストーンの粉をブロックに置いてつなげることで、電気を伝えることができます。ただし、伝えられるのは距離にして 15 ブロック分、高さ方向の移動は 1 ブロックまでとなります + {*ICON*}331{*/ICON*} + + + + レッドストーン反復装置は電気の届く距離を伸ばしたり、回路を遅延させたりすることができます + {*ICON*}356{*/ICON*} + + + + ピストンは電気が送られると伸びて、最大 12 個のブロックを押します。吸着ピストンであれば、戻るときに一部の特殊なブロックを除いてブロックを 1 つ引き寄せることができます + {*ICON*}33{*/ICON*} + + + + このエリアには、ピストン付きの回路を作るためのアイテムを入れたチェストがあります。すでにある回路を改造したり、1 から回路を作成したりしてみてください。チュートリアル エリアの外には、さらに多くの見本があります + + + + このエリアには、暗黒界へのポータルが存在します! + + + + {*B*} + ポータルと暗黒界の説明を続ける: {*CONTROLLER_VK_A*}{*B*} + ポータルと暗黒界の説明を飛ばす: {*CONTROLLER_VK_B*} + + + + ポータルは、黒曜石のブロックで横 4 ブロック、縦 5 ブロックの枠を作成することで完成します。角のブロックは必要ありません。 + + + + ポータルを起動するには、火打石と打ち金で、フレーム内の黒曜石に火をつけましょう。枠が壊れたり、近くで爆発が起きたり、液体を流したりすると、ポータルは停止します。 + + + + ポータルを使用するには、ポータルの中に立ちましょう。画面が紫色に変わり、音がし始め、しばらくすると、別世界へテレポートできます + + + + 暗黒界はあちこちで溶岩が噴き出す危険な場所ですが、暗黒石や光石を手に入れるには最適な場所です。暗黒石は火をつけると、消えることなく燃え続け、光石は、光を発生させます + + + + 暗黒界をうまく利用して地上界を高速移動することができます。暗黒界での 1 ブロックの距離は、地上界での 3 ブロックに相当します + + + + クリエイティブ モードになりました + + + + {*B*} + クリエイティブ モードの説明を続ける: {*CONTROLLER_VK_A*}{*B*} + クリエイティブ モードの説明を飛ばす: {*CONTROLLER_VK_B*} + + +クリエイティブ モードではほとんどのアイテムやブロックが無限に使えます。また、道具がなくても 1 回クリックするだけでブロックが破壊できるほか、攻撃されてもダメージを受けなくなり、飛行も可能です + +{*CONTROLLER_ACTION_JUMP*} をすばやく 2 回押すと飛行できます。飛行をやめるには、同じ操作をもう一度行います。より速く飛ぶには、飛行中に {*CONTROLLER_ACTION_MOVE*} を前方向にすばやく 2 回押します。 +飛行モードでは、{*CONTROLLER_ACTION_JUMP*} で上昇、{*CONTROLLER_ACTION_SNEAK*} で下降できます。または、方向パッドで上下左右に飛びましょう + +クリエイティブ モードの持ち物を開くには {*CONTROLLER_ACTION_CRAFTING*} を押してください + +続けるには穴の反対側へ移動してください + +クリエイティブ モードのチュートリアルを完了しました + + + このエリアには、畑があります。畑では、食べ物などの繰り返し生産できる資源を作り出すことができます + + + + {*B*} + 農作業の説明を続ける: {*CONTROLLER_VK_A*}{*B*} + 農作業の説明を飛ばす: {*CONTROLLER_VK_B*} + + +小麦、カボチャ、スイカは、種から育てます。小麦の種は、背の高い草を切ったり、小麦を栽培することで手に入れることができます。カボチャの種やスイカの種は、それぞれ、カボチャやスイカから入手します + +種をまく前に、くわをつかって土のブロックを耕地に変える必要があります。近くに水源や光源があり、十分な水と光が供給されていると作物が早く成長します + +小麦は何段階かに変化しながら成長していき、色が濃くなると収穫できるようになります。{*ICON*}59:7{*/ICON*} + +カボチャとスイカの場合は、茎が太くなってきたら、種をまいた場所の隣に実ができるためのブロックが必要になります + +サトウキビは、水ブロックと隣接する、草、土、砂のブロックに植える必要があります。また、サトウキビのブロックは中ほどを収穫すると、上にあるブロックもすべて収穫されます。{*ICON*}83{*/ICON*} + +サボテンは砂に植える必要があり、成長すると 3 ブロックの高さになります。サトウキビと同様、下のブロックを収穫すると、上にあるブロックもすべて収穫できます。{*ICON*}81{*/ICON*} + +きのこは薄暗いエリアに植えましょう。隣接する薄暗いブロックに広がっていきます。{*ICON*}39{*/ICON*} + +骨粉は作物を最大まで成長させたり、きのこを巨大なきのこに成長させることができます。{*ICON*}351:15{*/ICON*} + +農作業のチュートリアルを完了しました + + + このエリアでは動物が飼育されています。動物を飼育して子供を増やすことができます + + + + {*B*} + 動物の繁殖の説明を続けるには {*CONTROLLER_VK_A*} を押してください。{*B*} + 動物の繁殖の説明を飛ばすには {*CONTROLLER_VK_B*} を押してください + + +動物を繁殖させるには、動物にあった餌を与えて、動物たちを「求愛モード」にしてやる必要があります + +牛、Mooshroom、羊には小麦を、豚にはニンジンを、ニワトリには小麦の種または暗黒茸、オオカミには肉を与えましょう。すると、近くにいる求愛モードの仲間を探し始めます + +ともに求愛モードの同種の動物が出会うと、少しの間キスをして、動物の赤ちゃんが誕生します。赤ちゃんは、成長するまでは、両親の後ろをついて回ります + +一度求愛モードになった動物は、5 分間は再び求愛モードになることはありません + +手に食べ物を持っていると、あなたの後ろをついてくる動物もいます。この習性を利用すれば、簡単に動物を一か所に集めことができるでしょう{*ICON*}296{*/ICON*} + + + 野生のオオカミは、骨を与えれば飼い慣らすことができます。飼い慣らすと、そのオオカミの周りにハートが表示されます。飼い慣らしたオオカミは「お座り」の命令を下さない限り、プレイヤーの後を付いて危険から守ってくれます + + +動物と繁殖のチュートリアルを完了しました + + + このエリアには、スノー ゴーレムやアイアン ゴーレムを作るためのカボチャやブロックがあります + + + + {*B*} + ゴーレムの説明を続ける{*CONTROLLER_VK_A*}{*B*} + ゴーレムの説明を飛ばす{*CONTROLLER_VK_B*} + + +ゴーレムは、重ねたブロックの一番上にカボチャをおいて完成します + +スノー ゴーレムは、雪ブロックを 2 つ重ね、その上にカボチャをのせて完成します。作った人の敵に、雪玉を投げます + +アイアン ゴーレムは、鉄のブロック 4 つを T 字に並べ、中央にカボチャをのせて完成します。作った人の敵を攻撃します + +アイアン ゴーレムは村に自然に現れて村人を守ることもあります。村人を攻撃すると、このアイアン ゴーレムが反撃します + +チュートリアルを終えるまで、このエリアから出ることはできません + +材料ごとに適した道具があります。土や砂などの柔らかいものを掘る場合はシャベルを使うのがよいでしょう + +材料ごとに適した道具があります。木の幹を切り出す場合は斧を使うのがよいでしょう + +材料ごとに適した道具があります。石や鉱石を掘り出す場合はツルハシを使うのがよいでしょう。特定の種類のブロックを掘るためには、さらに優れた材料を使ってツルハシを作る必要があるかもしれません + +特定の道具は敵を攻撃するのに向いています。剣を使うと良いでしょう + +ヒント: 手や、手に持っているアイテムを使って、掘ったり切ったりするには、{*CONTROLLER_ACTION_ACTION*} を押し続けます。道具を作らないと、掘れないブロックもあります + +道具は使っていると、少しずつ壊れていきます。使うたびに少しずつ損傷していき、最後は完全に壊れます。アイテムの下にあるゲージで、現在の状態が分かります + +上に向かって泳ぐには {*CONTROLLER_ACTION_JUMP*} を押し続けます + +このエリアではレールの上をトロッコが走っています。トロッコに乗るには、ポインターをトロッコに合わせて {*CONTROLLER_ACTION_USE*} を押します。トロッコを動かすには、ボタンにポインターを合わせて {*CONTROLLER_ACTION_USE*} を押しましょう + +川のそばにあるチェストの中に、ボートが入っています。ボートを使うには、ポインターを水に合わせて {*CONTROLLER_ACTION_USE*} を押します。ボートに乗るにはポインターをボートに合わせて {*CONTROLLER_ACTION_USE*} を押しましょう + +池のそばにあるチェストの中に、釣り竿が入っています。使うには、チェストから釣り竿を出してから、手に持って使うアイテムに選んでください + +このピストン装置は、自動建設される橋です。ボタンを押して、装置の動きを調べてみましょう + +アイテムを選択した状態で、持ち物画面の外へポインターを動かすと、アイテムを落とすことができます + +このアイテムを作るために必要な材料が揃っていません。左下にあるボックスの中に表示されているのが、必要な材料です + + + おめでとうございます! チュートリアルはこれですべて完了です。ゲーム内の時間の流れはこれから普通に戻ります。夜が来てモンスターが現れるまで、あまり時間がありません。早く安全な場所を作りましょう! + + +{*EXIT_PICTURE*} もっと冒険を続けたい? それなら、鉱山の働き手が住んでいた小屋の近くを探ってみましょう。小さな城に通じる階段があります + +お忘れなく: + +]]> + +バージョン アップにより、チュートリアルの新エリアを始めとする新機能が追加されました + +{*B*}基本のチュートリアルから始める{*CONTROLLER_VK_A*}{*B*} + 基本のチュートリアルを飛ばす{*CONTROLLER_VK_B*} + +このエリアで、釣り竿、ボート、ピストン、レッドストーンなどの使い方を練習しましょう + +このエリアの外では、建物、畑、トロッコ、エンチャント、調合、取引、鍛造などがあなたを待っています! + + + 空腹ゲージが減りすぎて、HP が回復できません。 + + + + {*B*} + 空腹ゲージや食べ物について詳しく知りたい場合は {*CONTROLLER_VK_A*} を押してください。{*B*} + すでに十分知っている場合は {*CONTROLLER_VK_B*} を押してください。 + + + + これは馬のインベントリ インターフェイスです。 + + + + {*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*} を押します。 + + + + 花火は装飾アイテムで、手動、または発射装置から打ち上げることができます。作るには、紙、火薬、およびオプションとして数々の花火の星を使います。 + + + + 花火の星の色、色変化、形状、サイズ、効果 (光跡、点滅など) は、作る際に材料を追加すればでカスタマイズできます。 + + + + チェストにあるいろいろな材料を使って、作業台で花火を作ってみましょう。 + +  +選択 + +使う + +戻る + +終了 + +キャンセル + +参加をキャンセル + +データ保存機器を選択 + +データ保存機器を変更 + +オンライン ゲーム リストを更新 + +パーティー ゲーム + +すべてのゲーム + +グループを切り替え + +持ち物を見る + +説明を見る + +材料を見る + +工作 + +作る + +取る/置く + +取る + +すべて取る + +半分取る + +置く + +すべて置く + +1 つ置く + +落とす + +すべて落とす + +1 つ落とす + +入れ替え + +クイック移動 + +クイック選択バーを空にする + +これは何? + +Facebook に公開 + +フィルターを変更 + +ゲーマー カードを見る + +ゲーマー プロフィールを見る + +フレンド登録の依頼を送る + +次へ + +前へ + +次へ + +前へ + +プレイヤーを追放 + +染める + +掘る + +えさを与える + +手なずける + +回復する + +おすわり + +ついてこい + +取り出す + +空にする + +鞍を置く + +置く + +叩く + +乳搾り + +集める + +食べる + +眠る + +起きる + +遊ぶ + +乗る + +船に乗る + +育てる + +泳ぐ + +開く + +音程を変える + +起爆する + +読む + +ぶら下がる + +投げる + +植える + +耕す + +収穫する + +続ける + +完全版を購入 + +セーブデータを削除 + +削除 + +オプション + +Xbox Live パーティーを招待 + +フレンドを招待 + +決定 + +毛を刈る + +アクセスを禁止 + +スキンを決定 + +火をつける + +選択 + +完全版をインストール + +お試し版をインストール + +インストール + +再インストール + +セーブのオプション + +コマンドを実行 + +クリエイティブ + +材料を移動 + +燃料を移動 + +道具を移動 + +防具を移動 + +武器を移動 + +装備 + +引く + +放つ + +特権 + +ブロック + +上へ + +下へ + +求愛モード + +飲む + +回転する + +隠す + +Xbox One 用にセーブをアップロード + +全てのスロットを空にする + +Xbox One 用にセーブをアップロード + +騎乗する + +降りる + +チェストを着ける + +打ち上げる + +首ひもをつける + +首ひもをはずす + +装着する + +名前をつける + +OK + +キャンセル + +Minecraft ストア + +本当に現在プレイしているゲームを終了して、新しいゲームに参加してもよろしいですか? セーブしていない途中経過は失われてしまいます + +ゲームを終了 + +ゲームをセーブ + +セーブせずに終了 + +以前のこの世界のセーブ データを、現在のデータで上書きしてもよろしいですか? + +本当にセーブせずメイン メニューに戻ってもよろしいですか? この世界での途中経過は失われてしまいます + +ゲームを始める + +クリエイティブ モードで作成、ロード、セーブした世界は、たとえ後でサバイバル モードでロードしたとしても、実績やランキング更新の対象になりません。実行してよろしいですか? + +クリエイティブ モードで作成、ロード、セーブした世界は、たとえ後でサバイバル モードでロードしたとしても、実績やランキング更新の対象になりません。実行してよろしいですか? + +クリエイティブ モードで作成、ロード、セーブした世界は、たとえ後でサバイバル モードでロードしたとしても、実績やランキング更新の対象になりません。 + +ホスト特権を有効にして作成、ロード、セーブした世界は、たとえ後でオプションをオフにしたとしても、実績やランキング更新の対象になりません。実行してよろしいですか? + +セーブ データの破損 + +このセーブ データは破損しています。削除しますか? + +現在のゲームを終了し、すべてのプレイヤーとの接続を切断してメイン メニューに戻ってもよろしいですか? セーブしていない途中経過は失われてしまいます + +セーブして終了 + +セーブせずに終了 + +本当にメイン メニューに戻ってもよろしいですか? セーブしていない途中経過は失われてしまいます + +本当にメイン メニューに戻ってもよろしいですか? ここまでの途中経過は失われてしまいます + +新しい世界 + +チュートリアルをプレイ + +チュートリアル + +新しい世界に名前をつける + +新しい世界の名前を入力してください + +世界の種を入力してください + +セーブした世界をロードする + +START を押してゲームに参加 + +ゲームを終了 + +エラーが起こりました。メイン メニューに戻ります + +接続に失敗しました + +接続が切断されました + +サーバーとの接続が切断されました。メイン メニューに戻ります + +Xbox Live との接続が切断されました。メイン メニューに戻ります + +Xbox Live との接続が切断されました + +サーバーにより切断されました + +ゲームから追放されました + +空を飛んだため、ゲームから追放されました + +接続に時間がかかりすぎています + +サーバーが満員です + +ホストがゲームを終了しました + +この世界でプレイ中のフレンドがいないため、この世界には入れません + +以前にホストにより追放されているため、この世界には入れません + +相手のプレイヤーのゲームのバージョンが古いため、ゲームに参加できません + +相手のプレイヤーのゲームのバージョンが新しいため、ゲームに参加できません + +新しい世界 + +アワードをアンロックしました! + +おめでとうございます! Minecraft の Steve のゲーマー アイコンを獲得しました! + +おめでとうございます! Creeper のゲーマー アイコンを獲得しました! + +おめでとうございます! アバター アイテム、Minecraft Xbox 360 版 T シャツを獲得しました! +ダッシュボードでアバターに装備しましょう + +おめでとうございます! アバター アイテム、Minecraft Xbox 360 版 ウォッチを獲得しました! +ダッシュボードでアバターに装備しましょう + +おめでとうございます! アバター アイテム、Creeper 野球帽を獲得しました! +ダッシュボードでアバターに装備しましょう + +おめでとうございます! アバター アイテム、Minecraft Xbox 360 版 テーマを獲得しました! +ダッシュボードでテーマを選択しましょう + +完全版を購入 + +今はお試し版をプレイ中です。データをセーブするためには完全版を購入いただく必要があります +今すぐ完全版を購入しますか? + +これは Minecraft Xbox 360 版のお試し版です。完全版であれば、今すぐ獲得できる実績があります! +完全版を購入して、Xbox Live を通じて世界中のフレンドと一緒に遊べるMinecraft の楽しさを体験してください。 +完全版を購入しますか? + +これは Minecraft Xbox 360 版のお試し版です。完全版であれば、今すぐ獲得できるアバター アワードがあります! +完全版を購入して、Xbox Live を通じて世界中のフレンドと一緒に遊べるMinecraft の楽しさを体験してください。 +完全版を購入しますか? + +これは Minecraft Xbox 360 版のお試し版です。完全版であれば、今すぐ獲得できるゲーマー アイコンがあります! +完全版を購入して、Xbox Live を通じて世界中のフレンドと一緒に遊べる Minecraft の楽しさを体験してください。 +完全版を購入しますか? + +これは Minecraft Xbox 360 版のお試し版です。完全版であれば、今すぐ獲得できるテーマがあります! +完全版を購入して、Xbox Live を通じて世界中のフレンドと一緒に遊べる Minecraft の楽しさを体験してください。 +完全版を購入しますか? + +お試し版では、この招待は受けられません。 +完全版を今すぐ購入しますか? + +ゲスト プレイヤーでは完全版を購入することはできません。Xbox Live ゲーマー プロフィールでサインインしてください + +お待ちください + +結果なし + +フィルター: + +フレンド + +マイスコア + +通算 + +登録数: + +ランク + +ゲーマータグ + +セーブレベル + +詳細を設定中... + +最終処理中... + +地形を構築中 + +世界のシミュレート中 + +サーバーを初期化中 + +復活地点を作成中 + +復活地点を読み込み中 + +暗黒界に入る + +暗黒界を出る + +復活中 + +レベルを生成中 + +レベルを読み込み中 + +プレイヤーをセーブ中 + +ホストサーバーに接続中 + +地形をダウンロード中 + +オフライン ゲームに切り替える + +ホストがゲームをセーブしています。しばらくお待ちください + +果ての世界に入る + +果ての世界を出る + +世界の種を探す + +このベッドは使用中です + +夜の間しか眠ることはできません + +%s は寝ています。朝まで時間をスキップするには、すべてのプレイヤーが寝ている必要があります + +最後に使用したベッドがなくなっているか、アクセスできません + +モンスターが近くにいる時に休むのは危険です + +あなたは寝ています。朝まで時間をスキップするには、すべてのプレイヤーが寝ている必要があります + +道具と武器 + +武器 + +食べ物 + +建物 + +防具 + +機械 + +乗り物 + +飾り + +建設用ブロック + +レッドストーンと乗り物 + +その他 + +調合 + +調合 + +道具、武器、防具 + +材料 + +サインアウト + +ゲーマー プロフィールからサインアウトしました。タイトル画面に戻ります + +難易度 + +BGM + +効果音 + +ガンマ + +ゲームでの感度 + +メニューでの感度 + +ピース + +イージー + +ノーマル + +ハード + +プレイヤーの HP は自動で回復し、敵もいません + +敵は出現しますが、ノーマル モードほど攻撃力が高くありません + +敵が出現し、その攻撃力は普通です + +敵が出現し、その攻撃力がアップします。また、一瞬近づいただけでも Creeper が爆発するようになるので注意しましょう + +お試し版タイムアウト + +お試し版をプレイできる制限時間が過ぎてしまいました! 完全版を購入して、ゲームを続けますか? + +完全版 + +既に満員のため、ゲームに参加できませんでした + +看板の文字を入力 + +看板の文字を入力してください + +タイトルを入力 + +投稿のタイトルを入力してください + +キャプションを入力 + +投稿のキャプションを入力してください + +説明を入力 + +投稿の説明を入力してください + +持ち物 + +材料 + +調合台 + +チェスト + +エンチャント + +かまど + +材料 + +燃料 + +発射装置 + + + +ドロッパー + +ホッパー + +ビーコン + +プライマリ パワー + +セカンダリ パワー + +トロッコ + +現在、このタイプのダウンロード コンテンツはありません + +%s が世界にやってきました + +%s が世界を去りました + +%s が追放されました + +本当にこのセーブデータを削除してもよろしいですか? + +承認待ち + +検閲済み + +プレイ中: + +設定を元に戻す + +本当に設定を最初の状態に戻してもよろしいですか? + +ロード エラー + +Minecraft Xbox 360 版のロードに失敗しました。続行できません + +%s のゲーム + +ななしのホストのゲーム + +ゲストがサインアウトしました + +ゲスト プレイヤーの 1 人がサインアウトしたため、すべてのゲスト プレイヤーがゲームから取り除かれました + +サインイン + +サインインしていません。このゲームをプレイするにはサインインが必要です。今すぐサインインしますか? + +マルチプレイが制限されています + +Xbox Live でのマルチプレイを制限されているプレイヤーがいます。ゲームに参加できません + +Xbox Live でのマルチプレイを制限されているプレイヤーがいます。オンライン ゲームは作成できません。[オンライン ゲーム] のチェックを外すとオフラインでゲームを開始できます + +[メンバーが作ったコンテンツ] の設定によりコンテンツへのアクセスが制限されているため、ゲームに参加できません。ゲームに参加するには、Xbox ダッシュボードの [プライバシー & オンライン設定] で設定を変更してください + +ローカル プレイヤーの中に [メンバーが作ったコンテンツ] の設定によりコンテンツへのアクセスが制限されているプレイヤーがいるため、ゲームに参加できません + +参加プレイヤーの中に [メンバーが作ったコンテンツ] の設定が [フレンドのみ] のプレイヤーがおり、あなたはそのフレンド リストに登録されていないため、ゲームに参加できません + +ゲームを作成できません + +ローカル プレイヤーの中に [メンバーが作ったコンテンツ] の設定によりコンテンツへのアクセスが制限されているプレイヤーがいるため、ゲームを作成できません。[オンライン ゲーム] のチェックを外してオフラインでゲームを始めるか、または Xbox ダッシュボードの [プライバシー & オンライン設定] で設定を変更してください + +自動選択されました + +デフォルト スキン + +お気に入りのスキン + +アクセスが禁止されています + +アクセス禁止リストに登録されている世界に参加しようとしています。 +このまま参加すると、この世界はアクセス禁止リストから外されます + +アクセス禁止にしますか? + +この世界をアクセス禁止リストに登録しますか? +OK を選択すると、この世界でのプレイを終了します + +アクセス禁止を解除 + +オートセーブの間隔 + +オートセーブの間隔: オフ + + + +ここには置けません + +復活したプレイヤーにダメージを与える可能性があるため、復活地点の近くに溶岩を置くことはできません + +このゲームではオートセーブ機能を利用できます。オートセーブの実行中は上のオートセーブ アイコンが表示されます。 +オートセーブ アイコンの表示中に本体の電源を切らないでください + +インターフェースの不透明度 + +オートセーブを実行します + +画面表示サイズ + +画面表示サイズ (画面分割) + + + +スキン パックのロック解除 + +選択したスキンを使用するには、スキン パックをロック解除してください。 +今すぐスキン パックをロック解除しますか? + +テクスチャ パックのロック解除 + +このテクスチャ パックを世界で使用するには、これをロック解除してください。 +今すぐテクスチャ パックをロック解除しますか? + +テクスチャ パック試用版 + +現在お使いのテクスチャ パックは試用版です。完全版を利用しない場合、この世界はセーブできません。 +テクスチャ パックの完全版を購入しますか? + +テクスチャ パックを持っていません + +完全版を購入 + +試用版をダウンロード + +完全版をダウンロード + +この世界は、持っていないテクスチャ パック、またはマッシュアップ パックが使用されています。 +今すぐこのテクスチャ パック、またはマッシュアップ パックをインストールしますか? + +試用版を購入 + +完全版を購入 + +プレイヤーを追放 + +このプレイヤーをゲームから追放しますか? 追放されたプレイヤーは、この世界を再スタートするまで世界に入れなくなります + +ゲーマー アイコン パック + +テーマ + +スキン パック + +フレンドのフレンドを許可 + +この世界への参加は、ホスト プレイヤーのフレンドのみに制限されています + +世界に入れません + +選択中 + +選択したスキン: + +破損したダウンロード コンテンツ + +このダウンロード コンテンツは破損しているため使用できません。破損しているコンテンツを削除し、[Minecraft ストア] から再インストールしてください + +破損して使用できないダウンロード コンテンツがあります。破損しているコンテンツを削除し、[Minecraft ストア] から再インストールしてください + +ゲームモードを変更しました + +世界の名前を変更する + +世界の新しい名前を入力してください + +ゲームモード: サバイバル + +ゲームモード: クリエイティブ + +ゲーム モード: アドベンチャー + +サバイバル + +クリエイティブ + +アドベンチャー + +サバイバル モードで作成 + +クリエイティブ モードで作成 + +雲を表示する + +このセーブデータに対する操作を選んでください + +セーブデータの名前を変更する + +%d 秒後にオートセーブを開始します... + +オン + +オフ + +ノーマル + +スーパーフラット + +同じ地形を再度生成するには種を入れます。ランダムな世界の場合、空欄のままにします。 + +有効にすると、オンラインのゲームになります + +有効にすると、招待されたプレイヤーしか参加できません + +有効にすると、フレンド リストのフレンドのみゲームに参加できます + +有効にすると、プレイヤーが他のプレイヤーにダメージを与えられるようになります。(サバイバル モードのみ) + +無効にすると、このゲームに参加したプレイヤーは許可をもらわないかぎり建設や採掘ができません + +有効にすると、火は近くの可燃性ブロックに燃え広がります + +有効にすると、TNT 火薬を起爆すると爆発します + +有効にすると、ホストが飛行能力、疲労無効、ゲーム内メニューでの非表示を切り替えられます。実績およびランキング更新は無効になります + +有効にすると暗黒界を再生成します。暗黒砦が存在しないセーブ データがある場合に便利です + +有効にすると、村や要塞などの建物が世界に生成されるようになります + +有効にすると、地上界および暗黒界に、まったく平らな世界を生成します + +有効にすると、プレイヤーの復活地点の近くに便利なアイテムの入ったチェストが出現します + +無効にすると、モンスターや動物がブロックを変えることがなくなり (例: Creeper が爆発してもブロックが破壊されない、羊が草を取り除かない)、アイテムも拾いません。 + +有効にすると、ゲームオーバー時にプレイヤーの持ち物が失われません。 + +無効にすると、生き物は自然に出現しません。 + +無効にすると、モンスターや動物は戦利品をドロップしません (例: Creeper は火薬をドロップしない)。 + +無効にすると、ブロックを壊してもアイテムを落としません (例: 石ブロックが丸石を落とさない)。 + +無効にすると、プレイヤーの HP を自然に再生されません。 + +無効にすると、時刻が変わりません。 + +スキン パック + +テーマ + +ゲーマーアイコン + +アバター アイテム + +テクスチャ パック + +マッシュアップ パック + +{*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*} の魔法によって倒された + +{*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*} で倒された + +岩盤の霧 + +HUD の表示 + +プレイヤーの手の表示 + +分割画面でゲーマータグを表示 + +ゲームオーバー メッセージ + +キャラクターを動かす + +カスタム スキン アニメーション + +採掘やアイテムの使用ができなくなりました + +採掘やアイテムの使用ができるようになりました + +ブロックを設置できなくなりました + +ブロックを設置できるようになりました + +ドアとスイッチを使用できるようになりました + +ドアとスイッチを使用できなくなりました + +チェストなどの入れ物を使用できるようになりました + +チェストなどの入れ物を使用できなくなりました + +生き物を攻撃できなくなりました + +生き物を攻撃できるようになりました + +プレイヤーを攻撃できなくなりました + +プレイヤーを攻撃できるようになりました + +動物を攻撃できなくなりました + +動物を攻撃できるようになりました + +ホストオプションを変更できるようになりました + +ホストオプションを変更できなくなりました + +飛行できるようになりました + +飛行できなくなりました + +疲労無効になりました + +疲労無効ではなくなりました + +不可視になりました + +不可視ではなくなりました + +攻撃されてもダメージを受けなくなりました + +攻撃されるとダメージを受けます + +%d MSP + +エンダー ドラゴン + +%s は果ての世界に入りました + +%s は果ての世界から出ました + + +{*C3*}この人が、例のプレイヤーか{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}のこと?{*EF*}{*B*}{*B*} +{*C3*}そう。気をつけろよ、もうずいぶんレベルが上がったみたいだ。僕らの考えは読まれているんだから{*EF*}{*B*}{*B*} +{*C2*}別にいいよ。僕らはゲームの一部だと思われてるんだろうし{*EF*}{*B*}{*B*} +{*C3*}僕はこのプレイヤー嫌いじゃないな。あきらめないで、たくさん遊んだじゃないか{*EF*}{*B*}{*B*} +{*C2*}僕らの思考が画面上の文字みたいに読まれてるね{*EF*}{*B*}{*B*} +{*C3*}ゲームという夢にのめり込んでいる時、プレイヤーは言葉を使っていろいろな物事を想像するらしい{*EF*}{*B*}{*B*} +{*C2*}言葉はとても柔軟で素晴らしいインターフェイスだね。その上、画面の外の現実を直視するより全然怖くない{*EF*}{*B*}{*B*} +{*C3*}文字で読めるようになる前には声を使ってたんだぞ。ゲームをしない人がゲームをする人たちを魔法使いとか賢者とか呼んで、悪魔の杖に乗って空を飛ぶ夢を見ていた頃の話だ{*EF*}{*B*}{*B*} +{*C2*}このプレイヤーは何の夢を見たんだろう?{*EF*}{*B*}{*B*} +{*C3*}陽の光と木の夢。それに火と水。夢を見ては、作る。夢を見ては、壊す。夢を見ては、狩る。時々狩られたりしたけど。あとは安全な場所の夢だ{*EF*}{*B*}{*B*} +{*C2*}ふーん、元祖インターフェイスか。100 万年も昔の物なのにまだちゃんと動く。でもプレイヤーは、画面の外の現実で、本当はどんなものを作ったんだろう?{*EF*}{*B*}{*B*} +{*C3*}それは、{*EF*}{*NOISE*}{*C3*} の檻の中で真実の世界を彫り上げるために、100 万の人と一緒に {*EF*}{*NOISE*}{*C3*} を作ったんだ。目的は {*EF*}{*NOISE*}{*C3*} だ。{*EF*}{*NOISE*}{*C3*} の中のことに過ぎないのに{*EF*}{*B*}{*B*} +{*C2*}これはプレイヤーには読めないね{*EF*}{*B*}{*B*} +{*C3*}そう、まだ最高レベルまで到達していないから。ゲームの中の短い夢じゃなくて、人生の長い夢を叶えなくてはいけない{*EF*}{*B*}{*B*} +{*C2*}プレイヤーは僕らの好意を知っているの? 宇宙は寛容だってことを?{*EF*}{*B*}{*B*} +{*C3*}おそらく。プレイヤーは宇宙の思いのノイズを聞いている{*EF*}{*B*}{*B*} +{*C2*}でもプレイヤーの長い夢の中には、時に悲しいこともある。夏が訪れず、黒い太陽の下で凍え、自分が作った悲しさを現実と思ってしまうことがある{*EF*}{*B*}{*B*} +{*C3*}だがその悲しさを外から癒すと、プレイヤーは壊れてしまう。悲しみはプレイヤー自身が乗り越えるもののひとつで、外から干渉できることではない{*EF*}{*B*}{*B*} +{*C2*}プレイヤーがあまりに夢に浸っていると、時々教えたくなるんだ。プレイヤーは現実に本当の世界を作り上げていることを。その存在が宇宙にとって大切であることを。もし本当の絆を持てない時は、恐くて口に出せないでいる言葉を言う手助けをしたくなる{*EF*}{*B*}{*B*} +{*C3*}おい、プレイヤーに読まれているぞ{*EF*}{*B*}{*B*} +{*C2*}プレイヤーのことなんかどうでもいい時もあるけど、教えてあげたい時もある。現実だと思っている世界は本当はただの {*EF*}{*NOISE*}{*C2*} で、しかも {*EF*}{*NOISE*}{*C2*} だけだってこと。プレイヤーは {*EF*}{*NOISE*}{*C2*} の中では {*EF*}{*NOISE*}{*C2*} なんだ。長い夢の中で知る現実はほんの一部でしかない{*EF*}{*B*}{*B*} +{*C3*}それでもプレイヤーはゲームを遊ぶんだ{*EF*}{*B*}{*B*} +{*C2*}だけど、真実を教えることは簡単じゃないか...{*EF*}{*B*}{*B*} +{*C3*}この夢の中では厳しすぎる。生きる方法を教えることは、生きる道を閉ざすことと同じだ{*EF*}{*B*}{*B*} +{*C2*}だから僕は生き方を教えない{*EF*}{*B*}{*B*} +{*C3*}プレイヤーは落ち着かなくなってきてるな{*EF*}{*B*}{*B*} +{*C2*}なら、ある物語を教えようよ{*EF*}{*B*}{*B*} +{*C3*}ただの物語で真実ではない{*EF*}{*B*}{*B*} +{*C2*}そう。辺りを焼き払ってしまうようなむき出しの真実ではなく、言葉の檻の中に真実を優しく隠した物語{*EF*}{*B*}{*B*} +{*C3*}もう一度プレイヤーに体を与えよう{*EF*}{*B*}{*B*} +{*C2*}さあ、プレイヤー...{*EF*}{*B*}{*B*} +{*C3*}君の名前をもう一度聞かせてほしい{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}。ゲームのプレイヤーだよ{*EF*}{*B*}{*B*} +{*C3*}では始めようか{*EF*}{*B*}{*B*} + + + +{*C2*}さあ、深呼吸だ。もう一度。胸に空気を入れてふくらませたら、吐き出して元に戻して。指を動かそう。体全体で空気と重力を感じて。君の長い夢の中に戻るんだ。君の全身は再び宇宙にふれている。今まではばらばらだったかのように。僕らが物事を分断していたかのように{*EF*}{*B*}{*B*} +{*C3*}僕らは誰だろう? 山の精霊と呼ばれたこともあった。父なる太陽、母なる月、祖先の魂、獣の性、異教のソウル、幽霊、宇宙人、神、悪魔、天使、ポルターガイスト、エイリアン、地球外生命体、レプトン、クォーク。言葉は変わる。僕らは変わらない{*EF*}{*B*}{*B*} +{*C2*}僕らは宇宙。君が君ではないと思うものすべて。君が今その肌と目を通して見ているもの。宇宙は君にふれ、君に光を投げかける。君の姿を見るためだよ、プレイヤー。君を知り、君に知ってもらうために。さあ、話を始めよう{*EF*}{*B*}{*B*} +{*C2*}昔むかしあるところに、ひとりのプレイヤーがいました{*EF*}{*B*}{*B*} +{*C3*}プレイヤーとは君、{*PLAYER*}だ{*EF*}{*B*}{*B*} +{*C2*}自転する溶けた岩の薄い地表に立ったプレイヤーは、ある時自分自身を人間だと考えました。溶けた岩で出来たボールは、それより 33 万倍も大きい燃えるガスのかたまりの周りを回っていました。2 つのかたまりの間は、光の速さで 8 分もかかるほど離れていました。光は星からの情報で 1,500 万キロメートル離れたプレイヤーの肌を焦がすことさえできました{*EF*}{*B*}{*B*} +{*C2*}平らで果てしない世界の上で、プレイヤーはある時鉱山で働く夢を見ました。太陽は白く四角でした。明るい時間は短すぎ、やるべきことは多すぎました。死は束の間の厄介ごとでした{*EF*}{*B*}{*B*} +{*C3*}またある時は、プレイヤーは物語の中で自分自身を見失う夢を見ました{*EF*}{*B*}{*B*} +{*C2*}そしてまたある時は、プレイヤーは別の場所で、別のものになる夢を見ました。夢は時に不快で、時にとても美しくもありました。プレイヤーはひとつの夢から目覚め、別の夢に入り込み、また覚めては他の夢を見ました{*EF*}{*B*}{*B*} +{*C3*}そして、ある夢の中でプレイヤーは画面上に文字を見ました{*EF*}{*B*}{*B*} +{*C2*}少し戻ろうか{*EF*}{*B*}{*B*} +{*C2*}プレイヤーの原子は草原に、川に、大地に散らばりました。ある女の人がばらまかれた原子を集め、食べ、飲み、吸い込み、体の中でプレイヤーを組み立てました{*EF*}{*B*}{*B*} +{*C2*}温かく暗い母の胎内から目覚めたプレイヤーは、長い夢に入っていきました{*EF*}{*B*}{*B*} +{*C2*}プレイヤーは DNA に記された、語られたことのない新しい物語でした。十億年前に書かれたソースコードに生成された、実行されたことのない新しいプログラムでした。乳と愛によってのみ造られた、かつて存在しなかった新しい人間でした{*EF*}{*B*}{*B*} +{*C3*}君はプレイヤー。物語。プログラム。乳と愛によってのみ造られた人間{*EF*}{*B*}{*B*} +{*C2*}もっとさかのぼろう{*EF*}{*B*}{*B*} +{*C2*}このゲームよりずっとずっと先に 70 億の 10 億倍のさらに 10 億倍の原子によって、プレイヤーの体は星の中心で作られました。ですから、プレイヤーも星からの情報なのです。プレイヤーはジュリアンという人が植えた情報の森の物語を進みマルクスという人が作った平らで果てしない世界を渡ります。物語はプレイヤーが密かに作り上げた小さな世界の中に存在し、そのプレイヤーが住む宇宙を作ったのは...{*EF*}{*B*}{*B*} +{*C3*}それは秘密だ。時にプレイヤーは、柔らかく、暖かく、優しい世界をこっそり作りました。ある世界は厳しく、凍てつき、複雑でもありました。プレイヤーは宇宙の模型を空想することもありました。小さなエネルギーのかたまりが何もない広大な空間を飛び交います。このかたまりは「電子」や「陽子」と呼ばれるものでした{*EF*}{*B*}{*B*} + + + +{*C2*}中には「惑星」や「恒星」と呼ばれるものもありました{*EF*}{*B*}{*B*} +{*C2*}プレイヤーは「オフ」と「オン」、「0」と「1」、プログラムで作られた世界の中にいると信じていたこともありました。また、ゲームで遊んでいると思い込んでいたこともありました。そして、画面上の文字を読んでいる、と思っていたこともありました{*EF*}{*B*}{*B*} +{*C3*}その文字を読んでいるのが君、プレイヤー...{*EF*}{*B*}{*B*} +{*C2*}黙って。プレイヤーは画面に映し出されたコードを読むこともありました。コードを言葉に分解し、言葉から意味をくみ取り、意味から感情を、思いを、理論を、考えを引き出しました。呼吸が深く速くなり、そうしてプレイヤーは気がついたのです。自分が生きていることに。今まで経験した幾千もの死は現実ではなかったことに{*EF*}{*B*}{*B*} +{*C3*}それが君。君だ。君は生きているんだ{*EF*}{*B*}{*B*} +{*C2*}時折、夏の木漏れ日から宇宙の語りかける声を聞いたと感じることもありました{*EF*}{*B*}{*B*} +{*C3*}時折、宇宙の声は、冷たく澄んだ冬の夜空の輝きから聞こえると感じたこともありました。視界の端にかすかに見えたのは、太陽より百万倍も大きな星の光だったのかもしれません。燃えた星のプラズマが、ほんの一瞬だけプレイヤーの目に映ったのです。プレイヤーは宇宙のはるか遠くで、家に向かって歩いている途中に突然おいしそうな匂いを感じ、慣れ親しんだ家のドアに今にもたどり着きそうなところでした。そしてプレイヤーはまた夢を見るのです{*EF*}{*B*}{*B*} +{*C2*}時折、宇宙は「0」と「1」を通して、世界の電気を介して語りかけてくるのだと感じたこともありました。夢の終わりには、宇宙は画面上を流れていく言葉で話しかけていました{*EF*}{*B*}{*B*} +{*C3*}宇宙は言いました。「愛している」{*EF*}{*B*}{*B*} +{*C2*}「辛抱強く遊んでくれてありがとう」{*EF*}{*B*}{*B*} +{*C3*}「君が必要とする物は、すべて自分の中にある」{*EF*}{*B*}{*B*} +{*C2*}「君は自分が思うより強いのだ」{*EF*}{*B*}{*B*} +{*C3*}「君は日差しだ」{*EF*}{*B*}{*B*} +{*C2*}「君は闇夜だ」{*EF*}{*B*}{*B*} +{*C3*}「君が闘っている暗闇は自分の内側に他ならない」{*EF*}{*B*}{*B*} +{*C2*}「君が求める光は自分の内側に存在する」{*EF*}{*B*}{*B*} +{*C3*}「君はひとりではない」{*EF*}{*B*}{*B*} +{*C2*}「君はすべてから切り離された存在ではない」{*EF*}{*B*}{*B*} +{*C3*}「君自身が宇宙だ。君は自分を試し、自分に語りかけ、自分を見つめている」{*EF*}{*B*}{*B*} +{*C2*}「そして僕が君を愛するのは、君自身が愛であるからだ」{*EF*}{*B*}{*B*} +{*C3*}ゲームは終わり、プレイヤーは夢から目覚め、また新しい夢が始まります。次にプレイヤーが見る夢はもっと素晴らしいものでしょう。プレイヤーは宇宙であり、愛でした{*EF*}{*B*}{*B*} +{*C3*}さあ、プレイヤー{*EF*}{*B*}{*B*} +{*C2*}目を覚まして{*EF*} + + +暗黒界をリセットする + +本当にこのセーブ データの暗黒界を最初の状態にリセットしてもよろしいですか? 暗黒界に建設したものはすべて失われます + +暗黒界をリセットする + +暗黒界をリセットしない + +現在、Mooshroom は毛刈りできません。豚、羊、牛、ネコ、馬の数が最大数に達しました。 + +現在、スポーン エッグを使用できません。 豚、羊、牛、ネコ、馬の数が最大数に達しました。 + +現在、スポーン エッグを使用できません。 Mooshroom の数が最大数に達しました + +現在、スポーン エッグを使用できません。 世界のオオカミの数が最大数に達しました + +現在、スポーン エッグを使用できません。 世界のニワトリの数が最大数に達しました + +現在、スポーン エッグを使用できません。 世界のイカの数が最大数に達しました + +現在、スポーン エッグを使用できません。 世界の村人の数が最大数に達しました + +現在、スポーン エッグを使用できません。 世界の敵の数が最大数に達しました + +現在、スポーン エッグを使用できません。 世界の村人の数が最大数に達しました + +世界の絵/額縁の数が最大数に達しました。 + +難易度「ピース」では敵を出現させることはできません。 + +この動物は求愛モードにできません。豚、羊、牛、ネコ、馬の繁殖数が最大数に達しました。 + +この動物は求愛モードにできません。オオカミの繁殖数が最大数に達しました + +この動物は求愛モードにできません。ニワトリの繁殖数が最大数に達しました + +この動物は求愛モードにできません。馬の繁殖数が最大数に達しました。 + +この動物は求愛モードにできません。Mooshroom の繁殖数が最大数に達しました + +世界のボートの数が最大数に達しました + +世界のヘッド類の数が最大数に達しました + +上下反転 + +左利き + +ゲームオーバー! + +復活 + +利用可能ダウンロード コンテンツ + +スキンを変更 + +遊び方 + +操作方法 + +設定 + +クレジット + +コンテンツを再インストール + +デバッグ設定 + +火の延焼 + +TNT の爆発 + +PvP + +高度な操作を許可 + +ホスト特権 + +建物を生成する + +スーパーフラット + +ボーナス チェスト + +世界のオプション + +ゲーム オプション + +生き物による妨害 + +持ち物の保持 + +生き物の出現 + +生き物からの戦利品 + +タイルからのアイテム入手 + +自然再生 + +時刻の変化 + +建設と採掘の許可 + +ドアとスイッチを使用可能 + +入れ物を使用可能 + +プレイヤーを攻撃可能 + +動物を攻撃可能 + +ホストオプションを変更可能 + +プレイヤーを追放 + +飛行可能 + +疲労無効 + +不可視 + +ホスト オプション + +プレイヤー/招待 + +オンライン ゲーム + +招待者のみ + +その他のオプション + +ロード + +新しい世界 + +世界の名前 + +世界の種 + +空白のままで種をランダムに決定する + +プレイヤー + +ゲームに参加 + +ゲームを始める + +ゲームが見つかりません + +プレイする + +ランキング + +実績 + +遊び方 & オプション + +完全版を購入 + +ゲームに戻る + +ゲームをセーブ + +難易度: + +ゲーム タイプ: + +ゲーマータグ: + +建物: + +レベル タイプ: + +PvP: + +高度な操作を許可: + +TNT 火薬: + +火の延焼: + +テーマを再インストール + +ゲーマー アイコン 1 を再インストール + +ゲーマー アイコン 2 を再インストール + +アバター アイテム 1 を再インストール + +アバター アイテム 2 を再インストール + +アバター アイテム 3 を再インストール + +オプション + +オーディオ + +コントロール + +グラフィック + +ユーザー インターフェイス + +デフォルトにリセット + +画面の揺れ + +ヒント + +プレイ中のボタンガイド + +ゲーム内でゲーマータグを表示 + +2 プレイヤー左右分割画面 + +完了 + +看板のメッセージを編集: + +スクリーンショットの説明を入力してください + +キャプション + +ゲームのスクリーンショット + +看板のメッセージを編集: + +Minecraft: Xbox 360 版で作ったよ! + +Minecraft 正統派のテクスチャ、アイコン、ユーザー インターフェイス! + +すべてのマッシュアップされた世界を表示する + +転送をセーブするスロットを選択する + +空のスロット + +セーブ メタデータをアップロード中 + +セーブ データをアップロード中 + +Xbox One 用にセーブをアップロード中 + +アップロードがキャンセルされました + +セーブ転送エリアへのセーブのアップロードがキャンセルされました + +効果なし + +スピード + +鈍化 + +勤勉 + +疲労 + + + +弱体化 + +回復 + +ダメージ + +跳躍 + +目まい + +再生 + +耐性 + +耐火 + +水中呼吸 + +不可視 + +盲目 + +暗視 + +空腹 + + + +ウィザー + +HP ブースト + +吸収 + +飽和 + +スピードの + +鈍化の + +勤勉の + +疲労の + +力の + +弱体化の + +回復の + +ダメージの + +跳躍の + +目まいの + +再生の + +耐性の + +耐火の + +水中呼吸の + +不可視の + +盲目の + +暗視の + +空腹の + +毒の + + (衰弱) + + (HP ブースト) + + (吸収) + + (飽和) + + + +II + +III + +IV + + (スプラッシュ) + +陳腐な + +退屈な + +無個性な + +クリアな + +ミルキーな + +拡散した + +素朴な + +薄い + +不完全な + +気の抜けた + +かさばる + +無様な + +バター風味の + +なめらかな + +上品な + +小粋な + +濃厚な + +エレガントな + +ファンシーな + +チャーミングな + +粋な + +洗練された + +真心の + +きらめく + +強力な + +よどんだ + +無臭の + +悪臭の + +刺激のある + +えぐい + +キモい + +臭い + +すべてのポーションの基礎に使用します。調合台で使用すると、ポーションができます。 + +単体では効果がありませんが、調合台で使用することができ、材料を追加するとポーションができます。 + +プレイヤー、動物、モンスターの移動スピードを上昇させ、プレイヤーの走るスピード、ジャンプ距離、視界を向上させます + +プレイヤー、動物、モンスターの移動スピードを低下させ、プレイヤーの走るスピード、ジャンプ距離、視界を低下させます + +プレイヤーやモンスターの攻撃ダメージを上昇させます + +プレイヤーやモンスターの攻撃ダメージを低下させます + +プレイヤー、動物、モンスターの HP を瞬時に回復させます + +プレイヤー、動物、モンスターの HP を瞬時に減少させます + +プレイヤー、動物、モンスターの HP を時間とともに回復させます + +プレイヤー、動物、モンスターが、火、溶岩、Blaze 攻撃からダメージを受けなくなります + +プレイヤー、動物、モンスターの HP を時間とともに減少させます + +適用時: + +馬のジャンプ強さ + +ゾンビの援軍 + +最大 HP + +生き物による追尾範囲 + +ノックバック耐性 + +スピード + +攻撃ダメージ + +鋭さ + +聖なる力 + +虫殺し + +ノックバック + +火属性 + +防護 + +防火 + +落下軽減 + +爆発耐性 + +間接攻撃耐性 + +水中呼吸 + +水中作業 + +効率 + +技能 + +耐久力 + +アイテムボーナス + +幸運 + +パワー + +火炎 + +衝撃 + +無限 + +I + +II + +III + +IV + +V + +VI + +VII + +VIII + +IX + +X + +鉄のツルハシ以上で掘れる。エメラルドが採れる + +チェストに似ているが、異なる世界でもエンダー チェストの中のアイテムはすべてのプレイヤーのエンダー チェストで手に入れることができる + +接続したトリップワイヤーをエンティティが通過した時に起動する + +エンティティが通過した時に接続したトリップワイヤー フックを起動する + +エメラルドを保管するのに使える + +丸石でできた壁 + +武器、道具、防具の修理に使用できる + +闇のクォーツを作るためにかまどで精錬した + +飾りとして使用する + +村人と取引できる + +飾り付けとして使う。花、苗木、サボテン、きのこを植えることができる + +2{*ICON_SHANK_01*} 回復する。金のニンジンの材料となる。農地に植えることができる + +0.5{*ICON_SHANK_01*} 回復する。かまどで調理することも可能。農地に植えることができる + +3{*ICON_SHANK_01*} 回復する。ジャガイモをかまどで調理するとできる + +1{*ICON_SHANK_01*} 回復する。病気になる場合がある + +3{*ICON_SHANK_01*} 回復する。ニンジンと金の塊から作る + +鞍を着けた豚に乗った時、操縦するのに使う + +4{*ICON_SHANK_01*} 回復する。 + +武器、道具、防具をエンチャントするのに金床と一緒に使用する + +闇のクォーツ鉱石を掘って作る。クォーツのブロックの材料になる + +ウールから作られる。飾り付けとして使う + +エメラルド + +植木鉢 + +ニンジン + +ジャガイモ + +ベイクド ポテト + +有毒なジャガイモ + +金のニンジン + +棒付きのニンジン + +パンプキン パイ + +エンチャントした本 + +闇のクォーツ + +エメラルド鉱石 + +エンダー チェスト + +トリップワイヤー フック + +トリップワイヤー + +エメラルドのブロック + +丸石の壁 + +苔の生えた丸石の壁 + +植木鉢 + +ニンジン + +ジャガイモ + +金床 + +金床 + +軽いダメージを受けた金床 + +酷いダメージを受けた金床 + +闇のクォーツ鉱石 + +クォーツのブロック + +模様入りのクォーツのブロック + +柱状のクォーツのブロック + +クォーツの階段 + +カーペット + +黒のカーペット + +赤のカーペット + +緑のカーペット + +茶色のカーペット + +青のカーペット + +紫のカーペット + +水色のカーペット + +薄灰色のカーペット + +灰色のカーペット + +ピンクのカーペット + +黄緑のカーペット + +黄色のカーペット + +空色のカーペット + +赤紫のカーペット + +オレンジのカーペット + +白のカーペット + +模様入り砂岩 + +なめらかな砂岩 + +{*SOURCE*} に損害を与えようとした {*PLAYER*} が倒された + +{*PLAYER*} は落下した金床に潰された + +{*PLAYER*} は落下したブロックに潰された + +{*PLAYER*} を {*DESTINATION*} へテレポートした + +{*PLAYER*} の場所までテレポートされた + +{*PLAYER*} があなたの場所にテレポートされた + +とげ + +クォーツの厚板 + +水中を含む暗いエリアを、まるで昼間のように明るく表示します + +影響を受けるプレイヤー、動物、モンスターを不可視にします + +修理 & 名前 + +エンチャントのコスト: %d + +高すぎます! + +名前の変更 + +所有: + +取引に必要なアイテム + +{*VILLAGER_TYPE*} からの申し込み: %s + +修理 + +取引 + +首輪の染色 + + + この金床の画面では、経験値を使って武器、防具、道具の名前を変更したり、修理したり、エンチャントすることができます + + + + {*B*} + 金床の画面の説明を続けるには {*CONTROLLER_VK_A*} を押してください。{*B*} + 金床の説明を飛ばすには {*CONTROLLER_VK_B*} を押してください + + + + アイテムを作るには、1 つ目の入力スロットに入れてください + + + + 2 つ目の入力スロットに正しい材料 (例: 壊れた鉄の剣に鉄の延べ棒) が入ると、出力スロットに修理対象のアイテムが表示されます + + + + 同一アイテムをもう 1 つ、2 つ目の入力スロットに入れれば、2 つのアイテムを組み合わせることができます + + + + 金床の上でアイテムをエンチャントするには、エンチャントした本を 2 つ目の入力スロットに入れます + + + + 作業にかかる経験値の数は、出力スロットの下に表示されます。経験値が足りない場合、修理は完了しません + + + + テキストボックスに表示された名前を編集すれば、アイテムの名前を変更することができます + + + + 修理したアイテムを拾うと、金床で使用した両方のアイテムを消費し、その分経験値が下がります + + + + このエリアには、道具と武器の入った金床とチェストがあります + + + + {*B*} + 金床の解説を続けるには {*CONTROLLER_VK_A*} を押してください。{*B*} + 金床の説明を飛ばすには {*CONTROLLER_VK_B*} を押してください + + + + 金床を使って武器と道具を修理し、耐久度を回復させたり、名前を変更したり、エンチャントした本を使ってエンチャントすることができます + + + + エンチャントした本は、ダンジョン内のチェストの中にあるか、エンチャントテーブルで普通の本をエンチャントして作ることができます + + + + 金床を使うと経験値を消費し、使うたびに金床にダメージを与える可能性があります + + + + 必要な作業内容、アイテムの価値、エンチャントの回数および過去に行った作業の数のすべてが修理コストに影響を与えます + + + + アイテムの名前を変更すると、すべてのプレイヤーに対して表示される名前が変わり、作業コストが永久に下がったままになります + + + + このエリアのチェストの中には、実験に使うことができる、壊れたツルハシ、原材料、エンチャントのビンおよびエンチャントした本が入っています + + + + この取引の画面では、村人を相手に行うことのできる取引が表示されます + + + + {*B*} + 取引の画面の説明を続けるには {*CONTROLLER_VK_A*} を押してください。{*B*} + 取引の画面の説明を飛ばすには {*CONTROLLER_VK_B*} を押してください + + + + 現在、村人が希望しているすべての取引は、画面上部に表示されます + + + + 必要なアイテムを持っていない場合、その取引は赤で表示され、利用することができません + + + + 村人に渡すアイテムの数と種類は、画面左側の 2 つのボックス内に表示されます + + + + 取引に必要なアイテムの合計は、画面左側の 2 つのボックスに表示されます + + + + 村人が申し出ているアイテムと取引するには {*CONTROLLER_VK_A*} を押してください + + + + このエリアには村人と、アイテムを購入するための紙が入ったチェストがあります + + + + {*B*} + 取引の説明を続けるには {*CONTROLLER_VK_A*} を押してください。{*B*} + 取引の説明を飛ばすには {*CONTROLLER_VK_B*} を押してください + + + + プレイヤーは、持ち物のアイテムを村人と取引することができます + + + + 村人が申し出る取引は、職業によって異なります + + + + いくつかの取引を組み合わせて実行すると、村人の取引がランダムに追加または変更されます + + + + 頻繁に使用された取引は、一時的に削除されることがありますが、村人は常に少なくとも 1 回は取引を申し出ます + + + + チェストの中の紙を何枚か取り出し、ここの村人と取引してみてください + + + + このエリアには、エンダー チェストが 2 つあります + + + + {*B*} + エンダー チェストの解説を続けるには {*CONTROLLER_VK_A*} を押してください。{*B*} + エンダー チェストの解説を飛ばすには {*CONTROLLER_VK_B*} を押してください + + + + すべてのエンダー チェストは、世界を超えてリンクしています。エンダー チェストに入れられたアイテムは、他のどのエンダー チェストからでも利用することができます + + + + エンダー チェストの中身はプレイヤーによって異なります + + + + これにより、プレイヤーはどのエンダー チェストにもアイテムを保管でき、世界のどの場所のエンダー チェストからでもアイテムを取り出すことができます。いずれかのエンダー チェストにアイテムを入れて試してみましょう + + +2{*ICON_SHANK_01*} 回復し、HP が 30 秒間自動回復し、耐火とダメージ耐性を 5 分間与える。リンゴと金のブロックから作る + +テレポート可能 + +テレポート + +プレイヤーへテレポートする + +自分へテレポートする + +疲労を無効にできる + +不可視になれる + +不可視を有効にできるようになりました + +不可視を有効にできなくなりました + +飛行を有効にできるようになりました + +飛行を有効にできなくなりました + +疲労を有効にできるようになりました + +疲労を有効にできなくなりました + +テレポートできます + +テレポートできなくなりました + +{*T3*}遊び方: 金床{*ETW*}{*B*}{*B*} +経験値は、金床と一緒にアイテムの修理、エンチャントまたは名前の変更にも使うことができます。{*B*} +すべてのアイテムの名前は変更できますが、修理またはエンチャントした本を用いてエンチャントできるのは耐久力のあるアイテムだけです。{*B*} +アイテムを修理するには、アイテムと材料 (鉄の剣には鉄の延べ棒など) または同じタイプのアイテムを組み合わせて、左側の入力スロットに入れます。{*B*} +アイテムを組み合わせる場合、金床と組み合わせるのがより効果的です。さらに、どちらかがエンチャントされたアイテムの場合、完成したアイテムは入力スロットに入れたどちらかのアイテムにエンチャントされます。{*B*} +エンチャントした本が適切であれば、アイテムを金床で組み合わせることで、アイテムをエンチャントすることができます。エンチャントした本はダンジョン内のチェストで見つけるか、普通の本をエンチャントテーブルでエンチャントすることができます。{*B*} +金床は使用するたびにダメージを受けることがあり、酷使し過ぎると壊れてしまいます{*B*} + + +{*T3*}遊び方: 取引{*ETW*}{*B*}{*B*} +村人とアイテムを取引することができます。村人はそれぞれ、農民、肉屋、鍛冶屋、司書、司祭などの職業に就いていて、取引対象となるアイテムの種類に影響を及ぼします。{*B*} +取引メニューで、村人が提供しているすべての取引のリストを見ることができます。あまり頻繁に使用すると、その取引は一時的に無効になりますが、プレイヤーがこれを使用して取引を行うと、村人は取引内容を変更したり追加したりすることができます。{*B*} +取引は通常、いくつかのアイテムを売買してエメラルドを手に入れることを指します。{*B*} +取引に必要なアイテムを持っていない場合、アイテムが赤く表示されます{*B*} + + +{*T3*}遊び方: エンダー チェスト {*ETW*}{*B*}{*B*} +ゲームの世界のエンダー チェストはすべてリンクしていて、中に保管されたアイテムはどのエンダー チェストからもアクセスすることができます。エンダー チェストの中身はプレイヤーごとに異なります。エンダー チェストに入れられたアイテムは、世界のどの場所にあるエンダー チェストからでも利用することができます + + +農民 + +司書 + +司祭 + +鍛冶屋 + +肉屋 + +村にある。村人が職業によって異なるアイテムの売却を申し出る + +大きなチェスト + + + エンチャントした本は、エンチャントテーブルで作ることができます。これを後で金床で使えば、アイテムをエンチャントすることができます + + + + トリップワイヤー フックは、ワイヤー間をつなぐひもに何かが触発していれば、回路に動力を与え続けます + + + + 飼い慣らしたオオカミは常に首輪を着けます。首輪の色は、染色して変えることができます + + +ニンジンやジャガイモは、植えて栽培することができます。地上に野菜の姿が見えたら収穫の準備完了です + + + 豚に鞍を着ければプレイヤーは乗ることができます。鞍を着けた豚は、棒付きのニンジンで釣って操縦します + + + + {*CONTROLLER_ACTION_MOVE*}でトロッコをゆっくり動かせます。トロッコを加速レールに乗せて走らせます + + +分割画面プレイは高解像度モードでしか対応していないため、ゲームに参加できません。参加するには、参加中のプレイヤーをサインアウトしてください + +治癒 + +Xbox 360 + +戻る + +このオプションでは、実績およびランキング更新は無効になります。 + +Xbox One 用にセーブをアップロード + +セーブをアップロード + +セーブ転送エリアに一度に保管できるのは Xbox 360 本体 1 台のセーブのみです。別の Xbox 360 本体セーブに読み込む前に、お使いの Xbox One 本体にセーブをダウンロードしたかご確認ください + +読み込み中... + +読み込みが完了しました! + +読み込みに失敗しました。後ほど改めてお試しください + + diff --git a/Minecraft.Client/Common/Media/ko-KR/4J_strings.resx b/Minecraft.Client/Common/Media/ko-KR/4J_strings.resx new file mode 100644 index 00000000..dfa720ac --- /dev/null +++ b/Minecraft.Client/Common/Media/ko-KR/4J_strings.resx @@ -0,0 +1,108 @@ + +사용 안 함 + +확인 + +뒤로 + +취소 + + + +아니요 + +저장 데이터 손상 + +저장 데이터가 손상되었습니다. 새로 저장한 다음 기존 데이터를 덮어쓰시겠습니까? + +여유 공간 부족 + +선택한 저장 장치에 공간이 부족하여 새 저장 데이터를 만들 수 없습니다. + +다시 선택 + +저장하지 않고 플레이 + +새 저장 데이터 생성 + +덮어쓰시겠습니까? + +저장 데이터가 들어 있는 저장 장치를 선택했습니다. 덮어쓰시겠습니까? + +아니요, 덮어쓰지 않습니다. + +덮어쓰고 저장합니다. + +저장 실패 + +저장 장치 문제 + +저장 장치를 사용할 수 없거나 장치에 오류가 있습니다. + +저장 장치를 사용할 수 없거나 저장 장치에 오류가 있습니다. 다른 저장 장치를 선택하십시오. + +새 저장 장치 선택 + +선택한 저장 장치 없음 + +저장 장치를 선택하지 않으면 게임을 저장할 수 없습니다. + +저장 장치 선택 + +저장하지 않고 계속하기 + +저장 장치가 제거되었습니다. 새 장치를 선택하십시오. + +불러오기 실패 + +저장 데이터 이름 입력 + +저장 데이터 이름을 입력하십시오. + +Xbox 대시보드로 돌아가기 + +게임을 종료하시겠습니까? + +로그아웃 + +게이머 프로필에서 로그아웃했으므로 타이틀 화면으로 돌아갑니다. + +게이머 프로필에서 로그아웃했으므로 매치가 종료됐습니다. + +계속 플레이 + +게이머 프로필이 오프라인 상태입니다. + +이 게임 기능 중 일부는 게이머 프로필로 Xbox LIVE에 로그인해야 이용할 수 있습니다. 현재는 오프라인 상태입니다. + +이 기능을 이용하려면 게이머 프로필로 Xbox LIVE에 로그인해야 합니다. + +Xbox LIVE 연결 + +오프라인으로 계속하기 + +도전 과제 상품 문제 + +플레이어의 게임 프로필에 접속하는 중에 문제가 발생했습니다. 도전 과제 상품이 지급되지 않습니다. + +게이머 프로필 문제 + +게이머 프로필에 설정을 저장하지 못했습니다. + +손님 게이머 프로필 + +손님 게이머 프로필로 이용할 수 없는 기능입니다. 다른 게이머 프로필을 선택하십시오. + +저장하는 중... + +콘텐츠를 저장하고 있습니다. 본체를 끄지 마십시오. + +정식 버전 게임 구매 + +이 Minecraft는 평가판입니다. 정식 버전 게임에서는 도전 과제를 달성할 수 있습니다. +정식 버전 게임을 구매하면 Minecraft의 모든 기능을 이용하고 Xbox Live를 통해 전 세계의 친구들과 함께 게임을 즐길 수 있습니다. +정식 버전 게임을 구매하시겠습니까? + +프로필을 읽는 데 문제가 발생하여 주 메뉴로 돌아갑니다. + + diff --git a/Minecraft.Client/Common/Media/ko-KR/strings.resx b/Minecraft.Client/Common/Media/ko-KR/strings.resx new file mode 100644 index 00000000..6516a2f4 --- /dev/null +++ b/Minecraft.Client/Common/Media/ko-KR/strings.resx @@ -0,0 +1,5164 @@ + +새 다운로드 콘텐츠가 준비되었습니다! 주 메뉴의 Minecraft 상점에서 이용할 수 있습니다. + +Minecraft 상점의 캐릭터 팩으로 캐릭터의 외형을 바꿀 수 있습니다. 주 메뉴의 'Minecraft 상점'을 선택해 확인해 보십시오. + +고화질(HD) 모드에서는 하나의 본체에서 분할 화면으로 최대 4명까지 게임을 즐길 수 있습니다. + +게임에 참가하려면 본체에 추가 컨트롤러를 연결하고 START를 누르십시오. + +게임의 밝기를 높이거나 낮추려면 감마 설정을 변경하십시오. + +낙원 난이도를 선택하면 체력이 자동으로 회복되고 밤에 괴물이 출몰하지 않습니다! + +늑대를 길들이려면 뼈를 먹이십시오. 길들인 늑대는 앉게 하거나 플레이어를 따르게 할 수 있습니다. + +소지품 메뉴 밖으로 포인터를 옮기고 {*CONTROLLER_VK_A*} 단추를 눌러 아이템을 버릴 수 있습니다. + +밤에 침대에서 자면 시간을 새벽으로 건너뛸 수 있습니다. 멀티 플레이어 게임에서는 동시에 모든 플레이어가 잠들어야 합니다. + +돼지에서 돼지고기를 수확하고 요리하여 먹으면 체력이 회복됩니다. + +소에서 가죽을 수확하고 그 가죽을 사용해 방어구를 만드십시오. + +빈 양동이를 사용하면 소에서 짜낸 우유, 물, 또는 용암을 담을 수 있습니다! + +식물을 심을 땅을 준비하려면 괭이를 사용하십시오. + +거미는 낮에 한해 먼저 공격하지 않는 한 이쪽을 공격하지 않습니다. + +삽으로 흙이나 모래를 파는 것이 손으로 파는 것보다 빠릅니다! + +돼지고기를 날로 먹는 것보다 요리해서 먹을 때 체력이 더 많이 회복됩니다. + +밤에 불을 밝히려면 횃불을 만드십시오. 괴물들은 횃불 근처 지역에는 접근하지 않습니다. + +광물 수레와 레일을 사용해서 목적지까지 더 빠르게 이동하십시오. + +묘목을 심으면 자라서 나무가 됩니다. + +Pigman은 먼저 공격하지 않는 한 이쪽을 공격하지 않습니다. + +플레이어는 게임 시작 지점을 변경할 수 있으며 침대에서 취침하여 시간을 새벽으로 건너뛸 수 있습니다. + +Ghast가 쏘는 불덩이를 되받아치십시오! + +차원문을 지으면 다른 차원의 세계인 지하로 여행을 떠날 수 있습니다. + +{*CONTROLLER_VK_B*} 단추를 누르면 지금 손에 들고 있는 아이템을 버립니다. + +상황에 맞는 도구를 사용하십시오! + +횃불에 쓸 석탄이 없을 때는 화로 안의 나무에서 숯을 만들 수 있습니다. + +땅을 계속 위로 파거나 계속 아래로 파는 것은 그리 좋지 않습니다. + +해골 뼈에서 얻을 수 있는 뼛가루는 작물을 즉시 자라게 하는 비료로 쓸 수 있습니다. + +Creeper는 접근하면 폭발합니다. + +흑요석은 물과 용암 재료 블록이 부딪쳐서 만들어진 것입니다. + +용암은 재료 블록이 제거되어도 완전히 사라지는 데 시간이 걸립니다. + +Ghast가 쏘는 불덩이에 내성을 가지는 조약돌은 경계 관문을 만드는 데 적합합니다. + +횃불, 발광석, 호박등과 같이 광원으로 사용 가능한 블록은 눈과 얼음을 녹입니다. + +양털로 만든 건축 구조물이 야외에 있으면 번개 때문에 불이 붙을 수도 있으므로 조심해야 합니다. + +용암 한 양동이로 화로에서 블록 100개를 녹일 수 있습니다. + +연주 음은 소리 블럭 아래 재질에 따라 달라집니다. + +좀비와 해골은 물속에 있으면 대낮에도 살아 움직입니다. + +늑대를 공격하면 근처에 있는 늑대들이 적대적으로 변해 플레이어를 공격합니다. Pigman 좀비도 같은 특성을 가집니다. + +늑대는 지하로 내려갈 수 없습니다. + +늑대는 Creeper를 공격하지 않습니다. + +닭은 5분에서 10분마다 달걀을 낳습니다. + +흑요석은 다이아몬드 곡괭이로만 채굴할 수 있습니다. + +Creeper를 처치하면 손쉽게 화약을 얻을 수 있습니다. + +두 개의 상자를 나란히 놓으면 큰 상자 하나를 만들 수 있습니다. + +길들인 늑대는 꼬리를 보면 체력 상태를 알 수 있습니다. 기운을 회복시키려면 고기를 먹이십시오. + +화로를 이용하면 선인장을 초록 선인장 염료로 만들 수 있습니다. + +4J Studios와 Kappische의 Twitter에서 이 게임의 최신 정보를 얻을 수 있습니다. + +일시 중지 메뉴에서 Minecraft 스크린샷을 Facebook에 올릴 수 있습니다. 친구들에게 자신의 작품을 자랑하십시오! + +플레이 방법 메뉴의 업데이트 정보 섹션에서 최신 업데이트 정보를 확인할 수 있습니다. + +이제 울타리를 쌓을 수 있습니다! + +minecraftforum에 Xbox 360 Edition 전용 섹션이 생겼습니다. + +플레이어가 손에 밀을 들고 있으면 일부 동물이 플레이어를 따라다닙니다. + +동물이 어떤 방향이든 20 블록 이상 움직일 수 없으면 사라지지 않습니다. + +음악은 C418이 만들었습니다! + +Notch의 Twitter를 팔로우하는 사람은 100만 명이 넘습니다! + +스웨덴 사람들이 모두 금발은 아닙니다. Mojang 소속의 Jens 같이 붉은 머리도 있습니다! + +4J Studios가 Xbox 360 게임에서 Herobrine을 삭제한 것 같습니다. + +언젠가는 업데이트가 있을 예정입니다! + +Notch가 누구인지 아십니까? + +Mojang의 직원 수보다 Mojang이 받은 상의 수가 많습니다! + +유명인들도 Minecraft를 즐깁니다! + +deadmau5는 Minecraft를 좋아합니다! + +버그가 보이더라도 신경쓰지 마세요. + +Creeper는 코딩 버그에서 태어났습니다. + +닭입니까, 오리입니까? + +Minecon에 간 적 있나요? + +Mojang 직원 중, junkboy의 얼굴을 본 사람은 없습니다. + +Minecraft 위키가 있다는 걸 아십니까? + +Mojang의 새 사무실은 아주 멋집니다! + +Minecraft: Xbox 360 Edition이 다양한 기록을 갱신했습니다! + +Minecon 2013이 미국 플로리다 주 올랜도 시에서 개최되었습니다! + +.party()은 최고였습니다! + +뜬소문은 모두 거짓이라고 생각하는 것이 진실이라고 생각하는 것보다 좋습니다! + +{*T3*}플레이 방법: 기본{*ETW*}{*B*}{*B*} +Minecraft는 블록을 배치하여 무엇이든 상상한 대로 만들 수 있는 게임입니다. 밤에는 괴물이 출몰하므로, 그에 대비하여 피신처를 준비해둬야 합니다.{*B*}{*B*} +{*CONTROLLER_ACTION_LOOK*}으로 주위를 둘러봅니다.{*B*}{*B*} +{*CONTROLLER_ACTION_MOVE*}으로 주변을 이동합니다.{*B*}{*B*} +{*CONTROLLER_ACTION_JUMP*}를 누르면 점프합니다.{*B*}{*B*} +{*CONTROLLER_ACTION_MOVE*}을 앞으로 빠르게 두 번 누르면 질주합니다. {*CONTROLLER_ACTION_MOVE*}를 계속 누르고 있으면 질주 시간이 다 되거나 음식 막대가 {*ICON_SHANK_03*} 이하가 될 때까지 계속 질주합니다.{*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*} +작업대에서 아이템을 만드는 방법은 기본 제작과 같지만, 제작 공간이 더 넓고 선택할 수 있는 아이템이 더 많아집니다. + + +{*T3*}플레이 방법: 화로{*ETW*}{*B*}{*B*} +화로에서는 아이템에 열을 가해서 다른 아이템으로 바꿀 수 있습니다. 예를 들어 철광석을 화로에서 가열하면 철 주괴가 만들어집니다.{*B*}{*B*} +화로를 설치하고 {*CONTROLLER_ACTION_USE*}를 눌러 사용하십시오.{*B*}{*B*} +화로 아래쪽에는 연료나 땔감을 넣고 위쪽에는 가열할 아이템을 넣어야 합니다. 그러면 화로에 불이 켜지고 작업이 시작됩니다.{*B*}{*B*} +아이템 가열이 끝나면 결과물 슬롯에서 소지품으로 옮길 수 있습니다.{*B*}{*B*} +화로에 넣을 수 있는 재료나 연료 아이템에 포인터를 올려놓으면 해당 아이템을 화로로 빨리 옮길 수 있는 툴팁이 표시됩니다. + + +{*T3*}플레이 방법: 디스펜서{*ETW*}{*B*}{*B*} +디스펜서는 아이템을 쏘아 보내는 데 사용됩니다. 디스펜서를 작동하려면 레버와 같은 스위치를 장착해야 합니다.{*B*}{*B*} +디스펜서에 아이템을 넣으려면 {*CONTROLLER_ACTION_USE*}를 누른 다음, 쏘아 보낼 아이템을 소지품에서 꺼내 디스펜서에 넣으십시오.{*B*}{*B*} +이제 스위치를 조작하면 디스펜서가 아이템을 쏘아 보냅니다. + + +{*T3*}플레이 방법: 양조{*ETW*}{*B*}{*B*} +양조 기술로 물약을 만들기 위해서는 양조대가 필요하며, 양조대는 작업대에서 만들 수 있습니다. 모든 물약을 만들 때는 물 한 병이 필요합니다. 가마솥이나 다른 수원에서 유리병에 물을 채우십시오. {*B*} +양조대 하나에는 병을 넣을 수 있는 슬롯이 세 개 있으므로, 한 번에 물약을 세 병까지 양조할 수 있습니다. 재료 한 개를 병 세 개에 모두 넣을 수 있으므로, 자원을 최대한 아끼려면 물약 세 병을 동시에 양조하십시오.{*B*} +물약 재료를 양조대 위에 넣으면 잠시 후 기본 물약이 완성됩니다. 기본 물약은 그 자체로는 아무런 효과가 없으나 다른 재료를 넣어 양조하면 효과가 있는 물약이 됩니다.{*B*} +효과가 있는 물약을 만든 뒤 세 번째 재료를 넣으면 효과 지속 시간이 길어지거나(레드스톤 가루 사용), 효과가 더 강해지거나(발광석 가루 사용), 해로운 효과로 바꿀 수(발효 거미 눈 사용) 있습니다.{*B*} +물약에 화약을 넣으면 던질 수 있는 폭발 물약으로 바꿀 수 있습니다. 폭발 물약을 던지면 물약병이 떨어진 지점 주변에서 해당 물약의 효과가 발생합니다.{*B*} + +물약 재료는 다음과 같습니다.{*B*}{*B*} +* {*T2*}지하 사마귀{*ETW*}{*B*} +* {*T2*}거미 눈{*ETW*}{*B*} +* {*T2*}설탕{*ETW*}{*B*} +* {*T2*}Ghast의 눈물{*ETW*}{*B*} +* {*T2*}Blaze 가루{*ETW*}{*B*} +* {*T2*}마그마 크림{*ETW*}{*B*} +* {*T2*}빛나는 수박{*ETW*}{*B*} +* {*T2*}레드스톤 가루{*ETW*}{*B*} +* {*T2*}발광석 가루{*ETW*}{*B*} +* {*T2*}발효 거미 눈{*ETW*}{*B*}{*B*} + +재료의 조합에 따라 물약의 효과가 달라지니 여러 조합을 시험해 보십시오. + + +{*T3*}플레이 방법: 효과부여{*ETW*}{*B*}{*B*} +괴물 및 동물을 처치하거나 또는 특정 블록을 채굴하거나 녹여서 얻을 수 있는 경험치로 도구, 무기 및 방어구에 효과를 부여할 수 있습니다.{*B*} +검, 활, 도끼, 곡괭이, 삽 또는 방어구를 효과부여대에 놓인 책 아래에 있는 슬롯에 넣으면 슬롯 오른쪽에 각각 경험치 비용이 쓰인 단추 세 개가 나타납니다.{*B*} +효과부여에 필요한 경험치가 모자란 항목은 빨간색으로 나타나며, 그렇지 않다면 초록색으로 나타납니다.{*B*}{*B*} +실제 효과부여는 표시된 비용에 기반을 두고 무작위로 적용됩니다.{*B*}{*B*} +효과부여대가 한 블록 간격을 두고 책장에 둘러싸여 있으면(최대 책장 15개까지) 효과부여 레벨이 상승하며, 효과부여대에 놓인 책에 신비한 문양이 나타납니다.{*B*}{*B*} +효과부여대를 만들 때 쓰이는 모든 재료는 월드 안의 마을에서 찾거나 월드 안에서 채굴 및 경작을 통해 얻을 수 있습니다.{*B*}{*B*} +효과부여 책은 모루에서 아이템에 효과를 부여하는 데 사용합니다. 이것으로 아이템에 더 효율적으로 효과를 부여할 수 있습니다.{*B*} + + +{*T3*}플레이 방법: 동물 농장{*ETW*}{*B*}{*B*} +동물을 한 장소에 두고 싶으면 20x20 블록보다 작은 면적에 울타리를 짓고 그 안에 동물을 두십시오. 이렇게 하면 다른 일을 하다가 돌아와도 동물이 그 자리에 있을 겁니다. + + +{*T3*}플레이 방법: 동물 교배{*ETW*}{*B*}{*B*} +Minecraft에서는 동물을 교배해 새끼 동물을 얻을 수 있습니다!{*B*} +동물을 교배시키려면 각 동물에 적합한 먹이를 먹여 '사랑 모드'로 만들어야 합니다.{*B*} +소, Mooshroom, 양에게는 밀을 먹이고 돼지에게는 당근을 먹이십시오. 그리고 닭에게는 밀 씨앗이나 지하 사마귀를 먹이십시오. 늑대에겐 모든 종류의 고기를 먹일 수 있습니다. 적합한 먹이를 먹은 동물은 근처에 같은 종류의 사랑 모드 상태인 동물이 있는지 찾아다니게 됩니다.{*B*} +사랑 모드 상태이며 종류가 같은 동물이 두 마리 만나게 되면 서로 입을 맞추게 되고, 잠시 후 새끼 동물이 태어납니다. 새끼 동물은 다 자라기 전까지 부모 동물을 따라다니게 됩니다.{*B*} +사랑 모드가 끝난 동물은 5분간 다시 사랑 모드 상태가 될 수 없습니다.{*B*} +월드에 생성될 수 있는 동물의 숫자가 제한되어 있으므로 동물이 많을 때 교배할 수 없을 수도 있습니다. + +{*T3*}플레이 방법: 지하 차원문{*ETW*}{*B*}{*B*} +지하 차원문은 플레이어가 지상 월드와 지하 월드를 오갈 때 사용하는 관문입니다. 지하 월드를 이용하면 지상 월드를 더 빨리 이동할 수 있습니다. 지하 월드의 1블록 거리는 지상 월드의 3블록 거리와 같으므로 지하에 차원문을 세우고 그곳을 통과하면 3배 먼 거리로 나가게 됩니다.{*B*}{*B*} +차원문을 세우려면 흑요석 블록이 10개 이상 필요하며, 5블록 높이에 4블록 길이, 1블록 너비로 만들어야 합니다. 차원문 외형이 만들어지면 안쪽 공간에 불을 붙여야 차원문을 작동할 수 있습니다. 불은 부싯돌과 부시 또는 불쏘시개를 사용하여 붙입니다.{*B*}{*B*} +차원문 세우기의 예시는 오른쪽 그림에 표시되어 있습니다. + + +{*T3*}플레이 방법: 멀티 플레이{*ETW*}{*B*}{*B*} +Xbox 360 본체용 Minecraft는 멀티 플레이 게임이 기본값으로 되어 있습니다. 고화질(HD) 모드로 플레이 중이라면, 플레이 도중 언제든지 추가 컨트롤러를 연결하고 START를 눌러 로컬 플레이어를 게임에 참여시킬 수 있습니다.{*B*}{*B*} +온라인 게임을 시작하거나 도중에 참가하면 친구 목록에 온라인 상태가 표시됩니다(게임 호스트일 때 '초대한 사람만 참가 가능'으로 설정한 경우는 제외). 그리고 친구가 게임에 참가하면 해당 친구의 친구 목록에도 온라인 상태가 표시됩니다('친구의 친구도 참가 가능' 옵션을 선택했을 경우).{*B*} +게임 접속 중에 BACK 단추를 누르면 같은 게임 안에 있는 모든 플레이어 목록을 불러와 플레이어의 게이머 카드를 보거나 게임에서 추방하거나 다른 플레이어를 게임에 초대할 수 있습니다. + + +{*T3*}플레이 방법: 스크린샷 공유{*ETW*}{*B*}{*B*} +일시 중지 메뉴를 불러온 뒤, {*CONTROLLER_VK_Y*} 단추를 눌러 스크린샷을 찍고 Facebook에 공유할 수 있습니다. 조그맣게 스크린샷 미리 보기가 표시되며 Facebook 게시물에 추가할 텍스트를 입력할 수 있습니다.{*B*}{*B*} +스크린샷을 찍을 때 특히 유용하게 쓰이는 카메라 모드의 변경으로 캐릭터의 앞모습을 찍을 수 있습니다. {*CONTROLLER_VK_Y*} 단추를 눌러 공유하기 전에, 게임 속에서 캐릭터의 앞모습이 나오도록 {*CONTROLLER_ACTION_CAMERA*} 단추로 변경하십시오.{*B*}{*B*} +스크린샷에는 게이머태그가 표시되지 않습니다. + + +{*T3*}플레이 방법: 레벨 차단{*ETW*}{*B*}{*B*} +플레이 중인 레벨에 부적절한 내용이 포함되어 있다고 생각되면 해당 레벨을 차단 레벨 목록에 추가할 수 있습니다. +레벨을 차단하려면 일시 중지 메뉴를 불러온 뒤 {*CONTROLLER_VK_RB*}단추를 눌러 레벨 차단 툴팁을 선택하십시오. +다음에 해당 레벨을 선택하여 게임에 참가하려고 하면 차단 레벨 목록에 있는 레벨이라는 주의사항이 표시됩니다. 해당 레벨을 리스트에서 제거한 다음 참가할지, 아니면 나갈지를 선택할 수 있습니다. + +{*T3*}플레이 방법 : 창작 모드{*ETW*}{*B*}{*B*} +창작 모드 인터페이스를 사용하면 게임 내의 모든 아이템을 채굴하거나 제작할 필요 없이 플레이어의 소지품으로 가져갈 수 있습니다. +플레이어의 소지품 안에 있는 아이템은 놓거나 사용해도 없어지지 않습니다. 이 모드에서는 자원을 모으기보다 건설에 집중할 수 있습니다.{*B*} +창작 모드에서 월드를 생성, 저장하거나 불러오면 해당 월드에서는 도전 과제를 획득할 수 없으며 순위표에 기록되지 않습니다. 이후 해당 월드를 생존 모드에서 불러와도 마찬가지입니다.{*B*} +창작 모드에서 {*CONTROLLER_ACTION_JUMP*}를 앞으로 빨리 두 번 누르면 날 수 있습니다. 비행을 종료하려면 똑같은 동작을 반복하십시오. 더 빨리 날려면 {*CONTROLLER_ACTION_MOVE*}를 앞으로 빨리 두 번 누르십시오. +비행 모드에서 {*CONTROLLER_ACTION_JUMP*}를 길게 누르면 위로 올라가고 {*CONTROLLER_ACTION_SNEAK*}를 길게 누르면 아래로 내려갑니다. 또는 {*CONTROLLER_ACTION_DPAD_UP*} 를 누르면 위로 올라가고 {*CONTROLLER_ACTION_DPAD_DOWN*}를 누르면 아래로 내려갑니다. +{*CONTROLLER_ACTION_DPAD_LEFT*}를 누르면 왼쪽으로 이동하고 {*CONTROLLER_ACTION_DPAD_RIGHT*}를 누르면 오른쪽으로 이동합니다. + +{*T3*}플레이 방법: 호스트 및 플레이어 옵션{*ETW*}{*B*}{*B*} + +{*T1*}게임 옵션{*ETW*}{*B*} +월드를 불러오거나 새로 만들 때 "추가 옵션"을 누르면 게임의 세부 사항을 조정할 수 있는 메뉴가 열립니다.{*B*}{*B*} + + {*T2*}플레이어 대 플레이어{*ETW*}{*B*} + 이 옵션을 켜면 플레이어가 다른 플레이어를 공격할 수 있습니다. 생존 모드에만 적용됩니다.{*B*}{*B*} + + {*T2*}플레이어 신뢰{*ETW*}{*B*} + 이 옵션을 끄면 게임에 참여하는 플레이어의 행동이 제한됩니다. 채굴, 아이템 사용, 블록 놓기, 문과 스위치 사용, 보관함 사용, 플레이어나 동물 공격을 할 수 없습니다. 게임 메뉴에서 특정 플레이어의 행동 권한에 관한 이러한 옵션을 변경할 수 있습니다.{*B*}{*B*} + + {*T2*}불 확산{*ETW*}{*B*} + 이 옵션을 켜면 불이 근처 가연성 블록으로 퍼집니다. 나중에 게임에서 설정을 바꿀 수도 있습니다.{*B*}{*B*} + + {*T2*}TNT 폭발{*ETW*}{*B*} + 이 옵션을 켜면 TNT를 점화했을 때 폭발합니다. 나중에 게임에서 설정을 바꿀 수도 있습니다.{*B*}{*B*} + + {*T2*}호스트 특권{*ETW*}{*B*} + 이 옵션을 켜면 호스트는 게임 메뉴에서 플레이어에게 비행 능력을 주거나, 지치지 않게 하거나, 투명하게 만들 수 있습니다.{*DISABLES_ACHIEVEMENTS*}{*B*}{*B*} + + {*T2*}시간대 전환{*ETW*}{*B*} + 비활성화하면 시간대가 변하지 않습니다.{*B*}{*B*} + + {*T2*}소지품 유지{*ETW*}{*B*} + 활성화하면 플레이어가 죽어도 소지품의 아이템을 잃지 않습니다.{*B*}{*B*} + + {*T2*}괴물 생성{*ETW*}{*B*} + 비활성화하면 괴물이나 동물이 자연적으로 생성되지 않습니다.{*B*}{*B*} + + {*T2*}괴물에 의한 괴롭힘{*ETW*}{*B*} + 비활성화하면 몬스터와 동물이 블록을 교체하거나 아이템을 집지 못하게 합니다. 예를 들어 Creeper가 폭발해도 블록이 파괴되지 않으며, 양은 풀을 제거하지 못합니다.{*B*}{*B*} + + {*T2*}괴물 전리품{*ETW*}{*B*} + 비활성화하면 괴물과 동물이 전리품을 떨어트리지 않습니다. 예를 들어 Creeper가 화약을 떨어트리지 않습니다.{*B*}{*B*} + + {*T2*}타일 아이템{*ETW*}{*B*} + 비활성화하면 블록이 파괴돼도 아이템을 떨어트리지 않습니다. 예를 들어 돌 블록에서 조약돌을 얻을 수 없습니다.{*B*}{*B*} + + {*T2*}자연 재생{*ETW*}{*B*} + 비활성화하면 플레이어의 체력이 자연적으로 재생되지 않습니다.{*B*}{*B*} + +{*T1*}월드 생성 옵션{*ETW*}{*B*} +새 월드를 생성할 때 선택할 수 있는 추가 옵션입니다.{*B*}{*B*} + + {*T2*}건물 생성{*ETW*}{*B*} + 이 옵션을 켜면 마을이나 요새 등의 건물이 월드에 생성됩니다.{*B*}{*B*} + + {*T2*}완전평면 월드{*ETW*}{*B*} + 이 옵션을 켜면 지상과 지하에 완전히 평평한 세계가 생성됩니다.{*B*}{*B*} + + {*T2*}보너스 상자{*ETW*}{*B*} + 이 옵션을 켜면 쓸모있는 아이템이 든 상자가 플레이어 생성 지점 근처에 나타납니다.{*B*}{*B*} + + {*T2*}지하 초기화{*ETW*}{*B*} + 이 옵션을 켜면 지하가 재건됩니다. 사전에 지하 요새가 없는 곳에 미리 저장하면 유용합니다.{*B*}{*B*} + + {*T1*}게임 메뉴 옵션{*ETW*}{*B*} + 게임 플레이 중에 {*BACK_BUTTON*}을 눌러 게임 메뉴로 이동한 다음 사용할 수 있는 옵션입니다.{*B*}{*B*} + + {*T2*}호스트 옵션{*ETW*}{*B*} + 호스트 플레이어나 관리자로 설정된 플레이어는 "호스트 옵션" 메뉴에 들어갈 수 있습니다. 이 메뉴에서 불 확산과 TNT 폭발을 켜거나 끌 수 있습니다.{*B*}{*B*} + +{*T1*}플레이어 옵션{*ETW*}{*B*} +플레이어의 행동 권한을 변경하려면 플레이어 이름을 선택하고 {*CONTROLLER_VK_A*}를 눌러 플레이어 특권 메뉴에서 다음 옵션을 조정하십시오.{*B*}{*B*} + + {*T2*}건설 및 채광 가능{*ETW*}{*B*} + 이 옵션은 "플레이어 신뢰"를 껐을 때만 사용할 수 있습니다. 이 옵션을 켜면 플레이어는 월드에서 일반적인 행동을 모두 할 수 있습니다. 이 옵션을 끄면 플레이어는 블록을 놓거나 파괴하지 못합니다.{*B*}{*B*} + + {*T2*}문과 스위치 사용 가능{*ETW*}{*B*} + 이 옵션은 "플레이어 신뢰"를 껐을 때만 사용할 수 있습니다. 이 옵션을 끄면 플레이어는 문과 스위치를 사용할 수 없습니다.{*B*}{*B*} + + {*T2*}보관함을 열 수 있음{*ETW*}{*B*} + 이 옵션은 "플레이어 신뢰"를 껐을 때만 사용할 수 있습니다. 이 옵션을 끄면 플레이어는 상자와 같은 보관함을 열 수 없습니다.{*B*}{*B*} + + {*T2*}플레이어 공격 가능{*ETW*}{*B*} + 이 옵션은 "플레이어 신뢰"를 껐을 때만 사용할 수 있습니다. 이 옵션을 끄면 플레이어는 다른 플레이어에게 피해를 줄 수 없습니다.{*B*}{*B*} + + {*T2*}동물 공격 가능{*ETW*}{*B*} + 이 옵션은 "플레이어 신뢰"를 껐을 때만 사용할 수 있습니다. 이 옵션을 끄면 플레이어는 동물에게 피해를 줄 수 없습니다.{*B*}{*B*} + + {*T2*}관리자{*ETW*}{*B*} + 이 옵션을 켜면 플레이어는 다른 플레이어의 특권을 변경할 수 있습니다(호스트 제외). “플레이어 신뢰”를 끄면 플레이어를 추방하거나 불 확산과 TNT 폭발을 켜거나 끌 수 있습니다.{*B*}{*B*} + + {*T2*}플레이어 추방{*ETW*}{*B*} + 호스트 플레이어와 같은 {*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*} + 플레이어가 플레이어 자신 또는 다른 플레이어를 월드 내 다른 곳으로 이동시킬 수 있습니다. + + +호스트 플레이어와 같은 {*PLATFORM_NAME*} 본체로 플레이하는 플레이어를 제외하고, 이 옵션을 선택하면 다른 {*PLATFORM_NAME*} 본체로 접속하는 플레이어를 추방할 수 있습니다. 추방당한 플레이어는 게임이 새로 시작되기 전까지 다시 참가할 수 없습니다. + +다음 페이지 + +이전 페이지 + +기본 + +HUD + +소지품 + +상자 + +제작 + +화로 + +디스펜서 + +동물 농장 + +동물 교배 + +양조 + +효과부여 + +지하 차원문 + +멀티 플레이 + +스크린샷 공유 + +레벨 차단 + +창작 모드 + +호스트 및 플레이어 옵션 + +거래 + +모루 + +Ender + +{*T3*}플레이 방법: Ender{*ETW*}{*B*}{*B*} +Ender는 Ender 차원문을 통해 갈 수 있는 게임의 다른 차원입니다. Ender 차원문은 지상의 깊은 지하에 있는 요새에서 찾을 수 있습니다.{*B*} +Ender 차원문을 열려면 Ender의 눈이 없는 Ender 차원문 외형에 Ender의 눈을 올려놓으십시오.{*B*} +차원문이 열리면 Ender로 들어가십시오.{*B*}{*B*} +Ender에서 수많은 Enderman과 흉폭하고 강력한 Ender 드래곤을 만나게 되니 전투에 대비해야 합니다!{*B*}{*B*} +이곳에는 8개의 흑요석 기둥 위에 Ender 드래곤이 치유하는 데 사용하는 Ender 수정이 있으니, +전투가 시작되면 가장 먼저 이것을 파괴해야 합니다.{*B*} +일부는 화살 사정거리 내에 있지만 일부는 철제 우리가 보호하고 있으니 올라가야 합니다.{*B*}{*B*} +Ender 드래곤이 Ender 산성구를 쏘며 공격하니 주의하십시오!{*B*} +기둥의 중앙에 있는 알 받침대에 접근하면 Ender 드래곤이 내려와 강력한 공격을 합니다!{*B*} +산성구를 피하며 Ender 드래곤의 눈을 공격하면 효과가 좋습니다. 친구와 함께 Ender에서 전투를 벌이십시오!{*B*}{*B*} +Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 Ender 차원문의 위치를 볼 수 있으니, +쉽게 참여할 수 있습니다. + + +질주 + +업데이트 정보 + + +{*T3*}수정 및 추가{*ETW*}{*B*}{*B*} +- 새로운 아이템 추가 - 단단한 찰흙, 색상 찰흙, 석탄 블록, 건초 더미, 작동기 레일, 레드스톤 블록, 일광 센서, 드로퍼, 호퍼, 호퍼가 부착된 광물 수레, 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*}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*} +드로퍼가 상자나 다른 종류의 보관함을 향해 놓였다면 아이템은 땅이 아니라 해당 상자 안에 들어갑니다. 드로퍼 여러 개를 길게 연결하면 먼 거리로 아이템을 보낼 수 있으며, 이 기능을 작동시키려면 각 드로퍼에 별도로 동력을 공급하거나 차단해야 합니다. + + +맨손 공격보다 위력이 강합니다. + +손을 사용하는 것보다 흙, 잡초, 모래, 자갈, 눈을 더 빨리 파냅니다. 눈덩이를 파내려면 삽이 필요합니다. + +돌로 된 블록이나 광석을 채굴할 때 쓰입니다. + +나무로 된 블록을 손을 사용할 때보다 더 빨리 잘라냅니다. + +흙과 잡초 블록을 갈아엎어서 작물을 기를 수 있게 만듭니다. + +나무문은 사용하거나 때리거나 또는 레드스톤으로 열 수 있습니다. + +철문은 레드스톤, 단추 또는 스위치로만 열 수 있습니다. + +NOT USED + +NOT USED + +NOT USED + +NOT USED + +착용 시 1의 방어력을 얻습니다. + +착용 시 3의 방어력을 얻습니다. + +착용 시 2의 방어력을 얻습니다. + +착용 시 1의 방어력을 얻습니다. + +착용 시 2의 방어력을 얻습니다. + +착용 시 5의 방어력을 얻습니다. + +착용 시 4의 방어력을 얻습니다. + +착용 시 1의 방어력을 얻습니다. + +착용 시 2의 방어력을 얻습니다. + +착용 시 6의 방어력을 얻습니다. + +착용 시 5의 방어력을 얻습니다. + +착용 시 2의 방어력을 얻습니다. + +착용 시 2의 방어력을 얻습니다. + +착용 시 5의 방어력을 얻습니다. + +착용 시 3의 방어력을 얻습니다. + +착용 시 1의 방어력을 얻습니다. + +착용 시 3의 방어력을 얻습니다. + +착용 시 8의 방어력을 얻습니다. + +착용 시 6의 방어력을 얻습니다. + +착용 시 3의 방어력을 얻습니다. + +빛나는 주괴입니다. 주괴로 도구를 만들면 주괴와 재질이 같은 도구가 제작됩니다. 화로에서 광석을 녹여 만듭니다. + +주괴, 보석, 염료를 설치 가능한 블록으로 만들 수 있게 해줍니다. 값비싼 건설용 블록으로 쓰거나 광물을 간편하게 보관하는 데 사용됩니다. + +플레이어나 동물 또는 괴물이 밟으면 전기를 보냅니다. 나무 압력판은 위쪽에 물체를 떨어뜨려도 작동합니다. + +작은 계단을 만드는 데 사용됩니다. + +긴 계단을 만드는 데 쓰입니다. 발판 2개를 쌓으면 보통 크기의 2단 계단 블록이 만들어집니다. + +긴 계단을 만드는 데 쓰입니다. 발판 2개를 쌓으면 보통 크기의 2단 계단 블록이 만들어집니다. + +빛을 만드는 데 사용합니다. 눈과 얼음도 녹일 수 있습니다. + +건설 재료로 쓰거나 다양한 물건의 재료로 사용됩니다. 어떤 형태의 나무로든 만들어낼 수 있습니다. + +건설 재료로 사용됩니다. 일반 모래와 달리 중력의 영향을 받지 않습니다. + +건설 재료로 사용됩니다. + +횃불, 화살, 표지판, 사다리, 울타리를 만들거나 무기 또는 도구의 손잡이로 사용됩니다. + +밤에 모든 플레이어가 침대에 들면 시간을 앞당겨서 아침으로 만들며, 플레이어 생성 지점을 바꿉니다. +침대 제작에 사용된 양털의 색과 상관없이, 침대의 색상은 모두 같습니다. + +일반적인 제작보다 더 다양한 아이템을 선택해 제작할 수 있게 해줍니다. + +광석을 녹이고 숯과 유리를 만들며, 생선과 돼지고기를 요리하는 데 사용합니다. + +블록과 아이템을 넣어 보관합니다. 상자 2개를 나란히 놓으면 용량이 2배 큰 상자가 만들어집니다. + +뛰어넘을 수 없는 방어벽으로 사용됩니다. 플레이어나 동물, 괴물에 대해서는 1.5배 높이의 블록으로 간주되지만 다른 블록에 대해서는 높이가 같은 것으로 간주됩니다. + +수직 경사를 오를 때 사용합니다. + +사용하거나 때리거나 레드스톤을 이용해 작동시킵니다. 작동 방식은 일반 문과 같지만 개별적 블록으로 간주되며, 땅과 수평인 형태로 열립니다. + +자신이나 다른 플레이어가 입력한 텍스트를 표시합니다. + +횃불보다 더 밝은 빛을 만들어냅니다. 얼음이나 눈을 녹이며, 물속에서 사용이 가능합니다. + +폭발을 일으킵니다. 설치한 다음, 부싯돌과 부시를 사용하거나 전기를 이용해 폭파할 수 있습니다. + +버섯죽을 담아두는 데 사용합니다. 죽을 먹어도 그릇은 남습니다. + +물이나 용암, 우유를 담아두거나 운반하는 데 쓰입니다. + +물을 저장하고 옮기는 데 사용합니다. + +용암을 저장하고 옮기는 데 사용합니다. + +우유를 저장하고 옮기는 데 사용합니다. + +불꽃을 일으키고, TNT를 폭파하고, 차원문을 여는 데 사용합니다. + +물고기를 잡을 수 있습니다. + +태양과 달의 위치를 표시합니다. + +시작 지점을 표시합니다. + +지도를 들고 있을 동안 탐험한 지역의 이미지를 만들어냅니다. 길을 찾는 데 사용할 수 있습니다. + +사용하면 현재 속한 월드의 지도 일부가 되며, 지역을 탐험하면 나머지 부분이 채워집니다. + +화살과 함께 사용하여 원거리 공격을 합니다. + +활에 장전하여 사용합니다. + +위더에게서 얻을 수 있으며 신호기의 재료로 사용합니다. + +작동하면 화려한 색의 폭발을 일으킵니다. 색상과 효과, 모양과 사라지는 패턴은 폭죽을 만들 때 사용한 폭죽 별에 따라 결정됩니다. + +폭죽의 색상, 효과, 모양을 결정하는 재료입니다. + +레드스톤 회로에 사용하여 신호 강도를 유지, 비교, 낮추거나 특정 블록 상태를 측정합니다. + +움직이는 TNT 블록처럼 작동하는 광물 수레의 한 종류입니다. + +햇빛이 있거나 없음에 따라 레드스톤 신호를 발산하는 블록입니다. + +호퍼와 비슷하게 작동하는 특별한 광물 수레입니다. 트랙에 있는 아이템을 주워 담거나 수레 위에 있는 보관함에서 아이템을 빼냅니다. + +말에 입힐 수 있는 특별한 방어구입니다. 방어력이 5 증가합니다. + +말에 입힐 수 있는 특별한 방어구입니다. 방어력이 7 증가합니다. + +말에 입힐 수 있는 특별한 방어구입니다. 방어력이 11 증가합니다. + +괴물 및 동물을 플레이어나 울타리에 매어둡니다. + +괴물 및 동물 이름 짓기에 사용됩니다. + +{*ICON_SHANK_01*}를 2.5만큼 회복합니다. + +{*ICON_SHANK_01*}를 1만큼 회복합니다. 효과가 6번까지 중복됩니다. + +{*ICON_SHANK_01*}를 1만큼 회복합니다. + +{*ICON_SHANK_01*}를 1만큼 회복합니다. + +{*ICON_SHANK_01*}를 3만큼 회복합니다. + +먹어서 {*ICON_SHANK_01*}를 1만큼 회복하거나 화로에서 조리할 수 있습니다. 먹으면 중독될 수 있습니다. + +{*ICON_SHANK_01*}를 3만큼 회복합니다. 화로에서 닭 날고기를 조리하여 만듭니다. + +먹어서 {*ICON_SHANK_01*}를 1.5만큼 회복하거나 화로에서 조리할 수 있습니다. + +{*ICON_SHANK_01*}를 4만큼 회복합니다. 화로에서 소 날고기를 조리하여 만듭니다. + +먹어서 {*ICON_SHANK_01*}를 1.5만큼 회복하거나 화로에서 조리할 수 있습니다. + +{*ICON_SHANK_01*}를 4만큼 회복합니다. 화로에서 돼지 날고기를 조리하여 만듭니다. + +먹어서 {*ICON_SHANK_01*}를 1만큼 회복하거나 화로에서 조리할 수 있습니다. 오셀롯을 길들이기 위한 먹이로 사용할 수도 있습니다. + +{*ICON_SHANK_01*}를 2.5만큼 회복합니다. 화로에서 날생선을 조리하여 만듭니다. + +{*ICON_SHANK_01*}를 2만큼 회복하며 황금 사과를 만드는 데 사용합니다. + +{*ICON_SHANK_01*}를 2만큼 회복하며 4초 동안 체력이 자동으로 회복됩니다. 사과와 금덩이를 사용해 만들 수 있습니다. + +{*ICON_SHANK_01*}를 2만큼 회복합니다. 먹으면 중독될 수 있습니다. + +케이크를 만들 때 사용하며 물약을 양조할 때 재료로도 쓰입니다. + +켜거나 끌 때 전기를 보냅니다. 다시 조작하기 전까지 켜지거나 꺼진 상태로 있습니다. + +주기적으로 전기를 보내거나, 블록 옆에 연결하면 송/수신기 역할을 합니다. +약한 조명으로 사용할 수도 있습니다. + +레드스톤 회로에서 중계장치, 지연장치 또는 다이오드 역할을 합니다. + +누르면 전기를 보냅니다. 단추를 떼면 1초 정도 작동하다가 닫힙니다. + +레드스톤으로 전기를 공급하면 아이템을 넣어 무작위 순서로 발사할 수 있습니다. + +작동시키면 음을 연주합니다. 때리면 음의 높낮이가 바뀝니다. 다른 블록 위에 올려놓으면 연주 음의 종류가 변경됩니다. + +광물 수레가 가는 길로 사용됩니다. + +동력을 공급하면 그 위를 지나가는 광물 수레의 속도를 올려줍니다. 동력이 끊기면 광물 수레를 멈춰 세웁니다. + +압력 발판처럼 사용되지만 광물 수레로만 작동시킬 수 있습니다. 동력이 공급되면 레드스톤 신호를 보냅니다. + +레일을 따라서 플레이어나 동물, 괴물을 이동시킵니다. + +레일을 따라서 물건을 이동시킵니다. + +석탄을 안에 넣으면 레일을 따라 움직이며 다른 광물 수레를 밀어줍니다. + +헤엄치는 것보다 물에서 빨리 이동할 수 있습니다. + +양에게서 얻어냅니다. 염료로 색을 바꿀 수 있습니다. + +건설 재료로 쓰입니다. 염료로 색을 바꿀 수 있지만, 양털은 양에게서 쉽게 얻을 수 있으므로 권장하지는 않습니다. + +양털을 검은색으로 염색합니다. + +양털을 초록색으로 염색합니다. + +양털을 갈색으로 염색할 때, 코코아 콩을 재배할 때, 쿠키를 만들 때 쓰입니다. + +양털을 은색으로 염색합니다. + +양털을 노란색으로 염색합니다. + +양털을 빨간색으로 염색합니다. + +작물이나 나무, 긴 잡초, 거대 버섯, 꽃을 즉시 성장시킵니다. 염료 재료로도 사용합니다. + +양털을 분홍색으로 염색합니다. + +양털을 주황색으로 염색합니다. + +양털을 라임색으로 염색합니다. + +양털을 회색으로 염색합니다. + +양털을 밝은 회색으로 염색합니다. +(참고: 밝은 회색 염료는 회색 염료와 뼛가루를 섞어도 만들 수 있습니다. 이 방법을 쓰면 먹물 주머니 하나로 회색 염료를 3개가 아니라 4개 만들 수 있습니다.) + +양털을 밝은 파란색으로 염색합니다. + +양털을 청록색으로 염색합니다. + +양털을 보라색으로 염색합니다. + +양털을 자주색으로 염색합니다. + +양털을 파란색으로 염색합니다. + +음악 디스크를 재생합니다. + +매우 강력한 도구나 무기, 방어구를 만드는 데 사용합니다. + +횃불보다 더 밝은 빛을 만들어냅니다. 얼음이나 눈을 녹이며, 물속에서 사용이 가능합니다. + +책과 지도의 재료입니다. + +책장을 만들거나 효과부여 책을 만드는 데 쓰입니다. + +효과부여대 주위에 놓으면 더 강력한 효과를 만들어낼 수 있습니다. + +장식으로 사용됩니다. + +철제 곡괭이 이상으로 채굴하면 얻을 수 있으며, 화로에서 녹여 황금 주괴로 만듭니다. + +돌곡괭이 이상으로 채굴하면 얻을 수 있으며, 화로에서 녹여 철 주괴로 만듭니다. + +곡괭이로 채굴하여 석탄을 얻어냅니다. + +돌곡괭이 이상으로 채굴하면 청금석이 나옵니다. + +철제 곡괭이 이상으로 채굴하면 다이아몬드를 얻습니다. + +철제 곡괭이 이상으로 채굴하면 레드스톤 가루를 얻습니다. + +곡괭이로 채굴하여 조약돌을 얻습니다. + +삽을 이용해서 얻습니다. 건물을 짓는 데 쓰입니다. + +땅에 심을 수 있으며 나무로 자라납니다. + +부술 수 없습니다. + +접촉하는 모든 것에 불을 붙입니다. 양동이에 담을 수 있습니다. + +삽을 이용해서 얻을 수 있으며 화로에서 녹이면 유리가 나옵니다. 아래에 다른 블록이 없으면 중력의 영향을 받습니다. + +삽을 이용해서 얻을 수 있으며, 파낼 때 가끔 부싯돌이 나옵니다. 아래에 다른 블록이 없으면 중력의 영향을 받습니다. + +도끼를 사용해서 벤 다음 판자 제작이나 땔감으로 쓰입니다. + +화로에서 모래를 녹여 만듭니다. 건물을 짓는 데 사용할 수 있지만, 채굴하려고 하면 깨져버립니다. + +곡괭이로 돌을 채굴하면 얻을 수 있습니다. 화로를 만들거나 돌로 된 도구의 재료로 쓰입니다. + +화로에서 찰흙을 구워 만듭니다. + +화로에 넣어 벽돌로 구워냅니다. + +부수면 찰흙 덩이가 나옵니다. 찰흙을 화로에 넣어 구워내면 벽돌이 됩니다. + +눈덩이를 보관하는 좋은 방법입니다. + +삽으로 파서 눈덩이를 만들 수 있습니다. + +부수면 가끔 밀 씨앗이 나옵니다. + +염료의 재료입니다. + +그릇을 사용하여 죽으로 만들 수 있습니다. + +다이아몬드 곡괭이로만 얻을 수 있습니다. 물과 용암을 섞어 만들어내며, 차원문의 재료가 됩니다. + +괴물을 소환합니다. + +땅 위에 놓아 전기를 흐르게 합니다. 물약으로 양조하면 효과의 지속 시간이 늘어납니다. + +다 자란 작물을 수확하면 밀을 얻습니다. + +씨앗을 심을 수 있게 준비된 땅입니다. + +화로를 사용하여 초록 선인장 염료를 만들 수 있습니다. + +설탕을 만드는 데 사용합니다. + +투구처럼 머리에 쓰거나 횃불과 조합하여 호박등으로 만들 수 있습니다. 호박 파이의 주재료이기도 합니다. + +불이 붙으면 영원히 타오릅니다. + +위를 지나가는 것들의 속도를 늦춥니다. + +차원문을 통해서 지상과 지하를 오갈 수 있습니다. + +화로의 연료, 혹은 횃불 제작의 재료로 사용됩니다. + +거미를 잡으면 얻을 수 있습니다. 활과 낚싯대의 재료로 사용하거나 땅에 놓아 트립와이어를 생성할 수 있습니다. + +닭을 잡으면 얻을 수 있습니다. 화살의 재료입니다. + +Creeper를 처치하여 얻습니다. TNT의 재료로 사용하거나 물약을 양조하는 데 재료로 사용합니다. + +농지에 심어 작물로 가꿔냅니다. 씨앗을 기르려면 충분한 빛이 있어야 합니다. + +작물을 수확하여 얻습니다. 식량으로 만들 수 있습니다. + +자갈을 파내서 얻을 수 있습니다. 부싯돌과 부시를 만드는 재료입니다. + +돼지에 사용하면 돼지를 타고 다닐 수 있습니다. 막대에 끼운 당근을 사용해 돼지가 움직이는 방향을 조종할 수 있습니다. + +눈을 파헤쳐서 획득하며, 집어던질 수 있습니다. + +소를 잡으면 얻을 수 있으며 방어구의 재료로 쓰거나 책을 만드는 데 사용합니다. + +슬라임을 처치하여 얻습니다. 물약을 양조할 때 재료로 쓰거나 끈끈이 피스톤의 재료로 쓸 수 있습니다. + +닭이 무작위로 낳습니다. 식량으로 만들 수 있습니다. + +발광석을 채굴해서 얻습니다. 제작을 거쳐 다시 발광석 블록으로 만들거나 물약과 양조해 효과의 효능을 높일 수 있습니다. + +해골을 처치하여 얻습니다. 뼛가루로 만들 수 있습니다. 늑대에게 먹이면 길들일 수 있습니다. + +해골이 Creeper를 처치하도록 유도해서 얻습니다. 주크박스에서 재생이 가능합니다. + +불을 꺼뜨리고 작물의 성장을 돕습니다. 양동이에 담을 수 있습니다. + +부수면 일정 확률로 묘목이 나옵니다. 묘목을 심어 나무로 가꿀 수 있습니다. + +던전에서 찾을 수 있으며 건설과 장식에 사용됩니다. + +양에게서 양털을 얻거나 나뭇잎 블록을 수확하는 데 사용합니다. + +동력을 공급(단추, 레버, 압력판, 레드스톤 횃불을 이용하거나, 그것들을 레드스톤과 함께 사용)하면 피스톤이 늘어나 블록을 밀어냅니다. + +동력을 공급(단추, 레버, 압력판, 레드스톤 횃불을 이용하거나, 그것들을 레드스톤과 함께 사용)하면 피스톤이 늘어나 블록을 밀어냅니다. 피스톤이 줄어들면 다시 블록을 끌어옵니다. + +돌로 된 블록으로 만들며 주로 요새에서 볼 수 있습니다. + +울타리처럼 방어벽으로 사용됩니다. + +문과 비슷하지만 울타리와 함께 사용됩니다. + +수박 조각의 재료입니다. + +유리 대신 사용할 수 있는 투명 판자입니다. + +땅에 심어 호박으로 가꿔냅니다. + +땅에 심어 수박으로 가꿔냅니다. + +Enderman이 죽을 때 떨어뜨립니다. Ender 진주를 던지면 진주가 떨어진 위치로 플레이어가 이동하며 체력을 잃습니다. + +흙 블록 위에 잡초가 자랐습니다. 삽을 이용해서 얻습니다. 건물을 짓는 데 쓰입니다. + +건물을 짓거나 장식으로 사용됩니다. + +통과할 때 움직임이 느려집니다. 가위로 잘라 실을 얻을 수 있습니다. + +파괴될 때 Sliverfish를 소환합니다. 근처에 있는 Sliverfish가 공격을 받아도 Sliverfish를 소환합니다. + +놓은 후 시간이 지나면 자라납니다. 가위를 사용하여 수확할 수 있습니다. 사다리처럼 타고 올라갈 수 있습니다. + +얼음 위를 걸어가면 미끄러집니다. 파괴되었을 때 아래에 다른 블록이 있으면 물로 변합니다. 광원 가까이에 있거나 지하에 있으면 녹습니다. + +장식으로 사용할 수 있습니다. + +물약 양조와 요새 위치 탐색에 사용합니다. 지하 요새 근처나 내부에 주로 서식하는 Blaze가 떨어뜨립니다. + +물약 양조에 사용합니다. Ghast가 죽을 때 떨어뜨립니다. + +좀비 Pigman이 죽을 때 떨어뜨립니다. 좀비 Pigman은 지하에서 찾아볼 수 있습니다. 물약을 양조할 때 재료로 사용됩니다. + +물약 양조에 사용합니다. 이것은 지하 요새에서 자연 상태로 자라는 것을 찾을 수 있습니다. 또한 영혼 모래에 심을 수 있습니다. + +사용하면 재료에 따라 다양한 효과를 얻을 수 있습니다. + +물을 채울 수 있으며 양조대에서 물약을 만드는 기본 재료로 사용할 수 있습니다. + +독이 든 음식이자 양조용 아이템입니다. 플레이어가 거미나 동굴 거미를 죽일 때 떨어뜨립니다. + +물약 양조에 사용합니다. 주로 해로운 효과의 물약을 만드는 데 사용합니다. + +물약 양조에 사용합니다. 다른 아이템과 조합하여 Ender의 눈이나 마그마 크림으로 만들 수 있습니다. + +물약 양조에 사용합니다. + +물약과 폭발 물약을 만드는 데 사용합니다. + +비나 물 양동이를 사용해서 물을 채울 수 있습니다. 그리고 유리병에 물을 채우는 데 사용할 수 있습니다. + +던지면 Ender 관문으로 가는 방향을 표시합니다. 열두 개를 Ender 관문 외형에 올려놓으면 Ender 관문이 열립니다. + +물약 양조에 사용합니다. + +잡초 블록과 비슷하나 버섯을 키우기에 좋습니다. + +물에 뜹니다. 수련잎 위로 걸어 다닐 수도 있습니다. + +지하 요새 건설에 쓰입니다. Ghast의 불덩이에 피해를 받지 않습니다. + +지하 요새에 쓰입니다. + +지하 요새에서 찾을 수 있습니다. 부서지면 지하 사마귀를 떨어뜨립니다. + +플레이어의 경험치를 사용해 검, 곡괭이, 도끼, 삽, 활 및 방어구에 효과를 부여할 수 있습니다. + +Ender의 눈 열두 개를 사용하면 열립니다. 플레이어를 Ender 차원으로 보냅니다. + +Ender 관문을 형성하는 데 쓰입니다. + +Ender에서 찾을 수 있는 블록 유형입니다. 폭발에 견디는 능력이 매우 강해 건물을 짓는 데 적합합니다. + +Ender 드래곤을 처치하면 생성되는 블록입니다. + +이 아이템을 던지면, 플레이어에게 경험치를 주는 경험치 구체를 떨어뜨립니다. + +불을 붙이는 데 유용하며 디스펜서에서 불을 붙이면 무차별 사격을 가합니다. + +진열장과 비슷하며 안에 놓인 블록이나 아이템을 보여줍니다. + +던지면 지정된 생물 유형이 생성될 수 있습니다. + +긴 계단을 만드는 데 쓰입니다. 발판 2개를 쌓으면 보통 크기의 2단 계단 블록이 만들어집니다. + +긴 계단을 만드는 데 쓰입니다. 발판 2개를 쌓으면 보통 크기의 2단 계단 블록이 만들어집니다. + +화로에서 지하 바위를 녹여 만듭니다. 지하 벽돌의 재료입니다. + +동력을 공급하면 빛을 냅니다. + +재배하여 코코아 콩을 얻을 수 있습니다. + +괴물 머리는 장식용으로 놓아둘 수도 있고, 투구 슬롯에 놓아 마스크로 쓸 수도 있습니다. + +명령을 실행하는 데 사용합니다. + +하늘로 광선을 발사하고 주변 플레이어에게 상태 효과를 부여합니다. + +안에 블록과 아이템을 보관합니다. 상자 2개를 나란히 붙이면 용량이 2배인 큰 상자가 만들어집니다. 함정 상자는 열었을 때 레드스톤 전기도 발생시킵니다. + +레드스톤 전기를 발생시킵니다. 아이템이 많이 올려져 있으면 전기가 강해집니다. + +레드스톤 전기를 발생시킵니다. 아이템이 많이 올려져 있으면 전기가 강해집니다. 가벼운 발판보다 무거운 무게를 필요로 합니다. + +레드스톤의 동력원으로 사용됩니다. 다시 레드스톤으로 변환할 수 있습니다. + +아이템을 잡거나 보관함 안으로 또는 밖으로 아이템을 옮기는 데 사용합니다. + +호퍼가 부착된 광물 수레를 사용 가능 또는 불가능하게 하고 TNT가 실린 광물 수레를 작동시킬 수 있는 레일입니다. + +레드스톤 전기를 흘리면 아이템을 잡고 있거나, 떨어트리거나, 다른 보관함으로 아이템을 밀어보냅니다. + +단단한 찰흙으로 만든 색이 화려한 블록입니다. + +말, 당나귀, 노새에게 먹여 체력을 10 회복시킵니다. 망아지가 더 빨리 성장하게 합니다. + +화로에서 찰흙을 제련해서 만듭니다. + +유리와 염료로 만듭니다. + +스테인드글라스로부터 만듭니다. + +석탄을 보관할 수 있는 편리한 방법입니다. 화로에서 연료로 사용할 수 있습니다. + +오징어 + +잡으면 먹물 주머니를 얻을 수 있습니다. + + + +잡으면 가죽을 얻을 수 있습니다. 또한 우유를 짜서 양동이에 담을 수 있습니다. + + + +가위를 사용하면 양털을 얻을 수 있습니다. 이미 털을 깎았다면 양털이 나오지 않습니다. 털을 염색하여 색을 바꿀 수 있습니다. + + + +잡으면 깃털이 나옵니다. 가끔 알을 낳습니다. + +돼지 + +잡으면 돼지고기를 얻을 수 있습니다. 안장을 사용하면 타고 다닐 수 있습니다. + +늑대 + +공격받기 전까지는 위협적이지 않으며, 공격하면 뒤를 습격합니다. 뼈를 이용해서 길들이면 데리고 다닐 수 있으며, 플레이어를 공격하는 대상을 공격합니다. + +Creeper + +가까이 다가가면 폭발합니다! + +해골 + +플레이어에게 화살을 쏩니다. 처치하면 화살을 떨어뜨립니다. + +거미 + +가까이 다가가면 공격합니다. 벽을 타고 오를 수 있으며, 처치하면 실을 떨어뜨립니다. + +좀비 + +가까이 다가가면 공격합니다. + +Pigman 좀비 + +먼저 공격하지 않지만, 공격을 받으면 무리를 지어 달려듭니다. + +Ghast + +닿으면 폭발하는 불덩어리를 던집니다. + +슬라임 + +피해를 입으면 작은 슬라임으로 분리됩니다. + +Enderman + +플레이어가 바라보면 공격합니다. 블록을 들어 옮길 수도 있습니다. + +Sliverfish + +공격하면 근처의 Sliverfish를 끌어들입니다. 돌 블록에 숨어 있습니다. + +동굴 거미 + +독이 있습니다. + +Mooshroom + +그릇과 함께 사용하면 버섯죽을 만들 수 있습니다. 가위를 사용하면 버섯을 떨어뜨리고 보통 소가 됩니다. + +눈 골렘 + +플레이어는 눈 블록과 호박을 사용해 눈 골렘을 만들 수 있습니다. 눈 골렘은 플레이어의 적에게 눈덩이를 던집니다. + +Ender 드래곤 + +Ender에서 찾아볼 수 있는 거대한 검은색 드래곤입니다. + +Blaze + +주로 지하 요새에서 찾아볼 수 있는 적입니다. 죽으면 Blaze 막대를 떨어뜨립니다. + +마그마 큐브 + +지하에서 찾아볼 수 있습니다. 슬라임처럼 죽으면 분열하여 여러 개의 조그만 큐브가 됩니다. + +마을 사람 + +오셀롯 + +정글에서 찾을 수 있으며 날생선을 먹여서 조련이 가능합니다. 이때 갑자기 움직이면 오셀롯이 겁을 먹고 도망치기 때문에, 오셀롯이 다가오게 만들어야 합니다. + +철 골렘 + +마을을 보호하기 위해 나타납니다. 철 블록과 호박으로 만들 수 있습니다. + +박쥐 + +이 날아다니는 동물은 동굴이나 그 외의 넓고 폐쇄된 공간에서 발견됩니다. + +마녀 + +늪에서 만날 수 있는 이 적은 물약을 던지며 공격합니다. 처치하면 물약을 떨어트립니다. + + + +이 동물은 길들여서 타고 다닐 수 있습니다. + +당나귀 + +이 동물은 길들여서 타고 다닐 수 있으며, 상자를 달아줄 수 있습니다. + +노새 + +말과 당나귀를 교배시켜 낳습니다. 이 동물은 길들여서 타고 다닐 수 있으며 상자를 달아줄 수 있습니다. + +좀비 말 + +해골 말 + +위더 + +위더의 해골과 영혼 모래로 만듭니다. 플레이어를 향해 폭발하는 해골을 발사합니다. + +Explosives Animator + +Concept Artist + +Number Crunching and Statistics + +Bully Coordinator + +Original Design and Code by + +Project Manager/Producer + +Rest of Mojang Office + +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*} 생성 + +지하 벽돌 + +두개골 + +해골 두개골 + +말라비틀어진 해골 두개골 + +좀비 머리 + +머리 + +%s의 머리 + +Creeper 머리 + +지옥의 별 + +폭죽 로켓 + +폭죽 별 + +레드스톤 비교 회로 + +TNT가 실린 광물 수레 + +호퍼가 부착된 광물 수레 + +철제 말 방어구 + +황금 말 방어구 + +다이아몬드 말 방어구 + + + +이름 태그 + + + +잡초 블록 + + + +조약돌 + +참나무 목재 판자 + +전나무 목재 판자 + +자작나무 목재 판자 + +정글 나무 판자 + +나무 판자(종류 무관) + +묘목 + +참나무 묘목 + +전나무 묘목 + +자작나무 묘목 + +정글 묘목 + +기반암 + + + +용암 + +모래 + +사암 + +자갈 + +황금 광석 + +철광석 + +석탄 광석 + +나무 + +참나무 목재 + +전나무 목재 + +자작나무 목재 + +정글 나무 + +참나무 + +전나무 + +자작나무 + +나뭇잎 + +참나무 나뭇잎 + +전나무 나뭇잎 + +자작나무 나뭇잎 + +정글 잎사귀 + +스펀지 + +유리 + +양털 + +검은색 양털 + +빨간색 양털 + +초록색 양털 + +갈색 양털 + +파란색 양털 + +보라색 양털 + +청록색 양털 + +밝은 회색 양털 + +회색 양털 + +분홍색 양털 + +라임색 양털 + +노란색 양털 + +밝은 파란색 양털 + +자주색 양털 + +주황색 양털 + +흰색 양털 + + + +장미 + +버섯 + +황금 블록 + +금을 편리하게 보관할 수 있습니다. + +철을 편리하게 보관할 수 있습니다. + +철 블록 + +돌 발판 + +돌 발판 + +사암 발판 + +참나무 발판 + +조약돌 발판 + +벽돌 발판 + +돌 벽돌 발판 + +참나무 발판 + +전나무 발판 + +자작나무 발판 + +정글 나무 발판 + +지하 벽돌 발판 + +벽돌 + +TNT + +책장 + +이끼 낀 돌 + +흑요석 + +횃불 + +횃불(석탄) + +횃불(숯) + + + +괴물 출입문 + +참나무 계단 + +상자 + +레드스톤 가루 + +다이아몬드 광석 + +다이아몬드 블록 + +다이아몬드를 편리하게 보관할 수 있습니다. + +작업대 + +작물 + +농지 + +화로 + +표지판 + +나무문 + +사다리 + +레일 + +동력 레일 + +탐지 레일 + +돌 계단 + +손잡이 + +압력판 + +철문 + +레드스톤 광석 + +레드스톤 횃불 + +단추 + + + +얼음 + +선인장 + +찰흙 + +사탕수수 + +주크박스 + +울타리 + +호박 + +호박등 + +지하 바위 + +영혼 모래 + +발광석 + +차원문 + +청금석 광석 + +청금석 블록 + +청금석을 편리하게 보관할 수 있습니다. + +디스펜서 + +소리 블록 + +케이크 + +침대 + +거미줄 + +긴 잡초 + +마른 덤불 + +다이오드 + +잠긴 상자 + +들창 + +양털(모든 색상) + +피스톤 + +끈끈이 피스톤 + +Sliverfish 블록 + +돌 벽돌 + +이끼 낀 돌 벽돌 + +금이 간 돌 벽돌 + +깎아놓은 돌 벽돌 + +버섯 + +버섯 + +철 막대 + +유리 판자 + +수박 + +호박 줄기 + +수박 줄기 + +덩굴 + +울타리 문 + +벽돌 계단 + +돌 벽돌 계단 + +Sliverfish 돌 + +Sliverfish 조약돌 + +Sliverfish 돌 벽돌 + +균사체 + +수련잎 + +지하 벽돌 + +지하 벽돌 울타리 + +지하 벽돌 계단 + +지하 사마귀 + +효과부여대 + +양조대 + +가마솥 + +Ender 차원문 + +Ender 차원문 외형 + +Ender 돌 + +용의 알 + +관목 + +양치식물 + +사암 계단 + +전나무 계단 + +자작나무 계단 + +정글 나무 계단 + +레드스톤 램프 + +코코아 + +두개골 + +명령 블록 + +신호기 + +함정 상자 + +가벼운 압력판 + +무거운 압력판 + +레드스톤 비교 회로 + +일광 센서 + +레드스톤 블록 + +호퍼 + +작동기 레일 + +드로퍼 + +색상 찰흙 + +건초 더미 + +단단한 찰흙 + +석탄 블록 + +검은색 찰흙 + +빨간색 찰흙 + +녹색 찰흙 + +갈색 찰흙 + +파란색 찰흙 + +자주색 찰흙 + +청록색 찰흙 + +밝은 회색 찰흙 + +회색 찰흙 + +분홍색 찰흙 + +라임색 찰흙 + +노란색 찰흙 + +밝은 파란색 찰흙 + +자홍색 찰흙 + +주황색 찰흙 + +흰색 찰흙 + +스테인드글라스 + +검은색 스테인드글라스 + +빨간색 스테인드글라스 + +녹색 스테인드글라스 + +갈색 스테인드글라스 + +파란색 스테인드글라스 + +자주색 스테인드글라스 + +청록색 스테인드글라스 + +밝은 회색 스테인드글라스 + +회색 스테인드글라스 + +분홍색 스테인드글라스 + +라임색 스테인드글라스 + +노란색 스테인드글라스 + +밝은 파란색 스테인드글라스 + +자홍색 스테인드글라스 + +주황색 스테인드글라스 + +흰색 스테인드글라스 + +스테인드글라스 판유리 + +검은색 스테인드글라스 판유리 + +빨간색 스테인드글라스 판유리 + +녹색 스테인드글라스 판유리 + +갈색 스테인드글라스 판유리 + +파란색 스테인드글라스 판유리 + +자주색 스테인드글라스 판유리 + +청록색 스테인드글라스 판유리 + +밝은 회색 스테인드글라스 판유리 + +회색 스테인드글라스 판유리 + +분홍색 스테인드글라스 판유리 + +라임색 스테인드글라스 판유리 + +노란색 스테인드글라스 판유리 + +밝은 파란색 스테인드글라스 판유리 + +자홍색 스테인드글라스 판유리 + +주황색 스테인드글라스 판유리 + +흰색 스테인드글라스 판유리 + +작은 공 + +큰 공 + +별 모양 + +Creeper 모양 + +폭발 + +알 수 없는 모양 + +검은색 + +빨간색 + +녹색 + +갈색 + +파란색 + +자주색 + +청록색 + +밝은 회색 + +회색 + +분홍색 + +라임색 + +노란색 + +밝은 파란색 + +자홍색 + +주황색 + +흰색 + +사용자 지정 + +사라지는 패턴: + +반짝임 + +궤적 + +효과 시간: +  +현재 컨트롤 + +배치 + +이동/질주 + +보기 + +일시 중지 + +점프 + +점프/위로 비행 + +소지품 + +아이템 교체 + +행동 + +사용 + +제작 + +버리기 + +조용히 걷기 + +조용히 걷기/아래로 비행 + +카메라 모드 변경 + +플레이어/초대 + +이동(비행 시) + +배치 1 + +배치 2 + +배치 3 + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +{*B*}{*CONTROLLER_VK_A*} 단추를 누르면 계속합니다. + +{*B*}{*CONTROLLER_VK_A*} 단추를 누르면 튜토리얼을 시작합니다.{*B*} + 게임을 시작할 준비가 되었으면 {*CONTROLLER_VK_B*} 단추를 누르십시오. + +Minecraft는 블록을 배치하여 무엇이든 상상한 대로 만들 수 있는 게임입니다. +밤에는 괴물이 출몰하므로, 그에 대비하여 피신처를 준비해둬야 합니다. + +{*CONTROLLER_ACTION_LOOK*}으로 위와 아래, 주변을 둘러봅니다. + +{*CONTROLLER_ACTION_MOVE*}으로 이동합니다. + +질주하려면 {*CONTROLLER_ACTION_MOVE*}를 앞으로 빨리 두 번 누르십시오. {*CONTROLLER_ACTION_MOVE*} 를 계속 누르고 있으면 캐릭터의 질주 시간이나 음식이 다 떨어질 때까지 계속 질주합니다. + +{*CONTROLLER_ACTION_JUMP*}를 눌러 점프합니다. + +{*CONTROLLER_ACTION_ACTION*}를 누르고 있으면 손이나 도구를 사용해 땅을 파거나 나무를 벱니다. 특정 블록은 도구를 만들어야 파낼 수 있습니다. + +{*CONTROLLER_ACTION_ACTION*}를 길게 눌러서 나무 블록 4개(나무둥치)를 베어보십시오. {*B*}블록이 파괴되고 공중에 뜬 형태로 아이템이 나타나면, 다가가서 집을 수 있습니다. 집은 아이템은 소지품에 표시됩니다. + +{*CONTROLLER_ACTION_CRAFTING*}를 눌러 제작 인터페이스를 엽니다. + +아이템을 수집하고 제작하면 소지품이 찹니다.{*B*} + 소지품을 열려면 {*CONTROLLER_ACTION_INVENTORY*}를 누르십시오. + +이동, 채광 및 공격을 하면 음식 막대 {*ICON_SHANK_01*}를 소비합니다. 질주하거나 질주 점프를 하면 일반적으로 걷거나 달리는 것보다 더 많이 음식 막대를 소비합니다. + +음식 막대가 9칸 이상{*ICON_SHANK_01*}일 때는 체력을 잃어도 자동으로 다시 회복됩니다. 음식을 먹으면 음식 막대가 다시 차오릅니다. + +손에 음식 아이템을 들고 있을 때 {*CONTROLLER_ACTION_USE*}을 길게 누르면 음식을 먹어서 음식 막대를 채웁니다. 음식 막대가 가득 찬 상태에서는 음식을 먹을 수 없습니다. + +음식 막대가 낮고 체력을 잃은 상태입니다. 소지품에 있는 스테이크를 먹으면 음식 막대가 차오르고 체력이 회복되기 시작합니다.{*ICON*}364{*/ICON*} + +게임에서 획득한 나무는 판자로 만들 수 있습니다. 판자를 만들려면 제작 인터페이스를 여십시오.{*PlanksIcon*} + +많은 아이템들은 여러 단계를 거쳐 제작됩니다. 이제 판자를 가지고 있으므로 더 다양한 아이템을 만들 수 있습니다. 작업대를 만들어 보십시오.{*CraftingTableIcon*} + +블록에서 아이템을 더 빨리 얻으려면 해당 작업에 맞는 도구를 만들어야 합니다. 일부 도구는 막대로 된 손잡이가 달려 있습니다. 막대를 몇 개 만들어 보십시오.{*SticksIcon*} + +{*CONTROLLER_ACTION_LEFT_SCROLL*} 과{*CONTROLLER_ACTION_RIGHT_SCROLL*}로 손에 들고 있는 아이템을 다른 아이템으로 바꿀 수 있습니다. + +아이템을 사용하거나, 조작하거나, 내려놓으려면 {*CONTROLLER_ACTION_USE*}를 누르십시오. 내려놓은 아이템에 올바른 도구를 사용하여 채굴 동작을 취하면 아이템을 다시 집을 수 있습니다. + +작업대를 선택했으면 포인터를 원하는 곳에 둔 다음 {*CONTROLLER_ACTION_USE*}를 눌러 작업대를 놓으십시오. + +포인터를 작업대에 맞추고 {*CONTROLLER_ACTION_USE*}를 눌러 여십시오. + +삽을 사용하면 흙이나 눈처럼 부드러운 블록을 더 빨리 파냅니다. 재료를 많이 모을수록 작업 속도와 내구력이 더 뛰어난 도구를 만들 수 있습니다. 나무 삽을 만드십시오.{*WoodenShovelIcon*} + +도끼를 사용하면 나무와 나무 블록을 더 빨리 벱니다. 재료를 많이 모을수록 작업 속도와 내구력이 더 뛰어난 도구를 만들 수 있습니다. 나무 도끼를 만드십시오.{*WoodenHatchetIcon*} + +곡괭이는 돌이나 광물처럼 단단한 블록을 더 빨리 파게 해줍니다. 재료를 많이 모을수록 작업 속도와 내구력이 더 뛰어난 도구를 만들 수 있으며, 더 단단한 재료도 파낼 수 있습니다. 나무 곡괭이를 만드십시오.{*WoodenPickaxeIcon*} + +보관함 열기 + + + 밤은 순식간에 찾아오며, 준비하지 않은 상태로 밖에 나가면 위험합니다. 방어구와 무기를 만들어 사용할 수 있지만, 안전한 피신처를 찾는 것이 더 좋습니다. + + + + 근처에 버려진 광부의 피신처가 있습니다. 이곳이라면 밤을 안전하게 보낼 수 있습니다. + + + + 피신처를 세울 자원을 모아야 합니다. 벽과 지붕은 아무 블록이나 사용해도 되지만 문과 창문, 조명을 설치하려면 특정 재료가 필요합니다. + + +곡괭이를 사용해서 돌 블록을 채굴하십시오. 돌 블록을 채굴하면 조약돌이 나옵니다. 조약돌 8개를 모으면 화로를 만들 수 있습니다. 돌 블록에 도달하려면 흙을 파야 할 수도 있으며, 이 때는 삽을 사용하십시오.{*StoneIcon*} + +화로를 만들 수 있을 만큼 조약돌을 모았습니다. 작업대에서 화로를 만드십시오. + +{*CONTROLLER_ACTION_USE*}를 눌러 화로를 설치한 다음 화로를 여십시오. + +화로를 사용해서 숯을 만드십시오. 숯이 만들어지는 시간 동안, 피신처를 만들 재료를 더 구해보면 어떨까요? + +화로를 사용해서 유리를 만드십시오. 유리가 만들어지는 시간 동안, 피신처를 만들 재료를 더 구해보면 어떨까요? + +좋은 피신처를 만들려면, 출입할 때마다 벽을 허물고 다시 쌓을 필요가 없도록 문을 달아야 합니다. 나무문을 만들어 보십시오.{*WoodenDoorIcon*} + +{*CONTROLLER_ACTION_USE*}를 눌러 문을 설치하십시오. {*CONTROLLER_ACTION_USE*}로 나무문을 열거나 닫아 월드로 출입할 수 있습니다. + +밤에는 매우 어두워지므로, 피신처 안에서 잘 볼 수 있도록 조명이 있어야 합니다. 제작 인터페이스에서 막대와 숯을 이용해 횃불을 만드십시오.{*TorchIcon*} + + + 튜토리얼 1장을 마쳤습니다. + + + + {*B*} + 튜토리얼을 계속 진행하려면 {*CONTROLLER_VK_A*} 단추를 누르십시오.{*B*} + 게임을 시작할 준비가 됐다면 {*CONTROLLER_VK_B*} 단추를 누르십시오. + + + + 이곳은 소지품입니다. 이 화면에는 손에 들고 쓸 수 있는 아이템과 가지고 다닐 수 있는 아이템이 모두 표시됩니다. 방어력 또한 이 화면에서 확인할 수 있습니다. + +{*B*} + 계속하려면 {*CONTROLLER_VK_A*} 단추를 누르십시오.{*B*} + 소지품 사용법을 이미 알고 있다면 {*CONTROLLER_VK_B*} 단추를 누르십시오. + + + + {*CONTROLLER_MENU_NAVIGATE*}로 포인터를 움직일 수 있습니다. {*CONTROLLER_VK_A*} 단추를 누르면 포인터로 가리킨 아이템을 집습니다. +수량이 2개 이상일 때는 아이템을 전부 집으며, {*CONTROLLER_VK_X*} 단추를 누르면 반만 집을 수 있습니다. + + + + 포인터를 사용해서 아이템을 소지품의 다른 공간으로 옮긴 다음 {*CONTROLLER_VK_A*} 단추를 누르면 해당 위치에 놓습니다. + 포인터로 집은 아이템이 여러 개일 때 {*CONTROLLER_VK_A*} 단추를 누르면 모두 내려놓고 {*CONTROLLER_VK_X*} 단추를 누르면 하나만 놓습니다. + + + + 아이템이 걸린 포인터를 인터페이스 밖으로 옮기면 아이템을 버릴 수 있습니다. + + + + 아이템 정보를 더 보려면 포인터로 아이템을 가리킨 다음 {*CONTROLLER_ACTION_MENU_PAGEDOWN*}을 누르십시오. + + + + 소지품을 닫으려면 {*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_ACTION_MENU_PAGEDOWN*}을 누르십시오. + + + + 창작 모드 소지품을 닫으려면 {*CONTROLLER_VK_B*} 단추를 누르십시오. + + + + 이것은 제작 인터페이스입니다. 여기서 아이템을 조합하여 새 아이템을 만들 수 있습니다. + + +{*B*} + 계속하려면 {*CONTROLLER_VK_A*} 단추를 누르십시오.{*B*} + 제작 방법을 이미 알고 있다면 {*CONTROLLER_VK_B*} 단추를 누르십시오. + + +{*B*} + 아이템 설명을 보려면 {*CONTROLLER_VK_X*} 단추를 누르십시오. + + +{*B*} + 현재 아이템을 만드는 데 필요한 재료를 보려면 {*CONTROLLER_VK_X*} 단추를 누르십시오. + + +{*B*} + {*CONTROLLER_VK_X*} 단추를 눌러 소지품을 다시 여십시오. + + + + 화면 위쪽의 그룹 유형 탭에서 {*CONTROLLER_VK_LB*}과 {*CONTROLLER_VK_RB*}을 사용하여 제작할 아이템 종류를 선택한 다음, {*CONTROLLER_MENU_NAVIGATE*}로 제작할 아이템을 선택하십시오. + + + + 작업 구역에는 새 아이템을 만드는 데 필요한 재료가 표시됩니다. {*CONTROLLER_VK_A*} 단추를 눌러 아이템을 만든 다음 소지품에 넣으십시오. + + + + 작업대를 사용하면 제작할 아이템을 더 다양하게 선택할 수 있습니다. 작업대에서도 제작 방법은 기본 제작과 같지만 작업 구역이 넓어지므로, 재료를 더 다양하게 조합할 수 있습니다. + + + + 제작 인터페이스 오른쪽 아래에는 소지품이 표시됩니다. 여기에는 현재 선택한 아이템의 설명과, 해당 아이템을 만드는 데 필요한 재료가 표시됩니다. + + + + 현재 선택한 아이템의 설명이 표시되었습니다. 설명을 보면 아이템을 어디에 사용하는지 알 수 있습니다. + + + + 선택한 아이템을 만드는 데 필요한 재료 목록이 표시되었습니다. + + +모아둔 나무를 이용해서 판자를 만들 수 있습니다. 판자 아이콘을 선택한 다음 {*CONTROLLER_VK_A*} 단추를 눌러 판자를 만드십시오.{*PlanksIcon*} + + + 작업대가 완성됐습니다. 작업대를 월드에 설치해야 더 다양한 아이템을 만들 수 있습니다.{*B*} + {*CONTROLLER_VK_B*} 단추를 눌러 작업 인터페이스를 닫으십시오. + + + + {*CONTROLLER_VK_LB*}와 {*CONTROLLER_VK_RB*}로 제작할 아이템 그룹 유형을 변경할 수 있습니다. 도구 그룹을 선택하십시오.{*ToolsIcon*} + + + + {*CONTROLLER_VK_LB*}와 {*CONTROLLER_VK_RB*}로 제작할 아이템 그룹 유형을 변경할 수 있습니다. 구조물 그룹을 선택하십시오.{*StructuresIcon*} + + + + {*CONTROLLER_MENU_NAVIGATE*}로 제작할 아이템을 바꿀 수 있습니다. 일부 아이템은 제작 재료에 따라 완성품이 달라집니다. 나무 삽을 선택하십시오.{*WoodenShovelIcon*} + + + + 많은 아이템들은 여러 단계를 거쳐 제작됩니다. 이제 판자를 가지고 있으므로 더 다양한 아이템을 만들 수 있습니다. {*CONTROLLER_MENU_NAVIGATE*}를 사용하면 제작할 아이템을 바꿀 수 있습니다. 작업대를 선택하십시오.{*CraftingTableIcon*} + + + + 지금까지 만든 도구가 있으면 순조로운 출발을 할 수 있으며, 여러 자원을 더 효과적으로 확보하게 됩니다.{*B*} + {*CONTROLLER_VK_B*} 단추를 눌러 제작 인터페이스를 닫으십시오. + + + + 일부 아이템은 작업대가 아니라 화로에서 만들어야 합니다. 이제 화로를 만들어 보십시오.{*FurnaceIcon*} + + + + 완성한 화로를 설치하십시오. 피신처 안에 설치하는 것이 좋습니다.{*B*} + {*CONTROLLER_VK_B*} 단추를 눌러 제작 인터페이스를 닫으십시오. + + + + 이 화면은 화로 인터페이스입니다. 화로에서는 아이템에 열을 가하여 다른 아이템으로 바꿀 수 있습니다. 예를 들어, 화로에서 철광석을 가열하면 철 주괴가 만들어집니다. + + +{*B*} + 계속하려면 {*CONTROLLER_VK_A*} 단추를 누르십시오.{*B*} + 화로 사용법을 이미 알고 있다면 {*CONTROLLER_VK_B*} 단추를 누르십시오. + + + + 화로 아래쪽에는 연료나 땔감을 넣고 위쪽에는 변경할 아이템을 넣어야 합니다. 그러면 화로에 불이 켜지고 작업이 시작되며, 결과물은 오른쪽 슬롯에 들어옵니다. + + + + 나무로 된 아이템은 종종 땔감으로 쓸 수 있지만, 타는 시간은 아이템마다 다릅니다. 또한 주변에서도 연료로 사용할 아이템들을 찾을 수 있습니다. + + + + 아이템 가열이 끝나면 결과물 슬롯에서 소지품으로 옮길 수 있습니다. 다양한 재료를 실험해서 어떤 아이템이 만들어지는지 파악하십시오. + + + + 나무를 재료로 사용하면 숯이 만들어집니다. 화로에 연료를 넣은 다음 재료 슬롯에 나무를 넣으십시오. 화로에서 숯이 완성될 때까지는 다소 시간이 필요하므로, 자유롭게 다른 일을 하다가 나중에 돌아와서 진행 상태를 확인하십시오. + + + + 숯은 막대와 결합하여 횃불을 만들 수 있으며, 숯 자체로도 연료로 사용됩니다. + + + + 재료 슬롯에 모래를 넣으면 유리가 만들어집니다. 피신처에 창문을 달려면 유리를 만드십시오. + + + + 이것은 양조 인터페이스입니다. 여기서 다양한 효과를 지닌 물약을 만들 수 있습니다. + + +{*B*} + 계속하려면 {*CONTROLLER_VK_A*} 단추를 누르십시오.{*B*} + 양조대 사용법을 이미 알고 있다면 {*CONTROLLER_VK_B*} 단추를 누르십시오. + + + + 위 슬롯에 재료를 넣고 아래 슬롯에 물병을 넣어 물약을 양조합니다. 한 번에 3병을 동시에 양조할 수 있습니다. 조합 조건이 갖추어지면 양조가 시작되고 잠시 후 물약이 완성됩니다. + + + + 물약을 만들기 위해서는 우선 물병이 있어야 만들 수 있습니다. 그 후 지하 사마귀를 추가해 '이상한 물약'을 만든 다음, 하나 이상의 다른 재료를 넣는 방식으로 물약 대부분을 만들 수 있습니다. + + + + 물약을 만든 다음에도 물약의 효과를 바꿀 수 있습니다. 레드스톤 가루를 넣으면 효과 지속 시간이 길어지고, 발광석 가루를 넣으면 효과가 더욱 강해집니다. + + + + 발효 거미 눈을 넣으면 물약이 부패하여 반대 효과를 지니게 됩니다. 화약을 넣으면 던져서 주변에 효과를 적용할 수 있는 폭발 물약이 됩니다. + + + + 물병에 지하 사마귀를 넣고 그다음 마그마 크림을 넣어 '물약 - 화염 저항'을 만드십시오. + + + + {*CONTROLLER_VK_B*} 단추를 누르면 양조 인터페이스에서 나갑니다. + + + + 이곳에는 양조대와 가마솥, 그리고 양조용 아이템이 들어 있는 상자가 있습니다. + + +{*B*} + 양조와 물약에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 단추를 누르십시오.{*B*} + 양조와 물약에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 단추를 누르십시오. + + + + 물약 양조의 첫 번째 단계는 물병을 만드는 것입니다. 상자에서 유리병을 꺼내십시오. + + + + 가마솥에 들어 있는 물이나 물 블록을 사용해 유리병에 물을 채우십시오. 수원을 가리킨 상태에서 {*CONTROLLER_ACTION_USE*}를 누르면 물을 채웁니다. + + + + 가마솥의 물이 떨어지면 물 양동이로 다시 채울 수 있습니다. + + + + 양조대를 사용하여 '물약 - 화염 저항'을 만드십시오. 물병, 지하 사마귀와 마그마 크림이 필요합니다. + + + + 물약을 손에 든 상태에서 {*CONTROLLER_ACTION_USE*}를 길게 누르면 물약을 사용합니다. 일반 물약을 사용하면 물약을 마시게 되며 효과가 자신에게 나타납니다. 폭발 물약을 사용하면 물약을 던지게 되며 효과가 물약이 떨어진 곳 근처의 생물에게 나타납니다. + 일반 물약에 화약을 넣으면 폭발 물약을 만들 수 있습니다. + + + + '물약 - 화염 저항'을 자신에게 사용하십시오. + + + + 이제 화염과 용암에 대한 저항력이 생겼습니다. 지금까지 통과할 수 없었던 장소도 통과할 수 있습니다. + + + + 이것은 효과부여 인터페이스입니다. 무기, 방어구 및 일부 도구에 효과를 부여할 수 있습니다. + + +{*B*} + 효과부여 인터페이스에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 단추를 누르십시오.{*B*} + 효과부여 인터페이스에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 단추를 누르십시오. + + + + 아이템에 효과를 부여하려면 우선 아이템을 효과부여 슬롯에 넣으십시오. 무기, 방어구 및 일부 도구에 효과를 부여하면 특별한 효과를 얻을 수 있습니다. 예를 들어 방어력이 더 강해지거나, 블록을 채굴할 때 더 많은 아이템을 얻을 수 있게 됩니다. + + + + 효과부여 슬롯에 아이템을 넣으면 오른쪽 단추에 무작위로 부여할 효과가 표시됩니다. + + + + 단추에 쓰인 숫자는 아이템에 해당 효과를 부여할 때 필요한 경험치입니다. 경험치가 부족할 때는 단추를 선택할 수 없습니다. + + + + 부여할 효과를 선택하고 {*CONTROLLER_VK_A*}를 누르면 아이템에 효과를 부여합니다. 부여할 효과 비용만큼 경험치가 줄어듭니다. + + + + 효과는 무작위로 부여되지만, 성능이 더 좋은 효과 몇 종류는 더 많은 경험치를 지불하는 것은 물론 효과부여대 주위를 책장으로 둘러싸 강화해야 얻을 수 있습니다. + + + + 여기에는 효과부여대와 효과부여에 사용할 수 있는 아이템이 있습니다. + + + {*B*} + 효과부여에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 단추를 누르십시오.{*B*} + 효과부여에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 단추를 누르십시오. + + + + 효과부여대를 사용하면 무기, 방어구 및 일부 도구에 특별한 효과를 부여할 수 있습니다. 예를 들어 블록을 채굴할 때 더 많은 아이템을 얻을 수 있는 효과나 방어력이 더 강해지는 효과 등이 있습니다. + + + + 효과부여대 주변에 책장을 놓으면 효과부여대가 강화되어 더 높은 수준의 효과를 부여할 수 있습니다. + + + + 아이템에 효과를 부여하려면 경험치가 필요합니다. 괴물 및 동물을 처치하면 나오는 경험치 구체를 모으거나, 광석을 채굴하거나, 동물을 교배하거나, 낚시를 하거나, 화로에서 특정 아이템을 녹이거나 요리하면 경험치를 얻을 수 있습니다. + + + + 경험치 병을 사용해서도 경험치를 얻을 수 있습니다. 경험치 병을 던지면 병이 떨어진 곳에 경험치 구체가 나타납니다. + + + + 이곳에 있는 상자에는 효과가 부여된 아이템과 경험치 병, 그리고 효과부여대를 시험해 볼 수 있는 아이템이 들어 있습니다. + + + + 광물 수레에 탑승했습니다. 수레에서 나가려면 포인터를 수레에 맞춘 다음 {*CONTROLLER_ACTION_USE*}를 누르십시오.{*MinecartIcon*} + + +{*B*} + 광물 수레에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 단추를 누르십시오.{*B*} + 광물 수레에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 단추를 누르십시오. + + + + 광물 수레는 레일을 따라 이동합니다. 화로를 동력으로 사용하여 움직이는 광물 수레나 상자가 담긴 광물 수레를 만들 수도 있습니다. + {*RailIcon*} + + + + 레드스톤 횃불과 회로로 동력을 공급받아 광물 수레의 속도를 높여주는 동력 레일도 만들 수 있습니다. 스위치와 레버, 압력판으로 이러한 장치를 연결해 장치를 만드십시오. + {*PoweredRailIcon*} + + + + 배를 타고 이동 중입니다. 배에서 내리려면 포인터를 배에 맞추고 {*CONTROLLER_ACTION_USE*}를 누르십시오.{*BoatIcon*} + + + + {*B*} + 배에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 단추를 누르십시오.{*B*} + 배에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 단추를 누르십시오. + + + + 배를 이용하면 물에서 더 빨리 이동할 수 있습니다. {*CONTROLLER_ACTION_MOVE*}과 {*CONTROLLER_ACTION_LOOK*}으로 방향을 조정하십시오. + {*BoatIcon*} + + + + 낚싯대를 사용하고 있습니다. 사용하려면 {*CONTROLLER_ACTION_USE*}를 누르십시오.{*FishingRodIcon*} + + + + {*B*} + 낚시에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 단추를 누르십시오.{*B*} + 낚시에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 단추를 누르십시오. + + + + {*CONTROLLER_ACTION_USE*}를 누르면 찌를 던지고 낚시를 시작합니다. {*CONTROLLER_ACTION_USE*}를 한 번 더 누르면 낚싯줄을 감습니다. + {*FishingRodIcon*} + + + + 물고기를 낚으려면 물에 던져놓은 찌가 수면 아래로 가라앉기를 기다려서 줄을 감아올립니다. 물고기는 날것으로 먹거나 화로에서 요리해 먹을 수 있으며, 먹으면 체력이 회복됩니다. + {*FishIcon*} + + + + 다른 도구들과 마찬가지로, 낚싯대도 정해진 횟수만큼만 사용할 수 있습니다. 하지만 물고기 이외의 물건을 낚아도 사용 횟수는 줄어듭니다. 낚싯대를 사용해서 어떤 물건을 낚을 수 있는지, 또는 어떤 일이 일어나는지 확인해 보십시오. + {*FishingRodIcon*} + + + + 이것은 침대입니다. 밤에 침대를 가리킨 상태에서 {*CONTROLLER_ACTION_USE*}를 누르면 침대에서 잠을 자고 아침에 일어납니다.{*ICON*}355{*/ICON*} + + + + {*B*} + 침대에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 단추를 누르십시오.{*B*} + 침대에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 단추를 누르십시오. + + + + 자는 도중에 괴물의 습격을 받지 않으려면 침대를 안전하고 조명이 충분한 곳에 두어야 합니다. 침대를 한 번 사용하면 게임 중에 사망했을 때 침대에서 부활합니다. + {*ICON*}355{*/ICON*} + + + + 게임 내에 다른 플레이어가 있을 때는 모든 플레이어가 동시에 침대에 들어야 잠을 잘 수 있습니다. + {*ICON*}355{*/ICON*} + + + + 이곳에는 레드스톤과 피스톤으로 이루어진 간단한 회로가 있고, 회로를 연장할 수 있는 아이템이 든 상자가 있습니다. + + + + {*B*} + 레드스톤 회로와 피스톤에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 단추를 누르십시오.{*B*} + 레드스톤 회로와 피스톤에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 단추를 누르십시오. + + + + 레버, 단추, 압력판, 레드스톤 횃불로 회로에 동력을 공급할 수 있습니다. 작동할 아이템에 직접 붙이거나 레드스톤 가루로 연결하십시오. + + + + 동력원을 설치한 위치와 방향에 따라 주변 블록에 주는 영향이 달라집니다. 예를 들면 블록 옆에 설치한 레드스톤 횃불은 해당 블록이 다른 동력원에서 동력을 공급받는다면 꺼질 수 있습니다. + + + + 철제, 다이아몬드, 황금 곡괭이로 레드스톤을 채굴하면 레드스톤 가루를 얻을 수 있습니다. 레드스톤 가루를 사용하면 옆으로 15 블록, 아래위로 1블록까지 동력을 운반할 수 있습니다. + {*ICON*}331{*/ICON*} + + + + 레드스톤 탐지기는 동력 운반 거리를 늘리거나 회로에 지연 기능을 부여할 수 있습니다. + {*ICON*}356{*/ICON*} + + + + 동력이 공급되면 피스톤이 늘어나 최대 12블록까지 밀어냅니다. 끈끈이 피스톤은 줄어들 때 거의 모든 종류의 블록 1개를 다시 끌어옵니다. + {*ICON*}33{*/ICON*} + + + + 이곳의 상자에는 피스톤으로 회로를 만들 수 있는 부품이 들어 있습니다. 이곳에 있는 회로를 완성하거나 자신만의 회로를 만드십시오. 튜토리얼 지역 밖에는 더 많은 예시가 있습니다. + + + + 이곳에는 지하로 통하는 차원문이 있습니다! + + + + {*B*} + 지하 차원문에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 단추를 누르십시오.{*B*} + 지하 차원문에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 단추를 누르십시오. + + + + 차원문은 흑요석 블록을 4블록 길이에 5블록 높이로 쌓아서 만듭니다. 모서리 블록은 없어도 됩니다. + + + + 지하 차원문을 작동하려면 부싯돌과 부시를 사용하여 흑요석 블록 안쪽 공간에 불을 붙여야 합니다. 차원문 틀이 무너지거나, 근처에서 폭발이 일어나거나, 차원문 안에 물이 들어가면 차원문 작동이 멈출 수 있습니다. + + + + 지하 차원문을 사용하려면 안으로 들어가십시오. 화면이 보라색으로 변하며 소리가 날 것입니다. 잠시 후 다른 차원으로 이동하게 됩니다. + + + + 용암으로 가득찬 지하 세계는 위험한 곳입니다. 하지만 불을 붙이면 영원히 타는 지하 바위와 빛을 뿜는 발광석을 얻을 수 있습니다. + + + + 지하의 1블록 거리는 지상의 3블록 거리와 같으므로, 지하 월드에서는 지상에서보다 더 빨리 이동할 수 있습니다. + + + + 현재 창작 모드 상태입니다. + + + + {*B*} + 창작 모드에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 단추를 누르십시오.{*B*} + 창작 모드에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 단추를 누르십시오. + + +창작 모드에서는 모든 아이템과 블록을 무한정 사용할 수 있습니다. 도구를 사용하지 않아도 클릭 한 번만으로 블록을 파괴할 수 있으며, 무적 상태인데다 날 수도 있습니다. + +{*CONTROLLER_ACTION_JUMP*}를 앞으로 빨리 두 번 누르면 날 수 있습니다. 비행을 종료하려면 똑같은 동작을 반복하십시오. 더 빨리 날려면 {*CONTROLLER_ACTION_MOVE*}를 앞으로 빨리 두 번 누르십시오. +비행 모드에서 {*CONTROLLER_ACTION_JUMP*}을 길게 누르면 위로 올라가고{*CONTROLLER_ACTION_SNEAK*}을 길게 누르면 아래로 내려갑니다. 또는 십자 키를 사용해서 상하좌우로 움직일 수도 있습니다. + +{*CONTROLLER_ACTION_CRAFTING*}를 눌러 창작 소지품 인터페이스를 엽니다. + +구멍 반대쪽으로 나가면 계속합니다. + +창작 모드 튜토리얼을 완료했습니다. + + + 이 지역에는 농장이 있습니다. 농장에서 작물을 재배하면 음식 및 기타 아이템의 재료를 얻을 수 있습니다. + + + + {*B*} + 재배에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 단추를 누르십시오.{*B*} + 재배에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 단추를 누르십시오. + + +밀, 호박, 수박은 씨앗을 심어서 재배합니다. 길게 자란 풀을 자르거나 밀을 수확하면 밀 씨앗을 얻을 수 있습니다. 호박 및 수박을 가공하면 호박씨 및 수박씨를 얻을 수 있습니다. + +씨를 심으려면 쟁기를 사용해서 흙 블록을 농지로 만들어야 합니다. 주변에 수원이 있으면 농지에 계속 수분을 공급하므로 작물이 빨리 자라며, 해당 지역에 불이 켜진 상태를 유지합니다. + +밀은 자라는 동안 여러 단계를 거칩니다. 수확할 준비가 되었을 때는 어둡게 변합니다.{*ICON*}59:7{*/ICON*} + +호박 및 수박은 씨를 심은 블록 옆에 또 다른 블록 하나가 필요합니다. 줄기가 다 자란 후 옆의 빈 블록에 열매를 맺게 됩니다. + +사탕수수는 물 블록 옆에 있는 풀, 흙 또는 모래 블록에 심어야 합니다. 사탕수수 블록을 자르면 사탕수수 위에 놓인 블록이 모두 떨어지게 됩니다.{*ICON*}83{*/ICON*} + +선인장은 모래에 심어야 하며 최대 세 블록 높이까지 자랍니다. 사탕수수와 마찬가지로 맨 아래 블록을 파괴하면 그 위의 블록이 떨어져 획득할 수 있습니다.{*ICON*}81{*/ICON*} + +버섯은 희미하게 불이 켜진 지역에 심어야 합니다. 버섯을 심으면 주변의 희미하게 불이 켜진 블록으로 퍼져 나갑니다.{*ICON*}39{*/ICON*} + +뼛가루를 사용하면 작물을 완전히 자란 상태로 만들거나 버섯을 거대 버섯으로 만들 수 있습니다.{*ICON*}351:15{*/ICON*} + +재배 튜토리얼을 완료했습니다. + + + 이곳에는 동물이 우리 안에 들어 있습니다. 동물을 교배하면 새끼 동물을 얻을 수 있습니다. + + + + {*B*} + 동물과 교배에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 단추를 누르십시오.{*B*} + 동물과 교배에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 단추를 누르십시오. + + +동물을 교배시키려면 각 동물에 적합한 먹이를 먹여 '사랑 모드'로 만들어야 합니다. + +소, Mooshroom, 양에게는 밀을 먹이고 돼지에게는 당근을 먹이십시오. 그리고 닭에게는 밀 씨앗이나 지하 사마귀를 먹이십시오. 늑대에겐 모든 종류의 고기를 먹일 수 있습니다. 먹이를 먹은 동물은 사랑 모드 상태인 같은 종의 동물이 근처에 있는지 찾아다니게 됩니다. + +사랑 모드 상태이며 종류가 같은 동물이 두 마리 만나게 되면 서로 입을 맞추게 되고, 잠시 후 새끼 동물이 태어납니다. 새끼 동물은 다 자라기 전까지 잠시 부모 동물을 따라다닙니다. + +사랑 모드가 끝난 동물은 5분간 다시 사랑 모드 상태가 될 수 없습니다. + +플레이어가 손에 먹이를 들고 있으면 일부 동물은 플레이어를 따라다닙니다. 동물을 한데 모아 교배할 때 편리합니다.{*ICON*}296{*/ICON*} + + + 야생 늑대에게 뼈를 주면 길들일 수 있으며, 길들인 늑대 주변에는 하트가 나타납니다. 길들인 늑대는 플레이어를 따라다니며, 앉도록 명령받지 않은 동안에는 플레이어를 보호합니다. + + +동물 및 교배 튜토리얼을 완료했습니다. + + + 이 지역에서는 호박과 블록으로 눈 골렘과 철 골렘을 만들 수 있습니다. + + + + {*B*} + {*CONTROLLER_VK_A*}를 눌러 골렘에 대해 더 알아보십시오.{*B*} + 골렘에 대해 잘 안다면 {*CONTROLLER_VK_B*}를 누르십시오. + + +골렘은 여러 개 쌓인 블록 위에 호박을 놓아 만들 수 있습니다. + +눈 골렘은 2개의 눈 블록을 위아래로 쌓고 그 위에 호박을 놓아 만들 수 있습니다. 눈 골렘은 적에게 눈덩이를 던집니다. + +철 골렘은 보시는 바와 같이 4개의 철 블록을 놓고 가운데 블록 위에 호박을 놓아 만들 수 있습니다. 철 골렘은 적을 공격합니다. + +철 골렘은 기본적으로 마을을 보호합니다. 사용자가 마을 사람을 공격하면 철 골렘이 사용자를 공격합니다. + +튜토리얼을 완료하기 전에는 이 지역을 벗어날 수 없습니다. + +재료를 확보할 때는 그에 맞는 도구를 사용하는 것이 좋습니다. 흙이나 모래 같이 부드러운 재질의 재료를 얻으려면 삽을 써야 합니다. + +재료를 확보할 때는 그에 맞는 도구를 사용하는 것이 좋습니다. 나무 둥치를 베려면 도끼를 써야 합니다. + +재료를 확보할 때는 그에 맞는 도구를 사용하는 것이 좋습니다. 돌과 광물을 채굴할 때는 곡괭이를 써야 합니다. 특정 블록에서 자원을 채굴하려면 더 좋은 재질의 곡괭이가 필요할 수도 있습니다. + +특정 도구는 적을 공격하는 데 유용합니다. 검을 사용해서 공격해 보십시오. + +힌트: {*CONTROLLER_ACTION_ACTION*}를 누르고 있으면 손 또는 손에 든 도구로 채굴하거나 벌목합니다. 일부 블록은 도구를 사용해야 채굴할 수 있습니다. + +사용하고 있는 도구가 손상됐습니다. 도구는 사용할 때마다 손상되며, 나중에는 망가집니다. 아이템 아래쪽의 색상 눈금을 보면 현재 손상된 정도를 알 수 있습니다. + +수면으로 헤엄치려면 {*CONTROLLER_ACTION_JUMP*}를 길게 누르십시오. + +이곳에는 궤도가 있고 그 위에 광물 수레가 있습니다. 광물 수레에 타려면 포인터를 수레에 맞추고 {*CONTROLLER_ACTION_USE*}를 누릅니다. 단추에 포인터를 맞추고 {*CONTROLLER_ACTION_USE*}를 누르면 광물 수레가 움직입니다. + +강 옆의 상자에는 배가 있습니다. 배를 사용하려면 포인터를 물에 맞추고 {*CONTROLLER_ACTION_USE*}를 누르십시오. 포인터를 배에 맞추고 {*CONTROLLER_ACTION_USE*}를 누르면 배에 탑니다. + +연못 옆의 상자에는 낚싯대가 있습니다. 상자에서 낚싯대를 꺼내 손에 든 아이템으로 선택한 다음 사용하십시오. + +이 고급 피스톤 기계장치는 자동 수리 기능을 지닌 다리를 만듭니다! 단추를 눌러 작동시킨 다음 각 부품이 어떻게 사용되었는지 더 알아보십시오. + +아이템을 옮기는 중에 포인터가 인터페이스를 벗어나면 아이템을 버릴 수 있습니다. + +이 아이템을 만들 재료가 부족합니다. 왼쪽 아래의 상자에는 이 아이템을 만드는 데 필요한 재료가 표시됩니다. + + + 축하합니다. 튜토리얼을 마쳤습니다. 이제 게임 시간이 정상적으로 흐르며, 괴물이 출몰하는 밤이 오기까지 시간이 얼마 남지 않았습니다! 피신처를 완성하십시오! + + +{*EXIT_PICTURE*} 먼 곳을 탐험하려면 이 지역의 계단을 이용하십시오. 출입구는 작은 성과 연결된 광부의 피신처 근처에 있습니다. + +알림: + +]]> + +최신 버전에는 튜토리얼 월드에서 갈 수 있는 새로운 지역 등의 다양한 새 기능이 추가되었습니다. + +{*B*}튜토리얼을 플레이하려면 {*CONTROLLER_VK_A*} 단추를 누르십시오.{*B*} + 튜토리얼을 건너뛰려면 {*CONTROLLER_VK_B*} 단추를 누르십시오. + +이곳에는 낚시, 배, 피스톤, 레드스톤에 대해 알려주는 지역이 있습니다. + +이곳 밖에서는 건설, 재배, 광물 수레와 궤도, 효과부여, 양조, 거래, 대장일 등의 예시를 만나볼 수 있습니다! + + + 음식 막대가 다 떨어지면 체력이 회복하지 않습니다. + + + + {*B*} + 음식 막대와 음식 먹는 법에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 단추를 누르십시오.{*B*} + 음식 막대와 음식 먹는 법에 대해 이미 알고 있다면{*CONTROLLER_VK_B*} 단추를 누르십시오. + + + + 여기는 말 소지품 인터페이스입니다. + + + + {*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*}를 누르십시오. + + + + 폭죽은 손이나 디스펜서로 발사할 수 있는 장식 아이템이며, 기본 재료인 종이와 화약에 폭죽 별을 부가적으로 더해 만들 수 있습니다. + + + + 폭죽 별을 만들 때 추가 재료를 넣으면 색상과 사라지는 형태, 모양, 크기, 효과(궤적이나 반짝임 등)를 원하는 대로 바꿀 수 있습니다. + + + + 작업대에서 상자에 든 재료들을 이용해 폭죽을 만들어 보십시오. + +  +선택 + +사용 + +뒤로 + +나가기 + +취소 + +참가 취소 + +저장 장치 선택 + +저장 장치 변경 + +온라인 게임 목록 새로 고침 + +파티 게임 + +모든 게임 + +그룹 변경 + +소지품 표시 + +설명 표시 + +재료 표시 + +제작 + +만들기 + +획득/놓기 + +획득 + +모두 획득 + +절반 획득 + +놓기 + +모두 놓기 + +하나 놓기 + +버리기 + +모두 버리기 + +하나 버리기 + +교체 + +빠른 이동 + +빠른 선택 취소 + +이것은 무엇입니까? + +Facebook에 공유 + +필터 변경 + +게이머 카드 보기 + +게이머 프로필 확인 + +친구 요청 보내기 + +페이지 내림 + +페이지 올림 + +다음 + +이전 + +플레이어 추방 + +염색 + +채굴 + +먹이기 + +길들이기 + +치료하기 + +앉기 + +나를 따르라 + +쫓아내기 + +비우기 + +안장 + +놓기 + +때리기 + +젖 짜기 + +수집 + +먹기 + +잠자기 + +일어나기 + +재생 + +타기 + +배 타기 + +성장 + +수면으로 헤엄치기 + +열기 + +높낮이 변경 + +폭파 + +읽기 + +매달기 + +던지기 + +심기 + +경작 + +수확 + +계속 + +정식 버전 게임 구매 + +저장 게임 삭제 + +삭제 + +옵션 + +Xbox Live 파티 초대 + +친구 초대 + +수락 + +털 깎기 + +레벨 차단 + +캐릭터 선택 + +점화 + +캐릭터 찾기 + +정식 버전 설치 + +평가판 설치 + +설치 + +재설치 + +옵션 저장 + +명령 실행 + +창작 + +재료 이동 + +연료 이동 + +도구 움직이기 + +방어구 이동 + +무기 이동 + +장비하기 + +꺼내기 + +놓기 + +특권 + +블록 + +페이지 올림 + +페이지 내림 + +사랑 모드 + +마시기 + +회전 + +숨기기 + +Xbox One용 저장 파일을 업로드합니다. + +모든 슬롯을 비웁니다. + +Xbox One 저장 데이터 업로드 + +타기 + +내리기 + +상자 달기 + +발사 + +줄 묶기 + +놓기 + +부착 + +이름 + +확인 + +취소 + +Minecraft 상점 + +진행 중인 게임을 종료하고 새 게임에 참가하시겠습니까? 저장하지 않은 진행 상황은 사라집니다. + +게임 나가기 + +게임 저장 + +저장하지 않고 나가기 + +현재 월드에서 이전에 저장한 내용을 현재 버전으로 덮어쓰시겠습니까? + +저장하지 않고 나가시겠습니까? 이 월드의 진행 상황이 모두 사라집니다! + +게임 시작 + +창작 모드에서 월드를 생성, 저장하거나 불러오면 해당 월드에서는 도전 과제를 획득할 수 없으며 순위표에 기록되지 않습니다. 이후 해당 월드를 생존 모드에서 불러와도 마찬가지입니다. 계속하시겠습니까? + +이전에 창작 모드에서 저장된 월드입니다. 도전 과제를 획득할 수 없으며 순위표에 기록되지 않습니다. 계속하시겠습니까? + +이전에 창작 모드에서 저장된 월드입니다. 도전 과제를 획득할 수 없으며 순위표에 기록되지 않습니다. + +호스트 특권을 켜고 월드를 생성, 저장하거나 불러오면 해당 월드에서는 도전 과제를 획득할 수 없으며 순위표에 기록되지 않습니다. 이후 해당 옵션을 꺼도 마찬가지입니다. 계속하시겠습니까? + +손상된 저장 데이터 + +저장 데이터가 손상되었습니다. 삭제하시겠습니까? + +게임에 참가한 모든 플레이어의 연결을 끊고, 주 메뉴로 나가시겠습니까? 저장하지 않은 진행 상황은 사라집니다. + +저장하고 나가기 + +저장하지 않고 나가기 + +주 메뉴로 나가시겠습니까? 저장하지 않은 진행 상황은 사라집니다. + +주 메뉴로 나가시겠습니까? 게임 진행 내용을 잃게 됩니다! + +새 월드 만들기 + +튜토리얼 진행 + +튜토리얼 + +월드 이름 지정 + +월드 이름을 입력하십시오. + +월드 생성 시드를 입력하십시오. + +저장된 월드 불러오기 + +게임에 참가하려면 START를 누르십시오. + +게임에서 나가는 중 + +오류가 발생했습니다. 주 메뉴로 돌아갑니다. + +연결 실패 + +연결 끊어짐 + +서버 연결이 끊어졌습니다. 주 메뉴로 돌아갑니다. + +Xbox Live 연결이 끊어졌습니다. 주 메뉴로 돌아갑니다. + +Xbox Live와의 연결이 끊어졌습니다. + +서버 연결 끊김 + +게임에서 추방되었습니다. + +비행으로 인해 게임에서 추방되었습니다. + +연결 시도 시간이 초과했습니다. + +서버가 꽉 찼습니다. + +호스트가 게임에서 나갔습니다. + +이 게임에 참가한 친구가 없으므로 게임에 참가할 수 없습니다. + +예전에 호스트가 자신을 추방했기 때문에 게임에 참가할 수 없습니다. + +참가하려는 플레이어가 이 게임의 이전 버전을 플레이하고 있으므로 게임에 참가할 수 없습니다. + +참가하려는 플레이어가 이 게임의 다음 버전을 플레이하고 있으므로 게임에 참가할 수 없습니다. + +새 월드 + +상품을 획득했습니다! + +만세! Minecraft의 Steve가 그려진 게이머 사진을 획득했습니다! + +만세! Creeper가 그려진 게이머 사진을 획득했습니다! + +만세! Minecraft: Xbox 360 Edition 티셔츠(아바타 아이템)를 획득했습니다! +대시보드에서 아바타에게 티셔츠를 입혀 보십시오. + +만세! Minecraft: Xbox 360 Edition 손목시계(아바타 아이템)를 획득했습니다! +대시보드에서 아바타에게 손목시계를 채워주십시오. + +만세! Creeper 야구 모자(아바타 아이템)를 획득했습니다! +대시보드에서 아바타에게 모자를 씌워주십시오. + +만세! Minecraft: Xbox 360 Edition 테마를 획득했습니다! +대시보드에서 테마를 적용해 보십시오. + +정식 버전 게임 구매 + +현재 게임은 평가판 버전입니다. 게임을 저장하려면 정식 버전이 필요합니다. +지금 정식 버전 게임을 구매하시겠습니까? + +이 Minecraft: Xbox 360 Edition은 평가판입니다. 정식 버전 게임에서는 도전 과제를 달성할 수 있습니다. +정식 버전 게임을 구매하면 Minecraft: Xbox 360 Edition의 모든 기능을 이용하고 Xbox Live를 통해 전 세계의 친구들과 함께 게임을 즐길 수 있습니다. +정식 버전 게임을 구매하시겠습니까? + +이 Minecraft: Xbox 360 Edition은 평가판입니다. 정식 버전 게임에서는 아바타 상품을 받을 수 있습니다! +정식 버전 게임을 구매하면 Minecraft: Xbox 360 Edition의 모든 기능을 이용하고 Xbox Live를 통해 전 세계의 친구들과 함께 즐길 수 있습니다. +정식 버전 게임을 구매하시겠습니까? + +이 Minecraft: Xbox 360 Edition은 평가판입니다. 정식 버전 게임에서는 게이머 사진을 받을 수 있습니다! +정식 버전 게임을 구매하면 Minecraft: Xbox 360 Edition의 모든 기능을 이용하고 Xbox Live를 통해 전 세계의 친구들과 함께 즐길 수 있습니다. +정식 버전 게임을 구매하시겠습니까? + +이 Minecraft: Xbox 360 Edition은 평가판입니다. 정식 버전 게임에서는 테마를 받을 수 있습니다! +정식 버전 게임을 구매하면 Minecraft: Xbox 360 Edition의 모든 기능을 이용하고 Xbox Live를 통해 전 세계의 친구들과 함께 즐길 수 있습니다. +정식 버전 게임을 구매하시겠습니까? + +이 게임은 Minecraft: Xbox 360 Edition 평가판입니다. 초대를 수락하려면 정식 버전 게임이 필요합니다. +정식 버전 게임을 구매하시겠습니까? + +손님 플레이어는 정식 버전을 구매할 수 없습니다. Xbox Live 사용자 ID로 로그인하십시오. + +잠시 기다려 주십시오. + +결과 없음 + +필터: + +친구 + +내 점수 + +전체 + +명단: + +순위 + +게이머태그 + +레벨 저장 준비 중 + +이것저것 준비 중... + +마무리 중... + +지형 구축 중 + +월드 시뮬레이션 중 + +서버 시동 중 + +출현 지역 생성 중 + +출현 지역 불러오는 중 + +지하 진입 중 + +지상 진입 중 + +재생성 중 + +레벨 생성 중 + +레벨 불러오는 중 + +플레이어 저장 중 + +호스트에 연결 중 + +지형 다운로드 중 + +오프라인 게임으로 전환하는 중 + +호스트가 게임을 저장하는 동안 기다리십시오. + +Ender에 들어가기 + +Ender에서 나가기 + +월드 생성 시드 찾는 중 + +이 침대는 주인이 있습니다. + +잠은 밤에만 잘 수 있습니다. + +%s 님이 침대에서 자고 있습니다. 시간을 새벽으로 건너뛰려면 모든 플레이어가 잠들어야 합니다. + +침대가 사라졌거나 장애물이 막고 있습니다. + +휴식을 취할 때가 아닙니다. 근처에 괴물이 있습니다. + +침대에서 자고 있습니다. 시간을 새벽으로 건너뛰려면 모든 플레이어가 잠들어야 합니다. + +도구 및 무기 + +무기 + +식량 + +구조물 + +방어구 + +기계장치 + +이동수단 + +장식물 + +블록 짓기 + +레드스톤 및 운송 + +기타 + +양조 + +양조 + +도구, 무기 및 방어구 + +재료 + +로그아웃 + +게이머 프로필에서 로그아웃했으므로 타이틀 화면으로 돌아갑니다. + +난이도 + +음악 + +사운드 + +감마 + +게임 감도 + +인터페이스 감도 + +낙원 + +쉬움 + +보통 + +어려움 + +이 모드에서는 플레이어의 체력이 시간에 따라 자동으로 회복되며 적이 등장하지 않습니다. + +이 모드에서는 적이 나타나지만 보통 난이도보다 공격력이 약합니다. + +이 모드에서는 적이 나타나며, 플레이어에게 일반 수준의 피해를 입힙니다. + +이 모드에서는 적이 나타나며, 플레이어에게 큰 피해를 입힙니다. Creeper는 플레이어가 거리를 벌려도 폭발을 취소하지 않으므로 조심해야 합니다! + +평가판 시간 만료 + +Minecraft: Xbox 360 Edition 평가판을 플레이할 수 있는 시간이 만료되었습니다! 정식 버전 게임을 구매하여 계속해서 게임을 즐기시겠습니까? + +인원 초과 + +빈자리가 없어서 게임에 참가하지 못했습니다. + +서명 입력 + +서명으로 사용할 텍스트를 입력하십시오. + +제목 입력 + +게시물 제목을 입력하십시오. + +설명문 입력 + +게시물 설명문을 입력하십시오. + +내용 입력 + +게시물 내용을 입력하십시오. + +소지품 + +재료 + +양조대 + +상자 + +효과부여 + +화로 + +재료 + +연료 + +디스펜서 + + + +드로퍼 + +호퍼 + +신호기 + +주 능력 + +보조 능력 + +광물 수레 + +현재 이 게임에서 구매할 수 있는 해당 유형의 다운로드 콘텐츠가 없습니다. + +%s님이 게임에 참가했습니다. + +%s님이 게임을 떠났습니다. + +%s님을 게임에서 추방했습니다. + +저장한 게임을 삭제하시겠습니까? + +승인을 기다리는 중 + +확인됨 + +플레이 중: + +설정 초기화 + +설정을 기본값으로 초기화하시겠습니까? + +불러오기 오류 + +Minecraft: Xbox 360 Edition을 불러오는 중에 오류가 발생하여 계속할 수 없습니다. + +%s 님의 게임 + +알 수 없는 호스트 게임 + +손님이 로그아웃됨 + +모든 손님 플레이어가 게임에서 제거되었기 때문에 손님 플레이어가 로그아웃되었습니다. + +로그인 + +로그인하지 않았습니다. 이 게임을 플레이하려면 로그인해야 합니다. 지금 로그인하시겠습니까? + +멀티 플레이 허용되지 않음 + +한 명 이상의 플레이어가 Xbox Live 멀티 플레이 게임을 플레이할 수 없어 게임에 참가할 수 없습니다. + +한 명 이상의 플레이어가 Xbox Live 멀티 플레이 게임을 플레이할 수 없어 온라인 게임을 만들 수 없습니다. 오프라인 게임을 시작하려면 "온라인 게임"의 선택을 해제하십시오. + +멤버 콘텐츠 권한 설정 제한 범위가 너무 높아 게임 세션에 참가할 수 없습니다. 세션에 참가하려면 Xbox 대시보드의 개인 정보 보호 및 온라인 설정에서 해당 설정을 변경하십시오. + +로컬 플레이어 중 한 명 이상의 멤버 콘텐츠 권한 설정 제한 범위가 너무 높아 게임 세션에 참가할 수 없습니다. + +세션 내의 플레이어가 멤버 콘텐츠 권한 설정 제한을 [친구만]으로 설정하였습니다. 해당 플레이어의 친구 목록에 등록되지 않았으므로 게임 세션에 참가할 수 없습니다. + +게임을 생성하지 못했습니다. + +로컬 플레이어 중 한 명 이상의 멤버 콘텐츠 권한 설정 제한 범위가 너무 높아 게임 세션을 생성할 수 없습니다. '온라인 게임' 상자의 선택을 해제하여 오프라인 게임을 시작하거나 Xbox 대시보드의 [개인 정보 보호 및 온라인 설정]에서 해당 설정을 변경하십시오. + +자동 선택 + +팩 없음: 기본 캐릭터 + +즐겨찾는 캐릭터 + +차단 레벨 + +참가하려는 게임은 차단 레벨 목록에 들어 있습니다. +게임 참가를 선택하면 해당 레벨이 차단 레벨 목록에서 제거됩니다. + +이 레벨을 차단하시겠습니까? + +이 레벨을 차단 레벨 목록에 추가하시겠습니까? +확인을 선택하면 동시에 게임에서 나가게 됩니다. + +차단 목록에서 제거 + +자동 저장 간격 + +자동 저장 간격: 꺼짐 + + + +여기에 놓을 수 없습니다! + +용암을 레벨 출현 지점 근처에 놓을 수 없습니다. 플레이어가 시작 지점에서 바로 죽을 수 있기 때문입니다. + +이 게임은 레벨 자동 저장 기능을 지원합니다. 위에 보이는 아이콘은 게임을 저장하는 중임을 나타내는 것입니다. +이 아이콘이 화면에 있을 때 Xbox 360 본체를 끄지 마십시오. + +인터페이스 투명도 + +레벨 자동 저장 준비 중 + +HUD 크기 + +HUD 크기 (분할 화면) + +시드 + +캐릭터 팩 획득 + +선택한 캐릭터를 사용하려면 캐릭터 팩을 획득해야 합니다. +지금 캐릭터 팩을 획득하시겠습니까? + +텍스처 팩 잠금 해제 + +이 텍스처 팩을 사용하려면 먼저 잠금을 해제해야 합니다. +지금 잠금 해제하시겠습니까? + +텍스처 팩 평가판 + +텍스처 팩의 평가판을 사용 중입니다. 정식 버전을 구입하기 전에는 이 월드를 저장할 수 없습니다. +텍스처 팩 정식 버전을 구입하시겠습니까? + +텍스처 팩 없음 + +정식 버전 구입 + +평가판 다운로드 + +정식 버전 다운로드 + +여기에는 텍스처 팩 또는 매시업 팩이 필요하며 현재 가지고 있지 않습니다! +지금 텍스처 팩 또는 매시업 팩을 설치하시겠습니까? + +평가판 받기 + +정식 버전 받기 + +플레이어 추방 + +이 플레이어를 게임에서 추방하시겠습니까? 추방당한 플레이어는 월드를 다시 시작하기 전까지 참가할 수 없습니다. + +게이머 사진 팩 + +테마 + +캐릭터 팩 + +친구의 친구도 참가 가능 + +이 게임은 호스트의 친구만 플레이할 수 있도록 제한되어서 참가할 수 없습니다. + +게임에 참가할 수 없음 + +선택 됨 + +선택된 캐릭터: + +손상된 다운로드 콘텐츠 + +이 다운로드 콘텐츠는 손상되어서 사용될 수 없습니다. 해당 콘텐츠를 삭제한 다음 Minecraft 상점 메뉴에서 재설치하십시오. + +일부 다운로드 콘텐츠가 손상되어 사용될 수 없습니다. 해당 콘텐츠를 삭제한 다음 Minecraft 상점 메뉴에서 재설치하십시오. + +게임 모드가 변경되었습니다. + +월드 이름 바꾸기 + +월드의 새 이름을 입력하십시오. + +게임 모드: 생존 + +게임 모드: 창작 + +게임 모드: 모험 + +생존 + +창작 + +모험 + +생존 모드에서 생성 + +창작 모드에서 생성 + +구름 렌더링 + +이 저장된 게임을 어떻게 하시겠습니까? + +저장된 게임 이름 바꾸기 + +%d초 후에 자동 저장 실행... + +켜짐 + +꺼짐 + +일반 + +완전평면 + +시드를 입력해서 같은 지역을 만드십시오. 공백으로 두면 무작위 월드가 생성됩니다. + +이 옵션을 켜면 온라인 게임으로 플레이합니다. + +이 옵션을 켜면 초대받은 플레이어만 게임에 참가할 수 있습니다. + +이 옵션을 켜면 친구 목록에 있는 사람의 친구가 게임에 참가할 수 있습니다. + +이 옵션을 켜면 플레이어끼리 서로 피해를 입힐 수 있습니다. 생존 모드에만 적용됩니다. + +이 옵션을 끄면 게임에 참가한 플레이어는 인증을 받기 전까지 건물을 짓거나 채굴할 수 없습니다. + +이 옵션을 켜면 불이 근처의 가연성 블록으로 번집니다. + +이 옵션을 켜면 TNT가 작동할 때 폭발합니다. + +이 옵션을 켜면 호스트는 게임 메뉴에서 플레이어에게 비행 능력을 주거나, 지치지 않게 하거나, 투명하게 만들 수 있습니다. 도전 과제를 획득할 수 없으며 순위표에 기록되지 않습니다. + +이 옵션을 켜면 지하 월드가 재건됩니다. 사전에 지하 요새가 없는 곳에 미리 저장하면 유용합니다. + +이 옵션을 켜면 마을이나 요새 등의 건물이 월드에 생성됩니다. + +이 옵션을 켜면 지상과 지하에 완전히 평평한 세계가 생성됩니다. + +이 옵션을 켜면 쓸모있는 아이템이 든 상자가 플레이어 생성 지점 근처에 나타납니다. + +비활성화하면 몬스터와 동물이 블록을 교체하거나 아이템을 집지 못하게 합니다. 예를 들어 Creeper가 폭발해도 블록이 파괴되지 않으며, 양은 풀을 제거하지 못합니다. + +활성화하면 플레이어가 죽어도 소지품의 아이템을 잃지 않습니다. + +비활성화하면 괴물이나 동물이 자연적으로 생성되지 않습니다. + +비활성화하면 괴물과 동물이 전리품을 떨어트리지 않습니다. 예를 들어 Creeper가 화약을 떨어트리지 않습니다. + +비활성화하면 블록이 파괴돼도 아이템을 떨어트리지 않습니다. 예를 들어 돌 블록에서 조약돌을 얻을 수 없습니다. + +비활성화하면 플레이어의 체력이 자연적으로 재생되지 않습니다. + +비활성화하면 시간대가 변하지 않습니다. + +스킨 팩 + +테마 + +게이머 사진 + +아바타 아이템 + +텍스처 팩 + +매시업 팩 + +{*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*}의 마법에 살해당했습니다. + +{*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*}에 살해당했습니다. + +기반암 안개 + +HUD 표시 + +손 표시 + +분할 화면 게이머태그 + +사망 메시지 + +캐릭터 애니메이션 + +사용자 지정 스킨 애니메이션 + +채굴하거나 아이템을 사용할 수 없습니다. + +채굴하거나 아이템을 사용할 수 있습니다. + +블록을 놓을 수 없습니다. + +블록을 놓을 수 있습니다. + +문과 스위치를 사용할 수 있습니다. + +문과 스위치를 사용할 수 없습니다. + +보관함(예; 상자)을 사용할 수 있습니다. + +보관함(예; 상자)을 사용할 수 없습니다. + +괴물 및 동물을 공격할 수 없습니다. + +괴물 및 동물을 공격할 수 있습니다. + +플레이어를 공격할 수 없습니다. + +플레이어를 공격할 수 있습니다. + +동물을 공격할 수 없습니다. + +동물을 공격할 수 있습니다. + +관리자가 되었습니다. + +관리자에서 해임되었습니다. + +날 수 있습니다. + +날 수 없습니다. + +지치지 않습니다. + +지치게 됩니다. + +투명 상태가 되었습니다. + +투명 상태가 해제되었습니다. + +무적 상태가 되었습니다. + +무적 상태가 해제되었습니다. + +%d MSP + +Ender 드래곤 + +%s 님이 Ender에 들어갔습니다. + +%s 님이 Ender에서 나갔습니다. + + +{*C3*}네가 말한 플레이어가 보여.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}, 말이야?{*EF*}{*B*}{*B*} +{*C3*}그래. 조심해. 이제 더 높은 단계에 도달해서 우리 생각을 읽을 수 있어.{*EF*}{*B*}{*B*} +{*C2*}상관없어. 어차피 우리는 게임의 일부라고 생각할 거야.{*EF*}{*B*}{*B*} +{*C3*}난 이 플레이어가 마음에 들어. 멋진 플레이를 보여줬고 절대 포기하지 않았잖아.{*EF*}{*B*}{*B*} +{*C2*}우리 생각을 마치 게임 속 단어처럼 읽고 있어.{*EF*}{*B*}{*B*} +{*C3*}게임의 꿈에 깊이 빠져있을 때 많은 것들을 상상하기 위해 선택한 방법이야.{*EF*}{*B*}{*B*} +{*C2*}단어는 서로의 생각을 소통하기에 좋은 방법이야. 유연하잖아. 화면 뒤의 현실을 응시하는 것보다 덜 무섭고.{*EF*}{*B*}{*B*} +{*C3*}플레이어가 읽을 수 있기 전까지는 목소리를 들었지. 예전엔 플레이하지 않던 사람들은 플레이어를 마녀나 마법사라고 불렀어. 그리고 플레이어는 악마의 힘이 깃든 빗자루를 타고 하늘을 날아다니는 꿈을 꿨고.{*EF*}{*B*}{*B*} +{*C2*}이 플레이어는 어떤 꿈을 꿨을까?{*EF*}{*B*}{*B*} +{*C3*}이 플레이어는 햇살과 나무 그리고 불과 물에 관한 꿈을 꿨어. 이 모든 것들을 만들어내고 파괴하는 꿈을 꿨지. 그리고 사냥하고 사냥당하는 꿈과 보금자리에 관한 꿈을 꿨어.{*EF*}{*B*}{*B*} +{*C2*}아, 예전 인터페이스 말이구나. 백만 년도 더 됐지만 아직도 작동하지. 그런데 이 플레이어는 화면 뒤의 현실에서 실제로 어떤 것들을 만들었을까?{*EF*}{*B*}{*B*} +{*C3*}수많은 사람들과 {*EF*}{*NOISE*}{*C3*} 사이에 진실된 세상을 만들고 {*EF*}{*NOISE*}{*C3*} 속에서 {*EF*}{*NOISE*}{*C3*}를 위해 {*EF*}{*NOISE*}{*C3*}를 만들었어.{*EF*}{*B*}{*B*} +{*C2*}그 생각은 아직 읽지 못해.{*EF*}{*B*}{*B*} +{*C3*}그래, 아직 가장 높은 단계에는 도달하지 못했으니까. 게임이라는 짧은 꿈에서는 도달할 수 없지만 기나긴 인생의 꿈속에서 도달하게 될 거야.{*EF*}{*B*}{*B*} +{*C2*}우리가 사랑하고 있다는 걸 알고 있을까? 그리고 세상이 아름답고 다정하다는 건?{*EF*}{*B*}{*B*} +{*C3*}생각의 잡음 속에서 간혹 세상의 소리를 들으니 알고 있을 거야.{*EF*}{*B*}{*B*} +{*C2*}하지만 긴 꿈속에서 슬플 때도 있어. 여름이 없는 세상을 만들고 검은 태양 아래에서 두려움에 떨며 현실의 슬픈 창조물을 움켜잡고 있지.{*EF*}{*B*}{*B*} +{*C3*}그의 슬픔을 치유하면 그를 망치게 될 거야. 슬픔은 직접 풀어야 하는 과제이니까. 우리는 그걸 방해하면 안 돼.{*EF*}{*B*}{*B*} +{*C2*}말해주고 싶어. 때로는 그들이 꿈속에 깊은 곳에서 현실 속의 진정한 세상을 만들고 있다는 걸. 또 그들이 세상에서 얼마나 중요한 존재인지 말해주고 싶어. 그들이 진정한 관계를 맺지 못하고 있을 때 그들이 두려워하는 바를 말할 수 있도록 도와주고 싶어.{*EF*}{*B*}{*B*} +{*C3*}우리 생각을 읽고 있어.{*EF*}{*B*}{*B*} +{*C2*}난 신경 쓰지 않아. 그들에게 말해주고 싶어. 세상의 진실은 단지 {*EF*}{*NOISE*}{*C2*}하고 {*EF*}{*NOISE*}{*C2*} 할 뿐이란 걸 말이야. 또 그들은 {*EF*}{*NOISE*}{*C2*}에서 {*EF*}{*NOISE*}{*C2*}하고 있을 뿐이란 것도 말해주고 싶어. 그들은 기나긴 꿈속에서 현실의 아주 작은 부분만을 보고 있어.{*EF*}{*B*}{*B*} +{*C3*}그렇다 하더라도 그들은 게임을 하고 있잖아.{*EF*}{*B*}{*B*} +{*C2*}하지만 그들에게 말을 전하기는 어렵지 않아...{*EF*}{*B*}{*B*} +{*C3*}이 꿈에서는 안 돼. 그들에게 어떻게 살아야 하는지 말해주는 건 그들의 삶을 방해하는 거야.{*EF*}{*B*}{*B*} +{*C2*}플레이어에게 어떻게 살아야 하는지 말하려는 게 아니야.{*EF*}{*B*}{*B*} +{*C3*}플레이어는 끝없이 성장하고 있어.{*EF*}{*B*}{*B*} +{*C2*}플레이어에게 이야기를 들려줄 거야.{*EF*}{*B*}{*B*} +{*C3*}하지만 진실이 아니잖아.{*EF*}{*B*}{*B*} +{*C2*}그래. 이야기에는 단어의 틀에서만 진실을 담고 있겠지. 떨어져 있기 때문에 금방이라도 사라질 수 있는 적나라한 진실은 아니야.{*EF*}{*B*}{*B*} +{*C3*}그에게 다시 육신을 줘.{*EF*}{*B*}{*B*} +{*C2*}그래. 플레이어...{*EF*}{*B*}{*B*} +{*C3*}이제 이름으로 불러.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}. 이 게임의 플레이어.{*EF*}{*B*}{*B*} +{*C3*}좋아.{*EF*}{*B*}{*B*} + + + +{*C2*}이제 크게 심호흡을 해. 한 번 더. 폐 속 가득한 공기를 느껴봐. 팔다리가 돌아오도록 하는 거야. 그래, 손가락을 움직여봐. 중력 아래서 몸을 다시 갖게 되는 거지. 네가 다른 존재인 것처럼 우리가 다른 존재인 것처럼 네 몸이 다시 세상과 만나는 거야.{*EF*}{*B*}{*B*} +{*C3*}우리가 누구냐고? 한때는 산의 정령으로 불렸지. 아버지 태양, 어머니 달. 고대의 영혼, 동물의 영혼. 정령. 유령. 대자연. 그리고 신, 악마. 천사. 폴터가이스트. 외계인, 우주인. 렙톤, 쿼크. 우리를 부르는 단어는 다양했지만 우리는 변하지 않았어.{*EF*}{*B*}{*B*} +{*C2*}우리가 세상 그 자체야. 네가 생각하는 너 이외의 모든 것이 바로 우리지. 지금 넌 너의 피부와 눈을 통해 우리를 보고 있어. 왜 세상이 너의 피부를 통해 교감하고 네게 빛을 비출까? 플레이어인 널 보기 위해서야. 너에 대해 알고 네가 세상에 대해 알 수 있도록 말이야. 이제 네게 이야기를 하나 들려줄게.{*EF*}{*B*}{*B*} +{*C2*}아주 오래전에 플레이어가 있었어.{*EF*}{*B*}{*B*} +{*C3*}그 플레이어는 바로 {*PLAYER*}, 너야. {*EF*}{*B*}{*B*} +{*C2*}용암으로 이루어진 회전하는 지구의 얇은 표면 위에서 그는 자신을 인간이라고 생각했어. 그 용암 덩어리는 질량이 33만 배 더 무거운 불타는 가스 덩어리를 돌고 있었지. 그 둘 사이의 거리는 빛의 속도로 8분이나 걸리는 먼 거리였어. 빛은 멀리 떨어져 있는 별의 정보였고 1억 5천 킬로미터 거리에서도 네 피부를 태울 수 있지.{*EF*}{*B*}{*B*} +{*C2*}이따금 플레이어는 평평하고 끝이 없는 세상에서 자신이 광부가 되는 꿈을 꿨어. 그곳의 태양은 하얗고 사각형으로 되어 있었어. 하루는 짧았고 해야 할 일은 많았지. 그리고 죽음은 단지 잠깐의 불편함이었어.{*EF*}{*B*}{*B*} +{*C3*}이따금 플레이어는 이야기 속에서 길을 잃는 꿈을 꿨어.{*EF*}{*B*}{*B*} +{*C2*}이따금 플레이어는 다른 곳에서 다른 존재가 되는 꿈을 꿨어. 그리고 가끔 이 꿈들은 방해를 받았어. 가끔은 정말 아름다웠지. 이따금 플레이어는 꿈에서 깨어 다른 꿈으로 들어갔고 또 그 꿈에서 깨어 다른 꿈으로 들어갔어.{*EF*}{*B*}{*B*} +{*C3*}이따금 플레이어는 화면의 단어를 보는 꿈을 꿨지.{*EF*}{*B*}{*B*} +{*C2*}이제 과거로 돌아가 보자.{*EF*}{*B*}{*B*} +{*C2*}플레이어의 원자는 초원에, 강에, 공기에, 땅에 흩어져 있었어. 여자가 그 원자를 모아 마시고 먹고 들이마셔 한대 모아 그녀의 몸 안에서 플레이어를 만든 거야.{*EF*}{*B*}{*B*} +{*C2*}그렇게 플레이어는 아늑하고 어두운 어머니의 몸속에서 깨어나 긴 꿈의 세계로 들어간 거야.{*EF*}{*B*}{*B*} +{*C2*}플레이어는 DNA로 쓰여진 한 번도 들어본 적이 없는 새로운 이야기였어. 플레이어는 수십억 년 된 소스 코드로 생성된 한 번도 실행해본 적이 없는 새로운 프로그램이었어. 플레이어는 무에서 젖과 사랑으로부터 탄생한 한 번도 생명을 가져본 적이 없는 새로운 인간이었어.{*EF*}{*B*}{*B*} +{*C3*}네가 바로 무에서 젖과 사랑으로부터 탄생한 바로 그 플레이어이자 이야기고 프로그램이자 인간이야.{*EF*}{*B*}{*B*} +{*C2*}이제 좀 더 과거로 돌아가 보자.{*EF*}{*B*}{*B*} +{*C2*}플레이어의 수백 수천 수백억 원자는 이 게임이 존재하기 훨씬 이전에 별의 심장 속에서 만들어졌어. 즉, 플레이어도 별에서 온 정보야. 그리고 플레이어는 이야기 속에서 움직이는 데 그 이야기는 쥴리안이라는 사람이 심어놓은 정보야. 그리고 그 이야기는 마르쿠스라는 사람이 창조한 평평하고 끝없는 세상 위에서 펼쳐지지. 그리고 그 세상은 플레이어가 만든 작은 그만의 세상이야. 그리고 그 플레이어가 살고 있는 세상을 창조한 사람은…{*EF*}{*B*}{*B*} +{*C3*}쉿. 이따금 플레이어는 부드럽고 따뜻하며 단순한 그만의 작은 세상을 만들어. 이따금 그 세상은 거칠고 추우며 복잡하기도 해. 이따금 거대한 텅 빈 공간에서 움직이는 에너지 조각으로 머릿속에서 세상을 만들지. 한때 그 조각들을 “전자”와 “양성자”라고 부를 때도 있었어.{*EF*}{*B*}{*B*} + + + +{*C2*}한때 조각들을 “행성”과 “별”이라고 부를 때도 있었지.{*EF*}{*B*}{*B*} +{*C2*}이따금 그는 On과 Off로, 0과 1로, 일련의 코드로 이루어진 에너지로 만든 세상에 있다고 믿었어. 이따금 그는 게임 플레이를 하고 있다고 믿었지. 이따금 그는 화면의 단어를 읽고 있다고 믿었어.{*EF*}{*B*}{*B*} +{*C3*}네가 단어를 읽고 있는 그 플레이어야…{*EF*}{*B*}{*B*} +{*C2*}쉿… 가끔 플레이어는 화면의 코드를 읽어. 코드를 단어로 바꾸고, 그 단어를 의미로 해석하고, 그 의미를 느낌, 감정, 이론, 아이디어로 바꿔서 플레이어는 더 빠르고 깊게 호흡하기 시작했고 자신은 살아 있으며 수천 번의 죽음은 진짜가 아니라는 걸 깨달아.{*EF*}{*B*}{*B*} +{*C3*}너. 그래, 너는 살아 있어.{*EF*}{*B*}{*B*} +{*C2*}그리고 이따금 플레이어는 여름 나무의 하늘거리는 잎 사이로 비치는 햇빛을 통해 세상이 그와 소통하고 있다고 믿었어.{*EF*}{*B*}{*B*} +{*C3*}그리고 이따금 플레이어는 어느 추운 겨울 밤하늘에서 볼 수 있는, 아주 먼 우주 저편에서 찰나의 시간 동안 플레이어에게 보이기 위해 태양보다 백만 배 무거운 별이 자신을 불태워 발한 빛을 통해 세상이 그와 소통하고 있다고 믿었어. 그리고 세상과 멀리 떨어져 있는 집으로 걸어가 익숙한 문가에서 나는 음식 냄새를 맡으며 다시 꿈에 빠져들었지.{*EF*}{*B*}{*B*} +{*C2*}그리고 이따금 플레이어는 0과 1, 세상에 퍼져있는 전기, 꿈의 마지막에 화면에 보이는 단어를 통해 세상과 소통한다고 믿었어.{*EF*}{*B*}{*B*} +{*C3*}그리고 세상은 널 사랑한다고 말했어.{*EF*}{*B*}{*B*} +{*C2*}그리고 세상은 네가 멋진 게임 플레이를 보여줬다고 말했어.{*EF*}{*B*}{*B*} +{*C3*}그리고 세상은 네게 필요한 모든 것은 이미 네 안에 있다고 말했어.{*EF*}{*B*}{*B*} +{*C2*}그리고 세상은 네가 생각하는 것보다 넌 더 강하다고 말했어.{*EF*}{*B*}{*B*} +{*C3*}그리고 세상은 네가 낮이라고 말했어.{*EF*}{*B*}{*B*} +{*C2*}그리고 세상은 네가 밤이라고 말했어.{*EF*}{*B*}{*B*} +{*C3*}그리고 세상은 네가 싸우고 있는 어둠이 네 안에 존재한다고 말했어.{*EF*}{*B*}{*B*} +{*C2*}그리고 세상은 네가 찾고 있는 빛이 네 안에 존재한다고 말했어.{*EF*}{*B*}{*B*} +{*C3*}그리고 세상은 네가 혼자가 아니라고 말했어.{*EF*}{*B*}{*B*} +{*C2*}그리고 세상은 네가 다른 모든 것들과 떨어져 있지 않다고 말했어.{*EF*}{*B*}{*B*} +{*C3*}그리고 세상은 네가 스스로 맛을 느끼고 스스로 대화하며 자신의 코드를 읽는 세상 그 자체라고 말했어.{*EF*}{*B*}{*B*} +{*C2*}그리고 세상은 네가 사랑 그 자체니까 널 사랑한다고 말했어.{*EF*}{*B*}{*B*} +{*C3*}그리고 게임이 끝나고 플레이어가 꿈에서 깼어. 그리고 플레이어는 새로운 꿈을 꾸기 시작해. 그리고 다시 꿈을 꾸고, 더 좋은 꿈을 꿔. 그리고 플레이어는 세상 그 자체고 사랑 그 자체야.{*EF*}{*B*}{*B*} +{*C3*}네가 바로 그 플레이어야.{*EF*}{*B*}{*B*} +{*C2*}이제 일어나.{*EF*} + + +지하 초기화 + +지하의 저장 데이터를 초기화해 기본값으로 재설정하시겠습니까? 지하의 진행 상황이 사라집니다. + +지하 초기화 + +지하 초기화를 하지 않습니다. + +Mooshroom의 털을 자를 수 없습니다. 돼지, 양, 소, 고양이, 말의 수가 최대치에 도달했습니다. + +낳은 알을 사용할 수 없습니다. 돼지, 양, 소, 고양이, 말의 수가 최대치에 도달했습니다. + +낳은 알을 사용할 수 없습니다. Mooshroom의 수가 최대치에 도달했습니다. + +낳은 알을 사용할 수 없습니다. 늑대의 수가 최대치에 도달했습니다. + +낳은 알을 사용할 수 없습니다. 닭의 수가 최대치에 도달했습니다. + +낳은 알을 사용할 수 없습니다. 오징어의 수가 최대치에 도달했습니다. + +낳은 알을 사용할 수 없습니다. 마을 사람의 수가 최대치에 도달했습니다. + +낳은 알을 사용할 수 없습니다. 적의 수가 최대치에 도달했습니다. + +낳은 알을 사용할 수 없습니다. 마을 사람의 수가 최대치에 도달했습니다. + +그림 액자/아이템 외형의 수가 최대치에 도달했습니다. + +낙원 모드에서는 적을 생성할 수 없습니다. + +이 동물은 사랑 모드로 만들 수 없습니다. 교배할 수 있는 돼지, 양, 소, 고양이, 말의 수가 최대치에 도달했습니다. + +이 동물은 사랑 모드로 만들 수 없습니다. 교배할 수 있는 늑대의 수가 최대치에 도달했습니다. + +이 동물은 사랑 모드로 만들 수 없습니다. 교배할 수 있는 닭의 수가 최대치에 도달했습니다. + +이 동물은 사랑 모드로 만들 수 없습니다. 교배할 수 있는 말의 수가 최대치에 도달했습니다. + +이 동물은 사랑 모드로 만들 수 없습니다. 교배할 수 있는 Mooshroom의 수가 최대치에 도달했습니다. + +배의 수가 최대치에 도달했습니다. + +괴물 머리의 수가 최대치에 도달했습니다. + +시야 반전 + +왼손잡이 + +사망! + +재생성 + +다운로드 콘텐츠 판매 + +스킨 변경 + +게임 방법 + +컨트롤 + +설정 + +제작진 + +콘텐츠 재설치 + +디버그 설정 + +불 확산 + +TNT 폭발 + +플레이어 대 플레이어 + +플레이어 신뢰 + +호스트 특권 + +건물 생성 + +완전평면 월드 + +보너스 상자 + +월드 옵션 + +게임 옵션 + +괴물에 의한 괴롭힘 + +소지품 유지 + +괴물 생성 + +괴물 전리품 + +타일 아이템 + +자연 재생 + +시간대 전환 + +건설 및 채광 가능 + +문과 스위치 사용 가능 + +보관함을 열 수 있음 + +플레이어 공격 가능 + +동물 공격 가능 + +관리자 + +플레이어 추방 + +비행 가능 + +지치지 않음 + +투명화 + +호스트 옵션 + +플레이어/초대 + +온라인 게임 + +초대한 사람만 참가 가능 + +추가 옵션 + +불러오기 + +새 월드 + +월드 이름 + +월드 생성 시드 + +공백(무작위 시드) + +플레이어 + +게임 참가 + +게임 시작 + +게임 없음 + +게임 플레이 + +순위표 + +도전 과제 + +도움말 및 옵션 + +정식 버전 게임 구매 + +게임 계속하기 + +게임 저장 + +난이도: + +게임 유형: + +게이머태그: + +건물: + +레벨 유형: + +플레이어 대 플레이어: + +플레이어 신뢰: + +TNT: + +불 확산: + +테마 재설치 + +게이머사진 1 재설치 + +게이머사진 2 재설치 + +아바타 아이템 1 재설치 + +아바타 아이템 2 재설치 + +아바타 아이템 3 재설치 + +옵션 + +오디오 + +컨트롤 + +그래픽 + +사용자 인터페이스 + +기본값으로 재설정 + +시야 흔들림 표시 + +힌트 + +게임 속 단추 설명 표시 + +게임 내 게이머태그 + +2 플레이어 수직 분할 화면 + +완료 + +서명 메시지 편집: + +스크린샷과 함께 게시할 설명을 입력하십시오. + +설명문 + +게임 스크린샷 + +서명 메시지 편집: + +Minecraft: Xbox 360 Edition에서 제가 만든 것들을 보세요! + +고전적인 Minecraft 텍스처, 아이콘 및 사용자 인터페이스입니다! + +모든 매시업 월드 보이기 + +전송할 저장 슬롯을 선택합니다. + +슬롯을 비웁니다. + +저장 메타데이터를 업로드 중입니다. + +저장 데이터를 업로드 중입니다. + +Xbox One용 저장 파일을 업로드 중입니다. + +업로드 취소됨 + +이 저장 데이터를 저장 데이터 이전 영역에 업로드하는 중에 취소했습니다. + +효과 없음 + +속도 + +속도 저하 + +채굴 속도 향상 + +채굴 속도 저하 + +피해 강화 + +피해 약화 + +회복 + +피해 + +점프 강화 + +혼란 + +재생 + +저항 + +화염 저항 + +수중 호흡 + +투명화 + +맹목 + +야간 시야 + +배고픔 + + + +위더 + +체력 강화 + +흡수 + +포만 + +- 신속 + +- 속도 저하 + +- 채굴 속도 향상 + +- 둔함 + +- 피해 강화 + +- 피해 약화 + +- 회복 + +- 피해 + +- 도약 + +- 혼란 + +- 재생 + +- 저항 + +- 화염 저항 + +- 수중 호흡 + +- 투명화 + +- 맹목 + +- 야간 시야 + +- 배고픔 + +- 독 + +만큼 부패 + +만큼 체력 강화 + +만큼 흡수 + +만큼 포만 + + + +II + +III + +IV + +폭발 + +일반적인 + +시시한 + +단조로운 + +맑은 + +우유빛 + +뿌연 + +소박한 + +묽은 + +이상한 + +김이 빠진 + +투박한 + +엉터리 + +느끼한 + +부드러운 + +미끈미끈한 + +찰랑대는 + +짙은 + +우아한 + +고급스러운 + +화려한 + +근사한 + +정제된 + +따스한 + +거품이 이는 + +강력한 + +냄새나는 + +냄새 없는 + +고약한 + +거칠거칠한 + +매캐한 + +역겨운 + +지독한 + +모든 물약의 기본이 됩니다. 양조대에서 사용하여 물약을 만들 수 있습니다. + +그 자체로는 효과가 없습니다. 양조대에서 다른 재료를 추가로 넣어 효과를 추가할 수 있습니다. + +효과 대상 플레이어, 동물 및 괴물의 이동 속도가 빨라집니다. 플레이어의 질주 속도가 빨라지며 점프 거리와 시야 거리가 늘어납니다. + +효과 대상 플레이어, 동물 및 괴물의 이동 속도가 느려집니다. 플레이어의 질주 속도가 느려지며 점프 거리와 시야 거리가 줄어듭니다. + +효과 대상 플레이어 및 괴물의 공격력이 증가합니다. + +효과 대상 플레이어 및 괴물의 공격력이 감소합니다. + +효과 대상 플레이어, 동물 및 괴물의 체력이 즉시 증가합니다. + +효과 대상 플레이어, 동물 및 괴물의 체력이 즉시 감소합니다. + +효과 대상 플레이어, 동물 및 괴물의 체력이 서서히 회복합니다. + +효과 대상 플레이어, 동물 및 괴물이 불, 용암 및 Blaze의 원거리 공격에 피해를 받지 않게 됩니다. + +효과 대상 플레이어, 동물 및 괴물의 체력이 서서히 감소합니다. + +복용 시: + +말 점프 강화 + +좀비 증원 + +최대 체력 + +괴물 따라오기 거리 + +밀치기 저항 + +속도 + +공격력 + +예리 + +강타 + +절지동물 격파 + +타격 반동 + +화염 + +방어 + +화염 방어 + +낙하 방어 + +폭발 방어 + +발사체 방어 + +호흡 + +수분 친화력 + +효율성 + +채굴 정확성 + +견고 + +전리품 획득 + +희귀품 채굴 + +강화 + +화염 + +강타 + +무한 + +I + +II + +III + +IV + +V + +VI + +VII + +VIII + +IX + +X + +철 또는 그 이상의 곡괭이로 채굴하여 에메랄드를 얻을 수 있습니다. + +상자와 비슷하지만, Ender 상자에 넣은 아이템은 플레이어의 모든 Ender 상자에 공유됩니다. 다른 차원에 있는 Ender 상자도 마찬가지입니다. + +연결된 트립와이어를 통해 엔티티가 이동하면 작동합니다. + +엔티티가 통과하면 연결된 트립와이어 후크를 작동시킵니다. + +에메랄드를 쉽게 보관할 수 있습니다. + +조약돌로 만들어진 벽입니다. + +도구나 무기, 방어구를 만드는 데 사용합니다. + +용광로에서 제련하여 지하 석영을 만듭니다. + +장식으로 사용합니다. + +마을 사람과 거래할 수 있습니다. + +장식으로 사용합니다. 꽃, 묘목, 선인장, 버섯을 심을 수 있습니다. + +먹으면 {*ICON_SHANK_01*}를 2만큼 회복하며 황금 당근을 만드는 데 사용합니다. 농지에 심을 수 있습니다. + +먹어서 {*ICON_SHANK_01*}를 0.5만큼 회복하거나 화로에서 조리할 수 있습니다. 농지에 심을 수 있습니다. + +{*ICON_SHANK_01*}를 3만큼 회복합니다. 화로에서 감자를 조리하여 만듭니다. + +먹어서 {*ICON_SHANK_01*}를 1만큼 회복합니다. 먹으면 중독될 수 있습니다. + +{*ICON_SHANK_01*}를 3만큼 회복합니다. 당근과 금덩이를 사용해 만듭니다. + +안장 달린 돼지에 올라타 조종할 때 사용합니다. + +{*ICON_SHANK_01*}를 4만큼 회복합니다. + +모루에서 무기, 도구, 방어구에 효과를 부여할 때 사용합니다. + +지하 석영 광석을 채굴해서 만듭니다. 석영 블록으로 만들 수 있습니다. + +양털을 사용해 만듭니다. 장식으로 사용합니다. + +에메랄드 + +화분 + +당근 + +감자 + +구운 감자 + +독성 감자 + +황금 당근 + +당근 막대 + +호박 파이 + +효과부여 책 + +지하 석영 + +에메랄드 광석 + +Ender 상자 + +트립와이어 후크 + +트립와이어 + +에메랄드 블록 + +조약돌 벽 + +이끼 낀 조약돌 벽 + +화분 + +당근 + +감자 + +모루 + +모루 + +약간 망가진 모루 + +크게 망가진 모루 + +지하 석영 광석 + +석영 블록 + +깎아놓은 석영 블록 + +석영 블록 기둥 + +석영 계단 + +카펫 + +검은색 카펫 + +빨간색 카펫 + +초록색 카펫 + +갈색 카펫 + +파란색 카펫 + +보라색 카펫 + +청록색 카펫 + +밝은 회색 카펫 + +회색 카펫 + +분홍색 카펫 + +라임색 카펫 + +노란색 카펫 + +밝은 파란색 카펫 + +자주색 카펫 + +주황색 카펫 + +흰색 카펫 + +깎아놓은 사암 + +부드러운 사암 + +{*PLAYER*} {*SOURCE*} 공격 중에 사망 + +{*PLAYER*} 모루에 깔려 사망 + +{*PLAYER*} 블록에 깔려 사망 + +{*PLAYER*} {*DESTINATION*}(으)로 순간이동 + +{*PLAYER*}의 위치로 순간이동 + +{*PLAYER*}이(가) 현재 내 위치로 순간이동 + +가시 + +석영 발판 + +어두운 지역을 대낮처럼 밝힙니다. 물속에서도 효과가 있습니다. + +영향을 받은 플레이어와 동물, 몬스터를 투명하게 만듭니다. + +수리 및 이름 + +효과부여 비용: %d + +비용 부족! + +이름 바꾸기 + +소지: + +거래에 필요한 아이템 + +{*VILLAGER_TYPE*}의 제안: %s + +수리 + +거래 + +목줄 염색 + + + 이 화면은 모루 인터페이스입니다. 이곳에서 경험치를 지불하고 무기나 도구, 방어구 이름을 바꾸거나, 수리하거나, 효과를 부여합니다. + + + + {*B*} + 모루 인터페이스에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 단추를 누르십시오.{*B*} + 모루 인터페이스에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 단추를 누르십시오. + + + + 아이템으로 작업을 시작하려면 첫 번째 작업 슬롯에 넣으십시오. + + + + 올바른 원재료를 두 번째 작업 슬롯에 넣으면(예: 망가진 철제 검 수리 시 철 주괴 필요), 결과 슬롯에 수리 정보가 표시됩니다. + + + + 또는 두 번째 슬롯에 같은 아이템을 넣어 두 아이템을 조합할 수 있습니다. + + + + 모루에서 아이템에 효과를 부여하려면 효과부여책을 두 번째 작업 슬롯에 넣으십시오. + + + + 작업에 소비되는 경험치는 결과 정보 아래에 표시됩니다. 경험치가 부족하면 수리를 할 수 없습니다. + + + + 텍스트 상자에 다른 이름을 입력하여 아이템 이름을 바꿀 수 있습니다. + + + + 수리한 아이템을 집으면 모루에 넣은 두 아이템과 지정된 경험치가 소모됩니다. + + + + 이곳에는 도구 및 무기가 담긴 상자와 모루가 있습니다. + + + + {*B*} + 모루에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 단추를 누르십시오.{*B*} + 모루에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 단추를 누르십시오. + + + + 모루에서 무기와 도구를 수리해 내구도를 올리거나, 이름을 바꾸거나, 효과부여 책으로 효과를 부여할 수 있습니다. + + + + 효과부여 책은 던전에서 찾거나 효과부여대에서 일반 책에 효과를 부여해 만듭니다. + + + + 모루를 사용하면 경험치를 소비하며, 사용할 때마다 모루가 손상될 수 있습니다. + + + + 작업의 종류, 아이템 가치, 부여 효과 수, 기존 작업 수에 따라 수리비가 달라집니다. + + + + 아이템 이름을 바꾸면 모든 플레이어에게 보이는 이름도 변경되며, 이전 작업 비용이 영구적으로 감소합니다. + + + + 이곳의 상자에서는 손상된 곡괭이, 원재료, 경험치 병, 효과부여 책을 찾을 수 있습니다. + + + + 이곳은 마을 사람과 할 수 있는 거래 목록을 보여주는 거래 인터페이스입니다. + + + + {*B*} + 거래 인터페이스에 대해 알아보려면 {*CONTROLLER_VK_A*} 단추를 누르십시오.{*B*} + 거래 인터페이스에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 단추를 누르십시오. + + + + 마을 사람들이 원하는 거래 내용은 위쪽에 표시됩니다. + + + + 필요한 아이템이 없으면 거래가 빨간색으로 표시되며 진행이 불가능합니다. + + + + 마을 사람에게 제시하는 아이템 수량과 종류는 왼쪽의 상자 2개에 표시됩니다. + + + + 왼쪽의 상자 2개에서 거래에 필요한 아이템 총 수량을 확인할 수 있습니다. + + + + 마을 사람이 원하는 아이템으로 거래하려면 {*CONTROLLER_VK_A*} 단추를 누르십시오. + + + + 이곳에는 마을 사람과, 아이템 구매에 필요한 종이가 담긴 상자가 있습니다. + + + + {*B*} + 거래에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 단추를 누르십시오.{*B*} + 거래에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 단추를 누르십시오. + + + + 소지품에 있는 아이템을 마을 사람들과 거래할 수 있습니다. + + + + 마을 사람은 자신의 직업에 맞는 아이템을 거래하고 싶어합니다. + + + + 다양한 아이템을 거래하면 마을 사람이 원하는 거래 목록이 추가되거나 업데이트됩니다. + + + + 같은 거래를 너무 자주 하면 일시적으로 해당 거래를 할 수 없게 됩니다. 하지만 마을 사람은 항상 최소 1건의 거래 제안을 가지고 있습니다. + + + + 상자에서 종이를 꺼내 이곳의 마을 사람들과 거래해 보십시오. + + + + 이곳에는 Ender 상자 2개가 있습니다. + + + + {*B*} + Ender 상자에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 단추를 누르십시오.{*B*} + Ender 상자에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 단추를 누르십시오. + + + + 월드 내의 Ender 상자는 다른 차원에 있는 것까지 포함하여 모두 연결되어 있습니다. Ender 상자에 넣은 아이템은 다른 모든 Ender 상자에서 사용이 가능합니다. + + + + 하지만 Ender 상자의 내용물은 플레이어마다 다릅니다. + + + + 이에 따라 플레이어는 Ender 상자에 아이템을 넣고, 월드 내 다른 장소에 있는 Ender 상자에서 아이템을 꺼낼 수 있습니다. Ender 상자에 지금 아이템을 넣어 이 기능을 시험해볼 수 있습니다. + + +{*ICON_SHANK_01*}를 2만큼 회복하고 30초 동안 체력을 회복하며 5분 동안 화염 저항 및 방어력이 증가합니다. 사과와 황금 블록을 사용해 만듭니다. + +순간이동 가능 + +순간이동 + +플레이어에게로 순간이동 + +나에게로 순간이동 + +지치지 않게 설정 가능 + +투명화 사용 가능 + +투명화 사용 가능 + +투명화 사용 불가능 + +비행 가능 + +비행 불가능 + +지치지 않게 설정 가능 + +지치지 않게 설정 불가능 + +순간이동 가능 + +순간이동 불가능 + +{*T3*}플레이 방법 : 모루{*ETW*}{*B*}{*B*} +경험치 레벨은 모루에서 아이템을 수리하거나, 효과부여하거나, 이름을 바꾸는 데도 사용됩니다.{*B*} +아이템은 내구도가 있을 때만 수리할 수 있고 효과부여 책을 통해서만 효과를 얻지만, 이름은 어떤 아이템이든 바꿀 수 있습니다.{*B*} +왼쪽의 작업 슬롯에 아이템을 넣고, 원재료(예: 철제 검 수리 시 철 주괴)나 종류가 같은 다른 아이템을 함께 넣어 수리합니다.{*B*} +아이템은 모루에서 조합할 때 효과가 더 좋으며, 조합하는 아이템들에 모두 효과가 부여되어 있다면 결과물은 해당 효과들을 모두 이어받을 수 있습니다.{*B*} +효과부여 책은 효과가 적절할 경우 모루에서 다른 아이템과 조합하여 아이템에 효과를 부여할 수 있습니다. 효과부여 책은 던전에서 얻거나 효과부여대에서 일반 책에 효과를 부여해 만듭니다.{*B*} +모루를 사용하면 일정 확률로 손상되며, 손상이 심하면 모루가 부서집니다.{*B*} + + +{*T3*}플레이 방법 : 거래{*ETW*}{*B*}{*B*} +마을 사람들과 아이템을 거래할 수 있습니다. 마을 사람은 농부, 도축업자, 대장장이, 도서관 사서, 사제 등의 직업을 가지고 있으며, 이에 따라 각자 다른 아이템을 거래합니다.{*B*} +거래 메뉴에서 마을 사람이 제시할 수 있는 모든 거래 목록을 볼 수 있습니다. 플레이어와 거래하면 마을 사람의 거래 가능 목록이 바뀌거나 추가될 수 있으며, 너무 자주 거래하면 일시적으로 거래를 못 하게 될 수도 있습니다.{*B*} +거래는 주로 아이템을 에메랄드로 구매하거나 판매하는 형태로 이루어집니다. {*B*} +거래에 필요한 아이템을 가지고 있지 않으면 아이템이 빨간색으로 표시됩니다.{*B*} + + +{*T3*}플레이 방법 : Ender 상자 {*ETW*}{*B*}{*B*} +월드 안의 모든 Ender 상자는 연결되어 있어, 상자에 든 아이템은 어느 곳의 Ender 상자에서든 꺼낼 수 있습니다. 하지만 내용물은 플레이어마다 다릅니다. 플레이어는 아무 Ender 상자에 아이템을 넣고, 월드 내 다른 장소에 있는 아무 Ender 상자에서 아이템을 꺼낼 수 있습니다. + + +농부 + +도서관 사서 + +사제 + +대장장이 + +도축업자 + +마을에서 만날 수 있는 마을 사람은 직업에 따라 다양한 아이템을 팝니다. + +큰 상자 + + + 또한 효과부여대에서 효과부여 책을 만들 수 있습니다. 나중에 모루에서 효과부여 책을 사용해 아이템에 효과를 부여할 수 있습니다. + + + + 트립와이어 후크 사이의 선을 무언가가 작동시키면 회로에 계속 전력이 공급됩니다. + + + + 길들인 늑대는 항상 목줄을 착용하게 됩니다. 목줄은 염색해서 색을 바꿀 수 있습니다. + + +당근과 감자를 심어 재배할 수 있으며, 작물이 땅 위로 모습을 드러내면 수확할 수 있습니다. + + + 또한 돼지에게 안장을 씌워 타고 다닐 수 있습니다. 막대에 당근을 끼워 사용하면 돼지를 조종할 수 있습니다. + + + + {*CONTROLLER_ACTION_MOVE*} 단추를 사용해 광물 수레를 천천히 움직일 수 있습니다. 동력 레일 위에서 광물 수레를 움직이는 데 도움을 줍니다. + + +분활 화면은 고화질(HD) 모드에서만 지원되므로 게임에 참가할 수 없습니다. 참가하려면 다른 모든 플레이어를 로그아웃시킵니다. + +치유 + +Xbox 360 + +BACK + +이 옵션을 켜면 도전 과제를 획득할 수 없으며 순위표에 기록되지 않습니다. 플레이 도중에 옵션을 켜거나 옵션을 켠 후 저장한 게임을 다시 불러와도 마찬가지입니다. + +Xbox One용 저장 파일을 업로드합니다. + +저장 데이터 업로드 + +Xbox 360 본체 저장 데이터 하나만 데이터 이전 영역에 보관할 수 있습니다. 다른 Xbox 360 본체 저장 데이터를 업로드하기 전에, 이전 저장 데이터를 Xbox One 본체에 다운로드했는지 확인하십시오. + +업로드 중... + +업로드 완료! + +업로드하지 못했습니다. 나중에 다시 시도하십시오. + + diff --git a/Minecraft.Client/Common/Media/languages.loc b/Minecraft.Client/Common/Media/languages.loc new file mode 100644 index 00000000..c267b1ac Binary files /dev/null and b/Minecraft.Client/Common/Media/languages.loc differ diff --git a/Minecraft.Client/Common/Media/media.txt b/Minecraft.Client/Common/Media/media.txt new file mode 100644 index 00000000..2e10707b --- /dev/null +++ b/Minecraft.Client/Common/Media/media.txt @@ -0,0 +1,5 @@ +splashes.txt +HTMLColours.col +Graphics\SaveChest.png +Graphics\MinecraftIcon.png +Graphics\TexturePackIcon.png \ No newline at end of file diff --git a/Minecraft.Client/Common/Media/movies1080.txt b/Minecraft.Client/Common/Media/movies1080.txt new file mode 100644 index 00000000..782dd5bc --- /dev/null +++ b/Minecraft.Client/Common/Media/movies1080.txt @@ -0,0 +1,123 @@ +skinHDGraphics.swf +skinHDGraphicsHud.swf +skinHDGraphicsLabels.swf +skinHDGraphicsInGame.swf +skinHD.swf +skinHDHud.swf +skinHDLabels.swf +skinHDInGame.swf +AnvilMenu1080.swf +BeaconMenu1080.swf +BrewingStandMenu1080.swf +ChestMenu1080.swf +ChestLargeMenu1080.swf +ComponentLogo1080.swf +ComponentLogoSplit1080.swf +Controls1080.swf +ControlsRemotePlay1080.swf +CreateWorldMenu1080.swf +CreativeMenu1080.swf +Credits1080.swf +Crafting2x2Menu1080.swf +Crafting3x3Menu1080.swf +DeathMenu1080.swf +DebugCreateSchematic1080.swf +DebugMenu1080.swf +DebugOptionsMenu1080.swf +DebugSetCamera1080.swf +DebugUIConsoleComponent1080.swf +DebugUIMarketingGuide1080.swf +DLCMainMenu1080.swf +DispenserMenu1080.swf +EnchantingMenu1080.swf +EndPoem1080.swf +EULA1080.swf +FireworksMenu1080.swf +FullscreenProgress1080.swf +FurnaceMenu1080.swf +HelpAndOptionsMenu1080.swf +HopperMenu1080.swf +HorseInventoryMenu1080.swf +HowToPlay1080.swf +HowToPlayMenu1080.swf +HUD1080.swf +InGameHostOptions1080.swf +InGameInfoMenu1080.swf +InGamePlayerOptions1080.swf +InGameTeleportMenu1080.swf +Intro1080.swf +InventoryMenu1080.swf +JoinMenu1080.swf +LanguagesMenu1080.swf +LanguagesMenuSplit1080.swf +LoadOrJoinMenu1080.swf +LaunchMoreOptionsMenu1080.swf +LeaderboardMenu1080.swf +LoadMenu1080.swf +MainMenu1080.swf +MenuBackground1080.swf +MessageBox1080.swf +NewUpdateMessage1080.swf +Panorama1080.swf +PauseMenu1080.swf +PressStartToPlay1080.swf +QuadrantSignin1080.swf +ReinstallMenu1080.swf +SaveMenu1080.swf +SaveMessage1080.swf +SettingsMenu1080.swf +SettingsAudioMenu1080.swf +SettingsControlMenu1080.swf +SettingsGraphicsMenu1080.swf +SettingsOptionsMenu1080.swf +SettingsUIMenu1080.swf +SignEntryMenu1080.swf +SkinSelectMenu1080.swf +Timer1080.swf +ToolTips1080.swf +TradingMenu1080.swf +TutorialPopup1080.swf +AnvilMenuSplit1080.swf +BeaconMenuSplit1080.swf +BrewingStandMenuSplit1080.swf +ChestMenuSplit1080.swf +ChestLargeMenuSplit1080.swf +ControlsSplit1080.swf +Crafting2x2MenuSplit1080.swf +Crafting3x3MenuSplit1080.swf +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 +InGameHostOptionsSplit1080.swf +InGameInfoMenuSplit1080.swf +InGameTeleportMenuSplit1080.swf +InGamePlayerOptionsSplit1080.swf +InventoryMenuSplit1080.swf +MessageBoxSplit1080.swf +PanoramaSplit1080.swf +PauseMenuSplit1080.swf +ReinstallMenuSplit1080.swf +SettingsAudioMenuSplit1080.swf +SettingsControlMenuSplit1080.swf +SettingsGraphicsMenuSplit1080.swf +SettingsMenuSplit1080.swf +SettingsOptionsMenuSplit1080.swf +SettingsUIMenuSplit1080.swf +SignEntryMenuSplit1080.swf +SkinSelectMenuSplit1080.swf +TimerSplit1080.swf +ToolTipsSplit1080.swf +TradingMenuSplit1080.swf +TutorialPopupSplit1080.swf +Keyboard1080.swf +KeyboardSplit1080.swf \ No newline at end of file diff --git a/Minecraft.Client/Common/Media/movies480.txt b/Minecraft.Client/Common/Media/movies480.txt new file mode 100644 index 00000000..bbc4f2a5 --- /dev/null +++ b/Minecraft.Client/Common/Media/movies480.txt @@ -0,0 +1,61 @@ +AnvilMenu480.swf +BeaconMenu480.swf +BrewingStandMenu480.swf +ChestLargeMenu480.swf +ChestMenu480.swf +Controls480.swf +ComponentLogo480.swf +Crafting2x2Menu480.swf +Crafting3x3Menu480.swf +CreateWorldMenu480.swf +CreativeMenu480.swf +Credits480.swf +DeathMenu480.swf +DispenserMenu480.swf +DLCMainMenu480.swf +EnchantingMenu480.swf +EndPoem480.swf +EULA480.swf +FireworksMenu480.swf +FullscreenProgress480.swf +FurnaceMenu480.swf +HelpAndOptionsMenu480.swf +HopperMenu480.swf +HorseInventoryMenu480.swf +HowToPlay480.swf +HowToPlayMenu480.swf +HUD480.swf +InGameHostOptions480.swf +InGameInfoMenu480.swf +InGamePlayerOptions480.swf +Intro480.swf +InventoryMenu480.swf +JoinMenu480.swf +LanguagesMenu480.swf +LaunchMoreOptionsMenu480.swf +LeaderboardMenu480.swf +LoadMenu480.swf +LoadOrJoinMenu480.swf +MainMenu480.swf +MenuBackground480.swf +MessageBox480.swf +NewUpdateMessage480.swf +Panorama480.swf +PauseMenu480.swf +PressStartToPlay480.swf +ReinstallMenu480.swf +SaveMessage480.swf +SettingsAudioMenu480.swf +SettingsControlMenu480.swf +SettingsGraphicsMenu480.swf +SettingsMenu480.swf +SettingsOptionsMenu480.swf +SettingsUIMenu480.swf +SignEntryMenu480.swf +SkinSelectMenu480.swf +InGameTeleportMenu480.swf +Timer480.swf +ToolTips480.swf +TradingMenu480.swf +TrialExitUpsell480.swf +TutorialPopup480.swf \ No newline at end of file diff --git a/Minecraft.Client/Common/Media/movies720.txt b/Minecraft.Client/Common/Media/movies720.txt new file mode 100644 index 00000000..524fcee0 --- /dev/null +++ b/Minecraft.Client/Common/Media/movies720.txt @@ -0,0 +1,120 @@ +skinGraphics.swf +skinGraphicsHud.swf +skinGraphicsLabels.swf +skinGraphicsInGame.swf +skin.swf +skinHud.swf +skinLabels.swf +skinInGame.swf +AnvilMenu720.swf +BeaconMenu720.swf +BrewingStandMenu720.swf +ChestMenu720.swf +ChestLargeMenu720.swf +ComponentLogo720.swf +Controls720.swf +CreateWorldMenu720.swf +CreativeMenu720.swf +Credits720.swf +Crafting2x2Menu720.swf +Crafting3x3Menu720.swf +DeathMenu720.swf +DebugCreateSchematic720.swf +DebugMenu720.swf +DebugOptionsMenu720.swf +DebugSetCamera720.swf +DebugUIConsoleComponent720.swf +DebugUIMarketingGuide720.swf +DLCMainMenu720.swf +DispenserMenu720.swf +EnchantingMenu720.swf +EndPoem720.swf +EULA720.swf +FireworksMenu720.swf +FullscreenProgress720.swf +FurnaceMenu720.swf +HelpAndOptionsMenu720.swf +HopperMenu720.swf +HorseInventoryMenu720.swf +HowToPlay720.swf +HowToPlayMenu720.swf +HUD720.swf +InGameHostOptions720.swf +InGameInfoMenu720.swf +InGamePlayerOptions720.swf +InGameTeleportMenu720.swf +Intro720.swf +InventoryMenu720.swf +JoinMenu720.swf +LanguagesMenu720.swf +LanguagesMenuSplit720.swf +LoadOrJoinMenu720.swf +LaunchMoreOptionsMenu720.swf +LeaderboardMenu720.swf +LoadMenu720.swf +MainMenu720.swf +MenuBackground720.swf +MessageBox720.swf +NewUpdateMessage720.swf +Panorama720.swf +PauseMenu720.swf +PressStartToPlay720.swf +QuadrantSignin720.swf +ReinstallMenu720.swf +SaveMessage720.swf +SettingsMenu720.swf +SettingsAudioMenu720.swf +SettingsControlMenu720.swf +SettingsGraphicsMenu720.swf +SettingsOptionsMenu720.swf +SettingsUIMenu720.swf +SignEntryMenu720.swf +SkinSelectMenu720.swf +Timer720.swf +ToolTips720.swf +TradingMenu720.swf +TutorialPopup720.swf +AnvilMenuSplit720.swf +BeaconMenuSplit720.swf +BrewingStandMenuSplit720.swf +ChestMenuSplit720.swf +ChestLargeMenuSplit720.swf +ControlsSplit720.swf +ComponentLogoSplit720.swf +Crafting2x2MenuSplit720.swf +Crafting3x3MenuSplit720.swf +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 +InGameHostOptionsSplit720.swf +InGameInfoMenuSplit720.swf +InGamePlayerOptionsSplit720.swf +InventoryMenuSplit720.swf +MessageBoxSplit720.swf +PanoramaSplit720.swf +PauseMenuSplit720.swf +ReinstallMenuSplit720.swf +SettingsAudioMenuSplit720.swf +SettingsControlMenuSplit720.swf +SettingsGraphicsMenuSplit720.swf +SettingsMenuSplit720.swf +SettingsOptionsMenuSplit720.swf +SettingsUIMenuSplit720.swf +SignEntryMenuSplit720.swf +InGameTeleportMenuSplit720.swf +ToolTipsSplit720.swf +TradingMenuSplit720.swf +TrialExitUpsell720.swf +TutorialPopupSplit720.swf +SkinSelectMenuSplit720.swf \ No newline at end of file diff --git a/Minecraft.Client/Common/Media/moviesVita.txt b/Minecraft.Client/Common/Media/moviesVita.txt new file mode 100644 index 00000000..97627ca6 --- /dev/null +++ b/Minecraft.Client/Common/Media/moviesVita.txt @@ -0,0 +1,75 @@ +skinGraphics.swf +skinGraphicsHud.swf +skinGraphicsLabels.swf +skinGraphicsInGame.swf +skin.swf +skinHud.swf +skinLabels.swf +skinInGame.swf +AnvilMenuVita.swf +BeaconMenuVita.swf +BrewingStandMenuVita.swf +ChestLargeMenuVita.swf +ChestMenuVita.swf +ComponentLogoVita.swf +ControlsVita.swf +ControlsTVVita.swf +Crafting2x2MenuVita.swf +Crafting3x3MenuVita.swf +CreateWorldMenuVita.swf +CreativeMenuVita.swf +CreditsVita.swf +DeathMenuVita.swf +DispenserMenuVita.swf +DLCMainMenuVita.swf +EnchantingMenuVita.swf +EndPoemVita.swf +EULAVita.swf +FireworksMenuVita.swf +FullscreenProgressVita.swf +FurnaceMenuVita.swf +HelpAndOptionsMenuVita.swf +HopperMenuVita.swf +HorseInventoryMenuVita.swf +HowToPlayMenuVita.swf +HowToPlayVita.swf +HUDVita.swf +InGameHostOptionsVita.swf +InGameInfoMenuVita.swf +InGamePlayerOptionsVita.swf +InGameTeleportMenuVita.swf +IntroVita.swf +InventoryMenuVita.swf +JoinMenuVita.swf +LanguagesMenuVita.swf +LaunchMoreOptionsMenuVita.swf +LeaderboardMenuVita.swf +LoadMenuVita.swf +LoadOrJoinMenuVita.swf +MainMenuVita.swf +MenuBackgroundVita.swf +MessageBoxVita.swf +NewUpdateMessageVita.swf +PanoramaVita.swf +PauseMenuVita.swf +PressStartToPlayVita.swf +ReinstallMenuVita.swf +SaveMessageVita.swf +SettingsAudioMenuVita.swf +SettingsControlMenuVita.swf +SettingsGraphicsMenuVita.swf +SettingsMenuVita.swf +SettingsOptionsMenuVita.swf +SettingsUIMenuVita.swf +SignEntryMenuVita.swf +SkinSelectMenuVita.swf +TimerVita.swf +ToolTipsVita.swf +TradingMenuVita.swf +TutorialPopupVita.swf +DebugCreateSchematic720.swf +DebugMenu720.swf +DebugOptionsMenu720.swf +DebugSetCamera720.swf +DebugUIConsoleComponent720.swf +DebugUIMarketingGuide720.swf \ No newline at end of file diff --git a/Minecraft.Client/Common/Media/pt-BR/4J_strings.resx b/Minecraft.Client/Common/Media/pt-BR/4J_strings.resx new file mode 100644 index 00000000..0a28078a --- /dev/null +++ b/Minecraft.Client/Common/Media/pt-BR/4J_strings.resx @@ -0,0 +1,108 @@ + +Não Usado + +OK + +Voltar + +Cancelar + +Sim + +Não + +Salvamento Corrompido + +Seus dados de salvamento parecem estar corrompidos. Criar novo salvamento e substituir o corrompido? + +Sem Espaço Livre + +O dispositivo de armazenamento selecionado não tem espaço livre suficiente para salvar um jogo. + +Selecionar novamente + +Jogar sem salvar + +Criar novo salvamento + +Substituir salvamento? + +Seu dispositivo de armazenamento selecionado já contém este salvamento. Deseja substituí-lo? + +Não substituir + +Substituir e salvar + +Falha ao salvar + +Erro dispositivo armazenamento + +O dispositivo de armazenamento está indisponível ou tem um erro + +Seu dispositivo de armazenamento está indisponível ou tem um erro. Selecione outro dispositivo de armazenamento. + +Selecione outro dispos. armazen. + +Nenhum disp. armaz. selecionado + +Se não selecionar um dispositivo de armazenamento, o salvamento de jogos será desabilitado. + +Selecionar um dispos. de armaz. + +Continuar sem salvar + +O dispositivo de armazenamento foi removido. Selecione outro dispositivo. + +Falha ao carregar + +Nomeie o salvamento + +Digite um nome para salvar o jogo + +Voltar ao Menu Xbox + +Tem certeza de que deseja sair do jogo? + +Saiu + +Você voltou à tela de título porque seu perfil do jogador foi desconectado + +A partida terminou porque um perfil do jogador foi desconectado + +Continuar jogando + +Perfil do jogador não online + +Este jogo tem recursos que exigem um perfil do jogador habilitado para Xbox Live, mas você está offline no momento. + +Este recurso exige um perfil do jogador que esteja conectado ao Xbox Live. + +Conectar ao Xbox Live + +Continuar jogando offline + +Problema com Brinde de Conquista + + Houve um problema ao acessar seu perfil de jogador. Não foi possível conceder sua conquista no momento. + +Problema no perfil do jogador + +Falha ao salvar configurações no perfil do jogador. + +Perfil do Jogador Convidado + +O perfil do jogador convidado não pode acessar este recurso. Use um perfil do jogador diferente. + +Salvando… + +Salvando conteúdo. Não desligue o console. + +Desbloquear Jogo Completo + +Esta é a versão de avaliação do jogo Minecraft. Se você já tem a versão integral do jogo, acabou de ganhar uma conquista! +Desbloqueie a versão integral do jogo para curtir a diversão de Minecraft e para jogar com amigos de todo o mundo pelo Xbox Live. +Deseja desbloquear a versão integral do jogo? + +Você está voltando ao menu principal devido a um problema para ler seu perfil. + + diff --git a/Minecraft.Client/Common/Media/pt-BR/strings.resx b/Minecraft.Client/Common/Media/pt-BR/strings.resx new file mode 100644 index 00000000..67369181 --- /dev/null +++ b/Minecraft.Client/Common/Media/pt-BR/strings.resx @@ -0,0 +1,5157 @@ + +O novo Conteúdo para Baixar está disponível! Acesse-o pelo botão Loja Minecraft no Menu Principal. + +Você pode mudar o aspecto de seu personagem com um Pacote de Peles da Loja Minecraft. Selecione "Loja Minecraft" no Menu Principal e veja o que está disponível. + +Se você jogar este jogo no modo Alta Definição, poderá ter até quatro jogadores em tela dividida no mesmo console! + +Conecte os controles extras ao seu console e pressione START neles para entrar em um jogo a qualquer momento. + +Altere as configurações de gama para deixar o jogo mais claro ou mais escuro. + +Se você definir a dificuldade do jogo para Pacífico, sua energia regenerará automaticamente e nenhum monstro sairá à noite! + +Dê um osso a um lobo para torná-lo amigável. Depois, poderá fazê-lo sentar ou seguir você. + +Você pode soltar itens que estão no Inventário movendo o cursor para fora do menu e pressionando{*CONTROLLER_VK_A*} + +Ao dormir em uma cama à noite, o tempo passará rapidamente no jogo até o nascer do sol, mas todos os jogadores em um jogo multijogador devem estar na cama ao mesmo tempo. + +Colha costeletas dos porcos, cozinhe e coma-as para recuperar energia. + +Extraia couro das vacas e use-o para fazer armaduras. + +Se tiver um balde vazio, poderá enchê-lo com leite de uma vaca, com água ou lava! + +Use uma enxada para preparar áreas do solo para plantar. + +As aranhas não o atacarão durante o dia, a menos que você as ataque. + +Escavar solo ou areia com uma pá é mais rápido que com a mão! + +Comer costeletas de porco cozidas dá mais energia que comê-las cruas. + +Faça algumas tochas para iluminar áreas à noite. Os monstros evitam as áreas ao redor das tochas. + +Chegue aos destinos mais rápido com um carrinho de minas e trilhos! + +Plante algumas mudas e elas crescerão e se tornarão árvores. + +Os homens-porco não o atacarão, a menos que você os ataque. + +Você pode alterar seu ponto de criação no jogo e avançar até o nascer do sol dormindo em uma cama. + +Devolva aquelas bolas de fogo para o Ghast! + +Ao construir um portal, você poderá viajar para outra dimensão: o Submundo. + +Pressione{*CONTROLLER_VK_B*} para soltar o item que está em sua mão! + +Use a ferramenta certa para o trabalho! + +Se não encontrar carvão para suas tochas, faça carvão vegetal com árvores em uma fornalha. + +Cavar diretamente para baixo ou para cima não é uma boa ideia. + +O farelo de osso (fabricado com ossos de Esqueleto) pode ser usado como fertilizante e faz as coisas crescerem imediatamente! + +Os creepers explodirão se chegarem perto de você! + +A obsidiana é criada quando a água encontra um bloco de origem de lava. + +A lava poderá demorar alguns minutos para desaparecer COMPLETAMENTE quando o bloco de origem for removido. + +O pedregulho é resistente às bolas de fogo do Ghast, o que o torna útil para proteger portais. + +Blocos que podem ser usados como fonte de luz derretem neve e gelo. Eles incluem tochas, glowstone e lanternas de abóbora. + +Tome cuidado ao construir estruturas feitas de lã ao ar livre, pois relâmpagos de tempestades podem incendiar a lã. + +Um único balde de lava pode ser usado em uma fornalha para fundir 100 blocos. + +O instrumento tocado por um bloco de nota depende do material abaixo dele. + +Zumbis e esqueletos poderão sobreviver à luz do dia se estiverem na água. + +Se você atacar um lobo, todos os lobos da vizinhança ficarão hostis e o atacarão. Isso também acontece com os homens-porco zumbis. + +Os lobos não podem entrar no Submundo. + +Os lobos não atacam os Creepers. + +As galinhas põem ovos a cada 5 ou 10 minutos. + +A obsidiana só pode ser extraída com uma picareta de diamante. + +Os Creepers são a fonte de pólvora mais fácil de se obter. + +Se colocar dois baús lado a lado você terá um baú grande. + +Lobos mansos mostram a saúde pela posição da cauda. Dê carne a eles para curá-los. + +Cozinhe o cacto na fornalha para fazer o corante verde. + +Você receberá as últimas informações sobre este jogo de 4J Studios e Kappische no twitter! + +Impressione os amigos publicando capturas de tela de suas criações Minecraft no Facebook a partir do menu Pausa do jogo! + +Leia a seção O que há de novo nos menus Como jogar para ver as últimas atualizações no jogo. + +Agora há cercas empilháveis no jogo! + +O minecraftforum tem uma seção dedicada ao Xbox 360 Edition. + +Alguns animais seguirão você se tiver trigo na mão. + +Se um animal não puder se mover mais de 20 blocos em qualquer direção, ele não se desintegrará. + +Música de C418! + +Notch tem mais de um milhão de seguidores no twitter! + +Nem todas as pessoas na Suécia têm cabelos loiros. Alguns, como Jens de Mojang, são ruivos! + +Acreditamos que a 4J Studios removeu Herobrine do jogo no console Xbox 360, mas não temos certeza. + +No futuro haverá uma atualização deste jogo! + +Quem é Notch? + +Mojang tem mais prêmios que ajudantes! + +Algumas celebridades jogam Minecraft! + +deadmau5 curte o Minecraft! + +Não olhe diretamente para os bugs. + +Os Creepers nasceram de um bug de código. + +Isso é uma galinha ou um pato? + +Você estava na Minecon? + +Ninguém da Mojang já viu o rosto do Junkboy. + +Você sabia que existe um Wiki do Minecraft? + +O novo escritório da Mojang é maneiro! + +Minecraft: Xbox 360 Edition bateu muitos recordes! + +A Minecon 2013 foi em Orlando, na Flórida, EUA! + +.party() estava excelente! + +Considere os rumores sempre falsos, em vez de considerá-los verdadeiros! + +{*T3*}COMO JOGAR: NOÇÕES BÁSICAS{*ETW*}{*B*}{*B*} +Minecraft é um jogo que consiste em colocar blocos para construir qualquer coisa que imaginar. À noite os monstros aparecem; então, construa um abrigo antes que isso aconteça.{*B*}{*B*} +Use {*CONTROLLER_ACTION_LOOK*} para olhar à sua volta.{*B*}{*B*} +Use {*CONTROLLER_ACTION_MOVE*} para se mover.{*B*}{*B*} +Pressione {*CONTROLLER_ACTION_JUMP*} para pular.{*B*}{*B*} +Pressione {*CONTROLLER_ACTION_MOVE*} duas vezes para frente rapidamente para correr. Enquanto mantiver {*CONTROLLER_ACTION_MOVE*} pressionado para a frente, o personagem continuará correndo, a não ser que o tempo de corrida acabe ou que a Barra de Alimentos tenha menos de {*ICON_SHANK_03*}.{*B*}{*B*} +Mantenha {*CONTROLLER_ACTION_ACTION*} pressionado para extrair e cortar usando a mão ou o que estiver segurando. Talvez seja necessário fabricar uma ferramenta para extrair alguns blocos.{*B*}{*B*} +Se estiver segurando um item na mão, use {*CONTROLLER_ACTION_USE*} para utilizá-lo ou pressione {*CONTROLLER_ACTION_DROP*} para soltá-lo. + +{*T3*}COMO JOGAR: HUD{*ETW*}{*B*}{*B*} +O HUD mostra informações sobre seu status; sua energia, o oxigênio restante quando está debaixo da água, seu nível de fome (é preciso comer para reabastecer) e sua armadura, se estiver usando uma. Se você perder energia, mas tiver uma barrra de alimentos com 9 ou mais {*ICON_SHANK_01*}, sua energia será reabastecida automaticamente. Comer reabastece sua barra de alimentos. {*B*} +A Barra de Experiência também é mostrada aqui, com um valor numérico que mostra seu Nível de Experiência e a barra que indica quantos Pontos de Experiência são necessários para aumentar seu Nível de Experiência. Você ganha Pontos de Experiência coletando as Esferas de Experiência liberadas por multidões quando elas morrem, ao minerar alguns tipos de blocos, ao criar animais, pescar e fundir minérios na fornalha.{*B*}{*B*} +Também mostra os itens disponíveis para uso. Use {*CONTROLLER_ACTION_LEFT_SCROLL*} e {*CONTROLLER_ACTION_RIGHT_SCROLL*} para trocar o item em sua mão. + +{*T3*}COMO JOGAR: INVENTÁRIO{*ETW*}{*B*}{*B*} +Use {*CONTROLLER_ACTION_INVENTORY*} para ver seu inventário.{*B*}{*B*} +Essa tela mostra os itens disponíveis para uso em sua mão e todos os outros itens que está carregando. Sua armadura também é mostrada aqui.{*B*}{*B*} +Use{*CONTROLLER_MENU_NAVIGATE*} para mover o ponteiro. Use {*CONTROLLER_VK_A*} para pegar um item sob o ponteiro. Se houver mais de um item aqui, ele pegará todos ou você pode usar {*CONTROLLER_VK_X*} para pegar apenas metade deles.{*B*}{*B*} +Mova o item com o ponteiro sobre outro espaço no inventário e coloque-o lá usando {*CONTROLLER_VK_A*}. Se tiver vários itens no ponteiro, use {*CONTROLLER_VK_A*} para colocar todos ou {*CONTROLLER_VK_X*} para colocar apenas um.{*B*}{*B*} +Se o item sobre o qual você estiver for uma armadura, aparecerá uma dica de ferramenta para permitir a movimentação rápida para o espaço da armadura à direita no inventário.{*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*} +Use o ponteiro para mover itens entre o inventário e o baú.{*B*}{*B*} +Os itens no baú ficarão guardados lá para você até devolvê-los ao inventário mais tarde. + + +{*T3*}COMO JOGAR: BAÚ GRANDE{*ETW*}{*B*}{*B*} +Dois baús colocados lado a lado serão combinados para formar um Baú Grande. Ele pode guardar ainda mais itens. {*B*}{*B*} +É usado da mesma maneira que um baú normal. + + +{*T3*}COMO JOGAR: FABRICAÇÃO{*ETW*}{*B*}{*B*} +Na interface de fabricação, você pode combinar itens do seu inventário para criar novos tipos de itens. Use {*CONTROLLER_ACTION_CRAFTING*} para abrir a interface de fabricação.{*B*}{*B*} +Role pelas guias na parte superior usando {*CONTROLLER_VK_LB*} e {*CONTROLLER_VK_RB*} para selecionar o tipo de item que deseja criar e, em seguida, use {*CONTROLLER_MENU_NAVIGATE*} para selecionar o item a ser criado.{*B*}{*B*} +A área de fabricação mostra os itens necessários para criar o novo item. Pressione {*CONTROLLER_VK_A*} para criar o item e colocá-lo no inventário. + + +{*T3*}COMO JOGAR: BANCADA{*ETW*}{*B*}{*B*} +Você pode criar itens maiores usando uma bancada.{*B*}{*B*} +Coloque a bancada no mundo e pressione {*CONTROLLER_ACTION_USE*} para usá-la.{*B*}{*B*} +A fabricação de itens na bancada funciona da mesma maneira que a fabricação básica, mas você terá uma área maior para trabalhar e uma variedade maior de itens para criar. + + +{*T3*}COMO JOGAR: FORNALHA{*ETW*}{*B*}{*B*} +Com a fornalha você pode alterar os itens queimando-os. Por exemplo, você pode transformar minério de ferro em barras de ferro na fornalha.{*B*}{*B*} +Coloque a fornalha no mundo e pressione {*CONTROLLER_ACTION_USE*} para usá-la.{*B*}{*B*} +Você deve colocar combustível sob a fornalha e o item a ser queimado na parte superior. A fornalha acenderá e começará a funcionar.{*B*}{*B*} +Quando os itens estiverem queimados, você poderá movê-los da área de saída para seu inventário.{*B*}{*B*} +Se o item que você estiver examinando for um ingrediente ou combustível para a fornalha, aparecerão dicas de ferramenta para permitir a movimentação rápida para a fornalha. + + +{*T3*}COMO JOGAR: DISTRIBUIDOR{*ETW*}{*B*}{*B*} +O distribuidor é usado para projetar itens. Você deve colocar um acionador, como uma alavanca, ao lado do distribuidor para acioná-lo.{*B*}{*B*} +Para encher o distribuidor com itens, pressione {*CONTROLLER_ACTION_USE*} e mova os itens desejados do inventário para ele.{*B*}{*B*} +Então, quando usar o acionador, o distribuidor projetará um item. + + +{*T3*}COMO JOGAR : POÇÕES{*ETW*}{*B*}{*B*} +A criação de poções exige uma Barraca de Poções, que pode ser construída em uma bancada. Toda poção começa com uma garrafa de água, que é feita enchendo uma Garrafa de Vidro com água de um Caldeirão, ou de uma fonte de água.{*B*} +A Barraca de Poções tem três espaços para garrafas, para fazer três poções ao mesmo tempo. Um ingrediente pode ser usado em todas as três garrafas, então sempre faça três poções ao mesmo tempo para aproveitar melhor seus recursos.{*B*} +Ao colocar um ingrediente de poção na posição superior da Barraca de Poções, você terá uma poção básica depois de algum tempo. Ela não tem nenhum efeito por si só, mas se você colocar outro ingrediente com esta poção básica, terá uma poção com efeito.{*B*} +Depois que você tiver esta poção, pode adicionar um terceiro ingrediente para fazer o efeito durar mais tempo (usando pó de Redstone), para ser mais intenso (usando Pó de Glowstone) ou para ser uma poção maligna (usando o Olho de Aranha Fermentado).{*B*} +Você também pode adicionar pólvora a qualquer poção para transformá-la em uma Poção Tchibum, que pode ser atirada. Ao ser atirada, a Poção Tchibum aplicará o efeito da poção sobre toda a área em que cair.{*B*} + +Os ingredientes de origem das poções são :{*B*}{*B*} +* {*T2*}Verruga do Submundo{*ETW*}{*B*} +* {*T2*}Olho de Aranha{*ETW*}{*B*} +* {*T2*}Açúcar{*ETW*}{*B*} +* {*T2*}Lágrima de Ghast{*ETW*}{*B*} +* {*T2*}Pó de Chamas{*ETW*}{*B*} +* {*T2*}Creme de Magma{*ETW*}{*B*} +* {*T2*}Melão Cintilante{*ETW*}{*B*} +* {*T2*}Pó de Redstone{*ETW*}{*B*} +* {*T2*}Pò de Glowstone{*ETW*}{*B*} +* {*T2*}Olho de Aranha Fermentado{*ETW*}{*B*}{*B*} + +Você deve experimentar todas as combinações de ingredientes para descobrir todas as poções que pode fazer. + + +{*T3*}INSTRUÇÕES DE JOGO: FEITIÇOS{*ETW*}{*B*}{*B*} +Os Pontos de Experiência recolhidos quando um habitante morre ou quando certos blocos são extraídos ou fundidos numa fornalha podem ser usados para enfeitiçar algumas ferramentas, armaduras e livros.{*B*} +Quando é colocada uma Espada, Arco, Machado, Picareta, Pá, Armadura ou Livro no orifício por baixo do livro na Mesa de Feitiços, os três botões à direita do orifício apresentam alguns feitiços e os respectivos custos em Níveis de Experiência.{*B*} +Se você não tem Níveis de Experiência suficientes para usar, o custo aparecerá em vermelho, caso contrário, verde.{*B*}{*B*} +O feitiço aplicado é selecionado aleatoriamente com base no custo apresentado.{*B*}{*B*} +Se a Mesa de Feitiços estiver rodeada de Estantes (até um máximo de 15 Estantes), com um bloco de intervalo entre a Estante e a Mesa de Feitiços, o poder dos feitiços irá aumentar e serão vistos glifos misteriosos saindo do livro na Mesa de Feitiços.{*B*}{*B*} +Todos os ingredientes para uma Mesa de Feitiços podem ser encontrados nas aldeias, extraindo nas minas ou cultivando no mundo.{*B*}{*B*} +Os Livros Encantados são usados na Bigorna para aplicar feitiços aos itens. Desta forma você tem maior controle sobre os feitiços que deseja em seus itens.{*B*} + + +{*T3*}COMO JOGAR: CRIAÇÃO DE ANIMAIS{*ETW*}{*B*}{*B*} +Para manter seus animais em um só lugar, construa uma área cercada de menos de 20x20 blocos e coloque seus animais nela. Isso fará com que ainda estejam lá quando você voltar para vê-los. + + +{*T3*}COMO JOGAR: REPRODUÇÃO DE ANIMAIS{*ETW*}{*B*}{*B*} +Os animais do Minecraft podem se reproduzir e produzir seus próprios filhotes!{*B*} +Para que os animais se reproduzam, você deve dar a comida certa a eles para que entrem no "Modo do Amor".{*B*} +Dê Trigo para uma vaca, vacogumelo ou ovelha, dê cenouras para um porco, dê Sementes de Trigo ou Verruga do Submundo a uma galinha ou dê qualquer tipo de carne a um lobo e eles começarão a procurar outro animal da mesma espécie que também esteja no Modo do Amor.{*B*} +Quando dois animais da mesma espécie se encontrarem e ambos estiverem no Modo do Amor, eles se beijarão por alguns segundos e um filhote aparecerá. O filhote seguirá seus pais durante algum tempo, até crescer e se transformar em um animal adulto.{*B*} +Depois de ficar no Modo do Amor, o animal não poderá entrar nele de novo por cinco minutos.{*B*} +Há um limite para o número de animais que é possível ter em um mundo; portanto, os animais não se reproduzirão quando você já tiver muitos. + +{*T3*}COMO JOGAR: PORTAL DO SUBMUNDO{*ETW*}{*B*}{*B*} +Pelo Portal do Submundo, o jogador pode viajar entre o mundo da Superfície e o Submundo. O Submundo pode ser usado para viajar rapidamente na Superfície, pois a distância de viagem, um bloco no Submundo, equivale a 3 blocos na Superfície; portanto, ao construir um portal no Submundo e sair por ele, você estará 3 vezes mais longe do seu ponto de entrada.{*B*}{*B*} +São necessários no mínimo 3 blocos de Obsidiana para construir o portal, que deve ter 5 blocos de altura, 4 blocos de largura e 1 bloco de espessura. Quando a estrutura do portal estiver pronta, o espaço interno deverá ser queimado para ativá-lo. Isso pode ser feito usando o item Sílex e Aço ou o item Carga de Fogo.{*B*}{*B*} +Exemplos de construção de portais são mostrados na figura à direita. + + +{*T3*}COMO JOGAR: MULTIJOGADOR{*ETW*}{*B*}{*B*} +O Minecraft no console Xbox 360 é um jogo multijogador por padrão. Se você estiver jogando em um modo de Alta Definição, poderá incluir outros jogadores conectando os controles e pressionando START em qualquer ponto durante o jogo.{*B*}{*B*} +Ao iniciar ou participar de um jogo online, ele estará visível para as pessoas de sua lista de amigos (a não ser que você tenha selecionado Só Convidados como host do jogo) e, se eles entrarem no jogo, também estará visível para as pessoas da lista de amigos deles (se você tiver selecionado a opção Permitir Amigos dos Amigos).{*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*} +Gamertags não serão exibidas na captura de tela. + + +{*T3*}COMO JOGAR: BANINDO NÍVEIS{*ETW*}{*B*}{*B*} +Se você encontrar conteúdo ofensivo em um nível em que estiver jogando, poderá optar por adicioná-lo à sua lista de Níveis Banidos. +Para isso, abra o menu Pausar e pressione {*CONTROLLER_VK_RB*} para selecionar a dica de ferramenta de Banir Nível. +Se você tentar entrar nesse nível no futuro, será notificado de que ele está em sua lista de Níveis Banidos e poderá removê-lo da lista e continuar no nível ou sair. + +{*T3*}COMO JOGAR: MODO CRIATIVO{*ETW*}{*B*}{*B*} +A interface do modo criativo permite que qualquer item do jogo seja movido para o inventário do jogador sem precisar minerar ou fabricar aquele item. +Os itens no inventário do jogador não serão removidos quando forem colocados ou usados no mundo, e desta forma o jogador pode se concentrar na construção, em vez de coletar recursos.{*B*} +Se você criar, carregar ou salvar um mundo no Modo Criativo, as atualizações de conquistas e de placar de líderes estarão desabilitadas nesse mundo, mesmo que ele seja carregado depois no Modo Sobrevivência.{*B*} +Para voar quando estiver no Modo Criativo, pressione {*CONTROLLER_ACTION_JUMP*} duas vezes rapidamente. Para parar de voar, repita a ação. Para voar mais rápido, pressione {*CONTROLLER_ACTION_MOVE*} rapidamente duas vezes para frente enquanto estiver voando. +No modo de voo, você pode manter pressionado {*CONTROLLER_ACTION_JUMP*} para se mover para cima e {*CONTROLLER_ACTION_SNEAK*} para se mover para baixo ou usar {*CONTROLLER_ACTION_DPAD_UP*} para se mover para cima, {*CONTROLLER_ACTION_DPAD_DOWN*} para se mover para baixo, +{*CONTROLLER_ACTION_DPAD_LEFT*} para se mover para a esquerda e {*CONTROLLER_ACTION_DPAD_RIGHT*} para se mover para a direita. + +{*T3*}COMO JOGAR: OPÇÕES DE HOST E JOGADOR{*ETW*}{*B*}{*B*} + +{*T1*}Opções de Jogo{*ETW*}{*B*} +Ao carregar ou criar um mundo, você pode pressionar o botão "Mais Opções" para entrar em um menu que permita maior controle sobre o jogo.{*B*}{*B*} + + {*T2*}Jogador x Jogador{*ETW*}{*B*} + Quando habilitado, os jogadores podem causar danos a outros jogadores. Afeta somente o modo Sobrevivência.{*B*}{*B*} + + {*T2*}Confiar nos Jogadores{*ETW*}{*B*} + Quando desabilitado, os jogadores que entram no jogo têm restrições quanto ao que podem fazer. Eles não podem minerar nem usar itens, colocar blocos, usar portas e interruptores, usar recipientes nem atacar jogadores ou animais. Você pode mudar estas opções de um jogador específico usando o menu do jogo.{*B*}{*B*} + + {*T2*}Fogo Espalha{*ETW*}{*B*} + Quando habilitado, o fogo poderá se espalhar até blocos inflamáveis próximos. Esta opção também pode ser mudada no jogo.{*B*}{*B*} + + {*T2*}TNT Explode{*ETW*}{*B*} + Quando habilitado, a TNT explodirá quando ativada. Esta opção também pode ser mudada no jogo.{*B*}{*B*} + + {*T2*}Privilégios do Host{*ETW*}{*B*} + Quando habilitado, o host pode ativar ou desativar no menu do jogo sua habilidade de voar, desativar a exaustão e ficar invisível. {*DISABLES_ACHIEVEMENTS*}{*B*}{*B*} + + {*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*} + + {*T2*}Gerar Estruturas{*ETW*}{*B*} + Quando habilitado, estruturas como Vilas ou Fortalezas serão geradas no mundo.{*B*}{*B*} + + {*T2*}Mundo Superplano{*ETW*}{*B*} + Quando habilitado, um mundo completamente plano será gerado na Superfície e no Submundo.{*B*}{*B*} + + {*T2*}Baú de Bônus{*ETW*}{*B*} + Quando habilitado, um baú contendo alguns itens úteis será criado perto do ponto de criação do jogador.{*B*}{*B*} + + {*T2*}Reiniciar Submundo{*ETW*}{*B*} + Quando ativado, o Submundo é recriado. É útil quando se tem um jogo salvo mais antigo em que as Fortalezas do Submundo não estavam presentes.{*B*}{*B*} + + {*T1*}Opções no Jogo{*ETW*}{*B*} + Durante o jogo, várias opções podem ser acessadas pressionando {*BACK_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*} + +{*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á desativado. Quando esta opção estiver desabilitada o jogador não poderá causar danos a outros jogadores.{*B*}{*B*} + + {*T2*}Pode atacar animais{*ETW*}{*B*} + Esta opção só está disponível quando “Confiar nos Jogadores” está desativada. Quando a opção estiver desabilitada, o jogador não poderá causar nenhum dano em animais.{*B*}{*B*} + + {*T2*}Moderador{*ETW*}{*B*} + Quando esta opção está habilitada, o jogador pode usar algumas das opções do menu do jogo para mudar privilégios de outros jogadores e algumas opções de mundo.{*B*}{*B*} + + {*T2*}Expulsar Jogador{*ETW*}{*B*} + {*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*} + + {*T2*}Pode Voar{*ETW*}{*B*} + Quando esta opção está habilitada, o jogador pode voar. Esta opção só afeta o modo de Sobrevivência, pois todos os jogadores podem voar no modo Criativo.{*B*}{*B*} + + {*T2*}Desabilitar Exaustão{*ETW*}{*B*} + Esta opção só afeta o modo de Sobrevivência. Quando habilitado, as atividades físicas (voar/correr/pular etc.) não diminuem a barra de alimentos. Entretanto, se o jogador estiver ferido, a barra de alimentos diminuirá lentamente enquanto ele estiver se curando.{*B*}{*B*} + + {*T2*}Invisível{*ETW*}{*B*} + Quando esta opção está habilitada, o jogador não está visível para outros jogadores e é invulnerável.{*B*}{*B*} + + {*T2*}É possível Teleportar{*ETW*}{*B*} + Isto permite que o jogador mova a si mesmo ou outros jogadores para outros jogadores no mundo. + + +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 + +Noções Básicas + +HUD + +Inventário + +Baús + +Fabricação + +Fornalha + +Distribuidor + +Criação de Animais + +Reprodução de Animais + +Poções + +Feitiços + +Portal do Submundo + +Multijogador + +Compartilhando Capturas de Tela + +Banindo Níveis + +Modo Criativo + +Opções de Host e Jogador + +Negociando + +Bigorna + +Final + +{*T3*}COMO JOGAR: O FINAL{*ETW*}{*B*}{*B*} +O Final é outra dimensão no jogo que se alcança através de um Portal Final ativo. O Portal Final pode ser encontrado em uma Fortaleza, nas profundezas da Superfície.{*B*} +Para ativar o Portal Final, você terá de colocar um Olho de Ender em qualquer Estrutura do Portal Final que não tenha um.{*B*} +Quando o portal estiver ativo, pule nele para ir para o Final.{*B*}{*B*} +No Final você encontrará o Dragão Ender, um inimigo violento e poderoso, além de muitos Endermens; então, prepare-se muito bem para a batalha antes de ir para lá!{*B*}{*B*} +Você encontrará Cristais de Ender sobre oito estacas de Obsidiana que o Dragão Ender usa para se curar; +portanto, a primeira etapa da batalha é destruir cada uma delas.{*B*} +As primeiras é possível alcançar com flechas, mas as últimas estão protegidas por uma gaiola com Cerca de Ferro e você terá de chegar até elas.{*B*}{*B*} +Enquanto estiver fazendo isso, o Dragão Ender estará atacando você, voando em você e cuspindo bolas de ácido Ender.{*B*} +Se você se aproximar do Pódio do Ovo no centro das estacas, o Dragão Ender voará para baixo e o atacará e é nesse momento que você pode realmente causar algum dano a ele!{*B*} +Evite o sopro ácido e mire nos olhos do Dragão Ender para obter os melhores resultados. Se possível, traga alguns amigos para o Final para ajudá-lo na batalha.{*B*}{*B*} +Quando você estiver no Final, seus amigos poderão ver a localização do Portal Final dentro da Fortaleza nos respectivos mapas; +portanto, poderão facilmente se juntar a você. + + +Correr + +O Que Há de Novo + +{*T3*}Alterações e adições{*ETW*}{*B*}{*B*} +- Novos itens adicionados - 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*} + + +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. + +Usada para cavar terra, grama, areia, cascalho e neve mais rápido que à mão. As pás são necessárias para cavar bolas de neve. + +Necessário para extrair blocos relacionados à pedra e minério. + +Usado para cortar blocos relacionados à madeira mais rápido que à mão. + +Usada para trabalhar blocos de terra e grama para preparar para plantação. + +Portas de madeira são ativadas quando usadas, atingidas ou com Redstone. + +Portas de ferro só podem ser abertas com Redstone, botões ou acionadores. + +NOT USED + +NOT USED + +NOT USED + +NOT USED + +Fornece 1 de Armadura ao usuário. + +Dá ao usuário 3 de Armadura quando usado. + +Fornece 2 de Armadura ao usuário. + +Fornece 1 de Armadura ao usuário. + +Fornece 2 de Armadura ao usuário. + +Fornece 5 de Armadura ao usuário. + +Dá ao usuário 4 de Armadura quando usado. + +Fornece 1 de Armadura ao usuário. + +Fornece 2 de Armadura ao usuário. + +Fornece 6 de Armadura ao usuário. + +Fornece 5 de Armadura ao usuário. + +Fornece 2 de Armadura ao usuário. + +Fornece 2 de Armadura ao usuário. + +Fornece 5 de Armadura ao usuário. + +Dá ao usuário 3 de Armadura quando usado. + +Fornece 1 de Armadura ao usuário. + +Dá ao usuário 3 de Armadura quando usado. + +Fornece 8 de Armadura ao usuário. + +Fornece 6 de Armadura ao usuário. + +Dá ao usuário 3 de Armadura quando usado. + +Uma barra brilhante que pode ser usada para fabricar ferramentas desse material. Criada ao fundir minério na fornalha. + +Permite fabricar barras, pedras preciosas ou corantes em blocos posicionáveis. Pode ser usado como um bloco caro de construção ou para armazenamento compacto do minério. + +Usado para enviar carga elétrica quando pisado por um jogador, animal ou monstro. As chapas de pressão de madeira também podem ser ativadas deixando algo cair sobre elas. + +Usada para obter escadas compactas. + +Usado para fazer escadas longas. Dois degraus colocados um sobre o outro criam um bloco de degrau duplo de tamanho normal. + +Usado para fazer escadas longas. Dois degraus colocados um sobre o outro criarão um bloco com dois degraus e com tamanho normal. + +Usada para iluminar. As tochas também derretem neve e gelo. + +Usada como material de construção; pode ser usada para fabricar muitas coisas. Pode ser fabricada com qualquer tipo de madeira. + +Usado como material de construção. Não sofre ação da gravidade como a areia normal. + +Usado como material de construção. + +Usado para fabricar tochas, flechas, placas, escadas de mão, cercas e como cabos de ferramentas e armas. + +Usada para adiantar o tempo de qualquer ponto da noite até a manhã, se todos os jogadores no mundo estiverem na cama, e mudar o ponto de criação do jogador. +As cores da cama são sempre as mesmas, independentemente da cor da lã usada. + +Permite fabricar maior variedade de itens que a fabricação normal. + +Permite fundir minério, fazer carvão e vidro e cozinhar peixe e costeletas de porco. + +Armazena blocos e itens no interior. Coloque dois baús lado a lado para criar um baú maior com o dobro da capacidade. + +Usado como barreira que não pode ser pulada. Conta como 1,5 bloco de altura para jogadores, animais e monstros, mas como 1 bloco de altura para outros blocos. + +Usada para escalar verticalmente. + +Ativados quando usados, atingidos ou com Redstone. Funcionam como portas normais, mas são blocos de um por um e são colocados diretamente no chão. + +Mostra o texto digitado por você ou por outros jogadores. + +Usado para iluminar mais que tochas. Derrete neve/gelo e pode ser usado embaixo d'água. + +Usado para causar explosões. Ativado após a colocação com ignição por Sílex e Aço ou com carga elétrica. + +Usada para guardar sopa de cogumelo. Você fica com a vasilha depois de comer a sopa. + +Usado para guardar e transportar água, lava e leite. + +Usado para armazenar e transportar água. + +Usado para armazenar e transportar lava. + +Usado para armazenar e transportar leite. + +Usado para criar fogo, detonar TNT e abrir um portal depois de construído. + +Usada para pegar peixes. + +Mostra as posições do sol e da lua. + +Aponta para seu ponto inicial. + +Cria uma imagem da área explorada enquanto você o segura. Pode ser usado para encontrar caminhos. + +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. + +Restaura 1{*ICON_SHANK_01*}. + +Restaura 1{*ICON_SHANK_01*}. + +Restaura 3{*ICON_SHANK_01*}. + +Restaura 1{*ICON_SHANK_01*}, ou pode ser cozinhado na fornalha. Comer assim pode te envenenar. + +Restaura 3{*ICON_SHANK_01*}. Criado ao cozinhar a carne crua na fornalha. + +Restaura 1,5{*ICON_SHANK_01*}, ou pode ser cozinhado na fornalha. + +Restaura 4{*ICON_SHANK_01*}. Criado ao cozinhar a carne crua na fornalha. + +Restaura 1.5{*ICON_SHANK_01*}, ou pode ser cozinhado na fornalha. + +Restaura 4{*ICON_SHANK_01*}. Criado ao cozinhar a carne crua na fornalha. + +Restaurar 1{*ICON_SHANK_01*} ou pode ser cozinhado na fornalha. Também pode ser dado para o Ocelote comer, para torná-lo amigável. + +Restaurar 2,5{*ICON_SHANK_01*}. Criado ao cozinhar a carne crua na fornalha. + +Restaura 2{*ICON_SHANK_01*} e pode ser usada para fabricar uma maçã dourada. + +Restaura 2{*ICON_SHANK_01*} e regenera a energia por 4 segundos. Criado com uma maçã e barras de ouro. + +Restaura 2{*ICON_SHANK_01*}. Comer isso pode te envenenar. + +Usado em receita de bolo, e como ingrediente de poções. + +Usado para enviar uma carga elétrica ao ser ligado ou desligado. Fica na posição ligado ou desligado até ser apertado novamente. + +Envia constantemente uma carga elétrica ou pode ser usado como receptor/transmissor quando conectado à lateral de um bloco. +Também pode ser usado para pouca iluminação. + +Usado em circuitos de Redstone como repetidor, retardador e/ou diodo. + +Usado para enviar uma carga elétrica ao ser pressionado. Continua ativado por cerca de um segundo antes de desligar novamente. + +Usado para guardar e projetar itens em ordem aleatória quando recebe uma carga de Redstone. + +Reproduz uma nota quando acionado. Acerte-o para alterar o tom da nota. Se for colocado sobre blocos diferentes, alterará o tipo de instrumento. + +Usado para guiar carrinhos de minas. + +Quando ativado, acelera os carrinhos de minas que passam sobre ele. Quando desativado, faz os carrinhos pararem nele. + +Funciona como uma chapa de pressão (envia um sinal Redstone quando ativado), mas só pode ser ativado por um Carrinho de Minas. + +Usado para transportar você, um animal ou um monstro sobre trilhos. + +Usado para transportar mercadorias sobre trilhos. + +Andará sobre trilhos e poderá empurrar outros carrinhos de minas, se for colocado carvão nele. + +Usado para viajar pela água mais rapidamente do que nadando. + +Coletada das ovelhas, pode ser tingida com corantes. + +Usado como material de construção e pode ser tingido com corantes. Esta receita não é recomendada porque a lã pode ser obtida facilmente das ovelhas. + +Usado como corante para criar lã preta. + +Usado como corante para criar lã verde. + +Usado como corante para criar lã marrom, como ingrediente de biscoitos ou para cultivar Vagens de Cacau. + +Usado como corante para criar lã prateada. + +Usado como corante para criar lã amarela. + +Usado como corante para criar lã vermelha. + +Usado para fazer brotar instantaneamente colheitas, árvores, grama alta, cogumelos enormes e flores. Pode ser usado em receitas de corantes. + +Usado como corante para criar lã rosa. + +Usado como corante para criar lã laranja. + +Usado como corante para criar lã verde-lima. + +Usado como corante para criar lã cinza. + +Usado como corante para criar lã cinzenta. +(Observação: o corante cinzento também pode ser criado combinando corante cinza com farelo de osso, permitindo criar quatro corantes cinzentos com cada saco de tinta, em vez de três.) + +Usado como corante para criar lã azul-claro. + +Usado como corante para criar lã ciano. + +Usado como corante para criar lã roxa. + +Usado como corante para criar lã magenta. + +Usado como corante para criar lã azul. + +Toca discos de música. + +Usado para criar ferramentas, armas ou armaduras muito fortes. + +Usado para iluminar mais que tochas. Derrete neve/gelo e pode ser usado embaixo d'água. + +Usado para criar livros e mapas. + +Usado para criar uma estante de livros ou enfeitiçado para fazer Livros Encantados. + +Permite a criação de feitiços mais poderosos quando colocado ao redor de uma Mesa de Feitiços. + +Usada como decoração. + +Pode ser extraído com uma picareta de ferro ou de material melhor e depois fundido na fornalha para produzir barras de ouro. + +Pode ser extraído com uma picareta de pedra ou de material melhor e depois fundido na fornalha para produzir barras de ferro. + +Pode ser extraído com uma picareta para coletar carvão. + +Pode ser extraído com uma picareta de pedra ou de material melhor para coletar lápis-azul. + +Pode ser extraído com uma picareta de ferro ou de material melhor para coletar diamantes. + +Pode ser extraído com uma picareta de ferro ou de material melhor para coletar pó de redstone. + +Pode ser extraída com uma picareta para coletar pedregulhos. + +Coletada com uma pá. Pode ser usada para construção. + +Pode ser plantada e quando crescer será uma árvore. + +Não pode ser quebrada. + +Ateia fogo em qualquer coisa que a toca. Pode ser coletada em um balde. + +Coletada com uma pá. Pode ser fundida em vidro usando a fornalha. Sofrerá ação da gravidade se não houver outra peça sob ela. + +Coletado com uma pá. Pode produzir sílex quando cavado. Sofrerá ação da gravidade se não houver outra peça sob ele. + +Cortada com um machado; pode ser usada para fabricar tábuas ou como combustível. + +Criado na fornalha ao fundir areia. Pode ser usado para construção, mas quebrará se tentar extraí-lo. + +Extraído de pedra usando uma picareta. Pode ser usado para construir uma fornalha ou ferramentas de pedra. + +Argila cozida na fornalha. + +Pode ser cozida na fornalha para fazer tijolos. + +Quando quebrado, derruba bolas de argila que podem ser cozidas para fazer tijolos na fornalha. + +Um modo compacto de armazenar bolas de neve. + +Pode ser cavada com uma pá para criar bolas de neve. + +Pode produzir sementes de trigo quando quebrada. + +Pode ser usada para fabricar corante. + +Pode ser combinado com uma vasilha para fabricar sopa. + +Só pode ser extraída com uma picareta de diamante. É produzida pelo encontro de água e lava parada e é usada para construir um portal. + +Gera monstros no mundo. + +É colocado no chão para transportar uma carga elétrica. Quando cozido com uma poção, aumentará a duração do efeito. + +Quando alcançarem a fase de pleno crescimento, as colheitas poderão ser coletadas para obter trigo. + +Solo que foi preparado para o plantio de sementes. + +Pode ser cozido em uma fornalha para fabricar corante verde. + +Pode ser usada para fabricar açúcar. + +Pode ser usada como capacete ou combinada com uma tocha para fabricar uma lanterna de abóbora. Também é o ingrediente principal da Torta de Abóbora. + +Queima para sempre se for acesa. + +Torna mais lento o movimento de quem anda sobre ele. + +Pare no portal para atravessar entre a Superfície e o Submundo. + +Usado como combustível na fornalha ou para fabricar uma tocha. + +Coletado ao matar uma aranha e pode ser usado para fabricar um arco ou vara de pescar, ou colocado no chão para criar um Disparador. + +Coletada ao matar uma galinha e pode ser usada para fabricar uma flecha. + +Coletada ao matar um creeper e pode ser usada para fabricar TNT, ou usada como ingrediente em poções. + +Pode ser plantada no campo para colheita. Verifique se há luz suficiente para as sementes crescerem! + +Coletado nas colheitas e pode ser usado para fabricar alimentos. + +Coletado ao cavar cascalho e pode ser usado para fabricar sílex e aço. + +Quando usada em um porco, permite montar nele. O porco poderá ser direcionado usando uma cenoura na vareta. + +Coletada ao cavar neve e pode ser atirada. + +Coletado ao matar uma vaca e pode ser usado para fabricar uma armadura ou para fazer livros. + +Coletado ao matar um slime, e usado como ingrediente de poções ou fabricar Pistões Aderentes. + +As galinhas soltam aleatoriamente e pode ser usado para fabricar alimentos. + +Coletado ao extrair Glowstone e pode ser usado para fabricar blocos de Glowstone novamente ou cozido com uma poção para aumentar a potência do efeito. + +Coletado ao matar um esqueleto. Pode ser usado para fabricar farelo de osso. Você pode alimentar um lobo com isto para domá-lo. + +Coletado ao fazer um esqueleto matar um creeper. Pode ser tocado em uma jukebox. + +Apaga o fogo e ajuda as plantações a crescerem. Pode ser coletada em um balde. + +Quando quebrada, às vezes derruba uma muda que pode ser replantada para se tornar uma árvore. + +Encontrada em masmorras, pode ser usada para construção e decoração. + +Usado para obter lã da ovelha e colher blocos de folhas. + +Quando acionado (usando um botão, alavanca, placa de pressão, tocha de redstone ou redstone com algum destes), um pistão estende-se, se possível, e empurra blocos. + +Quando acionado (usando um botão, alavanca, placa de pressão, tocha de redstone ou redstone com algum destes), um pistão estende-se, se possível, e empurra blocos. Quando se retrai, puxa o bloco novamente, tocando a parte estendida do pistão. + +Feita com blocos de pedra, geralmente encontrada em Fortalezas. + +Usado como barreira, semelhante às cercas. + +Semelhante a uma porta, mas usado principalmente com cercas. + +Pode ser fabricado com Fatias de Melão. + +Blocos transparentes que podem ser usados no lugar dos blocos de vidro. + +Podem ser plantadas para cultivar abóboras. + +Podem ser plantadas para cultivar melões. + +Derrubado pelo Enderman quando ele morre. Quando atirado, o jogador será teleportado até a posição em que a Pérola do Ender cair e perderá um pouco de energia. + +Um bloco de terra com grama crescendo sobre ela. Coletado usando uma pá. Pode ser usado para construção. + +Pode ser usada para construção e decoração. + +Deixa o movimento mais lento quando atravessada. Pode ser destruída usando tosquiadeiras para coletar fios. + +Cria uma Traça quando destruída. Também pode criar Traças se estiver perto de outra Traça que esteja sendo atacada. + +Cresce ao longo do tempo quando colocada. Pode ser coletada usando tosquiadeiras. Pode ser escalada como uma escada. + +É escorregadio. Transforma-se em água se estiver sobre outro bloco quando destruído. Derrete se estiver muito perto de uma fonte de luz ou quando colocado no Submundo. + +Pode ser usado como decoração. + +Usado para fazer poções e para localizar Fortalezas. É derrubado pelas Chamas que ficam dentro ou perto das Fortalezas do Submundo. + +Usado para fazer poções. É derrubado pelos Ghasts, quando eles morrem. + +É derrubado pelos Homens-Porco Zumbis quando eles morrem. Os Homens-Porco Zumbis podem ser encontrados no Submundo. É usado como ingrediente de poções. + +Usado para fazer poções. Pode ser encontrado naturalmente nas Fortalezas do Submundo. Também pode ser plantado na Areia Movediça. + +Quando usada pode ter vários efeitos, dependendo de onde for usada. + +Pode ser enchida com água e usada como o ingrediente inicial de uma poção na Barraca de Poções. + +Este é um alimento venenoso e item de poção. É derrubado quando uma Aranha ou Aranha de Caverna é morta por um jogador. + +Usado para fazer poções, especialmente para criar poções com efeito negativo. + +Usado para fazer poções ou fabricado com outros itens para fazer o Olho de Ender ou o Creme de Magma. + +Usado para fazer poções. + +Usado para fazer Poções e Poções Tchibum. + +Pode ser enchido com água usando um balde de água, e pode ser usado para encher Garrafas de Vidro com água. + +Quando atirado, mostrará a direção para um Portal Final. Quando doze deles forem colocados nas estruturas do Portal Final, o Portal Final será ativado. + +Usado para fazer poções. + +Similar aos Blocos de Grama, mas muito bom para cultivar cogumelos. + +Flutua na água e permite andar em cima. + +Usado para construir Fortalezas do Submundo. É imune às bolas de fogo do Ghast. + +Usado em Fortalezas do Submundo. + +Encontrado em Fortalezas do Submundo; derruba Verrugas do Submundo quando quebrado. + +Desta forma os jogadores podem enfeitiçar Espadas, Picaretas, Machados, Pás, Arcos e Armadura, usando os Pontos de Experiência do jogador. + +Isto pode ser ativado usando doze Olhos de Ender, e o jogador poderá viajar até a dimensão Final. + +Usado para formar um Portal Final. + +Um tipo de bloco encontrado no Final. Ele tem resistência muito alta a explosões, portanto, é bem útil para construções. + +Este bloco é criado ao derrotar o Dragão no Final. + +Quando atirada, derruba Esferas de Experiência que aumentam seus pontos de experiência quando coletadas. + +Útil para incendiar as coisas, ou para iniciar fogos aleatórios quando lançado de um Distribuidor. + +É semelhante a uma vitrine e exibirá o item ou bloco colocado nele. + +Quando lançado pode criar uma criatura do tipo indicado. + +Usado para fazer escadas longas. Dois degraus colocados um sobre o outro criam um bloco de degrau duplo de tamanho normal. + +Usado para fazer escadas longas. Dois degraus colocados um sobre o outro criam um bloco de degrau duplo de tamanho normal. + +Criado pela fusão de Pedra Inflamável em uma fornalha. Pode ser transformado em Blocos do Submundo. + +Quando carregado, ele emite luz. + +Pode ser cultivado para coletar grãos de cacau. + +As Cabeças de multidão podem ser colocadas como decoração, ou usadas como máscara na abertura do capacete. + +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 + +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 + +Mapa vazio + +Disco - "13" + +Disco de Música - "cat" + +Disco de Música - "blocks" + +Disco de Música - "chirp" + +Disco de Música - "far" + +Disco de Música - "mall" + +Disco de Música - "mellohi" + +Disco de Música - "stal" + +Disco de Música - "strad" + +Disco de Música - "ward" + +Disco - "11" + +Disco de Música - "where are we now" + +Tosquiadeira + +Sementes de Abóbora + +Sementes de Melão + +Frango Cru + +Frango Cozido + +Carne Crua + +Bife + +Carne Podre + +Pérola do Ender + +Fatia de Melão + +Vara de Chamas + +Lágrima de Ghast + +Pepita de Ouro + +Verruga do Submundo + +{*splash*}{*prefix*}Poção {*postfix*} + +Garrafa de Vidro + +Garrafa de Água + +Olho de Aranha + +Olho de Aranha Fermentado + +Pó de Chamas + +Creme de Magma + +Barraca de Poções + +Caldeirão + +Olho de Ender + +Melão Cintilante + +Garrafa de Feitiços + +Carga de Fogo + +Carga de Fogo (Carvão Vegetal) + +Carga de Fogo (Carvão) + +Quadro de Item + +Criar {*CREATURE*} + +Bloco do Submundo + +Caveira + +Caveira do esqueleto + +Caveira do esqueleto murcho + +Cabeça de zumbi + +Cabeça + +Cabeça de %s + +Cabeça de creeper + +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 + +Terra + +Pedregulho + +Tábuas de Carvalho + +Tábuas de Abeto + +Tábuas de Bétula + +Tábua de madeira de floresta + +Tábuas (qualquer tipo) + +Muda + +Muda de Carvalho + +Muda de Abeto + +Muda de Bétula + +Broto de árvore da floresta + +Pedra Indestrutível + +Água + +Lava + +Areia + +Arenito + +Cascalho + +Minério de Ouro + +Minério de Ferro + +Minério de Carvão + +Madeira + +Madeira de Carvalho + +Madeira de Abeto + +Madeira de Bétula + +Madeira de floresta + +Carvalho + +Abeto + +Bétula + +Folhas + +Folhas de Carvalho + +Folhas de Abeto + +Folhas de Bétula + +Folhas de floresta + +Esponja + +Vidro + + + +Lã Preta + +Lã Vermelha + +Lã Verde + +Lã Marrom + +Lã Azul + +Lã Roxa + +Lã Ciano + +Lã Cinzenta + +Lã Cinza + +Lã Rosa + +Lã Verde-lima + +Lã Amarela + +Lã Azul-claro + +Lã Magenta + +Lã Laranja + +Lã Branca + +Flor + +Rosa + +Cogumelo + +Bloco de Ouro + +Uma forma compacta de armazenar ouro. + +Uma forma compacta de armazenar ferro. + +Bloco de Ferro + +Degrau de Pedra + +Degrau de Pedra + +Degrau de Arenito + +Degrau de Carvalho + +Degrau de Pedregulho + +Degrau de Tijolo + +Degrau Bloc. Pedra + +Degrau de Carvalho + +Degrau de Abeto + +Degrau de Bétula + +Chapa de madeira de floresta + +Degrau de Bloco do Submundo + +Tijolos + +TNT + +Estante de Livros + +Pedra de Musgo + +Obsidiana + +Tocha + +Tocha (Carvão) + +Tocha (Carvão Vegetal) + +Fogo + +Criador de Monstros + +Escada de Carvalho + +Baú + +Pó de Redstone + +Minério de Diamante + +Bloco de Diamante + +Uma forma compacta de armazenar diamantes. + +Bancada + +Colheitas + +Campo + +Fornalha + +Placa + +Porta de Madeira + +Escada de Mão + +Trilho + +Trilho com Propulsão + +Trilho Detector + +Escadas de Pedra + +Alavanca + +Chapa de Pressão + +Porta de Ferro + +Minério de Redstone + +Tocha de Redstone + +Botão + +Neve + +Gelo + +Cacto + +Argila + +Cana-de-açúcar + +Jukebox + +Cerca + +Abóbora + +Lanterna de Abóbora + +Pedra Inflamável + +Areia Movediça + +Glowstone + +Portal + +Minério de Lápis-azul + +Bloco Lápis-azul + +Uma forma compacta de armazenar lápis lazuli. + +Distribuidor + +Bloco de Nota + +Bolo + +Cama + +Teia + +Grama Alta + +Arbusto Seco + +Diodo + +Baú Trancado + +Alçapão + +Lã (qualquer cor) + +Pistão + +Pistão Aderente + +Bloco Traça + +Blocos de Pedra + +Blocos de Pedra com Musgo + +Blocos de Pedra Rachada + +Tijolos de pedra cinzentos + +Cogumelo + +Cogumelo + +Barras de Ferro + +Painel de Vidro + +Melão + +Broto de Abóbora + +Broto de Melão + +Vinhas + +Portão de Cerca + +Escadas de Blocos + +Escadas de Blocos de Pedra + +Pedra Traça + +Pedregulho de Traça + +Bloco de pedra de Traça + +Micélio + +Vitória Régia + +Bloco do Submundo + +Cerca de Blocos do Submundo + +Escadas de Blocos do Submundo + +Verruga do Submundo + +Bancada de Feitiços + +Barraca de Poções + +Caldeirão + +Portal Final + +Estrutura do Portal Final + +Pedra Final + +Ovo de Dragão + +Arbusto + +Samambaia + +Escada de Arenito + +Escada de Abeto + +Escada de Bétula + +Escada de madeira de floresta + +Lâmpada de Redstone + +Cacau + +Caveira + +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 + +Mover/Correr + +Olhar + +Pausar + +Pular + +Pular/Voar Acima + +Inventário + +Rodízio de Itens + +Ação + +Usar + +Fabricação + +Soltar + +Esgueirar-se + +Esgueirar-se/Voar Abaixo + +Alterar Modo de Câmera + +Jogadores/Convidar + +Movimento (Ao Voar) + +Estilo 1 + +Estilo 2 + +Estilo 3 + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +{*B*}Pressione{*CONTROLLER_VK_A*} para continuar. + +{*B*}Pressione{*CONTROLLER_VK_A*} para iniciar o tutorial.{*B*} + Pressione{*CONTROLLER_VK_B*} se achar que está pronto para jogar sozinho. + +Minecraft é um jogo onde você coloca blocos para construir qualquer coisa que imaginar. +À noite os monstros aparecem; então, construa um abrigo antes que isso aconteça. + +Use{*CONTROLLER_ACTION_LOOK*} para olhar para cima, para baixo e ao redor. + +Use{*CONTROLLER_ACTION_MOVE*} para se mover. + +Para correr, pressione {*CONTROLLER_ACTION_MOVE*}para frente rapidamente duas vezes. Enquanto mantiver {*CONTROLLER_ACTION_MOVE*}pressionado, o personagem continuará a correr, a não ser que o tempo de corrida ou o alimento acabe. + +Pressione{*CONTROLLER_ACTION_JUMP*} para pular. + +Mantenha{*CONTROLLER_ACTION_ACTION*} pressionado para extrair e cortar usando a mão ou o que estiver segurando. Talvez seja necessário fabricar uma ferramenta para extrair alguns blocos... + +Mantenha{*CONTROLLER_ACTION_ACTION*} pressionado para cortar 4 blocos de madeira (troncos de árvore).{*B*}Quando um bloco quebra, você pode pegá-lo ficando perto do item flutuante exibido, fazendo-o aparecer em seu inventário. + +Pressione{*CONTROLLER_ACTION_CRAFTING*} para abrir a interface de fabricação. + +Conforme você coleta e fabrica itens, seu inventário vai enchendo.{*B*} + Pressione{*CONTROLLER_ACTION_INVENTORY*} para abrir o inventário. + +Conforme você se move, extrai ou ataca, sua barra de alimentos vai esvaziando {*ICON_SHANK_01*}. Correr e correr pulando consomem muito mais alimento que caminhar e correr normalmente. + +Se você perder energia mas tiver uma barra de alimentos com 9 ou mais {*ICON_SHANK_01*}, sua energia será preenchida automaticamente. Comer preenche sua barra de alimentos. + +Com um item de comida na mão, mantenha pressionado {*CONTROLLER_ACTION_USE*}para comer e preencher sua barra de alimentos. Você não poderá comer se a sua barra de alimentos estiver cheia. + +Sua barra de alimentos está baixa e você perdeu energia. Coma o bife do seu inventário para preencher sua barra de alimentos e começar a cura.{*ICON*}364{*/ICON*} + +A madeira que você coletou pode ser usada para fabricar tábuas. Abra a interface de fabricação para fabricá-las.{*PlanksIcon*} + +Muitas tarefas de fabricação envolvem diversas etapas. Agora você tem algumas tábuas e pode fabricar mais itens. Crie uma bancada.{*CraftingTableIcon*} + +Para coletar blocos mais rapidamente, você pode construir ferramentas próprias para o trabalho. Algumas ferramentas têm cabo feito de varetas. Fabrique algumas varetas agora.{*SticksIcon*} + +Use {*CONTROLLER_ACTION_LEFT_SCROLL*}e {*CONTROLLER_ACTION_RIGHT_SCROLL*}para alterar o item que está segurando. + +Use{*CONTROLLER_ACTION_USE*} para usar itens, interagir com objetos e colocar alguns itens. Os itens colocados podem ser coletados novamente se extraídos com a ferramenta correta. + +Com a bancada selecionada, aponte o cursor para o local desejado e use{*CONTROLLER_ACTION_USE*} para colocar a bancada. + +Aponte o cursor para a bancada e pressione{*CONTROLLER_ACTION_USE*} para abri-la. + +A pá ajuda a cavar blocos macios, como terra e neve, mais rapidamente. Quando coletar mais materiais poderá fabricar ferramentas mais rápidas e duráveis. Crie uma pá de madeira.{*WoodenShovelIcon*} + +O machado ajuda a cortar madeira e peças de madeira mais rapidamente. Quando coletar mais materiais poderá fabricar ferramentas mais rápidas e duráveis. Crie um machado de madeira. {*WoodenHatchetIcon*} + +A picareta ajuda a cavar blocos duros, como pedra e minério, mais rapidamente. Quando coletar mais materiais poderá fabricar ferramentas mais rápidas e duráveis e poderá extrair materiais mais duros. Crie uma picareta de madeira.{*WoodenPickaxeIcon*} + +Abrir o recipiente + + + A noite pode cair rapidamente e é perigoso ficar lá fora sem estar preparado. Você pode fabricar armaduras e armas, mas é melhor ter um abrigo seguro. + + + + Aqui perto há um abrigo abandonado de mineiro que você pode concluir para passar a noite em segurança. + + + + Você precisará coletar os recursos para concluir o abrigo. As paredes e o teto podem ser feitos com peças de qualquer tipo, mas você precisará criar uma porta, algumas janelas e iluminação. + + +Use a picareta para extrair alguns blocos de pedra. Blocos de pedra produzem pedregulho quando extraídos. Se coletar 8 blocos de pedregulho poderá construir uma fornalha. Talvez seja necessário cavar a terra para chegar à pedra; então, use a pá para isso.{*StoneIcon*} + +Você coletou pedregulho suficiente para construir uma fornalha. Use a bancada para criar uma. + +Use{*CONTROLLER_ACTION_USE*} para colocar a fornalha no mundo e abra-a. + +Use a fornalha para criar carvão vegetal. Enquanto espera ficar pronto, que tal coletar mais materiais para terminar o abrigo? + +Use a fornalha para criar vidro. Enquanto espera ficar pronto, que tal coletar mais materiais para terminar o abrigo? + +Um bom abrigo precisa de porta para você poder entrar e sair sem precisar extrair e repor as paredes. Fabrique uma porta de madeira agora. {*WoodenDoorIcon*} + +Use{*CONTROLLER_ACTION_USE*} para colocar a porta. Você pode usar{*CONTROLLER_ACTION_USE*} para abrir e fechar a porta de madeira no mundo. + +À noite pode ficar bem escuro; então, é bom ter alguma iluminação no interior do abrigo para poder enxergar. Fabrique uma tocha agora com varetas e carvão vegetal, usando a interface de fabricação.{*TorchIcon*} + + + Você concluiu a primeira parte do tutorial. + + + + {*B*} + Pressione{*CONTROLLER_VK_A*} para continuar o tutorial.{*B*} + Pressione{*CONTROLLER_VK_B*} se achar que está pronto para jogar sozinho. + + + + Este é seu inventário. Ele mostra os itens disponíveis para uso em sua mão e todos os outros itens que está carregando. Sua armadura também é mostrada aqui. + +{*B*} + Pressione{*CONTROLLER_VK_A*} para continuar.{*B*} + Pressione {*CONTROLLER_VK_B*} se já souber usar o inventário. + + + + Use{*CONTROLLER_MENU_NAVIGATE*}para mover o ponteiro. Use{*CONTROLLER_VK_A*}para pegar um item sob o ponteiro. + Se houver mais de um item aqui, esta ação pegará todos; você também pode usar{*CONTROLLER_VK_X*}para pegar apenas metade deles. + + + + Mova este item com o ponteiro sobre outro espaço no inventário e coloque-o usando{*CONTROLLER_VK_A*}. + Com vários itens no ponteiro, use{*CONTROLLER_VK_A*} para colocar todos ou{*CONTROLLER_VK_X*} para colocar apenas um. + + + + Se você mover o ponteiro para fora da borda da interface com um item nele, poderá derrubar o item. + + + + Para obter mais informações sobre um item, passe o ponteiro do mouse sobre ele e pressione {*CONTROLLER_ACTION_MENU_PAGEDOWN*} . + + + + Pressione{*CONTROLLER_VK_B*} agora para sair do inventário. + + + + Este é o inventário do modo criativo. Ele mostra os itens disponíveis para usar na sua mão e todos os outros itens que pode escolher. + + +{*B*} + Pressione {*CONTROLLER_VK_A*}para continuar.{*B*} + Pressione {*CONTROLLER_VK_B*}se já souber usar o inventário do modo criativo. + + + + Use {*CONTROLLER_MENU_NAVIGATE*}para mover o ponteiro. + Quando estiver na lista de itens, use {*CONTROLLER_VK_A*}para pegar o item sob o ponteiro e use {*CONTROLLER_VK_Y*}para pegar a pilha toda do item. + + + + O ponteiro será movido automaticamente para um espaço na linha de uso. Você pode colocá-lo usando {*CONTROLLER_VK_A*}. Depois de colocar o item, o ponteiro retornará à lista de itens, onde você poderá selecionar outro item. + + + + Se você mover o ponteiro para fora da borda da interface com um item nele, poderá derrubar o item no mundo. Para limpar todos os itens da barra de seleção rápida, pressione {*CONTROLLER_VK_X*}. + + + + Role pelas guias de Tipo de Grupo na parte superior usando {*CONTROLLER_VK_LB*}e {*CONTROLLER_VK_RB*}para selecionar o tipo de grupo do item que deseja pegar. + + + + Para obter mais informações sobre um item, passe o ponteiro do mouse sobre ele e pressione {*CONTROLLER_ACTION_MENU_PAGEDOWN*} . + + + + Pressione {*CONTROLLER_VK_B*}agora para sair do inventário do modo criativo. + + + + Esta é a interface de fabricação, onde você pode combinar os itens coletados para fazer novos itens. + + +{*B*} + Pressione{*CONTROLLER_VK_A*} para continuar.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber fabricar. + + +{*B*} + Pressione{*CONTROLLER_VK_X*} para mostrar a descrição do item. + + +{*B*} + Pressione{*CONTROLLER_VK_X*} para mostrar os ingredientes necessários para fazer o item atual. + + +{*B*} + Pressione{*CONTROLLER_VK_X*} para mostrar novamente o inventário. + + + + Role pelas guias de Tipo de Grupo na parte superior usando{*CONTROLLER_VK_LB*}e{*CONTROLLER_VK_RB*}para selecionar o tipo de grupo do item que deseja fabricar. Em seguida, use{*CONTROLLER_MENU_NAVIGATE*}para selecionar o item a ser fabricado. + + + + A área de fabricação mostra os itens necessários para fabricar o novo item. Pressione{*CONTROLLER_VK_A*} para fabricar o item e colocá-lo no inventário. + + + + Você pode fabricar uma seleção maior de itens usando uma bancada. A fabricação na bancada funciona da mesma maneira que a fabricação básica, mas você terá uma área maior de fabricação e uma variedade maior de itens para fabricar. + + + + A parte inferior direita da interface de fabricação mostra seu inventário. Essa área também pode mostrar a descrição do item selecionado e os ingredientes necessários para fabricá-lo. + + + + A descrição do item selecionado é exibida. Com a descrição você pode ter uma ideia de como o item pode ser usado. + + + + A lista dos ingredientes necessários para fabricar o item é exibida. + + +A madeira que você coletou pode ser usada para fabricar tábuas. Selecione o ícone de tábuas e pressione{*CONTROLLER_VK_A*} para criá-las.{*PlanksIcon*} + + + Você já construiu uma bancada e agora deve colocá-la no mundo para poder construir uma variedade maior de itens.{*B*} + Pressione{*CONTROLLER_VK_B*} agora para sair da interface de fabricação. + + + + Pressione{*CONTROLLER_VK_LB*} e{*CONTROLLER_VK_RB*} para alterar para o tipo de grupo dos itens que deseja fabricar. Selecione o grupo de ferramentas.{*ToolsIcon*} + + + + Pressione{*CONTROLLER_VK_LB*} e{*CONTROLLER_VK_RB*} para alterar para o tipo de grupo de itens que deseja fabricar. Selecione o grupo de estruturas.{*StructuresIcon*} + + + + Use{*CONTROLLER_MENU_NAVIGATE*}para alterar para o item que deseja fabricar. Alguns itens têm várias versões, dependendo dos materiais usados. Selecione a pá de madeira.{*WoodenShovelIcon*} + + + + Muitas tarefas de fabricação envolvem diversas etapas. Agora que você tem algumas tábuas, pode fabricar mais itens. Use{*CONTROLLER_MENU_NAVIGATE*}para alterar para o item que deseja fabricar. Selecione a bancada.{*CraftingTableIcon*} + + + + Com as ferramentas que construiu, você está pronto para começar bem e poderá coletar diversos materiais com mais eficiência.{*B*} + Pressione{*CONTROLLER_VK_B*} agora para sair da interface de fabricação. + + + + Alguns itens não podem ser criados usando a bancada, mas precisam da fornalha. Fabrique a fornalha agora.{*FurnaceIcon*} + + + + Coloque no mundo a fornalha que fabricou. É bom colocá-la dentro do seu abrigo.{*B*} + Pressione{*CONTROLLER_VK_B*} agora para sair da interface de fabricação. + + + + Esta é a interface da fornalha. Com ela você pode alterar os itens queimando-os. Por exemplo, nela você pode transformar minério de ferro em barras de ferro. + + +{*B*} + Pressione{*CONTROLLER_VK_A*} para continuar.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber usar a fornalha. + + + + Você precisa colocar um pouco de combustível na abertura inferior da fornalha e o item a ser queimado na abertura superior. A fornalha acenderá e começará a funcionar, colocando o resultado na abertura à direita. + + + + Muitos itens de madeira podem ser usados como combustível, mas nem tudo demora o mesmo tempo para queimar. Você pode descobrir outros itens no mundo que podem ser usados como combustível. + + + + Depois de queimar os itens, você poderá movê-los da área de saída para o inventário. Experimente ingredientes diferentes para ver o que pode fazer. + + + + Se usar madeira como ingrediente, você poderá fazer carvão vegetal. Coloque um pouco de combustível na fornalha e madeira na abertura do ingrediente. Pode demorar algum tempo para que a fornalha crie o carvão vegetal; se preferir, vá fazer outra coisa e volte para verificar o progresso. + + + + O carvão vegetal pode ser usado como combustível e também ser combinado com uma vareta para fabricar uma tocha. + + + + Se colocar areia na abertura do ingrediente, você poderá fazer vidro. Crie alguns blocos de vidro para usar como janelas no seu abrigo. + + + + Esta é a interface de poções. Você pode usar isto para criar poções com diversos efeitos diferentes. + + +{*B*} + Pressione{*CONTROLLER_VK_A*} para continuar.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber usar a barraca de poções. + + + + Para fazer poções você deve colocar um ingrediente no slot superior e uma poção ou garrafa de água nos slots de baixo (é possível fazer até 3 poções de uma vez). Depois que uma combinação válida for colocada, o processo começará e a poção será criada depois de pouco tempo. + + + + Todas as poções começam com uma Garrafa de Água. A maioria das poções é criada usando primeiro uma Verruga do Submundo para fazer uma Poção Maligna, e precisa de pelo menos mais um ingrediente para fazer a poção final. + + + + Depois que tiver uma poção, você pode modificar seus efeitos. Se adicionar Pó de Redstone, a duração do efeito aumenta, e se adicionar Pó de Glowstone, o efeito será mais poderoso. + + + + A adição de Olho de Aranha Fermentado corrompe a poção e a transforma em uma poção com o efeito contrário, e a adição de Pólvora transforma a poção em uma Poção Tchibum, que pode ser atirada para aplicar seus efeitos a uma área próxima. + + + + Crie uma Poção de Resistência ao Fogo primeiro adicionando Verruga do Submundo a uma Garrafa de Água, e depois adicionando Creme de Magma. + + + + Pressione {*CONTROLLER_VK_B*}agora para sair da interface de poções. + + + + Nesta área há uma Barraca de Poções, um Caldeirão e um baú cheio de itens para fazer poções. + + +{*B*} + Pressione{*CONTROLLER_VK_A*} para saber mais sobre como fazer poções.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber como fazer poções. + + + + A primeira etapa para fazer uma poção é criar uma Garrafa de Água. Pegue uma Garrafa de Vidro no baú. + + + + Você pode encher a garrafa de vidro com um Caldeirão que tenha água dentro, ou com um bloco de água. Encha a garrafa de vidro agora apontando para uma fonte de água e pressionando{*CONTROLLER_ACTION_USE*}. + + + + Se o caldeirão ficar vazio, você pode enchê-lo com um Balde de Água. + + + + Use a barraca de poções para criar uma Poção de Resistência ao Fogo. Você precisará de uma Garrafa de Água, Verruga do Submundo e Creme de Magma. + + + + Com a poção na mão, segure{*CONTROLLER_ACTION_USE*} para usá-la. Se for uma poção normal, você pode bebê-la e aplicar o efeito em si mesmo, e se for uma Poção Tchibum, você pode atirá-la e aplicar o efeito nas criaturas próximas de onde ela acertar. + As poções tchibum podem ser criadas adicionando pólvora a poções normais. + + + + Use sua Poção de Resistência ao fogo em si mesmo. + + + + Agora que você está resistente ao fogo e à lava, veja se há lugares em que você consegue chegar que não conseguia antes. + + + + Esta é a interface de feitiços, que você pode usar para adicionar feitiços a armas, armadura e a algumas ferramentas. + + +{*B*} + Pressione{*CONTROLLER_VK_A*} para saber mais sobre a interface de feitiços.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber usar a interface de feitiços. + + + + Para enfeitiçar um item, primeiro coloque-o no slot de feitiços. Armas, armadura e algumas ferramentas podem ser enfeitiçados para adicionar efeitos especiais como maior resistência a danos ou aumento do número de itens produzidos ao minerar um bloco. + + + + Quando um item for colocado no slot de feitiços, os botões da direita mudarão para uma seleção de feitiços aleatórios. + + + + O número no botão representa o custo em níveis de experiência para aplicar esse feitiço ao item. Se você não tiver o nível necessário, o botão estará desabilitado. + + + + Selecione um feitiço e pressione{*CONTROLLER_VK_A*} para enfeitiçar o item. Isso irá diminuir seu nível de experiência correspondente ao custo do feitiço. + + + + Apesar dos feitiços serem aleatórios, alguns dos melhores feitiços só estarão disponíveis se você tiver um nível de experiência alto e muitas estantes ao redor da Bancada de Feitiços para aumentar seu poder. + + + + Nesta área há uma Bancada de Feitiços e alguns outros itens para você aprender mais sobre feitiços. + + +{*B*} + Pressione{*CONTROLLER_VK_A*} para saber mais sobre os encantos.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber usar os encantos. + + + + Ao usar a Bancada de Feitiços, você poderá adicionar efeitos especiais a armas, armadura e a algumas ferramentas, como o aumento do número de itens produzidos ao minerar um bloco ou a maior resistência a danos. + + + + Colocar estantes de livros ao redor da Bancada de Feitiços aumenta seu poder e permite o acesso a feitiços de nível mais alto. + + + + Enfeitiçar itens custa Níveis de Exp. que podem ser conquistados coletando Esferas de Exp. produzidas ao matar monstros e animais, minerar minérios, criar animais, pescar e fundir/cozinhar algumas coisas na fornalha. + + + + Também pode conquistar níveis de exp. usando a Garrafa de Feitiços, que ao ser atirada cria Esferas de Exp. perto de onde cair. Essas esferas podem ser coletadas. + + + + Nos baús desta área encontrará alguns itens enfeitiçados, Garrafas de Feitiços e alguns itens que ainda não foram enfeitiçados, para experimentar na Bancada de Feitiços. + + + + Agora você está andando no carrinho de minas. Para sair do carrinho, aponte o cursor para ele e pressione{*CONTROLLER_ACTION_USE*}.{*MinecartIcon*} + + +{*B*} + Pressione{*CONTROLLER_VK_A*} para saber mais sobre os carrinhos de minas.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber usar os carrinhos de minas. + + + + O carrinho de minas corre sobre trilhos. Você também pode fabricar um carrinho com propulsão com uma fornalha e um carrinho de minas com um baú nele. + {*RailIcon*} + + + + Você também pode fabricar trilhos com propulsão, que usam a energia de tochas e circuitos de redstone para acelerar o carrinho. Eles podem ser conectados a acionadores, alavancas e chapas de pressão para criar sistemas complexos. + {*PoweredRailIcon*} + + + + Agora você está andando de barco. Aponte o cursor para o barco e pressione {*CONTROLLER_ACTION_USE*} para sair.{*BoatIcon*} + + + + {*B*} + Pressione{*CONTROLLER_VK_A*} para saber mais sobre barcos.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber usar barcos. + + + + Com o barco é possível viajar mais rapidamente sobre a água. Você pode navegá-lo usando{*CONTROLLER_ACTION_MOVE*} e{*CONTROLLER_ACTION_LOOK*}. + {*BoatIcon*} + + + + Agora você está usando uma vara de pescar. Pressione{*CONTROLLER_ACTION_USE*} para usá-la.{*FishingRodIcon*} + + + + {*B*} + Pressione{*CONTROLLER_VK_A*} para saber mais sobre pesca.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber pescar. + + + + Pressione{*CONTROLLER_ACTION_USE*} para jogar a linha e começar a pescar. Pressione{*CONTROLLER_ACTION_USE*} novamente para puxar a linha de pesca. + {*FishingRodIcon*} + + + + Se esperar a boia afundar antes de puxar a linha, você poderá pegar um peixe. Os peixes podem ser comidos crus ou cozidos na fornalha para restaurar a energia. + {*FishIcon*} + + + + Como outras ferramentas, a vara de pescar tem um número determinado de utilidades. Mas elas não se limitam a pegar peixes. Experimente para ver o que mais pode ser pego ou ativado com ela... + {*FishingRodIcon*} + + + + Esta é uma cama. Pressione{*CONTROLLER_ACTION_USE*} ao apontar para ela à noite para dormir a noite toda e despertar de manhã.{*ICON*}355{*/ICON*} + + + + {*B*} + Pressione{*CONTROLLER_VK_A*} para saber mais sobre camas.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber como funcionam as camas. + + + + A cama deve ser colocada em um lugar seguro e bem iluminado para que os monstros não o acordem no meio da noite. Depois de usar uma cama, se você morrer renascerá nela. + {*ICON*}355{*/ICON*} + + + + Se houver outros jogadores no jogo, todos deverão estar em uma cama ao mesmo tempo para poderem dormir. + {*ICON*}355{*/ICON*} + + + + Nesta área, há alguns circuitos simples de redstone e pistão, além de um baú com mais itens para ampliar esses circuitos. + + + + {*B*} + Pressione {*CONTROLLER_VK_A*}para saber mais sobre circuitos de redstone e pistões.{*B*} + Pressione {*CONTROLLER_VK_B*}se já souber usar circuitos de redstone e pistões. + + + + Alavancas, botões, chapas de pressão e tochas de redstone podem fornecer energia aos circuitos, seja conectando-os diretamente ao item a ser ativado ou conectando-os com pó de redstone. + + + + A posição e a direção em que você coloca uma fonte de energia podem mudar a maneira como ela afeta os blocos ao redor. Por exemplo, uma tocha de redstone ao lado de um bloco poderá ser apagada se o bloco for acionado por outra fonte. + + + + O pó de redstone é obtido pela extração de minério de redstone com uma picareta de ferro, diamante ou ouro. Você pode usá-lo para transmitir energia para até 15 blocos e ele pode viajar um bloco acima ou abaixo na altura. + {*ICON*}331{*/ICON*} + + + + Repetidores de redstone podem ser usados para ampliar a distância que a energia é transportada ou colocar um atraso no circuito. + {*ICON*}356{*/ICON*} + + + + Quando acionado, um pistão se estenderá, empurrando até 12 blocos. Quando retraídos, os Pistões aderentes podem puxar um bloco da maioria dos tipos. + {*ICON*}33{*/ICON*} + + + + No baú desta área há alguns componentes para fabricar circuitos com pistões. Tente usar ou completar os circuitos desta área ou formar você mesmo. Há mais exemplos fora da área do tutorial. + + + + Nesta área há um Portal para o Submundo! + + + + {*B*} + Pressione{*CONTROLLER_VK_A*} para saber mas sobre Portais e o Submundo.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber como funcionam os Portais e o Submundo. + + + + Os portais são criados colocando blocos de Obsidiana em uma estrutura com quatro blocos de largura e cinco blocos de altura. Os blocos de canto não são necessários. + + + + Para ativar um Portal do Submundo, incendeie os blocos de Obsidiana dentro da estrutura com Sílex e Aço. Os Portais podem ser desativados se a estrutura estiver quebrada, se ocorrer uma explosão próxima ou se algum líquido fluir através deles. + + + + Para usar um Portal do Submundo, fique de pé dentro dele. Sua tela ficará roxa e um som será tocado. Depois de alguns segundos você será transportado para outra dimensão. + + + + O Submundo pode ser um lugar perigoso, cheio de lava, mas pode ser útil para coletar Pedra Inflamável, que queima para sempre quando acesa, e Glowstone, que produz luz. + + + + O mundo do Submundo pode ser usado para viajar rapidamente na Superfície - viajar a uma distância de um bloco no Submundo equivale a viajar 3 blocos na Superfície. + + + + Agora você está no Modo Criativo. + + + + {*B*} + Pressione{*CONTROLLER_VK_A*} para saber mais sobre o Modo Criativo.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber usar o Modo Criativo. + + +No modo Criativo você tem um número infinito de todos os itens e blocos disponíveis, pode destruir blocos com um clique sem uma ferramenta, você é invulnerável e pode voar. + +Se pressionar {*CONTROLLER_ACTION_JUMP*}rapidamente duas vezes você poderá voar. Para parar de voar, repita a ação. Para voar mais rápido, pressione {*CONTROLLER_ACTION_MOVE*}para a frente duas vezes rapidamente ao voar. +No modo de voo, mantenha pressionado {*CONTROLLER_ACTION_JUMP*}para se mover para cima e {*CONTROLLER_ACTION_SNEAK*}para se mover para baixo ou use o direcional para se mover para cima, para baixo, para a esquerda ou para a direita. + +Pressione{*CONTROLLER_ACTION_CRAFTING*} para abrir a interface do inventário criativo. + +Vá até o lado oposto deste buraco para continuar. + +Você já concluiu o tutorial do modo Criativo. + + + Nesta área foi estabelecida uma fazenda. Se você a cultivar, terá uma fonte renovável de comida e outros itens. + + + + {*B*} + Pressione{*CONTROLLER_VK_A*} para saber mais sobre como cuidar de fazendas.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber cuidar de uma fazenda. + + +Trigo, abóboras e melões são cultivados a partir de sementes. As sementes de trigo são coletadas quebrando Grama Alta ou colhendo trigo, e as sementes de abóbora e melão são fabricadas a partir de abóboras e melões, respectivamente. + +Antes de plantar as sementes os blocos de terra devem ser transformados em Campo usando uma Enxada. Uma fonte próxima de água ajudará a manter o Campo hidratado e fará as colheitas crescerem mais rápido, além de manter a área iluminada. + +O trigo passa por várias etapas enquanto está crescendo, e está pronto para ser colhido quando fica mais escuro.{*ICON*}59:7{*/ICON*} + +As abóboras e melões também precisam de um bloco próximo de onde as sementes foram plantadas, para que os frutos cresçam assim que os caules estiverem crescidos. + +A cana-de-açúcar deve ser plantada em um bloco de Grama, Terra ou Areia que esteja ao lado de um bloco de água. Se você cortar um bloco de Cana-de-açúcar, também derrubará todos os blocos que estão acima dele.{*ICON*}83{*/ICON*} + +Os Cactos devem ser plantados na Areia, e crescerão com até três blocos de altura. Da mesma forma que a Cana-de-açúcar, se o bloco inferior for destruído, você também coletará os blocos que estão acima dele.{*ICON*}81{*/ICON*} + +Os Cogumelos devem ser plantados em uma área com pouca iluminação e se espalharão para os blocos próximos pouco iluminados.{*ICON*}39{*/ICON*} + +O Farelo de osso pode ser usado para as plantações chegarem à etapa mais desenvolvida, ou para fazer os Cogumelos se transformarem em Cogumelos Enormes.{*ICON*}351:15{*/ICON*} + +Agora você completou o tutorial da fazenda. + + + Nesta área os animais foram cercados. Você pode criar animais, para produzir filhotes deles mesmos. + + + + {*B*} + Pressione{*CONTROLLER_VK_A*} para saber mais sobre criação e animais.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber sobre criação e animais. + + +Para que os animais se reproduzam, você deve dar a comida certa a eles para que entrem no "Modo do Amor". + +Dê Trigo para uma vaca, vacogumelo ou ovelha, cenouras para os porcos, sementes de trigo ou verruga do Submundo para uma galinha, ou dê qualquer tipo de carne para um lobo e eles começarão a procurar outro animal da mesma espécie que também esteja no Modo do Amor. + +Quando dois animais da mesma espécie se encontrarem e ambos estiverem no Modo do Amor, eles se beijarão por alguns segundos e um filhote aparecerá. O filhote seguirá seus pais durante algum tempo, até crescer e se transformar em um animal adulto. + +Depois de ficar no Modo do Amor, o animal não poderá entrar nele de novo por cinco minutos. + +Alguns animais seguirão você se estiver com a comida deles na mão. Desta forma é mais fácil agrupar os animais para reproduzi-los.{*ICON*}296{*/ICON*} + + + Lobos selvagens podem ser domados com ossos. Assim que domados, coraçõezinhos aparecerão em torno deles. Lobos domados seguirão e defenderão o jogador, caso não tenham sido ordenados a sentar. + + +Você concluiu o tutorial de criação e de animais. + + + Nesta área há algumas abóboras e blocos para fazer um Golem de Neve e um Golem de Ferro. + + + + {*B*} + Pressione{*CONTROLLER_VK_A*} para saber mais sobre Golems.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber como usar Golems. + + +Os Gólens são criados colocando uma abóbora sobre uma pilha de blocos. + +Os Gólens de Neve são criados com dois Blocos de Neve, um sobre o outro, e uma abóbora sobre eles. Os Gólens lançam bolas de neve em seus inimigos. + +Os Gólens de Ferro são criados com quatro Blocos de Ferro no padrão mostrado, com uma abóbora sobre o bloco do meio. Os Gólens de Ferro atacam seus inimigos. + +Os Gólens de Ferro também aparecem naturalmente para proteger vilas e o atacarão se você atacar algum aldeão. + +Você só poderá sair desta área quando concluir o tutorial. + +Ferramentas diferentes são melhores para obter materiais diferentes. Você deve usar uma pá para extrair materiais macios como terra ou areia. + +Ferramentas diferentes são melhores para obter materiais diferentes. Você deve usar um machado para cortar troncos de árvores. + +Ferramentas diferentes são melhores para obter materiais diferentes. Você deve usar uma picareta para extrair pedra e minério. Talvez seja necessário fabricar sua picareta com materiais melhores para obter recursos de alguns blocos. + +Algumas ferramentas são melhores para atacar inimigos. Pense em usar uma espada para atacar. + +Dica: mantenha {*CONTROLLER_ACTION_ACTION*}pressionado para extrair e cortar usando a mão ou o que estiver segurando. Talvez seja necessário fabricar uma ferramenta para extrair alguns blocos... + +A ferramenta que está usando está danificada. Sempre que você usa uma ferramenta ela sofre danos e pode quebrar. A barra colorida abaixo do item no inventário mostra o estado atual dos danos. + +Mantenha{*CONTROLLER_ACTION_JUMP*} pressionado para nadar. + +Nesta área há um carrinho de minas sobre um trilho. Para entrar no carrinho, aponte o cursor para ele e pressione{*CONTROLLER_ACTION_USE*}. Use{*CONTROLLER_ACTION_USE*} no botão para mover o carrinho. + +No baú ao lado do rio há um barco. Para usar o barco, aponte o cursor para a água e pressione{*CONTROLLER_ACTION_USE*}. Use{*CONTROLLER_ACTION_USE*} ao apontar para o barco para entrar nele. + +No baú ao lado do lago há uma vara de pescar. Tire a vara do baú e selecione-a como o item atual em sua mão para usá-la. + +Este mecanismo de pistão mais avançado cria uma ponte que se conserta automaticamente. Pressione o botão para ativar e veja como os componentes interagem para aprender mais. + +Se você mover o ponteiro para fora da interface ao segurar um item, poderá derrubá-lo. + +Você não tem todos os ingredientes necessários para fazer este item. A caixa no canto inferior esquerdo mostra os ingredientes necessários para fabricá-lo. + + + Parabéns, você concluiu o tutorial. O tempo no jogo agora passará no ritmo normal e não falta muito para a noite, quando os monstros aparecem. Termine seu abrigo! + + +{*EXIT_PICTURE*} Quando estiver pronto para explorar mais, há uma escada nesta área perto do abrigo do mineiro que leva a um pequeno castelo. + +Lembrete: + +]]> + +Novos recursos foram adicionados ao jogo na versão mais recente, incluindo novas áreas no mundo do tutorial. + +{*B*}Pressione {*CONTROLLER_VK_A*}para jogar no tutorial normalmente.{*B*} + Pressione {*CONTROLLER_VK_B*}para pular o tutorial principal. + +Nesta área, você encontrará áreas configuradas para ajudá-lo a aprender sobre pesca, barcos, pistões e redstone. + +Fora desta área, você encontrará exemplos de construções, cultivo, carrinhos de mineração e trilhos, feitiços, poções, negócios, ferraria e muito mais! + + + Sua barra de alimentos chegou a um nível em que não há mais cura. + + + + {*B*} + Pressione {*CONTROLLER_VK_A*}para saber mais sobre a barra de alimentos e como comer.{*B*} + Pressione {*CONTROLLER_VK_B*}se já souber usar a barra de alimentos e como comer. + + + + 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 + +Voltar + +Sair + +Cancelar + +Cancelar Entrada + +Selec. Disp. Armazenamento + +Dispositivo de Armazenamento + +Lista de Jogos Online + +Jogos de Grupo + +Todos os Jogos + +Alterar Grupo + +Mostrar Inventário + +Mostrar Descrição + +Mostrar Ingredientes + +Fabricação + +Criar + +Pegar/Colocar + +Pegar + +Pegar tudo + +Pegar metade + +Colocar + +Colocar tudo + +Colocar um + +Soltar + +Soltar tudo + +Soltar um + +Trocar + +Mover rápido + +Limpar Seleção Rápida + +O que é isto? + +Compartilhar no Facebook + +Alterar Filtro + +Exibir Cartão de Jogador + +Exibir Perfil do Jogador + +Enviar Pedido de Amigo + +Página Abaixo + +Página Acima + +Próximo + +Anterior + +Expulsar + +Tingir + +Extrair + +Alimentar + +Domar + +Curar + +Sentar + +Seguir-me + +Ejetar + +Esvaziar + +Selar + +Colocar + +Atingir + +Ordenhar + +Coletar + +Comer + +Dormir + +Acordar + +Jogar + +Montar + +Velejar + +Cultivar + +Nadar + +Abrir + +Alterar Tom + +Detonar + +Ler + +Pendurar + +Atirar + +Plantar + +Arar + +Colher + +Continuar + +Desbloquear Jogo Completo + +Excluir Salvamento + +Excluir + +Opções + +Convidar para Grupo Xbox Live + +Convidar Amigos + +Aceitar + +Tosquiar + +Banir Nível + +Selecionar Capa + +Acender + +Navegar + +Instalar Versão Completa + +Instalar Versão de Avaliação + +Instalar + +Reinstalar + +Opções de Salvamento + +Executar Comando + +Criativo + +Mover Ingrediente + +Mover Combustível + +Ferramenta Mover + +Mover Armadura + +Mover Arma + +Equipar + +Desenhar + +Lançar + +Privilégios + +Bloco + +Página Acima + +Página Abaixo + +Modo do Amor + +Beber + +Girar + +Ocultar + +Carregar para Xbox One + +Limpar todos os slots + +Carregar jogo salvo para o Xbox One + +Montar + +Desmontar + +Baú amarrado + +Lançar + +Rédea + +Soltar + +Amarrar + +Nomear + +OK + +Cancelar + +Loja Minecraft + +Tem certeza de que deseja sair do jogo atual e entrar no novo jogo? Você perderá o progresso não salvo. + +Sair do Jogo + +Salvar Jogo + +Sair sem salvar + +Tem certeza de que deseja substituir o salvamento anterior deste mundo pela versão atual dele? + +Tem certeza de que deseja sair sem salvar? Você perderá todo o progresso neste mundo! + +Iniciar Jogo + +Se você criar, carregar ou salvar um mundo no Modo Criativo, esse mundo terá desabilitadas as atualizações de conquistas e de placares de líderes, mesmo que seja carregado no Modo Sobrevivência. Tem certeza de que deseja continuar? + +Este mundo já foi salvo no Modo Criativo e as atualizações de conquistas e de placares de líderes estarão desabilitadas nele. Tem certeza de que deseja continuar? + +Este mundo já foi salvo no Modo Criativo e terá as atualizações de conquistas e de placar de líderes desabilitadas. + +Se você criar, carregar ou salvar um mundo com os Privilégios do Host habilitados, esse mundo terá desabilitadas as atualizações de conquistas e de placares de líderes, mesmo que ele seja posteriormente carregado com essas opções desativadas. Tem certeza de que deseja continuar? + +Jogo danificado + +Este jogo salvo está corrompido ou danificado. Gostaria de excluí-lo? + +Tem certeza de que deseja sair para o menu principal e desconectar todos os jogadores do jogo? Você perderá o progresso não salvo. + +Sair e salvar + +Sair sem salvar + +Tem certeza de que deseja sair para o menu principal? Você perderá o progresso não salvo. + +Tem certeza de que deseja sair para o menu principal? Seu progresso será perdido! + +Criar Novo Mundo + +Jogar Tutorial + +Tutorial + +Nomear Mundo + +Digite um nome para o mundo. + +Insira a semente para a criação do seu mundo. + +Carregar Mundo Salvo + +Pressione START para entrar no jogo + +Saindo do jogo. + +Erro. Saindo para o menu principal. + +Falha na conexão. + +Conexão perdida + +A conexão com o servidor foi perdida. Saindo para o menu principal. + +A conexão com o Xbox Live foi perdida. Saindo para o menu principal. + +A conexão com o Xbox Live foi perdida. + +Desconectado pelo servidor. + +Você foi expulso do jogo. + +Você foi expulso do jogo por voar. + +A tentativa de conexão demorou muito. + +O servidor está cheio + +O host saiu do jogo. + +Você não pode entrar neste jogo, pois não é amigo de nenhuma pessoa no jogo. + +Você não pode entrar neste jogo, pois já foi expulso antes pelo host. + +Você não pode entrar neste jogo, pois o jogador com o qual está tentando jogar está executando uma versão anterior do jogo. + +Você não pode entrar neste jogo, pois o jogador com o qual está tentando jogar está executando uma versão mais nova do jogo. + +Novo Mundo + +Brinde Desbloqueado! + +Oba! Você ganhou uma imagem do jogador com o Steve do Minecraft! + +Oba! Você ganhou uma imagem do jogador com um Creeper! + +Oba! Você ganhou um item de avatar: uma camiseta do Minecraft: Xbox 360 Edition! +Vá até o menu para colocar a camiseta no seu avatar. + +Oba! Você ganhou um item de avatar: um relógio do Minecraft: Xbox 360 Edition! +Vá até o menu para colocar o relógio no seu avatar. + +Oba! Você ganhou um item de avatar: um boné de beisebol do Creeper! +Vá até o menu para colocar o boné no seu avatar. + +Oba! Você ganhou o tema do Minecraft: Xbox 360 Edition! +Vá até o menu para selecioná-lo. + +Desbloquear Jogo Completo + +Você está jogando a versão de avaliação, mas precisa da versão integral para poder salvar seu jogo. +Deseja desbloquear a versão integral do jogo agora? + +Esta é a versão de avaliação do jogo Minecraft: Xbox 360 Edition. Se você tivesse a versão integral do jogo, ganharia uma conquista! +Deseja desbloquear a versão integral do jogo? + +Esta é a versão de avaliação do jogo Minecraft: Xbox 360 Edition. Se você tivesse a versão integral do jogo, ganharia um brinde de avatar! +Deseja desbloquear a versão integral do jogo? + +Esta é a versão de avaliação do jogo Minecraft: Xbox 360 Edition. Se você tivesse a versão integral do jogo, ganharia uma imagem de jogador! +Deseja desbloquear a versão integral do jogo? + +Esta é a versão de avaliação do jogo Minecraft: Xbox 360 Edition. Se você tivesse a versão integral do jogo, ganharia um tema! +Deseja desbloquear a versão integral do jogo? + +Este é a versão de avaliação do jogo Minecraft: Xbox 360 Edition. Você precisa ter a versão integral do jogo para poder aceitar este convite. +Deseja desbloquear a versão integral do jogo? + +Os jogadores convidados não podem desbloquear a versão integral do jogo. Entre com uma ID de usuário do Xbox Live. + +Aguarde + +Sem resultados + +Filtro: + +Amigos + +Minha Pontuação + +Geral + +Entradas: + +Posto + +Gamertag + +Preparando para Salvar Nível + +Preparando Partes... + +Finalizando... + +Construindo Terreno + +Simulando o mundo um pouquinho + +Inicializando o servidor + +Produzindo área de criação + +Carregando área de criação + +Entrando no Submundo + +Saindo do Submundo + +Criando Novamente + +Criando nível + +Carregando nível + +Salvando jogadores + +Conectando ao host + +Baixando terreno + +Alternando para jogo offline + +Aguarde enquanto o host salva o jogo + +Entrando no FINAL + +Saindo do FINAL + +Encontrando semente para o gerador de mundos + +Esta cama está ocupada + +Você só pode dormir à noite + +%s está dormindo na cama. Para pular para o nascer do sol, todos os jogadores devem estar dormindo nas camas ao mesmo tempo. + +A cama de sua casa estava desaparecida ou obstruída. + +Você não pode descansar agora, há monstros por perto + +Você está dormindo na cama. Para pular para o nascer do sol, todos os jogadores devem estar dormindo nas camas ao mesmo tempo. + +Ferramentas e Armas + +Armas + +Alimentos + +Estruturas + +Armadura + +Mecanismos + +Transporte + +Decorações + +Blocos de Construção + +Redstone e Transporte + +Diversos + +Poções + +Poções + +Ferramentas, Armas e Armaduras + +Materiais + +Saiu + +Você retornou à tela de título porque seu perfil do jogador foi desconectado. + +Dificuldade + +Música + +Som + +Gama + +Sensibilidade do Jogo + +Sensibilidade da Interface + +Pacífico + +Fácil + +Normal + +Difícil + +Neste modo, o jogador ganha energia com o tempo e não há inimigos no ambiente. + +Neste modo, inimigos são gerados no ambiente, mas causam menos danos ao jogador que no modo Normal. + +Neste modo, inimigos são gerados no ambiente e causam uma quantidade padrão de danos ao jogador. + +Neste modo, inimigos são gerados no ambiente e causam muitos danos ao jogador. Tome cuidado também com os creepers, pois eles não podem cancelar o ataque explosivo quando você se afasta deles! + +Tempo Limite de Avaliação + +Você já jogou a versão de avaliação de Minecraft: Xbox 360 Edition pelo máximo de tempo permitido. Para continuar a diversão, gostaria de desbloquear a versão integral do jogo? + +Versão integral + +Falha ao entrar no jogo, pois não há espaços restantes + +Digitar Texto da Placa + +Digite uma linha de texto para sua placa. + +Digitar Título + +Digite um título para sua postagem. + +Digitar Legenda + +Digite uma legenda para sua postagem. + +Digitar Descrição + +Digite uma descrição para sua postagem. + +Inventário + +Ingredientes + +Barraca de Poções + +Baú + +Feitiço + +Fornalha + +Ingrediente + +Combustível + +Distribuidor + +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. + +%s saiu do jogo. + +%s foi expulso do jogo. + +Tem certeza de que deseja excluir este jogo salvo? + +A confirmar + +Censurado + +Jogando agora: + +Redefinir Configurações + +Tem certeza de que deseja redefinir suas configurações para os valores padrão? + +Erro de carregamento + +"Minecraft: Xbox 360 Edition" falhou ao carregar e não é possível continuar. + +Jogo de %s + +Jogo com host desconhecido + +Convidado saiu + +Um jogador convidado saiu, fazendo todos os jogadores convidados serem removidos do jogo. + +Entrar + +Você não está conectado. Para jogar este jogo, você deve estar conectado. Deseja conectar agora? + +Multijogador não é permitido + +Falha ao entrar no jogo, pois um ou mais jogadores não têm permissão para jogos multijogador no Xbox Live. + +Falha ao criar um jogo online, pois um ou mais jogadores não têm permissão para jogos multijogador no Xbox Live. Desmarque a caixa "Jogo Online" para começar um jogo offline. + +Você não tem permissão para entrar nesta sessão de jogo porque sua configuração de privilégio de Conteúdo de Assinante é muito restrita. Altere essa configuração na parte Configurações Privacidade & Online do menu Xbox se quiser entrar nesta sessão. + +Você não tem permissão para entrar nesta sessão de jogo porque a configuração de privilégio de Conteúdo de Assinante de um de seus jogadores locais é muito restrita. + +Você não tem permissão para entrar nesta sessão de jogo porque a configuração de privilégio de Conteúdo de Assinante de um jogador na sessão é de Somente Amigos, e você não está na Lista de Amigos dele. + +Falha ao criar jogo + +Você não tem permissão para criar esta sessão de jogo porque a configuração de privilégio de Conteúdo de Assinante de um de seus jogadores locais é muito restrita. Desmarque a caixa "Jogo Online" para começar um jogo offline, ou altere essa configuração na parte Configurações Privacidade & Online do menu Xbox. + +Seleção automática + +Nenhum Pacote: Capas Padrão + +Capas favoritas + +Nível Banido + +O jogo em que está entrando está em sua lista de níveis banidos. +Se você optar por participar desse jogo, o nível será removido de sua lista de níveis banidos. + +Banir este nível? + +Tem certeza de que deseja adicionar este nível à lista de níveis banidos? +Selecionar OK também fechará este jogo. + +Remover da Lista de Banidos + +Intervalo do Salvamento Automático + +Intervalo do salvamento automático: NÃO + +Min. + +Não é possível colocar aqui! + +Não é permitido colocar lava perto do ponto de criação do nível devido à possibilidade de morte imediata dos jogadores criados. + +Este jogo tem o recurso de salvamento automático de nível. Quando você vir o ícone acima sendo exibido, o jogo está salvando seus dados. +Não desligue o console Xbox 360 enquanto este ícone estiver na tela. + +Opacidade da Interface + +Preparando salvamento automático do nível + +Tamanho do HUD + +Tamanho do HUD (Tela Dividida) + +Semente + +Desbloquear Pacote de Capas + +Para usar a capa selecionada, você precisa desbloquear este pacote de capas. +Deseja desbloquear o pacote de capas agora? + +Desbloquear pacote de textura + +Para usar este pacote de textura no seu mundo, você precisa desbloqueá-lo. +Você deseja desbloquear ele agora? + +Pacote de texturas para avaliação + +Você está usando uma versão de avaliação do pacote de texturas. Você não poderá salvar este mundo até desbloquear a versão completa. + Gostaria de desbloquear a versão completa do pacote de texturas? + +Pacote de textura não disponível + +Desbloquear a versão completa + +Baixar versão de avaliação + +Baixar versão completa + +Este mundo usa um pacote de combinações ou pacote de texturas que você não tem! +Deseja instalar o pacote de combinações ou o pacote de texturas agora? + +Obter Versão de Avaliação + +Obter Versão Completa + +Expulsar + +Tem certeza de que deseja expulsar este jogador do jogo? Eles não poderão entrar de novo até que você reinicie o mundo. + +Pacotes de Imagens do jogador + +Temas + +Pacotes de Capas + +Permite os amigos dos amigos + +Você não pode entrar neste jogo porque ele foi limitado aos jogadores que são amigos do host. + +Não é possível entrar no jogo + +Selecionado + +Capa selecionada: + +Conteúdo para Baixar Corrompido + +Este conteúdo para baixar está corrompido e não pode ser usado. Você deve excluí-lo e reinstalá-lo a partir do menu da Loja Minecraft. + +Alguns conteúdos para baixar estão corrompidos e não podem ser usados. Você deve excluí-los e reinstalá-los a partir do menu da Loja Minecraft. + +Seu modo de jogo foi alterado + +Renomeie Seu Mundo + +Digite o novo nome para seu mundo + +Modo Jogo Sobrevivência + +Modo Jogo Criativo + +Modo de Jogo: Aventura + +Sobrevivência + +Criativo + +Aventura + +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 + +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. + +Quando habilitado, os amigos das pessoas em sua Lista de Amigos poderão entrar no jogo. + +Quando habilitado, os jogadores podem causar danos a outros jogadores. Afeta somente o modo Sobrevivência. + +Quando desabilitado, os jogadores que entrarem no jogo não poderão construir nem minerar sem autorização. + +Quando habilitado, o fogo poderá se espalhar até blocos inflamáveis próximos. + +Quando habilitado, a TNT explodirá quando ativada. + +Quando habilitado, o host pode alternar o vôo, desabilitar exaustão e ficar invisível pelo menu do jogo. Desabilita atualizações de conquistas e de placar de líderes. + +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. + +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. + +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 + +Imagens do Jogador + +Itens de Avatar + +Pacotes de Texturas + +Pacotes de Combinações + +{*PLAYER*} incendiou-se + +{*PLAYER*} queimou até a morte + +{*PLAYER*} tentou nadar na lava + +{*PLAYER*} asfixiou-se em uma parede + +{*PLAYER*} afogou-se + +{*PLAYER*} morreu de fome + +{*PLAYER*} foi espetado até a morte + +{*PLAYER*} atingiu o chão com muita força + +{*PLAYER*} caiu para fora do mundo + +{*PLAYER*} morreu + +{*PLAYER*} explodiu + +{*PLAYER*} foi morto por magia + +{*PLAYER*} foi morto pelo sopro do Dragão Ender + +{*PLAYER*} foi assassinado por {*SOURCE*} + +{*PLAYER*} foi assassinado por {*SOURCE*} + +{*PLAYER*} levou um tiro de {*SOURCE*} + +{*PLAYER*} foi atingido por uma bola de fogo de {*SOURCE*} + +{*PLAYER*} foi esmurrado por {*SOURCE*} + +{*PLAYER*} foi morto por {*SOURCE*} 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 + +Exibir HUD + +Exibir Mão + +Gamertags na Tela Dividida + +Mensagens de Morte + +Personagem Animado + +Animação pessoal de capa + +Você não pode mais minerar nem usar itens + +Agora você pode minerar e usar itens + +Você não pode mais colocar blocos + +Agora você pode colocar blocos + +Agora você pode usar portas e acionadores + +Você não pode mais usar portas e acionadores + +Agora você pode usar recipientes (por ex., baús) + +Você não pode mais usar recipientes (por ex., baús) + +Você não pode mais atacar multidões + +Agora você pode atacar multidões + +Você não pode mais atacar jogadores + +Agora você pode atacar jogadores + +Você não pode mais atacar animais + +Agora você pode atacar animais + +Agora você é um moderador + +Você não é mais um moderador + +Agora você pode voar + +Você não pode mais voar + +Você não vai mais ficar cansado + +Agora você vai ficar cansado + +Agora você é invisível + +Você não é mais invisível + +Agora você é invulnerável + +Você não é mais invulnerável + +%d MSP + +Dragão Ender + +%s entrou no Final + +%s saiu do Final + + +{*C3*}Vejo o jogador ao qual você se refere.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}?{*EF*}{*B*}{*B*} +{*C3*}Sim. Tome cuidado. Ele está em um nível superior agora. Ele pode ler nossos pensamentos.{*EF*}{*B*}{*B*} +{*C2*}Mas isso não importa. Acho que faz parte do jogo.{*EF*}{*B*}{*B*} +{*C3*}Gosto desse jogador. Ele jogou bem. Não desistiu.{*EF*}{*B*}{*B*} +{*C2*}Está lendo nossos pensamentos como se fossem palavras em uma tela.{*EF*}{*B*}{*B*} +{*C3*}É como ele escolhe imaginar muitas coisas, quando vai fundo em um jogo.{*EF*}{*B*}{*B*} +{*C2*}As palavras formam uma interface maravilhosa. Muito flexível. E menos aterrorizante que a realidade por trás da tela.{*EF*}{*B*}{*B*} +{*C3*}Eles costumavam ouvir vozes. Antes de os jogadores poderem ler. Na época em que aqueles que não jogavam chamavam os jogadores de bruxos e feiticeiros. E os jogadores sonhavam em voar em vassouras movidas por demônios.{*EF*}{*B*}{*B*} +{*C2*}Qual era o sonho desse jogador?{*EF*}{*B*}{*B*} +{*C3*}Ele sonhava com luz do sol e árvores. Fogo e água. Ele sonhou e criou. E ele sonhou e destruiu. Ele sonhou e perseguiu, e foi perseguido. Ele sonhou com abrigo.{*EF*}{*B*}{*B*} +{*C2*}Ah, a interface original. Um milhão de anos atrás e ainda funciona. Mas qual foi a estrutura que esse jogador criou na realidade por trás da tela?{*EF*}{*B*}{*B*} +{*C3*}Ele trabalhou, com muitos outros, para esculpir um mundo real em uma comunidade de {*EF*}{*NOISE*}{*C3*} e criou um {*EF*}{*NOISE*}{*C3*} para {*EF*}{*NOISE*}{*C3*}, no {*EF*}{*NOISE*}{*C3*}.{*EF*}{*B*}{*B*} +{*C2*}Ele não pode ler esse pensamento.{*EF*}{*B*}{*B*} +{*C3*}Não. Ele ainda não alcançou esse nível mais elevado. Deverá alcançá-lo no longo sonho da vida e não no curto sonho de um jogo.{*EF*}{*B*}{*B*} +{*C2*}Ele sabe que o adoramos? Que o universo é bom?{*EF*}{*B*}{*B*} +{*C3*}Às vezes, em meio aos seus pensamentos, ele ouve o universo.{*EF*}{*B*}{*B*} +{*C2*}Mas há vezes em que fica triste no longo sonho. Ele cria mundos que não têm verão e estremecem sob um sol negro e transforma sua criação triste em realidade.{*EF*}{*B*}{*B*} +{*C3*}Para curá-lo da aflição ele o destrói. A aflição faz parte de sua tarefa. Não podemos interferir.{*EF*}{*B*}{*B*} +{*C2*}Às vezes, quando estão mergulhados em sonhos, quero dizer a eles que estão construindo mundos reais. Às vezes, quero lhes falar da importância deles para o universo. Às vezes, quando não conseguem uma conexão real, quero lhes ajudar a dizer a palavra que temem.{*EF*}{*B*}{*B*} +{*C3*}Ele lê nossos pensamentos.{*EF*}{*B*}{*B*} +{*C2*}Algumas vezes eu não me importo. Outras vezes desejo dizer a eles que esse mundo que pensam ser verdadeiro é meramente {*EF*}{*NOISE*}{*C2*} e {*EF*}{*NOISE*}{*C2*}, quero dizer a eles que são {*EF*}{*NOISE*}{*C2*} no {*EF*}{*NOISE*}{*C2*}. Eles veem tão pouco da realidade, no longo sonho.{*EF*}{*B*}{*B*} +{*C3*}E ainda assim participam do jogo.{*EF*}{*B*}{*B*} +{*C2*}Mas seria tão fácil dizer a eles...{*EF*}{*B*}{*B*} +{*C3*}Tão forte para esse sonho. Contar que viver é impedi-los de viver.{*EF*}{*B*}{*B*} +{*C2*}Não vou dizer ao jogador como viver.{*EF*}{*B*}{*B*} +{*C3*}O jogador cresce incansavelmente.{*EF*}{*B*}{*B*} +{*C2*}Vou contar uma história ao jogador.{*EF*}{*B*}{*B*} +{*C3*}Mas não a verdade.{*EF*}{*B*}{*B*} +{*C2*}Não. A história que contém a verdade está a salvo em uma gaiola de palavras. Não a verdade nua e crua que pode queimar a qualquer distância.{*EF*}{*B*}{*B*} +{*C3*}Dar a ela um corpo novamente.{*EF*}{*B*}{*B*} +{*C2*}Sim. Jogador...{*EF*}{*B*}{*B*} +{*C3*}Use seu nome.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}. Jogador dos jogos.{*EF*}{*B*}{*B*} +{*C3*}Muito bom.{*EF*}{*B*}{*B*} + + + +{*C2*}Respire fundo agora. Respire novamente. Sinta o ar em seus pulmões. Deixe seus braços voltarem. Isso, mova seus dados. Sinta seu corpo novamente, sob a gravidade, no ar. Volte a existir no longo senha. Ai está você. Seu corpo tocando o universo novamente em cada ponto, como se você fosse coisas separadas. Como se nós fossemos coisas separadas.{*EF*}{*B*}{*B*} +{*C3*}Quem somos nós? Já fomos chamados de espírito da montanha. Pai sol, mãe lua. Espíritos ancestrais, espíritos animais. Jinn. Fantasmas. O homem verde. Depois deuses e demônios. Anjos. Poltergeists. Alienígenas, extraterrestres. Léptons, quarks. As palavras mudam. Nós não.{*EF*}{*B*}{*B*} +{*C2*}Somos o universo. Somos tudo o que não é você. Você está olhando para nós agora, pela pele e por seus olhos. E por que o universo toca sua pele e lança luz sobre você? Para vê-lo, jogador. Para conhecê-lo. E para ser conhecido. Quero lhe contar uma história.{*EF*}{*B*}{*B*} +{*C2*}Era uma vez um jogador.{*EF*}{*B*}{*B*} +{*C3*}Esse jogador era você, {*PLAYER*}.{*EF*}{*B*}{*B*} +{*C2*}Às vezes se julgava humano, na crosta fina de um globo girando de rocha pastosa. A bola de rocha pastosa circundava uma bola de gás flamejante 330 mil vezes mais compacta que ela. Estavam tão longe que a luz levava oito minutos para cruzar a distância. A luz era informação de uma estrela e podia queimar sua pela a 150 milhões de quilômetros de distância.{*EF*}{*B*}{*B*} +{*C2*}Às vezes o jogador sonhava que era um mineiro, na superfície de um mundo plano e infinito. O sol era um quadrado branco. Os dias eram curtos; havia muito a fazer; e a morte era uma inconveniência temporária.{*EF*}{*B*}{*B*} +{*C3*}Às vezes o jogador sonhava que estava perdido em uma história.{*EF*}{*B*}{*B*} +{*C2*}Às vezes sonhava que era outras coisas, em outros lugares. Às vezes esses sonhos eram perturbadores. Outras eram bem bonitos. Às vezes o jogador acordava de um sonho em outro, depois acordava desse em um terceiro.{*EF*}{*B*}{*B*} +{*C3*}Às vezes o jogador sonhava que via palavras em uma tela.{*EF*}{*B*}{*B*} +{*C2*}Vamos voltar.{*EF*}{*B*}{*B*} +{*C2*}Os átomos do jogador estavam espalhados na grama, nos rios, no ar, no chão. Uma mulher recolheu os átomos; ela bebeu, comeu e inalou; e a mulher montou o jogador no próprio corpo.{*EF*}{*B*}{*B*} +{*C2*}E o jogador despertou do mundo quente e escuro do corpo de sua mãe para o longo sonho.{*EF*}{*B*}{*B*} +{*C2*}E o jogador estava em uma nova história, nunca antes contada, escrita nas letras do DNA. E o jogador era um novo programa, nunca antes executado, gerado por um código-fonte de um bilhão de anos. E o jogador era um novo ser humano, que nunca viveu antes, feito de nada além de leite e amor.{*EF*}{*B*}{*B*} +{*C3*}Você é o jogador. A história. O programa. O ser humano. Feito de nada além de leite e amor.{*EF*}{*B*}{*B*} +{*C2*}Vamos retroceder um pouco mais.{*EF*}{*B*}{*B*} +{*C2*}Os sete bilhões, bilhões e bilhões de átomos do corpo do jogador foram criados, muito antes deste jogo, no coração de uma estrela. Então, o jogador também é informação de uma estrela. E o jogador move-se por uma história, que é uma floresta de informações plantadas por um homem chamado Julian, em um mundo plano e infinido criado por um homem chamado Markus, que existe dentre de um pequeno mundo particular criado pelo jogador, que habita um universo criado por...{*EF*}{*B*}{*B*} +{*C3*}Silêncio. Às vezes o jogador criava um mundo pequeno e particular que era tranquilo, quente e simples. Outras difícil, frio e complicado. Às vezes criava um modelo do universo em sua cabeça; sinais de energia movendo-se por vastos espaços vazios. Às vezes chamava esses sinais de "elétrons" e "prótons".{*EF*}{*B*}{*B*} + + + +{*C2*}Às vezes os chamavam de "planetas" e "estrelas".{*EF*}{*B*}{*B*} +{*C2*}Às vezes acreditava estar em um universo feito de energia composta de coisas ocasionais; zeros e uns; linhas de código. Outras vezes achava que estava participando de um jogo. Às vezes acreditava estar lendo palavras em uma tela.{*EF*}{*B*}{*B*} +{*C3*}Você é o jogador, lendo palavras...{*EF*}{*B*}{*B*} +{*C2*}Silêncio... Às vezes o jogador lê linhas do código em uma tela. Decodificadas em palavras; palavras decodificadas em significado; significado decodificado em sentimentos, emoções, teorias, ideias, e o jogador começou a respirar mais rápido e mais profundo e percebeu que estava vivo, era um ser vivo, aquelas milhares de mortes não eram reais, o jogador estava vivo.{*EF*}{*B*}{*B*} +{*C3*}Você. Você. Você está vivo.{*EF*}{*B*}{*B*} +{*C2*}E às vezes o jogador acreditava que o universo falara com ele através da luz do sol que atravessava as folhas das árvores do verão{*EF*}{*B*}{*B*} +{*C3*}e outras acreditava que o universo falara com ele através da luz que atravessava o céu claro da noite de inverno, onde um sinal de luz no canto do olho do jogador pode ser uma estrela um milhão de vezes maior que o sol, mergulhando seus planetas em plasma para ser vista, por um momento, pelo jogador, indo para casa no lado distante do universo, repentinamente sentindo o cheiro de comida, quase na porta familiar, prestes a sonhar novamente{*EF*}{*B*}{*B*} +{*C2*}e às vezes o jogador acreditava que o universo falara com ele através dos zeros e uns, da eletricidade do mundo, nas palavras rolando em uma tela no final de um sonho{*EF*}{*B*}{*B*} +{*C3*}e o universo disse eu amo você{*EF*}{*B*}{*B*} +{*C2*}e o universo disse que você jogou bem{*EF*}{*B*}{*B*} +{*C3*}e o universo disse que tudo o que precisa está dentro de você{*EF*}{*B*}{*B*} +{*C2*}e o universo disse que você é mais forte do que pensa{*EF*}{*B*}{*B*} +{*C3*}e o universo disse que você é a luz do dia{*EF*}{*B*}{*B*} +{*C2*}e o universo disse que você é a noite{*EF*}{*B*}{*B*} +{*C3*}e o universo disse que a escuridão contra a qual luta está dentro de você{*EF*}{*B*}{*B*} +{*C2*}e o universo disse que a luz que busca está dentro de você{*EF*}{*B*}{*B*} +{*C3*}e o universo disse que você não está sozinho{*EF*}{*B*}{*B*} +{*C2*}e o universo disse que você não está separado das demais coisas{*EF*}{*B*}{*B*} +{*C3*}e o universo disse que você é o universo se provando, conversando consigo mesmo, lendo seu próprio código{*EF*}{*B*}{*B*} +{*C2*}e o universo disse eu amo você porque você é amor.{*EF*}{*B*}{*B*} +{*C3*}E o jogo acabou e o jogador acordou do sonho. E o jogador começou um novo sonho. E o jogador sonhou novamente e sonhou melhor. E o jogador era o universo. E o jogador era amor.{*EF*}{*B*}{*B*} +{*C3*}Você é o jogador.{*EF*}{*B*}{*B*} +{*C2*}Acorde.{*EF*} + + +Reiniciar Submundo + +Tem certeza de que quer redefinir o Submundo para o estado padrão neste jogo salvo? Você perderá tudo o que construiu no Submundo! + +Reiniciar Submundo + +Não redefinir Submundo + +Não é possível cortar este Vacogumelo no momento. O número máximo de Porcos, Ovelhas, Vacas e Gatos foi alcançado. + +Não é possível usar Ovo de Geração no momento. O número máximo de Porcos, Ovelhas, Vacas e Gatos foi alcançado. + +Não é possível usar o ovo spawn no momento. O número máximo de vacogumelos foi alcançado. + +Não é possível usar o ovo spawn no momento. O número máximo de lobos em um mundo foi alcançado. + +Não é possível usar o ovo spawn no momento. O número máximo de frangos em um mundo foi alcançado. + +Não é possível usar o ovo spawn no momento. O número máximo de lulas em um mundo foi alcançado. + +Não 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. + +O número máximo de pinturas/quadros de itens foi alcançado. + +Você não pode gerar inimigos no Modo Paz. + +Este animal não pode entrar no Modo 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. + +O número máximo de Cabeças de multidão no mundo foi alcançado. + +Inverter + +Canhoto + +Morreu! + +Gerar Novamente + +Conteúdo para Baixar + +Alterar Capa + +Como Jogar + +Controles + +Configurações + +Créditos + +Reinstalar Conteúdo + +Configurações de Depuração + +Fogo Espalha + +TNT Explode + +Jogador x Jogador + +Confiar nos Jogadores + +Privilégios do Host + +Gerar Estruturas + +Mundo Superplano + +Baú de Bônus + +Opções de Mundo + +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 + +Pode Abrir Recipientes + +Pode Atacar Jogadores + +Pode Atacar Animais + +Moderador + +Expulsar + +Pode Voar + +Desabilitar Exaustão + +Invisível + +Opções do Host + +Jogadores/Convidar + +Jogo online + +Só convidados + +Mais Opções + +Carregar + +Novo Mundo + +Nome do Mundo + +Semente para Criação de Mundo + +Deixar livre p/ uma semente aleatória + +Jogadores + +Entrar no Jogo + +Iniciar Jogo + +Nenhum Jogo Encontrado + +Jogar + +Placares de Líderes + +Conquistas + +Ajuda e Opções + +Desbloquear Jogo Completo + +Continuar Jogo + +Salvar Jogo + +Dificuldade: + +Tipo de Jogo: + +Gamertags: + +Estruturas: + +Tipo de Nível: + +JvJ: + +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 + +Oscilação da visão + +Dicas + +Dicas de Ferramentas do Jogo + +Gamertags no Jogo + +Dividir Tela p/ 2 Jogadores + +Concluído + +Editar mensagem da placa: + +Preencha os detalhes que acompanharão sua captura de tela + +Legenda + +Captura de tela do jogo + +Editar mensagem da placa: + +Olha o que eu fiz no Minecraft: Xbox 360 Edition! + +Texturas, ícones e interface do usuário clássicos do Minecraft! + +Mostrar todos os mundos de Combinações + +Selecionar slot para salvar transferência + +Slot vazio + +Carregando metadados salvos + +Carregando dados salvos + +Carregando jogo salvo para Xbox One + +Carregamento cancelado + +Você cancelou o carregamento deste salvamento para a área de transferência. + +Sem efeitos + +Velocidade + +Lentidão + +Pressa + +Fadiga do Minerador + +Força + +Fraqueza + +Saúde Imediata + +Dano Imediato + +Salto Turbinado + +Náuseas + +Regeneração + +Resistência + +Resistência ao Fogo + +Respirar na Água + +Invisibilidade + +Cegueira + +Visão Noturna + +Fome + +Veneno + +Wither + +Reforço de Saúde + +Absorção + +Saturação + +de Rapidez + +de Lentidão + +de Pressa + +de Lentidão + +de Força + +de Fraqueza + +Cura + +de Dano + +de Salto + +de Náuseas + +de Regeneração + +de Resistência + +de Resistência ao Fogo + +de Respirar na Água + +de Invisibilidade + +de Cegueira + +de Visão Noturna + +de Fome + +de Veneno + +da Decadência + +do Reforço de Saúde + +da Absorção + +da Saturação + + + +II + +III + +IV + +Tchibum + +Mundano + +Desinteressante + +Tranquilo + +Limpo + +Leitoso + +Difuso + +Sem Artifícios + +Fino + +Maligno + +Plano + +Grande + +Desajeitado + +Amanteigado + +Suave + +Suave + +Sofisticado + +Grosso + +Elegante + +Chique + +Charmoso + +Ousado + +Refinado + +Cordial + +Cintilante + +Potente + +Desagradável + +Inodoro + +Classificação + +Severo + +Amargo + +Grosseiro + +Fedido + +Usada como base de todas as poções. Use em uma barraca de poções para criar poções. + +Não tem efeitos, pode ser usada em uma barraca de poções para criar poções adicionando mais ingredientes. + +Aumenta a velocidade de movimento dos jogadores, animais e monstros afetados, e a velocidade de corrida, a extensão dos saltos e o campo de visão dos jogadores. + +Reduz a velocidade de movimento dos jogadores, animais e monstros afetados, e a velocidade de corrida, a extensão dos saltos e o campo de visão dos jogadores. + +Aumenta os danos causados pelos jogadores e monstros afetados durante o ataque. + +Reduz os danos causados pelos jogadores e monstros afetados durante o ataque. + +Aumenta imediatamente a saúde dos jogadores, animais e monstros afetados. + +Reduz imediatamente a saúde dos jogadores, animais e monstros afetados. + +Restaura a saúde dos jogadores, animais e monstros afetados com o tempo. + +Torna os jogadores, animais e monstros afetados imunes a danos do fogo, lava e ataques de Chamas à distância. + +Reduz a saúde dos jogadores, animais e monstros afetados com o tempo. + +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 + +Veneno de Artrópodes + +Coice + +Aspecto de Fogo + +Proteção + +Proteção contra Fogo + +Queda de Pena + +Proteção contra Explosão + +Proteção contra Projétil + +Respiração + +Afinidade com a Água + +Eficiência + +Toque de Seda + +Inquebrável + +Pilhagem + +Sorte + +Poder + +Chama + +Soco + +Infinito + +I + +II + +III + +IV + +V + +VI + +VII + +VIII + +IX + +X + +Pode ser minerado com uma picareta de ferro ou melhor para pegar esmeraldas. + +Similar a um baú, porém os itens colocados dentro do Cofre Ender ficam disponíveis em todos os Cofres Ender do jogador, mesmo em uma dimensão diferente. + +É ativado quando uma entidade passa por um disparador conectado. + +Ativa um gancho disparador conectado quando uma entidade passa sobre ele. + +Uma maneira compacta de armazenar esmeraldas. + +Uma parede feita de paralelepípedos. + +Pode ser usado para consertar armas, ferramentas e armaduras. + +Fundido em fornalha para produzir quartzo. + +Usado como decoração. + +Pode ser negociado com os aldeões. + +Usado como decoração. Flores, mudas, cactos e cogumelos podem ser plantadas nele. + +Restaura 2{*ICON_SHANK_01*} e pode ser transformada em uma cenoura dourada. Pode ser plantada na fazenda. + +Restaura 0.5{*ICON_SHANK_01*}, ou pode ser preparado em fornalha, ou plantado na fazenda. + +Restaura 3{*ICON_SHANK_01*}. Criado ao cozinhar uma batata na fornalha. + +Restaura 1{*ICON_SHANK_01*} Comer isso pode te envenenar. + +Restaura 3{*ICON_SHANK_01*}. Criado com uma cenoura e barras de ouro. + +Usado para controlar um porco encilhado quando estiver montando. + +Restaura 4{*ICON_SHANK_01*}. + +Usado com uma bigorna para encantar armas, ferramentas ou armaduras. + +Criado ao minerar quartzo fundido. Pode ser moldado em um bloco de quartzo. + +Produzido com Lã. Usado como decoração. + +Esmeralda + +Vaso de Flor + +Cenoura + +Batata + +Batata Cozida + +Batata Venenosa + +Cenoura Dourada + +Cenoura na Vareta + +Torta de Abóbora + +Livro Encantado + +Quartzo do Submundo + +Minério de Esmeralda + +Cofre Ender + +Gancho Disparador + +Disparador + +Bloco de Esmeraldas + +Parede de Paralelepípedos + +Parede de Paralelepípedos com Musgo + +Vaso de Flor + +Cenouras + +Batatas + +Bigorna + +Bigorna + +Bigorna pouco danificada + +Bigorna muito danificada + +Minério de Quartzo do Submundo + +Bloco de Quartzo + +Bloco de Quartzo Cinzelado + +Pilar de Bloco de Quartzo + +Escada de Quartzo + +Tapete + +Tapete Preto + +Tapete Vermelho + +Tapete Verde + +Tapete Marrom + +Tapete Azul + +Tapete Roxo + +Tapete Ciano + +Tapete Cinza Claro + +Tapete Cinza + +Tapete Rosa + +Tapete Verde + +Tapete Amarelo + +Tapete Azul-claro + +Tapete Magenta + +Tapete Laranja + +Tapete Branco + +Arenito Cinzelado + +Arenito Macio + +{*PLAYER*} foi morto tentando machucar {*SOURCE*} + +{*PLAYER*} foi esmagado por uma Bigorna que caiu. + +{*PLAYER*} foi esmagado por um bloco que caiu. + +Teleportou {*PLAYER*} para {*DESTINATION*} + +{*PLAYER*} teleportou você até a posição dele + +{*PLAYER*} teleportou-se até você + +Espinhos + +Laje de Quartzo + +Faz as áreas escuras aparecerem claras como se fosse dia, até mesmo as submersas. + +Deixa invisíveis os jogadores, animais e monstros afetados. + +Consertar e Nomear + +Custo do Feitiço: %d + +Muito caro! + +Renomear + +Você tem: + +Itens necessários para negociar + +{*VILLAGER_TYPE*} oferece %s + +Consertar + +Negociar + +Tingir coleira + + + Esta é uma interface de bigorna, que pode ser usada para renomear, consertar e aplicar feitiços em armas, armaduras ou ferramentas ao custo de níveis de experiência. + + + + {*B*} + Pressione{*CONTROLLER_VK_A*} para saber mais sobre a interface de bigorna.{*B*} + Pressione{*CONTROLLER_VK_B*} se vocÇe já sabe usar a interface de bigorna. + + + + Para começar a trabalhar em um item, coloque-o no primeiro espaço disponível. + + + + Quando a matéria-prima correta é colocada no segundo espaço (ex.: lingotes de ferro para uma espada danificada), o reparo proposto aparece no outro espaço. + + + + Como alternativa, um segundo item idêntico pode ser colocado no segundo espaço para combinar os dois itens. + + + + Para enfeitiçar itens na bigorna, coloque um Livro Encantado no segundo espaço. + + + + O número de níveis de experiência que o trabalho custará é mostrado abaixo da saída. Se você não tiver níveis de experiência suficientes, o reparo não será concluído. + + + + É possível renomear o item editando o texto da caixa de textos. + + + + Pegar o item consertado consumirá ambos os itens usados pela bigorna e diminuirá seu nível de experiência pela quantidade informada. + + + + Nesta área há uma bigorna e um baú contendo ferramentas e armas para serem trabalhadas. + + + + {*B*} + Pressione{*CONTROLLER_VK_A*} para saber mais sobre a bigorna.{*B*} + Pressione{*CONTROLLER_VK_B*} se você já sabe o que precisa sobre a bigorna. + + + + Com uma bigorna, armas e ferramentas podem ser consertadas para restaurar sua durabilidade, renomear ou enfeitiçar com Livros Encantados. + + + + Livros Encantados podem ser encontrados dentro de Baús nas masmorras, ou encantados através de livros normais na Mesa de Feitiços. + + + + Usar a bigorna custa níveis de experiência e cada uso tem uma chance de danificá-la. + + + + O tipo de trabalho que deve ser feito, valor do item, número de feitiços e quantidade de trabalho prévio afetam no custo do reparo. + + + + Renomear um item altera o nome exibido para todos os jogadores e reduz permanentemente o custo do trabalho prévio. + + + + Dentro do baú nesta área você encontrará picaretas danificadas, matérias-primas, garrafas de feitiços e livros de encantos para serem experimentados. + + + + Esta é a interface de comércio que mostra os negócios que podem ser feitos com um aldeão. + + + + {*B*} + Pressione{*CONTROLLER_VK_A*} para saber mais sobre a interface de comércio.{*B*} + Pressione{*CONTROLLER_VK_B*} se você já sabe o que precisa sobre a interface de comércio. + + + + Todos os negócios que o aldeão quer fazer no momento são exibidos no topo. + + + + Os negócios aparecem em vermelho e não estarão disponíveis se você não tiver itens suficientes. + + + + A quantidade e tipo de itens que você fornece para o aldeão aparecem dentro das duas caixas à esquerda. + + + + Você pode ver o total de itens necessários para negociar nas duas caixas à esquerda. + + + + Pressione{*CONTROLLER_VK_A*} para negociar os itens que o aldeão quer para o item ofertado. + + + + Neste área há um aldeão e um baú contendo papel para comprar itens. + + + + {*B*} + Pressione{*CONTROLLER_VK_A*} para saber mais sobre negociar.{*B*} + Pressione{*CONTROLLER_VK_B*} se você já sabe o que precisa sobre negociar. + + + + Jogadores podem negociar itens de seus estoques com os aldeões. + + + + Os produtos de um aldeão dependem da sua profissão. + + + + Efetuar uma mistura de negócios adicionará aleatoriamente ou melhorará os produtos disponíveis do aldeão. + + + + Produtos que foram negociados frequentemente pode ser removidos temporariamente, mas um aldeão sempre terá algo para negociar. + + + + Pegue um papel do baú e tente negociar com o aldeão. + + + + Nesta área há dois Cofres Ender. + + + + {*B*} + Pressione{*CONTROLLER_VK_A*} para saber mais sobre Cofres Ender.{*B*} + Pressione{*CONTROLLER_VK_B*} se você já sabe o suficiente sobre Cofres Ender. + + + + Todos os Cofres Ender em um mundo são interconectados, até mesmo em dimensões diferentes. Os itens colocados em um Cofre Ender estarão disponíveis em qualquer outro Cofre Ender. + + + + Contudo, os conteúdos dos Baús Ender são diferentes para cada jogador. + + + + Isso permite que os jogadores armazenem itens em qualquer Cofre Ender e os recuperem em outro Cofre Ender em um lugar diferente do mundo. Você pode experimentar isso agora colocando itens em ambos os Cofres Ender. + + +Restaura 2{*ICON_SHANK_01*}, regenera saúde por 30 segundos e concede resistência ao fogo e resistência a danos por 5 minutos. Feita com uma maçã e blocos de ouro. + +Pode teleportar + +Teleportar + +Teleportar para o jogador + +Teleportar para mim + +Pode desativar a exaustão + +Pode ficar invisível + +Agora você pode ativar a invisibilidade + +Você não pode mais ativar a invisbilidade + +Agora você pode ativar voo + +Você não pode mais ativar voo + +Agora você pode desativar a exaustão + +Você não pode mais desativar a exaustão + +Agora você pode teleportar + +Você não pode mais teleportar + +{*T3*}COMO JOGAR: BIGORNA{*ETW*}{*B*}{*B*} +Níveis de experiência também podem ser utilizados para consertar, encantar ou renomear itens com a Bigorna.{*B*} +Todos os itens podem ser renomeados, embora apenas itens com durabilidade podem ser consertados ou ser encantados com Livros Encantados aplicados a eles.{*B*} +Um item pode ser consertado ao colocá-lo em um dos espaços à esquerda, junto com a matéria-prima do produto, como Lingotes de ferro para uma Espada de ferro, ou combinados com outro item do mesmo tipo.{*B*} +Combinar itens é mais eficiente quando feito com uma Bigorna, e ainda, se algun dos itens tiver sido encantado, o produto final pode ter encantos de ambas as origens.{*B*} +Livros encantados podem aplicar encantos em itens ao combiná-los em uma Bigorna, desde que o encanto dos Livros seja adequado. Livros encantados podem ser encontrados em Baús nas masmorras ou encantados a partir de livros normais na Mesa de Feitiços.{*B*} +Há uma chance da Bigorna ser danificada a cada uso, e com o uso continuado ela se destruirá.{*B*} + + +{*T3*}COMO JOGAR: NEGOCIANDO{*ETW*}{*B*}{*B*} +É possível comprar e vender itens com os aldeões. Cada aldeão tem uma profissão; eles podem ser Fazendeiros, Açougueiros, Ferreiros, Bibliotecários ou Padres, e isso afeta o tipo de itens que eles podem negociar.{*B*} +Você encontra uma lista de todos os itens que um aldeão oferece no menu de negociações. Um aldeão pode modificar ou adicionar aos seus negócios sempre que um jogador negocia com ele, embora uma negociação possa ficar temporariamente desabilitada se usada com muita frequência.{*B*} +Os negócios normalmente envolvem vender ou comprar diversos itens por esmeraldas.{*B*} +Se você não tem os itens necessários para um negócio, os espaços ficarão vermelhos.{*B*} + + +{*T3*}COMO JOGAR: BAÚ ENDER {*ETW*}{*B*}{*B*} +Todos os Baús Ender em um mundo são vinculados; itens colocados em um Baú Ender são acessíveis em qualquer outro. Porém, o conteúdo dos Baús Ender são diferentes para cada jogador. Desta forma os jogadores podem armazenar itens em um Baú Ender e recuperá-lo em outros Baús Ender em outros locais do mundo. + + +Fazendeiro + +Bibliotecário + +Padre + +Ferreiro + +Açogueiro + +Encontrados nas aldeias, os aldeões se oferecerão para vender itens para o jogador de acordo com sua profissão. + +Baú grande + + + Você também pode criar Livros Encantados na Mesa de Feitiços, que pode ser usada depois na Bigorna para aplicar seu feitiço em um item. + + + + Ganchos com Cordas também providenciarão força para um circuito enquanto algo estiver acionando a corda entre eles. + + + + Uma vez domado, um lobo usará sempre uma coleira. A cor da coleira pode ser alterada com tingimento. + + +Cenouras e Batatas são cultivadas ao plantar Cenouras ou Batatas, e estarão prontas para a colheita quando o vegetal estiver visível no solo. + + + E mais, porcos podem ser encilhados, montados e guiados pelo jogador. Controle-os atiçando com uma Cenoura na vareta. + + + + Se necessário, você pode mover seu carrinho de mina lentamente usando {*CONTROLLER_ACTION_MOVE*}. Isso ajuda a ativar o carrinho de mina colocando-o sobre um trilho com propulsão. + + +Você não pode entrar neste jogo, pois a tela dividida só é compatível com o modo de Alta Definição. Remova todos os outros jogadores se quiser entrar. + +Cura + +Xbox 360 + +Voltar + +Esta opção desativa as atualizações de Conquistas e do placar de líderes nesse mundo enquanto estiver jogando e se for carregá-lo novamente depois de salvar com esta opção ativada. + +Carregar jogo salvo para o Xbox One + +Carregar Salvamento + +Só é possível armazenar um salvamento do Xbox 360 por vez na área de transferência. Certifique-se de que baixou o salvamento atual no seu console Xbox One antes de enviar outro salvamento de Xbox 360. + +Enviando... + +Envio concluído! + +Falha no carregamento. Tente novamente mais tarde. + + diff --git a/Minecraft.Client/Common/Media/pt-PT/4J_strings.resx b/Minecraft.Client/Common/Media/pt-PT/4J_strings.resx new file mode 100644 index 00000000..ab38c1c5 --- /dev/null +++ b/Minecraft.Client/Common/Media/pt-PT/4J_strings.resx @@ -0,0 +1,108 @@ + +Não Utilizado + +OK + +Anterior + +Cancelar + +Sim + +Não + +Dados Guardados Corrompidos + +Os teus dados guardados parecem estar corrompidos. Queres gravar novamente e substituir os dados corrompidos? + +Sem Espaço Livre + +O dispositivo de armazenamento que selecionaste não tem espaço livre suficiente para guardar os dados de jogo. + +Selecionar novamente + +Jogar sem guardar + +Guardar novos dados + +Substituir os dados? + +O dispositivo de armazenamento selecionado já contém dados guardados. Tens a certeza de que queres substituí-los? + +Não - não substituir + +Substituir e guardar + +Falha ao guardar + +Problema de disp. de armazen. + +O teu dispositivo de armazenamento não está disponível ou tem um erro + +O teu dispositivo de armazenamento não está disponível ou apresenta um erro. Seleciona um novo dispositivo de armazenamento. + +Selecionar novo dispositivo + +Nenhum disp. de arm. selecionado + +Se não selecionares um dispositivo, a opção de guardar os dados de jogo será desativada + +Selecionar disp. armazenamento + +Continuar sem guardar + +O teu dispositivo de armazenamento foi removido. Seleciona um novo dispositivo. + +Falha ao carregar + +Atrib. nome aos dados guardados + +Introduz um nome para os dados de jogo guardados + +Voltar à Interface Xbox + +Tens a certeza de que queres sair do jogo? + +Sessão terminada + +Foste reencaminhado para o ecrã principal porque o teu perfil de jogador terminou sessão + +O jogo terminou porque um perfil de jogador terminou sessão + +Continuar a jogar + +Perfil de jogador offline + +O jogo tem algumas funcionalidades que requerem um perfil de jogador ativo no Xbox LIVE, mas de momento estás offline. + +Esta funcionalidade requer um perfil de jogador ligado ao Xbox LIVE. + +Ligar ao Xbox LIVE + +Continuar a jogar offline + +Problema ao Obter Feito + + Ocorreu um problema ao aceder ao teu perfil de jogador. Não foi possível atribuir-te o feito neste momento. + +Problema com o perfil de jogador + +Falha ao guardar as definições no perfil de jogador. + +Perfil de Jogador Convidado + +O perfil de jogador convidado não pode aceder a esta funcionalidade. Utiliza um perfil de jogador diferente. + +A guardar… + +A guardar conteúdo. Por favor não desligue a consola. + +Desbloquear Jogo Completo + +Esta é a versão de avaliação do Minecraft. Se tivesses o jogo completo, terias acabado de ganhar um feito! +Desbloqueia o jogo completo para experimentares a diversão do Minecraft e para jogares com os teus amigos em todo o mundo através do Xbox LIVE. +Queres desbloquear o jogo completo? + +Estás a ser reencaminhado para o menu principal devido a um problema de leitura do teu perfil. + + diff --git a/Minecraft.Client/Common/Media/pt-PT/strings.resx b/Minecraft.Client/Common/Media/pt-PT/strings.resx new file mode 100644 index 00000000..6fee7199 --- /dev/null +++ b/Minecraft.Client/Common/Media/pt-PT/strings.resx @@ -0,0 +1,5158 @@ + +Novo Conteúdo Transferível disponível! Acede-lhe a partir do botão Loja Minecraft no Menu Principal. + +Podes mudar o aspeto da personagem com um Pacote de Skins da Loja Minecraft. Seleciona "Loja Minecraft" no Menu Principal para veres o que está ao teu dispor. + +No modo de Alta Definição, podem jogar até 4 jogadores na mesma consola com o ecrã dividido! + +Liga controladores extra à tua consola e prime START para te juntares a um jogo a qualquer altura. + +Altera as definições de gama para veres o jogo com maior ou menor luminosidade. + +Se configurares a dificuldade do jogo para Calmo, a tua saúde irá regenerar automaticamente e não surgirão monstros durante a noite! + +Dá um osso a um lobo para o domares. Depois, poderás ordenar-lhe para se sentar ou seguir-te. + +No menu Inventário, podes largar os objetos movendo o ponteiro para fora do menu e premindo{*CONTROLLER_VK_A*} + +Se dormires numa cama durante a noite irás acelerar o jogo até de madrugada, mas é necessário que todos os jogadores no jogo multijogador estejam a dormir em camas ao mesmo tempo. + +Para recuperares saúde, obtém costeletas a partir dos porcos, cozinha-as e come-as. + +Recolhe cabedal a partir das vacas e constrói armaduras. + +Se tiveres um balde vazio, poderás enchê-lo com leite de vaca, água ou lava! + +Utiliza uma enxada para preparar áreas de terreno para o cultivo. + +As aranhas não te atacam durante o dia, a não ser que as ataques. + +Utiliza uma pá para escavares terra ou areia mais rápido do que com as mãos! + +Se comeres as costeletas cozinhadas, irás ganhar mais saúde do que se as comeres cruas. + +Cria tochas para iluminares algumas zonas durante a noite. Os monstros não se aproximam das tochas. + +Chega ao destino mais rapidamente com uma vagoneta sobre carris! + +Planta alguns rebentos para que se transformem em árvores. + +Os pastores não te irão atacar, se não os atacares. + +Podes alterar o ponto de regeneração do jogo e avançar até à madrugada dormindo numa cama. + +Atira essas bolas de fogo de volta para o Ghast! + +Constrói um portal para poderes viajar até outra dimensão - o Submundo. + +Prime{*CONTROLLER_VK_B*} para largares o objeto que tens na mão! + +Usa a ferramenta certa para a tarefa! + +Se não conseguires encontrar carvão para as tochas, podes produzir carvão vegetal a partir de árvores numa fornalha. + +Não é boa ideia escavares diretamente para cima ou para baixo. + +O pó de ossos (obtido a partir de um osso de Esqueleto) pode ser utilizado como fertilizante e pode fazer com que as plantações cresçam instantaneamente! + +Os Creepers explodem quando se aproximam de ti! + +A obsidiana forma-se quando a água atinge um bloco de lava. + +A lava pode demorar vários minutos a desaparecer COMPLETAMENTE quando o bloco de origem é removido. + +A pedra arredondada resiste às bolas de fogo do Ghast, sendo muito útil para proteger portais. + +Os blocos que podem ser utilizados como fonte de luz, tais como tochas, glowstone e abóboras iluminadas, derretem a neve e o gelo. + +Tem cuidado ao construíres estruturas de lã a céu aberto, uma vez que os raios durante as trovoadas podem incendiar a lã. + +Um único balde de lava pode ser utilizado na fornalha para fundir 100 blocos. + +O instrumento tocado pelo bloco de notas depende do material sobre o qual se encontra. + +Os Mortos-vivos e Esqueletos conseguem sobreviver à luz do dia se estiverem dentro de água. + +Se atacares um lobo, todos os lobos nas redondezas irão virar-se contra ti. Isto também acontece com os Pastores Mortos-vivos. + +Os lobos não conseguem entrar no Submundo. + +Os lobos não atacam Creepers. + +As galinhas põem um ovo a cada 5 ou 10 minutos. + +A obsidiana só pode ser extraída com uma picareta de diamante. + +Os Creepers são a fonte mais comum de pólvora. + +Cria um baú grande colocando dois baús lado a lado. + +Podes ver o estado de saúde dos lobos domados pela posição da sua cauda. Dá-lhes carne para os curares. + +Cozinha catos numa fornalha para obteres tinta verde. + +Obtém as mais recentes novidades sobre este jogo do 4J Studios e do Kappische no Twitter! + +Impressiona os teus amigos publicando capturas de ecrã das tuas criações do Minecraft no Facebook a partir do menu de Pausa! + +Lê a secção Novidades nos menus Instruções de Jogo para obteres as informações mais recentes sobre o jogo. + +Cercas empilháveis já disponíveis no jogo! + +minecraftforum tem uma secção dedicada à Edição Xbox 360. + +Alguns animais seguir-te-ão se tiveres trigo na mão. + +Se um animal não se puder mover mais de 20 blocos em qualquer direção, ele não se irá desmaterializar. + +Música de C418! + +O Notch tem mais de um milhão de seguidores no Twitter! + +Nem todos os suecos são loiros. Alguns, como o Jens da Mojang, são ruivos! + +Nós pensamos que a 4J Studios retirou o Herobrine do jogo para a consola Xbox 360, mas não temos a certeza. + +Este jogo será atualizado no futuro! + +Quem é o Notch? + +A Mojang tem mais prémios do que colaboradores! + +Alguns famosos jogam Minecraft! + +deadmau5 gosta de Minecraft! + +Não olhes diretamente para os bugs. + +Os Creepers nasceram de um bug de codificação. + +É uma galinha ou um pato? + +Estiveste na Minecon? + +Nunca ninguém da Mojang viu a cara do Junkboy. + +Sabias que existe um Minecraft Wiki? + +O novo escritório do Mojang é fixe! + +Minecraft: Xbox 360 Edition bateu muitos recordes! + +O Minecon 2013 foi em Orlando, Florida, nos EUA! + +.party() foi fantástica! + +Assume sempre que os rumores são falsos e não verdadeiros! + +{*T3*}INSTRUÇÕES DE JOGO : PRINCÍPIOS BÁSICOS{*ETW*}{*B*}{*B*} +Em Minecraft, podes criar tudo aquilo que quiseres colocando blocos. À noite, os monstros andam por aí; constrói um abrigo antes que seja tarde.{*B*}{*B*} +Usa{*CONTROLLER_ACTION_LOOK*} para olhares em redor.{*B*}{*B*} +Usa{*CONTROLLER_ACTION_MOVE*} para te deslocares.{*B*}{*B*} +Prime{*CONTROLLER_ACTION_JUMP*} para saltar.{*B*}{*B*} +Prime rapidamente{*CONTROLLER_ACTION_MOVE*} para a frente duas vezes para fazeres um sprint. Enquanto manténs premido o {*CONTROLLER_ACTION_MOVE*} para a frente, a personagem irá continuar a correr até que se esgote o tempo ou que a Barra de Comida tenha menos de{*ICON_SHANK_03*}.{*B*}{*B*} +Mantém premido{*CONTROLLER_ACTION_ACTION*} para escavar e cortar utilizando as mãos ou os objetos que estiveres a segurar. Podes ter de criar uma ferramenta para colocares alguns blocos.{*B*}{*B*} +Se estiveres a segurar um objeto, usa{*CONTROLLER_ACTION_USE*} para o utilizares ou prime{*CONTROLLER_ACTION_DROP*} para o largares. + +{*T3*}INSTRUÇÕES DE JOGO : MOSTRADOR SUPERIOR{*ETW*}{*B*}{*B*} +O MOSTRADOR SUPERIOR apresenta informação sobre o teu estado; a tua saúde, o oxigénio que te resta quando estás debaixo de água, o teu nível de fome (tens de comer para reabasteceres) e a armadura, caso estejas a usar alguma. Se perderes saúde, mas tiveres uma barra de comida com 9 ou mais{*ICON_SHANK_01*}, a tua saúde será imediatamente reabastecida. Ao comeres, reabasteces a barra de comida.{*B*} +Aqui também é mostrada a Barra de Experiência, com um valor numérico que mostra o nível de Experiência, e a barra que indica quantos Pontos de Experiência te faltam para subires de nível. Ganhas Pontos de Experiência recolhendo os Orbes de Experiência que os habitantes deixam cair quando morrem, ao escavar certos tipos de blocos, ao criar animais, ao pescar e ao fundir minério na fornalha.{*B*}{*B*} +Também apresenta os objetos disponíveis para usares. Usa{*CONTROLLER_ACTION_LEFT_SCROLL*} e{*CONTROLLER_ACTION_RIGHT_SCROLL*} para mudares o objeto que estás a segurar. + +{*T3*}INSTRUÇÕES DE JOGO : INVENTÁRIO{*ETW*}{*B*}{*B*} +Usa{*CONTROLLER_ACTION_INVENTORY*} para veres o teu inventário.{*B*}{*B*} +Este ecrã mostra os objetos disponíveis que tens na mão e todos os objetos que estás a transportar. A tua armadura também é mostrada aqui.{*B*}{*B*} +Usa{*CONTROLLER_MENU_NAVIGATE*} para moveres o ponteiro. Usa{*CONTROLLER_VK_A*} para selecionares um objeto com o ponteiro. Caso exista mais do que um objeto, irás selecioná-los todos, ou poderás usar{*CONTROLLER_VK_X*} para selecionares apenas metade.{*B*}{*B*} +Move o objeto com o ponteiro sobre outro espaço no inventário e coloca-o nesse espaço utilizando{*CONTROLLER_VK_A*}. Caso tenhas selecionado vários objetos com o ponteiro, usa{*CONTROLLER_VK_A*} para os colocares todos ou{*CONTROLLER_VK_X*} para colocares apenas um.{*B*}{*B*} +Se o ponteiro estiver sobre uma armadura, verás uma descrição que te permite colocá-la rapidamente no espaço correto do inventário.{*B*}{*B*} +É possível mudar a cor da tua Armadura de Cabedal tingindo-a. Podes fazê-lo no menu de inventário mantendo a tinta no teu ponteiro e premindo{*CONTROLLER_VK_X*} enquanto o ponteiro está sobre a peça que pretendes tingir. + + +{*T3*}INSTRUÇÕES DE JOGO : BAÚ{*ETW*}{*B*}{*B*} +Depois de criares um Baú, podes colocá-lo no mundo e usá-lo com{*CONTROLLER_ACTION_USE*} para armazenar objetos do teu inventário.{*B*}{*B*} +Usa o ponteiro para mover os objetos do inventário para o baú.{*B*}{*B*} +Os objetos armazenados no baú podem ser colocados no inventário mais tarde. + + +{*T3*}INSTRUÇÕES DE JOGO : BAÚ GRANDE{*ETW*}{*B*}{*B*} +Ao colocares dois baús um ao lado do outro, estes combinam-se e formam um Baú Grande, que pode armazenar ainda mais objetos.{*B*}{*B*} +É utilizado da mesma forma que um baú normal. + + +{*T3*}INSTRUÇÕES DE JOGO : CRIAÇÃO{*ETW*}{*B*}{*B*} +Na interface de Criação, podes combinar objetos do inventário para criar novos tipos de objetos. Usa{*CONTROLLER_ACTION_CRAFTING*} para abrir a interface de criação.{*B*}{*B*} +Desloca-te pelos separadores no topo utilizando{*CONTROLLER_VK_LB*} e{*CONTROLLER_VK_RB*} para selecionar o tipo de objeto que pretendes criar, depois usa{*CONTROLLER_MENU_NAVIGATE*} para selecionar o objeto a criar.{*B*}{*B*} +A área de criação mostra os objetos necessários para criar o novo objeto. Prime{*CONTROLLER_VK_A*} para criar o objeto e coloca-o no teu inventário. + + +{*T3*}INSTRUÇÕES DE JOGO : MESA DE CRIAÇÃO{*ETW*}{*B*}{*B*} +Podes criar objetos maiores utilizando uma Mesa de Criação.{*B*}{*B*} +Coloca a mesa no mundo e prime{*CONTROLLER_ACTION_USE*} para a usares.{*B*}{*B*} +A criação na mesa funciona da mesma forma que a criação básica, mas tens à tua disposição uma área maior e uma seleção de objetos mais ampla. + + +{*T3*}INSTRUÇÕES DE JOGO : FORNALHA {*ETW*}{*B*}{*B*} +A Fornalha permite-te alterar os objetos através do fogo. Por exemplo, podes transformar minério de ferro em lingotes de ferro.{*B*}{*B*} +Coloca a fornalha no mundo e prime{*CONTROLLER_ACTION_USE*} para a usares.{*B*}{*B*} +Tens de colocar o combustível na parte de baixo da fornalha e o objeto que queres alterar por cima. O fogo é ateado e a fornalha acende-se.{*B*}{*B*} +Depois de alterados os objetos, podes movê-los da área de saída para o inventário.{*B*}{*B*} +Se o objeto sobre o qual se encontra o ponteiro for um ingrediente ou combustível para a fornalha, surgirão descrições que te permitem mover o objeto para a fornalha com um movimento rápido. + + +{*T3*}INSTRUÇÕES DE JOGO : DISTRIBUIDOR{*ETW*}{*B*}{*B*} +O Distribuidor é utilizado para disparar objetos. Terás de colocar um interruptor, por exemplo, uma alavanca, junto ao distribuidor.{*B*}{*B*} +Para encheres o distribuidor prime{*CONTROLLER_ACTION_USE*}, depois move os objetos que queres distribuir do inventário para o distribuidor.{*B*}{*B*} +Quando usares o interruptor, o distribuidor irá disparar um objeto. + + +{*T3*}INSTRUÇÕES DE JOGO : PREPARAÇÃO DE POÇÕES{*ETW*}{*B*}{*B*} +Para preparares poções precisas de um Posto de Poções, que pode ser construído numa mesa de criação. Todas as poções começam com uma garrafa de água, que é criada enchendo uma Garrafa de Vidro com água de um Caldeirão ou de uma fonte de água.{*B*} +O Posto de Poções tem três orifícios para garrafas, por isso, podes preparar três poções ao mesmo tempo. Os ingredientes podem ser usados nas três garrafas, por isso, utiliza da melhor forma os teus recursos para preparares três poções em simultâneo.{*B*} +Se colocares um ingrediente na posição superior do Posto de Poções, passado pouco tempo terás criado uma poção base. Isto por si só não tem qualquer efeito, mas se colocares outro ingrediente com esta poção de base, irás obter uma poção com um efeito.{*B*} +Depois, podes adicionar um terceiro ingrediente para que o efeito dure mais tempo (utilizando Pó de Redstone), seja mais intenso (utilizando Pó de Glowstone) ou se transforme numa poção negativa (utilizando um Olho de Aranha Fermentado).{*B*} +Também podes adicionar pólvora a qualquer poção para a transformares numa Poção Explosiva, que pode ser atirada. Ao atirares uma Poção Explosiva, o seu efeito será aplicado em toda a área onde aterrar.{*B*} + +Os ingredientes para as poções são:{*B*}{*B*} +* {*T2*}Verruga do Submundo{*ETW*}{*B*} +* {*T2*}Olho de Aranha{*ETW*}{*B*} +* {*T2*}Açúcar{*ETW*}{*B*} +* {*T2*}Lágrima de Ghast{*ETW*}{*B*} +* {*T2*}Pó de Blaze{*ETW*}{*B*} +* {*T2*}Creme de Magma{*ETW*}{*B*} +* {*T2*}Melancia Brilhante{*ETW*}{*B*} +* {*T2*}Pó de Redstone{*ETW*}{*B*} +* {*T2*}Pó de Glowstone{*ETW*}{*B*} +* {*T2*}Olho de Aranha Fermentado{*ETW*}{*B*}{*B*} + +Experimenta várias combinações de ingredientes para descobrires as diferentes poções que podes preparar. + + +{*T3*}INSTRUÇÕES DE JOGO: FEITIÇOS{*ETW*}{*B*}{*B*} +Os Pontos de Experiência recolhidos quando um habitante morre, ou quando certos blocos são extraídos ou fundidos numa fornalha, podem ser usados para enfeitiçar algumas ferramentas, armas, armaduras e livros.{*B*} +Quando é colocada uma Espada, Arco, Machado, Picareta, Pá, Armadura ou Livro no orifício por baixo do livro na Mesa de Feitiços, os três botões à direita do orifício apresentam alguns feitiços e os respetivos custos em Níveis de Experiência.{*B*} +Se não tiveres Níveis de Experiência suficientes para usar alguns destes, o custo surgirá a vermelho, caso contrário surgirá a verde.{*B*}{*B*} +O feitiço aplicado é selecionado aleatoriamente com base no custo apresentado.{*B*}{*B*} +Se a Mesa de Feitiços estiver rodeada de Estantes (até um máximo de 15 Estantes), com um bloco de intervalo entre a Estante e a Mesa de Feitiços, o poder dos feitiços irá aumentar e ver-se-ão glifos misteriosos a sair do livro na Mesa de Feitiços.{*B*}{*B*} +Todos os ingredientes para uma Mesa de Feitiços podem ser encontrados nas aldeias de um mundo, ou escavando ou cultivando no mundo.{*B*}{*B*} +Os Livros de Feitiços são usados na Bigorna para aplicar feitiços a itens. Isto dá-te maior controlo sobre os feitiços que gostarias de ter nos teus itens.{*B*} + + +{*T3*}INSTRUÇÕES DE JOGO : ANIMAIS DE QUINTA{*ETW*}{*B*}{*B*} +Se quiseres manter os teus animais num único sítio, constrói uma área vedada com menos de 20 blocos em cada lado e coloca lá dentro os teus animais. Assim, garantes que eles ainda lá estarão quando regressares. + + +{*T3*}INSTRUÇÕES DE JOGO : ANIMAIS DE CRIAÇÃO{*ETW*}{*B*}{*B*} +Em Minecraft, os animais podem reproduzir-se e dar origem a animais bebé!{*B*} +Para fazeres criação, precisas de os alimentar com a comida certa, para que eles entrem em 'Modo Amor'.{*B*} +Dá Trigo a Vacas, Vacogumelos ou Ovelhas, Cenouras a porcos, Sementes de Trigo ou Verrugas do Submundo a Galinhas, ou qualquer tipo de carne a um Lobo, e estes animais começarão a procurar outro animal da sua espécie que também esteja em Modo Amor.{*B*} +Quando dois animais da mesma espécie se encontram e estão ambos em Modo Amor, eles beijam-se durante uns segundos e depois aparece um animal bebé. O animal bebé seguirá os pais durante um tempo antes de se transformar num animal adulto.{*B*} +Depois de estar em Modo Amor, um animal não poderá voltar a esse estado durante cerca de cinco minutos.{*B*} +Há um limite para o número de animais que podes ter num mundo, pelo que, se já tiveres muitos, os animais podem não se reproduzir. + +{*T3*}INSTRUÇÕES DE JOGO : PORTAL DO SUBMUNDO{*ETW*}{*B*}{*B*} +O Portal do Submundo permite ao jogador viajar entre o Mundo Superior e o Submundo. O Submundo pode ser usado para viajar rapidamente no Mundo Superior - viajar um bloco no Submundo equivale a viajar 3 blocos no Mundo Superior, por isso, quando constróis um portal no Submundo e sais através do mesmo, estarás 3 vezes mais longe do teu ponto de entrada.{*B*}{*B*} +Para construir o portal são necessários pelo menos 10 blocos de Obsidiana, e o portal tem de ter 5 blocos de altura, 4 de largura e 1 de profundidade. Depois de construíres a estrutura do portal, o espaço interior da estrutura terá de ser incendiado para ser ativado. Podes fazê-lo utilizando o item de Sílex e Aço ou o item Carga de Fogo.{*B*}{*B*} +Na imagem à direita são apresentados exemplos da construção do portal. + + +{*T3*}INSTRUÇÕES DE JOGO : MULTIJOGADOR{*ETW*}{*B*}{*B*} +O Minecraft para a consola Xbox 360 é, por definição, um jogo multijogador. Se estiveres a jogar no modo de Alta Definição, podes competir com outros jogadores ligando os controladores na consola e premindo START a qualquer altura durante o jogo.{*B*}{*B*} +Ao iniciares ou participares num jogo online, essa informação ficará visível na tua lista de amigos (exceto se tiveres selecionado Apenas Por Convite ao criar o jogo) e se eles participarem no jogo, também ficará visível nas suas listas de amigos (se tiveres selecionado a opção Permitir Amigos de Amigos).{*B*} +Durante um jogo, podes premir o botão BACK para abrires uma lista de todos os outros participantes no jogo, ver os seus Gamercards, expulsar jogadores e convidar outras pessoas para participarem no jogo. + + +{*T3*}INSTRUÇÕES DE JOGO : PARTILHAR CAPTURAS DE ECRÃ{*ETW*}{*B*}{*B*} +Podes obter uma captura de ecrã do teu jogo abrindo o Menu Pausa e premindo {*CONTROLLER_VK_Y*} para Partilhar no Facebook. Surge uma versão em miniatura da captura de ecrã e podes editar o texto associado à publicação no Facebook.{*B*}{*B*} +Existe um modo de câmara especial para obter estas capturas de ecrã, que te permite ver a tua personagem de frente na imagem - prime {*CONTROLLER_ACTION_CAMERA*} até surgir a vista frontal da tua personagem antes de premires {*CONTROLLER_VK_Y*} para Partilhar.{*B*}{*B*} +Os Gamertags não são mostrados na captura de ecrã. + + +{*T3*}INSTRUÇÕES DE JOGO : NÍVEIS DE EXCLUSÃO{*ETW*}{*B*}{*B*} +Se encontrares conteúdo ofensivo num nível, podes adicioná-lo à lista de Níveis Excluídos. +Para tal, abre o menu Pausa e prime {*CONTROLLER_VK_RB*} para selecionar a descrição do Nível Excluído. +Se tentares jogar este nível no futuro, serás notificado de que este nível se encontra na tua lista de Níveis Excluídos e ser-te-á dada a opção de o remover da lista e continuar a jogar o nível ou retroceder. + +{*T3*}INSTRUÇÕES DE JOGO : MODO CRIATIVO{*ETW*}{*B*}{*B*} +A interface do modo criativo permite que qualquer objeto no jogo seja movido para o inventário do jogador sem ser necessário escavar ou criar o objeto. +Os objetos no inventário do jogador não serão removidos quando são colocados ou utilizados no mundo, o que permite ao jogador concentrar-se na construção em vez de na recolha de recursos.{*B*} +Se criares, carregares ou guardares um mundo no Modo Criativo, as atualizações de feitos e classificações serão desativadas nesse mundo, mesmo que seja carregado depois no Modo Sobrevivência.{*B*} +Para voar no Modo Criativo, prime rapidamente {*CONTROLLER_ACTION_JUMP*} duas vezes. Para parar de voar, repete a ação. Para voares mais rápido, prime rapidamente{*CONTROLLER_ACTION_MOVE*} para a frente duas vezes enquanto estiveres a voar. +No modo de voo, podes manter premido{*CONTROLLER_ACTION_JUMP*} para subires e{*CONTROLLER_ACTION_SNEAK*} para desceres, ou utilizar{*CONTROLLER_ACTION_DPAD_UP*} para subires, {*CONTROLLER_ACTION_DPAD_DOWN*} para desceres, +{*CONTROLLER_ACTION_DPAD_LEFT*} para ires para a esquerda e {*CONTROLLER_ACTION_DPAD_RIGHT*} para ires para a direita. + +{*T3*}INSTRUÇÕES DE JOGO : OPÇÕES DE ANFITRIÃO E JOGADOR{*ETW*}{*B*}{*B*} + +{*T1*}Opções de Jogo{*ETW*}{*B*} +Ao carregar ou criar um mundo, prime o botão "Mais Opções" para abrir um menu que te dá maior controlo sobre o teu jogo.{*B*}{*B*} + + {*T2*}Jogador vs. Jogador{*ETW*}{*B*} + Quando ativada, os jogadores podem causar danos a outros jogadores. Esta opção afeta apenas o modo Sobrevivência.{*B*}{*B*} + + {*T2*}Confiar Jogadores{*ETW*}{*B*} + Quando desativada, os jogadores que participam no jogo ficam limitados na sua ação. Não podem obter ou usar objetos, colocar blocos, usar portas e interruptores, usar contentores, nem atacar jogadores ou animais. Podes alterar estas opções para um determinado jogador utilizando o menu do jogo.{*B*}{*B*} + + {*T2*}Propagação de Fogo{*ETW*}{*B*} + Quando ativada, o fogo pode propagar-se para os blocos inflamáveis mais próximos. Esta opção pode ser alterada dentro do jogo.{*B*}{*B*} + + {*T2*}Explosões de TNT{*ETW*}{*B*} + Quando ativada, o TNT explode quando é detonado. Esta opção pode ser alterada dentro do jogo.{*B*}{*B*} + + {*T2*}Privilégios de Anfitrião{*ETW*}{*B*} + Quando ativada, o anfitrião pode ativar a sua capacidade de voar, desativar a exaustão e tornar-se invisível a partir do menu do jogo. {*DISABLES_ACHIEVEMENTS*}{*B*}{*B*} + + {*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*} + + {*T2*}Criar Estruturas{*ETW*}{*B*} + Quando ativada, são geradas Aldeias e Fortalezas no mundo.{*B*}{*B*} + + {*T2*}Mundo Superplano{*ETW*}{*B*} + Quando ativada, é gerado um mundo completamente plano no Mundo Superior e no Submundo.{*B*}{*B*} + + {*T2*}Baú de Bónus{*ETW*}{*B*} + Quando ativada, é criado um baú com objetos úteis junto ao ponto de regeneração do jogador.{*B*}{*B*} + + {*T2*}Repor Submundo{*ETW*}{*B*} + Quando ativada, o Submundo será novamente gerado. É útil no caso de ficheiros mais antigos que ainda não incluíam Fortalezas do Submundo.{*B*}{*B*} + + {*T1*}Opções de Jogo{*ETW*}{*B*} + Durante o jogo, é possível aceder a várias opções pressionando {*BACK_BUTTON*} para abrir o menu de jogo.{*B*}{*B*} + + {*T2*}Opções de Anfitrião{*ETW*}{*B*} + O anfitrião e os jogadores definidos como moderadores podem aceder ao menu "Opções de Anfitrião". Neste menu, podem ativar e desativar a propagação de fogos e as explosões de TNT.{*B*}{*B*} + +{*T1*}Opções de Jogador{*ETW*}{*B*} +Para modificar os privilégios de um jogador, seleciona o nome e prime{*CONTROLLER_VK_A*} para abrir o menu dos privilégios do jogador, onde podes usar as seguintes opções.{*B*}{*B*} + + {*T2*}Pode Construir e Escavar{*ETW*}{*B*} + Esta opção só está disponível quando "Confiar Jogadores" está desativada. Quando esta opção está ativada, o jogador pode interagir normalmente com o mundo. Quando está desativada, o jogador não poderá colocar ou destruir blocos nem interagir com muitos objetos e blocos.{*B*}{*B*} + + {*T2*}Pode Usar Portas e Interruptores{*ETW*}{*B*} + Esta opção só está disponível quando "Confiar Jogadores" está desativada. Quando esta opção está desativada, o jogador não poderá usar portas nem interruptores.{*B*}{*B*} + + {*T2*}Pode Abrir Contentores{*ETW*}{*B*} + Esta opção só está disponível quando "Confiar Jogadores" está desativada. Quando esta opção está desativada, o jogador não poderá abrir contentores nem baús.{*B*}{*B*} + + {*T2*}Pode Atacar Jogadores{*ETW*}{*B*} + Esta opção só está disponível quando "Confiar Jogadores" está desativada. Quando esta opção está desativada, o jogador não pode causar danos aos outros jogadores.{*B*}{*B*} + + {*T2*}Pode Atacar Animais{*ETW*}{*B*} + Esta opção só está disponível quando "Confiar Jogadores" está desativada. Quando esta opção está desativada, o jogador não poderá causar danos a animais.{*B*}{*B*} + + {*T2*}Moderador{*ETW*}{*B*} + Quando esta opção está ativada, o jogador pode alterar os privilégios dos outros jogadores (exceto o anfitrião) se "Confiar Jogadores" estiver desativada, expulsar jogadores e ativar ou desativar a propagação de fogo e as explosões de TNT.{*B*}{*B*} + + {*T2*}Expulsar Jogador{*ETW*}{*B*} + {*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*} + 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 + +Princípios Básicos + +HUD + +Inventário + +Baús + +Criar + +Fornalha + +Distribuidor + +Animais de Quinta + +Animais de Criação + +Poções + +Feitiço + +Portal do Submundo + +Multijogador + +A Partilhar Capturas de Ecrã + +Níveis Excluídos + +Modo Criativo + +Opções de Anfitrião e Jogador + +Trocar + +Bigorna + +O Fim + +{*T3*}INSTRUÇÕES DE JOGO : O FIM{*ETW*}{*B*}{*B*} +O Fim é outra dimensão do jogo, à qual é possível chegar através de um Portal do Fim ativo. O Portal do Fim está numa Fortaleza, que está bem abaixo da terra no Mundo Superior.{*B*} +Para ativar o Portal do Fim, precisas de colocar um Olho de Ender em qualquer Estrutura de Portal do Fim que não o tenha.{*B*} +Assim que o portal estiver ativo, salta para ele e entra em O Fim.{*B*}{*B*} +Em O Fim irás encontrar o Ender Dragon, um feroz e poderoso inimigo, bem como muitos Endermen, pelo que tens de estar bem preparado para combater antes de lá entrares!{*B*}{*B*} +Descobrirás Cristais Ender em cima de oito picos Obsidianos que o Ender Dragon usa para se curar, +por isso, o primeiro passo na batalha é destruir cada um deles.{*B*} +Os primeiros podem ser alcançados com flechas, mas os últimos estão protegidos por uma jaula com Vedação de Ferro, e precisarás de subir para os alcançares.{*B*}{*B*} +Enquanto o fizeres, o Ender Dragon irá atacar-te voando na tua direção e cuspindo bolas de ácido Ender!{*B*} +Se te aproximares do Pódio de Ovos no centro dos picos, o Ender Dragon vai fazer um voo picado e atacar-te, e é nesse momento que o poderás realmente ferir!{*B*} +Evita o bafo ácido e aponta para os olhos do Ender Dragon para obteres os melhores resultados. Se possível, leva alguns amigos contigo para O Fim, para te ajudarem na batalha!{*B*}{*B*} +Assim que estiveres em O Fim, os teus amigos poderão ver nos seus mapas a localização do Portal do Fim na Fortaleza, +pelo que facilmente se juntarão a ti. + + +Sprint + +Novidades + + +{*T3*}Alterações e Adições{*ETW*}{*B*}{*B*} +- Novos objetos 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*} + + +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. + +Utilizado para escavar terra, erva, areia, gravilha e neve mais rápido do que com a mão. Para escavar bolas de neve precisas de pás. + +Necessário para escavar blocos de pedra e minério. + +Utilizado para cortar blocos de madeira mais rápido do que com a mão. + +Utilizado para lavrar blocos de terra e erva para as colheitas. + +As portas de madeira são ativadas através do uso, dando um golpe ou com Redstone. + +As portas de ferro só podem ser abertas através de Redstone, botões ou interruptores. + +NOT USED + +NOT USED + +NOT USED + +NOT USED + +Dá ao utilizador 1 de Armadura quando usado. + +Dá ao utilizador 3 de Armadura quando usado. + +Dá ao utilizador 2 de Armadura quando usado. + +Dá ao utilizador 1 de Armadura quando usado. + +Dá ao utilizador 2 de Armadura quando usado. + +Dá ao utilizador 5 de Armadura quando usado. + +Dá ao utilizador 4 de Armadura quando usado. + +Dá ao utilizador 1 de Armadura quando usado. + +Dá ao utilizador 2 de Armadura quando usado. + +Dá ao utilizador 6 de Armadura quando usado. + +Dá ao utilizador 5 de Armadura quando usado. + +Dá ao utilizador 2 de Armadura quando usado. + +Dá ao utilizador 2 de Armadura quando usado. + +Dá ao utilizador 5 de Armadura quando usado. + +Dá ao utilizador 3 de Armadura quando usado. + +Dá ao utilizador 1 de Armadura quando usado. + +Dá ao utilizador 3 de Armadura quando usado. + +Dá ao utilizador 8 de Armadura quando usado. + +Dá ao utilizador 6 de Armadura quando usado. + +Dá ao utilizador 3 de Armadura quando usado. + +Um lingote brilhante que pode ser usado para criar ferramentas feitas com este material. Criado derretendo minério numa fornalha. + +Permite transformar lingotes, pedras preciosas e tintas em blocos colocáveis. Pode ser usado como bloco de construção caro ou arrumação compacta de minério. + +Utilizada para enviar uma descarga elétrica quando é pisada por um jogador, um animal ou um monstro. As Placas de Pressão de Madeira podem também ser ativadas deixando cair objetos sobre as mesmas. + +Utilizado como escadas compactas. + +Utilizado para criar escadas compridas. Duas placas colocadas uma sobre a outra criam um bloco de placa dupla de tamanho normal. + +Utilizado 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. + +Utilizado como material de construção, pode servir para criar várias coisas. Pode ser criado a partir de qualquer tipo de madeira. + +Utilizada como material de construção. Não é influenciada pela gravidade como a Areia normal. + +Utilizado como material de construção. + +Utilizado para criar tochas, setas, sinais, escadotes e cercas e também como pegas para ferramentas e armas. + +Utilizada para acelerar o tempo de noite até de manhã se todos os jogadores no mundo estiverem na cama, e altera o ponto de regeneração do jogador. +As cores da cama são sempre as mesmas, independentemente das cores da lã usada. + +Permite-te criar uma seleção de objetos mais ampla do que na criação normal. + +Permite-te fundir minério, criar carvão vegetal e vidro e cozinhar peixe e costeletas de porco. + +Armazena blocos e objetos no interior. Coloca dois baús lado a lado para criar um baú maior com o dobro da capacidade. + +Utilizada como barreira que não se pode saltar. Conta como 1,5 blocos de altura para jogadores, animais e monstros, e 1 bloco de altura para outros blocos. + +Utilizado para subir na vertical. + +São ativadas através do uso, dando um golpe ou com Redstone. Funcionam como portas normais, mas são um bloco único e estão no chão, na horizontal. + +Apresenta o texto introduzido por ti ou por outros jogadores. + +Utilizado para criar uma luz mais forte do que as tochas. Derrete a neve e o gelo e pode ser utilizado debaixo de água. + +Utilizado para causar explosões. É ativado depois da colocação com um objeto de Sílex e Aço ou com uma descarga elétrica. + +Utilizada para guardar guisado de cogumelos. Ficas com a tigela depois de comeres o guisado. + +Utilizado para guardar e transportar água, lava e leite. + +Utilizado para guardar e transportar água. + +Utilizado para guardar e transportar lava. + +Utilizado para guardar e transportar leite. + +Utilizada para criar fogo, explodir TNT e abrir um portal depois da sua construção. + +Utilizada para apanhar peixe. + +Mostra as posições do Sol e da Lua. + +Aponta para o ponto inicial. + +Quando seguras no mapa, poderás ver a imagem de uma área explorada. Pode ser utilizado para descobrir caminhos. + +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. + +Restitui 1{*ICON_SHANK_01*}. + +Restitui 1{*ICON_SHANK_01*}. + +Restaura 3{*ICON_SHANK_01*}. + +Restitui 1{*ICON_SHANK_01*} ou pode ser cozinhada numa fornalha. Podes ficar doente se a comeres crua. + +Restitui 3{*ICON_SHANK_01*}. Cria-se cozinhando galinha crua numa fornalha. + +Restitui 1,5{*ICON_SHANK_01*} ou pode ser cozinhado numa fornalha. + +Restitui 4{*ICON_SHANK_01*}. Cria-se cozinhando bife cru numa fornalha. + +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. + +Restitui 1{*ICON_SHANK_01*} ou pode ser cozinhado numa fornalha. Também pode ser dado a um Ocelote como alimento para o domar. + +Restitui 2,5{*ICON_SHANK_01*}. Criado ao cozinhar peixe cru numa fornalha. + +Restitui 2{*ICON_SHANK_01*} e pode criar uma maçã dourada. + +Restitui 2{*ICON_SHANK_01*} e regenera a saúde durante 4 segundos. Fabricada a partir de uma maçã e pepitas de ouro. + +Restitui 2{*ICON_SHANK_01*}. Se comeres isto podes ficar doente. + +Utilizado na receita do bolo e como ingrediente para fazer poções. + +Utilizada para enviar uma descarga elétrica ao ligar e desligar. Fica ligada ou desligada até ser premida novamente. + +Envia constantemente uma descarga elétrica ou pode ser utilizada como 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. + +Utilizado para enviar uma descarga elétrica ao ser pressionado. Permanece ativado durante cerca de um segundo antes de se desligar. + +Utilizado para segurar e disparar objetos em ordem aleatória quando recebe uma descarga de Redstone. + +Reproduz uma nota quando ativado. Toca-lhe para alterar a altura da nota. Se o colocares sobre blocos diferentes, mudará o tipo de instrumento. + +Utilizado para conduzir vagonetas. + +Quando ativado, acelera as vagonetas que lhe passam por cima. Quando não está ativado, as vagonetas param. + +Funciona como uma Placa de Pressão (envia um sinal de Redstone quando ativado), mas só pode ser ativado por uma Vagoneta. + +Utilizada para te transportar a ti, um animal ou um monstro pelos carris. + +Utilizado para transportar bens pelos carris. + +Desloca-se sobre carris e pode rebocar outras vagonetas utilizando carvão. + +Utilizado para viajar pela água mais rapidamente do que a nadar. + +Recolhida a partir de ovelhas, pode ser colorida com tintas. + +Utilizado como material de construção, pode ser colorido com tintas. Esta receita não é recomendada, porque a Lã pode ser obtida facilmente das Ovelhas. + +Utilizada como tinta para criar lã preta. + +Utilizada como tinta para criar lã verde. + +Utilizados como tinta para criar lã castanha, como ingrediente para bolachas ou para cultivar Vagens de Cacau. + +Utilizada como tinta para criar lã prateada. + +Utilizada como tinta para criar lã amarela. + +Utilizada como tinta para criar lã vermelha. + +Utilizado para o crescimento instantâneo de plantações, árvores, ervas altas, cogumelos gigantes e flores e pode ser usado em receitas de tinta. + +Utilizado como tinta para criar lã cor-de-rosa. + +Utilizado como tinta para criar lã cor-de-laranja. + +Utilizado como tinta para criar lã verde-lima. + +Utilizado como tinta para criar lã cinza. + +Tinta para criar lã cinza clara. +A tinta pode também ser feita combinando tinta cinza com farinha de ossos, permitindo criar 4 tintas cinzentas claras a partir de cada saco, em vez de 3. + +Utilizado como tinta para criar lã azul clara. + +Utilizado como tinta para criar lã ciano. + +Utilizado como tinta para criar lã roxa. + +Utilizado como tinta para criar lã magenta. + +Utilizado como tinta para criar lã azul. + +Reproduz Discos de Música. + +Utiliza-os para criar ferramentas muito duras, armas ou armaduras. + +Utilizado para criar uma luz mais forte do que as tochas. Derrete a neve e o gelo e pode ser utilizado debaixo de água. + +Utilizado para criar livros e mapas. + +Pode ser usado para criar uma estante de livros ou enfeitiçado para fazer Livros de Feitiços. + +Permite criar feitiços mais poderosos quando colocada em volta da Mesa de Feitiços. + +Utilizado como decoração. + +Pode ser extraído com uma picareta de ferro ou superior, e depois derretido numa fornalha para criar lingotes de ouro. + +Pode ser extraído com uma picareta de pedra ou superior, e depois derretido numa fornalha para criar lingotes de ferro. + +Pode ser extraído com uma picareta para recolher carvão. + +Pode ser extraído com uma picareta de pedra ou superior para recolher lápis-lazúli. + +Pode ser extraído com uma picareta de ferro ou superior para recolher diamantes. + +Pode ser extraído com uma picareta de ferro ou superior para recolher pó de Redstone. + +Pode ser extraído com uma picareta para recolher pedra arredondada. + +Recolhida com uma pá. Pode ser usada na construção. + +Pode ser plantada e irá transformar-se numa árvore. + +Não pode ser partida. + +Incendeia tudo aquilo em que toca. Pode ser recolhida num balde. + +Recolhida com uma pá. Pode ser derretida para criar vidro utilizando a fornalha. É afetada pela gravidade se não tiver um tijolo por baixo. + +Recolhida com uma pá. Por vezes produz sílex quando é escavada. É afetada pela gravidade se não tiver um tijolo por baixo. + +Cortada com um machado, pode ser usada para criar tábuas ou como combustível. + +Criado numa fornalha derretendo areia. Pode ser usado na construção, mas irá partir se o tentares escavar. + +Retirado da pedra com uma picareta. Pode ser usado para construir uma fornalha ou ferramentas de pedra. + +Cozido a partir de barro numa fornalha. + +Pode ser cozido sob a forma de tijolos numa fornalha. + +Quando partidos, produzem bolas de barro que podem ser cozidas para criar tijolos na fornalha. + +Uma forma compacta de armazenar bolas de neve. + +Pode ser escavada com uma pá para criar bolas de neve. + +Por vezes produz sementes de trigo quando partida. + +Pode ser usada para criar tinta. + +Produz guisado com uma tigela. + +Só pode ser extraída com uma picareta de diamante. É produzida através de uma combinação de água e lava e é utilizada para construir portais. + +Produz grandes quantidades de monstros. + +É colocado no chão para transportar uma descarga elétrica. Quando usado numa poção faz aumentar a duração do efeito. + +Uma vez crescidas, as plantações estão prontas para a recolha do trigo. + +Terreno preparado para semear. + +Pode ser cozinhado na fornalha para criar tinta verde. + +Pode criar açúcar. + +Pode ser usada como capacete ou transformada numa abóbora iluminada em conjunto com uma tocha. É ainda o ingrediente principal da Tarte de Abóbora. + +Queima eternamente se for acesa. + +Abranda o movimento de tudo aquilo que lhe passar por cima. + +Ficar de pé no portal permite-te passar entre o Mundo Superior e o Submundo. + +Utilizado como combustível na fornalha e pode criar tochas. + +Recolhido ao matar uma aranha, pode ser transformado num Arco ou numa Cana de Pesca, ou colocado no chão para criar uma Armadilha. + +Recolhida ao matar uma galinha, pode criar uma seta. + +Recolhida ao matar um Creeper, pode ser transformada em TNT ou usada como ingrediente em poções. + +Podem ser plantadas em terrenos de cultivo para obter colheitas. Certifica-te de que as sementes têm luz suficiente para crescer! + +Recolhido nas plantações, pode ser usado para criar alimentos. + +Recolhida ao escavar gravilha, pode ser usada para criar uma ferramenta de sílex e aço. + +Quando colocada num porco, permite-te montá-lo. O porco pode então ser guiado usando uma Cenoura num Pau. + +Recolhida ao escavar neve, pode ser atirada. + +Recolhido ao matar uma vaca, pode ser transformado numa armadura ou usado para fazer Livros. + +Recolhida ao matar um Slime e usada como ingrediente para poções ou transformada para fazer Pistões Pegajosos. + +Postos de forma aleatória pelas galinhas, podem ser usados para criar alimentos. + +Recolhido ao extrair Glowstone, pode ser usado para criar novos blocos de Glowstone ou fazer parte de uma poção que aumente a potência do efeito. + +Recolhido ao matar um esqueleto. Pode ser usado para criar farinha de ossos e para domesticar lobos. + +Recolhido quando um Esqueleto mata um Creeper. Pode ser reproduzido numa jukebox. + +Extingue incêndios e ajuda as plantações a crescer. Pode ser recolhida num balde. + +Quando partidas, por vezes soltam um rebento que pode ser plantado para que cresça uma árvore. + +Encontrada nas masmorras, pode ser usada para construção e decoração. + +Usadas para obter lã das ovelhas e recolher blocos de folhas. + +Quando é ativado (utilizando um botão, alavanca, placa de pressão, tocha de Redstone ou Redstone com qualquer um destes), o pistão estica e empurra blocos. + +Quando é ativado (utilizando um botão, alavanca, placa de pressão, tocha de Redstone ou Redstone com qualquer um destes), o pistão estica e empurra blocos. Quando recolhe, puxa o bloco que está a tocar na parte esticada. + +É feito de blocos de Pedra e encontra-se habitualmente nas Fortalezas. + +Utilizado como barreira, semelhante às vedações. + +Semelhante a uma porta, mas utilizado principalmente com vedações. + +Pode ser criado a partir de Fatias de Melancia. + +Blocos transparentes que podem ser usados em vez dos Blocos de Vidro. + +Produzem abóboras. + +Produzem melões. + +Largada pelos Enderman quando morrem. Quando atirada, o jogador é teletransportado até ao local onde a Pérola de Ender aterra e perde alguma saúde. + +Um bloco de terra com erva por cima. Pode ser recolhido com uma pá e utilizado para construção. + +Pode ser usada na construção e decoração. + +Torna os movimentos mais lentos quando passas por ela. Pode ser destruída com tesouras para recolheres fio. + +Regenera um Peixe Prateado quando destruído. Também pode regenerar um Peixe Prateado se estiver perto de outro Peixe Prateado quando for atacado. + +Crescem ao longo do tempo depois de plantadas. Podem ser recolhidas com tesouras. Podem ser escaladas como escadas. + +Escorregadio, transforma-se em água se estiver sobre outro bloco quando é destruído. Derrete-se se estiver demasiado perto de uma fonte de luz ou quando colocado no Submundo. + +Pode ser usado como decoração. + +Utilizado na preparação de poções e para localizar Fortalezas. É produzido pelos Blazes, que se encontram normalmente junto ou dentro de Fortalezas Subterrâneas. + +Utilizadas na preparação de poções. Produzidas pelos Ghasts quando morrem. + +Produzidas pelos Pastores Mortos-vivos quando morrem. Os Pastores Mortos-vivos podem ser encontrados no Submundo. Usadas como ingrediente em poções. + +Utilizadas na preparação de poções. Crescem de forma selvagem nas Fortalezas Subterrâneas. Também podem ser plantadas em Areias Movediças. + +Podem ter vários efeitos consoante o uso. + +Pode ser enchida de água e usada como ingrediente inicial no Posto de Poções. + +Um alimento venenoso e ingrediente para poções. É produzido quando uma Aranha ou Aranha das Cavernas é morta por um jogador. + +Utilizado na preparação de poções, principalmente para criar poções com efeito negativo. + +Utilizado na preparação de poções ou criado juntamente com outros objetos para criar Olho de Ender ou Creme de Magma. + +Usado na preparação de poções. + +Utilizado para fazer Poções e Poções Explosivas. + +Enche-se com água por ação da chuva ou utilizando um balde e pode ser usado para encher Garrafas de Vidro com água. + +Quando atirado, mostra a direção do Portal do Fim. Se forem colocados doze destes nas Estruturas de Portal do Fim, o Portal do Fim é ativado. + +Usado na preparação de poções. + +Semelhante aos Blocos de Erva, óptimo para cultivar cogumelos. + +Flutua na água e pode caminhar-se sobre ele. + +Utilizado para construir Fortalezas Subterrâneas. Imune às bolas de fogo de Ghast. + +Utilizado em Fortalezas Subterrâneas. + +Encontra-se nas Fortalezas do Submundo e produz Verrugas do Submundo quando se parte. + +Permite aos jogadores enfeitiçarem Espadas, Picaretas, Machados, Pás, Arcos e Armaduras, utilizando os Pontos de Experiência do jogador. + +Pode ser ativado utilizando doze Olhos de Ender e permite ao jogador viajar até à dimensão do Fim. + +Usadas para formar um Portal do Fim. + +Um tipo de bloco encontrado no Fim. É altamente resistente a explosões, por isso, é útil para construir. + +Este bloco é criado quando é derrotado o Dragão no Fim. + +Quando atirada, produz Orbes de Experiência, que aumentam os teus pontos de experiência se forem recolhidos. + +Útil para incendiar coisas, ou para atear fogos indiscriminadamente quando disparada de um Dispensador. + +São similares a uma vitrina e irão apresentar o objeto ou bloco lá colocado. + +Quando lançadas podem gerar uma criatura do tipo indicado. + +Utilizado para criar escadas compridas. Duas placas colocadas uma sobre a outra criam um bloco de placa dupla de tamanho normal. + +Utilizado para criar escadas compridas. Duas placas colocadas uma sobre a outra criam um bloco de placa dupla de tamanho normal. + +Criado através da fundição de Rocha do Submundo numa fornalha. Pode ser transformado em blocos de Tijolo do Submundo. + +Quando alimentados emitem luz. + +Pode ser colhido para recolher Grãos de Cacau. + +As Cabeças de 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 + +Number Crunching and Statistics + +Bully Coordinator + +Original Design and Code by + +Project Manager/Producer + +Rest of Mojang Office + +Programador-Chefe de Minecraft para PC + +Ninja Coder + +CEO + +White Collar Worker + +Customer Support + +Office DJ + +Designer/Programmer Minecraft - Pocket Edition + +Developer + +Chief Architect + +Art Developer + +Game Crafter + +Director of Fun + +Music and Sounds + +Programming + +Art + +QA + +Executive Producer + +Lead Producer + +Producer + +Test Lead + +Lead Tester + +Design Team + +Development Team + +Release Management + +Director, XBLA Publishing + +Business Development + +Portfolio Director + +Product Manager + +Marketing + + Community Manager + +Europe Localization Team + +Redmond Localization Team + +Asia Localization Team + +User Research Team + +MGS Central Teams + +Milestone Acceptance Tester + +Special Thanks + +Test Manager + +Senior Test Lead + +SDET + +Project STE + +Additional STE + +Test Associates + +Jon Kågström + +Tobias Möllstam + +Risë Lugo + +Espada de Madeira + +Espada de Pedra + +Espada de Ferro + +Espada de Diamante + +Espada de Ouro + +Pá de Madeira + +Pá de Pedra + +Pá de Ferro + +Pá de Diamante + +Pá de Ouro + +Picareta de Madeira + +Picareta de Pedra + +Picareta de Ferro + +Picareta de Diamante + +Picareta de Ouro + +Machado de Madeira + +Machado de Pedra + +Machado de Ferro + +Machado de Diamante + +Machado de Ouro + +Enxada de Madeira + +Enxada de Pedra + +Enxada de Ferro + +Enxada de Diamante + +Enxada de Ouro + +Porta de Madeira + +Porta de Ferro + +Capacete Corrente + +Colete de Corrente + +Calças de Corrente + +Botas de Corrente + +Boné de Cabedal + +Capacete de Ferro + +Capacete de Diamante + +Capacete de Ouro + +Túnica de Cabedal + +Colete de Ferro + +Colete de Diamante + +Colete de Ouro + +Calças de Cabedal + +Leggings de Ferro + +Leggings de Diamante + +Leggings de Ouro + +Botas de Cabedal + +Botas de Ferro + +Botas de Diamante + +Botas de Ouro + +Lingote de Ferro + +Lingote de Ouro + +Balde + +Balde de Água + +Balde de Lava + +Sílex e Aço + +Maçã + +Arco + +Seta + +Carvão + +Carvão Vegetal + +Diamante + +Pau + +Tigela + +Guisado de Cogumelos + +Fio + +Pena + +Pólvora + +Sementes de Trigo + +Trigo + +Pão + +Sílex + +Costeleta de Porco Crua + +Costeleta de Porco Cozinhada + +Pintura + +Maçã de Ouro + +Sinal + +Vagoneta + +Sela + +Redstone + +Bola de Neve + +Barco + +Cabedal + +Balde de Leite + +Tijolo + +Barro + +Canas de Açúcar + +Papel + +Livro + +Slimeball + +Vagoneta com Baú + +Vagoneta com Fornalha + +Ovo + +Bússola + +Cana de Pesca + +Relógio + +Pó de Glowstone + +Peixe Cru + +Peixe Cozinhado + +Pó de Tinta + +Saco de Tinta + +Vermelho Rosa + +Verde Cacto + +Grãos de Cacau + +Lápis-lazúli + +Tinta Roxa + +Tinta Ciano + +Tinta Cinza Clara + +Tinta Cinza + +Tinta Cor-de-rosa + +Tinta Verde-lima + +Dente-de-leão + +Tinta Azul Clara + +Tinta Magenta + +Tinta Laranja + +Farinha de Ossos + +Osso + +Açúcar + +Bolo + +Cama + +Repetidor de Redstone + +Bolacha + +Mapa + +Mapa Vazio + +Disco Música - "13" + +Disco Música - "cat" + +Disco Música - "blocks" + +Disco Música - "chirp" + +Disco Música - "far" + +Disco Música - "mall" + +Disco Música - "mellohi" + +Disco Música - "stal" + +Disco Música - "strad" + +Disco Música - "ward" + +Disco Música - "11" + +Disco Música - "where are we now" + +Tesouras + +Sementes de Abóbora + +Sementes de Melancia + +Galinha Crua + +Galinha Cozinhada + +Bife Cru + +Bife + +Carne Podre + +Ender Pearl + +Fatia de Melancia + +Varinha de Blaze + +Lágrima de Ghast + +Pepita de Ouro + +Verruga do Submundo + +{*splash*}{*prefix*}Poção {*postfix*} + +Garrafa de Vidro + +Garrafa de Água + +Olho de Aranha + +Olho Aranha Ferment. + +Pó de Blaze + +Creme de Magma + +Posto de Poções + +Caldeirão + +Olho de Ender + +Melancia Brilhante + +Garrafa Mágica + +Carga de Fogo + +Carga Fogo (Carv. veg.) + +Carga de Fogo (Carvão) + +Estrutura de Item + +Gerar {*CREATURE*} + +Tijolo de Submundo + +Caveira + +Caveira de Esqueleto + +Caveira de Esqueleto Atrofiado + +Cabeça de Zombie + +Cabeça + +Cabeça de %s + +Cabeça de Creeper + +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 + +Terra + +Pedra Arredondada + +Tábuas Madeira Carvalho + +Tábuas Madeira Abeto + +Tábuas Madeira Bétula + +Tábuas Madeira Selva + +Placas de Madeira (qualquer) + +Rebento + +Carvalho Jovem + +Abeto Jovem + +Bétula Jovem + +Rebentos Árvores Selva + +Rocha + +Água + +Lava + +Areia + +Arenito + +Gravilha + +Minério de Ouro + +Minério de Ferro + +Minério de Carvão + +Madeira + +Madeira de Carvalho + +Madeira de Abeto + +Madeira de Bétula + +Madeira da Selva + +Carvalho + +Abeto + +Bétula + +Folhas + +Folhas de Carvalho + +Folhas de Abeto + +Folhas de Bétula + +Folhas da Selva + +Esponja + +Vidro + + + +Lã Preta + +Lã Vermelha + +Lã Verde + +Lã Castanha + +Lã Azul + +Lã Roxa + +Lã Ciano + +Lã Cinza Clara + +Lã Cinza + +Lã Cor-de-rosa + +Lã Verde-lima + +Lã Amarela + +Lã Azul Clara + +Lã Magenta + +Lã Cor-de-laranja + +Lã Branca + +Flor + +Rosa + +Cogumelo + +Bloco de Ouro + +Uma forma compacta de armazenar Ouro. + +Uma forma compacta de armazenar Ferro. + +Bloco de Ferro + +Placa de Pedra + +Placa de Pedra + +Placa de Arenito + +Placa Madeira Carvalho + +Placa Pedra Arredond. + +Placa de Tijolo + +P. Tijolos Pedra + +Placa Madeira Carvalho + +Placa Madeira Abeto + +Placa Madeira Bétula + +Placa Madeira Selva + +Placa Tijolo Submundo + +Tijolos + +TNT + +Estante de Livros + +Pedra com Musgo + +Obsidiana + +Tocha + +Tocha (Carvão) + +Tocha (Carvão Vegetal) + +Fogo + +Criador de Monstros + +Escadas Madeira Carvalho + +Baú + +Pó de Redstone + +Minério de Diamante + +Bloco de Diamante + +Uma forma compacta de armazenar Diamantes. + +Mesa de Criação + +Plantações + +Terreno de Cultivo + +Fornalha + +Sinal + +Porta de Madeira + +Escadote + +Carril + +Carril Electrificado + +Carril Detector + +Escadas de Pedra + +Alavanca + +Placa de Pressão + +Porta de Ferro + +Minério de Redstone + +Tocha Redstone + +Botão + +Neve + +Gelo + +Cacto + +Barro + +Cana de Açúcar + +Jukebox + +Cerca + +Abóbora + +Abóbora iluminada + +Bloco do Submundo + +Areia Movediça + +Glowstone + +Portal + +Minério de Lápis-lazúli + +Bloco Lápis-lazúli + +Uma forma compacta de armazenar Lápis-lazúli. + +Distribuidor + +Bloco de Notas + +Bolo + +Cama + +Teia + +Erva Alta + +Arbusto Morto + +Díodo + +Baú Fechado + +Alçapão + +Lã (qualquer cor) + +Pistão + +Pistão Pegajoso + +Bloco de Peixe Prateado + +Tijolos de Pedra + +Tijolos de Pedra com Musgo + +Tijolos de Pedra Rachada + +Tijolos de Pedra Burilados + +Cogumelo + +Cogumelo + +Barras de Ferro + +Painel de Vidro + +Melancia + +Caule de Abóbora + +Caule de Melancia + +Videiras + +Portão de Vedação + +Escadas de Tijolo + +Escad. Tijolo Pedra + +P. de Peixe Prateado + +Cobblestone com Peixe Prateado + +Tijolo de Pedra com Peixe Prateado + +Micélio + +Folha de Nenúfar + +Tijolo de Submundo + +Vedação Tijolos Sub. + +Escadas Tijolos Sub. + +Verruga do Submundo + +Mesa de Feitiços + +Posto de Poções + +Caldeirão + +Portal do Fim + +Estrutura de Portal do Fim + +Pedra do Fim + +Ovo de Dragão + +Arbusto + +Samambaia + +Escadas de Grés + +Escadas Madeira Abeto + +Escadas Madeira Bétula + +Escadas Madeira Selva + +Candeeiro de Redstone + +Cacau + +Caveira + +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 + +Mover/Sprint + +Olhar + +Pausar + +Saltar + +Saltar/Voar Para Cima + +Inventário + +Mudar de objeto Seguro + +Ação + +Usar + +Criar + +Largar + +Rastejar + +Agachar/Voar Para Baixo + +Alterar Modo Câmara + +Jogadores/Convidar + +Movimento (Ao Voar) + +Esquema 1 + +Esquema 2 + +Esquema 3 + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +{*B*}Prime{*CONTROLLER_VK_A*} para continuar. + +{*B*}Prime{*CONTROLLER_VK_A*} para iniciar o tutorial.{*B*} + Prime{*CONTROLLER_VK_B*} se achas que estás preparado para jogar sozinho. + +Em Minecraft, podes criar tudo aquilo que quiseres colocando blocos. +À noite, os monstros andam por aí; constrói um abrigo antes que seja tarde. + +Usa{*CONTROLLER_ACTION_LOOK*} para olhares para cima, para baixo e em redor. + +Usa{*CONTROLLER_ACTION_MOVE*} para te deslocares. + +Para fazeres um sprint, prime rapidamente {*CONTROLLER_ACTION_MOVE*} para a frente duas vezes. Mantém {*CONTROLLER_ACTION_MOVE*} premido para a frente para a personagem continuar o sprint até esgotar o tempo ou a comida. + +Prime{*CONTROLLER_ACTION_JUMP*} para saltar. + +Mantém premido{*CONTROLLER_ACTION_ACTION*} para escavar e cortar utilizando as mãos ou os objetos que estiveres a segurar. Podes ter de criar uma ferramenta para colocares alguns blocos... + +Mantém premido{*CONTROLLER_ACTION_ACTION*} para cortares 4 blocos de madeira (troncos de árvore).{*B*}Quando um bloco parte, podes apanhá-lo aproximando-te do objeto flutuante que surge, o que faz com que este apareça no teu inventário. + +Prime{*CONTROLLER_ACTION_CRAFTING*} para abrir a interface de criação. + +À medida que recolhes e crias mais objetos, o teu inventário fica cheio.{*B*} + Prime{*CONTROLLER_ACTION_INVENTORY*} para abrir o inventário. + +À medida que te movimentas, escavas e atacas, vais gastando a barra de comida {*ICON_SHANK_01*}. Se fizeres sprint ou saltos em sprint, gastas muito mais comida do que ao caminhar ou saltar normalmente. + +Se perderes saúde, mas tiveres uma barra de comida com 9 ou mais{*ICON_SHANK_01*}, a tua saúde é restaurada automaticamente. Come para restaurares a barra de comida. + +Com um alimento na mão, prime{*CONTROLLER_ACTION_USE*} para comeres e restaurares a barra de comida. Não podes comer se a barra de comida estiver cheia. + +A tua barra de comida está em baixo e perdeste alguma saúde. Come o bife que se encontra no teu inventário para restaurares a barra de comida e começares a curar-te.{*ICON*}364{*/ICON*} + +A madeira que recolhes pode ser transformada em tábuas. Abre a interface de criação para as criares.{*PlanksIcon*} + +Muitas vezes, o processo de criação envolve vários passos. Agora que já tens algumas tábuas, podes criar mais objetos. Cria uma mesa de criação.{*CraftingTableIcon*} + +Para recolheres blocos mais rapidamente, podes construir ferramentas específicas para essa tarefa. Algumas ferramentas têm uma pega feita de paus. Cria agora alguns paus.{*SticksIcon*} + +Usa{*CONTROLLER_ACTION_LEFT_SCROLL*} e{*CONTROLLER_ACTION_RIGHT_SCROLL*} para alterares o objeto segurado. + +Usa{*CONTROLLER_ACTION_USE*} para utilizar, interagir e colocar alguns objetos. Os objetos colocados podem ser recolhidos novamente escavando-os com a ferramenta certa. + +Com a mesa de criação selecionada, aponta a mira para o local onde a queres colocar e usa{*CONTROLLER_ACTION_USE*} para colocares uma mesa de criação. + +Aponta a mira para a mesa de criação e prime{*CONTROLLER_ACTION_USE*} para a abrires. + +As pás ajudam a escavar mais rapidamente os blocos moles, como terra e neve. À medida que recolhes mais materiais, podes criar ferramentas que trabalham mais rapidamente e durante mais tempo. Cria uma pá de madeira.{*WoodenShovelIcon*} + +Com um machado poderás cortar a madeira e os tijolos de madeira mais rapidamente. À medida que recolhes mais materiais, podes criar ferramentas que trabalham mais rapidamente e durante mais tempo. Cria um machado de madeira.{*WoodenHatchetIcon*} + +A picareta permite-te escavar mais rapidamente blocos mais duros, como pedra e minério. À medida que recolhes mais materiais, podes criar ferramentas que trabalham mais rapidamente, durante mais tempo e que te permitem extrair materiais mais duros. Cria uma picareta de madeira.{*WoodenPickaxeIcon*} + +Abre o contentor + + + A noite pode cair rapidamente e é perigoso estar lá fora sem se estar preparado. Podes criar armaduras e armas, mas é recomendável construíres um abrigo seguro. + + + + Nas redondezas, existe um abrigo de mineiros abandonado que podes completar para garantir a tua segurança durante a noite. + + + + Terás de recolher os recursos necessários para completar o abrigo. Podes construir as paredes e o tecto com qualquer tipo de tijolo, mas também terás de criar uma porta, algumas janelas e iluminação. + + +Utiliza a tua picareta para escavares alguns blocos de pedra. Os blocos de pedra produzem pedras arredondadas quando escavados. Se conseguires recolher 8 blocos de pedra arredondada, poderás construir uma fornalha. Pode ser necessário escavar alguma terra para chegares à pedra, por isso usa a tua pá nesta tarefa.{*StoneIcon*} + +Recolheste pedras arredondadas suficientes para construir uma fornalha. Utiliza a tua mesa de criação para criares uma. + +Usa{*CONTROLLER_ACTION_USE*} para colocares a fornalha no mundo e, em seguida, abre-a. + +Usa a fornalha para criar carvão vegetal. Enquanto esperas que acabe, porque não recolhes mais materiais para acabar o abrigo? + +Usa a fornalha para criar vidro. Enquanto esperas que acabe, porque não recolhes mais materiais para acabar o abrigo? + +Um bom abrigo tem de ter uma porta para que possas entrar e sair facilmente sem teres de escavar e substituir paredes. Cria agora uma porta de madeira.{*WoodenDoorIcon*} + +Usa{*CONTROLLER_ACTION_USE*} para colocar a porta. Podes usar{*CONTROLLER_ACTION_USE*} para abrir e fechar a porta de madeira no mundo. + +À noite pode ficar muito escuro, por isso é melhor teres alguma iluminação dentro do abrigo. Cria uma tocha a partir de paus e carvão vegetal utilizando a interface de criação.{*TorchIcon*} + + + Concluíste a primeira parte do tutorial. + + + + {*B*} + Prime{*CONTROLLER_VK_A*} para continuares o tutorial.{*B*} + Prime{*CONTROLLER_VK_B*} se achas que estás pronto para jogar sozinho. + + + + Este é o teu inventário. Mostra os objetos disponíveis que tens na mão e todos os objetos que estás a transportar. A tua armadura também é mostrada aqui. + +{*B*} + Prime{*CONTROLLER_VK_A*} para continuar.{*B*} + Prime{*CONTROLLER_VK_B*} se já sabes utilizar o inventário. + + + + Usa{*CONTROLLER_MENU_NAVIGATE*} para moveres o ponteiro. Usa{*CONTROLLER_VK_A*} para selecionares um objeto com o ponteiro. + Caso exista mais do que um objeto, irás selecioná-los todos, ou poderás usar{*CONTROLLER_VK_X*} para selecionares apenas metade. + + + + Move o objeto com o ponteiro sobre outro espaço no inventário e coloca-o nesse espaço utilizando{*CONTROLLER_VK_A*}. + Caso tenhas selecionado vários objetos com o ponteiro, usa{*CONTROLLER_VK_A*} para os colocares todos ou{*CONTROLLER_VK_X*} para colocares apenas um. + + + + Se deslocares o ponteiro para fora dos limites da interface com um objeto selecionado, podes largá-lo. + + + + Se quiseres saber mais sobre um determinado objeto, coloca o ponteiro sobre o objeto e prime{*CONTROLLER_ACTION_MENU_PAGEDOWN*}. + + + + Prime{*CONTROLLER_VK_B*} agora para saíres do inventário. + + + + Este é o inventário do modo criativo. Mostra os objetos disponíveis para usares com as mãos e todos os outros objetos que podes escolher. + + +{*B*} + Prime{*CONTROLLER_VK_A*} para continuar.{*B*} + Prime{*CONTROLLER_VK_B*} se já sabes utilizar o inventário do modo criativo. + + + + Usa{*CONTROLLER_MENU_NAVIGATE*} para mover o ponteiro. + Na lista de objetos, usa{*CONTROLLER_VK_A*} para recolheres um objeto sob o ponteiro e usa{*CONTROLLER_VK_Y*} para recolheres todas as unidades desse objeto. + + + + O ponteiro irá mover-se automaticamente sobre um espaço na linha em uso. Podes colocá-lo utilizando{*CONTROLLER_VK_A*}. Depois de colocares o objeto, o ponteiro regressa à lista de objetos, onde podes selecionar outro objeto. + + + + Se deslocares o ponteiro para fora dos limites da interface com um objeto selecionado, podes largá-lo no mundo. Para limpar todos os objetos na barra de seleção rápida, prime{*CONTROLLER_VK_X*}. + + + + Desloca-te nos separadores de Tipo de Grupo acima utilizando{*CONTROLLER_VK_LB*} e{*CONTROLLER_VK_RB*} para selecionar o tipo de grupo do objeto que queres recolher. + + + + Se quiseres saber mais sobre um determinado objeto, coloca o ponteiro sobre o objeto e prime{*CONTROLLER_ACTION_MENU_PAGEDOWN*}. + + + + Prime{*CONTROLLER_VK_B*} agora para saíres do inventário do modo criativo. + + + + Esta é a interface de criação. Permite-te combinar os objetos que recolheste para criares novos objetos. + + +{*B*} + Prime{*CONTROLLER_VK_A*} para continuar.{*B*} + Prime{*CONTROLLER_VK_B*} se já sabes criar. + + +{*B*} + Prime{*CONTROLLER_VK_X*} para apresentar a descrição do objeto. + + +{*B*} + Prime{*CONTROLLER_VK_X*} para apresentar os ingredientes necessários para criar o objeto atual. + + +{*B*} + Prime{*CONTROLLER_VK_X*} para apresentar novamente o inventário. + + + + Desloca-te pelos separadores de Tipo de Grupo no topo utilizando{*CONTROLLER_VK_LB*} e{*CONTROLLER_VK_RB*} para selecionar o tipo de grupo do objeto que pretendes criar e depois usa{*CONTROLLER_MENU_NAVIGATE*} para selecionares o objeto a criar. + + + + A área de criação mostra os objetos de que necessitas para criares o próximo objeto. Prime{*CONTROLLER_VK_A*} para criar o objeto e colocá-lo no teu inventário. + + + + Podes criar uma seleção maior de objetos utilizando uma mesa de criação. A criação na mesa funciona da mesma forma que a criação básica, mas tens à tua disposição uma área maior e mais combinações de ingredientes. + + + + A parte inferior direita da interface de criação mostra o inventário. Esta área também pode mostrar uma descrição do objeto atualmente selecionado e os ingredientes necessários para o criar. + + + + A descrição do objeto atualmente selecionado é agora apresentada. A descrição pode dar-te uma ideia das funções do objeto. + + + + A lista de ingredientes necessários para criar o objeto selecionado é agora apresentada. + + +A madeira que recolheste pode ser usada para criar tábuas. seleciona o ícone das tábuas e prime{*CONTROLLER_VK_A*} para criar.{*PlanksIcon*} + + + Agora que construíste uma mesa de criação, tens de colocá-la no mundo para te permitir criar uma seleção mais ampla de objetos.{*B*} + Prime{*CONTROLLER_VK_B*} agora para saíres da interface de criação. + + + + Prime{*CONTROLLER_VK_LB*} e{*CONTROLLER_VK_RB*} para mudares para o tipo de grupo de artigos que pretendes criar. seleciona o grupo de ferramentas.{*ToolsIcon*} + + + + Prime{*CONTROLLER_VK_LB*} e{*CONTROLLER_VK_RB*} para mudares para o tipo de grupo de artigos que pretendes criar. seleciona o grupo de estruturas.{*StructuresIcon*} + + + + Usa{*CONTROLLER_MENU_NAVIGATE*} para mudares para o objeto que desejas criar. Alguns objetos têm várias versões consoante os materiais utilizados. seleciona a pá de madeira.{*WoodenShovelIcon*} + + + + Muitas vezes, o processo de criação envolve vários passos. Agora que já tens algumas tábuas, podes criar mais objetos. Usa{*CONTROLLER_MENU_NAVIGATE*} para mudares para o objeto que queres criar. seleciona a mesa de criação.{*CraftingTableIcon*} + + + + Com as ferramenta que construíste estás no caminho certo e podes recolher vários materiais diferentes de forma mais eficiente.{*B*} + Prime{*CONTROLLER_VK_B*} agora para saíres da interface de criação. + + + + Alguns objetos não podem ser criados utilizando a mesa de criação, mas sim uma fornalha. Cria agora uma fornalha.{*FurnaceIcon*} + + + + Coloca a fornalha que criaste no mundo. Deves colocá-la dentro do abrigo.{*B*} + Prime{*CONTROLLER_VK_B*} agora para saíres da interface de criação. + + + + Esta é a interface da fornalha. A fornalha permite-te alterar os objetos através do fogo. Por exemplo, podes transformar minério de ferro em lingotes de ferro. + + +{*B*} + Prime{*CONTROLLER_VK_A*} para continuar.{*B*} + Prime{*CONTROLLER_VK_B*} se já sabes utilizar a fornalha. + + + + Tens de colocar o combustível na parte de baixo da fornalha e o objeto que queres alterar por cima. O fogo é ateado e a fornalha acende-se. O resultado sai pela ranhura da direita. + + + + Muitos objetos de madeira podem ser usados como combustíveis, mas nem todos queimam durante o mesmo tempo. Podes também descobrir outros objetos no mundo que podem ser usados como combustível. + + + + Depois de alterados os objetos, podes movê-los da área de saída para o inventário. Experimenta usar ingredientes diferentes para veres o que consegues criar. + + + + Se usares madeira como ingrediente, podes criar carvão vegetal. Coloca algum combustível na fornalha, ocupa o tempo da maneira que quiseres e depois regressa para verificares o progresso. + + + + O Carvão vegetal pode ser usado como combustível ou para criar tochas juntamente com um pau. + + + + Para fazeres vidro, coloca areia na ranhura dos ingredientes. Cria blocos de vidro para usares como janelas no teu abrigo. + + + + Esta é a interface de preparação de poções. Podes utilizá-la para criar poções com diferentes efeitos. + + +{*B*} + Prime{*CONTROLLER_VK_A*} para continuar.{*B*} + Prime{*CONTROLLER_VK_B*} se já sabes como usar o posto de poções. + + + + Podes preparar poções colocando um ingrediente no orifício superior e uma poção ou garrafa de água nos orifícios inferiores (podem ser preparadas até 3 poções ao mesmo tempo). Depois de introduzires uma combinação válida, o processo de preparação inicia e é criada uma poção pouco tempo depois. + + + + Todas as poções começam com uma Garrafa de Água. A maioria das poções são criadas utilizando uma Verruga do Submundo para criar uma Poção Estranha e necessitam de pelo menos mais um ingrediente para criar a poção final. + + + + Depois de criares uma poção, podes modificar os seus efeitos. Se adicionares Pó de Redstone, aumentas a duração do efeito, e se adicionares Pó de Glowstone, o efeito será mais poderoso. + + + + Se adicionares Olho de Aranha Fermentado, crias uma poção com o efeito oposto. Se adicionares Pólvora, transformas a poção numa Poção Explosiva, que pode ser atirada para aplicar os seus efeitos à zona circundante. + + + + Cria uma Poção de Resistência ao Fogo juntando uma Verruga do Submundo a uma Garrafa de Água e adicionando Creme de Magma. + + + + Prime{*CONTROLLER_VK_B*} agora para saíres da interface de preparação de poções. + + + + Nesta área existe um Posto de Poções, um Caldeirão e um baú cheio de ingredientes. + + +{*B*} + Prime{*CONTROLLER_VK_A*} para saberes mais sobre poções e a sua preparação.{*B*} + Prime{*CONTROLLER_VK_B*} se já sabes tudo sobre poções e a sua preparação. + + + + O primeiro passo para preparar uma poção é criar uma Garrafa de Água. Retira uma Garrafa de Vidro do baú. + + + + Podes encher uma garrafa de vidro num Caldeirão com água ou a partir de um bloco de água. Enche a garrafa de vidro apontando para a fonte de água e premindo{*CONTROLLER_ACTION_USE*}. + + + + Se esvaziares o caldeirão, podes voltar a enchê-lo com um Balde de Água. + + + + Utiliza o posto de poções para criar uma Poção de Resistência ao Fogo. Precisas de uma Garrafa de Água, uma Verruga do Submundo e Creme de Magma. + + + + Com uma poção na mão, prime{*CONTROLLER_ACTION_USE*} para a usares. Com uma poção normal, irás bebê-la e aplicar o efeito em ti mesmo; com uma Poção Explosiva, irás atirá-la e aplicar o efeito às criaturas em torno da zona onde aterrar. + Podes criar poções explosivas adicionando pólvora às poções normais. + + + + Utiliza a Poção de Resistência ao Fogo em ti mesmo. + + + + Agora que és resistente ao fogo e à lava, poderás ir a sítios onde nunca foste. + + + + Esta é a interface dos feitiços que podes usar para enfeitiçar armas, armaduras e algumas ferramentas. + + +{*B*} + Prime{*CONTROLLER_VK_A*} para saberes mais sobre a interface de feitiços.{*B*} + Prime{*CONTROLLER_VK_B*} se já souberes tudo sobre a interface de feitiços. + + + + Para enfeitiçares um objeto, em primeiro lugar coloca-o no orifício da mesa de feitiços. Podes enfeitiçar armas, armaduras e algumas ferramentas para adicionar-lhes efeitos especiais, como maior resistência aos danos ou aumentar o número de objetos produzidos ao escavar um bloco. + + + + Quando colocas um objeto no orifício da mesa de feitiços, os botões à direita irão apresentar uma seleção de feitiços aleatórios. + + + + O número no botão representa o custo em pontos de experiência para enfeitiçar o objeto. Se não tiveres um nível de experiência suficientemente alto, o botão será desativado. + + + + seleciona um feitiço e prime{*CONTROLLER_VK_A*} para enfeitiçar o objeto. Isto irá diminuir o teu nível de experiência consoante o custo do feitiço. + + + + Apesar de os feitiços serem aleatórios, alguns dos melhores feitiços só estão disponíveis quando atingires um alto nível de experiência e tiveres várias estantes em redor da Mesa de Feitiços para aumentar o seu poder. + + + + Nesta área existe uma Mesa de Feitiços e outros objetos que te ajudarão a aprender tudo sobre feitiços. + + +{*B*} + Prime{*CONTROLLER_VK_A*} para aprenderes mais sobre feitiços.{*B*} + Prime{*CONTROLLER_VK_B*} se já conheceres os feitiços. + + + + Utilizar uma Mesa de Feitiços permite-te adicionar efeitos especiais tais como aumentar o número de objetos produzidos ao escavar um bloco ou melhorar a resistência a armas, armaduras e algumas ferramentas. + + + + Colocar estantes em redor da Mesa de Feitiços aumenta o seu poder e permite o acesso a feitiços de nível mais alto. + + + + Enfeitiçar objetos tem um custo em Níveis de Exp. que podem ser obtidos recolhendo Orbes de Exp. produzidos quando matas monstros e animais, escavas minério, crias animais, pescas e fundes/cozinhas coisas numa fornalha. + + + + Também podes ganhar níveis de exp. utilizando uma Garrafa Mágica que, quando atirada, cria Orbes de Exp. em torno da zona onde aterra. Estes orbes podem ser recolhidos. + + + + Nos baús nesta área podes encontrar alguns objetos enfeitiçados, Garrafas Mágicas e alguns objetos que ainda não foram enfeitiçados para fazeres experiencias na Mesa de Feitiços. + + + + Estás a conduzir uma vagoneta. Para saíres da vagoneta, coloca o ponteiro sobre a mesma e prime{*CONTROLLER_ACTION_USE*}.{*MinecartIcon*} + + +{*B*} + Prime{*CONTROLLER_VK_A*} para aprenderes mais sobre vagonetas.{*B*} + Prime{*CONTROLLER_VK_B*} se já sabes tudo sobre vagonetas. + + + + As vagonetas andam sobre carris. Podes criar um carril electrificado com a fornalha e uma vagoneta com baú. + {*RailIcon*} + + + + Também podes criar carris electrificados, que recebem energia das tochas de Redstone e dos circuitos para acelerar a vagoneta. Estes são ligados a interruptores, alavancas e placas de pressão para formar sistemas complexos. + {*PoweredRailIcon*} + + + + Estás a conduzir um barco. Para saíres do barco, coloca o ponteiro sobre o mesmo e prime{*CONTROLLER_ACTION_USE*}.{*BoatIcon*} + + + + {*B*} + Prime{*CONTROLLER_VK_A*} para saberes mais sobre barcos.{*B*} + Prime{*CONTROLLER_VK_B*} se já sabes tudo sobre barcos. + + + + O barco permite-te viajar mais rapidamente sobre água. Podes conduzi-lo utilizando{*CONTROLLER_ACTION_MOVE*} e{*CONTROLLER_ACTION_LOOK*}. + {*BoatIcon*} + + + + Estás a usar uma cana de pesca. Prime{*CONTROLLER_ACTION_USE*} para a usares.{*FishingRodIcon*} + + + + {*B*} + Prime{*CONTROLLER_VK_A*} para saberes mais sobre pesca.{*B*} + Prime{*CONTROLLER_VK_B*} se já sabes tudo sobre pesca. + + + + Prime{*CONTROLLER_ACTION_USE*} para lançares a linha e começares a pescar. Prime{*CONTROLLER_ACTION_USE*} novamente para enrolares a linha de pesca. + {*FishingRodIcon*} + + + + Para apanhares peixe, espera até que o flutuador mergulhe na água e depois enrola a linha. O peixe pode ser comido cru ou cozinhado na fornalha, para restituir saúde. + {*FishIcon*} + + + + Tal como acontece com outras ferramentas, a cana de pesca tem um número limitado de utilizações. Mas estas não se limitam à pesca. Faz experiências para veres que outras coisas podes apanhar ou ativar... + {*FishingRodIcon*} + + + + Esta é uma cama. De noite, prime{*CONTROLLER_ACTION_USE*} enquanto apontas para a cama para dormires e acordares de manhã.{*ICON*}355{*/ICON*} + + + + {*B*} + Prime{*CONTROLLER_VK_A*} para saberes mais sobre camas.{*B*} + Prime{*CONTROLLER_VK_B*} se já sabes tudo sobre camas. + + + + A cama deve ser colocada num local seguro e bem iluminado para que os monstros não te acordem a meio da noite. Depois de usares a cama, se morreres serás ressuscitado na cama. + {*ICON*}355{*/ICON*} + + + + Se existirem outros jogadores no teu jogo, todos têm de estar na cama ao mesmo tempo para poderem dormir. + {*ICON*}355{*/ICON*} + + + + Nesta área existem alguns circuitos simples de Redstone e Pistões e um baú com mais objetos para aumentar estes circuitos. + + + + {*B*} + Prime {*CONTROLLER_VK_A*} para saberes mais sobre os circuitos de Redstone e pistões.{*B*} + Prime {*CONTROLLER_VK_B*} se já sabes tudo sobre os circuitos de Redstone e pistões. + + + + As Alavancas, Botões, Placas de Pressão e Tochas de Redstone podem fornecer energia aos circuitos, ligando-os diretamente ao objeto que queres ativar ou com pó de Redstone. + + + + A posição e direção em que colocas uma fonte de energia pode alterar a forma como afeta os blocos circundantes. Por exemplo, uma tocha de Redstone ao lado de um bloco pode ser apagada se o bloco for alimentado por outra fonte. + + + + O pó de Redstone é recolhido através da extração de Redstone com uma picareta em Ferro, Diamante ou Ouro. Podes utilizá-lo para alimentar até 15 blocos e pode subir ou descer um bloco em altura. + {*ICON*}331{*/ICON*} + + + + Os repetidores de Redstone podem ser usados para aumentar o alcance da energia ou colocar um retardador no circuito. + {*ICON*}356{*/ICON*} + + + + Quando é ativado, o Pistão estica e empurra até 12 blocos. Quando recolhem, os Pistões Pegajosos conseguem puxar um bloco de quase todos os tipos. + {*ICON*}33{*/ICON*} + + + + No baú nesta área existem alguns componentes para criar circuitos com pistões. Experimenta usar ou completar os circuitos nesta área ou cria o teu próprio circuito. Há 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 através dos blocos. + + + + Para utilizar um Portal do Submundo, entra no mesmo. O ecrã fica roxo e ouves um som. Alguns segundos depois, serás transportado para outra dimensão. + + + + O Submundo pode ser um local perigoso, cheio de lava, mas também pode ser útil para recolher Blocos do Submundo, que ardem para sempre depois de acesos, e Glowstone, que produz luz. + + + + O Submundo pode ser usado para viajar rapidamente no Mundo Superior - um bloco no Submundo equivale a viajar 3 blocos no Mundo Superior. + + + + Agora estás em Modo Criativo. + + + + {*B*} + Prime{*CONTROLLER_VK_A*} para saberes mais sobre o modo Criativo.{*B*} + Prime{*CONTROLLER_VK_B*} se já sabes tudo sobre o modo Criativo. + + +No modo Criativo, tens um número infinito de objetos e blocos disponíveis, podes destruir blocos com um clique sem serem necessárias ferramentas, és invulnerável e podes voar. + +Prime rapidamente{*CONTROLLER_ACTION_JUMP*} duas vezes para voares. Para parares de voar, repete a ação. Para voares mais rápido, prime{*CONTROLLER_ACTION_MOVE*} para a frente duas vezes em rápida sucessão enquanto voas. +No modo de voo, podes manter premido{*CONTROLLER_ACTION_JUMP*} para subires e{*CONTROLLER_ACTION_SNEAK*} para desceres ou utilizar o botão direcional para subires e desceres, para ires para a esquerda ou para a direita. + +Prime{*CONTROLLER_ACTION_CRAFTING*} para abrir a interface do inventário criativo. + +Atravessa este buraco para continuares. + +Concluíste o tutorial do modo Criativo. + + + Nesta área foi criada uma quinta. As quintas permitem-te criar uma fonte renovável de alimentos e outros objetos. + + + + {*B*} + Prime{*CONTROLLER_VK_A*} para saberes mais sobre quintas.{*B*} + Prime{*CONTROLLER_VK_B*} se já souberes tudo sobre quintas. + + +O Trigo, as Abóboras e as Melancias crescem a partir de sementes. As sementes de Trigo obtêm-se partindo Erva Alta ou colhendo trigo e as sementes de Abóbora e Melancia são criadas a partir de Abóboras e Melancias, respetivamente. + +Antes de plantares sementes, tens de transformar os blocos de terra em Terra Cultivável, utilizando uma Enxada. Uma fonte de água nas proximidades irá manter a Terra Cultivável hidratada e irá fazer com que as sementes cresçam mais depressa, tal como manter a área iluminada. + +O Trigo passa por várias fases de crescimento e está pronto para ser colhido quando fica mais escuro.{*ICON*}59:7{*/ICON*} + +Para que as Abóboras e os Melões cresçam, é necessário colocar um bloco junto ao local onde plantaste a semente, depois de ter crescido o caule. + +A Cana de Açúcar tem de ser plantada em blocos de Erva, Terra ou Areia ao lado de um bloco de água. Cortar um bloco de Cana de Açúcar também fará cair todos os blocos por cima dele.{*ICON*}83{*/ICON*} + +Os Cactos têm de ser plantados em Areia e crescem até três blocos de altura. Tal como a Cana de Açúcar, se destruíres o bloco inferior, poderás recolher também os blocos acima deste.{*ICON*}81{*/ICON*} + +Os Cogumelos têm de ser plantados numa área com pouca luz e irão espalhar-se pelos blocos pouco iluminados em redor.{*ICON*}39{*/ICON*} + +Podes usar Pó de Ossos para fazer crescer as plantações ou transformar Cogumelos em Cogumelos Enormes.{*ICON*}351:15{*/ICON*} + +Concluíste o tutorial sobre quintas. + + + Nesta área, os animais foram colocados dentro de uma cerca. Podes criar animais para produzir crias dos mesmos. + + + + {*B*} + Prime{*CONTROLLER_VK_A*} para aprenderes mais sobre animais e criação.{*B*} + Prime{*CONTROLLER_VK_B*} se já sabes tudo sobre animais e criação. + + +Para que os animais procriem, terás de lhes dar os alimentos certos para que entrem em "Modo Amor". + +Dá Trigo a vacas, vacogumelos ou ovelhas, Cenouras a porcos, Sementes de Trigo ou Verrugas do Submundo a galinhas, ou qualquer tipo de carne a lobos, e estes irão começar a procurar outro animal da sua espécie que também esteja em Modo Amor. + +Quando dois animais da mesma espécie se encontram, e ambos estão em Modo Amor, irão beijar-se durante alguns segundos e surgirá um animal bebé. O animal bebé irá seguir os pais durante algum tempo antes de se transformar num animal adulto. + +Os animais só podem voltar a entrar no Modo Amor ao fim de cerca de cinco minutos. + +Alguns animais irão seguir-te se tiveres o alimento deles na mão. Isto facilita a tarefa de reunir os animais para que procriem.{*ICON*}296{*/ICON*} + + + Os lobos selvagens podem ser domesticados se lhes deres ossos. Quando estiverem domesticados surgem Corações de Amor à volta deles. Os lobos domesticados vão seguir o jogador e defendê-lo se não lhes tiver sido dada uma ordem para se sentarem. + + +Concluíste o tutorial sobre criação e animais. + + + Nesta zona há algumas abóboras e blocos para fazer um Golem de Neve e um Golem de Ferro. + + + + {*B*} + Prime{*CONTROLLER_VK_A*} para saber mais sobre Golems.{*B*} + Prime{*CONTROLLER_VK_B*} se já sabes o que precisas sobre Golems. + + +Os Golems são criados colocando uma abóbora no topo de uma pilha de blocos. + +Os Golems de Neve são criados com dois Blocos de Neve, um por cima do outro, com uma abóbora em cima. Os Golems de Neve atiram bolas de neve aos inimigos. + +Os Golems de Ferro são criados com quatro Blocos de Ferro no padrão apresentado, com uma abóbora no topo do bloco central. Os Golems de Ferro atacam os inimigos. + +Os Golems de Ferro também aparecem naturalmente para proteger as aldeias e, caso ataques quaisquer aldeões, eles atacam-te. + +Não podes sair desta área até teres completado o tutorial. + +Diferentes ferramentas adaptam-se a diferentes materiais. Deves usar uma pá para escavar materiais moles como terra e areia. + +Diferentes ferramentas adaptam-se a diferentes materiais. Deves usar um machado para cortar troncos de árvore. + +Diferentes ferramentas adaptam-se a diferentes materiais. Deves usar uma picareta para extrair pedra e minério. Podes ter de construir uma picareta em materiais melhores para obter recursos de certos blocos. + +Algumas ferramentas são melhores para atacar inimigos. Experimenta usar uma espada para atacares. + +Sugestão: Mantém premido {*CONTROLLER_ACTION_ACTION*}para escavar e cortar com a mão ou com o objeto que estiveres a segurar. Pode ser necessário criar uma ferramenta para escavares alguns blocos... + +A ferramenta que estás a usar ficou danificada. Sempre que isto acontece, a ferramenta acabará por partir. A barra colorida sob o objeto no teu inventário indica o estado atual dos danos. + +Mantém premido{*CONTROLLER_ACTION_JUMP*} para nadares para cima. + +Nesta área, existe uma vagoneta sobre carris. Para entrares na vagoneta, aponta o ponteiro para a mesma e prime{*CONTROLLER_ACTION_USE*}. Usa{*CONTROLLER_ACTION_USE*} no botão para fazeres a vagoneta andar. + +No baú junto ao rio encontra-se um barco. Para usares o barco, aponta o ponteiro para a água e prime{*CONTROLLER_ACTION_USE*}. Usa{*CONTROLLER_ACTION_USE*} enquanto apontas para o barco para entrares. + +No baú junto ao lago encontra-se uma cana de pesca. Retira-a do baú e seleciona-a como objeto atual na tua mão para a usares. + +Este mecanismo de pistão mais avançado cria uma ponte que se repara automaticamente! Prime o botão para ativar e descobre como interagem os componentes. + +Se deslocares o ponteiro para fora dos limites da interface quando estiveres a transportar um objeto, poderás largá-lo. + +Não tens todos os ingredientes necessários para criar este objeto. A caixa em baixo à esquerda mostra os ingredientes de que precisas. + + + Parabéns, concluíste o tutorial. Agora, o tempo de jogo passa normalmente e não tens muito tempo até que anoiteça e os monstros saiam para a rua! Acaba o teu abrigo! + + +{*EXIT_PICTURE*} Quando estiveres preparado para explorar mais, existe uma escadaria nesta área junto ao abrigo dos mineiros que conduz a um pequeno castelo. + +Lembrete: + +]]> + +Foram adicionadas novas funcionalidades na última versão do jogo, incluindo novas áreas no mundo do tutorial. + +{*B*}Prime {*CONTROLLER_VK_A*} para jogares o tutorial normalmente.{*B*} + Prime {*CONTROLLER_VK_B*} para ignorar o tutorial principal. + +Nesta área, poderás saber mais sobre pesca, barcos, pistões e Redstone. + +Fora desta área irás encontrar exemplos de edifícios, quintas, vagonetas e carris, feitiços, poções, trocas, forjas e muito mais! + + + O nível da tua barra de comida está demasiado baixo para restaurar a tua saúde. + + + + {*B*} + Prime{*CONTROLLER_VK_A*} para saberes mais sobre a barra de comida e a alimentação.{*B*} + Prime{*CONTROLLER_VK_B*} se já souberes tudo sobre a barra de comida e a alimentação. + + + + 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 + +Anterior + +Sair + +Cancelar + +Cancelar Participação + +Selec. Disp. Armaz. + +Mudar Disp. Armaz. + +Lista Jogos Online + +Jogos Party + +Todos os Jogos + +Alterar Grupo + +Mostrar Inventário + +Mostrar Descrição + +Mostrar Ingredientes + +Criar + +Criar + +Retirar/Colocar + +Retirar + +Retirar Tudo + +Retirar Metade + +Colocar + +Colocar Tudo + +Colocar Um + +Largar + +Largar Tudo + +Largar Um + +Trocar + +Mover Rápido + +Limpar Seleção Rápida + +Que é isto? + +Partilhar no Facebook + +Alterar Filtro + +Ver Gamercard + +Ver Perfil de Jogador + +Enviar Pedido de Amizade + +Página Abaixo + +Página Acima + +Seguinte + +Anterior + +Expulsar Jogador + +Tingir + +Escavar + +Alimentar + +Domar + +Curar + +Senta + +Segue-me + +Ejectar + +Esvaziar + +Sela + +Colocar + +Atingir + +Leite + +Recolher + +Comer + +Dormir + +Acorda + +Jogar + +Montar + +Velejar + +Crescer + +Nadar + +Abrir + +Alterar Tom + +Detonar + +Ler + +Pendurar + +Atirar + +Plantar + +Lavrar + +Colher + +Continuar + +Desbloquear Jogo Completo + +Eliminar Jogo Guardado + +Eliminar + +Opções + +Convidar Xbox Live Party + +Convidar Amigos + +Aceitar + +Tosquia + +Excluir Nível + +selecionar Skin + +Acender + +Navegar + +Instalar Versão Completa + +Instalar Versão de Avaliação + +Instalar + +Reinstalar + +Op. Jogo Guardado + +Executar Comando + +Criativo + +Mover Ingrediente + +Mover Combustível + +Mover Ferramenta + +Mover Armadura + +Mover Arma + +Equipar + +Puxar + +Soltar + +Privilégios + +Bloco + +Página Acima + +Página Abaixo + +Modo Amor + +Beber + +Rodar + +Ocultar + +Carregar Grav. Xbox One + +Limpar Todas as Ranhuras + +Carregar Gravação para Xbox One + +Montar + +Desmontar + +Prender Baú + +Lançar + +Atrelar + +Soltar + +Prender + +Nomear + +OK + +Cancelar + +Loja Minecraft + +Tens a certeza de que queres sair do jogo atual e entrar num novo jogo? O progresso não guardado será perdido. + +Sair do Jogo + +Guardar Jogo + +Sair Sem Guardar + +Tens a certeza de que queres substituir os jogos guardados anteriormente pela versão atual deste mundo? + +Tens a certeza de que queres sair sem guardar? Irás perder todo o progresso neste mundo! + +Iniciar Jogo + +Se criares, carregares ou guardares um mundo no Modo Criativo, as atualizações de feitos e classificações serão desativadas nesse mundo, mesmo que seja carregado depois no Modo Sobrevivência. Tens a certeza de que queres continuar? + +Este mundo foi guardado anteriormente no Modo Criativo e as atualizações de feitos e classificações serão desativadas. Tens a certeza de que queres continuar? + +Este mundo já foi guardado no Modo Criativo, pelo que as atualizações de feitos e classificações estão desativadas. + +Se criares, carregares ou guardares um mundo com os Privilégios de Anfitrião ativados, as atualizações de feitos e classificações serão desativadas, mesmo que depois seja carregado com estas opções desligadas. Tens a certeza de que queres continuar? + +Jogo Danificado + +O jogo guardado está corrompido ou danificado. Queres apagá-lo? + +Tens a certeza de que queres sair para o menu principal e desligar todos os jogadores do jogo? O progresso não guardado será perdido. + +Sair e guardar + +Sair sem guardar + +Tens a certeza de que queres sair para o menu principal? O progresso não guardado será perdido. + +Tens a certeza de que queres sair para o menu principal? Perderás o teu progresso! + +Criar Mundo Novo + +Jogar Tutorial + +Tutorial + +Nomeia o Teu Mundo + +Introduz um nome para o teu mundo + +Deposita a semente para a criação do teu mundo + +Carregar Mundo Guardado + +Prime START para te juntares ao jogo + +A sair do jogo + +Ocorreu um erro. A sair para o menu principal. + +Falha na ligação + +Ligação perdida + +Perdeste a ligação ao servidor. A sair para o menu principal. + +Perdeste a ligação ao Xbox Live. A sair para o menu principal. + +Perdeste a ligação ao Xbox Live. + +Desligado pelo servidor + +Foste expulso do jogo + +Foste expulso do jogo por voares + +A tentativa de ligação excedeu o tempo + +O servidor está cheio + +O anfitrião saiu do jogo. + +Não podes participar neste jogo porque não és amigo de nenhum dos participantes. + +Não podes participar neste jogo porque foste expulso pelo anfitrião anteriormente. + +Não podes juntar-te a este jogo, pois o jogador a que te estás a tentar juntar possui uma versão mais antiga do jogo. + +Não podes juntar-te a este jogo, pois o jogador a que te estás a tentar juntar possui uma versão mais recente do jogo. + +Novo Mundo + +Prémio Desbloqueado! + +Parabéns - recebeste uma imagem de jogador com o Steve do Minecraft! + +Parabéns - recebeste uma imagem de jogador com um Creeper! + +Parabéns - recebeste um item de avatar - uma t-shirt Minecraft: Edição Xbox 360! +Acede à interface para vestires a t-shirt ao teu avatar. + +Parabéns - recebeste um item de avatar - um relógio Minecraft: Edição Xbox 360! +Acede à interface para colocares o relógio no teu avatar. + +Parabéns - recebeste um item de avatar - um boné de Creeper! +Acede à interface para colocares o boné no teu avatar. + +Parabéns - recebeste o tema do Minecraft: Edição Xbox 360! +Acede à interface para selecionares este tema. + +Desbloquear Jogo Completo + +Estás a jogar a versão de avaliação, mas precisas do jogo completo para poderes guardar o jogo. +Queres desbloquear o jogo completo agora? + +Esta é a versão de avaliação do Minecraft: Edição Xbox 360. Se tivesses o jogo completo, terias acabado de ganhar um feito! +Queres desbloquear o jogo completo? + +Esta é a versão de avaliação do Minecraft: Edição Xbox 360. Se tivesses o jogo completo, terias acabado de ganhar um prémio avatar! +Queres desbloquear o jogo completo? + +Esta é a versão de avaliação do Minecraft: Edição Xbox 360. Se tivesses o jogo completo, terias acabado de ganhar uma imagem de jogador! +Queres desbloquear o jogo completo? + +Esta é a versão de avaliação do Minecraft: Edição Xbox 360. Se tivesses o jogo completo, terias acabado de ganhar um tema! +Queres desbloquear o jogo completo? + +Esta é a versão de avaliação do Minecraft: Edição Xbox 360. Precisas do jogo completo para poderes aceitar este convite. +Queres desbloquear o jogo completo? + +Os jogadores convidados não podem desbloquear o jogo completo. Inicia sessão com um ID de utilizador Xbox Live. + +Por favor aguarda + +Sem resultados + +Filtro: + +Amigos + +A Minha Pontuação + +Geral + +Entradas: + +Lugar + +Gamertag + +A Preparar para Guardar Nível + +A Preparar Blocos... + +A Finalizar... + +A Construir Terreno + +A simular o mundo + +A iniciar o servidor + +A gerar área de criação + +A carregar área de criação + +A entrar no Submundo + +A Sair do Submundo + +A criar novamente + +A gerar nível + +A carregar nível + +A guardar jogadores + +A ligar ao anfitrião + +A transferir terreno + +A mudar para jogo offline + +Aguarda enquanto o anfitrião guarda o jogo + +Entrar no FIM + +Sair do FIM + +Encontrar Sementes para o Gerador de Mundos + +Esta cama está ocupada + +Só podes dormir à noite + +%s está a dormir numa cama. Para acelerares até de manhã, todos os jogadores têm de estar a dormir em camas ao mesmo tempo. + +A tua cama desapareceu ou está bloqueada + +Não podes descansar agora, existem monstros nas redondezas + +Estás a dormir numa cama. Para acelerares até de manhã, todos os jogadores têm de estar a dormir em camas ao mesmo tempo. + +Ferramentas e Armas + +Armas + +Alimentos + +Estruturas + +Armadura + +Mecanismos + +Transporte + +Decorações + +Blocos de Construção + +Redstone e Transporte + +Vários + +Poções + +Poções + +Ferramentas, Armas e Armadura + +Materiais + +Sessão terminada + +Foste reencaminhado para o ecrã principal porque o teu perfil de jogador terminou sessão + +Dificuldade + +Música + +Som + +Gama + +Sensibilidade do Jogo + +Sensibilidade da Interface + +Calmo + +Fácil + +Normal + +Difícil + +Neste modo, o jogador recupera a saúde com o passar do tempo e não há inimigos no horizonte. + +Neste modo, existem inimigos nas redondezas, mas irão provocar menos danos ao jogador do que no modo Normal. + +Neste modo, existem inimigos nas redondezas e podem provocar uma quantidade de danos normal ao jogador. + +Neste modo, existem inimigos nas redondezas e irão provocar graves danos ao jogador. Presta atenção aos Creepers também, uma vez que é pouco provável que cancelem o seu ataque explosivo quando te afastas! + +Tempo Limite da Avaliação Excedido + +Jogaste a versão de avaliação do Minecraft: Xbox 360 Edition durante o tempo máximo permitido! Para continuares a divertir-te, queres desbloquear o jogo completo? + +Jogo cheio + +Falha ao entrar no jogo, não existem espaços livres + +Introduzir Texto de Sinal + +Introduz uma linha de texto para o teu sinal + +Introduzir Título + +Introduz um título para a tua publicação + +Introduzir Legenda + +Introduz uma legenda para a tua publicação + +Introduzir Descrição + +Introduz uma descrição da tua publicação + +Inventário + +Ingredientes + +Posto de Poções + +Baú + +Encantar + +Fornalha + +Ingrediente + +Combustível + +Distribuidor + +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. + +%s saiu do jogo. + +%s foi expulso do jogo. + +Tens a certeza de que queres eliminar os dados de jogo gravados? + +A confirmar + +Censurado + +A jogar: + +Repor Definições + +Tens a certeza de que queres repor as definições para os valores predefinidos? + +Erro de Carregamento + +Não foi possível carregar "Minecraft: Edição Xbox 360" e não é possível continuar. + +Jogo de %s + +Anfitrião de jogo desconhecido + +Um convidado terminou sessão + +Um jogador convidado terminou sessão e todos os jogadores convidados foram removidos do jogo. + +Iniciar Sessão + +Não tens sessão iniciada. Para jogares este jogo, tens de iniciar sessão. Queres iniciar sessão agora? + +Multijogador não permitido + +Falha ao participar no jogo. Um ou mais jogadores não têm permissão para jogar no modo multijogador no Xbox Live. + +Falha ao criar um jogo online. Um ou mais jogadores não têm permissão para jogar no modo multijogador no Xbox Live. Desmarca a caixa "Jogo Online" para iniciares um jogo offline. + +Não tens autorização para participar nesta sessão de jogo porque os teus privilégios de Conteúdo de Assinante são demasiado limitados. Altera esta definição em Configurações Privacidade e Online na interface Xbox se quiseres participar nesta sessão. + +Não tens autorização para participar nesta sessão de jogo porque um dos jogadores locais tem privilégios de Conteúdo de Assinante demasiado limitados. + +Não tens autorização para participar nesta sessão de jogo porque um dos jogadores da sessão tem privilégios de Conteúdo de Assinante para Somente Amigos e tu não estás na Lista de Amigos deles. + +Falha ao criar jogo + +Não tens autorização para criar esta sessão de jogo porque um dos jogadores locais tem privilégios de Conteúdo de Assinante demasiado limitados. Desmarca a caixa "Jogo Online" para iniciar um jogo offline ou altera esta definição em Configurações Privacidade e Online na interface Xbox. + +Auto Selecionado + +Sem Pacote: Skins Pred. + +Skins Favoritas + +Nível Excluído + +O jogo no qual pretendes participar encontra-se na tua lista de níveis excluídos. +Se quiseres participar neste jogo, o nível será removido da lista de níveis excluídos. + +Excluir Este Nível? + +Tens a certeza de que queres adicionar este nível à lista de níveis excluídos? +Se selecionares OK, irás sair do jogo. + +Removido da Lista de Excluídos + +Intervalo de Gravação Automática + +Intervalo de Gravação Automática: Desl. + +Minutos + +Não é possível colocar aqui! + +Não é possível colocar lava junto a um ponto de regeneração devido à possibilidade de morte instantânea dos jogadores regenerados. + +Este jogo tem uma funcionalidade de gravação automática. Quando vires o ícone acima, o jogo está a guardar os dados. +Não desligues a consola Xbox 360 enquanto este ícone estiver visível. + +Opacidade da Interface + +A Preparar Gravação Automática do Nível + +Tamanho HUD + +Tamanho HUD (Ecrã dividido) + +Semear + +Desbloquear Pacote de Skins + +Para utilizares a skin selecionada, tens de desbloquear este pacote de skins. +Queres desbloquear agora este pacote de skins? + +Desbloquear Pacote de Texturas + +Para usar este pacote de texturas no teu mundo, precisas de o desbloquear. +Queres desbloqueá-lo agora? + +Pacote de Texturas de Avaliação + +Estás a usar uma versão de avaliação do pacote de texturas. Não poderás guardar este mundo sem desbloqueares a versão completa. +Gostarias de desbloquear a versão completa deste pacote de texturas? + +Pacote de Texturas Não Disponível + +Desbloquear Versão Completa + +Transferir Versão de Avaliação + +Transferir Versão Completa + +Este mundo usa um pacote de mistura ou pacote de texturas que não tens! +Queres instalar o pacote de mistura ou pacote de texturas agora? + +Obtém a Versão de Avaliação + +Obtém a Versão Completa + +Expulsar Jogador + +Tens a certeza de que queres expulsar este jogador do jogo? Ele não poderá voltar a participar até reiniciares o mundo. + +Pacotes de Imagens de Jogador + +Temas + +Pacotes de Skins + +Permitir amigos de amigos + +Não podes participar neste jogo porque está limitado a amigos do anfitrião. + +Impossível Participar no Jogo + +Selecionado + +Skin selecionada: + +Conteúdo Transferível Corrupto + +Este conteúdo transferível está danificado e não pode ser usado. Tens de eliminá-lo e reinstalá-lo a partir do menu Loja Minecraft. + +Algum conteúdo transferível está danificado e não pode ser usado. Tens de eliminá-lo e reinstalá-lo a partir do menu Loja Minecraft. + +O teu modo de jogo foi alterado + +Muda o Nome do Teu Mundo + +Introduz o novo nome para o teu mundo + +Modo Sobrevivência + +Modo Criativo + +Modo de Jogo: Aventura + +Sobrevivência + +Criativo + +Aventura + +Criado em Sobrevivência + +Criado em Criativo + +Compor Nuvens + +O que queres fazer com o jogo guardado? + +Mudar o Nome + +Guardar automaticamente dentro de %d... + +Ligado + +Desligado + +Normal + +Superplano + +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. + +Quando ativado, amigos de pessoas na tua Lista de Amigos podem aderir. + +Quando ativada, os jogadores podem infligir danos aos outros jogadores. Afeta apenas o modo Sobrevivência. + +Quando desativada, os jogadores que participam no jogo não podem construir ou escavar até receberem autorização. + +Quando ativada, o fogo pode propagar-se aos blocos inflamáveis mais próximos. + +Quando ativada, o TNT explode ao ser acionado. + +Quando ativada, o anfitrião pode voar, desativar a exaustão e tornar-se invisível no menu do jogo. Desativa as atualizações dos feitos e das classificações. + +Quando ativado, o Submundo será regenerado. É útil se tiveres um ficheiro mais antigo em que não existissem Fortalezas do Submundo. + +Quando ativada, são geradas Aldeias e Fortalezas no mundo. + +Quando ativada, é gerado um mundo completamente plano no Mundo Superior e no Submundo. + +Quanto ativada, é criado um baú com objetos úteis junto ao ponto de regeneração do jogador. + +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 + +Imagens de Jogador + +Itens de Avatar + +Pacotes de Textura + +Pacotes de Mistura + +{*PLAYER*} foi consumido pelas chamas + +{*PLAYER*} morreu carbonizado + +{*PLAYER*} tentou nadar na lava + +{*PLAYER*} sufocou numa parede + +{*PLAYER*} afogou-se + +{*PLAYER*} morreu à fome + +{*PLAYER*} foi picado até à morte + +{*PLAYER*} embateu no chão com muita força + +{*PLAYER*} caiu do mundo + +{*PLAYER*} morreu + +{*PLAYER*} explodiu + +{*PLAYER*} foi morto por magia + +{*PLAYER*} foi morto pela respiração do Ender Dragon + +{*PLAYER*} foi assassinado por {*SOURCE*} + +{*PLAYER*} foi assassinado por {*SOURCE*} + +{*PLAYER*} foi atingido por {*SOURCE*} + +{*PLAYER*} foi atingido por uma bola de fogo de {*SOURCE*} + +{*PLAYER*} foi agredido por {*SOURCE*} + +{*PLAYER*} foi morto por {*SOURCE*} 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 + +Mostrar HUD + +Mostrar Mão + +Gamertags Ecrã Dividido + +Mensagens de Morte + +Personagem Animada + +Animação de Skin Personalizada + +Já não podes escavar ou usar objetos + +Já podes escavar e usar objetos + +Já não podes colocar blocos + +Já podes colocar blocos + +Agora podes usar portas e interruptores + +Já não podes usar portas e interruptores + +Agora podes usar contentores (tais como baús) + +Já não podes usar contentores (tais como baús) + +Já não podes atacar criaturas + +Já podes atacar criaturas + +Já não podes atacar jogadores + +Já podes atacar jogadores + +Já não podes atacar animais + +Já podes atacar animais + +Já és um moderador + +Já não és um moderador + +Já podes voar + +Já não podes voar + +Já não podes ficar cansado + +Já podes ficar cansado + +Já estás invisível + +Já não estás invisível + +Já és invulnerável + +Já não és invulnerável + +%d MSP + +Ender Dragon + +%s entrou em O Fim + +%s abandonou O Fim + + +{*C3*}Sei a que jogador te referes.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}?{*EF*}{*B*}{*B*} +{*C3*}Sim. Toma cuidado. Alcançou um nível mais elevado agora. Consegue ler os nossos pensamentos.{*EF*}{*B*}{*B*} +{*C2*}Isso não interessa. Pensa que fazemos parte do jogo.{*EF*}{*B*}{*B*} +{*C3*}Gosto deste jogador. Jogou bem. Não desistiu.{*EF*}{*B*}{*B*} +{*C2*}Lê os nossos pensamentos como se fossem palavras num ecrã.{*EF*}{*B*}{*B*} +{*C3*}É assim que escolhe imaginar muitas coisas, quando está imerso no sonho de um jogo.{*EF*}{*B*}{*B*} +{*C2*}As palavras são uma excelente interface. Muito flexível. E menos aterrorizadoras do que olhar para a realidade atrás do ecrã.{*EF*}{*B*}{*B*} +{*C3*}Eles costumavam ouvir vozes. Antes de os jogadores saberem ler. No tempo em que aqueles que não jogavam chamavam bruxas e feiticeiros aos jogadores. E os jogadores sonhavam que voavam pelo ar, em vassouras movidas por demónios.{*EF*}{*B*}{*B*} +{*C2*}O que sonhou este jogador?{*EF*}{*B*}{*B*} +{*C3*}Este jogador sonhou com a luz do sol e árvores. Fogo e água. Sonhou que criava. E sonhou que destruía. Sonhou que caçava e era caçado. Sonhou com abrigos.{*EF*}{*B*}{*B*} +{*C2*}Ah, a interface original. Com um milhão de anos e ainda funciona. Mas que estrutura verdadeira criou este jogador, na realidade por detrás do ecrã?{*EF*}{*B*}{*B*} +{*C3*}Trabalhou, com um milhão de outros, na criação de um mundo verdadeiro numa dobra de {*EF*}{*NOISE*}{*C3*}, e criou um {*EF*}{*NOISE*}{*C3*} para {*EF*}{*NOISE*}{*C3*}, em {*EF*}{*NOISE*}{*C3*}.{*EF*}{*B*}{*B*} +{*C2*}Não consegue ler esse pensamento.{*EF*}{*B*}{*B*} +{*C3*}Não. Ainda não alcançou o nível mais elevado. Esse, terá de o alcançar no sonho longo da vida, não no sonho curto de um jogo.{*EF*}{*B*}{*B*} +{*C2*}Sabe que o amamos? Que o universo é bondoso?{*EF*}{*B*}{*B*} +{*C3*}Às vezes, através do ruído dos seus pensamentos, sim, ouve o universo.{*EF*}{*B*}{*B*} +{*C2*}Mas por vezes está triste, no sonho longo. Cria mundos que não têm verão, e treme sob um sol negro, confundindo a sua triste criação com a realidade.{*EF*}{*B*}{*B*} +{*C3*}Curá-lo da tristeza destruí-lo-ia. A tristeza é parte da sua missão privada. Não podemos interferir.{*EF*}{*B*}{*B*} +{*C2*}Por vezes, quando estão imersos em sonhos, quero dizer-lhes que estão a construir mundos verdadeiros na realidade. Por vezes, quero falar-lhes da sua importância para o universo. Por vezes, quando passou algum tempo e ainda não estabeleceram uma ligação verdadeira, quero ajudá-los a proferir a palavra que temem.{*EF*}{*B*}{*B*} +{*C3*}Lê os nossos pensamentos.{*EF*}{*B*}{*B*} +{*C2*}Por vezes, não me importo. Por vezes, desejo dizer-lhes que este mundo que tomam por verdade não passa de {*EF*}{*NOISE*}{*C2*} e {*EF*}{*NOISE*}{*C2*}, quero dizer-lhes que são {*EF*}{*NOISE*}{*C2*} no {*EF*}{*NOISE*}{*C2*}. Observam tão pouco da realidade, no seu sonho longo.{*EF*}{*B*}{*B*} +{*C3*}E, contudo, jogam o jogo.{*EF*}{*B*}{*B*} +{*C2*}Mas seria tão fácil dizer-lhes...{*EF*}{*B*}{*B*} +{*C3*}É demais para este sonho. Dizer-lhes como viver é impedi-los de viver.{*EF*}{*B*}{*B*} +{*C2*}Não direi ao jogador como viver.{*EF*}{*B*}{*B*} +{*C3*}O jogador está a ficar impaciente.{*EF*}{*B*}{*B*} +{*C2*}Vou contar-lhe uma história.{*EF*}{*B*}{*B*} +{*C3*}Mas não a verdade.{*EF*}{*B*}{*B*} +{*C2*}Não. Uma história que contenha seguramente a verdade, numa jaula de palavras. Não a verdade nua, capaz de queimar a qualquer distância.{*EF*}{*B*}{*B*} +{*C3*}Dá-lhe corpo, mais uma vez.{*EF*}{*B*}{*B*} +{*C2*}Sim. Jogador...{*EF*}{*B*}{*B*} +{*C3*}Usa o nome.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}. Jogador de jogos.{*EF*}{*B*}{*B*} +{*C3*}Boa.{*EF*}{*B*}{*B*} + + + +{*C2*}Agora, inspira. Mais uma vez. Sente o ar nos teus pulmões. Deixa os teus membros regressarem. Sim, mexe os dedos. Tens corpo novamente, sob a gravidade, no ar. Rematerializa-te no sonho longo. Aí estás. O teu corpo a tocar novamente no universo em todos os pontos, como se fossem coisas distintas. Como se fôssemos coisas distintas.{*EF*}{*B*}{*B*} +{*C3*}Como estamos? Em tempos chamavam-nos espírito da montanha. Pai sol, mãe lua. Espíritos ancestrais, espíritos animais. Génios. Fantasmas. Duendes. Depois deuses, demónios. Anjos. Poltergeists. Alienígenas, extra-terrestres. Leptões, quarks. As palavras mudam. Nós não mudamos.{*EF*}{*B*}{*B*} +{*C2*}Somos o universo. Somos tudo o que pensas que não és. Olhas para nós agora, através da tua pele e dos teus olhos. E porque é que o universo toca a tua pele e emite luz sobre ti? Para te ver, jogador. para te conhecer. E ser conhecido. Vou contar-te uma história.{*EF*}{*B*}{*B*} +{*C2*}Era uma vez um jogador.{*EF*}{*B*}{*B*} +{*C3*}O jogador eras tu, {*PLAYER*}.{*EF*}{*B*}{*B*} +{*C2*}Por vezes, considerava-se humano, na fina crosta de um globo de rocha fundida em rotação. A bola de rocha fundida girava em torno de uma bola de gás abrasador trezentas e trinta mil vezes maior do que ela. Estavam tão afastadas que a luz levava oito minutos a percorrer a distância. A luz era informação de uma estrela, e era capaz de queimar a tua pele a cento e cinquenta milhões de quilómetros de distância.{*EF*}{*B*}{*B*} +{*C2*}Por vezes, o jogador sonhava que era mineiro, na superfície de um mundo que era plano e infinito. O sol era um quadrado branco. Os dias eram curtos; havia muito que fazer; e a morte era um inconveniente temporário.{*EF*}{*B*}{*B*} +{*C3*}Por vezes, o jogador sonhava que estava perdido numa história.{*EF*}{*B*}{*B*} +{*C2*}Por vezes, o jogador sonhava que era outras coisas, noutros lugares. Às vezes, esses sonhos eram perturbadores. Outras eram mesmo muito bonitos. Por vezes, o jogador acordava de um sonho e partia para outro, e depois acordava desse e ia para um terceiro.{*EF*}{*B*}{*B*} +{*C3*}Por vezes, o jogador sonhava que via palavras num ecrã.{*EF*}{*B*}{*B*} +{*C2*}Vamos voltar atrás.{*EF*}{*B*}{*B*} +{*C2*}Os átomos do jogador estavam dispersos na relva, nos rios, no ar, no solo. Uma mulher juntou os átomos; bebeu-os, comeu-os e inalou-os; e a mulher montou o jogador, no seu corpo.{*EF*}{*B*}{*B*} +{*C2*}E o jogador acordou, do mundo escuro e quente do corpo da sua mãe, para o sonho longo.{*EF*}{*B*}{*B*} +{*C2*}E o jogador era uma nova história, nunca antes contada, escrita em letras de ADN. E o jogador era um novo programa, nunca antes executado, gerado por um código-fonte com mil milhões de anos. E o jogador era um novo humano, nunca antes vivo, feito apenas de leite e amor.{*EF*}{*B*}{*B*} +{*C3*}Tu és o jogador. A história. O programa. O humano. Feito apenas de leite e amor.{*EF*}{*B*}{*B*} +{*C2*}Vamos recuar ainda mais.{*EF*}{*B*}{*B*} +{*C2*}Os sete mil quatriliões de átomos do corpo do jogador foram criados, muito antes deste jogo, no coração de uma estrela. Por isso, o jogador é, em si, informação de uma estrela. E o jogador move-se através de uma história, que é uma floresta de informação plantada por um homem chamado Julian num apartamento, mundo infinito criado por um homem chamado Markus, que existe num mundo pequeno e privado criado pelo jogador, que habita um universo criado por...{*EF*}{*B*}{*B*} +{*C3*}Caluda. Por vezes, o jogador criou um pequeno mundo privado suave, quente e simples. Outras vezes duro, frio e complexo. Por vezes, construiu um modelo de universo na sua cabeça; salpicos de energia, salpicos de energia movendo-se através de vastos espaços vazios. Por vezes, chamava a esses salpicos "electrões" e "protões".{*EF*}{*B*}{*B*} + + + +{*C2*}Por vezes, chamava-lhes "planetas" e "estrelas".{*EF*}{*B*}{*B*} +{*C2*}Por vezes, acreditava estar num universo feito de energia, que era feita de ligados e desligados; zeros e uns; linhas de código. Por vezes, acreditava que estava a jogar um jogo. Por vezes, acreditava que estava a ler palavras num ecrã.{*EF*}{*B*}{*B*} +{*C3*}Tu és o jogador, a ler palavras...{*EF*}{*B*}{*B*} +{*C2*}Caluda... Por vezes, o jogador lia linhas de código num ecrã. Descodificava-as em palavras; descodificava as palavras e dava-lhes sentido; descodificava sentidos e transformava-os em sentimentos, emoções, teorias, ideias, e o jogador começava a respirar mais depressa e mais profundamente e percebia que estava vivo, vivo, que aquelas mil mortes não tinham sido reais, o jogador estava vivo{*EF*}{*B*}{*B*} +{*C3*}Tu. Sim, tu. Tu estás vivo.{*EF*}{*B*}{*B*} +{*C2*}e, por vezes, o jogador acreditava que o universo lhe falara através da luz do sol que atravessava as folhas das árvores num dia de verão{*EF*}{*B*}{*B*} +{*C3*}e, por vezes, o jogador acreditava que o universo lhe falara através da luz emitida pelo nítido céu de inverno, onde um salpico de luz no canto do olho do jogador podia ser uma estrela um milhão de vezes maior do que o sol, a ferver os seus planetas até se transformarem em plasma de modo a ser vista pelo jogador por um momento, enquanto ia a caminho de casa no outro extremo do universo, com um súbito odor a comida, quase à porta de casa, prestes a sonhar de novo{*EF*}{*B*}{*B*} +{*C2*}e, por vezes, o jogador acreditava que o universo lhe falara através dos zeros e uns, através da electricidade do mundo, através das palavras que passavam num ecrã no final de um sonho{*EF*}{*B*}{*B*} +{*C3*}e o universo dizia amo-te{*EF*}{*B*}{*B*} +{*C2*}e o universo dizia jogaste bem{*EF*}{*B*}{*B*} +{*C3*}e o universo dizia tudo o que precisas está em ti{*EF*}{*B*}{*B*} +{*C2*}e o universo dizia que és mais forte do que pensas{*EF*}{*B*}{*B*} +{*C3*}e o universo dizia que és a luz do dia{*EF*}{*B*}{*B*} +{*C2*}e o universo dizia que és a noite{*EF*}{*B*}{*B*} +{*C3*}e o universo dizia que as trevas contra as quais lutas estão dentro de ti{*EF*}{*B*}{*B*} +{*C2*}e o universo dizia que a luz que procuras está em ti{*EF*}{*B*}{*B*} +{*C3*}e o universo dizia que não estás só{*EF*}{*B*}{*B*} +{*C2*}e o universo dizia que não estás separado de tudo o resto{*EF*}{*B*}{*B*} +{*C3*}e o universo dizia que és o universo que se prova a si mesmo, que fala consigo próprio, que lê o seu próprio código{*EF*}{*B*}{*B*} +{*C2*}e o universo dizia amo-te porque és o amor.{*EF*}{*B*}{*B*} +{*C3*}E o jogo terminava e o jogador acordava do sonho. E o jogador começava um novo sonho. E o jogador sonhava de novo, sonhava melhor. E o jogador era o universo. E o jogador era amor.{*EF*}{*B*}{*B*} +{*C3*}Tu és o jogador.{*EF*}{*B*}{*B*} +{*C2*}Acorda.{*EF*} + + +Repor Submundo + +Queres mesmo repor o Submundo no seu estado predefinido? Vais perder tudo o que construíste no Submundo! + +Repor Submundo + +Não Repor Submundo + +De momento, não é possível tosquiar este Vacogumelo. Foi alcançado o número máximo de Porcos, Ovelhas, Vacas, Gatos e Cavalos. + +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. + +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 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. + +O número máximo de Pinturas/Estruturas de Itens num mundo foi atingido. + +Não podes produzir inimigos no modo Calmo. + +Este animal não pode entrar no Modo Amor. O número máximo de Porcos, Ovelhas, Vacas, 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 Criatura num mundo foi alcançado. + +Inverter + +Esquerdino + +Morreste! + +Regenerar + +Conteúdo Transferível + +Alterar Skin + +Instruções de Jogo + +Controlos + +Definições + +Ficha técnica + +Reinstalar Conteúdo + +Definições de Depuração + +Fogos Propagados + +Explosões de TNT + +Jogador vs. Jogador + +Confiar nos Jogadores + +Privilégios de Anfitrião + +Gerar Estruturas + +Mundo Superplano + +Baú de Bónus + +Opções de Mundo + +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 + +Pode Abrir Caixas + +Pode Atacar Jogadores + +Pode Atacar Animais + +Moderador + +Expulsar Jogador + +Pode Voar + +Desativar Exaustão + +Invisível + +Opções de Anfitrião + +Jogadores/Convidar + +Jogo online + +Apenas por convite + +Mais Opções + +Carrega + +Novo Mundo + +Nome do Mundo + +Semente para o Gerador de Mundos + +Deixar livre p/ semente aleatória + +Jogadores + +Participar no Jogo + +Iniciar Jogo + +Não foram encontrados jogos + +Jogar + +Classificações + +Feitos + +Ajuda e Opções + +Desbloquear Jogo Completo + +Retomar Jogo + +Guardar Jogo + +Dificuldade: + +Tipo de Jogo: + +Gamertags: + +Estruturas: + +Tipo de Nível: + +JvJ: + +Confiar Jogadores: + +TNT: + +Fogos Propagados: + +Reinstalar Tema + +Reinstalar Imagem de Jogador 1 + +Reinstalar Imagem de Jogador 2 + +Reinstalar Item de Avatar 1 + +Reinstalar Item de Avatar 2 + +Reinstalar Item de Avatar 3 + +Opções + +Áudio + +Controlo + +Gráficos + +Interface de Utilizador + +Repor Predefinições + +Ver Saltos + +Sugestões + +Descrições do Jogo + +Gamertags do Jogo + +Ecrã Divido Vertical 2 Jogadores + +Concluído + +Editar mensagem do sinal: + +Preenche os detalhes da tua captura de ecrã + +Legenda + +Captura de ecrã do jogo + +Editar mensagem do sinal: + +Olha o que eu fiz no Minecraft: Edição Xbox 360! + +As texturas, os ícones e a interface de utilizador clássicos do Minecraft! + +Mostrar todos os Mundos Mash-up + +Selecionar Ranhura de Gravação de Transferência + +Ranhura Vazia + +A Carregar Gravação de Metadados + +A Carregar Gravação de Dados + +A Carregar Gravação para Xbox One + +Carregamento Cancelado + +Cancelaste o carregamento deste ficheiro para a área de transferência de gravações. + +Sem Efeitos + +Velocidade + +Lentidão + +Rapidez + +Cansaço por Escavação + +Força + +Fraqueza + +Saúde Instantânea + +Danos Instantâneos + +Impulso de Salto + +Náusea + +Regeneração + +Resistência + +Resistência ao Fogo + +Inalação de Água + +Invisibilidade + +Cegueira + +Visão Nocturna + +Fome + +Veneno + +Cérbero + +Aumento de Saúde + +Absorção + +Saturação + +de Velocidade + +de Lentidão + +de Rapidez + +de Sonolência + +de Força + +de Fraqueza + +de Saúde + +de Danos + +de Salto + +de Náusea + +de Regeneração + +de Resistência + +de Resistência ao Fogo + +de Inalação de Água + +de Invisibilidade + +de Cegueira + +de Visão Nocturna + +de Fome + +de Veneno + +de Decadência + +de Aumento de Saúde + +de Absorção + +de Saturação + + + +II + +III + +IV + +Explosiva + +Mundano + +Desinteressante + +Suave + +Clara + +Leitosa + +Difusa + +Simples + +Fina + +Estranha + +Plana + +Pesada + +Estragada + +Amanteigada + +Macia + +Suave + +Alegre + +Espessa + +Elegante + +Pomposa + +Charmosa + +Enérgica + +Sofisticada + +Cordial + +Brilhante + +Potente + +Repugnante + +Sem Cheiro + +Grosseira + +Severa + +Acre + +Nojenta + +Mal Cheirosa + +Usada como base em todas as poções. Usa-a num posto de poções para criares poções. + +Não tem efeitos, pode ser usada num posto de poções para criar poções adicionando mais ingredientes. + +Aumenta a velocidade dos movimentos dos jogadores, animais e monstros afetados, e a velocidade de sprint, comprimento do salto e campo de visão dos jogadores. + +Reduz a velocidade dos movimentos dos jogadores, animais e monstros afetados, e a velocidade de sprint, comprimento do salto e campo de visão dos jogadores. + +Aumenta os danos causados pelos jogadores e monstros quando atacam. + +Reduz os danos causados pelos jogadores e monstros quando atacam. + +Aumenta instantaneamente a saúde dos jogadores, animais e monstros afetados. + +Reduz instantaneamente a saúde dos jogadores, animais e monstros afetados. + +Restitui a saúde dos jogadores, animais e monstros afetados ao longo do tempo. + +Faz com que os jogadores, animais e monstros afetados fiquem imunes ao fogo, lava e ataques de Blaze à distância. + +Reduz a saúde dos jogadores, animais e monstros afetados ao longo do tempo. + +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 + +Veneno de Artrópodes + +Coice + +Aspeto do Fogo + +Proteção + +Proteção contra Fogos + +Queda de Penas + +Proteção contra Explosões + +Proteção contra Projécteis + +Respiração + +Afinidade Aquática + +Eficiência + +Toque de Seda + +Inquebrável + +Saque + +Sorte + +Poder + +Chama + +Soco + +Infinidade + +I + +II + +III + +IV + +V + +VI + +VII + +VIII + +IX + +X + +Pode ser extraído com uma Picareta de Ferro ou melhor para obter Esmeraldas. + +Similar a um Baú, com a exceção de que os itens colocados num Baú Ender estão disponíveis em cada um dos Baús Ender do jogador, mesmo em dimensões diferentes. + +Ativa-se quando uma entidade passa por uma Armadilha ligada. + +Ativa um Gancho de Armadilha ligado quando uma entidade passa por ele. + +Uma forma compacta de armazenar Esmeraldas. + +Um muro feito de Pedras Arredondadas. + +Pode ser usada para reparar armas, ferramentas e armaduras. + +Fundido numa fornalha para produzir Quartzo do Submundo. + +Usado como decoração. + +Pode ser trocado com aldeões. + +Usado como decoração. É possível plantar Flores, Mudas, Cactos e Cogumelos nele. + +Restitui 2{*ICON_SHANK_01*} e pode ser transformada numa cenoura dourada. Pode ser plantada na terra. + +Restitui 0,5{*ICON_SHANK_01*} ou pode ser cozida numa fornalha. Pode ser plantada na terra. + +Restitui 3{*ICON_SHANK_01*}. Cria-se cozendo uma batata numa fornalha. + +Restitui 1{*ICON_SHANK_01*}. Se comeres isto podes ficar envenenado. + +Restitui 3{*ICON_SHANK_01*}. Fabricada a partir de uma cenoura e de pepitas de ouro. + +Usada para controlar um porco com sela quando estás a montá-lo. + +Restaura 4{*ICON_SHANK_01*}. + +Usado com uma Bigorna para enfeitiçar armas, ferramentas ou armaduras. + +Criado através da extração de Minério de Quartzo do Submundo. Pode ser transformado num Bloco de Quartzo. + +Fabricada a partir da Lã. Usada como decoração. + +Esmeralda + +Vaso de Flores + +Cenoura + +Batata + +Batata Cozida + +Batata Venenosa + +Cenoura Dourada + +Cenoura num Pau + +Tarte de Abóbora + +Livro de Feitiços + +Quartzo do Submundo + +Minério de Esmeralda + +Baú Ender + +Gancho de Armadilha + +Armadilha + +Bloco de Esmeralda + +Muro Pedra Arredondada + +Muro Pedra Arr. e Musgo + +Vaso de Flores + +Cenouras + +Batatas + +Bigorna + +Bigorna + +Bigorna Ligeiramente Danificada + +Bigorna Muito Danificada + +Minério de Quartzo do Submundo + +Bloco de Quartzo + +Bloc. Quartzo Esculpido + +Bloco Pilar de Quartzo + +Escadas de Quartzo + +Alcatifa + +Alcatifa Preta + +Alcatifa Vermelha + +Alcatifa Verde + +Alcatifa Castanha + +Alcatifa Azul + +Alcatifa Roxa + +Alcatifa Ciano + +Alcatifa Cinzenta-clara + +Alcatifa Cinzenta + +Alcatifa Rosa + +Alcatifa Lima + +Alcatifa Amarela + +Alcatifa Azul-clara + +Alcatifa Magenta + +Alcatifa Laranja + +Alcatifa Branca + +Grés Esculpido + +Grés Suave + +{*PLAYER*} foi morto ao tentar ferir {*SOURCE*} + +{*PLAYER*} foi esmagado por uma Bigorna. + +{*PLAYER*} foi esmagado por um bloco. + +{*PLAYER*} teletransportado/a para {*DESTINATION*} + +{*PLAYER*} teletransportou-te para a sua posição + +{*PLAYER*} teletransportado/a até ti + +Espinhos + +Placa de Quartzo + +Ilumina as zonas escuras, mesmo debaixo de água. + +Torna invisíveis os jogadores, animais e monstros afetados. + +Reparar & Nomear + +Custo do Feitiço: %d + +Demasiado Caro! + +Renomear + +Tens: + +Necessário para Troca + +{*VILLAGER_TYPE*} oferece %s + +Reparar + +Trocar + +Tingir coleira + + + Esta é a interface da Bigorna, que podes usar para renomear, reparar e aplicar feitiços a armas, armaduras ou ferramentas, às custas de Níveis de Experiência. + + + + {*B*} + Prime{*CONTROLLER_VK_A*} para aprenderes mais sobre a interface da Bigorna.{*B*} + Prime{*CONTROLLER_VK_B*} se já conheceres a interface da Bigorna. + + + + Para começar a trabalhar num objeto, coloca-o no primeiro orifício. + + + + Quando a matéria-prima correta é colocada no segundo orifício (exemplo: Lingotes de Ferro para uma Espada de Ferro danificada), a reparação proposta surge no orifício de saída. + + + + Em alternativa, um segundo objeto idêntico pode ser colocado no segundo orifício para combinar os dois objetos. + + + + Para enfeitiçar objetos na Bigorna, coloca um Livro de Feitiços no segundo orifício. + + + + O número de Níveis de Experiência que o trabalho vai custar é apresentado por baixo da saída. Se não tiveres Níveis de Experiência suficientes, a reparação não será concluída. + + + + É possível renomear o objeto editando o nome apresentado na caixa de texto. + + + + Pegar no objeto reparado irá consumir os dois objetos usados na Bigorna e diminuir o teu Nível de Experiência na quantidade indicada. + + + + Nesta zona há uma Bigorna e um Baú com ferramentas e armas para trabalhar. + + + + {*B*} + Prime{*CONTROLLER_VK_A*} para aprenderes mais sobre a Bigorna.{*B*} + Prime{*CONTROLLER_VK_B*} se já conheceres a Bigorna. + + + + Usando uma Bigorna, podes reparar armas e ferramentas para restaurar a sua durabilidade, renomeá-las ou enfeitiçá-las com Livros de Feitiços. + + + + Os Livros de Feitiços estão dentro de Baús nas masmorras, ou são enfeitiçados a partir de Livros normais na Mesa de Feitiços. + + + + Usar a Bigorna custa Níveis de Experiência e cada utilização poderá danificar a Bigorna. + + + + O tipo de trabalho a fazer, o valor do objeto, o número de feitiços e o uso prévio afetam o custo da reparação. + + + + Renomear um objeto muda o nome apresentado a todos os jogadores e reduz permanentemente o custo do trabalho prévio. + + + + No Baú desta zona vais encontrar Picaretas, matérias-primas, Frascos de Feitiços e Livros de Feitiços para experimentares. + + + + Esta é a interface de troca que apresenta as trocas que podem ser feitas com um aldeão. + + + + {*B*} + Prime{*CONTROLLER_VK_A*} para aprenderes mais sobre a interface de troca.{*B*} + Prime{*CONTROLLER_VK_B*} se já conheceres a interface de troca. + + + + Todas as trocas que o aldeão está disposto a fazer de momento são apresentadas no topo. + + + + As trocas surgirão a vermelho e estarão indisponíveis se não tiveres os objetos necessários. + + + + A quantidade e o tipo de objetos que dás ao aldeão surge nas duas caixas à esquerda. + + + + Podes ver o número total de objetos necessários para a troca nas duas caixas à esquerda. + + + + Prime{*CONTROLLER_VK_A*} para trocar os objetos que o aldeão pretende pelo objeto que ele disponibiliza. + + + + Nesta zona há um aldeão e um Baú com Papel para comprar objetos. + + + + {*B*} + Prime{*CONTROLLER_VK_A*} para aprenderes mais sobre trocas.{*B*} + Prime{*CONTROLLER_VK_B*} se já conheceres as trocas. + + + + Os jogadores podem trocar objetos do seu inventário com os aldeões. + + + + As trocas que um aldeão poderá disponibilizar dependem da sua profissão. + + + + Desempenhar uma mistura de trocas irá adicionar ou atualizar aleatoriamente as trocas disponíveis do aldeão. + + + + As trocas que tenham sido usadas frequentemente podem ser temporariamente removidas, mas o aldeão irá sempre oferecer pelo menos uma troca. + + + + Tira algum Papel do Baú e tenta trocar com este aldeão. + + + + Nesta zona há dois Baús Ender. + + + + {*B*} + Prime{*CONTROLLER_VK_A*} para aprenderes mais sobre Baús Ender.{*B*} + Prime{*CONTROLLER_VK_B*} se já conheceres os Baús Ender. + + + + Todos os Baús Ender num mundo estão ligados, mesmo através de dimensões. Os objetos colocados num Baú Ender estão acessíveis noutro Baú Ender. + + + + Todavia, os conteúdos dos Baús Ender são diferentes para cada jogador. + + + + Isto permite que os jogadores armazenem objetos em qualquer Baú Ender e os recuperem noutros Baús Ender em diferentes posições no mundo. Podes tentar isto agora, colocando objetos num dos Baús Ender. + + +Restitui 2{*ICON_SHANK_01*}, regenera a saúde durante 30 segundos e concede resistência ao fogo e a danos durante 5 minutos. Fabricada a partir de uma maçã e blocos de ouro. + +Pode Teletransportar + +Teletransportar + +Teletransportar Para Jogador + +Teletransportar Para Mim + +Pode Desativar Exaustão + +Pode Tornar-se Invisível + +Agora podes ativar a invisibilidade + +Já não podes ativar a invisibilidade + +Agora podes ativar o voo + +Já não podes ativar o voo + +Agora podes desativar a exaustão + +Já não podes desativar a exaustão + +Agora podes teletransportar + +Já não podes teletransportar + +{*T3*}COMO JOGAR : BIGORNAS{*ETW*}{*B*}{*B*} +Os níveis de experiência também podem ser usados para reparar, enfeitiçar ou renomear objetos com a Bigorna.{*B*} +Todos os objetos podem ser renomeados, embora só objetos com durabilidade possam ser reparados ou ser alvo de feitiços dos Livros de Feitiços.{*B*} +Um objeto pode ser reparado se for colocado num dos orifícios à esquerda, juntamente com alguma matéria-prima do objeto, como Lingotes de Ferro para uma Espada de Ferro, ou combinado com outro objeto do mesmo tipo.{*B*} +Combinar objetos é mais eficiente quando usas uma Bigorna e, se algum dos objetos tiver sido enfeitiçado, o produto final poderá ter feitiços de qualquer dos materiais usados.{*B*} +Os Livros de Feitiços podem aplicar feitiços aos objetos, ao combinarem-nos numa Bigorna, desde que o feitiço do Livro seja adequado. Os Livros de Feitiços podem ser encontrados em Baús nas masmorras, ou ser enfeitiçados a partir de Livros normais na Mesa de Feitiços.{*B*} +Há a possibilidade de a Bigorna ficar danificada após cada utilização, e até de se destruir caso seja demasiado castigada.{*B*} + + +{*T3*}COMO JOGAR : TROCAR{*ETW*}{*B*}{*B*} +É possível trocar objetos com aldeões. Cada aldeão tem uma profissão. Eles podem ser Agricultores, Açougueiros, Ferreiros, Bibliotecários ou Padres, e isto afeta o tipo de objetos que podem trocar.{*B*} +Podes encontrar uma lista de todas as trocas que podes fazer com um aldeão no menu de trocas. Um aldeão pode modificar ou adicionar o que tem para troca sempre que um jogador faça negócio com ele, embora uma troca possa ficar temporariamente desativada se for usada com demasiada frequência.{*B*} +As trocas geralmente implicam comprar ou vender uns quantos objetos por esmeraldas.{*B*} +Se não tiveres os objetos necessários para uma troca, os objetos surgem a vermelho.{*B*} + + +{*T3*}COMO JOGAR : BAÚ ENDER {*ETW*}{*B*}{*B*} +Todos os Baús Ender de um mundo estão ligados. Os objetos colocados num Baú Ender estão acessíveis em qualquer outro. Todavia, os conteúdos dos Baús Ender diferem de jogador para jogador. Isto permite que os Jogadores armazenem objetos em qualquer Baú Ender e os recolham de outros Baús Ender em locais distintos do mundo. + + +Agricultor + +Bibliotecário + +Padre + +Ferreiro + +Açougueiro + +Presentes nas aldeias, os aldeões oferecem-se para vender objetos ao jogador dependendo da sua profissão. + +Baú Grande + + + Também podes criar Livros de Feitiços na Mesa de Feitiços, os quais podem ser usados mais tarde na Bigorna para aplicar o seu feitiço a um objeto. + + + + Ganchos de Armadilha também fornecem energia constante a um circuito enquanto algo está a despoletar a corda entre eles. + + + + Depois de domesticado, um lobo terá sempre a sua coleira. Podes mudar a cor da coleira tingindo-a. + + +Cenouras e Batatas são cultivadas plantando Cenouras ou Batatas, e ficam prontas a colher quando o vegetal é visível acima do solo. + + + Além disso, os jogadores podem colocar selas em porcos e montá-los. Eles são controlados se os tentares com uma Cenoura num Pau. + + + + Em caso de necessidade, podes mover lentamente a tua vagoneta usando {*CONTROLLER_ACTION_MOVE*}. Pô-la num carril com energia ajuda a vagoneta a arrancar. + + +Não podes juntar-te a este jogo porque o ecrã dividido só é suportado no modo de Alta Definição. Faz com que todos os outros jogadores terminem a sessão se quiseres aderir. + +Cura + +Xbox 360 + +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 Grav. Xbox One + +Carregar Gravação + +Na área de transferência de gravações só pode ser armazenada uma gravação Xbox 360 de cada vez. Por favor, confirma se transferiste a gravação na tua consola Xbox One antes de carregares outra gravação Xbox 360. + +A carregar... + +Carregamento Concluído! + +Carregamento Falhou. Volta a tentar mais tarde, por favor. + + diff --git a/Minecraft.Client/Common/Media/skin.swf b/Minecraft.Client/Common/Media/skin.swf new file mode 100644 index 00000000..6206ca47 Binary files /dev/null and b/Minecraft.Client/Common/Media/skin.swf differ diff --git a/Minecraft.Client/Common/Media/skinGraphics.swf b/Minecraft.Client/Common/Media/skinGraphics.swf new file mode 100644 index 00000000..f0482ec7 Binary files /dev/null and b/Minecraft.Client/Common/Media/skinGraphics.swf differ diff --git a/Minecraft.Client/Common/Media/skinGraphicsHud.swf b/Minecraft.Client/Common/Media/skinGraphicsHud.swf new file mode 100644 index 00000000..7f75f423 Binary files /dev/null and b/Minecraft.Client/Common/Media/skinGraphicsHud.swf differ diff --git a/Minecraft.Client/Common/Media/skinGraphicsInGame.swf b/Minecraft.Client/Common/Media/skinGraphicsInGame.swf new file mode 100644 index 00000000..639f5bda Binary files /dev/null and b/Minecraft.Client/Common/Media/skinGraphicsInGame.swf differ diff --git a/Minecraft.Client/Common/Media/skinGraphicsLabels.swf b/Minecraft.Client/Common/Media/skinGraphicsLabels.swf new file mode 100644 index 00000000..0538ced9 Binary files /dev/null and b/Minecraft.Client/Common/Media/skinGraphicsLabels.swf differ diff --git a/Minecraft.Client/Common/Media/skinHD.swf b/Minecraft.Client/Common/Media/skinHD.swf new file mode 100644 index 00000000..12d35caf Binary files /dev/null and b/Minecraft.Client/Common/Media/skinHD.swf differ diff --git a/Minecraft.Client/Common/Media/skinHDGraphics.swf b/Minecraft.Client/Common/Media/skinHDGraphics.swf new file mode 100644 index 00000000..7ba08bc8 Binary files /dev/null and b/Minecraft.Client/Common/Media/skinHDGraphics.swf differ diff --git a/Minecraft.Client/Common/Media/skinHDGraphicsHud.swf b/Minecraft.Client/Common/Media/skinHDGraphicsHud.swf new file mode 100644 index 00000000..bb51379e Binary files /dev/null and b/Minecraft.Client/Common/Media/skinHDGraphicsHud.swf differ diff --git a/Minecraft.Client/Common/Media/skinHDGraphicsInGame.swf b/Minecraft.Client/Common/Media/skinHDGraphicsInGame.swf new file mode 100644 index 00000000..d014d317 Binary files /dev/null and b/Minecraft.Client/Common/Media/skinHDGraphicsInGame.swf differ diff --git a/Minecraft.Client/Common/Media/skinHDGraphicsLabels.swf b/Minecraft.Client/Common/Media/skinHDGraphicsLabels.swf new file mode 100644 index 00000000..abb3194e Binary files /dev/null and b/Minecraft.Client/Common/Media/skinHDGraphicsLabels.swf differ diff --git a/Minecraft.Client/Common/Media/skinHDHud.swf b/Minecraft.Client/Common/Media/skinHDHud.swf new file mode 100644 index 00000000..0e2a9ef2 Binary files /dev/null and b/Minecraft.Client/Common/Media/skinHDHud.swf differ diff --git a/Minecraft.Client/Common/Media/skinHDInGame.swf b/Minecraft.Client/Common/Media/skinHDInGame.swf new file mode 100644 index 00000000..b9aaa068 Binary files /dev/null and b/Minecraft.Client/Common/Media/skinHDInGame.swf differ diff --git a/Minecraft.Client/Common/Media/skinHDLabels.swf b/Minecraft.Client/Common/Media/skinHDLabels.swf new file mode 100644 index 00000000..dd80d1e7 Binary files /dev/null and b/Minecraft.Client/Common/Media/skinHDLabels.swf differ diff --git a/Minecraft.Client/Common/Media/skinHud.swf b/Minecraft.Client/Common/Media/skinHud.swf new file mode 100644 index 00000000..31b3ff00 Binary files /dev/null and b/Minecraft.Client/Common/Media/skinHud.swf differ diff --git a/Minecraft.Client/Common/Media/skinInGame.swf b/Minecraft.Client/Common/Media/skinInGame.swf new file mode 100644 index 00000000..fd3147b6 Binary files /dev/null and b/Minecraft.Client/Common/Media/skinInGame.swf differ diff --git a/Minecraft.Client/Common/Media/skinLabels.swf b/Minecraft.Client/Common/Media/skinLabels.swf new file mode 100644 index 00000000..e562acbe Binary files /dev/null and b/Minecraft.Client/Common/Media/skinLabels.swf differ diff --git a/Minecraft.Client/Common/Media/skin_Minecraft.xui b/Minecraft.Client/Common/Media/skin_Minecraft.xui new file mode 100644 index 00000000..da03a9ab --- /dev/null +++ b/Minecraft.Client/Common/Media/skin_Minecraft.xui @@ -0,0 +1,45957 @@ + + +1280.000000 +720.000000 +[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] + + + +XuiCheckboxSmall +265.000000 +20.000000 + + + +text_Button +240.000000 +20.000000 +25.000000,1.000000,0.000000 +5 +0xff323232 +0xff0f0f0f +11.000000 +4112 + + + + +text_Button1 +240.000000 +20.000000 +24.000000,0.000000,0.000000 +5 +false +0xff323232 +0xff0f0f0f +11.000000 +4112 + + + + +TickBox_Norm +18.000000 +18.000000 +2.000000,1.000000,0.000000 +16 +Graphics\Tickbox_Norm.png +48 + + + + +TickBox_Over +18.000000 +18.000000 +2.000000,1.000000,0.000000 +false +16 +Graphics\Tickbox_Over.png +48 + + + + +Tick +28.000000 +24.000000 +0.000000,-1.000000,0.000000 +false +Graphics\Tick.png +48 + + + + +XuiSoundXACT +15.000000 +14.000000 +70.000000,21.000000,0.000000 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + +NormalCheck + + + +EndNormalCheck + +stop + + +FocusCheck + + + +EndFocusCheck + +stop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +EndFocusDisable + +stop + + +NormalCheckDisable + + + +EndNormalCheckDisable + +stop + + +FocusCheckDisable + + + +EndFocusCheckDisable + +stop + + +NormalSel + + + +EndNormalSel + +stop + + +NormalSelCheck + + + +EndNormalSelCheck + +stop + + +NormalSelCheckDisable + + + +EndNormalSelCheckDisable + +stop + + +NormalSelDisable + + + +EndNormalSelDisable + +stop + + + +TickBox_Over +Show +Opacity + + +0 +false +1.000000 + + + +0 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +false +1.000000 + + + +0 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +false +0.500000 + + + +0 +false +0.500000 + + + +0 +true +0.500000 + + + +0 +true +0.500000 + + + +0 +false +0.500000 + + + +0 +false +0.500000 + + + +0 +true +0.500000 + + + +0 +true +0.500000 + + + +0 +false +0.500000 + + + +0 +false +0.500000 + + + +Tick +Show +Opacity + + +0 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +0.500000 + + + +0 +true +0.500000 + + + +0 +false +0.500000 + + + +0 +false +0.500000 + + + +TickBox_Norm +Show +Opacity + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +false +1.000000 + + + +0 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +false +1.000000 + + + +0 +false +1.000000 + + + +0 +true +0.500000 + + + +0 +true +0.500000 + + + +0 +false +0.500000 + + + +0 +false +0.500000 + + + +0 +true +0.500000 + + + +0 +true +0.500000 + + + +0 +false +0.500000 + + + +0 +false +0.500000 + + + +0 +true +0.500000 + + + +0 +true +0.500000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +0.500000 + + + +0 +true +0.500000 + + + +text_Button1 +TextColor +Opacity +DropShadowColor +Show + + +1 +0xff323232 +1.000000 +0xff0f0f0f +false + + + +0 +0xff323232 +1.000000 +0xff0f0f0f +false + + + +1 +0xffebcc0f +1.000000 +0xff0f0f0f +true + + + +0 +0xffebcc0f +1.000000 +0xff0f0f0f +true + + + +1 +0xff323232 +1.000000 +0xff0f0f0f +false + + + +0 +0xff323232 +1.000000 +0xff0f0f0f +false + + + +1 +0xffebcc0f +1.000000 +0xff0f0f0f +true + + + +0 +0xffebcc0f +1.000000 +0xff0f0f0f +true + + + +1 +0xff8c8c8c +0.500000 +0x7f0f0f0f +false + + + +0 +0xff8c8c8c +0.500000 +0x7f0f0f0f +false + + + +1 +0xffebcc0f +0.500000 +0x7f0f0f0f +true + + + +0 +0xffebcc0f +0.500000 +0x7f0f0f0f +true + + + +1 +0xff323232 +0.500000 +0x7e0f0f0f +false + + + +0 +0xff323232 +0.500000 +0x7e0f0f0f +false + + + +1 +0xffebcc0f +0.500000 +0x7f0f0f0f +true + + + +0 +0xffebcc0f +0.500000 +0x7f0f0f0f +true + + + +0 +0xffebcc0f +0.500000 +0x7f0f0f0f +false + + + +0 +0xffebcc0f +0.500000 +0x7f0f0f0f +false + + + +XuiSoundXACT +SoundBank +WaveBank +Cue + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb +ButtonFocus + + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb +ButtonFocus + + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + +0 + + + + + + +text_Button +Opacity + + +0 +1.000000 + + + +0 +1.000000 + + + +0 +0.500000 + + + +0 +0.500000 + + + +0 +1.000000 + + + +0 +1.000000 + + + +0 +0.500000 + + + +0 +0.500000 + + + + + + +XuiSliderVertical +33.000000 +270.000000 + + + +XuiSoundXACT +53.000000 +56.000000 +-15.459526,85.765701,0.000000 +0.000000,0.000000,0.707107,-0.707107 +144.996216,20.499901,0.000000 + + + + +Background +24.000000 +270.000000 +6.000000,2.000000,0.000000 +PanelRecessed + + + + +SliderBody +33.777779 +32.296295 + + + +SliderButton +32.000000 +32.000000 +2.000000,0.000000,0.000000 +GraphicPanel4grid + + + + + +Normal + + + +EndNormal + + + + +SliderButton +Position + + +0 +2.000000,0.000000,0.000000 + + + +0 +2.000008,242.000000,0.000000 + + + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + +NormalDisable + + + +EndNormalDisable + +stop + + +InitFocus + + + +EndInitFocus + +stop + + + +XuiSoundXACT +SoundBank +WaveBank +Cue +Position + + +0 + + + +-15.459526,85.765701,0.000000 + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb +ButtonFocus +-15.459526,85.765701,0.000000 + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + +-105.459526,45.765701,0.000000 + + + +SliderBody +Opacity + + +0 +1.000000 + + + +0 +1.000000 + + + +0 +0.500000 + + + +0 +0.500000 + + + +Background +Opacity + + +0 +1.000000 + + + +0 +1.000000 + + + +0 +0.500000 + + + +0 +0.500000 + + + + + + +XuiSliderVerticalSmall +32.000000 +162.000000 + + + +XuiSoundXACT +53.000000 +56.000000 +-15.459526,85.765701,0.000000 +0.000000,0.000000,0.707107,-0.707107 +144.996216,20.499901,0.000000 + + + + +Background +23.000000 +162.000000 +6.000000,2.000000,0.000000 +PanelRecessed + + + + +SliderBody +32.000000 +32.000000 +1.000000,0.000000,0.000000 + + + +XuiControl1 +32.000000 +32.000000 +0.000000,0.000004,0.000000 +GraphicPanel4grid + + + + + +Normal + + + +EndNormal + + + + +XuiControl1 +Position + + +0 +0.000000,0.000004,0.000000 + + + +0 +0.000000,132.000000,0.000000 + + + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + +NormalDisable + + + +EndNormalDisable + +stop + + +InitFocus + + + +EndInitFocus + +stop + + + +XuiSoundXACT +SoundBank +WaveBank +Cue +Position + + +0 + + + +-15.459526,85.765701,0.000000 + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb +ButtonFocus +-15.459526,85.765701,0.000000 + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + +-105.459526,45.765701,0.000000 + + + +SliderBody +Opacity + + +0 +1.000000 + + + +0 +1.000000 + + + +0 +0.500000 + + + +0 +0.500000 + + + +Background +Opacity + + +0 +1.000000 + + + +0 +1.000000 + + + +0 +0.500000 + + + +0 +0.500000 + + + + + + +XuiSlider +606.000000 +38.000000 + + + +GraphicGroup +606.000000 +38.000000 +5 + + +0xff0f0f80 + + + + +0x28ebebeb +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,129.000000,0.000000,0,129.000000,0.000000,129.000000,0.000000,129.000000,30.000000,0,129.000000,30.000000,129.000000,30.000000,0.000000,30.000000,0,0.000000,30.000000,0.000000,30.000000,0.000000,0.000000,0, + + + + +Slider_Track +600.000000 +32.000000 +3.000000,3.000000,0.000000 +5 +true + + + +XuiImage1 +600.000000 +32.000000 +Graphics\Slider_Track.png + + + + + +TrackEndCap +2.000000 +32.000000 +601.000000,3.000000,0.000000 +4 + + +0xff0f0f80 + + + + +0xff000000 +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,3.000000,0.000000,0,3.000000,0.000000,3.000000,0.000000,3.000000,32.000000,0,3.000000,32.000000,3.000000,32.000000,0.000000,32.000000,0,0.000000,32.000000,0.000000,32.000000,0.000000,0.000000,0, + + + + +SliderTint +596.000000 +28.000000 +5.000000,5.000000,0.000000 +207 +false + + +0xff0f76eb + + + + +0x8c4f7bc3 +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,294.000000,0.000000,0,294.000000,0.000000,294.000000,0.000000,294.000000,53.000000,0,294.000000,53.000000,294.000000,53.000000,0.000000,53.000000,0,0.000000,53.000000,0.000000,53.000000,0.000000,0.000000,0, + + + + +SliderBody +584.000000 +32.000000 +3.000000,3.000000,0.000000 +5 + + + +XuiImage1 +16.000000 +32.000000 +true +Graphics\Slider_Button.png + + + + + +Normal + + + +EndNormal + + + +Focus + + + +EndFocus + + + + +XuiImage1 +Position +DisableTimelineRecursion + + +0 +0.000000,0.000000,0.000000 +true + + + +0 +584.000000,0.000000,0.000000 +false + + + +0 +0.000000,0.000000,0.000000 +true + + + +0 +584.000000,0.000000,0.000000 +true + + + + + + +Text_Value +50.000000 +26.000000 +550.000000,6.000000,0.000000 +4 +0xffebebeb +0xff0f0f0f +4369 +1 + + + + +text_Label +606.000000 +38.000000 +5 +0xffebebeb +0xff0f0f0f +5137 + + + + +XuiSoundXACT +53.000000 +56.000000 +158.000000,15.000000,0.000000 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + +NormalDisable + + + +EndNormalDisable + +stop + + +InitFocus + + + +EndInitFocus + +stop + + + +text_Label +TextColor +Anchor + + +0 +0xffebebeb +5 + + + +0 +0xffebebeb +1 + + + +0 +0xffebcc0f +1 + + + +0 +0xffebcc0f +1 + + + +0 +0xffa0a0a0 +1 + + + +0 +0xffa0a0a0 +5 + + + +0 +0xffebeb0f +5 + + + +0 +0xffebeb0f +5 + + + +Text_Value +TextColor + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebcc0f + + + +0 +0xffebcc0f + + + +0 +0xffa0a0a0 + + + +0 +0xffa0a0a0 + + + +0 +0xffebeb0f + + + +0 +0xffebeb0f + + + +SliderTint +Show + + +0 +false + + + +0 +false + + + +0 +true + + + +0 +true + + + +0 +true + + + +0 +true + + + +0 +true + + + +0 +true + + + +TrackEndCap +Opacity + + +0 +1.000000 + + + +0 +1.000000 + + + +0 +1.000000 + + + +0 +1.000000 + + + +0 +0.750000 + + + +0 +0.750000 + + + +0 +0.750000 + + + +0 +0.750000 + + + +Slider_Track +Opacity + + +0 +1.000000 + + + +0 +1.000000 + + + +0 +1.000000 + + + +0 +1.000000 + + + +0 +0.750000 + + + +0 +0.750000 + + + +0 +0.750000 + + + +0 +0.750000 + + + +GraphicGroup +Fill.FillColor + + +0 +0x28ebebeb + + + +0 +0x28ebebeb + + + +0 +0xffebeb0f + + + +0 +0xffebeb0f + + + +XuiSoundXACT +SoundBank +WaveBank +Cue + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb +ButtonFocus + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + + + + +XuiRadioGroup +298.000000 +86.000000 + + + +graphic_groupfocusbackground +298.000000 +86.000000 +15 +false + + + + + +Normal + + + +EndNormal + + + +Focus + + + +EndFocus + +stop + + + +graphic_groupfocusbackground +Show + + +1 +false + + + +0 +true + + + + + + +FadeIn +300.000000 +300.000000 + + + +box +300.000000 +300.000000 +0.000000 +false + + +1.000000 +0xff787878 + + + + +0xffc8c8c8 + + +true +4,0.000000,0.000000,0.000000,0.000000,640.000000,0.000000,0,640.000000,0.000000,640.000000,0.000000,640.000000,480.000000,0,640.000000,480.000000,640.000000,480.000000,0.000000,480.000000,0,0.000000,480.000000,0.000000,480.000000,0.000000,0.000000,0, + + + + +box +Opacity +Show + + +0 +0.000000 +false + + + +2 +-100 +100 +50 +0.000000 +true + + + +0 +1.000000 +true + + + + + + +XuiVisualImagePresenter +46.000000 +46.000000 + + + +XuiImagePresenter +46.000000 +46.000000 +15 +4 + + + + + +XuiEditSmall +250.000000 +24.925926 + + + +Border +254.000000 +34.000000 +-2.000000,-2.000000,0.000000 +0.850000 +15 + + +0xff323232 + + + + +0xff323232 + + +2 +0xff787878 +0xffafafaf +0.000000 +1.000000 + + +-90.000000 + + +true +4,0.000000,0.000000,0.000000,0.000000,245.000000,0.000000,1,245.000000,0.000000,245.000000,0.000000,245.000000,50.000000,1,245.000000,50.000000,245.000000,50.000000,0.000000,50.000000,1,0.000000,50.000000,0.000000,50.000000,0.000000,0.000000,1, + + + + +Background +250.000000 +0.850000 +15 + + +0xff323232 + + + + +0xff646464 + + +2 +0xff787878 +0xffafafaf +0.000000 +1.000000 + + +-90.000000 + + +true +4,0.000000,0.000000,0.000000,0.000000,245.000000,0.000000,1,245.000000,0.000000,245.000000,0.000000,245.000000,50.000000,1,245.000000,50.000000,245.000000,50.000000,0.000000,50.000000,1,0.000000,50.000000,0.000000,50.000000,0.000000,0.000000,1, + + + + +Text +240.000000 +20.000000 +6.000000,6.000000,0.000000 +15 +0xffebebeb +12.000000 + + + + +Caret +10.000000 +20.592592 +6.000000,3.000000,0.000000 +false + + + + +ScrollRight +26.000000 +22.000000 +250.296295,2.129630,0.000000 +14 +XuiScrollEndRight +3 + + + + +ScrollDown +32.000000 +22.000000 +214.000000,30.000000,0.000000 +12 +XuiScrollEnd +1 + + + + +ScrollUp +32.000000 +22.000000 +214.000000,-22.000000,0.000000 +6 +XuiScrollEndUp + + + + +ScrollLeft +26.000000 +22.000000 +-26.000000,2.425926,0.000000 +11 +XuiScrollEndLeft +2 + + + + +XuiSoundXACT +36.000000 +31.000000 +97.000000,27.000000,0.000000 + + + + +XuiImage1 +250.000000 +25.000000 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + +InitFocus + + + +EndInitFocus + +stop + + + +Background +Stroke.StrokeColor +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Opacity +Fill.FillColor + + +0 +0xff323232 +0xff787878 +0xffafafaf +0.850000 +0xff646464 + + + +0 +0xff323232 +0xff787878 +0xffafafaf +0.850000 +0xff646464 + + + +0 +0xff323232 +0xff787878 +0xffafafaf +0.850000 +0xff646464 + + + +0 +0xffebcc0f +0xffc8c8c8 +0xffebebeb +1.000000 +0xff64719f + + + +Caret +Show + + +0 +false + + + +0 +false + + + +0 +true + + + +0 +true + + + +Border +Stroke.StrokeColor +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Opacity +Fill.FillColor + + +0 +0xff323232 +0xff787878 +0xffafafaf +0.850000 +0xff323232 + + + +0 +0xff323232 +0xff787878 +0xffafafaf +0.850000 +0xff323232 + + + +0 +0xff323232 +0xff787878 +0xffafafaf +0.850000 +0xff323232 + + + +0 +0xffebcc0f +0xffc8c8c8 +0xffebebeb +1.000000 +0xffebcc0f + + + +XuiSoundXACT +SoundBank +WaveBank +Cue + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb +ButtonFocus + + + +0 + + + + + + +0 + + + + + + +0 + + + + + + + + + +XuiEdit +250.000000 +32.000000 + + + +Border +256.000000 +38.000000 +-3.000000,-3.000000,0.000000 +0.850000 +15 + + +0xff323232 + + + + +0xff323232 + + +2 +0xff787878 +0xffafafaf +0.000000 +1.000000 + + +-90.000000 + + +true +4,0.000000,0.000000,0.000000,0.000000,245.000000,0.000000,1,245.000000,0.000000,245.000000,0.000000,245.000000,50.000000,1,245.000000,50.000000,245.000000,50.000000,0.000000,50.000000,1,0.000000,50.000000,0.000000,50.000000,0.000000,0.000000,1, + + + + +Background +250.000000 +32.000000 +0.850000 +15 + + +0xff323232 + + + + +0xff646464 + + +2 +0xff787878 +0xffafafaf +0.000000 +1.000000 + + +-90.000000 + + +true +4,0.000000,0.000000,0.000000,0.000000,245.000000,0.000000,1,245.000000,0.000000,245.000000,0.000000,245.000000,50.000000,1,245.000000,50.000000,245.000000,50.000000,0.000000,50.000000,1,0.000000,50.000000,0.000000,50.000000,0.000000,0.000000,1, + + + + +Text +240.000000 +25.000000 +6.000000,5.000000,0.000000 +15 +0xffebebeb + + + + +Caret +10.000000 +28.000000 +6.000000,2.000000,0.000000 +false + + + + +ScrollRight +26.000000 +22.000000 +250.000000,4.500000,0.000000 +14 +XuiScrollEndRight +3 + + + + +ScrollDown +32.000000 +22.000000 +214.000000,32.000000,0.000000 +12 +XuiScrollEnd +1 + + + + +ScrollUp +32.000000 +22.000000 +214.000000,-22.000000,0.000000 +6 +XuiScrollEndUp + + + + +ScrollLeft +26.000000 +22.000000 +-26.000000,4.500000,0.000000 +11 +XuiScrollEndLeft +2 + + + + +XuiSoundXACT +36.000000 +31.000000 +97.000000,27.000000,0.000000 + + + + +XuiImage1 +255.666672 +38.111111 +-2.666667,-3.111111,0.000000 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + +InitFocus + + + +EndInitFocus + +stop + + + +Background +Stroke.StrokeColor +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Opacity +Fill.FillColor + + +0 +0xff323232 +0xff787878 +0xffafafaf +0.850000 +0xff646464 + + + +0 +0xff323232 +0xff787878 +0xffafafaf +0.850000 +0xff646464 + + + +0 +0xff323232 +0xff787878 +0xffafafaf +0.850000 +0xff646464 + + + +0 +0xffebcc0f +0xffc8c8c8 +0xffebebeb +1.000000 +0xff64719f + + + +Caret +Show + + +0 +false + + + +0 +false + + + +0 +true + + + +0 +true + + + +Border +Stroke.StrokeColor +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Opacity +Fill.FillColor + + +0 +0xff323232 +0xff787878 +0xffafafaf +0.850000 +0xff323232 + + + +0 +0xff323232 +0xff787878 +0xffafafaf +0.850000 +0xff323232 + + + +0 +0xff323232 +0xff787878 +0xffafafaf +0.850000 +0xff323232 + + + +0 +0xffebcc0f +0xffc8c8c8 +0xffebebeb +1.000000 +0xffebcc0f + + + +XuiSoundXACT +SoundBank +WaveBank +Cue + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb +ButtonFocus + + + +0 + + + + + + +0 + + + + + + +0 + + + + + + + + + +XuiScrollEndRight +26.000000 +22.000000 +207 + + + +GlowArrow +26.000000 +22.000000 +0.300000 +15 +false +8 +Graphics\scrollRight.png + + + + +StdArrow +26.000000 +22.000000 +0.800000 +15 +false +8 +Graphics\scrollRight.png + + + + + +Normal + + + +EndNormal + +stop + + +ScrollMore + + + +EndScrollMore + +stop + + +Scrolling + + + +EndScrolling + +gotoandplay +Scrolling + + + +GlowArrow +Opacity + + +1 +0.300000 + + + +0 +0.250000 + + + +0 +1.000000 + + + +1 +0.250000 + + + +StdArrow +Show +Opacity + + +1 +false +0.800000 + + + +1 +true +0.800000 + + + +0 +true +1.000000 + + + +0 +true +0.000000 + + + +0 +true +1.000000 + + + + + + +XuiScrollEndUp +26.000000 +22.000000 +207 +[VisualClass]XuiScrollEnd[/VisualClass] + + + +GlowArrow +26.000000 +22.000000 +0.300000 +15 +false +8 +Graphics\scrollUp.png + + + + +StdArrow +32.000000 +22.000000 +0.800000 +15 +false +8 +Graphics\scrollUp.png +48 + + + + + +Normal + + + +EndNormal + +stop + + +ScrollMore + + + +EndScrollMore + +stop + + +Scrolling + + + +EndScrolling + +gotoandplay +Scrolling + + + +StdArrow +Show +Opacity + + +1 +false +0.800000 + + + +1 +true +0.800000 + + + +0 +true +1.000000 + + + +0 +true +0.000000 + + + +0 +true +1.000000 + + + +GlowArrow +Opacity + + +1 +0.300000 + + + +0 +0.250000 + + + +0 +1.000000 + + + +1 +0.250000 + + + + + + +XuiScrollEndLeft +26.000000 +22.000000 +207 + + + +GlowArrow +26.000000 +22.000000 +0.300000 +15 +false +8 +Graphics\scrollLeft.png + + + + +StdArrow +26.000000 +22.000000 +0.800000 +15 +false +8 +Graphics\scrollLeft.png + + + + + +Normal + + + +EndNormal + +stop + + +ScrollMore + + + +EndScrollMore + +stop + + +Scrolling + + + +EndScrolling + +gotoandplay +Scrolling + + + +GlowArrow +Opacity + + +1 +0.300000 + + + +0 +0.250000 + + + +0 +1.000000 + + + +1 +0.250000 + + + +StdArrow +Show +Opacity + + +1 +false +0.800000 + + + +1 +true +0.800000 + + + +0 +true +1.000000 + + + +0 +true +0.000000 + + + +0 +true +1.000000 + + + + + + +XuiScrollEnd +26.000000 +22.000000 +207 + + + +GlowArrow +32.000000 +22.000000 +0.300000 +15 +false +8 + + + + +StdArrow +32.000000 +22.000000 +0.800000 +15 +false +8 +Graphics\scrollDown.png + + + + + +Normal + + + +EndNormal + +stop + + +ScrollMore + + + +EndScrollMore + +stop + + +Scrolling + + + +EndScrolling + +gotoandplay +Scrolling + + + +GlowArrow +Opacity +ImagePath + + +1 +0.300000 + + + + +0 +0.250000 +scrollDown.png + + + +0 +1.000000 +scrollDown.png + + + +1 +0.250000 +scrollDown.png + + + +StdArrow +Show +Opacity + + +1 +false +0.800000 + + + +1 +true +0.800000 + + + +0 +true +1.000000 + + + +0 +true +0.000000 + + + +0 +true +1.000000 + + + + + + +XuiControl +100.000000 +100.000000 +3.000000,0.000000,0.000000 + + + + +XuiCaret +10.000000 +28.000000 + + + +Caret +10.000000 +2.000000 +0.000000,24.000000,0.000000 + + +0xffebebeb + + +true +4,0.000000,0.000000,0.000000,0.000000,15.000000,0.000000,1,15.000000,0.000000,15.000000,0.000000,15.000000,37.000000,1,15.000000,37.000000,15.000000,37.000000,0.000000,37.000000,1,0.000000,37.000000,0.000000,37.000000,0.000000,0.000000,1, + + + + + +Normal + + + +EndNormal + + + +Focus + + + +EndFocus + + + + +Caret +Show +Fill.FillColor + + +0 +true +0xffebebeb + + + +0 +false +0xff808080 + + + +0 +true +0xffafafaf + + + +0 +true +0xffafafaf + + + +0 +false +0xff808080 + + + +0 +true +0xffafafaf + + + + + + +XuiHtmlControl +50.000000 +50.000000 +15 + + + +HtmlPresenter +50.000000 +50.000000 +15 +true + + + + +ScrollDown +32.000000 +24.000000 +14.000000,56.000000,0.000000 +12 +XuiScrollEnd +1 + + + + +ScrollUp +32.000000 +24.000000 +-16.000000,56.000000,0.000000 +12 +XuiScrollEndUp + + + + + +Normal + + + +EndNormal + +stop + + +ScrollMore + + + +EndScrollMore + +stop + + +Scrolling + + + +EndScrolling + +gotoandplay +Scrolling + + + + + + +XuiCheckbox +270.000000 +32.000000 + + + +text_Button +240.000000 +32.000000 +27.000000,1.000000,0.000000 +5 +0xff323232 +0xff0f0f0f +4112 + + + + +text_Button1 +240.000000 +32.000000 +26.000000,0.000000,0.000000 +5 +false +0xff323232 +0xff0f0f0f +4112 + + + + +TickBox_Norm +24.000000 +24.000000 +2.000000,4.000000,0.000000 +2 +Graphics\Tickbox_Norm.png +48 + + + + +TickBox_Over +24.000000 +24.000000 +2.000000,4.000000,0.000000 +false +2 +Graphics\Tickbox_Over.png +48 + + + + +Tick +28.000000 +24.000000 +2.000000,4.000000,0.000000 +false +Graphics\Tick.png +48 + + + + +XuiSoundXACT +15.000000 +14.000000 +70.000000,21.000000,0.000000 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + +NormalCheck + + + +EndNormalCheck + +stop + + +FocusCheck + + + +EndFocusCheck + +stop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +EndFocusDisable + +stop + + +NormalCheckDisable + + + +EndNormalCheckDisable + +stop + + +FocusCheckDisable + + + +EndFocusCheckDisable + +stop + + +NormalSel + + + +EndNormalSel + +stop + + +NormalSelCheck + + + +EndNormalSelCheck + +stop + + +NormalSelCheckDisable + + + +EndNormalSelCheckDisable + +stop + + +NormalSelDisable + + + +EndNormalSelDisable + +stop + + + +TickBox_Over +Show +Opacity + + +0 +false +1.000000 + + + +0 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +false +1.000000 + + + +0 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +false +0.500000 + + + +0 +false +0.500000 + + + +0 +true +0.500000 + + + +0 +true +0.500000 + + + +0 +false +0.500000 + + + +0 +false +0.500000 + + + +0 +true +0.500000 + + + +0 +true +0.500000 + + + +0 +false +0.500000 + + + +0 +false +0.500000 + + + +Tick +Show +Opacity + + +0 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +0.500000 + + + +0 +true +0.500000 + + + +0 +false +0.500000 + + + +0 +false +0.500000 + + + +TickBox_Norm +Show +Opacity + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +false +1.000000 + + + +0 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +false +1.000000 + + + +0 +false +1.000000 + + + +0 +true +0.500000 + + + +0 +true +0.500000 + + + +0 +false +0.500000 + + + +0 +false +0.500000 + + + +0 +true +0.500000 + + + +0 +true +0.500000 + + + +0 +false +0.500000 + + + +0 +false +0.500000 + + + +0 +true +0.500000 + + + +0 +true +0.500000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +0.500000 + + + +0 +true +0.500000 + + + +text_Button1 +TextColor +Opacity +DropShadowColor +Show + + +1 +0xff323232 +1.000000 +0xff0f0f0f +false + + + +1 +0xffebcc0f +1.000000 +0xff0f0f0f +true + + + +1 +0xff323232 +1.000000 +0xff0f0f0f +false + + + +1 +0xffebcc0f +1.000000 +0xff0f0f0f +true + + + +1 +0xff8c8c8c +0.500000 +0x7f0f0f0f +false + + + +1 +0xffebcc0f +0.500000 +0x7f0f0f0f +true + + + +1 +0xff323232 +0.500000 +0x7e0f0f0f +false + + + +1 +0xffebcc0f +0.500000 +0x7f0f0f0f +true + + + +1 +0xff323232 +1.000000 +0xff0f0f0f +false + + + +1 +0xff323232 +1.000000 +0xff0f0f0f +false + + + +0 +0xff323232 +1.000000 +0x7b0f0f0f +false + + + +0 +0xff8c8c8c +1.000000 +0x7b0f0f0f +false + + + +0 +0xff8c8c8c +1.000000 +0x7b0f0f0f +false + + + +0 +0xff8c8c8c +1.000000 +0x7b0f0f0f +false + + + +XuiSoundXACT +SoundBank +WaveBank +Cue + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb +ButtonFocus + + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb +ButtonFocus + + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + +0 + + + + + + +text_Button +Opacity + + +0 +1.000000 + + + +0 +1.000000 + + + +0 +0.500000 + + + +0 +0.500000 + + + +0 +1.000000 + + + +0 +1.000000 + + + +0 +1.000000 + + + +0 +1.000000 + + + +0 +0.500000 + + + +0 +0.500000 + + + + + + +XuiButton +400.000000 +40.000000 +15 + + + +highlight_graphic +400.000000 +40.000000 +15 +false +Graphics\MainMenuButton_Over.png + + + + +button_graphic +400.000000 +40.000000 +15 +Graphics\MainMenuButton_Norm.png + + + + +text_Label +380.000000 +28.000000 +10.000000,6.000000,0.000000 +15 +0xffebebeb +0xff0f0f0f +16.000000 +21525 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +InitFocusDisableLoop + + + +EndInitFocusDisable + +gotoandplay +InitFocusDisableLoop + + +NormalSelDisable + + + +EndNormalSelDisable + +stop + + + +highlight_graphic +Show +Opacity + + +1 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +false +1.000000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +true +1.000000 + + + +1 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +1 +true +0.250000 + + + +button_graphic +Opacity +Show + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +1 +0.000000 +true + + + +1 +1.000000 +true + + + +1 +1.000000 +false + + + +0 +1.000000 +false + + + +0 +1.000000 +false + + + +1 +1.000000 +false + + + +0 +0.000000 +false + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +1 +0.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +0 +0.000000 +true + + + +1 +1.000000 +true + + + +text_Label +TextColor + + +1 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebeb0f + + + +0 +0xffebeb0f + + + +0 +0xffa0a0a0 + + + +0 +0xffa0a0a0 + + + +0 +0xffebeb0f + + + +0 +0xffebeb0f + + + +0 +0xffebebeb + + + +0 +0xffebeb0f + + + +0 +0xffebeb0f + + + +0 +0xffebebeb + + + +0 +0xffebeb0f + + + +0 +0xffebeb80 + + + +0 +0xffebeb0f + + + +0 +0xffebebeb + + + + + + +XuiVisualImagePresenterCentre +48.000000 +48.000000 + + + +XuiImagePresenter +48.000000 +48.000000 +15 +16 +48 + + + + + +XuiVisImPresenterCentreNoScale +48.000000 +48.000000 + + + +XuiImagePresenter +48.000000 +48.000000 +15 +2 +48 + + + + + +PlayerColourIcon +40.000000 +40.000000 +15 + + + +Icon +40.000000 +40.000000 +15 +true +16 +Graphics\InGameInfo\MapIcon_0.png +48 + + + + + +P0 + +stop + + +P1 + +stop + + +P2 + +stop + + +P3 + +stop + + +P4 + +stop + + +P5 + +stop + + +P6 + +stop + + +P7 + +stop + + +P8 + +stop + + +P9 + +stop + + +P10 + +stop + + +P11 + +stop + + +P12 + +stop + + +P13 + +stop + + +P14 + +stop + + +P15 + +stop + + + +Icon +ImagePath + + +0 +Graphics\InGameInfo\MapIcon_0.png + + + +0 +Graphics\InGameInfo\MapIcon_1.png + + + +0 +Graphics\InGameInfo\MapIcon_2.png + + + +0 +Graphics\InGameInfo\MapIcon_3.png + + + +0 +Graphics\InGameInfo\MapIcon_4.png + + + +0 +Graphics\InGameInfo\MapIcon_5.png + + + +0 +Graphics\InGameInfo\MapIcon_6.png + + + +0 +Graphics\InGameInfo\MapIcon_7.png + + + +0 +Graphics\InGameInfo\MapIcon_8.png + + + +0 +Graphics\InGameInfo\MapIcon_9.png + + + +0 +Graphics\InGameInfo\MapIcon_10.png + + + +0 +Graphics\InGameInfo\MapIcon_11.png + + + +0 +Graphics\InGameInfo\MapIcon_12.png + + + +0 +Graphics\InGameInfo\MapIcon_13.png + + + +0 +Graphics\InGameInfo\MapIcon_14.png + + + +0 +Graphics\InGameInfo\MapIcon_15.png + + + + + + +DLCOffersOfferBackground +460.000000 +196.000000 + + + +XuiIDLCBackground +460.000000 +196.000000 +15 +4 +Graphics\DLCBackground.png + + + + + +ControllerGraphic +400.000000 +270.000000 + + + +Image +400.000000 +270.000000 +Graphics\X360ControllerIcons\360ctrl.png +48 + + + + + +MenuTitleLogo +571.000000 +138.000000 + + + +Logo +571.000000 +138.000000 +15 +16 +Graphics\MenuTitle.png + + + + + +TipPanel +214.000000 +42.000000 + + + +graphic_groupbackground +216.000000 +44.000000 +15 + + + +Bot_R +8.000000 +8.000000 +208.000000,36.000000,0.000000 +12 +Graphics\PanelsAndTabs\PointerTextPanel_BR.png +48 + + + + +Bot_M +200.000000 +8.000000 +8.000000,36.000000,0.000000 +13 +4 +Graphics\PanelsAndTabs\PointerTextPanel_BM.png +48 + + + + +Bot_L +8.000000 +8.000000 +0.000000,36.000000,0.000000 +9 +Graphics\PanelsAndTabs\PointerTextPanel_BL.png +48 + + + + +Top_R +8.000000 +8.000000 +208.000000,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\PointerTextPanel_TR.png +48 + + + + +Top_M +200.000000 +8.000000 +8.000000,0.000000,0.000000 +7 +4 +Graphics\PanelsAndTabs\PointerTextPanel_TM.png +48 + + + + +Top_L +8.000000 +8.000000 +3 +Graphics\PanelsAndTabs\PointerTextPanel_TL.png +48 + + + + +Mid_R +8.000000 +28.000000 +208.000000,8.000000,0.000000 +14 +4 +Graphics\PanelsAndTabs\PointerTextPanel_MR.png +48 + + + + +Mid_M +200.000000 +28.000000 +8.000000,8.000000,0.000000 +15 +4 +Graphics\PanelsAndTabs\PointerTextPanel_MM.png +48 + + + + +Mid_L +8.000000 +28.000000 +0.000000,8.000000,0.000000 +11 +4 +Graphics\PanelsAndTabs\PointerTextPanel_ML.png +48 + + + + + +HtmlPresenter +195.000000 +26.000000 +10.000000,8.000000,0.000000 +15 + + + + + +QuadrantJoinGame +304.000000 +88.000000 +15 + + + +graphic_groupbackground +304.000000 +88.000000 +15 + + + +Bot_R +16.000000 +16.000000 +288.000000,72.001953,0.000000 +12 +Graphics\PanelsAndTabs\Panel_Bot_R.png +48 + + + + +Bot_M +272.000000 +16.000000 +16.000000,72.001953,0.000000 +13 +4 +Graphics\PanelsAndTabs\Panel_Bot_M.png +48 + + + + +Bot_L +16.000000 +16.000000 +0.000000,72.001953,0.000000 +9 +Graphics\PanelsAndTabs\Panel_Bot_L.png +48 + + + + +Top_R +16.000000 +16.000000 +288.000000,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\Panel_Top_R.png +48 + + + + +Top_M +272.000000 +16.000000 +16.000000,0.000000,0.000000 +7 +4 +Graphics\PanelsAndTabs\Panel_Top_M.png +48 + + + + +Top_L +16.000000 +16.000000 +3 +Graphics\PanelsAndTabs\Panel_Top_L.png +48 + + + + +Mid_R +16.000000 +56.000000 +288.000000,16.000000,0.000000 +14 +4 +Graphics\PanelsAndTabs\Panel_Mid_R.png +48 + + + + +Mid_M +272.000000 +56.000000 +16.000000,16.000000,0.000000 +15 +4 +Graphics\PanelsAndTabs\Panel_Mid_M.png +48 + + + + +Mid_L +16.000000 +56.000000 +0.000000,16.000000,0.000000 +11 +4 +Graphics\PanelsAndTabs\Panel_Mid_L.png +48 + + + + +Mid +292.000000 +76.000000 +6.000000,6.000000,0.000000 +15 +4 +Graphics\PanelsAndTabs\Panel_Mid_M.png +48 + + + + +MidDark +292.000000 +76.000000 +6.000000,6.000000,0.000000 +0.400000 +15 + + +0xff0f0f80 + + + + +0xff0f0f0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,127.000000,0.000000,0,127.000000,0.000000,127.000000,0.000000,127.000000,72.000000,0,127.000000,72.000000,127.000000,72.000000,0.000000,72.000000,0,0.000000,72.000000,0.000000,72.000000,0.000000,0.000000,0, + + + + + +QuadrantBox +68.000000 +68.000000 +10.000000,10.000000,0.000000 +1 +Graphics\Controller_Message_Frame_L.png +48 + + + + +text_ButtonText +200.000000 +85.000000,28.000000,0.000000 +5 +0xffffffff +0xff000000 +16.000000 +20753 + + + + +Empty_Quadrants +64.000000 +64.000000 +12.000000,12.000000,0.000000 +0.800000 +16 +Graphics\Controller_Quadrant_Icon_Empty.png +48 + + + + +Quadrant1 +64.000000 +64.000000 +12.000000,12.000000,0.000000 +0.800000 +false +16 +Graphics\Controller_Quadrant_Icon_Segment.png +48 + + + + +Quadrant2 +64.000000 +64.000000 +12.000000,12.000000,0.000000 +-1.000000,1.000000,1.000000 +0.800000 +32.000000,32.000000,0.000000 +false +16 +Graphics\Controller_Quadrant_Icon_Segment.png +48 + + + + +Quadrant3 +64.000000 +64.000000 +12.000000,12.000000,0.000000 +1.000000,-1.000000,1.000000 +0.800000 +32.000000,32.000000,0.000000 +false +16 +Graphics\Controller_Quadrant_Icon_Segment.png +48 + + + + +Quadrant4 +64.000000 +64.000000 +12.000000,12.000000,0.000000 +-1.000000,-1.000000,1.000000 +0.800000 +32.000000,32.000000,0.000000 +false +16 +Graphics\Controller_Quadrant_Icon_Segment.png +48 + + + + + +Normal + + + +EndNormal + +stop + + +StartFlash + + + +EndFlash + +gotoandplay +StartFlash + + + +Empty_Quadrants +Opacity + + +1 +0.800000 + + + +1 +1.000000 + + + +Quadrant1 +Opacity + + +1 +0.800000 + + + +0 +0.000000 + + + +0 +1.000000 + + + +0 +0.000000 + + + +Quadrant2 +Opacity + + +1 +0.800000 + + + +0 +0.000000 + + + +0 +1.000000 + + + +0 +0.000000 + + + +Quadrant3 +Opacity + + +1 +0.800000 + + + +0 +0.000000 + + + +0 +1.000000 + + + +0 +0.000000 + + + +Quadrant4 +Opacity + + +1 +0.800000 + + + +0 +0.000000 + + + +0 +1.000000 + + + +0 +0.000000 + + + + + + +SaveIcon +48.000000 +73.000000 + + + +ProgressBody +48.000000 +73.000000 +15 + + + +Chest +48.000000 +48.000000 +0.000000,25.000000,0.000000 +2 +Graphics\SaveChest.png +48 + + + + +Arrow +48.000000 +48.000000 +Graphics\SaveArrow.png +48 + + + + +Arrow +Position + + +0 +0.000000,0.000000,0.000000 + + + +0 +0.000000,5.000000,0.000000 + + + +0 +0.000000,0.000000,0.000000 + + + + + + + +XuiSliderWrapper +306.000000 +38.000000 +5 + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + + + + +XuiEditSign +250.000000 +32.000000 + + + +Text +240.000000 +6.000000,1.000000,0.000000 +15 +0xff0f0f0f +18.000000 +5136 + + + + +Right +25.000000 +25.000000 +221.000000,2.000000,0.000000 +4 +false +< +0xff0f0f0f +0x800f0f0f +20.000000 +4624 + + + + +Left +25.000000 +25.000000 +4.000000,2.000000,0.000000 +1 +false +> +0xff0f0f0f +0x800f0f0f +20.000000 +4112 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +gotoandplay +Focus + + +InitFocus + + + +EndInitFocus + +gotoandplay +InitFocus + + + +Right +Show + + +0 +false + + + +0 +false + + + +0 +true + + + +0 +false + + + +0 +true + + + +0 +true + + + +0 +false + + + +0 +true + + + +Left +Show + + +0 +false + + + +0 +false + + + +0 +true + + + +0 +false + + + +0 +true + + + +0 +true + + + +0 +false + + + +0 +true + + + + + + +DebugButton +469.000000 +40.000000 +15 + + + +highlight_graphic +469.000000 +40.000000 +15 +false +Graphics\ListButton_Over.png + + + + +button_graphic +469.000000 +40.000000 +15 +Graphics\ListButton_Norm.png + + + + +text_Label +469.000000 +40.000000 +15 +0xffffffff +0xff0f0f0f +20.000000 +21525 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +InitFocusDisableLoop + + + +EndInitFocusDisable + +gotoandplay +InitFocusDisableLoop + + +NormalSelDisable + + + +EndNormalSelDisable + +stop + + + +highlight_graphic +Show +Opacity + + +1 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +false +1.000000 + + + +0 +true +0.000000 + + + +0 +true +0.250000 + + + +0 +true +0.000000 + + + +0 +true +0.250000 + + + +0 +true +1.000000 + + + +1 +true +1.000000 + + + +1 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +0.000000 + + + +0 +true +0.250000 + + + +0 +true +0.000000 + + + +0 +true +0.250000 + + + +1 +false +1.000000 + + + +button_graphic +Opacity +Show + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +1 +0.000000 +true + + + +1 +1.000000 +false + + + +1 +1.000000 +false + + + +0 +1.000000 +false + + + +0 +1.000000 +false + + + +1 +1.000000 +false + + + +0 +0.000000 +false + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +1 +0.000000 +true + + + +1 +1.000000 +false + + + +1 +1.000000 +false + + + + + + +LoadingProgressState +150.000000 +5.000000 + + + +ProgressBody +150.000000 +5.000000 +15 + + + +barStroke +152.000000 +7.000000 +-1.000000,-1.000000,0.000000 +15 +false + + +0xffa0a0a0 + + + + +0xff4b4b4b + + +2 +0xff00eb00 +0xff0f0f0f +0.992157 +0.992157 + + + + +true +4,0.000000,0.000000,0.000000,0.000000,170.000000,0.000000,0,170.000000,0.000000,170.000000,0.000000,170.000000,19.000000,0,170.000000,19.000000,170.000000,19.000000,0.000000,19.000000,0,0.000000,19.000000,0.000000,19.000000,0.000000,0.000000,0, + + + + +back +150.000000 +5.000000 +15 +false + + +0xffa0a0a0 + + + + +0xff828282 + + +2 +0xff00eb00 +0xff0f0f0f +0.992157 +0.992157 + + + + +true +4,0.000000,0.000000,0.000000,0.000000,170.000000,0.000000,0,170.000000,0.000000,170.000000,0.000000,170.000000,19.000000,0,170.000000,19.000000,170.000000,19.000000,0.000000,19.000000,0,0.000000,19.000000,0.000000,19.000000,0.000000,0.000000,0, + + + + +design_time_display +150.000000 +5.000000 +15 +false +true + + +1.000000 +0xff646464 + + + + +2 +0xffffffff + + +2 +0xffebebeb +0xff7d7d7d +0.000000 +0.000000 + + + + +true +4,0.000000,0.000000,0.000000,0.000000,170.000000,0.000000,0,170.000000,0.000000,170.000000,0.000000,170.000000,19.000000,0,170.000000,19.000000,170.000000,19.000000,0.000000,19.000000,0,0.000000,19.000000,0.000000,19.000000,0.000000,0.000000,0, + + + + +bar +150.000000 +5.000000 +15 +false + + +0xff646464 + + + + +0xffffffff + + +2 +0xff00eb00 +0xff0f0f0f +0.992157 +0.992157 + + + + +true +4,0.000000,0.000000,0.000000,0.000000,170.000000,0.000000,0,170.000000,0.000000,170.000000,0.000000,170.000000,19.000000,0,170.000000,19.000000,170.000000,19.000000,0.000000,19.000000,0,0.000000,19.000000,0.000000,19.000000,0.000000,0.000000,0, + + + + +bar +Fill.Gradient.StopPos +Show +Fill.Gradient.StopColor +Stroke.StrokeColor +Fill.Gradient.StopPos +Fill.Gradient.StopColor +Fill.FillColor +Width + + +0 +0.992157 +false +0xff00eb00 +0xff646464 +0.992157 +0xff0f0f0f +0xffffffff +150.000000 + + + +0 +0.372549 +true +0xff808080 +0xffebebeb +0.780392 +0xff80ff80 +0xff0fb90f +0.000000 + + + +0 +0.917647 +true +0xff80ff80 +0xff0f0f0f +0.925490 +0xff808080 +0xff0fb90f +150.000000 + + + +0 +0.015686 +false +0xff0feb13 +0xff646464 +0.992157 +0xff0f0f0f +0xffffffff +150.000000 + + + +back +Show + + +0 +false + + + +0 +true + + + +0 +true + + + +0 +false + + + +barStroke +Show + + +0 +false + + + +0 +true + + + +0 +true + + + +0 +false + + + + + + +control_for_data_binding_only +155.000000 +23.000000 +0.000000,8.185186,0.000000 +13 +0xff323232 +13.000000 +5136 + + + + + +Normal + + + +EndNormal + + + + + + + +XuiLabelAffordableSmall +640.000000 +5 + + + +Text +640.000000 +5 +0xff80eb20 +0xff0f340f +12.000000 +529 + + + + + +XuiLabelExpensiveSmall +640.000000 +5 + + + +Text +640.000000 +15 +0xffeb0f0f +0xff420f0f +12.000000 +529 + + + + + +XuiLabelAffordable +640.000000 +5 + + + +Text +640.000000 +15 +0xff80eb20 +0xff0f340f +18.000000 +529 + + + + + +XuiLabelExpensive +640.000000 +5 + + + +Text +640.000000 +15 +0xffeb0f0f +0xff420f0f +18.000000 +529 + + + + + +LabelLeaderboardTitle +200.000000 + + + +Text +200.000000 +15 +0xffebebeb +0xff0f0f0f +12.000000 +5137 + + + + + +LabelLeaderboardTitleSmall +200.000000 + + + +Text +200.000000 +15 +0xffebebeb +0xff0f0f0f +11.000000 +5120 + + + + + +LabelLeaderboardWaitingText +200.000000 + + + +Text +200.000000 +15 +0xff606060 +0xff0f0f0f +18.000000 +5120 + + + + + +LabelLeaderboardWaitingTextSmall +200.000000 + + + +Text +200.000000 +15 +0xff606060 +0xff0f0f0f +5120 + + + + + +LabelControlsSceneActionSmall +200.000000 + + + +Text +200.000000 +15 +0xffebebeb +0xff0f0f0f +10.000000 +273 + + + + + +LabelControlsSceneAction +200.000000 + + + +Text +200.000000 +15 +0xffebebeb +0xff0f0f0f +273 + + + + + +LabelContainerSceneRightSmall +200.000000 + + + +Text +200.000000 +15 +0xff323232 +12.000000 +528 + + + + + +LabelContainerSceneCentreSmall +200.000000 + + + +Text +200.000000 +15 +0xff323232 +12.000000 +1040 + + + + + +LabelContainerSceneLeftSmall +200.000000 + + + +Text +200.000000 +15 +0xff323232 +12.000000 +272 + + + + + +LabelContainerSceneRight +200.000000 + + + +Text +200.000000 +15 +0xff323232 +18.000000 +528 + + + + + +LabelContainerSceneCentre +200.000000 + + + +Text +200.000000 +15 +0xff323232 +18.000000 +1040 + + + + + +LabelContainerSceneLeft +200.000000 + + + +Text +200.000000 +15 +0xff323232 +18.000000 +272 + + + + + +XuiTitleSmall +400.000000 +50.000000 + + + +Text1 +400.000000 +50.000000 +1.000000,1.000000,0.000000 +15 +0xff0f0f0f +0xff0f0f0f +20.000000 +21505 + + + + +Text2 +400.000000 +50.000000 +-1.000000,1.000000,0.000000 +15 +0xff0f0f0f +20.000000 +21505 + + + + +Text3 +400.000000 +50.000000 +1.000000,-1.000000,0.000000 +15 +0xff0f0f0f +20.000000 +21505 + + + + +Text4 +400.000000 +50.000000 +-1.000000,-1.000000,0.000000 +15 +0xff0f0f0f +20.000000 +21504 + + + + +Text +400.000000 +50.000000 +15 +0xffebebeb +20.000000 +21504 + + + + + +XuiTitle +400.000000 +100.000000 + + + +Text1 +400.000000 +100.000000 +2.000000,2.000000,0.000000 +15 +0xff0f0f0f +0xff0f0f0f +32.000000 +21504 + + + + +Text2 +400.000000 +100.000000 +-2.000000,2.000000,0.000000 +15 +0xff0f0f0f +32.000000 +21504 + + + + +Text3 +400.000000 +100.000000 +2.000000,-2.000000,0.000000 +15 +0xff0f0f0f +32.000000 +21504 + + + + +Text4 +400.000000 +100.000000 +-2.000000,-2.000000,0.000000 +15 +0xff0f0f0f +32.000000 +21504 + + + + +Text5 +400.000000 +100.000000 +2.000000,0.000000,0.000000 +15 +0xff0f0f0f +0xff0f0f0f +32.000000 +21504 + + + + +Text6 +400.000000 +100.000000 +-2.000000,0.000000,0.000000 +15 +0xff0f0f0f +32.000000 +21504 + + + + +Text7 +400.000000 +100.000000 +0.000000,-2.000000,0.000000 +15 +0xff0f0f0f +32.000000 +21504 + + + + +Text8 +400.000000 +100.000000 +0.000000,2.000000,0.000000 +15 +0xff0f0f0f +32.000000 +21504 + + + + +Text +400.000000 +100.000000 +15 +0xffebebeb +32.000000 +21504 + + + + + +XuiLabel +320.000000 +32.000000 + + + +Text +320.000000 +40.000000 +15 +0xffebebeb +12.000000 +16400 + + + + + +XuiLabel12_Shadowed +320.000000 +32.000000 +1.000000,1.000000,0.000000 + + + +Text +320.000000 +40.000000 +1.000000,0.000000,0.000000 +15 +0xffebebeb +12.000000 +20737 + + + + + +XuiLabelLightFaded_C_ShadowedSmall +400.000000 +140.000000 +5.000000,3.000000,0.000000 + + + +XuiTextPresenter1 +400.000000 +140.000000 +15 +0xffcfcfcf +0xff6d6d6d +17425 + + + + + +XuiLabelLight_C_ShadowedSmall +400.000000 +140.000000 +5.000000,3.000000,0.000000 + + + +XuiTextPresenter1 +400.000000 +140.000000 +15 +0xffffffff +0xff000000 +17425 + + + + + +XuiLabelChat +640.000000 +35.000000 + + + +Text +640.000000 +35.000000 +15 +0xffebebeb +0xff0f0f0f +20.000000 +16656 + + + + + +XuiLabelChat_Small +640.000000 +20.000000 +5 + + + +Text +640.000000 +20.000000 +15 +0xffebebeb +0xff0f0f0f +13.000000 +16656 + + + + + +XuiLabelChatBackground +100.000000 +20.000000 +15 + + + +100.000000 +20.000000 +0.500000 +15 + + +0xff0f0f80 + + + + +0xff0f0f0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,979.000000,0.000000,0,979.000000,0.000000,979.000000,0.000000,979.000000,97.000000,0,979.000000,97.000000,979.000000,97.000000,0.000000,97.000000,0,0.000000,97.000000,0.000000,97.000000,0.000000,0.000000,0, + + + + + +XuiLabelListening +640.000000 +20.000000 +15 + + + +Text +640.000000 +35.000000 +15 +0xffebebeb +0xff0f0f0f +20.000000 +17424 + + + + + +XuiLabelListening_Small +640.000000 +20.000000 +5 + + + +Text +640.000000 +20.000000 +15 +0xffebebeb +0xff0f0f0f +13.000000 +17424 + + + + + +XuiLabelLight_FRONT_END_Shd_Wrp_Small +400.000000 +140.000000 + + + +XuiTextPresenter1 +400.000000 +140.000000 +15 +0xffffffff +0xff000000 +16385 + + + + + +XuiLabelLight_FRONT_END_Shd_Wrp +400.000000 +140.000000 + + + +XuiTextPresenter1 +400.000000 +140.000000 +15 +0xffffffff +0xff000000 +18.000000 +16385 + + + + + +XuiLabelLight_ShadowedSmall +400.000000 +140.000000 + + + +XuiTextPresenter1 +400.000000 +140.000000 +15 +0xffffffff +0xff000000 +16401 + + + + + +XuiLabelLight_Shadowed +400.000000 +140.000000 + + + +XuiTextPresenter1 +400.000000 +140.000000 +15 +0xffffffff +0xff000000 +18.000000 +16401 + + + + + +XuiLabelLightFaded_ShadowCentred +400.000000 +140.000000 + + + +XuiTextPresenter1 +400.000000 +140.000000 +15 +0xffcfcfcf +0xff6d6d6d +18.000000 +21521 + + + + + +XuiLabelLight_ShadowCentred +400.000000 +140.000000 + + + +XuiTextPresenter1 +400.000000 +140.000000 +15 +0xffffffff +0xff000000 +18.000000 +21521 + + + + + +XuiLabelLight_ShadowedRight +400.000000 +140.000000 + + + +XuiTextPresenter1 +400.000000 +140.000000 +15 +0xffffffff +0xff000000 +18.000000 +16913 + + + + + +XuiLabelLightCentred +405.000000 +180.000000 + + + +Text +405.000000 +180.000000 +15 +0xffebebeb +17424 + + + + + +XuiLabelDarkCentred +405.000000 +180.000000 + + + +Text +405.000000 +180.000000 +5.000000,0.000000,0.000000 +15 +0xff323232 +17424 + + + + + +XuiLabelDarkLeftWrap +405.000000 +180.000000 + + + +Text +405.000000 +180.000000 +15 +0xff323232 +16640 + + + + + +XuiLabelDarkCentredWrapSmall +405.000000 +180.000000 + + + +Text +405.000000 +180.000000 +15 +0xff323232 +12.000000 +17408 + + + + + +XuiLabelDarkLeftWrapSmall +405.000000 +180.000000 + + + +Text +405.000000 +180.000000 +15 +0xff323232 +12.000000 +16640 + + + + + +XuiLabelDarkSmallRight +405.000000 +180.000000 + + + +Text +405.000000 +180.000000 +15 +0xff323232 +12.000000 +16896 + + + + + +XuiLabelDarkCentredSmall +405.000000 +180.000000 + + + +Text +405.000000 +180.000000 +15 +0xff323232 +12.000000 +5136 + + + + + +XuiLabelDarkSmall +405.000000 +180.000000 + + + +Text +405.000000 +180.000000 +15 +0xff323232 +12.000000 +16384 + + + + + +XuiLabelDark +405.000000 +180.000000 + + + +Text +405.000000 +180.000000 +15 +0xff323232 +16384 + + + + + +XuiLabelDarkRight +405.000000 +180.000000 + + + +Text +405.000000 +180.000000 +15 +0xff323232 +16912 + + + + + +XuiLabelDarkCentredHowtoSmall +404.000000 +180.000000 +1.000000,1.000000,0.000000 + + + +Text +404.000000 +180.000000 +15 +0xff323232 +8.000000 +5136 + + + + + +XuiLabelDark14_1Line +400.000000 +26.000000 + + + +Text +400.000000 +26.000000 +15 +0xff323232 +16400 + + + + + +XuiLabelDarkLeftWrapSmall10 +405.000000 +180.000000 + + + +Text +405.000000 +180.000000 +15 +0xff323232 +10.000000 +16640 + + + + + +XuiLabelDarkLeftWrapSmall8 +405.000000 +180.000000 + + + +Text +405.000000 +180.000000 +15 +0xff323232 +8.000000 +16640 + + + + + +XuiLabelDarkLeftWrap16 +405.000000 +180.000000 + + + +Text +405.000000 +180.000000 +15 +0xff323232 +16.000000 +16640 + + + + + +XuiLabelDarkLeftWrap18 +405.000000 +180.000000 + + + +Text +405.000000 +180.000000 +15 +0xff323232 +18.000000 +16640 + + + + + +XuiLabelDarkCentredWrap +405.000000 +180.000000 + + + +Text +405.000000 +180.000000 +15 +0xff323232 +17408 + + + + + +XuiLabelDesc_LftWrp_Small +640.000000 +20.000000 +5 + + + +Text +640.000000 +20.000000 +15 +0xffebebeb +0xff0f0f0f +13.000000 +16640 + + + + + +XuiLabelDesc_LftWrp +640.000000 +35.000000 + + + +Text +640.000000 +35.000000 +15 +0xffebebeb +0xff0f0f0f +16.000000 +16640 + + + + + +XuiCreditsText_480_S +400.000000 +100.000000 + + + +Text1 +400.000000 +100.000000 +1.000000,1.000000,0.000000 +15 +0xff0f0f0f +0xff0f0f0f +15.000000 +5136 + + + + +Text2 +400.000000 +100.000000 +-1.000000,1.000000,0.000000 +15 +0xff0f0f0f +15.000000 +5136 + + + + +Text3 +400.000000 +100.000000 +1.000000,-1.000000,0.000000 +15 +0xff0f0f0f +15.000000 +5136 + + + + +Text4 +400.000000 +100.000000 +-1.000000,-1.000000,0.000000 +15 +0xff0f0f0f +15.000000 +5136 + + + + +Text +400.000000 +100.000000 +15 +0xffead44d +15.000000 +5136 + + + + + +XuiCreditsText_480_M +400.000000 +100.000000 + + + +Text1 +400.000000 +100.000000 +1.000000,1.000000,0.000000 +15 +0xff0f0f0f +0xff0f0f0f +16.000000 +5136 + + + + +Text2 +400.000000 +100.000000 +-1.000000,1.000000,0.000000 +15 +0xff0f0f0f +16.000000 +5136 + + + + +Text3 +400.000000 +100.000000 +1.000000,-1.000000,0.000000 +15 +0xff0f0f0f +16.000000 +5136 + + + + +Text4 +400.000000 +100.000000 +-1.000000,-1.000000,0.000000 +15 +0xff0f0f0f +16.000000 +5136 + + + + +Text +400.000000 +100.000000 +15 +0xffebebeb +16.000000 +5136 + + + + + +XuiCreditsText_480_14_L +400.000000 +100.000000 + + + +Text1 +400.000000 +100.000000 +1.000000,1.000000,0.000000 +15 +0xff0f0f0f +0xff0f0f0f +5136 + + + + +Text2 +400.000000 +100.000000 +-1.000000,1.000000,0.000000 +15 +0xff0f0f0f +5136 + + + + +Text3 +400.000000 +100.000000 +1.000000,-1.000000,0.000000 +15 +0xff0f0f0f +5136 + + + + +Text4 +400.000000 +100.000000 +-1.000000,-1.000000,0.000000 +15 +0xff0f0f0f +5136 + + + + +Text +400.000000 +100.000000 +15 +0xffebebeb +5136 + + + + + +XuiCreditsText_480_20_XL +400.000000 +100.000000 + + + +Text1 +400.000000 +100.000000 +1.000000,1.000000,0.000000 +15 +0xff0f0f0f +0xff0f0f0f +18.000000 +5136 + + + + +Text2 +400.000000 +100.000000 +-1.000000,1.000000,0.000000 +15 +0xff0f0f0f +18.000000 +5136 + + + + +Text3 +400.000000 +100.000000 +1.000000,-1.000000,0.000000 +15 +0xff0f0f0f +18.000000 +5136 + + + + +Text4 +400.000000 +100.000000 +-1.000000,-1.000000,0.000000 +15 +0xff0f0f0f +18.000000 +5136 + + + + +Text +400.000000 +100.000000 +15 +0xffebebeb +18.000000 +5136 + + + + + +XuiCreditsText_S +400.000000 +100.000000 + + + +Text1 +400.000000 +100.000000 +1.000000,1.000000,0.000000 +15 +0xff0f0f0f +0xff0f0f0f +17.000000 +5136 + + + + +Text2 +400.000000 +100.000000 +-1.000000,1.000000,0.000000 +15 +0xff0f0f0f +17.000000 +5136 + + + + +Text3 +400.000000 +100.000000 +1.000000,-1.000000,0.000000 +15 +0xff0f0f0f +17.000000 +5136 + + + + +Text4 +400.000000 +100.000000 +-1.000000,-1.000000,0.000000 +15 +0xff0f0f0f +17.000000 +5136 + + + + +Text +400.000000 +100.000000 +15 +0xffead44d +17.000000 +5136 + + + + + +XuiCreditsText_M +400.000000 +100.000000 + + + +Text1 +400.000000 +100.000000 +1.000000,1.000000,0.000000 +15 +0xff0f0f0f +0xff0f0f0f +18.000000 +5136 + + + + +Text2 +400.000000 +100.000000 +-1.000000,1.000000,0.000000 +15 +0xff0f0f0f +18.000000 +5136 + + + + +Text3 +400.000000 +100.000000 +1.000000,-1.000000,0.000000 +15 +0xff0f0f0f +18.000000 +5136 + + + + +Text4 +400.000000 +100.000000 +-1.000000,-1.000000,0.000000 +15 +0xff0f0f0f +18.000000 +5136 + + + + +Text +400.000000 +100.000000 +15 +0xffebebeb +18.000000 +5136 + + + + + +XuiCreditsText_L +400.000000 +100.000000 + + + +Text1 +400.000000 +100.000000 +1.000000,1.000000,0.000000 +15 +0xff0f0f0f +0xff0f0f0f +16.000000 +5136 + + + + +Text2 +400.000000 +100.000000 +-1.000000,1.000000,0.000000 +15 +0xff0f0f0f +16.000000 +5136 + + + + +Text3 +400.000000 +100.000000 +1.000000,-1.000000,0.000000 +15 +0xff0f0f0f +16.000000 +5136 + + + + +Text4 +400.000000 +100.000000 +-1.000000,-1.000000,0.000000 +15 +0xff0f0f0f +16.000000 +5136 + + + + +Text +400.000000 +100.000000 +15 +0xffebebeb +16.000000 +5136 + + + + + +XuiCreditsText_XL +400.000000 +100.000000 + + + +Text1 +400.000000 +100.000000 +1.000000,1.000000,0.000000 +15 +0xff0f0f0f +0xff0f0f0f +22.000000 +5136 + + + + +Text2 +400.000000 +100.000000 +-1.000000,1.000000,0.000000 +15 +0xff0f0f0f +22.000000 +5136 + + + + +Text3 +400.000000 +100.000000 +1.000000,-1.000000,0.000000 +15 +0xff0f0f0f +22.000000 +5136 + + + + +Text4 +400.000000 +100.000000 +-1.000000,-1.000000,0.000000 +15 +0xff0f0f0f +22.000000 +5136 + + + + +Text +400.000000 +100.000000 +15 +0xffebebeb +22.000000 +5136 + + + + + +LB_Button +350.000000 +36.000000 + + + +text_ButtonText +300.000000 +36.000000 +52.000000,0.000000,0.000000 +1 +0xffffffff +0xff000000 +16.000000 +20497 + + + + +lb_graphic +49.000000 +45.000000 +0.000000,-3.000000,0.000000 +0.800000 +16 +Graphics\X360ControllerIcons\ButtonLeftBumper_TT.png +48 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +EndFocusDisable + +stop + + +Press + + + +EndPress + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +EndInitFocusDisable + +stop + + + +text_ButtonText +TextColor + + +0 +0xffffffff + + + +0 +0xff606060 + + + +0 +0xff606060 + + + +0 +0xffa0a0a0 + + + +0 +0xffffffff + + + +lb_graphic +Opacity +Scale +Position + + +1 +0.800000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +1 +0.300000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +0 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +0 +1.000000 +0.900000,0.900000,1.000000 +1.500000,1.250000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + + + + +LB_ButtonSmall +350.000000 +25.000000 + + + +text_ButtonText +300.000000 +25.000000 +40.000000,0.000000,0.000000 +1 +0xffffffff +0xff000000 +11.000000 +20497 + + + + +lb_graphic +37.000000 +34.000000 +0.000000,-3.000000,0.000000 +0.800000 +16 +Graphics\X360ControllerIcons\ButtonLeftBumper_TT.png +48 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +EndFocusDisable + +stop + + +Press + + + +EndPress + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +EndInitFocusDisable + +stop + + + +text_ButtonText +TextColor + + +0 +0xffffffff + + + +0 +0xff606060 + + + +0 +0xff606060 + + + +0 +0xffa0a0a0 + + + +0 +0xffffffff + + + +lb_graphic +Opacity +Scale +Position + + +1 +0.800000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +1 +0.300000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +0 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +0 +1.000000 +0.900000,0.900000,1.000000 +1.500000,1.250000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + + + + +RB_Button +350.000000 +36.000000 + + + +text_ButtonText +300.000000 +36.000000 +52.000000,0.000000,0.000000 +1 +0xffffffff +0xff000000 +16.000000 +20497 + + + + +rb_graphic +49.000000 +45.000000 +0.000000,-3.000000,0.000000 +0.800000 +16 +Graphics\X360ControllerIcons\ButtonRightBumper_TT.png +48 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +EndFocusDisable + +stop + + +Press + + + +EndPress + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +EndInitFocusDisable + +stop + + + +text_ButtonText +TextColor + + +0 +0xffffffff + + + +0 +0xff606060 + + + +0 +0xff606060 + + + +0 +0xffa0a0a0 + + + +0 +0xffffffff + + + +rb_graphic +Opacity +Scale +Position + + +1 +0.800000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +1 +0.300000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +0 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +0 +1.000000 +0.900000,0.900000,1.000000 +1.500000,1.250000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + + + + +RB_ButtonSmall +350.000000 +25.000000 + + + +text_ButtonText +300.000000 +25.000000 +40.000000,0.000000,0.000000 +1 +0xffffffff +0xff000000 +11.000000 +20497 + + + + +rb_graphic +37.000000 +34.000000 +0.000000,-3.000000,0.000000 +0.800000 +16 +Graphics\X360ControllerIcons\ButtonRightBumper_TT.png +48 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +EndFocusDisable + +stop + + +Press + + + +EndPress + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +EndInitFocusDisable + +stop + + + +text_ButtonText +TextColor + + +0 +0xffffffff + + + +0 +0xff606060 + + + +0 +0xff606060 + + + +0 +0xffa0a0a0 + + + +0 +0xffffffff + + + +rb_graphic +Opacity +Scale +Position + + +1 +0.800000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +1 +0.300000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +0 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +0 +1.000000 +0.900000,0.900000,1.000000 +1.500000,1.250000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + + + + +Y_Button +350.000000 +36.000000 + + + +graphic_button_disable +33.000000 +33.000000 +false +8 +Graphics\X360ControllerIcons\Legend_Button_Disable.png + + + + +graphic_button_focus +33.000000 +33.000000 +false +8 +Graphics\X360ControllerIcons\Legend_Button_Yello_Focus.png + + + + +graphic_button_normal +33.000000 +33.000000 +8 +Graphics\X360ControllerIcons\Legend_Button_Yello_Normal.png + + + + +text_ButtonText +300.000000 +36.000000 +36.000000,0.000000,0.000000 +1 +0xffffffff +0xff000000 +16.000000 +20497 + + + + +y_graphic +15.000000 +15.000000 +9.460000,9.500000,0.000000 +0.800000 +16 +Graphics\X360ControllerIcons\y_graphic.png + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +EndFocusDisable + +stop + + +Press + + + +EndPress + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +EndInitFocusDisable + +stop + + + +y_graphic +Opacity +Scale +Position + + +1 +0.800000 +1.000000,1.000000,1.000000 +9.460000,9.500000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +9.460000,9.500000,0.000000 + + + +1 +0.300000 +1.000000,1.000000,1.000000 +9.460000,9.500000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +9.460000,9.500000,0.000000 + + + +0 +1.000000 +1.000000,1.000000,1.000000 +9.460000,9.500000,0.000000 + + + +0 +1.000000 +0.900000,0.900000,1.000000 +10.500000,13.250000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +9.460000,9.500000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +9.460000,9.500000,0.000000 + + + +graphic_button_normal +Opacity +Show + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +1 +0.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +1 +0.000000 +true + + + +0 +0.000000 +false + + + +graphic_button_focus +Show +Opacity + + +1 +false +1.000000 + + + +1 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +false +1.000000 + + + +1 +true +1.000000 + + + +0 +false +0.000000 + + + +graphic_button_disable +Show + + +1 +false + + + +1 +true + + + +0 +false + + + +1 +true + + + +text_ButtonText +TextColor + + +0 +0xffffffff + + + +0 +0xff606060 + + + +0 +0xff606060 + + + +0 +0xffa0a0a0 + + + +0 +0xffffffff + + + + + + +Y_ButtonSmall +350.000000 +25.000000 + + + +graphic_button_disable +25.000000 +25.000000 +false +8 +Graphics\X360ControllerIcons\Legend_Button_Disable.png + + + + +graphic_button_focus +25.000000 +25.000000 +false +8 +Graphics\X360ControllerIcons\Legend_Button_Yello_Focus.png + + + + +graphic_button_normal +25.000000 +25.000000 +8 +Graphics\X360ControllerIcons\Legend_Button_Yello_Normal.png + + + + +text_ButtonText +300.000000 +25.000000 +25.000000,0.000000,0.000000 +1 +0xffffffff +0xff000000 +11.000000 +20497 + + + + +y_graphic +11.000000 +11.000000 +7.460000,7.500000,0.000000 +0.800000 +16 +Graphics\X360ControllerIcons\y_graphic.png + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +EndFocusDisable + +stop + + +Press + + + +EndPress + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +EndInitFocusDisable + +stop + + + +y_graphic +Opacity +Scale +Position + + +1 +0.800000 +1.000000,1.000000,1.000000 +7.460000,7.500000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +7.460000,7.500000,0.000000 + + + +1 +0.300000 +1.000000,1.000000,1.000000 +7.460000,7.500000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +7.460000,7.500000,0.000000 + + + +0 +1.000000 +1.000000,1.000000,1.000000 +7.460000,7.500000,0.000000 + + + +0 +1.000000 +0.900000,0.900000,1.000000 +8.500000,11.250000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +7.460000,7.500000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +7.460000,7.500000,0.000000 + + + +graphic_button_normal +Opacity +Show + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +1 +0.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +1 +0.000000 +true + + + +0 +0.000000 +false + + + +graphic_button_focus +Show +Opacity + + +1 +false +1.000000 + + + +1 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +false +1.000000 + + + +1 +true +1.000000 + + + +0 +false +0.000000 + + + +graphic_button_disable +Show + + +1 +false + + + +1 +true + + + +0 +false + + + +1 +true + + + +text_ButtonText +TextColor + + +0 +0xffffffff + + + +0 +0xff606060 + + + +0 +0xff606060 + + + +0 +0xffa0a0a0 + + + +0 +0xffffffff + + + + + + +X_Button +350.000000 +36.000000 + + + +graphic_button_disable +33.000000 +33.000000 +false +8 +Graphics\X360ControllerIcons\Legend_Button_Disable.png + + + + +graphic_button_focus +33.000000 +33.000000 +false +8 +Graphics\X360ControllerIcons\Legend_Button_Blu_Focus.png + + + + +graphic_button_normal +33.000000 +33.000000 +8 +Graphics\X360ControllerIcons\Legend_Button_Blu_Normal.png + + + + +text_ButtonText +300.000000 +36.000000 +36.000000,0.000000,0.000000 +1 +0xffffffff +0xff000000 +16.000000 +20497 + + + + +x_graphic +15.000000 +15.000000 +9.600000,9.500000,0.000000 +0.800000 +16 +Graphics\X360ControllerIcons\x_graphic.png + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +EndFocusDisable + +stop + + +Press + + + +EndPress + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +EndInitFocusDisable + +stop + + + +x_graphic +Opacity +Scale +Position + + +1 +0.800000 +1.000000,1.000000,1.000000 +9.600000,9.500000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +9.600000,9.500000,0.000000 + + + +1 +0.300000 +1.000000,1.000000,1.000000 +9.600000,9.500000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +9.600000,9.500000,0.000000 + + + +0 +1.000000 +1.000000,1.000000,1.000000 +9.600000,9.500000,0.000000 + + + +0 +1.000000 +0.900000,0.900000,1.000000 +10.500000,12.250000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +9.600000,9.500000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +9.600000,9.500000,0.000000 + + + +graphic_button_normal +Opacity +Show + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +1 +0.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +1 +0.000000 +true + + + +0 +0.000000 +false + + + +graphic_button_focus +Show +Opacity + + +1 +false +1.000000 + + + +1 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +false +1.000000 + + + +1 +true +1.000000 + + + +0 +false +0.000000 + + + +graphic_button_disable +Show + + +1 +false + + + +1 +true + + + +1 +false + + + +1 +true + + + +text_ButtonText +TextColor + + +0 +0xffffffff + + + +0 +0xff606060 + + + +0 +0xff606060 + + + +0 +0xffa0a0a0 + + + +0 +0xffffffff + + + + + + +X_ButtonSmall +350.000000 +25.000000 + + + +graphic_button_disable +25.000000 +25.000000 +false +8 +Graphics\X360ControllerIcons\Legend_Button_Disable.png + + + + +graphic_button_focus +25.000000 +25.000000 +false +8 +Graphics\X360ControllerIcons\Legend_Button_Blu_Focus.png + + + + +graphic_button_normal +25.000000 +25.000000 +8 +Graphics\X360ControllerIcons\Legend_Button_Blu_Normal.png + + + + +text_ButtonText +300.000000 +25.000000 +28.000000,0.000000,0.000000 +1 +0xffffffff +0xff000000 +11.000000 +20497 + + + + +x_graphic +11.000000 +11.000000 +7.600000,7.500000,0.000000 +0.800000 +16 +Graphics\X360ControllerIcons\x_graphic.png + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +EndFocusDisable + +stop + + +Press + + + +EndPress + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +EndInitFocusDisable + +stop + + + +x_graphic +Opacity +Scale +Position + + +1 +0.800000 +1.000000,1.000000,1.000000 +7.600000,7.500000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +7.600000,7.500000,0.000000 + + + +1 +0.300000 +1.000000,1.000000,1.000000 +7.600000,7.500000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +7.600000,7.500000,0.000000 + + + +0 +1.000000 +1.000000,1.000000,1.000000 +7.600000,7.500000,0.000000 + + + +0 +1.000000 +0.900000,0.900000,1.000000 +8.500000,10.250000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +7.600000,7.500000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +7.600000,7.500000,0.000000 + + + +graphic_button_normal +Opacity +Show + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +1 +0.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +1 +0.000000 +true + + + +0 +0.000000 +false + + + +graphic_button_focus +Show +Opacity + + +1 +false +1.000000 + + + +1 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +false +1.000000 + + + +1 +true +1.000000 + + + +0 +false +0.000000 + + + +graphic_button_disable +Show + + +1 +false + + + +1 +true + + + +1 +false + + + +1 +true + + + +text_ButtonText +TextColor + + +0 +0xffffffff + + + +0 +0xff606060 + + + +0 +0xff606060 + + + +0 +0xffa0a0a0 + + + +0 +0xffffffff + + + + + + +B_Button +350.000000 +36.000000 + + + +graphic_button_disable +33.000000 +33.000000 +false +8 +Graphics\X360ControllerIcons\Legend_Button_Disable.png + + + + +graphic_button_focus +33.000000 +33.000000 +false +8 +Graphics\X360ControllerIcons\Legend_Button_Red_Focus.png + + + + +graphic_button_normal +33.000000 +33.000000 +8 +Graphics\X360ControllerIcons\Legend_Button_Red_Normal.png + + + + +text_ButtonText +300.000000 +36.000000 +36.000000,0.000000,0.000000 +1 +0xffffffff +0xff000000 +16.000000 +20497 + + + + +B_graphic +15.000000 +15.000000 +9.500000,9.500000,0.000000 +0.800000 +16 +Graphics\X360ControllerIcons\b_graphic.png + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +EndFocusDisable + +stop + + +Press + + + +EndPress + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +EndInitFocus + +stop + + + +B_graphic +Opacity +Scale +Position + + +1 +0.800000 +1.000000,1.000000,1.000000 +9.500000,9.500000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +9.500000,9.500000,0.000000 + + + +1 +0.300000 +1.000000,1.000000,1.000000 +9.500000,9.500000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +9.500000,9.500000,0.000000 + + + +0 +1.000000 +1.000000,1.000000,1.000000 +9.500000,9.500000,0.000000 + + + +0 +1.000000 +0.900000,0.900000,1.000000 +10.500000,12.250000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +9.500000,9.500000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +9.500000,9.500000,0.000000 + + + +graphic_button_normal +Opacity +Show + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +1 +0.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +1 +0.000000 +true + + + +0 +0.000000 +false + + + +graphic_button_focus +Show + + +1 +false + + + +1 +true + + + +0 +true + + + +1 +false + + + +1 +true + + + +1 +false + + + +graphic_button_disable +Show + + +1 +false + + + +1 +true + + + +1 +false + + + +1 +true + + + +text_ButtonText +TextColor + + +0 +0xffffffff + + + +0 +0xff606060 + + + +0 +0xff606060 + + + +0 +0xffa0a0a0 + + + +0 +0xffffffff + + + + + + +B_ButtonSmall +350.000000 +25.000000 + + + +graphic_button_disable +25.000000 +25.000000 +false +8 +Graphics\X360ControllerIcons\Legend_Button_Disable.png + + + + +graphic_button_focus +25.000000 +25.000000 +false +8 +Graphics\X360ControllerIcons\Legend_Button_Red_Focus.png + + + + +graphic_button_normal +25.000000 +25.000000 +8 +Graphics\X360ControllerIcons\Legend_Button_Red_Normal.png + + + + +text_ButtonText +300.000000 +25.000000 +28.000000,0.000000,0.000000 +1 +0xffffffff +0xff000000 +11.000000 +20497 + + + + +B_graphic +11.000000 +11.000000 +7.500000,7.500000,0.000000 +0.800000 +16 +Graphics\X360ControllerIcons\b_graphic.png + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +EndFocusDisable + +stop + + +Press + + + +EndPress + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +EndInitFocus + +stop + + + +B_graphic +Opacity +Scale +Position + + +1 +0.800000 +1.000000,1.000000,1.000000 +7.500000,7.500000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +7.500000,7.500000,0.000000 + + + +1 +0.300000 +1.000000,1.000000,1.000000 +7.500000,7.500000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +7.500000,7.500000,0.000000 + + + +0 +1.000000 +1.000000,1.000000,1.000000 +7.500000,7.500000,0.000000 + + + +0 +1.000000 +0.900000,0.900000,1.000000 +8.500000,10.250000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +7.500000,7.500000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +7.500000,7.500000,0.000000 + + + +graphic_button_normal +Opacity +Show + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +1 +0.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +1 +0.000000 +true + + + +0 +0.000000 +false + + + +graphic_button_focus +Show + + +1 +false + + + +1 +true + + + +0 +true + + + +1 +false + + + +1 +true + + + +1 +false + + + +graphic_button_disable +Show + + +1 +false + + + +1 +true + + + +1 +false + + + +1 +true + + + +text_ButtonText +TextColor + + +0 +0xffffffff + + + +0 +0xff606060 + + + +0 +0xff606060 + + + +0 +0xffa0a0a0 + + + +0 +0xffffffff + + + + + + +A_Button +350.000000 +36.000000 + + + +graphic_button_disable +33.000000 +33.000000 +false +8 +Graphics\X360ControllerIcons\Legend_Button_Disable.png + + + + +graphic_button_focus +33.000000 +33.000000 +false +8 +Graphics\X360ControllerIcons\Legend_Button_Green_Focus.png + + + + +graphic_button_normal +33.000000 +33.000000 +8 +Graphics\X360ControllerIcons\Legend_Button_Green_Normal.png + + + + +text_ButtonText +300.000000 +36.000000 +36.000000,0.000000,0.000000 +1 +0xffffffff +0xff000000 +16.000000 +20497 + + + + +A_graphic +15.000000 +15.000000 +9.500000,9.500000,0.000000 +0.800000 +16 +Graphics\X360ControllerIcons\a_graphic.png + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +EndFocusDisable + +stop + + +Press + + + +EndPress + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +EndInitFocus + +stop + + + +A_graphic +Opacity +Scale +Position + + +1 +0.800000 +1.000000,1.000000,1.000000 +9.500000,9.500000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +9.500000,9.500000,0.000000 + + + +1 +0.300000 +1.000000,1.000000,1.000000 +9.500000,9.500000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +9.500000,9.500000,0.000000 + + + +0 +1.000000 +1.000000,1.000000,1.000000 +9.500000,9.500000,0.000000 + + + +0 +1.000000 +0.900000,0.900000,1.000000 +10.500000,12.250000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +9.500000,9.500000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +9.500000,9.500000,0.000000 + + + +graphic_button_normal +Opacity +Show + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +1 +0.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +1 +0.000000 +true + + + +0 +0.000000 +false + + + +graphic_button_focus +Show + + +1 +false + + + +1 +true + + + +0 +true + + + +1 +false + + + +1 +true + + + +1 +false + + + +graphic_button_disable +Show + + +1 +false + + + +1 +true + + + +1 +false + + + +1 +true + + + +text_ButtonText +TextColor + + +0 +0xffffffff + + + +0 +0xffffffff + + + +0 +0xff606060 + + + +0 +0xff606060 + + + +0 +0xffa0a0a0 + + + +0 +0xffebebeb + + + + + + +A_ButtonSmall +350.000000 +25.000000 + + + +graphic_button_disable +25.000000 +25.000000 +false +8 +Graphics\X360ControllerIcons\Legend_Button_Disable.png + + + + +graphic_button_focus +25.000000 +25.000000 +false +8 +Graphics\X360ControllerIcons\Legend_Button_Green_Focus.png + + + + +graphic_button_normal +25.000000 +25.000000 +8 +Graphics\X360ControllerIcons\Legend_Button_Green_Normal.png + + + + +text_ButtonText +300.000000 +25.000000 +28.000000,0.000000,0.000000 +1 +0xffffffff +0xff000000 +11.000000 +20497 + + + + +A_graphic +11.000000 +11.000000 +7.500000,7.500000,0.000000 +0.800000 +16 +Graphics\X360ControllerIcons\a_graphic.png + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +EndFocusDisable + +stop + + +Press + + + +EndPress + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +EndInitFocus + +stop + + + +A_graphic +Opacity +Scale +Position + + +1 +0.800000 +1.000000,1.000000,1.000000 +7.500000,7.500000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +7.500000,7.500000,0.000000 + + + +1 +0.300000 +1.000000,1.000000,1.000000 +7.500000,7.500000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +7.500000,7.500000,0.000000 + + + +0 +1.000000 +1.000000,1.000000,1.000000 +7.500000,7.500000,0.000000 + + + +0 +1.000000 +0.900000,0.900000,1.000000 +8.500000,10.250000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +7.500000,7.500000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +7.500000,7.500000,0.000000 + + + +graphic_button_normal +Opacity +Show + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +1 +0.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +1 +0.000000 +true + + + +0 +0.000000 +false + + + +graphic_button_focus +Show + + +1 +false + + + +1 +true + + + +0 +true + + + +1 +false + + + +1 +true + + + +1 +false + + + +graphic_button_disable +Show + + +1 +false + + + +1 +true + + + +1 +false + + + +1 +true + + + +text_ButtonText +TextColor + + +0 +0xffffffff + + + +0 +0xffffffff + + + +0 +0xff606060 + + + +0 +0xff606060 + + + +0 +0xffa0a0a0 + + + +0 +0xffebebeb + + + + + + +LTrigger +350.000000 +36.000000 + + + +text_ButtonText +300.000000 +36.000000 +40.000000,0.000000,0.000000 +1 +0xffffffff +0xff000000 +16.000000 +20497 + + + + +lt_graphic +37.000000 +45.000000 +0.000000,-3.000000,0.000000 +0.800000 +16 +Graphics\X360ControllerIcons\ButtonLeftTrigger_TT.png +48 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +EndFocusDisable + +stop + + +Press + + + +EndPress + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +EndInitFocusDisable + +stop + + + +lt_graphic +Opacity +Scale +Position + + +1 +0.800000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +1 +0.300000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +0 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +0 +1.000000 +0.900000,0.900000,1.000000 +1.500000,1.250000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +text_ButtonText +TextColor + + +0 +0xffffffff + + + +0 +0xff606060 + + + +0 +0xff606060 + + + +0 +0xffa0a0a0 + + + +0 +0xffffffff + + + + + + +LTriggerSmall +350.000000 +25.000000 + + + +text_ButtonText +300.000000 +25.000000 +31.000000,0.000000,0.000000 +1 +0xffffffff +0xff000000 +11.000000 +20497 + + + + +lt_graphic +28.000000 +34.000000 +0.000000,-4.000000,0.000000 +0.800000 +16 +Graphics\X360ControllerIcons\ButtonLeftTrigger_TT.png +48 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +EndFocusDisable + +stop + + +Press + + + +EndPress + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +EndInitFocusDisable + +stop + + + +lt_graphic +Opacity +Scale +Position + + +1 +0.800000 +1.000000,1.000000,1.000000 +0.000000,-4.000000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-4.000000,0.000000 + + + +1 +0.300000 +1.000000,1.000000,1.000000 +0.000000,-4.000000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +0.000000,-4.000000,0.000000 + + + +0 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-4.000000,0.000000 + + + +0 +1.000000 +0.900000,0.900000,1.000000 +1.500000,1.250000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-4.000000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +0.000000,-4.000000,0.000000 + + + +text_ButtonText +TextColor + + +0 +0xffffffff + + + +0 +0xff606060 + + + +0 +0xff606060 + + + +0 +0xffa0a0a0 + + + +0 +0xffffffff + + + + + + +LTriggerSmall480 +350.000000 +25.000000 + + + +text_ButtonText +300.000000 +25.000000 +31.000000,0.000000,0.000000 +1 +0xffffffff +0xff000000 +11.000000 +20497 + + + + +lt_graphic +28.000000 +34.000000 +0.000000,-2.000000,0.000000 +0.800000 +16 +Graphics\X360ControllerIcons\ButtonLeftTrigger_TT.png +48 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +EndFocusDisable + +stop + + +Press + + + +EndPress + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +EndInitFocusDisable + +stop + + + +lt_graphic +Opacity +Scale +Position + + +1 +0.800000 +1.000000,1.000000,1.000000 +0.000000,-2.000000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-2.000000,0.000000 + + + +1 +0.300000 +1.000000,1.000000,1.000000 +0.000000,-2.000000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +0.000000,-2.000000,0.000000 + + + +0 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-2.000000,0.000000 + + + +0 +1.000000 +0.900000,0.900000,1.000000 +1.500000,1.250000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-2.000000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +0.000000,-2.000000,0.000000 + + + +text_ButtonText +TextColor + + +0 +0xffffffff + + + +0 +0xff606060 + + + +0 +0xff606060 + + + +0 +0xffa0a0a0 + + + +0 +0xffffffff + + + + + + +RTrigger +350.000000 +36.000000 + + + +text_ButtonText +300.000000 +36.000000 +40.000000,0.000000,0.000000 +1 +0xffffffff +0xff000000 +16.000000 +20497 + + + + +rt_graphic +37.000000 +45.000000 +0.000000,-3.000000,0.000000 +0.800000 +16 +Graphics\X360ControllerIcons\ButtonRightTrigger_TT.png +48 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +EndFocusDisable + +stop + + +Press + + + +EndPress + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +EndInitFocusDisable + +stop + + + +text_ButtonText +TextColor + + +0 +0xffffffff + + + +0 +0xff606060 + + + +0 +0xff606060 + + + +0 +0xffa0a0a0 + + + +0 +0xffffffff + + + +rt_graphic +Opacity +Scale +Position + + +1 +0.800000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +1 +0.300000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +0 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +0 +1.000000 +0.900000,0.900000,1.000000 +1.500000,1.250000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + + + + +RTriggerSmall +350.000000 +25.000000 + + + +text_ButtonText +300.000000 +25.000000 +31.000000,0.000000,0.000000 +1 +0xffffffff +0xff000000 +11.000000 +20497 + + + + +rt_graphic +28.000000 +34.000000 +0.000000,-4.000000,0.000000 +0.800000 +16 +Graphics\X360ControllerIcons\ButtonRightTrigger_TT.png +48 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +EndFocusDisable + +stop + + +Press + + + +EndPress + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +EndInitFocusDisable + +stop + + + +text_ButtonText +TextColor + + +0 +0xffffffff + + + +0 +0xff606060 + + + +0 +0xff606060 + + + +0 +0xffa0a0a0 + + + +0 +0xffffffff + + + +rt_graphic +Opacity +Scale +Position + + +1 +0.800000 +1.000000,1.000000,1.000000 +0.000000,-4.000000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-4.000000,0.000000 + + + +1 +0.300000 +1.000000,1.000000,1.000000 +0.000000,-4.000000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +0.000000,-4.000000,0.000000 + + + +0 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-4.000000,0.000000 + + + +0 +1.000000 +0.900000,0.900000,1.000000 +1.500000,1.250000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-4.000000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +0.000000,-4.000000,0.000000 + + + + + + +RTriggerSmall480 +350.000000 +25.000000 + + + +text_ButtonText +300.000000 +25.000000 +31.000000,0.000000,0.000000 +1 +0xffffffff +0xff000000 +11.000000 +20497 + + + + +rt_graphic +28.000000 +34.000000 +0.000000,-2.000000,0.000000 +0.800000 +16 +Graphics\X360ControllerIcons\ButtonRightTrigger_TT.png +48 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +EndFocusDisable + +stop + + +Press + + + +EndPress + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +EndInitFocusDisable + +stop + + + +text_ButtonText +TextColor + + +0 +0xffffffff + + + +0 +0xff606060 + + + +0 +0xff606060 + + + +0 +0xffa0a0a0 + + + +0 +0xffffffff + + + +rt_graphic +Opacity +Scale +Position + + +1 +0.800000 +1.000000,1.000000,1.000000 +0.000000,-2.000000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-2.000000,0.000000 + + + +1 +0.300000 +1.000000,1.000000,1.000000 +0.000000,-2.000000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +0.000000,-2.000000,0.000000 + + + +0 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-2.000000,0.000000 + + + +0 +1.000000 +0.900000,0.900000,1.000000 +1.500000,1.250000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-2.000000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +0.000000,-2.000000,0.000000 + + + + + + +LStick_Nav +350.000000 +36.000000 + + + +text_ButtonText +300.000000 +36.000000 +61.000000,0.000000,0.000000 +1 +0xffffffff +0xff000000 +16.000000 +20497 + + + + +ls_graphic +58.000000 +48.000000 +0.000000,-5.000000,0.000000 +0.800000 +16 +Graphics\X360ControllerIcons\ButtonLeftStick_Navigate.png +48 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +EndFocusDisable + +stop + + +Press + + + +EndPress + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +EndInitFocusDisable + +stop + + + +text_ButtonText +TextColor + + +0 +0xffffffff + + + +0 +0xff606060 + + + +0 +0xff606060 + + + +0 +0xffa0a0a0 + + + +0 +0xffffffff + + + +ls_graphic +Opacity +Scale +Position + + +1 +0.800000 +1.000000,1.000000,1.000000 +0.000000,-5.000000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-5.000000,0.000000 + + + +1 +0.300000 +1.000000,1.000000,1.000000 +0.000000,-5.000000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +0.000000,-5.000000,0.000000 + + + +0 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-5.000000,0.000000 + + + +0 +1.000000 +0.900000,0.900000,1.000000 +1.500000,-0.750000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-5.000000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + + + + +LStick_NavSmall +350.000000 +25.000000 + + + +text_ButtonText +300.000000 +25.000000 +43.000000,0.000000,0.000000 +1 +0xffffffff +0xff000000 +11.000000 +20497 + + + + +rb_graphic +40.000000 +34.000000 +0.000000,-3.000000,0.000000 +0.800000 +16 +Graphics\X360ControllerIcons\ButtonLeftStick_Navigate.png +48 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +EndFocusDisable + +stop + + +Press + + + +EndPress + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +EndInitFocusDisable + +stop + + + +text_ButtonText +TextColor + + +0 +0xffffffff + + + +0 +0xff606060 + + + +0 +0xff606060 + + + +0 +0xffa0a0a0 + + + +0 +0xffffffff + + + +rb_graphic +Opacity +Scale +Position + + +1 +0.800000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +1 +0.300000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +0 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +0 +1.000000 +0.900000,0.900000,1.000000 +1.500000,1.250000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + + + + +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 +15 + + + +highlight_graphic +40.000000 +40.000000 +15 +false + + +0xffebeb0f + + + + +0xffebeb0f +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,89.000000,0.000000,0,89.000000,0.000000,89.000000,0.000000,89.000000,37.000000,0,89.000000,37.000000,89.000000,37.000000,0.000000,37.000000,0,0.000000,37.000000,0.000000,37.000000,0.000000,0.000000,0, + + + + +highlight_cutout +36.000000 +36.000000 +2.000000,2.000000,0.000000 +15 + + +0xffebeb0f + + + + +0xff8b8b8b +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,89.000000,0.000000,0,89.000000,0.000000,89.000000,0.000000,89.000000,37.000000,0,89.000000,37.000000,89.000000,37.000000,0.000000,37.000000,0,0.000000,37.000000,0.000000,37.000000,0.000000,0.000000,0, + + + + +XuiImagePresenter +36.000000 +36.000000 +2.000000,2.000000,0.000000 +138 +16 +48 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +InitFocusDisableLoop + + + +EndInitFocusDisable + +gotoandplay +InitFocusDisableLoop + + +NormalSelDisable + + + +EndNormalSelDisable + +stop + + + +highlight_graphic +Show +Opacity + + +0 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +0.250000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +0.500000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +0.000000 + + + +0 +true +1.000000 + + + +0 +true +0.250000 + + + +0 +true +1.000000 + + + +0 +true +0.250000 + + + + + + +XuiListTexturePackSmall +440.000000 +75.000000 + + + +graphic_groupbackground +440.000000 +67.000000 +0.000000,14.000000,0.000000 +15 + + + +Bot_R +16.000000 +16.000000 +424.344818,45.001953,0.000000 +12 +Graphics\PanelsAndTabs\Panel_Recess_Bot_R.png +48 + + + + +Bot_M +408.344818 +16.000000 +16.000000,45.001953,0.000000 +13 +4 +Graphics\PanelsAndTabs\Panel_Recess_Bot_M.png +48 + + + + +Bot_L +16.000000 +16.000000 +0.000000,45.001953,0.000000 +9 +Graphics\PanelsAndTabs\Panel_Recess_Bot_L.png +48 + + + + +Top_R +16.000000 +16.000000 +424.344818,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\Panel_Recess_Top_R.png +48 + + + + +Top_M +408.344818 +16.000000 +16.000000,0.000000,0.000000 +7 +4 +Graphics\PanelsAndTabs\Panel_Recess_Top_M.png +48 + + + + +Top_L +16.000000 +16.000000 +3 +Graphics\PanelsAndTabs\Panel_Recess_Top_L.png +48 + + + + +Mid_R +16.000000 +29.001961 +424.344818,16.000000,0.000000 +14 +4 +Graphics\PanelsAndTabs\Panel_Recess_Mid_R.png +48 + + + + +Mid_M +408.344818 +29.001961 +16.000000,16.000000,0.000000 +15 +4 +Graphics\PanelsAndTabs\Panel_Recess_Mid_M.png +48 + + + + +Mid_L +16.000000 +29.001961 +0.000000,16.000000,0.000000 +11 +4 +Graphics\PanelsAndTabs\Panel_Recess_Mid_L.png +48 + + + + + +control_ScrollUp +22.000000 +22.000000 +11.000000,34.000000,0.000000 +33 +XuiScrollEndLeft +2 + + + + +control_ScrollDown +22.000000 +22.000000 +406.000000,34.000000,0.000000 +36 +XuiScrollEndRight +3 + + + + +control_ListItem +40.000000 +40.000000 +35.000000,24.000000,0.000000 +37 +XuiListTexturePackButtonSmall +1 + + + + +Title +400.000000 +20.000000 +2.000019,-6.000000,0.000000 +5 +0xff323232 +0xff0f0f0f +272 + + + + +TitleHighlight +400.000000 +20.000000 +1.000019,-8.000000,0.000000 +5 +0xffebeb0f +0xff0f0f0f +272 + + + + + +KillFocus + + + +EndKillFocus + +stop + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + +TitleHighlight +Opacity + + +0 +1.000000 + + + +0 +0.000000 + + + +0 +0.000000 + + + +0 +0.000000 + + + +0 +0.000000 + + + +0 +1.000000 + + + + + + +XuiListTexturePackButton +60.000000 +15 + + + +highlight_graphic +60.000000 +15 +false + + +0xffebeb0f + + + + +0xffebeb0f +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,89.000000,0.000000,0,89.000000,0.000000,89.000000,0.000000,89.000000,37.000000,0,89.000000,37.000000,89.000000,37.000000,0.000000,37.000000,0,0.000000,37.000000,0.000000,37.000000,0.000000,0.000000,0, + + + + +highlight_cutout +54.000000 +54.000000 +3.000000,3.000000,0.000000 +15 + + +0xffebeb0f + + + + +0xff8b8b8b +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,89.000000,0.000000,0,89.000000,0.000000,89.000000,0.000000,89.000000,37.000000,0,89.000000,37.000000,89.000000,37.000000,0.000000,37.000000,0,0.000000,37.000000,0.000000,37.000000,0.000000,0.000000,0, + + + + +XuiImagePresenter +54.000000 +54.000000 +3.000000,3.000000,0.000000 +138 +16 +48 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +InitFocusDisableLoop + + + +EndInitFocusDisable + +gotoandplay +InitFocusDisableLoop + + +NormalSelDisable + + + +EndNormalSelDisable + +stop + + + +highlight_graphic +Show +Opacity + + +0 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +0.250000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +0.500000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +0.000000 + + + +0 +true +1.000000 + + + +0 +true +0.250000 + + + +0 +true +1.000000 + + + +0 +true +0.250000 + + + + + + +XuiListTexturePack +440.000000 +108.333336 + + + +graphic_groupbackground +440.000000 +92.000000 +0.000000,18.000000,0.000000 +15 + + + +Bot_R +16.000000 +16.000000 +424.344818,70.001953,0.000000 +12 +Graphics\PanelsAndTabs\Panel_Recess_Bot_R.png +48 + + + + +Bot_M +408.344818 +16.000000 +16.000000,70.001953,0.000000 +13 +4 +Graphics\PanelsAndTabs\Panel_Recess_Bot_M.png +48 + + + + +Bot_L +16.000000 +16.000000 +0.000000,70.001953,0.000000 +9 +Graphics\PanelsAndTabs\Panel_Recess_Bot_L.png +48 + + + + +Top_R +16.000000 +16.000000 +424.344818,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\Panel_Recess_Top_R.png +48 + + + + +Top_M +408.344818 +16.000000 +16.000000,0.000000,0.000000 +7 +4 +Graphics\PanelsAndTabs\Panel_Recess_Top_M.png +48 + + + + +Top_L +16.000000 +16.000000 +3 +Graphics\PanelsAndTabs\Panel_Recess_Top_L.png +48 + + + + +Mid_R +16.000000 +54.001961 +424.344818,16.000000,0.000000 +14 +4 +Graphics\PanelsAndTabs\Panel_Recess_Mid_R.png +48 + + + + +Mid_M +408.344818 +54.001961 +16.000000,16.000000,0.000000 +15 +4 +Graphics\PanelsAndTabs\Panel_Recess_Mid_M.png +48 + + + + +Mid_L +16.000000 +54.001961 +0.000000,16.000000,0.000000 +11 +4 +Graphics\PanelsAndTabs\Panel_Recess_Mid_L.png +48 + + + + + +control_ScrollUp +22.000000 +32.000000 +12.000000,49.000000,0.000000 +33 +XuiScrollEndLeft +2 + + + + +control_ScrollDown +22.000000 +32.000000 +406.000000,49.000000,0.000000 +36 +XuiScrollEndRight +3 + + + + +control_ListItem +60.000000 +34.000000,30.000000,0.000000 +37 +XuiListTexturePackButton +1 + + + + +Title +400.000000 +32.000000 +2.000019,-6.000000,0.000000 +5 +0xff323232 +0xff0f0f0f +16.000000 +272 + + + + +TitleHighlight +400.000000 +32.000000 +1.000019,-8.000000,0.000000 +5 +0xffebeb0f +0xff0f0f0f +16.000000 +272 + + + + + +KillFocus + + + +EndKillFocus + +stop + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + +TitleHighlight +Opacity + + +0 +1.000000 + + + +0 +0.000000 + + + +0 +0.000000 + + + +0 +0.000000 + + + +0 +0.000000 + + + +0 +1.000000 + + + + + + +XuiHowToList480 +330.000000 +80.000000 + + + +graphic_groupbackground +330.000000 +80.000000 +15 + + + +Bot_R +16.000000 +16.000000 +314.344818,64.001953,0.000000 +12 +Graphics\PanelsAndTabs\Panel_Bot_R.png +48 + + + + +Bot_M +298.344818 +16.000000 +16.000000,64.001953,0.000000 +13 +4 +Graphics\PanelsAndTabs\Panel_Bot_M.png +48 + + + + +Bot_L +16.000000 +16.000000 +0.000000,64.001953,0.000000 +9 +Graphics\PanelsAndTabs\Panel_Bot_L.png +48 + + + + +Top_R +16.000000 +16.000000 +314.344818,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\Panel_Top_R.png +48 + + + + +Top_M +298.344818 +16.000000 +16.000000,0.000000,0.000000 +7 +4 +Graphics\PanelsAndTabs\Panel_Top_M.png +48 + + + + +Top_L +16.000000 +16.000000 +3 +Graphics\PanelsAndTabs\Panel_Top_L.png +48 + + + + +Mid_R +16.000000 +48.001961 +314.344818,16.000000,0.000000 +14 +4 +Graphics\PanelsAndTabs\Panel_Mid_R.png +48 + + + + +Mid_M +298.344818 +48.001961 +16.000000,16.000000,0.000000 +15 +4 +Graphics\PanelsAndTabs\Panel_Mid_M.png +48 + + + + +Mid_L +16.000000 +48.001961 +0.000000,16.000000,0.000000 +11 +4 +Graphics\PanelsAndTabs\Panel_Mid_L.png +48 + + + + + +control_ScrollUp +32.000000 +22.000000 +249.000000,50.000000,0.000000 +12 +XuiScrollEndUp + + + + +control_ScrollDown +32.000000 +22.000000 +281.000000,50.000000,0.000000 +12 +XuiScrollEnd +1 + + + + +control_ListItem +300.000000 +36.000000 +15.000000,15.000000,0.000000 +5 +XuiMainMenuButton_L_Thin +0.000000,10.000000,0.000000 + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + +graphic_groupbackground +Opacity + + +0 +1.000000 + + + +0 +0.500000 + + + +0 +0.500000 + + + +0 +0.500000 + + + +0 +1.000000 + + + + + + +XuiHowToList +480.000000 +90.000000 + + + +graphic_groupbackground +480.000000 +90.000000 +15 + + + +Bot_R +16.000000 +16.000000 +464.344818,74.001953,0.000000 +12 +Graphics\PanelsAndTabs\Panel_Bot_R.png +48 + + + + +Bot_M +448.344818 +16.000000 +16.000000,74.001953,0.000000 +13 +4 +Graphics\PanelsAndTabs\Panel_Bot_M.png +48 + + + + +Bot_L +16.000000 +16.000000 +0.000000,74.001953,0.000000 +9 +Graphics\PanelsAndTabs\Panel_Bot_L.png +48 + + + + +Top_R +16.000000 +16.000000 +464.344818,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\Panel_Top_R.png +48 + + + + +Top_M +448.344818 +16.000000 +16.000000,0.000000,0.000000 +7 +4 +Graphics\PanelsAndTabs\Panel_Top_M.png +48 + + + + +Top_L +16.000000 +16.000000 +3 +Graphics\PanelsAndTabs\Panel_Top_L.png +48 + + + + +Mid_R +16.000000 +58.001961 +464.344818,16.000000,0.000000 +14 +4 +Graphics\PanelsAndTabs\Panel_Mid_R.png +48 + + + + +Mid_M +448.344818 +58.001961 +16.000000,16.000000,0.000000 +15 +4 +Graphics\PanelsAndTabs\Panel_Mid_M.png +48 + + + + +Mid_L +16.000000 +58.001961 +0.000000,16.000000,0.000000 +11 +4 +Graphics\PanelsAndTabs\Panel_Mid_L.png +48 + + + + + +control_ScrollUp +32.000000 +22.000000 +399.000000,60.000000,0.000000 +12 +XuiScrollEndUp + + + + +control_ScrollDown +32.000000 +22.000000 +431.000000,60.000000,0.000000 +12 +XuiScrollEnd +1 + + + + +control_ListItem +450.000000 +50.000000 +15.000000,15.000000,0.000000 +5 +XuiMainMenuButton_List + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + +graphic_groupbackground +Opacity + + +0 +1.000000 + + + +0 +0.500000 + + + +0 +0.500000 + + + +0 +0.500000 + + + +0 +1.000000 + + + + + + +XuiListRecessed_NoIcon +440.000000 +140.000000 + + + +graphic_groupbackground +440.000000 +134.000000 +15 + + + +Bot_R +16.000000 +16.000000 +424.344818,118.001953,0.000000 +12 +Graphics\PanelsAndTabs\Panel_Recess_Bot_R.png +48 + + + + +Bot_M +408.344818 +16.000000 +16.000000,118.001953,0.000000 +13 +4 +Graphics\PanelsAndTabs\Panel_Recess_Bot_M.png +48 + + + + +Bot_L +16.000000 +16.000000 +0.000000,118.001953,0.000000 +9 +Graphics\PanelsAndTabs\Panel_Recess_Bot_L.png +48 + + + + +Top_R +16.000000 +16.000000 +424.344818,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\Panel_Recess_Top_R.png +48 + + + + +Top_M +408.344818 +16.000000 +16.000000,0.000000,0.000000 +7 +4 +Graphics\PanelsAndTabs\Panel_Recess_Top_M.png +48 + + + + +Top_L +16.000000 +16.000000 +3 +Graphics\PanelsAndTabs\Panel_Recess_Top_L.png +48 + + + + +Mid_R +16.000000 +102.001961 +424.344818,16.000000,0.000000 +14 +4 +Graphics\PanelsAndTabs\Panel_Recess_Mid_R.png +48 + + + + +Mid_M +408.344818 +102.001961 +16.000000,16.000000,0.000000 +15 +4 +Graphics\PanelsAndTabs\Panel_Recess_Mid_M.png +48 + + + + +Mid_L +16.000000 +102.001961 +0.000000,16.000000,0.000000 +11 +4 +Graphics\PanelsAndTabs\Panel_Recess_Mid_L.png +48 + + + + + +control_ScrollUp +32.000000 +22.000000 +355.000000,104.000000,0.000000 +12 +XuiScrollEndUp + + + + +control_ScrollDown +32.000000 +22.000000 +387.000000,104.000000,0.000000 +12 +XuiScrollEnd +1 + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +XuiListButton_L_NoIcon + + + + +XuiImagePresenter +40.000000 +40.000000 +30.000000,52.000000,0.000000 +16 + + + + +Title +400.000000 +20.000019,10.000000,0.000000 +5 +0xff323232 +0xff0f0f0f +16.000000 +1040 + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + +graphic_groupbackground +Opacity + + +0 +1.000000 + + + +0 +0.500000 + + + +0 +0.500000 + + + +0 +0.500000 + + + +0 +1.000000 + + + + + + +XuiListRecessedThin_NoIcon +440.000000 +100.000000 + + + +graphic_groupbackground +440.000000 +100.000000 +15 + + + +Bot_R +16.000000 +16.000000 +424.344818,84.001953,0.000000 +12 +Graphics\PanelsAndTabs\Panel_Recess_Bot_R.png +48 + + + + +Bot_M +408.344818 +16.000000 +16.000000,84.001953,0.000000 +13 +4 +Graphics\PanelsAndTabs\Panel_Recess_Bot_M.png +48 + + + + +Bot_L +16.000000 +16.000000 +0.000000,84.001953,0.000000 +9 +Graphics\PanelsAndTabs\Panel_Recess_Bot_L.png +48 + + + + +Top_R +16.000000 +16.000000 +424.344818,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\Panel_Recess_Top_R.png +48 + + + + +Top_M +408.344818 +16.000000 +16.000000,0.000000,0.000000 +7 +4 +Graphics\PanelsAndTabs\Panel_Recess_Top_M.png +48 + + + + +Top_L +16.000000 +16.000000 +3 +Graphics\PanelsAndTabs\Panel_Recess_Top_L.png +48 + + + + +Mid_R +16.000000 +68.001961 +424.344818,16.000000,0.000000 +14 +4 +Graphics\PanelsAndTabs\Panel_Recess_Mid_R.png +48 + + + + +Mid_M +408.344818 +68.001961 +16.000000,16.000000,0.000000 +15 +4 +Graphics\PanelsAndTabs\Panel_Recess_Mid_M.png +48 + + + + +Mid_L +16.000000 +68.001961 +0.000000,16.000000,0.000000 +11 +4 +Graphics\PanelsAndTabs\Panel_Recess_Mid_L.png +48 + + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +XuiListButton_LThin_NoIcon + + + + +control_ScrollUp +22.000000 +15.000000 +381.000000,76.000000,0.000000 +12 +XuiScrollEndUp + + + + +control_ScrollDown +22.000000 +15.000000 +403.000000,76.000008,0.000000 +12 +XuiScrollEnd +1 + + + + +XuiImagePresenter +22.000000 +22.000000 +30.000000,33.517746,0.000000 +16 + + + + +Title +410.000000 +18.000000 +15.000000,8.000000,0.000000 +5 +0xff323232 +0xff0f0f0f +12.000000 +1040 + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + +graphic_groupbackground +Opacity + + +0 +1.000000 + + + +0 +0.500000 + + + +0 +0.500000 + + + +0 +0.500000 + + + +0 +1.000000 + + + + + + +XuiListRecessed +440.000000 +140.000000 + + + +graphic_groupbackground +440.000000 +134.000000 +15 + + + +Bot_R +16.000000 +16.000000 +424.344818,118.001953,0.000000 +12 +Graphics\PanelsAndTabs\Panel_Recess_Bot_R.png +48 + + + + +Bot_M +408.344818 +16.000000 +16.000000,118.001953,0.000000 +13 +4 +Graphics\PanelsAndTabs\Panel_Recess_Bot_M.png +48 + + + + +Bot_L +16.000000 +16.000000 +0.000000,118.001953,0.000000 +9 +Graphics\PanelsAndTabs\Panel_Recess_Bot_L.png +48 + + + + +Top_R +16.000000 +16.000000 +424.344818,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\Panel_Recess_Top_R.png +48 + + + + +Top_M +408.344818 +16.000000 +16.000000,0.000000,0.000000 +7 +4 +Graphics\PanelsAndTabs\Panel_Recess_Top_M.png +48 + + + + +Top_L +16.000000 +16.000000 +3 +Graphics\PanelsAndTabs\Panel_Recess_Top_L.png +48 + + + + +Mid_R +16.000000 +102.001961 +424.344818,16.000000,0.000000 +14 +4 +Graphics\PanelsAndTabs\Panel_Recess_Mid_R.png +48 + + + + +Mid_M +408.344818 +102.001961 +16.000000,16.000000,0.000000 +15 +4 +Graphics\PanelsAndTabs\Panel_Recess_Mid_M.png +48 + + + + +Mid_L +16.000000 +102.001961 +0.000000,16.000000,0.000000 +11 +4 +Graphics\PanelsAndTabs\Panel_Recess_Mid_L.png +48 + + + + + +control_ScrollUp +32.000000 +22.000000 +355.000000,104.000000,0.000000 +12 +XuiScrollEndUp + + + + +control_ScrollDown +32.000000 +22.000000 +387.000000,104.000000,0.000000 +12 +XuiScrollEnd +1 + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +XuiListButton_L + + + + +XuiImagePresenter +40.000000 +40.000000 +30.000000,52.000000,0.000000 +16 + + + + +Title +400.000000 +20.000019,10.000000,0.000000 +5 +0xff323232 +0xff0f0f0f +16.000000 +1040 + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + +graphic_groupbackground +Opacity + + +0 +1.000000 + + + +0 +0.500000 + + + +0 +0.500000 + + + +0 +0.500000 + + + +0 +1.000000 + + + + + + +XuiListRecessedThin +440.000000 +100.000000 + + + +graphic_groupbackground +440.000000 +100.000000 +15 + + + +Bot_R +16.000000 +16.000000 +424.344818,84.001953,0.000000 +12 +Graphics\PanelsAndTabs\Panel_Recess_Bot_R.png +48 + + + + +Bot_M +408.344818 +16.000000 +16.000000,84.001953,0.000000 +13 +4 +Graphics\PanelsAndTabs\Panel_Recess_Bot_M.png +48 + + + + +Bot_L +16.000000 +16.000000 +0.000000,84.001953,0.000000 +9 +Graphics\PanelsAndTabs\Panel_Recess_Bot_L.png +48 + + + + +Top_R +16.000000 +16.000000 +424.344818,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\Panel_Recess_Top_R.png +48 + + + + +Top_M +408.344818 +16.000000 +16.000000,0.000000,0.000000 +7 +4 +Graphics\PanelsAndTabs\Panel_Recess_Top_M.png +48 + + + + +Top_L +16.000000 +16.000000 +3 +Graphics\PanelsAndTabs\Panel_Recess_Top_L.png +48 + + + + +Mid_R +16.000000 +68.001961 +424.344818,16.000000,0.000000 +14 +4 +Graphics\PanelsAndTabs\Panel_Recess_Mid_R.png +48 + + + + +Mid_M +408.344818 +68.001961 +16.000000,16.000000,0.000000 +15 +4 +Graphics\PanelsAndTabs\Panel_Recess_Mid_M.png +48 + + + + +Mid_L +16.000000 +68.001961 +0.000000,16.000000,0.000000 +11 +4 +Graphics\PanelsAndTabs\Panel_Recess_Mid_L.png +48 + + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +XuiListButton_LThin + + + + +control_ScrollUp +22.000000 +15.000000 +381.000000,76.000000,0.000000 +12 +XuiScrollEndUp + + + + +control_ScrollDown +22.000000 +15.000000 +403.000000,76.000008,0.000000 +12 +XuiScrollEnd +1 + + + + +XuiImagePresenter +22.000000 +22.000000 +30.000000,33.517746,0.000000 +16 + + + + +Title +410.000000 +18.000000 +15.000000,8.000000,0.000000 +5 +0xff323232 +0xff0f0f0f +12.000000 +1040 + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + +graphic_groupbackground +Opacity + + +0 +1.000000 + + + +0 +0.500000 + + + +0 +0.500000 + + + +0 +0.500000 + + + +0 +1.000000 + + + + + + +XuiListRecessedDLCThin +440.000000 +100.000000 + + + +graphic_groupbackground +440.000000 +100.000000 +15 + + + +Bot_R +16.000000 +16.000000 +424.344818,84.001953,0.000000 +12 +Graphics\PanelsAndTabs\Panel_Recess_Bot_R.png +48 + + + + +Bot_M +408.344818 +16.000000 +16.000000,84.001953,0.000000 +13 +4 +Graphics\PanelsAndTabs\Panel_Recess_Bot_M.png +48 + + + + +Bot_L +16.000000 +16.000000 +0.000000,84.001953,0.000000 +9 +Graphics\PanelsAndTabs\Panel_Recess_Bot_L.png +48 + + + + +Top_R +16.000000 +16.000000 +424.344818,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\Panel_Recess_Top_R.png +48 + + + + +Top_M +408.344818 +16.000000 +16.000000,0.000000,0.000000 +7 +4 +Graphics\PanelsAndTabs\Panel_Recess_Top_M.png +48 + + + + +Top_L +16.000000 +16.000000 +3 +Graphics\PanelsAndTabs\Panel_Recess_Top_L.png +48 + + + + +Mid_R +16.000000 +68.001961 +424.344818,16.000000,0.000000 +14 +4 +Graphics\PanelsAndTabs\Panel_Recess_Mid_R.png +48 + + + + +Mid_M +408.344818 +68.001961 +16.000000,16.000000,0.000000 +15 +4 +Graphics\PanelsAndTabs\Panel_Recess_Mid_M.png +48 + + + + +Mid_L +16.000000 +68.001961 +0.000000,16.000000,0.000000 +11 +4 +Graphics\PanelsAndTabs\Panel_Recess_Mid_L.png +48 + + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +XuiListButton_DLC_LThin + + + + +control_ScrollUp +22.000000 +15.000000 +381.000000,76.000000,0.000000 +12 +XuiScrollEndUp + + + + +control_ScrollDown +22.000000 +15.000000 +403.000000,76.000008,0.000000 +12 +XuiScrollEnd +1 + + + + +XuiImagePresenter +22.000000 +22.000000 +30.000000,33.517746,0.000000 +16 + + + + +Title +410.000000 +18.000000 +15.000000,8.000000,0.000000 +5 +0xff323232 +0xff0f0f0f +12.000000 +1040 + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + +graphic_groupbackground +Opacity + + +0 +1.000000 + + + +0 +0.500000 + + + +0 +0.500000 + + + +0 +0.500000 + + + +0 +1.000000 + + + + + + +XuiListRecessedDLC +440.000000 +140.000000 + + + +graphic_groupbackground +440.000000 +134.000000 +15 + + + +Bot_R +16.000000 +16.000000 +424.344818,118.001953,0.000000 +12 +Graphics\PanelsAndTabs\Panel_Recess_Bot_R.png +48 + + + + +Bot_M +408.344818 +16.000000 +16.000000,118.001953,0.000000 +13 +4 +Graphics\PanelsAndTabs\Panel_Recess_Bot_M.png +48 + + + + +Bot_L +16.000000 +16.000000 +0.000000,118.001953,0.000000 +9 +Graphics\PanelsAndTabs\Panel_Recess_Bot_L.png +48 + + + + +Top_R +16.000000 +16.000000 +424.344818,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\Panel_Recess_Top_R.png +48 + + + + +Top_M +408.344818 +16.000000 +16.000000,0.000000,0.000000 +7 +4 +Graphics\PanelsAndTabs\Panel_Recess_Top_M.png +48 + + + + +Top_L +16.000000 +16.000000 +3 +Graphics\PanelsAndTabs\Panel_Recess_Top_L.png +48 + + + + +Mid_R +16.000000 +102.001961 +424.344818,16.000000,0.000000 +14 +4 +Graphics\PanelsAndTabs\Panel_Recess_Mid_R.png +48 + + + + +Mid_M +408.344818 +102.001961 +16.000000,16.000000,0.000000 +15 +4 +Graphics\PanelsAndTabs\Panel_Recess_Mid_M.png +48 + + + + +Mid_L +16.000000 +102.001961 +0.000000,16.000000,0.000000 +11 +4 +Graphics\PanelsAndTabs\Panel_Recess_Mid_L.png +48 + + + + + +control_ScrollUp +32.000000 +22.000000 +355.000000,104.000000,0.000000 +12 +XuiScrollEndUp + + + + +control_ScrollDown +32.000000 +22.000000 +387.000000,104.000000,0.000000 +12 +XuiScrollEnd +1 + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +XuiListButton_DLC_L + + + + +XuiImagePresenter +40.000000 +40.000000 +30.000000,52.000000,0.000000 +16 + + + + +Title +400.000000 +20.000019,10.000000,0.000000 +5 +0xff323232 +0xff0f0f0f +16.000000 +1040 + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + +graphic_groupbackground +Opacity + + +0 +1.000000 + + + +0 +0.500000 + + + +0 +0.500000 + + + +0 +0.500000 + + + +0 +1.000000 + + + + + + +XuiList +440.000000 +140.000000 + + + +graphic_groupbackground +440.000000 +140.000000 +15 + + + +Bot_R +16.000000 +16.000000 +424.344818,124.001953,0.000000 +12 +Graphics\PanelsAndTabs\Panel_Bot_R.png +48 + + + + +Bot_M +408.344818 +16.000000 +16.000000,124.001953,0.000000 +13 +4 +Graphics\PanelsAndTabs\Panel_Bot_M.png +48 + + + + +Bot_L +16.000000 +16.000000 +0.000000,124.001953,0.000000 +9 +Graphics\PanelsAndTabs\Panel_Bot_L.png +48 + + + + +Top_R +16.000000 +16.000000 +424.344818,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\Panel_Top_R.png +48 + + + + +Top_M +408.344818 +16.000000 +16.000000,0.000000,0.000000 +7 +4 +Graphics\PanelsAndTabs\Panel_Top_M.png +48 + + + + +Top_L +16.000000 +16.000000 +3 +Graphics\PanelsAndTabs\Panel_Top_L.png +48 + + + + +Mid_R +16.000000 +108.001961 +424.344818,16.000000,0.000000 +14 +4 +Graphics\PanelsAndTabs\Panel_Mid_R.png +48 + + + + +Mid_M +408.344818 +108.001961 +16.000000,16.000000,0.000000 +15 +4 +Graphics\PanelsAndTabs\Panel_Mid_M.png +48 + + + + +Mid_L +16.000000 +108.001961 +0.000000,16.000000,0.000000 +11 +4 +Graphics\PanelsAndTabs\Panel_Mid_L.png +48 + + + + + +control_ScrollUp +32.000000 +22.000000 +355.000000,110.000000,0.000000 +6 +XuiScrollEndUp + + + + +control_ScrollDown +32.000000 +22.000000 +387.000000,110.000000,0.000000 +12 +XuiScrollEnd +1 + + + + +control_ListItem +400.000000 +60.000000 +20.000000,50.000000,0.000000 +5 +XuiListButton_L + + + + +XuiImagePresenter +40.000000 +40.000000 +30.000000,60.000000,0.000000 +16 + + + + +Title +400.000000 +32.000000 +20.000019,12.000000,0.000000 +5 +0xffebebeb +0xff0f0f0f +18.000000 +1041 + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + +graphic_groupbackground +Opacity + + +0 +1.000000 + + + +0 +0.500000 + + + +0 +0.500000 + + + +0 +0.500000 + + + +0 +1.000000 + + + + + + +XuiListButton_L +400.000000 +60.000000 +15 + + + +highlight_graphic +400.000000 +60.000000 +15 +false +Graphics\ListButton_Over.png + + + + +button_graphic +400.000000 +60.000000 +15 +Graphics\ListButton_Norm.png + + + + +text_Label +320.000000 +28.000000 +66.000000,16.000000,0.000000 +15 +0xffebebeb +0xff0f0f0f +16.000000 +20757 + + + + +XuiImagePresenter +40.000000 +40.000000 +12.000000,10.000000,0.000000 +138 +16 +48 + + + + +XuiSoundXACT +99.000000 +66.000000 +101.000000,14.000000,0.000000 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +InitFocusDisableLoop + + + +EndInitFocusDisable + +gotoandplay +InitFocusDisableLoop + + +NormalSelDisable + + + +EndNormalSelDisable + +stop + + + +highlight_graphic +Show +Opacity + + +1 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +false +1.000000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +true +1.000000 + + + +1 +false +1.000000 + + + +0 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +1 +true +0.250000 + + + +button_graphic +Opacity +Show + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +1 +0.000000 +true + + + +1 +1.000000 +true + + + +1 +1.000000 +false + + + +0 +1.000000 +false + + + +0 +1.000000 +false + + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +1 +0.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +0 +0.000000 +true + + + +1 +1.000000 +true + + + +text_Label +TextColor + + +1 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebeb0f + + + +0 +0xffebeb0f + + + +0 +0xffa0a0a0 + + + +0 +0xffa0a0a0 + + + +0 +0xffebeb0f + + + +0 +0xffebeb0f + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebeb0f + + + +0 +0xffebeb80 + + + +0 +0xffebeb0f + + + +0 +0xffebebeb + + + +XuiSoundXACT +SoundBank +WaveBank +Cue + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + +0 + + + + + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb +ButtonPress + + + +0 + + + + + + + + + +XuiListButton_LThin +400.000000 +36.000000 +15 + + + +highlight_graphic +400.000000 +36.000000 +15 +false +Graphics\ListButton_Over.png + + + + +button_graphic +400.000000 +36.000000 +15 +Graphics\ListButton_Norm.png + + + + +text_Label +346.000000 +28.000000 +46.000000,4.000000,0.000000 +15 +0xffebebeb +0xff0f0f0f +11.000000 +20757 + + + + +XuiImagePresenter +28.000000 +28.000000 +8.000000,4.000000,0.000000 +11 +16 +48 + + + + +XuiSoundXACT +99.000000 +66.000000 +101.000000,14.000000,0.000000 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +InitFocusDisableLoop + + + +EndInitFocusDisable + +gotoandplay +InitFocusDisableLoop + + +NormalSelDisable + + + +EndNormalSelDisable + +stop + + + +highlight_graphic +Show +Opacity + + +1 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +false +1.000000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +true +1.000000 + + + +1 +false +1.000000 + + + +0 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +1 +true +0.250000 + + + +button_graphic +Opacity +Show + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +1 +0.000000 +true + + + +1 +1.000000 +true + + + +1 +1.000000 +false + + + +0 +1.000000 +false + + + +0 +1.000000 +false + + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +1 +0.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +0 +0.000000 +true + + + +1 +1.000000 +true + + + +text_Label +TextColor + + +1 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebeb0f + + + +0 +0xffebeb0f + + + +0 +0xffa0a0a0 + + + +0 +0xffa0a0a0 + + + +0 +0xffebeb0f + + + +0 +0xffebeb0f + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebeb0f + + + +0 +0xffebeb80 + + + +0 +0xffebeb0f + + + +0 +0xffebebeb + + + +XuiSoundXACT +SoundBank +WaveBank +Cue + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + +0 + + + + + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb +ButtonPress + + + +0 + + + + + + + + + +XuiListButton_L_NoIcon +400.000000 +60.000000 +15 + + + +highlight_graphic +400.000000 +60.000000 +15 +false +Graphics\ListButton_Over.png + + + + +button_graphic +400.000000 +60.000000 +15 +Graphics\ListButton_Norm.png + + + + +text_Label +374.000000 +28.000000 +12.000000,16.000000,0.000000 +15 +0xffebebeb +0xff0f0f0f +16.000000 +20757 + + + + +XuiSoundXACT +99.000000 +66.000000 +101.000000,14.000000,0.000000 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +InitFocusDisableLoop + + + +EndInitFocusDisable + +gotoandplay +InitFocusDisableLoop + + +NormalSelDisable + + + +EndNormalSelDisable + +stop + + + +highlight_graphic +Show +Opacity + + +1 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +false +1.000000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +true +1.000000 + + + +1 +false +1.000000 + + + +0 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +1 +true +0.250000 + + + +button_graphic +Opacity +Show + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +1 +0.000000 +true + + + +1 +1.000000 +true + + + +1 +1.000000 +false + + + +0 +1.000000 +false + + + +0 +1.000000 +false + + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +1 +0.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +0 +0.000000 +true + + + +1 +1.000000 +true + + + +text_Label +TextColor + + +1 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebeb0f + + + +0 +0xffebeb0f + + + +0 +0xffa0a0a0 + + + +0 +0xffa0a0a0 + + + +0 +0xffebeb0f + + + +0 +0xffebeb0f + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebeb0f + + + +0 +0xffebeb80 + + + +0 +0xffebeb0f + + + +0 +0xffebebeb + + + +XuiSoundXACT +SoundBank +WaveBank +Cue + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + +0 + + + + + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb +ButtonPress + + + +0 + + + + + + + + + +XuiListButton_LThin_NoIcon +400.000000 +40.000000 +15 + + + +highlight_graphic +400.000000 +40.000000 +15 +false +Graphics\ListButton_Over.png + + + + +button_graphic +400.000000 +40.000000 +15 +Graphics\ListButton_Norm.png + + + + +text_Label +384.000000 +28.000000 +8.000000,6.000000,0.000000 +15 +0xffebebeb +0xff0f0f0f +11.000000 +20757 + + + + +XuiSoundXACT +99.000000 +66.000000 +101.000000,14.000000,0.000000 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +InitFocusDisableLoop + + + +EndInitFocusDisable + +gotoandplay +InitFocusDisableLoop + + +NormalSelDisable + + + +EndNormalSelDisable + +stop + + + +highlight_graphic +Show +Opacity + + +1 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +false +1.000000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +true +1.000000 + + + +1 +false +1.000000 + + + +0 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +1 +true +0.250000 + + + +button_graphic +Opacity +Show + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +1 +0.000000 +true + + + +1 +1.000000 +true + + + +1 +1.000000 +false + + + +0 +1.000000 +false + + + +0 +1.000000 +false + + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +1 +0.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +0 +0.000000 +true + + + +1 +1.000000 +true + + + +text_Label +TextColor + + +1 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebeb0f + + + +0 +0xffebeb0f + + + +0 +0xffa0a0a0 + + + +0 +0xffa0a0a0 + + + +0 +0xffebeb0f + + + +0 +0xffebeb0f + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebeb0f + + + +0 +0xffebeb80 + + + +0 +0xffebeb0f + + + +0 +0xffebebeb + + + +XuiSoundXACT +SoundBank +WaveBank +Cue + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + +0 + + + + + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb +ButtonPress + + + +0 + + + + + + + + + +XuiLayoutListButtonSmall +84.000000 +24.000000 +15 + + + +Border +88.000000 +28.000000 +-2.000000,-2.000000,0.000000 +false + + +0xff0f0f80 + + + + +0xffebeb0f +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,89.000000,0.000000,0,89.000000,0.000000,89.000000,0.000000,89.000000,37.000000,0,89.000000,37.000000,89.000000,37.000000,0.000000,37.000000,0,0.000000,37.000000,0.000000,37.000000,0.000000,0.000000,0, + + + + +highlight_graphic +84.000000 +24.000000 +false +Graphics\LayoutButton_Over.png + + + + +button_graphic +84.000000 +24.000000 +Graphics\LayoutButton_Norm.png + + + + +text_Label +84.000000 +24.000000 +0xffebebeb +0xff0f0f0f +13.000000 +21525 + + + + +XuiSoundXACT +28.000000 +38.000000 +57.000000,17.000000,0.000000 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +EndFocusDisable + +stop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + +InitFocus + + + +EndInitFocus + +stop + + +InitFocusDisable + + + +EndInitFocusDisable + +stop + + +NormalSelDisable + + + +EndNormalSelDisable + +stop + + + +highlight_graphic +Show +Opacity + + +1 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +false +1.000000 + + + +0 +false +0.000000 + + + +0 +false +0.000000 + + + +0 +false +0.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +true +1.000000 + + + +1 +false +0.000000 + + + +0 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +true +1.000000 + + + +1 +true +1.000000 + + + +button_graphic +Opacity +Show + + +1 +1.000000 +true + + + +0 +0.000000 +false + + + +0 +0.000000 +false + + + +1 +1.000000 +true + + + +1 +1.000000 +true + + + +1 +1.000000 +true + + + +1 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.750000 +true + + + +0 +0.000000 +true + + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +1 +1.000000 +false + + + +1 +1.000000 +false + + + +1 +0.500000 +true + + + +0 +0.500000 +true + + + +1 +0.500000 +true + + + +1 +0.500000 +true + + + +text_Label +TextColor +DropShadowColor +Position + + +1 +0xffebebeb +0xff0f0f0f +0.000000,0.000000,0.000000 + + + +0 +0xffebeb0f +0xff0f0f0f +0.000000,0.000000,0.000000 + + + +0 +0xffebeb0f +0xff0f0f0f +0.000000,0.000000,0.000000 + + + +0 +0xffa0a0a0 +0x800f0f0f +0.000000,0.000000,0.000000 + + + +0 +0xffa0a0a0 +0x800f0f0f +0.000000,0.000000,0.000000 + + + +1 +0xffebebeb +0xff0f0f0f +0.000000,0.000000,0.000000 + + + +1 +0xffebebeb +0xff0f0f0f +0.000000,0.000000,0.000000 + + + +0 +0xffebeb0f +0xff0f0f0f +0.000000,0.000000,0.000000 + + + +0 +0xffebebaf +0xff0f0f0f +0.000000,1.000000,0.000000 + + + +0 +0xffebeb0f +0xff0f0f0f +0.000000,0.000000,0.000000 + + + +1 +0xffebebeb +0xff0f0f0f +0.000000,0.000000,0.000000 + + + +1 +0xffebebeb +0xff0f0f0f +0.000000,0.000000,0.000000 + + + +0 +0xffebeb0f +0xff0f0f0f +0.000000,0.000000,0.000000 + + + +0 +0xffebeb0f +0xff0f0f0f +0.000000,0.000000,0.000000 + + + +0 +0xffa0a0a0 +0xff0f0f0f +0.000000,0.000000,0.000000 + + + +1 +0xffa0a0a0 +0x800f0f0f +0.000000,0.000000,0.000000 + + + +0 +0xffa0a0a0 +0x800f0f0f +0.000000,0.000000,0.000000 + + + +0 +0xffa0a0a0 +0x800f0f0f +0.000000,0.000000,0.000000 + + + +XuiSoundXACT +SoundBank +WaveBank +Cue + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb +ButtonPress + + + +0 + + + + + + + + + +XuiLayoutListButton +140.000000 +40.000000 +15 + + + +Border +148.000000 +48.000000 +-4.000000,-4.000000,0.000000 +false + + +0xff0f0f80 + + + + +0xffebeb0f +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,89.000000,0.000000,0,89.000000,0.000000,89.000000,0.000000,89.000000,37.000000,0,89.000000,37.000000,89.000000,37.000000,0.000000,37.000000,0,0.000000,37.000000,0.000000,37.000000,0.000000,0.000000,0, + + + + +highlight_graphic +140.000000 +40.000000 +false +Graphics\LayoutButton_Over.png + + + + +button_graphic +140.000000 +40.000000 +Graphics\LayoutButton_Norm.png + + + + +text_Label +120.000000 +28.000000 +10.000000,6.000000,0.000000 +0xffebebeb +0xff0f0f0f +16.000000 +21525 + + + + +XuiSoundXACT +28.000000 +38.000000 +57.000000,17.000000,0.000000 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +EndFocusDisable + +stop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + +InitFocus + + + +EndInitFocus + +stop + + +InitFocusDisable + + + +EndInitFocusDisable + +stop + + +NormalSelDisable + + + +EndNormalSelDisable + +stop + + + +highlight_graphic +Show +Opacity + + +1 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +false +1.000000 + + + +0 +false +0.000000 + + + +0 +false +0.000000 + + + +0 +false +0.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +true +1.000000 + + + +1 +false +0.000000 + + + +0 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +true +1.000000 + + + +1 +true +1.000000 + + + +button_graphic +Opacity +Show + + +1 +1.000000 +true + + + +0 +0.000000 +false + + + +0 +0.000000 +false + + + +1 +1.000000 +true + + + +1 +1.000000 +true + + + +1 +1.000000 +true + + + +1 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.750000 +true + + + +0 +0.000000 +true + + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +1 +1.000000 +false + + + +1 +1.000000 +false + + + +1 +0.500000 +true + + + +0 +0.500000 +true + + + +1 +0.500000 +true + + + +1 +0.500000 +true + + + +text_Label +TextColor +DropShadowColor +Position + + +1 +0xffebebeb +0xff0f0f0f +10.000000,6.000000,0.000000 + + + +0 +0xffebeb0f +0xff0f0f0f +10.000000,6.000000,0.000000 + + + +0 +0xffebeb0f +0xff0f0f0f +10.000000,6.000000,0.000000 + + + +0 +0xffa0a0a0 +0x800f0f0f +10.000000,6.000000,0.000000 + + + +0 +0xffa0a0a0 +0x800f0f0f +10.000000,6.000000,0.000000 + + + +1 +0xffebebeb +0xff0f0f0f +10.000000,6.000000,0.000000 + + + +1 +0xffebebeb +0xff0f0f0f +10.000000,6.000000,0.000000 + + + +0 +0xffebeb0f +0xff0f0f0f +10.000000,6.000000,0.000000 + + + +0 +0xffebebaf +0xff0f0f0f +11.000000,7.000000,0.000000 + + + +0 +0xffebeb0f +0xff0f0f0f +10.000000,6.000000,0.000000 + + + +1 +0xffebebeb +0xff0f0f0f +10.000000,6.000000,0.000000 + + + +1 +0xffebebeb +0xff0f0f0f +10.000000,6.000000,0.000000 + + + +0 +0xffebeb0f +0xff0f0f0f +10.000000,6.000000,0.000000 + + + +0 +0xffebeb0f +0xff0f0f0f +10.000000,6.000000,0.000000 + + + +0 +0xffa0a0a0 +0xff0f0f0f +10.000000,6.000000,0.000000 + + + +1 +0xffa0a0a0 +0x800f0f0f +10.000000,6.000000,0.000000 + + + +0 +0xffa0a0a0 +0x800f0f0f +10.000000,6.000000,0.000000 + + + +0 +0xffa0a0a0 +0x800f0f0f +10.000000,6.000000,0.000000 + + + +XuiSoundXACT +SoundBank +WaveBank +Cue + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb +ButtonPress + + + +0 + + + + + + + + + +DebugList +500.000000 +80.000000 + + + +graphic_groupbackground +500.000000 +80.000000 +15 + + + +Bot_R +16.000000 +16.000000 +484.344818,64.001953,0.000000 +12 +Graphics\PanelsAndTabs\Panel_Bot_R.png +48 + + + + +Bot_M +468.344818 +16.000000 +16.000000,64.001953,0.000000 +13 +4 +Graphics\PanelsAndTabs\Panel_Bot_M.png +48 + + + + +Bot_L +16.000000 +16.000000 +0.000000,64.001953,0.000000 +9 +Graphics\PanelsAndTabs\Panel_Bot_L.png +48 + + + + +Top_R +16.000000 +16.000000 +484.344818,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\Panel_Top_R.png +48 + + + + +Top_M +468.344818 +16.000000 +16.000000,0.000000,0.000000 +7 +4 +Graphics\PanelsAndTabs\Panel_Top_M.png +48 + + + + +Top_L +16.000000 +16.000000 +3 +Graphics\PanelsAndTabs\Panel_Top_L.png +48 + + + + +Mid_R +16.000000 +48.001961 +484.344818,16.000000,0.000000 +14 +4 +Graphics\PanelsAndTabs\Panel_Mid_R.png +48 + + + + +Mid_M +468.344818 +48.001961 +16.000000,16.000000,0.000000 +15 +4 +Graphics\PanelsAndTabs\Panel_Mid_M.png +48 + + + + +Mid_L +16.000000 +48.001961 +0.000000,16.000000,0.000000 +11 +4 +Graphics\PanelsAndTabs\Panel_Mid_L.png +48 + + + + + +control_ScrollUp +32.000000 +22.000000 +415.000000,52.000000,0.000000 +6 +XuiScrollEndUp + + + + +control_ScrollDown +32.000000 +22.000000 +447.000000,52.000000,0.000000 +12 +XuiScrollEnd +1 + + + + +control_ListItem +469.000000 +40.000000 +10.000000,14.000000,0.000000 +5 +DebugButton + + + + +XuiImagePresenter +85.000000 +68.000000 +41.000000,45.000000,0.000000 + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + +graphic_groupbackground +Opacity + + +0 +1.000000 + + + +0 +0.500000 + + + +0 +0.500000 + + + +0 +0.500000 + + + +0 +1.000000 + + + + + + +XuiMainMenuButton_List +400.000000 +50.000000 +15 + + + +highlight_graphic +400.000000 +40.000000 +15 +false +Graphics\MainMenuButton_Over.png + + + + +button_graphic +400.000000 +40.000000 +15 +Graphics\MainMenuButton_Norm.png + + + + +text_Label +380.000000 +28.000000 +10.000000,6.000000,0.000000 +15 +0xffebebeb +0xff0f0f0f +16.000000 +21525 + + + + +XuiSoundXACT +99.000000 +66.000000 +101.000000,14.000000,0.000000 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +InitFocusDisableLoop + + + +EndInitFocusDisable + +gotoandplay +InitFocusDisableLoop + + +NormalSelDisable + + + +EndNormalSelDisable + +stop + + + +highlight_graphic +Show +Opacity + + +1 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +false +1.000000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +true +1.000000 + + + +1 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +1 +true +0.250000 + + + +button_graphic +Opacity +Show + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +1 +0.000000 +true + + + +1 +1.000000 +true + + + +1 +1.000000 +false + + + +0 +1.000000 +false + + + +0 +1.000000 +false + + + +1 +1.000000 +false + + + +0 +0.000000 +false + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +1 +0.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +0 +0.000000 +true + + + +1 +1.000000 +true + + + +text_Label +TextColor + + +1 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebeb0f + + + +0 +0xffebeb0f + + + +0 +0xffa0a0a0 + + + +0 +0xffa0a0a0 + + + +0 +0xffebeb0f + + + +0 +0xffebeb0f + + + +0 +0xffebebeb + + + +0 +0xffebeb0f + + + +0 +0xffebeb0f + + + +0 +0xffebebeb + + + +0 +0xffebeb0f + + + +0 +0xffebeb80 + + + +0 +0xffebeb0f + + + +0 +0xffebebeb + + + +XuiSoundXACT +SoundBank +WaveBank +Cue + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + +0 + + + + + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb +ButtonPress + + + +0 + + + + + + + + + +XuiLayoutListSmall +366.000000 +88.000000 + + + +graphic_groupbackground +366.000000 +88.000000 +15 + + + +Bot_R +16.000000 +16.000000 +350.344818,72.001953,0.000000 +12 +Graphics\PanelsAndTabs\Panel_Bot_R.png +48 + + + + +Bot_M +334.344818 +16.000000 +16.000000,72.001953,0.000000 +13 +4 +Graphics\PanelsAndTabs\Panel_Bot_M.png +48 + + + + +Bot_L +16.000000 +16.000000 +0.000000,72.001953,0.000000 +9 +Graphics\PanelsAndTabs\Panel_Bot_L.png +48 + + + + +Top_R +16.000000 +16.000000 +350.344818,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\Panel_Top_R.png +48 + + + + +Top_M +334.344818 +16.000000 +16.000000,0.000000,0.000000 +7 +4 +Graphics\PanelsAndTabs\Panel_Top_M.png +48 + + + + +Top_L +16.000000 +16.000000 +3 +Graphics\PanelsAndTabs\Panel_Top_L.png +48 + + + + +Mid_R +16.000000 +56.001953 +350.344818,16.000000,0.000000 +14 +4 +Graphics\PanelsAndTabs\Panel_Mid_R.png +48 + + + + +Mid_M +334.344818 +56.001953 +16.000000,16.000000,0.000000 +15 +4 +Graphics\PanelsAndTabs\Panel_Mid_M.png +48 + + + + +Mid_L +16.000000 +56.001953 +0.000000,16.000000,0.000000 +11 +4 +Graphics\PanelsAndTabs\Panel_Mid_L.png +48 + + + + + +control_ListItem +84.000000 +24.000000 +40.000000,30.000000,0.000000 +5 +XuiLayoutListButtonSmall +1 +84.000000,24.000000,0.000000 +17.000000,0.000000,0.000000 + + + + +Title +348.564850 +21.299248 +20.000000,7.000000,0.000000 +7 +false +0xffebebeb +0xff0f0f0f +18.000000 +1041 + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + + + + +XuiLayoutList +480.000000 +124.000000 + + + +graphic_groupbackground +480.000000 +124.000000 +15 + + + +Bot_R +16.000000 +16.000000 +464.344818,108.001953,0.000000 +12 +Graphics\PanelsAndTabs\Panel_Bot_R.png +48 + + + + +Bot_M +448.344818 +16.000000 +16.000000,108.001953,0.000000 +13 +4 +Graphics\PanelsAndTabs\Panel_Bot_M.png +48 + + + + +Bot_L +16.000000 +16.000000 +0.000000,108.001953,0.000000 +9 +Graphics\PanelsAndTabs\Panel_Bot_L.png +48 + + + + +Top_R +16.000000 +16.000000 +464.344818,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\Panel_Top_R.png +48 + + + + +Top_M +448.344818 +16.000000 +16.000000,0.000000,0.000000 +7 +4 +Graphics\PanelsAndTabs\Panel_Top_M.png +48 + + + + +Top_L +16.000000 +16.000000 +3 +Graphics\PanelsAndTabs\Panel_Top_L.png +48 + + + + +Mid_R +16.000000 +92.001953 +464.344818,16.000000,0.000000 +14 +4 +Graphics\PanelsAndTabs\Panel_Mid_R.png +48 + + + + +Mid_M +448.344818 +92.001953 +16.000000,16.000000,0.000000 +15 +4 +Graphics\PanelsAndTabs\Panel_Mid_M.png +48 + + + + +Mid_L +16.000000 +92.001953 +0.000000,16.000000,0.000000 +11 +4 +Graphics\PanelsAndTabs\Panel_Mid_L.png +48 + + + + + +control_ListItem +140.000000 +40.000000 +20.000000,40.000000,0.000000 +5 +XuiLayoutListButton +1 +140.000000,40.000000,0.000000 +10.000000,0.000000,0.000000 + + + + +Title +440.000031 +32.000000 +20.000000,7.000000,0.000000 +7 +false +0xffebebeb +0xff0f0f0f +18.000000 +1041 + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + + + + +XuiListButton_DLC_LThin +400.000000 +36.000000 +15 + + + +highlight_graphic +400.000000 +36.000000 +15 +false +Graphics\ListButton_Over.png + + + + +button_graphic +400.000000 +36.000000 +15 +Graphics\ListButton_Norm.png + + + + +text_Label +352.000000 +28.000000 +10.000000,4.000000,0.000000 +15 +0xffebebeb +0xff0f0f0f +11.000000 +20757 + + + + +XuiImagePresenter +28.000000 +28.000000 +364.000000,4.000000,0.000000 +14 +16 +48 + + + + +XuiSoundXACT +99.000000 +66.000000 +101.000000,14.000000,0.000000 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +InitFocusDisableLoop + + + +EndInitFocusDisable + +gotoandplay +InitFocusDisableLoop + + +NormalSelDisable + + + +EndNormalSelDisable + +stop + + + +highlight_graphic +Show +Opacity + + +1 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +false +1.000000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +true +1.000000 + + + +1 +false +1.000000 + + + +0 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +1 +true +0.250000 + + + +button_graphic +Opacity +Show + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +1 +0.000000 +true + + + +1 +1.000000 +true + + + +1 +1.000000 +false + + + +0 +1.000000 +false + + + +0 +1.000000 +false + + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +1 +0.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +0 +0.000000 +true + + + +1 +1.000000 +true + + + +text_Label +TextColor + + +1 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebeb0f + + + +0 +0xffebeb0f + + + +0 +0xffa0a0a0 + + + +0 +0xffa0a0a0 + + + +0 +0xffebeb0f + + + +0 +0xffebeb0f + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebeb0f + + + +0 +0xffebeb80 + + + +0 +0xffebeb0f + + + +0 +0xffebebeb + + + +XuiSoundXACT +SoundBank +WaveBank +Cue + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + +0 + + + + + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb +ButtonPress + + + +0 + + + + + + + + + +XuiListButton_DLC_L +400.000000 +60.000000 +15 + + + +highlight_graphic +400.000000 +60.000000 +15 +false +Graphics\ListButton_Over.png + + + + +button_graphic +400.000000 +60.000000 +15 +Graphics\ListButton_Norm.png + + + + +text_Label +330.000000 +28.000000 +16.000000,16.000000,0.000000 +15 +0xffebebeb +0xff0f0f0f +16.000000 +20757 + + + + +XuiImagePresenter +40.000000 +40.000000 +348.000000,10.000000,0.000000 +142 +16 +48 + + + + +XuiSoundXACT +99.000000 +66.000000 +101.000000,14.000000,0.000000 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +InitFocusDisableLoop + + + +EndInitFocusDisable + +gotoandplay +InitFocusDisableLoop + + +NormalSelDisable + + + +EndNormalSelDisable + +stop + + + +highlight_graphic +Show +Opacity + + +1 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +false +1.000000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +true +1.000000 + + + +1 +false +1.000000 + + + +0 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +1 +true +0.250000 + + + +button_graphic +Opacity +Show + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +1 +0.000000 +true + + + +1 +1.000000 +true + + + +1 +1.000000 +false + + + +0 +1.000000 +false + + + +0 +1.000000 +false + + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +1 +0.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +0 +0.000000 +true + + + +1 +1.000000 +true + + + +text_Label +TextColor + + +1 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebeb0f + + + +0 +0xffebeb0f + + + +0 +0xffa0a0a0 + + + +0 +0xffa0a0a0 + + + +0 +0xffebeb0f + + + +0 +0xffebeb0f + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebeb0f + + + +0 +0xffebeb80 + + + +0 +0xffebeb0f + + + +0 +0xffebebeb + + + +XuiSoundXACT +SoundBank +WaveBank +Cue + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + +0 + + + + + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb +ButtonPress + + + +0 + + + + + + + + + +XuiPlayerList_NoIcon +440.000000 +148.000000 + + + +graphic_groupbackground +440.000000 +148.000000 +15 + + + +Bot_R +16.000000 +16.000000 +424.344818,132.001953,0.000000 +12 +Graphics\PanelsAndTabs\Panel_Bot_R.png +48 + + + + +Bot_M +408.344818 +16.000000 +16.000000,132.001953,0.000000 +13 +4 +Graphics\PanelsAndTabs\Panel_Bot_M.png +48 + + + + +Bot_L +16.000000 +16.000000 +0.000000,132.001953,0.000000 +9 +Graphics\PanelsAndTabs\Panel_Bot_L.png +48 + + + + +Top_R +16.000000 +16.000000 +424.344818,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\Panel_Top_R.png +48 + + + + +Top_M +408.344818 +16.000000 +16.000000,0.000000,0.000000 +7 +4 +Graphics\PanelsAndTabs\Panel_Top_M.png +48 + + + + +Top_L +16.000000 +16.000000 +3 +Graphics\PanelsAndTabs\Panel_Top_L.png +48 + + + + +Mid_R +16.000000 +116.001953 +424.344818,16.000000,0.000000 +14 +4 +Graphics\PanelsAndTabs\Panel_Mid_R.png +48 + + + + +Mid_M +408.344818 +116.001953 +16.000000,16.000000,0.000000 +15 +4 +Graphics\PanelsAndTabs\Panel_Mid_M.png +48 + + + + +Mid_L +16.000000 +116.001953 +0.000000,16.000000,0.000000 +11 +4 +Graphics\PanelsAndTabs\Panel_Mid_L.png +48 + + + + + +control_ScrollUp +32.000000 +22.000000 +355.000000,114.000000,0.000000 +12 +XuiScrollEndUp + + + + +control_ScrollDown +32.000000 +22.000000 +387.000000,114.000000,0.000000 +12 +XuiScrollEnd +1 + + + + +control_ListItem +400.000000 +60.000000 +20.000000,46.000000,0.000000 +5 +XuiListButton_L_NoIcon + + + + +XuiImagePresenter +40.000000 +40.000000 +30.000000,55.000000,0.000000 +16 + + + + +Title +400.000000 +20.000019,12.000000,0.000000 +7 +true +0xff323232 +0xff0f0f0f +18.000000 +272 + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + +graphic_groupbackground +Opacity + + +0 +1.000000 + + + +0 +0.500000 + + + +0 +0.500000 + + + +0 +0.500000 + + + +0 +1.000000 + + + + + + +XuiPlayerListSmall_NoIcon +440.000000 +128.000000 + + + +graphic_groupbackground +440.000000 +128.000000 +15 + + + +Bot_R +16.000000 +16.000000 +424.344818,112.001953,0.000000 +12 +Graphics\PanelsAndTabs\Panel_Bot_R.png +48 + + + + +Bot_M +408.344818 +16.000000 +16.000000,112.001953,0.000000 +13 +4 +Graphics\PanelsAndTabs\Panel_Bot_M.png +48 + + + + +Bot_L +16.000000 +16.000000 +0.000000,112.001953,0.000000 +9 +Graphics\PanelsAndTabs\Panel_Bot_L.png +48 + + + + +Top_R +16.000000 +16.000000 +424.344818,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\Panel_Top_R.png +48 + + + + +Top_M +408.344818 +16.000000 +16.000000,0.000000,0.000000 +7 +4 +Graphics\PanelsAndTabs\Panel_Top_M.png +48 + + + + +Top_L +16.000000 +16.000000 +3 +Graphics\PanelsAndTabs\Panel_Top_L.png +48 + + + + +Mid_R +16.000000 +96.001953 +424.344818,16.000000,0.000000 +14 +4 +Graphics\PanelsAndTabs\Panel_Mid_R.png +48 + + + + +Mid_M +408.344818 +96.001953 +16.000000,16.000000,0.000000 +15 +4 +Graphics\PanelsAndTabs\Panel_Mid_M.png +48 + + + + +Mid_L +16.000000 +96.001953 +0.000000,16.000000,0.000000 +11 +4 +Graphics\PanelsAndTabs\Panel_Mid_L.png +48 + + + + + +control_ScrollUp +32.000000 +22.000000 +355.000000,96.000000,0.000000 +12 +XuiScrollEndUp + + + + +control_ScrollDown +32.000000 +22.000000 +387.000000,96.000000,0.000000 +12 +XuiScrollEnd +1 + + + + +control_ListItem +400.000000 +40.000000 +20.000000,42.000000,0.000000 +5 +XuiListButton_LThin_NoIcon + + + + +XuiImagePresenter +32.000000 +32.000000 +30.000000,46.000000,0.000000 +false +16 + + + + +Title +400.000000 +26.000000 +20.000019,12.000000,0.000000 +7 +true +0xff323232 +0xff0f0f0f +16.000000 +272 + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + +graphic_groupbackground +Opacity + + +0 +1.000000 + + + +0 +0.500000 + + + +0 +0.500000 + + + +0 +0.500000 + + + +0 +1.000000 + + + + + + +XuiPlayerListButton_LThin +400.000000 +36.000000 +15 +true + + + +highlight_graphic +400.000000 +36.000000 +15 +false +Graphics\ListButton_Over.png + + + + +button_graphic +400.000000 +36.000000 +15 +Graphics\ListButton_Norm.png + + + + +text_Label +290.000000 +28.000000 +102.000000,4.000000,0.000000 +15 +0xffebebeb +0xff0f0f0f +11.000000 +20757 + + + + +XuiSoundXACT +99.000000 +66.000000 +101.000000,14.000000,0.000000 + + + + +IconGroup +28.000000 +28.000000 +8.000000,4.000000,0.000000 +true + + + +Icon +28.000000 +28.000000 +true +16 +Graphics\InGameInfo\MapIcon_0.png +48 + + + + + +P0 + +stop + + +P1 + +stop + + +P2 + +stop + + +P3 + +stop + + +P4 + +stop + + +P5 + +stop + + +P6 + +stop + + +P7 + +stop + + +P8 + +stop + + +P9 + +stop + + +P10 + +stop + + +P11 + +stop + + +P12 + +stop + + +P13 + +stop + + +P14 + +stop + + +P15 + +stop + + + +Icon +ImagePath + + +0 +Graphics\InGameInfo\MapIcon_0.png + + + +0 +Graphics\InGameInfo\MapIcon_1.png + + + +0 +Graphics\InGameInfo\MapIcon_2.png + + + +0 +Graphics\InGameInfo\MapIcon_3.png + + + +0 +Graphics\InGameInfo\MapIcon_4.png + + + +0 +Graphics\InGameInfo\MapIcon_5.png + + + +0 +Graphics\InGameInfo\MapIcon_6.png + + + +0 +Graphics\InGameInfo\MapIcon_7.png + + + +0 +Graphics\InGameInfo\MapIcon_8.png + + + +0 +Graphics\InGameInfo\MapIcon_9.png + + + +0 +Graphics\InGameInfo\MapIcon_10.png + + + +0 +Graphics\InGameInfo\MapIcon_11.png + + + +0 +Graphics\InGameInfo\MapIcon_12.png + + + +0 +Graphics\InGameInfo\MapIcon_13.png + + + +0 +Graphics\InGameInfo\MapIcon_14.png + + + +0 +Graphics\InGameInfo\MapIcon_15.png + + + + + + +VoiceGroup +28.000000 +28.000000 +36.000000,4.000000,0.000000 +true + + + +Icon +28.000000 +28.000000 +false +16 +48 + + + + + +Normal + +stop + + +Muted + +stop + + +Speaking + +stop + + +NotSpeaking + +stop + + + +Icon +ImagePath +Show + + +0 + +false + + + +0 +Graphics\InGameInfo\voiceMuted.png +true + + + +0 +Graphics\InGameInfo\voiceSpeaking.png +true + + + +0 +Graphics\InGameInfo\voiceNotSpeaking.png +true + + + + + + +OpsGroup +28.000000 +28.000000 +64.000000,4.000000,0.000000 +true + + + +OpsPresenter +28.000000 +28.000000 +0.000008,0.000001,0.000000 +128 +16 +2 +48 + + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +InitFocusDisableLoop + + + +EndInitFocusDisable + +gotoandplay +InitFocusDisableLoop + + +NormalSelDisable + + + +EndNormalSelDisable + +stop + + + +highlight_graphic +Show +Opacity + + +1 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +false +1.000000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +true +1.000000 + + + +1 +false +1.000000 + + + +0 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +1 +true +0.250000 + + + +button_graphic +Opacity +Show + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +1 +0.000000 +true + + + +1 +1.000000 +true + + + +1 +1.000000 +false + + + +0 +1.000000 +false + + + +0 +1.000000 +false + + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +1 +0.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +0 +0.000000 +true + + + +1 +1.000000 +true + + + +text_Label +TextColor + + +1 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebeb0f + + + +0 +0xffebeb0f + + + +0 +0xffa0a0a0 + + + +0 +0xffa0a0a0 + + + +0 +0xffebeb0f + + + +0 +0xffebeb0f + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebeb0f + + + +0 +0xffebeb80 + + + +0 +0xffebeb0f + + + +0 +0xffebebeb + + + +XuiSoundXACT +SoundBank +WaveBank +Cue + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + +0 + + + + + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb +ButtonPress + + + +0 + + + + + + + + + +XuiPlayerListButton_L +400.000000 +60.000000 +15 +true + + + +highlight_graphic +400.000000 +60.000000 +15 +false +Graphics\ListButton_Over.png + + + + +button_graphic +400.000000 +60.000000 +15 +Graphics\ListButton_Norm.png + + + + +text_Label +240.000000 +28.000000 +146.000000,16.000000,0.000000 +15 +0xffebebeb +0xff0f0f0f +16.000000 +20757 + + + + +XuiSoundXACT +99.000000 +66.000000 +101.000000,14.000000,0.000000 + + + + +IconGroup +40.000000 +40.000000 +11.999999,9.999999,0.000000 +true + + + +Icon +40.000000 +40.000000 +true +16 +Graphics\InGameInfo\MapIcon_0.png +48 + + + + + +P0 + +stop + + +P1 + +stop + + +P2 + +stop + + +P3 + +stop + + +P4 + +stop + + +P5 + +stop + + +P6 + +stop + + +P7 + +stop + + +P8 + +stop + + +P9 + +stop + + +P10 + +stop + + +P11 + +stop + + +P12 + +stop + + +P13 + +stop + + +P14 + +stop + + +P15 + +stop + + + +Icon +ImagePath + + +0 +Graphics\InGameInfo\MapIcon_0.png + + + +0 +Graphics\InGameInfo\MapIcon_1.png + + + +0 +Graphics\InGameInfo\MapIcon_2.png + + + +0 +Graphics\InGameInfo\MapIcon_3.png + + + +0 +Graphics\InGameInfo\MapIcon_4.png + + + +0 +Graphics\InGameInfo\MapIcon_5.png + + + +0 +Graphics\InGameInfo\MapIcon_6.png + + + +0 +Graphics\InGameInfo\MapIcon_7.png + + + +0 +Graphics\InGameInfo\MapIcon_8.png + + + +0 +Graphics\InGameInfo\MapIcon_9.png + + + +0 +Graphics\InGameInfo\MapIcon_10.png + + + +0 +Graphics\InGameInfo\MapIcon_11.png + + + +0 +Graphics\InGameInfo\MapIcon_12.png + + + +0 +Graphics\InGameInfo\MapIcon_13.png + + + +0 +Graphics\InGameInfo\MapIcon_14.png + + + +0 +Graphics\InGameInfo\MapIcon_15.png + + + + + + +VoiceGroup +39.999992 +40.000000 +52.000000,9.999999,0.000000 +true + + + +Icon +40.000000 +40.000000 +false +16 +48 + + + + + +Normal + +stop + + +Muted + +stop + + +Speaking + +stop + + +NotSpeaking + +stop + + + +Icon +ImagePath +Show + + +0 + +false + + + +0 +Graphics\InGameInfo\voiceMuted.png +true + + + +0 +Graphics\InGameInfo\voiceSpeaking.png +true + + + +0 +Graphics\InGameInfo\voiceNotSpeaking.png +true + + + + + + +OpsGroup +39.999992 +40.000000 +91.999992,9.999999,0.000000 +true + + + +OpsPresenter +40.000000 +40.000000 +0.000008,0.000001,0.000000 +138 +16 +2 +48 + + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +InitFocusDisableLoop + + + +EndInitFocusDisable + +gotoandplay +InitFocusDisableLoop + + +NormalSelDisable + + + +EndNormalSelDisable + +stop + + + +highlight_graphic +Show +Opacity + + +1 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +false +1.000000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +true +1.000000 + + + +1 +false +1.000000 + + + +0 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +1 +true +0.250000 + + + +button_graphic +Opacity +Show + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +1 +0.000000 +true + + + +1 +1.000000 +true + + + +1 +1.000000 +false + + + +0 +1.000000 +false + + + +0 +1.000000 +false + + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +1 +0.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +0 +0.000000 +true + + + +1 +1.000000 +true + + + +text_Label +TextColor + + +1 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebeb0f + + + +0 +0xffebeb0f + + + +0 +0xffa0a0a0 + + + +0 +0xffa0a0a0 + + + +0 +0xffebeb0f + + + +0 +0xffebeb0f + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebeb0f + + + +0 +0xffebeb80 + + + +0 +0xffebeb0f + + + +0 +0xffebebeb + + + +XuiSoundXACT +SoundBank +WaveBank +Cue + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + +0 + + + + + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb +ButtonPress + + + +0 + + + + + + + + + +XuiPlayerListSmall +440.000000 +128.000000 + + + +graphic_groupbackground +440.000000 +128.000000 +15 + + + +Bot_R +16.000000 +16.000000 +424.344818,112.001953,0.000000 +12 +Graphics\PanelsAndTabs\Panel_Bot_R.png +48 + + + + +Bot_M +408.344818 +16.000000 +16.000000,112.001953,0.000000 +13 +4 +Graphics\PanelsAndTabs\Panel_Bot_M.png +48 + + + + +Bot_L +16.000000 +16.000000 +0.000000,112.001953,0.000000 +9 +Graphics\PanelsAndTabs\Panel_Bot_L.png +48 + + + + +Top_R +16.000000 +16.000000 +424.344818,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\Panel_Top_R.png +48 + + + + +Top_M +408.344818 +16.000000 +16.000000,0.000000,0.000000 +7 +4 +Graphics\PanelsAndTabs\Panel_Top_M.png +48 + + + + +Top_L +16.000000 +16.000000 +3 +Graphics\PanelsAndTabs\Panel_Top_L.png +48 + + + + +Mid_R +16.000000 +96.001953 +424.344818,16.000000,0.000000 +14 +4 +Graphics\PanelsAndTabs\Panel_Mid_R.png +48 + + + + +Mid_M +408.344818 +96.001953 +16.000000,16.000000,0.000000 +15 +4 +Graphics\PanelsAndTabs\Panel_Mid_M.png +48 + + + + +Mid_L +16.000000 +96.001953 +0.000000,16.000000,0.000000 +11 +4 +Graphics\PanelsAndTabs\Panel_Mid_L.png +48 + + + + + +control_ScrollUp +32.000000 +22.000000 +355.000000,96.000000,0.000000 +12 +XuiScrollEndUp + + + + +control_ScrollDown +32.000000 +22.000000 +387.000000,96.000000,0.000000 +12 +XuiScrollEnd +1 + + + + +control_ListItem +400.000000 +40.000000 +20.000000,42.000000,0.000000 +5 +XuiPlayerListButton_LThin + + + + +Title +400.000000 +26.000000 +20.000019,12.000000,0.000000 +7 +true +0xff323232 +0xff0f0f0f +16.000000 +272 + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + +graphic_groupbackground +Opacity + + +0 +1.000000 + + + +0 +0.500000 + + + +0 +0.500000 + + + +0 +0.500000 + + + +0 +1.000000 + + + + + + +XuiPlayerList +440.000000 +148.000000 + + + +graphic_groupbackground +440.000000 +148.000000 +15 + + + +Bot_R +16.000000 +16.000000 +424.344818,132.001953,0.000000 +12 +Graphics\PanelsAndTabs\Panel_Bot_R.png +48 + + + + +Bot_M +408.344818 +16.000000 +16.000000,132.001953,0.000000 +13 +4 +Graphics\PanelsAndTabs\Panel_Bot_M.png +48 + + + + +Bot_L +16.000000 +16.000000 +0.000000,132.001953,0.000000 +9 +Graphics\PanelsAndTabs\Panel_Bot_L.png +48 + + + + +Top_R +16.000000 +16.000000 +424.344818,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\Panel_Top_R.png +48 + + + + +Top_M +408.344818 +16.000000 +16.000000,0.000000,0.000000 +7 +4 +Graphics\PanelsAndTabs\Panel_Top_M.png +48 + + + + +Top_L +16.000000 +16.000000 +3 +Graphics\PanelsAndTabs\Panel_Top_L.png +48 + + + + +Mid_R +16.000000 +116.001953 +424.344818,16.000000,0.000000 +14 +4 +Graphics\PanelsAndTabs\Panel_Mid_R.png +48 + + + + +Mid_M +408.344818 +116.001953 +16.000000,16.000000,0.000000 +15 +4 +Graphics\PanelsAndTabs\Panel_Mid_M.png +48 + + + + +Mid_L +16.000000 +116.001953 +0.000000,16.000000,0.000000 +11 +4 +Graphics\PanelsAndTabs\Panel_Mid_L.png +48 + + + + + +control_ScrollUp +32.000000 +22.000000 +355.000000,114.000000,0.000000 +12 +XuiScrollEndUp + + + + +control_ScrollDown +32.000000 +22.000000 +387.000000,114.000000,0.000000 +12 +XuiScrollEnd +1 + + + + +control_ListItem +400.000000 +60.000000 +20.000000,46.000000,0.000000 +5 +XuiPlayerListButton_L + + + + +Title +400.000000 +20.000019,12.000000,0.000000 +7 +true +0xff323232 +0xff0f0f0f +18.000000 +272 + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + +graphic_groupbackground +Opacity + + +0 +1.000000 + + + +0 +0.500000 + + + +0 +0.500000 + + + +0 +0.500000 + + + +0 +1.000000 + + + + + + +XuiLeaderboardEntry +940.000000 +44.000000 +15 + + + +button_graphic +940.000000 +40.000000 +15 +Graphics\LeaderboardButton_Norm.png + + + + +highlight_graphic +940.000000 +40.000000 +15 +false +Graphics\LeaderboardButton_Over.png + + + + +text_Ranking +116.000000 +40.000000 +9.000000,0.000000,0.000000 +10 +0xffffffff +0xff0f0f0f +16.000000 +5141 + + + + +text_Gamertag +272.000000 +40.000000 +127.000000,0.000000,0.000000 +0.000000,-0.000000,0.000000,0.999999 +15 +0xffffffff +0xff0f0f0f +16.000000 +21525 +1 + + + + +text_Column1 +75.000000 +40.000000 +405.000000,0.000000,0.000000 +0.000000,-0.000000,0.000000,0.999999 +14 +0xffffffff +0xff0f0f0f +16.000000 +5141 +3 + + + + +text_Column2 +75.000000 +40.000000 +480.000000,0.000000,0.000000 +0.000000,-0.000000,0.000000,0.999999 +14 +0xffffffff +0xff0f0f0f +16.000000 +5141 +4 + + + + +text_Column3 +75.000000 +40.000000 +555.000000,0.000000,0.000000 +0.000000,-0.000000,0.000000,0.999999 +14 +0xffffffff +0xff0f0f0f +16.000000 +5141 +5 + + + + +text_Column4 +75.000000 +40.000000 +630.000000,0.000000,0.000000 +0.000000,-0.000000,0.000000,0.999999 +14 +0xffffffff +0xff0f0f0f +16.000000 +5141 +6 + + + + +text_Column5 +75.000000 +40.000000 +705.000000,0.000000,0.000000 +0.000000,-0.000000,0.000000,0.999999 +14 +0xffffffff +0xff0f0f0f +16.000000 +5141 +7 + + + + +text_Column6 +75.000000 +40.000000 +780.000000,0.000000,0.000000 +0.000000,-0.000000,0.000000,0.999999 +14 +0xffffffff +0xff0f0f0f +16.000000 +5141 +8 + + + + +text_Column7 +75.000000 +40.000000 +855.000000,0.000000,0.000000 +0.000000,-0.000000,0.000000,0.999999 +14 +0xffffffff +0xff0f0f0f +16.000000 +5141 +9 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + +text_Ranking +TextColor + + +1 +0xffffffff + + + +0 +0xffffffff + + + +0 +0xffebcc0f + + + +0 +0xffebcc0f + + + +text_Gamertag +TextColor + + +1 +0xffffffff + + + +0 +0xffffffff + + + +0 +0xffebcc0f + + + +0 +0xffebcc0f + + + +text_Column1 +TextColor + + +1 +0xffffffff + + + +0 +0xffffffff + + + +0 +0xffebcc0f + + + +0 +0xffebcc0f + + + +text_Column2 +TextColor + + +1 +0xffffffff + + + +0 +0xffffffff + + + +0 +0xffebcc0f + + + +0 +0xffebcc0f + + + +text_Column3 +TextColor + + +1 +0xffffffff + + + +0 +0xffffffff + + + +0 +0xffebcc0f + + + +0 +0xffebcc0f + + + +text_Column4 +TextColor + + +1 +0xffffffff + + + +0 +0xffffffff + + + +0 +0xffebcc0f + + + +0 +0xffebcc0f + + + +text_Column5 +TextColor + + +1 +0xffffffff + + + +0 +0xffffffff + + + +0 +0xffebcc0f + + + +0 +0xffebcc0f + + + +text_Column6 +TextColor + + +1 +0xffffffff + + + +0 +0xffffffff + + + +0 +0xffebcc0f + + + +0 +0xffebcc0f + + + +text_Column7 +TextColor + + +1 +0xffffffff + + + +0 +0xffffffff + + + +0 +0xffebcc0f + + + +0 +0xffebcc0f + + + +highlight_graphic +Show +Height + + +0 +false +40.000000 + + + +0 +false +50.000000 + + + +0 +true +40.000000 + + + +0 +true +40.000000 + + + +button_graphic +Show + + +0 +true + + + +0 +true + + + +0 +false + + + +0 +false + + + + + + +XuiListLeaderboard +980.000000 +120.000000 + + + +graphic_groupbackground +980.000000 +150.000000 +15 + + + +Bot_R +16.000000 +16.000000 +964.344849,134.001953,0.000000 +12 +Graphics\PanelsAndTabs\Panel_Bot_R.png +48 + + + + +Bot_M +948.344849 +16.000000 +16.000000,134.001953,0.000000 +13 +4 +Graphics\PanelsAndTabs\Panel_Bot_M.png +48 + + + + +Bot_L +16.000000 +16.000000 +0.000000,134.001953,0.000000 +9 +Graphics\PanelsAndTabs\Panel_Bot_L.png +48 + + + + +Top_R +16.000000 +16.000000 +964.344849,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\Panel_Top_R.png +48 + + + + +Top_M +948.344849 +16.000000 +16.000000,0.000000,0.000000 +7 +4 +Graphics\PanelsAndTabs\Panel_Top_M.png +48 + + + + +Top_L +16.000000 +16.000000 +3 +Graphics\PanelsAndTabs\Panel_Top_L.png +48 + + + + +Mid_R +16.000000 +118.001961 +964.344849,16.000000,0.000000 +14 +4 +Graphics\PanelsAndTabs\Panel_Mid_R.png +48 + + + + +Mid_M +948.344849 +118.001961 +16.000000,16.000000,0.000000 +15 +4 +Graphics\PanelsAndTabs\Panel_Mid_M.png +48 + + + + +Mid_L +16.000000 +118.001961 +0.000000,16.000000,0.000000 +11 +4 +Graphics\PanelsAndTabs\Panel_Mid_L.png +48 + + + + + +control_ScrollDown +32.000000 +22.000000 +928.000000,118.000000,0.000000 +12 +XuiScrollEnd +1 + + + + +control_ScrollUp +32.000000 +22.000000 +896.000000,118.000000,0.000000 +12 +XuiScrollEndUp + + + + +control_ListItem +940.000000 +44.000000 +20.000032,71.000000,0.000000 +15 +XuiLeaderboardEntry +22594 + + + + +XuiLabel_Rank +116.000000 +22.000000 +29.000000,26.000000,0.000000 +10 +false +XuiLabelDarkCentred + + + + +XuiLabel_Gamertag +272.000000 +22.000000 +147.000000,26.000000,0.000000 +15 +false +XuiLabelDarkCentred + + + + +XuiHSlot1 +46.000000 +46.000000 +439.500000,16.000000,0.000000 +4 +false +7 +CXuiCtrlCraftIngredientSlot +ItemButton + + + + +XuiHSlot2 +46.000000 +46.000000 +514.500000,16.000000,0.000000 +4 +false +7 +CXuiCtrlCraftIngredientSlot +ItemButton + + + + +XuiHSlot3 +46.000000 +46.000000 +589.500000,16.000000,0.000000 +4 +false +7 +CXuiCtrlCraftIngredientSlot +ItemButton + + + + +XuiHSlot4 +46.000000 +46.000000 +664.500000,16.000000,0.000000 +4 +false +7 +CXuiCtrlCraftIngredientSlot +ItemButton + + + + +XuiHSlot5 +46.000000 +46.000000 +739.500000,16.000000,0.000000 +4 +false +7 +CXuiCtrlCraftIngredientSlot +ItemButton + + + + +XuiHSlot6 +46.000000 +46.000000 +814.500000,16.000000,0.000000 +4 +false +7 +CXuiCtrlCraftIngredientSlot +ItemButton + + + + +XuiHSlot7 +46.000000 +46.000000 +889.500000,16.000000,0.000000 +4 +false +7 +CXuiCtrlCraftIngredientSlot +ItemButton + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + + + + +XuiLeaderboardEntrySmall +540.000000 +22.000000 +15 + + + +button_graphic +540.000000 +20.000000 +15 +Graphics\LeaderboardButton_Norm.png + + + + +highlight_graphic +540.000000 +20.000000 +15 +false +Graphics\LeaderboardButton_Over.png + + + + +text_Ranking +52.000000 +20.000000 +4.000000,0.000000,0.000000 +11 +0xffebebeb +0xff0f0f0f +8.000000 +5140 + + + + +text_Gamertag +186.000000 +20.000000 +58.000000,0.000000,0.000000 +0.000000,-0.000000,0.000000,0.999999 +15 +0xffebebeb +0xff0f0f0f +8.000000 +21524 +1 + + + + +text_Column1 +40.000000 +20.000000 +246.000000,0.000000,0.000000 +0.000000,-0.000000,0.000000,0.999999 +14 +0xffebebeb +0xff0f0f0f +8.000000 +5140 +3 + + + + +text_Column2 +40.000000 +20.000000 +288.000000,0.000000,0.000000 +0.000000,-0.000000,0.000000,0.999999 +14 +0xffebebeb +0xff0f0f0f +8.000000 +5140 +4 + + + + +text_Column3 +40.000000 +20.000000 +330.000000,0.000000,0.000000 +0.000000,-0.000000,0.000000,0.999999 +14 +0xffebebeb +0xff0f0f0f +8.000000 +5140 +5 + + + + +text_Column4 +40.000000 +20.000000 +372.000000,0.000000,0.000000 +0.000000,-0.000000,0.000000,0.999999 +14 +0xffebebeb +0xff0f0f0f +8.000000 +5140 +6 + + + + +text_Column5 +40.000000 +20.000000 +414.000000,0.000000,0.000000 +0.000000,-0.000000,0.000000,0.999999 +14 +0xffebebeb +0xff0f0f0f +8.000000 +5140 +7 + + + + +text_Column6 +40.000000 +20.000000 +456.000000,0.000000,0.000000 +0.000000,-0.000000,0.000000,0.999999 +14 +0xffebebeb +0xff0f0f0f +8.000000 +5140 +8 + + + + +text_Column7 +40.000000 +20.000000 +498.000000,0.000000,0.000000 +0.000000,-0.000000,0.000000,0.999999 +14 +0xffebebeb +0xff0f0f0f +8.000000 +5140 +9 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + +text_Ranking +TextColor + + +1 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebcc0f + + + +0 +0xffebcc0f + + + +text_Gamertag +TextColor + + +1 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebcc0f + + + +0 +0xffebcc0f + + + +text_Column1 +TextColor + + +1 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebcc0f + + + +0 +0xffebcc0f + + + +text_Column2 +TextColor + + +1 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebcc0f + + + +0 +0xffebcc0f + + + +text_Column3 +TextColor + + +1 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebcc0f + + + +0 +0xffebcc0f + + + +text_Column4 +TextColor + + +1 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebcc0f + + + +0 +0xffebcc0f + + + +text_Column5 +TextColor + + +1 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebcc0f + + + +0 +0xffebcc0f + + + +text_Column6 +TextColor + + +1 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebcc0f + + + +0 +0xffebcc0f + + + +text_Column7 +TextColor + + +1 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebcc0f + + + +0 +0xffebcc0f + + + +highlight_graphic +Show + + +0 +false + + + +0 +false + + + +0 +true + + + +0 +true + + + +button_graphic +Show + + +0 +true + + + +0 +true + + + +0 +false + + + +0 +false + + + + + + +XuiListLeaderboardSmall +560.000000 +100.000000 + + + +graphic_groupbackground +560.000000 +100.000000 +15 + + + +Bot_R +16.000000 +16.000000 +544.344849,84.001953,0.000000 +12 +Graphics\PanelsAndTabs\Panel_Bot_R.png +48 + + + + +Bot_M +528.344849 +16.000000 +16.000000,84.001953,0.000000 +13 +4 +Graphics\PanelsAndTabs\Panel_Bot_M.png +48 + + + + +Bot_L +16.000000 +16.000000 +0.000000,84.001953,0.000000 +9 +Graphics\PanelsAndTabs\Panel_Bot_L.png +48 + + + + +Top_R +16.000000 +16.000000 +544.344849,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\Panel_Top_R.png +48 + + + + +Top_M +528.344849 +16.000000 +16.000000,0.000000,0.000000 +7 +4 +Graphics\PanelsAndTabs\Panel_Top_M.png +48 + + + + +Top_L +16.000000 +16.000000 +3 +Graphics\PanelsAndTabs\Panel_Top_L.png +48 + + + + +Mid_R +16.000000 +68.001961 +544.344849,16.000000,0.000000 +14 +4 +Graphics\PanelsAndTabs\Panel_Mid_R.png +48 + + + + +Mid_M +528.344849 +68.001961 +16.000000,16.000000,0.000000 +15 +4 +Graphics\PanelsAndTabs\Panel_Mid_M.png +48 + + + + +Mid_L +16.000000 +68.001961 +0.000000,16.000000,0.000000 +11 +4 +Graphics\PanelsAndTabs\Panel_Mid_L.png +48 + + + + + +control_ScrollUp +22.000000 +15.000000 +506.000000,76.000000,0.000000 +12 +XuiScrollEndUp + + + + +control_ScrollDown +22.000000 +15.000000 +528.000000,76.000008,0.000000 +12 +XuiScrollEnd +1 + + + + +control_ListItem +540.000000 +22.000000 +10.000000,52.000000,0.000000 +15 +XuiLeaderboardEntrySmall +22594 +0.000000,2.000000,0.000000 + + + + +XuiLabel_Rank +20.000000 +10.000000,21.000000,0.000000 +2 +false +XuiLabelDarkCentredSmall + + + + +XuiLabel_Gamertag +186.000000 +20.000000 +68.000000,21.000000,0.000000 +2 +false +XuiLabelDarkCentredSmall + + + + +XuiHSlot1 +32.000000 +32.000000 +260.000000,15.000000,0.000000 +4 +false +7 +CXuiCtrlCraftIngredientSlot +ItemButton32 + + + + +XuiHSlot2 +32.000000 +32.000000 +301.999969,15.000000,0.000000 +4 +false +7 +CXuiCtrlCraftIngredientSlot +ItemButton32 + + + + +XuiHSlot3 +32.000000 +32.000000 +343.999969,15.000000,0.000000 +4 +false +7 +CXuiCtrlCraftIngredientSlot +ItemButton32 + + + + +XuiHSlot4 +32.000000 +32.000000 +385.999939,15.000000,0.000000 +4 +false +7 +CXuiCtrlCraftIngredientSlot +ItemButton32 + + + + +XuiHSlot5 +32.000000 +32.000000 +427.999939,15.000000,0.000000 +4 +false +7 +CXuiCtrlCraftIngredientSlot +ItemButton32 + + + + +XuiHSlot6 +32.000000 +32.000000 +469.999939,15.000000,0.000000 +4 +false +7 +CXuiCtrlCraftIngredientSlot +ItemButton32 + + + + +XuiHSlot7 +32.000000 +32.000000 +512.000000,16.000000,0.000000 +4 +false +7 +CXuiCtrlCraftIngredientSlot +ItemButton32 + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + + + + +ItemButtonRed72 +72.000000 +72.000000 + + + +Box +72.000000 +72.000000 +15 +4 +Graphics\IconHolder.png +48 + + + + +BoxRed +72.000000 +72.000000 +15 +false +4 +Graphics\IconHolderRed.png +48 + + + + +image +65.000000 +65.000000 +4.000000,4.000000,0.000000 +207 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +graphic_Highlight +64.000000 +64.000000 +4.000000,4.000000,0.000000 +0.000000 +207 + + +0xff646464 + + + + +0xb4ebebeb + + +4 +0xff828282 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0.000000 +0.592157 +0.627451 +1.000000 + + +90.000000 + + +true +4,0.000000,0.000000,0.000000,0.000000,242.119705,0.000000,1,242.119705,0.000000,242.119705,0.000000,242.119705,31.004648,1,242.119705,31.004648,242.119705,31.004648,0.000000,31.006342,1,0.000000,31.006342,0.000000,31.006342,0.000000,0.000000,1, + + + + +text_name +191.041656 +27.000000 +12.000000,-12.000000,1.000000 +3 +false +0xffebebeb +0xdc0f0f0f +18.000000 +273 +2 + + + + +Exclaim +16.000000 +16.000000 +2.000000,2.000000,0.000000 +3 +false +Graphics\Warning.png + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + + +graphic_Highlight +Fill.Gradient.StopPos +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Stroke.StrokeColor +Fill.Gradient.StopColor +Opacity + + +1 +0.627451 +0xff828282 +0xffd2d2d2 +0xffebebeb +0xff646464 +0xffb4b4b4 +0.000000 + + + +0 +0.627451 +0xff828282 +0xffd2d2d2 +0xffebebeb +0xff646464 +0xffb4b4b4 +1.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +1.000000 + + + +0 +0.619608 +0xff829682 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff96c896 +1.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +1.000000 + + + +1 +0.627451 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0xffb4b4b4 +0xffc8c8c8 +0.000000 + + + +0 +0.627451 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0xffb4b4b4 +0xffc8c8c8 +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff647264 +0xffaaafa0 +0.000000 + + + +0 +0.619608 +0xff8cb48c +0xffc3cdc3 +0xffdaebda +0xff648464 +0xff91b18c +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff647264 +0xffaaafa0 +0.000000 + + + +2 +0 +0 +50 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff649664 +0xffaaafa0 +0.000000 + + + +text_name +Show + + +0 +false + + + +0 +false + + + +0 +true + + + +0 +true + + + +0 +true + + + +0 +false + + + +0 +false + + + +0 +false + + + +0 +false + + + +0 +false + + + +0 +true + + + +0 +true + + + +0 +false + + + +0 +false + + + + + + +ItemButtonRedSmall +38.000000 +38.000000 + + + +Box +38.000000 +38.000000 +15 +4 +Graphics\IconHolder_Small.png +48 + + + + +BoxRed +38.000000 +38.000000 +15 +false +4 +Graphics\IconHolderRed_Small.png +48 + + + + +image +34.000000 +34.000000 +2.000000,2.000000,0.000000 +15 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +graphic_Highlight +34.000000 +34.000000 +2.000000,2.000000,0.000000 +0.000000 +207 + + +0xff646464 + + + + +0xb4ebebeb + + +4 +0xff828282 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0.000000 +0.592157 +0.627451 +1.000000 + + +90.000000 + + +true +4,0.000000,0.000000,0.000000,0.000000,242.119705,0.000000,1,242.119705,0.000000,242.119705,0.000000,242.119705,31.004648,1,242.119705,31.004648,242.119705,31.004648,0.000000,31.006342,1,0.000000,31.006342,0.000000,31.006342,0.000000,0.000000,1, + + + + +text_name +321.000000 +34.000000 +42.000000,2.000000,1.000000 +15 +false +0xff323232 +0xdc0f0f0f +12.000000 +4368 +2 + + + + +Exclaim +16.000000 +16.000000 +1.000000,1.000000,0.000000 +3 +false +Graphics\Warning.png + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + + +graphic_Highlight +Fill.Gradient.StopPos +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Stroke.StrokeColor +Fill.Gradient.StopColor +Opacity + + +1 +0.627451 +0xff828282 +0xffd2d2d2 +0xffebebeb +0xff646464 +0xffb4b4b4 +0.000000 + + + +0 +0.627451 +0xff828282 +0xffd2d2d2 +0xffebebeb +0xff646464 +0xffb4b4b4 +1.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +1.000000 + + + +0 +0.619608 +0xff829682 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff96c896 +1.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +1.000000 + + + +1 +0.627451 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0xffb4b4b4 +0xffc8c8c8 +0.000000 + + + +0 +0.627451 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0xffb4b4b4 +0xffc8c8c8 +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff647264 +0xffaaafa0 +0.000000 + + + +0 +0.619608 +0xff8cb48c +0xffc3cdc3 +0xffdaebda +0xff648464 +0xff91b18c +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff647264 +0xffaaafa0 +0.000000 + + + +2 +0 +0 +50 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff649664 +0xffaaafa0 +0.000000 + + + + + + +ItemButtonRed +42.000000 +42.000000 + + + +Box +42.000000 +42.000000 +15 +4 +Graphics\IconHolder.png + + + + +BoxRed +42.000000 +42.000000 +15 +false +4 +Graphics\IconHolderRed.png +48 + + + + +image +38.000000 +38.000000 +2.000000,2.000000,0.000000 +15 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +graphic_Highlight +38.000000 +38.000000 +2.000000,2.000000,0.000000 +0.000000 +207 + + +0xff646464 + + + + +0xb4ebebeb + + +4 +0xff828282 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0.000000 +0.592157 +0.627451 +1.000000 + + +90.000000 + + +true +4,0.000000,0.000000,0.000000,0.000000,242.119705,0.000000,1,242.119705,0.000000,242.119705,0.000000,242.119705,31.004648,1,242.119705,31.004648,242.119705,31.004648,0.000000,31.006342,1,0.000000,31.006342,0.000000,31.006342,0.000000,0.000000,1, + + + + +text_name +320.000000 +42.000000 +42.000000,0.000000,1.000000 +15 +false +0xff3c3c3c +0xdc0f0f0f +4368 +2 + + + + +Exclaim +16.000000 +16.000000 +2.000000,2.000000,0.000000 +3 +false +Graphics\Warning.png + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + + +graphic_Highlight +Fill.Gradient.StopPos +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Stroke.StrokeColor +Fill.Gradient.StopColor +Opacity + + +1 +0.627451 +0xff828282 +0xffd2d2d2 +0xffebebeb +0xff646464 +0xffb4b4b4 +0.000000 + + + +0 +0.627451 +0xff828282 +0xffd2d2d2 +0xffebebeb +0xff646464 +0xffb4b4b4 +1.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +1.000000 + + + +0 +0.619608 +0xff829682 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff96c896 +1.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +1.000000 + + + +1 +0.627451 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0xffb4b4b4 +0xffc8c8c8 +0.000000 + + + +0 +0.627451 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0xffb4b4b4 +0xffc8c8c8 +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff647264 +0xffaaafa0 +0.000000 + + + +0 +0.619608 +0xff8cb48c +0xffc3cdc3 +0xffdaebda +0xff648464 +0xff91b18c +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff647264 +0xffaaafa0 +0.000000 + + + +2 +0 +0 +50 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff649664 +0xffaaafa0 +0.000000 + + + + + + +ItemGridVerticalSmall +32.000000 +32.000000 + + + +control_ListItem +34.000000 +34.000000 +7 +0.000000,50.000000,0.000000 +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + + + + +ItemButton22 +22.000000 +22.000000 + + + +Box +22.000000 +22.000000 +15 +4 +Graphics\IconHolder_Small.png +48 + + + + +image +20.000000 +20.000000 +1.000000,1.000000,0.000000 +15 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +graphic_Highlight +20.000000 +20.000000 +1.000000,1.000000,0.000000 +0.000000 +15 + + +0xff646464 + + + + +0xb4ebebeb + + +4 +0xff828282 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0.000000 +0.592157 +0.627451 +1.000000 + + +90.000000 + + +true +4,0.000000,0.000000,0.000000,0.000000,242.119705,0.000000,1,242.119705,0.000000,242.119705,0.000000,242.119705,31.004648,1,242.119705,31.004648,242.119705,31.004648,0.000000,31.006342,1,0.000000,31.006342,0.000000,31.006342,0.000000,0.000000,1, + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + + +graphic_Highlight +Fill.Gradient.StopPos +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Stroke.StrokeColor +Fill.Gradient.StopColor +Opacity + + +1 +0.627451 +0xff828282 +0xffd2d2d2 +0xffebebeb +0xff646464 +0xffb4b4b4 +0.000000 + + + +0 +0.627451 +0xff828282 +0xffd2d2d2 +0xffebebeb +0xff646464 +0xffb4b4b4 +1.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +1.000000 + + + +0 +0.619608 +0xff829682 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff96c896 +1.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +1.000000 + + + +1 +0.627451 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0xffb4b4b4 +0xffc8c8c8 +0.000000 + + + +0 +0.627451 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0xffb4b4b4 +0xffc8c8c8 +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff647264 +0xffaaafa0 +0.000000 + + + +0 +0.619608 +0xff8cb48c +0xffc3cdc3 +0xffdaebda +0xff648464 +0xff91b18c +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff647264 +0xffaaafa0 +0.000000 + + + +2 +0 +0 +50 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff649664 +0xffaaafa0 +0.000000 + + + + + + +ItemButton24 +24.000000 +24.000000 + + + +Box +24.000000 +24.000000 +15 +4 +Graphics\IconHolder_Small.png +48 + + + + +image +22.000000 +22.000000 +1.000000,1.000000,0.000000 +15 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +graphic_Highlight +22.000000 +22.000000 +1.000000,1.000000,0.000000 +0.000000 +15 + + +0xff646464 + + + + +0xb4ebebeb + + +4 +0xff828282 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0.000000 +0.592157 +0.627451 +1.000000 + + +90.000000 + + +true +4,0.000000,0.000000,0.000000,0.000000,242.119705,0.000000,1,242.119705,0.000000,242.119705,0.000000,242.119705,31.004648,1,242.119705,31.004648,242.119705,31.004648,0.000000,31.006342,1,0.000000,31.006342,0.000000,31.006342,0.000000,0.000000,1, + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + + +graphic_Highlight +Fill.Gradient.StopPos +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Stroke.StrokeColor +Fill.Gradient.StopColor +Opacity + + +1 +0.627451 +0xff828282 +0xffd2d2d2 +0xffebebeb +0xff646464 +0xffb4b4b4 +0.000000 + + + +0 +0.627451 +0xff828282 +0xffd2d2d2 +0xffebebeb +0xff646464 +0xffb4b4b4 +1.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +1.000000 + + + +0 +0.619608 +0xff829682 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff96c896 +1.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +1.000000 + + + +1 +0.627451 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0xffb4b4b4 +0xffc8c8c8 +0.000000 + + + +0 +0.627451 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0xffb4b4b4 +0xffc8c8c8 +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff647264 +0xffaaafa0 +0.000000 + + + +0 +0.619608 +0xff8cb48c +0xffc3cdc3 +0xffdaebda +0xff648464 +0xff91b18c +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff647264 +0xffaaafa0 +0.000000 + + + +2 +0 +0 +50 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff649664 +0xffaaafa0 +0.000000 + + + + + + +ItemButton26 +26.000000 +26.000000 + + + +Box +26.000000 +26.000000 +15 +4 +Graphics\IconHolder_Small.png +48 + + + + +image +22.000000 +22.000000 +2.000000,2.000000,0.000000 +15 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +graphic_Highlight +24.000000 +24.000000 +1.000000,1.000000,0.000000 +0.000000 +15 + + +0xff646464 + + + + +0xb4ebebeb + + +4 +0xff828282 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0.000000 +0.592157 +0.627451 +1.000000 + + +90.000000 + + +true +4,0.000000,0.000000,0.000000,0.000000,242.119705,0.000000,1,242.119705,0.000000,242.119705,0.000000,242.119705,31.004648,1,242.119705,31.004648,242.119705,31.004648,0.000000,31.006342,1,0.000000,31.006342,0.000000,31.006342,0.000000,0.000000,1, + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + + +graphic_Highlight +Fill.Gradient.StopPos +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Stroke.StrokeColor +Fill.Gradient.StopColor +Opacity + + +1 +0.627451 +0xff828282 +0xffd2d2d2 +0xffebebeb +0xff646464 +0xffb4b4b4 +0.000000 + + + +0 +0.627451 +0xff828282 +0xffd2d2d2 +0xffebebeb +0xff646464 +0xffb4b4b4 +1.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +1.000000 + + + +0 +0.619608 +0xff829682 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff96c896 +1.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +1.000000 + + + +1 +0.627451 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0xffb4b4b4 +0xffc8c8c8 +0.000000 + + + +0 +0.627451 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0xffb4b4b4 +0xffc8c8c8 +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff647264 +0xffaaafa0 +0.000000 + + + +0 +0.619608 +0xff8cb48c +0xffc3cdc3 +0xffdaebda +0xff648464 +0xff91b18c +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff647264 +0xffaaafa0 +0.000000 + + + +2 +0 +0 +50 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff649664 +0xffaaafa0 +0.000000 + + + + + + +ItemButton32 +32.000000 +32.000000 + + + +Box +32.000000 +32.000000 +15 +4 +Graphics\IconHolder_Small.png +48 + + + + +image +28.000000 +28.000000 +2.000000,2.000000,0.000000 +15 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +graphic_Highlight +28.000000 +28.000000 +2.000000,2.000000,0.000000 +0.000000 +15 + + +0xff646464 + + + + +0xb4ebebeb + + +4 +0xff828282 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0.000000 +0.592157 +0.627451 +1.000000 + + +90.000000 + + +true +4,0.000000,0.000000,0.000000,0.000000,242.119705,0.000000,1,242.119705,0.000000,242.119705,0.000000,242.119705,31.004648,1,242.119705,31.004648,242.119705,31.004648,0.000000,31.006342,1,0.000000,31.006342,0.000000,31.006342,0.000000,0.000000,1, + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + + +graphic_Highlight +Fill.Gradient.StopPos +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Stroke.StrokeColor +Fill.Gradient.StopColor +Opacity + + +1 +0.627451 +0xff828282 +0xffd2d2d2 +0xffebebeb +0xff646464 +0xffb4b4b4 +0.000000 + + + +0 +0.627451 +0xff828282 +0xffd2d2d2 +0xffebebeb +0xff646464 +0xffb4b4b4 +1.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +1.000000 + + + +0 +0.619608 +0xff829682 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff96c896 +1.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +1.000000 + + + +1 +0.627451 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0xffb4b4b4 +0xffc8c8c8 +0.000000 + + + +0 +0.627451 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0xffb4b4b4 +0xffc8c8c8 +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff647264 +0xffaaafa0 +0.000000 + + + +0 +0.619608 +0xff8cb48c +0xffc3cdc3 +0xffdaebda +0xff648464 +0xff91b18c +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff647264 +0xffaaafa0 +0.000000 + + + +2 +0 +0 +50 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff649664 +0xffaaafa0 +0.000000 + + + + + + +ItemButton54 +54.000000 +54.000000 + + + +Box +54.000000 +54.000000 +15 +4 +Graphics\IconHolder.png +48 + + + + +image +48.000000 +48.000000 +2.000000,2.000000,0.000000 +15 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +graphic_Highlight +48.000000 +48.000000 +2.000000,2.000000,0.000000 +0.000000 +15 + + +0xff646464 + + + + +0xb4ebebeb + + +4 +0xff828282 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0.000000 +0.592157 +0.627451 +1.000000 + + +90.000000 + + +true +4,0.000000,0.000000,0.000000,0.000000,242.119705,0.000000,1,242.119705,0.000000,242.119705,0.000000,242.119705,31.004648,1,242.119705,31.004648,242.119705,31.004648,0.000000,31.006342,1,0.000000,31.006342,0.000000,31.006342,0.000000,0.000000,1, + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + + +graphic_Highlight +Fill.Gradient.StopPos +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Stroke.StrokeColor +Fill.Gradient.StopColor +Opacity + + +1 +0.627451 +0xff828282 +0xffd2d2d2 +0xffebebeb +0xff646464 +0xffb4b4b4 +0.000000 + + + +0 +0.627451 +0xff828282 +0xffd2d2d2 +0xffebebeb +0xff646464 +0xffb4b4b4 +1.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +1.000000 + + + +0 +0.619608 +0xff829682 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff96c896 +1.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +1.000000 + + + +1 +0.627451 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0xffb4b4b4 +0xffc8c8c8 +0.000000 + + + +0 +0.627451 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0xffb4b4b4 +0xffc8c8c8 +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff647264 +0xffaaafa0 +0.000000 + + + +0 +0.619608 +0xff8cb48c +0xffc3cdc3 +0xffdaebda +0xff648464 +0xff91b18c +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff647264 +0xffaaafa0 +0.000000 + + + +2 +0 +0 +50 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff649664 +0xffaaafa0 +0.000000 + + + + + + +ItemGridVertical22 +22.000000 +22.000000 + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + + + + +ItemGridVertical24 +24.000000 +24.000000 + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + + + + +ItemGridVertical54 +54.000000 +54.000000 + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + + + + +ItemGridVertical26 +26.000000 +26.000000 + + + +control_ListItem +26.000000 +26.000000 +7 +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + + + + +ItemGridVertical32 +32.000000 +32.000000 + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + + + + +ItemGridVertical +60.000000 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + + + + +ItemButton +42.000000 +42.000000 + + + +Box +42.000000 +42.000000 +15 +4 +Graphics\IconHolder.png +48 + + + + +image +38.000000 +38.000000 +2.000000,2.000000,0.000000 +15 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +graphic_Highlight +38.000000 +38.000000 +2.000000,2.000000,0.000000 +0.000000 +15 + + +0xff646464 + + + + +0xb4ebebeb + + +4 +0xff828282 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0.000000 +0.592157 +0.627451 +1.000000 + + +90.000000 + + +true +4,0.000000,0.000000,0.000000,0.000000,242.119705,0.000000,1,242.119705,0.000000,242.119705,0.000000,242.119705,31.004648,1,242.119705,31.004648,242.119705,31.004648,0.000000,31.006342,1,0.000000,31.006342,0.000000,31.006342,0.000000,0.000000,1, + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + + +graphic_Highlight +Fill.Gradient.StopPos +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Stroke.StrokeColor +Fill.Gradient.StopColor +Opacity + + +1 +0.627451 +0xff828282 +0xffd2d2d2 +0xffebebeb +0xff646464 +0xffb4b4b4 +0.000000 + + + +0 +0.627451 +0xff828282 +0xffd2d2d2 +0xffebebeb +0xff646464 +0xffb4b4b4 +1.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +1.000000 + + + +0 +0.619608 +0xff829682 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff96c896 +1.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +1.000000 + + + +1 +0.627451 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0xffb4b4b4 +0xffc8c8c8 +0.000000 + + + +0 +0.627451 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0xffb4b4b4 +0xffc8c8c8 +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff647264 +0xffaaafa0 +0.000000 + + + +0 +0.619608 +0xff8cb48c +0xffc3cdc3 +0xffdaebda +0xff648464 +0xff91b18c +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff647264 +0xffaaafa0 +0.000000 + + + +2 +0 +0 +50 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff649664 +0xffaaafa0 +0.000000 + + + + + + +ItemPointer +42.000000 +42.000000 + + + +item_image +42.000000 +42.000000 +5.000000,2.000000,0.000000 +15 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +pointer_image +42.000000 +42.000000 +15 +2 +Graphics\Pointer.png +48 + + + + +text_panel +32.000000 +32.000000 +24.000000,-12.000000,0.000000 +15 +PointerTextPanel + + + + +text_name +22.000000 +21.000000 +28.000000,-7.000000,0.000000 +33 + + + + +text_measurer +240.000000 +40.000000 +-16.435925,-75.812302,0.000000 +false +0xff0f0f0f +0x800f0f0f +1041 + + + + + +PointerTextPanel +32.000000 +32.000000 + + + +graphic_groupbackground +32.000000 +32.000000 +15 + + + +Bot_R +8.000000 +8.000000 +24.000000,24.000000,0.000000 +12 +Graphics\PanelsAndTabs\PointerTextPanel_BR.png +48 + + + + +Bot_M +16.000000 +8.000000 +8.000000,24.000000,0.000000 +13 +4 +Graphics\PanelsAndTabs\PointerTextPanel_BM.png +48 + + + + +Bot_L +8.000000 +8.000000 +0.000000,24.000000,0.000000 +9 +Graphics\PanelsAndTabs\PointerTextPanel_BL.png +48 + + + + +Top_R +8.000000 +8.000000 +24.000000,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\PointerTextPanel_TR.png +48 + + + + +Top_M +16.000000 +8.000000 +8.000000,0.000000,0.000000 +7 +4 +Graphics\PanelsAndTabs\PointerTextPanel_TM.png +48 + + + + +Top_L +8.000000 +8.000000 +3 +Graphics\PanelsAndTabs\PointerTextPanel_TL.png +48 + + + + +Mid_R +8.000000 +16.000000 +24.000000,8.000000,0.000000 +14 +4 +Graphics\PanelsAndTabs\PointerTextPanel_MR.png +48 + + + + +Mid_M +16.000000 +16.000000 +8.000000,8.000000,0.000000 +15 +4 +Graphics\PanelsAndTabs\PointerTextPanel_MM.png +48 + + + + +Mid_L +8.000000 +16.000000 +0.000000,8.000000,0.000000 +11 +4 +Graphics\PanelsAndTabs\PointerTextPanel_ML.png +48 + + + + + + +ItemPointerSmall +26.000000 +26.000000 + + + +item_image +26.000000 +26.000000 +7.000000,3.000000,0.000000 +15 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +pointer_image +26.000000 +26.000000 +15 +2 +Graphics\Pointer.png +48 + + + + +text_panel +32.000000 +32.000000 +24.000000,-12.000000,0.000000 +15 +PointerTextPanel + + + + +text_name +22.000000 +21.000000 +28.000000,-7.000000,0.000000 +33 + + + + +text_measurer +240.000000 +40.000000 +-16.435925,-75.812302,0.000000 +false +0xff0f0f0f +0x800f0f0f +12.000000 +1041 + + + + + +ItemGridVertical64 +64.000000 +64.000000 + + + +control_ListItem +64.000000 +64.000000 +7 +0.000000,50.000000,0.000000 +CXuiCtrlSlotItemListItem +ItemButton64 +22594 +4 + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + + + + +ItemButton64 +64.000000 +64.000000 + + + +Box +64.000000 +64.000000 +15 +4 +Graphics\IconHolder.png +48 + + + + +image +58.000000 +58.000000 +3.000000,3.000000,0.000000 +15 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +graphic_Highlight +58.000000 +58.000000 +3.000000,3.000000,0.000000 +0.000000 +15 + + +0xff646464 + + + + +0xb4ebebeb + + +4 +0xff828282 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0.000000 +0.592157 +0.627451 +1.000000 + + +90.000000 + + +true +4,0.000000,0.000000,0.000000,0.000000,242.119705,0.000000,1,242.119705,0.000000,242.119705,0.000000,242.119705,31.004648,1,242.119705,31.004648,242.119705,31.004648,0.000000,31.006342,1,0.000000,31.006342,0.000000,31.006342,0.000000,0.000000,1, + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + + +graphic_Highlight +Fill.Gradient.StopPos +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Stroke.StrokeColor +Fill.Gradient.StopColor +Opacity + + +1 +0.627451 +0xff828282 +0xffd2d2d2 +0xffebebeb +0xff646464 +0xffb4b4b4 +0.000000 + + + +0 +0.627451 +0xff828282 +0xffd2d2d2 +0xffebebeb +0xff646464 +0xffb4b4b4 +1.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +1.000000 + + + +0 +0.619608 +0xff829682 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff96c896 +1.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +1.000000 + + + +1 +0.627451 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0xffb4b4b4 +0xffc8c8c8 +0.000000 + + + +0 +0.627451 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0xffb4b4b4 +0xffc8c8c8 +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff647264 +0xffaaafa0 +0.000000 + + + +0 +0.619608 +0xff8cb48c +0xffc3cdc3 +0xffdaebda +0xff648464 +0xff91b18c +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff647264 +0xffaaafa0 +0.000000 + + + +2 +0 +0 +50 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff649664 +0xffaaafa0 +0.000000 + + + + + + +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 + + + +Box +64.000000 +64.000000 +15 +4 +Graphics\IconHolder.png +48 + + + + +image +58.000000 +58.000000 +3.000000,3.000000,0.000000 +15 +CXuiCtrl4JIcon +XuiVisualImagePresenter + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + + + + + +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 + + + +text_panel +32.000000 +32.000000 +15 +PointerTextPanel + + + + +text_name +22.000000 +21.000000 +4.000000,5.000000,0.000000 +15 + + + + +text_measurer +240.000000 +40.000000 +-16.435925,-75.812302,0.000000 +false +0xff0f0f0f +0x800f0f0f +12.000000 +1041 + + + + + +HtmlItemDescription +32.000000 +32.000000 + + + +text_panel +32.000000 +32.000000 +15 +PointerTextPanel + + + + +text_name +22.000000 +21.000000 +4.000000,5.000000,0.000000 +15 + + + + +text_measurer +240.000000 +40.000000 +-16.435925,-75.812302,0.000000 +false +0xff0f0f0f +0x800f0f0f +1041 + + + + + +InventoryArmourBackground +42.000000 +168.000000 + + + +FeetBox +42.000000 +42.000000 +0.000107,126.000000,0.000000 +4 +Graphics\IconHolder.png + + + + +LegsBox +42.000000 +42.000000 +0.000107,84.000000,0.000000 +4 +Graphics\IconHolder.png + + + + +BodyBox +42.000000 +42.000000 +0.000107,42.000004,0.000000 +4 +Graphics\IconHolder.png + + + + +HeadBox +42.000000 +42.000000 +0.000107,0.000004,0.000000 +4 +Graphics\IconHolder.png + + + + +FeetIcon +38.000000 +38.000000 +2.000000,128.000000,0.000000 +4 +Graphics\Armour_Slot_Feet.png +48 + + + + +LegsIcon +38.000000 +38.000000 +2.000000,86.000000,0.000000 +4 +Graphics\Armour_Slot_Legs.png +48 + + + + +BodyIcon +38.000000 +38.000000 +2.000000,44.000000,0.000000 +4 +Graphics\Armour_Slot_Body.png +48 + + + + +HeadIcon +38.000000 +38.000000 +2.000000,2.000000,0.000000 +4 +Graphics\Armour_Slot_Head.png +48 + + + + + +InventoryArmourBackgroundSmall +26.000000 +104.000000 + + + +FeetBox +26.000000 +26.000000 +0.000107,78.000000,0.000000 +4 +Graphics\IconHolder_Small.png + + + + +LegsBox +26.000000 +26.000000 +0.000107,52.000000,0.000000 +4 +Graphics\IconHolder_Small.png + + + + +BodyBox +26.000000 +26.000000 +0.000107,26.000004,0.000000 +4 +Graphics\IconHolder_Small.png + + + + +HeadBox +26.000000 +26.000000 +0.000107,0.000004,0.000000 +4 +Graphics\IconHolder_Small.png + + + + +FeetIcon +26.000000 +26.000000 +0.000000,78.000000,0.000000 +4 +Graphics\Armour_Slot_Feet.png +48 + + + + +LegsIcon +26.000000 +26.000000 +0.000000,52.000000,0.000000 +4 +Graphics\Armour_Slot_Legs.png +48 + + + + +BodyIcon +26.000000 +26.000000 +0.000000,26.000000,0.000000 +4 +Graphics\Armour_Slot_Body.png +48 + + + + +HeadIcon +26.000000 +26.000000 +4 +Graphics\Armour_Slot_Head.png +48 + + + + + +MobEffect +260.000000 +58.000000 +15 + + + +graphic_groupbackground +260.000000 +58.000000 +15 + + + +Bot_R +8.000000 +8.000000 +252.000000,50.000000,0.000000 +12 +Graphics\PanelsAndTabs\PointerTextPanel_BR.png +48 + + + + +Bot_M +244.000000 +8.000000 +8.000000,50.000000,0.000000 +13 +4 +Graphics\PanelsAndTabs\PointerTextPanel_BM.png +48 + + + + +Bot_L +8.000000 +8.000000 +0.000000,50.000000,0.000000 +9 +Graphics\PanelsAndTabs\PointerTextPanel_BL.png +48 + + + + +Top_R +8.000000 +8.000000 +252.000000,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\PointerTextPanel_TR.png +48 + + + + +Top_M +244.000000 +8.000000 +8.000000,0.000000,0.000000 +7 +4 +Graphics\PanelsAndTabs\PointerTextPanel_TM.png +48 + + + + +Top_L +8.000000 +8.000000 +3 +Graphics\PanelsAndTabs\PointerTextPanel_TL.png +48 + + + + +Mid_R +8.000000 +42.000000 +252.000000,8.000000,0.000000 +14 +4 +Graphics\PanelsAndTabs\PointerTextPanel_MR.png +48 + + + + +Mid_M +244.000000 +42.000000 +8.000000,8.000000,0.000000 +15 +4 +Graphics\PanelsAndTabs\PointerTextPanel_MM.png +48 + + + + +Mid_L +8.000000 +42.000000 +0.000000,8.000000,0.000000 +11 +4 +Graphics\PanelsAndTabs\PointerTextPanel_ML.png +48 + + + + + +Icon +36.000000 +36.000000 +7.000000,10.000000,0.000000 +false +16 +48 + + + + +EffectName +204.000000 +22.000000 +47.000000,5.000000,0.000000 +4 +0xffebebeb +0xff606060 +17 +1 + + + + +EffectDuration +204.000000 +22.000000 +47.000000,27.000000,0.000000 +4 +0xffa0a0a0 +0xff0f0f0f +17 +2 + + + + + +Normal + +stop + + +Blindness + +stop + + +Fire_Resistance + +stop + + +Haste + +stop + + +Hunger + +stop + + +Invisibility + +stop + + +Jump_Boost + +stop + + +Mining_Fatigue + +stop + + +Nausea + +stop + + +Night_Vision + +stop + + +Poison + +stop + + +Regeneration + +stop + + +Resistance + +stop + + +Slowness + +stop + + +Speed + +stop + + +Strength + +stop + + +Water_Breathing + +stop + + +Weakness + +stop + + +Wither + +stop + + +HealthBoost + +stop + + +Absorption + +stop + + + +Icon +Show +ImagePath + + +0 +false + + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Blindness.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Fire_Resistance.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Haste.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Hunger.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Invisibility.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Jump_Boost.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Mining_Fatigue.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Nausea.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Night_Vision.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Poison.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Regeneration.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Resistance.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Slowness.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Speed.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Strength.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Water_Breathing.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Weakness.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Wither.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_HealthBoost.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_HealthBoost.png + + + + + + +MobEffect_Small +160.000000 +36.000000 +15 + + + +graphic_groupbackground +160.000000 +36.000000 +15 + + + +Bot_R +8.000000 +8.000000 +152.000000,28.000000,0.000000 +12 +Graphics\PanelsAndTabs\PointerTextPanel_BR.png +48 + + + + +Bot_M +144.000000 +8.000000 +8.000000,28.000000,0.000000 +13 +4 +Graphics\PanelsAndTabs\PointerTextPanel_BM.png +48 + + + + +Bot_L +8.000000 +8.000000 +0.000000,28.000000,0.000000 +9 +Graphics\PanelsAndTabs\PointerTextPanel_BL.png +48 + + + + +Top_R +8.000000 +8.000000 +152.000000,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\PointerTextPanel_TR.png +48 + + + + +Top_M +144.000000 +8.000000 +8.000000,0.000000,0.000000 +7 +4 +Graphics\PanelsAndTabs\PointerTextPanel_TM.png +48 + + + + +Top_L +8.000000 +8.000000 +3 +Graphics\PanelsAndTabs\PointerTextPanel_TL.png +48 + + + + +Mid_R +8.000000 +20.000000 +152.000000,8.000000,0.000000 +14 +4 +Graphics\PanelsAndTabs\PointerTextPanel_MR.png +48 + + + + +Mid_M +144.000000 +20.000000 +8.000000,8.000000,0.000000 +15 +4 +Graphics\PanelsAndTabs\PointerTextPanel_MM.png +48 + + + + +Mid_L +8.000000 +20.000000 +0.000000,8.000000,0.000000 +11 +4 +Graphics\PanelsAndTabs\PointerTextPanel_ML.png +48 + + + + + +Icon +18.000000 +18.000000 +6.000000,8.000000,0.000000 +false +16 +48 + + + + +EffectName +125.000000 +20.000000 +27.000000,1.000000,0.000000 +4 +0xffebebeb +0xff606060 +12.000000 +17 +1 + + + + +EffectDuration +125.000000 +20.000000 +27.000000,15.000000,0.000000 +4 +0xffa0a0a0 +0xff0f0f0f +12.000000 +17 +2 + + + + + +Normal + +stop + + +Blindness + +stop + + +Fire_Resistance + +stop + + +Haste + +stop + + +Hunger + +stop + + +Invisibility + +stop + + +Jump_Boost + +stop + + +Mining_Fatigue + +stop + + +Nausea + +stop + + +Night_Vision + +stop + + +Poison + +stop + + +Regeneration + +stop + + +Resistance + +stop + + +Slowness + +stop + + +Speed + +stop + + +Strength + +stop + + +Water_Breathing + +stop + + +Weakness + +stop + + +Wither + +stop + + +HealthBoost + +stop + + +Absorption + +stop + + + +Icon +Show +ImagePath + + +0 +false + + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Blindness.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Fire_Resistance.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Haste.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Hunger.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Invisibility.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Jump_Boost.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Mining_Fatigue.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Nausea.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Night_Vision.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Poison.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Regeneration.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Resistance.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Slowness.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Speed.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Strength.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Water_Breathing.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Weakness.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Wither.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_HealthBoost.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_HealthBoost.png + + + + + + +CharacterPanel +283.000000 +36.000000 + + + +graphic_Middle +282.000000 +35.000000 +15 + + +0xff646464 + + + + +0xff0f0f0f + + +4 +0xff828282 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0.000000 +0.592157 +0.627451 +1.000000 + + +90.000000 + + +true +4,0.000000,0.000000,0.000000,0.000000,242.119705,0.000000,1,242.119705,0.000000,242.119705,0.000000,242.119705,31.004648,1,242.119705,31.004648,242.119705,31.004648,0.000000,31.006342,1,0.000000,31.006342,0.000000,31.006342,0.000000,0.000000,1, + + + + +graphic_BottomEdge +283.000000 +2.000000 +0.000000,34.000000,0.000000 +13 + + +0xffebebeb + + +true +4,0.000000,0.000000,0.000000,0.000000,242.119690,0.000000,0,242.119690,0.000000,242.119690,0.000000,242.119690,2.000000,0,242.119690,2.000000,242.119690,2.000000,0.000000,2.000000,0,0.000000,2.000000,0.000000,2.000000,0.000000,0.000000,0, + + + + +graphic_CapLeft +2.000000 +36.000000 +11 + + +0xff646464 + + + + +0xff373737 + + +true +4 +0xff7d7d7d +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0.086275 +0.466667 +0.494118 +0.682353 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,3.000000,0.000000,0,3.000000,0.000000,3.000000,0.000000,3.000000,35.000000,0,3.000000,35.000000,3.000000,35.000000,0.000000,35.000000,0,0.000000,35.000000,0.000000,35.000000,0.000000,0.000000,0, + + + + +graphic_CapRight +2.000000 +35.000000 +281.000000,0.000000,0.000000 +14 + + +0xff646464 + + + + +0xffebebeb + + +true +4 +0xff7d7d7d +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0.086275 +0.466667 +0.494118 +0.682353 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,3.000000,0.000000,0,3.000000,0.000000,3.000000,0.000000,3.000000,35.000000,0,3.000000,35.000000,3.000000,35.000000,0.000000,35.000000,0,0.000000,35.000000,0.000000,35.000000,0.000000,0.000000,0, + + + + +graphic_TopEdge +283.000000 +2.000000 +7 + + +0xff373737 + + +true +4,0.000000,0.000000,0.000000,0.000000,242.119720,0.000000,0,242.119720,0.000000,242.119720,0.000000,242.119720,2.000000,0,242.119720,2.000000,242.119720,2.000000,0.000000,2.000000,0,0.000000,2.000000,0.000000,2.000000,0.000000,0.000000,0, + + + + +PlayerControl +283.000000 +36.000000 +15 +CXuiCtrlMinecraftPlayer + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + + +graphic_Middle +Fill.Gradient.StopPos +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Stroke.StrokeColor +Fill.Gradient.StopColor +Fill.Gradient.StopPos + + +1 +0.627451 +0xff828282 +0xffd2d2d2 +0xffebebeb +0xff646464 +0xffb4b4b4 +0.592157 + + + +0 +0.627451 +0xff828282 +0xffd2d2d2 +0xffebebeb +0xff646464 +0xffb4b4b4 +0.592157 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.592157 + + + +0 +0.619608 +0xff829682 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff96c896 +0.592157 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.592157 + + + +1 +0.627451 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0xffb4b4b4 +0xffc8c8c8 +0.592157 + + + +0 +0.627451 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0xffb4b4b4 +0xffc8c8c8 +0.592157 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff647264 +0xffaaafa0 +0.592157 + + + +0 +0.619608 +0xff8cb48c +0xffc3cdc3 +0xffdaebda +0xff648464 +0xff91b18c +0.592157 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff647264 +0xffaaafa0 +0.592157 + + + +2 +0 +0 +50 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.592157 + + + +1 +0.490196 +0xff8cb48c +0xff8cb48c +0xff8ca08c +0xff649664 +0xff8cb48c +0.376471 + + + +2 +0 +0 +50 +0.490196 +0xff8cb48c +0xff8cb48c +0xff8ca08c +0xff649664 +0xff8cb48c +0.376471 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.592157 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.592157 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff649664 +0xffaaafa0 +0.592157 + + + +graphic_BottomEdge +Fill.FillColor + + +1 +0xffebebeb + + + +0 +0xff0f0f0f + + + +1 +0xff0f0f0f + + + +0 +0xff0f0f0f + + + +1 +0xffb4b4b4 + + + +0 +0xffebebeb + + + +1 +0xffebebeb + + + +0 +0xffebebeb + + + +1 +0xffebebeb + + + +0 +0xff0f0f0f + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +graphic_TopEdge +Fill.FillColor + + +1 +0xff373737 + + + +0 +0xffebebeb + + + +1 +0xffebebeb + + + +0 +0xffebebeb + + + +1 +0xffb4b4b4 + + + +0 +0xff0f0f0f + + + +1 +0xff0f0f0f + + + +0 +0xff0f0f0f + + + +1 +0xff0f0f0f + + + +0 +0xffebebeb + + + +0 +0xff0f0f0f + + + +0 +0xff0f0f0f + + + +graphic_CapLeft +Fill.FillColor + + +1 +0xff373737 + + + +0 +0xffebebeb + + + +1 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xff0f0f0f + + + +0 +0xff0f0f0f + + + +0 +0xff0f0f0f + + + +0 +0xff0f0f0f + + + +0 +0xff0f0f0f + + + +0 +0xff0f0f0f + + + +0 +0xff0f0f0f + + + +0 +0xff0f0f0f + + + +graphic_CapRight +Fill.FillColor + + +1 +0xffebebeb + + + +0 +0xff0f0f0f + + + +1 +0xff0f0f0f + + + +0 +0xff0f0f0f + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + + + + +ArrowProgressState +72.000000 +48.000000 + + + +control_for_data_binding_only +155.000000 +23.000000 +8.000000,85.185188,0.000000 +13 +0xff323232 +13.000000 +5136 + + + + +ProgressBody +72.000000 +48.000000 +15 + + + +ArrowOff +72.000000 +48.000000 +Graphics\Arrow_Off.png + + + + +ArrowOn +0.000000 +48.000000 +false +Graphics\Arrow_On.png + + + + +ArrowOn +Anchor +Width +Show + + +0 +0 +0.000000 +false + + + +0 +0 +2.400000 +true + + + +0 +8 +72.000000 +true + + + + + + + +Normal + + + +EndNormal + + + + + + + +FlameProgressState +48.000000 +48.000000 + + + +ProgressBody +48.000000 +48.000000 +207 + + + +FlameOff +48.000000 +48.000000 +Graphics\Flame_Off.png + + + + +FlameOn +48.000000 +0.000000 +48.000000,48.000000,0.000000 +0.000000,-0.000000,-1.000000,0.000000 +false +Graphics\Flame_On.png + + + + +FlameOn +Height +Anchor +Show + + +0 +0.000000 +0 +false + + + +0 +1.600000 +0 +true + + + +0 +48.000000 +8 +true + + + + + + +control_for_data_binding_only +155.000000 +23.000000 +15.000001,80.185188,0.000000 +13 +0xff323232 +13.000000 +5136 + + + + + +Normal + + + +EndNormal + + + + + + + +ItemGridArmour +60.000000 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +CXuiCtrlSlotItemListItem +ItemButtonArmour +..\Images\img1.png +22594 +4 + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + + + + +ItemButtonArmour +42.000000 +42.000000 + + + +image +38.000000 +38.000000 +2.000000,2.000000,0.000000 +15 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +graphic_Highlight +38.000000 +38.000000 +2.000000,2.000000,0.000000 +0.000000 +15 + + +0xff646464 + + + + +0xb4ebebeb + + +4 +0xff828282 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0.000000 +0.592157 +0.627451 +1.000000 + + +90.000000 + + +true +4,0.000000,0.000000,0.000000,0.000000,242.119705,0.000000,1,242.119705,0.000000,242.119705,0.000000,242.119705,31.004648,1,242.119705,31.004648,242.119705,31.004648,0.000000,31.006342,1,0.000000,31.006342,0.000000,31.006342,0.000000,0.000000,1, + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + + +graphic_Highlight +Fill.Gradient.StopPos +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Stroke.StrokeColor +Fill.Gradient.StopColor +Opacity + + +1 +0.627451 +0xff828282 +0xffd2d2d2 +0xffebebeb +0xff646464 +0xffb4b4b4 +0.000000 + + + +0 +0.627451 +0xff828282 +0xffd2d2d2 +0xffebebeb +0xff646464 +0xffb4b4b4 +1.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +1.000000 + + + +0 +0.619608 +0xff829682 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff96c896 +1.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +1.000000 + + + +1 +0.627451 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0xffb4b4b4 +0xffc8c8c8 +0.000000 + + + +0 +0.627451 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0xffb4b4b4 +0xffc8c8c8 +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff647264 +0xffaaafa0 +0.000000 + + + +0 +0.619608 +0xff8cb48c +0xffc3cdc3 +0xffdaebda +0xff648464 +0xff91b18c +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff647264 +0xffaaafa0 +0.000000 + + + +2 +0 +0 +50 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff649664 +0xffaaafa0 +0.000000 + + + + + + +CraftingProgressArrowSmall +32.000000 +32.000000 + + + +ProgressBody +32.000000 +32.000000 +15 + + + +Arrow_Off +32.000000 +32.000000 +Graphics\Arrow_Small_Off.png + + + + +Arrow_On +32.000000 +32.000000 +1 +false +Graphics\Arrow_Small_On.png + + + + +Arrow_On +Show +Width + + +0 +false +32.000000 + + + +0 +true +0.000000 + + + +0 +true +32.000000 + + + +0 +false +32.000000 + + + + + + + +Normal + + + +EndNormal + + + + + + + +FlameProgressStateSmall +32.000000 +32.000000 + + + +ProgressBody +32.000000 +32.000000 +207 + + + +FlameOff +32.000000 +32.000000 +4 +Graphics\Flame_Off_Small.png + + + + +FlameOn +32.000000 +0.000000 +32.000000,32.000000,0.000000 +0.000000,-0.000000,-1.000000,0.000000 +false +Graphics\Flame_On_Small.png + + + + +FlameOn +Height +Anchor +Show + + +0 +0.000000 +0 +false + + + +0 +1.600000 +0 +true + + + +0 +32.000000 +8 +true + + + + + + +control_for_data_binding_only +155.000000 +23.000000 +15.000001,80.185188,0.000000 +13 +0xff323232 +13.000000 +5136 + + + + + +Normal + + + +EndNormal + + + + + + + +ItemButtonArmour26 +26.000000 +26.000000 + + + +image +24.000000 +24.000000 +1.000000,1.000000,0.000000 +15 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +graphic_Highlight +24.000000 +24.000000 +1.000000,1.000000,0.000000 +0.000000 +15 + + +0xff646464 + + + + +0xb4ebebeb + + +4 +0xff828282 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0.000000 +0.592157 +0.627451 +1.000000 + + +90.000000 + + +true +4,0.000000,0.000000,0.000000,0.000000,242.119705,0.000000,1,242.119705,0.000000,242.119705,0.000000,242.119705,31.004648,1,242.119705,31.004648,242.119705,31.004648,0.000000,31.006342,1,0.000000,31.006342,0.000000,31.006342,0.000000,0.000000,1, + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + + +graphic_Highlight +Fill.Gradient.StopPos +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Stroke.StrokeColor +Fill.Gradient.StopColor +Opacity + + +1 +0.627451 +0xff828282 +0xffd2d2d2 +0xffebebeb +0xff646464 +0xffb4b4b4 +0.000000 + + + +0 +0.627451 +0xff828282 +0xffd2d2d2 +0xffebebeb +0xff646464 +0xffb4b4b4 +1.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +1.000000 + + + +0 +0.619608 +0xff829682 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff96c896 +1.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +1.000000 + + + +1 +0.627451 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0xffb4b4b4 +0xffc8c8c8 +0.000000 + + + +0 +0.627451 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0xffb4b4b4 +0xffc8c8c8 +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff647264 +0xffaaafa0 +0.000000 + + + +0 +0.619608 +0xff8cb48c +0xffc3cdc3 +0xffdaebda +0xff648464 +0xff91b18c +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff647264 +0xffaaafa0 +0.000000 + + + +2 +0 +0 +50 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff649664 +0xffaaafa0 +0.000000 + + + + + + +ItemGridArmour26 +26.000000 +26.000000 + + + +control_ListItem +26.000000 +26.000000 +7 +0.000000,50.000000,0.000000 +CXuiCtrlSlotItemListItem +ItemButtonArmour26 +..\Images\img1.png +22594 +4 + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + + + + +ArrowProgressStateSmall +32.000000 +32.000000 + + + +control_for_data_binding_only +155.000000 +23.000000 +8.000000,85.185188,0.000000 +13 +0xff323232 +13.000000 +5136 + + + + +ProgressBody +32.000000 +32.000000 +15 + + + +ArrowOff +32.000000 +32.000000 +Graphics\Arrow_Small_Off.png + + + + +ArrowOn +0.000000 +32.000000 +false +Graphics\Arrow_Small_On.png + + + + +ArrowOn +Anchor +Width +Show + + +0 +0 +0.000000 +false + + + +0 +0 +2.400000 +true + + + +0 +8 +32.000000 +true + + + + + + + +Normal + + + +EndNormal + +stop + + + + + + +EnchantmentButton +240.000000 +42.000000 +15 + + + +button_graphic_disabled +240.000000 +42.000000 +15 +false +Graphics\EnchantmentButtonEmpty.png +48 + + + + +button_graphic +240.000000 +42.000000 +15 +Graphics\EnchantmentButtonActive.png +48 + + + + +button_graphic_selected +240.000000 +42.000000 +15 +false +Graphics\EnchantmentButtonActive.png +48 + + + + +EnchantText +218.000000 +32.000000 +6.000000,5.000000,0.000000 +CXuiCtrlEnchantmentButtonText + + + + +text_Label +40.000000 +26.000000 +194.000000,16.000000,0.000000 +15 +0xff80eb20 +0xff0f0f0f +16.000000 +21013 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +EndFocusDisable + +stop + + + +text_Label +TextColor + + +1 +0xff80eb20 + + + +1 +0xffc6110f + + + +1 +0xffc6110f + + + +1 +0xffc6110f + + + +button_graphic +Show + + +0 +true + + + +0 +true + + + +0 +false + + + +button_graphic_selected +Show +ImagePath + + +0 +false +Graphics\EnchantmentButtonActive.png + + + +0 +false +Graphics\EnchantmentButtonActive.png + + + +0 +true +Graphics\EnchantmentButtonSelected.png + + + +0 +true +Graphics\EnchantmentButtonSelected.png + + + +0 +false +Graphics\EnchantmentButtonSelected.png + + + +button_graphic_disabled +Show + + +0 +false + + + +0 +true + + + +0 +true + + + +0 +true + + + + + + +EnchantmentButton_Small +140.000000 +15 + + + +button_graphic_disabled +140.000000 +15 +false +Graphics\EnchantmentButtonEmpty_small.png +48 + + + + +button_graphic +140.000000 +15 +Graphics\EnchantmentButtonActive_small.png +48 + + + + +button_graphic_selected +140.000000 +15 +false +Graphics\EnchantmentButtonSelected_small.png +48 + + + + +EnchantText +132.000000 +24.000000 +3.000000,3.000000,0.000000 +CXuiCtrlEnchantmentButtonText + + + + +text_Label +30.000000 +18.000000 +106.000000,12.000000,0.000000 +15 +0xff80eb20 +0xff0f0f0f +12.000000 +21013 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +EndFocusDisable + +stop + + + +button_graphic_disabled +Show + + +0 +false + + + +0 +true + + + +0 +true + + + +0 +true + + + +button_graphic +Show + + +0 +true + + + +0 +true + + + +0 +false + + + +button_graphic_selected +Show + + +0 +false + + + +0 +false + + + +0 +true + + + +0 +true + + + +0 +false + + + +text_Label +TextColor + + +1 +0xff80eb20 + + + +1 +0xffc6110f + + + +0 +0xffc6110f + + + +0 +0xffc6110f + + + + + + +ItemGridEnchant +42.000000 +42.000000 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +CXuiCtrlSlotItemListItem +ItemButtonEnchant +22594 +4 + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + + + + +ItemButtonEnchant +42.000000 +42.000000 + + + +Box +42.000000 +42.000000 +15 +4 +Graphics\IconHolder.png +48 + + + + +Icon +38.000000 +38.000000 +2.000000,2.000000,0.000000 +15 +2 +Graphics\Enchant_Slot.png +48 + + + + +image +38.000000 +38.000000 +2.000000,2.000000,0.000000 +15 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +graphic_Highlight +38.000000 +38.000000 +2.000000,2.000000,0.000000 +0.000000 +15 + + +0xff646464 + + + + +0xb4ebebeb + + +4 +0xff828282 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0.000000 +0.592157 +0.627451 +1.000000 + + +90.000000 + + +true +4,0.000000,0.000000,0.000000,0.000000,242.119705,0.000000,1,242.119705,0.000000,242.119705,0.000000,242.119705,31.004648,1,242.119705,31.004648,242.119705,31.004648,0.000000,31.006342,1,0.000000,31.006342,0.000000,31.006342,0.000000,0.000000,1, + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + + +graphic_Highlight +Fill.Gradient.StopPos +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Stroke.StrokeColor +Fill.Gradient.StopColor +Opacity + + +1 +0.627451 +0xff828282 +0xffd2d2d2 +0xffebebeb +0xff646464 +0xffb4b4b4 +0.000000 + + + +0 +0.627451 +0xff828282 +0xffd2d2d2 +0xffebebeb +0xff646464 +0xffb4b4b4 +1.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +1.000000 + + + +0 +0.619608 +0xff829682 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff96c896 +1.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +1.000000 + + + +1 +0.627451 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0xffb4b4b4 +0xffc8c8c8 +0.000000 + + + +0 +0.627451 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0xffb4b4b4 +0xffc8c8c8 +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff647264 +0xffaaafa0 +0.000000 + + + +0 +0.619608 +0xff8cb48c +0xffc3cdc3 +0xffdaebda +0xff648464 +0xff91b18c +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff647264 +0xffaaafa0 +0.000000 + + + +2 +0 +0 +50 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff649664 +0xffaaafa0 +0.000000 + + + + + + +ItemGridEnchant32 +32.000000 +32.000000 + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +CXuiCtrlSlotItemListItem +ItemButtonEnchant32 +22594 +4 + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + + + + +ItemButtonEnchant32 +32.000000 +32.000000 + + + +Box +32.000000 +32.000000 +15 +4 +Graphics\IconHolder_Small.png +48 + + + + +Icon +28.000000 +28.000000 +2.000000,2.000000,0.000000 +15 +2 +Graphics\Enchant_Slot_Small.png +48 + + + + +image +28.000000 +28.000000 +2.000000,2.000000,0.000000 +15 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +graphic_Highlight +28.000000 +28.000000 +2.000000,2.000000,0.000000 +0.000000 +15 + + +0xff646464 + + + + +0xb4ebebeb + + +4 +0xff828282 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0.000000 +0.592157 +0.627451 +1.000000 + + +90.000000 + + +true +4,0.000000,0.000000,0.000000,0.000000,242.119705,0.000000,1,242.119705,0.000000,242.119705,0.000000,242.119705,31.004648,1,242.119705,31.004648,242.119705,31.004648,0.000000,31.006342,1,0.000000,31.006342,0.000000,31.006342,0.000000,0.000000,1, + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + + +graphic_Highlight +Fill.Gradient.StopPos +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Stroke.StrokeColor +Fill.Gradient.StopColor +Opacity + + +1 +0.627451 +0xff828282 +0xffd2d2d2 +0xffebebeb +0xff646464 +0xffb4b4b4 +0.000000 + + + +0 +0.627451 +0xff828282 +0xffd2d2d2 +0xffebebeb +0xff646464 +0xffb4b4b4 +1.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +1.000000 + + + +0 +0.619608 +0xff829682 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff96c896 +1.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +1.000000 + + + +1 +0.627451 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0xffb4b4b4 +0xffc8c8c8 +0.000000 + + + +0 +0.627451 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0xffb4b4b4 +0xffc8c8c8 +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff647264 +0xffaaafa0 +0.000000 + + + +0 +0.619608 +0xff8cb48c +0xffc3cdc3 +0xffdaebda +0xff648464 +0xff91b18c +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff647264 +0xffaaafa0 +0.000000 + + + +2 +0 +0 +50 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff649664 +0xffaaafa0 +0.000000 + + + + + + +ItemButtonBrewing +52.000000 +52.000000 + + + +image +48.000000 +48.000000 +2.000000,2.000000,0.000000 +15 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +graphic_Highlight +48.000000 +48.000000 +2.000000,2.000000,0.000000 +0.000000 +15 + + +0xff646464 + + + + +0xb4ebebeb + + +4 +0xff828282 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0.000000 +0.592157 +0.627451 +1.000000 + + +90.000000 + + +true +4,0.000000,0.000000,0.000000,0.000000,242.119705,0.000000,1,242.119705,0.000000,242.119705,0.000000,242.119705,31.004648,1,242.119705,31.004648,242.119705,31.004648,0.000000,31.006342,1,0.000000,31.006342,0.000000,31.006342,0.000000,0.000000,1, + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + + +graphic_Highlight +Fill.Gradient.StopPos +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Stroke.StrokeColor +Fill.Gradient.StopColor +Opacity + + +1 +0.627451 +0xff828282 +0xffd2d2d2 +0xffebebeb +0xff646464 +0xffb4b4b4 +0.000000 + + + +0 +0.627451 +0xff828282 +0xffd2d2d2 +0xffebebeb +0xff646464 +0xffb4b4b4 +1.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +1.000000 + + + +0 +0.619608 +0xff829682 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff96c896 +1.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +1.000000 + + + +1 +0.627451 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0xffb4b4b4 +0xffc8c8c8 +0.000000 + + + +0 +0.627451 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0xffb4b4b4 +0xffc8c8c8 +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff647264 +0xffaaafa0 +0.000000 + + + +0 +0.619608 +0xff8cb48c +0xffc3cdc3 +0xffdaebda +0xff648464 +0xff91b18c +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff647264 +0xffaaafa0 +0.000000 + + + +2 +0 +0 +50 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff649664 +0xffaaafa0 +0.000000 + + + + + + +ItemGridBrewing36 +36.000000 +36.000000 + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + + + + +ItemGridBrewing +52.000000 +52.000000 + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + + + + +BrewingBackground_Small +128.000000 +108.000000 + + + +Image +128.000000 +108.000000 +Graphics\BrewingStand_small.png +48 + + + + + +BrewingBackground +192.000000 +192.000000 + + + +BrewingStand +192.000000 +192.000000 +15 +Graphics\BrewingStand.png +48 + + + + + +BrewingBubblesProgressState +36.000000 +84.000000 + + + +ProgressBody +36.000000 +84.000000 +207 + + + +BubbleOff +36.000000 +84.000000 +Graphics\BrewingBubbles_Off.png + + + + +BubbleOn +36.000000 +0.000000 +36.000000,84.000000,0.000000 +0.000000,0.000000,-1.000000,0.000000 +false +Graphics\BrewingBubbles_On.png + + + + +BubbleOn +Height +Anchor +Show + + +0 +0.000000 +0 +false + + + +0 +0.000000 +0 +true + + + +0 +84.000000 +8 +true + + + + + + +control_for_data_binding_only +155.000000 +23.000000 +15.000001,80.185188,0.000000 +13 +0xff323232 +13.000000 +5136 + + + + + +Normal + + + +EndNormal + + + + + + + +BrewingBubblesProgressStateSmall +24.000000 +56.000000 + + + +ProgressBody +24.000000 +56.000000 +207 + + + +BubbleOff +36.000000 +84.000000 +Graphics\BrewingBubbles_Small_Off.png +48 + + + + +BubbleOn +24.000000 +0.000000 +24.000000,56.000000,0.000000 +0.000000,0.000000,-1.000000,0.000000 +false +Graphics\BrewingBubbles_Small_On.png +48 + + + + +BubbleOn +Height +Anchor +Show + + +0 +0.000000 +0 +false + + + +0 +0.000000 +0 +true + + + +0 +56.000000 +8 +true + + + + + + +control_for_data_binding_only +155.000000 +23.000000 +15.000001,80.185188,0.000000 +13 +0xff323232 +13.000000 +5136 + + + + + +Normal + + + +EndNormal + + + + + + + +BrewingArrowProgressStateSmall +18.000000 +56.000000 +15 + + + +control_for_data_binding_only +155.000000 +23.000000 +8.000000,85.185188,0.000000 +13 +0xff323232 +13.000000 +5136 + + + + +ProgressBody +18.000000 +56.000000 +15 + + + +ArrowOff +18.000000 +56.000000 +15 +Graphics\BrewingArrow_Small_Off.png +48 + + + + +ArrowOn +18.000000 +0.000000 +15 +false +Graphics\BrewingArrow_Small_On.png +48 + + + + +ArrowOn +Show +Height + + +0 +false +0.000000 + + + +0 +true +56.000000 + + + +0 +true +0.000000 + + + + + + + +Normal + + + +EndNormal + + + + + + + +BrewingArrowProgressState +27.000000 +84.000000 +15 + + + +control_for_data_binding_only +155.000000 +23.000000 +8.000000,85.185188,0.000000 +13 +0xff323232 +13.000000 +5136 + + + + +ProgressBody +27.000000 +84.000000 +15 + + + +ArrowOff +27.000000 +84.000000 +15 +Graphics\BrewingArrow_Off.png +48 + + + + +ArrowOn +27.000000 +0.000000 +15 +false +Graphics\BrewingArrow_On.png +48 + + + + +ArrowOn +Show +Height + + +0 +false +0.000000 + + + +0 +true +84.000000 + + + +0 +true +0.000000 + + + + + + + +Normal + + + +EndNormal + + + + + + + +AnvilCross +15.000000 +15.000000 + + + +AnvilCross +15.000000 +15.000000 +15 +4 +Graphics\AnvilCross.png +48 + + + + + +AnvilPlus +15.000000 +15.000000 + + + +AnvilPlus +15.000000 +15.000000 +15 +4 +Graphics\AnvilPlus.png +48 + + + + + +AnvilHammer +15.000000 +15.000000 + + + +AnvilHammer +15.000000 +15.000000 +15 +4 +Graphics\AnvilHammer.png +48 + + + + + +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 + + + +Text +500.000000 +66.000000 +15 +0xffeb0feb +16.000000 +5137 + + + + + +BossHealthProgress3_480 +400.000000 +15.000000 + + + +ProgressBody +400.000000 +15.000000 + + + +back +406.000000 +15.000000 +-3.000000,0.000000,0.000000 +Graphics\HUD\DragonHealth_Empty3.png +48 + + + + +bar +400.000000 +15.000000 +false +true + + + +bar +400.000000 +15.000000 +Graphics\HUD\DragonHealth_Full3.png +48 + + + + + +design_time_display +400.000000 +15.000000 +15 +false +true + + +1.000000 +0xff646464 + + + + +2 +0xffffffff + + +2 +0xffebebeb +0xff7d7d7d +0.000000 +0.000000 + + + + +true +4,0.000000,0.000000,0.000000,0.000000,170.000000,0.000000,0,170.000000,0.000000,170.000000,0.000000,170.000000,19.000000,0,170.000000,19.000000,170.000000,19.000000,0.000000,19.000000,0,0.000000,19.000000,0.000000,19.000000,0.000000,0.000000,0, + + + + +bar +Show +Width + + +0 +false +400.000000 + + + +0 +true +2.300000 + + + +0 +true +400.000000 + + + + + + + +Normal + + + +EndNormal + + + + + + + +BossHealthProgress2_480 +333.000000 +10.000000 + + + +ProgressBody +333.000000 +10.000000 + + + +back +337.000000 +10.000000 +-2.000000,0.000000,0.000000 +Graphics\HUD\DragonHealth_Empty2.png +48 + + + + +bar +333.000000 +10.000000 +false +true + + + +bar +333.000000 +10.000000 +Graphics\HUD\DragonHealth_Full2.png +48 + + + + + +design_time_display +333.000000 +10.000000 +15 +false +true + + +1.000000 +0xff646464 + + + + +2 +0xffffffff + + +2 +0xffebebeb +0xff7d7d7d +0.000000 +0.000000 + + + + +true +4,0.000000,0.000000,0.000000,0.000000,170.000000,0.000000,0,170.000000,0.000000,170.000000,0.000000,170.000000,19.000000,0,170.000000,19.000000,170.000000,19.000000,0.000000,19.000000,0,0.000000,19.000000,0.000000,19.000000,0.000000,0.000000,0, + + + + +bar +Show +Width + + +0 +false +333.000000 + + + +0 +true +1.665000 + + + +0 +true +333.000000 + + + + + + + +Normal + + + +EndNormal + + + + + + + +BossHealthProgress1_480 +167.000000 +5.000000 + + + +ProgressBody +167.000000 +5.000000 + + + +back +169.000000 +5.000000 +-1.000000,0.000000,0.000000 +Graphics\HUD\DragonHealth_Empty.png +48 + + + + +bar +167.000000 +5.000000 +false +true + + + +bar +167.000000 +5.000000 +Graphics\HUD\DragonHealth_Full.png +48 + + + + + +design_time_display +167.000000 +5.000000 +15 +false +true + + +1.000000 +0xff646464 + + + + +2 +0xffffffff + + +2 +0xffebebeb +0xff7d7d7d +0.000000 +0.000000 + + + + +true +4,0.000000,0.000000,0.000000,0.000000,170.000000,0.000000,0,170.000000,0.000000,170.000000,0.000000,170.000000,19.000000,0,170.000000,19.000000,170.000000,19.000000,0.000000,19.000000,0,0.000000,19.000000,0.000000,19.000000,0.000000,0.000000,0, + + + + +bar +Show +Width + + +0 +false +167.000000 + + + +0 +true +0.835000 + + + +0 +true +167.000000 + + + + + + + +Normal + + + +EndNormal + + + + + + + +BossHealthProgress3 +940.000000 + + + +ProgressBody +940.000000 + + + +back +952.000000 +-6.000000,0.000000,0.000000 +Graphics\HUD\DragonHealth_Empty6.png +48 + + + + +bar +940.000000 +false +true + + + +bar +940.000000 +Graphics\HUD\DragonHealth_Full6.png +48 + + + + + +design_time_display +940.000000 +15 +false +true + + +1.000000 +0xff646464 + + + + +2 +0xffffffff + + +2 +0xffebebeb +0xff7d7d7d +0.000000 +0.000000 + + + + +true +4,0.000000,0.000000,0.000000,0.000000,170.000000,0.000000,0,170.000000,0.000000,170.000000,0.000000,170.000000,19.000000,0,170.000000,19.000000,170.000000,19.000000,0.000000,19.000000,0,0.000000,19.000000,0.000000,19.000000,0.000000,0.000000,0, + + + + +bar +Show +Width + + +0 +false +940.000000 + + + +0 +true +4.700000 + + + +0 +true +940.000000 + + + + + + + +Normal + + + +EndNormal + + + + + + + +BossHealthProgress2 +666.000000 +15.000000 + + + +ProgressBody +666.000000 +15.000000 + + + +back +674.000000 +20.000000 +-4.000000,0.000000,0.000000 +Graphics\HUD\DragonHealth_Empty4.png +48 + + + + +bar +666.000000 +20.000000 +false +true + + + +bar +666.000000 +20.000000 +Graphics\HUD\DragonHealth_Full4.png +48 + + + + + +design_time_display +666.000000 +15.000000 +15 +false +true + + +1.000000 +0xff646464 + + + + +2 +0xffffffff + + +2 +0xffebebeb +0xff7d7d7d +0.000000 +0.000000 + + + + +true +4,0.000000,0.000000,0.000000,0.000000,170.000000,0.000000,0,170.000000,0.000000,170.000000,0.000000,170.000000,19.000000,0,170.000000,19.000000,170.000000,19.000000,0.000000,19.000000,0,0.000000,19.000000,0.000000,19.000000,0.000000,0.000000,0, + + + + +bar +Show +Width + + +0 +false +666.000000 + + + +0 +true +3.330000 + + + +0 +true +666.000000 + + + + + + + +Normal + + + +EndNormal + + + + + + + +BossHealthProgress1 +334.000000 +10.000000 + + + +ProgressBody +334.000000 +10.000000 + + + +back +338.000000 +10.000000 +-2.000000,0.000000,0.000000 +Graphics\HUD\DragonHealth_Empty2.png +48 + + + + +bar +334.000000 +10.000000 +false +true + + + +bar +334.000000 +10.000000 +Graphics\HUD\DragonHealth_Full2.png +48 + + + + + +design_time_display +334.000000 +10.000000 +15 +false +true + + +1.000000 +0xff646464 + + + + +2 +0xffffffff + + +2 +0xffebebeb +0xff7d7d7d +0.000000 +0.000000 + + + + +true +4,0.000000,0.000000,0.000000,0.000000,170.000000,0.000000,0,170.000000,0.000000,170.000000,0.000000,170.000000,19.000000,0,170.000000,19.000000,170.000000,19.000000,0.000000,19.000000,0,0.000000,19.000000,0.000000,19.000000,0.000000,0.000000,0, + + + + +bar +Show +Width + + +0 +false +334.000000 + + + +0 +true +1.670000 + + + +0 +true +334.000000 + + + + + + + +Normal + + + +EndNormal + + + + + + + +HUDHotBarBack +182.000000 +22.000000 + + + +Bar +182.000000 +22.000000 +15 +8 +Graphics\HUD\hotbar_item_back.png +48 + + + + + +ItemHUDHotbar +24.000000 +24.000000 +15 + + + +image +16.000000 +16.000000 +4.000000,4.000000,0.000000 +15 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +Box1 +24.000000 +24.000000 +15 +false +4 +Graphics\HUD\hotbar_item_selected.png +48 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + + +Box1 +Show + + +0 +false + + + +0 +false + + + +0 +true + + + +0 +true + + + + + + +ExperienceProgress +548.000000 +15.000000 + + + +ProgressBody +548.000000 +15.000000 + + + +back +182.000000 +5.000000 +15 +4 +Graphics\HUD\experience_bar_empty.png +48 + + + + +bar +182.000000 +5.000000 +15 +false +true + + + +bar +182.000000 +5.000000 +4 +Graphics\HUD\experience_bar_full.png +48 + + + + + +design_time_display +458.000000 +15.000000 +15 +false +true + + +1.000000 +0xff646464 + + + + +2 +0xffffffff + + +2 +0xffebebeb +0xff7d7d7d +0.000000 +0.000000 + + + + +true +4,0.000000,0.000000,0.000000,0.000000,170.000000,0.000000,0,170.000000,0.000000,170.000000,0.000000,170.000000,19.000000,0,170.000000,19.000000,170.000000,19.000000,0.000000,19.000000,0,0.000000,19.000000,0.000000,19.000000,0.000000,0.000000,0, + + + + +bar +Show +Width + + +0 +false +182.000000 + + + +0 +true +3.330000 + + + +0 +true +182.000000 + + + + + + + +Normal + + + +EndNormal + + + + + + + +ExperienceProgressSmall +274.000000 +7.500000 + + + +ProgressBody +274.000000 +7.500000 + + + +back +274.000000 +7.500000 +15 +4 +Graphics\HUD\experience_bar_empty.png +48 + + + + +bar +548.000000 +7.500000 +15 +false +true + + + +bar +274.000000 +7.500000 +4 +Graphics\HUD\experience_bar_full.png +48 + + + + + +design_time_display +184.000000 +7.500000 +15 +false +true + + +1.000000 +0xff646464 + + + + +2 +0xffffffff + + +2 +0xffebebeb +0xff7d7d7d +0.000000 +0.000000 + + + + +true +4,0.000000,0.000000,0.000000,0.000000,170.000000,0.000000,0,170.000000,0.000000,170.000000,0.000000,170.000000,19.000000,0,170.000000,19.000000,170.000000,19.000000,0.000000,19.000000,0,0.000000,19.000000,0.000000,19.000000,0.000000,0.000000,0, + + + + +bar +Show +Width + + +0 +false +548.000000 + + + +0 +true +3.330000 + + + +0 +true +274.000000 + + + + + + + +Normal + + + +EndNormal + + + + + + + +ExperienceProgress480 +365.000000 +10.000000 + + + +ProgressBody +365.000000 +10.000000 + + + +back +365.000000 +10.000000 +15 +4 +Graphics\HUD\experience_bar_empty.png +48 + + + + +bar +365.000000 +10.000000 +15 +false +true + + + +bar +365.000000 +10.000000 +4 +Graphics\HUD\experience_bar_full.png +48 + + + + + +design_time_display +275.000000 +10.000000 +15 +false +true + + +1.000000 +0xff646464 + + + + +2 +0xffffffff + + +2 +0xffebebeb +0xff7d7d7d +0.000000 +0.000000 + + + + +true +4,0.000000,0.000000,0.000000,0.000000,170.000000,0.000000,0,170.000000,0.000000,170.000000,0.000000,170.000000,19.000000,0,170.000000,19.000000,170.000000,19.000000,0.000000,19.000000,0,0.000000,19.000000,0.000000,19.000000,0.000000,0.000000,0, + + + + +bar +Show +Width + + +0 +false +365.000000 + + + +0 +true +3.330000 + + + +0 +true +274.000000 + + + + + + + +Normal + + + +EndNormal + + + + + + + +HudHealth +9.000000 +9.000000 + + + +Border +9.000000 +9.000000 +15 +8 +Graphics\HUD\Health_Background.png +48 + + + + +Heart +9.000000 +9.000000 +15 +false +8 +48 + + + + + +Normal + +stop + + +Half + +stop + + +Full + +stop + + +HalfPoison + +stop + + +FullPoison + +stop + + +NormalFlash + +stop + + +HalfFlash + +stop + + +FullFlash + +stop + + +HalfPoisonFlash + +stop + + +FullPoisonFlash + +stop + + +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 +ImagePath + + +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 + + + +0 +Graphics\HUD\Health_Background.png + + + +0 +Graphics\HUD\Health_Background_Flash.png + + + +Heart +Show +ImagePath + + +0 +false + + + + +0 +true +Graphics\HUD\Health_Half.png + + + +0 +true +Graphics\HUD\Health_Full.png + + + +0 +true +Graphics\HUD\Health_Half_Poison.png + + + +0 +true +Graphics\HUD\Health_Full_Poison.png + + + +0 +false + + + + +0 +true +Graphics\HUD\Health_Half_Flash.png + + + +0 +true +Graphics\HUD\Health_Full_Flash.png + + + +0 +true +Graphics\HUD\Health_Half_Poison_Flash.png + + + +0 +true +Graphics\HUD\Health_Full_Poison_Flash.png + + + +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 + + + + + + +HudArmour +9.000000 +9.000000 + + + +Icon +9.000000 +9.000000 +15 +8 +Graphics\HUD\HUD_Armour_Empty.png +48 + + + + + +Normal + +stop + + +Half + +stop + + +Full + +stop + + + +Icon +ImagePath + + +0 +Graphics\HUD\HUD_Armour_Empty.png + + + +0 +Graphics\HUD\HUD_Armour_Half.png + + + +0 +Graphics\HUD\HUD_Armour_Full.png + + + + + + +HudFood +9.000000 +9.000000 + + + +Border +9.000000 +9.000000 +15 +8 +Graphics\HUD\HUD_Food_Background.png +48 + + + + +Shank +9.000000 +9.000000 +15 +false +8 +48 + + + + + +Normal + +stop + + +Half + +stop + + +Full + +stop + + +HalfPoison + +stop + + +FullPoison + +stop + + +NormalFlash + +stop + + +HalfFlash + +stop + + +FullFlash + +stop + + +HalfPoisonFlash + +stop + + +FullPoisonFlash + +stop + + +NormalPoison + +stop + + + +Border +ImagePath + + +0 +Graphics\HUD\HUD_Food_Background.png + + + +0 +Graphics\HUD\HUD_Food_Background_Poison.png + + + +0 +Graphics\HUD\HUD_Food_Background_Flash.png + + + +0 +Graphics\HUD\HUD_Food_Background_Poison.png + + + +Shank +Show +ImagePath + + +0 +false + + + + +0 +true +Graphics\HUD\HUD_Food_Half.png + + + +0 +true +Graphics\HUD\HUD_Food_Full.png + + + +0 +true +Graphics\HUD\HUD_Food_Half_Poison.png + + + +0 +true +Graphics\HUD\HUD_Food_Full_Poison.png + + + +0 +false + + + + +0 +true +Graphics\HUD\HUD_Food_Half_Flash.png + + + +0 +true +Graphics\HUD\HUD_Food_Full_Flash.png + + + +0 +true +Graphics\HUD\HUD_Food_Half_Poison_Flash.png + + + +0 +true +Graphics\HUD\HUD_Food_Full_Poison_Flash.png + + + +0 +false +Graphics\HUD\HUD_Food_Full_Poison_Flash.png + + + + + + +HudAir +9.000000 +9.000000 + + + +Icon +9.000000 +9.000000 +15 +8 +Graphics\HUD\HUD_Air_Bubble.png +48 + + + + + +Bubble + +stop + + +Pop + +stop + + + +Icon +ImagePath + + +0 +Graphics\HUD\HUD_Air_Bubble.png + + + +0 +Graphics\HUD\HUD_Air_Pop.png + + + + + + +HudCrosshair +15.000000 +15.000000 + + + +Icon +15.000000 +15.000000 +15 +8 +Graphics\HUD\HUD_Crosshair.png +48 + + + + + +HudXPLevel +116.000000 +16.000000 + + + +Text1 +116.000000 +16.000000 +1.000000,1.000000,0.000000 +15 +0xff0f0f0f +0xff0f0f0f +8.000000 +21504 + + + + +Text2 +116.000000 +16.000000 +-1.000000,1.000000,0.000000 +15 +0xff0f0f0f +8.000000 +21504 + + + + +Text3 +116.000000 +16.000000 +1.000000,-1.000000,0.000000 +15 +0xff0f0f0f +8.000000 +21504 + + + + +Text4 +116.000000 +16.000000 +-1.000000,-1.000000,0.000000 +15 +0xff0f0f0f +8.000000 +21504 + + + + +Text5 +116.000000 +16.000000 +1.000000,0.000000,0.000000 +15 +0xff0f0f0f +0xff0f0f0f +8.000000 +21504 + + + + +Text6 +116.000000 +16.000000 +-1.000000,0.000000,0.000000 +15 +0xff0f0f0f +8.000000 +21504 + + + + +Text7 +116.000000 +16.000000 +0.000000,-1.000000,0.000000 +15 +0xff0f0f0f +8.000000 +21504 + + + + +Text8 +116.000000 +16.000000 +0.000000,1.000000,0.000000 +15 +0xff0f0f0f +8.000000 +21504 + + + + +Text +116.000000 +16.000000 +15 +0xff80eb20 +8.000000 +21504 + + + + + +XuiHtmlControl_H2P +50.000000 +50.000000 +15 + + + +graphic_groupbackground +92.000000 +102.000000 +-20.000000,-20.000000,0.000000 +15 + + + +Bot_R +8.000000 +8.000000 +84.000000,94.000000,0.000000 +12 +Graphics\PanelsAndTabs\PointerTextPanel_BR.png +48 + + + + +Bot_M +76.000000 +8.000000 +8.000000,94.000000,0.000000 +13 +4 +Graphics\PanelsAndTabs\PointerTextPanel_BM.png +48 + + + + +Bot_L +8.000000 +8.000000 +0.000000,94.000000,0.000000 +9 +Graphics\PanelsAndTabs\PointerTextPanel_BL.png +48 + + + + +Top_R +8.000000 +8.000000 +84.000000,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\PointerTextPanel_TR.png +48 + + + + +Top_M +76.000000 +8.000000 +8.000000,0.000000,0.000000 +7 +4 +Graphics\PanelsAndTabs\PointerTextPanel_TM.png +48 + + + + +Top_L +8.000000 +8.000000 +3 +Graphics\PanelsAndTabs\PointerTextPanel_TL.png +48 + + + + +Mid_R +8.000000 +86.000000 +84.000000,8.000000,0.000000 +14 +4 +Graphics\PanelsAndTabs\PointerTextPanel_MR.png +48 + + + + +Mid_M +76.000000 +86.000000 +8.000000,8.000000,0.000000 +15 +4 +Graphics\PanelsAndTabs\PointerTextPanel_MM.png +48 + + + + +Mid_L +8.000000 +86.000000 +0.000000,8.000000,0.000000 +11 +4 +Graphics\PanelsAndTabs\PointerTextPanel_ML.png +48 + + + + + +HtmlPresenter +50.000000 +52.000000 +15 +true + + + + +ScrollUp +32.000000 +22.000000 +-12.000000,51.000000,0.000000 +12 +XuiScrollEndUp + + + + +ScrollDown +32.000000 +22.000000 +20.000000,51.000000,0.000000 +12 +XuiScrollEnd +1 + + + + + +Normal + + + +EndNormal + +stop + + +ScrollMore + + + +EndScrollMore + +stop + + +Scrolling + + + +EndScrolling + +gotoandplay +Scrolling + + + + + + +XuiHtmlControl_H2P_Small +50.000000 +50.000000 +15 + + + +graphic_groupbackground +72.000000 +98.000000 +-10.000000,-10.000000,0.000000 +15 + + + +Bot_R +8.000000 +8.000000 +64.000000,90.000000,0.000000 +12 +Graphics\PanelsAndTabs\PointerTextPanel_BR.png +48 + + + + +Bot_M +56.000000 +8.000000 +8.000000,90.000000,0.000000 +13 +4 +Graphics\PanelsAndTabs\PointerTextPanel_BM.png +48 + + + + +Bot_L +8.000000 +8.000000 +0.000000,90.000000,0.000000 +9 +Graphics\PanelsAndTabs\PointerTextPanel_BL.png +48 + + + + +Top_R +8.000000 +8.000000 +64.000000,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\PointerTextPanel_TR.png +48 + + + + +Top_M +56.000000 +8.000000 +8.000000,0.000000,0.000000 +7 +4 +Graphics\PanelsAndTabs\PointerTextPanel_TM.png +48 + + + + +Top_L +8.000000 +8.000000 +3 +Graphics\PanelsAndTabs\PointerTextPanel_TL.png +48 + + + + +Mid_R +8.000000 +82.000000 +64.000000,8.000000,0.000000 +14 +4 +Graphics\PanelsAndTabs\PointerTextPanel_MR.png +48 + + + + +Mid_M +56.000000 +82.000000 +8.000000,8.000000,0.000000 +15 +4 +Graphics\PanelsAndTabs\PointerTextPanel_MM.png +48 + + + + +Mid_L +8.000000 +82.000000 +0.000000,8.000000,0.000000 +11 +4 +Graphics\PanelsAndTabs\PointerTextPanel_ML.png +48 + + + + + +HtmlPresenter +50.000000 +50.000000 +15 +true + + + + +ScrollDown +32.000000 +22.000000 +19.000000,56.000000,0.000000 +12 +XuiScrollEnd +1 + + + + +ScrollUp +32.000000 +22.000000 +-15.000000,56.000000,0.000000 +12 +XuiScrollEndUp + + + + + +XuiHtmlControl_Small +50.000000 +50.000000 +15 + + + +HtmlPresenter +50.000000 +50.000000 +15 +true + + + + +ScrollDown +22.000000 +15.000000 +24.000000,54.000000,0.000000 +12 +XuiScrollEnd +1 + + + + +ScrollUp +22.000000 +15.000000 +0.000000,54.000000,0.000000 +12 +XuiScrollEndUp + + + + + +Normal + + + +EndNormal + +stop + + +ScrollMore + + + +EndScrollMore + +stop + + +Scrolling + + + +EndScrolling + +gotoandplay +Scrolling + + + + + + +XuiHtmlControl_EndStory +50.000000 +50.000000 +15 + + + +HtmlPresenter +50.000000 +50.000000 +15 +true + + + + + +SkinSelectSelectedBackgroundSmall +224.000000 +25.000000 + + + +BorderTextPanel +220.000000 +21.000000 +2.000027,2.000000,0.000000 + + +0xff0fc70f + + + + +0xc80fa2eb +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,5.000000,0.000000,0,5.000000,0.000000,5.000000,0.000000,5.000000,345.000000,0,5.000000,345.000000,5.000000,345.000000,0.000000,345.000000,0,0.000000,345.000000,0.000000,345.000000,0.000000,0.000000,0, + + + + +BorderLeft +2.000000 +21.000000 +222.000015,2.000000,0.000000 + + +0xff0fc70f + + + + +0xc8b4b4b4 +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,5.000000,0.000000,0,5.000000,0.000000,5.000000,0.000000,5.000000,345.000000,0,5.000000,345.000000,5.000000,345.000000,0.000000,345.000000,0,0.000000,345.000000,0.000000,345.000000,0.000000,0.000000,0, + + + + +BorderRight +2.000000 +21.000000 +0.000019,2.000000,0.000000 + + +0xff0fc70f + + + + +0xc8323232 +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,5.000000,0.000000,0,5.000000,0.000000,5.000000,0.000000,5.000000,345.000000,0,5.000000,345.000000,5.000000,345.000000,0.000000,345.000000,0,0.000000,345.000000,0.000000,345.000000,0.000000,0.000000,0, + + + + +BorderBottom +224.000000 +2.000000 +0.000019,0.000000,0.000000 + + +0xff0fc70f + + + + +0xc8323232 +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,5.000000,0.000000,0,5.000000,0.000000,5.000000,0.000000,5.000000,345.000000,0,5.000000,345.000000,5.000000,345.000000,0.000000,345.000000,0,0.000000,345.000000,0.000000,345.000000,0.000000,0.000000,0, + + + + +BorderTop +224.000000 +2.000000 +0.000019,23.000000,0.000000 + + +0xff0fc70f + + + + +0xc8b4b4b4 +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,5.000000,0.000000,0,5.000000,0.000000,5.000000,0.000000,5.000000,345.000000,0,5.000000,345.000000,5.000000,345.000000,0.000000,345.000000,0,0.000000,345.000000,0.000000,345.000000,0.000000,0.000000,0, + + + + + +SkinSelectSelectedBackground +224.000000 +32.000000 + + + +BorderTextPanel +220.000000 +28.000000 +2.000008,2.000000,0.000000 + + +0xff0fc70f + + + + +0xc80fa2eb +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,5.000000,0.000000,0,5.000000,0.000000,5.000000,0.000000,5.000000,345.000000,0,5.000000,345.000000,5.000000,345.000000,0.000000,345.000000,0,0.000000,345.000000,0.000000,345.000000,0.000000,0.000000,0, + + + + +BorderLeft +2.000000 +28.000000 +222.000000,2.000000,0.000000 + + +0xff0fc70f + + + + +0xc8b4b4b4 +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,5.000000,0.000000,0,5.000000,0.000000,5.000000,0.000000,5.000000,345.000000,0,5.000000,345.000000,5.000000,345.000000,0.000000,345.000000,0,0.000000,345.000000,0.000000,345.000000,0.000000,0.000000,0, + + + + +BorderRight +2.000000 +28.000000 +0.000000,2.000000,0.000000 + + +0xff0fc70f + + + + +0xc8323232 +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,5.000000,0.000000,0,5.000000,0.000000,5.000000,0.000000,5.000000,345.000000,0,5.000000,345.000000,5.000000,345.000000,0.000000,345.000000,0,0.000000,345.000000,0.000000,345.000000,0.000000,0.000000,0, + + + + +BorderBottom +224.000000 +2.000000 + + +0xff0fc70f + + + + +0xc8323232 +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,5.000000,0.000000,0,5.000000,0.000000,5.000000,0.000000,5.000000,345.000000,0,5.000000,345.000000,5.000000,345.000000,0.000000,345.000000,0,0.000000,345.000000,0.000000,345.000000,0.000000,0.000000,0, + + + + +BorderTop +224.000000 +2.000000 +0.000000,30.000000,0.000000 + + +0xff0fc70f + + + + +0xc8b4b4b4 +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,5.000000,0.000000,0,5.000000,0.000000,5.000000,0.000000,5.000000,345.000000,0,5.000000,345.000000,5.000000,345.000000,0.000000,345.000000,0,0.000000,345.000000,0.000000,345.000000,0.000000,0.000000,0, + + + + + +SkinSelectTabBarNormal +1280.000000 +62.000000 + + + +Image +1280.000000 +62.000000 +5 +4 +Graphics\PanelsAndTabs\SkinSelect_TabBar.png +48 + + + + + +SkinSelectTabBarSelected +1280.000000 +62.000000 + + + +Image +1280.000000 +62.000000 +-0.000008,0.000000,0.000000 +5 +4 +Graphics\PanelsAndTabs\SkinSelect_TabBar_Selected.png +48 + + + + + +SkinSelectTabBarSelectedSmall +640.000000 +44.000000 + + + +Image +640.000000 +44.000000 +-0.000008,0.000000,0.000000 +5 +4 +Graphics\PanelsAndTabs\SkinSelect_TabBarSmall_Selected.png +48 + + + + + +SkinSelectTabBarNormalSmall +640.000000 +44.000000 + + + +Image +640.000000 +44.000000 +5 +4 +Graphics\PanelsAndTabs\SkinSelect_TabBarSmall.png +48 + + + + + +SkinSelectPadlock +32.000000 +32.000000 + + + +Locked +32.000000 +32.000000 +Graphics\Padlock_Small.png + + + + + +SkinSelectTabNormalSmall +580.000000 +270.000000 + + + +Image +580.000000 +270.000000 +15 +Graphics\PanelsAndTabs\SkinSelect_TabBarSmallPanel.png +48 + + + + + +SkinSelectTabSelectedSmall +580.000000 +270.000000 + + + +Image +580.000000 +270.000000 +15 +Graphics\PanelsAndTabs\SkinSelect_TabBarSmallPanel_Selected.png +48 + + + + + +XuiSkinSelectSectionBackground +100.000000 +100.000000 +15 + + + +Background +108.000000 +108.000000 +-4.000000,-4.000000,0.000000 +0.000000 +15 + + +0xff0f0f80 + + + + +0xffa0a0a0 +2 +2 +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,89.000000,0.000000,0,89.000000,0.000000,89.000000,0.000000,89.000000,37.000000,0,89.000000,37.000000,89.000000,37.000000,0.000000,37.000000,0,0.000000,37.000000,0.000000,37.000000,0.000000,0.000000,0, + + + + +graphic_groupbackground +100.000000 +100.000000 +15 + + + +Bot_R +16.000000 +16.000000 +84.000000,84.001953,0.000000 +12 +Graphics\PanelsAndTabs\Square_Recess_Bot_R.png +48 + + + + +Bot_M +68.000000 +16.000000 +16.000000,84.001953,0.000000 +13 +4 +Graphics\PanelsAndTabs\Square_Recess_Bot_M.png +48 + + + + +Bot_L +16.000000 +16.000000 +0.000000,84.001953,0.000000 +9 +Graphics\PanelsAndTabs\Square_Recess_Bot_L.png +48 + + + + +Top_R +16.000000 +16.000000 +84.000000,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\Square_Recess_Top_R.png +48 + + + + +Top_M +68.000000 +16.000000 +16.000000,0.000000,0.000000 +7 +4 +Graphics\PanelsAndTabs\Square_Recess_Top_M.png +48 + + + + +Top_L +16.000000 +16.000000 +3 +Graphics\PanelsAndTabs\Square_Recess_Top_L.png +48 + + + + +Mid_R +16.000000 +68.000000 +84.000000,16.000000,0.000000 +14 +4 +Graphics\PanelsAndTabs\Square_Recess_Mid_R.png +48 + + + + +Mid_M +68.000000 +68.000000 +16.000000,16.000000,0.000000 +15 +4 +Graphics\PanelsAndTabs\Square_Recess_Mid_M.png +48 + + + + +Mid_L +16.000000 +68.000000 +0.000000,16.000000,0.000000 +11 +4 +Graphics\PanelsAndTabs\Square_Recess_Mid_L.png +48 + + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + +InitFocus + + + +EndInitFocus + +stop + + + +Background +Fill.FillColor +Opacity + + +0 +0xffa0a0a0 +0.000000 + + + +0 +0xffa0a0a0 +0.000000 + + + +0 +0xffebeb0f +1.000000 + + + +0 +0xffebeb0f +1.000000 + + + +0 +0xffebeb0f +1.000000 + + + +0 +0xffebeb0f +1.000000 + + + + + + +XuiSkinPackButton +348.000000 +42.000000 +15 + + + +button_graphicTab +348.000000 +42.000000 +false +Graphics\PanelsAndTabs\SkinSelect_TabNormal.png +48 + + + + +button_graphicTabSelected +348.000000 +42.000000 +Graphics\PanelsAndTabs\SkinSelect_TabNormal_Selected.png +48 + + + + +text_Label +334.000000 +32.000000 +7.000016,6.000000,0.000000 +5 +0xff323232 +0xff0f0f0f +16.000000 +21524 + + + + + +Normal + + + +EndNormal + +stop + + +NormalDisable + + + +EndNormalDisable + +stop + + +Focus + + + +EndFocus + +stop + + + +text_Label +TextColor +Position + + +0 +0xff323232 +7.000016,6.000000,0.000000 + + + +0 +0xff323232 +7.000016,6.000000,0.000000 + + + +0 +0xff646464 +7.000017,6.000000,0.000000 + + + +0 +0xff646464 +7.000017,6.000000,0.000000 + + + +0 +0xff323232 +7.000016,6.000000,0.000000 + + + +0 +0xff323232 +7.000016,6.000000,0.000000 + + + +button_graphicTab +Show + + +0 +false + + + +0 +false + + + +0 +true + + + +0 +true + + + +0 +false + + + +0 +false + + + +button_graphicTabSelected +Show +ImagePath + + +0 +true +Graphics\PanelsAndTabs\SkinSelect_TabNormal_Selected.png + + + +0 +true +Graphics\PanelsAndTabs\SkinSelect_TabNormal_Selected.png + + + +0 +false +Graphics\PanelsAndTabs\SkinSelect_TabNormal.png + + + +0 +false +Graphics\PanelsAndTabs\SkinSelect_TabNormal.png + + + +0 +true +Graphics\PanelsAndTabs\SkinSelect_TabNormal_Selected.png + + + +0 +true +Graphics\PanelsAndTabs\SkinSelect_TabNormal_Selected.png + + + + + + +XuiSkinPackButtonCenter +348.000000 +42.000000 +15 + + + +highlight_graphicTab +376.000000 +54.000000 +-14.000015,-6.000000,0.000000 +Graphics\PanelsAndTabs\SkinSelect_TabOver.png +48 + + + + +highlight_graphicTabSelected +376.000000 +54.000000 +-14.000015,-6.000000,0.000000 +false +Graphics\PanelsAndTabs\SkinSelect_TabOver_Selected.png +48 + + + + +Mask +376.000000 +18.000000 +-14.000015,30.000000,0.000000 +true + + + +highlight_graphicTab1 +376.000000 +58.000000 +0.000000,-40.000000,0.000000 +0.000000,58.000000,0.000000 +Graphics\PanelsAndTabs\SkinSelect_TabOver.png +48 + + + + + +MaskSelected +376.000000 +18.000000 +-14.000015,30.000000,0.000000 +false +true + + + +highlight_graphicTab1 +376.000000 +58.000000 +0.000000,-40.000000,0.000000 +0.000000,58.000000,0.000000 +Graphics\PanelsAndTabs\SkinSelect_TabOver_Selected.png +48 + + + + + +text_Label +334.000000 +32.000000 +7.000016,8.000000,0.000000 +5 +0xff505050 +0xff0f0f0f +16.000000 +21524 + + + + +text_Label1 +334.000000 +32.000000 +7.000016,8.000000,0.000000 +5 +false +0xff505050 +0xff0f0f0f +16.000000 +21524 + + + + + +Normal + + + +EndNormal + +stop + + +NormalDisable + + + +EndNormalDisable + +stop + + +Focus + + + +EndFocus + +stop + + + +text_Label +TextColor +Position + + +0 +0xff505050 +7.000016,8.000000,0.000000 + + + +0 +0xff505050 +7.000016,8.000000,0.000000 + + + +0 +0xff8c8c8c +7.000017,8.000000,0.000000 + + + +0 +0xff8c8c8c +7.000017,8.000000,0.000000 + + + +0 +0xff0f0f0f +7.000016,-2.000000,0.000000 + + + +0 +0xff0f0f0f +7.000016,-2.000000,0.000000 + + + +highlight_graphicTab +Opacity +Position + + +0 +1.000000 +-14.000015,-6.000000,0.000000 + + + +0 +1.000000 +-14.000015,-6.000000,0.000000 + + + +0 +1.000000 +-14.000015,-6.000000,0.000000 + + + +0 +1.000000 +-14.000015,-6.000000,0.000000 + + + +0 +1.000000 +-13.999986,-14.000000,0.000000 + + + +0 +100000.000000 +-14.000015,-14.000000,0.000000 + + + +highlight_graphicTabSelected +Opacity +Position +Show + + +0 +1.000000 +-14.000015,-6.000000,0.000000 +false + + + +0 +1.000000 +-14.000015,-6.000000,0.000000 +false + + + +0 +1.000000 +-14.000015,-6.000000,0.000000 +false + + + +0 +1.000000 +-14.000015,-6.000000,0.000000 +false + + + +0 +1.000000 +-13.999986,-16.000000,0.000000 +true + + + +0 +100000.000000 +-14.000015,-16.000000,0.000000 +true + + + +Mask +Show + + +0 +true + + + +0 +true + + + +0 +false + + + +0 +false + + + +MaskSelected +Show + + +0 +false + + + +0 +false + + + +0 +true + + + +0 +true + + + +text_Label1 +TextColor +Position + + +0 +0xff505050 +7.000016,8.000000,0.000000 + + + +0 +0xff505050 +7.000016,8.000000,0.000000 + + + +0 +0xff8c8c8c +7.000017,8.000000,0.000000 + + + +0 +0xff8c8c8c +7.000017,8.000000,0.000000 + + + +0 +0xffebeb0f +5.000016,-2.000000,0.000000 + + + +0 +0xffebeb0f +5.000016,-2.000000,0.000000 + + + + + + +XuiSkinPackButtonSmall +180.000000 +40.000000 +15 + + + +ButtonGraphic +180.000000 +31.000000 +false +Graphics\PanelsAndTabs\SkinSelect_TabNormalSmall.png +48 + + + + +ButtonGraphicSelected +180.000000 +31.000000 +Graphics\PanelsAndTabs\SkinSelect_TabNormalSmall_Selected.png +48 + + + + +text_Label +168.000000 +28.000000 +5.000000,2.000000,0.000000 +5 +0xff323232 +0xff0f0f0f +13.000000 +21524 + + + + + +Normal + + + +EndNormal + +stop + + +NormalDisable + + + +EndNormalDisable + +stop + + +Focus + + + +EndFocus + +stop + + + +text_Label +TextColor + + +1 +0xff323232 + + + +1 +0xff323232 + + + +1 +0xff646464 + + + +1 +0xff646464 + + + +0 +0xff323232 + + + +0 +0xff323232 + + + +ButtonGraphic +ImagePath +Show + + +0 +Graphics\PanelsAndTabs\SkinSelect_TabNormalSmall.png +false + + + +0 +Graphics\PanelsAndTabs\SkinSelect_TabNormalSmall.png +false + + + +0 +Graphics\PanelsAndTabs\SkinSelect_TabNormalSmall.png +true + + + +0 +Graphics\PanelsAndTabs\SkinSelect_TabNormalSmall.png +true + + + +0 +Graphics\PanelsAndTabs\SkinSelect_TabNormalSmall_Selected.png +false + + + +0 +Graphics\PanelsAndTabs\SkinSelect_TabNormalSmall_Selected.png +false + + + +ButtonGraphicSelected +ImagePath +Show + + +0 +Graphics\PanelsAndTabs\SkinSelect_TabNormalSmall_Selected.png +true + + + +0 +Graphics\PanelsAndTabs\SkinSelect_TabNormalSmall_Selected.png +true + + + +0 +Graphics\PanelsAndTabs\SkinSelect_TabNormalSmall_Selected.png +false + + + +0 +Graphics\PanelsAndTabs\SkinSelect_TabNormalSmall.png +false + + + +0 +Graphics\PanelsAndTabs\SkinSelect_TabNormalSmall_Selected.png +true + + + +0 +Graphics\PanelsAndTabs\SkinSelect_TabNormalSmall_Selected.png +true + + + + + + +XuiSkinPackButtonCentreSmall +180.000000 +40.000000 +15 + + + +XuiImage1 +180.000000 +38.000000 +0.000000,2.000000,0.000000 +Graphics\PanelsAndTabs\SkinSelect_TabOverSmall.png +48 + + + + +Mask +180.000000 +10.000000 +0.000000,30.000000,0.000000 +true + + + +XuiImage2 +180.000000 +40.000000 +0.000000,-30.000000,0.000000 +Graphics\PanelsAndTabs\SkinSelect_TabOverSmall.png +48 + + + + + +Mask1 +180.000000 +10.000000 +0.000000,30.000000,0.000000 +false +true + + + +XuiImage2 +180.000000 +40.000000 +0.000000,-30.000000,0.000000 +Graphics\PanelsAndTabs\SkinSelect_TabOverSmall_Selected.png +48 + + + + + +text_Label +168.000000 +28.000000 +6.000000,8.000000,0.000000 +5 +0xff323232 +0xff0f0f0f +13.000000 +21524 + + + + +text_Label1 +168.000000 +28.000000 +5.000000,8.000000,0.000000 +5 +false +0xff505050 +0xff0f0f0f +13.000000 +21524 + + + + + +Normal + + + +EndNormal + +stop + + +NormalDisable + + + +EndNormalDisable + +stop + + +Focus + + + +EndFocus + +stop + + + +text_Label +TextColor +Position + + +1 +0xff323232 +6.000000,8.000000,0.000000 + + + +1 +0xff323232 +6.000000,8.000000,0.000000 + + + +1 +0xff787878 +6.000000,8.000000,0.000000 + + + +1 +0xff787878 +6.000000,8.000000,0.000000 + + + +0 +0xff323232 +6.000000,2.000000,0.000000 + + + +0 +0xff323232 +6.000000,2.000000,0.000000 + + + +XuiImage1 +Height +Position +ImagePath + + +0 +38.000000 +0.000000,2.000000,0.000000 +Graphics\PanelsAndTabs\SkinSelect_TabOverSmall.png + + + +0 +38.000000 +0.000000,2.000000,0.000000 +Graphics\PanelsAndTabs\SkinSelect_TabOverSmall.png + + + +0 +40.000000 +0.000000,-4.000000,0.000000 +Graphics\PanelsAndTabs\SkinSelect_TabOverSmall_Selected.png + + + +0 +40.000000 +0.000000,-4.000000,0.000000 +Graphics\PanelsAndTabs\SkinSelect_TabOverSmall_Selected.png + + + +Mask1 +Show + + +0 +false + + + +0 +false + + + +0 +true + + + +0 +true + + + +text_Label1 +TextColor +Position + + +1 +0xff505050 +5.000000,8.000000,0.000000 + + + +1 +0xff505050 +5.000000,8.000000,0.000000 + + + +1 +0xff8c8c8c +5.000000,8.000000,0.000000 + + + +1 +0xff8c8c8c +5.000000,8.000000,0.000000 + + + +0 +0xffebeb0f +3.000000,2.000000,0.000000 + + + +0 +0xffebeb0f +3.000000,2.000000,0.000000 + + + + + + +XuiSkinSelectSBckgrndSmall +100.000000 +100.000000 +15 + + + +Background +104.000000 +104.000000 +-2.000000,-2.000000,0.000000 +0.000000 +15 + + +0xff0f0f80 + + + + +0xffa0a0a0 +2 +2 +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,89.000000,0.000000,0,89.000000,0.000000,89.000000,0.000000,89.000000,37.000000,0,89.000000,37.000000,89.000000,37.000000,0.000000,37.000000,0,0.000000,37.000000,0.000000,37.000000,0.000000,0.000000,0, + + + + +graphic_groupbackground +100.000000 +100.000000 +15 +true + + + +Bot_R +16.000000 +16.000000 +84.000000,84.001953,0.000000 +12 +Graphics\PanelsAndTabs\Square_Recess_Bot_R.png +48 + + + + +Bot_M +68.000000 +16.000000 +16.000000,84.001953,0.000000 +13 +4 +Graphics\PanelsAndTabs\Square_Recess_Bot_M.png +48 + + + + +Bot_L +16.000000 +16.000000 +0.000000,84.001953,0.000000 +9 +Graphics\PanelsAndTabs\Square_Recess_Bot_L.png +48 + + + + +Top_R +16.000000 +16.000000 +84.000000,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\Square_Recess_Top_R.png +48 + + + + +Top_M +68.000000 +16.000000 +16.000000,0.000000,0.000000 +7 +4 +Graphics\PanelsAndTabs\Square_Recess_Top_M.png +48 + + + + +Top_L +16.000000 +16.000000 +3 +Graphics\PanelsAndTabs\Square_Recess_Top_L.png +48 + + + + +Mid_R +16.000000 +68.000000 +84.000000,16.000000,0.000000 +14 +4 +Graphics\PanelsAndTabs\Square_Recess_Mid_R.png +48 + + + + +Mid_M +68.000000 +68.000000 +16.000000,16.000000,0.000000 +15 +4 +Graphics\PanelsAndTabs\Square_Recess_Mid_M.png +48 + + + + +Mid_L +16.000000 +68.000000 +0.000000,16.000000,0.000000 +11 +4 +Graphics\PanelsAndTabs\Square_Recess_Mid_L.png +48 + + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + +InitFocus + + + +EndInitFocus + +stop + + + +Background +Fill.FillColor +Opacity + + +0 +0xffa0a0a0 +0.000000 + + + +0 +0xffa0a0a0 +0.000000 + + + +0 +0xffebeb0f +1.000000 + + + +0 +0xffebeb0f +1.000000 + + + +0 +0xffebeb0f +1.000000 + + + +0 +0xffebeb0f +1.000000 + + + + + + +ItemBanner +64.000000 +64.000000 + + + +image +64.000000 +64.000000 +15 +CXuiCtrl4JIcon +XuiVisImPresenterCentreNoScale + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + + + + + +DLC_PriceTag +440.000000 +36.000000 + + + +PlainBox +440.000000 +36.000000 + + +0xff0f0f80 + + + + +0xffeb8b0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,92.000000,0.000000,0,92.000000,0.000000,92.000000,0.000000,92.000000,63.000000,0,92.000000,63.000000,92.000000,63.000000,0.000000,63.000000,0,0.000000,63.000000,0.000000,63.000000,0.000000,0.000000,0, + + + + +Text +160.000000 +270.000000,2.000000,0.000000 +15 +0xffffffff +0xff000000 +16.000000 +4625 + + + + + +ItemBanner480 +64.000000 +64.000000 + + + +image +64.000000 +64.000000 +15 +CXuiCtrl4JIcon +XuiVisualImagePresenterCentre + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + + + + + +DLC_PriceTag480 +224.000000 +26.000000 + + + +PlainBox +226.000000 +26.000000 + + +0xff0f0f80 + + + + +0xffeb8b0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,92.000000,0.000000,0,92.000000,0.000000,92.000000,0.000000,92.000000,63.000000,0,92.000000,63.000000,92.000000,63.000000,0.000000,63.000000,0,0.000000,63.000000,0.000000,63.000000,0.000000,0.000000,0, + + + + +Text +110.000000 +18.000000 +102.000000,4.000000,0.000000 +15 +0xffffffff +0xff000000 +12.000000 +4625 + + + + + +TitleString +500.000000 +50.000000 +15 +250.000000,25.000000,0.000000 + + + +Pulser +500.000000 +50.000000 +15 +250.000000,25.000000,0.000000 + + + +SubTitle +500.000000 +50.000000 +15 +250.000000,25.000000,0.000000 + + + +Text_Shadow +500.000000 +50.000000 +2.000002,2.000000,0.000000 +0.970978,1.000000,1.000000 +15 +0xff50500f +0xff50500f +18.000000 +5140 + + + + +Text_String +500.000000 +50.000000 +0.970978,1.000000,1.000000 +15 +0xffebeb0f +0xff50500f +18.000000 +5141 + + + + + + +Normal + + + +EndNormal + +gotoandplay +Normal + + + +SubTitle +Scale + + +2 +-100 +100 +50 +1.000000,1.000000,1.000000 + + + +2 +-100 +100 +50 +0.950000,0.950000,1.000000 + + + +0 +1.000000,1.000000,1.000000 + + + + + + + +TitleStringSmall +250.000000 +25.000000 +125.000000,12.000000,0.000000 + + + +Pulser +250.000000 +25.000000 +15 +125.000000,12.000000,0.000000 + + + +SubTitle +250.000000 +25.000000 +15 +125.000000,12.000000,0.000000 + + + +Text_Shadow +250.000000 +25.000000 +1.000000,1.000000,0.000000 +15 +0xff50500f +0xff50500f +10.000000 +5140 + + + + +Text_String +250.000000 +25.000000 +15 +0xffebeb0f +0xff50500f +10.000000 +5140 + + + + + + +Normal + + + +EndNormal + +gotoandplay +Normal + + + +SubTitle +Scale + + +2 +100 +-100 +50 +1.000000,1.000000,1.000000 + + + +2 +100 +-100 +50 +0.950000,0.950000,1.000000 + + + +0 +1.000000,1.000000,1.000000 + + + + + + + +XuiMainMenuButton_L +400.000000 +40.000000 +15 + + + +highlight_graphic +400.000000 +40.000000 +15 +false +Graphics\MainMenuButton_Over.png + + + + +button_graphic +400.000000 +40.000000 +15 +Graphics\MainMenuButton_Norm.png + + + + +text_Label +380.000000 +28.000000 +10.000000,6.000000,0.000000 +15 +0xffebebeb +0xff0f0f0f +16.000000 +21525 + + + + +XuiSoundXACT +41.000000 +11.000000 +170.000000,11.000000,0.000000 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +InitFocusDisableLoop + + + +EndInitFocusDisable + +gotoandplay +InitFocusDisableLoop + + +NormalSelDisable + + + +EndNormalSelDisable + +stop + + + +highlight_graphic +Show +Opacity + + +1 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +false +1.000000 + + + +0 +false +0.000000 + + + +0 +false +0.500000 + + + +0 +false +0.000000 + + + +0 +false +0.500000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +true +1.000000 + + + +1 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +1 +true +0.250000 + + + +button_graphic +Opacity +Show + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +1 +0.000000 +true + + + +1 +1.000000 +true + + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +1.000000 +false + + + +0 +1.000000 +false + + + +1 +1.000000 +false + + + +0 +0.000000 +false + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +1 +0.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +0 +0.000000 +true + + + +1 +1.000000 +true + + + +text_Label +TextColor + + +1 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebeb0f + + + +0 +0xffebeb0f + + + +0 +0xffa0a0a0 + + + +0 +0xffa0a0a0 + + + +0 +0xff969696 + + + +0 +0xff969696 + + + +0 +0xffebeb0f + + + +0 +0xffebebeb + + + +0 +0xffebeb0f + + + +0 +0xffebeb0f + + + +0 +0xffebebeb + + + +0 +0xffebeb0f + + + +0 +0xffebeb80 + + + +0 +0xffebeb0f + + + +0 +0xffebebeb + + + +XuiSoundXACT +Cue +SoundBank +WaveBank + + +0 + + + + + + +0 +ButtonFocus +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + +0 + +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + +0 + +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + +0 + +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + +0 +ButtonPress +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + +0 + +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + + + +XuiMainMenuButton_L_Thin +300.000000 +36.000000 +15 + + + +highlight_graphic +300.000000 +36.000000 +15 +false +Graphics\MainMenuButton_Over.png + + + + +button_graphic +300.000000 +36.000000 +15 +Graphics\MainMenuButton_Norm.png + + + + +text_Label +280.000000 +28.000000 +10.000000,4.000000,0.000000 +15 +0xffebebeb +0xff0f0f0f +21525 + + + + +XuiSoundXACT +41.000000 +11.000000 +170.000000,11.000000,0.000000 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +stop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +InitFocusDisableLoop + + + +EndInitFocusDisable + +gotoandplay +InitFocusDisableLoop + + +NormalSelDisable + + + +EndNormalSelDisable + +stop + + + +text_Label +TextColor + + +1 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebeb0f + + + +0 +0xffebeb0f + + + +0 +0xffa0a0a0 + + + +0 +0xffa0a0a0 + + + +0 +0xff969696 + + + +0 +0xff969696 + + + +0 +0xffebeb0f + + + +0 +0xffebebeb + + + +0 +0xffebeb0f + + + +0 +0xffebeb0f + + + +0 +0xffebebeb + + + +0 +0xffebeb0f + + + +0 +0xffebeb80 + + + +0 +0xffebeb0f + + + +0 +0xffebebeb + + + +highlight_graphic +Show +Opacity + + +1 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +false +1.000000 + + + +0 +false +0.000000 + + + +0 +false +0.500000 + + + +0 +false +0.000000 + + + +0 +false +0.500000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +true +1.000000 + + + +1 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +1 +true +0.250000 + + + +button_graphic +Opacity +Show + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +1 +0.000000 +true + + + +1 +1.000000 +true + + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +1.000000 +false + + + +0 +1.000000 +false + + + +1 +1.000000 +false + + + +0 +0.000000 +false + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +1 +0.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +0 +0.000000 +true + + + +1 +1.000000 +true + + + +XuiSoundXACT +Cue +SoundBank +WaveBank + + +0 + + + + + + +0 +ButtonFocus +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + +0 + +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + +0 + +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + +0 + +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + +0 +ButtonPress +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + +0 + +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + + + +SignEntrySceneBackground +288.000000 +312.000000 + + + +Image +288.000000 +312.000000 +15 +Graphics\SignEditBackground.png + + + + + +LeaderboardHeaderPanel +32.000000 +32.000000 + + + +graphic_groupbackground +32.000000 +32.000000 +15 + + + +Bot_R +8.000000 +8.000000 +24.000000,24.000000,0.000000 +12 +Graphics\PanelsAndTabs\PointerTextPanel_BR.png +48 + + + + +Bot_M +16.000000 +8.000000 +8.000000,24.000000,0.000000 +13 +4 +Graphics\PanelsAndTabs\PointerTextPanel_BM.png +48 + + + + +Bot_L +8.000000 +8.000000 +0.000000,24.000000,0.000000 +9 +Graphics\PanelsAndTabs\PointerTextPanel_BL.png +48 + + + + +Top_R +8.000000 +8.000000 +24.000000,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\PointerTextPanel_TR.png +48 + + + + +Top_M +16.000000 +8.000000 +8.000000,0.000000,0.000000 +7 +4 +Graphics\PanelsAndTabs\PointerTextPanel_TM.png +48 + + + + +Top_L +8.000000 +8.000000 +3 +Graphics\PanelsAndTabs\PointerTextPanel_TL.png +48 + + + + +Mid_R +8.000000 +16.000000 +24.000000,8.000000,0.000000 +14 +4 +Graphics\PanelsAndTabs\PointerTextPanel_MR.png +48 + + + + +Mid_M +16.000000 +16.000000 +8.000000,8.000000,0.000000 +15 +4 +Graphics\PanelsAndTabs\PointerTextPanel_MM.png +48 + + + + +Mid_L +8.000000 +16.000000 +0.000000,8.000000,0.000000 +11 +4 +Graphics\PanelsAndTabs\PointerTextPanel_ML.png +48 + + + + + + +CreditsBackground +1280.000000 +720.000000 + + + +Image +1280.000000 +720.000000 +15 +16 +Graphics\CreditBackground.png + + + + + +PanelRecessed +6.000000 +6.000000 +15 + + + +graphic_groupbackground +6.000000 +6.000000 +15 + + + +TL +2.000000 +2.000000 +3 + + +0xff0f0f80 + + + + +0xff323232 + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,8.000000,0.000000,0,8.000000,0.000000,8.000000,0.000000,8.000000,7.000000,0,8.000000,7.000000,8.000000,7.000000,0.000000,7.000000,0,0.000000,7.000000,0.000000,7.000000,0.000000,0.000000,0, + + + + +TR +2.000000 +2.000000 +4.000000,0.000000,0.000000 +6 + + +0xff0f0f80 + + + + +0x0a323232 + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,8.000000,0.000000,0,8.000000,0.000000,8.000000,0.000000,8.000000,7.000000,0,8.000000,7.000000,8.000000,7.000000,0.000000,7.000000,0,0.000000,7.000000,0.000000,7.000000,0.000000,0.000000,0, + + + + +TM +2.000000 +2.000000 +2.000000,0.000000,0.000000 +7 + + +0xff0f0f80 + + + + +0xff323232 + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,8.000000,0.000000,0,8.000000,0.000000,8.000000,0.000000,8.000000,7.000000,0,8.000000,7.000000,8.000000,7.000000,0.000000,7.000000,0,0.000000,7.000000,0.000000,7.000000,0.000000,0.000000,0, + + + + +BL +2.000000 +2.000000 +0.000000,4.000000,0.000000 +9 + + +0xff0f0f80 + + + + +0x0a323232 + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,8.000000,0.000000,0,8.000000,0.000000,8.000000,0.000000,8.000000,7.000000,0,8.000000,7.000000,8.000000,7.000000,0.000000,7.000000,0,0.000000,7.000000,0.000000,7.000000,0.000000,0.000000,0, + + + + +BR +2.000000 +2.000000 +4.000000,4.000000,0.000000 +12 + + +0xff0f0f80 + + + + +0xffebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,8.000000,0.000000,0,8.000000,0.000000,8.000000,0.000000,8.000000,7.000000,0,8.000000,7.000000,8.000000,7.000000,0.000000,7.000000,0,0.000000,7.000000,0.000000,7.000000,0.000000,0.000000,0, + + + + +BM +2.000000 +2.000000 +2.000000,4.000000,0.000000 +13 + + +0xff0f0f80 + + + + +0xffebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,8.000000,0.000000,0,8.000000,0.000000,8.000000,0.000000,8.000000,7.000000,0,8.000000,7.000000,8.000000,7.000000,0.000000,7.000000,0,0.000000,7.000000,0.000000,7.000000,0.000000,0.000000,0, + + + + +ML +2.000000 +2.000000 +0.000000,2.000000,0.000000 +11 + + +0xff0f0f80 + + + + +0xff323232 + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,8.000000,0.000000,0,8.000000,0.000000,8.000000,0.000000,8.000000,7.000000,0,8.000000,7.000000,8.000000,7.000000,0.000000,7.000000,0,0.000000,7.000000,0.000000,7.000000,0.000000,0.000000,0, + + + + +MR +2.000000 +2.000000 +4.000000,2.000000,0.000000 +14 + + +0xff0f0f80 + + + + +0xffebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,8.000000,0.000000,0,8.000000,0.000000,8.000000,0.000000,8.000000,7.000000,0,8.000000,7.000000,8.000000,7.000000,0.000000,7.000000,0,0.000000,7.000000,0.000000,7.000000,0.000000,0.000000,0, + + + + +MM +2.000000 +2.000000 +2.000000,2.000000,0.000000 +15 + + +0xff0f0f80 + + + + +0xff8c8c8c + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,8.000000,0.000000,0,8.000000,0.000000,8.000000,0.000000,8.000000,7.000000,0,8.000000,7.000000,8.000000,7.000000,0.000000,7.000000,0,0.000000,7.000000,0.000000,7.000000,0.000000,0.000000,0, + + + + + + +GraphicPanel +272.000000 +110.000000 +15 + + + +graphic_groupbackground +272.000000 +110.000000 +15 + + + +Bot_R +16.000000 +16.000000 +256.344818,94.001953,0.000000 +12 +Graphics\PanelsAndTabs\Panel_Bot_R.png +48 + + + + +Bot_M +240.344818 +16.000000 +16.000000,94.001953,0.000000 +13 +4 +Graphics\PanelsAndTabs\Panel_Bot_M.png +48 + + + + +Bot_L +16.000000 +16.000000 +0.000000,94.001953,0.000000 +9 +Graphics\PanelsAndTabs\Panel_Bot_L.png +48 + + + + +Top_R +16.000000 +16.000000 +256.344818,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\Panel_Top_R.png +48 + + + + +Top_M +240.344818 +16.000000 +16.000000,0.000000,0.000000 +7 +4 +Graphics\PanelsAndTabs\Panel_Top_M.png +48 + + + + +Top_L +16.000000 +16.000000 +3 +Graphics\PanelsAndTabs\Panel_Top_L.png +48 + + + + +Mid_R +16.000000 +78.001961 +256.344818,16.000000,0.000000 +14 +4 +Graphics\PanelsAndTabs\Panel_Mid_R.png +48 + + + + +Mid_M +240.344818 +78.001961 +16.000000,16.000000,0.000000 +15 +4 +Graphics\PanelsAndTabs\Panel_Mid_M.png +48 + + + + +Mid_L +16.000000 +78.001961 +0.000000,16.000000,0.000000 +11 +4 +Graphics\PanelsAndTabs\Panel_Mid_L.png +48 + + + + + + +XuiBackgroundPan +1280.000000 +720.000000 + + + +DayGroup +4099.999512 +719.999939 + + + +Pan1 +820.000000 +144.000000 +5.000000,5.000000,1.000000 +15 +false +1 +Graphics\Panorama_Background_S.png + + + + +Pan +820.000000 +144.000000 +5.000000,5.000000,1.000000 +15 +1 +Graphics\Panorama_Background_S.png + + + + +Pan +Position +SizeMode + + +0 +0.000000,0.000000,0.000000 +1 + + + +0 +-4100.000000,-0.000004,0.000000 +16 + + + +Pan1 +Position +SizeMode +Show + + +0 +0.000000,0.000000,0.000000 +1 +false + + + +0 +-879.765869,-0.000003,0.000000 +1 +false + + + +0 +1280.000000,-0.000003,0.000000 +1 +true + + + +0 +0.000000,-0.000004,0.000000 +16 +true + + + + + + +NightGroup +4099.999512 +719.999939 +false + + + +NightPan +820.000000 +144.000000 +5.000000,5.000000,1.000000 +15 +false +1 +Graphics\Panorama_Background_N.png + + + + +NightPan1 +820.000000 +144.000000 +5.000000,5.000000,1.000000 +15 +1 +Graphics\Panorama_Background_N.png + + + + +NightPan1 +Position +SizeMode + + +0 +0.000000,0.000000,0.000000 +1 + + + +0 +-4100.000000,-0.000004,0.000000 +16 + + + +NightPan +Position +SizeMode +Show + + +0 +0.000000,0.000000,0.000000 +1 +false + + + +0 +-879.765869,-0.000003,0.000000 +1 +false + + + +0 +1280.000000,-0.000003,0.000000 +1 +true + + + +0 +0.000000,-0.000004,0.000000 +16 +true + + + + + + +Darken +1280.000000 +720.000000 +0.750000 +false + + +0xff0f0f80 + + + + +0xff0f1562 + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,637.000000,0.000000,0,637.000000,0.000000,637.000000,0.000000,637.000000,755.000000,0,637.000000,755.000000,637.000000,755.000000,0.000000,755.000000,0,0.000000,755.000000,0.000000,755.000000,0.000000,0.000000,0, + + + + + +XuiDarkOverlay +1280.000000 +720.000000 + + + +1280.000000 +720.000000 +0.400000 +15 + + +1.000000 +0xff0f0f0f + + + + +0xff0f0f0f + + +3 +0xff0f0f0f +0xffe5e5e5 +0xff0f0f0f +0.000000 +0.000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,300.000000,0.000000,0,300.000000,0.000000,300.000000,0.000000,300.000000,234.000000,0,300.000000,234.000000,300.000000,234.000000,0.000000,234.000000,0,0.000000,234.000000,0.000000,234.000000,0.000000,0.000000,0, + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + + + + +XuiBackgroundPan480 +1280.000000 +720.000000 + + + +DayGroup +4099.999512 +719.999939 + + + +Pan1 +820.000000 +144.000000 +640.000000,0.000000,0.000000 +3.400000,3.400000,1.000000 +15 +false +1 +Graphics\Panorama_Background_S.png + + + + +Pan +820.000000 +144.000000 +3.400000,3.400000,1.000000 +15 +1 +Graphics\Panorama_Background_S.png + + + + +Darken +640.000000 +480.000000 +0.300000 + + +0xff0f0f80 + + + + +0xff19195a + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,637.000000,0.000000,0,637.000000,0.000000,637.000000,0.000000,637.000000,755.000000,0,637.000000,755.000000,637.000000,755.000000,0.000000,755.000000,0,0.000000,755.000000,0.000000,755.000000,0.000000,0.000000,0, + + + + +Pan +Position + + +0 +0.000000,0.000000,0.000000 + + + +0 +-2788.000000,-0.000003,0.000000 + + + +Pan1 +Position +Show + + +0 +640.000000,0.000000,0.000000 +false + + + +0 +640.000000,-0.000003,0.000000 +false + + + +0 +637.000000,-0.000003,0.000000 +true + + + +0 +0.000000,-0.000004,0.000000 +true + + + + + + +NightGroup +4099.999512 +719.999939 +false + + + +Pan1 +820.000000 +144.000000 +640.000000,0.000000,0.000000 +3.400000,3.400000,1.000000 +15 +false +1 +Graphics\Panorama_Background_N.png + + + + +Pan +820.000000 +144.000000 +3.400000,3.400000,1.000000 +15 +1 +Graphics\Panorama_Background_N.png + + + + +Pan +Position + + +0 +0.000000,0.000000,0.000000 + + + +0 +-2788.000000,-0.000003,0.000000 + + + +Pan1 +Position +Show + + +0 +640.000000,0.000000,0.000000 +false + + + +0 +640.000000,-0.000003,0.000000 +false + + + +0 +637.000000,-0.000003,0.000000 +true + + + +0 +0.000000,-0.000004,0.000000 +true + + + + + + +Darken +640.000000 +480.000000 +0.750000 +false + + +0xff0f0f80 + + + + +0xff0f1562 + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,637.000000,0.000000,0,637.000000,0.000000,637.000000,0.000000,637.000000,755.000000,0,637.000000,755.000000,637.000000,755.000000,0.000000,755.000000,0,0.000000,755.000000,0.000000,755.000000,0.000000,0.000000,0, + + + + + +XuiBackgroundScroll +1280.000000 +720.000000 + + + +TileGroup1 +1280.000000 +160.000000 +0.000000,720.000000,0.000000 + + + +XuiImage1 +160.000000 +160.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage2 +160.000000 +160.000000 +160.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage3 +160.000000 +160.000000 +320.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage4 +160.000000 +160.000000 +480.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage5 +160.000000 +160.000000 +640.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage6 +160.000000 +160.000000 +800.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage7 +160.000000 +160.000000 +960.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage8 +160.000000 +160.000000 +1120.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + + +TileGroup2 +1280.000000 +160.000000 +0.000000,560.000000,0.000000 + + + +XuiImage1 +160.000000 +160.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage2 +160.000000 +160.000000 +160.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage3 +160.000000 +160.000000 +320.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage4 +160.000000 +160.000000 +480.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage5 +160.000000 +160.000000 +640.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage6 +160.000000 +160.000000 +800.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage7 +160.000000 +160.000000 +960.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage8 +160.000000 +160.000000 +1120.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + + +TileGroup3 +1280.000000 +160.000000 +0.000000,400.000000,0.000000 + + + +XuiImage1 +160.000000 +160.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage2 +160.000000 +160.000000 +160.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage3 +160.000000 +160.000000 +320.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage4 +160.000000 +160.000000 +480.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage5 +160.000000 +160.000000 +640.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage6 +160.000000 +160.000000 +800.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage7 +160.000000 +160.000000 +960.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage8 +160.000000 +160.000000 +1120.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + + +TileGroup4 +1280.000000 +160.000000 +0.000000,240.000000,0.000000 + + + +XuiImage1 +160.000000 +160.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage2 +160.000000 +160.000000 +160.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage3 +160.000000 +160.000000 +320.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage4 +160.000000 +160.000000 +480.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage5 +160.000000 +160.000000 +640.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage6 +160.000000 +160.000000 +800.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage7 +160.000000 +160.000000 +960.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage8 +160.000000 +160.000000 +1120.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + + +TileGroup5 +1280.000000 +160.000000 +0.000000,80.000000,0.000000 + + + +XuiImage1 +160.000000 +160.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage2 +160.000000 +160.000000 +160.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage3 +160.000000 +160.000000 +320.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage4 +160.000000 +160.000000 +480.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage5 +160.000000 +160.000000 +640.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage6 +160.000000 +160.000000 +800.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage7 +160.000000 +160.000000 +960.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage8 +160.000000 +160.000000 +1120.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + + +TileGroup6 +1280.000000 +160.000000 +0.000000,-80.000000,0.000000 + + + +XuiImage1 +160.000000 +160.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage2 +160.000000 +160.000000 +160.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage3 +160.000000 +160.000000 +320.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage4 +160.000000 +160.000000 +480.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage5 +160.000000 +160.000000 +640.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage6 +160.000000 +160.000000 +800.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage7 +160.000000 +160.000000 +960.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage8 +160.000000 +160.000000 +1120.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + + +TileGroup1 +Position + + +0 +0.000000,720.000000,0.000000 + + + +0 +0.000000,560.000000,0.000000 + + + +TileGroup2 +Position + + +0 +0.000000,560.000000,0.000000 + + + +0 +0.000000,400.000000,0.000000 + + + +TileGroup3 +Position + + +0 +0.000000,400.000000,0.000000 + + + +0 +0.000000,240.000000,0.000000 + + + +TileGroup5 +Position + + +0 +0.000000,80.000000,0.000000 + + + +0 +0.000000,-80.000000,0.000000 + + + +TileGroup4 +Position + + +0 +0.000000,240.000000,0.000000 + + + +0 +0.000000,80.000000,0.000000 + + + +TileGroup6 +Position + + +0 +0.000000,-80.000000,0.000000 + + + +0 +0.000000,-160.000000,0.000000 + + + +0 +0.000000,720.000000,0.000000 + + + +0 +0.000000,720.000000,0.000000 + + + + + + +XuiBlankScene +405.000000 +244.000000 + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + + + + +XuiScene +96.000000 +96.000000 +0.000000,3.000000,0.000000 +15 + + + +graphic_groupbackground +96.000000 +96.000000 +15 + + + +Graphic_TL +32.000000 +32.000000 +3 +Graphics\PanelsAndTabs\Panel_TL.png + + + + +Graphic_TM +32.000000 +32.000000 +32.000000,0.000000,0.000000 +71 +Graphics\PanelsAndTabs\Panel_TM.png + + + + +Graphic_TR +32.000000 +32.000000 +64.000000,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\Panel_TR.png + + + + +Graphic_ML +32.000000 +32.000000 +0.000000,32.000000,0.000000 +139 +Graphics\PanelsAndTabs\Panel_ML.png + + + + +Graphic_MM +32.000000 +32.000000 +32.000000,32.000000,0.000000 +207 +Graphics\PanelsAndTabs\Panel_MM.png + + + + +Graphic_MR +32.000000 +32.000000 +64.000000,32.000000,0.000000 +142 +Graphics\PanelsAndTabs\Panel_MR.png + + + + +Graphic_BL +32.000000 +32.000000 +0.000000,64.000000,0.000000 +9 +Graphics\PanelsAndTabs\Panel_BL.png + + + + +Graphic_BM +32.000000 +32.000000 +32.000000,64.000000,0.000000 +77 +Graphics\PanelsAndTabs\Panel_BM.png + + + + +Graphic_BR +32.000000 +32.000000 +64.000000,64.000000,0.000000 +12 +Graphics\PanelsAndTabs\Panel_BR.png + + + + + +XuiTextPresenter +66.000000 +40.000000 +14.999996,14.000000,0.000000 +15 +0xff0f0f0f +18.000000 +1024 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + + + + +XuiMenuScene +96.000000 +96.000000 +15 + + + +XuiTextPresenter +66.000000 +40.000000 +14.999996,14.000000,0.000000 +5 +0xff0f0f0f +18.000000 +1040 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + + + + +XuiBlackScene +405.000000 +244.000000 + + + +1280.000000 +720.000000 + + +1.000000 +0xff0f0f80 + + + + +0xff0f0f0f + + +3 +0xff0f0f0f +0xffe5e5e5 +0xff0f0f0f +0.000000 +0.000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,300.000000,0.000000,0,300.000000,0.000000,300.000000,0.000000,300.000000,234.000000,0,300.000000,234.000000,300.000000,234.000000,0.000000,234.000000,0,0.000000,234.000000,0.000000,234.000000,0.000000,0.000000,0, + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + + + + +GraphicPanel4grid +32.000000 +32.000000 +15 + + + +graphic_groupbackground +32.000000 +32.000000 +15 + + + +Bot_R +16.000000 +16.000000 +16.000000,16.000000,0.000000 +12 +Graphics\PanelsAndTabs\Panel_Bot_R.png +48 + + + + +Bot_L +16.000000 +16.000000 +0.000000,16.000000,0.000000 +9 +Graphics\PanelsAndTabs\Panel_Bot_L.png +48 + + + + +Top_R +16.000000 +16.000000 +16.000000,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\Panel_Top_R.png +48 + + + + +Top_L +16.000000 +16.000000 +3 +Graphics\PanelsAndTabs\Panel_Top_L.png +48 + + + + + + +CraftingCategoryIcon +48.000000 +48.000000 + + + +Icon +48.000000 +48.000000 +15 +8 +Graphics\CraftIcons\icon_armour.png +48 + + + + + +Armour + +stop + + +Brewing + +stop + + +Decoration + +stop + + +Food + +stop + + +Materials + +stop + + +Mechanisms + +stop + + +Misc + +stop + + +RedstoneAndTransport + +stop + + +Structures + +stop + + +Tools + +stop + + +Transport + +stop + + + +Icon +ImagePath + + +0 +Graphics\CraftIcons\icon_armour.png + + + +0 +Graphics\CraftIcons\icon_brewing.png + + + +0 +Graphics\CraftIcons\icon_decoration.png + + + +0 +Graphics\CraftIcons\icon_food.png + + + +0 +Graphics\CraftIcons\icon_Materials.png + + + +0 +Graphics\CraftIcons\icon_mechanisms.png + + + +0 +Graphics\CraftIcons\icon_misc.png + + + +0 +Graphics\CraftIcons\icon_Redstone_and_Transport.png + + + +0 +Graphics\CraftIcons\icon_structures.png + + + +0 +Graphics\CraftIcons\icon_tools.png + + + +0 +Graphics\CraftIcons\icon_transport.png + + + + + + +CraftingPanelTabRightSmall +72.000000 +56.000000 + + + +Image +72.000000 +56.000000 +Graphics\PanelsAndTabs\Tab_Small_Right.png +48 + + + + + +CraftingPanelTabRight +107.000000 +85.000000 + + + +Image +107.000000 +85.000000 +Graphics\PanelsAndTabs\Tab_Right.png +48 + + + + + +CraftingPanelTabMiddleSmall +72.000000 +56.000000 + + + +TabImage2 +72.000000 +56.000000 +Graphics\PanelsAndTabs\Tab_Small_Middle.png +48 + + + + + +CraftingPanelTabMiddle +107.000000 +85.000000 + + + +Image +107.000000 +85.000000 +Graphics\PanelsAndTabs\Tab_Middle.png +48 + + + + + +CraftingPanelTabLeftSmall +72.000000 +56.000000 + + + +Image +72.000000 +56.000000 +Graphics\PanelsAndTabs\Tab_Small_Left.png +48 + + + + + +CraftingPanelTabLeft +107.000000 +85.000000 + + + +Image +107.000000 +85.000000 +Graphics\PanelsAndTabs\Tab_Left.png +48 + + + + + +CraftingPanelVScrollSmall +22.000000 +67.000000 + + + +Image +22.000000 +67.000000 +1 +Graphics\CraftScene\Crafting_2SlotSmallV.png +48 + + + + + +CraftingPanelVScroll3 +80.000000 +258.000000 + + + +Image +80.000000 +258.000000 +2 +Graphics\CraftScene\Crafting_3SlotLargeV.png +48 + + + + + +CraftingPanelVScroll2 +80.000000 +204.000000 + + + +Image +80.000000 +204.000000 +Graphics\CraftScene\Crafting_2SlotLargeV.png +48 + + + + + +CraftingPanelHighlightSmall +43.000000 +43.000000 + + + +Image +43.000000 +43.000000 +4 +Graphics\CraftScene\Craft_Highlight_L_ExtraSmall.png +48 + + + + + +CraftingPanelHighlight +72.000000 +72.000000 + + + +Image +72.000000 +72.000000 +Graphics\CraftScene\Craft_Highlight_L_Small.png +48 + + + + + +CraftingPanel3x3Small +490.000000 +284.000000 + + + +Image +490.000000 +284.000000 +Graphics\PanelsAndTabs\Crafting_Panel_Small.png +48 + + + + + +CraftingPanel3x3 +689.000000 +490.000000 + + + +Image +689.000000 +490.000000 +1 +Graphics\PanelsAndTabs\Crafting_Panel.png +48 + + + + + +CraftingPanel2x2Small +420.000000 +284.000000 + + + +Image +420.000000 +284.000000 +Graphics\PanelsAndTabs\Crafting_Panel_Small_2x2.png +48 + + + + + +CraftingPanel2x2 +591.000000 +490.000000 + + + +Image +591.000000 +490.000000 +Graphics\PanelsAndTabs\Crafting_Panel2x2.png +48 + + + + + +CreativeInventoryTabRightSmall +54.000000 +56.000000 + + + +Image +54.000000 +56.000000 +1 +Graphics\PanelsAndTabs\Tab_Creative8_Small_R.png +48 + + + + + +CreativeInventoryTabRight +83.000000 +78.000000 + + + +Image +83.000000 +78.000000 +1 +Graphics\PanelsAndTabs\Tab_Creative8_R.png +48 + + + + + +CreativeInventoryTabMiddleSmall +54.000000 +56.000000 + + + +Image +54.000000 +56.000000 +1 +Graphics\PanelsAndTabs\Tab_Creative8_Small_M.png +48 + + + + + +CreativeInventoryTabMiddle +83.000000 +78.000000 + + + +Image +83.000000 +78.000000 +1 +Graphics\PanelsAndTabs\Tab_Creative8_M.png +48 + + + + + +CreativeInventoryTabLeftSmall +54.000000 +56.000000 + + + +Image +54.000000 +56.000000 +1 +Graphics\PanelsAndTabs\Tab_Creative8_Small_L.png +48 + + + + + +CreativeInventoryTabLeft +83.000000 +78.000000 + + + +Image +83.000000 +78.000000 +1 +Graphics\PanelsAndTabs\Tab_Creative8_L.png +48 + + + + + +CreativeInventorySmall +418.000000 +294.000000 + + + +Image +418.000000 +294.000000 +0.000015,0.000015,0.000000 +1 +Graphics\PanelsAndTabs\Creative_Panel_8_Small.png +48 + + + + + +CreativeInventory +643.000000 +490.000000 + + + +image +643.000000 +490.000000 +1 +Graphics\PanelsAndTabs\Creative_Panel_8.png +48 + + + + + +IconLStickSides +97.000000 +64.000000 + + + +Image +97.000000 +64.000000 +15 +8 +Graphics\X360ControllerIcons\ButtonLeftStick_sides.png + + + + + +IconLBumper +70.000000 +64.000000 + + + +Image +70.000000 +64.000000 +15 +8 +Graphics\X360ControllerIcons\ButtonLeftBumper.png + + + + + +IconRBumper +70.000000 +64.000000 + + + +Image +70.000000 +64.000000 +15 +8 +Graphics\X360ControllerIcons\ButtonRightBumper.png + + + + + +ImHowToPlayTrading +588.000000 +360.000000 + + + +Image +588.000000 +360.000000 +Graphics\HowToPlay\HowToPlay_Trading.png + + + + + +ImHowToPlayTradingSmall +260.000000 +174.000000 + + + +Image1 +260.000000 +174.000000 +1 +Graphics\HowToPlay\HowToPlay_Trading_Small.png + + + + + +ImHowToPlayAnvilSmall +260.000000 +290.000000 + + + +Image +260.000000 +290.000000 +1 +Graphics\HowToPlay\HowToPlay_Anvil_Small.png + + + + + +ImHowToPlayAnvil +430.000000 +430.000000 + + + +Image +430.000000 +430.000000 +Graphics\HowToPlay\HowToPlay_Anvil.png + + + + + +ImHowToPlayEnchantment +339.000000 +342.000000 + + + +Image +451.000000 +455.000000 +0.750000,0.750000,0.750000 +1 +Graphics\HowToPlay\HowToPlay_Enchantment.png + + + + + +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 + + + +XuiImageBrewing +451.000000 +455.000000 +0.750000,0.750000,0.750000 +1 +Graphics\HowToPlay\HowToPlay_Brewing.png + + + + + +ImHowToPlayFarmingAnimals +339.000000 +342.000000 + + + +XuiImageFarmingAnimals +451.000000 +455.000000 +0.750000,0.750000,0.750000 +1 +Graphics\HowToPlay\HowToPlay_FarmingAnimals.png + + + + + +ImHowToPlayBreeding +339.000000 +342.000000 + + + +XuiImageBreeding +451.000000 +455.000000 +0.750000,0.750000,0.750000 +1 +Graphics\HowToPlay\HowToPlay_Breeding.png + + + + + +ImHowToPlayCreative +491.000000 +371.000000 + + + +Image +654.000000 +494.000000 +0.750000,0.750000,0.750000 +1 +Graphics\HowToPlay\HowToPlay_Creative.png + + + + + +ImHowToPlayCraftingTable +517.000000 +371.000000 + + + +Image +689.000000 +494.000000 +0.750000,0.750000,0.750000 +1 +Graphics\HowToPlay\HowToPlay_CraftTable.png + + + + + +ImHowToPlayCrafting +563.000000 +428.000000 + + + +Image +563.000000 +428.000000 +8 +Graphics\HowToPlay\HowToPlay_Crafting.png + + + + + +ImHowToPlayFurnace +444.000000 +448.000000 + + + +Image +444.000000 +448.000000 +Graphics\HowToPlay\HowToPlay_Furnace.png + + + + + +ImHowToPlayLargeChest +335.000000 +417.000000 + + + +Image +446.000000 +556.000000 +0.750000,0.750000,1.000000 +8 +Graphics\HowToPlay\HowToPlay_LargeChest.png + + + + + +ImHowToPlayChest +449.000000 +434.000000 + + + +Image +449.000000 +434.000000 +1 +Graphics\HowToPlay\HowToPlay_Chest.png + + + + + +ImHowToPlayInventory +451.000000 +455.000000 + + + +Image +451.000000 +455.000000 +Graphics\HowToPlay\HowToPlay_Inventory.png + + + + + +ImHowToPlayHUD +583.000000 +157.000000 + + + +Image +583.000000 +157.000000 +1 +Graphics\HowToPlay\HowToPlay_HUD.png + + + + + +ImHowToPlayDispenser +453.000000 +431.000000 + + + +Image +453.000000 +431.000000 +1 +Graphics\HowToPlay\HowToPlay_Dispenser.png + + + + + +ImHowToPlayNetherPortal +525.000000 +308.000000 + + + +Image +750.000000 +440.000000 +0.700000,0.700000,1.000000 +1 +Graphics\HowToPlay\HowToPlay_NetherPortal.png + + + + + +ImHowToPlayTheEnd +525.000000 +308.000000 + + + +Image +750.000000 +440.000000 +0.700000,0.700000,1.000000 +1 +Graphics\HowToPlay\HowToPlay_TheEnd.png + + + + + +ImHowToPlayTheEndSmall +248.000000 +146.000000 + + + +Image +248.000000 +146.000000 +1 +Graphics\HowToPlay\HowToPlay_TheEnd_Small.png +48 + + + + + +ImHowToPlayNetherPortalSmall +248.000000 +146.000000 + + + +Image +248.000000 +146.000000 +1 +Graphics\HowToPlay\HowToPlay_NetherPortal_Small.png +48 + + + + + +ImHowToPlayDispenserSmall +262.000000 +280.000000 + + + +Image +262.000000 +280.000000 +1 +Graphics\HowToPlay\HowToPlay_Dispenser_Small.png + + + + + +ImHowToPlayHUDSmall +364.000000 +84.000000 + + + +Image +364.000000 +84.000000 +1 +Graphics\HowToPlay\HowToPlay_HUD_Small.png +48 + + + + + +ImHowToPlayInventorySmall +262.000000 +280.000000 + + + +Image +262.000000 +280.000000 +1 +Graphics\HowToPlay\HowToPlay_Inventory_Small.png + + + + + +ImHowToPlayChestSmall +258.000000 +260.000000 + + + +Image +258.000000 +260.000000 +1 +Graphics\HowToPlay\HowToPlay_Chest_Small.png + + + + + +ImHowToPlayLargeChestSmall +213.000000 +270.000000 + + + +Image +142.000000 +180.000000 +1.500000,1.500000,1.000000 +1 +Graphics\HowToPlay\HowToPlay_LargeChest_Small.png +48 + + + + + +ImHowToPlayFurnaceSmall +262.000000 +290.000000 + + + +Image +262.000000 +290.000000 +1 +Graphics\HowToPlay\HowToPlay_Furnace_Small.png + + + + + +ImHowToPlayCraftingSmall +252.000000 +170.000000 + + + +Image +252.000000 +170.000000 +1 +Graphics\HowToPlay\HowToPlay_Crafting_Small.png +48 + + + + + +ImHowToPlayCraftingTableSmall +245.000000 +142.000000 + + + +Image +245.000000 +142.000000 +1 +Graphics\HowToPlay\HowToPlay_CraftTable_Small.png +48 + + + + + +ImHowToPlayCreativeSmall +258.000000 +194.000000 + + + +Image +258.000000 +194.000000 +1 +Graphics\HowToPlay\HowToPlay_Creative_Small.png + + + + + +ImHowToPlayBreedingSmall +262.000000 +280.000000 + + + +Image +262.000000 +280.000000 +1 +Graphics\HowToPlay\HowToPlay_Breeding_Small.png + + + + + +ImHowToPlayFarmingAnimalsSmall +262.000000 +280.000000 + + + +Image +262.000000 +280.000000 +1 +Graphics\HowToPlay\HowToPlay_FarmingAnimals_Small.png + + + + + +ImHowToPlayBrewingSmall +260.000000 +290.000000 + + + +Image +260.000000 +290.000000 +1 +Graphics\HowToPlay\HowToPlay_Brewing_Small.png + + + + + +ImHowToPlayEnchantmentSmall +262.000000 +280.000000 + + + +Image +262.000000 +280.000000 +1 +Graphics\HowToPlay\HowToPlay_Enchantment_Small.png + + + + + +ImHowToPlayEnderchestSmall +262.000000 +280.000000 + + + +Image +262.000000 +280.000000 +1 +Graphics\HowToPlay\HowToPlay_Enderchest_small.png + + + + + +ImHowToPlayBeaconSmall +260.000000 +290.000000 + + + +Image +336.000000 +290.000000 +1 +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 + + + + + +XuiLabelDarkCentred8 +404.000000 +180.000000 +1.000000,1.000000,0.000000 + + + +Text +404.000000 +180.000000 +15 +0xff323232 +8.000000 +5120 + + + + + +XuiLabelVertCentDarkLeftWrap18 +405.000000 +180.000000 + + + +Text +405.000000 +180.000000 +15 +0xff323232 +18.000000 +20736 + + + + + +XuiLabelVertCentDarkLeft8 +404.000000 +180.000000 +1.000000,1.000000,0.000000 + + + +Text +404.000000 +180.000000 +15 +0xff323232 +8.000000 +4352 + + + + + +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 new file mode 100644 index 00000000..86e38941 --- /dev/null +++ b/Minecraft.Client/Common/Media/splashes.txt @@ -0,0 +1,314 @@ +Happy birthday, ez! +Happy birthday, Notch! +Merry X-mas! +Happy New Year! +Hobo humping slobo babe! +This text is hard to read if you play the game at the default resolution, but at 1080p it's fine! +As seen on TV! +Awesome! +100% pure! +May contain nuts! +Better than Prey! +More polygons! +Sexy! +Limited edition! +Flashing letters! +Made by Notch! +It's here! +Best in class! +It's finished! +Kind of dragon free! +Excitement! +More than 500 sold! +One of a kind! +Heaps of hits on YouTube! +Indev! +Spiders everywhere! +Check it out! +Holy cow, man! +It's a game! +Made in Sweden! +Uses LWJGL! +Reticulating splines! +Minecraft! +Yaaay! +Singleplayer! +Keyboard compatible! +Undocumented! +Ingots! +Exploding creepers! +That's no moon! +l33t! +Create! +Survive! +Dungeon! +Exclusive! +The bee's knees! +Down with O.P.P.! +Closed source! +Classy! +Wow! +Not on steam! +Oh man! +Awesome community! +Pixels! +Teetsuuuuoooo! +Kaaneeeedaaaa! +Now with difficulty! +Enhanced! +90% bug free! +Pretty! +12 herbs and spices! +Fat free! +Absolutely no memes! +Free dental! +Ask your doctor! +Minors welcome! +Cloud computing! +Legal in Finland! +Hard to label! +Technically good! +Bringing home the bacon! +Indie! +GOTY! +Ceci n'est pas une title screen! +Euclidian! +Now in 3D! +Inspirational! +Herregud! +Complex cellular automata! +Yes, sir! +Played by cowboys! +Thousands of colors! +Try it! +Age of Wonders is better! +Try the mushroom stew! +Sensational! +Hot tamale, hot hot tamale! +Play him off, keyboard cat! +Guaranteed! +Macroscopic! +Bring it on! +Random splash! +Call your mother! +Monster infighting! +Loved by millions! +Ultimate edition! +Freaky! +You've got a brand new key! +Water proof! +Uninflammable! +Whoa, dude! +All inclusive! +Tell your friends! +NP is not in P! +Notch <3 ez! +Music by C418! +Livestreamed! +Haunted! +Polynomial! +Terrestrial! +All is full of love! +Full of stars! +Scientific! +Cooler than Spock! +Collaborate and listen! +Never dig down! +Take frequent breaks! +Not linear! +Han shot first! +Nice to meet you! +Buckets of lava! +Ride the pig! +Larger than Earth! +sqrt(-1) love you! +Phobos anomaly! +Punching wood! +Falling off cliffs! +0% sugar! +150% hyperbole! +Synecdoche! +Let's danec! +Reference implementation! +Lewd with two dudes with food! +Kiss the sky! +20 GOTO 10! +Verlet intregration! +Peter Griffin! +Do not distribute! +Cogito ergo sum! +4815162342 lines of code! +A skeleton popped out! +The Work of Notch! +The sum of its parts! +BTAF used to be good! +I miss ADOM! +umop-apisdn! +OICU812! +Bring me Ray Cokes! +Finger-licking! +Thematic! +Pneumatic! +Sublime! +Octagonal! +Une baguette! +Gargamel plays it! +Rita is the new top dog! +SWM forever! +Representing Edsbyn! +Matt Damon! +Supercalifragilisticexpialidocious! +Consummate V's! +Cow Tools! +Double buffered! +Fan fiction! +Flaxkikare! +Jason! Jason! Jason! +Hotter than the sun! +Internet enabled! +Autonomous! +Engage! +Fantasy! +DRR! DRR! DRR! +Kick it root down! +Regional resources! +Woo, facepunch! +Woo, somethingawful! +Woo, /v/! +Woo, tigsource! +Woo, minecraftforum! +Woo, worldofminecraft! +Woo, reddit! +Woo, 2pp! +Google anlyticsed! +Now supports åäö! +Give us Gordon! +Tip your waiter! +Very fun! +12345 is a bad password! +Vote for net neutrality! +Lives in a pineapple under the sea! +MAP11 has two names! +Omnipotent! +Gasp! +...! +Bees, bees, bees, bees! +Jag känner en bot! +Haha, LOL! +Hampsterdance! +Switches and ores! +Menger sponge! +idspispopd! +Eple (original edit)! +So fresh, so clean! +Slow acting portals! +Try the Nether! +Don't look directly at the bugs! +Oh, ok, Pigmen! +Finally with ladders! +Scary! +Play Minecraft, Watch Topgear, Get Pig! +Twittered about! +Jump up, jump up, and get down! +Joel is neat! +A riddle, wrapped in a mystery! +Huge tracts of land! +Welcome to your Doom! +Stay a while, stay forever! +Stay a while and listen! +Treatment for your rash! +"Autological" is! +Information wants to be free! +"Almost never" is an interesting concept! +Lots of truthiness! +The creeper is a spy! +Turing complete! +It's groundbreaking! +Let our battle's begin! +The sky is the limit! +Jeb has amazing hair! +Casual gaming! +Undefeated! +Kinda like Lemmings! +Follow the train, CJ! +Leveraging synergy! +DungeonQuest is unfair! +110813! +90210! +Check out the far lands! +Tyrion would love it! +Also try VVVVVV! +Also try Super Meat Boy! +Also try Terraria! +Also try Mount And Blade! +Also try Project Zomboid! +Also try World of Goo! +Also try Limbo! +Also try Pixeljunk Shooter! +Also try Braid! +That's super! +Bread is pain! +Read more books! +Khaaaaaaaaan! +Less addictive than TV Tropes! +More addictive than lemonade! +Bigger than a bread box! +Millions of peaches! +Fnord! +This is my true form! +Totally forgot about Dre! +Don't bother with the clones! +Pumpkinhead! +Made by Jeb! +Has an ending! +Finally complete! +Feature packed! +Boots with the fur! +Stop, hammertime! +Testificates! +Conventional! +Homeomorphic to a 3-sphere! +Doesn't avoid double negatives! +Place ALL the blocks! +Does barrel rolls! +Meeting expectations! +PC gaming since 1873! +Ghoughpteighbteau tchoghs! +Déjà vu! +Déjà vu! +Got your nose! +Haley loves Elan! +Afraid of the big, black bat! +Doesn't use the U-word! +Child's play! +See you next Friday or so! +From the streets of Södermalm! +150 bpm for 400000 minutes! +Technologic! +Funk soul brother! +Pumpa kungen! +My life for Aiur! +Lennart lennart = new Lennart(); +I see your vocabulary has improved! +Who put it there? +You can't explain that! +if not ok then return end +§1C§2o§3l§4o§5r§6m§7a§8t§9i§ac +§kFUNKY LOL +SOPA means LOSER in Swedish! +Big Pointy Teeth! +Bekarton guards the gate! +Mmmph, mmph! +Don't feed avocados to parrots! +Swords for everyone! +Plz reply to my tweet! +.party()! +Take her pillow! +Put that cookie down! +Pretty scary! +I have a suggestion. +Now with extra hugs! +Almost java 6! +Woah. +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 new file mode 100644 index 00000000..9e824d0f --- /dev/null +++ b/Minecraft.Client/Common/Media/strings.resx @@ -0,0 +1,7260 @@ + + + + + New Downloadable Content is available! Access it from the Minecraft Store button on the Main Menu. + + + You can change the look of your character with a Skin Pack from the Minecraft Store. Select 'Minecraft Store' on the Main Menu to see what's available. + + + + If you play this game in High Definition mode, you can have up to four players in split-screen on the same console! + + + Connect extra controllers to your console and press START on them to join a game at any point. + + + Alter the gamma settings to make the game brighter or darker. + + + If you set the game difficulty to Peaceful, your health will automatically regenerate, and no monsters will come out at night! + + + Feed a bone to a wolf to tame it. You can then make it sit or follow you. + + + You can drop items when in the Inventory menu by moving the cursor off the menu and pressing{*CONTROLLER_VK_A*} + + + Sleeping in a bed at night will fast forward the game to dawn, but all players in a multiplayer game need to sleep in beds at the same time. + + + Harvest pork chops from pigs, and cook and eat them to regain health. + + + Harvest leather from cows, and use it to make armor. + + + If you have an empty bucket, you can fill it with milk from a cow, or water, or lava! + + + Use a hoe to prepare areas of ground for planting. + + + Spiders won't attack you during the day - unless you attack them. + + + Digging soil or sand with a spade is faster than with your hand! + + + Eating cooked pork chops gives more health than eating raw pork chops. + + + Make some torches to light up areas at night. Monsters will avoid the areas around these torches. + + + Get to destinations faster with a minecart and rail! + + + Plant some saplings and they'll grow into trees. + + + Pigmen won't attack you, unless you attack them. + + + You can change your game spawn point and skip to dawn by sleeping in a bed. + + + Hit those fireballs back at the Ghast! + + + Building a portal will allow you to travel to another dimension - The Nether. + + + Press{*CONTROLLER_VK_B*} to drop the item currently in your hand! + + + Use the right tool for the job! + + + If you can't find any coal for your torches, you can always make charcoal from trees in a furnace. + + + Digging straight down or straight up is not a great idea. + + + Bonemeal (crafted from a Skeleton bone) can be used as a fertilizer, and can make things grow instantly! + + + Creepers explode when they get close to you! + + + Obsidian is created when water hits a lava source block. + + + Lava can take minutes to disappear COMPLETELY when the source block is removed. + + + Cobblestone is resistant to Ghast fireballs, making it useful for guarding portals. + + + Blocks that can be used as a light source will melt snow and ice. This includes torches, glowstone, and Jack-O-Lanterns. + + + Take caution when building structures made of wool in open air, as lightning from thunderstorms can set wool on fire. + + + A single bucket of lava can be used in a furnace to smelt 100 blocks. + + + The instrument played by a note block depends on the material beneath it. + + + Zombies and Skeletons can survive daylight if they are in water. + + + Attacking a wolf will cause any wolves in the immediate vicinity to turn hostile and attack you. This trait is also shared by Zombie Pigmen. + + + Wolves cannot enter the Nether. + + + Wolves won't attack Creepers. + + + Chickens lay an egg every 5 to 10 minutes. + + + Obsidian can only be mined with a diamond pickaxe. + + + Creepers are the easiest obtainable source of gunpowder. + + + Placing two chests side by side will make one large chest. + + + Tame wolves show their health with the position of their tail. Feed them meat to heal them. + + + Cook cactus in a furnace to get green dye. + + + You'll get the latest info on this game from 4J Studios and Kappische on twitter! + + + Impress your friends by posting screenshots of your Minecraft creations to Facebook from the in-game Pause menu! + + + Read the What's New section in the How To Play menus to see the latest update information about the game. + + + Stackable fences are in the game now! + + + minecraftforum has a section dedicated to the Xbox 360 Edition. + + + Some animals will follow you if you have wheat in your hand. + + + If an animal can't move more than 20 blocks in any direction, it won't despawn. + + + + Music by C418! + + + Notch has over a million followers on twitter! + + + Not all Swedish people have blonde hair. Some, like Jens from Mojang, even have ginger hair! + + + We think 4J Studios has removed Herobrine from the Xbox 360 console game, but we're not too sure. + + + There will be an update to this game eventually! + + + Who is Notch? + + + Mojang has more awards than staff! + + + Some famous people play Minecraft! + + + deadmau5 likes Minecraft! + + + Do not look directly at the bugs. + + + Creepers were born from a coding bug. + + + Is it a chicken or is it a duck? + + + Were you at Minecon? + + + No-one at Mojang has ever seen junkboy's face. + + + Did you know there's a Minecraft Wiki? + + + Mojang's new office is cool! + + + Minecraft: Xbox 360 Edition broke lots of records! + + + Minecon 2013 was in Orlando, Florida, USA! + + + .party() was excellent! + + + Always assume rumors are false, rather than assuming they're true! + + + + {*T3*}HOW TO PLAY : BASICS{*ETW*}{*B*}{*B*} +Minecraft is a game about placing blocks to build anything you can imagine. At night monsters come out, make sure to build a shelter before that happens.{*B*}{*B*} +Use{*CONTROLLER_ACTION_LOOK*} to look around.{*B*}{*B*} +Use{*CONTROLLER_ACTION_MOVE*} to move around.{*B*}{*B*} +Press{*CONTROLLER_ACTION_JUMP*} to jump.{*B*}{*B*} +Push{*CONTROLLER_ACTION_MOVE*} forward twice in rapid succession to sprint. While you hold {*CONTROLLER_ACTION_MOVE*} forward, the character will continue to sprint unless they run out of sprint time or the Food Bar has less than{*ICON_SHANK_03*}.{*B*}{*B*} +Hold{*CONTROLLER_ACTION_ACTION*} to mine and chop using your hand or whatever you are holding. You may need to craft a tool to mine some blocks.{*B*}{*B*} +If you are holding an item in your hand, use{*CONTROLLER_ACTION_USE*} to use that item, or press{*CONTROLLER_ACTION_DROP*} to drop that item. + + + {*T3*}HOW TO PLAY : HUD{*ETW*}{*B*}{*B*} +The HUD shows information about your status; your health, your remaining oxygen when you are under water, your hunger level (you need to eat to replenish this), and your armor if you are wearing any. If you lose some health, but have a food bar with 9 or more{*ICON_SHANK_01*} in it, your health will automatically replenish. Eating food will replenish your food bar.{*B*} +The Experience Bar is also shown here, with a numeric value to show your Experience Level, and the bar indicating how many Experience Points are required to increase your Experience Level. Experience Points are gained by collecting the Experience Orbs dropped by mobs when they die, mining certain block types, breeding animals, fishing, and smelting ores in a furnace.{*B*}{*B*} +It also shows the items that are available to use. Use{*CONTROLLER_ACTION_LEFT_SCROLL*} and{*CONTROLLER_ACTION_RIGHT_SCROLL*} to change the item in your hand. + + + {*T3*}HOW TO PLAY : INVENTORY{*ETW*}{*B*}{*B*} +Use{*CONTROLLER_ACTION_INVENTORY*} to view your inventory.{*B*}{*B*} +This screen shows items available for use in your hand, and all the other items that you are carrying. Your armor is also shown here.{*B*}{*B*} +Use{*CONTROLLER_MENU_NAVIGATE*} to move the pointer. Use{*CONTROLLER_VK_A*} to pick an item under the pointer. If there is more than one item here this will pick them all up, or you can use{*CONTROLLER_VK_X*} to pick up just half of them.{*B*}{*B*} +Move the item with the pointer over another space in the inventory and place it there using{*CONTROLLER_VK_A*}. With multiple items on the pointer, use{*CONTROLLER_VK_A*} to place them all, or{*CONTROLLER_VK_X*} to place just one.{*B*}{*B*} +If an item you are over is armor, you will be shown a tooltip to enable a quick move of this to the right armor slot in the inventory.{*B*}{*B*} +It is possible to change the color of your Leather Armor by dying it, you can do this in the inventory menu by holding the dye in your pointer, then pressing{*CONTROLLER_VK_X*} whilst the pointer is over the piece you wish to dye. + + + + {*T3*}HOW TO PLAY : CHEST{*ETW*}{*B*}{*B*} +Once you have crafted a Chest, you can place this in the world and then use it with{*CONTROLLER_ACTION_USE*} to store items from your inventory.{*B*}{*B*} +Use the pointer to move items between your inventory and the chest.{*B*}{*B*} +Items in the chest will be stored there for you to swap back into your inventory again later. + + + + {*T3*}HOW TO PLAY : LARGE CHEST{*ETW*}{*B*}{*B*} +Two chests placed next to each other will be combined to form a Large Chest. This can store even more items.{*B*}{*B*} +It is used in the same way as a normal chest. + + + + + {*T3*}HOW TO PLAY : CRAFTING{*ETW*}{*B*}{*B*} +In the Crafting interface, you can combine items from your inventory to create new types of items. Use{*CONTROLLER_ACTION_CRAFTING*} to open the crafting interface.{*B*}{*B*} +Scroll through the tabs at the top using{*CONTROLLER_VK_LB*} and{*CONTROLLER_VK_RB*} to select the type of item you wish to craft, then use{*CONTROLLER_MENU_NAVIGATE*} to select the item to craft.{*B*}{*B*} +The crafting area shows the items required to craft the new item. Press{*CONTROLLER_VK_A*} to craft the item and place it in your inventory. + + + + {*T3*}HOW TO PLAY : CRAFTING TABLE{*ETW*}{*B*}{*B*} +You can craft larger items using a Crafting Table.{*B*}{*B*} +Place the table in the world and press{*CONTROLLER_ACTION_USE*} to use it.{*B*}{*B*} +Crafting on a table works in the same way as basic crafting, but you have a larger crafting area, and a more varied selection of items to craft. + + + + {*T3*}HOW TO PLAY : FURNACE{*ETW*}{*B*}{*B*} +A Furnace allows you to change items by firing them. For example, you can turn iron ore into iron ingots in the furnace.{*B*}{*B*} +Place the furnace in the world and press{*CONTROLLER_ACTION_USE*} to use it.{*B*}{*B*} +You need to put some fuel into the bottom of the furnace, and the item to be fired in the top. The furnace will then fire up and start working.{*B*}{*B*} +When your items have been fired, you can move them from the output area into your inventory.{*B*}{*B*} +If an item you are over is an ingredient or fuel for the furnace, you will be shown tooltips to enable a quick move of this to the furnace. + + + + {*T3*}HOW TO PLAY : DISPENSER{*ETW*}{*B*}{*B*} +A Dispenser is used to shoot out items. You will need to place a switch, for example a lever, next to the dispenser to trigger it.{*B*}{*B*} +To fill the dispenser with items press{*CONTROLLER_ACTION_USE*}, then move the items that you want to dispense from your inventory into the dispenser.{*B*}{*B*} +Now when you use the switch, the dispenser will shoot out an item. + + + + + {*T3*}HOW TO PLAY : BREWING{*ETW*}{*B*}{*B*} +Brewing potions requires a Brewing Stand, which can be built at a crafting table. Every potion starts off with a bottle of water, which is made by filling a Glass Bottle with water from a Cauldron, or a water source.{*B*} +A Brewing Stand has three slots for bottles, so can make three potions at the same time. One ingredient can be used over all three bottles, so always brew three potions at the same time to best use your resources.{*B*} +Putting a potion ingredient in the top position at the Brewing Stand will make a base potion after a short time. This doesn't have any effect by itself, but brewing another ingredient with this base potion will give you a potion with an effect.{*B*} +Once you have this potion you can add a third ingredient to make the effect last longer (using Redstone Dust), be more intense (using Glowstone Dust), or turn into a harmful potion (using a Fermented Spider Eye).{*B*} +You can also add gunpowder to any potion to turn it into a Splash Potion, which can then be thrown. The thrown Splash Potion will cause the potion effect to apply over the area it lands in.{*B*} + +The source ingredients for potions are :-{*B*}{*B*} +* {*T2*}Nether Wart{*ETW*}{*B*} +* {*T2*}Spider Eye{*ETW*}{*B*} +* {*T2*}Sugar{*ETW*}{*B*} +* {*T2*}Ghast Tear{*ETW*}{*B*} +* {*T2*}Blaze Powder{*ETW*}{*B*} +* {*T2*}Magma Cream{*ETW*}{*B*} +* {*T2*}Glistering Melon{*ETW*}{*B*} +* {*T2*}Redstone Dust{*ETW*}{*B*} +* {*T2*}Glowstone Dust{*ETW*}{*B*} +* {*T2*}Fermented Spider Eye{*ETW*}{*B*}{*B*} + +You'll need to experiment with combinations of ingredients in order to find out all the different potions you can make. + + + + + {*T3*}HOW TO PLAY : ENCHANTING{*ETW*}{*B*}{*B*} +The Experience Points collected when a mob dies, or when certain blocks are mined or smelted in a furnace, can be used to enchant some tools, weapons, armor and books.{*B*} +When a Sword, Bow, Axe, Pickaxe, Shovel, Armor or Book is placed in the slot below the book in the Enchantment Table, the three buttons to the right of the slot will display some enchantments and their Experience Levels costs.{*B*} +If you do not have enough Experience Levels to use some of these, the cost will appear in red, otherwise it will be shown in green.{*B*}{*B*} +The actual enchantment applied is randomly selected based on the cost displayed.{*B*}{*B*} +If the Enchantment Table is surrounded by Bookshelves (up to a maximum of 15 Bookshelves), with a one block gap between the Bookcase and the Enchantment Table, the potency of the enchantments will be increased, and arcane glyphs will be seen coming from the book on the Enchantment Table.{*B*}{*B*} +All the ingredients for an Enchantment Table can be found within the villages in a world, or by mining and cultivation of the world.{*B*}{*B*} +Enchanted Books are used at the Anvil to apply enchantments to items. This gives you more control over which enchantments you would like on your items.{*B*} + + + + + + + {*T3*}HOW TO PLAY : FARMING ANIMALS{*ETW*}{*B*}{*B*} +If you want to keep your animals in the one place, build a fenced area of less than 20x20 blocks and have your animals inside it. This ensures they will still be there when you come back to see them. + + + + + {*T3*}HOW TO PLAY : BREEDING ANIMALS{*ETW*}{*B*}{*B*} +The animals in Minecraft can breed, and will produce baby versions of themselves!{*B*} +To get the animals to breed, you will need to feed them with the right food to get them to go into 'Love Mode'.{*B*} +Feed Wheat to a cow, mooshroom or sheep, Carrots to a pig, Wheat Seeds or Nether Wart to a chicken, or any kind of meat to a wolf, and they'll start looking for another animal of the same species near them that is also in Love Mode.{*B*} +When two animals of the same species meet, and both are in Love Mode, they will kiss for a few seconds, and then a baby animal will appear. The baby animal will follow their parents for a while before growing into a full sized animal itself.{*B*} +After being in Love Mode, an animal will not be able to enter it again for about five minutes.{*B*} +There is a limit on the number of animals it is possible to have in a world, so you may find the animals don't breed when you have a lot of them. + + + + {*T3*}HOW TO PLAY : NETHER PORTAL{*ETW*}{*B*}{*B*} +A Nether Portal allows the player to travel between the Overworld and the Nether world. The Nether world can be used to fast-travel in the Overworld - traveling one block distance in the Nether is equivalent to traveling 3 blocks in the Overworld, so when you build a portal in the Nether world and exit through it, you will be 3 times further away from your entry point.{*B*}{*B*} +A minimum of 10 Obsidian blocks are required to build the portal, and the portal needs to be 5 blocks high by 4 blocks wide by 1 block deep. Once the portal frame is built, the space inside the frame needs to be set on fire to activate it. This can be done using the Flint and Steel item, or the Fire Charge item.{*B*}{*B*} +Examples of portal construction are shown in the picture to the right. + + + + + {*T3*}HOW TO PLAY : MULTIPLAYER{*ETW*}{*B*}{*B*} +Minecraft on the Xbox 360 console is a multiplayer game by default. If you are playing in a High Definition mode, you can have local players join your game by attaching controllers and pressing START at any point during the game.{*B*}{*B*} +When you start or join an online game, it will be visible to people in your friends list (unless you've selected Invite Only when hosting the game), and if they join the game, it will also be visible to people in their friends list (if you have selected the Allow Friends of Friends option).{*B*} +When you are in a game, you can press the BACK button to bring up a list of all other players in the game, view their Gamer Cards, Kick players from the game, and invite others to the game. + + + + + {*T3*}HOW TO PLAY : SHARING SCREENSHOTS{*ETW*}{*B*}{*B*} +You can capture a screenshot from your game by bringing up the Pause Menu, and pressing{*CONTROLLER_VK_Y*} to Share to Facebook. You'll be presented with a miniature version of your screenshot, and can edit the text associated with the Facebook post.{*B*}{*B*} +There's a camera mode especially for taking these screenshots, so that you can see the front of your character in the shot - press{*CONTROLLER_ACTION_CAMERA*} until you can see the front view of your character before pressing{*CONTROLLER_VK_Y*} to Share.{*B*}{*B*} +Gamertags will not be displayed in the screenshot. + + + + + {*T3*}HOW TO PLAY : BANNING LEVELS{*ETW*}{*B*}{*B*} +If you find offensive content within a level you are playing, you can choose to add the level to your Banned Levels list. +If you would like to do this, bring up the Pause menu, then press{*CONTROLLER_VK_RB*} to select the Ban Level tooltip. +When you attempt to join this level in future, you will be notified that the level is in your Banned Levels list, and given the option to remove it from the list and continue into the level, or back out. + + + {*T3*}HOW TO PLAY : CREATIVE MODE{*ETW*}{*B*}{*B*} +The creative mode interface allows any item in the game to be moved into the player’s inventory without the need for mining or crafting the item. +The items in the player's inventory will not be removed when they are placed or used in the world, and this allows the player to focus on building rather than resource gathering.{*B*} +If you create, load or save a world in Creative Mode, that world will have achievements and leaderboard updates disabled, even if it is then loaded in Survival Mode.{*B*} +To fly when in Creative Mode, press{*CONTROLLER_ACTION_JUMP*} twice quickly. To exit flying, repeat the action. To fly faster, push{*CONTROLLER_ACTION_MOVE*} forward twice in rapid succession while flying. +When in flying mode, you can hold down{*CONTROLLER_ACTION_JUMP*} to move up and{*CONTROLLER_ACTION_SNEAK*} to move down, or use{*CONTROLLER_ACTION_DPAD_UP*} to move up, {*CONTROLLER_ACTION_DPAD_DOWN*} to move down, +{*CONTROLLER_ACTION_DPAD_LEFT*} to move left, and {*CONTROLLER_ACTION_DPAD_RIGHT*} to move right. + + + {*T3*}HOW TO PLAY : HOST AND PLAYER OPTIONS{*ETW*}{*B*}{*B*} + +{*T1*}Game Options{*ETW*}{*B*} +When loading or creating a world, you can press the "More Options" button to enter a menu that allows more control over your game.{*B*}{*B*} + + {*T2*}Player vs Player{*ETW*}{*B*} + When enabled, players can inflict damage on other players. This option only affects Survival mode.{*B*}{*B*} + + {*T2*}Trust Players{*ETW*}{*B*} + When disabled, players joining the game are restricted in what they can do. They are not able to mine or use items, place blocks, use doors and switches, use containers, attack players or attack animals. You can change these options for a specific player using the in-game menu.{*B*}{*B*} + + {*T2*}Fire Spreads{*ETW*}{*B*} + When enabled, fire may spread to nearby flammable blocks. This option can also be changed from within the game.{*B*}{*B*} + + {*T2*}TNT Explodes{*ETW*}{*B*} + When enabled, TNT will explode when detonated. This option can also be changed from within the game.{*B*}{*B*} + + {*T2*}Host Privileges{*ETW*}{*B*} + When enabled, the host can toggle their ability to fly, disable exhaustion, and make themselves invisible from the in-game menu. {*DISABLES_ACHIEVEMENTS*}{*B*}{*B*} + + {*T2*}Daylight Cycle{*ETW*}{*B*} + When disabled, the time of day will not change.{*B*}{*B*} + + {*T2*}Keep Inventory{*ETW*}{*B*} + When enabled, players will keep their inventory when they die.{*B*}{*B*} + + {*T2*}Mob Spawning{*ETW*}{*B*} + When disabled, mobs will not spawn naturally.{*B*}{*B*} + + {*T2*}Mob Griefing{*ETW*}{*B*} + When disabled, prevents monsters and animals from changing blocks (for example, Creeper explosions won't destroy blocks and Sheep won't remove Grass) or picking up items.{*B*}{*B*} + + {*T2*}Mob Loot{*ETW*}{*B*} + When disabled, monsters and animals will not drop loot (for example, Creepers won't drop gunpowder).{*B*}{*B*} + + {*T2*}Tile Drops{*ETW*}{*B*} + When disabled, blocks will not drop items when destroyed (for example, Stone blocks won't drop Cobblestone).{*B*}{*B*} + + {*T2*}Natural Regeneration{*ETW*}{*B*} + When disabled, players will not regenerate health naturally.{*B*}{*B*} + +{*T1*}World Generation Options{*ETW*}{*B*} +When creating a new world there are some additional options.{*B*}{*B*} + + {*T2*}Generate Structures{*ETW*}{*B*} + When enabled, structures such as Villages and Strongholds will generate in the world.{*B*}{*B*} + + {*T2*}Superflat World{*ETW*}{*B*} + When enabled, a completely flat world will be generated in the Overworld and in the Nether.{*B*}{*B*} + + {*T2*}Bonus Chest{*ETW*}{*B*} + When enabled, a chest containing some useful items will be created near the player spawn point.{*B*}{*B*} + + {*T2*}Reset Nether{*ETW*}{*B*} + When enabled, the Nether will be re-generated. This is useful if you have an older save where Nether Fortresses were not present.{*B*}{*B*} + + {*T1*}In-Game Options{*ETW*}{*B*} + While in the game a number of options can be accessed by pressing {*BACK_BUTTON*} to bring up the in-game menu.{*B*}{*B*} + + {*T2*}Host Options{*ETW*}{*B*} + The host player, and any players set as moderators can access the "Host Option" menu. In this menu they can enable and disable fire spreading and TNT exploding.{*B*}{*B*} + +{*T1*}Player Options{*ETW*}{*B*} +To modify the privileges for a player, select their name and press{*CONTROLLER_VK_A*} to bring up the player privileges menu where you can use the following options.{*B*}{*B*} + + {*T2*}Can Build And Mine{*ETW*}{*B*} + This option is only available when "Trust Players" is turned off. When this option is enabled, the player is able to interact with the world as normal. When disabled the player will not be able to place or destroy blocks, or interact with many items and blocks.{*B*}{*B*} + + {*T2*}Can Use Doors and Switches{*ETW*}{*B*} + This option is only available when "Trust Players" is turned off. When this option is disabled, the player will not be able to use doors and switches.{*B*}{*B*} + + {*T2*}Can Open Containers{*ETW*}{*B*} + This option is only available when "Trust Players" is turned off. When this option is disabled, the player will not be able to open containers, such as chests.{*B*}{*B*} + + {*T2*}Can Attack Players{*ETW*}{*B*} + This option is only available when "Trust Players" is turned off. When this option is disabled the player will not be able to cause damage to other players.{*B*}{*B*} + + {*T2*}Can Attack Animals{*ETW*}{*B*} + This option is only available when "Trust Players" is turned off. When this option is disabled the player will not be able to cause damage to animals.{*B*}{*B*} + + {*T2*}Moderator{*ETW*}{*B*} + When this option is enabled, the player is able to change privileges for other players (except the host) if "Trust Players" is turned off, kick players and they can enable and disable fire spreading and TNT exploding.{*B*}{*B*} + + {*T2*}Kick Player{*ETW*}{*B*} + {*KICK_PLAYER_DESCRIPTION*}{*B*}{*B*} + +{*T1*}Host Player Options{*ETW*}{*B*} +If "Host Privileges" is enabled the host player can modify some privileges for themselves. To modify the privileges for a player, select their name and press{*CONTROLLER_VK_A*} to bring up the player privileges menu where you can use the following options.{*B*}{*B*} + + {*T2*}Can Fly{*ETW*}{*B*} + When this option is enabled, the player is able to fly. This option is only relevant to Survival mode, as flying is enabled for all players in Creative mode.{*B*}{*B*} + + {*T2*}Disable Exhaustion{*ETW*}{*B*} + This option only affects Survival mode. When enabled, physical activities (walking/sprinting/jumping etc.) do not decrease the food bar. However, if the player becomes injured, the food bar will slowly decrease while the player is healing.{*B*}{*B*} + + {*T2*}Invisible{*ETW*}{*B*} + When this option is enabled, the player is not visible to other players and is invulnerable.{*B*}{*B*} + + {*T2*}Can Teleport{*ETW*}{*B*} + This allows the player to move players or themselves to other players in the world. + + + + + 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 + + + Previous Page + + + Basics + + + HUD + + + Inventory + + + Chests + + + Crafting + + + Furnace + + + Dispenser + + + + Farming Animals + + + Breeding Animals + + + Brewing + + + Enchantment + + + + Nether Portal + + + Multiplayer + + + Sharing Screenshots + + + Banning Levels + + + Creative Mode + + + Host and Player Options + + + + Trading + + + Anvil + + + + The End + + + + {*T3*}HOW TO PLAY : THE END{*ETW*}{*B*}{*B*} +The End is another dimension in the game, which is reached through an active End Portal. The End Portal can be found in a Stronghold, which is deep underground in the Overworld.{*B*} +To activate the End Portal, you'll need to put an Eye of Ender into any End Portal Frame without one.{*B*} +Once the portal is active, jump in to it to go to The End.{*B*}{*B*} +In The End you will meet the Ender Dragon, a fierce and powerful enemy, along with many Enderman, so you will have to be well prepared for the battle before going there!{*B*}{*B*} +You'll find that there are Ender Crystals on top of eight Obsidian spikes that the Ender Dragon uses to heal itself, +so the first step in the battle is to destroy each of these.{*B*} +The first few can be reached with arrows, but the later ones are protected by an Iron Fence cage, and you will need to build up to them.{*B*}{*B*} +While you are doing this, the Ender Dragon will be attacking you by flying at you and spitting Ender acid balls!{*B*} +If you approach the Egg Podium in the centre of the spikes, the Ender Dragon will fly down and attack you and this is where you can really do some damage to it!{*B*} +Avoid the acid breath, and target the Ender Dragon's eyes for the best results. If possible, bring some friends in to The End to help you with the battle!{*B*}{*B*} +Once you are in The End, your friends will be able to see the location of the End Portal within the Stronghold on their maps, +so they can easily join you. + + + + Sprint + + + + What's New + + + + {*T3*}Changes and Additions{*ETW*}{*B*}{*B*} +- Added new items - 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*} - 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. + + + Used to dig dirt, grass, sand, gravel and snow faster than by hand. Shovels are required to dig snowballs. + + + Required to mine stone-related blocks and ore. + + + Used to chop wood-related blocks faster than by hand. + + + Used to till dirt and grass blocks to prepare for crops. + + + Wooden doors are activated by using, hitting them or with Redstone. + + + Iron doors can only be opened by Redstone, buttons or switches. + + + + NOT USED + + + NOT USED + + + NOT USED + + + NOT USED + + + + Gives the user 1 Armor when worn. + + + + Gives the user 3 Armor when worn. + + + + Gives the user 2 Armor when worn. + + + + Gives the user 1 Armor when worn. + + + + Gives the user 2 Armor when worn. + + + + Gives the user 5 Armor when worn. + + + + Gives the user 4 Armor when worn. + + + + Gives the user 1 Armor when worn. + + + + Gives the user 2 Armor when worn. + + + + Gives the user 6 Armor when worn. + + + + Gives the user 5 Armor when worn. + + + + Gives the user 2 Armor when worn. + + + + Gives the user 2 Armor when worn. + + + + Gives the user 5 Armor when worn. + + + + Gives the user 3 Armor when worn. + + + + Gives the user 1 Armor when worn. + + + + Gives the user 3 Armor when worn. + + + + Gives the user 8 Armor when worn. + + + + Gives the user 6 Armor when worn. + + + + Gives the user 3 Armor when worn. + + + A shiny ingot which can be used to craft tools made from this material. Created by smelting ore in a furnace. + + + Allows ingots, gems, or dyes to be crafted into placeable blocks. Can be used as an expensive building block or compact storage of the ore. + + + Used to send an electrical charge when stepped on by a player, an animal, or a monster. Wooden Pressure Plates can also be activated by dropping something on them. + + + Used for compact staircases. + + + Used for making long staircases. Two slabs placed on top of each other will create a normal-sized double slab block. + + + Used for making long staircases. Two slabs placed on top of each other will create a normal-sized double slab block. + + + Used to create light. Torches also melt snow and ice. + + + + Used as a building material and can be crafted into many things. Can be crafted from any form of wood. + + + Used as a building material. Is not influenced by gravity like normal Sand. + + + Used as a building material. + + + Used to craft torches, arrows, signs, ladders, fences and as handles for tools and weapons. + + + Used to forward time from any time at night to morning if all the players in the world are in bed, and changes the spawn point of the player. +The colors of the bed are always the same, regardless of the colors of wool used. + + + Allows you to craft a more varied selection of items than the normal crafting. + + + Allows you to smelt ore, create charcoal and glass, and cook fish and porkchops. + + + Stores blocks and items inside. Place two chests side by side to create a larger chest with double the capacity. + + + Used as a barrier that cannot be jumped over. Counts as 1.5 blocks high for players, animals and monsters, but 1 block high for other blocks. + + + Used to climb vertically. + + + Activated by using, hitting them or with redstone. They function as normal doors, but are a one by one block and lay flat on the ground. + + + Shows text entered by you or other players. + + + + Used to create brighter light than torches. Melts snow/ice and can be used underwater. + + + Used to cause explosions. Activated after placing by igniting with Flint and Steel item, or with an electrical charge. + + + Used to hold mushroom stew. You keep the bowl when the stew has been eaten. + + + Used to hold and transport water, lava and milk. + + + Used to hold and transport water. + + + Used to hold and transport lava. + + + Used to hold and transport milk. + + + + Used to create fire, ignite TNT, and open a portal once it has been built. + + + Used to catch fish. + + + Displays positions of the Sun and Moon. + + + Points to your start point. + + + Will create an image of an area explored while held. This can be used for path-finding. + + + 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. + + + 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 1{*ICON_SHANK_01*}. Can be used 6 times. + + + Restores 1{*ICON_SHANK_01*}. + + + Restores 1{*ICON_SHANK_01*}. + + + Restores 3{*ICON_SHANK_01*}. + + + Restores 1{*ICON_SHANK_01*}, or can be cooked in a furnace. Eating this can cause you to be poisoned. + + + Restores 3{*ICON_SHANK_01*}. Created by cooking raw chicken in a furnace. + + + Restores 1.5{*ICON_SHANK_01*}, or can be cooked in a furnace. + + + Restores 4{*ICON_SHANK_01*}. Created by cooking raw beef in a furnace. + + + Restores 1.5{*ICON_SHANK_01*}, or can be cooked in a furnace. + + + Restores 4{*ICON_SHANK_01*}. Created by cooking a raw porkchop in a furnace. + + + Restores 1{*ICON_SHANK_01*}, or can be cooked in a furnace. Can be fed to an Ocelot to tame it. + + + Restores 2.5{*ICON_SHANK_01*}. Created by cooking a raw fish in a furnace. + + + Restores 2{*ICON_SHANK_01*}, and can be crafted into a golden apple. + + + Restores 2{*ICON_SHANK_01*}, and regenerates health for 4 seconds. Crafted from an apple and gold nuggets. + + + + Restores 2{*ICON_SHANK_01*}. Eating this can cause you to be poisoned. + + + + Used in the cake recipe, and as an ingredient for brewing potions. + + + Used to send an electrical charge by being turned on or off. Stays in the on or off state until pressed again. + + + Constantly sends an electrical charge, or can be used as a receiver/transmitter when connected to the side of a block. +Can also be used for low-level lighting. + + + Used in Redstone circuits as repeater, a delayer, and/or a diode. + + + Used to send an electrical charge by being pressed. Stays activated for approximately a second before shutting off again. + + + Used to hold and shoot out items in a random order when given a Redstone charge. + + + Plays a note when triggered. Hit it to change the pitch of the note. Placing this on top of different blocks will change the type of instrument. + + + + Used to guide minecarts. + + + When powered, accelerates minecarts that pass over it. When unpowered, causes minecarts to stop on it. + + + Functions like a Pressure Plate (sends a Redstone signal when powered) but can only be activated by a Minecart. + + + Used to transport you, an animal, or a monster along rails. + + + Used to transport goods along rails. + + + Will move along rails and can push other minecarts when coal is put in it. + + + Used to travel in water more quickly than swimming. + + + + Collected from sheep, and can be colored with dyes. + + + Used as a building material and can be colored with dyes. This recipe is not recommended because Wool can be easily obtained from Sheep. + + + Used as a dye to create black wool. + + + Used as a dye to create green wool. + + + Used as a dye to create brown wool, as an ingredient in cookies, or to grow Cocoa Pods. + + + Used as a dye to create silver wool. + + + Used as a dye to create yellow wool. + + + Used as a dye to create red wool. + + + Used to instantly grow crops, trees, tall grass, huge mushrooms and flowers, and can be used in dye recipes. + + + Used as a dye to create pink wool. + + + Used as a dye to create orange wool. + + + Used as a dye to create lime wool. + + + Used as a dye to create gray wool. + + + Used as a dye to create light gray wool. +(Note: light gray dye can also be made by combining gray dye with bone meal, letting you make four light gray dyes from every ink sac instead of three.) + + + Used as a dye to create light blue wool. + + + Used as a dye to create cyan wool. + + + Used as a dye to create purple wool. + + + Used as a dye to create magenta wool. + + + Used as dye to create Blue Wool. + + + Plays Music Discs. + + + Use these to create very strong tools, weapons or armor. + + + Used to create brighter light than torches. Melts snow/ice and can be used underwater. + + + Used to create books and maps. + + + Can be used to create bookshelves or enchanted to make Enchanted Books. + + + Allows the creation of more powerful enchantments when placed around the Enchantment Table. + + + Used as decoration. + + + + Can be mined with an iron pickaxe or better, then smelted in a furnace to produce gold ingots. + + + Can be mined with a stone pickaxe or better, then smelted in a furnace to produce iron ingots. + + + Can be mined with a pickaxe to collect coal. + + + Can be mined with a stone pickaxe or better to collect lapis lazuli. + + + Can be mined with an iron pickaxe or better to collect diamonds. + + + Can be mined with an iron pickaxe or better to collect redstone dust. + + + Can be mined with a pickaxe to collect cobblestone. + + + Collected using a shovel. Can be used for construction. + + + Can be planted and it will eventually grow into a tree. + + + This cannot be broken. + + + Sets fire to anything that touches it. Can be collected in a bucket. + + + Collected using a shovel. Can be smelted into glass using the furnace. Is affected by gravity if there is no other tile underneath it. + + + Collected using a shovel. Sometimes produces flint when dug up. Is affected by gravity if there is no other tile underneath it. + + + Chopped using an axe, and can be crafted into planks or used as a fuel. + + + Created in a furnace by smelting sand. Can be used for construction, but will break if you try to mine it. + + + Mined from stone using a pickaxe. Can be used to construct a furnace or stone tools. + + + Baked from clay in a furnace. + + + Can be baked into bricks in a furnace. + + + When broken drops clay balls which can be baked into bricks in a furnace. + + + A compact way to store snowballs. + + + Can be dug with a shovel to create snowballs. + + + Sometimes produces wheat seeds when broken. + + + Can be crafted into a dye. + + + Can be crafted with a bowl to make stew. + + + Can only be mined with a diamond pickaxe. Is produced by the meeting of water and still lava, and is used to build a portal. + + + Spawns monsters into the world. + + + Is placed on the ground to carry an electrical charge. When brewed with a potion it will increase the duration of the effect. + + + When fully grown, crops can be harvested to collect wheat. + + + Ground that has been prepared ready to plant seeds. + + + Can be cooked in a furnace to create a green dye. + + + Can be crafted to create sugar. + + + Can be worn as a helmet or crafted with a torch to create a Jack-O-Lantern. It is also the main ingredient in Pumpkin Pie. + + + Burns forever if set alight. + + + Slows the movement of anything walking over it. + + + Standing in the portal allows you to pass between the Overworld and the Nether. + + + + Used as a fuel in a furnace, or crafted to make a torch. + + + Collected by killing a spider, and can be crafted into a Bow or Fishing Rod, or placed on the ground to create Tripwire. + + + Collected by killing a chicken, and can be crafted into an arrow. + + + Collected by killing a Creeper, and can be crafted into TNT or used as an ingredient for brewing potions. + + + Can be planted in farmland to grow crops. Make sure there's enough light for the seeds to grow! + + + Harvested from crops, and can be used to craft food items. + + + Collected by digging gravel, and can be used to craft a flint and steel. + + + When used on a pig it allows you to ride the pig. The pig can then be steered using a Carrot on a Stick. + + + Collected by digging snow, and can be thrown. + + + Collected by killing a cow, and can be crafted into armor or used to make Books. + + + Collected by killing a Slime, and used as an ingredient for brewing potions or crafted to make Sticky Pistons. + + + Dropped randomly by chickens, and can be crafted into food items. + + + Collected by mining Glowstone, and can be crafted to make Glowstone blocks again or brewed with a potion to increase the potency of the effect. + + + Collected by killing a Skeleton. Can be crafted into bone meal. Can be fed to a wolf to tame it. + + + Collected by getting a Skeleton to kill a Creeper. Can be played in a jukebox. + + + Extinguishes fire and helps crops grow. Can be collected in a bucket. + + + When broken sometimes drops a sapling which can then be replanted to grow into a tree. + + + Found in dungeons, can be used for construction and decoration. + + + Used to obtain wool from sheep and harvest leaf blocks. + + + When powered (using a button, a lever, a pressure plate, a redstone torch, or redstone with any one of these), a piston extends if it can and pushes blocks. + + + When powered (using a button, a lever, a pressure plate, a redstone torch, or redstone with any one of these), a piston extends if it can and pushes blocks. When it retracts it pulls back the block touching the extended part of the piston. + + + Made from Stone blocks, and commonly found in Strongholds. + + + Used as a barrier, similar to fences. + + + Similar to a door, but used primarily with fences. + + + Can be crafted from Melon Slices. + + + Transparent blocks that can be used as an alternative to Glass Blocks. + + + Can be planted to grow pumpkins. + + + Can be planted to grow melons. + + + Dropped by Enderman when they die. When thrown, the player will be teleported to the position the Ender Pearl lands at, and will lose some health. + + + A block of dirt with grass growing on top. Collected using a shovel. Can be used for construction. + + + Can be used for construction and decoration. + + + Slows movement when walking through it. Can be destroyed using shears to collect string. + + + Spawns a Silverfish when destroyed. May also spawn Silverfish if nearby to another Silverfish being attacked. + + + Grows over time when placed. Can be collected using shears. Can be climbed like a ladder. + + + Slippery when walked on. Turns into water if above another block when destroyed. Melts if close enough to a light source or when placed in The Nether. + + + Can be used as decoration. + + + Used in potion brewing, and for locating Strongholds. Dropped by Blazes who tend to be found near or in Nether Fortresses. + + + Used in potion brewing. Dropped by Ghasts when they die. + + + Dropped by Zombie Pigmen when they die. Zombie Pigmen can be found in the Nether. Used as an ingredient for brewing potions. + + + Used in potion brewing. This can be found naturally growing in Nether Fortresses. It can also be planted on Soul Sand. + + + When used, can have various effects, depending on what it is used on. + + + Can be filled with water, and used as the starting ingredient for a potion in the Brewing Stand. + + + This is a poisonous food and brewing item. Dropped when a Spider or Cave Spider is killed by a player. + + + Used in potion brewing, mainly to create potions with a negative effect. + + + Used in potion brewing, or crafted with other items to make Eye of Ender or Magma Cream. + + + Used in potion brewing. + + + Used for making Potions and Splash Potions. + + + Filled with water by rain or with a bucket of water, and can then be used to fill Glass Bottles with water. + + + When thrown, will show the direction to an End Portal. When twelve of these are placed in the End Portal Frames, the End Portal will be activated. + + + Used in potion brewing. + + + Similar to Grass Blocks, but very good for growing mushrooms on. + + + Floats on water, and can be walked on. + + + Used to build Nether Fortresses. Immune to Ghast's fireballs. + + + Used in Nether Fortresses. + + + Found in Nether Fortresses, and will drop Nether Wart when broken. + + + This allows players to enchant Swords, Pickaxes, Axes, Shovels, Bows and Armor, using the player's Experience Points. + + + This can be activated using twelve Eye of Ender, and will allow the player to travel to The End dimension. + + + Used to form an End Portal. + + + A block type found in The End. It has a very high blast resistance, so is useful for building with. + + + This block is created by the defeat of the Dragon in The End. + + + When thrown, it drops Experience Orbs which increase your experience points when collected. + + + Useful for setting things on fire, or for indiscriminately starting fires when fired from a Dispenser. + + + These are similar to a display case, and will display the item or block placed in it. + + + When thrown can spawn a creature of the type indicated. + + + Used for making long staircases. Two slabs placed on top of each other will create a normal-sized double slab block. + + + Used for making long staircases. Two slabs placed on top of each other will create a normal-sized double slab block. + + + Created by smelting Netherrack in a furnace. Can be crafted into Nether Brick blocks. + + + When powered they emit light. + + + Can be farmed to collect Cocoa Beans. + + + Mob Heads can be placed as a decoration, or worn as a mask in the helmet slot. + + + + 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. + + + + 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 + + + Concept Artist + + + + Number Crunching and Statistics + + + + Bully Coordinator + + + + Original Design and Code by + + + Project Manager/Producer + + + Rest of Mojang Office + + + Lead Game Programmer Minecraft PC + + + Ninja Coder + + + CEO + + + White Collar Worker + + + Customer Support + + + Office DJ + + + Designer/Programmer Minecraft - Pocket Edition + + + Developer + + + Chief Architect + + + Art Developer + + + Game Crafter + + + Director of Fun + + + Music and Sounds + + + Programming + + + Art + + + QA + + + Executive Producer + + + Lead Producer + + + Producer + + + Test Lead + + + Lead Tester + + + Design Team + + + Development Team + + + Release Management + + + Director, XBLA Publishing + + + Business Development + + + Portfolio Director + + + Product Manager + + + Marketing + + + Community Manager + + + Europe Localization Team + + + Redmond Localization Team + + + Asia Localization Team + + + User Research Team + + + MGS Central Teams + + + Milestone Acceptance Tester + + + Special Thanks + + + Test Manager + + + Senior Test Lead + + + SDET + + + Project STE + + + Additional STE + + + Test Associates + + + Jon Kågström + + + Tobias Möllstam + + + Risë Lugo + + + + Wooden Sword + + + + Stone Sword + + + Iron Sword + + + Diamond Sword + + + Golden Sword + + + Wooden Shovel + + + Stone Shovel + + + Iron Shovel + + + Diamond Shovel + + + Golden Shovel + + + Wooden Pickaxe + + + Stone Pickaxe + + + Iron Pickaxe + + + Diamond Pickaxe + + + Golden Pickaxe + + + Wooden Axe + + + Stone Axe + + + Iron Axe + + + Diamond Axe + + + Golden Axe + + + Wooden Hoe + + + Stone Hoe + + + Iron Hoe + + + Diamond Hoe + + + Golden Hoe + + + Wooden Door + + + Iron Door + + + Chain Helmet + + + Chain Chestplate + + + Chain Leggings + + + Chain Boots + + + Leather Cap + + + Iron Helmet + + + Diamond Helmet + + + Golden Helmet + + + Leather Tunic + + + Iron Chestplate + + + Diamond Chestplate + + + Golden Chestplate + + + Leather Pants + + + Iron Leggings + + + Diamond Leggings + + + Golden Leggings + + + Leather Boots + + + Iron Boots + + + Diamond Boots + + + Golden Boots + + + Iron Ingot + + + Gold Ingot + + + Bucket + + + Water Bucket + + + Lava Bucket + + + Flint and Steel + + + Apple + + + Bow + + + Arrow + + + Coal + + + Charcoal + + + Diamond + + + Stick + + + Bowl + + + Mushroom Stew + + + String + + + Feather + + + Gunpowder + + + Wheat Seeds + + + Wheat + + + Bread + + + Flint + + + Raw Porkchop + + + Cooked Porkchop + + + Painting + + + Golden Apple + + + Sign + + + Minecart + + + Saddle + + + Redstone + + + Snowball + + + Boat + + + Leather + + + Milk Bucket + + + Brick + + + Clay + + + Sugar Canes + + + Paper + + + Book + + + Slimeball + + + Minecart with Chest + + + Minecart with Furnace + + + Egg + + + Compass + + + Fishing Rod + + + Clock + + + Glowstone Dust + + + Raw Fish + + + Cooked Fish + + + Dye Powder + + + Ink Sac + + + Rose Red + + + Cactus Green + + + Cocoa Beans + + + Lapis Lazuli + + + Purple Dye + + + Cyan Dye + + + Light Gray Dye + + + Gray Dye + + + Pink Dye + + + Lime Dye + + + Dandelion Yellow + + + Light Blue Dye + + + Magenta Dye + + + Orange Dye + + + Bone Meal + + + Bone + + + Sugar + + + Cake + + + Bed + + + Redstone Repeater + + + Cookie + + + Map + + + Empty Map + + + Music Disc - "13" + + + Music Disc - "cat" + + + Music Disc - "blocks" + + + Music Disc - "chirp" + + + Music Disc - "far" + + + Music Disc - "mall" + + + Music Disc - "mellohi" + + + Music Disc - "stal" + + + Music Disc - "strad" + + + Music Disc - "ward" + + + Music Disc - "11" + + + Music Disc - "where are we now" + + + Shears + + + Pumpkin Seeds + + + Melon Seeds + + + Raw Chicken + + + Cooked Chicken + + + Raw Beef + + + Steak + + + Rotten Flesh + + + Ender Pearl + + + Melon Slice + + + Blaze Rod + + + Ghast Tear + + + Gold Nugget + + + Nether Wart + + + {*splash*}{*prefix*}Potion {*postfix*} + + + Glass Bottle + + + Water Bottle + + + Spider Eye + + + Fermented Spider Eye + + + Blaze Powder + + + Magma Cream + + + Brewing Stand + + + Cauldron + + + Eye of Ender + + + Glistering Melon + + + Bottle o' Enchanting + + + Fire Charge + + + Fire Charge (Charcoal) + + + Fire Charge (Coal) + + + Item Frame + + + Spawn {*CREATURE*} + + + Nether Brick + + + Skull + + + Skeleton Skull + + + Wither Skeleton Skull + + + Zombie Head + + + Head + + + %s's Head + + + Creeper Head + + + 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 + + + Grass Block + + + Dirt + + + Cobblestone + + + Oak Wood Planks + + + Spruce Wood Planks + + + Birch Wood Planks + + + Jungle Wood Planks + + + Wood Planks (any type) + + + Sapling + + + Oak Sapling + + + Spruce Sapling + + + Birch Sapling + + + Jungle Tree Sapling + + + Bedrock + + + Water + + + Lava + + + Sand + + + Sandstone + + + Gravel + + + Gold Ore + + + Iron Ore + + + Coal Ore + + + Wood + + + Oak Wood + + + Spruce Wood + + + Birch Wood + + + Jungle Wood + + + Oak + + + Spruce + + + Birch + + + Leaves + + + Oak Leaves + + + Spruce Leaves + + + Birch Leaves + + + Jungle Leaves + + + Sponge + + + Glass + + + Wool + + + Black Wool + + + Red Wool + + + Green Wool + + + Brown Wool + + + Blue Wool + + + Purple Wool + + + Cyan Wool + + + Light Gray Wool + + + Gray Wool + + + Pink Wool + + + Lime Wool + + + Yellow Wool + + + Light Blue Wool + + + Magenta Wool + + + Orange Wool + + + White Wool + + + Flower + + + Rose + + + Mushroom + + + Block of Gold + + + A compact way of storing Gold. + + + A compact way of storing Iron. + + + Block of Iron + + + Stone Slab + + + Stone Slab + + + Sandstone Slab + + + Oak Wood Slab + + + Cobblestone Slab + + + Bricks Slab + + + Stone Bricks Slab + + + Oak Wood Slab + + + Spruce Wood Slab + + + Birch Wood Slab + + + Jungle Wood Slab + + + Nether Brick Slab + + + Bricks + + + TNT + + + Bookshelf + + + Moss Stone + + + Obsidian + + + Torch + + + Torch (Coal) + + + Torch (Charcoal) + + + Fire + + + Monster Spawner + + + Oak Wood Stairs + + + Chest + + + Redstone Dust + + + Diamond Ore + + + Block of Diamond + + + A compact way of storing Diamonds. + + + Crafting Table + + + Crops + + + Farmland + + + Furnace + + + Sign + + + Wooden Door + + + Ladder + + + Rail + + + Powered Rail + + + Detector Rail + + + Stone Stairs + + + Lever + + + Pressure Plate + + + Iron Door + + + Redstone Ore + + + Redstone Torch + + + Button + + + Snow + + + Ice + + + Cactus + + + Clay + + + Sugar Cane + + + Jukebox + + + Fence + + + Pumpkin + + + Jack-O-Lantern + + + Netherrack + + + Soul Sand + + + Glowstone + + + Portal + + + Lapis Lazuli Ore + + + Lapis Lazuli Block + + + A compact way of storing Lapis Lazuli. + + + Dispenser + + + Note Block + + + Cake + + + Bed + + + Web + + + Tall Grass + + + Dead Bush + + + Diode + + + Locked Chest + + + Trapdoor + + + Wool (any color) + + + Piston + + + Sticky Piston + + + Silverfish Block + + + Stone Bricks + + + Mossy Stone Bricks + + + Cracked Stone Bricks + + + Chiseled Stone Bricks + + + Mushroom + + + Mushroom + + + Iron Bars + + + Glass Pane + + + Melon + + + Pumpkin Stem + + + Melon Stem + + + Vines + + + Fence Gate + + + Brick Stairs + + + Stone Brick Stairs + + + Silverfish Stone + + + Silverfish Cobblestone + + + Silverfish Stone Brick + + + Mycelium + + + Lily Pad + + + Nether Brick + + + Nether Brick Fence + + + Nether Brick Stairs + + + Nether Wart + + + Enchantment Table + + + Brewing Stand + + + Cauldron + + + End Portal + + + End Portal Frame + + + End Stone + + + Dragon Egg + + + Shrub + + + Fern + + + Sandstone Stairs + + + Spruce Wood Stairs + + + Birch Wood Stairs + + + Jungle Wood Stairs + + + Redstone Lamp + + + Cocoa + + + Skull + + + + + 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 + + + Layout + + + Move/Sprint + + + Look + + + Pause + + + Jump + + + Jump/Fly Up + + + Inventory + + + Cycle Held Item + + + Action + + + Use + + + Crafting + + + Drop + + + Sneak + + + Sneak/Fly Down + + + Change Camera Mode + + + Players/Invite + + + Movement (When Flying) + + + Layout 1 + + + Layout 2 + + + Layout 3 + + + ]]> + + + ]]> + + + ]]> + + + ]]> + + + ]]> + + + ]]> + + + ]]> + + + ]]> + + + ]]> + + + ]]> + + + ]]> + + + ]]> + + + ]]> + + + ]]> + + + ]]> + + + ]]> + + + ]]> + + + ]]> + + + + ]]> + + + ]]> + + + + + {*B*}Press{*CONTROLLER_VK_A*} to continue. + + + {*B*}Press{*CONTROLLER_VK_A*} to start the tutorial.{*B*} +Press{*CONTROLLER_VK_B*} if you think you are ready to play on your own. + + + + Minecraft is a game about placing blocks to build anything you can imagine. +At night monsters come out, make sure to build a shelter before that happens. + + + Use{*CONTROLLER_ACTION_LOOK*} to look up, down and around. + + + Use{*CONTROLLER_ACTION_MOVE*} to move around. + + + To sprint, push{*CONTROLLER_ACTION_MOVE*} forward twice quickly. While you hold{*CONTROLLER_ACTION_MOVE*} forward, the character will continue to sprint unless they run out of sprint time or food. + + + Press{*CONTROLLER_ACTION_JUMP*} to jump. + + + Hold{*CONTROLLER_ACTION_ACTION*} to mine and chop using your hand or whatever you are holding. You may need to craft a tool to mine some blocks... + + + Hold{*CONTROLLER_ACTION_ACTION*} to chop down 4 blocks of wood (tree trunks).{*B*}When a block breaks you can pick it up by standing near to the floating item that appears, causing it to appear in your inventory. + + + Press{*CONTROLLER_ACTION_CRAFTING*} to open the crafting interface. + + + As you collect and craft more items, your inventory will fill up.{*B*} +Press{*CONTROLLER_ACTION_INVENTORY*} to open the inventory. + + + As you move around, mine and attack, you will deplete your food bar{*ICON_SHANK_01*}. Sprinting and sprint jumping use a lot more food than walking and jumping normally. + + + If you lose some health, but have a food bar with 9 or more{*ICON_SHANK_01*} in it, your health will automatically replenish. Eating food will replenish your food bar. + + + With a food item in your hand, hold{*CONTROLLER_ACTION_USE*} to eat it and replenish your food bar. You cannot eat if your food bar is full. + + + Your food bar is low, and you have lost some health. Eat the steak in your inventory to replenish your food bar and start healing.{*ICON*}364{*/ICON*} + + + The wood that you have collected can be crafted into planks. Open the crafting interface to craft them.{*PlanksIcon*} + + + A lot of crafting can involve multiple steps. Now that you have some planks there are more items that you can craft. Create a crafting table.{*CraftingTableIcon*} + + + To make collecting blocks faster you can build tools designed for the job. Some tools have a handle made of sticks. Craft some sticks now.{*SticksIcon*} + + + Use{*CONTROLLER_ACTION_LEFT_SCROLL*} and{*CONTROLLER_ACTION_RIGHT_SCROLL*} to change the current held item. + + + Use{*CONTROLLER_ACTION_USE*} to use items, interact with objects and place some items. Items that have been placed can be picked up again by mining them with the right tool. + + + With the crafting table selected, point the crosshair where you want it and use{*CONTROLLER_ACTION_USE*} to place a crafting table. + + + Point the crosshair at the crafting table and press{*CONTROLLER_ACTION_USE*} to open it. + + + A shovel helps dig soft blocks, like dirt and snow, faster. As you collect more materials you can craft tools that work faster and last longer. Create a wooden shovel.{*WoodenShovelIcon*} + + + An axe helps chop wood and wooden tiles, faster. As you collect more materials you can craft tools that work faster and last longer. Create a wooden axe.{*WoodenHatchetIcon*} + + + A pickaxe helps dig hard blocks, like stone and ore, faster. As you collect more materials you can craft tools that work faster and last longer, and allow you to mine harder materials. Create a wooden pickaxe.{*WoodenPickaxeIcon*} + + + Open the container + + + Night time can approach quickly, and it is dangerous to be outside unprepared. You can craft armor and weapons, but it is sensible to have a safe shelter. + + + Nearby there is an abandoned Miner's shelter that you can complete to be safe overnight. + + + You will need to collect the resources to complete the shelter. Walls and roof can be made of any tile type, but you will want to create a door, some windows and lighting. + + + Use your pickaxe to mine some stone blocks. Stone blocks will produce cobblestone when mined. If you collect 8 cobblestone blocks you can build a furnace. You may need to dig through some dirt to reach the stone, so use your shovel for this.{*StoneIcon*} + + + You have collected enough cobblestone to build a furnace. Use your crafting table to create one. + + + Use{*CONTROLLER_ACTION_USE*} to place the furnace in the world, and then open it. + + + Use the furnace to create some charcoal. If you are waiting for it to finish how about using the time to collect more materials to finish the shelter? + + + Use the furnace to create some glass. If you are waiting for it to finish how about using the time to collect more materials to finish the shelter? + + + A good shelter will have a door so that you can easily go in and out without having to mine and replace the walls. Craft a wooden door now.{*WoodenDoorIcon*} + + + Use{*CONTROLLER_ACTION_USE*} to place the door. You can use{*CONTROLLER_ACTION_USE*} to open and close a wooden door in the world. + + + It can get very dark at night, so you will want some lighting inside your shelter so that you can see. Craft a torch now from sticks and charcoal using the crafting interface.{*TorchIcon*} + + + You have completed the first part of the tutorial. + + + {*B*} +Press{*CONTROLLER_VK_A*} to continue with the tutorial.{*B*} +Press{*CONTROLLER_VK_B*} if you think you are ready to play on your own. + + + + This is your inventory. It shows items available for use in your hand, and all the other items that you are carrying. Your armor is also shown here. + + {*B*} +Press{*CONTROLLER_VK_A*} to continue.{*B*} +Press{*CONTROLLER_VK_B*} if you already know how to use the inventory. + + + Use{*CONTROLLER_MENU_NAVIGATE*} to move the pointer. Use{*CONTROLLER_VK_A*} to pick an item under the pointer. +If there is more than one item here this will pick them all up, or you can use{*CONTROLLER_VK_X*} to pick up just half of them. + + + Move this item with the pointer over another space in the inventory and place it down using{*CONTROLLER_VK_A*}. +With multiple items on the pointer, use{*CONTROLLER_VK_A*} to place them all, or{*CONTROLLER_VK_X*} to place just one. + + + If you move the pointer outside the edge of the interface with an item on the pointer, you can drop the item. + + + If you want more information about an item, move the pointer over the item and press{*CONTROLLER_ACTION_MENU_PAGEDOWN*} . + + + Press{*CONTROLLER_VK_B*} now to exit the inventory. + + + + + + This is the creative mode inventory. It shows items available for use in your hand, and all the other items that you can choose from. + + + {*B*} +Press{*CONTROLLER_VK_A*} to continue.{*B*} +Press{*CONTROLLER_VK_B*} if you already know how to use the creative mode inventory. + + + Use{*CONTROLLER_MENU_NAVIGATE*} to move the pointer. +When on the item list, use{*CONTROLLER_VK_A*} to pick an item under the pointer, and use{*CONTROLLER_VK_Y*} to pick up a full stack of that item. + + + The pointer will automatically move over a space in the use row. You can place it down using{*CONTROLLER_VK_A*}. Once you have placed the item, the pointer will return to the item list where you can select another item. + + + If you move the pointer outside the edge of the interface with an item on the pointer, you can drop the item into the world. To clear all items in the quick select bar, press{*CONTROLLER_VK_X*}. + + + Scroll through the Group Type tabs at the top using{*CONTROLLER_VK_LB*} and{*CONTROLLER_VK_RB*} to select the group type of the item you wish to pickup. + + + If you want more information about an item, move the pointer over the item and press{*CONTROLLER_ACTION_MENU_PAGEDOWN*} . + + + Press{*CONTROLLER_VK_B*} now to exit the creative mode inventory. + + + + This is the crafting interface. This interface allows you to combine the items you've collected to make new items. + + + {*B*}Press{*CONTROLLER_VK_A*} to continue.{*B*} +Press{*CONTROLLER_VK_B*} if you already know how to craft. + + + {*B*} +Press{*CONTROLLER_VK_X*} to show the item description. + + + {*B*} +Press{*CONTROLLER_VK_X*} to show the ingredients required to make the current item. + + + {*B*} +Press{*CONTROLLER_VK_X*} to show the inventory again. + + + Scroll through the Group Type tabs at the top using{*CONTROLLER_VK_LB*} and{*CONTROLLER_VK_RB*} to select the group type of the item you wish to craft, then use{*CONTROLLER_MENU_NAVIGATE*} to select the item to craft. + + + The crafting area shows the items you require in order to craft the new item. Press{*CONTROLLER_VK_A*} to craft the item and place it in your inventory. + + + You can craft a larger selection of items using a crafting table. Crafting on a table works in the same way as basic crafting, but you have a larger crafting area allowing more combinations of ingredients. + + + The bottom right part of the crafting interface shows your inventory. This area can also show a description of the currently selected item, and the ingredients required to craft it. + + + The description of the currently selected item is now displayed. The description can give you an idea of what the item can be used for. + + + The list of ingredients required to craft the selected item are now displayed. + + + The wood that you have collected can be crafted into planks. Select the planks icon and press{*CONTROLLER_VK_A*} to create them.{*PlanksIcon*} + + + Now you have built a crafting table you should place it in the world to enable you to build a larger selection of items.{*B*} +Press{*CONTROLLER_VK_B*} now to exit the crafting interface. + + + Press{*CONTROLLER_VK_LB*} and{*CONTROLLER_VK_RB*} to change to the group type of the items you wish to craft. Select the tools group.{*ToolsIcon*} + + + Press{*CONTROLLER_VK_LB*} and{*CONTROLLER_VK_RB*} to change to the group type of the items you wish to craft. Select the structures group.{*StructuresIcon*} + + + Use{*CONTROLLER_MENU_NAVIGATE*} to change to the item you wish to craft. Some items have multiple versions depending on the materials used. Select the wooden shovel.{*WoodenShovelIcon*} + + + A lot of crafting can involve multiple steps. Now that you have some planks there are more items that you can craft. Use{*CONTROLLER_MENU_NAVIGATE*} to change to the item you wish to craft. Select the crafting table.{*CraftingTableIcon*} + + + With the tools you have built you are off to a great start, and are able to collect a variety of different materials more efficiently.{*B*} +Press{*CONTROLLER_VK_B*} now to exit the crafting interface. + + + Some items can not be created using the crafting table, but require a furnace. Craft a furnace now.{*FurnaceIcon*} + + + Place the furnace you have crafted in the world. You will want to put this inside your shelter.{*B*} +Press{*CONTROLLER_VK_B*} now to exit the crafting interface. + + + + This is the furnace interface. A furnace allows you to change items by firing them. For example, you can turn iron ore into iron ingots in the furnace. + + + {*B*} +Press{*CONTROLLER_VK_A*} to continue.{*B*} +Press{*CONTROLLER_VK_B*} if you already know how to use a furnace. + + + You need to put some fuel into the bottom slot of the furnace, and the item to be changed in the top slot. The furnace will then fire up and start working, putting the result in the right-hand slot. + + + Many wooden items can be used as fuels, but not everything burns for the same time. You may also discover other items in the world that can be used as a fuel. + + + When your items have been fired, you can move them from the output area into your inventory. You should experiment with different ingredients to see what you can make. + + + If you use wood as the ingredient then you can make charcoal. Put some fuel in the furnace and wood in the ingredient slot. It can take some time for the furnace to create the charcoal, so feel free to do something else and come back to check the progress. + + + Charcoal can be used as a fuel, as well as being crafted into a torch with a stick. + + + Placing sand in the ingredient slot allows you to make glass. Create some glass blocks to use as windows in your shelter. + + + + This is the brewing interface. You can use this to create potions that have a variety of different effects. + + + {*B*} +Press{*CONTROLLER_VK_A*} to continue.{*B*} +Press{*CONTROLLER_VK_B*} if you already know how to use the brewing stand. + + + You brew potions by placing an ingredient in the top slot, and a potion or water bottle in the bottom slots (up to 3 can be brewed at one time). Once a valid combination is entered the brewing process will start and create the potion after a short time. + + + All potions start with a Water Bottle. Most potions are created by first using a Nether Wart to make an Awkward Potion, and will require at least one more ingredient to make the final potion. + + + Once you have a potion you can modify its effects. Adding Redstone Dust increases the duration of its effect and adding Glowstone Dust can make its effect more powerful. + + + Adding Fermented Spider Eye corrupts the potion and can turn it into a potion with the opposite effect, and adding Gunpowder turns the potion into a Splash Potion which can be thrown to apply its affect to a nearby area. + + + Create a Potion of Fire Resistance by first adding Nether Wart to a Water Bottle, and then adding Magma Cream. + + + Press{*CONTROLLER_VK_B*} now to exit the brewing interface. + + + + In this area there is a Brewing Stand, a Cauldron and a chest full of items for brewing. + + + {*B*} +Press{*CONTROLLER_VK_A*} to learn more about brewing and potions.{*B*} +Press{*CONTROLLER_VK_B*} if you already know about brewing and potions. + + + The first step in brewing a potion is to create a Water Bottle. Take a Glass Bottle from the chest. + + + You can fill a glass bottle from a Cauldron that has water in it, or from a block of water. Fill your glass bottle now by pointing at a water source and pressing{*CONTROLLER_ACTION_USE*}. + + + If a cauldron becomes empty, you can refill it with a Water Bucket. + + + Use the Brewing Stand to create a Potion of Fire Resistance. You will need a Water Bottle, Nether Wart and Magma Cream. + + + With a potion in your hand, hold{*CONTROLLER_ACTION_USE*} to use it. For a normal potion you will drink it and apply the effect to yourself, and for a Splash potion you will throw it and apply the effect to creatures near where it hits. +Splash potions can be created by adding gunpowder to normal potions. + + + Use your Potion of Fire Resistance on yourself. + + + Now that you are resistant to fire and lava, you should see if there are places you can get to that you couldn't before. + + + + This is the enchanting interface which you can use to add enchantments to weapons, armor and some tools. + + + {*B*} +Press{*CONTROLLER_VK_A*} to learn more about the enchanting interface.{*B*} +Press{*CONTROLLER_VK_B*} if you already know about the enchanting interface. + + + To enchant an item, first place it in the enchanting slot. Weapons, armor and some tools can be enchanted to add special effects such as improved damage resistance or increasing the number of items produced when mining a block. + + + When an item is placed in the enchanting slot, the buttons on the right will change to show a selection of random enchantments. + + + The number on the button represents the cost in experience levels to apply that enchantment to the item. If you do not have a high enough level the button will be disabled. + + + Select an enchantment and press{*CONTROLLER_VK_A*} to enchant the item. This will decrease your experience level by the cost of the enchantment. + + + Although the enchantments are all random, some of the better enchantments are only available when you have a high experience level and have lots of bookcases around the Enchantment Table to increase its power. + + + + In this area there is an Enchantment Table and some other items to help you learn about enchanting. + + + {*B*} +Press{*CONTROLLER_VK_A*} to learn more about enchanting.{*B*} +Press{*CONTROLLER_VK_B*} if you already know about enchanting. + + + Using an Enchantment Table allows you to add special effects such as increasing the number of items produced when mining a block, or improved damage resistance for weapons, armor and some tools. + + + Placing bookcases around the Enchantment Table increases its power and allows access to higher level enchantments. + + + Enchanting items costs Experience Levels, which can be built up by collecting Experience Orbs which are produced by killing monsters and animals, mining ores, breeding animals, fishing and smelting/cooking some things in a furnace. + + + You can also build experience levels using a Bottle O' Enchanting, which, when thrown, creates Experience Orbs around where it lands. These orbs can then be collected. + + + In the chests in this area you can find some enchanted items, Bottles O' Enchanting, and some items that have yet to be enchanted for you to experiment with at the Enchantment Table. + + + + + + You are now riding in a minecart. To exit the minecart, point the cursor at it and press{*CONTROLLER_ACTION_USE*} .{*MinecartIcon*} + + + {*B*} +Press{*CONTROLLER_VK_A*} to learn more about minecarts.{*B*} +Press{*CONTROLLER_VK_B*} if you already know about minecarts. + + + A minecart runs on rails. You can also craft a powered minecart with a furnace and a minecart with a chest in it.{*RailIcon*} + + + You can also craft powered rails, which take power from redstone torches and circuits to accelerate the cart. These can be connected to switches, levers and pressure plates to make complex systems.{*PoweredRailIcon*} + + + You are now sailing a boat. To exit the boat, point the cursor at it and press{*CONTROLLER_ACTION_USE*} .{*BoatIcon*} + + + {*B*} +Press{*CONTROLLER_VK_A*} to learn more about boats.{*B*} +Press{*CONTROLLER_VK_B*} if you already know about boats. + + + A boat allows you to travel quicker over water. You can steer it using{*CONTROLLER_ACTION_MOVE*} and{*CONTROLLER_ACTION_LOOK*}.{*BoatIcon*} + + + + You are now using a fishing rod. Press{*CONTROLLER_ACTION_USE*} to use it.{*FishingRodIcon*} + + + {*B*} +Press{*CONTROLLER_VK_A*} to learn more about fishing.{*B*} +Press{*CONTROLLER_VK_B*} if you already know about fishing. + + + Press{*CONTROLLER_ACTION_USE*} to cast your line and start fishing. Press{*CONTROLLER_ACTION_USE*} again to reel in the fishing line.{*FishingRodIcon*} + + + If you wait until the float sinks below the surface of the water before reeling in you can catch a fish. Fish can be eaten raw, or cooked by a furnace, to restore health.{*FishIcon*} + + + As with many other tools a fishing rod has a fixed number of uses. Those uses are not limited to catching fish though. You should experiment with it to see what else can be caught or activated...{*FishingRodIcon*} + + + + This is a bed. Press{*CONTROLLER_ACTION_USE*} while pointing at it at night to sleep through the night and awake in the morning.{*ICON*}355{*/ICON*} + + + {*B*} +Press{*CONTROLLER_VK_A*} to learn more about beds.{*B*} +Press{*CONTROLLER_VK_B*} if you already know about beds. + + + A bed should be placed in a safe, well-lit place so that monsters do not wake you in the middle of the night. Once you have used a bed, if you die you will respawn at that bed. +{*ICON*}355{*/ICON*} + + + If there are other players in your game, everyone must be in a bed at the same time to be able to sleep. +{*ICON*}355{*/ICON*} + + + + In this area there are some simple Redstone and Piston circuits, and a chest with more items to extend these circuits. + + + {*B*} +Press{*CONTROLLER_VK_A*} to learn more about Redstone circuits and Pistons.{*B*} +Press{*CONTROLLER_VK_B*} if you already know about Redstone circuits and Pistons. + + + Levers, Buttons, Pressure Plates and Redstone Torches can all provide power to circuits, either by directly attaching them to the item you want to activate or by connecting them with Redstone dust. + + + + The position and direction that you place a power source can change how it affects the surrounding blocks. For example a Redstone torch on the side of a block can be turned off if the block is powered by another source. + + + Redstone dust is collected by mining redstone ore with a pickaxe made of Iron, Diamond or Gold. You can use it to carry power up to 15 blocks, and it can travel up or down one block in height. +{*ICON*}331{*/ICON*} + + + Redstone repeaters can be used to extend the distance that the power is carried, or put a delay in a circuit. +{*ICON*}356{*/ICON*} + + + When powered, a Piston will extend, pushing up to 12 blocks. When they retract, Sticky Pistons can pull back one block of most types. +{*ICON*}33{*/ICON*} + + + In the chest in this area there are some components for making circuits with pistons. Try using or completing the circuits in this area, or put together your own. There are more examples outside the tutorial area. + + + + In this area there is a Portal to the Nether! + + + {*B*} +Press{*CONTROLLER_VK_A*} to learn more about Portals and The Nether.{*B*} +Press{*CONTROLLER_VK_B*} if you already know about Portals and The Nether. + + + Portals are created by placing Obsidian blocks into a frame four blocks wide and five blocks tall. The corner blocks are not required. + + + To activate a Nether Portal, set fire to the 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. + + + The Nether can be a dangerous place, full of lava, but can be useful to collect Netherrack which burns forever when lit, and Glowstone which produces light. + + + The Nether world can be used to fast-travel in the Overworld - traveling one block distance in the Nether is equivalent to traveling 3 blocks in the Overworld. + + + + You are now in Creative mode. + + + {*B*} +Press{*CONTROLLER_VK_A*} to learn more about Creative mode.{*B*} +Press{*CONTROLLER_VK_B*} if you already know about Creative mode. + + + When in Creative mode you have in infinite number of all available items and blocks, you can destroy blocks with one click without a tool, you are invulnerable and you can fly. + + + Pressing{*CONTROLLER_ACTION_JUMP*} twice quickly will allow you to fly. To exit flying, repeat the action. To fly faster, push{*CONTROLLER_ACTION_MOVE*} forward twice in rapid succession while flying. +When in flying mode, you can hold down{*CONTROLLER_ACTION_JUMP*} to move up and{*CONTROLLER_ACTION_SNEAK*} to move down, or use the D-pad to move up, down, left or right. + + + Press{*CONTROLLER_ACTION_CRAFTING*} to open the creative inventory interface. + + + Make your way to the opposite side of this hole to continue. + + + You have now completed the Creative mode tutorial. + + + + In this area a farm has been set up. Farming enables you to create a renewable source of food and other items. + + + {*B*} +Press{*CONTROLLER_VK_A*} to learn more about farming.{*B*} +Press{*CONTROLLER_VK_B*} if you already know about farming. + + + Wheat, Pumpkins and Melons are grown from seeds. Wheat seeds are collected by breaking Tall Grass or harvesting wheat, and Pumpkin and Melon seeds are crafted from Pumpkins and Melons respectively. + + + Before planting seeds the dirt blocks need to be turned into Farmland by using a Hoe. A nearby source of water will help keep the Farmland hydrated and make the crops grow faster, as will keeping the area lit. + + + Wheat goes through several stages when growing, and is ready to be harvested when it appears darker.{*ICON*}59:7{*/ICON*} + + + Pumpkins and Melons also need a block next to where you planted the seed for the fruit to grow once the stem has fully grown. + + + Sugarcane must be planted on a Grass, Dirt or Sand block that is right next to water block. Chopping a Sugarcane block will also drop all blocks that are above it.{*ICON*}83{*/ICON*} + + + Cacti must be planted on Sand, and will grow up to three blocks high. Like Sugarcane, destroying the lowest block will also allow you to collect the blocks that are above it.{*ICON*}81{*/ICON*} + + + Mushrooms should be planted in a dimly lit area, and will spread to nearby dimly lit blocks.{*ICON*}39{*/ICON*} + + + Bonemeal can be used to grow crops to their fully grown state, or grow Mushrooms into Huge Mushrooms.{*ICON*}351:15{*/ICON*} + + + You have now completed the farming tutorial. + + + + In this area animals have been penned in. You can breed animals to produce baby versions of themselves. + + + {*B*} +Press{*CONTROLLER_VK_A*} to learn more about animals and breeding.{*B*} +Press{*CONTROLLER_VK_B*} if you already know about animals and breeding. + + + To get the animals to breed, you will need to feed them with the right food to get them to go into 'Love Mode'. + + + Feed Wheat to a cow, mooshroom or sheep, Carrots to pigs, Wheat Seeds or Nether Wart to a chicken, or any kind of meat to a wolf, and they'll start looking for another animal of the same species near them that is also in Love Mode. + + + When two animals of the same species meet, and both are in Love Mode, they will kiss for a few seconds, and then a baby animal will appear. The baby animal will follow their parents for a while before growing into a full sized animal itself. + + + After being in Love Mode, an animal will not be able to enter it again for about five minutes. + + + Some animals will follow you if you are holding their food in your hand. This makes it easier to group animals together to breed them.{*ICON*}296{*/ICON*} + + + + Wild wolves can be tamed by giving them bones. Once tamed Love Hearts will appear around them. Tamed wolves will follow the player and defend them if they haven't been commanded to sit. + + + + You have now completed the animal and breeding tutorial. + + + + In this area are some pumpkins and blocks to make a Snow Golem and an Iron Golem. + + + {*B*} +Press{*CONTROLLER_VK_A*} to learn more about Golems.{*B*} +Press{*CONTROLLER_VK_B*} if you already know about Golems. + + + Golems are created by placing a pumpkin on top of a stack of blocks. + + + Snow Golems are created with two Snow Blocks, one of top of the other, with a pumpkin on top. Snow Golems throw snowballs at your enemies. + + + Iron Golems are created with four Iron Blocks in the pattern shown, with a pumpkin on top of the middle block. Iron Golems attack your enemies. + + + Iron Golems also appear naturally to protect villages, and will attack you if you attack any villagers. + + + + You cannot leave this area until you have completed the tutorial. + + + + Different tools are better for different materials. You should use a shovel to mine soft materials like earth and sand. + + + Different tools are better for different materials. You should use an axe to chop tree trunks. + + + Different tools are better for different materials. You should use a pickaxe to mine stone and ore. You may need to make your pickaxe from better materials to get resources from some blocks. + + + Certain tools are better for attacking enemies. Consider using a sword to attack. + + + Hint: Hold {*CONTROLLER_ACTION_ACTION*}to mine and chop using your hand or whatever you are holding. You may need to craft a tool to mine some blocks... + + + The tool you are using has become damaged. Every time you use a tool it becomes damaged, and will eventually break. The colored bar below the item in your inventory shows the current damage state. + + + Hold{*CONTROLLER_ACTION_JUMP*} to swim up. + + + In this area there is a minecart on a track. To enter the minecart, point the cursor at it and press{*CONTROLLER_ACTION_USE*}. Use{*CONTROLLER_ACTION_USE*} on the button to make the minecart move. + + + In the chest beside the river there is a boat. To use the boat, point the cursor at water and press{*CONTROLLER_ACTION_USE*}. Use{*CONTROLLER_ACTION_USE*} while pointing at the boat to enter it. + + + In the chest beside the pond there is a fishing rod. Take the fishing rod from the chest and select it as the current item in your hand to use it. + + + This more advanced piston mechanism creates a self-repairing bridge! Push the button to activate, then investigate how the components interact to learn more. + + + + If you move the pointer outside of the interface while carrying an item, you can drop that item. + + + + You do not have all the ingredients required to make this item. The box on the bottom left shows the ingredients required to craft this. + + + + Congratulations, you have completed the tutorial. Time in the game is now passing normally, and you don't have long until night time and the monsters come out! Finish your shelter! + + + {*EXIT_PICTURE*} When you are ready to explore further, there is a stairway in this area near the Miner's shelter that leads to a small castle. + + + Reminder: + + + + ]]> + + + + + New features have been added to the game in the latest version, including new areas in the tutorial world. + + + {*B*}Press{*CONTROLLER_VK_A*} to play through the tutorial as normal.{*B*} +Press{*CONTROLLER_VK_B*} to skip the main tutorial. + + + In this area you will find areas setup to help you learn about fishing, boats, pistons and redstone. + + + Outside of this area you will find examples of buildings, farming, minecarts and tracks, enchanting, brewing, trading, smithing and more! + + + + Your food bar has depleted to a level where you will no longer heal. + + + {*B*} +Press{*CONTROLLER_VK_A*} to learn more about the food bar and eating food.{*B*} +Press{*CONTROLLER_VK_B*} if you already know about the food bar and eating food. + + + + 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 + + + Use + + + Back + + + Exit + + + Cancel + + + Cancel Join + + + Select Storage Device + + + Change Storage Device + + + Refresh Online Games List + + + Party Games + + + All Games + + + Change Group + + + Show Inventory + + + Show Description + + + Show Ingredients + + + Crafting + + + Create + + + Take/Place + + + Take + + + Take All + + + Take Half + + + Place + + + Place All + + + Place One + + + Drop + + + Drop All + + + Drop One + + + Swap + + + Quick Move + + + Clear Quick Select + + + What's This? + + + Share To Facebook + + + Change Filter + + + View Gamer Card + + + View Gamer Profile + + + Send Friend Request + + + Page Down + + + Page Up + + + Next + + + Previous + + + Kick Player + + + Dye + + + Mine + + + Feed + + + Tame + + + Heal + + + Sit + + + Follow Me + + + Eject + + + Empty + + + Saddle + + + Place + + + Hit + + + Milk + + + Collect + + + Eat + + + Sleep + + + Wake Up + + + Play + + + Ride + + + Sail + + + Grow + + + Swim Up + + + Open + + + Change Pitch + + + Detonate + + + Read + + + Hang + + + Throw + + + Plant + + + Till + + + Harvest + + + Continue + + + Unlock Full Game + + + Delete Save + + + Delete + + + Options + + + Invite Xbox Live Party + + + Invite Friends + + + Accept + + + Shear + + + Ban Level + + + Select Skin + + + Ignite + + + Navigate + + + Install Full Version + + + Install Trial Version + + + Install + + + Reinstall + + + + Save Options + + + Execute Command + + + Creative + + + Move Ingredient + + + Move Fuel + + + Move Tool + + + Move Armor + + + Move Weapon + + + + Equip + + + Draw + + + Release + + + Privileges + + + Block + + + Page Up + + + Page Down + + + Love Mode + + + Drink + + + Rotate + + + Hide + + + Upload Save For Xbox One + + + Clear All Slots + + + Upload Save for Xbox One + + + + Mount + + + Dismount + + + Attach Chest + + + Launch + + + Leash + + + Release + + + Attach + + + Name + + + + OK + + + Cancel + + + Minecraft Store + + + + Are you sure you want to leave your current game and join the new one? Any unsaved progress will be lost. + + + Exit Game + + + + Save Game + + + Exit Without Saving + + + + Are you sure you want to overwrite any previous save for this world with the current version of this world? + + + Are you sure you want to exit without saving? You will lose all progress in this world! + + + + Start Game + + + If you create, load or save a world in Creative Mode, that world will have achievements and leaderboard updates disabled, even if it is then loaded in Survival Mode. Are you sure you want to continue? + + + This world has previously been saved in Creative Mode, and it will have achievements and leaderboard updates disabled. Are you sure you want to continue? + + + This world has previously been saved in Creative Mode, and it will have achievements and leaderboard updates disabled. + + + If you create, load or save a world with Host Privileges enabled, that world will have achievements and leaderboard updates disabled, even if it is then loaded with those options off. Are you sure you want to continue? + + + + Damaged Save + + + This save is corrupt or damaged. Would you like to delete it? + + + + Are you sure you want to exit to the main menu and disconnect all players from the game? Any unsaved progress will be lost. + + + + Exit and save + + + Exit without saving + + + + Are you sure you want to exit to the main menu? Any unsaved progress will be lost. + + + Are you sure you want to exit to the main menu? Your progress will be lost! + + + Create New World + + + Play Tutorial + + + Tutorial + + + Name Your World + + + + Enter a name for your world + + + Input the seed for your world generation + + + + Load Saved World + + + Press START to join game + + + + Exiting the game + + + + An error occurred. Exiting to the main menu. + + + + Connection failed + + + Connection lost + + + + Connection to the server was lost. Exiting to the main menu. + + + Connection to Xbox Live was lost. Exiting to the main menu. + + + Connection to Xbox Live was lost. + + + + Disconnected by the server + + + You were kicked from the game + + + You were kicked from the game for flying + + + Connection attempt took too long + + + The server is full + + + The host has exited the game. + + + You cannot join this game as you are not friends with anybody in the game. + + + You cannot join this game as you have previously been kicked by the host. + + + You cannot join this game as the player you are trying to join is running an older version of the game. + + + You cannot join this game as the player you are trying to join is running a newer version of the game. + + + + New World + + + Award Unlocked! + + + + Hurray - you've been awarded a gamerpic featuring Steve from Minecraft! + + + Hurray - you've been awarded a gamerpic featuring a Creeper! + + + Hurray - you've been awarded an avatar item - a Minecraft: Xbox 360 Edition t-shirt! +Go to the dashboard to put the t-shirt on your avatar. + + + Hurray - you've been awarded an avatar item - a Minecraft: Xbox 360 Edition watch! +Go to the dashboard to put the watch on your avatar. + + + Hurray - you've been awarded an avatar item - a Creeper baseball cap! +Go to the dashboard to put the cap on your avatar. + + + Hurray - you've been awarded the Minecraft: Xbox 360 Edition theme! +Go to the dashboard to select this theme. + + + + Unlock Full Game + + + You're playing the trial game, but you'll need the full game to be able to save your game. +Would you like to unlock the full game now? + + + This is the Minecraft: Xbox 360 Edition trial game. If you had the full game, you would just have earned an achievement! +Would you like to unlock the full game? + + + This is the Minecraft: Xbox 360 Edition trial game. If you had the full game, you would just have earned an avatar award! +Would you like to unlock the full game? + + + This is the Minecraft: Xbox 360 Edition trial game. If you had the full game, you would just have earned a gamerpic! +Would you like to unlock the full game? + + + This is the Minecraft: Xbox 360 Edition trial game. If you had the full game, you would just have earned a theme! +Would you like to unlock the full game? + + + This is the Minecraft: Xbox 360 Edition trial game. You need the full game to be able to accept this invite. +Would you like to unlock the full game? + + + Guest players cannot unlock the full game. Please sign in with an Xbox Live user ID. + + + + Please wait + + + No results + + + Filter: + + + Friends + + + My Score + + + Overall + + + Entries: + + + Rank + + + Gamertag + + + + Preparing to Save Level + + + Preparing Chunks... + + + Finalizing... + + + Building Terrain + + + Simulating world for a bit + + + Initializing server + + + Generating spawn area + + + Loading spawn area + + + Entering The Nether + + + Leaving The Nether + + + Respawning + + + Generating level + + + Loading level + + + Saving players + + + Connecting to host + + + Downloading terrain + + + Switching to offline game + + + Please wait while the host saves the game + + + Entering The END + + + Leaving The END + + + Finding Seed for the World Generator + + + + This bed is occupied + + + You can only sleep at night + + + %s is sleeping in a bed. To skip to dawn, all players need to sleep in beds at the same time. + + + Your home bed was missing or obstructed + + + You may not rest now, there are monsters nearby + + + + You are sleeping in a bed. To skip to dawn, all players need to sleep in beds at the same time. + + + + Tools and Weapons + + + Weapons + + + Food + + + Structures + + + Armor + + + Mechanisms + + + Transport + + + Decorations + + + Building Blocks + + + Redstone & Transportation + + + Miscellaneous + + + Brewing + + + Brewing + + + + Tools, Weapons & Armor + + + Materials + + + + Signed out + + + You have been returned to the title screen because your gamer profile was signed out + + + + Difficulty + + + Music + + + Sound + + + Gamma + + + Game Sensitivity + + + Interface Sensitivity + + + Peaceful + + + Easy + + + Normal + + + Hard + + + + In this mode, the player regains health over time, and there are no enemies in the environment. + + + In this mode, enemies spawn in the environment, but will do less damage to the player than in the Normal mode. + + + In this mode, enemies spawn in the environment and will do a standard amount of damage to the player. + + + In this mode, enemies will spawn in the environment, and will do a great deal of damage to the player. Watch out for the Creepers too, since they are unlikely to cancel their exploding attack when you move away from them! + + + + Trial Timeout + + + You've been playing the Minecraft: Xbox 360 Edition Trial Game for the maximum time allowed! To continue the fun, would you like to unlock the full game? + + + + Game full + + + Failed to join game as there are no spaces left + + + + Enter Sign Text + + + Enter a line of text for your sign + + + + Enter Title + + + Enter a title for your post + + + Enter Caption + + + Enter a caption for your post + + + Enter Description + + + Enter a description for your post + + + + Inventory + + + Ingredients + + + Brewing Stand + + + Chest + + + + Enchant + + + Furnace + + + Ingredient + + + Fuel + + + Dispenser + + + 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. + + + %s has joined the game. + + + %s has left the game. + + + %s was kicked from the game. + + + Are you sure you want to delete this save game? + + + Awaiting approval + + + Censored + + + + Now playing: + + + + Reset Settings + + + Are you sure you would like to reset your settings to their default values? + + + + Loading Error + + + + "Minecraft: Xbox 360 Edition" has failed to load, and cannot continue. + + + + %s's Game + + + Unknown host game + + + + Guest signed out + + + A guest player has signed out causing all guest players to be removed from the game. + + + Sign in + + + You are not signed in. In order to play this game, you will need to be signed in. Do you want to sign in now? + + + Multiplayer not allowed + + + Failed to join the game as one or more players are not allowed to play multiplayer games on Xbox Live. + + + Failed to create an online game as one or more players are not allowed to play multiplayer games on Xbox Live. Uncheck the "Online Game" box to start an offline game. + + + You are not allowed to join this game session because your Member Content privilege setting is too restrictive. Please change this setting in the Privacy and Online Settings portion of the Xbox dashboard if you would like to join this session. + + + You are not allowed to join this game session because one of your local players has a Member Content privilege setting that is too restrictive. + + + You are not allowed to join this game session because a player in the session has a Member Content privilege setting of Friends Only, and you are not on their Friends List. + + + Failed to create game + + + You are not allowed to create this game session because one of your local players has a Member Content privilege setting that is too restrictive. Uncheck the "Online Game" box to start an offline game, or change this setting in the Privacy and Online Settings portion of the Xbox dashboard. + + + + Auto Selected + + + No Pack: Default Skins + + + Favorite Skins + + + + + Banned Level + + + + The game you are joining is in your banned level list. +If you choose to join this game, the level will be removed from your banned level list. + + + + Ban This Level? + + + + Are you sure you want to add this level to your banned level list? +Selecting OK will also exit this game. + + + + Remove from Banned List + + + + Autosave Interval + + + + Autosave Interval: OFF + + + Mins + + + Can't Place Here! + + + Placing lava close to the level spawn point is not allowed due to the possibility of instant death for spawning players. + + + + This game has a level autosave feature. When you see the icon above displayed, the game is saving your data. +Please do not turn off your Xbox 360 console while this icon is on-screen. + + + + Interface Opacity + + + + Preparing to Autosave Level + + + + HUD Size + + + HUD Size (Splitscreen) + + + + Seed + + + + Unlock Skin Pack + + + To use the skin you have selected, you need to unlock this skin pack. +Would you like to unlock this skin pack now? + + + Unlock Texture Pack + + + To use this texture pack for your world, you need to unlock it. +Would you like to unlock it now? + + + Trial Texture Pack + + + You are using a trial version of the texture pack. You will not be able to save this world unless you unlock the full version. +Would you like to unlock the full version of the texture pack? + + + + Texture Pack Not Present + + + + Unlock Full Version + + + + Download Trial Version + + + Download Full Version + + + This world uses a mash-up pack or texture pack you don't have! +Would you like to install the mash-up pack or texture pack now? + + + + Get Trial Version + + + Get Full Version + + + + Kick player + + + Are you sure you want to kick this player from the game? They will not be able to rejoin until you restart the world. + + + + Gamerpics Packs + + + Themes + + + Skins Packs + + + Allow friends of friends + + + You cannot join this game because it has been limited to players who are friends of the host. + + + Can't Join Game + + + + Selected + + + Selected skin: + + + + Corrupt Downloadable Content + + + This downloadable content is corrupt and cannot be used. You need to delete it, then re-install it from the Minecraft Store menu. + + + Some of your downloadable content is corrupt and cannot be used. You need to delete them, then re-install them from the Minecraft Store menu. + + + Your game mode has been changed + + + Rename Your World + + + Enter the new name for your world + + + + Game Mode: Survival + + + Game Mode: Creative + + + Game Mode: Adventure + + + Survival + + + Creative + + + Adventure + + + Created in Survival Mode + + + Created in Creative Mode + + + Render Clouds + + + What would you like to do with this save game? + + + Rename Save + + + Autosaving in %d... + + + + On + + + Off + + + Normal + + + Superflat + + + Enter a seed to generate the same terrain again. Leave blank for a random world. + + + When enabled, the game will be an online game. + + + When enabled, only invited players can join. + + + When enabled, friends of people on your Friends List can join the game. + + + When enabled, players can inflict damage on other players. Only affects Survival mode. + + + When disabled, players joining the game cannot build or mine until authorised. + + + When enabled, fire may spread to nearby flammable blocks. + + + When enabled, TNT will explode when activated. + + + When enabled, the host can toggle their ability to fly, disable exhaustion, and make themselves invisible from the in-game menu. Disables achievements and leaderboard updates. + + + When enabled, the Nether world will be re-generated. This is useful if you have an older save where Nether Fortresses were not present. + + + When enabled, structures such as Villages and Strongholds will generate in the world. + + + When enabled, a completely flat world will be generated in the Overworld and in the Nether. + + + When enabled, a chest containing some useful items will be created near the player spawn point. + + + + 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 + + + Themes + + + Gamerpics + + + Avatar Items + + + Texture Packs + + + Mash-Up Packs + + + + + {*PLAYER*} went up in flames + + + {*PLAYER*} burned to death + + + {*PLAYER*} tried to swim in lava + + + {*PLAYER*} suffocated in a wall + + + {*PLAYER*} drowned + + + {*PLAYER*} starved to death + + + {*PLAYER*} was pricked to death + + + {*PLAYER*} hit the ground too hard + + + {*PLAYER*} fell out of the world + + + {*PLAYER*} died + + + {*PLAYER*} blew up + + + {*PLAYER*} was killed by magic + + + {*PLAYER*} was killed by Ender Dragon breath + + + {*PLAYER*} was slain by {*SOURCE*} + + + {*PLAYER*} was slain by {*SOURCE*} + + + {*PLAYER*} was shot by {*SOURCE*} + + + {*PLAYER*} was fireballed by {*SOURCE*} + + + {*PLAYER*} was pummeled by {*SOURCE*} + + + {*PLAYER*} was killed by {*SOURCE*} 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*} + + + + Bedrock Fog + + + + Display HUD + + + + Display Hand + + + + Splitscreen Gamertags + + + + Death Messages + + + + Animated Character + + + + Custom Skin Animation + + + + You can no longer mine or use items + + + You can now mine and use items + + + You can no longer place blocks + + + You can now place blocks + + + You can now use doors and switches + + + You can no longer use doors and switches + + + You can now use containers (e.g. chests) + + + You can no longer use containers (e.g. chests) + + + You can no longer attack mobs + + + You can now attack mobs + + + You can no longer attack players + + + You can now attack players + + + You can no longer attack animals + + + You can now attack animals + + + You are now a moderator + + + You are no longer a moderator + + + You can now fly + + + You can no longer fly + + + You will no longer get exhausted + + + You will now get exhausted + + + You are now invisible + + + You are no longer invisible + + + You are now invulnerable + + + You are no longer invulnerable + + + + %d MSP + + + Ender Dragon + + + %s has entered The End + + + %s has left The End + + + + +{*C3*}I see the player you mean.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}?{*EF*}{*B*}{*B*} +{*C3*}Yes. Take care. It has reached a higher level now. It can read our thoughts.{*EF*}{*B*}{*B*} +{*C2*}That doesn't matter. It thinks we are part of the game.{*EF*}{*B*}{*B*} +{*C3*}I like this player. It played well. It did not give up.{*EF*}{*B*}{*B*} +{*C2*}It is reading our thoughts as though they were words on a screen.{*EF*}{*B*}{*B*} +{*C3*}That is how it chooses to imagine many things, when it is deep in the dream of a game.{*EF*}{*B*}{*B*} +{*C2*}Words make a wonderful interface. Very flexible. And less terrifying than staring at the reality behind the screen.{*EF*}{*B*}{*B*} +{*C3*}They used to hear voices. Before players could read. Back in the days when those who did not play called the players witches, and warlocks. And players dreamed they flew through the air, on sticks powered by demons.{*EF*}{*B*}{*B*} +{*C2*}What did this player dream?{*EF*}{*B*}{*B*} +{*C3*}This player dreamed of sunlight and trees. Of fire and water. It dreamed it created. And it dreamed it destroyed. It dreamed it hunted, and was hunted. It dreamed of shelter.{*EF*}{*B*}{*B*} +{*C2*}Hah, the original interface. A million years old, and it still works. But what true structure did this player create, in the reality behind the screen?{*EF*}{*B*}{*B*} +{*C3*}It worked, with a million others, to sculpt a true world in a fold of the {*EF*}{*NOISE*}{*C3*}, and created a {*EF*}{*NOISE*}{*C3*} for {*EF*}{*NOISE*}{*C3*}, in the {*EF*}{*NOISE*}{*C3*}.{*EF*}{*B*}{*B*} +{*C2*}It cannot read that thought.{*EF*}{*B*}{*B*} +{*C3*}No. It has not yet achieved the highest level. That, it must achieve in the long dream of life, not the short dream of a game.{*EF*}{*B*}{*B*} +{*C2*}Does it know that we love it? That the universe is kind?{*EF*}{*B*}{*B*} +{*C3*}Sometimes, through the noise of its thoughts, it hears the universe, yes.{*EF*}{*B*}{*B*} +{*C2*}But there are times it is sad, in the long dream. It creates worlds that have no summer, and it shivers under a black sun, and it takes its sad creation for reality.{*EF*}{*B*}{*B*} +{*C3*}To cure it of sorrow would destroy it. The sorrow is part of its own private task. We cannot interfere.{*EF*}{*B*}{*B*} +{*C2*}Sometimes when they are deep in dreams, I want to tell them, they are building true worlds in reality. Sometimes I want to tell them of their importance to the universe. Sometimes, when they have not made a true connection in a while, I want to help them to speak the word they fear.{*EF*}{*B*}{*B*} +{*C3*}It reads our thoughts.{*EF*}{*B*}{*B*} +{*C2*}Sometimes I do not care. Sometimes I wish to tell them, this world you take for truth is merely {*EF*}{*NOISE*}{*C2*} and {*EF*}{*NOISE*}{*C2*}, I wish to tell them that they are {*EF*}{*NOISE*}{*C2*} in the {*EF*}{*NOISE*}{*C2*}. They see so little of reality, in their long dream.{*EF*}{*B*}{*B*} +{*C3*}And yet they play the game.{*EF*}{*B*}{*B*} +{*C2*}But it would be so easy to tell them...{*EF*}{*B*}{*B*} +{*C3*}Too strong for this dream. To tell them how to live is to prevent them living.{*EF*}{*B*}{*B*} +{*C2*}I will not tell the player how to live.{*EF*}{*B*}{*B*} +{*C3*}The player is growing restless.{*EF*}{*B*}{*B*} +{*C2*}I will tell the player a story.{*EF*}{*B*}{*B*} +{*C3*}But not the truth.{*EF*}{*B*}{*B*} +{*C2*}No. A story that contains the truth safely, in a cage of words. Not the naked truth that can burn over any distance.{*EF*}{*B*}{*B*} +{*C3*}Give it a body, again.{*EF*}{*B*}{*B*} +{*C2*}Yes. Player...{*EF*}{*B*}{*B*} +{*C3*}Use its name.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}. Player of games.{*EF*}{*B*}{*B*} +{*C3*}Good.{*EF*}{*B*}{*B*} + + + + + +{*C2*}Take a breath, now. Take another. Feel air in your lungs. Let your limbs return. Yes, move your fingers. Have a body again, under gravity, in air. Respawn in the long dream. There you are. Your body touching the universe again at every point, as though you were separate things. As though we were separate things.{*EF*}{*B*}{*B*} +{*C3*}Who are we? Once we were called the spirit of the mountain. Father sun, mother moon. Ancestral spirits, animal spirits. Jinn. Ghosts. The green man. Then gods, demons. Angels. Poltergeists. Aliens, extraterrestrials. Leptons, quarks. The words change. We do not change.{*EF*}{*B*}{*B*} +{*C2*}We are the universe. We are everything you think isn't you. You are looking at us now, through your skin and your eyes. And why does the universe touch your skin, and throw light on you? To see you, player. To know you. And to be known. I shall tell you a story.{*EF*}{*B*}{*B*} +{*C2*}Once upon a time, there was a player.{*EF*}{*B*}{*B*} +{*C3*}The player was you, {*PLAYER*}.{*EF*}{*B*}{*B*} +{*C2*}Sometimes it thought itself human, on the thin crust of a spinning globe of molten rock. The ball of molten rock circled a ball of blazing gas that was three hundred and thirty thousand times more massive than it. They were so far apart that light took eight minutes to cross the gap. The light was information from a star, and it could burn your skin from a hundred and fifty million kilometres away.{*EF*}{*B*}{*B*} +{*C2*}Sometimes the player dreamed it was a miner, on the surface of a world that was flat, and infinite. The sun was a square of white. The days were short; there was much to do; and death was a temporary inconvenience.{*EF*}{*B*}{*B*} +{*C3*}Sometimes the player dreamed it was lost in a story.{*EF*}{*B*}{*B*} +{*C2*}Sometimes the player dreamed it was other things, in other places. Sometimes these dreams were disturbing. Sometimes very beautiful indeed. Sometimes the player woke from one dream into another, then woke from that into a third.{*EF*}{*B*}{*B*} +{*C3*}Sometimes the player dreamed it watched words on a screen.{*EF*}{*B*}{*B*} +{*C2*}Let's go back.{*EF*}{*B*}{*B*} +{*C2*}The atoms of the player were scattered in the grass, in the rivers, in the air, in the ground. A woman gathered the atoms; she drank and ate and inhaled; and the woman assembled the player, in her body.{*EF*}{*B*}{*B*} +{*C2*}And the player awoke, from the warm, dark world of its mother's body, into the long dream.{*EF*}{*B*}{*B*} +{*C2*}And the player was a new story, never told before, written in letters of DNA. And the player was a new program, never run before, generated by a sourcecode a billion years old. And the player was a new human, never alive before, made from nothing but milk and love.{*EF*}{*B*}{*B*} +{*C3*}You are the player. The story. The program. The human. Made from nothing but milk and love.{*EF*}{*B*}{*B*} +{*C2*}Let's go further back.{*EF*}{*B*}{*B*} +{*C2*}The seven billion billion billion atoms of the player's body were created, long before this game, in the heart of a star. So the player, too, is information from a star. And the player moves through a story, which is a forest of information planted by a man called Julian, on a flat, infinite world created by a man called Markus, that exists inside a small, private world created by the player, who inhabits a universe created by...{*EF*}{*B*}{*B*} +{*C3*}Shush. Sometimes the player created a small, private world that was soft and warm and simple. Sometimes hard, and cold, and complicated. Sometimes it built a model of the universe in its head; flecks of energy, moving through vast empty spaces. Sometimes it called those flecks "electrons" and "protons".{*EF*}{*B*}{*B*} + + + + + +{*C2*}Sometimes it called them "planets" and "stars".{*EF*}{*B*}{*B*} +{*C2*}Sometimes it believed it was in a universe that was made of energy that was made of offs and ons; zeros and ones; lines of code. Sometimes it believed it was playing a game. Sometimes it believed it was reading words on a screen.{*EF*}{*B*}{*B*} +{*C3*}You are the player, reading words...{*EF*}{*B*}{*B*} +{*C2*}Shush... Sometimes the player read lines of code on a screen. Decoded them into words; decoded words into meaning; decoded meaning into feelings, emotions, theories, ideas, and the player started to breathe faster and deeper and realised it was alive, it was alive, those thousand deaths had not been real, the player was alive{*EF*}{*B*}{*B*} +{*C3*}You. You. You are alive.{*EF*}{*B*}{*B*} +{*C2*}and sometimes the player believed the universe had spoken to it through the sunlight that came through the shuffling leaves of the summer trees{*EF*}{*B*}{*B*} +{*C3*}and sometimes the player believed the universe had spoken to it through the light that fell from the crisp night sky of winter, where a fleck of light in the corner of the player's eye might be a star a million times as massive as the sun, boiling its planets to plasma in order to be visible for a moment to the player, walking home at the far side of the universe, suddenly smelling food, almost at the familiar door, about to dream again{*EF*}{*B*}{*B*} +{*C2*}and sometimes the player believed the universe had spoken to it through the zeros and ones, through the electricity of the world, through the scrolling words on a screen at the end of a dream{*EF*}{*B*}{*B*} +{*C3*}and the universe said I love you{*EF*}{*B*}{*B*} +{*C2*}and the universe said you have played the game well{*EF*}{*B*}{*B*} +{*C3*}and the universe said everything you need is within you{*EF*}{*B*}{*B*} +{*C2*}and the universe said you are stronger than you know{*EF*}{*B*}{*B*} +{*C3*}and the universe said you are the daylight{*EF*}{*B*}{*B*} +{*C2*}and the universe said you are the night{*EF*}{*B*}{*B*} +{*C3*}and the universe said the darkness you fight is within you{*EF*}{*B*}{*B*} +{*C2*}and the universe said the light you seek is within you{*EF*}{*B*}{*B*} +{*C3*}and the universe said you are not alone{*EF*}{*B*}{*B*} +{*C2*}and the universe said you are not separate from every other thing{*EF*}{*B*}{*B*} +{*C3*}and the universe said you are the universe tasting itself, talking to itself, reading its own code{*EF*}{*B*}{*B*} +{*C2*}and the universe said I love you because you are love.{*EF*}{*B*}{*B*} +{*C3*}And the game was over and the player woke up from the dream. And the player began a new dream. And the player dreamed again, dreamed better. And the player was the universe. And the player was love.{*EF*}{*B*}{*B*} +{*C3*}You are the player.{*EF*}{*B*}{*B*} +{*C2*}Wake up.{*EF*} + + + + + Reset Nether + + + + Are you sure you want to reset the Nether in this savegame to its default state? You will lose anything you have built in the Nether! + + + + Reset Nether + + + Don't Reset Nether + + + + Can't shear this Mooshroom at the moment. The maximum number of Pigs, Sheep, Cows, Cats and Horses 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 Wolves in a world has been reached. + + + Can't use Spawn Egg at the moment. The maximum number of Chickens in a world has been reached. + + + + Can't use Spawn Egg at the moment. The maximum number of Squid in a world has been reached. + + + Can't use Spawn Egg at the moment. The maximum number of 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 villagers in a world has been reached. + + + The maximum number of Paintings/Item Frames in a world has been reached. + + + You can't spawn enemies in Peaceful mode. + + + This animal can't enter Love Mode. The maximum number of breeding Pigs, Sheep, Cows, 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 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. + + + The maximum number of Boats in a world has been reached. + + + The maximum number of Mob Heads in a world has been reached. + + + + Invert Look + + + Southpaw + + + You Died! + + + Respawn + + + Downloadable Content Offers + + + + Change Skin + + + How To Play + + + Controls + + + Settings + + + Credits + + + Reinstall Content + + + Debug Settings + + + + Fire Spreads + + + TNT Explodes + + + Player vs Player + + + Trust Players + + + Host Privileges + + + Generate Structures + + + Superflat World + + + Bonus Chest + + + + World Options + + + Game Options + + + + Mob Griefing + + + Keep Inventory + + + Mob Spawning + + + Mob Loot + + + Tile Drops + + + Natural Regeneration + + + Daylight Cycle + + + + Can Build and Mine + + + Can Use Doors and Switches + + + Can Open Containers + + + Can Attack Players + + + Can Attack Animals + + + Moderator + + + Kick Player + + + Can Fly + + + Disable Exhaustion + + + Invisible + + + Host Options + + + Players/Invite + + + + Online Game + + + Invite Only + + + More Options + + + Load + + + New World + + + World Name + + + Seed for the World Generator + + + Leave blank for a random seed + + + Players + + + Join Game + + + Start Game + + + No Games Found + + + + Play Game + + + Leaderboards + + + Achievements + + + Help & Options + + + Unlock Full Game + + + Resume Game + + + Save Game + + + + Difficulty: + + + Game Type: + + + Gamertags: + + + Structures: + + + Level Type: + + + PvP: + + + Trust Players: + + + TNT: + + + Fire Spreads: + + + + + Reinstall Theme + + + Reinstall Gamerpic 1 + + + Reinstall Gamerpic 2 + + + Reinstall Avatar Item 1 + + + Reinstall Avatar Item 2 + + + Reinstall Avatar Item 3 + + + + Options + + + Audio + + + Control + + + Graphics + + + User Interface + + + Reset to Defaults + + + + View Bobbing + + + Hints + + + In-Game Tooltips + + + In-Game Gamertags + + + 2 Player Split-screen Vertical + + + + Done + + + Edit sign message: + + + + Fill in the details to accompany your screenshot + + + Caption + + + Screenshot from in-game + + + Edit sign message: + + + Look what I made in Minecraft: Xbox 360 Edition! + + + + + The classic Minecraft textures, icons and user interface! + + + + Show all Mash-up Worlds + + + Select Transfer Save Slot + + + Empty Slot + + + Uploading Save Metadata + + + Uploading Save Data + + + Uploading Save For Xbox One + + + + Upload Canceled + + + You have canceled uploading this save to the save transfer area. + + + No Effects + + + Speed + + + Slowness + + + Haste + + + Mining Fatigue + + + Strength + + + Weakness + + + Instant Health + + + Instant Damage + + + Jump Boost + + + Nausea + + + Regeneration + + + Resistance + + + Fire Resistance + + + Water Breathing + + + Invisibility + + + Blindness + + + Night Vision + + + Hunger + + + Poison + + + Wither + + + Health Boost + + + Absorption + + + Saturation + + + + of Swiftness + + + of Slowness + + + of Haste + + + of Dullness + + + of Strength + + + of Weakness + + + of Healing + + + of Harming + + + of Leaping + + + of Nausea + + + of Regeneration + + + of Resistance + + + of Fire Resistance + + + of Water Breathing + + + of Invisibility + + + of Blindness + + + of Night Vision + + + of Hunger + + + of Poison + + + of Decay + + + of Health Boost + + + of Absorption + + + of Saturation + + + + + + + II + + + III + + + IV + + + + + Splash + + + Mundane + + + Uninteresting + + + Bland + + + Clear + + + Milky + + + Diffuse + + + Artless + + + Thin + + + Awkward + + + Flat + + + Bulky + + + Bungling + + + Buttered + + + Smooth + + + Suave + + + Debonair + + + Thick + + + Elegant + + + Fancy + + + Charming + + + Dashing + + + Refined + + + Cordial + + + Sparkling + + + Potent + + + Foul + + + Odorless + + + Rank + + + Harsh + + + Acrid + + + Gross + + + Stinky + + + + Used as the base of all potions. Use in a brewing stand to create potions. + + + Has no effects, can be used in a brewing stand to create potions by adding more ingredients. + + + Increases affected players, animals and monsters movement speed, and players sprinting speed, jumping length and field of view. + + + Reduces affected players, animals and monsters movement speed, and players sprinting speed, jumping length and field of view. + + + Increase the damage caused by affected players and monsters when attacking. + + + Reduces the damage cause by affected players and monsters when attacking. + + + Instantly increases the affected players, animals and monsters health. + + + Instantly reduces the affected players, animals and monsters health. + + + Restores health to the affected players, animals and monsters over time. + + + Makes the affected players, animals and monsters immune to damage from fire, lava, and ranged Blaze attacks. + + + Reduces health of the affected players, animals and monsters over time. + + + + When Applied: + + + + Horse Jump Strength + + + Zombie Reinforcements + + + Max Health + + + Mob Follow Range + + + Knockback Resistance + + + Speed + + + Attack Damage + + + + Sharpness + + + Smite + + + Bane of Arthropods + + + Knockback + + + Fire Aspect + + + Protection + + + Fire Protection + + + Feather Falling + + + Blast Protection + + + Projectile Protection + + + Respiration + + + Aqua Affinity + + + Efficiency + + + Silk Touch + + + Unbreaking + + + Looting + + + Fortune + + + Power + + + Flame + + + Punch + + + Infinity + + + + I + + + II + + + III + + + IV + + + V + + + VI + + + VII + + + VIII + + + IX + + + X + + + + + + Can be mined with an Iron pickaxe or better to collect Emeralds. + + + Similar to a Chest except that items placed in an Ender Chest are available in every one of the player's Ender Chests, even in different dimensions. + + + Is activated when an entity passes through a connected Tripwire. + + + Activates a connected Tripwire Hook when an entity passes through it. + + + A compact way of storing Emeralds. + + + A wall made of Cobblestone. + + + Can be used to repair weapons, tools and armor. + + + Smelted in a furnace to produce Nether Quartz. + + + Used as a decoration. + + + + Can be traded with villagers. + + + Used as a decoration. Flowers, Saplings, Cacti and Mushrooms can be planted in it. + + + Restores 2{*ICON_SHANK_01*}, and can be crafted into a golden carrot. Can be planted in farmland. + + + Restores 0.5{*ICON_SHANK_01*}, or can be cooked in a furnace. This can be planted in farmland. + + + Restores 3{*ICON_SHANK_01*}. Created by cooking a potato in a furnace. + + + Restores 1{*ICON_SHANK_01*}. Eating this can cause you to become poisoned. + + + Restores 3{*ICON_SHANK_01*}. Crafted from a carrot and gold nuggets. + + + Used to control a saddled pig when riding on it. + + + Restores 4{*ICON_SHANK_01*}. + + + Used with an Anvil to enchant weapons, tools or armor. + + + Created by mining Nether Quartz Ore. Can be crafted into a Block of Quartz. + + + Crafted from Wool. Used as a decoration. + + + Emerald + + + Flower Pot + + + Carrot + + + Potato + + + Baked Potato + + + Poisonous Potato + + + Golden Carrot + + + Carrot on a Stick + + + Pumpkin Pie + + + Enchanted Book + + + Nether Quartz + + + Emerald Ore + + + Ender Chest + + + Tripwire Hook + + + Tripwire + + + Block of Emerald + + + Cobblestone Wall + + + Mossy Cobblestone Wall + + + Flower Pot + + + Carrots + + + Potatoes + + + Anvil + + + Anvil + + + Slightly Damaged Anvil + + + Very Damaged Anvil + + + Nether Quartz Ore + + + Block of Quartz + + + Chiseled Quartz Block + + + Pillar Quartz Block + + + Quartz Stairs + + + Carpet + + + Black Carpet + + + Red Carpet + + + Green Carpet + + + Brown Carpet + + + Blue Carpet + + + Purple Carpet + + + Cyan Carpet + + + Light Gray Carpet + + + Gray Carpet + + + Pink Carpet + + + Lime Carpet + + + Yellow Carpet + + + Light Blue Carpet + + + Magenta Carpet + + + Orange Carpet + + + White Carpet + + + Chiseled Sandstone + + + Smooth Sandstone + + + {*PLAYER*} was killed trying to hurt {*SOURCE*} + + + {*PLAYER*} was squashed by a falling Anvil. + + + {*PLAYER*} was squashed by a falling block. + + + + Teleported {*PLAYER*} to {*DESTINATION*} + + + {*PLAYER*} teleported you to their position + + + {*PLAYER*} teleported to you + + + Thorns + + + Quartz Slab + + + Makes dark areas appear as if in daylight, even under water. + + + Makes affected players, animals and monsters invisible. + + + Repair & Name + + + Enchantment Cost: %d + + + Too Expensive! + + + Rename + + + You have: + + + Required Items For Trade + + + {*VILLAGER_TYPE*} offers %s + + + Repair + + + Trade + + + Dye collar + + + + + + + This is the Anvil interface, which you can use to rename, repair and apply enchantments to weapons, armor, or tools, at the cost of Experience Levels. + + + + + {*B*} + Press{*CONTROLLER_VK_A*} to learn more about the Anvil interface.{*B*} + Press{*CONTROLLER_VK_B*} if you already know the Anvil interface. + + + + + To begin working on an item, place it in the first input slot. + + + + + When the correct raw material is placed in the second input slot (e.g. Iron Ingots for a damaged Iron Sword), the proposed repair appears in the output slot. + + + + + Alternatively, a second identical item can be placed into the second slot to combine the two items. + + + + + To enchant items on the Anvil, place an Enchanted Book in the second input slot. + + + + + The number of Experience Levels that the work will cost is shown beneath the output. If you do not have enough Experience Levels, the repair cannot be completed. + + + + + It is possible to rename the item by editing the name shown in the textbox. + + + + + Picking up the repaired item will consume both items used by the Anvil and decrease your Experience Level by the given amount. + + + + + + + + + In this area there is an Anvil and a Chest containing tools and weapons to work on. + + + + + {*B*} + Press{*CONTROLLER_VK_A*} to learn more about the Anvil.{*B*} + Press{*CONTROLLER_VK_B*} if you already know about the Anvil. + + + + + Using an Anvil, weapons and tools can be repaired to restore their durability, renamed, or enchanted with Enchanted Books. + + + + + Enchanted Books can be found inside Chests within dungeons, or enchanted from normal Books at the Enchantment Table. + + + + + Using the Anvil costs Experience Levels, and each use has a chance to damage the Anvil. + + + + + The type of work to be done, value of the item, number of enchantments, and amount of prior work all affect the cost of repair. + + + + + Renaming an item changes the displayed name for all players and permanently reduces the prior work cost. + + + + + In the Chest in this area you will find damaged Pickaxes, raw materials, Bottles O' Enchanting, and Enchanted Books to experiment with. + + + + + + + + + This is the trading interface which displays trades that can be made with a villager. + + + + + {*B*} + Press{*CONTROLLER_VK_A*} to learn more about the trading interface.{*B*} + Press{*CONTROLLER_VK_B*} if you already know the trading interface. + + + + + All trades that the villager is willing to make at the moment are displayed along the top. + + + + + Trades will appear red and be unavailable if you do not have the required items. + + + + + The amount and type of items you are giving to the villager are shown in the two boxes on the left. + + + + + You can see the total number of the items required for the trade in the two boxes on the left. + + + + + Press{*CONTROLLER_VK_A*} to trade the items the villager requires for the item on offer. + + + + + + + + + In this area there is a villager and a Chest containing Paper to purchase items. + + + + + {*B*} + Press{*CONTROLLER_VK_A*} to learn more about trading.{*B*} + Press{*CONTROLLER_VK_B*} if you already know about trading. + + + + + Players can trade items from their inventory with villagers. + + + + + The trades a villager is likely to offer depends on their profession. + + + + + Performing a mix of trades will randomly add to or update the villager's available trades. + + + + + Trades that have been used frequently may be removed temporarily, but the villager will always offer at least one trade. + + + + + Take some Paper from the Chest and try trading with the villager here. + + + + + + + + + In this area there are two Ender Chests. + + + + + {*B*} + Press{*CONTROLLER_VK_A*} to learn more about Ender Chests.{*B*} + Press{*CONTROLLER_VK_B*} if you already know about Ender Chests. + + + + + All Ender Chests in a world are linked, even across dimensions. Items placed into an Ender Chest are accessible in any other Ender Chest. + + + + + However, the contents of the Ender Chests are different for each player. + + + + + This allows players to store items in any Ender Chest, and retrieve them from other Ender Chests in different positions in the world. You can try this now by placing items in either Ender Chest. + + + + Restores 2{*ICON_SHANK_01*}, regenerates health for 30 seconds, and grants fire resistance and damage resistance for 5 minutes. Crafted from an apple and gold blocks. + + + Can Teleport + + + Teleport + + + Teleport To Player + + + Teleport To Me + + + Can Disable Exhaustion + + + Can Become Invisible + + + You can now enable invisibility + + + You can no longer enable invisibility + + + You can now enable flying + + + You can no longer enable flying + + + You can now disable exhaustion + + + You can no longer disable exhaustion + + + You can now teleport + + + You can no longer teleport + + + {*T3*}HOW TO PLAY : ANVIL{*ETW*}{*B*}{*B*} +Experience Levels can be used to repair, enchant or rename items with the Anvil.{*B*} +All items can be renamed, although only items with durability can be repaired or have enchantments from Enchanted Books applied to them.{*B*} +An item can be repaired by placing it in one of the input slots on the left, along with either some raw materials of the item, like Iron Ingots for an Iron Sword, or combined with another item of the same type.{*B*} +Combining items is more efficient when done with an Anvil, and additionally, if either of the items were enchanted, the finished product may have enchantments from either of the inputs.{*B*} +Enchanted Books can apply enchantments to items by combining them at an Anvil if the Book's enchantment is suitable. Enchanted Books can be found in Chests within dungeons, or enchanted from normal Books at the Enchantment Table.{*B*} +There is a chance that the Anvil will be damaged with each use and after enough punishment it will be destroyed.{*B*} + + + + + {*T3*}HOW TO PLAY : TRADING{*ETW*}{*B*}{*B*} +It is possible to trade items with villagers. Each villager has a profession; they can be Farmers, Butchers, Blacksmiths, Librarians or Priests, and this affects the type of items they might trade.{*B*} +You can find a list of all the trades a villager is offering in the trading menu. A villager may modify or add to its trades whenever a player trades with it, although a trade might become temporarily disabled if it is used too frequently.{*B*} +Trades usually involve buying or selling a number of items for emeralds.{*B*} +If you do not have the items required for a trade, the items are shown in red.{*B*} + + + + {*T3*}HOW TO PLAY : ENDER CHEST {*ETW*}{*B*}{*B*} +All Ender Chests in a world are linked. Items placed into an Ender Chest are accessible in any other. However, the contents of the Ender Chests are different for each player. This allows players to store items in any Ender Chest, and retrieve them from other Ender Chests in different positions in the world. + + + + Farmer + + + Librarian + + + Priest + + + Blacksmith + + + Butcher + + + Found in villages, villagers will offer to sell items to the player depending on their profession. + + + Large Chest + + + + You can also create Enchanted Books at the Enchantment Table, which can be used later at the Anvil to apply their enchantment to an item. + + + + + Tripwire Hooks will also provide constant power to a circuit while something is triggering the string between them. + + + + + Once tamed, a wolf will always have its collar on. The color of their collar can be changed by dying it. + + + + Carrots and Potatoes are farmed by planting Carrots or Potatoes, and are ready for harvesting when the vegetable is visible above the ground. + + + + Additionally, pigs can be saddled and then ridden by players. They are controlled by tempting them with a Carrot on a Stick. + + + + + + If necessary you can slowly move your minecart along using {*CONTROLLER_ACTION_MOVE*}. This helps to start the minecart by getting it onto a powered rail. + + + + You cannot join this game as split-screen is only supported when in High Definition mode. Sign out all other players if you wish to join. + + + Cure + + + + Xbox 360 + + + Back + + + + This option disables achievements and leaderboard updates for this world while playing, and if loading it again after saving with this option on. + + + + Upload Save For Xbox One + + + + Upload Save + + + + Only one Xbox 360 console save can be stored in the save transfer area at a time. Please ensure you have downloaded the save on your Xbox One console before uploading another Xbox 360 console save. + + + + + Uploading... + + + + Upload Complete! + + + + Upload Failed. Please try again later. + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_DLCMain.h b/Minecraft.Client/Common/Media/xuiscene_DLCMain.h new file mode 100644 index 00000000..012bb71c --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_DLCMain.h @@ -0,0 +1,37 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_XuiOffersList L"XuiOffersList" +#define IDC_Timer_Square_1 L"Timer_Square_1" +#define IDC_Timer_Square_2 L"Timer_Square_2" +#define IDC_Timer_Square_3 L"Timer_Square_3" +#define IDC_Timer_Square_4 L"Timer_Square_4" +#define IDC_Timer_Square_5 L"Timer_Square_5" +#define IDC_Timer_Square_6 L"Timer_Square_6" +#define IDC_Timer_Square_7 L"Timer_Square_7" +#define IDC_Timer_Square_8 L"Timer_Square_8" +#define IDC_Timer_Square_9 L"Timer_Square_9" +#define IDC_Timer_Square_10 L"Timer_Square_10" +#define IDC_Timer_Square_11 L"Timer_Square_11" +#define IDC_Timer_Square_12 L"Timer_Square_12" +#define IDC_Timer_Square_13 L"Timer_Square_13" +#define IDC_Timer_Square_14 L"Timer_Square_14" +#define IDC_Timer_Square_15 L"Timer_Square_15" +#define IDC_Timer_Square_16 L"Timer_Square_16" +#define IDC_Timer L"Timer" +#define IDC_DLCMain L"DLCMain" diff --git a/Minecraft.Client/Common/Media/xuiscene_DLCMain.xui b/Minecraft.Client/Common/Media/xuiscene_DLCMain.xui new file mode 100644 index 00000000..8c92a3e8 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_DLCMain.xui @@ -0,0 +1,1092 @@ + + +1280.000000 +720.000000 + + + +DLCMain +620.000000 +440.000000 +330.000092,194.000000,0.000000 +CScene_DLCMain +XuiScene +OffersList + + + +XuiOffersList +576.000000 +390.000000 +22.000032,24.000000,0.000000 +CXuiCtrl4JList +XuiListRecessedDLC + + + +control_ListItem +400.000000 +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + + +Timer +182.000000 +168.000000 +208.000000,134.000000,0.000000 +XuiBlankScene + + + +Timer_Square_1 +42.000000 +42.000000 +14.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_2 +42.000000 +42.000000 +68.499985,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_3 +42.000000 +42.000000 +123.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_4 +42.000000 +42.000000 +123.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_5 +42.000000 +42.000000 +123.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_6 +42.000000 +42.000000 +68.499985,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_7 +42.000000 +42.000000 +14.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_8 +42.000000 +42.000000 +14.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_9 +42.000000 +42.000000 +14.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_10 +42.000000 +42.000000 +68.499985,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_11 +42.000000 +42.000000 +123.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_12 +42.000000 +42.000000 +123.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_13 +42.000000 +42.000000 +123.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_14 +42.000000 +42.000000 +68.499985,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_15 +42.000000 +42.000000 +14.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_16 +42.000000 +42.000000 +14.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + + +LoadStart + + + +LoopStart + + + +LoopEnd + +gotoandplay +LoopStart + + + +Timer_Square_1 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_3 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_8 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_4 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_7 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_6 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_5 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_2 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_9 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_10 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_11 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_12 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_13 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_14 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x07ebebeb + + + +Timer_Square_15 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x49ebebeb + + + +Timer_Square_16 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x8cebebeb + + + + + + + +Logo +1280.000000 +138.000000 +0.000000,56.000000,0.000000 +true +MenuTitleLogo + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_DLCMain_480.h b/Minecraft.Client/Common/Media/xuiscene_DLCMain_480.h new file mode 100644 index 00000000..1e7591c1 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_DLCMain_480.h @@ -0,0 +1,32 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_XuiOffersList L"XuiOffersList" +#define IDC_Timer_Square_1 L"Timer_Square_1" +#define IDC_Timer_Square_2 L"Timer_Square_2" +#define IDC_Timer_Square_3 L"Timer_Square_3" +#define IDC_Timer_Square_4 L"Timer_Square_4" +#define IDC_Timer_Square_5 L"Timer_Square_5" +#define IDC_Timer_Square_6 L"Timer_Square_6" +#define IDC_Timer_Square_7 L"Timer_Square_7" +#define IDC_Timer_Square_8 L"Timer_Square_8" +#define IDC_Timer_Square_9 L"Timer_Square_9" +#define IDC_Timer_Square_10 L"Timer_Square_10" +#define IDC_Timer_Square_11 L"Timer_Square_11" +#define IDC_Timer_Square_12 L"Timer_Square_12" +#define IDC_Timer_Square_13 L"Timer_Square_13" +#define IDC_Timer_Square_14 L"Timer_Square_14" +#define IDC_Timer_Square_15 L"Timer_Square_15" +#define IDC_Timer_Square_16 L"Timer_Square_16" +#define IDC_Timer L"Timer" +#define IDC_DLCMain L"DLCMain" diff --git a/Minecraft.Client/Common/Media/xuiscene_DLCMain_480.xui b/Minecraft.Client/Common/Media/xuiscene_DLCMain_480.xui new file mode 100644 index 00000000..763a8813 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_DLCMain_480.xui @@ -0,0 +1,1021 @@ + + +640.000000 +480.000000 + + + +DLCMain +400.000000 +290.000000 +120.000046,124.000046,0.000000 +CScene_DLCMain +GraphicPanel +OffersList + + + +XuiOffersList +376.000000 +261.000000 +12.000000,11.999996,0.000000 +CXuiCtrl4JList +XuiListRecessedDLCThin + + + +control_ListItem +400.000000 +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_LThin + + + + +control_ListItem +400.000000 +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_DLC_LThin + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_DLC_LThin + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_DLC_LThin + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_DLC_LThin + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_DLC_LThin + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_DLC_LThin + + + + + +Timer +184.000000 +170.000000 +150.000000,104.639999,0.000000 +0.500000,0.500000,1.000000 +XuiBlankScene + + + +Timer_Square_1 +42.000000 +42.000000 +14.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_2 +42.000000 +42.000000 +68.499985,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_3 +42.000000 +42.000000 +123.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_4 +42.000000 +42.000000 +123.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_5 +42.000000 +42.000000 +123.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_6 +42.000000 +42.000000 +68.499985,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_7 +42.000000 +42.000000 +14.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_8 +42.000000 +42.000000 +14.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_9 +42.000000 +42.000000 +14.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_10 +42.000000 +42.000000 +68.499985,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_11 +42.000000 +42.000000 +123.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_12 +42.000000 +42.000000 +123.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_13 +42.000000 +42.000000 +123.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_14 +42.000000 +42.000000 +68.499985,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_15 +42.000000 +42.000000 +14.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_16 +42.000000 +42.000000 +14.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + + +LoadStart + + + +LoopStart + + + +LoopEnd + +gotoandplay +LoopStart + + + +Timer_Square_1 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_3 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_8 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_4 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_7 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_6 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_5 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_2 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_9 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_10 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_11 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_12 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_13 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_14 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x07ebebeb + + + +Timer_Square_15 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x49ebebeb + + + +Timer_Square_16 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x8cebebeb + + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_DLCOffers.h b/Minecraft.Client/Common/Media/xuiscene_DLCOffers.h new file mode 100644 index 00000000..58245d3d --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_DLCOffers.h @@ -0,0 +1,61 @@ +#define IDC_XuiDLCPriceTag L"XuiDLCPriceTag" +#define IDC_XuiDLCBackground L"XuiDLCBackground" +#define IDC_XuiDLCBanner L"XuiDLCBanner" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_XuiOffersList L"XuiOffersList" +#define IDC_XuiHTMLSellText L"XuiHTMLSellText" +#define IDC_Timer_Square_1 L"Timer_Square_1" +#define IDC_Timer_Square_2 L"Timer_Square_2" +#define IDC_Timer_Square_3 L"Timer_Square_3" +#define IDC_Timer_Square_4 L"Timer_Square_4" +#define IDC_Timer_Square_5 L"Timer_Square_5" +#define IDC_Timer_Square_6 L"Timer_Square_6" +#define IDC_Timer_Square_7 L"Timer_Square_7" +#define IDC_Timer_Square_8 L"Timer_Square_8" +#define IDC_Timer_Square_9 L"Timer_Square_9" +#define IDC_Timer_Square_10 L"Timer_Square_10" +#define IDC_Timer_Square_11 L"Timer_Square_11" +#define IDC_Timer_Square_12 L"Timer_Square_12" +#define IDC_Timer_Square_13 L"Timer_Square_13" +#define IDC_Timer_Square_14 L"Timer_Square_14" +#define IDC_Timer_Square_15 L"Timer_Square_15" +#define IDC_Timer_Square_16 L"Timer_Square_16" +#define IDC_Timer L"Timer" +#define IDC_DLCOffers L"DLCOffers" diff --git a/Minecraft.Client/Common/Media/xuiscene_DLCOffers.xui b/Minecraft.Client/Common/Media/xuiscene_DLCOffers.xui new file mode 100644 index 00000000..1960133e --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_DLCOffers.xui @@ -0,0 +1,1355 @@ + + +1280.000000 +720.000000 + + + +DLCOffers +960.000000 +448.000000 +160.000000,196.000000,0.000000 +CScene_DLCOffers +XuiScene +OffersList + + + +XuiDLCPriceTag +440.000000 +36.000000 +494.000000,224.000000,0.000000 +DLC_PriceTag + + + + +XuiDLCBackground +440.000000 +196.000000 +494.000000,28.000000,0.000000 +DLCOffersOfferBackground + + + + +XuiDLCBanner +440.000000 +196.000000 +494.000000,28.000000,0.000000 +CXuiCtrl4JIcon +ItemBanner + + + + +XuiOffersList +456.000000 +400.000000 +22.000032,25.999996,0.000000 +CXuiCtrl4JList +XuiListRecessedDLC +XuiCheckboxAvatar +XuiCheckboxThemes + + + +control_ListItem +400.000000 +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + + +XuiHTMLSellText +440.000000 +130.000000 +494.000000,260.000000,0.000000 +false +XuiHtmlControl + + + + +Timer +182.000000 +168.000000 +150.000031,134.000000,0.000000 +XuiBlankScene + + + +Timer_Square_1 +42.000000 +42.000000 +14.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_2 +42.000000 +42.000000 +68.499985,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_3 +42.000000 +42.000000 +123.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_4 +42.000000 +42.000000 +123.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_5 +42.000000 +42.000000 +123.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_6 +42.000000 +42.000000 +68.499985,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_7 +42.000000 +42.000000 +14.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_8 +42.000000 +42.000000 +14.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_9 +42.000000 +42.000000 +14.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_10 +42.000000 +42.000000 +68.499985,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_11 +42.000000 +42.000000 +123.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_12 +42.000000 +42.000000 +123.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_13 +42.000000 +42.000000 +123.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_14 +42.000000 +42.000000 +68.499985,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_15 +42.000000 +42.000000 +14.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_16 +42.000000 +42.000000 +14.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + + +LoadStart + + + +LoopStart + + + +LoopEnd + +gotoandplay +LoopStart + + + +Timer_Square_1 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_3 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_8 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_4 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_7 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_6 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_5 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_2 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_9 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_10 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_11 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_12 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_13 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_14 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x07ebebeb + + + +Timer_Square_15 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x49ebebeb + + + +Timer_Square_16 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x8cebebeb + + + + + + + +Logo +1280.000000 +138.000000 +0.000000,56.000000,0.000000 +true +MenuTitleLogo + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_DLCOffers_480.h b/Minecraft.Client/Common/Media/xuiscene_DLCOffers_480.h new file mode 100644 index 00000000..61262c85 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_DLCOffers_480.h @@ -0,0 +1,50 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_XuiOffersList L"XuiOffersList" +#define IDC_XuiHTMLSellText L"XuiHTMLSellText" +#define IDC_Timer_Square_1 L"Timer_Square_1" +#define IDC_Timer_Square_2 L"Timer_Square_2" +#define IDC_Timer_Square_3 L"Timer_Square_3" +#define IDC_Timer_Square_4 L"Timer_Square_4" +#define IDC_Timer_Square_5 L"Timer_Square_5" +#define IDC_Timer_Square_6 L"Timer_Square_6" +#define IDC_Timer_Square_7 L"Timer_Square_7" +#define IDC_Timer_Square_8 L"Timer_Square_8" +#define IDC_Timer_Square_9 L"Timer_Square_9" +#define IDC_Timer_Square_10 L"Timer_Square_10" +#define IDC_Timer_Square_11 L"Timer_Square_11" +#define IDC_Timer_Square_12 L"Timer_Square_12" +#define IDC_Timer_Square_13 L"Timer_Square_13" +#define IDC_Timer_Square_14 L"Timer_Square_14" +#define IDC_Timer_Square_15 L"Timer_Square_15" +#define IDC_Timer_Square_16 L"Timer_Square_16" +#define IDC_Timer L"Timer" +#define IDC_XuiDLCBackground L"XuiDLCBackground" +#define IDC_XuiDLCPriceTag L"XuiDLCPriceTag" +#define IDC_XuiDLCBanner L"XuiDLCBanner" +#define IDC_DLCOffers L"DLCOffers" diff --git a/Minecraft.Client/Common/Media/xuiscene_DLCOffers_480.xui b/Minecraft.Client/Common/Media/xuiscene_DLCOffers_480.xui new file mode 100644 index 00000000..ab6685d4 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_DLCOffers_480.xui @@ -0,0 +1,1211 @@ + + +640.000000 +480.000000 + + + +DLCOffers +540.000000 +286.000000 +50.000000,124.000046,0.000000 +CScene_DLCOffers +GraphicPanel +OffersList + + + +XuiOffersList +284.000000 +264.000000 +10.000004,9.999996,0.000000 +CXuiCtrl4JList +XuiListRecessedDLCThin + + + +control_ListItem +400.000000 +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_LThin + + + + +control_ListItem +400.000000 +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_DLC_LThin + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_DLC_LThin + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_DLC_LThin + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_DLC_LThin + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_DLC_LThin + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_DLC_LThin + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_DLC_LThin + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_DLC_LThin + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_DLC_LThin + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_DLC_LThin + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_DLC_LThin + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_DLC_LThin + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_DLC_LThin + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_DLC_LThin + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_DLC_LThin + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_DLC_LThin + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_DLC_LThin + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_DLC_LThin + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_DLC_LThin + + + + + +XuiHTMLSellText +226.000000 +102.000000 +300.000000,152.000000,0.000000 +false +XuiHtmlControl_Small + + + + +Timer +184.000000 +170.000000 +102.000000,104.000000,0.000000 +0.500000,0.500000,1.000000 +XuiBlankScene + + + +Timer_Square_1 +42.000000 +42.000000 +14.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_2 +42.000000 +42.000000 +68.499985,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_3 +42.000000 +42.000000 +123.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_4 +42.000000 +42.000000 +123.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_5 +42.000000 +42.000000 +123.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_6 +42.000000 +42.000000 +68.499985,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_7 +42.000000 +42.000000 +14.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_8 +42.000000 +42.000000 +14.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_9 +42.000000 +42.000000 +14.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_10 +42.000000 +42.000000 +68.499985,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_11 +42.000000 +42.000000 +123.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_12 +42.000000 +42.000000 +123.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_13 +42.000000 +42.000000 +123.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_14 +42.000000 +42.000000 +68.499985,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_15 +42.000000 +42.000000 +14.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_16 +42.000000 +42.000000 +14.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + + +LoadStart + + + +LoopStart + + + +LoopEnd + +gotoandplay +LoopStart + + + +Timer_Square_1 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_3 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_8 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_4 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_7 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_6 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_5 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_2 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_9 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_10 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_11 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_12 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_13 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_14 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x07ebebeb + + + +Timer_Square_15 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x49ebebeb + + + +Timer_Square_16 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x8cebebeb + + + + + + +XuiDLCBackground +226.000000 +96.000000 +300.000000,22.000000,0.000000 +DLCOffersOfferBackground + + + + +XuiDLCPriceTag +226.000000 +26.000000 +300.000000,118.000000,0.000000 +DLC_PriceTag480 + + + + +XuiDLCBanner +226.000000 +96.000000 +300.000000,22.000000,0.000000 +CXuiCtrl4JIcon +ItemBanner480 + + + + + +Logo +640.000000 +70.000000 +0.000000,48.000000,0.000000 +true +MenuTitleLogo + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_NewUpdateMessage.h b/Minecraft.Client/Common/Media/xuiscene_NewUpdateMessage.h new file mode 100644 index 00000000..88ecc4a7 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_NewUpdateMessage.h @@ -0,0 +1,2 @@ +#define IDC_XuiHTMLMessage L"XuiHTMLMessage" +#define IDC_NewUpdate L"NewUpdate" diff --git a/Minecraft.Client/Common/Media/xuiscene_NewUpdateMessage.xui b/Minecraft.Client/Common/Media/xuiscene_NewUpdateMessage.xui new file mode 100644 index 00000000..4af4cfdd --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_NewUpdateMessage.xui @@ -0,0 +1,36 @@ + + +1280.000000 +720.000000 + + + +NewUpdate +800.000000 +430.000000 +240.000046,200.000000,0.000000 +CScene_NewUpdateMessage +XuiScene +OffersList + + + +XuiHTMLMessage +744.000000 +364.000000 +28.000034,24.000000,0.000000 +XuiHtmlControl + + + + + +Logo +1280.000000 +138.000000 +0.000000,56.000000,0.000000 +true +MenuTitleLogo + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_NewUpdateMessage_480.h b/Minecraft.Client/Common/Media/xuiscene_NewUpdateMessage_480.h new file mode 100644 index 00000000..88ecc4a7 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_NewUpdateMessage_480.h @@ -0,0 +1,2 @@ +#define IDC_XuiHTMLMessage L"XuiHTMLMessage" +#define IDC_NewUpdate L"NewUpdate" diff --git a/Minecraft.Client/Common/Media/xuiscene_NewUpdateMessage_480.xui b/Minecraft.Client/Common/Media/xuiscene_NewUpdateMessage_480.xui new file mode 100644 index 00000000..467b4b41 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_NewUpdateMessage_480.xui @@ -0,0 +1,37 @@ + + +640.000000 +480.000000 + + + +NewUpdate +500.000000 +286.000000 +70.000000,124.000046,0.000000 +CScene_NewUpdateMessage +GraphicPanel +OffersList + + + +XuiHTMLMessage +470.000000 +239.000000 +16.000000,20.000000,0.000000 +false +XuiHtmlControl + + + + + +Logo +640.000000 +70.000000 +0.000000,48.000000,0.000000 +true +MenuTitleLogo + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_anvil.h b/Minecraft.Client/Common/Media/xuiscene_anvil.h new file mode 100644 index 00000000..cc116d19 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_anvil.h @@ -0,0 +1,312 @@ +#define IDC_AnvilText L"AnvilText" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Ingredient L"Ingredient" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Ingredient2 L"Ingredient2" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Result L"Result" +#define IDC_AnvilTextInput L"AnvilTextInput" +#define IDC_LabelAffordable L"LabelAffordable" +#define IDC_LabelExpensive L"LabelExpensive" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Inventory L"Inventory" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_UseRow L"UseRow" +#define IDC_InventoryText L"InventoryText" +#define IDC_AnvilHammer L"AnvilHammer" +#define IDC_AnvilPlus L"AnvilPlus" +#define IDC_AnvilArrow L"AnvilArrow" +#define IDC_AnvilCross L"AnvilCross" +#define IDC_Pointer L"Pointer" +#define IDC_Group L"Group" +#define IDC_XuiSceneAnvil L"XuiSceneAnvil" diff --git a/Minecraft.Client/Common/Media/xuiscene_anvil.xui b/Minecraft.Client/Common/Media/xuiscene_anvil.xui new file mode 100644 index 00000000..53e686fe --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_anvil.xui @@ -0,0 +1,4396 @@ + + +1280.000000 +720.000000 + + + +XuiSceneAnvil +1280.000000 +720.000000 +CXuiSceneAnvil +XuiBlankScene +Pointer + + + +Group +430.000000 +430.000000 +435.000000,91.000000,0.000000 +15 +XuiScene +Pointer + + + +AnvilText +264.000000 +34.000000 +135.000031,18.000000,0.000000 +LabelContainerSceneCentre + + + + +Ingredient +54.000000 +54.000000 +42.000000,110.000000,0.000000 +3 +CXuiCtrlSlotList +ItemGridVertical54 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + + +Ingredient2 +54.000000 +54.000000 +176.000000,110.000000,0.000000 +3 +CXuiCtrlSlotList +ItemGridVertical54 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + + +Result +54.000000 +54.000000 +342.000000,110.000000,0.000000 +3 +CXuiCtrlSlotList +ItemGridVertical54 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + + +AnvilTextInput +254.000000 +137.000000,59.000000,0.000000 +CXuiCtrl4JEdit + + + + +LabelAffordable +320.000000 +24.000000 +82.000000,170.000000,0.000000 +XuiLabelAffordable + + + + +LabelExpensive +320.000000 +27.000000 +82.000000,170.000000,0.000000 +XuiLabelExpensive + + + + +Inventory +382.000000 +150.000000 +24.000000,225.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + + +UseRow +381.000000 +50.000000 +24.000000,364.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + + +InventoryText +375.000000 +32.000000 +26.000000,194.000000,0.000000 +LabelContainerSceneLeft + + + + +AnvilHammer +75.000000 +75.000000 +36.000000,28.000000,0.000000 +3 +AnvilHammer + + + + +AnvilPlus +39.000000 +39.000000 +116.000000,116.000000,0.000000 +3 +AnvilPlus + + + + +AnvilArrow +72.000000 +48.000000 +250.000000,112.000000,0.000000 +ArrowProgressState + + + + +AnvilCross +39.000000 +39.000000 +268.000000,118.000000,0.000000 +3 +AnvilCross + + + + +Pointer +42.000000 +42.000000 +-185.000000,-83.000015,0.000000 +9 +false +CXuiCtrlSlotItem +ItemPointer + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +435.000000,91.000000,0.000000 + + + +0 +435.000000,91.000000,0.000000 + + + +2 +100 +-100 +50 +435.000000,91.000000,0.000000 + + + +0 +160.000000,91.000000,0.000000 + + + +2 +100 +-100 +50 +160.000000,91.000000,0.000000 + + + +0 +435.000000,91.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_anvil_480.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_480.xui b/Minecraft.Client/Common/Media/xuiscene_anvil_480.xui new file mode 100644 index 00000000..0a92620b --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_anvil_480.xui @@ -0,0 +1,4907 @@ + + +640.000000 +480.000000 + + + +XuiSceneAnvil +640.000000 +480.000000 +CXuiSceneAnvil +XuiBlankScene +Pointer + + + +Group +260.000000 +290.000000 +190.000000,96.000000,0.000000 +15 +GraphicPanel +Pointer + + + +AnvilText +156.000000 +26.000000 +75.500008,12.000000,0.000000 +LabelContainerSceneCentreSmall + + + + +Ingredient +32.000000 +32.000000 +21.000000,80.000000,0.000000 +3 +CXuiCtrlSlotList +ItemGridVertical32 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + + +Ingredient2 +32.000000 +32.000000 +103.999985,80.000000,0.000000 +3 +CXuiCtrlSlotList +ItemGridVertical32 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + + +Result +32.000000 +32.000000 +201.000000,80.000000,0.000000 +3 +CXuiCtrlSlotList +ItemGridVertical32 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + + +AnvilTextInput +152.000000 +25.000000 +78.000000,38.000008,0.000000 +CXuiCtrl4JEdit +XuiEditSmall + + + + +LabelAffordable +175.000000 +18.000000 +70.000000,118.000000,0.000000 +XuiLabelAffordableSmall + + + + +LabelExpensive +175.000000 +18.000000 +70.000000,118.000000,0.000000 +XuiLabelExpensiveSmall + + + + +Inventory +234.000000 +78.000000 +13.000000,162.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical26 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +UseRow +234.000000 +13.000000,250.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical26 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +InventoryText +234.000000 +25.000000 +12.000000,140.000000,0.000000 +9 +LabelContainerSceneLeftSmall + + + + +AnvilHammer +45.000000 +45.000000 +15.000000,22.000000,0.000000 +AnvilHammer + + + + +AnvilPlus +25.000000 +25.000000 +68.000000,84.000000,0.000000 +3 +AnvilPlus + + + + +AnvilArrow +32.000000 +32.000000 +146.000000,80.000000,0.000000 +3 +ArrowProgressStateSmall + + + + +AnvilCross +30.000000 +148.000000,80.000000,0.000000 +3 +AnvilCross + + + + +Pointer +26.000000 +26.000000 +-50.000000,-50.000000,0.000000 +9 +false +CXuiCtrlSlotItem +ItemPointerSmall + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +190.000000,96.000000,0.000000 + + + +0 +190.000000,96.000000,0.000000 + + + +2 +100 +-100 +50 +190.000000,96.000000,0.000000 + + + +0 +33.750000,96.000000,0.000000 + + + +2 +100 +-100 +50 +60.000000,96.000000,0.000000 + + + +0 +190.000000,96.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_anvil_small.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_anvil_small.xui b/Minecraft.Client/Common/Media/xuiscene_anvil_small.xui new file mode 100644 index 00000000..1ec8572f --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_anvil_small.xui @@ -0,0 +1,5183 @@ + + +640.000000 +360.000000 + + + +XuiSceneAnvil +640.000000 +360.000000 +CXuiSceneAnvil +XuiBlankScene +Pointer + + + +Group +260.000000 +290.000000 +190.000000,2.000000,0.000000 +15 +GraphicPanel +Pointer + + + +AnvilText +156.000000 +26.000000 +75.500008,12.000000,0.000000 +LabelContainerSceneCentreSmall + + + + +Ingredient +32.000000 +32.000000 +21.000000,80.000000,0.000000 +3 +CXuiCtrlSlotList +ItemGridVertical32 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + + +Ingredient2 +32.000000 +32.000000 +103.999985,80.000000,0.000000 +3 +CXuiCtrlSlotList +ItemGridVertical32 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + + +Result +32.000000 +32.000000 +201.000000,80.000000,0.000000 +3 +CXuiCtrlSlotList +ItemGridVertical32 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + + +AnvilTextInput +152.000000 +25.000000 +78.000000,38.000008,0.000000 +CXuiCtrl4JEdit +XuiEditSmall + + + + +LabelAffordable +175.000000 +18.000000 +70.000000,118.000000,0.000000 +XuiLabelAffordableSmall + + + + +LabelExpensive +175.000000 +18.000000 +70.000000,118.000000,0.000000 +XuiLabelExpensiveSmall + + + + +Inventory +234.000000 +78.000000 +13.000000,162.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical26 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +UseRow +234.000000 +13.000000,250.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical26 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +InventoryText +234.000000 +25.000000 +12.000000,140.000000,0.000000 +9 +LabelContainerSceneLeftSmall + + + + +AnvilHammer +45.000000 +45.000000 +15.000000,22.000000,0.000000 +AnvilHammer + + + + +AnvilPlus +25.000000 +25.000000 +68.000000,84.000000,0.000000 +3 +AnvilPlus + + + + +AnvilArrow +32.000000 +32.000000 +146.000000,80.000000,0.000000 +3 +ArrowProgressStateSmall + + + + +AnvilCross +30.000000 +148.000000,80.000000,0.000000 +3 +AnvilCross + + + + +Pointer +26.000000 +26.000000 +-50.000000,-50.000000,0.000000 +9 +false +CXuiCtrlSlotItem +ItemPointerSmall + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +190.000000,2.000000,0.000000 + + + +0 +190.000000,2.000000,0.000000 + + + +2 +100 +-100 +50 +190.000000,2.000000,0.000000 + + + +0 +33.750000,2.000000,0.000000 + + + +2 +100 +-100 +50 +60.000000,2.000000,0.000000 + + + +0 +190.000000,2.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_base.h b/Minecraft.Client/Common/Media/xuiscene_base.h new file mode 100644 index 00000000..28701d0a --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_base.h @@ -0,0 +1,184 @@ +#define IDC_BottomLeftAnchorPoint L"BottomLeftAnchorPoint" +#define IDC_TopLeftAnchorPoint L"TopLeftAnchorPoint" +#define IDC_XuiDarkOverlay L"XuiDarkOverlay" +#define IDC_Background L"Background" +#define IDC_Logo L"Logo" +#define IDC_XuiSceneHudRoot L"XuiSceneHudRoot" +#define IDC_XuiSceneChatRoot L"XuiSceneChatRoot" +#define IDC_XuiSceneContainer L"XuiSceneContainer" +#define IDC_RStick L"RStick" +#define IDC_LStick L"LStick" +#define IDC_LBButton L"LBButton" +#define IDC_RBButton L"RBButton" +#define IDC_RTrigger L"RTrigger" +#define IDC_LTrigger L"LTrigger" +#define IDC_YButton L"YButton" +#define IDC_XButton L"XButton" +#define IDC_BButton L"BButton" +#define IDC_AButton L"AButton" +#define IDC_Tooltips L"Tooltips" +#define IDC_RStick L"RStick" +#define IDC_LStick L"LStick" +#define IDC_LBButton L"LBButton" +#define IDC_RBButton L"RBButton" +#define IDC_RTrigger L"RTrigger" +#define IDC_LTrigger L"LTrigger" +#define IDC_YButton L"YButton" +#define IDC_XButton L"XButton" +#define IDC_BButton L"BButton" +#define IDC_AButton L"AButton" +#define IDC_TooltipsSmall L"TooltipsSmall" +#define IDC_SelectedItem L"SelectedItem" +#define IDC_SelectedItemSmall L"SelectedItemSmall" +#define IDC_TitleText L"TitleText" +#define IDC_ProgressBar1 L"ProgressBar1" +#define IDC_ProgressBar2 L"ProgressBar2" +#define IDC_ProgressBar3 L"ProgressBar3" +#define IDC_ProgressBar1_small L"ProgressBar1_small" +#define IDC_ProgressBar2_small L"ProgressBar2_small" +#define IDC_ProgressBar3_small L"ProgressBar3_small" +#define IDC_BossHealth L"BossHealth" +#define IDC_XuiSceneTutorialContainer L"XuiSceneTutorialContainer" +#define IDC_XuiGamertag L"XuiGamertag" +#define IDC_BasePlayer3 L"BasePlayer3" +#define IDC_BottomLeftAnchorPoint L"BottomLeftAnchorPoint" +#define IDC_TopLeftAnchorPoint L"TopLeftAnchorPoint" +#define IDC_XuiDarkOverlay L"XuiDarkOverlay" +#define IDC_Background L"Background" +#define IDC_Logo L"Logo" +#define IDC_XuiSceneHudRoot L"XuiSceneHudRoot" +#define IDC_XuiSceneChatRoot L"XuiSceneChatRoot" +#define IDC_XuiSceneContainer L"XuiSceneContainer" +#define IDC_RStick L"RStick" +#define IDC_LStick L"LStick" +#define IDC_LBButton L"LBButton" +#define IDC_RBButton L"RBButton" +#define IDC_RTrigger L"RTrigger" +#define IDC_LTrigger L"LTrigger" +#define IDC_YButton L"YButton" +#define IDC_XButton L"XButton" +#define IDC_BButton L"BButton" +#define IDC_AButton L"AButton" +#define IDC_Tooltips L"Tooltips" +#define IDC_RStick L"RStick" +#define IDC_LStick L"LStick" +#define IDC_LBButton L"LBButton" +#define IDC_RBButton L"RBButton" +#define IDC_RTrigger L"RTrigger" +#define IDC_LTrigger L"LTrigger" +#define IDC_YButton L"YButton" +#define IDC_XButton L"XButton" +#define IDC_BButton L"BButton" +#define IDC_AButton L"AButton" +#define IDC_TooltipsSmall L"TooltipsSmall" +#define IDC_SelectedItem L"SelectedItem" +#define IDC_SelectedItemSmall L"SelectedItemSmall" +#define IDC_TitleText L"TitleText" +#define IDC_ProgressBar1 L"ProgressBar1" +#define IDC_ProgressBar2 L"ProgressBar2" +#define IDC_ProgressBar3 L"ProgressBar3" +#define IDC_ProgressBar1_small L"ProgressBar1_small" +#define IDC_ProgressBar2_small L"ProgressBar2_small" +#define IDC_ProgressBar3_small L"ProgressBar3_small" +#define IDC_BossHealth L"BossHealth" +#define IDC_XuiSceneTutorialContainer L"XuiSceneTutorialContainer" +#define IDC_XuiGamertag L"XuiGamertag" +#define IDC_BasePlayer2 L"BasePlayer2" +#define IDC_BottomLeftAnchorPoint L"BottomLeftAnchorPoint" +#define IDC_TopLeftAnchorPoint L"TopLeftAnchorPoint" +#define IDC_XuiDarkOverlay L"XuiDarkOverlay" +#define IDC_Background L"Background" +#define IDC_Logo L"Logo" +#define IDC_XuiSceneHudRoot L"XuiSceneHudRoot" +#define IDC_XuiSceneChatRoot L"XuiSceneChatRoot" +#define IDC_XuiSceneContainer L"XuiSceneContainer" +#define IDC_RStick L"RStick" +#define IDC_LStick L"LStick" +#define IDC_LBButton L"LBButton" +#define IDC_RBButton L"RBButton" +#define IDC_RTrigger L"RTrigger" +#define IDC_LTrigger L"LTrigger" +#define IDC_YButton L"YButton" +#define IDC_XButton L"XButton" +#define IDC_BButton L"BButton" +#define IDC_AButton L"AButton" +#define IDC_Tooltips L"Tooltips" +#define IDC_RStick L"RStick" +#define IDC_LStick L"LStick" +#define IDC_LBButton L"LBButton" +#define IDC_RBButton L"RBButton" +#define IDC_RTrigger L"RTrigger" +#define IDC_LTrigger L"LTrigger" +#define IDC_YButton L"YButton" +#define IDC_XButton L"XButton" +#define IDC_BButton L"BButton" +#define IDC_AButton L"AButton" +#define IDC_TooltipsSmall L"TooltipsSmall" +#define IDC_SelectedItem L"SelectedItem" +#define IDC_SelectedItemSmall L"SelectedItemSmall" +#define IDC_TitleText L"TitleText" +#define IDC_ProgressBar1 L"ProgressBar1" +#define IDC_ProgressBar2 L"ProgressBar2" +#define IDC_ProgressBar3 L"ProgressBar3" +#define IDC_ProgressBar1_small L"ProgressBar1_small" +#define IDC_ProgressBar2_small L"ProgressBar2_small" +#define IDC_ProgressBar3_small L"ProgressBar3_small" +#define IDC_BossHealth L"BossHealth" +#define IDC_XuiSceneTutorialContainer L"XuiSceneTutorialContainer" +#define IDC_XuiGamertag L"XuiGamertag" +#define IDC_BasePlayer1 L"BasePlayer1" +#define IDC_BottomLeftAnchorPoint L"BottomLeftAnchorPoint" +#define IDC_TopLeftAnchorPoint L"TopLeftAnchorPoint" +#define IDC_XuiDarkOverlay L"XuiDarkOverlay" +#define IDC_Background L"Background" +#define IDC_Logo L"Logo" +#define IDC_XuiSceneHudRoot L"XuiSceneHudRoot" +#define IDC_XuiSceneChatRoot L"XuiSceneChatRoot" +#define IDC_XuiSceneContainer L"XuiSceneContainer" +#define IDC_RStick L"RStick" +#define IDC_LStick L"LStick" +#define IDC_LBButton L"LBButton" +#define IDC_RBButton L"RBButton" +#define IDC_RTrigger L"RTrigger" +#define IDC_LTrigger L"LTrigger" +#define IDC_YButton L"YButton" +#define IDC_XButton L"XButton" +#define IDC_BButton L"BButton" +#define IDC_AButton L"AButton" +#define IDC_Tooltips L"Tooltips" +#define IDC_RStick L"RStick" +#define IDC_LStick L"LStick" +#define IDC_LBButton L"LBButton" +#define IDC_RBButton L"RBButton" +#define IDC_RTrigger L"RTrigger" +#define IDC_LTrigger L"LTrigger" +#define IDC_YButton L"YButton" +#define IDC_XButton L"XButton" +#define IDC_BButton L"BButton" +#define IDC_AButton L"AButton" +#define IDC_TooltipsSmall L"TooltipsSmall" +#define IDC_SelectedItem L"SelectedItem" +#define IDC_SelectedItemSmall L"SelectedItemSmall" +#define IDC_TitleText L"TitleText" +#define IDC_ProgressBar1 L"ProgressBar1" +#define IDC_ProgressBar2 L"ProgressBar2" +#define IDC_ProgressBar3 L"ProgressBar3" +#define IDC_ProgressBar1_small L"ProgressBar1_small" +#define IDC_ProgressBar2_small L"ProgressBar2_small" +#define IDC_ProgressBar3_small L"ProgressBar3_small" +#define IDC_BossHealth L"BossHealth" +#define IDC_XuiSceneTutorialContainer L"XuiSceneTutorialContainer" +#define IDC_XuiGamertag L"XuiGamertag" +#define IDC_BasePlayer0 L"BasePlayer0" +#define IDC_XuiPressStartMessage L"XuiPressStartMessage" +#define IDC_XuiSceneDebugContainer L"XuiSceneDebugContainer" +#define IDC_XuiSavingIcon L"XuiSavingIcon" +#define IDC_XuiTrialTimer L"XuiTrialTimer" +#define IDC_SafeArea L"SafeArea" +#define IDC_XuiSoundXACTBack L"XuiSoundXACTBack" +#define IDC_XuiSoundXACTCraft L"XuiSoundXACTCraft" +#define IDC_XuiSoundXACTCraftFail L"XuiSoundXACTCraftFail" +#define IDC_XuiSoundXACTFocus L"XuiSoundXACTFocus" +#define IDC_XuiSoundXACTPress L"XuiSoundXACTPress" +#define IDC_XuiSoundXACTScroll L"XuiSoundXACTScroll" +#define IDC_XuiBaseScene L"XuiBaseScene" diff --git a/Minecraft.Client/Common/Media/xuiscene_base.xui b/Minecraft.Client/Common/Media/xuiscene_base.xui new file mode 100644 index 00000000..bab72bca --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_base.xui @@ -0,0 +1,2113 @@ + + +1280.000000 +720.000000 + + + +XuiBaseScene +1280.000000 +720.000000 +CXuiSceneBase +XuiBlankScene +FadeIn + + + +BasePlayer3 +1280.000000 +720.000000 +15 +true +XuiBlankScene + + + +BottomLeftAnchorPoint +0.000000 +0.000000 +64.000000,648.000000,0.000000 +false +true +XuiVisualImagePresenter +false + + + + +TopLeftAnchorPoint +0.000000 +0.000000 +64.000000,36.000000,0.000000 +false +true +XuiVisualImagePresenter +false + + + + +XuiDarkOverlay +1280.000000 +720.000000 +false +XuiDarkOverlay + + + + +Background +1280.000000 +720.000000 +15 +false +true +XuiBackgroundPan + + + + +Logo +1280.000000 +138.000000 +0.000000,56.000000,0.000000 +MenuTitleLogo + + + + +XuiSceneHudRoot +1280.000000 +720.000000 +207 +true +XuiBlankScene + + + + +XuiSceneChatRoot +1280.000000 +720.000000 +true +XuiBlankScene + + + + +XuiSceneContainer +1280.000000 +720.000000 +207 +XuiBlankScene + + + + +Tooltips +200.000000 +40.000000 +0.000000,0.000061,0.000000 + + + +RStick +200.000000 +40.000000 +15 +false +RStick_Button +true +22532 + + + + +LStick +200.000000 +40.000000 +15 +false +LStick_Nav +true +22532 + + + + +LBButton +200.000000 +40.000000 +15 +false +LB_Button +true +22532 + + + + +RBButton +200.000000 +40.000000 +15 +false +RB_Button +true +22532 + + + + +RTrigger +200.000000 +40.000000 +15 +false +RTrigger +true +22535 + + + + +LTrigger +200.000000 +40.000000 +15 +false +LTrigger +true +22534 + + + + +YButton +200.000000 +40.000000 +15 +false +Y_Button +true +22531 + + + + +XButton +200.000000 +40.000000 +15 +false +X_Button +true +22530 + + + + +BButton +200.000000 +40.000000 +15 +false +B_Button +true +22529 + + + + +AButton +200.000000 +40.000000 +15 +false +A_Button +true +22528 + + + + + +TooltipsSmall +200.000000 +28.000000 +0.000000,0.000061,0.000000 + + + +RStick +200.000000 +28.000000 +15 +false +RStick_ButtonSmall +true +22532 + + + + +LStick +200.000000 +28.000000 +15 +false +LStick_NavSmall +true +22532 + + + + +LBButton +200.000000 +28.000000 +15 +false +LB_ButtonSmall +true +22532 + + + + +RBButton +200.000000 +28.000000 +15 +false +RB_ButtonSmall +true +22532 + + + + +RTrigger +200.000000 +28.000000 +15 +false +RTriggerSmall +true +22535 + + + + +LTrigger +200.000000 +28.000000 +15 +false +LTriggerSmall +true +22534 + + + + +YButton +200.000000 +28.000000 +15 +false +Y_ButtonSmall +true +22531 + + + + +XButton +200.000000 +28.000000 +15 +false +X_ButtonSmall +true +22530 + + + + +BButton +200.000000 +28.000000 +15 +false +B_ButtonSmall +true +22529 + + + + +AButton +200.000000 +28.000000 +15 +false +A_ButtonSmall +true +22528 + + + + + +SelectedItem +400.000000 +440.000061,36.000000,0.000000 +0.800000 +XuiLabelLight_ShadowCentred + + + + +SelectedItemSmall +400.000000 +145.000031,240.000000,0.000000 +0.800000 +XuiLabelLight_ShadowCentred + + + + +BossHealth +1000.000000 +51.000000 +140.000000,36.000000,0.000000 +false + + + +TitleText +1000.000000 +36.000000 +5 +BossHealthLabel + + + + +ProgressBar1 +334.000000 +15.000000 +333.000000,36.000000,0.000000 +BossHealthProgress1 +200 + + + + +ProgressBar2 +666.000000 +15.000000 +167.000000,36.000000,0.000000 +BossHealthProgress2 +200 + + + + +ProgressBar3 +940.000000 +15.000000 +30.000031,36.000000,0.000000 +BossHealthProgress3 +200 + + + + +ProgressBar1_small +167.000000 +15.000000 +416.000000,36.000000,0.000000 +BossHealthProgress1_480 +200 + + + + +ProgressBar2_small +333.000000 +15.000000 +333.000000,36.000000,0.000000 +BossHealthProgress2_480 +200 + + + + +ProgressBar3_small +400.000000 +15.000000 +300.000031,36.000000,0.000000 +BossHealthProgress3_480 +200 + + + + + +XuiSceneTutorialContainer +1280.000000 +720.000000 +207 +true +XuiBlankScene + + + + +XuiGamertag +290.000000 +926.000000,36.000000,0.000000 +0.800000 +XuiLabelLight_ShadowedRight + + + + + +BasePlayer2 +1280.000000 +720.000000 +15 +true +XuiBlankScene + + + +BottomLeftAnchorPoint +0.000000 +0.000000 +64.000000,648.000000,0.000000 +false +true +XuiVisualImagePresenter +false + + + + +TopLeftAnchorPoint +0.000000 +0.000000 +64.000000,36.000000,0.000000 +false +true +XuiVisualImagePresenter +false + + + + +XuiDarkOverlay +1280.000000 +720.000000 +false +XuiDarkOverlay + + + + +Background +1280.000000 +720.000000 +15 +false +true +XuiBackgroundPan + + + + +Logo +1280.000000 +138.000000 +0.000000,56.000000,0.000000 +MenuTitleLogo + + + + +XuiSceneHudRoot +1280.000000 +720.000000 +207 +true +XuiBlankScene + + + + +XuiSceneChatRoot +1280.000000 +720.000000 +true +XuiBlankScene + + + + +XuiSceneContainer +1280.000000 +720.000000 +207 +XuiBlankScene + + + + +Tooltips +200.000000 +40.000000 +0.000000,0.000061,0.000000 + + + +RStick +200.000000 +40.000000 +15 +false +RStick_Button +true +22532 + + + + +LStick +200.000000 +40.000000 +15 +false +LStick_Nav +true +22532 + + + + +LBButton +200.000000 +40.000000 +15 +false +LB_Button +true +22532 + + + + +RBButton +200.000000 +40.000000 +15 +false +RB_Button +true +22532 + + + + +RTrigger +200.000000 +40.000000 +15 +false +RTrigger +true +22535 + + + + +LTrigger +200.000000 +40.000000 +15 +false +LTrigger +true +22534 + + + + +YButton +200.000000 +40.000000 +15 +false +Y_Button +true +22531 + + + + +XButton +200.000000 +40.000000 +15 +false +X_Button +true +22530 + + + + +BButton +200.000000 +40.000000 +15 +false +B_Button +true +22529 + + + + +AButton +200.000000 +40.000000 +15 +false +A_Button +true +22528 + + + + + +TooltipsSmall +200.000000 +28.000000 +0.000000,0.000061,0.000000 + + + +RStick +200.000000 +28.000000 +15 +false +RStick_ButtonSmall +true +22532 + + + + +LStick +200.000000 +28.000000 +15 +false +LStick_NavSmall +true +22532 + + + + +LBButton +200.000000 +28.000000 +15 +false +LB_ButtonSmall +true +22532 + + + + +RBButton +200.000000 +28.000000 +15 +false +RB_ButtonSmall +true +22532 + + + + +RTrigger +200.000000 +28.000000 +15 +false +RTriggerSmall +true +22535 + + + + +LTrigger +200.000000 +28.000000 +15 +false +LTriggerSmall +true +22534 + + + + +YButton +200.000000 +28.000000 +15 +false +Y_ButtonSmall +true +22531 + + + + +XButton +200.000000 +28.000000 +15 +false +X_ButtonSmall +true +22530 + + + + +BButton +200.000000 +28.000000 +15 +false +B_ButtonSmall +true +22529 + + + + +AButton +200.000000 +28.000000 +15 +false +A_ButtonSmall +true +22528 + + + + + +SelectedItem +400.000000 +440.000061,36.000000,0.000000 +0.800000 +XuiLabelLight_ShadowCentred + + + + +SelectedItemSmall +400.000000 +145.000031,240.000000,0.000000 +0.800000 +XuiLabelLight_ShadowCentred + + + + +BossHealth +1000.000000 +51.000000 +140.000000,36.000000,0.000000 +false + + + +TitleText +1000.000000 +36.000000 +5 +BossHealthLabel + + + + +ProgressBar1 +334.000000 +15.000000 +333.000000,36.000000,0.000000 +BossHealthProgress1 +200 + + + + +ProgressBar2 +666.000000 +15.000000 +167.000000,36.000000,0.000000 +BossHealthProgress2 +200 + + + + +ProgressBar3 +940.000000 +15.000000 +30.000031,36.000000,0.000000 +BossHealthProgress3 +200 + + + + +ProgressBar1_small +167.000000 +15.000000 +416.000000,36.000000,0.000000 +BossHealthProgress1_480 +200 + + + + +ProgressBar2_small +333.000000 +15.000000 +333.000000,36.000000,0.000000 +BossHealthProgress2_480 +200 + + + + +ProgressBar3_small +400.000000 +15.000000 +300.000031,36.000000,0.000000 +BossHealthProgress3_480 +200 + + + + + +XuiSceneTutorialContainer +1280.000000 +720.000000 +207 +true +XuiBlankScene + + + + +XuiGamertag +290.000000 +926.000000,36.000000,0.000000 +0.800000 +XuiLabelLight_ShadowedRight + + + + + +BasePlayer1 +1280.000000 +720.000000 +15 +true +XuiBlankScene + + + +BottomLeftAnchorPoint +0.000000 +0.000000 +64.000000,648.000000,0.000000 +false +true +XuiVisualImagePresenter +false + + + + +TopLeftAnchorPoint +0.000000 +0.000000 +64.000000,36.000000,0.000000 +false +true +XuiVisualImagePresenter +false + + + + +XuiDarkOverlay +1280.000000 +720.000000 +false +XuiDarkOverlay + + + + +Background +1280.000000 +720.000000 +15 +false +true +XuiBackgroundPan + + + + +Logo +1280.000000 +138.000000 +0.000000,56.000000,0.000000 +MenuTitleLogo + + + + +XuiSceneHudRoot +1280.000000 +720.000000 +207 +true +XuiBlankScene + + + + +XuiSceneChatRoot +1280.000000 +720.000000 +true +XuiBlankScene + + + + +XuiSceneContainer +1280.000000 +720.000000 +207 +XuiBlankScene + + + + +Tooltips +200.000000 +40.000000 +0.000000,0.000061,0.000000 + + + +RStick +200.000000 +40.000000 +15 +false +RStick_Button +true +22532 + + + + +LStick +200.000000 +40.000000 +15 +false +LStick_Nav +true +22532 + + + + +LBButton +200.000000 +40.000000 +15 +false +LB_Button +true +22532 + + + + +RBButton +200.000000 +40.000000 +15 +false +RB_Button +true +22532 + + + + +RTrigger +200.000000 +40.000000 +15 +false +RTrigger +true +22535 + + + + +LTrigger +200.000000 +40.000000 +15 +false +LTrigger +true +22534 + + + + +YButton +200.000000 +40.000000 +15 +false +Y_Button +true +22531 + + + + +XButton +200.000000 +40.000000 +15 +false +X_Button +true +22530 + + + + +BButton +200.000000 +40.000000 +15 +false +B_Button +true +22529 + + + + +AButton +200.000000 +40.000000 +15 +false +A_Button +true +22528 + + + + + +TooltipsSmall +200.000000 +28.000000 +0.000000,0.000061,0.000000 + + + +RStick +200.000000 +28.000000 +15 +false +RStick_ButtonSmall +true +22532 + + + + +LStick +200.000000 +28.000000 +15 +false +LStick_NavSmall +true +22532 + + + + +LBButton +200.000000 +28.000000 +15 +false +LB_ButtonSmall +true +22532 + + + + +RBButton +200.000000 +28.000000 +15 +false +RB_ButtonSmall +true +22532 + + + + +RTrigger +200.000000 +28.000000 +15 +false +RTriggerSmall +true +22535 + + + + +LTrigger +200.000000 +28.000000 +15 +false +LTriggerSmall +true +22534 + + + + +YButton +200.000000 +28.000000 +15 +false +Y_ButtonSmall +true +22531 + + + + +XButton +200.000000 +28.000000 +15 +false +X_ButtonSmall +true +22530 + + + + +BButton +200.000000 +28.000000 +15 +false +B_ButtonSmall +true +22529 + + + + +AButton +200.000000 +28.000000 +15 +false +A_ButtonSmall +true +22528 + + + + + +SelectedItem +400.000000 +440.000061,36.000000,0.000000 +0.800000 +XuiLabelLight_ShadowCentred + + + + +SelectedItemSmall +400.000000 +145.000031,240.000000,0.000000 +0.800000 +XuiLabelLight_ShadowCentred + + + + +BossHealth +1000.000000 +51.000000 +140.000000,36.000000,0.000000 +false + + + +TitleText +1000.000000 +36.000000 +5 +BossHealthLabel + + + + +ProgressBar1 +334.000000 +15.000000 +333.000000,36.000000,0.000000 +BossHealthProgress1 +200 + + + + +ProgressBar2 +666.000000 +15.000000 +167.000000,36.000000,0.000000 +BossHealthProgress2 +200 + + + + +ProgressBar3 +940.000000 +15.000000 +30.000031,36.000000,0.000000 +BossHealthProgress3 +200 + + + + +ProgressBar1_small +167.000000 +15.000000 +416.000000,36.000000,0.000000 +BossHealthProgress1_480 +200 + + + + +ProgressBar2_small +333.000000 +15.000000 +333.000000,36.000000,0.000000 +BossHealthProgress2_480 +200 + + + + +ProgressBar3_small +400.000000 +15.000000 +300.000031,36.000000,0.000000 +BossHealthProgress3_480 +200 + + + + + +XuiSceneTutorialContainer +1280.000000 +720.000000 +207 +true +XuiBlankScene + + + + +XuiGamertag +290.000000 +926.000000,36.000000,0.000000 +0.800000 +XuiLabelLight_ShadowedRight + + + + + +BasePlayer0 +1280.000000 +720.000000 +15 +true +XuiBlankScene + + + +BottomLeftAnchorPoint +0.000000 +0.000000 +64.000000,648.000000,0.000000 +false +true +XuiVisualImagePresenter +false + + + + +TopLeftAnchorPoint +0.000000 +0.000000 +64.000000,36.000000,0.000000 +false +true +XuiVisualImagePresenter +false + + + + +XuiDarkOverlay +1280.000000 +720.000000 +false +XuiDarkOverlay + + + + +Background +1280.000000 +720.000000 +15 +false +true +XuiBackgroundPan + + + + +Logo +1280.000000 +138.000000 +0.000000,56.000000,0.000000 +MenuTitleLogo + + + + +XuiSceneHudRoot +1280.000000 +720.000000 +207 +true +XuiBlankScene + + + + +XuiSceneChatRoot +1280.000000 +720.000000 +true +XuiBlankScene + + + + +XuiSceneContainer +1280.000000 +720.000000 +207 +XuiBlankScene + + + + +Tooltips +200.000000 +40.000000 +0.000000,0.000061,0.000000 + + + +RStick +200.000000 +40.000000 +15 +false +RStick_Button +true +22532 + + + + +LStick +200.000000 +40.000000 +15 +false +LStick_Nav +true +22532 + + + + +LBButton +200.000000 +40.000000 +15 +false +LB_Button +true +22532 + + + + +RBButton +200.000000 +40.000000 +15 +false +RB_Button +true +22532 + + + + +RTrigger +200.000000 +40.000000 +15 +false +RTrigger +true +22535 + + + + +LTrigger +200.000000 +40.000000 +15 +false +LTrigger +true +22534 + + + + +YButton +200.000000 +40.000000 +15 +false +Y_Button +true +22531 + + + + +XButton +200.000000 +40.000000 +15 +false +X_Button +true +22530 + + + + +BButton +200.000000 +40.000000 +15 +false +B_Button +true +22529 + + + + +AButton +200.000000 +40.000000 +15 +false +A_Button +true +22528 + + + + + +TooltipsSmall +200.000000 +28.000000 +0.000000,0.000061,0.000000 + + + +RStick +200.000000 +28.000000 +15 +false +RStick_ButtonSmall +true +22532 + + + + +LStick +200.000000 +28.000000 +15 +false +LStick_NavSmall +true +22532 + + + + +LBButton +200.000000 +28.000000 +15 +false +LB_ButtonSmall +true +22532 + + + + +RBButton +200.000000 +28.000000 +15 +false +RB_ButtonSmall +true +22532 + + + + +RTrigger +200.000000 +28.000000 +15 +false +RTriggerSmall +true +22535 + + + + +LTrigger +200.000000 +28.000000 +15 +false +LTriggerSmall +true +22534 + + + + +YButton +200.000000 +28.000000 +15 +false +Y_ButtonSmall +true +22531 + + + + +XButton +200.000000 +28.000000 +15 +false +X_ButtonSmall +true +22530 + + + + +BButton +200.000000 +28.000000 +15 +false +B_ButtonSmall +true +22529 + + + + +AButton +200.000000 +28.000000 +15 +false +A_ButtonSmall +true +22528 + + + + + +SelectedItem +400.000000 +440.000061,36.000000,0.000000 +0.800000 +XuiLabelLight_ShadowCentred + + + + +SelectedItemSmall +400.000000 +145.000031,240.000000,0.000000 +0.800000 +XuiLabelLight_ShadowCentred + + + + +BossHealth +1000.000000 +51.000000 +140.000000,36.000000,0.000000 +false + + + +TitleText +1000.000000 +36.000000 +5 +BossHealthLabel + + + + +ProgressBar1 +334.000000 +15.000000 +333.000000,36.000000,0.000000 +BossHealthProgress1 +200 + + + + +ProgressBar2 +666.000000 +15.000000 +167.000000,36.000000,0.000000 +BossHealthProgress2 +200 + + + + +ProgressBar3 +940.000000 +15.000000 +30.000031,36.000000,0.000000 +BossHealthProgress3 +200 + + + + +ProgressBar1_small +167.000000 +15.000000 +416.000000,36.000000,0.000000 +BossHealthProgress1_480 +200 + + + + +ProgressBar2_small +333.000000 +15.000000 +333.000000,36.000000,0.000000 +BossHealthProgress2_480 +200 + + + + +ProgressBar3_small +400.000000 +15.000000 +300.000031,36.000000,0.000000 +BossHealthProgress3_480 +200 + + + + + +XuiSceneTutorialContainer +1280.000000 +720.000000 +207 +true +XuiBlankScene + + + + +XuiGamertag +290.000000 +926.000000,36.000000,0.000000 +0.800000 +XuiLabelLight_ShadowedRight + + + + + +XuiPressStartMessage +400.000000 +88.000000 +440.000061,316.000031,0.000000 +0.800000 +false +QuadrantJoinGame + + + + +XuiSceneDebugContainer +1280.000000 +720.000000 +207 +true +XuiBlankScene + + + + +XuiSavingIcon +48.000000 +73.000000 +1168.000000,36.000000,0.000000 +false +SaveIcon + + + + +XuiTrialTimer +1280.000000 +47.000000 +0.000000,64.000000,0.000000 +false +XuiLabelLight_ShadowCentred + + + + +SafeArea +1280.000000 +720.000000 +48 +false + + + +1280.000000 +36.000000 +0.000000,683.000000,0.000000 +0.700000 + + +0xff0f0f80 + + + + +0xffeb0f0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +1280.000000 +36.000000 +0.700000 + + +0xff0f0f80 + + + + +0xffeb0f0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +64.000000 +720.000000 +0.700000 + + +0xff0f0f80 + + + + +0xffeb0f0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +64.000000 +720.000000 +1215.000000,0.000000,0.000000 +0.700000 + + +0xff0f0f80 + + + + +0xffeb0f0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +XuiSoundXACTBack +17.000000 +11.000000 +114.000000,25.000000,0.000000 +ButtonBack +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + +XuiSoundXACTCraft +17.000000 +11.000000 +114.000000,25.000000,0.000000 +ButtonCraft +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + +XuiSoundXACTCraftFail +17.000000 +11.000000 +114.000000,25.000000,0.000000 +ButtonCraftFail +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + +XuiSoundXACTFocus +17.000000 +11.000000 +114.000000,25.000000,0.000000 +ButtonFocus +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + +XuiSoundXACTPress +17.000000 +11.000000 +114.000000,25.000000,0.000000 +ButtonPress +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + +XuiSoundXACTScroll +17.000000 +11.000000 +114.000000,25.000000,0.000000 +Scroll +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + + +Normal + + + +EndNormal + +stop + + +StartFlash + + + +EndFlash + +gotoandplay +StartFlash + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_base_480.h b/Minecraft.Client/Common/Media/xuiscene_base_480.h new file mode 100644 index 00000000..e17dce13 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_base_480.h @@ -0,0 +1,176 @@ +#define IDC_XuiDarkOverlay L"XuiDarkOverlay" +#define IDC_Background L"Background" +#define IDC_Logo L"Logo" +#define IDC_XuiSceneHudRoot L"XuiSceneHudRoot" +#define IDC_XuiSceneChatRoot L"XuiSceneChatRoot" +#define IDC_XuiSceneContainer L"XuiSceneContainer" +#define IDC_LStick L"LStick" +#define IDC_LBButton L"LBButton" +#define IDC_RBButton L"RBButton" +#define IDC_RTrigger L"RTrigger" +#define IDC_LTrigger L"LTrigger" +#define IDC_YButton L"YButton" +#define IDC_XButton L"XButton" +#define IDC_BButton L"BButton" +#define IDC_AButton L"AButton" +#define IDC_Tooltips L"Tooltips" +#define IDC_BottomLeftAnchorPoint L"BottomLeftAnchorPoint" +#define IDC_TopLeftAnchorPoint L"TopLeftAnchorPoint" +#define IDC_RStick L"RStick" +#define IDC_LStick L"LStick" +#define IDC_LBButton L"LBButton" +#define IDC_RBButton L"RBButton" +#define IDC_RTrigger L"RTrigger" +#define IDC_LTrigger L"LTrigger" +#define IDC_YButton L"YButton" +#define IDC_XButton L"XButton" +#define IDC_BButton L"BButton" +#define IDC_AButton L"AButton" +#define IDC_TooltipsSmall L"TooltipsSmall" +#define IDC_SelectedItem L"SelectedItem" +#define IDC_SelectedItemSmall L"SelectedItemSmall" +#define IDC_TitleText L"TitleText" +#define IDC_ProgressBar1 L"ProgressBar1" +#define IDC_ProgressBar2 L"ProgressBar2" +#define IDC_ProgressBar3 L"ProgressBar3" +#define IDC_ProgressBar1_small L"ProgressBar1_small" +#define IDC_ProgressBar2_small L"ProgressBar2_small" +#define IDC_ProgressBar3_small L"ProgressBar3_small" +#define IDC_BossHealth L"BossHealth" +#define IDC_XuiSceneTutorialContainer L"XuiSceneTutorialContainer" +#define IDC_BasePlayer3 L"BasePlayer3" +#define IDC_XuiDarkOverlay L"XuiDarkOverlay" +#define IDC_Background L"Background" +#define IDC_Logo L"Logo" +#define IDC_XuiSceneHudRoot L"XuiSceneHudRoot" +#define IDC_XuiSceneChatRoot L"XuiSceneChatRoot" +#define IDC_XuiSceneContainer L"XuiSceneContainer" +#define IDC_LStick L"LStick" +#define IDC_LBButton L"LBButton" +#define IDC_RBButton L"RBButton" +#define IDC_RTrigger L"RTrigger" +#define IDC_LTrigger L"LTrigger" +#define IDC_YButton L"YButton" +#define IDC_XButton L"XButton" +#define IDC_BButton L"BButton" +#define IDC_AButton L"AButton" +#define IDC_Tooltips L"Tooltips" +#define IDC_BottomLeftAnchorPoint L"BottomLeftAnchorPoint" +#define IDC_TopLeftAnchorPoint L"TopLeftAnchorPoint" +#define IDC_RStick L"RStick" +#define IDC_LStick L"LStick" +#define IDC_LBButton L"LBButton" +#define IDC_RBButton L"RBButton" +#define IDC_RTrigger L"RTrigger" +#define IDC_LTrigger L"LTrigger" +#define IDC_YButton L"YButton" +#define IDC_XButton L"XButton" +#define IDC_BButton L"BButton" +#define IDC_AButton L"AButton" +#define IDC_TooltipsSmall L"TooltipsSmall" +#define IDC_SelectedItem L"SelectedItem" +#define IDC_SelectedItemSmall L"SelectedItemSmall" +#define IDC_TitleText L"TitleText" +#define IDC_ProgressBar1 L"ProgressBar1" +#define IDC_ProgressBar2 L"ProgressBar2" +#define IDC_ProgressBar3 L"ProgressBar3" +#define IDC_ProgressBar1_small L"ProgressBar1_small" +#define IDC_ProgressBar2_small L"ProgressBar2_small" +#define IDC_ProgressBar3_small L"ProgressBar3_small" +#define IDC_BossHealth L"BossHealth" +#define IDC_XuiSceneTutorialContainer L"XuiSceneTutorialContainer" +#define IDC_BasePlayer2 L"BasePlayer2" +#define IDC_XuiDarkOverlay L"XuiDarkOverlay" +#define IDC_Background L"Background" +#define IDC_Logo L"Logo" +#define IDC_XuiSceneHudRoot L"XuiSceneHudRoot" +#define IDC_XuiSceneChatRoot L"XuiSceneChatRoot" +#define IDC_XuiSceneContainer L"XuiSceneContainer" +#define IDC_LStick L"LStick" +#define IDC_LBButton L"LBButton" +#define IDC_RBButton L"RBButton" +#define IDC_RTrigger L"RTrigger" +#define IDC_LTrigger L"LTrigger" +#define IDC_YButton L"YButton" +#define IDC_XButton L"XButton" +#define IDC_BButton L"BButton" +#define IDC_AButton L"AButton" +#define IDC_Tooltips L"Tooltips" +#define IDC_BottomLeftAnchorPoint L"BottomLeftAnchorPoint" +#define IDC_TopLeftAnchorPoint L"TopLeftAnchorPoint" +#define IDC_RStick L"RStick" +#define IDC_LStick L"LStick" +#define IDC_LBButton L"LBButton" +#define IDC_RBButton L"RBButton" +#define IDC_RTrigger L"RTrigger" +#define IDC_LTrigger L"LTrigger" +#define IDC_YButton L"YButton" +#define IDC_XButton L"XButton" +#define IDC_BButton L"BButton" +#define IDC_AButton L"AButton" +#define IDC_TooltipsSmall L"TooltipsSmall" +#define IDC_SelectedItem L"SelectedItem" +#define IDC_SelectedItemSmall L"SelectedItemSmall" +#define IDC_TitleText L"TitleText" +#define IDC_ProgressBar1 L"ProgressBar1" +#define IDC_ProgressBar2 L"ProgressBar2" +#define IDC_ProgressBar3 L"ProgressBar3" +#define IDC_ProgressBar1_small L"ProgressBar1_small" +#define IDC_ProgressBar2_small L"ProgressBar2_small" +#define IDC_ProgressBar3_small L"ProgressBar3_small" +#define IDC_BossHealth L"BossHealth" +#define IDC_XuiSceneTutorialContainer L"XuiSceneTutorialContainer" +#define IDC_BasePlayer1 L"BasePlayer1" +#define IDC_XuiDarkOverlay L"XuiDarkOverlay" +#define IDC_Background L"Background" +#define IDC_Logo L"Logo" +#define IDC_XuiSceneHudRoot L"XuiSceneHudRoot" +#define IDC_XuiSceneChatRoot L"XuiSceneChatRoot" +#define IDC_XuiSceneContainer L"XuiSceneContainer" +#define IDC_LStick L"LStick" +#define IDC_LBButton L"LBButton" +#define IDC_RBButton L"RBButton" +#define IDC_RTrigger L"RTrigger" +#define IDC_LTrigger L"LTrigger" +#define IDC_YButton L"YButton" +#define IDC_XButton L"XButton" +#define IDC_BButton L"BButton" +#define IDC_AButton L"AButton" +#define IDC_Tooltips L"Tooltips" +#define IDC_BottomLeftAnchorPoint L"BottomLeftAnchorPoint" +#define IDC_TopLeftAnchorPoint L"TopLeftAnchorPoint" +#define IDC_RStick L"RStick" +#define IDC_LStick L"LStick" +#define IDC_LBButton L"LBButton" +#define IDC_RBButton L"RBButton" +#define IDC_RTrigger L"RTrigger" +#define IDC_LTrigger L"LTrigger" +#define IDC_YButton L"YButton" +#define IDC_XButton L"XButton" +#define IDC_BButton L"BButton" +#define IDC_AButton L"AButton" +#define IDC_TooltipsSmall L"TooltipsSmall" +#define IDC_SelectedItem L"SelectedItem" +#define IDC_SelectedItemSmall L"SelectedItemSmall" +#define IDC_TitleText L"TitleText" +#define IDC_ProgressBar1 L"ProgressBar1" +#define IDC_ProgressBar2 L"ProgressBar2" +#define IDC_ProgressBar3 L"ProgressBar3" +#define IDC_ProgressBar1_small L"ProgressBar1_small" +#define IDC_ProgressBar2_small L"ProgressBar2_small" +#define IDC_ProgressBar3_small L"ProgressBar3_small" +#define IDC_BossHealth L"BossHealth" +#define IDC_XuiSceneTutorialContainer L"XuiSceneTutorialContainer" +#define IDC_BasePlayer0 L"BasePlayer0" +#define IDC_XuiPressStartMessage L"XuiPressStartMessage" +#define IDC_XuiSceneDebugContainer L"XuiSceneDebugContainer" +#define IDC_XuiSavingIcon L"XuiSavingIcon" +#define IDC_XuiTrialTimer L"XuiTrialTimer" +#define IDC_SafeArea L"SafeArea" +#define IDC_XuiSoundXACTBack L"XuiSoundXACTBack" +#define IDC_XuiSoundXACTCraft L"XuiSoundXACTCraft" +#define IDC_XuiSoundXACTCraftFail L"XuiSoundXACTCraftFail" +#define IDC_XuiSoundXACTFocus L"XuiSoundXACTFocus" +#define IDC_XuiSoundXACTPress L"XuiSoundXACTPress" +#define IDC_XuiSoundXACTScroll L"XuiSoundXACTScroll" +#define IDC_XuiBaseScene L"XuiBaseScene" diff --git a/Minecraft.Client/Common/Media/xuiscene_base_480.xui b/Minecraft.Client/Common/Media/xuiscene_base_480.xui new file mode 100644 index 00000000..6470bea4 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_base_480.xui @@ -0,0 +1,2042 @@ + + +640.000000 +480.000000 + + + +XuiBaseScene +640.000000 +480.000000 +CXuiSceneBase +XuiBlankScene +FadeIn + + + +BasePlayer3 +640.000000 +480.000000 +15 +true +XuiBlankScene + + + +XuiDarkOverlay +640.000000 +480.000000 +false +XuiDarkOverlay + + + + +Background +640.000000 +480.000000 +15 +false +true +XuiBackgroundPan480 + + + + +Logo +640.000000 +70.000000 +0.000000,48.000000,0.000000 +MenuTitleLogo + + + + +XuiSceneHudRoot +640.000000 +480.000000 +true +XuiBlankScene + + + + +XuiSceneChatRoot +640.000000 +480.000000 +true +XuiBlankScene + + + + +XuiSceneContainer +640.000000 +480.000000 +207 +XuiBlankScene + + + + +Tooltips +200.000000 +40.000000 +50.000000,424.000061,0.000000 +0.500000,0.500000,1.000000 + + + +LStick +200.000000 +40.000000 +15 +false +LStick_Nav +true +22532 + + + + +LBButton +200.000000 +40.000000 +15 +false +LB_Button +true +22532 + + + + +RBButton +200.000000 +40.000000 +15 +false +RB_Button +true +22532 + + + + +RTrigger +200.000000 +40.000000 +15 +false +RTrigger +true +22535 + + + + +LTrigger +200.000000 +40.000000 +15 +false +LTrigger +true +22534 + + + + +YButton +200.000000 +40.000000 +15 +false +Y_Button +true +22531 + + + + +XButton +200.000000 +40.000000 +15 +false +X_Button +true +22530 + + + + +BButton +200.000000 +40.000000 +15 +false +B_Button +true +22529 + + + + +AButton +200.000000 +40.000000 +15 +false +A_Button +true +22528 + + + + + +BottomLeftAnchorPoint +0.000000 +0.000000 +48.000000,444.000000,0.000000 +false +true +XuiVisualImagePresenter +false + + + + +TopLeftAnchorPoint +0.000000 +0.000000 +48.000000,36.000000,0.000000 +false +true +XuiVisualImagePresenter +false + + + + +TooltipsSmall +200.000000 +25.000000 +46.000000,420.000000,0.000000 + + + +RStick +200.000000 +28.000000 +15 +false +RStick_ButtonSmall +true +22532 + + + + +LStick +200.000000 +25.000000 +15 +false +LStick_NavSmall +true +22532 + + + + +LBButton +200.000000 +25.000000 +15 +false +LB_ButtonSmall +true +22532 + + + + +RBButton +200.000000 +25.000000 +15 +false +RB_ButtonSmall +true +22532 + + + + +RTrigger +200.000000 +25.000000 +15 +false +RTriggerSmall480 +true +22535 + + + + +LTrigger +200.000000 +25.000000 +15 +false +LTriggerSmall480 +true +22534 + + + + +YButton +200.000000 +25.000000 +15 +false +Y_ButtonSmall +true +22531 + + + + +XButton +200.000000 +25.000000 +15 +false +X_ButtonSmall +true +22530 + + + + +BButton +200.000000 +25.000000 +15 +false +B_ButtonSmall +true +22529 + + + + +AButton +200.000000 +25.000000 +15 +false +A_ButtonSmall +true +22528 + + + + + +SelectedItem +400.000000 +120.000061,36.000000,0.000000 +0.800000 +XuiLabelLight_ShadowCentred + + + + +SelectedItemSmall +400.000000 +145.000031,240.000000,0.000000 +0.800000 +XuiLabelLight_ShadowCentred + + + + +BossHealth +500.000000 +51.000000 +70.000000,36.000000,0.000000 +false + + + +TitleText +500.000000 +36.000000 +5 +BossHealthLabel + + + + +ProgressBar1 +167.000000 +15.000000 +166.000000,36.000000,0.000000 +BossHealthProgress1_480 +200 + + + + +ProgressBar2 +333.000000 +15.000000 +83.000000,36.000000,0.000000 +BossHealthProgress2_480 +200 + + + + +ProgressBar3 +400.000000 +15.000000 +50.000000,36.000000,0.000000 +BossHealthProgress3_480 +200 + + + + +ProgressBar1_small +167.000000 +15.000000 +166.000031,36.000000,0.000000 +false +BossHealthProgress1_480 +200 + + + + +ProgressBar2_small +333.000000 +15.000000 +83.000031,36.000000,0.000000 +false +BossHealthProgress2_480 +200 + + + + +ProgressBar3_small +400.000000 +15.000000 +50.000061,36.000000,0.000000 +false +BossHealthProgress3_480 +200 + + + + + +XuiSceneTutorialContainer +640.000000 +480.000000 +207 +true +XuiBlankScene + + + + + +BasePlayer2 +640.000000 +480.000000 +15 +true +XuiBlankScene + + + +XuiDarkOverlay +640.000000 +480.000000 +false +XuiDarkOverlay + + + + +Background +640.000000 +480.000000 +15 +false +true +XuiBackgroundPan480 + + + + +Logo +640.000000 +70.000000 +0.000000,48.000000,0.000000 +MenuTitleLogo + + + + +XuiSceneHudRoot +640.000000 +480.000000 +true +XuiBlankScene + + + + +XuiSceneChatRoot +640.000000 +480.000000 +true +XuiBlankScene + + + + +XuiSceneContainer +640.000000 +480.000000 +207 +XuiBlankScene + + + + +Tooltips +200.000000 +40.000000 +50.000000,424.000061,0.000000 +0.500000,0.500000,1.000000 + + + +LStick +200.000000 +40.000000 +15 +false +LStick_Nav +true +22532 + + + + +LBButton +200.000000 +40.000000 +15 +false +LB_Button +true +22532 + + + + +RBButton +200.000000 +40.000000 +15 +false +RB_Button +true +22532 + + + + +RTrigger +200.000000 +40.000000 +15 +false +RTrigger +true +22535 + + + + +LTrigger +200.000000 +40.000000 +15 +false +LTrigger +true +22534 + + + + +YButton +200.000000 +40.000000 +15 +false +Y_Button +true +22531 + + + + +XButton +200.000000 +40.000000 +15 +false +X_Button +true +22530 + + + + +BButton +200.000000 +40.000000 +15 +false +B_Button +true +22529 + + + + +AButton +200.000000 +40.000000 +15 +false +A_Button +true +22528 + + + + + +BottomLeftAnchorPoint +0.000000 +0.000000 +48.000000,444.000000,0.000000 +false +true +XuiVisualImagePresenter +false + + + + +TopLeftAnchorPoint +0.000000 +0.000000 +48.000000,36.000000,0.000000 +false +true +XuiVisualImagePresenter +false + + + + +TooltipsSmall +200.000000 +25.000000 +46.000000,420.000000,0.000000 + + + +RStick +200.000000 +28.000000 +15 +false +RStick_ButtonSmall +true +22532 + + + + +LStick +200.000000 +25.000000 +15 +false +LStick_NavSmall +true +22532 + + + + +LBButton +200.000000 +25.000000 +15 +false +LB_ButtonSmall +true +22532 + + + + +RBButton +200.000000 +25.000000 +15 +false +RB_ButtonSmall +true +22532 + + + + +RTrigger +200.000000 +25.000000 +15 +false +RTriggerSmall480 +true +22535 + + + + +LTrigger +200.000000 +25.000000 +15 +false +LTriggerSmall480 +true +22534 + + + + +YButton +200.000000 +25.000000 +15 +false +Y_ButtonSmall +true +22531 + + + + +XButton +200.000000 +25.000000 +15 +false +X_ButtonSmall +true +22530 + + + + +BButton +200.000000 +25.000000 +15 +false +B_ButtonSmall +true +22529 + + + + +AButton +200.000000 +25.000000 +15 +false +A_ButtonSmall +true +22528 + + + + + +SelectedItem +400.000000 +120.000061,36.000000,0.000000 +0.800000 +XuiLabelLight_ShadowCentred + + + + +SelectedItemSmall +400.000000 +145.000031,240.000000,0.000000 +0.800000 +XuiLabelLight_ShadowCentred + + + + +BossHealth +500.000000 +51.000000 +70.000000,36.000000,0.000000 +false + + + +TitleText +500.000000 +36.000000 +5 +BossHealthLabel + + + + +ProgressBar1 +167.000000 +15.000000 +166.000000,36.000000,0.000000 +BossHealthProgress1_480 +200 + + + + +ProgressBar2 +333.000000 +15.000000 +83.000000,36.000000,0.000000 +BossHealthProgress2_480 +200 + + + + +ProgressBar3 +400.000000 +15.000000 +50.000000,36.000000,0.000000 +BossHealthProgress3_480 +200 + + + + +ProgressBar1_small +167.000000 +15.000000 +166.000031,36.000000,0.000000 +false +BossHealthProgress1_480 +200 + + + + +ProgressBar2_small +333.000000 +15.000000 +83.000031,36.000000,0.000000 +false +BossHealthProgress2_480 +200 + + + + +ProgressBar3_small +400.000000 +15.000000 +50.000061,36.000000,0.000000 +false +BossHealthProgress3_480 +200 + + + + + +XuiSceneTutorialContainer +640.000000 +480.000000 +207 +true +XuiBlankScene + + + + + +BasePlayer1 +640.000000 +480.000000 +15 +true +XuiBlankScene + + + +XuiDarkOverlay +640.000000 +480.000000 +false +XuiDarkOverlay + + + + +Background +640.000000 +480.000000 +15 +false +true +XuiBackgroundPan480 + + + + +Logo +640.000000 +70.000000 +0.000000,48.000000,0.000000 +MenuTitleLogo + + + + +XuiSceneHudRoot +640.000000 +480.000000 +true +XuiBlankScene + + + + +XuiSceneChatRoot +640.000000 +480.000000 +true +XuiBlankScene + + + + +XuiSceneContainer +640.000000 +480.000000 +207 +XuiBlankScene + + + + +Tooltips +200.000000 +40.000000 +50.000000,424.000061,0.000000 +0.500000,0.500000,1.000000 + + + +LStick +200.000000 +40.000000 +15 +false +LStick_Nav +true +22532 + + + + +LBButton +200.000000 +40.000000 +15 +false +LB_Button +true +22532 + + + + +RBButton +200.000000 +40.000000 +15 +false +RB_Button +true +22532 + + + + +RTrigger +200.000000 +40.000000 +15 +false +RTrigger +true +22535 + + + + +LTrigger +200.000000 +40.000000 +15 +false +LTrigger +true +22534 + + + + +YButton +200.000000 +40.000000 +15 +false +Y_Button +true +22531 + + + + +XButton +200.000000 +40.000000 +15 +false +X_Button +true +22530 + + + + +BButton +200.000000 +40.000000 +15 +false +B_Button +true +22529 + + + + +AButton +200.000000 +40.000000 +15 +false +A_Button +true +22528 + + + + + +BottomLeftAnchorPoint +0.000000 +0.000000 +48.000000,444.000000,0.000000 +false +true +XuiVisualImagePresenter +false + + + + +TopLeftAnchorPoint +0.000000 +0.000000 +48.000000,36.000000,0.000000 +false +true +XuiVisualImagePresenter +false + + + + +TooltipsSmall +200.000000 +25.000000 +46.000000,420.000000,0.000000 + + + +RStick +200.000000 +28.000000 +15 +false +RStick_ButtonSmall +true +22532 + + + + +LStick +200.000000 +25.000000 +15 +false +LStick_NavSmall +true +22532 + + + + +LBButton +200.000000 +25.000000 +15 +false +LB_ButtonSmall +true +22532 + + + + +RBButton +200.000000 +25.000000 +15 +false +RB_ButtonSmall +true +22532 + + + + +RTrigger +200.000000 +25.000000 +15 +false +RTriggerSmall480 +true +22535 + + + + +LTrigger +200.000000 +25.000000 +15 +false +LTriggerSmall480 +true +22534 + + + + +YButton +200.000000 +25.000000 +15 +false +Y_ButtonSmall +true +22531 + + + + +XButton +200.000000 +25.000000 +15 +false +X_ButtonSmall +true +22530 + + + + +BButton +200.000000 +25.000000 +15 +false +B_ButtonSmall +true +22529 + + + + +AButton +200.000000 +25.000000 +15 +false +A_ButtonSmall +true +22528 + + + + + +SelectedItem +400.000000 +120.000061,36.000000,0.000000 +0.800000 +XuiLabelLight_ShadowCentred + + + + +SelectedItemSmall +400.000000 +145.000031,240.000000,0.000000 +0.800000 +XuiLabelLight_ShadowCentred + + + + +BossHealth +500.000000 +51.000000 +70.000000,36.000000,0.000000 +false + + + +TitleText +500.000000 +36.000000 +5 +BossHealthLabel + + + + +ProgressBar1 +167.000000 +15.000000 +166.000000,36.000000,0.000000 +BossHealthProgress1_480 +200 + + + + +ProgressBar2 +333.000000 +15.000000 +83.000000,36.000000,0.000000 +BossHealthProgress2_480 +200 + + + + +ProgressBar3 +400.000000 +15.000000 +50.000000,36.000000,0.000000 +BossHealthProgress3_480 +200 + + + + +ProgressBar1_small +167.000000 +15.000000 +166.000031,36.000000,0.000000 +false +BossHealthProgress1_480 +200 + + + + +ProgressBar2_small +333.000000 +15.000000 +83.000031,36.000000,0.000000 +false +BossHealthProgress2_480 +200 + + + + +ProgressBar3_small +400.000000 +15.000000 +50.000061,36.000000,0.000000 +false +BossHealthProgress3_480 +200 + + + + + +XuiSceneTutorialContainer +640.000000 +480.000000 +207 +true +XuiBlankScene + + + + + +BasePlayer0 +640.000000 +480.000000 +15 +true +XuiBlankScene + + + +XuiDarkOverlay +640.000000 +480.000000 +false +XuiDarkOverlay + + + + +Background +640.000000 +480.000000 +15 +false +true +XuiBackgroundPan480 + + + + +Logo +640.000000 +70.000000 +0.000000,48.000000,0.000000 +MenuTitleLogo + + + + +XuiSceneHudRoot +640.000000 +480.000000 +true +XuiBlankScene + + + + +XuiSceneChatRoot +640.000000 +480.000000 +true +XuiBlankScene + + + + +XuiSceneContainer +640.000000 +480.000000 +207 +XuiBlankScene + + + + +Tooltips +200.000000 +40.000000 +50.000000,424.000061,0.000000 +0.500000,0.500000,1.000000 + + + +LStick +200.000000 +40.000000 +15 +false +LStick_Nav +true +22532 + + + + +LBButton +200.000000 +40.000000 +15 +false +LB_Button +true +22532 + + + + +RBButton +200.000000 +40.000000 +15 +false +RB_Button +true +22532 + + + + +RTrigger +200.000000 +40.000000 +15 +false +RTrigger +true +22535 + + + + +LTrigger +200.000000 +40.000000 +15 +false +LTrigger +true +22534 + + + + +YButton +200.000000 +40.000000 +15 +false +Y_Button +true +22531 + + + + +XButton +200.000000 +40.000000 +15 +false +X_Button +true +22530 + + + + +BButton +200.000000 +40.000000 +15 +false +B_Button +true +22529 + + + + +AButton +200.000000 +40.000000 +15 +false +A_Button +true +22528 + + + + + +BottomLeftAnchorPoint +0.000000 +0.000000 +48.000000,444.000000,0.000000 +false +true +XuiVisualImagePresenter +false + + + + +TopLeftAnchorPoint +0.000000 +0.000000 +48.000000,36.000000,0.000000 +false +true +XuiVisualImagePresenter +false + + + + +TooltipsSmall +200.000000 +25.000000 +46.000000,420.000000,0.000000 + + + +RStick +200.000000 +28.000000 +15 +false +RStick_ButtonSmall +true +22532 + + + + +LStick +200.000000 +25.000000 +15 +false +LStick_NavSmall +true +22532 + + + + +LBButton +200.000000 +25.000000 +15 +false +LB_ButtonSmall +true +22532 + + + + +RBButton +200.000000 +25.000000 +15 +false +RB_ButtonSmall +true +22532 + + + + +RTrigger +200.000000 +25.000000 +15 +false +RTriggerSmall480 +true +22535 + + + + +LTrigger +200.000000 +25.000000 +15 +false +LTriggerSmall480 +true +22534 + + + + +YButton +200.000000 +25.000000 +15 +false +Y_ButtonSmall +true +22531 + + + + +XButton +200.000000 +25.000000 +15 +false +X_ButtonSmall +true +22530 + + + + +BButton +200.000000 +25.000000 +15 +false +B_ButtonSmall +true +22529 + + + + +AButton +200.000000 +25.000000 +15 +false +A_ButtonSmall +true +22528 + + + + + +SelectedItem +400.000000 +120.000061,36.000000,0.000000 +0.800000 +XuiLabelLight_ShadowCentred + + + + +SelectedItemSmall +400.000000 +145.000031,240.000000,0.000000 +0.800000 +XuiLabelLight_ShadowCentred + + + + +BossHealth +500.000000 +51.000000 +70.000000,36.000000,0.000000 +false + + + +TitleText +500.000000 +36.000000 +5 +BossHealthLabel + + + + +ProgressBar1 +167.000000 +15.000000 +166.000000,36.000000,0.000000 +BossHealthProgress1_480 +200 + + + + +ProgressBar2 +333.000000 +15.000000 +83.000000,36.000000,0.000000 +BossHealthProgress2_480 +200 + + + + +ProgressBar3 +400.000000 +15.000000 +50.000000,36.000000,0.000000 +BossHealthProgress3_480 +200 + + + + +ProgressBar1_small +167.000000 +15.000000 +166.000031,36.000000,0.000000 +false +BossHealthProgress1_480 +200 + + + + +ProgressBar2_small +333.000000 +15.000000 +83.000031,36.000000,0.000000 +false +BossHealthProgress2_480 +200 + + + + +ProgressBar3_small +400.000000 +15.000000 +50.000061,36.000000,0.000000 +false +BossHealthProgress3_480 +200 + + + + + +XuiSceneTutorialContainer +640.000000 +480.000000 +207 +true +XuiBlankScene + + + + + +XuiPressStartMessage +400.000000 +88.000000 +120.000046,196.000015,0.000000 +0.800000 +false +QuadrantJoinGame + + + + +XuiSceneDebugContainer +640.000000 +480.000000 +207 +true +XuiBlankScene + + + + +XuiSavingIcon +48.000000 +73.000000 +560.000000,36.000000,0.000000 +0.600000,0.600000,1.000000 +false +SaveIcon + + + + +XuiTrialTimer +640.000000 +47.000000 +0.000000,130.000000,0.000000 +false +XuiLabelLight_C_ShadowedSmall + + + + +SafeArea +640.000000 +360.000000 +false + + + +640.000000 +36.000000 +0.000000,444.000000,0.000000 +0.700000 + + +0xff0f0f80 + + + + +0xffeb0f0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +640.000000 +36.000000 +0.700000 +192 + + +0xff0f0f80 + + + + +0xffeb0f0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +48.000000 +480.000000 +0.700000 + + +0xff0f0f80 + + + + +0xffeb0f0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +48.000000 +480.000000 +592.000000,0.000000,0.000000 +0.700000 + + +0xff0f0f80 + + + + +0xffeb0f0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +XuiSoundXACTBack +17.000000 +11.000000 +114.000000,25.000000,0.000000 +ButtonBack +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + +XuiSoundXACTCraft +17.000000 +11.000000 +114.000000,25.000000,0.000000 +ButtonCraft +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + +XuiSoundXACTCraftFail +17.000000 +11.000000 +114.000000,25.000000,0.000000 +ButtonCraftFail +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + +XuiSoundXACTFocus +17.000000 +11.000000 +114.000000,25.000000,0.000000 +ButtonFocus +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + +XuiSoundXACTPress +17.000000 +11.000000 +114.000000,25.000000,0.000000 +ButtonPress +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + +XuiSoundXACTScroll +17.000000 +11.000000 +114.000000,25.000000,0.000000 +Scroll +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + + +Normal + + + +EndNormal + +stop + + +StartFlash + + + +EndFlash + +gotoandplay +StartFlash + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_base_small.h b/Minecraft.Client/Common/Media/xuiscene_base_small.h new file mode 100644 index 00000000..340ae31b --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_base_small.h @@ -0,0 +1,80 @@ +#define IDC_XuiDarkOverlay L"XuiDarkOverlay" +#define IDC_Background L"Background" +#define IDC_Logo L"Logo" +#define IDC_XuiSceneContainer L"XuiSceneContainer" +#define IDC_XuiSceneTutorialContainer L"XuiSceneTutorialContainer" +#define IDC_LBButton L"LBButton" +#define IDC_RBButton L"RBButton" +#define IDC_RTrigger L"RTrigger" +#define IDC_LTrigger L"LTrigger" +#define IDC_YButton L"YButton" +#define IDC_XButton L"XButton" +#define IDC_BButton L"BButton" +#define IDC_AButton L"AButton" +#define IDC_Tooltips L"Tooltips" +#define IDC_BottomLeftAnchorPoint L"BottomLeftAnchorPoint" +#define IDC_TopLeftAnchorPoint L"TopLeftAnchorPoint" +#define IDC_BasePlayer3 L"BasePlayer3" +#define IDC_XuiDarkOverlay L"XuiDarkOverlay" +#define IDC_Background L"Background" +#define IDC_Logo L"Logo" +#define IDC_XuiSceneContainer L"XuiSceneContainer" +#define IDC_XuiSceneTutorialContainer L"XuiSceneTutorialContainer" +#define IDC_LBButton L"LBButton" +#define IDC_RBButton L"RBButton" +#define IDC_RTrigger L"RTrigger" +#define IDC_LTrigger L"LTrigger" +#define IDC_YButton L"YButton" +#define IDC_XButton L"XButton" +#define IDC_BButton L"BButton" +#define IDC_AButton L"AButton" +#define IDC_Tooltips L"Tooltips" +#define IDC_BottomLeftAnchorPoint L"BottomLeftAnchorPoint" +#define IDC_TopLeftAnchorPoint L"TopLeftAnchorPoint" +#define IDC_BasePlayer2 L"BasePlayer2" +#define IDC_XuiDarkOverlay L"XuiDarkOverlay" +#define IDC_Background L"Background" +#define IDC_Logo L"Logo" +#define IDC_XuiSceneContainer L"XuiSceneContainer" +#define IDC_XuiSceneTutorialContainer L"XuiSceneTutorialContainer" +#define IDC_LBButton L"LBButton" +#define IDC_RBButton L"RBButton" +#define IDC_RTrigger L"RTrigger" +#define IDC_LTrigger L"LTrigger" +#define IDC_YButton L"YButton" +#define IDC_XButton L"XButton" +#define IDC_BButton L"BButton" +#define IDC_AButton L"AButton" +#define IDC_Tooltips L"Tooltips" +#define IDC_BottomLeftAnchorPoint L"BottomLeftAnchorPoint" +#define IDC_TopLeftAnchorPoint L"TopLeftAnchorPoint" +#define IDC_BasePlayer1 L"BasePlayer1" +#define IDC_XuiDarkOverlay L"XuiDarkOverlay" +#define IDC_Background L"Background" +#define IDC_Logo L"Logo" +#define IDC_XuiSceneContainer L"XuiSceneContainer" +#define IDC_XuiSceneTutorialContainer L"XuiSceneTutorialContainer" +#define IDC_LBButton L"LBButton" +#define IDC_RBButton L"RBButton" +#define IDC_RTrigger L"RTrigger" +#define IDC_LTrigger L"LTrigger" +#define IDC_YButton L"YButton" +#define IDC_XButton L"XButton" +#define IDC_BButton L"BButton" +#define IDC_AButton L"AButton" +#define IDC_Tooltips L"Tooltips" +#define IDC_BottomLeftAnchorPoint L"BottomLeftAnchorPoint" +#define IDC_TopLeftAnchorPoint L"TopLeftAnchorPoint" +#define IDC_BasePlayer0 L"BasePlayer0" +#define IDC_XuiPressStartMessage L"XuiPressStartMessage" +#define IDC_XuiSceneDebugContainer L"XuiSceneDebugContainer" +#define IDC_XuiSavingIcon L"XuiSavingIcon" +#define IDC_XuiTrialTimer L"XuiTrialTimer" +#define IDC_SafeArea L"SafeArea" +#define IDC_XuiSoundXACTBack L"XuiSoundXACTBack" +#define IDC_XuiSoundXACTCraft L"XuiSoundXACTCraft" +#define IDC_XuiSoundXACTCraftFail L"XuiSoundXACTCraftFail" +#define IDC_XuiSoundXACTFocus L"XuiSoundXACTFocus" +#define IDC_XuiSoundXACTPress L"XuiSoundXACTPress" +#define IDC_XuiSoundXACTScroll L"XuiSoundXACTScroll" +#define IDC_XuiBaseScene L"XuiBaseScene" diff --git a/Minecraft.Client/Common/Media/xuiscene_base_small.xui b/Minecraft.Client/Common/Media/xuiscene_base_small.xui new file mode 100644 index 00000000..a0c56105 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_base_small.xui @@ -0,0 +1,1021 @@ + + +640.000000 +360.000000 + + + +XuiBaseScene +640.000000 +360.000000 +CXuiSceneBase +XuiBlankScene +FadeIn + + + +BasePlayer3 +640.000000 +360.000000 +15 +true +CScene_BasePlayer +XuiBlankScene + + + +XuiDarkOverlay +640.000000 +360.000000 +false +XuiDarkOverlay + + + + +Background +640.000000 +360.000000 +15 +false +true +XuiBackgroundPan + + + + +Logo +640.000000 +70.000000 +0.000000,36.000000,0.000000 +16 +MenuTitle.png +48 + + + + +XuiSceneContainer +640.000000 +360.000000 +207 +XuiBlankScene + + + + +XuiSceneTutorialContainer +640.000000 +360.000000 +207 +XuiBlankScene + + + + +Tooltips +200.000000 +40.000000 +0.000000,0.000061,0.000000 +0.500000,0.500000,1.000000 + + + +LBButton +200.000000 +40.000000 +15 +false +LB_Button +true +22532 + + + + +RBButton +200.000000 +40.000000 +15 +false +RB_Button +true +22532 + + + + +RTrigger +200.000000 +40.000000 +15 +false +RTrigger +true +22535 + + + + +LTrigger +200.000000 +40.000000 +15 +false +LTrigger +true +22534 + + + + +YButton +200.000000 +40.000000 +15 +false +Y_Button +true +22531 + + + + +XButton +200.000000 +40.000000 +15 +false +X_Button +true +22530 + + + + +BButton +200.000000 +40.000000 +15 +false +B_Button +true +22529 + + + + +AButton +200.000000 +40.000000 +15 +false +A_Button +true +22528 + + + + + +BottomLeftAnchorPoint +0.000000 +0.000000 +40.000000,325.000000,0.000000 +false +true +XuiVisualImagePresenter +false + + + + +TopLeftAnchorPoint +0.000000 +0.000000 +40.000000,36.000000,0.000000 +false +true +XuiVisualImagePresenter +false + + + + + +BasePlayer2 +640.000000 +360.000000 +15 +true +CScene_BasePlayer +XuiBlankScene + + + +XuiDarkOverlay +640.000000 +360.000000 +false +XuiDarkOverlay + + + + +Background +640.000000 +360.000000 +15 +false +true +XuiBackgroundPan + + + + +Logo +640.000000 +70.000000 +0.000000,36.000000,0.000000 +16 +MenuTitle.png +48 + + + + +XuiSceneContainer +640.000000 +360.000000 +207 +XuiBlankScene + + + + +XuiSceneTutorialContainer +640.000000 +360.000000 +207 +XuiBlankScene + + + + +Tooltips +200.000000 +40.000000 +0.000000,0.000061,0.000000 +0.500000,0.500000,1.000000 + + + +LBButton +200.000000 +40.000000 +15 +false +LB_Button +true +22532 + + + + +RBButton +200.000000 +40.000000 +15 +false +RB_Button +true +22532 + + + + +RTrigger +200.000000 +40.000000 +15 +false +RTrigger +true +22535 + + + + +LTrigger +200.000000 +40.000000 +15 +false +LTrigger +true +22534 + + + + +YButton +200.000000 +40.000000 +15 +false +Y_Button +true +22531 + + + + +XButton +200.000000 +40.000000 +15 +false +X_Button +true +22530 + + + + +BButton +200.000000 +40.000000 +15 +false +B_Button +true +22529 + + + + +AButton +200.000000 +40.000000 +15 +false +A_Button +true +22528 + + + + + +BottomLeftAnchorPoint +0.000000 +0.000000 +40.000000,325.000000,0.000000 +false +true +XuiVisualImagePresenter +false + + + + +TopLeftAnchorPoint +0.000000 +0.000000 +40.000000,36.000000,0.000000 +false +true +XuiVisualImagePresenter +false + + + + + +BasePlayer1 +640.000000 +360.000000 +15 +true +CScene_BasePlayer +XuiBlankScene + + + +XuiDarkOverlay +640.000000 +360.000000 +false +XuiDarkOverlay + + + + +Background +640.000000 +360.000000 +15 +false +true +XuiBackgroundPan + + + + +Logo +640.000000 +70.000000 +0.000000,36.000000,0.000000 +16 +MenuTitle.png +48 + + + + +XuiSceneContainer +640.000000 +360.000000 +207 +XuiBlankScene + + + + +XuiSceneTutorialContainer +640.000000 +360.000000 +207 +XuiBlankScene + + + + +Tooltips +200.000000 +40.000000 +0.000000,0.000061,0.000000 +0.500000,0.500000,1.000000 + + + +LBButton +200.000000 +40.000000 +15 +false +LB_Button +true +22532 + + + + +RBButton +200.000000 +40.000000 +15 +false +RB_Button +true +22532 + + + + +RTrigger +200.000000 +40.000000 +15 +false +RTrigger +true +22535 + + + + +LTrigger +200.000000 +40.000000 +15 +false +LTrigger +true +22534 + + + + +YButton +200.000000 +40.000000 +15 +false +Y_Button +true +22531 + + + + +XButton +200.000000 +40.000000 +15 +false +X_Button +true +22530 + + + + +BButton +200.000000 +40.000000 +15 +false +B_Button +true +22529 + + + + +AButton +200.000000 +40.000000 +15 +false +A_Button +true +22528 + + + + + +BottomLeftAnchorPoint +0.000000 +0.000000 +40.000000,325.000000,0.000000 +false +true +XuiVisualImagePresenter +false + + + + +TopLeftAnchorPoint +0.000000 +0.000000 +40.000000,36.000000,0.000000 +false +true +XuiVisualImagePresenter +false + + + + + +BasePlayer0 +640.000000 +360.000000 +15 +true +CScene_BasePlayer +XuiBlankScene + + + +XuiDarkOverlay +640.000000 +360.000000 +false +XuiDarkOverlay + + + + +Background +640.000000 +360.000000 +15 +false +true +XuiBackgroundPan + + + + +Logo +640.000000 +70.000000 +0.000000,36.000000,0.000000 +16 +MenuTitle.png +48 + + + + +XuiSceneContainer +640.000000 +360.000000 +207 +XuiBlankScene + + + + +XuiSceneTutorialContainer +640.000000 +360.000000 +207 +XuiBlankScene + + + + +Tooltips +200.000000 +40.000000 +0.000000,0.000061,0.000000 +0.500000,0.500000,1.000000 + + + +LBButton +200.000000 +40.000000 +15 +false +LB_Button +true +22532 + + + + +RBButton +200.000000 +40.000000 +15 +false +RB_Button +true +22532 + + + + +RTrigger +200.000000 +40.000000 +15 +false +RTrigger +true +22535 + + + + +LTrigger +200.000000 +40.000000 +15 +false +LTrigger +true +22534 + + + + +YButton +200.000000 +40.000000 +15 +false +Y_Button +true +22531 + + + + +XButton +200.000000 +40.000000 +15 +false +X_Button +true +22530 + + + + +BButton +200.000000 +40.000000 +15 +false +B_Button +true +22529 + + + + +AButton +200.000000 +40.000000 +15 +false +A_Button +true +22528 + + + + + +BottomLeftAnchorPoint +0.000000 +0.000000 +40.000000,325.000000,0.000000 +false +true +XuiVisualImagePresenter +false + + + + +TopLeftAnchorPoint +0.000000 +0.000000 +40.000000,36.000000,0.000000 +false +true +XuiVisualImagePresenter +false + + + + + +XuiPressStartMessage +400.000000 +88.000000 +120.000046,136.000015,0.000000 +0.800000 +false +QuadrantJoinGame + + + + +XuiSceneDebugContainer +640.000000 +360.000000 +207 +true +XuiBlankScene + + + + +XuiSavingIcon +48.000000 +73.000000 +552.000000,35.000000,0.000000 +false +SaveIcon + + + + +XuiTrialTimer +640.000000 +47.000000 +0.000000,64.000000,0.000000 +false +XuiLabelLight_C_ShadowedSmall + + + + +SafeArea +640.000000 +360.000000 +false + + + +640.000000 +35.000000 +0.000000,325.000000,0.000000 +0.700000 + + +0xff0f0f80 + + + + +0xffeb0f0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +640.000000 +35.000000 +0.700000 +192 + + +0xff0f0f80 + + + + +0xffeb0f0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +40.000000 +360.000000 +0.700000 + + +0xff0f0f80 + + + + +0xffeb0f0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +40.000000 +360.000000 +600.000000,0.000000,0.000000 +0.700000 + + +0xff0f0f80 + + + + +0xffeb0f0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +XuiSoundXACTBack +17.000000 +11.000000 +114.000000,25.000000,0.000000 +ButtonBack +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + +XuiSoundXACTCraft +17.000000 +11.000000 +114.000000,25.000000,0.000000 +ButtonCraft +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + +XuiSoundXACTCraftFail +17.000000 +11.000000 +114.000000,25.000000,0.000000 +ButtonCraftFail +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + +XuiSoundXACTFocus +17.000000 +11.000000 +114.000000,25.000000,0.000000 +ButtonFocus +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + +XuiSoundXACTPress +17.000000 +11.000000 +114.000000,25.000000,0.000000 +ButtonPress +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + +XuiSoundXACTScroll +17.000000 +11.000000 +114.000000,25.000000,0.000000 +Scroll +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + + +Normal + + + +EndNormal + +stop + + +StartFlash + + + +EndFlash + +gotoandplay +StartFlash + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_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_brewingstand.h b/Minecraft.Client/Common/Media/xuiscene_brewingstand.h new file mode 100644 index 00000000..64dca590 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_brewingstand.h @@ -0,0 +1,204 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Inventory L"Inventory" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_UseRow L"UseRow" +#define IDC_InventoryText L"InventoryText" +#define IDC_BrewingStandText L"BrewingStandText" +#define IDC_BrewingStand L"BrewingStand" +#define IDC_Progress L"Progress" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Ingredient L"Ingredient" +#define IDC_Bubbles L"Bubbles" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Bottle1 L"Bottle1" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Bottle2 L"Bottle2" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Bottle3 L"Bottle3" +#define IDC_Pointer L"Pointer" +#define IDC_Group L"Group" +#define IDC_XuiSceneBrewingStand L"XuiSceneBrewingStand" diff --git a/Minecraft.Client/Common/Media/xuiscene_brewingstand.xui b/Minecraft.Client/Common/Media/xuiscene_brewingstand.xui new file mode 100644 index 00000000..da3d8491 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_brewingstand.xui @@ -0,0 +1,2899 @@ + + +1280.000000 +720.000000 + + + +XuiSceneBrewingStand +1280.000000 +720.000000 +CXuiSceneBrewingStand +XuiBlankScene +Pointer + + + +Group +428.000000 +450.000000 +426.000000,95.000000,0.000000 +15 +XuiScene +Pointer + + + +Inventory +382.000000 +150.000000 +25.000000,240.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + + +UseRow +381.000000 +50.000000 +25.000000,379.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + + +InventoryText +378.000000 +34.000000 +24.000000,210.000000,0.000000 +12 +LabelContainerSceneLeft + + + + +BrewingStandText +380.000000 +34.000000 +24.000000,12.000000,0.000000 +LabelContainerSceneCentre + + + + +BrewingStand +192.000000 +172.000000 +117.000000,42.000000,0.000000 +BrewingBackground + + + + +Progress +27.000000 +84.000000 +244.000000,44.000000,0.000000 +CXuiCtrlBrewProgress +BrewingArrowProgressState +600 + + + + +Ingredient +54.000000 +54.000000 +187.000015,45.000015,0.000000 +3 +CXuiCtrlSlotList +ItemGridBrewing + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + + +Bubbles +36.000000 +84.000000 +148.000061,44.000015,0.000000 +CXuiCtrlBubblesProgress +BrewingBubblesProgressState +30 + + + + +Bottle1 +54.000000 +54.000000 +118.000053,132.000000,0.000000 +3 +CXuiCtrlSlotList +ItemGridBrewing + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + + +Bottle2 +54.000000 +54.000000 +187.000000,153.000000,0.000000 +3 +CXuiCtrlSlotList +ItemGridBrewing + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + + +Bottle3 +54.000000 +54.000000 +256.000000,132.000000,0.000000 +3 +CXuiCtrlSlotList +ItemGridBrewing + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + + +Pointer +42.000000 +42.000000 +-185.000000,-63.000015,0.000000 +9 +false +CXuiCtrlSlotItem +ItemPointer + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +426.000000,95.000000,0.000000 + + + +0 +426.000000,95.000000,0.000000 + + + +2 +100 +-100 +50 +424.500031,95.000000,0.000000 + + + +0 +160.000000,95.000000,0.000000 + + + +2 +100 +-100 +50 +160.000000,95.000000,0.000000 + + + +0 +426.000000,95.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_brewingstand_480.h b/Minecraft.Client/Common/Media/xuiscene_brewingstand_480.h new file mode 100644 index 00000000..a6bd3341 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_brewingstand_480.h @@ -0,0 +1,232 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Inventory L"Inventory" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_UseRow L"UseRow" +#define IDC_InventoryText L"InventoryText" +#define IDC_BrewingStandText L"BrewingStandText" +#define IDC_BrewingStand L"BrewingStand" +#define IDC_Progress L"Progress" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Ingredient L"Ingredient" +#define IDC_Bubbles L"Bubbles" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Bottle1 L"Bottle1" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Bottle2 L"Bottle2" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Bottle3 L"Bottle3" +#define IDC_Pointer L"Pointer" +#define IDC_Group L"Group" +#define IDC_XuiSceneBrewingStand L"XuiSceneBrewingStand" diff --git a/Minecraft.Client/Common/Media/xuiscene_brewingstand_480.xui b/Minecraft.Client/Common/Media/xuiscene_brewingstand_480.xui new file mode 100644 index 00000000..6bea0597 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_brewingstand_480.xui @@ -0,0 +1,3144 @@ + + +640.000000 +480.000000 + + + +XuiSceneBrewingStand +640.000000 +480.000000 +CXuiSceneBrewingStand +XuiBlankScene +Pointer + + + +Group +260.000000 +290.000000 +190.000000,96.000000,0.000000 +15 +GraphicPanel +Pointer + + + +Inventory +234.000000 +78.000000 +13.000000,162.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical26 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +UseRow +234.000000 +13.000000,250.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical26 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +InventoryText +234.000000 +25.000000 +12.000000,140.000000,0.000000 +9 +LabelContainerSceneLeftSmall + + + + +BrewingStandText +229.000000 +26.000000 +15.500000,7.000000,0.000000 +LabelContainerSceneCentreSmall + + + + +BrewingStand +128.000000 +108.000000 +66.000000,30.000000,0.000000 +BrewingBackground_Small + + + + +Progress +18.000000 +56.000000 +151.000000,29.000000,0.000000 +CXuiCtrlBrewProgress +BrewingArrowProgressStateSmall +600 + + + + +Ingredient +36.000000 +36.000000 +112.000000,30.000000,0.000000 +3 +CXuiCtrlSlotList +ItemGridBrewing36 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + + +Bubbles +24.000000 +56.000000 +84.000061,29.000015,0.000000 +CXuiCtrlBubblesProgress +BrewingBubblesProgressStateSmall +30 + + + + +Bottle1 +36.000000 +36.000000 +66.000000,88.000000,0.000000 +3 +CXuiCtrlSlotList +ItemGridBrewing36 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + + +Bottle2 +36.000000 +36.000000 +112.000000,102.000000,0.000000 +3 +CXuiCtrlSlotList +ItemGridBrewing36 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + + +Bottle3 +36.000000 +36.000000 +157.999985,88.000000,0.000000 +3 +CXuiCtrlSlotList +ItemGridBrewing36 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + + +Pointer +26.000000 +26.000000 +-50.000000,-50.000000,0.000000 +9 +false +CXuiCtrlSlotItem +ItemPointerSmall + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +190.000000,96.000000,0.000000 + + + +0 +190.000000,96.000000,0.000000 + + + +2 +100 +-100 +50 +190.000000,96.000000,0.000000 + + + +0 +33.750000,96.000000,0.000000 + + + +2 +100 +-100 +50 +60.000000,96.000000,0.000000 + + + +0 +190.000000,96.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_brewingstand_Small.h b/Minecraft.Client/Common/Media/xuiscene_brewingstand_Small.h new file mode 100644 index 00000000..e45fa2b5 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_brewingstand_Small.h @@ -0,0 +1,170 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Inventory L"Inventory" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_UseRow L"UseRow" +#define IDC_InventoryText L"InventoryText" +#define IDC_BrewingStandText L"BrewingStandText" +#define IDC_BrewingStand L"BrewingStand" +#define IDC_Progress L"Progress" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Ingredient L"Ingredient" +#define IDC_Bubbles L"Bubbles" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Bottle1 L"Bottle1" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Bottle2 L"Bottle2" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Bottle3 L"Bottle3" +#define IDC_Pointer L"Pointer" +#define IDC_Group L"Group" +#define IDC_XuiSceneBrewingStand L"XuiSceneBrewingStand" diff --git a/Minecraft.Client/Common/Media/xuiscene_brewingstand_Small.xui b/Minecraft.Client/Common/Media/xuiscene_brewingstand_Small.xui new file mode 100644 index 00000000..dfff4df1 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_brewingstand_Small.xui @@ -0,0 +1,2321 @@ + + +640.000000 +360.000000 + + + +XuiSceneBrewingStand +640.000000 +360.000000 +CXuiSceneBrewingStand +XuiBlankScene +Pointer + + + +Group +260.000000 +290.000000 +190.000000,2.000000,0.000000 +15 +GraphicPanel +Pointer + + + +Inventory +234.000000 +80.000000 +12.000000,161.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical26 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +UseRow +234.000000 +12.000000,250.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical26 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +InventoryText +233.000000 +12.000000,139.000000,0.000000 +9 +LabelContainerSceneLeftSmall + + + + +BrewingStandText +229.000000 +26.000000 +15.500000,7.000000,0.000000 +LabelContainerSceneCentreSmall + + + + +BrewingStand +128.000000 +108.000000 +66.000000,30.000000,0.000000 +BrewingBackground_Small + + + + +Progress +18.000000 +56.000000 +151.000000,29.000000,0.000000 +CXuiCtrlBrewProgress +BrewingArrowProgressStateSmall +600 + + + + +Ingredient +36.000000 +36.000000 +112.000000,30.000000,0.000000 +3 +CXuiCtrlSlotList +ItemGridBrewing36 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + + +Bubbles +24.000000 +56.000000 +84.000061,29.000015,0.000000 +CXuiCtrlBubblesProgress +BrewingBubblesProgressStateSmall +30 + + + + +Bottle1 +36.000000 +36.000000 +66.000000,88.000000,0.000000 +3 +CXuiCtrlSlotList +ItemGridBrewing36 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + + +Bottle2 +36.000000 +36.000000 +112.000000,102.000000,0.000000 +3 +CXuiCtrlSlotList +ItemGridBrewing36 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + + +Bottle3 +36.000000 +36.000000 +157.999985,88.000000,0.000000 +3 +CXuiCtrlSlotList +ItemGridBrewing36 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + + +Pointer +26.000000 +26.000000 +-50.000000,-50.000000,0.000000 +9 +false +CXuiCtrlSlotItem +ItemPointerSmall + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +190.000000,2.000000,0.000000 + + + +0 +190.000000,2.000000,0.000000 + + + +2 +100 +-100 +50 +190.000000,2.000000,0.000000 + + + +0 +64.000000,2.000000,0.000000 + + + +2 +100 +-100 +50 +92.000000,2.000000,0.000000 + + + +0 +190.000000,2.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_chat.h b/Minecraft.Client/Common/Media/xuiscene_chat.h new file mode 100644 index 00000000..67566e0e --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_chat.h @@ -0,0 +1,22 @@ +#define IDC_XuiBack1 L"XuiBack1" +#define IDC_XuiLabel1 L"XuiLabel1" +#define IDC_XuiBack2 L"XuiBack2" +#define IDC_XuiLabel2 L"XuiLabel2" +#define IDC_XuiBack3 L"XuiBack3" +#define IDC_XuiLabel3 L"XuiLabel3" +#define IDC_XuiBack4 L"XuiBack4" +#define IDC_XuiLabel4 L"XuiLabel4" +#define IDC_XuiBack5 L"XuiBack5" +#define IDC_XuiLabel5 L"XuiLabel5" +#define IDC_XuiBack6 L"XuiBack6" +#define IDC_XuiLabel6 L"XuiLabel6" +#define IDC_XuiBack7 L"XuiBack7" +#define IDC_XuiLabel7 L"XuiLabel7" +#define IDC_XuiBack8 L"XuiBack8" +#define IDC_XuiLabel8 L"XuiLabel8" +#define IDC_XuiBack9 L"XuiBack9" +#define IDC_XuiLabel9 L"XuiLabel9" +#define IDC_XuiBack10 L"XuiBack10" +#define IDC_XuiLabel10 L"XuiLabel10" +#define IDC_XuiLabelJukebox L"XuiLabelJukebox" +#define IDC_ChatScene L"ChatScene" diff --git a/Minecraft.Client/Common/Media/xuiscene_chat.xui b/Minecraft.Client/Common/Media/xuiscene_chat.xui new file mode 100644 index 00000000..b6eb89b3 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_chat.xui @@ -0,0 +1,226 @@ + + +1280.000000 +720.000000 + + + +ChatScene +1280.000000 +720.000000 +true +CScene_Chat +XuiBlankScene + + + +XuiBack1 +1280.000000 +35.000000 +0.000000,472.000000,0.000000 +0.000000 +XuiLabelChatBackground + + + + +XuiLabel1 +1280.000000 +35.000000 +0.000000,472.000000,0.000000 +0.000000 +XuiLabelChat + + + + +XuiBack2 +1280.000000 +35.000000 +0.000000,437.000000,0.000000 +0.000000 +XuiLabelChatBackground + + + + +XuiLabel2 +1280.000000 +35.000000 +0.000000,437.000000,0.000000 +0.000000 +XuiLabelChat + + + + +XuiBack3 +1280.000000 +35.000000 +0.000000,402.000000,0.000000 +0.000000 +XuiLabelChatBackground + + + + +XuiLabel3 +1280.000000 +35.000000 +0.000000,402.000000,0.000000 +0.000000 +XuiLabelChat + + + + +XuiBack4 +1280.000000 +35.000000 +0.000000,367.000000,0.000000 +0.000000 +XuiLabelChatBackground + + + + +XuiLabel4 +1280.000000 +35.000000 +0.000000,367.000000,0.000000 +0.000000 +XuiLabelChat + + + + +XuiBack5 +1280.000000 +35.000000 +0.000000,332.000000,0.000000 +0.000000 +XuiLabelChatBackground + + + + +XuiLabel5 +1280.000000 +35.000000 +0.000000,332.000000,0.000000 +0.000000 +XuiLabelChat + + + + +XuiBack6 +1280.000000 +35.000000 +0.000000,297.000000,0.000000 +0.000000 +XuiLabelChatBackground + + + + +XuiLabel6 +1280.000000 +35.000000 +0.000000,297.000000,0.000000 +0.000000 +XuiLabelChat + + + + +XuiBack7 +1280.000000 +35.000000 +0.000000,262.000000,0.000000 +0.000000 +XuiLabelChatBackground + + + + +XuiLabel7 +1280.000000 +35.000000 +0.000000,262.000000,0.000000 +0.000000 +XuiLabelChat + + + + +XuiBack8 +1280.000000 +35.000000 +0.000000,227.000000,0.000000 +0.000000 +XuiLabelChatBackground + + + + +XuiLabel8 +1280.000000 +35.000000 +0.000000,227.000000,0.000000 +0.000000 +XuiLabelChat + + + + +XuiBack9 +1280.000000 +35.000000 +0.000000,192.000000,0.000000 +0.000000 +XuiLabelChatBackground + + + + +XuiLabel9 +1280.000000 +35.000000 +0.000000,192.000000,0.000000 +0.000000 +XuiLabelChat + + + + +XuiBack10 +1280.000000 +35.000000 +0.000000,157.000000,0.000000 +0.000000 +XuiLabelChatBackground + + + + +XuiLabel10 +1280.000000 +35.000000 +0.000000,157.000000,0.000000 +0.000000 +XuiLabelChat + + + + +XuiLabelJukebox +640.000000 +35.000000 +320.000031,472.000000,0.000000 +0.000000 +XuiLabelListening + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_chat_480.h b/Minecraft.Client/Common/Media/xuiscene_chat_480.h new file mode 100644 index 00000000..67566e0e --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_chat_480.h @@ -0,0 +1,22 @@ +#define IDC_XuiBack1 L"XuiBack1" +#define IDC_XuiLabel1 L"XuiLabel1" +#define IDC_XuiBack2 L"XuiBack2" +#define IDC_XuiLabel2 L"XuiLabel2" +#define IDC_XuiBack3 L"XuiBack3" +#define IDC_XuiLabel3 L"XuiLabel3" +#define IDC_XuiBack4 L"XuiBack4" +#define IDC_XuiLabel4 L"XuiLabel4" +#define IDC_XuiBack5 L"XuiBack5" +#define IDC_XuiLabel5 L"XuiLabel5" +#define IDC_XuiBack6 L"XuiBack6" +#define IDC_XuiLabel6 L"XuiLabel6" +#define IDC_XuiBack7 L"XuiBack7" +#define IDC_XuiLabel7 L"XuiLabel7" +#define IDC_XuiBack8 L"XuiBack8" +#define IDC_XuiLabel8 L"XuiLabel8" +#define IDC_XuiBack9 L"XuiBack9" +#define IDC_XuiLabel9 L"XuiLabel9" +#define IDC_XuiBack10 L"XuiBack10" +#define IDC_XuiLabel10 L"XuiLabel10" +#define IDC_XuiLabelJukebox L"XuiLabelJukebox" +#define IDC_ChatScene L"ChatScene" diff --git a/Minecraft.Client/Common/Media/xuiscene_chat_480.xui b/Minecraft.Client/Common/Media/xuiscene_chat_480.xui new file mode 100644 index 00000000..6c68039a --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_chat_480.xui @@ -0,0 +1,247 @@ + + +640.000000 +480.000000 + + + +ChatScene +640.000000 +480.000000 +true +CScene_Chat +XuiBlankScene + + + +XuiBack1 +640.000000 +20.000000 +0.000000,325.000000,0.000000 +0.000000 +5 +XuiLabelChatBackground + + + + +XuiLabel1 +640.000000 +20.000000 +0.000000,325.000000,0.000000 +0.000000 +5 +XuiLabelChat_Small + + + + +XuiBack2 +640.000000 +20.000000 +0.000000,305.000000,0.000000 +0.000000 +5 +XuiLabelChatBackground + + + + +XuiLabel2 +640.000000 +20.000000 +0.000000,305.000000,0.000000 +0.000000 +5 +XuiLabelChat_Small + + + + +XuiBack3 +640.000000 +20.000000 +0.000000,285.000000,0.000000 +0.000000 +5 +XuiLabelChatBackground + + + + +XuiLabel3 +640.000000 +20.000000 +0.000000,285.000000,0.000000 +0.000000 +5 +XuiLabelChat_Small + + + + +XuiBack4 +640.000000 +20.000000 +0.000000,265.000000,0.000000 +0.000000 +5 +XuiLabelChatBackground + + + + +XuiLabel4 +640.000000 +20.000000 +0.000000,265.000000,0.000000 +0.000000 +5 +XuiLabelChat_Small + + + + +XuiBack5 +640.000000 +20.000000 +0.000000,245.000000,0.000000 +0.000000 +5 +XuiLabelChatBackground + + + + +XuiLabel5 +640.000000 +20.000000 +0.000000,245.000000,0.000000 +0.000000 +5 +XuiLabelChat_Small + + + + +XuiBack6 +640.000000 +20.000000 +0.000000,225.000000,0.000000 +0.000000 +5 +XuiLabelChatBackground + + + + +XuiLabel6 +640.000000 +20.000000 +0.000000,225.000000,0.000000 +0.000000 +5 +XuiLabelChat_Small + + + + +XuiBack7 +640.000000 +20.000000 +0.000000,205.000015,0.000000 +0.000000 +5 +XuiLabelChatBackground + + + + +XuiLabel7 +640.000000 +20.000000 +0.000000,205.000015,0.000000 +0.000000 +5 +XuiLabelChat_Small + + + + +XuiBack8 +640.000000 +20.000000 +0.000000,185.000015,0.000000 +0.000000 +5 +XuiLabelChatBackground + + + + +XuiLabel8 +640.000000 +20.000000 +0.000000,185.000015,0.000000 +0.000000 +5 +XuiLabelChat_Small + + + + +XuiBack9 +640.000000 +20.000000 +0.000000,165.000015,0.000000 +0.000000 +5 +XuiLabelChatBackground + + + + +XuiLabel9 +640.000000 +20.000000 +0.000000,165.000015,0.000000 +0.000000 +5 +XuiLabelChat_Small + + + + +XuiBack10 +640.000000 +20.000000 +0.000000,145.000015,0.000000 +0.000000 +5 +XuiLabelChatBackground + + + + +XuiLabel10 +640.000000 +20.000000 +0.000000,145.000015,0.000000 +0.000000 +5 +XuiLabelChat_Small + + + + +XuiLabelJukebox +640.000000 +20.000000 +0.000031,325.000000,0.000000 +0.000000 +5 +XuiLabelListening_Small + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_chat_small.h b/Minecraft.Client/Common/Media/xuiscene_chat_small.h new file mode 100644 index 00000000..67566e0e --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_chat_small.h @@ -0,0 +1,22 @@ +#define IDC_XuiBack1 L"XuiBack1" +#define IDC_XuiLabel1 L"XuiLabel1" +#define IDC_XuiBack2 L"XuiBack2" +#define IDC_XuiLabel2 L"XuiLabel2" +#define IDC_XuiBack3 L"XuiBack3" +#define IDC_XuiLabel3 L"XuiLabel3" +#define IDC_XuiBack4 L"XuiBack4" +#define IDC_XuiLabel4 L"XuiLabel4" +#define IDC_XuiBack5 L"XuiBack5" +#define IDC_XuiLabel5 L"XuiLabel5" +#define IDC_XuiBack6 L"XuiBack6" +#define IDC_XuiLabel6 L"XuiLabel6" +#define IDC_XuiBack7 L"XuiBack7" +#define IDC_XuiLabel7 L"XuiLabel7" +#define IDC_XuiBack8 L"XuiBack8" +#define IDC_XuiLabel8 L"XuiLabel8" +#define IDC_XuiBack9 L"XuiBack9" +#define IDC_XuiLabel9 L"XuiLabel9" +#define IDC_XuiBack10 L"XuiBack10" +#define IDC_XuiLabel10 L"XuiLabel10" +#define IDC_XuiLabelJukebox L"XuiLabelJukebox" +#define IDC_ChatScene L"ChatScene" diff --git a/Minecraft.Client/Common/Media/xuiscene_chat_small.xui b/Minecraft.Client/Common/Media/xuiscene_chat_small.xui new file mode 100644 index 00000000..3869e189 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_chat_small.xui @@ -0,0 +1,247 @@ + + +640.000000 +360.000000 + + + +ChatScene +640.000000 +360.000000 +true +CScene_Chat +XuiBlankScene + + + +XuiBack1 +640.000000 +20.000000 +0.000000,215.000000,0.000000 +0.000000 +5 +XuiLabelChatBackground + + + + +XuiLabel1 +640.000000 +20.000000 +0.000000,215.000000,0.000000 +0.000000 +5 +XuiLabelChat_Small + + + + +XuiBack2 +640.000000 +20.000000 +0.000000,195.000000,0.000000 +0.000000 +5 +XuiLabelChatBackground + + + + +XuiLabel2 +640.000000 +20.000000 +0.000000,195.000000,0.000000 +0.000000 +5 +XuiLabelChat_Small + + + + +XuiBack3 +640.000000 +20.000000 +0.000000,175.000000,0.000000 +0.000000 +5 +XuiLabelChatBackground + + + + +XuiLabel3 +640.000000 +20.000000 +0.000000,175.000000,0.000000 +0.000000 +5 +XuiLabelChat_Small + + + + +XuiBack4 +640.000000 +20.000000 +0.000000,155.000000,0.000000 +0.000000 +5 +XuiLabelChatBackground + + + + +XuiLabel4 +640.000000 +20.000000 +0.000000,155.000000,0.000000 +0.000000 +5 +XuiLabelChat_Small + + + + +XuiBack5 +640.000000 +20.000000 +0.000000,135.000000,0.000000 +0.000000 +5 +XuiLabelChatBackground + + + + +XuiLabel5 +640.000000 +20.000000 +0.000000,135.000000,0.000000 +0.000000 +5 +XuiLabelChat_Small + + + + +XuiBack6 +640.000000 +20.000000 +0.000000,115.000008,0.000000 +0.000000 +5 +XuiLabelChatBackground + + + + +XuiLabel6 +640.000000 +20.000000 +0.000000,115.000008,0.000000 +0.000000 +5 +XuiLabelChat_Small + + + + +XuiBack7 +640.000000 +20.000000 +0.000000,95.000008,0.000000 +0.000000 +5 +XuiLabelChatBackground + + + + +XuiLabel7 +640.000000 +20.000000 +0.000000,95.000008,0.000000 +0.000000 +5 +XuiLabelChat_Small + + + + +XuiBack8 +640.000000 +20.000000 +0.000000,75.000008,0.000000 +0.000000 +5 +XuiLabelChatBackground + + + + +XuiLabel8 +640.000000 +20.000000 +0.000000,75.000008,0.000000 +0.000000 +5 +XuiLabelChat_Small + + + + +XuiBack9 +640.000000 +20.000000 +0.000000,55.000008,0.000000 +0.000000 +5 +XuiLabelChatBackground + + + + +XuiLabel9 +640.000000 +20.000000 +0.000000,55.000008,0.000000 +0.000000 +5 +XuiLabelChat_Small + + + + +XuiBack10 +640.000000 +20.000000 +0.000000,35.000008,0.000000 +0.000000 +5 +XuiLabelChatBackground + + + + +XuiLabel10 +640.000000 +20.000000 +0.000000,35.000008,0.000000 +0.000000 +5 +XuiLabelChat_Small + + + + +XuiLabelJukebox +640.000000 +20.000000 +0.000031,215.000000,0.000000 +0.000000 +5 +XuiLabelListening_Small + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_connectingprogress.h b/Minecraft.Client/Common/Media/xuiscene_connectingprogress.h new file mode 100644 index 00000000..0dc7f5dd --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_connectingprogress.h @@ -0,0 +1,22 @@ +#define IDC_Status L"Status" +#define IDC_Title L"Title" +#define IDC_Progress L"Progress" +#define IDC_Timer_Square_1 L"Timer_Square_1" +#define IDC_Timer_Square_2 L"Timer_Square_2" +#define IDC_Timer_Square_3 L"Timer_Square_3" +#define IDC_Timer_Square_4 L"Timer_Square_4" +#define IDC_Timer_Square_5 L"Timer_Square_5" +#define IDC_Timer_Square_6 L"Timer_Square_6" +#define IDC_Timer_Square_7 L"Timer_Square_7" +#define IDC_Timer_Square_8 L"Timer_Square_8" +#define IDC_Timer_Square_9 L"Timer_Square_9" +#define IDC_Timer_Square_10 L"Timer_Square_10" +#define IDC_Timer_Square_11 L"Timer_Square_11" +#define IDC_Timer_Square_12 L"Timer_Square_12" +#define IDC_Timer_Square_13 L"Timer_Square_13" +#define IDC_Timer_Square_14 L"Timer_Square_14" +#define IDC_Timer_Square_15 L"Timer_Square_15" +#define IDC_Timer_Square_16 L"Timer_Square_16" +#define IDC_Timer L"Timer" +#define IDC_ButtonConfirm L"ButtonConfirm" +#define IDC_ConnectingProgressScene L"ConnectingProgressScene" diff --git a/Minecraft.Client/Common/Media/xuiscene_connectingprogress.xui b/Minecraft.Client/Common/Media/xuiscene_connectingprogress.xui new file mode 100644 index 00000000..a8efa1e9 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_connectingprogress.xui @@ -0,0 +1,923 @@ + + +1280.000000 +720.000000 + + + +ConnectingProgressScene +1280.000000 +720.000000 +CScene_ConnectingProgress +XuiMenuScene +ButtonConfirm + + + +Status +383.000000 +26.000000 +319.000000,360.000000,0.000000 +XuiLabel + + + + +Title +700.000000 +100.000000 +290.000061,250.000000,0.000000 +XuiTitle + + + + +Progress +640.000000 +15.000000 +320.000000,390.000000,0.000000 +false +CXuiCtrlLoadingProgress +LoadingProgressState +50 + + + + +Timer +183.000000 +169.000000 +548.500061,330.000000,0.000000 +XuiBlankScene + + + +Timer_Square_1 +42.000000 +42.000000 +14.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_2 +42.000000 +42.000000 +68.499985,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_3 +42.000000 +42.000000 +123.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_4 +42.000000 +42.000000 +123.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_5 +42.000000 +42.000000 +123.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_6 +42.000000 +42.000000 +68.499985,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_7 +42.000000 +42.000000 +14.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_8 +42.000000 +42.000000 +14.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_9 +42.000000 +42.000000 +14.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_10 +42.000000 +42.000000 +68.499985,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_11 +42.000000 +42.000000 +123.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_12 +42.000000 +42.000000 +123.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_13 +42.000000 +42.000000 +123.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_14 +42.000000 +42.000000 +68.499985,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_15 +42.000000 +42.000000 +14.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_16 +42.000000 +42.000000 +14.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + + +LoadStart + + + +LoopStart + + + +LoopEnd + +gotoandplay +LoopStart + + + +Timer_Square_1 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_3 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_8 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_4 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_7 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_6 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_5 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_2 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_9 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_10 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_11 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_12 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_13 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_14 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x07ebebeb + + + +Timer_Square_15 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x49ebebeb + + + +Timer_Square_16 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x8cebebeb + + + + + + +ButtonConfirm +320.000000 +50.000000 +480.000031,530.000000,0.000000 +false + + + + + +Normal + + + +EndNormal + +gotoandplay +Normal + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_connectingprogress_480.h b/Minecraft.Client/Common/Media/xuiscene_connectingprogress_480.h new file mode 100644 index 00000000..bbaa077c --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_connectingprogress_480.h @@ -0,0 +1,22 @@ +#define IDC_Status L"Status" +#define IDC_Title L"Title" +#define IDC_Progress L"Progress" +#define IDC_ButtonConfirm L"ButtonConfirm" +#define IDC_Timer_Square_1 L"Timer_Square_1" +#define IDC_Timer_Square_2 L"Timer_Square_2" +#define IDC_Timer_Square_3 L"Timer_Square_3" +#define IDC_Timer_Square_4 L"Timer_Square_4" +#define IDC_Timer_Square_5 L"Timer_Square_5" +#define IDC_Timer_Square_6 L"Timer_Square_6" +#define IDC_Timer_Square_7 L"Timer_Square_7" +#define IDC_Timer_Square_8 L"Timer_Square_8" +#define IDC_Timer_Square_9 L"Timer_Square_9" +#define IDC_Timer_Square_10 L"Timer_Square_10" +#define IDC_Timer_Square_11 L"Timer_Square_11" +#define IDC_Timer_Square_12 L"Timer_Square_12" +#define IDC_Timer_Square_13 L"Timer_Square_13" +#define IDC_Timer_Square_14 L"Timer_Square_14" +#define IDC_Timer_Square_15 L"Timer_Square_15" +#define IDC_Timer_Square_16 L"Timer_Square_16" +#define IDC_Timer L"Timer" +#define IDC_ConnectingProgressScene L"ConnectingProgressScene" diff --git a/Minecraft.Client/Common/Media/xuiscene_connectingprogress_480.xui b/Minecraft.Client/Common/Media/xuiscene_connectingprogress_480.xui new file mode 100644 index 00000000..8ae84411 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_connectingprogress_480.xui @@ -0,0 +1,923 @@ + + +640.000000 +480.000000 + + + +ConnectingProgressScene +640.000000 +480.000000 +CScene_ConnectingProgress +XuiMenuScene +ButtonConfirm + + + +Status +383.000000 +26.000000 +70.000000,232.666656,0.000000 +XuiLabel + + + + +Title +500.000000 +50.000000 +70.000015,130.000000,0.000000 +XuiTitleSmall + + + + +Progress +500.000000 +15.000000 +70.000046,259.000000,0.000000 +false +CXuiCtrlLoadingProgress +LoadingProgressState +50 + + + + +ButtonConfirm +160.000000 +36.000000 +240.000000,348.000000,0.000000 +false + + + + +Timer +72.000000 +72.000000 +284.000000,177.000000,0.000000 +15 +false +XuiBlankScene + + + +Timer_Square_1 +21.000000 +21.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_2 +21.000000 +21.000000 +25.000000,0.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_3 +21.000000 +21.000000 +50.000000,0.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_4 +21.000000 +21.000000 +50.000000,25.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_5 +21.000000 +21.000000 +50.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_6 +21.000000 +21.000000 +25.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_7 +21.000000 +21.000000 +0.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_8 +21.000000 +21.000000 +0.000000,25.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_9 +21.000000 +21.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_10 +21.000000 +21.000000 +25.000000,0.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_11 +21.000000 +21.000000 +50.000000,0.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_12 +21.000000 +21.000000 +50.000000,25.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_13 +21.000000 +21.000000 +50.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_14 +21.000000 +21.000000 +25.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_15 +21.000000 +21.000000 +0.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_16 +21.000000 +21.000000 +0.000000,25.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + + +LoadStart + + + +LoopStart + + + +LoopEnd + +gotoandplay +LoopStart + + + +Timer_Square_1 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_3 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_8 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_4 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_7 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_6 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_5 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_2 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_9 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_10 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_11 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_12 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_13 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_14 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x07ebebeb + + + +Timer_Square_15 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x49ebebeb + + + +Timer_Square_16 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x8cebebeb + + + + + + + +Normal + + + +EndNormal + +gotoandplay +Normal + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_connectingprogress_small.h b/Minecraft.Client/Common/Media/xuiscene_connectingprogress_small.h new file mode 100644 index 00000000..0dc7f5dd --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_connectingprogress_small.h @@ -0,0 +1,22 @@ +#define IDC_Status L"Status" +#define IDC_Title L"Title" +#define IDC_Progress L"Progress" +#define IDC_Timer_Square_1 L"Timer_Square_1" +#define IDC_Timer_Square_2 L"Timer_Square_2" +#define IDC_Timer_Square_3 L"Timer_Square_3" +#define IDC_Timer_Square_4 L"Timer_Square_4" +#define IDC_Timer_Square_5 L"Timer_Square_5" +#define IDC_Timer_Square_6 L"Timer_Square_6" +#define IDC_Timer_Square_7 L"Timer_Square_7" +#define IDC_Timer_Square_8 L"Timer_Square_8" +#define IDC_Timer_Square_9 L"Timer_Square_9" +#define IDC_Timer_Square_10 L"Timer_Square_10" +#define IDC_Timer_Square_11 L"Timer_Square_11" +#define IDC_Timer_Square_12 L"Timer_Square_12" +#define IDC_Timer_Square_13 L"Timer_Square_13" +#define IDC_Timer_Square_14 L"Timer_Square_14" +#define IDC_Timer_Square_15 L"Timer_Square_15" +#define IDC_Timer_Square_16 L"Timer_Square_16" +#define IDC_Timer L"Timer" +#define IDC_ButtonConfirm L"ButtonConfirm" +#define IDC_ConnectingProgressScene L"ConnectingProgressScene" diff --git a/Minecraft.Client/Common/Media/xuiscene_connectingprogress_small.xui b/Minecraft.Client/Common/Media/xuiscene_connectingprogress_small.xui new file mode 100644 index 00000000..3b71d539 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_connectingprogress_small.xui @@ -0,0 +1,923 @@ + + +640.000000 +360.000000 + + + +ConnectingProgressScene +640.000000 +360.000000 +CScene_ConnectingProgress +XuiMenuScene +ButtonConfirm + + + +Status +383.000000 +26.000000 +70.000000,194.666656,0.000000 +XuiLabel + + + + +Title +500.000000 +50.000000 +70.000015,120.000000,0.000000 +XuiTitleSmall + + + + +Progress +500.000000 +15.000000 +70.000046,221.000000,0.000000 +false +CXuiCtrlLoadingProgress +LoadingProgressState +50 + + + + +Timer +91.000000 +84.000000 +275.000000,174.000000,0.000000 +XuiBlankScene + + + +Timer_Square_1 +42.000000 +42.000000 +-29.999992,-9.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_2 +42.000000 +42.000000 +24.499992,-9.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_3 +42.000000 +42.000000 +79.000008,-9.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_4 +42.000000 +42.000000 +79.000008,46.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_5 +42.000000 +42.000000 +79.000008,101.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_6 +42.000000 +42.000000 +24.499992,101.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_7 +42.000000 +42.000000 +-29.999992,101.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_8 +42.000000 +42.000000 +-29.999992,46.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_9 +42.000000 +42.000000 +-29.999992,-9.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_10 +42.000000 +42.000000 +24.499992,-9.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_11 +42.000000 +42.000000 +79.000008,-9.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_12 +42.000000 +42.000000 +79.000008,46.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_13 +42.000000 +42.000000 +79.000008,101.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_14 +42.000000 +42.000000 +24.499992,101.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_15 +42.000000 +42.000000 +-29.999992,101.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_16 +42.000000 +42.000000 +-29.999992,46.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + + +LoadStart + + + +LoopStart + + + +LoopEnd + +gotoandplay +LoopStart + + + +Timer_Square_1 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_3 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_8 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_4 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_7 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_6 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_5 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_2 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_9 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_10 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_11 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_12 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_13 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_14 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x07ebebeb + + + +Timer_Square_15 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x49ebebeb + + + +Timer_Square_16 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x8cebebeb + + + + + + +ButtonConfirm +160.000000 +25.000000 +240.000000,267.000000,0.000000 +false + + + + + +Normal + + + +EndNormal + +gotoandplay +Normal + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_container.h b/Minecraft.Client/Common/Media/xuiscene_container.h new file mode 100644 index 00000000..1316672e --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_container.h @@ -0,0 +1,65 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Inventory L"Inventory" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_UseRow L"UseRow" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Container L"Container" +#define IDC_InventoryText L"InventoryText" +#define IDC_ChestText L"ChestText" +#define IDC_Pointer L"Pointer" +#define IDC_Group L"Group" +#define IDC_XuiSceneContainer L"XuiSceneContainer" diff --git a/Minecraft.Client/Common/Media/xuiscene_container.xui b/Minecraft.Client/Common/Media/xuiscene_container.xui new file mode 100644 index 00000000..7e6230e8 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_container.xui @@ -0,0 +1,961 @@ + + +1280.000000 +720.000000 + + + +XuiSceneContainer +1280.000000 +720.000000 +15 +CXuiSceneContainer +XuiBlankScene +Pointer + + + +Group +430.000000 +415.000000 +425.000000,138.000000,0.000000 +15 +XuiScene +Pointer + + + +Inventory +382.000000 +150.000000 +25.000000,212.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + + +UseRow +381.000000 +50.000000 +25.000000,352.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + + +Container +383.000000 +128.000015 +25.000000,50.000000,0.000000 +10 +CXuiCtrlSlotList +ItemGridVertical + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + + +InventoryText +340.000000 +32.000000 +26.000000,182.000000,0.000000 +12 +LabelContainerSceneLeft + + + + +ChestText +340.000000 +26.000000 +26.000000,17.000000,0.000000 +LabelContainerSceneLeft + + + + +Pointer +42.000000 +42.000000 +-185.000000,-80.000015,0.000000 +9 +CXuiCtrlSlotItem +ItemPointer + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +425.000000,138.000000,0.000000 + + + +0 +425.000000,138.000000,0.000000 + + + +2 +100 +-100 +50 +425.000000,138.000000,0.000000 + + + +0 +160.000000,138.000000,0.000000 + + + +2 +100 +-100 +50 +160.000000,138.000000,0.000000 + + + +0 +425.000000,138.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_container_480.h b/Minecraft.Client/Common/Media/xuiscene_container_480.h new file mode 100644 index 00000000..7ba593b0 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_container_480.h @@ -0,0 +1,119 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Inventory L"Inventory" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_UseRow L"UseRow" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Container L"Container" +#define IDC_InventoryText L"InventoryText" +#define IDC_ChestText L"ChestText" +#define IDC_Pointer L"Pointer" +#define IDC_Group L"Group" +#define IDC_XuiSceneContainer L"XuiSceneContainer" diff --git a/Minecraft.Client/Common/Media/xuiscene_container_480.xui b/Minecraft.Client/Common/Media/xuiscene_container_480.xui new file mode 100644 index 00000000..f7ce2cb1 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_container_480.xui @@ -0,0 +1,1610 @@ + + +640.000000 +480.000000 + + + +XuiSceneContainer +640.000000 +480.000000 +15 +CXuiSceneContainer +XuiBlankScene +Pointer + + + +Group +258.000000 +260.000000 +191.000000,110.000000,0.000000 +15 +GraphicPanel +Pointer + + + +Inventory +234.000000 +78.000000 +12.000000,132.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical26 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +UseRow +234.000000 +26.000000 +12.000000,222.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical26 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +Container +234.000000 +78.000000 +12.000000,30.000000,0.000000 +10 +CXuiCtrlSlotList +ItemGridVertical26 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +InventoryText +234.000000 +22.000000 +12.000000,110.000000,0.000000 +12 +LabelContainerSceneLeftSmall + + + + +ChestText +234.000000 +22.000000 +12.000000,8.000000,0.000000 +LabelContainerSceneLeftSmall + + + + +Pointer +26.000000 +26.000000 +-50.000000,-50.000000,0.000000 +9 +false +CXuiCtrlSlotItem +ItemPointerSmall + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +191.000000,110.000000,0.000000 + + + +0 +191.000000,110.000000,0.000000 + + + +2 +100 +-100 +50 +191.000000,110.000000,0.000000 + + + +0 +33.750000,110.000000,0.000000 + + + +2 +100 +-100 +50 +60.000000,110.000000,0.000000 + + + +0 +191.000000,110.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_container_large_480.h b/Minecraft.Client/Common/Media/xuiscene_container_large_480.h new file mode 100644 index 00000000..6d8258f8 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_container_large_480.h @@ -0,0 +1,173 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Inventory L"Inventory" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_UseRow L"UseRow" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Container L"Container" +#define IDC_InventoryText L"InventoryText" +#define IDC_ChestText L"ChestText" +#define IDC_Pointer L"Pointer" +#define IDC_Group L"Group" +#define IDC_XuiSceneContainer L"XuiSceneContainer" diff --git a/Minecraft.Client/Common/Media/xuiscene_container_large_480.xui b/Minecraft.Client/Common/Media/xuiscene_container_large_480.xui new file mode 100644 index 00000000..89c28558 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_container_large_480.xui @@ -0,0 +1,2474 @@ + + +640.000000 +480.000000 + + + +XuiSceneContainer +640.000000 +480.000000 +15 +CXuiSceneContainer +XuiBlankScene +Pointer + + + +Group +238.000000 +240.000000 +201.000000,80.000000,0.000000 +15 +GraphicPanel +Pointer + + + +Inventory +216.000000 +72.000000 +12.000000,126.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical24 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + + +UseRow +216.000000 +24.000000 +12.000000,206.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical24 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + + +Container +216.000000 +78.000000 +12.000000,28.000000,0.000000 +10 +CXuiCtrlSlotList +ItemGridVertical24 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + + +InventoryText +210.000000 +22.000000 +13.000000,104.000000,0.000000 +12 +LabelContainerSceneLeftSmall + + + + +ChestText +210.000000 +20.000000 +12.000000,8.000000,0.000000 +LabelContainerSceneLeftSmall + + + + +Pointer +26.000000 +26.000000 +-50.000000,-114.000000,0.000000 +9 +false +CXuiCtrlSlotItem +ItemPointerSmall + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +201.000000,80.000000,0.000000 + + + +0 +201.000000,80.000000,0.000000 + + + +2 +100 +-100 +50 +201.000000,80.000000,0.000000 + + + +0 +33.750000,80.000000,0.000000 + + + +2 +100 +-100 +50 +60.000000,80.000000,0.000000 + + + +0 +201.000000,80.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_container_large_Small.h b/Minecraft.Client/Common/Media/xuiscene_container_large_Small.h new file mode 100644 index 00000000..1316672e --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_container_large_Small.h @@ -0,0 +1,65 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Inventory L"Inventory" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_UseRow L"UseRow" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Container L"Container" +#define IDC_InventoryText L"InventoryText" +#define IDC_ChestText L"ChestText" +#define IDC_Pointer L"Pointer" +#define IDC_Group L"Group" +#define IDC_XuiSceneContainer L"XuiSceneContainer" diff --git a/Minecraft.Client/Common/Media/xuiscene_container_large_Small.xui b/Minecraft.Client/Common/Media/xuiscene_container_large_Small.xui new file mode 100644 index 00000000..daa12031 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_container_large_Small.xui @@ -0,0 +1,962 @@ + + +640.000000 +360.000000 + + + +XuiSceneContainer +640.000000 +360.000000 +15 +CXuiSceneContainer +XuiBlankScene +Pointer + + + +Group +222.000000 +228.000000 +201.000000,34.000000,0.000000 +15 +GraphicPanel +Pointer + + + +Inventory +216.000000 +72.000000 +12.000000,118.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical22 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + + +UseRow +216.000000 +22.000000 +12.000000,197.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical22 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + + +Container +216.000000 +72.000000 +12.000000,33.000000,0.000000 +10 +CXuiCtrlSlotList +ItemGridVertical22 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + + +InventoryText +195.000000 +22.000000 +12.000000,100.000000,0.000000 +12 +LabelContainerSceneLeftSmall + + + + +ChestText +198.000000 +20.000000 +12.000000,11.000000,0.000000 +LabelContainerSceneLeftSmall + + + + +Pointer +22.000000 +22.000000 +-50.000000,-77.000000,0.000000 +9 +false +CXuiCtrlSlotItem +ItemPointerSmall + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +201.000000,34.000000,0.000000 + + + +0 +201.000000,34.000000,0.000000 + + + +2 +100 +-100 +50 +201.000000,34.000000,0.000000 + + + +0 +64.000000,34.000000,0.000000 + + + +2 +100 +-100 +50 +92.000000,34.000000,0.000000 + + + +0 +201.000000,34.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_container_small.h b/Minecraft.Client/Common/Media/xuiscene_container_small.h new file mode 100644 index 00000000..1316672e --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_container_small.h @@ -0,0 +1,65 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Inventory L"Inventory" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_UseRow L"UseRow" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Container L"Container" +#define IDC_InventoryText L"InventoryText" +#define IDC_ChestText L"ChestText" +#define IDC_Pointer L"Pointer" +#define IDC_Group L"Group" +#define IDC_XuiSceneContainer L"XuiSceneContainer" diff --git a/Minecraft.Client/Common/Media/xuiscene_container_small.xui b/Minecraft.Client/Common/Media/xuiscene_container_small.xui new file mode 100644 index 00000000..8a837956 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_container_small.xui @@ -0,0 +1,907 @@ + + +640.000000 +360.000000 + + + +XuiSceneContainer +640.000000 +360.000000 +15 +CXuiSceneContainer +XuiBlankScene +Pointer + + + +Group +258.000000 +260.000000 +190.000000,2.000000,0.000000 +15 +GraphicPanel +Pointer + + + +Inventory +234.000000 +80.000000 +12.000000,132.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical26 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +UseRow +234.000000 +12.000000,222.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical26 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +Container +234.000000 +85.000000 +12.000000,30.000000,0.000000 +10 +CXuiCtrlSlotList +ItemGridVertical26 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +InventoryText +234.000000 +22.000000 +12.000000,110.000000,0.000000 +12 +LabelContainerSceneLeftSmall + + + + +ChestText +234.000000 +22.000000 +12.000000,8.000000,0.000000 +LabelContainerSceneLeftSmall + + + + +Pointer +26.000000 +26.000000 +-50.000000,-45.000000,0.000000 +9 +false +CXuiCtrlSlotItem +ItemPointerSmall + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +190.000000,2.000000,0.000000 + + + +0 +190.000000,2.000000,0.000000 + + + +2 +100 +-100 +50 +190.000000,2.000000,0.000000 + + + +0 +64.000000,2.000000,0.000000 + + + +2 +100 +-100 +50 +92.000000,2.000000,0.000000 + + + +0 +190.000000,2.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_controls.h b/Minecraft.Client/Common/Media/xuiscene_controls.h new file mode 100644 index 00000000..f86df2ae --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_controls.h @@ -0,0 +1,65 @@ +#define IDC_Controller L"Controller" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_SchemeList L"SchemeList" +#define IDC_InvertLook L"InvertLook" +#define IDC_SouthPaw L"SouthPaw" +#define IDC_FigDpad L"FigDpad" +#define IDC_Dpad L"Dpad" +#define IDC_FigDpadL L"FigDpadL" +#define IDC_DpadL L"DpadL" +#define IDC_FigDpadR L"FigDpadR" +#define IDC_DpadR L"DpadR" +#define IDC_FigLT L"FigLT" +#define IDC_LT L"LT" +#define IDC_FigRT L"FigRT" +#define IDC_RT L"RT" +#define IDC_FigLStick L"FigLStick" +#define IDC_LStick L"LStick" +#define IDC_FigRStick L"FigRStick" +#define IDC_RStick L"RStick" +#define IDC_FigLStickButton L"FigLStickButton" +#define IDC_LStickButton L"LStickButton" +#define IDC_FigRStickButton L"FigRStickButton" +#define IDC_RStickButton L"RStickButton" +#define IDC_FigLB L"FigLB" +#define IDC_LB L"LB" +#define IDC_FigRB L"FigRB" +#define IDC_RB L"RB" +#define IDC_FigBack L"FigBack" +#define IDC_Back L"Back" +#define IDC_FigStart L"FigStart" +#define IDC_Start L"Start" +#define IDC_FigY L"FigY" +#define IDC_Y L"Y" +#define IDC_FigX L"FigX" +#define IDC_X L"X" +#define IDC_FigB L"FigB" +#define IDC_B L"B" +#define IDC_FigA L"FigA" +#define IDC_A L"A" +#define IDC_FigGroup L"FigGroup" +#define IDC_CurrentLayout L"CurrentLayout" +#define IDC_XuiBuildVer L"XuiBuildVer" +#define IDC_XuiLabel1 L"XuiLabel1" +#define IDC_XuiLabel2 L"XuiLabel2" +#define IDC_XuiLabel3 L"XuiLabel3" +#define IDC_XuiLabel4 L"XuiLabel4" +#define IDC_XuiLabel5 L"XuiLabel5" +#define IDC_XuiLabel6 L"XuiLabel6" +#define IDC_XuiLabel7 L"XuiLabel7" +#define IDC_XuiLabel8 L"XuiLabel8" +#define IDC_XuiLabel9 L"XuiLabel9" +#define IDC_XuiLabel10 L"XuiLabel10" +#define IDC_XuiLabel11 L"XuiLabel11" +#define IDC_XuiLabel12 L"XuiLabel12" +#define IDC_XuiLabel13 L"XuiLabel13" +#define IDC_XuiLabel14 L"XuiLabel14" +#define IDC_XuiLabel15 L"XuiLabel15" +#define IDC_XuiLabel16 L"XuiLabel16" +#define IDC_XuiLabel17 L"XuiLabel17" +#define IDC_SceneControls L"SceneControls" diff --git a/Minecraft.Client/Common/Media/xuiscene_controls.xui b/Minecraft.Client/Common/Media/xuiscene_controls.xui new file mode 100644 index 00000000..734f8718 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_controls.xui @@ -0,0 +1,1272 @@ + + +1280.000000 +720.000000 + + + +SceneControls +1280.000000 +720.000000 +CScene_Controls +XuiMenuScene +SchemeList + + + +Controller +400.000000 +270.000000 +448.000000,338.000000,0.000000 +ControllerGraphic + + + + +SchemeList +480.000000 +128.000000 +400.000031,194.000000,0.000000 +CXuiCtrl4JList +XuiLayoutList +InvertLook + + + +control_ListItem +100.000000 +20.000000 +16.000000,32.000000,0.000000 +5 +false + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +140.000000 +40.000000 +20.000000,40.000000,0.000000 +5 +false +XuiLayoutListButton +1 +140.000000,40.000000,0.000000 +10.000000,0.000000,0.000000 + + + + +control_ListItem +140.000000 +40.000000 +20.000000,40.000000,0.000000 +5 +false +XuiLayoutListButton +1 +140.000000,40.000000,0.000000 +10.000000,0.000000,0.000000 + + + + +control_ListItem +140.000000 +40.000000 +20.000000,40.000000,0.000000 +5 +false +XuiLayoutListButton +1 +140.000000,40.000000,0.000000 +10.000000,0.000000,0.000000 + + + + +control_ListItem +140.000000 +40.000000 +20.000000,40.000000,0.000000 +5 +false +XuiLayoutListButton +1 +140.000000,40.000000,0.000000 +10.000000,0.000000,0.000000 + + + + + +InvertLook +216.000000 +32.000000 +420.000031,282.000000,0.000000 +5 +XuiCheckbox +SouthPaw +SouthPaw +SchemeList +22528 + + + + +SouthPaw +215.000000 +32.000000 +644.000000,282.000000,0.000000 +5 +XuiCheckbox +InvertLook +InvertLook +SchemeList +22528 + + + + +FigGroup +1280.000000 +720.000000 +48 + + + +Dpad +1280.000000 +720.000000 +48 + + + +FigDpad +155.000000 +4.000000 +432.000000,606.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +4.000000 +85.000000 +584.000000,525.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +DpadL +1280.000000 +720.000000 +48 + + + +4.000000 +102.000000 +599.000000,522.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +FigDpadL +170.000000 +4.000000 +432.000000,620.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +DpadR +1280.000000 +720.000000 +48 + + + +FigDpadR +140.000000 +4.000000 +432.000000,590.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +4.000000 +72.000000 +569.000000,522.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +LT +1280.000000 +720.000000 +48 + + + +FigLT +110.000000 +4.000000 +432.000000,370.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +RT +1280.000000 +720.000000 +48 + + + +FigRT +112.000000 +4.000000 +738.000000,370.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +LStick +1280.000000 +720.000000 +48 + + + +4.000000 +533.000000,470.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +FigLStick +105.000000 +4.000000 +432.000000,496.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +RStick +1280.000000 +720.000000 +48 + + + +4.000000 +65.000000 +690.000000,529.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +FigRStick +160.000000 +4.000000 +690.000000,590.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +LStickButton +1280.000000 +720.000000 +48 + + + +4.000000 +533.000000,500.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +FigLStickButton +105.000000 +4.000000 +432.000000,526.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +RStickButton +1280.000000 +720.000000 +48 + + + +4.000000 +690.000000,594.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +FigRStickButton +160.000000 +4.000000 +690.000000,620.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +LB +1280.000000 +720.000000 +48 + + + +FigLB +100.000000 +4.000000 +432.000000,399.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +RB +1280.000000 +720.000000 +48 + + + +FigRB +100.000000 +4.000000 +750.000000,399.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +Back +1280.000000 +720.000000 +48 + + + +4.000000 +130.000000 +599.000000,341.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +FigBack +170.000000 +4.000000 +432.000000,341.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +Start +1280.000000 +720.000000 +48 + + + +4.000000 +130.000000 +677.000000,341.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +FigStart +173.000000 +4.000000 +677.000000,341.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +Y +1280.000000 +720.000000 +48 + + + +FigY +100.000000 +4.000000 +750.000000,436.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +X +1280.000000 +720.000000 +48 + + + +FigX +131.000000 +4.000000 +719.000000,526.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +4.000000 +63.000000 +719.000000,466.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +B +1280.000000 +720.000000 +48 + + + +FigB +70.000000 +4.000000 +780.000000,466.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +A +1280.000000 +720.000000 +48 + + + +FigA +100.000000 +4.000000 +750.000000,496.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +XuiText1 +421.000000 +86.583344 +433.000000,256.416656,0.000000 +true +The names of these groups and the Fig name inside them is used in the code for placement - don't change the names! +0xff0f0f0f +0x800f0f0f +0 + + + + + +CurrentLayout +460.000000 +22.000000 +410.000031,206.000000,0.000000 +XuiLabelDarkCentred + + + + +XuiBuildVer +238.000000 +28.000000 +93.000000,616.000000,0.000000 +XuiLabelDark + + + + +2.000000 +408.000000 +850.000000,236.000000,0.000000 +true + + +0xff0f0f80 + + + + +0xff0f0f0f +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,112.000000,0.000000,0,112.000000,0.000000,112.000000,0.000000,112.000000,408.000000,0,112.000000,408.000000,112.000000,408.000000,0.000000,408.000000,0,0.000000,408.000000,0.000000,408.000000,0.000000,0.000000,0, + + + + +2.000000 +408.000000 +430.000000,236.000000,0.000000 +true + + +0xff0f0f80 + + + + +0xff0f0f0f +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,112.000000,0.000000,0,112.000000,0.000000,112.000000,0.000000,112.000000,408.000000,0,112.000000,408.000000,112.000000,408.000000,0.000000,408.000000,0,0.000000,408.000000,0.000000,408.000000,0.000000,0.000000,0, + + + + +XuiLabel1 +109.000000 +36.000000 +228.000000,232.000000,0.000000 +false +LabelControlsSceneAction + + + + +XuiLabel2 +109.000000 +36.000000 +228.000000,232.000000,0.000000 +false +LabelControlsSceneAction + + + + +XuiLabel3 +109.000000 +36.000000 +228.000000,232.000000,0.000000 +false +LabelControlsSceneAction + + + + +XuiLabel4 +109.000000 +36.000000 +228.000000,232.000000,0.000000 +false +LabelControlsSceneAction + + + + +XuiLabel5 +109.000000 +36.000000 +228.000000,232.000000,0.000000 +false +LabelControlsSceneAction + + + + +XuiLabel6 +109.000000 +36.000000 +228.000000,232.000000,0.000000 +false +LabelControlsSceneAction + + + + +XuiLabel7 +109.000000 +36.000000 +228.000000,232.000000,0.000000 +false +LabelControlsSceneAction + + + + +XuiLabel8 +109.000000 +36.000000 +228.000000,232.000000,0.000000 +false +LabelControlsSceneAction + + + + +XuiLabel9 +109.000000 +36.000000 +228.000000,232.000000,0.000000 +false +LabelControlsSceneAction + + + + +XuiLabel10 +109.000000 +36.000000 +228.000000,232.000000,0.000000 +false +LabelControlsSceneAction + + + + +XuiLabel11 +109.000000 +36.000000 +228.000000,232.000000,0.000000 +false +LabelControlsSceneAction + + + + +XuiLabel12 +109.000000 +36.000000 +228.000000,232.000000,0.000000 +false +LabelControlsSceneAction + + + + +XuiLabel13 +109.000000 +36.000000 +228.000000,232.000000,0.000000 +false +LabelControlsSceneAction + + + + +XuiLabel14 +109.000000 +36.000000 +228.000000,232.000000,0.000000 +false +LabelControlsSceneAction + + + + +XuiLabel15 +109.000000 +36.000000 +228.000000,232.000000,0.000000 +false +LabelControlsSceneAction + + + + +XuiLabel16 +109.000000 +36.000000 +228.000000,232.000000,0.000000 +false +LabelControlsSceneAction + + + + +XuiLabel17 +109.000000 +36.000000 +228.000000,232.000000,0.000000 +false +LabelControlsSceneAction + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_controls_480.h b/Minecraft.Client/Common/Media/xuiscene_controls_480.h new file mode 100644 index 00000000..c7f69bde --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_controls_480.h @@ -0,0 +1,67 @@ +#define IDC_Controller L"Controller" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_SchemeList L"SchemeList" +#define IDC_InvertLook L"InvertLook" +#define IDC_SouthPaw L"SouthPaw" +#define IDC_FigDpad L"FigDpad" +#define IDC_Dpad L"Dpad" +#define IDC_FigDpadL L"FigDpadL" +#define IDC_DpadL L"DpadL" +#define IDC_FigDpadR L"FigDpadR" +#define IDC_DpadR L"DpadR" +#define IDC_FigLT L"FigLT" +#define IDC_LT L"LT" +#define IDC_FigRT L"FigRT" +#define IDC_RT L"RT" +#define IDC_FigLStick L"FigLStick" +#define IDC_LStick L"LStick" +#define IDC_FigRStick L"FigRStick" +#define IDC_RStick L"RStick" +#define IDC_FigLStickButton L"FigLStickButton" +#define IDC_LStickButton L"LStickButton" +#define IDC_FigRStickButton L"FigRStickButton" +#define IDC_RStickButton L"RStickButton" +#define IDC_FigLB L"FigLB" +#define IDC_LB L"LB" +#define IDC_FigRB L"FigRB" +#define IDC_RB L"RB" +#define IDC_FigBack L"FigBack" +#define IDC_Back L"Back" +#define IDC_FigStart L"FigStart" +#define IDC_Start L"Start" +#define IDC_FigY L"FigY" +#define IDC_Y L"Y" +#define IDC_FigX L"FigX" +#define IDC_X L"X" +#define IDC_FigB L"FigB" +#define IDC_B L"B" +#define IDC_FigA L"FigA" +#define IDC_A L"A" +#define IDC_FigGroup L"FigGroup" +#define IDC_CurrentLayout L"CurrentLayout" +#define IDC_XuiBuildVer L"XuiBuildVer" +#define IDC_XuiLabel1 L"XuiLabel1" +#define IDC_XuiLabel2 L"XuiLabel2" +#define IDC_XuiLabel3 L"XuiLabel3" +#define IDC_XuiLabel4 L"XuiLabel4" +#define IDC_XuiLabel5 L"XuiLabel5" +#define IDC_XuiLabel6 L"XuiLabel6" +#define IDC_XuiLabel7 L"XuiLabel7" +#define IDC_XuiLabel8 L"XuiLabel8" +#define IDC_XuiLabel9 L"XuiLabel9" +#define IDC_XuiLabel10 L"XuiLabel10" +#define IDC_XuiLabel11 L"XuiLabel11" +#define IDC_XuiLabel12 L"XuiLabel12" +#define IDC_XuiLabel13 L"XuiLabel13" +#define IDC_XuiLabel14 L"XuiLabel14" +#define IDC_XuiLabel15 L"XuiLabel15" +#define IDC_XuiLabel16 L"XuiLabel16" +#define IDC_XuiLabel17 L"XuiLabel17" +#define IDC_SceneControls L"SceneControls" diff --git a/Minecraft.Client/Common/Media/xuiscene_controls_480.xui b/Minecraft.Client/Common/Media/xuiscene_controls_480.xui new file mode 100644 index 00000000..d34f10ac --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_controls_480.xui @@ -0,0 +1,1254 @@ + + +640.000000 +480.000000 + + + +SceneControls +640.000000 +480.000000 +CScene_Controls +XuiMenuScene +SchemeList + + + +Controller +400.000000 +270.000000 +224.000000,249.000000,0.000000 +0.500000,0.500000,1.000000 +ControllerGraphic + + + + +SchemeList +366.000000 +90.000000 +137.000000,136.000000,0.000000 +CXuiCtrl4JList +XuiLayoutListSmall +InvertLook + + + +control_ListItem +100.000000 +20.000000 +16.000000,32.000000,0.000000 +5 +false + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +84.000000 +24.000000 +40.000000,30.000000,0.000000 +5 +false +XuiLayoutListButtonSmall +1 +84.000000,24.000000,0.000000 +17.000000,0.000000,0.000000 + + + + +control_ListItem +84.000000 +24.000000 +40.000000,30.000000,0.000000 +5 +false +XuiLayoutListButtonSmall +1 +84.000000,24.000000,0.000000 +17.000000,0.000000,0.000000 + + + + +control_ListItem +84.000000 +24.000000 +40.000000,30.000000,0.000000 +5 +false +XuiLayoutListButtonSmall +1 +84.000000,24.000000,0.000000 +17.000000,0.000000,0.000000 + + + + +control_ListItem +84.000000 +24.000000 +40.000000,30.000000,0.000000 +5 +false +XuiLayoutListButtonSmall +1 +84.000000,24.000000,0.000000 +17.000000,0.000000,0.000000 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + + +InvertLook +156.000000 +20.000000 +156.999969,195.000000,0.000000 +XuiCheckboxSmall +SouthPaw +SouthPaw +SchemeList +22528 + + + + +SouthPaw +156.000000 +20.000000 +324.000000,195.000000,0.000000 +XuiCheckboxSmall +InvertLook +InvertLook +SchemeList +22528 + + + + +FigGroup +1280.000000 +720.000000 +0.500000,0.500000,0.500000 +48 + + + +Dpad +1280.000000 +720.000000 +48 + + + +FigDpad +155.000000 +4.000000 +432.000000,766.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +4.000000 +85.000000 +584.000000,684.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +DpadL +1280.000000 +720.000000 +48 + + + +4.000000 +102.000000 +599.000000,682.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +FigDpadL +170.000000 +4.000000 +432.000000,780.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +DpadR +1280.000000 +720.000000 +48 + + + +FigDpadR +140.000000 +4.000000 +432.000000,750.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +4.000000 +72.000000 +569.000000,682.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +LT +1280.000000 +720.000000 +48 + + + +FigLT +110.000000 +4.000000 +432.000000,530.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +RT +1280.000000 +720.000000 +48 + + + +FigRT +112.000000 +4.000000 +738.000000,530.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +LStick +1280.000000 +720.000000 +48 + + + +4.000000 +533.000000,630.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +FigLStick +105.000000 +4.000000 +432.000000,656.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +RStick +1280.000000 +720.000000 +48 + + + +4.000000 +65.000000 +690.000000,689.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +FigRStick +160.000000 +4.000000 +690.000000,750.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +LStickButton +1280.000000 +720.000000 +48 + + + +4.000000 +533.000000,660.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +FigLStickButton +105.000000 +4.000000 +432.000000,686.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +RStickButton +1280.000000 +720.000000 +48 + + + +4.000000 +690.000000,754.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +FigRStickButton +160.000000 +4.000000 +690.000000,780.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +LB +1280.000000 +720.000000 +48 + + + +FigLB +100.000000 +4.000000 +432.000000,559.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +RB +1280.000000 +720.000000 +48 + + + +FigRB +100.000000 +4.000000 +750.000000,559.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +Back +1280.000000 +720.000000 +48 + + + +4.000000 +130.000000 +599.000000,501.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +FigBack +170.000000 +4.000000 +432.000000,501.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +Start +1280.000000 +720.000000 +48 + + + +4.000000 +130.000000 +677.000000,501.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +FigStart +173.000000 +4.000000 +677.000000,501.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +Y +1280.000000 +720.000000 +48 + + + +FigY +100.000000 +4.000000 +750.000000,596.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +X +1280.000000 +720.000000 +48 + + + +FigX +131.000000 +4.000000 +719.000000,686.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +4.000000 +63.000000 +719.000000,626.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +B +1280.000000 +720.000000 +48 + + + +FigB +70.000000 +4.000000 +780.000000,626.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +A +1280.000000 +720.000000 +48 + + + +FigA +100.000000 +4.000000 +750.000000,656.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +XuiText1 +421.000000 +86.583344 +429.500031,331.416656,0.000000 +true +The names of these groups and the Fig name inside them is used in the code for placement - don't change the names! +0xff0f0f0f +0x800f0f0f +0 + + + + + +CurrentLayout +344.000000 +20.000000 +148.000000,144.000000,0.000000 +XuiLabelDarkCentredSmall + + + + +XuiBuildVer +238.000000 +28.000000 +93.000000,398.000000,0.000000 +XuiLabelDarkSmall + + + + +XuiLabel1 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + +XuiLabel2 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + +XuiLabel3 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + +XuiLabel4 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + +XuiLabel5 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + +XuiLabel6 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + +XuiLabel7 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + +XuiLabel8 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + +XuiLabel9 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + +XuiLabel10 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + +XuiLabel11 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + +XuiLabel12 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + +XuiLabel13 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + +XuiLabel14 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + +XuiLabel15 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + +XuiLabel16 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + +XuiLabel17 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_controls_small.h b/Minecraft.Client/Common/Media/xuiscene_controls_small.h new file mode 100644 index 00000000..f86df2ae --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_controls_small.h @@ -0,0 +1,65 @@ +#define IDC_Controller L"Controller" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_SchemeList L"SchemeList" +#define IDC_InvertLook L"InvertLook" +#define IDC_SouthPaw L"SouthPaw" +#define IDC_FigDpad L"FigDpad" +#define IDC_Dpad L"Dpad" +#define IDC_FigDpadL L"FigDpadL" +#define IDC_DpadL L"DpadL" +#define IDC_FigDpadR L"FigDpadR" +#define IDC_DpadR L"DpadR" +#define IDC_FigLT L"FigLT" +#define IDC_LT L"LT" +#define IDC_FigRT L"FigRT" +#define IDC_RT L"RT" +#define IDC_FigLStick L"FigLStick" +#define IDC_LStick L"LStick" +#define IDC_FigRStick L"FigRStick" +#define IDC_RStick L"RStick" +#define IDC_FigLStickButton L"FigLStickButton" +#define IDC_LStickButton L"LStickButton" +#define IDC_FigRStickButton L"FigRStickButton" +#define IDC_RStickButton L"RStickButton" +#define IDC_FigLB L"FigLB" +#define IDC_LB L"LB" +#define IDC_FigRB L"FigRB" +#define IDC_RB L"RB" +#define IDC_FigBack L"FigBack" +#define IDC_Back L"Back" +#define IDC_FigStart L"FigStart" +#define IDC_Start L"Start" +#define IDC_FigY L"FigY" +#define IDC_Y L"Y" +#define IDC_FigX L"FigX" +#define IDC_X L"X" +#define IDC_FigB L"FigB" +#define IDC_B L"B" +#define IDC_FigA L"FigA" +#define IDC_A L"A" +#define IDC_FigGroup L"FigGroup" +#define IDC_CurrentLayout L"CurrentLayout" +#define IDC_XuiBuildVer L"XuiBuildVer" +#define IDC_XuiLabel1 L"XuiLabel1" +#define IDC_XuiLabel2 L"XuiLabel2" +#define IDC_XuiLabel3 L"XuiLabel3" +#define IDC_XuiLabel4 L"XuiLabel4" +#define IDC_XuiLabel5 L"XuiLabel5" +#define IDC_XuiLabel6 L"XuiLabel6" +#define IDC_XuiLabel7 L"XuiLabel7" +#define IDC_XuiLabel8 L"XuiLabel8" +#define IDC_XuiLabel9 L"XuiLabel9" +#define IDC_XuiLabel10 L"XuiLabel10" +#define IDC_XuiLabel11 L"XuiLabel11" +#define IDC_XuiLabel12 L"XuiLabel12" +#define IDC_XuiLabel13 L"XuiLabel13" +#define IDC_XuiLabel14 L"XuiLabel14" +#define IDC_XuiLabel15 L"XuiLabel15" +#define IDC_XuiLabel16 L"XuiLabel16" +#define IDC_XuiLabel17 L"XuiLabel17" +#define IDC_SceneControls L"SceneControls" diff --git a/Minecraft.Client/Common/Media/xuiscene_controls_small.xui b/Minecraft.Client/Common/Media/xuiscene_controls_small.xui new file mode 100644 index 00000000..2f4c968b --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_controls_small.xui @@ -0,0 +1,1230 @@ + + +640.000000 +360.000000 + + + +SceneControls +1280.000000 +720.000000 +CScene_Controls +XuiMenuScene +SchemeList + + + +Controller +400.000000 +270.000000 +224.000000,139.000000,0.000000 +0.500000,0.500000,1.000000 +ControllerGraphic + + + + +SchemeList +366.000000 +90.000000 +137.000000,35.000000,0.000000 +CXuiCtrl4JList +XuiLayoutListSmall +InvertLook + + + +control_ListItem +100.000000 +20.000000 +16.000000,32.000000,0.000000 +5 +false + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +84.000000 +24.000000 +40.000000,30.000000,0.000000 +5 +false +XuiLayoutListButtonSmall +1 +84.000000,24.000000,0.000000 +17.000000,0.000000,0.000000 + + + + +control_ListItem +84.000000 +24.000000 +40.000000,30.000000,0.000000 +5 +false +XuiLayoutListButtonSmall +1 +84.000000,24.000000,0.000000 +17.000000,0.000000,0.000000 + + + + +control_ListItem +84.000000 +24.000000 +40.000000,30.000000,0.000000 +5 +false +XuiLayoutListButtonSmall +1 +84.000000,24.000000,0.000000 +17.000000,0.000000,0.000000 + + + + +control_ListItem +84.000000 +24.000000 +40.000000,30.000000,0.000000 +5 +false +XuiLayoutListButtonSmall +1 +84.000000,24.000000,0.000000 +17.000000,0.000000,0.000000 + + + + + +InvertLook +156.000000 +20.000000 +156.999969,95.000000,0.000000 +XuiCheckboxSmall +SouthPaw +SouthPaw +SchemeList +22528 + + + + +SouthPaw +156.000000 +20.000000 +324.000000,95.000000,0.000000 +XuiCheckboxSmall +InvertLook +InvertLook +SchemeList +22528 + + + + +FigGroup +1280.000000 +720.000000 +0.500000,0.500000,0.500000 +48 + + + +Dpad +1280.000000 +720.000000 +48 + + + +FigDpad +155.000000 +4.000000 +432.000000,542.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +4.000000 +82.000000 +584.000000,464.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +DpadL +1280.000000 +720.000000 +48 + + + +4.000000 +102.000000 +599.000000,462.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +FigDpadL +170.000000 +4.000000 +432.000000,560.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +DpadR +1280.000000 +720.000000 +48 + + + +FigDpadR +140.000000 +4.000000 +432.000000,530.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +4.000000 +72.000000 +569.000000,462.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +LT +1280.000000 +720.000000 +48 + + + +FigLT +110.000000 +4.000000 +432.000000,310.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +RT +1280.000000 +720.000000 +48 + + + +FigRT +112.000000 +4.000000 +738.000000,310.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +LStick +1280.000000 +720.000000 +48 + + + +4.000000 +533.000000,410.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +FigLStick +105.000000 +4.000000 +432.000000,436.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +RStick +1280.000000 +720.000000 +48 + + + +4.000000 +65.000000 +690.000000,469.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +FigRStick +160.000000 +4.000000 +690.000000,530.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +LStickButton +1280.000000 +720.000000 +48 + + + +4.000000 +533.000000,440.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +FigLStickButton +105.000000 +4.000000 +432.000000,466.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +RStickButton +1280.000000 +720.000000 +48 + + + +4.000000 +690.000000,534.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +FigRStickButton +160.000000 +4.000000 +690.000000,560.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +LB +1280.000000 +720.000000 +48 + + + +FigLB +100.000000 +4.000000 +432.000000,339.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +RB +1280.000000 +720.000000 +48 + + + +FigRB +100.000000 +4.000000 +750.000000,339.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +Back +1280.000000 +720.000000 +48 + + + +4.000000 +130.000000 +599.000000,281.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +FigBack +170.000000 +4.000000 +432.000000,281.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +Start +1280.000000 +720.000000 +48 + + + +4.000000 +130.000000 +677.000000,281.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +FigStart +173.000000 +4.000000 +677.000000,281.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +Y +1280.000000 +720.000000 +48 + + + +FigY +100.000000 +4.000000 +750.000000,376.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +X +1280.000000 +720.000000 +48 + + + +FigX +131.000000 +4.000000 +719.000000,466.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +4.000000 +63.000000 +719.000000,406.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +B +1280.000000 +720.000000 +48 + + + +FigB +70.000000 +4.000000 +780.000000,406.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +A +1280.000000 +720.000000 +48 + + + +FigA +100.000000 +4.000000 +750.000000,436.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +XuiText1 +421.000000 +86.583344 +433.000000,256.416656,0.000000 +true +The names of these groups and the Fig name inside them is used in the code for placement - don't change the names! +0xff0f0f0f +0x800f0f0f +0 + + + + + +CurrentLayout +344.000000 +20.000000 +148.000000,44.000000,0.000000 +XuiLabelDarkCentredSmall + + + + +XuiBuildVer +238.000000 +28.000000 +93.000000,331.000000,0.000000 +XuiLabelDark + + + + +XuiLabel1 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + +XuiLabel2 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + +XuiLabel3 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + +XuiLabel4 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + +XuiLabel5 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + +XuiLabel6 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + +XuiLabel7 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + +XuiLabel8 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + +XuiLabel9 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + +XuiLabel10 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + +XuiLabel11 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + +XuiLabel12 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + +XuiLabel13 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + +XuiLabel14 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + +XuiLabel15 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + +XuiLabel16 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + +XuiLabel17 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_craftingpanel_2x2.h b/Minecraft.Client/Common/Media/xuiscene_craftingpanel_2x2.h new file mode 100644 index 00000000..1aae9c9c --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_craftingpanel_2x2.h @@ -0,0 +1,197 @@ +#define IDC_MainPanel L"MainPanel" +#define IDC_TabImage1 L"TabImage1" +#define IDC_TabImage2 L"TabImage2" +#define IDC_TabImage3 L"TabImage3" +#define IDC_TabImage4 L"TabImage4" +#define IDC_TabImage5 L"TabImage5" +#define IDC_TabImage6 L"TabImage6" +#define IDC_TabImage7 L"TabImage7" +#define IDC_Group_Tab_Images L"Group_Tab_Images" +#define IDC_Icon_1 L"Icon_1" +#define IDC_Icon_2 L"Icon_2" +#define IDC_Icon_3 L"Icon_3" +#define IDC_Icon_4 L"Icon_4" +#define IDC_Icon_5 L"Icon_5" +#define IDC_Icon_6 L"Icon_6" +#define IDC_Icon_7 L"Icon_7" +#define IDC_Group_Tab_Icons L"Group_Tab_Icons" +#define IDC_XuiGroupName L"XuiGroupName" +#define IDC_XuiHSlot0 L"XuiHSlot0" +#define IDC_XuiHSlot1 L"XuiHSlot1" +#define IDC_XuiHSlot2 L"XuiHSlot2" +#define IDC_XuiHSlot3 L"XuiHSlot3" +#define IDC_XuiHSlot4 L"XuiHSlot4" +#define IDC_XuiHSlot5 L"XuiHSlot5" +#define IDC_XuiHSlot6 L"XuiHSlot6" +#define IDC_XuiHSlot7 L"XuiHSlot7" +#define IDC_XuiHSlot8 L"XuiHSlot8" +#define IDC_XuiHSlot9 L"XuiHSlot9" +#define IDC_XuiImageScrollBar L"XuiImageScrollBar" +#define IDC_XuiImageScrollBar2Slot L"XuiImageScrollBar2Slot" +#define IDC_XuiVSlot0 L"XuiVSlot0" +#define IDC_XuiVSlot1 L"XuiVSlot1" +#define IDC_XuiHighlight L"XuiHighlight" +#define IDC_XuiVSlot2 L"XuiVSlot2" +#define IDC_XuiHSlot10 L"XuiHSlot10" +#define IDC_XuiHSlot11 L"XuiHSlot11" +#define IDC_SceneCraftScrollGroup L"SceneCraftScrollGroup" +#define IDC_CraftingInput1 L"CraftingInput1" +#define IDC_CraftingInput2 L"CraftingInput2" +#define IDC_CraftingInput3 L"CraftingInput3" +#define IDC_CraftingInput4 L"CraftingInput4" +#define IDC_CraftingArrow L"CraftingArrow" +#define IDC_CraftingOutputRed L"CraftingOutputRed" +#define IDC_XuiHTMLText L"XuiHTMLText" +#define IDC_XuiItemName L"XuiItemName" +#define IDC_Inventory L"Inventory" +#define IDC_Ingredient4 L"Ingredient4" +#define IDC_Ingredient3 L"Ingredient3" +#define IDC_Ingredient2 L"Ingredient2" +#define IDC_Ingredient1 L"Ingredient1" +#define IDC_CraftingInput5 L"CraftingInput5" +#define IDC_CraftingInput6 L"CraftingInput6" +#define IDC_CraftingInput7 L"CraftingInput7" +#define IDC_CraftingInput8 L"CraftingInput8" +#define IDC_CraftingInput9 L"CraftingInput9" +#define IDC_Grid L"Grid" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Inventory L"Inventory" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_UseRow L"UseRow" +#define IDC_InventoryGrid L"InventoryGrid" +#define IDC_Group L"Group" +#define IDC_XuiCraftingPanel L"XuiCraftingPanel" diff --git a/Minecraft.Client/Common/Media/xuiscene_craftingpanel_2x2.xui b/Minecraft.Client/Common/Media/xuiscene_craftingpanel_2x2.xui new file mode 100644 index 00000000..1f619cc3 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_craftingpanel_2x2.xui @@ -0,0 +1,2605 @@ + + +1280.000000 +720.000000 + + + +XuiCraftingPanel +1280.000000 +720.000000 +CXuiSceneCraftingPanel +XuiMenuScene + + + +Group +1280.000000 +720.000000 +15 + + + +MainPanel +591.000000 +490.000000 +344.000000,114.000000,0.000000 +CraftingPanel2x2 + + + + +Group_Tab_Images +1280.000000 +200.000000 +0.000000,20.000000,0.000000 +48 + + + +TabImage1 +107.000000 +85.000000 +341.000000,89.000000,0.000000 +false +CraftingPanelTabLeft + + + + +TabImage2 +107.000000 +85.000000 +439.000000,89.000000,0.000000 +false +CraftingPanelTabMiddle + + + + +TabImage3 +107.000000 +85.000000 +537.000000,89.000000,0.000000 +false +CraftingPanelTabMiddle + + + + +TabImage4 +107.000000 +85.000000 +635.000000,89.000000,0.000000 +false +CraftingPanelTabMiddle + + + + +TabImage5 +107.000000 +85.000000 +733.000000,89.000000,0.000000 +false +CraftingPanelTabMiddle + + + + +TabImage6 +107.000000 +85.000000 +831.000000,89.000000,0.000000 +false +CraftingPanelTabRight + + + + +TabImage7 +107.000000 +85.000000 +929.000000,89.000000,0.000000 +false +CraftingPanelTabRight + + + + + +Group_Tab_Icons +1280.000000 +200.000000 +0.000000,-24.000000,0.000000 +48 + + + +Icon_1 +48.000000 +48.000000 +370.000000,152.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_2 +48.000000 +48.000000 +468.000000,152.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_3 +48.000000 +48.000000 +566.000000,152.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_4 +48.000000 +48.000000 +664.000000,152.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_5 +48.000000 +48.000000 +763.000000,152.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_6 +48.000000 +48.000000 +861.000000,152.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_7 +48.000000 +48.000000 +959.000000,152.000000,0.000000 +false +CraftingCategoryIcon + + + + + +XuiGroupName +568.000000 +27.000000 +356.000000,208.000000,0.000000 +XuiLabelDarkCentred + + + + +SceneCraftScrollGroup +1280.000000 +720.000000 +48 + + + +XuiHSlot0 +46.000000 +46.000000 +375.000000,259.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot1 +46.000000 +46.000000 +429.000000,259.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot2 +46.000000 +46.000000 +483.000000,259.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot3 +46.000000 +46.000000 +537.000000,259.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot4 +46.000000 +46.000000 +591.000000,259.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot5 +46.000000 +46.000000 +645.000000,259.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot6 +46.000000 +46.000000 +699.000000,259.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot7 +46.000000 +46.000000 +753.000000,259.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot8 +46.000000 +46.000000 +807.000000,259.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot9 +46.000000 +46.000000 +861.000000,259.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiImageScrollBar +80.000000 +258.000000 +357.000000,153.000000,0.000000 +CraftingPanelVScroll3 + + + + +XuiImageScrollBar2Slot +80.000000 +204.000000 +357.000000,207.000000,0.000000 +CraftingPanelVScroll2 + + + + +XuiVSlot0 +46.000000 +46.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiVSlot1 +46.000000 +46.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHighlight +72.000000 +72.000000 +361.000000,245.000000,0.000000 +CraftingPanelHighlight + + + + +XuiVSlot2 +46.000000 +46.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot10 +46.000000 +46.000000 +861.000000,259.000000,0.000000 +4 +false +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot11 +46.000000 +46.000000 +861.000000,259.000000,0.000000 +4 +false +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + + +Grid +242.000000 +96.000000 +363.000000,457.000000,0.000000 + + + +CraftingInput1 +48.000000 +48.000000 +10.000000,0.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +CraftingInput2 +48.000000 +48.000000 +58.000000,0.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +CraftingInput3 +48.000000 +48.000000 +10.000000,48.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +CraftingInput4 +48.000000 +48.000000 +58.000000,48.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +CraftingArrow +32.000000 +32.000000 +118.000000,30.000000,0.000000 +CraftingProgressArrowSmall + + + + +CraftingOutputRed +72.000000 +72.000000 +160.000000,10.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRed72 + + + + +XuiHTMLText +283.000000 +156.000000 +262.000000,-49.000000,0.000000 +false +XuiHtmlControl + + + + +XuiItemName +246.000000 +50.000000 +-3.000000,-52.000000,0.000000 +XuiLabelDarkCentredWrap + + + + +Inventory +298.000000 +27.000000 +255.000000,-52.000000,0.000000 +false +XuiLabelDarkCentred + + + + +Ingredient4 +32.000000 +32.000000 +269.000000,87.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +Ingredient3 +32.000000 +32.000000 +269.000000,53.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +Ingredient2 +32.000000 +32.000000 +269.000000,17.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +Ingredient1 +32.000000 +32.000000 +269.000000,-19.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +CraftingInput5 +48.000000 +48.000000 +53.000000,48.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +CraftingInput6 +48.000000 +48.000000 +53.000000,48.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +CraftingInput7 +48.000000 +48.000000 +53.000000,48.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +CraftingInput8 +48.000000 +48.000000 +53.000000,48.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +CraftingInput9 +48.000000 +48.000000 +53.000000,48.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + + +InventoryGrid +290.000000 +144.000000 +622.000000,439.000000,0.000000 + + + +Inventory +288.000000 +96.000000 +8 +CXuiCtrlSlotList +ItemGridVertical32 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + + +UseRow +288.000000 +32.000000 +-0.000000,112.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical32 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +0.000000,0.000000,0.000000 + + + +0 +0.000000,0.000000,0.000000 + + + +2 +100 +-100 +50 +0.000000,0.000000,0.000000 + + + +0 +-261.000000,0.000000,0.000000 + + + +2 +100 +-100 +50 +-261.000000,0.000000,0.000000 + + + +0 +0.000000,0.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_craftingpanel_2x2_480.h b/Minecraft.Client/Common/Media/xuiscene_craftingpanel_2x2_480.h new file mode 100644 index 00000000..087e891d --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_craftingpanel_2x2_480.h @@ -0,0 +1,211 @@ +#define IDC_MainPanel L"MainPanel" +#define IDC_TabImage1 L"TabImage1" +#define IDC_TabImage2 L"TabImage2" +#define IDC_TabImage3 L"TabImage3" +#define IDC_TabImage4 L"TabImage4" +#define IDC_TabImage5 L"TabImage5" +#define IDC_TabImage6 L"TabImage6" +#define IDC_TabImage7 L"TabImage7" +#define IDC_Group_Tab_Images L"Group_Tab_Images" +#define IDC_Icon_1 L"Icon_1" +#define IDC_Icon_2 L"Icon_2" +#define IDC_Icon_3 L"Icon_3" +#define IDC_Icon_4 L"Icon_4" +#define IDC_Icon_5 L"Icon_5" +#define IDC_Icon_6 L"Icon_6" +#define IDC_Icon_7 L"Icon_7" +#define IDC_Group_Tab_Icons L"Group_Tab_Icons" +#define IDC_XuiImageScrollBar L"XuiImageScrollBar" +#define IDC_XuiImageScrollBar2Slot L"XuiImageScrollBar2Slot" +#define IDC_XuiVSlot0 L"XuiVSlot0" +#define IDC_XuiVSlot1 L"XuiVSlot1" +#define IDC_XuiHighlight L"XuiHighlight" +#define IDC_XuiVSlot2 L"XuiVSlot2" +#define IDC_XuiHSlot0 L"XuiHSlot0" +#define IDC_XuiHSlot1 L"XuiHSlot1" +#define IDC_XuiHSlot2 L"XuiHSlot2" +#define IDC_XuiHSlot3 L"XuiHSlot3" +#define IDC_XuiHSlot4 L"XuiHSlot4" +#define IDC_XuiHSlot5 L"XuiHSlot5" +#define IDC_XuiHSlot6 L"XuiHSlot6" +#define IDC_XuiHSlot7 L"XuiHSlot7" +#define IDC_XuiHSlot8 L"XuiHSlot8" +#define IDC_XuiHSlot9 L"XuiHSlot9" +#define IDC_XuiHSlot10 L"XuiHSlot10" +#define IDC_XuiHSlot11 L"XuiHSlot11" +#define IDC_SceneCraftScrollGroup L"SceneCraftScrollGroup" +#define IDC_CraftingArrow L"CraftingArrow" +#define IDC_CraftingInput1 L"CraftingInput1" +#define IDC_CraftingInput2 L"CraftingInput2" +#define IDC_CraftingInput3 L"CraftingInput3" +#define IDC_CraftingInput4 L"CraftingInput4" +#define IDC_CraftingOutputRed L"CraftingOutputRed" +#define IDC_XuiHTMLText L"XuiHTMLText" +#define IDC_XuiItemName L"XuiItemName" +#define IDC_Inventory L"Inventory" +#define IDC_Ingredient4 L"Ingredient4" +#define IDC_Ingredient3 L"Ingredient3" +#define IDC_Ingredient2 L"Ingredient2" +#define IDC_Ingredient1 L"Ingredient1" +#define IDC_CraftingInput5 L"CraftingInput5" +#define IDC_CraftingInput6 L"CraftingInput6" +#define IDC_CraftingInput7 L"CraftingInput7" +#define IDC_CraftingInput8 L"CraftingInput8" +#define IDC_CraftingInput9 L"CraftingInput9" +#define IDC_Grid L"Grid" +#define IDC_XuiGroupName L"XuiGroupName" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Inventory L"Inventory" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_UseRow L"UseRow" +#define IDC_InventoryGrid L"InventoryGrid" +#define IDC_Group L"Group" +#define IDC_XuiCraftingPanel L"XuiCraftingPanel" diff --git a/Minecraft.Client/Common/Media/xuiscene_craftingpanel_2x2_480.xui b/Minecraft.Client/Common/Media/xuiscene_craftingpanel_2x2_480.xui new file mode 100644 index 00000000..1793b086 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_craftingpanel_2x2_480.xui @@ -0,0 +1,2772 @@ + + +640.000000 +480.000000 + + + +XuiCraftingPanel +640.000000 +480.000000 +CXuiSceneCraftingPanel +XuiMenuScene + + + +Group +640.000000 +480.000000 +15 + + + +MainPanel +420.000000 +284.000000 +110.000000,98.000000,0.000000 +CraftingPanel2x2Small + + + + +Group_Tab_Images +640.000000 +50.000000 +0.000000,96.000000,0.000000 +48 + + + +TabImage1 +72.000000 +56.000000 +110.000000,0.000000,0.000000 +false +CraftingPanelTabLeftSmall + + + + +TabImage2 +72.000000 +56.000000 +180.000000,0.000000,0.000000 +false +CraftingPanelTabMiddleSmall + + + + +TabImage3 +72.000000 +56.000000 +249.000000,0.000000,0.000000 +false +CraftingPanelTabMiddleSmall + + + + +TabImage4 +72.000000 +56.000000 +319.000000,0.000000,0.000000 +false +CraftingPanelTabMiddleSmall + + + + +TabImage5 +72.000000 +56.000000 +389.000000,0.000000,0.000000 +false +CraftingPanelTabMiddleSmall + + + + +TabImage6 +72.000000 +56.000000 +458.000000,0.000000,0.000000 +false +CraftingPanelTabRightSmall + + + + +TabImage7 +72.000000 +56.000000 +528.000000,0.000000,0.000000 +false +CraftingPanelTabRightSmall + + + + + +Group_Tab_Icons +640.000000 +50.000000 +0.000000,96.000000,0.000000 +48 + + + +Icon_1 +32.000000 +32.000000 +130.000000,14.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_2 +32.000000 +32.000000 +200.000000,14.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_3 +32.000000 +32.000000 +270.000000,14.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_4 +32.000000 +32.000000 +339.000000,14.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_5 +32.000000 +32.000000 +409.000000,14.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_6 +32.000000 +32.000000 +479.000000,14.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_7 +32.000000 +32.000000 +549.000000,14.000000,0.000000 +false +CraftingCategoryIcon + + + + + +SceneCraftScrollGroup +640.000000 +135.000000 +0.000000,94.000000,0.000000 +48 + + + +XuiImageScrollBar +22.000000 +67.000000 +134.000000,72.000000,0.000000 +CraftingPanelVScrollSmall + + + + +XuiImageScrollBar2Slot +22.000000 +67.000000 +134.000000,72.000000,0.000000 +CraftingPanelVScrollSmall + + + + +XuiVSlot0 +34.000000 +34.000000 +620.000000,90.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiVSlot1 +34.000000 +34.000000 +620.000000,90.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHighlight +43.000000 +43.000000 +123.000000,84.000000,0.000000 +CraftingPanelHighlightSmall + + + + +XuiVSlot2 +34.000000 +34.000000 +620.000000,90.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot0 +34.000000 +34.000000 +128.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot1 +34.000000 +34.000000 +167.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot2 +34.000000 +34.000000 +206.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot3 +34.000000 +34.000000 +245.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot4 +34.000000 +34.000000 +284.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot5 +34.000000 +34.000000 +323.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot6 +34.000000 +34.000000 +362.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot7 +34.000000 +34.000000 +401.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot8 +34.000000 +34.000000 +439.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot9 +34.000000 +34.000000 +478.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot10 +34.000000 +34.000000 +515.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot11 +34.000000 +34.000000 +529.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + + +Grid +170.000000 +132.000000 +123.000000,235.000000,0.000000 + + + +CraftingArrow +32.000000 +32.000000 +82.000000,70.000000,0.000000 +CraftingProgressArrowSmall + + + + +CraftingInput1 +38.000000 +38.000000 +3.000000,49.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +CraftingInput2 +38.000000 +38.000000 +41.000000,49.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +CraftingInput3 +38.000000 +38.000000 +3.000000,87.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +CraftingInput4 +38.000000 +38.000000 +41.000000,87.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +CraftingOutputRed +50.000000 +50.000000 +117.000000,62.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +XuiHTMLText +207.177460 +114.567886 +182.893524,2.411270,0.000000 +false +XuiHtmlControl + + + + +XuiItemName +160.283936 +49.035492 +4.858025,0.000000,0.000000 +XuiLabelDarkCentredWrapSmall + + + + +Inventory +212.000000 +21.000000 +180.000000,0.000000,0.000000 +false +XuiLabelDarkCentredWrapSmall + + + + +Ingredient4 +26.000000 +26.000000 +182.000000,105.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +Ingredient3 +26.000000 +26.000000 +182.000000,77.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +Ingredient2 +26.000000 +26.000000 +182.000000,49.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +Ingredient1 +26.000000 +26.000000 +182.000000,21.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +CraftingInput5 +38.000000 +38.000000 +43.000000,48.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +CraftingInput6 +38.000000 +38.000000 +43.000000,48.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +CraftingInput7 +38.000000 +38.000000 +43.000000,48.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +CraftingInput8 +38.000000 +38.000000 +43.000000,48.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +CraftingInput9 +38.000000 +38.000000 +43.000000,48.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + + +XuiGroupName +408.000000 +27.000000 +116.000000,153.000000,0.000000 +XuiLabelDarkCentredSmall + + + + +InventoryGrid +207.000000 +99.000000 +306.000000,260.000000,0.000000 + + + +Inventory +198.000000 +66.000000 +4.000000,0.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical22 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + + +UseRow +198.000000 +22.000000 +4.000000,76.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical22 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_craftingpanel_2x2_small.h b/Minecraft.Client/Common/Media/xuiscene_craftingpanel_2x2_small.h new file mode 100644 index 00000000..6d525034 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_craftingpanel_2x2_small.h @@ -0,0 +1,193 @@ +#define IDC_MainPanel L"MainPanel" +#define IDC_TabImage1 L"TabImage1" +#define IDC_TabImage2 L"TabImage2" +#define IDC_TabImage3 L"TabImage3" +#define IDC_TabImage4 L"TabImage4" +#define IDC_TabImage5 L"TabImage5" +#define IDC_TabImage6 L"TabImage6" +#define IDC_TabImage7 L"TabImage7" +#define IDC_Group_Tab_Images L"Group_Tab_Images" +#define IDC_Icon_1 L"Icon_1" +#define IDC_Icon_2 L"Icon_2" +#define IDC_Icon_3 L"Icon_3" +#define IDC_Icon_4 L"Icon_4" +#define IDC_Icon_5 L"Icon_5" +#define IDC_Icon_6 L"Icon_6" +#define IDC_Icon_7 L"Icon_7" +#define IDC_Group_Tab_Icons L"Group_Tab_Icons" +#define IDC_XuiImageScrollBar L"XuiImageScrollBar" +#define IDC_XuiImageScrollBar2Slot L"XuiImageScrollBar2Slot" +#define IDC_XuiVSlot0 L"XuiVSlot0" +#define IDC_XuiVSlot1 L"XuiVSlot1" +#define IDC_XuiHighlight L"XuiHighlight" +#define IDC_XuiVSlot2 L"XuiVSlot2" +#define IDC_XuiHSlot0 L"XuiHSlot0" +#define IDC_XuiHSlot1 L"XuiHSlot1" +#define IDC_XuiHSlot2 L"XuiHSlot2" +#define IDC_XuiHSlot3 L"XuiHSlot3" +#define IDC_XuiHSlot4 L"XuiHSlot4" +#define IDC_XuiHSlot5 L"XuiHSlot5" +#define IDC_XuiHSlot6 L"XuiHSlot6" +#define IDC_XuiHSlot7 L"XuiHSlot7" +#define IDC_XuiHSlot8 L"XuiHSlot8" +#define IDC_XuiHSlot9 L"XuiHSlot9" +#define IDC_XuiHSlot10 L"XuiHSlot10" +#define IDC_XuiHSlot11 L"XuiHSlot11" +#define IDC_SceneCraftScrollGroup L"SceneCraftScrollGroup" +#define IDC_CraftingArrow L"CraftingArrow" +#define IDC_CraftingInput1 L"CraftingInput1" +#define IDC_CraftingInput2 L"CraftingInput2" +#define IDC_CraftingInput3 L"CraftingInput3" +#define IDC_CraftingInput4 L"CraftingInput4" +#define IDC_CraftingOutputRed L"CraftingOutputRed" +#define IDC_XuiHTMLText L"XuiHTMLText" +#define IDC_XuiItemName L"XuiItemName" +#define IDC_Inventory L"Inventory" +#define IDC_Ingredient4 L"Ingredient4" +#define IDC_Ingredient3 L"Ingredient3" +#define IDC_Ingredient2 L"Ingredient2" +#define IDC_Ingredient1 L"Ingredient1" +#define IDC_CraftingInput5 L"CraftingInput5" +#define IDC_CraftingInput6 L"CraftingInput6" +#define IDC_CraftingInput7 L"CraftingInput7" +#define IDC_CraftingInput8 L"CraftingInput8" +#define IDC_CraftingInput9 L"CraftingInput9" +#define IDC_Grid L"Grid" +#define IDC_XuiGroupName L"XuiGroupName" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Inventory L"Inventory" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_UseRow L"UseRow" +#define IDC_InventoryGrid L"InventoryGrid" +#define IDC_Group L"Group" +#define IDC_XuiCraftingPanel L"XuiCraftingPanel" diff --git a/Minecraft.Client/Common/Media/xuiscene_craftingpanel_2x2_small.xui b/Minecraft.Client/Common/Media/xuiscene_craftingpanel_2x2_small.xui new file mode 100644 index 00000000..12d44c35 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_craftingpanel_2x2_small.xui @@ -0,0 +1,2557 @@ + + +530.000000 +290.000000 + + + +XuiCraftingPanel +640.000000 +360.000000 +CXuiSceneCraftingPanel +XuiMenuScene + + + +Group +640.000000 +360.000000 +15 + + + +MainPanel +420.000000 +284.000000 +110.000000,3.000000,0.000000 +CraftingPanel2x2Small + + + + +Group_Tab_Images +640.000000 +50.000000 +48 + + + +TabImage1 +72.000000 +56.000000 +110.000000,1.000000,0.000000 +false +CraftingPanelTabLeftSmall + + + + +TabImage2 +72.000000 +56.000000 +180.000000,1.000000,0.000000 +false +CraftingPanelTabMiddleSmall + + + + +TabImage3 +72.000000 +56.000000 +249.000000,1.000000,0.000000 +false +CraftingPanelTabMiddleSmall + + + + +TabImage4 +72.000000 +56.000000 +319.000000,1.000000,0.000000 +false +CraftingPanelTabMiddleSmall + + + + +TabImage5 +72.000000 +56.000000 +389.000000,1.000000,0.000000 +false +CraftingPanelTabMiddleSmall + + + + +TabImage6 +72.000000 +56.000000 +458.000000,1.000000,0.000000 +false +CraftingPanelTabRightSmall + + + + +TabImage7 +72.000000 +56.000000 +528.000000,1.000000,0.000000 +false +CraftingPanelTabRightSmall + + + + + +Group_Tab_Icons +640.000000 +50.000000 +48 + + + +Icon_1 +32.000000 +32.000000 +130.000000,14.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_2 +32.000000 +32.000000 +200.000000,14.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_3 +32.000000 +32.000000 +270.000000,14.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_4 +32.000000 +32.000000 +339.000000,14.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_5 +32.000000 +32.000000 +409.000000,14.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_6 +32.000000 +32.000000 +479.000000,14.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_7 +32.000000 +32.000000 +549.000000,14.000000,0.000000 +false +CraftingCategoryIcon + + + + + +SceneCraftScrollGroup +640.000000 +135.000000 +48 + + + +XuiImageScrollBar +22.000000 +67.000000 +134.000000,72.000000,0.000000 +CraftingPanelVScrollSmall + + + + +XuiImageScrollBar2Slot +22.000000 +67.000000 +134.000000,72.000000,0.000000 +CraftingPanelVScrollSmall + + + + +XuiVSlot0 +34.000000 +34.000000 +620.000000,93.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiVSlot1 +34.000000 +34.000000 +620.000000,93.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHighlight +43.000000 +43.000000 +123.000000,84.000000,0.000000 +CraftingPanelHighlightSmall + + + + +XuiVSlot2 +34.000000 +34.000000 +620.000000,93.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot0 +34.000000 +34.000000 +128.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot1 +34.000000 +34.000000 +167.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot2 +34.000000 +34.000000 +206.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot3 +34.000000 +34.000000 +245.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot4 +34.000000 +34.000000 +284.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot5 +34.000000 +34.000000 +323.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot6 +34.000000 +34.000000 +362.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot7 +34.000000 +34.000000 +401.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot8 +34.000000 +34.000000 +439.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot9 +34.000000 +34.000000 +478.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot10 +34.000000 +34.000000 +515.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot11 +34.000000 +34.000000 +529.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + + +Grid +170.000000 +132.000000 +123.000000,140.000000,0.000000 + + + +CraftingArrow +32.000000 +32.000000 +82.000000,75.000000,0.000000 +CraftingProgressArrowSmall + + + + +CraftingInput1 +38.000000 +38.000000 +3.000000,54.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +CraftingInput2 +38.000000 +38.000000 +41.000000,54.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +CraftingInput3 +38.000000 +38.000000 +3.000000,92.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +CraftingInput4 +38.000000 +38.000000 +41.000000,92.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +CraftingOutputRed +50.000000 +50.000000 +117.000000,67.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +XuiHTMLText +204.000000 +108.000000 +184.000000,0.000000,0.000000 +false +XuiHtmlControl + + + + +XuiItemName +168.000000 +50.000000 +1.000000,0.000000,0.000000 +XuiLabelDarkCentredWrapSmall + + + + +Inventory +212.000000 +21.000000 +180.000000,0.000000,0.000000 +false +XuiLabelDarkCentredWrapSmall + + + + +Ingredient4 +26.000000 +26.000000 +187.000000,105.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +Ingredient3 +26.000000 +26.000000 +187.000000,77.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +Ingredient2 +26.000000 +26.000000 +187.000000,49.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +Ingredient1 +26.000000 +26.000000 +187.000000,21.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +CraftingInput5 +38.000000 +38.000000 +43.000000,48.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +CraftingInput6 +38.000000 +38.000000 +43.000000,48.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +CraftingInput7 +38.000000 +38.000000 +43.000000,48.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +CraftingInput8 +38.000000 +38.000000 +43.000000,48.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +CraftingInput9 +38.000000 +38.000000 +43.000000,48.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + + +XuiGroupName +408.000000 +27.000000 +116.000000,58.000000,0.000000 +XuiLabelDarkCentredSmall + + + + +InventoryGrid +207.000000 +99.000000 +306.000000,170.000000,0.000000 + + + +Inventory +198.000000 +66.000000 +4.000000,0.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical22 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + + +UseRow +198.000000 +22.000000 +4.000000,76.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical22 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +0.000000,0.000000,0.000000 + + + +0 +0.000000,0.000000,0.000000 + + + +2 +100 +-100 +50 +0.000000,0.000000,0.000000 + + + +0 +-261.000000,0.000000,0.000000 + + + +2 +100 +-100 +50 +-261.000000,0.000000,0.000000 + + + +0 +0.000000,0.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_craftingpanel_3x3.h b/Minecraft.Client/Common/Media/xuiscene_craftingpanel_3x3.h new file mode 100644 index 00000000..cd3c9870 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_craftingpanel_3x3.h @@ -0,0 +1,249 @@ +#define IDC_MainPanel L"MainPanel" +#define IDC_TabImage1 L"TabImage1" +#define IDC_TabImage2 L"TabImage2" +#define IDC_TabImage3 L"TabImage3" +#define IDC_TabImage4 L"TabImage4" +#define IDC_TabImage5 L"TabImage5" +#define IDC_TabImage6 L"TabImage6" +#define IDC_TabImage7 L"TabImage7" +#define IDC_Group_Tab_Images L"Group_Tab_Images" +#define IDC_Icon_1 L"Icon_1" +#define IDC_Icon_2 L"Icon_2" +#define IDC_Icon_3 L"Icon_3" +#define IDC_Icon_4 L"Icon_4" +#define IDC_Icon_5 L"Icon_5" +#define IDC_Icon_6 L"Icon_6" +#define IDC_Icon_7 L"Icon_7" +#define IDC_Group_Tab_Icons L"Group_Tab_Icons" +#define IDC_XuiGroupName L"XuiGroupName" +#define IDC_XuiHSlot0 L"XuiHSlot0" +#define IDC_XuiHSlot1 L"XuiHSlot1" +#define IDC_XuiHSlot2 L"XuiHSlot2" +#define IDC_XuiHSlot3 L"XuiHSlot3" +#define IDC_XuiHSlot4 L"XuiHSlot4" +#define IDC_XuiHSlot5 L"XuiHSlot5" +#define IDC_XuiHSlot6 L"XuiHSlot6" +#define IDC_XuiHSlot7 L"XuiHSlot7" +#define IDC_XuiHSlot8 L"XuiHSlot8" +#define IDC_XuiHSlot9 L"XuiHSlot9" +#define IDC_XuiHSlot10 L"XuiHSlot10" +#define IDC_XuiHSlot11 L"XuiHSlot11" +#define IDC_XuiImageScrollBar L"XuiImageScrollBar" +#define IDC_XuiImageScrollBar2Slot L"XuiImageScrollBar2Slot" +#define IDC_XuiVSlot0 L"XuiVSlot0" +#define IDC_XuiVSlot1 L"XuiVSlot1" +#define IDC_XuiHighlight L"XuiHighlight" +#define IDC_XuiVSlot2 L"XuiVSlot2" +#define IDC_SceneCraftScrollGroup L"SceneCraftScrollGroup" +#define IDC_CraftingArrow L"CraftingArrow" +#define IDC_CraftingOutputRed L"CraftingOutputRed" +#define IDC_CraftingInput1 L"CraftingInput1" +#define IDC_CraftingInput2 L"CraftingInput2" +#define IDC_CraftingInput3 L"CraftingInput3" +#define IDC_CraftingInput4 L"CraftingInput4" +#define IDC_CraftingInput5 L"CraftingInput5" +#define IDC_CraftingInput6 L"CraftingInput6" +#define IDC_CraftingInput7 L"CraftingInput7" +#define IDC_CraftingInput8 L"CraftingInput8" +#define IDC_CraftingInput9 L"CraftingInput9" +#define IDC_XuiHTMLText L"XuiHTMLText" +#define IDC_XuiItemName L"XuiItemName" +#define IDC_Inventory L"Inventory" +#define IDC_Ingredient4 L"Ingredient4" +#define IDC_Ingredient3 L"Ingredient3" +#define IDC_Ingredient2 L"Ingredient2" +#define IDC_Ingredient1 L"Ingredient1" +#define IDC_Grid L"Grid" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_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_UseRow L"UseRow" +#define IDC_InventoryGrid L"InventoryGrid" +#define IDC_Group L"Group" +#define IDC_XuiCraftingPanel L"XuiCraftingPanel" diff --git a/Minecraft.Client/Common/Media/xuiscene_craftingpanel_3x3.xui b/Minecraft.Client/Common/Media/xuiscene_craftingpanel_3x3.xui new file mode 100644 index 00000000..1895ecc3 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_craftingpanel_3x3.xui @@ -0,0 +1,3332 @@ + + +1280.000000 +720.000000 + + + +XuiCraftingPanel +1280.000000 +720.000000 +CXuiSceneCraftingPanel +XuiMenuScene + + + +Group +1280.000000 +720.000000 +15 + + + +MainPanel +689.000000 +490.000000 +295.000000,115.000000,0.000000 +CraftingPanel3x3 + + + + +Group_Tab_Images +1280.000000 +200.000000 +0.000000,20.000000,0.000000 +48 + + + +TabImage1 +107.000000 +85.000000 +292.000000,90.000000,0.000000 +false +CraftingPanelTabLeft + + + + +TabImage2 +107.000000 +85.000000 +390.000000,90.000000,0.000000 +false +CraftingPanelTabMiddle + + + + +TabImage3 +107.000000 +85.000000 +488.000000,90.000000,0.000000 +false +CraftingPanelTabMiddle + + + + +TabImage4 +107.000000 +85.000000 +586.000000,90.000000,0.000000 +false +CraftingPanelTabMiddle + + + + +TabImage5 +107.000000 +85.000000 +684.000000,90.000000,0.000000 +false +CraftingPanelTabMiddle + + + + +TabImage6 +107.000000 +85.000000 +782.000000,90.000000,0.000000 +false +CraftingPanelTabMiddle + + + + +TabImage7 +107.000000 +85.000000 +880.000000,90.000000,0.000000 +false +CraftingPanelTabRight + + + + + +Group_Tab_Icons +1280.000000 +200.000000 +0.000000,-24.000000,0.000000 +48 + + + +Icon_1 +48.000000 +48.000000 +321.000000,152.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_2 +48.000000 +48.000000 +419.000000,152.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_3 +48.000000 +48.000000 +517.000000,152.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_4 +48.000000 +48.000000 +615.000000,152.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_5 +48.000000 +48.000000 +714.000000,152.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_6 +48.000000 +48.000000 +812.000000,152.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_7 +48.000000 +48.000000 +910.000000,152.000000,0.000000 +false +CraftingCategoryIcon + + + + + +XuiGroupName +568.000000 +27.000000 +355.630280,208.000000,0.000000 +XuiLabelDarkCentred + + + + +SceneCraftScrollGroup +1280.000000 +720.000000 +48 + + + +XuiHSlot0 +46.000000 +46.000000 +320.000000,259.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot1 +46.000000 +46.000000 +374.000000,259.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot2 +46.000000 +46.000000 +428.000000,259.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot3 +46.000000 +46.000000 +482.000000,259.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot4 +46.000000 +46.000000 +536.000000,259.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot5 +46.000000 +46.000000 +590.000000,259.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot6 +46.000000 +46.000000 +644.000000,259.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot7 +46.000000 +46.000000 +698.000000,259.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot8 +46.000000 +46.000000 +752.000000,259.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot9 +46.000000 +46.000000 +806.000000,259.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot10 +46.000000 +46.000000 +860.000000,259.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot11 +46.000000 +46.000000 +914.000000,259.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiImageScrollBar +80.000000 +258.000000 +303.000000,153.000000,0.000000 +CraftingPanelVScroll3 + + + + +XuiImageScrollBar2Slot +80.000000 +204.000000 +303.000000,207.000000,0.000000 +CraftingPanelVScroll2 + + + + +XuiVSlot0 +46.000000 +46.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiVSlot1 +46.000000 +46.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHighlight +72.000000 +72.000000 +307.000000,246.000000,0.000000 +CraftingPanelHighlight + + + + +XuiVSlot2 +46.000000 +46.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + + +Grid +262.000000 +144.000000 +318.000000,427.000000,0.000000 + + + +CraftingArrow +32.000000 +32.000000 +152.000000,70.000000,0.000000 +CraftingProgressArrowSmall + + + + +CraftingOutputRed +72.000000 +72.000000 +206.000000,52.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRed72 + + + + +CraftingInput1 +46.000000 +46.000000 +0.000000,20.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +CraftingInput2 +46.000000 +46.000000 +46.000000,20.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +CraftingInput3 +46.000000 +46.000000 +92.000000,20.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +CraftingInput4 +46.000000 +46.000000 +0.000000,66.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +CraftingInput5 +46.000000 +46.000000 +46.000000,66.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +CraftingInput6 +46.000000 +46.000000 +92.000000,66.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +CraftingInput7 +46.000000 +46.000000 +0.000000,112.000031,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +CraftingInput8 +46.000000 +46.000000 +46.000031,112.000031,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +CraftingInput9 +46.000000 +46.000000 +92.000031,112.000031,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +XuiHTMLText +332.000000 +170.000000 +305.000000,-19.000000,0.000000 +false +XuiHtmlControl + + + + +XuiItemName +281.000000 +50.000000 +-2.000000,-29.000000,0.000000 +XuiLabelDarkCentredWrap +yyyyyyWWWWWWWWWWWWWWWW +yyyyyyWWWWWWWWWWWWWW + + + + +Inventory +344.000000 +27.000000 +298.000000,-24.000000,0.000000 +false +XuiLabelDarkCentred + + + + +Ingredient4 +32.000000 +32.000000 +310.000000,117.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +Ingredient3 +32.000000 +32.000000 +310.000000,81.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +Ingredient2 +32.000000 +32.000000 +310.000000,45.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +Ingredient1 +32.000000 +32.000000 +310.000000,9.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + + +InventoryGrid +290.000000 +144.000000 +646.000000,439.000000,0.000000 + + + +Inventory +288.000000 +96.000000 +8 +CXuiCtrlSlotList +ItemGridVertical32 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + + +UseRow +288.000000 +32.000000 +0.000000,112.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical32 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +0.000000,0.000000,0.000000 + + + +0 +0.000000,0.000000,0.000000 + + + +2 +100 +-100 +50 +0.000000,0.000000,0.000000 + + + +0 +-212.000000,0.000000,0.000000 + + + +2 +100 +-100 +50 +-212.000000,0.000000,0.000000 + + + +0 +0.000000,0.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_craftingpanel_3x3_480.h b/Minecraft.Client/Common/Media/xuiscene_craftingpanel_3x3_480.h new file mode 100644 index 00000000..424b28e8 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_craftingpanel_3x3_480.h @@ -0,0 +1,211 @@ +#define IDC_MainPanel L"MainPanel" +#define IDC_TabImage1 L"TabImage1" +#define IDC_TabImage2 L"TabImage2" +#define IDC_TabImage3 L"TabImage3" +#define IDC_TabImage4 L"TabImage4" +#define IDC_TabImage5 L"TabImage5" +#define IDC_TabImage6 L"TabImage6" +#define IDC_TabImage7 L"TabImage7" +#define IDC_Group_Tab_Images L"Group_Tab_Images" +#define IDC_Icon_1 L"Icon_1" +#define IDC_Icon_2 L"Icon_2" +#define IDC_Icon_3 L"Icon_3" +#define IDC_Icon_4 L"Icon_4" +#define IDC_Icon_5 L"Icon_5" +#define IDC_Icon_6 L"Icon_6" +#define IDC_Icon_7 L"Icon_7" +#define IDC_Group_Tab_Icons L"Group_Tab_Icons" +#define IDC_XuiImageScrollBar L"XuiImageScrollBar" +#define IDC_XuiImageScrollBar2Slot L"XuiImageScrollBar2Slot" +#define IDC_XuiVSlot0 L"XuiVSlot0" +#define IDC_XuiVSlot1 L"XuiVSlot1" +#define IDC_XuiHighlight L"XuiHighlight" +#define IDC_XuiVSlot2 L"XuiVSlot2" +#define IDC_XuiHSlot0 L"XuiHSlot0" +#define IDC_XuiHSlot1 L"XuiHSlot1" +#define IDC_XuiHSlot2 L"XuiHSlot2" +#define IDC_XuiHSlot3 L"XuiHSlot3" +#define IDC_XuiHSlot4 L"XuiHSlot4" +#define IDC_XuiHSlot5 L"XuiHSlot5" +#define IDC_XuiHSlot6 L"XuiHSlot6" +#define IDC_XuiHSlot7 L"XuiHSlot7" +#define IDC_XuiHSlot8 L"XuiHSlot8" +#define IDC_XuiHSlot9 L"XuiHSlot9" +#define IDC_XuiHSlot10 L"XuiHSlot10" +#define IDC_XuiHSlot11 L"XuiHSlot11" +#define IDC_SceneCraftScrollGroup L"SceneCraftScrollGroup" +#define IDC_CraftingArrow L"CraftingArrow" +#define IDC_CraftingOutputRed L"CraftingOutputRed" +#define IDC_CraftingInput1 L"CraftingInput1" +#define IDC_CraftingInput2 L"CraftingInput2" +#define IDC_CraftingInput3 L"CraftingInput3" +#define IDC_CraftingInput4 L"CraftingInput4" +#define IDC_CraftingInput5 L"CraftingInput5" +#define IDC_CraftingInput6 L"CraftingInput6" +#define IDC_CraftingInput7 L"CraftingInput7" +#define IDC_CraftingInput8 L"CraftingInput8" +#define IDC_CraftingInput9 L"CraftingInput9" +#define IDC_XuiHTMLText L"XuiHTMLText" +#define IDC_XuiItemName L"XuiItemName" +#define IDC_Inventory L"Inventory" +#define IDC_Ingredient4 L"Ingredient4" +#define IDC_Ingredient3 L"Ingredient3" +#define IDC_Ingredient2 L"Ingredient2" +#define IDC_Ingredient1 L"Ingredient1" +#define IDC_Grid L"Grid" +#define IDC_XuiGroupName L"XuiGroupName" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Inventory L"Inventory" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_UseRow L"UseRow" +#define IDC_InventoryGrid L"InventoryGrid" +#define IDC_Group L"Group" +#define IDC_XuiCraftingPanel L"XuiCraftingPanel" diff --git a/Minecraft.Client/Common/Media/xuiscene_craftingpanel_3x3_480.xui b/Minecraft.Client/Common/Media/xuiscene_craftingpanel_3x3_480.xui new file mode 100644 index 00000000..35d58dd1 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_craftingpanel_3x3_480.xui @@ -0,0 +1,2767 @@ + + +640.000000 +480.000000 + + + +XuiCraftingPanel +640.000000 +480.000000 +CXuiSceneCraftingPanel +XuiMenuScene + + + +Group +640.000000 +480.000000 +15 + + + +MainPanel +490.000000 +284.000000 +72.000000,98.000000,0.000000 +CraftingPanel3x3Small + + + + +Group_Tab_Images +640.000000 +50.000000 +0.000000,96.000000,0.000000 +48 + + + +TabImage1 +72.000000 +56.000000 +72.000000,0.000000,0.000000 +false +CraftingPanelTabLeftSmall + + + + +TabImage2 +72.000000 +56.000000 +142.000000,0.000000,0.000000 +false +CraftingPanelTabMiddleSmall + + + + +TabImage3 +72.000000 +56.000000 +211.000000,0.000000,0.000000 +false +CraftingPanelTabMiddleSmall + + + + +TabImage4 +72.000000 +56.000000 +281.000000,0.000000,0.000000 +false +CraftingPanelTabMiddleSmall + + + + +TabImage5 +72.000000 +56.000000 +351.000000,0.000000,0.000000 +false +CraftingPanelTabMiddleSmall + + + + +TabImage6 +72.000000 +56.000000 +420.000000,0.000000,0.000000 +false +CraftingPanelTabMiddleSmall + + + + +TabImage7 +72.000000 +56.000000 +490.000000,0.000000,0.000000 +false +CraftingPanelTabRightSmall + + + + + +Group_Tab_Icons +640.000000 +50.000000 +0.000000,96.000000,0.000000 +48 + + + +Icon_1 +32.000000 +32.000000 +91.000000,14.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_2 +32.000000 +32.000000 +162.000000,14.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_3 +32.000000 +32.000000 +231.000000,14.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_4 +32.000000 +32.000000 +301.000000,14.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_5 +32.000000 +32.000000 +371.000000,14.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_6 +32.000000 +32.000000 +441.000000,14.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_7 +32.000000 +32.000000 +509.000000,14.000000,0.000000 +false +CraftingCategoryIcon + + + + + +SceneCraftScrollGroup +640.000000 +480.000000 +0.000000,94.000000,0.000000 +48 + + + +XuiImageScrollBar +22.000000 +67.000000 +92.000000,72.000000,0.000000 +CraftingPanelVScrollSmall + + + + +XuiImageScrollBar2Slot +22.000000 +67.000000 +92.000000,72.000000,0.000000 +CraftingPanelVScrollSmall + + + + +XuiVSlot0 +34.000000 +34.000000 +620.000000,90.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiVSlot1 +34.000000 +34.000000 +620.000000,90.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHighlight +43.000000 +43.000000 +81.000000,84.000000,0.000000 +CraftingPanelHighlightSmall + + + + +XuiVSlot2 +34.000000 +34.000000 +620.000000,90.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot0 +34.000000 +34.000000 +85.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot1 +34.000000 +34.000000 +124.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot2 +34.000000 +34.000000 +163.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot3 +34.000000 +34.000000 +202.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot4 +34.000000 +34.000000 +241.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot5 +34.000000 +34.000000 +280.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot6 +34.000000 +34.000000 +319.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot7 +34.000000 +34.000000 +358.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot8 +34.000000 +34.000000 +397.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot9 +34.000000 +34.000000 +436.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot10 +34.000000 +34.000000 +475.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot11 +34.000000 +34.000000 +514.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + + +Grid +190.307205 +133.200012 +86.000000,236.000000,0.000000 + + + +CraftingArrow +32.000000 +32.000000 +102.000000,65.000000,0.000000 +CraftingProgressArrowSmall + + + + +CraftingOutputRed +50.000000 +50.000000 +137.000000,57.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +CraftingInput1 +32.000000 +32.000000 +3.000000,34.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +CraftingInput2 +32.000000 +32.000000 +35.000000,34.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +CraftingInput3 +32.000000 +32.000000 +67.000000,34.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +CraftingInput4 +32.000000 +32.000000 +3.000000,66.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +CraftingInput5 +32.000000 +32.000000 +35.000000,66.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +CraftingInput6 +32.000000 +32.000000 +67.000000,66.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +CraftingInput7 +32.000000 +32.000000 +3.000000,98.000031,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +CraftingInput8 +32.000000 +32.000000 +35.000031,98.000031,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +CraftingInput9 +32.000000 +32.000000 +67.000031,98.000031,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +XuiHTMLText +254.191498 +112.307999 +204.018768,3.616898,0.000000 +false +XuiHtmlControl + + + + +XuiItemName +182.373703 +50.000000 +3.616897,0.000000,0.000000 +XuiLabelDarkCentredWrapSmall + + + + +Inventory +262.000000 +27.000000 +200.000000,0.000000,0.000000 +false +XuiLabelDarkCentredWrapSmall + + + + +Ingredient4 +24.000000 +24.000000 +202.000000,106.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +Ingredient3 +24.000000 +24.000000 +202.000000,78.999992,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +Ingredient2 +24.000000 +24.000000 +202.000000,52.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +Ingredient1 +24.000000 +24.000000 +202.000000,25.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + + +XuiGroupName +400.000000 +27.000000 +117.000000,154.000000,0.000000 +XuiLabelDarkCentredSmall + + + + +InventoryGrid +207.000000 +99.000000 +314.000000,262.000000,0.000000 + + + +Inventory +198.000000 +66.000000 +4.000000,0.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical22 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + + +UseRow +198.000000 +22.000000 +4.000000,76.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical22 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_craftingpanel_3x3_small.h b/Minecraft.Client/Common/Media/xuiscene_craftingpanel_3x3_small.h new file mode 100644 index 00000000..424b28e8 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_craftingpanel_3x3_small.h @@ -0,0 +1,211 @@ +#define IDC_MainPanel L"MainPanel" +#define IDC_TabImage1 L"TabImage1" +#define IDC_TabImage2 L"TabImage2" +#define IDC_TabImage3 L"TabImage3" +#define IDC_TabImage4 L"TabImage4" +#define IDC_TabImage5 L"TabImage5" +#define IDC_TabImage6 L"TabImage6" +#define IDC_TabImage7 L"TabImage7" +#define IDC_Group_Tab_Images L"Group_Tab_Images" +#define IDC_Icon_1 L"Icon_1" +#define IDC_Icon_2 L"Icon_2" +#define IDC_Icon_3 L"Icon_3" +#define IDC_Icon_4 L"Icon_4" +#define IDC_Icon_5 L"Icon_5" +#define IDC_Icon_6 L"Icon_6" +#define IDC_Icon_7 L"Icon_7" +#define IDC_Group_Tab_Icons L"Group_Tab_Icons" +#define IDC_XuiImageScrollBar L"XuiImageScrollBar" +#define IDC_XuiImageScrollBar2Slot L"XuiImageScrollBar2Slot" +#define IDC_XuiVSlot0 L"XuiVSlot0" +#define IDC_XuiVSlot1 L"XuiVSlot1" +#define IDC_XuiHighlight L"XuiHighlight" +#define IDC_XuiVSlot2 L"XuiVSlot2" +#define IDC_XuiHSlot0 L"XuiHSlot0" +#define IDC_XuiHSlot1 L"XuiHSlot1" +#define IDC_XuiHSlot2 L"XuiHSlot2" +#define IDC_XuiHSlot3 L"XuiHSlot3" +#define IDC_XuiHSlot4 L"XuiHSlot4" +#define IDC_XuiHSlot5 L"XuiHSlot5" +#define IDC_XuiHSlot6 L"XuiHSlot6" +#define IDC_XuiHSlot7 L"XuiHSlot7" +#define IDC_XuiHSlot8 L"XuiHSlot8" +#define IDC_XuiHSlot9 L"XuiHSlot9" +#define IDC_XuiHSlot10 L"XuiHSlot10" +#define IDC_XuiHSlot11 L"XuiHSlot11" +#define IDC_SceneCraftScrollGroup L"SceneCraftScrollGroup" +#define IDC_CraftingArrow L"CraftingArrow" +#define IDC_CraftingOutputRed L"CraftingOutputRed" +#define IDC_CraftingInput1 L"CraftingInput1" +#define IDC_CraftingInput2 L"CraftingInput2" +#define IDC_CraftingInput3 L"CraftingInput3" +#define IDC_CraftingInput4 L"CraftingInput4" +#define IDC_CraftingInput5 L"CraftingInput5" +#define IDC_CraftingInput6 L"CraftingInput6" +#define IDC_CraftingInput7 L"CraftingInput7" +#define IDC_CraftingInput8 L"CraftingInput8" +#define IDC_CraftingInput9 L"CraftingInput9" +#define IDC_XuiHTMLText L"XuiHTMLText" +#define IDC_XuiItemName L"XuiItemName" +#define IDC_Inventory L"Inventory" +#define IDC_Ingredient4 L"Ingredient4" +#define IDC_Ingredient3 L"Ingredient3" +#define IDC_Ingredient2 L"Ingredient2" +#define IDC_Ingredient1 L"Ingredient1" +#define IDC_Grid L"Grid" +#define IDC_XuiGroupName L"XuiGroupName" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Inventory L"Inventory" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_UseRow L"UseRow" +#define IDC_InventoryGrid L"InventoryGrid" +#define IDC_Group L"Group" +#define IDC_XuiCraftingPanel L"XuiCraftingPanel" diff --git a/Minecraft.Client/Common/Media/xuiscene_craftingpanel_3x3_small.xui b/Minecraft.Client/Common/Media/xuiscene_craftingpanel_3x3_small.xui new file mode 100644 index 00000000..8d9f1fd4 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_craftingpanel_3x3_small.xui @@ -0,0 +1,2804 @@ + + +530.000000 +290.000000 + + + +XuiCraftingPanel +640.000000 +360.000000 +CXuiSceneCraftingPanel +XuiMenuScene + + + +Group +640.000000 +360.000000 +15 + + + +MainPanel +490.000000 +284.000000 +72.000000,3.000000,0.000000 +CraftingPanel3x3Small + + + + +Group_Tab_Images +640.000000 +50.000000 +48 + + + +TabImage1 +72.000000 +56.000000 +72.000000,1.000000,0.000000 +false +CraftingPanelTabLeftSmall + + + + +TabImage2 +72.000000 +56.000000 +142.000000,1.000000,0.000000 +false +CraftingPanelTabMiddleSmall + + + + +TabImage3 +72.000000 +56.000000 +211.000000,1.000000,0.000000 +false +CraftingPanelTabMiddleSmall + + + + +TabImage4 +72.000000 +56.000000 +281.000000,1.000000,0.000000 +false +CraftingPanelTabMiddleSmall + + + + +TabImage5 +72.000000 +56.000000 +351.000000,1.000000,0.000000 +false +CraftingPanelTabMiddleSmall + + + + +TabImage6 +72.000000 +56.000000 +420.000000,1.000000,0.000000 +false +CraftingPanelTabMiddleSmall + + + + +TabImage7 +72.000000 +56.000000 +490.000000,1.000000,0.000000 +false +CraftingPanelTabRightSmall + + + + + +Group_Tab_Icons +640.000000 +50.239975 +48 + + + +Icon_1 +32.000000 +32.000000 +90.000000,14.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_2 +32.000000 +32.000000 +160.000000,14.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_3 +32.000000 +32.000000 +230.000000,14.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_4 +32.000000 +32.000000 +299.000000,14.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_5 +32.000000 +32.000000 +369.000000,14.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_6 +32.000000 +32.000000 +439.000000,14.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_7 +32.000000 +32.000000 +509.000000,14.000000,0.000000 +false +CraftingCategoryIcon + + + + + +SceneCraftScrollGroup +640.000000 +360.000000 +48 + + + +XuiImageScrollBar +22.000000 +67.000000 +92.000000,72.000000,0.000000 +CraftingPanelVScrollSmall + + + + +XuiImageScrollBar2Slot +22.000000 +67.000000 +92.000000,72.000000,0.000000 +CraftingPanelVScrollSmall + + + + +XuiVSlot0 +34.000000 +34.000000 +620.000000,93.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiVSlot1 +34.000000 +34.000000 +620.000000,93.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHighlight +43.000000 +43.000000 +81.000000,84.000000,0.000000 +CraftingPanelHighlightSmall + + + + +XuiVSlot2 +34.000000 +34.000000 +620.000000,93.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot0 +34.000000 +34.000000 +85.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot1 +34.000000 +34.000000 +124.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot2 +34.000000 +34.000000 +163.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot3 +34.000000 +34.000000 +202.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot4 +34.000000 +34.000000 +241.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot5 +34.000000 +34.000000 +280.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot6 +34.000000 +34.000000 +319.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot7 +34.000000 +34.000000 +358.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot8 +34.000000 +34.000000 +397.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot9 +34.000000 +34.000000 +436.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot10 +34.000000 +34.000000 +475.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot11 +34.000000 +34.000000 +514.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + + +Grid +190.307205 +133.200012 +86.000000,141.000000,0.000000 + + + +CraftingArrow +32.000000 +32.000000 +102.000000,65.000000,0.000000 +CraftingProgressArrowSmall + + + + +CraftingOutputRed +50.000000 +50.000000 +137.000000,57.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +CraftingInput1 +32.000000 +32.000000 +3.000000,34.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +CraftingInput2 +32.000000 +32.000000 +35.000000,34.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +CraftingInput3 +32.000000 +32.000000 +67.000000,34.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +CraftingInput4 +32.000000 +32.000000 +3.000000,66.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +CraftingInput5 +32.000000 +32.000000 +35.000000,66.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +CraftingInput6 +32.000000 +32.000000 +67.000000,66.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +CraftingInput7 +32.000000 +32.000000 +3.000000,98.000031,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +CraftingInput8 +32.000000 +32.000000 +35.000031,98.000031,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +CraftingInput9 +32.000000 +32.000000 +67.000031,98.000031,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +XuiHTMLText +252.000000 +108.000000 +204.000000,0.000000,0.000000 +false +XuiHtmlControl + + + + +XuiItemName +182.775574 +50.000000 +3.215019,0.000000,0.000000 +XuiLabelDarkCentredWrapSmall + + + + +Inventory +262.000000 +27.000000 +200.000000,0.000000,0.000000 +false +XuiLabelDarkCentredWrapSmall + + + + +Ingredient4 +24.000000 +24.000000 +210.000000,106.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +Ingredient3 +24.000000 +24.000000 +210.000000,78.999992,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +Ingredient2 +24.000000 +24.000000 +210.000000,52.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +Ingredient1 +24.000000 +24.000000 +210.000000,25.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + + +XuiGroupName +400.000000 +27.000000 +117.000000,58.000000,0.000000 +XuiLabelDarkCentredSmall + + + + +InventoryGrid +207.000000 +99.000000 +314.000000,172.000000,0.000000 + + + +Inventory +198.000000 +66.000000 +4.000000,0.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical22 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + + +UseRow +198.000000 +22.000000 +4.000000,76.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical22 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +0.000000,0.000000,0.000000 + + + +0 +0.000000,0.000000,0.000000 + + + +2 +100 +-100 +50 +0.000000,0.000000,0.000000 + + + +0 +-212.000000,0.000000,0.000000 + + + +2 +100 +-100 +50 +-212.000000,0.000000,0.000000 + + + +0 +0.000000,0.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_credits.h b/Minecraft.Client/Common/Media/xuiscene_credits.h new file mode 100644 index 00000000..bd04240c --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_credits.h @@ -0,0 +1,31 @@ +#define IDC_Background L"Background" +#define IDC_XuiText1 L"XuiText1" +#define IDC_XuiText2 L"XuiText2" +#define IDC_XuiText3 L"XuiText3" +#define IDC_XuiText4 L"XuiText4" +#define IDC_XuiText5 L"XuiText5" +#define IDC_XuiText6 L"XuiText6" +#define IDC_XuiText7 L"XuiText7" +#define IDC_XuiText8 L"XuiText8" +#define IDC_XuiText9 L"XuiText9" +#define IDC_XuiText10 L"XuiText10" +#define IDC_XuiText11 L"XuiText11" +#define IDC_XuiText12 L"XuiText12" +#define IDC_XuiText13 L"XuiText13" +#define IDC_XuiText14 L"XuiText14" +#define IDC_XuiText15 L"XuiText15" +#define IDC_XuiText16 L"XuiText16" +#define IDC_XuiText17 L"XuiText17" +#define IDC_XuiText18 L"XuiText18" +#define IDC_XuiText19 L"XuiText19" +#define IDC_XuiText20 L"XuiText20" +#define IDC_XuiText21 L"XuiText21" +#define IDC_XuiText22 L"XuiText22" +#define IDC_XuiText23 L"XuiText23" +#define IDC_XuiText24 L"XuiText24" +#define IDC_XuiText25 L"XuiText25" +#define IDC_XuiText26 L"XuiText26" +#define IDC_XuiText27 L"XuiText27" +#define IDC_XuiText28 L"XuiText28" +#define IDC_Logo L"Logo" +#define IDC_SceneCredits L"SceneCredits" diff --git a/Minecraft.Client/Common/Media/xuiscene_credits.xui b/Minecraft.Client/Common/Media/xuiscene_credits.xui new file mode 100644 index 00000000..caacf6f1 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_credits.xui @@ -0,0 +1,285 @@ + + +1280.000000 +720.000000 + + + +SceneCredits +1280.000000 +720.000000 +CScene_Credits +XuiMenuScene +XuiSliderVolume + + + +Background +1280.000000 +720.000000 +CreditsBackground + + + + +XuiText1 +1279.000000 +43.000000 +1.000000,16.000000,0.000000 +XuiCreditsText_XL + + + + +XuiText2 +1279.000000 +43.000000 +1.000000,16.000000,0.000000 +XuiCreditsText_XL + + + + +XuiText3 +1279.000000 +43.000000 +1.000000,16.000000,0.000000 +XuiCreditsText_XL + + + + +XuiText4 +1279.000000 +43.000000 +1.000000,16.000000,0.000000 +XuiCreditsText_L + + + + +XuiText5 +1279.000000 +43.000000 +1.000000,16.000000,0.000000 +XuiCreditsText_L + + + + +XuiText6 +1279.000000 +43.000000 +1.000000,16.000000,0.000000 +XuiCreditsText_L + + + + +XuiText7 +1279.000000 +43.000000 +1.000000,16.000000,0.000000 +XuiCreditsText_L + + + + +XuiText8 +1279.000000 +43.000000 +1.000000,16.000000,0.000000 +XuiCreditsText_L + + + + +XuiText9 +1279.000000 +43.000000 +1.000000,16.000000,0.000000 +XuiCreditsText_M + + + + +XuiText10 +1279.000000 +43.000000 +1.000000,16.000000,0.000000 +XuiCreditsText_L + + + + +XuiText11 +1279.000000 +43.000000 +1.000000,16.000000,0.000000 +XuiCreditsText_L + + + + +XuiText12 +1279.000000 +43.000000 +1.000000,16.000000,0.000000 +XuiCreditsText_L + + + + +XuiText13 +1279.000000 +43.000000 +1.000000,16.000000,0.000000 +XuiCreditsText_L + + + + +XuiText14 +1279.000000 +43.000000 +1.000000,16.000000,0.000000 +XuiCreditsText_S + + + + +XuiText15 +1279.000000 +43.000000 +1.000000,16.000000,0.000000 +XuiCreditsText_S + + + + +XuiText16 +1279.000000 +43.000000 +1.000000,16.000000,0.000000 +XuiCreditsText_S + + + + +XuiText17 +1279.000000 +43.000000 +1.000000,16.000000,0.000000 +XuiCreditsText_S + + + + +XuiText18 +1279.000000 +43.000000 +1.000000,16.000000,0.000000 +XuiCreditsText_S + + + + +XuiText19 +1279.000000 +43.000000 +1.000000,16.000000,0.000000 +XuiCreditsText_S + + + + +XuiText20 +1279.000000 +43.000000 +1.000000,16.000000,0.000000 +XuiCreditsText_S + + + + +XuiText21 +1279.000000 +43.000000 +1.000000,16.000000,0.000000 +XuiCreditsText_S + + + + +XuiText22 +1279.000000 +43.000000 +1.000000,16.000000,0.000000 +XuiCreditsText_S + + + + +XuiText23 +1279.000000 +43.000000 +1.000000,16.000000,0.000000 +XuiCreditsText_S + + + + +XuiText24 +1279.000000 +43.000000 +1.000000,16.000000,0.000000 +XuiCreditsText_S + + + + +XuiText25 +1279.000000 +43.000000 +1.000000,16.000000,0.000000 +XuiCreditsText_S + + + + +XuiText26 +1279.000000 +43.000000 +1.000000,16.000000,0.000000 +XuiCreditsText_S + + + + +XuiText27 +1279.000000 +43.000000 +1.000000,16.000000,0.000000 +XuiCreditsText_S + + + + +XuiText28 +1279.000000 +43.000000 +1.000000,16.000000,0.000000 +XuiCreditsText_S + + + + +Logo +1280.000000 +138.000000 +0.000000,56.000000,0.000000 +MenuTitleLogo + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_credits_480.h b/Minecraft.Client/Common/Media/xuiscene_credits_480.h new file mode 100644 index 00000000..bd04240c --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_credits_480.h @@ -0,0 +1,31 @@ +#define IDC_Background L"Background" +#define IDC_XuiText1 L"XuiText1" +#define IDC_XuiText2 L"XuiText2" +#define IDC_XuiText3 L"XuiText3" +#define IDC_XuiText4 L"XuiText4" +#define IDC_XuiText5 L"XuiText5" +#define IDC_XuiText6 L"XuiText6" +#define IDC_XuiText7 L"XuiText7" +#define IDC_XuiText8 L"XuiText8" +#define IDC_XuiText9 L"XuiText9" +#define IDC_XuiText10 L"XuiText10" +#define IDC_XuiText11 L"XuiText11" +#define IDC_XuiText12 L"XuiText12" +#define IDC_XuiText13 L"XuiText13" +#define IDC_XuiText14 L"XuiText14" +#define IDC_XuiText15 L"XuiText15" +#define IDC_XuiText16 L"XuiText16" +#define IDC_XuiText17 L"XuiText17" +#define IDC_XuiText18 L"XuiText18" +#define IDC_XuiText19 L"XuiText19" +#define IDC_XuiText20 L"XuiText20" +#define IDC_XuiText21 L"XuiText21" +#define IDC_XuiText22 L"XuiText22" +#define IDC_XuiText23 L"XuiText23" +#define IDC_XuiText24 L"XuiText24" +#define IDC_XuiText25 L"XuiText25" +#define IDC_XuiText26 L"XuiText26" +#define IDC_XuiText27 L"XuiText27" +#define IDC_XuiText28 L"XuiText28" +#define IDC_Logo L"Logo" +#define IDC_SceneCredits L"SceneCredits" diff --git a/Minecraft.Client/Common/Media/xuiscene_credits_480.xui b/Minecraft.Client/Common/Media/xuiscene_credits_480.xui new file mode 100644 index 00000000..07fdb75a --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_credits_480.xui @@ -0,0 +1,286 @@ + + +640.000000 +480.000000 + + + +SceneCredits +640.000000 +480.000000 +CScene_Credits +XuiMenuScene +XuiSliderVolume + + + +Background +854.000000 +480.000000 +-107.000000,0.000000,0.000000 +CreditsBackground + + + + +XuiText1 +640.000000 +43.000000 +0.000000,16.000000,0.000000 +XuiCreditsText_480_20_XL + + + + +XuiText2 +640.000000 +43.000000 +0.000000,16.000000,0.000000 +XuiCreditsText_480_20_XL + + + + +XuiText3 +640.000000 +43.000000 +0.000000,16.000000,0.000000 +XuiCreditsText_480_20_XL + + + + +XuiText4 +640.000000 +43.000000 +0.000000,16.000000,0.000000 +XuiCreditsText_480_14_L + + + + +XuiText5 +640.000000 +43.000000 +0.000000,16.000000,0.000000 +XuiCreditsText_480_14_L + + + + +XuiText6 +640.000000 +43.000000 +0.000000,16.000000,0.000000 +XuiCreditsText_480_14_L + + + + +XuiText7 +640.000000 +43.000000 +0.000000,16.000000,0.000000 +XuiCreditsText_480_14_L + + + + +XuiText8 +640.000000 +43.000000 +0.000000,16.000000,0.000000 +XuiCreditsText_480_14_L + + + + +XuiText9 +640.000000 +43.000000 +0.000000,16.000000,0.000000 +XuiCreditsText_480_M + + + + +XuiText10 +640.000000 +43.000000 +0.000000,16.000000,0.000000 +XuiCreditsText_480_14_L + + + + +XuiText11 +640.000000 +43.000000 +0.000000,16.000000,0.000000 +XuiCreditsText_480_14_L + + + + +XuiText12 +640.000000 +43.000000 +0.000000,16.000000,0.000000 +XuiCreditsText_480_14_L + + + + +XuiText13 +640.000000 +43.000000 +0.000000,16.000000,0.000000 +XuiCreditsText_480_14_L + + + + +XuiText14 +640.000000 +43.000000 +0.000000,16.000000,0.000000 +XuiCreditsText_480_S + + + + +XuiText15 +640.000000 +43.000000 +0.000000,16.000000,0.000000 +XuiCreditsText_480_S + + + + +XuiText16 +640.000000 +43.000000 +0.000000,16.000000,0.000000 +XuiCreditsText_480_S + + + + +XuiText17 +640.000000 +43.000000 +0.000000,16.000000,0.000000 +XuiCreditsText_480_S + + + + +XuiText18 +640.000000 +43.000000 +0.000000,16.000000,0.000000 +XuiCreditsText_480_S + + + + +XuiText19 +640.000000 +43.000000 +0.000000,16.000000,0.000000 +XuiCreditsText_480_S + + + + +XuiText20 +640.000000 +43.000000 +0.000000,16.000000,0.000000 +XuiCreditsText_480_S + + + + +XuiText21 +640.000000 +43.000000 +0.000000,16.000000,0.000000 +XuiCreditsText_480_S + + + + +XuiText22 +640.000000 +43.000000 +0.000000,16.000000,0.000000 +XuiCreditsText_480_S + + + + +XuiText23 +640.000000 +43.000000 +0.000000,16.000000,0.000000 +XuiCreditsText_480_S + + + + +XuiText24 +640.000000 +43.000000 +0.000000,16.000000,0.000000 +XuiCreditsText_480_S + + + + +XuiText25 +640.000000 +43.000000 +0.000000,16.000000,0.000000 +XuiCreditsText_480_S + + + + +XuiText26 +640.000000 +43.000000 +0.000000,16.000000,0.000000 +XuiCreditsText_480_S + + + + +XuiText27 +640.000000 +43.000000 +0.000000,16.000000,0.000000 +XuiCreditsText_480_S + + + + +XuiText28 +640.000000 +43.000000 +0.000000,16.000000,0.000000 +XuiCreditsText_480_S + + + + +Logo +640.000000 +70.000000 +0.000000,48.000000,0.000000 +MenuTitleLogo + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_death.h b/Minecraft.Client/Common/Media/xuiscene_death.h new file mode 100644 index 00000000..422608e6 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_death.h @@ -0,0 +1,4 @@ +#define IDC_ExitGame L"ExitGame" +#define IDC_Respawn L"Respawn" +#define IDC_Title L"Title" +#define IDC_SceneDeath L"SceneDeath" diff --git a/Minecraft.Client/Common/Media/xuiscene_death.xui b/Minecraft.Client/Common/Media/xuiscene_death.xui new file mode 100644 index 00000000..28582083 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_death.xui @@ -0,0 +1,49 @@ + + +1280.000000 +720.000000 + + + +SceneDeath +1280.000000 +720.000000 +CScene_Death +XuiMenuScene +Respawn + + + +ExitGame +400.000000 +40.000000 +440.000000,450.000000,0.000000 +XuiMainMenuButton_L +Respawn +Respawn +22528 + + + + +Respawn +400.000000 +40.000000 +440.000000,400.000000,0.000000 +XuiMainMenuButton_L +ExitGame +ExitGame +22528 + + + + +Title +400.000000 +100.000000 +440.000061,92.000000,0.000000 +XuiTitle + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_death_480.h b/Minecraft.Client/Common/Media/xuiscene_death_480.h new file mode 100644 index 00000000..422608e6 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_death_480.h @@ -0,0 +1,4 @@ +#define IDC_ExitGame L"ExitGame" +#define IDC_Respawn L"Respawn" +#define IDC_Title L"Title" +#define IDC_SceneDeath L"SceneDeath" diff --git a/Minecraft.Client/Common/Media/xuiscene_death_480.xui b/Minecraft.Client/Common/Media/xuiscene_death_480.xui new file mode 100644 index 00000000..189cf93a --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_death_480.xui @@ -0,0 +1,49 @@ + + +640.000000 +480.000000 + + + +SceneDeath +640.000000 +480.000000 +CScene_Death +XuiMenuScene +Respawn + + + +ExitGame +300.000000 +36.000000 +170.000031,340.000000,0.000000 +XuiMainMenuButton_L_Thin +Respawn +Respawn +22528 + + + + +Respawn +300.000000 +36.000000 +170.000031,300.000000,0.000000 +XuiMainMenuButton_L_Thin +ExitGame +ExitGame +22528 + + + + +Title +400.000000 +100.000000 +120.000061,150.000000,0.000000 +XuiTitle + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_death_small.h b/Minecraft.Client/Common/Media/xuiscene_death_small.h new file mode 100644 index 00000000..422608e6 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_death_small.h @@ -0,0 +1,4 @@ +#define IDC_ExitGame L"ExitGame" +#define IDC_Respawn L"Respawn" +#define IDC_Title L"Title" +#define IDC_SceneDeath L"SceneDeath" diff --git a/Minecraft.Client/Common/Media/xuiscene_death_small.xui b/Minecraft.Client/Common/Media/xuiscene_death_small.xui new file mode 100644 index 00000000..bb5b155b --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_death_small.xui @@ -0,0 +1,49 @@ + + +640.000000 +360.000000 + + + +SceneDeath +640.000000 +360.000000 +CScene_Death +XuiMenuScene +Respawn + + + +ExitGame +400.000000 +40.000000 +120.000000,233.000000,0.000000 +XuiMainMenuButton_L +Respawn +Respawn +22528 + + + + +Respawn +400.000000 +40.000000 +120.000000,188.000000,0.000000 +XuiMainMenuButton_L +ExitGame +ExitGame +22528 + + + + +Title +400.000000 +60.000000 +120.000061,120.000000,0.000000 +XuiTitle + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_debug.h b/Minecraft.Client/Common/Media/xuiscene_debug.h new file mode 100644 index 00000000..9d24be6b --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_debug.h @@ -0,0 +1,6 @@ +#define IDC_XuiImage1 L"XuiImage1" +#define IDC_XuiCheckbox1 L"XuiCheckbox1" +#define IDC_XuiCheckbox2 L"XuiCheckbox2" +#define IDC_XuiCheckbox3 L"XuiCheckbox3" +#define IDC_XuiCheckbox4 L"XuiCheckbox4" +#define IDC_SceneDebug L"SceneDebug" diff --git a/Minecraft.Client/Common/Media/xuiscene_debug.xui b/Minecraft.Client/Common/Media/xuiscene_debug.xui new file mode 100644 index 00000000..4e9b87fb --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_debug.xui @@ -0,0 +1,60 @@ + + +1280.000000 +720.000000 + + + +SceneDebug +1280.000000 +720.000000 +CScene_Debug +XuiSliderVolume + + + +XuiImage1 +556.000061 +97.000008 +361.000061,60.000000,0.000000 +Graphics\MenuTitle.png + + + + +XuiCheckbox1 +198.000000 +50.000000 +376.000000,218.999985,0.000000 +false + + + + +XuiCheckbox2 +198.000000 +50.000000 +376.000000,291.999969,0.000000 +false + + + + +XuiCheckbox3 +198.000000 +50.000000 +376.000000,365.000000,0.000000 +false + + + + +XuiCheckbox4 +198.000000 +50.000000 +376.000000,438.000031,0.000000 +false + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_debug_480.h b/Minecraft.Client/Common/Media/xuiscene_debug_480.h new file mode 100644 index 00000000..0189ed44 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_debug_480.h @@ -0,0 +1,5 @@ +#define IDC_XuiCheckbox1 L"XuiCheckbox1" +#define IDC_XuiCheckbox2 L"XuiCheckbox2" +#define IDC_XuiCheckbox3 L"XuiCheckbox3" +#define IDC_XuiCheckbox4 L"XuiCheckbox4" +#define IDC_SceneDebug L"SceneDebug" diff --git a/Minecraft.Client/Common/Media/xuiscene_debug_480.xui b/Minecraft.Client/Common/Media/xuiscene_debug_480.xui new file mode 100644 index 00000000..b548b1de --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_debug_480.xui @@ -0,0 +1,51 @@ + + +640.000000 +480.000000 + + + +SceneDebug +640.000000 +480.000000 +CScene_Debug +XuiSliderVolume + + + +XuiCheckbox1 +198.000000 +50.000000 +221.000000,103.999985,0.000000 +false + + + + +XuiCheckbox2 +198.000000 +50.000000 +221.000000,176.999969,0.000000 +false + + + + +XuiCheckbox3 +198.000000 +50.000000 +221.000000,250.000000,0.000000 +false + + + + +XuiCheckbox4 +198.000000 +50.000000 +221.000000,323.000031,0.000000 +false + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_debug_item_editor.h b/Minecraft.Client/Common/Media/xuiscene_debug_item_editor.h new file mode 100644 index 00000000..0508e92a --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_debug_item_editor.h @@ -0,0 +1,12 @@ +#define IDC_icon L"icon" +#define IDC_itemName L"itemName" +#define IDC_itemId L"itemId" +#define IDC_XuiLabel1 L"XuiLabel1" +#define IDC_itemAuxValue L"itemAuxValue" +#define IDC_XuiLabel2 L"XuiLabel2" +#define IDC_itemCount L"itemCount" +#define IDC_XuiLabel3 L"XuiLabel3" +#define IDC_item4JData L"item4JData" +#define IDC_XuiLabel4 L"XuiLabel4" +#define IDC_ruleXml L"ruleXml" +#define IDC_DebugItemEditor L"DebugItemEditor" diff --git a/Minecraft.Client/Common/Media/xuiscene_debug_item_editor.xui b/Minecraft.Client/Common/Media/xuiscene_debug_item_editor.xui new file mode 100644 index 00000000..0a69a9a6 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_debug_item_editor.xui @@ -0,0 +1,132 @@ + + +1280.000000 +720.000000 + + + +DebugItemEditor +685.000061 +400.000000 +297.500031,195.000046,0.000000 +CScene_DebugItemEditor +itemId + + + +icon +46.000000 +46.000000 +23.000000,28.999985,0.000000 +1 +7 +CXuiCtrlCraftIngredientSlot +XuiVisualImagePresenter + + + + +itemName +339.000000 +34.000000 +83.000000,32.000000,0.000000 +XuiLabelDark + + + + +itemId +200.000000 +23.000000,107.000000,0.000000 +CXuiCtrl4JEdit +itemCount +itemAuxValue +0123456789 + + + + +XuiLabel1 +257.000000 +34.000000 +23.000000,77.000000,0.000000 +XuiLabelDarkLeftWrap +Item Id + + + + +itemAuxValue +200.000000 +23.000000,169.999985,0.000000 +CXuiCtrl4JEdit +item4JData +itemId +itemCount +0123456789 + + + + +XuiLabel2 +257.000000 +34.000000 +23.000000,143.000000,0.000000 +XuiLabelDarkLeftWrap +Aux Value + + + + +itemCount +200.000000 +346.000000,102.999962,0.000000 +CXuiCtrl4JEdit +itemId +itemAuxValue +item4JData +0123456789 + + + + +XuiLabel3 +257.000000 +34.000000 +346.000000,76.999992,0.000000 +XuiLabelDarkLeftWrap +Item Count + + + + +item4JData +200.000000 +346.000000,163.000000,0.000000 +CXuiCtrl4JEdit +itemAuxValue +itemCount +0123456789 + + + + +XuiLabel4 +257.000000 +34.000000 +346.000000,134.000000,0.000000 +XuiLabelDarkLeftWrap +4J Data + + + + +ruleXml +644.000000 +156.000000 +18.000000,218.000000,0.000000 +XuiLabelDarkLeftWrap + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_debug_schematic_create.h b/Minecraft.Client/Common/Media/xuiscene_debug_schematic_create.h new file mode 100644 index 00000000..00555f9d --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_debug_schematic_create.h @@ -0,0 +1,19 @@ +#define IDC_StartX L"StartX" +#define IDC_StartY L"StartY" +#define IDC_StartZ L"StartZ" +#define IDC_EndX L"EndX" +#define IDC_EndY L"EndY" +#define IDC_EndZ L"EndZ" +#define IDC_XuiLabel1 L"XuiLabel1" +#define IDC_XuiLabel2 L"XuiLabel2" +#define IDC_XuiLabel3 L"XuiLabel3" +#define IDC_XuiLabel4 L"XuiLabel4" +#define IDC_XuiLabel5 L"XuiLabel5" +#define IDC_XuiLabel6 L"XuiLabel6" +#define IDC_CreateButton L"CreateButton" +#define IDC_Name L"Name" +#define IDC_XuiLabel7 L"XuiLabel7" +#define IDC_XuiLabel8 L"XuiLabel8" +#define IDC_SaveMobs L"SaveMobs" +#define IDC_UseXboxCompression L"UseXboxCompression" +#define IDC_XuiDebugSchematic L"XuiDebugSchematic" diff --git a/Minecraft.Client/Common/Media/xuiscene_debug_schematic_create.xui b/Minecraft.Client/Common/Media/xuiscene_debug_schematic_create.xui new file mode 100644 index 00000000..0916c038 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_debug_schematic_create.xui @@ -0,0 +1,220 @@ + + +1280.000000 +720.000000 + + + +XuiDebugSchematic +823.000000 +510.000000 +228.000000,105.000046,0.000000 +CScene_DebugSchematicCreator +Name + + + +StartX +245.000000 +33.000000 +34.000015,158.000000,0.000000 +CXuiCtrl4JEdit +EndX +Name +StartY +0123456789- + + + + +StartY +245.000000 +33.000000 +34.000015,243.000000,0.000000 +CXuiCtrl4JEdit +EndY +StartX +StartZ +0123456789- + + + + +StartZ +245.000000 +33.000000 +34.000015,328.000000,0.000000 +CXuiCtrl4JEdit +EndZ +StartY +EndX +0123456789- + + + + +EndX +245.000000 +33.000000 +308.000000,158.000000,0.000000 +CXuiCtrl4JEdit +StartX +Name +EndY +0123456789- + + + + +EndY +245.000000 +33.000000 +308.000000,243.000000,0.000000 +CXuiCtrl4JEdit +StartY +EndX +EndZ +0123456789- + + + + +EndZ +245.000000 +33.000000 +308.000000,328.000000,0.000000 +CXuiCtrl4JEdit +StartZ +EndY +SaveMobs +0123456789- + + + + +XuiLabel1 +233.000000 +24.000000 +33.000000,128.000015,0.000000 +XuiLabelDark +StartX + + + + +XuiLabel2 +233.000000 +24.000000 +34.000000,212.000015,0.000000 +XuiLabelDark +StartY + + + + +XuiLabel3 +233.000000 +24.000000 +35.000000,293.000000,0.000000 +XuiLabelDark +StartZ + + + + +XuiLabel4 +233.000000 +24.000000 +305.000061,125.000000,0.000000 +XuiLabelDark +EndX + + + + +XuiLabel5 +233.000000 +24.000000 +314.000061,212.000015,0.000000 +XuiLabelDark +EndY + + + + +XuiLabel6 +233.000000 +24.000000 +306.000061,295.000000,0.000000 +XuiLabelDark +EndZ + + + + +CreateButton +734.000000 +52.000000 +38.000000,437.000000,0.000000 +SaveMobs +Create + + + + +Name +759.000000 +47.000000 +32.000031,64.000000,0.000000 +CXuiCtrl4JEdit +StartX +schematic +64 + + + + +XuiLabel7 +480.000000 +42.000000 +31.000000,13.000000,0.000000 +XuiLabelDark +Name + + + + +XuiLabel8 +222.000000 +236.000000 +570.000000,124.000000,0.000000 +XuiLabelDarkLeftWrap +Start co-ords should be even, end co-ords should be odd. If they are not the area included will be expanded. + + + + +SaveMobs +309.000000 +39.000000 +43.000000,388.000000,0.000000 +UseXboxCompression +EndZ +CreateButton +Save Mobs + + + + +UseXboxCompression +309.000000 +39.000000 +353.000000,388.000000,0.000000 +SaveMobs +EndZ +CreateButton +Use Xbox Compression + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_debug_set_camera.h b/Minecraft.Client/Common/Media/xuiscene_debug_set_camera.h new file mode 100644 index 00000000..f09bfb5e --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_debug_set_camera.h @@ -0,0 +1,13 @@ +#define IDC_CamX L"CamX" +#define IDC_CamZ L"CamZ" +#define IDC_YRot L"YRot" +#define IDC_CamY L"CamY" +#define IDC_Elevation L"Elevation" +#define IDC_XuiLabel1 L"XuiLabel1" +#define IDC_XuiLabel2 L"XuiLabel2" +#define IDC_XuiLabel3 L"XuiLabel3" +#define IDC_XuiLabel4 L"XuiLabel4" +#define IDC_XuiLabel7 L"XuiLabel7" +#define IDC_LockPlayer L"LockPlayer" +#define IDC_Teleport L"Teleport" +#define IDC_XuiDebugSetCamera L"XuiDebugSetCamera" diff --git a/Minecraft.Client/Common/Media/xuiscene_debug_set_camera.xui b/Minecraft.Client/Common/Media/xuiscene_debug_set_camera.xui new file mode 100644 index 00000000..33c64fc9 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_debug_set_camera.xui @@ -0,0 +1,160 @@ + + +1280.000000 +720.000000 + + + +XuiDebugSetCamera +267.275146 +360.700745 +993.158508,15.835232,0.000000 +true +CScene_DebugSetCamera +LockPlayer + + + +CamX +80.000000 +33.000000 +20.000000,100.000000,0.000000 +CXuiCtrl4JEdit +CamZ +CamY +Teleport +YRot +0123456789.- + + + + +CamZ +80.000000 +33.000000 +180.000000,100.000000,0.000000 +CXuiCtrl4JEdit +CamY +CamX +Teleport +Elevation +0123456789.- + + + + +YRot +80.000000 +33.000000 +20.000000,185.000000,0.000000 +CXuiCtrl4JEdit +Elevation +Elevation +CamX +LockPlayer +0123456789.- + + + + +CamY +80.000000 +33.000000 +100.000000,100.000000,0.000000 +CXuiCtrl4JEdit +CamX +CamZ +Teleport +Elevation +0123456789.- + + + + +Elevation +80.000000 +33.000000 +100.000000,185.000000,0.000000 +CXuiCtrl4JEdit +YRot +YRot +CamY +LockPlayer +0123456789.- + + + + +XuiLabel1 +80.000000 +24.000000 +20.000000,70.000015,0.000000 +XuiLabelDark +Cam-X + + + + +XuiLabel2 +140.000000 +24.000000 +180.000000,67.000000,0.000000 +XuiLabelDark +Cam-Z + + + + +XuiLabel3 +236.599915 +24.000000 +10.000000,150.000000,0.000000 +XuiLabelDark +Y-Rot & Elevation (Degs) + + + + +XuiLabel4 +80.000000 +24.000000 +100.000000,70.000000,0.000000 +XuiLabelDark +Cam-Y + + + + +XuiLabel7 +183.599976 +42.000000 +20.000000,14.000000,0.000000 +XuiLabelDark +Set Camera Position + + + + +LockPlayer +180.129578 +39.000000 +21.000000,240.399994,0.000000 +CXuiCheckbox +YRot +Teleport +Lock Player + + + + +Teleport +180.928040 +40.000000 +20.320000,296.820038,0.000000 +LockPlayer +CamX +Teleport + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_debug_small.h b/Minecraft.Client/Common/Media/xuiscene_debug_small.h new file mode 100644 index 00000000..2af4a6e0 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_debug_small.h @@ -0,0 +1,2 @@ +#define IDC_XuiCheckbox1 L"XuiCheckbox1" +#define IDC_SceneDebug L"SceneDebug" diff --git a/Minecraft.Client/Common/Media/xuiscene_debug_small.xui b/Minecraft.Client/Common/Media/xuiscene_debug_small.xui new file mode 100644 index 00000000..2642e787 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_debug_small.xui @@ -0,0 +1,24 @@ + + +1280.000000 +720.000000 + + + +SceneDebug +640.000000 +360.000000 +CScene_Debug +XuiSliderVolume + + + +XuiCheckbox1 +198.000000 +50.000000 +22.000000,23.999969,0.000000 +false + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_debugoverlay.h b/Minecraft.Client/Common/Media/xuiscene_debugoverlay.h new file mode 100644 index 00000000..3afbf714 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_debugoverlay.h @@ -0,0 +1,25 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_ItemsList L"ItemsList" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_EnchantmentsList L"EnchantmentsList" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_MobList L"MobList" +#define IDC_SliderFov L"SliderFov" +#define IDC_SliderTime L"SliderTime" +#define IDC_SetNight L"SetNight" +#define IDC_SetDay L"SetDay" +#define IDC_ToggleThunder L"ToggleThunder" +#define IDC_ToggleRain L"ToggleRain" +#define IDC_CreateSchematic L"CreateSchematic" +#define IDC_ResetTutorial L"ResetTutorial" +#define IDC_SetCamera L"SetCamera" +#define IDC_SaveToFile L"SaveToFile" +#define IDC_ChunkRadius L"ChunkRadius" +#define IDC_DebugOverlay L"DebugOverlay" diff --git a/Minecraft.Client/Common/Media/xuiscene_debugoverlay.xui b/Minecraft.Client/Common/Media/xuiscene_debugoverlay.xui new file mode 100644 index 00000000..3326003b --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_debugoverlay.xui @@ -0,0 +1,323 @@ + + +1280.000000 +720.000000 + + + +DebugOverlay +859.000000 +718.000000 +422.000031,1.000000,0.000000 +CScene_DebugOverlay +ItemsList + + + +ItemsList +413.000000 +274.000000 +431.000000,404.000000,0.000000 +DebugList +SliderFov +SliderFov +EnchantmentsList +MobList + + + +control_ListItem +469.000000 +40.000000 +10.000000,14.000000,0.000000 +5 +false +DebugButton + + + + +control_ListItem +469.000000 +40.000000 +10.000000,14.000000,0.000000 +5 +false +DebugButton + + + + +control_ListItem +469.000000 +40.000000 +10.000000,14.000000,0.000000 +5 +false +DebugButton + + + + + +EnchantmentsList +413.000000 +180.000000 +428.000000,213.999954,0.000000 +DebugList +SetNight +SetNight +MobList +ItemsList + + + +control_ListItem +469.000000 +40.000000 +10.000000,14.000000,0.000000 +5 +false +DebugButton + + + + +control_ListItem +469.000000 +40.000000 +10.000000,14.000000,0.000000 +5 +false +DebugButton + + + + +control_ListItem +469.000000 +40.000000 +10.000000,14.000000,0.000000 +5 +false +DebugButton + + + + +control_ListItem +469.000000 +40.000000 +10.000000,14.000000,0.000000 +5 +false +DebugButton + + + + + +MobList +413.000000 +180.000000 +428.000000,24.999954,0.000000 +DebugList +SetCamera +SetCamera +ItemsList +EnchantmentsList + + + +control_ListItem +469.000000 +40.000000 +10.000000,14.000000,0.000000 +5 +false +DebugButton + + + + +control_ListItem +469.000000 +40.000000 +10.000000,14.000000,0.000000 +5 +false +DebugButton + + + + +control_ListItem +469.000000 +40.000000 +10.000000,14.000000,0.000000 +5 +false +DebugButton + + + + + +SliderFov +365.000000 +36.000000 +26.000000,309.000031,0.000000 +EnchantmentsList +EnchantmentsList +SliderTime +SetCamera +Set fov + + + + +SliderTime +365.000000 +36.000000 +26.000000,265.000000,0.000000 +EnchantmentsList +EnchantmentsList +SetDay +SliderFov +Set time (unsafe) +24000 +100 +50 +10 + + + + +SetNight +190.000000 +40.000000 +203.000000,224.000000,0.000000 +XuiMainMenuButton_L +SetDay +EnchantmentsList +ToggleThunder +SliderTime +Night + + + + +SetDay +168.000000 +40.000000 +28.000000,224.000000,0.000000 +XuiMainMenuButton_L +EnchantmentsList +SetNight +ToggleRain +SliderTime +Day + + + + +ToggleThunder +190.000000 +40.000000 +203.000061,165.000000,0.000000 +XuiMainMenuButton_L +ToggleRain +MobList +CreateSchematic +SetNight +Toggle Thunder + + + + +ToggleRain +168.000000 +40.000000 +28.000000,165.000000,0.000000 +XuiMainMenuButton_L +MobList +ToggleThunder +CreateSchematic +SetDay +Toggle Rain + + + + +CreateSchematic +365.000000 +40.000000 +26.000000,118.000015,0.000000 +XuiMainMenuButton_L +MobList +MobList +ResetTutorial +ToggleRain +Create Schematic + + + + +ResetTutorial +365.000000 +40.000000 +26.000000,73.000000,0.000000 +XuiMainMenuButton_L +MobList +MobList +SetCamera +CreateSchematic +Reset profile tutorial progress + + + + +SetCamera +365.000000 +40.000000 +25.000000,29.000002,0.000000 +XuiMainMenuButton_L +MobList +MobList +SliderFov +ResetTutorial +Set camera + + + + +SaveToFile +229.000000 +40.000000 +38.000000,36.000000,0.000000 +false +XuiMainMenuButton_L +false +ChunkRadius +ItemsList +SetSpawn +Save Level To File + + + + +ChunkRadius +195.999985 +87.000000 +263.000061,14.000000,0.000000 +false +false +SaveToFile +ItemsList +SetSpawn +Radius (chunks > 0) +64 + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_debugoverlay_480.h b/Minecraft.Client/Common/Media/xuiscene_debugoverlay_480.h new file mode 100644 index 00000000..0417fc0e --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_debugoverlay_480.h @@ -0,0 +1,13 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_ItemsList L"ItemsList" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_MobList L"MobList" +#define IDC_SliderFov L"SliderFov" +#define IDC_SliderTime L"SliderTime" +#define IDC_ToggleThunder L"ToggleThunder" +#define IDC_ToggleRain L"ToggleRain" +#define IDC_SetSpawn L"SetSpawn" +#define IDC_ResetTutorial L"ResetTutorial" +#define IDC_SaveToFile L"SaveToFile" +#define IDC_ChunkRadius L"ChunkRadius" +#define IDC_DebugOverlay L"DebugOverlay" diff --git a/Minecraft.Client/Common/Media/xuiscene_debugoverlay_480.xui b/Minecraft.Client/Common/Media/xuiscene_debugoverlay_480.xui new file mode 100644 index 00000000..1c94d25e --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_debugoverlay_480.xui @@ -0,0 +1,161 @@ + + +640.000000 +480.000000 + + + +DebugOverlay +300.000000 +480.000000 +340.000000,1.000000,0.000000 +CScene_DebugOverlay +ItemsList + + + +ItemsList +223.000000 +125.999969 +35.000000,329.000000,0.000000 +DebugList +MobList +ResetTutorial + + + +control_ListItem +469.000000 +40.000000 +10.000000,14.000000,0.000000 +5 +false +DebugButton + + + + + +MobList +225.000000 +90.999969 +33.000000,238.999969,0.000000 +DebugList +SliderFov +ItemsList + + + +control_ListItem +469.000000 +40.000000 +10.000000,14.000000,0.000000 +5 +false +DebugButton + + + + + +SliderFov +200.000000 +38.000000 +46.000046,201.000000,0.000000 +SliderTime +MobList +Set fov + + + + +SliderTime +200.000000 +38.000000 +45.000046,164.000000,0.000000 +ToggleRain +SliderFov +Set time (unsafe) +24000 +100 +50 +10 + + + + +ToggleThunder +100.000000 +150.000061,132.000000,0.000000 +XuiMainMenuButton_L +ToggleRain +SetSpawn +SliderTime +Toggle Thunder + + + + +ToggleRain +100.000000 +41.000000,132.000000,0.000000 +XuiMainMenuButton_L +ToggleThunder +SetSpawn +SliderTime +Toggle Rain + + + + +SetSpawn +210.000000 +41.000000,95.000000,0.000000 +XuiMainMenuButton_L +false +ResetTutorial +ToggleRain +Set Level Spawn Point To Here + + + + +ResetTutorial +210.000000 +41.000000,57.999996,0.000000 +XuiMainMenuButton_L +ItemsList +SetSpawn +Reset profile tutorial progress + + + + +SaveToFile +100.000000 +38.000000,29.000000,0.000000 +false +XuiMainMenuButton_L +false +ChunkRadius +ItemsList +SetSpawn +Save Level To File + + + + +ChunkRadius +100.000000 +150.000061,29.000000,0.000000 +false +false +SaveToFile +ItemsList +SetSpawn +Radius (chunks > 0) +64 + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_debugtips.h b/Minecraft.Client/Common/Media/xuiscene_debugtips.h new file mode 100644 index 00000000..9bf5ae71 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_debugtips.h @@ -0,0 +1,2 @@ +#define IDC_Tip L"Tip" +#define IDC_DebugTips L"DebugTips" diff --git a/Minecraft.Client/Common/Media/xuiscene_debugtips.xui b/Minecraft.Client/Common/Media/xuiscene_debugtips.xui new file mode 100644 index 00000000..7eead8d7 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_debugtips.xui @@ -0,0 +1,39 @@ + + +1280.000000 +720.000000 + + + +DebugTips +1280.000000 +720.000000 +CScene_DebugTips +XuiMenuScene +ButtonConfirm + + + +Tip +800.000000 +100.000000 +240.000061,520.000000,0.000000 +TipPanel + + + + + +Normal + + + +EndNormal + +gotoandplay +Normal + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_debugtips_480.h b/Minecraft.Client/Common/Media/xuiscene_debugtips_480.h new file mode 100644 index 00000000..9bf5ae71 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_debugtips_480.h @@ -0,0 +1,2 @@ +#define IDC_Tip L"Tip" +#define IDC_DebugTips L"DebugTips" diff --git a/Minecraft.Client/Common/Media/xuiscene_debugtips_480.xui b/Minecraft.Client/Common/Media/xuiscene_debugtips_480.xui new file mode 100644 index 00000000..73a3c759 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_debugtips_480.xui @@ -0,0 +1,39 @@ + + +1280.000000 +720.000000 + + + +DebugTips +640.000000 +480.000000 +CScene_DebugTips +XuiMenuScene +ButtonConfirm + + + +Tip +500.000000 +120.000000 +70.000000,256.000061,0.000000 +TipPanel + + + + + +Normal + + + +EndNormal + +gotoandplay +Normal + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_debugtips_small.h b/Minecraft.Client/Common/Media/xuiscene_debugtips_small.h new file mode 100644 index 00000000..9bf5ae71 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_debugtips_small.h @@ -0,0 +1,2 @@ +#define IDC_Tip L"Tip" +#define IDC_DebugTips L"DebugTips" diff --git a/Minecraft.Client/Common/Media/xuiscene_debugtips_small.xui b/Minecraft.Client/Common/Media/xuiscene_debugtips_small.xui new file mode 100644 index 00000000..b12d9409 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_debugtips_small.xui @@ -0,0 +1,39 @@ + + +1280.000000 +720.000000 + + + +DebugTips +640.000000 +480.000000 +CScene_DebugTips +XuiMenuScene +ButtonConfirm + + + +Tip +500.000000 +120.000000 +70.000000,180.000061,0.000000 +TipPanel + + + + + +Normal + + + +EndNormal + +gotoandplay +Normal + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_enchant.h b/Minecraft.Client/Common/Media/xuiscene_enchant.h new file mode 100644 index 00000000..d8a4fdc8 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_enchant.h @@ -0,0 +1,222 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Ingredient L"Ingredient" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_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_UseRow L"UseRow" +#define IDC_EnchantText L"EnchantText" +#define IDC_InventoryText L"InventoryText" +#define IDC_EnchantmentBook L"EnchantmentBook" +#define IDC_EnchantPanel L"EnchantPanel" +#define IDC_EnchantButton3 L"EnchantButton3" +#define IDC_EnchantButton2 L"EnchantButton2" +#define IDC_EnchantButton1 L"EnchantButton1" +#define IDC_Pointer L"Pointer" +#define IDC_Group L"Group" +#define IDC_XuiSceneInventory L"XuiSceneInventory" diff --git a/Minecraft.Client/Common/Media/xuiscene_enchant.xui b/Minecraft.Client/Common/Media/xuiscene_enchant.xui new file mode 100644 index 00000000..615a17d6 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_enchant.xui @@ -0,0 +1,3155 @@ + + +1280.000000 +720.000000 + + + +XuiSceneInventory +1280.000000 +720.000000 +CXuiSceneEnchant +XuiBlankScene +Pointer + + + +Group +431.000000 +435.000000 +424.000000,95.000000,0.000000 +15 +XuiScene +Pointer + + + +Ingredient +42.000000 +42.000000 +66.000000,132.000000,0.000000 +3 +CXuiCtrlSlotList +ItemGridEnchant + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonEnchant +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonEnchant +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonEnchant +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonEnchant +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonEnchant +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonEnchant +22594 +4 + + + + + +Inventory +382.000000 +150.000000 +25.000000,230.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + + +UseRow +381.000000 +50.000000 +25.000000,369.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + + +EnchantText +375.000000 +33.000000 +25.000000,14.000000,0.000000 +9 +LabelContainerSceneLeft + + + + +InventoryText +375.000000 +33.000000 +25.000000,200.000000,0.000000 +9 +LabelContainerSceneLeft + + + + +EnchantmentBook +122.000000 +78.000000 +25.999998,48.000000,0.000000 +3 +CXuiCtrlEnchantmentBook + + + + +EnchantPanel +244.000000 +130.000000 +160.000000,46.000000,0.000000 +PanelRecessed +false + + + + +EnchantButton3 +240.000000 +42.000000 +162.000000,132.000000,0.000000 +CXuiCtrlEnchantmentButton +EnchantmentButton +false + + + + +EnchantButton2 +240.000000 +42.000000 +162.000000,90.000000,0.000000 +CXuiCtrlEnchantmentButton +EnchantmentButton +false + + + + +EnchantButton1 +240.000000 +42.000000 +162.000000,48.000000,0.000000 +CXuiCtrlEnchantmentButton +EnchantmentButton +false + + + + +Pointer +42.000000 +42.000000 +-185.000000,-84.000015,0.000000 +9 +false +CXuiCtrlSlotItem +ItemPointer + + + + + +Normal + + + +EndNormal + + + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +424.000000,95.000000,0.000000 + + + +0 +424.000000,95.000000,0.000000 + + + +2 +100 +-100 +50 +424.000000,95.000000,0.000000 + + + +0 +160.000000,95.000000,0.000000 + + + +2 +100 +-100 +50 +160.000000,95.000000,0.000000 + + + +0 +424.000000,95.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_enchant_480.h b/Minecraft.Client/Common/Media/xuiscene_enchant_480.h new file mode 100644 index 00000000..463291c0 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_enchant_480.h @@ -0,0 +1,199 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Inventory L"Inventory" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_UseRow L"UseRow" +#define IDC_EnchantText L"EnchantText" +#define IDC_InventoryText L"InventoryText" +#define IDC_EnchantPanel L"EnchantPanel" +#define IDC_EnchantButton3 L"EnchantButton3" +#define IDC_EnchantButton2 L"EnchantButton2" +#define IDC_EnchantButton1 L"EnchantButton1" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Ingredient L"Ingredient" +#define IDC_EnchantmentBook L"EnchantmentBook" +#define IDC_Pointer L"Pointer" +#define IDC_Group L"Group" +#define IDC_XuiSceneInventory L"XuiSceneInventory" diff --git a/Minecraft.Client/Common/Media/xuiscene_enchant_480.xui b/Minecraft.Client/Common/Media/xuiscene_enchant_480.xui new file mode 100644 index 00000000..d382a347 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_enchant_480.xui @@ -0,0 +1,2650 @@ + + +640.000000 +480.000000 + + + +XuiSceneInventory +640.000000 +480.000000 +CXuiSceneEnchant +XuiBlankScene +Pointer + + + +Group +260.000000 +290.000000 +190.000015,96.000000,0.000000 +15 +GraphicPanel +Pointer + + + +Inventory +234.000000 +80.000000 +13.000001,160.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical26 + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +UseRow +234.000000 +13.000001,250.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical26 + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +EnchantText +232.000000 +22.000000 +12.000000,12.000000,0.000000 +9 +LabelContainerSceneLeftSmall + + + + +InventoryText +232.000000 +22.000000 +12.000000,138.000000,0.000000 +9 +LabelContainerSceneLeftSmall + + + + +EnchantPanel +144.000000 +94.000000 +103.000000,34.000000,0.000000 +PanelRecessed +false + + + + +EnchantButton3 +140.000000 +105.000000,96.000000,0.000000 +CXuiCtrlEnchantmentButton +EnchantmentButton_Small +false + + + + +EnchantButton2 +140.000000 +105.000000,66.000000,0.000000 +CXuiCtrlEnchantmentButton +EnchantmentButton_Small +false + + + + +EnchantButton1 +140.000000 +105.000000,36.000000,0.000000 +CXuiCtrlEnchantmentButton +EnchantmentButton_Small +false + + + + +Ingredient +32.000000 +32.000000 +38.000000,96.000000,0.000000 +3 +CXuiCtrlSlotList +ItemGridEnchant32 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonEnchant +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonEnchant +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonEnchant +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonEnchant32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonEnchant32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonEnchant32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonEnchant32 +22594 +4 + + + + + +EnchantmentBook +88.000000 +54.000000 +11.000000,34.000000,0.000000 +3 +CXuiCtrlEnchantmentBook +..\Images\img1.png + + + + +Pointer +26.000000 +26.000000 +-50.000000,-50.000000,0.000000 +9 +false +CXuiCtrlSlotItem +ItemPointerSmall + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +190.000015,96.000000,0.000000 + + + +0 +190.000000,96.000000,0.000000 + + + +2 +100 +-100 +50 +190.000000,96.000000,0.000000 + + + +0 +32.000000,96.000000,0.000000 + + + +2 +100 +-100 +50 +60.000000,96.000000,0.000000 + + + +0 +190.000000,96.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_enchant_small.h b/Minecraft.Client/Common/Media/xuiscene_enchant_small.h new file mode 100644 index 00000000..f90d3fce --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_enchant_small.h @@ -0,0 +1,216 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Ingredient L"Ingredient" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Inventory L"Inventory" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_UseRow L"UseRow" +#define IDC_EnchantText L"EnchantText" +#define IDC_InventoryText L"InventoryText" +#define IDC_EnchantmentBook L"EnchantmentBook" +#define IDC_EnchantPanel L"EnchantPanel" +#define IDC_EnchantButton3 L"EnchantButton3" +#define IDC_EnchantButton2 L"EnchantButton2" +#define IDC_EnchantButton1 L"EnchantButton1" +#define IDC_Pointer L"Pointer" +#define IDC_Group L"Group" +#define IDC_XuiSceneEnchant L"XuiSceneEnchant" diff --git a/Minecraft.Client/Common/Media/xuiscene_enchant_small.xui b/Minecraft.Client/Common/Media/xuiscene_enchant_small.xui new file mode 100644 index 00000000..7a248b2f --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_enchant_small.xui @@ -0,0 +1,2870 @@ + + +640.000000 +360.000000 + + + +XuiSceneEnchant +640.000000 +360.000000 +CXuiSceneEnchant +XuiBlankScene +Pointer + + + +Group +260.000000 +280.000000 +190.000000,0.000000,0.000000 +15 +GraphicPanel +Pointer + + + +Ingredient +32.000000 +32.000000 +38.000000,96.000000,0.000000 +3 +CXuiCtrlSlotList +ItemGridEnchant32 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonEnchant +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonEnchant +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonEnchant32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonEnchant32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonEnchant32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonEnchant32 +22594 +4 + + + + + +Inventory +234.000000 +80.000000 +13.000001,153.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical26 + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +UseRow +234.000000 +13.000001,243.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical26 + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +EnchantText +232.000000 +22.000000 +12.000000,12.000000,0.000000 +9 +LabelContainerSceneLeftSmall + + + + +InventoryText +232.000000 +22.000000 +12.000000,131.000000,0.000000 +9 +LabelContainerSceneLeftSmall + + + + +EnchantmentBook +88.000000 +54.000000 +11.000000,34.000000,0.000000 +3 +CXuiCtrlEnchantmentBook +..\Images\img1.png + + + + +EnchantPanel +144.000000 +94.000000 +103.000000,34.000000,0.000000 +PanelRecessed +false + + + + +EnchantButton3 +140.000000 +105.000000,96.000000,0.000000 +CXuiCtrlEnchantmentButton +EnchantmentButton_Small +false + + + + +EnchantButton2 +140.000000 +105.000000,66.000000,0.000000 +CXuiCtrlEnchantmentButton +EnchantmentButton_Small +false + + + + +EnchantButton1 +140.000000 +105.000000,36.000000,0.000000 +CXuiCtrlEnchantmentButton +EnchantmentButton_Small +false + + + + +Pointer +26.000000 +26.000000 +-50.000000,-50.000000,0.000000 +9 +false +CXuiCtrlSlotItem +ItemPointerSmall + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +190.000000,0.000000,0.000000 + + + +0 +190.000000,0.000000,0.000000 + + + +2 +100 +-100 +50 +190.000000,0.000000,0.000000 + + + +0 +64.000000,0.000000,0.000000 + + + +2 +100 +-100 +50 +92.000000,0.000000,0.000000 + + + +0 +190.000000,0.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_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_fullscreenprogress.h b/Minecraft.Client/Common/Media/xuiscene_fullscreenprogress.h new file mode 100644 index 00000000..867ae7a8 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_fullscreenprogress.h @@ -0,0 +1,23 @@ +#define IDC_Tip L"Tip" +#define IDC_Status L"Status" +#define IDC_Title L"Title" +#define IDC_Progress L"Progress" +#define IDC_Timer_Square_1 L"Timer_Square_1" +#define IDC_Timer_Square_2 L"Timer_Square_2" +#define IDC_Timer_Square_3 L"Timer_Square_3" +#define IDC_Timer_Square_4 L"Timer_Square_4" +#define IDC_Timer_Square_5 L"Timer_Square_5" +#define IDC_Timer_Square_6 L"Timer_Square_6" +#define IDC_Timer_Square_7 L"Timer_Square_7" +#define IDC_Timer_Square_8 L"Timer_Square_8" +#define IDC_Timer_Square_9 L"Timer_Square_9" +#define IDC_Timer_Square_10 L"Timer_Square_10" +#define IDC_Timer_Square_11 L"Timer_Square_11" +#define IDC_Timer_Square_12 L"Timer_Square_12" +#define IDC_Timer_Square_13 L"Timer_Square_13" +#define IDC_Timer_Square_14 L"Timer_Square_14" +#define IDC_Timer_Square_15 L"Timer_Square_15" +#define IDC_Timer_Square_16 L"Timer_Square_16" +#define IDC_Timer L"Timer" +#define IDC_ButtonConfirm L"ButtonConfirm" +#define IDC_FullscreenProgressScene L"FullscreenProgressScene" diff --git a/Minecraft.Client/Common/Media/xuiscene_fullscreenprogress.xui b/Minecraft.Client/Common/Media/xuiscene_fullscreenprogress.xui new file mode 100644 index 00000000..4dd7c067 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_fullscreenprogress.xui @@ -0,0 +1,932 @@ + + +1280.000000 +720.000000 + + + +FullscreenProgressScene +1280.000000 +720.000000 +CScene_FullscreenProgress +XuiMenuScene +ButtonConfirm + + + +Tip +800.000000 +100.000000 +240.000061,520.000000,0.000000 +TipPanel + + + + +Status +640.000000 +26.000000 +320.000031,360.000000,0.000000 +XuiLabel12_Shadowed + + + + +Title +960.000000 +100.000000 +160.000076,250.000000,0.000000 +XuiTitle + + + + +Progress +640.000000 +15.000000 +320.000000,390.000000,0.000000 +CXuiCtrlLoadingProgress +LoadingProgressState +50 + + + + +Timer +183.000000 +169.000000 +548.000000,328.000000,0.000000 +false +XuiBlankScene + + + +Timer_Square_1 +42.000000 +42.000000 +14.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_2 +42.000000 +42.000000 +68.499985,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_3 +42.000000 +42.000000 +123.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_4 +42.000000 +42.000000 +123.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_5 +42.000000 +42.000000 +123.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_6 +42.000000 +42.000000 +68.499985,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_7 +42.000000 +42.000000 +14.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_8 +42.000000 +42.000000 +14.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_9 +42.000000 +42.000000 +14.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_10 +42.000000 +42.000000 +68.499985,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_11 +42.000000 +42.000000 +123.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_12 +42.000000 +42.000000 +123.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_13 +42.000000 +42.000000 +123.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_14 +42.000000 +42.000000 +68.499985,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_15 +42.000000 +42.000000 +14.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_16 +42.000000 +42.000000 +14.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + + +LoadStart + + + +LoopStart + + + +LoopEnd + +gotoandplay +LoopStart + + + +Timer_Square_1 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_3 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_8 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_4 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_7 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_6 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_5 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_2 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_9 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_10 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_11 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_12 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_13 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_14 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x07ebebeb + + + +Timer_Square_15 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x49ebebeb + + + +Timer_Square_16 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x8cebebeb + + + + + + +ButtonConfirm +320.000000 +50.000000 +480.000031,446.000000,0.000000 +false + + + + + +Normal + + + +EndNormal + +gotoandplay +Normal + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_fullscreenprogress_480.h b/Minecraft.Client/Common/Media/xuiscene_fullscreenprogress_480.h new file mode 100644 index 00000000..70c6c3cf --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_fullscreenprogress_480.h @@ -0,0 +1,23 @@ +#define IDC_Tip L"Tip" +#define IDC_Status L"Status" +#define IDC_Title L"Title" +#define IDC_Progress L"Progress" +#define IDC_ButtonConfirm L"ButtonConfirm" +#define IDC_Timer_Square_1 L"Timer_Square_1" +#define IDC_Timer_Square_2 L"Timer_Square_2" +#define IDC_Timer_Square_3 L"Timer_Square_3" +#define IDC_Timer_Square_4 L"Timer_Square_4" +#define IDC_Timer_Square_5 L"Timer_Square_5" +#define IDC_Timer_Square_6 L"Timer_Square_6" +#define IDC_Timer_Square_7 L"Timer_Square_7" +#define IDC_Timer_Square_8 L"Timer_Square_8" +#define IDC_Timer_Square_9 L"Timer_Square_9" +#define IDC_Timer_Square_10 L"Timer_Square_10" +#define IDC_Timer_Square_11 L"Timer_Square_11" +#define IDC_Timer_Square_12 L"Timer_Square_12" +#define IDC_Timer_Square_13 L"Timer_Square_13" +#define IDC_Timer_Square_14 L"Timer_Square_14" +#define IDC_Timer_Square_15 L"Timer_Square_15" +#define IDC_Timer_Square_16 L"Timer_Square_16" +#define IDC_Timer L"Timer" +#define IDC_FullscreenProgressScene L"FullscreenProgressScene" diff --git a/Minecraft.Client/Common/Media/xuiscene_fullscreenprogress_480.xui b/Minecraft.Client/Common/Media/xuiscene_fullscreenprogress_480.xui new file mode 100644 index 00000000..9c5c7fbf --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_fullscreenprogress_480.xui @@ -0,0 +1,931 @@ + + +640.000000 +480.000000 + + + +FullscreenProgressScene +640.000000 +480.000000 +CScene_FullscreenProgress +XuiMenuScene +ButtonConfirm + + + +Tip +500.000000 +120.000000 +70.000000,256.000061,0.000000 +TipPanel + + + + +Status +500.000000 +26.000000 +70.000000,177.000046,0.000000 +XuiLabel12_Shadowed + + + + +Title +500.000000 +50.000000 +70.000000,130.000000,0.000000 +XuiTitleSmall + + + + +Progress +500.000000 +15.000000 +70.000000,207.000046,0.000000 +CXuiCtrlLoadingProgress +LoadingProgressState +50 + + + + +ButtonConfirm +320.000000 +50.000000 +160.000000,382.000061,0.000000 +false + + + + +Timer +72.000000 +72.000000 +284.000000,177.000000,0.000000 +15 +false +XuiBlankScene + + + +Timer_Square_1 +21.000000 +21.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_2 +21.000000 +21.000000 +25.000000,0.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_3 +21.000000 +21.000000 +50.000000,0.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_4 +21.000000 +21.000000 +50.000000,25.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_5 +21.000000 +21.000000 +50.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_6 +21.000000 +21.000000 +25.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_7 +21.000000 +21.000000 +0.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_8 +21.000000 +21.000000 +0.000000,25.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_9 +21.000000 +21.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_10 +21.000000 +21.000000 +25.000000,0.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_11 +21.000000 +21.000000 +50.000000,0.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_12 +21.000000 +21.000000 +50.000000,25.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_13 +21.000000 +21.000000 +50.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_14 +21.000000 +21.000000 +25.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_15 +21.000000 +21.000000 +0.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_16 +21.000000 +21.000000 +0.000000,25.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + + +LoadStart + + + +LoopStart + + + +LoopEnd + +gotoandplay +LoopStart + + + +Timer_Square_1 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_3 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_8 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_4 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_7 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_6 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_5 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_2 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_9 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_10 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_11 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_12 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_13 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_14 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x07ebebeb + + + +Timer_Square_15 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x49ebebeb + + + +Timer_Square_16 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x8cebebeb + + + + + + + +Normal + + + +EndNormal + +gotoandplay +Normal + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_fullscreenprogress_small.h b/Minecraft.Client/Common/Media/xuiscene_fullscreenprogress_small.h new file mode 100644 index 00000000..867ae7a8 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_fullscreenprogress_small.h @@ -0,0 +1,23 @@ +#define IDC_Tip L"Tip" +#define IDC_Status L"Status" +#define IDC_Title L"Title" +#define IDC_Progress L"Progress" +#define IDC_Timer_Square_1 L"Timer_Square_1" +#define IDC_Timer_Square_2 L"Timer_Square_2" +#define IDC_Timer_Square_3 L"Timer_Square_3" +#define IDC_Timer_Square_4 L"Timer_Square_4" +#define IDC_Timer_Square_5 L"Timer_Square_5" +#define IDC_Timer_Square_6 L"Timer_Square_6" +#define IDC_Timer_Square_7 L"Timer_Square_7" +#define IDC_Timer_Square_8 L"Timer_Square_8" +#define IDC_Timer_Square_9 L"Timer_Square_9" +#define IDC_Timer_Square_10 L"Timer_Square_10" +#define IDC_Timer_Square_11 L"Timer_Square_11" +#define IDC_Timer_Square_12 L"Timer_Square_12" +#define IDC_Timer_Square_13 L"Timer_Square_13" +#define IDC_Timer_Square_14 L"Timer_Square_14" +#define IDC_Timer_Square_15 L"Timer_Square_15" +#define IDC_Timer_Square_16 L"Timer_Square_16" +#define IDC_Timer L"Timer" +#define IDC_ButtonConfirm L"ButtonConfirm" +#define IDC_FullscreenProgressScene L"FullscreenProgressScene" diff --git a/Minecraft.Client/Common/Media/xuiscene_fullscreenprogress_small.xui b/Minecraft.Client/Common/Media/xuiscene_fullscreenprogress_small.xui new file mode 100644 index 00000000..5f728ada --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_fullscreenprogress_small.xui @@ -0,0 +1,931 @@ + + +640.000000 +360.000000 + + + +FullscreenProgressScene +640.000000 +360.000000 +CScene_FullscreenProgress +XuiMenuScene +ButtonConfirm + + + +Tip +500.000000 +120.000000 +70.000000,180.000061,0.000000 +TipPanel + + + + +Status +500.000000 +26.000000 +70.000000,130.000046,0.000000 +XuiLabel12_Shadowed + + + + +Title +500.000000 +32.000000 +70.000000,100.000000,0.000000 +XuiTitleSmall + + + + +Progress +500.000000 +15.000000 +70.000000,160.000046,0.000000 +CXuiCtrlLoadingProgress +LoadingProgressState +50 + + + + +Timer +72.000000 +72.000000 +284.000000,140.000000,0.000000 +15 +false +XuiBlankScene + + + +Timer_Square_1 +21.000000 +21.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_2 +21.000000 +21.000000 +25.000000,0.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_3 +21.000000 +21.000000 +50.000000,0.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_4 +21.000000 +21.000000 +50.000000,25.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_5 +21.000000 +21.000000 +50.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_6 +21.000000 +21.000000 +25.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_7 +21.000000 +21.000000 +0.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_8 +21.000000 +21.000000 +0.000000,25.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_9 +21.000000 +21.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_10 +21.000000 +21.000000 +25.000000,0.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_11 +21.000000 +21.000000 +50.000000,0.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_12 +21.000000 +21.000000 +50.000000,25.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_13 +21.000000 +21.000000 +50.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_14 +21.000000 +21.000000 +25.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_15 +21.000000 +21.000000 +0.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_16 +21.000000 +21.000000 +0.000000,25.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + + +LoadStart + + + +LoopStart + + + +LoopEnd + +gotoandplay +LoopStart + + + +Timer_Square_1 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_3 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_8 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_4 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_7 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_6 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_5 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_2 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_9 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_10 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_11 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_12 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_13 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_14 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x07ebebeb + + + +Timer_Square_15 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x49ebebeb + + + +Timer_Square_16 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x8cebebeb + + + + + + +ButtonConfirm +320.000000 +50.000000 +160.000000,212.000061,0.000000 +false + + + + + +Normal + + + +EndNormal + +gotoandplay +Normal + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_furnace.h b/Minecraft.Client/Common/Media/xuiscene_furnace.h new file mode 100644 index 00000000..285e3b89 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_furnace.h @@ -0,0 +1,45 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Result L"Result" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Fuel L"Fuel" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Ingredient L"Ingredient" +#define IDC_Burn L"Burn" +#define IDC_Lit L"Lit" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Inventory L"Inventory" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_UseRow L"UseRow" +#define IDC_InventoryText L"InventoryText" +#define IDC_FurnaceText L"FurnaceText" +#define IDC_FuelText L"FuelText" +#define IDC_IngredientText L"IngredientText" +#define IDC_Pointer L"Pointer" +#define IDC_Group L"Group" +#define IDC_XuiSceneFurnace L"XuiSceneFurnace" diff --git a/Minecraft.Client/Common/Media/xuiscene_furnace.xui b/Minecraft.Client/Common/Media/xuiscene_furnace.xui new file mode 100644 index 00000000..e89682c5 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_furnace.xui @@ -0,0 +1,650 @@ + + +1280.000000 +720.000000 + + + +XuiSceneFurnace +1280.000000 +720.000000 +CXuiSceneFurnace +XuiBlankScene +Pointer + + + +Group +428.000000 +430.000000 +426.000000,95.000000,0.000000 +15 +XuiScene +Pointer + + + +Result +64.000000 +64.000000 +308.000000,86.000000,0.000000 +CXuiCtrlSlotList +ItemGridVertical64 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +64.000000 +64.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton64 +22594 +4 + + + + + +Fuel +52.000000 +52.000000 +152.000031,142.000015,0.000000 +3 +CXuiCtrlSlotList +ItemGridVertical + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + + +Ingredient +66.000000 +62.000000 +153.000031,48.000000,0.000000 +3 +CXuiCtrlSlotList +ItemGridVertical + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + + +Burn +72.000000 +48.000000 +225.000000,94.000000,0.000000 +CXuiCtrlBurnProgress +ArrowProgressState +24 + + + + +Lit +51.000000 +50.000000 +148.000000,90.000000,0.000000 +CXuiCtrlFireProgress +FlameProgressState +12 + + + + +Inventory +382.000000 +150.000000 +25.000000,220.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + + +UseRow +381.000000 +50.000000 +25.000000,359.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + + +InventoryText +378.000000 +34.000000 +24.000000,190.000000,0.000000 +12 +LabelContainerSceneLeft + + + + +FurnaceText +380.000000 +34.000000 +26.000000,12.000000,0.000000 +LabelContainerSceneLeft + + + + +FuelText +125.000000 +20.000000 +18.000000,152.000000,0.000000 +3 +LabelContainerSceneRight + + + + +IngredientText +125.000000 +20.000000 +18.000000,58.000000,0.000000 +3 +LabelContainerSceneRight + + + + +Pointer +42.000000 +42.000000 +-185.000000,-83.000015,0.000000 +9 +false +CXuiCtrlSlotItem +ItemPointer + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +426.000000,95.000000,0.000000 + + + +0 +426.000000,95.000000,0.000000 + + + +2 +100 +-100 +50 +424.500031,95.000000,0.000000 + + + +0 +160.000000,95.000000,0.000000 + + + +2 +100 +-100 +50 +160.000000,95.000000,0.000000 + + + +0 +426.000000,95.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_furnace_480.h b/Minecraft.Client/Common/Media/xuiscene_furnace_480.h new file mode 100644 index 00000000..4489ca7f --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_furnace_480.h @@ -0,0 +1,103 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Result L"Result" +#define IDC_Lit L"Lit" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Fuel L"Fuel" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Ingredient L"Ingredient" +#define IDC_Burn L"Burn" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Inventory L"Inventory" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_UseRow L"UseRow" +#define IDC_InventoryText L"InventoryText" +#define IDC_FurnaceText L"FurnaceText" +#define IDC_FuelText L"FuelText" +#define IDC_IngredientText L"IngredientText" +#define IDC_Pointer L"Pointer" +#define IDC_Group L"Group" +#define IDC_XuiSceneFurnace L"XuiSceneFurnace" diff --git a/Minecraft.Client/Common/Media/xuiscene_furnace_480.xui b/Minecraft.Client/Common/Media/xuiscene_furnace_480.xui new file mode 100644 index 00000000..bb4c7d93 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_furnace_480.xui @@ -0,0 +1,1399 @@ + + +640.000000 +480.000000 + + + +XuiSceneFurnace +640.000000 +480.000000 +CXuiSceneFurnace +XuiBlankScene +Pointer + + + +Group +260.000000 +290.000000 +190.000000,96.000000,0.000000 +15 +GraphicPanel +Pointer + + + +Result +44.000000 +44.000000 +200.000000,60.000000,0.000000 +CXuiCtrlSlotList +ItemGridVertical + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + + +Lit +32.000000 +32.000000 +124.000000,66.000000,0.000000 +CXuiCtrlFireProgress +FlameProgressStateSmall +12 + + + + +Fuel +34.000000 +34.000000 +124.000000,98.000000,0.000000 +3 +CXuiCtrlSlotList +ItemGridVerticalSmall + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +34.000000 +34.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +34.000000 +34.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +34.000000 +34.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +34.000000 +34.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + + +Ingredient +36.000000 +36.000000 +124.000000,32.000000,0.000000 +3 +CXuiCtrlSlotList +ItemGridVerticalSmall + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +34.000000 +34.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +34.000000 +34.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +34.000000 +34.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +34.000000 +34.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + + +Burn +32.000000 +32.000000 +164.000000,64.000000,0.000000 +CXuiCtrlBurnProgress +ArrowProgressStateSmall +24 + + + + +Inventory +234.000000 +78.000000 +13.000000,162.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical26 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +UseRow +234.000000 +13.000000,250.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical26 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +InventoryText +234.000000 +25.000000 +12.000000,140.000000,0.000000 +9 +LabelContainerSceneLeftSmall + + + + +FurnaceText +234.000000 +26.000000 +12.000000,8.000000,0.000000 +LabelContainerSceneLeftSmall + + + + +FuelText +114.000000 +20.000000 +6.000000,108.000000,0.000000 +3 +LabelContainerSceneRightSmall + + + + +IngredientText +114.000000 +20.000000 +6.000000,42.000000,0.000000 +3 +LabelContainerSceneRightSmall + + + + +Pointer +26.000000 +26.000000 +-50.000000,-50.000000,0.000000 +9 +false +CXuiCtrlSlotItem +ItemPointerSmall + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +190.000000,96.000000,0.000000 + + + +0 +190.000000,96.000000,0.000000 + + + +2 +100 +-100 +50 +190.000000,96.000000,0.000000 + + + +0 +33.750000,96.000000,0.000000 + + + +2 +100 +-100 +50 +60.000000,96.000000,0.000000 + + + +0 +190.000000,96.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_furnace_Small.h b/Minecraft.Client/Common/Media/xuiscene_furnace_Small.h new file mode 100644 index 00000000..61c09fc1 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_furnace_Small.h @@ -0,0 +1,61 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Result L"Result" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Fuel L"Fuel" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Ingredient L"Ingredient" +#define IDC_Burn L"Burn" +#define IDC_Lit L"Lit" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Inventory L"Inventory" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_UseRow L"UseRow" +#define IDC_InventoryText L"InventoryText" +#define IDC_FurnaceText L"FurnaceText" +#define IDC_FuelText L"FuelText" +#define IDC_IngredientText L"IngredientText" +#define IDC_Pointer L"Pointer" +#define IDC_Group L"Group" +#define IDC_XuiSceneFurnace L"XuiSceneFurnace" diff --git a/Minecraft.Client/Common/Media/xuiscene_furnace_Small.xui b/Minecraft.Client/Common/Media/xuiscene_furnace_Small.xui new file mode 100644 index 00000000..e301d409 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_furnace_Small.xui @@ -0,0 +1,847 @@ + + +640.000000 +360.000000 + + + +XuiSceneFurnace +640.000000 +360.000000 +CXuiSceneFurnace +XuiBlankScene +Pointer + + + +Group +260.000000 +290.000000 +190.000000,2.000000,0.000000 +15 +GraphicPanel +Pointer + + + +Result +45.639984 +46.888008 +201.991943,58.343994,0.000000 +CXuiCtrlSlotList +ItemGridVertical + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + + +Fuel +39.712006 +40.479996 +122.991974,98.344009,0.000000 +3 +CXuiCtrlSlotList +ItemGridVerticalSmall + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +34.000000 +34.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +34.000000 +34.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + + +Ingredient +38.352005 +37.960014 +123.991974,31.343994,0.000000 +3 +CXuiCtrlSlotList +ItemGridVerticalSmall + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +34.000000 +34.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +34.000000 +34.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + + +Burn +32.000000 +32.639999 +163.991943,63.343994,0.000000 +CXuiCtrlBurnProgress +ArrowProgressStateSmall +24 + + + + +Lit +34.104004 +33.435295 +121.991943,64.908691,0.000000 +CXuiCtrlFireProgress +FlameProgressStateSmall +12 + + + + +Inventory +234.000000 +80.000000 +12.000000,161.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical26 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +UseRow +234.000000 +12.000000,250.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical26 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +InventoryText +233.000000 +12.000000,139.000000,0.000000 +9 +LabelContainerSceneLeftSmall + + + + +FurnaceText +229.000000 +26.000000 +12.000000,7.000000,0.000000 +3 +LabelContainerSceneLeftSmall + + + + +FuelText +114.000000 +20.000000 +6.000000,108.000000,0.000000 +3 +LabelContainerSceneRightSmall + + + + +IngredientText +114.000000 +20.000000 +6.000000,42.000000,0.000000 +3 +LabelContainerSceneRightSmall + + + + +Pointer +26.000000 +26.000000 +-50.000000,-50.000000,0.000000 +9 +false +CXuiCtrlSlotItem +ItemPointerSmall + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +190.000000,2.000000,0.000000 + + + +0 +190.000000,2.000000,0.000000 + + + +2 +100 +-100 +50 +190.000000,2.000000,0.000000 + + + +0 +64.000000,2.000000,0.000000 + + + +2 +100 +-100 +50 +92.000000,2.000000,0.000000 + + + +0 +190.000000,2.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_helpandoptions.h b/Minecraft.Client/Common/Media/xuiscene_helpandoptions.h new file mode 100644 index 00000000..357dc1ea --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_helpandoptions.h @@ -0,0 +1,25 @@ +#define IDC_XuiButton1 L"XuiButton1" +#define IDC_XuiButton2 L"XuiButton2" +#define IDC_XuiButton3 L"XuiButton3" +#define IDC_XuiButton4 L"XuiButton4" +#define IDC_XuiButton5 L"XuiButton5" +#define IDC_XuiButton6 L"XuiButton6" +#define IDC_XuiButton7 L"XuiButton7" +#define IDC_Timer_Square_1 L"Timer_Square_1" +#define IDC_Timer_Square_2 L"Timer_Square_2" +#define IDC_Timer_Square_3 L"Timer_Square_3" +#define IDC_Timer_Square_4 L"Timer_Square_4" +#define IDC_Timer_Square_5 L"Timer_Square_5" +#define IDC_Timer_Square_6 L"Timer_Square_6" +#define IDC_Timer_Square_7 L"Timer_Square_7" +#define IDC_Timer_Square_8 L"Timer_Square_8" +#define IDC_Timer_Square_9 L"Timer_Square_9" +#define IDC_Timer_Square_10 L"Timer_Square_10" +#define IDC_Timer_Square_11 L"Timer_Square_11" +#define IDC_Timer_Square_12 L"Timer_Square_12" +#define IDC_Timer_Square_13 L"Timer_Square_13" +#define IDC_Timer_Square_14 L"Timer_Square_14" +#define IDC_Timer_Square_15 L"Timer_Square_15" +#define IDC_Timer_Square_16 L"Timer_Square_16" +#define IDC_Timer L"Timer" +#define IDC_SceneHelpAndOptions L"SceneHelpAndOptions" diff --git a/Minecraft.Client/Common/Media/xuiscene_helpandoptions.xui b/Minecraft.Client/Common/Media/xuiscene_helpandoptions.xui new file mode 100644 index 00000000..e18afb14 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_helpandoptions.xui @@ -0,0 +1,949 @@ + + +1280.000000 +720.000000 + + + +SceneHelpAndOptions +1280.000000 +720.000000 +CScene_HelpAndOptions +XuiMenuScene +XuiButton1 + + + +XuiButton1 +450.000000 +40.000000 +414.000000,250.000000,0.000000 +XuiMainMenuButton_L +XuiButton7 +XuiButton2 + + + + +XuiButton2 +450.000000 +40.000000 +414.000000,300.000000,0.000000 +XuiMainMenuButton_L +XuiButton1 +XuiButton3 + + + + +XuiButton3 +450.000000 +40.000000 +414.000000,350.000000,0.000000 +XuiMainMenuButton_L +XuiButton2 +XuiButton4 + + + + +XuiButton4 +450.000000 +40.000000 +414.000000,400.000000,0.000000 +XuiMainMenuButton_L +XuiButton3 +XuiButton5 + + + + +XuiButton5 +450.000000 +40.000000 +414.000000,450.000000,0.000000 +XuiMainMenuButton_L +XuiButton4 +XuiButton6 + + + + +XuiButton6 +450.000000 +40.000000 +414.000000,500.000000,0.000000 +false +XuiMainMenuButton_L +XuiButton5 +XuiButton7 + + + + +XuiButton7 +450.000000 +40.000000 +414.000000,550.000000,0.000000 +false +XuiMainMenuButton_L +XuiButton6 +XuiButton1 + + + + +Timer +182.000000 +168.000000 +549.000000,288.000000,0.000000 +XuiBlankScene + + + +Timer_Square_1 +42.000000 +42.000000 +14.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_2 +42.000000 +42.000000 +68.499985,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_3 +42.000000 +42.000000 +123.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_4 +42.000000 +42.000000 +123.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_5 +42.000000 +42.000000 +123.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_6 +42.000000 +42.000000 +68.499985,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_7 +42.000000 +42.000000 +14.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_8 +42.000000 +42.000000 +14.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_9 +42.000000 +42.000000 +14.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_10 +42.000000 +42.000000 +68.499985,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_11 +42.000000 +42.000000 +123.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_12 +42.000000 +42.000000 +123.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_13 +42.000000 +42.000000 +123.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_14 +42.000000 +42.000000 +68.499985,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_15 +42.000000 +42.000000 +14.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_16 +42.000000 +42.000000 +14.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + + +LoadStart + + + +LoopStart + + + +LoopEnd + +gotoandplay +LoopStart + + + +Timer_Square_1 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_3 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_8 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_4 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_7 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_6 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_5 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_2 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_9 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_10 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_11 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_12 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_13 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_14 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x07ebebeb + + + +Timer_Square_15 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x49ebebeb + + + +Timer_Square_16 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x8cebebeb + + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_helpandoptions_480.h b/Minecraft.Client/Common/Media/xuiscene_helpandoptions_480.h new file mode 100644 index 00000000..357dc1ea --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_helpandoptions_480.h @@ -0,0 +1,25 @@ +#define IDC_XuiButton1 L"XuiButton1" +#define IDC_XuiButton2 L"XuiButton2" +#define IDC_XuiButton3 L"XuiButton3" +#define IDC_XuiButton4 L"XuiButton4" +#define IDC_XuiButton5 L"XuiButton5" +#define IDC_XuiButton6 L"XuiButton6" +#define IDC_XuiButton7 L"XuiButton7" +#define IDC_Timer_Square_1 L"Timer_Square_1" +#define IDC_Timer_Square_2 L"Timer_Square_2" +#define IDC_Timer_Square_3 L"Timer_Square_3" +#define IDC_Timer_Square_4 L"Timer_Square_4" +#define IDC_Timer_Square_5 L"Timer_Square_5" +#define IDC_Timer_Square_6 L"Timer_Square_6" +#define IDC_Timer_Square_7 L"Timer_Square_7" +#define IDC_Timer_Square_8 L"Timer_Square_8" +#define IDC_Timer_Square_9 L"Timer_Square_9" +#define IDC_Timer_Square_10 L"Timer_Square_10" +#define IDC_Timer_Square_11 L"Timer_Square_11" +#define IDC_Timer_Square_12 L"Timer_Square_12" +#define IDC_Timer_Square_13 L"Timer_Square_13" +#define IDC_Timer_Square_14 L"Timer_Square_14" +#define IDC_Timer_Square_15 L"Timer_Square_15" +#define IDC_Timer_Square_16 L"Timer_Square_16" +#define IDC_Timer L"Timer" +#define IDC_SceneHelpAndOptions L"SceneHelpAndOptions" diff --git a/Minecraft.Client/Common/Media/xuiscene_helpandoptions_480.xui b/Minecraft.Client/Common/Media/xuiscene_helpandoptions_480.xui new file mode 100644 index 00000000..cea101d6 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_helpandoptions_480.xui @@ -0,0 +1,950 @@ + + +640.000000 +480.000000 + + + +SceneHelpAndOptions +640.000000 +480.000000 +CScene_HelpAndOptions +XuiMenuScene +XuiButton1 + + + +XuiButton1 +300.000000 +36.000000 +170.000031,140.000000,0.000000 +XuiMainMenuButton_L_Thin +XuiButton8 +XuiButton2 + + + + +XuiButton2 +300.000000 +36.000000 +170.000031,180.000000,0.000000 +XuiMainMenuButton_L_Thin +XuiButton1 +XuiButton3 + + + + +XuiButton3 +300.000000 +36.000000 +170.000031,220.000000,0.000000 +XuiMainMenuButton_L_Thin +XuiButton2 +XuiButton4 + + + + +XuiButton4 +300.000000 +36.000000 +170.000031,260.000000,0.000000 +XuiMainMenuButton_L_Thin +XuiButton3 +XuiButton5 + + + + +XuiButton5 +300.000000 +36.000000 +170.000031,300.000000,0.000000 +XuiMainMenuButton_L_Thin +XuiButton4 +XuiButton6 + + + + +XuiButton6 +300.000000 +36.000000 +170.000031,340.000000,0.000000 +false +XuiMainMenuButton_L_Thin +XuiButton5 +XuiButton7 + + + + +XuiButton7 +300.000000 +36.000000 +170.000031,380.000000,0.000000 +false +XuiMainMenuButton_L_Thin +XuiButton6 +XuiButton1 + + + + +Timer +184.000000 +170.000000 +274.000000,195.000000,0.000000 +0.500000,0.500000,1.000000 +XuiBlankScene + + + +Timer_Square_1 +42.000000 +42.000000 +14.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_2 +42.000000 +42.000000 +68.499985,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_3 +42.000000 +42.000000 +123.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_4 +42.000000 +42.000000 +123.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_5 +42.000000 +42.000000 +123.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_6 +42.000000 +42.000000 +68.499985,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_7 +42.000000 +42.000000 +14.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_8 +42.000000 +42.000000 +14.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_9 +42.000000 +42.000000 +14.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_10 +42.000000 +42.000000 +68.499985,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_11 +42.000000 +42.000000 +123.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_12 +42.000000 +42.000000 +123.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_13 +42.000000 +42.000000 +123.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_14 +42.000000 +42.000000 +68.499985,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_15 +42.000000 +42.000000 +14.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_16 +42.000000 +42.000000 +14.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + + +LoadStart + + + +LoopStart + + + +LoopEnd + +gotoandplay +LoopStart + + + +Timer_Square_1 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_3 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_8 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_4 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_7 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_6 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_5 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_2 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_9 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_10 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_11 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_12 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_13 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_14 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x07ebebeb + + + +Timer_Square_15 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x49ebebeb + + + +Timer_Square_16 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x8cebebeb + + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_helpandoptions_small.h b/Minecraft.Client/Common/Media/xuiscene_helpandoptions_small.h new file mode 100644 index 00000000..357dc1ea --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_helpandoptions_small.h @@ -0,0 +1,25 @@ +#define IDC_XuiButton1 L"XuiButton1" +#define IDC_XuiButton2 L"XuiButton2" +#define IDC_XuiButton3 L"XuiButton3" +#define IDC_XuiButton4 L"XuiButton4" +#define IDC_XuiButton5 L"XuiButton5" +#define IDC_XuiButton6 L"XuiButton6" +#define IDC_XuiButton7 L"XuiButton7" +#define IDC_Timer_Square_1 L"Timer_Square_1" +#define IDC_Timer_Square_2 L"Timer_Square_2" +#define IDC_Timer_Square_3 L"Timer_Square_3" +#define IDC_Timer_Square_4 L"Timer_Square_4" +#define IDC_Timer_Square_5 L"Timer_Square_5" +#define IDC_Timer_Square_6 L"Timer_Square_6" +#define IDC_Timer_Square_7 L"Timer_Square_7" +#define IDC_Timer_Square_8 L"Timer_Square_8" +#define IDC_Timer_Square_9 L"Timer_Square_9" +#define IDC_Timer_Square_10 L"Timer_Square_10" +#define IDC_Timer_Square_11 L"Timer_Square_11" +#define IDC_Timer_Square_12 L"Timer_Square_12" +#define IDC_Timer_Square_13 L"Timer_Square_13" +#define IDC_Timer_Square_14 L"Timer_Square_14" +#define IDC_Timer_Square_15 L"Timer_Square_15" +#define IDC_Timer_Square_16 L"Timer_Square_16" +#define IDC_Timer L"Timer" +#define IDC_SceneHelpAndOptions L"SceneHelpAndOptions" diff --git a/Minecraft.Client/Common/Media/xuiscene_helpandoptions_small.xui b/Minecraft.Client/Common/Media/xuiscene_helpandoptions_small.xui new file mode 100644 index 00000000..fac4714f --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_helpandoptions_small.xui @@ -0,0 +1,950 @@ + + +640.000000 +360.000000 + + + +SceneHelpAndOptions +640.000000 +360.000000 +CScene_HelpAndOptions +XuiMenuScene +XuiButton1 + + + +XuiButton1 +400.000000 +40.000000 +120.000023,48.000000,0.000000 +XuiMainMenuButton_L +XuiButton7 +XuiButton2 + + + + +XuiButton2 +400.000000 +40.000000 +120.000023,93.000000,0.000000 +XuiMainMenuButton_L +XuiButton1 +XuiButton3 + + + + +XuiButton3 +400.000000 +40.000000 +120.000023,138.000000,0.000000 +XuiMainMenuButton_L +XuiButton2 +XuiButton4 + + + + +XuiButton4 +400.000000 +40.000000 +120.000023,183.000000,0.000000 +XuiMainMenuButton_L +XuiButton3 +XuiButton5 + + + + +XuiButton5 +400.000000 +40.000000 +120.000023,228.000000,0.000000 +XuiMainMenuButton_L +XuiButton4 +XuiButton6 + + + + +XuiButton6 +400.000000 +40.000000 +120.000000,273.000000,0.000000 +false +XuiMainMenuButton_L +XuiButton5 +XuiButton7 + + + + +XuiButton7 +400.000000 +40.000000 +120.000000,318.000000,0.000000 +false +XuiMainMenuButton_L +XuiButton6 +XuiButton1 + + + + +Timer +184.000000 +170.000000 +274.000000,118.000000,0.000000 +0.500000,0.500000,1.000000 +XuiBlankScene + + + +Timer_Square_1 +42.000000 +42.000000 +14.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_2 +42.000000 +42.000000 +68.499985,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_3 +42.000000 +42.000000 +123.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_4 +42.000000 +42.000000 +123.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_5 +42.000000 +42.000000 +123.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_6 +42.000000 +42.000000 +68.499985,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_7 +42.000000 +42.000000 +14.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_8 +42.000000 +42.000000 +14.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_9 +42.000000 +42.000000 +14.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_10 +42.000000 +42.000000 +68.499985,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_11 +42.000000 +42.000000 +123.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_12 +42.000000 +42.000000 +123.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_13 +42.000000 +42.000000 +123.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_14 +42.000000 +42.000000 +68.499985,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_15 +42.000000 +42.000000 +14.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_16 +42.000000 +42.000000 +14.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + + +LoadStart + + + +LoopStart + + + +LoopEnd + +gotoandplay +LoopStart + + + +Timer_Square_1 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_3 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_8 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_4 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_7 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_6 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_5 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_2 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_9 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_10 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_11 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_12 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_13 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_14 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x07ebebeb + + + +Timer_Square_15 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x49ebebeb + + + +Timer_Square_16 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x8cebebeb + + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_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 new file mode 100644 index 00000000..c51696ea --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_howtoplay.h @@ -0,0 +1,91 @@ +#define IDC_XuiImageNetherPortal L"XuiImageNetherPortal" +#define IDC_XuiHtmlControlNetherPortal L"XuiHtmlControlNetherPortal" +#define IDC_XuiImageTheEnd L"XuiImageTheEnd" +#define IDC_XuiHtmlControlTheEnd L"XuiHtmlControlTheEnd" +#define IDC_XuiImageDispenser L"XuiImageDispenser" +#define IDC_XuiHtmlControlDispenser L"XuiHtmlControlDispenser" +#define IDC_DInventory L"DInventory" +#define IDC_DText L"DText" +#define IDC_XuiHtmlControlHUD L"XuiHtmlControlHUD" +#define IDC_XuiImageHUD L"XuiImageHUD" +#define IDC_XuiHtmlControlBasics L"XuiHtmlControlBasics" +#define IDC_XuiImageInventory L"XuiImageInventory" +#define IDC_IInventory L"IInventory" +#define IDC_XuiHtmlControlInventory L"XuiHtmlControlInventory" +#define IDC_XuiImageChest L"XuiImageChest" +#define IDC_SCChest L"SCChest" +#define IDC_SCInventory L"SCInventory" +#define IDC_XuiHtmlControlChest L"XuiHtmlControlChest" +#define IDC_XuiHtmlControlLargeChest L"XuiHtmlControlLargeChest" +#define IDC_XuiImageLargeChest L"XuiImageLargeChest" +#define IDC_LCChest L"LCChest" +#define IDC_LCInventory L"LCInventory" +#define IDC_XuiImageFurnace L"XuiImageFurnace" +#define IDC_FChest L"FChest" +#define IDC_FIngredient L"FIngredient" +#define IDC_FInventory L"FInventory" +#define IDC_FFuel L"FFuel" +#define IDC_XuiHtmlControlFurnace L"XuiHtmlControlFurnace" +#define IDC_XuiImageCrafting L"XuiImageCrafting" +#define IDC_CInventory L"CInventory" +#define IDC_CGroup L"CGroup" +#define IDC_CItem L"CItem" +#define IDC_XuiHtmlControlCrafting L"XuiHtmlControlCrafting" +#define IDC_XuiImageCraftingTable L"XuiImageCraftingTable" +#define IDC_CTInventory3x3 L"CTInventory3x3" +#define IDC_CTGroup L"CTGroup" +#define IDC_CTItem L"CTItem" +#define IDC_XuiHtmlControlCraftingTable L"XuiHtmlControlCraftingTable" +#define IDC_XuiHtmlControlMultiplayer L"XuiHtmlControlMultiplayer" +#define IDC_XuiHtmlControlSocialMedia L"XuiHtmlControlSocialMedia" +#define IDC_XuiHtmlControlBanList L"XuiHtmlControlBanList" +#define IDC_XuiHtmlControlWhatsNew L"XuiHtmlControlWhatsNew" +#define IDC_XuiHtmlControlCreative L"XuiHtmlControlCreative" +#define IDC_XuiImageCreative L"XuiImageCreative" +#define IDC_CIGroup L"CIGroup" +#define IDC_XuiHtmlControlHostOptions L"XuiHtmlControlHostOptions" +#define IDC_XuiHtmlControlBreeding L"XuiHtmlControlBreeding" +#define IDC_XuiImageBreeding L"XuiImageBreeding" +#define IDC_XuiHtmlControlFarmingAnimals L"XuiHtmlControlFarmingAnimals" +#define IDC_XuiImageFarmingAnimals L"XuiImageFarmingAnimals" +#define IDC_XuiHtmlControlBrewing L"XuiHtmlControlBrewing" +#define IDC_XuiImageBrewing L"XuiImageBrewing" +#define IDC_BInventory L"BInventory" +#define IDC_BBrew L"BBrew" +#define IDC_XuiHtmlControlEnchantment L"XuiHtmlControlEnchantment" +#define IDC_XuiImageEnchantment L"XuiImageEnchantment" +#define IDC_EInventory L"EInventory" +#define IDC_EEnchant L"EEnchant" +#define IDC_XuiHtmlControlAnvil L"XuiHtmlControlAnvil" +#define IDC_XuiImageAnvil L"XuiImageAnvil" +#define IDC_ACost L"ACost" +#define IDC_AInventory L"AInventory" +#define IDC_ARepairAndName L"ARepairAndName" +#define IDC_XuiHtmlControlTrading L"XuiHtmlControlTrading" +#define IDC_XuiImageTrading L"XuiImageTrading" +#define IDC_TVillagerOffers L"TVillagerOffers" +#define IDC_TNeededForTrade L"TNeededForTrade" +#define IDC_TOffer1Label L"TOffer1Label" +#define IDC_TOffer2Label L"TOffer2Label" +#define IDC_TInventory L"TInventory" +#define IDC_XuiHtmlControlEnderchest L"XuiHtmlControlEnderchest" +#define IDC_XuiImageEnderchest L"XuiImageEnderchest" +#define IDC_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 new file mode 100644 index 00000000..f169f718 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_howtoplay.xui @@ -0,0 +1,829 @@ + + +1280.000000 +720.000000 + + + +SceneHowToPlay +1280.000000 +720.000000 +[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 + + + +XuiImageNetherPortal +525.000000 +308.000000 +596.000000,252.000000,0.000000 +ImHowToPlayNetherPortal + + + + +XuiHtmlControlNetherPortal +380.000000 +296.000000 +180.000000,252.000000,0.000000 +XuiHtmlControl_H2P + + + + +XuiImageTheEnd +525.000000 +308.000000 +596.000000,252.000000,0.000000 +ImHowToPlayTheEnd + + + + +XuiHtmlControlTheEnd +380.000000 +296.000000 +180.000000,252.000000,0.000000 +XuiHtmlControl_H2P + + + + +XuiImageDispenser +453.000000 +431.000000 +658.000000,186.000000,0.000000 +ImHowToPlayDispenser + + + + +XuiHtmlControlDispenser +380.000000 +296.000000 +220.000000,252.000000,0.000000 +XuiHtmlControl_H2P + + + + +DInventory +372.000000 +28.000000 +696.000000,376.000000,0.000000 +LabelContainerSceneLeft + + + + +DText +260.000000 +32.000000 +820.000000,214.000000,0.000000 +LabelContainerSceneLeft + + + + +XuiHtmlControlHUD +706.000000 +188.000000 +286.000000,218.000046,0.000000 +XuiHtmlControl_H2P + + + + +XuiImageHUD +583.000000 +157.000000 +348.000000,444.000000,0.000000 +ImHowToPlayHUD + + + + +XuiHtmlControlBasics +634.000000 +384.000000 +322.000000,218.000046,0.000000 +XuiHtmlControl_H2P + + + + +XuiImageInventory +451.000000 +455.000000 +654.000000,196.000000,0.000000 +ImHowToPlayInventory + + + + +IInventory +372.000000 +28.000000 +692.000000,406.000000,0.000000 +LabelContainerSceneLeft + + + + +XuiHtmlControlInventory +404.000000 +380.000000 +204.000046,226.000000,0.000000 +XuiHtmlControl_H2P + + + + +XuiImageChest +449.000000 +434.000000 +626.000000,196.000000,0.000000 +ImHowToPlayChest + + + + +SCChest +376.000000 +28.000000 +662.000000,220.000000,0.000000 +LabelContainerSceneLeft + + + + +SCInventory +376.000000 +32.000000 +662.000000,388.000000,0.000000 +LabelContainerSceneLeft + + + + +XuiHtmlControlChest +362.000000 +271.000000 +231.000000,272.000000,0.000000 +XuiHtmlControl_H2P + + + + +XuiHtmlControlLargeChest +364.000000 +260.000000 +280.000000,262.000000,0.000000 +XuiHtmlControl_H2P + + + + +XuiImageLargeChest +335.000000 +417.000000 +686.000000,196.000000,0.000000 +ImHowToPlayLargeChest + + + + +LCChest +280.000000 +24.000000 +712.000000,212.000000,0.000000 +LabelContainerSceneLeft + + + + +LCInventory +280.000000 +24.000000 +712.000000,430.000000,0.000000 +LabelContainerSceneLeft + + + + +XuiImageFurnace +444.000000 +448.000000 +639.000000,194.000000,0.000000 +ImHowToPlayFurnace + + + + +FChest +325.000000 +34.000000 +666.000000,206.000000,0.000000 +LabelContainerSceneLeft + + + + +FIngredient +125.000000 +20.000000 +661.000000,258.000000,0.000000 +LabelContainerSceneRight + + + + +FInventory +320.000000 +34.000000 +666.000000,384.000000,0.000000 +LabelContainerSceneLeft + + + + +FFuel +125.000000 +20.000000 +661.000000,352.000000,0.000000 +LabelContainerSceneRight + + + + +XuiHtmlControlFurnace +380.000000 +359.000000 +217.750015,222.000000,0.000000 +XuiHtmlControl_H2P + + + + +XuiImageCrafting +563.000000 +428.000000 +599.000000,206.000000,0.000000 +ImHowToPlayCrafting + + + + +CInventory +242.000000 +20.000000 +844.000000,458.000000,0.000000 +XuiLabelDarkCentred + + + + +CGroup +492.000000 +27.000000 +610.000000,282.000000,0.000000 +XuiLabelDarkCentred + + + + +CItem +215.000000 +20.000000 +612.000000,458.000000,0.000000 +XuiLabelDarkCentred + + + + +XuiHtmlControlCrafting +380.000000 +331.000000 +188.000000,246.000000,0.000000 +XuiHtmlControl_H2P + + + + +XuiImageCraftingTable +517.000000 +371.000000 +590.000000,224.000000,0.000000 +ImHowToPlayCraftingTable + + + + +CTInventory3x3 +264.000000 +20.000000 +827.000000,442.000000,0.000000 +XuiLabelDarkCentred + + + + +CTGroup +340.000000 +27.000000 +680.000000,294.000000,0.000000 +XuiLabelDarkCentred + + + + +CTItem +209.678864 +20.000000 +607.000000,442.000000,0.000000 +XuiLabelDarkCentred + + + + +XuiHtmlControlCraftingTable +365.000000 +322.000000 +194.000000,242.000031,0.000000 +XuiHtmlControl_H2P + + + + +XuiHtmlControlMultiplayer +633.000000 +384.000000 +324.000000,218.000046,0.000000 +XuiHtmlControl_H2P + + + + +XuiHtmlControlSocialMedia +633.000000 +384.000000 +324.000000,218.000046,0.000000 +XuiHtmlControl_H2P + + + + +XuiHtmlControlBanList +633.000000 +384.000000 +324.000000,218.000046,0.000000 +XuiHtmlControl_H2P + + + + +XuiHtmlControlWhatsNew +633.000000 +384.000000 +324.000000,218.000046,0.000000 +XuiHtmlControl_H2P + + + + +XuiHtmlControlCreative +380.000000 +331.000000 +198.000000,242.000000,0.000000 +XuiHtmlControl_H2P + + + + +XuiImageCreative +491.000000 +371.000000 +611.000000,226.000000,0.000000 +ImHowToPlayCreative + + + + +CIGroup +340.000000 +27.000000 +687.000000,290.000000,0.000000 +XuiLabelDarkCentred + + + + +XuiHtmlControlHostOptions +633.000000 +384.000000 +324.000000,218.000046,0.000000 +XuiHtmlControl_H2P + + + + +XuiHtmlControlBreeding +380.000000 +331.000000 +198.000000,242.000000,0.000000 +XuiHtmlControl_H2P + + + + +XuiImageBreeding +339.000000 +342.000000 +612.000000,246.000000,0.000000 +ImHowToPlayBreeding + + + + +XuiHtmlControlFarmingAnimals +380.000000 +331.000000 +198.000000,242.000000,0.000000 +XuiHtmlControl_H2P + + + + +XuiImageFarmingAnimals +339.000000 +342.000000 +612.000000,246.000000,0.000000 +ImHowToPlayFarmingAnimals + + + + +XuiHtmlControlBrewing +380.000000 +331.000000 +198.000000,242.000000,0.000000 +XuiHtmlControl_H2P + + + + +XuiImageBrewing +339.000000 +342.000000 +612.000000,241.000000,0.000000 +ImHowToPlayBrewing + + + + +BInventory +300.000000 +34.000000 +630.000000,396.000000,0.000000 +LabelContainerSceneLeft + + + + +BBrew +300.000000 +34.000000 +630.000000,249.000000,0.000000 +LabelContainerSceneCentre + + + + +XuiHtmlControlEnchantment +380.000000 +331.000000 +198.000000,224.000000,0.000000 +XuiHtmlControl_H2P + + + + +XuiImageEnchantment +339.000000 +342.000000 +612.000000,226.000000,0.000000 +ImHowToPlayEnchantment + + + + +EInventory +300.000000 +34.000000 +638.000000,376.000000,0.000000 +LabelContainerSceneLeft + + + + +EEnchant +300.000000 +34.000000 +638.000000,240.000000,0.000000 +LabelContainerSceneLeft + + + + +XuiHtmlControlAnvil +380.000000 +359.000000 +217.750015,222.000000,0.000000 +XuiHtmlControl_H2P + + + + +XuiImageAnvil +430.000000 +430.000000 +680.000000,198.000000,0.000000 +ImHowToPlayAnvil + + + + +ACost +232.000000 +848.000000,360.000000,0.000000 +XuiLabelAffordable + + + + +AInventory +260.000000 +34.000000 +703.333313,385.333344,0.000000 +LabelContainerSceneLeft + + + + +ARepairAndName +260.000000 +34.000000 +814.000000,210.666672,0.000000 +LabelContainerSceneCentre + + + + +XuiHtmlControlTrading +380.000000 +359.000000 +142.000000,222.000000,0.000000 +XuiHtmlControl_H2P + + + + +XuiImageTrading +588.000000 +360.000000 +552.000000,230.000000,0.000000 +ImHowToPlayTrading + + + + +TVillagerOffers +588.000000 +34.000000 +552.000000,246.000000,0.000000 +LabelContainerSceneCentre + + + + +TNeededForTrade +216.000000 +43.000000 +578.000000,385.000000,0.000000 +false +XuiLabelDarkCentredWrapSmall + + + + +TOffer1Label +144.000000 +24.000000 +634.000000,436.000000,0.000000 +XuiLabelDarkLeftWrapSmall10 + + + + +TOffer2Label +144.000000 +24.000000 +633.125061,489.000000,0.000000 +XuiLabelDarkLeftWrapSmall10 + + + + +TInventory +312.000000 +24.000000 +799.125061,380.000000,0.000000 +XuiLabelDarkCentredSmall + + + + +XuiHtmlControlEnderchest +380.000000 +331.000000 +198.000000,242.000000,0.000000 +XuiHtmlControl_H2P + + + + +XuiImageEnderchest +339.000000 +342.000000 +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 new file mode 100644 index 00000000..447482ea --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_howtoplay_480.h @@ -0,0 +1,90 @@ +#define IDC_XuiHtmlControlTheEnd L"XuiHtmlControlTheEnd" +#define IDC_XuiImageTheEnd L"XuiImageTheEnd" +#define IDC_XuiHtmlControlNetherPortal L"XuiHtmlControlNetherPortal" +#define IDC_XuiImageNetherPortal L"XuiImageNetherPortal" +#define IDC_XuiHtmlControlDispenser L"XuiHtmlControlDispenser" +#define IDC_XuiImageDispenser L"XuiImageDispenser" +#define IDC_DInventory L"DInventory" +#define IDC_DText L"DText" +#define IDC_XuiHtmlControlHUD L"XuiHtmlControlHUD" +#define IDC_XuiImageHUD L"XuiImageHUD" +#define IDC_XuiHtmlControlBasics L"XuiHtmlControlBasics" +#define IDC_XuiHtmlControlInventory L"XuiHtmlControlInventory" +#define IDC_XuiImageInventory L"XuiImageInventory" +#define IDC_IInventory L"IInventory" +#define IDC_XuiHtmlControlChest L"XuiHtmlControlChest" +#define IDC_XuiImageChest L"XuiImageChest" +#define IDC_SCChest L"SCChest" +#define IDC_SCInventory L"SCInventory" +#define IDC_XuiHtmlControlLargeChest L"XuiHtmlControlLargeChest" +#define IDC_XuiImageLargeChest L"XuiImageLargeChest" +#define IDC_LCChest L"LCChest" +#define IDC_LCInventory L"LCInventory" +#define IDC_XuiHtmlControlFurnace L"XuiHtmlControlFurnace" +#define IDC_XuiImageFurnace L"XuiImageFurnace" +#define IDC_FChest L"FChest" +#define IDC_FIngredient L"FIngredient" +#define IDC_FInventory L"FInventory" +#define IDC_FFuel L"FFuel" +#define IDC_XuiHtmlControlCrafting L"XuiHtmlControlCrafting" +#define IDC_XuiImageCrafting L"XuiImageCrafting" +#define IDC_CInventory L"CInventory" +#define IDC_CGroup L"CGroup" +#define IDC_CItem L"CItem" +#define IDC_XuiHtmlControlCraftingTable L"XuiHtmlControlCraftingTable" +#define IDC_XuiImageCraftingTable L"XuiImageCraftingTable" +#define IDC_CTInventory3x3 L"CTInventory3x3" +#define IDC_CTGroup L"CTGroup" +#define IDC_CTItem L"CTItem" +#define IDC_XuiHtmlControlSocialMedia L"XuiHtmlControlSocialMedia" +#define IDC_XuiHtmlControlMultiplayer L"XuiHtmlControlMultiplayer" +#define IDC_XuiHtmlControlWhatsNew L"XuiHtmlControlWhatsNew" +#define IDC_XuiHtmlControlBanList L"XuiHtmlControlBanList" +#define IDC_XuiImageCreative L"XuiImageCreative" +#define IDC_XuiHtmlControlCreative L"XuiHtmlControlCreative" +#define IDC_CIGroup L"CIGroup" +#define IDC_XuiHtmlControlHostOptions L"XuiHtmlControlHostOptions" +#define IDC_XuiHtmlControlBreeding L"XuiHtmlControlBreeding" +#define IDC_XuiImageBreeding L"XuiImageBreeding" +#define IDC_XuiHtmlControlFarmingAnimals L"XuiHtmlControlFarmingAnimals" +#define IDC_XuiImageFarmingAnimals L"XuiImageFarmingAnimals" +#define IDC_XuiHtmlControlBrewing L"XuiHtmlControlBrewing" +#define IDC_XuiImageBrewing L"XuiImageBrewing" +#define IDC_BInventory L"BInventory" +#define IDC_BBrew L"BBrew" +#define IDC_XuiImageEnchantment L"XuiImageEnchantment" +#define IDC_XuiHtmlControlEnchantment L"XuiHtmlControlEnchantment" +#define IDC_EInventory L"EInventory" +#define IDC_EEnchant L"EEnchant" +#define IDC_XuiImageAnvil L"XuiImageAnvil" +#define IDC_XuiHtmlControlAnvil L"XuiHtmlControlAnvil" +#define IDC_ACost L"ACost" +#define IDC_AInventory L"AInventory" +#define IDC_ARepairAndName L"ARepairAndName" +#define IDC_XuiHtmlControlTrading L"XuiHtmlControlTrading" +#define IDC_XuiImageTrading L"XuiImageTrading" +#define IDC_TInventory L"TInventory" +#define IDC_TOffer1Label L"TOffer1Label" +#define IDC_TNeededForTrade L"TNeededForTrade" +#define IDC_TVillagerOffers L"TVillagerOffers" +#define IDC_XuiHtmlControlEnderchest L"XuiHtmlControlEnderchest" +#define IDC_XuiImageEnderchest L"XuiImageEnderchest" +#define IDC_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 new file mode 100644 index 00000000..b4612e3e --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_howtoplay_480.xui @@ -0,0 +1,831 @@ + + +640.000000 +480.000000 + + + +SceneHowToPlay +640.000000 +480.000000 +[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 + + + +XuiHtmlControlTheEnd +270.000000 +240.000000 +52.000000,132.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +XuiImageTheEnd +248.000000 +146.000000 +346.000000,172.000000,0.000000 +ImHowToPlayTheEndSmall + + + + +XuiHtmlControlNetherPortal +270.000000 +240.000000 +52.000000,132.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +XuiImageNetherPortal +248.000000 +146.000000 +346.000000,172.000000,0.000000 +ImHowToPlayNetherPortalSmall + + + + +XuiHtmlControlDispenser +270.000000 +240.000000 +52.000000,132.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +XuiImageDispenser +262.000000 +280.000000 +336.000000,126.000000,0.000000 +ImHowToPlayDispenserSmall + + + + +DInventory +230.000000 +17.000000 +355.000000,258.000000,0.000000 +LabelContainerSceneLeftSmall + + + + +DText +160.000000 +23.000000 +390.000000,140.000000,0.000000 +2 +LabelContainerSceneCentreSmall + + + + +XuiHtmlControlHUD +520.000000 +152.000000 +60.000000,132.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +XuiImageHUD +364.000000 +84.000000 +138.000000,322.000000,0.000000 +ImHowToPlayHUDSmall + + + + +XuiHtmlControlBasics +526.000000 +240.000000 +57.000000,132.000046,0.000000 +XuiHtmlControl_H2P_Small + + + + +XuiHtmlControlInventory +270.000000 +240.000000 +52.000046,132.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +XuiImageInventory +262.000000 +280.000000 +336.000000,126.000000,0.000000 +ImHowToPlayInventorySmall + + + + +IInventory +230.000000 +18.000000 +353.000000,258.000000,0.000000 +LabelContainerSceneLeftSmall + + + + +XuiHtmlControlChest +270.000000 +240.000000 +54.000000,132.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +XuiImageChest +258.000000 +260.000000 +340.000000,134.000000,0.000000 +ImHowToPlayChestSmall + + + + +SCChest +230.000000 +23.000000 +352.000000,140.000000,0.000000 +LabelContainerSceneLeftSmall + + + + +SCInventory +230.000000 +19.000000 +352.000000,244.000000,0.000000 +LabelContainerSceneLeftSmall + + + + +XuiHtmlControlLargeChest +280.000000 +240.000000 +60.000038,132.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +XuiImageLargeChest +213.000000 +270.000000 +364.000000,130.000000,0.000000 +ImHowToPlayLargeChestSmall + + + + +LCChest +189.000000 +17.000000 +377.000000,138.000000,0.000000 +LabelContainerSceneLeftSmall + + + + +LCInventory +189.000000 +14.000000 +377.000000,282.000000,0.000000 +LabelContainerSceneLeftSmall + + + + +XuiHtmlControlFurnace +264.000000 +240.000000 +56.000000,132.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +XuiImageFurnace +262.000000 +290.000000 +336.000000,120.000000,0.000000 +ImHowToPlayFurnaceSmall + + + + +FChest +218.000000 +21.000000 +352.000000,130.000000,0.000000 +LabelContainerSceneLeftSmall + + + + +FIngredient +114.000000 +18.000000 +344.000000,164.000000,0.000000 +LabelContainerSceneRightSmall + + + + +FInventory +218.000000 +18.000000 +352.000000,262.000000,0.000000 +LabelContainerSceneLeftSmall + + + + +FFuel +114.000000 +18.000000 +344.000000,234.000000,0.000000 +LabelContainerSceneRightSmall + + + + +XuiHtmlControlCrafting +270.000000 +240.000000 +52.000000,132.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +XuiImageCrafting +252.000000 +170.000000 +342.000000,176.000000,0.000000 +ImHowToPlayCraftingSmall + + + + +CInventory +128.000000 +14.000000 +458.000000,258.000000,0.000000 +XuiLabelDarkCentredHowtoSmall + + + + +CGroup +200.000000 +14.000000 +368.000000,208.000000,0.000000 +XuiLabelDarkCentredHowtoSmall + + + + +CItem +100.000000 +14.000000 +350.000000,258.000000,0.000000 +XuiLabelDarkCentredHowtoSmall + + + + +XuiHtmlControlCraftingTable +270.000000 +240.000000 +57.000000,132.000031,0.000000 +XuiHtmlControl_H2P_Small + + + + +XuiImageCraftingTable +245.000000 +142.000000 +342.000000,182.000000,0.000000 +ImHowToPlayCraftingTableSmall + + + + +CTInventory3x3 +132.000000 +14.000000 +448.000000,250.000000,0.000000 +XuiLabelDarkCentredHowtoSmall + + + + +CTGroup +160.000000 +14.000000 +384.000000,208.000000,0.000000 +XuiLabelDarkCentredHowtoSmall + + + + +CTItem +98.000000 +14.000000 +346.000000,250.000000,0.000000 +XuiLabelDarkCentredHowtoSmall + + + + +XuiHtmlControlSocialMedia +520.000000 +244.000000 +60.000000,138.000031,0.000000 +XuiHtmlControl_H2P + + + + +XuiHtmlControlMultiplayer +520.000000 +244.000000 +60.000000,138.000046,0.000000 +XuiHtmlControl_H2P + + + + +XuiHtmlControlWhatsNew +520.000000 +244.000000 +60.000000,138.000046,0.000000 +XuiHtmlControl_H2P + + + + +XuiHtmlControlBanList +520.000000 +244.000000 +60.000000,138.000046,0.000000 +XuiHtmlControl_H2P + + + + +XuiImageCreative +258.000000 +194.000000 +340.000000,177.000000,0.000000 +ImHowToPlayCreativeSmall + + + + +XuiHtmlControlCreative +270.000000 +240.000000 +54.000000,132.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +CIGroup +160.000000 +14.000000 +390.000000,208.000000,0.000000 +XuiLabelDarkCentredHowtoSmall + + + + +XuiHtmlControlHostOptions +520.000000 +244.000000 +60.000000,138.000046,0.000000 +XuiHtmlControl_H2P + + + + +XuiHtmlControlBreeding +270.000000 +240.000000 +54.000000,132.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +XuiImageBreeding +262.000000 +280.000000 +340.000000,126.000000,0.000000 +ImHowToPlayBreedingSmall + + + + +XuiHtmlControlFarmingAnimals +270.000000 +240.000000 +54.000000,132.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +XuiImageFarmingAnimals +262.000000 +280.000000 +340.000000,126.000000,0.000000 +ImHowToPlayFarmingAnimalsSmall + + + + +XuiHtmlControlBrewing +270.000000 +240.000000 +54.000000,132.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +XuiImageBrewing +260.000000 +290.000000 +340.000000,122.000000,0.000000 +ImHowToPlayBrewingSmall + + + + +BInventory +210.000000 +18.000000 +354.000000,262.000000,0.000000 +8 +LabelContainerSceneLeftSmall + + + + +BBrew +210.000000 +18.000000 +365.000000,131.000000,0.000000 +8 +LabelContainerSceneCentreSmall + + + + +XuiImageEnchantment +262.000000 +280.000000 +340.000000,122.000000,0.000000 +ImHowToPlayEnchantmentSmall + + + + +XuiHtmlControlEnchantment +270.000000 +240.000000 +54.000000,132.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +EInventory +210.000000 +18.000000 +356.000000,254.000000,0.000000 +8 +LabelContainerSceneLeftSmall + + + + +EEnchant +210.000000 +18.000000 +356.000000,130.000000,0.000000 +8 +LabelContainerSceneLeftSmall + + + + +XuiImageAnvil +260.000000 +290.000000 +340.000000,122.000000,0.000000 +ImHowToPlayAnvilSmall + + + + +XuiHtmlControlAnvil +264.000000 +240.000000 +56.000000,132.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +ACost +156.000000 +18.000000 +430.000000,238.000000,0.000000 +8 +XuiLabelAffordableSmall + + + + +AInventory +156.370361 +18.000000 +353.037048,264.814819,0.000000 +8 +LabelContainerSceneCentreSmall + + + + +ARepairAndName +156.370361 +18.000000 +415.851868,130.000000,0.000000 +8 +LabelContainerSceneCentreSmall + + + + +XuiHtmlControlTrading +264.000000 +240.000000 +56.000000,132.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +XuiImageTrading +260.000000 +174.000000 +342.000000,125.000000,0.000000 +ImHowToPlayTradingSmall + + + + +TInventory +142.000000 +11.000000 +447.000000,207.000000,0.000000 +8 +XuiLabelDarkCentred8 + + + + +TOffer1Label +56.000000 +11.000000 +381.000000,240.000000,0.000000 +8 +XuiLabelDarkLeftWrapSmall8 + + + + +TNeededForTrade +88.000000 +24.000000 +349.000000,211.000000,0.000000 +8 +XuiLabelDarkCentred8 + + + + +TVillagerOffers +260.000000 +18.000000 +342.000000,140.000000,0.000000 +8 +XuiLabelDarkCentred8 + + + + +XuiHtmlControlEnderchest +270.000000 +240.000000 +54.000000,132.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +XuiImageEnderchest +262.000000 +280.000000 +340.000000,126.000000,0.000000 +ImHowToPlayEnderchestSmall + + + + +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_menu.h b/Minecraft.Client/Common/Media/xuiscene_howtoplay_menu.h new file mode 100644 index 00000000..409fbdb0 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_howtoplay_menu.h @@ -0,0 +1,9 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_HowToListButtons L"HowToListButtons" +#define IDC_SceneHowToPlayMenu L"SceneHowToPlayMenu" diff --git a/Minecraft.Client/Common/Media/xuiscene_howtoplay_menu.xui b/Minecraft.Client/Common/Media/xuiscene_howtoplay_menu.xui new file mode 100644 index 00000000..d66b3995 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_howtoplay_menu.xui @@ -0,0 +1,115 @@ + + +1280.000000 +720.000000 + + + +SceneHowToPlayMenu +1280.000000 +720.000000 +true +CScene_HowToPlayMenu +XuiMenuScene +XuiButton1 + + + +HowToListButtons +480.000000 +396.000000 +400.000031,200.000000,0.000000 +CXuiCtrlPassThroughList +XuiHowToList +JoinGame + + + +control_ListItem +469.000000 +86.000000 +16.000000,32.000000,0.000000 +5 +false +XuiButton + + + + +control_ListItem +450.000000 +50.000000 +15.000000,15.000000,0.000000 +5 +false +XuiMainMenuButton_List + + + + +control_ListItem +450.000000 +50.000000 +15.000000,15.000000,0.000000 +5 +false +XuiMainMenuButton_List + + + + +control_ListItem +450.000000 +50.000000 +15.000000,15.000000,0.000000 +5 +false +XuiMainMenuButton_List + + + + +control_ListItem +450.000000 +50.000000 +15.000000,15.000000,0.000000 +5 +false +XuiMainMenuButton_List + + + + +control_ListItem +450.000000 +50.000000 +15.000000,15.000000,0.000000 +5 +false +XuiMainMenuButton_List + + + + +control_ListItem +450.000000 +50.000000 +15.000000,15.000000,0.000000 +5 +false +XuiMainMenuButton_List + + + + + +Logo +1280.000000 +138.000000 +0.000000,56.000000,0.000000 +true +MenuTitleLogo + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_howtoplay_menu_480.h b/Minecraft.Client/Common/Media/xuiscene_howtoplay_menu_480.h new file mode 100644 index 00000000..c393a1c3 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_howtoplay_menu_480.h @@ -0,0 +1,5 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_HowToListButtons L"HowToListButtons" +#define IDC_SceneHowToPlayMenu L"SceneHowToPlayMenu" diff --git a/Minecraft.Client/Common/Media/xuiscene_howtoplay_menu_480.xui b/Minecraft.Client/Common/Media/xuiscene_howtoplay_menu_480.xui new file mode 100644 index 00000000..cd929626 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_howtoplay_menu_480.xui @@ -0,0 +1,63 @@ + + +640.000000 +480.000000 + + + +SceneHowToPlayMenu +640.000000 +480.000000 +true +CScene_HowToPlayMenu +XuiMenuScene +XuiButton1 + + + +HowToListButtons +480.000000 +268.000000 +80.000000,120.000000,0.000000 +CXuiCtrlPassThroughList +XuiHowToList480 +JoinGame + + + +control_ListItem +469.000000 +86.000000 +16.000000,32.000000,0.000000 +5 +false +XuiButton + + + + +control_ListItem +300.000000 +36.000000 +15.000000,15.000000,0.000000 +5 +false +XuiMainMenuLButton_Thin +0.000000,10.000000,0.000000 + + + + +control_ListItem +300.000000 +36.000000 +15.000000,15.000000,0.000000 +5 +false +XuiMainMenuLButton_Thin +0.000000,10.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_howtoplay_menu_small.h b/Minecraft.Client/Common/Media/xuiscene_howtoplay_menu_small.h new file mode 100644 index 00000000..f04d3146 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_howtoplay_menu_small.h @@ -0,0 +1,4 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_HowToListButtons L"HowToListButtons" +#define IDC_SceneHowToPlayMenu L"SceneHowToPlayMenu" diff --git a/Minecraft.Client/Common/Media/xuiscene_howtoplay_menu_small.xui b/Minecraft.Client/Common/Media/xuiscene_howtoplay_menu_small.xui new file mode 100644 index 00000000..d37f6d1f --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_howtoplay_menu_small.xui @@ -0,0 +1,50 @@ + + +640.000000 +360.000000 + + + +SceneHowToPlayMenu +640.000000 +360.000000 +true +CScene_HowToPlayMenu +XuiMenuScene +XuiButton1 + + + +HowToListButtons +480.000000 +243.000015 +80.000038,35.000000,0.000000 +CXuiCtrlPassThroughList +XuiHowToList +JoinGame + + + +control_ListItem +469.000000 +86.000000 +16.000000,32.000000,0.000000 +5 +false +XuiButton + + + + +control_ListItem +450.000000 +50.000000 +15.000000,15.000000,0.000000 +5 +false +XuiMainMenuButton_List + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_howtoplay_small.h b/Minecraft.Client/Common/Media/xuiscene_howtoplay_small.h new file mode 100644 index 00000000..12377729 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_howtoplay_small.h @@ -0,0 +1,90 @@ +#define IDC_XuiHtmlControlTheEnd L"XuiHtmlControlTheEnd" +#define IDC_XuiImageTheEnd L"XuiImageTheEnd" +#define IDC_XuiHtmlControlNetherPortal L"XuiHtmlControlNetherPortal" +#define IDC_XuiImageNetherPortal L"XuiImageNetherPortal" +#define IDC_XuiHtmlControlDispenser L"XuiHtmlControlDispenser" +#define IDC_XuiImageDispenser L"XuiImageDispenser" +#define IDC_DInventory L"DInventory" +#define IDC_DText L"DText" +#define IDC_XuiImageHUD L"XuiImageHUD" +#define IDC_XuiHtmlControlHUD L"XuiHtmlControlHUD" +#define IDC_XuiHtmlControlBasics L"XuiHtmlControlBasics" +#define IDC_XuiImageInventory L"XuiImageInventory" +#define IDC_XuiHtmlControlInventory L"XuiHtmlControlInventory" +#define IDC_IInventory L"IInventory" +#define IDC_XuiImageChest L"XuiImageChest" +#define IDC_XuiHtmlControlChest L"XuiHtmlControlChest" +#define IDC_SCChest L"SCChest" +#define IDC_SCInventory L"SCInventory" +#define IDC_XuiImageLargeChest L"XuiImageLargeChest" +#define IDC_XuiHtmlControlLargeChest L"XuiHtmlControlLargeChest" +#define IDC_LCChest L"LCChest" +#define IDC_LCInventory L"LCInventory" +#define IDC_XuiHtmlControlFurnace L"XuiHtmlControlFurnace" +#define IDC_XuiImageFurnace L"XuiImageFurnace" +#define IDC_FChest L"FChest" +#define IDC_FIngredient L"FIngredient" +#define IDC_FInventory L"FInventory" +#define IDC_FFuel L"FFuel" +#define IDC_XuiHtmlControlCrafting L"XuiHtmlControlCrafting" +#define IDC_XuiImageCrafting L"XuiImageCrafting" +#define IDC_CInventory L"CInventory" +#define IDC_CGroup L"CGroup" +#define IDC_CItem L"CItem" +#define IDC_XuiHtmlControlCraftingTable L"XuiHtmlControlCraftingTable" +#define IDC_XuiImageCraftingTable L"XuiImageCraftingTable" +#define IDC_CTInventory3x3 L"CTInventory3x3" +#define IDC_CTGroup L"CTGroup" +#define IDC_CTItem L"CTItem" +#define IDC_XuiHtmlControlMultiplayer L"XuiHtmlControlMultiplayer" +#define IDC_XuiHtmlControlSocialMedia L"XuiHtmlControlSocialMedia" +#define IDC_XuiHtmlControlWhatsNew L"XuiHtmlControlWhatsNew" +#define IDC_XuiHtmlControlBanList L"XuiHtmlControlBanList" +#define IDC_XuiHtmlControlCreative L"XuiHtmlControlCreative" +#define IDC_XuiImageCreative L"XuiImageCreative" +#define IDC_CIGroup L"CIGroup" +#define IDC_XuiHtmlControlHostOptions L"XuiHtmlControlHostOptions" +#define IDC_XuiHtmlControlBreeding L"XuiHtmlControlBreeding" +#define IDC_XuiImageBreeding L"XuiImageBreeding" +#define IDC_XuiHtmlControlFarmingAnimals L"XuiHtmlControlFarmingAnimals" +#define IDC_XuiImageFarmingAnimals L"XuiImageFarmingAnimals" +#define IDC_XuiHtmlControlBrewing L"XuiHtmlControlBrewing" +#define IDC_XuiImageBrewing L"XuiImageBrewing" +#define IDC_BBrew L"BBrew" +#define IDC_BInventory L"BInventory" +#define IDC_XuiImageEnchantment L"XuiImageEnchantment" +#define IDC_XuiHtmlControlEnchantment L"XuiHtmlControlEnchantment" +#define IDC_EInventory L"EInventory" +#define IDC_EEnchant L"EEnchant" +#define IDC_XuiHtmlControlAnvil L"XuiHtmlControlAnvil" +#define IDC_XuiImageAnvil L"XuiImageAnvil" +#define IDC_ACost L"ACost" +#define IDC_AInventory L"AInventory" +#define IDC_ARepairAndName L"ARepairAndName" +#define IDC_XuiHtmlControlTrading L"XuiHtmlControlTrading" +#define IDC_XuiImageTrading L"XuiImageTrading" +#define IDC_TVillagerOffers L"TVillagerOffers" +#define IDC_TNeededForTrade L"TNeededForTrade" +#define IDC_TOffer1Label L"TOffer1Label" +#define IDC_TInventory L"TInventory" +#define IDC_XuiImageEnderchest L"XuiImageEnderchest" +#define IDC_XuiHtmlControlEnderchest L"XuiHtmlControlEnderchest" +#define IDC_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 new file mode 100644 index 00000000..989ab6c0 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_howtoplay_small.xui @@ -0,0 +1,832 @@ + + +640.000000 +360.000000 + + + +SceneHowToPlay +640.000000 +360.000000 +[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 + + + +XuiHtmlControlTheEnd +280.000000 +240.000000 +82.000000,12.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +XuiImageTheEnd +248.000000 +146.000000 +382.000000,54.000000,0.000000 +ImHowToPlayTheEndSmall + + + + +XuiHtmlControlNetherPortal +280.000000 +240.000000 +82.000000,12.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +XuiImageNetherPortal +248.000000 +146.000000 +382.000000,54.000000,0.000000 +ImHowToPlayNetherPortalSmall + + + + +XuiHtmlControlDispenser +280.000000 +240.000000 +76.000000,12.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +XuiImageDispenser +262.000000 +280.000000 +371.000000,3.000000,0.000000 +ImHowToPlayDispenserSmall + + + + +DInventory +230.000000 +17.000000 +388.000000,137.000000,0.000000 +LabelContainerSceneLeftSmall + + + + +DText +160.000000 +23.000000 +422.000000,18.000000,0.000000 +2 +LabelContainerSceneCentreSmall + + + + +XuiImageHUD +364.000000 +84.000000 +157.000000,204.000000,0.000000 +ImHowToPlayHUDSmall + + + + +XuiHtmlControlHUD +540.000000 +152.000000 +82.000000,12.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +XuiHtmlControlBasics +540.000000 +240.000000 +82.000000,12.000046,0.000000 +XuiHtmlControl_H2P_Small + + + + +XuiImageInventory +262.000000 +280.000000 +372.000000,6.000000,0.000000 +ImHowToPlayInventorySmall + + + + +XuiHtmlControlInventory +280.000000 +240.000000 +76.000046,12.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +IInventory +214.000000 +18.000000 +389.000000,138.000000,0.000000 +LabelContainerSceneLeftSmall + + + + +XuiImageChest +258.000000 +260.000000 +375.000000,15.000000,0.000000 +ImHowToPlayChestSmall + + + + +XuiHtmlControlChest +280.000000 +240.000000 +80.000000,12.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +SCChest +230.000000 +23.000000 +388.000000,23.000000,0.000000 +LabelContainerSceneLeftSmall + + + + +SCInventory +230.000000 +19.000000 +388.000000,128.000000,0.000000 +LabelContainerSceneLeftSmall + + + + +XuiImageLargeChest +213.000000 +270.000000 +398.000000,6.000000,0.000000 +ImHowToPlayLargeChestSmall + + + + +XuiHtmlControlLargeChest +280.000000 +240.000000 +97.000038,12.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +LCChest +189.000000 +17.000000 +415.000000,12.000000,0.000000 +LabelContainerSceneLeftSmall + + + + +LCInventory +189.000000 +14.000000 +415.000000,158.000000,0.000000 +LabelContainerSceneLeftSmall + + + + +XuiHtmlControlFurnace +280.000000 +240.000000 +75.000000,12.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +XuiImageFurnace +262.000000 +290.000000 +371.000000,0.000000,0.000000 +ImHowToPlayFurnaceSmall + + + + +FChest +219.000000 +21.000000 +385.000000,11.000000,0.000000 +LabelContainerSceneLeftSmall + + + + +FIngredient +114.000000 +18.000000 +381.000000,44.000000,0.000000 +LabelContainerSceneRightSmall + + + + +FInventory +219.000000 +18.000000 +385.000000,143.000000,0.000000 +12 +LabelContainerSceneLeftSmall + + + + +FFuel +114.000000 +18.000000 +381.000000,113.000000,0.000000 +LabelContainerSceneRightSmall + + + + +XuiHtmlControlCrafting +280.000000 +240.000000 +82.000000,12.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +XuiImageCrafting +252.000000 +170.000000 +376.000000,56.000000,0.000000 +ImHowToPlayCraftingSmall + + + + +CInventory +128.000000 +14.000000 +493.000000,140.000000,0.000000 +XuiLabelDarkCentredHowtoSmall + + + + +CGroup +200.000000 +18.000000 +403.000000,90.000000,0.000000 +XuiLabelDarkCentredHowtoSmall + + + + +CItem +101.000000 +14.000000 +385.000000,140.000000,0.000000 +XuiLabelDarkCentredHowtoSmall + + + + +XuiHtmlControlCraftingTable +280.000000 +240.000000 +82.000000,12.000031,0.000000 +XuiHtmlControl_H2P_Small + + + + +XuiImageCraftingTable +245.000000 +142.000000 +376.000000,60.000000,0.000000 +ImHowToPlayCraftingTableSmall + + + + +CTInventory3x3 +128.000000 +14.000000 +488.000000,128.000000,0.000000 +XuiLabelDarkCentredHowtoSmall + + + + +CTGroup +160.000000 +14.000000 +421.222229,86.777779,0.000000 +XuiLabelDarkCentredHowtoSmall + + + + +CTItem +95.000000 +14.000000 +386.000000,128.000000,0.000000 +XuiLabelDarkCentredHowtoSmall + + + + +XuiHtmlControlMultiplayer +520.000000 +244.000000 +85.000008,24.000038,0.000000 +XuiHtmlControl_H2P + + + + +XuiHtmlControlSocialMedia +520.000000 +244.000000 +87.000008,23.000023,0.000000 +XuiHtmlControl_H2P + + + + +XuiHtmlControlWhatsNew +520.000000 +244.000000 +87.000008,23.000023,0.000000 +XuiHtmlControl_H2P + + + + +XuiHtmlControlBanList +520.000000 +244.000000 +87.000008,23.000023,0.000000 +XuiHtmlControl_H2P + + + + +XuiHtmlControlCreative +280.000000 +240.000000 +80.000000,12.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +XuiImageCreative +258.000000 +194.000000 +375.000000,15.000000,0.000000 +ImHowToPlayCreativeSmall + + + + +CIGroup +160.000000 +14.000000 +425.000000,46.000000,0.000000 +XuiLabelDarkCentredHowtoSmall + + + + +XuiHtmlControlHostOptions +520.000000 +244.000000 +87.000008,23.000023,0.000000 +XuiHtmlControl_H2P + + + + +XuiHtmlControlBreeding +280.000000 +240.000000 +80.000000,12.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +XuiImageBreeding +262.000000 +280.000000 +375.000000,6.000000,0.000000 +ImHowToPlayBreedingSmall + + + + +XuiHtmlControlFarmingAnimals +280.000000 +240.000000 +80.000000,12.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +XuiImageFarmingAnimals +262.000000 +280.000000 +375.000000,6.000000,0.000000 +ImHowToPlayFarmingAnimalsSmall + + + + +XuiHtmlControlBrewing +280.000000 +240.000000 +80.000000,12.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +XuiImageBrewing +260.000000 +290.000000 +375.000000,2.000000,0.000000 +ImHowToPlayBrewingSmall + + + + +BBrew +210.000000 +18.000000 +399.000000,12.000000,0.000000 +8 +LabelContainerSceneCentreSmall + + + + +BInventory +210.000000 +18.000000 +388.000000,142.000000,0.000000 +8 +LabelContainerSceneLeftSmall + + + + +XuiImageEnchantment +262.000000 +280.000000 +375.000000,6.000000,0.000000 +ImHowToPlayEnchantmentSmall + + + + +XuiHtmlControlEnchantment +280.000000 +240.000000 +80.000000,12.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +EInventory +210.000000 +18.000000 +388.000000,138.000000,0.000000 +8 +LabelContainerSceneLeftSmall + + + + +EEnchant +210.000000 +18.000000 +388.000000,14.000000,0.000000 +8 +LabelContainerSceneLeftSmall + + + + +XuiHtmlControlAnvil +280.000000 +240.000000 +75.000000,12.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +XuiImageAnvil +260.000000 +290.000000 +372.000000,6.000000,0.000000 +ImHowToPlayAnvilSmall + + + + +ACost +156.000000 +18.000000 +461.000000,120.999992,0.000000 +8 +XuiLabelAffordableSmall + + + + +AInventory +156.000000 +18.000000 +384.000000,148.000000,0.000000 +8 +LabelContainerSceneLeftSmall + + + + +ARepairAndName +156.000000 +18.000000 +448.000000,18.999992,0.000000 +8 +LabelContainerSceneCentreSmall + + + + +XuiHtmlControlTrading +280.000000 +240.000000 +75.000000,12.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +XuiImageTrading +260.000000 +174.000000 +372.000000,56.000000,0.000000 +ImHowToPlayTradingSmall + + + + +TVillagerOffers +260.000000 +18.000000 +372.000000,71.000000,0.000000 +8 +XuiLabelDarkCentred8 + + + + +TNeededForTrade +88.000000 +24.000000 +379.000000,138.000000,0.000000 +8 +XuiLabelDarkCentred8 + + + + +TOffer1Label +56.000000 +11.000000 +411.000000,171.000000,0.000000 +8 +XuiLabelDarkLeftWrapSmall8 + + + + +TInventory +142.000000 +11.000000 +477.000000,138.000000,0.000000 +8 +XuiLabelDarkCentred8 + + + + +XuiImageEnderchest +262.000000 +280.000000 +375.000000,6.000000,0.000000 +ImHowToPlayEnderchestSmall + + + + +XuiHtmlControlEnderchest +280.000000 +240.000000 +80.000000,12.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +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 new file mode 100644 index 00000000..1c1fb549 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_hud.h @@ -0,0 +1,95 @@ +#define IDC_Crosshair L"Crosshair" +#define IDC_Box L"Box" +#define IDC_Inventory1 L"Inventory1" +#define IDC_Inventory2 L"Inventory2" +#define IDC_Inventory3 L"Inventory3" +#define IDC_Inventory4 L"Inventory4" +#define IDC_Inventory5 L"Inventory5" +#define IDC_Inventory6 L"Inventory6" +#define IDC_Inventory7 L"Inventory7" +#define IDC_Inventory8 L"Inventory8" +#define IDC_Inventory9 L"Inventory9" +#define IDC_Hotbar L"Hotbar" +#define IDC_ExperienceProgress L"ExperienceProgress" +#define IDC_HorseJumpProgress L"HorseJumpProgress" +#define IDC_Armour0 L"Armour0" +#define IDC_Armour1 L"Armour1" +#define IDC_Armour2 L"Armour2" +#define IDC_Armour3 L"Armour3" +#define IDC_Armour4 L"Armour4" +#define IDC_Armour5 L"Armour5" +#define IDC_Armour6 L"Armour6" +#define IDC_Armour7 L"Armour7" +#define IDC_Armour8 L"Armour8" +#define IDC_Armour9 L"Armour9" +#define IDC_Armour L"Armour" +#define IDC_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" +#define IDC_Food6 L"Food6" +#define IDC_Food5 L"Food5" +#define IDC_Food4 L"Food4" +#define IDC_Food3 L"Food3" +#define IDC_Food2 L"Food2" +#define IDC_Food1 L"Food1" +#define IDC_Food0 L"Food0" +#define IDC_Food L"Food" +#define IDC_Air9 L"Air9" +#define IDC_Air8 L"Air8" +#define IDC_Air7 L"Air7" +#define IDC_Air6 L"Air6" +#define IDC_Air5 L"Air5" +#define IDC_Air4 L"Air4" +#define IDC_Air3 L"Air3" +#define IDC_Air2 L"Air2" +#define IDC_Air1 L"Air1" +#define IDC_Air0 L"Air0" +#define IDC_Air L"Air" +#define IDC_XPLevel L"XPLevel" +#define IDC_HudScaleGroup L"HudScaleGroup" +#define IDC_HudGroup L"HudGroup" +#define IDC_HudHolder L"HudHolder" +#define IDC_HUDScene L"HUDScene" diff --git a/Minecraft.Client/Common/Media/xuiscene_hud.xui b/Minecraft.Client/Common/Media/xuiscene_hud.xui new file mode 100644 index 00000000..7eea76d4 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_hud.xui @@ -0,0 +1,948 @@ + + +1280.000000 +720.000000 + + + +HUDScene +1280.000000 +720.000000 +CXuiSceneHud +XuiBlankScene + + + +Crosshair +15.000000 +15.000000 +616.000000,336.000000,0.000000 +3.000000,3.000000,3.000000 +HudCrosshair + + + + +HudHolder +548.000000 +150.000000 +366.000031,480.000000,0.000000 + + + +HudGroup +548.000000 +150.000000 + + + +HudScaleGroup +182.000000 +54.000000 +0.000038,3.000057,0.000000 +3.000000,3.000000,3.000000 + + + +Hotbar +182.000000 +24.000000 +0.000000,26.000000,0.000000 + + + +Box +182.000000 +22.000000 +0.000000,1.000000,0.000000 +15 +HUDHotBarBack + + + + +Inventory1 +24.000000 +24.000000 +-0.999939,0.000061,0.000000 +CXuiCtrlSlotItem +ItemHUDHotbar + + + + +Inventory2 +24.000000 +24.000000 +19.000061,0.000061,0.000000 +CXuiCtrlSlotItem +ItemHUDHotbar + + + + +Inventory3 +24.000000 +24.000000 +39.000061,0.000061,0.000000 +CXuiCtrlSlotItem +ItemHUDHotbar + + + + +Inventory4 +24.000000 +24.000000 +59.000061,0.000061,0.000000 +CXuiCtrlSlotItem +ItemHUDHotbar + + + + +Inventory5 +24.000000 +24.000000 +79.000061,0.000061,0.000000 +CXuiCtrlSlotItem +ItemHUDHotbar + + + + +Inventory6 +24.000000 +24.000000 +99.000061,0.000061,0.000000 +CXuiCtrlSlotItem +ItemHUDHotbar + + + + +Inventory7 +24.000000 +24.000000 +119.000061,0.000061,0.000000 +CXuiCtrlSlotItem +ItemHUDHotbar + + + + +Inventory8 +24.000000 +24.000000 +139.000061,0.000061,0.000000 +CXuiCtrlSlotItem +ItemHUDHotbar + + + + +Inventory9 +24.000000 +24.000000 +159.000061,0.000061,0.000000 +CXuiCtrlSlotItem +ItemHUDHotbar + + + + + +ExperienceProgress +182.000000 +5.000000 +0.000031,20.000031,0.000000 +ExperienceProgress +200 + + + + +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 +81.000000 +9.000000 +0.000000,10.000031,0.000000 + + + +Health0 +9.000000 +9.000000 +0.000031,0.000061,0.000000 +HudHealth + + + + +Health1 +9.000000 +9.000000 +8.000000,0.000061,0.000000 +HudHealth + + + + +Health2 +9.000000 +9.000000 +16.000000,0.000061,0.000000 +HudHealth + + + + +Health3 +9.000000 +9.000000 +24.000000,0.000061,0.000000 +HudHealth + + + + +Health4 +9.000000 +9.000000 +32.000000,0.000061,0.000000 +HudHealth + + + + +Health5 +9.000000 +9.000000 +40.000000,0.000061,0.000000 +HudHealth + + + + +Health6 +9.000000 +9.000000 +48.000000,0.000061,0.000000 +HudHealth + + + + +Health7 +9.000000 +9.000000 +56.000000,0.000061,0.000000 +HudHealth + + + + +Health8 +9.000000 +9.000000 +64.000000,0.000061,0.000000 +HudHealth + + + + +Health9 +9.000000 +9.000000 +72.000031,0.000061,0.000000 +HudHealth + + + + + +HorseHealth +81.000000 +19.000000 +101.000000,0.000000,0.000000 + + + +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 +HudHealth + + + + +Health18 +9.000000 +9.000000 +8.000000,0.000061,0.000000 +HudHealth + + + + +Health17 +9.000000 +9.000000 +16.000000,0.000061,0.000000 +HudHealth + + + + +Health16 +9.000000 +9.000000 +24.000000,0.000061,0.000000 +HudHealth + + + + +Health15 +9.000000 +9.000000 +32.000000,0.000061,0.000000 +HudHealth + + + + +Health14 +9.000000 +9.000000 +40.000000,0.000061,0.000000 +HudHealth + + + + +Health13 +9.000000 +9.000000 +48.000000,0.000061,0.000000 +HudHealth + + + + +Health12 +9.000000 +9.000000 +56.000000,0.000061,0.000000 +HudHealth + + + + +Health11 +9.000000 +9.000000 +64.000000,0.000061,0.000000 +HudHealth + + + + +Health10 +9.000000 +9.000000 +72.000031,0.000061,0.000000 +HudHealth + + + + + +Food +81.000000 +9.000000 +101.000031,10.000031,0.000000 + + + +Food9 +9.000000 +9.000000 +0.000000,0.000061,0.000000 +HudFood + + + + +Food8 +9.000000 +9.000000 +7.999992,0.000061,0.000000 +HudFood + + + + +Food7 +9.000000 +9.000000 +15.999992,0.000061,0.000000 +HudFood + + + + +Food6 +9.000000 +9.000000 +23.999992,0.000061,0.000000 +HudFood + + + + +Food5 +9.000000 +9.000000 +31.999996,0.000061,0.000000 +HudFood + + + + +Food4 +9.000000 +9.000000 +39.999996,0.000061,0.000000 +HudFood + + + + +Food3 +9.000000 +9.000000 +47.999996,0.000061,0.000000 +HudFood + + + + +Food2 +9.000000 +9.000000 +56.000000,0.000061,0.000000 +HudFood + + + + +Food1 +9.000000 +9.000000 +64.000000,0.000061,0.000000 +HudFood + + + + +Food0 +9.000000 +9.000000 +72.000000,0.000061,0.000000 +HudFood + + + + + +Air +81.000000 +9.000000 +101.000031,0.000000,0.000000 + + + +Air9 +9.000000 +9.000000 +0.000031,0.000061,0.000000 +HudAir + + + + +Air8 +9.000000 +9.000000 +8.000031,0.000061,0.000000 +HudAir + + + + +Air7 +9.000000 +9.000000 +16.000031,0.000061,0.000000 +HudAir + + + + +Air6 +9.000000 +9.000000 +24.000031,0.000061,0.000000 +HudAir + + + + +Air5 +9.000000 +9.000000 +32.000031,0.000061,0.000000 +HudAir + + + + +Air4 +9.000000 +9.000000 +40.000031,0.000061,0.000000 +HudAir + + + + +Air3 +9.000000 +9.000000 +48.000031,0.000061,0.000000 +HudAir + + + + +Air2 +9.000000 +9.000000 +56.000031,0.000061,0.000000 +HudAir + + + + +Air1 +9.000000 +9.000000 +64.000031,0.000061,0.000000 +HudAir + + + + +Air0 +9.000000 +9.000000 +72.000031,0.000061,0.000000 +HudAir + + + + + +XPLevel +20.000000 +9.000000 +81.000000,10.000000,0.000000 +HudXPLevel + + + + + +Normal + +stop + + +ScaleSmall + +stop + + +ScaleLarge + +stop + + + + + + +HudScaleGroup +Scale +Position + + +0 +3.000000,3.000000,3.000000 +0.000038,3.000057,0.000000 + + + +0 +2.000000,2.000000,2.000000 +90.999992,46.000057,0.000000 + + + +0 +4.000000,4.000000,4.000000 +-90.999962,-43.999943,0.000000 + + + + + + + + +Normal + +stop + + +ScaleSmall + +stop + + +ScaleLarge + +stop + + + +Crosshair +Scale +Position + + +0 +3.000000,3.000000,3.000000 +616.000000,336.000000,0.000000 + + + +0 +2.000000,2.000000,2.000000 +624.000000,344.000000,0.000000 + + + +0 +4.000000,4.000000,1.000000 +610.000000,330.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_hud_480.h b/Minecraft.Client/Common/Media/xuiscene_hud_480.h new file mode 100644 index 00000000..1c1fb549 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_hud_480.h @@ -0,0 +1,95 @@ +#define IDC_Crosshair L"Crosshair" +#define IDC_Box L"Box" +#define IDC_Inventory1 L"Inventory1" +#define IDC_Inventory2 L"Inventory2" +#define IDC_Inventory3 L"Inventory3" +#define IDC_Inventory4 L"Inventory4" +#define IDC_Inventory5 L"Inventory5" +#define IDC_Inventory6 L"Inventory6" +#define IDC_Inventory7 L"Inventory7" +#define IDC_Inventory8 L"Inventory8" +#define IDC_Inventory9 L"Inventory9" +#define IDC_Hotbar L"Hotbar" +#define IDC_ExperienceProgress L"ExperienceProgress" +#define IDC_HorseJumpProgress L"HorseJumpProgress" +#define IDC_Armour0 L"Armour0" +#define IDC_Armour1 L"Armour1" +#define IDC_Armour2 L"Armour2" +#define IDC_Armour3 L"Armour3" +#define IDC_Armour4 L"Armour4" +#define IDC_Armour5 L"Armour5" +#define IDC_Armour6 L"Armour6" +#define IDC_Armour7 L"Armour7" +#define IDC_Armour8 L"Armour8" +#define IDC_Armour9 L"Armour9" +#define IDC_Armour L"Armour" +#define IDC_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" +#define IDC_Food6 L"Food6" +#define IDC_Food5 L"Food5" +#define IDC_Food4 L"Food4" +#define IDC_Food3 L"Food3" +#define IDC_Food2 L"Food2" +#define IDC_Food1 L"Food1" +#define IDC_Food0 L"Food0" +#define IDC_Food L"Food" +#define IDC_Air9 L"Air9" +#define IDC_Air8 L"Air8" +#define IDC_Air7 L"Air7" +#define IDC_Air6 L"Air6" +#define IDC_Air5 L"Air5" +#define IDC_Air4 L"Air4" +#define IDC_Air3 L"Air3" +#define IDC_Air2 L"Air2" +#define IDC_Air1 L"Air1" +#define IDC_Air0 L"Air0" +#define IDC_Air L"Air" +#define IDC_XPLevel L"XPLevel" +#define IDC_HudScaleGroup L"HudScaleGroup" +#define IDC_HudGroup L"HudGroup" +#define IDC_HudHolder L"HudHolder" +#define IDC_HUDScene L"HUDScene" diff --git a/Minecraft.Client/Common/Media/xuiscene_hud_480.xui b/Minecraft.Client/Common/Media/xuiscene_hud_480.xui new file mode 100644 index 00000000..14d62faa --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_hud_480.xui @@ -0,0 +1,948 @@ + + +640.000000 +480.000000 + + + +HUDScene +640.000000 +480.000000 +CXuiSceneHud +XuiBlankScene + + + +Crosshair +15.000000 +15.000000 +306.000031,226.000015,0.000000 +2.000000,2.000000,1.000000 +HudCrosshair + + + + +HudHolder +273.000000 +81.000000 +183.500015,336.000000,0.000000 + + + +HudGroup +273.000000 +81.000000 + + + +HudScaleGroup +182.000000 +54.000000 +-45.000000,-17.999977,0.000000 +2.000000,2.000000,1.000000 + + + +Hotbar +182.000000 +24.000000 +0.000000,26.000000,0.000000 + + + +Box +182.000000 +22.000000 +0.000000,1.000000,0.000000 +15 +HUDHotBarBack + + + + +Inventory1 +24.000000 +24.000000 +-0.999939,0.000061,0.000000 +CXuiCtrlSlotItem +ItemHUDHotbar + + + + +Inventory2 +24.000000 +24.000000 +19.000061,0.000061,0.000000 +CXuiCtrlSlotItem +ItemHUDHotbar + + + + +Inventory3 +24.000000 +24.000000 +39.000061,0.000061,0.000000 +CXuiCtrlSlotItem +ItemHUDHotbar + + + + +Inventory4 +24.000000 +24.000000 +59.000061,0.000061,0.000000 +CXuiCtrlSlotItem +ItemHUDHotbar + + + + +Inventory5 +24.000000 +24.000000 +79.000061,0.000061,0.000000 +CXuiCtrlSlotItem +ItemHUDHotbar + + + + +Inventory6 +24.000000 +24.000000 +99.000061,0.000061,0.000000 +CXuiCtrlSlotItem +ItemHUDHotbar + + + + +Inventory7 +24.000000 +24.000000 +119.000061,0.000061,0.000000 +CXuiCtrlSlotItem +ItemHUDHotbar + + + + +Inventory8 +24.000000 +24.000000 +139.000061,0.000061,0.000000 +CXuiCtrlSlotItem +ItemHUDHotbar + + + + +Inventory9 +24.000000 +24.000000 +159.000061,0.000061,0.000000 +CXuiCtrlSlotItem +ItemHUDHotbar + + + + + +ExperienceProgress +182.000000 +5.000000 +0.000031,20.000031,0.000000 +ExperienceProgress +200 + + + + +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 +81.000000 +9.000000 +0.000000,10.000031,0.000000 + + + +Health0 +9.000000 +9.000000 +0.000031,0.000061,0.000000 +HudHealth + + + + +Health1 +9.000000 +9.000000 +8.000000,0.000061,0.000000 +HudHealth + + + + +Health2 +9.000000 +9.000000 +16.000000,0.000061,0.000000 +HudHealth + + + + +Health3 +9.000000 +9.000000 +24.000000,0.000061,0.000000 +HudHealth + + + + +Health4 +9.000000 +9.000000 +32.000000,0.000061,0.000000 +HudHealth + + + + +Health5 +9.000000 +9.000000 +40.000000,0.000061,0.000000 +HudHealth + + + + +Health6 +9.000000 +9.000000 +48.000000,0.000061,0.000000 +HudHealth + + + + +Health7 +9.000000 +9.000000 +56.000000,0.000061,0.000000 +HudHealth + + + + +Health8 +9.000000 +9.000000 +64.000000,0.000061,0.000000 +HudHealth + + + + +Health9 +9.000000 +9.000000 +72.000031,0.000061,0.000000 +HudHealth + + + + + +HorseHealth +81.000000 +19.000000 +101.000000,0.000000,0.000000 + + + +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 +HudHealth + + + + +Health18 +9.000000 +9.000000 +8.000000,0.000061,0.000000 +HudHealth + + + + +Health17 +9.000000 +9.000000 +16.000000,0.000061,0.000000 +HudHealth + + + + +Health16 +9.000000 +9.000000 +24.000000,0.000061,0.000000 +HudHealth + + + + +Health15 +9.000000 +9.000000 +32.000000,0.000061,0.000000 +HudHealth + + + + +Health14 +9.000000 +9.000000 +40.000000,0.000061,0.000000 +HudHealth + + + + +Health13 +9.000000 +9.000000 +48.000000,0.000061,0.000000 +HudHealth + + + + +Health12 +9.000000 +9.000000 +56.000000,0.000061,0.000000 +HudHealth + + + + +Health11 +9.000000 +9.000000 +64.000000,0.000061,0.000000 +HudHealth + + + + +Health10 +9.000000 +9.000000 +72.000031,0.000061,0.000000 +HudHealth + + + + + +Food +81.000000 +9.000000 +101.000031,10.000031,0.000000 + + + +Food9 +9.000000 +9.000000 +0.000000,0.000061,0.000000 +HudFood + + + + +Food8 +9.000000 +9.000000 +7.999992,0.000061,0.000000 +HudFood + + + + +Food7 +9.000000 +9.000000 +15.999992,0.000061,0.000000 +HudFood + + + + +Food6 +9.000000 +9.000000 +23.999992,0.000061,0.000000 +HudFood + + + + +Food5 +9.000000 +9.000000 +31.999996,0.000061,0.000000 +HudFood + + + + +Food4 +9.000000 +9.000000 +39.999996,0.000061,0.000000 +HudFood + + + + +Food3 +9.000000 +9.000000 +47.999996,0.000061,0.000000 +HudFood + + + + +Food2 +9.000000 +9.000000 +56.000000,0.000061,0.000000 +HudFood + + + + +Food1 +9.000000 +9.000000 +64.000000,0.000061,0.000000 +HudFood + + + + +Food0 +9.000000 +9.000000 +72.000000,0.000061,0.000000 +HudFood + + + + + +Air +81.000000 +9.000000 +101.000031,0.000000,0.000000 + + + +Air9 +9.000000 +9.000000 +0.000031,0.000061,0.000000 +HudAir + + + + +Air8 +9.000000 +9.000000 +8.000031,0.000061,0.000000 +HudAir + + + + +Air7 +9.000000 +9.000000 +16.000031,0.000061,0.000000 +HudAir + + + + +Air6 +9.000000 +9.000000 +24.000031,0.000061,0.000000 +HudAir + + + + +Air5 +9.000000 +9.000000 +32.000031,0.000061,0.000000 +HudAir + + + + +Air4 +9.000000 +9.000000 +40.000031,0.000061,0.000000 +HudAir + + + + +Air3 +9.000000 +9.000000 +48.000031,0.000061,0.000000 +HudAir + + + + +Air2 +9.000000 +9.000000 +56.000031,0.000061,0.000000 +HudAir + + + + +Air1 +9.000000 +9.000000 +64.000031,0.000061,0.000000 +HudAir + + + + +Air0 +9.000000 +9.000000 +72.000031,0.000061,0.000000 +HudAir + + + + + +XPLevel +20.000000 +9.000000 +81.000000,10.000000,0.000000 +HudXPLevel + + + + + +Normal + +stop + + +ScaleSmall + +stop + + +ScaleLarge + +stop + + + + + + +HudScaleGroup +Scale +Position + + +0 +2.000000,2.000000,1.000000 +-45.000000,-17.999977,0.000000 + + + +0 +1.500000,1.500000,1.000000 +0.000011,8.000023,0.000000 + + + +0 +2.500000,2.500000,1.000000 +-90.999985,-41.999977,0.000000 + + + + + + + + +Normal + +stop + + +ScaleSmall + +stop + + +ScaleLarge + +stop + + + +Crosshair +Scale +Position + + +0 +2.000000,2.000000,1.000000 +306.000031,226.000015,0.000000 + + + +0 +1.000000,1.000000,1.000000 +312.000000,232.000000,0.000000 + + + +0 +3.000000,3.000000,1.000000 +298.000000,218.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_hud_small.h b/Minecraft.Client/Common/Media/xuiscene_hud_small.h new file mode 100644 index 00000000..1c1fb549 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_hud_small.h @@ -0,0 +1,95 @@ +#define IDC_Crosshair L"Crosshair" +#define IDC_Box L"Box" +#define IDC_Inventory1 L"Inventory1" +#define IDC_Inventory2 L"Inventory2" +#define IDC_Inventory3 L"Inventory3" +#define IDC_Inventory4 L"Inventory4" +#define IDC_Inventory5 L"Inventory5" +#define IDC_Inventory6 L"Inventory6" +#define IDC_Inventory7 L"Inventory7" +#define IDC_Inventory8 L"Inventory8" +#define IDC_Inventory9 L"Inventory9" +#define IDC_Hotbar L"Hotbar" +#define IDC_ExperienceProgress L"ExperienceProgress" +#define IDC_HorseJumpProgress L"HorseJumpProgress" +#define IDC_Armour0 L"Armour0" +#define IDC_Armour1 L"Armour1" +#define IDC_Armour2 L"Armour2" +#define IDC_Armour3 L"Armour3" +#define IDC_Armour4 L"Armour4" +#define IDC_Armour5 L"Armour5" +#define IDC_Armour6 L"Armour6" +#define IDC_Armour7 L"Armour7" +#define IDC_Armour8 L"Armour8" +#define IDC_Armour9 L"Armour9" +#define IDC_Armour L"Armour" +#define IDC_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" +#define IDC_Food6 L"Food6" +#define IDC_Food5 L"Food5" +#define IDC_Food4 L"Food4" +#define IDC_Food3 L"Food3" +#define IDC_Food2 L"Food2" +#define IDC_Food1 L"Food1" +#define IDC_Food0 L"Food0" +#define IDC_Food L"Food" +#define IDC_Air9 L"Air9" +#define IDC_Air8 L"Air8" +#define IDC_Air7 L"Air7" +#define IDC_Air6 L"Air6" +#define IDC_Air5 L"Air5" +#define IDC_Air4 L"Air4" +#define IDC_Air3 L"Air3" +#define IDC_Air2 L"Air2" +#define IDC_Air1 L"Air1" +#define IDC_Air0 L"Air0" +#define IDC_Air L"Air" +#define IDC_XPLevel L"XPLevel" +#define IDC_HudScaleGroup L"HudScaleGroup" +#define IDC_HudGroup L"HudGroup" +#define IDC_HudHolder L"HudHolder" +#define IDC_HUDScene L"HUDScene" diff --git a/Minecraft.Client/Common/Media/xuiscene_hud_small.xui b/Minecraft.Client/Common/Media/xuiscene_hud_small.xui new file mode 100644 index 00000000..84d5b6df --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_hud_small.xui @@ -0,0 +1,967 @@ + + +640.000000 +360.000000 + + + +HUDScene +640.000000 +360.000000 +CXuiSceneHud +XuiBlankScene + + + +Crosshair +15.000000 +15.000000 +304.000000,164.000000,0.000000 +2.000000,2.000000,1.000000 +HudCrosshair + + + + +HudHolder +273.000000 +81.000000 +182.000000,240.000000,0.000000 + + + +HudGroup +273.000000 +81.000000 + + + +HudScaleGroup +182.000000 +54.000000 +0.000015,8.000008,0.000000 +1.520000,1.520000,1.020000 + + + +Hotbar +182.000000 +24.000000 +0.000000,30.000000,0.000000 + + + +Box +182.000000 +22.000000 +-0.000000,1.000000,0.000000 +15 +HUDHotBarBack + + + + +Inventory1 +24.000000 +24.000000 +-0.999939,0.000061,0.000000 +CXuiCtrlSlotItem +ItemHUDHotbar + + + + +Inventory2 +24.000000 +24.000000 +19.000061,0.000061,0.000000 +CXuiCtrlSlotItem +ItemHUDHotbar + + + + +Inventory3 +24.000000 +24.000000 +39.000061,0.000061,0.000000 +CXuiCtrlSlotItem +ItemHUDHotbar + + + + +Inventory4 +24.000000 +24.000000 +59.000061,0.000061,0.000000 +CXuiCtrlSlotItem +ItemHUDHotbar + + + + +Inventory5 +24.000000 +24.000000 +79.000061,0.000061,0.000000 +CXuiCtrlSlotItem +ItemHUDHotbar + + + + +Inventory6 +24.000000 +24.000000 +99.000061,0.000061,0.000000 +CXuiCtrlSlotItem +ItemHUDHotbar + + + + +Inventory7 +24.000000 +24.000000 +119.000061,0.000061,0.000000 +CXuiCtrlSlotItem +ItemHUDHotbar + + + + +Inventory8 +24.000000 +24.000000 +139.000061,0.000061,0.000000 +CXuiCtrlSlotItem +ItemHUDHotbar + + + + +Inventory9 +24.000000 +24.000000 +159.000061,0.000061,0.000000 +CXuiCtrlSlotItem +ItemHUDHotbar + + + + + +ExperienceProgress +182.000000 +5.000000 +0.000031,20.000031,0.000000 +ExperienceProgress +200 + + + + +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 +81.000000 +9.000000 +0.000000,10.000031,0.000000 + + + +Health0 +9.000000 +9.000000 +0.000031,0.000061,0.000000 +HudHealth + + + + +Health1 +9.000000 +9.000000 +8.000000,0.000061,0.000000 +HudHealth + + + + +Health2 +9.000000 +9.000000 +16.000000,0.000061,0.000000 +HudHealth + + + + +Health3 +9.000000 +9.000000 +24.000000,0.000061,0.000000 +HudHealth + + + + +Health4 +9.000000 +9.000000 +32.000000,0.000061,0.000000 +HudHealth + + + + +Health5 +9.000000 +9.000000 +40.000000,0.000061,0.000000 +HudHealth + + + + +Health6 +9.000000 +9.000000 +48.000000,0.000061,0.000000 +HudHealth + + + + +Health7 +9.000000 +9.000000 +56.000000,0.000061,0.000000 +HudHealth + + + + +Health8 +9.000000 +9.000000 +64.000000,0.000061,0.000000 +HudHealth + + + + +Health9 +9.000000 +9.000000 +72.000031,0.000061,0.000000 +HudHealth + + + + + +HorseHealth +81.000000 +19.000000 +101.000000,0.000000,0.000000 + + + +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 +HudHealth + + + + +Health18 +9.000000 +9.000000 +8.000000,0.000061,0.000000 +HudHealth + + + + +Health17 +9.000000 +9.000000 +16.000000,0.000061,0.000000 +HudHealth + + + + +Health16 +9.000000 +9.000000 +24.000000,0.000061,0.000000 +HudHealth + + + + +Health15 +9.000000 +9.000000 +32.000000,0.000061,0.000000 +HudHealth + + + + +Health14 +9.000000 +9.000000 +40.000000,0.000061,0.000000 +HudHealth + + + + +Health13 +9.000000 +9.000000 +48.000000,0.000061,0.000000 +HudHealth + + + + +Health12 +9.000000 +9.000000 +56.000000,0.000061,0.000000 +HudHealth + + + + +Health11 +9.000000 +9.000000 +64.000000,0.000061,0.000000 +HudHealth + + + + +Health10 +9.000000 +9.000000 +72.000031,0.000061,0.000000 +HudHealth + + + + + +Food +81.000000 +9.000000 +101.000031,10.000031,0.000000 + + + +Food9 +9.000000 +9.000000 +0.000000,0.000061,0.000000 +HudFood + + + + +Food8 +9.000000 +9.000000 +7.999992,0.000061,0.000000 +HudFood + + + + +Food7 +9.000000 +9.000000 +15.999992,0.000061,0.000000 +HudFood + + + + +Food6 +9.000000 +9.000000 +23.999992,0.000061,0.000000 +HudFood + + + + +Food5 +9.000000 +9.000000 +31.999996,0.000061,0.000000 +HudFood + + + + +Food4 +9.000000 +9.000000 +39.999996,0.000061,0.000000 +HudFood + + + + +Food3 +9.000000 +9.000000 +47.999996,0.000061,0.000000 +HudFood + + + + +Food2 +9.000000 +9.000000 +56.000000,0.000061,0.000000 +HudFood + + + + +Food1 +9.000000 +9.000000 +64.000000,0.000061,0.000000 +HudFood + + + + +Food0 +9.000000 +9.000000 +72.000000,0.000061,0.000000 +HudFood + + + + + +Air +81.000000 +9.000000 +101.000031,0.000000,0.000000 + + + +Air9 +9.000000 +9.000000 +0.000031,0.000061,0.000000 +HudAir + + + + +Air8 +9.000000 +9.000000 +8.000031,0.000061,0.000000 +HudAir + + + + +Air7 +9.000000 +9.000000 +16.000031,0.000061,0.000000 +HudAir + + + + +Air6 +9.000000 +9.000000 +24.000031,0.000061,0.000000 +HudAir + + + + +Air5 +9.000000 +9.000000 +32.000031,0.000061,0.000000 +HudAir + + + + +Air4 +9.000000 +9.000000 +40.000031,0.000061,0.000000 +HudAir + + + + +Air3 +9.000000 +9.000000 +48.000031,0.000061,0.000000 +HudAir + + + + +Air2 +9.000000 +9.000000 +56.000031,0.000061,0.000000 +HudAir + + + + +Air1 +9.000000 +9.000000 +64.000031,0.000061,0.000000 +HudAir + + + + +Air0 +9.000000 +9.000000 +72.000031,0.000061,0.000000 +HudAir + + + + + +XPLevel +20.000000 +9.000000 +81.000000,10.000000,0.000000 +HudXPLevel + + + + + +Normal + +stop + + +ScaleSmall + +stop + + +ScaleLarge + +stop + + + +Hotbar +Position + + +0 +0.000000,30.000000,0.000000 + + + +0 +0.000000,30.000000,0.000000 + + + +0 +0.000000,27.000000,0.000000 + + + + + + +HudScaleGroup +Scale +Position + + +0 +1.520000,1.520000,1.020000 +0.000015,8.000008,0.000000 + + + +0 +1.000000,1.000000,1.000000 +46.000015,2.000008,0.000000 + + + +0 +2.000000,2.000000,3.000000 +-45.999969,-13.999992,0.000000 + + + + + + + + +Normal + +stop + + +ScaleSmall + +stop + + +ScaleLarge + +stop + + + +Crosshair +Scale +Position + + +0 +2.000000,2.000000,1.000000 +304.000000,164.000000,0.000000 + + + +0 +1.000000,1.000000,1.000000 +312.000000,172.000000,0.000000 + + + +0 +3.000000,3.000000,1.000000 +296.000000,156.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_ingame_host_options.h b/Minecraft.Client/Common/Media/xuiscene_ingame_host_options.h new file mode 100644 index 00000000..4ba8da05 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_ingame_host_options.h @@ -0,0 +1,13 @@ +#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" +#define IDC_ButtonTeleportPlayerToMe L"ButtonTeleportPlayerToMe" +#define IDC_GameOptions L"GameOptions" +#define IDC_InGameHostOptions L"InGameHostOptions" diff --git a/Minecraft.Client/Common/Media/xuiscene_ingame_host_options.xui b/Minecraft.Client/Common/Media/xuiscene_ingame_host_options.xui new file mode 100644 index 00000000..decdffab --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_ingame_host_options.xui @@ -0,0 +1,155 @@ + + +1280.000000 +720.000000 + + + +InGameHostOptions +454.666687 +435.000000 +412.666718,140.000031,0.000000 +CScene_InGameHostOptions +XuiScene +GameOptions\CheckboxFireSpreads +2 + + + +GameOptions +450.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 +22.000000,34.000000,0.000000 +2 +XuiCheckbox +CheckboxFireSpreads +CheckboxDaylightCycle + + + + +CheckboxFireSpreads +402.000000 +34.000000 +22.000000,1.000000,0.000000 +2 +XuiCheckbox +CheckboxTNT + + + + +ButtonTeleportToPlayer +412.000000 +40.000000 +21.000000,311.000000,0.000000 +CheckboxNaturalRegen +ButtonTeleportPlayerToMe + + + + +ButtonTeleportPlayerToMe +412.000000 +40.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 new file mode 100644 index 00000000..4ba8da05 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_ingame_host_options_480.h @@ -0,0 +1,13 @@ +#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" +#define IDC_ButtonTeleportPlayerToMe L"ButtonTeleportPlayerToMe" +#define IDC_GameOptions L"GameOptions" +#define IDC_InGameHostOptions L"InGameHostOptions" diff --git a/Minecraft.Client/Common/Media/xuiscene_ingame_host_options_480.xui b/Minecraft.Client/Common/Media/xuiscene_ingame_host_options_480.xui new file mode 100644 index 00000000..0db33e51 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_ingame_host_options_480.xui @@ -0,0 +1,154 @@ + + +640.000000 +480.000000 + + + +InGameHostOptions +440.000000 +330.000000 +100.000038,75.000000,0.000000 +CScene_InGameHostOptions +GraphicPanel +GameOptions\CheckboxFireSpreads + + + +GameOptions +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 +24.000000 +15.000016,38.000000,0.000000 +2 +XuiCheckboxSmall +CheckboxFireSpreads +CheckboxDaylightCycle + + + + +CheckboxFireSpreads +402.000000 +24.000000 +15.000016,14.000000,0.000000 +2 +XuiCheckboxSmall +CheckboxTNT + + + + +ButtonTeleportToPlayer +410.000000 +36.000000 +15.000020,232.000000,0.000000 +XuiMainMenuButton_L_Thin +CheckboxNaturalRegen +ButtonTeleportPlayerToMe + + + + +ButtonTeleportPlayerToMe +410.000000 +36.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 new file mode 100644 index 00000000..4ba8da05 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_ingame_host_options_small.h @@ -0,0 +1,13 @@ +#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" +#define IDC_ButtonTeleportPlayerToMe L"ButtonTeleportPlayerToMe" +#define IDC_GameOptions L"GameOptions" +#define IDC_InGameHostOptions L"InGameHostOptions" diff --git a/Minecraft.Client/Common/Media/xuiscene_ingame_host_options_small.xui b/Minecraft.Client/Common/Media/xuiscene_ingame_host_options_small.xui new file mode 100644 index 00000000..9041e773 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_ingame_host_options_small.xui @@ -0,0 +1,154 @@ + + +640.000000 +360.000000 + + + +InGameHostOptions +440.000000 +330.000000 +100.000038,0.000000,0.000000 +CScene_InGameHostOptions +GraphicPanel +GameOptions\CheckboxFireSpreads + + + +GameOptions +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 +24.000000 +15.000016,38.000000,0.000000 +2 +XuiCheckboxSmall +CheckboxFireSpreads +CheckboxDaylightCycle + + + + +CheckboxFireSpreads +402.000000 +24.000000 +15.000016,14.000000,0.000000 +2 +XuiCheckboxSmall +CheckboxTNT + + + + +ButtonTeleportToPlayer +410.000000 +36.000000 +15.000020,232.000000,0.000000 +XuiMainMenuButton_L_Thin +CheckboxNaturalRegen +ButtonTeleportPlayerToMe + + + + +ButtonTeleportPlayerToMe +410.000000 +36.000000 +15.000020,276.000000,0.000000 +XuiMainMenuButton_L_Thin +ButtonTeleportToPlayer + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_ingame_player_options.h b/Minecraft.Client/Common/Media/xuiscene_ingame_player_options.h new file mode 100644 index 00000000..c089b51d --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_ingame_player_options.h @@ -0,0 +1,14 @@ +#define IDC_CheckboxHostInvisible L"CheckboxHostInvisible" +#define IDC_CheckboxHostHunger L"CheckboxHostHunger" +#define IDC_CheckboxHostFly L"CheckboxHostFly" +#define IDC_ButtonKick L"ButtonKick" +#define IDC_CheckboxTeleport L"CheckboxTeleport" +#define IDC_CheckboxOp L"CheckboxOp" +#define IDC_CheckboxAttackAnimals L"CheckboxAttackAnimals" +#define IDC_CheckboxAttackPlayers L"CheckboxAttackPlayers" +#define IDC_CheckboxUseContainers L"CheckboxUseContainers" +#define IDC_CheckboxUseDoorsAndSwitches L"CheckboxUseDoorsAndSwitches" +#define IDC_CheckboxBuildAndMine L"CheckboxBuildAndMine" +#define IDC_Gamertag L"Gamertag" +#define IDC_Icon L"Icon" +#define IDC_InGamePlayerOptions L"InGamePlayerOptions" diff --git a/Minecraft.Client/Common/Media/xuiscene_ingame_player_options.xui b/Minecraft.Client/Common/Media/xuiscene_ingame_player_options.xui new file mode 100644 index 00000000..64d90886 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_ingame_player_options.xui @@ -0,0 +1,163 @@ + + +1280.000000 +720.000000 + + + +InGamePlayerOptions +450.000000 +470.000000 +414.000000,125.000000,0.000000 +CScene_InGamePlayerOptions +XuiScene +CheckboxBuildAndMine + + + +CheckboxHostInvisible +402.000000 +34.000000 +20.000000,362.000000,0.000000 +2 +XuiCheckbox +CheckboxHostHunger +ButtonKick + + + + +CheckboxHostHunger +402.000000 +34.000000 +20.000000,328.000000,0.000000 +2 +XuiCheckbox +CheckboxHostFly +CheckboxHostInvisible + + + + +CheckboxHostFly +402.000000 +34.000000 +20.000000,294.000000,0.000000 +2 +XuiCheckbox +CheckboxTeleport +CheckboxHostHunger + + + + +ButtonKick +412.000000 +40.000000 +20.000013,410.000000,0.000000 +CheckboxHostInvisible + + + + +CheckboxTeleport +402.000000 +34.000000 +20.000000,258.000000,0.000000 +2 +XuiCheckbox +CheckboxOp +CheckboxHostFly + + + + +CheckboxOp +402.000000 +34.000000 +20.000000,224.000000,0.000000 +2 +XuiCheckbox +CheckboxAttackAnimals +CheckboxTeleport + + + + +CheckboxAttackAnimals +402.000000 +34.000000 +20.000000,190.000000,0.000000 +2 +XuiCheckbox +CheckboxAttackPlayers +CheckboxOp + + + + +CheckboxAttackPlayers +402.000000 +34.000000 +20.000000,156.000000,0.000000 +2 +XuiCheckbox +CheckboxUseContainers +CheckboxAttackAnimals + + + + +CheckboxUseContainers +402.000000 +34.000000 +20.000000,122.000000,0.000000 +2 +XuiCheckbox +CheckboxUseDoorsAndSwitches +CheckboxAttackPlayers + + + + +CheckboxUseDoorsAndSwitches +402.000000 +34.000000 +20.000000,88.000000,0.000000 +2 +XuiCheckbox +CheckboxBuildAndMine +CheckboxUseContainers + + + + +CheckboxBuildAndMine +402.000000 +34.000000 +20.000000,54.000000,0.000000 +2 +XuiCheckbox +CheckboxUseDoorsAndSwitches + + + + +Gamertag +362.000000 +40.000000 +56.000000,14.000000,0.000000 +XuiLabelDarkLeftWrap + + + + +Icon +40.000000 +40.000000 +16.000000,14.000000,0.000000 +PlayerColourIcon + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_ingame_player_options_480.h b/Minecraft.Client/Common/Media/xuiscene_ingame_player_options_480.h new file mode 100644 index 00000000..c089b51d --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_ingame_player_options_480.h @@ -0,0 +1,14 @@ +#define IDC_CheckboxHostInvisible L"CheckboxHostInvisible" +#define IDC_CheckboxHostHunger L"CheckboxHostHunger" +#define IDC_CheckboxHostFly L"CheckboxHostFly" +#define IDC_ButtonKick L"ButtonKick" +#define IDC_CheckboxTeleport L"CheckboxTeleport" +#define IDC_CheckboxOp L"CheckboxOp" +#define IDC_CheckboxAttackAnimals L"CheckboxAttackAnimals" +#define IDC_CheckboxAttackPlayers L"CheckboxAttackPlayers" +#define IDC_CheckboxUseContainers L"CheckboxUseContainers" +#define IDC_CheckboxUseDoorsAndSwitches L"CheckboxUseDoorsAndSwitches" +#define IDC_CheckboxBuildAndMine L"CheckboxBuildAndMine" +#define IDC_Gamertag L"Gamertag" +#define IDC_Icon L"Icon" +#define IDC_InGamePlayerOptions L"InGamePlayerOptions" diff --git a/Minecraft.Client/Common/Media/xuiscene_ingame_player_options_480.xui b/Minecraft.Client/Common/Media/xuiscene_ingame_player_options_480.xui new file mode 100644 index 00000000..ba91445f --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_ingame_player_options_480.xui @@ -0,0 +1,164 @@ + + +640.000000 +480.000000 + + + +InGamePlayerOptions +450.000000 +335.000000 +95.000061,72.500015,0.000000 +CScene_InGamePlayerOptions +GraphicPanel +CheckboxBuildAndMine + + + +CheckboxHostInvisible +402.000000 +22.000000 +20.000000,258.000000,0.000000 +2 +XuiCheckboxSmall +CheckboxHostHunger +ButtonKick + + + + +CheckboxHostHunger +402.000000 +22.000000 +20.000000,236.000000,0.000000 +2 +XuiCheckboxSmall +CheckboxHostFly +CheckboxHostInvisible + + + + +CheckboxHostFly +402.000000 +22.000000 +20.000000,214.000000,0.000000 +2 +XuiCheckboxSmall +CheckboxTeleport +CheckboxHostHunger + + + + +ButtonKick +408.000000 +36.000000 +20.000013,284.000000,0.000000 +XuiMainMenuButton_L_Thin +CheckboxHostInvisible + + + + +CheckboxTeleport +402.000000 +22.000000 +20.000000,191.000000,0.000000 +2 +XuiCheckboxSmall +CheckboxOp +CheckboxHostFly + + + + +CheckboxOp +402.000000 +22.000000 +20.000000,169.000000,0.000000 +2 +XuiCheckboxSmall +CheckboxAttackAnimals +CheckboxTeleport + + + + +CheckboxAttackAnimals +402.000000 +22.000000 +20.000000,147.000000,0.000000 +2 +XuiCheckboxSmall +CheckboxAttackPlayers +CheckboxOp + + + + +CheckboxAttackPlayers +402.000000 +22.000000 +20.000000,125.000000,0.000000 +2 +XuiCheckboxSmall +CheckboxUseContainers +CheckboxAttackAnimals + + + + +CheckboxUseContainers +402.000000 +22.000000 +20.000000,103.000000,0.000000 +2 +XuiCheckboxSmall +CheckboxUseDoorsAndSwitches +CheckboxAttackPlayers + + + + +CheckboxUseDoorsAndSwitches +402.000000 +22.000000 +20.000000,81.000000,0.000000 +2 +XuiCheckboxSmall +CheckboxBuildAndMine +CheckboxUseContainers + + + + +CheckboxBuildAndMine +402.000000 +22.000000 +20.000000,59.000000,0.000000 +2 +XuiCheckboxSmall +CheckboxUseDoorsAndSwitches + + + + +Gamertag +362.000000 +40.000000 +56.000000,14.000000,0.000000 +XuiLabelDarkLeftWrap + + + + +Icon +40.000000 +40.000000 +16.000000,14.000000,0.000000 +PlayerColourIcon + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_ingame_player_options_small.h b/Minecraft.Client/Common/Media/xuiscene_ingame_player_options_small.h new file mode 100644 index 00000000..c089b51d --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_ingame_player_options_small.h @@ -0,0 +1,14 @@ +#define IDC_CheckboxHostInvisible L"CheckboxHostInvisible" +#define IDC_CheckboxHostHunger L"CheckboxHostHunger" +#define IDC_CheckboxHostFly L"CheckboxHostFly" +#define IDC_ButtonKick L"ButtonKick" +#define IDC_CheckboxTeleport L"CheckboxTeleport" +#define IDC_CheckboxOp L"CheckboxOp" +#define IDC_CheckboxAttackAnimals L"CheckboxAttackAnimals" +#define IDC_CheckboxAttackPlayers L"CheckboxAttackPlayers" +#define IDC_CheckboxUseContainers L"CheckboxUseContainers" +#define IDC_CheckboxUseDoorsAndSwitches L"CheckboxUseDoorsAndSwitches" +#define IDC_CheckboxBuildAndMine L"CheckboxBuildAndMine" +#define IDC_Gamertag L"Gamertag" +#define IDC_Icon L"Icon" +#define IDC_InGamePlayerOptions L"InGamePlayerOptions" diff --git a/Minecraft.Client/Common/Media/xuiscene_ingame_player_options_small.xui b/Minecraft.Client/Common/Media/xuiscene_ingame_player_options_small.xui new file mode 100644 index 00000000..5c7f270e --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_ingame_player_options_small.xui @@ -0,0 +1,164 @@ + + +640.000000 +360.000000 + + + +InGamePlayerOptions +450.000000 +335.000000 +95.000061,-7.000000,0.000000 +CScene_InGamePlayerOptions +GraphicPanel +CheckboxBuildAndMine + + + +CheckboxHostInvisible +402.000000 +22.000000 +20.000000,258.000000,0.000000 +2 +XuiCheckboxSmall +CheckboxHostHunger +ButtonKick + + + + +CheckboxHostHunger +402.000000 +22.000000 +20.000000,236.000000,0.000000 +2 +XuiCheckboxSmall +CheckboxHostFly +CheckboxHostInvisible + + + + +CheckboxHostFly +402.000000 +22.000000 +20.000000,214.000000,0.000000 +2 +XuiCheckboxSmall +CheckboxTeleport +CheckboxHostHunger + + + + +ButtonKick +410.000000 +36.000000 +20.000000,284.000000,0.000000 +XuiMainMenuButton_L_Thin +CheckboxHostInvisible + + + + +CheckboxTeleport +402.000000 +22.000000 +20.000000,191.000000,0.000000 +2 +XuiCheckboxSmall +CheckboxOp +CheckboxHostFly + + + + +CheckboxOp +402.000000 +22.000000 +20.000000,169.000000,0.000000 +2 +XuiCheckboxSmall +CheckboxAttackAnimals +CheckboxTeleport + + + + +CheckboxAttackAnimals +402.000000 +22.000000 +20.000000,147.000000,0.000000 +2 +XuiCheckboxSmall +CheckboxAttackPlayers +CheckboxOp + + + + +CheckboxAttackPlayers +402.000000 +22.000000 +20.000000,125.000000,0.000000 +2 +XuiCheckboxSmall +CheckboxUseContainers +CheckboxAttackAnimals + + + + +CheckboxUseContainers +402.000000 +22.000000 +20.000000,103.000000,0.000000 +2 +XuiCheckboxSmall +CheckboxUseDoorsAndSwitches +CheckboxAttackPlayers + + + + +CheckboxUseDoorsAndSwitches +402.000000 +22.000000 +20.000000,81.000000,0.000000 +2 +XuiCheckboxSmall +CheckboxBuildAndMine +CheckboxUseContainers + + + + +CheckboxBuildAndMine +402.000000 +22.000000 +20.000000,59.000000,0.000000 +2 +XuiCheckboxSmall +CheckboxUseDoorsAndSwitches + + + + +Gamertag +362.000000 +40.000000 +56.000000,14.000000,0.000000 +XuiLabelDarkLeftWrap + + + + +Icon +40.000000 +40.000000 +16.000000,14.000000,0.000000 +PlayerColourIcon + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_ingameinfo.h b/Minecraft.Client/Common/Media/xuiscene_ingameinfo.h new file mode 100644 index 00000000..82696e20 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_ingameinfo.h @@ -0,0 +1,7 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_GamePlayers L"GamePlayers" +#define IDC_Title L"Title" +#define IDC_GameOptionsButton L"GameOptionsButton" +#define IDC_InGameInfo L"InGameInfo" diff --git a/Minecraft.Client/Common/Media/xuiscene_ingameinfo.xui b/Minecraft.Client/Common/Media/xuiscene_ingameinfo.xui new file mode 100644 index 00000000..0b33f42d --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_ingameinfo.xui @@ -0,0 +1,78 @@ + + +1280.000000 +720.000000 + + + +InGameInfo +1280.000000 +720.000000 +CScene_InGameInfo +XuiBlankScene +GamePlayers + + + +GamePlayers +500.000000 +336.000000 +390.000000,192.000046,0.000000 +CXuiCtrlPassThroughList +XuiPlayerList +GameOptionsButton + + + +control_ListItem +400.000000 +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,46.000000,0.000000 +5 +false +XuiPlayerListButton_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,46.000000,0.000000 +5 +false +XuiPlayerListButton_L + + + + + +Title +400.000000 +412.000000,202.000046,0.000000 +XuiLabelDarkLeftWrap18 + + + + +GameOptionsButton +500.000000 +60.000000 +390.000000,122.000000,0.000000 +XuiMainMenuButton_L +GamePlayers + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_ingameinfo_480.h b/Minecraft.Client/Common/Media/xuiscene_ingameinfo_480.h new file mode 100644 index 00000000..82696e20 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_ingameinfo_480.h @@ -0,0 +1,7 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_GamePlayers L"GamePlayers" +#define IDC_Title L"Title" +#define IDC_GameOptionsButton L"GameOptionsButton" +#define IDC_InGameInfo L"InGameInfo" diff --git a/Minecraft.Client/Common/Media/xuiscene_ingameinfo_480.xui b/Minecraft.Client/Common/Media/xuiscene_ingameinfo_480.xui new file mode 100644 index 00000000..57ff7a6b --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_ingameinfo_480.xui @@ -0,0 +1,79 @@ + + +640.000000 +480.000000 + + + +InGameInfo +640.000000 +480.000000 +CScene_InGameInfo +XuiBlankScene +GameOptionsButton + + + +GamePlayers +340.000000 +272.000000 +150.000031,130.000015,0.000000 +CXuiCtrlPassThroughList +XuiPlayerListSmall +GameOptionsButton + + + +control_ListItem +400.000000 +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +400.000000 +40.000000 +20.000000,42.000000,0.000000 +5 +false +XuiPlayerListButton_LThin + + + + +control_ListItem +400.000000 +40.000000 +20.000000,42.000000,0.000000 +5 +false +XuiPlayerListButton_LThin + + + + + +Title +300.000000 +22.000000 +170.000000,144.000000,0.000000 +XuiLabelDark + + + + +GameOptionsButton +340.000000 +36.000000 +150.000000,89.000000,0.000000 +XuiMainMenuButton_L_Thin +GamePlayers + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_ingameinfo_small.h b/Minecraft.Client/Common/Media/xuiscene_ingameinfo_small.h new file mode 100644 index 00000000..591517fb --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_ingameinfo_small.h @@ -0,0 +1,8 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_GamePlayers L"GamePlayers" +#define IDC_Title L"Title" +#define IDC_GameOptionsButton L"GameOptionsButton" +#define IDC_InGameInfo L"InGameInfo" diff --git a/Minecraft.Client/Common/Media/xuiscene_ingameinfo_small.xui b/Minecraft.Client/Common/Media/xuiscene_ingameinfo_small.xui new file mode 100644 index 00000000..ac5837e7 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_ingameinfo_small.xui @@ -0,0 +1,90 @@ + + +640.000000 +360.000000 + + + +InGameInfo +640.000000 +360.000000 +CScene_InGameInfo +XuiBlankScene +GameOptionsButton + + + +GamePlayers +400.000000 +236.000000 +120.000023,52.000011,0.000000 +CXuiCtrlPassThroughList +XuiPlayerListSmall +GameOptionsButton + + + +control_ListItem +400.000000 +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +400.000000 +40.000000 +20.000000,42.000000,0.000000 +5 +false +XuiPlayerListButton_LThin + + + + +control_ListItem +400.000000 +40.000000 +20.000000,42.000000,0.000000 +5 +false +XuiPlayerListButton_LThin + + + + +control_ListItem +400.000000 +40.000000 +20.000000,42.000000,0.000000 +5 +false +XuiPlayerListButton_LThin + + + + + +Title +358.000000 +26.000000 +140.000000,61.999969,0.000000 +XuiLabelDarkLeftWrap16 + + + + +GameOptionsButton +400.000000 +36.000000 +120.000000,11.000000,0.000000 +XuiMainMenuButton_L_Thin +GamePlayers + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_intro.h b/Minecraft.Client/Common/Media/xuiscene_intro.h new file mode 100644 index 00000000..85f35ed0 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_intro.h @@ -0,0 +1,6 @@ +#define IDC_Logo4J L"Logo4J" +#define IDC_LogoMojang L"LogoMojang" +#define IDC_LogoMicrosoft L"LogoMicrosoft" +#define IDC_LogoXLA L"LogoXLA" +#define IDC_LogoESRB L"LogoESRB" +#define IDC_SceneIntro L"SceneIntro" diff --git a/Minecraft.Client/Common/Media/xuiscene_intro.xui b/Minecraft.Client/Common/Media/xuiscene_intro.xui new file mode 100644 index 00000000..d1337cc0 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_intro.xui @@ -0,0 +1,382 @@ + + +1280.000000 +720.000000 + + + +SceneIntro +1280.000000 +720.000000 +CScene_Intro +XuiBlackScene + + + +1280.000000 +960.000000 + + +0xff0f0f80 + + + + +0xffffffff + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,278.000000,0.000000,0,278.000000,0.000000,278.000000,0.000000,278.000000,174.000000,0,278.000000,174.000000,278.000000,174.000000,0.000000,174.000000,0,0.000000,174.000000,0.000000,174.000000,0.000000,0.000000,0, + + + + +Logo4J +1280.000000 +720.000000 +0.000000 +false +Graphics\Logos\4JStudios_logo.png +48 + + + + +LogoMojang +1280.000000 +720.000000 +0.000000 +false +true +Graphics\Logos\mojang.png +48 + + + + +LogoMicrosoft +1280.000000 +720.000000 +0.000000 +false +true +Graphics\Logos\MS_Studios_MC.png +48 + + + + +LogoXLA +1280.000000 +720.000000 +0.000000 +true +Graphics\Logos\XBLA_MC.png +48 + + + + +LogoESRB +1280.000000 +720.000000 +0.000000 +false +Graphics\Logos\ESRB_10_Large.png + + + + + +Normal + + + +EndNormal + +stop + + +ESRBFade + + + +ESRBFadeEnd + +stop + + +StartFade + + + +EndFade + +stop + + + +LogoMojang +Opacity +Show + + +0 +0.000000 +false + + + +0 +0.000000 +false + + + +0 +0.000000 +false + + + +0 +0.000000 +true + + + +0 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +false + + + +0 +0.000000 +false + + + +LogoMicrosoft +Opacity +Show + + +0 +0.000000 +false + + + +0 +0.000000 +false + + + +0 +0.000000 +false + + + +0 +0.000000 +true + + + +0 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +false + + + +0 +0.000000 +false + + + +LogoXLA +Opacity +Show + + +0 +0.000000 +true + + + +0 +0.000000 +true + + + +0 +0.000000 +true + + + +0 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +false + + + +0 +0.000000 +false + + + +Logo4J +Opacity +Show + + +0 +0.000000 +false + + + +0 +0.000000 +false + + + +0 +0.000000 +false + + + +0 +0.000000 +true + + + +0 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +false + + + +LogoESRB +Opacity +Show + + +0 +0.000000 +false + + + +0 +0.000000 +false + + + +0 +0.000000 +true + + + +0 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +false + + + + + + + +StartFade + + + +EndFade + +stop + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_intro_480.h b/Minecraft.Client/Common/Media/xuiscene_intro_480.h new file mode 100644 index 00000000..85f35ed0 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_intro_480.h @@ -0,0 +1,6 @@ +#define IDC_Logo4J L"Logo4J" +#define IDC_LogoMojang L"LogoMojang" +#define IDC_LogoMicrosoft L"LogoMicrosoft" +#define IDC_LogoXLA L"LogoXLA" +#define IDC_LogoESRB L"LogoESRB" +#define IDC_SceneIntro L"SceneIntro" diff --git a/Minecraft.Client/Common/Media/xuiscene_intro_480.xui b/Minecraft.Client/Common/Media/xuiscene_intro_480.xui new file mode 100644 index 00000000..535c9319 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_intro_480.xui @@ -0,0 +1,389 @@ + + +640.000000 +480.000000 + + + +SceneIntro +640.000000 +480.000000 +CScene_Intro +XuiBlankScene + + + +640.000000 +480.000000 + + +0xff0f0f80 + + + + +0xffffffff + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,278.000000,0.000000,0,278.000000,0.000000,278.000000,0.000000,278.000000,174.000000,0,278.000000,174.000000,278.000000,174.000000,0.000000,174.000000,0,0.000000,174.000000,0.000000,174.000000,0.000000,0.000000,0, + + + + +Logo4J +640.000000 +480.000000 +0.000000 +false +16 +Graphics\Logos\4JStudios_logo.png +48 + + + + +LogoMojang +640.000000 +480.000000 +0.000000 +false +true +16 +Graphics\Logos\mojang.png +48 + + + + +LogoMicrosoft +640.000000 +480.000000 +0.000000 +false +true +16 +Graphics\Logos\MS_Studios_MC.png +48 + + + + +LogoXLA +640.000000 +480.000000 +0.000000 +true +16 +Graphics\Logos\XBLA_MC.png +48 + + + + +LogoESRB +1280.000000 +720.000000 +-89.599922,8.600021,0.000000 +0.640000,0.640000,1.000000 +0.000000 +false +16 +Graphics\Logos\ESRB_10_Large.png + + + + + +Normal + + + +EndNormal + +stop + + +ESRBFade + + + +ESRBFadeEnd + +stop + + +StartFade + + + +EndFade + +stop + + + +LogoMojang +Opacity +Show + + +0 +0.000000 +false + + + +0 +0.000000 +false + + + +0 +0.000000 +false + + + +0 +0.000000 +true + + + +0 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +false + + + +0 +0.000000 +false + + + +LogoMicrosoft +Opacity +Show + + +0 +0.000000 +false + + + +0 +0.000000 +false + + + +0 +0.000000 +false + + + +0 +0.000000 +true + + + +0 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +false + + + +0 +0.000000 +false + + + +LogoXLA +Opacity +Show + + +0 +0.000000 +true + + + +0 +0.000000 +true + + + +0 +0.000000 +true + + + +0 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +false + + + +0 +0.000000 +false + + + +Logo4J +Opacity +Show + + +0 +0.000000 +false + + + +0 +0.000000 +false + + + +0 +0.000000 +false + + + +0 +0.000000 +true + + + +0 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +false + + + +LogoESRB +Opacity +Show + + +0 +0.000000 +false + + + +0 +0.000000 +false + + + +0 +0.000000 +true + + + +0 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +false + + + + + + + +StartFade + + + +EndFade + +stop + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_inventory.h b/Minecraft.Client/Common/Media/xuiscene_inventory.h new file mode 100644 index 00000000..9e10ad3e --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_inventory.h @@ -0,0 +1,99 @@ +#define IDC_Effect10 L"Effect10" +#define IDC_Effect9 L"Effect9" +#define IDC_Effect8 L"Effect8" +#define IDC_Effect7 L"Effect7" +#define IDC_Effect6 L"Effect6" +#define IDC_Effect5 L"Effect5" +#define IDC_Effect4 L"Effect4" +#define IDC_Effect3 L"Effect3" +#define IDC_Effect2 L"Effect2" +#define IDC_Effect1 L"Effect1" +#define IDC_EffectsGroup L"EffectsGroup" +#define IDC_ArmourBackground L"ArmourBackground" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Armor L"Armor" +#define IDC_Character L"Character" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Inventory L"Inventory" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_UseRow L"UseRow" +#define IDC_InventoryText L"InventoryText" +#define IDC_Pointer L"Pointer" +#define IDC_Group L"Group" +#define IDC_XuiSceneInventory L"XuiSceneInventory" diff --git a/Minecraft.Client/Common/Media/xuiscene_inventory.xui b/Minecraft.Client/Common/Media/xuiscene_inventory.xui new file mode 100644 index 00000000..1b3ae9d4 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_inventory.xui @@ -0,0 +1,1431 @@ + + +1280.000000 +720.000000 + + + +XuiSceneInventory +1280.000000 +720.000000 +CXuiSceneInventory +XuiBlankScene +Pointer + + + +EffectsGroup +260.000000 +435.000000 +859.999878,94.000000,0.000000 + + + +Effect10 +260.000000 +58.000000 +0.000000,5.000000,0.000000 +CXuiCtrlMobEffect +MobEffect + + + + +Effect9 +260.000000 +58.000000 +0.000000,5.000000,0.000000 +CXuiCtrlMobEffect +MobEffect + + + + +Effect8 +260.000000 +58.000000 +0.000000,5.000000,0.000000 +CXuiCtrlMobEffect +MobEffect + + + + +Effect7 +260.000000 +58.000000 +0.000000,5.000000,0.000000 +CXuiCtrlMobEffect +MobEffect + + + + +Effect6 +260.000000 +58.000000 +0.000000,67.000000,0.000000 +CXuiCtrlMobEffect +MobEffect + + + + +Effect5 +260.000000 +58.000000 +0.000000,129.000000,0.000000 +CXuiCtrlMobEffect +MobEffect + + + + +Effect4 +260.000000 +58.000000 +0.000000,191.000000,0.000000 +CXuiCtrlMobEffect +MobEffect + + + + +Effect3 +260.000000 +58.000000 +0.000000,253.000000,0.000000 +CXuiCtrlMobEffect +MobEffect + + + + +Effect2 +260.000000 +58.000000 +0.000000,315.000000,0.000000 +CXuiCtrlMobEffect +MobEffect + + + + +Effect1 +260.000000 +58.000000 +0.000000,377.000000,0.000000 +CXuiCtrlMobEffect +MobEffect + + + + + +Group +431.000000 +435.000000 +424.000000,94.000000,0.000000 +15 +XuiScene +Pointer + + + +ArmourBackground +42.000000 +168.000000 +125.000000,26.000000,0.000000 +InventoryArmourBackground + + + + +Armor +71.000000 +172.000000 +125.000023,26.000000,0.000000 +3 +CXuiCtrlSlotList +ItemGridArmour + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonArmour +..\Images\img1.png +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonArmour +..\Images\img1.png +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonArmour +..\Images\img1.png +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonArmour +..\Images\img1.png +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonArmour +..\Images\img1.png +22594 +4 + + + + + +Character +126.000000 +168.000000 +180.000000,26.000000,0.000000 +3 +CharacterPanel +..\Images\img1.png + + + + +Inventory +382.000000 +150.000000 +25.000000,230.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + + +UseRow +381.000000 +50.000000 +25.000000,370.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + + +InventoryText +375.000000 +32.000000 +25.000000,200.000000,0.000000 +LabelContainerSceneLeft + + + + +Pointer +42.000000 +42.000000 +-185.000000,-84.000015,0.000000 +9 +false +CXuiCtrlSlotItem +ItemPointer + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +424.000000,94.000000,0.000000 + + + +0 +424.000000,94.000000,0.000000 + + + +2 +100 +-100 +50 +424.000000,94.000000,0.000000 + + + +0 +160.000000,94.000000,0.000000 + + + +2 +100 +-100 +50 +160.000000,94.000000,0.000000 + + + +0 +424.000000,94.000000,0.000000 + + + +EffectsGroup +Opacity + + +0 +1.000000 + + + +0 +1.000000 + + + +0 +1.000000 + + + +0 +0.000000 + + + +0 +0.000000 + + + +0 +0.000000 + + + +0 +1.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_inventory_480.h b/Minecraft.Client/Common/Media/xuiscene_inventory_480.h new file mode 100644 index 00000000..554e120d --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_inventory_480.h @@ -0,0 +1,137 @@ +#define IDC_Effect10 L"Effect10" +#define IDC_Effect9 L"Effect9" +#define IDC_Effect8 L"Effect8" +#define IDC_Effect7 L"Effect7" +#define IDC_Effect6 L"Effect6" +#define IDC_Effect5 L"Effect5" +#define IDC_Effect4 L"Effect4" +#define IDC_Effect3 L"Effect3" +#define IDC_Effect2 L"Effect2" +#define IDC_Effect1 L"Effect1" +#define IDC_EffectsGroup L"EffectsGroup" +#define IDC_ArmourBackground L"ArmourBackground" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Armor L"Armor" +#define IDC_Character L"Character" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Inventory L"Inventory" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_UseRow L"UseRow" +#define IDC_InventoryText L"InventoryText" +#define IDC_Pointer L"Pointer" +#define IDC_Group L"Group" +#define IDC_XuiSceneInventory L"XuiSceneInventory" diff --git a/Minecraft.Client/Common/Media/xuiscene_inventory_480.xui b/Minecraft.Client/Common/Media/xuiscene_inventory_480.xui new file mode 100644 index 00000000..3e2235e4 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_inventory_480.xui @@ -0,0 +1,1856 @@ + + +640.000000 +480.000000 + + + +XuiSceneInventory +640.000000 +480.000000 +CXuiSceneInventory +XuiBlankScene +Pointer + + + +EffectsGroup +160.000000 +280.000000 +454.999878,105.000000,0.000000 + + + +Effect10 +160.000000 +36.000000 +0.000000,4.000000,0.000000 +CXuiCtrlMobEffect +MobEffect_Small + + + + +Effect9 +160.000000 +36.000000 +0.000000,4.000000,0.000000 +CXuiCtrlMobEffect +MobEffect_Small + + + + +Effect8 +160.000000 +36.000000 +0.000000,4.000000,0.000000 +CXuiCtrlMobEffect +MobEffect_Small + + + + +Effect7 +160.000000 +36.000000 +0.000000,4.000000,0.000000 +CXuiCtrlMobEffect +MobEffect_Small + + + + +Effect6 +160.000000 +36.000000 +0.000000,44.000000,0.000000 +CXuiCtrlMobEffect +MobEffect_Small + + + + +Effect5 +160.000000 +36.000000 +0.000000,84.000000,0.000000 +CXuiCtrlMobEffect +MobEffect_Small + + + + +Effect4 +160.000000 +36.000000 +0.000000,124.000000,0.000000 +CXuiCtrlMobEffect +MobEffect_Small + + + + +Effect3 +160.000000 +36.000000 +0.000000,164.000000,0.000000 +CXuiCtrlMobEffect +MobEffect_Small + + + + +Effect2 +160.000000 +36.000000 +0.000000,204.000000,0.000000 +CXuiCtrlMobEffect +MobEffect_Small + + + + +Effect1 +160.000000 +36.000000 +0.000000,244.000000,0.000000 +CXuiCtrlMobEffect +MobEffect_Small + + + + + +Group +260.000000 +290.000000 +190.000015,96.000000,0.000000 +15 +GraphicPanel +Pointer + + + +ArmourBackground +26.000000 +104.000000 +74.000000,18.000000,0.000000 +InventoryArmourBackgroundSmall + + + + +Armor +26.000000 +104.000000 +74.000000,18.000000,0.000000 +3 +CXuiCtrlSlotList +ItemGridArmour26 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonArmour +..\Images\img1.png +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonArmour26 +..\Images\img1.png +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonArmour26 +..\Images\img1.png +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonArmour26 +..\Images\img1.png +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonArmour26 +..\Images\img1.png +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonArmour26 +..\Images\img1.png +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonArmour26 +..\Images\img1.png +22594 +4 + + + + + +Character +78.000000 +104.000000 +108.000000,18.000000,0.000000 +3 +CharacterPanel +..\Images\img1.png + + + + +Inventory +234.000000 +80.000000 +12.000000,160.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical26 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +UseRow +235.000000 +12.000000,250.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical26 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +InventoryText +230.000000 +22.000000 +12.000000,139.000000,0.000000 +LabelContainerSceneLeftSmall + + + + +Pointer +26.000000 +26.000000 +-50.000000,-50.000000,0.000000 +9 +false +CXuiCtrlSlotItem +ItemPointerSmall + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +190.000015,96.000000,0.000000 + + + +0 +190.000000,96.000000,0.000000 + + + +2 +100 +-100 +50 +190.000000,96.000000,0.000000 + + + +0 +32.000000,96.000000,0.000000 + + + +2 +100 +-100 +50 +32.000000,96.000000,0.000000 + + + +0 +190.000000,96.000000,0.000000 + + + +EffectsGroup +Opacity + + +0 +1.000000 + + + +0 +1.000000 + + + +0 +1.000000 + + + +0 +0.000000 + + + +0 +0.000000 + + + +0 +0.000000 + + + +0 +1.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_inventory_creative.h b/Minecraft.Client/Common/Media/xuiscene_inventory_creative.h new file mode 100644 index 00000000..3eff3adc --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_inventory_creative.h @@ -0,0 +1,537 @@ +#define IDC_MainPanel L"MainPanel" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_UseRow L"UseRow" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Container L"Container" +#define IDC_TabImage1 L"TabImage1" +#define IDC_TabImage2 L"TabImage2" +#define IDC_TabImage3 L"TabImage3" +#define IDC_TabImage4 L"TabImage4" +#define IDC_TabImage5 L"TabImage5" +#define IDC_TabImage6 L"TabImage6" +#define IDC_TabImage7 L"TabImage7" +#define IDC_TabImage8 L"TabImage8" +#define IDC_Group_Tab_Images L"Group_Tab_Images" +#define IDC_Icon_1 L"Icon_1" +#define IDC_Icon_2 L"Icon_2" +#define IDC_Icon_3 L"Icon_3" +#define IDC_Icon_4 L"Icon_4" +#define IDC_Icon_5 L"Icon_5" +#define IDC_Icon_6 L"Icon_6" +#define IDC_Icon_7 L"Icon_7" +#define IDC_Icon_8 L"Icon_8" +#define IDC_Group_Tab_Icons L"Group_Tab_Icons" +#define IDC_InventoryText L"InventoryText" +#define IDC_XuiSlider L"XuiSlider" +#define IDC_ScrollUp L"ScrollUp" +#define IDC_ScrollDown L"ScrollDown" +#define IDC_Pointer L"Pointer" +#define IDC_Group L"Group" +#define IDC_XuiSceneInventory L"XuiSceneInventory" diff --git a/Minecraft.Client/Common/Media/xuiscene_inventory_creative.xui b/Minecraft.Client/Common/Media/xuiscene_inventory_creative.xui new file mode 100644 index 00000000..ca184ee5 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_inventory_creative.xui @@ -0,0 +1,7462 @@ + + +1280.000000 +720.000000 + + + +XuiSceneInventory +1280.000000 +720.000000 +CXuiSceneInventoryCreative +XuiBlankScene +Pointer + + + +Group +643.000000 +490.000000 +319.000000,115.000000,0.000000 +15 +XuiBlankScene +Pointer + + + +MainPanel +643.000000 +490.000000 +CreativeInventory + + + + +UseRow +486.000000 +54.000000 +52.000000,411.000000,0.000000 +CXuiCtrlSlotList +ItemGridVertical54 + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + + +Container +542.000000 +270.000000 +24.000000,121.000000,0.000000 +CXuiCtrlSlotList +ItemGridVertical54 + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.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 +643.000000 +78.000000 + + + +TabImage1 +83.000000 +78.000000 +0.000000,-2.000000,0.000000 +CreativeInventoryTabLeft + + + + +TabImage2 +83.000000 +78.000000 +80.000000,-2.000000,0.000000 +CreativeInventoryTabMiddle + + + + +TabImage3 +83.000000 +78.000000 +160.000000,-2.000000,0.000000 +CreativeInventoryTabMiddle + + + + +TabImage4 +83.000000 +78.000000 +240.000000,-2.000000,0.000000 +CreativeInventoryTabMiddle + + + + +TabImage5 +83.000000 +78.000000 +320.000000,-2.000000,0.000000 +CreativeInventoryTabMiddle + + + + +TabImage6 +83.000000 +78.000000 +400.000000,-2.000000,0.000000 +CreativeInventoryTabMiddle + + + + +TabImage7 +83.000000 +78.000000 +480.000000,-2.000000,0.000000 +CreativeInventoryTabMiddle + + + + +TabImage8 +83.000000 +78.000000 +560.000000,-2.000000,0.000000 +CreativeInventoryTabRight + + + + + +Group_Tab_Icons +1280.000000 +200.000000 +-320.000000,-92.000000,0.000000 + + + +Icon_1 +48.000000 +48.000000 +337.000000,108.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_2 +48.000000 +48.000000 +417.000000,108.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_3 +48.000000 +48.000000 +497.000000,108.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_4 +48.000000 +48.000000 +577.000000,108.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_5 +48.000000 +48.000000 +657.000000,108.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_6 +48.000000 +48.000000 +737.000000,108.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_7 +48.000000 +48.000000 +817.000000,108.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_8 +48.000000 +48.000000 +897.000000,108.000000,0.000000 +false +CraftingCategoryIcon + + + + + +InventoryText +540.000000 +32.000000 +51.000000,85.000000,0.000000 +false +XuiLabelDarkCentred + + + + +XuiSlider +34.000000 +270.000000 +582.000000,120.000000,0.000000 +true +XuiSliderVertical +true + + + + +ScrollUp +32.000000 +22.000000 +583.000000,100.000000,0.000000 +XuiScrollEndUp + + + + +ScrollDown +32.000000 +22.000000 +583.000000,391.000000,0.000000 +XuiScrollEnd + + + + +Pointer +42.000000 +42.000000 +-504.000000,86.059990,0.000000 +false +CXuiCtrlSlotItem +ItemPointer + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +319.000000,115.000000,0.000000 + + + +0 +319.000000,115.000000,0.000000 + + + +2 +100 +-100 +50 +319.000000,115.000000,0.000000 + + + +0 +100.000000,115.000000,0.000000 + + + +2 +100 +-100 +50 +100.000000,115.000000,0.000000 + + + +0 +319.000000,115.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_inventory_creative_480.h b/Minecraft.Client/Common/Media/xuiscene_inventory_creative_480.h new file mode 100644 index 00000000..56abd8ce --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_inventory_creative_480.h @@ -0,0 +1,508 @@ +#define IDC_MainPanel L"MainPanel" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_UseRow L"UseRow" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Container L"Container" +#define IDC_TabImage1 L"TabImage1" +#define IDC_TabImage2 L"TabImage2" +#define IDC_TabImage3 L"TabImage3" +#define IDC_TabImage4 L"TabImage4" +#define IDC_TabImage5 L"TabImage5" +#define IDC_TabImage6 L"TabImage6" +#define IDC_TabImage7 L"TabImage7" +#define IDC_TabImage8 L"TabImage8" +#define IDC_Group_Tab_Images L"Group_Tab_Images" +#define IDC_Icon_1 L"Icon_1" +#define IDC_Icon_2 L"Icon_2" +#define IDC_Icon_3 L"Icon_3" +#define IDC_Icon_4 L"Icon_4" +#define IDC_Icon_5 L"Icon_5" +#define IDC_Icon_6 L"Icon_6" +#define IDC_Icon_7 L"Icon_7" +#define IDC_Icon_8 L"Icon_8" +#define IDC_Group_Tab_Icons L"Group_Tab_Icons" +#define IDC_InventoryText L"InventoryText" +#define IDC_ScrollDown L"ScrollDown" +#define IDC_ScrollUp L"ScrollUp" +#define IDC_XuiSlider L"XuiSlider" +#define IDC_Pointer L"Pointer" +#define IDC_Group L"Group" +#define IDC_XuiSceneCreativeInventory L"XuiSceneCreativeInventory" diff --git a/Minecraft.Client/Common/Media/xuiscene_inventory_creative_480.xui b/Minecraft.Client/Common/Media/xuiscene_inventory_creative_480.xui new file mode 100644 index 00000000..cb6b1561 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_inventory_creative_480.xui @@ -0,0 +1,7020 @@ + + +640.000000 +480.000000 + + + +XuiSceneCreativeInventory +640.000000 +480.000000 +CXuiSceneInventoryCreative +XuiBlankScene +Pointer + + + +Group +418.000000 +294.000000 +111.000000,80.000000,0.000000 +15 +XuiBlankScene +Pointer + + + +MainPanel +418.000000 +294.000000 +CreativeInventorySmall + + + + +UseRow +292.000000 +32.000000 +47.000000,246.000000,0.000000 +CXuiCtrlSlotList +ItemGridVertical32 + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + + +Container +322.000000 +162.000000 +32.000008,75.000015,0.000000 +CXuiCtrlSlotList +ItemGridVertical32 + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + + +Group_Tab_Images +412.000000 +60.000000 +3.999992,-5.999985,0.000000 + + + +TabImage1 +54.000000 +56.000000 +-4.000000,4.000000,0.000000 +CreativeInventoryTabLeftSmall + + + + +TabImage2 +54.000000 +56.000000 +48.000000,4.000000,0.000000 +CreativeInventoryTabMiddleSmall + + + + +TabImage3 +54.000000 +56.000000 +100.000000,4.000000,0.000000 +CreativeInventoryTabMiddleSmall + + + + +TabImage4 +54.000000 +56.000000 +152.000000,4.000000,0.000000 +CreativeInventoryTabMiddleSmall + + + + +TabImage5 +54.000000 +56.000000 +204.000000,4.000000,0.000000 +CreativeInventoryTabMiddleSmall + + + + +TabImage6 +54.000000 +56.000000 +256.000000,4.000000,0.000000 +CreativeInventoryTabMiddleSmall + + + + +TabImage7 +54.000000 +56.000000 +308.000000,4.000000,0.000000 +CreativeInventoryTabMiddleSmall + + + + +TabImage8 +54.000000 +56.000000 +360.000000,4.000000,0.000000 +CreativeInventoryTabRightSmall + + + + + +Group_Tab_Icons +412.000000 +60.000000 +3.999992,-5.999985,0.000000 + + + +Icon_1 +32.000000 +32.000000 +8.000000,18.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_2 +32.000000 +32.000000 +60.000000,18.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_3 +32.000000 +32.000000 +112.000000,18.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_4 +32.000000 +32.000000 +164.000000,18.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_5 +32.000000 +32.000000 +216.000000,18.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_6 +32.000000 +32.000000 +268.000000,18.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_7 +32.000000 +32.000000 +320.000000,18.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_8 +32.000000 +32.000000 +372.000000,18.000000,0.000000 +false +CraftingCategoryIcon + + + + + +InventoryText +360.000000 +22.000000 +29.000000,55.000000,0.000000 +false +XuiLabelDarkCentredSmall + + + + +ScrollDown +32.000000 +22.000000 +368.000000,238.000000,0.000000 +XuiScrollEnd + + + + +ScrollUp +32.000000 +22.000000 +368.000000,56.000000,0.000000 +XuiScrollEndUp + + + + +XuiSlider +32.000000 +162.000000 +368.000000,76.000000,0.000000 +XuiSliderVerticalSmall +true + + + + +Pointer +26.000000 +26.000000 +-161.000000,60.000015,0.000000 +false +CXuiCtrlSlotItem +ItemPointerSmall + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +111.000000,80.000000,0.000000 + + + +0 +111.000000,80.000000,0.000000 + + + +2 +100 +-100 +50 +111.000000,80.000000,0.000000 + + + +0 +31.000000,80.000000,0.000000 + + + +2 +100 +-100 +50 +31.000000,80.000000,0.000000 + + + +0 +111.000000,80.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_inventory_creative_small.h b/Minecraft.Client/Common/Media/xuiscene_inventory_creative_small.h new file mode 100644 index 00000000..d20c8788 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_inventory_creative_small.h @@ -0,0 +1,447 @@ +#define IDC_MainPanel L"MainPanel" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_UseRow L"UseRow" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Container L"Container" +#define IDC_TabImage1 L"TabImage1" +#define IDC_TabImage2 L"TabImage2" +#define IDC_TabImage3 L"TabImage3" +#define IDC_TabImage4 L"TabImage4" +#define IDC_TabImage5 L"TabImage5" +#define IDC_TabImage6 L"TabImage6" +#define IDC_TabImage7 L"TabImage7" +#define IDC_TabImage8 L"TabImage8" +#define IDC_Group_Tab_Images L"Group_Tab_Images" +#define IDC_Icon_1 L"Icon_1" +#define IDC_Icon_2 L"Icon_2" +#define IDC_Icon_3 L"Icon_3" +#define IDC_Icon_4 L"Icon_4" +#define IDC_Icon_5 L"Icon_5" +#define IDC_Icon_6 L"Icon_6" +#define IDC_Icon_7 L"Icon_7" +#define IDC_Icon_8 L"Icon_8" +#define IDC_Group_Tab_Icons L"Group_Tab_Icons" +#define IDC_InventoryText L"InventoryText" +#define IDC_ScrollDown L"ScrollDown" +#define IDC_ScrollUp L"ScrollUp" +#define IDC_XuiSlider L"XuiSlider" +#define IDC_Pointer L"Pointer" +#define IDC_Group L"Group" +#define IDC_XuiSceneCreativeInventory L"XuiSceneCreativeInventory" diff --git a/Minecraft.Client/Common/Media/xuiscene_inventory_creative_small.xui b/Minecraft.Client/Common/Media/xuiscene_inventory_creative_small.xui new file mode 100644 index 00000000..f673a6bc --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_inventory_creative_small.xui @@ -0,0 +1,6166 @@ + + +640.000000 +360.000000 + + + +XuiSceneCreativeInventory +640.000000 +360.000000 +CXuiSceneInventoryCreative +XuiBlankScene +Pointer + + + +Group +418.000000 +294.000000 +111.000000,0.000000,0.000000 +15 +XuiBlankScene +Pointer + + + +MainPanel +418.000000 +294.000000 +CreativeInventorySmall + + + + +UseRow +292.000000 +32.000000 +47.000000,247.000000,0.000000 +CXuiCtrlSlotList +ItemGridVertical32 + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + + +Container +322.000000 +162.000000 +32.000008,76.000000,0.000000 +CXuiCtrlSlotList +ItemGridVertical32 + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + + +Group_Tab_Images +412.000000 +60.000000 +3.999992,-5.999998,0.000000 + + + +TabImage1 +54.000000 +56.000000 +-4.000000,4.000000,0.000000 +CreativeInventoryTabLeftSmall + + + + +TabImage2 +54.000000 +56.000000 +48.000000,4.000000,0.000000 +CreativeInventoryTabMiddleSmall + + + + +TabImage3 +54.000000 +56.000000 +100.000000,4.000000,0.000000 +CreativeInventoryTabMiddleSmall + + + + +TabImage4 +54.000000 +56.000000 +152.000000,4.000000,0.000000 +CreativeInventoryTabMiddleSmall + + + + +TabImage5 +54.000000 +56.000000 +204.000000,4.000000,0.000000 +CreativeInventoryTabMiddleSmall + + + + +TabImage6 +54.000000 +56.000000 +256.000000,4.000000,0.000000 +CreativeInventoryTabMiddleSmall + + + + +TabImage7 +54.000000 +56.000000 +308.000000,4.000000,0.000000 +CreativeInventoryTabMiddleSmall + + + + +TabImage8 +54.000000 +56.000000 +360.000000,4.000000,0.000000 +CreativeInventoryTabRightSmall + + + + + +Group_Tab_Icons +412.000000 +60.000000 +3.999992,-5.999998,0.000000 + + + +Icon_1 +32.000000 +32.000000 +8.000000,20.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_2 +32.000000 +32.000000 +60.000000,20.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_3 +32.000000 +32.000000 +112.000000,20.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_4 +32.000000 +32.000000 +164.000000,20.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_5 +32.000000 +32.000000 +216.000000,20.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_6 +32.000000 +32.000000 +268.000000,20.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_7 +32.000000 +32.000000 +320.000000,20.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_8 +32.000000 +32.000000 +372.000000,20.000000,0.000000 +false +CraftingCategoryIcon + + + + + +InventoryText +360.000000 +22.000000 +29.000000,56.000000,0.000000 +false +XuiLabelDarkCentredSmall + + + + +ScrollDown +32.000000 +22.000000 +368.000000,238.000000,0.000000 +XuiScrollEnd + + + + +ScrollUp +32.000000 +22.000000 +368.000000,56.000000,0.000000 +XuiScrollEndUp + + + + +XuiSlider +32.000000 +162.000000 +368.000000,76.000000,0.000000 +XuiSliderVerticalSmall +true + + + + +Pointer +26.000000 +26.000000 +-161.000000,6.000002,0.000000 +false +CXuiCtrlSlotItem +ItemPointerSmall + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +111.000000,0.000000,0.000000 + + + +0 +111.000000,0.000000,0.000000 + + + +2 +100 +-100 +50 +111.000000,0.000000,0.000000 + + + +0 +31.000000,0.000000,0.000000 + + + +2 +100 +-100 +50 +31.000000,0.000000,0.000000 + + + +0 +111.000000,0.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_inventory_small.h b/Minecraft.Client/Common/Media/xuiscene_inventory_small.h new file mode 100644 index 00000000..fc2f2ba4 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_inventory_small.h @@ -0,0 +1,121 @@ +#define IDC_Effect10 L"Effect10" +#define IDC_Effect9 L"Effect9" +#define IDC_Effect8 L"Effect8" +#define IDC_Effect7 L"Effect7" +#define IDC_Effect6 L"Effect6" +#define IDC_Effect5 L"Effect5" +#define IDC_Effect4 L"Effect4" +#define IDC_Effect3 L"Effect3" +#define IDC_Effect2 L"Effect2" +#define IDC_Effect1 L"Effect1" +#define IDC_EffectsGroup L"EffectsGroup" +#define IDC_ArmourBackground L"ArmourBackground" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Armor L"Armor" +#define IDC_Character L"Character" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Inventory L"Inventory" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_UseRow L"UseRow" +#define IDC_InventoryText L"InventoryText" +#define IDC_Pointer L"Pointer" +#define IDC_Group L"Group" +#define IDC_XuiSceneInventory L"XuiSceneInventory" diff --git a/Minecraft.Client/Common/Media/xuiscene_inventory_small.xui b/Minecraft.Client/Common/Media/xuiscene_inventory_small.xui new file mode 100644 index 00000000..b9883535 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_inventory_small.xui @@ -0,0 +1,1643 @@ + + +640.000000 +360.000000 + + + +XuiSceneInventory +640.000000 +360.000000 +CXuiSceneInventory +XuiBlankScene +Pointer + + + +EffectsGroup +160.000000 +280.000000 +454.999878,0.000000,0.000000 + + + +Effect10 +160.000000 +36.000000 +0.000000,4.000000,0.000000 +CXuiCtrlMobEffect +MobEffect_Small + + + + +Effect9 +160.000000 +36.000000 +0.000000,4.000000,0.000000 +CXuiCtrlMobEffect +MobEffect_Small + + + + +Effect8 +160.000000 +36.000000 +0.000000,4.000000,0.000000 +CXuiCtrlMobEffect +MobEffect_Small + + + + +Effect7 +160.000000 +36.000000 +0.000000,4.000000,0.000000 +CXuiCtrlMobEffect +MobEffect_Small + + + + +Effect6 +160.000000 +36.000000 +0.000000,44.000000,0.000000 +CXuiCtrlMobEffect +MobEffect_Small + + + + +Effect5 +160.000000 +36.000000 +0.000000,84.000000,0.000000 +CXuiCtrlMobEffect +MobEffect_Small + + + + +Effect4 +160.000000 +36.000000 +0.000000,124.000000,0.000000 +CXuiCtrlMobEffect +MobEffect_Small + + + + +Effect3 +160.000000 +36.000000 +0.000000,164.000000,0.000000 +CXuiCtrlMobEffect +MobEffect_Small + + + + +Effect2 +160.000000 +36.000000 +0.000000,204.000000,0.000000 +CXuiCtrlMobEffect +MobEffect_Small + + + + +Effect1 +160.000000 +36.000000 +0.000000,244.000000,0.000000 +CXuiCtrlMobEffect +MobEffect_Small + + + + + +Group +260.000000 +280.000000 +190.000000,0.000000,0.000000 +15 +GraphicPanel +Pointer + + + +ArmourBackground +26.000000 +104.000000 +74.000000,17.000000,0.000000 +InventoryArmourBackgroundSmall + + + + +Armor +27.377594 +106.259193 +74.000000,17.000000,0.000000 +3 +CXuiCtrlSlotList +ItemGridArmour26 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonArmour +..\Images\img1.png +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonArmour26 +..\Images\img1.png +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +26.000000 +26.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonArmour26 +..\Images\img1.png +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonArmour26 +..\Images\img1.png +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonArmour26 +..\Images\img1.png +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonArmour26 +..\Images\img1.png +22594 +4 + + + + + +Character +78.000000 +104.000000 +108.000000,17.000000,0.000000 +3 +CharacterPanel +..\Images\img1.png + + + + +Inventory +234.000000 +80.000000 +12.000000,151.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical26 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +UseRow +235.000000 +12.000000,240.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical26 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +InventoryText +230.000000 +22.000000 +12.000000,130.000000,0.000000 +LabelContainerSceneLeftSmall + + + + +Pointer +26.000000 +26.000000 +-50.000000,-50.000000,0.000000 +9 +false +CXuiCtrlSlotItem +ItemPointerSmall + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +190.000000,0.000000,0.000000 + + + +0 +190.000000,0.000000,0.000000 + + + +2 +100 +-100 +50 +190.000000,0.000000,0.000000 + + + +0 +104.000000,0.000000,0.000000 + + + +2 +100 +-100 +50 +104.000000,0.000000,0.000000 + + + +0 +190.000000,0.000000,0.000000 + + + +EffectsGroup +Opacity + + +0 +1.000000 + + + +0 +1.000000 + + + +0 +1.000000 + + + +0 +0.000000 + + + +0 +0.000000 + + + +0 +0.000000 + + + +0 +1.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_leaderboards.h b/Minecraft.Client/Common/Media/xuiscene_leaderboards.h new file mode 100644 index 00000000..094878f4 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_leaderboards.h @@ -0,0 +1,17 @@ +#define IDC_Background3 L"Background3" +#define IDC_Background2 L"Background2" +#define IDC_Background1 L"Background1" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_XuiListGamers L"XuiListGamers" +#define IDC_XuiTextFilter L"XuiTextFilter" +#define IDC_XuiTextLeaderboard L"XuiTextLeaderboard" +#define IDC_XuiTextEntries L"XuiTextEntries" +#define IDC_XuiTextInfo L"XuiTextInfo" +#define IDC_LSIcon L"LSIcon" +#define IDC_RBIcon L"RBIcon" +#define IDC_LBIcon L"LBIcon" +#define IDC_SceneLeaderboards L"SceneLeaderboards" diff --git a/Minecraft.Client/Common/Media/xuiscene_leaderboards.xui b/Minecraft.Client/Common/Media/xuiscene_leaderboards.xui new file mode 100644 index 00000000..1bbaa65b --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_leaderboards.xui @@ -0,0 +1,176 @@ + + +1280.000000 +720.000000 + + + +SceneLeaderboards +1280.000000 +720.000000 +CScene_Leaderboards +XuiMenuScene +XuiListGamers + + + +Background3 +320.000000 +36.000000 +846.000000,54.000000,0.000000 +LeaderboardHeaderPanel + + + + +Background2 +398.000000 +36.000000 +441.000000,54.000000,0.000000 +LeaderboardHeaderPanel + + + + +Background1 +320.000000 +36.000000 +114.000000,54.000000,0.000000 +LeaderboardHeaderPanel + + + + +XuiListGamers +1084.000000 +518.000000 +98.000000,90.000015,0.000000 +4 +CXuiCtrlPassThroughList +XuiListLeaderboard + + + +control_ListItem +469.000000 +86.000000 +16.000000,32.000000,0.000000 +5 +false +XuiLeaderboardEntry + + + + +control_ListItem +940.000000 +44.000000 +20.000032,71.000000,0.000000 +15 +false +XuiLeaderboardEntry +22594 + + + + +control_ListItem +940.000000 +44.000000 +20.000032,71.000000,0.000000 +15 +false +XuiLeaderboardEntry +22594 + + + + +control_ListItem +940.000000 +44.000000 +20.000032,71.000000,0.000000 +15 +false +XuiLeaderboardEntry +22594 + + + + +control_ListItem +940.000000 +44.000000 +20.000032,71.000000,0.000000 +15 +false +XuiLeaderboardEntry +22594 + + + + + +XuiTextFilter +300.000000 +20.000000 +124.000000,62.000000,0.000000 +LabelLeaderboardTitle + + + + +XuiTextLeaderboard +266.000000 +20.000000 +496.000000,62.000000,0.000000 +LabelLeaderboardTitle + + + + +XuiTextEntries +300.000000 +20.000000 +856.000000,62.000000,0.000000 +LabelLeaderboardTitle + + + + +XuiTextInfo +366.000000 +106.000000 +457.000000,304.000000,0.000000 +LabelLeaderboardWaitingText + + + + +LSIcon +50.000000 +32.000000 +446.000000,54.000000,0.000000 +IconLStickSides + + + + +RBIcon +32.000000 +32.000000 +800.000000,58.000000,0.000000 +IconRBumper + + + + +LBIcon +32.000000 +32.000000 +764.000000,58.000000,0.000000 +IconLBumper + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_leaderboards_480.h b/Minecraft.Client/Common/Media/xuiscene_leaderboards_480.h new file mode 100644 index 00000000..094878f4 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_leaderboards_480.h @@ -0,0 +1,17 @@ +#define IDC_Background3 L"Background3" +#define IDC_Background2 L"Background2" +#define IDC_Background1 L"Background1" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_XuiListGamers L"XuiListGamers" +#define IDC_XuiTextFilter L"XuiTextFilter" +#define IDC_XuiTextLeaderboard L"XuiTextLeaderboard" +#define IDC_XuiTextEntries L"XuiTextEntries" +#define IDC_XuiTextInfo L"XuiTextInfo" +#define IDC_LSIcon L"LSIcon" +#define IDC_RBIcon L"RBIcon" +#define IDC_LBIcon L"LBIcon" +#define IDC_SceneLeaderboards L"SceneLeaderboards" diff --git a/Minecraft.Client/Common/Media/xuiscene_leaderboards_480.xui b/Minecraft.Client/Common/Media/xuiscene_leaderboards_480.xui new file mode 100644 index 00000000..4b7f0b08 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_leaderboards_480.xui @@ -0,0 +1,180 @@ + + +640.000000 +480.000000 + + + +SceneLeaderboards +640.000000 +480.000000 +CScene_Leaderboards +XuiMenuScene +XuiListGamers + + + +Background3 +170.000000 +50.000000 +422.000000,36.000000,0.000000 +LeaderboardHeaderPanel + + + + +Background2 +200.000000 +50.000000 +222.000000,36.000000,0.000000 +LeaderboardHeaderPanel + + + + +Background1 +170.000000 +50.000000 +50.000000,36.000000,0.000000 +LeaderboardHeaderPanel + + + + +XuiListGamers +560.000000 +313.000000 +40.000000,90.000000,0.000000 +4 +CXuiCtrlPassThroughList +XuiListLeaderboardSmall + + + +control_ListItem +469.000000 +86.000000 +16.000000,32.000000,0.000000 +5 +false +XuiLeaderboardEntry + + + + +control_ListItem +540.000000 +22.000000 +10.000000,52.000000,0.000000 +15 +false +XuiLeaderboardEntrySmall +22594 +0.000000,2.000000,0.000000 + + + + +control_ListItem +540.000000 +22.000000 +10.000000,52.000000,0.000000 +15 +false +XuiLeaderboardEntrySmall +22594 +0.000000,2.000000,0.000000 + + + + +control_ListItem +540.000000 +22.000000 +10.000000,52.000000,0.000000 +15 +false +XuiLeaderboardEntrySmall +22594 +0.000000,2.000000,0.000000 + + + + +control_ListItem +540.000000 +22.000000 +10.000000,52.000000,0.000000 +15 +false +XuiLeaderboardEntrySmall +22594 +0.000000,2.000000,0.000000 + + + + + +XuiTextFilter +154.000000 +40.000000 +58.000000,40.000000,0.000000 +LabelLeaderboardTitleSmall + + + + +XuiTextLeaderboard +120.000000 +40.000000 +252.000000,40.000000,0.000000 +LabelLeaderboardTitleSmall + + + + +XuiTextEntries +154.000000 +40.000000 +432.000000,40.000000,0.000000 +LabelLeaderboardTitleSmall + + + + +XuiTextInfo +366.000000 +106.000000 +137.000000,187.000000,0.000000 +LabelLeaderboardWaitingTextSmall + + + + +LSIcon +28.000000 +20.000000 +224.000000,40.000000,0.000000 +IconLStickSides + + + + +RBIcon +24.000000 +20.000000 +395.000000,40.000000,0.000000 +IconRBumper + + + + +LBIcon +24.000000 +20.000000 +373.000000,40.000000,0.000000 +IconLBumper + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_load_settings.h b/Minecraft.Client/Common/Media/xuiscene_load_settings.h new file mode 100644 index 00000000..027a45fb --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_load_settings.h @@ -0,0 +1,40 @@ +#define IDC_ComparisonPic L"ComparisonPic" +#define IDC_Icon L"Icon" +#define IDC_TexturePackName L"TexturePackName" +#define IDC_TexturePackDescription L"TexturePackDescription" +#define IDC_TexturePackDetails L"TexturePackDetails" +#define IDC_Background L"Background" +#define IDC_XuiLoadSettings L"XuiLoadSettings" +#define IDC_XuiMoreOptions L"XuiMoreOptions" +#define IDC_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" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_TexturePacksList L"TexturePacksList" +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderDifficulty L"XuiSliderDifficulty" +#define IDC_XuiGameModeToggle L"XuiGameModeToggle" +#define IDC_XuiGameIcon L"XuiGameIcon" +#define IDC_XuiGameName L"XuiGameName" +#define IDC_XuiGameSeed L"XuiGameSeed" +#define IDC_XuiCreatedMode L"XuiCreatedMode" +#define IDC_MainScene L"MainScene" +#define IDC_LoadGameSettings L"LoadGameSettings" diff --git a/Minecraft.Client/Common/Media/xuiscene_load_settings.xui b/Minecraft.Client/Common/Media/xuiscene_load_settings.xui new file mode 100644 index 00000000..781f3da2 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_load_settings.xui @@ -0,0 +1,510 @@ + + +1280.000000 +720.000000 + + + +LoadGameSettings +770.000000 +450.000000 +255.000092,140.000000,0.000000 +CScene_LoadGameSettings +XuiBlankScene +MainScene\XuiLoadSettings + + + +TexturePackDetails +334.000000 +462.000000 +260.000000,14.000000,0.000000 +LeaderboardHeaderPanel + + + +ComparisonPic +292.000000 +160.000000 +26.000000,291.000000,0.000000 +CXuiCtrl4JIcon +XuiVisualImagePresenter + + + + +Icon +64.000000 +64.000000 +26.000000,14.000000,0.000000 +CXuiCtrl4JIcon +XuiVisualImagePresenter + + + + +TexturePackName +222.000000 +64.000000 +96.000000,14.000000,0.000000 +XuiLabelLight_FRONT_END_Shd_Wrp + + + + +TexturePackDescription +292.000000 +180.000000 +26.000000,86.000000,0.000000 +XuiHtmlControl + + + + + +MainScene +490.000000 +484.000000 +140.000031,0.000000,0.000000 + + + +Background +490.000000 +484.000000 +15 +XuiScene + + + + +XuiLoadSettings +440.000000 +40.000000 +25.000015,420.000000,0.000000 +XuiMainMenuButton_L +XuiMoreOptions + + + + +XuiMoreOptions +440.000000 +40.000000 +25.000015,370.000000,0.000000 +XuiMainMenuButton_L +CheckboxOnline +XuiLoadSettings +22528 + + + + +CheckboxOnline +402.000000 +34.000000 +25.000015,330.000000,0.000000 +XuiCheckbox +TexturePacksList +XuiMoreOptions + + + + +TexturePacksList +428.000000 +98.000000 +32.000000,226.000000,0.000000 +CXuiCtrl4JList +XuiListTexturePack +XuiSliderDifficulty\XuiSlider +CheckboxOnline +true + + + +control_ListItem +400.000000 +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +10.000000,10.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +10.000000,10.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +10.000000,10.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +10.000000,10.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +34.000000,28.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +34.000000,30.000000,0.000000 +37 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +34.000000,30.000000,0.000000 +37 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +34.000000,30.000000,0.000000 +37 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +34.000000,30.000000,0.000000 +37 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +34.000000,30.000000,0.000000 +37 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +34.000000,30.000000,0.000000 +37 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +34.000000,30.000000,0.000000 +37 +false +XuiListTexturePackButton +1 + + + + + +XuiSliderDifficulty +446.000000 +38.000000 +22.000000,177.000000,0.000000 +5 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiGameModeToggle +TexturePacksList +FocusSink + + + +XuiSlider +446.000000 +38.000000 +XuiSlider +3 + + + + +FocusSink +1.000000 +1.000000 + + + + + +XuiGameModeToggle +440.000000 +40.000000 +25.000015,129.000000,0.000000 +XuiMainMenuButton_L +XuiSliderDifficulty\XuiSlider +22528 + + + + +XuiGameIcon +64.000000 +64.000000 +25.000000,18.000000,0.000000 +CXuiCtrl4JIcon +ItemIcon + + + + +XuiGameName +363.000000 +26.000000 +97.000000,18.000000,0.000000 +XuiLabelDark14_1Line + + + + +XuiGameSeed +440.000000 +26.000000 +25.000000,92.000000,0.000000 +XuiLabelDark14_1Line + + + + +XuiCreatedMode +363.000000 +26.000000 +97.000000,54.000000,0.000000 +XuiLabelDark14_1Line + + + + + + +Normal + +stop + + +SlideOut + + + +SlideOutEnd + +stop + + +SlideBack + + + +SlideBackEnd + +stop + + + +MainScene +Position + + +0 +140.000031,0.000000,0.000000 + + + +0 +140.000031,0.000000,0.000000 + + + +0 +-44.000000,0.000000,0.000000 + + + +0 +-44.000000,0.000000,0.000000 + + + +0 +140.000031,0.000000,0.000000 + + + +TexturePackDetails +Position + + +0 +260.000000,14.000000,0.000000 + + + +0 +260.000000,14.000000,0.000000 + + + +0 +434.000000,14.000000,0.000000 + + + +0 +434.000000,14.000000,0.000000 + + + +0 +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 new file mode 100644 index 00000000..df3b2198 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_load_settings_480.h @@ -0,0 +1,40 @@ +#define IDC_ComparisonPic L"ComparisonPic" +#define IDC_TexturePackDescription L"TexturePackDescription" +#define IDC_TexturePackName L"TexturePackName" +#define IDC_Icon L"Icon" +#define IDC_TexturePackDetails L"TexturePackDetails" +#define IDC_Background L"Background" +#define IDC_XuiLoadSettings L"XuiLoadSettings" +#define IDC_XuiMoreOptions L"XuiMoreOptions" +#define IDC_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" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_TexturePacksList L"TexturePacksList" +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderDifficulty L"XuiSliderDifficulty" +#define IDC_XuiGameModeToggle L"XuiGameModeToggle" +#define IDC_XuiGameSeed L"XuiGameSeed" +#define IDC_XuiGameIcon L"XuiGameIcon" +#define IDC_XuiGameName L"XuiGameName" +#define IDC_XuiCreatedMode L"XuiCreatedMode" +#define IDC_MainScene L"MainScene" +#define IDC_LoadGameSettings L"LoadGameSettings" diff --git a/Minecraft.Client/Common/Media/xuiscene_load_settings_480.xui b/Minecraft.Client/Common/Media/xuiscene_load_settings_480.xui new file mode 100644 index 00000000..d39f0940 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_load_settings_480.xui @@ -0,0 +1,516 @@ + + +640.000000 +480.000000 + + + +LoadGameSettings +597.000000 +375.000000 +21.500046,30.000000,0.000000 +CScene_LoadGameSettings +XuiBlankScene +MainScene\XuiLoadSettings + + + +TexturePackDetails +230.000000 +378.000000 +184.000000,2.000000,0.000000 +LeaderboardHeaderPanel + + + +ComparisonPic +196.000000 +112.000000 +20.000000,254.000000,0.000000 +CXuiCtrl4JIcon +XuiVisualImagePresenter + + + + +TexturePackDescription +196.000000 +106.000000 +20.000010,132.000000,0.000000 +XuiHtmlControl_Small + + + + +TexturePackName +196.000000 +43.000000 +20.000000,82.000008,0.000000 +XuiLabelLight_FRONT_END_Shd_Wrp_Small + + + + +Icon +64.000000 +64.000000 +90.000000,10.000000,0.000000 +CXuiCtrl4JIcon +XuiVisualImagePresenter + + + + + +MainScene +380.000000 +401.000000 +108.500015,-12.999970,0.000000 + + + +Background +380.000000 +401.000000 +15 +XuiScene + + + + +XuiLoadSettings +344.000000 +36.000000 +18.000000,342.000000,0.000000 +XuiMainMenuButton_L_Thin +XuiMoreOptions +22528 + + + + +XuiMoreOptions +344.000000 +36.000000 +18.000000,297.000000,0.000000 +XuiMainMenuButton_L_Thin +CheckboxOnline +XuiLoadSettings +22528 + + + + +CheckboxOnline +304.000000 +26.000000 +20.000000,272.000000,0.000000 +XuiCheckboxSmall +TexturePacksList +XuiMoreOptions + + + + +TexturePacksList +344.000000 +74.000000 +18.000000,194.000000,0.000000 +CXuiCtrl4JList +XuiListTexturePackSmall +XuiSliderDifficulty\XuiSlider +CheckboxOnline +true + + + +control_ListItem +400.000000 +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +10.000000,10.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +10.000000,10.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +10.000000,10.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +10.000000,10.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +40.000000 +40.000000 +10.000000,10.000000,0.000000 +false +XuiListTexturePackButtonSmall +1 + + + + +control_ListItem +40.000000 +40.000000 +10.000000,10.000000,0.000000 +false +XuiListTexturePackButtonSmall +1 + + + + +control_ListItem +40.000000 +40.000000 +35.000000,22.000000,0.000000 +5 +false +XuiListTexturePackButtonSmall +1 + + + + +control_ListItem +40.000000 +40.000000 +35.000000,24.000000,0.000000 +37 +false +XuiListTexturePackButtonSmall +1 + + + + +control_ListItem +40.000000 +40.000000 +35.000000,24.000000,0.000000 +37 +false +XuiListTexturePackButtonSmall +1 + + + + +control_ListItem +40.000000 +40.000000 +35.000000,24.000000,0.000000 +37 +false +XuiListTexturePackButtonSmall +1 + + + + +control_ListItem +40.000000 +40.000000 +35.000000,24.000000,0.000000 +37 +false +XuiListTexturePackButtonSmall +1 + + + + +control_ListItem +40.000000 +40.000000 +35.000000,24.000000,0.000000 +37 +false +XuiListTexturePackButtonSmall +1 + + + + + +XuiSliderDifficulty +350.000000 +38.000000 +15.000000,142.000000,0.000000 +5 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiGameModeToggle +TexturePacksList +FocusSink + + + +XuiSlider +350.000000 +38.000000 +XuiSlider +3 + + + + +FocusSink +1.000000 +1.000000 + + + + + +XuiGameModeToggle +344.000000 +36.000000 +18.000000,99.000000,0.000000 +XuiMainMenuButton_L_Thin +XuiSliderDifficulty\XuiSlider +22528 + + + + +XuiGameSeed +350.000000 +26.000000 +18.000000,64.000000,0.000000 +XuiLabelDark14_1Line + + + + +XuiGameIcon +42.000000 +42.000000 +18.000000,18.000000,0.000000 +CXuiCtrl4JIcon +ItemIcon + + + + +XuiGameName +300.000000 +23.000000 +66.000000,15.000000,0.000000 +XuiLabelDark14_1Line + + + + +XuiCreatedMode +300.000000 +19.000000 +66.000000,39.000000,0.000000 +XuiLabelDark14_1Line + + + + + + +Normal + +stop + + +SlideOut + + + +SlideOutEnd + +stop + + +SlideBack + + + +SlideBackEnd + + + + +MainScene +Position + + +0 +108.500015,-12.999970,0.000000 + + + +0 +108.500008,-12.999985,0.000000 + + + +0 +0.000000,-12.999985,0.000000 + + + +0 +0.000000,-12.999985,0.000000 + + + +0 +108.500015,-12.999985,0.000000 + + + +TexturePackDetails +Position + + +0 +184.000000,2.000000,0.000000 + + + +0 +184.000000,2.000000,0.000000 + + + +0 +366.000000,2.000000,0.000000 + + + +0 +366.000000,2.000000,0.000000 + + + +0 +183.500015,2.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_main.h b/Minecraft.Client/Common/Media/xuiscene_main.h new file mode 100644 index 00000000..b43ec0a1 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_main.h @@ -0,0 +1,26 @@ +#define IDC_XuiButton1 L"XuiButton1" +#define IDC_XuiButton2 L"XuiButton2" +#define IDC_XuiButton3 L"XuiButton3" +#define IDC_XuiButton4 L"XuiButton4" +#define IDC_XuiButton5 L"XuiButton5" +#define IDC_XuiButton6 L"XuiButton6" +#define IDC_XuiSplash L"XuiSplash" +#define IDC_XuiSplashMCFont L"XuiSplashMCFont" +#define IDC_Timer_Square_1 L"Timer_Square_1" +#define IDC_Timer_Square_2 L"Timer_Square_2" +#define IDC_Timer_Square_3 L"Timer_Square_3" +#define IDC_Timer_Square_4 L"Timer_Square_4" +#define IDC_Timer_Square_5 L"Timer_Square_5" +#define IDC_Timer_Square_6 L"Timer_Square_6" +#define IDC_Timer_Square_7 L"Timer_Square_7" +#define IDC_Timer_Square_8 L"Timer_Square_8" +#define IDC_Timer_Square_9 L"Timer_Square_9" +#define IDC_Timer_Square_10 L"Timer_Square_10" +#define IDC_Timer_Square_11 L"Timer_Square_11" +#define IDC_Timer_Square_12 L"Timer_Square_12" +#define IDC_Timer_Square_13 L"Timer_Square_13" +#define IDC_Timer_Square_14 L"Timer_Square_14" +#define IDC_Timer_Square_15 L"Timer_Square_15" +#define IDC_Timer_Square_16 L"Timer_Square_16" +#define IDC_Timer L"Timer" +#define IDC_SceneMain L"SceneMain" diff --git a/Minecraft.Client/Common/Media/xuiscene_main.xui b/Minecraft.Client/Common/Media/xuiscene_main.xui new file mode 100644 index 00000000..46a623ee --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_main.xui @@ -0,0 +1,956 @@ + + +1280.000000 +720.000000 + + + +SceneMain +1280.000000 +720.000000 +CScene_Main +XuiMenuScene +XuiButton1 + + + +XuiButton1 +450.000000 +40.000000 +415.000000,250.000000,0.000000 +XuiMainMenuButton_L +XuiButton6 +XuiButton2 + + + + +XuiButton2 +450.000000 +40.000000 +415.000000,299.999969,0.000000 +XuiMainMenuButton_L +XuiButton1 +XuiButton3 + + + + +XuiButton3 +450.000000 +40.000000 +415.000000,349.999939,0.000000 +XuiMainMenuButton_L +XuiButton2 +XuiButton4 + + + + +XuiButton4 +450.000000 +40.000000 +415.000000,399.999939,0.000000 +XuiMainMenuButton_L +XuiButton3 +XuiButton5 + + + + +XuiButton5 +450.000000 +40.000000 +415.000000,449.999939,0.000000 +XuiMainMenuButton_L +XuiButton4 +XuiButton6 + + + + +XuiButton6 +450.000000 +40.000000 +415.000000,500.000000,0.000000 +XuiMainMenuButton_L +XuiButton5 +XuiButton1 + + + + +XuiSplash +500.000000 +50.000000 +605.000061,210.000000,0.000000 +0.000000,0.000000,-0.173648,0.984808 +TitleString + + + + +XuiSplashMCFont +500.000000 +50.000000 +612.000061,126.000000,0.000000 +CXuiCtrlSplashPulser +XuiLabel + + + + +Timer +182.000000 +168.000000 +549.000000,312.000000,0.000000 +XuiBlankScene + + + +Timer_Square_1 +42.000000 +42.000000 +14.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_2 +42.000000 +42.000000 +68.499985,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_3 +42.000000 +42.000000 +123.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_4 +42.000000 +42.000000 +123.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_5 +42.000000 +42.000000 +123.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_6 +42.000000 +42.000000 +68.499985,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_7 +42.000000 +42.000000 +14.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_8 +42.000000 +42.000000 +14.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_9 +42.000000 +42.000000 +14.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_10 +42.000000 +42.000000 +68.499985,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_11 +42.000000 +42.000000 +123.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_12 +42.000000 +42.000000 +123.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_13 +42.000000 +42.000000 +123.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_14 +42.000000 +42.000000 +68.499985,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_15 +42.000000 +42.000000 +14.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_16 +42.000000 +42.000000 +14.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + + +LoadStart + + + +LoopStart + + + +LoopEnd + +gotoandplay +LoopStart + + + +Timer_Square_1 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_3 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_8 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_4 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_7 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_6 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_5 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_2 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_9 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_10 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_11 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_12 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_13 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_14 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x07ebebeb + + + +Timer_Square_15 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x49ebebeb + + + +Timer_Square_16 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x8cebebeb + + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_main_480.h b/Minecraft.Client/Common/Media/xuiscene_main_480.h new file mode 100644 index 00000000..b43ec0a1 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_main_480.h @@ -0,0 +1,26 @@ +#define IDC_XuiButton1 L"XuiButton1" +#define IDC_XuiButton2 L"XuiButton2" +#define IDC_XuiButton3 L"XuiButton3" +#define IDC_XuiButton4 L"XuiButton4" +#define IDC_XuiButton5 L"XuiButton5" +#define IDC_XuiButton6 L"XuiButton6" +#define IDC_XuiSplash L"XuiSplash" +#define IDC_XuiSplashMCFont L"XuiSplashMCFont" +#define IDC_Timer_Square_1 L"Timer_Square_1" +#define IDC_Timer_Square_2 L"Timer_Square_2" +#define IDC_Timer_Square_3 L"Timer_Square_3" +#define IDC_Timer_Square_4 L"Timer_Square_4" +#define IDC_Timer_Square_5 L"Timer_Square_5" +#define IDC_Timer_Square_6 L"Timer_Square_6" +#define IDC_Timer_Square_7 L"Timer_Square_7" +#define IDC_Timer_Square_8 L"Timer_Square_8" +#define IDC_Timer_Square_9 L"Timer_Square_9" +#define IDC_Timer_Square_10 L"Timer_Square_10" +#define IDC_Timer_Square_11 L"Timer_Square_11" +#define IDC_Timer_Square_12 L"Timer_Square_12" +#define IDC_Timer_Square_13 L"Timer_Square_13" +#define IDC_Timer_Square_14 L"Timer_Square_14" +#define IDC_Timer_Square_15 L"Timer_Square_15" +#define IDC_Timer_Square_16 L"Timer_Square_16" +#define IDC_Timer L"Timer" +#define IDC_SceneMain L"SceneMain" diff --git a/Minecraft.Client/Common/Media/xuiscene_main_480.xui b/Minecraft.Client/Common/Media/xuiscene_main_480.xui new file mode 100644 index 00000000..29565a32 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_main_480.xui @@ -0,0 +1,956 @@ + + +640.000000 +480.000000 + + + +SceneMain +640.000000 +480.000000 +CScene_Main +XuiMenuScene +XuiButton1 + + + +XuiButton1 +300.000000 +36.000000 +170.000031,140.000000,0.000000 +XuiMainMenuButton_L_Thin +XuiButton6 +XuiButton2 + + + + +XuiButton2 +300.000000 +36.000000 +170.000031,179.999969,0.000000 +XuiMainMenuButton_L_Thin +XuiButton1 +XuiButton3 + + + + +XuiButton3 +300.000000 +36.000000 +170.000031,219.999939,0.000000 +XuiMainMenuButton_L_Thin +XuiButton2 +XuiButton4 + + + + +XuiButton4 +300.000000 +36.000000 +170.000031,259.999939,0.000000 +XuiMainMenuButton_L_Thin +XuiButton3 +XuiButton5 + + + + +XuiButton5 +300.000000 +36.000000 +170.000031,299.999939,0.000000 +XuiMainMenuButton_L_Thin +XuiButton4 +XuiButton6 + + + + +XuiButton6 +300.000000 +36.000000 +170.000031,340.000000,0.000000 +XuiMainMenuButton_L_Thin +XuiButton5 +XuiButton1 + + + + +XuiSplash +250.000000 +25.000000 +331.000061,110.000000,0.000000 +0.000000,0.000000,-0.113203,0.993572 +TitleStringSmall + + + + +XuiSplashMCFont +250.000000 +25.000000 +331.000061,74.000000,0.000000 +CXuiCtrlSplashPulser + + + + +Timer +184.000000 +170.000000 +274.000000,216.000000,0.000000 +0.500000,0.500000,1.000000 +XuiBlankScene + + + +Timer_Square_1 +42.000000 +42.000000 +14.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_2 +42.000000 +42.000000 +68.499985,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_3 +42.000000 +42.000000 +123.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_4 +42.000000 +42.000000 +123.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_5 +42.000000 +42.000000 +123.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_6 +42.000000 +42.000000 +68.499985,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_7 +42.000000 +42.000000 +14.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_8 +42.000000 +42.000000 +14.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_9 +42.000000 +42.000000 +14.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_10 +42.000000 +42.000000 +68.499985,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_11 +42.000000 +42.000000 +123.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_12 +42.000000 +42.000000 +123.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_13 +42.000000 +42.000000 +123.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_14 +42.000000 +42.000000 +68.499985,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_15 +42.000000 +42.000000 +14.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_16 +42.000000 +42.000000 +14.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + + +LoadStart + + + +LoopStart + + + +LoopEnd + +gotoandplay +LoopStart + + + +Timer_Square_1 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_3 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_8 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_4 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_7 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_6 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_5 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_2 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_9 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_10 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_11 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_12 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_13 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_14 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x07ebebeb + + + +Timer_Square_15 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x49ebebeb + + + +Timer_Square_16 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x8cebebeb + + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_multi_create.h b/Minecraft.Client/Common/Media/xuiscene_multi_create.h new file mode 100644 index 00000000..56e7204d --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_multi_create.h @@ -0,0 +1,36 @@ +#define IDC_ComparisonPic L"ComparisonPic" +#define IDC_Icon L"Icon" +#define IDC_TexturePackName L"TexturePackName" +#define IDC_TexturePackDescription L"TexturePackDescription" +#define IDC_TexturePackDetails L"TexturePackDetails" +#define IDC_Background L"Background" +#define IDC_XuiNewWorld L"XuiNewWorld" +#define IDC_XuiMoreOptions L"XuiMoreOptions" +#define IDC_CheckboxOnline L"CheckboxOnline" +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderDifficulty L"XuiSliderDifficulty" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_TexturePacksList L"TexturePacksList" +#define IDC_XuiGameModeToggle L"XuiGameModeToggle" +#define IDC_XuiEditWorldName L"XuiEditWorldName" +#define IDC_XuiLabelWorldName L"XuiLabelWorldName" +#define IDC_MainScene L"MainScene" +#define IDC_MultiGameCreate L"MultiGameCreate" diff --git a/Minecraft.Client/Common/Media/xuiscene_multi_create.xui b/Minecraft.Client/Common/Media/xuiscene_multi_create.xui new file mode 100644 index 00000000..e96753ab --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_multi_create.xui @@ -0,0 +1,474 @@ + + +1280.000000 +720.000000 + + + +MultiGameCreate +810.000000 +532.000000 +235.000092,110.000000,0.000000 +CScene_MultiGameCreate +XuiBlankScene +MainScene\XuiEditWorldName + + + +TexturePackDetails +334.000000 +410.000000 +238.000046,64.000000,0.000000 +LeaderboardHeaderPanel + + + +ComparisonPic +292.000000 +160.000000 +26.000000,236.000000,0.000000 +CXuiCtrl4JIcon +XuiVisualImagePresenter + + + + +Icon +64.000000 +64.000000 +26.000000,14.000000,0.000000 +CXuiCtrl4JIcon +XuiVisualImagePresenter + + + + +TexturePackName +222.000000 +64.000000 +96.000000,14.000000,0.000000 +XuiLabelLight_FRONT_END_Shd_Wrp + + + + +TexturePackDescription +292.000000 +126.000000 +26.000000,86.000000,0.000000 +XuiHtmlControl + + + + + +MainScene +490.000000 +433.000000 +159.000000,49.000000,0.000000 + + + +Background +490.000000 +433.000000 +0.833344,0.000000,0.000000 +15 +XuiScene + + + + +XuiNewWorld +440.000000 +40.000000 +25.000015,369.000000,0.000000 +XuiMainMenuButton_L +XuiMoreOptions +22528 + + + + +XuiMoreOptions +440.000000 +40.000000 +25.000015,319.000000,0.000000 +XuiMainMenuButton_L +CheckboxOnline +XuiNewWorld +22528 + + + + +CheckboxOnline +402.000000 +34.000000 +25.000015,285.000000,0.000000 +XuiCheckbox +TexturePacksList +XuiMoreOptions + + + + +XuiSliderDifficulty +446.000000 +38.000000 +22.000017,144.000000,0.000000 +5 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiGameModeToggle +TexturePacksList +FocusSink + + + +XuiSlider +446.000000 +38.000000 +XuiSlider +3 + + + + +FocusSink +1.000000 +1.000000 + + + + + +TexturePacksList +428.000000 +96.000000 +32.000000,189.000000,0.000000 +CXuiCtrl4JList +XuiListTexturePack +XuiSliderDifficulty\XuiSlider +CheckboxOnline +true + + + +control_ListItem +400.000000 +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +10.000000,10.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +10.000000,10.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +34.000000,28.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +34.000000,28.000000,0.000000 +37 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +34.000000,30.000000,0.000000 +37 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +34.000000,30.000000,0.000000 +37 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +34.000000,30.000000,0.000000 +37 +false +XuiListTexturePackButton +1 + + + + +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,96.999992,0.000000 +XuiMainMenuButton_L +XuiEditWorldName +XuiSliderDifficulty\XuiSlider +22528 + + + + +XuiEditWorldName +434.000000 +32.000000 +28.000000,52.000000,0.000000 +CXuiCtrl4JEdit +XuiEdit +XuiGameModeToggle + + + + +XuiLabelWorldName +440.000000 +26.000008 +25.000000,24.000000,0.000000 +XuiLabelDark + + + + + + +Normal + +stop + + +SlideOut + + + +SlideOutEnd + +stop + + +SlideBack + + + +SlideBackEnd + +stop + + + +MainScene +Position + + +0 +159.000000,49.000000,0.000000 + + + +0 +159.000000,49.000000,0.000000 + + + +0 +0.000000,49.000000,0.000000 + + + +0 +0.000000,49.000000,0.000000 + + + +0 +159.000000,49.000000,0.000000 + + + +TexturePackDetails +Position + + +0 +238.000046,64.000000,0.000000 + + + +0 +287.000000,65.000000,0.000000 + + + +0 +477.000000,65.000000,0.000000 + + + +0 +477.000000,65.000000,0.000000 + + + +0 +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 new file mode 100644 index 00000000..760e559e --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_multi_create_480.h @@ -0,0 +1,39 @@ +#define IDC_ComparisonPic L"ComparisonPic" +#define IDC_TexturePackDescription L"TexturePackDescription" +#define IDC_TexturePackName L"TexturePackName" +#define IDC_Icon L"Icon" +#define IDC_TexturePackDetails L"TexturePackDetails" +#define IDC_Background L"Background" +#define IDC_XuiNewWorld L"XuiNewWorld" +#define IDC_XuiMoreOptions L"XuiMoreOptions" +#define IDC_CheckboxOnline L"CheckboxOnline" +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderDifficulty L"XuiSliderDifficulty" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_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_XuiEditWorldName L"XuiEditWorldName" +#define IDC_XuiLabelWorldName L"XuiLabelWorldName" +#define IDC_MainScene L"MainScene" +#define IDC_MultiGameCreate L"MultiGameCreate" diff --git a/Minecraft.Client/Common/Media/xuiscene_multi_create_480.xui b/Minecraft.Client/Common/Media/xuiscene_multi_create_480.xui new file mode 100644 index 00000000..ccf74533 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_multi_create_480.xui @@ -0,0 +1,514 @@ + + +640.000000 +480.000000 + + + +MultiGameCreate +557.000000 +410.000000 +41.500046,20.000023,0.000000 +CScene_MultiGameCreate +XuiBlankScene +MainScene\XuiEditWorldName + + + +TexturePackDetails +230.000000 +334.000000 +163.500046,40.000000,0.000000 +LeaderboardHeaderPanel + + + +ComparisonPic +196.000000 +112.000000 +20.000000,212.000000,0.000000 +CXuiCtrl4JIcon +XuiVisualImagePresenter + + + + +TexturePackDescription +196.000000 +80.000000 +20.000000,122.000000,0.000000 +XuiHtmlControl + + + + +TexturePackName +196.000000 +43.000000 +20.000000,74.000008,0.000000 +XuiLabelLight_FRONT_END_Shd_Wrp_Small + + + + +Icon +64.000000 +64.000000 +88.000000,6.000000,0.000000 +CXuiCtrl4JIcon +XuiVisualImagePresenter + + + + + +MainScene +340.000000 +355.000000 +108.500015,27.500019,0.000000 + + + +Background +340.000000 +353.000000 +15 +XuiScene + + + + +XuiNewWorld +304.000000 +36.000000 +18.000000,292.000000,0.000000 +XuiMainMenuButton_L_Thin +XuiMoreOptions +22528 + + + + +XuiMoreOptions +304.000000 +36.000000 +18.000000,250.000000,0.000000 +XuiMainMenuButton_L_Thin +CheckboxOnline +XuiNewWorld +22528 + + + + +CheckboxOnline +304.000000 +26.000000 +18.000000,228.000000,0.000000 +XuiCheckboxSmall +TexturePacksList +XuiMoreOptions + + + + +XuiSliderDifficulty +310.000000 +38.000000 +15.000000,112.000000,0.000000 +5 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiGameModeToggle +TexturePacksList +FocusSink + + + +XuiSlider +310.000000 +38.000000 +XuiSlider +3 + + + + +FocusSink +1.000000 +1.000000 + + + + + +TexturePacksList +304.000000 +74.000000 +18.000000,150.000000,0.000000 +CXuiCtrl4JList +XuiListTexturePackSmall +XuiSliderDifficulty\XuiSlider +CheckboxOnline +true + + + +control_ListItem +400.000000 +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +10.000000,10.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +10.000000,10.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +40.000000 +40.000000 +10.000000,10.000000,0.000000 +false +XuiListTexturePackButtonSmall +1 + + + + +control_ListItem +40.000000 +40.000000 +10.000000,10.000000,0.000000 +false +XuiListTexturePackButtonSmall +1 + + + + +control_ListItem +40.000000 +40.000000 +35.000000,22.000000,0.000000 +5 +false +XuiListTexturePackButtonSmall +1 + + + + +control_ListItem +40.000000 +40.000000 +35.000000,24.000000,0.000000 +37 +false +XuiListTexturePackButtonSmall +1 + + + + +control_ListItem +40.000000 +40.000000 +35.000000,24.000000,0.000000 +37 +false +XuiListTexturePackButtonSmall +1 + + + + +control_ListItem +40.000000 +40.000000 +35.000000,24.000000,0.000000 +37 +false +XuiListTexturePackButtonSmall +1 + + + + +control_ListItem +40.000000 +40.000000 +35.000000,24.000000,0.000000 +37 +false +XuiListTexturePackButtonSmall +1 + + + + +control_ListItem +40.000000 +40.000000 +35.000000,24.000000,0.000000 +37 +false +XuiListTexturePackButtonSmall +1 + + + + +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,70.000000,0.000000 +XuiMainMenuButton_L_Thin +XuiEditWorldName +XuiSliderDifficulty\XuiSlider +22528 + + + + +XuiEditWorldName +298.000000 +21.000000,32.000000,0.000000 +CXuiCtrl4JEdit +XuiEdit +XuiGameModeToggle + + + + +XuiLabelWorldName +303.444427 +28.000000 +18.000000,14.000000,0.000000 +XuiLabelDarkLeftWrapSmall10 + + + + + + +Normal + +stop + + +SlideOut + + + +SlideOutEnd + +stop + + +SlideBack + + + +SlideBackEnd + +stop + + + +MainScene +Position + + +0 +108.500015,27.500019,0.000000 + + + +0 +108.500015,27.500019,0.000000 + + + +0 +0.000000,27.500019,0.000000 + + + +0 +0.000000,27.500019,0.000000 + + + +0 +108.500015,27.500019,0.000000 + + + +TexturePackDetails +Position + + +0 +163.500046,40.000000,0.000000 + + + +0 +163.500046,40.000000,0.000000 + + + +0 +327.000000,40.000000,0.000000 + + + +0 +327.000000,40.000000,0.000000 + + + +0 +163.500046,40.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_multi_gameinfo.h b/Minecraft.Client/Common/Media/xuiscene_multi_gameinfo.h new file mode 100644 index 00000000..0a2a509d --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_multi_gameinfo.h @@ -0,0 +1,29 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_GamePlayers L"GamePlayers" +#define IDC_JoinGame L"JoinGame" +#define IDC_LabelDifficulty L"LabelDifficulty" +#define IDC_Difficulty L"Difficulty" +#define IDC_LabelGameType L"LabelGameType" +#define IDC_GameType L"GameType" +#define IDC_LabelGamertagsOn L"LabelGamertagsOn" +#define IDC_GamertagsOn L"GamertagsOn" +#define IDC_LabelStructuresOn L"LabelStructuresOn" +#define IDC_StructuresOn L"StructuresOn" +#define IDC_LabelLevelType L"LabelLevelType" +#define IDC_LevelType L"LevelType" +#define IDC_LabelPvP L"LabelPvP" +#define IDC_PvP L"PvP" +#define IDC_LabelTrust L"LabelTrust" +#define IDC_Trust L"Trust" +#define IDC_LabelTNTOn L"LabelTNTOn" +#define IDC_TNTOn L"TNTOn" +#define IDC_LabelFireOn L"LabelFireOn" +#define IDC_FireOn L"FireOn" +#define IDC_GameSettings L"GameSettings" +#define IDC_MultiGameInfo L"MultiGameInfo" diff --git a/Minecraft.Client/Common/Media/xuiscene_multi_gameinfo.xui b/Minecraft.Client/Common/Media/xuiscene_multi_gameinfo.xui new file mode 100644 index 00000000..d903d749 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_multi_gameinfo.xui @@ -0,0 +1,285 @@ + + +1280.000000 +720.000000 + + + +MultiGameInfo +1280.000000 +720.000000 +CScene_MultiGameInfo +XuiBlankScene +JoinGame + + + +GamePlayers +450.000000 +342.000000 +228.000046,250.000000,0.000000 +XuiPlayerList_NoIcon +JoinGame + + + +control_ListItem +469.000000 +86.000000 +16.000000,32.000000,0.000000 +5 +false +XuiButton + + + + +control_ListItem +400.000000 +60.000000 +20.000000,46.000000,0.000000 +5 +false +XuiListButton_L_NoIcon + + + + +control_ListItem +400.000000 +60.000000 +20.000000,46.000000,0.000000 +5 +false +XuiListButton_L_NoIcon + + + + +control_ListItem +400.000000 +60.000000 +20.000000,46.000000,0.000000 +5 +false +XuiListButton_L_NoIcon + + + + +control_ListItem +400.000000 +60.000000 +20.000000,46.000000,0.000000 +5 +false +XuiListButton_L_NoIcon + + + + +control_ListItem +400.000000 +60.000000 +20.000000,46.000000,0.000000 +5 +false +XuiListButton_L_NoIcon + + + + +control_ListItem +400.000000 +60.000000 +20.000000,46.000000,0.000000 +5 +false +XuiListButton_L_NoIcon + + + + + +JoinGame +450.000000 +40.000000 +414.000000,200.000000,0.000000 +XuiMainMenuButton_L +GamePlayers +22528 + + + + +GameSettings +364.000000 +342.000000 +688.000061,250.000000,0.000000 +GraphicPanel + + + +LabelDifficulty +326.000000 +32.000000 +20.000000,12.000000,0.000000 +XuiLabelDark + + + + +Difficulty +326.000000 +32.000000 +20.000000,12.000000,0.000000 +XuiLabelDarkRight + + + + +LabelGameType +326.000000 +32.000000 +20.000000,44.000000,0.000000 +XuiLabelDark + + + + +GameType +326.000000 +32.000000 +20.000000,44.000000,0.000000 +XuiLabelDarkRight + + + + +LabelGamertagsOn +326.000000 +32.000000 +20.000000,76.000000,0.000000 +XuiLabelDark + + + + +GamertagsOn +326.000000 +32.000000 +20.000000,76.000000,0.000000 +XuiLabelDarkRight + + + + +LabelStructuresOn +326.000000 +32.000000 +20.000000,108.000000,0.000000 +XuiLabelDark + + + + +StructuresOn +326.000000 +32.000000 +20.000000,108.000000,0.000000 +XuiLabelDarkRight + + + + +LabelLevelType +326.000000 +32.000000 +20.000000,140.000000,0.000000 +XuiLabelDark + + + + +LevelType +326.000000 +32.000000 +20.000000,140.000000,0.000000 +XuiLabelDarkRight + + + + +LabelPvP +326.000000 +32.000000 +20.000000,172.000000,0.000000 +XuiLabelDarkLeftWrap16 + + + + +PvP +326.000000 +32.000000 +20.000000,172.000000,0.000000 +XuiLabelDarkRight + + + + +LabelTrust +326.000000 +32.000000 +20.000000,204.000000,0.000000 +XuiLabelDarkLeftWrap16 + + + + +Trust +326.000000 +32.000000 +20.000000,204.000000,0.000000 +XuiLabelDarkRight + + + + +LabelTNTOn +326.000000 +32.000000 +20.000000,236.000000,0.000000 +XuiLabelDarkLeftWrap16 + + + + +TNTOn +326.000000 +32.000000 +20.000000,236.000000,0.000000 +XuiLabelDarkRight + + + + +LabelFireOn +326.000000 +32.000000 +20.000000,268.000000,0.000000 +XuiLabelDarkLeftWrap16 + + + + +FireOn +326.000000 +32.000000 +20.000000,268.000000,0.000000 +XuiLabelDarkRight + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_multi_gameinfo_480.h b/Minecraft.Client/Common/Media/xuiscene_multi_gameinfo_480.h new file mode 100644 index 00000000..32758c5f --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_multi_gameinfo_480.h @@ -0,0 +1,28 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_GamePlayers L"GamePlayers" +#define IDC_JoinGame L"JoinGame" +#define IDC_LabelDifficulty L"LabelDifficulty" +#define IDC_Difficulty L"Difficulty" +#define IDC_LabelGameType L"LabelGameType" +#define IDC_GameType L"GameType" +#define IDC_LabelGamertagsOn L"LabelGamertagsOn" +#define IDC_GamertagsOn L"GamertagsOn" +#define IDC_LabelStructuresOn L"LabelStructuresOn" +#define IDC_StructuresOn L"StructuresOn" +#define IDC_LabelLevelType L"LabelLevelType" +#define IDC_LevelType L"LevelType" +#define IDC_LabelPvP L"LabelPvP" +#define IDC_PvP L"PvP" +#define IDC_LabelTrust L"LabelTrust" +#define IDC_Trust L"Trust" +#define IDC_LabelTNTOn L"LabelTNTOn" +#define IDC_TNTOn L"TNTOn" +#define IDC_LabelFireOn L"LabelFireOn" +#define IDC_FireOn L"FireOn" +#define IDC_GameSettings L"GameSettings" +#define IDC_MultiGameInfo L"MultiGameInfo" diff --git a/Minecraft.Client/Common/Media/xuiscene_multi_gameinfo_480.xui b/Minecraft.Client/Common/Media/xuiscene_multi_gameinfo_480.xui new file mode 100644 index 00000000..86edfc0f --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_multi_gameinfo_480.xui @@ -0,0 +1,292 @@ + + +640.000000 +480.000000 + + + +MultiGameInfo +640.000000 +480.000000 +CScene_MultiGameInfo +XuiBlankScene +JoinGame + + + +GamePlayers +300.000000 +240.000000 +44.000004,180.000046,0.000000 +XuiPlayerListSmall_NoIcon +JoinGame + + + +control_ListItem +469.000000 +86.000000 +16.000000,32.000000,0.000000 +5 +false +XuiButton + + + + +control_ListItem +400.000000 +40.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_LThin_NoIcon + + + + +control_ListItem +400.000000 +40.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_LThin_NoIcon + + + + +control_ListItem +400.000000 +40.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_LThin_NoIcon + + + + +control_ListItem +400.000000 +40.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_LThin_NoIcon + + + + +control_ListItem +400.000000 +40.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_LThin_NoIcon + + + + + +JoinGame +300.000000 +36.000000 +170.000015,140.000046,0.000000 +XuiMainMenuButton_L_Thin +GamePlayers +22528 + + + + +GameSettings +245.000000 +240.000000 +351.000061,180.000000,0.000000 +GraphicPanel + + + +LabelDifficulty +207.000000 +22.000000 +20.000000,12.000000,0.000000 +5 +XuiLabelDarkLeftWrapSmall + + + + +Difficulty +207.000000 +22.000000 +20.000000,12.000000,0.000000 +5 +XuiLabelDarkSmallRight + + + + +LabelGameType +207.000000 +22.000000 +20.000000,34.000000,0.000000 +5 +XuiLabelDarkLeftWrapSmall + + + + +GameType +207.000000 +22.000000 +20.000000,34.000000,0.000000 +5 +XuiLabelDarkSmallRight + + + + +LabelGamertagsOn +207.000000 +22.000000 +20.000000,56.000000,0.000000 +5 +XuiLabelDarkLeftWrapSmall + + + + +GamertagsOn +207.000000 +22.000000 +20.000000,56.000000,0.000000 +5 +XuiLabelDarkSmallRight + + + + +LabelStructuresOn +207.000000 +22.000000 +20.000000,78.000000,0.000000 +5 +XuiLabelDarkLeftWrapSmall + + + + +StructuresOn +207.000000 +22.000000 +20.000000,78.000000,0.000000 +5 +XuiLabelDarkSmallRight + + + + +LabelLevelType +207.000000 +22.000000 +20.000000,100.000000,0.000000 +5 +XuiLabelDarkLeftWrapSmall + + + + +LevelType +207.000000 +22.000000 +20.000000,100.000000,0.000000 +5 +XuiLabelDarkSmallRight + + + + +LabelPvP +207.000000 +22.000000 +20.000000,122.000000,0.000000 +5 +XuiLabelDarkLeftWrapSmall + + + + +PvP +207.000000 +22.000000 +20.000000,122.000000,0.000000 +5 +XuiLabelDarkSmallRight + + + + +LabelTrust +207.000000 +22.000000 +20.000000,144.000000,0.000000 +5 +XuiLabelDarkLeftWrapSmall + + + + +Trust +207.000000 +22.000000 +20.000000,144.000000,0.000000 +5 +XuiLabelDarkSmallRight + + + + +LabelTNTOn +207.000000 +22.000000 +20.000000,166.000000,0.000000 +5 +XuiLabelDarkLeftWrapSmall + + + + +TNTOn +207.000000 +22.000000 +20.000000,166.000000,0.000000 +5 +XuiLabelDarkSmallRight + + + + +LabelFireOn +207.000000 +22.000000 +20.000000,188.000000,0.000000 +5 +XuiLabelDarkLeftWrapSmall + + + + +FireOn +207.000000 +22.000000 +20.000000,188.000000,0.000000 +5 +XuiLabelDarkSmallRight + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_multi_joinload.h b/Minecraft.Client/Common/Media/xuiscene_multi_joinload.h new file mode 100644 index 00000000..a7f3d753 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_multi_joinload.h @@ -0,0 +1,46 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_GamesList L"GamesList" +#define IDC_Timer_Square_1 L"Timer_Square_1" +#define IDC_Timer_Square_2 L"Timer_Square_2" +#define IDC_Timer_Square_3 L"Timer_Square_3" +#define IDC_Timer_Square_4 L"Timer_Square_4" +#define IDC_Timer_Square_5 L"Timer_Square_5" +#define IDC_Timer_Square_6 L"Timer_Square_6" +#define IDC_Timer_Square_7 L"Timer_Square_7" +#define IDC_Timer_Square_8 L"Timer_Square_8" +#define IDC_Timer_Square_9 L"Timer_Square_9" +#define IDC_Timer_Square_10 L"Timer_Square_10" +#define IDC_Timer_Square_11 L"Timer_Square_11" +#define IDC_Timer_Square_12 L"Timer_Square_12" +#define IDC_Timer_Square_13 L"Timer_Square_13" +#define IDC_Timer_Square_14 L"Timer_Square_14" +#define IDC_Timer_Square_15 L"Timer_Square_15" +#define IDC_Timer_Square_16 L"Timer_Square_16" +#define IDC_Timer L"Timer" +#define IDC_LabelNoGames L"LabelNoGames" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_SavesList L"SavesList" +#define IDC_Timer_Square_1 L"Timer_Square_1" +#define IDC_Timer_Square_2 L"Timer_Square_2" +#define IDC_Timer_Square_3 L"Timer_Square_3" +#define IDC_Timer_Square_4 L"Timer_Square_4" +#define IDC_Timer_Square_5 L"Timer_Square_5" +#define IDC_Timer_Square_6 L"Timer_Square_6" +#define IDC_Timer_Square_7 L"Timer_Square_7" +#define IDC_Timer_Square_8 L"Timer_Square_8" +#define IDC_Timer_Square_9 L"Timer_Square_9" +#define IDC_Timer_Square_10 L"Timer_Square_10" +#define IDC_Timer_Square_11 L"Timer_Square_11" +#define IDC_Timer_Square_12 L"Timer_Square_12" +#define IDC_Timer_Square_13 L"Timer_Square_13" +#define IDC_Timer_Square_14 L"Timer_Square_14" +#define IDC_Timer_Square_15 L"Timer_Square_15" +#define IDC_Timer_Square_16 L"Timer_Square_16" +#define IDC_SavesTimer L"SavesTimer" +#define IDC_MultiGameJoinLoad L"MultiGameJoinLoad" diff --git a/Minecraft.Client/Common/Media/xuiscene_multi_joinload.xui b/Minecraft.Client/Common/Media/xuiscene_multi_joinload.xui new file mode 100644 index 00000000..cc34f0ca --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_multi_joinload.xui @@ -0,0 +1,1851 @@ + + +1280.000000 +720.000000 + + + +MultiGameJoinLoad +1040.000000 +426.000000 +120.000000,206.000000,0.000000 +CScene_MultiGameJoinLoad +XuiScene +SavesList + + + +GamesList +500.000000 +386.000000 +524.000000,22.000008,0.000000 +CXuiCtrl4JList +XuiListRecessed +SavesList +SavesList + + + +control_ListItem +469.000000 +86.000000 +16.000000,32.000000,0.000000 +5 +false +XuiButton + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_L_NoIcon + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + + +Timer +184.000000 +170.000000 +682.000000,170.000000,0.000000 +XuiBlankScene + + + +Timer_Square_1 +42.000000 +42.000000 +14.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_2 +42.000000 +42.000000 +68.499985,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_3 +42.000000 +42.000000 +123.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_4 +42.000000 +42.000000 +123.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_5 +42.000000 +42.000000 +123.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_6 +42.000000 +42.000000 +68.499985,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_7 +42.000000 +42.000000 +14.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_8 +42.000000 +42.000000 +14.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_9 +42.000000 +42.000000 +14.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_10 +42.000000 +42.000000 +68.499985,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_11 +42.000000 +42.000000 +123.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_12 +42.000000 +42.000000 +123.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_13 +42.000000 +42.000000 +123.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_14 +42.000000 +42.000000 +68.499985,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_15 +42.000000 +42.000000 +14.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_16 +42.000000 +42.000000 +14.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + + +LoadStart + + + +LoopStart + + + +LoopEnd + +gotoandplay +LoopStart + + + +Timer_Square_1 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_3 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_8 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_4 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_7 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_6 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_5 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_2 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_9 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_10 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_11 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_12 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_13 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_14 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x07ebebeb + + + +Timer_Square_15 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x49ebebeb + + + +Timer_Square_16 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x8cebebeb + + + + + + +LabelNoGames +342.000000 +56.000000 +580.000000,210.000000,0.000000 +false +XuiLabelDarkCentred + + + + +SavesList +500.000000 +386.000000 +18.000000,22.000008,0.000000 +CXuiCtrl4JList +XuiListRecessed +GamesList +GamesList + + + +control_ListItem +400.000000 +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + + +SavesTimer +184.000000 +170.000000 +178.000000,170.000000,0.000000 +XuiBlankScene + + + +Timer_Square_1 +42.000000 +42.000000 +14.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_2 +42.000000 +42.000000 +68.499985,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_3 +42.000000 +42.000000 +123.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_4 +42.000000 +42.000000 +123.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_5 +42.000000 +42.000000 +123.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_6 +42.000000 +42.000000 +68.499985,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_7 +42.000000 +42.000000 +14.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_8 +42.000000 +42.000000 +14.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_9 +42.000000 +42.000000 +14.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_10 +42.000000 +42.000000 +68.499985,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_11 +42.000000 +42.000000 +123.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_12 +42.000000 +42.000000 +123.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_13 +42.000000 +42.000000 +123.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_14 +42.000000 +42.000000 +68.499985,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_15 +42.000000 +42.000000 +14.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_16 +42.000000 +42.000000 +14.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + + +LoadStart + + + +LoopStart + + + +LoopEnd + +gotoandplay +LoopStart + + + +Timer_Square_1 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_3 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_8 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_4 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_7 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_6 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_5 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_2 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_9 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_10 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_11 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_12 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_13 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_14 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x07ebebeb + + + +Timer_Square_15 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x49ebebeb + + + +Timer_Square_16 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x8cebebeb + + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_multi_joinload_480.h b/Minecraft.Client/Common/Media/xuiscene_multi_joinload_480.h new file mode 100644 index 00000000..e8d14c9d --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_multi_joinload_480.h @@ -0,0 +1,52 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_GamesList L"GamesList" +#define IDC_Timer_Square_1 L"Timer_Square_1" +#define IDC_Timer_Square_2 L"Timer_Square_2" +#define IDC_Timer_Square_3 L"Timer_Square_3" +#define IDC_Timer_Square_4 L"Timer_Square_4" +#define IDC_Timer_Square_5 L"Timer_Square_5" +#define IDC_Timer_Square_6 L"Timer_Square_6" +#define IDC_Timer_Square_7 L"Timer_Square_7" +#define IDC_Timer_Square_8 L"Timer_Square_8" +#define IDC_Timer_Square_9 L"Timer_Square_9" +#define IDC_Timer_Square_10 L"Timer_Square_10" +#define IDC_Timer_Square_11 L"Timer_Square_11" +#define IDC_Timer_Square_12 L"Timer_Square_12" +#define IDC_Timer_Square_13 L"Timer_Square_13" +#define IDC_Timer_Square_14 L"Timer_Square_14" +#define IDC_Timer_Square_15 L"Timer_Square_15" +#define IDC_Timer_Square_16 L"Timer_Square_16" +#define IDC_Timer L"Timer" +#define IDC_LabelNoGames L"LabelNoGames" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_SavesList L"SavesList" +#define IDC_Timer_Square_1 L"Timer_Square_1" +#define IDC_Timer_Square_2 L"Timer_Square_2" +#define IDC_Timer_Square_3 L"Timer_Square_3" +#define IDC_Timer_Square_4 L"Timer_Square_4" +#define IDC_Timer_Square_5 L"Timer_Square_5" +#define IDC_Timer_Square_6 L"Timer_Square_6" +#define IDC_Timer_Square_7 L"Timer_Square_7" +#define IDC_Timer_Square_8 L"Timer_Square_8" +#define IDC_Timer_Square_9 L"Timer_Square_9" +#define IDC_Timer_Square_10 L"Timer_Square_10" +#define IDC_Timer_Square_11 L"Timer_Square_11" +#define IDC_Timer_Square_12 L"Timer_Square_12" +#define IDC_Timer_Square_13 L"Timer_Square_13" +#define IDC_Timer_Square_14 L"Timer_Square_14" +#define IDC_Timer_Square_15 L"Timer_Square_15" +#define IDC_Timer_Square_16 L"Timer_Square_16" +#define IDC_SavesTimer L"SavesTimer" +#define IDC_MultiGameJoinLoad L"MultiGameJoinLoad" diff --git a/Minecraft.Client/Common/Media/xuiscene_multi_joinload_480.xui b/Minecraft.Client/Common/Media/xuiscene_multi_joinload_480.xui new file mode 100644 index 00000000..10f0f93d --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_multi_joinload_480.xui @@ -0,0 +1,1917 @@ + + +640.000000 +480.000000 + + + +MultiGameJoinLoad +596.000000 +290.000000 +24.000000,124.000000,0.000000 +CScene_MultiGameJoinLoad +XuiScene +SavesList + + + +GamesList +320.000000 +266.000000 +262.000000,14.000000,0.000000 +CXuiCtrl4JList +XuiListRecessedThin +SavesList +SavesList + + + +control_ListItem +469.000000 +86.000000 +16.000000,32.000000,0.000000 +5 +false +XuiButton + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_LThin_NoIcon + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_LThin_NoIcon + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_LThin_NoIcon + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_LThin_NoIcon + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + + +Timer +72.000000 +72.000000 +388.000000,112.000000,0.000000 +15 +XuiBlankScene + + + +Timer_Square_1 +21.000000 +21.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_2 +21.000000 +21.000000 +25.000000,0.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_3 +21.000000 +21.000000 +50.000000,0.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_4 +21.000000 +21.000000 +50.000000,25.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_5 +21.000000 +21.000000 +50.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_6 +21.000000 +21.000000 +25.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_7 +21.000000 +21.000000 +0.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_8 +21.000000 +21.000000 +0.000000,25.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_9 +21.000000 +21.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_10 +21.000000 +21.000000 +25.000000,0.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_11 +21.000000 +21.000000 +50.000000,0.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_12 +21.000000 +21.000000 +50.000000,25.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_13 +21.000000 +21.000000 +50.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_14 +21.000000 +21.000000 +25.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_15 +21.000000 +21.000000 +0.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_16 +21.000000 +21.000000 +0.000000,25.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + + +LoadStart + + + +LoopStart + + + +LoopEnd + +gotoandplay +LoopStart + + + +Timer_Square_1 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_3 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_8 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_4 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_7 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_6 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_5 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_2 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_9 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_10 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_11 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_12 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_13 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_14 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x07ebebeb + + + +Timer_Square_15 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x49ebebeb + + + +Timer_Square_16 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x8cebebeb + + + + + + +LabelNoGames +200.000000 +78.000000 +322.000000,136.000000,0.000000 +false +XuiLabelDarkCentredWrapSmall + + + + +SavesList +250.000000 +265.000000 +12.000000,14.000000,0.000000 +CXuiCtrl4JList +XuiListRecessedThin +GamesList +GamesList + + + +control_ListItem +400.000000 +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_LThin + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_LThin + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_LThin + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_LThin + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + + +SavesTimer +72.000000 +72.000000 +102.000000,112.000000,0.000000 +15 +XuiBlankScene + + + +Timer_Square_1 +21.000000 +21.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_2 +21.000000 +21.000000 +25.000000,0.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_3 +21.000000 +21.000000 +50.000000,0.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_4 +21.000000 +21.000000 +50.000000,25.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_5 +21.000000 +21.000000 +50.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_6 +21.000000 +21.000000 +25.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_7 +21.000000 +21.000000 +0.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_8 +21.000000 +21.000000 +0.000000,25.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_9 +21.000000 +21.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_10 +21.000000 +21.000000 +25.000000,0.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_11 +21.000000 +21.000000 +50.000000,0.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_12 +21.000000 +21.000000 +50.000000,25.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_13 +21.000000 +21.000000 +50.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_14 +21.000000 +21.000000 +25.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_15 +21.000000 +21.000000 +0.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_16 +21.000000 +21.000000 +0.000000,25.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + + +LoadStart + + + +LoopStart + + + +LoopEnd + +gotoandplay +LoopStart + + + +Timer_Square_1 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_3 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_8 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_4 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_7 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_6 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_5 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_2 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_9 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_10 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_11 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_12 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_13 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_14 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x07ebebeb + + + +Timer_Square_15 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x49ebebeb + + + +Timer_Square_16 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x8cebebeb + + + + + + + +Logo +640.000000 +70.000000 +0.000000,48.000000,0.000000 +true +MenuTitleLogo + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_multi_launch_more_options.h b/Minecraft.Client/Common/Media/xuiscene_multi_launch_more_options.h new file mode 100644 index 00000000..9a34c335 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_multi_launch_more_options.h @@ -0,0 +1,34 @@ +#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_CheckboxPVP L"CheckboxPVP" +#define IDC_CheckboxAllowFoF L"CheckboxAllowFoF" +#define IDC_CheckboxInviteOnly L"CheckboxInviteOnly" +#define IDC_CheckboxOnline L"CheckboxOnline" +#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.xui b/Minecraft.Client/Common/Media/xuiscene_multi_launch_more_options.xui new file mode 100644 index 00000000..25ee4a1d --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_multi_launch_more_options.xui @@ -0,0 +1,486 @@ + + +1280.000000 +720.000000 + + + +MultiGameLaunchMoreOptions +1280.000000 +720.000000 +CScene_MultiGameLaunchMoreOptions +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 + + + + +GameOptions +488.000000 +440.000000 +0.000013,0.000000,0.000000 +10 +XuiScene + + + +CheckboxNaturalRegeneration +402.000000 +34.000000 +24.000015,393.000000,0.000000 +2 +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 +CheckboxKeepInventory + + + + +CheckboxHostPrivileges +402.000000 +34.000000 +24.000015,154.166672,0.000000 +2 +XuiCheckbox +CheckboxPVP +CheckboxDayLightCycle + + + + +CheckboxPVP +402.000000 +34.000000 +24.000015,121.000008,0.000000 +2 +XuiCheckbox +CheckboxAllowFoF +CheckboxHostPrivileges + + + + +CheckboxAllowFoF +402.000000 +34.000000 +24.000015,87.000015,0.000000 +XuiCheckbox +CheckboxInviteOnly +CheckboxPVP + + + + +CheckboxInviteOnly +402.000000 +34.000000 +24.000015,53.000015,0.000000 +XuiCheckbox +CheckboxOnline +CheckboxAllowFoF + + + + +CheckboxOnline +402.000000 +34.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 + + + + +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 +24.000015,182.000000,0.000000 +XuiCheckbox +CheckboxFlatWorld +CheckboxResetNether + + + + +CheckboxFlatWorld +402.000000 +34.000000 +24.000015,148.000000,0.000000 +XuiCheckbox +CheckboxStructures +CheckboxBonusChest + + + + +CheckboxStructures +402.000000 +34.000000 +24.000015,114.000000,0.000000 +XuiCheckbox +XuiEditSeed +CheckboxFlatWorld + + + + +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 +24.000000,16.000000,0.000000 +XuiLabelDark + + + + + + +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 + + + + +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 new file mode 100644 index 00000000..9a34c335 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_multi_launch_more_options_480.h @@ -0,0 +1,34 @@ +#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_CheckboxPVP L"CheckboxPVP" +#define IDC_CheckboxAllowFoF L"CheckboxAllowFoF" +#define IDC_CheckboxInviteOnly L"CheckboxInviteOnly" +#define IDC_CheckboxOnline L"CheckboxOnline" +#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 new file mode 100644 index 00000000..20fec429 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_multi_launch_more_options_480.xui @@ -0,0 +1,481 @@ + + +640.000000 +480.000000 + + + +MultiGameLaunchMoreOptions +640.000000 +480.000000 +CScene_MultiGameLaunchMoreOptions +XuiBlankScene +WorldOptionsGroup\WorldOptions\XuiEditSeed + + + +OptionsTab_off +175.000000 +40.000000 +235.000000,44.000000,0.000000 +1 +Graphics\PanelsAndTabs\MoreOptionsTabOff_Small.png +48 + + + + +GameOptionsGroup +510.000000 +328.000000 +60.000000,76.000015,0.000000 +false +true + + + +GameOptionsDescription +182.000000 +312.000000 +347.000000,10.000000,0.000000 +10 +TipPanel + + + + +GameOptions +350.000000 +328.000000 +0.000015,0.000002,0.000000 +GraphicPanel + + + +CheckboxNaturalRegeneration +304.000000 +26.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 +CheckboxKeepInventory + + + + +CheckboxHostPrivileges +304.000000 +26.000000 +16.000000,116.999992,0.000000 +XuiCheckboxSmall +CheckboxPVP +CheckboxDayLightCycle + + + + +CheckboxPVP +304.000000 +26.000000 +16.000000,90.999992,0.000000 +XuiCheckboxSmall +CheckboxAllowFoF +CheckboxHostPrivileges + + + + +CheckboxAllowFoF +304.000000 +25.000000 +16.000000,66.000000,0.000000 +XuiCheckboxSmall +CheckboxInviteOnly +CheckboxPVP + + + + +CheckboxInviteOnly +304.000000 +26.000000 +16.000000,39.999992,0.000000 +XuiCheckboxSmall +CheckboxOnline +CheckboxAllowFoF + + + + +CheckboxOnline +304.000000 +26.000000 +16.000000,13.999992,0.000000 +XuiCheckboxSmall +CheckboxInviteOnly + + + + + + +WorldOptionsGroup +510.000000 +305.000000 +60.000000,76.000000,0.000000 +true + + + +WorldOptionsDescription +182.000000 +298.000000 +347.000000,10.000000,0.000000 +10 +TipPanel + + + + +WorldOptions +350.000000 +315.000000 +0.000015,0.000000,0.000000 +10 +GraphicPanel + + + +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_partnernetpassword.h b/Minecraft.Client/Common/Media/xuiscene_partnernetpassword.h new file mode 100644 index 00000000..1879db94 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_partnernetpassword.h @@ -0,0 +1,4 @@ +#define IDC_XuiEditPartnernetPassword L"XuiEditPartnernetPassword" +#define IDC_XuiLabel1 L"XuiLabel1" +#define IDC_XuiOK L"XuiOK" +#define IDC_PartnernetPassword L"PartnernetPassword" diff --git a/Minecraft.Client/Common/Media/xuiscene_partnernetpassword.xui b/Minecraft.Client/Common/Media/xuiscene_partnernetpassword.xui new file mode 100644 index 00000000..da9996e7 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_partnernetpassword.xui @@ -0,0 +1,50 @@ + + +1280.000000 +720.000000 + + + +PartnernetPassword +450.000000 +206.000000 +415.000031,210.000031,0.000000 +CScene_PartnernetPassword +XuiScene +XuiEditPartnernetPassword + + + +XuiEditPartnernetPassword +400.000000 +42.000000 +25.000019,54.250000,0.000000 +CXuiCtrl4JEdit +XuiEdit +XuiOK + + + + +XuiLabel1 +341.000000 +32.000008 +24.500015,19.250000,0.000000 +XuiLabelDark +Enter Partnernet Password + + + + +XuiOK +400.000000 +40.000000 +25.000046,140.750031,0.000000 +XuiMainMenuButton_L +XuiEditPartnernetPassword +OK +22528 + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_partnernetpassword_480.h b/Minecraft.Client/Common/Media/xuiscene_partnernetpassword_480.h new file mode 100644 index 00000000..1879db94 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_partnernetpassword_480.h @@ -0,0 +1,4 @@ +#define IDC_XuiEditPartnernetPassword L"XuiEditPartnernetPassword" +#define IDC_XuiLabel1 L"XuiLabel1" +#define IDC_XuiOK L"XuiOK" +#define IDC_PartnernetPassword L"PartnernetPassword" diff --git a/Minecraft.Client/Common/Media/xuiscene_partnernetpassword_480.xui b/Minecraft.Client/Common/Media/xuiscene_partnernetpassword_480.xui new file mode 100644 index 00000000..58f68b9c --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_partnernetpassword_480.xui @@ -0,0 +1,49 @@ + + +1280.000000 +720.000000 + + + +PartnernetPassword +340.000000 +160.000000 +470.000061,240.000000,0.000000 +CScene_PartnernetPassword +XuiScene +XuiEditPartnernetPassword + + + +XuiEditPartnernetPassword +300.000000 +32.000000 +20.000019,44.000000,0.000000 +CXuiCtrl4JEdit +XuiEdit +XuiOK + + + + +XuiLabel1 +300.000000 +25.000000 +20.000019,14.000000,0.000000 +XuiLabelDarkLeftWrapSmall +Enter Partnernet Password + + + + +XuiOK +300.000000 +20.000015,110.000000,0.000000 +XuiMainMenuButton_L +XuiEditPartnernetPassword +OK +22528 + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_pause.h b/Minecraft.Client/Common/Media/xuiscene_pause.h new file mode 100644 index 00000000..6c1b3358 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_pause.h @@ -0,0 +1,7 @@ +#define IDC_XuiButton1 L"XuiButton1" +#define IDC_XuiButton2 L"XuiButton2" +#define IDC_XuiButton3 L"XuiButton3" +#define IDC_XuiButton4 L"XuiButton4" +#define IDC_XuiButton5 L"XuiButton5" +#define IDC_XuiButton6 L"XuiButton6" +#define IDC_ScenePause L"ScenePause" diff --git a/Minecraft.Client/Common/Media/xuiscene_pause.xui b/Minecraft.Client/Common/Media/xuiscene_pause.xui new file mode 100644 index 00000000..679de337 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_pause.xui @@ -0,0 +1,88 @@ + + +1280.000000 +720.000000 + + + +ScenePause +1280.000000 +720.000000 +CScene_Pause +XuiMenuScene +XuiButton1 + + + +XuiButton1 +400.000000 +40.000000 +440.000031,250.000000,0.000000 +XuiMainMenuButton_L +XuiButton6 +XuiButton2 +22528 + + + + +XuiButton2 +400.000000 +40.000000 +440.000092,300.000000,0.000000 +XuiMainMenuButton_L +XuiButton1 +XuiButton3 +22528 + + + + +XuiButton3 +400.000000 +40.000000 +440.000092,350.000000,0.000000 +XuiMainMenuButton_L +XuiButton2 +XuiButton4 +22528 + + + + +XuiButton4 +400.000000 +40.000000 +440.000092,400.000000,0.000000 +XuiMainMenuButton_L +XuiButton3 +XuiButton5 +22528 + + + + +XuiButton5 +400.000000 +40.000000 +440.000092,450.000000,0.000000 +XuiMainMenuButton_L +XuiButton4 +XuiButton6 +22528 + + + + +XuiButton6 +400.000000 +40.000000 +440.000031,500.000000,0.000000 +XuiMainMenuButton_L +XuiButton5 +XuiButton1 +22528 + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_pause_480.h b/Minecraft.Client/Common/Media/xuiscene_pause_480.h new file mode 100644 index 00000000..6c1b3358 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_pause_480.h @@ -0,0 +1,7 @@ +#define IDC_XuiButton1 L"XuiButton1" +#define IDC_XuiButton2 L"XuiButton2" +#define IDC_XuiButton3 L"XuiButton3" +#define IDC_XuiButton4 L"XuiButton4" +#define IDC_XuiButton5 L"XuiButton5" +#define IDC_XuiButton6 L"XuiButton6" +#define IDC_ScenePause L"ScenePause" diff --git a/Minecraft.Client/Common/Media/xuiscene_pause_480.xui b/Minecraft.Client/Common/Media/xuiscene_pause_480.xui new file mode 100644 index 00000000..8a0eac2c --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_pause_480.xui @@ -0,0 +1,88 @@ + + +640.000000 +480.000000 + + + +ScenePause +640.000000 +480.000000 +CScene_Pause +XuiMenuScene +XuiButton1 + + + +XuiButton1 +300.000000 +36.000000 +170.000000,140.000000,0.000000 +XuiMainMenuButton_L_Thin +XuiButton6 +XuiButton2 +22528 + + + + +XuiButton2 +300.000000 +36.000000 +170.000061,180.000000,0.000000 +XuiMainMenuButton_L_Thin +XuiButton1 +XuiButton3 +22528 + + + + +XuiButton3 +300.000000 +36.000000 +170.000061,220.000000,0.000000 +XuiMainMenuButton_L_Thin +XuiButton2 +XuiButton4 +22528 + + + + +XuiButton4 +300.000000 +36.000000 +170.000061,260.000000,0.000000 +XuiMainMenuButton_L_Thin +XuiButton3 +XuiButton5 +22528 + + + + +XuiButton5 +300.000000 +36.000000 +170.000061,300.000000,0.000000 +XuiMainMenuButton_L_Thin +XuiButton4 +XuiButton6 +22528 + + + + +XuiButton6 +300.000000 +36.000000 +170.000000,340.000000,0.000000 +XuiMainMenuButton_L_Thin +XuiButton5 +XuiButton1 +22528 + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_pause_small.h b/Minecraft.Client/Common/Media/xuiscene_pause_small.h new file mode 100644 index 00000000..6c1b3358 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_pause_small.h @@ -0,0 +1,7 @@ +#define IDC_XuiButton1 L"XuiButton1" +#define IDC_XuiButton2 L"XuiButton2" +#define IDC_XuiButton3 L"XuiButton3" +#define IDC_XuiButton4 L"XuiButton4" +#define IDC_XuiButton5 L"XuiButton5" +#define IDC_XuiButton6 L"XuiButton6" +#define IDC_ScenePause L"ScenePause" diff --git a/Minecraft.Client/Common/Media/xuiscene_pause_small.xui b/Minecraft.Client/Common/Media/xuiscene_pause_small.xui new file mode 100644 index 00000000..a384c331 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_pause_small.xui @@ -0,0 +1,88 @@ + + +640.000000 +360.000000 + + + +ScenePause +640.000000 +360.000000 +CScene_Pause +XuiMenuScene +XuiButton1 + + + +XuiButton1 +400.000000 +40.000000 +120.000031,48.000000,0.000000 +XuiMainMenuButton_L +XuiButton6 +XuiButton2 +22528 + + + + +XuiButton2 +400.000000 +40.000000 +120.000092,93.000000,0.000000 +XuiMainMenuButton_L +XuiButton1 +XuiButton3 +22528 + + + + +XuiButton3 +400.000000 +40.000000 +120.000092,138.000000,0.000000 +XuiMainMenuButton_L +XuiButton2 +XuiButton4 +22528 + + + + +XuiButton4 +400.000000 +40.000000 +120.000092,183.000000,0.000000 +XuiMainMenuButton_L +XuiButton3 +XuiButton5 +22528 + + + + +XuiButton5 +400.000000 +40.000000 +120.000092,228.000000,0.000000 +XuiMainMenuButton_L +XuiButton4 +XuiButton6 +22528 + + + + +XuiButton6 +400.000000 +40.000000 +120.000031,273.000000,0.000000 +XuiMainMenuButton_L +XuiButton5 +XuiButton1 +22528 + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_reinstall.h b/Minecraft.Client/Common/Media/xuiscene_reinstall.h new file mode 100644 index 00000000..acf50516 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_reinstall.h @@ -0,0 +1,8 @@ +#define IDC_XuiButton1 L"XuiButton1" +#define IDC_XuiButton2 L"XuiButton2" +#define IDC_XuiButton3 L"XuiButton3" +#define IDC_XuiButton4 L"XuiButton4" +#define IDC_XuiButton5 L"XuiButton5" +#define IDC_XuiButton6 L"XuiButton6" +#define IDC_FocusSink L"FocusSink" +#define IDC_SceneReinstall L"SceneReinstall" diff --git a/Minecraft.Client/Common/Media/xuiscene_reinstall.xui b/Minecraft.Client/Common/Media/xuiscene_reinstall.xui new file mode 100644 index 00000000..d8bd92e5 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_reinstall.xui @@ -0,0 +1,89 @@ + + +1280.000000 +720.000000 + + + +SceneReinstall +1280.000000 +720.000000 +CScene_Reinstall +XuiMenuScene +FocusSink + + + +XuiButton1 +450.000000 +40.000000 +415.000000,250.000000,0.000000 +XuiMainMenuButton_L +XuiButton6 +XuiButton2 + + + + +XuiButton2 +450.000000 +40.000000 +415.000000,299.999969,0.000000 +XuiMainMenuButton_L +XuiButton1 +XuiButton3 + + + + +XuiButton3 +450.000000 +40.000000 +415.000000,349.999939,0.000000 +XuiMainMenuButton_L +XuiButton2 +XuiButton4 + + + + +XuiButton4 +450.000000 +40.000000 +415.000000,399.999939,0.000000 +XuiMainMenuButton_L +XuiButton3 +XuiButton5 + + + + +XuiButton5 +450.000000 +40.000000 +415.000000,449.999939,0.000000 +XuiMainMenuButton_L +XuiButton4 +XuiButton6 + + + + +XuiButton6 +450.000000 +40.000000 +415.000000,500.000000,0.000000 +XuiMainMenuButton_L +XuiButton5 +XuiButton1 + + + + +FocusSink +145.000000 +31.000000 + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_reinstall_480.h b/Minecraft.Client/Common/Media/xuiscene_reinstall_480.h new file mode 100644 index 00000000..acf50516 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_reinstall_480.h @@ -0,0 +1,8 @@ +#define IDC_XuiButton1 L"XuiButton1" +#define IDC_XuiButton2 L"XuiButton2" +#define IDC_XuiButton3 L"XuiButton3" +#define IDC_XuiButton4 L"XuiButton4" +#define IDC_XuiButton5 L"XuiButton5" +#define IDC_XuiButton6 L"XuiButton6" +#define IDC_FocusSink L"FocusSink" +#define IDC_SceneReinstall L"SceneReinstall" diff --git a/Minecraft.Client/Common/Media/xuiscene_reinstall_480.xui b/Minecraft.Client/Common/Media/xuiscene_reinstall_480.xui new file mode 100644 index 00000000..3778f86c --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_reinstall_480.xui @@ -0,0 +1,95 @@ + + +640.000000 +480.000000 + + + +SceneReinstall +640.000000 +480.000000 +CScene_Reinstall +XuiMenuScene +FocusSink + + + +XuiButton1 +300.000000 +36.000000 +170.000000,140.000000,0.000000 +XuiMainMenuButton_L_Thin +XuiButton6 +XuiButton2 +22528 + + + + +XuiButton2 +300.000000 +36.000000 +170.000061,180.000000,0.000000 +XuiMainMenuButton_L_Thin +XuiButton1 +XuiButton3 +22528 + + + + +XuiButton3 +300.000000 +36.000000 +170.000061,220.000000,0.000000 +XuiMainMenuButton_L_Thin +XuiButton2 +XuiButton4 +22528 + + + + +XuiButton4 +300.000000 +36.000000 +170.000061,260.000000,0.000000 +XuiMainMenuButton_L_Thin +XuiButton3 +XuiButton5 +22528 + + + + +XuiButton5 +300.000000 +36.000000 +170.000061,300.000000,0.000000 +XuiMainMenuButton_L_Thin +XuiButton4 +XuiButton6 +22528 + + + + +XuiButton6 +300.000000 +36.000000 +170.000000,340.000000,0.000000 +XuiMainMenuButton_L_Thin +XuiButton5 +XuiButton1 +22528 + + + + +FocusSink +145.000000 +31.000000 + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_reinstall_small.h b/Minecraft.Client/Common/Media/xuiscene_reinstall_small.h new file mode 100644 index 00000000..acf50516 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_reinstall_small.h @@ -0,0 +1,8 @@ +#define IDC_XuiButton1 L"XuiButton1" +#define IDC_XuiButton2 L"XuiButton2" +#define IDC_XuiButton3 L"XuiButton3" +#define IDC_XuiButton4 L"XuiButton4" +#define IDC_XuiButton5 L"XuiButton5" +#define IDC_XuiButton6 L"XuiButton6" +#define IDC_FocusSink L"FocusSink" +#define IDC_SceneReinstall L"SceneReinstall" diff --git a/Minecraft.Client/Common/Media/xuiscene_reinstall_small.xui b/Minecraft.Client/Common/Media/xuiscene_reinstall_small.xui new file mode 100644 index 00000000..bca469e3 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_reinstall_small.xui @@ -0,0 +1,95 @@ + + +640.000000 +360.000000 + + + +SceneReinstall +640.000000 +360.000000 +CScene_Reinstall +XuiMenuScene +FocusSink + + + +XuiButton1 +400.000000 +40.000000 +120.000031,48.000000,0.000000 +XuiMainMenuButton_L +XuiButton6 +XuiButton2 +22528 + + + + +XuiButton2 +400.000000 +40.000000 +120.000092,93.000000,0.000000 +XuiMainMenuButton_L +XuiButton1 +XuiButton3 +22528 + + + + +XuiButton3 +400.000000 +40.000000 +120.000092,138.000000,0.000000 +XuiMainMenuButton_L +XuiButton2 +XuiButton4 +22528 + + + + +XuiButton4 +400.000000 +40.000000 +120.000092,183.000000,0.000000 +XuiMainMenuButton_L +XuiButton3 +XuiButton5 +22528 + + + + +XuiButton5 +400.000000 +40.000000 +120.000092,228.000000,0.000000 +XuiMainMenuButton_L +XuiButton4 +XuiButton6 +22528 + + + + +XuiButton6 +400.000000 +40.000000 +120.000031,273.000000,0.000000 +XuiMainMenuButton_L +XuiButton5 +XuiButton1 +22528 + + + + +FocusSink +145.000000 +31.000000 + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_savemessage.h b/Minecraft.Client/Common/Media/xuiscene_savemessage.h new file mode 100644 index 00000000..430e3048 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_savemessage.h @@ -0,0 +1,4 @@ +#define IDC_ConfirmButton L"ConfirmButton" +#define IDC_Description L"Description" +#define IDC_XuiSavingIcon L"XuiSavingIcon" +#define IDC_SceneSaveMessage L"SceneSaveMessage" diff --git a/Minecraft.Client/Common/Media/xuiscene_savemessage.xui b/Minecraft.Client/Common/Media/xuiscene_savemessage.xui new file mode 100644 index 00000000..36a7a975 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_savemessage.xui @@ -0,0 +1,44 @@ + + +1280.000000 +720.000000 + + + +SceneSaveMessage +520.000000 +420.000000 +380.000000,200.000000,0.000000 +CScene_SaveMessage +XuiScene +ConfirmButton + + + +ConfirmButton +410.000000 +40.000000 +55.000000,340.000000,0.000000 +XuiMainMenuButton_L + + + + +Description +450.000000 +190.000000 +35.000000,130.000000,0.000000 +XuiLabelDarkLeftWrap + + + + +XuiSavingIcon +48.000000 +73.000000 +236.000000,37.999996,0.000000 +SaveIcon + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_savemessage_480.h b/Minecraft.Client/Common/Media/xuiscene_savemessage_480.h new file mode 100644 index 00000000..430e3048 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_savemessage_480.h @@ -0,0 +1,4 @@ +#define IDC_ConfirmButton L"ConfirmButton" +#define IDC_Description L"Description" +#define IDC_XuiSavingIcon L"XuiSavingIcon" +#define IDC_SceneSaveMessage L"SceneSaveMessage" diff --git a/Minecraft.Client/Common/Media/xuiscene_savemessage_480.xui b/Minecraft.Client/Common/Media/xuiscene_savemessage_480.xui new file mode 100644 index 00000000..1bc6b610 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_savemessage_480.xui @@ -0,0 +1,44 @@ + + +640.000000 +480.000000 + + + +SceneSaveMessage +400.000000 +280.000000 +119.000000,130.000000,0.000000 +CScene_SaveMessage +XuiScene +ConfirmButton + + + +ConfirmButton +300.000000 +36.000000 +50.000019,218.000000,0.000000 +XuiMainMenuButton_L_Thin + + + + +Description +352.000000 +116.000000 +25.000015,100.000000,0.000000 +XuiLabelDarkLeftWrapSmall + + + + +XuiSavingIcon +48.000000 +73.000000 +176.000092,18.000000,0.000000 +SaveIcon + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_All.h b/Minecraft.Client/Common/Media/xuiscene_settings_All.h new file mode 100644 index 00000000..35da4409 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_All.h @@ -0,0 +1,7 @@ +#define IDC_XuiButtonResetToDefaults L"XuiButtonResetToDefaults" +#define IDC_XuiButtonUI L"XuiButtonUI" +#define IDC_XuiButtonGraphics L"XuiButtonGraphics" +#define IDC_XuiButtonControl L"XuiButtonControl" +#define IDC_XuiButtonAudio L"XuiButtonAudio" +#define IDC_XuiButtonOptions L"XuiButtonOptions" +#define IDC_SceneSettings L"SceneSettings" diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_All.xui b/Minecraft.Client/Common/Media/xuiscene_settings_All.xui new file mode 100644 index 00000000..7f02d01c --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_All.xui @@ -0,0 +1,91 @@ + + +1280.000000 +720.000000 + + + +SceneSettings +1280.000000 +720.000000 +16 +CScene_SettingsAll +XuiBlankScene +XuiButtonOptions + + + +XuiButtonResetToDefaults +450.000000 +40.000000 +415.000031,500.000000,0.000000 +XuiMainMenuButton_L +XuiButtonUI + + + + +XuiButtonUI +450.000000 +40.000000 +415.000031,450.000000,0.000000 +XuiMainMenuButton_L +XuiButtonGraphics +XuiButtonResetToDefaults + + + + +XuiButtonGraphics +450.000000 +40.000000 +415.000031,400.000000,0.000000 +XuiMainMenuButton_L +XuiButtonControl +XuiButtonUI + + + + +XuiButtonControl +450.000000 +40.000000 +415.000031,350.000000,0.000000 +XuiMainMenuButton_L +XuiButtonAudio +XuiButtonGraphics + + + + +XuiButtonAudio +450.000000 +40.000000 +415.000031,300.000000,0.000000 +XuiMainMenuButton_L +XuiButtonOptions +XuiButtonControl + + + + +XuiButtonOptions +450.000000 +40.000000 +415.000031,250.000015,0.000000 +XuiMainMenuButton_L +XuiButtonAudio + + + + + +Logo +1280.000000 +138.000000 +0.000000,56.000000,0.000000 +true +MenuTitleLogo + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_All_480.h b/Minecraft.Client/Common/Media/xuiscene_settings_All_480.h new file mode 100644 index 00000000..35da4409 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_All_480.h @@ -0,0 +1,7 @@ +#define IDC_XuiButtonResetToDefaults L"XuiButtonResetToDefaults" +#define IDC_XuiButtonUI L"XuiButtonUI" +#define IDC_XuiButtonGraphics L"XuiButtonGraphics" +#define IDC_XuiButtonControl L"XuiButtonControl" +#define IDC_XuiButtonAudio L"XuiButtonAudio" +#define IDC_XuiButtonOptions L"XuiButtonOptions" +#define IDC_SceneSettings L"SceneSettings" diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_All_480.xui b/Minecraft.Client/Common/Media/xuiscene_settings_All_480.xui new file mode 100644 index 00000000..6fc8f4c6 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_All_480.xui @@ -0,0 +1,90 @@ + + +640.000000 +480.000000 + + + +SceneSettings +640.000000 +480.000000 +CScene_SettingsAll +XuiBlankScene +XuiButtonOptions + + + +XuiButtonResetToDefaults +300.000000 +36.000000 +170.000015,340.000000,0.000000 +XuiMainMenuButton_L_Thin +XuiButtonUI + + + + +XuiButtonUI +300.000000 +36.000000 +170.000015,300.000000,0.000000 +XuiMainMenuButton_L_Thin +XuiButtonGraphics +XuiButtonResetToDefaults + + + + +XuiButtonGraphics +300.000000 +36.000000 +170.000015,260.000000,0.000000 +XuiMainMenuButton_L_Thin +XuiButtonControl +XuiButtonUI + + + + +XuiButtonControl +300.000000 +36.000000 +170.000015,220.000000,0.000000 +XuiMainMenuButton_L_Thin +XuiButtonAudio +XuiButtonGraphics + + + + +XuiButtonAudio +300.000000 +36.000000 +170.000015,180.000000,0.000000 +XuiMainMenuButton_L_Thin +XuiButtonOptions +XuiButtonControl + + + + +XuiButtonOptions +300.000000 +36.000000 +170.000015,140.000000,0.000000 +XuiMainMenuButton_L_Thin +XuiButtonAudio + + + + + +Logo +640.000000 +70.000000 +0.000000,48.000000,0.000000 +true +MenuTitleLogo + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_All_small.h b/Minecraft.Client/Common/Media/xuiscene_settings_All_small.h new file mode 100644 index 00000000..35da4409 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_All_small.h @@ -0,0 +1,7 @@ +#define IDC_XuiButtonResetToDefaults L"XuiButtonResetToDefaults" +#define IDC_XuiButtonUI L"XuiButtonUI" +#define IDC_XuiButtonGraphics L"XuiButtonGraphics" +#define IDC_XuiButtonControl L"XuiButtonControl" +#define IDC_XuiButtonAudio L"XuiButtonAudio" +#define IDC_XuiButtonOptions L"XuiButtonOptions" +#define IDC_SceneSettings L"SceneSettings" diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_All_small.xui b/Minecraft.Client/Common/Media/xuiscene_settings_All_small.xui new file mode 100644 index 00000000..d0e43651 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_All_small.xui @@ -0,0 +1,82 @@ + + +640.000000 +360.000000 + + + +SceneSettings +320.000000 +263.000000 +160.000000,10.000000,0.000000 +16 +CScene_SettingsAll +XuiBlankScene +XuiButtonOptions + + + +XuiButtonResetToDefaults +297.000000 +40.000000 +11.000000,236.000000,0.000000 +XuiMainMenuButton_L +XuiButtonUI + + + + +XuiButtonUI +297.000000 +40.000000 +11.000000,190.000000,0.000000 +XuiMainMenuButton_L +XuiButtonGraphics +XuiButtonResetToDefaults + + + + +XuiButtonGraphics +297.000000 +40.000000 +11.000000,144.000000,0.000000 +XuiMainMenuButton_L +XuiButtonControl +XuiButtonUI + + + + +XuiButtonControl +297.000000 +40.000000 +11.000000,98.000000,0.000000 +XuiMainMenuButton_L +XuiButtonAudio +XuiButtonGraphics + + + + +XuiButtonAudio +297.000000 +40.000000 +11.000000,52.000000,0.000000 +XuiMainMenuButton_L +XuiButtonOptions +XuiButtonControl + + + + +XuiButtonOptions +297.000000 +40.000000 +11.000000,6.000000,0.000000 +XuiMainMenuButton_L +XuiButtonAudio + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_Audio.h b/Minecraft.Client/Common/Media/xuiscene_settings_Audio.h new file mode 100644 index 00000000..fae52564 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_Audio.h @@ -0,0 +1,7 @@ +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderSound L"XuiSliderSound" +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderMusic L"XuiSliderMusic" +#define IDC_SceneSettingsAudio L"SceneSettingsAudio" diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_Audio.xui b/Minecraft.Client/Common/Media/xuiscene_settings_Audio.xui new file mode 100644 index 00000000..45ef2912 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_Audio.xui @@ -0,0 +1,81 @@ + + +1280.000000 +720.000000 + + + +SceneSettingsAudio +330.000000 +106.000000 +474.000000,250.000000,0.000000 +16 +CScene_SettingsAudio +GraphicPanel +XuiSliderMusic\XuiSlider + + + +XuiSliderSound +306.000000 +38.000000 +12.000031,56.000000,0.000000 +5 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiSliderMusic\XuiSlider +XuiSliderGamma\XuiSlider +FocusSink + + + +XuiSlider +306.000000 +38.000000 +5 +XuiSlider +SchemeList +XuiSliderMusic +XuiSliderGamma + + + + +FocusSink +1.000000 +1.000000 + + + + + +XuiSliderMusic +306.000000 +38.000000 +12.000031,12.000000,0.000000 +5 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiButtonOptions +XuiSliderSound\XuiSlider +FocusSink + + + +XuiSlider +306.000000 +38.000000 +5 +XuiSlider + + + + +FocusSink +520.000000 +70.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_Audio_480.h b/Minecraft.Client/Common/Media/xuiscene_settings_Audio_480.h new file mode 100644 index 00000000..fae52564 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_Audio_480.h @@ -0,0 +1,7 @@ +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderSound L"XuiSliderSound" +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderMusic L"XuiSliderMusic" +#define IDC_SceneSettingsAudio L"SceneSettingsAudio" diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_Audio_480.xui b/Minecraft.Client/Common/Media/xuiscene_settings_Audio_480.xui new file mode 100644 index 00000000..e4b146c8 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_Audio_480.xui @@ -0,0 +1,76 @@ + + +640.000000 +480.000000 + + + +SceneSettingsAudio +320.000000 +108.000000 +160.000031,180.000000,0.000000 +CScene_SettingsAudio +GraphicPanel +XuiSliderMusic\XuiSlider + + + +XuiSliderSound +306.000000 +38.000000 +6.000031,57.000000,0.000000 +5 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiSliderMusic\XuiSlider +FocusSink + + + +XuiSlider +306.000000 +38.000000 +XuiSlider +SchemeList +XuiSliderMusic +XuiSliderGamma + + + + +FocusSink +1.000000 +1.000000 + + + + + +XuiSliderMusic +306.000000 +38.000000 +6.000031,12.000000,0.000000 +5 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiSliderSound\XuiSlider +FocusSink + + + +XuiSlider +306.000000 +38.000000 +XuiSlider + + + + +FocusSink +320.000000 +70.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_Audio_small.h b/Minecraft.Client/Common/Media/xuiscene_settings_Audio_small.h new file mode 100644 index 00000000..fae52564 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_Audio_small.h @@ -0,0 +1,7 @@ +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderSound L"XuiSliderSound" +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderMusic L"XuiSliderMusic" +#define IDC_SceneSettingsAudio L"SceneSettingsAudio" diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_Audio_small.xui b/Minecraft.Client/Common/Media/xuiscene_settings_Audio_small.xui new file mode 100644 index 00000000..257a43cc --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_Audio_small.xui @@ -0,0 +1,79 @@ + + +640.000000 +360.000000 + + + +SceneSettingsAudio +320.000000 +120.000000 +160.000000,74.000000,0.000000 +16 +CScene_SettingsAudio +GraphicPanel +XuiSliderMusic\XuiSlider + + + +XuiSliderSound +306.000000 +38.000000 +6.000031,61.000000,0.000000 +5 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiSliderMusic\XuiSlider +XuiSliderGamma\XuiSlider +FocusSink + + + +XuiSlider +306.000000 +38.000000 +XuiSlider +SchemeList +XuiSliderMusic +XuiSliderGamma + + + + +FocusSink +1.000000 +1.000000 + + + + + +XuiSliderMusic +306.000000 +38.000000 +6.000031,16.000000,0.000000 +5 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiButtonOptions +XuiSliderSound\XuiSlider +FocusSink + + + +XuiSlider +306.000000 +38.000000 +XuiSlider + + + + +FocusSink +320.000000 +70.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_Control.h b/Minecraft.Client/Common/Media/xuiscene_settings_Control.h new file mode 100644 index 00000000..6fe32d8a --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_Control.h @@ -0,0 +1,7 @@ +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderSensitivityInMenu L"XuiSliderSensitivityInMenu" +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderSensitivityInGame L"XuiSliderSensitivityInGame" +#define IDC_SceneSettingsControl L"SceneSettingsControl" diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_Control.xui b/Minecraft.Client/Common/Media/xuiscene_settings_Control.xui new file mode 100644 index 00000000..53a433dc --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_Control.xui @@ -0,0 +1,78 @@ + + +1280.000000 +720.000000 + + + +SceneSettingsControl +330.000000 +106.000000 +474.000000,307.000000,0.000000 +16 +CScene_SettingsControl +GraphicPanel +XuiSliderSensitivityInGame\XuiSlider + + + +XuiSliderSensitivityInMenu +306.000000 +38.000000 +12.000031,56.000000,0.000000 +5 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiSliderSensitivityInGame\XuiSlider +FocusSink + + + +XuiSlider +306.000000 +38.000000 +5 +XuiSlider +200 + + + + +FocusSink +306.000000 +38.000000 + + + + + +XuiSliderSensitivityInGame +306.000000 +38.000000 +12.000031,12.000000,0.000000 +5 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiSliderSensitivityInMenu\XuiSlider +FocusSink + + + +XuiSlider +306.000000 +38.000000 +5 +XuiSlider +200 + + + + +FocusSink +306.000000 +38.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_Control_480.h b/Minecraft.Client/Common/Media/xuiscene_settings_Control_480.h new file mode 100644 index 00000000..6fe32d8a --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_Control_480.h @@ -0,0 +1,7 @@ +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderSensitivityInMenu L"XuiSliderSensitivityInMenu" +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderSensitivityInGame L"XuiSliderSensitivityInGame" +#define IDC_SceneSettingsControl L"SceneSettingsControl" diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_Control_480.xui b/Minecraft.Client/Common/Media/xuiscene_settings_Control_480.xui new file mode 100644 index 00000000..ed23dbb9 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_Control_480.xui @@ -0,0 +1,75 @@ + + +640.000000 +480.000000 + + + +SceneSettingsControl +320.000000 +106.000000 +160.000031,187.000015,0.000000 +CScene_SettingsControl +GraphicPanel +XuiSliderSensitivityInGame\XuiSlider + + + +XuiSliderSensitivityInMenu +306.000000 +38.000000 +6.000031,55.000000,0.000000 +5 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiSliderSensitivityInGame\XuiSlider +FocusSink + + + +XuiSlider +306.000000 +38.000000 +XuiSlider +200 + + + + +FocusSink +306.000000 +38.000000 + + + + + +XuiSliderSensitivityInGame +306.000000 +38.000000 +6.000031,10.000000,0.000000 +5 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiSliderSensitivityInMenu\XuiSlider +FocusSink + + + +XuiSlider +306.000000 +38.000000 +XuiSlider +200 + + + + +FocusSink +306.000000 +38.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_Control_small.h b/Minecraft.Client/Common/Media/xuiscene_settings_Control_small.h new file mode 100644 index 00000000..6fe32d8a --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_Control_small.h @@ -0,0 +1,7 @@ +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderSensitivityInMenu L"XuiSliderSensitivityInMenu" +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderSensitivityInGame L"XuiSliderSensitivityInGame" +#define IDC_SceneSettingsControl L"SceneSettingsControl" diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_Control_small.xui b/Minecraft.Client/Common/Media/xuiscene_settings_Control_small.xui new file mode 100644 index 00000000..0fa4bdb3 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_Control_small.xui @@ -0,0 +1,76 @@ + + +640.000000 +360.000000 + + + +SceneSettingsControl +320.000000 +120.000000 +160.000015,120.000015,0.000000 +16 +CScene_SettingsControl +GraphicPanel +XuiSliderSensitivityInGame\XuiSlider + + + +XuiSliderSensitivityInMenu +306.000000 +38.000000 +6.000031,55.000000,0.000000 +5 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiSliderSensitivityInGame\XuiSlider +FocusSink + + + +XuiSlider +306.000000 +38.000000 +XuiSlider +200 + + + + +FocusSink +306.000000 +38.000000 + + + + + +XuiSliderSensitivityInGame +306.000000 +38.000000 +6.000031,10.000000,0.000000 +5 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiSliderSensitivityInMenu\XuiSlider +FocusSink + + + +XuiSlider +306.000000 +38.000000 +XuiSlider +200 + + + + +FocusSink +306.000000 +38.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_Graphics.h b/Minecraft.Client/Common/Media/xuiscene_settings_Graphics.h new file mode 100644 index 00000000..d6553d86 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_Graphics.h @@ -0,0 +1,10 @@ +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderInterfaceOpacity L"XuiSliderInterfaceOpacity" +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderGamma L"XuiSliderGamma" +#define IDC_XuiCustomSkinAnim L"XuiCustomSkinAnim" +#define IDC_XuiBedrockFog L"XuiBedrockFog" +#define IDC_XuiClouds L"XuiClouds" +#define IDC_SceneSettingsGraphics L"SceneSettingsGraphics" diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_Graphics.xui b/Minecraft.Client/Common/Media/xuiscene_settings_Graphics.xui new file mode 100644 index 00000000..41252b65 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_Graphics.xui @@ -0,0 +1,112 @@ + + +1280.000000 +720.000000 + + + +SceneSettingsGraphics +330.000000 +222.000000 +474.000000,249.000015,0.000000 +16 +CScene_SettingsGraphics +GraphicPanel +XuiClouds + + + +XuiSliderInterfaceOpacity +306.000000 +38.000000 +12.000000,168.000000,0.000000 +5 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiSliderGamma\XuiSlider +FocusSink + + + +XuiSlider +306.000000 +38.000000 +5 +XuiSlider + + + + +FocusSink +306.000000 +38.000000 + + + + + +XuiSliderGamma +306.000000 +38.000000 +12.000000,124.000000,0.000000 +5 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiCustomSkinAnim +XuiSliderInterfaceOpacity\XuiSlider +FocusSink + + + +XuiSlider +306.000000 +38.000000 +5 +XuiSlider +SchemeList +XuiSliderSound +XuiSliderSensitivity + + + + +FocusSink +1.000000 +1.000000 + + + + + +XuiCustomSkinAnim +300.000000 +32.000000 +14.000000,84.000000,0.000000 +5 +XuiBedrockFog +XuiSliderGamma\XuiSlider + + + + +XuiBedrockFog +300.000000 +32.000000 +14.000000,48.000000,0.000000 +5 +XuiClouds +XuiCustomSkinAnim + + + + +XuiClouds +300.000000 +32.000000 +14.000000,12.000000,0.000000 +5 +XuiBedrockFog + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_Graphics_480.h b/Minecraft.Client/Common/Media/xuiscene_settings_Graphics_480.h new file mode 100644 index 00000000..d6553d86 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_Graphics_480.h @@ -0,0 +1,10 @@ +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderInterfaceOpacity L"XuiSliderInterfaceOpacity" +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderGamma L"XuiSliderGamma" +#define IDC_XuiCustomSkinAnim L"XuiCustomSkinAnim" +#define IDC_XuiBedrockFog L"XuiBedrockFog" +#define IDC_XuiClouds L"XuiClouds" +#define IDC_SceneSettingsGraphics L"SceneSettingsGraphics" diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_Graphics_480.xui b/Minecraft.Client/Common/Media/xuiscene_settings_Graphics_480.xui new file mode 100644 index 00000000..f1080610 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_Graphics_480.xui @@ -0,0 +1,111 @@ + + +640.000000 +480.000000 + + + +SceneSettingsGraphics +320.000000 +192.000000 +160.000000,144.000015,0.000000 +CScene_SettingsGraphics +GraphicPanel +XuiClouds + + + +XuiSliderInterfaceOpacity +306.000000 +38.000000 +6.000000,138.000000,0.000000 +5 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiSliderGamma\XuiSlider +FocusSink + + + +XuiSlider +306.000000 +38.000000 +XuiSlider + + + + +FocusSink +306.000000 +38.000000 + + + + + +XuiSliderGamma +306.000000 +38.000000 +6.000000,94.000000,0.000000 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiCustomSkinAnim +XuiSliderInterfaceOpacity\XuiSlider +FocusSink + + + +XuiSlider +306.000000 +38.000000 +XuiSlider +SchemeList +XuiSliderSound +XuiSliderSensitivity + + + + +FocusSink +1.000000 +1.000000 + + + + + +XuiCustomSkinAnim +300.000000 +20.000000 +9.000000,62.000000,0.000000 +5 +XuiCheckboxSmall +XuiBedrockFog +XuiSliderGamma\XuiSlider + + + + +XuiBedrockFog +300.000000 +20.000000 +9.000000,38.000000,0.000000 +5 +XuiCheckboxSmall +XuiClouds +XuiCustomSkinAnim + + + + +XuiClouds +300.000000 +20.000000 +9.000000,14.000000,0.000000 +5 +XuiCheckboxSmall +XuiBedrockFog + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_Graphics_small.h b/Minecraft.Client/Common/Media/xuiscene_settings_Graphics_small.h new file mode 100644 index 00000000..d6553d86 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_Graphics_small.h @@ -0,0 +1,10 @@ +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderInterfaceOpacity L"XuiSliderInterfaceOpacity" +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderGamma L"XuiSliderGamma" +#define IDC_XuiCustomSkinAnim L"XuiCustomSkinAnim" +#define IDC_XuiBedrockFog L"XuiBedrockFog" +#define IDC_XuiClouds L"XuiClouds" +#define IDC_SceneSettingsGraphics L"SceneSettingsGraphics" diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_Graphics_small.xui b/Minecraft.Client/Common/Media/xuiscene_settings_Graphics_small.xui new file mode 100644 index 00000000..ea12d77b --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_Graphics_small.xui @@ -0,0 +1,112 @@ + + +640.000000 +360.000000 + + + +SceneSettingsGraphics +320.000000 +224.000000 +160.000000,68.000015,0.000000 +16 +CScene_SettingsGraphics +GraphicPanel +XuiClouds + + + +XuiSliderInterfaceOpacity +306.000000 +38.000000 +6.000000,158.000000,0.000000 +5 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiSliderGamma\XuiSlider +FocusSink + + + +XuiSlider +306.000000 +38.000000 +XuiSlider + + + + +FocusSink +306.000000 +38.000000 + + + + + +XuiSliderGamma +306.000000 +38.000000 +6.000000,112.000000,0.000000 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiCustomSkinAnim +XuiSliderInterfaceOpacity\XuiSlider +FocusSink + + + +XuiSlider +306.000000 +38.000000 +XuiSlider +SchemeList +XuiSliderSound +XuiSliderSensitivity + + + + +FocusSink +1.000000 +1.000000 + + + + + +XuiCustomSkinAnim +300.000000 +20.000000 +9.000000,68.000000,0.000000 +5 +XuiCheckboxSmall +XuiBedrockFog +XuiSliderGamma\XuiSlider + + + + +XuiBedrockFog +300.000000 +20.000000 +9.000000,38.000000,0.000000 +5 +XuiCheckboxSmall +XuiClouds +XuiCustomSkinAnim + + + + +XuiClouds +300.000000 +20.000000 +9.000000,8.000000,0.000000 +5 +XuiCheckboxSmall +XuiBedrockFog + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_UI.h b/Minecraft.Client/Common/Media/xuiscene_settings_UI.h new file mode 100644 index 00000000..f766a610 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_UI.h @@ -0,0 +1,13 @@ +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderUISizeSplitscreen L"XuiSliderUISizeSplitscreen" +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderUISize L"XuiSliderUISize" +#define IDC_XuiShowSplitscreenGamertags L"XuiShowSplitscreenGamertags" +#define IDC_XuiSplitScreen L"XuiSplitScreen" +#define IDC_XuiShowAnimatedCharacter L"XuiShowAnimatedCharacter" +#define IDC_XuiDisplayDeathMessages L"XuiDisplayDeathMessages" +#define IDC_XuiDisplayHand L"XuiDisplayHand" +#define IDC_XuiDisplayHUD L"XuiDisplayHUD" +#define IDC_SceneSettingsUI L"SceneSettingsUI" diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_UI.xui b/Minecraft.Client/Common/Media/xuiscene_settings_UI.xui new file mode 100644 index 00000000..a51c2ed2 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_UI.xui @@ -0,0 +1,152 @@ + + +1280.000000 +720.000000 + + + +SceneSettingsUI +330.000000 +328.000000 +474.000000,214.000000,0.000000 +16 +CScene_SettingsUI +GraphicPanel +XuiDisplayHUD + + + +XuiSliderUISizeSplitscreen +306.000000 +38.000000 +12.000000,274.000000,0.000000 +5 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiSliderUISize\XuiSlider +FocusSink + + + +XuiSlider +306.000000 +38.000000 +5 +XuiSlider +1 +3 +1 + + + + +FocusSink +306.000000 +38.000000 + + + + + +XuiSliderUISize +306.000000 +38.000000 +12.000000,230.000000,0.000000 +5 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiShowSplitscreenGamertags +XuiSliderUISizeSplitscreen\XuiSlider +FocusSink + + + +XuiSlider +306.000000 +38.000000 +5 +XuiSlider +SchemeList +XuiSliderSound +XuiSliderSensitivity +1 +3 +1 + + + + +FocusSink +1.000000 +1.000000 + + + + + +XuiShowSplitscreenGamertags +300.000000 +32.000000 +14.000000,188.000000,0.000000 +5 +XuiSplitScreen +XuiSliderUISize\XuiSlider + + + + +XuiSplitScreen +300.000000 +32.000000 +14.000000,156.000000,0.000000 +5 +XuiShowAnimatedCharacter +XuiShowSplitscreenGamertags + + + + +XuiShowAnimatedCharacter +300.000000 +32.000000 +14.000000,120.000000,0.000000 +5 +XuiDisplayDeathMessages +XuiSplitScreen + + + + +XuiDisplayDeathMessages +300.000000 +32.000000 +14.000000,84.000000,0.000000 +5 +XuiDisplayHand +XuiShowAnimatedCharacter + + + + +XuiDisplayHand +300.000000 +32.000000 +14.000000,48.000000,0.000000 +5 +XuiDisplayHUD +XuiDisplayDeathMessages + + + + +XuiDisplayHUD +300.000000 +32.000000 +14.000000,12.000000,0.000000 +5 +XuiDisplayHand +XuiDisplayHand + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_UI_480.h b/Minecraft.Client/Common/Media/xuiscene_settings_UI_480.h new file mode 100644 index 00000000..f766a610 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_UI_480.h @@ -0,0 +1,13 @@ +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderUISizeSplitscreen L"XuiSliderUISizeSplitscreen" +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderUISize L"XuiSliderUISize" +#define IDC_XuiShowSplitscreenGamertags L"XuiShowSplitscreenGamertags" +#define IDC_XuiSplitScreen L"XuiSplitScreen" +#define IDC_XuiShowAnimatedCharacter L"XuiShowAnimatedCharacter" +#define IDC_XuiDisplayDeathMessages L"XuiDisplayDeathMessages" +#define IDC_XuiDisplayHand L"XuiDisplayHand" +#define IDC_XuiDisplayHUD L"XuiDisplayHUD" +#define IDC_SceneSettingsUI L"SceneSettingsUI" diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_UI_480.xui b/Minecraft.Client/Common/Media/xuiscene_settings_UI_480.xui new file mode 100644 index 00000000..028377f0 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_UI_480.xui @@ -0,0 +1,157 @@ + + +640.000000 +480.000000 + + + +SceneSettingsUI +320.000000 +250.000000 +160.000000,134.000000,0.000000 +16 +CScene_SettingsUI +GraphicPanel +XuiDisplayHUD + + + +XuiSliderUISizeSplitscreen +306.000000 +38.000000 +6.000000,204.000000,0.000000 +5 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiSliderUISize\XuiSlider +FocusSink + + + +XuiSlider +306.000000 +38.000000 +5 +XuiSlider +1 +3 +1 + + + + +FocusSink +306.000000 +38.000000 + + + + + +XuiSliderUISize +306.000000 +38.000000 +6.000000,162.000000,0.000000 +5 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiShowSplitscreenGamertags +XuiSliderUISizeSplitscreen\XuiSlider +FocusSink + + + +XuiSlider +306.000000 +38.000000 +5 +XuiSlider +SchemeList +XuiSliderSound +XuiSliderSensitivity +1 +3 +1 + + + + +FocusSink +1.000000 +1.000000 + + + + + +XuiShowSplitscreenGamertags +300.000000 +20.000000 +9.000000,136.000000,0.000000 +5 +XuiCheckboxSmall +XuiSplitScreen +XuiSliderUISize\XuiSlider + + + + +XuiSplitScreen +300.000000 +20.000000 +9.000000,112.000000,0.000000 +5 +XuiCheckboxSmall +XuiShowAnimatedCharacter +XuiShowSplitscreenGamertags + + + + +XuiShowAnimatedCharacter +300.000000 +20.000000 +9.000000,88.000000,0.000000 +5 +XuiCheckboxSmall +XuiDisplayDeathMessages +XuiSplitScreen + + + + +XuiDisplayDeathMessages +300.000000 +20.000000 +9.000000,64.000000,0.000000 +5 +XuiCheckboxSmall +XuiDisplayHand +XuiShowAnimatedCharacter + + + + +XuiDisplayHand +300.000000 +20.000000 +9.000000,40.000000,0.000000 +5 +XuiCheckboxSmall +XuiDisplayHUD +XuiDisplayDeathMessages + + + + +XuiDisplayHUD +300.000000 +20.000000 +9.000000,16.000000,0.000000 +5 +XuiCheckboxSmall +XuiDisplayHand + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_UI_small.h b/Minecraft.Client/Common/Media/xuiscene_settings_UI_small.h new file mode 100644 index 00000000..f766a610 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_UI_small.h @@ -0,0 +1,13 @@ +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderUISizeSplitscreen L"XuiSliderUISizeSplitscreen" +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderUISize L"XuiSliderUISize" +#define IDC_XuiShowSplitscreenGamertags L"XuiShowSplitscreenGamertags" +#define IDC_XuiSplitScreen L"XuiSplitScreen" +#define IDC_XuiShowAnimatedCharacter L"XuiShowAnimatedCharacter" +#define IDC_XuiDisplayDeathMessages L"XuiDisplayDeathMessages" +#define IDC_XuiDisplayHand L"XuiDisplayHand" +#define IDC_XuiDisplayHUD L"XuiDisplayHUD" +#define IDC_SceneSettingsUI L"SceneSettingsUI" diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_UI_small.xui b/Minecraft.Client/Common/Media/xuiscene_settings_UI_small.xui new file mode 100644 index 00000000..973b2c72 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_UI_small.xui @@ -0,0 +1,157 @@ + + +640.000000 +360.000000 + + + +SceneSettingsUI +320.000000 +294.000000 +160.000000,10.000000,0.000000 +16 +CScene_SettingsUI +GraphicPanel +XuiDisplayHUD + + + +XuiSliderUISizeSplitscreen +306.000000 +38.000000 +6.000000,242.000000,0.000000 +5 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiSliderUISize\XuiSlider +FocusSink + + + +XuiSlider +306.000000 +38.000000 +5 +XuiSlider +1 +3 +1 + + + + +FocusSink +306.000000 +38.000000 + + + + + +XuiSliderUISize +306.000000 +38.000000 +6.000000,196.000000,0.000000 +5 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiShowSplitscreenGamertags +XuiSliderUISizeSplitscreen\XuiSlider +FocusSink + + + +XuiSlider +306.000000 +38.000000 +5 +XuiSlider +SchemeList +XuiSliderSound +XuiSliderSensitivity +1 +3 +1 + + + + +FocusSink +1.000000 +1.000000 + + + + + +XuiShowSplitscreenGamertags +300.000000 +20.000000 +9.000000,164.000000,0.000000 +5 +XuiCheckboxSmall +XuiSplitScreen +XuiSliderUISize\XuiSlider + + + + +XuiSplitScreen +300.000000 +20.000000 +9.000000,134.000000,0.000000 +5 +XuiCheckboxSmall +XuiShowAnimatedCharacter +XuiShowSplitscreenGamertags + + + + +XuiShowAnimatedCharacter +300.000000 +20.000000 +9.000000,104.000000,0.000000 +5 +XuiCheckboxSmall +XuiDisplayDeathMessages +XuiSplitScreen + + + + +XuiDisplayDeathMessages +300.000000 +20.000000 +9.000000,74.000000,0.000000 +5 +XuiCheckboxSmall +XuiDisplayHand +XuiShowAnimatedCharacter + + + + +XuiDisplayHand +300.000000 +20.000000 +9.000000,44.000000,0.000000 +5 +XuiCheckboxSmall +XuiDisplayHUD +XuiDisplayDeathMessages + + + + +XuiDisplayHUD +300.000000 +20.000000 +9.000000,14.000000,0.000000 +5 +XuiCheckboxSmall +XuiDisplayHand + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_options.h b/Minecraft.Client/Common/Media/xuiscene_settings_options.h new file mode 100644 index 00000000..3c2c6140 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_options.h @@ -0,0 +1,13 @@ +#define IDC_XuiDifficultyText L"XuiDifficultyText" +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderDifficulty L"XuiSliderDifficulty" +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderAutosave L"XuiSliderAutosave" +#define IDC_XuiMashUpWorlds L"XuiMashUpWorlds" +#define IDC_XuiInGameGamertags L"XuiInGameGamertags" +#define IDC_XuiShowTooltips L"XuiShowTooltips" +#define IDC_XuiShowHints L"XuiShowHints" +#define IDC_XuiViewBob L"XuiViewBob" +#define IDC_SceneSettingsOptions L"SceneSettingsOptions" diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_options.xui b/Minecraft.Client/Common/Media/xuiscene_settings_options.xui new file mode 100644 index 00000000..86311f20 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_options.xui @@ -0,0 +1,144 @@ + + +1280.000000 +720.000000 + + + +SceneSettingsOptions +330.000000 +266.000000 +474.000000,250.000000,0.000000 +16 +CScene_SettingsOptions +GraphicPanel +XuiViewBob + + + +XuiDifficultyText +900.000000 +100.000000 +-285.000000,275.000000,0.000000 +16 +TipPanel + + + + +XuiSliderDifficulty +306.000000 +38.000000 +12.000000,214.000000,0.000000 +5 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiSliderAutosave\XuiSlider +XuiSliderMusic\XuiSlider +FocusSink + + + +XuiSlider +306.000000 +38.000000 +5 +XuiSlider +3 + + + + +FocusSink +1.000000 +1.000000 + + + + + +XuiSliderAutosave +306.000000 +38.000000 +12.000000,170.000000,0.000000 +5 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiMashUpWorlds +XuiSliderDifficulty\XuiSlider +FocusSink + + + +XuiSlider +306.000000 +38.000000 +5 +XuiSlider +8 + + + + +FocusSink +1.000000 +1.000000 + + + + + +XuiMashUpWorlds +300.000000 +32.000000 +14.000000,132.000000,0.000000 +5 +XuiInGameGamertags +XuiSliderAutosave\XuiSlider + + + + +XuiInGameGamertags +300.000000 +32.000000 +14.000000,102.000000,0.000000 +5 +XuiShowTooltips +XuiMashUpWorlds + + + + +XuiShowTooltips +300.000000 +32.000000 +14.000000,72.000000,0.000000 +5 +XuiShowHints +XuiInGameGamertags + + + + +XuiShowHints +300.000000 +32.000000 +14.000000,42.000000,0.000000 +5 +XuiViewBob +XuiShowTooltips + + + + +XuiViewBob +300.000000 +32.000000 +14.000000,12.000000,0.000000 +5 +XuiShowHints + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_options_480.h b/Minecraft.Client/Common/Media/xuiscene_settings_options_480.h new file mode 100644 index 00000000..3c2c6140 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_options_480.h @@ -0,0 +1,13 @@ +#define IDC_XuiDifficultyText L"XuiDifficultyText" +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderDifficulty L"XuiSliderDifficulty" +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderAutosave L"XuiSliderAutosave" +#define IDC_XuiMashUpWorlds L"XuiMashUpWorlds" +#define IDC_XuiInGameGamertags L"XuiInGameGamertags" +#define IDC_XuiShowTooltips L"XuiShowTooltips" +#define IDC_XuiShowHints L"XuiShowHints" +#define IDC_XuiViewBob L"XuiViewBob" +#define IDC_SceneSettingsOptions L"SceneSettingsOptions" diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_options_480.xui b/Minecraft.Client/Common/Media/xuiscene_settings_options_480.xui new file mode 100644 index 00000000..a5b0d5d1 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_options_480.xui @@ -0,0 +1,146 @@ + + +640.000000 +480.000000 + + + +SceneSettingsOptions +320.000000 +230.000000 +160.000000,120.000000,0.000000 +CScene_SettingsOptions +GraphicPanel +XuiViewBob + + + +XuiDifficultyText +512.000000 +62.000000 +-104.000000,234.000000,0.000000 +TipPanel + + + + +XuiSliderDifficulty +306.000000 +38.000000 +8.000000,180.000000,0.000000 +5 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiSliderAutosave\XuiSlider +FocusSink + + + +XuiSlider +306.000000 +38.000000 +5 +XuiSlider +3 + + + + +FocusSink +1.000000 +1.000000 + + + + + +XuiSliderAutosave +306.000000 +38.000000 +8.000000,138.000000,0.000000 +5 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiMashUpWorlds +XuiSliderDifficulty\XuiSlider +FocusSink + + + +XuiSlider +306.000000 +38.000000 +5 +XuiSlider +8 + + + + +FocusSink +1.000000 +1.000000 + + + + + +XuiMashUpWorlds +300.000000 +20.000000 +9.000000,110.000000,0.000000 +5 +XuiCheckboxSmall +XuiInGameGamertags +XuiSliderAutosave\XuiSlider + + + + +XuiInGameGamertags +300.000000 +20.000000 +9.000000,86.000000,0.000000 +5 +XuiCheckboxSmall +XuiShowTooltips +XuiMashUpWorlds + + + + +XuiShowTooltips +300.000000 +20.000000 +9.000000,62.000000,0.000000 +5 +XuiCheckboxSmall +XuiShowHints +XuiInGameGamertags + + + + +XuiShowHints +300.000000 +20.000000 +9.000000,38.000000,0.000000 +5 +XuiCheckboxSmall +XuiViewBob +XuiShowTooltips + + + + +XuiViewBob +300.000000 +20.000000 +9.000000,14.000000,0.000000 +5 +XuiCheckboxSmall +XuiShowHints + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_options_small.h b/Minecraft.Client/Common/Media/xuiscene_settings_options_small.h new file mode 100644 index 00000000..3c2c6140 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_options_small.h @@ -0,0 +1,13 @@ +#define IDC_XuiDifficultyText L"XuiDifficultyText" +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderDifficulty L"XuiSliderDifficulty" +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderAutosave L"XuiSliderAutosave" +#define IDC_XuiMashUpWorlds L"XuiMashUpWorlds" +#define IDC_XuiInGameGamertags L"XuiInGameGamertags" +#define IDC_XuiShowTooltips L"XuiShowTooltips" +#define IDC_XuiShowHints L"XuiShowHints" +#define IDC_XuiViewBob L"XuiViewBob" +#define IDC_SceneSettingsOptions L"SceneSettingsOptions" diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_options_small.xui b/Minecraft.Client/Common/Media/xuiscene_settings_options_small.xui new file mode 100644 index 00000000..230fc264 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_options_small.xui @@ -0,0 +1,148 @@ + + +640.000000 +360.000000 + + + +SceneSettingsOptions +320.000000 +250.000000 +160.000000,69.000015,0.000000 +16 +CScene_SettingsOptions +GraphicPanel +XuiViewBob + + + +XuiDifficultyText +540.000000 +110.000000 +-109.999969,254.000000,0.000000 +false +TipPanel + + + + +XuiSliderDifficulty +300.000000 +38.000000 +9.000000,192.000000,0.000000 +5 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiSliderAutosave\XuiSlider +FocusSink + + + +XuiSlider +300.000000 +38.000000 +5 +XuiSlider +3 + + + + +FocusSink +1.000000 +1.000000 + + + + + +XuiSliderAutosave +300.000000 +38.000000 +9.000000,150.000000,0.000000 +5 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiMashUpWorlds +XuiSliderDifficulty\XuiSlider +FocusSink + + + +XuiSlider +300.000000 +38.000000 +5 +XuiSlider +8 + + + + +FocusSink +1.000000 +1.000000 + + + + + +XuiMashUpWorlds +300.000000 +20.000000 +9.000000,120.000000,0.000000 +5 +XuiCheckboxSmall +XuiInGameGamertags +XuiSliderAutosave\XuiSlider + + + + +XuiInGameGamertags +300.000000 +20.000000 +9.000000,92.000000,0.000000 +5 +XuiCheckboxSmall +XuiShowTooltips +XuiMashUpWorlds + + + + +XuiShowTooltips +300.000000 +20.000000 +9.000000,64.000000,0.000000 +5 +XuiCheckboxSmall +XuiShowHints +XuiInGameGamertags + + + + +XuiShowHints +300.000000 +20.000000 +9.000000,36.000000,0.000000 +5 +XuiCheckboxSmall +XuiViewBob +XuiShowTooltips + + + + +XuiViewBob +300.000000 +20.000000 +9.000000,8.000000,0.000000 +5 +XuiCheckboxSmall +XuiShowHints + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_signentry.h b/Minecraft.Client/Common/Media/xuiscene_signentry.h new file mode 100644 index 00000000..e1825936 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_signentry.h @@ -0,0 +1,8 @@ +#define IDC_BackgroundImage L"BackgroundImage" +#define IDC_EditLineOne L"EditLineOne" +#define IDC_EditLineTwo L"EditLineTwo" +#define IDC_EditLineThree L"EditLineThree" +#define IDC_EditLineFour L"EditLineFour" +#define IDC_ButtonDone L"ButtonDone" +#define IDC_EditSignMessage L"EditSignMessage" +#define IDC_SceneSignEntry L"SceneSignEntry" diff --git a/Minecraft.Client/Common/Media/xuiscene_signentry.xui b/Minecraft.Client/Common/Media/xuiscene_signentry.xui new file mode 100644 index 00000000..ab77aa1e --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_signentry.xui @@ -0,0 +1,110 @@ + + +1280.000000 +720.000000 + + + +SceneSignEntry +1280.000000 +720.000000 +CScene_SignEntry +XuiMenuScene +EditLineOne + + + +BackgroundImage +288.000000 +312.000000 +496.000000,200.000000,0.000000 +SignEntrySceneBackground + + + + +EditLineOne +268.000000 +42.000000 +506.000000,206.000000,0.000000 +CXuiCtrl4JEdit +XuiEditSign +EditLineTwo +EditLineTwo +ButtonDone +15 + !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_'abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø×ƒáíóúñѪº¿®¬½¼¡«»ã + + + + +EditLineTwo +268.000000 +42.000000 +506.000000,236.000000,0.000000 +CXuiCtrl4JEdit +XuiEditSign +EditLineOne +EditLineThree +EditLineThree +EditLineOne +15 + !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_'abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø×ƒáíóúñѪº¿®¬½¼¡«»ã + + + + +EditLineThree +268.000000 +42.000000 +506.000000,266.000000,0.000000 +CXuiCtrl4JEdit +XuiEditSign +EditLineTwo +EditLineFour +EditLineFour +EditLineTwo +15 + !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_'abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø×ƒáíóúñѪº¿®¬½¼¡«»ã + + + + +EditLineFour +268.000000 +42.000000 +506.000000,296.000000,0.000000 +CXuiCtrl4JEdit +XuiEditSign +EditLineThree +ButtonDone +ButtonDone +EditLineThree +15 + !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_'abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø×ƒáíóúñѪº¿®¬½¼¡«»ã + + + + +ButtonDone +400.000000 +40.000000 +440.000000,520.000000,0.000000 +XuiMainMenuButton_L +EditLineFour +EditLineOne +EditLineFour +22528 + + + + +EditSignMessage +372.000000 +47.000000 +454.000031,150.000000,0.000000 +XuiLabelLight_ShadowCentred + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_signentry_480.h b/Minecraft.Client/Common/Media/xuiscene_signentry_480.h new file mode 100644 index 00000000..e1825936 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_signentry_480.h @@ -0,0 +1,8 @@ +#define IDC_BackgroundImage L"BackgroundImage" +#define IDC_EditLineOne L"EditLineOne" +#define IDC_EditLineTwo L"EditLineTwo" +#define IDC_EditLineThree L"EditLineThree" +#define IDC_EditLineFour L"EditLineFour" +#define IDC_ButtonDone L"ButtonDone" +#define IDC_EditSignMessage L"EditSignMessage" +#define IDC_SceneSignEntry L"SceneSignEntry" diff --git a/Minecraft.Client/Common/Media/xuiscene_signentry_480.xui b/Minecraft.Client/Common/Media/xuiscene_signentry_480.xui new file mode 100644 index 00000000..64537c63 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_signentry_480.xui @@ -0,0 +1,110 @@ + + +640.000000 +480.000000 + + + +SceneSignEntry +640.000000 +480.000000 +CScene_SignEntry +XuiMenuScene +EditLineOne + + + +BackgroundImage +288.000000 +187.000000 +176.000000,140.000000,0.000000 +SignEntrySceneBackground + + + + +EditLineOne +266.000000 +42.000000 +187.000015,146.000000,0.000000 +CXuiCtrl4JEdit +XuiEditSign +EditLineTwo +EditLineTwo +ButtonDone +15 + !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_'abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø×ƒáíóúñѪº¿®¬½¼¡«»ã + + + + +EditLineTwo +266.000000 +42.000000 +187.000015,176.000000,0.000000 +CXuiCtrl4JEdit +XuiEditSign +EditLineOne +EditLineThree +EditLineThree +EditLineOne +15 + !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_'abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø×ƒáíóúñѪº¿®¬½¼¡«»ã + + + + +EditLineThree +266.000000 +42.000000 +187.000015,206.000000,0.000000 +CXuiCtrl4JEdit +XuiEditSign +EditLineTwo +EditLineFour +EditLineFour +EditLineTwo +15 + !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_'abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø×ƒáíóúñѪº¿®¬½¼¡«»ã + + + + +EditLineFour +266.000000 +42.000000 +187.000031,236.000000,0.000000 +CXuiCtrl4JEdit +XuiEditSign +EditLineThree +ButtonDone +ButtonDone +EditLineThree +15 + !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_'abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø×ƒáíóúñѪº¿®¬½¼¡«»ã + + + + +ButtonDone +300.000000 +36.000000 +170.000031,340.000000,0.000000 +XuiMainMenuButton_L_Thin +EditLineFour +EditLineOne +EditLineFour +22528 + + + + +EditSignMessage +372.000000 +47.000000 +134.000015,96.000000,0.000000 +XuiLabelLight_ShadowCentred + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_signentry_small.h b/Minecraft.Client/Common/Media/xuiscene_signentry_small.h new file mode 100644 index 00000000..e1825936 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_signentry_small.h @@ -0,0 +1,8 @@ +#define IDC_BackgroundImage L"BackgroundImage" +#define IDC_EditLineOne L"EditLineOne" +#define IDC_EditLineTwo L"EditLineTwo" +#define IDC_EditLineThree L"EditLineThree" +#define IDC_EditLineFour L"EditLineFour" +#define IDC_ButtonDone L"ButtonDone" +#define IDC_EditSignMessage L"EditSignMessage" +#define IDC_SceneSignEntry L"SceneSignEntry" diff --git a/Minecraft.Client/Common/Media/xuiscene_signentry_small.xui b/Minecraft.Client/Common/Media/xuiscene_signentry_small.xui new file mode 100644 index 00000000..82502f68 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_signentry_small.xui @@ -0,0 +1,109 @@ + + +640.000000 +360.000000 + + + +SceneSignEntry +640.000000 +360.000000 +CScene_SignEntry +XuiMenuScene +EditLineOne + + + +BackgroundImage +288.000000 +187.000000 +176.000000,45.000000,0.000000 +SignEntrySceneBackground + + + + +EditLineOne +266.200012 +28.000000 +186.900055,50.000000,0.000000 +CXuiCtrl4JEdit +XuiEditSign +EditLineTwo +EditLineTwo +ButtonDone +15 + !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_'abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø×ƒáíóúñѪº¿®¬½¼¡«»ã + + + + +EditLineTwo +266.200012 +28.000000 +186.900055,84.000000,0.000000 +CXuiCtrl4JEdit +XuiEditSign +EditLineOne +EditLineThree +EditLineThree +EditLineOne +15 + !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_'abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø×ƒáíóúñѪº¿®¬½¼¡«»ã + + + + +EditLineThree +266.200012 +28.000000 +186.900055,118.000000,0.000000 +CXuiCtrl4JEdit +XuiEditSign +EditLineTwo +EditLineFour +EditLineFour +EditLineTwo +15 + !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_'abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø×ƒáíóúñѪº¿®¬½¼¡«»ã + + + + +EditLineFour +266.200012 +28.000000 +186.900055,152.000000,0.000000 +CXuiCtrl4JEdit +XuiEditSign +EditLineThree +ButtonDone +ButtonDone +EditLineThree +15 + !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_'abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø×ƒáíóúñѪº¿®¬½¼¡«»ã + + + + +ButtonDone +300.000000 +40.000000 +170.000031,240.000000,0.000000 +XuiMainMenuButton_L +EditLineFour +EditLineOne +EditLineFour +22528 + + + + +EditSignMessage +447.000000 +96.000015,14.000000,0.000000 +XuiLabelLight_ShadowCentred + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_skinselect.h b/Minecraft.Client/Common/Media/xuiscene_skinselect.h new file mode 100644 index 00000000..525388bf --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_skinselect.h @@ -0,0 +1,45 @@ +#define IDC_BackgroundTint L"BackgroundTint" +#define IDC_CharacterPrevious4 L"CharacterPrevious4" +#define IDC_CharacterPrevious3 L"CharacterPrevious3" +#define IDC_CharacterPrevious2 L"CharacterPrevious2" +#define IDC_CharacterPrevious1 L"CharacterPrevious1" +#define IDC_CharacterNext4 L"CharacterNext4" +#define IDC_CharacterNext3 L"CharacterNext3" +#define IDC_CharacterNext2 L"CharacterNext2" +#define IDC_CharacterNext1 L"CharacterNext1" +#define IDC_Character L"Character" +#define IDC_Characters L"Characters" +#define IDC_Baseline L"Baseline" +#define IDC_Normal L"Normal" +#define IDC_BaselineSelected L"BaselineSelected" +#define IDC_NormalSelected L"NormalSelected" +#define IDC_Selected L"Selected" +#define IDC_TabBar L"TabBar" +#define IDC_Left L"Left" +#define IDC_Right L"Right" +#define IDC_Center L"Center" +#define IDC_PackGroup L"PackGroup" +#define IDC_SkinName L"SkinName" +#define IDC_OriginName L"OriginName" +#define IDC_SkinDetails L"SkinDetails" +#define IDC_Locked L"Locked" +#define IDC_SelectedText L"SelectedText" +#define IDC_SelectedGroup L"SelectedGroup" +#define IDC_Timer_Square_1 L"Timer_Square_1" +#define IDC_Timer_Square_2 L"Timer_Square_2" +#define IDC_Timer_Square_3 L"Timer_Square_3" +#define IDC_Timer_Square_4 L"Timer_Square_4" +#define IDC_Timer_Square_5 L"Timer_Square_5" +#define IDC_Timer_Square_6 L"Timer_Square_6" +#define IDC_Timer_Square_7 L"Timer_Square_7" +#define IDC_Timer_Square_8 L"Timer_Square_8" +#define IDC_Timer_Square_9 L"Timer_Square_9" +#define IDC_Timer_Square_10 L"Timer_Square_10" +#define IDC_Timer_Square_11 L"Timer_Square_11" +#define IDC_Timer_Square_12 L"Timer_Square_12" +#define IDC_Timer_Square_13 L"Timer_Square_13" +#define IDC_Timer_Square_14 L"Timer_Square_14" +#define IDC_Timer_Square_15 L"Timer_Square_15" +#define IDC_Timer_Square_16 L"Timer_Square_16" +#define IDC_Timer L"Timer" +#define IDC_SceneSkinSelect L"SceneSkinSelect" diff --git a/Minecraft.Client/Common/Media/xuiscene_skinselect.xui b/Minecraft.Client/Common/Media/xuiscene_skinselect.xui new file mode 100644 index 00000000..0d5019d4 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_skinselect.xui @@ -0,0 +1,1575 @@ + + +1280.000000 +720.000000 + + + +SceneSkinSelect +1280.000000 +720.000000 +CScene_SkinSelect +XuiBlankScene +SkinDetails + + + +BackgroundTint +1280.000000 +464.000000 +0.000000,142.000000,0.000000 + + +0xff0f0f80 + + + + +0x800f0f0f +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,1221.000000,0.000000,0,1221.000000,0.000000,1221.000000,0.000000,1221.000000,352.000000,0,1221.000000,352.000000,1221.000000,352.000000,0.000000,352.000000,0,0.000000,352.000000,0.000000,352.000000,0.000000,0.000000,0, + + + + +Characters +1280.000000 +350.000000 +0.000000,198.000000,0.000000 +XuiBlankScene + + + +CharacterPrevious4 +97.000000 +120.000000 +-83.999886,90.000046,0.000000 +15 +CXuiCtrlMinecraftSkinPreview + + + + +CharacterPrevious3 +122.000000 +150.000000 +23.000114,75.000046,0.000000 +15 +CXuiCtrlMinecraftSkinPreview + + + + +CharacterPrevious2 +153.000000 +188.000000 +155.000092,56.000046,0.000000 +15 +CXuiCtrlMinecraftSkinPreview + + + + +CharacterPrevious1 +192.000000 +235.000000 +318.000092,33.000046,0.000000 +15 +CXuiCtrlMinecraftSkinPreview + + + + +CharacterNext4 +97.000000 +120.000000 +1267.000000,90.000046,0.000000 +15 +CXuiCtrlMinecraftSkinPreview + + + + +CharacterNext3 +122.000000 +150.000000 +1135.000000,75.000046,0.000000 +15 +CXuiCtrlMinecraftSkinPreview + + + + +CharacterNext2 +153.000000 +188.000000 +971.999878,56.000046,0.000000 +15 +CXuiCtrlMinecraftSkinPreview + + + + +CharacterNext1 +192.000000 +235.000000 +769.999939,33.000046,0.000000 +15 +CXuiCtrlMinecraftSkinPreview + + + + +Character +240.000000 +294.000000 +520.000000,3.000046,0.000000 +15 +CXuiCtrlMinecraftSkinPreview + + + + + +Normal + +stop + + +CycleLeft + + + +EndCycleLeft + +stop + + +CycleRight + + + +EndCycleRight + +stop + + + +Character +Position +Width +Height + + +0 +520.000000,3.000046,0.000000 +240.000000 +294.000000 + + + +0 +520.000000,3.000046,0.000000 +240.000000 +294.000000 + + + +0 +318.000000,33.000046,0.000000 +192.000000 +235.000000 + + + +0 +520.000000,3.000046,0.000000 +240.000000 +294.000000 + + + +0 +770.000000,33.000046,0.000000 +192.000000 +235.000000 + + + +CharacterNext1 +Position +Width +Height + + +0 +769.999939,33.000046,0.000000 +192.000000 +235.000000 + + + +0 +769.999939,32.991196,0.000000 +192.000000 +235.000000 + + + +0 +520.000000,3.000046,0.000000 +240.000000 +294.000000 + + + +0 +769.999939,33.000046,0.000000 +192.000000 +235.000000 + + + +0 +972.000000,56.000046,0.000000 +153.000000 +188.000000 + + + +CharacterNext2 +Position +Width +Height + + +0 +971.999878,56.000046,0.000000 +153.000000 +188.000000 + + + +0 +971.999878,55.991196,0.000000 +153.000000 +188.000000 + + + +0 +770.000000,33.000046,0.000000 +192.000000 +235.000000 + + + +0 +971.999878,56.000046,0.000000 +153.000000 +188.000000 + + + +0 +1135.000000,75.000046,0.000000 +122.000000 +150.000000 + + + +CharacterNext3 +Position +Width +Height + + +0 +1135.000000,75.000046,0.000000 +122.000000 +150.000000 + + + +0 +1135.000000,74.991196,0.000000 +122.000000 +150.000000 + + + +0 +972.000000,56.000046,0.000000 +153.000000 +188.000000 + + + +0 +1135.000000,75.000046,0.000000 +122.000000 +150.000000 + + + +0 +1267.000000,90.000046,0.000000 +97.000000 +120.000000 + + + +CharacterNext4 +Position +Width +Height + + +0 +1267.000000,90.000046,0.000000 +97.000000 +120.000000 + + + +0 +1267.000000,89.991196,0.000000 +97.000000 +120.000000 + + + +0 +1135.000000,75.000046,0.000000 +122.000000 +150.000000 + + + +0 +1267.000000,90.000046,0.000000 +97.000000 +120.000000 + + + +0 +1555.000000,90.000046,0.000000 +97.000000 +120.000000 + + + +CharacterPrevious1 +Position +Width +Height + + +0 +318.000092,33.000046,0.000000 +192.000000 +235.000000 + + + +0 +318.000092,32.991196,0.000000 +192.000000 +235.000000 + + + +0 +155.000000,56.000046,0.000000 +153.000000 +188.000000 + + + +0 +318.000092,33.000046,0.000000 +192.000000 +235.000000 + + + +0 +520.000000,3.000046,0.000000 +240.000000 +294.000000 + + + +CharacterPrevious2 +Position +Width +Height + + +0 +155.000092,56.000046,0.000000 +153.000000 +188.000000 + + + +0 +155.000092,55.991196,0.000000 +153.000000 +188.000000 + + + +0 +23.000000,75.000046,0.000000 +122.000000 +150.000000 + + + +0 +155.000092,56.000046,0.000000 +153.000000 +188.000000 + + + +0 +318.000000,33.000046,0.000000 +192.000000 +235.000000 + + + +CharacterPrevious3 +Position +Width +Height + + +0 +23.000114,75.000046,0.000000 +122.000000 +150.000000 + + + +0 +23.000114,74.991196,0.000000 +122.000000 +150.000000 + + + +0 +-84.000000,90.000046,0.000000 +97.000000 +120.000000 + + + +0 +23.000114,75.000046,0.000000 +122.000000 +150.000000 + + + +0 +155.000000,56.000046,0.000000 +153.000000 +188.000000 + + + +CharacterPrevious4 +Position +Width +Height + + +0 +-83.999886,90.000046,0.000000 +97.000000 +120.000000 + + + +0 +-83.999886,89.991196,0.000000 +97.000000 +120.000000 + + + +0 +-310.999878,90.000046,0.000000 +97.000000 +120.000000 + + + +0 +-83.999886,90.000046,0.000000 +97.000000 +120.000000 + + + +0 +23.000000,75.000046,0.000000 +122.000000 +150.000000 + + + + + + +TabBar +1280.000000 +532.000000 +0.000000,90.000000,0.000000 +true + + + +Baseline +1680.000000 +62.000000 +-200.000000,460.000000,0.000000 +SkinSelectTabBarNormal + + + + +Normal +1280.000000 +62.000000 +SkinSelectTabBarNormal + + + + +Selected +1680.000000 +528.000000 +-200.000000,-0.000008,0.000000 + + + +BaselineSelected +1680.000000 +62.000000 +-0.000000,460.000000,0.000000 +SkinSelectTabBarSelected + + + + +NormalSelected +1280.000000 +62.000000 +200.000000,0.000000,0.000000 +SkinSelectTabBarSelected + + + + + + +PackGroup +1280.000000 +40.000000 +0.000000,90.000000,0.000000 +XuiBlankScene + + + +Left +348.000000 +42.000000 +104.000000,0.000003,0.000000 +XuiSkinPackButton +false + + + + +Right +348.000000 +42.000000 +828.000000,0.000003,0.000000 +XuiSkinPackButton +false + + + + +Center +348.000000 +42.000000 +466.000061,0.000003,0.000000 +XuiSkinPackButtonCenter + + + + + +SkinDetails +380.000000 +50.000000 +450.000000,524.000000,0.000000 +XuiSkinSelectSectionBackground + + + +SkinName +340.000000 +25.000000 +20.000000,2.000000,0.000000 +5 +XuiLabelLight_ShadowCentred + + + + +OriginName +340.000000 +25.000000 +20.000000,22.000000,0.000000 +5 +XuiLabelLight_ShadowCentred + + + + + +Selected + +stop + + +Unselected + +stop + + + +OriginName +Visual + + +0 +XuiLabelLight_ShadowCentred + + + +0 +XuiLabelLightFaded_ShadowCentred + + + +SkinName +Visual + + +0 +XuiLabelLight_ShadowCentred + + + +0 +XuiLabelLightFaded_ShadowCentred + + + + + + +Locked +32.000000 +32.000000 +794.000000,532.000000,0.000000 +SkinSelectPadlock + + + + +SelectedGroup +224.000000 +32.000000 +528.000000,479.999969,0.000000 +SkinSelectSelectedBackground + + + +SelectedText +150.000000 +24.000000 +37.000011,4.000000,0.000000 +5 +XuiLabelLightCentred + + + + + +Timer +184.000000 +170.000000 +548.000061,290.000000,0.000000 +XuiBlankScene + + + +Timer_Square_1 +42.000000 +42.000000 +14.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_2 +42.000000 +42.000000 +68.499985,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_3 +42.000000 +42.000000 +123.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_4 +42.000000 +42.000000 +123.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_5 +42.000000 +42.000000 +123.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_6 +42.000000 +42.000000 +68.499985,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_7 +42.000000 +42.000000 +14.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_8 +42.000000 +42.000000 +14.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_9 +42.000000 +42.000000 +14.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_10 +42.000000 +42.000000 +68.499985,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_11 +42.000000 +42.000000 +123.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_12 +42.000000 +42.000000 +123.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_13 +42.000000 +42.000000 +123.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_14 +42.000000 +42.000000 +68.499985,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_15 +42.000000 +42.000000 +14.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_16 +42.000000 +42.000000 +14.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + + +LoadStart + + + +LoopStart + + + +LoopEnd + +gotoandplay +LoopStart + + + +Timer_Square_1 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_3 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_8 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_4 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_7 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_6 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_5 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_2 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_9 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_10 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_11 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_12 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_13 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_14 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x07ebebeb + + + +Timer_Square_15 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x49ebebeb + + + +Timer_Square_16 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x8cebebeb + + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_skinselect_480.h b/Minecraft.Client/Common/Media/xuiscene_skinselect_480.h new file mode 100644 index 00000000..4f75dd27 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_skinselect_480.h @@ -0,0 +1,45 @@ +#define IDC_BackgroundTint L"BackgroundTint" +#define IDC_CharacterPrevious4 L"CharacterPrevious4" +#define IDC_CharacterPrevious3 L"CharacterPrevious3" +#define IDC_CharacterPrevious2 L"CharacterPrevious2" +#define IDC_CharacterPrevious1 L"CharacterPrevious1" +#define IDC_CharacterNext4 L"CharacterNext4" +#define IDC_CharacterNext3 L"CharacterNext3" +#define IDC_CharacterNext2 L"CharacterNext2" +#define IDC_CharacterNext1 L"CharacterNext1" +#define IDC_Character L"Character" +#define IDC_Characters L"Characters" +#define IDC_Baseline L"Baseline" +#define IDC_Normal L"Normal" +#define IDC_BaselineSelected L"BaselineSelected" +#define IDC_NormalSelected L"NormalSelected" +#define IDC_Selected L"Selected" +#define IDC_TabBar L"TabBar" +#define IDC_Left L"Left" +#define IDC_Right L"Right" +#define IDC_Center L"Center" +#define IDC_PackGroup L"PackGroup" +#define IDC_OriginName L"OriginName" +#define IDC_SkinName L"SkinName" +#define IDC_SkinDetails L"SkinDetails" +#define IDC_Locked L"Locked" +#define IDC_SelectedText L"SelectedText" +#define IDC_SelectedGroup L"SelectedGroup" +#define IDC_Timer_Square_1 L"Timer_Square_1" +#define IDC_Timer_Square_2 L"Timer_Square_2" +#define IDC_Timer_Square_3 L"Timer_Square_3" +#define IDC_Timer_Square_4 L"Timer_Square_4" +#define IDC_Timer_Square_5 L"Timer_Square_5" +#define IDC_Timer_Square_6 L"Timer_Square_6" +#define IDC_Timer_Square_7 L"Timer_Square_7" +#define IDC_Timer_Square_8 L"Timer_Square_8" +#define IDC_Timer_Square_9 L"Timer_Square_9" +#define IDC_Timer_Square_10 L"Timer_Square_10" +#define IDC_Timer_Square_11 L"Timer_Square_11" +#define IDC_Timer_Square_12 L"Timer_Square_12" +#define IDC_Timer_Square_13 L"Timer_Square_13" +#define IDC_Timer_Square_14 L"Timer_Square_14" +#define IDC_Timer_Square_15 L"Timer_Square_15" +#define IDC_Timer_Square_16 L"Timer_Square_16" +#define IDC_Timer L"Timer" +#define IDC_SceneSkinSelect480 L"SceneSkinSelect480" diff --git a/Minecraft.Client/Common/Media/xuiscene_skinselect_480.xui b/Minecraft.Client/Common/Media/xuiscene_skinselect_480.xui new file mode 100644 index 00000000..3479feac --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_skinselect_480.xui @@ -0,0 +1,1574 @@ + + +640.000000 +480.000000 + + + +SceneSkinSelect480 +640.000000 +480.000000 +CScene_SkinSelect +XuiBlankScene +SkinDetails + + + +BackgroundTint +640.000000 +284.000000 +0.000000,102.000000,0.000000 + + +0xff0f0f80 + + + + +0x800f0f0f +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,1221.000000,0.000000,0,1221.000000,0.000000,1221.000000,0.000000,1221.000000,352.000000,0,1221.000000,352.000000,1221.000000,352.000000,0.000000,352.000000,0,0.000000,352.000000,0.000000,352.000000,0.000000,0.000000,0, + + + + +Characters +640.000000 +210.000000 +0.000000,135.000000,0.000000 +XuiBlankScene + + + +CharacterPrevious4 +49.000000 +60.000000 +-63.000000,46.000000,0.000000 +15 +CXuiCtrlMinecraftSkinPreview + + + + +CharacterPrevious3 +61.000000 +75.000000 +-4.000000,39.000000,0.000000 +15 +CXuiCtrlMinecraftSkinPreview + + + + +CharacterPrevious2 +77.000000 +94.000000 +67.000000,29.000000,0.000000 +15 +CXuiCtrlMinecraftSkinPreview + + + + +CharacterPrevious1 +96.000000 +118.000000 +154.000000,17.000000,0.000000 +15 +CXuiCtrlMinecraftSkinPreview + + + + +CharacterNext4 +49.000000 +60.000000 +654.000000,46.000000,0.000000 +15 +CXuiCtrlMinecraftSkinPreview + + + + +CharacterNext3 +61.000000 +75.000000 +583.000000,39.000000,0.000000 +15 +CXuiCtrlMinecraftSkinPreview + + + + +CharacterNext2 +77.000000 +94.000000 +496.000000,29.000000,0.000000 +15 +CXuiCtrlMinecraftSkinPreview + + + + +CharacterNext1 +96.000000 +118.000000 +390.000000,17.000000,0.000000 +15 +CXuiCtrlMinecraftSkinPreview + + + + +Character +120.000000 +147.000000 +260.000000,3.000000,0.000000 +15 +CXuiCtrlMinecraftSkinPreview + + + + + +Normal + +stop + + +CycleLeft + + + +EndCycleLeft + +stop + + +CycleRight + + + +EndCycleRight + +stop + + + +Character +Position +Width +Height + + +0 +260.000000,3.000000,0.000000 +120.000000 +147.000000 + + + +0 +260.000000,3.000000,0.000000 +120.000000 +147.000000 + + + +0 +154.000000,17.000000,0.000000 +96.000000 +118.000000 + + + +0 +260.000000,3.000000,0.000000 +120.000000 +147.000000 + + + +0 +390.000000,17.000000,0.000000 +96.000000 +118.000000 + + + +CharacterNext1 +Position +Width +Height + + +0 +390.000000,17.000000,0.000000 +96.000000 +118.000000 + + + +0 +390.000000,17.000000,0.000000 +96.000000 +118.000000 + + + +0 +260.000000,3.000000,0.000000 +120.000000 +147.000000 + + + +0 +390.000000,17.000000,0.000000 +96.000000 +118.000000 + + + +0 +496.000000,29.000000,0.000000 +77.000000 +94.000000 + + + +CharacterNext2 +Position +Width +Height + + +0 +496.000000,29.000000,0.000000 +77.000000 +94.000000 + + + +0 +496.000000,29.000000,0.000000 +77.000000 +94.000000 + + + +0 +390.000000,17.000000,0.000000 +96.000000 +118.000000 + + + +0 +496.000000,29.000000,0.000000 +77.000000 +94.000000 + + + +0 +583.000000,39.000000,0.000000 +61.000000 +75.000000 + + + +CharacterNext3 +Position +Width +Height + + +0 +583.000000,39.000000,0.000000 +61.000000 +75.000000 + + + +0 +583.000000,39.000000,0.000000 +61.000000 +75.000000 + + + +0 +496.000000,29.000000,0.000000 +77.000000 +94.000000 + + + +0 +583.000000,39.000000,0.000000 +61.000000 +75.000000 + + + +0 +654.000000,46.000000,0.000000 +49.000000 +60.000000 + + + +CharacterNext4 +Position +Width +Height + + +0 +654.000000,46.000000,0.000000 +49.000000 +60.000000 + + + +0 +654.000000,46.000000,0.000000 +49.000000 +60.000000 + + + +0 +583.000000,39.000000,0.000000 +61.000000 +75.000000 + + + +0 +654.000000,46.000000,0.000000 +49.000000 +60.000000 + + + +0 +654.000000,46.000000,0.000000 +49.000000 +60.000000 + + + +CharacterPrevious1 +Position +Width +Height + + +0 +154.000000,17.000000,0.000000 +96.000000 +118.000000 + + + +0 +154.000000,17.000000,0.000000 +96.000000 +118.000000 + + + +0 +67.000000,29.000000,0.000000 +77.000000 +94.000000 + + + +0 +154.000000,17.000000,0.000000 +96.000000 +118.000000 + + + +0 +260.000000,3.000000,0.000000 +120.000000 +147.000000 + + + +CharacterPrevious2 +Position +Width +Height + + +0 +67.000000,29.000000,0.000000 +77.000000 +94.000000 + + + +0 +67.000000,29.000000,0.000000 +77.000000 +94.000000 + + + +0 +-4.000000,39.000000,0.000000 +61.000000 +75.000000 + + + +0 +67.000000,29.000000,0.000000 +77.000000 +94.000000 + + + +0 +154.000000,17.000000,0.000000 +96.000000 +118.000000 + + + +CharacterPrevious3 +Position +Width +Height + + +0 +-4.000000,39.000000,0.000000 +61.000000 +75.000000 + + + +0 +-4.000000,39.000000,0.000000 +61.000000 +75.000000 + + + +0 +-63.000000,46.000000,0.000000 +49.000000 +60.000000 + + + +0 +-4.000000,39.000000,0.000000 +61.000000 +75.000000 + + + +0 +67.000000,29.000000,0.000000 +77.000000 +94.000000 + + + +CharacterPrevious4 +Position +Width +Height + + +0 +-63.000000,46.000000,0.000000 +49.000000 +60.000000 + + + +0 +-63.000000,46.000000,0.000000 +49.000000 +60.000000 + + + +0 +-63.000000,46.000000,0.000000 +49.000000 +60.000000 + + + +0 +-63.000000,46.000000,0.000000 +49.000000 +60.000000 + + + +0 +-4.000000,39.000000,0.000000 +61.000000 +75.000000 + + + + + + +TabBar +640.000000 +348.833313 +0.000000,66.000000,0.000000 +true + + + +Baseline +780.000000 +44.000000 +-70.000000,284.000000,0.000000 +SkinSelectTabBarNormalSmall + + + + +Normal +640.000000 +44.000000 +SkinSelectTabBarNormalSmall + + + + +Selected +779.999939 +327.999969 +-69.999992,-0.000008,0.000000 + + + +BaselineSelected +780.000000 +44.000000 +-0.000000,284.000000,0.000000 +SkinSelectTabBarSelectedSmall + + + + +NormalSelected +640.000000 +44.000000 +70.000000,0.000000,0.000000 +SkinSelectTabBarSelectedSmall + + + + + + +PackGroup +640.000000 +40.000000 +0.000000,62.000000,0.000000 +XuiBlankScene + + + +Left +180.000000 +31.000000 +50.000031,4.000003,0.000000 +XuiSkinPackButtonSmall +false + + + + +Right +180.000000 +31.000000 +409.000031,4.000003,0.000000 +XuiSkinPackButtonSmall +false + + + + +Center +180.000000 +40.000000 +230.000092,-1.999997,0.000000 +XuiSkinPackButtonCentreSmall + + + + + +SkinDetails +380.000000 +54.000000 +130.000046,315.000000,0.000000 +XuiSkinSelectSectionBackground + + + +OriginName +368.000000 +25.000000 +6.000061,22.000000,0.000000 +5 +XuiLabelLight_C_ShadowedSmall + + + + +SkinName +368.000000 +25.000000 +6.000061,0.000000,0.000000 +5 +XuiLabelLight_C_ShadowedSmall + + + + + +Selected + +stop + + +Unselected + +stop + + + +SkinName +Visual + + +0 +XuiLabelLight_C_ShadowedSmall + + + +0 +XuiLabelLightFaded_C_ShadowedSmall + + + +OriginName +Visual + + +0 +XuiLabelLight_C_ShadowedSmall + + + +0 +XuiLabelLightFaded_C_ShadowedSmall + + + + + + +Locked +32.000000 +32.000000 +475.000000,328.000000,0.000000 +SkinSelectPadlock + + + + +SelectedGroup +224.000000 +25.000000 +208.000015,276.000000,0.000000 +SkinSelectSelectedBackgroundSmall + + + +SelectedText +150.000000 +20.000000 +37.000011,3.000000,0.000000 +5 +XuiLabelListening_Small + + + + + +Timer +72.000000 +72.000000 +284.000031,210.000000,0.000000 +15 +XuiBlankScene + + + +Timer_Square_1 +21.000000 +21.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_2 +21.000000 +21.000000 +25.000000,0.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_3 +21.000000 +21.000000 +50.000000,0.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_4 +21.000000 +21.000000 +50.000000,25.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_5 +21.000000 +21.000000 +50.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_6 +21.000000 +21.000000 +25.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_7 +21.000000 +21.000000 +0.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_8 +21.000000 +21.000000 +0.000000,25.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_9 +21.000000 +21.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_10 +21.000000 +21.000000 +25.000000,0.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_11 +21.000000 +21.000000 +50.000000,0.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_12 +21.000000 +21.000000 +50.000000,25.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_13 +21.000000 +21.000000 +50.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_14 +21.000000 +21.000000 +25.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_15 +21.000000 +21.000000 +0.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_16 +21.000000 +21.000000 +0.000000,25.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + + +LoadStart + + + +LoopStart + + + +LoopEnd + +gotoandplay +LoopStart + + + +Timer_Square_1 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_3 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_8 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_4 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_7 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_6 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_5 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_2 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_9 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_10 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_11 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_12 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_13 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_14 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x07ebebeb + + + +Timer_Square_15 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x49ebebeb + + + +Timer_Square_16 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x8cebebeb + + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_skinselect_small.h b/Minecraft.Client/Common/Media/xuiscene_skinselect_small.h new file mode 100644 index 00000000..9ead89bd --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_skinselect_small.h @@ -0,0 +1,42 @@ +#define IDC_BackgroundTint L"BackgroundTint" +#define IDC_CharacterPrevious4 L"CharacterPrevious4" +#define IDC_CharacterPrevious3 L"CharacterPrevious3" +#define IDC_CharacterPrevious2 L"CharacterPrevious2" +#define IDC_CharacterPrevious1 L"CharacterPrevious1" +#define IDC_CharacterNext4 L"CharacterNext4" +#define IDC_CharacterNext3 L"CharacterNext3" +#define IDC_CharacterNext2 L"CharacterNext2" +#define IDC_CharacterNext1 L"CharacterNext1" +#define IDC_Character L"Character" +#define IDC_Characters L"Characters" +#define IDC_Normal L"Normal" +#define IDC_Selected L"Selected" +#define IDC_TabBar L"TabBar" +#define IDC_Left L"Left" +#define IDC_Right L"Right" +#define IDC_Center L"Center" +#define IDC_PackGroup L"PackGroup" +#define IDC_SkinName L"SkinName" +#define IDC_OriginName L"OriginName" +#define IDC_SkinDetails L"SkinDetails" +#define IDC_Locked L"Locked" +#define IDC_SelectedText L"SelectedText" +#define IDC_SelectedGroup L"SelectedGroup" +#define IDC_Timer_Square_1 L"Timer_Square_1" +#define IDC_Timer_Square_2 L"Timer_Square_2" +#define IDC_Timer_Square_3 L"Timer_Square_3" +#define IDC_Timer_Square_4 L"Timer_Square_4" +#define IDC_Timer_Square_5 L"Timer_Square_5" +#define IDC_Timer_Square_6 L"Timer_Square_6" +#define IDC_Timer_Square_7 L"Timer_Square_7" +#define IDC_Timer_Square_8 L"Timer_Square_8" +#define IDC_Timer_Square_9 L"Timer_Square_9" +#define IDC_Timer_Square_10 L"Timer_Square_10" +#define IDC_Timer_Square_11 L"Timer_Square_11" +#define IDC_Timer_Square_12 L"Timer_Square_12" +#define IDC_Timer_Square_13 L"Timer_Square_13" +#define IDC_Timer_Square_14 L"Timer_Square_14" +#define IDC_Timer_Square_15 L"Timer_Square_15" +#define IDC_Timer_Square_16 L"Timer_Square_16" +#define IDC_Timer L"Timer" +#define IDC_SceneSkinSelectSmall L"SceneSkinSelectSmall" diff --git a/Minecraft.Client/Common/Media/xuiscene_skinselect_small.xui b/Minecraft.Client/Common/Media/xuiscene_skinselect_small.xui new file mode 100644 index 00000000..a5ecf235 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_skinselect_small.xui @@ -0,0 +1,1656 @@ + + +640.000000 +360.000000 + + + +SceneSkinSelectSmall +640.000000 +360.000000 +CScene_SkinSelect +XuiBlankScene +SkinDetails + + + +BackgroundTint +570.000000 +220.000000 +35.000031,62.000000,0.000000 + + +0xff0f0f80 + + + + +0x800f0f0f +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,1221.000000,0.000000,0,1221.000000,0.000000,1221.000000,0.000000,1221.000000,352.000000,0,1221.000000,352.000000,1221.000000,352.000000,0.000000,352.000000,0,0.000000,352.000000,0.000000,352.000000,0.000000,0.000000,0, + + + + +Characters +570.000000 +210.000000 +35.000031,68.000000,0.000000 +true +XuiBlankScene + + + +CharacterPrevious4 +49.000000 +60.000000 +-98.000000,66.000000,0.000000 +0.000000 +CXuiCtrlMinecraftSkinPreview + + + + +CharacterPrevious3 +61.000000 +75.000000 +-39.000000,59.000000,0.000000 +0.250000 +CXuiCtrlMinecraftSkinPreview + + + + +CharacterPrevious2 +77.000000 +94.000000 +32.000000,49.000000,0.000000 +0.500000 +CXuiCtrlMinecraftSkinPreview + + + + +CharacterPrevious1 +96.000000 +118.000000 +119.000000,37.000000,0.000000 +0.750000 +CXuiCtrlMinecraftSkinPreview + + + + +CharacterNext4 +49.000000 +60.000000 +619.000000,66.000000,0.000000 +0.000000 +CXuiCtrlMinecraftSkinPreview + + + + +CharacterNext3 +61.000000 +75.000000 +548.000000,59.000000,0.000000 +0.250000 +CXuiCtrlMinecraftSkinPreview + + + + +CharacterNext2 +77.000000 +94.000000 +461.000000,49.000000,0.000000 +0.500000 +CXuiCtrlMinecraftSkinPreview + + + + +CharacterNext1 +96.000000 +118.000000 +355.000000,37.000000,0.000000 +0.750000 +CXuiCtrlMinecraftSkinPreview + + + + +Character +120.000000 +147.000000 +225.000000,23.000000,0.000000 +CXuiCtrlMinecraftSkinPreview + + + + + +Normal + +stop + + +CycleLeft + + + +EndCycleLeft + +stop + + +CycleRight + + + +EndCycleRight + +stop + + + +Character +Position +Width +Height +Opacity +Anchor + + +0 +225.000000,23.000000,0.000000 +120.000000 +147.000000 +1.000000 +0 + + + +0 +225.000031,23.000000,0.000000 +120.000000 +147.000000 +1.000000 +0 + + + +0 +119.000000,37.000000,0.000000 +96.000000 +118.000000 +0.750000 +15 + + + +0 +225.000000,23.000000,0.000000 +120.000000 +147.000000 +1.000000 +0 + + + +0 +355.000000,37.000000,0.000000 +96.000000 +118.000000 +0.750000 +0 + + + +CharacterNext1 +Position +Width +Height +Opacity +Anchor + + +0 +355.000000,37.000000,0.000000 +96.000000 +118.000000 +0.750000 +0 + + + +0 +355.000031,37.000000,0.000000 +96.000000 +118.000000 +0.750000 +0 + + + +0 +225.000000,23.000000,0.000000 +120.000000 +147.000000 +1.000000 +15 + + + +0 +355.000000,37.000000,0.000000 +96.000000 +118.000000 +0.750000 +0 + + + +0 +461.000000,49.000000,0.000000 +77.000000 +94.000000 +0.500000 +0 + + + +CharacterNext2 +Position +Width +Height +Opacity +Anchor + + +0 +461.000000,49.000000,0.000000 +77.000000 +94.000000 +0.500000 +0 + + + +0 +461.000031,49.000000,0.000000 +77.000000 +94.000000 +0.500000 +0 + + + +0 +355.000000,37.000000,0.000000 +96.000000 +118.000000 +0.750000 +15 + + + +0 +461.000000,49.000000,0.000000 +77.000000 +94.000000 +0.500000 +0 + + + +0 +548.000000,59.000000,0.000000 +61.000000 +75.000000 +0.250000 +0 + + + +CharacterNext3 +Position +Width +Height +Opacity +Anchor + + +0 +548.000000,59.000000,0.000000 +61.000000 +75.000000 +0.250000 +0 + + + +0 +548.000000,59.000000,0.000000 +61.000000 +75.000000 +0.250000 +0 + + + +0 +461.000000,49.000000,0.000000 +77.000000 +94.000000 +0.500000 +15 + + + +0 +548.000000,59.000000,0.000000 +61.000000 +75.000000 +0.250000 +0 + + + +0 +619.000000,66.000000,0.000000 +49.000000 +60.000000 +0.000000 +0 + + + +CharacterNext4 +Position +Width +Height +Opacity +Anchor + + +0 +619.000000,66.000000,0.000000 +49.000000 +60.000000 +0.000000 +0 + + + +0 +619.000000,66.000000,0.000000 +49.000000 +60.000000 +0.000000 +0 + + + +0 +548.000000,59.000000,0.000000 +61.000000 +75.000000 +0.250000 +15 + + + +0 +619.000000,66.000000,0.000000 +49.000000 +60.000000 +0.000000 +0 + + + +0 +619.000000,66.000000,0.000000 +49.000000 +60.000000 +0.000000 +0 + + + +CharacterPrevious1 +Position +Width +Height +Opacity +Anchor + + +0 +119.000000,37.000000,0.000000 +96.000000 +118.000000 +0.750000 +0 + + + +0 +119.000031,37.000000,0.000000 +96.000000 +118.000000 +0.750000 +0 + + + +0 +32.000000,49.000000,0.000000 +77.000000 +94.000000 +0.500000 +37 + + + +0 +119.000000,37.000000,0.000000 +96.000000 +118.000000 +0.750000 +0 + + + +0 +225.000000,23.000000,0.000000 +120.000000 +147.000000 +1.000000 +0 + + + +CharacterPrevious2 +Position +Width +Height +Opacity +Anchor + + +0 +32.000000,49.000000,0.000000 +77.000000 +94.000000 +0.500000 +0 + + + +0 +32.000027,49.000000,0.000000 +77.000000 +94.000000 +0.500000 +0 + + + +0 +-39.000000,59.000000,0.000000 +61.000000 +75.000000 +0.250000 +15 + + + +0 +32.000000,49.000000,0.000000 +77.000000 +94.000000 +0.500000 +0 + + + +0 +119.000000,37.000000,0.000000 +96.000000 +118.000000 +0.750000 +0 + + + +CharacterPrevious3 +Position +Width +Height +Opacity +Anchor + + +0 +-39.000000,59.000000,0.000000 +61.000000 +75.000000 +0.250000 +0 + + + +0 +-38.999973,59.000000,0.000000 +61.000000 +75.000000 +0.250000 +0 + + + +0 +-98.000000,66.000000,0.000000 +49.000000 +60.000000 +0.000000 +15 + + + +0 +-39.000000,59.000000,0.000000 +61.000000 +75.000000 +0.250000 +0 + + + +0 +32.000000,49.000000,0.000000 +77.000000 +94.000000 +0.500000 +0 + + + +CharacterPrevious4 +Position +Width +Height +Opacity +Anchor + + +0 +-98.000000,66.000000,0.000000 +49.000000 +60.000000 +0.000000 +0 + + + +0 +-97.999969,66.000000,0.000000 +49.000000 +60.000000 +0.000000 +0 + + + +0 +-98.000000,66.000000,0.000000 +49.000000 +60.000000 +0.000000 +15 + + + +0 +-98.000000,66.000000,0.000000 +49.000000 +60.000000 +0.000000 +0 + + + +0 +-39.000000,59.000000,0.000000 +61.000000 +75.000000 +0.250000 +0 + + + + + + +TabBar +580.000000 +270.000000 +30.000032,21.000000,0.000000 +15 + + + +Normal +580.000000 +270.000000 +SkinSelectTabNormalSmall + + + + +Selected +580.000000 +270.000000 +SkinSelectTabSelectedSmall + + + + + +PackGroup +640.000000 +40.000000 +0.000032,15.000000,0.000000 +XuiBlankScene + + + +Left +180.000000 +31.000000 +50.000031,5.000003,0.000000 +XuiSkinPackButtonSmall +false + + + + +Right +180.000000 +31.000000 +409.000031,5.000003,0.000000 +XuiSkinPackButtonSmall +false + + + + +Center +180.000000 +40.000000 +230.000092,0.000003,0.000000 +XuiSkinPackButtonCentreSmall + + + + + +SkinDetails +380.000000 +48.000000 +130.000046,219.000000,0.000000 +XuiSkinSelectSBckgrndSmall + + + +SkinName +368.000000 +22.000000 +6.000061,-2.000000,0.000000 +5 +XuiLabelLight_C_ShadowedSmall + + + + +OriginName +368.000000 +22.000000 +6.000061,18.000000,0.000000 +5 +XuiLabelLight_C_ShadowedSmall + + + + + +Selected + +stop + + +Unselected + +stop + + + +OriginName +Visual + + +0 +XuiLabelLight_C_ShadowedSmall + + + +0 +XuiLabelLightFaded_C_ShadowedSmall + + + +SkinName +Visual + + +0 +XuiLabelLight_C_ShadowedSmall + + + +0 +XuiLabelLightFaded_C_ShadowedSmall + + + + + + +Locked +32.000000 +32.000000 +471.000000,227.000000,0.000000 +SkinSelectPadlock + + + + +SelectedGroup +224.000000 +25.000000 +208.000015,187.000000,0.000000 +SkinSelectSelectedBackgroundSmall + + + +SelectedText +150.000000 +20.000000 +37.000011,3.000000,0.000000 +5 +XuiLabelListening_Small + + + + + +Timer +72.000000 +72.000000 +284.000031,130.000000,0.000000 +15 +false +XuiBlankScene + + + +Timer_Square_1 +21.000000 +21.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_2 +21.000000 +21.000000 +25.000000,0.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_3 +21.000000 +21.000000 +50.000000,0.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_4 +21.000000 +21.000000 +50.000000,25.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_5 +21.000000 +21.000000 +50.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_6 +21.000000 +21.000000 +25.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_7 +21.000000 +21.000000 +0.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_8 +21.000000 +21.000000 +0.000000,25.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_9 +21.000000 +21.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_10 +21.000000 +21.000000 +25.000000,0.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_11 +21.000000 +21.000000 +50.000000,0.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_12 +21.000000 +21.000000 +50.000000,25.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_13 +21.000000 +21.000000 +50.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_14 +21.000000 +21.000000 +25.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_15 +21.000000 +21.000000 +0.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_16 +21.000000 +21.000000 +0.000000,25.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + + +LoadStart + + + +LoopStart + + + +LoopEnd + +gotoandplay +LoopStart + + + +Timer_Square_1 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_3 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_8 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_4 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_7 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_6 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_5 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_2 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_9 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_10 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_11 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_12 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_13 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_14 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x07ebebeb + + + +Timer_Square_15 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x49ebebeb + + + +Timer_Square_16 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x8cebebeb + + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_socialpost.h b/Minecraft.Client/Common/Media/xuiscene_socialpost.h new file mode 100644 index 00000000..550668e7 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_socialpost.h @@ -0,0 +1,7 @@ +#define IDC_XuiOK L"XuiOK" +#define IDC_XuiEditDescription L"XuiEditDescription" +#define IDC_XuiLabelDescription L"XuiLabelDescription" +#define IDC_XuiEditCaption L"XuiEditCaption" +#define IDC_XuiLabelCaption L"XuiLabelCaption" +#define IDC_XuiLabelText L"XuiLabelText" +#define IDC_SceneSocialPost L"SceneSocialPost" diff --git a/Minecraft.Client/Common/Media/xuiscene_socialpost.xui b/Minecraft.Client/Common/Media/xuiscene_socialpost.xui new file mode 100644 index 00000000..a67f038a --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_socialpost.xui @@ -0,0 +1,88 @@ + + +1280.000000 +720.000000 + + + +SceneSocialPost +450.000000 +335.000000 +415.000000,204.000000,0.000000 +CScene_SocialPost +GraphicPanel +SceneNewWorld\XuiEditWorldName +SceneNewWorld\XuiNewWorld +XuiEditCaption + + + +XuiOK +382.000000 +40.000000 +34.000000,268.000000,0.000000 +XuiMainMenuButton_L +XuiEditDescription +XuiDescription +22528 + + + + +XuiEditDescription +376.000000 +32.000000 +37.000000,198.000000,0.000000 +CXuiCtrl4JEdit +XuiEdit +XuiEditCaption +XuiOK +XuiOK +XuiEditCaption +100 + + + + +XuiLabelDescription +380.000000 +26.000000 +35.000000,172.000000,0.000000 +XuiLabelDarkLeftWrap + + + + +XuiEditCaption +376.000000 +32.000000 +37.000000,124.000000,0.000000 +CXuiCtrl4JEdit +XuiEdit +XuiEditTitle +XuiEditDescription +XuiEditTitle +XuiDescription +60 + + + + +XuiLabelCaption +380.000000 +26.000000 +35.000000,98.000000,0.000000 +XuiLabelDarkLeftWrap + + + + +XuiLabelText +380.000000 +80.000000 +35.000000,20.000000,0.000000 +XuiLabelDarkLeftWrap16 + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_socialpost_480.h b/Minecraft.Client/Common/Media/xuiscene_socialpost_480.h new file mode 100644 index 00000000..550668e7 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_socialpost_480.h @@ -0,0 +1,7 @@ +#define IDC_XuiOK L"XuiOK" +#define IDC_XuiEditDescription L"XuiEditDescription" +#define IDC_XuiLabelDescription L"XuiLabelDescription" +#define IDC_XuiEditCaption L"XuiEditCaption" +#define IDC_XuiLabelCaption L"XuiLabelCaption" +#define IDC_XuiLabelText L"XuiLabelText" +#define IDC_SceneSocialPost L"SceneSocialPost" diff --git a/Minecraft.Client/Common/Media/xuiscene_socialpost_480.xui b/Minecraft.Client/Common/Media/xuiscene_socialpost_480.xui new file mode 100644 index 00000000..04d5eb17 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_socialpost_480.xui @@ -0,0 +1,87 @@ + + +640.000000 +480.000000 + + + +SceneSocialPost +354.000000 +267.000000 +143.000000,123.000000,0.000000 +CScene_SocialPost +GraphicPanel +SceneNewWorld\XuiEditWorldName +SceneNewWorld\XuiNewWorld +XuiEditCaption + + + +XuiOK +304.000000 +36.000000 +25.000000,211.000000,0.000000 +XuiMainMenuButton_L_Thin +XuiEditDescription +XuiDescription +22528 + + + + +XuiEditDescription +300.000000 +27.000000,156.000000,0.000000 +CXuiCtrl4JEdit +XuiEdit +XuiEditCaption +XuiOK +XuiOK +XuiEditCaption +100 + + + + +XuiLabelDescription +300.000000 +20.000000 +27.000000,133.000000,0.000000 +XuiLabelDarkLeftWrapSmall + + + + +XuiEditCaption +300.000000 +27.000000,93.000000,0.000000 +CXuiCtrl4JEdit +XuiEdit +XuiEditTitle +XuiEditDescription +XuiEditTitle +XuiDescription +60 + + + + +XuiLabelCaption +300.000000 +20.000000 +27.000000,69.000000,0.000000 +XuiLabelDarkLeftWrapSmall + + + + +XuiLabelText +300.000000 +57.999992 +27.000000,9.000000,0.000000 +XuiLabelDarkLeftWrapSmall +false + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_socialpost_small.h b/Minecraft.Client/Common/Media/xuiscene_socialpost_small.h new file mode 100644 index 00000000..550668e7 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_socialpost_small.h @@ -0,0 +1,7 @@ +#define IDC_XuiOK L"XuiOK" +#define IDC_XuiEditDescription L"XuiEditDescription" +#define IDC_XuiLabelDescription L"XuiLabelDescription" +#define IDC_XuiEditCaption L"XuiEditCaption" +#define IDC_XuiLabelCaption L"XuiLabelCaption" +#define IDC_XuiLabelText L"XuiLabelText" +#define IDC_SceneSocialPost L"SceneSocialPost" diff --git a/Minecraft.Client/Common/Media/xuiscene_socialpost_small.xui b/Minecraft.Client/Common/Media/xuiscene_socialpost_small.xui new file mode 100644 index 00000000..25294893 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_socialpost_small.xui @@ -0,0 +1,88 @@ + + +640.000000 +360.000000 + + + +SceneSocialPost +424.000000 +290.000000 +108.000000,0.000000,0.000000 +CScene_SocialPost +GraphicPanel +SceneNewWorld\XuiEditWorldName +SceneNewWorld\XuiNewWorld +XuiEditCaption + + + +XuiOK +362.000000 +40.000000 +31.000008,236.000000,0.000000 +XuiMainMenuButton_L +XuiEditDescription +XuiDescription +22528 + + + + +XuiEditDescription +356.000000 +32.000000 +34.250069,178.000000,0.000000 +CXuiCtrl4JEdit +XuiEdit +XuiEditCaption +XuiOK +XuiOK +XuiEditCaption +100 + + + + +XuiLabelDescription +360.000000 +24.000000 +34.000023,154.000000,0.000000 +XuiLabelDarkLeftWrap + + + + +XuiEditCaption +356.000000 +32.000000 +33.749977,110.000000,0.000000 +CXuiCtrl4JEdit +XuiEdit +XuiEditTitle +XuiEditDescription +XuiEditTitle +XuiDescription +60 + + + + +XuiLabelCaption +360.000000 +24.000000 +34.000023,86.000000,0.000000 +XuiLabelDarkLeftWrap + + + + +XuiLabelText +358.000000 +64.000000 +34.000023,16.000000,0.000000 +XuiLabelDarkLeftWrap + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_teleportmenu.h b/Minecraft.Client/Common/Media/xuiscene_teleportmenu.h new file mode 100644 index 00000000..9042ac8c --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_teleportmenu.h @@ -0,0 +1,9 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_GamePlayers L"GamePlayers" +#define IDC_Title L"Title" +#define IDC_Teleport L"Teleport" diff --git a/Minecraft.Client/Common/Media/xuiscene_teleportmenu.xui b/Minecraft.Client/Common/Media/xuiscene_teleportmenu.xui new file mode 100644 index 00000000..3b747f6e --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_teleportmenu.xui @@ -0,0 +1,100 @@ + + +1280.000000 +720.000000 + + + +Teleport +1280.000000 +720.000000 +CScene_Teleport +XuiBlankScene +GamePlayers + + + +GamePlayers +500.000000 +336.000000 +390.000000,192.000046,0.000000 +CXuiCtrlPassThroughList +XuiPlayerList + + + +control_ListItem +400.000000 +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,46.000000,0.000000 +5 +false +XuiPlayerListButton_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,46.000000,0.000000 +5 +false +XuiPlayerListButton_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,46.000000,0.000000 +5 +false +XuiPlayerListButton_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,46.000000,0.000000 +5 +false +XuiPlayerListButton_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,46.000000,0.000000 +5 +false +XuiPlayerListButton_L + + + + + +Title +400.000000 +412.000000,202.000046,0.000000 +XuiLabelDarkLeftWrap18 + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_teleportmenu_480.h b/Minecraft.Client/Common/Media/xuiscene_teleportmenu_480.h new file mode 100644 index 00000000..9042ac8c --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_teleportmenu_480.h @@ -0,0 +1,9 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_GamePlayers L"GamePlayers" +#define IDC_Title L"Title" +#define IDC_Teleport L"Teleport" diff --git a/Minecraft.Client/Common/Media/xuiscene_teleportmenu_480.xui b/Minecraft.Client/Common/Media/xuiscene_teleportmenu_480.xui new file mode 100644 index 00000000..dced9633 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_teleportmenu_480.xui @@ -0,0 +1,101 @@ + + +640.000000 +480.000000 + + + +Teleport +640.000000 +480.000000 +CScene_Teleport +XuiBlankScene +GamePlayers + + + +GamePlayers +340.000000 +272.000000 +150.000031,130.000015,0.000000 +CXuiCtrlPassThroughList +XuiPlayerListSmall + + + +control_ListItem +400.000000 +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +400.000000 +40.000000 +20.000000,42.000000,0.000000 +5 +false +XuiPlayerListButton_LThin + + + + +control_ListItem +400.000000 +40.000000 +20.000000,42.000000,0.000000 +5 +false +XuiPlayerListButton_LThin + + + + +control_ListItem +400.000000 +40.000000 +20.000000,42.000000,0.000000 +5 +false +XuiPlayerListButton_LThin + + + + +control_ListItem +400.000000 +40.000000 +20.000000,42.000000,0.000000 +5 +false +XuiPlayerListButton_LThin + + + + +control_ListItem +400.000000 +40.000000 +20.000000,42.000000,0.000000 +5 +false +XuiPlayerListButton_LThin + + + + + +Title +300.000000 +22.000000 +170.000000,144.000000,0.000000 +XuiLabelDark + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_teleportmenu_small.h b/Minecraft.Client/Common/Media/xuiscene_teleportmenu_small.h new file mode 100644 index 00000000..9042ac8c --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_teleportmenu_small.h @@ -0,0 +1,9 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_GamePlayers L"GamePlayers" +#define IDC_Title L"Title" +#define IDC_Teleport L"Teleport" diff --git a/Minecraft.Client/Common/Media/xuiscene_teleportmenu_small.xui b/Minecraft.Client/Common/Media/xuiscene_teleportmenu_small.xui new file mode 100644 index 00000000..b9afb847 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_teleportmenu_small.xui @@ -0,0 +1,101 @@ + + +640.000000 +360.000000 + + + +Teleport +640.000000 +360.000000 +CScene_Teleport +XuiBlankScene +GamePlayers + + + +GamePlayers +400.000000 +236.000000 +120.000023,52.000011,0.000000 +CXuiCtrlPassThroughList +XuiPlayerListSmall + + + +control_ListItem +400.000000 +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +400.000000 +40.000000 +20.000000,42.000000,0.000000 +5 +false +XuiPlayerListButton_LThin + + + + +control_ListItem +400.000000 +40.000000 +20.000000,42.000000,0.000000 +5 +false +XuiPlayerListButton_LThin + + + + +control_ListItem +400.000000 +40.000000 +20.000000,42.000000,0.000000 +5 +false +XuiPlayerListButton_LThin + + + + +control_ListItem +400.000000 +40.000000 +20.000000,42.000000,0.000000 +5 +false +XuiPlayerListButton_LThin + + + + +control_ListItem +400.000000 +40.000000 +20.000000,42.000000,0.000000 +5 +false +XuiPlayerListButton_LThin + + + + + +Title +358.000000 +26.000000 +140.000000,61.999969,0.000000 +XuiLabelDarkLeftWrap16 + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_text_entry.h b/Minecraft.Client/Common/Media/xuiscene_text_entry.h new file mode 100644 index 00000000..f8d9c364 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_text_entry.h @@ -0,0 +1,2 @@ +#define IDC_XuiEditText L"XuiEditText" +#define IDC_TextEntry L"TextEntry" diff --git a/Minecraft.Client/Common/Media/xuiscene_text_entry.xui b/Minecraft.Client/Common/Media/xuiscene_text_entry.xui new file mode 100644 index 00000000..c71b6090 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_text_entry.xui @@ -0,0 +1,29 @@ + + +1280.000000 +720.000000 + + + +TextEntry +450.000000 +74.000000 +415.000031,568.000000,0.000000 +CScene_TextEntry +XuiScene +XuiEditText + + + +XuiEditText +394.000000 +32.000000 +31.000000,20.000000,0.000000 +CXuiCtrl4JEdit +XuiEdit +CheckboxAllowFoF +XuiEditSeed + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_trading.h b/Minecraft.Client/Common/Media/xuiscene_trading.h new file mode 100644 index 00000000..940527a3 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_trading.h @@ -0,0 +1,485 @@ +#define IDC_RequiredWindow L"RequiredWindow" +#define IDC_TradingWindow L"TradingWindow" +#define IDC_RequiredLabel L"RequiredLabel" +#define IDC_VillagerText L"VillagerText" +#define IDC_Request1 L"Request1" +#define IDC_Request2 L"Request2" +#define IDC_Offer1Label L"Offer1Label" +#define IDC_Offer2Label L"Offer2Label" +#define IDC_ScrollLeftArrow L"ScrollLeftArrow" +#define IDC_ScrollRightArrow L"ScrollRightArrow" +#define IDC_TradingBar0 L"TradingBar0" +#define IDC_TradingBar1 L"TradingBar1" +#define IDC_TradingBar2 L"TradingBar2" +#define IDC_TradingBar3 L"TradingBar3" +#define IDC_TradingBar4 L"TradingBar4" +#define IDC_TradingBar5 L"TradingBar5" +#define IDC_TradingBar6 L"TradingBar6" +#define IDC_TradingSelector L"TradingSelector" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Inventory L"Inventory" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_UseRow L"UseRow" +#define IDC_InventoryGrid L"InventoryGrid" +#define IDC_InventoryLabel L"InventoryLabel" +#define IDC_HtmlTextPanel L"HtmlTextPanel" +#define IDC_Group L"Group" +#define IDC_XuiSceneTrading L"XuiSceneTrading" diff --git a/Minecraft.Client/Common/Media/xuiscene_trading.xui b/Minecraft.Client/Common/Media/xuiscene_trading.xui new file mode 100644 index 00000000..1bfc0a64 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_trading.xui @@ -0,0 +1,6765 @@ + + +1280.000000 +720.000000 + + + +XuiSceneTrading +1280.000000 +720.000000 +CXuiSceneTrading +XuiBlankScene +Pointer + + + +Group +588.000000 +360.000000 +346.000031,180.000046,0.000000 +15 +XuiScene +Pointer + + + +RequiredWindow +216.000000 +186.000000 +25.000031,148.000000,0.000000 +8 +XuiSkinSelectSectionBackground + + + + +TradingWindow +312.000000 +186.000000 +249.000031,148.000000,0.000000 +8 +XuiSkinSelectSectionBackground + + + + +RequiredLabel +212.000000 +26.000000 +27.000031,152.000000,0.000000 +9 +XuiLabelDarkCentredWrapSmall + + + + +VillagerText +588.000000 +26.000000 +0.000000,25.000000,0.000000 +LabelContainerSceneCentre + + + + +Request1 +42.000000 +42.000000 +35.000031,200.000000,0.000000 +3 +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +Request2 +42.000000 +42.000000 +35.000031,254.000000,0.000000 +3 +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +Offer1Label +141.000000 +42.000000 +87.000031,200.000000,0.000000 +9 +XuiLabelVertCentDarkLeftWrap18 + + + + +Offer2Label +141.000000 +42.000000 +86.000031,254.000015,0.000000 +9 +XuiLabelVertCentDarkLeftWrap18 + + + + +ScrollLeftArrow +32.000000 +48.000000 +56.000000,68.000000,0.000000 +XuiScrollEndLeft + + + + +ScrollRightArrow +32.000000 +48.000000 +476.000000,68.000000,0.000000 +XuiScrollEndRight + + + + +TradingBar0 +54.000000 +54.000000 +91.000000,64.000000,0.000000 +3 +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +TradingBar1 +54.000000 +54.000000 +145.000000,64.000000,0.000000 +3 +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +TradingBar2 +54.000000 +54.000000 +199.000000,64.000000,0.000000 +3 +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +TradingBar3 +54.000000 +54.000000 +253.000000,64.000000,0.000000 +3 +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +TradingBar4 +54.000000 +54.000000 +307.000000,64.000000,0.000000 +3 +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +TradingBar5 +54.000000 +54.000000 +361.000000,64.000000,0.000000 +3 +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +TradingBar6 +54.000000 +54.000000 +415.000000,64.000000,0.000000 +3 +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +TradingSelector +72.000000 +72.000000 +82.000000,55.000000,0.000000 +CraftingPanelHighlight + + + + +InventoryGrid +290.000000 +144.000000 +260.000031,180.000000,0.000000 + + + +Inventory +288.000000 +96.000000 +8 +CXuiCtrlSlotList +ItemGridVertical32 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + + +UseRow +288.000000 +32.000000 +-0.000000,112.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical32 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + + + +InventoryLabel +310.000000 +26.000000 +251.000031,152.000000,0.000000 +9 +XuiLabelDarkCentredWrap + + + + +HtmlTextPanel +42.000000 +42.000000 +85.000000,118.000000,0.000000 +false +HtmlItemDescription + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +346.000031,180.000046,0.000000 + + + +0 +346.000061,180.000046,0.000000 + + + +2 +100 +-100 +50 +346.000061,180.000046,0.000000 + + + +0 +160.000000,180.000046,0.000000 + + + +2 +100 +-100 +50 +160.000000,180.000046,0.000000 + + + +0 +346.000061,180.000046,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_trading_480.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_480.xui b/Minecraft.Client/Common/Media/xuiscene_trading_480.xui new file mode 100644 index 00000000..a84496e2 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_trading_480.xui @@ -0,0 +1,6457 @@ + + +640.000000 +480.000000 + + + +XuiSceneTrading +640.000000 +480.000000 +CXuiSceneTrading +XuiBlankScene +Pointer + + + +Group +364.000000 +243.000000 +138.000015,118.500008,0.000000 +15 +GraphicPanel +Pointer + + + +TradingWindow +126.777763 +121.000000 +10.000000,113.000000,0.000000 +8 +XuiSkinSelectSectionBackground + + + + +TradingWindow1 +215.666595 +121.000000 +139.555573,113.000000,0.000000 +8 +XuiSkinSelectSectionBackground + + + + +RequiredLabel +120.000000 +27.000000 +12.000000,118.000000,0.000000 +9 +XuiLabelDarkCentred8 + + + + +VillagerText +364.000000 +24.000000 +0.000000,16.000000,0.000000 +LabelContainerSceneCentreSmall + + + + +Offer2Label +72.000000 +38.000000 +56.000000,192.000000,0.000000 +9 +XuiLabelVertCentDarkLeft8 + + + + +Offer1Label +72.000000 +38.000000 +57.000000,151.000000,0.000000 +9 +XuiLabelVertCentDarkLeft8 + + + + +ScrollLeftArrow +16.000000 +24.000000 +32.000000,56.000000,0.000000 +XuiScrollEndLeft + + + + +ScrollRightArrow +16.000000 +24.000000 +318.000000,56.000000,0.000000 +XuiScrollEndRight + + + + +Request1 +38.000000 +38.000000 +15.000000,151.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +Request2 +38.000000 +38.000000 +15.000000,192.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +TradingBar0 +38.000000 +38.000000 +48.000000,50.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +TradingBar1 +38.000000 +38.000000 +86.000000,50.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +TradingBar2 +38.000000 +38.000000 +124.000000,50.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +TradingBar3 +38.000000 +38.000000 +162.000000,50.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +TradingBar4 +38.000000 +38.000000 +200.000000,50.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +TradingBar5 +38.000000 +38.000000 +238.000000,50.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +TradingBar6 +38.000000 +38.000000 +276.000000,50.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +TradingSelector +43.000000 +43.000000 +45.000000,47.000000,0.000000 +CraftingPanelHighlightSmall + + + + +InventoryGrid +207.000000 +99.000000 +144.000000,131.000000,0.000000 + + + +Inventory +198.000000 +66.000000 +4.000000,0.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical22 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + + +UseRow +198.000000 +22.000000 +4.000000,76.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical22 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + + + +InventoryLabel +212.000000 +14.000000 +141.000000,116.000000,0.000000 +9 +XuiLabelDarkCentred8 + + + + +HtmlTextPanel +42.000000 +42.000000 +50.000000,85.000000,0.000000 +false +HtmlItemDescriptionSmall + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +138.000015,118.500008,0.000000 + + + +0 +138.000000,118.500008,0.000000 + + + +2 +100 +-100 +50 +138.000000,118.500008,0.000000 + + + +0 +34.000000,118.500008,0.000000 + + + +2 +100 +-100 +50 +34.000000,118.500008,0.000000 + + + +0 +138.000000,118.500008,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_trading_small.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/xuiscene_trading_small.xui b/Minecraft.Client/Common/Media/xuiscene_trading_small.xui new file mode 100644 index 00000000..23dbc5e4 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_trading_small.xui @@ -0,0 +1,6205 @@ + + +640.000000 +360.000000 + + + +XuiSceneTrading +640.000000 +360.000000 +CXuiSceneTrading +XuiBlankScene +Pointer + + + +Group +364.000000 +243.000000 +138.000015,3.000000,0.000000 +15 +GraphicPanel +Pointer + + + +TradingWindow +126.777763 +121.000000 +10.000000,113.000000,0.000000 +8 +XuiSkinSelectSectionBackground + + + + +TradingWindow1 +215.666595 +121.000000 +139.555573,113.000000,0.000000 +8 +XuiSkinSelectSectionBackground + + + + +RequiredLabel +120.000000 +27.000000 +12.000000,117.222229,0.000000 +9 +XuiLabelDarkCentred8 + + + + +VillagerText +364.000000 +24.000000 +0.000000,15.000000,0.000000 +LabelContainerSceneCentreSmall + + + + +Offer2Label +72.000000 +38.000000 +56.000000,192.000000,0.000000 +9 +XuiLabelVertCentDarkLeft8 + + + + +Offer1Label +72.000000 +38.000000 +56.000000,151.000000,0.000000 +9 +XuiLabelVertCentDarkLeft8 + + + + +ScrollLeftArrow +16.000000 +24.000000 +32.000000,56.000000,0.000000 +XuiScrollEndLeft + + + + +ScrollRightArrow +16.000000 +24.000000 +318.000000,56.000000,0.000000 +XuiScrollEndRight + + + + +Request1 +38.000000 +38.000000 +14.000000,151.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +Request2 +38.000000 +38.000000 +14.000000,192.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +TradingBar0 +38.000000 +38.000000 +48.000000,50.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +TradingBar1 +38.000000 +38.000000 +86.000000,50.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +TradingBar2 +38.000000 +38.000000 +124.000000,50.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +TradingBar3 +38.000000 +38.000000 +162.000000,50.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +TradingBar4 +38.000000 +38.000000 +200.000000,50.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +TradingBar5 +38.000000 +38.000000 +238.000000,50.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +TradingBar6 +38.000000 +38.000000 +276.000000,50.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +TradingSelector +43.000000 +43.000000 +45.000000,47.000000,0.000000 +CraftingPanelHighlightSmall + + + + +InventoryGrid +207.000000 +99.000000 +144.000000,131.000000,0.000000 + + + +Inventory +198.000000 +66.000000 +4.000000,0.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical22 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + + +UseRow +198.000000 +22.000000 +4.000000,76.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical22 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + + + +InventoryLabel +212.000000 +14.000000 +141.000000,116.000000,0.000000 +9 +XuiLabelDarkCentred8 + + + + +HtmlTextPanel +42.000000 +42.000000 +58.000000,87.000000,0.000000 +false +HtmlItemDescriptionSmall + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +138.000015,3.000000,0.000000 + + + +0 +138.000000,3.000000,0.000000 + + + +2 +100 +-100 +50 +138.000000,3.000000,0.000000 + + + +0 +34.000000,3.000000,0.000000 + + + +2 +100 +-100 +50 +34.000000,3.000000,0.000000 + + + +0 +138.000000,3.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_trap.h b/Minecraft.Client/Common/Media/xuiscene_trap.h new file mode 100644 index 00000000..1bb7a7eb --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_trap.h @@ -0,0 +1,53 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Inventory L"Inventory" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_UseRow L"UseRow" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Trap L"Trap" +#define IDC_InventoryText L"InventoryText" +#define IDC_DispenserText L"DispenserText" +#define IDC_Pointer L"Pointer" +#define IDC_Group L"Group" +#define IDC_DispenserScene L"DispenserScene" diff --git a/Minecraft.Client/Common/Media/xuiscene_trap.xui b/Minecraft.Client/Common/Media/xuiscene_trap.xui new file mode 100644 index 00000000..ec0f6b72 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_trap.xui @@ -0,0 +1,790 @@ + + +1280.000000 +720.000000 + + + +DispenserScene +1280.000000 +720.000000 +CXuiSceneTrap +XuiBlankScene +Pointer + + + +Group +430.000000 +405.000000 +425.000000,128.000000,0.000000 +15 +XuiScene +Pointer + + + +Inventory +383.000000 +129.000000 +25.000000,208.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + + +UseRow +382.000000 +45.000000 +25.000000,346.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + + +Trap +130.000000 +131.000000 +151.000031,46.000000,0.000000 +2 +CXuiCtrlSlotList +ItemGridVertical + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + + +InventoryText +374.000000 +26.000000,178.000000,0.000000 +LabelContainerSceneLeft + + + + +DispenserText +268.000000 +150.000000,16.000000,0.000000 +LabelContainerSceneLeft + + + + +Pointer +42.000000 +42.000000 +-185.000000,-176.000015,0.000000 +9 +false +CXuiCtrlSlotItem +ItemPointer + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +425.000000,128.000000,0.000000 + + + +0 +425.000000,128.000000,0.000000 + + + +2 +100 +-100 +50 +425.000000,128.000000,0.000000 + + + +0 +160.000000,128.000000,0.000000 + + + +2 +100 +-100 +50 +160.000000,128.000000,0.000000 + + + +0 +425.000000,128.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_trap_480.h b/Minecraft.Client/Common/Media/xuiscene_trap_480.h new file mode 100644 index 00000000..dbf9c0f5 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_trap_480.h @@ -0,0 +1,95 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Inventory L"Inventory" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_UseRow L"UseRow" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Trap L"Trap" +#define IDC_InventoryText L"InventoryText" +#define IDC_DispenserText L"DispenserText" +#define IDC_Pointer L"Pointer" +#define IDC_Group L"Group" +#define IDC_DispenserScene L"DispenserScene" diff --git a/Minecraft.Client/Common/Media/xuiscene_trap_480.xui b/Minecraft.Client/Common/Media/xuiscene_trap_480.xui new file mode 100644 index 00000000..b40f7608 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_trap_480.xui @@ -0,0 +1,1295 @@ + + +640.000000 +480.000000 + + + +DispenserScene +1280.000000 +720.000000 +CXuiSceneTrap +XuiBlankScene +Pointer + + + +Group +260.000000 +280.000000 +190.000000,100.000000,0.000000 +15 +GraphicPanel +Pointer + + + +Inventory +234.000000 +80.000000 +13.000009,152.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical26 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +UseRow +234.000000 +13.000009,240.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical26 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +Trap +80.000000 +80.000000 +91.000031,36.000000,0.000000 +2 +CXuiCtrlSlotList +ItemGridVertical26 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +InventoryText +232.000000 +22.000000 +12.000000,132.000000,0.000000 +LabelContainerSceneLeftSmall + + + + +DispenserText +160.000000 +25.000000 +90.000000,14.000000,0.000000 +LabelContainerSceneLeftSmall + + + + +Pointer +26.000000 +26.000000 +-50.000000,-40.000000,0.000000 +9 +false +CXuiCtrlSlotItem +ItemPointerSmall + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +190.000000,100.000000,0.000000 + + + +0 +190.000000,100.000000,0.000000 + + + +2 +100 +-100 +50 +190.000000,100.000000,0.000000 + + + +0 +33.750000,100.000000,0.000000 + + + +2 +100 +-100 +50 +60.000000,100.000000,0.000000 + + + +0 +190.000000,100.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_trap_small.h b/Minecraft.Client/Common/Media/xuiscene_trap_small.h new file mode 100644 index 00000000..1bb7a7eb --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_trap_small.h @@ -0,0 +1,53 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Inventory L"Inventory" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_UseRow L"UseRow" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Trap L"Trap" +#define IDC_InventoryText L"InventoryText" +#define IDC_DispenserText L"DispenserText" +#define IDC_Pointer L"Pointer" +#define IDC_Group L"Group" +#define IDC_DispenserScene L"DispenserScene" diff --git a/Minecraft.Client/Common/Media/xuiscene_trap_small.xui b/Minecraft.Client/Common/Media/xuiscene_trap_small.xui new file mode 100644 index 00000000..cf6db849 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_trap_small.xui @@ -0,0 +1,749 @@ + + +640.000000 +360.000000 + + + +DispenserScene +640.000000 +360.000000 +CXuiSceneTrap +XuiBlankScene +Pointer + + + +Group +260.000000 +280.000000 +190.000000,0.000000,0.000000 +15 +GraphicPanel +Pointer + + + +Inventory +234.000000 +80.000000 +12.000000,151.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical26 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +UseRow +234.000000 +12.000000,240.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical26 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +Trap +80.000000 +80.000000 +91.000031,36.000000,0.000000 +2 +CXuiCtrlSlotList +ItemGridVertical26 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +InventoryText +232.000000 +22.000000 +12.000000,130.000000,0.000000 +LabelContainerSceneLeftSmall + + + + +DispenserText +162.000000 +25.000000 +90.000000,14.000000,0.000000 +LabelContainerSceneLeftSmall + + + + +Pointer +26.000000 +26.000000 +-50.000000,-50.000000,0.000000 +9 +false +CXuiCtrlSlotItem +ItemPointerSmall + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +190.000000,0.000000,0.000000 + + + +0 +190.000000,0.000000,0.000000 + + + +2 +100 +-100 +50 +190.000000,0.000000,0.000000 + + + +0 +64.000000,0.000000,0.000000 + + + +2 +100 +-100 +50 +92.000000,0.000000,0.000000 + + + +0 +190.000000,0.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_trialexitupsell.h b/Minecraft.Client/Common/Media/xuiscene_trialexitupsell.h new file mode 100644 index 00000000..ff96c45c --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_trialexitupsell.h @@ -0,0 +1,3 @@ +#define IDC_XuiImage2 L"XuiImage2" +#define IDC_XuiImage1 L"XuiImage1" +#define IDC_TrialExitUpsell L"TrialExitUpsell" diff --git a/Minecraft.Client/Common/Media/xuiscene_trialexitupsell.xui b/Minecraft.Client/Common/Media/xuiscene_trialexitupsell.xui new file mode 100644 index 00000000..8980372f --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_trialexitupsell.xui @@ -0,0 +1,127 @@ + + +1280.000000 +720.000000 + + + +TrialExitUpsell +1280.000000 +720.000000 +CScene_TrialExitUpsell +XuiBlackScene + + + +XuiImage2 +1280.000000 +720.000000 +Graphics\UpsellScreenshots\Screenshot2.png + + + + +XuiImage1 +1280.000000 +720.000000 +Graphics\UpsellScreenshots\Screenshot1.png + + + + + +Normal + + + +EndNormal + +stop + + +Fade1to2 + + + +EndFade1to2 + +stop + + +Fade2to1 + + + +EndFade2to1 + +stop + + + +XuiImage1 +Opacity + + +0 +1.000000 + + + +0 +1.000000 + + + +0 +1.000000 + + + +0 +0.000000 + + + +0 +0.000000 + + + +0 +1.000000 + + + + + + + +Normal + + + +EndNormal + +stop + + +Fade1to2 + + + +EndFade1to2 + +stop + + +Fade2to1 + + + +EndFade2to1 + +stop + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_trialexitupsell_480.h b/Minecraft.Client/Common/Media/xuiscene_trialexitupsell_480.h new file mode 100644 index 00000000..ff96c45c --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_trialexitupsell_480.h @@ -0,0 +1,3 @@ +#define IDC_XuiImage2 L"XuiImage2" +#define IDC_XuiImage1 L"XuiImage1" +#define IDC_TrialExitUpsell L"TrialExitUpsell" diff --git a/Minecraft.Client/Common/Media/xuiscene_trialexitupsell_480.xui b/Minecraft.Client/Common/Media/xuiscene_trialexitupsell_480.xui new file mode 100644 index 00000000..423da0bf --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_trialexitupsell_480.xui @@ -0,0 +1,131 @@ + + +640.000000 +480.000000 + + + +TrialExitUpsell +640.000000 +480.000000 +CScene_TrialExitUpsell +XuiBlackScene + + + +XuiImage2 +860.000000 +480.000000 +-109.999969,0.000000,0.000000 +16 +Graphics\UpsellScreenshots\Screenshot2.png + + + + +XuiImage1 +860.000000 +480.000000 +-109.999969,0.000000,0.000000 +16 +Graphics\UpsellScreenshots\Screenshot1.png + + + + + +Normal + + + +EndNormal + +stop + + +Fade1to2 + + + +EndFade1to2 + +stop + + +Fade2to1 + + + +EndFade2to1 + +stop + + + +XuiImage1 +Opacity + + +0 +1.000000 + + + +0 +1.000000 + + + +0 +1.000000 + + + +0 +0.000000 + + + +0 +0.000000 + + + +0 +1.000000 + + + + + + + +Normal + + + +EndNormal + +stop + + +Fade1to2 + + + +EndFade1to2 + +stop + + +Fade2to1 + + + +EndFade2to1 + +stop + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_tutorialpopup.h b/Minecraft.Client/Common/Media/xuiscene_tutorialpopup.h new file mode 100644 index 00000000..d6c9924d --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_tutorialpopup.h @@ -0,0 +1,6 @@ +#define IDC_Description L"Description" +#define IDC_XuiInventoryPic L"XuiInventoryPic" +#define IDC_XuiImage L"XuiImage" +#define IDC_Title L"Title" +#define IDC_FontSize L"FontSize" +#define IDC_TutorialPopup L"TutorialPopup" diff --git a/Minecraft.Client/Common/Media/xuiscene_tutorialpopup.xui b/Minecraft.Client/Common/Media/xuiscene_tutorialpopup.xui new file mode 100644 index 00000000..17828a27 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_tutorialpopup.xui @@ -0,0 +1,83 @@ + + +1280.000000 +720.000000 + + + +TutorialPopup +497.000000 +210.000000 +719.000000,53.000000,0.000000 +true +CScene_TutorialPopup +PointerTextPanel + + + +Description +447.000000 +170.000000 +25.000000,20.000000,0.000000 +5 +XuiHtmlControl + + + + +XuiInventoryPic +64.000000 +64.000000 +216.000000,126.000000,0.000000 +24 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +XuiImage +320.000000 +180.000000 +88.000000,10.000000,0.000000 +24 +false +TutorialExitScreenshot.png + + + + +Title +447.000000 +43.000000 +25.000000,20.000000,0.000000 +5 +false +XuiLabelLight_Shadowed + + + + +FontSize +205.000000 +74.000000 +-198.000000,524.000000,0.000000 +18 + + + + +XuiText1 +657.000000 +139.000000 +-209.000000,442.000000,0.000000 +true +To change the font size of the text in the HTML control, change the value of the "FontSize" control to the size required. +0xff0f0f0f +0x800f0f0f +0 + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_tutorialpopup_480.h b/Minecraft.Client/Common/Media/xuiscene_tutorialpopup_480.h new file mode 100644 index 00000000..d6c9924d --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_tutorialpopup_480.h @@ -0,0 +1,6 @@ +#define IDC_Description L"Description" +#define IDC_XuiInventoryPic L"XuiInventoryPic" +#define IDC_XuiImage L"XuiImage" +#define IDC_Title L"Title" +#define IDC_FontSize L"FontSize" +#define IDC_TutorialPopup L"TutorialPopup" diff --git a/Minecraft.Client/Common/Media/xuiscene_tutorialpopup_480.xui b/Minecraft.Client/Common/Media/xuiscene_tutorialpopup_480.xui new file mode 100644 index 00000000..38b6e07f --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_tutorialpopup_480.xui @@ -0,0 +1,83 @@ + + +640.000000 +480.000000 + + + +TutorialPopup +250.000000 +230.000000 +340.000000,40.000000,0.000000 +true +CScene_TutorialPopup +PointerTextPanel + + + +Description +225.000000 +185.000000 +12.000000,12.000000,0.000000 +5 +XuiHtmlControl + + + + +XuiInventoryPic +32.000000 +32.000000 +108.000000,186.000000,0.000000 +24 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +XuiImage +160.000000 +90.000000 +45.000000,156.000000,0.000000 +24 +false +TutorialExitScreenshot.png + + + + +Title +225.000000 +44.000000 +12.000000,20.000000,0.000000 +5 +false +XuiLabelLight_Shadowed + + + + +FontSize +205.000000 +74.000000 +-198.000000,524.000000,0.000000 +12 + + + + +XuiText1 +657.000000 +139.000000 +-209.000000,442.000000,0.000000 +true +To change the font size of the text in the HTML control, change the value of the "FontSize" control to the size required. +0xff0f0f0f +0x800f0f0f +0 + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_tutorialpopup_small.h b/Minecraft.Client/Common/Media/xuiscene_tutorialpopup_small.h new file mode 100644 index 00000000..d6c9924d --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_tutorialpopup_small.h @@ -0,0 +1,6 @@ +#define IDC_Description L"Description" +#define IDC_XuiInventoryPic L"XuiInventoryPic" +#define IDC_XuiImage L"XuiImage" +#define IDC_Title L"Title" +#define IDC_FontSize L"FontSize" +#define IDC_TutorialPopup L"TutorialPopup" diff --git a/Minecraft.Client/Common/Media/xuiscene_tutorialpopup_small.xui b/Minecraft.Client/Common/Media/xuiscene_tutorialpopup_small.xui new file mode 100644 index 00000000..62f741d9 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_tutorialpopup_small.xui @@ -0,0 +1,84 @@ + + +1280.000000 +720.000000 + + + +TutorialPopup +250.000000 +210.000000 +390.000000,4.000000,0.000000 +true +CScene_TutorialPopup +PointerTextPanel + + + +Description +230.000000 +190.000000 +10.000000,10.000000,0.000000 +5 +XuiHtmlControl + + + + +XuiInventoryPic +32.000000 +32.000000 +108.000000,168.000000,0.000000 +24 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +XuiImage +160.000000 +90.000000 +45.000000,110.000000,0.000000 +24 +false +TutorialExitScreenshot.png + + + + +Title +230.000000 +44.000000 +10.000000,10.000000,0.000000 +5 +false +XuiLabelLight_ShadowedSmall + + + + +FontSize +205.000000 +74.000000 +-198.000000,524.000000,0.000000 +12 + + + + + +XuiText1 +657.000000 +139.000000 +-209.000000,442.000000,0.000000 +true +To change the font size of the text in the HTML control, change the value of the "FontSize" control to the size required. +0xff0f0f0f +0x800f0f0f +0 + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_win.h b/Minecraft.Client/Common/Media/xuiscene_win.h new file mode 100644 index 00000000..53d37dd5 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_win.h @@ -0,0 +1,4 @@ +#define IDC_HtmlControl L"HtmlControl" +#define IDC_Darken L"Darken" +#define IDC_FocusSink L"FocusSink" +#define IDC_WinScene L"WinScene" diff --git a/Minecraft.Client/Common/Media/xuiscene_win.xui b/Minecraft.Client/Common/Media/xuiscene_win.xui new file mode 100644 index 00000000..fcfdf820 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_win.xui @@ -0,0 +1,68 @@ + + +1280.000000 +720.000000 + + + +WinScene +1280.000000 +720.000000 +CScene_Win +XuiBackgroundScroll +FocusSink + + + +HtmlControl +532.000000 +720.000000 +374.000031,0.000000,0.000000 +XuiHtmlControl_EndStory +false + + + + +Darken +1280.000000 +1280.000000 +-63.999886,-23.999947,0.000000 +1.100000,0.600000,1.000000 +15 + + +0xff0f0f80 + + + + +3 +0x0f0f0f0f + + +true +3 +0x230f0f0f +0x2d0f0f0f +0xe10f0f0f +0.000000 +0.537255 +1.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,1131.000000,0.000000,0,1131.000000,0.000000,1131.000000,0.000000,1131.000000,719.000000,0,1131.000000,719.000000,1131.000000,719.000000,0.000000,719.000000,0,0.000000,719.000000,0.000000,719.000000,0.000000,0.000000,0, + + + + +FocusSink +1320.000000,98.000000,0.000000 + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_win_480.h b/Minecraft.Client/Common/Media/xuiscene_win_480.h new file mode 100644 index 00000000..53d37dd5 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_win_480.h @@ -0,0 +1,4 @@ +#define IDC_HtmlControl L"HtmlControl" +#define IDC_Darken L"Darken" +#define IDC_FocusSink L"FocusSink" +#define IDC_WinScene L"WinScene" diff --git a/Minecraft.Client/Common/Media/xuiscene_win_480.xui b/Minecraft.Client/Common/Media/xuiscene_win_480.xui new file mode 100644 index 00000000..4492b7e2 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_win_480.xui @@ -0,0 +1,69 @@ + + +640.000000 +480.000000 + + + +WinScene +640.000000 +480.000000 +0.000031,0.000000,0.000000 +CScene_Win +XuiBackgroundScroll +FocusSink + + + +HtmlControl +380.000000 +480.000000 +130.000031,-0.000000,0.000000 +XuiHtmlControl_EndStory +false + + + + +Darken +640.000000 +640.000000 +-19.199951,-15.999989,0.000000 +1.060000,0.800000,1.000000 +15 + + +0xff0f0f80 + + + + +3 +0x0f0f0f0f + + +true +3 +0x230f0f0f +0x2d0f0f0f +0xe10f0f0f +0.000000 +0.537255 +1.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,1131.000000,0.000000,0,1131.000000,0.000000,1131.000000,0.000000,1131.000000,719.000000,0,1131.000000,719.000000,1131.000000,719.000000,0.000000,719.000000,0,0.000000,719.000000,0.000000,719.000000,0.000000,0.000000,0, + + + + +FocusSink +1320.000000,98.000000,0.000000 + + + + diff --git a/Minecraft.Client/Common/Media/zh-CHT/4J_strings.resx b/Minecraft.Client/Common/Media/zh-CHT/4J_strings.resx new file mode 100644 index 00000000..341189b0 --- /dev/null +++ b/Minecraft.Client/Common/Media/zh-CHT/4J_strings.resx @@ -0,0 +1,108 @@ + +未使用 + +確定 + +返回 + +取消 + + + + + +存檔已損毀 + +您的遊戲存檔已損毀。要建立新的存檔,並覆寫損毀的存檔嗎? + +沒有可用空間 + +您所選取的儲存裝置沒有足夠的可用空間來建立遊戲存檔。 + +再選取一次 + +不儲存即進行遊戲 + +建立新存檔 + +要覆寫存檔嗎? + +您所選取的儲存裝置已經有這個存檔,確定要覆寫該存檔嗎? + +否:不要覆寫 + +覆寫並儲存 + +儲存失敗 + +儲存裝置的問題 + +儲存裝置無法使用,或儲存裝置發生錯誤 + +儲存裝置無法使用,或儲存裝置發生錯誤。請選取新的儲存裝置。 + +選取新的儲存裝置 + +尚未選取儲存裝置 + +如果您不選取儲存裝置,系統將會停用儲存遊戲的功能 + +選取儲存裝置 + +不儲存即繼續 + +儲存裝置已遭移除,請選取新的儲存裝置。 + +載入失敗 + +為存檔命名 + +請輸入遊戲存檔的名稱 + +返回 Xbox 設定畫面 + +確定要離開遊戲嗎? + +已登出 + +您的玩家設定檔已登出,因此您即將返回標題畫面 + +某個玩家設定檔已登出,因此配對遊戲即將結束 + +繼續進行遊戲 + +玩家設定檔沒有登入 + +這個遊戲有某些功能需要使用已啟用 Xbox LIVE 功能的玩家設定檔,但您的玩家設定檔目前沒有登入 Xbox LIVE。 + +這個功能需要使用已登入 Xbox LIVE 的玩家設定檔。 + +連線至 Xbox LIVE + +繼續離線進行遊戲 + +成就獎項問題 + +系統在讀取您的玩家設定檔時發生問題,因此您目前無法獲得成就。 + +玩家設定檔的問題 + +無法將設定儲存至玩家設定檔。 + +訪客玩家設定檔 + +訪客玩家設定檔無法使用這個功能,請使用不同的玩家設定檔。 + +正在儲存... + +正在儲存,請勿關閉主機。 + +解除完整版遊戲鎖定 + +這是 Minecraft 試玩版遊戲。如果您擁有完整版遊戲,那您剛剛就獲得了 1 個成就! +解除完整版遊戲即可享受 Minecraft 的遊戲歡樂,而且還能透過 Xbox LIVE 與世界各地的好友一起玩遊戲。 +想要解除完整版遊戲鎖定嗎? + +系統在讀取您的設定檔時發生問題。即將返回主畫面。 + + diff --git a/Minecraft.Client/Common/Media/zh-CHT/strings.resx b/Minecraft.Client/Common/Media/zh-CHT/strings.resx new file mode 100644 index 00000000..4efef5a7 --- /dev/null +++ b/Minecraft.Client/Common/Media/zh-CHT/strings.resx @@ -0,0 +1,5165 @@ + +新的下載內容現已推出!請選取主畫面的 [Minecraft 商店] 按鈕來取得下載內容。 + +您可以用 Minecraft 商店裡的角色外觀套件來變更角色的外觀喔。選取主畫面中的 [Minecraft 商店] 按鈕,去看看有哪些好東西吧。 + +如果您選擇高畫質模式,就能讓最多 4 位玩家在同一台主機上以分割畫面同時進行遊戲! + +將其他控制器連接至您的主機,然後按下這些控制器的 START 鍵就能隨時加入遊戲。 + +調整 [色差補正] 設定就能讓遊戲畫面變亮或變暗。 + +如果您將遊戲困難度設定為 [和平],您的生命值就會自動回復,而且夜晚不會出現怪物! + +用骨頭來餵狼來馴服牠,然後就能讓牠坐下或是跟著您走。 + +當您開啟物品欄選單時,只要把游標移動到選單外面,然後按下 {*CONTROLLER_VK_A*} 即可丟棄物品。 + +夜晚時,在床舖上睡覺就能讓遊戲時間快轉到日出;但在多人遊戲中,所有玩家必須同時睡在床舖上,才會有這種效果。 + +您可以殺死豬來獲得生豬肉,然後在烹煮後吃掉熟豬肉來回復生命值。 + +您可以殺死乳牛來獲得皮革,然後用來製作護甲。 + +如果您有空的桶子,可以用在乳牛身上來裝牛奶、裝水,或是裝熔岩。 + +您可以用鋤頭墾地,來準備栽種作物用的地面。 + +蜘蛛不會在白天攻擊您,除非您先展開攻擊。 + +用鏟子來挖泥土或沙子,會比用手來挖快多了! + +吃下熟豬肉所回復的生命值,會比吃下生豬肉所回復的多! + +別忘了製造些火把,以便在夜晚時照亮四周的環境,而且怪物會避開火把附近的區域。 + +您可以利用礦車與軌道,來快速抵達目的地! + +只要栽種樹苗,樹苗就會長成樹木。 + +殭屍 Pigmen 不會攻擊您,除非您先展開攻擊。 + +只要在床舖上睡覺,就能變更時間再生點,並讓遊戲時間快轉到日出。 + +把 Ghast 發射的火球打回去! + +建造傳送門就能讓您前往地獄。 + +按下 {*CONTROLLER_VK_B*} 即可丟棄您手上握著的物品! + +別忘了要使用正確的工具來做事! + +如果您找不到煤塊來製造火把,可以用熔爐火燒木頭來製造木炭。 + +我們不建議您直直往下挖,或是直直往上挖。 + +從骷髏的骨頭精製出來的骨粉可以當做肥料,讓植物立刻長大喔! + +當 Creeper 靠近您時,就會自爆! + +當水碰到熔岩源方塊時,就會產生黑曜石。 + +當您移除熔岩源方塊後,熔岩在好幾分鐘後才會完全消失。 + +Ghast 的火球無法破壞鵝卵石,因此鵝卵石很適合用來保護傳送門。 + +可做為光源的方塊能夠融化白雪和冰塊,這些方塊包括火把、閃石及南瓜燈。 + +在野外以羊毛做為建築材料來蓋東西時,千萬要小心,因為雷雨的閃電會讓羊毛著火。 + +使用熔爐時,1 個熔岩桶可讓您熔煉 100 個方塊。 + +音符方塊所演奏的樂器種類,是根據底下方塊的材質而定。 + +白天時,如果殭屍和骷髏在水中就能活下去。 + +如果您攻擊某隻狼,四周的所有狼就會開始攻擊您。而殭屍 Pigmen 也有這種特點。 + +狼無法進入地獄。 + +狼不會攻擊 Creeper。 + +雞每 5 到 10 分鐘就會下一次蛋。 + +黑曜石只能用鑽石鎬來開採。 + +最容易取得火藥的來源就是 Creeper。 + +把 2 個箱子並排放置,就能製造出 1 個大箱子。 + +馴服的狼的生命值高低,會以尾巴的位置來表示。只要餵狼吃肉,就能治療狼。 + +在熔爐烹煮仙人掌,即可獲得綠色染料。 + +只要在 Twitter 上關注 4J Studios 和 Kappische 的動態,就能獲得 Minecraft 的最新消息! + +透過暫停選單把螢幕擷取畫面分享到 Facebook 上,讓好友驚嘆您在 Minecraft 中的創作! + +閱讀 [遊戲方式] 選單中的 [最新資訊] 部分,即可獲得 Minecraft 的最新更新資訊。 + +現在柵欄可以堆疊囉! + +Minecraft 的論壇上有個特別保留給 Xbox 360 Edition 的地方喔! + +如果您的手中有小麥,有些動物會跟著您。 + +只要動物無法朝任一方向移動超過 20 個方塊的距離,牠就不會消失。 + +音樂是由 C418 所製作! + +Notch 在 Twitter 上已經有超過 100 萬位的關注者了! + +並非所有瑞典人都有金髮,有些瑞典人 (像是 Mojang 裡的 Jens) 就擁有紅髮! + +我們認為 4J Studios 已經把 Xbox 360 版本中的 Herobrine 拿掉了,不過我們不確定這個消息是真是假。 + +我們會為這個遊戲推出更新程式! + +Notch 是誰? + +Mojang 獲得的獎項數目比員工數目還要多! + +有些名人很喜歡玩 Minecraft 喔! + +deadmau5 喜歡玩 Minecraft! + +別直視遊戲的程式錯誤。 + +Creeper 就是從某個程式錯誤中誕生的。 + +這是雞?還是鴨子? + +您有去 Minecon 嗎? + +在 Mojang 裡,沒人看過 Junkboy 的臉。 + +您知道 Minecraft Wiki 嗎? + +Mojang 的新 office 很酷喔! + +Minecraft: Xbox 360 Edition 打破了許多紀錄! + +2013 年的 Minecon 於美國佛羅里達州奧蘭多舉辦! + +.party() 棒極了! + +要永遠假設謠言是錯誤的,不要當真! + +{*T3*}遊戲方式:基本介紹{*ETW*}{*B*}{*B*} +Minecraft 是一款可讓您放置方塊來建造夢想世界的遊戲。但千萬別忘了要在夜行怪物出現之前,先蓋好一個棲身處喔。{*B*}{*B*} +使用 {*CONTROLLER_ACTION_LOOK*} 即可四處觀看。{*B*}{*B*} +使用 {*CONTROLLER_ACTION_MOVE*} 即可四處移動。{*B*}{*B*} +按下 {*CONTROLLER_ACTION_JUMP*} 即可跳躍。{*B*}{*B*} +快速往前按兩下 {*CONTROLLER_ACTION_MOVE*} 即可奔跑。當您往前按住 {*CONTROLLER_ACTION_MOVE*} 時,角色將會繼續奔跑,直到奔跑時間結束,或是食物列少於 {*ICON_SHANK_03*} 為止。{*B*}{*B*} +按住 {*CONTROLLER_ACTION_ACTION*} 即可用您的手,或是手中握住的東西來開採及劈砍。但您可能需要精製出工具來開採某些方塊。{*B*}{*B*} +當您手中握著某樣物品時,使用 {*CONTROLLER_ACTION_USE*} 即可使用該物品;您也可以按下 {*CONTROLLER_ACTION_DROP*} 來丟棄該物品。 + +{*T3*}遊戲方式:抬頭顯示器{*ETW*}{*B*}{*B*} +抬頭顯示器會顯示您的相關資訊,例如狀態、生命值、在水中時的剩餘氧氣量、您的飢餓程度 (需要吃東西來補充),以及穿戴護甲時的護甲值。 如果您失去部分生命值,但是食物列有 9 個以上的 {*ICON_SHANK_01*},您的生命值將會自動回復。只要吃下食物,就能補充食物列。{*B*} +經驗值列同時也顯示在此處,經驗等級將以數字顯示,列條圖示則顯示出提升至下一等級所需的經驗值。 收集生物被殺死時掉落的光球、開採特定的方塊、繁殖動物、釣魚,或使用熔爐熔煉或烹煮皆可累積經驗值。{*B*}{*B*} +抬頭顯示器也會顯示您可以使用的物品。使用 {*CONTROLLER_ACTION_LEFT_SCROLL*} 和 {*CONTROLLER_ACTION_RIGHT_SCROLL*} 即可變更您手中的物品。 + +{*T3*}遊戲方式:物品欄{*ETW*}{*B*}{*B*} +使用 {*CONTROLLER_ACTION_INVENTORY*} 即可檢視您的物品欄。{*B*}{*B*} +這個畫面會顯示您手中可使用的物品,以及您身上的所有其他物品。您穿戴的護甲也會顯示在這裡。{*B*}{*B*} +使用 {*CONTROLLER_MENU_NAVIGATE*} 即可移動游標。使用 {*CONTROLLER_VK_A*} 即可撿起游標下的物品。如果游標下有數個物品,您將會撿起所有物品,但您也可以使用 {*CONTROLLER_VK_X*} 撿起一半的物品。{*B*}{*B*} +您可以使用 {*CONTROLLER_VK_A*} 用游標把物品移動到物品欄的另一個空格上,然後把物品放置在那裡。如果游標上有數個物品,使用 {*CONTROLLER_VK_A*} 即可放置所有物品,但您也可以使用 {*CONTROLLER_VK_X*} 只放置 1 個物品。{*B*}{*B*} +如果游標下的物品是護甲,畫面會出現工具提示,讓您能夠快速地把護甲移動至物品欄中正確的護甲空格。{*B*}{*B*} +您也可以藉由染色來改變您的皮甲顏色,您可以在物品欄中使用游標撿起染色劑並將其移動到您想染色的目標上然後按下 {*CONTROLLER_VK_X*} 來染色。 + + +{*T3*}遊戲方式:箱子{*ETW*}{*B*}{*B*} +當您精製出箱子時,就能將箱子放置在遊戲世界中,然後用 {*CONTROLLER_ACTION_USE*} 來使用箱子,以便存放您物品欄中的物品。{*B*}{*B*} +您可以使用游標在物品欄與箱子之間移動物品。{*B*}{*B*} +箱子會保存您的物品,等您之後有需要時再將物品移動到物品欄中。 + + +{*T3*}遊戲方式:大箱子{*ETW*}{*B*}{*B*} +把 2 個箱子並排放置就能組合成 1 個大箱子,讓您能存放更多物品。{*B*}{*B*} +大箱子的使用方式就跟普通箱子一樣。 + + +{*T3*}遊戲方式:精製物品{*ETW*}{*B*}{*B*} +您可以在精製介面中,把物品欄中的物品組合起來,精製出新類型的物品。使用 {*CONTROLLER_ACTION_CRAFTING*} 即可開啟精製介面。{*B*}{*B*} +使用 {*CONTROLLER_VK_LB*} 和 {*CONTROLLER_VK_RB*} 來依序切換頂端的索引標籤,以便選取您想要製作的物品類型,然後使用 {*CONTROLLER_MENU_NAVIGATE*} 來選取您要精製的物品。{*B*}{*B*} +精製區域會顯示精製新物品所需的材料。按下 {*CONTROLLER_VK_A*} 即可精製物品,並將該物品放置在物品欄中。 + + +{*T3*}遊戲方式:精製台{*ETW*}{*B*}{*B*} +精製台可讓您精製出種類較多的物品。{*B*}{*B*} +先將精製台放置在遊戲世界中,然後按下 {*CONTROLLER_ACTION_USE*} 即可使用。{*B*}{*B*} +精製台的運作方法跟基本的精製介面是一樣的,但您會擁有較大的精製空間,能精製出的物品種類也較多。 + + +{*T3*}遊戲方式:熔爐{*ETW*}{*B*}{*B*} +熔爐可讓您透過火燒來改變物品。舉例來說,您可以使用熔爐把鐵礦石轉變成鐵錠塊。{*B*}{*B*} +先將熔爐放置在遊戲世界中,然後按下 {*CONTROLLER_ACTION_USE*} 即可使用。{*B*}{*B*} +您必須把燃料放在熔爐的底部,熔爐頂端的物品才會燃燒。{*B*}{*B*} +當物品火燒完畢後,您就能把物品從成品區移動到物品欄中。{*B*}{*B*} +如果游標下的物品是適合熔爐使用的材料或燃料,畫面會出現工具提示,讓您能夠快速將物品移動至熔爐。 + + +{*T3*}遊戲方式:發射器{*ETW*}{*B*}{*B*} +發射器可用來射出物品,但您必須在發射器旁邊放置開關 (例如拉桿),才能啟動發射器。{*B*}{*B*} +如要用物品裝填發射器,只要先按下 {*CONTROLLER_ACTION_USE*},再把您要射出的物品從物品欄移動到發射器即可。{*B*}{*B*} +現在,當您使用開關時,發射器就會射出 1 個物品。 + + +{*T3*}遊戲方式:釀製{*ETW*}{*B*}{*B*} +您必須使用釀製台才能釀製藥水,而釀製台可在精製台建造。不論您想釀製哪一種藥水,都必須先使用水瓶。您可將玻璃瓶裝入水槽或其他水源的水來製作水瓶。{*B*} +每個釀製台中都有三個放置瓶子的空格,代表您可以同時釀製三瓶藥水。而同一種材料可同時讓三個瓶子使用,所以最有效率的作法就是每一次都同時釀製三瓶藥水。{*B*} +只要將藥水所需的材料放在釀製台的上方,經過一段時間後即可釀製出基本藥水。基本藥水本身並不具備任何效果,但您只需再使用另一項材料,即可釀製出具備效力的藥水。{*B*} +釀製出藥水後,您可以再加入紅石塵讓藥水的效力更持久,或加入閃石塵讓藥水更具威力,或是用發酵蜘蛛眼讓藥水的傷害性更強。{*B*} +您也可加入火藥,將藥水變成可用來投擲的噴濺藥水。投擲噴濺藥水即可將藥水的效力波及其落點附近的區域。{*B*} + +可用來製作藥水的材料包括:-{*B*}{*B*} +* {*T2*}地獄結節{*ETW*}{*B*} +* {*T2*}蜘蛛眼{*ETW*}{*B*} +* {*T2*}砂糖{*ETW*}{*B*} +* {*T2*}Ghast 淚水{*ETW*}{*B*} +* {*T2*}Blaze 粉{*ETW*}{*B*} +* {*T2*}熔岩球{*ETW*}{*B*} +* {*T2*}發光西瓜{*ETW*}{*B*} +* {*T2*}紅石塵{*ETW*}{*B*} +* {*T2*}閃石塵{*ETW*}{*B*} +* {*T2*}發酵蜘蛛眼{*ETW*}{*B*}{*B*} + +請試著組合各種不同的材料,找出釀製各種不同藥水所需的方程式。 + + +{*T3*}遊戲方式:附加能力{*ETW*}{*B*}{*B*} +收集生物被殺死時掉落的光球、開採特定的方塊,或使用熔爐熔煉或烹煮皆可累積經驗值,您必須使用經驗值才能將特殊能力附加到武器、書本、護甲或特定工具上。{*B*} +當您將劍、弓、斧、鎬、鏟、書本和護甲放到附加能力台的書下方的空格後,空格右邊的三個按鈕會顯示一些附加能力,以及使用該附加能力所需的經驗等級。{*B*} +當您的經驗等級不足時,所需的經驗等級會以紅色呈現;足夠時則以綠色呈現。{*B*}{*B*} +被附加的能力是根據所顯示經驗等級多寡隨機挑選出來。{*B*}{*B*} +當附加能力台的周圍被書架圍住 (最多可有 15 個書架),且書架和附加能力台的中間有一個方塊的空間時,附加能力的效果會增強,同時附加能力台的書上會顯示神秘的圖示。{*B*}{*B*} +附加能力台所需使用的材料都可在該世界的村落中被找到,或經由開採或栽種而得到。{*B*}{*B*} +在鐵砧上使用附魔小冊來對物品使用附加能力。這能讓您有更多自由決定要對物品使用何種附加能力。{*B*} + + +{*T3*}遊戲方式:豢養動物{*ETW*}{*B*}{*B*} +當您想要將動物聚集在同一個地方豢養時,可以建造一個大小不超過 20x20 個方塊的柵欄區域,然後將您的動物放置在裡面。這樣就能確保牠們在您回來的時候還在那裡。 + + +{*T3*}遊戲方式:繁殖動物{*ETW*}{*B*}{*B*} +現在 Minecraft 遊戲中的動物可以繁殖,生出小動物了!{*B*} +您必須餵動物吃特定的食物,讓動物進入戀愛模式,動物才能繁殖。{*B*} +餵乳牛、Mooshroom、或綿羊吃小麥,餵豬吃紅蘿蔔,餵雞吃小麥種子或地獄結節,餵狼吃肉,然後這些動物就會開始尋找也在戀愛模式中的同種類動物。{*B*} +當同在戀愛模式中的兩隻同種類動物相遇,牠們會先親吻數秒,剛出生的小動物就會出現。小動物在長成一般成年動物大小前都會跟在父母身旁。{*B*} +剛結束戀愛模式的動物必須等待大約五分鐘後,才能再次進入戀愛模式。{*B*} +在遊戲世界中有動物數量限制,因此在您擁有很多動物的時候會發現牠們不再繁殖了。 + +{*T3*}遊戲方式:地獄傳送門{*ETW*}{*B*}{*B*} +地獄傳送門可讓玩家在地上世界與地獄世界之間往返。您可以利用地獄世界在地上世界中快速移動,因為在地獄世界移動 1 個方塊的距離,就等於在地上世界移動 3 個方塊的距離。 +因此當您在地獄世界建造傳送門並通過它時,您出現在地上世界的移動距離,將會是以進入傳送門為起點時的 3 倍。{*B*}{*B*} +要建造傳送門至少需要 10 個黑曜石方塊,且傳送門必須要有 5 個方塊高,4 個方塊寬,1 個方塊厚。當您建造好傳送門的框架後,必須要用火彈物品讓框架中的空間著火,才能啟動傳送門。{*B*}{*B*} +右邊圖片中有數種傳送門的範例。 + + +{*T3*}遊戲方式:多人遊戲{*ETW*}{*B*}{*B*} +Xbox One 主機上的 Minecraft 預設為多人遊戲。如果您選擇高畫質模式,就能隨時讓本機玩家加入遊戲,只要在遊戲進行時連接控制器並按下 {*CONTROLLER_VK_START*} 鍵即可。{*B*}{*B*} +當您開始或加入線上遊戲時,您好友名單上的玩家就能看到您正在玩 Minecraft (除非您在主持遊戲時選取「僅限邀請」);而當好友加入您的遊戲後,好友的好友名單上的玩家也會看到他正在玩 Minecraft (如果您選取了「允許好友的好友加入」選項)。{*B*} +當您進行遊戲時,按下 {*CONTROLLER_VK_BACK*} 鍵即可讓您看到遊戲中所有其他玩家的名單,並可檢視他們的玩家卡、把玩家踢出遊戲,以及邀請其他玩家加入遊戲。 + + +{*T3*}遊戲方式:分享螢幕擷取畫面{*ETW*}{*B*}{*B*} +只要在暫停選單按下 {*CONTROLLER_VK_Y*} 即可拍攝螢幕擷取畫面並分享到 Facebook。您會看到螢幕擷取畫面的縮圖,還能編輯與該 Facebook 文章相關的文字。{*B*}{*B*} +遊戲有專為拍攝螢幕擷取畫面而設計的視角模式,可讓您看到自己角色的正面。先按下 {*CONTROLLER_ACTION_CAMERA*} 直到您看到自己角色的正面,然後按下 {*CONTROLLER_VK_Y*} 即可分享螢幕擷取畫面。{*B*}{*B*} +玩家代號不會出現在螢幕擷取畫面中。 + + +{*T3*}遊戲方式:禁用關卡{*ETW*}{*B*}{*B*} +如果您在進行某個關卡時看到有冒犯意味的內容,可以選擇把這個關卡加入您的禁用關卡清單。 +方法是先前往暫停選單,然後按下 {*CONTROLLER_VK_RB*} 來選取 [禁用關卡] 工具提示。 +之後當您要加入這個關卡時,系統會提示您該關卡已在您的禁用關卡清單中,然後讓您選擇是否把該關卡從清單中移除並進入關卡,或是要退出。 + +{*T3*}遊戲方式:創造模式{*ETW*}{*B*}{*B*} +創造模式的介面可讓玩家把遊戲中的物品移動到自己的物品欄,不需要先開採或是精製。 +當玩家在遊戲世界中放置或使用這些物品時,這些物品並不會從玩家的物品欄中消失,讓玩家可專注在建造上,不需要開採或精製物品。{*B*} +如果您在創造模式中建立、載入或儲存世界,該世界的成就及排行榜更新功能將無法使用,即使您之後以生存模式載入該世界,也無法改變這種狀況。{*B*} +在創造模式中,快速按兩下 {*CONTROLLER_ACTION_JUMP*} 即可飛翔。如要停止飛翔,只要重複這個動作即可。飛行時,快速往前按兩下 {*CONTROLLER_ACTION_MOVE*} 即可加快飛行速度。 +在飛翔模式時,按住 {*CONTROLLER_ACTION_JUMP*} 即可往上飛,按住 {*CONTROLLER_ACTION_SNEAK*} 即可往下飛。您也可以使用 {*CONTROLLER_ACTION_DPAD_UP*} 來往上飛,使用 {*CONTROLLER_ACTION_DPAD_DOWN*} 來往下飛, +使用 {*CONTROLLER_ACTION_DPAD_LEFT*} 來往左飛,使用 {*CONTROLLER_ACTION_DPAD_RIGHT*} 來往右飛。 + +{*T3*}遊戲方式:主持人與玩家選項{*ETW*}{*B*}{*B*} + +{*T1*}遊戲選項{*ETW*}{*B*} +當載入或建立世界時,您可以按下 [更多選項] 按鈕,來選擇更多遊戲的相關設定。{*B*}{*B*} + + {*T2*}玩家 vs 玩家{*ETW*}{*B*} + 啟用此選項時,玩家可以對其他玩家造成傷害。此選項只在生存模式下可使用。{*B*}{*B*} + + {*T2*}信任玩家{*ETW*}{*B*} + 停用此選項會限制加入遊戲的玩家可以進行的活動。他們無法進行開採或使用項目、放置方塊、使用門與開關、使用容器、攻擊玩家或動物。您可以使用遊戲選單為特定玩家變更上述的選項。{*B*}{*B*} + + {*T2*}火會蔓延{*ETW*}{*B*} + 啟用此選項時,火會蔓延到附近易燃的方塊。您也可以從遊戲中變更此選項。{*B*}{*B*} + + {*T2*}炸藥會爆炸{*ETW*}{*B*} + 啟用此選項時,引爆炸藥後就會發生爆炸。您也可以從遊戲中變更此選項。{*B*}{*B*} + + {*T2*}主持人特權{*ETW*}{*B*} + 啟用此選項時,主持人可以在遊戲中切換自己的飛翔能力、停用疲勞功能,或是讓自己隱形。{*DISABLES_ACHIEVEMENTS*}{*B*}{*B*} + + {*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*} + + {*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*}主機的玩家選取此選項,會將該玩家或使用其他 {*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*} + 這可以讓玩家在世界中傳送其他玩家或者他自己到其他玩家身邊。 + + +不是同一個玩家{*PLATFORM_NAME*}主控台為主機播放程式中,選取此選項將踢出玩家的遊戲和其他玩家在其{*PLATFORM_NAME*}主控台。這位玩家不能再加入遊戲,直到重新啟動。 + +下一頁 + +上一頁 + +基本介紹 + +抬頭顯示器 + +物品欄 + +箱子 + +精製 + +熔爐 + +發射器 + +飼養動物 + +繁殖動物 + +釀製 + +附加能力 + +地獄傳送門 + +多人遊戲 + +分享螢幕擷取畫面 + +禁用關卡 + +創造模式 + +主持人與玩家選項 + +交易 + +鐵砧 + +終界 + +{*T3*}遊戲方式:終界{*ETW*}{*B*}{*B*} +終界是遊戲中的另一個世界,只要進入已啟動的終界入口就能到達。終界入口位於地上世界的地下深處要塞。{*B*} +把終界之眼放入沒有終界之眼的終界入口框架中就能啟動終界入口。{*B*} +跳進已啟動的入口即可前往終界。{*B*}{*B*} +您將在終界中對抗許多的 Enderman 以及凶狠強大的終界龍,所以請在進入終界之前做好準備! {*B*}{*B*} +您會發現 8 根黑曜石柱,其頂端都有終界水晶,終界龍會用水晶來治療自己, +因此戰鬥的第一步就是要摧毀這些水晶。{*B*} +只要用箭就能摧毀前面幾顆水晶,不過後面幾顆水晶受到鐵柵欄籠子的保護,需要建造方塊抵達石柱頂端才有辦法摧毀。{*B*}{*B*} +終界龍會在您建造的時候飛過來進行攻擊並向您吐終界酸液球!{*B*} +只要一接近被石柱包圍的龍蛋台,終界龍就會飛下來攻擊您,這會是對終界龍使出強力攻擊的好機會!{*B*} +閃避酸液氣攻擊的同時並攻擊終界龍的眼睛會有最佳的攻擊效果。如果可以的話,帶好友一起進入終界幫助您作戰! {*B*}{*B*} +您的好友會在您進入終界之後,在他們的地圖上看到位於要塞中的終界入口, +這樣他們就能輕鬆地加入您。 + + +奔跑 + +最新資訊 + +{*T3*}變更及新增功能{*ETW*}{*B*}{*B*} +- 新增物品:硬化黏土、染色黏土、煤炭方塊、乾草捆、啟動鐵軌、紅石方塊、陽光感測器、投擲器、漏斗、漏斗礦車、火藥礦車、紅石比較器、測重壓力板、燈塔、陷阱儲物箱、煙火火箭、煙火星、幽冥星、繩索、馬鎧、名牌、馬重生蛋。{*B*} +- 新增生物:凋零怪、凋零骷髏、女巫、蝙蝠、馬、驢和騾。{*B*} +- 新增地形生成功能:女巫屋。{*B*} +- 新增燈塔介面。{*B*} +- 新增馬介面。{*B*} +- 新增漏斗介面。{*B*} +- 新增煙火:您擁有製作煙火星或煙火火箭的材料時,可以從工作台進入煙火介面。{*B*} +- 新增「冒險模式」:您只能用正確的工具打破方塊。{*B*} +- 新增許多聲音。{*B*} +- 生物、物品和投射物現在能通過入口。{*B*} +- 現在只要用另一個中繼器為中繼器供電,就可以把它鎖起來。{*B*} +- 殭屍和骷髏現在可以用不同的武器和護甲重生。{*B*} +- 新死亡訊息。{*B*} +- 用命名牌為生物命名,以及在功能表開啟時為容器重新命名來變更標題。{*B*} +- 骨粉不再讓每樣東西立即完全長大,而是會隨機讓每樣東西於不同的階段生長。{*B*} +- 直接朝儲物箱、釀造台、發射器和唱片機放置紅石比較器,即可偵測到說明這些東西裡面內容物的紅石訊號。{*B*} +- 發射器可以朝任何方向。{*B*} +- 玩家於吃下金蘋果之後,就能短暫獲得額外的生命值去「吸收」傷害。{*B*} +- 您在某個區域停留時間越久,在該區域重生的怪物越難被打敗。{*B*} + +{*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*} + + +燈塔 + +{*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*} +如果投擲器朝向儲物箱或另一種容器,物品則會放進那裡面。您可以打造投擲器的長鏈子運輸物品,但是必須交替開啟關閉電源才能發揮功能。 + + +能造成比用手劈砍更大的傷害。 + +用來挖泥土、青草、沙子、礫石及白雪時的速度,會比用手挖還要快。您需要用鏟子才能挖雪球。 + +您需要用十字鎬才能開採石頭相關方塊和礦石。 + +用來劈砍木頭相關方塊的速度,會比用手劈砍還要快。 + +用來在泥土和青草方塊上整地,以便準備耕種。 + +木門只要透過使用或敲擊,或是使用紅石就能啟動。 + +鐵門只能透過紅石、按鈕或開關來開啟。 + +未使用 + +未使用 + +未使用 + +未使用 + +穿戴時會讓使用者擁有 1 點護甲值。 + +穿戴時會讓使用者擁有 3 點護甲值。 + +穿戴時會讓使用者擁有 2 點護甲值。 + +穿戴時會讓使用者擁有 1 點護甲值。 + +穿戴時會讓使用者擁有 2 點護甲值。 + +穿戴時會讓使用者擁有 5 點護甲值。 + +穿戴時會讓使用者擁有 4 點護甲值。 + +穿戴時會讓使用者擁有 1 點護甲值。 + +穿戴時會讓使用者擁有 2 點護甲值。 + +穿戴時會讓使用者擁有 6 點護甲值。 + +穿戴時會讓使用者擁有 5 點護甲值。 + +穿戴時會讓使用者擁有 2 點護甲值。 + +穿戴時會讓使用者擁有 2 點護甲值。 + +穿戴時會讓使用者擁有 5 點護甲值。 + +穿戴時會讓使用者擁有 3 點護甲值。 + +穿戴時會讓使用者擁有 1 點護甲值。 + +穿戴時會讓使用者擁有 3 點護甲值。 + +穿戴時會讓使用者擁有 8 點護甲值。 + +穿戴時會讓使用者擁有 6 點護甲值。 + +穿戴時會讓使用者擁有 3 點護甲值。 + +只要在熔爐中熔煉礦石,就能取得閃亮的錠塊。錠塊可用來精製成相同材質的工具。 + +您可以將錠塊、寶石或染料精製成可放置的方塊,然後拿來當做昂貴的建築材料,或是壓縮的礦石存放方式。 + +當玩家、動物或怪物踏上壓板時,壓板就會送出電流。如果您讓東西掉落在木壓板上,也能啟動送出電流。 + +可用來組成樓梯。 + +可用來組成長長的樓梯。把 2 個板子上下重疊,就會產生普通大小的雙層板方塊。 + +可用來組成長長的樓梯。把 2 個板子上下重疊,就會產生普通大小的雙層板方塊。 + +可用來產生光線,還能用來融化白雪和冰塊。 + +無論是哪種木頭,都可以精製成木板。木板可當做建築材料,還能用來精製出許多種物品。 + +可當做建築材料。沙岩不會受到重力的影響,不像普通的沙子會因為重力而往下掉。 + +可當做建築材料。 + +可用來精製出火把、箭、牌子、梯子、柵欄,還能當做工具與武器的把手。 + +當遊戲世界進入夜晚時,只要世界中的所有玩家都使用床舖睡覺,就能讓時間立刻從夜晚跳到早晨。而且使用床舖也會改變玩家的再生點。 +無論您用哪種色彩的羊毛來精製床舖,床舖的色彩都會是一樣的。 + +與一般的精製介面相較之下,精製台可讓您精製出更多種類的物品。 + +可讓您熔煉礦石、製造木炭與玻璃,還能烹煮生魚和生豬肉。 + +可讓您在裡面存放方塊和物品。把 2 個箱子並排放置,就能製造出有 2 倍容量的大箱子。 + +可當做無法躍過的屏障。對玩家、動物及怪物而言,柵欄有 1.5 個方塊高;但對於其他方塊來說,柵欄只有 1 個方塊高。 + +可讓您上下攀爬。 + +只要透過使用或敲擊,或是使用紅石就能啟動。活板門的功用與一般的門相同,但大小是 1 x 1 的方塊,而且放置後會平躺在地面上。 + +可顯示您或其他玩家輸入的文字。 + +比火把更亮的光源。可以用來融化白雪和冰塊,還能在水面下使用。 + +可用來產生爆炸。炸藥放置後,只要用打火鐮點燃,或利用電流即可啟動。 + +可用來裝燉蘑菇。當您吃掉燉蘑菇時,碗會保留下來。 + +可用來裝水、熔岩及牛奶,讓您能夠把這些物品運送到其他地方。 + +可用來裝水,讓您能夠把水運送到其他地方。 + +可用來裝熔岩,讓您能夠把熔岩運送到其他地方。 + +可用來裝牛奶,讓您能夠把牛奶運送到其他地方。 + +可用來生火、點燃炸藥,以及啟動蓋好的傳送門。 + +可用來釣魚。 + +會顯示目前太陽與月亮的位置。 + +會持續指向您的起點。 + +用手握住時,會顯示某個地區中已探索區域的影像。可讓您用來尋找能前往某個地點的路。 + +使用後會成為您身處世界的地圖,而且會隨著您的探索腳步填滿。 + +可射出箭來遠距攻擊。 + +可與弓組成武器。 + +凋零怪所扔下,用於製作燈塔。 + +啟動時,建立彩色爆炸。顏色、效果、形狀和淡出取決於建立煙火時使用的煙火星。 + +用來決定煙火的顏色、效果和形狀。 + +用於紅石電路,以維持、比較或除去信號強度,或是測量若干方塊的狀態。 + +屬於一種貨物礦車類型,功能是移動的 TNT 方塊。 + +是根據陽光 (或缺乏陽光) 發出紅石信號的方塊。 + +屬於特殊的貨物礦車類型,功能類似漏斗,會收集軌道上的物品以及上方容器內的物品。 + +特殊護甲類型,可以裝在馬上。提供 5 護甲。 + +特殊護甲類型,可以裝在馬上。提供 7 護甲。 + +特殊護甲類型,可以裝在馬上。提供 11 護甲。 + +用來將生物拴在玩家或柵欄柱 + +用來為世界上的生物命名。 + +可回復 2.5 個 {*ICON_SHANK_01*}。 + +使用 1 次可回復 1 個 {*ICON_SHANK_01*},總共能使用 6 次。 + +可回復 1 個 {*ICON_SHANK_01*}。 + +可回復 1 個 {*ICON_SHANK_01*}。 + +可回復 3 個 {*ICON_SHANK_01*}。 + +可回復 1 個 {*ICON_SHANK_01*},或可在熔爐中烹煮。食用可能會讓您中毒。 + +可回復 3 個 {*ICON_SHANK_01*}。在熔爐烹煮生雞肉即可獲得。 + +可回復 1.5 個 {*ICON_SHANK_01*},或可在熔爐中烹煮。 + +可回復 4 個 {*ICON_SHANK_01*}。在熔爐烹煮生牛肉即可獲得。 + +可回復 1.5 個 {*ICON_SHANK_01*},或可在熔爐中烹煮。 + +可回復 4 個 {*ICON_SHANK_01*}。在熔爐烹煮生豬肉即可獲得。 + +可回復 1 個 {*ICON_SHANK_01*},或可在熔爐中烹煮。也可用來餵食豹貓以馴服牠們。 + +可回復 2.5 個 {*ICON_SHANK_01*}。在熔爐烹煮生魚即可獲得。 + +可回復 2 個 {*ICON_SHANK_01*},還能精製成金蘋果。 + +可回復 2 個 {*ICON_SHANK_01*},並在 4 秒內持續回復生命值。用蘋果和碎金塊精製而成。 + +可回復 2 個 {*ICON_SHANK_01*}。食用可能會讓您中毒。 + +可用來製作蛋糕或當做釀製藥水的材料。 + +開啟時會送出電流。當拉桿開啟或關閉後,就會保持在這個狀態,直到下次開啟或關閉為止。 + +紅石火把會持續送出電流,也可以在連接到方塊側邊時做為接收器或傳送器。 +紅石火把還可以當做亮度較低的光源。 + +可在紅石電路中當做中繼器、延遲器,及/或真空管。 + +按下後即會啟動並送出電流,持續時間大約 1 秒鐘,然後就會再次關閉。 + +可用來裝填物品,並在收到紅石送出的電流時隨機射出其中的物品。 + +啟動後會播放 1 個音符的聲音,受到敲擊後就會變更音符的音調。把音符方塊放在不同的方塊上面,就會改變樂器的類型。 + +可用來引導礦車的行進路線。 + +有動力時,會讓經過的礦車加速。沒有動力時,會讓碰到的礦車停在上面。 + +功能跟壓板一樣 (會在啟動時送出紅石信號),但只能靠礦車來啟動。 + +可用來沿著軌道運送您、動物或怪物。 + +可用來沿著軌道運送物品。 + +當裡面有煤塊時,可自動在軌道上移動,或是推動其他礦車。 + +可讓您在水面上移動,而且速度會比游泳快。 + +可從綿羊身上收集,還能用染料染色。 + +可當做建築材料,還能用染料染色。但我們不建議您使用這個製作方法,因為您可以輕易地從綿羊身上取得羊毛。 + +當做染料來製造黑色羊毛。 + +可當做染料來製造綠色羊毛。 + +可當做染料來製造棕色羊毛,製作餅乾的材料或者用來栽種可可樹。 + +可當做染料來製造銀色羊毛。 + +可當做染料來製造黃色羊毛。 + +可當做染料來製造紅色羊毛。 + +可用來讓作物、樹木、茂密青草、巨型蘑菇及花朵立刻長大,還能與某些染料組合成新的染料。 + +可當做染料來製造粉紅色羊毛。 + +可當做染料來製造橘色羊毛。 + +可當做染料來製造亮綠色羊毛。 + +可當做染料來製造灰色羊毛。 + +可當做染料來製造淺灰色羊毛。 +(注意:您可以把灰色染料與骨粉組合成淺灰色染料,讓您可以用 1 個墨囊製造出 4 個淺灰色染料,而不是 3 個。) + +可當做染料來製造淺藍色羊毛。 + +可當做染料來製造水藍色羊毛。 + +可當做染料來製造紫色羊毛。 + +可當做染料來製造紫紅色羊毛。 + +可當做染料來製造藍色羊毛。 + +可用來播放唱片。 + +可用來製造非常強韌、堅硬的工具、武器或護甲。 + +比火把更亮的光源。可以用來融化白雪和冰塊,還能在水面下使用。 + +可用來製造書本和地圖。 + +可用來製造書架或者是附魔來製作附魔小冊。 + +放置在附加能力台附近的時候可以讓創作擁有更強力的附加效果。 + +可當做裝飾品。 + +可用鐵鎬或更堅硬的十字鎬開採,然後在熔爐中熔煉成黃金錠塊。 + +可用石鎬或更堅硬的十字鎬開採,然後在熔爐中熔煉成鐵錠塊。 + +可用十字鎬開採來收集煤塊。 + +可用石鎬或更堅硬的十字鎬開採來收集青金石。 + +可用鐵鎬或更堅硬的十字鎬開採來收集鑽石。 + +可用鐵鎬或更堅硬的十字鎬開採來收集紅石塵。 + +可用十字鎬開採來收集鵝卵石。 + +可用鏟子來收集,能當做建築材料。 + +可讓您栽種,最後會長成樹木。 + +這不會破裂。 + +會讓接觸到的任何東西著火。可以用桶子來收集。 + +可用鏟子來收集,能在熔爐中熔煉成玻璃。當下方沒有東西時,會受重力的影響而往下掉。 + +可用鏟子來收集,挖掘時偶爾會挖出打火石。當下方沒有東西時,會受重力的影響而往下掉。 + +可用斧頭劈砍來收集,能精製成木板,或是當做燃料使用。 + +在熔爐中熔煉沙子即可獲得。可當做建築材料,但當您開採玻璃時,玻璃會破碎。 + +用十字鎬開採石頭即可獲得,可用來建造熔爐或石製工具。 + +用熔爐燒黏土之後即可獲得。 + +可在熔爐中燒成磚塊。 + +破裂之後會掉落黏土球,可在熔爐中將黏土球烤成磚塊。 + +壓縮的雪球存放方式。 + +可用鏟子挖掘來製造雪球。 + +破裂時偶爾會出現小麥種子。 + +可精製成染料。 + +可與碗一起精製成燉蘑菇。 + +可用鑽石鎬來開採。當靜止的熔岩碰到水時,就會產生黑曜石。黑曜石可用來建造傳送門。 + +可產生怪物。 + +可放置在地上來傳送電流。當與藥水一起釀製時,將會增加效果的持續時間。 + +完全成熟後,即可收成來收集小麥。 + +已經準備好能栽種種子的地面。 + +可用熔爐烹煮來取得綠色染料。 + +可精製成砂糖。 + +可當做頭盔使用,或是與火把一起精製成南瓜燈。也是製作南瓜派的主要材料。 + +點燃後會永遠燃燒。 + +會讓任何經過其上方的東西減速。 + +站在傳送門中,即可讓您在地上世界與地獄世界之間往返。 + +可當做熔爐的燃料,或是精製成火把。 + +殺死蜘蛛即可獲得,可用來精製成弓或釣魚竿,或者是放置於地面來製作絆線。 + +殺死雞即可獲得,可用來精製成箭。 + +殺死 Creeper 即可獲得,可用來精製成炸藥或者當作釀製藥水的材料。 + +在農田栽種即可長成作物。切記:種子需要足夠的光線才能成長! + +收成作物即可獲得,可用來精製成食物。 + +挖掘礫石即可獲得,可用來精製成打火鐮。 + +用在豬身上時,可讓您騎豬。您可以使用「願者上鉤」這項道具來操控豬的移動方向。 + +挖掘白雪即可獲得,可讓您投擲。 + +殺死乳牛即可獲得,可用來精製成護甲或用來製作書本。 + +殺死史萊姆即可獲得,並可當做釀製藥水的材料或者是用來製作黏性活塞。 + +雞會隨機生蛋,而蛋可用來精製成食物。 + +開採閃石即可獲得,可透過精製變回閃石方塊或者與藥水釀製來提高附加能力的效果。 + +殺死骷髏後即可收集,可用來精製成骨粉,餵狼吃還可馴服狼。 + +設法讓骷髏殺死 Creeper 後即可收集,可利用點唱機來播放。 + +可用來滅火,或協助作物生長。您可用桶子來裝水。 + +破碎時偶爾會掉落樹苗,讓您能重新栽種並長成樹木。 + +可在地下迷宮找到,可當做建築材料和裝飾品。 + +可用來取得綿羊身上的羊毛,以及獲得樹葉方塊。 + +當活塞有動力時 (使用按鈕、拉桿、壓板、紅石火把,或是紅石來啟動活塞),會在情況允許下延伸出去推動方塊。 + +當活塞有動力時 (使用按鈕、拉桿、壓板、紅石火把,或是紅石來啟動活塞),會在情況允許下延伸出去推動方塊。黏性活塞縮回時,會把接觸到活塞延伸部分的方塊一起拉回。 + +由石頭方塊製造而成,通常能在地下要塞中找到。 + +可當做屏障,類似柵欄。 + +類似門,但主要與柵欄搭配使用。 + +精製西瓜片即可獲得。 + +可用來取代玻璃方塊的透明方塊。 + +栽種即可長成南瓜。 + +栽種即可長成西瓜。 + +會在 Enderman 死亡時掉落,投擲後玩家即會在失去些許生命值的同時,被傳送到終界珍珠所在之處。 + +上面長草的泥土方塊。可用鏟子來收集,能當做建築材料。 + +可當做建築材料和裝飾品。 + +當您通過時,行走速度會變慢。可使用羊毛剪摧毀,並收集絲線。 + +摧毀時會產生 Silverfish。如果附近有隻 Silverfish 遭到攻擊,也可能會產生另一隻 Silverfish。 + +放置後會隨著時間生長。使用羊毛剪即可收集。可像梯子一樣攀爬。 + +在上面行走時會感覺滑溜。如果冰塊下面有其他方塊,當您摧毀冰塊時,冰塊就會變成水。如果冰塊太靠近光源或地獄,就會融化。 + +可當做裝飾品。 + +可用來釀製藥水或尋找地下要塞。由 Blaze 掉落,而 Blaze 多半出沒於地獄要塞的裡面或附近。 + +可用來釀製藥水,會在 Ghast 死亡時掉落。 + +會在殭屍 Pigmen 死亡時掉落,可在地獄找到殭屍 Pigmen。是釀製藥水的材料。 + +可用來釀製藥水。生長在地獄要塞中,也可以種植在魂沙上。 + +依據使用對象的不同,使用時會有各種不同的效果。 + +可用來裝水,並可在釀製台當成製作藥水一開始時就必須用到的材料。 + +這是有毒的食物和釀製物品,會在蜘蛛或穴蜘蛛被玩家殺死時掉落。 + +可用來釀製藥水,且絕大部分用來製造具備負面效果的藥水。 + +可用來釀製藥水,或與其他物品一起精製成終界之眼或熔岩球。 + +可用來釀製藥水。 + +可用來製作藥水和噴濺藥水。 + +可使用雨水或水桶替水槽裝水,然後即可用來替水瓶裝水。 + +投擲後即會顯示前往終界入口的方向。將十二個終界之眼放置於終界入口框架上後,即可啟動終界入口。 + +可用來釀製藥水。 + +跟青草方塊很像,但非常適於在上面栽種蘑菇。 + +會浮在水面,且可在上面行走。 + +可用來建造地獄要塞,且不受 Ghast 的火球傷害。 + +用在地獄要塞。 + +出現於地獄要塞,會在地獄結節破裂後掉落。 + +您可在附加能力台使用您的經驗值,將特殊能力附加到劍、鎬、斧、鏟、弓和護甲上。 + +終界入口可由十二個終界之眼啟動,玩家可經由終界入口進入終界。 + +可用來製作終界入口。 + +這是一種只會在終界出現的方塊,防爆性很高,很適合拿來建造。 + +擊敗終界的龍就會產生這個方塊。 + +投擲後經驗值光球會掉落,收集光球即可增加您的經驗值。 + +很適合用來讓東西著火,或者是點燃發射器的火焰。 + +類似展示櫃,可將物品或方塊放置在裡面展示。 + +投擲出去時可再生出當中所顯示的生物類型。 + +可用來組成長長的樓梯。把 2 個板子上下重疊,就會產生普通大小的雙層板方塊。 + +可用來組成長長的樓梯。把 2 個板子上下重疊,就會產生普通大小的雙層板方塊。 + +在熔爐中熔煉地獄血石即可獲得。能精製成地獄磚塊方塊。 + +有動力時會發出光線。 + +耕種即可收集可可豆。 + +生物頭顱可當裝飾品或當做面具戴在頭盔空格中。 + +用來執行指令。 + +朝天空發射光束,而且能夠為附近玩家提供狀態效果。 + +將方塊和物品儲存在裡面。將兩個儲物箱並排在一起,即可建立兩倍容量的大型儲物箱。陷阱儲物箱還會在開啟時建立紅石彈。 + +提供紅石彈,當板上的物品越多,彈的力量越強大。 + +提供紅石彈,板上物品越多越強大。相較於輕型板子,需要更多重量。 + +用來當成紅石能源。可製作還原回紅石。 + +用來接住物品,或是將物品送進容器或從容器取出。 + +這種類型的軌道能夠啟用或停用漏斗礦車,以及觸發 TNT 礦車。 + +用來裝物品及扔下物品,或是在獲得紅石彈時,將物品推入另一個容器。 + +為硬化黏土染色,即可製作彩色方塊。 + +能夠餵食馬、驢或騾,最多治癒 10 顆心。加快小馬和小驢生長的速度。 + +在熔爐熔黏土即可製造出來。 + +用玻璃和染料製作。 + +用彩繪玻璃製作 + +儲存煤的壓縮方法。可以當做爐的燃料。 + +烏賊 + +被殺死時會掉落墨囊。 + +乳牛 + +被殺死時會掉落皮革。您也可以用桶子來擠牛奶。 + +綿羊 + +被剪羊毛時會掉落羊毛 (前提是牠的羊毛還沒被剪掉)。可染色來讓綿羊擁有不同色彩的羊毛。 + + + +被殺死時會掉落羽毛,還會隨機生蛋。 + + + +被殺死時會掉落豬肉。您還可以使用鞍座來騎在豬上。 + + + +狼是溫馴的動物,但當您攻擊牠時,牠就會攻擊您。您可以使用骨頭來馴服狼,這會讓牠跟著您走,並攻擊任何在攻擊您的東西。 + +Creeper + +如果您靠太近就會爆炸! + +骷髏 + +會對您射箭,被殺死時會掉落箭。 + +蜘蛛 + +如果您靠近蜘蛛,牠就會攻擊您。蜘蛛會爬牆,被殺死時會掉落絲線。 + +殭屍 + +如果您靠近殭屍,殭屍就會攻擊您。 + +殭屍 Pigman + +殭屍 Pigman 是溫馴的怪物,但如果您攻擊整群殭屍 Pigman 中的一個,整群殭屍 Pigman 就會開始攻擊您。 + +Ghast + +會對您發射火球,而且火球碰到東西時會爆炸。 + +史萊姆 + +受傷害時會分裂成數個小史萊姆。 + +Enderman + +如果您直視 Enderman,Enderman 就會攻擊您,而且還會到處移動方塊。 + +Silverfish + +當 Silverfish 受到攻擊時,會引來躲在附近的 Silverfish。牠們會躲在石頭方塊中。 + +穴蜘蛛 + +擁有毒牙。 + +Mooshroom + +與碗一起使用可用來燉蘑菇,剪毛後會掉落蘑菇,且會變成普通的乳牛。 + +雪人 + +玩家可用白雪方塊和南瓜製作雪人。雪人會對製作者的敵人投擲雪球。 + +終界龍 + +這是出現在終界的巨大黑龍。 + +Blaze + +Blaze 是地獄裡的敵人,絕大部分皆分布在地獄要塞中。當 Blaze 被殺死時會掉落 Blaze 棒。 + +熔岩怪 + +熔岩怪出現於地獄,被殺死時會分裂成很多小熔岩怪,這點跟史蘭姆很像。 + +村民 + +豹貓 + +分布在熱帶叢林中,餵生魚就能馴服牠們。但前提是必須讓豹貓靠近您,畢竟任何一個突然的動作都會嚇跑牠們。 + +鐵傀儡 + +出現來保護村落,可以用鐵塊跟南瓜製作。 + +蝙蝠 + +這些飛行生物居住在洞窟或其他大型封閉空間。 + +女巫 + +這些敵人居住在沼澤,她們會投擲藥水攻擊您。當您殺死她們,藥水就會掉下來。 + + + +這些動物能夠馴服,接著便可供騎乘。 + + + +這些動物能夠馴服,接著便可供騎乘,而且可以裝上儲物箱。 + + + +馬和驢的後代。這些動物能夠被馴服,接著便可供人騎乘、穿戴護甲並攜帶儲物箱。 + +殭屍馬 + +骷髏馬 + +凋零怪 + +製作原料包括凋零骷髏頭和靈魂沙,他們會朝您發射爆炸骷髏頭。 + +爆炸動畫繪製者 + +概念藝術家 + +數字運算與統計數據 + +欺負協調者 + +原始設計與編碼者 + +專案經理/製作者 + +其餘 Mojang 辦公室 + +領導遊戲程式設計師 Minecraft PC + +Ninja 程式編碼者 + +首席執行長 + +白領勞工 + +客戶支援 + +辦公室 DJ + +設計者/程式設計師 Minecraft - 袖珍版 + +開發者 + +首席建築師 + +藝術開發者 + +遊戲加工者 + +有趣董事 + +音樂與聲音 + +程式設計 + +藝術 + +QA + +執行製作者 + +主管製作者 + +製作者 + +測試主管 + +主管測試員 + +設計團隊 + +開發團隊 + +發布管理 + +董事, XBLA 公佈 + +業務開發 + +投資董事 + +製作經理 + +行銷 + +社群經理 + +歐洲在地化團隊 + +Redmond 在地化團隊 + +亞洲在地化團隊 + +使用者研究團隊 + +MGS 中心團隊 + +里程碑驗收測試員 + +特別感謝 + +測試經理 + +資深測試主管 + +SDET + +專案 STE + +其他 STE + +測試相關 + +Jon Kagstrom + +Tobias Möllstam + +Risë 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 頭顱 + +幽冥星 + +煙火火箭 + +煙火星 + +紅石比較器 + +TNT 礦車 + +漏斗礦車 + +鐵馬鎧 + +黃金馬鎧 + +鑽石馬鎧 + +繩索 + +名牌 + +石頭 + +青草方塊 + +泥土 + +鵝卵石 + +橡樹厚木板 + +杉樹厚木板 + +樺樹厚木板 + +熱帶叢林厚木板 + +木材厚木板 (任何類型) + +樹苗 + +橡樹樹苗 + +杉樹樹苗 + +樺樹樹苗 + +熱帶叢林樹苗 + +基岩 + +水體 + +熔岩 + +沙子 + +沙岩 + +礫石 + +黃金礦石 + +鐵礦石 + +煤礦石 + +木頭 + +橡樹木頭 + +杉樹木頭 + +樺樹木頭 + +熱帶叢林木頭 + +橡樹 + +杉樹 + +樺樹 + +樹葉 + +橡樹樹葉 + +杉樹樹葉 + +樺樹樹葉 + +熱帶叢林樹葉 + +海綿 + +玻璃 + +羊毛 + +黑色羊毛 + +紅色羊毛 + +綠色羊毛 + +棕色羊毛 + +藍色羊毛 + +紫色羊毛 + +水藍色羊毛 + +淺灰色羊毛 + +灰色羊毛 + +粉紅色羊毛 + +亮綠色羊毛 + +黃色羊毛 + +淺藍色羊毛 + +紫紅色羊毛 + +橘色羊毛 + +白色羊毛 + +花朵 + +玫瑰 + +蘑菇 + +黃金方塊 + +一種精簡儲存黃金的方式。 + +一種精簡儲存鐵的方式。 + +鐵方塊 + +石板 + +石板 + +沙岩板 + +橡樹木板 + +鵝卵石板 + +磚塊板 + +石磚塊板 + +橡樹木板 + +杉樹木板 + +樺樹木板 + +熱帶叢林木板 + +地獄磚塊板 + +磚塊 + +炸藥 + +書架 + +苔蘚石 + +黑曜石 + +火把 + +火把 (煤塊) + +火把 (木炭) + + + +怪物產生器 + +橡樹木梯 + +箱子 + +紅石塵 + +鑽石礦石 + +鑽石方塊 + +一種精簡儲存鑽石的方式。 + +精製台 + +作物 + +農地 + +熔爐 + +牌子 + +木門 + +梯子 + +軌道 + +動力軌道 + +偵測器軌道 + +石梯 + +拉桿 + +壓板 + +鐵門 + +紅石礦石 + +紅石火把 + +按鈕 + +白雪 + +冰塊 + +仙人掌 + +黏土 + +甘蔗 + +點唱機 + +柵欄 + +南瓜 + +南瓜燈 + +地獄血石 + +魂沙 + +閃石 + +傳送門 + +青金石礦石 + +青金石方塊 + +一種精簡儲存青金石的方式。 + +發射器 + +音符方塊 + +蛋糕 + +床舖 + +蜘蛛網 + +茂密青草 + +枯灌木 + +真空管 + +上鎖的箱子 + +活板門 + +羊毛 (不限色彩) + +活塞 + +黏性活塞 + +Silverfish 方塊 + +石磚塊 + +長滿青苔的石磚塊 + +裂開的石磚塊 + +刻紋石磚塊 + +蘑菇 + +蘑菇 + +鐵條 + +玻璃片 + +西瓜 + +南瓜莖 + +西瓜莖 + +藤蔓 + +柵欄門 + +磚塊梯 + +石磚塊梯 + +Silverfish 石 + +Silverfish 鵝卵石 + +Silverfish 石磚塊 + +菌絲體 + +睡蓮 + +地獄磚塊 + +地獄磚塊柵欄 + +地獄磚塊梯 + +地獄結節 + +附加能力台 + +釀製台 + +水槽 + +終界入口 + +終界入口框架 + +終界石 + +龍蛋 + +矮樹 + + + +沙岩梯 + +杉樹木梯 + +樺樹木梯 + +熱帶叢林木梯 + +紅石燈 + +可可 + +骷髏 + +指令方塊 + +燈塔 + +陷阱儲物箱 + +測重壓力板(輕型) + +測重壓力板(重型) + +紅石比較器 + +陽光感測器 + +紅石方塊 + +漏斗 + +啟動鐵軌 + +投擲器 + +染色黏土塊 + +乾草捆 + +硬化黏土 + +煤炭塊 + +黑色染色黏土塊 + +紅色染色黏土塊 + +綠色染色黏土塊 + +棕色染色黏土塊 + +藍色染色黏土塊 + +紫色染色黏土塊 + +青綠色染色黏土塊 + +淺灰色染色黏土塊 + +灰色染色黏土塊 + +粉紅色染色黏土塊 + +淡黃綠色染色黏土塊 + +黃色染色黏土塊 + +淺藍色染色黏土塊 + +洋紅色染色黏土塊 + +橘色染色黏土塊 + +白色染色黏土塊 + +彩繪玻璃 + +黑色彩繪玻璃 + +紅色彩繪玻璃 + +綠色彩繪玻璃 + +棕色彩繪玻璃 + +藍色彩繪玻璃 + +紫色彩繪玻璃 + +青綠色彩繪玻璃 + +淺灰色彩繪玻璃 + +灰色彩繪玻璃 + +粉紅色彩繪玻璃 + +淡黃綠色彩繪玻璃 + +黃色彩繪玻璃 + +淺藍色彩繪玻璃 + +洋紅色彩繪玻璃 + +橘色彩繪玻璃 + +白色彩繪玻璃 + +彩繪玻璃窗格 + + +黑色彩繪玻璃窗格 + + +紅色彩繪玻璃窗格 + + +綠色彩繪玻璃窗格 + +棕色彩繪玻璃窗格 + +藍色彩繪玻璃窗格 + +紫色彩繪玻璃窗格 + +青綠色彩繪玻璃窗格 + +淺灰色彩繪玻璃窗格 + +灰色彩繪玻璃窗格 + +粉紅色彩繪玻璃窗格 + +淡黃綠色彩繪玻璃窗格 + +黃色彩繪玻璃窗格 + +淺藍色彩繪玻璃窗格 + +洋紅色彩繪玻璃窗格 + +橘色彩繪玻璃窗格 + +白色彩繪玻璃窗格 + +小球 + +大球 + +星型 + +Creeper 型 + +爆裂 + +不明形狀 + +黑色 + +紅色 + +綠色 + +棕色 + +藍色 + +紫色 + +青綠色 + +淺灰色 + +灰色 + +粉紅色 + +淡黃綠色 + +黃色 + +淺藍色 + +洋紅色 + +橘色 + +白色 + +自訂 + +淡化 + +閃爍 + +鐵軌 + +戰鬥持續時間: +  +目前的控制方式 + +配置 + +移動/奔跑 + +觀看 + +暫停 + +跳躍 + +跳躍/往上飛 + +物品欄 + +依序更換手中的物品 + +動作 + +使用 + +精製 + +丟棄 + +潛行 + +潛行/往下飛 + +變更視角模式 + +玩家/邀請 + +移動 (飛行時) + +配置 1 + +配置 2 + +配置 3 + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +{*B*}請按下 {*CONTROLLER_VK_A*} 來繼續。 + +{*B*}請按下 {*CONTROLLER_VK_A*} 來開始教學課程。{*B*} + 如果您覺得自己已經準備好,可以獨自玩遊戲了,請按下 {*CONTROLLER_VK_B*}。 + +Minecraft 是一款可讓您放置方塊來建造夢想世界的遊戲。 +但千萬別忘了要在夜行怪物出現之前,先蓋好一個棲身處喔。 + +使用 {*CONTROLLER_ACTION_LOOK*} 即可往上、下及四周觀看。 + +使用 {*CONTROLLER_ACTION_MOVE*} 即可四處移動。 + +如要奔跑,只要快速往前按兩下 {*CONTROLLER_ACTION_MOVE*} 即可。當您往前按住 {*CONTROLLER_ACTION_MOVE*} 時,角色將會繼續奔跑,直到奔跑時間結束或是食物消耗完畢為止。 + +按下 {*CONTROLLER_ACTION_JUMP*} 即可跳躍。 + +按住 {*CONTROLLER_ACTION_ACTION*} 即可用您的手,或是手中握住的東西來開採及劈砍。但您可能需要精製出工具來開採某些方塊。 + +請按住 {*CONTROLLER_ACTION_ACTION*} 來砍下 4 個木頭方塊 (樹幹)。{*B*}當方塊被劈砍下來後,只要站在隨後出現的浮空物品旁邊,該物品就會進入您的物品欄。 + +按下 {*CONTROLLER_ACTION_CRAFTING*} 即可開啟精製介面。 + +在您不斷收集和精製物品的同時,物品欄也會逐漸填滿。{*B*} + 請按下 {*CONTROLLER_ACTION_INVENTORY*} 來開啟物品欄。 + +當您四處移動、開採和攻擊時,就會消耗食物列 {*ICON_SHANK_01*}。奔跑和快速跳躍時所消耗的食物量,會比行走和正常跳躍時所消耗的多。 + +如果您失去部分生命值,但是食物列有 9 個以上的 {*ICON_SHANK_01*},您的生命值將會自動回復。只要吃下食物,就能補充食物列。 + +只要把食物握在手中,然後按住 {*CONTROLLER_ACTION_USE*} 即可吃下該食物來補充您的食物列。當食物列全滿時,您無法再吃東西。 + +您的食物列即將耗盡,而且您失去了部分生命值。請吃下物品欄中的牛排來補充食物列,並開始回復生命值。{*ICON*}364{*/ICON*} + +您收集來的木頭可以精製成木板。請開啟精製介面來精製木板。{*PlanksIcon*} + +許多精製過程包含好幾個步驟。現在您已經有幾片木板,就能夠精製出更多物品了。請建造 1 個精製台。{*CraftingTableIcon*} + +如果您想要加快收集方塊的速度,可以建造專為該工作所設計的工具。某些工具上有用木棍做成的把手。請立刻精製出幾根木棍。{*SticksIcon*} + +使用 {*CONTROLLER_ACTION_LEFT_SCROLL*} 和 {*CONTROLLER_ACTION_RIGHT_SCROLL*} 即可變更手中握住的物品。 + +使用 {*CONTROLLER_ACTION_USE*} 即可使用物品、與物體互動,以及放置某些物品。如果您想要撿起已經放置的物品,只要使用正確的工具敲擊該物品即可撿起。 + +當您選取精製台時,請將游標對準您要放置精製台的地方,然後使用 {*CONTROLLER_ACTION_USE*} 來放置。 + +請將游標對準精製台,然後按下 {*CONTROLLER_ACTION_USE*} 來打開。 + +鏟子可加快您挖掘較軟方塊 (例如泥土及白雪) 的速度。當您收集了更多不同材質的方塊後,就能精製出可加快工作速度,且更不容易損壞的工具。請製造 1 個木鏟。{*WoodenShovelIcon*} + +斧頭可加快劈砍木頭及木製方塊的速度。當您收集了更多不同材質的方塊後,就能精製出可加快工作速度,且更不容易損壞的工具。請製造 1 個木斧。{*WoodenHatchetIcon*} + +十字鎬可加快您挖掘較硬方塊 (例如石頭及礦石) 的速度。當您收集了更多不同材質的方塊後,就能精製出可加快工作速度,且更不容易損壞的工具。請製造 1 個木鎬。{*WoodenPickaxeIcon*} + +請打開容器 + + + 夜晚很快就會來臨,沒有做好準備就在夜晚外出是很危險的事。您可以精製出護甲及武器來保護自己,但最實用的方法就是建造安全的棲身處。 + + + + 附近有個廢棄的礦工棲身處,您可以完成該建築當做您夜晚時的安全棲身處。 + + + + 您還需要收集資源才能蓋好這個棲身處。您可以用任何材質的方塊來蓋牆壁和屋頂,但您還必須製作 1 個門、幾個窗戶,還有光源。 + + +請使用十字鎬來開採石頭方塊。石頭方塊在開採後會挖出鵝卵石。只要收集 8 個鵝卵石方塊,就能建造 1 個熔爐。您可能需要挖開一些泥土才能找到石頭,別忘了要用鏟子來挖泥土喔。{*StoneIcon*} + +您已經收集到足夠的鵝卵石來建造熔爐了。請使用精製台來建造熔爐。 + +請使用 {*CONTROLLER_ACTION_USE*} 把熔爐放置在遊戲世界中,然後打開熔爐。 + +請使用熔爐來製作木炭。如果您正在等待木炭製作完成,我們建議您利用這段等待時間收集更多建築材料來蓋好棲身處。 + +請使用熔爐來製作玻璃。如果您正在等待玻璃製作完成,我們建議您利用這段等待時間收集更多建築材料來蓋好棲身處。 + +良好的棲身處是有門的,讓您能夠輕易地進出棲身處,不用費力把牆壁挖開再補好牆壁來進出。請立刻精製 1 個木門。{*WoodenDoorIcon*} + +請使用 {*CONTROLLER_ACTION_USE*} 來放置門。您可以使用 {*CONTROLLER_ACTION_USE*} 來開、關遊戲世界中的門。 + +當夜晚來臨時,棲身處裡面可能會很黑,因此您必須放置光源,好讓您能看見周遭的環境。請立刻使用精製台,把木棍跟木炭精製成火把。{*TorchIcon*} + + + 您已經完成教學課程的第一部份。 + + + + {*B*} + 請按下 {*CONTROLLER_VK_A*} 來繼續教學課程。{*B*} + 如果您覺得自己已經準備好,可以獨自玩遊戲了,請按下 {*CONTROLLER_VK_B*}。 + + + + 這是您的物品欄。這裡會顯示可在您手中使用的物品,以及您身上的所有其他物品。您穿戴的護甲也會顯示在這裡。 + +{*B*} + 請按下 {*CONTROLLER_VK_A*} 來繼續。{*B*} + 如果您已經了解物品欄的使用方式,請按下 {*CONTROLLER_VK_B*}。 + + + + 請使用 {*CONTROLLER_MENU_NAVIGATE*} 來移動游標,然後用 {*CONTROLLER_VK_A*} 來撿起游標下的物品。 + 如果游標下有數個物品,您將會撿起所有物品,但您也可以使用 {*CONTROLLER_VK_X*} 來撿起剛剛好一半的物品。 + + + + 請用游標把這個物品移動到物品欄的另一個空格,然後使用 {*CONTROLLER_VK_A*} 把物品放置在那個空格。 + 如果游標上有數個物品,使用 {*CONTROLLER_VK_A*} 即可放置所有物品,但您也可以使用 {*CONTROLLER_VK_X*} 來只放置 1 個物品。 + + + + 當游標上有物品時,如果您把游標移動到物品欄的外面,就能丟棄游標上的物品。 + + + + 如果您想知道某個物品的詳細資訊,只要把游標移動到該物品上面,然後按下{*CONTROLLER_ACTION_MENU_PAGEDOWN*}即可。 + + + + 請立刻按下 {*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_ACTION_MENU_PAGEDOWN*}即可。 + + + + 請立刻按下 {*CONTROLLER_VK_B*} 來離開創造模式物品欄。 + + + + 這是精製介面,可讓您把收集到的物品組合成各種新物品。 + + +{*B*} + 請按下 {*CONTROLLER_VK_A*} 來繼續。{*B*} + 如果您已經了解精製物品的方式,請按下 {*CONTROLLER_VK_B*}。 + + +{*B*} + 按下 {*CONTROLLER_VK_X*} 即可顯示物品說明。 + + +{*B*} + 按下 {*CONTROLLER_VK_X*} 即可顯示要精製出目前物品所需的材料。 + + +{*B*} + 請按下 {*CONTROLLER_VK_X*} 來再次顯示物品欄。 + + + + 請使用 {*CONTROLLER_VK_LB*} 和 {*CONTROLLER_VK_RB*} 來切換頂端的群組類型索引標籤,以便選取您想要精製的物品群組類型,然後使用 {*CONTROLLER_MENU_NAVIGATE*} 來選取您要精製的物品。 + + + + 精製區域會顯示精製新物品所需的材料。按下 {*CONTROLLER_VK_A*} 即可精製物品,並將該物品放置在物品欄中。 + + + + 精製台可讓您精製出種類較多的物品。精製台的運作方法跟基本的精製介面是一樣的,但您會擁有較大的精製空間,讓您能使用更多種的材料組合。 + + + + 精製介面的右下區域會顯示您的物品欄。這裡也會顯示您目前選取物品的說明,以及精製出該物品所需的材料。 + + + + 精製介面顯示了您目前選取物品的說明,告訴您該物品的用途。 + + + + 精製介面顯示了要精製出已選取物品的所需材料。 + + +您之前收集的木頭可用來精製成木板。請選取木板圖示,然後按下 {*CONTROLLER_VK_A*} 來製造木板。{*PlanksIcon*} + + + 既然您已經製造出精製台,就應該將其放置在遊戲世界中,以便讓您能夠精製出更多種類的物品。{*B*} + 請立刻按下 {*CONTROLLER_VK_B*} 來離開精製介面。 + + + + 按下 {*CONTROLLER_VK_LB*} 和 {*CONTROLLER_VK_RB*} 即可變更您想要精製的物品群組類型。請選取工具群組。{*ToolsIcon*} + + + + 按下 {*CONTROLLER_VK_LB*} 和 {*CONTROLLER_VK_RB*} 即可變更您想要精製的物品的群組類型。請選取建築群組。{*StructuresIcon*} + + + + 使用 {*CONTROLLER_MENU_NAVIGATE*} 即可變更您想要精製的物品。某些物品會因為材料的材質不同,而有各種不同的版本。請選取木鏟。{*WoodenShovelIcon*} + + + + 許多精製過程包含好幾個步驟。現在您已經有幾片木板,就能夠精製出更多物品了。使用 {*CONTROLLER_MENU_NAVIGATE*} 即可變更您想要精製的物品。請選取精製台。{*CraftingTableIcon*} + + + + 有了您製造的這些工具,您就能更有效率地收集各種不同的方塊。{*B*} + 請立刻按下 {*CONTROLLER_VK_B*} 來離開精製介面。 + + + + 某些物品無法用精製台來製造,必須靠熔爐來產生。請立刻製造 1 個熔爐。{*FurnaceIcon*} + + + + 請將您精製出的熔爐放置在遊戲世界中,最好是放置在您的棲身處裡面。{*B*} + 請立刻按下 {*CONTROLLER_VK_B*} 來離開精製介面。 + + + + 這是熔爐介面。熔爐可讓您透過燃燒來改變物品。舉例來說,您可以使用熔爐把鐵礦石轉變成鐵錠塊。 + + +{*B*} + 請按下 {*CONTROLLER_VK_A*} 來繼續。{*B*} + 如果您已經了解熔爐的使用方式,請按下 {*CONTROLLER_VK_B*}。 + + + + 您必須把燃料放在熔爐底部的空格中,熔爐頂端空格裡的物品才會受熱。然後熔爐就會起火,開始火燒上面的物品,並把成品放在右邊的空格中。 + + + + 許多木頭物品能拿來當做燃料,但並非每樣東西的燃燒時間都是相同的。還有其他物品也能拿來當做燃料,您不妨多試試看。 + + + + 當物品火燒完畢後,您就能把物品從成品區移動到物品欄中。您可以嘗試火燒不同的物品,看看會得到什麼成品。 + + + + 如果您把木頭當做材料,就會製造出木炭。請在熔爐裡放些燃料,然後把木頭放在材料格裡。熔爐需要花些時間才能製造木炭,您可以趁這機會去做其他的事,稍後再回來查看進度。 + + + + 木炭可當做燃料使用,還能與木棍一起精製成火把。 + + + + 把沙子放在材料格裡,就能製造出玻璃。請製造些玻璃來當做棲身處的窗戶。 + + + + 這是釀製介面,您可在此製作具備各種不同效果的藥水。 + + +{*B*} + 按下 {*CONTROLLER_VK_A*} 即可繼續。{*B*} + 如果您已經了解應如何使用釀製台,請按一下 {*CONTROLLER_VK_B*}。 + + + + 請將材料放在上方空格,再將藥水或水瓶置於下方空格,即可釀製藥水,最多可同時釀製三樣。當您完成適當的組合後,釀製即開始進行,不久即可製出藥水。 + + + + 釀製藥水必須先從水瓶著手。大部分的藥水都是先用地獄結節做出粗劣藥水,再使用至少一樣其他材料,釀製出最後的成品。 + + + + 您可以變更藥水的效果:加入紅石塵即可增加效果的持久度;加入閃石塵則可讓效果更具威力。 + + + + 加入發酵蜘蛛眼會破壞藥水,讓藥水出現反效果;加入火藥則可將藥水變成噴濺藥水,投擲噴濺藥水即可使藥水效力影響附近區域。 + + + + 先將地獄結節加入水瓶,再加入熔岩球,即可製造防火藥水。 + + + + 按下 {*CONTROLLER_VK_B*} 即可離開釀製介面。 + + + + 您可在這個區域找到釀製藥水所需的釀製台、水槽和裝滿物品的箱子。 + + +{*B*} + 按下 {*CONTROLLER_VK_A*} 即可了解更多關於釀製和藥水的相關資訊。{*B*} + 如果您已經了解如何釀製和使用藥水,請按下 {*CONTROLLER_VK_B*}。 + + + + 釀製藥水的第一步就是製造水瓶。請從箱子中拿出玻璃瓶。 + + + + 您可以從裝了水的水槽或水方塊中取水裝入玻璃瓶。請將游標指向水源,再按下 {*CONTROLLER_ACTION_USE*},即可在玻璃瓶中裝入水。 + + + + 如果水槽空了,您可用水桶替水槽加水。 + + + + 使用水瓶、地獄結節和熔岩球,即可釀製防火藥水。 + + + + 有了藥水時,只要按住 {*CONTROLLER_ACTION_USE*} 即可使用藥水。使用一般藥水時,您必須喝下藥水,即可在自己身上發揮藥水的效果。使用噴濺藥水時,您則必須投擲藥水,讓藥水的效果發揮在位於擊中處附近的生物上。 + 在一般藥水內加入火藥,即可製造噴濺藥水。 + + + + 將防火藥水用在自己身上。 + + + + 既然您現在已可抗火和熔岩,不妨前往之前因火或熔岩的阻礙而無法到達之處。 + + + + 這是附加能力介面,可讓您將附加能力加至武器、護甲以及特定的工具。 + + +{*B*} + 按下 {*CONTROLLER_VK_A*} 即可了解更多關於附加能力介面的資訊。{*B*} + 如果您已經了解應如何附加能力,請按下 {*CONTROLLER_VK_B*}。 + + + + 請先將物品放到附加能力空格中,才能開始附加能力。武器、護甲和特定工具在附加能力後,即可擁有如更能抵抗傷害,或開採時可收集更多物品等特殊效果。 + + + + 當您將物品放到附加能力空格後,畫面右邊的按鈕會顯示多種隨機挑選的附加能力。 + + + + 按鈕上的號碼代表附加該能力到物品所需的經驗值。如果您的經驗等級不夠高,您就無法使用該按鈕。 + + + + 請選取您要的附加能力,然後按一下 {*CONTROLLER_VK_A*},即可將能力附加至物品上。使用該附加能力會降低您的經驗等級。 + + + + 雖然可供您使用的附加能力為隨機出現,但某些效果較好的附加能力,只會在您經驗等級較高,且附加能力台附近有許多書架讓附加能力台的力量增加時,才會出現。 + + + + 您可在這個區域裡找到附加能力台,以及其他能幫助您了解如何附加能力的物品。 + + +{*B*} +  請按下 {*CONTROLLER_VK_A*} 即可了解更多關於附加能力的資訊。{*B*} +  如果您已十分了解如何使用附加能力,請按下 {*CONTROLLER_VK_B*}。 + + + + 您可使用附加能力台,把例如開採時可收集更多物品,或更能抵抗傷害等特殊的效果附加到武器、護甲和特定工具上。 + + + + 在附加能力台的附近放置書架,即可增加附加能力台的力量,您也因此可使用更高等級的附加能力。 + + + + 使用附加能力會降低您的經驗等級。您可以藉由收集殺死怪物或動物、開採礦、繁殖動物、釣魚,以及使用熔爐熔煉或烹煮所產生的經驗值光球,來提升經驗等級。 + + + + 您也可使用經驗藥水瓶增加經驗等級。只要投擲經驗藥水瓶,掉落處就會產生可以收集的經驗值光球。 + + + + 您可在箱子中找到:已附加能力的物品、經驗藥水瓶,以及待您使用附加能力台來嘗試進行附加能力的物品。 + + + + 您現在坐在礦車中。如要離開礦車,請把游標指向礦車,然後按下 {*CONTROLLER_ACTION_USE*}。{*MinecartIcon*} + + +{*B*} + 請按下 {*CONTROLLER_VK_A*} 來學習礦車的相關知識。{*B*} + 如果您已經了解礦車的使用方式,請按下 {*CONTROLLER_VK_B*}。 + + + + 礦車會在軌道上前進。您也可以製作內有熔爐的動力礦車,以及內有箱子的礦車。 + {*RailIcon*} + + + + 您也可以精製出動力軌道,這會使用紅石火把及電路傳來的動力,使礦車速度加快。動力軌道還能與開關、拉桿及壓板連接,製造出更複雜的軌道系統。 + {*PoweredRailIcon*} + + + + 您現在坐在小船上。如要離開小船,請把游標指向小船,然後按下 {*CONTROLLER_ACTION_USE*}。{*BoatIcon*} + + + + {*B*} + 請按下 {*CONTROLLER_VK_A*} 來學習小船的相關知識。{*B*} + 如果您已經了解小船的使用方式,請按下 {*CONTROLLER_VK_B*}。 + + + + 小船可讓您在水面上快速移動。您可以使用 {*CONTROLLER_ACTION_MOVE*} 和 {*CONTROLLER_ACTION_LOOK*} 來控制方向。 + {*BoatIcon*} + + + + 您現在手中握著釣魚竿。請按下 {*CONTROLLER_ACTION_USE*} 來使用釣魚竿。{*FishingRodIcon*} + + + + {*B*} + 請按下 {*CONTROLLER_VK_A*} 來學習釣魚。{*B*} + 如果您已經知道釣魚的方法,請按下 {*CONTROLLER_VK_B*}。 + + + + 按下 {*CONTROLLER_ACTION_USE*} 即可拋線來開始釣魚。再次按下 {*CONTROLLER_ACTION_USE*} 即可捲線。 + {*FishingRodIcon*} + + + + 如果您等到浮標沈到水面下時再捲線,就能釣到魚。您可以吃生魚,也可以先用熔爐把魚煮熟後再吃。不論是生魚還是熟魚,吃下後都能回復您的生命值。 + {*FishIcon*} + + + + 釣魚竿就跟許多其他工具一樣,有使用次數的限制,但用途可不限於釣魚喔!您可以多多實驗,看看釣魚竿還能釣上或啟動什麼東西。 + {*FishingRodIcon*} + + + + 這是床舖。當夜晚來臨時,把游標指向床舖並按下 {*CONTROLLER_ACTION_USE*} 即可睡覺,並在早晨醒來。{*ICON*}355{*/ICON*} + + + + {*B*} + 請按下 {*CONTROLLER_VK_A*} 來學習床舖的相關知識。{*B*} + 如果您已經了解床舖的使用方式,請按下 {*CONTROLLER_VK_B*}。 + + + + 床舖應該要放置在安全、明亮的地方,以免怪物在半夜吵醒您。當您使用過床舖後,您下次死亡時就會在那張床舖再生。 + {*ICON*}355{*/ICON*} + + + + 如果您的遊戲中有其他玩家,每位玩家都必須同時躺在床上才能睡覺。 + {*ICON*}355{*/ICON*} + + + + 在這個地區裡,有些簡單的紅石和活塞電路,還有個箱子,裡面裝了其他可用來擴大電路系統的物品。 + + + + {*B*} + 請按下 {*CONTROLLER_VK_A*} 來學習紅石電路和活塞的相關知識。{*B*} + 如果您已經了解紅石電路和活塞的使用方式,請按下 {*CONTROLLER_VK_B*}。 + + + + 拉桿、按鈕、壓板和紅石火把都可為電路提供動力。您可直接把這些東西連接到您想要啟動的物品上,或是利用紅石塵將這些東西連接到物品上。 + + + + 動力來源的放置位置和方向,會變更對周遭方塊的影響方式。舉例來說,如果您把紅石火把連接到方塊側邊,當這個方塊從其他來源獲得動力時,紅石火把就會關閉。 + + + + 只要用鐵、鑽石或是黃金材質的十字鎬開採紅石礦石,就能獲得紅石塵。紅石塵可用來傳送動力,最多可達 15 個方塊,還可像斜坡般往上或往下移動 1 個方塊的高度。 + {*ICON*}331{*/ICON*} + + + + 紅石中繼器可用來延長動力傳送的距離,或是延遲電路。 + {*ICON*}356{*/ICON*} + + + + 當活塞有動力時會延伸出去,並推動最多 12 個方塊。當黏性活塞縮回時,會拉回 1 個方塊,而且幾乎所有材質的方塊都可拉回。 + {*ICON*}33{*/ICON*} + + + + 在這個地區的箱子中有些零件,可用來組成有活塞的電路。請使用或完成這個地區裡的電路,或是組成您自己的電路。在教學課程地區外,還有更多的範例可讓您參考。 + + + + 在這個地區裡,有個通往地獄的傳送門! + + + + {*B*} + 請按下 {*CONTROLLER_VK_A*} 來學習傳送門和地獄的相關知識。 {*B*} + 如果您已經了解傳送門和地獄的使用方式,請按下 {*CONTROLLER_VK_B*}。 + + + + 只要利用黑曜石方塊組合成有 4 個方塊寬、5 個方塊高的框架,就能製造傳送門。框架的 4 個邊角不需要放置方塊。 + + + + 如要啟動地獄傳送門,只要用打火鐮點燃框架內側的黑曜石方塊即可。當傳送門的框架損壞、附近發生爆炸,或是有液體流過傳送門時,傳送門就會關閉。 + + + + 如要使用地獄傳送門,請站在傳送門裡面。此時您會看到畫面變成紫色,還會聽到某種聲音。幾秒鐘後,您就會被傳送到地獄。 + + + + 地獄是個危險的地方,到處都是熔岩,但也是收集地獄血石和閃石的好地方。地獄血石只要一點燃就會永遠燃燒,而閃石則可做為光源。 + + + + 您可以利用地獄世界在地上世界中快速移動,因為在地獄世界移動 1 個方塊的距離,就等於在地上世界移動 3 個方塊的距離。 + + + + 您正以創造模式進行遊戲。 + + + + {*B*} + 按下 {*CONTROLLER_VK_A*} 即可了解更多關於創造模式的資訊。{*B*} + 如果您已經了解如何使用創造模式,請按下 {*CONTROLLER_VK_B*}。 + + +在創造模式中,您擁有無限多的物品和方塊,且不需使用任何特殊工具,只要按一下即可摧毀方塊。您是無敵的,並且可以飛翔。 + +快速按兩次 {*CONTROLLER_ACTION_JUMP*} 即可飛翔,重複這個動作則可停止飛翔。快速往前按兩下 {*CONTROLLER_ACTION_MOVE*} 即可在飛行中加快飛行的速度。 +在飛翔模式下,只要按住 {*CONTROLLER_ACTION_JUMP*} 即可往上飛,按住 {*CONTROLLER_ACTION_SNEAK*} 則可往下飛。您也可用方向鍵操控方向,往上、下、左或右飛。 + +按下 {*CONTROLLER_ACTION_CRAFTING*} 即可開啟創造模式物品欄介面。 + +您必須設法移到這個洞的另一邊,才能繼續進行遊戲。 + +您已完成創造模式的教學課程。 + + + 這個地區已經準備好一塊農田。耕種能夠讓您建立一個可以重複提供食物與其他物品的可再生來源。 + + + + {*B*} + 按下 {*CONTROLLER_VK_A*} 來學習耕種的相關知識。{*B*} + 如果您已經了解耕種的方法,請按下 {*CONTROLLER_VK_B*} 。 + + +小麥、南瓜和西瓜皆必須利用種子栽種。小麥種子可以藉由破壞茂密青草,或收成小麥來進行收集。相對地,收成南瓜和西瓜,同樣也能收集到南瓜和西瓜種子。 + +在栽種種子前,需要先使用鋤頭將泥土方塊變成農田。在附近放置水源和光源,不但能使農田保持水分,且能讓作物生長得較快。 + +小麥的生長過程包含了數個階段,當顏色轉深後,就代表可以收成了。{*ICON*}59:7{*/ICON*} + +南瓜和西瓜同時也需要在旁邊空出一格的空間,讓完全長成的莖葉能夠在上面長出果實。 + +甘蔗必須栽種在青草、泥土,或沙子方塊上,並且需要和水體方塊相鄰。劈砍甘蔗方塊將會連帶使上方所有方塊一起掉落。{*ICON*}83{*/ICON*} + +仙人掌必須栽種在沙子上,最高可以長到三個方塊的高度。和甘蔗一樣,破壞最底層的方塊,就能夠連帶一起收集上方所有的方塊。{*ICON*}81{*/ICON*} + +蘑菇必須栽種在光線昏暗的地區,並且會蔓延至附近其他光線昏暗的方塊上。{*ICON*}39{*/ICON*} + +骨粉可以用來讓作物立刻達到完全成熟的階段,或是讓蘑菇長成巨型蘑菇。{*ICON*}351:15{*/ICON*} + +您已完成耕種的教學課程。 + + + 這個區域裡,已豢養數隻動物。您可以讓動物進行繁殖,培育小動物。 + + + +  {*B*} +  按下 {*CONTROLLER_VK_A*} 來學習繁殖的相關知識。{*B*} +  如果您已經了解繁殖的方法,請按下 {*CONTROLLER_VK_B*}。 + + +您必須餵動物吃特定的食物,讓動物進入「戀愛模式」,動物才能繁殖。 + +餵乳牛、蘑菇牛或綿羊吃小麥,餵豬吃胡蘿蔔、餵雞吃小麥種子或地獄結節,餵狼吃任何一種肉類,這些動物就會開始尋找也在戀愛模式中的同種類動物。 + +當同在戀愛模式中的兩隻同種類動物相遇,牠們會先親吻數秒,剛出生的小動物就會出現。小動物一開始會跟在父母身旁,之後就會長成一般成年動物的大小。 + +剛結束戀愛模式的動物必須等待大約五分鐘後,才能再次進入戀愛模式。 + +當您手中握著牠們的食物時,有些動物會尾隨在後,這可以協助您將一群動物聚集起來繁殖。{*ICON*}296{*/ICON*} + + +  您可以透過餵食骨頭來馴服野狼,馴服當下可以在狼的身邊看到愛心顯示。除非玩家命令馴服的狼坐下,這些狼會持續跟隨並保護玩家。 + + +您已完成動物與繁殖的教學課程。 + + + 這個區域有一些南瓜和方塊可以用來製作雪人和鐵傀儡。 + + + {*B*} + 按下 {*CONTROLLER_VK_A*} 深入了解。{*B*} + 若您已經十分熟悉就按下{*CONTROLLER_VK_B*}。 + + +放南瓜在方塊堆頂端就可以製作出傀儡。 + +製作雪人需要 2 個白雪方塊,疊在一起,最頂端放 1 個南瓜。雪人會向您的敵人丟雪球。 + +製作鐵傀儡需要 4 個有圖案的鐵方塊,在中間的方塊上方放 1 個南瓜。鐵傀儡會攻擊您的敵人。 + +鐵傀儡也會自然出現來保護村落,如果您攻擊村民,就會遭到鐵傀儡的攻擊。 + +您必須完成教學課程,才能離開這個地區。 + +不同材質的方塊,就應該要用適合的工具進行開採。建議您使用鏟子來開採材質較軟的方塊,例如泥土和沙子。 + +不同材質的方塊,就應該要用適合的工具進行開採。建議您使用斧頭來劈砍樹幹。 + +不同材質的方塊,就應該要用適合的工具進行開採。建議您使用十字鎬來開採石頭及礦石,但您可能需要用更好的材料來製造十字鎬,才能開採某些較硬的方塊。 + +某些工具比較適合用來攻擊敵人。請考慮使用劍來攻擊。 + +提示:按住 {*CONTROLLER_ACTION_ACTION*} 即可用您的手,或是手中握住的東西來開採及劈砍。但您可能需要精製出工具來開採某些方塊。 + +您正在使用的工具受損了。工具每次使用時都會受損,到最後就會整個壞掉。在物品欄中,物品下方的色彩列即為目前的損害狀態。 + +按住 {*CONTROLLER_ACTION_JUMP*} 即可往上游。 + +附近的軌道上有台礦車。如要坐上礦車,請把游標指向礦車,然後按下 {*CONTROLLER_ACTION_USE*} 即可。對按鈕使用 {*CONTROLLER_ACTION_USE*} 即可讓礦車移動。 + +河邊的箱子中有艘小船。如要放置小船,請把游標指向水面,然後按下 {*CONTROLLER_ACTION_USE*} 即可。當您把游標指向小船時,使用 {*CONTROLLER_ACTION_USE*} 即可上船。 + +池塘邊的箱子中有根釣魚竿。請把釣魚竿拿出箱子,然後將其選取為您手中握住的物品來使用。 + +這個更進階的活塞機械系統,可產生會自行修復的橋樑喔!請按下按鈕啟動,然後觀察各個零件的互動方式,瞭解更多資訊。 + +當您拿著物品時,將游標移動到介面外,即可丟棄該物品。 + +您沒有製造該物品所需的所有材料。左下角的方塊會顯示要精製出該物品所需的材料。 + + + 恭喜,您已經完成教學課程!遊戲中的時間流逝速度已經恢復正常,夜晚很快就會來臨,怪物隨後就會出現!請快點蓋好您的棲身處! + + +{*EXIT_PICTURE*} 當您準備好進一步探索世界時,礦工棲身處附近有個樓梯口,會通往某個小城堡。 + +提醒事項: + +]]> + +我們已經在最新版遊戲中加入新功能,包括教學課程世界裡的幾個新地區。 + +{*B*}按下 {*CONTROLLER_VK_A*} 即可以一般的遊戲方式來進行教學課程。{*B*} + 按下 {*CONTROLLER_VK_B*} 即可略過主要的教學課程。 + +在這個地區裡,有幾個可協助您了解釣魚、小船、活塞和紅石等相關知識的區域。 + +在這個地區外,您會發現有關建築物、耕種、礦車和軌道、附加能力、釀製、交易、鍛造以及更多的範例! + + + 您的食物列已消耗到無法讓生命值自動回復的程度。 + + + + {*B*} + 請按下 {*CONTROLLER_VK_A*} 來學習食物列和吃東西的相關知識。{*B*} + 如果您已經了解食物列的使用方式,以及吃東西的方法,請按下 {*CONTROLLER_VK_B*} 。 + + + + 這是馬的物品欄介面。 + + + + {*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*}。 + + + + 煙火屬於裝飾品,可以手動或利用發射器發射,製作的材料包括紙、火藥,也有人會選擇加入幾顆煙火星。 + + + + 煙火星的顏色、淡化、形狀、大小與效果 (例如尾巴和閃爍) 可自訂,方法是在製作時加入額外材料。 + + + + 嘗試用儲物箱內的各式各樣材料製作煙火。 + +  +選取 + +使用 + +返回 + +離開 + +取消 + +取消加入 + +選取儲存裝置 + +變更儲存裝置 + +重新整理線上遊戲清單 + +派對遊戲 + +所有遊戲 + +變更群組 + +顯示物品欄 + +顯示說明 + +顯示材料 + +精製 + +製造 + +撿起/放置 + +撿起 + +全部撿起 + +撿起一半 + +放置 + +全部放置 + +放置 1 個 + +丟棄 + +全部丟棄 + +丟棄 1 個 + +交換 + +快速移動 + +清除快速選取 + +這是什麼? + +分享至 Facebook + +變更篩選條件 + +檢視玩家卡 + +檢視玩家設定檔 + +傳送好友請求 + +下一頁 + +上一頁 + +下一個 + +上一個 + +踢出玩家 + +染色 + +開採 + +餵食 + +馴服 + +治療 + +坐下 + +跟著我 + +退出 + +清空 + +鞍座 + +放置 + +敲擊 + +擠牛奶 + +收集 + + + +睡覺 + +起床 + +播放 + +搭乘 + +乘船 + +栽培 + +往上游 + +開啟 + +變更音調 + +觸發 + +閱讀 + +懸吊 + +投擲 + +栽種 + +整地 + +收成 + +繼續 + +解除完整版遊戲鎖定 + +刪除存檔 + +刪除 + +選項 + +邀請 Xbox Live 派對 + +邀請好友 + +接受 + +剪羊毛 + +禁用關卡 + +選取角色外觀 + +點燃 + +瀏覽 + +安裝完整版 + +安裝試用版 + +安裝 + +重新安裝 + +儲存選項 + +執行命令 + +創造 + +移動材料 + +移動燃料 + +移動工具 + +移動護甲 + +移動武器 + +配備 + +拉弓 + +射箭 + +特權 + +阻擋 + +上一頁 + +下一頁 + +戀愛模式 + + + +旋轉 + +隱藏 + +上傳供 Xbox One 使用的存檔 + +清空所有空格 + +上傳供 Xbox One 使用的存檔 + +騎上 + +下馬 + +騎下 + +發射 + +栓住 + +射箭 + +裝上 + +命名 + +確定 + +取消 + +Minecraft 商店 + +確定要離開目前的遊戲,並加入新的遊戲嗎?您將因此失去尚未儲存的遊戲進度。 + +離開遊戲 + +儲存遊戲 + +不儲存即離開 + +確定要用這個世界目前的存檔,來覆寫同一世界之前的存檔嗎? + +確定要不儲存即離開嗎?您將因此失去在這個世界的所有進度! + +開始遊戲 + +如果您在創造模式中建立、載入或儲存世界,該世界的成就及排行榜更新功能將無法使用,即使您之後以生存模式載入該世界,也無法改變這種狀況。確定要繼續嗎? + +這個世界已經在創造模式中儲存,因此其成就及排行榜更新功能已經無法使用。確定要繼續嗎? + +這個世界已經在創造模式中儲存,因此其成就及排行榜更新功能已經無法使用。 + +如果您在主持人特權啟用時,建立、載入或儲存世界,該世界的成就及排行榜更新功能將無法使用,即使您之後關閉那些選項並再次載入該世界,也無法改變這種狀況。確定要繼續嗎? + +損毀的存檔 + +這個存檔已損毀。想要刪除這個存檔嗎? + +確定要離開並返回主畫面,同時中斷與遊戲中所有玩家的連線嗎?您將因此失去尚未儲存的遊戲進度。 + +儲存並離開 + +不儲存即離開 + +確定要離開並返回主畫面嗎?您將因此失去尚未儲存的遊戲進度。 + +確定要離開並返回主畫面嗎?您將因此失去遊戲進度! + +建立新世界 + +進行教學課程 + +教學課程 + +為您的世界命名 + +請輸入您世界的名稱 + +輸入用來產生新世界的種子 + +載入已儲存世界 + +按下 START 來加入遊戲 + +正在離開遊戲 + +發生錯誤,即將離開遊戲並返回主畫面。 + +連線失敗。 + +連線中斷 + +與伺服器的連線中斷。即將離開遊戲並返回主畫面。 + +與 Xbox Live 的連線中斷。即將離開遊戲並返回主畫面。 + +與 Xbox Live 的連線中斷。 + +伺服器中斷連線 + +您被踢出遊戲 + +您因為飛翔而被踢出遊戲 + +嘗試連線的時間太久 + +伺服器人數已滿 + +主持人已經離開遊戲。 + +您無法加入這個遊戲,因為該遊戲中沒有任何玩家是您的好友。 + +您無法加入這個遊戲,因為您之前已經被主持人踢出遊戲。 + +由於您嘗試加入的玩家進行較舊版本的遊戲,所以您無法加入此遊戲。 + +由於您嘗試加入的玩家進行較新版本的遊戲,所以您無法加入此遊戲。 + +新世界 + +解除獎項鎖定! + +讚喔!您獲得 1 個玩家圖示,主角就是 Minecraft 裡的 Steve! + +讚喔!您獲得 1 個玩家圖示,主角就是 Creeper! + +讚喔!您獲得 1 個虛擬人偶項目「Minecraft: Xbox 360 Edition T 恤」! +快去設定畫面讓您的虛擬人偶穿上吧! + +讚喔!您獲得 1 個虛擬人偶項目「Minecraft: Xbox 360 Edition 手錶」! +快去設定畫面讓您的虛擬人偶戴上吧! + +讚喔!您獲得 1 個虛擬人偶項目「Creeper 棒球帽」! +快去設定畫面讓您的虛擬人偶戴上吧! + +讚喔!您獲得 1 個 Minecraft: Xbox 360 Edition 主題! +快去設定畫面來選取這個主題吧! + +解除完整版遊戲鎖定 + +您正在玩試玩版遊戲,但您必須擁有完整版遊戲才能儲存遊戲進度。 +想要立刻解除完整版遊戲鎖定嗎? + +這是 Minecraft: Xbox 360 Edition 試玩版遊戲。如果您擁有完整版遊戲,那您剛剛就獲得了 1 個成就! +解除完整版遊戲即可享受 Minecraft: Xbox 360 Edition 的遊戲歡樂,而且還能透過 Xbox Live 與世界各地的好友一起玩遊戲。 +想要解除完整版遊戲鎖定嗎? + +這是 Minecraft: Xbox 360 Edition 試玩版遊戲。如果您擁有完整版遊戲,那您剛剛就獲得了 1 個虛擬人偶獎項! +解除完整版遊戲即可享受 Minecraft: Xbox 360 Edition 的遊戲歡樂,而且還能透過 Xbox Live 與世界各地的好友一起玩遊戲。 +想要解除完整版遊戲鎖定嗎? + +這是 Minecraft: Xbox 360 Edition 試玩版遊戲。如果您擁有完整版遊戲,那您剛剛就獲得了 1 個玩家圖示! +解除完整版遊戲即可享受 Minecraft: Xbox 360 Edition 的遊戲歡樂,而且還能透過 Xbox Live 與世界各地的好友一起玩遊戲。 +想要解除完整版遊戲鎖定嗎? + +這是 Minecraft: Xbox 360 Edition 試玩版遊戲。如果您擁有完整版遊戲,那您剛剛就獲得了 1 個主題! +解除完整版遊戲即可享受 Minecraft: Xbox 360 Edition 的遊戲歡樂,而且還能透過 Xbox Live 與世界各地的好友一起玩遊戲。 +想要解除完整版遊戲鎖定嗎? + +這是 Minecraft: Xbox 360 Edition 的試玩版遊戲。您必須擁有完整版遊戲,才能接受這個邀請。 +想要解除完整版遊戲鎖定嗎? + +訪客玩家無法解除完整版遊戲鎖定,請使用 Xbox Live 玩家使用者識別碼來登入。 + +請稍候 + +沒有搜尋結果 + +篩選條件: + +好友 + +我的分數 + +整體 + +項目: + +排名 + +玩家代號 + +正在準備儲存關卡 + +正在準備區塊... + +正在完成... + +正在建造地形 + +正在模擬世界 + +正在啟動伺服器 + +正在產生再生區域 + +正在載入再生區域 + +正在進入地獄 + +正在離開地獄 + +再生中 + +正在產生關卡 + +正在載入關卡 + +正在儲存玩家 + +正在與主持人連線 + +正在下載地形 + +正在切換至離線遊戲 + +主持人正在儲存遊戲,請稍候 + +正在進入終界 + +正在離開終界 + +為世界產生器尋找種子 + +這張床已經有人佔據了 + +您只能在夜晚睡覺 + +%s 正在床舖上睡覺。如要讓遊戲時間跳至日出,所有玩家必須同時睡在床舖上。 + +您家中的床舖已消失,或是被擋住了 + +附近有怪物,您不能休息 + +您正在床舖上睡覺。如要讓遊戲時間跳至日出,所有玩家必須同時睡在床舖上。 + +工具與武器 + +武器 + +食物 + +建築 + +護甲 + +機械 + +運送 + +裝飾 + +建築材料 + +紅石與運送方式 + +雜項 + +釀製 + +釀製 + +工具、武器與護甲 + +材料 + +已登出 + +您的玩家設定檔已登出,因此您即將返回標題畫面 + +困難度 + +音樂 + +音效 + +色差補正 + +遊戲靈敏度 + +介面靈敏度 + +和平 + +簡單 + +普通 + +困難 + +在這個模式中,玩家的生命值會隨時間自動回復,且遊戲環境中不會有怪物。 + +在這個模式中,遊戲世界會產生怪物,且怪物會對玩家造成少量的傷害。 + +在這個模式中,遊戲世界會產生怪物,且怪物會對玩家造成普通的傷害。 + +在這個模式中,遊戲世界會產生怪物,且怪物會對玩家造成嚴重的傷害。千萬要留意 Creeper,因為當您嘗試遠離 Creeper 時,Creeper 可不會取消爆炸! + +試玩版遊戲時間結束 + +Minecraft: Xbox 360 Edition 試玩版的遊戲時間已經結束!想要解除完整版遊戲鎖定來繼續玩 Minecraft: Xbox 360 Edition 嗎? + +遊戲人數已滿 + +已無空位,因此無法加入遊戲 + +輸入牌子的文字 + +請輸入牌子上的文字 + +輸入標題 + +請輸入文章的標題 + +輸入標題 + +請輸入文章的標題 + +輸入說明 + +請輸入文章的說明 + +物品欄 + +材料 + +釀製台 + +箱子 + +附加能力 + +熔爐 + +材料 + +燃料 + +發射器 + + + +投擲器 + +漏斗 + +燈塔 + +主要力量 + +次要力量 + +礦車 + +這款遊戲目前沒有此類型的下載內容。 + +%s 已經加入遊戲。 + +%s 已經離開遊戲。 + +%s 已被踢出遊戲。 + +確定要刪除這個遊戲存檔嗎? + +正在等待核准 + +已審查 + +現在正在播放: + +重設設定 + +確定要將所有設定重設為預設值嗎? + +載入錯誤 + +無法載入 Minecraft: Xbox 360 Edition,因此無法繼續。 + +%s 的遊戲 + +不明主持人的遊戲 + +訪客已登出 + +某位訪客玩家已登出,導致系統移除遊戲中的所有訪客玩家。 + +登入 + +您尚未登入。您必須登入,才能進行這個遊戲。想要立刻登入嗎? + +不允許進行多人遊戲 + +無法加入遊戲,因為至少有 1 位玩家不允許透過 Xbox Live 進行多人遊戲。 + +無法建立線上遊戲,因為至少有 1 位玩家不允許透過 Xbox Live 進行多人遊戲。請取消核取 [線上遊戲] 方塊來開始進行離線遊戲。 + +您無法加入這個遊戲,因為您的會員內容權限設定過於嚴格。如果您想要加入這個遊戲,請在 Xbox 設定畫面的 [隱私權和線上設定] 部份變更這項設定。 + +您無法加入這個遊戲,因為某位本機玩家的會員內容權限設定過於嚴格。 + +您無法加入這個遊戲,因為遊戲中某位玩家的會員內容權限設定為 [僅限好友],而您不在該玩家的好友名單中。 + +無法建立遊戲 + +您無法建立這個遊戲,因為某位本機玩家的會員內容權限設定過於嚴格。請取消核取 [線上遊戲] 方塊來開始進行離線遊戲,或是在 Xbox 設定畫面的 [隱私權和線上設定] 部份變更這項設定。 + +已自動選取 + +無套件:預設外觀 + +我的最愛角色外觀 + +已禁用的關卡 + +您要加入的遊戲,已經列在您的禁用關卡清單中。 +如果您要加入這個遊戲,系統會把這個關卡從禁用關卡清單中移除。 + +要禁用這個關卡嗎? + +確定要把這個關卡加入禁用關卡清單嗎? +如果您選取 [確定],將會離開這個遊戲。 + +從禁用清單中移除 + +自動儲存時間間隔 + +自動儲存時間間隔:關閉 + +分鐘 + +不能放置在這裡! + +您無法在關卡再生點附近放置熔岩,以避免讓再生的玩家立刻死亡。 + +這個遊戲有自動儲存關卡的功能。當畫面出現這個圖示時,代表遊戲正在儲存您的資料。 +請勿在畫面出現這個圖示時關閉 Xbox 360 主機。 + +介面透明度 + +正在準備自動儲存關卡 + +抬頭顯示器大小 + +抬頭顯示器大小 (分割畫面) + +種子 + +解除角色外觀套件的鎖定 + +如要使用您選取的角色外觀,您必須先解除這個角色外觀套件的鎖定。 +您想要立刻解除這個角色外觀套件的鎖定嗎? + +解除材質套件的鎖定 + +您必須先解除材質套件的鎖定才能在您的世界中使用。 +想要解除材質套件的鎖定嗎? + +試用版材質套件 + +您目前所使用的是試用版的材質套件。只有解除完整版鎖定才能保存這個世界。 +您要解除完整版材質套件的鎖定嗎? + +沒有材質套件 + +解除完整版鎖定 + +下載試用版 + +下載完整版 + +您沒有這個世界所使用的混搭套件或材質套件! +想要立刻安裝混搭套件或材質套件嗎? + +取得試用版 + +取得完整版 + +踢出玩家 + +確定要將該玩家踢出這個遊戲嗎?除非您讓這個世界重新開始,該玩家才能再次加入遊戲。 + +玩家圖示套件 + +主題 + +角色外觀套件 + +允許好友的好友加入 + +您無法加入這個遊戲,因為只有主持人的好友才能加入。 + +無法加入遊戲 + +已選取 + +已選取的角色外觀: + +損毀的下載內容 + +這個下載內容已經損毀,因此無法使用。您必須刪除該下載內容,然後從 [Minecraft 商店] 選單重新安裝。 + +您有部分的下載內容已經損毀,因此無法使用。您必須刪除這些下載內容,然後從 [Minecraft 商店] 選單重新安裝。 + +遊戲模式已經變更 + +重新為您的世界命名 + +請輸入您世界的新名稱 + +遊戲模式:生存 + +遊戲模式:創造 + +遊戲模式:冒險 + +生存 + +創造 + +冒險 + +在生存模式中建立 + +在創造模式中建立 + +產生雲朵 + +您要如何處裡這個遊戲存檔? + +重新為存檔命名 + +自動儲存倒數 %d... + +開啟 + +關閉 + +普通 + +非常平坦 + +輸入種子,再度產生相同的地形。留白會隨機挑選世界。 + +啟用時,本遊戲將成為線上遊戲。 + +啟用時,只限被邀請的玩家加入。 + +啟用時,您的好友清單上的好友可以加入遊戲。 + +啟用時,玩家可以傷害其他玩家。只有在生存模式才會生效。 + +停用時,加入遊戲的玩家需要取得同意才能建造或開採。 + +啟用時,火可能會蔓延至附近的易燃方塊。 + +啟用時,炸藥會在點燃後爆炸。 + +啟用時,主持人可以從遊戲選單切換自己的飛翔能力、停用疲勞功能,或是讓自己隱形。但將會無法使用成就及排行榜更新的功能。 + +啟用時,會再度產生地獄世界。如果您的舊存檔中沒有地獄要塞,這將會很有用。 + +啟用時,遊戲世界會產生村落和地下要塞等建築。 + +啟用時,會在地上世界與地獄世界中產生完全平坦的世界。 + +啟用時,玩家的再生點附近會有個裝著有用物品的箱子。 + +停用時,怪物和動物無法變更方塊(例如:Creeper 爆炸不會摧毀方塊,綿羊無法移除草)或拾起物品 + +啟用時,玩家死掉時可以保留物品欄。 + +停用時,生物不會自然重生。 + +停用時,怪物和動物不會落下戰利品(例如:Creeper 不會落下火藥)。 + +停用時,方塊摧毀時不會落下物品(例如,石頭方塊不會落下鵝卵石)。 + +停用時,玩家不會自然恢復生命值。 + +停用時,時間不會更改。 + +角色外觀套件 + +主題 + +玩家圖示 + +虛擬人偶項目 + +材質套件 + +混搭套件 + +{*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*} 用魔法殺死 + +{*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*} 殺死 + +基岩迷霧 + +顯示抬頭顯示器 + +顯示手 + +分割畫面玩家代號 + +死亡訊息 + +動態角色 + +自訂角色外觀動畫 + +您已不能開採或使用物品 + +您現在可以開採及使用物品 + +您已不能放置方塊 + +您現在可以放置方塊 + +已可以使用門與開關 + +已無法使用門與開關 + +已可以使用容器 (例如箱子等) + +已無法使用容器 (例如箱子等) + +您已不能攻擊生物 + +您現在可以攻擊生物 + +您已不能攻擊玩家 + +您現在可以攻擊玩家 + +已無法攻擊動物 + +已可以攻擊動物 + +您現在是管理員 + +您已不是管理員 + +您現在可以飛翔 + +您已不能飛翔 + +您不再感到疲勞 + +您現在開始會感到疲勞 + +您現在是隱形的 + +您已不是隱形的 + +您現在是無敵的 + +您已不是無敵的 + +%d MSP + +終界龍 + +%s 已經進入終界 + +%s 已經離開終界 + + +{*C3*}我知道你所指的玩家了。{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}?{*EF*}{*B*}{*B*} +{*C3*}是的。小心,他的層次現在提高了。他能讀取我們的心思。{*EF*}{*B*}{*B*} +{*C2*}沒關係。他認為我們是遊戲的一部分。{*EF*}{*B*}{*B*} +{*C3*}我喜歡這個玩家,他表現得很好,一直玩到最後。{*EF*}{*B*}{*B*} +{*C2*}他現在正如閱讀螢幕上的文字般讀著我們的心思。{*EF*}{*B*}{*B*} +{*C3*}他在深入遊戲的夢境時一向選擇以這種方式想像很多事情。{*EF*}{*B*}{*B*} +{*C2*}文字是很美妙的介面,靈活又易變,比直視螢幕背後的真相要安全得多。{*EF*}{*B*}{*B*} +{*C3*}他們之前是聽話語。在玩家能夠閱讀之前,是玩家被那些不玩遊戲的人稱呼為女巫或巫師的時候。玩家想像自己乘坐具有魔鬼力量的棍子騰空翱翔。{*EF*}{*B*}{*B*} +{*C2*}這位玩家夢到了什麼?{*EF*}{*B*}{*B*} +{*C3*}這位玩家夢到陽光與樹木、火與水。他夢見自己造物,也夢見自己破壞。他夢見自己打獵,同時也是獵物。他夢到了庇護所。{*EF*}{*B*}{*B*} +{*C2*}哈,這是原型介面。經過了百萬年,還是奏效。不過這位玩家在螢幕背後的真相中創造了什麼結構?{*EF*}{*B*}{*B*} +{*C3*}他和百萬名其他玩家在 {*EF*}{*NOISE*}{*C3*} 的皺摺中塑造出一個真實世界,並在 {*EF*}{*NOISE*}{*C3*} 中替 {*EF*}{*NOISE*}{*C3*} 建造了 {*EF*}{*NOISE*}{*C3*}。{*EF*}{*B*}{*B*} +{*C2*}他讀不出那幾個心思。{*EF*}{*B*}{*B*} +{*C3*}沒錯。他尚未達到最高層次。他必須先在人生的長夢中開悟,這場遊戲的短夢尚不足以成就這一點。{*EF*}{*B*}{*B*} +{*C2*}他是否知道我們愛他?是否知道宇宙是仁慈的?{*EF*}{*B*}{*B*} +{*C3*}有時候。穿越他那些思考的雜訊,他的確能聽到宇宙。{*EF*}{*B*}{*B*} +{*C2*}不過有時候他會在長夢中悲傷;他創造出沒有夏天的世界,讓自己在黑暗的太陽下發抖,並認為他所創造出的產物就是真相。{*EF*}{*B*}{*B*} +{*C3*}治好他的悲傷會毀掉他。悲傷是他自身的業,我們無法干涉。{*EF*}{*B*}{*B*} +{*C2*}有時當他們沈溺於夢境時,我想告訴他們,他們是在真相中建立真實的世界。有時候我想讓他們了解他們對宇宙的重要性。有時候,在他們封閉自我一段時間後,我想幫助他們說出他們害怕的文字。{*EF*}{*B*}{*B*} +{*C3*}他能讀取我們的心思。{*EF*}{*B*}{*B*} +{*C2*}有時候我不在乎。有時我想告訴他們,你所以為的真實世界不過是 {*EF*}{*NOISE*}{*C2*} 和 {*EF*}{*NOISE*}{*C2*},我想告訴他們,他們是 {*EF*}{*NOISE*}{*C2*} 中的 {*EF*}{*NOISE*}{*C2*}。他們在自己的長夢中幾乎察覺不到真相。{*EF*}{*B*}{*B*} +{*C3*}但他們還是玩著遊戲。{*EF*}{*B*}{*B*} +{*C2*}告訴他們會讓一切變得好簡單...{*EF*}{*B*}{*B*} +{*C3*}對這場夢而言真相太過刺激。告訴他們如何去活就是阻止他們去活。{*EF*}{*B*}{*B*} +{*C2*}我不會告訴玩家如何去活。{*EF*}{*B*}{*B*} +{*C3*}玩家開始蠢蠢欲動了。{*EF*}{*B*}{*B*} +{*C2*}我會告訴那位玩家一個故事。{*EF*}{*B*}{*B*} +{*C3*}但不說真相。{*EF*}{*B*}{*B*} +{*C2*}沒錯。那是一個包含真相的故事,被文字安全地包裝起來。我不會赤裸裸地說出他所無法接受的真相。{*EF*}{*B*}{*B*} +{*C3*}再一次賦予他身體。{*EF*}{*B*}{*B*} +{*C2*}沒錯。玩家...{*EF*}{*B*}{*B*} +{*C3*}喚他的名字。{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}。遊戲的玩家。{*EF*}{*B*}{*B*} +{*C3*}很好。{*EF*}{*B*}{*B*} + + + +{*C2*}現在,吸一口氣。再一口。感覺空氣進入肺部。讓你的四肢回復。是的,動動你的手指。再一次擁有身體,騰空、感受地心引力。再生到長夢當中。你回來了。你身體的每個細胞又再度碰觸宇宙,彷彿你和宇宙其實不是一體。彷彿我們都不是一體。{*EF*}{*B*}{*B*} +{*C3*}我們是誰?我們曾被稱為山神、陽父、月母、祖靈、獸靈、神仙、神靈、天地精華。又被稱為神明、魔鬼、天使、鬼、外星人、輕子、夸克。文字會改變,我們從未改變。{*EF*}{*B*}{*B*} +{*C2*}我們是宇宙。所有你認為不是你的一切都是我們。你正在透過你的皮膚和雙眼看我們。宇宙為何要觸碰你的皮膚,將光投向你?玩家,是為了要看你。我們想認識你,想要你認識我們。我將告訴你一個故事。{*EF*}{*B*}{*B*} +{*C2*}很久很久以前,有一位玩家。{*EF*}{*B*}{*B*} +{*C3*}那位玩家就是你,{*PLAYER*}。{*EF*}{*B*}{*B*} +{*C2*}有的時候他認為自己是人類,處在一顆自轉熔岩球體的薄薄地殼上。這顆熔岩球體繞行著一顆比自己大 33 萬倍的炙熱氣體球。「光」需要 8 分鐘才能橫渡這兩者之間的距離。光是來自恆星的訊息,能在一億五千萬公里之外灼傷你的皮膚。{*EF*}{*B*}{*B*} +{*C2*}有時候,那位玩家夢見自己是採礦人,處在一個平坦無盡的世界的地表。太陽是一個白色方塊。一天很短暫,死亡只不過是一時的小小不便。{*EF*}{*B*}{*B*} +{*C3*}有時候,玩家夢見自己迷失在故事裡。{*EF*}{*B*}{*B*} +{*C2*}有時候,玩家夢見自己是別的東西、身在其他場所。有時這些夢境令人不安,有時卻極其美麗。有時候玩家會從一個夢中甦醒至下一個夢中,然後再進入第三個夢。{*EF*}{*B*}{*B*} +{*C3*}有時玩家夢見自己看著螢幕上的字。{*EF*}{*B*}{*B*} +{*C2*}讓我們回溯一下。{*EF*}{*B*}{*B*} +{*C2*}玩家的原子分散在草地、河流、空氣和土壤中。一位女性蒐集這些原子,她吃下、飲用、吸入它們,然後在她的體內組織玩家。{*EF*}{*B*}{*B*} +{*C2*}然後玩家從母親體內那溫暖黑暗的世界中甦醒過來,甦醒至一場長夢當中。{*EF*}{*B*}{*B*} +{*C2*}玩家被寫成 DNA,成為一個從未被訴說的新故事。玩家成為一個以具有十億年歷史的來源碼所寫成的新程式,從未執行過。玩家成為一個以乳水與愛所孕育而成的新人類,從未活過。{*EF*}{*B*}{*B*} +{*C3*}你就是那位玩家。那個故事。那個程式。那個人類。以乳水和愛孕育而成。{*EF*}{*B*}{*B*} +{*C2*}讓我們再回溯得遠一點。{*EF*}{*B*}{*B*} +{*C2*}組成玩家身體的這七千萬億顆原子,早在遊戲存在之前,就已在恆星的中心被創造出來。因此,玩家也是來自恆星的訊息。玩家所通過的故事,就是訊息所組成的叢林,這個訊息叢林由一位名為 Julian 的人所種下,在名為 Markus 的人所創造的平坦無盡世界上滋生,並在玩家所創造的小小私人世界中存在著。創造玩家所居住的這個宇宙的人是...{*EF*}{*B*}{*B*} +{*C3*}噓。玩家所創造的小小私人世界有時輕鬆、溫暖而單純,有時則艱險、寒冷而複雜。有時他會在腦中建造宇宙模型;那些穿越空間的能量微粒,有時候會被他稱為「電子」和「質子」。{*EF*}{*B*}{*B*} + + + +{*C2*}有的時候他稱它們為「行星」和「恆星」。{*EF*}{*B*}{*B*} +{*C2*}有時候,他相信自己所處的宇宙由能源組成,而這能源又由關與開、0 與 1、一行又一行的程式碼所組成。有時候,他相信自己正在進行一場遊戲。有時候,他相信自己正在閱讀螢幕上的文字。{*EF*}{*B*}{*B*} +{*C3*}你就是那位玩家,讀著文字...{*EF*}{*B*}{*B*} +{*C2*}噓... 有時候,玩家讀著螢幕上的程式碼,將程式碼解讀成文字、將文字解讀成意義、將意義解讀成感覺、情緒、理論、思想。然後玩家的呼吸變得越來越快、越來越沈重,他發現自己活著,真正活著;那一千次的死亡都不是真的,玩家還活著。{*EF*}{*B*}{*B*} +{*C3*}你。就是你。你還活著。{*EF*}{*B*}{*B*} +{*C2*}有時候,玩家相信自己聽到宇宙透過夏季綠葉間流瀉的陽光和他說話。{*EF*}{*B*}{*B*} +{*C3*}有時候,玩家相信自己聽到宇宙在冷冽冬夜中射下光芒和他說話。那閃現在玩家眼角的微光,可能是一顆比太陽大百萬倍的恆星,為了在那一瞬間讓玩家看到,而驟燒化為離子,好讓在宇宙遠端漫步回家的玩家,突然間聞到食物的香氣,感覺自己幾乎就要抵達那道熟悉的門前,準備好再度入夢。{*EF*}{*B*}{*B*} +{*C2*}有時候,玩家相信宇宙透過 0 和 1、透過世上的電流、透過夢境結束時在螢幕上捲動的文字和他說話。{*EF*}{*B*}{*B*} +{*C3*}而宇宙說「我愛你」。{*EF*}{*B*}{*B*} +{*C2*}宇宙說你在遊戲中表現得很好。{*EF*}{*B*}{*B*} +{*C3*}宇宙說你已具備你所需的一切。{*EF*}{*B*}{*B*} +{*C2*}宇宙說你比自己所想的還要堅強。{*EF*}{*B*}{*B*} +{*C3*}宇宙說你就是白晝。{*EF*}{*B*}{*B*} +{*C2*}宇宙說你就是黑夜。{*EF*}{*B*}{*B*} +{*C3*}宇宙說你所抵抗的黑暗來自你的內心。{*EF*}{*B*}{*B*} +{*C2*}宇宙說你所追尋的光就在你自己心中。{*EF*}{*B*}{*B*} +{*C3*}宇宙說你不孤單。{*EF*}{*B*}{*B*} +{*C2*}宇宙說你和一切都是一體。{*EF*}{*B*}{*B*} +{*C3*}宇宙說你就是宇宙,正在認識自己、和自己對話、讀著自己編寫的程式碼。{*EF*}{*B*}{*B*} +{*C2*}宇宙說我愛你,因為你就是愛。{*EF*}{*B*}{*B*} +{*C3*}遊戲已經結束,玩家已從夢境中甦醒。玩家開始一段新的夢境。玩家又再度做夢,做一場更好的夢。玩家就是宇宙。玩家就是愛。{*EF*}{*B*}{*B*} +{*C3*}你就是玩家。{*EF*}{*B*}{*B*} +{*C2*}醒過來吧。{*EF*} + + +重設地獄 + +確定要對此遊戲存檔的地獄進行重設嗎?這將會失去所有地獄內的建設進度! + +重設地獄 + +不要重設地獄 + +目前豬、 綿羊、乳牛和貓已達到數量上限,無法剪 Mooshroom 的毛。 + +目前豬、綿羊、乳牛和貓已達到數量上限。無法使用角色蛋。 + +目前 Mooshroom 已達到數量上限,無法使用角色蛋。 + +目前已達到遊戲世界的狼數量上限,無法使用角色蛋。 + +目前已達到遊戲世界的雞數量上限,無法使用角色蛋。 + +目前已達到遊戲世界的烏賊數量上限,無法使用角色蛋。 + +目前已達到遊戲世界的村民數量上限,無法使用角色蛋。 + +目前已達到遊戲世界的敵人數量上限,無法使用角色蛋。 + +目前已達到遊戲世界的村民數量上限,無法使用角色蛋。 + +該世界中的圖畫/物品框架已達最大數量。 + +您無法在和平模式中產生敵人。 + +目前豬、綿羊、乳牛和貓已達到數量上限。此動物無法進入戀愛模式。 + +狼已達到繁殖數量上限,該動物無法進入戀愛模式。 + +雞已達到繁殖數量上限,該動物無法進入戀愛模式。 + +這種動物不能進入愛情模式,已經達到繁殖馬的數量上限。 + +Mooshrooms 已達到繁殖數量上限,該動物無法進入戀愛模式。 + +目前這個世界的小船已達到數量上限。 + +目前已達遊戲世界的生物頭顱數量上限。 + +上下反轉 + +慣用左手 + +您死亡了! + +再生 + +下載內容 + +變更角色外觀 + +遊戲方式 + +控制 + +設定 + +製作群 + +重新安裝內容 + +偵錯設定 + +火會蔓延 + +炸藥會爆炸 + +玩家對玩家 + +信任玩家 + +主持人特權 + +產生建築 + +非常平坦的世界 + +贈品箱 + +世界選項 + +遊戲選項 + +生物惡意破壞 + +保留物品欄 + +生物重生 + +生物戰利品 + +磚塊掉落 + +自然再生 + +陽光循環 + +可以建造和開採 + +可以使用門與開關 + +可以開啟容器 + +可以攻擊玩家 + +可以攻擊動物 + +管理員 + +踢出玩家 + +可以飛翔 + +停用疲勞 + +隱形 + +主持人選項 + +玩家/邀請 + +線上遊戲 + +僅限邀請 + +更多選項 + +載入 + +新世界 + +世界名稱 + +世界生成器用的種子 + +留白即可使用隨機種子 + +玩家 + +加入遊戲 + +開始遊戲 + +找不到遊戲 + +進行遊戲 + +排行榜 + +成就 + +說明與選項 + +解除完整版遊戲鎖定 + +繼續遊戲 + +儲存遊戲 + +困難度: + +遊戲類型: + +玩家代號: + +建築: + +關卡類型: + +玩家對玩家: + +信任玩家: + +炸藥: + +火會蔓延: + +重新安裝主題 + +重新安裝玩家圖示 1 + +重新安裝玩家圖示 2 + +重新安裝虛擬人偶項目 1 + +重新安裝虛擬人偶項目 2 + +重新安裝虛擬人偶項目 3 + +選項 + +音訊 + +控制 + +圖形 + +使用者介面 + +重設為預設值 + +檢視上下跳動的動作 + +提示 + +遊戲中的工具提示 + +遊戲中的玩家代號 + +雙人遊戲垂直分割畫面 + +完成 + +編輯牌子上的訊息: + +請填寫螢幕擷取畫面的說明 + +標題 + +遊戲中的螢幕擷取畫面 + +編輯牌子上的訊息: + +來看看我在 Minecraft: Xbox 360 Edition 製作了什麼東西! + +經典 Minecraft 材質、圖示及使用者介面! + +顯示所有混搭世界 + +選取要傳輸的存檔空格 + +清空空格 + +正在上傳存檔中繼資料 + +正在上傳存檔資料 + +正在上傳供 Xbox One 使用的存檔 + +已取消上傳 + +您已經取消將此存檔上傳至存檔轉移區。 + +無特殊效果 + +速度 + +緩慢 + +快速 + +開採倦怠 + +力量 + +虛弱 + +立即回復生命值 + +立即傷害 + +跳躍增強 + +噁心 + +再生 + +抵抗力 + +防火 + +水中呼吸 + +隱形 + +眼盲 + +夜視 + +飢餓 + +巨毒 + +凋零怪 + +生命值加乘 + +吸收 + +飽和 + +敏捷 + +緩慢 + +快速 + +遲鈍 + +力量 + +虛弱 + +回復生命值 + +傷害 + +跳躍 + +噁心 + +再生 + +抵抗力 + +防火 + +水中呼吸 + +隱形 + +眼盲 + +夜視 + +飢餓 + +巨毒 + +腐朽 + +生命值加乘 + +吸收 + +飽和 + + + +2 + +3 + +4 + +噴濺 + +平庸 + +無趣 + +平淡 + +清澈 + +乳狀 + +擴散 + +拙劣 + +稀薄 + +粗劣 + +走味 + +巨大 + +粗製 + +奶油 + +平順 + +柔順 + +精緻 + +濃郁 + +高雅 + +高貴 + +媚力 + +華麗 + +極緻 + +強烈 + +閃光 + +強效 + +混濁 + +無臭 + +惡臭 + +刺鼻 + +刺激 + +濃稠 + +黏性 + +所有藥水的基本配方,用來在釀製台中釀製藥水。 + +本身不具備任何效果,藉由在釀製台中添加其他材料來釀製藥水。 + +增加受影響玩家、動物和怪物的移動速度,並增加玩家的奔跑速度、跳躍高度和視野。 + +減少受影響玩家、動物和怪物的移動速度,並降低玩家的奔跑速度、跳躍高度和視野。 + +增加受影響玩家和怪物攻擊時所造成的傷害。 + +減少受影響玩家和怪物攻擊時所造成的傷害。 + +立即增加受影響玩家、動物和怪物的生命值。 + +立即減少受影響玩家、動物和怪物的生命值。 + +隨著時間自動回復受影響玩家、動物和怪物的生命值。 + +讓受影響玩家、動物和怪物不受火、熔岩,和 Blaze 遠距攻擊的傷害。 + +隨著時間自動減少受影響玩家、動物和怪物的生命值。 + +套用時: + +馬跳躍力量 + +殭屍援軍 + +生命值上限 + +生物跟蹤範圍 + +擊退防禦力 + +速度 + +攻擊殺傷力 + +鋒利 + +重擊 + +節足剋星 + +擊退 + +烈火 + +防護 + +防火 + +輕盈 + +防爆 + +防彈 + +水中呼吸 + +水中挖掘 + +效率 + +聚寶 + +耐力 + +奪寶 + +財富 + +力量 + +火焰 + +猛擊 + +無限 + +1 + +2 + +3 + +4 + +5 + +6 + +7 + +8 + +9 + +10 + +可以用一把鶴嘴鋤或更好的工具來採集翡翠。 + +和箱子類似,但是玩家可以在各處的終界箱裡取得個人所存放的道具。 + +有東西穿過連結的絆線時就會啟動。 + +有東西穿過連接的絆線鉤時就會啟動。 + +精簡的翡翠儲存方法。 + +一面由鵝卵石砌成的牆。 + +可以用來修理武器、工具,以及護甲。 + +在熔爐內熔煉製成獄石英。 + +用來當作裝飾。 + +可以用來和村民交易。 + +用來當作裝飾,您可以把花、樹苗、仙人掌,還有蘑菇種在上面。 + +可回復 2 個 {*ICON_SHANK_01*},並可精製成金色胡蘿蔔。可以栽種在農地上。 + +可回復 0.5 個 {*ICON_SHANK_01*},或可在熔爐中烹煮。可以栽種在農地上。 + +可回復 3 點 {*ICON_SHANK_01*}。在熔爐中烹煮馬鈴薯即可獲得。 + +可回復 1 個 {*ICON_SHANK_01*}。 吃這個可能會讓您中毒。 + +可回復 3 個 {*ICON_SHANK_01*}。用胡蘿蔔和碎金塊精製而成。 + +可以在騎豬的時候控制牠的方向。 + + +可回復 4 個 {*ICON_SHANK_01*}。 + +用於鐵砧中,可以為武器、工具,或是護甲附加特殊能力。 + +採集獄石英原礦即可獲得。可精製成獄石英方塊。 + +由羊毛製成,可用於裝飾。 + +翡翠 + +花盆 + +胡蘿蔔 + +馬鈴薯 + +烤馬鈴薯 + +有毒馬鈴薯 + +金色胡蘿蔔 + +願者上鉤 + +南瓜派 + +附魔小冊 + +獄石英 + +翡翠原礦 + +終界箱 + +絆線鉤 + +絆線 + +翡翠方塊 + +鵝卵石牆 + +青苔卵石牆 + +花盆 + +胡蘿蔔 + +馬鈴薯 + +鐵砧 + +鐵砧 + +輕微受損的鐵砧 + +嚴重受損的鐵砧 + +獄石英原礦 + +獄石英方塊 + +雕刻石英方塊 + +希臘圓柱石英方塊 + +石英階梯 + +地毯 + +黑色地毯 + +紅色地毯 + +綠色地毯 + +棕色地毯 + +藍色地毯 + +紫色地毯 + +青綠地毯 + +淺灰地毯 + +灰色地毯 + +粉紅地毯 + +青檸地毯 + +黃色地毯 + +淺藍地毯 + +洋紅地毯 + +橘色地毯 + +白色地毯 + +雕刻沙岩 + +平滑沙岩 + +{*PLAYER*} 打算傷害 {*SOURCE*},卻因此喪命 + +{*PLAYER*} 遭落下鐵砧擊斃。 + +{*PLAYER*} 遭落下方塊擊斃。 + +將 {*PLAYER*} 傳送至 {*DESTINATION*} + +{*PLAYER*} 將您傳送至他身邊 + +{*PLAYER*} 剛剛傳送到您身邊 + +棘刺 + +石英板 + +讓陰暗的地方看起來像在日光下一樣,就連在水中也一樣。 + +讓受影響的玩家、動物以及怪物隱形。 + +修理 & 命名 + +附加能力花費:%d + +花費太高! + +重新命名 + +您擁有: + +交易所需道具 + +{*VILLAGER_TYPE*} 提供 %s + +修理 + +交易 + +染製項圈 + + + 這是鐵砧操作介面,您可以在此消耗經驗值為武器、護甲或工具重新命名、修理或附加特殊能力。 + + + + {*B*} + 請按一下 {*CONTROLLER_VK_A*} 瞭解更多關於鐵砧介面的資訊。{*B*} + 如您已瞭解此資訊,請按一下 {*CONTROLLER_VK_B*}。 + + + + 如要開始維護一項道具,請將道具放在第一個格子裡。 + + + + 在第二個空格放置正確的材料(例如使用鐵碇塊修補受損的鐵劍),修理的結果就會顯示在產出空格中。 + + + + 或者,您可以在第二個空格中放入特定的道具來組合。 + + + + 如果要在鐵砧中附加特殊能力,請在第二個空格中放入附魔小冊。 + + + + 一次作業所需的經驗值會顯示在產出格的下方。如果您的經驗值不足以執行該次作業,便無法完成此次操作。 + + + + 您可以在文字方塊中重新為道具命名。 + + + + 從產出格拿起即將修復的道具,即會消耗先前放入鐵砧的兩件物品以及所需經驗值。 + + + + 在此區中有一個鐵砧和一個裝了工具和武器的箱子,您可以在此體驗鐵砧的操作方式。 + + + + {*B*} + 請按一下 {*CONTROLLER_VK_A*} 瞭解關於鐵砧的資訊。{*B*} + 如您已瞭解如何使用鐵砧,請按一下 {*CONTROLLER_VK_B*}。 + + + + 您可以使用鐵砧修復武器和工具的耐久度,也可以在鐵砧上變更物品名稱,或是放入附魔小冊以加上特殊能力。 + + + + 您能在地下迷宮中的箱子裡發現或在附加能力台上製作附魔小冊。 + + + + 在鐵砧上執行作業會消耗經驗值,也會使此器具受損。 + + + + 消耗量會依作業類型、物品價值、附加能力數量,以及先前組合的次數而有不同。 + + + + 在變更名稱後,所有玩家都可以看到物品的新名稱,還能降低先前組合造成的消耗。 + + + + 在本區的箱子中收納了幾把受損的十字鎬還有一些材料、幾瓶經驗值藥水,以及附魔小冊,讓您體驗此操作。 + + + + 您可以在交易介面中得知村民願意交換的物品。 + + + + {*B*} + 請按一下 {*CONTROLLER_VK_A*} 瞭解交易介面。{*B*} + 如您已瞭解交易介面,請按一下 {*CONTROLLER_VK_B*}。 + + + + 村民當時願意交易的物品會顯示在介面的上方。 + + + + 如果您持有的道具數量不足,該物品會顯示為紅色且無法交易。 + + + + 您要交給村民的道具數量會顯示在介面左方的兩個方格中。 + + + + 您能在介面中的左邊看到兩個方格,以及交易所需的道具數量。 + + + + 請按一下 {*CONTROLLER_VK_A*} 和村民交換他們提供的道具。 + + + + 在此區域有一位村民以及裝有紙張的箱子,讓您了解如何交易。 + + + + {*B*} + 請按一下 {*CONTROLLER_VK_A*} 瞭解何謂交易。{*B*} + 如果您已明白,請按一下 {*CONTROLLER_VK_B*}。 + + + + 玩家可以用身上持有的道具和村民交易。 + + + + 村民持有的交易品可能和他們的職業有關。 + + + + 執行多項交易,可能會增加或更新村民持有的物品。 + + + + 太常交易的熱門物品可能會暫時停止交換,但是仍能和村民交易換取其他物品。 + + + + 從箱子裡拿幾張紙和村民交易。 + + + + 在此區域中有兩個終界箱。 + + + + {*B*} + 請按一下 {*CONTROLLER_VK_A*} 了解關於終界箱的資訊。{*B*} + 如果您已瞭解其運作方式,請按一下 {*CONTROLLER_VK_B*}。 + + + + 即使在不同的空間裡,世界上所有的終界箱仍串聯在一起。存放在終界箱中的道具,都可以在其他終界箱中取用。 + + + + 不過,每個玩家在終界箱中看到的內容物都會不同。 + + + + 玩家能在任何終界箱中儲存物品,並從世界中其他不同地點的終界箱中取物。試著把道具放進終界箱吧。 + + +可回復 2 個 {*ICON_SHANK_01*},在 30 秒內持續回復生命值,並具有 5 分鐘抗火和抵抗傷害的效果。用蘋果和金塊精製而成。 + +可以傳送 + +傳送 + +傳送至玩家位置 + +傳送到自己身邊 + +可以關閉疲勞計算 + +可以隱形 + +您能啟用隱形功能 + +您無法啟用隱形功能 + +您能啟用飛行功能 + +您無法啟用飛行功能 + +您能關閉疲勞計算 + +您無法關閉疲勞計算 + +您能使用傳送功能 + +您無法使用傳送功能 + +{*T3*}遊戲方式:鐵砧{*ETW*}{*B*}{*B*} +您可以在鐵砧上使用經驗等級來修理、更名,或是於物品上附加特殊能力。{*B*} +您可以變更所有物品的名稱,修繕有耐久度的裝備,或加入附魔小冊為物品提供特殊能力。{*B*} +您可以在最左邊的空格內放入想要修理的物品,並加入該物品的製作原料(例如鐵劍與鐵錠)或是以相同類型的物品來組合。{*B*} +用鐵砧組合物品會更有效率,如果其中一件物品附加了特殊能力,產出成品也會繼承此特殊能力。{*B*} +也可以透過加入附魔小冊的方式為物品加入特殊能力,您只需要確認使用了適當的附魔小冊。您可以在地下迷宮中的箱子裡找到附魔小冊,也可以在附加能力台上製作。{*B*} +在每次組合後,鐵砧都有可能會受損,在一定的使用次數後便會損毀。{*B*} + + +{*T3*}遊戲方式:交易{*ETW*}{*B*}{*B*} +您也可以和村民交易。每位村民都有不同的職業,他們有可能會是農夫、肉販、鐵匠、書商或是祭司 ,這也會影響他們供應的物品種類。{*B*} +您可以從村民的交易選單中看到可交易的物品清單。村民在交易時給予的物品數量可能會有不同,而如果是太常交易的品項,可能會暫時停止販售。{*B*} +交易通常與物品買賣交易的翡翠數量有關。{*B*} +如果您身上沒有足夠的物品,您想交換的物品就會顯示為紅色。{*B*} + + +{*T3*}遊戲方式:終界箱{*ETW*}{*B*}{*B*} +世界中所有終界箱都連在一起,放在這種箱子裡的物品,也可以在其他終界箱中取用。不過,每個玩家在終界箱裡看到的物品都會不同。這能讓玩家在世界中任何終界箱存放物品並在其他地點的終界箱取得存放物。 + + +農夫 + +書商 + +祭司 + +鐵匠 + +肉販 + +可在村莊裡找到村民,他們會根據各自的職業,供應相應的道具給玩家購買。 + +大容量箱子 + + + 您也能在附加能力台上製作附魔小冊,您往後可透過鐵砧將此能力附加在其他物品上。 + + + + 只要有東西經過並觸動機關,絆線鉤也能為迴路供電。 + + + +  只要一經馴服,狼身上就會出現一條項圈,您可以透過染色方式變更項圈的顏色。 + + +在種植胡蘿蔔和馬鈴薯後,也能收成這兩項材料。您可以在地面上看到這些蔬果的狀態來判斷是否可以收成。 + + +  此外,您可以為豬加上馬鞍,玩家便能騎乘豬隻。您可以使用「願者上鉤」來引誘小豬移動。 + + + + 如果需要的話,您可以藉由使用 {*CONTROLLER_ACTION_MOVE*} 來慢慢移動您的礦車。藉此將礦車移動到有電力的軌道上可以幫助它啟動。 + + +您無法加入此遊戲。分割畫面只在高畫質模式中支援。如果您想要加入,請登出其他玩家。 + +治療 + +Xbox 360 + +上一步 + +當遊戲中或載入遊戲的存檔有啟用此選項時,都會停用成就及排行榜更新的功能。 + +上傳供 Xbox One 使用的存檔 + +上傳存檔 + +您一次只能在存檔轉移區儲存一個 Xbox 360 主機存檔。請確認您在上傳另一個 Xbox 360 主機存檔之前已經將存檔下載至您的 Xbox One 主機中。 + +正在上傳... + +上傳完成! + +上傳失敗。請您稍後再試。 + + diff --git a/Minecraft.Client/Common/Minecraft_Macros.h b/Minecraft.Client/Common/Minecraft_Macros.h new file mode 100644 index 00000000..4f1f096a --- /dev/null +++ b/Minecraft.Client/Common/Minecraft_Macros.h @@ -0,0 +1,42 @@ + +#pragma once + +// 3 bit user index +// 5 bits alpha +// 1 bit decoration +// 3 bits poptime +// 8 bits unused // was 11 bits aux val but needed 15 bits for potions so moved to item bitmask +// 6 bits count +// 6 bits scale + +// uiCount is up to 64, but can't ever be 0, so to make it 6 bits, subtract one from the packing, and add one on the unpacking +#define MAKE_SLOTDISPLAY_DATA_BITMASK(uiUserIndex,uiAlpha,bDecorations,uiCount,uiScale,uiPopTime) ((((uiUserIndex&0x7)<<29) | (uiAlpha&0x1F)<<24) | (bDecorations?0x800000:0) | ((uiPopTime&0x7)<<20) | ((uiCount-1)<<6) | (uiScale&0x3F)) + +#define GET_SLOTDISPLAY_USERINDEX_FROM_DATA_BITMASK(uiBitmask) ((((unsigned int)uiBitmask)>>29)&0x7) +#define GET_SLOTDISPLAY_ALPHA_FROM_DATA_BITMASK(uiBitmask) ((((unsigned int)uiBitmask)>>24)&0x1F) +#define GET_SLOTDISPLAY_DECORATIONS_FROM_DATA_BITMASK(uiBitmask) ((((unsigned int)uiBitmask)&0x800000)?true:false) +//#define GET_SLOTDISPLAY_AUXVAL_FROM_DATA_BITMASK(uiBitmask) ((((unsigned long)uiBitmask)>>12)&0x7FF) +#define GET_SLOTDISPLAY_COUNT_FROM_DATA_BITMASK(uiBitmask) (((((unsigned int)uiBitmask)>>6)&0x3F)+1) +#define GET_SLOTDISPLAY_SCALE_FROM_DATA_BITMASK(uiBitmask) (((unsigned int)uiBitmask)&0x3F) +#define GET_SLOTDISPLAY_POPTIME_FROM_DATA_BITMASK(uiBitmask) ((((unsigned int)uiBitmask)>>20)&0x7) + +// 16 bits for id (either item id or xzp icon id) +// 15 bits for aux value +// 1 bit for foil +#define MAKE_SLOTDISPLAY_ITEM_BITMASK(uiId,uiAuxValue,bFoil) ( (uiId & 0xFFFF) | ((uiAuxValue & 0x7FFF) << 16) | (bFoil?0x80000000:0) ) + +#define GET_SLOTDISPLAY_ID_FROM_ITEM_BITMASK(uiBitmask) (((unsigned int)uiBitmask)&0xFFFF) +#define GET_SLOTDISPLAY_AUXVAL_FROM_ITEM_BITMASK(uiBitmask) ((((unsigned int)uiBitmask)>>16) & 0x7FFF) +#define GET_SLOTDISPLAY_FOIL_FROM_ITEM_BITMASK(uiBitmask) ((((unsigned int)uiBitmask)&0x80000000)?true:false) + + +// For encoding the players skin selection in their profile +// bDlcSkin = false is a players skin, bDlcSkin = true is a DLC skin +#define MAKE_SKIN_BITMASK(bDlcSkin, dwSkinId) ( (bDlcSkin?0x80000000:0) | (dwSkinId & 0x7FFFFFFF) ) +#define IS_SKIN_ID_IN_RANGE(dwSkinId) (dwSkinId <= 0x7FFFFFFF) + +#define GET_DLC_SKIN_ID_FROM_BITMASK(uiBitmask) (((DWORD)uiBitmask)&0x7FFFFFFF) +#define GET_UGC_SKIN_ID_FROM_BITMASK(uiBitmask) (((DWORD)uiBitmask)&0x7FFFFFE0) +#define GET_DEFAULT_SKIN_ID_FROM_BITMASK(uiBitmask) (((DWORD)uiBitmask)&0x0000001F) +#define GET_IS_DLC_SKIN_FROM_BITMASK(uiBitmask) ((((DWORD)uiBitmask)&0x80000000)?true:false) + diff --git a/Minecraft.Client/Common/Network/GameNetworkManager.cpp b/Minecraft.Client/Common/Network/GameNetworkManager.cpp new file mode 100644 index 00000000..940a148e --- /dev/null +++ b/Minecraft.Client/Common/Network/GameNetworkManager.cpp @@ -0,0 +1,2083 @@ +#include "stdafx.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\..\Minecraft.World\AABB.h" +#include "..\..\..\Minecraft.World\Vec3.h" +#include "..\..\..\Minecraft.World\Socket.h" +#include "..\..\..\Minecraft.World\ThreadName.h" +#include "..\..\..\Minecraft.World\Entity.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.tile.h" +#include "..\..\..\Minecraft.World\FireworksRecipe.h" +#include "..\..\ClientConnection.h" +#include "..\..\Minecraft.h" +#include "..\..\User.h" +#include "..\..\MinecraftServer.h" +#include "..\..\PlayerList.h" +#include "..\..\ServerPlayer.h" +#include "..\..\PlayerConnection.h" +#include "..\..\MultiPlayerLevel.h" +#include "..\..\ProgressRenderer.h" +#include "..\..\MultiPlayerLocalPlayer.h" +#include "..\..\..\Minecraft.World\DisconnectPacket.h" +#include "..\..\..\Minecraft.World\compression.h" +#include "..\..\..\Minecraft.World\OldChunkStorage.h" +#include "..\..\TexturePackRepository.h" +#include "..\..\TexturePack.h" + +#include "..\..\Gui.h" +#include "..\..\LevelRenderer.h" +#include "..\..\..\Minecraft.World\IntCache.h" +#include "..\GameRules\ConsoleGameRules.h" +#include "GameNetworkManager.h" + +#ifdef _XBOX +#include "Common\XUI\XUI_PauseMenu.h" +#else +#include "Common\UI\UI.h" +#include "Common\UI\UIScene_PauseMenu.h" +#include "..\..\Xbox\Network\NetworkPlayerXbox.h" +#endif + +#ifdef _DURANGO +#include "..\Minecraft.World\DurangoStats.h" +#endif + +// Global instance +CGameNetworkManager g_NetworkManager; +CPlatformNetworkManager *CGameNetworkManager::s_pPlatformNetworkManager; + +__int64 CGameNetworkManager::messageQueue[512]; +__int64 CGameNetworkManager::byteQueue[512]; +int CGameNetworkManager::messageQueuePos = 0; + +CGameNetworkManager::CGameNetworkManager() +{ + m_bInitialised = false; + m_bLastDisconnectWasLostRoomOnly = false; + m_bFullSessionMessageOnNextSessionChange = false; + +#ifdef __ORBIS__ + m_pUpsell = NULL; + m_pInviteInfo = NULL; +#endif +} + +void CGameNetworkManager::Initialise() +{ + ServerStoppedCreate( false ); + ServerReadyCreate( false ); + int flagIndexSize = LevelRenderer::getGlobalChunkCount() / (Level::maxBuildHeight / 16); // dividing here by number of renderer chunks in one column +#ifdef _XBOX + s_pPlatformNetworkManager = new CPlatformNetworkManagerXbox(); +#elif defined __PS3__ || defined __ORBIS__ || defined __PSVITA__ + s_pPlatformNetworkManager = new CPlatformNetworkManagerSony(); +#elif defined _DURANGO + s_pPlatformNetworkManager = new CPlatformNetworkManagerDurango(); +#else + s_pPlatformNetworkManager = new CPlatformNetworkManagerStub(); +#endif + s_pPlatformNetworkManager->Initialise( this, flagIndexSize ); + m_bNetworkThreadRunning = false; + m_bInitialised = true; +} + +void CGameNetworkManager::Terminate() +{ + if( m_bInitialised ) + { + s_pPlatformNetworkManager->Terminate(); + } +} + +void CGameNetworkManager::DoWork() +{ +#ifdef _XBOX + // did we get any notifications from the game listener? + if(app.GetNotifications()->size()!=0) + { + PNOTIFICATION pNotification=app.GetNotifications()->back(); + + switch(pNotification->dwNotification) + { + case XN_LIVE_LINK_STATE_CHANGED: + { + int iPrimaryPlayer = g_NetworkManager.GetPrimaryPad(); + bool bConnected = (pNotification->uiParam!=0)?true:false; + if((g_NetworkManager.GetLockedProfile()!=-1) && iPrimaryPlayer!=-1 && bConnected == false && g_NetworkManager.IsInSession() ) + { + app.SetAction(iPrimaryPlayer,eAppAction_EthernetDisconnected); + } + } + break; + case XN_LIVE_INVITE_ACCEPTED: + s_pPlatformNetworkManager->Notify(pNotification->dwNotification,pNotification->uiParam); + break; + } + + app.GetNotifications()->pop_back(); + delete pNotification; + } +#endif + s_pPlatformNetworkManager->DoWork(); + +#ifdef __ORBIS__ + if (m_pUpsell != NULL && m_pUpsell->hasResponse()) + { + int iPad_invited = m_iPlayerInvited, iPad_checking = m_pUpsell->m_userIndex; + + m_iPlayerInvited = -1; + + delete m_pUpsell; + m_pUpsell = NULL; + + if (ProfileManager.HasPlayStationPlus(iPad_checking)) + { + this->GameInviteReceived(iPad_invited, m_pInviteInfo); + + // m_pInviteInfo deleted by GameInviteReceived. + m_pInviteInfo = NULL; + } + else + { + delete m_pInviteInfo; + m_pInviteInfo = NULL; + } + } +#endif +} + +bool CGameNetworkManager::_RunNetworkGame(LPVOID lpParameter) +{ + bool success = true; + + bool isHost = g_NetworkManager.IsHost(); + // Start the network game + Minecraft *pMinecraft=Minecraft::GetInstance(); + success = StartNetworkGame(pMinecraft,lpParameter); + + if(!success) return false; + + if( isHost ) + { + // We do not have a lobby, so the only players in the game at this point are local ones. + + success = s_pPlatformNetworkManager->_RunNetworkGame(); + if(!success) + { + app.SetAction(ProfileManager.GetPrimaryPad(),eAppAction_ExitWorld,(void *)TRUE); + return true; + } + } + + if( g_NetworkManager.IsLeavingGame() ) return false; + + app.SetGameStarted(true); + + // 4J-PB - if this is the trial game, start the trial timer + if(!ProfileManager.IsFullVersion()) + { + ui.SetTrialTimerLimitSecs(MinecraftDynamicConfigurations::GetTrialTime()); + app.SetTrialTimerStart(); + } + //app.CloseXuiScenes(ProfileManager.GetPrimaryPad()); + + return success; +} + +bool CGameNetworkManager::StartNetworkGame(Minecraft *minecraft, LPVOID lpParameter) +{ +#ifdef _DURANGO + ProfileManager.SetDeferredSignoutEnabled(true); +#endif + + __int64 seed = 0; + if(lpParameter != NULL) + { + NetworkGameInitData *param = (NetworkGameInitData *)lpParameter; + seed = param->seed; + + app.setLevelGenerationOptions(param->levelGen); + if(param->levelGen != NULL) + { + if(app.getLevelGenerationOptions() == NULL) + { + app.DebugPrintf("Game rule was not loaded, and seed is required. Exiting.\n"); + return false; + } + else + { + param->seed = seed = app.getLevelGenerationOptions()->getLevelSeed(); + + 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); + } + } + } + } + } + } + } + + static __int64 sseed = seed; // Create static version so this will be valid until next call to this function & whilst thread is running + ServerStoppedCreate(false); + if( g_NetworkManager.IsHost() ) + { + ServerStoppedCreate(true); + ServerReadyCreate(true); + // Ready to go - create actual networking thread & start hosting + C4JThread* thread = new C4JThread(&CGameNetworkManager::ServerThreadProc, lpParameter, "Server", 256 * 1024); +#if defined __PS3__ || defined __PSVITA__ + thread->SetPriority(THREAD_PRIORITY_BELOW_NORMAL); +#endif //__PS3__ + + thread->SetProcessor(CPU_CORE_SERVER); + thread->Run(); + + ServerReadyWait(); + ServerReadyDestroy(); + + if( MinecraftServer::serverHalted() ) + return false; + +// printf("Server ready to go!\n"); + } + else + { + Socket::Initialise(NULL); + } + +#ifndef _XBOX + Minecraft *pMinecraft = Minecraft::GetInstance(); + // Make sure that we have transitioned through any joining/creating stages and are actually playing the game, so that we know the players should be valid + bool changedMessage = false; + while(!IsReadyToPlayOrIdle()) + { + changedMessage = true; + pMinecraft->progressRenderer->progressStage( g_NetworkManager.CorrectErrorIDS(IDS_PROGRESS_SAVING_TO_DISC) ); // "Finalizing..." vaguest message I could find + pMinecraft->progressRenderer->progressStagePercentage( g_NetworkManager.GetJoiningReadyPercentage() ); + Sleep(10); + } + if( changedMessage ) + { + pMinecraft->progressRenderer->progressStagePercentage( 100 ); + } +#endif + + // If we aren't in session, then something bad must have happened - we aren't joining, creating or ready play + if(!IsInSession() ) + { + MinecraftServer::HaltServer(); + return false; + } + + // 4J Stu - Wait a while to make sure that DLC is loaded. This is the last point before the network communication starts + // so the latest we can check this + while( !app.DLCInstallProcessCompleted() && app.DLCInstallPending() && !g_NetworkManager.IsLeavingGame() ) + { + Sleep( 10 ); + } + if( g_NetworkManager.IsLeavingGame() ) + { + MinecraftServer::HaltServer(); + return false; + } + + // PRIMARY PLAYER + + vector createdConnections; + ClientConnection *connection; + + if( g_NetworkManager.IsHost() ) + { + connection = new ClientConnection(minecraft, NULL); + } + else + { + INetworkPlayer *pNetworkPlayer = g_NetworkManager.GetLocalPlayerByUserIndex(ProfileManager.GetLockedProfile()); + if(pNetworkPlayer == NULL) + { + MinecraftServer::HaltServer(); + app.DebugPrintf("%d\n",ProfileManager.GetLockedProfile()); + // If the player is NULL here then something went wrong in the session setup, and continuing will end up in a crash + return false; + } + + Socket *socket = pNetworkPlayer->GetSocket(); + + // Fix for #13259 - CRASH: Gameplay: loading process is halted when player loads saved data + if(socket == NULL) + { + assert(false); + MinecraftServer::HaltServer(); + // If the socket is NULL here then something went wrong in the session setup, and continuing will end up in a crash + return false; + } + + connection = new ClientConnection(minecraft, socket); + } + + if( !connection->createdOk ) + { + assert(false); + delete connection; + connection = NULL; + MinecraftServer::HaltServer(); + return false; + } + + connection->send( shared_ptr( new PreLoginPacket(minecraft->user->name) ) ); + + // Tick connection until we're ready to go. The stages involved in this are: + // (1) Creating the ClientConnection sends a prelogin packet to the server + // (2) the server sends a prelogin back, which is handled by the clientConnection, and returns a login packet + // (3) the server sends a login back, which is handled by the client connection to start the game + if( !g_NetworkManager.IsHost() ) + { + Minecraft::GetInstance()->progressRenderer->progressStart(IDS_PROGRESS_CONNECTING); + } + else + { + // 4J Stu - Host needs to generate a unique multiplayer id for sentient telemetry reporting + INT multiplayerInstanceId = TelemetryManager->GenerateMultiplayerInstanceId(); + TelemetryManager->SetMultiplayerInstanceId(multiplayerInstanceId); + } + TexturePack *tPack = Minecraft::GetInstance()->skins->getSelected(); + do + { + app.DebugPrintf("ticking connection A\n"); + connection->tick(); + + // 4J Stu - We were ticking this way too fast which could cause the connection to time out + // The connections should tick at 20 per second + Sleep(50); + } while ( (IsInSession() && !connection->isStarted() && !connection->isClosed() && !g_NetworkManager.IsLeavingGame()) || tPack->isLoadingData() || (Minecraft::GetInstance()->skins->needsUIUpdate() || ui.IsReloadingSkin()) ); + ui.CleanUpSkinReload(); + + // 4J Stu - Fix for #11279 - CRASH: TCR 001: BAS Game Stability: Signing out of game will cause title to crash + // We need to break out of the above loop if m_bLeavingGame is set, and close the connection + if( g_NetworkManager.IsLeavingGame() || !IsInSession() ) + { + connection->close(); + } + + if( connection->isStarted() && !connection->isClosed() ) + { + createdConnections.push_back( connection ); + + int primaryPad = ProfileManager.GetPrimaryPad(); + app.SetRichPresenceContext(primaryPad,CONTEXT_GAME_STATE_BLANK); + if (GetPlayerCount() > 1) // Are we offline or online, and how many players are there + { + if (IsLocalGame()) ProfileManager.SetCurrentGameActivity(primaryPad,CONTEXT_PRESENCE_MULTIPLAYEROFFLINE,false); + else ProfileManager.SetCurrentGameActivity(primaryPad,CONTEXT_PRESENCE_MULTIPLAYER,false); + } + else + { + if(IsLocalGame()) ProfileManager.SetCurrentGameActivity(primaryPad,CONTEXT_PRESENCE_MULTIPLAYER_1POFFLINE,false); + else ProfileManager.SetCurrentGameActivity(primaryPad,CONTEXT_PRESENCE_MULTIPLAYER_1P,false); + } + + + // ALL OTHER LOCAL PLAYERS + for(int idx = 0; idx < XUSER_MAX_COUNT; ++idx) + { + // Already have setup the primary pad + if(idx == ProfileManager.GetPrimaryPad() ) continue; + + if( GetLocalPlayerByUserIndex(idx) != NULL && !ProfileManager.IsSignedIn(idx) ) + { + INetworkPlayer *pNetworkPlayer = g_NetworkManager.GetLocalPlayerByUserIndex(idx); + Socket *socket = pNetworkPlayer->GetSocket(); + app.DebugPrintf("Closing socket due to player %d not being signed in any more\n"); + if( !socket->close(false) ) socket->close(true); + + continue; + } + + // By default when we host we only have the local player, but currently allow multiple local players to join + // when joining any other way, so just because they are signed in doesn't mean they are in the session + // 4J Stu - If they are in the session, then we should add them to the game. Otherwise we won't be able to add them later + INetworkPlayer *pNetworkPlayer = g_NetworkManager.GetLocalPlayerByUserIndex(idx); + if( pNetworkPlayer == NULL ) + continue; + + ClientConnection *connection; + + Socket *socket = pNetworkPlayer->GetSocket(); + connection = new ClientConnection(minecraft, socket, idx); + + minecraft->addPendingLocalConnection(idx, connection); + //minecraft->createExtraLocalPlayer(idx, (convStringToWstring( ProfileManager.GetGamertag(idx) )).c_str(), idx, connection); + + // Open the socket on the server end to accept incoming data + Socket::addIncomingSocket(socket); + + connection->send( shared_ptr( new PreLoginPacket(convStringToWstring( ProfileManager.GetGamertag(idx) )) ) ); + + createdConnections.push_back( connection ); + + // Tick connection until we're ready to go. The stages involved in this are: + // (1) Creating the ClientConnection sends a prelogin packet to the server + // (2) the server sends a prelogin back, which is handled by the clientConnection, and returns a login packet + // (3) the server sends a login back, which is handled by the client connection to start the game + do + { + // We need to keep ticking the connections for players that already logged in + for(AUTO_VAR(it, createdConnections.begin()); it < createdConnections.end(); ++it) + { + (*it)->tick(); + } + + // 4J Stu - We were ticking this way too fast which could cause the connection to time out + // The connections should tick at 20 per second + Sleep(50); + app.DebugPrintf("<***> %d %d %d %d %d\n",IsInSession(), !connection->isStarted(),!connection->isClosed(),ProfileManager.IsSignedIn(idx),!g_NetworkManager.IsLeavingGame()); +#if defined _XBOX || __PS3__ + } while (IsInSession() && !connection->isStarted() && !connection->isClosed() && ProfileManager.IsSignedIn(idx) && !g_NetworkManager.IsLeavingGame() ); +#else + // TODO - This SHOULD be something just like the code above but temporarily changing here so that we don't have to depend on the profilemanager behaviour + } while (IsInSession() && !connection->isStarted() && !connection->isClosed() && !g_NetworkManager.IsLeavingGame() ); +#endif + + // 4J Stu - Fix for #11279 - CRASH: TCR 001: BAS Game Stability: Signing out of game will cause title to crash + // We need to break out of the above loop if m_bLeavingGame is set, and stop creating new connections + // The connections in the createdConnections vector get closed at the end of the thread + if( g_NetworkManager.IsLeavingGame() || !IsInSession() ) break; + + if( ProfileManager.IsSignedIn(idx) && !connection->isClosed() ) + { + app.SetRichPresenceContext(idx,CONTEXT_GAME_STATE_BLANK); + if (IsLocalGame()) ProfileManager.SetCurrentGameActivity(idx,CONTEXT_PRESENCE_MULTIPLAYEROFFLINE,false); + else ProfileManager.SetCurrentGameActivity(idx,CONTEXT_PRESENCE_MULTIPLAYER,false); + } + else + { + connection->close(); + AUTO_VAR(it, find( createdConnections.begin(), createdConnections.end(), connection )); + if(it != createdConnections.end() ) createdConnections.erase( it ); + } + } + + app.SetGameMode( eMode_Multiplayer ); + } + else if ( connection->isClosed() || !IsInSession()) + { +// assert(false); + MinecraftServer::HaltServer(); + return false; + } + + + if(g_NetworkManager.IsLeavingGame() || !IsInSession() ) + { + for(AUTO_VAR(it, createdConnections.begin()); it < createdConnections.end(); ++it) + { + (*it)->close(); + } +// assert(false); + MinecraftServer::HaltServer(); + return false; + } + + // Catch in-case server has been halted (by a player signout). + if ( MinecraftServer::serverHalted() ) + return false; + + return true; +} + +int CGameNetworkManager::CorrectErrorIDS(int IDS) +{ + return s_pPlatformNetworkManager->CorrectErrorIDS(IDS); +} + +int CGameNetworkManager::GetLocalPlayerMask(int playerIndex) +{ + return s_pPlatformNetworkManager->GetLocalPlayerMask( playerIndex ); +} + +int CGameNetworkManager::GetPlayerCount() +{ + return s_pPlatformNetworkManager->GetPlayerCount(); +} + +int CGameNetworkManager::GetOnlinePlayerCount() +{ + return s_pPlatformNetworkManager->GetOnlinePlayerCount(); +} + +bool CGameNetworkManager::AddLocalPlayerByUserIndex( int userIndex ) +{ + return s_pPlatformNetworkManager->AddLocalPlayerByUserIndex( userIndex ); +} + +bool CGameNetworkManager::RemoveLocalPlayerByUserIndex( int userIndex ) +{ + return s_pPlatformNetworkManager->RemoveLocalPlayerByUserIndex( userIndex ); +} + +INetworkPlayer *CGameNetworkManager::GetLocalPlayerByUserIndex(int userIndex ) +{ + return s_pPlatformNetworkManager->GetLocalPlayerByUserIndex( userIndex ); +} + +INetworkPlayer *CGameNetworkManager::GetPlayerByIndex(int playerIndex) +{ + return s_pPlatformNetworkManager->GetPlayerByIndex( playerIndex ); +} + +INetworkPlayer *CGameNetworkManager::GetPlayerByXuid(PlayerUID xuid) +{ + return s_pPlatformNetworkManager->GetPlayerByXuid( xuid ); +} + +INetworkPlayer *CGameNetworkManager::GetPlayerBySmallId(unsigned char smallId) +{ + return s_pPlatformNetworkManager->GetPlayerBySmallId( smallId ); +} + +#ifdef _DURANGO +wstring CGameNetworkManager::GetDisplayNameByGamertag(wstring gamertag) +{ + return s_pPlatformNetworkManager->GetDisplayNameByGamertag(gamertag); +} +#endif + +INetworkPlayer *CGameNetworkManager::GetHostPlayer() +{ + return s_pPlatformNetworkManager->GetHostPlayer(); +} + +void CGameNetworkManager::RegisterPlayerChangedCallback(int iPad, void (*callback)(void *callbackParam, INetworkPlayer *pPlayer, bool leaving), void *callbackParam) +{ + s_pPlatformNetworkManager->RegisterPlayerChangedCallback( iPad, callback, callbackParam ); +} + +void CGameNetworkManager::UnRegisterPlayerChangedCallback(int iPad, void (*callback)(void *callbackParam, INetworkPlayer *pPlayer, bool leaving), void *callbackParam) +{ + s_pPlatformNetworkManager->UnRegisterPlayerChangedCallback( iPad, callback, callbackParam ); +} + +void CGameNetworkManager::HandleSignInChange() +{ + s_pPlatformNetworkManager->HandleSignInChange(); +} + +bool CGameNetworkManager::ShouldMessageForFullSession() +{ + return s_pPlatformNetworkManager->ShouldMessageForFullSession(); +} + +bool CGameNetworkManager::IsInSession() +{ + return s_pPlatformNetworkManager->IsInSession(); +} + +bool CGameNetworkManager::IsInGameplay() +{ + return s_pPlatformNetworkManager->IsInGameplay(); +} + +bool CGameNetworkManager::IsReadyToPlayOrIdle() +{ + return s_pPlatformNetworkManager->IsReadyToPlayOrIdle(); +} + +bool CGameNetworkManager::IsLeavingGame() +{ + return s_pPlatformNetworkManager->IsLeavingGame(); +} + +bool CGameNetworkManager::SetLocalGame(bool isLocal) +{ + return s_pPlatformNetworkManager->SetLocalGame( isLocal ); +} + +bool CGameNetworkManager::IsLocalGame() +{ + return s_pPlatformNetworkManager->IsLocalGame(); +} + +void CGameNetworkManager::SetPrivateGame(bool isPrivate) +{ + s_pPlatformNetworkManager->SetPrivateGame( isPrivate ); +} + +bool CGameNetworkManager::IsPrivateGame() +{ + return s_pPlatformNetworkManager->IsPrivateGame(); +} + +void CGameNetworkManager::HostGame(int localUsersMask, bool bOnlineGame, bool bIsPrivate, unsigned char publicSlots, unsigned char privateSlots) +{ + // 4J Stu - clear any previous connection errors + Minecraft::GetInstance()->clearConnectionFailed(); + + s_pPlatformNetworkManager->HostGame( localUsersMask, bOnlineGame, bIsPrivate, publicSlots, privateSlots ); +} + +bool CGameNetworkManager::IsHost() +{ + return (s_pPlatformNetworkManager->IsHost() == TRUE); +} + +bool CGameNetworkManager::IsInStatsEnabledSession() +{ + return s_pPlatformNetworkManager->IsInStatsEnabledSession(); +} + +bool CGameNetworkManager::SessionHasSpace(unsigned int spaceRequired) +{ + return s_pPlatformNetworkManager->SessionHasSpace( spaceRequired ); +} + +vector *CGameNetworkManager::GetSessionList(int iPad, int localPlayers, bool partyOnly) +{ + return s_pPlatformNetworkManager->GetSessionList( iPad, localPlayers, partyOnly ); +} + +bool CGameNetworkManager::GetGameSessionInfo(int iPad, SessionID sessionId,FriendSessionInfo *foundSession) +{ + return s_pPlatformNetworkManager->GetGameSessionInfo( iPad, sessionId, foundSession ); +} + +void CGameNetworkManager::SetSessionsUpdatedCallback( void (*SessionsUpdatedCallback)(LPVOID pParam), LPVOID pSearchParam ) +{ + s_pPlatformNetworkManager->SetSessionsUpdatedCallback( SessionsUpdatedCallback, pSearchParam ); +} + +void CGameNetworkManager::GetFullFriendSessionInfo( FriendSessionInfo *foundSession, void (* FriendSessionUpdatedFn)(bool success, void *pParam), void *pParam ) +{ + s_pPlatformNetworkManager->GetFullFriendSessionInfo(foundSession, FriendSessionUpdatedFn, pParam); +} + +void CGameNetworkManager::ForceFriendsSessionRefresh() +{ + s_pPlatformNetworkManager->ForceFriendsSessionRefresh(); +} + +bool CGameNetworkManager::JoinGameFromInviteInfo( int userIndex, int userMask, const INVITE_INFO *pInviteInfo) +{ + return s_pPlatformNetworkManager->JoinGameFromInviteInfo( userIndex, userMask, pInviteInfo ); +} + +CGameNetworkManager::eJoinGameResult CGameNetworkManager::JoinGame(FriendSessionInfo *searchResult, int localUsersMask) +{ + app.SetTutorialMode( false ); + g_NetworkManager.SetLocalGame(false); + + int primaryUserIndex = ProfileManager.GetLockedProfile(); + + // 4J-PB - clear any previous connection errors + Minecraft::GetInstance()->clearConnectionFailed(); + + // Make sure that the Primary Pad is in by default + localUsersMask |= GetLocalPlayerMask( ProfileManager.GetPrimaryPad() ); + + return (eJoinGameResult)(s_pPlatformNetworkManager->JoinGame( searchResult, localUsersMask, primaryUserIndex )); +} + +void CGameNetworkManager::CancelJoinGame(LPVOID lpParam) +{ +#ifdef _XBOX_ONE + s_pPlatformNetworkManager->CancelJoinGame(); +#endif +} + +bool CGameNetworkManager::LeaveGame(bool bMigrateHost) +{ + Minecraft::GetInstance()->gui->clearMessages(); + return s_pPlatformNetworkManager->LeaveGame( bMigrateHost ); +} + +int CGameNetworkManager::JoinFromInvite_SignInReturned(void *pParam,bool bContinue, int iPad) +{ + INVITE_INFO * pInviteInfo = (INVITE_INFO *)pParam; + + if(bContinue==true) + { +#ifdef __ORBIS__ + // Check if PSN is unavailable because of age restriction + int npAvailability = ProfileManager.getNPAvailability(iPad); + if (npAvailability == SCE_NP_ERROR_AGE_RESTRICTION) + { + UINT uiIDA[1]; + uiIDA[0] = IDS_OK; + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPad); + + return 0; + } +#endif + + app.DebugPrintf("JoinFromInvite_SignInReturned, iPad %d\n",iPad); + // It's possible that the player has not signed in - they can back out + if(ProfileManager.IsSignedIn(iPad) && ProfileManager.IsSignedInLive(iPad) ) + { + app.DebugPrintf("JoinFromInvite_SignInReturned, passed sign-in tests\n"); + int localUsersMask = 0; + int joiningUsers = 0; + + bool noPrivileges = false; + for(unsigned int index = 0; index < XUSER_MAX_COUNT; ++index) + { + if(ProfileManager.IsSignedIn(index) ) + { + ++joiningUsers; + if( !ProfileManager.AllowedToPlayMultiplayer(index) ) noPrivileges = true; + localUsersMask |= GetLocalPlayerMask( index ); + } + } + + // Check if user-created content is allowed, as we cannot play multiplayer if it's not + bool noUGC = false; +#if defined(__PS3__) || defined(__PSVITA__) + ProfileManager.GetChatAndContentRestrictions(iPad,false,&noUGC,NULL,NULL); +#elif defined(__ORBIS__) + ProfileManager.GetChatAndContentRestrictions(iPad,false,NULL,&noUGC,NULL); +#endif + + if(noUGC) + { + int messageText = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_SINGLE_LOCAL; + if(joiningUsers > 1) messageText = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_ALL_LOCAL; + + ui.RequestUGCMessageBox(IDS_CONNECTION_FAILED, messageText); + } + else if(noPrivileges) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestErrorMessage( IDS_NO_MULTIPLAYER_PRIVILEGE_TITLE, IDS_NO_MULTIPLAYER_PRIVILEGE_JOIN_TEXT, uiIDA,1,ProfileManager.GetPrimaryPad()); + } + else + { +#if defined(__ORBIS__) || defined(__PSVITA__) + bool chatRestricted = false; + ProfileManager.GetChatAndContentRestrictions(iPad,false,&chatRestricted,NULL,NULL); + if(chatRestricted) + { + ProfileManager.DisplaySystemMessage( 0, ProfileManager.GetPrimaryPad() ); + } +#endif + ProfileManager.SetLockedProfile(iPad); + ProfileManager.SetPrimaryPad(iPad); + + g_NetworkManager.SetLocalGame(false); + + // If the player was signed in before selecting play, we'll not have read the profile yet, so query the sign-in status to get this to happen + ProfileManager.QuerySigninStatus(); + + // 4J-PB - clear any previous connection errors + Minecraft::GetInstance()->clearConnectionFailed(); + + // change the minecraft player name + Minecraft::GetInstance()->user->name = convStringToWstring( ProfileManager.GetGamertag(ProfileManager.GetPrimaryPad())); + + bool success = g_NetworkManager.JoinGameFromInviteInfo( + iPad, // dwUserIndex + localUsersMask, // dwUserMask + pInviteInfo ); // pInviteInfo + if( !success ) + { + app.DebugPrintf( "Failed joining game from invite\n" ); + } + } + } + else + { + app.DebugPrintf("JoinFromInvite_SignInReturned, failed sign-in tests :%d %d\n",ProfileManager.IsSignedIn(iPad),ProfileManager.IsSignedInLive(iPad)); + } + } + return 0; + +} + +void CGameNetworkManager::UpdateAndSetGameSessionData(INetworkPlayer *pNetworkPlayerLeaving) +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + TexturePack *tPack = pMinecraft->skins->getSelected(); + s_pPlatformNetworkManager->SetSessionTexturePackParentId( tPack->getDLCParentPackId() ); + s_pPlatformNetworkManager->SetSessionSubTexturePackId( tPack->getDLCSubPackId() ); + + s_pPlatformNetworkManager->UpdateAndSetGameSessionData( pNetworkPlayerLeaving ); +} + +void CGameNetworkManager::SendInviteGUI(int quadrant) +{ + s_pPlatformNetworkManager->SendInviteGUI(quadrant); +} + +void CGameNetworkManager::ResetLeavingGame() +{ + s_pPlatformNetworkManager->ResetLeavingGame(); +} + +bool CGameNetworkManager::IsNetworkThreadRunning() +{ + return m_bNetworkThreadRunning;; +} + +int CGameNetworkManager::RunNetworkGameThreadProc( void* lpParameter ) +{ + // Share AABB & Vec3 pools with default (main thread) - should be ok as long as we don't tick the main thread whilst this thread is running + AABB::UseDefaultThreadStorage(); + Vec3::UseDefaultThreadStorage(); + Compression::UseDefaultThreadStorage(); + Tile::CreateNewThreadStorage(); + IntCache::CreateNewThreadStorage(); + + g_NetworkManager.m_bNetworkThreadRunning = true; + bool success = g_NetworkManager._RunNetworkGame(lpParameter); + g_NetworkManager.m_bNetworkThreadRunning = false; + if( !success) + { + TexturePack *tPack = Minecraft::GetInstance()->skins->getSelected(); + while ( tPack->isLoadingData() || (Minecraft::GetInstance()->skins->needsUIUpdate() || ui.IsReloadingSkin()) ) + { + Sleep(1); + } + ui.CleanUpSkinReload(); + if(app.GetDisconnectReason() == DisconnectPacket::eDisconnect_None) + { + app.SetDisconnectReason( DisconnectPacket::eDisconnect_ConnectionCreationFailed ); + } + // If we failed before the server started, clear the game rules. Otherwise the server will clear it up. + if(MinecraftServer::getInstance() == NULL) app.m_gameRules.unloadCurrentGameRules(); + Tile::ReleaseThreadStorage(); + return -1; + } + +#ifdef __PSVITA__ + // 4J-JEV: Wait for the loading/saving to finish. + while (StorageManager.GetSaveState() != C4JStorage::ESaveGame_Idle) Sleep(10); +#endif + + Tile::ReleaseThreadStorage(); + IntCache::ReleaseThreadStorage(); + return 0; +} + +int CGameNetworkManager::ServerThreadProc( void* lpParameter ) +{ + __int64 seed = 0; + if(lpParameter != NULL) + { + NetworkGameInitData *param = (NetworkGameInitData *)lpParameter; + seed = param->seed; + app.SetGameHostOption(eGameHostOption_All,param->settings); + + // 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"); + AABB::CreateNewThreadStorage(); + Vec3::CreateNewThreadStorage(); + IntCache::CreateNewThreadStorage(); + Compression::UseDefaultThreadStorage(); + OldChunkStorage::UseDefaultThreadStorage(); + Entity::useSmallIds(); + Level::enableLightingCache(); + Tile::CreateNewThreadStorage(); + FireworksRecipe::CreateNewThreadStorage(); + + MinecraftServer::main(seed, lpParameter); //saveData, app.GetGameHostOption(eGameHostOption_All)); + + Tile::ReleaseThreadStorage(); + AABB::ReleaseThreadStorage(); + Vec3::ReleaseThreadStorage(); + IntCache::ReleaseThreadStorage(); + Level::destroyLightingCache(); + + if(lpParameter != NULL) delete lpParameter; + + return S_OK; +} + +int CGameNetworkManager::ExitAndJoinFromInviteThreadProc( void* lpParam ) +{ + // Share AABB & Vec3 pools with default (main thread) - should be ok as long as we don't tick the main thread whilst this thread is running + AABB::UseDefaultThreadStorage(); + Vec3::UseDefaultThreadStorage(); + Compression::UseDefaultThreadStorage(); + + //app.SetGameStarted(false); + UIScene_PauseMenu::_ExitWorld(NULL); + + while( g_NetworkManager.IsInSession() ) + { + Sleep(1); + } + + // Xbox should always be online when receiving invites - on PS3 we need to check & ask the user to sign in +#if !defined(__PS3__) && !defined(__PSVITA__) + JoinFromInviteData *inviteData = (JoinFromInviteData *)lpParam; + app.SetAction(inviteData->dwUserIndex, eAppAction_JoinFromInvite, lpParam); +#else + if(ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad())) + { + JoinFromInviteData *inviteData = (JoinFromInviteData *)lpParam; + app.SetAction(inviteData->dwUserIndex, eAppAction_JoinFromInvite, lpParam); + } + else + { + UINT uiIDA[2]; + uiIDA[0]=IDS_PRO_NOTONLINE_ACCEPT; + uiIDA[1]=IDS_PRO_NOTONLINE_DECLINE; + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&CGameNetworkManager::MustSignInReturned_0,lpParam); + } +#endif + + return S_OK; +} + +#if defined __PS3__ || defined __PSVITA__ || defined __ORBIS__ +// This case happens when we have been returned from the game to the main menu after receiving an invite and are now trying to go back in to join the new game +// The pair of methods MustSignInReturned_0 & PSNSignInReturned_0 handle this +int CGameNetworkManager::MustSignInReturned_0(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + if(result==C4JStorage::EMessage_ResultAccept) + { +#ifdef __PS3__ + SQRNetworkManager_PS3::AttemptPSNSignIn(&CGameNetworkManager::PSNSignInReturned_0, pParam,true); +#elif defined __PSVITA__ + SQRNetworkManager_Vita::AttemptPSNSignIn(&CGameNetworkManager::PSNSignInReturned_0, pParam,true); +#elif defined __ORBIS__ + SQRNetworkManager_Orbis::AttemptPSNSignIn(&CGameNetworkManager::PSNSignInReturned_0, pParam,true); +#endif + } + else + { + app.SetAction(0,eAppAction_Idle); + ui.NavigateToHomeMenu(); + ui.UpdatePlayerBasePositions(); + } + + return 0; +} + +int CGameNetworkManager::PSNSignInReturned_0(void* pParam, bool bContinue, int iPad) +{ + JoinFromInviteData *inviteData = (JoinFromInviteData *)pParam; + + // If the invite data isn't set up yet (indicated by it being all zeroes, easiest detected via the net version), then try and get it again... this can happen if we got + // the invite whilst signed out + + if( bContinue ) + { + if(inviteData->pInviteInfo->netVersion == 0) + { +#if defined __PS3__ || defined __VITA__ + if(!SQRNetworkManager_PS3::UpdateInviteData((SQRNetworkManager::PresenceSyncInfo *)inviteData->pInviteInfo)) + { + bContinue = false; + } +#elif defined __ORBIS__ + // TODO: No Orbis equivalent (should there be?) +#endif + } + } + + if( bContinue ) + { + app.SetAction(inviteData->dwUserIndex, eAppAction_JoinFromInvite, pParam); + } + else + { + app.SetAction(inviteData->dwUserIndex,eAppAction_Idle); + ui.NavigateToHomeMenu(); + ui.UpdatePlayerBasePositions(); + } + + return 0; +} + +// This case happens when we were in the main menus when we got an invite, and weren't signed in... now can proceed with the normal flow of code for this situation +// The pair of methods MustSignInReturned_1 & PSNSignInReturned_1 handle this +int CGameNetworkManager::MustSignInReturned_1(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + if(result==C4JStorage::EMessage_ResultAccept) + { +#ifdef __PS3__ + SQRNetworkManager_PS3::AttemptPSNSignIn(&CGameNetworkManager::PSNSignInReturned_1, pParam,true); +#elif defined __PSVITA__ + SQRNetworkManager_Vita::AttemptPSNSignIn(&CGameNetworkManager::PSNSignInReturned_1, pParam,true); +#elif defined __ORBIS__ + SQRNetworkManager_Orbis::AttemptPSNSignIn(&CGameNetworkManager::PSNSignInReturned_1, pParam,true); +#endif + } + return 0; +} + +int CGameNetworkManager::PSNSignInReturned_1(void* pParam, bool bContinue, int iPad) +{ + INVITE_INFO *inviteInfo = (INVITE_INFO *)pParam; + + // If the invite data isn't set up yet (indicated by it being all zeroes, easiest detected via the net version), then try and get it again... this can happen if we got + // the invite whilst signed out + + if( bContinue ) + { + if(inviteInfo->netVersion == 0) + { +#if defined __PS3__ || defined __VITA__ + if(!SQRNetworkManager_PS3::UpdateInviteData((SQRNetworkManager::PresenceSyncInfo *)inviteInfo)) + { + bContinue = false; + } +#elif defined __ORBIS__ + // TODO: No Orbis equivalent (should there be?) +#endif + + } + } + + if( bContinue ) + { + g_NetworkManager.HandleInviteWhenInMenus(0, inviteInfo); + } + + return 0; +} +#endif + +void CGameNetworkManager::_LeaveGame() +{ + s_pPlatformNetworkManager->_LeaveGame(false, true); +} + +int CGameNetworkManager::ChangeSessionTypeThreadProc( void* lpParam ) +{ + // Share AABB & Vec3 pools with default (main thread) - should be ok as long as we don't tick the main thread whilst this thread is running + AABB::UseDefaultThreadStorage(); + Vec3::UseDefaultThreadStorage(); + Compression::UseDefaultThreadStorage(); + + Minecraft *pMinecraft = Minecraft::GetInstance(); + MinecraftServer *pServer = MinecraftServer::getInstance(); + +#if defined(__PS3__) || defined(__ORBIS__) || defined __PSVITA__ + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + if( g_NetworkManager.m_bLastDisconnectWasLostRoomOnly ) + { + if(g_NetworkManager.m_bSignedOutofPSN) + { + C4JStorage::EMessageResult result = ui.RequestErrorMessage( IDS_PROGRESS_CONVERTING_TO_OFFLINE_GAME, IDS_ERROR_PSN_SIGN_OUT, uiIDA,1,ProfileManager.GetPrimaryPad()); + } + else + { + C4JStorage::EMessageResult result = ui.RequestErrorMessage( IDS_ERROR_NETWORK_TITLE, IDS_PROGRESS_CONVERTING_TO_OFFLINE_GAME, uiIDA,1,ProfileManager.GetPrimaryPad()); + } + } + else + { + 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 + pMinecraft->progressRenderer->progressStartNoAbort( IDS_PROGRESS_CONVERTING_TO_OFFLINE_GAME ); + pMinecraft->progressRenderer->progressStage( -1 ); //g_NetworkManager.CorrectErrorIDS(IDS_CONNECTION_LOST_LIVE_NO_EXIT) ); +#elif defined(_XBOX_ONE) + if( g_NetworkManager.m_bFullSessionMessageOnNextSessionChange ) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + C4JStorage::EMessageResult result = ui.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 ); + } + else + { + pMinecraft->progressRenderer->progressStartNoAbort( g_NetworkManager.CorrectErrorIDS(IDS_CONNECTION_LOST_LIVE_NO_EXIT) ); + pMinecraft->progressRenderer->progressStage( IDS_PROGRESS_CONVERTING_TO_OFFLINE_GAME ); + } + +#else + pMinecraft->progressRenderer->progressStartNoAbort( g_NetworkManager.CorrectErrorIDS(IDS_CONNECTION_LOST_LIVE_NO_EXIT) ); + pMinecraft->progressRenderer->progressStage( IDS_PROGRESS_CONVERTING_TO_OFFLINE_GAME ); +#endif + + while( app.GetXuiServerAction(ProfileManager.GetPrimaryPad() ) != eXuiServerAction_Idle && !MinecraftServer::serverHalted() ) + { + Sleep(10); + } + app.SetXuiServerAction(ProfileManager.GetPrimaryPad(),eXuiServerAction_PauseServer,(void *)TRUE); + + // wait for the server to be in a non-ticking state + pServer->m_serverPausedEvent->WaitForSignal(INFINITE); + +#if defined(__PS3__) || defined(__ORBIS__) || defined __PSVITA__ + // Swap these two messages around as one is too long to display at 480 + pMinecraft->progressRenderer->progressStartNoAbort( IDS_PROGRESS_CONVERTING_TO_OFFLINE_GAME ); + pMinecraft->progressRenderer->progressStage( -1 ); //g_NetworkManager.CorrectErrorIDS(IDS_CONNECTION_LOST_LIVE_NO_EXIT) ); +#elif defined(_XBOX_ONE) + if( g_NetworkManager.m_bFullSessionMessageOnNextSessionChange ) + { + pMinecraft->progressRenderer->progressStartNoAbort( IDS_PROGRESS_CONVERTING_TO_OFFLINE_GAME ); + pMinecraft->progressRenderer->progressStage( -1 ); + } + else + { + pMinecraft->progressRenderer->progressStartNoAbort( g_NetworkManager.CorrectErrorIDS(IDS_CONNECTION_LOST_LIVE_NO_EXIT) ); + pMinecraft->progressRenderer->progressStage( IDS_PROGRESS_CONVERTING_TO_OFFLINE_GAME ); + } +#else + pMinecraft->progressRenderer->progressStartNoAbort( g_NetworkManager.CorrectErrorIDS(IDS_CONNECTION_LOST_LIVE_NO_EXIT) ); + pMinecraft->progressRenderer->progressStage( IDS_PROGRESS_CONVERTING_TO_OFFLINE_GAME ); +#endif + + pMinecraft->progressRenderer->progressStagePercentage(25); + +#ifdef _XBOX_ONE + // wait for any players that were being added, to finish doing this. On XB1, if we don't do this then there's an async thread running doing this, + // which could then finish at any inappropriate time later + while( s_pPlatformNetworkManager->IsAddingPlayer() ) + { + Sleep(1); + } +#endif + + // Null the network player of all the server players that are local, to stop them being removed from the server when removed from the session + if( pServer != NULL ) + { + PlayerList *players = pServer->getPlayers(); + for(AUTO_VAR(it, players->players.begin()); it < players->players.end(); ++it) + { + shared_ptr servPlayer = *it; + if( servPlayer->connection->isLocal() && !servPlayer->connection->isGuest() ) + { + servPlayer->connection->connection->getSocket()->setPlayer(NULL); + } + } + } + + // delete the current session - if we weren't actually disconnected fully from the network but have just lost our room, then pass a bLeaveRoom flag of false + // here as by definition we don't need to leave the room (again). This is currently only an issue for sony platforms. + if( g_NetworkManager.m_bLastDisconnectWasLostRoomOnly ) + { + s_pPlatformNetworkManager->_LeaveGame(false, false); + } + else + { + s_pPlatformNetworkManager->_LeaveGame(false, true); + } + + // wait for the current session to end + while( g_NetworkManager.IsInSession() ) + { + Sleep(1); + } + + // Reset this flag as the we don't need to know that we only lost the room only from this point onwards, the behaviour is exactly the same + g_NetworkManager.m_bLastDisconnectWasLostRoomOnly = false; + g_NetworkManager.m_bFullSessionMessageOnNextSessionChange = false; + + pMinecraft->progressRenderer->progressStagePercentage(50); + + // Defaulting to making this a local game + g_NetworkManager.SetLocalGame(true); + + // Create a new session with all the players that were in the old one + int localUsersMask = 0; + char numLocalPlayers = 0; + for(unsigned int index = 0; index < XUSER_MAX_COUNT; ++index) + { + if(ProfileManager.IsSignedIn(index) && pMinecraft->localplayers[index] != NULL ) + { + numLocalPlayers++; + localUsersMask |= GetLocalPlayerMask(index); + } + } + + s_pPlatformNetworkManager->_HostGame( localUsersMask ); + + pMinecraft->progressRenderer->progressStagePercentage(75); + + // Wait for all the local players to rejoin the session + while( g_NetworkManager.GetPlayerCount() < numLocalPlayers ) + { + Sleep(1); + } + + // Restore the network player of all the server players that are local + if( pServer != NULL ) + { + for(unsigned int index = 0; index < XUSER_MAX_COUNT; ++index) + { + if(ProfileManager.IsSignedIn(index) && pMinecraft->localplayers[index] != NULL ) + { + PlayerUID localPlayerXuid = pMinecraft->localplayers[index]->getXuid(); + + PlayerList *players = pServer->getPlayers(); + for(AUTO_VAR(it, players->players.begin()); it < players->players.end(); ++it) + { + shared_ptr servPlayer = *it; + if( servPlayer->getXuid() == localPlayerXuid ) + { + servPlayer->connection->connection->getSocket()->setPlayer( g_NetworkManager.GetLocalPlayerByUserIndex(index) ); + } + } + + // Player might have a pending connection + if (pMinecraft->m_pendingLocalConnections[index] != NULL) + { + // Update the network player + pMinecraft->m_pendingLocalConnections[index]->getConnection()->getSocket()->setPlayer(g_NetworkManager.GetLocalPlayerByUserIndex(index)); + } + else if ( pMinecraft->m_connectionFailed[index] && (pMinecraft->m_connectionFailedReason[index] == DisconnectPacket::eDisconnect_ConnectionCreationFailed) ) + { + pMinecraft->removeLocalPlayerIdx(index); +#ifdef _XBOX_ONE + ProfileManager.RemoveGamepadFromGame(index); +#endif + } + } + } + } + + pMinecraft->progressRenderer->progressStagePercentage(100); + +#ifndef _XBOX + // Make sure that we have transitioned through any joining/creating stages so we're actually ready to set to play + while(!s_pPlatformNetworkManager->IsReadyToPlayOrIdle()) + { + Sleep(10); + } +#endif + + s_pPlatformNetworkManager->_StartGame(); + +#ifndef _XBOX + // Wait until the message box has been closed + while(ui.IsSceneInStack(XUSER_INDEX_ANY, eUIScene_MessageBox)) + { + Sleep(10); + } +#endif + + // Start the game again + app.SetGameStarted(true); + app.SetXuiServerAction(ProfileManager.GetPrimaryPad(),eXuiServerAction_PauseServer,(void *)FALSE); + app.SetChangingSessionType(false); + app.SetReallyChangingSessionType(false); + + return S_OK; + +} + +void CGameNetworkManager::SystemFlagSet(INetworkPlayer *pNetworkPlayer, int index) +{ + s_pPlatformNetworkManager->SystemFlagSet( pNetworkPlayer, index ); +} + +bool CGameNetworkManager::SystemFlagGet(INetworkPlayer *pNetworkPlayer, int index) +{ + return s_pPlatformNetworkManager->SystemFlagGet( pNetworkPlayer, index ); +} + +wstring CGameNetworkManager::GatherStats() +{ + return s_pPlatformNetworkManager->GatherStats(); +} + +void CGameNetworkManager::renderQueueMeter() +{ +#ifdef _XBOX + int height = 720; + + CGameNetworkManager::byteQueue[(CGameNetworkManager::messageQueuePos) & (CGameNetworkManager::messageQueue_length - 1)] = GetHostPlayer()->GetSendQueueSizeBytes(NULL, false); + CGameNetworkManager::messageQueue[(CGameNetworkManager::messageQueuePos++) & (CGameNetworkManager::messageQueue_length - 1)] = GetHostPlayer()->GetSendQueueSizeMessages(NULL, false); + + Minecraft *pMinecraft = Minecraft::GetInstance(); + pMinecraft->gui->renderGraph(CGameNetworkManager::messageQueue_length, CGameNetworkManager::messageQueuePos, CGameNetworkManager::messageQueue, 10, 1000, CGameNetworkManager::byteQueue, 100, 25000); +#endif +} + +wstring CGameNetworkManager::GatherRTTStats() +{ + return s_pPlatformNetworkManager->GatherRTTStats(); +} + +void CGameNetworkManager::StateChange_AnyToHosting() +{ + app.DebugPrintf("Disabling Guest Signin\n"); + XEnableGuestSignin(FALSE); + Minecraft::GetInstance()->clearPendingClientTextureRequests(); +} + +void CGameNetworkManager::StateChange_AnyToJoining() +{ + app.DebugPrintf("Disabling Guest Signin\n"); + XEnableGuestSignin(FALSE); + Minecraft::GetInstance()->clearPendingClientTextureRequests(); + + ConnectionProgressParams *param = new ConnectionProgressParams(); + param->iPad = ProfileManager.GetPrimaryPad(); + param->stringId = -1; + param->showTooltips = false; + param->setFailTimer = true; + param->timerTime = CONNECTING_PROGRESS_CHECK_TIME; + + ui.NavigateToScene(ProfileManager.GetPrimaryPad(), eUIScene_ConnectingProgress, param); +} + +void CGameNetworkManager::StateChange_JoiningToIdle(CPlatformNetworkManager::eJoinFailedReason reason) +{ + DisconnectPacket::eDisconnectReason disconnectReason; + switch(reason) + { + case CPlatformNetworkManager::JOIN_FAILED_SERVER_FULL: + disconnectReason = DisconnectPacket::eDisconnect_ServerFull; + break; + case CPlatformNetworkManager::JOIN_FAILED_INSUFFICIENT_PRIVILEGES: + disconnectReason = DisconnectPacket::eDisconnect_NoMultiplayerPrivilegesJoin; + app.SetAction(ProfileManager.GetPrimaryPad(),eAppAction_FailedToJoinNoPrivileges); + break; + default: + disconnectReason = DisconnectPacket::eDisconnect_ConnectionCreationFailed; + break; + }; + Minecraft::GetInstance()->connectionDisconnected(ProfileManager.GetPrimaryPad(), disconnectReason); +} + +void CGameNetworkManager::StateChange_AnyToStarting() +{ +#if defined __PS3__ || defined __ORBIS__ || defined __PSVITA__ + app.getRemoteStorage()->shutdown(); // shut the remote storage lib down and hopefully get our 7mb back +#endif + + if(!g_NetworkManager.IsHost()) + { + LoadingInputParams *loadingParams = new LoadingInputParams(); + loadingParams->func = &CGameNetworkManager::RunNetworkGameThreadProc; + loadingParams->lpParam = NULL; + + UIFullscreenProgressCompletionData *completionData = new UIFullscreenProgressCompletionData(); + completionData->bShowBackground=TRUE; + completionData->bShowLogo=TRUE; + completionData->type = e_ProgressCompletion_CloseAllPlayersUIScenes; + completionData->iPad = ProfileManager.GetPrimaryPad(); + loadingParams->completionData = completionData; + + ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_FullscreenProgress, loadingParams); + } +} + +void CGameNetworkManager::StateChange_AnyToEnding(bool bStateWasPlaying) +{ + // Kick off a stats write for players that are signed into LIVE, if this is a local game + if( bStateWasPlaying && g_NetworkManager.IsLocalGame() ) + { + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + INetworkPlayer *pNetworkPlayer = g_NetworkManager.GetLocalPlayerByUserIndex(i); + if(pNetworkPlayer != NULL && ProfileManager.IsSignedIn( i ) ) + { + app.DebugPrintf("Stats save for an offline game for the player at index %d\n", i ); + Minecraft::GetInstance()->forceStatsSave(pNetworkPlayer->GetUserIndex()); + } + } + } + + Minecraft::GetInstance()->gui->clearMessages(); + + if(!g_NetworkManager.IsHost() && !g_NetworkManager.IsLeavingGame() ) + { + // 4J Stu - If the host is saving then it might take a while to quite the session, so do it ourself + //m_bLeavingGame = true; + + // The host has notified that the game is about to end + if(app.GetDisconnectReason() == DisconnectPacket::eDisconnect_None) app.SetDisconnectReason( DisconnectPacket::eDisconnect_Quitting ); + app.SetAction(ProfileManager.GetPrimaryPad(),eAppAction_ExitWorld,(void *)TRUE); + } +} + +void CGameNetworkManager::StateChange_AnyToIdle() +{ + app.DebugPrintf("Enabling Guest Signin\n"); + XEnableGuestSignin(TRUE); + // Reset this here so that we can search for games again + // 4J Stu - If we are changing session type there is a race between that thread setting the game to local, and this setting it to not local + if(!app.GetChangingSessionType()) g_NetworkManager.SetLocalGame( false ); + +} + +void CGameNetworkManager::CreateSocket( INetworkPlayer *pNetworkPlayer, bool localPlayer ) +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + + Socket *socket = NULL; + shared_ptr mpPlayer = pMinecraft->localplayers[pNetworkPlayer->GetUserIndex()]; + if( localPlayer && mpPlayer != NULL && mpPlayer->connection != NULL) + { + // If we already have a MultiplayerLocalPlayer here then we are doing a session type change + socket = mpPlayer->connection->getSocket(); + + // Pair this socket and network player + pNetworkPlayer->SetSocket( socket); + if( socket ) + { + socket->setPlayer( pNetworkPlayer ); + } + } + else + { + socket = new Socket( pNetworkPlayer, g_NetworkManager.IsHost(), g_NetworkManager.IsHost() && localPlayer ); + pNetworkPlayer->SetSocket( socket ); + + // 4J Stu - May be other states we want to accept aswell + // Add this user to the game server if the game is started already + if( g_NetworkManager.IsHost() && g_NetworkManager.IsInGameplay() ) + { + Socket::addIncomingSocket(socket); + } + + // If this is a local player and we are already in the game, we need to setup a local connection and log + // the player in to the game server + if( localPlayer && g_NetworkManager.IsInGameplay() ) + { + int idx = pNetworkPlayer->GetUserIndex(); + app.DebugPrintf("Creating new client connection for idx: %d\n", idx); + + ClientConnection *connection; + connection = new ClientConnection(pMinecraft, socket, idx); + + if( connection->createdOk ) + { + connection->send( shared_ptr( new PreLoginPacket( pNetworkPlayer->GetOnlineName() ) ) ); + pMinecraft->addPendingLocalConnection(idx, connection); + } + else + { + pMinecraft->connectionDisconnected( idx , DisconnectPacket::eDisconnect_ConnectionCreationFailed ); + delete connection; + connection = NULL; + } + } + } + +} + +void CGameNetworkManager::CloseConnection( INetworkPlayer *pNetworkPlayer ) +{ + MinecraftServer *server = MinecraftServer::getInstance(); + if( server != NULL ) + { + PlayerList *players = server->getPlayers(); + if( players != NULL ) + { + players->closePlayerConnectionBySmallId(pNetworkPlayer->GetSmallId()); + } + } +} + +void CGameNetworkManager::PlayerJoining( INetworkPlayer *pNetworkPlayer ) +{ + if (g_NetworkManager.IsInGameplay()) // 4J-JEV: Wait to do this at StartNetworkGame if not in-game yet. + { + // 4J-JEV: Update RichPresence when a player joins the game. + bool multiplayer = g_NetworkManager.GetPlayerCount() > 1, localgame = g_NetworkManager.IsLocalGame(); + for (int iPad=0; iPadIsLocal() ) + { + TelemetryManager->RecordPlayerSessionStart(pNetworkPlayer->GetUserIndex()); + } +#ifdef _XBOX + else + { + if( !pNetworkPlayer->IsHost() ) + { + for(int idx = 0; idx < XUSER_MAX_COUNT; ++idx) + { + if(Minecraft::GetInstance()->localplayers[idx] != NULL) + { + TelemetryManager->RecordLevelStart(idx, eSen_FriendOrMatch_Playing_With_Invited_Friends, eSen_CompeteOrCoop_Coop_and_Competitive, Minecraft::GetInstance()->level->difficulty, app.GetLocalPlayerCount(), g_NetworkManager.GetOnlinePlayerCount()); + } + } + } + } +#endif +} + +void CGameNetworkManager::PlayerLeaving( INetworkPlayer *pNetworkPlayer ) +{ + if( pNetworkPlayer->IsLocal() ) + { + ProfileManager.SetCurrentGameActivity(pNetworkPlayer->GetUserIndex(),CONTEXT_PRESENCE_IDLE,false); + + TelemetryManager->RecordPlayerSessionExit(pNetworkPlayer->GetUserIndex(), app.GetDisconnectReason()); + } +#ifdef _XBOX + else + { + for(int idx = 0; idx < XUSER_MAX_COUNT; ++idx) + { + if(Minecraft::GetInstance()->localplayers[idx] != NULL) + { + TelemetryManager->RecordLevelStart(idx, eSen_FriendOrMatch_Playing_With_Invited_Friends, eSen_CompeteOrCoop_Coop_and_Competitive, Minecraft::GetInstance()->level->difficulty, app.GetLocalPlayerCount(), g_NetworkManager.GetOnlinePlayerCount()); + } + } + } +#endif +} + +void CGameNetworkManager::HostChanged() +{ + // Disable host migration + app.SetAction(ProfileManager.GetPrimaryPad(),eAppAction_ExitWorld,(void *)TRUE); +} + +void CGameNetworkManager::WriteStats( INetworkPlayer *pNetworkPlayer ) +{ + Minecraft::GetInstance()->forceStatsSave( pNetworkPlayer->GetUserIndex() ); +} + +void CGameNetworkManager::GameInviteReceived( int userIndex, const INVITE_INFO *pInviteInfo) +{ +#ifdef __ORBIS__ + if (m_pUpsell != NULL) + { + delete pInviteInfo; + return; + } + + // Need to check we're signed in to PSN + bool isSignedInLive = true; + bool isLocalMultiplayerAvailable = app.IsLocalMultiplayerAvailable(); + int iPadNotSignedInLive = -1; + for(unsigned int i = 0; i < XUSER_MAX_COUNT; i++) + { + if (ProfileManager.IsSignedIn(i) && (i == ProfileManager.GetPrimaryPad() || isLocalMultiplayerAvailable)) + { + if (isSignedInLive && !ProfileManager.IsSignedInLive(i)) + { + // Record the first non signed in live pad + iPadNotSignedInLive = i; + } + + isSignedInLive = isSignedInLive && ProfileManager.IsSignedInLive(i); + } + } + + if (!isSignedInLive) + { + // Determine why they're not "signed in live" + + // Check if PSN is unavailable because of age restriction + int npAvailability = ProfileManager.getNPAvailability(iPadNotSignedInLive); + if (npAvailability == SCE_NP_ERROR_AGE_RESTRICTION) + { + // 4J Stu - This is a bit messy and is due to the library incorrectly returning false for IsSignedInLive if the npAvailability isn't SCE_OK + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPadNotSignedInLive); + } + else if (ProfileManager.isSignedInPSN(iPadNotSignedInLive)) + { + // Signed in to PSN but not connected (no internet access) + assert(!ProfileManager.isConnectedToPSN(iPadNotSignedInLive)); + + UINT uiIDA[1]; + uiIDA[0] = IDS_OK; + ui.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.RequestAlertMessage( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, iPadNotSignedInLive, &CGameNetworkManager::MustSignInReturned_1, (void *)pInviteInfo); + } + return; + } + + // if this is the trial game, we'll check and send the user to unlock the game later, in HandleInviteWhenInMenus + if(ProfileManager.IsFullVersion()) + { + // 4J-JEV: Check that all players are authorised for PsPlus, present upsell to players that aren't and try again. + for (unsigned int index = 0; index < XUSER_MAX_COUNT; index++) + { + if ( ProfileManager.IsSignedIn(index) + && !ProfileManager.HasPlayStationPlus(userIndex) ) + { + m_pInviteInfo = (INVITE_INFO *) pInviteInfo; + m_iPlayerInvited = userIndex; + + m_pUpsell = new PsPlusUpsellWrapper(index); + m_pUpsell->displayUpsell(); + + return; + } + } + } +#endif + + + int localUsersMask = 0; + Minecraft *pMinecraft = Minecraft::GetInstance(); + int joiningUsers = 0; + + bool noPrivileges = false; + for(unsigned int index = 0; index < XUSER_MAX_COUNT; ++index) + { + if(ProfileManager.IsSignedIn(index) ) + { + // 4J-PB we shouldn't bring any inactive players into the game, except for the invited player (who may be an inactive player) + // 4J Stu - If we are not in a game, then bring in all players signed in + if(index==userIndex || pMinecraft->localplayers[index]!=NULL ) + { + ++joiningUsers; + if( !ProfileManager.AllowedToPlayMultiplayer(index) ) noPrivileges = true; + localUsersMask |= GetLocalPlayerMask( index ); + } + } + } + + // Check if user-created content is allowed, as we cannot play multiplayer if it's not + bool noUGC = false; + bool bContentRestricted=false; + BOOL pccAllowed = TRUE; + BOOL pccFriendsAllowed = TRUE; +#if defined(__PS3__) || defined(__PSVITA__) + ProfileManager.GetChatAndContentRestrictions(userIndex,false,&noUGC,&bContentRestricted,NULL); +#else + ProfileManager.AllowedPlayerCreatedContent(ProfileManager.GetPrimaryPad(),false,&pccAllowed,&pccFriendsAllowed); + if(!pccAllowed && !pccFriendsAllowed) noUGC = true; +#endif + +#if defined(_XBOX) || defined(__PS3__) + if(joiningUsers > 1 && !RenderManager.IsHiDef() && userIndex != ProfileManager.GetPrimaryPad()) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + + // 4J-PB - it's possible there is no primary pad here, when accepting an invite from the dashboard + ui.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) + { + int messageText = IDS_CONTENT_RESTRICTION; + if(joiningUsers > 1) messageText = IDS_CONTENT_RESTRICTION_MULTIPLAYER; + + ui.RequestContentRestrictedMessageBox(IDS_CONNECTION_FAILED, messageText, XUSER_INDEX_ANY); + } +#endif + else if(noPrivileges) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + + // 4J-PB - it's possible there is no primary pad here, when accepting an invite from the dashboard + //StorageManager.RequestMessageBox( IDS_NO_MULTIPLAYER_PRIVILEGE_TITLE, IDS_NO_MULTIPLAYER_PRIVILEGE_JOIN_TEXT, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable()); + ui.RequestErrorMessage( IDS_NO_MULTIPLAYER_PRIVILEGE_TITLE, IDS_NO_MULTIPLAYER_PRIVILEGE_JOIN_TEXT, uiIDA,1,XUSER_INDEX_ANY); + } + else + { +#if defined(__ORBIS__) || defined(__PSVITA__) + bool chatRestricted = false; + ProfileManager.GetChatAndContentRestrictions(ProfileManager.GetPrimaryPad(),false,&chatRestricted,NULL,NULL); + if(chatRestricted) + { + ProfileManager.DisplaySystemMessage( SCE_MSG_DIALOG_SYSMSG_TYPE_TRC_PSN_CHAT_RESTRICTION, ProfileManager.GetPrimaryPad() ); + } +#endif + if( !g_NetworkManager.IsInSession() ) + { +#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); + } + else + { + UINT uiIDA[2]; + uiIDA[0]=IDS_PRO_NOTONLINE_ACCEPT; + uiIDA[1]=IDS_PRO_NOTONLINE_DECLINE; + 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 + { + app.DebugPrintf("We are already in a multiplayer game...need to leave it\n"); + +// JoinFromInviteData *joinData = new JoinFromInviteData(); +// joinData->dwUserIndex = dwUserIndex; +// joinData->dwLocalUsersMask = dwLocalUsersMask; +// joinData->pInviteInfo = pInviteInfo; + + // tell the app to process this +#ifdef __PSVITA__ + if(((CPlatformNetworkManagerSony*)s_pPlatformNetworkManager)->checkValidInviteData(pInviteInfo)) +#endif + { + app.ProcessInvite(userIndex,localUsersMask,pInviteInfo); + } + } + } +} + +volatile bool waitHere = true; + +void CGameNetworkManager::HandleInviteWhenInMenus( int userIndex, const INVITE_INFO *pInviteInfo) +{ + // We are in the root menus somewhere + +#if 0 + while( waitHere ) + { + Sleep(1); + } +#endif + + // if this is the trial game, then we need the user to unlock the full game + if(!ProfileManager.IsFullVersion()) + { + // The marketplace will fail with the primary player set to -1 + ProfileManager.SetPrimaryPad(userIndex); + + app.SetAction(userIndex,eAppAction_DashboardTrialJoinFromInvite); + } + else + { +#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); + app.StartInstallDLCProcess(userIndex); + + // 4J Stu - Fix for #10936 - MP Lab: TCR 001: Matchmaking: Player is stuck in a soft-locked state after selecting the guest account when prompted + // The locked profile should not be changed if we are in menus as the main player might sign out in the sign-in ui + //ProfileManager.SetLockedProfile(-1); + +#ifdef _XBOX_ONE + if((!app.IsLocalMultiplayerAvailable())&&InputManager.IsPadLocked(userIndex)) +#else + if(!app.IsLocalMultiplayerAvailable()) +#endif + { + bool noPrivileges=!ProfileManager.AllowedToPlayMultiplayer(userIndex); + + if(noPrivileges) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestErrorMessage( IDS_NO_MULTIPLAYER_PRIVILEGE_TITLE, IDS_NO_MULTIPLAYER_PRIVILEGE_JOIN_TEXT, uiIDA,1,ProfileManager.GetPrimaryPad()); + } + else + { + ProfileManager.SetLockedProfile(userIndex); + ProfileManager.SetPrimaryPad(userIndex); + + int localUsersMask=0; + localUsersMask |= GetLocalPlayerMask( userIndex ); + + // If the player was signed in before selecting play, we'll not have read the profile yet, so query the sign-in status to get this to happen + ProfileManager.QuerySigninStatus(); + + // 4J-PB - clear any previous connection errors + Minecraft::GetInstance()->clearConnectionFailed(); + + g_NetworkManager.SetLocalGame(false); + + // change the minecraft player name + Minecraft::GetInstance()->user->name = convStringToWstring( ProfileManager.GetGamertag(ProfileManager.GetPrimaryPad())); + + bool success = g_NetworkManager.JoinGameFromInviteInfo( userIndex, localUsersMask, pInviteInfo ); + if( !success ) + { + app.DebugPrintf( "Failed joining game from invite\n" ); + } + } + } + else + { + // the FromInvite will make the lib decide how many panes to display based on connected pads/signed in players +#ifdef _XBOX + ProfileManager.RequestSignInUI(true, false, false, false, false,&CGameNetworkManager::JoinFromInvite_SignInReturned, (LPVOID)pInviteInfo,userIndex); +#else + SignInInfo info; + info.Func = &CGameNetworkManager::JoinFromInvite_SignInReturned; + info.lpParam = (LPVOID)pInviteInfo; + info.requireOnline = true; + app.DebugPrintf("Using fullscreen layer\n"); + ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_QuadrantSignin,&info,eUILayer_Alert,eUIGroup_Fullscreen); +#endif + } + } +} + +void CGameNetworkManager::AddLocalPlayerFailed(int idx, bool serverFull/* = false*/) +{ + Minecraft::GetInstance()->connectionDisconnected(idx, serverFull ? DisconnectPacket::eDisconnect_ServerFull : DisconnectPacket::eDisconnect_ConnectionCreationFailed); +} + +#if defined __PS3__ || defined __PSVITA__ || defined __ORBIS__ +void CGameNetworkManager::HandleDisconnect(bool bLostRoomOnly,bool bPSNSignout) +#else +void CGameNetworkManager::HandleDisconnect(bool bLostRoomOnly) +#endif +{ + int iPrimaryPlayer = g_NetworkManager.GetPrimaryPad(); + + if((g_NetworkManager.GetLockedProfile()!=-1) && iPrimaryPlayer!=-1 && g_NetworkManager.IsInSession() ) + { + m_bLastDisconnectWasLostRoomOnly = bLostRoomOnly; +#if defined __PS3__ || defined __PSVITA__ || defined __ORBIS__ + m_bSignedOutofPSN=bPSNSignout; +#endif + app.SetAction(iPrimaryPlayer,eAppAction_EthernetDisconnected); + } + else + { + m_bLastDisconnectWasLostRoomOnly = false; + } +} + +int CGameNetworkManager::GetPrimaryPad() +{ + return ProfileManager.GetPrimaryPad(); +} + +int CGameNetworkManager::GetLockedProfile() +{ + return ProfileManager.GetLockedProfile(); +} + +bool CGameNetworkManager::IsSignedInLive(int playerIdx) +{ + return ProfileManager.IsSignedInLive(playerIdx); +} + +bool CGameNetworkManager::AllowedToPlayMultiplayer(int playerIdx) +{ + return ProfileManager.AllowedToPlayMultiplayer(playerIdx); +} + +char *CGameNetworkManager::GetOnlineName(int playerIdx) +{ + return ProfileManager.GetGamertag(playerIdx); +} + +void CGameNetworkManager::ServerReadyCreate(bool create) +{ + m_hServerReadyEvent = ( create ? ( new C4JThread::Event ) : NULL ); +} + +void CGameNetworkManager::ServerReady() +{ + m_hServerReadyEvent->Set(); +} + +void CGameNetworkManager::ServerReadyWait() +{ + m_hServerReadyEvent->WaitForSignal(INFINITE); +} + +void CGameNetworkManager::ServerReadyDestroy() +{ + delete m_hServerReadyEvent; + m_hServerReadyEvent = NULL; +} + +bool CGameNetworkManager::ServerReadyValid() +{ + return ( m_hServerReadyEvent != NULL ); +} + +void CGameNetworkManager::ServerStoppedCreate(bool create) +{ + m_hServerStoppedEvent = ( create ? ( new C4JThread::Event ) : NULL ); +} + +void CGameNetworkManager::ServerStopped() +{ + m_hServerStoppedEvent->Set(); +} + +void CGameNetworkManager::ServerStoppedWait() +{ + // If this is called from the main thread, then this won't be ticking anything which can mean that the storage manager state can't progress. + // This means that the server thread we are waiting on won't ever finish, as it might be locked waiting for this to complete itself. + // Do some ticking here then if this is the case. + if( C4JThread::isMainThread() ) + { + int result = WAIT_TIMEOUT; + do + { +#ifndef _XBOX + RenderManager.StartFrame(); +#endif + result = m_hServerStoppedEvent->WaitForSignal(20); + // Tick some simple things + ProfileManager.Tick(); + StorageManager.Tick(); + InputManager.Tick(); + RenderManager.Tick(); + ui.tick(); + ui.render(); + RenderManager.Present(); + } while( result == WAIT_TIMEOUT ); + } + else + { + m_hServerStoppedEvent->WaitForSignal(INFINITE); + } +} + +void CGameNetworkManager::ServerStoppedDestroy() +{ + delete m_hServerStoppedEvent; + m_hServerStoppedEvent = NULL; +} + +bool CGameNetworkManager::ServerStoppedValid() +{ + return ( m_hServerStoppedEvent != NULL ); +} + +int CGameNetworkManager::GetJoiningReadyPercentage() +{ + return s_pPlatformNetworkManager->GetJoiningReadyPercentage(); +} + +#ifndef _XBOX +void CGameNetworkManager::FakeLocalPlayerJoined() +{ + s_pPlatformNetworkManager->FakeLocalPlayerJoined(); +} +#endif + +#ifdef __PSVITA__ +bool CGameNetworkManager::usingAdhocMode() +{ + return ((CPlatformNetworkManagerSony*)s_pPlatformNetworkManager)->usingAdhocMode(); +} + +void CGameNetworkManager::setAdhocMode(bool bAdhoc) +{ + ((CPlatformNetworkManagerSony*)s_pPlatformNetworkManager)->setAdhocMode(bAdhoc); +} + +void CGameNetworkManager::startAdhocMatching() +{ + ((CPlatformNetworkManagerSony*)s_pPlatformNetworkManager)->startAdhocMatching(); +} + +#endif diff --git a/Minecraft.Client/Common/Network/GameNetworkManager.h b/Minecraft.Client/Common/Network/GameNetworkManager.h new file mode 100644 index 00000000..01db2724 --- /dev/null +++ b/Minecraft.Client/Common/Network/GameNetworkManager.h @@ -0,0 +1,237 @@ +#pragma once +using namespace std; +#include +#include +#include "..\..\..\Minecraft.World\C4JThread.h" +#include "NetworkPlayerInterface.h" +#ifdef _XBOX +#include "..\..\Xbox\Network\PlatformNetworkManagerXbox.h" +#elif defined __PS3__ || defined __ORBIS__ || defined __PSVITA__ +#include "..\..\Common\Network\Sony\PlatformNetworkManagerSony.h" +#elif defined _DURANGO +#include "..\..\Durango\Network\PlatformNetworkManagerDurango.h" +#else +#include "PlatformNetworkManagerStub.h" +#endif +#include "SessionInfo.h" + +#ifdef __ORBIS__ +#include "..\..\Orbis\Network\PsPlusUpsellWrapper_Orbis.h" +#endif + +class ClientConnection; +class Minecraft; + +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 +// provide this functionality. + +class CGameNetworkManager +{ +#ifdef _XBOX + friend class CPlatformNetworkManagerXbox; +#elif defined __PS3__ || defined __ORBIS__ || defined __PSVITA__ + friend class CPlatformNetworkManagerSony; +#elif defined _DURANGO + friend class CPlatformNetworkManagerDurango; +#else + friend class CPlatformNetworkManagerStub; +#endif +public: + CGameNetworkManager(); + // Misc high level flow + + typedef enum + { + JOINGAME_SUCCESS, + JOINGAME_FAIL_GENERAL, + JOINGAME_FAIL_SERVER_FULL + } eJoinGameResult; + + void Initialise(); + void Terminate(); + void DoWork(); + bool _RunNetworkGame(LPVOID lpParameter); + bool StartNetworkGame(Minecraft *minecraft, LPVOID lpParameter); + int CorrectErrorIDS(int IDS); + + // Player management + + static int GetLocalPlayerMask(int playerIndex); + int GetPlayerCount(); + int GetOnlinePlayerCount(); + bool AddLocalPlayerByUserIndex( int userIndex ); + bool RemoveLocalPlayerByUserIndex( int userIndex ); + INetworkPlayer *GetLocalPlayerByUserIndex(int userIndex ); + INetworkPlayer *GetPlayerByIndex(int playerIndex); + INetworkPlayer *GetPlayerByXuid(PlayerUID xuid); + INetworkPlayer *GetPlayerBySmallId(unsigned char smallId); + wstring GetDisplayNameByGamertag(wstring gamertag); + INetworkPlayer *GetHostPlayer(); + void RegisterPlayerChangedCallback(int iPad, void (*callback)(void *callbackParam, INetworkPlayer *pPlayer, bool leaving), void *callbackParam); + void UnRegisterPlayerChangedCallback(int iPad, void (*callback)(void *callbackParam, INetworkPlayer *pPlayer, bool leaving), void *callbackParam); + void HandleSignInChange(); + bool ShouldMessageForFullSession(); + + // State management + + bool IsInSession(); + bool IsInGameplay(); + bool IsLeavingGame(); + bool IsReadyToPlayOrIdle(); + + // Hosting and game type + + bool SetLocalGame(bool isLocal); + bool IsLocalGame(); + void SetPrivateGame(bool isPrivate); + bool IsPrivateGame(); + void HostGame(int localUsersMask, bool bOnlineGame, bool bIsPrivate, unsigned char publicSlots = MINECRAFT_NET_MAX_PLAYERS, unsigned char privateSlots = 0); + bool IsHost(); + bool IsInStatsEnabledSession(); + + // Client session discovery + + bool SessionHasSpace(unsigned int spaceRequired = 1); + vector *GetSessionList(int iPad, int localPlayers, bool partyOnly); + bool GetGameSessionInfo(int iPad, SessionID sessionId,FriendSessionInfo *foundSession); + void SetSessionsUpdatedCallback( void (*SessionsUpdatedCallback)(LPVOID pParam), LPVOID pSearchParam ); + void GetFullFriendSessionInfo( FriendSessionInfo *foundSession, void (* FriendSessionUpdatedFn)(bool success, void *pParam), void *pParam ); + void ForceFriendsSessionRefresh(); + + // Session joining and leaving + + bool JoinGameFromInviteInfo( int userIndex, int userMask, const INVITE_INFO *pInviteInfo); + eJoinGameResult JoinGame(FriendSessionInfo *searchResult, int localUsersMask); + static void CancelJoinGame(LPVOID lpParam); // Not part of the shared interface + bool LeaveGame(bool bMigrateHost); + static int JoinFromInvite_SignInReturned(void *pParam,bool bContinue, int iPad); + void UpdateAndSetGameSessionData(INetworkPlayer *pNetworkPlayerLeaving = NULL); + void SendInviteGUI(int iPad); + void ResetLeavingGame(); + + // Threads + + bool IsNetworkThreadRunning(); + static int RunNetworkGameThreadProc( void* lpParameter ); + static int ServerThreadProc( void* lpParameter ); + static int ExitAndJoinFromInviteThreadProc( void* lpParam ); + +#if (defined __PS3__) || (defined __ORBIS__) || (defined __PSVITA__) + static int MustSignInReturned_0(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int PSNSignInReturned_0(void* pParam, bool bContinue, int iPad); + + static int MustSignInReturned_1(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int PSNSignInReturned_1(void* pParam, bool bContinue, int iPad); +#endif + + static void _LeaveGame(); + static int ChangeSessionTypeThreadProc( void* lpParam ); + + // System flags + + void SystemFlagSet(INetworkPlayer *pNetworkPlayer, int index); + bool SystemFlagGet(INetworkPlayer *pNetworkPlayer, int index); + + // Events + + void ServerReadyCreate(bool create); // Create the signal (or set to NULL) + void ServerReady(); // Signal that we are ready + void ServerReadyWait(); // Wait for the signal + void ServerReadyDestroy(); // Destroy signal + bool ServerReadyValid(); // Is non-NULL + + void ServerStoppedCreate(bool create); // Create the signal + void ServerStopped(); // Signal that we are ready + void ServerStoppedWait(); // Wait for the signal + void ServerStoppedDestroy(); // Destroy signal + bool ServerStoppedValid(); // Is non-NULL + +#ifdef __PSVITA__ + static bool usingAdhocMode(); + static void setAdhocMode(bool bAdhoc); + static void startAdhocMatching(); +#endif + // Debug output + + wstring GatherStats(); + void renderQueueMeter(); + wstring GatherRTTStats(); + + // GUI debug output + + // Used for debugging output + static const int messageQueue_length = 512; + static __int64 messageQueue[messageQueue_length]; + static const int byteQueue_length = 512; + static __int64 byteQueue[byteQueue_length]; + static int messageQueuePos; + + // Methods called from PlatformNetworkManager +private: + void StateChange_AnyToHosting(); + void StateChange_AnyToJoining(); + void StateChange_JoiningToIdle(CPlatformNetworkManager::eJoinFailedReason reason); + void StateChange_AnyToStarting(); + void StateChange_AnyToEnding(bool bStateWasPlaying); + void StateChange_AnyToIdle(); + void CreateSocket( INetworkPlayer *pNetworkPlayer, bool localPlayer ); + void CloseConnection( INetworkPlayer *pNetworkPlayer ); + void PlayerJoining( INetworkPlayer *pNetworkPlayer ); + void PlayerLeaving( INetworkPlayer *pNetworkPlayer ); + void HostChanged(); + void WriteStats( INetworkPlayer *pNetworkPlayer ); + void GameInviteReceived( int userIndex, const INVITE_INFO *pInviteInfo); + void HandleInviteWhenInMenus( int userIndex, const INVITE_INFO *pInviteInfo); + void AddLocalPlayerFailed(int idx, bool serverFull = false); +#if defined __PS3__ || defined __PSVITA__ || defined __ORBIS__ + void HandleDisconnect(bool bLostRoomOnly,bool bPSNSignOut); +#else + void HandleDisconnect(bool bLostRoomOnly); +#endif + + int GetPrimaryPad(); + int GetLockedProfile(); + bool IsSignedInLive(int playerIdx); + bool AllowedToPlayMultiplayer(int playerIdx); + char *GetOnlineName(int playerIdx); + + C4JThread::Event* m_hServerStoppedEvent; + C4JThread::Event* m_hServerReadyEvent; + bool m_bInitialised; + +#ifdef _XBOX_ONE +public: + void SetFullSessionMessageOnNextSessionChange() { m_bFullSessionMessageOnNextSessionChange = true; } +#endif +private: + float m_lastPlayerEventTimeStart; // For telemetry + static CPlatformNetworkManager *s_pPlatformNetworkManager; + bool m_bNetworkThreadRunning; + int GetJoiningReadyPercentage(); + bool m_bLastDisconnectWasLostRoomOnly; + bool m_bFullSessionMessageOnNextSessionChange; +#if defined __PS3__ || defined __PSVITA__ || defined __ORBIS__ + bool m_bSignedOutofPSN; +#endif + +#ifdef __ORBIS__ + PsPlusUpsellWrapper *m_pUpsell; + INVITE_INFO *m_pInviteInfo; + int m_iPlayerInvited; +#endif + +public: +#ifndef _XBOX + void FakeLocalPlayerJoined(); // Temporary method whilst we don't have real networking to make this happen +#endif +}; + +extern CGameNetworkManager g_NetworkManager; + +#ifdef __PS3__ +#undef __in +#define __out +#endif diff --git a/Minecraft.Client/Common/Network/NetworkPlayerInterface.h b/Minecraft.Client/Common/Network/NetworkPlayerInterface.h new file mode 100644 index 00000000..d26252da --- /dev/null +++ b/Minecraft.Client/Common/Network/NetworkPlayerInterface.h @@ -0,0 +1,34 @@ +#pragma once + +class Socket; + +// This is the platform independent interface for dealing with players within a network game. This should be used directly by game code (and GameNetworkManager) rather than the platform-specific implementations. + +class INetworkPlayer +{ +public: + virtual ~INetworkPlayer() {} + virtual unsigned char GetSmallId() = 0; + virtual void SendData(INetworkPlayer *player, const void *pvData, int dataSize, bool lowPriority, 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; + virtual bool IsHost() = 0; + virtual bool IsGuest() = 0; + virtual bool IsLocal() = 0; + virtual int GetSessionIndex() = 0; + virtual bool IsTalking() = 0; + virtual bool IsMutedByLocalUser(int userIndex) = 0; + virtual bool HasVoice() = 0; + virtual bool HasCamera() = 0; + virtual int GetUserIndex() = 0; + virtual void SetSocket(Socket *pSocket) = 0; + virtual Socket *GetSocket() = 0; + virtual const wchar_t *GetOnlineName() = 0; + virtual wstring GetDisplayName() = 0; + virtual PlayerUID GetUID() = 0; + virtual void SentChunkPacket() = 0; + virtual int GetTimeSinceLastChunkPacket_ms() = 0; +}; diff --git a/Minecraft.Client/Common/Network/PlatformNetworkManagerInterface.h b/Minecraft.Client/Common/Network/PlatformNetworkManagerInterface.h new file mode 100644 index 00000000..901e59e7 --- /dev/null +++ b/Minecraft.Client/Common/Network/PlatformNetworkManagerInterface.h @@ -0,0 +1,126 @@ +#pragma once +using namespace std; +#include +#include +#include "..\..\..\Minecraft.World\C4JThread.h" +#include "NetworkPlayerInterface.h" +#include "SessionInfo.h" + +class ClientConnection; +class Minecraft; +class CGameNetworkManager; + +// This is the interface to be implemented by the platform-specific versions of the PlatformNetworkManagers. This API is used directly by GameNetworkManager so that +// it can remain as platform independent as possible. + +// This value should be incremented if the server version changes, or the game session data changes +#define MINECRAFT_NET_VERSION VER_NETWORK + + +typedef struct _SearchForGamesData +{ + DWORD sessionIDCount; + XSESSION_SEARCHRESULT_HEADER *searchBuffer; + XNQOS **ppQos; + SessionID *sessionIDList; + XOVERLAPPED *pOverlapped; +} SearchForGamesData; + +class CPlatformNetworkManager +{ + friend class CGameNetworkManager; +public: + + typedef enum + { + JOIN_FAILED_SERVER_FULL, + JOIN_FAILED_INSUFFICIENT_PRIVILEGES, + JOIN_FAILED_NONSPECIFIC, + } eJoinFailedReason; + + virtual bool Initialise(CGameNetworkManager *pGameNetworkManager, int flagIndexSize) = 0; + virtual void Terminate() = 0; + virtual int GetJoiningReadyPercentage() = 0; + virtual int CorrectErrorIDS(int IDS) = 0; + + virtual void DoWork() = 0; + virtual int GetPlayerCount() = 0; + virtual int GetOnlinePlayerCount() = 0; + virtual int GetLocalPlayerMask(int playerIndex) = 0; + virtual bool AddLocalPlayerByUserIndex( int userIndex ) = 0; + virtual bool RemoveLocalPlayerByUserIndex( int userIndex ) = 0; + virtual INetworkPlayer *GetLocalPlayerByUserIndex( int userIndex ) = 0; + virtual INetworkPlayer *GetPlayerByIndex(int playerIndex) = 0; + virtual INetworkPlayer * GetPlayerByXuid(PlayerUID xuid) = 0; + virtual INetworkPlayer * GetPlayerBySmallId(unsigned char smallId) = 0; + virtual bool ShouldMessageForFullSession() = 0; + + virtual INetworkPlayer *GetHostPlayer() = 0; + virtual bool IsHost() = 0; + virtual bool JoinGameFromInviteInfo( int userIndex, int userMask, const INVITE_INFO *pInviteInfo) = 0; + virtual bool LeaveGame(bool bMigrateHost) = 0; + + virtual bool IsInSession() = 0; + virtual bool IsInGameplay() = 0; + virtual bool IsReadyToPlayOrIdle() = 0; + virtual bool IsInStatsEnabledSession() = 0; + virtual bool SessionHasSpace(unsigned int spaceRequired = 1) = 0; + virtual void SendInviteGUI(int quadrant) = 0; + virtual bool IsAddingPlayer() = 0; + + virtual void HostGame(int localUsersMask, bool bOnlineGame, bool bIsPrivate, unsigned char publicSlots = MINECRAFT_NET_MAX_PLAYERS, unsigned char privateSlots = 0) = 0; + virtual int JoinGame(FriendSessionInfo *searchResult, int dwLocalUsersMask, int dwPrimaryUserIndex ) = 0; + virtual void CancelJoinGame() {}; + virtual bool SetLocalGame(bool isLocal) = 0; + virtual bool IsLocalGame() = 0; + virtual void SetPrivateGame(bool isPrivate) = 0; + virtual bool IsPrivateGame() = 0; + virtual bool IsLeavingGame() = 0; + virtual void ResetLeavingGame() = 0; + + virtual void RegisterPlayerChangedCallback(int iPad, void (*callback)(void *callbackParam, INetworkPlayer *pPlayer, bool leaving), void *callbackParam) = 0; + virtual void UnRegisterPlayerChangedCallback(int iPad, void (*callback)(void *callbackParam, INetworkPlayer *pPlayer, bool leaving), void *callbackParam) = 0; + + virtual void HandleSignInChange() = 0; + + virtual bool _RunNetworkGame() = 0; + +private: + virtual bool _LeaveGame(bool bMigrateHost, bool bLeaveRoom) = 0; + virtual void _HostGame(int usersMask, unsigned char publicSlots = MINECRAFT_NET_MAX_PLAYERS, unsigned char privateSlots = 0) = 0; + virtual bool _StartGame() = 0; + + +public: + virtual void UpdateAndSetGameSessionData(INetworkPlayer *pNetworkPlayerLeaving = NULL) = 0; + +private: + virtual bool RemoveLocalPlayer( INetworkPlayer *pNetworkPlayer ) = 0; + +public: + virtual void SystemFlagSet(INetworkPlayer *pNetworkPlayer, int index) = 0; + virtual bool SystemFlagGet(INetworkPlayer *pNetworkPlayer, int index) = 0; + + virtual wstring GatherStats() = 0; + virtual wstring GatherRTTStats() = 0; + +private: + virtual void SetSessionTexturePackParentId( int id ) = 0; + virtual void SetSessionSubTexturePackId( int id ) = 0; + virtual void Notify(int ID, ULONG_PTR Param) = 0; + +public: + virtual vector *GetSessionList(int iPad, int localPlayers, bool partyOnly) = 0; + virtual bool GetGameSessionInfo(int iPad, SessionID sessionId,FriendSessionInfo *foundSession) = 0; + virtual void SetSessionsUpdatedCallback( void (*SessionsUpdatedCallback)(LPVOID pParam), LPVOID pSearchParam ) = 0; + virtual void GetFullFriendSessionInfo( FriendSessionInfo *foundSession, void (* FriendSessionUpdatedFn)(bool success, void *pParam), void *pParam ) = 0; + virtual void ForceFriendsSessionRefresh() = 0; + +#ifndef _XBOX + virtual void FakeLocalPlayerJoined() {}; // Temporary method whilst we don't have real networking to make this happen +#endif + +#ifdef _DURANGO + virtual wstring GetDisplayNameByGamertag(wstring gamertag) = 0; +#endif +}; diff --git a/Minecraft.Client/Common/Network/PlatformNetworkManagerStub.cpp b/Minecraft.Client/Common/Network/PlatformNetworkManagerStub.cpp new file mode 100644 index 00000000..be1bf71e --- /dev/null +++ b/Minecraft.Client/Common/Network/PlatformNetworkManagerStub.cpp @@ -0,0 +1,646 @@ +#include "stdafx.h" +#include "..\..\..\Minecraft.World\Socket.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "PlatformNetworkManagerStub.h" +#include "..\..\Xbox\Network\NetworkPlayerXbox.h" // TODO - stub version of this? + +CPlatformNetworkManagerStub *g_pPlatformNetworkManager; + + +void CPlatformNetworkManagerStub::NotifyPlayerJoined(IQNetPlayer *pQNetPlayer ) +{ + const char * pszDescription; + + // 4J Stu - We create a fake socket for every where that we need an INBOUND queue of game data. Outbound + // is all handled by QNet so we don't need that. Therefore each client player has one, and the host has one + // for each client player. + bool createFakeSocket = false; + bool localPlayer = false; + + NetworkPlayerXbox *networkPlayer = (NetworkPlayerXbox *)addNetworkPlayer(pQNetPlayer); + + if( pQNetPlayer->IsLocal() ) + { + localPlayer = true; + if( pQNetPlayer->IsHost() ) + { + pszDescription = "local host"; + // 4J Stu - No socket for the localhost as it uses a special loopback queue + + m_machineQNetPrimaryPlayers.push_back( pQNetPlayer ); + } + else + { + pszDescription = "local"; + + // We need an inbound queue on all local players to receive data from the host + createFakeSocket = true; + } + } + else + { + if( pQNetPlayer->IsHost() ) + { + pszDescription = "remote host"; + } + else + { + pszDescription = "remote"; + + // If we are the host, then create a fake socket for every remote player + if( m_pIQNet->IsHost() ) + { + createFakeSocket = true; + } + } + + if( m_pIQNet->IsHost() && !m_bHostChanged ) + { + // Do we already have a primary player for this system? + bool systemHasPrimaryPlayer = false; + for(AUTO_VAR(it, m_machineQNetPrimaryPlayers.begin()); it < m_machineQNetPrimaryPlayers.end(); ++it) + { + IQNetPlayer *pQNetPrimaryPlayer = *it; + if( pQNetPlayer->IsSameSystem(pQNetPrimaryPlayer) ) + { + systemHasPrimaryPlayer = true; + break; + } + } + if( !systemHasPrimaryPlayer ) + m_machineQNetPrimaryPlayers.push_back( pQNetPlayer ); + } + } + g_NetworkManager.PlayerJoining( networkPlayer ); + + if( createFakeSocket == true && !m_bHostChanged ) + { + g_NetworkManager.CreateSocket( networkPlayer, localPlayer ); + } + + app.DebugPrintf( "Player 0x%p \"%ls\" joined; %s; voice %i; camera %i.\n", + pQNetPlayer, + pQNetPlayer->GetGamertag(), + pszDescription, + (int) pQNetPlayer->HasVoice(), + (int) pQNetPlayer->HasCamera() ); + + + if( m_pIQNet->IsHost() ) + { + // 4J-PB - only the host should do this +// g_NetworkManager.UpdateAndSetGameSessionData(); + SystemFlagAddPlayer( networkPlayer ); + } + + for( int idx = 0; idx < XUSER_MAX_COUNT; ++idx) + { + if(playerChangedCallback[idx] != NULL) + playerChangedCallback[idx]( playerChangedCallbackParam[idx], networkPlayer, false ); + } + + if(m_pIQNet->GetState() == QNET_STATE_GAME_PLAY) + { + int localPlayerCount = 0; + for(unsigned int idx = 0; idx < XUSER_MAX_COUNT; ++idx) + { + if( m_pIQNet->GetLocalPlayerByUserIndex(idx) != NULL ) ++localPlayerCount; + } + + float appTime = app.getAppTime(); + + // Only record stats for the primary player here + m_lastPlayerEventTimeStart = appTime; + } +} + +bool CPlatformNetworkManagerStub::Initialise(CGameNetworkManager *pGameNetworkManager, int flagIndexSize) +{ + m_pGameNetworkManager = pGameNetworkManager; + m_flagIndexSize = flagIndexSize; + g_pPlatformNetworkManager = this; + for( int i = 0; i < XUSER_MAX_COUNT; i++ ) + { + playerChangedCallback[ i ] = NULL; + } + + m_bLeavingGame = false; + m_bLeaveGameOnTick = false; + m_bHostChanged = false; + + m_bSearchResultsReady = false; + m_bSearchPending = false; + + m_bIsOfflineGame = false; + m_pSearchParam = NULL; + m_SessionsUpdatedCallback = NULL; + + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + m_searchResultsCount[i] = 0; + m_lastSearchStartTime[i] = 0; + + // The results that will be filled in with the current search + m_pSearchResults[i] = NULL; + m_pQoSResult[i] = NULL; + m_pCurrentSearchResults[i] = NULL; + m_pCurrentQoSResult[i] = NULL; + m_currentSearchResultsCount[i] = 0; + } + + // Success! + return true; +} + +void CPlatformNetworkManagerStub::Terminate() +{ +} + +int CPlatformNetworkManagerStub::GetJoiningReadyPercentage() +{ + return 100; +} + +int CPlatformNetworkManagerStub::CorrectErrorIDS(int IDS) +{ + return IDS; +} + +bool CPlatformNetworkManagerStub::isSystemPrimaryPlayer(IQNetPlayer *pQNetPlayer) +{ + return true; +} + +// We call this twice a frame, either side of the render call so is a good place to "tick" things +void CPlatformNetworkManagerStub::DoWork() +{ +} + +int CPlatformNetworkManagerStub::GetPlayerCount() +{ + return m_pIQNet->GetPlayerCount(); +} + +bool CPlatformNetworkManagerStub::ShouldMessageForFullSession() +{ + return false; +} + +int CPlatformNetworkManagerStub::GetOnlinePlayerCount() +{ + return 1; +} + +int CPlatformNetworkManagerStub::GetLocalPlayerMask(int playerIndex) +{ + return 1 << playerIndex; +} + +bool CPlatformNetworkManagerStub::AddLocalPlayerByUserIndex( int userIndex ) +{ + NotifyPlayerJoined(m_pIQNet->GetLocalPlayerByUserIndex(userIndex)); + return ( m_pIQNet->AddLocalPlayerByUserIndex(userIndex) == S_OK ); +} + +bool CPlatformNetworkManagerStub::RemoveLocalPlayerByUserIndex( int userIndex ) +{ + return true; +} + +bool CPlatformNetworkManagerStub::IsInStatsEnabledSession() +{ + return true; +} + +bool CPlatformNetworkManagerStub::SessionHasSpace(unsigned int spaceRequired /*= 1*/) +{ + return true; +} + +void CPlatformNetworkManagerStub::SendInviteGUI(int quadrant) +{ +} + +bool CPlatformNetworkManagerStub::IsAddingPlayer() +{ + return false; +} + +bool CPlatformNetworkManagerStub::LeaveGame(bool bMigrateHost) +{ + if( m_bLeavingGame ) return true; + + m_bLeavingGame = true; + + // If we are the host wait for the game server to end + if(m_pIQNet->IsHost() && g_NetworkManager.ServerStoppedValid()) + { + m_pIQNet->EndGame(); + g_NetworkManager.ServerStoppedWait(); + g_NetworkManager.ServerStoppedDestroy(); + } + return true; +} + +bool CPlatformNetworkManagerStub::_LeaveGame(bool bMigrateHost, bool bLeaveRoom) +{ + return true; +} + +void CPlatformNetworkManagerStub::HostGame(int localUsersMask, bool bOnlineGame, bool bIsPrivate, unsigned char publicSlots /*= MINECRAFT_NET_MAX_PLAYERS*/, unsigned char privateSlots /*= 0*/) +{ +// #ifdef _XBOX + // 4J Stu - We probably did this earlier as well, but just to be sure! + SetLocalGame( !bOnlineGame ); + SetPrivateGame( bIsPrivate ); + SystemFlagReset(); + + // Make sure that the Primary Pad is in by default + localUsersMask |= GetLocalPlayerMask( g_NetworkManager.GetPrimaryPad() ); + + m_bLeavingGame = false; + + m_pIQNet->HostGame(); + + _HostGame( localUsersMask, publicSlots, privateSlots ); +//#endif +} + +void CPlatformNetworkManagerStub::_HostGame(int usersMask, unsigned char publicSlots /*= MINECRAFT_NET_MAX_PLAYERS*/, unsigned char privateSlots /*= 0*/) +{ +} + +bool CPlatformNetworkManagerStub::_StartGame() +{ + return true; +} + +int CPlatformNetworkManagerStub::JoinGame(FriendSessionInfo *searchResult, int localUsersMask, int primaryUserIndex) +{ + return CGameNetworkManager::JOINGAME_SUCCESS; +} + +bool CPlatformNetworkManagerStub::SetLocalGame(bool isLocal) +{ + m_bIsOfflineGame = isLocal; + + return true; +} + +void CPlatformNetworkManagerStub::SetPrivateGame(bool isPrivate) +{ + app.DebugPrintf("Setting as private game: %s\n", isPrivate ? "yes" : "no" ); + m_bIsPrivateGame = isPrivate; +} + +void CPlatformNetworkManagerStub::RegisterPlayerChangedCallback(int iPad, void (*callback)(void *callbackParam, INetworkPlayer *pPlayer, bool leaving), void *callbackParam) +{ + playerChangedCallback[iPad] = callback; + playerChangedCallbackParam[iPad] = callbackParam; +} + +void CPlatformNetworkManagerStub::UnRegisterPlayerChangedCallback(int iPad, void (*callback)(void *callbackParam, INetworkPlayer *pPlayer, bool leaving), void *callbackParam) +{ + if(playerChangedCallbackParam[iPad] == callbackParam) + { + playerChangedCallback[iPad] = NULL; + playerChangedCallbackParam[iPad] = NULL; + } +} + +void CPlatformNetworkManagerStub::HandleSignInChange() +{ + return; +} + +bool CPlatformNetworkManagerStub::_RunNetworkGame() +{ + return true; +} + +void CPlatformNetworkManagerStub::UpdateAndSetGameSessionData(INetworkPlayer *pNetworkPlayerLeaving /*= NULL*/) +{ +// DWORD playerCount = m_pIQNet->GetPlayerCount(); +// +// if( this->m_bLeavingGame ) +// return; +// +// if( GetHostPlayer() == NULL ) +// return; +// +// for(unsigned int i = 0; i < MINECRAFT_NET_MAX_PLAYERS; ++i) +// { +// if( i < playerCount ) +// { +// INetworkPlayer *pNetworkPlayer = GetPlayerByIndex(i); +// +// // We can call this from NotifyPlayerLeaving but at that point the player is still considered in the session +// if( pNetworkPlayer != pNetworkPlayerLeaving ) +// { +// m_hostGameSessionData.players[i] = ((NetworkPlayerXbox *)pNetworkPlayer)->GetUID(); +// +// char *temp; +// temp = (char *)wstringtofilename( pNetworkPlayer->GetOnlineName() ); +// memcpy(m_hostGameSessionData.szPlayers[i],temp,XUSER_NAME_SIZE); +// } +// else +// { +// m_hostGameSessionData.players[i] = NULL; +// memset(m_hostGameSessionData.szPlayers[i],0,XUSER_NAME_SIZE); +// } +// } +// else +// { +// m_hostGameSessionData.players[i] = NULL; +// memset(m_hostGameSessionData.szPlayers[i],0,XUSER_NAME_SIZE); +// } +// } +// +// m_hostGameSessionData.hostPlayerUID = ((NetworkPlayerXbox *)GetHostPlayer())->GetQNetPlayer()->GetXuid(); +// m_hostGameSessionData.m_uiGameHostSettings = app.GetGameHostOption(eGameHostOption_All); +} + +int CPlatformNetworkManagerStub::RemovePlayerOnSocketClosedThreadProc( void* lpParam ) +{ + INetworkPlayer *pNetworkPlayer = (INetworkPlayer *)lpParam; + + Socket *socket = pNetworkPlayer->GetSocket(); + + if( socket != NULL ) + { + //printf("Waiting for socket closed event\n"); + socket->m_socketClosedEvent->WaitForSignal(INFINITE); + + //printf("Socket closed event has fired\n"); + // 4J Stu - Clear our reference to this socket + pNetworkPlayer->SetSocket( NULL ); + delete socket; + } + + return g_pPlatformNetworkManager->RemoveLocalPlayer( pNetworkPlayer ); +} + +bool CPlatformNetworkManagerStub::RemoveLocalPlayer( INetworkPlayer *pNetworkPlayer ) +{ + return true; +} + +CPlatformNetworkManagerStub::PlayerFlags::PlayerFlags(INetworkPlayer *pNetworkPlayer, unsigned int count) +{ + // 4J Stu - Don't assert, just make it a multiple of 8! This count is calculated from a load of separate values, + // and makes tweaking world/render sizes a pain if we hit an assert here + count = (count + 8 - 1) & ~(8 - 1); + //assert( ( count % 8 ) == 0 ); + this->m_pNetworkPlayer = pNetworkPlayer; + this->flags = new unsigned char [ count / 8 ]; + memset( this->flags, 0, count / 8 ); + this->count = count; +} +CPlatformNetworkManagerStub::PlayerFlags::~PlayerFlags() +{ + delete [] flags; +} + +// Add a player to the per system flag storage - if we've already got a player from that system, copy its flags over +void CPlatformNetworkManagerStub::SystemFlagAddPlayer(INetworkPlayer *pNetworkPlayer) +{ + PlayerFlags *newPlayerFlags = new PlayerFlags( pNetworkPlayer, m_flagIndexSize); + // If any of our existing players are on the same system, then copy over flags from that one + for( unsigned int i = 0; i < m_playerFlags.size(); i++ ) + { + if( pNetworkPlayer->IsSameSystem(m_playerFlags[i]->m_pNetworkPlayer) ) + { + memcpy( newPlayerFlags->flags, m_playerFlags[i]->flags, m_playerFlags[i]->count / 8 ); + break; + } + } + m_playerFlags.push_back(newPlayerFlags); +} + +// Remove a player from the per system flag storage - just maintains the m_playerFlags vector without any gaps in it +void CPlatformNetworkManagerStub::SystemFlagRemovePlayer(INetworkPlayer *pNetworkPlayer) +{ + for( unsigned int i = 0; i < m_playerFlags.size(); i++ ) + { + if( m_playerFlags[i]->m_pNetworkPlayer == pNetworkPlayer ) + { + delete m_playerFlags[i]; + m_playerFlags[i] = m_playerFlags.back(); + m_playerFlags.pop_back(); + return; + } + } +} + +void CPlatformNetworkManagerStub::SystemFlagReset() +{ + for( unsigned int i = 0; i < m_playerFlags.size(); i++ ) + { + delete m_playerFlags[i]; + } + m_playerFlags.clear(); +} + +// Set a per system flag - this is done by setting the flag on every player that shares that system +void CPlatformNetworkManagerStub::SystemFlagSet(INetworkPlayer *pNetworkPlayer, int index) +{ + if( ( index < 0 ) || ( index >= m_flagIndexSize ) ) return; + if( pNetworkPlayer == NULL ) return; + + for( unsigned int i = 0; i < m_playerFlags.size(); i++ ) + { + if( pNetworkPlayer->IsSameSystem(m_playerFlags[i]->m_pNetworkPlayer) ) + { + m_playerFlags[i]->flags[ index / 8 ] |= ( 128 >> ( index % 8 ) ); + } + } +} + +// Get value of a per system flag - can be read from the flags of the passed in player as anything else sent to that +// system should also have been duplicated here +bool CPlatformNetworkManagerStub::SystemFlagGet(INetworkPlayer *pNetworkPlayer, int index) +{ + if( ( index < 0 ) || ( index >= m_flagIndexSize ) ) return false; + if( pNetworkPlayer == NULL ) + { + return false; + } + + for( unsigned int i = 0; i < m_playerFlags.size(); i++ ) + { + if( m_playerFlags[i]->m_pNetworkPlayer == pNetworkPlayer ) + { + return ( ( m_playerFlags[i]->flags[ index / 8 ] & ( 128 >> ( index % 8 ) ) ) != 0 ); + } + } + return false; +} + +wstring CPlatformNetworkManagerStub::GatherStats() +{ + return L""; +} + +wstring CPlatformNetworkManagerStub::GatherRTTStats() +{ + wstring stats(L"Rtt: "); + + wchar_t stat[32]; + + for(unsigned int i = 0; i < GetPlayerCount(); ++i) + { + IQNetPlayer *pQNetPlayer = ((NetworkPlayerXbox *)GetPlayerByIndex( i ))->GetQNetPlayer(); + + if(!pQNetPlayer->IsLocal()) + { + ZeroMemory(stat,32*sizeof(WCHAR)); + swprintf(stat, 32, L"%d: %d/", i, pQNetPlayer->GetCurrentRtt() ); + stats.append(stat); + } + } + return stats; +} + +void CPlatformNetworkManagerStub::TickSearch() +{ +} + +void CPlatformNetworkManagerStub::SearchForGames() +{ +} + +int CPlatformNetworkManagerStub::SearchForGamesThreadProc( void* lpParameter ) +{ + return 0; +} + +void CPlatformNetworkManagerStub::SetSearchResultsReady(int resultCount) +{ + m_bSearchResultsReady = true; + m_searchResultsCount[m_lastSearchPad] = resultCount; +} + +vector *CPlatformNetworkManagerStub::GetSessionList(int iPad, int localPlayers, bool partyOnly) +{ + vector *filteredList = new vector();; + return filteredList; +} + +bool CPlatformNetworkManagerStub::GetGameSessionInfo(int iPad, SessionID sessionId, FriendSessionInfo *foundSessionInfo) +{ + return false; +} + +void CPlatformNetworkManagerStub::SetSessionsUpdatedCallback( void (*SessionsUpdatedCallback)(LPVOID pParam), LPVOID pSearchParam ) +{ + m_SessionsUpdatedCallback = SessionsUpdatedCallback; m_pSearchParam = pSearchParam; +} + +void CPlatformNetworkManagerStub::GetFullFriendSessionInfo( FriendSessionInfo *foundSession, void (* FriendSessionUpdatedFn)(bool success, void *pParam), void *pParam ) +{ + FriendSessionUpdatedFn(true, pParam); +} + +void CPlatformNetworkManagerStub::ForceFriendsSessionRefresh() +{ + app.DebugPrintf("Resetting friends session search data\n"); + + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + m_searchResultsCount[i] = 0; + m_lastSearchStartTime[i] = 0; + delete m_pSearchResults[i]; + m_pSearchResults[i] = NULL; + } +} + +INetworkPlayer *CPlatformNetworkManagerStub::addNetworkPlayer(IQNetPlayer *pQNetPlayer) +{ + NetworkPlayerXbox *pNetworkPlayer = new NetworkPlayerXbox(pQNetPlayer, NULL); + pQNetPlayer->SetCustomDataValue((ULONG_PTR)pNetworkPlayer); + currentNetworkPlayers.push_back( pNetworkPlayer ); + return pNetworkPlayer; +} + +void CPlatformNetworkManagerStub::removeNetworkPlayer(IQNetPlayer *pQNetPlayer) +{ + INetworkPlayer *pNetworkPlayer = getNetworkPlayer(pQNetPlayer); + for( AUTO_VAR(it, currentNetworkPlayers.begin()); it != currentNetworkPlayers.end(); it++ ) + { + if( *it == pNetworkPlayer ) + { + currentNetworkPlayers.erase(it); + return; + } + } +} + +INetworkPlayer *CPlatformNetworkManagerStub::getNetworkPlayer(IQNetPlayer *pQNetPlayer) +{ + return pQNetPlayer ? (INetworkPlayer *)(pQNetPlayer->GetCustomDataValue()) : NULL; +} + + +INetworkPlayer *CPlatformNetworkManagerStub::GetLocalPlayerByUserIndex(int userIndex ) +{ + return getNetworkPlayer(m_pIQNet->GetLocalPlayerByUserIndex(userIndex)); +} + +INetworkPlayer *CPlatformNetworkManagerStub::GetPlayerByIndex(int playerIndex) +{ + return getNetworkPlayer(m_pIQNet->GetPlayerByIndex(playerIndex)); +} + +INetworkPlayer * CPlatformNetworkManagerStub::GetPlayerByXuid(PlayerUID xuid) +{ + return getNetworkPlayer( m_pIQNet->GetPlayerByXuid(xuid)) ; +} + +INetworkPlayer * CPlatformNetworkManagerStub::GetPlayerBySmallId(unsigned char smallId) +{ + return getNetworkPlayer(m_pIQNet->GetPlayerBySmallId(smallId)); +} + +INetworkPlayer *CPlatformNetworkManagerStub::GetHostPlayer() +{ + return getNetworkPlayer(m_pIQNet->GetHostPlayer()); +} + +bool CPlatformNetworkManagerStub::IsHost() +{ + return m_pIQNet->IsHost() && !m_bHostChanged; +} + +bool CPlatformNetworkManagerStub::JoinGameFromInviteInfo( int userIndex, int userMask, const INVITE_INFO *pInviteInfo) +{ + return ( m_pIQNet->JoinGameFromInviteInfo( userIndex, userMask, pInviteInfo ) == S_OK); +} + +void CPlatformNetworkManagerStub::SetSessionTexturePackParentId( int id ) +{ + m_hostGameSessionData.texturePackParentId = id; +} + +void CPlatformNetworkManagerStub::SetSessionSubTexturePackId( int id ) +{ + m_hostGameSessionData.subTexturePackId = id; +} + +void CPlatformNetworkManagerStub::Notify(int ID, ULONG_PTR Param) +{ +} + +bool CPlatformNetworkManagerStub::IsInSession() +{ + return m_pIQNet->GetState() != QNET_STATE_IDLE; +} + +bool CPlatformNetworkManagerStub::IsInGameplay() +{ + return m_pIQNet->GetState() == QNET_STATE_GAME_PLAY; +} + +bool CPlatformNetworkManagerStub::IsReadyToPlayOrIdle() +{ + return true; +} diff --git a/Minecraft.Client/Common/Network/PlatformNetworkManagerStub.h b/Minecraft.Client/Common/Network/PlatformNetworkManagerStub.h new file mode 100644 index 00000000..f997dece --- /dev/null +++ b/Minecraft.Client/Common/Network/PlatformNetworkManagerStub.h @@ -0,0 +1,170 @@ +#pragma once +using namespace std; +#include +#include "..\..\..\Minecraft.World\C4JThread.h" +#include "NetworkPlayerInterface.h" +#include "PlatformNetworkManagerInterface.h" +#include "SessionInfo.h" + +class CPlatformNetworkManagerStub : public CPlatformNetworkManager +{ + friend class CGameNetworkManager; +public: + virtual bool Initialise(CGameNetworkManager *pGameNetworkManager, int flagIndexSize); + virtual void Terminate(); + virtual int GetJoiningReadyPercentage(); + virtual int CorrectErrorIDS(int IDS); + + virtual void DoWork(); + virtual int GetPlayerCount(); + virtual int GetOnlinePlayerCount(); + virtual int GetLocalPlayerMask(int playerIndex); + virtual bool AddLocalPlayerByUserIndex( int userIndex ); + virtual bool RemoveLocalPlayerByUserIndex( int userIndex ); + virtual INetworkPlayer *GetLocalPlayerByUserIndex( int userIndex ); + virtual INetworkPlayer *GetPlayerByIndex(int playerIndex); + virtual INetworkPlayer * GetPlayerByXuid(PlayerUID xuid); + virtual INetworkPlayer * GetPlayerBySmallId(unsigned char smallId); + virtual bool ShouldMessageForFullSession(); + + virtual INetworkPlayer *GetHostPlayer(); + virtual bool IsHost(); + virtual bool JoinGameFromInviteInfo( int userIndex, int userMask, const INVITE_INFO *pInviteInfo); + virtual bool LeaveGame(bool bMigrateHost); + + virtual bool IsInSession(); + virtual bool IsInGameplay(); + virtual bool IsReadyToPlayOrIdle(); + virtual bool IsInStatsEnabledSession(); + virtual bool SessionHasSpace(unsigned int spaceRequired = 1); + virtual void SendInviteGUI(int quadrant); + virtual bool IsAddingPlayer(); + + virtual void HostGame(int localUsersMask, bool bOnlineGame, bool bIsPrivate, unsigned char publicSlots = MINECRAFT_NET_MAX_PLAYERS, unsigned char privateSlots = 0); + virtual int JoinGame(FriendSessionInfo *searchResult, int localUsersMask, int primaryUserIndex ); + virtual bool SetLocalGame(bool isLocal); + virtual bool IsLocalGame() { return m_bIsOfflineGame; } + virtual void SetPrivateGame(bool isPrivate); + virtual bool IsPrivateGame() { return m_bIsPrivateGame; } + virtual bool IsLeavingGame() { return m_bLeavingGame; } + virtual void ResetLeavingGame() { m_bLeavingGame = false; } + + virtual void RegisterPlayerChangedCallback(int iPad, void (*callback)(void *callbackParam, INetworkPlayer *pPlayer, bool leaving), void *callbackParam); + virtual void UnRegisterPlayerChangedCallback(int iPad, void (*callback)(void *callbackParam, INetworkPlayer *pPlayer, bool leaving), void *callbackParam); + + virtual void HandleSignInChange(); + + virtual bool _RunNetworkGame(); + +private: + bool isSystemPrimaryPlayer(IQNetPlayer *pQNetPlayer); + virtual bool _LeaveGame(bool bMigrateHost, bool bLeaveRoom); + virtual void _HostGame(int dwUsersMask, unsigned char publicSlots = MINECRAFT_NET_MAX_PLAYERS, unsigned char privateSlots = 0); + virtual bool _StartGame(); + + IQNet * m_pIQNet; // pointer to QNet interface + + HANDLE m_notificationListener; + + vector m_machineQNetPrimaryPlayers; // collection of players that we deem to be the main one for that system + + bool m_bLeavingGame; + bool m_bLeaveGameOnTick; + bool m_migrateHostOnLeave; + bool m_bHostChanged; + + bool m_bIsOfflineGame; + bool m_bIsPrivateGame; + int m_flagIndexSize; + + // This is only maintained by the host, and is not valid on client machines + GameSessionData m_hostGameSessionData; + CGameNetworkManager *m_pGameNetworkManager; +public: + virtual void UpdateAndSetGameSessionData(INetworkPlayer *pNetworkPlayerLeaving = NULL); + +private: + // TODO 4J Stu - Do we need to be able to have more than one of these? + void (*playerChangedCallback[XUSER_MAX_COUNT])(void *callbackParam, INetworkPlayer *pPlayer, bool leaving); + void *playerChangedCallbackParam[XUSER_MAX_COUNT]; + + static int RemovePlayerOnSocketClosedThreadProc( void* lpParam ); + virtual bool RemoveLocalPlayer( INetworkPlayer *pNetworkPlayer ); + + // Things for handling per-system flags + class PlayerFlags + { + public: + INetworkPlayer *m_pNetworkPlayer; + unsigned char *flags; + unsigned int count; + PlayerFlags(INetworkPlayer *pNetworkPlayer, unsigned int count); + ~PlayerFlags(); + }; + vector m_playerFlags; + void SystemFlagAddPlayer(INetworkPlayer *pNetworkPlayer); + void SystemFlagRemovePlayer(INetworkPlayer *pNetworkPlayer); + void SystemFlagReset(); +public: + virtual void SystemFlagSet(INetworkPlayer *pNetworkPlayer, int index); + virtual bool SystemFlagGet(INetworkPlayer *pNetworkPlayer, int index); + + // For telemetry +private: + float m_lastPlayerEventTimeStart; + +public: + wstring GatherStats(); + wstring GatherRTTStats(); + +private: + vector friendsSessions[XUSER_MAX_COUNT]; + int m_searchResultsCount[XUSER_MAX_COUNT]; + int m_lastSearchStartTime[XUSER_MAX_COUNT]; + + // The results that will be filled in with the current search + XSESSION_SEARCHRESULT_HEADER *m_pSearchResults[XUSER_MAX_COUNT]; + XNQOS *m_pQoSResult[XUSER_MAX_COUNT]; + + // The results from the previous search, which are currently displayed in the game + XSESSION_SEARCHRESULT_HEADER *m_pCurrentSearchResults[XUSER_MAX_COUNT]; + XNQOS *m_pCurrentQoSResult[XUSER_MAX_COUNT]; + int m_currentSearchResultsCount[XUSER_MAX_COUNT]; + + int m_lastSearchPad; + bool m_bSearchResultsReady; + bool m_bSearchPending; + LPVOID m_pSearchParam; + void (*m_SessionsUpdatedCallback)(LPVOID pParam); + + C4JThread* m_SearchingThread; + + void TickSearch(); + void SearchForGames(); + static int SearchForGamesThreadProc( void* lpParameter ); + + void SetSearchResultsReady(int resultCount = 0); + + vectorcurrentNetworkPlayers; + INetworkPlayer *addNetworkPlayer(IQNetPlayer *pQNetPlayer); + void removeNetworkPlayer(IQNetPlayer *pQNetPlayer); + static INetworkPlayer *getNetworkPlayer(IQNetPlayer *pQNetPlayer); + + virtual void SetSessionTexturePackParentId( int id ); + virtual void SetSessionSubTexturePackId( int id ); + virtual void Notify(int ID, ULONG_PTR Param); + +public: + virtual vector *GetSessionList(int iPad, int localPlayers, bool partyOnly); + virtual bool GetGameSessionInfo(int iPad, SessionID sessionId,FriendSessionInfo *foundSession); + virtual void SetSessionsUpdatedCallback( void (*SessionsUpdatedCallback)(LPVOID pParam), LPVOID pSearchParam ); + virtual void GetFullFriendSessionInfo( FriendSessionInfo *foundSession, void (* FriendSessionUpdatedFn)(bool success, void *pParam), void *pParam ); + virtual void ForceFriendsSessionRefresh(); + +private: + void NotifyPlayerJoined( IQNetPlayer *pQNetPlayer ); + +#ifndef _XBOX + void FakeLocalPlayerJoined() { NotifyPlayerJoined(m_pIQNet->GetLocalPlayerByUserIndex(0)); } +#endif +}; diff --git a/Minecraft.Client/Common/Network/SessionInfo.h b/Minecraft.Client/Common/Network/SessionInfo.h new file mode 100644 index 00000000..31472a19 --- /dev/null +++ b/Minecraft.Client/Common/Network/SessionInfo.h @@ -0,0 +1,113 @@ +#pragma once + +#if defined(__PS3__) || defined(__ORBIS__) +#include "..\..\Common\Network\Sony\SQRNetworkManager.h" +#endif + + +// A struct that we store in the QoS data when we are hosting the session. Max size 1020 bytes. +#ifdef _XBOX +typedef struct _GameSessionData +{ + unsigned short netVersion; // 2 bytes + char hostName[XUSER_NAME_SIZE]; // 16 bytes ( 16*1 ) + GameSessionUID hostPlayerUID; // 8 bytes ( 8*1 ) on xbox, 24 bytes on PS3 + GameSessionUID players[MINECRAFT_NET_MAX_PLAYERS]; // 64 bytes ( 8*8 ) on xbox, 192 ( 24*8) on PS3 + char szPlayers[MINECRAFT_NET_MAX_PLAYERS][XUSER_NAME_SIZE]; // 128 bytes ( 8*16) + unsigned int m_uiGameHostSettings; // 4 bytes + unsigned int texturePackParentId; // 4 bytes + unsigned char subTexturePackId; // 1 byte + + bool isJoinable; // 1 byte + + _GameSessionData() + { + netVersion = 0; + memset(hostName,0,XUSER_NAME_SIZE); + memset(players,0,MINECRAFT_NET_MAX_PLAYERS*sizeof(players[0])); + memset(szPlayers,0,MINECRAFT_NET_MAX_PLAYERS*XUSER_NAME_SIZE); + isJoinable = true; + m_uiGameHostSettings = 0; + texturePackParentId = 0; + subTexturePackId = 0; + } +} GameSessionData; +#elif defined __PS3__ || defined __ORBIS__ || defined(__PSVITA__) +typedef struct _GameSessionData +{ + unsigned short netVersion; // 2 bytes + GameSessionUID hostPlayerUID; // 8 bytes ( 8*1 ) on xbox, 24 bytes on PS3 + GameSessionUID players[MINECRAFT_NET_MAX_PLAYERS]; // 64 bytes ( 8*8 ) on xbox, 192 ( 24*8) on PS3 + unsigned int m_uiGameHostSettings; // 4 bytes + unsigned int texturePackParentId; // 4 bytes + unsigned char subTexturePackId; // 1 byte + + bool isJoinable; // 1 byte + + unsigned char playerCount; // 1 byte + bool isReadyToJoin; // 1 byte + + _GameSessionData() + { + netVersion = 0; + memset(players,0,MINECRAFT_NET_MAX_PLAYERS*sizeof(players[0])); + isJoinable = true; + m_uiGameHostSettings = 0; + texturePackParentId = 0; + subTexturePackId = 0; + playerCount = 0; + isReadyToJoin = false; + + } +} GameSessionData; +#else +typedef struct _GameSessionData +{ + unsigned short netVersion; // 2 bytes + unsigned int m_uiGameHostSettings; // 4 bytes + unsigned int texturePackParentId; // 4 bytes + unsigned char subTexturePackId; // 1 byte + + bool isReadyToJoin; // 1 byte + + _GameSessionData() + { + netVersion = 0; + m_uiGameHostSettings = 0; + texturePackParentId = 0; + subTexturePackId = 0; + } +} GameSessionData; +#endif + +class FriendSessionInfo +{ +public: + SessionID sessionId; +#ifdef _XBOX + XSESSION_SEARCHRESULT searchResult; +#elif defined(__PS3__) || defined(__ORBIS__) || defined (__PSVITA__) + SQRNetworkManager::SessionSearchResult searchResult; +#elif defined(_DURANGO) + DQRNetworkManager::SessionSearchResult searchResult; +#endif + wchar_t *displayLabel; + unsigned char displayLabelLength; + unsigned char displayLabelViewableStartIndex; + GameSessionData data; + bool hasPartyMember; + + FriendSessionInfo() + { + displayLabel = NULL; + displayLabelLength = 0; + displayLabelViewableStartIndex = 0; + hasPartyMember = false; + } + + ~FriendSessionInfo() + { + if(displayLabel!=NULL) + delete displayLabel; + } +}; diff --git a/Minecraft.Client/Common/Network/Sony/NetworkPlayerSony.cpp b/Minecraft.Client/Common/Network/Sony/NetworkPlayerSony.cpp new file mode 100644 index 00000000..a7a4628b --- /dev/null +++ b/Minecraft.Client/Common/Network/Sony/NetworkPlayerSony.cpp @@ -0,0 +1,137 @@ +#include "stdafx.h" +#include "NetworkPlayerSony.h" + +NetworkPlayerSony::NetworkPlayerSony(SQRNetworkPlayer *qnetPlayer) +{ + m_sqrPlayer = qnetPlayer; + m_pSocket = NULL; + m_lastChunkPacketTime = 0; +} + +unsigned char NetworkPlayerSony::GetSmallId() +{ + return m_sqrPlayer->GetSmallId(); +} + +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, ack ); +} + +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 m_sqrPlayer->GetSendQueueSizeBytes(); +} + +int NetworkPlayerSony::GetSendQueueSizeMessages( INetworkPlayer *player, bool lowPriority ) +{ + return m_sqrPlayer->GetSendQueueSizeMessages(); +} + +int NetworkPlayerSony::GetCurrentRtt() +{ + return 0; // TODO +} + +bool NetworkPlayerSony::IsHost() +{ + return m_sqrPlayer->IsHost(); +} + +bool NetworkPlayerSony::IsGuest() +{ + return false; // TODO +} + +bool NetworkPlayerSony::IsLocal() +{ + return m_sqrPlayer->IsLocal(); +} + +int NetworkPlayerSony::GetSessionIndex() +{ + return m_sqrPlayer->GetSessionIndex(); +} + +bool NetworkPlayerSony::IsTalking() +{ + return m_sqrPlayer->IsTalking(); +} + +bool NetworkPlayerSony::IsMutedByLocalUser(int userIndex) +{ + return m_sqrPlayer->IsMutedByLocalUser(userIndex); +} + +bool NetworkPlayerSony::HasVoice() +{ + return m_sqrPlayer->HasVoice(); +} + +bool NetworkPlayerSony::HasCamera() +{ + return false; // TODO +} + +int NetworkPlayerSony::GetUserIndex() +{ + return m_sqrPlayer->GetLocalPlayerIndex(); +} + +void NetworkPlayerSony::SetSocket(Socket *pSocket) +{ + m_pSocket = pSocket; +} + +Socket *NetworkPlayerSony::GetSocket() +{ + return m_pSocket; +} + +const wchar_t *NetworkPlayerSony::GetOnlineName() +{ + return m_sqrPlayer->GetName(); +} + +wstring NetworkPlayerSony::GetDisplayName() +{ + return m_sqrPlayer->GetName(); +} + +PlayerUID NetworkPlayerSony::GetUID() +{ + return m_sqrPlayer->GetUID(); +} + +void NetworkPlayerSony::SetUID(PlayerUID UID) +{ + m_sqrPlayer->SetUID(UID); +} + +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 new file mode 100644 index 00000000..f3415a41 --- /dev/null +++ b/Minecraft.Client/Common/Network/Sony/NetworkPlayerSony.h @@ -0,0 +1,43 @@ +#pragma once + +#include "..\..\Common\Network\NetworkPlayerInterface.h" +#include "SQRNetworkPlayer.h" + +// This is an implementation of the INetworkPlayer interface, for Sony platforms. It effectively wraps the SQRNetworkPlayer class in a non-platform-specific way. + +class NetworkPlayerSony : public INetworkPlayer +{ +public: + // Common player interface + NetworkPlayerSony(SQRNetworkPlayer *sqrPlayer); + virtual unsigned char GetSmallId(); + virtual void SendData(INetworkPlayer *player, const void *pvData, int dataSize, bool lowPriority, 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(); + virtual bool IsHost(); + virtual bool IsGuest(); + virtual bool IsLocal(); + virtual int GetSessionIndex(); + virtual bool IsTalking(); + virtual bool IsMutedByLocalUser(int userIndex); + virtual bool HasVoice(); + virtual bool HasCamera(); + virtual int GetUserIndex(); + virtual void SetSocket(Socket *pSocket); + virtual Socket *GetSocket(); + virtual const wchar_t *GetOnlineName(); + virtual wstring GetDisplayName(); + virtual PlayerUID GetUID(); + + void SetUID(PlayerUID UID); + + 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 new file mode 100644 index 00000000..67fd058c --- /dev/null +++ b/Minecraft.Client/Common/Network/Sony/PlatformNetworkManagerSony.cpp @@ -0,0 +1,1462 @@ +#include "stdafx.h" +#include "..\..\..\Minecraft.World\Socket.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "PlatformNetworkManagerSony.h" +#include "NetworkPlayerSony.h" +#include "..\..\Common\Network\GameNetworkManager.h" + +CPlatformNetworkManagerSony *g_pPlatformNetworkManager; + +bool CPlatformNetworkManagerSony::IsLocalGame() +{ + return m_bIsOfflineGame; +} +bool CPlatformNetworkManagerSony::IsPrivateGame() +{ + return m_bIsPrivateGame; +} +bool CPlatformNetworkManagerSony::IsLeavingGame() +{ + return m_bLeavingGame; +} +void CPlatformNetworkManagerSony::ResetLeavingGame() +{ + m_bLeavingGame = false; +} + + +void CPlatformNetworkManagerSony::HandleStateChange(SQRNetworkManager::eSQRNetworkManagerState oldState, SQRNetworkManager::eSQRNetworkManagerState newState, bool idleReasonIsSessionFull) +{ + static const char * c_apszStateNames[] = + { + "SNM_STATE_INITIALISING", + "SNM_STATE_INITIALISE_FAILED", + "SNM_STATE_IDLE", + "SNM_STATE_HOSTING", + "SNM_STATE_JOINING", + "SNM_STATE_STARTING", + "SNM_STATE_PLAYING", + "SNM_STATE_LEAVING", + "SNM_STATE_ENDING", + }; + + app.DebugPrintf( "Network State: %s ==> %s\n", + c_apszStateNames[ oldState ], + c_apszStateNames[ newState ] ); + + if( newState == SQRNetworkManager::SNM_STATE_HOSTING ) + { + m_bLeavingGame = false; + m_bLeaveGameOnTick = false; + m_bHostChanged = false; + g_NetworkManager.StateChange_AnyToHosting(); + } + else if( newState == SQRNetworkManager::SNM_STATE_JOINING ) + { + // 4J Stu - We may be accepting an invite from the DLC menu, so hide the icon +#if defined __ORBIS__ || defined __PSVITA__ + app.GetCommerce()->HidePsStoreIcon(); +#endif + m_bLeavingGame = false; + m_bLeaveGameOnTick = false; + m_bHostChanged = false; + g_NetworkManager.StateChange_AnyToJoining(); + } + else if( newState == SQRNetworkManager::SNM_STATE_IDLE && oldState == SQRNetworkManager::SNM_STATE_JOINING ) + { + if( idleReasonIsSessionFull ) + { + g_NetworkManager.StateChange_JoiningToIdle(JOIN_FAILED_SERVER_FULL); + } + else + { + g_NetworkManager.StateChange_JoiningToIdle(JOIN_FAILED_NONSPECIFIC); + } + } + else if( newState == SQRNetworkManager::SNM_STATE_IDLE && oldState == SQRNetworkManager::SNM_STATE_HOSTING ) + { + m_bLeavingGame = true; + } + else if( newState == SQRNetworkManager::SNM_STATE_STARTING ) + { + m_lastPlayerEventTimeStart = app.getAppTime(); + + g_NetworkManager.StateChange_AnyToStarting(); + } + // Fix for #93148 - TCR 001: BAS Game Stability: Title will crash for the multiplayer client if host of the game will exit during the clients loading to created world. + // 4J Stu - If the client joins just as the host is exiting, then they can skip to leaving without passing through ending + else if( newState == SQRNetworkManager::SNM_STATE_ENDING ) + { + g_NetworkManager.StateChange_AnyToEnding( oldState == SQRNetworkManager::SNM_STATE_PLAYING ); + + // 4J-PB - Only the host can leave here - the clients will hang if m_bLeavingGame is set to true here + if( m_pSQRNet->IsHost() ) + { + m_bLeavingGame = true; + } + } + + if( newState == SQRNetworkManager::SNM_STATE_IDLE ) + { + // On PS3, sometimes we're getting a SNM_STATE_ENDING transition to SNM_STATE_IDLE on joining, because the server context being deleted sets the state away from SNM_STATE_JOINING before we detect + // the cause for the disconnection. This means we don't pick up on the joining->idle transition. Set disconnection reason here too for this case. + if( idleReasonIsSessionFull ) + { + app.SetDisconnectReason( DisconnectPacket::eDisconnect_ServerFull ); + } + g_NetworkManager.StateChange_AnyToIdle(); + } +} + +void CPlatformNetworkManagerSony::HandleDataReceived(SQRNetworkPlayer *playerFrom, SQRNetworkPlayer *playerTo, unsigned char *data, unsigned int dataSize) +{ + if(m_pSQRNet->GetState() == SQRNetworkManager::SNM_STATE_ENDING) + { + return; + } + + if( playerTo->IsHost() ) + { + // If we are the host we care who this came from + //app.DebugPrintf( "Pushing data into host read queue for user \"%ls\"\n", pPlayerFrom->GetGamertag()); + // Push this data into the read queue for the player that sent it + INetworkPlayer *pPlayerFrom = getNetworkPlayer(playerFrom); + Socket *socket = pPlayerFrom->GetSocket(); + + if(socket != NULL) + socket->pushDataToQueue(data, dataSize, false); + } + else + { + // If we are not the host the message must have come from the host, so we care more about who it is addressed to + INetworkPlayer *pPlayerTo = getNetworkPlayer(playerTo); + Socket *socket = pPlayerTo->GetSocket(); + //app.DebugPrintf( "Pushing data into read queue for user \"%ls\"\n", apPlayersTo[dwPlayer]->GetGamertag()); + if(socket != NULL) + socket->pushDataToQueue(data, dataSize); + } +} + +void CPlatformNetworkManagerSony::HandlePlayerJoined(SQRNetworkPlayer * pSQRPlayer) +{ + const char * pszDescription; + + // 4J Stu - We create a fake socket for every where that we need an INBOUND queue of game data. Outbound + // is all handled by QNet so we don't need that. Therefore each client player has one, and the host has one + // for each client player. + bool createFakeSocket = false; + bool localPlayer = false; + + NetworkPlayerSony *networkPlayer = (NetworkPlayerSony *)addNetworkPlayer(pSQRPlayer); + + if( pSQRPlayer->IsLocal() ) + { + localPlayer = true; + if( pSQRPlayer->IsHost() ) + { + pszDescription = "local host"; + // 4J Stu - No socket for the localhost as it uses a special loopback queue + + m_machineSQRPrimaryPlayers.push_back( pSQRPlayer ); + } + else + { + pszDescription = "local"; + + // We need an inbound queue on all local players to receive data from the host + createFakeSocket = true; + } + } + else + { + if( pSQRPlayer->IsHost() ) + { + pszDescription = "remote host"; + } + else + { + pszDescription = "remote"; + + // If we are the host, then create a fake socket for every remote player + if( m_pSQRNet->IsHost() ) + { + createFakeSocket = true; + } + } + + if( m_pSQRNet->IsHost() && !m_bHostChanged ) + { + // Do we already have a primary player for this system? + bool systemHasPrimaryPlayer = false; + for(AUTO_VAR(it, m_machineSQRPrimaryPlayers.begin()); it < m_machineSQRPrimaryPlayers.end(); ++it) + { + SQRNetworkPlayer *pQNetPrimaryPlayer = *it; + if( pSQRPlayer->IsSameSystem(pQNetPrimaryPlayer) ) + { + systemHasPrimaryPlayer = true; + break; + } + } + if( !systemHasPrimaryPlayer ) + m_machineSQRPrimaryPlayers.push_back( pSQRPlayer ); + } + } + g_NetworkManager.PlayerJoining( networkPlayer ); + + if( createFakeSocket == true && !m_bHostChanged ) + { + g_NetworkManager.CreateSocket( networkPlayer, localPlayer ); + } + +#if 0 + app.DebugPrintf( "Player 0x%p \"%ls\" joined; %s; voice %i; camera %i.\n", + pSQRPlayer, + pSQRPlayer->GetGamertag(), + pszDescription, + (int) pSQRPlayer->HasVoice(), + (int) pSQRPlayer->HasCamera() ); +#endif + + + if( m_pSQRNet->IsHost() ) + { + // 4J-PB - only the host should do this + g_NetworkManager.UpdateAndSetGameSessionData(); + SystemFlagAddPlayer( networkPlayer ); + } + + for( int idx = 0; idx < XUSER_MAX_COUNT; ++idx) + { + if(playerChangedCallback[idx] != NULL) + playerChangedCallback[idx]( playerChangedCallbackParam[idx], networkPlayer, false ); + } + + if(true) // TODO m_pSQRNet->GetState() == QNET_STATE_GAME_PLAY) + { + int localPlayerCount = 0; + for(unsigned int idx = 0; idx < XUSER_MAX_COUNT; ++idx) + { + if( m_pSQRNet->GetLocalPlayerByUserIndex(idx) != NULL ) ++localPlayerCount; + } + + float appTime = app.getAppTime(); + + // Only record stats for the primary player here + m_lastPlayerEventTimeStart = appTime; + } +} + +void CPlatformNetworkManagerSony::HandlePlayerLeaving(SQRNetworkPlayer *pSQRPlayer) +{ + //__debugbreak(); + + app.DebugPrintf( "Player 0x%p leaving.\n", + pSQRPlayer ); + + INetworkPlayer *networkPlayer = getNetworkPlayer(pSQRPlayer); + + if( networkPlayer ) + { + // Get our wrapper object associated with this player. + Socket *socket = networkPlayer->GetSocket(); + if( socket != NULL ) + { + // If we are in game then remove this player from the game as well. + // We may get here either from the player requesting to exit the game, + // in which case we they will already have left the game server, or from a disconnection + // where we then have to remove them from the game server + if( m_pSQRNet->IsHost() && !m_bHostChanged ) + { + g_NetworkManager.CloseConnection(networkPlayer); + } + + // Free the wrapper object memory. + // TODO 4J Stu - We may still be using this at the point that the player leaves the session. + // We need this as long as the game server still needs to communicate with the player + //delete socket; + + networkPlayer->SetSocket( NULL ); + } + + if( m_pSQRNet->IsHost() && !m_bHostChanged ) + { + if( isSystemPrimaryPlayer(pSQRPlayer) ) + { + SQRNetworkPlayer *pNewSQRPrimaryPlayer = NULL; + for(unsigned int i = 0; i < m_pSQRNet->GetPlayerCount(); ++i ) + { + SQRNetworkPlayer *pSQRPlayer2 = m_pSQRNet->GetPlayerByIndex( i ); + + if ( pSQRPlayer2 != NULL && pSQRPlayer2 != pSQRPlayer && pSQRPlayer2->IsSameSystem( pSQRPlayer ) ) + { + pNewSQRPrimaryPlayer = pSQRPlayer2; + break; + } + } + AUTO_VAR(it, find( m_machineSQRPrimaryPlayers.begin(), m_machineSQRPrimaryPlayers.end(), pSQRPlayer)); + if( it != m_machineSQRPrimaryPlayers.end() ) + { + m_machineSQRPrimaryPlayers.erase( it ); + } + + if( pNewSQRPrimaryPlayer != NULL ) + m_machineSQRPrimaryPlayers.push_back( pNewSQRPrimaryPlayer ); + } + + g_NetworkManager.UpdateAndSetGameSessionData( networkPlayer ); + SystemFlagRemovePlayer( networkPlayer ); + + } + + g_NetworkManager.PlayerLeaving( networkPlayer ); + + for( int idx = 0; idx < XUSER_MAX_COUNT; ++idx) + { + if(playerChangedCallback[idx] != NULL) + playerChangedCallback[idx]( playerChangedCallbackParam[idx], networkPlayer, true ); + } + + if(m_pSQRNet->GetState() == SQRNetworkManager::SNM_STATE_PLAYING) + { + int localPlayerCount = 0; + for(unsigned int idx = 0; idx < XUSER_MAX_COUNT; ++idx) + { + if( m_pSQRNet->GetLocalPlayerByUserIndex(idx) != NULL ) ++localPlayerCount; + } + + float appTime = app.getAppTime(); + m_lastPlayerEventTimeStart = appTime; + } + + removeNetworkPlayer(pSQRPlayer); + } +} + +// Update our external data to match the current internal player slots, and resync back out (host only) +void CPlatformNetworkManagerSony::HandleResyncPlayerRequest(SQRNetworkPlayer **aPlayers) +{ + m_hostGameSessionData.playerCount = 0; + for(int i = 0; i < SQRNetworkManager::MAX_ONLINE_PLAYER_COUNT; i++ ) + { + if( aPlayers[i] ) + { + m_hostGameSessionData.players[i] = aPlayers[i]->GetUID(); + m_hostGameSessionData.playerCount++; + } + else + { + memset(&m_hostGameSessionData.players[i],0,sizeof(m_hostGameSessionData.players[i])); + } + } + m_pSQRNet->UpdateExternalRoomData(); +} + +void CPlatformNetworkManagerSony::HandleAddLocalPlayerFailed(int idx) +{ + g_NetworkManager.AddLocalPlayerFailed(idx); +} + +void CPlatformNetworkManagerSony::HandleDisconnect(bool bLostRoomOnly,bool bPSNSignOut) +{ + g_NetworkManager.HandleDisconnect(bLostRoomOnly,bPSNSignOut); +} + +void CPlatformNetworkManagerSony::HandleInviteReceived( int userIndex, const SQRNetworkManager::PresenceSyncInfo *pInviteInfo) +{ + g_NetworkManager.GameInviteReceived( userIndex, pInviteInfo ); +} + +extern SQRNetworkManager *testSQRNetworkManager; + +bool CPlatformNetworkManagerSony::Initialise(CGameNetworkManager *pGameNetworkManager, int flagIndexSize) +{ + // Create a sony network manager, and go online +#ifdef __ORBIS__ + m_pSQRNet = new SQRNetworkManager_Orbis(this); + m_pSQRNet->Initialise(); +#elif defined __PS3__ + m_pSQRNet = new SQRNetworkManager_PS3(this); + m_pSQRNet->Initialise(); +#else // __PSVITA__ + // m_pSQRNet = new SQRNetworkManager_Vita(this); + m_bUsingAdhocMode = false; + m_pSQRNet_Vita_Adhoc = new SQRNetworkManager_AdHoc_Vita(this); + m_pSQRNet_Vita = new SQRNetworkManager_Vita(this); + + m_pSQRNet = m_pSQRNet_Vita; + + // 4J-PB - seems we can't initialise both adhoc and psn comms - from Rohan - "having adhoc matching and matching2 library initialised together results in undesired behaviour", but probably having other parts initialised also is 'undesirable' + + m_pSQRNet_Vita->Initialise(); + + if(ProfileManager.IsSignedInPSN(ProfileManager.GetPrimaryPad())) + { + // we're signed into the PSN, but we won't be online yet, force a sign-in online here + m_pSQRNet_Vita->AttemptPSNSignIn(NULL, NULL); + } + + +#endif + + m_pGameNetworkManager = pGameNetworkManager; + m_flagIndexSize = flagIndexSize; + g_pPlatformNetworkManager = this; + for( int i = 0; i < XUSER_MAX_COUNT; i++ ) + { + playerChangedCallback[ i ] = NULL; + } + + m_bLeavingGame = false; + m_bLeaveGameOnTick = false; + m_bHostChanged = false; + m_bLeaveRoomWhenLeavingGame = true; + + m_bSearchPending = false; + + m_bIsOfflineGame = false; + m_pSearchParam = NULL; + m_SessionsUpdatedCallback = NULL; + + m_searchResultsCount = 0; + m_pSearchResults = NULL; + + m_lastSearchStartTime = 0; + + // Success! + return true; +} + +void CPlatformNetworkManagerSony::Terminate() +{ + m_pSQRNet->Terminate(); +} + +int CPlatformNetworkManagerSony::GetJoiningReadyPercentage() +{ + return m_pSQRNet->GetJoiningReadyPercentage(); +} + +int CPlatformNetworkManagerSony::CorrectErrorIDS(int IDS) +{ + // Attempts to remap the following messages to provide something that PS3 TCRs are happier with + // + // IDS_CONNECTION_LOST - "Connection lost" + // IDS_CONNECTION_FAILED - "Connection failed" + // IDS_CONNECTION_LOST_LIVE - "Connection to "PSN" was lost. Exiting to the main menu." + // IDS_CONNECTION_LOST_LIVE_NO_EXIT - "Connection to "PSN" was lost." + // IDS_CONNECTION_LOST_SERVER - "Connection to the server was lost. Exiting to the main menu." + // + // Map to: + // + // IDS_ERROR_NETWORK - "A network error has occurred" + // IDS_ERROR_NETWORK_TITLE - "Network Error" + // IDS_ERROR_NETWORK_EXIT - "A network error has occurred. Exiting to Main Menu." + // IDS_ERROR_PSN_SIGN_OUT - You have been signed out from the "PSN". + // IDS_ERROR_PSN_SIGN_OUT_EXIT - You have been signed out from the "PSN". Exiting to Main Menu + + // Determine if we'd prefer to present errors as a signing out issue, rather than a network issue, based on whether we have a network connection at all or not + bool preferSignoutError = false; + int state; + +#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; + if( ret == 0 ) + { + if( state == IPObtainedState ) + { + preferSignoutError = true; + } + } +#endif + +#ifdef __PSVITA__ + // If we're in ad-hoc mode this problem definitely wasn't PSN related + if (usingAdhocMode()) preferSignoutError = false; +#endif + + // If we're the host we haven't lost connection to the server + if (IDS == IDS_CONNECTION_LOST_SERVER && g_NetworkManager.IsHost()) + { + IDS = IDS_CONNECTION_LOST_LIVE; + } + + switch(IDS) + { + case IDS_CONNECTION_LOST: + case IDS_CONNECTION_FAILED: + return IDS_ERROR_NETWORK_TITLE; + case IDS_CONNECTION_LOST_LIVE: + if( preferSignoutError ) + { + return IDS_ERROR_PSN_SIGN_OUT_EXIT; + } + else + { + return IDS_ERROR_NETWORK_EXIT; + } + case IDS_CONNECTION_LOST_LIVE_NO_EXIT: + if( preferSignoutError ) + { + return IDS_ERROR_PSN_SIGN_OUT; + } + else + { + return IDS_ERROR_NETWORK_TITLE; + } + break; +#ifdef __PSVITA__ + case IDS_CONNECTION_LOST_SERVER: + if(preferSignoutError) + { + if(ProfileManager.IsSignedInPSN(ProfileManager.GetPrimaryPad()) == false) + return IDS_ERROR_PSN_SIGN_OUT_EXIT; + } +#endif + default: + return IDS; + } + + +} + +bool CPlatformNetworkManagerSony::isSystemPrimaryPlayer(SQRNetworkPlayer *pSQRPlayer) +{ + bool playerIsSystemPrimary = false; + for(AUTO_VAR(it, m_machineSQRPrimaryPlayers.begin()); it < m_machineSQRPrimaryPlayers.end(); ++it) + { + SQRNetworkPlayer *pSQRPrimaryPlayer = *it; + if( pSQRPrimaryPlayer == pSQRPlayer ) + { + playerIsSystemPrimary = true; + break; + } + } + return playerIsSystemPrimary; +} + +// We call this twice a frame, either side of the render call so is a good place to "tick" things +void CPlatformNetworkManagerSony::DoWork() +{ +#if 0 + DWORD dwNotifyId; + ULONG_PTR ulpNotifyParam; + + while( XNotifyGetNext( + m_notificationListener, + 0, // Any notification + &dwNotifyId, + &ulpNotifyParam) + ) + { + + switch(dwNotifyId) + { + + case XN_SYS_SIGNINCHANGED: + app.DebugPrintf("Signinchanged - %d\n", ulpNotifyParam); + break; + case XN_LIVE_INVITE_ACCEPTED: + // ignore these - we're catching them from the game listener, so we can get the one from the dashboard + break; + default: + m_pIQNet->Notify(dwNotifyId,ulpNotifyParam); + break; + } + + } + + TickSearch(); + + if( m_bLeaveGameOnTick ) + { + m_pIQNet->LeaveGame(m_migrateHostOnLeave); + m_bLeaveGameOnTick = false; + } + + m_pIQNet->DoWork(); +#else + TickSearch(); + + if( m_bLeaveGameOnTick ) + { + m_pSQRNet->LeaveRoom(m_bLeaveRoomWhenLeavingGame); + m_bLeaveGameOnTick = false; + } + + m_pSQRNet->Tick(); +#endif +} + +int CPlatformNetworkManagerSony::GetPlayerCount() +{ + return m_pSQRNet->GetPlayerCount(); +} + +bool CPlatformNetworkManagerSony::ShouldMessageForFullSession() +{ + return false; +} + +int CPlatformNetworkManagerSony::GetOnlinePlayerCount() +{ + return m_pSQRNet->GetOnlinePlayerCount(); +} + +int CPlatformNetworkManagerSony::GetLocalPlayerMask(int playerIndex) +{ + return 1 << playerIndex; +} + +bool CPlatformNetworkManagerSony::AddLocalPlayerByUserIndex( int userIndex ) +{ + return m_pSQRNet->AddLocalPlayerByUserIndex(userIndex); +} + +bool CPlatformNetworkManagerSony::RemoveLocalPlayerByUserIndex( int userIndex ) +{ + SQRNetworkPlayer *pSQRPlayer = m_pSQRNet->GetLocalPlayerByUserIndex(userIndex); + INetworkPlayer *pNetworkPlayer = getNetworkPlayer(pSQRPlayer); + + if(pNetworkPlayer != NULL) + { + Socket *socket = pNetworkPlayer->GetSocket(); + + if( socket != NULL ) + { + // We can't remove the player from qnet until we have stopped using it to communicate + C4JThread* thread = new C4JThread(&CPlatformNetworkManagerSony::RemovePlayerOnSocketClosedThreadProc, pNetworkPlayer, "RemovePlayerOnSocketClosed"); + thread->SetProcessor( CPU_CORE_REMOVE_PLAYER ); + thread->Run(); + } + else + { + // Safe to remove the player straight away + return m_pSQRNet->RemoveLocalPlayerByUserIndex(userIndex); + } + } + return true; +} + +bool CPlatformNetworkManagerSony::IsInStatsEnabledSession() +{ +#if 0 + DWORD dataSize = sizeof(QNET_LIVE_STATS_MODE); + QNET_LIVE_STATS_MODE statsMode; + m_pIQNet->GetOpt(QNET_OPTION_LIVE_STATS_MODE, &statsMode , &dataSize ); + + // Use QNET_LIVE_STATS_MODE_AUTO if there is another way to check if stats are enabled or not + bool statsEnabled = statsMode == QNET_LIVE_STATS_MODE_ENABLED; + return m_pIQNet->GetState() != QNET_STATE_IDLE && statsEnabled; +#endif + return true; +} + +bool CPlatformNetworkManagerSony::SessionHasSpace(unsigned int spaceRequired /*= 1*/) +{ + return m_pSQRNet->SessionHasSpace(spaceRequired); +#if 0 + // This function is used while a session is running, so all players trying to join + // should use public slots, + DWORD publicSlots = 0; + DWORD filledPublicSlots = 0; + DWORD privateSlots = 0; + DWORD filledPrivateSlots = 0; + + DWORD dataSize = sizeof(DWORD); + m_pIQNet->GetOpt(QNET_OPTION_TOTAL_PUBLIC_SLOTS, &publicSlots, &dataSize ); + m_pIQNet->GetOpt(QNET_OPTION_FILLED_PUBLIC_SLOTS, &filledPublicSlots, &dataSize ); + m_pIQNet->GetOpt(QNET_OPTION_TOTAL_PRIVATE_SLOTS, &privateSlots, &dataSize ); + m_pIQNet->GetOpt(QNET_OPTION_FILLED_PRIVATE_SLOTS, &filledPrivateSlots, &dataSize ); + + DWORD spaceLeft = (publicSlots - filledPublicSlots) + (privateSlots - filledPrivateSlots); + + return spaceLeft >= spaceRequired; +#else + return true; +#endif +} + +void CPlatformNetworkManagerSony::SendInviteGUI(int quadrant) +{ + m_pSQRNet->SendInviteGUI(); +} + +bool CPlatformNetworkManagerSony::IsAddingPlayer() +{ + return false; +} + +bool CPlatformNetworkManagerSony::LeaveGame(bool bMigrateHost) +{ + if( m_bLeavingGame ) return true; + + m_bLeavingGame = true; + + // If we are a client, wait for all client connections to close + // TODO Possibly need to do multiple objects depending on how split screen online works + SQRNetworkPlayer *pSQRPlayer = m_pSQRNet->GetLocalPlayerByUserIndex(g_NetworkManager.GetPrimaryPad()); + INetworkPlayer *pNetworkPlayer = getNetworkPlayer(pSQRPlayer); + + if(pNetworkPlayer != NULL) + { + Socket *socket = pNetworkPlayer->GetSocket(); + + if( socket != NULL ) + { + //printf("Waiting for socket closed event\n"); + DWORD result = socket->m_socketClosedEvent->WaitForSignal(INFINITE); + + // The session might be gone once the socket releases + if( IsInSession() ) + { + //printf("Socket closed event has fired\n"); + // 4J Stu - Clear our reference to this socket + pSQRPlayer = m_pSQRNet->GetLocalPlayerByUserIndex(g_NetworkManager.GetPrimaryPad()); + pNetworkPlayer = getNetworkPlayer(pSQRPlayer); + pNetworkPlayer->SetSocket( NULL ); + } + delete socket; + } + else + { + //printf("Socket is already NULL\n"); + } + } + + // If we are the host wait for the game server to end + if(m_pSQRNet->IsHost() && g_NetworkManager.ServerStoppedValid()) + { + m_pSQRNet->EndGame(); + g_NetworkManager.ServerStoppedWait(); + g_NetworkManager.ServerStoppedDestroy(); + } + + return _LeaveGame(bMigrateHost, true); +} + +bool CPlatformNetworkManagerSony::_LeaveGame(bool bMigrateHost, bool bLeaveRoom) +{ + // 4J Stu - Fix for #10490 - TCR 001 BAS Game Stability: When a party of four players leave a world to join another world without saving the title will crash. + // Changed this to make it threadsafe + m_bLeavingGame = true; // Added for Sony platforms but unsure why the 360 doesn't need it - without this, the leaving triggered by this causes the game to respond by leaving again when it transitions to the SNM_STATE_ENDING state + m_bLeaveRoomWhenLeavingGame = bLeaveRoom; + m_bLeaveGameOnTick = true; + m_migrateHostOnLeave = bMigrateHost; + + return true; +} + +void CPlatformNetworkManagerSony::HostGame(int localUsersMask, bool bOnlineGame, bool bIsPrivate, unsigned char publicSlots /*= MINECRAFT_NET_MAX_PLAYERS*/, unsigned char privateSlots /*= 0*/) +{ +// #ifdef _XBOX + // 4J Stu - We probably did this earlier as well, but just to be sure! + SetLocalGame( !bOnlineGame ); + SetPrivateGame( bIsPrivate ); + SystemFlagReset(); + + // Make sure that the Primary Pad is in by default + localUsersMask |= GetLocalPlayerMask( g_NetworkManager.GetPrimaryPad() ); + + _HostGame( localUsersMask, publicSlots, privateSlots ); +//#endif +} + +void CPlatformNetworkManagerSony::_HostGame(int usersMask, unsigned char publicSlots /*= MINECRAFT_NET_MAX_PLAYERS*/, unsigned char privateSlots /*= 0*/) +{ + // Start hosting a new game + + memset(&m_hostGameSessionData,0,sizeof(m_hostGameSessionData)); + m_hostGameSessionData.netVersion = MINECRAFT_NET_VERSION; + m_hostGameSessionData.isJoinable = !IsPrivateGame(); + m_hostGameSessionData.isReadyToJoin = false; + m_hostGameSessionData.playerCount = 0; + m_hostGameSessionData.m_uiGameHostSettings = app.GetGameHostOption(eGameHostOption_All); + for( int i = 0; i < SQRNetworkManager::MAX_LOCAL_PLAYER_COUNT; i++ ) + { + if( usersMask & ( 1 << i ) ) + { + m_hostGameSessionData.playerCount++; + } + } + + m_pSQRNet->CreateAndJoinRoom(g_NetworkManager.GetPrimaryPad(),usersMask, &m_hostGameSessionData, sizeof(m_hostGameSessionData), IsLocalGame()); // Should be using: g_NetworkManager.GetLockedProfile() but that isn't being set currently +} + +bool CPlatformNetworkManagerSony::_StartGame() +{ +#if 0 + // Set the options that now allow players to join this game + BOOL enableJip = TRUE; // Must always be true othewise nobody can join the game while in the PLAY state + m_pIQNet->SetOpt( QNET_OPTION_JOIN_IN_PROGRESS_ALLOWED, &enableJip, sizeof BOOL ); + BOOL enableInv = !IsLocalGame(); + m_pIQNet->SetOpt( QNET_OPTION_INVITES_ALLOWED, &enableInv, sizeof BOOL ); + BOOL enablePres = !IsPrivateGame() && !IsLocalGame(); + m_pIQNet->SetOpt( QNET_OPTION_PRESENCE_JOIN_MODE, &enablePres, sizeof BOOL ); + + return ( m_pIQNet->StartGame() == S_OK ); +#else + m_pSQRNet->StartGame(); + return true; +#endif +} + +int CPlatformNetworkManagerSony::JoinGame(FriendSessionInfo *searchResult, int localUsersMask, int primaryUserIndex) +{ + int joinPlayerCount = 0; + for( int i = 0; i < SQRNetworkManager::MAX_LOCAL_PLAYER_COUNT; i++ ) + { + if( localUsersMask & ( 1 << i ) ) + { + joinPlayerCount++; + } + } + GameSessionData *gameSession = (GameSessionData *)(&searchResult->data); + if( ( gameSession->playerCount + joinPlayerCount ) > SQRNetworkManager::MAX_ONLINE_PLAYER_COUNT ) + { + return CGameNetworkManager::JOINGAME_FAIL_SERVER_FULL; + } + + if( m_pSQRNet->JoinRoom(&searchResult->searchResult, localUsersMask) ) + { + return CGameNetworkManager::JOINGAME_SUCCESS; + } + else + { + return CGameNetworkManager::JOINGAME_FAIL_GENERAL; + } +} + +bool CPlatformNetworkManagerSony::SetLocalGame(bool isLocal) +{ + if( m_pSQRNet->GetState() == SQRNetworkManager::SNM_STATE_IDLE) + { +#if 0 + QNET_SESSIONTYPE sessionType = isLocal ? QNET_SESSIONTYPE_LOCAL : QNET_SESSIONTYPE_LIVE_STANDARD; + m_pIQNet->SetOpt(QNET_OPTION_TYPE_SESSIONTYPE, &sessionType , sizeof QNET_SESSIONTYPE); + + // The default value for this is QNET_LIVE_STATS_MODE_AUTO, but that decides based on the players + // in when the game starts. As we may want a non-live player to join the game we cannot have stats enabled + // when we create the sessions. As a result of this, the NotifyWriteStats callback will not be called for + // LIVE players that are connected to LIVE so we write their stats data on a state change. + QNET_LIVE_STATS_MODE statsMode = isLocal ? QNET_LIVE_STATS_MODE_DISABLED : QNET_LIVE_STATS_MODE_ENABLED; + m_pIQNet->SetOpt(QNET_OPTION_LIVE_STATS_MODE, &statsMode , sizeof QNET_LIVE_STATS_MODE); + + // Also has a default of QNET_LIVE_PRESENCE_MODE_AUTO as above, although the effects are less of an issue + QNET_LIVE_PRESENCE_MODE presenceMode = isLocal ? QNET_LIVE_PRESENCE_MODE_NOT_ADVERTISED : QNET_LIVE_PRESENCE_MODE_ADVERTISED; + m_pIQNet->SetOpt(QNET_OPTION_LIVE_PRESENCE_MODE, &presenceMode , sizeof QNET_LIVE_PRESENCE_MODE); +#endif + + m_bIsOfflineGame = isLocal; + app.DebugPrintf("Setting as local game: %s\n", isLocal ? "yes" : "no" ); + } + else + { + app.DebugPrintf("Tried to change session type while not in idle or offline state\n"); + } + + return true; +} + +void CPlatformNetworkManagerSony::SetPrivateGame(bool isPrivate) +{ + app.DebugPrintf("Setting as private game: %s\n", isPrivate ? "yes" : "no" ); + m_bIsPrivateGame = isPrivate; +} + +void CPlatformNetworkManagerSony::RegisterPlayerChangedCallback(int iPad, void (*callback)(void *callbackParam, INetworkPlayer *pPlayer, bool leaving), void *callbackParam) +{ + playerChangedCallback[iPad] = callback; + playerChangedCallbackParam[iPad] = callbackParam; +} + +void CPlatformNetworkManagerSony::UnRegisterPlayerChangedCallback(int iPad, void (*callback)(void *callbackParam, INetworkPlayer *pPlayer, bool leaving), void *callbackParam) +{ + if(playerChangedCallbackParam[iPad] == callbackParam) + { + playerChangedCallback[iPad] = NULL; + playerChangedCallbackParam[iPad] = NULL; + } +} + +void CPlatformNetworkManagerSony::HandleSignInChange() +{ + return; +} + +bool CPlatformNetworkManagerSony::_RunNetworkGame() +{ +#if 0 + // We delay actually starting the session so that we know the game server is running by the time the clients try to join + // This does result in a host advantage + HRESULT hr = m_pIQNet->StartGame(); + if(FAILED(hr)) return false; + + // Set the options that now allow players to join this game + BOOL enableJip = TRUE; // Must always be true othewise nobody can join the game while in the PLAY state + m_pIQNet->SetOpt( QNET_OPTION_JOIN_IN_PROGRESS_ALLOWED, &enableJip, sizeof BOOL ); + BOOL enableInv = !IsLocalGame(); + m_pIQNet->SetOpt( QNET_OPTION_INVITES_ALLOWED, &enableInv, sizeof BOOL ); + BOOL enablePres = !IsPrivateGame() && !IsLocalGame(); + m_pIQNet->SetOpt( QNET_OPTION_PRESENCE_JOIN_MODE, &enablePres, sizeof BOOL ); +#endif + if( IsHost() ) + { + m_pSQRNet->StartGame(); + m_hostGameSessionData.isReadyToJoin = true; + m_pSQRNet->UpdateExternalRoomData(); + m_pSQRNet->SetPresenceDataStartHostingGame(); + } + + return true; +} + +// Note that this does less than the xbox equivalent as we have HandleResyncPlayerRequest that is called by the underlying SQRNetworkManager when players are added/removed etc., so this +// call is only used to update the game host settings & then do the final push out of the data. +void CPlatformNetworkManagerSony::UpdateAndSetGameSessionData(INetworkPlayer *pNetworkPlayerLeaving /*= NULL*/) +{ + if( this->m_bLeavingGame ) + return; + + m_hostGameSessionData.hostPlayerUID = GetHostPlayer()->GetUID(); +#ifdef __PSVITA__ + if(usingAdhocMode()) + { + m_hostGameSessionData.hostPlayerUID.setForAdhoc(); + } +#endif + + m_hostGameSessionData.m_uiGameHostSettings = app.GetGameHostOption(eGameHostOption_All); + + // If this is called With a pNetworkPlayerLeaving, then the call has ultimately started within SQRNetworkManager::RemoveRemotePlayersAndSync, so we don't need to sync each change + // as that function does a sync at the end of all changes. + if( pNetworkPlayerLeaving == NULL ) + { + m_pSQRNet->UpdateExternalRoomData(); + } +} + +int CPlatformNetworkManagerSony::RemovePlayerOnSocketClosedThreadProc( void* lpParam ) +{ + INetworkPlayer *pNetworkPlayer = (INetworkPlayer *)lpParam; + + Socket *socket = pNetworkPlayer->GetSocket(); + + if( socket != NULL ) + { + //printf("Waiting for socket closed event\n"); + socket->m_socketClosedEvent->WaitForSignal(INFINITE); + + //printf("Socket closed event has fired\n"); + // 4J Stu - Clear our reference to this socket + pNetworkPlayer->SetSocket( NULL ); + delete socket; + } + + return g_pPlatformNetworkManager->RemoveLocalPlayer( pNetworkPlayer ); +} + +bool CPlatformNetworkManagerSony::RemoveLocalPlayer( INetworkPlayer *pNetworkPlayer ) +{ + if( pNetworkPlayer->IsLocal() ) + { + return m_pSQRNet->RemoveLocalPlayerByUserIndex( pNetworkPlayer->GetUserIndex() ); + } + + return true; +} + +CPlatformNetworkManagerSony::PlayerFlags::PlayerFlags(INetworkPlayer *pNetworkPlayer, unsigned int count) +{ + // 4J Stu - Don't assert, just make it a multiple of 8! This count is calculated from a load of separate values, + // and makes tweaking world/render sizes a pain if we hit an assert here + count = (count + 8 - 1) & ~(8 - 1); + //assert( ( count % 8 ) == 0 ); + this->m_pNetworkPlayer = pNetworkPlayer; + this->flags = new unsigned char [ count / 8 ]; + memset( this->flags, 0, count / 8 ); + this->count = count; +} +CPlatformNetworkManagerSony::PlayerFlags::~PlayerFlags() +{ + delete [] flags; +} + +// Add a player to the per system flag storage - if we've already got a player from that system, copy its flags over +void CPlatformNetworkManagerSony::SystemFlagAddPlayer(INetworkPlayer *pNetworkPlayer) +{ + PlayerFlags *newPlayerFlags = new PlayerFlags( pNetworkPlayer, m_flagIndexSize); + // If any of our existing players are on the same system, then copy over flags from that one + for( unsigned int i = 0; i < m_playerFlags.size(); i++ ) + { + if( pNetworkPlayer->IsSameSystem(m_playerFlags[i]->m_pNetworkPlayer) ) + { + memcpy( newPlayerFlags->flags, m_playerFlags[i]->flags, m_playerFlags[i]->count / 8 ); + break; + } + } + m_playerFlags.push_back(newPlayerFlags); +} + +// Remove a player from the per system flag storage - just maintains the m_playerFlags vector without any gaps in it +void CPlatformNetworkManagerSony::SystemFlagRemovePlayer(INetworkPlayer *pNetworkPlayer) +{ + for( unsigned int i = 0; i < m_playerFlags.size(); i++ ) + { + if( m_playerFlags[i]->m_pNetworkPlayer == pNetworkPlayer ) + { + delete m_playerFlags[i]; + m_playerFlags[i] = m_playerFlags.back(); + m_playerFlags.pop_back(); + return; + } + } +} + +void CPlatformNetworkManagerSony::SystemFlagReset() +{ + for( unsigned int i = 0; i < m_playerFlags.size(); i++ ) + { + delete m_playerFlags[i]; + } + m_playerFlags.clear(); +} + +// Set a per system flag - this is done by setting the flag on every player that shares that system +void CPlatformNetworkManagerSony::SystemFlagSet(INetworkPlayer *pNetworkPlayer, int index) +{ + if( ( index < 0 ) || ( index >= m_flagIndexSize ) ) return; + if( pNetworkPlayer == NULL ) return; + + for( unsigned int i = 0; i < m_playerFlags.size(); i++ ) + { + if( pNetworkPlayer->IsSameSystem(m_playerFlags[i]->m_pNetworkPlayer) ) + { + m_playerFlags[i]->flags[ index / 8 ] |= ( 128 >> ( index % 8 ) ); + } + } +} + +// Get value of a per system flag - can be read from the flags of the passed in player as anything else sent to that +// system should also have been duplicated here +bool CPlatformNetworkManagerSony::SystemFlagGet(INetworkPlayer *pNetworkPlayer, int index) +{ + if( ( index < 0 ) || ( index >= m_flagIndexSize ) ) return false; + if( pNetworkPlayer == NULL ) + { + return false; + } + + for( unsigned int i = 0; i < m_playerFlags.size(); i++ ) + { + if( m_playerFlags[i]->m_pNetworkPlayer == pNetworkPlayer ) + { + return ( ( m_playerFlags[i]->flags[ index / 8 ] & ( 128 >> ( index % 8 ) ) ) != 0 ); + } + } + return false; +} + +wstring CPlatformNetworkManagerSony::GatherStats() +{ +#if 0 + return L"Queue messages: " + _toString(((NetworkPlayerXbox *)GetHostPlayer())->GetQNetPlayer()->GetSendQueueSize( NULL, QNET_GETSENDQUEUESIZE_MESSAGES ) ) + + L" Queue bytes: " + _toString( ((NetworkPlayerXbox *)GetHostPlayer())->GetQNetPlayer()->GetSendQueueSize( NULL, QNET_GETSENDQUEUESIZE_BYTES ) ); +#else + return L""; +#endif +} + +wstring CPlatformNetworkManagerSony::GatherRTTStats() +{ +#if 0 + wstring stats(L"Rtt: "); + + wchar_t stat[32]; + + for(unsigned int i = 0; i < GetPlayerCount(); ++i) + { + SQRNetworkPlayer *pSQRPlayer = ((NetworkPlayerXbox *)GetPlayerByIndex( i ))->GetQNetPlayer(); + + if(!pSQRPlayer->IsLocal()) + { + ZeroMemory(stat,32); + swprintf(stat, 32, L"%d: %d/", i, pSQRPlayer->GetCurrentRtt() ); + stats.append(stat); + } + } + return stats; +#else + return L""; +#endif +} + +void CPlatformNetworkManagerSony::TickSearch() +{ + if( m_bSearchPending ) + { + if( !m_pSQRNet->FriendRoomManagerIsBusy() ) + { + m_searchResultsCount = m_pSQRNet->FriendRoomManagerGetCount(); + delete m_pSearchResults; + m_pSearchResults = new SQRNetworkManager::SessionSearchResult[m_searchResultsCount]; + + for( int i = 0; i < m_searchResultsCount; i++ ) + { + m_pSQRNet->FriendRoomManagerGetRoomInfo(i, &m_pSearchResults[i] ); + } + m_bSearchPending = false; + + if( m_SessionsUpdatedCallback != NULL ) m_SessionsUpdatedCallback(m_pSearchParam); + } + } + else + { + if( !m_pSQRNet->FriendRoomManagerIsBusy() ) + { + // Don't start searches unless we have registered a callback + int searchDelay = MINECRAFT_PS3ROOM_SEARCH_DELAY_MILLISECONDS; +#ifdef __PSVITA__ + // in adhoc mode we can keep searching, as the friend list is populated in callbacks + // 4J Stu - Every second seems a bit much as it makes the friend list flash every time it updates. Changed this to 5 seconds. + if( usingAdhocMode()) + searchDelay = 5000; +#endif + if( m_SessionsUpdatedCallback != NULL && (m_lastSearchStartTime + searchDelay) < GetTickCount() ) + { + if( m_pSQRNet->FriendRoomManagerSearch() ) + { + m_bSearchPending = true; + m_lastSearchStartTime = GetTickCount(); + } + } + } + } +} + +vector *CPlatformNetworkManagerSony::GetSessionList(int iPad, int localPlayers, bool partyOnly) +{ + vector *filteredList = new vector(); + for( int i = 0; i < m_searchResultsCount; i++ ) + { + if( m_pSearchResults[i].m_extData ) + { + FriendSessionInfo *newInfo = new FriendSessionInfo(); + newInfo->displayLabel = new wchar_t[17]; + ZeroMemory(newInfo->displayLabel, sizeof(wchar_t)*17); + // TODO - this mbstowcs shouldn't encounter any non-ascii characters, but I imagine we'll want to actually use the online name here which is UTF-8 + mbstowcs(newInfo->displayLabel, m_pSearchResults[i].m_NpId.handle.data, 17); + newInfo->displayLabelLength = strlen(m_pSearchResults[i].m_NpId.handle.data); + newInfo->hasPartyMember = false; + newInfo->searchResult = m_pSearchResults[i]; + newInfo->sessionId = m_pSearchResults[i].m_sessionId; + memcpy(&newInfo->data, m_pSearchResults[i].m_extData, sizeof(GameSessionData)); + if( ( newInfo->data.isReadyToJoin ) && + ( newInfo->data.isJoinable ) && + ( newInfo->data.netVersion == MINECRAFT_NET_VERSION ) ) + { + filteredList->push_back(newInfo); + } + else + { + delete newInfo; + } + } + } + + return filteredList; +} + +bool CPlatformNetworkManagerSony::GetGameSessionInfo(int iPad, SessionID sessionId, FriendSessionInfo *foundSessionInfo) +{ +#if 0 + HRESULT hr = E_FAIL; + + const XSESSION_SEARCHRESULT *pSearchResult; + const XNQOSINFO * pxnqi; + + if( m_currentSearchResultsCount[iPad] > 0 ) + { + // Loop through all the results. + for( DWORD dwResult = 0; dwResult < m_currentSearchResultsCount[iPad]; dwResult++ ) + { + pSearchResult = &m_pCurrentSearchResults[iPad]->pResults[dwResult]; + + if(memcmp( &pSearchResult->info.sessionID, &sessionId, sizeof(SessionID) ) != 0) continue; + + bool foundSession = false; + FriendSessionInfo *sessionInfo = NULL; + AUTO_VAR(itFriendSession, friendsSessions[iPad].begin()); + for(itFriendSession = friendsSessions[iPad].begin(); itFriendSession < friendsSessions[iPad].end(); ++itFriendSession) + { + sessionInfo = *itFriendSession; + if(memcmp( &pSearchResult->info.sessionID, &sessionInfo->sessionId, sizeof(SessionID) ) == 0) + { + sessionInfo->searchResult = *pSearchResult; + sessionInfo->displayLabel = new wchar_t[100]; + ZeroMemory( sessionInfo->displayLabel, 100 * sizeof(wchar_t) ); + foundSession = true; + break; + } + } + + // We received a search result for a session no longer in our list of friends sessions + if(!foundSession) break; + + // See if this result was contacted successfully via QoS probes. + pxnqi = &m_pCurrentQoSResult[iPad]->axnqosinfo[dwResult]; + if( pxnqi->bFlags & XNET_XNQOSINFO_TARGET_CONTACTED ) + { + + if(pxnqi->cbData > 0) + { + sessionInfo->data = *(GameSessionData *)pxnqi->pbData; + + wstring gamerName = convStringToWstring(sessionInfo->data.hostName); + swprintf(sessionInfo->displayLabel,app.GetString(IDS_GAME_HOST_NAME),L"MWWWWWWWWWWWWWWM");// gamerName.c_str() ); + } + else + { + swprintf(sessionInfo->displayLabel,app.GetString(IDS_GAME_HOST_NAME_UNKNOWN)); + } + sessionInfo->displayLabelLength = wcslen( sessionInfo->displayLabel ); + + // If this host wasn't disabled use this one. + if( !( pxnqi->bFlags & XNET_XNQOSINFO_TARGET_DISABLED ) && + sessionInfo->data.netVersion == MINECRAFT_NET_VERSION && + sessionInfo->data.isJoinable) + { + foundSessionInfo->data = sessionInfo->data; + if(foundSessionInfo->displayLabel != NULL) delete [] foundSessionInfo->displayLabel; + foundSessionInfo->displayLabel = new wchar_t[100]; + memcpy(foundSessionInfo->displayLabel, sessionInfo->displayLabel, 100 * sizeof(wchar_t) ); + foundSessionInfo->displayLabelLength = sessionInfo->displayLabelLength; + foundSessionInfo->hasPartyMember = sessionInfo->hasPartyMember; + foundSessionInfo->searchResult = sessionInfo->searchResult; + foundSessionInfo->sessionId = sessionInfo->sessionId; + + hr = S_OK; + } + } + } + } + + return ( hr == S_OK ); +#else + return false; +#endif +} + +void CPlatformNetworkManagerSony::SetSessionsUpdatedCallback( void (*SessionsUpdatedCallback)(LPVOID pParam), LPVOID pSearchParam ) +{ + m_SessionsUpdatedCallback = SessionsUpdatedCallback; m_pSearchParam = pSearchParam; +} + +void CPlatformNetworkManagerSony::GetFullFriendSessionInfo( FriendSessionInfo *foundSession, void (* FriendSessionUpdatedFn)(bool success, void *pParam), void *pParam ) +{ + m_pSQRNet->GetExtDataForRoom( foundSession->sessionId.m_RoomId, &foundSession->data, FriendSessionUpdatedFn, pParam); +} + +void CPlatformNetworkManagerSony::ForceFriendsSessionRefresh() +{ + app.DebugPrintf("Resetting friends session search data\n"); + m_lastSearchStartTime = 0; + m_searchResultsCount = 0; + delete m_pSearchResults; + m_pSearchResults = NULL; +} + +INetworkPlayer *CPlatformNetworkManagerSony::addNetworkPlayer(SQRNetworkPlayer *pSQRPlayer) +{ + NetworkPlayerSony *pNetworkPlayer = new NetworkPlayerSony(pSQRPlayer); + pSQRPlayer->SetCustomDataValue((ULONG_PTR)pNetworkPlayer); + currentNetworkPlayers.push_back( pNetworkPlayer ); + return pNetworkPlayer; +} + +void CPlatformNetworkManagerSony::removeNetworkPlayer(SQRNetworkPlayer *pSQRPlayer) +{ + INetworkPlayer *pNetworkPlayer = getNetworkPlayer(pSQRPlayer); + for( AUTO_VAR(it, currentNetworkPlayers.begin()); it != currentNetworkPlayers.end(); it++ ) + { + if( *it == pNetworkPlayer ) + { + currentNetworkPlayers.erase(it); + return; + } + } +} + +INetworkPlayer *CPlatformNetworkManagerSony::getNetworkPlayer(SQRNetworkPlayer *pSQRPlayer) +{ + return pSQRPlayer ? (INetworkPlayer *)(pSQRPlayer->GetCustomDataValue()) : NULL; +} + + +INetworkPlayer *CPlatformNetworkManagerSony::GetLocalPlayerByUserIndex(int userIndex ) +{ + return getNetworkPlayer(m_pSQRNet->GetLocalPlayerByUserIndex(userIndex)); +} + +INetworkPlayer *CPlatformNetworkManagerSony::GetPlayerByIndex(int playerIndex) +{ + return getNetworkPlayer(m_pSQRNet->GetPlayerByIndex(playerIndex)); +} + +INetworkPlayer * CPlatformNetworkManagerSony::GetPlayerByXuid(PlayerUID xuid) +{ + return getNetworkPlayer(m_pSQRNet->GetPlayerByXuid(xuid)); +} + +INetworkPlayer * CPlatformNetworkManagerSony::GetPlayerBySmallId(unsigned char smallId) +{ + return getNetworkPlayer(m_pSQRNet->GetPlayerBySmallId(smallId)); +} + +INetworkPlayer *CPlatformNetworkManagerSony::GetHostPlayer() +{ + return getNetworkPlayer(m_pSQRNet->GetHostPlayer()); +} + +bool CPlatformNetworkManagerSony::IsHost() +{ + return m_pSQRNet->IsHost() && !m_bHostChanged; +} + +bool CPlatformNetworkManagerSony::JoinGameFromInviteInfo( int userIndex, int userMask, const INVITE_INFO *pInviteInfo) +{ + return m_pSQRNet->JoinRoom( pInviteInfo->m_RoomId, pInviteInfo->m_ServerId, userMask, pInviteInfo ); +} + +void CPlatformNetworkManagerSony::SetSessionTexturePackParentId( int id ) +{ + m_hostGameSessionData.texturePackParentId = id; +} + +void CPlatformNetworkManagerSony::SetSessionSubTexturePackId( int id ) +{ + m_hostGameSessionData.subTexturePackId = id; +} + +void CPlatformNetworkManagerSony::Notify(int ID, ULONG_PTR Param) +{ +#if 0 + m_pSQRNet->Notify( ID, Param ); +#endif +} + +bool CPlatformNetworkManagerSony::IsInSession() +{ + return m_pSQRNet->IsInSession(); +} + +bool CPlatformNetworkManagerSony::IsInGameplay() +{ + return m_pSQRNet->GetState() == SQRNetworkManager::SNM_STATE_PLAYING; +} + +bool CPlatformNetworkManagerSony::IsReadyToPlayOrIdle() +{ + return m_pSQRNet->IsReadyToPlayOrIdle(); +} + +void CPlatformNetworkManagerSony::SetSQRPresenceInfoFromExtData(SQRNetworkManager::PresenceSyncInfo *presence, void *pExtData, SceNpMatching2RoomId roomId, SceNpMatching2ServerId serverId) +{ + GameSessionData *gsd = (GameSessionData *)pExtData; + + memcpy(&presence->hostPlayerUID, &gsd->hostPlayerUID, sizeof(GameSessionUID) ); + presence->m_RoomId = roomId; + presence->m_ServerId = serverId; + presence->texturePackParentId = gsd->texturePackParentId; + presence->subTexturePackId = gsd->subTexturePackId; + presence->netVersion = gsd->netVersion; + presence->inviteOnly = !gsd->isJoinable; +} + +void CPlatformNetworkManagerSony::MallocAndSetExtDataFromSQRPresenceInfo(void **pExtData, SQRNetworkManager::PresenceSyncInfo *presence) +{ + GameSessionData *gsd = (GameSessionData *)malloc(sizeof(GameSessionData)); + memset(gsd, 0, sizeof(GameSessionData)); + if( presence->netVersion != 0 ) + { + memcpy(&gsd->hostPlayerUID, &presence->hostPlayerUID, sizeof(GameSessionUID) ); + gsd->texturePackParentId = presence->texturePackParentId; + gsd->subTexturePackId = presence->subTexturePackId; + gsd->netVersion = presence->netVersion; + gsd->isJoinable = !presence->inviteOnly; + gsd->isReadyToJoin = true; + } + *pExtData = gsd; +} + +#ifdef __PSVITA__ +bool CPlatformNetworkManagerSony::setAdhocMode( bool bAdhoc ) +{ + if(m_bUsingAdhocMode != bAdhoc) + { + m_bUsingAdhocMode = bAdhoc; + if(m_bUsingAdhocMode) + { + // uninit the PSN, and init adhoc + if(m_pSQRNet_Vita->IsInitialised()) + { + m_pSQRNet_Vita->UnInitialise(); + } + + if(m_pSQRNet_Vita_Adhoc->IsInitialised()==false) + { + m_pSQRNet_Vita_Adhoc->Initialise(); + } + + m_pSQRNet = m_pSQRNet_Vita_Adhoc; + } + else + { + if(m_pSQRNet_Vita_Adhoc->IsInitialised()) + { + int ret = sceNetCtlAdhocDisconnect(); + // uninit the adhoc, and init psn + m_pSQRNet_Vita_Adhoc->UnInitialise(); + } + + if(m_pSQRNet_Vita->IsInitialised()==false) + { + m_pSQRNet_Vita->Initialise(); + } + + m_pSQRNet = m_pSQRNet_Vita; + } + } + + return true; +} + +void CPlatformNetworkManagerSony::startAdhocMatching( ) +{ + assert(m_pSQRNet == m_pSQRNet_Vita_Adhoc); + ((SQRNetworkManager_AdHoc_Vita*)m_pSQRNet_Vita_Adhoc)->startMatching(); +} + +bool CPlatformNetworkManagerSony::checkValidInviteData(const INVITE_INFO* pInviteInfo) +{ + 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; + } + else + { + return true; + } +} + + + +#endif // __PSVITA__ diff --git a/Minecraft.Client/Common/Network/Sony/PlatformNetworkManagerSony.h b/Minecraft.Client/Common/Network/Sony/PlatformNetworkManagerSony.h new file mode 100644 index 00000000..258acd83 --- /dev/null +++ b/Minecraft.Client/Common/Network/Sony/PlatformNetworkManagerSony.h @@ -0,0 +1,187 @@ +#pragma once +using namespace std; +#include +#include "..\..\..\Minecraft.World\C4JThread.h" +#include "..\..\Common\Network\NetworkPlayerInterface.h" +#include "..\..\Common\Network\PlatformNetworkManagerInterface.h" +#include "..\..\Common\Network\SessionInfo.h" +#include "SQRNetworkPlayer.h" + +// This is how often we allow a search for new games +#define MINECRAFT_PS3ROOM_SEARCH_DELAY_MILLISECONDS 30000 + +// This is the Sony platform specific implementation of CPlatformNetworkManager. It is implemented using SQRNetworkManager/SQRNetworkPlayer. There shouldn't be any general game code in here, +// this class is for providing a bridge between the common game-side network implementation, and the lowest level platform specific libraries. + +class CPlatformNetworkManagerSony : public CPlatformNetworkManager, ISQRNetworkManagerListener +{ + friend class CGameNetworkManager; +public: + virtual bool Initialise(CGameNetworkManager *pGameNetworkManager, int flagIndexSize); + virtual void Terminate(); + virtual int GetJoiningReadyPercentage(); + virtual int CorrectErrorIDS(int IDS); + + virtual void DoWork(); + virtual int GetPlayerCount(); + virtual int GetOnlinePlayerCount(); + virtual int GetLocalPlayerMask(int playerIndex); + virtual bool AddLocalPlayerByUserIndex( int userIndex ); + virtual bool RemoveLocalPlayerByUserIndex( int userIndex ); + virtual INetworkPlayer *GetLocalPlayerByUserIndex( int userIndex ); + virtual INetworkPlayer *GetPlayerByIndex(int playerIndex); + virtual INetworkPlayer * GetPlayerByXuid(PlayerUID xuid); + virtual INetworkPlayer * GetPlayerBySmallId(unsigned char smallId); + virtual bool ShouldMessageForFullSession(); + + virtual INetworkPlayer *GetHostPlayer(); + virtual bool IsHost(); + virtual bool JoinGameFromInviteInfo( int userIndex, int userMask, const INVITE_INFO *pInviteInfo); + virtual bool LeaveGame(bool bMigrateHost); + + virtual bool IsInSession(); + virtual bool IsInGameplay(); + virtual bool IsReadyToPlayOrIdle(); + virtual bool IsInStatsEnabledSession(); + virtual bool SessionHasSpace(unsigned int spaceRequired = 1); + + virtual void SendInviteGUI(int quadrant); + virtual bool IsAddingPlayer(); + + virtual void HostGame(int localUsersMask, bool bOnlineGame, bool bIsPrivate, unsigned char publicSlots = MINECRAFT_NET_MAX_PLAYERS, unsigned char privateSlots = 0); + virtual int JoinGame(FriendSessionInfo *searchResult, int localUsersMask, int primaryUserIndex ); + virtual bool SetLocalGame(bool isLocal); + virtual bool IsLocalGame(); + virtual void SetPrivateGame(bool isPrivate); + virtual bool IsPrivateGame(); + virtual bool IsLeavingGame(); + virtual void ResetLeavingGame(); + + virtual void RegisterPlayerChangedCallback(int iPad, void (*callback)(void *callbackParam, INetworkPlayer *pPlayer, bool leaving), void *callbackParam); + virtual void UnRegisterPlayerChangedCallback(int iPad, void (*callback)(void *callbackParam, INetworkPlayer *pPlayer, bool leaving), void *callbackParam); + + virtual void HandleSignInChange(); + + virtual bool _RunNetworkGame(); + +#ifdef __PSVITA__ + bool usingAdhocMode() { return m_bUsingAdhocMode; } + bool setAdhocMode(bool bAdhoc); + void startAdhocMatching(); + bool checkValidInviteData(const INVITE_INFO* pInviteInfo); +#endif + +private: + bool isSystemPrimaryPlayer(SQRNetworkPlayer *pQNetPlayer); + virtual bool _LeaveGame(bool bMigrateHost, bool bLeaveRoom); + virtual void _HostGame(int dwUsersMask, unsigned char publicSlots = MINECRAFT_NET_MAX_PLAYERS, unsigned char privateSlots = 0); + virtual bool _StartGame(); + +#ifdef __PSVITA__ + bool m_bUsingAdhocMode; + SQRNetworkManager_Vita* m_pSQRNet_Vita; + SQRNetworkManager_AdHoc_Vita* m_pSQRNet_Vita_Adhoc; +#endif + SQRNetworkManager * m_pSQRNet; // pointer to SQRNetworkManager interface + + HANDLE m_notificationListener; + + vector m_machineSQRPrimaryPlayers; // collection of players that we deem to be the main one for that system + + bool m_bLeavingGame; + bool m_bLeaveGameOnTick; + bool m_migrateHostOnLeave; + bool m_bHostChanged; + bool m_bLeaveRoomWhenLeavingGame; + + bool m_bIsOfflineGame; + bool m_bIsPrivateGame; + int m_flagIndexSize; + + // This is only maintained by the host, and is not valid on client machines + GameSessionData m_hostGameSessionData; + CGameNetworkManager *m_pGameNetworkManager; +public: + virtual void UpdateAndSetGameSessionData(INetworkPlayer *pNetworkPlayerLeaving = NULL); + +private: + // TODO 4J Stu - Do we need to be able to have more than one of these? + void (*playerChangedCallback[XUSER_MAX_COUNT])(void *callbackParam, INetworkPlayer *pPlayer, bool leaving); + void *playerChangedCallbackParam[XUSER_MAX_COUNT]; + + static int RemovePlayerOnSocketClosedThreadProc( void* lpParam ); + virtual bool RemoveLocalPlayer( INetworkPlayer *pNetworkPlayer ); + + // Things for handling per-system flags + class PlayerFlags + { + public: + INetworkPlayer *m_pNetworkPlayer; + unsigned char *flags; + unsigned int count; + PlayerFlags(INetworkPlayer *pNetworkPlayer, unsigned int count); + ~PlayerFlags(); + }; + vector m_playerFlags; + void SystemFlagAddPlayer(INetworkPlayer *pNetworkPlayer); + void SystemFlagRemovePlayer(INetworkPlayer *pNetworkPlayer); + void SystemFlagReset(); +public: + virtual void SystemFlagSet(INetworkPlayer *pNetworkPlayer, int index); + virtual bool SystemFlagGet(INetworkPlayer *pNetworkPlayer, int index); + + // For telemetry +private: + float m_lastPlayerEventTimeStart; + +public: + wstring GatherStats(); + wstring GatherRTTStats(); + +private: + vector friendsSessions; + + int m_lastSearchStartTime; + + // The results that will be filled in with the current search + int m_searchResultsCount; + SQRNetworkManager::SessionSearchResult *m_pSearchResults; + + int m_lastSearchPad; + bool m_bSearchPending; + LPVOID m_pSearchParam; + void (*m_SessionsUpdatedCallback)(LPVOID pParam); + + C4JThread* m_SearchingThread; + + void TickSearch(); + + vectorcurrentNetworkPlayers; + INetworkPlayer *addNetworkPlayer(SQRNetworkPlayer *pSQRPlayer); + void removeNetworkPlayer(SQRNetworkPlayer *pSQRPlayer); + static INetworkPlayer *getNetworkPlayer(SQRNetworkPlayer *pSQRPlayer); + + virtual void SetSessionTexturePackParentId( int id ); + virtual void SetSessionSubTexturePackId( int id ); + virtual void Notify(int ID, ULONG_PTR Param); + +public: + virtual vector *GetSessionList(int iPad, int localPlayers, bool partyOnly); + virtual bool GetGameSessionInfo(int iPad, SessionID sessionId,FriendSessionInfo *foundSession); + virtual void SetSessionsUpdatedCallback( void (*SessionsUpdatedCallback)(LPVOID pParam), LPVOID pSearchParam ); + virtual void GetFullFriendSessionInfo( FriendSessionInfo *foundSession, void (* FriendSessionUpdatedFn)(bool success, void *pParam), void *pParam ); + virtual void ForceFriendsSessionRefresh(); + + // ... and the new ones that have been converted to ISQRNetworkManagerListener + virtual void HandleDataReceived(SQRNetworkPlayer *playerFrom, SQRNetworkPlayer *playerTo, unsigned char *data, unsigned int dataSize); + virtual void HandlePlayerJoined(SQRNetworkPlayer *player); + virtual void HandlePlayerLeaving(SQRNetworkPlayer *player); + virtual void HandleStateChange(SQRNetworkManager::eSQRNetworkManagerState oldState, SQRNetworkManager::eSQRNetworkManagerState newState, bool idleReasonIsSessionFull); + virtual void HandleResyncPlayerRequest(SQRNetworkPlayer **aPlayers); + virtual void HandleAddLocalPlayerFailed(int idx); + virtual void HandleDisconnect(bool bLostRoomOnly,bool bPSNSignOut=false); + virtual void HandleInviteReceived( int userIndex, const SQRNetworkManager::PresenceSyncInfo *pInviteInfo); + + static void SetSQRPresenceInfoFromExtData(SQRNetworkManager::PresenceSyncInfo *presence, void *pExtData, SceNpMatching2RoomId roomId, SceNpMatching2ServerId serverId); + static void MallocAndSetExtDataFromSQRPresenceInfo(void **pExtData, SQRNetworkManager::PresenceSyncInfo *presence); +}; diff --git a/Minecraft.Client/Common/Network/Sony/SQRNetworkManager.cpp b/Minecraft.Client/Common/Network/Sony/SQRNetworkManager.cpp new file mode 100644 index 00000000..f23a0a63 --- /dev/null +++ b/Minecraft.Client/Common/Network/Sony/SQRNetworkManager.cpp @@ -0,0 +1,83 @@ +#include "stdafx.h" + +#include "SQRNetworkManager.h" + +bool SQRNetworkManager::s_safeToRespondToGameBootInvite = false; + +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 new file mode 100644 index 00000000..e3f15aca --- /dev/null +++ b/Minecraft.Client/Common/Network/Sony/SQRNetworkManager.h @@ -0,0 +1,327 @@ +#pragma once +#include +#ifdef __PS3__ +#include +#include +#else +#include +#include +#include +#endif +#include + +#include +#if defined __PSVITA__ +#include "..\..\Minecraft.Client\PSVita\4JLibs\inc\4J_Profile.h" +#endif + +class SQRNetworkPlayer; +class ISQRNetworkManagerListener; +class SonyVoiceChat; +class C4JThread; + +// This is the lowest level manager for providing network functionality on Sony platforms. This manages various network activities including the players within a gaming session. +// The game shouldn't directly use this class, it is here to provide functionality required by PlatformNetworkManagerSony. + +class SQRNetworkManager +{ +public: + static const int MAX_LOCAL_PLAYER_COUNT = XUSER_MAX_COUNT; + static const int MAX_ONLINE_PLAYER_COUNT = MINECRAFT_NET_MAX_PLAYERS; + + static const int NP_POOL_SIZE = 128 * 1024; +protected: + friend class SQRNetworkPlayer; + friend class SonyVoiceChat; +#ifdef __PSVITA__ + friend class HelloSyncInfo; +#endif + + static const int MAX_FRIENDS = 100; +#ifdef __PS3__ + static const int RUDP_THREAD_PRIORITY = 999; +#else // __ORBIS_ + static const int RUDP_THREAD_PRIORITY = 500; +#endif + static const int RUDP_THREAD_STACK_SIZE = 32878; + static const int MAX_SIMULTANEOUS_INVITES = 10; + + + // This class stores everything about a player that must be synchronised between machines. This syncing is carried out + // by the Matching2 lib by using internal room binary data (ie data that is only visible to current members of a room) + class PlayerSyncData + { + public: + PlayerUID m_UID; // Assigned by the associated player->GetUID() + SceNpMatching2RoomMemberId m_roomMemberId; // Assigned by Matching2 lib, we can use to indicate which machine this player belongs to (note - 16 bits) + unsigned char m_smallId; // Assigned by SQRNetworkManager, to attach a permanent id to this player (until we have to wrap round), to match a similar concept in qnet + unsigned char m_localIdx : 4; // Which local player (by controller index) this represents + unsigned char m_playerCount : 4; + }; + + class RoomSyncData + { + public: + PlayerSyncData players[MAX_ONLINE_PLAYER_COUNT]; + void setPlayerCount(int c) { players[0].m_playerCount = c;} + int getPlayerCount() { return players[0].m_playerCount;} + }; + +public: + class PresenceSyncInfo + { + public: + GameSessionUID hostPlayerUID; + SceNpMatching2RoomId m_RoomId; + SceNpMatching2ServerId m_ServerId; + unsigned int texturePackParentId; + unsigned short netVersion; + unsigned char subTexturePackId; + bool inviteOnly; + }; + + + // Externally exposed state. All internal states are mapped to one of these broader states. + typedef enum + { + SNM_STATE_INITIALISING, + SNM_STATE_INITIALISE_FAILED, + SNM_STATE_IDLE, + + SNM_STATE_HOSTING, + SNM_STATE_JOINING, + + SNM_STATE_STARTING, + SNM_STATE_PLAYING, + + SNM_STATE_LEAVING, + SNM_STATE_ENDING, + } eSQRNetworkManagerState; + + struct SessionID + { + SceNpMatching2RoomId m_RoomId; + SceNpMatching2ServerId m_ServerId; + }; + + struct SessionSearchResult + { + SceNpId m_NpId; + SessionID m_sessionId; + void *m_extData; +#ifdef __PSVITA__ + SceNetInAddr m_netAddr; +#endif + }; + +protected: + + // On initialisation, state should transition from SNM_INT_STATE_UNINITIALISED -> SNM_INT_STATE_SIGNING_IN -> SNM_INT_STATE_SIGNED_IN -> SNM_INT_STATE_STARTING_CONTEXT -> SNM_INT_STATE_IDLE. + // Error indicated if we transition at any point to SNM_INT_STATE_INITIALISE_FAILED. + + // NOTE: If anything changes in here, then the mapping from internal -> external state needs to be updated (m_INTtoEXTStateMappings, defined in the cpp file) + typedef enum + { + SNM_INT_STATE_UNINITIALISED, + SNM_INT_STATE_SIGNING_IN, + SNM_INT_STATE_STARTING_CONTEXT, + SNM_INT_STATE_INITIALISE_FAILED, + + SNM_INT_STATE_IDLE, + SNM_INT_STATE_IDLE_RECREATING_MATCHING_CONTEXT, + + SNM_INT_STATE_HOSTING_STARTING_MATCHING_CONTEXT, + SNM_INT_STATE_HOSTING_SEARCHING_FOR_SERVER, + SNM_INT_STATE_HOSTING_SERVER_SEARCH_SERVER_ERROR, + SNM_INT_STATE_HOSTING_SERVER_FOUND, + SNM_INT_STATE_HOSTING_SERVER_SEARCH_CREATING_CONTEXT, + SNM_INT_STATE_HOSTING_SERVER_SEARCH_FAILED, + + SNM_INT_STATE_HOSTING_CREATE_ROOM_SEARCHING_FOR_WORLD, + SNM_INT_STATE_HOSTING_CREATE_ROOM_WORLD_FOUND, + SNM_INT_STATE_HOSTING_CREATE_ROOM_CREATING_ROOM, + SNM_INT_STATE_HOSTING_CREATE_ROOM_SUCCESS, + SNM_INT_STATE_HOSTING_CREATE_ROOM_FAILED, + SNM_INT_STATE_HOSTING_CREATE_ROOM_RESTART_MATCHING_CONTEXT, + SNM_INT_STATE_HOSTING_WAITING_TO_PLAY, + + SNM_INT_STATE_JOINING_STARTING_MATCHING_CONTEXT, + SNM_INT_STATE_JOINING_SEARCHING_FOR_SERVER, + SNM_INT_STATE_JOINING_SERVER_SEARCH_SERVER_ERROR, + SNM_INT_STATE_JOINING_SERVER_FOUND, + SNM_INT_STATE_JOINING_SERVER_SEARCH_CREATING_CONTEXT, + SNM_INT_STATE_JOINING_SERVER_SEARCH_FAILED, + + SNM_INT_STATE_JOINING_JOIN_ROOM, + SNM_INT_STATE_JOINING_JOIN_ROOM_FAILED, + + SNM_INT_STATE_JOINING_WAITING_FOR_LOCAL_PLAYERS, + + SNM_INT_STATE_SERVER_DELETING_CONTEXT, + + SNM_INT_STATE_STARTING, + SNM_INT_STATE_PLAYING, + + SNM_INT_STATE_LEAVING, + SNM_INT_STATE_LEAVING_FAILED, + + SNM_INT_STATE_ENDING, + + SNM_INT_STATE_COUNT + + } eSQRNetworkManagerInternalState; + + typedef enum + { + SNM_FORCE_ERROR_NP2_INIT, + SNM_FORCE_ERROR_NET_INITIALIZE_NETWORK, + SNM_FORCE_ERROR_NET_CTL_INIT, + SNM_FORCE_ERROR_RUDP_INIT, + SNM_FORCE_ERROR_NET_START_DIALOG, + SNM_FORCE_ERROR_MATCHING2_INIT, + SNM_FORCE_ERROR_REGISTER_NP_CALLBACK, + SNM_FORCE_ERROR_GET_NPID, + SNM_FORCE_ERROR_CREATE_MATCHING_CONTEXT, + SNM_FORCE_ERROR_REGISTER_CALLBACKS, + SNM_FORCE_ERROR_CONTEXT_START_ASYNC, + SNM_FORCE_ERROR_SET_EXTERNAL_ROOM_DATA, + SNM_FORCE_ERROR_GET_FRIEND_LIST_ENTRY_COUNT, + SNM_FORCE_ERROR_GET_FRIEND_LIST_ENTRY, + SNM_FORCE_ERROR_GET_USER_INFO_LIST, + SNM_FORCE_ERROR_LEAVE_ROOM, + SNM_FORCE_ERROR_SET_ROOM_MEMBER_DATA_INTERNAL, + SNM_FORCE_ERROR_SET_ROOM_MEMBER_DATA_INTERNAL2, + SNM_FORCE_ERROR_CREATE_SERVER_CONTEXT, + SNM_FORCE_ERROR_CREATE_JOIN_ROOM, + SNM_FORCE_ERROR_GET_SERVER_INFO, + SNM_FORCE_ERROR_DELETE_SERVER_CONTEXT, + SNM_FORCE_ERROR_SETSOCKOPT_0, + SNM_FORCE_ERROR_SETSOCKOPT_1, + SNM_FORCE_ERROR_SETSOCKOPT_2, + SNM_FORCE_ERROR_SOCK_BIND, + SNM_FORCE_ERROR_CREATE_RUDP_CONTEXT, + SNM_FORCE_ERROR_RUDP_BIND, + SNM_FORCE_ERROR_RUDP_INIT2, + SNM_FORCE_ERROR_GET_ROOM_EXTERNAL_DATA, + SNM_FORCE_ERROR_GET_SERVER_INFO_DATA, + SNM_FORCE_ERROR_GET_WORLD_INFO_DATA, + SNM_FORCE_ERROR_GET_CREATE_JOIN_ROOM_DATA, + SNM_FORCE_ERROR_GET_USER_INFO_LIST_DATA, + SNM_FORCE_ERROR_GET_JOIN_ROOM_DATA, + SNM_FORCE_ERROR_GET_ROOM_MEMBER_DATA_INTERNAL, + SNM_FORCE_ERROR_GET_ROOM_EXTERNAL_DATA2, + SNM_FORCE_ERROR_CREATE_SERVER_CONTEXT_CALLBACK, + SNM_FORCE_ERROR_SET_ROOM_DATA_CALLBACK, + SNM_FORCE_ERROR_UPDATED_ROOM_DATA, + SNM_FORCE_ERROR_UPDATED_ROOM_MEMBER_DATA_INTERNAL1, + SNM_FORCE_ERROR_UPDATED_ROOM_MEMBER_DATA_INTERNAL2, + SNM_FORCE_ERROR_UPDATED_ROOM_MEMBER_DATA_INTERNAL3, + SNM_FORCE_ERROR_UPDATED_ROOM_MEMBER_DATA_INTERNAL4, + SNM_FORCE_ERROR_GET_WORLD_INFO_LIST, + SNM_FORCE_ERROR_JOIN_ROOM, + + SNM_FORCE_ERROR_COUNT, + } eSQRForceError; + + + class StateChangeInfo + { + public: + eSQRNetworkManagerState m_oldState; + eSQRNetworkManagerState m_newState; + bool m_idleReasonIsSessionFull; + StateChangeInfo(eSQRNetworkManagerState oldState, eSQRNetworkManagerState newState,bool idleReasonIsSessionFull) : m_oldState(oldState), m_newState(newState), m_idleReasonIsSessionFull(idleReasonIsSessionFull) {} + }; + + std::queue m_stateChangeQueue; + CRITICAL_SECTION m_csStateChangeQueue; + CRITICAL_SECTION m_csMatching; + CRITICAL_SECTION m_csAckQueue; + std::queue m_queuedAckRequests; + + typedef enum + { + SNM_FRIEND_SEARCH_STATE_IDLE, // Idle - search result will be valid (although it may not have any entries) + SNM_FRIEND_SEARCH_STATE_GETTING_FRIEND_COUNT, // Getting count of friends in friend list + SNM_FRIEND_SEARCH_STATE_GETTING_FRIEND_INFO, // Getting presence/NpId info for each friend + } eSQRNetworkManagerFriendSearchState; + + typedef void (*ServerContextValidCallback)(SQRNetworkManager *manager); + + static bool s_safeToRespondToGameBootInvite; + +public: + + // General + virtual void Tick() = 0; + virtual void Initialise() = 0; +#ifdef __PSVITA__ + virtual void UnInitialise() = 0; // to switch from PSN to Adhoc + virtual bool IsInitialised() = 0; +#endif + virtual void Terminate() = 0; + virtual eSQRNetworkManagerState GetState() = 0; + virtual bool IsHost() = 0; + virtual bool IsReadyToPlayOrIdle() = 0; + virtual bool IsInSession() = 0; + + // Session management + virtual void CreateAndJoinRoom(int hostIndex, int localPlayerMask, void *extData, int extDataSize, bool offline) = 0; + virtual void UpdateExternalRoomData() = 0; + virtual bool FriendRoomManagerIsBusy() = 0; + virtual bool FriendRoomManagerSearch() = 0; + virtual bool FriendRoomManagerSearch2() = 0; + virtual int FriendRoomManagerGetCount() = 0; + virtual void FriendRoomManagerGetRoomInfo(int idx, SessionSearchResult *searchResult) = 0; + virtual bool JoinRoom(SessionSearchResult *searchResult, int localPlayerMask) = 0; + virtual bool JoinRoom(SceNpMatching2RoomId roomId, SceNpMatching2ServerId serverId, int localPlayerMask, const SQRNetworkManager::PresenceSyncInfo *presence) = 0; + virtual void StartGame() = 0; + virtual void LeaveRoom(bool bActuallyLeaveRoom) = 0; + virtual void EndGame() = 0; + virtual bool SessionHasSpace(int spaceRequired) = 0; + virtual bool AddLocalPlayerByUserIndex(int idx) = 0; + virtual bool RemoveLocalPlayerByUserIndex(int idx) = 0; + virtual void SendInviteGUI() = 0; + + virtual void GetExtDataForRoom( SceNpMatching2RoomId roomId, void *extData, void (* FriendSessionUpdatedFn)(bool success, void *pParam), void *pParam ) = 0; + + // Player retrieval + virtual int GetPlayerCount() = 0; + virtual int GetOnlinePlayerCount() = 0; + virtual SQRNetworkPlayer *GetPlayerByIndex(int idx) = 0; + virtual SQRNetworkPlayer *GetPlayerBySmallId(int idx) = 0; + virtual SQRNetworkPlayer *GetPlayerByXuid(PlayerUID xuid) = 0; + virtual SQRNetworkPlayer *GetLocalPlayerByUserIndex(int idx) = 0; + virtual SQRNetworkPlayer *GetHostPlayer() = 0; + + virtual void SetPresenceDataStartHostingGame() = 0; + virtual int GetJoiningReadyPercentage() = 0; + + virtual void LocalDataSend(SQRNetworkPlayer *playerFrom, SQRNetworkPlayer *playerTo, const void *data, unsigned int dataSize) = 0; + virtual int GetSessionIndex(SQRNetworkPlayer *player) = 0; + + static void SafeToRespondToGameBootInvite(); + + int GetOutstandingAckCount(SQRNetworkPlayer *pSonyPlayer); + int GetSendQueueSizeBytes(); + int GetSendQueueSizeMessages(); + void RequestWriteAck(int smallId); + void TickWriteAcks(); + + +}; + + +// Class defining interface to be implemented for class that handles callbacks +class ISQRNetworkManagerListener +{ +public: + virtual void HandleDataReceived(SQRNetworkPlayer *playerFrom, SQRNetworkPlayer *playerTo, unsigned char *data, unsigned int dataSize) = 0; + virtual void HandlePlayerJoined(SQRNetworkPlayer *player) = 0; + virtual void HandlePlayerLeaving(SQRNetworkPlayer *player) = 0; + virtual void HandleStateChange(SQRNetworkManager::eSQRNetworkManagerState oldState, SQRNetworkManager::eSQRNetworkManagerState newState, bool idleReasonIsSessionFull) = 0; + virtual void HandleResyncPlayerRequest(SQRNetworkPlayer **aPlayers) = 0; + virtual void HandleAddLocalPlayerFailed(int idx) = 0; + virtual void HandleDisconnect(bool bLostRoomOnly,bool bPSNSignOut=false) = 0; + virtual void HandleInviteReceived( int userIndex, const SQRNetworkManager::PresenceSyncInfo *pInviteInfo) = 0; +}; diff --git a/Minecraft.Client/Common/Network/Sony/SQRNetworkPlayer.cpp b/Minecraft.Client/Common/Network/Sony/SQRNetworkPlayer.cpp new file mode 100644 index 00000000..a040b28b --- /dev/null +++ b/Minecraft.Client/Common/Network/Sony/SQRNetworkPlayer.cpp @@ -0,0 +1,611 @@ +#include "stdafx.h" +#include "SQRNetworkPlayer.h" + +#ifdef __PS3__ +#include +#include "PS3/Network/SonyVoiceChat.h" + +#elif defined __ORBIS__ +#include +#include "Orbis/Network/SonyVoiceChat_Orbis.h" + +#else // __PSVITA__ +#include +#include +#include "PSVita/Network/SonyVoiceChat_Vita.h" + +#endif + +//#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; + +int SQRNetworkPlayer::GetSmallId() +{ + return m_ISD.m_smallId; +} + +wchar_t *SQRNetworkPlayer::GetName() +{ + return m_name; +} + +bool SQRNetworkPlayer::IsRemote() +{ + return !IsLocal(); +} + +bool SQRNetworkPlayer::IsHost() +{ + return (m_type == SNP_TYPE_HOST); +} + +bool SQRNetworkPlayer::IsLocal() +{ + // m_host determines whether this *machine* is hosting the game, not this player (which is determined by m_type) + if( m_host ) + { + // If we are the hosting machine, then both the host & local players are local to this machine + return (m_type == SNP_TYPE_HOST) || (m_type == SNP_TYPE_LOCAL); + } + else + { + // Not hosting, just local players are actually physically local + return (m_type == SNP_TYPE_LOCAL) ; + } +} + +int SQRNetworkPlayer::GetLocalPlayerIndex() +{ + return m_localPlayerIdx; +} + +bool SQRNetworkPlayer::IsSameSystem(SQRNetworkPlayer *other) +{ + return (m_roomMemberId == other->m_roomMemberId); +} + +uintptr_t SQRNetworkPlayer::GetCustomDataValue() +{ + return m_customData; +} + +void SQRNetworkPlayer::SetCustomDataValue(uintptr_t data) +{ + m_customData = data; +} + +SQRNetworkPlayer::SQRNetworkPlayer(SQRNetworkManager *manager, eSQRNetworkPlayerType playerType, bool onHost, SceNpMatching2RoomMemberId roomMemberId, int localPlayerIdx, int rudpCtx, PlayerUID *pUID) +{ + m_roomMemberId = roomMemberId; + m_localPlayerIdx = localPlayerIdx; + m_rudpCtx = rudpCtx; + m_flags = 0; + m_type = playerType; + m_host = onHost; + m_manager = manager; + m_customData = 0; + m_acksOutstanding = 0; + m_totalBytesInSendQueue = 0; + if( pUID ) + { + memcpy(&m_ISD.m_UID,pUID,sizeof(PlayerUID)); +#ifdef __PSVITA__ + if(CGameNetworkManager::usingAdhocMode() && pUID->getOnlineID()[0] == 0) + { + assert(localPlayerIdx == 0); + // player doesn't have an online UID, set it from the player name + m_ISD.m_UID.setForAdhoc(); + } +#endif // __PSVITA__ + } + else + { + memset(&m_ISD.m_UID,0,sizeof(PlayerUID)); + } + SetNameFromUID(); + InitializeCriticalSection(&m_csQueue); + InitializeCriticalSection(&m_csAcks); +#ifdef __ORBIS__ + if(IsLocal()) + { + SonyVoiceChat_Orbis::initLocalPlayer(m_localPlayerIdx); + } +#endif + +#ifndef _CONTENT_PACKAGE + m_minAckTime = INT_MAX; + m_maxAckTime = 0; + m_totalAcks = 0; + m_totalAckTime = 0; + m_averageAckTime = 0; +#endif + +} + +SQRNetworkPlayer::~SQRNetworkPlayer() +{ +#ifdef __ORBIS__ + SQRNetworkManager_Orbis* pMan = (SQRNetworkManager_Orbis*)m_manager; +// pMan->removePlayerFromVoiceChat(this); +// m_roomMemberId = -1; +#endif + DeleteCriticalSection(&m_csQueue); +} + +bool SQRNetworkPlayer::IsReady() +{ + return ( ( m_flags & SNP_FLAG_READY_MASK ) == SNP_FLAG_READY_MASK ); +} + +PlayerUID SQRNetworkPlayer::GetUID() +{ + return m_ISD.m_UID; +} + +void SQRNetworkPlayer::SetUID(PlayerUID UID) +{ + m_ISD.m_UID = UID; + SetNameFromUID(); +} + +bool SQRNetworkPlayer::HasConnectionAndSmallId() +{ + const int reqFlags = ( SNP_FLAG_CONNECTION_COMPLETE | SNP_FLAG_SMALLID_ALLOCATED ); + return (( m_flags & reqFlags) == reqFlags); +} + +void SQRNetworkPlayer::ConnectionComplete() +{ + m_host ? app.DebugPrintf(sc_verbose, "host : ") : app.DebugPrintf(sc_verbose, "client:"); + app.DebugPrintf(sc_verbose, ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ConnectionComplete\n"); + m_flags |= SNP_FLAG_CONNECTION_COMPLETE; +} + +void SQRNetworkPlayer::SmallIdAllocated(unsigned char smallId) +{ + m_ISD.m_smallId = smallId; + m_flags |= SNP_FLAG_SMALLID_ALLOCATED; + m_host ? app.DebugPrintf(sc_verbose, "host : ") : app.DebugPrintf(sc_verbose, "client:"); + app.DebugPrintf(sc_verbose, ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Small ID allocated\n"); + + + // If this is a non-network sort of player then flag now as having its small id confirmed + if( ( m_type == SNP_TYPE_HOST ) || + ( m_host && ( m_type == SNP_TYPE_LOCAL ) ) || + ( !m_host && ( m_type == SNP_TYPE_REMOTE ) ) ) + { + m_host ? app.DebugPrintf(sc_verbose, "host : ") : app.DebugPrintf(sc_verbose, "client:"); + app.DebugPrintf(sc_verbose, ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Small ID confirmed\n"); + + m_flags |= SNP_FLAG_SMALLID_CONFIRMED; + } +} + +void SQRNetworkPlayer::InitialDataReceived(SQRNetworkPlayer::InitSendData *ISD) +{ + assert(m_ISD.m_smallId == ISD->m_smallId); + memcpy(&m_ISD, ISD, sizeof(InitSendData) ); +#ifdef __PSVITA__ + SetNameFromUID(); +#endif + m_host ? app.DebugPrintf(sc_verbose, "host : ") : app.DebugPrintf(sc_verbose, "client:"); + app.DebugPrintf(sc_verbose, ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Small ID confirmed\n"); + m_flags |= SNP_FLAG_SMALLID_CONFIRMED; +} + +bool SQRNetworkPlayer::HasSmallIdConfirmed() +{ + return ( m_flags & SNP_FLAG_SMALLID_CONFIRMED ); +} + +// To confirm to the host that we are ready, send a single byte with our small id. +void SQRNetworkPlayer::ConfirmReady() +{ + 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"); + m_flags |= SNP_FLAG_SMALLID_CONFIRMED; +} + +// Attempt to send data, of any size, from this player to that specified by pPlayerTarget. This may not be possible depending on the two players, due to +// our star shaped network connectivity. Data may be any size, and is copied so on returning from this method it does not need to be preserved. +void SQRNetworkPlayer::SendData( SQRNetworkPlayer *pPlayerTarget, const void *data, unsigned int dataSize, 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 ) + { + if( ( m_type == SNP_TYPE_HOST ) && ( pPlayerTarget->m_type == SNP_TYPE_LOCAL ) ) + { + // Special internal communication from host to local player + m_manager->LocalDataSend( this, pPlayerTarget, data, dataSize ); + } + else if( ( m_type == SNP_TYPE_LOCAL ) && ( pPlayerTarget->m_type == SNP_TYPE_HOST ) ) + { + // Special internal communication from local player to host + m_manager->LocalDataSend( this, pPlayerTarget, data, dataSize ); + } + else if( ( m_type == SNP_TYPE_HOST ) && ( pPlayerTarget->m_type == SNP_TYPE_REMOTE ) ) + { + // Rudp communication from host to remote player - handled by remote player instance + pPlayerTarget->SendInternal(data,dataSize, ackFlags); + } + else + { + // Can't do any other types of communications + assert(false); + } + } + else + { + if( ( m_type == SNP_TYPE_LOCAL ) && ( pPlayerTarget->m_type == SNP_TYPE_HOST ) ) + { + // Rudp communication from client to host - handled by this player instace + SendInternal(data, dataSize, ackFlags); + } + else + { + // Can't do any other types of communications + assert(false); + } + } +} + +// Internal send function - to simplify the number of mechanisms we have for sending data, this method just adds the data to be send to the player's internal queue, +// and then calls SendMoreInternal. This method can take any size of data, which it will split up into payload size chunks before sending. All input data is copied +// into internal buffers. +void SQRNetworkPlayer::SendInternal(const void *data, unsigned int dataSize, 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; + if( dataSize > SNP_MAX_PAYLOAD ) dataSize = SNP_MAX_PAYLOAD; + 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; + } + + } + 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, +// we are guaranteed that if there *is* anything more in the queue left to send, we'll get a CELL_RUDP_CONTEXT_EVENT_WRITABLE event when whatever we've managed to +// send here is complete, and can continue on. +void SQRNetworkPlayer::SendMoreInternal() +{ + EnterCriticalSection(&m_csQueue); + assert(m_sendQueue.size() > 0); // this should never be called with an empty queue. + + bool keepSending; + do + { + keepSending = false; + if( m_sendQueue.size() > 0) + { + // Attempt to send the full data in the first element in our queue + unsigned char *data= m_sendQueue.front().current; + int dataSize = m_sendQueue.front().end - m_sendQueue.front().current; + int ret = WriteDataPacket(data, dataSize, m_sendQueue.front().ack); + + 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() ) + { + keepSending = true; + } + } + 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 ); + } + else + { + // Is CELL_RUDP_ERROR_WOULDBLOCK, nothing has yet been sent + remainingBytes = dataSize; + } + m_sendQueue.front().current = m_sendQueue.front().end - remainingBytes; + } + } + } while (keepSending); + LeaveCriticalSection(&m_csQueue); +} + +void SQRNetworkPlayer::SetNameFromUID() +{ + mbstowcs(m_name, m_ISD.m_UID.getOnlineID(), 16); + m_name[16] = 0; +#ifdef __PS3__ // only 1 player on vita, and they have to be online (or adhoc), and with PS4 all local players need to be signed in + // Not an online player? Add a suffix with the controller ID on + if( m_ISD.m_UID.isSignedIntoPSN() == 0) + { + int pos = wcslen(m_name); + swprintf(&m_name[pos], 5, L" (%d)", m_ISD.m_UID.getQuadrant() + 1 ); + } +#endif +} + +void SQRNetworkPlayer::SetName(char *name) +{ + mbstowcs(m_name, name, 20); + m_name[20] = 0; +} + +int SQRNetworkPlayer::GetSessionIndex() +{ + return m_manager->GetSessionIndex(this); +} + +bool SQRNetworkPlayer::HasVoice() +{ +#ifdef __ORBIS__ + return SonyVoiceChat_Orbis::hasMicConnected(this); +#elif defined __PSVITA__ + return SonyVoiceChat_Vita::hasMicConnected(this); +#else + return SonyVoiceChat::hasMicConnected(&m_roomMemberId); +#endif +} + +bool SQRNetworkPlayer::IsTalking() +{ +#ifdef __ORBIS__ + return SonyVoiceChat_Orbis::isTalking(this); +#elif defined __PSVITA__ + return SonyVoiceChat_Vita::isTalking(this); +#else + return SonyVoiceChat::isTalking(&m_roomMemberId); +#endif +} + +bool SQRNetworkPlayer::IsMutedByLocalUser(int userIndex) +{ +#ifdef __ORBIS__ +// assert(0); // this is never called, so isn't implemented in the PS4 voice stuff at the moment + return false; +#elif defined __PSVITA__ + return false;// this is never called, so isn't implemented in the Vita voice stuff at the moment +#else + SQRNetworkManager_PS3* pMan = (SQRNetworkManager_PS3*)m_manager; + return SonyVoiceChat::isMutedPlayer(pMan->m_roomSyncData.players[userIndex].m_roomMemberId); +#endif +} diff --git a/Minecraft.Client/Common/Network/Sony/SQRNetworkPlayer.h b/Minecraft.Client/Common/Network/Sony/SQRNetworkPlayer.h new file mode 100644 index 00000000..d0efe635 --- /dev/null +++ b/Minecraft.Client/Common/Network/Sony/SQRNetworkPlayer.h @@ -0,0 +1,151 @@ +#pragma once +#include "SQRNetworkManager.h" +#include + +// This is the lowest level class for handling the concept of a player on Sony platforms. This is managed by SQRNetworkManager. The game shouldn't directly communicate +// with this class, as it is wrapped by NetworkPlayerSony which is an implementation of a platform-independent interface INetworkPlayer. + +class SQRNetworkPlayer +{ +#ifdef __ORBIS__ + friend class SQRNetworkManager_Orbis; + friend class SonyVoiceChat_Orbis; +#elif defined __PS3__ + friend class SQRNetworkManager_PS3; +#else // __PSVITA__ + friend class SQRNetworkManager_Vita; + friend class SQRNetworkManager_AdHoc_Vita; + friend class SonyVoiceChat_Vita; +#endif + friend class SQRNetworkManager; + friend class NetworkPlayerSony; + friend class CPlatformNetworkManagerSony; + + int GetSmallId(); + wchar_t *GetName(); + bool IsRemote(); + bool IsHost(); + bool IsLocal(); + int GetLocalPlayerIndex(); + bool IsSameSystem(SQRNetworkPlayer *other); + uintptr_t GetCustomDataValue(); + void SetCustomDataValue(uintptr_t data); + bool HasVoice(); + bool IsTalking(); + bool IsMutedByLocalUser(int userIndex); + + static const int SNP_FLAG_CONNECTION_COMPLETE = 1; // This player has a fully connected Rudp or other local link established (to a remote player if this is on the host, to the host if this is a client) - or isn't expected to have one + static const int SNP_FLAG_SMALLID_ALLOCATED = 2; // This player has a small id allocated + static const int SNP_FLAG_SMALLID_CONFIRMED = 4; // This player's small id has been confirmed as received by the client (only relevant for players using network communications, others set at the same time as allocating) + static const int SNP_FLAG_READY_MASK = 7; // Mask indicated all bits which must be set in the flags for this player to be considered "ready" + + static const int SNP_MAX_PAYLOAD = 1346; // This is the default RUDP payload size - if we want to change this we'll need to use cellRudpSetOption to set something else & adjust segment size + + typedef enum + { + SNP_TYPE_HOST, // This player represents the host + SNP_TYPE_LOCAL, // On host - this player is a local player that needs communicated with specially not using rudp. On clients - this is a local player, where m_rudpCtx is the context used to communicate from this player to/from the host + SNP_TYPE_REMOTE, // On host - this player's m_rupdCtx can be used to communicate from between the host and this player. On clients - this is a remote player that cannot be communicated with + } eSQRNetworkPlayerType; + + 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 + { + public: + unsigned char m_smallId; // Id to uniquely and permanently identify this player between machines - assigned by the server + PlayerUID m_UID; + }; + + SQRNetworkPlayer(SQRNetworkManager *manager, eSQRNetworkPlayerType playerType, bool onHost, SceNpMatching2RoomMemberId roomMemberId, int localPlayerIdx, int rudpCtx, PlayerUID *pUID); + ~SQRNetworkPlayer(); + + PlayerUID GetUID(); + void SetUID(PlayerUID UID); + bool HasConnectionAndSmallId(); + bool IsReady(); + void ConnectionComplete(); + void SmallIdAllocated(unsigned char smallId); + void InitialDataReceived(InitSendData *ISD); // Only for remote players as viewed from the host, this is set when the host has received confirmation that the client has received the small id for this player, ie it is now safe to send data to + bool HasSmallIdConfirmed(); + + void SendData( SQRNetworkPlayer *pPlayerTarget, const void *data, unsigned int dataSize, bool ack ); + + void ConfirmReady(); + 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(); +#endif + void SetNameFromUID(); + void SetName(char *name); + int GetSessionIndex(); + + eSQRNetworkPlayerType m_type; // The player type + bool m_host; // Whether this actual player class is stored on a host (not whether it represents the host, or a player on the host machine) + int m_flags; // Flags reflecting current state of this player + int m_rudpCtx; // Rudp context that can be used to communicate between this player & the host (see comments for eSQRNetworkPlayerType above) + int m_localPlayerIdx; // Index of this player on the machine to which it belongs + SceNpMatching2RoomMemberId m_roomMemberId; // The room member id, effectively a per machine id + InitSendData m_ISD; // Player UID & ID that get sent together to the host when connection is established + SQRNetworkManager *m_manager; // Pointer back to the manager that is managing this player + wchar_t m_name[21]; + uintptr_t m_customData; + CRITICAL_SECTION m_csQueue; + CRITICAL_SECTION m_csAcks; + std::queue m_sendQueue; + int m_totalBytesInSendQueue; + + int m_acksOutstanding; +}; diff --git a/Minecraft.Client/Common/Network/Sony/SonyCommerce.cpp b/Minecraft.Client/Common/Network/Sony/SonyCommerce.cpp new file mode 100644 index 00000000..8435cd56 --- /dev/null +++ b/Minecraft.Client/Common/Network/Sony/SonyCommerce.cpp @@ -0,0 +1,1492 @@ +#include "stdafx.h" + +#include "SonyCommerce.h" +#include "..\PS3Extras\ShutdownManager.h" +#include + + +bool SonyCommerce::m_bCommerceInitialised = false; +SceNpCommerce2SessionInfo SonyCommerce::m_sessionInfo; +SonyCommerce::State SonyCommerce::m_state = e_state_noSession; +int SonyCommerce::m_errorCode = 0; +LPVOID SonyCommerce::m_callbackParam = NULL; + +void* SonyCommerce::m_receiveBuffer = NULL; +SonyCommerce::Event SonyCommerce::m_event; +std::queue SonyCommerce::m_messageQueue; +std::vector* SonyCommerce::m_pProductInfoList = NULL; +SonyCommerce::ProductInfoDetailed* SonyCommerce::m_pProductInfoDetailed = NULL; +SonyCommerce::ProductInfo* SonyCommerce::m_pProductInfo = NULL; + +SonyCommerce::CategoryInfo* SonyCommerce::m_pCategoryInfo = NULL; +const char* SonyCommerce::m_pProductID = NULL; +char* SonyCommerce::m_pCategoryID = NULL; +SonyCommerce::CheckoutInputParams SonyCommerce::m_checkoutInputParams; +SonyCommerce::DownloadListInputParams SonyCommerce::m_downloadInputParams; + +SonyCommerce::CallbackFunc SonyCommerce::m_callbackFunc = NULL; +sys_memory_container_t SonyCommerce::m_memContainer = SYS_MEMORY_CONTAINER_ID_INVALID; +bool SonyCommerce::m_bUpgradingTrial = false; + +SonyCommerce::CallbackFunc SonyCommerce::m_trialUpgradeCallbackFunc; +LPVOID SonyCommerce::m_trialUpgradeCallbackParam; + +CRITICAL_SECTION SonyCommerce::m_queueLock; + + + +uint32_t SonyCommerce::m_contextId=0; ///< The npcommerce2 context ID +bool SonyCommerce::m_contextCreated=false; ///< npcommerce2 context ID created? +SonyCommerce::Phase SonyCommerce::m_currentPhase = e_phase_stopped; ///< Current commerce2 util +char SonyCommerce::m_commercebuffer[SCE_NP_COMMERCE2_RECV_BUF_SIZE]; + +C4JThread* SonyCommerce::m_tickThread = NULL; +bool SonyCommerce::m_bLicenseChecked=false; // Check the trial/full license for the game + + +SonyCommerce::ProductInfoDetailed s_trialUpgradeProductInfoDetailed; +void SonyCommerce::Delete() +{ + m_pProductInfoList=NULL; + m_pProductInfoDetailed=NULL; + m_pProductInfo=NULL; + m_pCategoryInfo = NULL; + m_pProductID = NULL; + m_pCategoryID = NULL; +} +void SonyCommerce::Init() +{ + int ret; + + assert(m_state == e_state_noSession); + if(!m_bCommerceInitialised) + { + ret = sceNpCommerce2Init(); + if (ret < 0) + { + app.DebugPrintf(4,"sceNpCommerce2Init failed (0x%x)\n", ret); + return; + } + else + { + m_bCommerceInitialised = true; + } + m_pCategoryID=(char *)malloc(sizeof(char) * 100); + InitializeCriticalSection(&m_queueLock); + } + + return ; + +} + + + +void SonyCommerce::CheckForTrialUpgradeKey_Callback(LPVOID param, bool bFullVersion) +{ + ProfileManager.SetFullVersion(bFullVersion); + if(ProfileManager.IsFullVersion()) + { + StorageManager.SetSaveDisabled(false); + ConsoleUIController::handleUnlockFullVersionCallback(); + // licence has been checked, so we're ok to install the trophies now + ProfileManager.InitialiseTrophies( SQRNetworkManager_PS3::GetSceNpCommsId(), + SQRNetworkManager_PS3::GetSceNpCommsSig()); + + } + m_bLicenseChecked=true; +} + +bool SonyCommerce::LicenseChecked() +{ + return m_bLicenseChecked; +} + +void SonyCommerce::CheckForTrialUpgradeKey() +{ + StorageManager.CheckForTrialUpgradeKey(CheckForTrialUpgradeKey_Callback, NULL); +} + +int SonyCommerce::Shutdown() +{ + int ret=0; + if (m_contextCreated) + { + ret = sceNpCommerce2DestroyCtx(m_contextId); + if (ret != 0) + { + return ret; + } + + m_contextId = 0; + m_contextCreated = false; + } + + ret = sceNpCommerce2Term(); + m_bCommerceInitialised = false; + if (ret != 0) + { + return ret; + } + delete m_pCategoryID; + DeleteCriticalSection(&m_queueLock); + + return ret; +} + + + +int SonyCommerce::TickLoop(void* lpParam) +{ + ShutdownManager::HasStarted(ShutdownManager::eCommerceThread); + while( (m_currentPhase != e_phase_stopped) && ShutdownManager::ShouldRun(ShutdownManager::eCommerceThread) ) + { + processEvent(); + processMessage(); + Sleep(16); // sleep for a frame + } + + ShutdownManager::HasFinished(ShutdownManager::eCommerceThread); + + return 0; +} + +int SonyCommerce::getProductList(std::vector* productList, char *categoryId) +{ + int ret = 0; + uint32_t requestId; + size_t bufSize = sizeof(m_commercebuffer); + size_t fillSize = 0; + SceNpCommerce2GetCategoryContentsResult result; + SceNpCommerce2CategoryInfo categoryInfo; + SceNpCommerce2ContentInfo contentInfo; + SceNpCommerce2GameProductInfo productInfo; + SceNpCommerce2GameSkuInfo skuInfo; + ProductInfo tempInfo; + std::vector tempProductVec; + + if (!m_contextCreated) + { + ret = createContext(); + if (ret < 0) + { + setError(ret); + return ret; + } + } + + // Create request ID + ret = sceNpCommerce2GetCategoryContentsCreateReq(m_contextId, &requestId); + if (ret < 0) + { + setError(ret); + return ret; + } + + // Obtain category content data + ret = sceNpCommerce2GetCategoryContentsStart(requestId, categoryId, 0, SCE_NP_COMMERCE2_GETCAT_MAX_COUNT); + if (ret < 0) + { + sceNpCommerce2DestroyReq(requestId); + setError(ret); + return ret; + } + + ret = sceNpCommerce2GetCategoryContentsGetResult(requestId, m_commercebuffer, bufSize, &fillSize); + if (ret < 0) + { + sceNpCommerce2DestroyReq(requestId); + setError(ret); + return ret; + } + + ret = sceNpCommerce2DestroyReq(requestId); + if (ret < 0) + { + setError(ret); + return ret; + } + + // We have the initial category content data, + // now to take out the category content information. + ret = sceNpCommerce2InitGetCategoryContentsResult(&result, m_commercebuffer, fillSize); + if (ret < 0) + { + setError(ret); + return ret; + } + + // Get the category information + ret = sceNpCommerce2GetCategoryInfo(&result, &categoryInfo); + if (ret < 0) + { + sceNpCommerce2DestroyGetCategoryContentsResult(&result); + setError(ret); + return ret; + } + + if(categoryInfo.countOfProduct==0) + { + // There is no DLC + return 0; + } + + // Reserve some space + tempProductVec.reserve(categoryInfo.countOfProduct); + + // For each product, obtain information + for (int i = 0; i < result.rangeOfContents.count; i++) + { + ret = sceNpCommerce2GetContentInfo(&result, i, &contentInfo); + if (ret < 0) + { + sceNpCommerce2DestroyGetCategoryContentsResult(&result); + setError(ret); + return ret; + } + + // Only process if it is a product + if (contentInfo.contentType == SCE_NP_COMMERCE2_CONTENT_TYPE_PRODUCT) + { + + // reset tempInfo + memset(&tempInfo, 0x0, sizeof(tempInfo)); + + // Get product info + ret = sceNpCommerce2GetGameProductInfoFromContentInfo(&contentInfo, &productInfo); + if (ret < 0) + { + sceNpCommerce2DestroyGetCategoryContentsResult(&result); + setError(ret); + return ret; + } + + // populate our temp struct + + strncpy(tempInfo.productId, productInfo.productId, SCE_NP_COMMERCE2_PRODUCT_ID_LEN); + strncpy(tempInfo.productName, productInfo.productName, SCE_NP_COMMERCE2_PRODUCT_NAME_LEN); + strncpy(tempInfo.shortDescription, productInfo.productShortDescription, SCE_NP_COMMERCE2_PRODUCT_SHORT_DESCRIPTION_LEN); + if(tempInfo.longDescription[0]!=0) + { + strncpy(tempInfo.longDescription, productInfo.productLongDescription, SCE_NP_COMMERCE2_PRODUCT_LONG_DESCRIPTION_LEN); + } + else + { +#ifdef _DEBUG + strcpy(tempInfo.longDescription,"Missing long description"); +#endif + } + strncpy(tempInfo.spName, productInfo.spName, SCE_NP_COMMERCE2_SP_NAME_LEN); + strncpy(tempInfo.imageUrl, productInfo.imageUrl, SCE_NP_COMMERCE2_URL_LEN); + tempInfo.releaseDate = productInfo.releaseDate; + + if (productInfo.countOfSku == 1) + { + // Get SKU info + ret = sceNpCommerce2GetGameSkuInfoFromGameProductInfo(&productInfo, 0, &skuInfo); + if (ret < 0) + { + sceNpCommerce2DestroyGetCategoryContentsResult(&result); + setError(ret); + return ret; + } + tempInfo.purchasabilityFlag = skuInfo.purchasabilityFlag; + + // Take out the price. Nicely formatted + // but also keep the price as a value in case it's 0 - we need to show "free" for that + tempInfo.ui32Price= skuInfo.price; + ret = sceNpCommerce2GetPrice(m_contextId, tempInfo.price, sizeof(tempInfo.price), skuInfo.price); + + if (ret < 0) + { + sceNpCommerce2DestroyGetCategoryContentsResult(&result); + setError(ret); + return ret; + } + } + tempProductVec.push_back(tempInfo); + } + } + + // Set our result + *productList = tempProductVec; + + // Destroy the category contents result + ret = sceNpCommerce2DestroyGetCategoryContentsResult(&result); + if (ret < 0) + { + return ret; + } + + return ret; +} + +int SonyCommerce::getCategoryInfo(CategoryInfo *pInfo, char *categoryId) +{ + int ret = 0; + uint32_t requestId; + size_t bufSize = sizeof(m_commercebuffer); + size_t fillSize = 0; + SceNpCommerce2GetCategoryContentsResult result; + SceNpCommerce2CategoryInfo categoryInfo; + SceNpCommerce2ContentInfo contentInfo; + //CategoryInfo tempCatInfo; + CategoryInfoSub tempSubCatInfo; + + if (!m_contextCreated) + { + ret = createContext(); + if (ret < 0) + { + m_errorCode = ret; + return ret; + } + } + + // Create request ID + ret = sceNpCommerce2GetCategoryContentsCreateReq(m_contextId, &requestId); + if (ret < 0) + { + m_errorCode = ret; + return ret; + } + + // Obtain category content data + if (categoryId) + { + ret = sceNpCommerce2GetCategoryContentsStart(requestId, categoryId, 0, SCE_NP_COMMERCE2_GETCAT_MAX_COUNT); + } + else + { + ret = sceNpCommerce2GetCategoryContentsStart(requestId,categoryId, + 0, SCE_NP_COMMERCE2_GETCAT_MAX_COUNT); + } + if (ret < 0) + { + sceNpCommerce2DestroyReq(requestId); + m_errorCode = ret; + return ret; + } + + ret = sceNpCommerce2GetCategoryContentsGetResult(requestId, m_commercebuffer, bufSize, &fillSize); + if (ret < 0) + { + if(ret==SCE_NP_COMMERCE2_ERROR_SERVER_MAINTENANCE) + { + app.DebugPrintf(4,"\n--- SCE_NP_COMMERCE2_ERROR_SERVER_MAINTENANCE ---\n\n"); + } + sceNpCommerce2DestroyReq(requestId); + m_errorCode = ret; + return ret; + } + + ret = sceNpCommerce2DestroyReq(requestId); + if (ret < 0) + { + m_errorCode = ret; + return ret; + } + + // We have the initial category content data, + // now to take out the category content information. + ret = sceNpCommerce2InitGetCategoryContentsResult(&result, m_commercebuffer, fillSize); + if (ret < 0) { + m_errorCode = ret; + return ret; + } + + // Get the category information + ret = sceNpCommerce2GetCategoryInfo(&result, &categoryInfo); + if (ret < 0) { + sceNpCommerce2DestroyGetCategoryContentsResult(&result); + m_errorCode = ret; + return ret; + } + + strcpy(pInfo->current.categoryId, categoryInfo.categoryId); + strcpy(pInfo->current.categoryName, categoryInfo.categoryName); + strcpy(pInfo->current.categoryDescription, categoryInfo.categoryDescription); + strcpy(pInfo->current.imageUrl, categoryInfo.imageUrl); + pInfo->countOfProducts = categoryInfo.countOfProduct; + pInfo->countOfSubCategories = categoryInfo.countOfSubCategory; + + if (categoryInfo.countOfSubCategory > 0) + { + // For each sub category, obtain information + for (int i = 0; i < result.rangeOfContents.count; i++) + { + + ret = sceNpCommerce2GetContentInfo(&result, i, &contentInfo); + if (ret < 0) + { + sceNpCommerce2DestroyGetCategoryContentsResult(&result); + m_errorCode = ret; + return ret; + } + + // Only process if it is a category + if (contentInfo.contentType == SCE_NP_COMMERCE2_CONTENT_TYPE_CATEGORY) + { + + ret = sceNpCommerce2GetCategoryInfoFromContentInfo(&contentInfo, &categoryInfo); + if (ret < 0) + { + sceNpCommerce2DestroyGetCategoryContentsResult(&result); + m_errorCode = ret; + return ret; + } + + strcpy(tempSubCatInfo.categoryId, categoryInfo.categoryId); + strcpy(tempSubCatInfo.categoryName, categoryInfo.categoryName); + strcpy(tempSubCatInfo.categoryDescription, categoryInfo.categoryDescription); + strcpy(tempSubCatInfo.imageUrl, categoryInfo.imageUrl); + + // Add to the list + pInfo->subCategories.push_back(tempSubCatInfo); + } + } + } + + // Set our result + //*info = tempCatInfo; + + // Destroy the category contents result + ret = sceNpCommerce2DestroyGetCategoryContentsResult(&result); + if (ret < 0) { + return ret; + } + + return ret; +} + + +int SonyCommerce::getDetailedProductInfo(ProductInfoDetailed *pInfo, const char *productId, char *categoryId) +{ + int ret = 0; + uint32_t requestId; + size_t bufSize = sizeof(m_commercebuffer); + size_t fillSize = 0; + std::list ratingDescList; + SceNpCommerce2GetProductInfoResult result; + SceNpCommerce2ContentRatingInfo ratingInfo; + SceNpCommerce2GameProductInfo productInfo; + SceNpCommerce2GameSkuInfo skuInfo; + //ProductInfoDetailed tempInfo; + + if (!m_contextCreated) { + ret = createContext(); + if (ret < 0) { + m_errorCode = ret; + return ret; + } + } + + // Obtain product data + ret = sceNpCommerce2GetProductInfoCreateReq(m_contextId, &requestId); + if (ret < 0) { + m_errorCode = ret; + return ret; + } + + if (categoryId && categoryId[0] != 0) { + ret = sceNpCommerce2GetProductInfoStart(requestId, categoryId, productId); + } else { + ret = sceNpCommerce2GetProductInfoStart(requestId, NULL, productId); + } + if (ret < 0) { + sceNpCommerce2DestroyReq(requestId); + m_errorCode = ret; + return ret; + } + + ret = sceNpCommerce2GetProductInfoGetResult(requestId, m_commercebuffer, bufSize, &fillSize); + if (ret < 0) { + sceNpCommerce2DestroyReq(requestId); + m_errorCode = ret; + return ret; + } + + ret = sceNpCommerce2DestroyReq(requestId); + if (ret < 0) + { + m_errorCode = ret; + return ret; + } + + // Take Out Game Product Information + ret = sceNpCommerce2InitGetProductInfoResult(&result, m_commercebuffer, fillSize); + if (ret < 0) + { + m_errorCode = ret; + return ret; + } + + ret = sceNpCommerce2GetGameProductInfo(&result, &productInfo); + if (ret < 0) + { + sceNpCommerce2DestroyGetProductInfoResult(&result); + m_errorCode = ret; + return ret; + } + + // Get rating info + ret = sceNpCommerce2GetContentRatingInfoFromGameProductInfo(&productInfo, &ratingInfo); + if (ret < 0) + { + sceNpCommerce2DestroyGetProductInfoResult(&result); + m_errorCode = ret; + return ret; + } + + for (int index = 0; index < ratingInfo.countOfContentRatingDescriptor; index++) + { + SceNpCommerce2ContentRatingDescriptor desc; + sceNpCommerce2GetContentRatingDescriptor(&ratingInfo, index, &desc); + ratingDescList.push_back(desc); + } + + // populate our temp struct + pInfo->ratingDescriptors = ratingDescList; + strncpy(pInfo->productId, productInfo.productId, SCE_NP_COMMERCE2_PRODUCT_ID_LEN); + strncpy(pInfo->productName, productInfo.productName, SCE_NP_COMMERCE2_PRODUCT_NAME_LEN); + strncpy(pInfo->shortDescription, productInfo.productShortDescription, SCE_NP_COMMERCE2_PRODUCT_SHORT_DESCRIPTION_LEN); + strncpy(pInfo->longDescription, productInfo.productLongDescription, SCE_NP_COMMERCE2_PRODUCT_LONG_DESCRIPTION_LEN); + strncpy(pInfo->legalDescription, productInfo.legalDescription, SCE_NP_COMMERCE2_PRODUCT_LEGAL_DESCRIPTION_LEN); + strncpy(pInfo->spName, productInfo.spName, SCE_NP_COMMERCE2_SP_NAME_LEN); + strncpy(pInfo->imageUrl, productInfo.imageUrl, SCE_NP_COMMERCE2_URL_LEN); + pInfo->releaseDate = productInfo.releaseDate; + strncpy(pInfo->ratingSystemId, ratingInfo.ratingSystemId, SCE_NP_COMMERCE2_RATING_SYSTEM_ID_LEN); + strncpy(pInfo->ratingImageUrl, ratingInfo.imageUrl, SCE_NP_COMMERCE2_URL_LEN); + + // Get SKU info + if (productInfo.countOfSku == 1) + { + ret = sceNpCommerce2GetGameSkuInfoFromGameProductInfo(&productInfo, 0, &skuInfo); + if (ret < 0) + { + sceNpCommerce2DestroyGetProductInfoResult(&result); + m_errorCode = ret; + return ret; + } + strncpy(pInfo->skuId, skuInfo.skuId, SCE_NP_COMMERCE2_SKU_ID_LEN); + pInfo->purchasabilityFlag = skuInfo.purchasabilityFlag; + + // Take out the price. Nicely formatted + // but also keep the price as a value in case it's 0 - we need to show "free" for that + pInfo->ui32Price= skuInfo.price; + ret = sceNpCommerce2GetPrice(m_contextId, pInfo->price, sizeof(pInfo->price), skuInfo.price); + if (ret < 0) + { + sceNpCommerce2DestroyGetProductInfoResult(&result); + m_errorCode = ret; + return ret; + } + } + + // Set our result + //*info = tempInfo; + + ret = sceNpCommerce2DestroyGetProductInfoResult(&result); + if (ret < 0) + { + return ret; + } + + return ret; +} + + +int SonyCommerce::addDetailedProductInfo(ProductInfo *info, const char *productId, char *categoryId) +{ + int ret = 0; + uint32_t requestId; + size_t bufSize = sizeof(m_commercebuffer); + size_t fillSize = 0; + std::list ratingDescList; + SceNpCommerce2GetProductInfoResult result; + SceNpCommerce2ContentRatingInfo ratingInfo; + SceNpCommerce2GameProductInfo productInfo; + SceNpCommerce2GameSkuInfo skuInfo; + //ProductInfoDetailed tempInfo; + + if (!m_contextCreated) + { + ret = createContext(); + if (ret < 0) + { + m_errorCode = ret; + return ret; + } + } + + // Obtain product data + ret = sceNpCommerce2GetProductInfoCreateReq(m_contextId, &requestId); + if (ret < 0) + { + m_errorCode = ret; + return ret; + } + + if (categoryId && categoryId[0] != 0) + { + ret = sceNpCommerce2GetProductInfoStart(requestId, categoryId, productId); + } + else + { + ret = sceNpCommerce2GetProductInfoStart(requestId, categoryId, productId); + } + if (ret < 0) { + sceNpCommerce2DestroyReq(requestId); + m_errorCode = ret; + return ret; + } + + ret = sceNpCommerce2GetProductInfoGetResult(requestId, m_commercebuffer, bufSize, &fillSize); + if (ret < 0) + { + sceNpCommerce2DestroyReq(requestId); + m_errorCode = ret; + return ret; + } + + ret = sceNpCommerce2DestroyReq(requestId); + if (ret < 0) + { + m_errorCode = ret; + return ret; + } + + // Take Out Game Product Information + ret = sceNpCommerce2InitGetProductInfoResult(&result, m_commercebuffer, fillSize); + if (ret < 0) + { + m_errorCode = ret; + return ret; + } + + ret = sceNpCommerce2GetGameProductInfo(&result, &productInfo); + if (ret < 0) + { + sceNpCommerce2DestroyGetProductInfoResult(&result); + m_errorCode = ret; + return ret; + } + + // Get rating info + ret = sceNpCommerce2GetContentRatingInfoFromGameProductInfo(&productInfo, &ratingInfo); + if (ret < 0) + { + sceNpCommerce2DestroyGetProductInfoResult(&result); + m_errorCode = ret; + return ret; + } + + for (int index = 0; index < ratingInfo.countOfContentRatingDescriptor; index++) + { + SceNpCommerce2ContentRatingDescriptor desc; + sceNpCommerce2GetContentRatingDescriptor(&ratingInfo, index, &desc); + ratingDescList.push_back(desc); + } + + // populate our temp struct +// tempInfo.ratingDescriptors = ratingDescList; +// strncpy(tempInfo.productId, productInfo.productId, SCE_NP_COMMERCE2_PRODUCT_ID_LEN); +// strncpy(tempInfo.productName, productInfo.productName, SCE_NP_COMMERCE2_PRODUCT_NAME_LEN); +// strncpy(tempInfo.shortDescription, productInfo.productShortDescription, SCE_NP_COMMERCE2_PRODUCT_SHORT_DESCRIPTION_LEN); + strncpy(info->longDescription, productInfo.productLongDescription, SCE_NP_COMMERCE2_PRODUCT_LONG_DESCRIPTION_LEN); +// strncpy(tempInfo.legalDescription, productInfo.legalDescription, SCE_NP_COMMERCE2_PRODUCT_LEGAL_DESCRIPTION_LEN); +// strncpy(tempInfo.spName, productInfo.spName, SCE_NP_COMMERCE2_SP_NAME_LEN); +// strncpy(tempInfo.imageUrl, productInfo.imageUrl, SCE_NP_COMMERCE2_URL_LEN); +// tempInfo.releaseDate = productInfo.releaseDate; +// strncpy(tempInfo.ratingSystemId, ratingInfo.ratingSystemId, SCE_NP_COMMERCE2_RATING_SYSTEM_ID_LEN); +// strncpy(tempInfo.ratingImageUrl, ratingInfo.imageUrl, SCE_NP_COMMERCE2_URL_LEN); + + // Get SKU info + if (productInfo.countOfSku == 1) + { + ret = sceNpCommerce2GetGameSkuInfoFromGameProductInfo(&productInfo, 0, &skuInfo); + if (ret < 0) + { + sceNpCommerce2DestroyGetProductInfoResult(&result); + m_errorCode = ret; + return ret; + } + strncpy(info->skuId, skuInfo.skuId, SCE_NP_COMMERCE2_SKU_ID_LEN); + info->purchasabilityFlag = skuInfo.purchasabilityFlag; + info->annotation = skuInfo.annotation; + + // Take out the price. Nicely formatted + // but also keep the price as a value in case it's 0 - we need to show "free" for that + info->ui32Price= skuInfo.price; + ret = sceNpCommerce2GetPrice(m_contextId, info->price, sizeof(info->price), skuInfo.price); + if (ret < 0) + { + sceNpCommerce2DestroyGetProductInfoResult(&result); + m_errorCode = ret; + return ret; + } + } + else + { + // 4J-PB - more than one sku id! We have to be able to use the sku id returned for a product, so there is not supposed to be more than 1 + app.DebugPrintf("MORE THAN 1 SKU ID FOR %s\n",info->productName); + } + + // Set our result + //*info = tempInfo; + + ret = sceNpCommerce2DestroyGetProductInfoResult(&result); + if (ret < 0) + { + return ret; + } + + return ret; +} + + +int SonyCommerce::checkout(CheckoutInputParams ¶ms) +{ + int ret = 0; + const char *skuIdsTemp[SCE_NP_COMMERCE2_SKU_CHECKOUT_MAX]; + std::list::iterator iter = params.skuIds.begin(); + std::list::iterator iterEnd = params.skuIds.end(); + + if (!m_contextCreated) { + ret = createContext(); + if (ret < 0) { + return ret; + } + } + + for (int i = 0; i < params.skuIds.size(); i++) { + skuIdsTemp[i] = (const char *)(*iter); + iter++; + } + + ret = sceNpCommerce2DoCheckoutStartAsync(m_contextId, skuIdsTemp, params.skuIds.size(), *params.memContainer); + if (ret < 0) { + return ret; + } + + return CELL_OK; +} + + +int SonyCommerce::downloadList(DownloadListInputParams ¶ms) +{ + int ret = 0; + const char *skuIdsTemp[SCE_NP_COMMERCE2_SKU_CHECKOUT_MAX]; + std::list::iterator iter = params.skuIds.begin(); + std::list::iterator iterEnd = params.skuIds.end(); + + if (!m_contextCreated) { + ret = createContext(); + if (ret < 0) { + return ret; + } + } + + for (int i = 0; i < params.skuIds.size(); i++) { + skuIdsTemp[i] = (const char *)(*iter); + iter++; + } + ret = sceNpCommerce2DoDlListStartAsync(m_contextId, app.GetCommerceCategory(), skuIdsTemp, params.skuIds.size(), *params.memContainer); + if (ret < 0) { + return ret; + } + + return CELL_OK; +} + +void SonyCommerce::UpgradeTrialCallback2(LPVOID lpParam,int err) +{ + app.DebugPrintf(4,"SonyCommerce_UpgradeTrialCallback2 : err : 0x%08x\n", err); + SonyCommerce::CheckForTrialUpgradeKey(); + if(err != CELL_OK) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + C4JStorage::EMessageResult result = ui.RequestMessageBox( IDS_PRO_UNLOCKGAME_TITLE, IDS_NO_DLCOFFERS, uiIDA,1,ProfileManager.GetPrimaryPad()); + } + m_trialUpgradeCallbackFunc(m_trialUpgradeCallbackParam, m_errorCode); +} + +void SonyCommerce::UpgradeTrialCallback1(LPVOID lpParam,int err) +{ + + app.DebugPrintf(4,"SonyCommerce_UpgradeTrialCallback1 : err : 0x%08x\n", err); + if(err == CELL_OK) + { + const char* skuID = s_trialUpgradeProductInfoDetailed.skuId; + if(s_trialUpgradeProductInfoDetailed.purchasabilityFlag == SCE_NP_COMMERCE2_SKU_PURCHASABILITY_FLAG_OFF) + { + app.DebugPrintf(4,"UpgradeTrialCallback1 - DownloadAlreadyPurchased\n"); + SonyCommerce::DownloadAlreadyPurchased( UpgradeTrialCallback2, NULL, skuID); + } + else + { + app.DebugPrintf(4,"UpgradeTrialCallback1 - Checkout\n"); + SonyCommerce::Checkout( UpgradeTrialCallback2, NULL, skuID); + } + } + else + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + C4JStorage::EMessageResult result = ui.RequestMessageBox( IDS_PRO_UNLOCKGAME_TITLE, IDS_NO_DLCOFFERS, uiIDA,1,ProfileManager.GetPrimaryPad()); + m_trialUpgradeCallbackFunc(m_trialUpgradeCallbackParam, m_errorCode); + } +} + + + +// global func, so we can call from the profile lib +void SonyCommerce_UpgradeTrial() +{ + // we're now calling the app function here, which manages pending requests + app.UpgradeTrial(); +} + +void SonyCommerce::UpgradeTrial(CallbackFunc cb, LPVOID lpParam) +{ + m_trialUpgradeCallbackFunc = cb; + m_trialUpgradeCallbackParam = lpParam; + +// static char szTrialUpgradeSkuID[64]; +// sprintf(szTrialUpgradeSkuID, "%s-TRIALUPGRADE0001", app.GetCommerceCategory());//, szSKUSuffix); + GetDetailedProductInfo(UpgradeTrialCallback1, NULL, &s_trialUpgradeProductInfoDetailed, app.GetUpgradeKey(), app.GetCommerceCategory()); +} + + +int SonyCommerce::createContext() +{ + SceNpId npId; + int ret = sceNpManagerGetNpId(&npId); + if(ret < 0) + { + app.DebugPrintf(4,"createContext sceNpManagerGetNpId problem\n"); + return ret; + } + + if (m_contextCreated) { + ret = sceNpCommerce2DestroyCtx(m_contextId); + if (ret < 0) + { + app.DebugPrintf(4,"createContext sceNpCommerce2DestroyCtx problem\n"); + return ret; + } + } + + // Create commerce2 context + ret = sceNpCommerce2CreateCtx(SCE_NP_COMMERCE2_VERSION, &npId, commerce2Handler, NULL, &m_contextId); + if (ret < 0) + { + app.DebugPrintf(4,"createContext sceNpCommerce2CreateCtx problem\n"); + return ret; + } + + m_contextCreated = true; + + return CELL_OK; +} + +int SonyCommerce::createSession() +{ + int ret = createContext(); + if (ret < 0) { + return ret; + } + + m_currentPhase = e_phase_creatingSessionPhase; + ret = sceNpCommerce2CreateSessionStart(m_contextId); + if (ret < 0) { + return ret; + } + return ret; +} + + +void SonyCommerce::commerce2Handler(uint32_t contextId, uint32_t subjectId, int event, int errorCode, void *arg) +{ +// Event reply; +// reply.service = Toolkit::NP::commerce; +// + EnterCriticalSection(&m_queueLock); + + switch (event) { + case SCE_NP_COMMERCE2_EVENT_REQUEST_ERROR: + { + m_messageQueue.push(e_message_commerceEnd); + m_errorCode = errorCode; + break; + } + case SCE_NP_COMMERCE2_EVENT_CREATE_SESSION_DONE: + { + m_messageQueue.push(e_message_commerceEnd); + m_event = e_event_commerceSessionCreated; + break; + } + case SCE_NP_COMMERCE2_EVENT_CREATE_SESSION_ABORT: + { + m_messageQueue.push(e_message_commerceEnd); + m_event = e_event_commerceSessionAborted; + break; + } + case SCE_NP_COMMERCE2_EVENT_DO_CHECKOUT_STARTED: + { + m_currentPhase = e_phase_checkoutPhase; + m_event = e_event_commerceCheckoutStarted; + break; + } + case SCE_NP_COMMERCE2_EVENT_DO_CHECKOUT_SUCCESS: + { + m_messageQueue.push(e_message_commerceEnd); + m_event = e_event_commerceCheckoutSuccess; + break; + } + case SCE_NP_COMMERCE2_EVENT_DO_CHECKOUT_BACK: + { + m_messageQueue.push(e_message_commerceEnd); + m_event = e_event_commerceCheckoutAborted; + break; + } + case SCE_NP_COMMERCE2_EVENT_DO_CHECKOUT_FINISHED: + { + m_event = e_event_commerceCheckoutFinished; + break; + } + case SCE_NP_COMMERCE2_EVENT_DO_DL_LIST_STARTED: + { + m_currentPhase = e_phase_downloadListPhase; + m_event = e_event_commerceDownloadListStarted; + break; + } + case SCE_NP_COMMERCE2_EVENT_DO_DL_LIST_SUCCESS: + { + m_messageQueue.push(e_message_commerceEnd); + m_event = e_event_commerceDownloadListSuccess; + break; + } + case SCE_NP_COMMERCE2_EVENT_DO_DL_LIST_FINISHED: + { + m_event = e_event_commerceDownloadListFinished; + break; + } + case SCE_NP_COMMERCE2_EVENT_DO_PROD_BROWSE_STARTED: + m_currentPhase = e_phase_productBrowsePhase; + m_event = e_event_commerceProductBrowseStarted; + break; + case SCE_NP_COMMERCE2_EVENT_DO_PROD_BROWSE_SUCCESS: + { + m_messageQueue.push(e_message_commerceEnd); + m_event = e_event_commerceProductBrowseSuccess; + break; + } + case SCE_NP_COMMERCE2_EVENT_DO_PROD_BROWSE_BACK: + { + m_messageQueue.push(e_message_commerceEnd); + m_event = e_event_commerceProductBrowseAborted; + break; + } + case SCE_NP_COMMERCE2_EVENT_DO_PROD_BROWSE_FINISHED: + { + m_event = e_event_commerceProductBrowseFinished; + break; + } + case SCE_NP_COMMERCE2_EVENT_DO_PROD_BROWSE_OPENED: + break; + case SCE_NP_COMMERCE2_EVENT_DO_PRODUCT_CODE_STARTED: + { + m_currentPhase = e_phase_voucherRedeemPhase; + m_event = e_event_commerceVoucherInputStarted; + break; + } + case SCE_NP_COMMERCE2_EVENT_DO_PRODUCT_CODE_SUCCESS: + { + m_messageQueue.push(e_message_commerceEnd); + m_event = e_event_commerceVoucherInputSuccess; + break; + } + case SCE_NP_COMMERCE2_EVENT_DO_PRODUCT_CODE_BACK: + { + m_messageQueue.push(e_message_commerceEnd); + m_event = e_event_commerceVoucherInputAborted; + break; + } + case SCE_NP_COMMERCE2_EVENT_DO_PRODUCT_CODE_FINISHED: + { + m_event = e_event_commerceVoucherInputFinished; + break; + } + default: + break; + }; + + LeaveCriticalSection(&m_queueLock); +} + + + +void SonyCommerce::processMessage() +{ + EnterCriticalSection(&m_queueLock); + int ret; + if(m_messageQueue.empty()) + { + LeaveCriticalSection(&m_queueLock); + return; + } + Message msg = m_messageQueue.front(); + m_messageQueue.pop(); + + switch (msg) + { + + case e_message_commerceCreateSession: + ret = createSession(); + if (ret < 0) + { + m_event = e_event_commerceError; + m_errorCode = ret; + } + break; + + case e_message_commerceGetCategoryInfo: + { + ret = getCategoryInfo(m_pCategoryInfo, m_pCategoryID); + if (ret < 0) + { + m_event = e_event_commerceError; + app.DebugPrintf(4,"ERROR - e_event_commerceGotCategoryInfo - %s\n",m_pCategoryID); + m_errorCode = ret; + } + else + { + m_event = e_event_commerceGotCategoryInfo; + app.DebugPrintf(4,"e_event_commerceGotCategoryInfo - %s\n",m_pCategoryID); + } + break; + } + + case e_message_commerceGetProductList: + { + ret = getProductList(m_pProductInfoList, m_pCategoryID); + if (ret < 0) + { + m_event = e_event_commerceError; + } + else + { + m_event = e_event_commerceGotProductList; + app.DebugPrintf(4,"e_event_commerceGotProductList - %s\n",m_pCategoryID); + } + break; + } + + case e_message_commerceGetDetailedProductInfo: + { + ret = getDetailedProductInfo(m_pProductInfoDetailed, m_pProductID, m_pCategoryID); + if (ret < 0) + { + m_event = e_event_commerceError; + m_errorCode = ret; + } + else + { + m_event = e_event_commerceGotDetailedProductInfo; + app.DebugPrintf(4,"e_event_commerceGotDetailedProductInfo - %s\n",m_pCategoryID); + } + break; + } + case e_message_commerceAddDetailedProductInfo: + { + ret = addDetailedProductInfo(m_pProductInfo, m_pProductID, m_pCategoryID); + if (ret < 0) + { + m_event = e_event_commerceError; + m_errorCode = ret; + } + else + { + m_event = e_event_commerceAddedDetailedProductInfo; + } + break; + } + +// +// case e_message_commerceStoreProductBrowse: +// { +// ret = productBrowse(*(ProductBrowseParams *)msg.inputArgs); +// if (ret < 0) { +// m_event = e_event_commerceError; +// m_errorCode = ret; +// } +// _TOOLKIT_NP_DEL (ProductBrowseParams *)msg.inputArgs; +// break; +// } +// +// case e_message_commerceUpgradeTrial: +// { +// ret = upgradeTrial(); +// if (ret < 0) { +// m_event = e_event_commerceError; +// m_errorCode = ret; +// } +// break; +// } +// +// case e_message_commerceRedeemVoucher: +// { +// ret = voucherCodeInput(*(VoucherInputParams *)msg.inputArgs); +// if (ret < 0) { +// m_event = e_event_commerceError; +// m_errorCode = ret; +// } +// _TOOLKIT_NP_DEL (VoucherInputParams *)msg.inputArgs; +// break; +// } +// +// case e_message_commerceGetEntitlementList: +// { +// Job > tmpJob(static_cast > *>(msg.output)); +// +// int state = 0; +// int ret = sceNpManagerGetStatus(&state); +// +// // We don't want to process this if we are offline +// if (ret < 0 || state != SCE_NP_MANAGER_STATUS_ONLINE) { +// m_event = e_event_commerceError; +// reply.returnCode = SCE_TOOLKIT_NP_OFFLINE; +// tmpJob.setError(SCE_TOOLKIT_NP_OFFLINE); +// } else { +// getEntitlementList(&tmpJob); +// } +// break; +// } +// +// case e_message_commerceConsumeEntitlement: +// { +// int state = 0; +// int ret = sceNpManagerGetStatus(&state); +// +// // We don't want to process this if we are offline +// if (ret < 0 || state != SCE_NP_MANAGER_STATUS_ONLINE) { +// m_event = e_event_commerceError; +// reply.returnCode = SCE_TOOLKIT_NP_OFFLINE; +// } else { +// +// ret = consumeEntitlement(*(EntitlementToConsume *)msg.inputArgs); +// if (ret < 0) { +// m_event = e_event_commerceError; +// m_errorCode = ret; +// } else { +// m_event = e_event_commerceConsumedEntitlement; +// } +// } +// _TOOLKIT_NP_DEL (EntitlementToConsume *)msg.inputArgs; +// +// break; +// } +// + case e_message_commerceCheckout: + { + ret = checkout(m_checkoutInputParams); + if (ret < 0) { + m_event = e_event_commerceError; + m_errorCode = ret; + } + break; + } + + case e_message_commerceDownloadList: + { + ret = downloadList(m_downloadInputParams); + if (ret < 0) { + m_event = e_event_commerceError; + m_errorCode = ret; + } + break; + } + + case e_message_commerceEnd: + app.DebugPrintf("XXX - e_message_commerceEnd!\n"); + ret = commerceEnd(); + if (ret < 0) + { + m_event = e_event_commerceError; + m_errorCode = ret; + } + // 4J-PB - we don't seem to handle the error code here + else if(m_errorCode!=0) + { + m_event = e_event_commerceError; + } + break; + + default: + break; + } + + LeaveCriticalSection(&m_queueLock); +} + + +void SonyCommerce::processEvent() +{ + int ret = 0; + + switch (m_event) + { + case e_event_none: + break; + case e_event_commerceSessionCreated: + app.DebugPrintf(4,"Commerce Session Created.\n"); + runCallback(); + break; + case e_event_commerceSessionAborted: + app.DebugPrintf(4,"Commerce Session aborted.\n"); + runCallback(); + break; + case e_event_commerceGotProductList: + app.DebugPrintf(4,"Got product list.\n"); + runCallback(); + break; + case e_event_commerceGotCategoryInfo: + app.DebugPrintf(4,"Got category info\n"); + runCallback(); + break; + case e_event_commerceGotDetailedProductInfo: + app.DebugPrintf(4,"Got detailed product info.\n"); + runCallback(); + break; + case e_event_commerceAddedDetailedProductInfo: + app.DebugPrintf(4,"Added detailed product info.\n"); + runCallback(); + break; + case e_event_commerceProductBrowseStarted: + break; + case e_event_commerceProductBrowseSuccess: + break; + case e_event_commerceProductBrowseAborted: + break; + case e_event_commerceProductBrowseFinished: + assert(0); +// ret = sys_memory_container_destroy(s_memContainer); +// if (ret < 0) { +// printf("Failed to destroy memory container"); +// } +// s_memContainer = SYS_MEMORY_CONTAINER_ID_INVALID; + break; + case e_event_commerceVoucherInputStarted: + break; + case e_event_commerceVoucherInputSuccess: + break; + case e_event_commerceVoucherInputAborted: + break; + case e_event_commerceVoucherInputFinished: + assert(0); +// ret = sys_memory_container_destroy(s_memContainer); +// if (ret < 0) { +// printf("Failed to destroy memory container"); +// } +// s_memContainer = SYS_MEMORY_CONTAINER_ID_INVALID; + break; + case e_event_commerceGotEntitlementList: + break; + case e_event_commerceConsumedEntitlement: + break; + case e_event_commerceCheckoutStarted: + app.DebugPrintf(4,"Checkout Started\n"); + break; + case e_event_commerceCheckoutSuccess: + app.DebugPrintf(4,"Checkout succeeded: 0x%x\n", m_errorCode); + // clear the DLC installed and check again + app.ClearDLCInstalled(); + ui.HandleDLCInstalled(0); + break; + case e_event_commerceCheckoutAborted: + app.DebugPrintf(4,"Checkout aborted: 0x%x\n", m_errorCode); + break; + case e_event_commerceCheckoutFinished: + app.DebugPrintf(4,"Checkout Finished: 0x%x\n", m_errorCode); + ret = sys_memory_container_destroy(m_memContainer); + if (ret < 0) { + app.DebugPrintf(4,"Failed to destroy memory container"); + } + + m_memContainer = SYS_MEMORY_CONTAINER_ID_INVALID; + // 4J-PB - if there's been an error - like dlc already purchased, the runcallback has already happened, and will crash this time + if(m_callbackFunc!=NULL) + { + runCallback(); + } + break; + case e_event_commerceDownloadListStarted: + app.DebugPrintf(4,"Download List Started\n"); + break; + case e_event_commerceDownloadListSuccess: + app.DebugPrintf(4,"Download succeeded: 0x%x\n", m_errorCode); + break; + case e_event_commerceDownloadListFinished: + app.DebugPrintf(4,"Download Finished: 0x%x\n", m_errorCode); + ret = sys_memory_container_destroy(m_memContainer); + if (ret < 0) { + app.DebugPrintf(4,"Failed to destroy memory container"); + } + + m_memContainer = SYS_MEMORY_CONTAINER_ID_INVALID; + // 4J-PB - if there's been an error - like dlc already purchased, the runcallback has already happened, and will crash this time + if(m_callbackFunc!=NULL) + { + runCallback(); + } + break; + case e_event_commerceError: + app.DebugPrintf(4,"Commerce Error 0x%x\n", m_errorCode); + + if(m_memContainer != SYS_MEMORY_CONTAINER_ID_INVALID) + { + ret = sys_memory_container_destroy(m_memContainer); + if (ret < 0) { + app.DebugPrintf(4,"Failed to destroy memory container"); + } + + m_memContainer = SYS_MEMORY_CONTAINER_ID_INVALID; + } + + runCallback(); + break; + default: + break; + } + m_event = e_event_none; +} + + +int SonyCommerce::commerceEnd() +{ + int ret = 0; + + if (m_currentPhase == e_phase_voucherRedeemPhase) + ret = sceNpCommerce2DoProductCodeFinishAsync(m_contextId); + else if (m_currentPhase == e_phase_productBrowsePhase) + ret = sceNpCommerce2DoProductBrowseFinishAsync(m_contextId); + else if (m_currentPhase == e_phase_creatingSessionPhase) + ret = sceNpCommerce2CreateSessionFinish(m_contextId, &m_sessionInfo); + else if (m_currentPhase == e_phase_checkoutPhase) + ret = sceNpCommerce2DoCheckoutFinishAsync(m_contextId); + else if (m_currentPhase == e_phase_downloadListPhase) + ret = sceNpCommerce2DoDlListFinishAsync(m_contextId); + + m_currentPhase = e_phase_idle; + + return ret; +} + +void SonyCommerce::CreateSession( CallbackFunc cb, LPVOID lpParam ) +{ + Init(); + EnterCriticalSection(&m_queueLock); + setCallback(cb,lpParam); + m_messageQueue.push(e_message_commerceCreateSession); + if(m_tickThread == NULL) + m_tickThread = new C4JThread(TickLoop, NULL, "SonyCommerce tick"); + if(m_tickThread->isRunning() == false) + { + m_currentPhase = e_phase_idle; + m_tickThread->Run(); + } + LeaveCriticalSection(&m_queueLock); +} + +void SonyCommerce::CloseSession() +{ + assert(m_currentPhase == e_phase_idle); + m_currentPhase = e_phase_stopped; + Shutdown(); +} + +void SonyCommerce::GetProductList( CallbackFunc cb, LPVOID lpParam, std::vector* productList, const char *categoryId) +{ + EnterCriticalSection(&m_queueLock); + setCallback(cb,lpParam); + m_pProductInfoList = productList; + strcpy(m_pCategoryID,categoryId); + m_messageQueue.push(e_message_commerceGetProductList); + LeaveCriticalSection(&m_queueLock); +} + +void SonyCommerce::GetDetailedProductInfo( CallbackFunc cb, LPVOID lpParam, ProductInfoDetailed* productInfo, const char *productId, const char *categoryId ) +{ + EnterCriticalSection(&m_queueLock); + setCallback(cb,lpParam); + m_pProductInfoDetailed = productInfo; + m_pProductID = productId; + strcpy(m_pCategoryID,categoryId); + m_messageQueue.push(e_message_commerceGetDetailedProductInfo); + LeaveCriticalSection(&m_queueLock); +} + +// 4J-PB - fill out the long description and the price for the product +void SonyCommerce::AddDetailedProductInfo( CallbackFunc cb, LPVOID lpParam, ProductInfo* productInfo, const char *productId, const char *categoryId ) +{ + EnterCriticalSection(&m_queueLock); + setCallback(cb,lpParam); + m_pProductInfo = productInfo; + m_pProductID = productId; + strcpy(m_pCategoryID,categoryId); + m_messageQueue.push(e_message_commerceAddDetailedProductInfo); + LeaveCriticalSection(&m_queueLock); +} +void SonyCommerce::GetCategoryInfo( CallbackFunc cb, LPVOID lpParam, CategoryInfo *info, const char *categoryId ) +{ + EnterCriticalSection(&m_queueLock); + setCallback(cb,lpParam); + m_pCategoryInfo = info; + strcpy(m_pCategoryID,categoryId); + m_messageQueue.push(e_message_commerceGetCategoryInfo); + LeaveCriticalSection(&m_queueLock); +} + +void SonyCommerce::Checkout( CallbackFunc cb, LPVOID lpParam, const char* skuID ) +{ + if(m_memContainer != SYS_MEMORY_CONTAINER_ID_INVALID) + { + return; + } + EnterCriticalSection(&m_queueLock); + setCallback(cb,lpParam); + int ret = sys_memory_container_create(&m_memContainer, SCE_NP_COMMERCE2_DO_CHECKOUT_MEMORY_CONTAINER_SIZE); + if (ret < 0) + { + app.DebugPrintf(4,"sys_memory_container_create() failed. ret = 0x%x\n", ret); + } + + m_checkoutInputParams.memContainer = &m_memContainer; + m_checkoutInputParams.skuIds.clear(); + m_checkoutInputParams.skuIds.push_back(skuID); + m_messageQueue.push(e_message_commerceCheckout); + LeaveCriticalSection(&m_queueLock); +} + +void SonyCommerce::DownloadAlreadyPurchased( CallbackFunc cb, LPVOID lpParam, const char* skuID ) +{ + if(m_memContainer != SYS_MEMORY_CONTAINER_ID_INVALID) + return; + EnterCriticalSection(&m_queueLock); + setCallback(cb,lpParam); + int ret = sys_memory_container_create(&m_memContainer, SCE_NP_COMMERCE2_DO_CHECKOUT_MEMORY_CONTAINER_SIZE); + if (ret < 0) + { + app.DebugPrintf(4,"sys_memory_container_create() failed. ret = 0x%x\n", ret); + } + + m_downloadInputParams.memContainer = &m_memContainer; + m_downloadInputParams.skuIds.clear(); + m_downloadInputParams.skuIds.push_back(skuID); + m_messageQueue.push(e_message_commerceDownloadList); + LeaveCriticalSection(&m_queueLock); +} + + + diff --git a/Minecraft.Client/Common/Network/Sony/SonyCommerce.h b/Minecraft.Client/Common/Network/Sony/SonyCommerce.h new file mode 100644 index 00000000..ff9423e8 --- /dev/null +++ b/Minecraft.Client/Common/Network/Sony/SonyCommerce.h @@ -0,0 +1,177 @@ +#pragma once + +#include +#include +#include +#ifdef __PS3__ +#include +#include +#include +#elif defined __PSVITA__ +#include +#include +#else // __ORBIS__ + +#define SCE_NP_COMMERCE2_CATEGORY_ID_LEN SCE_TOOLKIT_NP_COMMERCE_CATEGORY_ID_LEN ///< The size of the category ID. +#define SCE_NP_COMMERCE2_PRODUCT_ID_LEN SCE_TOOLKIT_NP_COMMERCE_PRODUCT_ID_LEN ///< The size of the product ID. +#define SCE_NP_COMMERCE2_CATEGORY_NAME_LEN SCE_TOOLKIT_NP_COMMERCE_CATEGORY_NAME_LEN ///< The size of the category name. +#define SCE_NP_COMMERCE2_CATEGORY_DESCRIPTION_LEN SCE_TOOLKIT_NP_COMMERCE_CATEGORY_DESCRIPTION_LEN ///< The size of the category description. +#define SCE_NP_COMMERCE2_URL_LEN SCE_TOOLKIT_NP_COMMERCE_URL_LEN ///< The size of the URL. +#define SCE_NP_COMMERCE2_PRODUCT_NAME_LEN SCE_TOOLKIT_NP_COMMERCE_PRODUCT_NAME_LEN ///< The size of the product name. +#define SCE_NP_COMMERCE2_PRODUCT_SHORT_DESCRIPTION_LEN SCE_TOOLKIT_NP_COMMERCE_PRODUCT_SHORT_DESCRIPTION_LEN ///< The size of the product short description. +#define SCE_NP_COMMERCE2_SP_NAME_LEN SCE_TOOLKIT_NP_COMMERCE_SP_NAME_LEN ///< The size of the licensee (publisher) name. +#define SCE_NP_COMMERCE2_CURRENCY_CODE_LEN SCE_TOOLKIT_NP_COMMERCE_CURRENCY_CODE_LEN ///< The size of currency code. +#define SCE_NP_COMMERCE2_CURRENCY_CODE_LEN SCE_TOOLKIT_NP_COMMERCE_CURRENCY_CODE_LEN +#define SCE_NP_COMMERCE2_CURRENCY_SYMBOL_LEN SCE_TOOLKIT_NP_COMMERCE_CURRENCY_SYMBOL_LEN ///< The size of currency symbol. +#define SCE_NP_COMMERCE2_THOUSAND_SEPARATOR_LEN SCE_TOOLKIT_NP_COMMERCE_THOUSAND_SEPARATOR_LEN ///< The size of the character separating every 3 digits of the price. +#define SCE_NP_COMMERCE2_DECIMAL_LETTER_LEN SCE_TOOLKIT_NP_COMMERCE_DECIMAL_LETTER_LEN ///< The size of the character indicating the decimal point in the price. +#define SCE_NP_COMMERCE2_SKU_ID_LEN SCE_TOOLKIT_NP_COMMERCE_SKU_ID_LEN ///< The size of the SKU ID. +#define SCE_NP_COMMERCE2_PRODUCT_LONG_DESCRIPTION_LEN SCE_TOOLKIT_NP_COMMERCE_PRODUCT_LONG_DESCRIPTION_LEN ///< The size of the product long description. +#define SCE_NP_COMMERCE2_PRODUCT_LEGAL_DESCRIPTION_LEN SCE_TOOLKIT_NP_COMMERCE_PRODUCT_LEGAL_DESCRIPTION_LEN ///< The size of the product legal description. +#define SCE_NP_COMMERCE2_RATING_SYSTEM_ID_LEN SCE_TOOLKIT_NP_COMMERCE_RATING_SYSTEM_ID_LEN ///< The size of the rating system ID. +#define SCE_NP_ENTITLEMENT_ID_SIZE SCE_TOOLKIT_NP_COMMERCE_ENTITLEMENT_ID_LEN ///< The size of entitlement ID. +#endif + +#ifndef __PSVITA__ +#define SCE_TOOLKIT_NP_SKU_PRICE_LEN (SCE_NP_COMMERCE2_CURRENCY_CODE_LEN \ + + SCE_NP_COMMERCE2_CURRENCY_SYMBOL_LEN \ + + SCE_NP_COMMERCE2_THOUSAND_SEPARATOR_LEN \ + + SCE_NP_COMMERCE2_DECIMAL_LETTER_LEN) ///< The maximum length of a price in characters. +#endif + +class SonyCommerce +{ + +public: + typedef void (*CallbackFunc)(LPVOID lpParam, int error_code); + + + /// @brief + /// Contains information about a subcategory on the PlayStation(R)Store. + /// + /// Contains information about a subcategory on the PlayStation(R)Store. + typedef struct CategoryInfoSub + { + char categoryId[SCE_NP_COMMERCE2_CATEGORY_ID_LEN]; ///< The ID of the subcategory. + char categoryName[SCE_NP_COMMERCE2_CATEGORY_NAME_LEN]; ///< The name of the subcategory. + char categoryDescription[SCE_NP_COMMERCE2_CATEGORY_DESCRIPTION_LEN]; ///< The detailed description of the subcategory. + char imageUrl[SCE_NP_COMMERCE2_URL_LEN]; ///< The image URL of the subcategory. + } + CategoryInfoSub; + + /// @brief + /// Current category information + /// + /// This structure contains information about a category on the PlayStation(R)Store + typedef struct CategoryInfo + { + CategoryInfoSub current; ///< The currently selected subcategory. + std::list subCategories; ///< Information about the subcategories in this category. + uint32_t countOfProducts; ///< The number of products in the category. + uint32_t countOfSubCategories; ///< The number of subcategories. + } + CategoryInfo; + + /// Contains information about a product in the PlayStation(R)Store. + typedef struct ProductInfo + { + uint32_t purchasabilityFlag; ///< A flag that indicates whether the product can be purchased (SCE_NP_COMMERCE2_SKU_PURCHASABILITY_FLAG_XXX). + uint32_t annotation; // SCE_NP_COMMERCE2_SKU_ANN_PURCHASED_CANNOT_PURCHASE_AGAIN or SCE_NP_COMMERCE2_SKU_ANN_PURCHASED_CAN_PURCHASE_AGAIN + uint32_t ui32Price; + char productId[SCE_NP_COMMERCE2_PRODUCT_ID_LEN]; ///< The product ID. + char productName[SCE_NP_COMMERCE2_PRODUCT_NAME_LEN]; ///< The name of the product. + char shortDescription[SCE_NP_COMMERCE2_PRODUCT_SHORT_DESCRIPTION_LEN]; ///< A short description of the product. + char longDescription[SCE_NP_COMMERCE2_PRODUCT_LONG_DESCRIPTION_LEN]; ///< A long description of the product. + char skuId[SCE_NP_COMMERCE2_SKU_ID_LEN]; ///< The SKU ID + char spName[SCE_NP_COMMERCE2_SP_NAME_LEN]; ///< The service provider name. + char imageUrl[SCE_NP_COMMERCE2_URL_LEN]; ///< The product image URL. + char price[SCE_TOOLKIT_NP_SKU_PRICE_LEN]; ///< The price of the product. This is formatted to include the currency code. + char padding[6]; ///< Padding. +#ifdef __PS3__ + CellRtcTick releaseDate; ///< The product release date. +#else + SceRtcTick releaseDate; +#endif + } + ProductInfo; + + /// @brief + /// Contains detailed information about a product on the PlayStation(R)Store. + /// + /// Contains detailed information about a product on the PlayStation(R)Store. + typedef struct ProductInfoDetailed + { + uint32_t purchasabilityFlag; ///< A flag that indicates whether the product can be purchased (SCE_NP_COMMERCE2_SKU_PURCHASABILITY_FLAG_XXX). + uint32_t ui32Price; + char skuId[SCE_NP_COMMERCE2_SKU_ID_LEN]; ///< The SKU ID + char productId[SCE_NP_COMMERCE2_PRODUCT_ID_LEN]; ///< The product ID. + char productName[SCE_NP_COMMERCE2_PRODUCT_NAME_LEN]; ///< The name of the product. + char shortDescription[SCE_NP_COMMERCE2_PRODUCT_SHORT_DESCRIPTION_LEN]; ///< A short description of the product. + char longDescription[SCE_NP_COMMERCE2_PRODUCT_LONG_DESCRIPTION_LEN]; ///< A long description of the product. + char legalDescription[SCE_NP_COMMERCE2_PRODUCT_LEGAL_DESCRIPTION_LEN]; ///< The legal description for the product. + char spName[SCE_NP_COMMERCE2_SP_NAME_LEN]; ///< The service provider name. + char imageUrl[SCE_NP_COMMERCE2_URL_LEN]; ///< The product image URL. + char price[SCE_TOOLKIT_NP_SKU_PRICE_LEN]; ///< The price of the product. This is formatted to include the currency code. + char ratingSystemId[SCE_NP_COMMERCE2_RATING_SYSTEM_ID_LEN]; ///< The ID of the rating system (for example: PEGI, ESRB). + char ratingImageUrl[SCE_NP_COMMERCE2_URL_LEN]; ///< The URL of the rating icon. + char padding[2]; ///< Padding. +#ifdef __PS3__ + std::list ratingDescriptors; ///< The list of rating descriptors. + CellRtcTick releaseDate; ///< The product release date. +#else + SceRtcTick releaseDate; ///< The product release date. +#endif + } + ProductInfoDetailed; + + /// @brief + /// Checkout parameters + /// + /// This structure contains list of SKUs to checkout to and a memory container + typedef struct CheckoutInputParams + { + std::list skuIds; ///< List of SKU IDs +#ifdef __PS3__ + sys_memory_container_t *memContainer; ///< Memory container for checkout overlay +#endif + } + CheckoutInputParams; + + /// @brief + /// Contains download list parameters. + /// + /// Contains download list parameters. + typedef struct DownloadListInputParams + { + std::list skuIds; ///< The list of SKU IDs +#ifdef __PS3__ + sys_memory_container_t *memContainer; ///< A memory container for checkout overlay. +#endif + const char* categoryID; + } + DownloadListInputParams; + + +public: + virtual void CreateSession(CallbackFunc cb, LPVOID lpParam) = 0; + virtual void CloseSession() = 0; + + virtual void GetCategoryInfo(CallbackFunc cb, LPVOID lpParam, CategoryInfo *info, const char *categoryId) = 0; + virtual void GetProductList(CallbackFunc cb, LPVOID lpParam, std::vector* productList, const char *categoryId) = 0; + virtual void GetDetailedProductInfo(CallbackFunc cb, LPVOID lpParam, ProductInfoDetailed* productInfoDetailed, const char *productId, const char *categoryId) = 0; + virtual void AddDetailedProductInfo( CallbackFunc cb, LPVOID lpParam, ProductInfo* productInfo, const char *productId, const char *categoryId ) = 0; + virtual void Checkout(CallbackFunc cb, LPVOID lpParam, const char* skuID) = 0; + virtual void DownloadAlreadyPurchased(CallbackFunc cb, LPVOID lpParam, const char* skuID) = 0; +#if defined(__ORBIS__) || defined( __PSVITA__) + virtual void Checkout_Game(CallbackFunc cb, LPVOID lpParam, const char* skuID) = 0; + virtual void DownloadAlreadyPurchased_Game(CallbackFunc cb, LPVOID lpParam, const char* skuID) = 0; +#endif + virtual void UpgradeTrial(CallbackFunc cb, LPVOID lpParam) = 0; + virtual void CheckForTrialUpgradeKey() = 0; + virtual bool LicenseChecked() = 0; + +#if defined __ORBIS__ || defined __PSVITA__ + virtual void ShowPsStoreIcon() = 0; + virtual void HidePsStoreIcon() = 0; +#endif +}; diff --git a/Minecraft.Client/Common/Network/Sony/SonyHttp.cpp b/Minecraft.Client/Common/Network/Sony/SonyHttp.cpp new file mode 100644 index 00000000..f0095885 --- /dev/null +++ b/Minecraft.Client/Common/Network/Sony/SonyHttp.cpp @@ -0,0 +1,34 @@ +#include "stdafx.h" +#include "SonyHttp.h" + + +#ifdef __PS3__ +#include "PS3\Network\SonyHttp_PS3.h" +SonyHttp_PS3 g_SonyHttp; + +#elif defined __ORBIS__ +#include "Orbis\Network\SonyHttp_Orbis.h" +SonyHttp_Orbis g_SonyHttp; + +#elif defined __PSVITA__ +#include "PSVita\Network\SonyHttp_Vita.h" +SonyHttp_Vita g_SonyHttp; + +#endif + + + +bool SonyHttp::init() +{ + return g_SonyHttp.init(); +} + +void SonyHttp::shutdown() +{ + g_SonyHttp.shutdown(); +} + +bool SonyHttp::getDataFromURL(const char* szURL, void** ppOutData, int* pDataSize) +{ + return g_SonyHttp.getDataFromURL(szURL, ppOutData, pDataSize); +} diff --git a/Minecraft.Client/Common/Network/Sony/SonyHttp.h b/Minecraft.Client/Common/Network/Sony/SonyHttp.h new file mode 100644 index 00000000..3fa526b0 --- /dev/null +++ b/Minecraft.Client/Common/Network/Sony/SonyHttp.h @@ -0,0 +1,11 @@ +#pragma once + + + +class SonyHttp +{ +public: + static bool init(); + static void shutdown(); + static bool getDataFromURL(const char* szURL, void** ppOutData, int* pDataSize); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Network/Sony/SonyRemoteStorage.cpp b/Minecraft.Client/Common/Network/Sony/SonyRemoteStorage.cpp new file mode 100644 index 00000000..4468d163 --- /dev/null +++ b/Minecraft.Client/Common/Network/Sony/SonyRemoteStorage.cpp @@ -0,0 +1,507 @@ + + +#include "stdafx.h" +#include "SonyRemoteStorage.h" + + +static const char sc_remoteSaveFilename[] = "/minecraft_save/gamedata.rs"; +#ifdef __PSVITA__ +static const char sc_localSaveFilename[] = "CloudSave_Vita.bin"; +static const char sc_localSaveFullPath[] = "savedata0:CloudSave_Vita.bin"; +#elif defined __PS3__ +static const char sc_localSaveFilename[] = "CloudSave_PS3.bin"; +static const char sc_localSaveFullPath[] = "NPEB01899--140720203552"; +#else +static const char sc_localSaveFilename[] = "CloudSave_Orbis.bin"; +static const char sc_localSaveFullPath[] = "/app0/CloudSave_Orbis.bin"; +#endif + +static SceRemoteStorageStatus statParams; + + + + +// void remoteStorageGetCallback(LPVOID lpParam, SonyRemoteStorage::Status s, int error_code) +// { +// app.DebugPrintf("remoteStorageGetCallback err : 0x%08x\n"); +// } +// +// void remoteStorageCallback(LPVOID lpParam, SonyRemoteStorage::Status s, int error_code) +// { +// app.DebugPrintf("remoteStorageCallback err : 0x%08x\n"); +// +// app.getRemoteStorage()->getRemoteFileInfo(&statParams, remoteStorageGetInfoCallback, NULL); +// } + + + + +void 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)); + } + +} + + + + +void getSaveInfoReturnCallback(LPVOID lpParam, SonyRemoteStorage::Status s, int error_code) +{ + SonyRemoteStorage* pRemoteStorage = (SonyRemoteStorage*)lpParam; + app.DebugPrintf("remoteStorageGetInfoCallback err : 0x%08x\n", error_code); + if(error_code == 0) + { + for(int i=0;im_remoteFileInfo = &statParams.data[i]; + pRemoteStorage->SetRetrievedDescData(); + pRemoteStorage->m_getInfoStatus = SonyRemoteStorage::e_infoFound; + } + } + } + if(pRemoteStorage->m_getInfoStatus != SonyRemoteStorage::e_infoFound) + pRemoteStorage->m_getInfoStatus = SonyRemoteStorage::e_noInfoFound; +} + + + + + + +static void getSaveInfoInitCallback(LPVOID lpParam, SonyRemoteStorage::Status s, int error_code) +{ + SonyRemoteStorage* pRemoteStorage = (SonyRemoteStorage*)lpParam; + if(error_code != 0) + { + app.DebugPrintf("getSaveInfoInitCallback err : 0x%08x\n", error_code); + pRemoteStorage->m_getInfoStatus = SonyRemoteStorage::e_noInfoFound; + } + else + { + app.DebugPrintf("getSaveInfoInitCallback calling getRemoteFileInfo\n"); + app.getRemoteStorage()->getRemoteFileInfo(&statParams, getSaveInfoReturnCallback, pRemoteStorage); + } +} + +void SonyRemoteStorage::getSaveInfo() +{ + if(m_getInfoStatus == e_gettingInfo) + { + app.DebugPrintf("SonyRemoteStorage::getSaveInfo already running!!!\n"); + return; + } + + m_getInfoStatus = e_gettingInfo; + if(!ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad())) + { + m_getInfoStatus = e_noInfoFound; + return; + } + app.DebugPrintf("SonyRemoteStorage::getSaveInfo calling init\n"); + + bool bOK = init(getSaveInfoInitCallback, this); + if(!bOK) + m_getInfoStatus = e_noInfoFound; +} + +bool SonyRemoteStorage::getSaveData( const char* localDirname, CallbackFunc cb, LPVOID lpParam ) +{ + m_startTime = System::currentTimeMillis(); + m_dataProgress = -1; + return getData(sc_remoteSaveFilename, localDirname, cb, lpParam); +} + + +static void setSaveDataInitCallback(LPVOID lpParam, SonyRemoteStorage::Status s, int error_code) +{ + SonyRemoteStorage* pRemoteStorage = (SonyRemoteStorage*)lpParam; + if(error_code != 0) + { + app.DebugPrintf("setSaveDataInitCallback err : 0x%08x\n", error_code); + pRemoteStorage->m_setDataStatus = SonyRemoteStorage::e_settingDataFailed; + if(pRemoteStorage->m_initCallbackFunc) + pRemoteStorage->m_initCallbackFunc(pRemoteStorage->m_initCallbackParam, s, error_code); + } + else + { + app.getRemoteStorage()->setData(pRemoteStorage->m_setSaveDataInfo, pRemoteStorage->m_initCallbackFunc, pRemoteStorage->m_initCallbackParam); + } + +} +bool SonyRemoteStorage::setSaveData(PSAVE_INFO info, CallbackFunc cb, void* lpParam) +{ + m_setSaveDataInfo = info; + m_setDataStatus = e_settingData; + m_initCallbackFunc = cb; + m_initCallbackParam = lpParam; + m_dataProgress = -1; + m_uploadSaveSize = 0; + m_startTime = System::currentTimeMillis(); + bool bOK = init(setSaveDataInitCallback, this); + if(!bOK) + m_setDataStatus = e_settingDataFailed; + + return bOK; +} + +const char* SonyRemoteStorage::getLocalFilename() +{ + return sc_localSaveFullPath; +} + +const char* SonyRemoteStorage::getSaveNameUTF8() +{ + if(m_getInfoStatus != e_infoFound) + return NULL; + return m_retrievedDescData.m_saveNameUTF8; +} + +ESavePlatform SonyRemoteStorage::getSavePlatform() +{ + if(m_getInfoStatus != e_infoFound) + return SAVE_FILE_PLATFORM_NONE; + return m_retrievedDescData.m_savePlatform; + +} + +__int64 SonyRemoteStorage::getSaveSeed() +{ + if(m_getInfoStatus != e_infoFound) + return 0; + + return m_retrievedDescData.m_seed; +} + +unsigned int SonyRemoteStorage::getSaveHostOptions() +{ + if(m_getInfoStatus != e_infoFound) + return 0; + return m_retrievedDescData.m_hostOptions; +} + +unsigned int SonyRemoteStorage::getSaveTexturePack() +{ + if(m_getInfoStatus != e_infoFound) + return 0; + + return m_retrievedDescData.m_texturePack; +} + +const char* SonyRemoteStorage::getRemoteSaveFilename() +{ + return sc_remoteSaveFilename; +} + +int SonyRemoteStorage::getSaveFilesize() +{ + if(m_getInfoStatus == e_infoFound) + { + return m_remoteFileInfo->fileSize; + } + return 0; +} + + +bool SonyRemoteStorage::setData( PSAVE_INFO info, CallbackFunc cb, LPVOID lpParam ) +{ + m_setDataSaveInfo = info; + m_callbackFunc = cb; + m_callbackParam = lpParam; + m_status = e_setDataInProgress; + + C4JStorage::ESaveGameState eLoadStatus=StorageManager.LoadSaveDataThumbnail(info,&LoadSaveDataThumbnailReturned,this); + return true; +} + +int SonyRemoteStorage::LoadSaveDataThumbnailReturned(LPVOID lpParam,PBYTE pbThumbnail,DWORD dwThumbnailBytes) +{ + SonyRemoteStorage *pClass= (SonyRemoteStorage *)lpParam; + + if(pClass->m_bAborting) + { + pClass->runCallback(); + return 0; + } + + app.DebugPrintf("Received data for a thumbnail\n"); + + if(pbThumbnail && dwThumbnailBytes) + { + pClass->m_thumbnailData = pbThumbnail; + pClass->m_thumbnailDataSize = dwThumbnailBytes; + } + else + { + app.DebugPrintf("Thumbnail data is NULL, or has size 0\n"); + pClass->m_thumbnailData = NULL; + pClass->m_thumbnailDataSize = 0; + } + + if(pClass->m_SetDataThread != NULL) + delete pClass->m_SetDataThread; + + pClass->m_SetDataThread = new C4JThread(setDataThread, pClass, "setDataThread"); + pClass->m_SetDataThread->Run(); + + return 0; +} + +int SonyRemoteStorage::setDataThread(void* lpParam) +{ + SonyRemoteStorage* pClass = (SonyRemoteStorage*)lpParam; + pClass->m_startTime = System::currentTimeMillis(); + pClass->setDataInternal(); + return 0; +} + +bool SonyRemoteStorage::saveIsAvailable() +{ + if(m_getInfoStatus != e_infoFound) + return false; +#ifdef __PS3__ + return (getSavePlatform() == SAVE_FILE_PLATFORM_PSVITA); +#elif defined __PSVITA__ + return (getSavePlatform() == SAVE_FILE_PLATFORM_PS3); +#else // __ORBIS__ + return true; +#endif +} + +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; + float estimatedTransfered = float(elapsedSecs * transferRatePerSec); + int progVal = m_dataProgress + (estimatedTransfered / float(totalSize)) * 100; + if(progVal > nextChunk) + return nextChunk; + if(progVal > 99) + { + if(m_dataProgress > 99) + return m_dataProgress; + return 99; + } + return progVal; +} + + +bool SonyRemoteStorage::shutdown() +{ + if(m_bInitialised) + { + int ret = sceRemoteStorageTerm(); + if(ret >= 0) + { + app.DebugPrintf("Term request done \n"); + m_bInitialised = false; + free(m_memPoolBuffer); + m_memPoolBuffer = NULL; + return true; + } + else + { + app.DebugPrintf("Error in Term request: 0x%x \n", ret); + return false; + } + } + return true; +} + + +void SonyRemoteStorage::waitForStorageManagerIdle() +{ + C4JStorage::ESaveGameState storageState = StorageManager.GetSaveState(); + while(storageState != C4JStorage::ESaveGame_Idle) + { + Sleep(10); +// app.DebugPrintf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>> storageState = %d\n", storageState); + storageState = StorageManager.GetSaveState(); + } +} +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 new file mode 100644 index 00000000..d38a06e2 --- /dev/null +++ b/Minecraft.Client/Common/Network/Sony/SonyRemoteStorage.h @@ -0,0 +1,163 @@ +#pragma once + + +#include "..\..\Common\Network\Sony\sceRemoteStorage\header\sceRemoteStorage.h" + +class SonyRemoteStorage +{ +public: + enum Status + { + e_idle, + e_accountLinked, + e_error, + e_signInRequired, + e_compressInProgress, + e_setDataInProgress, + e_setDataSucceeded, + e_getDataInProgress, + e_getDataSucceeded, + e_getStatusInProgress, + e_getStatusSucceeded + }; + typedef void (*CallbackFunc)(LPVOID lpParam, Status s, int error_code); + + enum GetInfoStatus + { + e_gettingInfo, + e_infoFound, + e_noInfoFound + }; + GetInfoStatus m_getInfoStatus; + + enum SetDataStatus + { + e_settingData, + e_settingDataFailed, + e_settingDataSucceeded + }; + SetDataStatus m_setDataStatus; + + PSAVE_INFO m_setSaveDataInfo; + SceRemoteStorageData* m_remoteFileInfo; + char m_saveFileDesc[128]; + + class DescriptionData + { + // this stuff is read from a JSON query, so it all has to be text based, max 256 bytes + public: + char m_platform[4]; + char m_seed[16]; // 8 bytes as hex + char m_hostOptions[8]; // 4 bytes as hex + char m_texturePack[8]; // 4 bytes as hex + char m_saveNameUTF8[128]; + }; + + 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; + + + CallbackFunc m_initCallbackFunc; + void* m_initCallbackParam; + + void getSaveInfo(); + bool waitingForSaveInfo() { return (m_getInfoStatus == e_gettingInfo); } + bool saveIsAvailable(); + bool saveVersionSupported(); + + int getSaveFilesize(); + bool getSaveData(const char* localDirname, CallbackFunc cb, LPVOID lpParam); + + bool setSaveData(PSAVE_INFO info, CallbackFunc cb, void* lpParam); + bool waitingForSetData() { return (m_setDataStatus == e_settingData); } + + const char* getLocalFilename(); + const char* getSaveNameUTF8(); + ESavePlatform getSavePlatform(); + __int64 getSaveSeed(); + unsigned int getSaveHostOptions(); + unsigned int getSaveTexturePack(); + + void SetServiceID(char *pchServiceID) { m_pchServiceID=pchServiceID; } + + virtual bool init(CallbackFunc cb, LPVOID lpParam) = 0; + virtual bool getRemoteFileInfo(SceRemoteStorageStatus* pInfo, CallbackFunc cb, LPVOID lpParam) = 0; + virtual bool getData(const char* remotePath, const char* localPath, CallbackFunc cb, LPVOID lpParam) = 0; + virtual void abort() = 0; + virtual bool shutdown(); + virtual bool setDataInternal() = 0; + virtual void runCallback() = 0; + + + Status getStatus() { return m_status; } + int getDataProgress(); + void waitForStorageManagerIdle(); + + + + bool setData( PSAVE_INFO info, CallbackFunc cb, LPVOID lpParam ); + static int LoadSaveDataThumbnailReturned(LPVOID lpParam,PBYTE pbThumbnail,DWORD dwThumbnailBytes); + static int setDataThread(void* lpParam); + + SonyRemoteStorage() : m_memPoolBuffer(NULL), m_bInitialised(false),m_getInfoStatus(e_noInfoFound) {} + +protected: + const char* getRemoteSaveFilename(); + bool m_bInitialised; + void* m_memPoolBuffer; + Status m_status; + int m_dataProgress; + char *m_pchServiceID; + + PBYTE m_thumbnailData; + unsigned int m_thumbnailDataSize; + C4JThread* m_SetDataThread; + PSAVE_INFO m_setDataSaveInfo; + __int64 m_startTime; + + bool m_bAborting; + bool m_bTransferStarted; + int m_uploadSaveSize; +}; + diff --git a/Minecraft.Client/Common/Network/Sony/sceRemoteStorage/header/sceRemoteStorage.h b/Minecraft.Client/Common/Network/Sony/sceRemoteStorage/header/sceRemoteStorage.h new file mode 100644 index 00000000..de70398d --- /dev/null +++ b/Minecraft.Client/Common/Network/Sony/sceRemoteStorage/header/sceRemoteStorage.h @@ -0,0 +1,137 @@ + +#ifndef SCE_REMOTE_STORAGE_H +#define SCE_REMOTE_STORAGE_H + +#include "sceRemoteStorageDefines.h" + +/// @brief +/// Initialises the RemoteStorage library. +/// +/// Initialises the RemoteStorage library, creates a session on the server and starts the Thread to process requests. +/// This method must be executed to start the RemoteStorage library or none of its functionality will be available. +/// This method will block while it initializes its thread and will return an error if it is +/// unable to do so. The session will be created on the thread once this is created and it won't be a blocking operation. +/// +/// It is important to note that HTTP, SSL and NET libraries are not being initialised by the library and should be initialised outside of it. +/// +/// @param params The structure of type <>SceRemoteStorageInitParams that contains necessary information to start the library. +/// +/// @retval SCE_REMOTE_STORAGE_SUCCESS The operation was successfully registered on the thread. +/// @retval SCE_REMOTE_STORAGE_ERROR_INVALID_ARGUMENT At least one of the arguments passed in the input structure is not valid. +/// @retval SCE_REMOTE_STORAGE_ERROR_FAILED_TO_ALLOCATE There is no enough memory on the library to perform an allocation. +/// @retval USER_ACCOUNT_LINKED This event will be sent to the event callback when the session is created and linked to PSN on the server +/// @retval PSN_SIGN_IN_REQUIRED This event will be sent to the event callback when the session is created but not linked to PSN on the server. +/// This will only happen on the PC version and requires to call sceRemoteStorageOpenWebBrowser() function. +/// @retval ERROR_OCCURRED This event will be sent to the event callback when an error has occurred in the thread. +/// +/// @note System errors may be returned. Design your code so it does expect other errors. +int32_t sceRemoteStorageInit(const SceRemoteStorageInitParams & params); + +/// @brief +/// Terminates the RemoteStorage library. +/// +/// Terminates the RemoteStorage library and deletes the thread that process requests. +/// This method must be executed to terminate the RemoteStorage library to prevent leaks in memory and resources. +/// This method will abort any other pending requests and terminate the library. It won't wait for requests to finish. +/// This method is synchronous and does not make use of the callback to inform the user of success termination. It is executed on the calling thread. +/// +/// @retval SCE_REMOTE_STORAGE_SUCCESS The operation was successful. +/// @retval SCE_REMOTE_STORAGE_ERROR_NOT_INITIALISED The RemoteStorage library was not initialised. +/// +/// @note System errors may be returned. Design your code so it does expect other errors. +int32_t sceRemoteStorageTerm(); + +/// @brief +/// Aborts a request sent to the RemoteStorage library. +/// +/// Aborts a request being processed or pending to be processed by the RemoteStorage library. +/// This method is synchronous and does not make use of the callback to inform the user of success termination. It is executed on the calling thread. +/// +/// @param param A structure containing the request Id to be aborted. +/// This request Id is provided by other functions (get/setData, getStatus and OpenWebBrowser) so they can be referenced. +/// +/// @retval SCE_REMOTE_STORAGE_SUCCESS The operation was successful. +/// @retval SCE_REMOTE_STORAGE_ERROR_NOT_INITIALISED The RemoteStorage library was not initialised. +/// @retval SCE_REMOTE_STORAGE_ERROR_REQ_ID_NOT_FOUND The request Id sent is not found. +/// +/// @note System errors may be returned. Design your code so it does expect other errors. +int32_t sceRemoteStorageAbort(const SceRemoteStorageAbortReqParams & params); + +/// @brief +/// Opens the default web browser to sign in to PSN on PC. +/// +/// Opens the default web browser to sign in to PSN on PC. This function does not have any functionality on other platforms. +/// This method does make use of the callback to inform the user of success termination. This function has priority over other functions on the thread (as getData(), getStatus() +/// and setData()) and it will be executed as soon as the thread finishes processing a pending request. +/// +/// @param param The structure containing extra parameters to be passed in. This structure does only exist for future expansions. +/// +/// @retval SCE_REMOTE_STORAGE_SUCCESS The operation was successfully registered on the thread. +/// @retval SCE_REMOTE_STORAGE_ERROR_NOT_INITIALISED The RemoteStorage library was not initialised. +/// @retval SCE_REMOTE_STORAGE_ERROR_FAILED_TO_ALLOCATE There is no enough memory on the library to perform an allocation. +/// @retval ERROR_OCCURRED This event will be sent to the event callback when an error has occurred in the thread. +/// +/// @note System errors may be returned. Design your code so it does expect other errors. +int32_t sceRemoteStorageOpenWebBrowser(const SceRemoteStorageWebBrowserReqParams & params); + +/// @brief +/// Gives details for all files of a user. +/// +/// Gives details for all files of a user. It provides generic information (remaining bandwidth per day, HDD space per user, number of files) as well as +/// specific file information (number of bytes, file name, file description, MD5 checksum, timestamp and file visibility). File data is not provided. +/// This method does make use of the callback to inform the user of success termination. The SceRemoteStorageStatus pointer must be pointer a to a valid +/// location in memory until the callback is called as the output information will be stored in such location. +/// +/// @param params The structure containing extra parameters to be passed in. This structure does only exist for future expansions. +/// @param status The structure where the output information will be stored. The memory location being pointed must be valid until the callback gets called. +/// +/// @retval SCE_REMOTE_STORAGE_SUCCESS The operation was successfully registered on the thread. +/// @retval SCE_REMOTE_STORAGE_ERROR_NOT_INITIALISED The RemoteStorage library was not initialised. +/// @retval SCE_REMOTE_STORAGE_ERROR_FAILED_TO_ALLOCATE There is no enough memory on the library to perform an allocation. +/// @retval ERROR_OCCURRED This event will be sent to the event callback when an error has occurred in the thread. +/// +/// @note System errors may be returned. Design your code so it does expect other errors. +int32_t sceRemoteStorageGetStatus(const SceRemoteStorageStatusReqParams & params, SceRemoteStorageStatus * status); + +/// @brief +/// Gets section of data from a file specified. +/// +/// Gets section of data from a file specified. The amount of data requested can be of any size. To request this information the name of file, the number of bytes and +/// the byte to start reading along with a buffer to store such data must be provided. +/// Metadata information of the file, as description or visibility, will be provided only in the case the first amount of bytes for the file are requested (offset = 0). +/// This method does make use of the callback to inform the user of success termination. The SceRemoteStorageData pointer must be a pointer to a valid +/// location in memory until the callback is called as the output information will be stored in such location. +/// +/// @param params The structure containing the file name to read, the start byte to start reading and the amount of bytes to read. +/// @param status The structure where the output information will be stored. The memory location being pointed must be valid until the callback gets called. +/// +/// @retval SCE_REMOTE_STORAGE_SUCCESS The operation was successfully registered on the thread. +/// @retval SCE_REMOTE_STORAGE_ERROR_NOT_INITIALISED The RemoteStorage library was not initialised. +/// @retval SCE_REMOTE_STORAGE_ERROR_FAILED_TO_ALLOCATE There is no enough memory on the library to perform an allocation. +/// @retval ERROR_OCCURRED This event will be sent to the event callback when an error has occurred in the thread. +/// +/// @note System errors may be returned. Design your code so it does expect other errors. +int32_t sceRemoteStorageGetData(const SceRemoteStorageGetDataReqParams & params, SceRemoteStorageData * data); + +/// @brief +/// Sets chunk of data to a file specified. +/// +/// Sets chunk of data to a file specified. The amount of data sent must be of, at least, 5 Megabytes per chunk excepts +/// in the case of the last chunk of the file (or the only one if that is the case) as it can be smaller. +/// The information provided regarding the chunk as the chunk number, total number of chunks, data buffer and its size should be provided in every call. +/// The information provided regarding the file as its name, description and visibility should be provided in the last chunk only (this is, when +/// chunk number = number of chunks). +/// This method does make use of the callback to inform the user of success termination. The data attribute of the SceRemoteStorageSetDataReqParams pointer +/// must be a pointer to a valid location in memory until the callback is called as the buffer won't be copied internally. +/// +/// @param data The structure containing the chunk information. +/// +/// @retval SCE_REMOTE_STORAGE_SUCCESS The operation was successfully registered on the thread. +/// @retval SCE_REMOTE_STORAGE_ERROR_NOT_INITIALISED The RemoteStorage library was not initialised. +/// @retval SCE_REMOTE_STORAGE_ERROR_FAILED_TO_ALLOCATE There is no enough memory on the library to perform an allocation. +/// @retval ERROR_OCCURRED This event will be sent to the event callback when an error has occurred in the thread. +/// +/// @note System errors may be returned. Design your code so it does expect other errors. +int32_t sceRemoteStorageSetData(const SceRemoteStorageSetDataReqParams & data); + +#endif \ No newline at end of file diff --git a/Minecraft.Client/Common/Network/Sony/sceRemoteStorage/header/sceRemoteStorageDefines.h b/Minecraft.Client/Common/Network/Sony/sceRemoteStorage/header/sceRemoteStorageDefines.h new file mode 100644 index 00000000..b3c8f5cc --- /dev/null +++ b/Minecraft.Client/Common/Network/Sony/sceRemoteStorage/header/sceRemoteStorageDefines.h @@ -0,0 +1,167 @@ + +#ifndef SCE_REMOTE_STORAGE_DEFINES_H +#define SCE_REMOTE_STORAGE_DEFINES_H + +#ifdef __psp2__ +#include +#include +#elif __ORBIS__ +#include +#define SceAppUtilSaveDataDataSlot int +#elif __PS3__ +#define SceAppUtilSaveDataDataSlot int +#endif + +#include + +// Macros +#define SCE_REMOTE_STORAGE_MAX_FILES 16 +#define SCE_REMOTE_STORAGE_DATA_NAME_MAX_LEN 64 +#define SCE_REMOTE_STORAGE_CLIENT_ID_MAX_LEN 64 +#define SCE_REMOTE_STORAGE_PLATFORM_NAME_MAX_LEN 16 +#define SCE_REMOTE_STORAGE_MD5_STRING_LENGTH 33 +#define SCE_REMOTE_STORAGE_RFC2822_LENGTH 32 +#define SCE_REMOTE_STORAGE_DATA_DESCRIPTION_MAX_LEN 256 +#define SCE_REMOTE_STORAGE_DATA_LOCATION_MAX_LEN 256 +#define SCE_REMOTE_STORAGE_PS3_SAVEDATA_SECUREFILEID_SIZE 16 +#define SCE_REMOTE_STORAGE_PS3_SAVEDATA_FILENAME_SIZE 13 +#define SCE_REMOTE_STORAGE_AUTH_CODE_MAX_LEN 128 + +// Return values +#define SCE_REMOTE_STORAGE_SUCCESS 0 + +// Error codes +#define SCE_REMOTE_STORAGE_ERROR_INVALID_ARGUMENT 0x80001001 +#define SCE_REMOTE_STORAGE_ERROR_FAILED_TO_CREATE_THREAD 0x80001002 +#define SCE_REMOTE_STORAGE_ERROR_NOT_INITIALISED 0x80001003 +#define SCE_REMOTE_STORAGE_ERROR_FAILED_TO_OPEN_WEB_BROWSER 0x80001004 +#define SCE_REMOTE_STORAGE_ERROR_PSN_ACCOUNT_NOT_LINKED 0x80001005 +#define SCE_REMOTE_STORAGE_ERROR_COULD_NOT_CREATE_SESSION 0x80001006 +#define SCE_REMOTE_STORAGE_ERROR_FAILED_TO_ALLOCATE 0x80001007 +#define SCE_REMOTE_STORAGE_ERROR_SESSION_DOES_NOT_EXIST 0x80001008 +#define SCE_REMOTE_STORAGE_ERROR_REQ_ID_NOT_FOUND 0x80001009 +#define SCE_REMOTE_STORAGE_ERROR_MAX_NUMBER_FILES_REACHED 0x8000100A +#define SCE_REMOTE_STORAGE_ERROR_NO_MORE_SYNCS 0x8000100B +#define SCE_REMOTE_STORAGE_ERROR_ALREADY_INITIALISED 0x8000100C +#define SCE_REMOTE_STORAGE_ERROR_INVALID_UPLOADID 0x8000100D +#define SCE_REMOTE_STORAGE_ERROR_FAILED_TO_OPEN_FILE 0x8000100E +#define SCE_REMOTE_STORAGE_ERROR_CLOUD_DATA_CORRUPTED 0x8000100F +#define SCE_REMOTE_STORAGE_ERROR_INVALID_CHAR_IN_FILE_NAME 0x80001010 +#define SCE_REMOTE_STORAGE_ERROR_INVALID_JSON_RESPONSE 0x80001011 +#define SCE_REMOTE_STORAGE_ERROR_REQUEST_ABORTED 0x80001012 +#define SCE_REMOTE_STORAGE_ERROR_SERVER_ERROR 0x80002000 // Server errors can be between 0x80002064 to 0x800022BB both included + + +typedef enum SceRemoteStorageDataVisibility +{ + PRIVATE = 0, // Only data owner can read and write data + PUBLIC_READ_ONLY, // Everyone can read this data. Owner can write to it + PUBLIC_READ_WRITE // Everyone can read and write data +} SceRemoteStorageDataVisibility; + +typedef enum SceRemoteStorageEvent +{ + USER_ACCOUNT_LINKED = 0, // User's account has been linked with PSN + PSN_SIGN_IN_REQUIRED, // User's PSN sign-in through web browser is required + WEB_BROWSER_RESULT, // Result of sceRemoteStorageOpenWebBrowser(). Please check retCode + GET_DATA_RESULT, // Result of sceRemoteStorageGetData(). Please check retCode + GET_DATA_PROGRESS, // Progress of sceRemoteStorageGetData() completion as a percentage. Please check retCode + SET_DATA_RESULT, // Result of sceRemoteStorageSetData(). Please check retCode + SET_DATA_PROGRESS, // Progress of sceRemoteStorageSetData() completion as a percentage. Please check retCode + GET_STATUS_RESULT, // Result of sceRemoteStorageGetStatus(). Please check retCode + ERROR_OCCURRED // A generic error has occurred. Please check retCode +} SceRemoteStorageEvent; + +typedef enum SceRemoteStorageEnvironment +{ + DEVELOPMENT = 0, + PRODUCTION +}SceRemoteStorageEnvironment; + +typedef void (*sceRemoteStorageCallback)(const SceRemoteStorageEvent event, int32_t retCode, void * userData); + +typedef struct SceRemoteStorageInitParamsThread +{ + int32_t threadAffinity; // Thread affinity + int32_t threadPriority; // Priority that the thread runs out +} SceRemoteStorageInitParamsThread; + +typedef struct SceRemoteStorageInitParamsPool +{ + void * memPoolBuffer; // Memory pool used by sceRemoteStorage library + size_t memPoolSize; // Size of memPoolBuffer +} SceRemoteStorageInitParamsPool; + +typedef struct SceRemoteStorageInitTimeout +{ + uint32_t resolveMs; //Timeout for DNS resolution in milliseconds. Defaults to 30 seconds + uint32_t connectMs; //Timeout for first connection between client and server. Defaults to 30 seconds + uint32_t sendMs; //Timeout to send request to server. Defaults to 120 seconds + uint32_t receiveMs; //Timeout to receive information from server. Defaults to 120 seconds + + SceRemoteStorageInitTimeout() : resolveMs(30 * 1000), connectMs(30 * 1000), sendMs(120 * 1000), receiveMs(120 * 1000) {} +}SceRemoteStorageInitTimeout; + +typedef struct SceRemoteStorageInitParams +{ + sceRemoteStorageCallback callback; // Event callback + void * userData; // Application defined data for callback + int32_t httpContextId; // PS4 only: Http context ID that was returned from sceHttpInit() + int32_t userId; // PS4 only: Current user, see SceUserServiceUserId + void * psnTicket; // PS3 only: The PSN ticket used to authenticate the user + size_t psnTicketSize; // PS3 only: The size of the PSN ticket in bytes + char clientId[SCE_REMOTE_STORAGE_CLIENT_ID_MAX_LEN]; // This represents your application on PSN, used to sign PSN user in for your title + SceRemoteStorageInitTimeout timeout; // Timeout for network transactions + SceRemoteStorageInitParamsPool pool; // Memory pool parameters + SceRemoteStorageInitParamsThread thread; // Thread creation parameters + SceRemoteStorageEnvironment environment; // Only used on non-PlayStation platforms: PSN Environment used by the library +} SceRemoteStorageInitParams; + +typedef struct SceRemoteStorageGetDataReqParams +{ + char fileName[SCE_REMOTE_STORAGE_DATA_NAME_MAX_LEN]; // Name of file on remote storage server + char pathLocation[SCE_REMOTE_STORAGE_DATA_LOCATION_MAX_LEN]; // File location on the HDD + char secureFileId[SCE_REMOTE_STORAGE_PS3_SAVEDATA_SECUREFILEID_SIZE]; // PS3 only. ID used for save data encryption + char ps3DataFilename[SCE_REMOTE_STORAGE_PS3_SAVEDATA_FILENAME_SIZE]; // PS3 only. Name of data file in save data + uint32_t ps3FileType; // PS3 only. Type of file, CELL_SAVEDATA_FILETYPE_XXX + SceAppUtilSaveDataDataSlot psVitaSaveDataSlot; // PS Vita only. Save data slot information +} SceRemoteStorageGetDataReqParams; + +typedef struct SceRemoteStorageSetDataReqParams +{ + char fileName[SCE_REMOTE_STORAGE_DATA_NAME_MAX_LEN]; // Name of file on remote storage server + char fileDescription[SCE_REMOTE_STORAGE_DATA_DESCRIPTION_MAX_LEN]; // Description of file on remote storage server + char pathLocation[SCE_REMOTE_STORAGE_DATA_LOCATION_MAX_LEN]; // File location on the HDD + char secureFileId[SCE_REMOTE_STORAGE_PS3_SAVEDATA_SECUREFILEID_SIZE]; // PS3 only. ID used for save data encryption + char ps3DataFilename[SCE_REMOTE_STORAGE_PS3_SAVEDATA_FILENAME_SIZE]; // PS3 only. Name of data file in save data + uint32_t ps3FileType; // PS3 only. Type of file, CELL_SAVEDATA_FILETYPE_XXX + SceRemoteStorageDataVisibility visibility; // Visibility of data +} SceRemoteStorageSetDataReqParams; + +typedef struct SceRemoteStorageData +{ + char fileName[SCE_REMOTE_STORAGE_DATA_NAME_MAX_LEN]; // Name of file on remote storage server + char fileDescription[SCE_REMOTE_STORAGE_DATA_DESCRIPTION_MAX_LEN]; // Description of file on remote storage server + size_t fileSize; // Size of file in bytes + char md5Checksum[SCE_REMOTE_STORAGE_MD5_STRING_LENGTH]; // File MD5 checksum + char timeStamp[SCE_REMOTE_STORAGE_RFC2822_LENGTH]; // Time that data was written on the server. Format is RFC2822 + SceRemoteStorageDataVisibility visibility; // Visibility of data +} SceRemoteStorageData; + +typedef struct SceRemoteStorageWebBrowserReqParams { } SceRemoteStorageWebBrowseReqParams; + +typedef struct SceRemoteStorageStatusReqParams { } SceRemoteStorageStatusReqParams; + +typedef struct SceRemoteStorageAbortReqParams +{ + uint32_t requestId; // The request Id to be aborted +} SceRemoteStorageAbortReqParams; + +typedef struct SceRemoteStorageStatus +{ + uint32_t numFiles; // Number of files user has on remote storage server + SceRemoteStorageData data[SCE_REMOTE_STORAGE_MAX_FILES]; // Details about data if available. Data buffer will not be retrieved + uint64_t remainingSyncs; // Remaining syncs. the user has for upload/download +} SceRemoteStorageStatus; + +#endif diff --git a/Minecraft.Client/Common/Network/Sony/sceRemoteStorage/ps3/lib/sceRemoteStorage.a b/Minecraft.Client/Common/Network/Sony/sceRemoteStorage/ps3/lib/sceRemoteStorage.a new file mode 100644 index 00000000..1b2eb640 Binary files /dev/null and b/Minecraft.Client/Common/Network/Sony/sceRemoteStorage/ps3/lib/sceRemoteStorage.a differ diff --git a/Minecraft.Client/Common/Network/Sony/sceRemoteStorage/ps4/lib/sceRemoteStorage.a b/Minecraft.Client/Common/Network/Sony/sceRemoteStorage/ps4/lib/sceRemoteStorage.a new file mode 100644 index 00000000..2e667e20 Binary files /dev/null and b/Minecraft.Client/Common/Network/Sony/sceRemoteStorage/ps4/lib/sceRemoteStorage.a differ diff --git a/Minecraft.Client/Common/Network/Sony/sceRemoteStorage/psvita/lib/sceRemoteStorage.a b/Minecraft.Client/Common/Network/Sony/sceRemoteStorage/psvita/lib/sceRemoteStorage.a new file mode 100644 index 00000000..f8568afd Binary files /dev/null and b/Minecraft.Client/Common/Network/Sony/sceRemoteStorage/psvita/lib/sceRemoteStorage.a differ diff --git a/Minecraft.Client/Common/Potion_Macros.h b/Minecraft.Client/Common/Potion_Macros.h new file mode 100644 index 00000000..d458ac4b --- /dev/null +++ b/Minecraft.Client/Common/Potion_Macros.h @@ -0,0 +1,56 @@ +#pragma once + +// 4J-JEV: +// All functional potions need bit-13 set. + +#define MASK_REGENERATION 0x2001 +#define MASK_SPEED 0x2002 +#define MASK_FIRE_RESISTANCE 0x2003 +#define MASK_POISON 0x2004 +#define MASK_INSTANTHEALTH 0x2005 +#define MASK_NIGHTVISION 0x2006 +#define MASK_INVISIBILITY 0x200E +#define MASK_WEAKNESS 0x2008 +#define MASK_STRENGTH 0x2009 +#define MASK_SLOWNESS 0x200A +#define MASK_INSTANTDAMAGE 0x200C + +#define MASK_TYPE_AWKWARD 0x0010 + +#define MASK_SPLASH 0x4000 +#define MASK_BIT13 0x2000 + +#define MASK_LEVEL2 0x0020 +#define MASK_EXTENDED 0x0040 +#define MASK_LEVEL2EXTENDED 0x0060 + +#define MACRO_POTION_IS_REGENERATION(aux) ((aux & 0x200F) == MASK_REGENERATION) +#define MACRO_POTION_IS_SPEED(aux) ((aux & 0x200F) == MASK_SPEED) +#define MACRO_POTION_IS_FIRE_RESISTANCE(aux) ((aux & 0x200F) == MASK_FIRE_RESISTANCE) +#define MACRO_POTION_IS_INSTANTHEALTH(aux) ((aux & 0x200F) == MASK_INSTANTHEALTH) +#define MACRO_POTION_IS_NIGHTVISION(aux) ((aux & 0x200F) == MASK_NIGHTVISION) +#define MACRO_POTION_IS_INVISIBILITY(aux) ((aux & 0x200F) == MASK_INVISIBILITY) +#define MACRO_POTION_IS_WEAKNESS(aux) ((aux & 0x200F) == MASK_WEAKNESS) +#define MACRO_POTION_IS_STRENGTH(aux) ((aux & 0x200F) == MASK_STRENGTH) +#define MACRO_POTION_IS_SLOWNESS(aux) ((aux & 0x200F) == MASK_SLOWNESS) +#define MACRO_POTION_IS_POISON(aux) ((aux & 0x200F) == MASK_POISON) +#define MACRO_POTION_IS_INSTANTDAMAGE(aux) ((aux & 0x200F) == MASK_INSTANTDAMAGE) +#define MACRO_POTION_IS_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) + +#define MACRO_POTION_IS_AKWARD(aux) ((aux & MASK_TYPE_AWKWARD) == MASK_TYPE_AWKWARD) + +#define MACRO_POTION_IS_REGULAR(aux) ((aux & (MASK_LEVEL2EXTENDED)) == 0) +#define MACRO_POTION_IS_LEVEL2(aux) ((aux & (MASK_LEVEL2 )) == MASK_LEVEL2) +#define MACRO_POTION_IS_EXTENDED(aux) ((aux & (MASK_EXTENDED)) == (MASK_EXTENDED)) +#define MACRO_POTION_IS_LEVEL2EXTENDED(aux) ((aux & (MASK_LEVEL2EXTENDED)) == (MASK_LEVEL2EXTENDED)) + + +#define MACRO_MAKEPOTION_AUXVAL(potion_type, potion_strength, potion_effect) (potion_type | potion_strength | potion_effect) + +// The potion brewing creates high aux values with redundant high bits, so use this to bring the aux val into ranges that match our macros +// 4J-JEV: 0x2000 == bit-13; Used to stop netherwart "resetting" functional potions. +#define NORMALISE_POTION_AUXVAL(aux) (aux & (MASK_BIT13 | MASK_SPLASH | 0xFF)) \ No newline at end of file diff --git a/Minecraft.Client/Common/Telemetry/TelemetryManager.cpp b/Minecraft.Client/Common/Telemetry/TelemetryManager.cpp new file mode 100644 index 00000000..4b04b19c --- /dev/null +++ b/Minecraft.Client/Common/Telemetry/TelemetryManager.cpp @@ -0,0 +1,450 @@ +#include "stdafx.h" + +#include "MultiPlayerLocalPlayer.h" + +#include "..\Minecraft.World\LevelSettings.h" +#include "..\Minecraft.World\LevelData.h" +#include "..\Minecraft.World\Level.h" + +#include "TelemetryManager.h" + +#if !defined(_DURANGO) && !defined(_XBOX) + +CTelemetryManager *TelemetryManager = new CTelemetryManager(); + +#endif + +HRESULT CTelemetryManager::Init() +{ + return S_OK; +} + +HRESULT CTelemetryManager::Tick() +{ + return S_OK; +} + +HRESULT CTelemetryManager::Flush() +{ + return S_OK; +} + +bool CTelemetryManager::RecordPlayerSessionStart(int iPad) +{ + return true; +} + +bool CTelemetryManager::RecordPlayerSessionExit(int iPad, int exitStatus) +{ + return true; +} + +bool CTelemetryManager::RecordHeartBeat(int iPad) +{ + return true; +} + +bool CTelemetryManager::RecordLevelStart(int iPad, ESen_FriendOrMatch friendsOrMatch, ESen_CompeteOrCoop competeOrCoop, int difficulty, int numberOfLocalPlayers, int numberOfOnlinePlayers) +{ + if(iPad == ProfileManager.GetPrimaryPad() ) m_bFirstFlush = true; + + ++m_levelInstanceID; + m_fLevelStartTime[iPad] = app.getAppTime(); + + return true; +} + +bool CTelemetryManager::RecordLevelExit(int iPad, ESen_LevelExitStatus levelExitStatus) +{ + return true; +} + +bool CTelemetryManager::RecordLevelSaveOrCheckpoint(int iPad, int saveOrCheckPointID, int saveSizeInBytes) +{ + return true; +} + +bool CTelemetryManager::RecordLevelResume(int iPad, ESen_FriendOrMatch friendsOrMatch, ESen_CompeteOrCoop competeOrCoop, int difficulty, int numberOfLocalPlayers, int numberOfOnlinePlayers, int saveOrCheckPointID) +{ + return true; +} + +bool CTelemetryManager::RecordPauseOrInactive(int iPad) +{ + return true; +} + +bool CTelemetryManager::RecordUnpauseOrActive(int iPad) +{ + return true; +} + +bool CTelemetryManager::RecordMenuShown(int iPad, EUIScene menuID, int optionalMenuSubID) +{ + return true; +} + +bool CTelemetryManager::RecordAchievementUnlocked(int iPad, int achievementID, int achievementGamerscore) +{ + return true; +} + +bool CTelemetryManager::RecordMediaShareUpload(int iPad, ESen_MediaDestination mediaDestination, ESen_MediaType mediaType) +{ + return true; +} + +bool CTelemetryManager::RecordUpsellPresented(int iPad, ESen_UpsellID upsellId, int marketplaceOfferID) +{ + return true; +} + +bool CTelemetryManager::RecordUpsellResponded(int iPad, ESen_UpsellID upsellId, int marketplaceOfferID, ESen_UpsellOutcome upsellOutcome) +{ + return true; +} + +bool CTelemetryManager::RecordPlayerDiedOrFailed(int iPad, int lowResMapX, int lowResMapY, int lowResMapZ, int mapID, int playerWeaponID, int enemyWeaponID, ETelemetryChallenges enemyTypeID) +{ + return true; +} + +bool CTelemetryManager::RecordEnemyKilledOrOvercome(int iPad, int lowResMapX, int lowResMapY, int lowResMapZ, int mapID, int playerWeaponID, int enemyWeaponID, ETelemetryChallenges enemyTypeID) +{ + return true; +} + +bool CTelemetryManager::RecordTexturePackLoaded(int iPad, int texturePackId, bool purchased) +{ + return true; +} + +bool CTelemetryManager::RecordSkinChanged(int iPad, int dwSkinId) +{ + return true; +} + +bool CTelemetryManager::RecordBanLevel(int iPad) +{ + return true; +} + +bool CTelemetryManager::RecordUnBanLevel(int iPad) +{ + return true; +} + + + /////////////////////////////////////////////////////////////////// + // 4J-JEV: FOLLOWING LOGIC TAKEN FROM XBOX 'SentientManager.cpp' // + /////////////////////////////////////////////////////////////////// + + +/* +Number of seconds elapsed since Sentient initialize. +Title needs to track this and report it as a property. +These times will be used to create timelines and understand durations. +This should be tracked independently of saved games (restoring a save should not reset the seconds since initialize) +*/ +INT CTelemetryManager::GetSecondsSinceInitialize() +{ + return (INT)(app.getAppTime() - m_initialiseTime); +} + +/* +An in-game setting that significantly differentiates the play style of the game. +(This should be captured as an integer and correspond to mode specific to the game.) +Teams will have to provide the game mappings that correspond to the integers. +The intent is to allow teams to capture data on the highest level categories of gameplay in their game. +For example, a game mode could be the name of the specific mini game (eg: golf vs darts) or a specific multiplayer mode (eg: hoard vs beast.) ModeID = 0 means undefined or unknown. +The intent is to answer the question "How are players playing your game?" +*/ +INT CTelemetryManager::GetMode(DWORD dwUserId) +{ + INT mode = (INT)eTelem_ModeId_Undefined; + + Minecraft *pMinecraft = Minecraft::GetInstance(); + + if( pMinecraft->localplayers[dwUserId] != NULL && pMinecraft->localplayers[dwUserId]->level != NULL && pMinecraft->localplayers[dwUserId]->level->getLevelData() != NULL ) + { + GameType *gameType = pMinecraft->localplayers[dwUserId]->level->getLevelData()->getGameType(); + + if (gameType->isSurvival()) + { + mode = (INT)eTelem_ModeId_Survival; + } + else if (gameType->isCreative()) + { + mode = (INT)eTelem_ModeId_Creative; + } + else + { + mode = (INT)eTelem_ModeId_Undefined; + } + } + return mode; +} + +/* +Used when a title has more heirarchy required. +OptionalSubMode ID = 0 means undefined or unknown. +For titles that have sub-modes (Sports/Football). +Mode is always an indicator of "How is the player choosing to play my game?" so these do not have to be consecutive. +LevelIDs and SubLevelIDs can be reused as they will always be paired with a Mode/SubModeID, Mode should be unique - SubMode can be shared between modes. +*/ +INT CTelemetryManager::GetSubMode(DWORD dwUserId) +{ + INT subMode = (INT)eTelem_SubModeId_Undefined; + + if(Minecraft::GetInstance()->isTutorial()) + { + subMode = (INT)eTelem_SubModeId_Tutorial; + } + else + { + subMode = (INT)eTelem_SubModeId_Normal; + } + + return subMode; +} + +/* +This is a more granular view of mode, allowing teams to get a sense of the levels or maps players are playing and providing some insight into how players progress through a game. +Teams will have to provide the game mappings that correspond to the integers. +The intent is that a level is highest level at which modes can be dissected and provides an indication of player progression in a game. +The intent is that level start and ends do not occur more than every 2 minutes or so, otherwise the data reported will be difficult to understand. +Levels are unique only within a given modeID - so you can have a ModeID =1, LevelID =1 and a different ModeID=2, LevelID = 1 indicate two completely different levels. +LevelID = 0 means undefined or unknown. +*/ +INT CTelemetryManager::GetLevelId(DWORD dwUserId) +{ + INT levelId = (INT)eTelem_LevelId_Undefined; + + levelId = (INT)eTelem_LevelId_PlayerGeneratedLevel; + + return levelId; +} + +/* +Used when a title has more heirarchy required. OptionalSubLevel ID = 0 means undefined or unknown. +For titles that have sub-levels. +Level is always an indicator of "How far has the player progressed." so when possible these should be consecutive or at least monotonically increasing. +LevelIDs and SubLevelIDs can be reused as they will always be paired with a Mode/SubModeID +*/ +INT CTelemetryManager::GetSubLevelId(DWORD dwUserId) +{ + INT subLevelId = (INT)eTelem_SubLevelId_Undefined; + + Minecraft *pMinecraft = Minecraft::GetInstance(); + + if(pMinecraft->localplayers[dwUserId] != NULL) + { + switch(pMinecraft->localplayers[dwUserId]->dimension) + { + case 0: + subLevelId = (INT)eTelem_SubLevelId_Overworld; + break; + case -1: + subLevelId = (INT)eTelem_SubLevelId_Nether; + break; + case 1: + subLevelId = (INT)eTelem_SubLevelId_End; + break; + }; + } + + return subLevelId; +} + +/* +Build version of the title, used to track changes in development as well as patches/title updates +Allows developer to separate out stats from different builds +*/ +INT CTelemetryManager::GetTitleBuildId() +{ + return (INT)VER_PRODUCTBUILD; +} + +/* +Generated by the game every time LevelStart or LevelResume is called. +This should be a unique ID (can be sequential) within a session. +Helps differentiate level attempts when a play plays the same mode/level - especially with aggregated stats +*/ +INT CTelemetryManager::GetLevelInstanceID() +{ + return (INT)m_levelInstanceID; +} + +/* +MultiplayerinstanceID is a title-generated value that is the same for all players in the same multiplayer session. +Link up players into a single multiplayer session ID. +*/ +INT CTelemetryManager::GetMultiplayerInstanceID() +{ + return m_multiplayerInstanceID; +} + +INT CTelemetryManager::GenerateMultiplayerInstanceId() +{ +#if defined(_DURANGO) || defined(_XBOX) + FILETIME SystemTimeAsFileTime; + GetSystemTimeAsFileTime( &SystemTimeAsFileTime ); + return *((INT *)&SystemTimeAsFileTime.dwLowDateTime); +#else + return 0; +#endif +} + +void CTelemetryManager::SetMultiplayerInstanceId(INT value) +{ + m_multiplayerInstanceID = value; +} + +/* +Indicates whether the game is being played in single or multiplayer mode and whether multiplayer is being played locally or over live. +How social is your game? How do people play it? +*/ +INT CTelemetryManager::GetSingleOrMultiplayer() +{ + INT singleOrMultiplayer = (INT)eSen_SingleOrMultiplayer_Undefined; + + // Unused + //eSen_SingleOrMultiplayer_Single_Player + //eSen_SingleOrMultiplayer_Multiplayer_Live + + if(app.GetLocalPlayerCount() == 1 && g_NetworkManager.GetOnlinePlayerCount() == 0) + { + singleOrMultiplayer = (INT)eSen_SingleOrMultiplayer_Single_Player; + } + else if(app.GetLocalPlayerCount() > 1 && g_NetworkManager.GetOnlinePlayerCount() == 0) + { + singleOrMultiplayer = (INT)eSen_SingleOrMultiplayer_Multiplayer_Local; + } + else if(app.GetLocalPlayerCount() == 1 && g_NetworkManager.GetOnlinePlayerCount() > 0) + { + singleOrMultiplayer = (INT)eSen_SingleOrMultiplayer_Multiplayer_Live; + } + else if(app.GetLocalPlayerCount() > 1 && g_NetworkManager.GetOnlinePlayerCount() > 0) + { + singleOrMultiplayer = (INT)eSen_SingleOrMultiplayer_Multiplayer_Both_Local_and_Live; + } + + return singleOrMultiplayer; +} + +/* +An in-game setting that differentiates the challenge imposed on the user. +Normalized to a standard 5-point scale. Are players changing the difficulty? +*/ +INT CTelemetryManager::GetDifficultyLevel(INT diff) +{ + INT difficultyLevel = (INT)eSen_DifficultyLevel_Undefined; + + switch(diff) + { + case 0: + difficultyLevel = (INT)eSen_DifficultyLevel_Easiest; + break; + case 1: + difficultyLevel = (INT)eSen_DifficultyLevel_Easier; + break; + case 2: + difficultyLevel = (INT)eSen_DifficultyLevel_Normal; + break; + case 3: + difficultyLevel = (INT)eSen_DifficultyLevel_Harder; + break; + } + + // Unused + //eSen_DifficultyLevel_Hardest = 5, + + return difficultyLevel; +} + +/* +Differentiates trial/demo from full purchased titles +Is this a full title or demo? +*/ +INT CTelemetryManager::GetLicense() +{ + INT license = eSen_License_Undefined; + + if(ProfileManager.IsFullVersion()) + { + license = (INT)eSen_License_Full_Purchased_Title; + } + else + { + license = (INT)eSen_License_Trial_or_Demo; + } + return license; +} + +/* +This is intended to capture whether players played using default control scheme or customized the control scheme. +Are players customizing your controls? +*/ +INT CTelemetryManager::GetDefaultGameControls() +{ + INT defaultGameControls = eSen_DefaultGameControls_Undefined; + + // Unused + //eSen_DefaultGameControls_Custom_controls + + defaultGameControls = eSen_DefaultGameControls_Default_controls; + + return defaultGameControls; +} + +/* +Are players changing default audio settings? +This is intended to capture whether players are playing with or without volume and whether they make changes from the default audio settings. +*/ +INT CTelemetryManager::GetAudioSettings(DWORD dwUserId) +{ + INT audioSettings = (INT)eSen_AudioSettings_Undefined; + + if(dwUserId == ProfileManager.GetPrimaryPad()) + { + BYTE volume = app.GetGameSettings(dwUserId,eGameSetting_SoundFXVolume); + + if(volume == 0) + { + audioSettings = (INT)eSen_AudioSettings_Off; + } + else if(volume == DEFAULT_VOLUME_LEVEL) + { + audioSettings = (INT)eSen_AudioSettings_On_Default; + } + else + { + audioSettings = (INT)eSen_AudioSettings_On_CustomSetting; + } + } + return audioSettings; +} + +/* +Refers to the highest level performance metric for your game. +For example, a performance metric could points earned, race time, total kills, etc. +This is entirely up to you and will help us understand how well the player performed, or how far the player progressed in the level before exiting. +How far did users progress before failing/exiting the level? +*/ +INT CTelemetryManager::GetLevelExitProgressStat1() +{ + // 4J Stu - Unused + return 0; +} + +/* +Refers to the highest level performance metric for your game. +For example, a performance metric could points earned, race time, total kills, etc. +This is entirely up to you and will help us understand how well the player performed, or how far the player progressed in the level before exiting. +How far did users progress before failing/exiting the level? +*/ +INT CTelemetryManager::GetLevelExitProgressStat2() +{ + // 4J Stu - Unused + return 0; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Telemetry/TelemetryManager.h b/Minecraft.Client/Common/Telemetry/TelemetryManager.h new file mode 100644 index 00000000..40b6c04c --- /dev/null +++ b/Minecraft.Client/Common/Telemetry/TelemetryManager.h @@ -0,0 +1,65 @@ +#pragma once + +#include "..\..\Common\UI\UIEnums.h" + +class CTelemetryManager +{ +public: + virtual HRESULT Init(); + virtual HRESULT Tick(); + virtual HRESULT Flush(); + + virtual bool RecordPlayerSessionStart(int iPad); + virtual bool RecordPlayerSessionExit(int iPad, int exitStatus); + virtual bool RecordHeartBeat(int iPad); + virtual bool RecordLevelStart(int iPad, ESen_FriendOrMatch friendsOrMatch, ESen_CompeteOrCoop competeOrCoop, int difficulty, int numberOfLocalPlayers, int numberOfOnlinePlayers); + virtual bool RecordLevelExit(int iPad, ESen_LevelExitStatus levelExitStatus); + virtual bool RecordLevelSaveOrCheckpoint(int iPad, int saveOrCheckPointID, int saveSizeInBytes); + virtual bool RecordLevelResume(int iPad, ESen_FriendOrMatch friendsOrMatch, ESen_CompeteOrCoop competeOrCoop, int difficulty, int numberOfLocalPlayers, int numberOfOnlinePlayers, int saveOrCheckPointID); + virtual bool RecordPauseOrInactive(int iPad); + virtual bool RecordUnpauseOrActive(int iPad); + virtual bool RecordMenuShown(int iPad, EUIScene menuID, int optionalMenuSubID); + virtual bool RecordAchievementUnlocked(int iPad, int achievementID, int achievementGamerscore); + virtual bool RecordMediaShareUpload(int iPad, ESen_MediaDestination mediaDestination, ESen_MediaType mediaType); + virtual bool RecordUpsellPresented(int iPad, ESen_UpsellID upsellId, int marketplaceOfferID); + virtual bool RecordUpsellResponded(int iPad, ESen_UpsellID upsellId, int marketplaceOfferID, ESen_UpsellOutcome upsellOutcome); + virtual bool RecordPlayerDiedOrFailed(int iPad, int lowResMapX, int lowResMapY, int lowResMapZ, int mapID, int playerWeaponID, int enemyWeaponID, ETelemetryChallenges enemyTypeID); + virtual bool RecordEnemyKilledOrOvercome(int iPad, int lowResMapX, int lowResMapY, int lowResMapZ, int mapID, int playerWeaponID, int enemyWeaponID, ETelemetryChallenges enemyTypeID); + virtual bool RecordTexturePackLoaded(int iPad, int texturePackId, bool purchased); + + virtual bool RecordSkinChanged(int iPad, int dwSkinId); + virtual bool RecordBanLevel(int iPad); + virtual bool RecordUnBanLevel(int iPad); + + virtual int GetMultiplayerInstanceID(); + virtual int GenerateMultiplayerInstanceId(); + virtual void SetMultiplayerInstanceId(int value); + +protected: + float m_initialiseTime; + float m_lastHeartbeat; + bool m_bFirstFlush; + + float m_fLevelStartTime[XUSER_MAX_COUNT]; + + INT m_multiplayerInstanceID; + DWORD m_levelInstanceID; + + // Helper functions to get the various common settings + INT GetSecondsSinceInitialize(); + INT GetMode(DWORD dwUserId); + INT GetSubMode(DWORD dwUserId); + INT GetLevelId(DWORD dwUserId); + INT GetSubLevelId(DWORD dwUserId); + INT GetTitleBuildId(); + INT GetLevelInstanceID(); + INT GetSingleOrMultiplayer(); + INT GetDifficultyLevel(INT diff); + INT GetLicense(); + INT GetDefaultGameControls(); + INT GetAudioSettings(DWORD dwUserId); + INT GetLevelExitProgressStat1(); + INT GetLevelExitProgressStat2(); +}; + +extern CTelemetryManager *TelemetryManager; \ No newline at end of file diff --git a/Minecraft.Client/Common/Trial/TrialLevel.mcs b/Minecraft.Client/Common/Trial/TrialLevel.mcs new file mode 100644 index 00000000..99b17387 Binary files /dev/null and b/Minecraft.Client/Common/Trial/TrialLevel.mcs differ diff --git a/Minecraft.Client/Common/Trial/TrialMode.cpp b/Minecraft.Client/Common/Trial/TrialMode.cpp new file mode 100644 index 00000000..e8149138 --- /dev/null +++ b/Minecraft.Client/Common/Trial/TrialMode.cpp @@ -0,0 +1,9 @@ +#include "stdafx.h" +#include "TrialMode.h" +#include "..\Tutorial\FullTutorial.h" + +TrialMode::TrialMode(int iPad, Minecraft *minecraft, ClientConnection *connection) + : FullTutorialMode(iPad, minecraft, connection) +{ + tutorial = new FullTutorial(iPad, true); +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Trial/TrialMode.h b/Minecraft.Client/Common/Trial/TrialMode.h new file mode 100644 index 00000000..a1034acf --- /dev/null +++ b/Minecraft.Client/Common/Trial/TrialMode.h @@ -0,0 +1,10 @@ +#pragma once +#include "..\Tutorial\FullTutorialMode.h" + +class TrialMode : public FullTutorialMode +{ +public: + TrialMode(int iPad, Minecraft *minecraft, ClientConnection *connection); + + virtual bool isImplemented() { return true; } +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/AreaConstraint.cpp b/Minecraft.Client/Common/Tutorial/AreaConstraint.cpp new file mode 100644 index 00000000..f133d604 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/AreaConstraint.cpp @@ -0,0 +1,52 @@ +#include "stdafx.h" + +#include "..\..\Minecraft.h" +#include "..\..\MultiplayerLocalPlayer.h" +#include "AreaConstraint.h" +#include "..\..\..\Minecraft.World\AABB.h" + +AreaConstraint::AreaConstraint( int descriptionId, double x0, double y0, double z0, double x1, double y1, double z1, bool contains /*= true*/, bool restrictsMovement /*=true*/ ) + : TutorialConstraint( descriptionId ) +{ + messageArea = AABB::newPermanent(x0+2, y0+2, z0+2, x1-2, y1-2, z1-2); + movementArea = AABB::newPermanent(x0, y0, z0, x1, y1, z1); + + this->contains = contains; + m_restrictsMovement = restrictsMovement; +} + +AreaConstraint::~AreaConstraint() +{ + delete messageArea; + delete movementArea; +} + +bool AreaConstraint::isConstraintSatisfied(int iPad) +{ + Minecraft *minecraft = Minecraft::GetInstance(); + return messageArea->contains( minecraft->localplayers[iPad]->getPos(1) ) == contains; +} + +bool AreaConstraint::isConstraintRestrictive(int iPad) +{ + return m_restrictsMovement; +} + + +bool AreaConstraint::canMoveToPosition(double xo, double yo, double zo, double xt, double yt, double zt) +{ + if(!m_restrictsMovement) return true; + + Vec3 *targetPos = Vec3::newTemp(xt, yt, zt); + Minecraft *minecraft = Minecraft::GetInstance(); + + if(movementArea->contains( targetPos ) == contains) + { + return true; + } + Vec3 *origPos = Vec3::newTemp(xo, yo, zo); + + double currDist = origPos->distanceTo(movementArea); + double targetDist = targetPos->distanceTo(movementArea); + return targetDist < currDist; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/AreaConstraint.h b/Minecraft.Client/Common/Tutorial/AreaConstraint.h new file mode 100644 index 00000000..f98945e1 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/AreaConstraint.h @@ -0,0 +1,24 @@ +#pragma once + +#include "TutorialConstraint.h" + +class AABB; + +class AreaConstraint : public TutorialConstraint +{ +private: + AABB *movementArea; + AABB *messageArea; + bool contains; // If true we must stay in this area, if false must stay out of this area + bool m_restrictsMovement; + +public: + virtual ConstraintType getType() { return e_ConstraintArea; } + + AreaConstraint( int descriptionId, double x0, double y0, double z0, double x1, double y1, double z1, bool contains = true, bool restrictsMovement =true ); + ~AreaConstraint(); + + virtual bool isConstraintSatisfied(int iPad); + virtual bool isConstraintRestrictive(int iPad); + virtual bool canMoveToPosition(double xo, double yo, double zo, double xt, double yt, double zt); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/AreaHint.cpp b/Minecraft.Client/Common/Tutorial/AreaHint.cpp new file mode 100644 index 00000000..8b711c88 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/AreaHint.cpp @@ -0,0 +1,49 @@ +#include "stdafx.h" + +#include "..\..\Minecraft.h" +#include "..\..\MultiplayerLocalPlayer.h" +#include "AreaHint.h" +#include "..\..\..\Minecraft.World\AABB.h" +#include "Tutorial.h" + +AreaHint::AreaHint(eTutorial_Hint id, Tutorial *tutorial, eTutorial_State displayState, eTutorial_State completeState, + int descriptionId, double x0, double y0, double z0, double x1, double y1, double z1, bool allowFade /*= false*/, bool contains /*= true*/ ) + : TutorialHint( id, tutorial, descriptionId, e_Hint_Area, allowFade ) +{ + area = AABB::newPermanent(x0, y0, z0, x1, y1, z1); + + this->contains = contains; + + m_displayState = displayState; + m_completeState = completeState; +} + +AreaHint::~AreaHint() +{ + delete area; +} + +int AreaHint::tick() +{ + Minecraft *minecraft = Minecraft::GetInstance(); + if( (m_displayState == e_Tutorial_State_Any || m_tutorial->getCurrentState() == m_displayState) && + m_hintNeeded && + area->contains( minecraft->player->getPos(1) ) == contains ) + { + if( m_completeState == e_Tutorial_State_None ) + { + m_hintNeeded = false; + } + else if ( m_tutorial->isStateCompleted( m_completeState ) ) + { + m_hintNeeded = false; + return -1; + } + + return m_descriptionId; + } + else + { + return -1; + } +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/AreaHint.h b/Minecraft.Client/Common/Tutorial/AreaHint.h new file mode 100644 index 00000000..12ef8977 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/AreaHint.h @@ -0,0 +1,25 @@ +#pragma once + +#include "TutorialHint.h" + +class AABB; + +class AreaHint : public TutorialHint +{ +private: + AABB *area; + bool contains; // If true we must stay in this area, if false must stay out of this area + + // Only display the hint if the game is in this state + eTutorial_State m_displayState; + + // Only display the hint if this state is not completed + eTutorial_State m_completeState; + +public: + AreaHint(eTutorial_Hint id, Tutorial *tutorial, eTutorial_State displayState, eTutorial_State completeState, + int descriptionId, double x0, double y0, double z0, double x1, double y1, double z1, bool allowFade = true, bool contains = true ); + ~AreaHint(); + + virtual int tick(); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/AreaTask.cpp b/Minecraft.Client/Common/Tutorial/AreaTask.cpp new file mode 100644 index 00000000..de29ab1b --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/AreaTask.cpp @@ -0,0 +1,69 @@ +#include "stdafx.h" +#include "Tutorial.h" +#include "AreaTask.h" + +AreaTask::AreaTask(eTutorial_State state, Tutorial *tutorial, vector *inConstraints, int descriptionId, EAreaTaskCompletionStates completionState) + : TutorialTask( tutorial, descriptionId, false, inConstraints, false, false, false ) +{ + m_tutorialState = state; + if(m_tutorialState == e_Tutorial_State_Gameplay) + { + enableConstraints(true); + } + m_completionState = completionState; +} + +bool AreaTask::isCompleted() +{ + if(bIsCompleted) return true; + + bool complete = false; + switch(m_completionState) + { + case eAreaTaskCompletion_CompleteOnConstraintsSatisfied: + { + bool allSatisfied = true; + for(AUTO_VAR(it, constraints.begin()); it != constraints.end(); ++it) + { + TutorialConstraint *constraint = *it; + if(!constraint->isConstraintSatisfied(tutorial->getPad())) + { + allSatisfied = false; + break; + } + } + complete = allSatisfied; + } + break; + case eAreaTaskCompletion_CompleteOnActivation: + complete = bHasBeenActivated; + break; + }; + bIsCompleted = complete; + return complete; +} + +void AreaTask::setAsCurrentTask(bool active) +{ + TutorialTask::setAsCurrentTask(active); + + if(m_completionState == eAreaTaskCompletion_CompleteOnConstraintsSatisfied) + { + enableConstraints(active); + } +} + +void AreaTask::onStateChange(eTutorial_State newState) +{ + if(m_completionState == eAreaTaskCompletion_CompleteOnActivation) + { + if(m_tutorialState == newState) + { + enableConstraints(true); + } + else if(m_tutorialState != e_Tutorial_State_Gameplay) + { + //enableConstraints(false); + } + } +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/AreaTask.h b/Minecraft.Client/Common/Tutorial/AreaTask.h new file mode 100644 index 00000000..0d20bd7a --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/AreaTask.h @@ -0,0 +1,24 @@ +#pragma once +using namespace std; + +#include "TutorialTask.h" + +// A task that creates an maintains an area constraint until it is activated +class AreaTask : public TutorialTask +{ +public: + enum EAreaTaskCompletionStates + { + eAreaTaskCompletion_CompleteOnActivation, + eAreaTaskCompletion_CompleteOnConstraintsSatisfied, + }; +private: + EAreaTaskCompletionStates m_completionState; + eTutorial_State m_tutorialState; +public: + AreaTask(eTutorial_State state, Tutorial *tutorial, vector *inConstraints, int descriptionId = -1, EAreaTaskCompletionStates completionState = eAreaTaskCompletion_CompleteOnActivation); + virtual bool isCompleted(); + virtual void setAsCurrentTask(bool active = true); + virtual void onStateChange(eTutorial_State newState); + +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/ChangeStateConstraint.cpp b/Minecraft.Client/Common/Tutorial/ChangeStateConstraint.cpp new file mode 100644 index 00000000..f01db84e --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/ChangeStateConstraint.cpp @@ -0,0 +1,136 @@ +#include "stdafx.h" + +#include "Tutorial.h" +#include "..\..\Minecraft.h" +#include "..\..\MultiplayerLocalPlayer.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.h" +#include "ChangeStateConstraint.h" +#include "..\..\..\Minecraft.World\AABB.h" +#include "..\..\ClientConnection.h" +#include "..\..\..\Minecraft.World\net.minecraft.network.packet.h" + +ChangeStateConstraint::ChangeStateConstraint( Tutorial *tutorial, eTutorial_State targetState, eTutorial_State sourceStates[], DWORD sourceStatesCount, + double x0, double y0, double z0, double x1, double y1, double z1, bool contains /*= true*/, bool changeGameMode /*= false*/, GameType *targetGameMode /*= 0*/ ) + : TutorialConstraint( -1 ) +{ + movementArea = AABB::newPermanent(x0, y0, z0, x1, y1, z1); + + this->contains = contains; + + m_changeGameMode = changeGameMode; + m_targetGameMode = targetGameMode; + m_changedFromGameMode = 0; + + m_tutorial = tutorial; + m_targetState = targetState; + m_sourceStatesCount = sourceStatesCount; + + m_bHasChanged = false; + m_changedFromState = e_Tutorial_State_None; + + m_bComplete = false; + + m_sourceStates = new eTutorial_State [m_sourceStatesCount]; + for(unsigned int i=0;i0) delete [] m_sourceStates; +} + +void ChangeStateConstraint::tick(int iPad) +{ + if(m_bComplete) return; + + if(m_tutorial->isStateCompleted(m_targetState)) + { + Minecraft *minecraft = Minecraft::GetInstance(); + if(m_changeGameMode) + { + unsigned int playerPrivs = minecraft->localplayers[iPad]->getAllPlayerGamePrivileges(); + Player::setPlayerGamePrivilege(playerPrivs,Player::ePlayerGamePrivilege_CreativeMode,m_changedFromGameMode == GameType::CREATIVE); + + unsigned int originalPrivileges = minecraft->localplayers[iPad]->getAllPlayerGamePrivileges(); + if(originalPrivileges != playerPrivs) + { + // Send update settings packet to server + Minecraft *pMinecraft = Minecraft::GetInstance(); + shared_ptr player = minecraft->localplayers[iPad]; + if(player != NULL && player->connection && player->connection->getNetworkPlayer() != NULL) + { + player->connection->send( shared_ptr( new PlayerInfoPacket( player->connection->getNetworkPlayer()->GetSmallId(), -1, playerPrivs) ) ); + } + } + } + m_bComplete = true; + return; + } + + bool inASourceState = false; + Minecraft *minecraft = Minecraft::GetInstance(); + for(DWORD i = 0; i < m_sourceStatesCount; ++i) + { + if(m_sourceStates[i] == m_tutorial->getCurrentState()) + { + inASourceState = true; + break; + } + } + if( !m_bHasChanged && inASourceState && movementArea->contains( minecraft->localplayers[iPad]->getPos(1) ) == contains ) + { + m_bHasChanged = true; + m_changedFromState = m_tutorial->getCurrentState(); + m_tutorial->changeTutorialState(m_targetState); + + if(m_changeGameMode) + { + if(minecraft->localgameModes[iPad] != NULL) + { + m_changedFromGameMode = minecraft->localplayers[iPad]->abilities.instabuild ? GameType::CREATIVE : GameType::SURVIVAL; + + unsigned int playerPrivs = minecraft->localplayers[iPad]->getAllPlayerGamePrivileges(); + Player::setPlayerGamePrivilege(playerPrivs,Player::ePlayerGamePrivilege_CreativeMode,m_targetGameMode == GameType::CREATIVE); + + unsigned int originalPrivileges = minecraft->localplayers[iPad]->getAllPlayerGamePrivileges(); + if(originalPrivileges != playerPrivs) + { + // Send update settings packet to server + Minecraft *pMinecraft = Minecraft::GetInstance(); + shared_ptr player = minecraft->localplayers[iPad]; + if(player != NULL && player->connection && player->connection->getNetworkPlayer() != NULL) + { + player->connection->send( shared_ptr( new PlayerInfoPacket( player->connection->getNetworkPlayer()->GetSmallId(), -1, playerPrivs) ) ); + } + } + } + } + } + else if( m_bHasChanged && movementArea->contains( minecraft->localplayers[iPad]->getPos(1) ) != contains ) + { + m_bHasChanged = false; + m_tutorial->changeTutorialState(m_changedFromState); + + if(m_changeGameMode) + { + unsigned int playerPrivs = minecraft->localplayers[iPad]->getAllPlayerGamePrivileges(); + Player::setPlayerGamePrivilege(playerPrivs,Player::ePlayerGamePrivilege_CreativeMode,m_changedFromGameMode == GameType::CREATIVE); + + unsigned int originalPrivileges = minecraft->localplayers[iPad]->getAllPlayerGamePrivileges(); + if(originalPrivileges != playerPrivs) + { + // Send update settings packet to server + Minecraft *pMinecraft = Minecraft::GetInstance(); + shared_ptr player = minecraft->localplayers[iPad]; + if(player != NULL && player->connection && player->connection->getNetworkPlayer() != NULL) + { + player->connection->send( shared_ptr( new PlayerInfoPacket( player->connection->getNetworkPlayer()->GetSmallId(), -1, playerPrivs) ) ); + } + } + } + } +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/ChangeStateConstraint.h b/Minecraft.Client/Common/Tutorial/ChangeStateConstraint.h new file mode 100644 index 00000000..2156870d --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/ChangeStateConstraint.h @@ -0,0 +1,37 @@ +#pragma once + +#include "TutorialEnum.h" +#include "TutorialConstraint.h" + +class AABB; +class Tutorial; +class GameType; + +class ChangeStateConstraint : public TutorialConstraint +{ +private: + AABB *movementArea; + bool contains; // If true we must stay in this area, if false must stay out of this area + bool m_changeGameMode; + GameType *m_targetGameMode; + GameType *m_changedFromGameMode; + + eTutorial_State m_targetState; + eTutorial_State *m_sourceStates; + DWORD m_sourceStatesCount; + + bool m_bHasChanged; + eTutorial_State m_changedFromState; + + bool m_bComplete; + + Tutorial *m_tutorial; + +public: + virtual ConstraintType getType() { return e_ConstraintChangeState; } + + ChangeStateConstraint( Tutorial *tutorial, eTutorial_State targetState, eTutorial_State sourceStates[], DWORD sourceStatesCount, double x0, double y0, double z0, double x1, double y1, double z1, bool contains = true, bool changeGameMode = false, GameType *targetGameMode = NULL ); + ~ChangeStateConstraint(); + + virtual void tick(int iPad); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/ChoiceTask.cpp b/Minecraft.Client/Common/Tutorial/ChoiceTask.cpp new file mode 100644 index 00000000..c03166b5 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/ChoiceTask.cpp @@ -0,0 +1,135 @@ +#include "stdafx.h" +#include +#include +#include "..\..\Minecraft.h" +#include "..\..\MultiplayerLocalPlayer.h" +#include "Tutorial.h" +#include "TutorialConstraints.h" +#include "ChoiceTask.h" +#include "..\..\..\Minecraft.World\Material.h" + +ChoiceTask::ChoiceTask(Tutorial *tutorial, int descriptionId, int promptId /*= -1*/, bool requiresUserInput /*= false*/, + int iConfirmMapping /*= 0*/, int iCancelMapping /*= 0*/, + eTutorial_CompletionAction cancelAction /*= e_Tutorial_Completion_None*/, ETelemetryChallenges telemetryEvent /*= eTelemetryTutorial_NoEvent*/) + : TutorialTask( tutorial, descriptionId, false, NULL, true, false, false ) +{ + if(requiresUserInput == true) + { + constraints.push_back( new InputConstraint( iConfirmMapping ) ); + constraints.push_back( new InputConstraint( iCancelMapping ) ); + } + m_iConfirmMapping = iConfirmMapping; + m_iCancelMapping = iCancelMapping; + m_bConfirmMappingComplete = false; + m_bCancelMappingComplete = false; + + m_cancelAction = cancelAction; + + m_promptId = promptId; + tutorial->addMessage( m_promptId ); + + m_eTelemetryEvent = telemetryEvent; +} + +bool ChoiceTask::isCompleted() +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + + if( m_bConfirmMappingComplete || m_bCancelMappingComplete ) + { + sendTelemetry(); + enableConstraints(false, true); + return true; + } + + if(ui.GetMenuDisplayed(tutorial->getPad())) + { + // If a menu is displayed, then we use the handleUIInput to complete the task + } + else + { + // If the player is under water then allow all keypresses so they can jump out + if( pMinecraft->localplayers[tutorial->getPad()]->isUnderLiquid(Material::water) ) return false; + + if(!m_bConfirmMappingComplete && InputManager.GetValue(pMinecraft->player->GetXboxPad(), m_iConfirmMapping) > 0 ) + { + m_bConfirmMappingComplete = true; + } + if(!m_bCancelMappingComplete && InputManager.GetValue(pMinecraft->player->GetXboxPad(), m_iCancelMapping) > 0 ) + { + m_bCancelMappingComplete = true; + } + } + + if(m_bConfirmMappingComplete || m_bCancelMappingComplete) + { + sendTelemetry(); + enableConstraints(false, true); + } + return m_bConfirmMappingComplete || m_bCancelMappingComplete; +} + +eTutorial_CompletionAction ChoiceTask::getCompletionAction() +{ + if(m_bCancelMappingComplete) + { + return m_cancelAction; + } + else + { + return e_Tutorial_Completion_None; + } +} + +int ChoiceTask::getPromptId() +{ + if( m_bShownForMinimumTime ) + return m_promptId; + else + return -1; +} + +void ChoiceTask::setAsCurrentTask(bool active /*= true*/) +{ + enableConstraints( active ); + TutorialTask::setAsCurrentTask(active); +} + +void ChoiceTask::handleUIInput(int iAction) +{ + if(bHasBeenActivated && m_bShownForMinimumTime) + { + if( iAction == m_iConfirmMapping ) + { + m_bConfirmMappingComplete = true; + } + else if(iAction == m_iCancelMapping ) + { + m_bCancelMappingComplete = true; + } + } +} + +void ChoiceTask::sendTelemetry() +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + + if( m_eTelemetryEvent != eTelemetryChallenges_Unknown ) + { + bool firstPlay = true; + // We only store first play for some of the events + switch(m_eTelemetryEvent) + { + case eTelemetryTutorial_TrialStart: + firstPlay = !tutorial->getCompleted( eTutorial_Telemetry_TrialStart ); + tutorial->setCompleted( eTutorial_Telemetry_TrialStart ); + break; + case eTelemetryTutorial_Halfway: + firstPlay = !tutorial->getCompleted( eTutorial_Telemetry_Halfway ); + tutorial->setCompleted( eTutorial_Telemetry_Halfway ); + break; + }; + + TelemetryManager->RecordEnemyKilledOrOvercome(pMinecraft->player->GetXboxPad(), 0, 0, 0, 0, 0, 0, m_eTelemetryEvent); + } +} diff --git a/Minecraft.Client/Common/Tutorial/ChoiceTask.h b/Minecraft.Client/Common/Tutorial/ChoiceTask.h new file mode 100644 index 00000000..79c2ba42 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/ChoiceTask.h @@ -0,0 +1,27 @@ +#pragma once +using namespace std; + +#include "TutorialTask.h" + +// Information messages with a choice +class ChoiceTask : public TutorialTask +{ +private: + int m_iConfirmMapping, m_iCancelMapping; + bool m_bConfirmMappingComplete, m_bCancelMappingComplete; + eTutorial_CompletionAction m_cancelAction; + + ETelemetryChallenges m_eTelemetryEvent; + + bool CompletionMaskIsValid(); +public: + ChoiceTask(Tutorial *tutorial, int descriptionId, int promptId = -1, bool requiresUserInput = false, int iConfirmMapping = 0, int iCancelMapping = 0, eTutorial_CompletionAction cancelAction = e_Tutorial_Completion_None, ETelemetryChallenges telemetryEvent = eTelemetryChallenges_Unknown); + virtual bool isCompleted(); + virtual eTutorial_CompletionAction getCompletionAction(); + virtual int getPromptId(); + virtual void setAsCurrentTask(bool active = true); + virtual void handleUIInput(int iAction); + +private: + void sendTelemetry(); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/CompleteUsingItemTask.cpp b/Minecraft.Client/Common/Tutorial/CompleteUsingItemTask.cpp new file mode 100644 index 00000000..43b2f7f3 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/CompleteUsingItemTask.cpp @@ -0,0 +1,37 @@ +#include "stdafx.h" +#include "..\..\..\Minecraft.World\ItemInstance.h" +#include "CompleteUsingItemTask.h" + +CompleteUsingItemTask::CompleteUsingItemTask(Tutorial *tutorial, int descriptionId, int itemIds[], unsigned int itemIdsLength, bool enablePreCompletion) + : TutorialTask( tutorial, descriptionId, enablePreCompletion, NULL) +{ + m_iValidItemsA= new int [itemIdsLength]; + for(int i=0;i item) +{ + if(!hasBeenActivated() && !isPreCompletionEnabled()) return; + for(int i=0;iid == m_iValidItemsA[i] ) + { + bIsCompleted = true; + break; + } + } +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/CompleteUsingItemTask.h b/Minecraft.Client/Common/Tutorial/CompleteUsingItemTask.h new file mode 100644 index 00000000..a905bead --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/CompleteUsingItemTask.h @@ -0,0 +1,20 @@ +#pragma once +using namespace std; + +#include "TutorialTask.h" + +class Level; + +class CompleteUsingItemTask : public TutorialTask +{ +private: + int *m_iValidItemsA; + int m_iValidItemsCount; + bool completed; + +public: + CompleteUsingItemTask(Tutorial *tutorial, int descriptionId, int itemIds[], unsigned int itemIdsLength, bool enablePreCompletion = false); + virtual ~CompleteUsingItemTask(); + virtual bool isCompleted(); + virtual void completeUsingItem(shared_ptr item); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/ControllerTask.cpp b/Minecraft.Client/Common/Tutorial/ControllerTask.cpp new file mode 100644 index 00000000..c5fe071b --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/ControllerTask.cpp @@ -0,0 +1,123 @@ +#include "stdafx.h" +#include +#include +#include "..\..\Minecraft.h" +#include "..\..\MultiplayerLocalPlayer.h" +#include "Tutorial.h" +#include "TutorialConstraints.h" +#include "ControllerTask.h" + +ControllerTask::ControllerTask(Tutorial *tutorial, int descriptionId, bool enablePreCompletion, bool showMinimumTime, + int mappings[], unsigned int mappingsLength, int iCompletionMaskA[], int iCompletionMaskACount, int iSouthpawMappings[], unsigned int uiSouthpawMappingsCount) + : TutorialTask( tutorial, descriptionId, enablePreCompletion, NULL, showMinimumTime ) +{ + for(unsigned int i = 0; i < mappingsLength; ++i) + { + constraints.push_back( new InputConstraint( mappings[i] ) ); + completedMappings[mappings[i]] = false; + } + if(uiSouthpawMappingsCount > 0 ) m_bHasSouthpaw = true; + for(unsigned int i = 0; i < uiSouthpawMappingsCount; ++i) + { + southpawCompletedMappings[iSouthpawMappings[i]] = false; + } + + m_iCompletionMaskA= new int [iCompletionMaskACount]; + for(int i=0;iplayer->GetXboxPad(),eGameSetting_ControlSouthPaw)) + { + for(AUTO_VAR(it, southpawCompletedMappings.begin()); it != southpawCompletedMappings.end(); ++it) + { + bool current = (*it).second; + if(!current) + { + // TODO Use a different pad + if( InputManager.GetValue(pMinecraft->player->GetXboxPad(), (*it).first) > 0 ) + { + (*it).second = true; + m_uiCompletionMask|=1<player->GetXboxPad(), (*it).first) > 0 ) + { + (*it).second = true; + m_uiCompletionMask|=1< completedMappings; + unordered_map southpawCompletedMappings; + bool m_bHasSouthpaw; + unsigned int m_uiCompletionMask; + int *m_iCompletionMaskA; + int m_iCompletionMaskACount; + bool CompletionMaskIsValid(); +public: + ControllerTask(Tutorial *tutorial, int descriptionId, bool enablePreCompletion, bool showMinimumTime, + int mappings[], unsigned int mappingsLength, int iCompletionMaskA[]=NULL, int iCompletionMaskACount=0, int iSouthpawMappings[]=NULL, unsigned int uiSouthpawMappingsCount=0); + ~ControllerTask(); + virtual bool isCompleted(); + virtual void setAsCurrentTask(bool active = true); + +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/CraftTask.cpp b/Minecraft.Client/Common/Tutorial/CraftTask.cpp new file mode 100644 index 00000000..6749d030 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/CraftTask.cpp @@ -0,0 +1,66 @@ +#include "stdafx.h" +#include "CraftTask.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.h" + +CraftTask::CraftTask( int itemId, int auxValue, int quantity, + Tutorial *tutorial, int descriptionId, bool enablePreCompletion /*= true*/, vector *inConstraints /*= NULL*/, + bool bShowMinimumTime /*=false*/, bool bAllowFade /*=true*/, bool m_bTaskReminders /*=true*/ ) + : TutorialTask(tutorial, descriptionId, enablePreCompletion, inConstraints, bShowMinimumTime, bAllowFade, m_bTaskReminders ), + m_quantity( quantity ), + m_count( 0 ) +{ + m_numItems = 1; + m_items = new int[1]; + m_items[0] = itemId; + m_auxValues = new int[1]; + m_auxValues[0] = auxValue; +} + +CraftTask::CraftTask( int *items, int *auxValues, int numItems, int quantity, + Tutorial *tutorial, int descriptionId, bool enablePreCompletion /*= true*/, vector *inConstraints /*= NULL*/, + bool bShowMinimumTime /*=false*/, bool bAllowFade /*=true*/, bool m_bTaskReminders /*=true*/ ) + : TutorialTask(tutorial, descriptionId, enablePreCompletion, inConstraints, bShowMinimumTime, bAllowFade, m_bTaskReminders ), + m_quantity( quantity ), + m_count( 0 ) +{ + m_numItems = numItems; + m_items = new int[m_numItems]; + m_auxValues = new int[m_numItems]; + + for(int i = 0; i < m_numItems; ++i) + { + m_items[i] = items[i]; + m_auxValues[i] = auxValues[i]; + } +} + +CraftTask::~CraftTask() +{ + delete[] m_items; + delete[] m_auxValues; +} + +void CraftTask::onCrafted(shared_ptr item) +{ +#ifndef _CONTENT_PACKAGE + wprintf(L"CraftTask::onCrafted - %ls\n", item->toString().c_str() ); +#endif + bool itemFound = false; + for(int i = 0; i < m_numItems; ++i) + { + if(m_items[i] == item->id && (m_auxValues[i] == -1 || m_auxValues[i] == item->getAuxValue())) + { + itemFound = true; + break; + } + } + + if(itemFound) + { + ++m_count; + } + if( m_count >= m_quantity) + { + bIsCompleted = true; + } +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/CraftTask.h b/Minecraft.Client/Common/Tutorial/CraftTask.h new file mode 100644 index 00000000..1496f07a --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/CraftTask.h @@ -0,0 +1,25 @@ +#pragma once +#include "TutorialTask.h" + +class CraftTask : public TutorialTask +{ +public: + CraftTask( int itemId, int auxValue, int quantity, + Tutorial *tutorial, int descriptionId, bool enablePreCompletion = true, vector *inConstraints = NULL, + bool bShowMinimumTime=false, bool bAllowFade=true, bool m_bTaskReminders=true ); + CraftTask( int *items, int *auxValues, int numItems, int quantity, + Tutorial *tutorial, int descriptionId, bool enablePreCompletion = true, vector *inConstraints = NULL, + bool bShowMinimumTime=false, bool bAllowFade=true, bool m_bTaskReminders=true ); + + ~CraftTask(); + + virtual bool isCompleted() { return bIsCompleted; } + virtual void onCrafted(shared_ptr item); + +private: + int *m_items; + int *m_auxValues; + int m_numItems; + int m_quantity; + int m_count; +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/DiggerItemHint.cpp b/Minecraft.Client/Common/Tutorial/DiggerItemHint.cpp new file mode 100644 index 00000000..86dbe500 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/DiggerItemHint.cpp @@ -0,0 +1,76 @@ +#include "stdafx.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.tile.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.entity.h" +#include "Tutorial.h" +#include "DiggerItemHint.h" + + +DiggerItemHint::DiggerItemHint(eTutorial_Hint id, Tutorial *tutorial, int descriptionId, int items[], unsigned int itemsLength) + : TutorialHint(id, tutorial, descriptionId, e_Hint_DiggerItem) +{ + m_iItemsCount = itemsLength; + + m_iItems= new int [m_iItemsCount]; + for(unsigned int i=0;iaddMessage(IDS_TUTORIAL_HINT_ATTACK_WITH_TOOL, true); +} + +int DiggerItemHint::startDestroyBlock(shared_ptr item, Tile *tile) +{ + if(item != NULL) + { + bool itemFound = false; + for(unsigned int i=0;iid == m_iItems[i]) + { + itemFound = true; + break; + } + } + if(itemFound) + { + float speed = item->getDestroySpeed(tile); + if(speed == 1) + { + // Display hint + return m_descriptionId; + } + } + } + return -1; +} + +int DiggerItemHint::attack(shared_ptr item, shared_ptr entity) +{ + if(item != NULL) + { + bool itemFound = false; + for(unsigned int i=0;iid == m_iItems[i]) + { + itemFound = true; + break; + } + } + if(itemFound) + { + // It's also possible that we could hit TileEntities (eg falling sand) so don't want to give this hint then + if( entity->instanceof(eTYPE_MOB) ) + { + return IDS_TUTORIAL_HINT_ATTACK_WITH_TOOL; + } + else + { + return -1; + } + } + } + return -1; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/DiggerItemHint.h b/Minecraft.Client/Common/Tutorial/DiggerItemHint.h new file mode 100644 index 00000000..cb71742e --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/DiggerItemHint.h @@ -0,0 +1,18 @@ +#pragma once + +#include "TutorialHint.h" + +class DiggerItem; +class Level; + +class DiggerItemHint : public TutorialHint +{ +private: + int *m_iItems; + unsigned int m_iItemsCount; + +public: + DiggerItemHint(eTutorial_Hint id, Tutorial *tutorial, int descriptionId, int items[], unsigned int itemsLength); + virtual int startDestroyBlock(shared_ptr item, Tile *tile); + virtual int attack(shared_ptr item, shared_ptr entity); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/EffectChangedTask.cpp b/Minecraft.Client/Common/Tutorial/EffectChangedTask.cpp new file mode 100644 index 00000000..5f1b5b20 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/EffectChangedTask.cpp @@ -0,0 +1,31 @@ +#include "stdafx.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.effect.h" +#include "EffectChangedTask.h" + +EffectChangedTask::EffectChangedTask(Tutorial *tutorial, int descriptionId, MobEffect *effect, bool apply, + bool enablePreCompletion, bool bShowMinimumTime, bool bAllowFade, bool bTaskReminders ) + : TutorialTask(tutorial,descriptionId,enablePreCompletion,NULL,bShowMinimumTime,bAllowFade,bTaskReminders) +{ + m_effect = effect; + m_apply = apply; +} + +bool EffectChangedTask::isCompleted() +{ + return bIsCompleted; +} + +void EffectChangedTask::onEffectChanged(MobEffect *effect, bool bRemoved /*=false*/) +{ + if(effect == m_effect) + { + if(m_apply == !bRemoved) + { + bIsCompleted = true; + } + else + { + bIsCompleted = false; + } + } +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/EffectChangedTask.h b/Minecraft.Client/Common/Tutorial/EffectChangedTask.h new file mode 100644 index 00000000..23563f39 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/EffectChangedTask.h @@ -0,0 +1,19 @@ +#pragma once +using namespace std; + +#include "TutorialTask.h" + +class MobEffect; + +class EffectChangedTask : public TutorialTask +{ +private: + MobEffect *m_effect; + bool m_apply; + +public: + EffectChangedTask(Tutorial *tutorial, int descriptionId, MobEffect *effect, bool apply = true, + bool enablePreCompletion = true, bool bShowMinimumTime = false, bool bAllowFade = true, bool bTaskReminders = true ); + virtual bool isCompleted(); + virtual void onEffectChanged(MobEffect *effect, bool bRemoved=false); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/FullTutorial.cpp b/Minecraft.Client/Common/Tutorial/FullTutorial.cpp new file mode 100644 index 00000000..d0fda62e --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/FullTutorial.cpp @@ -0,0 +1,722 @@ +#include "stdafx.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.tile.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.phys.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.effect.h" +#include "..\GameRules\ConsoleGameRules.h" +#include "DiggerItemHint.h" +#include "TutorialTasks.h" +#include "AreaHint.h" +#include "FullTutorial.h" +#include "TutorialConstraints.h" + +FullTutorial::FullTutorial(int iPad, bool isTrial /*= false*/) + : Tutorial(iPad, true) +{ + m_isTrial = isTrial; + m_freezeTime = true; + m_progressFlags = 0; + + for(unsigned int i = 0; i < e_Tutorial_State_Max; ++i) + { + m_completedStates[i] = false; + } + + addMessage(IDS_TUTORIAL_COMPLETED); + + /* + * + * + * GAMEPLAY + * + */ + // START OF BASIC TUTORIAL + if( m_isTrial ) + { + addTask(e_Tutorial_State_Gameplay, new ChoiceTask(this, IDS_TUTORIAL_TASK_OVERVIEW, IDS_TUTORIAL_PROMPT_START_TUTORIAL, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Jump_To_Last_Task, eTelemetryTutorial_TrialStart) ); + } + else + { +#ifdef _XBOX + if(getCompleted(eTutorial_Telemetry_Halfway) && !isStateCompleted(e_Tutorial_State_Redstone_And_Piston) ) + { + addTask(e_Tutorial_State_Gameplay, new ChoiceTask(this, IDS_TUTORIAL_NEW_FEATURES_CHOICE, IDS_TUTORIAL_PROMPT_NEW_FEATURES_CHOICE, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Jump_To_Last_Task, eTelemetryTutorial_TrialStart) ); + } + + addTask(e_Tutorial_State_Gameplay, new InfoTask(this, IDS_TUTORIAL_TASK_OVERVIEW, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); +#else + if(getCompleted(eTutorial_Telemetry_Halfway)) + { + addTask(e_Tutorial_State_Gameplay, new ChoiceTask(this, IDS_TUTORIAL_TASK_OVERVIEW, IDS_TUTORIAL_PROMPT_START_TUTORIAL, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Jump_To_Last_Task, eTelemetryTutorial_TrialStart) ); + } + else + { + addTask(e_Tutorial_State_Gameplay, new InfoTask(this, IDS_TUTORIAL_TASK_OVERVIEW, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + } +#endif + } + + int lookMappings[] = {MINECRAFT_ACTION_LOOK_UP, MINECRAFT_ACTION_LOOK_DOWN, MINECRAFT_ACTION_LOOK_LEFT, MINECRAFT_ACTION_LOOK_RIGHT}; + int moveMappings[] = {MINECRAFT_ACTION_FORWARD, MINECRAFT_ACTION_BACKWARD, MINECRAFT_ACTION_LEFT, MINECRAFT_ACTION_RIGHT}; + int iLookCompletionMaskA[]= { 10, // 1010 + 9, // 1001 + 6, // 0110 + 5 // 0101 + }; + addTask(e_Tutorial_State_Gameplay, new ControllerTask( this, IDS_TUTORIAL_TASK_LOOK, false, false, lookMappings, 4, iLookCompletionMaskA, 4, moveMappings, 4) ); + + addTask(e_Tutorial_State_Gameplay, new ControllerTask( this, IDS_TUTORIAL_TASK_MOVE, false, false, moveMappings, 4, iLookCompletionMaskA, 4, lookMappings, 4) ); + + addTask(e_Tutorial_State_Gameplay, new InfoTask(this, IDS_TUTORIAL_TASK_SPRINT, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + + int jumpMappings[] = {MINECRAFT_ACTION_JUMP}; + addTask(e_Tutorial_State_Gameplay, new ControllerTask( this, IDS_TUTORIAL_TASK_JUMP, false, true, jumpMappings, 1) ); + + int mineMappings[] = {MINECRAFT_ACTION_ACTION}; + addTask(e_Tutorial_State_Gameplay, new ControllerTask( this, IDS_TUTORIAL_TASK_MINE, false, true, mineMappings, 1) ); + addTask(e_Tutorial_State_Gameplay, new PickupTask( Tile::treeTrunk_Id, 4, -1, this, IDS_TUTORIAL_TASK_CHOP_WOOD ) ); + + int scrollMappings[] = {MINECRAFT_ACTION_LEFT_SCROLL,MINECRAFT_ACTION_RIGHT_SCROLL}; + //int scrollMappings[] = {ACTION_MENU_LEFT_SCROLL,ACTION_MENU_RIGHT_SCROLL}; + int iScrollCompletionMaskA[]= { 2, // 10 + 1};// 01 + addTask(e_Tutorial_State_Gameplay, new ControllerTask( this, IDS_TUTORIAL_TASK_SCROLL, false, false, scrollMappings, 2,iScrollCompletionMaskA,2) ); + + int invMappings[] = {MINECRAFT_ACTION_INVENTORY}; + addTask(e_Tutorial_State_Gameplay, new ControllerTask( this, IDS_TUTORIAL_TASK_INVENTORY, false, false, invMappings, 1) ); + addTask(e_Tutorial_State_Gameplay, new StateChangeTask( e_Tutorial_State_Inventory_Menu, this) ); + + addTask(e_Tutorial_State_Gameplay, new InfoTask(this, IDS_TUTORIAL_TASK_FOOD_BAR_DEPLETE, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Gameplay, new InfoTask(this, IDS_TUTORIAL_TASK_FOOD_BAR_HEAL, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Gameplay, new InfoTask(this, IDS_TUTORIAL_TASK_FOOD_BAR_FEED, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + + // While they should only eat the item we give them, includ the ability to complete this task with different items + int foodItems[] = {Item::mushroomStew_Id, Item::apple_Id, Item::bread_Id, Item::porkChop_raw_Id, Item::porkChop_cooked_Id, + Item::apple_gold_Id, Item::fish_raw_Id, Item::fish_cooked_Id, Item::cookie_Id, Item::beef_cooked_Id, + Item::beef_raw_Id, Item::chicken_cooked_Id, Item::chicken_raw_Id, Item::melon_Id, Item::rotten_flesh_Id}; + addTask(e_Tutorial_State_Gameplay, new CompleteUsingItemTask(this, IDS_TUTORIAL_TASK_FOOD_BAR_EAT_STEAK, foodItems, 15, true) ); + + int crftMappings[] = {MINECRAFT_ACTION_CRAFTING}; + addTask(e_Tutorial_State_Gameplay, new ControllerTask( this, IDS_TUTORIAL_TASK_CRAFTING, false, false, crftMappings, 1) ); + + addTask(e_Tutorial_State_Gameplay, new ProgressFlagTask( &m_progressFlags, FULL_TUTORIAL_PROGRESS_2_X_2_Crafting, ProgressFlagTask::e_Progress_Set_Flag, this ) ); + addTask(e_Tutorial_State_Gameplay, new StateChangeTask( e_Tutorial_State_2x2Crafting_Menu, this) ); + + addTask(e_Tutorial_State_Gameplay, new CraftTask( Tile::wood_Id, -1, 1, this, IDS_TUTORIAL_TASK_CREATE_PLANKS) ); + addTask(e_Tutorial_State_Gameplay, new CraftTask( Tile::workBench_Id, -1, 1, this, IDS_TUTORIAL_TASK_CREATE_CRAFTING_TABLE) ); + + //int useMappings[] = {MINECRAFT_ACTION_USE}; + //addTask(e_Tutorial_State_Gameplay, new ControllerTask( this, IDS_TUTORIAL_TASK_USE, false, false, useMappings, 1) ); + addTask(e_Tutorial_State_Gameplay, new InfoTask(this, IDS_TUTORIAL_TASK_USE, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Gameplay, new UseItemTask( Tile::workBench_Id, this, IDS_TUTORIAL_TASK_PLACE_WORKBENCH, true ) ); + + addTask(e_Tutorial_State_Gameplay, new InfoTask(this, IDS_TUTORIAL_TASK_NIGHT_DANGER, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Gameplay, new InfoTask(this, IDS_TUTORIAL_TASK_NEARBY_SHELTER, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Gameplay, new InfoTask(this, IDS_TUTORIAL_TASK_COLLECT_RESOURCES, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + + // END OF BASIC TUTORIAL + + addTask(e_Tutorial_State_Gameplay, new ChoiceTask(this, IDS_TUTORIAL_TASK_BASIC_COMPLETE, IDS_TUTORIAL_PROMPT_BASIC_COMPLETE, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Jump_To_Last_Task, eTelemetryTutorial_Halfway) ); + + // START OF FULL TUTORIAL + + addTask(e_Tutorial_State_Gameplay, new UseTileTask( Tile::workBench_Id, this, IDS_TUTORIAL_TASK_OPEN_WORKBENCH, false ) ); + + addTask(e_Tutorial_State_Gameplay, new ProgressFlagTask( &m_progressFlags, FULL_TUTORIAL_PROGRESS_3_X_3_Crafting, ProgressFlagTask::e_Progress_Set_Flag, this ) ); + addTask(e_Tutorial_State_Gameplay, new StateChangeTask( e_Tutorial_State_3x3Crafting_Menu, this) ); + + addTask(e_Tutorial_State_Gameplay, new CraftTask( Item::stick->id, -1, 1, this, IDS_TUTORIAL_TASK_CREATE_STICKS) ); + + int shovelItems[] = {Item::shovel_wood->id, Item::shovel_stone->id, Item::shovel_iron->id, Item::shovel_gold->id, Item::shovel_diamond->id}; + int shovelAuxVals[] = {-1,-1,-1,-1,-1}; + addTask(e_Tutorial_State_Gameplay, new CraftTask( shovelItems, shovelAuxVals, 5, 1, this, IDS_TUTORIAL_TASK_CREATE_WOODEN_SHOVEL) ); + + int hatchetItems[] = {Item::hatchet_wood->id, Item::hatchet_stone->id, Item::hatchet_iron->id, Item::hatchet_gold->id, Item::hatchet_diamond->id}; + int hatchetAuxVals[] = {-1,-1,-1,-1,-1}; + addTask(e_Tutorial_State_Gameplay, new CraftTask( hatchetItems, hatchetAuxVals, 5, 1, this, IDS_TUTORIAL_TASK_CREATE_WOODEN_HATCHET) ); + + int pickaxeItems[] = {Item::pickAxe_wood->id, Item::pickAxe_stone->id, Item::pickAxe_iron->id, Item::pickAxe_gold->id, Item::pickAxe_diamond->id}; + int pickaxeAuxVals[] = {-1,-1,-1,-1,-1}; + addTask(e_Tutorial_State_Gameplay, new CraftTask( pickaxeItems, pickaxeAuxVals, 5, 1, this, IDS_TUTORIAL_TASK_CREATE_WOODEN_PICKAXE) ); + + addTask(e_Tutorial_State_Gameplay, new PickupTask( Tile::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 ) ); + addTask(e_Tutorial_State_Gameplay, new UseTileTask(Tile::furnace_Id, this, IDS_TUTORIAL_TASK_PLACE_AND_OPEN_FURNACE) ); + + addTask(e_Tutorial_State_Gameplay, new ProgressFlagTask( &m_progressFlags, FULL_TUTORIAL_PROGRESS_USE_FURNACE, ProgressFlagTask::e_Progress_Set_Flag, this ) ); + addTask(e_Tutorial_State_Gameplay, new StateChangeTask( e_Tutorial_State_Furnace_Menu, this) ); + addTask(e_Tutorial_State_Gameplay, new CraftTask( Item::coal->id, -1, 1, this, IDS_TUTORIAL_TASK_CREATE_CHARCOAL) ); + addTask(e_Tutorial_State_Gameplay, new CraftTask( Tile::glass_Id, -1, 1, this, IDS_TUTORIAL_TASK_CREATE_GLASS) ); + addTask(e_Tutorial_State_Gameplay, new CraftTask( Item::door_wood->id, -1, 1, this, IDS_TUTORIAL_TASK_CREATE_WOODEN_DOOR) ); + addTask(e_Tutorial_State_Gameplay, new UseItemTask(Item::door_wood->id, this, IDS_TUTORIAL_TASK_PLACE_DOOR) ); + addTask(e_Tutorial_State_Gameplay, new CraftTask( Tile::torch_Id, -1, 1, this, IDS_TUTORIAL_TASK_CREATE_TORCH) ); + + if(app.getGameRuleDefinitions() != NULL) + { + AABB *area = app.getGameRuleDefinitions()->getNamedArea(L"tutorialArea"); + if(area != NULL) + { + vector *areaConstraints = new vector(); + areaConstraints->push_back( new AreaConstraint( IDS_TUTORIAL_CONSTRAINT_TUTORIAL_AREA, area->x0,area->y0,area->z0,area->x1,area->y1,area->z1) ); + addTask(e_Tutorial_State_Gameplay, new AreaTask(e_Tutorial_State_Gameplay,this, areaConstraints) ); + } + } + + // This MUST be the last task in the e_Tutorial_State_Gameplay state. Some of the earlier tasks will skip to the last + // task when complete, and this is the one that we want the player to see. + ProcedureCompoundTask *finalTask = new ProcedureCompoundTask( this ); + finalTask->AddTask( new InfoTask(this, IDS_TUTORIAL_COMPLETED, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A, eTelemetryTutorial_Complete) ); + // 4J Stu - Remove this string as it refers to things that don't exist in the current tutorial world! + //finalTask->AddTask( new InfoTask(this, IDS_TUTORIAL_FEATURES_IN_THIS_AREA, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + finalTask->AddTask( new InfoTask(this, IDS_TUTORIAL_FEATURES_OUTSIDE_THIS_AREA, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + finalTask->AddTask( new InfoTask(this, IDS_TUTORIAL_COMPLETED_EXPLORE, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Gameplay, finalTask); + // END OF FULL TUTORIAL + + + /* + * + * + * INVENTORY + * + */ + // Some tasks already added in the super class ctor + addTask(e_Tutorial_State_Inventory_Menu, new FullTutorialActiveTask( this, e_Tutorial_Completion_Complete_State) ); + addTask(e_Tutorial_State_Inventory_Menu, new InfoTask(this, IDS_TUTORIAL_TASK_INV_EXIT, -1, false, ACTION_MENU_B) ); + + /* + * + * + * CRAFTING + * + */ + // Some tasks already added in the super class ctor + + addTask(e_Tutorial_State_2x2Crafting_Menu, new FullTutorialActiveTask( this, e_Tutorial_Completion_Complete_State) ); + // To block progress + addTask(e_Tutorial_State_2x2Crafting_Menu, new ProgressFlagTask( &m_progressFlags, FULL_TUTORIAL_PROGRESS_2_X_2_Crafting, ProgressFlagTask::e_Progress_Flag_On, this ) ); + + addTask(e_Tutorial_State_2x2Crafting_Menu, new FullTutorialActiveTask( this, e_Tutorial_Completion_Complete_State) ); + + addTask(e_Tutorial_State_2x2Crafting_Menu, new CraftTask( Tile::wood_Id, -1, 1, this, IDS_TUTORIAL_TASK_CRAFT_CREATE_PLANKS) ); + + ProcedureCompoundTask *workbenchCompound = new ProcedureCompoundTask( this ); + workbenchCompound->AddTask( new XuiCraftingTask( this, IDS_TUTORIAL_TASK_CRAFT_SELECT_STRUCTURES, Recipy::eGroupType_Structure) ); + workbenchCompound->AddTask( new XuiCraftingTask( this, IDS_TUTORIAL_TASK_CRAFT_SELECT_CRAFTING_TABLE, Tile::workBench_Id) ); + workbenchCompound->AddTask( new CraftTask( Tile::workBench_Id, -1, 1, this, IDS_TUTORIAL_TASK_CREATE_CRAFTING_TABLE) ); + addTask(e_Tutorial_State_2x2Crafting_Menu, workbenchCompound ); + addTask(e_Tutorial_State_2x2Crafting_Menu, new InfoTask(this, IDS_TUTORIAL_TASK_CRAFT_EXIT_AND_PLACE_TABLE, -1, false, ACTION_MENU_B) ); + + // 3x3 Crafting + addTask(e_Tutorial_State_3x3Crafting_Menu, new FullTutorialActiveTask( this, e_Tutorial_Completion_Complete_State) ); + + addTask(e_Tutorial_State_3x3Crafting_Menu, new ProgressFlagTask( &m_progressFlags, FULL_TUTORIAL_PROGRESS_3_X_3_Crafting, ProgressFlagTask::e_Progress_Flag_On, this ) ); + + addTask(e_Tutorial_State_3x3Crafting_Menu, new CraftTask( Item::stick->id, -1, 1, this, IDS_TUTORIAL_TASK_CREATE_STICKS) ); + + ProcedureCompoundTask *shovelCompound = new ProcedureCompoundTask( this ); + shovelCompound->AddTask( new XuiCraftingTask( this, IDS_TUTORIAL_TASK_CRAFT_SELECT_TOOLS, Recipy::eGroupType_Tool) ); + shovelCompound->AddTask( new XuiCraftingTask( this, IDS_TUTORIAL_TASK_CRAFT_SELECT_WOODEN_SHOVEL, Item::shovel_wood->id) ); + shovelCompound->AddTask( new CraftTask( shovelItems, shovelAuxVals, 5, 1, this, IDS_TUTORIAL_TASK_CREATE_WOODEN_SHOVEL) ); + addTask(e_Tutorial_State_3x3Crafting_Menu, shovelCompound ); + addTask(e_Tutorial_State_3x3Crafting_Menu, new CraftTask( hatchetItems, hatchetAuxVals, 5, 1, this, IDS_TUTORIAL_TASK_CREATE_WOODEN_HATCHET) ); + addTask(e_Tutorial_State_3x3Crafting_Menu, new CraftTask( pickaxeItems, pickaxeAuxVals, 5, 1, this, IDS_TUTORIAL_TASK_CREATE_WOODEN_PICKAXE) ); + + addTask(e_Tutorial_State_3x3Crafting_Menu, new InfoTask(this, IDS_TUTORIAL_TASK_CRAFT_TOOLS_BUILT, -1, false, ACTION_MENU_B) ); + + // To block progress + addTask(e_Tutorial_State_3x3Crafting_Menu, new ProgressFlagTask( &m_progressFlags, FULL_TUTORIAL_PROGRESS_CRAFT_FURNACE, ProgressFlagTask::e_Progress_Flag_On, this ) ); + + addTask(e_Tutorial_State_3x3Crafting_Menu, new CraftTask( Tile::furnace_Id, -1, 1, this, IDS_TUTORIAL_TASK_CRAFT_CREATE_FURNACE) ); + addTask(e_Tutorial_State_3x3Crafting_Menu, new InfoTask(this, IDS_TUTORIAL_TASK_CRAFT_EXIT_AND_PLACE_FURNACE, -1, false, ACTION_MENU_B) ); + + // No need to block here, as it's fine if the player wants to do this out of order + addTask(e_Tutorial_State_3x3Crafting_Menu, new CraftTask( Item::door_wood->id, -1, 1, this, IDS_TUTORIAL_TASK_CREATE_WOODEN_DOOR) ); + addTask(e_Tutorial_State_3x3Crafting_Menu, new CraftTask( Tile::torch_Id, -1, 1, this, IDS_TUTORIAL_TASK_CREATE_TORCH) ); + + /* + * + * + * FURNACE + * + */ + // Some tasks already added in the super class ctor + + addTask(e_Tutorial_State_Furnace_Menu, new FullTutorialActiveTask( this, e_Tutorial_Completion_Complete_State) ); + + // Blocking + addTask(e_Tutorial_State_Furnace_Menu, new ProgressFlagTask( &m_progressFlags, FULL_TUTORIAL_PROGRESS_USE_FURNACE, ProgressFlagTask::e_Progress_Flag_On, this ) ); + + addTask(e_Tutorial_State_Furnace_Menu, new CraftTask( Item::coal->id, -1, 1, this, IDS_TUTORIAL_TASK_FURNACE_CREATE_CHARCOAL) ); + addTask(e_Tutorial_State_Furnace_Menu, new InfoTask(this, IDS_TUTORIAL_TASK_FURNACE_CHARCOAL_USES, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Furnace_Menu, new CraftTask( Tile::glass_Id, -1, 1, this, IDS_TUTORIAL_TASK_FURNACE_CREATE_GLASS) ); + + /* + * + * + * BREWING + * + */ + + // To block progress + addTask(e_Tutorial_State_Brewing_Menu, new ProgressFlagTask( &m_progressFlags, EXTENDED_TUTORIAL_PROGRESS_USE_BREWING_STAND, ProgressFlagTask::e_Progress_Flag_On, this ) ); + + int potionItems[] = {Item::potion_Id,Item::potion_Id,Item::potion_Id,Item::potion_Id,Item::potion_Id,Item::potion_Id,Item::potion_Id,Item::potion_Id}; + int potionAuxVals[] = { MACRO_MAKEPOTION_AUXVAL(0, 0, MASK_FIRE_RESISTANCE), + MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, 0, MASK_FIRE_RESISTANCE), + MACRO_MAKEPOTION_AUXVAL(0, 0, MASK_FIRE_RESISTANCE), + MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, 0, MASK_FIRE_RESISTANCE), + MACRO_MAKEPOTION_AUXVAL(0, MASK_EXTENDED, MASK_FIRE_RESISTANCE), + MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_EXTENDED, MASK_FIRE_RESISTANCE), + MACRO_MAKEPOTION_AUXVAL(0, MASK_EXTENDED, MASK_FIRE_RESISTANCE), + MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_EXTENDED, MASK_FIRE_RESISTANCE) + }; + addTask(e_Tutorial_State_Brewing_Menu, new CraftTask( potionItems, potionAuxVals, 8, 1, this, IDS_TUTORIAL_TASK_BREWING_MENU_CREATE_FIRE_POTION) ); + addTask(e_Tutorial_State_Brewing_Menu, new InfoTask(this, IDS_TUTORIAL_TASK_BREWING_MENU_EXIT, -1, false, ACTION_MENU_B) ); + + /* + * + * + * MINECART + * + */ + if(app.getGameRuleDefinitions() != NULL) + { + AABB *area = app.getGameRuleDefinitions()->getNamedArea(L"minecartArea"); + if(area != NULL) + { + addHint(e_Tutorial_State_Gameplay, new AreaHint(e_Tutorial_Hint_Always_On, this, e_Tutorial_State_Gameplay, e_Tutorial_State_Riding_Minecart, IDS_TUTORIAL_HINT_MINECART, area->x0,area->y0,area->z0,area->x1,area->y1,area->z1 ) ); + } + } + + /* + * + * + * BOAT + * + */ + if(app.getGameRuleDefinitions() != NULL) + { + AABB *area = app.getGameRuleDefinitions()->getNamedArea(L"boatArea"); + if(area != NULL) + { + addHint(e_Tutorial_State_Gameplay, new AreaHint(e_Tutorial_Hint_Always_On, this, e_Tutorial_State_Gameplay, e_Tutorial_State_Riding_Boat, IDS_TUTORIAL_HINT_BOAT, area->x0,area->y0,area->z0,area->x1,area->y1,area->z1 ) ); + } + } + + /* + * + * + * FISHING + * + */ + if(app.getGameRuleDefinitions() != NULL) + { + AABB *area = app.getGameRuleDefinitions()->getNamedArea(L"fishingArea"); + if(area != NULL) + { + addHint(e_Tutorial_State_Gameplay, new AreaHint(e_Tutorial_Hint_Always_On, this, e_Tutorial_State_Gameplay, e_Tutorial_State_Fishing, IDS_TUTORIAL_HINT_FISHING, area->x0,area->y0,area->z0,area->x1,area->y1,area->z1 ) ); + } + } + + /* + * + * + * PISTON - SELF-REPAIRING BRIDGE + * + */ + if(app.getGameRuleDefinitions() != NULL) + { + AABB *area = app.getGameRuleDefinitions()->getNamedArea(L"pistonBridgeArea"); + if(area != NULL) + { + addHint(e_Tutorial_State_Gameplay, new AreaHint(e_Tutorial_Hint_Always_On, this, e_Tutorial_State_Gameplay, e_Tutorial_State_None, IDS_TUTORIAL_HINT_PISTON_SELF_REPAIRING_BRIDGE, area->x0,area->y0,area->z0,area->x1,area->y1,area->z1, true ) ); + } + } + + /* + * + * + * PISTON - PISTON AND REDSTONE CIRCUITS + * + */ + if(app.getGameRuleDefinitions() != NULL) + { + AABB *area = app.getGameRuleDefinitions()->getNamedArea(L"pistonArea"); + if(area != NULL) + { + eTutorial_State redstoneAndPistonStates[] = {e_Tutorial_State_Gameplay}; + AddGlobalConstraint( new ChangeStateConstraint(this, e_Tutorial_State_Redstone_And_Piston, redstoneAndPistonStates, 1, area->x0,area->y0,area->z0,area->x1,area->y1,area->z1) ); + + addTask(e_Tutorial_State_Redstone_And_Piston, new ChoiceTask(this, IDS_TUTORIAL_REDSTONE_OVERVIEW, IDS_TUTORIAL_PROMPT_REDSTONE_OVERVIEW, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Complete_State_Gameplay_Constraints, eTelemetryTutorial_Redstone_And_Pistons) ); + addTask(e_Tutorial_State_Redstone_And_Piston, new InfoTask(this, IDS_TUTORIAL_TASK_REDSTONE_POWER_SOURCES, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Redstone_And_Piston, new InfoTask(this, IDS_TUTORIAL_TASK_REDSTONE_TRIPWIRE, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Redstone_And_Piston, new InfoTask(this, IDS_TUTORIAL_TASK_REDSTONE_POWER_SOURCES_POSITION, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Redstone_And_Piston, new InfoTask(this, IDS_TUTORIAL_TASK_REDSTONE_DUST, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Redstone_And_Piston, new InfoTask(this, IDS_TUTORIAL_TASK_REDSTONE_REPEATER, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Redstone_And_Piston, new InfoTask(this, IDS_TUTORIAL_TASK_PISTONS, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Redstone_And_Piston, new InfoTask(this, IDS_TUTORIAL_TASK_TRY_IT, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + } + } + + /* + * + * + * PORTAL + * + */ + if(app.getGameRuleDefinitions() != NULL) + { + AABB *area = app.getGameRuleDefinitions()->getNamedArea(L"portalArea"); + if(area != NULL) + { + eTutorial_State portalStates[] = {e_Tutorial_State_Gameplay}; + AddGlobalConstraint( new ChangeStateConstraint(this, e_Tutorial_State_Portal, portalStates, 1, area->x0,area->y0,area->z0,area->x1,area->y1,area->z1) ); + + addTask(e_Tutorial_State_Portal, new ChoiceTask(this, IDS_TUTORIAL_PORTAL_OVERVIEW, IDS_TUTORIAL_PROMPT_PORTAL_OVERVIEW, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Complete_State_Gameplay_Constraints, eTelemetryTutorial_Portal) ); + addTask(e_Tutorial_State_Portal, new InfoTask(this, IDS_TUTORIAL_TASK_BUILD_PORTAL, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Portal, new InfoTask(this, IDS_TUTORIAL_TASK_ACTIVATE_PORTAL, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Portal, new InfoTask(this, IDS_TUTORIAL_TASK_USE_PORTAL, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Portal, new InfoTask(this, IDS_TUTORIAL_TASK_NETHER, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Portal, new InfoTask(this, IDS_TUTORIAL_TASK_NETHER_FAST_TRAVEL, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + } + } + + /* + * + * + * CREATIVE + * + */ + if(app.getGameRuleDefinitions() != NULL) + { + AABB *area = app.getGameRuleDefinitions()->getNamedArea(L"creativeArea"); + if(area != NULL) + { + eTutorial_State creativeStates[] = {e_Tutorial_State_Gameplay}; + AddGlobalConstraint( new ChangeStateConstraint(this, e_Tutorial_State_CreativeMode, creativeStates, 1, area->x0,area->y0,area->z0,area->x1,area->y1,area->z1,true,true,GameType::CREATIVE) ); + + addTask(e_Tutorial_State_CreativeMode, new ChoiceTask(this, IDS_TUTORIAL_CREATIVE_OVERVIEW, IDS_TUTORIAL_PROMPT_CREATIVE_OVERVIEW, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Jump_To_Last_Task, eTelemetryTutorial_CreativeMode) ); + addTask(e_Tutorial_State_CreativeMode, new InfoTask(this, IDS_TUTORIAL_TASK_CREATIVE_MODE, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_CreativeMode, new InfoTask(this, IDS_TUTORIAL_TASK_FLY, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + + int crftMappings[] = {MINECRAFT_ACTION_CRAFTING}; + addTask(e_Tutorial_State_CreativeMode, new ControllerTask( this, IDS_TUTORIAL_TASK_OPEN_CREATIVE_INVENTORY, false, false, crftMappings, 1) ); + addTask(e_Tutorial_State_CreativeMode, new StateChangeTask( e_Tutorial_State_Creative_Inventory_Menu, this) ); + + // This last task ensures that the player is still in creative mode until they exit the area (but could skip the previous instructional stuff) + ProcedureCompoundTask *creativeFinalTask = new ProcedureCompoundTask( this ); + + AABB *exitArea = app.getGameRuleDefinitions()->getNamedArea(L"creativeExitArea"); + if(exitArea != NULL) + { + vector *creativeExitAreaConstraints = new vector(); + creativeExitAreaConstraints->push_back( new AreaConstraint( -1, exitArea->x0,exitArea->y0,exitArea->z0,exitArea->x1,exitArea->y1,exitArea->z1,true,false) ); + creativeFinalTask->AddTask( new AreaTask(e_Tutorial_State_CreativeMode, this, creativeExitAreaConstraints,IDS_TUTORIAL_TASK_CREATIVE_EXIT,AreaTask::eAreaTaskCompletion_CompleteOnConstraintsSatisfied) ); + } + + vector *creativeAreaConstraints = new vector(); + creativeAreaConstraints->push_back( new AreaConstraint( IDS_TUTORIAL_CONSTRAINT_TUTORIAL_AREA, area->x0,area->y0,area->z0,area->x1,area->y1,area->z1) ); + creativeFinalTask->AddTask( new AreaTask(e_Tutorial_State_CreativeMode, this, creativeAreaConstraints) ); + + creativeFinalTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_CREATIVE_COMPLETE, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + + addTask(e_Tutorial_State_CreativeMode,creativeFinalTask); + } + } + + /* + * + * + * BREWING + * + */ + if(app.getGameRuleDefinitions() != NULL) + { + AABB *area = app.getGameRuleDefinitions()->getNamedArea(L"brewingArea"); + if(area != NULL) + { + eTutorial_State brewingStates[] = {e_Tutorial_State_Gameplay}; + AddGlobalConstraint( new ChangeStateConstraint(this, e_Tutorial_State_Brewing, brewingStates, 1, area->x0,area->y0,area->z0,area->x1,area->y1,area->z1) ); + + addTask(e_Tutorial_State_Brewing, new ChoiceTask(this, IDS_TUTORIAL_TASK_BREWING_OVERVIEW, IDS_TUTORIAL_PROMPT_BREWING_OVERVIEW, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Complete_State_Gameplay_Constraints, eTelemetryTutorial_Brewing) ); + + ProcedureCompoundTask *fillWaterBottleTask = new ProcedureCompoundTask( this ); + fillWaterBottleTask->AddTask( new PickupTask( Item::glassBottle_Id, 1, -1, this, IDS_TUTORIAL_TASK_BREWING_GET_GLASS_BOTTLE ) ); + fillWaterBottleTask->AddTask( new PickupTask( Item::potion_Id, 1, 0, this, IDS_TUTORIAL_TASK_BREWING_FILL_GLASS_BOTTLE ) ); + addTask(e_Tutorial_State_Brewing, fillWaterBottleTask); + + addTask(e_Tutorial_State_Brewing, new InfoTask(this, IDS_TUTORIAL_TASK_BREWING_FILL_CAULDRON, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + + + addTask(e_Tutorial_State_Brewing, new ProgressFlagTask( &m_progressFlags, EXTENDED_TUTORIAL_PROGRESS_USE_BREWING_STAND, ProgressFlagTask::e_Progress_Set_Flag, this ) ); + addTask(e_Tutorial_State_Brewing, new CraftTask( potionItems, potionAuxVals, 8, 1, this, IDS_TUTORIAL_TASK_BREWING_CREATE_FIRE_POTION) ); + + addTask(e_Tutorial_State_Brewing, new InfoTask(this, IDS_TUTORIAL_TASK_BREWING_USE_POTION, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Brewing, new EffectChangedTask(this, IDS_TUTORIAL_TASK_BREWING_DRINK_FIRE_POTION, MobEffect::fireResistance) ); + addTask(e_Tutorial_State_Brewing, new InfoTask(this, IDS_TUTORIAL_TASK_BREWING_USE_EFFECTS, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + } + } + + /* + * + * + * ENCHANTING + * + */ + if(app.getGameRuleDefinitions() != NULL) + { + AABB *area = app.getGameRuleDefinitions()->getNamedArea(L"enchantingArea"); + if(area != NULL) + { + eTutorial_State enchantingStates[] = {e_Tutorial_State_Gameplay}; + AddGlobalConstraint( new ChangeStateConstraint(this, e_Tutorial_State_Enchanting, enchantingStates, 1, area->x0,area->y0,area->z0,area->x1,area->y1,area->z1) ); + + addTask(e_Tutorial_State_Enchanting, new ChoiceTask(this, IDS_TUTORIAL_TASK_ENCHANTING_OVERVIEW, IDS_TUTORIAL_PROMPT_ENCHANTING_OVERVIEW, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Complete_State_Gameplay_Constraints, eTelemetryTutorial_Enchanting) ); + + addTask(e_Tutorial_State_Enchanting, new InfoTask(this, IDS_TUTORIAL_TASK_ENCHANTING_SUMMARY, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Enchanting, new InfoTask(this, IDS_TUTORIAL_TASK_ENCHANTING_BOOKS, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Enchanting, new InfoTask(this, IDS_TUTORIAL_TASK_ENCHANTING_BOOKCASES, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Enchanting, new InfoTask(this, IDS_TUTORIAL_TASK_ENCHANTING_EXPERIENCE, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Enchanting, new InfoTask(this, IDS_TUTORIAL_TASK_ENCHANTING_BOTTLE_O_ENCHANTING, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Enchanting, new InfoTask(this, IDS_TUTORIAL_TASK_ENCHANTING_USE_CHESTS, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + } + } + + /* + * + * + * ANVIL + * + */ + if(app.getGameRuleDefinitions() != NULL) + { + AABB *area = app.getGameRuleDefinitions()->getNamedArea(L"anvilArea"); + if(area != NULL) + { + eTutorial_State enchantingStates[] = {e_Tutorial_State_Gameplay}; + AddGlobalConstraint( new ChangeStateConstraint(this, e_Tutorial_State_Anvil, enchantingStates, 1, area->x0,area->y0,area->z0,area->x1,area->y1,area->z1) ); + + addTask(e_Tutorial_State_Anvil, new ChoiceTask(this, IDS_TUTORIAL_TASK_ANVIL_OVERVIEW, IDS_TUTORIAL_PROMPT_ANVIL_OVERVIEW, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Complete_State_Gameplay_Constraints, eTelemetryTutorial_Anvil) ); + + addTask(e_Tutorial_State_Anvil, new InfoTask(this, IDS_TUTORIAL_TASK_ANVIL_SUMMARY, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Anvil, new InfoTask(this, IDS_TUTORIAL_TASK_ANVIL_ENCHANTED_BOOKS, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Anvil, new InfoTask(this, IDS_TUTORIAL_TASK_ANVIL_COST, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Anvil, new InfoTask(this, IDS_TUTORIAL_TASK_ANVIL_COST2, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Anvil, new InfoTask(this, IDS_TUTORIAL_TASK_ANVIL_RENAMING, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Anvil, new InfoTask(this, IDS_TUTORIAL_TASK_ANVIL_USE_CHESTS, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + } + } + + /* + * + * + * TRADING + * + */ + if(app.getGameRuleDefinitions() != NULL) + { + AABB *area = app.getGameRuleDefinitions()->getNamedArea(L"tradingArea"); + if(area != NULL) + { + eTutorial_State 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) ); + + addTask(e_Tutorial_State_Trading, new InfoTask(this, IDS_TUTORIAL_TASK_TRADING_SUMMARY, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Trading, new InfoTask(this, IDS_TUTORIAL_TASK_TRADING_TRADES, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Trading, new InfoTask(this, IDS_TUTORIAL_TASK_TRADING_INCREASE_TRADES, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Trading, new InfoTask(this, IDS_TUTORIAL_TASK_TRADING_DECREASE_TRADES, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Trading, new InfoTask(this, IDS_TUTORIAL_TASK_TRADING_USE_CHESTS, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + } + } + + /* + * + * + * 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) ); + } + } + + /* + * + * + * ENDERCHEST + * + */ + if(app.getGameRuleDefinitions() != NULL) + { + AABB *area = app.getGameRuleDefinitions()->getNamedArea(L"enderchestArea"); + if(area != NULL) + { + eTutorial_State enchantingStates[] = {e_Tutorial_State_Gameplay}; + AddGlobalConstraint( new ChangeStateConstraint(this, e_Tutorial_State_Enderchests, enchantingStates, 1, area->x0,area->y0,area->z0,area->x1,area->y1,area->z1) ); + + addTask(e_Tutorial_State_Enderchests, new ChoiceTask(this, IDS_TUTORIAL_TASK_ENDERCHEST_OVERVIEW, IDS_TUTORIAL_PROMPT_ENDERCHEST_OVERVIEW, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Complete_State_Gameplay_Constraints, eTelemetryTutorial_Enderchest) ); + + addTask(e_Tutorial_State_Enderchests, new InfoTask(this, IDS_TUTORIAL_TASK_ENDERCHEST_SUMMARY, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Enderchests, new InfoTask(this, IDS_TUTORIAL_TASK_ENDERCHEST_PLAYERS, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Enderchests, new InfoTask(this, IDS_TUTORIAL_TASK_ENDERCHEST_FUNCTION, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + } + } + + /* + * + * + * FARMING + * + */ + if(app.getGameRuleDefinitions() != NULL) + { + AABB *area = app.getGameRuleDefinitions()->getNamedArea(L"farmingArea"); + if(area != NULL) + { + eTutorial_State farmingStates[] = {e_Tutorial_State_Gameplay}; + AddGlobalConstraint( new ChangeStateConstraint(this, e_Tutorial_State_Farming, farmingStates, 1, area->x0,area->y0,area->z0,area->x1,area->y1,area->z1) ); + + addTask(e_Tutorial_State_Farming, new ChoiceTask(this, IDS_TUTORIAL_FARMING_OVERVIEW, IDS_TUTORIAL_PROMPT_FARMING_OVERVIEW, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Complete_State_Gameplay_Constraints, eTelemetryTutorial_Farming) ); + + addTask(e_Tutorial_State_Farming, new InfoTask(this, IDS_TUTORIAL_TASK_FARMING_SEEDS, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Farming, new InfoTask(this, IDS_TUTORIAL_TASK_FARMING_FARMLAND, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Farming, new InfoTask(this, IDS_TUTORIAL_TASK_FARMING_WHEAT, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Farming, new InfoTask(this, IDS_TUTORIAL_TASK_FARMING_PUMPKIN_AND_MELON, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Farming, new InfoTask(this, IDS_TUTORIAL_TASK_FARMING_CARROTS_AND_POTATOES, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Farming, new InfoTask(this, IDS_TUTORIAL_TASK_FARMING_SUGARCANE, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Farming, new InfoTask(this, IDS_TUTORIAL_TASK_FARMING_CACTUS, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Farming, new InfoTask(this, IDS_TUTORIAL_TASK_FARMING_MUSHROOM, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Farming, new InfoTask(this, IDS_TUTORIAL_TASK_FARMING_BONEMEAL, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Farming, new InfoTask(this, IDS_TUTORIAL_TASK_FARMING_COMPLETE, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + } + } + + /* + * + * + * BREEDING + * + */ + if(app.getGameRuleDefinitions() != NULL) + { + AABB *area = app.getGameRuleDefinitions()->getNamedArea(L"breedingArea"); + if(area != NULL) + { + eTutorial_State breedingStates[] = {e_Tutorial_State_Gameplay}; + AddGlobalConstraint( new ChangeStateConstraint(this, e_Tutorial_State_Breeding, breedingStates, 1, area->x0,area->y0,area->z0,area->x1,area->y1,area->z1) ); + + addTask(e_Tutorial_State_Breeding, new ChoiceTask(this, IDS_TUTORIAL_BREEDING_OVERVIEW, IDS_TUTORIAL_PROMPT_BREEDING_OVERVIEW, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Complete_State_Gameplay_Constraints, eTelemetryTutorial_Breeding) ); + + addTask(e_Tutorial_State_Breeding, new InfoTask(this, IDS_TUTORIAL_TASK_BREEDING_FEED, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Breeding, new InfoTask(this, IDS_TUTORIAL_TASK_BREEDING_FEED_FOOD, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Breeding, new InfoTask(this, IDS_TUTORIAL_TASK_BREEDING_BABY, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Breeding, new InfoTask(this, IDS_TUTORIAL_TASK_BREEDING_DELAY, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Breeding, new InfoTask(this, IDS_TUTORIAL_TASK_BREEDING_FOLLOW, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Breeding, new InfoTask(this, IDS_TUTORIAL_TASK_BREEDING_RIDING_PIGS, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Breeding, new InfoTask(this, IDS_TUTORIAL_TASK_BREEDING_WOLF_TAMING, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Breeding, new InfoTask(this, IDS_TUTORIAL_TASK_BREEDING_WOLF_COLLAR, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Breeding, new InfoTask(this, IDS_TUTORIAL_TASK_BREEDING_COMPLETE, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + } + } + + /* + * + * + * SNOW AND IRON GOLEM + * + */ + if(app.getGameRuleDefinitions() != NULL) + { + AABB *area = app.getGameRuleDefinitions()->getNamedArea(L"golemArea"); + if(area != NULL) + { + eTutorial_State golemStates[] = {e_Tutorial_State_Gameplay}; + AddGlobalConstraint( new ChangeStateConstraint(this, e_Tutorial_State_Golem, golemStates, 1, area->x0,area->y0,area->z0,area->x1,area->y1,area->z1) ); + + addTask(e_Tutorial_State_Golem, new ChoiceTask(this, IDS_TUTORIAL_GOLEM_OVERVIEW, IDS_TUTORIAL_PROMPT_GOLEM_OVERVIEW, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Complete_State_Gameplay_Constraints, eTelemetryTutorial_Golem) ); + + addTask(e_Tutorial_State_Golem, new InfoTask(this, IDS_TUTORIAL_TASK_GOLEM_PUMPKIN, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Golem, new InfoTask(this, IDS_TUTORIAL_TASK_GOLEM_SNOW, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Golem, new InfoTask(this, IDS_TUTORIAL_TASK_GOLEM_IRON, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Golem, new InfoTask(this, IDS_TUTORIAL_TASK_GOLEM_IRON_VILLAGE, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + + } + } + +} + +// 4J Stu - All tutorials are onby default in the full tutorial whether the player has previously completed them or not +bool FullTutorial::isStateCompleted( eTutorial_State state ) +{ + return m_completedStates[state]; +} + +void FullTutorial::setStateCompleted( eTutorial_State state ) +{ + m_completedStates[state] = true; + Tutorial::setStateCompleted(state); +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/FullTutorial.h b/Minecraft.Client/Common/Tutorial/FullTutorial.h new file mode 100644 index 00000000..da2641d2 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/FullTutorial.h @@ -0,0 +1,21 @@ +#pragma once +#include "Tutorial.h" + +#define FULL_TUTORIAL_PROGRESS_2_X_2_Crafting 1 +#define FULL_TUTORIAL_PROGRESS_3_X_3_Crafting 2 +#define FULL_TUTORIAL_PROGRESS_CRAFT_FURNACE 4 +#define FULL_TUTORIAL_PROGRESS_USE_FURNACE 8 +#define EXTENDED_TUTORIAL_PROGRESS_USE_BREWING_STAND 16 + +class FullTutorial : public Tutorial +{ +private: + bool m_isTrial; + char m_progressFlags; + bool m_completedStates[e_Tutorial_State_Max]; +public: + FullTutorial(int iPad, bool isTrial = false); + + virtual bool isStateCompleted( eTutorial_State state ); + virtual void setStateCompleted( eTutorial_State state ); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/FullTutorialActiveTask.cpp b/Minecraft.Client/Common/Tutorial/FullTutorialActiveTask.cpp new file mode 100644 index 00000000..54985d21 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/FullTutorialActiveTask.cpp @@ -0,0 +1,26 @@ +#include "stdafx.h" +#include "Tutorial.h" +#include "FullTutorialActiveTask.h" + +FullTutorialActiveTask::FullTutorialActiveTask(Tutorial *tutorial, eTutorial_CompletionAction completeAction /*= e_Tutorial_Completion_None*/) + : TutorialTask( tutorial, -1, false, NULL, false, false, false ) +{ + m_completeAction = completeAction; +} + +bool FullTutorialActiveTask::isCompleted() +{ + return bHasBeenActivated; +} + +eTutorial_CompletionAction FullTutorialActiveTask::getCompletionAction() +{ + if( tutorial->m_fullTutorialComplete ) + { + return m_completeAction; + } + else + { + return e_Tutorial_Completion_None; + } +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/FullTutorialActiveTask.h b/Minecraft.Client/Common/Tutorial/FullTutorialActiveTask.h new file mode 100644 index 00000000..5aa05610 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/FullTutorialActiveTask.h @@ -0,0 +1,18 @@ +#pragma once +using namespace std; + +#include "TutorialTask.h" + +// Information messages with a choice +class FullTutorialActiveTask : public TutorialTask +{ +private: + eTutorial_CompletionAction m_completeAction; + + bool CompletionMaskIsValid(); +public: + FullTutorialActiveTask(Tutorial *tutorial, eTutorial_CompletionAction completeAction = e_Tutorial_Completion_None); + virtual bool isCompleted(); + virtual eTutorial_CompletionAction getCompletionAction(); + +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/FullTutorialMode.cpp b/Minecraft.Client/Common/Tutorial/FullTutorialMode.cpp new file mode 100644 index 00000000..a5ee85b8 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/FullTutorialMode.cpp @@ -0,0 +1,16 @@ +#include "stdafx.h" +#include "..\..\Minecraft.h" +#include "FullTutorial.h" +#include "FullTutorialMode.h" + +FullTutorialMode::FullTutorialMode(int iPad, Minecraft *minecraft, ClientConnection *connection) + : TutorialMode(iPad, minecraft, connection) +{ + tutorial = new FullTutorial( iPad ); + minecraft->playerStartedTutorial( iPad ); +} + +bool FullTutorialMode::isTutorial() +{ + return !tutorial->m_fullTutorialComplete; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/FullTutorialMode.h b/Minecraft.Client/Common/Tutorial/FullTutorialMode.h new file mode 100644 index 00000000..ce6f1819 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/FullTutorialMode.h @@ -0,0 +1,12 @@ +#pragma once +#include "TutorialMode.h" + +class FullTutorialMode : public TutorialMode +{ +public: + FullTutorialMode(int iPad, Minecraft *minecraft, ClientConnection *connection); + + virtual bool isImplemented() { return true; } + + virtual bool isTutorial(); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/HorseChoiceTask.cpp b/Minecraft.Client/Common/Tutorial/HorseChoiceTask.cpp new file mode 100644 index 00000000..e1d50fbf --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/HorseChoiceTask.cpp @@ -0,0 +1,43 @@ +#include "stdafx.h" + +#include + +#include "Minecraft.h" +#include "Tutorial.h" + +#include "..\Minecraft.World\EntityHorse.h" + +#include "HorseChoiceTask.h" + +HorseChoiceTask::HorseChoiceTask(Tutorial *tutorial, int iDescHorse, int iDescDonkey, int iDescMule, int iPromptId, + bool requiresUserInput, int iConfirmMapping, int iCancelMapping, + eTutorial_CompletionAction cancelAction, ETelemetryChallenges telemetryEvent) + + : ChoiceTask(tutorial, -1, iPromptId, requiresUserInput, iConfirmMapping, iCancelMapping, cancelAction, telemetryEvent) +{ + m_eHorseType = -1; + m_iDescMule = iDescMule; + m_iDescDonkey = iDescDonkey; + m_iDescHorse = iDescHorse; +} + +int HorseChoiceTask::getDescriptionId() +{ + switch (m_eHorseType) + { + case EntityHorse::TYPE_HORSE: return m_iDescHorse; + case EntityHorse::TYPE_DONKEY: return m_iDescDonkey; + case EntityHorse::TYPE_MULE: return m_iDescMule; + default: return -1; + } + return -1; +} + +void HorseChoiceTask::onLookAtEntity(shared_ptr entity) +{ + if ( (m_eHorseType < 0) && entity->instanceof(eTYPE_HORSE) ) + { + shared_ptr horse = dynamic_pointer_cast(entity); + if ( horse->isAdult() ) m_eHorseType = horse->getType(); + } +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/HorseChoiceTask.h b/Minecraft.Client/Common/Tutorial/HorseChoiceTask.h new file mode 100644 index 00000000..5130a7c7 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/HorseChoiceTask.h @@ -0,0 +1,23 @@ +#pragma once +using namespace std; + +#include "ChoiceTask.h" + + +// Same as choice task, but switches description based on horse type. +class HorseChoiceTask : public ChoiceTask +{ +protected: + int m_eHorseType; + + int m_iDescHorse, m_iDescDonkey, m_iDescMule; + +public: + HorseChoiceTask(Tutorial *tutorial, int iDescHorse, int iDescDonkey, int iDescMule, int iPromptId = -1, + bool requiresUserInput = false, int iConfirmMapping = 0, int iCancelMapping = 0, + eTutorial_CompletionAction cancelAction = e_Tutorial_Completion_None, ETelemetryChallenges telemetryEvent = eTelemetryChallenges_Unknown); + + virtual int getDescriptionId(); + + virtual void onLookAtEntity(shared_ptr entity); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/InfoTask.cpp b/Minecraft.Client/Common/Tutorial/InfoTask.cpp new file mode 100644 index 00000000..5330841f --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/InfoTask.cpp @@ -0,0 +1,137 @@ +#include "stdafx.h" +#include +#include +#include "..\..\Minecraft.h" +#include "..\..\MultiplayerLocalPlayer.h" +#include "Tutorial.h" +#include "TutorialConstraints.h" +#include "InfoTask.h" +#include "..\..\..\Minecraft.World\Material.h" + +InfoTask::InfoTask(Tutorial *tutorial, int descriptionId, int promptId /*= -1*/, bool requiresUserInput /*= false*/, + int iMapping /*= 0*/, ETelemetryChallenges telemetryEvent /*= eTelemetryTutorial_NoEvent*/) + : TutorialTask( tutorial, descriptionId, false, NULL, true, false, false ) +{ + if(requiresUserInput == true) + { + constraints.push_back( new InputConstraint( iMapping ) ); + } + completedMappings[iMapping]=false; + + m_promptId = promptId; + tutorial->addMessage( m_promptId ); + + m_eTelemetryEvent = telemetryEvent; +} + +bool InfoTask::isCompleted() +{ + if( bIsCompleted ) + return true; + + if( tutorial->m_hintDisplayed ) + return false; + + if( !bHasBeenActivated || !m_bShownForMinimumTime ) + return false; + + bool bAllComplete = true; + + Minecraft *pMinecraft = Minecraft::GetInstance(); + + // If the player is under water then allow all keypresses so they can jump out + if( pMinecraft->localplayers[tutorial->getPad()]->isUnderLiquid(Material::water) ) return false; + + if(ui.GetMenuDisplayed(tutorial->getPad())) + { + // If a menu is displayed, then we use the handleUIInput to complete the task + bAllComplete = true; + for(AUTO_VAR(it, completedMappings.begin()); it != completedMappings.end(); ++it) + { + bool current = (*it).second; + if(!current) + { + bAllComplete = false; + break; + } + } + } + else + { + int iCurrent=0; + + for(AUTO_VAR(it, completedMappings.begin()); it != completedMappings.end(); ++it) + { + bool current = (*it).second; + if(!current) + { + if( InputManager.GetValue(pMinecraft->player->GetXboxPad(), (*it).first) > 0 ) + { + (*it).second = true; + bAllComplete=true; + } + else + { + bAllComplete = false; + } + } + iCurrent++; + } + } + + if(bAllComplete==true) + { + sendTelemetry(); + enableConstraints(false, true); + } + bIsCompleted = bAllComplete; + return bAllComplete; +} + +int InfoTask::getPromptId() +{ + if( m_bShownForMinimumTime ) + return m_promptId; + else + return -1; +} + +void InfoTask::setAsCurrentTask(bool active /*= true*/) +{ + enableConstraints( active ); + TutorialTask::setAsCurrentTask(active); +} + +void InfoTask::handleUIInput(int iAction) +{ + if(bHasBeenActivated) + { + for(AUTO_VAR(it, completedMappings.begin()); it != completedMappings.end(); ++it) + { + if( iAction == (*it).first ) + { + (*it).second = true; + } + } + } +} + + +void InfoTask::sendTelemetry() +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + + if( m_eTelemetryEvent != eTelemetryChallenges_Unknown ) + { + bool firstPlay = true; + // We only store first play for some of the events + switch(m_eTelemetryEvent) + { + case eTelemetryTutorial_Complete: + firstPlay = !tutorial->getCompleted( eTutorial_Telemetry_Complete ); + tutorial->setCompleted( eTutorial_Telemetry_Complete ); + break; + }; + TelemetryManager->RecordEnemyKilledOrOvercome(pMinecraft->player->GetXboxPad(), 0, 0, 0, 0, 0, 0, m_eTelemetryEvent); + } +} diff --git a/Minecraft.Client/Common/Tutorial/InfoTask.h b/Minecraft.Client/Common/Tutorial/InfoTask.h new file mode 100644 index 00000000..e072038b --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/InfoTask.h @@ -0,0 +1,25 @@ +#pragma once +using namespace std; + +#include "TutorialTask.h" + +// Information messages +class InfoTask : public TutorialTask +{ +private: + unordered_map completedMappings; + + ETelemetryChallenges m_eTelemetryEvent; + + bool CompletionMaskIsValid(); +public: + InfoTask(Tutorial *tutorial, int descriptionId, int promptId = -1, bool requiresUserInput = false, int iMapping = 0, ETelemetryChallenges telemetryEvent = eTelemetryChallenges_Unknown); + virtual bool isCompleted(); + virtual int getPromptId(); + virtual void setAsCurrentTask(bool active = true); + virtual void handleUIInput(int iAction); + +private: + void sendTelemetry(); + +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/InputConstraint.cpp b/Minecraft.Client/Common/Tutorial/InputConstraint.cpp new file mode 100644 index 00000000..a26d3eb1 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/InputConstraint.cpp @@ -0,0 +1,18 @@ +#include "stdafx.h" +#include "InputConstraint.h" + +bool InputConstraint::isMappingConstrained(int iPad, int mapping) +{ + // If it's a menu button, then we ignore all inputs + if((m_inputMapping == mapping) || (mapping < ACTION_MAX_MENU)) + { + return true; + } + + // Otherwise see if they map to the same actual button + unsigned char layoutMapping = InputManager.GetJoypadMapVal( iPad ); + + // 4J HEG - Replaced the equivalance test with bitwise AND, important in some mapping configurations + // (e.g. when comparing two action map values and one has extra buttons mapped) + return (InputManager.GetGameJoypadMaps(layoutMapping,m_inputMapping) & InputManager.GetGameJoypadMaps(layoutMapping,mapping)) > 0; +} diff --git a/Minecraft.Client/Common/Tutorial/InputConstraint.h b/Minecraft.Client/Common/Tutorial/InputConstraint.h new file mode 100644 index 00000000..3d6bee61 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/InputConstraint.h @@ -0,0 +1,15 @@ +#pragma once + +#include "TutorialConstraint.h" + +class InputConstraint : public TutorialConstraint +{ +private: + int m_inputMapping; // Should be one of the EControllerActions +public: + virtual ConstraintType getType() { return e_ConstraintInput; } + + InputConstraint(int mapping) : TutorialConstraint(-1), m_inputMapping( mapping ) {} + + virtual bool isMappingConstrained(int iPad, int mapping); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/LookAtEntityHint.cpp b/Minecraft.Client/Common/Tutorial/LookAtEntityHint.cpp new file mode 100644 index 00000000..3b4680ce --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/LookAtEntityHint.cpp @@ -0,0 +1,25 @@ +#include "stdafx.h" +#include "Tutorial.h" +#include "LookAtEntityHint.h" + + +LookAtEntityHint::LookAtEntityHint(eTutorial_Hint id, Tutorial *tutorial, int descriptionId, int titleId, eINSTANCEOF type) + : TutorialHint(id, tutorial, descriptionId, e_Hint_LookAtEntity) +{ + m_type = type; + m_titleId = titleId; +} + +bool LookAtEntityHint::onLookAtEntity(eINSTANCEOF type) +{ + if(m_type == type) + { + // Display hint + Tutorial::PopupMessageDetails *message = new Tutorial::PopupMessageDetails(); + message->m_messageId = m_descriptionId; + message->m_titleId = m_titleId; + message->m_delay = true; + return m_tutorial->setMessage(this, message); + } + return false; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/LookAtEntityHint.h b/Minecraft.Client/Common/Tutorial/LookAtEntityHint.h new file mode 100644 index 00000000..99136691 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/LookAtEntityHint.h @@ -0,0 +1,20 @@ +#pragma once +using namespace std; + +#include "..\..\..\Minecraft.World\Class.h" +#include "TutorialHint.h" + +class ItemInstance; + +class LookAtEntityHint : public TutorialHint +{ +private: + eINSTANCEOF m_type; + int m_titleId; + +public: + LookAtEntityHint(eTutorial_Hint id, Tutorial *tutorial, int descriptionId, int titleId, eINSTANCEOF type); + ~LookAtEntityHint(); + + virtual bool onLookAtEntity(eINSTANCEOF type); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/LookAtTileHint.cpp b/Minecraft.Client/Common/Tutorial/LookAtTileHint.cpp new file mode 100644 index 00000000..c8723a84 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/LookAtTileHint.cpp @@ -0,0 +1,64 @@ +#include "stdafx.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.tile.h" +#include "Tutorial.h" +#include "LookAtTileHint.h" + + +LookAtTileHint::LookAtTileHint(eTutorial_Hint id, Tutorial *tutorial, int tiles[], unsigned int tilesLength, int iconOverride /*= -1*/, int iData /* = -1 */, int iDataOverride /*= -1*/) + : TutorialHint(id, tutorial, -1, e_Hint_LookAtTile) +{ + m_iTilesCount = tilesLength; + + m_iTiles= new int [m_iTilesCount]; + for(unsigned int i=0;i 0 && id < 256 && (m_iData == -1 || m_iData == iData) ) + { + bool itemFound = false; + for(unsigned int i=0;im_delay = true; + if( m_iconOverride >= 0 ) + { + message->m_icon = m_iconOverride; + } + else if(m_iconOverride == -2) + { + message->m_icon = TUTORIAL_NO_ICON; + } + else + { + message->m_icon = id; + } + + // 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); + } + } + return false; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/LookAtTileHint.h b/Minecraft.Client/Common/Tutorial/LookAtTileHint.h new file mode 100644 index 00000000..34ec1b95 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/LookAtTileHint.h @@ -0,0 +1,22 @@ +#pragma once +using namespace std; + +#include "TutorialHint.h" + +class ItemInstance; + +class LookAtTileHint : public TutorialHint +{ +private: + int *m_iTiles; + unsigned int m_iTilesCount; + int m_iconOverride; + int m_iData; + int m_iDataOverride; + +public: + LookAtTileHint(eTutorial_Hint id, Tutorial *tutorial, int tiles[], unsigned int tilesLength, int iconOverride = -1, int iData=-1, int iDataOverride = -1); + ~LookAtTileHint(); + + virtual bool onLookAt(int id, int iData=0); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/PickupTask.cpp b/Minecraft.Client/Common/Tutorial/PickupTask.cpp new file mode 100644 index 00000000..00bc9d1f --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/PickupTask.cpp @@ -0,0 +1,17 @@ +#include "stdafx.h" +#include "PickupTask.h" + +void PickupTask::onTake(shared_ptr item, unsigned int invItemCountAnyAux, unsigned int invItemCountThisAux) +{ + if(item->id == m_itemId) + { + if(m_auxValue == -1 && invItemCountAnyAux >= m_quantity) + { + bIsCompleted = true; + } + else if( m_auxValue == item->getAuxValue() && invItemCountThisAux >= m_quantity) + { + bIsCompleted = true; + } + } +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/PickupTask.h b/Minecraft.Client/Common/Tutorial/PickupTask.h new file mode 100644 index 00000000..68e1d479 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/PickupTask.h @@ -0,0 +1,26 @@ +#pragma once +using namespace std; +#include "TutorialTask.h" + +class ItemInstance; + +class PickupTask : public TutorialTask +{ +public: + PickupTask( int itemId, unsigned int quantity, int auxValue, + Tutorial *tutorial, int descriptionId, bool enablePreCompletion = true, vector *inConstraints = NULL, + bool bShowMinimumTime=false, bool bAllowFade=true, bool m_bTaskReminders=true ) + : TutorialTask(tutorial, descriptionId, enablePreCompletion, inConstraints, bShowMinimumTime, bAllowFade, m_bTaskReminders ), + m_itemId( itemId), + m_quantity( quantity ), + m_auxValue( auxValue ) + {} + + virtual bool isCompleted() { return bIsCompleted; } + virtual void onTake(shared_ptr item, unsigned int invItemCountAnyAux, unsigned int invItemCountThisAux); + +private: + int m_itemId; + unsigned int m_quantity; + int m_auxValue; +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/ProcedureCompoundTask.cpp b/Minecraft.Client/Common/Tutorial/ProcedureCompoundTask.cpp new file mode 100644 index 00000000..8603f765 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/ProcedureCompoundTask.cpp @@ -0,0 +1,263 @@ +#include "stdafx.h" +#include "ProcedureCompoundTask.h" + +ProcedureCompoundTask::~ProcedureCompoundTask() +{ + for(AUTO_VAR(it, m_taskSequence.begin()); it < m_taskSequence.end(); ++it) + { + delete (*it); + } +} + +void ProcedureCompoundTask::AddTask(TutorialTask *task) +{ + if(task != NULL) + { + m_taskSequence.push_back(task); + } +} + +int ProcedureCompoundTask::getDescriptionId() +{ + if(bIsCompleted) + return -1; + + // Return the id of the first task not completed + int descriptionId = -1; + AUTO_VAR(itEnd, m_taskSequence.end()); + for(AUTO_VAR(it, m_taskSequence.begin()); it < itEnd; ++it) + { + TutorialTask *task = *it; + if(!task->isCompleted()) + { + task->setAsCurrentTask(true); + descriptionId = task->getDescriptionId(); + break; + } + else if(task->getCompletionAction() == e_Tutorial_Completion_Complete_State) + { + bIsCompleted = true; + break; + } + } + return descriptionId; +} + +int ProcedureCompoundTask::getPromptId() +{ + if(bIsCompleted) + return -1; + + // Return the id of the first task not completed + int promptId = -1; + AUTO_VAR(itEnd, m_taskSequence.end()); + for(AUTO_VAR(it, m_taskSequence.begin()); it < itEnd; ++it) + { + TutorialTask *task = *it; + if(!task->isCompleted()) + { + promptId = task->getPromptId(); + break; + } + } + return promptId; +} + +bool ProcedureCompoundTask::isCompleted() +{ + // Return whether all tasks are completed + + bool allCompleted = true; + bool isCurrentTask = true; + AUTO_VAR(itEnd, m_taskSequence.end()); + for(AUTO_VAR(it, m_taskSequence.begin()); it < itEnd; ++it) + { + TutorialTask *task = *it; + + if(allCompleted && isCurrentTask) + { + if(task->isCompleted()) + { + if(task->getCompletionAction() == e_Tutorial_Completion_Complete_State) + { + allCompleted = true; + break; + } + } + else + { + task->setAsCurrentTask(true); + allCompleted = false; + isCurrentTask = false; + } + } + else if (!allCompleted) + { + task->setAsCurrentTask(false); + } + } + + if(allCompleted) + { + //Disable all constraints + itEnd = m_taskSequence.end(); + for(AUTO_VAR(it, m_taskSequence.begin()); it < itEnd; ++it) + { + TutorialTask *task = *it; + task->enableConstraints(false); + } + } + bIsCompleted = allCompleted; + return allCompleted; +} + +void ProcedureCompoundTask::onCrafted(shared_ptr item) +{ + AUTO_VAR(itEnd, m_taskSequence.end()); + for(AUTO_VAR(it, m_taskSequence.begin()); it < itEnd; ++it) + { + TutorialTask *task = *it; + task->onCrafted(item); + } +} + +void ProcedureCompoundTask::handleUIInput(int iAction) +{ + AUTO_VAR(itEnd, m_taskSequence.end()); + for(AUTO_VAR(it, m_taskSequence.begin()); it < itEnd; ++it) + { + TutorialTask *task = *it; + task->handleUIInput(iAction); + } +} + + +void ProcedureCompoundTask::setAsCurrentTask(bool active /*= true*/) +{ + bool allCompleted = true; + AUTO_VAR(itEnd, m_taskSequence.end()); + for(AUTO_VAR(it, m_taskSequence.begin()); it < itEnd; ++it) + { + TutorialTask *task = *it; + if(allCompleted && !task->isCompleted()) + { + task->setAsCurrentTask(true); + allCompleted = false; + } + else if (!allCompleted) + { + task->setAsCurrentTask(false); + } + } +} + +bool ProcedureCompoundTask::ShowMinimumTime() +{ + if(bIsCompleted) + return false; + + bool showMinimumTime = false; + AUTO_VAR(itEnd, m_taskSequence.end()); + for(AUTO_VAR(it, m_taskSequence.begin()); it < itEnd; ++it) + { + TutorialTask *task = *it; + if(!task->isCompleted()) + { + showMinimumTime = task->ShowMinimumTime(); + break; + } + } + return showMinimumTime; +} + +bool ProcedureCompoundTask::hasBeenActivated() +{ + if(bIsCompleted) + return true; + + bool hasBeenActivated = false; + AUTO_VAR(itEnd, m_taskSequence.end()); + for(AUTO_VAR(it, m_taskSequence.begin()); it < itEnd; ++it) + { + TutorialTask *task = *it; + if(!task->isCompleted()) + { + hasBeenActivated = task->hasBeenActivated(); + break; + } + } + return hasBeenActivated; +} + +void ProcedureCompoundTask::setShownForMinimumTime() +{ + AUTO_VAR(itEnd, m_taskSequence.end()); + for(AUTO_VAR(it, m_taskSequence.begin()); it < itEnd; ++it) + { + TutorialTask *task = *it; + if(!task->isCompleted()) + { + task->setShownForMinimumTime(); + break; + } + } +} + +bool ProcedureCompoundTask::AllowFade() +{ + if(bIsCompleted) + return true; + + bool allowFade = true; + AUTO_VAR(itEnd, m_taskSequence.end()); + for(AUTO_VAR(it, m_taskSequence.begin()); it < itEnd; ++it) + { + TutorialTask *task = *it; + if(!task->isCompleted()) + { + allowFade = task->AllowFade(); + break; + } + } + return allowFade; +} + +void ProcedureCompoundTask::useItemOn(Level *level, shared_ptr item, int x, int y, int z,bool bTestUseOnly) +{ + AUTO_VAR(itEnd, m_taskSequence.end()); + for(AUTO_VAR(it, m_taskSequence.begin()); it < itEnd; ++it) + { + TutorialTask *task = *it; + task->useItemOn(level, item, x, y, z, bTestUseOnly); + } +} + +void ProcedureCompoundTask::useItem(shared_ptr item, bool bTestUseOnly) +{ + AUTO_VAR(itEnd, m_taskSequence.end()); + for(AUTO_VAR(it, m_taskSequence.begin()); it < itEnd; ++it) + { + TutorialTask *task = *it; + task->useItem(item, bTestUseOnly); + } +} + +void ProcedureCompoundTask::onTake(shared_ptr item, unsigned int invItemCountAnyAux, unsigned int invItemCountThisAux) +{ + AUTO_VAR(itEnd, m_taskSequence.end()); + for(AUTO_VAR(it, m_taskSequence.begin()); it < itEnd; ++it) + { + TutorialTask *task = *it; + task->onTake(item, invItemCountAnyAux, invItemCountThisAux); + } +} + +void ProcedureCompoundTask::onStateChange(eTutorial_State newState) +{ + AUTO_VAR(itEnd, m_taskSequence.end()); + for(AUTO_VAR(it, m_taskSequence.begin()); it < itEnd; ++it) + { + TutorialTask *task = *it; + task->onStateChange(newState); + } +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/ProcedureCompoundTask.h b/Minecraft.Client/Common/Tutorial/ProcedureCompoundTask.h new file mode 100644 index 00000000..36b32798 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/ProcedureCompoundTask.h @@ -0,0 +1,36 @@ +#pragma once + +#include "TutorialTask.h" + +// A tutorial task that requires each of the task to be completed in order until the last one is complete. +// If an earlier task that was complete is now not complete then it's hint should be shown. +class ProcedureCompoundTask : public TutorialTask +{ +public: + ProcedureCompoundTask(Tutorial *tutorial ) + : TutorialTask(tutorial, -1, false, NULL, false, true, false ) + {} + + ~ProcedureCompoundTask(); + + void AddTask(TutorialTask *task); + + virtual int getDescriptionId(); + virtual int getPromptId(); + virtual bool isCompleted(); + virtual void onCrafted(shared_ptr item); + virtual void handleUIInput(int iAction); + virtual void setAsCurrentTask(bool active = true); + virtual bool ShowMinimumTime(); + virtual bool hasBeenActivated(); + virtual void setShownForMinimumTime(); + virtual bool AllowFade(); + + virtual void useItemOn(Level *level, shared_ptr item, int x, int y, int z, bool bTestUseOnly=false); + virtual void useItem(shared_ptr item, bool bTestUseOnly=false); + virtual void onTake(shared_ptr item, unsigned int invItemCountAnyAux, unsigned int invItemCountThisAux); + virtual void onStateChange(eTutorial_State newState); + +private: + vector m_taskSequence; +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/ProgressFlagTask.cpp b/Minecraft.Client/Common/Tutorial/ProgressFlagTask.cpp new file mode 100644 index 00000000..ea224ca3 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/ProgressFlagTask.cpp @@ -0,0 +1,17 @@ +#include "stdafx.h" +#include "ProgressFlagTask.h" + +bool ProgressFlagTask::isCompleted() +{ + switch( m_type ) + { + case e_Progress_Set_Flag: + (*flags) |= m_mask; + bIsCompleted = true; + break; + case e_Progress_Flag_On: + bIsCompleted = ((*flags) & m_mask) == m_mask; + break; + } + return bIsCompleted; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/ProgressFlagTask.h b/Minecraft.Client/Common/Tutorial/ProgressFlagTask.h new file mode 100644 index 00000000..b96e1bc0 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/ProgressFlagTask.h @@ -0,0 +1,25 @@ +#pragma once +using namespace std; +#include "Tutorial.h" +#include "TutorialTask.h" + +class ProgressFlagTask : public TutorialTask +{ +public: + enum EProgressFlagType + { + e_Progress_Set_Flag, + e_Progress_Flag_On, + }; +private: + char *flags; // Not a member of this object + char m_mask; + EProgressFlagType m_type; +public: + ProgressFlagTask(char *flags, char mask, EProgressFlagType type, Tutorial *tutorial ) : + TutorialTask(tutorial, -1, false, NULL ), + flags( flags ), m_mask( mask ), m_type( type ) + {} + + virtual bool isCompleted(); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/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/StatTask.cpp b/Minecraft.Client/Common/Tutorial/StatTask.cpp new file mode 100644 index 00000000..5f8b215e --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/StatTask.cpp @@ -0,0 +1,25 @@ +#include "stdafx.h" +#include "..\..\Minecraft.h" +#include "..\..\LocalPlayer.h" +#include "..\..\StatsCounter.h" +#include "..\..\..\Minecraft.World\net.minecraft.stats.h" +#include "StatTask.h" + +StatTask::StatTask(Tutorial *tutorial, int descriptionId, bool enablePreCompletion, Stat *stat, int variance /*= 1*/) + : TutorialTask( tutorial, descriptionId, enablePreCompletion, NULL ) +{ + this->stat = stat; + + Minecraft *minecraft = Minecraft::GetInstance(); + targetValue = minecraft->stats[ProfileManager.GetPrimaryPad()]->getTotalValue( stat ) + variance; +} + +bool StatTask::isCompleted() +{ + if( bIsCompleted ) + return true; + + Minecraft *minecraft = Minecraft::GetInstance(); + bIsCompleted = minecraft->stats[ProfileManager.GetPrimaryPad()]->getTotalValue( stat ) >= (unsigned int)targetValue; + return bIsCompleted; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/StatTask.h b/Minecraft.Client/Common/Tutorial/StatTask.h new file mode 100644 index 00000000..ba38f00a --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/StatTask.h @@ -0,0 +1,18 @@ +#pragma once +using namespace std; + +#include "TutorialTask.h" + +class Stat; + +// 4J Stu - Tutorial tasks that can use the current stat trackin code. This is things like blocks mined/items crafted. +class StatTask : public TutorialTask +{ +private: + Stat *stat; + int targetValue; + +public: + StatTask(Tutorial *tutorial, int descriptionId, bool enablePreCompletion, Stat *stat, int variance = 1); + virtual bool isCompleted(); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/StateChangeTask.h b/Minecraft.Client/Common/Tutorial/StateChangeTask.h new file mode 100644 index 00000000..fb9e6396 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/StateChangeTask.h @@ -0,0 +1,27 @@ +#pragma once +using namespace std; +#include "Tutorial.h" +#include "TutorialTask.h" + +class StateChangeTask : public TutorialTask +{ +private: + eTutorial_State m_state; +public: + StateChangeTask(eTutorial_State state, + Tutorial *tutorial, int descriptionId = -1, bool enablePreCompletion = false, vector *inConstraints = NULL, + bool bShowMinimumTime=false, bool bAllowFade=true, bool m_bTaskReminders=true ) : + TutorialTask(tutorial, descriptionId, enablePreCompletion, inConstraints, bShowMinimumTime, bAllowFade, m_bTaskReminders ), + m_state( state ) + {} + + virtual bool isCompleted() { return bIsCompleted; } + + virtual void onStateChange(eTutorial_State newState) + { + if(newState == m_state) + { + bIsCompleted = true; + } + } +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/TakeItemHint.cpp b/Minecraft.Client/Common/Tutorial/TakeItemHint.cpp new file mode 100644 index 00000000..a1a5c37a --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/TakeItemHint.cpp @@ -0,0 +1,45 @@ +#include "stdafx.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.tile.h" +#include "Tutorial.h" +#include "TakeItemHint.h" + + +TakeItemHint::TakeItemHint(eTutorial_Hint id, Tutorial *tutorial, int items[], unsigned int itemsLength) + : TutorialHint(id, tutorial, -1, e_Hint_TakeItem) +{ + m_iItemsCount = itemsLength; + + m_iItems= new int [m_iItemsCount]; + for(unsigned int i=0;i item) +{ + if(item != NULL) + { + bool itemFound = false; + for(unsigned int i=0;iid == m_iItems[i]) + { + itemFound = true; + break; + } + } + if(itemFound) + { + // Display hint + Tutorial::PopupMessageDetails *message = new Tutorial::PopupMessageDetails(); + message->m_messageId = item->getUseDescriptionId(); + message->m_titleId = item->getDescriptionId(); + message->m_icon = item->id; + message->m_delay = true; + return m_tutorial->setMessage(this, message); + } + } + return false; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/TakeItemHint.h b/Minecraft.Client/Common/Tutorial/TakeItemHint.h new file mode 100644 index 00000000..f001d4c7 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/TakeItemHint.h @@ -0,0 +1,19 @@ +#pragma once +using namespace std; + +#include "TutorialHint.h" + +class ItemInstance; + +class TakeItemHint : public TutorialHint +{ +private: + int *m_iItems; + unsigned int m_iItemsCount; + +public: + TakeItemHint(eTutorial_Hint id, Tutorial *tutorial, int items[], unsigned int itemsLength); + ~TakeItemHint(); + + virtual bool onTake( shared_ptr item ); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/Tutorial b/Minecraft.Client/Common/Tutorial/Tutorial new file mode 100644 index 00000000..db585813 Binary files /dev/null and b/Minecraft.Client/Common/Tutorial/Tutorial differ diff --git a/Minecraft.Client/Common/Tutorial/Tutorial.cpp b/Minecraft.Client/Common/Tutorial/Tutorial.cpp new file mode 100644 index 00000000..057e2171 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/Tutorial.cpp @@ -0,0 +1,2332 @@ +#include "stdafx.h" +#include "..\..\..\Minecraft.World\net.minecraft.stats.h" +#include "..\..\LocalPlayer.h" +#include "..\..\..\Minecraft.World\Entity.h" +#include "..\..\..\Minecraft.World\Level.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.entity.player.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.tile.h" +#include "..\..\MinecraftServer.h" +#include "..\..\Minecraft.h" +#include "..\..\MultiPlayerLocalPlayer.h" +#include "..\..\MultiPlayerLevel.h" +#include "..\..\SurvivalMode.h" +#include "Tutorial.h" +#include "TutorialMessage.h" +#include "TutorialTasks.h" +#include "TutorialConstraints.h" +#include "TutorialHints.h" + +vector Tutorial::s_completableTasks; + + +int Tutorial::m_iTutorialHintDelayTime = 14000; +int Tutorial::m_iTutorialDisplayMessageTime = 7000; +int Tutorial::m_iTutorialMinimumDisplayMessageTime = 2000; +int Tutorial::m_iTutorialExtraReminderTime = 13000; +int Tutorial::m_iTutorialReminderTime = m_iTutorialDisplayMessageTime + m_iTutorialExtraReminderTime; +int Tutorial::m_iTutorialConstraintDelayRemoveTicks = 15; +int Tutorial::m_iTutorialFreezeTimeValue = 8000; + +bool Tutorial::PopupMessageDetails::isSameContent(PopupMessageDetails *other) +{ + if(other == NULL) return false; + + bool textTheSame = (m_messageId == other->m_messageId) && (m_messageString.compare(other->m_messageString) == 0); + bool titleTheSame = (m_titleId == other->m_titleId) && (m_titleString.compare(other->m_titleString) == 0); + bool promptTheSame = (m_promptId == other->m_promptId) && (m_promptString.compare(other->m_promptString) == 0); + return textTheSame && titleTheSame && promptTheSame; +} + +void Tutorial::staticCtor() +{ + // + /* + ***** + ***** + THE ORDERING OF THESE SHOULD NOT CHANGE - Although the ordering may not be totally logical due to the order tasks were added, these map + to bits in the profile data in this order. New tasks/hints should be added at the end. + ***** + ***** + */ + s_completableTasks.push_back( e_Tutorial_State_Inventory_Menu ); + s_completableTasks.push_back( e_Tutorial_State_2x2Crafting_Menu ); + s_completableTasks.push_back( e_Tutorial_State_3x3Crafting_Menu ); + s_completableTasks.push_back( e_Tutorial_State_Furnace_Menu ); + + s_completableTasks.push_back( e_Tutorial_State_Riding_Minecart ); + s_completableTasks.push_back( e_Tutorial_State_Riding_Boat ); + s_completableTasks.push_back( e_Tutorial_State_Fishing ); + s_completableTasks.push_back( e_Tutorial_State_Bed ); + + s_completableTasks.push_back( e_Tutorial_State_Container_Menu ); + s_completableTasks.push_back( e_Tutorial_State_Trap_Menu ); + s_completableTasks.push_back( e_Tutorial_State_Redstone_And_Piston ); + s_completableTasks.push_back( e_Tutorial_State_Portal ); + s_completableTasks.push_back( e_Tutorial_State_Creative_Inventory_Menu ); + s_completableTasks.push_back( e_Tutorial_State_Food_Bar ); + s_completableTasks.push_back( e_Tutorial_State_CreativeMode ); + s_completableTasks.push_back( e_Tutorial_State_Brewing ); + s_completableTasks.push_back( e_Tutorial_State_Brewing_Menu ); + s_completableTasks.push_back( e_Tutorial_State_Enchanting ); + + s_completableTasks.push_back( e_Tutorial_Hint_Hold_To_Mine ); + s_completableTasks.push_back( e_Tutorial_Hint_Tool_Damaged ); + s_completableTasks.push_back( e_Tutorial_Hint_Swim_Up ); + + s_completableTasks.push_back( e_Tutorial_Hint_Unused_2 ); + s_completableTasks.push_back( e_Tutorial_Hint_Unused_3 ); + s_completableTasks.push_back( e_Tutorial_Hint_Unused_4 ); + s_completableTasks.push_back( e_Tutorial_Hint_Unused_5 ); + s_completableTasks.push_back( e_Tutorial_Hint_Unused_6 ); + s_completableTasks.push_back( e_Tutorial_Hint_Unused_7 ); + s_completableTasks.push_back( e_Tutorial_Hint_Unused_8 ); + s_completableTasks.push_back( e_Tutorial_Hint_Unused_9 ); + s_completableTasks.push_back( e_Tutorial_Hint_Unused_10 ); + + s_completableTasks.push_back( e_Tutorial_Hint_Rock ); + s_completableTasks.push_back( e_Tutorial_Hint_Stone ); + s_completableTasks.push_back( e_Tutorial_Hint_Planks ); + s_completableTasks.push_back( e_Tutorial_Hint_Sapling ); + s_completableTasks.push_back( e_Tutorial_Hint_Unbreakable ); + s_completableTasks.push_back( e_Tutorial_Hint_Water ); + s_completableTasks.push_back( e_Tutorial_Hint_Lava ); + s_completableTasks.push_back( e_Tutorial_Hint_Sand ); + s_completableTasks.push_back( e_Tutorial_Hint_Gravel ); + s_completableTasks.push_back( e_Tutorial_Hint_Gold_Ore ); + s_completableTasks.push_back( e_Tutorial_Hint_Iron_Ore ); + s_completableTasks.push_back( e_Tutorial_Hint_Coal_Ore ); + s_completableTasks.push_back( e_Tutorial_Hint_Tree_Trunk ); + s_completableTasks.push_back( e_Tutorial_Hint_Glass ); + s_completableTasks.push_back( e_Tutorial_Hint_Leaves ); + s_completableTasks.push_back( e_Tutorial_Hint_Lapis_Ore ); + s_completableTasks.push_back( e_Tutorial_Hint_Lapis_Block ); + s_completableTasks.push_back( e_Tutorial_Hint_Dispenser ); + s_completableTasks.push_back( e_Tutorial_Hint_Sandstone ); + s_completableTasks.push_back( e_Tutorial_Hint_Note_Block ); + s_completableTasks.push_back( e_Tutorial_Hint_Powered_Rail ); + s_completableTasks.push_back( e_Tutorial_Hint_Detector_Rail ); + s_completableTasks.push_back( e_Tutorial_Hint_Tall_Grass ); + s_completableTasks.push_back( e_Tutorial_Hint_Wool ); + s_completableTasks.push_back( e_Tutorial_Hint_Flower ); + s_completableTasks.push_back( e_Tutorial_Hint_Mushroom ); + s_completableTasks.push_back( e_Tutorial_Hint_Gold_Block ); + s_completableTasks.push_back( e_Tutorial_Hint_Iron_Block ); + s_completableTasks.push_back( e_Tutorial_Hint_Stone_Slab ); + s_completableTasks.push_back( e_Tutorial_Hint_Red_Brick ); + s_completableTasks.push_back( e_Tutorial_Hint_Tnt ); + s_completableTasks.push_back( e_Tutorial_Hint_Bookshelf ); + s_completableTasks.push_back( e_Tutorial_Hint_Moss_Stone ); + s_completableTasks.push_back( e_Tutorial_Hint_Obsidian ); + s_completableTasks.push_back( e_Tutorial_Hint_Torch ); + s_completableTasks.push_back( e_Tutorial_Hint_MobSpawner ); + s_completableTasks.push_back( e_Tutorial_Hint_Chest ); + s_completableTasks.push_back( e_Tutorial_Hint_Redstone ); + s_completableTasks.push_back( e_Tutorial_Hint_Diamond_Ore ); + s_completableTasks.push_back( e_Tutorial_Hint_Diamond_Block ); + s_completableTasks.push_back( e_Tutorial_Hint_Crafting_Table ); + s_completableTasks.push_back( e_Tutorial_Hint_Crops ); + s_completableTasks.push_back( e_Tutorial_Hint_Farmland ); + s_completableTasks.push_back( e_Tutorial_Hint_Furnace ); + s_completableTasks.push_back( e_Tutorial_Hint_Sign ); + s_completableTasks.push_back( e_Tutorial_Hint_Door_Wood ); + s_completableTasks.push_back( e_Tutorial_Hint_Ladder ); + s_completableTasks.push_back( e_Tutorial_Hint_Rail ); + s_completableTasks.push_back( e_Tutorial_Hint_Stairs_Stone ); + s_completableTasks.push_back( e_Tutorial_Hint_Lever ); + s_completableTasks.push_back( e_Tutorial_Hint_PressurePlate ); + s_completableTasks.push_back( e_Tutorial_Hint_Door_Iron ); + s_completableTasks.push_back( e_Tutorial_Hint_Redstone_Ore ); + s_completableTasks.push_back( e_Tutorial_Hint_Redstone_Torch ); + s_completableTasks.push_back( e_Tutorial_Hint_Button ); + s_completableTasks.push_back( e_Tutorial_Hint_Snow ); + s_completableTasks.push_back( e_Tutorial_Hint_Ice ); + s_completableTasks.push_back( e_Tutorial_Hint_Cactus ); + s_completableTasks.push_back( e_Tutorial_Hint_Clay ); + s_completableTasks.push_back( e_Tutorial_Hint_Sugarcane ); + s_completableTasks.push_back( e_Tutorial_Hint_Record_Player ); + s_completableTasks.push_back( e_Tutorial_Hint_Pumpkin ); + s_completableTasks.push_back( e_Tutorial_Hint_Hell_Rock ); + s_completableTasks.push_back( e_Tutorial_Hint_Hell_Sand ); + s_completableTasks.push_back( e_Tutorial_Hint_Glowstone ); + s_completableTasks.push_back( e_Tutorial_Hint_Portal ); + s_completableTasks.push_back( e_Tutorial_Hint_Pumpkin_Lit ); + s_completableTasks.push_back( e_Tutorial_Hint_Cake ); + s_completableTasks.push_back( e_Tutorial_Hint_Redstone_Repeater ); + s_completableTasks.push_back( e_Tutorial_Hint_Trapdoor ); + s_completableTasks.push_back( e_Tutorial_Hint_Piston ); + s_completableTasks.push_back( e_Tutorial_Hint_Sticky_Piston ); + s_completableTasks.push_back( e_Tutorial_Hint_Monster_Stone_Egg ); + s_completableTasks.push_back( e_Tutorial_Hint_Stone_Brick_Smooth ); + s_completableTasks.push_back( e_Tutorial_Hint_Huge_Mushroom ); + s_completableTasks.push_back( e_Tutorial_Hint_Iron_Fence ); + s_completableTasks.push_back( e_Tutorial_Hint_Thin_Glass ); + s_completableTasks.push_back( e_Tutorial_Hint_Melon ); + s_completableTasks.push_back( e_Tutorial_Hint_Vine ); + s_completableTasks.push_back( e_Tutorial_Hint_Fence_Gate ); + s_completableTasks.push_back( e_Tutorial_Hint_Mycel ); + s_completableTasks.push_back( e_Tutorial_Hint_Water_Lily ); + s_completableTasks.push_back( e_Tutorial_Hint_Nether_Brick ); + s_completableTasks.push_back( e_Tutorial_Hint_Nether_Fence ); + s_completableTasks.push_back( e_Tutorial_Hint_Nether_Stalk ); + s_completableTasks.push_back( e_Tutorial_Hint_Enchant_Table ); + s_completableTasks.push_back( e_Tutorial_Hint_Brewing_Stand ); + s_completableTasks.push_back( e_Tutorial_Hint_Cauldron ); + s_completableTasks.push_back( e_Tutorial_Hint_End_Portal ); + s_completableTasks.push_back( e_Tutorial_Hint_End_Portal_Frame ); + + s_completableTasks.push_back( e_Tutorial_Hint_Squid ); + s_completableTasks.push_back( e_Tutorial_Hint_Cow ); + s_completableTasks.push_back( e_Tutorial_Hint_Sheep ); + s_completableTasks.push_back( e_Tutorial_Hint_Chicken ); + s_completableTasks.push_back( e_Tutorial_Hint_Pig ); + s_completableTasks.push_back( e_Tutorial_Hint_Wolf ); + s_completableTasks.push_back( e_Tutorial_Hint_Creeper ); + s_completableTasks.push_back( e_Tutorial_Hint_Skeleton ); + s_completableTasks.push_back( e_Tutorial_Hint_Spider ); + s_completableTasks.push_back( e_Tutorial_Hint_Zombie ); + s_completableTasks.push_back( e_Tutorial_Hint_Pig_Zombie ); + s_completableTasks.push_back( e_Tutorial_Hint_Ghast ); + s_completableTasks.push_back( e_Tutorial_Hint_Slime ); + s_completableTasks.push_back( e_Tutorial_Hint_Enderman ); + s_completableTasks.push_back( e_Tutorial_Hint_Silverfish ); + s_completableTasks.push_back( e_Tutorial_Hint_Cave_Spider ); + s_completableTasks.push_back( e_Tutorial_Hint_MushroomCow ); + s_completableTasks.push_back( e_Tutorial_Hint_SnowMan ); + s_completableTasks.push_back( e_Tutorial_Hint_IronGolem ); + s_completableTasks.push_back( e_Tutorial_Hint_EnderDragon ); + s_completableTasks.push_back( e_Tutorial_Hint_Blaze ); + s_completableTasks.push_back( e_Tutorial_Hint_Lava_Slime ); + + s_completableTasks.push_back( e_Tutorial_Hint_Ozelot ); + s_completableTasks.push_back( e_Tutorial_Hint_Villager ); + + s_completableTasks.push_back( e_Tutorial_Hint_Item_Shovel ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Hatchet ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Pickaxe ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Flint_And_Steel ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Apple ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Bow ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Arrow ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Coal ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Diamond ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Iron_Ingot ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Gold_Ingot ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Sword ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Stick ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Bowl ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Mushroom_Stew ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_String ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Feather ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Sulphur ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Hoe ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Seeds ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Wheat ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Bread ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Helmet ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Chestplate ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Leggings ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Boots ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Flint ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Porkchop_Raw ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Porkchop_Cooked ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Painting ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Apple_Gold ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Sign ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Door_Wood ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Bucket_Empty ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Bucket_Water ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Bucket_Lava ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Minecart ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Saddle ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Door_Iron ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Redstone ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Snowball ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Boat ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Leather ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Milk ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Brick ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Clay ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Reeds ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Paper ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Book ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Slimeball ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Minecart_Chest ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Minecart_Furnace ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Egg ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Compass ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Clock ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Yellow_Dust ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Fish_Raw ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Fish_Cooked ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Dye_Powder ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Bone ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Sugar ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Cake ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Diode ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Cookie ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Map ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Record ); + + s_completableTasks.push_back( e_Tutorial_Hint_White_Stone ); + s_completableTasks.push_back( e_Tutorial_Hint_Dragon_Egg ); + s_completableTasks.push_back( e_Tutorial_Hint_RedstoneLamp ); + s_completableTasks.push_back( e_Tutorial_Hint_Cocoa); + + s_completableTasks.push_back( e_Tutorial_Hint_EmeraldOre ); + s_completableTasks.push_back( e_Tutorial_Hint_EmeraldBlock ); + s_completableTasks.push_back( e_Tutorial_Hint_EnderChest ); + s_completableTasks.push_back( e_Tutorial_Hint_TripwireSource ); + s_completableTasks.push_back( e_Tutorial_Hint_Tripwire ); + s_completableTasks.push_back( e_Tutorial_Hint_CobblestoneWall ); + s_completableTasks.push_back( e_Tutorial_Hint_Flowerpot ); + s_completableTasks.push_back( e_Tutorial_Hint_Anvil ); + s_completableTasks.push_back( e_Tutorial_Hint_QuartzOre ); + s_completableTasks.push_back( e_Tutorial_Hint_QuartzBlock ); + s_completableTasks.push_back( e_Tutorial_Hint_WoolCarpet ); + + s_completableTasks.push_back( e_Tutorial_Hint_Potato ); + s_completableTasks.push_back( e_Tutorial_Hint_Carrot ); + + s_completableTasks.push_back( e_Tutorial_Hint_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 ); + s_completableTasks.push_back( eTutorial_Telemetry_Complete ); + + s_completableTasks.push_back( eTutorial_Telemetry_Unused_1 ); + s_completableTasks.push_back( eTutorial_Telemetry_Unused_2 ); + s_completableTasks.push_back( eTutorial_Telemetry_Unused_3 ); + s_completableTasks.push_back( eTutorial_Telemetry_Unused_4 ); + s_completableTasks.push_back( eTutorial_Telemetry_Unused_5 ); + s_completableTasks.push_back( eTutorial_Telemetry_Unused_6 ); + s_completableTasks.push_back( eTutorial_Telemetry_Unused_7 ); + s_completableTasks.push_back( eTutorial_Telemetry_Unused_8 ); + s_completableTasks.push_back( eTutorial_Telemetry_Unused_9 ); + s_completableTasks.push_back( eTutorial_Telemetry_Unused_10 ); + + s_completableTasks.push_back( e_Tutorial_State_Enchanting_Menu ); + s_completableTasks.push_back( e_Tutorial_State_Farming ); + s_completableTasks.push_back( e_Tutorial_State_Breeding ); + s_completableTasks.push_back( e_Tutorial_State_Golem ); + s_completableTasks.push_back( e_Tutorial_State_Trading ); + s_completableTasks.push_back( e_Tutorial_State_Trading_Menu ); + s_completableTasks.push_back( e_Tutorial_State_Anvil ); + s_completableTasks.push_back( e_Tutorial_State_Anvil_Menu ); + s_completableTasks.push_back( e_Tutorial_State_Enderchests ); + s_completableTasks.push_back( e_Tutorial_State_Horse_Menu ); + s_completableTasks.push_back( e_Tutorial_State_Hopper_Menu ); + + s_completableTasks.push_back( e_Tutorial_Hint_Wither ); + s_completableTasks.push_back( e_Tutorial_Hint_Witch ); + s_completableTasks.push_back( e_Tutorial_Hint_Bat ); + s_completableTasks.push_back( e_Tutorial_Hint_Horse ); + + s_completableTasks.push_back( e_Tutorial_Hint_RedstoneBlock ); + s_completableTasks.push_back( e_Tutorial_Hint_DaylightDetector ); + s_completableTasks.push_back( e_Tutorial_Hint_Dropper ); + s_completableTasks.push_back( e_Tutorial_Hint_Hopper ); + s_completableTasks.push_back( e_Tutorial_Hint_Comparator ); + s_completableTasks.push_back( e_Tutorial_Hint_ChestTrap ); + s_completableTasks.push_back( e_Tutorial_Hint_HayBlock ); + s_completableTasks.push_back( e_Tutorial_Hint_ClayHardened ); + s_completableTasks.push_back( e_Tutorial_Hint_ClayHardenedColored ); + s_completableTasks.push_back( e_Tutorial_Hint_CoalBlock ); + + s_completableTasks.push_back( e_Tutorial_State_Beacon_Menu ); + s_completableTasks.push_back( e_Tutorial_State_Fireworks_Menu ); + s_completableTasks.push_back( e_Tutorial_State_Horse ); + s_completableTasks.push_back( e_Tutorial_State_Hopper ); + s_completableTasks.push_back( e_Tutorial_State_Beacon ); + s_completableTasks.push_back( e_Tutorial_State_Fireworks ); + + if( s_completableTasks.size() > TUTORIAL_PROFILE_STORAGE_BITS ) + { + app.DebugPrintf("Warning: Too many tutorial completable tasks added, not enough bits allocated to stored them in the profile data"); + assert(false); + } +} + +Tutorial::Tutorial(int iPad, bool isFullTutorial /*= false*/) : m_iPad( iPad ) +{ + m_isFullTutorial = isFullTutorial; + m_fullTutorialComplete = false; + m_allTutorialsComplete = false; + hasRequestedUI = false; + uiTempDisabled = false; + m_hintDisplayed = false; + m_freezeTime = false; + m_timeFrozen = false; + m_UIScene = NULL; + m_allowShow = true; + m_bHasTickedOnce = false; + m_firstTickTime = 0; + + m_lastMessage = NULL; + + lastMessageTime = 0; + m_iTaskReminders = 0; + m_lastMessageState = e_Tutorial_State_Gameplay; + + m_CurrentState = e_Tutorial_State_Gameplay; + m_hasStateChanged = false; +#ifdef _XBOX + m_hTutorialScene=NULL; +#endif + + for(unsigned int i = 0; i < e_Tutorial_State_Max; ++i) + { + currentTask[i] = NULL; + currentFailedConstraint[i] = NULL; + } + + // DEFAULT TASKS THAT ALL TUTORIALS SHARE + /* + * + * + * GAMEPLAY + * + */ + + if(!isHintCompleted(e_Tutorial_Hint_Hold_To_Mine)) addHint(e_Tutorial_State_Gameplay, new TutorialHint(e_Tutorial_Hint_Hold_To_Mine, this, IDS_TUTORIAL_HINT_HOLD_TO_MINE, TutorialHint::e_Hint_HoldToMine) ); + if(!isHintCompleted(e_Tutorial_Hint_Tool_Damaged)) addHint(e_Tutorial_State_Gameplay, new TutorialHint(e_Tutorial_Hint_Tool_Damaged, this, IDS_TUTORIAL_HINT_TOOL_DAMAGED, TutorialHint::e_Hint_ToolDamaged) ); + if(!isHintCompleted(e_Tutorial_Hint_Swim_Up)) addHint(e_Tutorial_State_Gameplay, new TutorialHint(e_Tutorial_Hint_Swim_Up, this, IDS_TUTORIAL_HINT_SWIM_UP, TutorialHint::e_Hint_SwimUp) ); + + /* + * TILE HINTS + */ + int rockItems[] = {Tile::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::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}; + if(!isHintCompleted(e_Tutorial_Hint_Planks)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Planks, this, plankItems, 1 ) ); + + int saplingItems[] = {Tile::sapling_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Sapling)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Sapling, this, saplingItems, 1 ) ); + + int unbreakableItems[] = {Tile::unbreakable_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Unbreakable)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Unbreakable, this, unbreakableItems, 1 ) ); + + int waterItems[] = {Tile::water_Id, Tile::calmWater_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Water)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Water, this, waterItems, 2 ) ); + + int lavaItems[] = {Tile::lava_Id, Tile::calmLava_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Lava)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Lava, this, lavaItems, 2 ) ); + + int sandItems[] = {Tile::sand_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Sand)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Sand, this, sandItems, 1 ) ); + + int gravelItems[] = {Tile::gravel_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Gravel)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Gravel, this, gravelItems, 1 ) ); + + int goldOreItems[] = {Tile::goldOre_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Gold_Ore)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Gold_Ore, this, goldOreItems, 1 ) ); + + int ironOreItems[] = {Tile::ironOre_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Iron_Ore)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Iron_Ore, this, ironOreItems, 1 ) ); + + int coalOreItems[] = {Tile::coalOre_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Coal_Ore)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Coal_Ore, this, coalOreItems, 1 ) ); + + int treeTrunkItems[] = {Tile::treeTrunk_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Tree_Trunk)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Tree_Trunk, this, treeTrunkItems, 1 ) ); + + int leavesItems[] = {Tile::leaves_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Leaves)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Leaves, this, leavesItems, 1 ) ); + + int glassItems[] = {Tile::glass_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Glass)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Glass, this, glassItems, 1 ) ); + + int lapisOreItems[] = {Tile::lapisOre_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Lapis_Ore)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Lapis_Ore, this, lapisOreItems, 1 ) ); + + int lapisBlockItems[] = {Tile::lapisBlock_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Lapis_Block)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Lapis_Block, this, lapisBlockItems, 1 ) ); + + int dispenserItems[] = {Tile::dispenser_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Dispenser)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Dispenser, this, dispenserItems, 1 ) ); + + int sandstoneItems[] = {Tile::sandStone_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Sandstone)) + { + addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Sandstone, this, sandstoneItems, 1, -1, SandStoneTile::TYPE_DEFAULT ) ); + addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Sandstone, this, sandstoneItems, 1, -1, SandStoneTile::TYPE_HEIROGLYPHS ) ); + addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Sandstone, this, sandstoneItems, 1, -1, SandStoneTile::TYPE_SMOOTHSIDE ) ); + } + + int noteBlockItems[] = {Tile::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}; + if(!isHintCompleted(e_Tutorial_Hint_Powered_Rail)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Powered_Rail, this, poweredRailItems, 1 ) ); + + int detectorRailItems[] = {Tile::detectorRail_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Detector_Rail)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Detector_Rail, this, detectorRailItems, 1 ) ); + + int tallGrassItems[] = {Tile::tallgrass_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Tall_Grass)) + { + addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Tall_Grass, this, tallGrassItems, 1, -1, TallGrass::DEAD_SHRUB ) ); + addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Tall_Grass, this, tallGrassItems, 1, -1, TallGrass::TALL_GRASS ) ); + addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Tall_Grass, this, tallGrassItems, 1, -1, TallGrass::FERN ) ); + } + + int woolItems[] = {Tile::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::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}; + if(!isHintCompleted(e_Tutorial_Hint_Gold_Block)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Gold_Block, this, goldBlockItems, 1 ) ); + + int ironBlockItems[] = {Tile::ironBlock_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Iron_Block)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Iron_Block, this, ironBlockItems, 1 ) ); + + int stoneSlabItems[] = {Tile::stoneSlabHalf_Id, Tile::stoneSlab_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Stone_Slab)) + { + addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Stone_Slab, this, stoneSlabItems, 2, -1, StoneSlabTile::STONE_SLAB ) ); + addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Stone_Slab, this, stoneSlabItems, 2, -1, StoneSlabTile::SAND_SLAB ) ); + addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Stone_Slab, this, stoneSlabItems, 2, -1, StoneSlabTile::WOOD_SLAB ) ); + addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Stone_Slab, this, stoneSlabItems, 2, -1, StoneSlabTile::COBBLESTONE_SLAB ) ); + addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Stone_Slab, this, stoneSlabItems, 2, -1, StoneSlabTile::BRICK_SLAB ) ); + addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Stone_Slab, this, stoneSlabItems, 2, -1, StoneSlabTile::SMOOTHBRICK_SLAB ) ); + addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Stone_Slab, this, stoneSlabItems, 2, -1, StoneSlabTile::NETHERBRICK_SLAB ) ); + addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Stone_Slab, this, stoneSlabItems, 2, -1, StoneSlabTile::QUARTZ_SLAB ) ); + } + + int woodSlabItems[] = {Tile::woodSlabHalf_Id, Tile::woodSlab_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Stone_Slab)) + { + addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Stone_Slab, this, woodSlabItems, 2, -1, TreeTile::BIRCH_TRUNK ) ); + addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Stone_Slab, this, woodSlabItems, 2, -1, TreeTile::DARK_TRUNK ) ); + } + + int redBrickItems[] = {Tile::redBrick_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Red_Brick)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Red_Brick, this, redBrickItems, 1 ) ); + + int tntItems[] = {Tile::tnt_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Tnt)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Tnt, this, tntItems, 1 ) ); + + int bookshelfItems[] = {Tile::bookshelf_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Bookshelf)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Bookshelf, this, bookshelfItems, 1 ) ); + + int mossStoneItems[] = {Tile::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}; + if(!isHintCompleted(e_Tutorial_Hint_Obsidian)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Obsidian, this, obsidianItems, 1 ) ); + + int torchItems[] = {Tile::torch_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Torch)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Torch, this, torchItems, 1 ) ); + + int mobSpawnerItems[] = {Tile::mobSpawner_Id}; + if(!isHintCompleted(e_Tutorial_Hint_MobSpawner)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_MobSpawner, this, mobSpawnerItems, 1 ) ); + + int chestItems[] = {Tile::chest_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Chest)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Chest, this, chestItems, 1 ) ); + + int redstoneItems[] = {Tile::redStoneDust_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Redstone)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Redstone, this, redstoneItems, 1, Item::redStone_Id ) ); + + int diamondOreItems[] = {Tile::diamondOre_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Diamond_Ore)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Diamond_Ore, this, diamondOreItems, 1 ) ); + + int diamondBlockItems[] = {Tile::diamondBlock_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Diamond_Block)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Diamond_Block, this, diamondBlockItems, 1 ) ); + + int craftingTableItems[] = {Tile::workBench_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Crafting_Table)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Crafting_Table, this, craftingTableItems, 1 ) ); + + int cropsItems[] = {Tile::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}; + if(!isHintCompleted(e_Tutorial_Hint_Farmland)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Farmland, this, farmlandItems, 1 ) ); + + int furnaceItems[] = {Tile::furnace_Id, Tile::furnace_lit_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Furnace)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Furnace, this, furnaceItems, 2 ) ); + + int signItems[] = {Tile::sign_Id, Tile::wallSign_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Sign)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Sign, this, signItems, 2, Item::sign_Id ) ); + + int doorWoodItems[] = {Tile::door_wood_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Door_Wood)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Door_Wood, this, doorWoodItems, 1, Item::door_wood->id ) ); + + int ladderItems[] = {Tile::ladder_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Ladder)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Ladder, this, ladderItems, 1 ) ); + + int stairsStoneItems[] = {Tile::stairs_stone_Id,Tile::stairs_bricks_Id,Tile::stairs_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}; + if(!isHintCompleted(e_Tutorial_Hint_Rail)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Rail, this, railItems, 1 ) ); + + int leverItems[] = {Tile::lever_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Lever)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Lever, this, leverItems, 1 ) ); + + int pressurePlateItems[] = {Tile::pressurePlate_stone_Id, Tile::pressurePlate_wood_Id}; + if(!isHintCompleted(e_Tutorial_Hint_PressurePlate)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_PressurePlate, this, pressurePlateItems, 2 ) ); + + int doorIronItems[] = {Tile::door_iron_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Door_Iron)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Door_Iron, this, doorIronItems, 1, Item::door_iron->id ) ); + + int redstoneOreItems[] = {Tile::redStoneOre_Id, Tile::redStoneOre_lit_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Redstone_Ore)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Redstone_Ore, this, redstoneOreItems, 2 ) ); + + int redstoneTorchItems[] = {Tile::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}; + if(!isHintCompleted(e_Tutorial_Hint_Button)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Button, this, buttonItems, 2 ) ); + + int snowItems[] = {Tile::snow_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Snow)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Snow, this, snowItems, 1 ) ); + + int iceItems[] = {Tile::ice_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Ice)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Ice, this, iceItems, 1 ) ); + + int cactusItems[] = {Tile::cactus_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Cactus)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Cactus, this, cactusItems, 1 ) ); + + int clayItems[] = {Tile::clay_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Clay)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Clay, this, clayItems, 1 ) ); + + int sugarCaneItems[] = {Tile::reeds_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Sugarcane)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Sugarcane, this, sugarCaneItems, 1 ) ); + + int recordPlayerItems[] = {Tile::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::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::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::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}; + if(!isHintCompleted(e_Tutorial_Hint_Portal)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Portal, this, portalItems, 1 ) ); + + int pumpkinLitItems[] = {Tile::litPumpkin_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Pumpkin_Lit)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Pumpkin_Lit, this, pumpkinLitItems, 1, -1, -1, 0 ) ); + + int cakeItems[] = {Tile::cake_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Cake)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Cake, this, cakeItems, 1 ) ); + + int redstoneRepeaterItems[] = {Tile::diode_on_Id, Tile::diode_off_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Redstone_Repeater)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Redstone_Repeater, this, redstoneRepeaterItems, 2, Item::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 ) ); + + int pistonItems[] = {Tile::pistonBase_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Piston)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Piston, this, pistonItems, 1 ) ); + + int stickyPistonItems[] = {Tile::pistonStickyBase_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Sticky_Piston)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Sticky_Piston, this, stickyPistonItems, 1 ) ); + + int monsterStoneEggItems[] = {Tile::monsterStoneEgg_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Monster_Stone_Egg)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Monster_Stone_Egg, this, monsterStoneEggItems, 1 ) ); + + int stoneBrickSmoothItems[] = {Tile::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::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}; + if(!isHintCompleted(e_Tutorial_Hint_Iron_Fence)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Iron_Fence, this, ironFenceItems, 1 ) ); + + int thisGlassItems[] = {Tile::thinGlass_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Thin_Glass)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Thin_Glass, this, thisGlassItems, 1 ) ); + + int melonItems[] = {Tile::melon_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Melon)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Melon, this, melonItems, 1 ) ); + + int vineItems[] = {Tile::vine_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Vine)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Vine, this, vineItems, 1 ) ); + + int fenceGateItems[] = {Tile::fenceGate_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Fence_Gate)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Fence_Gate, this, fenceGateItems, 1 ) ); + + int mycelItems[] = {Tile::mycel_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Mycel)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Mycel, this, mycelItems, 1 ) ); + + int waterLilyItems[] = {Tile::waterLily_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Water_Lily)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Water_Lily, this, waterLilyItems, 1 ) ); + + int netherBrickItems[] = {Tile::netherBrick_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Nether_Brick)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Nether_Brick, this, netherBrickItems, 1 ) ); + + int netherFenceItems[] = {Tile::netherFence_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Nether_Fence)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Nether_Fence, this, netherFenceItems, 1 ) ); + + int netherStalkItems[] = {Tile::netherStalk_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Nether_Stalk)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Nether_Stalk, this, netherStalkItems, 1 ) ); + + int enchantTableItems[] = {Tile::enchantTable_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Enchant_Table)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Enchant_Table, this, enchantTableItems, 1 ) ); + + int brewingStandItems[] = {Tile::brewingStand_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Brewing_Stand)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Brewing_Stand, this, brewingStandItems, 1, Item::brewingStand_Id ) ); + + int cauldronItems[] = {Tile::cauldron_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Cauldron)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Cauldron, this, cauldronItems, 1, Item::cauldron_Id ) ); + + int endPortalItems[] = {Tile::endPortalTile_Id}; + if(!isHintCompleted(e_Tutorial_Hint_End_Portal)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_End_Portal, this, endPortalItems, 1, -2 ) ); + + int endPortalFrameItems[] = {Tile::endPortalFrameTile_Id}; + if(!isHintCompleted(e_Tutorial_Hint_End_Portal_Frame)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_End_Portal_Frame, this, endPortalFrameItems, 1 ) ); + + int whiteStoneItems[] = {Tile::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}; + if(!isHintCompleted(e_Tutorial_Hint_Dragon_Egg)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Dragon_Egg, this, dragonEggItems, 1 ) ); + + int redstoneLampItems[] = {Tile::redstoneLight_Id, Tile::redstoneLight_lit_Id}; + if(!isHintCompleted(e_Tutorial_Hint_RedstoneLamp)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_RedstoneLamp, this, redstoneLampItems, 2 ) ); + + int cocoaItems[] = {Tile::cocoa_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Cocoa)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Cocoa, this, cocoaItems, 1, 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 ) ); + + int emeraldBlockItems[] = {Tile::emeraldBlock_Id}; + if(!isHintCompleted(e_Tutorial_Hint_EmeraldBlock)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_EmeraldBlock, this, emeraldBlockItems, 1 ) ); + + int enderChestItems[] = {Tile::enderChest_Id}; + if(!isHintCompleted(e_Tutorial_Hint_EnderChest)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_EnderChest, this, enderChestItems, 1 ) ); + + int tripwireSourceItems[] = {Tile::tripWireSource_Id}; + if(!isHintCompleted(e_Tutorial_Hint_TripwireSource)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_TripwireSource, this, tripwireSourceItems, 1 ) ); + + int tripwireItems[] = {Tile::tripWire_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Tripwire)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Tripwire, this, tripwireItems, 1, Item::string_Id ) ); + + int cobblestoneWallItems[] = {Tile::cobbleWall_Id}; + if(!isHintCompleted(e_Tutorial_Hint_CobblestoneWall)) + { + addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_CobblestoneWall, this, cobblestoneWallItems, 1, -1, WallTile::TYPE_NORMAL ) ); + addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_CobblestoneWall, this, cobblestoneWallItems, 1, -1, WallTile::TYPE_MOSSY ) ); + } + + int flowerpotItems[] = {Tile::flowerPot_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Flowerpot)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Flowerpot, this, flowerpotItems, 1, Item::flowerPot_Id ) ); + + int anvilItems[] = {Tile::anvil_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Anvil)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Anvil, this, anvilItems, 1 ) ); + + int quartzOreItems[] = {Tile::netherQuartz_Id}; + if(!isHintCompleted(e_Tutorial_Hint_QuartzOre)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_QuartzOre, this, quartzOreItems, 1 ) ); + + int quartzBlockItems[] = {Tile::quartzBlock_Id}; + if(!isHintCompleted(e_Tutorial_Hint_QuartzBlock)) + { + addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_QuartzBlock, this, quartzBlockItems, 1, -1, QuartzBlockTile::TYPE_DEFAULT ) ); + addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_QuartzBlock, this, quartzBlockItems, 1, -1, QuartzBlockTile::TYPE_CHISELED ) ); + addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_QuartzBlock, this, quartzBlockItems, 1, -1, QuartzBlockTile::TYPE_LINES_Y ) ); + addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_QuartzBlock, this, quartzBlockItems, 1, -1, QuartzBlockTile::TYPE_LINES_X ) ); + addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_QuartzBlock, this, quartzBlockItems, 1, -1, QuartzBlockTile::TYPE_LINES_Z ) ); + } + + int carpetItems[] = {Tile::woolCarpet_Id}; + if(!isHintCompleted(e_Tutorial_Hint_WoolCarpet)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_WoolCarpet, this, carpetItems, 1 ) ); + + int potatoItems[] = {Tile::potatoes_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Potato)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Potato, this, potatoItems, 1, -1, -1, 7 ) ); + + int carrotItems[] = {Tile::carrots_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Carrot)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Carrot, this, carrotItems, 1, -1, -1, 7 ) ); + + 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 + */ + if(!isHintCompleted(e_Tutorial_Hint_Squid)) addHint(e_Tutorial_State_Gameplay, new LookAtEntityHint(e_Tutorial_Hint_Squid, this, IDS_DESC_SQUID, IDS_SQUID, eTYPE_SQUID ) ); + if(!isHintCompleted(e_Tutorial_Hint_Cow)) addHint(e_Tutorial_State_Gameplay, new LookAtEntityHint(e_Tutorial_Hint_Cow, this, IDS_DESC_COW, IDS_COW, eTYPE_COW ) ); + if(!isHintCompleted(e_Tutorial_Hint_Sheep)) addHint(e_Tutorial_State_Gameplay, new LookAtEntityHint(e_Tutorial_Hint_Sheep, this, IDS_DESC_SHEEP, IDS_SHEEP, eTYPE_SHEEP ) ); + if(!isHintCompleted(e_Tutorial_Hint_Chicken)) addHint(e_Tutorial_State_Gameplay, new LookAtEntityHint(e_Tutorial_Hint_Chicken, this, IDS_DESC_CHICKEN, IDS_CHICKEN, eTYPE_CHICKEN ) ); + if(!isHintCompleted(e_Tutorial_Hint_Pig)) addHint(e_Tutorial_State_Gameplay, new LookAtEntityHint(e_Tutorial_Hint_Pig, this, IDS_DESC_PIG, IDS_PIG, eTYPE_PIG ) ); + if(!isHintCompleted(e_Tutorial_Hint_Wolf)) addHint(e_Tutorial_State_Gameplay, new LookAtEntityHint(e_Tutorial_Hint_Wolf, this, IDS_DESC_WOLF, IDS_WOLF, eTYPE_WOLF ) ); + if(!isHintCompleted(e_Tutorial_Hint_Creeper)) addHint(e_Tutorial_State_Gameplay, new LookAtEntityHint(e_Tutorial_Hint_Creeper, this, IDS_DESC_CREEPER, IDS_CREEPER, eTYPE_CREEPER ) ); + if(!isHintCompleted(e_Tutorial_Hint_Skeleton)) addHint(e_Tutorial_State_Gameplay, new LookAtEntityHint(e_Tutorial_Hint_Skeleton, this, IDS_DESC_SKELETON, IDS_SKELETON, eTYPE_SKELETON ) ); + if(!isHintCompleted(e_Tutorial_Hint_Spider)) addHint(e_Tutorial_State_Gameplay, new LookAtEntityHint(e_Tutorial_Hint_Spider, this, IDS_DESC_SPIDER, IDS_SPIDER, eTYPE_SPIDER ) ); + if(!isHintCompleted(e_Tutorial_Hint_Zombie)) addHint(e_Tutorial_State_Gameplay, new LookAtEntityHint(e_Tutorial_Hint_Zombie, this, IDS_DESC_ZOMBIE, IDS_ZOMBIE, eTYPE_ZOMBIE ) ); + if(!isHintCompleted(e_Tutorial_Hint_Pig_Zombie)) addHint(e_Tutorial_State_Gameplay, new LookAtEntityHint(e_Tutorial_Hint_Pig_Zombie, this, IDS_DESC_PIGZOMBIE, IDS_PIGZOMBIE, eTYPE_PIGZOMBIE ) ); + if(!isHintCompleted(e_Tutorial_Hint_Ghast)) addHint(e_Tutorial_State_Gameplay, new LookAtEntityHint(e_Tutorial_Hint_Ghast, this, IDS_DESC_GHAST, IDS_GHAST, eTYPE_GHAST ) ); + if(!isHintCompleted(e_Tutorial_Hint_Slime)) addHint(e_Tutorial_State_Gameplay, new LookAtEntityHint(e_Tutorial_Hint_Slime, this, IDS_DESC_SLIME, IDS_SLIME, eTYPE_SLIME ) ); + if(!isHintCompleted(e_Tutorial_Hint_Enderman)) addHint(e_Tutorial_State_Gameplay, new LookAtEntityHint(e_Tutorial_Hint_Enderman, this, IDS_DESC_ENDERMAN, IDS_ENDERMAN, eTYPE_ENDERMAN ) ); + if(!isHintCompleted(e_Tutorial_Hint_Silverfish)) addHint(e_Tutorial_State_Gameplay, new LookAtEntityHint(e_Tutorial_Hint_Silverfish, this, IDS_DESC_SILVERFISH, IDS_SILVERFISH, eTYPE_SILVERFISH ) ); + if(!isHintCompleted(e_Tutorial_Hint_Cave_Spider)) addHint(e_Tutorial_State_Gameplay, new LookAtEntityHint(e_Tutorial_Hint_Cave_Spider, this, IDS_DESC_CAVE_SPIDER, IDS_CAVE_SPIDER, eTYPE_CAVESPIDER ) ); + if(!isHintCompleted(e_Tutorial_Hint_MushroomCow)) addHint(e_Tutorial_State_Gameplay, new LookAtEntityHint(e_Tutorial_Hint_MushroomCow, this, IDS_DESC_MUSHROOM_COW, IDS_MUSHROOM_COW, eTYPE_MUSHROOMCOW) ); + if(!isHintCompleted(e_Tutorial_Hint_SnowMan)) addHint(e_Tutorial_State_Gameplay, new LookAtEntityHint(e_Tutorial_Hint_SnowMan, this, IDS_DESC_SNOWMAN, IDS_SNOWMAN, eTYPE_SNOWMAN ) ); + if(!isHintCompleted(e_Tutorial_Hint_IronGolem)) addHint(e_Tutorial_State_Gameplay, new LookAtEntityHint(e_Tutorial_Hint_IronGolem, this, IDS_DESC_IRONGOLEM, IDS_IRONGOLEM, eTYPE_VILLAGERGOLEM ) ); + if(!isHintCompleted(e_Tutorial_Hint_EnderDragon)) addHint(e_Tutorial_State_Gameplay, new LookAtEntityHint(e_Tutorial_Hint_EnderDragon, this, IDS_DESC_ENDERDRAGON, IDS_ENDERDRAGON, eTYPE_ENDERDRAGON ) ); + if(!isHintCompleted(e_Tutorial_Hint_Blaze)) addHint(e_Tutorial_State_Gameplay, new LookAtEntityHint(e_Tutorial_Hint_Blaze, this, IDS_DESC_BLAZE, IDS_BLAZE, eTYPE_BLAZE ) ); + if(!isHintCompleted(e_Tutorial_Hint_Lava_Slime)) addHint(e_Tutorial_State_Gameplay, new LookAtEntityHint(e_Tutorial_Hint_Lava_Slime, this, IDS_DESC_LAVA_SLIME, IDS_LAVA_SLIME, eTYPE_LAVASLIME ) ); + if(!isHintCompleted(e_Tutorial_Hint_Ozelot)) addHint(e_Tutorial_State_Gameplay, new LookAtEntityHint(e_Tutorial_Hint_Ozelot, this, IDS_DESC_OZELOT, IDS_OZELOT, eTYPE_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) ); + + + /* + * ITEM HINTS + */ + int shovelItems[] = {Item::shovel_wood->id, Item::shovel_stone->id, Item::shovel_iron->id, Item::shovel_gold->id, Item::shovel_diamond->id}; + if(!isHintCompleted(e_Tutorial_Hint_Item_Shovel)) addHint(e_Tutorial_State_Gameplay, new DiggerItemHint(e_Tutorial_Hint_Item_Shovel, this, IDS_TUTORIAL_HINT_DIGGER_ITEM_SHOVEL, shovelItems, 5) ); + + int hatchetItems[] = {Item::hatchet_wood->id, Item::hatchet_stone->id, Item::hatchet_iron->id, Item::hatchet_gold->id, Item::hatchet_diamond->id}; + if(!isHintCompleted(e_Tutorial_Hint_Item_Hatchet)) addHint(e_Tutorial_State_Gameplay, new DiggerItemHint(e_Tutorial_Hint_Item_Hatchet, this, IDS_TUTORIAL_HINT_DIGGER_ITEM_HATCHET, hatchetItems, 5 ) ); + + int pickaxeItems[] = {Item::pickAxe_wood->id, Item::pickAxe_stone->id, Item::pickAxe_iron->id, Item::pickAxe_gold->id, Item::pickAxe_diamond->id}; + if(!isHintCompleted(e_Tutorial_Hint_Item_Pickaxe)) addHint(e_Tutorial_State_Gameplay, new DiggerItemHint(e_Tutorial_Hint_Item_Pickaxe, this, IDS_TUTORIAL_HINT_DIGGER_ITEM_PICKAXE, pickaxeItems, 5 ) ); + + /* + * + * + * INVENTORY + * + */ + if(isFullTutorial || !isStateCompleted( e_Tutorial_State_Inventory_Menu) ) + { + ProcedureCompoundTask *inventoryOverviewTask = new ProcedureCompoundTask( this ); + inventoryOverviewTask->AddTask( new ChoiceTask(this, IDS_TUTORIAL_TASK_INV_OVERVIEW, IDS_TUTORIAL_PROMPT_INV_OVERVIEW, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Complete_State, eTelemetryTutorial_Inventory) ); + inventoryOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_INV_PICK_UP, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + inventoryOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_INV_MOVE, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + inventoryOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_INV_DROP, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + inventoryOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_INV_INFO, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Inventory_Menu, inventoryOverviewTask ); + } + + /* + * + * + * CREATIVE INVENTORY + * + */ + if(isFullTutorial || !isStateCompleted( e_Tutorial_State_Creative_Inventory_Menu) ) + { + ProcedureCompoundTask *creativeInventoryOverviewTask = new ProcedureCompoundTask( this ); + creativeInventoryOverviewTask->AddTask( new ChoiceTask(this, IDS_TUTORIAL_TASK_CREATIVE_INV_OVERVIEW, IDS_TUTORIAL_PROMPT_CREATIVE_INV_OVERVIEW, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Complete_State, eTelemetryTutorial_CreativeInventory) ); + creativeInventoryOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_CREATIVE_INV_PICK_UP, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + creativeInventoryOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_CREATIVE_INV_MOVE, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + creativeInventoryOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_CREATIVE_INV_DROP, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + creativeInventoryOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_CREATIVE_INV_NAV, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + creativeInventoryOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_CREATIVE_INV_INFO, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Creative_Inventory_Menu, creativeInventoryOverviewTask ); + } + + /* + * + * + * CRAFTING + * + */ + if(isFullTutorial || !isStateCompleted( e_Tutorial_State_2x2Crafting_Menu ) ) + { + ProcedureCompoundTask *craftingOverviewTask = new ProcedureCompoundTask( this ); + craftingOverviewTask->AddTask( new ChoiceTask(this, IDS_TUTORIAL_TASK_CRAFT_OVERVIEW, IDS_TUTORIAL_PROMPT_CRAFT_OVERVIEW, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Complete_State, eTelemetryTutorial_Crafting) ); + craftingOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_CRAFT_NAV, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + craftingOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_CRAFT_CREATE, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + craftingOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_CRAFT_CRAFT_TABLE, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + craftingOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_CRAFT_INVENTORY, IDS_TUTORIAL_PROMPT_PRESS_X_TO_TOGGLE_DESCRIPTION, false, ACTION_MENU_X) ); + craftingOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_CRAFT_DESCRIPTION, IDS_TUTORIAL_PROMPT_PRESS_X_TO_TOGGLE_INGREDIENTS, false, ACTION_MENU_X) ); + craftingOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_CRAFT_INGREDIENTS, IDS_TUTORIAL_PROMPT_PRESS_X_TO_TOGGLE_INVENTORY, false, ACTION_MENU_X) ); + addTask(e_Tutorial_State_2x2Crafting_Menu, craftingOverviewTask ); + } + // Other tasks can be added in the derived classes + + addHint(e_Tutorial_State_2x2Crafting_Menu, new TutorialHint(e_Tutorial_Hint_Always_On, this, IDS_TUTORIAL_HINT_CRAFT_NO_INGREDIENTS, TutorialHint::e_Hint_NoIngredients) ); + + addHint(e_Tutorial_State_3x3Crafting_Menu, new TutorialHint(e_Tutorial_Hint_Always_On, this, IDS_TUTORIAL_HINT_CRAFT_NO_INGREDIENTS, TutorialHint::e_Hint_NoIngredients) ); + + /* + * + * + * FURNACE + * + */ + if(isFullTutorial || !isStateCompleted( e_Tutorial_State_Furnace_Menu ) ) + { + ProcedureCompoundTask *furnaceOverviewTask = new ProcedureCompoundTask( this ); + furnaceOverviewTask->AddTask( new ChoiceTask(this, IDS_TUTORIAL_TASK_FURNACE_OVERVIEW, IDS_TUTORIAL_PROMPT_FURNACE_OVERVIEW, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Complete_State, eTelemetryTutorial_Furnace) ); + furnaceOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_FURNACE_METHOD, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + furnaceOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_FURNACE_FUELS, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + furnaceOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_FURNACE_INGREDIENTS, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Furnace_Menu, furnaceOverviewTask ); + } + // Other tasks can be added in the derived classes + + /* + * + * + * BREWING MENU + * + */ + if(isFullTutorial || !isStateCompleted( e_Tutorial_State_Brewing_Menu ) ) + { + ProcedureCompoundTask *brewingOverviewTask = new ProcedureCompoundTask( this ); + brewingOverviewTask->AddTask( new ChoiceTask(this, IDS_TUTORIAL_TASK_BREWING_MENU_OVERVIEW, IDS_TUTORIAL_PROMPT_BREWING_MENU_OVERVIEW, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Complete_State, eTelemetryTutorial_BrewingMenu) ); + brewingOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_BREWING_MENU_METHOD, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + brewingOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_BREWING_MENU_BASIC_INGREDIENTS, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + brewingOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_BREWING_MENU_EXTENDED_INGREDIENTS, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + brewingOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_BREWING_MENU_EXTENDED_INGREDIENTS_2, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Brewing_Menu, brewingOverviewTask ); + } + // Other tasks can be added in the derived classes + + /* + * + * + * ENCHANTING MENU + * + */ + if(isFullTutorial || !isStateCompleted( e_Tutorial_State_Enchanting_Menu ) ) + { + ProcedureCompoundTask *enchantingOverviewTask = new ProcedureCompoundTask( this ); + enchantingOverviewTask->AddTask( new ChoiceTask(this, IDS_TUTORIAL_TASK_ENCHANTING_MENU_OVERVIEW, IDS_TUTORIAL_PROMPT_ENCHANTING_MENU_OVERVIEW, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Complete_State, eTelemetryTutorial_EnchantingMenu) ); + enchantingOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_ENCHANTING_MENU_START, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + enchantingOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_ENCHANTING_MENU_ENCHANTMENTS, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + enchantingOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_ENCHANTING_MENU_COST, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + enchantingOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_ENCHANTING_MENU_ENCHANT, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + enchantingOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_ENCHANTING_MENU_BETTER_ENCHANTMENTS, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Enchanting_Menu, enchantingOverviewTask ); + } + // Other tasks can be added in the derived classes + + /* + * + * + * ANVIL MENU + * + */ + if(isFullTutorial || !isStateCompleted( e_Tutorial_State_Anvil_Menu ) ) + { + ProcedureCompoundTask *anvilOverviewTask = new ProcedureCompoundTask( this ); + anvilOverviewTask->AddTask( new ChoiceTask(this, IDS_TUTORIAL_TASK_ANVIL_MENU_OVERVIEW, IDS_TUTORIAL_PROMPT_ANVIL_MENU_OVERVIEW, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Complete_State, eTelemetryTutorial_AnvilMenu) ); + anvilOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_ANVIL_MENU_START, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + anvilOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_ANVIL_MENU_REPAIR, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + anvilOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_ANVIL_MENU_SACRIFICE, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + anvilOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_ANVIL_MENU_ENCHANT, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + anvilOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_ANVIL_MENU_COST, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + anvilOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_ANVIL_MENU_RENAMING, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + anvilOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_ANVIL_MENU_SMITH, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Anvil_Menu, anvilOverviewTask ); + } + // Other tasks can be added in the derived classes + + /* + * + * + * TRADING MENU + * + */ + if(isFullTutorial || !isStateCompleted( e_Tutorial_State_Trading_Menu ) ) + { + ProcedureCompoundTask *tradingOverviewTask = new ProcedureCompoundTask( this ); + tradingOverviewTask->AddTask( new ChoiceTask(this, IDS_TUTORIAL_TASK_TRADING_MENU_OVERVIEW, IDS_TUTORIAL_PROMPT_TRADING_MENU_OVERVIEW, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Complete_State, eTelemetryTutorial_TradingMenu) ); + tradingOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_TRADING_MENU_START, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + tradingOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_TRADING_MENU_UNAVAILABLE, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + tradingOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_TRADING_MENU_DETAILS, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + tradingOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_TRADING_MENU_INVENTORY, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + tradingOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_TRADING_MENU_TRADE, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Trading_Menu, tradingOverviewTask ); + } + // Other tasks can be added in the derived classes + + /* + * + * + * 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 ); + } + + /* + * + * + * MINECART + * + */ + if(isFullTutorial || !isStateCompleted( e_Tutorial_State_Riding_Minecart ) ) + { + addTask(e_Tutorial_State_Riding_Minecart, new ChoiceTask(this, IDS_TUTORIAL_TASK_MINECART_OVERVIEW, IDS_TUTORIAL_PROMPT_MINECART_OVERVIEW, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Complete_State_Gameplay_Constraints, eTelemetryTutorial_Minecart) ); + addTask(e_Tutorial_State_Riding_Minecart, new InfoTask(this, IDS_TUTORIAL_TASK_MINECART_RAILS, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Riding_Minecart, new InfoTask(this, IDS_TUTORIAL_TASK_MINECART_POWERED_RAILS, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Riding_Minecart, new InfoTask(this, IDS_TUTORIAL_TASK_MINECART_PUSHING, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + } + + /* + * + * + * BOAT + * + */ + if(isFullTutorial || !isStateCompleted( e_Tutorial_State_Riding_Boat ) ) + { + addTask(e_Tutorial_State_Riding_Boat, new ChoiceTask(this, IDS_TUTORIAL_TASK_BOAT_OVERVIEW, IDS_TUTORIAL_PROMPT_BOAT_OVERVIEW, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Complete_State_Gameplay_Constraints, eTelemetryTutorial_Boat) ); + addTask(e_Tutorial_State_Riding_Boat, new InfoTask(this, IDS_TUTORIAL_TASK_BOAT_STEER, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + } + + /* + * + * + * FISHING + * + */ + if(isFullTutorial || !isStateCompleted( e_Tutorial_State_Fishing ) ) + { + addTask(e_Tutorial_State_Fishing, new ChoiceTask(this, IDS_TUTORIAL_TASK_FISHING_OVERVIEW, IDS_TUTORIAL_PROMPT_FISHING_OVERVIEW, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Complete_State_Gameplay_Constraints, eTelemetryTutorial_Fishing) ); + addTask(e_Tutorial_State_Fishing, new InfoTask(this, IDS_TUTORIAL_TASK_FISHING_CAST, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Fishing, new InfoTask(this, IDS_TUTORIAL_TASK_FISHING_FISH, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Fishing, new InfoTask(this, IDS_TUTORIAL_TASK_FISHING_USES, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + } + + /* + * + * + * BED + * + */ + if(isFullTutorial || !isStateCompleted( e_Tutorial_State_Bed ) ) + { + addTask(e_Tutorial_State_Bed, new ChoiceTask(this, IDS_TUTORIAL_TASK_BED_OVERVIEW, IDS_TUTORIAL_PROMPT_BED_OVERVIEW, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Complete_State_Gameplay_Constraints, eTelemetryTutorial_Bed) ); + addTask(e_Tutorial_State_Bed, new InfoTask(this, IDS_TUTORIAL_TASK_BED_PLACEMENT, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Bed, new InfoTask(this, IDS_TUTORIAL_TASK_BED_MULTIPLAYER, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + } + + /* + * + * + * FOOD BAR + * + */ + if(!isFullTutorial && !isStateCompleted( e_Tutorial_State_Food_Bar ) ) + { + addTask(e_Tutorial_State_Food_Bar, new ChoiceTask(this, IDS_TUTORIAL_TASK_FOOD_BAR_OVERVIEW, IDS_TUTORIAL_PROMPT_FOOD_BAR_OVERVIEW, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Complete_State_Gameplay_Constraints, eTelemetryTutorial_FoodBar) ); + addTask(e_Tutorial_State_Food_Bar, new InfoTask(this, IDS_TUTORIAL_TASK_FOOD_BAR_DEPLETE, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Food_Bar, new InfoTask(this, IDS_TUTORIAL_TASK_FOOD_BAR_HEAL, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Food_Bar, new InfoTask(this, IDS_TUTORIAL_TASK_FOOD_BAR_FEED, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + } +} + +Tutorial::~Tutorial() +{ + for(AUTO_VAR(it, m_globalConstraints.begin()); it != m_globalConstraints.end(); ++it) + { + delete (*it); + } + for(unordered_map::iterator it = messages.begin(); it != messages.end(); ++it) + { + delete (*it).second; + } + for(unsigned int i = 0; i < e_Tutorial_State_Max; ++i) + { + for(AUTO_VAR(it, activeTasks[i].begin()); it < activeTasks[i].end(); ++it) + { + delete (*it); + } + for(AUTO_VAR(it, hints[i].begin()); it < hints[i].end(); ++it) + { + delete (*it); + } + + currentTask[i] = NULL; + currentFailedConstraint[i] = NULL; + } +} + +void Tutorial::debugResetPlayerSavedProgress(int iPad) +{ +#if ( defined __PS3__ || defined __ORBIS__ || defined _DURANGO || defined __PSVITA__) + GAME_SETTINGS *pGameSettings = (GAME_SETTINGS *)StorageManager.GetGameDefinedProfileData(iPad); +#else + GAME_SETTINGS *pGameSettings = (GAME_SETTINGS *)ProfileManager.GetGameDefinedProfileData(iPad); +#endif + ZeroMemory( pGameSettings->ucTutorialCompletion, TUTORIAL_PROFILE_STORAGE_BYTES ); + pGameSettings->uiSpecialTutorialBitmask = 0; +} + +void Tutorial::setCompleted( int completableId ) +{ + //if(app.GetGameSettingsDebugMask(m_iPad) && app.GetGameSettingsDebugMask()&(1L<= 0 && completableIndex < TUTORIAL_PROFILE_STORAGE_BITS ) + { + // Set the bit for this position +#if (defined __PS3__ || defined __ORBIS__ || defined _DURANGO || defined __PSVITA__) + GAME_SETTINGS *pGameSettings = (GAME_SETTINGS *)StorageManager.GetGameDefinedProfileData(m_iPad); +#else + GAME_SETTINGS *pGameSettings = (GAME_SETTINGS *)ProfileManager.GetGameDefinedProfileData(m_iPad); +#endif + int arrayIndex = completableIndex >> 3; + int bitIndex = 7 - (completableIndex % 8); + pGameSettings->ucTutorialCompletion[arrayIndex] |= 1<bSettingsChanged=true; + } +} + +bool Tutorial::getCompleted( int completableId ) +{ + //if(app.GetGameSettingsDebugMask(m_iPad) && app.GetGameSettingsDebugMask()&(1L<= 0 && completableIndex < TUTORIAL_PROFILE_STORAGE_BITS ) + { + // Read the bit for this position + //Retrieve the data pointer from the profile +#if ( defined __PS3__ || defined __ORBIS__ || defined _DURANGO || defined __PSVITA__) + GAME_SETTINGS *pGameSettings = (GAME_SETTINGS *)StorageManager.GetGameDefinedProfileData(m_iPad); +#else + GAME_SETTINGS *pGameSettings = (GAME_SETTINGS *)ProfileManager.GetGameDefinedProfileData(m_iPad); +#endif + int arrayIndex = completableIndex >> 3; + int bitIndex = 7 - (completableIndex % 8); + return (pGameSettings->ucTutorialCompletion[arrayIndex] & 1<getId(); + + if( hintId != e_Tutorial_Hint_Always_On ) + { + setHintCompleted( hint->getId() ); + hints[m_CurrentState].erase( find(hints[m_CurrentState].begin(), hints[m_CurrentState].end(), hint) ); + delete hint; + } + // else + // { + // find(hints[m_CurrentState].begin(), hints[m_CurrentState].end(), hint); + // } +} + +void Tutorial::tick() +{ + // Don't do anything for the first 2 seconds so that the loading screen is gone + if(!m_bHasTickedOnce) + { + int time = GetTickCount(); + if(m_firstTickTime == 0) + { + m_firstTickTime = time; + } + else if ( time - m_firstTickTime > 1500 ) + { + m_bHasTickedOnce = true; + } + } + if(!m_bHasTickedOnce) + { + return; + } + + bool constraintChanged = false; + bool taskChanged = false; + + for(unsigned int state = 0; state < e_Tutorial_State_Max; ++state) + { + AUTO_VAR(it, constraintsToRemove[state].begin()); + while(it < constraintsToRemove[state].end() ) + { + ++(*it).second; + if( (*it).second > m_iTutorialConstraintDelayRemoveTicks ) + { + TutorialConstraint *c = (*it).first; + constraints[state].erase( find( constraints[state].begin(), constraints[state].end(), c) ); + c->setQueuedForRemoval(false); + it = constraintsToRemove[state].erase( it ); + + if( c->getDeleteOnDeactivate() ) + { + delete c; + } + } + else + { + ++it; + } + } + } + + // 4J Stu TODO - Make this a constraint + Minecraft *pMinecraft = Minecraft::GetInstance(); + if(m_freezeTime && !m_timeFrozen && !m_fullTutorialComplete ) + { + // Need to set the time on both levels to stop the flickering as the local level + // tries to predict the time + MinecraftServer::SetTimeOfDay(m_iTutorialFreezeTimeValue); + pMinecraft->level->setDayTime(m_iTutorialFreezeTimeValue); // Always daytime + app.SetGameHostOption(eGameHostOption_DoDaylightCycle,0); + m_timeFrozen = true; + } + else if(m_freezeTime && m_timeFrozen && m_fullTutorialComplete) + { + MinecraftServer::SetTimeOfDay(m_iTutorialFreezeTimeValue); + pMinecraft->level->setDayTime(m_iTutorialFreezeTimeValue); + app.SetGameHostOption(eGameHostOption_DoDaylightCycle,1); + m_timeFrozen = false; + } + + if(!m_allowShow) + { + if( currentTask[m_CurrentState] != NULL && (!currentTask[m_CurrentState]->AllowFade() || (lastMessageTime + m_iTutorialDisplayMessageTime ) > GetTickCount() ) ) + { + uiTempDisabled = true; + } + ui.SetTutorialVisible( m_iPad, false ); + return; + } + + + if(!hasRequestedUI ) + { +#ifdef _XBOX + m_bSceneIsSplitscreen=app.GetLocalPlayerCount()>1; + if(m_bSceneIsSplitscreen) + { + app.NavigateToScene(m_iPad, eUIComponent_TutorialPopup,(void *)this, false, false, &m_hTutorialScene); + } + else + { + app.NavigateToScene(m_iPad, eUIComponent_TutorialPopup,(void *)this, false, false, &m_hTutorialScene); + } +#else + ui.SetTutorial(m_iPad, this); +#endif + hasRequestedUI = true; + } + else + { + // if we've changed mode, we may need to change scene + if(m_bSceneIsSplitscreen!=(app.GetLocalPlayerCount()>1)) + { +#ifdef _XBOX + app.TutorialSceneNavigateBack(m_iPad); + m_bSceneIsSplitscreen=app.GetLocalPlayerCount()>1; + if(m_bSceneIsSplitscreen) + { + app.NavigateToScene(m_iPad, eUIComponent_TutorialPopup,(void *)this, false, false, &m_hTutorialScene); + } + else + { + app.NavigateToScene(m_iPad, eUIComponent_TutorialPopup,(void *)this, false, false, &m_hTutorialScene); + } +#else + ui.SetTutorial(m_iPad, this); +#endif + } + } + + if(ui.IsPauseMenuDisplayed( m_iPad ) ) + { + if( currentTask[m_CurrentState] != NULL && (!currentTask[m_CurrentState]->AllowFade() || (lastMessageTime + m_iTutorialDisplayMessageTime ) > GetTickCount() ) ) + { + uiTempDisabled = true; + } + ui.SetTutorialVisible( m_iPad, false ); + return; + } + if( uiTempDisabled ) + { + ui.SetTutorialVisible( m_iPad, true ); + lastMessageTime = GetTickCount(); + uiTempDisabled = false; + } + + // Check constraints + for(AUTO_VAR(it, m_globalConstraints.begin()); it < m_globalConstraints.end(); ++it) + { + TutorialConstraint *constraint = *it; + constraint->tick(m_iPad); + } + + // Check hints + int hintNeeded = -1; + if(!m_hintDisplayed) + { + // 4J Stu - TU-1 interim + // Allow turning off all the hints + bool hintsOn = m_isFullTutorial || app.GetGameSettings(m_iPad,eGameSetting_Hints); + + if(hintsOn) + { + for(AUTO_VAR(it, hints[m_CurrentState].begin()); it < hints[m_CurrentState].end(); ++it) + { + TutorialHint *hint = *it; + hintNeeded = hint->tick(); + if(hintNeeded >= 0) + { + PopupMessageDetails *message = new PopupMessageDetails(); + message->m_messageId = hintNeeded; + message->m_allowFade = hint->allowFade(); + message->m_forceDisplay = true; + setMessage( hint, message ); + break; + } + } + } + } + + // Check constraints + // Only need to update these if we aren't already failing something + if( !m_allTutorialsComplete && (currentFailedConstraint[m_CurrentState] == NULL || currentFailedConstraint[m_CurrentState]->isConstraintSatisfied(m_iPad)) ) + { + if( currentFailedConstraint[m_CurrentState] != NULL && currentFailedConstraint[m_CurrentState]->isConstraintSatisfied(m_iPad) ) + { + constraintChanged = true; + currentFailedConstraint[m_CurrentState] = NULL; + } + for(AUTO_VAR(it, constraints[m_CurrentState].begin()); it < constraints[m_CurrentState].end(); ++it) + { + TutorialConstraint *constraint = *it; + if( !constraint->isConstraintSatisfied(m_iPad) && constraint->isConstraintRestrictive(m_iPad) ) + { + constraintChanged = true; + currentFailedConstraint[m_CurrentState] = constraint; + } + } + } + + if( !m_allTutorialsComplete && currentFailedConstraint[m_CurrentState] == NULL ) + { + // Update tasks + bool isCurrentTask = true; + AUTO_VAR(it, activeTasks[m_CurrentState].begin()); + while(activeTasks[m_CurrentState].size() > 0 && it < activeTasks[m_CurrentState].end()) + { + TutorialTask *task = *it; + if( isCurrentTask || task->isPreCompletionEnabled() ) + { + isCurrentTask = false; + if( + ( !task->ShowMinimumTime() || ( task->hasBeenActivated() && (lastMessageTime + m_iTutorialMinimumDisplayMessageTime ) < GetTickCount() ) ) + && task->isCompleted() + ) + { + eTutorial_CompletionAction compAction = task->getCompletionAction(); + it = activeTasks[m_CurrentState].erase( it ); + delete task; + task = NULL; + + if( activeTasks[m_CurrentState].size() > 0 ) + { + switch( compAction ) + { + case e_Tutorial_Completion_Complete_State_Gameplay_Constraints: + { + // 4J Stu - Move the delayed constraints to the gameplay state so that they are in + // effect for a bit longer + AUTO_VAR(itCon, constraintsToRemove[m_CurrentState].begin()); + while(itCon != constraintsToRemove[m_CurrentState].end() ) + { + constraints[e_Tutorial_State_Gameplay].push_back(itCon->first); + constraintsToRemove[e_Tutorial_State_Gameplay].push_back( pair(itCon->first, itCon->second) ); + + constraints[m_CurrentState].erase( find( constraints[m_CurrentState].begin(), constraints[m_CurrentState].end(), itCon->first) ); + itCon = constraintsToRemove[m_CurrentState].erase(itCon); + } + } + // Fall through the the normal complete state + case e_Tutorial_Completion_Complete_State: + for(AUTO_VAR(itRem, activeTasks[m_CurrentState].begin()); itRem < activeTasks[m_CurrentState].end(); ++itRem) + { + delete (*itRem); + } + activeTasks[m_CurrentState].clear(); + break; + case e_Tutorial_Completion_Jump_To_Last_Task: + { + TutorialTask *lastTask = activeTasks[m_CurrentState].at( activeTasks[m_CurrentState].size() - 1 ); + activeTasks[m_CurrentState].pop_back(); + for(AUTO_VAR(itRem, activeTasks[m_CurrentState].begin()); itRem < activeTasks[m_CurrentState].end(); ++itRem) + { + delete (*itRem); + } + activeTasks[m_CurrentState].clear(); + activeTasks[m_CurrentState].push_back( lastTask ); + it = activeTasks[m_CurrentState].begin(); + } + break; + case e_Tutorial_Completion_None: + default: + break; + } + } + + if( activeTasks[m_CurrentState].size() > 0 ) + { + currentTask[m_CurrentState] = activeTasks[m_CurrentState][0]; + currentTask[m_CurrentState]->setAsCurrentTask(); + } + else + { + setStateCompleted( m_CurrentState ); + + currentTask[m_CurrentState] = NULL; + } + taskChanged = true; + + // If we can complete this early, check if we can complete it right now + if( currentTask[m_CurrentState] != NULL && currentTask[m_CurrentState]->isPreCompletionEnabled() ) + { + isCurrentTask = true; + } + } + else + { + ++it; + } + if( task != NULL && task->ShowMinimumTime() && task->hasBeenActivated() && (lastMessageTime + m_iTutorialMinimumDisplayMessageTime ) < GetTickCount() ) + { + task->setShownForMinimumTime(); + + if( !m_hintDisplayed ) + { + PopupMessageDetails *message = new PopupMessageDetails(); + message->m_messageId = task->getDescriptionId(); + message->m_promptId = task->getPromptId(); + message->m_allowFade = task->AllowFade(); + message->m_replaceCurrent = true; + setMessage( message ); + } + } + } + else + { + ++it; + } + } + + if( currentTask[m_CurrentState] == NULL && activeTasks[m_CurrentState].size() > 0 ) + { + currentTask[m_CurrentState] = activeTasks[m_CurrentState][0]; + currentTask[m_CurrentState]->setAsCurrentTask(); + taskChanged = true; + } + } + + if(!m_allTutorialsComplete && (taskChanged || m_hasStateChanged) ) + { + bool allComplete = true; + for(unsigned int state = 0; state < e_Tutorial_State_Max; ++state) + { + if(activeTasks[state].size() > 0 ) + { + allComplete = false; + break; + } + if(state==e_Tutorial_State_Gameplay) + { + m_fullTutorialComplete = true; + Minecraft::GetInstance()->playerLeftTutorial(m_iPad); + } + } + if(allComplete) + m_allTutorialsComplete = true; + } + + if( constraintChanged || taskChanged || m_hasStateChanged || + (currentFailedConstraint[m_CurrentState] == NULL && currentTask[m_CurrentState] != NULL && (m_lastMessage == NULL || currentTask[m_CurrentState]->getDescriptionId() != m_lastMessage->m_messageId) && !m_hintDisplayed) + ) + { + if( currentFailedConstraint[m_CurrentState] != NULL ) + { + PopupMessageDetails *message = new PopupMessageDetails(); + message->m_messageId = currentFailedConstraint[m_CurrentState]->getDescriptionId(); + message->m_allowFade = false; + setMessage( message ); + } + else if( currentTask[m_CurrentState] != NULL ) + { + PopupMessageDetails *message = new PopupMessageDetails(); + message->m_messageId = currentTask[m_CurrentState]->getDescriptionId(); + message->m_promptId = currentTask[m_CurrentState]->getPromptId(); + message->m_allowFade = currentTask[m_CurrentState]->AllowFade(); + setMessage( message ); + currentTask[m_CurrentState]->TaskReminders()? m_iTaskReminders = 1 : m_iTaskReminders = 0; + } + else + { + setMessage( NULL ); + } + } + + if(m_hintDisplayed && (lastMessageTime + m_iTutorialDisplayMessageTime ) < GetTickCount() ) + { + m_hintDisplayed = false; + } + + if( currentFailedConstraint[m_CurrentState] == NULL && currentTask[m_CurrentState] != NULL && (m_iTaskReminders!=0) && (lastMessageTime + (m_iTaskReminders * m_iTutorialReminderTime) ) < GetTickCount() ) + { + // Reminder + PopupMessageDetails *message = new PopupMessageDetails(); + message->m_messageId = currentTask[m_CurrentState]->getDescriptionId(); + message->m_promptId = currentTask[m_CurrentState]->getPromptId(); + message->m_allowFade = currentTask[m_CurrentState]->AllowFade(); + message->m_isReminder = true; + setMessage( message ); + ++m_iTaskReminders; + if( m_iTaskReminders > 1 ) + m_iTaskReminders = 1; + } + + m_hasStateChanged = false; + + // If we have completed this state, and it is one that occurs during normal gameplay then change back to the gameplay track + if( m_CurrentState != e_Tutorial_State_Gameplay && activeTasks[m_CurrentState].size() == 0 && (isSelectedItemState() || !ui.GetMenuDisplayed(m_iPad) ) ) + { + this->changeTutorialState( e_Tutorial_State_Gameplay ); + } +} + +bool Tutorial::setMessage(PopupMessageDetails *message) +{ + if(message != NULL && !message->m_forceDisplay && + m_lastMessageState == m_CurrentState && + message->isSameContent(m_lastMessage) && + ( !message->m_isReminder || ( (lastMessageTime + m_iTutorialReminderTime ) > GetTickCount() && message->m_isReminder ) ) + ) + { + delete message; + return false; + } + + if(message != NULL && (message->m_messageId > 0 || !message->m_messageString.empty()) ) + { + m_lastMessageState = m_CurrentState; + + if(!message->m_replaceCurrent) lastMessageTime = GetTickCount(); + + wstring text; + if(!message->m_messageString.empty()) + { + text = message->m_messageString; + } + else + { + AUTO_VAR(it, messages.find(message->m_messageId)); + if( it != messages.end() && it->second != NULL ) + { + TutorialMessage *messageString = it->second; + text = wstring( messageString->getMessageForDisplay() ); + + // 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*}"); + } + } + } + + if(!message->m_promptString.empty()) + { + text.append(message->m_promptString); + } + else if(message->m_promptId >= 0) + { + AUTO_VAR(it, messages.find(message->m_promptId)); + if(it != messages.end() && it->second != NULL) + { + TutorialMessage *prompt = it->second; + text.append( prompt->getMessageForDisplay() ); + } + } + + wstring title; + TutorialPopupInfo popupInfo; + popupInfo.interactScene = m_UIScene; + popupInfo.desc = text.c_str(); + popupInfo.icon = message->m_icon; + popupInfo.iAuxVal = message->m_iAuxVal; + popupInfo.allowFade = message->m_allowFade; + popupInfo.isReminder = message->m_isReminder; + popupInfo.tutorial = this; + if( !message->m_titleString.empty() || message->m_titleId > 0 ) + { + if(message->m_titleString.empty()) title = wstring( app.GetString(message->m_titleId) ); + else title = message->m_titleString; + + popupInfo.title = title.c_str(); + ui.SetTutorialDescription( m_iPad, &popupInfo ); + } + else + { + ui.SetTutorialDescription( m_iPad, &popupInfo ); + } + } + else if( (m_lastMessage != NULL && m_lastMessage->m_messageId != -1) ) //&& (lastMessageTime + m_iTutorialReminderTime ) > GetTickCount() ) + { + // This should cause the popup to dissappear + TutorialPopupInfo popupInfo; + popupInfo.interactScene = m_UIScene; + popupInfo.tutorial = this; + ui.SetTutorialDescription( m_iPad, &popupInfo ); + } + + if(m_lastMessage != NULL) delete m_lastMessage; + m_lastMessage = message; + + return true; +} + +bool Tutorial::setMessage(TutorialHint *hint, PopupMessageDetails *message) +{ + // 4J Stu - TU-1 interim + // Allow turning off all the hints + bool hintsOn = m_isFullTutorial || (app.GetGameSettings(m_iPad,eGameSetting_Hints) && app.GetGameSettings(m_iPad,eGameSetting_DisplayHUD)); + + bool messageShown = false; + DWORD time = GetTickCount(); + if(message != NULL && (message->m_forceDisplay || hintsOn) && + (!message->m_delay || + ( + (m_hintDisplayed && (time - m_lastHintDisplayedTime) > m_iTutorialHintDelayTime ) || + (!m_hintDisplayed && (time - lastMessageTime) > m_iTutorialMinimumDisplayMessageTime ) + ) + ) + ) + { + messageShown = setMessage( message ); + + if(messageShown) + { + m_lastHintDisplayedTime = time; + m_hintDisplayed = true; + if(hint!=NULL) setHintCompleted( hint ); + } + } + return messageShown; +} + +bool Tutorial::setMessage(const wstring &messageString, int icon, int auxValue) +{ + PopupMessageDetails *message = new PopupMessageDetails(); + message->m_messageString = messageString; + message->m_icon = icon; + message->m_iAuxVal = auxValue; + message->m_forceDisplay = true; + + return setMessage(message); +} + +void Tutorial::showTutorialPopup(bool show) +{ + m_allowShow = show; + + if(!show) + { + if( currentTask[m_CurrentState] != NULL && (!currentTask[m_CurrentState]->AllowFade() || (lastMessageTime + m_iTutorialDisplayMessageTime ) > GetTickCount() ) ) + { + uiTempDisabled = true; + } + ui.SetTutorialVisible( m_iPad, show ); + } +} + +void Tutorial::useItemOn(Level *level, shared_ptr item, int x, int y, int z, bool bTestUseOnly) +{ + for(AUTO_VAR(it, activeTasks[m_CurrentState].begin()); it < activeTasks[m_CurrentState].end(); ++it) + { + TutorialTask *task = *it; + task->useItemOn(level, item, x, y, z, bTestUseOnly); + } +} + +void Tutorial::useItemOn(shared_ptr item, bool bTestUseOnly) +{ + for(AUTO_VAR(it, activeTasks[m_CurrentState].begin()); it < activeTasks[m_CurrentState].end(); ++it) + { + TutorialTask *task = *it; + task->useItem(item, bTestUseOnly); + } +} + +void Tutorial::completeUsingItem(shared_ptr item) +{ + for(AUTO_VAR(it, activeTasks[m_CurrentState].begin()); it < activeTasks[m_CurrentState].end(); ++it) + { + TutorialTask *task = *it; + task->completeUsingItem(item); + } + + // Fix for #46922 - TU5: UI: Player receives a reminder that he is hungry while "hunger bar" is full (triggered in split-screen mode) + if(m_CurrentState != e_Tutorial_State_Gameplay) + { + for(AUTO_VAR(it, activeTasks[e_Tutorial_State_Gameplay].begin()); it < activeTasks[e_Tutorial_State_Gameplay].end(); ++it) + { + TutorialTask *task = *it; + task->completeUsingItem(item); + } + } +} + +void Tutorial::startDestroyBlock(shared_ptr item, Tile *tile) +{ + int hintNeeded = -1; + for(AUTO_VAR(it, hints[m_CurrentState].begin()); it < hints[m_CurrentState].end(); ++it) + { + TutorialHint *hint = *it; + hintNeeded = hint->startDestroyBlock(item, tile); + if(hintNeeded >= 0) + { + PopupMessageDetails *message = new PopupMessageDetails(); + message->m_messageId = hintNeeded; + setMessage( hint, message ); + break; + } + + } +} + +void Tutorial::destroyBlock(Tile *tile) +{ + int hintNeeded = -1; + for(AUTO_VAR(it, hints[m_CurrentState].begin()); it < hints[m_CurrentState].end(); ++it) + { + TutorialHint *hint = *it; + hintNeeded = hint->destroyBlock(tile); + if(hintNeeded >= 0) + { + PopupMessageDetails *message = new PopupMessageDetails(); + message->m_messageId = hintNeeded; + setMessage( hint, message ); + break; + } + + } +} + +void Tutorial::attack(shared_ptr player, shared_ptr entity) +{ + int hintNeeded = -1; + for(AUTO_VAR(it, hints[m_CurrentState].begin()); it < hints[m_CurrentState].end(); ++it) + { + TutorialHint *hint = *it; + hintNeeded = hint->attack(player->inventory->getSelected(), entity); + if(hintNeeded >= 0) + { + PopupMessageDetails *message = new PopupMessageDetails(); + message->m_messageId = hintNeeded; + setMessage( hint, message ); + break; + } + + } +} + +void Tutorial::itemDamaged(shared_ptr item) +{ + int hintNeeded = -1; + for(AUTO_VAR(it, hints[m_CurrentState].begin()); it < hints[m_CurrentState].end(); ++it) + { + TutorialHint *hint = *it; + hintNeeded = hint->itemDamaged(item); + if(hintNeeded >= 0) + { + PopupMessageDetails *message = new PopupMessageDetails(); + message->m_messageId = hintNeeded; + setMessage( hint, message ); + break; + } + + } +} + +void Tutorial::handleUIInput(int iAction) +{ + if( m_hintDisplayed ) return; + + //for(AUTO_VAR(it, activeTasks[m_CurrentState].begin()); it < activeTasks[m_CurrentState].end(); ++it) + //{ + // TutorialTask *task = *it; + // task->handleUIInput(iAction); + //} + if(currentTask[m_CurrentState] != NULL) + currentTask[m_CurrentState]->handleUIInput(iAction); +} + +void Tutorial::createItemSelected(shared_ptr item, bool canMake) +{ + int hintNeeded = -1; + for(AUTO_VAR(it, hints[m_CurrentState].begin()); it < hints[m_CurrentState].end(); ++it) + { + TutorialHint *hint = *it; + hintNeeded = hint->createItemSelected(item, canMake); + if(hintNeeded >= 0) + { + PopupMessageDetails *message = new PopupMessageDetails(); + message->m_messageId = hintNeeded; + setMessage( hint, message ); + break; + } + + } +} + +void Tutorial::onCrafted(shared_ptr item) +{ + for(unsigned int state = 0; state < e_Tutorial_State_Max; ++state) + { + for(AUTO_VAR(it, activeTasks[state].begin()); it < activeTasks[state].end(); ++it) + { + TutorialTask *task = *it; + task->onCrafted(item); + } + } +} + +void Tutorial::onTake(shared_ptr item, unsigned int invItemCountAnyAux, unsigned int invItemCountThisAux) +{ + if( !m_hintDisplayed ) + { + bool hintNeeded = false; + for(AUTO_VAR(it, hints[m_CurrentState].begin()); it < hints[m_CurrentState].end(); ++it) + { + TutorialHint *hint = *it; + hintNeeded = hint->onTake(item); + if(hintNeeded) + { + break; + } + + } + } + + for(unsigned int state = 0; state < e_Tutorial_State_Max; ++state) + { + for(AUTO_VAR(it, activeTasks[state].begin()); it < activeTasks[state].end(); ++it) + { + TutorialTask *task = *it; + task->onTake(item, invItemCountAnyAux, invItemCountThisAux); + } + } +} + +void Tutorial::onSelectedItemChanged(shared_ptr item) +{ + // We only handle this if we are in a state that allows changing based on the selected item + // Menus and states like riding in a minecart will NOT allow this + if( isSelectedItemState() ) + { + if(item != NULL) + { + switch(item->id) + { + case Item::fishingRod_Id: + changeTutorialState(e_Tutorial_State_Fishing); + break; + default: + changeTutorialState(e_Tutorial_State_Gameplay); + break; + } + } + else + { + changeTutorialState(e_Tutorial_State_Gameplay); + } + } +} + +void Tutorial::onLookAt(int id, int iData) +{ + if( m_hintDisplayed ) return; + + bool hintNeeded = false; + for(AUTO_VAR(it, hints[m_CurrentState].begin()); it < hints[m_CurrentState].end(); ++it) + { + TutorialHint *hint = *it; + hintNeeded = hint->onLookAt(id, iData); + if(hintNeeded) + { + break; + } + } + + if( m_CurrentState == e_Tutorial_State_Gameplay ) + { + if(id > 0) + { + switch(id) + { + case Tile::bed_Id: + changeTutorialState(e_Tutorial_State_Bed); + break; + default: + break; + } + } + } +} + +void Tutorial::onLookAtEntity(shared_ptr entity) +{ + if( m_hintDisplayed ) return; + + bool hintNeeded = false; + for(AUTO_VAR(it, hints[m_CurrentState].begin()); it < hints[m_CurrentState].end(); ++it) + { + TutorialHint *hint = *it; + hintNeeded = hint->onLookAtEntity(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) +{ + for(AUTO_VAR(it, activeTasks[m_CurrentState].begin()); it < activeTasks[m_CurrentState].end(); ++it) + { + TutorialTask *task = *it; + task->onEffectChanged(effect,bRemoved); + } +} + +bool Tutorial::canMoveToPosition(double xo, double yo, double zo, double xt, double yt, double zt) +{ + bool allowed = true; + for(AUTO_VAR(it, constraints[m_CurrentState].begin()); it < constraints[m_CurrentState].end(); ++it) + { + TutorialConstraint *constraint = *it; + if( !constraint->isConstraintSatisfied(m_iPad) && !constraint->canMoveToPosition(xo,yo,zo,xt,yt,zt) ) + { + allowed = false; + break; + } + } + return allowed; +} + +bool Tutorial::isInputAllowed(int mapping) +{ + if( m_hintDisplayed ) return true; + + // If the player is under water then allow all keypresses so they can jump out + if( Minecraft::GetInstance()->localplayers[m_iPad]->isUnderLiquid(Material::water) ) return true; + + bool allowed = true; + for(AUTO_VAR(it, constraints[m_CurrentState].begin()); it < constraints[m_CurrentState].end(); ++it) + { + TutorialConstraint *constraint = *it; + if( constraint->isMappingConstrained( m_iPad, mapping ) ) + { + allowed = false; + break; + } + } + return allowed; +} + +vector *Tutorial::getTasks() +{ + return &tasks; +} + +unsigned int Tutorial::getCurrentTaskIndex() +{ + unsigned int index = 0; + for(AUTO_VAR(it, tasks.begin()); it < tasks.end(); ++it) + { + if(*it == currentTask[e_Tutorial_State_Gameplay]) + break; + + ++index; + } + return index; +} + +void Tutorial::AddGlobalConstraint(TutorialConstraint *c) +{ + m_globalConstraints.push_back(c); +} + +void Tutorial::AddConstraint(TutorialConstraint *c) +{ + constraints[m_CurrentState].push_back(c); +} + +void Tutorial::RemoveConstraint(TutorialConstraint *c, bool delayedRemove /*= false*/) +{ + if( currentFailedConstraint[m_CurrentState] == c ) + currentFailedConstraint[m_CurrentState] = NULL; + + if( c->getQueuedForRemoval() ) + { + // If it is already queued for removal, remove it on the next tick + /*for(AUTO_VAR(it, constraintsToRemove[m_CurrentState].begin()); it < constraintsToRemove[m_CurrentState].end(); ++it) + { + if( it->first == c ) + { + it->second = m_iTutorialConstraintDelayRemoveTicks; + break; + } + }*/ + } + else if(delayedRemove) + { + c->setQueuedForRemoval(true); + constraintsToRemove[m_CurrentState].push_back( pair(c, 0) ); + } + else + { + for( AUTO_VAR(it, constraintsToRemove[m_CurrentState].begin()); it < constraintsToRemove[m_CurrentState].end(); ++it) + { + if( it->first == c ) + { + constraintsToRemove[m_CurrentState].erase( it ); + break; + } + } + + AUTO_VAR(it, find( constraints[m_CurrentState].begin(), constraints[m_CurrentState].end(), c)); + if( it != constraints[m_CurrentState].end() ) constraints[m_CurrentState].erase( find( constraints[m_CurrentState].begin(), constraints[m_CurrentState].end(), c) ); + + // It may be in the gameplay list, so remove it from there if it is + it = find( constraints[e_Tutorial_State_Gameplay].begin(), constraints[e_Tutorial_State_Gameplay].end(), c); + if( it != constraints[e_Tutorial_State_Gameplay].end() ) constraints[e_Tutorial_State_Gameplay].erase( find( constraints[e_Tutorial_State_Gameplay].begin(), constraints[e_Tutorial_State_Gameplay].end(), c) ); + } +} + +void Tutorial::addTask(eTutorial_State state, TutorialTask *t) +{ + if( state == e_Tutorial_State_Gameplay ) + { + tasks.push_back(t); + } + activeTasks[state].push_back(t); +} + +void Tutorial::addHint(eTutorial_State state, TutorialHint *h) +{ + hints[state].push_back(h); +} + +void Tutorial::addMessage(int messageId, bool limitRepeats /*= false*/, unsigned char numRepeats /*= TUTORIAL_MESSAGE_DEFAULT_SHOW*/) +{ + if(messageId >= 0 && messages.find(messageId)==messages.end()) + messages[messageId] = new TutorialMessage(messageId, limitRepeats, numRepeats); +} + +#ifdef _XBOX +void Tutorial::changeTutorialState(eTutorial_State newState, CXuiScene *scene /*= NULL*/) +#else +void Tutorial::changeTutorialState(eTutorial_State newState, UIScene *scene /*= NULL*/) +#endif +{ + if(newState == m_CurrentState) + { + // If clearing the scene, make sure that the tutorial popup has its reference to this scene removed +#ifndef _XBOX + if( scene == NULL ) + { + ui.RemoveInteractSceneReference(m_iPad, m_UIScene); + } +#endif + m_UIScene = scene; + return; + } + // 4J Stu - TU-1 interim + // Allow turning off all the hints + bool hintsOn = m_isFullTutorial || app.GetGameSettings(m_iPad,eGameSetting_Hints); + + if(hintsOn) + { + // If we have completed this state, and it is one that occurs during normal gameplay then change back to the gameplay track + if( newState != e_Tutorial_State_Gameplay && activeTasks[newState].size() == 0 && !ui.GetMenuDisplayed(m_iPad) ) + { + return; + } + + // The action that caused the change of state may also have completed the current task + if( currentTask[m_CurrentState] != NULL && currentTask[m_CurrentState]->isCompleted() ) + { + activeTasks[m_CurrentState].erase( find( activeTasks[m_CurrentState].begin(), activeTasks[m_CurrentState].end(), currentTask[m_CurrentState]) ); + + if( activeTasks[m_CurrentState].size() > 0 ) + { + currentTask[m_CurrentState] = activeTasks[m_CurrentState][0]; + currentTask[m_CurrentState]->setAsCurrentTask(); + } + else + { + currentTask[m_CurrentState] = NULL; + } + } + + if( currentTask[m_CurrentState] != NULL ) + { + currentTask[m_CurrentState]->onStateChange(newState); + } + + // Make sure that the current message is cleared + setMessage( NULL ); + + // If clearing the scene, make sure that the tutorial popup has its reference to this scene removed +#ifndef _XBOX + if( scene == NULL ) + { + ui.RemoveInteractSceneReference(m_iPad, m_UIScene); + } +#endif + m_UIScene = scene; + + + if( m_CurrentState != newState ) + { + for(AUTO_VAR(it, activeTasks[newState].begin()); it < activeTasks[newState].end(); ++it) + { + TutorialTask *task = *it; + task->onStateChange(newState); + } + m_CurrentState = newState; + m_hasStateChanged = true; + m_hintDisplayed = false; + } + } +} + +bool Tutorial::isSelectedItemState() +{ + bool isSelectedItemState = false; + switch(m_CurrentState) + { + case e_Tutorial_State_Gameplay: + case e_Tutorial_State_Fishing: + isSelectedItemState = true; + break; + default: + break; + } + return isSelectedItemState; +} diff --git a/Minecraft.Client/Common/Tutorial/Tutorial.h b/Minecraft.Client/Common/Tutorial/Tutorial.h new file mode 100644 index 00000000..169c33e3 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/Tutorial.h @@ -0,0 +1,200 @@ +#pragma once +using namespace std; +#include "TutorialTask.h" +#include "TutorialConstraint.h" +#include "TutorialHint.h" +#include "TutorialMessage.h" +#include "TutorialEnum.h" + +// #define TUTORIAL_HINT_DELAY_TIME 14000 // How long we should wait from displaying one hint to the next +// #define TUTORIAL_DISPLAY_MESSAGE_TIME 7000 +// #define TUTORIAL_MINIMUM_DISPLAY_MESSAGE_TIME 2000 +// #define TUTORIAL_REMINDER_TIME (TUTORIAL_DISPLAY_MESSAGE_TIME + 20000) +// #define TUTORIAL_CONSTRAINT_DELAY_REMOVE_TICKS 15 +// +// // 0-24000 +// #define TUTORIAL_FREEZE_TIME_VALUE 8000 + +class Level; +class CXuiScene; + +class Tutorial +{ +public: + class PopupMessageDetails + { + public: + int m_messageId; + int m_promptId; + int m_titleId; + wstring m_messageString; + wstring m_promptString; + wstring m_titleString; + int m_icon; + int m_iAuxVal; + bool m_allowFade; + bool m_isReminder; + bool m_replaceCurrent; + bool m_forceDisplay; + bool m_delay; + + PopupMessageDetails() + { + m_messageId = -1; + m_promptId = -1; + m_titleId = -1; + m_messageString = L""; + m_promptString = L""; + m_titleString = L""; + m_icon = TUTORIAL_NO_ICON; + m_iAuxVal = 0; + m_allowFade = true; + m_isReminder = false; + m_replaceCurrent = false; + m_forceDisplay = false; + m_delay = false; + } + + bool isSameContent(PopupMessageDetails *other); + + }; + +private: + static int m_iTutorialHintDelayTime; + static int m_iTutorialDisplayMessageTime; + static int m_iTutorialMinimumDisplayMessageTime; + static int m_iTutorialExtraReminderTime; + static int m_iTutorialReminderTime; + static int m_iTutorialConstraintDelayRemoveTicks; + static int m_iTutorialFreezeTimeValue; + eTutorial_State m_CurrentState; + bool m_hasStateChanged; +#ifdef _XBOX + HXUIOBJ m_hTutorialScene; // to store the popup scene (splitscreen or normal) +#endif + bool m_bSceneIsSplitscreen; + + bool m_bHasTickedOnce; + int m_firstTickTime; + +protected: + unordered_map messages; + vector m_globalConstraints; + vector constraints[e_Tutorial_State_Max]; + vector< pair > constraintsToRemove[e_Tutorial_State_Max]; + vector tasks; // We store a copy of the tasks for the main gameplay tutorial so that we could display an overview menu + vector activeTasks[e_Tutorial_State_Max]; + vector hints[e_Tutorial_State_Max]; + TutorialTask *currentTask[e_Tutorial_State_Max]; + TutorialConstraint *currentFailedConstraint[e_Tutorial_State_Max]; + + bool m_freezeTime; + bool m_timeFrozen; + //D3DXVECTOR3 m_OriginalPosition; + +public: + DWORD lastMessageTime; + DWORD m_lastHintDisplayedTime; +private: + PopupMessageDetails *m_lastMessage; + + eTutorial_State m_lastMessageState; + unsigned int m_iTaskReminders; + + bool m_allowShow; + +public: + bool m_hintDisplayed; + +private: + bool hasRequestedUI; + bool uiTempDisabled; + +#ifdef _XBOX + CXuiScene *m_UIScene; +#else + UIScene *m_UIScene; +#endif + + int m_iPad; +public: + bool m_allTutorialsComplete; + bool m_fullTutorialComplete; + bool m_isFullTutorial; +public: + Tutorial(int iPad, bool isFullTutorial = false); + ~Tutorial(); + void tick(); + + int getPad() { return m_iPad; } + + virtual bool isStateCompleted( eTutorial_State state ); + virtual void setStateCompleted( eTutorial_State state ); + bool isHintCompleted( eTutorial_Hint hint ); + void setHintCompleted( eTutorial_Hint hint ); + void setHintCompleted( TutorialHint *hint ); + + // completableId will be either a eTutorial_State value or eTutorial_Hint + void setCompleted( int completableId ); + bool getCompleted( int completableId ); + +#ifdef _XBOX + void changeTutorialState(eTutorial_State newState, CXuiScene *scene = NULL); +#else + void changeTutorialState(eTutorial_State newState, UIScene *scene = NULL); +#endif + bool isSelectedItemState(); + + bool setMessage(PopupMessageDetails *message); + bool setMessage(TutorialHint *hint, PopupMessageDetails *message); + bool setMessage(const wstring &message, int icon, int auxValue); + + void showTutorialPopup(bool show); + + void useItemOn(Level *level, shared_ptr item, int x, int y, int z,bool bTestUseOnly=false); + void useItemOn(shared_ptr item, bool bTestUseOnly=false); + void completeUsingItem(shared_ptr item); + void startDestroyBlock(shared_ptr item, Tile *tile); + void destroyBlock(Tile *tile); + void attack(shared_ptr player, shared_ptr entity); + void itemDamaged(shared_ptr item); + + void handleUIInput(int iAction); + void createItemSelected(shared_ptr item, bool canMake); + void onCrafted(shared_ptr item); + void onTake(shared_ptr item, unsigned int invItemCountAnyAux, unsigned int invItemCountThisAux); + void onSelectedItemChanged(shared_ptr item); + void onLookAt(int id, int iData=0); + void onLookAtEntity(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); + bool isInputAllowed(int mapping); + + void AddGlobalConstraint(TutorialConstraint *c); + void AddConstraint(TutorialConstraint *c); + void RemoveConstraint(TutorialConstraint *c, bool delayedRemove = false); + void addTask(eTutorial_State state, TutorialTask *t); + void addHint(eTutorial_State state, TutorialHint *h); + void addMessage(int messageId, bool limitRepeats = false, unsigned char numRepeats = TUTORIAL_MESSAGE_DEFAULT_SHOW); + + int GetTutorialDisplayMessageTime() {return m_iTutorialDisplayMessageTime;} + + // Only for the main gameplay tutorial + vector *getTasks(); + unsigned int getCurrentTaskIndex(); + +#ifdef _XBOX + CXuiScene *getScene() { return m_UIScene; } +#else + UIScene *getScene() { return m_UIScene; } +#endif + eTutorial_State getCurrentState() { return m_CurrentState; } + + // These are required so that we have a consistent mapping of the completion bits stored in the profile data + static void staticCtor(); + static vector s_completableTasks; + + static void debugResetPlayerSavedProgress(int iPad); +}; diff --git a/Minecraft.Client/Common/Tutorial/TutorialConstraint.h b/Minecraft.Client/Common/Tutorial/TutorialConstraint.h new file mode 100644 index 00000000..877fd57e --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/TutorialConstraint.h @@ -0,0 +1,41 @@ +#pragma once + +// 4J Stu - An abstract class that represents a constraint on what the user is able to do +class TutorialConstraint +{ +private: + int descriptionId; + bool m_deleteOnDeactivate; + bool m_queuedForRemoval; +public: + enum ConstraintType + { + e_ConstraintInput = 0, // Constraint on controller input + e_ConstraintArea, + e_ConstraintAllInput, + e_ConstraintXuiInput, + e_ConstraintChangeState, + }; + + TutorialConstraint(int descriptionId) : descriptionId( descriptionId ), m_deleteOnDeactivate( false ), m_queuedForRemoval( false ) {} + virtual ~TutorialConstraint() {} + + int getDescriptionId() { return descriptionId; } + + virtual ConstraintType getType() = 0; + + virtual void tick(int iPad) {} + virtual bool isConstraintSatisfied(int iPad) { return true; } + virtual bool isConstraintRestrictive(int iPad) { return true; } + + virtual bool isMappingConstrained(int iPad, int mapping) { return false;} + virtual bool isXuiInputConstrained(int vk) { return false;} + + void setDeleteOnDeactivate(bool deleteOnDeactivated) { m_deleteOnDeactivate = deleteOnDeactivated; } + bool getDeleteOnDeactivate() { return m_deleteOnDeactivate; } + + void setQueuedForRemoval(bool queued) { m_queuedForRemoval = queued; } + bool getQueuedForRemoval() { return m_queuedForRemoval; } + + virtual bool canMoveToPosition(double xo, double yo, double zo, double xt, double yt, double zt) { return true; } +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/TutorialConstraints.h b/Minecraft.Client/Common/Tutorial/TutorialConstraints.h new file mode 100644 index 00000000..74bb8935 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/TutorialConstraints.h @@ -0,0 +1,4 @@ +#include "TutorialConstraint.h" +#include "AreaConstraint.h" +#include "ChangeStateConstraint.h" +#include "InputConstraint.h" \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/TutorialEnum.h b/Minecraft.Client/Common/Tutorial/TutorialEnum.h new file mode 100644 index 00000000..1de6bbad --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/TutorialEnum.h @@ -0,0 +1,347 @@ +#pragma once + +typedef struct { + WORD index; + DWORD diffsSize; + BYTE *diffs; + DWORD lastByteChanged; +} TutorialDiff_Chunk; + +typedef struct { + DWORD diffCount; + TutorialDiff_Chunk *diffs; +} TutorialDiff_File; + +#define TUTORIAL_NO_TEXT -1 +#define TUTORIAL_NO_ICON -1 + +// If you want to make these bigger, be aware that that will affect what is stored after the tutorial data in the profile data +// See Xbox_App.h for the struct +#define TUTORIAL_PROFILE_STORAGE_BITS 512 +#define TUTORIAL_PROFILE_STORAGE_BYTES (TUTORIAL_PROFILE_STORAGE_BITS/8) + +// 4J Stu - The total number of eTutorial_State and eTutorial_Hint must be less than 512, as we only have 512 bits of profile +// data to flag whether or not the player has seen them +// In general a block or tool will have one each. We have a state if we need more than one message, or a hint if just once +// message will suffice +// Tasks added here should also be added in the Tutorial::staticCtor() if you wish to store completion in the profile data +enum eTutorial_State +{ + e_Tutorial_State_Any = -2, + e_Tutorial_State_None = -1, + + e_Tutorial_State_Gameplay = 0, + + e_Tutorial_State_Inventory_Menu, + e_Tutorial_State_2x2Crafting_Menu, + e_Tutorial_State_3x3Crafting_Menu, + e_Tutorial_State_Furnace_Menu, + + e_Tutorial_State_Riding_Minecart, + e_Tutorial_State_Riding_Boat, + e_Tutorial_State_Fishing, + + e_Tutorial_State_Bed, + + e_Tutorial_State_Container_Menu, + e_Tutorial_State_Trap_Menu, + e_Tutorial_State_Redstone_And_Piston, + e_Tutorial_State_Portal, + e_Tutorial_State_Creative_Inventory_Menu, // Added TU5 + e_Tutorial_State_Food_Bar, // Added TU5 + e_Tutorial_State_CreativeMode, // Added TU7 + e_Tutorial_State_Brewing, + e_Tutorial_State_Brewing_Menu, + e_Tutorial_State_Enchanting, + e_Tutorial_State_Enchanting_Menu, + e_Tutorial_State_Farming, + e_Tutorial_State_Breeding, + e_Tutorial_State_Golem, + e_Tutorial_State_Trading, + e_Tutorial_State_Trading_Menu, + e_Tutorial_State_Anvil, + e_Tutorial_State_Anvil_Menu, + e_Tutorial_State_Enderchests, + e_Tutorial_State_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 +}; + +// Hints added here should also be added in the Tutorial::staticCtor() if you wish to store completion in the profile data +enum eTutorial_Hint +{ + e_Tutorial_Hint_Always_On = e_Tutorial_State_Max, + + e_Tutorial_Hint_Hold_To_Mine, + e_Tutorial_Hint_Tool_Damaged, + e_Tutorial_Hint_Swim_Up, + + e_Tutorial_Hint_Unused_2, + e_Tutorial_Hint_Unused_3, + e_Tutorial_Hint_Unused_4, + e_Tutorial_Hint_Unused_5, + e_Tutorial_Hint_Unused_6, + e_Tutorial_Hint_Unused_7, + e_Tutorial_Hint_Unused_8, + e_Tutorial_Hint_Unused_9, + e_Tutorial_Hint_Unused_10, + + e_Tutorial_Hint_Rock, + e_Tutorial_Hint_Stone, + e_Tutorial_Hint_Planks, + e_Tutorial_Hint_Sapling, + e_Tutorial_Hint_Unbreakable, + e_Tutorial_Hint_Water, + e_Tutorial_Hint_Lava, + e_Tutorial_Hint_Sand, + e_Tutorial_Hint_Gravel, + e_Tutorial_Hint_Gold_Ore, + e_Tutorial_Hint_Iron_Ore, + e_Tutorial_Hint_Coal_Ore, + e_Tutorial_Hint_Tree_Trunk, + e_Tutorial_Hint_Leaves, + e_Tutorial_Hint_Glass, + e_Tutorial_Hint_Lapis_Ore, + e_Tutorial_Hint_Lapis_Block, + e_Tutorial_Hint_Dispenser, + e_Tutorial_Hint_Sandstone, + e_Tutorial_Hint_Note_Block, + e_Tutorial_Hint_Powered_Rail, + e_Tutorial_Hint_Detector_Rail, + e_Tutorial_Hint_Tall_Grass, + e_Tutorial_Hint_Wool, + e_Tutorial_Hint_Flower, + e_Tutorial_Hint_Mushroom, + e_Tutorial_Hint_Gold_Block, + e_Tutorial_Hint_Iron_Block, + e_Tutorial_Hint_Stone_Slab, + e_Tutorial_Hint_Red_Brick, + e_Tutorial_Hint_Tnt, + e_Tutorial_Hint_Bookshelf, + e_Tutorial_Hint_Moss_Stone, + e_Tutorial_Hint_Obsidian, + e_Tutorial_Hint_Torch, + e_Tutorial_Hint_MobSpawner, + e_Tutorial_Hint_Chest, + e_Tutorial_Hint_Redstone, + e_Tutorial_Hint_Diamond_Ore, + e_Tutorial_Hint_Diamond_Block, + e_Tutorial_Hint_Crafting_Table, + e_Tutorial_Hint_Crops, + e_Tutorial_Hint_Farmland, + e_Tutorial_Hint_Furnace, + e_Tutorial_Hint_Sign, + e_Tutorial_Hint_Door_Wood, + e_Tutorial_Hint_Ladder, + e_Tutorial_Hint_Stairs_Stone, + e_Tutorial_Hint_Rail, + e_Tutorial_Hint_Lever, + e_Tutorial_Hint_PressurePlate, + e_Tutorial_Hint_Door_Iron, + e_Tutorial_Hint_Redstone_Ore, + e_Tutorial_Hint_Redstone_Torch, + e_Tutorial_Hint_Button, + e_Tutorial_Hint_Snow, + e_Tutorial_Hint_Ice, + e_Tutorial_Hint_Cactus, + e_Tutorial_Hint_Clay, + e_Tutorial_Hint_Sugarcane, + e_Tutorial_Hint_Record_Player, + e_Tutorial_Hint_Pumpkin, + e_Tutorial_Hint_Hell_Rock, + e_Tutorial_Hint_Hell_Sand, + e_Tutorial_Hint_Glowstone, + e_Tutorial_Hint_Portal, + e_Tutorial_Hint_Pumpkin_Lit, + e_Tutorial_Hint_Cake, + e_Tutorial_Hint_Redstone_Repeater, + e_Tutorial_Hint_Trapdoor, + e_Tutorial_Hint_Piston, + e_Tutorial_Hint_Sticky_Piston, + e_Tutorial_Hint_Monster_Stone_Egg, + e_Tutorial_Hint_Stone_Brick_Smooth, + e_Tutorial_Hint_Huge_Mushroom, + e_Tutorial_Hint_Iron_Fence, + e_Tutorial_Hint_Thin_Glass, + e_Tutorial_Hint_Melon, + e_Tutorial_Hint_Vine, + e_Tutorial_Hint_Fence_Gate, + e_Tutorial_Hint_Mycel, + e_Tutorial_Hint_Water_Lily, + e_Tutorial_Hint_Nether_Brick, + e_Tutorial_Hint_Nether_Fence, + e_Tutorial_Hint_Nether_Stalk, + e_Tutorial_Hint_Enchant_Table, + e_Tutorial_Hint_Brewing_Stand, + e_Tutorial_Hint_Cauldron, + e_Tutorial_Hint_End_Portal, + e_Tutorial_Hint_End_Portal_Frame, + + e_Tutorial_Hint_Squid, + e_Tutorial_Hint_Cow, + e_Tutorial_Hint_Sheep, + e_Tutorial_Hint_Chicken, + e_Tutorial_Hint_Pig, + e_Tutorial_Hint_Wolf, + e_Tutorial_Hint_Creeper, + e_Tutorial_Hint_Skeleton, + e_Tutorial_Hint_Spider, + e_Tutorial_Hint_Zombie, + e_Tutorial_Hint_Pig_Zombie, + e_Tutorial_Hint_Ghast, + e_Tutorial_Hint_Slime, + e_Tutorial_Hint_Enderman, + e_Tutorial_Hint_Silverfish, + e_Tutorial_Hint_Cave_Spider, + e_Tutorial_Hint_MushroomCow, + e_Tutorial_Hint_SnowMan, + e_Tutorial_Hint_IronGolem, + e_Tutorial_Hint_EnderDragon, + e_Tutorial_Hint_Blaze, + e_Tutorial_Hint_Lava_Slime, + e_Tutorial_Hint_Ozelot, + e_Tutorial_Hint_Villager, + e_Tutorial_Hint_Wither, + e_Tutorial_Hint_Witch, + e_Tutorial_Hint_Bat, + e_Tutorial_Hint_Horse, + + e_Tutorial_Hint_Item_Shovel, + e_Tutorial_Hint_Item_Hatchet, + e_Tutorial_Hint_Item_Pickaxe, + e_Tutorial_Hint_Item_Flint_And_Steel, + e_Tutorial_Hint_Item_Apple, + e_Tutorial_Hint_Item_Bow, + e_Tutorial_Hint_Item_Arrow, + e_Tutorial_Hint_Item_Coal, + e_Tutorial_Hint_Item_Diamond, + e_Tutorial_Hint_Item_Iron_Ingot, + e_Tutorial_Hint_Item_Gold_Ingot, + e_Tutorial_Hint_Item_Sword, + e_Tutorial_Hint_Item_Stick, + e_Tutorial_Hint_Item_Bowl, + e_Tutorial_Hint_Item_Mushroom_Stew, + e_Tutorial_Hint_Item_String, + e_Tutorial_Hint_Item_Feather, + e_Tutorial_Hint_Item_Sulphur, + e_Tutorial_Hint_Item_Hoe, + e_Tutorial_Hint_Item_Seeds, + e_Tutorial_Hint_Item_Wheat, + e_Tutorial_Hint_Item_Bread, + e_Tutorial_Hint_Item_Helmet, + e_Tutorial_Hint_Item_Chestplate, + e_Tutorial_Hint_Item_Leggings, + e_Tutorial_Hint_Item_Boots, + e_Tutorial_Hint_Item_Flint, + e_Tutorial_Hint_Item_Porkchop_Raw, + e_Tutorial_Hint_Item_Porkchop_Cooked, + e_Tutorial_Hint_Item_Painting, + e_Tutorial_Hint_Item_Apple_Gold, + e_Tutorial_Hint_Item_Sign, + e_Tutorial_Hint_Item_Door_Wood, + e_Tutorial_Hint_Item_Bucket_Empty, + e_Tutorial_Hint_Item_Bucket_Water, + e_Tutorial_Hint_Item_Bucket_Lava, + e_Tutorial_Hint_Item_Minecart, + e_Tutorial_Hint_Item_Saddle, + e_Tutorial_Hint_Item_Door_Iron, + e_Tutorial_Hint_Item_Redstone, + e_Tutorial_Hint_Item_Snowball, + e_Tutorial_Hint_Item_Boat, + e_Tutorial_Hint_Item_Leather, + e_Tutorial_Hint_Item_Milk, + e_Tutorial_Hint_Item_Brick, + e_Tutorial_Hint_Item_Clay, + e_Tutorial_Hint_Item_Reeds, + e_Tutorial_Hint_Item_Paper, + e_Tutorial_Hint_Item_Book, + e_Tutorial_Hint_Item_Slimeball, + e_Tutorial_Hint_Item_Minecart_Chest, + e_Tutorial_Hint_Item_Minecart_Furnace, + e_Tutorial_Hint_Item_Egg, + e_Tutorial_Hint_Item_Compass, + e_Tutorial_Hint_Item_Clock, + e_Tutorial_Hint_Item_Yellow_Dust, + e_Tutorial_Hint_Item_Fish_Raw, + e_Tutorial_Hint_Item_Fish_Cooked, + e_Tutorial_Hint_Item_Dye_Powder, + e_Tutorial_Hint_Item_Bone, + e_Tutorial_Hint_Item_Sugar, + e_Tutorial_Hint_Item_Cake, + e_Tutorial_Hint_Item_Diode, + e_Tutorial_Hint_Item_Cookie, + e_Tutorial_Hint_Item_Map, + e_Tutorial_Hint_Item_Record, + + e_Tutorial_Hint_White_Stone, + e_Tutorial_Hint_Dragon_Egg, + e_Tutorial_Hint_RedstoneLamp, + e_Tutorial_Hint_Cocoa, + + e_Tutorial_Hint_EmeraldOre, + e_Tutorial_Hint_EmeraldBlock, + e_Tutorial_Hint_EnderChest, + e_Tutorial_Hint_TripwireSource, + e_Tutorial_Hint_Tripwire, + e_Tutorial_Hint_CobblestoneWall, + e_Tutorial_Hint_Flowerpot, + e_Tutorial_Hint_Anvil, + e_Tutorial_Hint_QuartzOre, + e_Tutorial_Hint_QuartzBlock, + e_Tutorial_Hint_WoolCarpet, + + e_Tutorial_Hint_Potato, + e_Tutorial_Hint_Carrot, + + e_Tutorial_Hint_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, +}; + +// We store the first time that we complete these tasks to be used in telemetry +enum eTutorial_Telemetry +{ + eTutorial_Telemetry_None = e_Tutorial_Hint_Item_Max, + + eTutorial_Telemetry_TrialStart, + eTutorial_Telemetry_Halfway, + eTutorial_Telemetry_Complete, + + eTutorial_Telemetry_Unused_1, + eTutorial_Telemetry_Unused_2, + eTutorial_Telemetry_Unused_3, + eTutorial_Telemetry_Unused_4, + eTutorial_Telemetry_Unused_5, + eTutorial_Telemetry_Unused_6, + eTutorial_Telemetry_Unused_7, + eTutorial_Telemetry_Unused_8, + eTutorial_Telemetry_Unused_9, + eTutorial_Telemetry_Unused_10, +}; + +enum eTutorial_CompletionAction +{ + e_Tutorial_Completion_None, + e_Tutorial_Completion_Complete_State, // This will make the current tutorial state complete + e_Tutorial_Completion_Complete_State_Gameplay_Constraints, // This will make the current tutorial state complete, and move the delayed constraints to the gameplay state + e_Tutorial_Completion_Jump_To_Last_Task, +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/TutorialHint.cpp b/Minecraft.Client/Common/Tutorial/TutorialHint.cpp new file mode 100644 index 00000000..5f0808bf --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/TutorialHint.cpp @@ -0,0 +1,128 @@ +#include "stdafx.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.tile.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.h" +#include "Tutorial.h" +#include "TutorialHint.h" +#include "..\..\Minecraft.h" +#include "..\..\MultiplayerLocalPlayer.h" + +TutorialHint::TutorialHint(eTutorial_Hint id, Tutorial *tutorial, int descriptionId, eHintType type, bool allowFade /*= true*/) + : m_id( id ), m_tutorial(tutorial), m_descriptionId( descriptionId ), m_type( type ), m_counter( 0 ), + m_lastTile( NULL ), m_hintNeeded( true ), m_allowFade(allowFade) +{ + tutorial->addMessage(descriptionId, type != e_Hint_NoIngredients); +} + +int TutorialHint::startDestroyBlock(shared_ptr item, Tile *tile) +{ + int returnVal = -1; + switch(m_type) + { + case e_Hint_HoldToMine: + if( tile == m_lastTile && m_hintNeeded ) + { + ++m_counter; + if(m_counter > TUTORIAL_HINT_MAX_MINE_REPEATS) + { + returnVal = m_descriptionId; + } + } + else + { + m_counter = 0; + } + m_lastTile = tile; + break; + default: + break; + } + + return returnVal; +} + +int TutorialHint::destroyBlock(Tile *tile) +{ + int returnVal = -1; + switch(m_type) + { + case e_Hint_HoldToMine: + if(tile == m_lastTile && m_counter > 0) + { + m_hintNeeded = false; + } + break; + default: + break; + } + + return returnVal; +} + +int TutorialHint::attack(shared_ptr item, shared_ptr entity) +{ + /* + switch(m_type) + { + default: + return -1; + } + */ + return -1; +} + +int TutorialHint::createItemSelected(shared_ptr item, bool canMake) +{ + int returnVal = -1; + switch(m_type) + { + case e_Hint_NoIngredients: + if(!canMake) + returnVal = m_descriptionId; + break; + default: + break; + } + return returnVal; +} + +int TutorialHint::itemDamaged(shared_ptr item) +{ + int returnVal = -1; + switch(m_type) + { + case e_Hint_ToolDamaged: + returnVal = m_descriptionId; + break; + default: + break; + } + return returnVal; +} + +bool TutorialHint::onTake( shared_ptr item ) +{ + return false; +} + +bool TutorialHint::onLookAt(int id, int iData) +{ + return false; +} + +bool TutorialHint::onLookAtEntity(eINSTANCEOF type) +{ + return false; +} + +int TutorialHint::tick() +{ + int returnVal = -1; + switch(m_type) + { + case e_Hint_SwimUp: + if( Minecraft::GetInstance()->localplayers[m_tutorial->getPad()]->isUnderLiquid(Material::water) ) returnVal = m_descriptionId; + break; + } + return returnVal; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/TutorialHint.h b/Minecraft.Client/Common/Tutorial/TutorialHint.h new file mode 100644 index 00000000..8ca543cc --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/TutorialHint.h @@ -0,0 +1,53 @@ +#pragma once +using namespace std; + +#include "TutorialEnum.h" + +#define TUTORIAL_HINT_MAX_MINE_REPEATS 20 + +class Level; +class Tutorial; + +class TutorialHint +{ +public: + enum eHintType + { + e_Hint_DiggerItem, + e_Hint_HoldToMine, + e_Hint_NoIngredients, + e_Hint_ToolDamaged, + e_Hint_TakeItem, + e_Hint_Area, + e_Hint_LookAtTile, + e_Hint_LookAtEntity, + e_Hint_SwimUp, + }; + +protected: + eHintType m_type; + int m_descriptionId; + Tutorial *m_tutorial; + eTutorial_Hint m_id; + + int m_counter; + Tile *m_lastTile; + bool m_hintNeeded; + bool m_allowFade; + +public: + TutorialHint(eTutorial_Hint id, Tutorial *tutorial, int descriptionId, eHintType type, bool allowFade = true); + + eTutorial_Hint getId() { return m_id; } + + virtual int startDestroyBlock(shared_ptr item, Tile *tile); + virtual int destroyBlock(Tile *tile); + virtual int attack(shared_ptr item, shared_ptr entity); + virtual int createItemSelected(shared_ptr item, bool canMake); + virtual int itemDamaged(shared_ptr item); + virtual bool onTake( shared_ptr item ); + virtual bool onLookAt(int id, int iData=0); + virtual bool onLookAtEntity(eINSTANCEOF type); + virtual int tick(); + virtual bool allowFade() { return m_allowFade; } +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/TutorialHints.h b/Minecraft.Client/Common/Tutorial/TutorialHints.h new file mode 100644 index 00000000..5c7381ab --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/TutorialHints.h @@ -0,0 +1,7 @@ +#pragma once + +#include "AreaHint.h" +#include "DiggerItemHint.h" +#include "LookAtTileHint.h" +#include "TakeItemHint.h" +#include "LookAtEntityHint.h" \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/TutorialMessage.cpp b/Minecraft.Client/Common/Tutorial/TutorialMessage.cpp new file mode 100644 index 00000000..1f007035 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/TutorialMessage.cpp @@ -0,0 +1,23 @@ +#include "stdafx.h" +#include "TutorialMessage.h" + +TutorialMessage::TutorialMessage(int messageId, bool limitRepeats /*= false*/, unsigned char numRepeats /*= TUTORIAL_MESSAGE_DEFAULT_SHOW*/) + : messageId( messageId ), limitRepeats( limitRepeats ), numRepeats( numRepeats ), timesShown( 0 ) +{ +} + +bool TutorialMessage::canDisplay() +{ + return !limitRepeats || (timesShown < numRepeats); +} + +LPCWSTR TutorialMessage::getMessageForDisplay() +{ + if(!canDisplay()) + return L""; + + if(limitRepeats) + ++timesShown; + + return app.GetString( messageId ); +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/TutorialMessage.h b/Minecraft.Client/Common/Tutorial/TutorialMessage.h new file mode 100644 index 00000000..6a0b4d46 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/TutorialMessage.h @@ -0,0 +1,20 @@ +#pragma once + +// The default number of times any message should be shown +#define TUTORIAL_MESSAGE_DEFAULT_SHOW 3 + +class TutorialMessage +{ +private: + int messageId; + bool limitRepeats; + unsigned char numRepeats; + unsigned char timesShown; + DWORD lastDisplayed; + +public: + TutorialMessage(int messageId, bool limitRepeats = false, unsigned char numRepeats = TUTORIAL_MESSAGE_DEFAULT_SHOW); + + bool canDisplay(); + LPCWSTR getMessageForDisplay(); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/TutorialMode.cpp b/Minecraft.Client/Common/Tutorial/TutorialMode.cpp new file mode 100644 index 00000000..82c81598 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/TutorialMode.cpp @@ -0,0 +1,124 @@ +#include "stdafx.h" +#include +#include "..\..\Minecraft.h" +#include "..\..\MultiplayerLocalPlayer.h" +#include "..\..\MultiPlayerLevel.h" +#include "..\..\..\Minecraft.World\Inventory.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.tile.h" +#include "TutorialMode.h" + +TutorialMode::TutorialMode(int iPad, Minecraft *minecraft, ClientConnection *connection) : MultiPlayerGameMode( minecraft, connection ), m_iPad( iPad ) +{ +} + +TutorialMode::~TutorialMode() +{ + if(tutorial != NULL) + delete tutorial; +} + +void TutorialMode::startDestroyBlock(int x, int y, int z, int face) +{ + if(!tutorial->m_allTutorialsComplete) + { + int t = minecraft->level->getTile(x, y, z); + tutorial->startDestroyBlock(minecraft->player->inventory->getSelected(), Tile::tiles[t]); + } + MultiPlayerGameMode::startDestroyBlock( x, y, z, face ); +} + +bool TutorialMode::destroyBlock(int x, int y, int z, int face) +{ + if(!tutorial->m_allTutorialsComplete) + { + int t = minecraft->level->getTile(x, y, z); + tutorial->destroyBlock(Tile::tiles[t]); + } + shared_ptr item = minecraft->player->getSelectedItem(); + int damageBefore; + if(item != NULL) + { + damageBefore = item->getDamageValue(); + } + bool changed = MultiPlayerGameMode::destroyBlock( x, y, z, face ); + + if(!tutorial->m_allTutorialsComplete) + { + if ( item != NULL && item->isDamageableItem() ) + { + int max = item->getMaxDamage(); + int damageNow = item->getDamageValue(); + + if(damageNow > damageBefore && damageNow > (max/2) ) + { + tutorial->itemDamaged( item ); + } + } + } + + return changed; +} + +void TutorialMode::tick() +{ + MultiPlayerGameMode::tick(); + + if(!tutorial->m_allTutorialsComplete) + tutorial->tick(); + + /* + if( tutorial.m_allTutorialsComplete && (tutorial.lastMessageTime + m_iTutorialDisplayMessageTime) < GetTickCount() ) + { + // Exit tutorial + minecraft->gameMode = new SurvivalMode( this ); + delete this; + } + */ +} + +bool TutorialMode::useItemOn(shared_ptr player, Level *level, shared_ptr item, int x, int y, int z, int face, Vec3 *hit, bool bTestUseOnly, bool *pbUsedItem) +{ + bool haveItem = false; + int itemCount = 0; + if(!tutorial->m_allTutorialsComplete) + { + tutorial->useItemOn(level, item, x, y, z, bTestUseOnly); + + if(!bTestUseOnly) + { + if(item != NULL) + { + haveItem = true; + itemCount = item->count; + } + } + } + bool result = MultiPlayerGameMode::useItemOn( player, level, item, x, y, z, face, hit, bTestUseOnly, pbUsedItem ); + + if(!bTestUseOnly) + { + if(!tutorial->m_allTutorialsComplete) + { + if( result && haveItem && itemCount > item->count ) + { + tutorial->useItemOn(item); + } + } + } + return result; +} + +void TutorialMode::attack(shared_ptr player, shared_ptr entity) +{ + if(!tutorial->m_allTutorialsComplete) + tutorial->attack(player, entity); + + MultiPlayerGameMode::attack( player, entity ); +} + +bool TutorialMode::isInputAllowed(int mapping) +{ + return tutorial->m_allTutorialsComplete || tutorial->isInputAllowed( mapping ); +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/TutorialMode.h b/Minecraft.Client/Common/Tutorial/TutorialMode.h new file mode 100644 index 00000000..75e24edf --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/TutorialMode.h @@ -0,0 +1,28 @@ +#pragma once +using namespace std; + +#include "..\..\MultiPlayerGameMode.h" +#include "Tutorial.h" + +class TutorialMode : public MultiPlayerGameMode +{ +protected: + Tutorial *tutorial; + int m_iPad; + + // Function to make this an abstract class + virtual bool isImplemented() = 0; +public: + TutorialMode(int iPad, Minecraft *minecraft, ClientConnection *connection); + virtual ~TutorialMode(); + + virtual void startDestroyBlock(int x, int y, int z, int face); + virtual bool destroyBlock(int x, int y, int z, int face); + virtual void tick(); + virtual bool useItemOn(shared_ptr player, Level *level, shared_ptr item, int x, int y, int z, int face, Vec3 *hit, bool bTestUseOnly=false, bool *pbUsedItem=NULL); + virtual void attack(shared_ptr player, shared_ptr entity); + + virtual bool isInputAllowed(int mapping); + + Tutorial *getTutorial() { return tutorial; } +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/TutorialTask.cpp b/Minecraft.Client/Common/Tutorial/TutorialTask.cpp new file mode 100644 index 00000000..2251ab07 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/TutorialTask.cpp @@ -0,0 +1,78 @@ +#include "stdafx.h" +#include "Tutorial.h" +#include "TutorialConstraints.h" +#include "TutorialTask.h" + +TutorialTask::TutorialTask(Tutorial *tutorial, int descriptionId, bool enablePreCompletion, vector *inConstraints, + bool bShowMinimumTime, bool bAllowFade, bool bTaskReminders) + : tutorial( tutorial ), descriptionId( descriptionId ), m_promptId( -1 ), enablePreCompletion( enablePreCompletion ), + areConstraintsEnabled( false ), bIsCompleted( false ), bHasBeenActivated( false ), + m_bAllowFade(bAllowFade), m_bTaskReminders(bTaskReminders), m_bShowMinimumTime( bShowMinimumTime), m_bShownForMinimumTime( false ) +{ + if(inConstraints != NULL) + { + for(AUTO_VAR(it, inConstraints->begin()); it < inConstraints->end(); ++it) + { + TutorialConstraint *constraint = *it; + constraints.push_back( constraint ); + } + delete inConstraints; + } + + tutorial->addMessage(descriptionId); +} + +TutorialTask::~TutorialTask() +{ + enableConstraints(false); + + for(AUTO_VAR(it, constraints.begin()); it < constraints.end(); ++it) + { + TutorialConstraint *constraint = *it; + + if( constraint->getQueuedForRemoval() ) + { + constraint->setDeleteOnDeactivate(true); + } + else + { + delete constraint; + } + } +} + +void TutorialTask::taskCompleted() +{ + if( areConstraintsEnabled == true ) + enableConstraints( false ); +} + +void TutorialTask::enableConstraints(bool enable, bool delayRemove /*= false*/) +{ + if( !enable && (areConstraintsEnabled || !delayRemove) ) + { + // Remove + for(AUTO_VAR(it, constraints.begin()); it != constraints.end(); ++it) + { + TutorialConstraint *constraint = *it; + //app.DebugPrintf(">>>>>>>> %i\n", constraints.size()); + tutorial->RemoveConstraint( constraint, delayRemove ); + } + areConstraintsEnabled = false; + } + else if( !areConstraintsEnabled && enable ) + { + // Add + for(AUTO_VAR(it, constraints.begin()); it != constraints.end(); ++it) + { + TutorialConstraint *constraint = *it; + tutorial->AddConstraint( constraint ); + } + areConstraintsEnabled = true; + } +} + +void TutorialTask::setAsCurrentTask(bool active /*= true*/) +{ + bHasBeenActivated = active; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/TutorialTask.h b/Minecraft.Client/Common/Tutorial/TutorialTask.h new file mode 100644 index 00000000..b589ab27 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/TutorialTask.h @@ -0,0 +1,67 @@ +#pragma once +using namespace std; +#include "TutorialEnum.h" + +class Level; +class Tutorial; +class TutorialConstraint; +class MobEffect; +class Entity; + +// A class that represents each individual task in the tutorial. +// +// Members: +// enablePreCompletion - If this is true, then the player can complete this task out of sequence. +// This stops us asking them to do things they have already done +// constraints - A list of constraints which can be activated (as a whole). +// If they are active, then the constraints are removed when the task is completed +// areConstraintsEnabled- A flag which records whether or not we have added the constraints to the tutorial +class TutorialTask +{ +protected: + int descriptionId; + int m_promptId; + Tutorial *tutorial; + bool enablePreCompletion; + bool bHasBeenActivated; + bool m_bAllowFade; + bool m_bTaskReminders; + bool m_bShowMinimumTime; + +protected: + bool bIsCompleted; + bool m_bShownForMinimumTime; + vector constraints; + bool areConstraintsEnabled; +public: + TutorialTask(Tutorial *tutorial, int descriptionId, bool enablePreCompletion, vector *inConstraints, bool bShowMinimumTime=false, bool bAllowFade=true, bool bTaskReminders=true ); + virtual ~TutorialTask(); + + virtual int getDescriptionId() { return descriptionId; } + virtual int getPromptId() { return m_promptId; } + + virtual bool isCompleted() = 0; + virtual eTutorial_CompletionAction getCompletionAction() { return e_Tutorial_Completion_None; } + virtual bool isPreCompletionEnabled() { return enablePreCompletion; } + virtual void taskCompleted(); + virtual void enableConstraints(bool enable, bool delayRemove = false); + virtual void setAsCurrentTask(bool active = true); + + virtual void setShownForMinimumTime() { m_bShownForMinimumTime = true; } + virtual bool hasBeenActivated() { return bHasBeenActivated; } + virtual bool AllowFade() { return m_bAllowFade;} + bool TaskReminders() { return m_bTaskReminders;} + virtual bool ShowMinimumTime() { return m_bShowMinimumTime;} + + virtual void useItemOn(Level *level, shared_ptr item, int x, int y, int z, bool bTestUseOnly=false) { } + virtual void useItem(shared_ptr item,bool bTestUseOnly=false) { } + virtual void completeUsingItem(shared_ptr item) { } + virtual void handleUIInput(int iAction) { } + virtual void onCrafted(shared_ptr item) { } + virtual void onTake(shared_ptr item, unsigned int invItemCountAnyAux, unsigned int invItemCountThisAux) { } + virtual void onStateChange(eTutorial_State newState) { } + virtual void onEffectChanged(MobEffect *effect, bool bRemoved=false) { } + + 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 new file mode 100644 index 00000000..b3db973f --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/TutorialTasks.h @@ -0,0 +1,18 @@ +#include "StatTask.h" +#include "CraftTask.h" +#include "PickupTask.h" +#include "UseTileTask.h" +#include "UseItemTask.h" +#include "InfoTask.h" +#include "ControllerTask.h" +#include "ProcedureCompoundTask.h" +#include "XuiCraftingTask.h" +#include "StateChangeTask.h" +#include "ChoiceTask.h" +#include "HorseChoiceTask.h" +#include "RideEntityTask.h" +#include "FullTutorialActiveTask.h" +#include "AreaTask.h" +#include "ProgressFlagTask.h" +#include "CompleteUsingItemTask.h" +#include "EffectChangedTask.h" \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/UseItemTask.cpp b/Minecraft.Client/Common/Tutorial/UseItemTask.cpp new file mode 100644 index 00000000..09bac4d1 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/UseItemTask.cpp @@ -0,0 +1,25 @@ +#include "stdafx.h" +#include "..\..\..\Minecraft.World\Entity.h" +#include "..\..\..\Minecraft.World\Level.h" +#include "..\..\..\Minecraft.World\ItemInstance.h" +#include "UseItemTask.h" + +UseItemTask::UseItemTask(const int itemId, Tutorial *tutorial, int descriptionId, + bool enablePreCompletion, vector *inConstraints, bool bShowMinimumTime, bool bAllowFade, bool bTaskReminders) + : TutorialTask( tutorial, descriptionId, enablePreCompletion, inConstraints, bShowMinimumTime, bAllowFade, bTaskReminders ), + itemId( itemId ) +{ +} + +bool UseItemTask::isCompleted() +{ + return bIsCompleted; +} + +void UseItemTask::useItem(shared_ptr item,bool bTestUseOnly) +{ + if(bTestUseOnly) return; + + if( item->id == itemId ) + bIsCompleted = true; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/UseItemTask.h b/Minecraft.Client/Common/Tutorial/UseItemTask.h new file mode 100644 index 00000000..6c729540 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/UseItemTask.h @@ -0,0 +1,19 @@ +#pragma once +using namespace std; + +#include "TutorialTask.h" + +class Level; + +// 4J Stu - Tasks that involve placing a tile +class UseItemTask : public TutorialTask +{ +private: + const int itemId; + +public: + UseItemTask(const int itemId, Tutorial *tutorial, int descriptionId, + bool enablePreCompletion = false, vector *inConstraints = NULL, bool bShowMinimumTime = false, bool bAllowFade = true, bool bTaskReminders = true ); + virtual bool isCompleted(); + virtual void useItem(shared_ptr item, bool bTestUseOnly=false); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/UseTileTask.cpp b/Minecraft.Client/Common/Tutorial/UseTileTask.cpp new file mode 100644 index 00000000..1f4ed4cb --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/UseTileTask.cpp @@ -0,0 +1,40 @@ +#include "stdafx.h" +#include "..\..\..\Minecraft.World\Entity.h" +#include "..\..\..\Minecraft.World\Level.h" +#include "..\..\..\Minecraft.World\ItemInstance.h" +#include "UseTileTask.h" + +UseTileTask::UseTileTask(const int tileId, int x, int y, int z, Tutorial *tutorial, int descriptionId, + bool enablePreCompletion, vector *inConstraints, bool bShowMinimumTime, bool bAllowFade, bool bTaskReminders) + : TutorialTask( tutorial, descriptionId, enablePreCompletion, inConstraints, bShowMinimumTime, bAllowFade, bTaskReminders ), + x( x ), y( y ), z( z ), tileId( tileId ) +{ + useLocation = true; +} + +UseTileTask::UseTileTask(const int tileId, Tutorial *tutorial, int descriptionId, + bool enablePreCompletion, vector *inConstraints, bool bShowMinimumTime, bool bAllowFade, bool bTaskReminders) + : TutorialTask( tutorial, descriptionId, enablePreCompletion, inConstraints, bShowMinimumTime, bAllowFade, bTaskReminders ), + tileId( tileId ) +{ + useLocation = false; +} + +bool UseTileTask::isCompleted() +{ + return bIsCompleted; +} + +void UseTileTask::useItemOn(Level *level, shared_ptr item, int x, int y, int z,bool bTestUseOnly) +{ + if(bTestUseOnly) return; + + if( !enablePreCompletion && !bHasBeenActivated) return; + + if( !useLocation || ( x == this->x && y == this->y && z == this->z ) ) + { + int t = level->getTile(x, y, z); + if( t == tileId ) + bIsCompleted = true; + } +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/UseTileTask.h b/Minecraft.Client/Common/Tutorial/UseTileTask.h new file mode 100644 index 00000000..74b3a40c --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/UseTileTask.h @@ -0,0 +1,24 @@ +#pragma once +using namespace std; + +#include "TutorialTask.h" + +class Level; + +// 4J Stu - Tasks that involve using a tile, with or without an item. e.g. Opening a chest +class UseTileTask : public TutorialTask +{ +private: + int x,y,z; + const int tileId; + bool useLocation; + bool completed; + +public: + UseTileTask(const int tileId, int x, int y, int z, Tutorial *tutorial, int descriptionId, + bool enablePreCompletion = false, vector *inConstraints = NULL, bool bShowMinimumTime = false, bool bAllowFade = true, bool bTaskReminders = true ); + UseTileTask(const int tileId, Tutorial *tutorial, int descriptionId, + bool enablePreCompletion = false, vector *inConstraints = NULL, bool bShowMinimumTime = false, bool bAllowFade = true, bool bTaskReminders = true); + virtual bool isCompleted(); + virtual void useItemOn(Level *level, shared_ptr item, int x, int y, int z, bool bTestUseOnly=false); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/XuiCraftingTask.cpp b/Minecraft.Client/Common/Tutorial/XuiCraftingTask.cpp new file mode 100644 index 00000000..71b88479 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/XuiCraftingTask.cpp @@ -0,0 +1,42 @@ +#include "stdafx.h" +#include "..\..\..\Minecraft.World\ItemInstance.h" +#if !(defined _XBOX) && !(defined __PSVITA__) +#include "..\UI\UI.h" +#endif +#include "Tutorial.h" +#include "XuiCraftingTask.h" + +bool XuiCraftingTask::isCompleted() +{ +#ifndef __PSVITA__ + // This doesn't seem to work + //IUIScene_CraftingMenu *craftScene = reinterpret_cast(tutorial->getScene()); +#ifdef _XBOX + CXuiSceneCraftingPanel *craftScene = (CXuiSceneCraftingPanel *)(tutorial->getScene()); +#else + UIScene_CraftingMenu *craftScene = reinterpret_cast(tutorial->getScene()); +#endif + + bool completed = false; + + switch(m_type) + { + case e_Crafting_SelectGroup: + if(craftScene != NULL && craftScene->getCurrentGroup() == m_group) + { + completed = true; + } + break; + case e_Crafting_SelectItem: + if(craftScene != NULL && craftScene->isItemSelected(m_item)) + { + completed = true; + } + break; + } + + return completed; +#else + return true; +#endif +} diff --git a/Minecraft.Client/Common/Tutorial/XuiCraftingTask.h b/Minecraft.Client/Common/Tutorial/XuiCraftingTask.h new file mode 100644 index 00000000..2dc48709 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/XuiCraftingTask.h @@ -0,0 +1,36 @@ +#pragma once +#include "TutorialTask.h" +#include "..\..\..\Minecraft.World\Recipy.h" + +class XuiCraftingTask : public TutorialTask +{ +public: + enum eCraftingTaskType + { + e_Crafting_SelectGroup, + e_Crafting_SelectItem, + }; + + // Select group + XuiCraftingTask(Tutorial *tutorial, int descriptionId, Recipy::_eGroupType groupToSelect, bool enablePreCompletion = false, vector *inConstraints = NULL, + bool bShowMinimumTime=false, bool bAllowFade=true, bool m_bTaskReminders=true ) + : TutorialTask(tutorial, descriptionId, enablePreCompletion, inConstraints, bShowMinimumTime, bAllowFade, m_bTaskReminders ), + m_group(groupToSelect), + m_type( e_Crafting_SelectGroup ) + {} + + // Select Item + XuiCraftingTask(Tutorial *tutorial, int descriptionId, int itemId, bool enablePreCompletion = false, vector *inConstraints = NULL, + bool bShowMinimumTime=false, bool bAllowFade=true, bool m_bTaskReminders=true ) + : TutorialTask(tutorial, descriptionId, enablePreCompletion, inConstraints, bShowMinimumTime, bAllowFade, m_bTaskReminders ), + m_item(itemId), + m_type( e_Crafting_SelectItem ) + {} + + virtual bool isCompleted(); + +private: + eCraftingTaskType m_type; + Recipy::_eGroupType m_group; + int m_item; +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/IUIController.h b/Minecraft.Client/Common/UI/IUIController.h new file mode 100644 index 00000000..3040c2cc --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIController.h @@ -0,0 +1,77 @@ +#pragma once + +#include "UIEnums.h" + +// 4J Stu - An interface class that defines all the public functions that we use within the game code. This allows us to build the Xbox 360 version without +// using the base UIController class used by the other platforms +class IUIController +{ +public: + virtual void tick() = 0; + virtual void render() = 0; + virtual void StartReloadSkinThread() = 0; + virtual bool IsReloadingSkin() = 0; + virtual void CleanUpSkinReload() = 0; + virtual bool NavigateToScene(int iPad, EUIScene scene, void *initData = NULL, EUILayer layer = eUILayer_Scene, EUIGroup group = eUIGroup_PAD) = 0; + virtual bool NavigateBack(int iPad, bool forceUsePad = false, EUIScene eScene = eUIScene_COUNT, EUILayer eLayer = eUILayer_COUNT) = 0; + virtual void CloseUIScenes(int iPad, bool forceIPad = false) = 0; + virtual void CloseAllPlayersScenes() = 0; + + virtual bool IsPauseMenuDisplayed(int iPad) = 0; + virtual bool IsContainerMenuDisplayed(int iPad) = 0; + virtual bool IsIgnorePlayerJoinMenuDisplayed(int iPad) = 0; + virtual bool IsIgnoreAutosaveMenuDisplayed(int iPad) = 0; + virtual void SetIgnoreAutosaveMenuDisplayed(int iPad, bool displayed) = 0; + virtual bool IsSceneInStack(int iPad, EUIScene eScene) = 0; + virtual bool GetMenuDisplayed(int iPad) = 0; + virtual void CheckMenuDisplayed() = 0; + + virtual void SetTooltipText( unsigned int iPad, unsigned int tooltip, int iTextID ) = 0; + virtual void SetEnableTooltips( unsigned int iPad, BOOL bVal ) = 0; + virtual void ShowTooltip( unsigned int iPad, unsigned int tooltip, bool show ) = 0; + virtual void SetTooltips( unsigned int iPad, int iA, int iB=-1, int iX=-1, int iY=-1 , int iLT=-1, int iRT=-1, int iLB=-1, int iRB=-1, int iLS=-1, 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; + + virtual void PlayUISFX(ESoundEffect eSound) = 0; + + virtual void ShowUIDebugConsole(bool show) {} + virtual void ShowUIDebugMarketingGuide(bool show) {} + + virtual void DisplayGamertag(unsigned int iPad, bool show) = 0; + virtual void SetSelectedItem(unsigned int iPad, const wstring &name) = 0; + virtual void UpdateSelectedItemPos(unsigned int iPad) = 0; + + virtual void HandleDLCMountingComplete() = 0; + virtual void HandleDLCInstalled(int iPad) = 0; +#ifdef _XBOX_ONE + virtual void HandleDLCLicenseChange() = 0; +#endif + virtual void HandleTMSDLCFileRetrieved(int iPad) = 0; + virtual void HandleTMSBanFileRetrieved(int iPad) = 0; + virtual void HandleInventoryUpdated(int iPad) = 0; + virtual void HandleGameTick() = 0; + + virtual void SetTutorialDescription(int iPad, TutorialPopupInfo *info) = 0; + virtual void SetTutorialVisible(int iPad, bool visible) = 0; + virtual bool IsTutorialVisible(int iPad) = 0; + + virtual void UpdatePlayerBasePositions() = 0; + virtual void SetEmptyQuadrantLogo(int iSection) = 0; + virtual void HideAllGameUIElements() = 0; + virtual void ShowOtherPlayersBaseScene(unsigned int iPad, bool show) = 0; + + virtual void ShowTrialTimer(bool show) = 0; + virtual void SetTrialTimerLimitSecs(unsigned int uiSeconds) = 0; + virtual void UpdateTrialTimer(unsigned int iPad) = 0; + virtual void ReduceTrialTimerValue() = 0; + + virtual void ShowAutosaveCountdownTimer(bool show) = 0; + virtual void UpdateAutosaveCountdownTimer(unsigned int uiSeconds) = 0; + virtual void ShowSavingMessage(unsigned int iPad, C4JStorage::ESavingMessage eVal) = 0; + + virtual bool PressStartPlaying(unsigned int iPad) = 0; + virtual void ShowPressStart(unsigned int iPad) = 0; + + virtual void SetWinUserIndex(unsigned int iPad) = 0; +}; diff --git a/Minecraft.Client/Common/UI/IUIScene_AbstractContainerMenu.cpp b/Minecraft.Client/Common/UI/IUIScene_AbstractContainerMenu.cpp new file mode 100644 index 00000000..1f612e95 --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_AbstractContainerMenu.cpp @@ -0,0 +1,1614 @@ +#include "stdafx.h" + +#include "IUIScene_AbstractContainerMenu.h" + +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.crafting.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.tile.entity.h" +#include "..\..\MultiplayerLocalPlayer.h" +#include "..\..\Minecraft.h" + +#ifdef __ORBIS__ +#include +#endif + +IUIScene_AbstractContainerMenu::IUIScene_AbstractContainerMenu() +{ + m_menu = NULL; + m_autoDeleteMenu = false; + m_lastPointerLabelSlot = NULL; + + m_pointerPos.x = 0.0f; + m_pointerPos.y = 0.0f; + +} + +IUIScene_AbstractContainerMenu::~IUIScene_AbstractContainerMenu() +{ + // Delete associated menu if we were requested to on initialisation. Most menus are + // created just before calling CXuiSceneAbstractContainer::Initialize, but the player's inventorymenu + // is also passed directly and we don't want to go deleting that + if( m_autoDeleteMenu ) delete m_menu; +} + +void IUIScene_AbstractContainerMenu::Initialize(int iPad, AbstractContainerMenu* menu, bool autoDeleteMenu, int startIndex,ESceneSection firstSection,ESceneSection maxSection, bool bNavigateBack) +{ + assert( menu != NULL ); + + m_menu = menu; + m_autoDeleteMenu = autoDeleteMenu; + + Minecraft::GetInstance()->localplayers[iPad]->containerMenu = menu; + + // 4J WESTY - New tool tips to support pointer prototype. + //UpdateTooltips(); + // Default tooltips. + for ( int i = 0; i < eToolTipNumButtons; ++i ) + { + m_aeToolTipSettings[ i ] = eToolTipNone; + } + // 4J-PB - don't set the eToolTipPickupPlace_OLD here - let the timer do it. + /*SetToolTip( eToolTipButtonA, eToolTipPickupPlace_OLD );*/ + SetToolTip( eToolTipButtonB, eToolTipExit ); + SetToolTip( eToolTipButtonA, eToolTipNone ); + SetToolTip( eToolTipButtonX, eToolTipNone ); + SetToolTip( eToolTipButtonY, eToolTipNone ); + + // 4J WESTY : To indicate if pointer has left menu window area. + m_bPointerOutsideMenu = false; + + // 4J Stu - Store the enum range for the current scene + m_eFirstSection = firstSection; + m_eMaxSection = maxSection; + + m_iConsectiveInputTicks = 0; + + m_bNavigateBack = bNavigateBack; + + // Put the pointer over first item in use row to start with. +#ifdef TAP_DETECTION + m_eCurrSection = firstSection; + m_eCurrTapState = eTapStateNoInput; + m_iCurrSlotX = 0; + m_iCurrSlotY = 0; +#endif // TAP_DETECTION + // + // for(int i=0;i= rows) + { + (*piTargetY) = rows - 1; + } + else + { + (*piTargetY) = offsetY; + } + + // Update X + int offsetX = (*piTargetX) - xOffset; + if( offsetX < 0 ) + { + *piTargetX = 0; + } + else if (offsetX >= columns) + { + *piTargetX = columns - 1; + } + else + { + *piTargetX = offsetX; + } + } + else + { + // Update X + int offsetX = (*piTargetX) - xOffset; + if( offsetX < 0 ) + { + *piTargetX = columns - 1; + } + else if (offsetX >= columns) + { + *piTargetX = 0; + } + else + { + *piTargetX = offsetX; + } + } +} + +#ifdef TAP_DETECTION +IUIScene_AbstractContainerMenu::ETapState IUIScene_AbstractContainerMenu::GetTapInputType( float fInputX, float fInputY ) +{ + if ( ( fabs( fInputX ) < 0.3f ) && ( fabs( fInputY ) < 0.3f ) ) + { + return eTapStateNoInput; + } + else if ( ( fInputX < -0.3f ) && ( fabs( fInputY ) < 0.3f ) ) + { + return eTapStateLeft; + } + else if ( ( fInputX > 0.3f ) && ( fabs( fInputY ) < 0.3f ) ) + { + return eTapStateRight; + } + else if ( ( fInputY < -0.3f ) && ( fabs( fInputX ) < 0.3f ) ) + { + return eTapStateDown; + } + else if ( ( fInputY > 0.3f ) && ( fabs( fInputX ) < 0.3f ) ) + { + return eTapStateUp; + } + else + { + return eTapNone; + } +} +#endif // TAP_DETECTION + +void IUIScene_AbstractContainerMenu::SetToolTip( EToolTipButton eButton, EToolTipItem eItem ) +{ + if ( m_aeToolTipSettings[ eButton ] != eItem ) + { + m_aeToolTipSettings[ eButton ] = eItem; + UpdateTooltips(); + } +} + +void IUIScene_AbstractContainerMenu::UpdateTooltips() +{ + // Table gives us text id for tooltip. + static const DWORD kaToolTipextIds[ eNumToolTips ] = + { + IDS_TOOLTIPS_PICKUPPLACE, //eToolTipPickupPlace_OLD + IDS_TOOLTIPS_EXIT, // eToolTipExit + IDS_TOOLTIPS_PICKUP_GENERIC, // eToolTipPickUpGeneric + IDS_TOOLTIPS_PICKUP_ALL, // eToolTipPickUpAll + IDS_TOOLTIPS_PICKUP_HALF, // eToolTipPickUpHalf + IDS_TOOLTIPS_PLACE_GENERIC, // eToolTipPlaceGeneric + IDS_TOOLTIPS_PLACE_ONE, // eToolTipPlaceOne + IDS_TOOLTIPS_PLACE_ALL, // eToolTipPlaceAll + IDS_TOOLTIPS_DROP_GENERIC, // eToolTipDropGeneric + IDS_TOOLTIPS_DROP_ONE, // eToolTipDropOne + IDS_TOOLTIPS_DROP_ALL, // eToolTipDropAll + IDS_TOOLTIPS_SWAP, // eToolTipSwap + IDS_TOOLTIPS_QUICK_MOVE, // eToolTipQuickMove + IDS_TOOLTIPS_QUICK_MOVE_INGREDIENT, // eToolTipQuickMoveIngredient + IDS_TOOLTIPS_QUICK_MOVE_FUEL, // eToolTipQuickMoveTool + IDS_TOOLTIPS_WHAT_IS_THIS, // eToolTipWhatIsThis + IDS_TOOLTIPS_EQUIP, // eToolTipEquip + IDS_TOOLTIPS_CLEAR_QUICK_SELECT, // eToolTipClearQuickSelect + IDS_TOOLTIPS_QUICK_MOVE_TOOL, // eToolTipQuickMoveTool + IDS_TOOLTIPS_QUICK_MOVE_ARMOR, // eToolTipQuickMoveTool + IDS_TOOLTIPS_QUICK_MOVE_WEAPON, // eToolTipQuickMoveTool + IDS_TOOLTIPS_DYE, // eToolTipDye + IDS_TOOLTIPS_REPAIR, // eToolTipRepair + }; + + BYTE focusUser = getPad(); + + for ( int i = 0; i < eToolTipNumButtons; ++i ) + { + if ( m_aeToolTipSettings[ i ] == eToolTipNone ) + { + ui.ShowTooltip( focusUser, i, FALSE ); + } + else + { + ui.SetTooltipText( focusUser, i, kaToolTipextIds[ m_aeToolTipSettings[ i ] ] ); + ui.ShowTooltip( focusUser, i, TRUE ); + } + } +} + +void IUIScene_AbstractContainerMenu::onMouseTick() +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + if( pMinecraft->localgameModes[getPad()] != NULL) + { + Tutorial *tutorial = pMinecraft->localgameModes[getPad()]->getTutorial(); + if(tutorial != NULL) + { + if(ui.IsTutorialVisible(getPad()) && !tutorial->isInputAllowed(ACTION_MENU_UP)) + { + return; + } + } + } + + // Offset to display carried item attached to pointer. + // static const float kfCarriedItemOffsetX = -5.0f; + // static const float kfCarriedItemOffsetY = -5.0f; + float fInputDirX=0.0f; + float fInputDirY=0.0f; + + // Get current pointer position. + UIVec2D vPointerPos = m_pointerPos; + + // Offset to image centre. + vPointerPos.x += m_fPointerImageOffsetX; + vPointerPos.y += m_fPointerImageOffsetY; + + // Get stick input. + int iPad = getPad(); + + bool bStickInput = false; + float fInputX = InputManager.GetJoypadStick_LX( iPad, false )*((float)app.GetGameSettings(iPad,eGameSetting_Sensitivity_InMenu)/100.0f); // apply the sensitivity + float fInputY = InputManager.GetJoypadStick_LY( iPad, false )*((float)app.GetGameSettings(iPad,eGameSetting_Sensitivity_InMenu)/100.0f); // apply the sensitivity + +#ifdef __ORBIS__ + // should have sensitivity for the touchpad + //(float)app.GetGameSettings(iPad,eGameSetting_Sensitivity_TouchPadInMenu)/100.0f + + // get the touchpad input and treat it as a map to the window + ScePadTouchData *pTouchPadData=InputManager.GetTouchPadData(iPad); + + // make sure the touchpad button isn't down (it's the pausemenu) + + if((!InputManager.ButtonDown(iPad, ACTION_MENU_TOUCHPAD_PRESS)) && (pTouchPadData->touchNum>0)) + { + if(m_bFirstTouchStored[iPad]==false) + { + m_oldvTouchPos.x=(float)pTouchPadData->touch[0].x; + m_oldvTouchPos.y=(float)pTouchPadData->touch[0].y; + m_oldvPointerPos.x=vPointerPos.x; + m_oldvPointerPos.y=vPointerPos.y; + m_bFirstTouchStored[iPad]=true; + } + + // should take the average of multiple touch points + + float fNewX=(((float)pTouchPadData->touch[0].x)-m_oldvTouchPos.x) * m_fTouchPadMulX; + float fNewY=(((float)pTouchPadData->touch[0].y)-m_oldvTouchPos.y) * m_fTouchPadMulY; + // relative positions - needs a deadzone + + if(fNewX>m_fTouchPadDeadZoneX) + { + vPointerPos.x=m_oldvPointerPos.x+((fNewX-m_fTouchPadDeadZoneX)*((float)app.GetGameSettings(iPad,eGameSetting_Sensitivity_InMenu)/100.0f)); + } + else if(fNewX<-m_fTouchPadDeadZoneX) + { + vPointerPos.x=m_oldvPointerPos.x+((fNewX+m_fTouchPadDeadZoneX)*((float)app.GetGameSettings(iPad,eGameSetting_Sensitivity_InMenu)/100.0f)); + } + + if(fNewY>m_fTouchPadDeadZoneY) + { + vPointerPos.y=m_oldvPointerPos.y+((fNewY-m_fTouchPadDeadZoneY)*((float)app.GetGameSettings(iPad,eGameSetting_Sensitivity_InMenu)/100.0f)); + } + else if(fNewY<-m_fTouchPadDeadZoneY) + { + vPointerPos.y=m_oldvPointerPos.y+((fNewY+m_fTouchPadDeadZoneY)*((float)app.GetGameSettings(iPad,eGameSetting_Sensitivity_InMenu)/100.0f)); + } + + // Clamp to pointer extents. + if ( vPointerPos.x < m_fPointerMinX ) vPointerPos.x = m_fPointerMinX; + else if ( vPointerPos.x > m_fPointerMaxX ) vPointerPos.x = m_fPointerMaxX; + if ( vPointerPos.y < m_fPointerMinY ) vPointerPos.y = m_fPointerMinY; + else if ( vPointerPos.y > m_fPointerMaxY ) vPointerPos.y = m_fPointerMaxY; + + bStickInput = true; + m_eCurrTapState=eTapStateNoInput; + } + else + { + // reset the touch flag + m_bFirstTouchStored[iPad]=false; + +#endif + + + + // If there is any input on sticks, move the pointer. + if ( ( fabs( fInputX ) >= 0.01f ) || ( fabs( fInputY ) >= 0.01f ) ) + { + fInputDirX = ( fInputX > 0.0f ) ? 1.0f : ( fInputX < 0.0f )?-1.0f : 0.0f; + fInputDirY = ( fInputY > 0.0f ) ? 1.0f : ( fInputY < 0.0f )?-1.0f : 0.0f; + +#ifdef TAP_DETECTION + // Check for potential tap input to jump slot. + ETapState eNewTapInput = GetTapInputType( fInputX, fInputY ); + + switch( m_eCurrTapState ) + { + case eTapStateNoInput: + m_eCurrTapState = eNewTapInput; + break; + + case eTapStateUp: + case eTapStateDown: + case eTapStateLeft: + case eTapStateRight: + if ( ( eNewTapInput != m_eCurrTapState ) && ( eNewTapInput != eTapStateNoInput ) ) + { + // Input is no longer suitable for tap. + m_eCurrTapState = eTapNone; + } + break; + + case eTapNone: + /// Nothing to do, input is not a tap. + break; + } +#endif // TAP_DETECTION + + // Square it so we get more precision for small inputs. + fInputX = fInputX * fInputX * fInputDirX * POINTER_SPEED_FACTOR; + fInputY = fInputY * fInputY * fInputDirY * POINTER_SPEED_FACTOR; + //fInputX = fInputX * POINTER_SPEED_FACTOR; + //fInputY = fInputY * POINTER_SPEED_FACTOR; + float fInputScale = 1.0f; + + // Ramp up input from zero when new input is recieved over INPUT_TICKS_FOR_SCALING ticks. This is to try to improve tapping stick to move 1 box. + if ( m_iConsectiveInputTicks < MAX_INPUT_TICKS_FOR_SCALING ) + { + ++m_iConsectiveInputTicks; + fInputScale = ( (float)( m_iConsectiveInputTicks) / (float)(MAX_INPUT_TICKS_FOR_SCALING) ); + } +#ifdef TAP_DETECTION + else if ( m_iConsectiveInputTicks < MAX_INPUT_TICKS_FOR_TAPPING ) + { + ++m_iConsectiveInputTicks; + } + else + { + m_eCurrTapState = eTapNone; + } +#endif + // 4J Stu - The cursor moves too fast in SD mode + // The SD/splitscreen scenes are approximately 0.6 times the size of the fullscreen on + if(!RenderManager.IsHiDef() || app.GetLocalPlayerCount() > 1) fInputScale *= 0.6f; + + fInputX *= fInputScale; + fInputY *= fInputScale; + +#ifdef USE_POINTER_ACCEL + m_fPointerAccelX += fInputX / 50.0f; + m_fPointerAccelY += fInputY / 50.0f; + + if ( fabsf( fInputX ) > fabsf( m_fPointerVelX + m_fPointerAccelX ) ) + { + m_fPointerVelX += m_fPointerAccelX; + } + else + { + m_fPointerAccelX = fInputX - m_fPointerVelX; + m_fPointerVelX = fInputX; + } + + if ( fabsf( fInputY ) > fabsf( m_fPointerVelY + m_fPointerAccelY ) ) + { + m_fPointerVelY += m_fPointerAccelY; + } + else + { + m_fPointerAccelY = fInputY - m_fPointerVelY; + m_fPointerVelY = fInputY; + } + //printf( "IN %.2f VEL %.2f ACC %.2f\n", fInputY, m_fPointerVelY, m_fPointerAccelY ); + + vPointerPos.x += m_fPointerVelX; + vPointerPos.y -= m_fPointerVelY; +#else + // Add input to pointer position. + vPointerPos.x += fInputX; + vPointerPos.y -= fInputY; +#endif + // Clamp to pointer extents. + if ( vPointerPos.x < m_fPointerMinX ) vPointerPos.x = m_fPointerMinX; + else if ( vPointerPos.x > m_fPointerMaxX ) vPointerPos.x = m_fPointerMaxX; + if ( vPointerPos.y < m_fPointerMinY ) vPointerPos.y = m_fPointerMinY; + else if ( vPointerPos.y > m_fPointerMaxY ) vPointerPos.y = m_fPointerMaxY; + + bStickInput = true; + } + else + { + m_iConsectiveInputTicks = 0; +#ifdef USE_POINTER_ACCEL + m_fPointerVelX = 0.0f; + m_fPointerVelY = 0.0f; + m_fPointerAccelX = 0.0f; + m_fPointerAccelY = 0.0f; +#endif + } + +#ifdef __ORBIS__ + } +#endif + + // Determine which slot the pointer is currently over. + ESceneSection eSectionUnderPointer = eSectionNone; + int iNewSlotX = -1; + int iNewSlotY = -1; + int iNewSlotIndex = -1; + bool bPointerIsOverSlot = false; + + // Centre position of item under pointer, use this to snap pointer to item. + D3DXVECTOR3 vSnapPos; + + for ( int iSection = m_eFirstSection; iSection < m_eMaxSection; ++iSection ) + { + // Do not check any further if we have already found the item under the pointer. + if(m_eCurrTapState == eTapStateJump) + { + eSectionUnderPointer = m_eCurrSection; + } + else if ( eSectionUnderPointer == eSectionNone ) + { + ESceneSection eSection = ( ESceneSection )( iSection ); + + // Get position of this section. + UIVec2D sectionPos; + GetPositionOfSection( eSection, &( sectionPos ) ); + + if(!IsSectionSlotList(eSection)) + { + UIVec2D itemPos; + UIVec2D itemSize; + GetItemScreenData( eSection, 0, &( itemPos ), &( itemSize ) ); + + UIVec2D itemMax = itemSize; + itemMax += itemPos; + + if ( ( vPointerPos.x >= sectionPos.x ) && ( vPointerPos.x <= itemMax.x ) && + ( vPointerPos.y >= sectionPos.y ) && ( vPointerPos.y <= itemMax.y ) ) + { + // Pointer is over this control! + eSectionUnderPointer = eSection; + + vSnapPos.x = itemPos.x + ( itemSize.x / 2.0f ); + vSnapPos.y = itemPos.y + ( itemSize.y / 2.0f ); + + // Does this section already have focus. + if ( !doesSectionTreeHaveFocus( eSection ) ) + { + // Give focus to this section. + setSectionFocus(eSection, getPad()); + } + + bPointerIsOverSlot = false; + + // Have we actually changed slot? If so, input cannot be a tap. + if ( ( eSectionUnderPointer != m_eCurrSection ) || ( iNewSlotX != m_iCurrSlotX ) || ( iNewSlotY != m_iCurrSlotY ) ) + { + m_eCurrTapState = eTapNone; + } + + // Store what is currently under the pointer. + m_eCurrSection = eSectionUnderPointer; + } + } + else + { + + // Get dimensions of this section. + int iNumRows; + int iNumColumns; + int iNumItems = GetSectionDimensions( eSection, &( iNumColumns ), &( iNumRows ) ); + + // Check each item to see if pointer is over it. + for ( int iItem = 0; iItem < iNumItems; ++iItem ) + { + UIVec2D itemPos; + UIVec2D itemSize; + GetItemScreenData( eSection, iItem, &( itemPos ), &( itemSize ) ); + + itemPos += sectionPos; + + UIVec2D itemMax = itemSize; + itemMax += itemPos; + + if ( ( vPointerPos.x >= itemPos.x ) && ( vPointerPos.x <= itemMax.x ) && + ( vPointerPos.y >= itemPos.y ) && ( vPointerPos.y <= itemMax.y ) ) + { + // Pointer is over this slot! + eSectionUnderPointer = eSection; + iNewSlotIndex = iItem; + iNewSlotX = iNewSlotIndex % iNumColumns; + iNewSlotY = iNewSlotIndex / iNumColumns; + + vSnapPos.x = itemPos.x + ( itemSize.x / 2.0f ); + vSnapPos.y = itemPos.y + ( itemSize.y / 2.0f ); + + // Does this section already have focus. + if ( !doesSectionTreeHaveFocus( eSection ) ) + { + // Give focus to this section. + setSectionFocus(eSection, getPad()); + } + + // Set the highlight marker. + setSectionSelectedSlot(eSection, iNewSlotX, iNewSlotY ); + + bPointerIsOverSlot = true; + +#ifdef TAP_DETECTION + // Have we actually changed slot? If so, input cannot be a tap. + if ( ( eSectionUnderPointer != m_eCurrSection ) || ( iNewSlotX != m_iCurrSlotX ) || ( iNewSlotY != m_iCurrSlotY ) ) + { + m_eCurrTapState = eTapNone; + } + + // Store what is currently under the pointer. + m_eCurrSection = eSectionUnderPointer; + m_iCurrSlotX = iNewSlotX; + m_iCurrSlotY = iNewSlotY; +#endif // TAP_DETECTION + // No need to check any further slots, the pointer can only ever be over one. + break; + } + } + } + } + } + + // 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 ) + { + setFocusToPointer( getPad() ); +#ifdef TAP_DETECTION + // Input cannot be a tap. + m_eCurrTapState = eTapNone; + + // Store what is currently under the pointer. + m_eCurrSection = eSectionNone; + m_iCurrSlotX = -1; + m_iCurrSlotY = -1; +#endif // TAP_DETECTION + } + else + { + if ( !bStickInput ) + { + // Did we get a tap input? + int iDesiredSlotX = -1; + int iDesiredSlotY = -1; + + switch( m_eCurrTapState ) + { + case eTapStateUp: + iDesiredSlotX = m_iCurrSlotX; + iDesiredSlotY = m_iCurrSlotY - 1; + break; + case eTapStateDown: + iDesiredSlotX = m_iCurrSlotX; + iDesiredSlotY = m_iCurrSlotY + 1; + break; + case eTapStateLeft: + iDesiredSlotX = m_iCurrSlotX - 1; + iDesiredSlotY = m_iCurrSlotY; + break; + case eTapStateRight: + iDesiredSlotX = m_iCurrSlotX + 1; + iDesiredSlotY = m_iCurrSlotY; + break; + case eTapStateJump: + iDesiredSlotX = m_iCurrSlotX; + iDesiredSlotY = m_iCurrSlotY; + break; + } + + int iNumRows; + int iNumColumns; + int iNumItems = GetSectionDimensions( eSectionUnderPointer, &( iNumColumns ), &( iNumRows ) ); + + + if ( (m_eCurrTapState != eTapNone && m_eCurrTapState != eTapStateNoInput) && + ( !IsSectionSlotList(eSectionUnderPointer) || + ( ( iDesiredSlotX < 0 ) || ( iDesiredSlotX >= iNumColumns ) || ( iDesiredSlotY < 0 ) || ( iDesiredSlotY >= iNumRows ) ) + )) + { + + eSectionUnderPointer = GetSectionAndSlotInDirection( eSectionUnderPointer, m_eCurrTapState, &iDesiredSlotX, &iDesiredSlotY ); + + if(!IsSectionSlotList(eSectionUnderPointer)) bPointerIsOverSlot = false; + + // Get the details for the new section + iNumItems = GetSectionDimensions( eSectionUnderPointer, &( iNumColumns ), &( iNumRows ) ); + } + + if ( !IsSectionSlotList(eSectionUnderPointer) || ( ( iDesiredSlotX >= 0 ) && ( iDesiredSlotX < iNumColumns ) && ( iDesiredSlotY >= 0 ) && ( iDesiredSlotY < iNumRows ) ) ) + { + // Desired slot after tap input is valid, so make the jump to this slot. + UIVec2D sectionPos; + GetPositionOfSection( eSectionUnderPointer, &( sectionPos ) ); + + iNewSlotIndex = ( iDesiredSlotY * iNumColumns ) + iDesiredSlotX; + + UIVec2D itemPos; + UIVec2D itemSize; + GetItemScreenData( eSectionUnderPointer, iNewSlotIndex, &( itemPos ), &( itemSize ) ); + + if(IsSectionSlotList(eSectionUnderPointer)) itemPos += sectionPos; + + vSnapPos.x = itemPos.x + ( itemSize.x / 2.0f); + vSnapPos.y = itemPos.y + ( itemSize.y / 2.0f); + + m_eCurrSection = eSectionUnderPointer; + m_iCurrSlotX = iDesiredSlotX; + m_iCurrSlotY = iDesiredSlotY; + } + + m_eCurrTapState = eTapStateNoInput; + + // If there is no stick input, and we are over a slot, then snap pointer to slot centre. + // 4J - TomK - only if this particular component allows so! + if(CanHaveFocus(eSectionUnderPointer)) + { + vPointerPos.x = vSnapPos.x; + vPointerPos.y = vSnapPos.y; + } + } + } + + // Clamp to pointer extents. + if ( vPointerPos.x < m_fPointerMinX ) vPointerPos.x = m_fPointerMinX; + else if ( vPointerPos.x > m_fPointerMaxX ) vPointerPos.x = m_fPointerMaxX; + if ( vPointerPos.y < m_fPointerMinY ) vPointerPos.y = m_fPointerMinY; + else if ( vPointerPos.y > m_fPointerMaxY ) vPointerPos.y = m_fPointerMaxY; + + // Check if the pointer is outside of the panel. + bool bPointerIsOutsidePanel = false; + if ( ( vPointerPos.x < m_fPanelMinX ) || ( vPointerPos.x > m_fPanelMaxX ) || ( vPointerPos.y < m_fPanelMinY ) || ( vPointerPos.y > m_fPanelMaxY ) ) + { + bPointerIsOutsidePanel = true; + } + + // Determine appropriate context sensitive tool tips, based on what is carried on the pointer and what is under the pointer. + + // What are we carrying on pointer. + shared_ptr player = Minecraft::GetInstance()->localplayers[getPad()]; + shared_ptr carriedItem = nullptr; + if(player != NULL) carriedItem = player->inventory->getCarried(); + + shared_ptr slotItem = nullptr; + Slot *slot = NULL; + int slotIndex = 0; + if(bPointerIsOverSlot) + { + slotIndex = iNewSlotIndex + getSectionStartOffset( eSectionUnderPointer ); + slot = m_menu->getSlot(slotIndex); + } + bool bIsItemCarried = carriedItem != NULL; + int iCarriedCount = 0; + bool bCarriedIsSameAsSlot = false; // Indicates if same item is carried on pointer as is in slot under pointer. + if ( bIsItemCarried ) + { + iCarriedCount = carriedItem->count; + } + + // What is in the slot that we are over. + bool bSlotHasItem = false; + bool bMayPlace = false; + bool bCanPlaceOne = false; + bool bCanPlaceAll = false; + bool bCanCombine = false; + bool bCanDye = false; + int iSlotCount = 0; + int iSlotStackSizeRemaining = 0; // How many more items can be stacked on this slot. + if ( bPointerIsOverSlot ) + { + slotItem = slot->getItem(); + bSlotHasItem = slotItem != NULL; + if ( bSlotHasItem ) + { + iSlotCount = slotItem->GetCount(); + + if ( bIsItemCarried ) + { + bCarriedIsSameAsSlot = IsSameItemAs(carriedItem, slotItem); + bCanCombine = m_menu->mayCombine(slot,carriedItem); + bCanDye = bCanCombine && dynamic_cast(slot->getItem()->getItem()); + + if ( bCarriedIsSameAsSlot ) + { + iSlotStackSizeRemaining = GetEmptyStackSpace( m_menu->getSlot(slotIndex) ); + } + } + } + + if( bIsItemCarried) + { + bMayPlace = slot->mayPlace(carriedItem); + + if ( bSlotHasItem ) iSlotStackSizeRemaining = GetEmptyStackSpace( slot ); + else iSlotStackSizeRemaining = slot->getMaxStackSize(); + + if(bMayPlace && iSlotStackSizeRemaining > 0) bCanPlaceOne = true; + if(bMayPlace && iSlotStackSizeRemaining > 1 && carriedItem->count > 1) bCanPlaceAll = true; + } + } + + if( bPointerIsOverSlot && bSlotHasItem ) + { + vector *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 + { + SetPointerText(NULL, false); + m_lastPointerLabelSlot = NULL; + } + + EToolTipItem buttonA, buttonX, buttonY, buttonRT, buttonBack; + buttonA = buttonX = buttonY = buttonRT = buttonBack = eToolTipNone; + if ( bPointerIsOverSlot ) + { + SetPointerOutsideMenu( false ); + if ( bIsItemCarried ) + { + if ( bSlotHasItem ) + { + // Item in hand and item in slot ... is item in slot the same as in out hand? If so, can we stack on to it? + if ( bCarriedIsSameAsSlot ) + { + // Can we stack more into this slot? + if ( iSlotStackSizeRemaining == 0 ) + { + // Cannot stack any more. + buttonRT = eToolTipWhatIsThis; + } + else if ( iSlotStackSizeRemaining == 1 ) + { + // Can only put 1 more on the stack. + buttonA = eToolTipPlaceGeneric; + buttonRT = eToolTipWhatIsThis; + } + else // can put 1 or all. + { + if(bCanPlaceAll) + { + // Multiple items in hand. + buttonA = eToolTipPlaceAll; + buttonX = eToolTipPlaceOne; + } + else if(bCanPlaceOne) + { + if(iCarriedCount > 1) buttonA = eToolTipPlaceOne; + else buttonA = eToolTipPlaceGeneric; + } + buttonRT = eToolTipWhatIsThis; + } + } + else // items are different, click here will swap them. + { + + if(bMayPlace) buttonA = eToolTipSwap; + buttonRT = eToolTipWhatIsThis; + } + if(bCanDye) + { + buttonX = eToolTipDye; + } + else if(bCanCombine) + { + buttonX = eToolTipRepair; + } + } + else // slot empty. + { + // Item in hand, slot is empty. + if ( iCarriedCount == 1 ) + { + // Only one item in hand. + buttonA = eToolTipPlaceGeneric; + } + else + { + if(bCanPlaceAll) + { + // Multiple items in hand. + buttonA = eToolTipPlaceAll; + buttonX = eToolTipPlaceOne; + } + else if(bCanPlaceOne) + { + buttonA = eToolTipPlaceOne; + } + } + } + } + else // no object in hand + { + if ( bSlotHasItem ) + { + if ( iSlotCount == 1 ) + { + buttonA = eToolTipPickUpGeneric; + } + else + { + // Multiple items in slot. + buttonA = eToolTipPickUpAll; + buttonX = eToolTipPickUpHalf; + } + +#ifdef __PSVITA__ + if (!InputManager.IsVitaTV()) + { + buttonBack = eToolTipWhatIsThis; + } + else +#endif + { + buttonRT = eToolTipWhatIsThis; + } + } + else + { + // Nothing in slot and nothing in hand. + } + } + + if ( bSlotHasItem ) + { + // Item in slot + + // 4J-PB - show tooltips for quick use of armour + + if((eSectionUnderPointer==eSectionInventoryUsing)||(eSectionUnderPointer==eSectionInventoryInventory)) + { + shared_ptr item = getSlotItem(eSectionUnderPointer, iNewSlotIndex); + ArmorRecipes::_eArmorType eArmourType=ArmorRecipes::GetArmorType(item->id); + + if(eArmourType==ArmorRecipes::eArmorType_None) + { + buttonY = eToolTipQuickMove; + } + else + { + // check that the slot required is empty + switch(eArmourType) + { + case ArmorRecipes::eArmorType_Helmet: + if(isSlotEmpty(eSectionInventoryArmor,0)) + { + buttonY = eToolTipEquip; + } + else + { + buttonY = eToolTipQuickMove; + } + break; + case ArmorRecipes::eArmorType_Chestplate: + if(isSlotEmpty(eSectionInventoryArmor,1)) + { + buttonY = eToolTipEquip; + } + else + { + buttonY = eToolTipQuickMove; + } + break; + case ArmorRecipes::eArmorType_Leggings: + if(isSlotEmpty(eSectionInventoryArmor,2)) + { + buttonY = eToolTipEquip; + } + else + { + buttonY = eToolTipQuickMove; + } + break; + case ArmorRecipes::eArmorType_Boots: + if(isSlotEmpty(eSectionInventoryArmor,3)) + { + buttonY = eToolTipEquip; + } + else + { + buttonY = eToolTipQuickMove; + } + break; + default: + buttonY = eToolTipQuickMove; + break; + } + + } + } + // 4J-PB - show tooltips for quick use of fuel or ingredient + else if((eSectionUnderPointer==eSectionFurnaceUsing)||(eSectionUnderPointer==eSectionFurnaceInventory)) + { + // Get the info on this item. + shared_ptr item = getSlotItem(eSectionUnderPointer, iNewSlotIndex); + bool bValidFuel = FurnaceTileEntity::isFuel(item); + bool bValidIngredient = FurnaceRecipes::getInstance()->getResult(item->getItem()->id) != NULL; + + if(bValidIngredient) + { + // is there already something in the ingredient slot? + if(!isSlotEmpty(eSectionFurnaceIngredient,0)) + { + // is it the same as this item + shared_ptr IngredientItem = getSlotItem(eSectionFurnaceIngredient,0); + if(IngredientItem->id == item->id) + { + buttonY = eToolTipQuickMoveIngredient; + } + else + { + if(FurnaceRecipes::getInstance()->getResult(item->id)==NULL) + { + buttonY = eToolTipQuickMove; + } + else + { + buttonY = eToolTipQuickMoveIngredient; + } + } + } + else + { + // ingredient slot empty + buttonY = eToolTipQuickMoveIngredient; + } + } + else if(bValidFuel) + { + // Is there already something in the fuel slot? + if(!isSlotEmpty(eSectionFurnaceFuel,0)) + { + // is it the same as this item + shared_ptr fuelItem = getSlotItem(eSectionFurnaceFuel,0); + if(fuelItem->id == item->id) + { + buttonY = eToolTipQuickMoveFuel; + } + else if(bValidIngredient) + { + // check if the ingredient slot is empty, or the same as this + if(!isSlotEmpty(eSectionFurnaceIngredient,0)) + { + // is it the same as this item + shared_ptr IngredientItem = getSlotItem(eSectionFurnaceIngredient,0); + if(IngredientItem->id == item->id) + { + buttonY = eToolTipQuickMoveIngredient; + } + else + { + if(FurnaceRecipes::getInstance()->getResult(item->id)==NULL) + { + buttonY = eToolTipQuickMove; + } + else + { + buttonY = eToolTipQuickMoveIngredient; + } + } + } + else + { + // ingredient slot empty + buttonY = eToolTipQuickMoveIngredient; + } + } + else + { + buttonY = eToolTipQuickMove; + } + } + else + { + buttonY = eToolTipQuickMoveFuel; + } + } + else + { + buttonY = eToolTipQuickMove; + } + } + // 4J-PB - show tooltips for quick use of ingredients in brewing + else if((eSectionUnderPointer==eSectionBrewingUsing)||(eSectionUnderPointer==eSectionBrewingInventory)) + { + // Get the info on this item. + shared_ptr item = getSlotItem(eSectionUnderPointer, iNewSlotIndex); + int iId=item->id; + + // valid ingredient? + bool bValidIngredient=false; + //bool bValidIngredientBottom=false; + + if(Item::items[iId]->hasPotionBrewingFormula() || (iId == Item::netherwart_seeds_Id)) + { + bValidIngredient=true; + } + + if(bValidIngredient) + { + // is there already something in the ingredient slot? + if(!isSlotEmpty(eSectionBrewingIngredient,0)) + { + // is it the same as this item + shared_ptr IngredientItem = getSlotItem(eSectionBrewingIngredient,0); + if(IngredientItem->id == item->id) + { + buttonY = eToolTipQuickMoveIngredient; + } + else + { + buttonY=eToolTipQuickMove; + } + } + else + { + // ingredient slot empty + buttonY = eToolTipQuickMoveIngredient; + } + } + else + { + // valid potion? Glass bottle with water in it is a 'potion' too. + if(iId==Item::potion_Id) + { + // space available? + if(isSlotEmpty(eSectionBrewingBottle1,0) || + isSlotEmpty(eSectionBrewingBottle2,0) || + isSlotEmpty(eSectionBrewingBottle3,0)) + { + buttonY = eToolTipQuickMoveIngredient; + } + else + { + buttonY=eToolTipNone; + } + } + else + { + buttonY=eToolTipQuickMove; + } + } + } + else if((eSectionUnderPointer==eSectionEnchantUsing)||(eSectionUnderPointer==eSectionEnchantInventory)) + { + // Get the info on this item. + shared_ptr item = getSlotItem(eSectionUnderPointer, iNewSlotIndex); + int iId=item->id; + + // valid enchantable tool? + if(Item::items[iId]->isEnchantable(item)) + { + // is there already something in the ingredient slot? + if(isSlotEmpty(eSectionEnchantSlot,0)) + { + // tool slot empty + switch(iId) + { + case Item::bow_Id: + case Item::sword_wood_Id: + case Item::sword_stone_Id: + case Item::sword_iron_Id: + case Item::sword_diamond_Id: + buttonY=eToolTipQuickMoveWeapon; + break; + + case Item::helmet_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: + case Item::leggings_chain_Id: + case Item::boots_chain_Id: + + case Item::helmet_iron_Id: + case Item::chestplate_iron_Id: + case Item::leggings_iron_Id: + case Item::boots_iron_Id: + + case Item::helmet_diamond_Id: + case Item::chestplate_diamond_Id: + case Item::leggings_diamond_Id: + case Item::boots_diamond_Id: + + case Item::helmet_gold_Id: + case Item::chestplate_gold_Id: + case Item::leggings_gold_Id: + case Item::boots_gold_Id: + buttonY=eToolTipQuickMoveArmor; + + break; + case Item::book_Id: + buttonY = eToolTipQuickMove; + break; + default: + buttonY=eToolTipQuickMoveTool; + break; + } + } + else + { + buttonY = eToolTipQuickMove; + } + } + else + { + buttonY=eToolTipQuickMove; + } + } + else + { + buttonY = eToolTipQuickMove; + } + } + } + + if ( bPointerIsOutsidePanel ) + { + SetPointerOutsideMenu( true ); + // Outside window, we dropping items. + if ( bIsItemCarried ) + { + //int iCount = m_pointerControl->GetObjectCount( m_pointerControl->m_hObj ); + if ( iCarriedCount > 1 ) + { + buttonA = eToolTipDropAll; + buttonX = eToolTipDropOne; + } + else + { + buttonA = eToolTipDropGeneric; + } + } + } + else // pointer is just over dead space ... can't really do anything. + { + SetPointerOutsideMenu( false ); + } + + shared_ptr item = nullptr; + if(bPointerIsOverSlot && bSlotHasItem) item = getSlotItem(eSectionUnderPointer, iNewSlotIndex); + overrideTooltips(eSectionUnderPointer, item, bIsItemCarried, bSlotHasItem, bCarriedIsSameAsSlot, iSlotStackSizeRemaining, buttonA, buttonX, buttonY, buttonRT, 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; + vPointerPos.y -= m_fPointerImageOffsetY; + + // Update pointer position. + // 4J-PB - do not allow sub pixel positions or we get broken lines in box edges + + // problem here when sensitivity is low - we'll be moving a sub pixel size, so it'll clamp, and we'll never move. In that case, move 1 pixel + if(fInputDirX!=0.0f) + { + if(fInputDirX==1.0f) + { + vPointerPos.x+=0.999999f; + } + else + { + vPointerPos.x-=0.999999f; + } + } + + if(fInputDirY!=0.0f) + { + if(fInputDirY==1.0f) + { + vPointerPos.y+=0.999999f; + } + else + { + vPointerPos.y-=0.999999f; + } + } + + vPointerPos.x = floor(vPointerPos.x); + vPointerPos.x += ( (int)vPointerPos.x%2); + vPointerPos.y = floor(vPointerPos.y); + vPointerPos.y += ( (int)vPointerPos.y%2); + m_pointerPos = vPointerPos; + + adjustPointerForSafeZone(); +} + +bool IUIScene_AbstractContainerMenu::handleKeyDown(int iPad, int iAction, bool bRepeat) +{ + bool bHandled = false; + + Minecraft *pMinecraft = Minecraft::GetInstance(); + if( pMinecraft->localgameModes[getPad()] != NULL ) + { + Tutorial *tutorial = pMinecraft->localgameModes[getPad()]->getTutorial(); + if(tutorial != NULL) + { + tutorial->handleUIInput(iAction); + if(ui.IsTutorialVisible(getPad()) && !tutorial->isInputAllowed(iAction)) + { + return S_OK; + } + } + } + +#ifdef _XBOX + ui.AnimateKeyPress(iPad, iAction); +#else + ui.AnimateKeyPress(iPad, iAction, bRepeat, true, false); +#endif + + int buttonNum=0; // 0 = LeftMouse, 1 = RightMouse + BOOL quickKeyHeld=FALSE; // Represents shift key on PC + + BOOL validKeyPress = FALSE; + bool itemEditorKeyPress = false; + + // Ignore input from other players + //if(pMinecraft->player->GetXboxPad()!=pInputData->UserIndex) return S_OK; + + switch(iAction) + { +#ifdef _DEBUG_MENUS_ENABLED + case ACTION_MENU_OTHER_STICK_PRESS: + itemEditorKeyPress = TRUE; + break; +#endif + case ACTION_MENU_A: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + if(!bRepeat) + { + validKeyPress = TRUE; + + // Standard left click + buttonNum = 0; + quickKeyHeld = FALSE; + ui.PlayUISFX(eSFX_Press); + } + break; + case ACTION_MENU_X: + if(!bRepeat) + { + validKeyPress = TRUE; + + // Standard right click + buttonNum = 1; + quickKeyHeld = FALSE; + ui.PlayUISFX(eSFX_Press); + } + break; + case ACTION_MENU_Y: + if(!bRepeat) + { + //bool bIsItemCarried = !m_pointerControl->isEmpty( m_pointerControl->m_hObj ); + + // 4J Stu - TU8: Remove this fix, and fix the tooltip display instead as customers liked the feature + + // Fix for #58583 - TU6: Content: UI: The Quick Move button prompt disappears even though it still works + // No quick move tooltip is shown if something is carried, so disable the action as well + //if(!bIsItemCarried) + { + validKeyPress = TRUE; + + // Shift and left click + buttonNum = 0; + quickKeyHeld = TRUE; + ui.PlayUISFX(eSFX_Press); + } + } + break; + // 4J Stu - Also enable start to exit the scene. This key is also not constrained by the tutorials. + case ACTION_MENU_PAUSEMENU: + case ACTION_MENU_B: + { + + ui.SetTooltips(iPad, -1); + + // 4J Stu - Fix for #11302 - TCR 001: Network Connectivity: Host crashed after being killed by the client while accessing a chest during burst packet loss. + // We need to make sure that we call closeContainer() anytime this menu is closed, even if it is forced to close by some other reason (like the player dying) + // Therefore I have moved this call to the OnDestroy() method to make sure that it always happens. + //Minecraft::GetInstance()->localplayers[pInputData->UserIndex]->closeContainer(); + + // Return to the game. We should really callback to the app here as well + // to let it know that we have closed the ui incase we need to do things when that happens + + if(m_bNavigateBack) + { + ui.NavigateBack(iPad); + } + else + { + ui.CloseUIScenes(iPad); + } + + bHandled = true; + return S_OK; + } + break; + case ACTION_MENU_LEFT: + { + //ui.PlayUISFX(eSFX_Focus); + m_eCurrTapState = eTapStateLeft; + } + break; + case ACTION_MENU_RIGHT: + { + //ui.PlayUISFX(eSFX_Focus); + m_eCurrTapState = eTapStateRight; + } + break; + case ACTION_MENU_UP: + { + //ui.PlayUISFX(eSFX_Focus); + m_eCurrTapState = eTapStateUp; + } + break; + case ACTION_MENU_DOWN: + { + //ui.PlayUISFX(eSFX_Focus); + m_eCurrTapState = eTapStateDown; + } + break; + case ACTION_MENU_PAGEUP: + { + // 4J Stu - Do nothing except stop this being passed anywhere else + bHandled = true; + } + break; + case ACTION_MENU_PAGEDOWN: + { + if( IsSectionSlotList( m_eCurrSection ) ) + { + int currentIndex = getCurrentIndex( m_eCurrSection ) - getSectionStartOffset(m_eCurrSection); + + bool bSlotHasItem = !isSlotEmpty(m_eCurrSection, currentIndex); + if ( bSlotHasItem ) + { + shared_ptr item = getSlotItem(m_eCurrSection, currentIndex); + if( Minecraft::GetInstance()->localgameModes[iPad] != NULL ) + { + Tutorial::PopupMessageDetails *message = new Tutorial::PopupMessageDetails; + message->m_messageId = item->getUseDescriptionId(); + + if(Item::items[item->id] != NULL) message->m_titleString = Item::items[item->id]->getHoverName(item); + message->m_titleId = item->getDescriptionId(); + + message->m_icon = item->id; + message->m_iAuxVal = item->getAuxValue(); + message->m_forceDisplay = true; + + TutorialMode *gameMode = (TutorialMode *)Minecraft::GetInstance()->localgameModes[iPad]; + gameMode->getTutorial()->setMessage(NULL, message); + ui.PlayUISFX(eSFX_Press); + } + } + } + bHandled = TRUE; + } + break; + }; + + if( validKeyPress == TRUE ) + { + if(handleValidKeyPress(iPad,buttonNum,quickKeyHeld)) + { + // Used to allow overriding certain keypresses, so do nothing here + } + else + { + if( IsSectionSlotList( m_eCurrSection ) ) + { + handleSlotListClicked(m_eCurrSection,buttonNum,quickKeyHeld); + } + else + { + // TODO Clicked something else, like for example the craft result. Do something here + + // 4J WESTY : For pointer system we can legally drop items outside of the window panel here, or may press button while + // pointer is over empty panel space. + if ( m_bPointerOutsideMenu ) + { + handleOutsideClicked(iPad, buttonNum, quickKeyHeld); + } + else // + { + // over empty space or something else??? + handleOtherClicked(iPad,m_eCurrSection,buttonNum,quickKeyHeld?true:false); + //assert( FALSE ); + } + } + } + bHandled = true; + } +#ifdef _DEBUG_MENUS_ENABLED + else if(itemEditorKeyPress == TRUE) + { + if( IsSectionSlotList( m_eCurrSection ) ) + { + ItemEditorInput *initData = new ItemEditorInput(); + initData->iPad = getPad(); + initData->slot = getSlot( m_eCurrSection, getCurrentIndex(m_eCurrSection) ); + initData->menu = m_menu; + + ui.NavigateToScene(getPad(),eUIScene_DebugItemEditor,(void *)initData); + } + } +#endif + else + { + handleAdditionalKeyPress(iAction); + } + + UpdateTooltips(); + + return bHandled; +} + +bool IUIScene_AbstractContainerMenu::handleValidKeyPress(int iUserIndex, int buttonNum, BOOL quickKeyHeld) +{ + return false; +} + +void IUIScene_AbstractContainerMenu::handleOutsideClicked(int iPad, int buttonNum, BOOL quickKeyHeld) +{ + // Drop items. + + //pMinecraft->localgameModes[m_iPad]->handleInventoryMouseClick(menu->containerId, AbstractContainerMenu::CLICKED_OUTSIDE, buttonNum, quickKeyHeld?true:false, pMinecraft->localplayers[m_iPad] ); + slotClicked(AbstractContainerMenu::SLOT_CLICKED_OUTSIDE, buttonNum, quickKeyHeld?true:false); +} + +void IUIScene_AbstractContainerMenu::handleOtherClicked(int iPad, ESceneSection eSection, int buttonNum, bool quickKey) +{ + // Do nothing +} + +void IUIScene_AbstractContainerMenu::handleAdditionalKeyPress(int iAction) +{ + // Do nothing +} + +void IUIScene_AbstractContainerMenu::handleSlotListClicked(ESceneSection eSection, int buttonNum, BOOL quickKeyHeld) +{ + int currentIndex = getCurrentIndex(eSection); + + //pMinecraft->localgameModes[m_iPad]->handleInventoryMouseClick(menu->containerId, currentIndex, buttonNum, quickKeyHeld?true:false, pMinecraft->localplayers[m_iPad] ); + slotClicked(currentIndex, buttonNum, quickKeyHeld?true:false); + + handleSectionClick(eSection); +} + +void IUIScene_AbstractContainerMenu::slotClicked(int slotId, int buttonNum, bool quickKey) +{ + // 4J Stu - Removed this line as unused + //if (slot != NULL) slotId = slot->index; + + Minecraft *pMinecraft = Minecraft::GetInstance(); + pMinecraft->localgameModes[getPad()]->handleInventoryMouseClick(m_menu->containerId, slotId, buttonNum, quickKey, pMinecraft->localplayers[getPad()] ); +} + +int IUIScene_AbstractContainerMenu::getCurrentIndex(ESceneSection eSection) +{ + int rows, columns; + GetSectionDimensions( eSection, &columns, &rows ); + int currentIndex = (m_iCurrSlotY * columns) + m_iCurrSlotX; + + return currentIndex + getSectionStartOffset(eSection); +} + +bool IUIScene_AbstractContainerMenu::IsSameItemAs(shared_ptr itemA, shared_ptr itemB) +{ + if(itemA == NULL || itemB == NULL) return false; + + return (itemA->id == itemB->id && (!itemB->isStackedByData() || itemB->getAuxValue() == itemA->getAuxValue()) && ItemInstance::tagMatches(itemB, itemA) ); +} + +int IUIScene_AbstractContainerMenu::GetEmptyStackSpace(Slot *slot) +{ + int iResult = 0; + + if(slot != NULL && slot->hasItem()) + { + shared_ptr item = slot->getItem(); + if ( item->isStackable() ) + { + int iCount = item->GetCount(); + int iMaxStackSize = min(item->getMaxStackSize(), slot->getMaxStackSize() ); + + iResult = iMaxStackSize - iCount; + + if(iResult < 0 ) iResult = 0; + } + } + + return iResult; +} + +vector *IUIScene_AbstractContainerMenu::GetItemDescription(Slot *slot) +{ + if(slot == NULL) return NULL; + + vector *lines = slot->getItem()->getHoverText(nullptr, false); + + // Add rarity to first line + if (lines->size() > 0) + { + lines->at(0).color = slot->getItem()->getRarity()->color; + + if(slot->getItem()->hasCustomHoverName()) + { + lines->at(0).color = eTextColor_RenamedItemTitle; + } + } + + return lines; +} + +vector *IUIScene_AbstractContainerMenu::GetSectionHoverText(ESceneSection eSection) +{ + return NULL; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/IUIScene_AbstractContainerMenu.h b/Minecraft.Client/Common/UI/IUIScene_AbstractContainerMenu.h new file mode 100644 index 00000000..7d16f522 --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_AbstractContainerMenu.h @@ -0,0 +1,267 @@ +#pragma once + +// Uncomment to enable tap input detection to jump 1 slot. Doesn't work particularly well yet, and I feel the system does not need it. +// Would probably be required if we decide to slow down the pointer movement. +// 4J Stu - There was a request to be able to navigate the scenes with the dpad, so I have used much of the TAP_DETECTION +// code as it worked well for that situation. This #define should still stop the same things happening when using the +// stick though when not defined +#define TAP_DETECTION + +// Uncomment to enable acceleration on pointer input. +//#define USE_POINTER_ACCEL + +#define POINTER_INPUT_TIMER_ID (0) // Arbitrary timer ID. +#define POINTER_SPEED_FACTOR (13.0f) // Speed of pointer. +//#define POINTER_PANEL_OVER_REACH (42.0f) // Amount beyond edge of panel which pointer can go over to drop items. - comes from the pointer size in the scene + +#define MAX_INPUT_TICKS_FOR_SCALING (7) +#define MAX_INPUT_TICKS_FOR_TAPPING (15) + +class AbstractContainerMenu; +class Slot; + +class IUIScene_AbstractContainerMenu +{ +protected: + // Sections of this scene containing items selectable by the pointer. + // 4J Stu - Always make the Using section the first one + enum ESceneSection + { + eSectionNone = -1, + eSectionContainerUsing = 0, + eSectionContainerInventory, + eSectionContainerChest, + eSectionContainerMax, + + eSectionFurnaceUsing, + eSectionFurnaceInventory, + eSectionFurnaceIngredient, + eSectionFurnaceFuel, + eSectionFurnaceResult, + eSectionFurnaceMax, + + eSectionInventoryUsing, + eSectionInventoryInventory, + eSectionInventoryArmor, + eSectionInventoryMax, + + eSectionTrapUsing, + eSectionTrapInventory, + eSectionTrapTrap, + eSectionTrapMax, + + eSectionInventoryCreativeUsing, + eSectionInventoryCreativeSelector, + eSectionInventoryCreativeTab_0, + eSectionInventoryCreativeTab_1, + eSectionInventoryCreativeTab_2, + eSectionInventoryCreativeTab_3, + eSectionInventoryCreativeTab_4, + eSectionInventoryCreativeTab_5, + eSectionInventoryCreativeTab_6, + eSectionInventoryCreativeTab_7, + eSectionInventoryCreativeSlider, + eSectionInventoryCreativeMax, + + eSectionEnchantUsing, + eSectionEnchantInventory, + eSectionEnchantSlot, + eSectionEnchantButton1, + eSectionEnchantButton2, + eSectionEnchantButton3, + eSectionEnchantMax, + + eSectionBrewingUsing, + eSectionBrewingInventory, + eSectionBrewingBottle1, + eSectionBrewingBottle2, + eSectionBrewingBottle3, + eSectionBrewingIngredient, + eSectionBrewingMax, + + eSectionAnvilUsing, + eSectionAnvilInventory, + eSectionAnvilItem1, + eSectionAnvilItem2, + 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; + bool m_autoDeleteMenu; + + eTutorial_State m_previousTutorialState; + + UIVec2D m_pointerPos; + + // Offset from pointer image top left to centre (we use the centre as the actual pointer). + float m_fPointerImageOffsetX; + float m_fPointerImageOffsetY; + + // Min and max extents for the pointer. + float m_fPointerMinX; + float m_fPointerMaxX; + float m_fPointerMinY; + float m_fPointerMaxY; + + // Min and max extents of the panel. + float m_fPanelMinX; + float m_fPanelMaxX; + float m_fPanelMinY; + float m_fPanelMaxY; + + int m_iConsectiveInputTicks; + + // Used for detecting quick "taps" in a direction, should jump cursor to next slot. + enum ETapState + { + eTapStateNoInput = 0, + eTapStateUp, + eTapStateDown, + eTapStateLeft, + eTapStateRight, + eTapStateJump, + eTapNone + }; + + ETapState m_eCurrTapState; + ESceneSection m_eCurrSection; + int m_iCurrSlotX; + int m_iCurrSlotY; + +#ifdef __ORBIS__ + bool m_bFirstTouchStored[XUSER_MAX_COUNT]; // monitor the first position of a touch, so we can use relative distances of movement + UIVec2D m_oldvPointerPos; + UIVec2D m_oldvTouchPos; + // store the multipliers to map the UI window to the touchpad window + float m_fTouchPadMulX; + float m_fTouchPadMulY; + float m_fTouchPadDeadZoneX; // usese the multipliers + float m_fTouchPadDeadZoneY; + + +#endif + + // ENum indexes of the first section for this scene, and 1+the last section + ESceneSection m_eFirstSection, m_eMaxSection; + + // 4J - WESTY - Added for pointer prototype. + // Current tooltip settings. + EToolTipItem m_aeToolTipSettings[ eToolTipNumButtons ]; + + // 4J - WESTY - Added for pointer prototype. + // Indicates if pointer is outside UI window (used to drop items). + bool m_bPointerOutsideMenu; + Slot *m_lastPointerLabelSlot; + + bool m_bSplitscreen; + bool m_bNavigateBack; // should we exit the xuiscenes or just navigate back on exit? + + virtual bool IsSectionSlotList( ESceneSection eSection ) { return eSection != eSectionNone; } + virtual bool CanHaveFocus( ESceneSection eSection ) { return true; } + 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 = 0, int yOffset = 0 ); + + #ifdef TAP_DETECTION + ETapState GetTapInputType( float fInputX, float fInputY ); + #endif + + // Current tooltip settings. + void SetToolTip( EToolTipButton eButton, EToolTipItem eItem ); + void UpdateTooltips(); + + // 4J - WESTY - Added for pointer prototype. + void SetPointerOutsideMenu( bool bOutside ) { m_bPointerOutsideMenu = bOutside; } + + void Initialize(int m_iPad, AbstractContainerMenu* menu, bool autoDeleteMenu, int startIndex,ESceneSection firstSection,ESceneSection maxSection, bool bNavigateBack=FALSE); + virtual void PlatformInitialize(int iPad, int startIndex) = 0; + virtual void InitDataAssociations(int iPad, AbstractContainerMenu *menu, int startIndex = 0) = 0; + + void onMouseTick(); + bool handleKeyDown(int iPad, int iAction, bool bRepeat); + virtual bool handleValidKeyPress(int iUserIndex, int buttonNum, BOOL quickKeyHeld); + virtual void handleOutsideClicked(int iPad, int buttonNum, BOOL quickKeyHeld); + virtual void handleOtherClicked(int iPad, ESceneSection eSection, int buttonNum, bool quickKey); + virtual void handleAdditionalKeyPress(int iAction); + virtual void handleSlotListClicked(ESceneSection eSection, int buttonNum, BOOL quickKeyHeld); + virtual void handleSectionClick(ESceneSection eSection) = 0; + void slotClicked(int slotId, int buttonNum, bool quickKey); + int getCurrentIndex(ESceneSection eSection); + virtual int getSectionStartOffset(ESceneSection eSection) = 0; + virtual bool doesSectionTreeHaveFocus(ESceneSection eSection) = 0; + virtual void setSectionFocus(ESceneSection eSection, int iPad) = 0; + virtual void setSectionSelectedSlot(ESceneSection eSection, int x, int y) = 0; + virtual void setFocusToPointer(int iPad) = 0; + virtual void SetPointerText(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, + EToolTipItem &buttonBack + ) { return false; } + +private: + bool IsSameItemAs(shared_ptr itemA, shared_ptr itemB); + int GetEmptyStackSpace(Slot *slot); + + vector *GetItemDescription(Slot *slot); + +protected: + + IUIScene_AbstractContainerMenu(); + virtual ~IUIScene_AbstractContainerMenu(); + +public: + virtual int getPad() = 0; +}; diff --git a/Minecraft.Client/Common/UI/IUIScene_AnvilMenu.cpp b/Minecraft.Client/Common/UI/IUIScene_AnvilMenu.cpp new file mode 100644 index 00000000..10d1bcc4 --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_AnvilMenu.cpp @@ -0,0 +1,272 @@ +#include "stdafx.h" +#include "IUIScene_AnvilMenu.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" +#include "..\..\..\Minecraft.World\InputOutputStream.h" +#include "..\..\..\Minecraft.World\net.minecraft.network.packet.h" +#include "..\..\Minecraft.h" +#include "..\..\MultiPlayerLocalPlayer.h" +#include "..\..\ClientConnection.h" + +IUIScene_AnvilMenu::IUIScene_AnvilMenu() +{ + m_inventory = nullptr; + m_repairMenu = NULL; + m_itemName = L""; +} + +IUIScene_AbstractContainerMenu::ESceneSection IUIScene_AnvilMenu::GetSectionAndSlotInDirection( ESceneSection eSection, ETapState eTapDirection, int *piTargetX, int *piTargetY ) +{ + ESceneSection newSection = eSection; + int xOffset = 0; + + // Find the new section if there is one + switch( eSection ) + { + case eSectionAnvilItem1: + if(eTapDirection == eTapStateUp) + { + newSection = eSectionAnvilName; + } + else if(eTapDirection == eTapStateDown) + { + newSection = eSectionAnvilInventory; + xOffset = ANVIL_SCENE_ITEM1_SLOT_DOWN_OFFSET; + } + else if(eTapDirection == eTapStateLeft) + { + newSection = eSectionAnvilResult; + } + else if(eTapDirection == eTapStateRight) + { + newSection = eSectionAnvilItem2; + } + break; + case eSectionAnvilItem2: + if(eTapDirection == eTapStateUp) + { + newSection = eSectionAnvilName; + } + else if(eTapDirection == eTapStateDown) + { + newSection = eSectionAnvilInventory; + xOffset = ANVIL_SCENE_ITEM2_SLOT_DOWN_OFFSET; + } + else if(eTapDirection == eTapStateLeft) + { + newSection = eSectionAnvilItem1; + } + else if(eTapDirection == eTapStateRight) + { + newSection = eSectionAnvilResult; + } + break; + case eSectionAnvilResult: + if(eTapDirection == eTapStateUp) + { + newSection = eSectionAnvilName; + } + else if(eTapDirection == eTapStateDown) + { + newSection = eSectionAnvilInventory; + xOffset = ANVIL_SCENE_RESULT_SLOT_DOWN_OFFSET; + } + else if(eTapDirection == eTapStateLeft) + { + newSection = eSectionAnvilItem2; + } + else if(eTapDirection == eTapStateRight) + { + newSection = eSectionAnvilItem1; + } + break; + case eSectionAnvilName: + if(eTapDirection == eTapStateUp) + { + newSection = eSectionAnvilUsing; + xOffset = ANVIL_SCENE_ITEM2_SLOT_UP_OFFSET; + } + else if(eTapDirection == eTapStateDown) + { + newSection = eSectionAnvilItem2; + } + break; + case eSectionAnvilInventory: + if(eTapDirection == eTapStateDown) + { + newSection = eSectionAnvilUsing; + } + else if(eTapDirection == eTapStateUp) + { + if( *piTargetX <= ANVIL_SCENE_ITEM1_SLOT_UP_OFFSET) + { + newSection = eSectionAnvilItem1; + } + else if( *piTargetX <= ANVIL_SCENE_ITEM2_SLOT_UP_OFFSET) + { + newSection = eSectionAnvilItem2; + } + else if( *piTargetX >= ANVIL_SCENE_RESULT_SLOT_UP_OFFSET) + { + newSection = eSectionAnvilResult; + } + } + break; + case eSectionAnvilUsing: + if(eTapDirection == eTapStateUp) + { + newSection = eSectionAnvilInventory; + } + else if(eTapDirection == eTapStateDown) + { + if( *piTargetX <= ANVIL_SCENE_ITEM1_SLOT_UP_OFFSET) + { + newSection = eSectionAnvilItem1; + } + else if( *piTargetX <= ANVIL_SCENE_ITEM2_SLOT_UP_OFFSET) + { + newSection = eSectionAnvilName; + } + else if( *piTargetX >= ANVIL_SCENE_RESULT_SLOT_UP_OFFSET) + { + newSection = eSectionAnvilName; + } + } + break; + default: + assert( false ); + break; + } + + updateSlotPosition(eSection, newSection, eTapDirection, piTargetX, piTargetY, xOffset); + + return newSection; +} + +int IUIScene_AnvilMenu::getSectionStartOffset(ESceneSection eSection) +{ + int offset = 0; + switch( eSection ) + { + case eSectionAnvilItem1: + offset = MerchantMenu::PAYMENT1_SLOT; + break; + case eSectionAnvilItem2: + offset = MerchantMenu::PAYMENT2_SLOT; + break; + case eSectionAnvilResult: + offset = MerchantMenu::RESULT_SLOT; + break; + case eSectionAnvilInventory: + offset = MerchantMenu::INV_SLOT_START; + break; + case eSectionAnvilUsing: + offset = MerchantMenu::USE_ROW_SLOT_START; + break; + default: + assert( false ); + break; + } + return offset; +} + +void IUIScene_AnvilMenu::handleOtherClicked(int iPad, ESceneSection eSection, int buttonNum, bool quickKey) +{ + switch(eSection) + { + case eSectionAnvilName: + handleEditNamePressed(); + break; + }; +} + +bool IUIScene_AnvilMenu::IsSectionSlotList( ESceneSection eSection ) +{ + switch( eSection ) + { + case eSectionAnvilUsing: + case eSectionAnvilInventory: + case eSectionAnvilItem1: + case eSectionAnvilItem2: + case eSectionAnvilResult: + return true; + } + return false; +} + +void IUIScene_AnvilMenu::handleTick() +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + bool canAfford = true; + wstring m_costString = L""; + + if(m_repairMenu->cost > 0) + { + if(m_repairMenu->cost >= 40 && !pMinecraft->localplayers[getPad()]->abilities.instabuild) + { + m_costString = app.GetString(IDS_REPAIR_EXPENSIVE); + canAfford = false; + } + else if(!m_repairMenu->getSlot(AnvilMenu::RESULT_SLOT)->hasItem()) + { + // Do nothing + } + else + { + LPCWSTR costString = app.GetString(IDS_REPAIR_COST); + wchar_t temp[256]; + swprintf(temp, 256, costString, m_repairMenu->cost); + m_costString = temp; + if(!m_repairMenu->getSlot(AnvilMenu::RESULT_SLOT)->mayPickup(dynamic_pointer_cast(m_inventory->player->shared_from_this()))) + { + canAfford = false; + } + } + } + setCostLabel(m_costString, canAfford); + + 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(AnvilMenu::INPUT_SLOT); + if (slot != NULL && slot->hasItem()) + { + if (!slot->getItem()->hasCustomHoverName() && m_itemName.compare(slot->getItem()->getHoverName())==0) + { + m_itemName = L""; + } + } + + m_repairMenu->setItemName(m_itemName); + + // Convert to byteArray + ByteArrayOutputStream baos; + DataOutputStream dos(&baos); + dos.writeUTF(m_itemName); + Minecraft::GetInstance()->localplayers[getPad()]->connection->send(shared_ptr(new CustomPayloadPacket(CustomPayloadPacket::SET_ITEM_NAME_PACKET, baos.toByteArray()))); +} + +void IUIScene_AnvilMenu::refreshContainer(AbstractContainerMenu *container, vector > *items) +{ + slotChanged(container, AnvilMenu::INPUT_SLOT, container->getSlot(0)->getItem()); +} + +void IUIScene_AnvilMenu::slotChanged(AbstractContainerMenu *container, int slotIndex, shared_ptr item) +{ + if (slotIndex == AnvilMenu::INPUT_SLOT) + { + m_itemName = item == NULL ? L"" : item->getHoverName(); + setEditNameValue(m_itemName); + setEditNameEditable(item != NULL); + if (item != NULL) + { + updateItemName(); + } + } +} + +void IUIScene_AnvilMenu::setContainerData(AbstractContainerMenu *container, int id, int value) +{ +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/IUIScene_AnvilMenu.h b/Minecraft.Client/Common/UI/IUIScene_AnvilMenu.h new file mode 100644 index 00000000..4e9e3aa7 --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_AnvilMenu.h @@ -0,0 +1,45 @@ +#pragma once +#include "IUIScene_AbstractContainerMenu.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.ContainerListener.h" + +// The 0-indexed slot in the inventory list that lines up with the result slot +#define ANVIL_SCENE_RESULT_SLOT_UP_OFFSET 5 +#define ANVIL_SCENE_RESULT_SLOT_DOWN_OFFSET 5 +#define ANVIL_SCENE_ITEM1_SLOT_UP_OFFSET 3 +#define ANVIL_SCENE_ITEM1_SLOT_DOWN_OFFSET 3 +#define ANVIL_SCENE_ITEM2_SLOT_UP_OFFSET 4 +#define ANVIL_SCENE_ITEM2_SLOT_DOWN_OFFSET 4 + +class Inventory; +class AnvilMenu; + +class IUIScene_AnvilMenu : public virtual IUIScene_AbstractContainerMenu, public net_minecraft_world_inventory::ContainerListener +{ +protected: + shared_ptr m_inventory; + AnvilMenu *m_repairMenu; + wstring m_itemName; + +protected: + IUIScene_AnvilMenu(); + + virtual ESceneSection GetSectionAndSlotInDirection( ESceneSection eSection, ETapState eTapDirection, int *piTargetX, int *piTargetY ); + int getSectionStartOffset(ESceneSection eSection); + virtual void handleOtherClicked(int iPad, ESceneSection eSection, int buttonNum, bool quickKey); + bool IsSectionSlotList( ESceneSection eSection ); + + void handleTick(); + + // Anvil only + virtual void handleEditNamePressed() = 0; + virtual void setEditNameValue(const wstring &name) = 0; + virtual void setEditNameEditable(bool enabled) = 0; + virtual void setCostLabel(const wstring &label, bool canAfford) = 0; + virtual void showCross(bool show) = 0; + void updateItemName(); + + // ContainerListenr + void refreshContainer(AbstractContainerMenu *container, vector > *items); + void slotChanged(AbstractContainerMenu *container, int slotIndex, shared_ptr item); + void setContainerData(AbstractContainerMenu *container, int id, int value); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/IUIScene_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_BrewingMenu.cpp b/Minecraft.Client/Common/UI/IUIScene_BrewingMenu.cpp new file mode 100644 index 00000000..44bbdc44 --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_BrewingMenu.cpp @@ -0,0 +1,151 @@ +#include "stdafx.h" + +#include "IUIScene_BrewingMenu.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" + +IUIScene_AbstractContainerMenu::ESceneSection IUIScene_BrewingMenu::GetSectionAndSlotInDirection( ESceneSection eSection, ETapState eTapDirection, int *piTargetX, int *piTargetY ) +{ + ESceneSection newSection = eSection; + int xOffset = 0; + + // Find the new section if there is one + switch( eSection ) + { + case eSectionBrewingBottle1: + if(eTapDirection == eTapStateUp) + { + newSection = eSectionBrewingIngredient; + } + else if(eTapDirection == eTapStateDown) + { + newSection = eSectionBrewingInventory; + xOffset = BREWING_SCENE_BOTTLE1_SLOT_DOWN_OFFSET; + } + else if(eTapDirection == eTapStateLeft) + { + newSection = eSectionBrewingBottle3; + } + else if(eTapDirection == eTapStateRight) + { + newSection = eSectionBrewingBottle2; + } + break; + case eSectionBrewingBottle2: + if(eTapDirection == eTapStateUp) + { + newSection = eSectionBrewingIngredient; + } + else if(eTapDirection == eTapStateDown) + { + newSection = eSectionBrewingInventory; + xOffset = BREWING_SCENE_BOTTLE2_SLOT_DOWN_OFFSET; + } + else if(eTapDirection == eTapStateLeft) + { + newSection = eSectionBrewingBottle1; + } + else if(eTapDirection == eTapStateRight) + { + newSection = eSectionBrewingBottle3; + } + break; + case eSectionBrewingBottle3: + if(eTapDirection == eTapStateUp) + { + newSection = eSectionBrewingIngredient; + } + else if(eTapDirection == eTapStateDown) + { + newSection = eSectionBrewingInventory; + xOffset = BREWING_SCENE_BOTTLE3_SLOT_DOWN_OFFSET; + } + else if(eTapDirection == eTapStateLeft) + { + newSection = eSectionBrewingBottle2; + } + else if(eTapDirection == eTapStateRight) + { + newSection = eSectionBrewingBottle1; + } + break; + case eSectionBrewingIngredient: + if(eTapDirection == eTapStateUp) + { + newSection = eSectionBrewingUsing; + xOffset = BREWING_SCENE_INGREDIENT_SLOT_DOWN_OFFSET; + } + else if(eTapDirection == eTapStateDown) + { + newSection = eSectionBrewingBottle2; + } + break; + case eSectionBrewingInventory: + if(eTapDirection == eTapStateDown) + { + newSection = eSectionBrewingUsing; + } + else if(eTapDirection == eTapStateUp) + { + if( *piTargetX <= BREWING_SCENE_BOTTLE1_SLOT_UP_OFFSET) + { + newSection = eSectionBrewingBottle1; + } + else if( *piTargetX <= BREWING_SCENE_BOTTLE2_SLOT_UP_OFFSET) + { + newSection = eSectionBrewingBottle2; + } + else if( *piTargetX >= BREWING_SCENE_BOTTLE3_SLOT_UP_OFFSET) + { + newSection = eSectionBrewingBottle3; + } + } + break; + case eSectionBrewingUsing: + if(eTapDirection == eTapStateUp) + { + newSection = eSectionBrewingInventory; + } + else if(eTapDirection == eTapStateDown) + { + newSection = eSectionBrewingIngredient; + } + break; + default: + assert( false ); + break; + } + + updateSlotPosition(eSection, newSection, eTapDirection, piTargetX, piTargetY, xOffset); + + return newSection; +} + +int IUIScene_BrewingMenu::getSectionStartOffset(ESceneSection eSection) +{ + int offset = 0; + switch( eSection ) + { + case eSectionBrewingBottle1: + offset = BrewingStandMenu::BOTTLE_SLOT_START; + break; + case eSectionBrewingBottle2: + offset = BrewingStandMenu::BOTTLE_SLOT_START + 1; + break; + case eSectionBrewingBottle3: + offset = BrewingStandMenu::BOTTLE_SLOT_START + 2; + break; + case eSectionBrewingIngredient: + offset = BrewingStandMenu::INGREDIENT_SLOT; + break; + case eSectionBrewingInventory: + offset = BrewingStandMenu::INV_SLOT_START; + break; + case eSectionBrewingUsing: + offset = BrewingStandMenu::INV_SLOT_START + 27; + break; + default: + assert( false ); + break; + } + return offset; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/IUIScene_BrewingMenu.h b/Minecraft.Client/Common/UI/IUIScene_BrewingMenu.h new file mode 100644 index 00000000..2d5150bb --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_BrewingMenu.h @@ -0,0 +1,19 @@ +#pragma once +#include "IUIScene_AbstractContainerMenu.h" + +// The 0-indexed slot in the inventory list that lines up with the result slot +#define BREWING_SCENE_INGREDIENT_SLOT_UP_OFFSET 5 +#define BREWING_SCENE_INGREDIENT_SLOT_DOWN_OFFSET 5 +#define BREWING_SCENE_BOTTLE1_SLOT_UP_OFFSET 3 +#define BREWING_SCENE_BOTTLE1_SLOT_DOWN_OFFSET 3 +#define BREWING_SCENE_BOTTLE2_SLOT_UP_OFFSET 4 +#define BREWING_SCENE_BOTTLE2_SLOT_DOWN_OFFSET 4 +#define BREWING_SCENE_BOTTLE3_SLOT_UP_OFFSET 5 +#define BREWING_SCENE_BOTTLE3_SLOT_DOWN_OFFSET 5 + +class IUIScene_BrewingMenu : public virtual IUIScene_AbstractContainerMenu +{ +protected: + virtual ESceneSection GetSectionAndSlotInDirection( ESceneSection eSection, ETapState eTapDirection, int *piTargetX, int *piTargetY ); + int getSectionStartOffset(ESceneSection eSection); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/IUIScene_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_ContainerMenu.cpp b/Minecraft.Client/Common/UI/IUIScene_ContainerMenu.cpp new file mode 100644 index 00000000..c6a4df00 --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_ContainerMenu.cpp @@ -0,0 +1,71 @@ +#include "stdafx.h" +#include "IUIScene_ContainerMenu.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" + +IUIScene_AbstractContainerMenu::ESceneSection IUIScene_ContainerMenu::GetSectionAndSlotInDirection( ESceneSection eSection, ETapState eTapDirection, int *piTargetX, int *piTargetY ) +{ + ESceneSection newSection = eSection; + + // Find the new section if there is one + switch( eSection ) + { + case eSectionContainerChest: + if(eTapDirection == eTapStateDown) + { + newSection = eSectionContainerInventory; + } + else if(eTapDirection == eTapStateUp) + { + newSection = eSectionContainerUsing; + } + break; + case eSectionContainerInventory: + if(eTapDirection == eTapStateDown) + { + newSection = eSectionContainerUsing; + } + else if(eTapDirection == eTapStateUp) + { + newSection = eSectionContainerChest; + } + break; + case eSectionContainerUsing: + if(eTapDirection == eTapStateDown) + { + newSection = eSectionContainerChest; + } + else if(eTapDirection == eTapStateUp) + { + newSection = eSectionContainerInventory; + } + break; + default: + assert( false ); + break; + } + + updateSlotPosition(eSection, newSection, eTapDirection, piTargetX, piTargetY, 0); + + return newSection; +} + +int IUIScene_ContainerMenu::getSectionStartOffset(ESceneSection eSection) +{ + int offset = 0; + switch( eSection ) + { + case eSectionContainerChest: + offset = 0; + break; + case eSectionContainerInventory: + offset = m_menu->getSize() - (27+9); + break; + case eSectionContainerUsing: + offset = m_menu->getSize() - 9; + break; + default: + assert( false ); + break; + } + return offset; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/IUIScene_ContainerMenu.h b/Minecraft.Client/Common/UI/IUIScene_ContainerMenu.h new file mode 100644 index 00000000..e0408b39 --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_ContainerMenu.h @@ -0,0 +1,10 @@ +#pragma once + +#include "IUIScene_AbstractContainerMenu.h" + +class IUIScene_ContainerMenu : public virtual IUIScene_AbstractContainerMenu +{ +protected: + virtual ESceneSection GetSectionAndSlotInDirection( ESceneSection eSection, ETapState eTapDirection, int *piTargetX, int *piTargetY ); + int getSectionStartOffset(ESceneSection eSection); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/IUIScene_CraftingMenu.cpp b/Minecraft.Client/Common/UI/IUIScene_CraftingMenu.cpp new file mode 100644 index 00000000..05a44202 --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_CraftingMenu.cpp @@ -0,0 +1,1424 @@ +#include "stdafx.h" + +#include "..\..\..\Minecraft.World\net.minecraft.world.item.crafting.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.tile.h" +#include "..\..\..\Minecraft.World\net.minecraft.stats.h" +#include "..\..\LocalPlayer.h" +#include "IUIScene_CraftingMenu.h" + +Recipy::_eGroupType IUIScene_CraftingMenu::m_GroupTypeMapping4GridA[IUIScene_CraftingMenu::m_iMaxGroup2x2]= +{ + Recipy::eGroupType_Structure, + Recipy::eGroupType_Tool, + Recipy::eGroupType_Food, + Recipy::eGroupType_Mechanism, + Recipy::eGroupType_Transport, + Recipy::eGroupType_Decoration, +}; + +Recipy::_eGroupType IUIScene_CraftingMenu::m_GroupTypeMapping9GridA[IUIScene_CraftingMenu::m_iMaxGroup3x3]= +{ + Recipy::eGroupType_Structure, + Recipy::eGroupType_Tool, + Recipy::eGroupType_Food, + Recipy::eGroupType_Armour, + Recipy::eGroupType_Mechanism, + Recipy::eGroupType_Transport, + Recipy::eGroupType_Decoration, +}; + + +LPCWSTR IUIScene_CraftingMenu::m_GroupIconNameA[m_iMaxGroup3x3]= +{ + L"Structures",//Recipy::eGroupType_Structure, + L"Tools",//Recipy::eGroupType_Tool, + L"Food",//Recipy::eGroupType_Food, + L"Armour",//Recipy::eGroupType_Armour, + L"Mechanisms",//Recipy::eGroupType_Mechanism, + L"Transport",//Recipy::eGroupType_Transport, + L"Decoration",//Recipy::eGroupType_Decoration, +}; + +IUIScene_CraftingMenu::_eGroupTab IUIScene_CraftingMenu::m_GroupTabBkgMapping2x2A[m_iMaxGroup2x2]= +{ + eGroupTab_Left, + eGroupTab_Middle, + eGroupTab_Middle, + eGroupTab_Middle, + eGroupTab_Middle, + eGroupTab_Right, +}; + +IUIScene_CraftingMenu::_eGroupTab IUIScene_CraftingMenu::m_GroupTabBkgMapping3x3A[m_iMaxGroup3x3]= +{ + eGroupTab_Left, + eGroupTab_Middle, + eGroupTab_Middle, + eGroupTab_Middle, + eGroupTab_Middle, + eGroupTab_Middle, + eGroupTab_Right, +}; + + +// mapping array to map the base objects to their description string +// This should map the enums +// enum +// { +// eBaseItemType_undefined=0, +// eBaseItemType_sword, +// eBaseItemType_shovel, +// eBaseItemType_pickaxe, +// eBaseItemType_hatchet, +// eBaseItemType_hoe, +// eBaseItemType_door, +// eBaseItemType_helmet, +// eBaseItemType_chestplate, +// eBaseItemType_leggings, +// eBaseItemType_boots, +// eBaseItemType_ingot, +// eBaseItemType_rail, +// eBaseItemType_block, +// eBaseItemType_pressureplate, +// eBaseItemType_stairs, +// eBaseItemType_cloth, +// eBaseItemType_dyepowder, +// eBaseItemType_structplanks +// eBaseItemType_structblock, +// eBaseItemType_slab, +// eBaseItemType_halfslab, +// eBaseItemType_torch, +// eBaseItemType_bow, +// eBaseItemType_pockettool, +// eBaseItemType_utensil, +// +// } +// eBaseItemType; + +IUIScene_CraftingMenu::IUIScene_CraftingMenu() +{ + m_iCurrentSlotHIndex=0; + m_iCurrentSlotVIndex=1; + + for(int i=0;ilocalgameModes[getPad()] != NULL ) + { + Tutorial *tutorial = pMinecraft->localgameModes[getPad()]->getTutorial(); + if(tutorial != NULL) + { + tutorial->handleUIInput(iAction); + if(ui.IsTutorialVisible(getPad()) && !tutorial->isInputAllowed(iAction)) + { + return S_OK; + } + } + } + + + switch(iAction) + { + case ACTION_MENU_X: + + // change the display + m_iDisplayDescription++; + if(m_iDisplayDescription==DISPLAY_MAX) m_iDisplayDescription=DISPLAY_INVENTORY; + ui.PlayUISFX(eSFX_Focus); + UpdateMultiPanel(); + UpdateTooltips(); + break; + case ACTION_MENU_PAUSEMENU: + case ACTION_MENU_B: + ui.ShowTooltip( iPad, eToolTipButtonX, false ); + ui.ShowTooltip( iPad, eToolTipButtonB, false ); + ui.ShowTooltip( iPad, eToolTipButtonA, false ); + ui.ShowTooltip( iPad, eToolTipButtonRB, false ); + // kill the crafting xui + //ui.PlayUISFX(eSFX_Back); + ui.CloseUIScenes(iPad); + + bHandled = true; + break; + case ACTION_MENU_A: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + // Do some crafting! + if(m_pPlayer && m_pPlayer->inventory) + { + //RecipyList *recipes = ((Recipes *)Recipes::getInstance())->getRecipies(); + Recipy::INGREDIENTS_REQUIRED *pRecipeIngredientsRequired=Recipes::getInstance()->getRecipeIngredientsArray(); + // Force a make if the debug is on + if(app.DebugSettingsOn() && app.GetGameSettingsDebugMask(ProfileManager.GetPrimaryPad())&(1L< pTempItemInst=pRecipeIngredientsRequired[iRecipe].pRecipy->assemble(nullptr); + //int iIcon=pTempItemInst->getItem()->getIcon(pTempItemInst->getAuxValue()); + + if( pMinecraft->localgameModes[iPad] != NULL) + { + Tutorial *tutorial = pMinecraft->localgameModes[iPad]->getTutorial(); + if(tutorial != NULL) + { + tutorial->onCrafted(pTempItemInst); + } + } + + pMinecraft->localgameModes[iPad]->handleCraftItem(iRecipe,m_pPlayer); + + if(m_pPlayer->inventory->add(pTempItemInst)==false) + { + // no room in inventory, so throw it down + m_pPlayer->drop(pTempItemInst); + } + // play a sound + //pMinecraft->soundEngine->playUI( L"random.pop", 1.0f, 1.0f); + ui.PlayUISFX(eSFX_Craft); + } + } + else if(CanBeMadeA[m_iCurrentSlotHIndex].iCount!=0) + { + int iSlot; + if(CanBeMadeA[m_iCurrentSlotHIndex].iCount>1) + { + iSlot=iVSlotIndexA[m_iCurrentSlotVIndex]; + } + else + { + iSlot=0; + } + int iRecipe= CanBeMadeA[m_iCurrentSlotHIndex].iRecipeA[iSlot]; + shared_ptr pTempItemInst=pRecipeIngredientsRequired[iRecipe].pRecipy->assemble(nullptr); + //int iIcon=pTempItemInst->getItem()->getIcon(pTempItemInst->getAuxValue()); + + if( pMinecraft->localgameModes[iPad] != NULL ) + { + Tutorial *tutorial = pMinecraft->localgameModes[iPad]->getTutorial(); + if(tutorial != NULL) + { + tutorial->createItemSelected(pTempItemInst, pRecipeIngredientsRequired[iRecipe].bCanMake[iPad]); + } + } + + if(pRecipeIngredientsRequired[iRecipe].bCanMake[iPad]) + { + pTempItemInst->onCraftedBy(m_pPlayer->level, dynamic_pointer_cast( m_pPlayer->shared_from_this() ), pTempItemInst->count ); + // TODO 4J Stu - handleCraftItem should do a lot more than what it does, loads of the "can we craft" code should also probably be + // shifted to the GameMode + pMinecraft->localgameModes[iPad]->handleCraftItem(iRecipe,m_pPlayer); + + // play a sound + //pMinecraft->soundEngine->playUI( L"random.pop", 1.0f, 1.0f); + ui.PlayUISFX(eSFX_Craft); + + if(pTempItemInst->id != Item::fireworksCharge_Id && pTempItemInst->id != Item::fireworks_Id) + { + // and remove those resources from your inventory + for(int i=0;i ingItemInst = nullptr; + // do we need to remove a specific aux value? + if(pRecipeIngredientsRequired[iRecipe].iIngAuxValA[i]!=Recipes::ANY_AUX_VALUE) + { + ingItemInst = m_pPlayer->inventory->getResourceItem( pRecipeIngredientsRequired[iRecipe].iIngIDA[i],pRecipeIngredientsRequired[iRecipe].iIngAuxValA[i] ); + m_pPlayer->inventory->removeResource(pRecipeIngredientsRequired[iRecipe].iIngIDA[i],pRecipeIngredientsRequired[iRecipe].iIngAuxValA[i]); + } + else + { + ingItemInst = m_pPlayer->inventory->getResourceItem( pRecipeIngredientsRequired[iRecipe].iIngIDA[i] ); + m_pPlayer->inventory->removeResource(pRecipeIngredientsRequired[iRecipe].iIngIDA[i]); + } + + // 4J Stu - Fix for #13097 - Bug: Milk Buckets are removed when crafting Cake + if (ingItemInst != NULL) + { + if (ingItemInst->getItem()->hasCraftingRemainingItem()) + { + // replace item with remaining result + m_pPlayer->inventory->add( shared_ptr( new ItemInstance(ingItemInst->getItem()->getCraftingRemainingItem()) ) ); + } + + } + } + } + + // 4J Stu - Fix for #13119 - We should add the item after we remove the ingredients + if(m_pPlayer->inventory->add(pTempItemInst)==false ) + { + // no room in inventory, so throw it down + m_pPlayer->drop(pTempItemInst); + } + + //4J Gordon: Achievements + switch(pTempItemInst->id ) + { + case Tile::workBench_Id: m_pPlayer->awardStat(GenericStats::buildWorkbench(), GenericStats::param_buildWorkbench()); break; + case Item::pickAxe_wood_Id: m_pPlayer->awardStat(GenericStats::buildPickaxe(), GenericStats::param_buildPickaxe()); break; + case Tile::furnace_Id: m_pPlayer->awardStat(GenericStats::buildFurnace(), GenericStats::param_buildFurnace()); break; + case Item::hoe_wood_Id: m_pPlayer->awardStat(GenericStats::buildHoe(), GenericStats::param_buildHoe()); break; + case Item::bread_Id: m_pPlayer->awardStat(GenericStats::makeBread(), GenericStats::param_makeBread()); break; + case Item::cake_Id: m_pPlayer->awardStat(GenericStats::bakeCake(), GenericStats::param_bakeCake()); break; + case Item::pickAxe_stone_Id: m_pPlayer->awardStat(GenericStats::buildBetterPickaxe(), GenericStats::param_buildBetterPickaxe()); break; + case Item::sword_wood_Id: m_pPlayer->awardStat(GenericStats::buildSword(), GenericStats::param_buildSword()); break; + case Tile::dispenser_Id: m_pPlayer->awardStat(GenericStats::dispenseWithThis(), GenericStats::param_dispenseWithThis()); break; + case Tile::enchantTable_Id: m_pPlayer->awardStat(GenericStats::enchantments(), GenericStats::param_enchantments()); break; + case Tile::bookshelf_Id: m_pPlayer->awardStat(GenericStats::bookcase(), GenericStats::param_bookcase()); break; + } + + // We've used some ingredients from our inventory, so update the recipes we can make + CheckRecipesAvailable(); + // don't reset the vertical slots - we want to stay where we are + UpdateVerticalSlots(); + UpdateHighlight(); + } + } + else + { + //pMinecraft->soundEngine->playUI( L"btn.back", 1.0f, 1.0f); + ui.PlayUISFX(eSFX_CraftFail); + } + } + } + break; + + case ACTION_MENU_LEFT_SCROLL: + // turn off the old group tab + showTabHighlight(m_iGroupIndex,false); + + if(m_iGroupIndex==0) + { + if(m_iContainerType==RECIPE_TYPE_3x3) + { + m_iGroupIndex=m_iMaxGroup3x3-1; + } + else + { + m_iGroupIndex=m_iMaxGroup2x2-1; + } + } + else + { + m_iGroupIndex--; + } + // turn on the new group + showTabHighlight(m_iGroupIndex,true); + + m_iCurrentSlotHIndex=0; + m_iCurrentSlotVIndex=1; + + CheckRecipesAvailable(); + // reset the vertical slots + iVSlotIndexA[0]=CanBeMadeA[m_iCurrentSlotHIndex].iCount-1; + iVSlotIndexA[1]=0; + iVSlotIndexA[2]=1; + ui.PlayUISFX(eSFX_Focus); + UpdateVerticalSlots(); + UpdateHighlight(); + setGroupText(GetGroupNameText(m_pGroupA[m_iGroupIndex])); + + break; + case ACTION_MENU_RIGHT_SCROLL: + // turn off the old group tab + showTabHighlight(m_iGroupIndex,false); + + m_iGroupIndex++; + if(m_iContainerType==RECIPE_TYPE_3x3) + { + if(m_iGroupIndex==m_iMaxGroup3x3) m_iGroupIndex=0; + } + else + { + if(m_iGroupIndex==m_iMaxGroup2x2) m_iGroupIndex=0; + } + // turn on the new group + showTabHighlight(m_iGroupIndex,true); + + m_iCurrentSlotHIndex=0; + m_iCurrentSlotVIndex=1; + CheckRecipesAvailable(); + // reset the vertical slots + iVSlotIndexA[0]=CanBeMadeA[m_iCurrentSlotHIndex].iCount-1; + iVSlotIndexA[1]=0; + iVSlotIndexA[2]=1; + ui.PlayUISFX(eSFX_Focus); + UpdateVerticalSlots(); + UpdateHighlight(); + setGroupText(GetGroupNameText(m_pGroupA[m_iGroupIndex])); + break; + } + + // 4J-Tomk - check if we've only got one vertical scroll slot (480, splits & Vita) + bool bNoScrollSlots = false; + if(m_bSplitscreen ||(!RenderManager.IsHiDef() && !RenderManager.IsWidescreen())) + { + bNoScrollSlots = true; + } +#ifdef __PSVITA__ + bNoScrollSlots = true; +#endif + + // 4J Stu - We did used to swap the thumsticks based on Southpaw in this scene, but ONLY in this scene + switch(iAction) + { + case ACTION_MENU_OTHER_STICK_UP: + scrollDescriptionUp(); + break; + case ACTION_MENU_OTHER_STICK_DOWN: + scrollDescriptionDown(); + break; + case ACTION_MENU_RIGHT: + { + int iOldHSlot=m_iCurrentSlotHIndex; + + m_iCurrentSlotHIndex++; + if(m_iCurrentSlotHIndex>=m_iCraftablesMaxHSlotC) m_iCurrentSlotHIndex=0; + m_iCurrentSlotVIndex=1; + // clear the indices + iVSlotIndexA[0]=CanBeMadeA[m_iCurrentSlotHIndex].iCount-1; + iVSlotIndexA[1]=0; + iVSlotIndexA[2]=1; + + UpdateVerticalSlots(); + UpdateHighlight(); + // re-enable the old hslot + if(CanBeMadeA[iOldHSlot].iCount>0) + { + setShowCraftHSlot(iOldHSlot,true); + } + ui.PlayUISFX(eSFX_Focus); + bHandled = true; + } + break; + case ACTION_MENU_LEFT: + { + if(m_iCraftablesMaxHSlotC!=0) + { + int iOldHSlot=m_iCurrentSlotHIndex; + if(m_iCurrentSlotHIndex==0) m_iCurrentSlotHIndex=m_iCraftablesMaxHSlotC-1; + else m_iCurrentSlotHIndex--; + m_iCurrentSlotVIndex=1; + // clear the indices + iVSlotIndexA[0]=CanBeMadeA[m_iCurrentSlotHIndex].iCount-1; + iVSlotIndexA[1]=0; + iVSlotIndexA[2]=1; + + UpdateVerticalSlots(); + UpdateHighlight(); + // re-enable the old hslot + if(CanBeMadeA[iOldHSlot].iCount>0) + { + setShowCraftHSlot(iOldHSlot,true); + } + ui.PlayUISFX(eSFX_Focus); + } + bHandled = true; + } + break; + case ACTION_MENU_UP: + { + if(CanBeMadeA[m_iCurrentSlotHIndex].iCount>1) + { + if(bNoScrollSlots) + { + if(iVSlotIndexA[1]==0) + { + iVSlotIndexA[1]=CanBeMadeA[m_iCurrentSlotHIndex].iCount-1; + } + else + { + iVSlotIndexA[1]--; + } + ui.PlayUISFX(eSFX_Focus); + } + else + if(CanBeMadeA[m_iCurrentSlotHIndex].iCount>2) + { + { + if(m_iCurrentSlotVIndex!=0) + { + // just move the highlight + m_iCurrentSlotVIndex--; + ui.PlayUISFX(eSFX_Focus); + } + else + { + //move the slots + iVSlotIndexA[2]=iVSlotIndexA[1]; + iVSlotIndexA[1]=iVSlotIndexA[0]; + // on 0 and went up, so cycle the values + if(iVSlotIndexA[0]==0) + { + iVSlotIndexA[0]=CanBeMadeA[m_iCurrentSlotHIndex].iCount-1; + } + else + { + iVSlotIndexA[0]--; + } + ui.PlayUISFX(eSFX_Focus); + } + } + } + else + { + if(m_iCurrentSlotVIndex!=1) + { + // just move the highlight + m_iCurrentSlotVIndex--; + ui.PlayUISFX(eSFX_Focus); + } + } + UpdateVerticalSlots(); + UpdateHighlight(); + } + + } + break; + case ACTION_MENU_DOWN: + { + if(CanBeMadeA[m_iCurrentSlotHIndex].iCount>1) + { + if(bNoScrollSlots) + { + if(iVSlotIndexA[1]==(CanBeMadeA[m_iCurrentSlotHIndex].iCount-1)) + { + iVSlotIndexA[1]=0; + } + else + { + iVSlotIndexA[1]++; + } + ui.PlayUISFX(eSFX_Focus); + + } + else + if(CanBeMadeA[m_iCurrentSlotHIndex].iCount>2) + { + if(m_iCurrentSlotVIndex!=2) + { + m_iCurrentSlotVIndex++; + ui.PlayUISFX(eSFX_Focus); + } + else + { + iVSlotIndexA[0]=iVSlotIndexA[1]; + iVSlotIndexA[1]=iVSlotIndexA[2]; + if(iVSlotIndexA[m_iCurrentSlotVIndex]==(CanBeMadeA[m_iCurrentSlotHIndex].iCount-1)) + { + iVSlotIndexA[2]=0; + } + else + { + iVSlotIndexA[2]++; + } + ui.PlayUISFX(eSFX_Focus); + } + } + else + { + if(m_iCurrentSlotVIndex!=(CanBeMadeA[m_iCurrentSlotHIndex].iCount)) + { + m_iCurrentSlotVIndex++; + ui.PlayUISFX(eSFX_Focus); + } + } + UpdateVerticalSlots(); + UpdateHighlight(); + } + } + break; + } + + return bHandled; +} + +////////////////////////////////////////////////////////////////////////// +// +// CheckRecipesAvailable +// +////////////////////////////////////////////////////////////////////////// +void IUIScene_CraftingMenu::CheckRecipesAvailable() +{ + int iHSlotBrushControl=0; + + // clear the current list + memset(CanBeMadeA,0,sizeof(CANBEMADE)*m_iCraftablesMaxHSlotC); + + hideAllHSlots(); + + if(m_pPlayer && m_pPlayer->inventory) + { + // dump out the inventory + /* for (unsigned int k = 0; k < m_pPlayer->inventory->items.length; k++) + { + if (m_pPlayer->inventory->items[k] != NULL) + { + wstring itemstring=m_pPlayer->inventory->items[k]->toString(); + + //printf("--- Player has "); + OutputDebugStringW(itemstring.c_str()); + //printf(" with Aux val = %d, base type = %d, Material = %d\n",m_pPlayer->inventory->items[k]->getAuxValue(),m_pPlayer->inventory->items[k]->getItem()->getBaseItemType(),m_pPlayer->inventory->items[k]->getItem()->getMaterial()); + } + } + */ + RecipyList *recipes = ((Recipes *)Recipes::getInstance())->getRecipies(); + Recipy::INGREDIENTS_REQUIRED *pRecipeIngredientsRequired=Recipes::getInstance()->getRecipeIngredientsArray(); + int iRecipeC=(int)recipes->size(); + AUTO_VAR(itRecipe, recipes->begin()); + + // dump out the recipe products + + // for (int i = 0; i < iRecipeC; i++) + // { + // shared_ptr pTempItemInst=pRecipeIngredientsRequired[i].pRecipy->assemble(NULL); + // if (pTempItemInst != NULL) + // { + // wstring itemstring=pTempItemInst->toString(); + // + // printf("Recipe [%d] = ",i); + // OutputDebugStringW(itemstring.c_str()); + // if(pTempItemInst->id!=0) + // { + // if(pTempItemInst->id<256) + // { + // Tile *pTile=Tile::tiles[pTempItemInst->id]; + // printf("[TILE] ID\t%d\tAux val\t%d\tBase type\t%d\tMaterial\t%d\t Count=%d\n",pTempItemInst->id, pTempItemInst->getAuxValue(),pTile->getBaseItemType(),pTile->getMaterial(),pTempItemInst->GetCount()); + // } + // else + // { + // printf("ID\t%d\tAux val\t%d\tBase type\t%d\tMaterial\t%d Count=%d\n",pTempItemInst->id, pTempItemInst->getAuxValue(),pTempItemInst->getItem()->getBaseItemType(),pTempItemInst->getItem()->getMaterial(),pTempItemInst->GetCount()); + // } + // + // } + // } + // } + + for(int i=0;igetGroup()!=m_pGroupA[m_iGroupIndex]) + { + itRecipe++; + pRecipeIngredientsRequired[i].bCanMake[getPad()]=false; + continue; + } + // if we are in the inventory menu, then we have 2x2 crafting available only + if((m_iContainerType==RECIPE_TYPE_2x2) && (pRecipeIngredientsRequired[i].iType==RECIPE_TYPE_3x3)) + { + // need a crafting table for this recipe + itRecipe++; + pRecipeIngredientsRequired[i].bCanMake[getPad()]=false; + continue; + } + // clear the mask showing which ingredients are missing + pRecipeIngredientsRequired[i].usBitmaskMissingGridIngredients[getPad()]=0; + + //bool bCanMakeRecipe=true; + bool *bFoundA= new bool [pRecipeIngredientsRequired[i].iIngC]; + for(int j=0;jinventory->items.length; k++) + { + if (m_pPlayer->inventory->items[k] != NULL) + { + // do they have the ingredient, and the aux value matches, and enough off it? + if((m_pPlayer->inventory->items[k]->id == pRecipeIngredientsRequired[i].iIngIDA[j]) && + // check if the ingredient required doesn't care about the aux value, or if it does, does the inventory item aux match it + ((pRecipeIngredientsRequired[i].iIngAuxValA[j]==Recipes::ANY_AUX_VALUE) || (pRecipeIngredientsRequired[i].iIngAuxValA[j]==m_pPlayer->inventory->items[k]->getAuxValue())) + ) + { + // do they have enough? We need to check the whole inventory, since they may have enough in different slots (milk isn't milkx3, but milk,milk,milk) + if(m_pPlayer->inventory->items[k]->GetCount()>=pRecipeIngredientsRequired[i].iIngValA[j]) + { + // they have enough with one slot + bFoundA[j]=true; + } + else + { + // look at the combined value from the whole inventory + + for(unsigned int l=0;linventory->items.length;l++) + { + if (m_pPlayer->inventory->items[l] != NULL) + { + if( + (m_pPlayer->inventory->items[l]->id == pRecipeIngredientsRequired[i].iIngIDA[j]) && + ( (pRecipeIngredientsRequired[i].iIngAuxValA[j]==Recipes::ANY_AUX_VALUE) || (pRecipeIngredientsRequired[i].iIngAuxValA[j]==m_pPlayer->inventory->items[l]->getAuxValue() )) + ) + { + iTotalCount+=m_pPlayer->inventory->items[l]->GetCount(); + } + } + } + + if(iTotalCount>=pRecipeIngredientsRequired[i].iIngValA[j]) + { + bFoundA[j]=true; + } + } + + // 4J Stu - TU-1 hotfix + // Fix for #13143 - Players are able to craft items they do not have enough ingredients for if they store the ingredients in multiple, smaller stacks + break; + } + } + } + // if bFoundA[j] is false, then we didn't have enough of the ingredient required by the recipe, so mark the grid items we're short of + if(bFoundA[j]==false) + { + int iMissing = pRecipeIngredientsRequired[i].iIngValA[j]-iTotalCount; + int iGridIndex=0; + while(iMissing!=0) + { + // need to check if there is an aux val and match that + if(((pRecipeIngredientsRequired[i].uiGridA[iGridIndex]&0x00FFFFFF)==pRecipeIngredientsRequired[i].iIngIDA[j]) && + ((pRecipeIngredientsRequired[i].iIngAuxValA[j]==Recipes::ANY_AUX_VALUE) ||(pRecipeIngredientsRequired[i].iIngAuxValA[j]== ((pRecipeIngredientsRequired[i].uiGridA[iGridIndex]&0xFF000000)>>24))) ) + { + // this grid entry is the ingredient we don't have enough of + pRecipeIngredientsRequired[i].usBitmaskMissingGridIngredients[getPad()]|=1< pTempItemInst=pRecipeIngredientsRequired[i].pRecipy->assemble(nullptr); + //int iIcon=pTempItemInst->getItem()->getIcon(pTempItemInst->getAuxValue()); + int iID=pTempItemInst->getItem()->id; + int iBaseType; + + if(iID<256) // is it a tile? + { + iBaseType=Tile::tiles[iID]->getBaseItemType(); + } + else + { + iBaseType=pTempItemInst->getItem()->getBaseItemType(); + } + + // ignore for the misc base type - these have not been placed in a base type group + if(iBaseType!=Item::eBaseItemType_undefined) + { + for(int k=0;kgetDescriptionId())); +#endif + app.DebugPrintf("\n"); + + } + } + } + else + { + app.DebugPrintf("Need more HSlots\n"); + } + + delete [] bFoundA; + itRecipe++; + } + } + + // run through the canbemade list and update the icons displayed + int iIndex=0; + //RecipyList *recipes = ((Recipes *)Recipes::getInstance())->getRecipies(); + Recipy::INGREDIENTS_REQUIRED *pRecipeIngredientsRequired=Recipes::getInstance()->getRecipeIngredientsArray(); + + while((iIndex pTempItemInst=pRecipeIngredientsRequired[CanBeMadeA[iIndex].iRecipeA[0]].pRecipy->assemble(nullptr); + assert(pTempItemInst->id!=0); + unsigned int uiAlpha; + + if(app.DebugSettingsOn() && app.GetGameSettingsDebugMask(ProfileManager.GetPrimaryPad())&(1L<id == Item::clock_Id || pTempItemInst->id == Item::compass_Id ) + { + pTempItemInst->setAuxValue( 255 ); + } + setCraftHSlotItem(getPad(),iIndex,pTempItemInst,uiAlpha); + + iIndex++; + } + + // 4J-PB - Removed - UpdateTooltips will do this + // Update tooltips + /*if(CanBeMadeA[m_iCurrentSlotHIndex].iCount!=0) + { + ui.ShowTooltip( getPad(), eToolTipButtonA, true ); + // 4J-PB - not implemented ! + //ui.EnableTooltip( getPad(), eToolTipButtonA, true ); + } + else + { + ui.ShowTooltip( getPad(), eToolTipButtonA, false ); + }*/ +} + +////////////////////////////////////////////////////////////////////////// +// +// UpdateHighlight +// +////////////////////////////////////////////////////////////////////////// +void IUIScene_CraftingMenu::UpdateHighlight() +{ + updateHighlightAndScrollPositions(); + + bool bCanBeMade=CanBeMadeA[m_iCurrentSlotHIndex].iCount!=0; + if(bCanBeMade) + { + //RecipyList *recipes = ((Recipes *)Recipes::getInstance())->getRecipies(); + Recipy::INGREDIENTS_REQUIRED *pRecipeIngredientsRequired=Recipes::getInstance()->getRecipeIngredientsArray(); + int iSlot; + if(CanBeMadeA[m_iCurrentSlotHIndex].iCount>1) + { + iSlot=iVSlotIndexA[m_iCurrentSlotVIndex]; + } + else + { + iSlot=0; + } + shared_ptr pTempItemInstAdditional=pRecipeIngredientsRequired[CanBeMadeA[m_iCurrentSlotHIndex].iRecipeA[iSlot]].pRecipy->assemble(nullptr); + + // special case for the torch coal/charcoal + int id=pTempItemInstAdditional->getDescriptionId(); + LPCWSTR itemstring; + + switch(id) + { + case IDS_TILE_TORCH: + { + if(pRecipeIngredientsRequired[CanBeMadeA[m_iCurrentSlotHIndex].iRecipeA[iSlot]].iIngAuxValA[0]==1) + { + itemstring=app.GetString( IDS_TILE_TORCHCHARCOAL ); + } + else + { + itemstring=app.GetString( IDS_TILE_TORCHCOAL ); + } + } + break; + case IDS_ITEM_FIREBALL: + { + if(pRecipeIngredientsRequired[CanBeMadeA[m_iCurrentSlotHIndex].iRecipeA[iSlot]].iIngAuxValA[2]==1) + { + itemstring=app.GetString( IDS_ITEM_FIREBALLCHARCOAL ); + } + else + { + itemstring=app.GetString( IDS_ITEM_FIREBALLCOAL ); + } + } + break; + default: + itemstring=app.GetString(id ); + break; + } + + setItemText(itemstring); + } + else + { + setItemText(L""); + } + UpdateDescriptionText(bCanBeMade); + DisplayIngredients(); + + UpdateMultiPanel(); + + UpdateTooltips(); +} + +////////////////////////////////////////////////////////////////////////// +// +// UpdateVerticalSlots +// +////////////////////////////////////////////////////////////////////////// +void IUIScene_CraftingMenu::UpdateVerticalSlots() +{ + //RecipyList *recipes = ((Recipes *)Recipes::getInstance())->getRecipies(); + Recipy::INGREDIENTS_REQUIRED *pRecipeIngredientsRequired=Recipes::getInstance()->getRecipeIngredientsArray(); + + // update the vertical items for the current horizontal slot + hideAllVSlots(); + + // could have either 1 or 2 vertical slots, above and below the horizontal slot + if(CanBeMadeA[m_iCurrentSlotHIndex].iCount>1) + { + // turn off the horizontal one since we could be cycling through others + setShowCraftHSlot(m_iCurrentSlotHIndex,false); + int iSlots=(CanBeMadeA[m_iCurrentSlotHIndex].iCount>2)?3:2; + + // 4J-Tomk - check if we've only got one vertical scroll slot (480, splits & Vita) + bool bNoScrollSlots = false; + if(m_bSplitscreen ||(!RenderManager.IsHiDef() && !RenderManager.IsWidescreen())) + { + bNoScrollSlots = true; + } +#ifdef __PSVITA__ + bNoScrollSlots = true; +#endif + + for(int i=0;i pTempItemInstAdditional=pRecipeIngredientsRequired[CanBeMadeA[m_iCurrentSlotHIndex].iRecipeA[iVSlotIndexA[i]]].pRecipy->assemble(nullptr); + + assert(pTempItemInstAdditional->id!=0); + unsigned int uiAlpha; + + if(app.DebugSettingsOn() && app.GetGameSettingsDebugMask(ProfileManager.GetPrimaryPad())&(1L<id == Item::clock_Id || pTempItemInstAdditional->id == Item::compass_Id ) + { + pTempItemInstAdditional->setAuxValue( 255 ); + } + + setCraftVSlotItem(getPad(),i,pTempItemInstAdditional,uiAlpha); + + updateVSlotPositions(iSlots, i); + } + } +} + +////////////////////////////////////////////////////////////////////////// +// +// DisplayIngredients +// +////////////////////////////////////////////////////////////////////////// +void IUIScene_CraftingMenu::DisplayIngredients() +{ + //RecipyList *recipes = ((Recipes *)Recipes::getInstance())->getRecipies(); + Recipy::INGREDIENTS_REQUIRED *pRecipeIngredientsRequired=Recipes::getInstance()->getRecipeIngredientsArray(); + + // hide the previous ingredients + hideAllIngredientsSlots(); + + if(CanBeMadeA[m_iCurrentSlotHIndex].iCount!=0) + { + int iSlot,iRecipy; + if(CanBeMadeA[m_iCurrentSlotHIndex].iCount>1) + { + iSlot=iVSlotIndexA[m_iCurrentSlotVIndex]; + iRecipy=CanBeMadeA[m_iCurrentSlotHIndex].iRecipeA[iSlot]; + } + else + { + iSlot=0; + iRecipy=CanBeMadeA[m_iCurrentSlotHIndex].iRecipeA[0]; + } + + // show the 2x2 or 3x3 to make the current item + int iBoxWidth=(m_iContainerType==RECIPE_TYPE_2x2)?2:3; + int iRecipe=CanBeMadeA[m_iCurrentSlotHIndex].iRecipeA[iSlot]; + bool bCanMakeRecipe = pRecipeIngredientsRequired[iRecipe].bCanMake[getPad()]; + shared_ptr pTempItemInst=pRecipeIngredientsRequired[iRecipe].pRecipy->assemble(nullptr); + + m_iIngredientsC=pRecipeIngredientsRequired[iRecipe].iIngC; + + // update the ingredients required - these will all be hidden until cycled by the user + for(int i=0;i itemInst= shared_ptr(new ItemInstance(item,pRecipeIngredientsRequired[iRecipe].iIngValA[i],iAuxVal)); + + // 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; + + // 4J Stu - For clocks and compasses we set the aux value to a special one that signals we should use a default texture + // rather than the dynamic one for the player + if( id == Item::clock_Id || id == Item::compass_Id ) + { + iAuxVal = 0xFF; + } + itemInst->setAuxValue(iAuxVal); + + setIngredientDescriptionItem(getPad(),i,itemInst); + setIngredientDescriptionRedBox(i,false); + } + + // 4J Stu - For clocks and compasses we set the aux value to a special one that signals we should use a default texture + // rather than the dynamic one for the player + if( pTempItemInst->id == Item::clock_Id || pTempItemInst->id == Item::compass_Id ) + { + pTempItemInst->setAuxValue( 255 ); + } + + // don't grey out the output icon + setCraftingOutputSlotItem(getPad(), pTempItemInst); + + if(app.DebugSettingsOn() && app.GetGameSettingsDebugMask(ProfileManager.GetPrimaryPad())&(1L<>24; + + // 4J Stu - For clocks and compasses we set the aux value to a special one that signals we should use a default texture + // rather than the dynamic one for the player + if( id == Item::clock_Id || id == Item::compass_Id ) + { + iAuxVal = 0xFF; + } + 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 + if(app.DebugSettingsOn() && app.GetGameSettingsDebugMask(ProfileManager.GetPrimaryPad())&(1L<getRecipies(); + Recipy::INGREDIENTS_REQUIRED *pRecipeIngredientsRequired=Recipes::getInstance()->getRecipeIngredientsArray(); + + if(bCanBeMade) + { + int iSlot;//,iRecipy; + if(CanBeMadeA[m_iCurrentSlotHIndex].iCount>1) + { + iSlot=iVSlotIndexA[m_iCurrentSlotVIndex]; + //iRecipy=CanBeMadeA[m_iCurrentSlotHIndex].iRecipeA[iSlot]; + } + else + { + iSlot=0; + //iRecipy=CanBeMadeA[m_iCurrentSlotHIndex].iRecipeA[0]; + } + + shared_ptr pTempItemInst=pRecipeIngredientsRequired[CanBeMadeA[m_iCurrentSlotHIndex].iRecipeA[iSlot]].pRecipy->assemble(nullptr); + int iID=pTempItemInst->getItem()->id; + int iAuxVal=pTempItemInst->getAuxValue(); + int iBaseType; + + if(iID<256) // is it a tile? + { + iBaseType=Tile::tiles[iID]->getBaseItemType(); + + iIDSString = Tile::tiles[iID]->getUseDescriptionId(); + } + else + { + iBaseType=pTempItemInst->getItem()->getBaseItemType(); + + iIDSString = pTempItemInst->getUseDescriptionId(); + } + + // A few special cases where the description required is specific to crafting, rather than the normal description + if(iBaseType!=Item::eBaseItemType_undefined) + { + switch(iBaseType) + { + case Item::eBaseItemType_cloth: + switch(iAuxVal) + { + case 0: + iIDSString=IDS_DESC_WOOLSTRING; + break; + } + break; + } + } + + // set the string mapped to by the base object mapping array + + if(iIDSString>=0) + { + // this is an html control now, so set the font size and colour + //wstring wsText=app.GetString(iIDSString); + wstring wsText=app.FormatHTMLString(getPad(),app.GetString(iIDSString)); + + // 12 for splitscreen, 14 for normal + EHTMLFontSize size = eHTMLSize_Normal; + if(m_bSplitscreen ||(!RenderManager.IsHiDef() && !RenderManager.IsWidescreen())) + { + size = eHTMLSize_Splitscreen; + } + wchar_t startTags[64]; + swprintf(startTags,64,L"

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

"; + + setDescriptionText(wsText.c_str()); + } + else + { + /// Missing string! +#ifdef _DEBUG + setDescriptionText(L"This is some placeholder description text about the craftable item."); +#else + setDescriptionText(L""); +#endif + } + } + else + { + setDescriptionText(L""); + } +} + +////////////////////////////////////////////////////////////////////////// +// +// UpdateTooltips +// +////////////////////////////////////////////////////////////////////////// +void IUIScene_CraftingMenu::UpdateTooltips() +{ + //RecipyList *recipes = ((Recipes *)Recipes::getInstance())->getRecipies(); + Recipy::INGREDIENTS_REQUIRED *pRecipeIngredientsRequired=Recipes::getInstance()->getRecipeIngredientsArray(); + // Update tooltips + + bool bDisplayCreate; + + if(CanBeMadeA[m_iCurrentSlotHIndex].iCount!=0) + { + int iSlot; + if(CanBeMadeA[m_iCurrentSlotHIndex].iCount>1) + { + iSlot=iVSlotIndexA[m_iCurrentSlotVIndex]; + } + else + { + iSlot=0; + } + + if(pRecipeIngredientsRequired[CanBeMadeA[m_iCurrentSlotHIndex].iRecipeA[iSlot]].bCanMake[getPad()]) + { + bDisplayCreate=true; + } + else + { + bDisplayCreate=false; + } + } + else + { + bDisplayCreate=false; + } + + + switch(m_iDisplayDescription) + { + case DISPLAY_INVENTORY: + ui.SetTooltips( getPad(), bDisplayCreate?IDS_TOOLTIPS_CREATE:-1,IDS_TOOLTIPS_EXIT, IDS_TOOLTIPS_SHOW_DESCRIPTION,-1,-1,-1,-2, IDS_TOOLTIPS_CHANGE_GROUP); + break; + case DISPLAY_DESCRIPTION: + ui.SetTooltips( getPad(), bDisplayCreate?IDS_TOOLTIPS_CREATE:-1,IDS_TOOLTIPS_EXIT, IDS_TOOLTIPS_SHOW_INGREDIENTS,-1,-1,-1,-2, IDS_TOOLTIPS_CHANGE_GROUP); + break; + case DISPLAY_INGREDIENTS: + ui.SetTooltips( getPad(), bDisplayCreate?IDS_TOOLTIPS_CREATE:-1,IDS_TOOLTIPS_EXIT, IDS_TOOLTIPS_SHOW_INVENTORY,-1,-1,-1,-2, IDS_TOOLTIPS_CHANGE_GROUP); + break; + } + + /*if(CanBeMadeA[m_iCurrentSlotHIndex].iCount!=0) + { + int iSlot; + if(CanBeMadeA[m_iCurrentSlotHIndex].iCount>1) + { + iSlot=iVSlotIndexA[m_iCurrentSlotVIndex]; + } + else + { + iSlot=0; + } + + if(pRecipeIngredientsRequired[CanBeMadeA[m_iCurrentSlotHIndex].iRecipeA[iSlot]].bCanMake[getPad()]) + { + ui.EnableTooltip( getPad(), eToolTipButtonA, true ); + } + else + { + ui.EnableTooltip( getPad(), eToolTipButtonA, false ); + } + } + else + { + ui.ShowTooltip( getPad(), eToolTipButtonA, false ); + }*/ +} + +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; + if(m_pPlayer && m_pPlayer->inventory) + { + //RecipyList *recipes = ((Recipes *)Recipes::getInstance())->getRecipies(); + Recipy::INGREDIENTS_REQUIRED *pRecipeIngredientsRequired=Recipes::getInstance()->getRecipeIngredientsArray(); + + if(CanBeMadeA[m_iCurrentSlotHIndex].iCount!=0) + { + int iSlot; + if(CanBeMadeA[m_iCurrentSlotHIndex].iCount>1) + { + iSlot=iVSlotIndexA[m_iCurrentSlotVIndex]; + } + else + { + iSlot=0; + } + int iRecipe= CanBeMadeA[m_iCurrentSlotHIndex].iRecipeA[iSlot]; + ItemInstance *pTempItemInst = (ItemInstance *)pRecipeIngredientsRequired[iRecipe].pRecipy->getResultItem(); + + if(pTempItemInst->id == itemId) + { + isSelected = true; + } + } + } + return isSelected; +} diff --git a/Minecraft.Client/Common/UI/IUIScene_CraftingMenu.h b/Minecraft.Client/Common/UI/IUIScene_CraftingMenu.h new file mode 100644 index 00000000..03a58378 --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_CraftingMenu.h @@ -0,0 +1,120 @@ +#pragma once +#include "..\..\..\Minecraft.World\Recipy.h" +#include "..\..\..\Minecraft.World\Item.h" + +class LocalPlayer; + +// 4J Stu - Crafting menu code that's shared across Iggy and XUI +class IUIScene_CraftingMenu +{ +protected: +#define DISPLAY_INVENTORY 0 +#define DISPLAY_DESCRIPTION 1 +#define DISPLAY_INGREDIENTS 2 +#define DISPLAY_MAX 3 + + enum _eGroupTab + { + eGroupTab_Left, + eGroupTab_Middle, + eGroupTab_Right + }; + + static const int m_iMaxHSlotC = 12; + static const int m_iMaxHCraftingSlotC = 10; + static const int m_iMaxVSlotC = 17; + static const int m_iMaxDisplayedVSlotC = 3; + static const int m_iIngredients3x3SlotC = 9; + static const int m_iIngredients2x2SlotC = 4; + + static const int m_iMaxHSlot3x3C = 12; + static const int m_iMaxHSlot2x2C = 10; + + static const int m_iMaxGroup3x3 = 7; + static const int m_iMaxGroup2x2 = 6; + + static int m_iBaseTypeMapA[Item::eBaseItemType_MAXTYPES]; + + typedef struct + { + int iCount; + int iItemBaseType; + int iRecipeA[m_iMaxVSlotC]; // tiers of item that can be made + } + CANBEMADE; + + CANBEMADE CanBeMadeA[m_iMaxHSlotC]; + + int m_iCurrentSlotHIndex; + int m_iCurrentSlotVIndex; + int m_iRecipeC; + int m_iContainerType; // 2x2 or 3x3 + shared_ptr m_pPlayer; + int m_iGroupIndex; + + int iVSlotIndexA[3]; // index of the v slots currently displayed + + static LPCWSTR m_GroupIconNameA[m_iMaxGroup3x3]; + static Recipy::_eGroupType m_GroupTypeMapping4GridA[m_iMaxGroup2x2]; + static Recipy::_eGroupType m_GroupTypeMapping9GridA[m_iMaxGroup3x3]; + Recipy::_eGroupType *m_pGroupA; + + static LPCWSTR m_GroupTabNameA[3]; + static _eGroupTab m_GroupTabBkgMapping2x2A[m_iMaxGroup2x2]; + static _eGroupTab m_GroupTabBkgMapping3x3A[m_iMaxGroup3x3]; + _eGroupTab *m_pGroupTabA; + int m_iCraftablesMaxHSlotC; + int m_iIngredientsMaxSlotC; + int m_iDisplayDescription; + int m_iIngredientsC; + bool m_bIgnoreKeyPresses; + bool m_bSplitscreen; + + eTutorial_State m_previousTutorialState; + + bool handleKeyDown(int iPad, int iAction, bool bRepeat); + +public: + IUIScene_CraftingMenu(); + +protected: + LPCWSTR GetGroupNameText(int iGroupType); + + void CheckRecipesAvailable(); + void UpdateHighlight(); + void UpdateVerticalSlots(); + void DisplayIngredients(); + void UpdateTooltips(); + void UpdateDescriptionText(bool); + void HandleInventoryUpdated(); + +public: + Recipy::_eGroupType getCurrentGroup() { return m_pGroupA[m_iGroupIndex]; } + bool isItemSelected(int itemId); + +protected: + virtual int getPad() = 0; + virtual void hideAllHSlots() = 0; + virtual void hideAllVSlots() = 0; + virtual void hideAllIngredientsSlots() = 0; + virtual void setCraftHSlotItem(int iPad, int iIndex, shared_ptr item, unsigned int uiAlpha) = 0; + virtual void setCraftVSlotItem(int iPad, int iIndex, shared_ptr item, unsigned int uiAlpha) = 0; + virtual void setCraftingOutputSlotItem(int iPad, shared_ptr item) = 0; + virtual void setCraftingOutputSlotRedBox(bool show) = 0; + virtual void setIngredientSlotItem(int iPad, int index, shared_ptr item) = 0; + virtual void setIngredientSlotRedBox(int index, bool show) = 0; + virtual void setIngredientDescriptionItem(int iPad, int index, shared_ptr item) = 0; + virtual void setIngredientDescriptionRedBox(int index, bool show) = 0; + virtual void setIngredientDescriptionText(int index, LPCWSTR text) = 0; + virtual void setShowCraftHSlot(int iIndex, bool show) = 0; + virtual void showTabHighlight(int iIndex, bool show) = 0; + virtual void setGroupText(LPCWSTR text) = 0; + virtual void setDescriptionText(LPCWSTR text) = 0; + virtual void setItemText(LPCWSTR text) = 0; + virtual void scrollDescriptionUp() = 0; + virtual void scrollDescriptionDown() = 0; + virtual void updateHighlightAndScrollPositions() = 0; + virtual void updateVSlotPositions(int iSlots, int i) = 0; + + virtual void UpdateMultiPanel() = 0; +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/IUIScene_CreativeMenu.cpp b/Minecraft.Client/Common/UI/IUIScene_CreativeMenu.cpp new file mode 100644 index 00000000..c3348e58 --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_CreativeMenu.cpp @@ -0,0 +1,1396 @@ +#include "stdafx.h" +#include "IUIScene_CreativeMenu.h" + +#include "..\..\Minecraft.h" +#include "..\..\MultiplayerLocalPlayer.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.tile.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.tile.entity.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.enchantment.h" +#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; + +vector< shared_ptr > IUIScene_CreativeMenu::categoryGroups[eCreativeInventoryGroupsCount]; + +#define ITEM(id) list->push_back( shared_ptr(new ItemInstance(id, 1, 0)) ); +#define ITEM_AUX(id, aux) list->push_back( shared_ptr(new ItemInstance(id, 1, aux)) ); +#define DEF(index) list = &categoryGroups[index]; + + +void IUIScene_CreativeMenu::staticCtor() +{ + vector< shared_ptr > *list; + + + // Building Blocks + DEF(eCreativeInventory_BuildingBlocks) + ITEM(Tile::stone_Id) + ITEM(Tile::grass_Id) + ITEM(Tile::dirt_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) + ITEM(Tile::diamondBlock_Id) + ITEM(Tile::emeraldBlock_Id) + ITEM_AUX(Tile::quartzBlock_Id,QuartzBlockTile::TYPE_DEFAULT) + ITEM(Tile::coalOre_Id) + ITEM(Tile::lapisOre_Id) + ITEM(Tile::diamondOre_Id) + ITEM(Tile::redStoneOre_Id) + ITEM(Tile::ironOre_Id) + ITEM(Tile::goldOre_Id) + ITEM(Tile::emeraldOre_Id) + ITEM(Tile::netherQuartz_Id) + ITEM(Tile::unbreakable_Id) + ITEM_AUX(Tile::wood_Id,0) + ITEM_AUX(Tile::wood_Id,TreeTile::DARK_TRUNK) + ITEM_AUX(Tile::wood_Id,TreeTile::BIRCH_TRUNK) + ITEM_AUX(Tile::wood_Id,TreeTile::JUNGLE_TRUNK) + ITEM_AUX(Tile::treeTrunk_Id, 0) + ITEM_AUX(Tile::treeTrunk_Id, TreeTile::DARK_TRUNK) + ITEM_AUX(Tile::treeTrunk_Id, TreeTile::BIRCH_TRUNK) + ITEM_AUX(Tile::treeTrunk_Id, TreeTile::JUNGLE_TRUNK) + ITEM(Tile::gravel_Id) + ITEM(Tile::redBrick_Id) + ITEM(Tile::mossyCobblestone_Id) + ITEM(Tile::obsidian_Id) + ITEM(Tile::clay) + ITEM(Tile::ice_Id) + ITEM(Tile::snow_Id) + 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::endStone_Id) + ITEM_AUX(Tile::quartzBlock_Id,QuartzBlockTile::TYPE_CHISELED) + ITEM_AUX(Tile::quartzBlock_Id,QuartzBlockTile::TYPE_LINES_Y) + ITEM(Tile::trapdoor_Id) + ITEM(Tile::fenceGate_Id) + ITEM(Item::door_wood_Id) + ITEM(Item::door_iron_Id) + ITEM_AUX(Tile::stoneSlabHalf_Id,StoneSlabTile::STONE_SLAB) + ITEM_AUX(Tile::stoneSlabHalf_Id,StoneSlabTile::SAND_SLAB) + // AP - changed oak slab to be wood because it wouldn't burn +// ITEM_AUX(Tile::stoneSlabHalf_Id,StoneSlabTile::WOOD_SLAB) + ITEM_AUX(Tile::woodSlabHalf_Id,0) + ITEM_AUX(Tile::woodSlabHalf_Id,TreeTile::DARK_TRUNK) + ITEM_AUX(Tile::woodSlabHalf_Id,TreeTile::BIRCH_TRUNK) + ITEM_AUX(Tile::woodSlabHalf_Id,TreeTile::JUNGLE_TRUNK) + ITEM_AUX(Tile::stoneSlabHalf_Id,StoneSlabTile::COBBLESTONE_SLAB) + ITEM_AUX(Tile::stoneSlabHalf_Id,StoneSlabTile::BRICK_SLAB) + ITEM_AUX(Tile::stoneSlabHalf_Id,StoneSlabTile::SMOOTHBRICK_SLAB) + ITEM_AUX(Tile::stoneSlabHalf_Id,StoneSlabTile::NETHERBRICK_SLAB) + ITEM_AUX(Tile::stoneSlabHalf_Id,StoneSlabTile::QUARTZ_SLAB) + ITEM(Tile::stairs_wood_Id) + ITEM(Tile::stairs_birchwood_Id) + ITEM(Tile::stairs_sprucewood_Id) + ITEM(Tile::stairs_junglewood_Id) + ITEM(Tile::stairs_stone_Id) + ITEM(Tile::stairs_bricks_Id) + ITEM(Tile::stairs_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) + ITEM_AUX(Item::skull_Id,SkullTileEntity::TYPE_SKELETON) + ITEM_AUX(Item::skull_Id,SkullTileEntity::TYPE_WITHER) + ITEM_AUX(Item::skull_Id,SkullTileEntity::TYPE_ZOMBIE) + ITEM_AUX(Item::skull_Id,SkullTileEntity::TYPE_CHAR) + ITEM_AUX(Item::skull_Id,SkullTileEntity::TYPE_CREEPER) + ITEM(Tile::sponge_Id) + ITEM(Tile::melon_Id) + ITEM(Tile::pumpkin_Id) + ITEM(Tile::litPumpkin_Id) + ITEM_AUX(Tile::sapling_Id, Sapling::TYPE_DEFAULT) + ITEM_AUX(Tile::sapling_Id, Sapling::TYPE_EVERGREEN) + ITEM_AUX(Tile::sapling_Id, Sapling::TYPE_BIRCH) + ITEM_AUX(Tile::sapling_Id, Sapling::TYPE_JUNGLE) + ITEM_AUX(Tile::leaves_Id, LeafTile::NORMAL_LEAF) + ITEM_AUX(Tile::leaves_Id, LeafTile::EVERGREEN_LEAF) + ITEM_AUX(Tile::leaves_Id, LeafTile::BIRCH_LEAF) + ITEM_AUX(Tile::leaves_Id, LeafTile::JUNGLE_LEAF) + ITEM(Tile::vine) + ITEM(Tile::waterLily_Id) + ITEM(Tile::torch_Id) + ITEM_AUX(Tile::tallgrass_Id, TallGrass::DEAD_SHRUB) + ITEM_AUX(Tile::tallgrass_Id, TallGrass::TALL_GRASS) + ITEM_AUX(Tile::tallgrass_Id, TallGrass::FERN) + ITEM(Tile::deadBush_Id) + ITEM(Tile::flower_Id) + ITEM(Tile::rose_Id) + ITEM(Tile::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) + ITEM(Tile::web_Id) + ITEM(Tile::thinGlass_Id) + ITEM(Tile::glass_Id) + ITEM(Item::painting_Id) + ITEM(Item::itemFrame_Id) + ITEM(Item::sign_Id) + ITEM(Tile::bookshelf_Id) + ITEM(Item::flowerPot_Id) + ITEM(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 + ITEM_AUX(Tile::woolCarpet_Id,4) // Yellow + ITEM_AUX(Tile::woolCarpet_Id,5) // Lime + ITEM_AUX(Tile::woolCarpet_Id,3) // Light Blue + ITEM_AUX(Tile::woolCarpet_Id,9) // Cyan + ITEM_AUX(Tile::woolCarpet_Id,11) // Blue + ITEM_AUX(Tile::woolCarpet_Id,10) // Purple + ITEM_AUX(Tile::woolCarpet_Id,2) // Magenta + ITEM_AUX(Tile::woolCarpet_Id,6) // Pink + ITEM_AUX(Tile::woolCarpet_Id,0) // White + ITEM_AUX(Tile::woolCarpet_Id,8) // Light Gray + ITEM_AUX(Tile::woolCarpet_Id,7) // Gray + ITEM_AUX(Tile::woolCarpet_Id,15) // Black + ITEM_AUX(Tile::woolCarpet_Id,13) // Green + ITEM_AUX(Tile::woolCarpet_Id,12) // Brown + +#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::noteblock_Id) + ITEM(Tile::pistonBase_Id) + ITEM(Tile::pistonStickyBase_Id) + ITEM(Tile::tnt_Id) + ITEM(Tile::lever_Id) + ITEM(Tile::button_stone_Id) + ITEM(Tile::button_wood_Id) + ITEM(Tile::pressurePlate_stone_Id) + ITEM(Tile::pressurePlate_wood_Id) + ITEM(Item::redStone_Id) + ITEM(Tile::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) + + // Miscellaneous + DEF(eCreativeInventory_Misc) + ITEM(Tile::chest_Id) + ITEM(Tile::enderChest_Id) + ITEM(Tile::workBench_Id) + ITEM(Tile::furnace_Id) + ITEM(Item::brewingStand_Id) + ITEM(Tile::enchantTable_Id) + ITEM(Tile::beacon_Id) + ITEM(Tile::endPortalFrameTile_Id) + ITEM(Tile::jukebox_Id) + ITEM(Tile::anvil_Id); + ITEM(Item::bed_Id) + ITEM(Item::bucket_empty_Id) + ITEM(Item::bucket_lava_Id) + ITEM(Item::bucket_water_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) + ITEM(Item::record_04_Id) + ITEM(Item::record_05_Id) + ITEM(Item::record_06_Id) + ITEM(Item::record_07_Id) + ITEM(Item::record_08_Id) + ITEM(Item::record_09_Id) + ITEM(Item::record_10_Id) + ITEM(Item::record_11_Id) + ITEM(Item::record_12_Id) + + 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) + ITEM(Item::apple_Id) + ITEM(Item::apple_gold_Id) + ITEM_AUX(Item::apple_gold_Id,1) // Enchanted + ITEM(Item::melon_Id) + ITEM(Item::mushroomStew_Id) + ITEM(Item::bread_Id) + ITEM(Item::cake_Id) + ITEM(Item::cookie_Id) + ITEM(Item::fish_cooked_Id) + ITEM(Item::fish_raw_Id) + ITEM(Item::porkChop_cooked_Id) + ITEM(Item::porkChop_raw_Id) + ITEM(Item::beef_cooked_Id) + ITEM(Item::beef_raw_Id) + ITEM(Item::chicken_raw_Id) + ITEM(Item::chicken_cooked_Id) + ITEM(Item::rotten_flesh_Id) + ITEM(Item::spiderEye_Id) + ITEM(Item::potato_Id) + ITEM(Item::potatoBaked_Id) + ITEM(Item::potatoPoisonous_Id) + ITEM(Item::carrots_Id) + ITEM(Item::carrotGolden_Id) + ITEM(Item::pumpkinPie_Id) + + // Tools, Armour and Weapons (Complete) + DEF(eCreativeInventory_ToolsArmourWeapons) + ITEM(Item::compass_Id) + ITEM(Item::helmet_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::emptyMap_Id) + ITEM(Item::helmet_chain_Id) + ITEM(Item::chestplate_chain_Id) + ITEM(Item::leggings_chain_Id) + ITEM(Item::boots_chain_Id) + ITEM(Item::sword_stone_Id) + ITEM(Item::shovel_stone_Id) + ITEM(Item::pickAxe_stone_Id) + ITEM(Item::hatchet_stone_Id) + ITEM(Item::hoe_stone_Id) + + ITEM(Item::bow_Id) + ITEM(Item::helmet_iron_Id) + ITEM(Item::chestplate_iron_Id) + ITEM(Item::leggings_iron_Id) + ITEM(Item::boots_iron_Id) + ITEM(Item::sword_iron_Id) + ITEM(Item::shovel_iron_Id) + ITEM(Item::pickAxe_iron_Id) + ITEM(Item::hatchet_iron_Id) + ITEM(Item::hoe_iron_Id) + + ITEM(Item::arrow_Id) + ITEM(Item::helmet_gold_Id) + ITEM(Item::chestplate_gold_Id) + ITEM(Item::leggings_gold_Id) + ITEM(Item::boots_gold_Id) + ITEM(Item::sword_gold_Id) + ITEM(Item::shovel_gold_Id) + ITEM(Item::pickAxe_gold_Id) + ITEM(Item::hatchet_gold_Id) + ITEM(Item::hoe_gold_Id) + + ITEM(Item::flintAndSteel_Id) + ITEM(Item::helmet_diamond_Id) + ITEM(Item::chestplate_diamond_Id) + ITEM(Item::leggings_diamond_Id) + ITEM(Item::boots_diamond_Id) + ITEM(Item::sword_diamond_Id) + ITEM(Item::shovel_diamond_Id) + ITEM(Item::pickAxe_diamond_Id) + ITEM(Item::hatchet_diamond_Id) + ITEM(Item::hoe_diamond_Id) + + ITEM(Item::fireball_Id) + ITEM(Item::clock_Id) + ITEM(Item::shears_Id) + ITEM(Item::fishingRod_Id) + ITEM(Item::carrotOnAStick_Id) + 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) + { + Enchantment *enchantment = Enchantment::enchantments[i]; + if (enchantment == NULL || enchantment->category == NULL) continue; + 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) + ITEM_AUX(Item::coal_Id,1) + ITEM(Item::diamond_Id) + ITEM(Item::emerald_Id) + ITEM(Item::ironIngot_Id) + ITEM(Item::goldIngot_Id) + ITEM(Item::netherQuartz_Id) + ITEM(Item::brick_Id) + ITEM(Item::netherbrick_Id) + ITEM(Item::stick_Id) + ITEM(Item::bowl_Id) + ITEM(Item::bone_Id) + ITEM(Item::string_Id) + ITEM(Item::feather_Id) + ITEM(Item::flint_Id) + ITEM(Item::leather_Id) + ITEM(Item::gunpowder_Id) + ITEM(Item::clay_Id) + ITEM(Item::yellowDust_Id) + ITEM(Item::seeds_wheat_Id) + ITEM(Item::seeds_melon_Id) + ITEM(Item::seeds_pumpkin_Id) + ITEM(Item::wheat_Id) + ITEM(Item::reeds_Id) + ITEM(Item::egg_Id) + ITEM(Item::sugar_Id) + ITEM(Item::slimeBall_Id) + ITEM(Item::blazeRod_Id) + ITEM(Item::goldNugget_Id) + ITEM(Item::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 + ITEM_AUX(Item::dye_powder_Id,10) // Lime + ITEM_AUX(Item::dye_powder_Id,12) // Light Blue + ITEM_AUX(Item::dye_powder_Id,6) // Cyan + ITEM_AUX(Item::dye_powder_Id,4) // Blue + ITEM_AUX(Item::dye_powder_Id,5) // Purple + ITEM_AUX(Item::dye_powder_Id,13) // Magenta + ITEM_AUX(Item::dye_powder_Id,9) // Pink + ITEM_AUX(Item::dye_powder_Id,15) // Bone Meal + ITEM_AUX(Item::dye_powder_Id,7) // Light gray + ITEM_AUX(Item::dye_powder_Id,8) // Gray + ITEM_AUX(Item::dye_powder_Id,0) // black (ink sac) + ITEM_AUX(Item::dye_powder_Id,2) // Green + ITEM_AUX(Item::dye_powder_Id,3) // Brown + + // Brewing (TODO) + DEF(eCreativeInventory_Brewing) + ITEM(Item::expBottle_Id) + + // 4J Stu - Anything else added here also needs to be added to the key handler below + ITEM(Item::ghastTear_Id) + ITEM(Item::fermentedSpiderEye_Id) + ITEM(Item::blazePowder_Id) + ITEM(Item::magmaCream_Id) + ITEM(Item::speckledMelon_Id) + ITEM(Item::glassBottle_Id) + ITEM_AUX(Item::potion_Id,0) // Water bottle + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, 0, MASK_TYPE_AWKWARD)) // Awkward Potion + + + DEF(eCreativeInventory_Potions_Basic) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, 0, MASK_REGENERATION)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, 0, MASK_SPEED)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, 0, MASK_FIRE_RESISTANCE)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, 0, MASK_POISON)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, 0, MASK_INSTANTHEALTH)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, 0, MASK_WEAKNESS)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, 0, MASK_STRENGTH)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, 0, MASK_SLOWNESS)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, 0, MASK_INSTANTDAMAGE)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, 0, MASK_REGENERATION)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, 0, MASK_SPEED)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, 0, MASK_FIRE_RESISTANCE)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, 0, MASK_POISON)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, 0, MASK_INSTANTHEALTH)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, 0, MASK_WEAKNESS)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, 0, MASK_STRENGTH)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, 0, MASK_SLOWNESS)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, 0, MASK_INSTANTDAMAGE)) + + DEF(eCreativeInventory_Potions_Level2) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_LEVEL2, MASK_REGENERATION)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_LEVEL2, MASK_SPEED)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, 0, MASK_FIRE_RESISTANCE)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_LEVEL2, MASK_POISON)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_LEVEL2, MASK_INSTANTHEALTH)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_LEVEL2, MASK_NIGHTVISION)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_LEVEL2, MASK_INVISIBILITY)) + + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, 0, MASK_WEAKNESS)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_LEVEL2, MASK_STRENGTH)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, 0, MASK_SLOWNESS)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_LEVEL2, MASK_INSTANTDAMAGE)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_LEVEL2, MASK_REGENERATION)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_LEVEL2, MASK_SPEED)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, 0, MASK_FIRE_RESISTANCE)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_LEVEL2, MASK_POISON)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_LEVEL2, MASK_INSTANTHEALTH)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_LEVEL2, MASK_NIGHTVISION)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_LEVEL2, MASK_INVISIBILITY)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, 0, MASK_WEAKNESS)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_LEVEL2, MASK_STRENGTH)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, 0, MASK_SLOWNESS)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_LEVEL2, MASK_INSTANTDAMAGE)) + + DEF(eCreativeInventory_Potions_Extended) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_EXTENDED, MASK_REGENERATION)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_EXTENDED, MASK_SPEED)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_EXTENDED, MASK_FIRE_RESISTANCE)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_EXTENDED, MASK_POISON)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_LEVEL2, MASK_INSTANTHEALTH)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, 0, MASK_NIGHTVISION)) // 4J- Moved here as there isn't a weak variant of this potion. + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, 0, MASK_INVISIBILITY)) // 4J- Moved here as there isn't a weak variant of this potion. + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_EXTENDED, MASK_WEAKNESS)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_EXTENDED, MASK_STRENGTH)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_EXTENDED, MASK_SLOWNESS)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_LEVEL2, MASK_INSTANTDAMAGE)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_EXTENDED, MASK_REGENERATION)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_EXTENDED, MASK_SPEED)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_EXTENDED, MASK_FIRE_RESISTANCE)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_EXTENDED, MASK_POISON)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_LEVEL2, MASK_INSTANTHEALTH)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, 0, MASK_NIGHTVISION)) // 4J- Moved here as there isn't a weak variant of this potion. + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, 0, MASK_INVISIBILITY)) // 4J- Moved here as there isn't a weak variant of this potion. + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_EXTENDED, MASK_WEAKNESS)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_EXTENDED, MASK_STRENGTH)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_EXTENDED, MASK_SLOWNESS)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_LEVEL2, MASK_INSTANTDAMAGE)) + + DEF(eCreativeInventory_Potions_Level2_Extended) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_LEVEL2EXTENDED, MASK_REGENERATION)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_LEVEL2EXTENDED, MASK_SPEED)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_EXTENDED, MASK_FIRE_RESISTANCE)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_LEVEL2EXTENDED, MASK_POISON)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_LEVEL2, MASK_INSTANTHEALTH)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_LEVEL2EXTENDED, MASK_NIGHTVISION)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_LEVEL2EXTENDED, MASK_INVISIBILITY)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_EXTENDED, MASK_NIGHTVISION)) // 4J- Moved here as there isn't a weak variant of this potion. + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_EXTENDED, MASK_INVISIBILITY)) // 4J- Moved here as there isn't a weak variant of this potion. + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_EXTENDED, MASK_WEAKNESS)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_LEVEL2EXTENDED, MASK_STRENGTH)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_EXTENDED, MASK_SLOWNESS)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_LEVEL2, MASK_INSTANTDAMAGE)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_LEVEL2EXTENDED, MASK_REGENERATION)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_LEVEL2EXTENDED, MASK_SPEED)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_EXTENDED, MASK_FIRE_RESISTANCE)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_LEVEL2EXTENDED, MASK_POISON)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_LEVEL2, MASK_INSTANTHEALTH)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_LEVEL2EXTENDED, MASK_NIGHTVISION)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_LEVEL2EXTENDED, MASK_INVISIBILITY)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_EXTENDED, MASK_NIGHTVISION)) // 4J- Moved here as there isn't a weak variant of this potion. + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_EXTENDED, MASK_INVISIBILITY)) // 4J- Moved here as there isn't a weak variant of this potion. + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_EXTENDED, MASK_WEAKNESS)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_LEVEL2EXTENDED, MASK_STRENGTH)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_EXTENDED, MASK_SLOWNESS)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_LEVEL2, MASK_INSTANTDAMAGE)) + + + specs = new TabSpec*[eCreativeInventoryTab_COUNT]; + + // Top Row + ECreative_Inventory_Groups blocksGroup[] = {eCreativeInventory_BuildingBlocks}; + specs[eCreativeInventoryTab_BuildingBlocks] = new TabSpec(L"Structures", IDS_GROUPNAME_BUILDING_BLOCKS, 1, blocksGroup); + +#ifndef _CONTENT_PACKAGE + ECreative_Inventory_Groups decorationsGroup[] = {eCreativeInventory_Decoration}; + ECreative_Inventory_Groups debugDecorationsGroup[] = {eCreativeInventory_ArtToolsDecorations}; + specs[eCreativeInventoryTab_Decorations] = new TabSpec(L"Decoration", IDS_GROUPNAME_DECORATIONS, 1, decorationsGroup, 0, NULL, 1, debugDecorationsGroup); +#else + ECreative_Inventory_Groups decorationsGroup[] = {eCreativeInventory_Decoration}; + specs[eCreativeInventoryTab_Decorations] = new TabSpec(L"Decoration", IDS_GROUPNAME_DECORATIONS, 1, decorationsGroup); +#endif + + ECreative_Inventory_Groups redAndTranGroup[] = {eCreativeInventory_Transport, eCreativeInventory_Redstone}; + 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); + + ECreative_Inventory_Groups foodGroup[] = {eCreativeInventory_Food}; + 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); + + ECreative_Inventory_Groups brewingGroup[] = {eCreativeInventory_Brewing, eCreativeInventory_Potions_Level2_Extended, eCreativeInventory_Potions_Extended, eCreativeInventory_Potions_Level2, eCreativeInventory_Potions_Basic}; + + // Just use the text LT - the graphic doesn't fit in splitscreen either + // In 480p there's not enough room for the LT button, so use text instead + //if(!RenderManager.IsHiDef() && !RenderManager.IsWidescreen()) + { + specs[eCreativeInventoryTab_Brewing] = new TabSpec(L"Brewing", IDS_GROUPNAME_POTIONS_480, 5, brewingGroup); + } + // 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}; + 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() +{ + m_bCarryingCreativeItem = false; + m_creativeSlotX = m_creativeSlotY = m_inventorySlotX = m_inventorySlotY = 0; + + // 4J JEV - Settup Tabs + for (int i = 0; i < eCreativeInventoryTab_COUNT; i++) + { + m_tabDynamicPos[i] = 0; + m_tabPage[i] = 0; + } +} + +/* 4J JEV - Switches between tabs. +*/ +void IUIScene_CreativeMenu::switchTab(ECreativeInventoryTabs tab) +{ + // Could just be changing page on the current tab + if(tab != m_curTab) updateTabHighlightAndText(tab); + + m_curTab = tab; + + updateScrollCurrentPage(m_tabPage[m_curTab] + 1, specs[m_curTab]->getPageCount()); + + specs[tab]->populateMenu(itemPickerMenu,m_tabDynamicPos[m_curTab], m_tabPage[m_curTab]); +} + +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, 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; + m_staticGroupsA = NULL; + + unsigned int dynamicItems = 0; + m_staticItems = 0; + + if(staticGroupsCount > 0) + { + m_staticGroupsA = new ECreative_Inventory_Groups[staticGroupsCount]; + for(int i = 0; i < staticGroupsCount; ++i) + { + m_staticGroupsA[i] = staticGroups[i]; + m_staticItems += categoryGroups[m_staticGroupsA[i]].size(); + } + } + + m_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 && dynamicGroups != NULL) + { + m_dynamicGroupsA = new ECreative_Inventory_Groups[dynamicGroupsCount]; + for(int i = 0; i < dynamicGroupsCount; ++i) + { + m_dynamicGroupsA[i] = dynamicGroups[i]; + dynamicItems += categoryGroups[m_dynamicGroupsA[i]].size(); + } + } + + m_staticPerPage = MAX_SIZE - dynamicItems; + m_pages = (int)ceil((float)m_staticItems / m_staticPerPage); +} + +IUIScene_CreativeMenu::TabSpec::~TabSpec() +{ + if(m_staticGroupsA != NULL) delete [] m_staticGroupsA; + if(m_dynamicGroupsA != NULL) delete [] m_dynamicGroupsA; + if(m_debugGroupsA != NULL) delete [] m_debugGroupsA; +} + +void IUIScene_CreativeMenu::TabSpec::populateMenu(AbstractContainerMenu *menu, int dynamicIndex, unsigned int page) +{ + int lastSlotIndex = 0; + + // Fill the dynamic group + if(m_dynamicGroupsCount > 0 && m_dynamicGroupsA != NULL) + { + for(AUTO_VAR(it, categoryGroups[m_dynamicGroupsA[dynamicIndex]].rbegin()); it != categoryGroups[m_dynamicGroupsA[dynamicIndex]].rend() && lastSlotIndex < MAX_SIZE; ++it) + { + Slot *slot = menu->getSlot(++lastSlotIndex); + slot->set( *it ); + } + } + + // Fill from the static groups + unsigned int startIndex = page * m_staticPerPage; + + // 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(); + if( currentIndex + size < startIndex) + { + currentIndex += size; + continue; + } + displayStatic = true; + currentItem = size - ((currentIndex + size) - startIndex); + break; + } + + int lastStaticPageCount = currentIndex; + while(lastStaticPageCount > m_staticPerPage) lastStaticPageCount -= m_staticPerPage; + + if(displayStatic) + { + for(; lastSlotIndex < MAX_SIZE;) + { + Slot *slot = menu->getSlot(lastSlotIndex++); + slot->set(categoryGroups[m_staticGroupsA[currentGroup]][currentItem]); + + ++currentItem; + if(currentItem >= categoryGroups[m_staticGroupsA[currentGroup]].size()) + { + currentItem = 0; + ++currentGroup; + if(currentGroup >= m_staticGroupsCount) + { + break; + } + } + } + } + +#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); + slot->remove(1); + } +} + +unsigned int IUIScene_CreativeMenu::TabSpec::getPageCount() +{ +#ifndef _CONTENT_PACKAGE + if(app.DebugArtToolsOn()) + { + return (int)ceil((float)(m_staticItems + m_debugItems) / m_staticPerPage); + } + else +#endif + { + return m_pages; + } +} + + +// 4J JEV - Item Picker Menu +IUIScene_CreativeMenu::ItemPickerMenu::ItemPickerMenu( shared_ptr smp, shared_ptr inv ) : AbstractContainerMenu() +{ + inventory = inv; + creativeContainer = smp; + + //int startLength = slots->size(); + + Slot *slot = NULL; + for (int i = 0; i < TabSpec::MAX_SIZE; i++) + { + // 4J JEV - These values get set by addSlot anyway. + slot = new Slot( creativeContainer, i, -1, -1); + + ItemPickerMenu::addSlot( slot ); + } + + for (int i = 0; i < 9; i++) + { + slot = new Slot( inventory, i, -1, -1 ); + ItemPickerMenu::addSlot( slot ); + } + + // 4J Stu - Give the creative menu a unique container id + containerId = CONTAINER_ID_CREATIVE; +} + +bool IUIScene_CreativeMenu::ItemPickerMenu::stillValid(shared_ptr player) +{ + return true; +} + +bool IUIScene_CreativeMenu::ItemPickerMenu::isOverrideResultClick(int slotNum, int buttonNum) +{ + return slotNum >= 0 && slotNum < 9 && buttonNum == 0; +} + +IUIScene_AbstractContainerMenu::ESceneSection IUIScene_CreativeMenu::GetSectionAndSlotInDirection( ESceneSection eSection, ETapState eTapDirection, int *piTargetX, int *piTargetY ) +{ + ESceneSection newSection = eSection; + + // Find the new section if there is one + switch( eSection ) + { + case eSectionInventoryCreativeSelector: + if (eTapDirection == eTapStateDown || eTapDirection == eTapStateUp) + { + newSection = eSectionInventoryCreativeUsing; + } + break; + case eSectionInventoryCreativeUsing: + if (eTapDirection == eTapStateDown || eTapDirection == eTapStateUp) + { + newSection = eSectionInventoryCreativeSelector; + } + break; + case eSectionInventoryCreativeTab_0: + case eSectionInventoryCreativeTab_1: + case eSectionInventoryCreativeTab_2: + case eSectionInventoryCreativeTab_3: + case eSectionInventoryCreativeTab_4: + case eSectionInventoryCreativeTab_5: + case eSectionInventoryCreativeTab_6: + case eSectionInventoryCreativeTab_7: + case eSectionInventoryCreativeSlider: + /* do nothing */ + break; + default: + assert( false ); + break; + } + + updateSlotPosition(eSection, newSection, eTapDirection, piTargetX, piTargetY, 0); + + return newSection; +} + +bool IUIScene_CreativeMenu::handleValidKeyPress(int iPad, int buttonNum, BOOL quickKeyHeld) +{ + // 4J Added - Make pressing the X button clear the hotbar + if(buttonNum == 1) + { + Minecraft *pMinecraft = Minecraft::GetInstance(); + for(unsigned int i = TabSpec::MAX_SIZE; i < TabSpec::MAX_SIZE + 9; ++i) + { + shared_ptr newItem = m_menu->getSlot(i)->getItem(); + + if(newItem != NULL) + { + m_menu->getSlot(i)->set(nullptr); + // call this function to synchronize multiplayer item bar + pMinecraft->localgameModes[iPad]->handleCreativeModeItemAdd(nullptr, i - (int)m_menu->slots.size() + 9 + InventoryMenu::USE_ROW_SLOT_START); + } + } + return true; + } + return false; +} + +void IUIScene_CreativeMenu::handleOutsideClicked(int iPad, int buttonNum, BOOL quickKeyHeld) +{ + // Drop items. + Minecraft *pMinecraft = Minecraft::GetInstance(); + + shared_ptr playerInventory = pMinecraft->localplayers[iPad]->inventory; + if (playerInventory->getCarried() != NULL) + { + if (buttonNum == 0) + { + pMinecraft->localgameModes[iPad]->handleCreativeModeItemDrop(playerInventory->getCarried()); + playerInventory->setCarried(nullptr); + } + if (buttonNum == 1) + { + shared_ptr removedItem = playerInventory->getCarried()->remove(1); + pMinecraft->localgameModes[iPad]->handleCreativeModeItemDrop(removedItem); + if (playerInventory->getCarried()->count == 0) playerInventory->setCarried(nullptr); + } + } + + //pMinecraft->localgameModes[m_iPad]->handleInventoryMouseClick(menu->containerId, AbstractContainerMenu::CLICKED_OUTSIDE, buttonNum, quickKeyHeld?true:false, pMinecraft->localplayers[m_iPad] ); +} + +void IUIScene_CreativeMenu::handleAdditionalKeyPress(int iAction) +{ + int dir = 1; + switch(iAction) + { + case ACTION_MENU_LEFT_SCROLL: + dir = -1; + // Fall through intentional + case ACTION_MENU_RIGHT_SCROLL: + { + ECreativeInventoryTabs tab = (ECreativeInventoryTabs)(m_curTab + dir); + if (tab < 0) tab = (ECreativeInventoryTabs)(eCreativeInventoryTab_COUNT - 1); + if (tab >= eCreativeInventoryTab_COUNT) tab = eCreativeInventoryTab_BuildingBlocks; + switchTab(tab); + ui.PlayUISFX(eSFX_Focus); + } + break; + case ACTION_MENU_PAGEUP: + // change the potion strength + { + ++m_tabDynamicPos[m_curTab]; + if(m_tabDynamicPos[m_curTab] >= specs[m_curTab]->m_dynamicGroupsCount) m_tabDynamicPos[m_curTab] = 0; + switchTab(m_curTab); + } + break; + case ACTION_MENU_OTHER_STICK_DOWN: + ++m_tabPage[m_curTab]; + if(m_tabPage[m_curTab] >= specs[m_curTab]->getPageCount()) + { + m_tabPage[m_curTab] = specs[m_curTab]->getPageCount() - 1; + } + else + { + switchTab(m_curTab); + } + break; + case ACTION_MENU_OTHER_STICK_UP: + --m_tabPage[m_curTab]; + if(m_tabPage[m_curTab] < 0) + { + m_tabPage[m_curTab] = 0; + } + else + { + switchTab(m_curTab); + } + break; + } +} + +void IUIScene_CreativeMenu::handleSlotListClicked(ESceneSection eSection, int buttonNum, BOOL quickKeyHeld) +{ + int currentIndex = getCurrentIndex(eSection); + + Minecraft *pMinecraft = Minecraft::GetInstance(); + + bool instantPlace = false; + if (eSection == eSectionInventoryCreativeSelector) + { + if (buttonNum == 0) + { + + shared_ptr playerInventory = pMinecraft->localplayers[getPad()]->inventory; + shared_ptr carried = playerInventory->getCarried(); + shared_ptr clicked = m_menu->getSlot(currentIndex)->getItem(); + if (clicked != NULL) + { + playerInventory->setCarried(ItemInstance::clone(clicked)); + carried = playerInventory->getCarried(); + if (quickKeyHeld == TRUE) + { + carried->count = carried->getMaxStackSize(); + } + m_creativeSlotX = m_iCurrSlotX; + m_creativeSlotY = m_iCurrSlotY; + m_eCurrSection = eSectionInventoryCreativeUsing; + m_eCurrTapState = eTapStateJump; + + instantPlace = getEmptyInventorySlot(carried, m_inventorySlotX); + m_iCurrSlotX = m_inventorySlotX; + m_iCurrSlotY = m_inventorySlotY; + + m_bCarryingCreativeItem = true; + } + } + } + if(instantPlace || eSection == eSectionInventoryCreativeUsing) + { + if(instantPlace) + { + setSectionSelectedSlot(eSectionInventoryCreativeUsing,m_iCurrSlotX,m_iCurrSlotY); + currentIndex = getCurrentIndex(eSectionInventoryCreativeUsing); + buttonNum = 0; + quickKeyHeld = FALSE; + } + m_menu->clicked(currentIndex, buttonNum, quickKeyHeld?AbstractContainerMenu::CLICK_QUICK_MOVE:AbstractContainerMenu::CLICK_PICKUP, pMinecraft->localplayers[getPad()]); + shared_ptr newItem = m_menu->getSlot(currentIndex)->getItem(); + // call this function to synchronize multiplayer item bar + pMinecraft->localgameModes[getPad()]->handleCreativeModeItemAdd(newItem, currentIndex - (int)m_menu->slots.size() + 9 + InventoryMenu::USE_ROW_SLOT_START); + + if(m_bCarryingCreativeItem) + { + m_inventorySlotX = m_iCurrSlotX; + m_inventorySlotY = m_iCurrSlotY; + m_eCurrSection = eSectionInventoryCreativeSelector; + m_eCurrTapState = eTapStateJump; + m_iCurrSlotX = m_creativeSlotX; + m_iCurrSlotY = m_creativeSlotY; + + shared_ptr playerInventory = pMinecraft->localplayers[getPad()]->inventory; + playerInventory->setCarried(nullptr); + m_bCarryingCreativeItem = false; + } + } +} + +bool IUIScene_CreativeMenu::IsSectionSlotList( ESceneSection eSection ) +{ + switch( eSection ) + { + case eSectionInventoryCreativeUsing: + case eSectionInventoryCreativeSelector: + return true; + } + return false; +} + +bool IUIScene_CreativeMenu::CanHaveFocus( ESceneSection eSection ) +{ + switch( eSection ) + { + case eSectionInventoryCreativeUsing: + case eSectionInventoryCreativeSelector: + return true; + } + return false; +} + +bool IUIScene_CreativeMenu::getEmptyInventorySlot(shared_ptr item, int &slotX) +{ + bool sameItemFound = false; + bool emptySlotFound = false; + // Jump to the slot with this item already on it, if we can stack more + for(unsigned int i = TabSpec::MAX_SIZE; i < TabSpec::MAX_SIZE + 9; ++i) + { + shared_ptr slotItem = m_menu->getSlot(i)->getItem(); + if( slotItem != NULL && slotItem->sameItemWithTags(item) && (slotItem->GetCount() + item->GetCount() <= item->getMaxStackSize() )) + { + sameItemFound = true; + slotX = i - TabSpec::MAX_SIZE; + break; + } + } + + if(!sameItemFound) + { + // Find an empty slot + for(unsigned int i = TabSpec::MAX_SIZE; i < TabSpec::MAX_SIZE + 9; ++i) + { + if( m_menu->getSlot(i)->getItem() == NULL ) + { + slotX = i - TabSpec::MAX_SIZE; + emptySlotFound = true; + break; + } + } + } + return sameItemFound || emptySlotFound; +} + +int IUIScene_CreativeMenu::getSectionStartOffset(ESceneSection eSection) +{ + int offset = 0; + switch( eSection ) + { + case eSectionInventoryCreativeSelector: + offset = 0; + break; + case eSectionInventoryCreativeUsing: + offset = TabSpec::MAX_SIZE; + break; + default: + assert( false ); + break; + } + return offset; +} + +bool IUIScene_CreativeMenu::overrideTooltips(ESceneSection sectionUnderPointer, shared_ptr itemUnderPointer, bool bIsItemCarried, bool bSlotHasItem, bool bCarriedIsSameAsSlot, int iSlotStackSizeRemaining, + EToolTipItem &buttonA, EToolTipItem &buttonX, EToolTipItem &buttonY, EToolTipItem &buttonRT, EToolTipItem &buttonBack) +{ + bool _override = false; + + if(sectionUnderPointer == eSectionInventoryCreativeSelector) + { + if(bSlotHasItem) + { + buttonA = eToolTipPickUpGeneric; + + if(itemUnderPointer->isStackable()) + { + buttonY = eToolTipPickUpAll; + } + else + { + buttonY = eToolTipNone; //eToolTipPickUpGeneric; + } + } + } + else if(sectionUnderPointer == eSectionInventoryCreativeUsing) + { + buttonY = eToolTipNone; + } + buttonX = eToolTipClearQuickSelect; + _override = true; + + 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 new file mode 100644 index 00000000..64b78029 --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_CreativeMenu.h @@ -0,0 +1,141 @@ +#pragma once +#include "IUIScene_AbstractContainerMenu.h" +#include "..\..\..\Minecraft.World\AbstractContainerMenu.h" +// 4J Stu - This class is for code that is common between XUI and Iggy + +class SimpleContainer; + +class IUIScene_CreativeMenu : public virtual IUIScene_AbstractContainerMenu +{ +public: + // 4J Stu - These map directly to the tabs seenon the screen + enum ECreativeInventoryTabs + { + eCreativeInventoryTab_BuildingBlocks = 0, + eCreativeInventoryTab_Decorations, + eCreativeInventoryTab_RedstoneAndTransport, + eCreativeInventoryTab_Materials, + eCreativeInventoryTab_Food, + eCreativeInventoryTab_ToolsWeaponsArmor, + eCreativeInventoryTab_Brewing, + eCreativeInventoryTab_Misc, + eCreativeInventoryTab_COUNT, + }; + + // 4J Stu - These are logical groupings of items, and be be combined for tabs on-screen + enum ECreative_Inventory_Groups + { + eCreativeInventory_BuildingBlocks, + eCreativeInventory_Decoration, + eCreativeInventory_Redstone, + eCreativeInventory_Transport, + eCreativeInventory_Materials, + eCreativeInventory_Food, + eCreativeInventory_ToolsArmourWeapons, + eCreativeInventory_Brewing, + eCreativeInventory_Potions_Basic, + eCreativeInventory_Potions_Level2, + eCreativeInventory_Potions_Extended, + eCreativeInventory_Potions_Level2_Extended, + eCreativeInventory_Misc, + eCreativeInventory_ArtToolsDecorations, + eCreativeInventory_ArtToolsMisc, + eCreativeInventoryGroupsCount + }; + + // 4J JEV - Keeping all the tab specifications in one place. + struct TabSpec + { + public: + // 4J JEV - Layout + static const int rows = 5; + static const int columns = 10; + static const int MAX_SIZE = rows * columns; + + // 4J JEV - Images + const LPCWSTR m_icon; + const int m_descriptionId; + const int m_staticGroupsCount; + ECreative_Inventory_Groups *m_staticGroupsA; + const int m_dynamicGroupsCount; + ECreative_Inventory_Groups *m_dynamicGroupsA; + 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 = 0, ECreative_Inventory_Groups *dynamicGroups = NULL, int debugGroupsCount = 0, ECreative_Inventory_Groups *debugGroups = NULL ); + ~TabSpec(); + + void populateMenu(AbstractContainerMenu *menu, int dynamicIndex, unsigned int page); + unsigned int getPageCount(); + }; + + class ItemPickerMenu : public AbstractContainerMenu + { + protected: + shared_ptr creativeContainer; + shared_ptr inventory; + + public: + ItemPickerMenu( shared_ptr creativeContainer, shared_ptr inventory ); + + virtual bool stillValid(shared_ptr player); + bool isOverrideResultClick(int slotNum, int buttonNum); + protected: + // 4J Stu - Brought forward from 1.2 to fix infinite recursion bug in creative + virtual void loopClick(int slotIndex, int buttonNum, bool quickKeyHeld, shared_ptr player) { } // do nothing + } *itemPickerMenu; + +protected: + static vector< shared_ptr > categoryGroups[eCreativeInventoryGroupsCount]; + // 4J JEV - Tabs + static TabSpec **specs; + + bool m_bCarryingCreativeItem; + int m_creativeSlotX, m_creativeSlotY, m_inventorySlotX, m_inventorySlotY; + +public: + static void staticCtor(); + IUIScene_CreativeMenu(); + +protected: + ECreativeInventoryTabs m_curTab; + int m_tabDynamicPos[eCreativeInventoryTab_COUNT]; + int m_tabPage[eCreativeInventoryTab_COUNT]; + + void switchTab(ECreativeInventoryTabs tab); + 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 ); + virtual bool handleValidKeyPress(int iUserIndex, int buttonNum, BOOL quickKeyHeld); + virtual void handleOutsideClicked(int iPad, int buttonNum, BOOL quickKeyHeld); + virtual void handleAdditionalKeyPress(int iAction); + virtual void handleSlotListClicked(ESceneSection eSection, int buttonNum, BOOL quickKeyHeld); + bool getEmptyInventorySlot(shared_ptr item, int &slotX); + int getSectionStartOffset(ESceneSection eSection); + virtual bool IsSectionSlotList( ESceneSection eSection ); + virtual bool CanHaveFocus( ESceneSection eSection ); + + virtual bool overrideTooltips( + ESceneSection sectionUnderPointer, + shared_ptr itemUnderPointer, + bool bIsItemCarried, + bool bSlotHasItem, + bool bCarriedIsSameAsSlot, + int iSlotStackSizeRemaining, + EToolTipItem &buttonA, + EToolTipItem &buttonX, + EToolTipItem &buttonY, + EToolTipItem &buttonRT, + 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_DispenserMenu.cpp b/Minecraft.Client/Common/UI/IUIScene_DispenserMenu.cpp new file mode 100644 index 00000000..ec8a73c3 --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_DispenserMenu.cpp @@ -0,0 +1,77 @@ +#include "stdafx.h" + +#include "IUIScene_DispenserMenu.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" + +IUIScene_AbstractContainerMenu::ESceneSection IUIScene_DispenserMenu::GetSectionAndSlotInDirection( ESceneSection eSection, ETapState eTapDirection, int *piTargetX, int *piTargetY ) +{ + ESceneSection newSection = eSection; + int xOffset = 0; + + // Find the new section if there is one + switch( eSection ) + { + case eSectionTrapTrap: + if(eTapDirection == eTapStateDown) + { + newSection = eSectionTrapInventory; + xOffset = -TRAP_SCENE_TRAP_SLOT_OFFSET; + } + else if(eTapDirection == eTapStateUp) + { + newSection = eSectionTrapUsing; + xOffset = -TRAP_SCENE_TRAP_SLOT_OFFSET; + } + break; + case eSectionTrapInventory: + if(eTapDirection == eTapStateDown) + { + newSection = eSectionTrapUsing; + } + else if(eTapDirection == eTapStateUp) + { + newSection = eSectionTrapTrap; + xOffset = TRAP_SCENE_TRAP_SLOT_OFFSET; + } + break; + case eSectionTrapUsing: + if(eTapDirection == eTapStateDown) + { + newSection = eSectionTrapTrap; + xOffset = TRAP_SCENE_TRAP_SLOT_OFFSET; + } + else if(eTapDirection == eTapStateUp) + { + newSection = eSectionTrapInventory; + } + break; + default: + assert( false ); + break; + } + + updateSlotPosition(eSection, newSection, eTapDirection, piTargetX, piTargetY, xOffset); + + return newSection; +} + +int IUIScene_DispenserMenu::getSectionStartOffset(ESceneSection eSection) +{ + int offset = 0; + switch( eSection ) + { + case eSectionTrapTrap: + offset = 0; + break; + case eSectionTrapInventory: + offset = 9; + break; + case eSectionTrapUsing: + offset = 9 + 27; + break; + default: + assert( false ); + break; + } + return offset; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/IUIScene_DispenserMenu.h b/Minecraft.Client/Common/UI/IUIScene_DispenserMenu.h new file mode 100644 index 00000000..e1826f95 --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_DispenserMenu.h @@ -0,0 +1,12 @@ +#pragma once +#include "IUIScene_AbstractContainerMenu.h" + +// The 0-indexed slot in the inventory list that lines up with the result slot +#define TRAP_SCENE_TRAP_SLOT_OFFSET 3 + +class IUIScene_DispenserMenu : public virtual IUIScene_AbstractContainerMenu +{ +protected: + virtual ESceneSection GetSectionAndSlotInDirection( ESceneSection eSection, ETapState eTapDirection, int *piTargetX, int *piTargetY ); + int getSectionStartOffset(ESceneSection eSection); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/IUIScene_EnchantingMenu.cpp b/Minecraft.Client/Common/UI/IUIScene_EnchantingMenu.cpp new file mode 100644 index 00000000..c73f7dc5 --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_EnchantingMenu.cpp @@ -0,0 +1,185 @@ +#include "stdafx.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" +#include "..\..\Minecraft.h" +#include "..\..\MultiplayerLocalPlayer.h" +#include "IUIScene_EnchantingMenu.h" + +IUIScene_AbstractContainerMenu::ESceneSection IUIScene_EnchantingMenu::GetSectionAndSlotInDirection( IUIScene_AbstractContainerMenu::ESceneSection eSection, ETapState eTapDirection, int *piTargetX, int *piTargetY ) +{ + IUIScene_AbstractContainerMenu::ESceneSection newSection = eSection; + int xOffset = 0; + + // Find the new section if there is one + switch( eSection ) + { + case eSectionEnchantInventory: + if(eTapDirection == eTapStateDown) + { + newSection = eSectionEnchantUsing; + } + else if(eTapDirection == eTapStateUp) + { + if( *piTargetX >= ENCHANT_SCENE_ENCHANT_BUTTONS_UP_OFFSET) + { + newSection = eSectionEnchantButton3; + } + else + { + newSection = eSectionEnchantSlot; + } + } + break; + case eSectionEnchantUsing: + if(eTapDirection == eTapStateDown) + { + if( *piTargetX >= ENCHANT_SCENE_ENCHANT_BUTTONS_UP_OFFSET) + { + newSection = eSectionEnchantButton1; + } + else + { + newSection = eSectionEnchantSlot; + } + } + else if(eTapDirection == eTapStateUp) + { + newSection = eSectionEnchantInventory; + } + break; + case eSectionEnchantSlot: + if(eTapDirection == eTapStateDown) + { + newSection = eSectionEnchantInventory; + xOffset = ENCHANT_SCENE_INGREDIENT_SLOT_DOWN_OFFSET; + } + else if(eTapDirection == eTapStateUp) + { + newSection = eSectionEnchantUsing; + xOffset = ENCHANT_SCENE_INGREDIENT_SLOT_DOWN_OFFSET; + } + else if(eTapDirection == eTapStateLeft || eTapDirection == eTapStateRight) + { + newSection = eSectionEnchantButton1; + } + break; + case eSectionEnchantButton1: + if(eTapDirection == eTapStateDown) + { + newSection = eSectionEnchantButton2; + } + else if(eTapDirection == eTapStateUp) + { + newSection = eSectionEnchantUsing; + xOffset = ENCHANT_SCENE_ENCHANT_BUTTONS_DOWN_OFFSET; + } + else if(eTapDirection == eTapStateLeft || eTapDirection == eTapStateRight) + { + newSection = eSectionEnchantSlot; + } + break; + case eSectionEnchantButton2: + if(eTapDirection == eTapStateDown) + { + newSection = eSectionEnchantButton3; + } + else if(eTapDirection == eTapStateUp) + { + newSection = eSectionEnchantButton1; + } + else if(eTapDirection == eTapStateLeft || eTapDirection == eTapStateRight) + { + newSection = eSectionEnchantSlot; + } + break; + case eSectionEnchantButton3: + if(eTapDirection == eTapStateDown) + { + newSection = eSectionEnchantInventory; + xOffset = ENCHANT_SCENE_ENCHANT_BUTTONS_DOWN_OFFSET; + } + else if(eTapDirection == eTapStateUp) + { + newSection = eSectionEnchantButton2; + } + else if(eTapDirection == eTapStateLeft || eTapDirection == eTapStateRight) + { + newSection = eSectionEnchantSlot; + } + break; + default: + assert( false ); + break; + } + + updateSlotPosition(eSection, newSection, eTapDirection, piTargetX, piTargetY, xOffset); + + return newSection; +} + +void IUIScene_EnchantingMenu::handleOtherClicked(int iPad, ESceneSection eSection, int buttonNum, bool quickKey) +{ + int index = -1; + // Old xui code +#if 0 + HXUIOBJ hFocusObject = GetFocus(iPad); + if(hFocusObject == m_enchant1->m_hObj) index = 0; + else if(hFocusObject == m_enchant2->m_hObj) index = 1; + else if(hFocusObject == m_enchant3->m_hObj) index = 2; +#endif + + switch(eSection) + { + case eSectionEnchantButton1: + index = 0; + break; + case eSectionEnchantButton2: + index = 1; + break; + case eSectionEnchantButton3: + index = 2; + break; + }; + Minecraft *pMinecraft = Minecraft::GetInstance(); + if (index >= 0 && m_menu->clickMenuButton(dynamic_pointer_cast(pMinecraft->localplayers[iPad]), index)) + { + pMinecraft->localgameModes[iPad]->handleInventoryButtonClick(m_menu->containerId, index); + } +} + +int IUIScene_EnchantingMenu::getSectionStartOffset(ESceneSection eSection) +{ + int offset = 0; + switch( eSection ) + { + case eSectionEnchantSlot: + offset = 0; + break; + case eSectionEnchantInventory: + offset = 1; + break; + case eSectionEnchantUsing: + offset = 1 + 27; + break; + default: + assert( false ); + break; + }; + return offset; +} + +bool IUIScene_EnchantingMenu::IsSectionSlotList( ESceneSection eSection ) +{ + switch( eSection ) + { + case eSectionEnchantInventory: + case eSectionEnchantUsing: + case eSectionEnchantSlot: + return true; + } + return false; +} + +EnchantmentMenu *IUIScene_EnchantingMenu::getMenu() +{ + return (EnchantmentMenu *)m_menu; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/IUIScene_EnchantingMenu.h b/Minecraft.Client/Common/UI/IUIScene_EnchantingMenu.h new file mode 100644 index 00000000..7867265a --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_EnchantingMenu.h @@ -0,0 +1,23 @@ +#pragma once + +#include "IUIScene_AbstractContainerMenu.h" + +// The 0-indexed slot in the inventory list that lines up with the result slot +#define ENCHANT_SCENE_ENCHANT_BUTTONS_UP_OFFSET 3 +#define ENCHANT_SCENE_ENCHANT_BUTTONS_DOWN_OFFSET -7 +#define ENCHANT_SCENE_INGREDIENT_SLOT_UP_OFFSET 0 +#define ENCHANT_SCENE_INGREDIENT_SLOT_DOWN_OFFSET 0 + +class EnchantmentMenu; + +class IUIScene_EnchantingMenu : public virtual IUIScene_AbstractContainerMenu +{ +protected: + virtual ESceneSection GetSectionAndSlotInDirection( ESceneSection eSection, ETapState eTapDirection, int *piTargetX, int *piTargetY ); + virtual void handleOtherClicked(int iPad, ESceneSection eSection, int buttonNum, bool quickKey); + int getSectionStartOffset(ESceneSection eSection); + virtual bool IsSectionSlotList( ESceneSection eSection ); + +public: + EnchantmentMenu *getMenu(); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/IUIScene_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_FurnaceMenu.cpp b/Minecraft.Client/Common/UI/IUIScene_FurnaceMenu.cpp new file mode 100644 index 00000000..4a6c6762 --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_FurnaceMenu.cpp @@ -0,0 +1,141 @@ +#include "stdafx.h" + +#include "IUIScene_FurnaceMenu.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" + +IUIScene_AbstractContainerMenu::ESceneSection IUIScene_FurnaceMenu::GetSectionAndSlotInDirection( ESceneSection eSection, ETapState eTapDirection, int *piTargetX, int *piTargetY ) +{ + ESceneSection newSection = eSection; + int xOffset = 0; + + // Find the new section if there is one + switch( eSection ) + { + case eSectionFurnaceResult: + if(eTapDirection == eTapStateUp) + { + newSection = eSectionFurnaceUsing; + xOffset = FURNACE_SCENE_RESULT_SLOT_DOWN_OFFSET; + } + else if(eTapDirection == eTapStateDown) + { + newSection = eSectionFurnaceInventory; + xOffset = FURNACE_SCENE_RESULT_SLOT_DOWN_OFFSET; + } + else if(eTapDirection == eTapStateLeft) + { + newSection = eSectionFurnaceIngredient; + } + else if(eTapDirection == eTapStateRight) + { + newSection = eSectionFurnaceIngredient; + } + break; + case eSectionFurnaceIngredient: + if(eTapDirection == eTapStateUp) + { + newSection = eSectionFurnaceUsing; + xOffset = FURNACE_SCENE_FUEL_SLOT_DOWN_OFFSET; + } + else if(eTapDirection == eTapStateDown) + { + newSection = eSectionFurnaceFuel; + } + else if(eTapDirection == eTapStateLeft) + { + newSection = eSectionFurnaceResult; + } + else if(eTapDirection == eTapStateRight) + { + newSection = eSectionFurnaceResult; + } + break; + case eSectionFurnaceFuel: + if(eTapDirection == eTapStateDown) + { + newSection = eSectionFurnaceInventory; + xOffset = FURNACE_SCENE_FUEL_SLOT_DOWN_OFFSET; + } + else if(eTapDirection == eTapStateUp) + { + newSection = eSectionFurnaceIngredient; + } + else if(eTapDirection == eTapStateLeft) + { + newSection = eSectionFurnaceResult; + } + else if(eTapDirection == eTapStateRight) + { + newSection = eSectionFurnaceResult; + } + break; + case eSectionFurnaceInventory: + if(eTapDirection == eTapStateDown) + { + newSection = eSectionFurnaceUsing; + } + else if(eTapDirection == eTapStateUp) + { + if( *piTargetX >= FURNACE_SCENE_RESULT_SLOT_UP_OFFSET) + { + newSection = eSectionFurnaceResult; + } + else + { + newSection = eSectionFurnaceFuel; + } + } + break; + case eSectionFurnaceUsing: + if(eTapDirection == eTapStateUp) + { + newSection = eSectionFurnaceInventory; + } + else if(eTapDirection == eTapStateDown) + { + if( *piTargetX >= FURNACE_SCENE_RESULT_SLOT_UP_OFFSET) + { + newSection = eSectionFurnaceResult; + } + else + { + newSection = eSectionFurnaceIngredient; + } + } + break; + default: + assert( false ); + break; + } + + updateSlotPosition(eSection, newSection, eTapDirection, piTargetX, piTargetY, xOffset); + + return newSection; +} + +int IUIScene_FurnaceMenu::getSectionStartOffset(ESceneSection eSection) +{ + int offset = 0; + switch( eSection ) + { + case eSectionFurnaceResult: + offset = FurnaceMenu::RESULT_SLOT; + break; + case eSectionFurnaceFuel: + offset = FurnaceMenu::FUEL_SLOT; + break; + case eSectionFurnaceIngredient: + offset = FurnaceMenu::INGREDIENT_SLOT; + break; + case eSectionFurnaceInventory: + offset = FurnaceMenu::INV_SLOT_START; + break; + case eSectionFurnaceUsing: + offset = FurnaceMenu::INV_SLOT_START + 27; + break; + default: + assert( false ); + break; + } + return offset; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/IUIScene_FurnaceMenu.h b/Minecraft.Client/Common/UI/IUIScene_FurnaceMenu.h new file mode 100644 index 00000000..1e3b3ba1 --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_FurnaceMenu.h @@ -0,0 +1,15 @@ +#pragma once +#include "IUIScene_AbstractContainerMenu.h" + +// The 0-indexed slot in the inventory list that lines up with the result slot +#define FURNACE_SCENE_RESULT_SLOT_UP_OFFSET 6 +#define FURNACE_SCENE_RESULT_SLOT_DOWN_OFFSET -7 +#define FURNACE_SCENE_FUEL_SLOT_UP_OFFSET 0 +#define FURNACE_SCENE_FUEL_SLOT_DOWN_OFFSET -3 + +class IUIScene_FurnaceMenu : public virtual IUIScene_AbstractContainerMenu +{ +protected: + virtual ESceneSection GetSectionAndSlotInDirection( ESceneSection eSection, ETapState eTapDirection, int *piTargetX, int *piTargetY ); + int getSectionStartOffset(ESceneSection eSection); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/IUIScene_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_InventoryMenu.cpp b/Minecraft.Client/Common/UI/IUIScene_InventoryMenu.cpp new file mode 100644 index 00000000..7bed406a --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_InventoryMenu.cpp @@ -0,0 +1,72 @@ +#include "stdafx.h" + +#include "IUIScene_InventoryMenu.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" + +IUIScene_AbstractContainerMenu::ESceneSection IUIScene_InventoryMenu::GetSectionAndSlotInDirection( ESceneSection eSection, ETapState eTapDirection, int *piTargetX, int *piTargetY ) +{ + ESceneSection newSection = eSection; + + // Find the new section if there is one + switch( eSection ) + { + case eSectionInventoryArmor: + if(eTapDirection == eTapStateDown) + { + newSection = eSectionInventoryInventory; + } + else if(eTapDirection == eTapStateUp) + { + newSection = eSectionInventoryUsing; + } + break; + case eSectionInventoryInventory: + if(eTapDirection == eTapStateDown) + { + newSection = eSectionInventoryUsing; + } + else if(eTapDirection == eTapStateUp) + { + newSection = eSectionInventoryArmor; + } + break; + case eSectionInventoryUsing: + if(eTapDirection == eTapStateDown) + { + newSection = eSectionInventoryArmor; + } + else if(eTapDirection == eTapStateUp) + { + newSection = eSectionInventoryInventory; + } + break; + default: + assert( false ); + break; + } + + updateSlotPosition(eSection, newSection, eTapDirection, piTargetX, piTargetY, 0); + + return newSection; +} + +int IUIScene_InventoryMenu::getSectionStartOffset(ESceneSection eSection) +{ + int offset = 0; + switch( eSection ) + { + case eSectionInventoryArmor: + offset = InventoryMenu::ARMOR_SLOT_START; + break; + case eSectionInventoryInventory: + offset = InventoryMenu::INV_SLOT_START; + break; + case eSectionInventoryUsing: + offset = InventoryMenu::INV_SLOT_START + 27; + break; + default: + assert( false ); + break; + } + return offset; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/IUIScene_InventoryMenu.h b/Minecraft.Client/Common/UI/IUIScene_InventoryMenu.h new file mode 100644 index 00000000..30887f8a --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_InventoryMenu.h @@ -0,0 +1,10 @@ +#pragma once + +#include "IUIScene_AbstractContainerMenu.h" + +class IUIScene_InventoryMenu : public virtual IUIScene_AbstractContainerMenu +{ +protected: + virtual ESceneSection GetSectionAndSlotInDirection( ESceneSection eSection, ETapState eTapDirection, int *piTargetX, int *piTargetY ); + int getSectionStartOffset(ESceneSection eSection); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/IUIScene_PauseMenu.cpp b/Minecraft.Client/Common/UI/IUIScene_PauseMenu.cpp new file mode 100644 index 00000000..ab1767d4 --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_PauseMenu.cpp @@ -0,0 +1,711 @@ +#include "stdafx.h" +#include "IUIScene_PauseMenu.h" +#include "..\..\Minecraft.h" +#include "..\..\MinecraftServer.h" +#include "..\..\MultiPlayerLevel.h" +#include "..\..\ProgressRenderer.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.phys.h" +#include "..\..\TexturePackRepository.h" +#include "..\..\TexturePack.h" +#include "..\..\DLCTexturePack.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" + +#ifndef _XBOX +#include "UI.h" +#endif + + +int IUIScene_PauseMenu::ExitGameDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ +#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) + { + if(pScene) pScene->SetIgnoreInput(true); + app.SetAction(iPad,eAppAction_ExitWorld); + } + return 0; +} + + +int IUIScene_PauseMenu::ExitGameSaveDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ +#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 + if(result==C4JStorage::EMessage_ResultDecline || result==C4JStorage::EMessage_ResultThirdOption) + { + if( result==C4JStorage::EMessage_ResultDecline ) // Save + { + // 4J-PB - Is the player trying to save but they are using a trial texturepack ? + if(!Minecraft::GetInstance()->skins->isUsingDefaultSkin()) + { + TexturePack *tPack = Minecraft::GetInstance()->skins->getSelected(); + DLCTexturePack *pDLCTexPack=(DLCTexturePack *)tPack; + + DLCPack *pDLCPack=pDLCTexPack->getDLCInfoParentPack();//tPack->getDLCPack(); + if(!pDLCPack->hasPurchasedFile( DLCManager::e_DLCType_Texture, L"" )) + { +#ifdef _XBOX + // upsell + ULONGLONG ullOfferID_Full; + // get the dlc texture pack + DLCTexturePack *pDLCTexPack=(DLCTexturePack *)tPack; + + app.GetDLCFullOfferIDForPackID(pDLCTexPack->getDLCParentPackId(),&ullOfferID_Full); + + // tell sentient about the upsell of the full version of the skin pack + TelemetryManager->RecordUpsellPresented(iPad, eSet_UpsellID_Texture_DLC, ullOfferID_Full & 0xFFFFFFFF); +#endif + + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_OK; + uiIDA[1]=IDS_CONFIRM_CANCEL; + + // Give the player a warning about the trial version of the texture pack + ui.RequestAlertMessage(IDS_WARNING_DLC_TRIALTEXTUREPACK_TITLE, IDS_WARNING_DLC_TRIALTEXTUREPACK_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad() , &IUIScene_PauseMenu::WarningTrialTexturePackReturned, pParam); + + return S_OK; + } + } + + // does the save exist? + bool bSaveExists; + StorageManager.DoesSaveExist(&bSaveExists); + // 4J-PB - we check if the save exists inside the libs + // we need to ask if they are sure they want to overwrite the existing game + if(bSaveExists) + { + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + ui.RequestAlertMessage(IDS_TITLE_SAVE_GAME, IDS_CONFIRM_SAVE_GAME, uiIDA, 2, ProfileManager.GetPrimaryPad(), &IUIScene_PauseMenu::ExitGameAndSaveReturned, pParam); + return 0; + } + else + { +#if defined(_XBOX_ONE) || defined(__ORBIS__) + StorageManager.SetSaveDisabled(false); +#endif + MinecraftServer::getInstance()->setSaveOnExit( true ); + } + } + else + { + // been a few requests for a confirm on exit without saving + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + ui.RequestAlertMessage(IDS_TITLE_DECLINE_SAVE_GAME, IDS_CONFIRM_DECLINE_SAVE_GAME, uiIDA, 2, ProfileManager.GetPrimaryPad(), &IUIScene_PauseMenu::ExitGameDeclineSaveReturned, pParam); + return 0; + } + + if(pScene) pScene->SetIgnoreInput(true); + + app.SetAction(iPad,eAppAction_ExitWorld); + } + return 0; +} + + +int IUIScene_PauseMenu::ExitGameAndSaveReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + // 4J-PB - we won't come in here if we have a trial texture pack +#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) + { + //INT saveOrCheckpointId = 0; + //bool validSave = StorageManager.GetSaveUniqueNumber(&saveOrCheckpointId); + //SentientManager.RecordLevelSaveOrCheckpoint(ProfileManager.GetPrimaryPad(), saveOrCheckpointId); +#if defined(_XBOX_ONE) || defined(__ORBIS__) + StorageManager.SetSaveDisabled(false); +#endif + if(pScene) pScene->SetIgnoreInput(true); + MinecraftServer::getInstance()->setSaveOnExit( true ); + // flag a app action of exit game + app.SetAction(iPad,eAppAction_ExitWorld); + } + else + { + // has someone disconnected the ethernet here, causing the pause menu to shut? + if(ui.IsPauseMenuDisplayed(ProfileManager.GetPrimaryPad())) + { + UINT uiIDA[3]; + // you cancelled the save on exit after choosing exit and save? You go back to the Exit choices then. + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_EXIT_GAME_SAVE; + uiIDA[2]=IDS_EXIT_GAME_NO_SAVE; + + if(g_NetworkManager.GetPlayerCount()>1) + { + ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME_CONFIRM_DISCONNECT_SAVE, uiIDA, 3, ProfileManager.GetPrimaryPad(), &IUIScene_PauseMenu::ExitGameSaveDialogReturned, pParam); + } + else + { + ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME, uiIDA, 3, ProfileManager.GetPrimaryPad(), &IUIScene_PauseMenu::ExitGameSaveDialogReturned, pParam); + } + } + } + return 0; +} + + + +int IUIScene_PauseMenu::ExitGameDeclineSaveReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ +#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) + { +#if defined(_XBOX_ONE) || defined(__ORBIS__) + // Don't do this here, as it will still try and save some things even though it shouldn't! + //StorageManager.SetSaveDisabled(false); +#endif + if(pScene) pScene->SetIgnoreInput(true); + MinecraftServer::getInstance()->setSaveOnExit( false ); + // flag a app action of exit game + app.SetAction(iPad,eAppAction_ExitWorld); + } + else + { + // has someone disconnected the ethernet here, causing the pause menu to shut? + if(ui.IsPauseMenuDisplayed(ProfileManager.GetPrimaryPad())) + { + UINT uiIDA[3]; + // you cancelled the save on exit after choosing exit and save? You go back to the Exit choices then. + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_EXIT_GAME_SAVE; + uiIDA[2]=IDS_EXIT_GAME_NO_SAVE; + + if(g_NetworkManager.GetPlayerCount()>1) + { + ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME_CONFIRM_DISCONNECT_SAVE, uiIDA, 3, ProfileManager.GetPrimaryPad(),&IUIScene_PauseMenu::ExitGameSaveDialogReturned, pParam); + } + else + { + ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME, uiIDA, 3, ProfileManager.GetPrimaryPad(),&IUIScene_PauseMenu::ExitGameSaveDialogReturned, pParam); + } + } + + } + return 0; +} + + + +int IUIScene_PauseMenu::WarningTrialTexturePackReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ +#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) + if(result==C4JStorage::EMessage_ResultAccept) + { + if(!ProfileManager.IsSignedInLive(iPad)) + { + // you're not signed in to PSN! + + } + else + { + // 4J-PB - need to check this user can access the store + bool bContentRestricted; + ProfileManager.GetChatAndContentRestrictions(iPad,true,NULL,&bContentRestricted,NULL); + if(bContentRestricted) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.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 + IUIScene_PauseMenu* pScene = (IUIScene_PauseMenu*)pParam; + + if(result==C4JStorage::EMessage_ResultAccept) + { + if(ProfileManager.IsSignedIn(iPad)) + { + if (ProfileManager.IsSignedInLive(iPad)) + { + TexturePack *tPack = Minecraft::GetInstance()->skins->getSelected(); + // get the dlc texture pack + DLCTexturePack *pDLCTexPack=(DLCTexturePack *)tPack; + + DLCPack *pDLCPack=pDLCTexPack->getDLCInfoParentPack(); + + DLC_INFO *pDLCInfo=app.GetDLCInfoForProductName((WCHAR *)pDLCPack->getName().c_str()); + + StorageManager.InstallOffer(1,(WCHAR *)pDLCInfo->wsProductId.c_str(),NULL,NULL); + + // the license change coming in when the offer has been installed will cause this scene to refresh + } + else + { + // 4J-JEV: Fix for XB1: #165863 - XR-074: Compliance: With no active network connection user is unable to convert from Trial to Full texture pack and is not messaged why. + UINT uiIDA[1] = { IDS_CONFIRM_OK }; + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1, iPad); + } + } + } + +#endif + +#ifdef _XBOX + IUIScene_PauseMenu* pScene = (IUIScene_PauseMenu*)pParam; + + //pScene->m_bIgnoreInput = false; + pScene->ShowScene( true ); + if(result==C4JStorage::EMessage_ResultAccept) + { + if(ProfileManager.IsSignedIn(iPad)) + { + ULONGLONG ullIndexA[1]; + + TexturePack *tPack = Minecraft::GetInstance()->skins->getSelected(); + // get the dlc texture pack + DLCTexturePack *pDLCTexPack=(DLCTexturePack *)tPack; + + // Need to get the parent packs id, since this may be one of many child packs with their own ids + app.GetDLCFullOfferIDForPackID(pDLCTexPack->getDLCParentPackId(),&ullIndexA[0]); + + // need to allow downloads here, or the player would need to quit the game to let the download of a texture pack happen. This might affect the network traffic, since the download could take all the bandwidth... + XBackgroundDownloadSetMode(XBACKGROUND_DOWNLOAD_MODE_ALWAYS_ALLOW); + + StorageManager.InstallOffer(1,ullIndexA,NULL,NULL); + } + } + else + { + TelemetryManager->RecordUpsellResponded(iPad, eSet_UpsellID_Texture_DLC, ( pScene->m_pDLCPack->getPurchaseOfferId() & 0xFFFFFFFF ), eSen_UpsellOutcome_Declined); + } +#endif + + + return 0; +} + + +int IUIScene_PauseMenu::SaveWorldThreadProc( LPVOID lpParameter ) +{ + bool bAutosave=(bool)lpParameter; + if(bAutosave) + { + app.SetXuiServerAction(ProfileManager.GetPrimaryPad(),eXuiServerAction_AutoSaveGame); + } + else + { + app.SetXuiServerAction(ProfileManager.GetPrimaryPad(),eXuiServerAction_SaveGame); + } + + // Share AABB & Vec3 pools with default (main thread) - should be ok as long as we don't tick the main thread whilst this thread is running + AABB::UseDefaultThreadStorage(); + Vec3::UseDefaultThreadStorage(); + Compression::UseDefaultThreadStorage(); + + Minecraft *pMinecraft=Minecraft::GetInstance(); + + //wprintf(L"Loading world on thread\n"); + + if(ProfileManager.IsFullVersion()) + { + app.SetGameStarted(false); + + while( app.GetXuiServerAction(ProfileManager.GetPrimaryPad() ) != eXuiServerAction_Idle && !MinecraftServer::serverHalted() ) + { + Sleep(10); + } + + if(!MinecraftServer::serverHalted() && !app.GetChangingSessionType() ) app.SetGameStarted(true); + +#if defined(_XBOX_ONE) || defined(__ORBIS__) + if(app.GetGameHostOption(eGameHostOption_DisableSaving)) StorageManager.SetSaveDisabled(true); +#endif + } + + HRESULT hr = S_OK; + if(app.GetChangingSessionType()) + { + // 4J Stu - This causes the fullscreenprogress scene to ignore the action it was given + hr = ERROR_CANCELLED; + } + return hr; +} + +int IUIScene_PauseMenu::ExitWorldThreadProc( void* lpParameter ) +{ + // Share AABB & Vec3 pools with default (main thread) - should be ok as long as we don't tick the main thread whilst this thread is running + AABB::UseDefaultThreadStorage(); + Vec3::UseDefaultThreadStorage(); + Compression::UseDefaultThreadStorage(); + + //app.SetGameStarted(false); + + _ExitWorld(lpParameter); + + return S_OK; +} + +// This function performs the meat of exiting from a level. It should be called from a thread other than the main thread. +void IUIScene_PauseMenu::_ExitWorld(LPVOID lpParameter) +{ + Minecraft *pMinecraft=Minecraft::GetInstance(); + + int exitReasonStringId = pMinecraft->progressRenderer->getCurrentTitle(); + int exitReasonTitleId = IDS_CONNECTION_LOST; + + bool saveStats = true; + if (pMinecraft->isClientSide() || g_NetworkManager.IsInSession()) + { + if(lpParameter != NULL ) + { + // 4J-PB - check if we have lost connection to Live + if(ProfileManager.GetLiveConnectionStatus()!=XONLINE_S_LOGON_CONNECTION_ESTABLISHED ) + { + exitReasonStringId = IDS_CONNECTION_LOST_LIVE; + } + else + { + switch( app.GetDisconnectReason() ) + { + case DisconnectPacket::eDisconnect_Kicked: + exitReasonStringId = IDS_DISCONNECTED_KICKED; + break; + case DisconnectPacket::eDisconnect_NoUGC_AllLocal: + exitReasonStringId = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_ALL_LOCAL; + exitReasonTitleId = IDS_CONNECTION_FAILED; + break; + case DisconnectPacket::eDisconnect_NoUGC_Single_Local: + exitReasonStringId = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_SINGLE_LOCAL; + exitReasonTitleId = IDS_CONNECTION_FAILED; + break; +#if defined(__PS3__) || defined(__ORBIS__) + case DisconnectPacket::eDisconnect_ContentRestricted_AllLocal: + exitReasonStringId = IDS_CONTENT_RESTRICTION_MULTIPLAYER; + exitReasonTitleId = IDS_CONNECTION_FAILED; + break; + case DisconnectPacket::eDisconnect_ContentRestricted_Single_Local: + exitReasonStringId = IDS_CONTENT_RESTRICTION; + exitReasonTitleId = IDS_CONNECTION_FAILED; + break; +#endif +#ifdef _XBOX + case DisconnectPacket::eDisconnect_NoUGC_Remote: + exitReasonStringId = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_REMOTE; + exitReasonTitleId = IDS_CONNECTION_FAILED; + break; +#endif + case DisconnectPacket::eDisconnect_NoFlying: + exitReasonStringId = IDS_DISCONNECTED_FLYING; + break; + case DisconnectPacket::eDisconnect_Quitting: + exitReasonStringId = IDS_DISCONNECTED_SERVER_QUIT; + break; +#ifdef __ORBIS__ + case DisconnectPacket::eDisconnect_NetworkError: + exitReasonStringId = IDS_ERROR_NETWORK_EXIT; + exitReasonTitleId = IDS_ERROR_NETWORK_TITLE; + break; +#endif + case DisconnectPacket::eDisconnect_NoFriendsInGame: + exitReasonStringId = IDS_DISCONNECTED_NO_FRIENDS_IN_GAME; + exitReasonTitleId = IDS_CANTJOIN_TITLE; + break; + case DisconnectPacket::eDisconnect_Banned: + exitReasonStringId = IDS_DISCONNECTED_BANNED; + exitReasonTitleId = IDS_CANTJOIN_TITLE; + break; + case DisconnectPacket::eDisconnect_NotFriendsWithHost: + exitReasonStringId = IDS_NOTALLOWED_FRIENDSOFFRIENDS; + exitReasonTitleId = IDS_CANTJOIN_TITLE; + break; + case DisconnectPacket::eDisconnect_OutdatedServer: + exitReasonStringId = IDS_DISCONNECTED_SERVER_OLD; + exitReasonTitleId = IDS_CANTJOIN_TITLE; + break; + case DisconnectPacket::eDisconnect_OutdatedClient: + exitReasonStringId = IDS_DISCONNECTED_CLIENT_OLD; + exitReasonTitleId = IDS_CANTJOIN_TITLE; + break; + case DisconnectPacket::eDisconnect_ServerFull: + exitReasonStringId = IDS_DISCONNECTED_SERVER_FULL; + exitReasonTitleId = IDS_CANTJOIN_TITLE; + break; +#ifdef _XBOX_ONE + case DisconnectPacket::eDisconnect_ExitedGame: + exitReasonTitleId = IDS_EXIT_GAME; + exitReasonStringId = IDS_DISCONNECTED_EXITED_GAME; + break; +#endif + +#if defined __ORBIS__ || defined __PS3__ || defined __PSVITA__ + case DisconnectPacket::eDisconnect_NATMismatch: + exitReasonStringId = IDS_DISCONNECTED_NAT_TYPE_MISMATCH; + exitReasonTitleId = IDS_CONNECTION_FAILED; + break; +#endif + default: + exitReasonStringId = IDS_CONNECTION_LOST_SERVER; + } + } + //pMinecraft->progressRenderer->progressStartNoAbort( exitReasonStringId ); + + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + // 4J Stu - Fix for #48669 - TU5: Code: Compliance: TCR #15: Incorrect/misleading messages after signing out a profile during online game session. + // If the primary player is signed out, then that is most likely the cause of the disconnection so don't display a message box. This will allow the message box requested by the libraries to be brought up + if( ProfileManager.IsSignedIn(ProfileManager.GetPrimaryPad())) ui.RequestErrorMessage( exitReasonTitleId, exitReasonStringId, uiIDA,1,ProfileManager.GetPrimaryPad()); + exitReasonStringId = -1; + + // 4J - Force a disconnection, this handles the situation that the server has already disconnected + if( pMinecraft->levels[0] != NULL ) pMinecraft->levels[0]->disconnect(false); + if( pMinecraft->levels[1] != NULL ) pMinecraft->levels[1]->disconnect(false); + if( pMinecraft->levels[2] != NULL ) pMinecraft->levels[2]->disconnect(false); + } + else + { + exitReasonStringId = IDS_EXITING_GAME; + pMinecraft->progressRenderer->progressStartNoAbort( IDS_EXITING_GAME ); + if( pMinecraft->levels[0] != NULL ) pMinecraft->levels[0]->disconnect(); + if( pMinecraft->levels[1] != NULL ) pMinecraft->levels[1]->disconnect(); + if( pMinecraft->levels[2] != NULL ) pMinecraft->levels[2]->disconnect(); + } + + // 4J Stu - This only does something if we actually have a server, so don't need to do any other checks + MinecraftServer::HaltServer(); + + // We need to call the stats & leaderboards save before we exit the session + // 4J We need to do this in a QNet callback where it is safe + //pMinecraft->forceStatsSave(); + saveStats = false; + + // 4J Stu - Leave the session once the disconnect packet has been sent + g_NetworkManager.LeaveGame(FALSE); + } + else + { + if(lpParameter != NULL && ProfileManager.IsSignedIn(ProfileManager.GetPrimaryPad()) ) + { + switch( app.GetDisconnectReason() ) + { + case DisconnectPacket::eDisconnect_Kicked: + exitReasonStringId = IDS_DISCONNECTED_KICKED; + break; + case DisconnectPacket::eDisconnect_NoUGC_AllLocal: + exitReasonStringId = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_ALL_LOCAL; + exitReasonTitleId = IDS_CONNECTION_FAILED; + break; + case DisconnectPacket::eDisconnect_NoUGC_Single_Local: + exitReasonStringId = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_SINGLE_LOCAL; + exitReasonTitleId = IDS_CONNECTION_FAILED; + break; +#if defined(__PS3__) || defined(__ORBIS__) + case DisconnectPacket::eDisconnect_ContentRestricted_AllLocal: + exitReasonStringId = IDS_CONTENT_RESTRICTION_MULTIPLAYER; + exitReasonTitleId = IDS_CONNECTION_FAILED; + break; + case DisconnectPacket::eDisconnect_ContentRestricted_Single_Local: + exitReasonStringId = IDS_CONTENT_RESTRICTION; + exitReasonTitleId = IDS_CONNECTION_FAILED; + break; +#endif +#ifdef _XBOX + case DisconnectPacket::eDisconnect_NoUGC_Remote: + exitReasonStringId = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_REMOTE; + exitReasonTitleId = IDS_CONNECTION_FAILED; + break; +#endif + case DisconnectPacket::eDisconnect_Quitting: + exitReasonStringId = IDS_DISCONNECTED_SERVER_QUIT; + break; +#ifdef __ORBIS__ + case DisconnectPacket::eDisconnect_NetworkError: + exitReasonStringId = IDS_ERROR_NETWORK_EXIT; + exitReasonTitleId = IDS_ERROR_NETWORK_TITLE; + break; +#endif + case DisconnectPacket::eDisconnect_NoMultiplayerPrivilegesJoin: + exitReasonStringId = IDS_NO_MULTIPLAYER_PRIVILEGE_JOIN_TEXT; + break; + case DisconnectPacket::eDisconnect_OutdatedServer: + exitReasonStringId = IDS_DISCONNECTED_SERVER_OLD; + exitReasonTitleId = IDS_CANTJOIN_TITLE; + break; + case DisconnectPacket::eDisconnect_OutdatedClient: + exitReasonStringId = IDS_DISCONNECTED_CLIENT_OLD; + exitReasonTitleId = IDS_CANTJOIN_TITLE; + break; + case DisconnectPacket::eDisconnect_ServerFull: + exitReasonStringId = IDS_DISCONNECTED_SERVER_FULL; + exitReasonTitleId = IDS_CANTJOIN_TITLE; + break; +#if defined __ORBIS__ || defined __PS3__ || defined __PSVITA__ + case DisconnectPacket::eDisconnect_NATMismatch: + exitReasonStringId = IDS_DISCONNECTED_NAT_TYPE_MISMATCH; + exitReasonTitleId = IDS_CONNECTION_FAILED; + break; +#endif + default: + exitReasonStringId = IDS_DISCONNECTED; + } + //pMinecraft->progressRenderer->progressStartNoAbort( exitReasonStringId ); + + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestErrorMessage( exitReasonTitleId, exitReasonStringId, uiIDA,1,ProfileManager.GetPrimaryPad()); + exitReasonStringId = -1; + } + } + // Fix for #93148 - TCR 001: BAS Game Stability: Title will crash for the multiplayer client if host of the game will exit during the clients loading to created world. + while( g_NetworkManager.IsNetworkThreadRunning() ) + { + Sleep(1); + } + pMinecraft->setLevel(NULL,exitReasonStringId,nullptr,saveStats); + + TelemetryManager->Flush(); + + app.m_gameRules.unloadCurrentGameRules(); + //app.m_Audio.unloadCurrentAudioDetails(); + + MinecraftServer::resetFlags(); + + // Fix for #48385 - BLACK OPS :TU5: Functional: Client becomes pseudo soft-locked when returned to the main menu after a remote disconnect + // Make sure there is text explaining why the player is waiting + pMinecraft->progressRenderer->progressStart(IDS_EXITING_GAME); + + // Fix for #13259 - CRASH: Gameplay: loading process is halted when player loads saved data + // We can't start/join a new game until the session is destroyed, so wait for it to be idle again + while( g_NetworkManager.IsInSession() ) + { + Sleep(1); + } + + app.SetChangingSessionType(false); + app.SetReallyChangingSessionType(false); + +#if defined(_XBOX_ONE) || defined(__ORBIS__) + // Make sure we don't think saving is disabled in the menus + StorageManager.SetSaveDisabled(false); +#endif +} + + +int IUIScene_PauseMenu::SaveGameDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + // results switched for this dialog + if(result==C4JStorage::EMessage_ResultDecline) + { +#if defined(_XBOX_ONE) || defined(__ORBIS__) + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + ui.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); +#endif + } + return 0; +} + +int IUIScene_PauseMenu::EnableAutosaveDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + // results switched for this dialog + if(result==C4JStorage::EMessage_ResultDecline) + { + // Set the global flag, so that we don't disable saving again once the save is complete + app.SetGameHostOption(eGameHostOption_DisableSaving, 0); + } + else + { + // Set the global flag, so that we do disable saving again once the save is complete + // We need to set this on as we may have only disabled it due to having a trial texture pack + app.SetGameHostOption(eGameHostOption_DisableSaving, 1); + } + // Re-enable saving temporarily + StorageManager.SetSaveDisabled(false); + + // flag a app action of save game + app.SetAction(iPad,eAppAction_SaveGame); + return 0; +} + +int IUIScene_PauseMenu::DisableAutosaveDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + // results switched for this dialog + if(result==C4JStorage::EMessage_ResultDecline) + { + // Set the global flag, so that we disable saving again once the save is complete + app.SetGameHostOption(eGameHostOption_DisableSaving, 1); + StorageManager.SetSaveDisabled(false); + + // flag a app action of save game + app.SetAction(iPad,eAppAction_SaveGame); + } + return 0; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/IUIScene_PauseMenu.h b/Minecraft.Client/Common/UI/IUIScene_PauseMenu.h new file mode 100644 index 00000000..7233df3a --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_PauseMenu.h @@ -0,0 +1,25 @@ +#pragma once + +class IUIScene_PauseMenu +{ +protected: + DLCPack *m_pDLCPack; + +public: + static int ExitGameDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int ExitGameSaveDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int ExitGameAndSaveReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int ExitGameDeclineSaveReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int WarningTrialTexturePackReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int SaveGameDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int EnableAutosaveDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int DisableAutosaveDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + + static int SaveWorldThreadProc( void* lpParameter ); + static int ExitWorldThreadProc( void* lpParameter ); + static void _ExitWorld(LPVOID lpParameter); // Call only from a thread + +protected: + virtual void ShowScene(bool show) = 0; + virtual void SetIgnoreInput(bool ignoreInput) = 0; +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/IUIScene_StartGame.cpp b/Minecraft.Client/Common/UI/IUIScene_StartGame.cpp new file mode 100644 index 00000000..d3a9e8f0 --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_StartGame.cpp @@ -0,0 +1,379 @@ +#include "stdafx.h" +#include "UI.h" +#include "TexturePack.h" +#include "TexturePackRepository.h" +#include "Minecraft.h" +#include "IUIScene_StartGame.h" + +IUIScene_StartGame::IUIScene_StartGame(int iPad, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + m_bIgnoreInput = false; + m_iTexturePacksNotInstalled=0; + m_texturePackDescDisplayed = false; + m_bShowTexturePackDescription = false; + m_iSetTexturePackDescription = -1; + + Minecraft *pMinecraft = Minecraft::GetInstance(); + m_currentTexturePackIndex = pMinecraft->skins->getTexturePackIndex(0); +} + +void IUIScene_StartGame::HandleDLCMountingComplete() +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + // clear out the current texture pack list + m_texturePackList.clearSlots(); + + int texturePacksCount = pMinecraft->skins->getTexturePackCount(); + + for(unsigned int i = 0; i < texturePacksCount; ++i) + { + TexturePack *tp = pMinecraft->skins->getTexturePackByIndex(i); + + DWORD dwImageBytes; + PBYTE pbImageData = tp->getPackIcon(dwImageBytes); + + if(dwImageBytes > 0 && pbImageData) + { + wchar_t imageName[64]; + swprintf(imageName,64,L"tpack%08x",tp->getId()); + registerSubstitutionTexture(imageName, pbImageData, dwImageBytes); + m_texturePackList.addPack(i,imageName); + } + } + + m_iTexturePacksNotInstalled=0; + + // 4J-PB - there may be texture packs we don't have, so use the info from TMS for this + // REMOVE UNTIL WORKING + DLC_INFO *pDLCInfo=NULL; + + // first pass - look to see if there are any that are not in the list + bool bTexturePackAlreadyListed; + bool bNeedToGetTPD=false; + + for(unsigned int i = 0; i < app.GetDLCInfoTexturesOffersCount(); ++i) + { + bTexturePackAlreadyListed=false; +#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) + char *pchName=app.GetDLCInfoTextures(i); + pDLCInfo=app.GetDLCInfo(pchName); +#elif defined _XBOX_ONE + pDLCInfo=app.GetDLCInfoForFullOfferID((WCHAR *)app.GetDLCInfoTexturesFullOffer(i).c_str()); +#else + ULONGLONG ull=app.GetDLCInfoTexturesFullOffer(i); + pDLCInfo=app.GetDLCInfoForFullOfferID(ull); +#endif + for(unsigned int i = 0; i < texturePacksCount; ++i) + { + TexturePack *tp = pMinecraft->skins->getTexturePackByIndex(i); + if(pDLCInfo->iConfig==tp->getDLCParentPackId()) + { + bTexturePackAlreadyListed=true; + } + } + if(bTexturePackAlreadyListed==false) + { + // some missing + bNeedToGetTPD=true; + + m_iTexturePacksNotInstalled++; + } + } + +#if TO_BE_IMPLEMENTED + if(bNeedToGetTPD==true) + { + // add a TMS request for them + app.DebugPrintf("+++ Adding TMSPP request for texture pack data\n"); + app.AddTMSPPFileTypeRequest(e_DLC_TexturePackData); + if(m_iConfigA!=NULL) + { + delete m_iConfigA; + } + m_iConfigA= new int [m_iTexturePacksNotInstalled]; + m_iTexturePacksNotInstalled=0; + + for(unsigned int i = 0; i < app.GetDLCInfoTexturesOffersCount(); ++i) + { + bTexturePackAlreadyListed=false; + ULONGLONG ull=app.GetDLCInfoTexturesFullOffer(i); + pDLCInfo=app.GetDLCInfoForFullOfferID(ull); + for(unsigned int i = 0; i < texturePacksCount; ++i) + { + TexturePack *tp = pMinecraft->skins->getTexturePackByIndex(i); + if(pDLCInfo->iConfig==tp->getDLCParentPackId()) + { + bTexturePackAlreadyListed=true; + } + } + if(bTexturePackAlreadyListed==false) + { + m_iConfigA[m_iTexturePacksNotInstalled++]=pDLCInfo->iConfig; + } + } + } +#endif + m_currentTexturePackIndex = pMinecraft->skins->getTexturePackIndex(0); + UpdateTexturePackDescription(m_currentTexturePackIndex); + + m_texturePackList.selectSlot(m_currentTexturePackIndex); + m_bIgnoreInput=false; + app.m_dlcManager.checkForCorruptDLCAndAlert(); +} + +void IUIScene_StartGame::handleSelectionChanged(F64 selectedId) +{ + m_iSetTexturePackDescription = (int)selectedId; + + if(!m_texturePackDescDisplayed) + { + m_bShowTexturePackDescription = true; + } +} + +void IUIScene_StartGame::UpdateTexturePackDescription(int index) +{ + TexturePack *tp = Minecraft::GetInstance()->skins->getTexturePackByIndex(index); + + if(tp==NULL) + { +#if TO_BE_IMPLEMENTED + // this is probably a texture pack icon added from TMS + + DWORD dwBytes=0,dwFileBytes=0; + PBYTE pbData=NULL,pbFileData=NULL; + + CXuiCtrl4JList::LIST_ITEM_INFO ListItem; + // get the current index of the list, and then get the data + ListItem=m_pTexturePacksList->GetData(index); + + app.GetTPD(ListItem.iData,&pbData,&dwBytes); + + app.GetFileFromTPD(eTPDFileType_Loc,pbData,dwBytes,&pbFileData,&dwFileBytes ); + if(dwFileBytes > 0 && pbFileData) + { + StringTable *pStringTable = new StringTable(pbFileData, dwFileBytes); + m_texturePackTitle.SetText(pStringTable->getString(L"IDS_DISPLAY_NAME")); + m_texturePackDescription.SetText(pStringTable->getString(L"IDS_TP_DESCRIPTION")); + } + + app.GetFileFromTPD(eTPDFileType_Icon,pbData,dwBytes,&pbFileData,&dwFileBytes ); + if(dwFileBytes >= 0 && pbFileData) + { + XuiCreateTextureBrushFromMemory(pbFileData,dwFileBytes,&m_hTexturePackIconBrush); + m_texturePackIcon->UseBrush(m_hTexturePackIconBrush); + } + app.GetFileFromTPD(eTPDFileType_Comparison,pbData,dwBytes,&pbFileData,&dwFileBytes ); + if(dwFileBytes >= 0 && pbFileData) + { + XuiCreateTextureBrushFromMemory(pbFileData,dwFileBytes,&m_hTexturePackComparisonBrush); + m_texturePackComparison->UseBrush(m_hTexturePackComparisonBrush); + } + else + { + m_texturePackComparison->UseBrush(NULL); + } +#endif + } + else + { + m_labelTexturePackName.setLabel(tp->getName()); + m_labelTexturePackDescription.setLabel(tp->getDesc1()); + + DWORD dwImageBytes; + PBYTE pbImageData = tp->getPackIcon(dwImageBytes); + + //if(dwImageBytes > 0 && pbImageData) + //{ + // registerSubstitutionTexture(L"texturePackIcon", pbImageData, dwImageBytes); + // m_bitmapTexturePackIcon.setTextureName(L"texturePackIcon"); + //} + + wchar_t imageName[64]; + swprintf(imageName,64,L"tpack%08x",tp->getId()); + m_bitmapTexturePackIcon.setTextureName(imageName); + + pbImageData = tp->getPackComparison(dwImageBytes); + + if(dwImageBytes > 0 && pbImageData) + { + swprintf(imageName,64,L"texturePackComparison%08x",tp->getId()); + registerSubstitutionTexture(imageName, pbImageData, dwImageBytes); + m_bitmapComparison.setTextureName(imageName); + } + else + { + m_bitmapComparison.setTextureName(L""); + } + } +} + +void IUIScene_StartGame::UpdateCurrentTexturePack(int iSlot) +{ + m_currentTexturePackIndex = iSlot; + TexturePack *tp = Minecraft::GetInstance()->skins->getTexturePackByIndex(m_currentTexturePackIndex); + + // if the texture pack is null, you don't have it yet + if(tp==NULL) + { +#if TO_BE_IMPLEMENTED + // Upsell + + CXuiCtrl4JList::LIST_ITEM_INFO ListItem; + // get the current index of the list, and then get the data + ListItem=m_pTexturePacksList->GetData(m_currentTexturePackIndex); + + + // upsell the texture pack + // tell sentient about the upsell of the full version of the skin pack + ULONGLONG ullOfferID_Full; + app.GetDLCFullOfferIDForPackID(ListItem.iData,&ullOfferID_Full); + + TelemetryManager->RecordUpsellPresented(ProfileManager.GetPrimaryPad(), eSet_UpsellID_Texture_DLC, ullOfferID_Full & 0xFFFFFFFF); + + UINT uiIDA[3]; + + uiIDA[0]=IDS_TEXTUREPACK_FULLVERSION; + uiIDA[1]=IDS_TEXTURE_PACK_TRIALVERSION; + uiIDA[2]=IDS_CONFIRM_CANCEL; + + + // Give the player a warning about the texture pack missing + ui.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; + return ; +#endif + } + else + { + m_MoreOptionsParams.dwTexturePack = tp->getId(); + } +} + +int IUIScene_StartGame::TrialTexturePackWarningReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + IUIScene_StartGame* pScene = (IUIScene_StartGame*)pParam; + + if(result==C4JStorage::EMessage_ResultAccept) + { + pScene->checkStateAndStartGame(); + } + else + { + pScene->m_bIgnoreInput=false; + } + return 0; +} + +int IUIScene_StartGame::UnlockTexturePackReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + IUIScene_StartGame* pScene = (IUIScene_StartGame*)pParam; + + if(result==C4JStorage::EMessage_ResultAccept) + { + if(ProfileManager.IsSignedIn(iPad)) + { +#if defined _XBOX //|| defined _XBOX_ONE + ULONGLONG ullIndexA[1]; + DLC_INFO *pDLCInfo = app.GetDLCInfoForTrialOfferID(pScene->m_pDLCPack->getPurchaseOfferId()); + + if(pDLCInfo!=NULL) + { + ullIndexA[0]=pDLCInfo->ullOfferID_Full; + } + else + { + ullIndexA[0]=pScene->m_pDLCPack->getPurchaseOfferId(); + } + + + StorageManager.InstallOffer(1,ullIndexA,NULL,NULL); +#elif defined _XBOX_ONE + //StorageManager.InstallOffer(1,StorageManager.GetOffer(iIndex).wszProductID,NULL,NULL); +#endif + + // the license change coming in when the offer has been installed will cause this scene to refresh + } + } + else + { +#if defined _XBOX + TelemetryManager->RecordUpsellResponded(iPad, eSet_UpsellID_Texture_DLC, ( pScene->m_pDLCPack->getPurchaseOfferId() & 0xFFFFFFFF ), eSen_UpsellOutcome_Declined); +#endif + } + + pScene->m_bIgnoreInput = false; + + return 0; +} + +int IUIScene_StartGame::TexturePackDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + IUIScene_StartGame *pClass = (IUIScene_StartGame *)pParam; + + +#ifdef _XBOX + // Exit with or without saving + // Decline means install full version of the texture pack in this dialog + if(result==C4JStorage::EMessage_ResultDecline || result==C4JStorage::EMessage_ResultAccept) + { + // we need to enable background downloading for the DLC + XBackgroundDownloadSetMode(XBACKGROUND_DOWNLOAD_MODE_ALWAYS_ALLOW); + + ULONGLONG ullOfferID_Full; + ULONGLONG ullIndexA[1]; + CXuiCtrl4JList::LIST_ITEM_INFO ListItem; + // get the current index of the list, and then get the data + ListItem=pClass->m_pTexturePacksList->GetData(pClass->m_currentTexturePackIndex); + app.GetDLCFullOfferIDForPackID(ListItem.iData,&ullOfferID_Full); + + if( result==C4JStorage::EMessage_ResultAccept ) // Full version + { + ullIndexA[0]=ullOfferID_Full; + StorageManager.InstallOffer(1,ullIndexA,NULL,NULL); + + } + else // trial version + { + // if there is no trial version, this is a Cancel + DLC_INFO *pDLCInfo=app.GetDLCInfoForFullOfferID(ullOfferID_Full); + if(pDLCInfo->ullOfferID_Trial!=0LL) + { + + ullIndexA[0]=pDLCInfo->ullOfferID_Trial; + StorageManager.InstallOffer(1,ullIndexA,NULL,NULL); + } + } + } +#elif defined _XBOX_ONE + // Get the product id from the texture pack id + if(result==C4JStorage::EMessage_ResultAccept) + { + + if(ProfileManager.IsSignedIn(iPad)) + { + if (ProfileManager.IsSignedInLive(iPad)) + { + wstring ProductId; + app.GetDLCFullOfferIDForPackID(pClass->m_MoreOptionsParams.dwTexturePack,ProductId); + + + StorageManager.InstallOffer(1,(WCHAR *)ProductId.c_str(),NULL,NULL); + + // the license change coming in when the offer has been installed will cause this scene to refresh + } + else + { + // 4J-JEV: Fix for XB1: #165863 - XR-074: Compliance: With no active network connection user is unable to convert from Trial to Full texture pack and is not messaged why. + UINT uiIDA[1] = { IDS_CONFIRM_OK }; + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1, iPad); + } + } + } + +#endif + pClass->m_bIgnoreInput=false; + return 0; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/IUIScene_StartGame.h b/Minecraft.Client/Common/UI/IUIScene_StartGame.h new file mode 100644 index 00000000..a3361011 --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_StartGame.h @@ -0,0 +1,48 @@ +#pragma once + +#include "UIScene.h" + +// Shared functions between CreteWorld, Load and Join +class IUIScene_StartGame : public UIScene +{ +protected: + UIControl_TexturePackList m_texturePackList; + + UIControl m_controlTexturePackPanel; + UIControl_Label m_labelTexturePackName, m_labelTexturePackDescription; + UIControl_BitmapIcon m_bitmapTexturePackIcon, m_bitmapComparison; + + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_controlTexturePackPanel, "TexturePackPanel" ) + UI_BEGIN_MAP_CHILD_ELEMENTS( m_controlTexturePackPanel ) + UI_MAP_ELEMENT( m_labelTexturePackName, "TexturePackName") + UI_MAP_ELEMENT( m_labelTexturePackDescription, "TexturePackDescription") + UI_MAP_ELEMENT( m_bitmapTexturePackIcon, "Icon") + UI_MAP_ELEMENT( m_bitmapComparison, "ComparisonPic") + UI_END_MAP_CHILD_ELEMENTS() + UI_END_MAP_ELEMENTS_AND_NAMES() + + LaunchMoreOptionsMenuInitData m_MoreOptionsParams; + bool m_bIgnoreInput; + + int m_iTexturePacksNotInstalled; + unsigned int m_currentTexturePackIndex; + bool m_bShowTexturePackDescription; + bool m_texturePackDescDisplayed; + int m_iSetTexturePackDescription; + + IUIScene_StartGame(int iPad, UILayer *parentLayer); + + virtual void checkStateAndStartGame() = 0; + + virtual void handleSelectionChanged(F64 selectedId); + + virtual void HandleDLCMountingComplete(); + + void UpdateTexturePackDescription(int index); + void UpdateCurrentTexturePack(int iSlot); + + static int TrialTexturePackWarningReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int UnlockTexturePackReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int TexturePackDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/IUIScene_TradingMenu.cpp b/Minecraft.Client/Common/UI/IUIScene_TradingMenu.cpp new file mode 100644 index 00000000..8cc04940 --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_TradingMenu.cpp @@ -0,0 +1,384 @@ +#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" +#include "..\..\ClientConnection.h" +#include "IUIScene_TradingMenu.h" + +IUIScene_TradingMenu::IUIScene_TradingMenu() +{ + m_validOffersCount = 0; + m_selectedSlot = 0; + m_offersStartIndex = 0; + m_menu = NULL; + m_bHasUpdatedOnce = false; +} + +shared_ptr IUIScene_TradingMenu::getMerchant() +{ + return m_merchant; +} + +bool IUIScene_TradingMenu::handleKeyDown(int iPad, int iAction, bool bRepeat) +{ + bool handled = false; + //MerchantRecipeList *offers = m_merchant->getOffers(Minecraft::GetInstance()->localplayers[getPad()]); + + bool changed = false; + + Minecraft *pMinecraft = Minecraft::GetInstance(); + + if( pMinecraft->localgameModes[getPad()] != NULL ) + { + Tutorial *tutorial = pMinecraft->localgameModes[getPad()]->getTutorial(); + if(tutorial != NULL) + { + tutorial->handleUIInput(iAction); + if(ui.IsTutorialVisible(getPad()) && !tutorial->isInputAllowed(iAction)) + { + return S_OK; + } + } + } + + + switch(iAction) + { + case ACTION_MENU_B: + ui.ShowTooltip( iPad, eToolTipButtonX, false ); + ui.ShowTooltip( iPad, eToolTipButtonB, false ); + ui.ShowTooltip( iPad, eToolTipButtonA, false ); + ui.ShowTooltip( iPad, eToolTipButtonRB, false ); + // kill the crafting xui + //ui.PlayUISFX(eSFX_Back); + ui.CloseUIScenes(iPad); + + handled = true; + break; + case ACTION_MENU_A: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + if(!m_activeOffers.empty()) + { + int selectedShopItem = (m_selectedSlot + m_offersStartIndex); + if( selectedShopItem < m_activeOffers.size() ) + { + MerchantRecipe *activeRecipe = m_activeOffers.at(selectedShopItem).first; + if(!activeRecipe->isDeprecated()) + { + // Do we have the ingredients? + shared_ptr buyAItem = activeRecipe->getBuyAItem(); + shared_ptr buyBItem = activeRecipe->getBuyBItem(); + shared_ptr player = Minecraft::GetInstance()->localplayers[getPad()]; + int buyAMatches = player->inventory->countMatches(buyAItem); + int buyBMatches = player->inventory->countMatches(buyBItem); + if( (buyAItem != NULL && buyAMatches >= buyAItem->count) && (buyBItem == NULL || buyBMatches >= buyBItem->count) ) + { + // 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 + player->inventory->removeResources(buyAItem); + player->inventory->removeResources(buyBItem); + + // Add the item we have purchased + shared_ptr result = activeRecipe->getSellItem()->copy(); + if(!player->inventory->add( result ) ) + { + player->drop(result); + } + + // Send a packet to the server + player->connection->send( shared_ptr( new TradeItemPacket(m_menu->containerId, actualShopItem) ) ); + + updateDisplay(); + } + } + } + } + handled = true; + break; + case ACTION_MENU_LEFT: + handled = true; + if(m_selectedSlot == 0) + { + if(m_offersStartIndex > 0) + { + --m_offersStartIndex; + changed = true; + } + } + else + { + --m_selectedSlot; + changed = true; + moveSelector(false); + } + break; + case ACTION_MENU_RIGHT: + handled = true; + if(m_selectedSlot == (DISPLAY_TRADES_COUNT - 1)) + { + if((m_offersStartIndex + DISPLAY_TRADES_COUNT) < m_activeOffers.size()) + { + ++m_offersStartIndex; + changed = true; + } + } + else + { + ++m_selectedSlot; + changed = true; + moveSelector(true); + } + break; + } + if (changed) + { + updateDisplay(); + + int selectedShopItem = (m_selectedSlot + m_offersStartIndex); + if( selectedShopItem < m_activeOffers.size() ) + { + int actualShopItem = m_activeOffers.at(selectedShopItem).second; + m_menu->setSelectionHint(actualShopItem); + + ByteArrayOutputStream rawOutput; + DataOutputStream output(&rawOutput); + output.writeInt(actualShopItem); + Minecraft::GetInstance()->getConnection(getPad())->send(shared_ptr( new CustomPayloadPacket(CustomPayloadPacket::TRADER_SELECTION_PACKET, rawOutput.toByteArray()))); + } + } + return handled; +} + +void IUIScene_TradingMenu::handleTick() +{ + int offerCount = 0; + MerchantRecipeList *offers = m_merchant->getOffers(Minecraft::GetInstance()->localplayers[getPad()]); + if (offers != NULL) + { + offerCount = offers->size(); + + if(!m_bHasUpdatedOnce) + { + updateDisplay(); + } + } + + showScrollRightArrow( (m_offersStartIndex + DISPLAY_TRADES_COUNT) < m_activeOffers.size()); + showScrollLeftArrow(m_offersStartIndex > 0); +} + +void IUIScene_TradingMenu::updateDisplay() +{ + int iA = -1; + + MerchantRecipeList *unfilteredOffers = m_merchant->getOffers(Minecraft::GetInstance()->localplayers[getPad()]); + if (unfilteredOffers != NULL) + { + m_activeOffers.clear(); + int unfilteredIndex = 0; + int firstValidTrade = INT_MAX; + for(AUTO_VAR(it, unfilteredOffers->begin()); it != unfilteredOffers->end(); ++it) + { + MerchantRecipe *recipe = *it; + if(!recipe->isDeprecated()) + { + m_activeOffers.push_back( pair(recipe,unfilteredIndex)); + firstValidTrade = min(firstValidTrade,unfilteredIndex); + } + ++unfilteredIndex; + } + + if(!m_bHasUpdatedOnce) + { + if(firstValidTrade != 0 && firstValidTrade < unfilteredOffers->size()) + { + m_menu->setSelectionHint(firstValidTrade); + + ByteArrayOutputStream rawOutput; + DataOutputStream output(&rawOutput); + output.writeInt(firstValidTrade); + Minecraft::GetInstance()->getConnection(getPad())->send(shared_ptr( new CustomPayloadPacket(CustomPayloadPacket::TRADER_SELECTION_PACKET, rawOutput.toByteArray()))); + } + } + + if( (m_offersStartIndex + DISPLAY_TRADES_COUNT) > m_activeOffers.size()) + { + m_offersStartIndex = m_activeOffers.size() - DISPLAY_TRADES_COUNT; + if(m_offersStartIndex < 0) m_offersStartIndex = 0; + } + + for(unsigned int i = 0; i < DISPLAY_TRADES_COUNT; ++i) + { + int offerIndex = i + m_offersStartIndex; + bool showRedBox = false; + if(offerIndex < m_activeOffers.size()) + { + showRedBox = !canMake(m_activeOffers.at(offerIndex).first); + setTradeItem(i, m_activeOffers.at(offerIndex).first->getSellItem() ); + } + else + { + setTradeItem(i, nullptr); + } + setTradeRedBox( i, showRedBox); + } + + int selectedShopItem = (m_selectedSlot + m_offersStartIndex); + if( selectedShopItem < m_activeOffers.size() ) + { + MerchantRecipe *activeRecipe = m_activeOffers.at(selectedShopItem).first; + + wstring wsTemp; + + // 4J-PB - need to get the villager type here + wsTemp = app.GetString(IDS_VILLAGER_OFFERS_ITEM); + wsTemp = replaceAll(wsTemp,L"{*VILLAGER_TYPE*}",m_merchant->getDisplayName()); + int iPos=wsTemp.find(L"%s"); + wsTemp.replace(iPos,2,activeRecipe->getSellItem()->getHoverName()); + + setTitle(wsTemp.c_str()); + + vector *offerDescription = GetItemDescription(activeRecipe->getSellItem()); + setOfferDescription(offerDescription); + + shared_ptr buyAItem = activeRecipe->getBuyAItem(); + shared_ptr buyBItem = activeRecipe->getBuyBItem(); + + setRequest1Item(buyAItem); + setRequest2Item(buyBItem); + + if(buyAItem != NULL) setRequest1Name(buyAItem->getHoverName()); + else setRequest1Name(L""); + + if(buyBItem != NULL) setRequest2Name(buyBItem->getHoverName()); + else setRequest2Name(L""); + + bool canMake = true; + + shared_ptr player = Minecraft::GetInstance()->localplayers[getPad()]; + int buyAMatches = player->inventory->countMatches(buyAItem); + if(buyAMatches > 0) + { + setRequest1RedBox(buyAMatches < buyAItem->count); + canMake = buyAMatches > buyAItem->count; + } + else + { + setRequest1RedBox(true); + canMake = false; + } + + int buyBMatches = player->inventory->countMatches(buyBItem); + if(buyBMatches > 0) + { + setRequest2RedBox(buyBMatches < buyBItem->count); + canMake = canMake && buyBMatches > buyBItem->count; + } + else + { + if(buyBItem!=NULL) + { + setRequest2RedBox(true); + canMake = false; + } + else + { + setRequest2RedBox(buyBItem != NULL); + canMake = canMake && buyBItem == NULL; + } + } + + if(canMake) iA = IDS_TOOLTIPS_TRADE; + } + else + { + setTitle(m_merchant->getDisplayName()); + setRequest1Name(L""); + setRequest2Name(L""); + setRequest1RedBox(false); + setRequest2RedBox(false); + setRequest1Item(nullptr); + setRequest2Item(nullptr); + vector offerDescription; + setOfferDescription(&offerDescription); + } + + m_bHasUpdatedOnce = true; + } + + ui.SetTooltips(getPad(), iA, IDS_TOOLTIPS_EXIT); +} + +bool IUIScene_TradingMenu::canMake(MerchantRecipe *recipe) +{ + bool canMake = false; + if (recipe != NULL) + { + if(recipe->isDeprecated()) return false; + + shared_ptr buyAItem = recipe->getBuyAItem(); + shared_ptr buyBItem = recipe->getBuyBItem(); + + shared_ptr player = Minecraft::GetInstance()->localplayers[getPad()]; + int buyAMatches = player->inventory->countMatches(buyAItem); + if(buyAMatches > 0) + { + canMake = buyAMatches >= buyAItem->count; + } + else + { + canMake = buyAItem == NULL; + } + + int buyBMatches = player->inventory->countMatches(buyBItem); + if(buyBMatches > 0) + { + canMake = canMake && buyBMatches >= buyBItem->count; + } + else + { + canMake = canMake && buyBItem == NULL; + } + } + return canMake; +} + + +void IUIScene_TradingMenu::setRequest1Item(shared_ptr item) +{ +} + +void IUIScene_TradingMenu::setRequest2Item(shared_ptr item) +{ +} + +void IUIScene_TradingMenu::setTradeItem(int index, shared_ptr item) +{ +} + +vector *IUIScene_TradingMenu::GetItemDescription(shared_ptr item) +{ + vector *lines = item->getHoverText(nullptr, false); + + // Add rarity to first line + if (lines->size() > 0) + { + lines->at(0).color = item->getRarity()->color; + } + + 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 new file mode 100644 index 00000000..726f13c7 --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_TradingMenu.h @@ -0,0 +1,61 @@ +#pragma once +#include "..\Minecraft.World\MerchantMenu.h" + +class MerchantRecipe; + +class IUIScene_TradingMenu +{ +protected: + MerchantMenu *m_menu; + shared_ptr m_merchant; + vector< pair > m_activeOffers; + + int m_validOffersCount; + int m_selectedSlot; + int m_offersStartIndex; + bool m_bHasUpdatedOnce; + + eTutorial_State m_previousTutorialState; + + static const int DISPLAY_TRADES_COUNT = 7; + + static const int BUY_A = MerchantMenu::USE_ROW_SLOT_END; + static const int BUY_B = BUY_A + 1; + static const int TRADES_START = BUY_B + 1; + +protected: + IUIScene_TradingMenu(); + + bool handleKeyDown(int iPad, int iAction, bool bRepeat); + void handleTick(); + + virtual void showScrollRightArrow(bool show) = 0; + virtual void showScrollLeftArrow(bool show) = 0; + virtual void moveSelector(bool right) = 0; + virtual void setRequest1Name(const wstring &name) = 0; + virtual void setRequest2Name(const wstring &name) = 0; + virtual void setTitle(const wstring &name) = 0; + + virtual void setRequest1RedBox(bool show) = 0; + virtual void setRequest2RedBox(bool show) = 0; + virtual void setTradeRedBox(int index, bool show) = 0; + + virtual void setOfferDescription(vector *description) = 0; + + virtual void setRequest1Item(shared_ptr item); + virtual void setRequest2Item(shared_ptr item); + virtual void setTradeItem(int index, shared_ptr item); + + void updateDisplay(); + void HandleInventoryUpdated(); + +private: + bool canMake(MerchantRecipe *recipe); + + vector *GetItemDescription(shared_ptr item); + +public: + shared_ptr getMerchant(); + + virtual int getPad() = 0; +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UI.h b/Minecraft.Client/Common/UI/UI.h new file mode 100644 index 00000000..428b3b90 --- /dev/null +++ b/Minecraft.Client/Common/UI/UI.h @@ -0,0 +1,126 @@ +#pragma once + +#include "UIEnums.h" +#include "UIStructs.h" + +#include "UIBitmapFont.h" +#include "UITTFFont.h" + +#include "UIScene.h" +#include "UILayer.h" +#include "UIGroup.h" +#include "UIController.h" + +#include "UIControl.h" +#include "UIControl_Base.h" +#include "UIControl_Button.h" +#include "UIControl_CheckBox.h" +#include "UIControl_Slider.h" +#include "UIControl_Label.h" +#include "UIControl_TextInput.h" +#include "UIControl_SlotList.h" +#include "UIControl_Cursor.h" +#include "UIControl_ButtonList.h" +#include "UIControl_Progress.h" +#include "UIControl_TexturePackList.h" +#include "UIControl_LeaderboardList.h" +#include "UIControl_SaveList.h" +#include "UIControl_PlayerList.h" +#include "UIControl_BitmapIcon.h" +#include "UIControl_DLCList.h" +#include "UIControl_HTMLLabel.h" +#include "UIControl_DynamicLabel.h" +#include "UIControl_MinecraftPlayer.h" +#include "UIControl_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" +#endif + +#include "UIScene_HUD.h" +#include "UIComponent_Panorama.h" +#include "UIComponent_Logo.h" +#include "UIComponent_Tooltips.h" +#include "UIComponent_TutorialPopup.h" +#include "UIComponent_Chat.h" +#include "UIComponent_PressStartToPlay.h" +#include "UIComponent_MenuBackground.h" + +#include "UIScene_QuadrantSignin.h" +#include "UIScene_MessageBox.h" +#include "UIScene_Timer.h" +#include "UIScene_Keyboard.h" + +#include "UIScene_DebugOverlay.h" +#include "UIScene_DebugOptions.h" +#include "UIComponent_DebugUIConsole.h" +#include "UIComponent_DebugUIMarketingGuide.h" +#include "UIScene_DebugSetCamera.h" +#include "UIScene_DebugCreateSchematic.h" + +#include "UIScene_TrialExitUpsell.h" +#include "UIScene_Intro.h" +#include "UIScene_SaveMessage.h" +#include "UIScene_MainMenu.h" +#include "UIScene_LoadMenu.h" +#include "UIScene_JoinMenu.h" +#include "UIScene_LoadOrJoinMenu.h" +#include "UIScene_CreateWorldMenu.h" +#include "UIScene_LaunchMoreOptionsMenu.h" +#include "UIScene_FullscreenProgress.h" +#include "UIScene_LeaderboardsMenu.h" +#include "UIScene_DLCMainMenu.h" +#include "UIScene_DLCOffersMenu.h" +#include "UIScene_ReinstallMenu.h" + +#include "UIScene_HelpAndOptionsMenu.h" +#include "UIScene_SettingsMenu.h" +#include "UIScene_SettingsOptionsMenu.h" +#include "UIScene_SettingsAudioMenu.h" +#include "UIScene_SettingsControlMenu.h" +#include "UIScene_SettingsGraphicsMenu.h" +#include "UIScene_SettingsUIMenu.h" +#include "UIScene_SkinSelectMenu.h" +#include "UIScene_HowToPlayMenu.h" +#include "UIScene_LanguageSelector.h" +#include "UIScene_HowToPlay.h" +#include "UIScene_ControlsMenu.h" +#include "UIScene_Credits.h" + +#include "UIScene_PauseMenu.h" + +#include "UIScene_AbstractContainerMenu.h" +#include "UIScene_BrewingStandMenu.h" +#include "UIScene_ContainerMenu.h" +#include "UIScene_DispenserMenu.h" +#include "UIScene_EnchantingMenu.h" +#include "UIScene_InventoryMenu.h" +#include "UIScene_FurnaceMenu.h" +#include "UIScene_CreativeMenu.h" +#include "UIScene_TradingMenu.h" +#include "UIScene_AnvilMenu.h" +#include "UIScene_HorseInventoryMenu.h" +#include "UIScene_HopperMenu.h" +#include "UIScene_BeaconMenu.h" +#include "UIScene_FireworksMenu.h" + +#include "UIScene_CraftingMenu.h" +#include "UIScene_SignEntryMenu.h" + +#include "UIScene_ConnectingProgress.h" +#include "UIScene_DeathMenu.h" +#include "UIScene_InGameInfoMenu.h" +#include "UIScene_InGameHostOptionsMenu.h" +#include "UIScene_InGamePlayerOptionsMenu.h" +#if defined(_XBOX_ONE) || defined(__ORBIS__) +#include "UIScene_InGameSaveManagementMenu.h" +#endif +#include "UIScene_TeleportMenu.h" +#include "UIScene_EndPoem.h" +#include "UIScene_EULA.h" +#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 new file mode 100644 index 00000000..afc2b139 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIBitmapFont.cpp @@ -0,0 +1,364 @@ +#include "stdafx.h" + +#include "BufferedImage.h" +#include "UIFontData.h" + +#include + +#include "UIBitmapFont.h" + + +///////////////////////////// +// UI Abstract Bitmap Font // +///////////////////////////// + +UIAbstractBitmapFont::~UIAbstractBitmapFont() +{ + if (m_registered) IggyFontRemoveUTF8( m_fontname.c_str(),-1,IGGY_FONTFLAG_none ); + delete m_bitmapFontProvider; +} + + +UIAbstractBitmapFont::UIAbstractBitmapFont(const string &fontname) +{ + m_fontname = fontname; + + m_registered = false; + + m_bitmapFontProvider = new IggyBitmapFontProvider(); + m_bitmapFontProvider->get_font_metrics = &UIAbstractBitmapFont::GetFontMetrics_Callback; + m_bitmapFontProvider->get_glyph_for_codepoint = &UIAbstractBitmapFont::GetCodepointGlyph_Callback; + m_bitmapFontProvider->get_glyph_metrics = &UIAbstractBitmapFont::GetGlyphMetrics_Callback; + m_bitmapFontProvider->is_empty = &UIAbstractBitmapFont::IsGlyphEmpty_Callback; + m_bitmapFontProvider->get_kerning = &UIAbstractBitmapFont::GetKerningForGlyphPair_Callback; + m_bitmapFontProvider->can_bitmap = &UIAbstractBitmapFont::CanProvideBitmap_Callback; + m_bitmapFontProvider->get_bitmap = &UIAbstractBitmapFont::GetGlyphBitmap_Callback; + m_bitmapFontProvider->free_bitmap = &UIAbstractBitmapFont::FreeGlyphBitmap_Callback; + m_bitmapFontProvider->userdata = this; +} + +void UIAbstractBitmapFont::registerFont() +{ + if (!m_registered) + { + // 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; + } + + // 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) +{ + return ((UIAbstractBitmapFont *) user_context)->GetFontMetrics(metrics); +} + +S32 RADLINK UIAbstractBitmapFont::GetCodepointGlyph_Callback(void *user_context,U32 codepoint) +{ + return ((UIAbstractBitmapFont *) user_context)->GetCodepointGlyph(codepoint); +} + +IggyGlyphMetrics * RADLINK UIAbstractBitmapFont::GetGlyphMetrics_Callback(void *user_context,S32 glyph,IggyGlyphMetrics *metrics) +{ + return ((UIAbstractBitmapFont *) user_context)->GetGlyphMetrics(glyph,metrics); +} + +rrbool RADLINK UIAbstractBitmapFont::IsGlyphEmpty_Callback(void *user_context,S32 glyph) +{ + return ((UIAbstractBitmapFont *) user_context)->IsGlyphEmpty(glyph); +} + +F32 RADLINK UIAbstractBitmapFont::GetKerningForGlyphPair_Callback(void *user_context,S32 first_glyph,S32 second_glyph) +{ + return ((UIAbstractBitmapFont *) user_context)->GetKerningForGlyphPair(first_glyph,second_glyph); +} + +rrbool RADLINK UIAbstractBitmapFont::CanProvideBitmap_Callback(void *user_context,S32 glyph,F32 pixel_scale) +{ + return ((UIAbstractBitmapFont *) user_context)->CanProvideBitmap(glyph,pixel_scale); +} + +rrbool RADLINK UIAbstractBitmapFont::GetGlyphBitmap_Callback(void *user_context,S32 glyph,F32 pixel_scale,IggyBitmapCharacter *bitmap) +{ + return ((UIAbstractBitmapFont *) user_context)->GetGlyphBitmap(glyph,pixel_scale,bitmap); +} + +void RADLINK UIAbstractBitmapFont::FreeGlyphBitmap_Callback(void *user_context,S32 glyph,F32 pixel_scale,IggyBitmapCharacter *bitmap) +{ + return ((UIAbstractBitmapFont *) user_context)->FreeGlyphBitmap(glyph,pixel_scale,bitmap); +} + +UIBitmapFont::UIBitmapFont( SFontData &sfontdata ) + : UIAbstractBitmapFont( sfontdata.m_strFontName ) +{ + m_numGlyphs = sfontdata.m_uiGlyphCount; + + BufferedImage bimg(sfontdata.m_wstrFilename); + int *bimgData = bimg.getData(); + + m_cFontData = new CFontData(sfontdata, bimgData); + + //delete [] bimgData; +} + +UIBitmapFont::~UIBitmapFont() +{ + m_cFontData->release(); +} + +//Callback function type for returning vertical font metrics +IggyFontMetrics *UIBitmapFont::GetFontMetrics(IggyFontMetrics *metrics) +{ + //Description + // Vertical metrics for a font + //Members + // ascent - extent of characters above baseline (positive) + // descent - extent of characters below baseline (positive) + // line_gap - spacing between one row's descent and the next line's ascent + // average_glyph_width_for_tab_stops - spacing of "average" character for computing default tab stops + // largest_glyph_bbox_y1 - lowest point below baseline of any character in the font + + metrics->ascent = m_cFontData->getFontData()->m_fAscent; + metrics->descent = m_cFontData->getFontData()->m_fDescent; + + metrics->average_glyph_width_for_tab_stops = 8.0f; + + // This is my best guess, there's no reference to a specific glyph here + // so aren't these just exactly the same. + metrics->largest_glyph_bbox_y1 = metrics->descent; + + // metrics->line_gap; // 4J-JEV: Sean said this does nothing. + + return metrics; +} + +//Callback function type for mapping 32-bit unicode code point to internal font glyph number; use IGGY_GLYPH_INVALID to mean "invalid character" +S32 UIBitmapFont::GetCodepointGlyph(U32 codepoint) +{ + // 4J-JEV: Change "right single quotation marks" to apostrophies. + if (codepoint == 0x2019) codepoint = 0x27; + + return m_cFontData->getGlyphId(codepoint); +} + +//Callback function type for returning horizontal metrics for each glyph +IggyGlyphMetrics * UIBitmapFont::GetGlyphMetrics(S32 glyph,IggyGlyphMetrics *metrics) +{ + // 4J-JEV: Information about 'Glyph Metrics'. + // http://freetype.sourceforge.net/freetype2/docs/glyphs/glyphs-3.html - Overview. + // http://en.wikipedia.org/wiki/Kerning#Kerning_values - 'Font Units' + + //Description + // Horizontal metrics for a glyph + //Members + // x0 y0 x1 y1 - bounding box + // advance - horizontal distance to move character origin after drawing this glyph + + + /* 4J-JEV: *IMPORTANT* + * + * I believe these are measured wrt the scale mentioned in GetGlyphBitmap + * i.e. 1.0f == pixel_scale, + * + * However we do not have that information here, then all these values need to be + * the same for every scale in this font. + * + * We have 2 scales of bitmap glyph, and we can only scale these up by powers of 2 + * otherwise the fonts will become blurry. The appropriate glyph is chosen in + * 'GetGlyphBitmap' however we need to set the horizontal sizes here. + */ + + float glyphAdvance = m_cFontData->getAdvance(glyph); + + // 4J-JEV: Anything outside this measurement will be + // cut off if it's at the start or end of the row. + metrics->x0 = 0.0f; + + if ( m_cFontData->glyphIsWhitespace(glyph) ) + metrics->x1 = 0.0f; + else + metrics->x1 = glyphAdvance; + + // The next Glyph just starts right after this one. + metrics->advance = glyphAdvance; + + //app.DebugPrintf("[UIBitmapFont] GetGlyphMetrics:\n\tmetrics->advance == %f,\n", metrics->advance); + + // These don't do anything either. + metrics->y0 = 0.0f; metrics->y1 = 1.0f; + + return metrics; +} + +//Callback function type that should return true iff the glyph has no visible elements +rrbool UIBitmapFont::IsGlyphEmpty (S32 glyph) +{ + if (m_cFontData->glyphIsWhitespace(glyph)) return true; + return false;//app.DebugPrintf("Is glyph %d empty? %s\n",glyph,isEmpty?"TRUE":"FALSE"); +} + +//Callback function type for returning the kerning amount for a given pair of glyphs +F32 UIBitmapFont::GetKerningForGlyphPair(S32 first_glyph,S32 second_glyph) +{ + //UIBitmapFont *uiFont = (UIBitmapFont *) user_context; + //app.DebugPrintf("Get kerning for glyph pair %d,%d\n",first_glyph,second_glyph); + + // 4J-JEV: Yet another field that doesn't do anything. + // Only set out of paranoia. + return 0.0f; +} + +//Callback function type used for reporting whether a bitmap supports a given glyph at the given scale +rrbool UIBitmapFont::CanProvideBitmap(S32 glyph,F32 pixel_scale) +{ + //app.DebugPrintf("Can provide bitmap for glyph %d at scale %f? %s\n",glyph,pixel_scale,canProvideBitmap?"TRUE":"FALSE"); + return true; +} + +// Description +// Callback function type used for getting the bitmap for a given glyph +// Parameters +// glyph The glyph to compute/get the bitmap for +// pixel_scale The scale factor (pseudo point size) requested by the textfield,adjusted for display resolution +// bitmap The structure to store the bitmap into +rrbool UIBitmapFont::GetGlyphBitmap(S32 glyph,F32 pixel_scale,IggyBitmapCharacter *bitmap) +{ + //Description + // Data structure used to return to Iggy the bitmap to use for a glyph + //Members + // pixels_one_per_byte - pixels startin with the top-left-most; 0 is transparent and 255 is opaque + // width_in_pixels - this is the width of the bitmap data + // height_in_pixels - this is the height of the bitmap data + // stride_in_bytes - the distance from one row to the next + // oversample - this is the amount of oversampling (0 or 1 = not oversample,2 = 2x oversampled,4 = 4x oversampled) + // point_sample - if true,the bitmap will be drawn with point sampling; if false,it will be drawn with bilinear + // top_left_x - the offset of the top left corner from the character origin + // top_left_y - the offset of the top left corner from the character origin + // pixel_scale_correct - the pixel_scale at which this character should be displayed at displayed_width_in_pixels + // pixel_scale_min - the smallest pixel_scale to allow using this character (scaled down) + // pixel_scale_max - the largest pixels cale to allow using this character (scaled up) + // user_context_for_free - you can use this to store data to access on the corresponding free call + + int row = 0,col = 0; + m_cFontData->getPos(glyph,row,col); + + // Skip to glyph start. + bitmap->pixels_one_per_byte = m_cFontData->topLeftPixel(row,col); + + // Choose a reasonable glyph scale. + float glyphScale = 1.0f, truePixelScale = 1.0f / m_cFontData->getFontData()->m_fAdvPerPixel; + F32 targetPixelScale = pixel_scale; + //if(!RenderManager.IsWidescreen()) + //{ + // // Fix for different scales in 480 + // targetPixelScale = pixel_scale*2/3; + //} + while ( (0.5f + glyphScale) * truePixelScale < targetPixelScale) + glyphScale++; + + // 4J-JEV: Debug code to check which font sizes are being used. +#if (!defined _CONTENT_PACKAGE) && (VERBOSE_FONT_OUTPUT > 0) + + struct DebugData + { + string name; + long scale; + long mul; + + bool operator==(const DebugData& dd) const + { + if ( name.compare(dd.name) != 0 ) return false; + else if (scale != dd.scale) return false; + else if (mul != dd.mul) return false; + else return true; + } + }; + + static long long lastPrint = System::currentTimeMillis(); + static unordered_set debug_fontSizesRequested; + + { + DebugData dData = { m_cFontData->getFontName(), (long) pixel_scale, (long) glyphScale }; + debug_fontSizesRequested.insert(dData); + + if ( (lastPrint - System::currentTimeMillis()) > VERBOSE_FONT_OUTPUT ) + { + app.DebugPrintf(" Requested font/sizes:\n"); + + unordered_set::iterator itr; + for ( itr = debug_fontSizesRequested.begin(); + itr != debug_fontSizesRequested.end(); + itr++ + ) + { + app.DebugPrintf("\t- %s:%i\t(x%i)\n", itr->name.c_str(), itr->scale, itr->mul); + } + + lastPrint = System::currentTimeMillis(); + debug_fontSizesRequested.clear(); + } + } +#endif + + //app.DebugPrintf("Request glyph_%d (U+%.4X) at %f, converted to %f (%f)\n", + // glyph, GetUnicode(glyph), pixel_scale, targetPixelScale, glyphScale); + + // It is not necessary to shrink the glyph width here + // as its already been done in 'GetGlyphMetrics' by: + // > metrics->x1 = m_kerningTable[glyph] * ratio; + bitmap->width_in_pixels = m_cFontData->getFontData()->m_uiGlyphWidth; + bitmap->height_in_pixels = m_cFontData->getFontData()->m_uiGlyphHeight; + + /* 4J-JEV: This is to do with glyph placement, + * and not the position in the archive. + * I don't know why the 0.65 is needed, or what it represents, + * although it doesn't look like its the baseline. + */ + bitmap->top_left_x = 0; + + // 4J-PB - this was chopping off the top of the characters, so accented ones were losing a couple of pixels at the top + // DaveK has reduced the height of the accented capitalised characters, and we've dropped this from 0.65 to 0.64 + bitmap->top_left_y = -((S32) m_cFontData->getFontData()->m_uiGlyphHeight) * m_cFontData->getFontData()->m_fAscent; + + bitmap->oversample = 0; + bitmap->point_sample = true; + + // 4J-JEV: + // pixel_scale == font size chosen in flash. + // bitmap->pixel_scale_correct = (float) m_glyphHeight; // Scales the glyph to desired size. + // bitmap->pixel_scale_correct = pixel_scale; // Always the same size (not desired size). + // bitmap->pixel_scale_correct = pixel_scale * 0.5; // Doubles original size. + // bitmap->pixel_scale_correct = pixel_scale * 2; // Halves original size. + + // Actual scale, and possible range of scales. + bitmap->pixel_scale_correct = pixel_scale / glyphScale; + bitmap->pixel_scale_max = 99.0f; + bitmap->pixel_scale_min = 0.0f; + + /* 4J-JEV: Some of Sean's code. + int glyphScaleMin = 1; + int glyphScaleMax = 3; + float actualScale = pixel_scale / glyphScale; + bitmap->pixel_scale_correct = actualScale; + bitmap->pixel_scale_min = actualScale * glyphScaleMin * 0.999f; + bitmap->pixel_scale_max = actualScale * glyphScaleMax * 1.001f; */ + + // 4J-JEV: Nothing to do with glyph placement, + // entirely to do with cropping your glyph out of an archive. + bitmap->stride_in_bytes = m_cFontData->getFontData()->m_uiGlyphMapX; + + // 4J-JEV: Additional information needed to release memory afterwards. + bitmap->user_context_for_free = NULL; + + return true; +} + +//Callback function type for freeing a bitmap shape returned by GetGlyphBitmap +void UIBitmapFont::FreeGlyphBitmap(S32 glyph,F32 pixel_scale,IggyBitmapCharacter *bitmap) +{ + // We don't need to free anything,it just comes from the archive. + //app.DebugPrintf("Free bitmap for glyph %d at scale %f\n",glyph,pixel_scale); +} diff --git a/Minecraft.Client/Common/UI/UIBitmapFont.h b/Minecraft.Client/Common/UI/UIBitmapFont.h new file mode 100644 index 00000000..62b708fb --- /dev/null +++ b/Minecraft.Client/Common/UI/UIBitmapFont.h @@ -0,0 +1,75 @@ +#pragma once + +struct SFontData; +class CFontData; + +#define VERBOSE_FONT_OUTPUT 0 + +// const int BITMAP_FONT_LANGUAGES = XC_LANGUAGE_ENGLISH +// | XC_LANGUAGE_GERMAN +// | XC_LANGUAGE_FRENCH +// | XC_LANGUAGE_SPANISH +// | XC_LANGUAGE_ITALIAN +// | XC_LANGUAGE_PORTUGUESE +// | XC_LANGUAGE_BRAZILIAN; + +using namespace std; + +class UIAbstractBitmapFont +{ +protected: + string m_fontname; + + IggyBitmapFontProvider *m_bitmapFontProvider; + + bool m_registered; + + unsigned int m_numGlyphs; + +public: + UIAbstractBitmapFont(const string &fontname); + ~UIAbstractBitmapFont(); + + void registerFont(); + + // Virtual Functions. + virtual IggyFontMetrics *GetFontMetrics(IggyFontMetrics *metrics) = 0; + virtual S32 GetCodepointGlyph(U32 codepoint) = 0; + virtual IggyGlyphMetrics *GetGlyphMetrics(S32 glyph, IggyGlyphMetrics *metrics) = 0; + virtual rrbool IsGlyphEmpty(S32 glyph) = 0; + virtual F32 GetKerningForGlyphPair(S32 first_glyph, S32 second_glyph) = 0; + virtual rrbool CanProvideBitmap(S32 glyph, F32 pixel_scale) = 0; + virtual rrbool GetGlyphBitmap(S32 glyph, F32 pixel_scale, IggyBitmapCharacter *bitmap) = 0; + virtual void FreeGlyphBitmap(S32 glyph, F32 pixel_scale, IggyBitmapCharacter *bitmap) = 0; + + // Static Callbacks + // Just wrappers for the virtual functions. + static IggyFontMetrics * RADLINK GetFontMetrics_Callback(void *user_context, IggyFontMetrics *metrics); + static S32 RADLINK GetCodepointGlyph_Callback(void *user_context, U32 codepoint); + static IggyGlyphMetrics * RADLINK GetGlyphMetrics_Callback(void *user_context, S32 glyph, IggyGlyphMetrics *metrics); + static rrbool RADLINK IsGlyphEmpty_Callback(void *user_context, S32 glyph); + static F32 RADLINK GetKerningForGlyphPair_Callback(void *user_context, S32 first_glyph, S32 second_glyph); + static rrbool RADLINK CanProvideBitmap_Callback(void *user_context, S32 glyph, F32 pixel_scale); + static rrbool RADLINK GetGlyphBitmap_Callback(void *user_context, S32 glyph, F32 pixel_scale, IggyBitmapCharacter *bitmap); + static void RADLINK FreeGlyphBitmap_Callback(void *user_context, S32 glyph, F32 pixel_scale, IggyBitmapCharacter *bitmap); +}; + +class UIBitmapFont : public UIAbstractBitmapFont +{ +protected: + CFontData *m_cFontData; + +public: + UIBitmapFont(SFontData &sfontdata); + + ~UIBitmapFont(); + + virtual IggyFontMetrics * GetFontMetrics(IggyFontMetrics *metrics); + virtual S32 GetCodepointGlyph(U32 codepoint); + virtual IggyGlyphMetrics * GetGlyphMetrics(S32 glyph, IggyGlyphMetrics *metrics); + virtual rrbool IsGlyphEmpty(S32 glyph); + virtual F32 GetKerningForGlyphPair(S32 first_glyph, S32 second_glyph); + virtual rrbool CanProvideBitmap(S32 glyph, F32 pixel_scale); + virtual rrbool GetGlyphBitmap(S32 glyph, F32 pixel_scale, IggyBitmapCharacter *bitmap); + virtual void FreeGlyphBitmap(S32 glyph, F32 pixel_scale, IggyBitmapCharacter *bitmap); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIComponent_Chat.cpp b/Minecraft.Client/Common/UI/UIComponent_Chat.cpp new file mode 100644 index 00000000..98b4f165 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIComponent_Chat.cpp @@ -0,0 +1,157 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIComponent_Chat.h" +#include "..\..\Minecraft.h" +#include "..\..\Gui.h" + +UIComponent_Chat::UIComponent_Chat(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + for(unsigned int i = 0; i < CHAT_LINES_COUNT; ++i) + { + m_labelChatText[i].init(L""); + } + m_labelJukebox.init(L""); + + addTimer(0, 100); +} + +wstring UIComponent_Chat::getMoviePath() +{ + switch( m_parentLayer->getViewport() ) + { + case C4JRender::VIEWPORT_TYPE_SPLIT_TOP: + case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: + case C4JRender::VIEWPORT_TYPE_SPLIT_LEFT: + case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_LEFT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT: + m_bSplitscreen = true; + return L"ComponentChatSplit"; + break; + case C4JRender::VIEWPORT_TYPE_FULLSCREEN: + default: + m_bSplitscreen = false; + return L"ComponentChat"; + break; + } +} + +void UIComponent_Chat::handleTimerComplete(int id) +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + + bool anyVisible = false; + if(pMinecraft->localplayers[m_iPad]!= NULL) + { + Gui *pGui = pMinecraft->gui; + //DWORD messagesToDisplay = min( CHAT_LINES_COUNT, pGui->getMessagesCount(m_iPad) ); + for( unsigned int i = 0; i < CHAT_LINES_COUNT; ++i ) + { + float opacity = pGui->getOpacity(m_iPad, i); + if( opacity > 0 ) + { + m_controlLabelBackground[i].setOpacity(opacity); + m_labelChatText[i].setOpacity(opacity); + m_labelChatText[i].setLabel( pGui->getMessage(m_iPad,i) ); + + anyVisible = true; + } + else + { + m_controlLabelBackground[i].setOpacity(0); + m_labelChatText[i].setOpacity(0); + m_labelChatText[i].setLabel(L""); + } + } + if(pGui->getJukeboxOpacity(m_iPad) > 0) anyVisible = true; + m_labelJukebox.setOpacity( pGui->getJukeboxOpacity(m_iPad) ); + m_labelJukebox.setLabel( pGui->getJukeboxMessage(m_iPad) ); + } + else + { + for( unsigned int i = 0; i < CHAT_LINES_COUNT; ++i ) + { + m_controlLabelBackground[i].setOpacity(0); + m_labelChatText[i].setOpacity(0); + m_labelChatText[i].setLabel(L""); + } + m_labelJukebox.setOpacity( 0 ); + } + + setVisible(anyVisible); +} + +void UIComponent_Chat::render(S32 width, S32 height, C4JRender::eViewportType viewport) +{ + if(m_bSplitscreen) + { + S32 xPos = 0; + S32 yPos = 0; + switch( viewport ) + { + case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT: + yPos = (S32)(ui.getScreenHeight() / 2); + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: + xPos = (S32)(ui.getScreenWidth() / 2); + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT: + xPos = (S32)(ui.getScreenWidth() / 2); + yPos = (S32)(ui.getScreenHeight() / 2); + break; + } + ui.setupRenderPosition(xPos, yPos); + + S32 tileXStart = 0; + S32 tileYStart = 0; + S32 tileWidth = width; + S32 tileHeight = height; + + switch( viewport ) + { + case C4JRender::VIEWPORT_TYPE_SPLIT_LEFT: + case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: + tileHeight = (S32)(ui.getScreenHeight()); + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_TOP: + tileWidth = (S32)(ui.getScreenWidth()); + tileYStart = (S32)(m_movieHeight / 2); + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: + tileWidth = (S32)(ui.getScreenWidth()); + tileYStart = (S32)(m_movieHeight / 2); + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_LEFT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT: + tileYStart = (S32)(m_movieHeight / 2); + break; + } + + IggyPlayerSetDisplaySize( getMovie(), m_movieWidth, m_movieHeight ); + + IggyPlayerDrawTilesStart ( getMovie() ); + + m_renderWidth = tileWidth; + m_renderHeight = tileHeight; + IggyPlayerDrawTile ( getMovie() , + tileXStart , + tileYStart , + tileXStart + tileWidth , + tileYStart + tileHeight , + 0 ); + IggyPlayerDrawTilesEnd ( getMovie() ); + } + else + { + UIScene::render(width, height, viewport); + } +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIComponent_Chat.h b/Minecraft.Client/Common/UI/UIComponent_Chat.h new file mode 100644 index 00000000..d18352cc --- /dev/null +++ b/Minecraft.Client/Common/UI/UIComponent_Chat.h @@ -0,0 +1,66 @@ +#pragma once + +#include "UIScene.h" + +#define CHAT_LINES_COUNT 10 + +class UIComponent_Chat : public UIScene +{ +private: + bool m_bSplitscreen; + +protected: + UIControl_Label m_labelChatText[CHAT_LINES_COUNT]; + UIControl_Label m_labelJukebox; + UIControl m_controlLabelBackground[CHAT_LINES_COUNT]; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT(m_labelChatText[0],"Label1") + UI_MAP_ELEMENT(m_labelChatText[1],"Label2") + UI_MAP_ELEMENT(m_labelChatText[2],"Label3") + UI_MAP_ELEMENT(m_labelChatText[3],"Label4") + UI_MAP_ELEMENT(m_labelChatText[4],"Label5") + UI_MAP_ELEMENT(m_labelChatText[5],"Label6") + UI_MAP_ELEMENT(m_labelChatText[6],"Label7") + UI_MAP_ELEMENT(m_labelChatText[7],"Label8") + UI_MAP_ELEMENT(m_labelChatText[8],"Label9") + UI_MAP_ELEMENT(m_labelChatText[9],"Label10") + + UI_MAP_ELEMENT(m_controlLabelBackground[0],"Label1Background") + UI_MAP_ELEMENT(m_controlLabelBackground[1],"Label2Background") + UI_MAP_ELEMENT(m_controlLabelBackground[2],"Label3Background") + UI_MAP_ELEMENT(m_controlLabelBackground[3],"Label4Background") + UI_MAP_ELEMENT(m_controlLabelBackground[4],"Label5Background") + UI_MAP_ELEMENT(m_controlLabelBackground[5],"Label6Background") + UI_MAP_ELEMENT(m_controlLabelBackground[6],"Label7Background") + UI_MAP_ELEMENT(m_controlLabelBackground[7],"Label8Background") + UI_MAP_ELEMENT(m_controlLabelBackground[8],"Label9Background") + UI_MAP_ELEMENT(m_controlLabelBackground[9],"Label10Background") + + UI_MAP_ELEMENT(m_labelJukebox,"Jukebox") + UI_END_MAP_ELEMENTS_AND_NAMES() + +public: + UIComponent_Chat(int iPad, void *initData, UILayer *parentLayer); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + virtual EUIScene getSceneType() { return eUIComponent_Chat;} + + // Returns true if this scene handles input + virtual bool stealsFocus() { return false; } + + // Returns true if this scene has focus for the pad passed in + virtual bool hasFocus(int iPad) { return false; } + + // Returns true if lower scenes in this scenes layer, or in any layer below this scenes layers should be hidden + virtual bool hidesLowerScenes() { return false; } + + // RENDERING + virtual void render(S32 width, S32 height, C4JRender::eViewportType viewport); + +protected: + void handleTimerComplete(int id); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIComponent_DebugUIConsole.cpp b/Minecraft.Client/Common/UI/UIComponent_DebugUIConsole.cpp new file mode 100644 index 00000000..7436d796 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIComponent_DebugUIConsole.cpp @@ -0,0 +1,39 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIComponent_DebugUIConsole.h" + +UIComponent_DebugUIConsole::UIComponent_DebugUIConsole(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + m_bTextChanged = false; +} + +wstring UIComponent_DebugUIConsole::getMoviePath() +{ + return L"DebugUIConsoleComponent"; +} + +void UIComponent_DebugUIConsole::tick() +{ + UIScene::tick(); + if(m_bTextChanged) + { + m_bTextChanged = false; + for(unsigned int i = 0; i < 10 && i < m_textList.size(); ++i) + { + m_labels[i].setLabel(m_textList[i]); + } + } +} + +void UIComponent_DebugUIConsole::addText(const string &text) +{ + if(!text.empty() && text.compare("\n") != 0) + { + if(m_textList.size() >= 10) m_textList.pop_front(); + m_textList.push_back(text); + m_bTextChanged = true; + } +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIComponent_DebugUIConsole.h b/Minecraft.Client/Common/UI/UIComponent_DebugUIConsole.h new file mode 100644 index 00000000..177754f5 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIComponent_DebugUIConsole.h @@ -0,0 +1,49 @@ +#pragma once + +#include "UIScene.h" +#include "UIControl_Label.h" + +class UIComponent_DebugUIConsole : public UIScene +{ +private: + UIControl_Label m_labels[10]; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_labels[0], "consoleLine1") + UI_MAP_ELEMENT( m_labels[1], "consoleLine2") + UI_MAP_ELEMENT( m_labels[2], "consoleLine3") + UI_MAP_ELEMENT( m_labels[3], "consoleLine4") + UI_MAP_ELEMENT( m_labels[4], "consoleLine5") + UI_MAP_ELEMENT( m_labels[5], "consoleLine6") + UI_MAP_ELEMENT( m_labels[6], "consoleLine7") + UI_MAP_ELEMENT( m_labels[7], "consoleLine8") + UI_MAP_ELEMENT( m_labels[8], "consoleLine9") + UI_MAP_ELEMENT( m_labels[9], "consoleLine10") + UI_END_MAP_ELEMENTS_AND_NAMES() + + deque m_textList; + + bool m_bTextChanged; + +public: + UIComponent_DebugUIConsole(int iPad, void *initData, UILayer *parentLayer); + + virtual void tick(); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + virtual EUIScene getSceneType() { return eUIComponent_DebugUIConsole;} + + // Returns true if this scene handles input + virtual bool stealsFocus() { return false; } + + // Returns true if this scene has focus for the pad passed in + virtual bool hasFocus(int iPad) { return false; } + + // Returns true if lower scenes in this scenes layer, or in any layer below this scenes layers should be hidden + virtual bool hidesLowerScenes() { return false; } + + void addText(const string &text); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIComponent_DebugUIMarketingGuide.cpp b/Minecraft.Client/Common/UI/UIComponent_DebugUIMarketingGuide.cpp new file mode 100644 index 00000000..240429bc --- /dev/null +++ b/Minecraft.Client/Common/UI/UIComponent_DebugUIMarketingGuide.cpp @@ -0,0 +1,33 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIComponent_DebugUIMarketingGuide.h" + +UIComponent_DebugUIMarketingGuide::UIComponent_DebugUIMarketingGuide(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = (F64)0; // WIN64 +#if defined _XBOX + value[0].number = (F64)1; +#elif defined _DURANGO + value[0].number = (F64)2; +#elif defined __PS3__ + value[0].number = (F64)3; +#elif defined __ORBIS__ + value[0].number = (F64)4; +#elif defined __PSVITA__ + value[0].number = (F64)5; +#elif defined _WINDOWS64 + value[0].number = (F64)0; +#endif + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetPlatform , 1 , value ); +} + +wstring UIComponent_DebugUIMarketingGuide::getMoviePath() +{ + return L"DebugUIMarketingGuide"; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIComponent_DebugUIMarketingGuide.h b/Minecraft.Client/Common/UI/UIComponent_DebugUIMarketingGuide.h new file mode 100644 index 00000000..2c651173 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIComponent_DebugUIMarketingGuide.h @@ -0,0 +1,34 @@ +#pragma once + +#include "UIScene.h" +#include "UIControl_Label.h" + +class UIComponent_DebugUIMarketingGuide : public UIScene +{ +private: + IggyName m_funcSetPlatform; + + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_NAME( m_funcSetPlatform, L"SetPlatform") + UI_END_MAP_ELEMENTS_AND_NAMES() + + +public: + UIComponent_DebugUIMarketingGuide(int iPad, void *initData, UILayer *parentLayer); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + virtual EUIScene getSceneType() { return eUIComponent_DebugUIMarketingGuide;} + + // Returns true if this scene handles input + virtual bool stealsFocus() { return false; } + + // Returns true if this scene has focus for the pad passed in + virtual bool hasFocus(int iPad) { return false; } + + // Returns true if lower scenes in this scenes layer, or in any layer below this scenes layers should be hidden + virtual bool hidesLowerScenes() { return false; } +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIComponent_Logo.cpp b/Minecraft.Client/Common/UI/UIComponent_Logo.cpp new file mode 100644 index 00000000..2f5c82bd --- /dev/null +++ b/Minecraft.Client/Common/UI/UIComponent_Logo.cpp @@ -0,0 +1,30 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIComponent_Logo.h" + +UIComponent_Logo::UIComponent_Logo(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); +} + +wstring UIComponent_Logo::getMoviePath() +{ + switch( m_parentLayer->getViewport() ) + { + case C4JRender::VIEWPORT_TYPE_SPLIT_TOP: + case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: + case C4JRender::VIEWPORT_TYPE_SPLIT_LEFT: + case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_LEFT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT: + return L"ComponentLogoSplit"; + break; + case C4JRender::VIEWPORT_TYPE_FULLSCREEN: + default: + return L"ComponentLogo"; + break; + } +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIComponent_Logo.h b/Minecraft.Client/Common/UI/UIComponent_Logo.h new file mode 100644 index 00000000..1a8cf819 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIComponent_Logo.h @@ -0,0 +1,25 @@ +#pragma once + +#include "UIScene.h" + +class UIComponent_Logo : public UIScene +{ +public: + UIComponent_Logo(int iPad, void *initData, UILayer *parentLayer); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + virtual EUIScene getSceneType() { return eUIComponent_Logo;} + + // Returns true if this scene handles input + virtual bool stealsFocus() { return false; } + + // Returns true if this scene has focus for the pad passed in + virtual bool hasFocus(int iPad) { return false; } + + // Returns true if lower scenes in this scenes layer, or in any layer below this scenes layers should be hidden + virtual bool hidesLowerScenes() { return false; } +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIComponent_MenuBackground.cpp b/Minecraft.Client/Common/UI/UIComponent_MenuBackground.cpp new file mode 100644 index 00000000..d3a4c4c0 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIComponent_MenuBackground.cpp @@ -0,0 +1,103 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIComponent_MenuBackground.h" + +UIComponent_MenuBackground::UIComponent_MenuBackground(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + m_bSplitscreen = false; + // Setup all the Iggy references we need for this scene + initialiseMovie(); +} + +wstring UIComponent_MenuBackground::getMoviePath() +{ switch( m_parentLayer->getViewport() ) + { + case C4JRender::VIEWPORT_TYPE_SPLIT_TOP: + case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: + case C4JRender::VIEWPORT_TYPE_SPLIT_LEFT: + case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_LEFT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT: + m_bSplitscreen = true; + break; + case C4JRender::VIEWPORT_TYPE_FULLSCREEN: + default: + m_bSplitscreen = false; + break; + } + + // We use the fullscreen one even in splitscreen, just draw different parts of it + return L"MenuBackground"; +} + +void UIComponent_MenuBackground::render(S32 width, S32 height, C4JRender::eViewportType viewport) +{ + if(m_bSplitscreen) + { + S32 xPos = 0; + S32 yPos = 0; + switch( viewport ) + { + case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT: + yPos = (S32)(ui.getScreenHeight() / 2); + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: + xPos = (S32)(ui.getScreenWidth() / 2); + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT: + xPos = (S32)(ui.getScreenWidth() / 2); + yPos = (S32)(ui.getScreenHeight() / 2); + break; + } + ui.setupRenderPosition(xPos, yPos); + + S32 tileXStart = 0; + S32 tileYStart = 0; + S32 tileWidth = width; + S32 tileHeight = height; + + switch( viewport ) + { + case C4JRender::VIEWPORT_TYPE_SPLIT_LEFT: + case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: + tileHeight = (S32)(ui.getScreenHeight()); + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_TOP: + tileWidth = (S32)(ui.getScreenWidth()); + tileYStart = (S32)(m_movieHeight / 2); + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: + tileWidth = (S32)(ui.getScreenWidth()); + tileYStart = (S32)(m_movieHeight / 2); + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_LEFT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT: + tileYStart = (S32)(m_movieHeight / 2); + break; + } + + IggyPlayerSetDisplaySize( getMovie(), m_movieWidth, m_movieHeight ); + + IggyPlayerDrawTilesStart ( getMovie() ); + + m_renderWidth = tileWidth; + m_renderHeight = tileHeight; + IggyPlayerDrawTile ( getMovie() , + tileXStart , + tileYStart , + tileXStart + tileWidth , + tileYStart + tileHeight , + 0 ); + IggyPlayerDrawTilesEnd ( getMovie() ); + } + else + { + UIScene::render(width, height, viewport); + } +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIComponent_MenuBackground.h b/Minecraft.Client/Common/UI/UIComponent_MenuBackground.h new file mode 100644 index 00000000..ac0b9d2f --- /dev/null +++ b/Minecraft.Client/Common/UI/UIComponent_MenuBackground.h @@ -0,0 +1,30 @@ +#pragma once + +#include "UIScene.h" + +class UIComponent_MenuBackground : public UIScene +{ +private: + bool m_bSplitscreen; +public: + UIComponent_MenuBackground(int iPad, void *initData, UILayer *parentLayer); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + virtual EUIScene getSceneType() { return eUIComponent_MenuBackground;} + + // Returns true if this scene handles input + virtual bool stealsFocus() { return false; } + + // Returns true if this scene has focus for the pad passed in + virtual bool hasFocus(int iPad) { return false; } + + // Returns true if lower scenes in this scenes layer, or in any layer below this scenes layers should be hidden + virtual bool hidesLowerScenes() { return false; } + + // RENDERING + virtual void render(S32 width, S32 height, C4JRender::eViewportType viewport); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIComponent_Panorama.cpp b/Minecraft.Client/Common/UI/UIComponent_Panorama.cpp new file mode 100644 index 00000000..cb6443a1 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIComponent_Panorama.cpp @@ -0,0 +1,144 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIComponent_Panorama.h" +#include "Minecraft.h" +#include "MultiPlayerLevel.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.dimension.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.storage.h" + +UIComponent_Panorama::UIComponent_Panorama(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + m_bShowingDay = true; + + while(!m_hasTickedOnce) tick(); +} + +wstring UIComponent_Panorama::getMoviePath() +{ + switch( m_parentLayer->getViewport() ) + { + case C4JRender::VIEWPORT_TYPE_SPLIT_TOP: + case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: + case C4JRender::VIEWPORT_TYPE_SPLIT_LEFT: + case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_LEFT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT: + m_bSplitscreen = true; + return L"PanoramaSplit"; + break; + case C4JRender::VIEWPORT_TYPE_FULLSCREEN: + default: + m_bSplitscreen = false; + return L"Panorama"; + break; + } +} + +void UIComponent_Panorama::tick() +{ + if(!hasMovie()) return; + + Minecraft *pMinecraft = Minecraft::GetInstance(); + EnterCriticalSection(&pMinecraft->m_setLevelCS); + if(pMinecraft->level!=NULL) + { + __int64 i64TimeOfDay =0; + // are we in the Nether? - Leave the time as 0 if we are, so we show daylight + if(pMinecraft->level->dimension->id==0) + { + i64TimeOfDay = pMinecraft->level->getLevelData()->getGameTime() % 24000; + } + + if(i64TimeOfDay>14000) + { + setPanorama(false); + } + else + { + setPanorama(true); + } + } + else + { + setPanorama(true); + } + LeaveCriticalSection(&pMinecraft->m_setLevelCS); + + UIScene::tick(); +} + +void UIComponent_Panorama::render(S32 width, S32 height, C4JRender::eViewportType viewport) +{ + bool specialViewport = (viewport == C4JRender::VIEWPORT_TYPE_SPLIT_TOP) || + (viewport == C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM) || + (viewport == C4JRender::VIEWPORT_TYPE_SPLIT_LEFT) || + (viewport == C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT); + if(m_bSplitscreen && specialViewport) + { + S32 xPos = 0; + S32 yPos = 0; + switch( viewport ) + { + case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: + yPos = (S32)(ui.getScreenHeight() / 2); + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: + xPos = (S32)(ui.getScreenWidth() / 2); + break; + } + ui.setupRenderPosition(xPos, yPos); + + if((viewport == C4JRender::VIEWPORT_TYPE_SPLIT_LEFT) || (viewport == C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT)) + { + // Need to render at full height, but only the left side of the scene + S32 tileXStart = 0; + S32 tileYStart = 0; + S32 tileWidth = width; + S32 tileHeight = (S32)(ui.getScreenHeight()); + + IggyPlayerSetDisplaySize( getMovie(), m_movieWidth, m_movieHeight ); + + IggyPlayerDrawTilesStart ( getMovie() ); + + m_renderWidth = tileWidth; + m_renderHeight = tileHeight; + IggyPlayerDrawTile ( getMovie() , + tileXStart , + tileYStart , + tileXStart + tileWidth , + tileYStart + tileHeight , + 0 ); + IggyPlayerDrawTilesEnd ( getMovie() ); + } + else + { + // Need to render at full height, and full width. But compressed into the viewport + IggyPlayerSetDisplaySize( getMovie(), ui.getScreenWidth(), ui.getScreenHeight()/2 ); + IggyPlayerDraw( getMovie() ); + } + } + else + { + UIScene::render(width, height, viewport); + } +} + +void UIComponent_Panorama::setPanorama(bool isDay) +{ + if(isDay != m_bShowingDay) + { + m_bShowingDay = isDay; + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_boolean; + value[0].boolval = isDay; + + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcShowPanoramaDay , 1 , value ); + } +} diff --git a/Minecraft.Client/Common/UI/UIComponent_Panorama.h b/Minecraft.Client/Common/UI/UIComponent_Panorama.h new file mode 100644 index 00000000..99dc115c --- /dev/null +++ b/Minecraft.Client/Common/UI/UIComponent_Panorama.h @@ -0,0 +1,40 @@ +#pragma once + +#include "UIScene.h" + +class UIComponent_Panorama : public UIScene +{ +private: + bool m_bSplitscreen; + bool m_bShowingDay; + +protected: + IggyName m_funcShowPanoramaDay; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_NAME(m_funcShowPanoramaDay, L"ShowPanoramaDay"); + UI_END_MAP_ELEMENTS_AND_NAMES() + +public: + UIComponent_Panorama(int iPad, void *initData, UILayer *parentLayer); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + virtual EUIScene getSceneType() { return eUIComponent_Panorama;} + + // Returns true if this scene handles input + virtual bool stealsFocus() { return false; } + + // Returns true if this scene has focus for the pad passed in + virtual bool hasFocus(int iPad) { return false; } + + virtual void tick(); + + // RENDERING + virtual void render(S32 width, S32 height, C4JRender::eViewportType viewport); + +private: + void setPanorama(bool isDay); +}; diff --git a/Minecraft.Client/Common/UI/UIComponent_PressStartToPlay.cpp b/Minecraft.Client/Common/UI/UIComponent_PressStartToPlay.cpp new file mode 100644 index 00000000..9af43df4 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIComponent_PressStartToPlay.cpp @@ -0,0 +1,164 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIComponent_PressStartToPlay.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" + +UIComponent_PressStartToPlay::UIComponent_PressStartToPlay(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + m_showingSaveIcon = false; + m_showingAutosaveTimer = false; + m_showingTrialTimer = false; + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + m_showingPressStart[i] = false; + } + m_trialTimer = L""; + m_autosaveTimer = L""; + + m_labelTrialTimer.init(L""); + m_labelTrialTimer.setVisible(false); + + // 4J-JEV: This object is persistent, so this string needs to be able to handle language changes. +#ifdef __ORBIS__ + 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 + 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(IDS_PRESS_START_TO_JOIN); +#endif + + m_controlSaveIcon.setVisible(false); + m_controlPressStartPanel.setVisible(false); + m_playerDisplayName.setVisible(false); +} + +wstring UIComponent_PressStartToPlay::getMoviePath() +{ + return L"PressStartToPlay"; +} + +void UIComponent_PressStartToPlay::handleReload() +{ + // 4J Stu - It's possible these could change during the reload, so can't use the normal controls refresh of it's state + m_controlSaveIcon.setVisible(m_showingSaveIcon); + m_labelTrialTimer.setVisible(m_showingAutosaveTimer); + m_labelTrialTimer.setLabel(m_autosaveTimer); + m_labelTrialTimer.setVisible(m_showingTrialTimer); + m_labelTrialTimer.setLabel(m_trialTimer); + + bool showPressStart = false; + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + bool show = m_showingPressStart[i]; + showPressStart |= show; + + if(show) + { + addTimer(0,3000); + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = i; + + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcShowController , 1 , value ); + } + } + m_controlPressStartPanel.setVisible(showPressStart); +} + +void UIComponent_PressStartToPlay::handleTimerComplete(int id) +{ + m_controlPressStartPanel.setVisible(false); + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + m_showingPressStart[i] = false; + } + ui.ClearPressStart(); +} + +void UIComponent_PressStartToPlay::showPressStart(int iPad, bool show) +{ + m_showingPressStart[iPad] = show; + if(!ui.IsExpectingOrReloadingSkin() && hasMovie()) + { + m_controlPressStartPanel.setVisible(show); + + if(show) + { + addTimer(0,3000); + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = iPad; + + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcShowController , 1 , value ); + } + } +} + +void UIComponent_PressStartToPlay::setTrialTimer(const wstring &label) +{ + m_trialTimer = label; + if(!ui.IsExpectingOrReloadingSkin() && hasMovie()) + { + m_labelTrialTimer.setLabel(label); + } +} + +void UIComponent_PressStartToPlay::showTrialTimer(bool show) +{ + m_showingTrialTimer = show; + if(!ui.IsExpectingOrReloadingSkin() && hasMovie()) + { + m_labelTrialTimer.setVisible(show); + } +} + +void UIComponent_PressStartToPlay::setAutosaveTimer(const wstring &label) +{ + m_autosaveTimer = label; + if(!ui.IsExpectingOrReloadingSkin() && hasMovie()) + { + m_labelTrialTimer.setLabel(label); + } +} + +void UIComponent_PressStartToPlay::showAutosaveTimer(bool show) +{ + m_showingAutosaveTimer = show; + if(!ui.IsExpectingOrReloadingSkin() && hasMovie()) + { + m_labelTrialTimer.setVisible(show); + } +} + +void UIComponent_PressStartToPlay::showSaveIcon(bool show) +{ + m_showingSaveIcon = show; + if(!ui.IsExpectingOrReloadingSkin() && hasMovie()) + { + m_controlSaveIcon.setVisible(show); + } + else + { + if(show) app.DebugPrintf("Tried to show save icon while texture pack reload was in progress\n"); + } +} + +void UIComponent_PressStartToPlay::showPlayerDisplayName(bool show) +{ +#ifdef _XBOX_ONE + if(show) + { + m_playerDisplayName.setLabel(ProfileManager.GetDisplayName(ProfileManager.GetPrimaryPad())); + } + m_playerDisplayName.setVisible(show); +#else + m_playerDisplayName.setVisible(false); +#endif +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIComponent_PressStartToPlay.h b/Minecraft.Client/Common/UI/UIComponent_PressStartToPlay.h new file mode 100644 index 00000000..a29b6016 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIComponent_PressStartToPlay.h @@ -0,0 +1,60 @@ +#pragma once + +#include "UIScene.h" + +class UIComponent_PressStartToPlay : public UIScene +{ +private: + bool m_showingSaveIcon; + bool m_showingAutosaveTimer; + bool m_showingTrialTimer; + bool m_showingPressStart[XUSER_MAX_COUNT]; + wstring m_trialTimer; + wstring m_autosaveTimer; + +protected: + UIControl_Label m_labelTrialTimer, m_labelPressStart, m_playerDisplayName; + UIControl m_controlSaveIcon, m_controlPressStartPanel; + IggyName m_funcShowController; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT(m_labelTrialTimer, "TrialTimer") + UI_MAP_ELEMENT(m_controlSaveIcon, "SaveIcon") + UI_MAP_ELEMENT(m_playerDisplayName, "PlayerName") + UI_MAP_ELEMENT(m_controlPressStartPanel, "MainPanel") + UI_BEGIN_MAP_CHILD_ELEMENTS(m_controlPressStartPanel) + UI_MAP_ELEMENT(m_labelPressStart, "PressStartLabel" ) + UI_END_MAP_CHILD_ELEMENTS() + + UI_MAP_NAME(m_funcShowController, L"ShowController"); + UI_END_MAP_ELEMENTS_AND_NAMES() + +public: + UIComponent_PressStartToPlay(int iPad, void *initData, UILayer *parentLayer); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + virtual EUIScene getSceneType() { return eUIComponent_PressStartToPlay;} + + // Returns true if this scene handles input + virtual bool stealsFocus() { return false; } + + // Returns true if this scene has focus for the pad passed in + virtual bool hasFocus(int iPad) { return false; } + + // Returns true if lower scenes in this scenes layer, or in any layer below this scenes layers should be hidden + virtual bool hidesLowerScenes() { return false; } + + virtual void handleReload(); + virtual void handleTimerComplete(int id); + + void showPressStart(int iPad, bool show); + void setTrialTimer(const wstring &label); + void showTrialTimer(bool show); + void setAutosaveTimer(const wstring &label); + void showAutosaveTimer(bool show); + void showSaveIcon(bool show); + void showPlayerDisplayName(bool show); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIComponent_Tooltips.cpp b/Minecraft.Client/Common/UI/UIComponent_Tooltips.cpp new file mode 100644 index 00000000..255740c9 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIComponent_Tooltips.cpp @@ -0,0 +1,534 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIComponent_Tooltips.h" + +UIComponent_Tooltips::UIComponent_Tooltips(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + for(int i=0;igetViewport() ) + { + case C4JRender::VIEWPORT_TYPE_SPLIT_TOP: + case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: + case C4JRender::VIEWPORT_TYPE_SPLIT_LEFT: + case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_LEFT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT: + m_bSplitscreen = true; + return L"ToolTipsSplit"; + break; + case C4JRender::VIEWPORT_TYPE_FULLSCREEN: + default: + m_bSplitscreen = false; + return L"ToolTips"; + break; + } +} + +F64 UIComponent_Tooltips::getSafeZoneHalfWidth() +{ + float width = ui.getScreenWidth(); + + float safeWidth = 0.0f; + +#ifndef __PSVITA__ + // 85% safezone for tooltips in either SD mode + if( !RenderManager.IsHiDef() ) + { + // 85% safezone + safeWidth = m_movieWidth * (0.15f / 2); + } + else + { + // 90% safezone + safeWidth = width * (0.1f / 2); + } +#endif + return safeWidth; +} + +void UIComponent_Tooltips::updateSafeZone() +{ + // Distance from edge + F64 safeTop = 0.0; + F64 safeBottom = 0.0; + F64 safeLeft = 0.0; + F64 safeRight = 0.0; + + switch( m_parentLayer->getViewport() ) + { + case C4JRender::VIEWPORT_TYPE_SPLIT_TOP: + safeTop = getSafeZoneHalfHeight(); + safeLeft = getSafeZoneHalfWidth(); + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: + safeBottom = getSafeZoneHalfHeight(); + safeLeft = getSafeZoneHalfWidth(); + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_LEFT: + safeLeft = getSafeZoneHalfWidth(); + safeBottom = getSafeZoneHalfHeight(); + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: + safeRight = getSafeZoneHalfWidth(); + safeBottom = getSafeZoneHalfHeight(); + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_LEFT: + safeTop = getSafeZoneHalfHeight(); + safeLeft = getSafeZoneHalfWidth(); + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: + safeTop = getSafeZoneHalfHeight(); + safeRight = getSafeZoneHalfWidth(); + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT: + safeBottom = getSafeZoneHalfHeight(); + safeLeft = getSafeZoneHalfWidth(); + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT: + safeBottom = getSafeZoneHalfHeight(); + safeRight = getSafeZoneHalfWidth(); + break; + case C4JRender::VIEWPORT_TYPE_FULLSCREEN: + default: + safeTop = getSafeZoneHalfHeight(); + safeBottom = getSafeZoneHalfHeight(); + safeLeft = getSafeZoneHalfWidth(); + safeRight = getSafeZoneHalfWidth(); + break; + } + setSafeZone(safeTop, safeBottom, safeLeft, safeRight); +} + +void UIComponent_Tooltips::tick() +{ + UIScene::tick(); + + // set the opacity of the tooltip items + unsigned char ucAlpha=app.GetGameSettings(ProfileManager.GetPrimaryPad(),eGameSetting_InterfaceOpacity); + float fVal; + + if(ucAlpha<80) + { + // if we are in a menu, set the minimum opacity for tooltips to 15% + if(ui.GetMenuDisplayed(m_iPad) && (ucAlpha<15)) + { + ucAlpha=15; + } + + // check if we have the timer running for the opacity + unsigned int uiOpacityTimer=app.GetOpacityTimer(m_iPad); + if(uiOpacityTimer!=0) + { + if(uiOpacityTimer<10) + { + float fStep=(80.0f-(float)ucAlpha)/10.0f; + fVal=0.01f*(80.0f-((10.0f-(float)uiOpacityTimer)*fStep)); + } + else + { + fVal=0.01f*80.0f; + } + } + else + { + fVal=0.01f*(float)ucAlpha; + } + } + else + { + // if we are in a menu, set the minimum opacity for tooltips to 15% + if(ui.GetMenuDisplayed(m_iPad) && (ucAlpha<15)) + { + ucAlpha=15; + } + fVal=0.01f*(float)ucAlpha; + } + setOpacity(fVal); + + 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) +{ + if((ProfileManager.GetLockedProfile()!=-1) && !ui.GetMenuDisplayed(m_iPad) && (app.GetGameSettings(m_iPad,eGameSetting_Tooltips)==0 || app.GetGameSettings(m_iPad,eGameSetting_DisplayHUD)==0)) + { + return; + } + + if(m_bSplitscreen) + { + S32 xPos = 0; + S32 yPos = 0; + switch( viewport ) + { + case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT: + yPos = (S32)(ui.getScreenHeight() / 2); + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: + xPos = (S32)(ui.getScreenWidth() / 2); + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT: + xPos = (S32)(ui.getScreenWidth() / 2); + yPos = (S32)(ui.getScreenHeight() / 2); + break; + } + ui.setupRenderPosition(xPos, yPos); + + S32 tileXStart = 0; + S32 tileYStart = 0; + S32 tileWidth = width; + S32 tileHeight = height; + + switch( viewport ) + { + case C4JRender::VIEWPORT_TYPE_SPLIT_LEFT: + case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: + tileHeight = (S32)(ui.getScreenHeight()); + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_TOP: + tileWidth = (S32)(ui.getScreenWidth()); + tileYStart = (S32)(m_movieHeight / 2); + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: + tileWidth = (S32)(ui.getScreenWidth()); + tileYStart = (S32)(m_movieHeight / 2); + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_LEFT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT: + tileYStart = (S32)(m_movieHeight / 2); + break; + } + + IggyPlayerSetDisplaySize( getMovie(), m_movieWidth, m_movieHeight ); + + IggyPlayerDrawTilesStart ( getMovie() ); + + m_renderWidth = tileWidth; + m_renderHeight = tileHeight; + IggyPlayerDrawTile ( getMovie() , + tileXStart , + tileYStart , + tileXStart + tileWidth , + tileYStart + tileHeight , + 0 ); + IggyPlayerDrawTilesEnd ( getMovie() ); + } + else + { + UIScene::render(width, height, viewport); + } +} + +void UIComponent_Tooltips::SetTooltipText( unsigned int tooltip, int iTextID ) +{ + if( _SetTooltip(tooltip, iTextID) ) _Relayout(); +} + +void UIComponent_Tooltips::SetEnableTooltips( bool bVal ) +{ +} + +void UIComponent_Tooltips::ShowTooltip( unsigned int tooltip, bool show ) +{ + if(show != m_tooltipValues[tooltip].show) + { + _SetTooltip(tooltip, L"", show); + _Relayout(); + } +} + +void UIComponent_Tooltips::SetTooltips( int iA, int iB, int iX, int iY , int iLT, int iRT, int iLB, int iRB, int iLS, int iRS, int iBack, bool forceUpdate) +{ + bool needsRelayout = false; + needsRelayout = _SetTooltip( eToolTipButtonA, iA ) || needsRelayout; + needsRelayout = _SetTooltip( eToolTipButtonB, iB ) || needsRelayout; + needsRelayout = _SetTooltip( eToolTipButtonX, iX ) || needsRelayout; + needsRelayout = _SetTooltip( eToolTipButtonY, iY ) || needsRelayout; + needsRelayout = _SetTooltip( eToolTipButtonLT, iLT ) || needsRelayout; + needsRelayout = _SetTooltip( eToolTipButtonRT, iRT ) || needsRelayout; + needsRelayout = _SetTooltip( eToolTipButtonLB, iLB ) || needsRelayout; + needsRelayout = _SetTooltip( eToolTipButtonRB, iRB ) || needsRelayout; + needsRelayout = _SetTooltip( eToolTipButtonLS, iLS ) || needsRelayout; + 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 ) +{ +} + +bool UIComponent_Tooltips::_SetTooltip(unsigned int iToolTip, int iTextID) +{ + bool changed = false; + if(iTextID != m_tooltipValues[iToolTip].iString || (iTextID > -1 && !m_tooltipValues[iToolTip].show)) + { + m_tooltipValues[iToolTip].iString = iTextID; + changed = true; + if(iTextID > -1) _SetTooltip(iToolTip, iTextID, true); + else if(iTextID == -2) _SetTooltip(iToolTip, L"", true); + else _SetTooltip(iToolTip, L"", false); + } + return changed; +} + +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]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = iToolTipId; + + value[1].type = IGGY_DATATYPE_string_UTF16; + IggyStringUTF16 stringVal; + + stringVal.string = (IggyUTF16*)label.c_str(); + stringVal.length = label.length(); + value[1].string16 = stringVal; + + value[2].type = IGGY_DATATYPE_boolean; + value[2].boolval = show; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetTooltip , 3 , value ); + + //app.DebugPrintf("Actual tooltip update!\n"); +} + +void UIComponent_Tooltips::_Relayout() +{ + IggyDataValue result; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcUpdateLayout, 0 , NULL ); + +#ifdef __PSVITA__ + // rebuild touchboxes + ui.TouchBoxRebuild(this); +#endif +} + +#ifdef __PSVITA__ +void UIComponent_Tooltips::handleTouchInput(unsigned int iPad, S32 x, S32 y, int iId, bool bPressed, bool bRepeat, bool bReleased) +{ + //app.DebugPrintf("ToolTip Touch ID = %i\n", iId); + bool handled = false; + + // 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) + { + switch(iId) + { + case ETouchInput_Touch_A: + app.DebugPrintf("ToolTip Map Touch to _PSV_JOY_BUTTON_X\n", iId); + 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); + 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); + InputManager.MapTouchInput(iPad, _PSV_JOY_BUTTON_SQUARE); + break; + case ETouchInput_Touch_Y: + app.DebugPrintf("ToolTip Map Touch to _PSV_JOY_BUTTON_TRIANGLE\n", iId); + InputManager.MapTouchInput(iPad, _PSV_JOY_BUTTON_TRIANGLE); + break; + case ETouchInput_Touch_LT: + /* not in use on vita */ + app.DebugPrintf("ToolTip no action\n", iId); + break; + case ETouchInput_Touch_RightTrigger: + app.DebugPrintf("ToolTip no action\n", iId); + /* no action */ + break; + case ETouchInput_Touch_LeftBumper: + app.DebugPrintf("ToolTip Map Touch to _PSV_JOY_BUTTON_L1\n", iId); + InputManager.MapTouchInput(iPad, _PSV_JOY_BUTTON_L1); + break; + case ETouchInput_Touch_RightBumper: + app.DebugPrintf("ToolTip Map Touch to _PSV_JOY_BUTTON_R1\n", iId); + InputManager.MapTouchInput(iPad, _PSV_JOY_BUTTON_R1); + break; + case ETouchInput_Touch_LeftStick: + app.DebugPrintf("ToolTip no action\n", iId); + /* no action */ + break; + 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; + } + } +} +#endif + +void UIComponent_Tooltips::handleReload() +{ + app.DebugPrintf("UIComponent_Tooltips::handleReload\n"); + +#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) + if(InputManager.IsCircleCrossSwapped()) + { + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_boolean; + value[0].boolval = true; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetABSwap , 1 , value ); + } +#endif + + for(unsigned int i = 0; i < eToolTipNumButtons; ++i) + { + _SetTooltip(i, 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( (0 <= iPad) && (iPad <= 3) && m_overrideSFX[iPad][key] ) + { + // don't play a sound for this action + switch(key) + { + case ACTION_MENU_A: + case ACTION_MENU_OK: + case ACTION_MENU_PAGEUP: + case ACTION_MENU_PAGEDOWN: + case ACTION_MENU_X: + case ACTION_MENU_Y: + case ACTION_MENU_B: + case ACTION_MENU_CANCEL: + case ACTION_MENU_LEFT_SCROLL: + case ACTION_MENU_RIGHT_SCROLL: + case ACTION_MENU_LEFT: + case ACTION_MENU_RIGHT: + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + sendInputToMovie(key, repeat, pressed, released); + break; + } + } + else + { + switch(key) + { + case ACTION_MENU_OK: + case ACTION_MENU_CANCEL: + // 4J-PB - We get both A and OK, and B and Cancel, so only play a sound on one of them. + sendInputToMovie(key, repeat, pressed, released); + break; + case ACTION_MENU_A: + case ACTION_MENU_X: + case ACTION_MENU_Y: + // 4J-PB - play a Press sound + //CD - Removed, causes a sound on all presses + /*if(pressed) + { + ui.PlayUISFX(eSFX_Press); + }*/ + sendInputToMovie(key, repeat, pressed, released); + break; + + case ACTION_MENU_B: + // 4J-PB - play a Press sound + //CD - Removed, causes a sound on all presses + /*if(pressed) + { + ui.PlayUISFX(eSFX_Back); + }*/ + sendInputToMovie(key, repeat, pressed, released); + break; + + case ACTION_MENU_LEFT_SCROLL: + case ACTION_MENU_RIGHT_SCROLL: + //CD - Removed, causes a sound on all presses + /*if(pressed) + { + ui.PlayUISFX(eSFX_Scroll); + }*/ + sendInputToMovie(key, repeat, pressed, released); + break; + case ACTION_MENU_PAGEUP: + case ACTION_MENU_PAGEDOWN: + case ACTION_MENU_LEFT: + case ACTION_MENU_RIGHT: + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + sendInputToMovie(key, repeat, pressed, released); + break; + } + } +} + +void UIComponent_Tooltips::overrideSFX(int iPad, int key, bool bVal) +{ + m_overrideSFX[iPad][key]=bVal; +} diff --git a/Minecraft.Client/Common/UI/UIComponent_Tooltips.h b/Minecraft.Client/Common/UI/UIComponent_Tooltips.h new file mode 100644 index 00000000..f8db9439 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIComponent_Tooltips.h @@ -0,0 +1,116 @@ +#pragma once + +#include "UIScene.h" + +class UIComponent_Tooltips : public UIScene +{ +private: + bool m_bSplitscreen; + +protected: + typedef struct _TooltipValues + { + bool show; + int iString; + + UIString label; + + _TooltipValues() + { + show = false; + iString = -1; + } + } TooltipValues; + + TooltipValues m_tooltipValues[eToolTipNumButtons]; + + IggyName m_funcSetTooltip, m_funcSetOpacity, m_funcSetABSwap, m_funcUpdateLayout; + +#ifdef __PSVITA__ + enum ETouchInput + { + ETouchInput_Touch_A, + ETouchInput_Touch_B, + ETouchInput_Touch_X, + ETouchInput_Touch_Y, + ETouchInput_Touch_LT, + ETouchInput_Touch_RightTrigger, + ETouchInput_Touch_LeftBumper, + ETouchInput_Touch_RightBumper, + ETouchInput_Touch_LeftStick, + ETouchInput_Touch_RightStick, + ETouchInput_Touch_Select, + + ETouchInput_Count, + }; + UIControl_Touch m_TouchController[ETouchInput_Count]; +#endif + + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) +#ifdef __PSVITA__ + UI_MAP_ELEMENT( m_TouchController[ETouchInput_Touch_A], "Touch_A") + UI_MAP_ELEMENT( m_TouchController[ETouchInput_Touch_B], "Touch_B") + UI_MAP_ELEMENT( m_TouchController[ETouchInput_Touch_X], "Touch_X") + UI_MAP_ELEMENT( m_TouchController[ETouchInput_Touch_Y], "Touch_Y") + UI_MAP_ELEMENT( m_TouchController[ETouchInput_Touch_LT], "Touch_LT") + UI_MAP_ELEMENT( m_TouchController[ETouchInput_Touch_RightTrigger], "Touch_RightTrigger") + UI_MAP_ELEMENT( m_TouchController[ETouchInput_Touch_LeftBumper], "Touch_LeftBumper") + UI_MAP_ELEMENT( m_TouchController[ETouchInput_Touch_RightBumper], "Touch_RightBumper") + UI_MAP_ELEMENT( m_TouchController[ETouchInput_Touch_LeftStick], "Touch_LeftStick") + 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") + UI_MAP_NAME( m_funcSetABSwap, L"SetABSwap") + UI_MAP_NAME( m_funcUpdateLayout, L"UpdateLayout") + UI_END_MAP_ELEMENTS_AND_NAMES() + + virtual wstring getMoviePath(); + + virtual F64 getSafeZoneHalfWidth(); + +public: + UIComponent_Tooltips(int iPad, void *initData, UILayer *parentLayer); + + virtual EUIScene getSceneType() { return eUIComponent_Tooltips;} + + // Returns true if this scene handles input + virtual bool stealsFocus() { return false; } + + // Returns true if this scene has focus for the pad passed in + virtual bool hasFocus(int iPad) { return false; } + + // Returns true if lower scenes in this scenes layer, or in any layer below this scenes layers should be hidden + virtual bool hidesLowerScenes() { return false; } + + virtual void updateSafeZone(); + + virtual void tick(); + + // RENDERING + virtual void render(S32 width, S32 height, C4JRender::eViewportType viewport); + + virtual void SetTooltipText( unsigned int tooltip, int iTextID ); + virtual void SetEnableTooltips( bool bVal ); + virtual void ShowTooltip( unsigned int tooltip, bool show ); + virtual void SetTooltips( int iA, int iB=-1, int iX=-1, int iY=-1 , int iLT=-1, int iRT=-1, int iLB=-1, int iRB=-1, int iLS=-1, int iRS=-1, int iBack=-1, bool forceUpdate = false); + virtual void EnableTooltip( unsigned int tooltip, bool enable ); + + virtual void handleReload(); + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + + void overrideSFX(int iPad, int key, bool bVal); + + +private: + bool _SetTooltip(unsigned int iToolTip, int iTextID); + void _SetTooltip(unsigned int iToolTipId, UIString label, bool show, bool force = false); + void _Relayout(); + + bool m_overrideSFX[XUSER_MAX_COUNT][ACTION_MAX_MENU]; + +#ifdef __PSVITA__ + virtual void handleTouchInput(unsigned int iPad, S32 x, S32 y, int iId, bool bPressed, bool bRepeat, bool bReleased); +#endif +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIComponent_TutorialPopup.cpp b/Minecraft.Client/Common/UI/UIComponent_TutorialPopup.cpp new file mode 100644 index 00000000..3b4eb097 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIComponent_TutorialPopup.cpp @@ -0,0 +1,545 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIComponent_TutorialPopup.h" +#include "..\..\Common\Tutorial\Tutorial.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\MultiplayerLocalPlayer.h" +#include "..\..\Minecraft.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.tile.h" + +UIComponent_TutorialPopup::UIComponent_TutorialPopup(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + m_interactScene = NULL; + m_lastInteractSceneMoved = NULL; + m_lastSceneMovedLeft = false; + m_bAllowFade = false; + m_iconItem = nullptr; + m_iconIsFoil = false; + + m_bContainerMenuVisible = false; + m_bSplitscreenGamertagVisible = false; + m_iconType = e_ICON_TYPE_IGGY; + + m_labelDescription.init(L""); +} + +wstring UIComponent_TutorialPopup::getMoviePath() +{ + switch( m_parentLayer->getViewport() ) + { + case C4JRender::VIEWPORT_TYPE_SPLIT_TOP: + case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: + case C4JRender::VIEWPORT_TYPE_SPLIT_LEFT: + case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_LEFT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT: + return L"TutorialPopupSplit"; + break; + case C4JRender::VIEWPORT_TYPE_FULLSCREEN: + default: + return L"TutorialPopup"; + break; + } +} + +void UIComponent_TutorialPopup::UpdateTutorialPopup() +{ + // has the Splitscreen Gamertag visibility been changed? Re-Adjust Layout to prevent overlaps! + if(m_bSplitscreenGamertagVisible != (bool)(app.GetGameSettings(ProfileManager.GetPrimaryPad(),eGameSetting_DisplaySplitscreenGamertags) != 0)) + { + m_bSplitscreenGamertagVisible = (bool)(app.GetGameSettings(ProfileManager.GetPrimaryPad(),eGameSetting_DisplaySplitscreenGamertags) != 0); + handleReload(); + } +} + +void UIComponent_TutorialPopup::handleReload() +{ + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_boolean; + value[0].boolval = (bool)((app.GetGameSettings(ProfileManager.GetPrimaryPad(),eGameSetting_DisplaySplitscreenGamertags)!=0) && !m_bContainerMenuVisible); // 4J - TomK - Offset for splitscreen gamertag? + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcAdjustLayout, 1 , value ); + + setupIconHolder(m_iconType); +} + +void UIComponent_TutorialPopup::SetTutorialDescription(TutorialPopupInfo *info) +{ + m_interactScene = info->interactScene; + + wstring parsed = _SetIcon(info->icon, info->iAuxVal, info->isFoil, info->desc); + parsed = _SetImage( parsed ); + parsed = ParseDescription(m_iPad, parsed); + + if(parsed.empty()) + { + _SetDescription( info->interactScene, L"", L"", info->allowFade, info->isReminder ); + } + else + { + _SetDescription( info->interactScene, parsed, info->title, info->allowFade, info->isReminder ); + } +} + +void UIComponent_TutorialPopup::RemoveInteractSceneReference(UIScene *scene) +{ + if( m_interactScene == scene ) + { + m_interactScene = NULL; + } +} + +void UIComponent_TutorialPopup::SetVisible(bool visible) +{ + m_parentLayer->showComponent(0,eUIComponent_TutorialPopup,visible); + + if( visible && m_bAllowFade ) + { + //Initialise a timer to fade us out again + app.DebugPrintf("UIComponent_TutorialPopup::SetVisible: setting TUTORIAL_POPUP_FADE_TIMER_ID to %d\n",m_tutorial->GetTutorialDisplayMessageTime()); + addTimer(TUTORIAL_POPUP_FADE_TIMER_ID,m_tutorial->GetTutorialDisplayMessageTime()); + } +} + +bool UIComponent_TutorialPopup::IsVisible() +{ + return m_parentLayer->isComponentVisible(eUIComponent_TutorialPopup); +} + +void UIComponent_TutorialPopup::handleTimerComplete(int id) +{ + switch(id) + { + case TUTORIAL_POPUP_FADE_TIMER_ID: + SetVisible(false); + killTimer(id); + app.DebugPrintf("handleTimerComplete: setting TUTORIAL_POPUP_MOVE_SCENE_TIMER_ID\n"); + addTimer(TUTORIAL_POPUP_MOVE_SCENE_TIMER_ID,TUTORIAL_POPUP_MOVE_SCENE_TIME); + break; + case TUTORIAL_POPUP_MOVE_SCENE_TIMER_ID: + UpdateInteractScenePosition(IsVisible()); + killTimer(id); + break; + } +} + +void UIComponent_TutorialPopup::_SetDescription(UIScene *interactScene, const wstring &desc, const wstring &title, bool allowFade, bool isReminder) +{ + m_interactScene = interactScene; + app.DebugPrintf("Setting m_interactScene to %08x\n", m_interactScene); + if( interactScene != m_lastInteractSceneMoved ) m_lastInteractSceneMoved = NULL; + if(desc.empty()) + { + SetVisible( false ); + app.DebugPrintf("_SetDescription1: setting TUTORIAL_POPUP_MOVE_SCENE_TIMER_ID\n"); + addTimer(TUTORIAL_POPUP_MOVE_SCENE_TIMER_ID,TUTORIAL_POPUP_MOVE_SCENE_TIME); + killTimer(TUTORIAL_POPUP_FADE_TIMER_ID); + } + else + { + SetVisible( true ); + app.DebugPrintf("_SetDescription2: setting TUTORIAL_POPUP_MOVE_SCENE_TIMER_ID\n"); + addTimer(TUTORIAL_POPUP_MOVE_SCENE_TIMER_ID,TUTORIAL_POPUP_MOVE_SCENE_TIME); + + if( allowFade ) + { + //Initialise a timer to fade us out again + app.DebugPrintf("_SetDescription: setting TUTORIAL_POPUP_FADE_TIMER_ID\n"); + addTimer(TUTORIAL_POPUP_FADE_TIMER_ID,m_tutorial->GetTutorialDisplayMessageTime()); + } + else + { + app.DebugPrintf("_SetDescription: killing TUTORIAL_POPUP_FADE_TIMER_ID\n"); + killTimer(TUTORIAL_POPUP_FADE_TIMER_ID); + } + m_bAllowFade = allowFade; + + if(isReminder) + { + wstring text(app.GetString( IDS_TUTORIAL_REMINDER )); + text.append( desc ); + stripWhitespaceForHtml( text ); + // set the text colour + wchar_t formatting[40]; + // 4J Stu - Don't set HTML font size, that's set at design time in flash + //swprintf(formatting, 40, L"",app.GetHTMLColour(eHTMLColor_White),m_textFontSize); + swprintf(formatting, 40, L"",app.GetHTMLColour(eHTMLColor_White)); + text = formatting + text; + + m_labelDescription.setLabel( text, true ); + } + else + { + wstring text(desc); + stripWhitespaceForHtml( text ); + // set the text colour + wchar_t formatting[40]; + // 4J Stu - Don't set HTML font size, that's set at design time in flash + //swprintf(formatting, 40, L"",app.GetHTMLColour(eHTMLColor_White),m_textFontSize); + swprintf(formatting, 40, L"",app.GetHTMLColour(eHTMLColor_White)); + text = formatting + text; + + m_labelDescription.setLabel( text, true ); + + } + + m_labelTitle.setLabel( title, true ); + m_labelTitle.setVisible(!title.empty()); + + + // read host setting if gamertag is visible or not and pass on to Adjust Layout function (so we can offset it to stay clear of the gamertag) + m_bSplitscreenGamertagVisible = (bool)(app.GetGameSettings(ProfileManager.GetPrimaryPad(),eGameSetting_DisplaySplitscreenGamertags)!=0); + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_boolean; + value[0].boolval = (m_bSplitscreenGamertagVisible && !m_bContainerMenuVisible); // 4J - TomK - Offset for splitscreen gamertag? + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcAdjustLayout, 1 , value ); + } +} + +wstring UIComponent_TutorialPopup::_SetIcon(int icon, int iAuxVal, bool isFoil, LPCWSTR desc) +{ + wstring temp(desc); + + bool isFixedIcon = false; + + m_iconIsFoil = isFoil; + if( icon != TUTORIAL_NO_ICON ) + { + m_iconIsFoil = false; + m_iconItem = shared_ptr(new ItemInstance(icon,1,iAuxVal)); + } + else + { + m_iconItem = nullptr; + wstring openTag(L"{*ICON*}"); + wstring closeTag(L"{*/ICON*}"); + int iconTagStartPos = (int)temp.find(openTag); + int iconStartPos = iconTagStartPos + (int)openTag.length(); + if( iconTagStartPos > 0 && iconStartPos < (int)temp.length() ) + { + int iconEndPos = (int)temp.find( closeTag, iconStartPos ); + + if(iconEndPos > iconStartPos && iconEndPos < (int)temp.length() ) + { + wstring id = temp.substr(iconStartPos, iconEndPos - iconStartPos); + + vector idAndAux = stringSplit(id,L':'); + + int iconId = _fromString(idAndAux[0]); + + if(idAndAux.size() > 1) + { + iAuxVal = _fromString(idAndAux[1]); + } + else + { + iAuxVal = 0; + } + m_iconItem = shared_ptr(new ItemInstance(iconId,1,iAuxVal)); + + temp.replace(iconTagStartPos, iconEndPos - iconTagStartPos + closeTag.length(), L""); + } + } + + // remove any icon text + else if(temp.find(L"{*CraftingTableIcon*}")!=wstring::npos) + { + m_iconItem = shared_ptr(new ItemInstance(Tile::workBench_Id,1,0)); + } + else if(temp.find(L"{*SticksIcon*}")!=wstring::npos) + { + m_iconItem = shared_ptr(new ItemInstance(Item::stick_Id,1,0)); + } + else if(temp.find(L"{*PlanksIcon*}")!=wstring::npos) + { + m_iconItem = shared_ptr(new ItemInstance(Tile::wood_Id,1,0)); + } + else if(temp.find(L"{*WoodenShovelIcon*}")!=wstring::npos) + { + m_iconItem = shared_ptr(new ItemInstance(Item::shovel_wood_Id,1,0)); + } + else if(temp.find(L"{*WoodenHatchetIcon*}")!=wstring::npos) + { + m_iconItem = shared_ptr(new ItemInstance(Item::hatchet_wood_Id,1,0)); + } + else if(temp.find(L"{*WoodenPickaxeIcon*}")!=wstring::npos) + { + m_iconItem = shared_ptr(new ItemInstance(Item::pickAxe_wood_Id,1,0)); + } + else if(temp.find(L"{*FurnaceIcon*}")!=wstring::npos) + { + m_iconItem = shared_ptr(new ItemInstance(Tile::furnace_Id,1,0)); + } + else if(temp.find(L"{*WoodenDoorIcon*}")!=wstring::npos) + { + m_iconItem = shared_ptr(new ItemInstance(Item::door_wood,1,0)); + } + else if(temp.find(L"{*TorchIcon*}")!=wstring::npos) + { + m_iconItem = shared_ptr(new ItemInstance(Tile::torch_Id,1,0)); + } + else if(temp.find(L"{*BoatIcon*}")!=wstring::npos) + { + m_iconItem = shared_ptr(new ItemInstance(Item::boat_Id,1,0)); + } + else if(temp.find(L"{*FishingRodIcon*}")!=wstring::npos) + { + m_iconItem = shared_ptr(new ItemInstance(Item::fishingRod_Id,1,0)); + } + else if(temp.find(L"{*FishIcon*}")!=wstring::npos) + { + m_iconItem = shared_ptr(new ItemInstance(Item::fish_raw_Id,1,0)); + } + else if(temp.find(L"{*MinecartIcon*}")!=wstring::npos) + { + m_iconItem = shared_ptr(new ItemInstance(Item::minecart_Id,1,0)); + } + else if(temp.find(L"{*RailIcon*}")!=wstring::npos) + { + m_iconItem = shared_ptr(new ItemInstance(Tile::rail_Id,1,0)); + } + else if(temp.find(L"{*PoweredRailIcon*}")!=wstring::npos) + { + m_iconItem = shared_ptr(new ItemInstance(Tile::goldenRail_Id,1,0)); + } + else if(temp.find(L"{*StructuresIcon*}")!=wstring::npos) + { + isFixedIcon = true; + setupIconHolder(e_ICON_TYPE_STRUCTURES); + } + else if(temp.find(L"{*ToolsIcon*}")!=wstring::npos) + { + isFixedIcon = true; + setupIconHolder(e_ICON_TYPE_TOOLS); + } + else if(temp.find(L"{*StoneIcon*}")!=wstring::npos) + { + m_iconItem = shared_ptr(new ItemInstance(Tile::stone_Id,1,0)); + } + else + { + m_iconItem = nullptr; + } + } + if(!isFixedIcon && m_iconItem != NULL) setupIconHolder(e_ICON_TYPE_IGGY); + m_controlIconHolder.setVisible( isFixedIcon || m_iconItem != NULL); + + return temp; +} + +wstring UIComponent_TutorialPopup::_SetImage(wstring &desc) +{ + // 4J Stu - Unused +#if 0 + BOOL imageShowAtStart = m_image.IsShown(); + + wstring openTag(L"{*IMAGE*}"); + wstring closeTag(L"{*/IMAGE*}"); + int imageTagStartPos = (int)desc.find(openTag); + int imageStartPos = imageTagStartPos + (int)openTag.length(); + if( imageTagStartPos > 0 && imageStartPos < (int)desc.length() ) + { + int imageEndPos = (int)desc.find( closeTag, imageStartPos ); + + if(imageEndPos > imageStartPos && imageEndPos < (int)desc.length() ) + { + wstring id = desc.substr(imageStartPos, imageEndPos - imageStartPos); + m_image.SetImagePath( id.c_str() ); + m_image.SetShow( TRUE ); + + desc.replace(imageTagStartPos, imageEndPos - imageTagStartPos + closeTag.length(), L""); + } + } + else + { + // hide the icon slot + m_image.SetShow( FALSE ); + } + + BOOL imageShowAtEnd = m_image.IsShown(); + if(imageShowAtStart != imageShowAtEnd) + { + float fHeight, fWidth, fIconHeight, fDescHeight, fDescWidth; + m_image.GetBounds(&fWidth,&fIconHeight); + GetBounds(&fWidth,&fHeight); + + + // 4J Stu - For some reason when we resize the scene it resets the size of the HTML control + // We don't want that to happen, so get it's size before and set it back after + m_description.GetBounds(&fDescWidth,&fDescHeight); + if(imageShowAtEnd) + { + SetBounds(fWidth, fHeight + fIconHeight); + } + else + { + SetBounds(fWidth, fHeight - fIconHeight); + } + m_description.SetBounds(fDescWidth, fDescHeight); + } +#endif + return desc; +} + + +wstring UIComponent_TutorialPopup::ParseDescription(int iPad, wstring &text) +{ + text = replaceAll(text, L"{*CraftingTableIcon*}", L""); + text = replaceAll(text, L"{*SticksIcon*}", L""); + text = replaceAll(text, L"{*PlanksIcon*}", L""); + text = replaceAll(text, L"{*WoodenShovelIcon*}", L""); + text = replaceAll(text, L"{*WoodenHatchetIcon*}", L""); + text = replaceAll(text, L"{*WoodenPickaxeIcon*}", L""); + text = replaceAll(text, L"{*FurnaceIcon*}", L""); + text = replaceAll(text, L"{*WoodenDoorIcon*}", L""); + text = replaceAll(text, L"{*TorchIcon*}", L""); + text = replaceAll(text, L"{*MinecartIcon*}", L""); + text = replaceAll(text, L"{*BoatIcon*}", L""); + text = replaceAll(text, L"{*FishingRodIcon*}", L""); + text = replaceAll(text, L"{*FishIcon*}", L""); + text = replaceAll(text, L"{*RailIcon*}", L""); + text = replaceAll(text, L"{*PoweredRailIcon*}", L""); + text = replaceAll(text, L"{*StructuresIcon*}", L""); + text = replaceAll(text, L"{*ToolsIcon*}", L""); + text = replaceAll(text, L"{*StoneIcon*}", L""); + + bool exitScreenshot = false; + size_t pos = text.find(L"{*EXIT_PICTURE*}"); + if(pos != wstring::npos) exitScreenshot = true; + text = replaceAll(text, L"{*EXIT_PICTURE*}", L""); + m_controlExitScreenshot.setVisible(exitScreenshot); + /* +#define MINECRAFT_ACTION_RENDER_DEBUG ACTION_INGAME_13 +#define MINECRAFT_ACTION_PAUSEMENU ACTION_INGAME_15 +#define MINECRAFT_ACTION_SNEAK_TOGGLE ACTION_INGAME_17 + */ + + return app.FormatHTMLString(iPad,text); +} + +void UIComponent_TutorialPopup::UpdateInteractScenePosition(bool visible) +{ + if( m_interactScene == NULL ) return; + + // 4J-PB - check this players screen section to see if we should allow the animation + bool bAllowAnim=false; + bool isCraftingScene = (m_interactScene->getSceneType() == eUIScene_Crafting2x2Menu) || (m_interactScene->getSceneType() == eUIScene_Crafting3x3Menu); + bool isCreativeScene = (m_interactScene->getSceneType() == eUIScene_CreativeMenu); + bool isTradingScene = (m_interactScene->getSceneType() == eUIScene_TradingMenu); + switch(Minecraft::GetInstance()->localplayers[m_iPad]->m_iScreenSection) + { + case C4JRender::VIEWPORT_TYPE_FULLSCREEN: + case C4JRender::VIEWPORT_TYPE_SPLIT_TOP: + case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: + bAllowAnim=true; + break; + default: + // anim allowed for everything except the crafting 2x2 and 3x3, and the creative menu + if(!isCraftingScene && !isCreativeScene && !isTradingScene) + { + bAllowAnim=true; + } + break; + } + + if(bAllowAnim) + { + bool movingLeft = visible; + + if( (m_lastInteractSceneMoved != m_interactScene && movingLeft) || ( m_lastInteractSceneMoved == m_interactScene && m_lastSceneMovedLeft != movingLeft ) ) + { + if(movingLeft) + { + m_interactScene->slideLeft(); + } + else + { + m_interactScene->slideRight(); + } + + m_lastInteractSceneMoved = m_interactScene; + m_lastSceneMovedLeft = movingLeft; + } + } + +} + +void UIComponent_TutorialPopup::render(S32 width, S32 height, C4JRender::eViewportType viewport) +{ + if(viewport != C4JRender::VIEWPORT_TYPE_FULLSCREEN) + { + S32 xPos = 0; + S32 yPos = 0; + switch( viewport ) + { + case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: + xPos = (S32)(ui.getScreenWidth() / 2); + yPos = (S32)(ui.getScreenHeight() / 2); + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT: + yPos = (S32)(ui.getScreenHeight() / 2); + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_TOP: + case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: + xPos = (S32)(ui.getScreenWidth() / 2); + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT: + xPos = (S32)(ui.getScreenWidth() / 2); + yPos = (S32)(ui.getScreenHeight() / 2); + break; + } + //Adjust for safezone + switch( viewport ) + { + case C4JRender::VIEWPORT_TYPE_SPLIT_TOP: + case C4JRender::VIEWPORT_TYPE_SPLIT_LEFT: + case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_LEFT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: + yPos += getSafeZoneHalfHeight(); + break; + } + switch( viewport ) + { + case C4JRender::VIEWPORT_TYPE_SPLIT_TOP: + case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: + case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT: + xPos -= getSafeZoneHalfWidth(); + break; + } + ui.setupRenderPosition(xPos, yPos); + + IggyPlayerSetDisplaySize( getMovie(), width, height ); + IggyPlayerDraw( getMovie() ); + } + else + { + UIScene::render(width, height, viewport); + } +} + +void UIComponent_TutorialPopup::customDraw(IggyCustomDrawCallbackRegion *region) +{ + if(m_iconItem != NULL) customDrawSlotControl(region,m_iPad,m_iconItem,1.0f,m_iconItem->isFoil() || m_iconIsFoil,false); +} + +void UIComponent_TutorialPopup::setupIconHolder(EIcons icon) +{ + app.DebugPrintf("Setting icon holder to %d\n", icon); + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = (F64)icon; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetupIconHolder , 1 , value ); + + m_iconType = icon; +} diff --git a/Minecraft.Client/Common/UI/UIComponent_TutorialPopup.h b/Minecraft.Client/Common/UI/UIComponent_TutorialPopup.h new file mode 100644 index 00000000..4e5f4285 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIComponent_TutorialPopup.h @@ -0,0 +1,103 @@ +#pragma once + +#include "UIScene.h" + +#define TUTORIAL_POPUP_FADE_TIMER_ID 0 +#define TUTORIAL_POPUP_MOVE_SCENE_TIMER_ID 1 +#define TUTORIAL_POPUP_MOVE_SCENE_TIME 500 + + +class UIComponent_TutorialPopup : public UIScene +{ +private: + // A scene that may be displayed behind the popup that the player is using, that will need shifted so we can see it clearly. + UIScene *m_interactScene, *m_lastInteractSceneMoved; + bool m_lastSceneMovedLeft; + bool m_bAllowFade; + Tutorial *m_tutorial; + shared_ptr m_iconItem; + bool m_iconIsFoil; + //int m_iLocalPlayerC; + + bool m_bContainerMenuVisible; + bool m_bSplitscreenGamertagVisible; + + // Maps to values in AS + enum EIcons + { + e_ICON_TYPE_IGGY = 0, + e_ICON_TYPE_ARMOUR = 1, + e_ICON_TYPE_BREWING = 2, + e_ICON_TYPE_DECORATION = 3, + e_ICON_TYPE_FOOD = 4, + e_ICON_TYPE_MATERIALS = 5, + e_ICON_TYPE_MECHANISMS = 6, + e_ICON_TYPE_MISC = 7, + e_ICON_TYPE_REDSTONE_AND_TRANSPORT = 8, + e_ICON_TYPE_STRUCTURES = 9, + e_ICON_TYPE_TOOLS = 10, + e_ICON_TYPE_TRANSPORT = 11, + }; + + EIcons m_iconType; + +public: + UIComponent_TutorialPopup(int iPad, void *initData, UILayer *parentLayer); + +protected: + UIControl_Label m_labelDescription, m_labelTitle; + UIControl m_controlIconHolder; + UIControl m_controlExitScreenshot; + IggyName m_funcAdjustLayout, m_funcSetupIconHolder; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_labelTitle, "Title") + UI_MAP_ELEMENT( m_labelDescription, "Description") + UI_MAP_ELEMENT( m_controlIconHolder, "IconHolder") + UI_MAP_ELEMENT( m_controlExitScreenshot, "ExitScreenShot") + + UI_MAP_NAME( m_funcAdjustLayout, L"AdjustLayout") + UI_MAP_NAME( m_funcSetupIconHolder, L"SetupIconHolder") + UI_END_MAP_ELEMENTS_AND_NAMES() + + virtual wstring getMoviePath(); + +public: + virtual EUIScene getSceneType() { return eUIComponent_TutorialPopup;} + + // Returns true if this scene handles input + virtual bool stealsFocus() { return false; } + + // Returns true if this scene has focus for the pad passed in + virtual bool hasFocus(int iPad) { return false; } + + // Returns true if lower scenes in this scenes layer, or in any layer below this scenes layers should be hidden + virtual bool hidesLowerScenes() { return false; } + + virtual void handleReload(); + + void SetContainerMenuVisible(bool bContainerMenuVisible) { m_bContainerMenuVisible = bContainerMenuVisible; } + void UpdateTutorialPopup(); + + void SetTutorial( Tutorial *tutorial ) { m_tutorial = tutorial; } + void SetTutorialDescription(TutorialPopupInfo *info); + void RemoveInteractSceneReference(UIScene *scene); + void SetVisible(bool visible); + bool IsVisible(); + + // RENDERING + virtual void render(S32 width, S32 height, C4JRender::eViewportType viewport); + + virtual void customDraw(IggyCustomDrawCallbackRegion *region); + +protected: + void handleTimerComplete(int id); + +private: + void _SetDescription(UIScene *interactScene, const wstring &desc, const wstring &title, bool allowFade, bool isReminder); + wstring _SetIcon(int icon, int iAuxVal, bool isFoil, LPCWSTR desc); + wstring _SetImage(wstring &desc); + wstring ParseDescription(int iPad, wstring &text); + void UpdateInteractScenePosition(bool visible); + + void setupIconHolder(EIcons icon); +}; diff --git a/Minecraft.Client/Common/UI/UIControl.cpp b/Minecraft.Client/Common/UI/UIControl.cpp new file mode 100644 index 00000000..ec2e13d8 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl.cpp @@ -0,0 +1,153 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIControl.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\..\Minecraft.World\JavaMath.h" + +UIControl::UIControl() +{ + m_parentScene = NULL; + m_lastOpacity = 1.0f; + m_controlName = ""; + m_isVisible = true; + m_bHidden = false; + m_eControlType = eNoControl; +} + +bool UIControl::setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName) +{ + m_parentScene = scene; + m_controlName = controlName; + + rrbool res = IggyValuePathMakeNameRef ( &m_iggyPath , parent , controlName.c_str() ); + + m_nameXPos = registerFastName(L"x"); + m_nameYPos = registerFastName(L"y"); + m_nameWidth = registerFastName(L"width"); + m_nameHeight = registerFastName(L"height"); + m_funcSetAlpha = registerFastName(L"SetControlAlpha"); + m_nameVisible = registerFastName(L"visible"); + + F64 fx, fy, fwidth, fheight; + IggyValueGetF64RS( getIggyValuePath() , m_nameXPos , NULL , &fx ); + IggyValueGetF64RS( getIggyValuePath() , m_nameYPos , NULL , &fy ); + IggyValueGetF64RS( getIggyValuePath() , m_nameWidth , NULL , &fwidth ); + IggyValueGetF64RS( getIggyValuePath() , m_nameHeight , NULL , &fheight ); + + m_x = (S32)fx; + m_y = (S32)fy; + m_width = (S32)Math::round(fwidth); + m_height = (S32)Math::round(fheight); + + return res; +} + +#ifdef __PSVITA__ +void UIControl::UpdateControl() +{ + F64 fx, fy, fwidth, fheight; + IggyValueGetF64RS( getIggyValuePath() , m_nameXPos , NULL , &fx ); + IggyValueGetF64RS( getIggyValuePath() , m_nameYPos , NULL , &fy ); + IggyValueGetF64RS( getIggyValuePath() , m_nameWidth , NULL , &fwidth ); + IggyValueGetF64RS( getIggyValuePath() , m_nameHeight , NULL , &fheight ); + m_x = (S32)fx; + m_y = (S32)fy; + m_width = (S32)Math::round(fwidth); + m_height = (S32)Math::round(fheight); +} +#endif // __PSVITA__ + +void UIControl::ReInit() +{ + if(m_lastOpacity != 1.0f) + { + IggyDataValue result; + IggyDataValue value[2]; + IggyStringUTF8 stringVal; + + stringVal.string = (char *)m_controlName.c_str(); + stringVal.length = m_controlName.length(); + value[0].type = IGGY_DATATYPE_string_UTF8; + value[0].string8 = stringVal; + + value[1].type = IGGY_DATATYPE_number; + value[1].number = m_lastOpacity; + + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, m_parentScene->m_rootPath , m_funcSetAlpha , 2 , value ); + } + + IggyValueSetBooleanRS( getIggyValuePath(), m_nameVisible, NULL, m_isVisible ); +} + +IggyValuePath *UIControl::getIggyValuePath() +{ + return &m_iggyPath; +} + +S32 UIControl::getXPos() +{ + return m_x; +} + +S32 UIControl::getYPos() +{ + return m_y; +} + +S32 UIControl::getWidth() +{ + return m_width; +} + +S32 UIControl::getHeight() +{ + return m_height; +} + +void UIControl::setOpacity(float percent) +{ + if(percent != m_lastOpacity) + { + m_lastOpacity = percent; + + IggyDataValue result; + IggyDataValue value[2]; + IggyStringUTF8 stringVal; + + stringVal.string = (char *)m_controlName.c_str(); + stringVal.length = m_controlName.length(); + value[0].type = IGGY_DATATYPE_string_UTF8; + value[0].string8 = stringVal; + + value[1].type = IGGY_DATATYPE_number; + value[1].number = m_lastOpacity; + + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, m_parentScene->m_rootPath , m_funcSetAlpha , 2 , value ); + } +} + +void UIControl::setVisible(bool visible) +{ + if(visible != m_isVisible) + { + rrbool succ = IggyValueSetBooleanRS( getIggyValuePath(), m_nameVisible, NULL, visible ); + if(succ) m_isVisible = visible; + else app.DebugPrintf("Failed to set visibility for control\n"); + } +} + +bool UIControl::getVisible() +{ + rrbool bVisible = false; + + IggyResult result = IggyValueGetBooleanRS ( getIggyValuePath() , m_nameVisible, NULL, &bVisible ); + + m_isVisible = bVisible; + + return bVisible; +} + +IggyName UIControl::registerFastName(const wstring &name) +{ + return m_parentScene->registerFastName(name); +} diff --git a/Minecraft.Client/Common/UI/UIControl.h b/Minecraft.Client/Common/UI/UIControl.h new file mode 100644 index 00000000..e37f04de --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl.h @@ -0,0 +1,93 @@ +#pragma once + +// This class for any name object in the flash scene +class UIControl +{ + +public: + enum eUIControlType + { + eNoControl, + eButton, + eButtonList, + eCheckBox, + eCursor, + eDLCList, + eDynamicLabel, + eEnchantmentBook, + eEnchantmentButton, + eHTMLLabel, + eLabel, + eLeaderboardList, + eMinecraftPlayer, + eMinecraftHorse, + ePlayerList, + ePlayerSkinPreview, + eProgress, + eSaveList, + eSlider, + eSlotList, + eTextInput, + eTexturePackList, + eBitmapIcon, + eTouchControl, + }; +protected: + eUIControlType m_eControlType; + int m_id; + bool m_bHidden; // set by the Remove call + +public: + + void setControlType(eUIControlType eType) {m_eControlType=eType;} + eUIControlType getControlType() {return m_eControlType;} + void setId(int iID) { m_id=iID; } + int getId() { return m_id; } + UIScene * getParentScene() {return m_parentScene;} + +protected: + IggyValuePath m_iggyPath; + UIScene *m_parentScene; + string m_controlName; + + IggyName m_nameXPos, m_nameYPos, m_nameWidth, m_nameHeight; + IggyName m_funcSetAlpha, m_nameVisible; + + S32 m_x,m_y,m_width,m_height; + float m_lastOpacity; + bool m_isVisible; + +public: + UIControl(); + + virtual bool setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName); +#ifdef __PSVITA__ + void UpdateControl(); + void setHidden(bool bHidden) {m_bHidden=bHidden;} + bool getHidden(void) {return m_bHidden;} +#endif + + IggyValuePath *getIggyValuePath(); + + string getControlName() { return m_controlName; } + + virtual void tick() {} + virtual void ReInit(); + + virtual void setFocus(bool focus) {} + + S32 getXPos(); + S32 getYPos(); + S32 getWidth(); + S32 getHeight(); + + void setOpacity(float percent); + void setVisible(bool visible); + bool getVisible(); + bool isVisible() { return m_isVisible; } + + virtual bool hasFocus() { return false; } + +protected: + IggyName registerFastName(const wstring &name); +}; diff --git a/Minecraft.Client/Common/UI/UIControl_Base.cpp b/Minecraft.Client/Common/UI/UIControl_Base.cpp new file mode 100644 index 00000000..7a4a24e5 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_Base.cpp @@ -0,0 +1,108 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIControl.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\..\Minecraft.World\JavaMath.h" + +UIControl_Base::UIControl_Base() +{ + m_bLabelChanged = false; + m_label; + m_id = 0; +} + +bool UIControl_Base::setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName) +{ + bool success = UIControl::setupControl(scene,parent,controlName); + + m_setLabelFunc = registerFastName(L"SetLabel"); + m_initFunc = registerFastName(L"Init"); + m_funcGetLabel = registerFastName(L"GetLabel"); + m_funcCheckLabelWidths = registerFastName(L"CheckLabelWidths"); + + return success; +} + +void UIControl_Base::tick() +{ + UIControl::tick(); + + if ( m_label.needsUpdating() || m_bLabelChanged ) + { + //app.DebugPrintf("Calling SetLabel - '%ls'\n", m_label.c_str()); + m_bLabelChanged = false; + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_string_UTF16; + IggyStringUTF16 stringVal; + + stringVal.string = (IggyUTF16*) m_label.c_str(); + stringVal.length = m_label.length(); + value[0].string16 = stringVal; + + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_setLabelFunc , 1 , value ); + + m_label.setUpdated(); + } +} + +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; + + if(m_bLabelChanged && instant) + { + m_bLabelChanged = false; + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_string_UTF16; + IggyStringUTF16 stringVal; + + stringVal.string = (IggyUTF16*)m_label.c_str(); + stringVal.length = m_label.length(); + value[0].string16 = stringVal; + + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_setLabelFunc , 1 , value ); + } +} + +const wchar_t* UIControl_Base::getLabel() +{ + IggyDataValue result; + IggyResult out = IggyPlayerCallMethodRS(m_parentScene->getMovie(), &result, getIggyValuePath(), m_funcGetLabel, 0, NULL); + + if(result.type == IGGY_DATATYPE_string_UTF16) + { + m_label = wstring((wchar_t *)result.string16.string, result.string16.length); + } + + return m_label.c_str(); +} + +void UIControl_Base::setAllPossibleLabels(int labelCount, wchar_t labels[][256]) +{ + IggyDataValue result; + IggyDataValue *value = new IggyDataValue[labelCount]; + IggyStringUTF16 * stringVal = new IggyStringUTF16[labelCount]; + + for(unsigned int i = 0; i < labelCount; ++i) + { + stringVal[i].string = (IggyUTF16 *)labels[i]; + stringVal[i].length = wcslen(labels[i]); + value[i].type = IGGY_DATATYPE_string_UTF16; + value[i].string16 = stringVal[i]; + } + + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_funcCheckLabelWidths , labelCount , value ); + + delete [] value; + delete [] stringVal; +} + +bool UIControl_Base::hasFocus() +{ + return m_parentScene->controlHasFocus( this ); +} diff --git a/Minecraft.Client/Common/UI/UIControl_Base.h b/Minecraft.Client/Common/UI/UIControl_Base.h new file mode 100644 index 00000000..73ecac5a --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_Base.h @@ -0,0 +1,33 @@ +#pragma once + +#include "UIControl.h" +#include "UIString.h" + +// This class maps to the FJ_Base class in actionscript +class UIControl_Base : public UIControl +{ +protected: + IggyName m_initFunc; + IggyName m_setLabelFunc; + IggyName m_funcGetLabel; + IggyName m_funcCheckLabelWidths; + + bool m_bLabelChanged; + UIString m_label; + +public: + UIControl_Base(); + + virtual bool setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName); + + virtual void tick(); + + 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; } + + virtual bool hasFocus(); +}; 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_BitmapIcon.cpp b/Minecraft.Client/Common/UI/UIControl_BitmapIcon.cpp new file mode 100644 index 00000000..49561906 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_BitmapIcon.cpp @@ -0,0 +1,27 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIControl_BitmapIcon.h" + +bool UIControl_BitmapIcon::setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName) +{ + UIControl::setControlType(UIControl::eBitmapIcon); + bool success = UIControl::setupControl(scene,parent,controlName); + + //SlotList specific initialisers + m_funcSetTextureName = registerFastName(L"SetTextureName"); + + return success; +} + +void UIControl_BitmapIcon::setTextureName(const wstring &iconName) +{ + IggyDataValue result; + IggyDataValue value[1]; + + IggyStringUTF16 stringVal; + stringVal.string = (IggyUTF16*)iconName.c_str(); + stringVal.length = iconName.length(); + value[0].type = IGGY_DATATYPE_string_UTF16; + value[0].string16 = stringVal; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath(), m_funcSetTextureName , 1 , value ); +} diff --git a/Minecraft.Client/Common/UI/UIControl_BitmapIcon.h b/Minecraft.Client/Common/UI/UIControl_BitmapIcon.h new file mode 100644 index 00000000..9b2fe0a8 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_BitmapIcon.h @@ -0,0 +1,14 @@ +#pragma once + +#include "UIControl.h" + +class UIControl_BitmapIcon : public UIControl +{ +private: + IggyName m_funcSetTextureName; + +public: + virtual bool setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName); + + void setTextureName(const wstring &iconName); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIControl_Button.cpp b/Minecraft.Client/Common/UI/UIControl_Button.cpp new file mode 100644 index 00000000..70adb6b1 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_Button.cpp @@ -0,0 +1,68 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIControl_Button.h" + +UIControl_Button::UIControl_Button() +{ +} + +bool UIControl_Button::setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName) +{ + UIControl::setControlType(UIControl::eButton); + bool success = UIControl_Base::setupControl(scene,parent,controlName); + + //Button specific initialisers + m_funcEnableButton = registerFastName(L"EnableButton"); + + return success; +} + +void UIControl_Button::init(UIString label, int id) +{ + m_label = label; + m_id = id; + + IggyDataValue result; + IggyDataValue value[2]; + value[0].type = IGGY_DATATYPE_string_UTF16; + IggyStringUTF16 stringVal; + + stringVal.string = (IggyUTF16*)label.c_str(); + stringVal.length = label.length(); + value[0].string16 = stringVal; + + value[1].type = IGGY_DATATYPE_number; + value[1].number = id; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_initFunc , 2 , value ); + +#ifdef __PSVITA__ + // 4J-PB - add this button to the vita touch box list + + switch(m_parentScene->GetParentLayer()->m_iLayer) + { + case eUILayer_Error: + case eUILayer_Fullscreen: + case eUILayer_Scene: + case eUILayer_HUD: + ui.TouchBoxAdd(this,m_parentScene); + break; + } +#endif +} + +void UIControl_Button::ReInit() +{ + UIControl_Base::ReInit(); + + init(m_label, m_id); +} + +void UIControl_Button::setEnable(bool enable) +{ + IggyDataValue result; + IggyDataValue value[1]; + + value[0].type = IGGY_DATATYPE_boolean; + value[0].boolval = enable; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_funcEnableButton , 1 , value ); +} diff --git a/Minecraft.Client/Common/UI/UIControl_Button.h b/Minecraft.Client/Common/UI/UIControl_Button.h new file mode 100644 index 00000000..7369e8a0 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_Button.h @@ -0,0 +1,21 @@ +#pragma once + +#include "UIControl_Base.h" + +class UIControl_Button : public UIControl_Base +{ +private: + IggyName m_funcEnableButton; + +public: + UIControl_Button(); + + virtual bool setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName); + + void init(UIString label, int id); + //void init(const wstring &label, int id) { init(UIString::CONSTANT(label), id); } + + virtual void ReInit(); + + void setEnable(bool enable); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIControl_ButtonList.cpp b/Minecraft.Client/Common/UI/UIControl_ButtonList.cpp new file mode 100644 index 00000000..68a3d655 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_ButtonList.cpp @@ -0,0 +1,241 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIControl_ButtonList.h" + +UIControl_ButtonList::UIControl_ButtonList() +{ + m_itemCount = 0; + m_iCurrentSelection = 0; +} + +bool UIControl_ButtonList::setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName) +{ + UIControl::setControlType(UIControl::eButtonList); + bool success = UIControl_Base::setupControl(scene,parent,controlName); + + //SlotList specific initialisers + m_addNewItemFunc = registerFastName(L"addNewItem"); + m_removeAllItemsFunc = registerFastName(L"removeAllItems"); + m_funcHighlightItem = registerFastName(L"HighlightItem"); + m_funcRemoveItem = registerFastName(L"RemoveItem"); + m_funcSetButtonLabel = registerFastName(L"SetButtonLabel"); + m_funcSetTouchFocus = registerFastName(L"SetTouchFocus"); + m_funcCanTouchTrigger = registerFastName(L"CanTouchTrigger"); + + return success; +} + +void UIControl_ButtonList::init(int id) +{ + m_id = id; + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = id; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_initFunc , 1 , value ); + + #ifdef __PSVITA__ + // 4J-PB - add this buttonlist to the vita touch box list + + switch(m_parentScene->GetParentLayer()->m_iLayer) + { + case eUILayer_Fullscreen: + case eUILayer_Scene: + case eUILayer_HUD: + ui.TouchBoxAdd(this,m_parentScene); + break; +} + #endif +} + +void UIControl_ButtonList::ReInit() +{ + UIControl_Base::ReInit(); + init(m_id); + m_itemCount = 0; + m_iCurrentSelection = 0; +} + +void UIControl_ButtonList::clearList() +{ + IggyDataValue result; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath(), m_removeAllItemsFunc , 0 , NULL ); + + m_itemCount = 0; +} + +void UIControl_ButtonList::addItem(const string &label) +{ + addItem(label, m_itemCount); +} + +void UIControl_ButtonList::addItem(const wstring &label) +{ + addItem(label, m_itemCount); +} + +void UIControl_ButtonList::addItem(const string &label, int data) +{ + IggyDataValue result; + IggyDataValue value[2]; + + IggyStringUTF8 stringVal; + stringVal.string = (char*)label.c_str(); + stringVal.length = (S32)label.length(); + value[0].type = IGGY_DATATYPE_string_UTF8; + value[0].string8 = stringVal; + + value[1].type = IGGY_DATATYPE_number; + value[1].number = data; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath(), m_addNewItemFunc , 2 , value ); + + ++m_itemCount; +} + +void UIControl_ButtonList::addItem(const wstring &label, int data) +{ + IggyDataValue result; + IggyDataValue value[2]; + + IggyStringUTF16 stringVal; + stringVal.string = (IggyUTF16*)label.c_str(); + stringVal.length = label.length(); + value[0].type = IGGY_DATATYPE_string_UTF16; + value[0].string16 = stringVal; + + value[1].type = IGGY_DATATYPE_number; + value[1].number = data; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath(), m_addNewItemFunc , 2 , value ); + + ++m_itemCount; +} + +void UIControl_ButtonList::removeItem(int index) +{ + IggyDataValue result; + IggyDataValue value[1]; + + value[0].type = IGGY_DATATYPE_number; + value[0].number = index; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath(), m_funcRemoveItem , 1 , value ); + + --m_itemCount; +} + +void UIControl_ButtonList::setCurrentSelection(int iSelection) +{ + IggyDataValue result; + IggyDataValue value[1]; + + value[0].type = IGGY_DATATYPE_number; + value[0].number = iSelection; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath(), m_funcHighlightItem , 1 , value ); +} + +int UIControl_ButtonList::getCurrentSelection() +{ + return m_iCurrentSelection; +} + +void UIControl_ButtonList::updateChildFocus(int iChild) +{ + m_iCurrentSelection = iChild; +} + +void UIControl_ButtonList::setButtonLabel(int iButtonId, const wstring &label) +{ + IggyDataValue result; + IggyDataValue value[2]; + + value[0].type = IGGY_DATATYPE_number; + value[0].number = iButtonId; + + IggyStringUTF16 stringVal; + stringVal.string = (IggyUTF16*)label.c_str(); + stringVal.length = label.length(); + value[1].type = IGGY_DATATYPE_string_UTF16; + value[1].string16 = stringVal; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie(), &result, getIggyValuePath(), m_funcSetButtonLabel, 2 , value ); +} + +#ifdef __PSVITA__ +void UIControl_ButtonList::SetTouchFocus(S32 iX, S32 iY, bool bRepeat) +{ + IggyDataValue result; + IggyDataValue value[3]; + + value[0].type = IGGY_DATATYPE_number; + value[0].number = iX; + value[1].type = IGGY_DATATYPE_number; + value[1].number = iY; + value[2].type = IGGY_DATATYPE_boolean; + value[2].boolval = bRepeat; + + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie(), &result, getIggyValuePath(), m_funcSetTouchFocus, 3 , value ); +} + +bool UIControl_ButtonList::CanTouchTrigger(S32 iX, S32 iY) +{ + IggyDataValue result; + IggyDataValue value[2]; + + value[0].type = IGGY_DATATYPE_number; + value[0].number = iX; + value[1].type = IGGY_DATATYPE_number; + value[1].number = iY; + + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie(), &result, getIggyValuePath(), m_funcCanTouchTrigger, 2 , value ); + + S32 bCanTouchTrigger = false; + if(result.type == IGGY_DATATYPE_boolean) + { + bCanTouchTrigger = (bool)result.boolval; + } + return bCanTouchTrigger; +} +#endif + + +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 new file mode 100644 index 00000000..44484ac3 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_ButtonList.h @@ -0,0 +1,58 @@ +#pragma once + +#include "UIControl_Base.h" + +class UIControl_ButtonList : public UIControl_Base +{ +protected: + IggyName m_addNewItemFunc, m_removeAllItemsFunc, m_funcHighlightItem, m_funcRemoveItem, m_funcSetButtonLabel, m_funcSetTouchFocus, m_funcCanTouchTrigger; + + int m_itemCount; + int m_iCurrentSelection; + +public: + UIControl_ButtonList(); + + virtual bool setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName); + + void init(int id); + virtual void ReInit(); + + void clearList(); + + void addItem(const wstring &label); + void addItem(const string &label); + + void addItem(const wstring &label, int data); + void addItem(const string &label, int data); + + void removeItem(int index); + + int getItemCount() { return m_itemCount; } + + void setCurrentSelection(int iSelection); + int getCurrentSelection(); + + void updateChildFocus(int iChild); + + void setButtonLabel(int iButtonId, const wstring &label); + +#ifdef __PSVITA__ + void SetTouchFocus(S32 iX, S32 iY, bool bRepeat); + bool CanTouchTrigger(S32 iX, S32 iY); +#endif + +}; + +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 new file mode 100644 index 00000000..1c3e8afe --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_CheckBox.cpp @@ -0,0 +1,109 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIControl_CheckBox.h" + +UIControl_CheckBox::UIControl_CheckBox() +{ +} + +bool UIControl_CheckBox::setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName) +{ + UIControl::setControlType(UIControl::eCheckBox); + bool success = UIControl_Base::setupControl(scene,parent,controlName); + + //CheckBox specific initialisers + m_checkedProp = registerFastName(L"Checked"); + m_funcEnable = registerFastName(L"EnableCheckBox"); + m_funcSetCheckBox = registerFastName(L"SetCheckBox"); + + m_bEnabled = true; + + return success; +} + +void UIControl_CheckBox::init(UIString label, int id, bool checked) +{ + m_label = label; + m_id = id; + m_bChecked = checked; + + IggyDataValue result; + IggyDataValue value[3]; + value[0].type = IGGY_DATATYPE_string_UTF16; + IggyStringUTF16 stringVal; + + stringVal.string = (IggyUTF16*)label.c_str(); + stringVal.length = label.length(); + value[0].string16 = stringVal; + + value[1].type = IGGY_DATATYPE_number; + value[1].number = (int)id; + + value[2].type = IGGY_DATATYPE_boolean; + value[2].boolval = checked; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_initFunc , 3 , value ); + +#ifdef __PSVITA__ + // 4J-TomK - add checkbox to the vita touch box list + + switch(m_parentScene->GetParentLayer()->m_iLayer) + { + case eUILayer_Fullscreen: + case eUILayer_Scene: + case eUILayer_HUD: + ui.TouchBoxAdd(this,m_parentScene); + break; +} +#endif +} + +bool UIControl_CheckBox::IsChecked() +{ + rrbool checked = false; + IggyResult result = IggyValueGetBooleanRS ( &m_iggyPath , m_checkedProp, NULL, &checked ); + m_bChecked = checked; + return checked; +} + +bool UIControl_CheckBox::IsEnabled() +{ + return m_bEnabled; +} + +void UIControl_CheckBox::SetEnable(bool enable) +{ + m_bEnabled = enable; + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_boolean; + value[0].boolval = enable; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_funcEnable , 1 , value ); +} + +// 4J HEG - this is only ever used when required, most of this should happen in the flash +void UIControl_CheckBox::setChecked(bool checked) +{ + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_boolean; + value[0].boolval = checked; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_funcSetCheckBox , 1 , value ); +} + +// 4J-TomK we need to trigger this one via function instead of key down event because of how it works +void UIControl_CheckBox::TouchSetCheckbox(bool checked) +{ + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_boolean; + value[0].boolval = checked; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_funcSetCheckBox , 1 , value ); +} + +void UIControl_CheckBox::ReInit() +{ + UIControl_Base::ReInit(); + + init(m_label, m_id, m_bChecked); +} diff --git a/Minecraft.Client/Common/UI/UIControl_CheckBox.h b/Minecraft.Client/Common/UI/UIControl_CheckBox.h new file mode 100644 index 00000000..f8c0284b --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_CheckBox.h @@ -0,0 +1,27 @@ +#pragma once + +#include "UIControl_Base.h" + +class UIControl_CheckBox : public UIControl_Base +{ +private: + IggyName m_checkedProp, m_funcEnable, m_funcSetCheckBox; + + bool m_bChecked, m_bEnabled; + +public: + UIControl_CheckBox(); + + virtual bool setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName); + + void init(UIString label, int id, bool checked); + + bool IsChecked(); + bool IsEnabled(); + void SetEnable(bool enable); + void setChecked(bool checked); + void TouchSetCheckbox(bool checked); + + virtual void ReInit(); + +}; diff --git a/Minecraft.Client/Common/UI/UIControl_Cursor.cpp b/Minecraft.Client/Common/UI/UIControl_Cursor.cpp new file mode 100644 index 00000000..2ac5ce8a --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_Cursor.cpp @@ -0,0 +1,17 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIControl_Cursor.h" + +UIControl_Cursor::UIControl_Cursor() +{ +} + +bool UIControl_Cursor::setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName) +{ + UIControl::setControlType(UIControl::eCursor); + bool success = UIControl_Base::setupControl(scene,parent,controlName); + + //Label specific initialisers + + return success; +} diff --git a/Minecraft.Client/Common/UI/UIControl_Cursor.h b/Minecraft.Client/Common/UI/UIControl_Cursor.h new file mode 100644 index 00000000..cc7705d4 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_Cursor.h @@ -0,0 +1,11 @@ +#pragma once + +#include "UIControl_Base.h" + +class UIControl_Cursor : public UIControl_Base +{ +public: + UIControl_Cursor(); + + virtual bool setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIControl_DLCList.cpp b/Minecraft.Client/Common/UI/UIControl_DLCList.cpp new file mode 100644 index 00000000..35e6b08a --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_DLCList.cpp @@ -0,0 +1,69 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIControl_DLCList.h" + +bool UIControl_DLCList::setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName) +{ + UIControl::setControlType(UIControl::eDLCList); + bool success = UIControl_ButtonList::setupControl(scene,parent,controlName); + + //SlotList specific initialisers + m_funcShowTick = registerFastName(L"ShowTick"); + + return success; +} + +void UIControl_DLCList::addItem(const string &label, bool showTick, int iId) +{ + IggyDataValue result; + IggyDataValue value[3]; + + IggyStringUTF8 stringVal; + stringVal.string = (char*)label.c_str(); + stringVal.length = (S32)label.length(); + value[0].type = IGGY_DATATYPE_string_UTF8; + value[0].string8 = stringVal; + + value[1].type = IGGY_DATATYPE_number; + value[1].number = iId; + + value[2].type = IGGY_DATATYPE_boolean; + value[2].boolval = showTick; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath(), m_addNewItemFunc , 3 , value ); + + ++m_itemCount; +} + +void UIControl_DLCList::addItem(const wstring &label, bool showTick, int iId) +{ + IggyDataValue result; + IggyDataValue value[3]; + + IggyStringUTF16 stringVal; + stringVal.string = (IggyUTF16 *)label.c_str(); + stringVal.length = (S32)label.length(); + value[0].type = IGGY_DATATYPE_string_UTF16; + value[0].string16 = stringVal; + + value[1].type = IGGY_DATATYPE_number; + value[1].number = iId; + + value[2].type = IGGY_DATATYPE_boolean; + value[2].boolval = showTick; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath(), m_addNewItemFunc , 3 , value ); + + ++m_itemCount; +} + +void UIControl_DLCList::showTick(int iId, bool showTick) +{ + IggyDataValue result; + IggyDataValue value[2]; + + value[0].type = IGGY_DATATYPE_number; + value[0].number = iId; + + value[1].type = IGGY_DATATYPE_boolean; + value[1].boolval = showTick; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath(), m_funcShowTick , 2 , value ); +} diff --git a/Minecraft.Client/Common/UI/UIControl_DLCList.h b/Minecraft.Client/Common/UI/UIControl_DLCList.h new file mode 100644 index 00000000..9c917cbf --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_DLCList.h @@ -0,0 +1,17 @@ +#pragma once + +#include "UIControl_ButtonList.h" + +class UIControl_DLCList : public UIControl_ButtonList +{ +private: + IggyName m_funcShowTick; + +public: + virtual bool setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName); + + using UIControl_ButtonList::addItem; + void addItem(const string &label, bool showTick, int iId); + void addItem(const wstring &label, bool showTick, int iId); + void showTick(int iId, bool showTick); +}; diff --git a/Minecraft.Client/Common/UI/UIControl_DynamicLabel.cpp b/Minecraft.Client/Common/UI/UIControl_DynamicLabel.cpp new file mode 100644 index 00000000..fa29a137 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_DynamicLabel.cpp @@ -0,0 +1,98 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIControl_DynamicLabel.h" + +UIControl_DynamicLabel::UIControl_DynamicLabel() +{ +} + +bool UIControl_DynamicLabel::setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName) +{ + UIControl::setControlType(UIControl::eDynamicLabel); + bool success = UIControl_Base::setupControl(scene,parent,controlName); + + //Label specific initialisers + m_funcAddText = registerFastName(L"AddText"); + m_funcTouchScroll = registerFastName(L"TouchScroll"); + m_funcGetRealWidth = registerFastName(L"GetRealWidth"); + m_funcGetRealHeight = registerFastName(L"GetRealHeight"); + + return success; +} + +void UIControl_DynamicLabel::addText(const wstring &text, bool bLastEntry) +{ + IggyDataValue result; + IggyDataValue value[2]; + + IggyStringUTF16 stringVal; + stringVal.string = (IggyUTF16*)text.c_str(); + stringVal.length = text.length(); + value[0].type = IGGY_DATATYPE_string_UTF16; + value[0].string16 = stringVal; + + value[1].type = IGGY_DATATYPE_boolean; + value[1].boolval = bLastEntry; + + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_funcAddText , 2 , value ); +} + +void UIControl_DynamicLabel::ReInit() +{ + UIControl_Base::ReInit(); +} + +void UIControl_DynamicLabel::SetupTouch() +{ + #ifdef __PSVITA__ + // 4J-TomK - add this dynamic label to the vita touch box list + + switch(m_parentScene->GetParentLayer()->m_iLayer) + { + case eUILayer_Fullscreen: + case eUILayer_Scene: + case eUILayer_HUD: + ui.TouchBoxAdd(this,m_parentScene); + break; + } + #endif +} + +void UIControl_DynamicLabel::TouchScroll(S32 iY, bool bActive) +{ + IggyDataValue result; + IggyDataValue value[2]; + + value[0].type = IGGY_DATATYPE_number; + value[0].number = iY; + value[1].type = IGGY_DATATYPE_boolean; + value[1].boolval = bActive; + + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie(), &result, getIggyValuePath(), m_funcTouchScroll, 2 , value ); +} + +S32 UIControl_DynamicLabel::GetRealWidth() +{ + IggyDataValue result; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_funcGetRealWidth, 0 , NULL ); + + S32 iRealWidth = m_width; + if(result.type == IGGY_DATATYPE_number) + { + iRealWidth = (S32)result.number; + } + return iRealWidth; +} + +S32 UIControl_DynamicLabel::GetRealHeight() +{ + IggyDataValue result; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_funcGetRealHeight, 0 , NULL ); + + S32 iRealHeight = m_height; + if(result.type == IGGY_DATATYPE_number) + { + iRealHeight = (S32)result.number; + } + return iRealHeight; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIControl_DynamicLabel.h b/Minecraft.Client/Common/UI/UIControl_DynamicLabel.h new file mode 100644 index 00000000..902c706d --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_DynamicLabel.h @@ -0,0 +1,25 @@ +#pragma once + +#include "UIControl_Base.h" + +class UIControl_DynamicLabel : public UIControl_Label +{ +private: + IggyName m_funcAddText, m_funcTouchScroll, m_funcGetRealWidth, m_funcGetRealHeight; + +public: + UIControl_DynamicLabel(); + + virtual bool setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName); + + virtual void addText(const wstring &text, bool bLastEntry); + + virtual void ReInit(); + + virtual void SetupTouch(); + + virtual void TouchScroll(S32 iY, bool bActive); + + S32 GetRealWidth(); + S32 GetRealHeight(); +}; diff --git a/Minecraft.Client/Common/UI/UIControl_EnchantmentBook.cpp b/Minecraft.Client/Common/UI/UIControl_EnchantmentBook.cpp new file mode 100644 index 00000000..9664dbf4 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_EnchantmentBook.cpp @@ -0,0 +1,138 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIControl_EnchantmentBook.h" +#include "..\..\Minecraft.h" +#include "..\..\TileEntityRenderDispatcher.h" +#include "..\..\EnchantTableRenderer.h" +#include "..\..\Lighting.h" +#include "..\..\BookModel.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.tile.entity.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" + +UIControl_EnchantmentBook::UIControl_EnchantmentBook() +{ + UIControl::setControlType(UIControl::eEnchantmentBook); + model = NULL; + last = nullptr; + + time = 0; + flip = oFlip = flipT = flipA = 0.0f; + open = oOpen = 0.0f; +} + +void UIControl_EnchantmentBook::render(IggyCustomDrawCallbackRegion *region) +{ + glPushMatrix(); + float width = region->x1 - region->x0; + float height = region->y1 - region->y0; + + // Revert the scale from the setup + float ssX = width/m_width; + float ssY = height/m_height; + glScalef(ssX, ssY,1.0f); + + glTranslatef(m_width/2, m_height/2, 50.0f); + + // Add a uniform scale + glScalef(-57/ssX, 57/ssX, 360.0f); + + glRotatef(45 + 90, 0, 1, 0); + Lighting::turnOn(); + glRotatef(-45 - 90, 0, 1, 0); + + //float sss = 4; + + //glTranslatef(0, 3.3f, -16); + //glScalef(sss, sss, sss); + + Minecraft *pMinecraft = Minecraft::GetInstance(); + int tex = pMinecraft->textures->loadTexture(TN_ITEM_BOOK); // 4J was L"/1_2_2/item/book.png" + pMinecraft->textures->bind(tex); + + glRotatef(20, 1, 0, 0); + + float a = 1; + float o = oOpen + (open - oOpen) * a; + glTranslatef((1 - o) * 0.2f, (1 - o) * 0.1f, (1 - o) * 0.25f); + glRotatef(-(1 - o) * 90 - 90, 0, 1, 0); + glRotatef(180, 1, 0, 0); + + float ff1 = oFlip + (flip - oFlip) * a + 0.25f; + float ff2 = oFlip + (flip - oFlip) * a + 0.75f; + ff1 = (ff1 - floor(ff1)) * 1.6f - 0.3f; + ff2 = (ff2 - floor(ff2)) * 1.6f - 0.3f; + + if (ff1 < 0) ff1 = 0; + if (ff2 < 0) ff2 = 0; + if (ff1 > 1) ff1 = 1; + if (ff2 > 1) ff2 = 1; + + glEnable(GL_CULL_FACE); + + if(model == NULL) + { + // Share the model the the EnchantTableRenderer + + EnchantTableRenderer *etr = (EnchantTableRenderer*)TileEntityRenderDispatcher::instance->getRenderer(eTYPE_ENCHANTMENTTABLEENTITY); + if(etr != NULL) + { + model = etr->bookModel; + } + else + { + model = new BookModel(); + } + } + + model->render(nullptr, 0, ff1, ff2, o, 0, 1 / 16.0f,true); + glDisable(GL_CULL_FACE); + + glPopMatrix(); + Lighting::turnOff(); + glDisable(GL_RESCALE_NORMAL); + + tickBook(); +} + +void UIControl_EnchantmentBook::tickBook() +{ + UIScene_EnchantingMenu *m_containerScene = (UIScene_EnchantingMenu *)m_parentScene; + EnchantmentMenu *menu = m_containerScene->getMenu(); + shared_ptr current = menu->getSlot(0)->getItem(); + if (!ItemInstance::matches(current, last)) + { + last = current; + + do + { + flipT += random.nextInt(4) - random.nextInt(4); + } while (flip <= flipT + 1 && flip >= flipT - 1); + } + + time++; + oFlip = flip; + oOpen = open; + + bool shouldBeOpen = false; + for (int i = 0; i < 3; i++) + { + if (menu->costs[i] != 0) + { + shouldBeOpen = true; + } + } + + if (shouldBeOpen) open += 0.2f; + else open -= 0.2f; + if (open < 0) open = 0; + if (open > 1) open = 1; + + + float diff = (flipT - flip) * 0.4f; + float max = 0.2f; + if (diff < -max) diff = -max; + if (diff > +max) diff = +max; + flipA += (diff - flipA) * 0.9f; + + flip = flip + flipA; +} diff --git a/Minecraft.Client/Common/UI/UIControl_EnchantmentBook.h b/Minecraft.Client/Common/UI/UIControl_EnchantmentBook.h new file mode 100644 index 00000000..cbe2cf2b --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_EnchantmentBook.h @@ -0,0 +1,33 @@ +#pragma once + +#include "UIControl.h" + +class UIScene_EnchantingMenu; +class BookModel; + +class UIControl_EnchantmentBook : public UIControl +{ +private: + BookModel *model; + Random random; + + // 4J JEV: Book animation variables. + int time; + float flip, oFlip, flipT, flipA; + float open, oOpen; + + //BOOL m_bDirty; + //float m_fScale,m_fAlpha; + //int m_iPad; + shared_ptr last; + + //float m_fScreenWidth,m_fScreenHeight; + //float m_fRawWidth,m_fRawHeight; + + void tickBook(); + +public: + UIControl_EnchantmentBook(); + + void render(IggyCustomDrawCallbackRegion *region); +}; diff --git a/Minecraft.Client/Common/UI/UIControl_EnchantmentButton.cpp b/Minecraft.Client/Common/UI/UIControl_EnchantmentButton.cpp new file mode 100644 index 00000000..37f8fcf6 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_EnchantmentButton.cpp @@ -0,0 +1,217 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIControl_EnchantmentButton.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" +#include "..\..\Minecraft.h" +#include "..\..\MultiplayerLocalPlayer.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" + +UIControl_EnchantmentButton::UIControl_EnchantmentButton() +{ + m_index = 0; + m_lastState = eState_Inactive; + m_lastCost = 0; + m_enchantmentString = L""; + m_bHasFocus = false; + + m_textColour = app.GetHTMLColour(eTextColor_Enchant); + m_textFocusColour = app.GetHTMLColour(eTextColor_EnchantFocus); + m_textDisabledColour = app.GetHTMLColour(eTextColor_EnchantDisabled); +} + +bool UIControl_EnchantmentButton::setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName) +{ + UIControl::setControlType(UIControl::eEnchantmentButton); + bool success = UIControl_Button::setupControl(scene,parent,controlName); + + //Button specific initialisers + m_funcChangeState = registerFastName(L"ChangeState"); + + return success; +} + +void UIControl_EnchantmentButton::init(int index) +{ + m_index = index; +} + + +void UIControl_EnchantmentButton::ReInit() +{ + UIControl_Button::ReInit(); + + + m_lastState = eState_Inactive; + m_lastCost = 0; + m_bHasFocus = false; + updateState(); +} + +void UIControl_EnchantmentButton::tick() +{ + updateState(); + UIControl_Button::tick(); +} + +void UIControl_EnchantmentButton::render(IggyCustomDrawCallbackRegion *region) +{ + UIScene_EnchantingMenu *enchantingScene = (UIScene_EnchantingMenu *)m_parentScene; + EnchantmentMenu *menu = enchantingScene->getMenu(); + + float width = region->x1 - region->x0; + float height = region->y1 - region->y0; + float xo = width/2; + float yo = height; + //glTranslatef(xo, yo, 50.0f); + + // Revert the scale from the setup + float ssX = width/m_width; + float ssY = height/m_height; + glScalef(ssX, ssY,1.0f); + + float ss = 1.0f; + +#if TO_BE_IMPLEMENTED + if(!enchantingScene->m_bSplitscreen) +#endif + { + switch(enchantingScene->getSceneResolution()) + { + case UIScene::eSceneResolution_1080: + ss = 3.0f; + break; + default: + ss = 2.0f; + break; + } + } + + glScalef(ss, ss, ss); + + int cost = menu->costs[m_index]; + + //if(cost != m_lastCost) + //{ + // updateState(); + //} + + glColor4f(1, 1, 1, 1); + if (cost != 0) + { + glEnable(GL_ALPHA_TEST); + glAlphaFunc(GL_GREATER, 0.1f); + Minecraft *pMinecraft = Minecraft::GetInstance(); + wstring line = _toString(cost); + Font *font = pMinecraft->altFont; + //int col = 0x685E4A; + unsigned int col = m_textColour; + if (pMinecraft->localplayers[enchantingScene->getPad()]->experienceLevel < cost && !pMinecraft->localplayers[enchantingScene->getPad()]->abilities.instabuild) + { + col = m_textDisabledColour; + font->drawWordWrap(m_enchantmentString, 0, 0, (float)m_width/ss, col, (float)m_height/ss); + font = pMinecraft->font; + //col = (0x80ff20 & 0xfefefe) >> 1; + //font->drawShadow(line, (bwidth - font->width(line))/ss, 7, col); + } + else + { + if (m_bHasFocus) + { + //col = 0xffff80; + col = m_textFocusColour; + } + font->drawWordWrap(m_enchantmentString, 0, 0, (float)m_width/ss, col, (float)m_height/ss); + font = pMinecraft->font; + //col = 0x80ff20; + //font->drawShadow(line, (bwidth - font->width(line))/ss, 7, col); + } + glDisable(GL_ALPHA_TEST); + } + else + { + } + + //Lighting::turnOff(); + glDisable(GL_RESCALE_NORMAL); +} + +void UIControl_EnchantmentButton::updateState() +{ + UIScene_EnchantingMenu *enchantingScene = (UIScene_EnchantingMenu *)m_parentScene; + EnchantmentMenu *menu = enchantingScene->getMenu(); + + EState state = eState_Inactive; + + int cost = menu->costs[m_index]; + + Minecraft *pMinecraft = Minecraft::GetInstance(); + if(cost > pMinecraft->localplayers[enchantingScene->getPad()]->experienceLevel && !pMinecraft->localplayers[enchantingScene->getPad()]->abilities.instabuild) + { + // Dark background + state = eState_Inactive; + } + else + { + // Light background and focus background + if(m_bHasFocus) + { + state = eState_Selected; + } + else + { + state = eState_Active; + } + } + + if(cost != m_lastCost) + { + setLabel( _toString(cost) ); + m_lastCost = cost; + m_enchantmentString = EnchantmentNames::instance.getRandomName(); + } + if(cost == 0) + { + // Dark background + state = eState_Inactive; + setLabel(L""); + } + + if(state != m_lastState) + { + IggyDataValue result; + IggyDataValue value[1]; + + value[0].type = IGGY_DATATYPE_number; + value[0].number = (int)state; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_funcChangeState , 1 , value ); + + if(out == IGGY_RESULT_SUCCESS) m_lastState = state; + } +} + +void UIControl_EnchantmentButton::setFocus(bool focus) +{ + m_bHasFocus = focus; + updateState(); +} + +UIControl_EnchantmentButton::EnchantmentNames UIControl_EnchantmentButton::EnchantmentNames::instance; + +UIControl_EnchantmentButton::EnchantmentNames::EnchantmentNames() +{ + wstring allWords = L"the elder scrolls klaatu berata niktu xyzzy bless curse light darkness fire air earth water hot dry cold wet ignite snuff embiggen twist shorten stretch fiddle destroy imbue galvanize enchant free limited range of towards inside sphere cube self other ball mental physical grow shrink demon elemental spirit animal creature beast humanoid undead fresh stale "; + std::wistringstream iss(allWords); + std::copy(std::istream_iterator< std::wstring, wchar_t, std::char_traits >(iss), std::istream_iterator< std::wstring, wchar_t, std::char_traits >(),std::back_inserter(words)); +} + +wstring UIControl_EnchantmentButton::EnchantmentNames::getRandomName() +{ + int wordCount = random.nextInt(2) + 3; + wstring word = L""; + for (int i = 0; i < wordCount; i++) + { + if (i > 0) word += L" "; + word += words[random.nextInt(words.size())]; + } + return word; +} diff --git a/Minecraft.Client/Common/UI/UIControl_EnchantmentButton.h b/Minecraft.Client/Common/UI/UIControl_EnchantmentButton.h new file mode 100644 index 00000000..f7a703b3 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_EnchantmentButton.h @@ -0,0 +1,55 @@ +#pragma once + +#include "UIControl_Button.h" + +class UIControl_EnchantmentButton : public UIControl_Button +{ +private: + // Maps to values in AS + enum EState + { + eState_Inactive = 0, + eState_Active = 1, + eState_Selected = 2, + }; + + EState m_lastState; + int m_lastCost; + int m_index; + wstring m_enchantmentString; + bool m_bHasFocus; + + IggyName m_funcChangeState; + + unsigned int m_textColour, m_textFocusColour, m_textDisabledColour; + + class EnchantmentNames + { + public: + static EnchantmentNames instance; + + private: + Random random; + vector words; + + EnchantmentNames(); + + public: + wstring getRandomName(); + }; + +public: + UIControl_EnchantmentButton(); + + virtual bool setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName); + + virtual void tick(); + + void init(int index); + virtual void ReInit(); + void render(IggyCustomDrawCallbackRegion *region); + + void updateState(); + + virtual void setFocus(bool focus); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIControl_HTMLLabel.cpp b/Minecraft.Client/Common/UI/UIControl_HTMLLabel.cpp new file mode 100644 index 00000000..8b7eb9a1 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_HTMLLabel.cpp @@ -0,0 +1,103 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIControl_HTMLLabel.h" + +UIControl_HTMLLabel::UIControl_HTMLLabel() +{ +} + +bool UIControl_HTMLLabel::setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName) +{ + UIControl::setControlType(UIControl::eHTMLLabel); + bool success = UIControl_Base::setupControl(scene,parent,controlName); + + //Label specific initialisers + m_funcStartAutoScroll = registerFastName(L"StartAutoScroll"); + m_funcTouchScroll = registerFastName(L"TouchScroll"); + m_funcGetRealWidth = registerFastName(L"GetRealWidth"); + m_funcGetRealHeight = registerFastName(L"GetRealHeight"); + + return success; +} + +void UIControl_HTMLLabel::startAutoScroll() +{ + IggyDataValue result; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_funcStartAutoScroll , 0 , NULL ); +} + +void UIControl_HTMLLabel::ReInit() +{ + UIControl_Base::ReInit(); + // Don't set the label, HTML sizes will have changed. Let the scene update us. + init(L""); +} + +void UIControl_HTMLLabel::setLabel(const string &label) +{ + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_string_UTF8; + IggyStringUTF8 stringVal; + + stringVal.string = (char *) label.c_str(); + stringVal.length = label.length(); + value[0].string8 = stringVal; + + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_setLabelFunc , 1 , value ); +} + +void UIControl_HTMLLabel::SetupTouch() +{ + #ifdef __PSVITA__ + // 4J-TomK - add this dynamic label to the vita touch box list + + switch(m_parentScene->GetParentLayer()->m_iLayer) + { + case eUILayer_Fullscreen: + case eUILayer_Scene: + case eUILayer_HUD: + ui.TouchBoxAdd(this,m_parentScene); + break; + } + #endif +} + +void UIControl_HTMLLabel::TouchScroll(S32 iY, bool bActive) +{ + IggyDataValue result; + IggyDataValue value[2]; + + value[0].type = IGGY_DATATYPE_number; + value[0].number = iY; + value[1].type = IGGY_DATATYPE_boolean; + value[1].boolval = bActive; + + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie(), &result, getIggyValuePath(), m_funcTouchScroll, 2 , value ); +} + +S32 UIControl_HTMLLabel::GetRealWidth() +{ + IggyDataValue result; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_funcGetRealWidth, 0 , NULL ); + + S32 iRealWidth = m_width; + if(result.type == IGGY_DATATYPE_number) + { + iRealWidth = (S32)result.number; + } + return iRealWidth; +} + +S32 UIControl_HTMLLabel::GetRealHeight() +{ + IggyDataValue result; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_funcGetRealHeight, 0 , NULL ); + + S32 iRealHeight = m_height; + if(result.type == IGGY_DATATYPE_number) + { + iRealHeight = (S32)result.number; + } + return iRealHeight; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIControl_HTMLLabel.h b/Minecraft.Client/Common/UI/UIControl_HTMLLabel.h new file mode 100644 index 00000000..17e7cfb4 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_HTMLLabel.h @@ -0,0 +1,27 @@ +#pragma once + +#include "UIControl_Base.h" + +class UIControl_HTMLLabel : public UIControl_Label +{ +private: + IggyName m_funcStartAutoScroll, m_funcTouchScroll, m_funcGetRealWidth, m_funcGetRealHeight; + +public: + UIControl_HTMLLabel(); + + virtual bool setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName); + + void startAutoScroll(); + virtual void ReInit(); + + using UIControl_Base::setLabel; + void setLabel(const string &label); + + virtual void SetupTouch(); + + virtual void TouchScroll(S32 iY, bool bActive); + + S32 GetRealWidth(); + S32 GetRealHeight(); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIControl_Label.cpp b/Minecraft.Client/Common/UI/UIControl_Label.cpp new file mode 100644 index 00000000..47374d21 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_Label.cpp @@ -0,0 +1,45 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIControl_Label.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" + +UIControl_Label::UIControl_Label() +{ + m_reinitEnabled = true; +} + +bool UIControl_Label::setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName) +{ + UIControl::setControlType(UIControl::eLabel); + bool success = UIControl_Base::setupControl(scene,parent,controlName); + + //Label specific initialisers + + return success; +} + +void UIControl_Label::init(UIString label) +{ + m_label = label; + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_string_UTF16; + IggyStringUTF16 stringVal; + + stringVal.string = (IggyUTF16*)label.c_str(); + stringVal.length = label.length(); + value[0].string16 = stringVal; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_initFunc , 1 , value ); +} + +void UIControl_Label::ReInit() +{ + UIControl_Base::ReInit(); + + // 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 new file mode 100644 index 00000000..21eb35a6 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_Label.h @@ -0,0 +1,19 @@ +#pragma once + +#include "UIControl_Base.h" + +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(UIString label); + virtual void ReInit(); + + void disableReinitialisation() { m_reinitEnabled = false; } +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIControl_LeaderboardList.cpp b/Minecraft.Client/Common/UI/UIControl_LeaderboardList.cpp new file mode 100644 index 00000000..c34b5e87 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_LeaderboardList.cpp @@ -0,0 +1,238 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIControl_LeaderboardList.h" + +UIControl_LeaderboardList::UIControl_LeaderboardList() +{ +} + +bool UIControl_LeaderboardList::setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName) +{ + UIControl::setControlType(UIControl::eLeaderboardList); + bool success = UIControl_Base::setupControl(scene,parent,controlName); + + //UIControl_LeaderboardList specific initialisers + m_funcInitLeaderboard = registerFastName(L"InitLeaderboard"); + m_funcAddDataSet = registerFastName(L"AddDataSet"); + m_funcResetLeaderboard = registerFastName(L"ResetLeaderboard"); + m_funcSetupTitles = registerFastName(L"SetupTitles"); + m_funcSetColumnIcon = registerFastName(L"SetColumnIcon"); +#ifdef __PSVITA__ + m_funcSetTouchFocus = registerFastName(L"SetTouchFocus"); + m_bTouchInitialised = false; +#endif + + return success; +} + +void UIControl_LeaderboardList::init(int id) +{ + m_id = id; + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = id; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_initFunc , 1 , value ); +} + +void UIControl_LeaderboardList::ReInit() +{ + UIControl_Base::ReInit(); + init(m_id); +} + +void UIControl_LeaderboardList::clearList() +{ + IggyDataValue result; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath(), m_funcResetLeaderboard , 0 , NULL ); +} + +void UIControl_LeaderboardList::setupTitles(const wstring &rank, const wstring &gamertag) +{ + IggyDataValue result; + IggyDataValue value[2]; + + IggyStringUTF16 stringVal0; + stringVal0.string = (IggyUTF16*)rank.c_str(); + stringVal0.length = rank.length(); + value[0].type = IGGY_DATATYPE_string_UTF16; + value[0].string16 = stringVal0; + + IggyStringUTF16 stringVal1; + stringVal1.string = (IggyUTF16*)gamertag.c_str(); + stringVal1.length = gamertag.length(); + value[1].type = IGGY_DATATYPE_string_UTF16; + value[1].string16 = stringVal1; + + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath(), m_funcSetupTitles , 2 , value ); +} + +void UIControl_LeaderboardList::initLeaderboard(int iFirstFocus, int iTotalEntries, int iNumColumns) +{ + IggyDataValue result; + IggyDataValue value[3]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = iFirstFocus; + + value[1].type = IGGY_DATATYPE_number; + value[1].number = iTotalEntries; + + value[2].type = IGGY_DATATYPE_number; + value[2].number = iNumColumns; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath(), m_funcInitLeaderboard , 3 , value ); + +#ifdef __PSVITA__ + // 4J-PB - add this button to the vita touch box list + if(!m_bTouchInitialised) + { + switch(m_parentScene->GetParentLayer()->m_iLayer) + { + case eUILayer_Fullscreen: + case eUILayer_Scene: + ui.TouchBoxAdd(this,m_parentScene); + break; + } + m_bTouchInitialised = true; + } +#endif +} + +void UIControl_LeaderboardList::setColumnIcon(int iColumn, int iType) +{ + IggyDataValue result; + IggyDataValue value[2]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = iColumn; + + value[1].type = IGGY_DATATYPE_number; + value[1].number = (iType<=32000)?0:(iType-32000); + + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath(), m_funcSetColumnIcon , 2 , value ); +} + +void UIControl_LeaderboardList::addDataSet(bool bLast, int iId, int iRank, const wstring &gamertag, bool bDisplayMessage, const wstring &col0, const wstring &col1, const wstring &col2, const wstring &col3, const wstring &col4, const wstring &col5, const wstring &col6) +{ + IggyDataValue result; + IggyDataValue value[12]; + + value[0].type = IGGY_DATATYPE_boolean; + value[0].boolval = bLast; + + value[1].type = IGGY_DATATYPE_number; + value[1].number = iId; + + value[2].type = IGGY_DATATYPE_number; + value[2].number = iRank; + + IggyStringUTF16 stringVal0; + stringVal0.string = (IggyUTF16*)gamertag.c_str(); + stringVal0.length = gamertag.length(); + value[3].type = IGGY_DATATYPE_string_UTF16; + value[3].string16 = stringVal0; + + value[4].type = IGGY_DATATYPE_boolean; + value[4].boolval = bDisplayMessage; + + IggyStringUTF16 stringVal1; + stringVal1.string = (IggyUTF16*)col0.c_str(); + stringVal1.length = col0.length(); + value[5].type = IGGY_DATATYPE_string_UTF16; + value[5].string16 = stringVal1; + + if(col1.empty()) + { + value[6].type = IGGY_DATATYPE_null; + } + else + { + IggyStringUTF16 stringVal2; + stringVal2.string = (IggyUTF16*)col1.c_str(); + stringVal2.length = col1.length(); + value[6].type = IGGY_DATATYPE_string_UTF16; + value[6].string16 = stringVal2; + } + + if(col2.empty()) + { + value[7].type = IGGY_DATATYPE_null; + } + else + { + IggyStringUTF16 stringVal3; + stringVal3.string = (IggyUTF16*)col2.c_str(); + stringVal3.length = col2.length(); + value[7].type = IGGY_DATATYPE_string_UTF16; + value[7].string16 = stringVal3; + } + + if(col3.empty()) + { + value[8].type = IGGY_DATATYPE_null; + } + else + { + IggyStringUTF16 stringVal4; + stringVal4.string = (IggyUTF16*)col3.c_str(); + stringVal4.length = col3.length(); + value[8].type = IGGY_DATATYPE_string_UTF16; + value[8].string16 = stringVal4; + } + + if(col4.empty()) + { + value[9].type = IGGY_DATATYPE_null; + } + else + { + IggyStringUTF16 stringVal5; + stringVal5.string = (IggyUTF16*)col4.c_str(); + stringVal5.length = col4.length(); + value[9].type = IGGY_DATATYPE_string_UTF16; + value[9].string16 = stringVal5; + } + + if(col5.empty()) + { + value[10].type = IGGY_DATATYPE_null; + } + else + { + IggyStringUTF16 stringVal6; + stringVal6.string = (IggyUTF16*)col5.c_str(); + stringVal6.length = col5.length(); + value[10].type = IGGY_DATATYPE_string_UTF16; + value[10].string16 = stringVal6; + } + + if(col6.empty()) + { + value[11].type = IGGY_DATATYPE_null; + } + else + { + IggyStringUTF16 stringVal7; + stringVal7.string = (IggyUTF16*)col6.c_str(); + stringVal7.length = col6.length(); + value[11].type = IGGY_DATATYPE_string_UTF16; + value[11].string16 = stringVal7; + } + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath(), m_funcAddDataSet , 12 , value ); +} + +#ifdef __PSVITA__ +void UIControl_LeaderboardList::SetTouchFocus(S32 iX, S32 iY, bool bRepeat) +{ + IggyDataValue result; + IggyDataValue value[3]; + + value[0].type = IGGY_DATATYPE_number; + value[0].number = iX; + value[1].type = IGGY_DATATYPE_number; + value[1].number = iY; + value[2].type = IGGY_DATATYPE_boolean; + value[2].boolval = bRepeat; + + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie(), &result, getIggyValuePath(), m_funcSetTouchFocus, 3 , value ); +} +#endif \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIControl_LeaderboardList.h b/Minecraft.Client/Common/UI/UIControl_LeaderboardList.h new file mode 100644 index 00000000..e102ddd7 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_LeaderboardList.h @@ -0,0 +1,50 @@ +#pragma once + +#include "UIControl_Base.h" + +class UIControl_LeaderboardList : public UIControl_Base +{ +private: + IggyName m_funcInitLeaderboard, m_funcAddDataSet; + IggyName m_funcResetLeaderboard; + IggyName m_funcSetupTitles, m_funcSetColumnIcon; +#ifdef __PSVITA__ + IggyName m_funcSetTouchFocus; + bool m_bTouchInitialised; +#endif +public: + enum ELeaderboardIcons + { + e_ICON_TYPE_IGGY = 0, + e_ICON_TYPE_CLIMBED = 32001, + e_ICON_TYPE_FALLEN = 32002, + e_ICON_TYPE_WALKED = 32003, + e_ICON_TYPE_SWAM = 32004, + e_ICON_TYPE_ZOMBIE = 32005, + e_ICON_TYPE_ZOMBIEPIGMAN = 32006, + e_ICON_TYPE_GHAST = 32007, + e_ICON_TYPE_CREEPER = 32008, + e_ICON_TYPE_SKELETON = 32009, + e_ICON_TYPE_SPIDER = 32010, + e_ICON_TYPE_SPIDERJOKEY = 32011, + e_ICON_TYPE_SLIME = 32012, + e_ICON_TYPE_PORTAL = 32013, + }; + UIControl_LeaderboardList(); + + virtual bool setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName); + + void init(int id); + virtual void ReInit(); + + void clearList(); + + void setupTitles(const wstring &rank, const wstring &gamertag); + void initLeaderboard(int iFirstFocus, int iTotalEntries, int iNumColumns); + void setColumnIcon(int iColumn, int iType); + void addDataSet(bool bLast, int iId, int iRank, const wstring &gamertag, bool bDisplayMessage, const wstring &col0, const wstring &col1, const wstring &col2, const wstring &col3, const wstring &col4, const wstring &col5, const wstring &col6); + +#ifdef __PSVITA__ + void SetTouchFocus(S32 iX, S32 iY, bool bRepeat); +#endif +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIControl_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 new file mode 100644 index 00000000..d0625bce --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_MinecraftPlayer.cpp @@ -0,0 +1,94 @@ +#include "stdafx.h" +#include "..\..\Minecraft.h" +#include "..\..\ScreenSizeCalculator.h" +#include "..\..\EntityRenderDispatcher.h" +#include "..\..\PlayerRenderer.h" +#include "..\..\HumanoidModel.h" +#include "..\..\Lighting.h" +#include "..\..\ModelPart.h" +#include "..\..\Options.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.entity.player.h" +#include "..\..\MultiplayerLocalPlayer.h" +#include "UI.h" +#include "UIControl_MinecraftPlayer.h" + +UIControl_MinecraftPlayer::UIControl_MinecraftPlayer() +{ + UIControl::setControlType(UIControl::eMinecraftPlayer); + + Minecraft *pMinecraft=Minecraft::GetInstance(); + + ScreenSizeCalculator ssc(pMinecraft->options, pMinecraft->width_phys, pMinecraft->height_phys); + m_fScreenWidth=(float)pMinecraft->width_phys; + m_fRawWidth=(float)ssc.rawWidth; + m_fScreenHeight=(float)pMinecraft->height_phys; + m_fRawHeight=(float)ssc.rawHeight; +} + +void UIControl_MinecraftPlayer::render(IggyCustomDrawCallbackRegion *region) +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + glEnable(GL_RESCALE_NORMAL); + glEnable(GL_COLOR_MATERIAL); + glPushMatrix(); + + float width = region->x1 - region->x0; + float height = region->y1 - region->y0; + float xo = width/2; + float yo = height; + + // dynamic y offset according to region height + glTranslatef(xo, yo - (height / 9.0f), 50.0f); + + float ss; + + // Base scale on height of this control + // Potentially we might want separate x & y scales here + ss = width / (m_fScreenWidth / m_fScreenHeight); + + glScalef(-ss, ss, ss); + glRotatef(180, 0, 0, 1); + + UIScene_InventoryMenu *containerMenu = (UIScene_InventoryMenu *)m_parentScene; + + float oybr = pMinecraft->localplayers[containerMenu->getPad()]->yBodyRot; + float oyr = pMinecraft->localplayers[containerMenu->getPad()]->yRot; + float oxr = pMinecraft->localplayers[containerMenu->getPad()]->xRot; + float oyhr = pMinecraft->localplayers[containerMenu->getPad()]->yHeadRot; + + //float xd = ( matrix._41 + ( (bwidth*matrix._11)/2) ) - m_pointerPos.x; + float xd = (m_x + m_width/2) - containerMenu->m_pointerPos.x; + + // Need to base Y on head position, not centre of mass + //float yd = ( matrix._42 + ( (bheight*matrix._22) / 2) - 40 ) - m_pointerPos.y; + float yd = (m_y + m_height/2 - 40) - containerMenu->m_pointerPos.y; + + glRotatef(45 + 90, 0, 1, 0); + Lighting::turnOn(); + glRotatef(-45 - 90, 0, 1, 0); + + glRotatef(-(float) atan(yd / 40.0f) * 20, 1, 0, 0); + + pMinecraft->localplayers[containerMenu->getPad()]->yBodyRot = (float) atan(xd / 40.0f) * 20; + pMinecraft->localplayers[containerMenu->getPad()]->yRot = (float) atan(xd / 40.0f) * 40; + pMinecraft->localplayers[containerMenu->getPad()]->xRot = -(float) atan(yd / 40.0f) * 20; + pMinecraft->localplayers[containerMenu->getPad()]->yHeadRot = pMinecraft->localplayers[containerMenu->getPad()]->yRot; + //pMinecraft->localplayers[m_iPad]->glow = 1; + glTranslatef(0, pMinecraft->localplayers[containerMenu->getPad()]->heightOffset, 0); + EntityRenderDispatcher::instance->playerRotY = 180; + + // 4J Stu - Turning on hideGui while we do this stops the name rendering in split-screen + bool wasHidingGui = pMinecraft->options->hideGui; + pMinecraft->options->hideGui = true; + EntityRenderDispatcher::instance->render(pMinecraft->localplayers[containerMenu->getPad()], 0, 0, 0, 0, 1, false, false); + pMinecraft->options->hideGui = wasHidingGui; + //pMinecraft->localplayers[m_iPad]->glow = 0; + + pMinecraft->localplayers[containerMenu->getPad()]->yBodyRot = oybr; + pMinecraft->localplayers[containerMenu->getPad()]->yRot = oyr; + pMinecraft->localplayers[containerMenu->getPad()]->xRot = oxr; + pMinecraft->localplayers[containerMenu->getPad()]->yHeadRot = oyhr; + glPopMatrix(); + Lighting::turnOff(); + glDisable(GL_RESCALE_NORMAL); +} diff --git a/Minecraft.Client/Common/UI/UIControl_MinecraftPlayer.h b/Minecraft.Client/Common/UI/UIControl_MinecraftPlayer.h new file mode 100644 index 00000000..3b032f76 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_MinecraftPlayer.h @@ -0,0 +1,15 @@ +#pragma once + +#include "UIControl.h" + +class UIControl_MinecraftPlayer : public UIControl +{ +private: + float m_fScreenWidth,m_fScreenHeight; + float m_fRawWidth,m_fRawHeight; + +public: + UIControl_MinecraftPlayer(); + + void render(IggyCustomDrawCallbackRegion *region); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIControl_PlayerList.cpp b/Minecraft.Client/Common/UI/UIControl_PlayerList.cpp new file mode 100644 index 00000000..41534dc2 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_PlayerList.cpp @@ -0,0 +1,65 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIControl_PlayerList.h" + +bool UIControl_PlayerList::setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName) +{ + UIControl::setControlType(UIControl::ePlayerList); + bool success = UIControl_ButtonList::setupControl(scene,parent,controlName); + + //SlotList specific initialisers + m_funcSetPlayerIcon = registerFastName(L"SetPlayerIcon"); + m_funcSetVOIPIcon = registerFastName(L"SetVOIPIcon"); + + return success; +} + +void UIControl_PlayerList::addItem(const wstring &label, int iPlayerIcon, int iVOIPIcon) +{ + IggyDataValue result; + IggyDataValue value[4]; + + IggyStringUTF16 stringVal; + stringVal.string = (IggyUTF16*)label.c_str(); + stringVal.length = (S32)label.length(); + value[0].type = IGGY_DATATYPE_string_UTF16; + value[0].string16 = stringVal; + + value[1].type = IGGY_DATATYPE_number; + value[1].number = m_itemCount; + + value[2].type = IGGY_DATATYPE_number; + value[2].number = iPlayerIcon + 1; + + value[3].type = IGGY_DATATYPE_number; + value[3].number = iVOIPIcon + 1; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath(), m_addNewItemFunc , 4 , value ); + + ++m_itemCount; +} + +void UIControl_PlayerList::setPlayerIcon(int iId, int iPlayerIcon) +{ + IggyDataValue result; + IggyDataValue value[2]; + + value[0].type = IGGY_DATATYPE_number; + value[0].number = iId; + + value[1].type = IGGY_DATATYPE_number; + value[1].number = iPlayerIcon + 1; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath(), m_funcSetPlayerIcon , 2 , value ); +} + +void UIControl_PlayerList::setVOIPIcon(int iId, int iVOIPIcon) +{ + IggyDataValue result; + IggyDataValue value[2]; + + value[0].type = IGGY_DATATYPE_number; + value[0].number = iId; + + value[1].type = IGGY_DATATYPE_number; + value[1].number = iVOIPIcon + 1; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath(), m_funcSetVOIPIcon , 2 , value ); +} diff --git a/Minecraft.Client/Common/UI/UIControl_PlayerList.h b/Minecraft.Client/Common/UI/UIControl_PlayerList.h new file mode 100644 index 00000000..8647d950 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_PlayerList.h @@ -0,0 +1,17 @@ +#pragma once + +#include "UIControl_ButtonList.h" + +class UIControl_PlayerList : public UIControl_ButtonList +{ +private: + IggyName m_funcSetPlayerIcon, m_funcSetVOIPIcon; + +public: + virtual bool setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName); + + using UIControl_ButtonList::addItem; + void addItem(const wstring &label, int iPlayerIcon, int iVOIPIcon); + void setPlayerIcon(int iId, int iPlayerIcon); + void setVOIPIcon(int iId, int iVOIPIcon); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIControl_PlayerSkinPreview.cpp b/Minecraft.Client/Common/UI/UIControl_PlayerSkinPreview.cpp new file mode 100644 index 00000000..2d7c0224 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_PlayerSkinPreview.cpp @@ -0,0 +1,519 @@ +#include "stdafx.h" +#include "..\..\Minecraft.h" +#include "..\..\ScreenSizeCalculator.h" +#include "..\..\EntityRenderDispatcher.h" +#include "..\..\PlayerRenderer.h" +#include "..\..\HumanoidModel.h" +#include "..\..\Lighting.h" +#include "..\..\ModelPart.h" +#include "..\..\Options.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.entity.player.h" +#include "UIControl_PlayerSkinPreview.h" + +//#define SKIN_PREVIEW_BOB_ANIM +#define SKIN_PREVIEW_WALKING_ANIM + +UIControl_PlayerSkinPreview::UIControl_PlayerSkinPreview() +{ + UIControl::setControlType(UIControl::ePlayerSkinPreview); + m_bDirty = FALSE; + m_fScale = 1.0f; + m_fAlpha = 1.0f; + + Minecraft *pMinecraft=Minecraft::GetInstance(); + + ScreenSizeCalculator ssc(pMinecraft->options, pMinecraft->width_phys, pMinecraft->height_phys); + m_fScreenWidth=(float)pMinecraft->width_phys; + m_fRawWidth=(float)ssc.rawWidth; + m_fScreenHeight=(float)pMinecraft->height_phys; + m_fRawHeight=(float)ssc.rawHeight; + + m_customTextureUrl = L"default"; + m_backupTexture = TN_MOB_CHAR; + m_capeTextureUrl = L""; + + m_yRot = 0; + m_xRot = 0; + + m_swingTime = 0.0f; + m_bobTick = 0.0f; + m_walkAnimSpeedO = 0.0f; + m_walkAnimSpeed = 0.0f; + m_walkAnimPos = 0.0f; + + m_bAutoRotate = false; + m_bRotatingLeft = false; + + m_incXRot = false; + m_decXRot = false; + m_incYRot = false; + m_decYRot = false; + + m_currentAnimation = e_SkinPreviewAnimation_Walking; + + m_fTargetRotation = 0.0f; + m_fOriginalRotation = 0.0f; + m_framesAnimatingRotation = 0; + m_bAnimatingToFacing = false; + m_pvAdditionalModelParts=NULL; + m_uiAnimOverrideBitmask=0L; +} + +void UIControl_PlayerSkinPreview::tick() +{ + UIControl::tick(); + + if( m_bAnimatingToFacing ) + { + ++m_framesAnimatingRotation; + m_yRot = m_fOriginalRotation + m_framesAnimatingRotation * ( (m_fTargetRotation - m_fOriginalRotation) / CHANGING_SKIN_FRAMES ); + + //if(m_framesAnimatingRotation == CHANGING_SKIN_FRAMES) m_bAnimatingToFacing = false; + } + else + { + if( m_incXRot ) IncrementXRotation(); + if( m_decXRot ) DecrementXRotation(); + if( m_incYRot ) IncrementYRotation(); + if( m_decYRot ) DecrementYRotation(); + + if(m_bAutoRotate) + { + ++m_rotateTick; + + if(m_rotateTick%4==0) + { + if(m_yRot >= LOOK_LEFT_EXTENT) + { + m_bRotatingLeft = false; + } + else if(m_yRot <= LOOK_RIGHT_EXTENT) + { + m_bRotatingLeft = true; + } + + if(m_bRotatingLeft) + { + IncrementYRotation(); + } + else + { + DecrementYRotation(); + } + } + } + } +} + +void UIControl_PlayerSkinPreview::SetTexture(const wstring &url, TEXTURE_NAME backupTexture) +{ + m_customTextureUrl = url; + m_backupTexture = backupTexture; + + unsigned int uiAnimOverrideBitmask = Player::getSkinAnimOverrideBitmask( app.getSkinIdFromPath(m_customTextureUrl) ); + + if(app.GetGameSettings(eGameSetting_CustomSkinAnim)==0 ) + { + // We have a force animation for some skins (claptrap) + // 4J-PB - treat all the eAnim_Disable flags as a force anim + + if((uiAnimOverrideBitmask & HumanoidModel::m_staticBitmaskIgnorePlayerCustomAnimSetting)!=0) + { + m_uiAnimOverrideBitmask=uiAnimOverrideBitmask; + } + else + { + m_uiAnimOverrideBitmask=0; + } + } + else + { + m_uiAnimOverrideBitmask = uiAnimOverrideBitmask; + } + + m_pvAdditionalModelParts=app.GetAdditionalModelParts(app.getSkinIdFromPath(m_customTextureUrl)); +} + +void UIControl_PlayerSkinPreview::SetFacing(ESkinPreviewFacing facing, bool bAnimate /*= false*/) +{ + switch(facing) + { + case e_SkinPreviewFacing_Forward: + m_fTargetRotation = 0; + m_bRotatingLeft = true; + break; + case e_SkinPreviewFacing_Left: + m_fTargetRotation = LOOK_LEFT_EXTENT; + m_bRotatingLeft = false; + break; + case e_SkinPreviewFacing_Right: + m_fTargetRotation = LOOK_RIGHT_EXTENT; + m_bRotatingLeft = true; + break; + } + + if(!bAnimate) + { + m_yRot = m_fTargetRotation; + m_bAnimatingToFacing = false; + } + else + { + m_fOriginalRotation = m_yRot; + m_bAnimatingToFacing = true; + m_framesAnimatingRotation = 0; + } +} + +void UIControl_PlayerSkinPreview::CycleNextAnimation() +{ + m_currentAnimation = (ESkinPreviewAnimations)(m_currentAnimation + 1); + if(m_currentAnimation >= e_SkinPreviewAnimation_Count) m_currentAnimation = e_SkinPreviewAnimation_Walking; + + m_swingTime = 0.0f; +} + +void UIControl_PlayerSkinPreview::CyclePreviousAnimation() +{ + m_currentAnimation = (ESkinPreviewAnimations)(m_currentAnimation - 1); + if(m_currentAnimation < e_SkinPreviewAnimation_Walking) m_currentAnimation = (ESkinPreviewAnimations)(e_SkinPreviewAnimation_Count - 1); + + m_swingTime = 0.0f; +} + +void UIControl_PlayerSkinPreview::render(IggyCustomDrawCallbackRegion *region) +{ + Minecraft *pMinecraft=Minecraft::GetInstance(); + + glEnable(GL_RESCALE_NORMAL); + glEnable(GL_COLOR_MATERIAL); + glPushMatrix(); + + float width = region->x1 - region->x0; + float height = region->y1 - region->y0; + float xo = width/2; + float yo = height; + + glTranslatef(xo, yo - 3.5f, 50.0f); + //glTranslatef(120.0f, 294, 0.0f); + + float ss; + + // Base scale on height of this control + // Potentially we might want separate x & y scales here + ss = width / (m_fScreenWidth / m_fScreenHeight); + + glScalef(-ss, ss, ss); + glRotatef(180, 0, 0, 1); + + //glRotatef(45 + 90, 0, 1, 0); + Lighting::turnOn(); + //glRotatef(-45 - 90, 0, 1, 0); + + glRotatef(-(float)m_xRot, 1, 0, 0); + + // 4J Stu - Turning on hideGui while we do this stops the name rendering in split-screen + bool wasHidingGui = pMinecraft->options->hideGui; + pMinecraft->options->hideGui = true; + + //EntityRenderDispatcher::instance->render(pMinecraft->localplayers[0], 0, 0, 0, 0, 1); + EntityRenderer *renderer = EntityRenderDispatcher::instance->getRenderer(eTYPE_LOCALPLAYER); + if (renderer != NULL) + { + // 4J-PB - any additional parts to turn on for this player (skin dependent) + //vector *pAdditionalModelParts=mob->GetAdditionalModelParts(); + + if(m_pvAdditionalModelParts && m_pvAdditionalModelParts->size()!=0) + { + for(AUTO_VAR(it, m_pvAdditionalModelParts->begin()); it != m_pvAdditionalModelParts->end(); ++it) + { + ModelPart *pModelPart=*it; + + pModelPart->visible=true; + } + } + + render(renderer,0,0,0,0,1); + //renderer->postRender(entity, x, y, z, rot, a); + + // hide the additional parts + if(m_pvAdditionalModelParts && m_pvAdditionalModelParts->size()!=0) + { + for(AUTO_VAR(it, m_pvAdditionalModelParts->begin()); it != m_pvAdditionalModelParts->end(); ++it) + { + ModelPart *pModelPart=*it; + + pModelPart->visible=false; + } + } + } + + pMinecraft->options->hideGui = wasHidingGui; + + glPopMatrix(); + Lighting::turnOff(); + glDisable(GL_RESCALE_NORMAL); +} + +// 4J Stu - Modified version of MobRenderer::render that does not require an actual entity +void UIControl_PlayerSkinPreview::render(EntityRenderer *renderer, double x, double y, double z, float rot, float a) +{ + glPushMatrix(); + glDisable(GL_CULL_FACE); + + HumanoidModel *model = (HumanoidModel *)renderer->getModel(); + + //getAttackAnim(mob, a); + //if (armor != NULL) armor->attackTime = model->attackTime; + //model->riding = mob->isRiding(); + //if (armor != NULL) armor->riding = model->riding; + + // 4J Stu - Remember to reset these values once the rendering is done if you add another one + model->attackTime = 0; + model->sneaking = false; + model->holdingRightHand = false; + model->holdingLeftHand = false; + model->idle = false; + model->eating = false; + model->eating_swing = 0; + model->eating_t = 0; + model->young = false; + model->riding = false; + + model->m_uiAnimOverrideBitmask = m_uiAnimOverrideBitmask; + + if( !m_bAnimatingToFacing ) + { + switch( m_currentAnimation ) + { + case e_SkinPreviewAnimation_Sneaking: + model->sneaking = true; + break; + case e_SkinPreviewAnimation_Attacking: + model->holdingRightHand = true; + m_swingTime++; + if (m_swingTime >= (Player::SWING_DURATION * 3) ) + { + m_swingTime = 0; + } + model->attackTime = m_swingTime / (float) (Player::SWING_DURATION * 3); + break; + default: + break; + }; + } + + + float bodyRot = m_yRot; //(mob->yBodyRotO + (mob->yBodyRot - mob->yBodyRotO) * a); + float headRot = m_yRot; //(mob->yRotO + (mob->yRot - mob->yRotO) * a); + float headRotx = 0; //(mob->xRotO + (mob->xRot - mob->xRotO) * a); + + //setupPosition(mob, x, y, z); + // is equivalent to + glTranslatef((float) x, (float) y, (float) z); + + //float bob = getBob(mob, a); +#ifdef SKIN_PREVIEW_BOB_ANIM + float bob = (m_bobTick + a)/2; + + ++m_bobTick; + if(m_bobTick>=360*2) m_bobTick = 0; +#else + float bob = 0.0f; +#endif + + //setupRotations(mob, bob, bodyRot, a); + // is equivalent to + glRotatef(180 - bodyRot, 0, 1, 0); + + float _scale = 1 / 16.0f; + glEnable(GL_RESCALE_NORMAL); + glScalef(-1, -1, 1); + + //scale(mob, a); + // is equivalent to + float s = 15 / 16.0f; + glScalef(s, s, s); + + // 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; + m_walkAnimSpeed += (0.1f - m_walkAnimSpeed) * 0.4f; + m_walkAnimPos += m_walkAnimSpeed; + float ws = m_walkAnimSpeedO + (m_walkAnimSpeed - m_walkAnimSpeedO) * a; + float wp = m_walkAnimPos - m_walkAnimSpeed * (1 - a); +#else + float ws = 0; + float wp = 0; +#endif + + if (ws > 1) ws = 1; + + MemSect(31); + bindTexture(m_customTextureUrl, m_backupTexture); + MemSect(0); + glEnable(GL_ALPHA_TEST); + + //model->prepareMobModel(mob, wp, ws, a); + model->render(nullptr, wp, ws, bob, headRot - bodyRot, headRotx, _scale, true); + /*for (int i = 0; i < MAX_ARMOR_LAYERS; i++) + { + if (prepareArmor(mob, i, a)) + { + armor->render(wp, ws, bob, headRot - bodyRot, headRotx, _scale, true); + glDisable(GL_BLEND); + glEnable(GL_ALPHA_TEST); + } + }*/ + + //additionalRendering(mob, a); + if (bindTexture(m_capeTextureUrl, L"" )) + { + glPushMatrix(); + glTranslatef(0, 0, 2 / 16.0f); + + double xd = 0;//(mob->xCloakO + (mob->xCloak - mob->xCloakO) * a) - (mob->xo + (mob->x - mob->xo) * a); + double yd = 0;//(mob->yCloakO + (mob->yCloak - mob->yCloakO) * a) - (mob->yo + (mob->y - mob->yo) * a); + double zd = 0;//(mob->zCloakO + (mob->zCloak - mob->zCloakO) * a) - (mob->zo + (mob->z - mob->zo) * a); + + float yr = 1;//mob->yBodyRotO + (mob->yBodyRot - mob->yBodyRotO) * a; + + double xa = sin(yr * PI / 180); + double za = -cos(yr * PI / 180); + + float flap = (float) yd * 10; + if (flap < -6) flap = -6; + if (flap > 32) flap = 32; + float lean = (float) (xd * xa + zd * za) * 100; + float lean2 = (float) (xd * za - zd * xa) * 100; + if (lean < 0) lean = 0; + + //float pow = 1;//mob->oBob + (bob - mob->oBob) * a; + + flap += 1;//sin((mob->walkDistO + (mob->walkDist - mob->walkDistO) * a) * 6) * 32 * pow; + if (model->sneaking) + { + flap += 25; + } + + glRotatef(6.0f + lean / 2 + flap, 1, 0, 0); + glRotatef(lean2 / 2, 0, 0, 1); + glRotatef(-lean2 / 2, 0, 1, 0); + glRotatef(180, 0, 1, 0); + model->renderCloak(1 / 16.0f,true); + glPopMatrix(); + } + /* + float br = mob->getBrightness(a); + int overlayColor = getOverlayColor(mob, br, a); + + if (((overlayColor >> 24) & 0xff) > 0 || mob->hurtTime > 0 || mob->deathTime > 0) + { + glDisable(GL_TEXTURE_2D); + glDisable(GL_ALPHA_TEST); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glDepthFunc(GL_EQUAL); + + // 4J - changed these renders to not use the compiled version of their models, because otherwise the render states set + // about (in particular the depth & alpha test) don't work with our command buffer versions + if (mob->hurtTime > 0 || mob->deathTime > 0) + { + glColor4f(br, 0, 0, 0.4f); + model->render(wp, ws, bob, headRot - bodyRot, headRotx, _scale, false); + for (int i = 0; i < MAX_ARMOR_LAYERS; i++) + { + if (prepareArmorOverlay(mob, i, a)) + { + glColor4f(br, 0, 0, 0.4f); + armor->render(wp, ws, bob, headRot - bodyRot, headRotx, _scale, false); + } + } + } + + if (((overlayColor >> 24) & 0xff) > 0) + { + float r = ((overlayColor >> 16) & 0xff) / 255.0f; + float g = ((overlayColor >> 8) & 0xff) / 255.0f; + float b = ((overlayColor) & 0xff) / 255.0f; + float aa = ((overlayColor >> 24) & 0xff) / 255.0f; + glColor4f(r, g, b, aa); + model->render(wp, ws, bob, headRot - bodyRot, headRotx, _scale, false); + for (int i = 0; i < MAX_ARMOR_LAYERS; i++) + { + if (prepareArmorOverlay(mob, i, a)) + { + glColor4f(r, g, b, aa); + armor->render(wp, ws, bob, headRot - bodyRot, headRotx, _scale, false); + } + } + } + + glDepthFunc(GL_LEQUAL); + glDisable(GL_BLEND); + glEnable(GL_ALPHA_TEST); + glEnable(GL_TEXTURE_2D); + } + */ + glDisable(GL_RESCALE_NORMAL); + + glEnable(GL_CULL_FACE); + + glPopMatrix(); + + MemSect(31); + //renderName(mob, x, y, z); + MemSect(0); + + // Reset the model values to stop the changes we made here affecting anything in game (like the player hand render) + model->attackTime = 0; + model->sneaking = false; + model->holdingRightHand = false; + model->holdingLeftHand = false; +} + +bool UIControl_PlayerSkinPreview::bindTexture(const wstring& urlTexture, int backupTexture) +{ + Textures *t = Minecraft::GetInstance()->textures; + + // 4J-PB - no http textures on the xbox, mem textures instead + + //int id = t->loadHttpTexture(urlTexture, backupTexture); + int id = t->loadMemTexture(urlTexture, backupTexture); + + if (id >= 0) + { + t->bind(id); + return true; + } + else + { + return false; + } +} + +bool UIControl_PlayerSkinPreview::bindTexture(const wstring& urlTexture, const wstring& backupTexture) +{ + Textures *t = Minecraft::GetInstance()->textures; + + // 4J-PB - no http textures on the xbox, mem textures instead + + //int id = t->loadHttpTexture(urlTexture, backupTexture); + int id = t->loadMemTexture(urlTexture, backupTexture); + + if (id >= 0) + { + t->bind(id); + return true; + } + else + { + return false; + } +} diff --git a/Minecraft.Client/Common/UI/UIControl_PlayerSkinPreview.h b/Minecraft.Client/Common/UI/UIControl_PlayerSkinPreview.h new file mode 100644 index 00000000..a7c3126e --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_PlayerSkinPreview.h @@ -0,0 +1,90 @@ +#pragma once + +#include "UIControl.h" +#include "..\..\Textures.h" + +class ModelPart; +class EntityRenderer; + +class UIControl_PlayerSkinPreview : public UIControl +{ +private: + static const int LOOK_LEFT_EXTENT = 45; + static const int LOOK_RIGHT_EXTENT = -45; + + static const int CHANGING_SKIN_FRAMES = 15; + + enum ESkinPreviewAnimations + { + e_SkinPreviewAnimation_Walking, + e_SkinPreviewAnimation_Sneaking, + e_SkinPreviewAnimation_Attacking, + + e_SkinPreviewAnimation_Count, + }; + + BOOL m_bDirty; + float m_fScale,m_fAlpha; + + wstring m_customTextureUrl; + TEXTURE_NAME m_backupTexture; + wstring m_capeTextureUrl; + unsigned int m_uiAnimOverrideBitmask; + + float m_fScreenWidth,m_fScreenHeight; + float m_fRawWidth,m_fRawHeight; + + int m_yRot,m_xRot; + + float m_bobTick; + + float m_walkAnimSpeedO; + float m_walkAnimSpeed; + float m_walkAnimPos; + + bool m_bAutoRotate, m_bRotatingLeft; + BYTE m_rotateTick; + float m_fTargetRotation, m_fOriginalRotation; + int m_framesAnimatingRotation; + bool m_bAnimatingToFacing; + + float m_swingTime; + + ESkinPreviewAnimations m_currentAnimation; + //vector *m_pvAdditionalBoxes; + vector *m_pvAdditionalModelParts; +public: + enum ESkinPreviewFacing + { + e_SkinPreviewFacing_Forward, + e_SkinPreviewFacing_Left, + e_SkinPreviewFacing_Right, + }; + + UIControl_PlayerSkinPreview(); + + virtual void tick(); + + void render(IggyCustomDrawCallbackRegion *region); + + void SetTexture(const wstring &url, TEXTURE_NAME backupTexture = TN_MOB_CHAR); + void SetCapeTexture(const wstring &url) { m_capeTextureUrl = url; } + void ResetRotation() { m_xRot = 0; m_yRot = 0; } + void IncrementYRotation() { m_yRot = (m_yRot+4); if(m_yRot >= 180) m_yRot = -180; } + void DecrementYRotation() { m_yRot = (m_yRot-4); if(m_yRot <= -180) m_yRot = 180; } + void IncrementXRotation() { m_xRot = (m_xRot+2); if(m_xRot > 22) m_xRot = 22; } + void DecrementXRotation() { m_xRot = (m_xRot-2); if(m_xRot < -22) m_xRot = -22; } + void SetAutoRotate(bool autoRotate) { m_bAutoRotate = autoRotate; } + void SetFacing(ESkinPreviewFacing facing, bool bAnimate = false); + + void CycleNextAnimation(); + void CyclePreviousAnimation(); + + bool m_incXRot, m_decXRot; + bool m_incYRot, m_decYRot; + +private: + void render(EntityRenderer *renderer, double x, double y, double z, float rot, float a); + bool bindTexture(const wstring& urlTexture, int backupTexture); + bool bindTexture(const wstring& urlTexture, const wstring& backupTexture); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIControl_Progress.cpp b/Minecraft.Client/Common/UI/UIControl_Progress.cpp new file mode 100644 index 00000000..78e7c1d0 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_Progress.cpp @@ -0,0 +1,84 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIControl_Progress.h" + +UIControl_Progress::UIControl_Progress() +{ + m_min = 0; + m_max = 100; + m_current = 0; + m_lastPercent = 0.0f; + m_showingBar = true; +} + +bool UIControl_Progress::setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName) +{ + UIControl::setControlType(UIControl::eProgress); + bool success = UIControl_Base::setupControl(scene,parent,controlName); + + //Progress specific initialisers + m_setProgressFunc = registerFastName(L"setProgress"); + m_showBarFunc = registerFastName(L"ShowBar"); + + return success; +} + +void UIControl_Progress::init(UIString label, int id, int min, int max, int current) +{ + m_label = label; + m_id = id; + m_min = min; + m_max = max; + m_current = current; + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_string_UTF16; + IggyStringUTF16 stringVal; + + stringVal.string = (IggyUTF16*)label.c_str(); + stringVal.length = label.length(); + value[0].string16 = stringVal; + + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_initFunc , 1 , value ); +} + +void UIControl_Progress::ReInit() +{ + UIControl_Base::ReInit(); + init(m_label, m_id, m_min, m_max, m_current); +} + +void UIControl_Progress::setProgress(int current) +{ + m_current = current; + + float percent = (float)((m_current-m_min))/(m_max-m_min); + + if(percent != m_lastPercent) + { + m_lastPercent = percent; + //app.DebugPrintf("Setting progress value to %d/%f\n", m_current, percent); + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = percent; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_setProgressFunc , 1 , value ); + } +} + +void UIControl_Progress::showBar(bool show) +{ + if(show != m_showingBar) + { + m_showingBar = show; + //app.DebugPrintf("Setting progress value to %d/%f\n", m_current, percent); + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_boolean; + value[0].boolval = show; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_showBarFunc , 1 , value ); + } +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIControl_Progress.h b/Minecraft.Client/Common/UI/UIControl_Progress.h new file mode 100644 index 00000000..10601237 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_Progress.h @@ -0,0 +1,25 @@ +#pragma once + +#include "UIControl_Base.h" + +class UIControl_Progress : public UIControl_Base +{ +private: + IggyName m_setProgressFunc, m_showBarFunc; + int m_min; + int m_max; + int m_current; + float m_lastPercent; + bool m_showingBar; + +public: + UIControl_Progress(); + + virtual bool setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName); + + void init(UIString label, int id, int min, int max, int current); + virtual void ReInit(); + + void setProgress(int current); + void showBar(bool show); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIControl_SaveList.cpp b/Minecraft.Client/Common/UI/UIControl_SaveList.cpp new file mode 100644 index 00000000..f83454d7 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_SaveList.cpp @@ -0,0 +1,106 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIControl_SaveList.h" + +bool UIControl_SaveList::setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName) +{ + UIControl::setControlType(UIControl::eSaveList); + bool success = UIControl_ButtonList::setupControl(scene,parent,controlName); + + //SlotList specific initialisers + m_funcSetTextureName = registerFastName(L"SetTextureName"); + + return success; +} + +void UIControl_SaveList::addItem(const wstring &label) +{ + addItem(label, L""); +} + +void UIControl_SaveList::addItem(const string &label) +{ + addItem(label, L""); +} + +void UIControl_SaveList::addItem(const wstring &label, int data) +{ + addItem(label, L"", data); +} + +void UIControl_SaveList::addItem(const string &label, int data) +{ + addItem(label, L"", data); +} + +void UIControl_SaveList::addItem(const string &label, const wstring &iconName) +{ + addItem(label, iconName, m_itemCount); + ++m_itemCount; +} + +void UIControl_SaveList::addItem(const wstring &label, const wstring &iconName) +{ + addItem(label, iconName, m_itemCount); + ++m_itemCount; +} + +void UIControl_SaveList::addItem(const string &label, const wstring &iconName, int data) +{ + IggyDataValue result; + IggyDataValue value[3]; + + IggyStringUTF8 stringVal; + stringVal.string = (char*)label.c_str(); + stringVal.length = (S32)label.length(); + value[0].type = IGGY_DATATYPE_string_UTF8; + value[0].string8 = stringVal; + + value[1].type = IGGY_DATATYPE_number; + value[1].number = m_itemCount; + + IggyStringUTF16 stringVal2; + stringVal2.string = (IggyUTF16*)iconName.c_str(); + stringVal2.length = iconName.length(); + value[2].type = IGGY_DATATYPE_string_UTF16; + value[2].string16 = stringVal2; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath(), m_addNewItemFunc , 3 , value ); +} + +void UIControl_SaveList::addItem(const wstring &label, const wstring &iconName, int data) +{ + IggyDataValue result; + IggyDataValue value[3]; + + IggyStringUTF16 stringVal; + stringVal.string = (IggyUTF16*)label.c_str(); + stringVal.length = (S32)label.length(); + value[0].type = IGGY_DATATYPE_string_UTF16; + value[0].string16 = stringVal; + + value[1].type = IGGY_DATATYPE_number; + value[1].number = m_itemCount; + + IggyStringUTF16 stringVal2; + stringVal2.string = (IggyUTF16*)iconName.c_str(); + stringVal2.length = iconName.length(); + value[2].type = IGGY_DATATYPE_string_UTF16; + value[2].string16 = stringVal2; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath(), m_addNewItemFunc , 3 , value ); +} + +void UIControl_SaveList::setTextureName(int iId, const wstring &iconName) +{ + IggyDataValue result; + IggyDataValue value[2]; + + value[0].type = IGGY_DATATYPE_number; + value[0].number = iId; + + IggyStringUTF16 stringVal; + stringVal.string = (IggyUTF16*)iconName.c_str(); + stringVal.length = iconName.length(); + value[1].type = IGGY_DATATYPE_string_UTF16; + value[1].string16 = stringVal; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath(), m_funcSetTextureName , 2 , value ); +} diff --git a/Minecraft.Client/Common/UI/UIControl_SaveList.h b/Minecraft.Client/Common/UI/UIControl_SaveList.h new file mode 100644 index 00000000..7c72fea9 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_SaveList.h @@ -0,0 +1,29 @@ +#pragma once + +#include "UIControl_ButtonList.h" + +class UIControl_SaveList : public UIControl_ButtonList +{ +private: + IggyName m_funcSetTextureName; + +public: + virtual bool setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName); + + using UIControl_ButtonList::addItem; + + void addItem(const wstring &label); + void addItem(const string &label); + + void addItem(const wstring &label, int data); + void addItem(const string &label, int data); + + void addItem(const string &label, const wstring &iconName); + void addItem(const wstring &label, const wstring &iconName); + void setTextureName(int iId, const wstring &iconName); + +private: + void addItem(const string &label, const wstring &iconName, int data); + void addItem(const wstring &label, const wstring &iconName, int data); + +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIControl_Slider.cpp b/Minecraft.Client/Common/UI/UIControl_Slider.cpp new file mode 100644 index 00000000..c2168002 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_Slider.cpp @@ -0,0 +1,120 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIControl_Slider.h" + +UIControl_Slider::UIControl_Slider() +{ + m_id = 0; + m_min = 0; + m_max = 100; + m_current = 0; +} + +bool UIControl_Slider::setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName) +{ + UIControl::setControlType(UIControl::eSlider); + bool success = UIControl_Base::setupControl(scene,parent,controlName); + + //Slider specific initialisers + m_funcSetRelativeSliderPos = registerFastName(L"SetRelativeSliderPos"); + m_funcGetRealWidth = registerFastName(L"GetRealWidth"); + + return success; +} + +void UIControl_Slider::init(UIString label, int id, int min, int max, int current) +{ + m_label = label; + m_id = id; + m_min = min; + m_max = max; + m_current = current; + + IggyDataValue result; + IggyDataValue value[5]; + value[0].type = IGGY_DATATYPE_string_UTF16; + IggyStringUTF16 stringVal; + + stringVal.string = (IggyUTF16*)label.c_str(); + stringVal.length = label.length(); + value[0].string16 = stringVal; + + value[1].type = IGGY_DATATYPE_number; + value[1].number = (int)id; + + value[2].type = IGGY_DATATYPE_number; + value[2].number = (int)min; + + value[3].type = IGGY_DATATYPE_number; + value[3].number = (int)max; + + value[4].type = IGGY_DATATYPE_number; + value[4].number = (int)current; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_initFunc , 5 , value ); + +#ifdef __PSVITA__ + // 4J-TomK - add slider to the vita touch box list + + switch(m_parentScene->GetParentLayer()->m_iLayer) + { + case eUILayer_Fullscreen: + case eUILayer_Scene: + case eUILayer_HUD: + ui.TouchBoxAdd(this,m_parentScene); + break; + } +#endif +} + +void UIControl_Slider::handleSliderMove(int newValue) +{ + if (m_current!=newValue) + { + ui.PlayUISFX(eSFX_Scroll); + m_current = newValue; + + if(newValue < m_allPossibleLabels.size()) + { + setLabel(m_allPossibleLabels[newValue]); + } + } +} + +void UIControl_Slider::SetSliderTouchPos(float fTouchPos) +{ + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = fTouchPos; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_funcSetRelativeSliderPos , 1 , value ); + } + +S32 UIControl_Slider::GetRealWidth() +{ + IggyDataValue result; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_funcGetRealWidth , 0 , NULL ); + + S32 iRealWidth = m_width; + if(result.type == IGGY_DATATYPE_number) + { + iRealWidth = (S32)result.number; + } + return iRealWidth; +} + +void UIControl_Slider::setAllPossibleLabels(int labelCount, wchar_t labels[][256]) +{ + m_allPossibleLabels.clear(); + for(unsigned int i = 0; i < labelCount; ++i) + { + m_allPossibleLabels.push_back(labels[i]); + } + UIControl_Base::setAllPossibleLabels(labelCount, labels); +} + +void UIControl_Slider::ReInit() +{ + UIControl_Base::ReInit(); + + init(m_label, m_id, m_min, m_max, m_current); +} diff --git a/Minecraft.Client/Common/UI/UIControl_Slider.h b/Minecraft.Client/Common/UI/UIControl_Slider.h new file mode 100644 index 00000000..505f6dd2 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_Slider.h @@ -0,0 +1,32 @@ +#pragma once + +#include "UIControl_Base.h" + +class UIControl_Slider : public UIControl_Base +{ +private: + //int m_id; // 4J-TomK this is part of class UIControl and doesn't need to be here! + int m_min; + int m_max; + int m_current; + + vector m_allPossibleLabels; + + // 4J-TomK - function for setting slider position on touch + IggyName m_funcSetRelativeSliderPos; + IggyName m_funcGetRealWidth; + +public: + UIControl_Slider(); + + virtual bool setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName); + + void init(UIString label, int id, int min, int max, int current); + + void handleSliderMove(int newValue); + void SetSliderTouchPos(float fTouchPos); + virtual void setAllPossibleLabels(int labelCount, wchar_t labels[][256]); + + S32 GetRealWidth(); + virtual void ReInit(); +}; diff --git a/Minecraft.Client/Common/UI/UIControl_SlotList.cpp b/Minecraft.Client/Common/UI/UIControl_SlotList.cpp new file mode 100644 index 00000000..01d7b9e5 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_SlotList.cpp @@ -0,0 +1,100 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIControl_SlotList.h" + +UIControl_SlotList::UIControl_SlotList() +{ + m_lastHighlighted = -1; +} + +bool UIControl_SlotList::setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName) +{ + UIControl::setControlType(UIControl::eSlotList); + bool success = UIControl_Base::setupControl(scene,parent,controlName); + + //SlotList specific initialisers + m_addSlotFunc = registerFastName(L"addSlot"); + m_setRedBoxFunc = registerFastName(L"SetSlotRedBox"); + m_setHighlightFunc = registerFastName(L"SetSlotHighlight"); + + m_lastHighlighted = 0; + + return success; +} + +void UIControl_SlotList::ReInit() +{ + UIControl_Base::ReInit(); + + m_lastHighlighted = -1; +} + +void UIControl_SlotList::addSlot(int id) +{ + IggyDataValue result; + IggyDataValue value[3]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = id; + + value[1].type = IGGY_DATATYPE_boolean; + value[1].boolval = false; + value[2].type = IGGY_DATATYPE_boolean; + value[2].boolval = false; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath(), m_addSlotFunc ,3 , value ); +} + +void UIControl_SlotList::addSlots(int iStartValue, int iCount) +{ + for(unsigned int i = iStartValue; i < iStartValue + iCount; ++i) + { + addSlot(i); + } +} + + +void UIControl_SlotList::setHighlightSlot(int index) +{ + if(index != m_lastHighlighted) + { + if(m_lastHighlighted != -1) + { + setSlotHighlighted(m_lastHighlighted, false); + } + setSlotHighlighted(index, true); + m_lastHighlighted = index; + } +} + +void UIControl_SlotList::setSlotHighlighted(int index, bool highlight) +{ + IggyDataValue result; + IggyDataValue value[2]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = index; + + value[1].type = IGGY_DATATYPE_boolean; + value[1].boolval = highlight; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath(), m_setHighlightFunc , 2 , value ); +} + +void UIControl_SlotList::showSlotRedBox(int index, bool show) +{ + //app.DebugPrintf("Setting red box at index %d to %s\n", index, show?"on":"off"); + IggyDataValue result; + IggyDataValue value[2]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = index; + + value[1].type = IGGY_DATATYPE_boolean; + value[1].boolval = show; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath(), m_setRedBoxFunc , 2, value ); +} + +void UIControl_SlotList::setFocus(bool focus) +{ + if(m_lastHighlighted != -1) + { + if(focus) setSlotHighlighted(m_lastHighlighted, true); + else setSlotHighlighted(m_lastHighlighted, false); + } +} diff --git a/Minecraft.Client/Common/UI/UIControl_SlotList.h b/Minecraft.Client/Common/UI/UIControl_SlotList.h new file mode 100644 index 00000000..5bc1dc9a --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_SlotList.h @@ -0,0 +1,30 @@ +#pragma once + +#include "UIControl_Base.h" + +class UIControl_SlotList : public UIControl_Base +{ +private: + //IggyName m_addSlotFunc, m_getSlotFunc, m_setRedBoxFunc, m_setHighlightFunc; + IggyName m_addSlotFunc, m_setRedBoxFunc, m_setHighlightFunc; + + int m_lastHighlighted; + +public: + UIControl_SlotList(); + + virtual bool setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName); + + virtual void ReInit(); + + void addSlot(int id); + void addSlots(int iStartValue, int iCount); + + void setHighlightSlot(int index); + void showSlotRedBox(int index, bool show); + + virtual void setFocus(bool focus); + +private: + void setSlotHighlighted(int index, bool highlight); +}; diff --git a/Minecraft.Client/Common/UI/UIControl_SpaceIndicatorBar.cpp b/Minecraft.Client/Common/UI/UIControl_SpaceIndicatorBar.cpp new file mode 100644 index 00000000..74683a62 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_SpaceIndicatorBar.cpp @@ -0,0 +1,122 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIControl_SpaceIndicatorBar.h" + +UIControl_SpaceIndicatorBar::UIControl_SpaceIndicatorBar() +{ + m_min = 0; + m_max = 100; + m_currentSave = 0; + m_currentTotal = 0; + m_currentOffset = 0.0f; +} + +bool UIControl_SpaceIndicatorBar::setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName) +{ + UIControl::setControlType(UIControl::eProgress); + bool success = UIControl_Base::setupControl(scene,parent,controlName); + + //Progress specific initialisers + m_setSaveSizeFunc = registerFastName(L"setSaveGameSize"); + m_setTotalSizeFunc = registerFastName(L"setTotalSize"); + m_setSaveGameOffsetFunc = registerFastName(L"setSaveGameOffset"); + + return success; +} + +void UIControl_SpaceIndicatorBar::init(UIString label, int id, __int64 min, __int64 max) +{ + m_label = label; + m_id = id; + m_min = min; + m_max = max; + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_string_UTF16; + IggyStringUTF16 stringVal; + + stringVal.string = (IggyUTF16*)label.c_str(); + stringVal.length = label.length(); + value[0].string16 = stringVal; + + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_initFunc , 1 , value ); +} + +void UIControl_SpaceIndicatorBar::ReInit() +{ + UIControl_Base::ReInit(); + init(m_label, m_id, m_min, m_max); + setSaveSize(m_currentSave); + setTotalSize(m_currentTotal); + setSaveGameOffset(m_currentOffset); +} + +void UIControl_SpaceIndicatorBar::reset() +{ + m_sizeAndOffsets.clear(); + m_currentTotal = 0; + setTotalSize(0); + setSaveSize(0); + setSaveGameOffset(0.0f); +} + +void UIControl_SpaceIndicatorBar::addSave(__int64 size) +{ + float startPercent = (float)((m_currentTotal-m_min))/(m_max-m_min); + + m_sizeAndOffsets.push_back( pair<__int64, float>(size, startPercent) ); + + m_currentTotal += size; + setTotalSize(m_currentTotal); +} + +void UIControl_SpaceIndicatorBar::selectSave(int index) +{ + if(index >= 0 && index < m_sizeAndOffsets.size()) + { + pair<__int64,float> values = m_sizeAndOffsets[index]; + setSaveSize(values.first); + setSaveGameOffset(values.second); + } + else + { + setSaveSize(0); + setSaveGameOffset(0); + } +} + +void UIControl_SpaceIndicatorBar::setSaveSize(__int64 size) +{ + m_currentSave = size; + + float percent = (float)((m_currentSave-m_min))/(m_max-m_min); + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = percent; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_setSaveSizeFunc , 1 , value ); +} + +void UIControl_SpaceIndicatorBar::setTotalSize(__int64 size) +{ + float percent = (float)((m_currentTotal-m_min))/(m_max-m_min); + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = percent; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_setTotalSizeFunc , 1 , value ); +} + +void UIControl_SpaceIndicatorBar::setSaveGameOffset(float offset) +{ + m_currentOffset = offset; + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = m_currentOffset; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_setSaveGameOffsetFunc , 1 , value ); +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIControl_SpaceIndicatorBar.h b/Minecraft.Client/Common/UI/UIControl_SpaceIndicatorBar.h new file mode 100644 index 00000000..8eed3944 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_SpaceIndicatorBar.h @@ -0,0 +1,33 @@ +#pragma once + +#include "UIControl_Base.h" + +class UIControl_SpaceIndicatorBar : public UIControl_Base +{ +private: + IggyName m_setSaveSizeFunc, m_setTotalSizeFunc, m_setSaveGameOffsetFunc; + __int64 m_min; + __int64 m_max; + __int64 m_currentSave, m_currentTotal; + float m_currentOffset; + + vector > m_sizeAndOffsets; + +public: + UIControl_SpaceIndicatorBar(); + + virtual bool setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName); + + void init(UIString label, int id, __int64 min, __int64 max); + virtual void ReInit(); + void reset(); + + void addSave(__int64 size); + void selectSave(int index); + + +private: + void setSaveSize(__int64 size); + void setTotalSize(__int64 totalSize); + void setSaveGameOffset(float offset); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIControl_TextInput.cpp b/Minecraft.Client/Common/UI/UIControl_TextInput.cpp new file mode 100644 index 00000000..dc7bc532 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_TextInput.cpp @@ -0,0 +1,83 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIControl_TextInput.h" + +UIControl_TextInput::UIControl_TextInput() +{ + m_bHasFocus = false; +} + +bool UIControl_TextInput::setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName) +{ + UIControl::setControlType(UIControl::eTextInput); + bool success = UIControl_Base::setupControl(scene,parent,controlName); + + //TextInput specific initialisers + m_textName = registerFastName(L"text"); + m_funcChangeState = registerFastName(L"ChangeState"); + m_funcSetCharLimit = registerFastName(L"SetCharLimit"); + + return success; +} + +void UIControl_TextInput::init(UIString label, int id) +{ + m_label = label; + m_id = id; + + IggyDataValue result; + IggyDataValue value[2]; + value[0].type = IGGY_DATATYPE_string_UTF16; + IggyStringUTF16 stringVal; + + stringVal.string = (IggyUTF16*)label.c_str(); + stringVal.length = label.length(); + value[0].string16 = stringVal; + + value[1].type = IGGY_DATATYPE_number; + value[1].number = id; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_initFunc , 2 , value ); + + #ifdef __PSVITA__ + // 4J-TomK - add this buttonlist to the vita touch box list + + switch(m_parentScene->GetParentLayer()->m_iLayer) + { + case eUILayer_Fullscreen: + case eUILayer_Scene: + case eUILayer_HUD: + ui.TouchBoxAdd(this,m_parentScene); + break; + } + #endif +} + +void UIControl_TextInput::ReInit() +{ + UIControl_Base::ReInit(); + + init(m_label, m_id); +} + +void UIControl_TextInput::setFocus(bool focus) +{ + if(m_bHasFocus != focus) + { + m_bHasFocus = focus; + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = focus?0:1; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_funcChangeState , 1 , value ); + } +} + +void UIControl_TextInput::SetCharLimit(int iLimit) +{ + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = iLimit; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_funcSetCharLimit , 1 , value ); +} diff --git a/Minecraft.Client/Common/UI/UIControl_TextInput.h b/Minecraft.Client/Common/UI/UIControl_TextInput.h new file mode 100644 index 00000000..98032d85 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_TextInput.h @@ -0,0 +1,22 @@ +#pragma once + +#include "UIControl_Base.h" + +class UIControl_TextInput : public UIControl_Base +{ +private: + IggyName m_textName, m_funcChangeState, m_funcSetCharLimit; + bool m_bHasFocus; + +public: + UIControl_TextInput(); + + virtual bool setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName); + + void init(UIString label, int id); + void ReInit(); + + virtual void setFocus(bool focus); + + void SetCharLimit(int iLimit); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIControl_TexturePackList.cpp b/Minecraft.Client/Common/UI/UIControl_TexturePackList.cpp new file mode 100644 index 00000000..02336e00 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_TexturePackList.cpp @@ -0,0 +1,145 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIControl_TexturePackList.h" + +UIControl_TexturePackList::UIControl_TexturePackList() +{ +} + +bool UIControl_TexturePackList::setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName) +{ + UIControl::setControlType(UIControl::eTexturePackList); + bool success = UIControl_Base::setupControl(scene,parent,controlName); + + //SlotList specific initialisers + m_addPackFunc = registerFastName(L"addPack"); + m_clearSlotsFunc = registerFastName(L"removeAllItems"); + m_funcSelectSlot = registerFastName(L"SelectSlot"); + m_funcEnableSelector = registerFastName(L"EnableSelector"); + m_funcSetTouchFocus = registerFastName(L"SetTouchFocus"); + m_funcCanTouchTrigger = registerFastName(L"CanTouchTrigger"); + m_funcGetRealHeight = registerFastName(L"GetRealHeight"); + + return success; +} + +void UIControl_TexturePackList::init(const wstring &label, int id) +{ + m_label = label; + m_id = id; + + IggyDataValue result; + IggyDataValue value[2]; + value[0].type = IGGY_DATATYPE_string_UTF16; + IggyStringUTF16 stringVal; + + stringVal.string = (IggyUTF16*)label.c_str(); + stringVal.length = label.length(); + value[0].string16 = stringVal; + + value[1].type = IGGY_DATATYPE_number; + value[1].number = id; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_initFunc , 2 , value ); + +#ifdef __PSVITA__ + // 4J-TomK - add this texturepack list to the vita touch box list + + switch(m_parentScene->GetParentLayer()->m_iLayer) + { + case eUILayer_Fullscreen: + case eUILayer_Scene: + case eUILayer_HUD: + ui.TouchBoxAdd(this,m_parentScene); + break; + } +#endif +} + +void UIControl_TexturePackList::addPack(int id, const wstring &textureName) +{ + IggyDataValue result; + IggyDataValue value[2]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = id; + + value[1].type = IGGY_DATATYPE_string_UTF16; + IggyStringUTF16 stringVal; + + stringVal.string = (IggyUTF16*)textureName.c_str(); + stringVal.length = textureName.length(); + value[1].string16 = stringVal; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath(), m_addPackFunc ,2 , value ); +} + +void UIControl_TexturePackList::selectSlot(int id) +{ + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = id; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath(), m_funcSelectSlot ,1 , value ); +} + +void UIControl_TexturePackList::clearSlots() +{ + IggyDataValue result; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath(), m_clearSlotsFunc ,0 , NULL ); +} + +void UIControl_TexturePackList::setEnabled(bool enable) +{ + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_boolean; + value[0].number = enable; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath(), m_funcEnableSelector ,1 , value ); +} + +void UIControl_TexturePackList::SetTouchFocus(S32 iX, S32 iY, bool bRepeat) +{ + IggyDataValue result; + IggyDataValue value[3]; + + value[0].type = IGGY_DATATYPE_number; + value[0].number = iX; + value[1].type = IGGY_DATATYPE_number; + value[1].number = iY; + value[2].type = IGGY_DATATYPE_boolean; + value[2].boolval = bRepeat; + + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie(), &result, getIggyValuePath(), m_funcSetTouchFocus, 3 , value ); +} + +bool UIControl_TexturePackList::CanTouchTrigger(S32 iX, S32 iY) +{ + IggyDataValue result; + IggyDataValue value[2]; + + value[0].type = IGGY_DATATYPE_number; + value[0].number = iX; + value[1].type = IGGY_DATATYPE_number; + value[1].number = iY; + + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie(), &result, getIggyValuePath(), m_funcCanTouchTrigger, 2 , value ); + + S32 bCanTouchTrigger = false; + if(result.type == IGGY_DATATYPE_boolean) + { + bCanTouchTrigger = (bool)result.boolval; + } + return bCanTouchTrigger; +} + +S32 UIControl_TexturePackList::GetRealHeight() +{ + IggyDataValue result; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_funcGetRealHeight, 0 , NULL ); + + S32 iRealHeight = m_height; + if(result.type == IGGY_DATATYPE_number) + { + iRealHeight = (S32)result.number; + } + return iRealHeight; +} + diff --git a/Minecraft.Client/Common/UI/UIControl_TexturePackList.h b/Minecraft.Client/Common/UI/UIControl_TexturePackList.h new file mode 100644 index 00000000..ce476fb1 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_TexturePackList.h @@ -0,0 +1,27 @@ +#pragma once + +#include "UIControl_Base.h" + +class UIControl_TexturePackList : public UIControl_Base +{ +private: + IggyName m_addPackFunc, m_funcSelectSlot, m_funcSetTouchFocus, m_funcCanTouchTrigger, m_funcGetRealHeight,m_clearSlotsFunc; + IggyName m_funcEnableSelector; + +public: + UIControl_TexturePackList(); + + virtual bool setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName); + + void init(const wstring &label, int id); + + void addPack(int id, const wstring &textureName); + void selectSlot(int id); + void clearSlots(); + + virtual void setEnabled(bool enable); + + void SetTouchFocus(S32 iX, S32 iY, bool bRepeat); + bool CanTouchTrigger(S32 iX, S32 iY); + S32 GetRealHeight(); +}; diff --git a/Minecraft.Client/Common/UI/UIControl_Touch.cpp b/Minecraft.Client/Common/UI/UIControl_Touch.cpp new file mode 100644 index 00000000..bd57882f --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_Touch.cpp @@ -0,0 +1,38 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIControl_Touch.h" + +UIControl_Touch::UIControl_Touch() +{ +} + +bool UIControl_Touch::setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName) +{ + UIControl::setControlType(UIControl::eTouchControl); + bool success = UIControl_Base::setupControl(scene,parent,controlName); + + return success; +} + +void UIControl_Touch::init(int iId) +{ + m_id = iId; + + // 4J-TomK - add this touch control to the vita touch box list + switch(m_parentScene->GetParentLayer()->m_iLayer) + { + case eUILayer_Error: + case eUILayer_Fullscreen: + case eUILayer_Scene: + case eUILayer_HUD: + ui.TouchBoxAdd(this,m_parentScene); + break; + } +} + +void UIControl_Touch::ReInit() +{ + UIControl_Base::ReInit(); + + init(m_id); +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIControl_Touch.h b/Minecraft.Client/Common/UI/UIControl_Touch.h new file mode 100644 index 00000000..8ae799a0 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_Touch.h @@ -0,0 +1,16 @@ +#pragma once + +#include "UIControl_Base.h" + +class UIControl_Touch : public UIControl_Base +{ +private: + +public: + UIControl_Touch(); + + virtual bool setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName); + + void init(int id); + virtual void ReInit(); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIController.cpp b/Minecraft.Client/Common/UI/UIController.cpp new file mode 100644 index 00000000..8a7ffe74 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIController.cpp @@ -0,0 +1,3115 @@ +#include "stdafx.h" +#include "UIController.h" +#include "UI.h" +#include "UIScene.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\LocalPlayer.h" +#include "..\..\DLCTexturePack.h" +#include "..\..\TexturePackRepository.h" +#include "..\..\Minecraft.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.entity.boss.enderdragon.h" +#include "..\..\EnderDragonRenderer.h" +#include "..\..\MultiPlayerLocalPlayer.h" +#include "UIFontData.h" +#ifdef __PSVITA__ +#include +#endif + +// 4J Stu - Enable this to override the Iggy Allocator +//#define ENABLE_IGGY_ALLOCATOR +//#define EXCLUDE_IGGY_ALLOCATIONS_FROM_HEAP_INSPECTOR + +//#define ENABLE_IGGY_EXPLORER +#ifdef ENABLE_IGGY_EXPLORER +#include "Windows64\Iggy\include\iggyexpruntime.h" +#endif + +//#define ENABLE_IGGY_PERFMON +#ifdef ENABLE_IGGY_PERFMON + +#define PM_ORIGIN_X 24 +#define PM_ORIGIN_Y 34 + +#ifdef __ORBIS__ +#include "Orbis\Iggy\include\iggyperfmon.h" +#include "Orbis\Iggy\include\iggyperfmon_orbis.h" +#elif defined _DURANGO +#include "Durango\Iggy\include\iggyperfmon.h" +#elif defined __PS3__ +#include "PS3\Iggy\include\iggyperfmon.h" +#include "PS3\Iggy\include\iggyperfmon_ps3.h" +#elif defined __PSVITA__ +#include "PSVita\Iggy\include\iggyperfmon.h" +#include "PSVita\Iggy\include\iggyperfmon_psp2.h" +#elif defined __WINDOWS64 +#include "Windows64\Iggy\include\iggyperfmon.h" +#endif + +#endif + +CRITICAL_SECTION UIController::ms_reloadSkinCS; +bool UIController::ms_bReloadSkinCSInitialised = false; + +DWORD UIController::m_dwTrialTimerLimitSecs=DYNAMIC_CONFIG_DEFAULT_TRIAL_TIME; + +static void RADLINK WarningCallback(void *user_callback_data, Iggy *player, IggyResult code, const char *message) +{ + //enum IggyResult{ IGGY_RESULT_SUCCESS = 0, IGGY_RESULT_Warning_None = 0, + // IGGY_RESULT_Warning_Misc = 100, IGGY_RESULT_Warning_GDraw = 101, + // IGGY_RESULT_Warning_ProgramFlow = 102, + // IGGY_RESULT_Warning_Actionscript = 103, + // IGGY_RESULT_Warning_Graphics = 104, IGGY_RESULT_Warning_Font = 105, + // IGGY_RESULT_Warning_Timeline = 106, IGGY_RESULT_Warning_Library = 107, + // IGGY_RESULT_Warning_CannotSustainFrameRate = 201, + // IGGY_RESULT_Warning_ThrewException = 202, + // IGGY_RESULT_Error_Threshhold = 400, IGGY_RESULT_Error_Misc = 400, + // IGGY_RESULT_Error_GDraw = 401, IGGY_RESULT_Error_ProgramFlow = 402, + // IGGY_RESULT_Error_Actionscript = 403, IGGY_RESULT_Error_Graphics = 404, + // IGGY_RESULT_Error_Font = 405, IGGY_RESULT_Error_Create = 406, + // IGGY_RESULT_Error_Library = 407, IGGY_RESULT_Error_ValuePath = 408, + // IGGY_RESULT_Error_Audio = 409, IGGY_RESULT_Error_Internal = 499, + // IGGY_RESULT_Error_InvalidIggy = 501, + // IGGY_RESULT_Error_InvalidArgument = 502, + // IGGY_RESULT_Error_InvalidEntity = 503, + // IGGY_RESULT_Error_UndefinedEntity = 504, + // IGGY_RESULT_Error_OutOfMemory = 1001,}; + + switch(code) + { + case IGGY_RESULT_Warning_CannotSustainFrameRate: + // Ignore warning + break; + default: + /* Normally, we'd want to issue this warning to some kind of + logging system or error reporting system, but since this is a + tutorial app, we just use Win32's default error stream. Since + ActionScript 3 exceptions are routed through this warning + callback, it's definitely a good idea to make sure these + warnings get printed somewhere that's easy for you to read and + use for debugging, otherwise debugging errors in the + ActionScript 3 code in your Flash content will be very + difficult! */ + app.DebugPrintf(app.USER_SR, message); + app.DebugPrintf(app.USER_SR, "\n"); + break; + }; +} + + +/* Flash provides a way for ActionScript 3 code to print debug output +using a function called "trace". It's very useful for debugging +Flash programs, so ideally, when using Iggy, we'd like to see any +trace output alongside our own debugging output. To facilitate +this, Iggy allows us to install a callback that will be called +any time ActionScript code calls trace. */ +static void RADLINK TraceCallback(void *user_callback_data, Iggy *player, char const *utf8_string, S32 length_in_bytes) +{ + app.DebugPrintf(app.USER_UI, (char *)utf8_string); +} + +#ifdef ENABLE_IGGY_PERFMON +static void *RADLINK perf_malloc(void *handle, U32 size) +{ + return malloc(size); +} + +static void RADLINK perf_free(void *handle, void *ptr) +{ + return free(ptr); +} +#endif + +#ifdef EXCLUDE_IGGY_ALLOCATIONS_FROM_HEAP_INSPECTOR +extern "C" void *__real_malloc(size_t t); +extern "C" void __real_free(void *t); +#endif + +__int64 UIController::iggyAllocCount = 0; +static unordered_map allocations; +static void * RADLINK AllocateFunction ( void * alloc_callback_user_data , size_t size_requested , size_t * size_returned ) +{ + UIController *controller = (UIController *)alloc_callback_user_data; + EnterCriticalSection(&controller->m_Allocatorlock); +#ifdef EXCLUDE_IGGY_ALLOCATIONS_FROM_HEAP_INSPECTOR + void *alloc = __real_malloc(size_requested); +#else + void *alloc = malloc(size_requested); +#endif + *size_returned = size_requested; + UIController::iggyAllocCount += size_requested; + allocations[alloc] = size_requested; + app.DebugPrintf(app.USER_SR, "Allocating %d, new total: %d\n", size_requested, UIController::iggyAllocCount); + LeaveCriticalSection(&controller->m_Allocatorlock); + return alloc; +} + +static void RADLINK DeallocateFunction ( void * alloc_callback_user_data , void * ptr ) +{ + UIController *controller = (UIController *)alloc_callback_user_data; + EnterCriticalSection(&controller->m_Allocatorlock); + size_t size = allocations[ptr]; + UIController::iggyAllocCount -= size; + allocations.erase(ptr); + app.DebugPrintf(app.USER_SR, "Freeing %d, new total %d\n", size, UIController::iggyAllocCount); +#ifdef EXCLUDE_IGGY_ALLOCATIONS_FROM_HEAP_INSPECTOR + __real_free(ptr); +#else + free(ptr); +#endif + LeaveCriticalSection(&controller->m_Allocatorlock); +} + +UIController::UIController() +{ + m_uiDebugConsole = NULL; + m_reloadSkinThread = NULL; + + m_navigateToHomeOnReload = false; + + m_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 + + // 4J Stu - This is a bit of a hack until we change the Minecraft initialisation to store the proper screen size for other platforms +#if defined _WINDOWS64 || defined _DURANGO || defined __ORBIS__ + m_fScreenWidth = 1920.0f; + m_fScreenHeight = 1080.0f; + m_bScreenWidthSetup = true; +#else + m_fScreenWidth = 1280.0f; + m_fScreenHeight = 720.0f; + m_bScreenWidthSetup = false; +#endif + + for(unsigned int i = 0; i < eLibrary_Count; ++i) + { + m_iggyLibraries[i] = IGGY_INVALID_LIBRARY; + } + + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + m_bMenuDisplayed[i] = false; + m_iCountDown[i]=0; + m_bMenuToBeClosed[i]=false; + + for(unsigned int key = 0; key <= ACTION_MAX_MENU; ++key) + { + m_actionRepeatTimer[i][key] = 0; + } + } + + for(unsigned int i = 0; i < eUIGroup_COUNT; ++i) + { + m_bCloseAllScenes[i] = false; + } + + m_iPressStartQuadrantsMask = 0; + + m_currentRenderViewport = C4JRender::VIEWPORT_TYPE_FULLSCREEN; + m_bCustomRenderPosition = false; + m_winUserIndex = 0; + m_accumulatedTicks = 0; + m_lastUiSfx = 0; + + InitializeCriticalSection(&m_navigationLock); + InitializeCriticalSection(&m_registeredCallbackScenesCS); + //m_bSysUIShowing=false; + m_bSystemUIShowing=false; +#ifdef __PSVITA__ + m_bTouchscreenPressed=false; +#endif + + if(!ms_bReloadSkinCSInitialised) + { + // MGH - added to prevent crash loading Iggy movies while the skins were being reloaded + InitializeCriticalSection(&ms_reloadSkinCS); + ms_bReloadSkinCSInitialised = true; + } +} + +void UIController::SetSysUIShowing(bool bVal) +{ + if(bVal) app.DebugPrintf("System UI showing\n"); + else app.DebugPrintf("System UI stopped showing\n"); + m_bSystemUIShowing=bVal; +} + +void UIController::SetSystemUIShowing(LPVOID lpParam,bool bVal) +{ + UIController *pClass=(UIController *)lpParam; + pClass->SetSysUIShowing(bVal); +} + +// SETUP +void UIController::preInit(S32 width, S32 height) +{ + m_fScreenWidth = width; + m_fScreenHeight = height; + m_bScreenWidthSetup = true; + +#ifdef ENABLE_IGGY_ALLOCATOR + IggyAllocator allocator; + allocator.user_callback_data = this; + allocator.mem_alloc = &AllocateFunction; + allocator.mem_free = &DeallocateFunction; + IggyInit(&allocator); +#else + IggyInit(0); +#endif + + IggySetWarningCallback(WarningCallback, 0); + IggySetTraceCallbackUTF8(TraceCallback, 0); + + setFontCachingCalculationBuffer(-1); +} + +void UIController::postInit() +{ + // set up a custom rendering callback + IggySetCustomDrawCallback(&UIController::CustomDrawCallback, this); + IggySetAS3ExternalFunctionCallbackUTF16 ( &UIController::ExternalFunctionCallback, this ); + IggySetTextureSubstitutionCallbacks ( &UIController::TextureSubstitutionCreateCallback , &UIController::TextureSubstitutionDestroyCallback, this ); + + SetupFont(); + // + loadSkins(); + + for(unsigned int i = 0; i < eUIGroup_COUNT; ++i) + { + m_groups[i] = new UIGroup((EUIGroup)i,i-1); + } + + +#ifdef ENABLE_IGGY_EXPLORER + iggy_explorer = IggyExpCreate("127.0.0.1", 9190, malloc(IGGYEXP_MIN_STORAGE), IGGYEXP_MIN_STORAGE); + if ( iggy_explorer == NULL ) + { + // not normally an error, just an error for this demo! + app.DebugPrintf( "Couldn't connect to Iggy Explorer, did you run it first?" ); + } + else + { + IggyUseExplorer( m_groups[1]->getHUD()->getMovie(), iggy_explorer); + } +#endif + +#ifdef ENABLE_IGGY_PERFMON + m_iggyPerfmonEnabled = false; + iggy_perfmon = IggyPerfmonCreate(perf_malloc, perf_free, NULL); + IggyInstallPerfmon(iggy_perfmon); +#endif + + NavigateToScene(0, eUIScene_Intro); +} + + +UIController::EFont UIController::getFontForLanguage(int language) + { + 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; + } +} + +UITTFFont *UIController::createFont(EFont fontLanguage) + { + switch(fontLanguage) + { +#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) + 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 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 + case eFont_TradChinese: return new UITTFFont("Mojangles_TTF_cnTD", "Common/Media/font/CHT/DFHeiMedium-B5.ttf", 0x2022); // CHT + case eFont_Korean: return new UITTFFont("Mojangles_TTF_koKR", "Common/Media/font/KOR/BOKMSD.ttf", 0x2022); // KOR +#endif + // 4J-JEV, Cyrillic characters have been added to this font now, (4/July/14) + // XC_LANGUAGE_RUSSIAN and XC_LANGUAGE_GREEK: + default: return NULL; + } +} + +void UIController::SetupFont() +{ + // 4J-JEV: Language hasn't changed or is already changing. + if ( (m_eCurrentFont != m_eTargetFont) || !UIString::setCurrentLanguage() ) return; + + DWORD nextLanguage = UIString::getCurrentLanguage(); + m_eTargetFont = getFontForLanguage(nextLanguage); + + // flag a language change to reload the string tables in the DLC + app.m_dlcManager.LanguageChanged(); + + app.loadStringTable(); // Switch to use new string table, + + if (m_eTargetFont == m_eCurrentFont) + { + // 4J-JEV: If we're ingame, reload the font to update all the text. + if (app.GetGameStarted()) app.SetAction(ProfileManager.GetPrimaryPad(), eAppAction_ReloadFont); + return; + } + + if (m_eCurrentFont != eFont_NotLoaded) app.DebugPrintf("[UIController] Font switch required for language transition to %i.\n", nextLanguage); + else app.DebugPrintf("[UIController] Initialising font for language %i.\n", nextLanguage); + + if (m_mcTTFFont != NULL) + { + delete m_mcTTFFont; + m_mcTTFFont = NULL; + } + + if(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); + 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 + { + 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() +{ + 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; + m_bCleanupOnReload = false; + } + + for(unsigned int i = 0; i < eUIGroup_COUNT; ++i) + { + if(m_bCloseAllScenes[i]) + { + m_groups[i]->closeAllScenes(); + m_groups[i]->getTooltips()->SetTooltips(-1); + m_bCloseAllScenes[i] = false; + } + } + + if(m_accumulatedTicks == 0) tickInput(); + m_accumulatedTicks = 0; + + for(unsigned int i = 0; i < eUIGroup_COUNT; ++i) + { + m_groups[i]->tick(); + + // TODO: May wish to skip ticking other groups here + } + + // Clear out the cached movie file data + __int64 currentTime = System::currentTimeMillis(); + for(AUTO_VAR(it, m_cachedMovieData.begin()); it != m_cachedMovieData.end();) + { + if(it->second.m_expiry < currentTime) + { + delete [] it->second.m_ba.data; + it = m_cachedMovieData.erase(it); + } + else + { + ++it; + } + } +} + +void UIController::loadSkins() +{ + wstring platformSkinPath = L""; + +#ifdef __PS3__ + platformSkinPath = L"skinPS3.swf"; +#elif defined __PSVITA__ + platformSkinPath = L"skinVita.swf"; +#elif defined _WINDOWS64 + if(m_fScreenHeight==1080.0f) + { + platformSkinPath = L"skinHDWin.swf"; + } + else + { + platformSkinPath = L"skinWin.swf"; + } +#elif defined _DURANGO + if(m_fScreenHeight==1080.0f) + { + platformSkinPath = L"skinHDDurango.swf"; + } + else + { + platformSkinPath = L"skinDurango.swf"; + } +#elif defined __ORBIS__ + if(m_fScreenHeight==1080.0f) + { + platformSkinPath = L"skinHDOrbis.swf"; + } + else + { + platformSkinPath = L"skinOrbis.swf"; + } + +#endif + // Every platform has one of these, so nothing shared + if(m_fScreenHeight==1080.0f) + { + m_iggyLibraries[eLibrary_Platform] = loadSkin(platformSkinPath, L"platformskinHD.swf"); + } + else + { + m_iggyLibraries[eLibrary_Platform] = loadSkin(platformSkinPath, L"platformskin.swf"); + } + +#if defined(__PS3__) || defined(__PSVITA__) + m_iggyLibraries[eLibrary_GraphicsDefault] = loadSkin(L"skinGraphics.swf", L"skinGraphics.swf"); + m_iggyLibraries[eLibrary_GraphicsHUD] = loadSkin(L"skinGraphicsHud.swf", L"skinGraphicsHud.swf"); + m_iggyLibraries[eLibrary_GraphicsInGame] = loadSkin(L"skinGraphicsInGame.swf", L"skinGraphicsInGame.swf"); + m_iggyLibraries[eLibrary_GraphicsTooltips] = loadSkin(L"skinGraphicsTooltips.swf", L"skinGraphicsTooltips.swf"); + m_iggyLibraries[eLibrary_GraphicsLabels] = loadSkin(L"skinGraphicsLabels.swf", L"skinGraphicsLabels.swf"); + m_iggyLibraries[eLibrary_Labels] = loadSkin(L"skinLabels.swf", L"skinLabels.swf"); + m_iggyLibraries[eLibrary_InGame] = loadSkin(L"skinInGame.swf", L"skinInGame.swf"); + m_iggyLibraries[eLibrary_HUD] = loadSkin(L"skinHud.swf", L"skinHud.swf"); + m_iggyLibraries[eLibrary_Tooltips] = loadSkin(L"skinTooltips.swf", L"skinTooltips.swf"); + m_iggyLibraries[eLibrary_Default] = loadSkin(L"skin.swf", L"skin.swf"); +#endif + +#if ( defined(_WINDOWS64) || defined(_DURANGO) || defined(__ORBIS__) ) + +#if defined(_WINDOWS64) + // 4J Stu - Load the 720/480 skins so that we have something to fallback on during development +#ifndef _FINAL_BUILD + m_iggyLibraries[eLibraryFallback_GraphicsDefault] = loadSkin(L"skinGraphics.swf", L"skinGraphics.swf"); + m_iggyLibraries[eLibraryFallback_GraphicsHUD] = loadSkin(L"skinGraphicsHud.swf", L"skinGraphicsHud.swf"); + m_iggyLibraries[eLibraryFallback_GraphicsInGame] = loadSkin(L"skinGraphicsInGame.swf", L"skinGraphicsInGame.swf"); + m_iggyLibraries[eLibraryFallback_GraphicsTooltips] = loadSkin(L"skinGraphicsTooltips.swf", L"skinGraphicsTooltips.swf"); + m_iggyLibraries[eLibraryFallback_GraphicsLabels] = loadSkin(L"skinGraphicsLabels.swf", L"skinGraphicsLabels.swf"); + m_iggyLibraries[eLibraryFallback_Labels] = loadSkin(L"skinLabels.swf", L"skinLabels.swf"); + m_iggyLibraries[eLibraryFallback_InGame] = loadSkin(L"skinInGame.swf", L"skinInGame.swf"); + m_iggyLibraries[eLibraryFallback_HUD] = loadSkin(L"skinHud.swf", L"skinHud.swf"); + m_iggyLibraries[eLibraryFallback_Tooltips] = loadSkin(L"skinTooltips.swf", L"skinTooltips.swf"); + m_iggyLibraries[eLibraryFallback_Default] = loadSkin(L"skin.swf", L"skin.swf"); +#endif +#endif + + m_iggyLibraries[eLibrary_GraphicsDefault] = loadSkin(L"skinHDGraphics.swf", L"skinHDGraphics.swf"); + m_iggyLibraries[eLibrary_GraphicsHUD] = loadSkin(L"skinHDGraphicsHud.swf", L"skinHDGraphicsHud.swf"); + m_iggyLibraries[eLibrary_GraphicsInGame] = loadSkin(L"skinHDGraphicsInGame.swf", L"skinHDGraphicsInGame.swf"); + m_iggyLibraries[eLibrary_GraphicsTooltips] = loadSkin(L"skinHDGraphicsTooltips.swf", L"skinHDGraphicsTooltips.swf"); + m_iggyLibraries[eLibrary_GraphicsLabels] = loadSkin(L"skinHDGraphicsLabels.swf", L"skinHDGraphicsLabels.swf"); + m_iggyLibraries[eLibrary_Labels] = loadSkin(L"skinHDLabels.swf", L"skinHDLabels.swf"); + m_iggyLibraries[eLibrary_InGame] = loadSkin(L"skinHDInGame.swf", L"skinHDInGame.swf"); + m_iggyLibraries[eLibrary_HUD] = loadSkin(L"skinHDHud.swf", L"skinHDHud.swf"); + m_iggyLibraries[eLibrary_Tooltips] = loadSkin(L"skinHDTooltips.swf", L"skinHDTooltips.swf"); + m_iggyLibraries[eLibrary_Default] = loadSkin(L"skinHD.swf", L"skinHD.swf"); +#endif // HD platforms +} + +IggyLibrary UIController::loadSkin(const wstring &skinPath, const wstring &skinName) +{ + IggyLibrary lib = IGGY_INVALID_LIBRARY; + // 4J Stu - We need to load the platformskin before the normal skin, as the normal skin requires some elements from the platform skin + if(!skinPath.empty() && app.hasArchiveFile(skinPath)) + { + byteArray baFile = app.getArchiveFile(skinPath); + lib = IggyLibraryCreateFromMemoryUTF16( (IggyUTF16 *)skinName.c_str() , (void *)baFile.data, baFile.length, NULL ); + + delete[] baFile.data; +#ifdef _DEBUG + IggyMemoryUseInfo memoryInfo; + rrbool res; + int iteration = 0; + __int64 totalStatic = 0; + while(res = IggyDebugGetMemoryUseInfo ( NULL , + lib , + "" , + 0 , + iteration , + &memoryInfo )) + { + totalStatic += memoryInfo.static_allocation_bytes; + app.DebugPrintf(app.USER_SR, "%ls - %.*s, static: %dB, dynamic: %dB\n", skinPath.c_str(), memoryInfo.subcategory_stringlen, memoryInfo.subcategory, memoryInfo.static_allocation_bytes, memoryInfo.dynamic_allocation_bytes); + ++iteration; + } + + app.DebugPrintf(app.USER_SR, "%ls - Total static: %dB (%dKB)\n", skinPath.c_str(), totalStatic, totalStatic/1024); +#endif + } + return lib; +} + +void UIController::ReloadSkin() +{ + // Destroy all scene swf + for(unsigned int i = 0; i < eUIGroup_COUNT; ++i) + { + //m_bCloseAllScenes[i] = true; + m_groups[i]->DestroyAll(); + } + + // Unload the current libraries + // Some libraries reference others, so we destroy in reverse order + for(int i = eLibrary_Count - 1; i >= 0; --i) + { + if(m_iggyLibraries[i] != IGGY_INVALID_LIBRARY) IggyLibraryDestroy(m_iggyLibraries[i]); + m_iggyLibraries[i] = IGGY_INVALID_LIBRARY; + } + +#ifdef _WINDOWS64 + // 4J Stu - Don't load on a thread on windows. I haven't investigated this in detail, so a quick fix + reloadSkinThreadProc(this); +#else + + 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 + //loadSkins(); + + //// Reload all scene swf + //for(int i = eUIGroup_Player1; i <= eUIGroup_Player4; ++i) + //{ + // m_groups[i]->ReloadAll(); + //} + + //// Always reload the fullscreen group + //m_groups[eUIGroup_Fullscreen]->ReloadAll(); +#endif +} + +void UIController::StartReloadSkinThread() +{ + if(m_reloadSkinThread) m_reloadSkinThread->Run(); +} + +int UIController::reloadSkinThreadProc(void* lpParam) +{ + EnterCriticalSection(&ms_reloadSkinCS); // MGH - added to prevent crash loading Iggy movies while the skins were being reloaded + UIController *controller = (UIController *)lpParam; + // Load new skin + controller->loadSkins(); + + // Reload all scene swf + for(int i = eUIGroup_Player1; i < eUIGroup_COUNT; ++i) + { + controller->m_groups[i]->ReloadAll(); + } + + // Always reload the fullscreen group + controller->m_groups[eUIGroup_Fullscreen]->ReloadAll(); + + // 4J Stu - Don't do this on windows, as we never navigated forwards to start with +#ifndef _WINDOW64 + controller->NavigateBack(0, false, eUIScene_COUNT, eUILayer_Tooltips); +#endif + LeaveCriticalSection(&ms_reloadSkinCS); + + return 0; +} + +bool UIController::IsReloadingSkin() +{ + return m_reloadSkinThread && (!m_reloadSkinThread->hasStarted() || m_reloadSkinThread->isRunning()); +} + +bool UIController::IsExpectingOrReloadingSkin() +{ + return Minecraft::GetInstance()->skins->getSelected()->isLoadingData() || Minecraft::GetInstance()->skins->needsUIUpdate() || IsReloadingSkin() || PendingFontChange(); +} + +void UIController::CleanUpSkinReload() +{ + delete m_reloadSkinThread; + m_reloadSkinThread = NULL; + + if(!Minecraft::GetInstance()->skins->isUsingDefaultSkin()) + { + if(!Minecraft::GetInstance()->skins->getSelected()->hasAudio()) + { +#ifdef _DURANGO + DWORD result = StorageManager.UnmountInstalledDLC(L"TPACK"); +#else + DWORD result = StorageManager.UnmountInstalledDLC("TPACK"); +#endif + } + } + + for(AUTO_VAR(it,m_queuedMessageBoxData.begin()); it != m_queuedMessageBoxData.end(); ++it) + { + QueuedMessageBoxData *queuedData = *it; + ui.NavigateToScene(queuedData->iPad, eUIScene_MessageBox, &queuedData->info, queuedData->layer, eUIGroup_Fullscreen); + delete queuedData->info.uiOptionA; + delete queuedData; + } + m_queuedMessageBoxData.clear(); +} + +byteArray UIController::getMovieData(const wstring &filename) +{ + // Cache everything we load in the current tick + __int64 targetTime = System::currentTimeMillis() + (1000LL * 60); + AUTO_VAR(it,m_cachedMovieData.find(filename)); + if(it == m_cachedMovieData.end() ) + { + byteArray baFile = app.getArchiveFile(filename); + CachedMovieData cmd; + cmd.m_ba = baFile; + cmd.m_expiry = targetTime; + m_cachedMovieData[filename] = cmd; + return baFile; + } + else + { + it->second.m_expiry = targetTime; + return it->second.m_ba; + } +} + +// INPUT +void UIController::tickInput() +{ + // If system/commerce UI up, don't handle input + //if(!m_bSysUIShowing && !m_bSystemUIShowing) + if(!m_bSystemUIShowing) + { +#ifdef ENABLE_IGGY_PERFMON + if (m_iggyPerfmonEnabled) + { + if(InputManager.ButtonPressed(ProfileManager.GetPrimaryPad(), ACTION_MENU_STICK_PRESS)) m_iggyPerfmonEnabled = !m_iggyPerfmonEnabled; + } + else +#endif + { + handleInput(); + ++m_accumulatedTicks; + } + } +} + +void UIController::handleInput() +{ + // For each user, loop over each key type and send messages based on the state + for(unsigned int iPad = 0; iPad < XUSER_MAX_COUNT; ++iPad) + { +#ifdef _DURANGO + // 4J-JEV: Added exception for primary play who migh've uttered speech commands. + if(iPad != ProfileManager.GetPrimaryPad() + && (!InputManager.IsPadConnected(iPad) || !InputManager.IsPadLocked(iPad)) ) continue; +#endif + for(unsigned int key = 0; key <= ACTION_MAX_MENU; ++key) + { + handleKeyPress(iPad, key); + } + +#ifdef __PSVITA__ + //CD - Vita requires key press 40 - select [MINECRAFT_ACTION_GAME_INFO] + handleKeyPress(iPad, MINECRAFT_ACTION_GAME_INFO); +#endif + } + +#ifdef _DURANGO + if(!app.GetGameStarted()) + { + bool repeat = false; + int firstUnfocussedUnhandledPad = -1; + + // For durango, check for unmapped controllers + for(unsigned int iPad = XUSER_MAX_COUNT; iPad < (XUSER_MAX_COUNT + InputManager.MAX_GAMEPADS); ++iPad) + { + if(InputManager.IsPadLocked(iPad) || !InputManager.IsPadConnected(iPad) ) continue; + + for(unsigned int key = 0; key <= ACTION_MAX_MENU; ++key) + { + + bool pressed = InputManager.ButtonPressed(iPad,key); // Toggle + bool released = InputManager.ButtonReleased(iPad,key); // Toggle + + if(pressed || released) + { + bool handled = false; + + // Send the key to the fullscreen group first + m_groups[(int)eUIGroup_Fullscreen]->handleInput(iPad, key, repeat, pressed, released, handled); + + if(firstUnfocussedUnhandledPad < 0 && !m_groups[(int)eUIGroup_Fullscreen]->HasFocus(iPad)) + { + firstUnfocussedUnhandledPad = iPad; + } + } + } + } + + if(ProfileManager.GetLockedProfile() >= 0 && !InputManager.IsPadLocked( ProfileManager.GetLockedProfile() ) && firstUnfocussedUnhandledPad >= 0) + { + ProfileManager.RequestSignInUI(false, false, false, false, true, NULL, NULL, firstUnfocussedUnhandledPad ); + } + } +#endif +} + +void UIController::handleKeyPress(unsigned int iPad, unsigned int key) +{ + + bool down = false; + bool pressed = false; // Toggle + bool released = false; // Toggle + bool repeat = false; + +#ifdef __PSVITA__ + if(key==ACTION_MENU_OK) + { + bool bTouchScreenInput=false; + + // check the touchscreen + + // 4J-PB - use the touchscreen for quickselect + SceTouchData* pTouchData = InputManager.GetTouchPadData(iPad,false); + + if((m_bTouchscreenPressed==false) && pTouchData->reportNum==1) + { + // no active touch? clear active and highlighted touch UI elements + m_ActiveUIElement = NULL; + m_HighlightedUIElement = NULL; + + // fullscreen first + UIScene *pScene=m_groups[(int)eUIGroup_Fullscreen]->getCurrentScene(); + // also check tooltip scene if we're not touching anything in the main scene + UIScene *pToolTips=m_groups[(int)eUIGroup_Fullscreen]->getTooltips(); + if(pScene) + { + // scene touch check + if(TouchBoxHit(pScene,pTouchData->report[0].x,pTouchData->report[0].y)) + { + down=pressed=m_bTouchscreenPressed=true; + bTouchScreenInput=true; + } + // tooltip touch check + else if(TouchBoxHit(pToolTips,pTouchData->report[0].x,pTouchData->report[0].y)) + { + down=pressed=m_bTouchscreenPressed=true; + bTouchScreenInput=true; + } + } + else + { + pScene=m_groups[(EUIGroup)(iPad+1)]->getCurrentScene(); + pToolTips=m_groups[(int)iPad+1]->getTooltips(); + if(pScene) + { + // scene touch check + if(TouchBoxHit(pScene,pTouchData->report[0].x,pTouchData->report[0].y)) + { + down=pressed=m_bTouchscreenPressed=true; + bTouchScreenInput=true; + } + // tooltip touch check (if scene exists but not component has been touched) + else if(TouchBoxHit(pToolTips,pTouchData->report[0].x,pTouchData->report[0].y)) + { + down=pressed=m_bTouchscreenPressed=true; + bTouchScreenInput=true; + } + } + else if(pToolTips) + { + // tooltip touch check (if scene does not exist) + if(TouchBoxHit(pToolTips,pTouchData->report[0].x,pTouchData->report[0].y)) + { + down=pressed=m_bTouchscreenPressed=true; + bTouchScreenInput=true; + } + } + } + } + else if(m_bTouchscreenPressed && pTouchData->reportNum==1) + { + // fullscreen first + UIScene *pScene=m_groups[(int)eUIGroup_Fullscreen]->getCurrentScene(); + // also check tooltip scene if we're not touching anything in the main scene + UIScene *pToolTips=m_groups[(int)eUIGroup_Fullscreen]->getTooltips(); + if(pScene) + { + // scene touch check + if(TouchBoxHit(pScene,pTouchData->report[0].x,pTouchData->report[0].y)) + { + down=true; + bTouchScreenInput=true; + } + // tooltip touch check (if scene exists but not component has been touched) + else if(TouchBoxHit(pToolTips,pTouchData->report[0].x,pTouchData->report[0].y)) + { + down=true; + bTouchScreenInput=true; + } + } + else + { + pScene=m_groups[(EUIGroup)(iPad+1)]->getCurrentScene(); + pToolTips=m_groups[(int)iPad+1]->getTooltips(); + if(pScene) + { + // scene touch check + if(TouchBoxHit(pScene,pTouchData->report[0].x,pTouchData->report[0].y)) + { + down=true; + bTouchScreenInput=true; + } + // tooltip touch check (if scene exists but not component has been touched) + else if(TouchBoxHit(pToolTips,pTouchData->report[0].x,pTouchData->report[0].y)) + { + down=true; + bTouchScreenInput=true; + } + } + else if(pToolTips) + { + // tooltip touch check (if scene does not exist) + if(TouchBoxHit(pToolTips,pTouchData->report[0].x,pTouchData->report[0].y)) + { + down=true; + bTouchScreenInput=true; + } + } + } + } + else if(m_bTouchscreenPressed && pTouchData->reportNum==0) + { + // released + bTouchScreenInput=true; + m_bTouchscreenPressed=false; + released=true; + } + + if(pressed) + { + // Start repeat timer + m_actionRepeatTimer[iPad][key] = GetTickCount() + UI_REPEAT_KEY_DELAY_MS; + } + else if (released) + { + // Stop repeat timer + m_actionRepeatTimer[iPad][key] = 0; + } + else if (down) + { + // Check is enough time has elapsed to be a repeat key + DWORD currentTime = GetTickCount(); + if(m_actionRepeatTimer[iPad][key] > 0 && currentTime > m_actionRepeatTimer[iPad][key]) + { + repeat = true; + pressed = true; + m_actionRepeatTimer[iPad][key] = currentTime + UI_REPEAT_KEY_REPEAT_RATE_MS; + } + } + + // handle touch input + HandleTouchInput(iPad, key, pressed, repeat, released); + + // ignore any other presses if the touchscreen has been used + if(bTouchScreenInput) return; + } +#endif + + down = InputManager.ButtonDown(iPad,key); + pressed = InputManager.ButtonPressed(iPad,key); // Toggle + released = InputManager.ButtonReleased(iPad,key); // Toggle + + //if(pressed) app.DebugPrintf("Pressed %d\n",key); + //if(released) app.DebugPrintf("Released %d\n",key); + // Repeat handling + if(pressed) + { + // Start repeat timer + m_actionRepeatTimer[iPad][key] = GetTickCount() + UI_REPEAT_KEY_DELAY_MS; + } + else if (released) + { + // Stop repeat timer + m_actionRepeatTimer[iPad][key] = 0; + } + else if (down) + { + // Check is enough time has elapsed to be a repeat key + DWORD currentTime = GetTickCount(); + if(m_actionRepeatTimer[iPad][key] > 0 && currentTime > m_actionRepeatTimer[iPad][key]) + { + repeat = true; + pressed = true; + m_actionRepeatTimer[iPad][key] = currentTime + UI_REPEAT_KEY_REPEAT_RATE_MS; + } + } + +#ifndef _CONTENT_PACKAGE + +#ifdef ENABLE_IGGY_PERFMON + if ( pressed && !repeat && key == ACTION_MENU_STICK_PRESS) + { + m_iggyPerfmonEnabled = !m_iggyPerfmonEnabled; + } +#endif + + // 4J Stu - Removed this function +#if 0 +#ifdef __PS3__ + //if ( pressed && + // !repeat && + // //app.GetGameSettingsDebugMask(ProfileManager.GetPrimaryPad())&(1L<PrintTotalMemoryUsage(totalStatic, totalDynamic); + } + for(unsigned int i = 0; i < eLibrary_Count; ++i) + { + __int64 libraryStatic = 0; + __int64 libraryDynamic = 0; + + if(m_iggyLibraries[i] != IGGY_INVALID_LIBRARY) + { + + IggyMemoryUseInfo memoryInfo; + rrbool res; + int iteration = 0; + while(res = IggyDebugGetMemoryUseInfo ( NULL , + m_iggyLibraries[i] , + "" , + 0 , + iteration , + &memoryInfo )) + { + libraryStatic += memoryInfo.static_allocation_bytes; + libraryDynamic += memoryInfo.dynamic_allocation_bytes; + totalStatic += memoryInfo.static_allocation_bytes; + totalDynamic += memoryInfo.dynamic_allocation_bytes; + ++iteration; + } + } + + app.DebugPrintf(app.USER_SR, "Library static: %dB , Library dynamic: %d, ID: %d\n", libraryStatic, libraryDynamic, i); + } + app.DebugPrintf(app.USER_SR, "Total static: %d , Total dynamic: %d\n", totalStatic, totalDynamic); + app.DebugPrintf(app.USER_SR, "\n\nEND TOTAL SWF MEMORY USAGE\n"); + app.DebugPrintf(app.USER_SR, "********************************\n\n"); + } + else +#endif +#endif +#endif + //#endif + if(repeat || pressed || released) + { + bool handled = false; + + // Send the key to the fullscreen group first + m_groups[(int)eUIGroup_Fullscreen]->handleInput(iPad, key, repeat, pressed, released, handled); + if(!handled) + { + // If it's not been handled yet, then pass the event onto the players specific group + m_groups[(iPad+1)]->handleInput(iPad, key, repeat, pressed, released, handled); + } + } +} + +rrbool RADLINK UIController::ExternalFunctionCallback( void * user_callback_data , Iggy * player , IggyExternalFunctionCallUTF16 * call) +{ + UIScene *scene = (UIScene *)IggyPlayerGetUserdata(player); + + if(scene != NULL) + { + scene->externalCallback(call); + } + + return true; +} + +// RENDERING +void UIController::renderScenes() +{ + PIXBeginNamedEvent(0, "Rendering Iggy scenes"); + // Only render player scenes if the game is started + if(app.GetGameStarted() && !m_groups[eUIGroup_Fullscreen]->hidesLowerScenes()) + { + for(int i = eUIGroup_Player1; i < eUIGroup_COUNT; ++i) + { + PIXBeginNamedEvent(0, "Rendering layer %d scenes", i); + m_groups[i]->render(); + PIXEndNamedEvent(); + } + } + + // Always render the fullscreen group + PIXBeginNamedEvent(0, "Rendering fullscreen scenes"); + m_groups[eUIGroup_Fullscreen]->render(); + PIXEndNamedEvent(); + + PIXEndNamedEvent(); + +#ifdef ENABLE_IGGY_PERFMON + if (m_iggyPerfmonEnabled) + { + IggyPerfmonPad pm_pad; + + pm_pad.bits = 0; + pm_pad.field.dpad_up = InputManager.ButtonPressed(ProfileManager.GetPrimaryPad(),ACTION_MENU_UP); + pm_pad.field.dpad_down = InputManager.ButtonPressed(ProfileManager.GetPrimaryPad(),ACTION_MENU_DOWN); + pm_pad.field.dpad_left = InputManager.ButtonPressed(ProfileManager.GetPrimaryPad(),ACTION_MENU_LEFT); + pm_pad.field.dpad_right = InputManager.ButtonPressed(ProfileManager.GetPrimaryPad(),ACTION_MENU_RIGHT); + pm_pad.field.button_up = InputManager.ButtonPressed(ProfileManager.GetPrimaryPad(),ACTION_MENU_Y); + pm_pad.field.button_down = InputManager.ButtonPressed(ProfileManager.GetPrimaryPad(),ACTION_MENU_A); + pm_pad.field.button_left = InputManager.ButtonPressed(ProfileManager.GetPrimaryPad(),ACTION_MENU_X); + pm_pad.field.button_right = InputManager.ButtonPressed(ProfileManager.GetPrimaryPad(),ACTION_MENU_B); + pm_pad.field.shoulder_left_hi = InputManager.ButtonPressed(ProfileManager.GetPrimaryPad(),ACTION_MENU_LEFT_SCROLL); + pm_pad.field.shoulder_right_hi = InputManager.ButtonPressed(ProfileManager.GetPrimaryPad(),ACTION_MENU_RIGHT_SCROLL); + pm_pad.field.trigger_left_low = InputManager.ButtonPressed(ProfileManager.GetPrimaryPad(),ACTION_MENU_PAGEUP); + pm_pad.field.trigger_right_low = InputManager.ButtonPressed(ProfileManager.GetPrimaryPad(),ACTION_MENU_PAGEDOWN); + //IggyPerfmonPadFromXInputStatePointer(pm_pad, &xi_pad); + + //gdraw_D3D_SetTileOrigin( fb, + // zb, + // PM_ORIGIN_X, + // PM_ORIGIN_Y ); + IggyPerfmonTickAndDraw(iggy_perfmon, gdraw_funcs, &pm_pad, + PM_ORIGIN_X, PM_ORIGIN_Y, getScreenWidth(), getScreenHeight()); // perfmon draw area in window coords + } +#endif +} + +void UIController::getRenderDimensions(C4JRender::eViewportType viewport, S32 &width, S32 &height) +{ + switch( viewport ) + { + case C4JRender::VIEWPORT_TYPE_FULLSCREEN: + width = (S32)(getScreenWidth()); + height = (S32)(getScreenHeight()); + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_TOP: + case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: + width = (S32)(getScreenWidth() / 2); + height = (S32)(getScreenHeight() / 2); + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_LEFT: + case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: + width = (S32)(getScreenWidth() / 2); + height = (S32)(getScreenHeight() / 2); + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_LEFT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT: + width = (S32)(getScreenWidth() / 2); + height = (S32)(getScreenHeight() / 2); + break; + } +} + +void UIController::setupRenderPosition(C4JRender::eViewportType viewport) +{ + if(m_bCustomRenderPosition || m_currentRenderViewport != viewport) + { + m_currentRenderViewport = viewport; + m_bCustomRenderPosition = false; + S32 xPos = 0; + S32 yPos = 0; + switch( viewport ) + { + case C4JRender::VIEWPORT_TYPE_SPLIT_TOP: + xPos = (S32)(getScreenWidth() / 4); + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: + xPos = (S32)(getScreenWidth() / 4); + yPos = (S32)(getScreenHeight() / 2); + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_LEFT: + yPos = (S32)(getScreenHeight() / 4); + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: + xPos = (S32)(getScreenWidth() / 2); + yPos = (S32)(getScreenHeight() / 4); + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_LEFT: + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: + xPos = (S32)(getScreenWidth() / 2); + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT: + yPos = (S32)(getScreenHeight() / 2); + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT: + xPos = (S32)(getScreenWidth() / 2); + yPos = (S32)(getScreenHeight() / 2); + break; + } + m_tileOriginX = xPos; + m_tileOriginY = yPos; + setTileOrigin(xPos, yPos); + } +} + +void UIController::setupRenderPosition(S32 xOrigin, S32 yOrigin) +{ + m_bCustomRenderPosition = true; + m_tileOriginX = xOrigin; + m_tileOriginY = yOrigin; + setTileOrigin(xOrigin, yOrigin); +} + +void UIController::setupCustomDrawGameState() +{ + // Rest the clear rect + m_customRenderingClearRect.left = LONG_MAX; + m_customRenderingClearRect.right = LONG_MIN; + m_customRenderingClearRect.top = LONG_MAX; + m_customRenderingClearRect.bottom = LONG_MIN; + +#if defined _WINDOWS64 || _DURANGO + PIXBeginNamedEvent(0,"StartFrame"); + RenderManager.StartFrame(); + PIXEndNamedEvent(); + gdraw_D3D11_setViewport_4J(); +#elif defined __PS3__ + RenderManager.StartFrame(); +#elif defined __PSVITA__ + RenderManager.StartFrame(); +#elif defined __ORBIS__ + RenderManager.StartFrame(false); + // Set up a viewport for the render that matches Iggy's own viewport, apart form using an opengl-style z-range (Iggy uses a DX-style range on PS4), so + // that the renderer orthographic projection will work + gdraw_orbis_setViewport_4J(); +#endif + RenderManager.Set_matrixDirty(); + + // 4J Stu - We don't need to clear this here as iggy hasn't written anything to the depth buffer. + // We DO however clear after we render which is why we still setup the rectangle here + //RenderManager.Clear(GL_DEPTH_BUFFER_BIT, &m_customRenderingClearRect); + //glClear(GL_DEPTH_BUFFER_BIT); + + PIXBeginNamedEvent(0,"Final setup"); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho(0, m_fScreenWidth, m_fScreenHeight, 0, 1000, 3000); + glMatrixMode(GL_MODELVIEW); + glEnable(GL_ALPHA_TEST); + glAlphaFunc(GL_GREATER, 0.1f); + glEnable(GL_DEPTH_TEST); + glDepthFunc(GL_LEQUAL); + glDepthMask(true); + PIXEndNamedEvent(); +} + +void UIController::setupCustomDrawMatrices(UIScene *scene, CustomDrawData *customDrawRegion) +{ + Minecraft *pMinecraft=Minecraft::GetInstance(); + + // Clear just the region required for this control. + float sceneWidth = (float)scene->getRenderWidth(); + float sceneHeight = (float)scene->getRenderHeight(); + + LONG left, right, top, bottom; +#ifdef __PS3__ + if(!RenderManager.IsHiDef() && !RenderManager.IsWidescreen()) + { + // 4J Stu - Our SD target on PS3 is double width + left = m_tileOriginX + (sceneWidth + customDrawRegion->mat[(0*4)+3]*sceneWidth); + right = left + ( (sceneWidth * customDrawRegion->mat[0]) ) * customDrawRegion->x1; + } + else +#endif + { + left = m_tileOriginX + (sceneWidth + customDrawRegion->mat[(0*4)+3]*sceneWidth)/2; + right = left + ( (sceneWidth * customDrawRegion->mat[0])/2 ) * customDrawRegion->x1; + } + + top = m_tileOriginY + (sceneHeight - customDrawRegion->mat[(1*4)+3]*sceneHeight)/2; + bottom = top + (sceneHeight * -customDrawRegion->mat[(1*4) + 1])/2 * customDrawRegion->y1; + + m_customRenderingClearRect.left = min(m_customRenderingClearRect.left, left); + m_customRenderingClearRect.right = max(m_customRenderingClearRect.right, right);; + m_customRenderingClearRect.top = min(m_customRenderingClearRect.top, top); + m_customRenderingClearRect.bottom = max(m_customRenderingClearRect.bottom, bottom); + + if(!m_bScreenWidthSetup) + { + Minecraft *pMinecraft=Minecraft::GetInstance(); + if(pMinecraft != NULL) + { + m_fScreenWidth=(float)pMinecraft->width_phys; + m_fScreenHeight=(float)pMinecraft->height_phys; + m_bScreenWidthSetup = true; + } + } + + glLoadIdentity(); + glTranslatef(0, 0, -2000); + // Iggy translations are based on a double-size target, with the origin in the centre + glTranslatef((m_fScreenWidth + customDrawRegion->mat[(0*4)+3]*m_fScreenWidth)/2,(m_fScreenHeight - customDrawRegion->mat[(1*4)+3]*m_fScreenHeight)/2,0); + // Iggy scales are based on a double-size target + glScalef( (m_fScreenWidth * customDrawRegion->mat[0])/2,(m_fScreenHeight * -customDrawRegion->mat[(1*4) + 1])/2,1.0f); +} + +void UIController::setupCustomDrawGameStateAndMatrices(UIScene *scene, CustomDrawData *customDrawRegion) +{ + setupCustomDrawGameState(); + setupCustomDrawMatrices(scene, customDrawRegion); +} + +void UIController::endCustomDrawGameState() +{ +#ifdef __ORBIS__ + // TO BE IMPLEMENTED + RenderManager.Clear(GL_DEPTH_BUFFER_BIT); +#else + RenderManager.Clear(GL_DEPTH_BUFFER_BIT, &m_customRenderingClearRect); +#endif + //glClear(GL_DEPTH_BUFFER_BIT); + glDepthMask(false); + glDisable(GL_ALPHA_TEST); +} + +void UIController::endCustomDrawMatrices() +{ +} + +void UIController::endCustomDrawGameStateAndMatrices() +{ + endCustomDrawMatrices(); + endCustomDrawGameState(); +} + +void RADLINK UIController::CustomDrawCallback(void *user_callback_data, Iggy *player, IggyCustomDrawCallbackRegion *region) +{ + UIScene *scene = (UIScene *)IggyPlayerGetUserdata(player); + + if(scene != NULL) + { + scene->customDraw(region); + } +} + +//Description +//Callback to create a user-defined texture to replace SWF-defined textures. +//Parameters +//width - Input value: optional number of pixels wide specified from AS3, or -1 if not defined. Output value: the number of pixels wide to pretend to Iggy that the bitmap is. SWF and AS3 scales bitmaps based on their pixel dimensions, so you can use this to substitute a texture that is higher or lower resolution that ActionScript thinks it is. +//height - Input value: optional number of pixels high specified from AS3, or -1 if not defined. Output value: the number of pixels high to pretend to Iggy that the bitmap is. SWF and AS3 scales bitmaps based on their pixel dimensions, so you can use this to substitute a texture that is higher or lower resolution that ActionScript thinks it is. +//destroy_callback_data - Optional additional output value you can set; the value will be passed along to the corresponding Iggy_TextureSubstitutionDestroyCallback (e.g. you can store the pointer to your own internal structure here). +//return - A platform-independent wrapped texture handle provided by GDraw, or NULL (NULL with throw an ActionScript 3 ArgumentError that the Flash developer can catch) Use by calling IggySetTextureSubstitutionCallbacks. +// +//Discussion +// +//If your texture includes an alpha channel, you must use a premultiplied alpha (where the R,G, and B channels have been multiplied by the alpha value); all Iggy shaders assume premultiplied alpha (and it looks better anyway). +GDrawTexture * RADLINK UIController::TextureSubstitutionCreateCallback ( void * user_callback_data , IggyUTF16 * texture_name , S32 * width , S32 * height , void * * destroy_callback_data ) +{ + UIController *uiController = (UIController *)user_callback_data; + AUTO_VAR(it,uiController->m_substitutionTextures.find((wchar_t *)texture_name)); + + if(it != uiController->m_substitutionTextures.end()) + { + app.DebugPrintf("Found substitution texture %ls, with %d bytes\n", (wchar_t *)texture_name,it->second.length); + + BufferedImage image(it->second.data, it->second.length); + if( image.getData() != NULL ) + { + image.preMultiplyAlpha(); + Textures *t = Minecraft::GetInstance()->textures; + int id = t->getTexture(&image,C4JRender::TEXTURE_FORMAT_RxGyBzAw,false); + + // 4J Stu - All our flash controls that allow replacing textures use a special 64x64 symbol + // Force this size here so that our images don't get scaled wildly + #if (defined __ORBIS__ || defined _DURANGO ) + *width = 96; + *height = 96; + #else + *width = 64; + *height = 64; + + #endif + *destroy_callback_data = (void *)id; + + app.DebugPrintf("Found substitution texture %ls (%d) - %dx%d\n", (wchar_t *)texture_name, id, image.getWidth(), image.getHeight()); + return ui.getSubstitutionTexture(id); + } + else + { + return NULL; + } + } + else + { + app.DebugPrintf("Could not find substitution texture %ls\n", (wchar_t *)texture_name); + return NULL; + } +} + +//Description +//Callback received from Iggy when it stops using a user-defined texture. +void RADLINK UIController::TextureSubstitutionDestroyCallback ( void * user_callback_data , void * destroy_callback_data , GDrawTexture * handle ) +{ + // Orbis complains about casting a pointer to an int + LONGLONG llVal=(LONGLONG)destroy_callback_data; + int id=(int)llVal; + app.DebugPrintf("Destroying iggy texture %d\n", id); + + ui.destroySubstitutionTexture(user_callback_data, handle); + + Textures *t = Minecraft::GetInstance()->textures; + t->releaseTexture( id ); +} + +void UIController::registerSubstitutionTexture(const wstring &textureName, PBYTE pbData, DWORD dwLength) +{ + // Remove it if it already exists + unregisterSubstitutionTexture(textureName,false); + + m_substitutionTextures[textureName] = byteArray(pbData, dwLength); +} + +void UIController::unregisterSubstitutionTexture(const wstring &textureName, bool deleteData) +{ + AUTO_VAR(it,m_substitutionTextures.find(textureName)); + + if(it != m_substitutionTextures.end()) + { + if(deleteData) delete [] it->second.data; + m_substitutionTextures.erase(it); + } +} + +// NAVIGATION +bool UIController::NavigateToScene(int iPad, EUIScene scene, void *initData, EUILayer layer, EUIGroup group) +{ + 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)) + { + switch(scene) + { + case eUIScene_PauseMenu: + case eUIScene_Crafting2x2Menu: + case eUIScene_Crafting3x3Menu: + case eUIScene_FurnaceMenu: + case eUIScene_ContainerMenu: + case eUIScene_LargeContainerMenu: + case eUIScene_InventoryMenu: + case eUIScene_CreativeMenu: + case eUIScene_DispenserMenu: + case eUIScene_SignEntryMenu: + case eUIScene_InGameInfoMenu: + case eUIScene_EnchantingMenu: + case eUIScene_BrewingStandMenu: + case eUIScene_AnvilMenu: + case eUIScene_TradingMenu: + 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; + } + } + + switch(scene) + { + case eUIScene_FullscreenProgress: + { + // 4J Stu - The fullscreen progress scene should not interfere with any other scene stack, so should be placed in it's own group/layer + layer = eUILayer_Fullscreen; + group = eUIGroup_Fullscreen; + } + break; + case eUIScene_ConnectingProgress: + { + // The connecting progress scene shouldn't interfere with other scenes + layer = eUILayer_Fullscreen; + } + break; + case eUIScene_EndPoem: + { + // The end poem scene shouldn't interfere with other scenes, but will be underneath the autosave progress + group = eUIGroup_Fullscreen; + layer = eUILayer_Scene; + } + break; + }; + int menuDisplayedPad = XUSER_INDEX_ANY; + if(group == eUIGroup_PAD) + { + if( app.GetGameStarted() ) + { + // If the game isn't running treat as user 0, otherwise map index directly from pad + if( ( iPad != 255 ) && ( iPad >= 0 ) ) + { + menuDisplayedPad = iPad; + group = (EUIGroup)(iPad+1); + } + else group = eUIGroup_Fullscreen; + } + else + { + layer = eUILayer_Fullscreen; + group = eUIGroup_Fullscreen; + } + } + + PerformanceTimer timer; + + EnterCriticalSection(&m_navigationLock); + SetMenuDisplayed(menuDisplayedPad,true); + bool success = m_groups[(int)group]->NavigateToScene(iPad, scene, initData, layer); + if(success && group == eUIGroup_Fullscreen) setFullscreenMenuDisplayed(true); + LeaveCriticalSection(&m_navigationLock); + + timer.PrintElapsedTime(L"Navigate to scene"); + + return success; + //return true; +} + +bool UIController::NavigateBack(int iPad, bool forceUsePad, EUIScene eScene, EUILayer eLayer) +{ + bool navComplete = false; + if( app.GetGameStarted() ) + { + bool navComplete = m_groups[(int)eUIGroup_Fullscreen]->NavigateBack(iPad, eScene, eLayer); + + if(!navComplete && ( iPad != 255 ) && ( iPad >= 0 ) ) + { + EUIGroup group = (EUIGroup)(iPad+1); + navComplete = m_groups[(int)group]->NavigateBack(iPad, eScene, eLayer); + if(!m_groups[(int)group]->GetMenuDisplayed())SetMenuDisplayed(iPad,false); + } + // 4J-PB - autosave in fullscreen doesn't clear the menuDisplayed flag + else + { + if(!m_groups[(int)eUIGroup_Fullscreen]->GetMenuDisplayed()) + { + setFullscreenMenuDisplayed(false); + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + SetMenuDisplayed(i,m_groups[i+1]->GetMenuDisplayed()); + } + } + } + } + else + { + navComplete = m_groups[(int)eUIGroup_Fullscreen]->NavigateBack(iPad, eScene, eLayer); + if(!m_groups[(int)eUIGroup_Fullscreen]->GetMenuDisplayed()) SetMenuDisplayed(XUSER_INDEX_ANY,false); + } + return navComplete; +} + +void UIController::NavigateToHomeMenu() +{ + ui.CloseAllPlayersScenes(); + + // Alert the app the we no longer want to be informed of ethernet connections + app.SetLiveLinkRequired( false ); + + Minecraft *pMinecraft = Minecraft::GetInstance(); + + // 4J-PB - just about to switched to the default texture pack , so clean up anything texture pack related here + + // unload any texture pack audio + // if there is audio in use, clear out the audio, and unmount the pack + TexturePack *pTexPack=Minecraft::GetInstance()->skins->getSelected(); + + + DLCTexturePack *pDLCTexPack=NULL; + if(pTexPack->hasAudio()) + { + // get the dlc texture pack, and store it + pDLCTexPack=(DLCTexturePack *)pTexPack; + } + + // change to the default texture pack + pMinecraft->skins->selectTexturePackById(TexturePackRepository::DEFAULT_TEXTURE_PACK_ID); + + + if(pTexPack->hasAudio()) + { + // need to stop the streaming audio - by playing streaming audio from the default texture pack now + // reset the streaming sounds back to the normal ones + pMinecraft->soundEngine->SetStreamingSounds(eStream_Overworld_Calm1,eStream_Overworld_piano3, + eStream_Nether1,eStream_Nether4, + eStream_end_dragon,eStream_end_end, + eStream_CD_1); + pMinecraft->soundEngine->playStreaming(L"", 0, 0, 0, 1, 1); + + // if(pDLCTexPack->m_pStreamedWaveBank!=NULL) + // { + // pDLCTexPack->m_pStreamedWaveBank->Destroy(); + // } + // if(pDLCTexPack->m_pSoundBank!=NULL) + // { + // pDLCTexPack->m_pSoundBank->Destroy(); + // } +#ifdef _XBOX_ONE + DWORD result = StorageManager.UnmountInstalledDLC(L"TPACK"); +#else + DWORD result = StorageManager.UnmountInstalledDLC("TPACK"); +#endif + + app.DebugPrintf("Unmount result is %d\n",result); + } + + g_NetworkManager.ForceFriendsSessionRefresh(); + + if(pMinecraft->skins->needsUIUpdate()) + { + m_navigateToHomeOnReload = true; + } + else + { + ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_MainMenu); + } +} + +UIScene *UIController::GetTopScene(int iPad, EUILayer layer, EUIGroup group) +{ + if(group == eUIGroup_PAD) + { + if( app.GetGameStarted() ) + { + // If the game isn't running treat as user 0, otherwise map index directly from pad + if( ( iPad != 255 ) && ( iPad >= 0 ) ) + { + group = (EUIGroup)(iPad+1); + } + else group = eUIGroup_Fullscreen; + } + else + { + layer = eUILayer_Fullscreen; + group = eUIGroup_Fullscreen; + } + } + return m_groups[(int)group]->GetTopScene(layer); +} + +size_t UIController::RegisterForCallbackId(UIScene *scene) +{ + EnterCriticalSection(&m_registeredCallbackScenesCS); + size_t newId = GetTickCount(); + newId &= 0xFFFFFF; // Chop off the top byte, we don't need any more accuracy than that + newId |= (scene->getSceneType() << 24); // Add in the scene's type to help keep this unique + m_registeredCallbackScenes[newId] = scene; + LeaveCriticalSection(&m_registeredCallbackScenesCS); + return newId; +} + +void UIController::UnregisterCallbackId(size_t id) +{ + EnterCriticalSection(&m_registeredCallbackScenesCS); + AUTO_VAR(it, m_registeredCallbackScenes.find(id) ); + if(it != m_registeredCallbackScenes.end() ) + { + m_registeredCallbackScenes.erase(it); + } + LeaveCriticalSection(&m_registeredCallbackScenesCS); +} + +UIScene *UIController::GetSceneFromCallbackId(size_t id) +{ + UIScene *scene = NULL; + AUTO_VAR(it, m_registeredCallbackScenes.find(id) ); + if(it != m_registeredCallbackScenes.end() ) + { + scene = it->second; + } + return scene; +} + +void UIController::EnterCallbackIdCriticalSection() +{ + EnterCriticalSection(&m_registeredCallbackScenesCS); +} + +void UIController::LeaveCallbackIdCriticalSection() +{ + LeaveCriticalSection(&m_registeredCallbackScenesCS); +} + +void UIController::CloseAllPlayersScenes() +{ + m_groups[(int)eUIGroup_Fullscreen]->getTooltips()->SetTooltips(-1); + for(unsigned int i = 0; i < eUIGroup_COUNT; ++i) + { + //m_bCloseAllScenes[i] = true; + m_groups[i]->closeAllScenes(); + m_groups[i]->getTooltips()->SetTooltips(-1); + } + + if (!m_groups[eUIGroup_Fullscreen]->GetMenuDisplayed()) { + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + SetMenuDisplayed(i,false); + } + } + setFullscreenMenuDisplayed(false); +} + +void UIController::CloseUIScenes(int iPad, bool forceIPad) +{ + EUIGroup group; + if( app.GetGameStarted() || forceIPad ) + { + // If the game isn't running treat as user 0, otherwise map index directly from pad + if( ( iPad != 255 ) && ( iPad >= 0 ) ) group = (EUIGroup)(iPad+1); + else group = eUIGroup_Fullscreen; + } + else + { + group = eUIGroup_Fullscreen; + } + + m_groups[(int)group]->closeAllScenes(); + m_groups[(int)group]->getTooltips()->SetTooltips(-1); + + // This should cause the popup to dissappear + TutorialPopupInfo popupInfo; + if(m_groups[(int)group]->getTutorialPopup()) m_groups[(int)group]->getTutorialPopup()->SetTutorialDescription(&popupInfo); + + if(group==eUIGroup_Fullscreen) setFullscreenMenuDisplayed(false); + + SetMenuDisplayed((group == eUIGroup_Fullscreen ? XUSER_INDEX_ANY : iPad), m_groups[(int)group]->GetMenuDisplayed()); +} + +void UIController::setFullscreenMenuDisplayed(bool displayed) +{ + // Show/hide the tooltips for the fullscreen group + m_groups[(int)eUIGroup_Fullscreen]->showComponent(ProfileManager.GetPrimaryPad(),eUIComponent_Tooltips,eUILayer_Tooltips,displayed); + + // Show/hide tooltips for the other layers + for(unsigned int i = (eUIGroup_Fullscreen+1); i < eUIGroup_COUNT; ++i) + { + m_groups[i]->showComponent(i,eUIComponent_Tooltips,eUILayer_Tooltips,!displayed); + } +} + +bool UIController::IsPauseMenuDisplayed(int iPad) +{ + EUIGroup group; + if( app.GetGameStarted() ) + { + // If the game isn't running treat as user 0, otherwise map index directly from pad + if( ( iPad != 255 ) && ( iPad >= 0 ) ) group = (EUIGroup)(iPad+1); + else group = eUIGroup_Fullscreen; + } + else + { + group = eUIGroup_Fullscreen; + } + return m_groups[(int)group]->IsPauseMenuDisplayed(); +} + +bool UIController::IsContainerMenuDisplayed(int iPad) +{ + EUIGroup group; + if( app.GetGameStarted() ) + { + // If the game isn't running treat as user 0, otherwise map index directly from pad + if( ( iPad != 255 ) && ( iPad >= 0 ) ) group = (EUIGroup)(iPad+1); + else group = eUIGroup_Fullscreen; + } + else + { + group = eUIGroup_Fullscreen; + } + return m_groups[(int)group]->IsContainerMenuDisplayed(); +} + +bool UIController::IsIgnorePlayerJoinMenuDisplayed(int iPad) +{ + EUIGroup group; + if( app.GetGameStarted() ) + { + // If the game isn't running treat as user 0, otherwise map index directly from pad + if( ( iPad != 255 ) && ( iPad >= 0 ) ) group = (EUIGroup)(iPad+1); + else group = eUIGroup_Fullscreen; + } + else + { + group = eUIGroup_Fullscreen; + } + return m_groups[(int)group]->IsIgnorePlayerJoinMenuDisplayed(); +} + +bool UIController::IsIgnoreAutosaveMenuDisplayed(int iPad) +{ + EUIGroup group; + if( app.GetGameStarted() ) + { + // If the game isn't running treat as user 0, otherwise map index directly from pad + if( ( iPad != 255 ) && ( iPad >= 0 ) ) group = (EUIGroup)(iPad+1); + else group = eUIGroup_Fullscreen; + } + else + { + group = eUIGroup_Fullscreen; + } + return m_groups[(int)eUIGroup_Fullscreen]->IsIgnoreAutosaveMenuDisplayed() || (group != eUIGroup_Fullscreen && m_groups[(int)group]->IsIgnoreAutosaveMenuDisplayed()); +} + +void UIController::SetIgnoreAutosaveMenuDisplayed(int iPad, bool displayed) +{ + app.DebugPrintf(app.USER_SR, "UIController::SetIgnoreAutosaveMenuDisplayed is not implemented\n"); +} + +bool UIController::IsSceneInStack(int iPad, EUIScene eScene) +{ + EUIGroup group; + if( app.GetGameStarted() ) + { + // If the game isn't running treat as user 0, otherwise map index directly from pad + if( ( iPad != 255 ) && ( iPad >= 0 ) ) group = (EUIGroup)(iPad+1); + else group = eUIGroup_Fullscreen; + } + else + { + group = eUIGroup_Fullscreen; + } + return m_groups[(int)group]->IsSceneInStack(eScene); +} + +bool UIController::GetMenuDisplayed(int iPad) +{ + return m_bMenuDisplayed[iPad]; +} + +void UIController::SetMenuDisplayed(int iPad,bool bVal) +{ + if(bVal) + { + if(iPad==XUSER_INDEX_ANY) + { + for(int i=0;irunning) + InputManager.SetEnabledGtcButtons(_360_GTC_MENU | _360_GTC_PAUSE | _360_GTC_VIEW); +#endif + } + } +} + +void UIController::CheckMenuDisplayed() +{ + for(int iPad=0;iPadgetTooltips()) m_groups[(int)group]->getTooltips()->SetTooltipText(tooltip, iTextID); +} + +void UIController::SetEnableTooltips( unsigned int iPad, BOOL bVal ) +{ + EUIGroup group; + if( app.GetGameStarted() ) + { + // If the game isn't running treat as user 0, otherwise map index directly from pad + if( ( iPad != 255 ) ) group = (EUIGroup)(iPad+1); + else group = eUIGroup_Fullscreen; + } + else + { + group = eUIGroup_Fullscreen; + } + if(m_groups[(int)group]->getTooltips()) m_groups[(int)group]->getTooltips()->SetEnableTooltips(bVal); +} + +void UIController::ShowTooltip( unsigned int iPad, unsigned int tooltip, bool show ) +{ + EUIGroup group; + if( app.GetGameStarted() ) + { + // If the game isn't running treat as user 0, otherwise map index directly from pad + if( ( iPad != 255 ) ) group = (EUIGroup)(iPad+1); + else group = eUIGroup_Fullscreen; + } + else + { + group = eUIGroup_Fullscreen; + } + if(m_groups[(int)group]->getTooltips()) m_groups[(int)group]->getTooltips()->ShowTooltip(tooltip,show); +} + +void UIController::SetTooltips( unsigned int iPad, int iA, int iB, int iX, int iY, int iLT, int iRT, int iLB, int iRB, int iLS, int iRS, int iBack, bool forceUpdate) +{ + EUIGroup group; + + // 4J-PB - strip out any that are not applicable on the platform +#ifndef _XBOX + if(iX==IDS_TOOLTIPS_SELECTDEVICE) iX=-1; + if(iX==IDS_TOOLTIPS_CHANGEDEVICE) iX=-1; + +#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) + if(iY==IDS_TOOLTIPS_VIEW_GAMERCARD) iY=-1; + if(iY==IDS_TOOLTIPS_VIEW_GAMERPROFILE) iY=-1; + +#endif +#endif + + if( app.GetGameStarted() ) + { + // If the game isn't running treat as user 0, otherwise map index directly from pad + if( ( iPad != 255 ) ) group = (EUIGroup)(iPad+1); + else group = eUIGroup_Fullscreen; + } + else + { + group = eUIGroup_Fullscreen; + } + if(m_groups[(int)group]->getTooltips()) m_groups[(int)group]->getTooltips()->SetTooltips(iA, iB, iX, iY, iLT, iRT, iLB, iRB, iLS, iRS, iBack, forceUpdate); +} + +void UIController::EnableTooltip( unsigned int iPad, unsigned int tooltip, bool enable ) +{ + EUIGroup group; + if( app.GetGameStarted() ) + { + // If the game isn't running treat as user 0, otherwise map index directly from pad + if( ( iPad != 255 ) ) group = (EUIGroup)(iPad+1); + else group = eUIGroup_Fullscreen; + } + else + { + group = eUIGroup_Fullscreen; + } + if(m_groups[(int)group]->getTooltips()) m_groups[(int)group]->getTooltips()->EnableTooltip(tooltip,enable); +} + +void UIController::RefreshTooltips(unsigned int iPad) +{ + app.DebugPrintf(app.USER_SR, "UIController::RefreshTooltips is not implemented\n"); +} + +void UIController::AnimateKeyPress(int iPad, int iAction, bool bRepeat, bool bPressed, bool bReleased) +{ + EUIGroup group; + if(bPressed==false) + { + // only animating button press + return; + } + if( app.GetGameStarted() ) + { + // If the game isn't running treat as user 0, otherwise map index directly from pad + if( ( iPad != 255 ) && ( iPad >= 0 ) ) group = (EUIGroup)(iPad+1); + else group = eUIGroup_Fullscreen; + } + else + { + group = eUIGroup_Fullscreen; + } + bool handled = false; + if(m_groups[(int)group]->getTooltips()) m_groups[(int)group]->getTooltips()->handleInput(iPad, iAction, bRepeat, bPressed, bReleased, handled); +} + +void UIController::OverrideSFX(int iPad, int iAction,bool bVal) +{ + EUIGroup group; + + if( app.GetGameStarted() ) + { + // If the game isn't running treat as user 0, otherwise map index directly from pad + if( ( iPad != 255 ) && ( iPad >= 0 ) ) group = (EUIGroup)(iPad+1); + else group = eUIGroup_Fullscreen; + } + else + { + group = eUIGroup_Fullscreen; + } + bool handled = false; + if(m_groups[(int)group]->getTooltips()) m_groups[(int)group]->getTooltips()->overrideSFX(iPad, iAction,bVal); +} + +void UIController::PlayUISFX(ESoundEffect eSound) +{ + __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); +} + +void UIController::DisplayGamertag(unsigned int iPad, bool show) +{ + // The host decides whether these are on or off + if( app.GetGameSettings(ProfileManager.GetPrimaryPad(),eGameSetting_DisplaySplitscreenGamertags) == 0) + { + show = false; + } + EUIGroup group = (EUIGroup)(iPad+1); + if(m_groups[(int)group]->getHUD()) m_groups[(int)group]->getHUD()->ShowDisplayName(show); + + // Update TutorialPopup in Splitscreen if no container is displayed (to make sure the Popup does not overlap with the Gamertag!) + if(app.GetLocalPlayerCount() > 1 && m_groups[(int)group]->getTutorialPopup() && !m_groups[(int)group]->IsContainerMenuDisplayed()) + { + m_groups[(int)group]->getTutorialPopup()->UpdateTutorialPopup(); + } +} + +void UIController::SetSelectedItem(unsigned int iPad, const wstring &name) +{ + EUIGroup group; + + if( app.GetGameStarted() ) + { + // If the game isn't running treat as user 0, otherwise map index directly from pad + if( ( iPad != 255 ) && ( iPad >= 0 ) ) group = (EUIGroup)(iPad+1); + else group = eUIGroup_Fullscreen; + } + else + { + group = eUIGroup_Fullscreen; + } + bool handled = false; + if(m_groups[(int)group]->getHUD()) m_groups[(int)group]->getHUD()->SetSelectedLabel(name); +} + +void UIController::UpdateSelectedItemPos(unsigned int iPad) +{ + app.DebugPrintf(app.USER_SR, "UIController::UpdateSelectedItemPos not implemented\n"); +} + +void UIController::HandleDLCMountingComplete() +{ + for(unsigned int i = 0; i < eUIGroup_COUNT; ++i) + { + app.DebugPrintf("UIController::HandleDLCMountingComplete - m_groups[%d]\n",i); + m_groups[i]->HandleDLCMountingComplete(); + } +} + +void UIController::HandleDLCInstalled(int iPad) +{ + //app.DebugPrintf(app.USER_SR, "UIController::HandleDLCInstalled not implemented\n"); + for(unsigned int i = 0; i < eUIGroup_COUNT; ++i) + { + m_groups[i]->HandleDLCInstalled(); + } +} + + +#ifdef _XBOX_ONE +void UIController::HandleDLCLicenseChange() +{ + for(unsigned int i = 0; i < eUIGroup_COUNT; ++i) + { + app.DebugPrintf("UIController::HandleDLCLicenseChange - m_groups[%d]\n",i); + m_groups[i]->HandleDLCLicenseChange(); + } +} +#endif + +void UIController::HandleTMSDLCFileRetrieved(int iPad) +{ + app.DebugPrintf(app.USER_SR, "UIController::HandleTMSDLCFileRetrieved not implemented\n"); +} + +void UIController::HandleTMSBanFileRetrieved(int iPad) +{ + app.DebugPrintf(app.USER_SR, "UIController::HandleTMSBanFileRetrieved not implemented\n"); +} + +void UIController::HandleInventoryUpdated(int iPad) +{ + 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() +{ + tickInput(); + + for(unsigned int i = 0; i < eUIGroup_COUNT; ++i) + { + if(m_groups[i]->getHUD()) m_groups[i]->getHUD()->handleGameTick(); + } +} + +void UIController::SetTutorial(int iPad, Tutorial *tutorial) +{ + EUIGroup group; + if( app.GetGameStarted() ) + { + // If the game isn't running treat as user 0, otherwise map index directly from pad + if( ( iPad != 255 ) && ( iPad >= 0 ) ) group = (EUIGroup)(iPad+1); + else group = eUIGroup_Fullscreen; + } + else + { + group = eUIGroup_Fullscreen; + } + if(m_groups[(int)group]->getTutorialPopup()) m_groups[(int)group]->getTutorialPopup()->SetTutorial(tutorial); +} + +void UIController::SetTutorialDescription(int iPad, TutorialPopupInfo *info) +{ + EUIGroup group; + if( app.GetGameStarted() ) + { + // If the game isn't running treat as user 0, otherwise map index directly from pad + if( ( iPad != 255 ) && ( iPad >= 0 ) ) group = (EUIGroup)(iPad+1); + else group = eUIGroup_Fullscreen; + } + else + { + group = eUIGroup_Fullscreen; + } + + if(m_groups[(int)group]->getTutorialPopup()) + { + // tutorial popup needs to know if a container menu is being displayed + m_groups[(int)group]->getTutorialPopup()->SetContainerMenuVisible(m_groups[(int)group]->IsContainerMenuDisplayed()); + m_groups[(int)group]->getTutorialPopup()->SetTutorialDescription(info); + } +} + +#ifndef _XBOX +void UIController::RemoveInteractSceneReference(int iPad, UIScene *scene) +{ + EUIGroup group; + if( ( 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 + +void UIController::SetTutorialVisible(int iPad, bool visible) +{ + EUIGroup group; + if( app.GetGameStarted() ) + { + // If the game isn't running treat as user 0, otherwise map index directly from pad + if( ( iPad != 255 ) && ( iPad >= 0 ) ) group = (EUIGroup)(iPad+1); + else group = eUIGroup_Fullscreen; + } + else + { + group = eUIGroup_Fullscreen; + } + if(m_groups[(int)group]->getTutorialPopup()) m_groups[(int)group]->getTutorialPopup()->SetVisible(visible); +} + +bool UIController::IsTutorialVisible(int iPad) +{ + EUIGroup group; + if( app.GetGameStarted() ) + { + // If the game isn't running treat as user 0, otherwise map index directly from pad + if( ( iPad != 255 ) && ( iPad >= 0 ) ) group = (EUIGroup)(iPad+1); + else group = eUIGroup_Fullscreen; + } + else + { + group = eUIGroup_Fullscreen; + } + bool visible = false; + if(m_groups[(int)group]->getTutorialPopup()) visible = m_groups[(int)group]->getTutorialPopup()->IsVisible(); + return visible; +} + +void UIController::UpdatePlayerBasePositions() +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + + for( BYTE idx = 0; idx < XUSER_MAX_COUNT; ++idx) + { + if(pMinecraft->localplayers[idx] != NULL) + { + if(pMinecraft->localplayers[idx]->m_iScreenSection==C4JRender::VIEWPORT_TYPE_FULLSCREEN) + { + DisplayGamertag(idx,false); + } + else + { + DisplayGamertag(idx,true); + } + m_groups[idx+1]->SetViewportType((C4JRender::eViewportType)pMinecraft->localplayers[idx]->m_iScreenSection); + } + else + { + // 4J Stu - This is a legacy thing from our XUI implementation that we don't need + // Changing the viewport to fullscreen for users that no longer exist is SLOW + // This should probably be on all platforms, but I don't have time to test them all just now! +#ifndef __ORBIS__ + m_groups[idx+1]->SetViewportType(C4JRender::VIEWPORT_TYPE_FULLSCREEN); +#endif + DisplayGamertag(idx,false); + } + } +} + +void UIController::SetEmptyQuadrantLogo(int iSection) +{ + // 4J Stu - We shouldn't need to implement this +} + +void UIController::HideAllGameUIElements() +{ + // 4J Stu - We might not need to implement this + app.DebugPrintf(app.USER_SR, "UIController::HideAllGameUIElements not implemented\n"); +} + +void UIController::ShowOtherPlayersBaseScene(unsigned int iPad, bool show) +{ + // 4J Stu - We shouldn't need to implement this +} + +void UIController::ShowTrialTimer(bool show) +{ + if(m_groups[(int)eUIGroup_Fullscreen]->getPressStartToPlay()) m_groups[(int)eUIGroup_Fullscreen]->getPressStartToPlay()->showTrialTimer(show); +} + +void UIController::SetTrialTimerLimitSecs(unsigned int uiSeconds) +{ + UIController::m_dwTrialTimerLimitSecs = uiSeconds; +} + +void UIController::UpdateTrialTimer(unsigned int iPad) +{ + WCHAR wcTime[20]; + + DWORD dwTimeTicks=(DWORD)app.getTrialTimer(); + + if(dwTimeTicks>m_dwTrialTimerLimitSecs) + { + dwTimeTicks=m_dwTrialTimerLimitSecs; + } + + dwTimeTicks=m_dwTrialTimerLimitSecs-dwTimeTicks; + +#ifndef _CONTENT_PACKAGE + if(true) +#else + // display the time - only if there's less than 3 minutes + if(dwTimeTicks<180) +#endif + { + int iMins=dwTimeTicks/60; + int iSeconds=dwTimeTicks%60; + swprintf( wcTime, 20, L"%d:%02d",iMins,iSeconds); + if(m_groups[(int)eUIGroup_Fullscreen]->getPressStartToPlay()) m_groups[(int)eUIGroup_Fullscreen]->getPressStartToPlay()->setTrialTimer(wcTime); + } + else + { + if(m_groups[(int)eUIGroup_Fullscreen]->getPressStartToPlay()) m_groups[(int)eUIGroup_Fullscreen]->getPressStartToPlay()->setTrialTimer(L""); + } + + // are we out of time? + if((dwTimeTicks==0)) + { + // Trial over + // bring up the pause menu to stop the trial over message box being called again? + if(!ui.GetMenuDisplayed( iPad ) ) + { + ui.NavigateToScene(iPad, eUIScene_PauseMenu, NULL, eUILayer_Scene); + + app.SetAction(iPad,eAppAction_TrialOver); + } + } +} + +void UIController::ReduceTrialTimerValue() +{ + DWORD dwTimeTicks=(int)app.getTrialTimer(); + + if(dwTimeTicks>m_dwTrialTimerLimitSecs) + { + dwTimeTicks=m_dwTrialTimerLimitSecs; + } + + m_dwTrialTimerLimitSecs-=dwTimeTicks; +} + +void UIController::ShowAutosaveCountdownTimer(bool show) +{ + if(m_groups[(int)eUIGroup_Fullscreen]->getPressStartToPlay()) m_groups[(int)eUIGroup_Fullscreen]->getPressStartToPlay()->showTrialTimer(show); +} + +void UIController::UpdateAutosaveCountdownTimer(unsigned int uiSeconds) +{ +#if !(defined(_XBOX_ONE) || defined(__ORBIS__)) + WCHAR wcAutosaveCountdown[100]; + swprintf( wcAutosaveCountdown, 100, app.GetString(IDS_AUTOSAVE_COUNTDOWN),uiSeconds); + if(m_groups[(int)eUIGroup_Fullscreen]->getPressStartToPlay()) m_groups[(int)eUIGroup_Fullscreen]->getPressStartToPlay()->setTrialTimer(wcAutosaveCountdown); +#endif +} + +void UIController::ShowSavingMessage(unsigned int iPad, C4JStorage::ESavingMessage eVal) +{ + bool show = false; + switch(eVal) + { + case C4JStorage::ESavingMessage_None: + show = false; + break; + case C4JStorage::ESavingMessage_Short: + case C4JStorage::ESavingMessage_Long: + show = true; + break; + } + if(m_groups[(int)eUIGroup_Fullscreen]->getPressStartToPlay()) m_groups[(int)eUIGroup_Fullscreen]->getPressStartToPlay()->showSaveIcon(show); +} + +void UIController::ShowPlayerDisplayname(bool show) +{ + if(m_groups[(int)eUIGroup_Fullscreen]->getPressStartToPlay()) m_groups[(int)eUIGroup_Fullscreen]->getPressStartToPlay()->showPlayerDisplayName(show); +} + +void UIController::SetWinUserIndex(unsigned int iPad) +{ + m_winUserIndex = iPad; +} + +unsigned int UIController::GetWinUserIndex() +{ + return m_winUserIndex; +} + +void UIController::ShowUIDebugConsole(bool show) +{ +#ifndef _CONTENT_PACKAGE + + if(show) + { + m_uiDebugConsole = (UIComponent_DebugUIConsole *)m_groups[eUIGroup_Fullscreen]->addComponent(0, eUIComponent_DebugUIConsole, eUILayer_Debug); + } + else + { + m_groups[eUIGroup_Fullscreen]->removeComponent(eUIComponent_DebugUIConsole, eUILayer_Debug); + m_uiDebugConsole = NULL; + } +#endif +} + +void UIController::ShowUIDebugMarketingGuide(bool show) +{ +#ifndef _CONTENT_PACKAGE + + if(show) + { + m_uiDebugMarketingGuide = (UIComponent_DebugUIMarketingGuide *)m_groups[eUIGroup_Fullscreen]->addComponent(0, eUIComponent_DebugUIMarketingGuide, eUILayer_Debug); + } + else + { + m_groups[eUIGroup_Fullscreen]->removeComponent(eUIComponent_DebugUIMarketingGuide, eUILayer_Debug); + m_uiDebugMarketingGuide = NULL; + } +#endif +} + +void UIController::logDebugString(const string &text) +{ + if(m_uiDebugConsole) m_uiDebugConsole->addText(text); +} + +bool UIController::PressStartPlaying(unsigned int iPad) +{ + return m_iPressStartQuadrantsMask&(1<getPressStartToPlay()) m_groups[(int)eUIGroup_Fullscreen]->getPressStartToPlay()->showPressStart(iPad, true); +} + +void UIController::HidePressStart() +{ + ClearPressStart(); + if(m_groups[(int)eUIGroup_Fullscreen]->getPressStartToPlay()) m_groups[(int)eUIGroup_Fullscreen]->getPressStartToPlay()->showPressStart(0, false); +} + +void UIController::ClearPressStart() +{ + m_iPressStartQuadrantsMask = 0; +} + +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, WCHAR *pwchFormatString,DWORD dwFocusButton, bool bIsError) + +{ + MessageBoxInfo param; + param.uiTitle = uiTitle; + param.uiText = uiText; + param.uiOptionA = uiOptionA; + param.uiOptionC = uiOptionC; + param.dwPad = dwPad; + param.Func = Func; + param.lpParam = lpParam; + param.pwchFormatString = pwchFormatString; + param.dwFocusButton = dwFocusButton; + + EUILayer layer = bIsError?eUILayer_Error:eUILayer_Alert; + + bool completed = false; + if(ui.IsReloadingSkin()) + { + // Queue this message box + QueuedMessageBoxData *queuedData = new QueuedMessageBoxData(); + queuedData->info = param; + queuedData->info.uiOptionA = new UINT[param.uiOptionC]; + memcpy(queuedData->info.uiOptionA, param.uiOptionA, param.uiOptionC * sizeof(UINT)); + queuedData->iPad = dwPad; + queuedData->layer = eUILayer_Error; // Ensures that these don't get wiped out by a CloseAllScenes call + m_queuedMessageBoxData.push_back(queuedData); + } + else + { + completed = ui.NavigateToScene(dwPad, eUIScene_MessageBox, ¶m, layer, eUIGroup_Fullscreen); + } + + if( completed ) + { + // This may happen if we had to queue the message box, or there was already a message box displaying and so the NavigateToScene returned false; + return C4JStorage::EMessage_Pending; + } + else + { + return C4JStorage::EMessage_Busy; + } +} + +C4JStorage::EMessageResult UIController::RequestUGCMessageBox(UINT title/* = -1 */, UINT message/* = -1 */, int iPad/* = -1*/, int( *Func)(LPVOID,int,const C4JStorage::EMessageResult)/* = NULL*/, LPVOID lpParam/* = NULL*/) +{ + // Default title / messages + if (title == -1) + { + title = IDS_FAILED_TO_CREATE_GAME_TITLE; + } + + if (message == -1) + { + message = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_CREATE; + } + + // Default pad to primary player + if (iPad == -1) iPad = ProfileManager.GetPrimaryPad(); + +#ifdef __ORBIS__ + // Show the vague UGC system message in addition to our message + ProfileManager.DisplaySystemMessage( SCE_MSG_DIALOG_SYSMSG_TYPE_TRC_PSN_UGC_RESTRICTION, iPad ); + return C4JStorage::EMessage_ResultAccept; +#elif defined(__PSVITA__) + ProfileManager.ShowSystemMessage( SCE_MSG_DIALOG_SYSMSG_TYPE_TRC_PSN_CHAT_RESTRICTION, iPad ); + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + return ui.RequestAlertMessage( title, IDS_CHAT_RESTRICTION_UGC, uiIDA, 1, iPad, Func, lpParam); +#else + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + return ui.RequestAlertMessage( title, message, uiIDA, 1, iPad, Func, lpParam); +#endif +} + +C4JStorage::EMessageResult UIController::RequestContentRestrictedMessageBox(UINT title/* = -1 */, UINT message/* = -1 */, int iPad/* = -1*/, int( *Func)(LPVOID,int,const C4JStorage::EMessageResult)/* = NULL*/, LPVOID lpParam/* = NULL*/) +{ + // Default title / messages + if (title == -1) + { + title = IDS_FAILED_TO_CREATE_GAME_TITLE; + } + + if (message == -1) + { +#if defined(_XBOX_ONE) || defined(_WINDOWS64) + // IDS_CONTENT_RESTRICTION doesn't exist on XB1 + message = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_CREATE; +#else + message = IDS_CONTENT_RESTRICTION; +#endif + } + + // Default pad to primary player + if (iPad == -1) iPad = ProfileManager.GetPrimaryPad(); + +#ifdef __ORBIS__ + // Show the vague UGC system message in addition to our message + ProfileManager.DisplaySystemMessage( SCE_MSG_DIALOG_SYSMSG_TYPE_TRC_PSN_UGC_RESTRICTION, iPad ); + return C4JStorage::EMessage_ResultAccept; +#elif defined(__PSVITA__) + ProfileManager.ShowSystemMessage( SCE_MSG_DIALOG_SYSMSG_TYPE_TRC_PSN_AGE_RESTRICTION, iPad ); + return C4JStorage::EMessage_ResultAccept; +#else + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + return ui.RequestAlertMessage( title, message, uiIDA, 1, iPad, Func, lpParam); +#endif +} + +void UIController::setFontCachingCalculationBuffer(int length) +{ + /* 4J-JEV: As described in an email from Sean. + If your `optional_temp_buffer` is NULL, Iggy will allocate the temp + buffer on the stack during Iggy draw calls. The size of the buffer it + will allocate is 16 bytes times `max_chars` in 32-bit, and 24 bytes + times `max_chars` in 64-bit. If the stack of the thread making the + draw call is not large enough, Iggy will crash or otherwise behave + incorrectly. + */ +#if defined __ORBIS__ || defined _DURANGO || defined _WIN64 + static const int CHAR_SIZE = 24; +#else + static const int CHAR_SIZE = 16; +#endif + + if (m_tempBuffer != NULL) delete [] m_tempBuffer; + if (length<0) + { + if (m_defaultBuffer == NULL) m_defaultBuffer = new char[CHAR_SIZE*5000]; + IggySetFontCachingCalculationBuffer(5000, m_defaultBuffer, CHAR_SIZE*5000); + } + else + { + m_tempBuffer = new char[CHAR_SIZE*length]; + IggySetFontCachingCalculationBuffer(length, m_tempBuffer, CHAR_SIZE*length); + } +} + +// Returns the first scene of given type if it exists, NULL otherwise +UIScene *UIController::FindScene(EUIScene sceneType) +{ + UIScene *pScene = NULL; + + for (int i = 0; i < eUIGroup_COUNT; i++) + { + pScene = m_groups[i]->FindScene(sceneType); +#ifdef __PS3__ + if (pScene != NULL) return pScene; +#else + if (pScene != nullptr) return pScene; +#endif + } + + return pScene; +} + +#ifdef __PSVITA__ + +void UIController::TouchBoxAdd(UIControl *pControl,UIScene *pUIScene) +{ + EUIGroup eUIGroup=pUIScene->GetParentLayerGroup(); + EUILayer eUILayer=pUIScene->GetParentLayer()->m_iLayer; + EUIScene eUIscene=pUIScene->getSceneType(); + + TouchBoxAdd(pControl,eUIGroup,eUILayer,eUIscene, pUIScene->GetMainPanel()); +} + +void UIController::TouchBoxAdd(UIControl *pControl,EUIGroup eUIGroup,EUILayer eUILayer,EUIScene eUIscene, UIControl *pMainPanelControl) +{ + UIELEMENT *puiElement = new UIELEMENT; + puiElement->pControl = pControl; + + S32 iControlWidth = pControl->getWidth(); + S32 iControlHeight = pControl->getHeight(); + S32 iMainPanelOffsetX = 0; + S32 iMainPanelOffsetY= 0; + + // 4J-TomK add main panel offset if controls do not live in the root scene + if(pMainPanelControl) + { + iMainPanelOffsetX = pMainPanelControl->getXPos(); + iMainPanelOffsetY = pMainPanelControl->getYPos(); + } + + // 4J-TomK override control width / height where needed + if(puiElement->pControl->getControlType() == UIControl::eSlider) + { + // Sliders are never scaled but masked, so we have to get the real width from AS + UIControl_Slider *pSlider = (UIControl_Slider *)puiElement->pControl; + iControlWidth = pSlider->GetRealWidth(); + } + else if(puiElement->pControl->getControlType() == UIControl::eTexturePackList) + { + // The origin of the TexturePackList is NOT in the top left corner but where the slot area starts. therefore we need the height of the slot area itself. + UIControl_TexturePackList *pTexturePackList = (UIControl_TexturePackList *)puiElement->pControl; + iControlHeight = pTexturePackList->GetRealHeight(); + } + else if(puiElement->pControl->getControlType() == UIControl::eDynamicLabel) + { + // The height and width of this control changes per how to play page + UIControl_DynamicLabel *pDynamicLabel = (UIControl_DynamicLabel *)puiElement->pControl; + iControlWidth = pDynamicLabel->GetRealWidth(); + iControlHeight = pDynamicLabel->GetRealHeight(); + } + else if(puiElement->pControl->getControlType() == UIControl::eHTMLLabel) + { + // The height and width of this control changes per how to play page + UIControl_HTMLLabel *pHtmlLabel = (UIControl_HTMLLabel *)puiElement->pControl; + iControlWidth = pHtmlLabel->GetRealWidth(); + iControlHeight = pHtmlLabel->GetRealHeight(); + } + + puiElement->x1=(S32)((float)pControl->getXPos() + (float)iMainPanelOffsetX); + puiElement->y1=(S32)((float)pControl->getYPos() + (float)iMainPanelOffsetY); + puiElement->x2=(S32)(((float)pControl->getXPos() + (float)iControlWidth + (float)iMainPanelOffsetX)); + puiElement->y2=(S32)(((float)pControl->getYPos() + (float)iControlHeight + (float)iMainPanelOffsetY)); + + if(puiElement->pControl->getControlType() == UIControl::eNoControl) + { + app.DebugPrintf("NO CONTROL!"); + } + + if(puiElement->x1 == puiElement->x2 || puiElement->y1 == puiElement->y2) + { + app.DebugPrintf("NOT adding touchbox %d,%d,%d,%d\n",puiElement->x1,puiElement->y1,puiElement->x2,puiElement->y2); + } + else + { + app.DebugPrintf("Adding touchbox %d,%d,%d,%d\n",puiElement->x1,puiElement->y1,puiElement->x2,puiElement->y2); + m_TouchBoxes[eUIGroup][eUILayer][eUIscene].push_back(puiElement); + } +} + +void UIController::TouchBoxRebuild(UIScene *pUIScene) +{ + EUIGroup eUIGroup=pUIScene->GetParentLayerGroup(); + EUILayer eUILayer=pUIScene->GetParentLayer()->m_iLayer; + EUIScene eUIscene=pUIScene->getSceneType(); + + // if we delete an element, it's possible that the scene has re-arranged all the elements, so we need to rebuild the boxes + ui.TouchBoxesClear(pUIScene); + + // rebuild boxes + AUTO_VAR(itEnd, pUIScene->GetControls()->end()); + for (AUTO_VAR(it, pUIScene->GetControls()->begin()); it != itEnd; it++) + { + UIControl *control=(UIControl *)*it; + + if(control->getControlType() == UIControl::eButton || + control->getControlType() == UIControl::eSlider || + control->getControlType() == UIControl::eCheckBox || + control->getControlType() == UIControl::eTexturePackList || + control->getControlType() == UIControl::eButtonList || + control->getControlType() == UIControl::eTextInput || + control->getControlType() == UIControl::eDynamicLabel || + control->getControlType() == UIControl::eHTMLLabel || + control->getControlType() == UIControl::eLeaderboardList || + control->getControlType() == UIControl::eTouchControl) + { + 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()); + } + } + } +} + +void UIController::TouchBoxesClear(UIScene *pUIScene) +{ + EUIGroup eUIGroup=pUIScene->GetParentLayerGroup(); + EUILayer eUILayer=pUIScene->GetParentLayer()->m_iLayer; + EUIScene eUIscene=pUIScene->getSceneType(); + + AUTO_VAR(itEnd, m_TouchBoxes[eUIGroup][eUILayer][eUIscene].end()); + for (AUTO_VAR(it, m_TouchBoxes[eUIGroup][eUILayer][eUIscene].begin()); it != itEnd; it++) + { + UIELEMENT *element=(UIELEMENT *)*it; + delete element; + } + m_TouchBoxes[eUIGroup][eUILayer][eUIscene].clear(); +} + +bool UIController::TouchBoxHit(UIScene *pUIScene,S32 x, S32 y) +{ + EUIGroup eUIGroup=pUIScene->GetParentLayerGroup(); + EUILayer eUILayer=pUIScene->GetParentLayer()->m_iLayer; + EUIScene eUIscene=pUIScene->getSceneType(); + + // 4J-TomK let's do the transformation from touch resolution to screen resolution here, so our touchbox values always are in screen resolution! + x *= (m_fScreenWidth/1920.0f); + y *= (m_fScreenHeight/1080.0f); + + if(m_TouchBoxes[eUIGroup][eUILayer][eUIscene].size()>0) + { + AUTO_VAR(itEnd, m_TouchBoxes[eUIGroup][eUILayer][eUIscene].end()); + for (AUTO_VAR(it, m_TouchBoxes[eUIGroup][eUILayer][eUIscene].begin()); it != itEnd; it++) + { + UIELEMENT *element=(UIELEMENT *)*it; + if(element->pControl->getHidden() == false && element->pControl->getVisible()) // ignore removed controls + { + if((x>=element->x1) &&(x<=element->x2) && (y>=element->y1) && (y<=element->y2)) + { + if(!m_bTouchscreenPressed) + { + app.DebugPrintf("SET m_ActiveUIElement (Layer: %i) at x = %i y = %i\n", (int)eUILayer, (int)x, (int)y); + m_ActiveUIElement = element; + } + // remember the currently highlighted element + m_HighlightedUIElement = element; + + return true; + } + } + } + } + + //app.DebugPrintf("MISS at x = %i y = %i\n", (int)x, (int)y); + m_HighlightedUIElement = NULL; + return false; +} + +// +// Handle Touch Input +// +void UIController::HandleTouchInput(unsigned int iPad, unsigned int key, bool bPressed, bool bRepeat, bool bReleased) +{ + // no input? no handling! + if(!bPressed && !bRepeat && !bReleased) + { + // override for instand repeat without delay! + if(m_bTouchscreenPressed && m_ActiveUIElement && ( + m_ActiveUIElement->pControl->getControlType() == UIControl::eSlider || + m_ActiveUIElement->pControl->getControlType() == UIControl::eButtonList || + m_ActiveUIElement->pControl->getControlType() == UIControl::eTexturePackList || + m_ActiveUIElement->pControl->getControlType() == UIControl::eDynamicLabel || + m_ActiveUIElement->pControl->getControlType() == UIControl::eHTMLLabel || + m_ActiveUIElement->pControl->getControlType() == UIControl::eLeaderboardList || + m_ActiveUIElement->pControl->getControlType() == UIControl::eTouchControl)) + bRepeat = true; // the above controls need to be controllable without having the finger over them + else + return; + } + + SceTouchData* pTouchData = InputManager.GetTouchPadData(iPad,false); + S32 x = pTouchData->report[0].x * (m_fScreenWidth/1920.0f); + S32 y = pTouchData->report[0].y * (m_fScreenHeight/1080.0f); + + if(bPressed && !bRepeat && !bReleased) // PRESSED HANDLING + { + app.DebugPrintf("touch input pressed\n"); + switch(m_ActiveUIElement->pControl->getControlType()) + { + case UIControl::eButton: + // set focus + UIControl_Button *pButton=(UIControl_Button *)m_ActiveUIElement->pControl; + pButton->getParentScene()->SetFocusToElement(m_ActiveUIElement->pControl->getId()); + // override bPressed to false. we only want the button to trigger on touch release! + bPressed = false; + break; + case UIControl::eSlider: + // set focus + UIControl_Slider *pSlider=(UIControl_Slider *)m_ActiveUIElement->pControl; + pSlider->getParentScene()->SetFocusToElement(m_ActiveUIElement->pControl->getId()); + break; + case UIControl::eCheckBox: + // set focus + UIControl_CheckBox *pCheckbox=(UIControl_CheckBox *)m_ActiveUIElement->pControl; + pCheckbox->getParentScene()->SetFocusToElement(m_ActiveUIElement->pControl->getId()); + // override bPressed. we only want the checkbox to trigger on touch release! + bPressed = false; + break; + case UIControl::eButtonList: + // set focus to list + UIControl_ButtonList *pButtonList=(UIControl_ButtonList *)m_ActiveUIElement->pControl; + //pButtonList->getParentScene()->SetFocusToElement(m_ActiveUIElement->pControl->getId()); + // tell list where we tapped it so it can set focus to the correct button + pButtonList->SetTouchFocus((float)x, (float)y, false); + // override bPressed. we only want the ButtonList to trigger on touch release! + bPressed = false; + break; + case UIControl::eTexturePackList: + // set focus to list + UIControl_TexturePackList *pTexturePackList=(UIControl_TexturePackList *)m_ActiveUIElement->pControl; + pTexturePackList->getParentScene()->SetFocusToElement(m_ActiveUIElement->pControl->getId()); + // tell list where we tapped it so it can set focus to the correct texture pack + pTexturePackList->SetTouchFocus((float)x - (float)m_ActiveUIElement->x1, (float)y - (float)m_ActiveUIElement->y1, false); + // override bPressed. we only want the TexturePack List to trigger on touch release! + bPressed = false; + break; + case UIControl::eTextInput: + // set focus + UIControl_TextInput *pTextInput=(UIControl_TextInput *)m_ActiveUIElement->pControl; + pTextInput->getParentScene()->SetFocusToElement(m_ActiveUIElement->pControl->getId()); + // override bPressed to false. we only want the textinput to trigger on touch release! + bPressed = false; + break; + case UIControl::eDynamicLabel: + // handle dynamic label scrolling + UIControl_DynamicLabel *pDynamicLabel=(UIControl_DynamicLabel *)m_ActiveUIElement->pControl; + pDynamicLabel->TouchScroll(y, true); + // override bPressed to false + bPressed = false; + break; + case UIControl::eHTMLLabel: + // handle dynamic label scrolling + UIControl_HTMLLabel *pHtmlLabel=(UIControl_HTMLLabel *)m_ActiveUIElement->pControl; + pHtmlLabel->TouchScroll(y, true); + // override bPressed to false + bPressed = false; + break; + case UIControl::eLeaderboardList: + // set focus to list + UIControl_LeaderboardList *pLeaderboardList=(UIControl_LeaderboardList *)m_ActiveUIElement->pControl; + // tell list where we tapped it so it can set focus to the correct button + pLeaderboardList->SetTouchFocus((float)x, (float)y, false); + // override bPressed. we only want the ButtonList to trigger on touch release! + bPressed = false; + break; + case UIControl::eTouchControl: + // pass on touch input to relevant parent scene so we can handle it there! + m_ActiveUIElement->pControl->getParentScene()->handleTouchInput(iPad, x, y, m_ActiveUIElement->pControl->getId(), bPressed, bRepeat, bReleased); + // override bPressed to false + bPressed = false; + break; + default: + app.DebugPrintf("PRESSED - UNHANDLED UI ELEMENT\n"); + break; + } + } + else if(bRepeat) // REPEAT HANDLING + { + switch(m_ActiveUIElement->pControl->getControlType()) + { + case UIControl::eButton: + /* no action */ + break; + case UIControl::eSlider: + // handle slider movement + UIControl_Slider *pSlider=(UIControl_Slider *)m_ActiveUIElement->pControl; + float fNewSliderPos = ((float)x - (float)m_ActiveUIElement->x1) / (float)pSlider->GetRealWidth(); + pSlider->SetSliderTouchPos(fNewSliderPos); + break; + case UIControl::eCheckBox: + /* no action */ + bRepeat = false; + bPressed = false; + break; + case UIControl::eButtonList: + // handle button list scrolling + UIControl_ButtonList *pButtonList=(UIControl_ButtonList *)m_ActiveUIElement->pControl; + pButtonList->SetTouchFocus((float)x, (float)y, true); + break; + case UIControl::eTexturePackList: + // handle texturepack list scrolling + UIControl_TexturePackList *pTexturePackList=(UIControl_TexturePackList *)m_ActiveUIElement->pControl; + pTexturePackList->SetTouchFocus((float)x - (float)m_ActiveUIElement->x1, (float)y - (float)m_ActiveUIElement->y1, true); + break; + case UIControl::eTextInput: + /* no action */ + bRepeat = false; + bPressed = false; + break; + case UIControl::eDynamicLabel: + // handle dynamic label scrolling + UIControl_DynamicLabel *pDynamicLabel=(UIControl_DynamicLabel *)m_ActiveUIElement->pControl; + pDynamicLabel->TouchScroll(y, true); + // override bPressed & bRepeat to false + bPressed = false; + bRepeat = false; + break; + case UIControl::eHTMLLabel: + // handle dynamic label scrolling + UIControl_HTMLLabel *pHtmlLabel=(UIControl_HTMLLabel *)m_ActiveUIElement->pControl; + pHtmlLabel->TouchScroll(y, true); + // override bPressed & bRepeat to false + bPressed = false; + bRepeat = false; + break; + case UIControl::eLeaderboardList: + // handle button list scrolling + UIControl_LeaderboardList *pLeaderboardList=(UIControl_LeaderboardList *)m_ActiveUIElement->pControl; + pLeaderboardList->SetTouchFocus((float)x, (float)y, true); + break; + case UIControl::eTouchControl: + // override bPressed to false + bPressed = false; + // pass on touch input to relevant parent scene so we can handle it there! + m_ActiveUIElement->pControl->getParentScene()->handleTouchInput(iPad, x, y, m_ActiveUIElement->pControl->getId(), bPressed, bRepeat, bReleased); + // override bRepeat to false + bRepeat = false; + break; + default: + app.DebugPrintf("REPEAT - UNHANDLED UI ELEMENT\n"); + break; + } + } + if(bReleased) // RELEASED HANDLING + { + app.DebugPrintf("touch input released\n"); + switch(m_ActiveUIElement->pControl->getControlType()) + { + case UIControl::eButton: + // trigger button on release (ONLY if the finger is still on it!) + if(m_HighlightedUIElement && m_ActiveUIElement->pControl == m_HighlightedUIElement->pControl) + bPressed = true; + break; + case UIControl::eSlider: + /* no action */ + break; + case UIControl::eCheckBox: + // trigger checkbox on release (ONLY if the finger is still on it!) + if(m_HighlightedUIElement && m_ActiveUIElement->pControl == m_HighlightedUIElement->pControl) + { + UIControl_CheckBox *pCheckbox=(UIControl_CheckBox *)m_ActiveUIElement->pControl; + if(pCheckbox->IsEnabled()) // only proceed if checkbox is enabled! + pCheckbox->TouchSetCheckbox(!pCheckbox->IsChecked()); + } + bReleased = false; + break; + case UIControl::eButtonList: + // trigger buttonlist on release (ONLY if the finger is still on it!) + if(m_HighlightedUIElement && m_ActiveUIElement->pControl == m_HighlightedUIElement->pControl) + { + UIControl_ButtonList *pButtonList=(UIControl_ButtonList *)m_ActiveUIElement->pControl; + if(pButtonList->CanTouchTrigger(x,y)) + bPressed = true; + } + break; + case UIControl::eTexturePackList: + // trigger texturepack list on release (ONLY if the finger is still on it!) + if(m_HighlightedUIElement && m_ActiveUIElement->pControl == m_HighlightedUIElement->pControl) + { + UIControl_TexturePackList *pTexturePackList=(UIControl_TexturePackList *)m_ActiveUIElement->pControl; + if(pTexturePackList->CanTouchTrigger((float)x - (float)m_ActiveUIElement->x1, (float)y - (float)m_ActiveUIElement->y1)) + bPressed = true; + } + break; + case UIControl::eTextInput: + // trigger TextInput on release (ONLY if the finger is still on it!) + if(m_HighlightedUIElement && m_ActiveUIElement->pControl == m_HighlightedUIElement->pControl) + bPressed = true; + break; + case UIControl::eDynamicLabel: + // handle dynamic label scrolling + UIControl_DynamicLabel *pDynamicLabel=(UIControl_DynamicLabel *)m_ActiveUIElement->pControl; + pDynamicLabel->TouchScroll(y, false); + break; + case UIControl::eHTMLLabel: + // handle dynamic label scrolling + UIControl_HTMLLabel *pHtmlLabel=(UIControl_HTMLLabel *)m_ActiveUIElement->pControl; + pHtmlLabel->TouchScroll(y, false); + break; + case UIControl::eLeaderboardList: + /* no action */ + break; + case UIControl::eTouchControl: + // trigger only if touch is released over the same component! + if(m_HighlightedUIElement && m_ActiveUIElement->pControl == m_HighlightedUIElement->pControl) + { + // pass on touch input to relevant parent scene so we can handle it there! + m_ActiveUIElement->pControl->getParentScene()->handleTouchInput(iPad, x, y, m_ActiveUIElement->pControl->getId(), bPressed, bRepeat, bReleased); + } + // override bReleased to false + bReleased = false; + break; + default: + app.DebugPrintf("RELEASED - UNHANDLED UI ELEMENT\n"); + break; + } + } + + // only proceed if there's input to be handled + if(bPressed || bRepeat || bReleased) + { + SendTouchInput(iPad, key, bPressed, bRepeat, bReleased); + } +} + +void UIController::SendTouchInput(unsigned int iPad, unsigned int key, bool bPressed, bool bRepeat, bool bReleased) +{ + bool handled = false; + + // Send the key to the fullscreen group first + m_groups[(int)eUIGroup_Fullscreen]->handleInput(iPad, key, bRepeat, bPressed, bReleased, handled); + if(!handled) + { + // If it's not been handled yet, then pass the event onto the players specific group + m_groups[(iPad+1)]->handleInput(iPad, key, bRepeat, bPressed, bReleased, handled); + } +} + + +#endif \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIController.h b/Minecraft.Client/Common/UI/UIController.h new file mode 100644 index 00000000..49c78032 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIController.h @@ -0,0 +1,397 @@ +#pragma once +using namespace std; +#include "IUIController.h" +#include "UIEnums.h" +#include "UIGroup.h" + +class UIAbstractBitmapFont; +class UIBitmapFont; +class UITTFFont; +class UIComponent_DebugUIConsole; +class UIComponent_DebugUIMarketingGuide; +class UIControl; + +// Base class for all shared functions between UIControllers +class UIController : public IUIController +{ +public: + static __int64 iggyAllocCount; + + // MGH - added to prevent crash loading Iggy movies while the skins were being reloaded + static CRITICAL_SECTION ms_reloadSkinCS; + static bool ms_bReloadSkinCSInitialised; + +protected: + UIComponent_DebugUIConsole *m_uiDebugConsole; + UIComponent_DebugUIMarketingGuide *m_uiDebugMarketingGuide; + +private: + CRITICAL_SECTION m_navigationLock; + + static const int UI_REPEAT_KEY_DELAY_MS = 300; // How long from press until the first repeat + static const int UI_REPEAT_KEY_REPEAT_RATE_MS = 100; // How long in between repeats + DWORD m_actionRepeatTimer[XUSER_MAX_COUNT][ACTION_MAX_MENU+1]; + + float m_fScreenWidth; + float m_fScreenHeight; + bool m_bScreenWidthSetup; + + S32 m_tileOriginX, m_tileOriginY; + + 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__ + + typedef struct + { + UIControl *pControl; + S32 x1,y1,x2,y2; + } + UIELEMENT; + // E3 - Fine for now, but we need to make this better! + vector m_TouchBoxes[eUIGroup_COUNT][eUILayer_COUNT][eUIScene_COUNT]; + bool m_bTouchscreenPressed; +#endif + // 4J Stu - These should be in the order that they reference each other (i.e. they can only reference one with a lower value in the enum) + enum ELibraries + { + eLibrary_Platform, + eLibrary_GraphicsDefault, + eLibrary_GraphicsHUD, + eLibrary_GraphicsInGame, + eLibrary_GraphicsTooltips, + eLibrary_GraphicsLabels, + eLibrary_Labels, + eLibrary_InGame, + eLibrary_HUD, + eLibrary_Tooltips, + eLibrary_Default, + +#if ( defined(_WINDOWS64) ) + // 4J Stu - Load the 720/480 skins so that we have something to fallback on during development +#ifndef _FINAL_BUILD + eLibraryFallback_Platform, + eLibraryFallback_GraphicsDefault, + eLibraryFallback_GraphicsHUD, + eLibraryFallback_GraphicsInGame, + eLibraryFallback_GraphicsTooltips, + eLibraryFallback_GraphicsLabels, + eLibraryFallback_Labels, + eLibraryFallback_InGame, + eLibraryFallback_HUD, + eLibraryFallback_Tooltips, + eLibraryFallback_Default, +#endif +#endif + + eLibrary_Count, + }; + + IggyLibrary m_iggyLibraries[eLibrary_Count]; + +protected: + GDrawFunctions *gdraw_funcs; + +private: + HIGGYEXP iggy_explorer; + HIGGYPERFMON iggy_perfmon; + bool m_iggyPerfmonEnabled; + + bool m_bMenuDisplayed[XUSER_MAX_COUNT]; // track each players menu displayed + bool m_bMenuToBeClosed[XUSER_MAX_COUNT]; // actioned at the end of the game loop + int m_iCountDown[XUSER_MAX_COUNT]; // ticks to block input + + bool m_bCloseAllScenes[eUIGroup_COUNT]; + + int m_iPressStartQuadrantsMask; + + C4JRender::eViewportType m_currentRenderViewport; + bool m_bCustomRenderPosition; + + static DWORD m_dwTrialTimerLimitSecs; + + unordered_map m_substitutionTextures; + + typedef struct _CachedMovieData + { + byteArray m_ba; + __int64 m_expiry; + } CachedMovieData; + unordered_map m_cachedMovieData; + + typedef struct _QueuedMessageBoxData + { + MessageBoxInfo info; + int iPad; + EUILayer layer; + } QueuedMessageBoxData; + vector m_queuedMessageBoxData; + + unsigned int m_winUserIndex; + //bool m_bSysUIShowing; + bool m_bSystemUIShowing; + C4JThread *m_reloadSkinThread; + bool m_navigateToHomeOnReload; + int m_accumulatedTicks; + __uint64 m_lastUiSfx; // Tracks time (ms) of last UI sound effect + + D3D11_RECT m_customRenderingClearRect; + + unordered_map m_registeredCallbackScenes; // A collection of scenes and unique id's that are used in async callbacks so we can safely handle when they get destroyed + CRITICAL_SECTION m_registeredCallbackScenesCS;; + +public: + UIController(); +#ifdef __PSVITA__ + void TouchBoxAdd(UIControl *pControl,UIScene *pUIScene); + bool TouchBoxHit(UIScene *pUIScene,S32 x, S32 y); + void TouchBoxesClear(UIScene *pUIScene); + void TouchBoxRebuild(UIScene *pUIScene); + + void HandleTouchInput(unsigned int iPad, unsigned int key, bool bPressed, bool bRepeat, bool bReleased); + void SendTouchInput(unsigned int iPad, unsigned int key, bool bPressed, bool bRepeat, bool bReleased); + + private: + void TouchBoxAdd(UIControl *pControl,EUIGroup eUIGroup,EUILayer eUILayer,EUIScene eUIscene, UIControl *pMainPanelControl); + UIELEMENT *m_ActiveUIElement; + UIELEMENT *m_HighlightedUIElement; +#endif + +protected: + UIGroup *m_groups[eUIGroup_COUNT]; + +public: + void showComponent(int iPad, EUIScene scene, EUILayer layer, EUIGroup group, bool show) + { + m_groups[group]->showComponent(iPad, scene, layer, show); + } + + void removeComponent(EUIScene scene, EUILayer layer, EUIGroup group) + { + m_groups[group]->removeComponent(scene, layer); + } + +protected: + // Should be called from the platforms init function + void preInit(S32 width, S32 height); + void postInit(); + + +public: + CRITICAL_SECTION m_Allocatorlock; + void SetupFont(); + bool PendingFontChange(); + bool UsingBitmapFont(); + +public: + // TICKING + virtual void tick(); + +private: + void loadSkins(); + IggyLibrary loadSkin(const wstring &skinPath, const wstring &skinName); + +public: + void ReloadSkin(); + virtual void StartReloadSkinThread(); + virtual bool IsReloadingSkin(); + virtual bool IsExpectingOrReloadingSkin(); + virtual void CleanUpSkinReload(); + +private: + static int reloadSkinThreadProc(void* lpParam); + +public: + byteArray getMovieData(const wstring &filename); + + // INPUT +private: + void tickInput(); + void handleInput(); + void handleKeyPress(unsigned int iPad, unsigned int key); + +protected: + static rrbool RADLINK ExternalFunctionCallback( void * user_callback_data , Iggy * player , IggyExternalFunctionCallUTF16 * call ); + +public: + // RENDERING + float getScreenWidth() { return m_fScreenWidth; } + float getScreenHeight() { return m_fScreenHeight; } + + virtual void render() = 0; + void getRenderDimensions(C4JRender::eViewportType viewport, S32 &width, S32 &height); + void setupRenderPosition(C4JRender::eViewportType viewport); + void setupRenderPosition(S32 xOrigin, S32 yOrigin); + + void SetSysUIShowing(bool bVal); + static void SetSystemUIShowing(LPVOID lpParam,bool bVal); + +protected: + virtual void setTileOrigin(S32 xPos, S32 yPos) = 0; + +public: + + virtual CustomDrawData *setupCustomDraw(UIScene *scene, IggyCustomDrawCallbackRegion *region) = 0; + virtual CustomDrawData *calculateCustomDraw(IggyCustomDrawCallbackRegion *region) = 0; + virtual void endCustomDraw(IggyCustomDrawCallbackRegion *region) = 0; +protected: + // Should be called from the platforms render function + void renderScenes(); + +public: + virtual void beginIggyCustomDraw4J(IggyCustomDrawCallbackRegion *region, CustomDrawData *customDrawRegion) = 0; + void setupCustomDrawGameState(); + void endCustomDrawGameState(); + void setupCustomDrawMatrices(UIScene *scene, CustomDrawData *customDrawRegion); + void setupCustomDrawGameStateAndMatrices(UIScene *scene, CustomDrawData *customDrawRegion); + void endCustomDrawMatrices(); + void endCustomDrawGameStateAndMatrices(); + +protected: + + static void RADLINK CustomDrawCallback(void *user_callback_data, Iggy *player, IggyCustomDrawCallbackRegion *Region); + static GDrawTexture * RADLINK TextureSubstitutionCreateCallback( void * user_callback_data , IggyUTF16 * texture_name , S32 * width , S32 * height , void **destroy_callback_data ); + static void RADLINK TextureSubstitutionDestroyCallback( void * user_callback_data , void * destroy_callback_data , GDrawTexture * handle ); + + virtual GDrawTexture *getSubstitutionTexture(int textureId) { return NULL; } + virtual void destroySubstitutionTexture(void *destroyCallBackData, GDrawTexture *handle) {} + +public: + void registerSubstitutionTexture(const wstring &textureName, PBYTE pbData, DWORD dwLength); + void unregisterSubstitutionTexture(const wstring &textureName, bool deleteData); + +public: + // NAVIGATION + bool NavigateToScene(int iPad, EUIScene scene, void *initData = NULL, EUILayer layer = eUILayer_Scene, EUIGroup group = eUIGroup_PAD); + bool NavigateBack(int iPad, bool forceUsePad = false, EUIScene eScene = eUIScene_COUNT, EUILayer eLayer = eUILayer_COUNT); + void NavigateToHomeMenu(); + UIScene *GetTopScene(int iPad, EUILayer layer = eUILayer_Scene, EUIGroup group = eUIGroup_PAD); + + size_t RegisterForCallbackId(UIScene *scene); + void UnregisterCallbackId(size_t id); + UIScene *GetSceneFromCallbackId(size_t id); + void EnterCallbackIdCriticalSection(); + void LeaveCallbackIdCriticalSection(); + +private: + void setFullscreenMenuDisplayed(bool displayed); + +public: + void CloseAllPlayersScenes(); + void CloseUIScenes(int iPad, bool forceIPad = false); + + virtual bool IsPauseMenuDisplayed(int iPad); + virtual bool IsContainerMenuDisplayed(int iPad); + virtual bool IsIgnorePlayerJoinMenuDisplayed(int iPad); + virtual bool IsIgnoreAutosaveMenuDisplayed(int iPad); + virtual void SetIgnoreAutosaveMenuDisplayed(int iPad, bool displayed); + virtual bool IsSceneInStack(int iPad, EUIScene eScene); + bool GetMenuDisplayed(int iPad); + void SetMenuDisplayed(int iPad,bool bVal); + virtual void CheckMenuDisplayed(); + void AnimateKeyPress(int iPad, int iAction, bool bRepeat, bool bPressed, bool bReleased); + void OverrideSFX(int iPad, int iAction,bool bVal); + + // TOOLTIPS + virtual void SetTooltipText( unsigned int iPad, unsigned int tooltip, int iTextID ); + virtual void SetEnableTooltips( unsigned int iPad, BOOL bVal ); + virtual void ShowTooltip( unsigned int iPad, unsigned int tooltip, bool show ); + virtual void SetTooltips( unsigned int iPad, int iA, int iB=-1, int iX=-1, int iY=-1 , int iLT=-1, int iRT=-1, int iLB=-1, int iRB=-1, int iLS=-1, 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); + + virtual void PlayUISFX(ESoundEffect eSound); + + virtual void DisplayGamertag(unsigned int iPad, bool show); + virtual void SetSelectedItem(unsigned int iPad, const wstring &name); + virtual void UpdateSelectedItemPos(unsigned int iPad); + + virtual void HandleDLCMountingComplete(); + virtual void HandleDLCInstalled(int iPad); +#ifdef _XBOX_ONE + virtual void HandleDLCLicenseChange(); +#endif + virtual void HandleTMSDLCFileRetrieved(int iPad); + virtual void HandleTMSBanFileRetrieved(int iPad); + virtual void HandleInventoryUpdated(int iPad); + virtual void HandleGameTick(); + + virtual void SetTutorial(int iPad, Tutorial *tutorial); + virtual void SetTutorialDescription(int iPad, TutorialPopupInfo *info); + virtual void RemoveInteractSceneReference(int iPad, UIScene *scene); + virtual void SetTutorialVisible(int iPad, bool visible); + virtual bool IsTutorialVisible(int iPad); + + virtual void UpdatePlayerBasePositions(); + virtual void SetEmptyQuadrantLogo(int iSection); + virtual void HideAllGameUIElements(); + virtual void ShowOtherPlayersBaseScene(unsigned int iPad, bool show); + + virtual void ShowTrialTimer(bool show); + virtual void SetTrialTimerLimitSecs(unsigned int uiSeconds); + virtual void UpdateTrialTimer(unsigned int iPad); + virtual void ReduceTrialTimerValue(); + + virtual void ShowAutosaveCountdownTimer(bool show); + virtual void UpdateAutosaveCountdownTimer(unsigned int uiSeconds); + virtual void ShowSavingMessage(unsigned int iPad, C4JStorage::ESavingMessage eVal); + + virtual void ShowPlayerDisplayname(bool show); + virtual bool PressStartPlaying(unsigned int iPad); + virtual void ShowPressStart(unsigned int iPad); + virtual void HidePressStart(); + void ClearPressStart(); + + 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); + + virtual void SetWinUserIndex(unsigned int iPad); + unsigned int GetWinUserIndex(); + + virtual void ShowUIDebugConsole(bool show); + virtual void ShowUIDebugMarketingGuide(bool show); + void logDebugString(const string &text); + UIScene* FindScene(EUIScene sceneType); + +public: + char *m_defaultBuffer, *m_tempBuffer; + void setFontCachingCalculationBuffer(int length); + + +}; diff --git a/Minecraft.Client/Common/UI/UIEnums.h b/Minecraft.Client/Common/UI/UIEnums.h new file mode 100644 index 00000000..45aff87d --- /dev/null +++ b/Minecraft.Client/Common/UI/UIEnums.h @@ -0,0 +1,260 @@ +#pragma once + +// Defines the fixed groups for UI (lower numbers ticked first, rendered last (ie on top)) +enum EUIGroup +{ + eUIGroup_Fullscreen, + eUIGroup_Player1, +#ifndef __PSVITA__ + eUIGroup_Player2, + eUIGroup_Player3, + eUIGroup_Player4, +#endif + + eUIGroup_COUNT, + + eUIGroup_PAD, // Special case to determine the group from the pad (default) +}; + +// Defines the layers in a UI group (lower numbers ticked first, rendered last (ie on top)) +enum EUILayer +{ +#ifndef _CONTENT_PACKAGE + eUILayer_Debug, +#endif + eUILayer_Tooltips, + eUILayer_Error, + eUILayer_Alert, + eUILayer_Fullscreen, // Note: Fullscreen in this context doesn't necessarily mean fill the whole screen, but fill the whole viewport for this group. Enables processes that don't interefere with normal scene stack + eUILayer_Popup, + eUILayer_Scene, + //eUILayer_Chat, + eUILayer_HUD, + + eUILayer_COUNT, +}; + +// Defines the scenes and components that can be added to a layer +// If you add to the enums below, you need to add the scene name in the right place in CConsoleMinecraftApp::wchSceneA +enum EUIScene +{ + eUIScene_PartnernetPassword = 0, + eUIScene_Intro, + eUIScene_SaveMessage, + eUIScene_MainMenu, + eUIScene_FullscreenProgress, + eUIScene_PauseMenu, + eUIScene_Crafting2x2Menu, + eUIScene_Crafting3x3Menu, + eUIScene_FurnaceMenu, + eUIScene_ContainerMenu, + eUIScene_LargeContainerMenu,// for splitscreen + eUIScene_InventoryMenu, + eUIScene_DispenserMenu, + eUIScene_DebugOptions, + eUIScene_DebugTips, + eUIScene_HelpAndOptionsMenu, + eUIScene_HowToPlay, + eUIScene_HowToPlayMenu, + eUIScene_ControlsMenu, + eUIScene_SettingsOptionsMenu, + eUIScene_SettingsAudioMenu, + eUIScene_SettingsControlMenu, + eUIScene_SettingsGraphicsMenu, + eUIScene_SettingsUIMenu, + eUIScene_SettingsMenu, + eUIScene_LeaderboardsMenu, + eUIScene_Credits, + eUIScene_DeathMenu, + eUIComponent_TutorialPopup, + eUIScene_CreateWorldMenu, + eUIScene_LoadOrJoinMenu, + eUIScene_JoinMenu, + eUIScene_SignEntryMenu, + eUIScene_InGameInfoMenu, + eUIScene_ConnectingProgress, + eUIScene_DLCOffersMenu, + eUIScene_SocialPost, + eUIScene_TrialExitUpsell, + eUIScene_LoadMenu, + eUIComponent_Chat, + eUIScene_ReinstallMenu, + eUIScene_SkinSelectMenu, + eUIScene_TextEntry, + eUIScene_InGameHostOptionsMenu, + eUIScene_InGamePlayerOptionsMenu, + eUIScene_CreativeMenu, + eUIScene_LaunchMoreOptionsMenu, + eUIScene_DLCMainMenu, + eUIScene_NewUpdateMessage, + eUIScene_EnchantingMenu, + eUIScene_BrewingStandMenu, + eUIScene_EndPoem, + eUIScene_HUD, + eUIScene_TradingMenu, + eUIScene_AnvilMenu, + eUIScene_TeleportMenu, + 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 + eUIComponent_Panorama, + eUIComponent_Logo, + eUIComponent_DebugUIConsole, + eUIComponent_DebugUIMarketingGuide, + eUIComponent_Tooltips, + eUIComponent_PressStartToPlay, + eUIComponent_MenuBackground, + eUIScene_Keyboard, + eUIScene_QuadrantSignin, + eUIScene_MessageBox, + eUIScene_Timer, + eUIScene_EULA, + eUIScene_InGameSaveManagementMenu, + eUIScene_LanguageSelector, +#endif // ndef _XBOX + +#ifdef _DEBUG_MENUS_ENABLED + eUIScene_DebugOverlay, + eUIScene_DebugItemEditor, +#endif +#ifndef _CONTENT_PACKAGE + eUIScene_DebugCreateSchematic, + eUIScene_DebugSetCamera, +#endif + + eUIScene_COUNT, +}; + +// Used by the fullscreen progress scene to decide what to do when a thread finishes +enum ProgressionCompletionType +{ + e_ProgressCompletion_NoAction, + e_ProgressCompletion_NavigateBack, + e_ProgressCompletion_CloseUIScenes, + e_ProgressCompletion_CloseAllPlayersUIScenes, + e_ProgressCompletion_NavigateToHomeMenu, + e_ProgressCompletion_AutosaveNavigateBack, + e_ProgressCompletion_NavigateBackToScene, +}; + +enum EToolTipButton +{ + eToolTipButtonA = 0, + eToolTipButtonB, + eToolTipButtonX, + eToolTipButtonY, + eToolTipButtonLT, + eToolTipButtonRT, + eToolTipButtonLB, + eToolTipButtonRB, + eToolTipButtonLS, + eToolTipButtonRS, + eToolTipButtonBack, + eToolTipNumButtons +}; + +enum EToolTipItem +{ + eToolTipNone = -1, + eToolTipPickupPlace_OLD = 0, // To support existing menus. + eToolTipExit, + eToolTipPickUpGeneric, + eToolTipPickUpAll, + eToolTipPickUpHalf, + eToolTipPlaceGeneric, + eToolTipPlaceOne, + eToolTipPlaceAll, + eToolTipDropGeneric, + eToolTipDropOne, + eToolTipDropAll, + eToolTipSwap, + eToolTipQuickMove, + eToolTipQuickMoveIngredient, + eToolTipQuickMoveFuel, + eToolTipWhatIsThis, + eToolTipEquip, + eToolTipClearQuickSelect, + eToolTipQuickMoveTool, + eToolTipQuickMoveArmor, + eToolTipQuickMoveWeapon, + eToolTipDye, + eToolTipRepair, + eNumToolTips +}; + +enum EHowToPlayPage +{ + eHowToPlay_WhatsNew = 0, + eHowToPlay_Basics, + eHowToPlay_Multiplayer, + eHowToPlay_HUD, + eHowToPlay_Creative, + eHowToPlay_Inventory, + eHowToPlay_Chest, + eHowToPlay_LargeChest, + eHowToPlay_Enderchest, + eHowToPlay_InventoryCrafting, + eHowToPlay_CraftTable, + eHowToPlay_Furnace, + eHowToPlay_Dispenser, + + eHowToPlay_Brewing, + eHowToPlay_Enchantment, + eHowToPlay_Anvil, + eHowToPlay_FarmingAnimals, + eHowToPlay_Breeding, + eHowToPlay_Trading, + + eHowToPlay_Horses, + eHowToPlay_Beacons, + eHowToPlay_Fireworks, + eHowToPlay_Hoppers, + eHowToPlay_Droppers, + + eHowToPlay_NetherPortal, + eHowToPlay_TheEnd, +#ifdef _XBOX + eHowToPlay_SocialMedia, + eHowToPlay_BanList, +#endif + eHowToPlay_HostOptions, + eHowToPlay_NumPages +}; + +// Credits +enum ECreditTextTypes +{ + eExtraLargeText = 0, + eLargeText, + eMediumText, + eSmallText, + 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/UIFontData.cpp b/Minecraft.Client/Common/UI/UIFontData.cpp new file mode 100644 index 00000000..c5ad46ef --- /dev/null +++ b/Minecraft.Client/Common/UI/UIFontData.cpp @@ -0,0 +1,341 @@ +#include "stdafx.h" +#include "UIFontData.h" + + ///////////////////////////////////////////////////// + // --- -- --- THIS FILE IS IN UNICODE --- -- --- // + ///////////////////////////////////////////////////// + +SFontData SFontData::Mojangles_7 + = { + + /* Font Name */ "Mojangles7", + +#ifdef _XBOX + /* filename */ L"/font/Mojangles_7.png", +#else + /* Filename */ L"/TitleUpdate/res/font/Mojangles_7.png", +#endif + + /* Glyph count */ FONTSIZE, + /* Codepoints */ SFontData::Codepoints, + + /*img wdth,hght*/ 190, 264, + /*img cols,rows*/ FONTCOLS, FONTROWS, + + + /*glyph dim x,y*/ 8,13, + + /*ascent/descent*/ 7.f/13.f, 8.f/13.f, + + /*advance*/ 1.f/10.f, + + /*whitespace*/ 5, + + }; + + +SFontData SFontData::Mojangles_11 + = { + + /* Font Name */ "Mojangles11", + +#ifdef _XBOX + /* filename */ L"/font/Mojangles_11.png", +#else + /* Filename */ L"/TitleUpdate/res/font/Mojangles_11.png", +#endif + + /* Glyph count */ FONTSIZE, + /* Codepoints */ SFontData::Codepoints, + + /*img wdth,hght*/ 305, 348, + /*img cols,rows*/ FONTCOLS, FONTROWS, + + /*glyph dim x,y*/ 13,17, + + /*ascent/descent*/ 11.f/17.f, 6.f/17.f, + + /*advance*/ 1.f/13.f, + + /*whitespace*/ 7 + + }; + + + // ----------------------------------------------------------------------------- + // 4J-JEV: Glyph -> Unicode Maps, + // Unicode search tool: http://www.fileformat.info/info/unicode/char/search.htm + //------------------------------------------------------------------------------ + + +// Originally interpretted from 'Chars.txt', required many alterations to work correctly. (New Characters have been also added) +unsigned short SFontData::Codepoints[FONTSIZE] = +{ + // NOTE: When adding characters here, you may also want to add them to the ignore list 'Mojangles\Dev\Tools\Mojangles.txt' so we know not to panic when localisation uses them. + +/* ż Ż ź Ź ć Ć ń Ń */ + 0x0001, 0x017C, 0x017B, 0x017A, 0x0179, 0x0107, 0x0106, 0x0144, 0x0143, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, + +/* ! " # $ % & ' ( ) * + , - */ + 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, 0x0020, 0x0000, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, + +/* . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D */ + 0x002E, 0x002F, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, + +/* E F G H I J K L M N O P Q R S T U V W X Y Z [ */ + 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, + +/* \ ] ^ _ ` a b c d e f g h i j k l m n o p q r */ + 0x005C, 0x005D, 0x005E, 0x005F, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070, 0x0071, 0x0072, + +/* s t u v w x y z { | } ~  */ + 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, + +/* */ + 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, 0x00A0, + +/* ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · */ + 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + +/* ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î */ + 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, + +/* Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å */ + 0x00CF, 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF, 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, + +/* æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü */ + 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, + +/* ý þ ÿ Œ œ Š š Ÿ Ž ž ƒ ˣ ➄ – — ’ ‚ “ ” „ † ‡ • */ + 0x00FD, 0x00FE, 0x00FF, 0x0152, 0x0153, 0x0160, 0x0161, 0x0178, 0x017D, 0x017E, 0x0192, 0x02E3, 0x2784, 0x2013, 0x2014, 0x2019, 0x201A, 0x201C, 0x201D, 0x201E, 0x2020, 0x2021, 0x2022, + +/* … ‰ ‹ › € ™ ͝ Ş İ Ğ ş ı ğ ę Ę ó Ó ą Ą ś Ś ł Ł */ + 0x2026, 0x2030, 0x2039, 0x203A, 0x20AC, 0x2122, 0x035D, 0x015E, 0x0130, 0x011E, 0x015F, 0x0131, 0x011F, 0x0119, 0x0118, 0x00F3, 0x00D3, 0x0105, 0x0104, 0x015B, 0x015A, 0x0142, 0x0141, + +/* Ё А Б В Г Д Е Ж З И Й К Л М Н О П Р С Т У Ф Х */ + 0x0401, 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, + +/* Ц Ч Ш Щ Ъ Ы Ь Э Ю Я а б в г д е ж з и й к л м */ + 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, + +/* н о п р с т у ф х ц ч ш щ ъ ы ь э ю я ё χ ψ ω */ + 0x043D, 0x043E, 0x043F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, 0x0451, 0x03C7, 0x03C8, 0x03C9, + +/* Č Ď Ě Ĺ Ľ Ň Ő Ř Ť Ů Ű č ď ě ĺ ľ ň ő ř ť ů ű */ + 0x010C, 0x010E, 0x011A, 0x0139, 0x013D, 0x0147, 0x0150, 0x0158, 0x0164, 0x016E, 0x0170, 0x010D, 0x010F, 0x011B, 0x013A, 0x013E, 0x0148, 0x0151, 0x0159, 0x0165, 0x016F, 0x0171, 0x0020, + +/* Α Β Γ Δ Ε Ζ Η Θ Ι Κ Λ Μ Ν Ξ Ο Π Ρ Σ Τ Υ Φ Χ Ψ */ + 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, 0x03A0, 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, + +/* Ω α β γ δ ε ζ η θ ι κ λ μ ν ξ ο π ρ ς σ τ υ φ */ + 0x03A9, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, + +/* Ά Έ Ή Ί Ό Ύ Ώ ΐ ά έ ή ί ϊ ό ύ ώ ŕ ΄ ‘ */ + 0x0386, 0x0388, 0x0389, 0x038A, 0x038C, 0x038E, 0x038F, 0x0390, 0x03AC, 0x03AD, 0x03AE, 0x03AF, 0x03CA, 0x03CC, 0x03CD, 0x03CE, 0x0155, 0x0384, 0x2018, 0x0000, 0x0000, 0x0000, 0x0000, +}; + + + + + /////////////////////// + // --- CFontData --- // + /////////////////////// + +CFontData::CFontData() +{ + m_unicodeMap = unordered_map(); + + m_sFontData = NULL; + m_kerningTable = NULL; + m_pbRawImage = NULL; +} + +CFontData::CFontData(SFontData &sFontData, int *pbRawImage) + : m_unicodeMap( sFontData.m_uiGlyphCount + 2 ) +{ + this->m_sFontData = &sFontData; + + // INITIALISE ALPHA CHANNEL // + + // Glyph Archive (1Byte per pixel). + unsigned int archiveSize = sFontData.m_uiGlyphMapX * sFontData.m_uiGlyphMapY; + + this->m_pbRawImage = new unsigned char[archiveSize]; + + // 4J-JEV: Take the alpha channel from each pixel. + for (unsigned int i = 0; i < archiveSize; i++) + { + this->m_pbRawImage[i] = (pbRawImage[i] & 0xFF000000) >> 24; + } + + // CREATE UNICODE MAP // + for (unsigned int i = 0; i < sFontData.m_uiGlyphCount; i++) + { + unordered_map::value_type pair(sFontData.Codepoints[i], i); + m_unicodeMap.insert( pair ); + } + + // CREATE KERNING TABLE // + m_kerningTable = new unsigned short[sFontData.m_uiGlyphCount]; + for (unsigned short glyph = 0; glyph < sFontData.m_uiGlyphCount; glyph++) + { + int row,column; + getPos(glyph,row,column); + + short xMax = 0, _x=0, _y=0; + + // Find the position of the topLeft corner. + unsigned char *topLeft = m_pbRawImage, *cursor; + moveCursor( topLeft, column * sFontData.m_uiGlyphWidth, row * sFontData.m_uiGlyphHeight); + + assert( ((column+1)*sFontData.m_uiGlyphWidth) < sFontData.m_uiGlyphMapX ); + assert( ((row+1)*sFontData.m_uiGlyphHeight) < sFontData.m_uiGlyphMapY ); + + static int XX = 79; + // Find the furthest filled pixel to the right. + for (short y = 0; y < sFontData.m_uiGlyphHeight; y++) + { + for (short x = 0; x < sFontData.m_uiGlyphWidth; x++) + { + cursor = topLeft; + moveCursor(cursor, x, y); + + assert( (cursor-m_pbRawImage) < archiveSize ); + + if ( *cursor > 0 ) + { + if (x > xMax) xMax = x; + _x = x; + _y = y; + } + } + } + +#if _DEBUG_BLOCK_CHARS + for (short y = 0; y < sFontData.m_uiGlyphHeight; y++) + { + for (short x = 0; x < sFontData.m_uiGlyphWidth; x++) + { + cursor = topLeft; + moveCursor(cursor, x, y); + + if (x==0) *cursor = 0x00; + else if (x<=xMax) *cursor = 0xFF; + else *cursor = 0x00; + } + } +#endif + + // 4J-JEV: Empty glyphs are considered to be whitespace. + if (xMax == 0) m_kerningTable[glyph] = sFontData.m_uiWhitespaceWidth; + else m_kerningTable[glyph] = xMax + 1; + } + + // CACHE GLYPH ADVANCES // + m_pfAdvanceTable = new float[sFontData.m_uiGlyphCount]; + for (unsigned short glyph = 0; glyph < sFontData.m_uiGlyphCount; glyph++) + { + m_pfAdvanceTable[glyph] = m_kerningTable[glyph] * m_sFontData->m_fAdvPerPixel; + } + + // DEBUG // +#ifndef _CONTENT_PACKAGE + for (int i = 0; i < sFontData.m_uiGlyphCount; i++) + { + int unicode = getUnicode(i), unicodeChar = 32, row, col; + if ( 32 < unicode && unicode < 127 && unicode != 0x0025 ) + { + unicodeChar = unicode; + } + + getPos(i, row, col); + + string state = "ok"; + if (i != getGlyphId(unicode)) + { + state = "MISSMATCHED!"; + + app.DebugPrintf( " %i\t%c\tU+%.4X, kerning=%i, (%2i,%2i). %s\n", + i, getGlyphId(unicode), unicodeChar, unicode, m_kerningTable[i], row, col, state.c_str() ); + } + } +#endif +} + +void CFontData::release() +{ + delete [] m_kerningTable; + delete [] m_pfAdvanceTable; + delete [] m_pbRawImage; +} + +const string CFontData::getFontName() +{ + return m_sFontData->m_strFontName; +} + +SFontData *CFontData::getFontData() +{ + return m_sFontData; +} + +unsigned short CFontData::getGlyphId(unsigned int unicodepoint) +{ + unordered_map::iterator out = m_unicodeMap.find(unicodepoint); + if (out != m_unicodeMap.end()) + return out->second; + return 0; +} + +unsigned int CFontData::getUnicode(unsigned short glyphId) +{ + return m_sFontData->Codepoints[glyphId]; +} + +unsigned char *CFontData::topLeftPixel(int row, int col) +{ + unsigned char *out = m_pbRawImage; + moveCursor(out, col * m_sFontData->m_uiGlyphWidth, row* m_sFontData->m_uiGlyphHeight); + return out; +} + +void CFontData::getPos(unsigned short glyphId, int &rowOut, int &colOut) +{ + rowOut = glyphId / m_sFontData->m_uiGlyphMapCols; + colOut = glyphId % m_sFontData->m_uiGlyphMapCols; +} + +float CFontData::getAdvance(unsigned short glyphId) +{ + return m_pfAdvanceTable[glyphId]; +} + +int CFontData::getWidth(unsigned short glyphId) +{ + return m_kerningTable[glyphId]; +} + +bool CFontData::glyphIsWhitespace(unsigned short glyphId) +{ + return unicodeIsWhitespace( getUnicode(glyphId) ); +} + +bool CFontData::unicodeIsWhitespace(unsigned int unicode) +{ + static const unsigned int MAX_WHITESPACE = 1; + static const unsigned int whitespace[MAX_WHITESPACE] = { + 0x0020 + }; + + for (int i=0; im_uiGlyphMapX) + dx; +} diff --git a/Minecraft.Client/Common/UI/UIFontData.h b/Minecraft.Client/Common/UI/UIFontData.h new file mode 100644 index 00000000..b7e38ffa --- /dev/null +++ b/Minecraft.Client/Common/UI/UIFontData.h @@ -0,0 +1,133 @@ +#pragma once + +#include + +using namespace std; + +#define _DEBUG_BLOCK_CHARS 0 + +// For hardcoded font data. +struct SFontData +{ +public: + static const unsigned short FONTCOLS = 23; + static const unsigned short FONTROWS = 20; + + static const unsigned short FONTSIZE = FONTCOLS * FONTROWS; + +public: + // Font name. + string m_strFontName; + + // Filename of the glyph archive. + wstring m_wstrFilename; + + // Number of glyphs in the archive. + unsigned int m_uiGlyphCount; + + // Unicode values of each glyph. + unsigned short *m_arrCodepoints; + + // X resolution of glyph archive. + unsigned int m_uiGlyphMapX; + + // Y resolution of glyph archive. + unsigned int m_uiGlyphMapY; + + // Number of columns in the glyph archive. + unsigned int m_uiGlyphMapCols; + + // Number of rows in the glyph archive. + unsigned int m_uiGlyphMapRows; + + // Width of each glyph. + unsigned int m_uiGlyphWidth; + + // Height of each glyph. + unsigned int m_uiGlyphHeight; + + // Ascent of each glyph above the baseline (units?). + float m_fAscent; + + // Descent of each glyph below the baseline (units?). + float m_fDescent; + + // How much to advance for each pixel wide the glyph is. + float m_fAdvPerPixel; + + // How many pixels wide any whitespace characters are. + unsigned int m_uiWhitespaceWidth; + +public: + static unsigned short Codepoints[FONTSIZE]; + static SFontData Mojangles_7; + static SFontData Mojangles_11; +}; + +// Provides a common interface for dealing with font data. +class CFontData +{ +public: + CFontData(); + + // pbRawImage consumed by constructor. + CFontData(SFontData &sFontData, int *pbRawImage); + + // Release memory. + void release(); + +protected: + + // Hardcoded font data. + SFontData *m_sFontData; + + // Map Unicodepoints to glyph ids. + unordered_map m_unicodeMap; + + // Kerning value for each glyph. + unsigned short *m_kerningTable; + + // Binary blob of the archive image. + unsigned char *m_pbRawImage; + + // Total advance of each character. + float *m_pfAdvanceTable; + +public: + + // Accessor for the font name in the internal SFontData. + const string getFontName(); + + // Accessor for the hardcoded internal font data. + SFontData *getFontData(); + + // Get the glyph id corresponding to a unicode point. + unsigned short getGlyphId(unsigned int unicodepoint); + + // Get the unicodepoint corresponding to a glyph id. + unsigned int getUnicode(unsigned short glyphId); + + // Get a pointer to the top left pixel of a row/column in the raw image. + unsigned char *topLeftPixel(int row, int col); + + // Get the row and column where a glyph appears in the archive. + void getPos(unsigned short gyphId, int &row, int &col); + + // Get the advance of this character (units?). + float getAdvance(unsigned short glyphId); + + // Get the width (in pixels) of a given character. + int getWidth(unsigned short glyphId); + + // Returns true if this glyph is whitespace. + bool glyphIsWhitespace(unsigned short glyphId); + + // Returns true if this unicodepoint is whitespace + bool unicodeIsWhitespace(unsigned int unicodepoint); + +private: + + // Move a pointer in an image dx pixels right and dy pixels down, wrap around in either dimension leads to unknown behaviour. + void moveCursor(unsigned char *&cursor, unsigned int dx, unsigned int dy); +}; + diff --git a/Minecraft.Client/Common/UI/UIGroup.cpp b/Minecraft.Client/Common/UI/UIGroup.cpp new file mode 100644 index 00000000..e8bb9fe6 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIGroup.cpp @@ -0,0 +1,431 @@ +#include "stdafx.h" +#include "UIGroup.h" + +UIGroup::UIGroup(EUIGroup group, int iPad) +{ + m_group = group; + m_iPad = iPad; + m_bMenuDisplayed = false; + m_bPauseMenuDisplayed = false; + m_bContainerMenuDisplayed = false; + m_bIgnoreAutosaveMenuDisplayed = false; + m_bIgnorePlayerJoinMenuDisplayed = false; + + m_updateFocusStateCountdown = 0; + + m_viewportType = C4JRender::VIEWPORT_TYPE_FULLSCREEN; + + for(unsigned int i = 0; i < eUILayer_COUNT; ++i) + { + m_layers[i] = new UILayer(this); +#ifdef __PSVITA__ + m_layers[i]->m_iLayer=(EUILayer)i; +#endif + } + + m_tooltips = (UIComponent_Tooltips *)m_layers[(int)eUILayer_Tooltips]->addComponent(0, eUIComponent_Tooltips); + + m_tutorialPopup = NULL; + m_hud = NULL; + m_pressStartToPlay = NULL; + if(m_group != eUIGroup_Fullscreen) + { + m_tutorialPopup = (UIComponent_TutorialPopup *)m_layers[(int)eUILayer_Popup]->addComponent(m_iPad, eUIComponent_TutorialPopup); + + m_hud = (UIScene_HUD *)m_layers[(int)eUILayer_HUD]->addComponent(m_iPad, eUIScene_HUD); + + //m_layers[(int)eUILayer_Chat]->addComponent(m_iPad, eUIComponent_Chat); + } + else + { + m_pressStartToPlay = (UIComponent_PressStartToPlay *)m_layers[(int)eUILayer_Tooltips]->addComponent(0, eUIComponent_PressStartToPlay); + } + + // 4J Stu - Pre-allocate this for cached rendering in scenes. It's horribly slow to do dynamically, but we should only need one + // per group as we will only be displaying one of these types of scenes at a time + m_commandBufferList = MemoryTracker::genLists(1); +} + +void UIGroup::DestroyAll() +{ + for(unsigned int i = 0; i < eUILayer_COUNT; ++i) + { + m_layers[i]->DestroyAll(); + } +} + +void UIGroup::ReloadAll() +{ + // We only need to reload things when they are likely to be rendered + int highestRenderable = 0; + for(; highestRenderable < eUILayer_COUNT; ++highestRenderable) + { + if(m_layers[highestRenderable]->hidesLowerScenes()) break; + } + if(highestRenderable < eUILayer_Fullscreen) highestRenderable = eUILayer_Fullscreen; + for(; highestRenderable >= 0; --highestRenderable) + { + if(highestRenderable < eUILayer_COUNT) m_layers[highestRenderable]->ReloadAll(highestRenderable != (int)eUILayer_Fullscreen); + } +} + +void UIGroup::tick() +{ + // Ignore this group if the player isn't signed in + if(m_iPad >= 0 && !ProfileManager.IsSignedIn(m_iPad)) return; + for(unsigned int i = 0; i < eUILayer_COUNT; ++i) + { + m_layers[i]->tick(); + + // TODO: May wish to ignore ticking other layers here based on current layer + } + + // Handle deferred update focus + if (m_updateFocusStateCountdown > 0) + { + m_updateFocusStateCountdown--; + if (m_updateFocusStateCountdown == 0)_UpdateFocusState(); +} +} + +void UIGroup::render() +{ + // Ignore this group if the player isn't signed in + if(m_iPad >= 0 && !ProfileManager.IsSignedIn(m_iPad)) return; + S32 width = 0; + S32 height = 0; + ui.getRenderDimensions(m_viewportType, width, height); + int highestRenderable = 0; + for(; highestRenderable < eUILayer_COUNT; ++highestRenderable) + { + if(m_layers[highestRenderable]->hidesLowerScenes()) break; + } + for(; highestRenderable >= 0; --highestRenderable) + { + if(highestRenderable < eUILayer_COUNT) m_layers[highestRenderable]->render(width, height,m_viewportType); + } +} + +bool UIGroup::hidesLowerScenes() +{ + // Ignore this group if the player isn't signed in + if(m_iPad >= 0 && !ProfileManager.IsSignedIn(m_iPad)) return false; + bool hidesScenes = false; + for(int i = eUILayer_COUNT - 1; i >= 0; --i) + { + hidesScenes = m_layers[i]->hidesLowerScenes(); + if(hidesScenes) break; + } + return hidesScenes; +} + +void UIGroup::getRenderDimensions(S32 &width, S32 &height) +{ + ui.getRenderDimensions(m_viewportType, width, height); +} + +// NAVIGATION +bool UIGroup::NavigateToScene(int iPad, EUIScene scene, void *initData, EUILayer layer) +{ + bool succeeded = m_layers[(int)layer]->NavigateToScene(iPad, scene, initData); + updateStackStates(); + return succeeded; +} + +bool UIGroup::NavigateBack(int iPad, EUIScene eScene, EUILayer eLayer) +{ + // Keep navigating back on every layer until we hit the target scene + bool foundTarget = false; + for(unsigned int i = 0; i < eUILayer_COUNT; ++i) + { + if(eLayer < eUILayer_COUNT && eLayer != i) continue; + foundTarget = m_layers[i]->NavigateBack(iPad, eScene); + if(foundTarget) break; + } + updateStackStates(); + return foundTarget; +} + +void UIGroup::closeAllScenes() +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + if( m_iPad >= 0 ) + { + if(pMinecraft != NULL && pMinecraft->localgameModes[m_iPad] != NULL ) + { + TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[m_iPad]; + + // This just allows it to be shown + gameMode->getTutorial()->showTutorialPopup(true); + } + } + + for(unsigned int i = 0; i < eUILayer_COUNT; ++i) + { + // Ignore the error layer + if(i != (int)eUILayer_Error) m_layers[i]->closeAllScenes(); + } + updateStackStates(); +} + +UIScene *UIGroup::GetTopScene(EUILayer layer) +{ + return m_layers[(int)layer]->GetTopScene(); +} + +bool UIGroup::GetMenuDisplayed() +{ + return m_bMenuDisplayed; +} + +bool UIGroup::IsSceneInStack(EUIScene scene) +{ + bool found = false; + for(unsigned int i = 0; i < eUILayer_COUNT; ++i) + { + found = m_layers[i]->IsSceneInStack(scene); + if(found) break; + } + return found; +} + +bool UIGroup::HasFocus(int iPad) +{ + bool hasFocus = false; + for(unsigned int i = 0; i < eUILayer_COUNT; ++i) + { + if( m_layers[i]->m_hasFocus) + { + if(m_layers[i]->HasFocus(iPad)) + { + hasFocus = true; + } + break; + } + } + return hasFocus; +} + +#ifdef __PSVITA__ +UIScene *UIGroup::getCurrentScene() +{ + UIScene *pScene; + for(unsigned int i = 0; i < eUILayer_COUNT; ++i) + { + pScene=m_layers[i]->getCurrentScene(); + + if(pScene!=NULL) return pScene; + } + + return NULL; +} +#endif + +// INPUT +void UIGroup::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + // Ignore this group if the player isn't signed in + if(m_iPad >= 0 && !ProfileManager.IsSignedIn(m_iPad)) return; + for(unsigned int i = 0; i < eUILayer_COUNT; ++i) + { + m_layers[i]->handleInput(iPad, key, repeat, pressed, released, handled); + if(handled) break; + } +} + +// FOCUS + +// Check that a layer may recieve focus, specifically that there is no infocus layer above +bool UIGroup::RequestFocus(UILayer* layerPtr) +{ + // Find the layer + unsigned int layerIndex = GetLayerIndex(layerPtr); + + // Top layer is always allowed focus + if (layerIndex == 0) return true; + + // Check layers above to see if any of them have focus + for (int i = layerIndex-1; i >= 0; i--) + { + if (m_layers[i]->m_hasFocus) return false; + } + + return true; +} + +void UIGroup::showComponent(int iPad, EUIScene scene, EUILayer layer, bool show) +{ + m_layers[layer]->showComponent(iPad, scene, show); +} + +UIScene *UIGroup::addComponent(int iPad, EUIScene scene, EUILayer layer) +{ + return m_layers[layer]->addComponent(iPad, scene); +} + +void UIGroup::removeComponent(EUIScene scene, EUILayer layer) +{ + m_layers[layer]->removeComponent(scene); +} + +void UIGroup::SetViewportType(C4JRender::eViewportType type) +{ + if(m_viewportType != type) + { + m_viewportType = type; + for(unsigned int i = 0; i < eUILayer_COUNT; ++i) + { + m_layers[i]->ReloadAll(true); + } + } +} + +C4JRender::eViewportType UIGroup::GetViewportType() +{ + return m_viewportType; +} + +void UIGroup::HandleDLCMountingComplete() +{ + // Ignore this group if the player isn't signed in + if(m_iPad >= 0 && !ProfileManager.IsSignedIn(m_iPad)) return; + for(unsigned int i = 0; i < eUILayer_COUNT; ++i) + { + app.DebugPrintf("UIGroup::HandleDLCMountingComplete - m_layers[%d]\n",i); + m_layers[i]->HandleDLCMountingComplete(); + } +} + +void UIGroup::HandleDLCInstalled() +{ + // Ignore this group if the player isn't signed in + if(m_iPad >= 0 && !ProfileManager.IsSignedIn(m_iPad)) return; + for(unsigned int i = 0; i < eUILayer_COUNT; ++i) + { + m_layers[i]->HandleDLCInstalled(); + } +} + +#ifdef _XBOX_ONE +void UIGroup::HandleDLCLicenseChange() +{ + // Ignore this group if the player isn't signed in + if(m_iPad >= 0 && !ProfileManager.IsSignedIn(m_iPad)) return; + for(unsigned int i = 0; i < eUILayer_COUNT; ++i) + { + m_layers[i]->HandleDLCLicenseChange(); + } +} +#endif + +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; +} + + +void UIGroup::handleUnlockFullVersion() +{ + for(unsigned int i = 0; i < eUILayer_COUNT; ++i) + { + m_layers[i]->handleUnlockFullVersion(); + } +} + +void UIGroup::updateStackStates() +{ + m_bMenuDisplayed = false; + m_bPauseMenuDisplayed = false; + m_bContainerMenuDisplayed = false; + m_bIgnoreAutosaveMenuDisplayed = false; + m_bIgnorePlayerJoinMenuDisplayed = false; + + for(unsigned int i = 0; i < eUILayer_COUNT; ++i) + { + m_bMenuDisplayed = m_bMenuDisplayed || m_layers[i]->m_bMenuDisplayed; + m_bPauseMenuDisplayed = m_bPauseMenuDisplayed || m_layers[i]->m_bPauseMenuDisplayed; + m_bContainerMenuDisplayed = m_bContainerMenuDisplayed || m_layers[i]->m_bContainerMenuDisplayed; + m_bIgnoreAutosaveMenuDisplayed = m_bIgnoreAutosaveMenuDisplayed || m_layers[i]->m_bIgnoreAutosaveMenuDisplayed; + m_bIgnorePlayerJoinMenuDisplayed = m_bIgnorePlayerJoinMenuDisplayed || m_layers[i]->m_bIgnorePlayerJoinMenuDisplayed; + } +} + +// Defer update focus till for 10 UI ticks +void UIGroup::UpdateFocusState() +{ + m_updateFocusStateCountdown = 10; +} + +// Pass focus to uppermost layer that accepts focus +void UIGroup::_UpdateFocusState() +{ + bool groupFocusSet = false; + + for(unsigned int i = 0; i < eUILayer_COUNT; ++i) + { + groupFocusSet = m_layers[i]->updateFocusState(true); + if (groupFocusSet) break; + } +} + +// Get the index of the layer +unsigned int UIGroup::GetLayerIndex(UILayer* layerPtr) +{ + for(unsigned int i = 0; i < eUILayer_COUNT; ++i) + { + if (m_layers[i] == layerPtr) return i; + } + + // can't get here... + return 0; +} + +void UIGroup::PrintTotalMemoryUsage(__int64 &totalStatic, __int64 &totalDynamic) +{ + __int64 groupStatic = 0; + __int64 groupDynamic = 0; + app.DebugPrintf(app.USER_SR, "-- BEGIN GROUP %d\n",m_group); + for(unsigned int i = 0; i < eUILayer_COUNT; ++i) + { + app.DebugPrintf(app.USER_SR, " \\- BEGIN LAYER %d\n",i); + m_layers[i]->PrintTotalMemoryUsage(groupStatic, groupDynamic); + app.DebugPrintf(app.USER_SR, " \\- END LAYER %d\n",i); + } + app.DebugPrintf(app.USER_SR, "-- Group static: %d, Group dynamic: %d\n", groupStatic, groupDynamic); + totalStatic += groupStatic; + totalDynamic += groupDynamic; + app.DebugPrintf(app.USER_SR, "-- END GROUP %d\n",m_group); +} + +int UIGroup::getCommandBufferList() +{ + return m_commandBufferList; +} + +// Returns the first scene of given type if it exists, NULL otherwise +UIScene *UIGroup::FindScene(EUIScene sceneType) +{ + UIScene *pScene = NULL; + + for (int i = 0; i < eUILayer_COUNT; i++) + { + pScene = m_layers[i]->FindScene(sceneType); +#ifdef __PS3__ + if (pScene != NULL) return pScene; +#else + if (pScene != nullptr) return pScene; +#endif + } + + return pScene; +} diff --git a/Minecraft.Client/Common/UI/UIGroup.h b/Minecraft.Client/Common/UI/UIGroup.h new file mode 100644 index 00000000..0ffee0ca --- /dev/null +++ b/Minecraft.Client/Common/UI/UIGroup.h @@ -0,0 +1,115 @@ +#pragma once +#include "UILayer.h" +#include "UIEnums.h" + +class UIComponent_Tooltips; +class UIComponent_TutorialPopup; +class UIScene_HUD; +class UIComponent_PressStartToPlay; + +// A group contains a collection of layers for a specific context (e.g. each player has 1 group) +class UIGroup +{ +private: + UILayer *m_layers[eUILayer_COUNT]; + + UIComponent_Tooltips *m_tooltips; + UIComponent_TutorialPopup *m_tutorialPopup; + UIComponent_PressStartToPlay *m_pressStartToPlay; + UIScene_HUD *m_hud; + + C4JRender::eViewportType m_viewportType; + + EUIGroup m_group; + int m_iPad; + + bool m_bMenuDisplayed; + bool m_bPauseMenuDisplayed; + bool m_bContainerMenuDisplayed; + bool m_bIgnoreAutosaveMenuDisplayed; + bool m_bIgnorePlayerJoinMenuDisplayed; + + // Countdown in ticks to update focus state + int m_updateFocusStateCountdown; + + int m_commandBufferList; + +public: + UIGroup(EUIGroup group, int iPad); + +#ifdef __PSVITA__ + EUIGroup GetGroup() {return m_group;} +#endif + UIComponent_Tooltips *getTooltips() { return m_tooltips; } + UIComponent_TutorialPopup *getTutorialPopup() { return m_tutorialPopup; } + UIScene_HUD *getHUD() { return m_hud; } + UIComponent_PressStartToPlay *getPressStartToPlay() { return m_pressStartToPlay; } + + void DestroyAll(); + void ReloadAll(); + + void tick(); + void render(); + bool hidesLowerScenes(); + void getRenderDimensions(S32 &width, S32 &height); + + // NAVIGATION + bool NavigateToScene(int iPad, EUIScene scene, void *initData, EUILayer layer); + bool NavigateBack(int iPad, EUIScene eScene, EUILayer eLayer = eUILayer_COUNT); + void closeAllScenes(); + UIScene *GetTopScene(EUILayer layer); + + bool IsSceneInStack(EUIScene scene); + bool HasFocus(int iPad); + + bool RequestFocus(UILayer* layerPtr); + void UpdateFocusState(); + + bool GetMenuDisplayed(); + bool IsPauseMenuDisplayed() { return m_bPauseMenuDisplayed; } + bool IsContainerMenuDisplayed() { return m_bContainerMenuDisplayed; } + bool IsIgnoreAutosaveMenuDisplayed() { return m_bIgnoreAutosaveMenuDisplayed; } + bool IsIgnorePlayerJoinMenuDisplayed() { return m_bIgnorePlayerJoinMenuDisplayed; } + + // INPUT + void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + +#ifdef __PSVITA__ + // Current active scene + UIScene *getCurrentScene(); +#endif + + // FOCUS + bool getFocusState(); + + // A component is an element on a layer that displays BELOW other scenes in this layer, but does not engage in any navigation + // E.g. you can keep a component active while performing navigation with other scenes on this layer + void showComponent(int iPad, EUIScene scene, EUILayer layer, bool show); + UIScene *addComponent(int iPad, EUIScene scene, EUILayer layer); + void removeComponent(EUIScene scene, EUILayer layer); + + void SetViewportType(C4JRender::eViewportType type); + C4JRender::eViewportType GetViewportType(); + + virtual void HandleDLCMountingComplete(); + virtual void HandleDLCInstalled(); +#ifdef _XBOX_ONE + virtual void HandleDLCLicenseChange(); +#endif + virtual void HandleMessage(EUIMessage message, void *data); + + bool IsFullscreenGroup(); + + void handleUnlockFullVersion(); + + void PrintTotalMemoryUsage(__int64 &totalStatic, __int64 &totalDynamic); + + unsigned int GetLayerIndex(UILayer* layerPtr); + + int getCommandBufferList(); + UIScene *FindScene(EUIScene sceneType); + +private: + void _UpdateFocusState(); + void updateStackStates(); +}; diff --git a/Minecraft.Client/Common/UI/UILayer.cpp b/Minecraft.Client/Common/UI/UILayer.cpp new file mode 100644 index 00000000..ceec33f1 --- /dev/null +++ b/Minecraft.Client/Common/UI/UILayer.cpp @@ -0,0 +1,909 @@ +#include "stdafx.h" +#include "UI.h" +#include "UILayer.h" +#include "UIScene.h" + +UILayer::UILayer(UIGroup *parent) +{ + m_parentGroup = parent; + m_hasFocus = false; + m_bMenuDisplayed = false; + m_bPauseMenuDisplayed = false; + m_bContainerMenuDisplayed = false; + m_bIgnoreAutosaveMenuDisplayed = false; + m_bIgnorePlayerJoinMenuDisplayed = false; +} + +void UILayer::tick() +{ + // Delete old scenes - deleting a scene can cause a new scene to be deleted, so we need to make a copy of the scenes that we are going to try and destroy this tick + vectorscenesToDeleteCopy; + for( AUTO_VAR(it,m_scenesToDelete.begin()); it != m_scenesToDelete.end(); it++) + { + UIScene *scene = (*it); + scenesToDeleteCopy.push_back(scene); + } + m_scenesToDelete.clear(); + + // Delete the scenes in our copy if they are ready to delete, otherwise add back to the ones that are still to be deleted. Actually deleting a scene might also add something back into m_scenesToDelete. + for( AUTO_VAR(it,scenesToDeleteCopy.begin()); it != scenesToDeleteCopy.end(); it++) + { + UIScene *scene = (*it); + if( scene->isReadyToDelete()) + { + delete scene; + } + else + { + m_scenesToDelete.push_back(scene); + } + } + + while (!m_scenesToDestroy.empty()) + { + UIScene *scene = m_scenesToDestroy.back(); + m_scenesToDestroy.pop_back(); + scene->destroyMovie(); + } + m_scenesToDestroy.clear(); + + for(AUTO_VAR(it,m_components.begin()); it != m_components.end(); ++it) + { + (*it)->tick(); + } + // Note: reverse iterator, the last element is the top of the stack + int sceneIndex = m_sceneStack.size() - 1; + //for(AUTO_VAR(it,m_sceneStack.rbegin()); it != m_sceneStack.rend(); ++it) + while( sceneIndex >= 0 && sceneIndex < m_sceneStack.size() ) + { + //(*it)->tick(); + UIScene *scene = m_sceneStack[sceneIndex]; + scene->tick(); + --sceneIndex; + // TODO: We may wish to ignore ticking the rest of the stack based on this scene + } +} + +void UILayer::render(S32 width, S32 height, C4JRender::eViewportType viewport) +{ + if(!ui.IsExpectingOrReloadingSkin()) + { + for(AUTO_VAR(it,m_components.begin()); it != m_components.end(); ++it) + { + AUTO_VAR(itRef,m_componentRefCount.find((*it)->getSceneType())); + if(itRef != m_componentRefCount.end() && itRef->second.second) + { + if((*it)->isVisible() ) + { + PIXBeginNamedEvent(0, "Rendering component %d", (*it)->getSceneType() ); + (*it)->render(width, height,viewport); + PIXEndNamedEvent(); + } + } + } + } + if(!m_sceneStack.empty()) + { + int lowestRenderable = m_sceneStack.size() - 1; + for(;lowestRenderable >= 0; --lowestRenderable) + { + if(m_sceneStack[lowestRenderable]->hidesLowerScenes()) break; + } + if(lowestRenderable < 0) lowestRenderable = 0; + for(;lowestRenderable < m_sceneStack.size(); ++lowestRenderable) + { + if(m_sceneStack[lowestRenderable]->isVisible() && (!ui.IsExpectingOrReloadingSkin() || m_sceneStack[lowestRenderable]->getSceneType()==eUIScene_Timer)) + { + PIXBeginNamedEvent(0, "Rendering scene %d", m_sceneStack[lowestRenderable]->getSceneType() ); + m_sceneStack[lowestRenderable]->render(width, height,viewport); + PIXEndNamedEvent(); + } + } + } +} + +bool UILayer::IsSceneInStack(EUIScene scene) +{ + bool inStack = false; + for(int i = m_sceneStack.size() - 1;i >= 0; --i) + { + if(m_sceneStack[i]->getSceneType() == scene) + { + inStack = true; + break; + } + } + return inStack; +} + +bool UILayer::HasFocus(int iPad) +{ + bool hasFocus = false; + if(m_hasFocus) + { + for(int i = m_sceneStack.size() - 1;i >= 0; --i) + { + if(m_sceneStack[i]->stealsFocus() ) + { + if(m_sceneStack[i]->hasFocus(iPad)) + { + hasFocus = true; + } + break; + } + } + } + return hasFocus; +} + +bool UILayer::hidesLowerScenes() +{ + bool hidesScenes = false; + for(AUTO_VAR(it,m_components.begin()); it != m_components.end(); ++it) + { + if((*it)->hidesLowerScenes()) + { + hidesScenes = true; + break; + } + } + if(!hidesScenes && !m_sceneStack.empty()) + { + for(int i = m_sceneStack.size() - 1;i >= 0; --i) + { + if(m_sceneStack[i]->hidesLowerScenes()) + { + hidesScenes = true; + break; + } + } + } + return hidesScenes; +} + +void UILayer::getRenderDimensions(S32 &width, S32 &height) +{ + m_parentGroup->getRenderDimensions(width, height); +} + +void UILayer::DestroyAll() +{ + for(AUTO_VAR(it,m_components.begin()); it != m_components.end(); ++it) + { + (*it)->destroyMovie(); + } + for(AUTO_VAR(it, m_sceneStack.begin()); it != m_sceneStack.end(); ++it) + { + (*it)->destroyMovie(); + } +} + +void UILayer::ReloadAll(bool force) +{ + for(AUTO_VAR(it,m_components.begin()); it != m_components.end(); ++it) + { + (*it)->reloadMovie(force); + } + if(!m_sceneStack.empty()) + { + int lowestRenderable = 0; + for(;lowestRenderable < m_sceneStack.size(); ++lowestRenderable) + { + m_sceneStack[lowestRenderable]->reloadMovie(force); + } + } +} + +bool UILayer::GetMenuDisplayed() +{ + return m_bMenuDisplayed; +} + +bool UILayer::NavigateToScene(int iPad, EUIScene scene, void *initData) +{ + UIScene *newScene = NULL; + switch(scene) + { + // Debug +#ifdef _DEBUG_MENUS_ENABLED + case eUIScene_DebugOverlay: + newScene = new UIScene_DebugOverlay(iPad, initData, this); + break; + case eUIScene_DebugSetCamera: + newScene = new UIScene_DebugSetCamera(iPad, initData, this); + break; + case eUIScene_DebugCreateSchematic: + newScene = new UIScene_DebugCreateSchematic(iPad, initData, this); + break; +#endif + case eUIScene_DebugOptions: + newScene = new UIScene_DebugOptionsMenu(iPad, initData, this); + break; + + // Containers + case eUIScene_InventoryMenu: + newScene = new UIScene_InventoryMenu(iPad, initData, this); + break; + case eUIScene_CreativeMenu: + newScene = new UIScene_CreativeMenu(iPad, initData, this); + break; + case eUIScene_ContainerMenu: + case eUIScene_LargeContainerMenu: + newScene = new UIScene_ContainerMenu(iPad, initData, this); + break; + case eUIScene_BrewingStandMenu: + newScene = new UIScene_BrewingStandMenu(iPad, initData, this); + break; + case eUIScene_DispenserMenu: + newScene = new UIScene_DispenserMenu(iPad, initData, this); + break; + case eUIScene_EnchantingMenu: + newScene = new UIScene_EnchantingMenu(iPad, initData, this); + break; + case eUIScene_FurnaceMenu: + newScene = new UIScene_FurnaceMenu(iPad, initData, this); + break; + case eUIScene_Crafting2x2Menu: + case eUIScene_Crafting3x3Menu: + newScene = new UIScene_CraftingMenu(iPad, initData, this); + break; + case eUIScene_TradingMenu: + newScene = new UIScene_TradingMenu(iPad, initData, this); + break; + case eUIScene_AnvilMenu: + newScene = new UIScene_AnvilMenu(iPad, initData, this); + break; + 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: + newScene = new UIScene_HelpAndOptionsMenu(iPad, initData, this); + break; + case eUIScene_SettingsMenu: + newScene = new UIScene_SettingsMenu(iPad, initData, this); + break; + case eUIScene_SettingsOptionsMenu: + newScene = new UIScene_SettingsOptionsMenu(iPad, initData, this); + break; + case eUIScene_SettingsAudioMenu: + newScene = new UIScene_SettingsAudioMenu(iPad, initData, this); + break; + case eUIScene_SettingsControlMenu: + newScene = new UIScene_SettingsControlMenu(iPad, initData, this); + break; + case eUIScene_SettingsGraphicsMenu: + newScene = new UIScene_SettingsGraphicsMenu(iPad, initData, this); + break; + case eUIScene_SettingsUIMenu: + newScene = new UIScene_SettingsUIMenu(iPad, initData, this); + break; + case eUIScene_SkinSelectMenu: + newScene = new UIScene_SkinSelectMenu(iPad, initData, this); + break; + case eUIScene_HowToPlayMenu: + newScene = new UIScene_HowToPlayMenu(iPad, initData, this); + break; + case eUIScene_LanguageSelector: + newScene = new UIScene_LanguageSelector(iPad, initData, this); + break; + case eUIScene_HowToPlay: + newScene = new UIScene_HowToPlay(iPad, initData, this); + break; + case eUIScene_ControlsMenu: + newScene = new UIScene_ControlsMenu(iPad, initData, this); + break; + case eUIScene_ReinstallMenu: + newScene = new UIScene_ReinstallMenu(iPad, initData, this); + break; + case eUIScene_Credits: + newScene = new UIScene_Credits(iPad, initData, this); + break; + + + // Other in-game + case eUIScene_PauseMenu: + newScene = new UIScene_PauseMenu(iPad, initData, this); + break; + case eUIScene_DeathMenu: + newScene = new UIScene_DeathMenu(iPad, initData, this); + break; + case eUIScene_ConnectingProgress: + newScene = new UIScene_ConnectingProgress(iPad, initData, this); + break; + case eUIScene_SignEntryMenu: + newScene = new UIScene_SignEntryMenu(iPad, initData, this); + break; + case eUIScene_InGameInfoMenu: + newScene = new UIScene_InGameInfoMenu(iPad, initData, this); + break; + case eUIScene_InGameHostOptionsMenu: + newScene = new UIScene_InGameHostOptionsMenu(iPad, initData, this); + break; + case eUIScene_InGamePlayerOptionsMenu: + newScene = new UIScene_InGamePlayerOptionsMenu(iPad, initData, this); + break; +#if defined(_XBOX_ONE) || defined(__ORBIS__) + case eUIScene_InGameSaveManagementMenu: + newScene = new UIScene_InGameSaveManagementMenu(iPad, initData, this); + break; +#endif + case eUIScene_TeleportMenu: + newScene = new UIScene_TeleportMenu(iPad, initData, this); + break; + case eUIScene_EndPoem: + if(IsSceneInStack(eUIScene_EndPoem)) + { + app.DebugPrintf("Skipped EndPoem as one was already showing\n"); + return false; + } + else + { + newScene = new UIScene_EndPoem(iPad, initData, this); + } + break; + + + // Frontend + case eUIScene_TrialExitUpsell: + newScene = new UIScene_TrialExitUpsell(iPad, initData, this); + break; + case eUIScene_Intro: + newScene = new UIScene_Intro(iPad, initData, this); + break; + case eUIScene_SaveMessage: + newScene = new UIScene_SaveMessage(iPad, initData, this); + break; + case eUIScene_MainMenu: + newScene = new UIScene_MainMenu(iPad, initData, this); + break; + case eUIScene_LoadOrJoinMenu: + newScene = new UIScene_LoadOrJoinMenu(iPad, initData, this); + break; + case eUIScene_LoadMenu: + newScene = new UIScene_LoadMenu(iPad, initData, this); + break; + case eUIScene_JoinMenu: + newScene = new UIScene_JoinMenu(iPad, initData, this); + break; + case eUIScene_CreateWorldMenu: + newScene = new UIScene_CreateWorldMenu(iPad, initData, this); + break; + case eUIScene_LaunchMoreOptionsMenu: + newScene = new UIScene_LaunchMoreOptionsMenu(iPad, initData, this); + break; + case eUIScene_FullscreenProgress: + newScene = new UIScene_FullscreenProgress(iPad, initData, this); + break; + case eUIScene_LeaderboardsMenu: + newScene = new UIScene_LeaderboardsMenu(iPad, initData, this); + break; + case eUIScene_DLCMainMenu: + newScene = new UIScene_DLCMainMenu(iPad, initData, this); + break; + case eUIScene_DLCOffersMenu: + newScene = new UIScene_DLCOffersMenu(iPad, initData, this); + break; + case eUIScene_EULA: + newScene = new UIScene_EULA(iPad, initData, this); + break; + case eUIScene_NewUpdateMessage: + newScene = new UIScene_NewUpdateMessage(iPad, initData, this); + break; + + // Other + case eUIScene_Keyboard: + newScene = new UIScene_Keyboard(iPad, initData, this); + break; + case eUIScene_QuadrantSignin: + newScene = new UIScene_QuadrantSignin(iPad, initData, this); + break; + case eUIScene_MessageBox: + if(IsSceneInStack(eUIScene_MessageBox)) + { + app.DebugPrintf("Skipped MessageBox as one was already showing\n"); + return false; + } + else + { + newScene = new UIScene_MessageBox(iPad, initData, this); + } + break; + case eUIScene_Timer: + newScene = new UIScene_Timer(iPad, initData, this); + break; + }; + + if(newScene == NULL) + { + app.DebugPrintf("WARNING: Scene %d was not created. Add it to UILayer::NavigateToScene\n", scene); + return false; + } + + if(m_sceneStack.size() > 0) + { + newScene->setBackScene(m_sceneStack[m_sceneStack.size()-1]); + } + + m_sceneStack.push_back(newScene); + + updateFocusState(); + + newScene->tick(); + + return true; +} + +bool UILayer::NavigateBack(int iPad, EUIScene eScene) +{ + if(m_sceneStack.size() == 0) return false; + + bool navigated = false; + if(eScene < eUIScene_COUNT) + { + UIScene *scene = NULL; + do + { + scene = m_sceneStack.back(); + if(scene->getSceneType() == eScene) + { + navigated = true; + break; + } + else + { + if(scene->hasFocus(iPad)) + { + removeScene(scene); + } + else + { + // No focus on the top scene, so this use shouldn't be navigating! + break; + } + } + } while(m_sceneStack.size() > 0); + + } + else + { + UIScene *scene = m_sceneStack.back(); + if(scene->hasFocus(iPad)) + { + removeScene(scene); + navigated = true; + } + } + return navigated; +} + +void UILayer::showComponent(int iPad, EUIScene scene, bool show) +{ + AUTO_VAR(it,m_componentRefCount.find(scene)); + if(it != m_componentRefCount.end()) + { + it->second.second = show; + return; + } + if(show) addComponent(iPad,scene); +} + +bool UILayer::isComponentVisible(EUIScene scene) +{ + bool visible = false; + AUTO_VAR(it,m_componentRefCount.find(scene)); + if(it != m_componentRefCount.end()) + { + visible = it->second.second; + } + return visible; +} + +UIScene *UILayer::addComponent(int iPad, EUIScene scene, void *initData) +{ + AUTO_VAR(it,m_componentRefCount.find(scene)); + if(it != m_componentRefCount.end()) + { + ++it->second.first; + + for(AUTO_VAR(itComp,m_components.begin()); itComp != m_components.end(); ++itComp) + { + if( (*itComp)->getSceneType() == scene ) + { + return *itComp; + } + } + return NULL; + } + UIScene *newScene = NULL; + + switch(scene) + { + case eUIComponent_Panorama: + newScene = new UIComponent_Panorama(iPad, initData, this); + m_componentRefCount[scene] = pair(1,true); + break; + case eUIComponent_DebugUIConsole: + newScene = new UIComponent_DebugUIConsole(iPad, initData, this); + m_componentRefCount[scene] = pair(1,true); + break; + case eUIComponent_DebugUIMarketingGuide: + newScene = new UIComponent_DebugUIMarketingGuide(iPad, initData, this); + m_componentRefCount[scene] = pair(1,true); + break; + case eUIComponent_Logo: + newScene = new UIComponent_Logo(iPad, initData, this); + m_componentRefCount[scene] = pair(1,true); + break; + case eUIComponent_Tooltips: + newScene = new UIComponent_Tooltips(iPad, initData, this); + m_componentRefCount[scene] = pair(1,true); + break; + case eUIComponent_TutorialPopup: + newScene = new UIComponent_TutorialPopup(iPad, initData, this); + // Start hidden + m_componentRefCount[scene] = pair(1,false); + break; + case eUIScene_HUD: + newScene = new UIScene_HUD(iPad, initData, this); + // Start hidden + m_componentRefCount[scene] = pair(1,false); + break; + case eUIComponent_Chat: + newScene = new UIComponent_Chat(iPad, initData, this); + m_componentRefCount[scene] = pair(1,true); + break; + case eUIComponent_PressStartToPlay: + newScene = new UIComponent_PressStartToPlay(iPad, initData, this); + m_componentRefCount[scene] = pair(1,true); + break; + case eUIComponent_MenuBackground: + newScene = new UIComponent_MenuBackground(iPad, initData, this); + m_componentRefCount[scene] = pair(1,true); + break; + }; + + if(newScene == NULL) return NULL; + + m_components.push_back(newScene); + + return newScene; +} + +void UILayer::removeComponent(EUIScene scene) +{ + AUTO_VAR(it,m_componentRefCount.find(scene)); + if(it != m_componentRefCount.end()) + { + --it->second.first; + + if(it->second.first <= 0) + { + m_componentRefCount.erase(it); + for(AUTO_VAR(compIt, m_components.begin()) ; compIt != m_components.end(); ) + { + if( (*compIt)->getSceneType() == scene) + { +#ifdef __PSVITA__ + // remove any touchboxes + ui.TouchBoxesClear((*compIt)); +#endif + m_scenesToDelete.push_back((*compIt)); + (*compIt)->handleDestroy(); // For anything that might require the pointer be valid + compIt = m_components.erase(compIt); + } + else + { + ++compIt; + } + } + } + } +} + +void UILayer::removeScene(UIScene *scene) +{ +#ifdef __PSVITA__ + // remove any touchboxes + ui.TouchBoxesClear(scene); +#endif + + AUTO_VAR(newEnd, std::remove(m_sceneStack.begin(), m_sceneStack.end(), scene) ); + m_sceneStack.erase(newEnd, m_sceneStack.end()); + + m_scenesToDelete.push_back(scene); + + scene->handleDestroy(); // For anything that might require the pointer be valid + + bool hadFocus = m_hasFocus; + updateFocusState(); + + // If this layer has focus, pass it on + if (m_hasFocus || hadFocus) + { + m_hasFocus = false; + m_parentGroup->UpdateFocusState(); + } +} + +void UILayer::closeAllScenes() +{ + vector temp; + temp.insert(temp.end(), m_sceneStack.begin(), m_sceneStack.end()); + m_sceneStack.clear(); + for(AUTO_VAR(it, temp.begin()); it != temp.end(); ++it) + { +#ifdef __PSVITA__ + // remove any touchboxes + ui.TouchBoxesClear(*it); +#endif + m_scenesToDelete.push_back(*it); + (*it)->handleDestroy(); // For anything that might require the pointer be valid + } + + updateFocusState(); + + // If this layer has focus, pass it on + if (m_hasFocus) + { + m_hasFocus = false; + m_parentGroup->UpdateFocusState(); + } +} + +// Get top scene on stack (or NULL if stack is empty) +UIScene *UILayer::GetTopScene() +{ + if(m_sceneStack.size() == 0) + { + return NULL; + } + else + { + return m_sceneStack[m_sceneStack.size()-1]; + } +} + +// Updates layer focus state if no error message is present (unless this is the error layer) +bool UILayer::updateFocusState(bool allowedFocus /* = false */) +{ + // If haveFocus is false, request it + if (!allowedFocus) + { + // To update focus in this layer we need to request focus from group + // Focus will be denied if there's an upper layer that needs focus + allowedFocus = m_parentGroup->RequestFocus(this); + } + + m_bMenuDisplayed = false; + m_bPauseMenuDisplayed = false; + m_bContainerMenuDisplayed = false; + m_bIgnoreAutosaveMenuDisplayed = false; + m_bIgnorePlayerJoinMenuDisplayed = false; + + bool layerFocusSet = false; + for(AUTO_VAR(it,m_sceneStack.rbegin()); it != m_sceneStack.rend(); ++it) + { + UIScene *scene = *it; + + // UPDATE FOCUS STATES + if(!layerFocusSet && allowedFocus && scene->stealsFocus()) + { + scene->gainFocus(); + layerFocusSet = true; + } + else + { + scene->loseFocus(); + if(allowedFocus && app.GetGameStarted()) + { + // 4J Stu - This is a memory optimisation so we don't keep scenes loaded in memory all the time + // This is required for PS3 (and likely Vita), but I'm removing it on XboxOne so that we can avoid + // the scene creation time (which can be >0.5s) since we have the memory to spare +#ifndef _XBOX_ONE + m_scenesToDestroy.push_back(scene); +#endif + } + + if (scene->getSceneType() == eUIScene_SettingsOptionsMenu) + { + scene->loseFocus(); + m_scenesToDestroy.push_back(scene); + } + } + + /// UPDATE STACK STATES + + // 4J-PB - this should just be true + m_bMenuDisplayed=true; + + EUIScene sceneType = scene->getSceneType(); + switch(sceneType) + { + case eUIScene_PauseMenu: + m_bPauseMenuDisplayed = true; + break; + case eUIScene_Crafting2x2Menu: + case eUIScene_Crafting3x3Menu: + case eUIScene_FurnaceMenu: + case eUIScene_ContainerMenu: + case eUIScene_LargeContainerMenu: + case eUIScene_InventoryMenu: + case eUIScene_CreativeMenu: + case eUIScene_DispenserMenu: + case eUIScene_BrewingStandMenu: + case eUIScene_EnchantingMenu: + case eUIScene_TradingMenu: + case eUIScene_HopperMenu: + case eUIScene_HorseMenu: + case eUIScene_FireworksMenu: + case eUIScene_BeaconMenu: + case eUIScene_AnvilMenu: + m_bContainerMenuDisplayed=true; + + // Intentional fall-through + case eUIScene_DeathMenu: + case eUIScene_FullscreenProgress: + case eUIScene_SignEntryMenu: + case eUIScene_EndPoem: + m_bIgnoreAutosaveMenuDisplayed = true; + break; + } + + switch(sceneType) + { + case eUIScene_FullscreenProgress: + case eUIScene_EndPoem: + case eUIScene_Credits: + case eUIScene_LeaderboardsMenu: + m_bIgnorePlayerJoinMenuDisplayed = true; + break; + } + } + m_hasFocus = layerFocusSet; + + return m_hasFocus; +} + +#ifdef __PSVITA__ +UIScene *UILayer::getCurrentScene() +{ + // Note: reverse iterator, the last element is the top of the stack + for(AUTO_VAR(it,m_sceneStack.rbegin()); it != m_sceneStack.rend(); ++it) + { + UIScene *scene = *it; + // 4J-PB - only used on Vita, so iPad 0 is fine + if(scene->hasFocus(0) && scene->canHandleInput()) + { + return scene; + } +} + + return NULL; +} +#endif + +void UILayer::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + // Note: reverse iterator, the last element is the top of the stack + for(AUTO_VAR(it,m_sceneStack.rbegin()); it != m_sceneStack.rend(); ++it) + { + UIScene *scene = *it; + if(scene->hasFocus(iPad) && scene->canHandleInput()) + { + // 4J-PB - ignore repeats of action ABXY buttons + // fix for PS3 213 - [MAIN MENU] Holding down buttons will continue to activate every prompt. + // 4J Stu - Changed this slightly to add the allowRepeat function so we can allow repeats in the crafting menu + if(repeat && !scene->allowRepeat(key) ) + { + return; + } + scene->handleInput(iPad, key, repeat, pressed, released, handled); + } + + // Fix for PS3 #444 - [IN GAME] If the user keeps pressing CROSS while on the 'Save Game' screen the title will crash. + handled = handled || scene->hidesLowerScenes() || scene->blocksInput(); + if(handled ) break; + } + + // Components can't take input or focus +} + +void UILayer::HandleDLCMountingComplete() +{ + for(AUTO_VAR(it,m_sceneStack.rbegin()); it != m_sceneStack.rend(); ++it) + { + UIScene *topScene = *it; + app.DebugPrintf("UILayer::HandleDLCMountingComplete - topScene\n"); + topScene->HandleDLCMountingComplete(); + } +} + +void UILayer::HandleDLCInstalled() +{ + for(AUTO_VAR(it,m_sceneStack.rbegin()); it != m_sceneStack.rend(); ++it) + { + UIScene *topScene = *it; + topScene->HandleDLCInstalled(); + } +} + +#ifdef _XBOX_ONE +void UILayer::HandleDLCLicenseChange() +{ + for(AUTO_VAR(it,m_sceneStack.rbegin()); it != m_sceneStack.rend(); ++it) + { + UIScene *topScene = *it; + topScene->HandleDLCLicenseChange(); + } +} +#endif + +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(); +} + +C4JRender::eViewportType UILayer::getViewport() +{ + return m_parentGroup->GetViewportType(); +} + + +void UILayer::handleUnlockFullVersion() +{ + for(AUTO_VAR(it, m_sceneStack.begin()); it != m_sceneStack.end(); ++it) + { + (*it)->handleUnlockFullVersion(); + } +} + +void UILayer::PrintTotalMemoryUsage(__int64 &totalStatic, __int64 &totalDynamic) +{ + __int64 layerStatic = 0; + __int64 layerDynamic = 0; + for(AUTO_VAR(it,m_components.begin()); it != m_components.end(); ++it) + { + (*it)->PrintTotalMemoryUsage(layerStatic, layerDynamic); + } + for(AUTO_VAR(it, m_sceneStack.begin()); it != m_sceneStack.end(); ++it) + { + (*it)->PrintTotalMemoryUsage(layerStatic, layerDynamic); + } + app.DebugPrintf(app.USER_SR, " \\- Layer static: %d , Layer dynamic: %d\n", layerStatic, layerDynamic); + totalStatic += layerStatic; + totalDynamic += layerDynamic; +} + +// Returns the first scene of given type if it exists, NULL otherwise +UIScene *UILayer::FindScene(EUIScene sceneType) +{ + for (int i = 0; i < m_sceneStack.size(); i++) + { + if (m_sceneStack[i]->getSceneType() == sceneType) + { + return m_sceneStack[i]; + } + } + + return NULL; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UILayer.h b/Minecraft.Client/Common/UI/UILayer.h new file mode 100644 index 00000000..47c776ab --- /dev/null +++ b/Minecraft.Client/Common/UI/UILayer.h @@ -0,0 +1,93 @@ +#pragma once +#include "UIEnums.h" +using namespace std; +class UIScene; +class UIGroup; + +// A layer include a collection of scenes and other components +class UILayer +{ +private: + vector m_sceneStack; // Operates as a stack mainly, but we may wish to iterate over all elements + vector m_components; // Other componenents in this scene that to do not conform the the user nav stack, and cannot take focus + vector m_scenesToDelete; // A list of scenes to delete + vector m_scenesToDestroy; // A list of scenes where we want to dump the swf + +#ifdef __ORBIS__ + unordered_map,std::hash> m_componentRefCount; +#else + unordered_map > m_componentRefCount; +#endif + +public: + bool m_hasFocus; // True if the layer "has focus", should be the only layer in the group + bool m_bMenuDisplayed; + bool m_bPauseMenuDisplayed; + bool m_bContainerMenuDisplayed; + bool m_bIgnoreAutosaveMenuDisplayed; + bool m_bIgnorePlayerJoinMenuDisplayed; + +#ifdef __PSVITA__ + EUILayer m_iLayer; +#endif + + UIGroup *m_parentGroup; +public: + UILayer(UIGroup *parent); + + void tick(); + void render(S32 width, S32 height, C4JRender::eViewportType viewport); + void getRenderDimensions(S32 &width, S32 &height); + + void DestroyAll(); + void ReloadAll(bool force = false); + + // NAVIGATION + bool NavigateToScene(int iPad, EUIScene scene, void *initData); + bool NavigateBack(int iPad, EUIScene eScene); + void removeScene(UIScene *scene); + void closeAllScenes(); + UIScene *GetTopScene(); + + bool GetMenuDisplayed(); + bool IsPauseMenuDisplayed() { return m_bPauseMenuDisplayed; } + + bool IsSceneInStack(EUIScene scene); + bool HasFocus(int iPad); + + bool hidesLowerScenes(); + + // A component is an element on a layer that displays BELOW other scenes in this layer, but does not engage in any navigation + // E.g. you can keep a component active while performing navigation with other scenes on this layer + void showComponent(int iPad, EUIScene scene, bool show); + bool isComponentVisible(EUIScene scene); + UIScene *addComponent(int iPad, EUIScene scene, void *initData = NULL); + void removeComponent(EUIScene scene); + + // INPUT + void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); +#ifdef __PSVITA__ + // Current active scene + UIScene *getCurrentScene(); +#endif + // FOCUS + + bool updateFocusState(bool allowedFocus = false); + +public: + bool IsFullscreenGroup(); + C4JRender::eViewportType getViewport(); + + virtual void HandleDLCMountingComplete(); + virtual void HandleDLCInstalled(); +#ifdef _XBOX_ONE + virtual void HandleDLCLicenseChange(); +#endif + virtual void HandleMessage(EUIMessage message, void *data); + + void handleUnlockFullVersion(); + UIScene *FindScene(EUIScene sceneType); + + void PrintTotalMemoryUsage(__int64 &totalStatic, __int64 &totalDynamic); + +}; diff --git a/Minecraft.Client/Common/UI/UIScene.cpp b/Minecraft.Client/Common/UI/UIScene.cpp new file mode 100644 index 00000000..ba253643 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene.cpp @@ -0,0 +1,1268 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene.h" + +#include "..\..\Lighting.h" +#include "..\..\LocalPlayer.h" +#include "..\..\ItemRenderer.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.h" + +UIScene::UIScene(int iPad, UILayer *parentLayer) +{ + m_parentLayer = parentLayer; + m_iPad = iPad; + swf = NULL; + m_pItemRenderer = NULL; + + bHasFocus = false; + m_hasTickedOnce = false; + m_bFocussedOnce = false; + m_bVisible = true; + m_bCanHandleInput = false; + m_bIsReloading = false; + + m_iFocusControl = -1; + m_iFocusChild = 0; + m_lastOpacity = 1.0f; + m_bUpdateOpacity = false; + + m_backScene = NULL; + + m_cacheSlotRenders = false; + m_needsCacheRendered = true; + m_expectedCachedSlotCount = 0; + m_callbackUniqueId = 0; +} + +UIScene::~UIScene() +{ + /* Destroy the Iggy player. */ + IggyPlayerDestroy( swf ); + + for(AUTO_VAR(it,m_registeredTextures.begin()); it != m_registeredTextures.end(); ++it) + { + ui.unregisterSubstitutionTexture( it->first, it->second ); + } + + if(m_callbackUniqueId != 0) + { + ui.UnregisterCallbackId(m_callbackUniqueId); + } + + if(m_pItemRenderer != NULL) delete m_pItemRenderer; +} + +void UIScene::destroyMovie() +{ + /* Destroy the Iggy player. */ + IggyPlayerDestroy( swf ); + swf = NULL; + + // Clear out the controls collection (doesn't delete the controls, and they get re-setup later) + m_controls.clear(); + + // Clear out all the fast names for the current movie + m_fastNames.clear(); +} + +void UIScene::reloadMovie(bool force) +{ + if(!force && (stealsFocus() && (getSceneType() != eUIScene_FullscreenProgress && !bHasFocus))) return; + + m_bIsReloading = true; + if(swf) + { + /* Destroy the Iggy player. */ + IggyPlayerDestroy( swf ); + + // Clear out the controls collection (doesn't delete the controls, and they get re-setup later) + m_controls.clear(); + + // Clear out all the fast names for the current movie + m_fastNames.clear(); + } + + // Reload everything + initialiseMovie(); + + handlePreReload(); + + // Reload controls + for(AUTO_VAR(it, m_controls.begin()); it != m_controls.end(); ++it) + { + (*it)->ReInit(); + } + + updateComponents(); + handleReload(); + + IggyDataValue result; + IggyDataValue value[1]; + + value[0].type = IGGY_DATATYPE_number; + value[0].number = m_iFocusControl; + + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetFocus , 1 , value ); + + m_needsCacheRendered = true; + m_bIsReloading = false; +} + +bool UIScene::needsReloaded() +{ + return !swf && (!stealsFocus() || bHasFocus); +} + +bool UIScene::hasMovie() +{ + return swf != NULL; +} + +F64 UIScene::getSafeZoneHalfHeight() +{ + float height = ui.getScreenHeight(); + + float safeHeight = 0.0f; + +#ifndef __PSVITA__ + if( !RenderManager.IsHiDef() && RenderManager.IsWidescreen() ) + { + // 90% safezone + safeHeight = height * (0.15f / 2); + } + else + { + // 90% safezone + safeHeight = height * (0.1f / 2); + } +#endif + return safeHeight; +} + +F64 UIScene::getSafeZoneHalfWidth() +{ + float width = ui.getScreenWidth(); + + float safeWidth = 0.0f; +#ifndef __PSVITA__ + if( !RenderManager.IsHiDef() && RenderManager.IsWidescreen() ) + { + // 85% safezone + safeWidth = width * (0.15f / 2); + } + else + { + // 90% safezone + safeWidth = width * (0.1f / 2); + } +#endif + return safeWidth; +} + +void UIScene::updateSafeZone() +{ + // Distance from edge + F64 safeTop = 0.0; + F64 safeBottom = 0.0; + F64 safeLeft = 0.0; + F64 safeRight = 0.0; + + switch( m_parentLayer->getViewport() ) + { + case C4JRender::VIEWPORT_TYPE_SPLIT_TOP: + safeTop = getSafeZoneHalfHeight(); + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: + safeBottom = getSafeZoneHalfHeight(); + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_LEFT: + safeLeft = getSafeZoneHalfWidth(); + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: + safeRight = getSafeZoneHalfWidth(); + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_LEFT: + safeTop = getSafeZoneHalfHeight(); + safeLeft = getSafeZoneHalfWidth(); + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: + safeTop = getSafeZoneHalfHeight(); + safeRight = getSafeZoneHalfWidth(); + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT: + safeBottom = getSafeZoneHalfHeight(); + safeLeft = getSafeZoneHalfWidth(); + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT: + safeBottom = getSafeZoneHalfHeight(); + safeRight = getSafeZoneHalfWidth(); + break; + case C4JRender::VIEWPORT_TYPE_FULLSCREEN: + default: + safeTop = getSafeZoneHalfHeight(); + safeBottom = getSafeZoneHalfHeight(); + safeLeft = getSafeZoneHalfWidth(); + safeRight = getSafeZoneHalfWidth(); + break; + } + setSafeZone(safeTop, safeBottom, safeLeft, safeRight); +} + +void UIScene::setSafeZone(S32 safeTop, S32 safeBottom, S32 safeLeft, S32 safeRight) +{ + IggyDataValue result; + IggyDataValue value[4]; + + value[0].type = IGGY_DATATYPE_number; + value[0].number = safeTop; + value[1].type = IGGY_DATATYPE_number; + value[1].number = safeBottom; + value[2].type = IGGY_DATATYPE_number; + value[2].number = safeLeft; + value[3].type = IGGY_DATATYPE_number; + value[3].number = safeRight; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetSafeZone , 4 , value ); +} + +void UIScene::initialiseMovie() +{ + loadMovie(); + mapElementsAndNames(); + + updateSafeZone(); + + m_bUpdateOpacity = true; +} + +#ifdef __PSVITA__ +void UIScene::SetFocusToElement(int iID) +{ + IggyDataValue result; + IggyDataValue value[1]; + + value[0].type = IGGY_DATATYPE_number; + value[0].number = iID; + + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetFocus , 1 , value ); + + // also trigger handle focus change (just in case if anything else in relation needs updating!) + _handleFocusChange(iID, 0); +} +#endif + +bool UIScene::mapElementsAndNames() +{ + m_rootPath = IggyPlayerRootPath( swf ); + + m_funcRemoveObject = registerFastName( L"RemoveObject" ); + m_funcSlideLeft = registerFastName( L"SlideLeft" ); + m_funcSlideRight = registerFastName( L"SlideRight" ); + m_funcSetSafeZone = registerFastName( L"SetSafeZone" ); + m_funcSetAlpha = registerFastName( L"SetAlpha" ); + m_funcSetFocus = registerFastName( L"SetFocus" ); + m_funcHorizontalResizeCheck = registerFastName( L"DoHorizontalResizeCheck"); + return true; +} + +extern CRITICAL_SECTION s_loadSkinCS; +void UIScene::loadMovie() +{ + EnterCriticalSection(&UIController::ms_reloadSkinCS); // MGH - added to prevent crash loading Iggy movies while the skins were being reloaded + wstring moviePath = getMoviePath(); + +#ifdef __PS3__ + if(RenderManager.IsWidescreen()) + { + moviePath.append(L"720.swf"); + m_loadedResolution = eSceneResolution_720; + } + else + { + moviePath.append(L"480.swf"); + m_loadedResolution = eSceneResolution_480; + } +#elif defined __PSVITA__ + moviePath.append(L"Vita.swf"); + m_loadedResolution = eSceneResolution_Vita; +#elif defined _WINDOWS64 + if(ui.getScreenHeight() == 720) + { + moviePath.append(L"720.swf"); + m_loadedResolution = eSceneResolution_720; + } + else if(ui.getScreenHeight() == 480) + { + moviePath.append(L"480.swf"); + m_loadedResolution = eSceneResolution_480; + } + else if(ui.getScreenHeight() < 720) + { + moviePath.append(L"Vita.swf"); + m_loadedResolution = eSceneResolution_Vita; + } + else + { + moviePath.append(L"1080.swf"); + m_loadedResolution = eSceneResolution_1080; + } +#else + moviePath.append(L"1080.swf"); + m_loadedResolution = eSceneResolution_1080; +#endif + + if(!app.hasArchiveFile(moviePath)) + { + app.DebugPrintf("WARNING: Could not find iggy movie %ls, falling back on 720\n", moviePath.c_str()); + + moviePath = getMoviePath(); + moviePath.append(L"720.swf"); + m_loadedResolution = eSceneResolution_720; + + if(!app.hasArchiveFile(moviePath)) + { + app.DebugPrintf("ERROR: Could not find any iggy movie for %ls!\n", moviePath.c_str()); +#ifndef _CONTENT_PACKAGE + __debugbreak(); +#endif + app.FatalLoadError(); + } + } + + byteArray baFile = ui.getMovieData(moviePath.c_str()); + __int64 beforeLoad = ui.iggyAllocCount; + swf = IggyPlayerCreateFromMemory ( baFile.data , baFile.length, NULL); + __int64 afterLoad = ui.iggyAllocCount; + IggyPlayerInitializeAndTickRS ( swf ); + __int64 afterTick = ui.iggyAllocCount; + + if(!swf) + { + app.DebugPrintf("ERROR: Failed to load iggy scene!\n"); +#ifndef _CONTENT_PACKAGE + __debugbreak(); +#endif + app.FatalLoadError(); + } + app.DebugPrintf( app.USER_SR, "Loaded iggy movie %ls\n", moviePath.c_str() ); + IggyProperties *properties = IggyPlayerProperties ( swf ); + m_movieHeight = properties->movie_height_in_pixels; + m_movieWidth = properties->movie_width_in_pixels; + + m_renderWidth = m_movieWidth; + m_renderHeight = m_movieHeight; + + S32 width, height; + m_parentLayer->getRenderDimensions(width, height); + IggyPlayerSetDisplaySize( swf, width, height ); + + IggyPlayerSetUserdata(swf,this); + +//#ifdef _DEBUG +#if 0 + IggyMemoryUseInfo memoryInfo; + rrbool res; + int iteration = 0; + __int64 totalStatic = 0; + __int64 totalDynamic = 0; + while(res = IggyDebugGetMemoryUseInfo ( swf , + NULL , + 0 , + 0 , + iteration , + &memoryInfo )) + { + totalStatic += memoryInfo.static_allocation_bytes; + totalDynamic += memoryInfo.dynamic_allocation_bytes; + app.DebugPrintf(app.USER_SR, "%ls - %.*s static: %d ( %d ) dynamic: %d ( %d )\n", moviePath.c_str(), memoryInfo.subcategory_stringlen, memoryInfo.subcategory, + memoryInfo.static_allocation_bytes, memoryInfo.static_allocation_count, memoryInfo.dynamic_allocation_bytes, memoryInfo.dynamic_allocation_count); + ++iteration; + //if(memoryInfo.static_allocation_bytes > 0) getDebugMemoryUseRecursive(moviePath, memoryInfo); + + } + + app.DebugPrintf(app.USER_SR, "%ls - Total: %d, Expected: %d, Diff: %d\n", moviePath.c_str(), totalStatic + totalDynamic, afterTick - beforeLoad, (afterTick - beforeLoad) - (totalStatic + totalDynamic)); + +#endif + LeaveCriticalSection(&UIController::ms_reloadSkinCS); + +} + +void UIScene::getDebugMemoryUseRecursive(const wstring &moviePath, IggyMemoryUseInfo &memoryInfo) +{ + rrbool res; + IggyMemoryUseInfo internalMemoryInfo; + int internalIteration = 0; + while(res = IggyDebugGetMemoryUseInfo ( swf , + NULL , + memoryInfo.subcategory , + memoryInfo.subcategory_stringlen , + internalIteration , + &internalMemoryInfo )) + { + app.DebugPrintf(app.USER_SR, "%ls - %.*s static: %d ( %d ) dynamic: %d ( %d )\n", moviePath.c_str(), internalMemoryInfo.subcategory_stringlen, internalMemoryInfo.subcategory, + internalMemoryInfo.static_allocation_bytes, internalMemoryInfo.static_allocation_count, internalMemoryInfo.dynamic_allocation_bytes, internalMemoryInfo.dynamic_allocation_count); + ++internalIteration; + if(internalMemoryInfo.subcategory_stringlen > memoryInfo.subcategory_stringlen) getDebugMemoryUseRecursive(moviePath, internalMemoryInfo); + } +} + +void UIScene::PrintTotalMemoryUsage(__int64 &totalStatic, __int64 &totalDynamic) +{ + if(!swf) return; + + IggyMemoryUseInfo memoryInfo; + rrbool res; + int iteration = 0; + __int64 sceneStatic = 0; + __int64 sceneDynamic = 0; + while(res = IggyDebugGetMemoryUseInfo ( swf , + NULL , + "" , + 0 , + iteration , + &memoryInfo )) + { + sceneStatic += memoryInfo.static_allocation_bytes; + sceneDynamic += memoryInfo.dynamic_allocation_bytes; + totalStatic += memoryInfo.static_allocation_bytes; + totalDynamic += memoryInfo.dynamic_allocation_bytes; + ++iteration; + + } + + app.DebugPrintf(app.USER_SR, " \\- Scene static: %d , Scene dynamic: %d , Total: %d - %ls\n", sceneStatic, sceneDynamic, sceneStatic + sceneDynamic, getMoviePath().c_str()); +} + +void UIScene::tick() +{ + if(m_bIsReloading) return; + if(m_hasTickedOnce) m_bCanHandleInput = true; + while(IggyPlayerReadyToTick( swf )) + { + tickTimers(); + for(AUTO_VAR(it, m_controls.begin()); it != m_controls.end(); ++it) + { + (*it)->tick(); + } + IggyPlayerTickRS( swf ); + m_hasTickedOnce = true; + } +} + +UIControl* UIScene::GetMainPanel() +{ + return NULL; +} + + +void UIScene::addTimer(int id, int ms) +{ + int currentTime = System::currentTimeMillis(); + + TimerInfo info; + info.running = true; + info.duration = ms; + info.targetTime = currentTime + ms; + m_timers[id] = info; +} + +void UIScene::killTimer(int id) +{ + AUTO_VAR(it, m_timers.find(id)); + if(it != m_timers.end()) + { + it->second.running = false; + } +} + +void UIScene::tickTimers() +{ + int currentTime = System::currentTimeMillis(); + for(AUTO_VAR(it, m_timers.begin()); it != m_timers.end();) + { + if(!it->second.running) + { + it = m_timers.erase(it); + } + else + { + if(currentTime > it->second.targetTime) + { + handleTimerComplete(it->first); + + // Auto-restart + it->second.targetTime = it->second.duration + currentTime; + } + ++it; + } + } +} + +IggyName UIScene::registerFastName(const wstring &name) +{ + IggyName var; + AUTO_VAR(it,m_fastNames.find(name)); + if(it != m_fastNames.end()) + { + var = it->second; + } + else + { + var = IggyPlayerCreateFastName ( getMovie() , (IggyUTF16 *)name.c_str() , -1 ); + m_fastNames[name] = var; + } + return var; +} + +void UIScene::removeControl( UIControl_Base *control, bool centreScene) +{ + IggyDataValue result; + IggyDataValue value[2]; + + string name = control->getControlName(); + IggyStringUTF8 stringVal; + stringVal.string = (char*)name.c_str(); + stringVal.length = name.length(); + value[0].type = IGGY_DATATYPE_string_UTF8; + value[0].string8 = stringVal; + + value[1].type = IGGY_DATATYPE_boolean; + value[1].boolval = centreScene; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcRemoveObject , 2 , value ); + +#ifdef __PSVITA__ + // update the button positions since they may have changed + UpdateSceneControls(); + + // mark the button as removed + control->setHidden(true); + // remove it from the touchboxes + ui.TouchBoxRebuild(control->getParentScene()); +#endif + +} + +void UIScene::slideLeft() +{ + IggyDataValue result; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSlideLeft , 0 , NULL ); +} + +void UIScene::slideRight() +{ + IggyDataValue result; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSlideRight , 0 , NULL ); +} + +void UIScene::doHorizontalResizeCheck() +{ + IggyDataValue result; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcHorizontalResizeCheck , 0 , NULL ); +} + +void UIScene::render(S32 width, S32 height, C4JRender::eViewportType viewport) +{ + if(m_bIsReloading) return; + if(!m_hasTickedOnce || !swf) return; + ui.setupRenderPosition(viewport); + IggyPlayerSetDisplaySize( swf, width, height ); + IggyPlayerDraw( swf ); +} + +void UIScene::setOpacity(float percent) +{ + if(percent != m_lastOpacity || (m_bUpdateOpacity && getMovie())) + { + m_lastOpacity = percent; + + // 4J-TomK once a scene has been freshly loaded or re-loaded we force update opacity via initialiseMovie + if(m_bUpdateOpacity) + m_bUpdateOpacity = false; + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = percent; + + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetAlpha , 1 , value ); + } +} + +void UIScene::setVisible(bool visible) +{ + m_bVisible = visible; +} + +void UIScene::customDraw(IggyCustomDrawCallbackRegion *region) +{ + app.DebugPrintf("Handling custom draw for scene with no override!\n"); +} + +void UIScene::customDrawSlotControl(IggyCustomDrawCallbackRegion *region, int iPad, shared_ptr item, float fAlpha, bool isFoil, bool bDecorations) +{ + if (item!= NULL) + { + if(m_cacheSlotRenders) + { + if( (m_cachedSlotDraw.size() + 1) == m_expectedCachedSlotCount) + { + //Make sure that pMinecraft->player is the correct player so that player specific rendering + // eg clock and compass, are rendered correctly + Minecraft *pMinecraft=Minecraft::GetInstance(); + shared_ptr oldPlayer = pMinecraft->player; + if( iPad >= 0 && iPad < XUSER_MAX_COUNT ) pMinecraft->player = pMinecraft->localplayers[iPad]; + + // Setup GDraw, normal game render states and matrices + //CustomDrawData *customDrawRegion = ui.setupCustomDraw(this,region); + PIXBeginNamedEvent(0,"Starting Iggy custom draw\n"); + CustomDrawData *customDrawRegion = ui.calculateCustomDraw(region); + ui.beginIggyCustomDraw4J(region, customDrawRegion); + ui.setupCustomDrawGameState(); + + int list = m_parentLayer->m_parentGroup->getCommandBufferList(); + + bool useCommandBuffers = false; +#ifdef _XBOX_ONE + useCommandBuffers = true; + + // 4J Stu - Temporary until we fix the glint animation which needs updated if we are just replaying a command buffer + m_needsCacheRendered = true; +#endif + + if(!useCommandBuffers || m_needsCacheRendered) + { +#if (!defined __PS3__) && (!defined __PSVITA__) + if(useCommandBuffers) RenderManager.CBuffStart(list, true); +#endif + PIXBeginNamedEvent(0,"Draw uncached"); + ui.setupCustomDrawMatrices(this, customDrawRegion); + _customDrawSlotControl(customDrawRegion, iPad, item, fAlpha, isFoil, bDecorations, useCommandBuffers); + delete customDrawRegion; + PIXEndNamedEvent(); + + PIXBeginNamedEvent(0,"Draw all cache"); + // Draw all the cached slots + for(AUTO_VAR(it, m_cachedSlotDraw.begin()); it != m_cachedSlotDraw.end(); ++it) + { + CachedSlotDrawData *drawData = *it; + ui.setupCustomDrawMatrices(this, drawData->customDrawRegion); + _customDrawSlotControl(drawData->customDrawRegion, iPad, drawData->item, drawData->fAlpha, drawData->isFoil, drawData->bDecorations, useCommandBuffers); + delete drawData->customDrawRegion; + delete drawData; + } + PIXEndNamedEvent(); +#ifndef __PS3__ + if(useCommandBuffers) RenderManager.CBuffEnd(); +#endif + } + m_cachedSlotDraw.clear(); + +#ifndef __PS3__ + if(useCommandBuffers) RenderManager.CBuffCall(list); +#endif + + // Finish GDraw and anything else that needs to be finalised + ui.endCustomDraw(region); + + pMinecraft->player = oldPlayer; + } + else + { + PIXBeginNamedEvent(0,"Caching region"); + CachedSlotDrawData *drawData = new CachedSlotDrawData(); + drawData->item = item; + drawData->fAlpha = fAlpha; + drawData->isFoil = isFoil; + drawData->bDecorations = bDecorations; + drawData->customDrawRegion = ui.calculateCustomDraw(region); + + m_cachedSlotDraw.push_back(drawData); + PIXEndNamedEvent(); + } + } + else + { + // Setup GDraw, normal game render states and matrices + CustomDrawData *customDrawRegion = ui.setupCustomDraw(this,region); + + Minecraft *pMinecraft=Minecraft::GetInstance(); + + //Make sure that pMinecraft->player is the correct player so that player specific rendering + // eg clock and compass, are rendered correctly + shared_ptr oldPlayer = pMinecraft->player; + if( iPad >= 0 && iPad < XUSER_MAX_COUNT ) pMinecraft->player = pMinecraft->localplayers[iPad]; + + _customDrawSlotControl(customDrawRegion, iPad, item, fAlpha, isFoil, bDecorations, false); + delete customDrawRegion; + pMinecraft->player = oldPlayer; + + // Finish GDraw and anything else that needs to be finalised + ui.endCustomDraw(region); + } + } +} + +void UIScene::_customDrawSlotControl(CustomDrawData *region, int iPad, shared_ptr item, float fAlpha, bool isFoil, bool bDecorations, bool usingCommandBuffer) +{ + Minecraft *pMinecraft=Minecraft::GetInstance(); + + float bwidth,bheight; + bwidth = region->x1 - region->x0; + bheight = region->y1 - region->y0; + + float x = region->x0; + float y = region->y0; + + // Base scale on height of this control, compared to height of what the item renderer normally renders (16 pixels high). Potentially + // we might want separate x & y scales here + + float scaleX = bwidth / 16.0f; + float scaleY = bheight / 16.0f; + + glEnable(GL_RESCALE_NORMAL); + glPushMatrix(); + glRotatef(120, 1, 0, 0); + Lighting::turnOn(); + glPopMatrix(); + + float pop = item->popTime; + if (pop > 0) + { + glPushMatrix(); + float squeeze = 1 + pop / (float) Inventory::POP_TIME_DURATION; + float sx = x; + float sy = y; + float sxoffs = 8 * scaleX; + float syoffs = 12 * scaleY; + glTranslatef((float)(sx + sxoffs), (float)(sy + syoffs), 0); + glScalef(1 / squeeze, (squeeze + 1) / 2, 1); + glTranslatef((float)-(sx + sxoffs), (float)-(sy + syoffs), 0); + } + + PIXBeginNamedEvent(0,"Render and decorate"); + if(m_pItemRenderer == NULL) m_pItemRenderer = new ItemRenderer(); + 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(); + + if (pop > 0) + { + glPopMatrix(); + } + + if(bDecorations) + { + if((scaleX!=1.0f) ||(scaleY!=1.0f)) + { + glPushMatrix(); + glScalef(scaleX, scaleY, 1.0f); + int iX= (int)(0.5f+((float)x)/scaleX); + int iY= (int)(0.5f+((float)y)/scaleY); + + m_pItemRenderer->renderGuiItemDecorations(pMinecraft->font, pMinecraft->textures, item, iX, iY, fAlpha); + glPopMatrix(); + } + else + { + m_pItemRenderer->renderGuiItemDecorations(pMinecraft->font, pMinecraft->textures, item, (int)x, (int)y, fAlpha); + } + } + + Lighting::turnOff(); + glDisable(GL_RESCALE_NORMAL); +} + +// 4J Stu - Not threadsafe +//void UIScene::navigateForward(int iPad, EUIScene scene, void *initData) +//{ +// if(m_parentLayer == NULL) +// { +// app.DebugPrintf("A scene is trying to navigate forwards, but it's parent layer is NULL!\n"); +//#ifndef _CONTENT_PACKAGE +// __debugbreak(); +//#endif +// } +// else +// { +// m_parentLayer->NavigateToScene(iPad,scene,initData); +// } +//} + +void UIScene::navigateBack() +{ + //CD - Added for audio + ui.PlayUISFX(eSFX_Back); + + ui.NavigateBack(m_iPad); + + if(m_parentLayer == NULL) + { +// app.DebugPrintf("A scene is trying to navigate back, but it's parent layer is NULL!\n"); +#ifndef _CONTENT_PACKAGE +// __debugbreak(); +#endif + } + else + { +// m_parentLayer->removeScene(this); + +#ifdef _DURANGO + if (ui.GetTopScene(0)) + InputManager.SetEnabledGtcButtons( ui.GetTopScene(0)->getDefaultGtcButtons() ); +#endif + } + +} + +void UIScene::gainFocus() +{ + if( !bHasFocus && stealsFocus() ) + { + // 4J Stu - Don't do this + /* + IggyEvent event; + IggyMakeEventFocusGained( &event , 0); + + IggyEventResult result; + IggyPlayerDispatchEventRS( getMovie() , &event , &result ); + + app.DebugPrintf("Sent gain focus event to scene\n"); + */ + bHasFocus = true; + if(needsReloaded()) + { + reloadMovie(); + } + + updateTooltips(); + updateComponents(); + + if(!m_bFocussedOnce) + { + IggyDataValue result; + IggyDataValue value[1]; + + value[0].type = IGGY_DATATYPE_number; + value[0].number = -1; + + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetFocus , 1 , value ); + } + + handleGainFocus(m_bFocussedOnce); + if(bHasFocus) m_bFocussedOnce = true; + } + else if(bHasFocus && stealsFocus()) + { + updateTooltips(); + } +} + +void UIScene::loseFocus() +{ + if(bHasFocus) + { + // 4J Stu - Don't do this + /* + IggyEvent event; + IggyMakeEventFocusLost( &event ); + IggyEventResult result; + IggyPlayerDispatchEventRS ( getMovie() , &event , &result ); + */ + + app.DebugPrintf("Sent lose focus event to scene\n"); + bHasFocus = false; + handleLoseFocus(); + } +} + +void UIScene::handleGainFocus(bool navBack) +{ +#ifdef _DURANGO + InputManager.SetEnabledGtcButtons( this->getDefaultGtcButtons() ); +#endif +} + +void UIScene::updateTooltips() +{ + if(!ui.IsReloadingSkin()) + ui.SetTooltips(m_iPad, -1); +} + +void UIScene::sendInputToMovie(int key, bool repeat, bool pressed, bool released) +{ + if(!swf) return; + + int iggyKeyCode = convertGameActionToIggyKeycode(key); + + if(iggyKeyCode < 0) + { + app.DebugPrintf("UI WARNING: Ignoring input as game action does not translate to an Iggy keycode\n"); + return; + } + IggyEvent keyEvent; + // 4J Stu - Keyloc is always standard as we don't care about shift/alt + IggyMakeEventKey( &keyEvent, pressed?IGGY_KEYEVENT_Down:IGGY_KEYEVENT_Up, (IggyKeycode)iggyKeyCode, IGGY_KEYLOC_Standard ); + + IggyEventResult result; + IggyPlayerDispatchEventRS ( swf , &keyEvent , &result ); +} + +int UIScene::convertGameActionToIggyKeycode(int action) +{ + // TODO: This action to key mapping should probably use the control mapping + int keycode = -1; + switch(action) + { +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + case ACTION_MENU_A: + keycode = IGGY_KEYCODE_ENTER; + break; + case ACTION_MENU_B: + keycode = IGGY_KEYCODE_ESCAPE; + break; + case ACTION_MENU_X: + keycode = IGGY_KEYCODE_F1; + break; + case ACTION_MENU_Y: + keycode = IGGY_KEYCODE_F2; + break; + case ACTION_MENU_OK: + keycode = IGGY_KEYCODE_ENTER; + break; + case ACTION_MENU_CANCEL: + keycode = IGGY_KEYCODE_ESCAPE; + break; + case ACTION_MENU_UP: + keycode = IGGY_KEYCODE_UP; + break; + case ACTION_MENU_DOWN: + keycode = IGGY_KEYCODE_DOWN; + break; + case ACTION_MENU_RIGHT: + keycode = IGGY_KEYCODE_RIGHT; + break; + case ACTION_MENU_LEFT: + keycode = IGGY_KEYCODE_LEFT; + break; + case ACTION_MENU_PAGEUP: + keycode = IGGY_KEYCODE_PAGE_UP; + break; + case ACTION_MENU_PAGEDOWN: +#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; + break; + case ACTION_MENU_LEFT_SCROLL: + keycode = IGGY_KEYCODE_F4; + break; + 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; + break; + case ACTION_MENU_OTHER_STICK_DOWN: + keycode = IGGY_KEYCODE_F12; + break; + case ACTION_MENU_OTHER_STICK_LEFT: + break; + case ACTION_MENU_OTHER_STICK_RIGHT: + break; + }; + + return keycode; +} + +bool UIScene::allowRepeat(int key) +{ + // 4J-PB - ignore repeats of action ABXY buttons + // fix for PS3 213 - [MAIN MENU] Holding down buttons will continue to activate every prompt. + switch(key) + { + case ACTION_MENU_OK: + case ACTION_MENU_CANCEL: + case ACTION_MENU_A: + case ACTION_MENU_B: + case ACTION_MENU_X: + case ACTION_MENU_Y: + return false; + } + return true; +} + +void UIScene::externalCallback(IggyExternalFunctionCallUTF16 * call) +{ + if(wcscmp((wchar_t *)call->function_name.string,L"handlePress")==0) + { + if(call->num_arguments != 2) + { + app.DebugPrintf("Callback for handlePress did not have the correct number of arguments\n"); +#ifndef _CONTENT_PACKAGE + __debugbreak(); +#endif + return; + } + if(call->arguments[0].type != IGGY_DATATYPE_number || call->arguments[1].type != IGGY_DATATYPE_number) + { + app.DebugPrintf("Arguments for handlePress were not of the correct type\n"); +#ifndef _CONTENT_PACKAGE + __debugbreak(); +#endif + return; + } + handlePress(call->arguments[0].number, call->arguments[1].number); + } + else if(wcscmp((wchar_t *)call->function_name.string,L"handleFocusChange")==0) + { + if(call->num_arguments != 2) + { + app.DebugPrintf("Callback for handleFocusChange did not have the correct number of arguments\n"); +#ifndef _CONTENT_PACKAGE + __debugbreak(); +#endif + return; + } + if(call->arguments[0].type != IGGY_DATATYPE_number || call->arguments[1].type != IGGY_DATATYPE_number) + { + app.DebugPrintf("Arguments for handleFocusChange were not of the correct type\n"); +#ifndef _CONTENT_PACKAGE + __debugbreak(); +#endif + return; + } + _handleFocusChange(call->arguments[0].number, call->arguments[1].number); + } + else if(wcscmp((wchar_t *)call->function_name.string,L"handleInitFocus")==0) + { + if(call->num_arguments != 2) + { + app.DebugPrintf("Callback for handleInitFocus did not have the correct number of arguments\n"); +#ifndef _CONTENT_PACKAGE + __debugbreak(); +#endif + return; + } + if(call->arguments[0].type != IGGY_DATATYPE_number || call->arguments[1].type != IGGY_DATATYPE_number) + { + app.DebugPrintf("Arguments for handleInitFocus were not of the correct type\n"); +#ifndef _CONTENT_PACKAGE + __debugbreak(); +#endif + return; + } + _handleInitFocus(call->arguments[0].number, call->arguments[1].number); + } + else if(wcscmp((wchar_t *)call->function_name.string,L"handleCheckboxToggled")==0) + { + if(call->num_arguments != 2) + { + app.DebugPrintf("Callback for handleCheckboxToggled did not have the correct number of arguments\n"); +#ifndef _CONTENT_PACKAGE + __debugbreak(); +#endif + return; + } + if(call->arguments[0].type != IGGY_DATATYPE_number || call->arguments[1].type != IGGY_DATATYPE_boolean) + { + app.DebugPrintf("Arguments for handleCheckboxToggled were not of the correct type\n"); +#ifndef _CONTENT_PACKAGE + __debugbreak(); +#endif + return; + } + handleCheckboxToggled(call->arguments[0].number, call->arguments[1].boolval); + } + else if(wcscmp((wchar_t *)call->function_name.string,L"handleSliderMove")==0) + { + if(call->num_arguments != 2) + { + app.DebugPrintf("Callback for handleSliderMove did not have the correct number of arguments\n"); +#ifndef _CONTENT_PACKAGE + __debugbreak(); +#endif + return; + } + if(call->arguments[0].type != IGGY_DATATYPE_number || call->arguments[1].type != IGGY_DATATYPE_number) + { + app.DebugPrintf("Arguments for handleSliderMove were not of the correct type\n"); +#ifndef _CONTENT_PACKAGE + __debugbreak(); +#endif + return; + } + handleSliderMove(call->arguments[0].number, call->arguments[1].number); + } + else if(wcscmp((wchar_t *)call->function_name.string,L"handleAnimationEnd")==0) + { + if(call->num_arguments != 0) + { + app.DebugPrintf("Callback for handleAnimationEnd did not have the correct number of arguments\n"); +#ifndef _CONTENT_PACKAGE + __debugbreak(); +#endif + return; + } + handleAnimationEnd(); + } + else if(wcscmp((wchar_t *)call->function_name.string,L"handleSelectionChanged")==0) + { + if(call->num_arguments != 1) + { + app.DebugPrintf("Callback for handleSelectionChanged did not have the correct number of arguments\n"); +#ifndef _CONTENT_PACKAGE + __debugbreak(); +#endif + return; + } + if(call->arguments[0].type != IGGY_DATATYPE_number) + { + app.DebugPrintf("Arguments for handleSelectionChanged were not of the correct type\n"); +#ifndef _CONTENT_PACKAGE + __debugbreak(); +#endif + return; + } + handleSelectionChanged(call->arguments[0].number); + } + else if(wcscmp((wchar_t *)call->function_name.string,L"handleRequestMoreData")==0) + { + if(call->num_arguments == 0) + { + handleRequestMoreData(0,false); + } + else + { + if(call->num_arguments != 2) + { + app.DebugPrintf("Callback for handleRequestMoreData did not have the correct number of arguments\n"); +#ifndef _CONTENT_PACKAGE + __debugbreak(); +#endif + return; + } + if(call->arguments[0].type != IGGY_DATATYPE_number || call->arguments[1].type != IGGY_DATATYPE_boolean) + { + app.DebugPrintf("Arguments for handleRequestMoreData were not of the correct type\n"); +#ifndef _CONTENT_PACKAGE + __debugbreak(); +#endif + return; + } + handleRequestMoreData(call->arguments[0].number, call->arguments[1].boolval); + } + } + else if(wcscmp((wchar_t *)call->function_name.string,L"handleTouchBoxRebuild")==0) + { + handleTouchBoxRebuild(); + } + else + { + app.DebugPrintf("Unhandled callback: %s\n", call->function_name.string); + } +} + +void UIScene::registerSubstitutionTexture(const wstring &textureName, PBYTE pbData, DWORD dwLength, bool deleteData) +{ + m_registeredTextures[textureName] = deleteData;; + ui.registerSubstitutionTexture(textureName, pbData, dwLength); +} + +bool UIScene::hasRegisteredSubstitutionTexture(const wstring &textureName) +{ + AUTO_VAR(it, m_registeredTextures.find( textureName ) ); + + return it != m_registeredTextures.end(); +} + +void UIScene::_handleFocusChange(F64 controlId, F64 childId) +{ + m_iFocusControl = (int)controlId; + m_iFocusChild = (int)childId; + + handleFocusChange(controlId, childId); + ui.PlayUISFX(eSFX_Focus); +} + +void UIScene::_handleInitFocus(F64 controlId, F64 childId) +{ + m_iFocusControl = (int)controlId; + m_iFocusChild = (int)childId; + + //handleInitFocus(controlId, childId); + handleFocusChange(controlId, childId); +} + +bool UIScene::controlHasFocus(int iControlId) +{ + return m_iFocusControl == iControlId; +} + +bool UIScene::controlHasFocus(UIControl_Base *control) +{ + return controlHasFocus( control->getId() ); +} + +int UIScene::getControlChildFocus() +{ + return m_iFocusChild; +} + +int UIScene::getControlFocus() +{ + return m_iFocusControl; +} + +void UIScene::setBackScene(UIScene *scene) +{ + m_backScene = scene; +} + +UIScene *UIScene::getBackScene() +{ + return m_backScene; +} +#ifdef __PSVITA__ +void UIScene::UpdateSceneControls() +{ + AUTO_VAR(itEnd, GetControls()->end()); + for (AUTO_VAR(it, GetControls()->begin()); it != itEnd; it++) + { + UIControl *control=(UIControl *)*it; + control->UpdateControl(); + } +} +#endif + +void UIScene::HandleMessage(EUIMessage message, void *data) +{ +} + +size_t UIScene::GetCallbackUniqueId() +{ + if( m_callbackUniqueId == 0) + { + m_callbackUniqueId = ui.RegisterForCallbackId(this); + } + return m_callbackUniqueId; +} + +bool UIScene::isReadyToDelete() +{ + return true; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene.h b/Minecraft.Client/Common/UI/UIScene.h new file mode 100644 index 00000000..8c20aaae --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene.h @@ -0,0 +1,277 @@ +#pragma once +// 4J-PB - remove the inherits via dominance warnings +#pragma warning( disable : 4250 ) +using namespace std; +// A scene map directly to an Iggy movie (or more accurately a collection of different sized movies) + +#include "UIEnums.h" +#include "UIControl_Base.h" + +class ItemRenderer; +class UILayer; + +// 4J Stu - Setup some defines for quickly mapping elements in the scene + +#define UI_BEGIN_MAP_ELEMENTS_AND_NAMES(parentClass) \ + virtual bool mapElementsAndNames() \ + { \ + parentClass::mapElementsAndNames(); \ + IggyValuePath *currentRoot = IggyPlayerRootPath ( getMovie() ); + +#define UI_END_MAP_ELEMENTS_AND_NAMES() \ + return true; \ + } + +#define UI_MAP_ELEMENT( var, name) \ + { var.setupControl(this, currentRoot , name ); m_controls.push_back(&var); } + +#define UI_BEGIN_MAP_CHILD_ELEMENTS( parent ) \ + { \ + IggyValuePath *lastRoot = currentRoot; \ + currentRoot = parent.getIggyValuePath(); + +#define UI_END_MAP_CHILD_ELEMENTS() \ + currentRoot = lastRoot; \ + } + +#define UI_MAP_NAME( var, name ) \ + { var = registerFastName(name); } + +class UIScene +{ + friend class UILayer; +public: + IggyValuePath *m_rootPath; + +private: + Iggy *swf; + IggyName m_funcRemoveObject, m_funcSlideLeft, m_funcSlideRight, m_funcSetSafeZone, m_funcSetFocus, m_funcHorizontalResizeCheck; + IggyName m_funcSetAlpha; + + ItemRenderer *m_pItemRenderer; + unordered_map m_fastNames; + unordered_map m_registeredTextures; + + typedef struct _TimerInfo + { + int duration; + int targetTime; + bool running; + } TimerInfo; + unordered_map m_timers; + + int m_iFocusControl, m_iFocusChild; + float m_lastOpacity; + bool m_bUpdateOpacity; + bool m_bVisible; + bool m_bCanHandleInput; + UIScene *m_backScene; + + size_t m_callbackUniqueId; + +public: + enum ESceneResolution + { + eSceneResolution_1080, + eSceneResolution_720, + eSceneResolution_480, + eSceneResolution_Vita, + }; + +protected: + ESceneResolution m_loadedResolution; + + bool m_bIsReloading; + bool m_bFocussedOnce; + + int m_movieWidth, m_movieHeight; + int m_renderWidth, m_renderHeight; + vector m_controls; + +protected: + UILayer *m_parentLayer; + bool bHasFocus; + int m_iPad; + bool m_hasTickedOnce; + +public: + virtual Iggy *getMovie() { return swf; } + + void destroyMovie(); + virtual void reloadMovie(bool force = false); + virtual bool needsReloaded(); + virtual bool hasMovie(); + virtual void updateSafeZone(); + + int getRenderWidth() { return m_renderWidth; } + int getRenderHeight() { return m_renderHeight; } + +#ifdef __PSVITA__ + UILayer *GetParentLayer() {return m_parentLayer;} + EUIGroup GetParentLayerGroup() {return m_parentLayer->m_parentGroup->GetGroup();} + vector *GetControls() {return &m_controls;} +#endif + +protected: + virtual F64 getSafeZoneHalfHeight(); + virtual F64 getSafeZoneHalfWidth(); + void setSafeZone(S32 top, S32 bottom, S32 left, S32 right); + void doHorizontalResizeCheck(); + virtual wstring getMoviePath() = 0; + + virtual bool mapElementsAndNames(); + void initialiseMovie(); + void loadMovie(); + +private: + void getDebugMemoryUseRecursive(const wstring &moviePath, IggyMemoryUseInfo &memoryInfo); + +public: + void PrintTotalMemoryUsage(__int64 &totalStatic, __int64 &totalDynamic); + +public: + UIScene(int iPad, UILayer *parentLayer); + virtual ~UIScene(); + + virtual EUIScene getSceneType() = 0; + ESceneResolution getSceneResolution() { return m_loadedResolution; } + + virtual void tick(); + + IggyName registerFastName(const wstring &name); +#ifdef __PSVITA__ + void SetFocusToElement(int iID); + void UpdateSceneControls(); +#endif +protected: + void addTimer(int id, int ms); + void killTimer(int id); + void tickTimers(); + TimerInfo* getTimer(int id) { return &m_timers[id]; } + virtual void handleTimerComplete(int id) {} + +public: + // FOCUS + // Returns true if this scene handles input + virtual bool stealsFocus() { return true; } + + // Returns true if this scene has focus for the pad passed in + virtual bool hasFocus(int iPad) { return bHasFocus && iPad == m_iPad; } + + void gainFocus(); + void loseFocus(); + + virtual void updateTooltips(); + virtual void updateComponents() {} + virtual void handleGainFocus(bool navBack); + virtual void handleLoseFocus() {} + + // Returns true if lower scenes in this scenes layer, or in any layer below this scenes layers should be hidden + virtual bool hidesLowerScenes() { return m_hasTickedOnce; } + + // Returns 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(); + + void removeControl( UIControl_Base *control, bool centreScene); + void slideLeft(); + void slideRight(); + + // RENDERING + virtual void render(S32 width, S32 height, C4JRender::eViewportType viewpBort); + + virtual void customDraw(IggyCustomDrawCallbackRegion *region); + + void setOpacity(float percent); + void setVisible(bool visible); + bool isVisible() { return m_bVisible; } + +protected: + //void customDrawSlotControl(IggyCustomDrawCallbackRegion *region, int iPad, int iID, int iCount, int iAuxVal, float fAlpha, bool isFoil, bool bDecorations); + void customDrawSlotControl(IggyCustomDrawCallbackRegion *region, int iPad, shared_ptr item, float fAlpha, bool isFoil, bool bDecorations); + + bool m_cacheSlotRenders; + bool m_needsCacheRendered; + int m_expectedCachedSlotCount; +private: + typedef struct _CachedSlotDrawData + { + CustomDrawData *customDrawRegion; + shared_ptr item; + float fAlpha; + bool isFoil; + bool bDecorations; + } CachedSlotDrawData; + vector m_cachedSlotDraw; + + void _customDrawSlotControl(CustomDrawData *region, int iPad, shared_ptr item, float fAlpha, bool isFoil, bool bDecorations, bool usingCommandBuffer); + +public: + // INPUT + bool canHandleInput() { return m_bCanHandleInput; } + virtual bool allowRepeat(int key); + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) {} + void externalCallback(IggyExternalFunctionCallUTF16 * call); + + virtual void handleDestroy() {} +protected: + void sendInputToMovie(int key, bool repeat, bool pressed, bool released); + virtual void handlePreReload() {} + virtual void handleReload() {} + virtual void handlePress(F64 controlId, F64 childId) {} + virtual void handleFocusChange(F64 controlId, F64 childId) {} + virtual void handleInitFocus(F64 controlId, F64 childId) {} + virtual void handleCheckboxToggled(F64 controlId, bool selected) {} + virtual void handleSliderMove(F64 sliderId, F64 currentValue) {} + virtual void handleAnimationEnd() {} + virtual void handleSelectionChanged(F64 selectedId) {} + virtual void handleRequestMoreData(F64 startIndex, bool up) {} + virtual void handleTouchBoxRebuild() {} +private: + void _handleFocusChange(F64 controlId, F64 childId); + void _handleInitFocus(F64 controlId, F64 childId); + + int convertGameActionToIggyKeycode(int action); + +public: + bool controlHasFocus(int iControlId); + bool controlHasFocus(UIControl_Base *control); + int getControlFocus(); + int getControlChildFocus(); + + // NAVIGATION +protected: + //void navigateForward(int iPad, EUIScene scene, void *initData = NULL); + void navigateBack(); + +public: + void setBackScene(UIScene *scene); + UIScene *getBackScene(); + virtual void HandleDLCMountingComplete() {} + virtual void HandleDLCInstalled() {} +#ifdef _XBOX_ONE + virtual void HandleDLCLicenseChange() {} +#endif + + virtual void HandleMessage(EUIMessage message, void *data); + + void registerSubstitutionTexture(const wstring &textureName, PBYTE pbData, DWORD dwLength, bool deleteData = false); + bool hasRegisteredSubstitutionTexture(const wstring &textureName); + + virtual void handleUnlockFullVersion() {} + + virtual void handleTouchInput(unsigned int iPad, S32 x, S32 y, int iId, bool bPressed, bool bRepeat, bool bReleased) {} + + +protected: + +#ifdef _DURANGO + virtual long long getDefaultGtcButtons() { return _360_GTC_BACK; } +#endif + + size_t GetCallbackUniqueId(); + + virtual bool isReadyToDelete(); +}; diff --git a/Minecraft.Client/Common/UI/UIScene_AbstractContainerMenu.cpp b/Minecraft.Client/Common/UI/UIScene_AbstractContainerMenu.cpp new file mode 100644 index 00000000..f0b7e54c --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_AbstractContainerMenu.cpp @@ -0,0 +1,320 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_AbstractContainerMenu.h" + +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.h" +#include "..\..\MultiplayerLocalPlayer.h" + +UIScene_AbstractContainerMenu::UIScene_AbstractContainerMenu(int iPad, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + m_focusSection = eSectionNone; + // in this scene, we override the press sound with our own for crafting success or fail + ui.OverrideSFX(m_iPad,ACTION_MENU_A,true); + ui.OverrideSFX(m_iPad,ACTION_MENU_OK,true); +#ifdef __ORBIS__ + ui.OverrideSFX(m_iPad,ACTION_MENU_TOUCHPAD_PRESS,true); +#endif + ui.OverrideSFX(m_iPad,ACTION_MENU_X,true); + ui.OverrideSFX(m_iPad,ACTION_MENU_Y,true); + ui.OverrideSFX(m_iPad,ACTION_MENU_LEFT_SCROLL,true); + ui.OverrideSFX(m_iPad,ACTION_MENU_RIGHT_SCROLL,true); + ui.OverrideSFX(m_iPad,ACTION_MENU_LEFT,true); + ui.OverrideSFX(m_iPad,ACTION_MENU_RIGHT,true); + ui.OverrideSFX(m_iPad,ACTION_MENU_UP,true); + ui.OverrideSFX(m_iPad,ACTION_MENU_DOWN,true); + + m_bIgnoreInput=false; +} + +UIScene_AbstractContainerMenu::~UIScene_AbstractContainerMenu() +{ + app.DebugPrintf("UIScene_AbstractContainerMenu::~UIScene_AbstractContainerMenu\n"); +} + +void UIScene_AbstractContainerMenu::handleDestroy() +{ + app.DebugPrintf("UIScene_AbstractContainerMenu::handleDestroy\n"); + Minecraft *pMinecraft = Minecraft::GetInstance(); + if( pMinecraft->localgameModes[m_iPad] != NULL ) + { + TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[m_iPad]; + if(gameMode != NULL) gameMode->getTutorial()->changeTutorialState(m_previousTutorialState); + } + + // 4J Stu - Fix for #11302 - TCR 001: Network Connectivity: Host crashed after being killed by the client while accessing a chest during burst packet loss. + // We need to make sure that we call closeContainer() anytime this menu is closed, even if it is forced to close by some other reason (like the player dying) + if(pMinecraft->localplayers[m_iPad] != NULL && pMinecraft->localplayers[m_iPad]->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); +#ifdef __ORBIS__ + ui.OverrideSFX(m_iPad,ACTION_MENU_TOUCHPAD_PRESS,false); +#endif + ui.OverrideSFX(m_iPad,ACTION_MENU_X,false); + ui.OverrideSFX(m_iPad,ACTION_MENU_Y,false); + ui.OverrideSFX(m_iPad,ACTION_MENU_LEFT_SCROLL,false); + ui.OverrideSFX(m_iPad,ACTION_MENU_RIGHT_SCROLL,false); + ui.OverrideSFX(m_iPad,ACTION_MENU_LEFT,false); + ui.OverrideSFX(m_iPad,ACTION_MENU_RIGHT,false); + ui.OverrideSFX(m_iPad,ACTION_MENU_UP,false); + ui.OverrideSFX(m_iPad,ACTION_MENU_DOWN,false); +} + +void UIScene_AbstractContainerMenu::InitDataAssociations(int iPad, AbstractContainerMenu *menu, int startIndex) +{ +} + +void UIScene_AbstractContainerMenu::PlatformInitialize(int iPad, int startIndex) +{ + + m_labelInventory.init( app.GetString(IDS_INVENTORY) ); + + if(startIndex >= 0) + { + m_slotListInventory.addSlots(startIndex, 27); + m_slotListHotbar.addSlots(startIndex + 27, 9); + } + + // Determine min and max extents for pointer, it needs to be able to move off the container to drop items. + float fPanelWidth, fPanelHeight; + float fPanelX, fPanelY; + float fPointerWidth, fPointerHeight; + + // We may have varying depths of controls here, so base off the pointers parent +#if TO_BE_IMPLEMENTED + HXUIOBJ parent; + XuiElementGetBounds( m_pointerControl->m_hObj, &fPointerWidth, &fPointerHeight ); +#else + fPointerWidth = 50; + fPointerHeight = 50; +#endif + + fPanelWidth = m_controlBackgroundPanel.getWidth(); + fPanelHeight = m_controlBackgroundPanel.getHeight(); + fPanelX = m_controlBackgroundPanel.getXPos(); + fPanelY = m_controlBackgroundPanel.getYPos(); + // Get size of pointer + m_fPointerImageOffsetX = 0; //floor(fPointerWidth/2.0f); + m_fPointerImageOffsetY = 0; //floor(fPointerHeight/2.0f); + + m_fPanelMinX = fPanelX; + m_fPanelMaxX = fPanelX + fPanelWidth; + m_fPanelMinY = fPanelY; + m_fPanelMaxY = fPanelY + fPanelHeight; + +#ifdef __ORBIS__ + // we need to map the touchpad rectangle to the UI rectangle. While it works great for the creative menu, it is much too sensitive for the smaller menus. + //X coordinate of the touch point (0 to 1919) + //Y coordinate of the touch point (0 to 941: DUALSHOCK4 wireless controllers and the CUH-ZCT1J/CAP-ZCT1J/CAP-ZCT1U controllers for the PlayStation4 development tool, + //0 to 753: JDX-1000x series controllers for the PlayStation4 development tool,) + m_fTouchPadMulX=fPanelWidth/1919.0f; + m_fTouchPadMulY=fPanelHeight/941.0f; + m_fTouchPadDeadZoneX=15.0f*m_fTouchPadMulX; + m_fTouchPadDeadZoneY=15.0f*m_fTouchPadMulY; + +#endif + + // 4J-PB - need to limit this in splitscreen + if(app.GetLocalPlayerCount()>1) + { + // don't let the pointer go into someone's screen + m_fPointerMinY = floor(fPointerHeight/2.0f); + } + else + { + m_fPointerMinY = fPanelY -fPointerHeight; + } + m_fPointerMinX = fPanelX - fPointerWidth; + m_fPointerMaxX = m_fPanelMaxX + fPointerWidth; + m_fPointerMaxY = m_fPanelMaxY + (fPointerHeight/2); + +// m_hPointerText=NULL; +// m_hPointerTextBkg=NULL; + + // Put the pointer over first item in use row to start with. + UIVec2D itemPos; + UIVec2D itemSize; + GetItemScreenData( m_eCurrSection, 0, &( itemPos ), &( itemSize ) ); + + UIVec2D sectionPos; + GetPositionOfSection( m_eCurrSection, &( sectionPos ) ); + + UIVec2D vPointerPos = sectionPos; + vPointerPos += itemPos; + vPointerPos.x += ( itemSize.x / 2.0f ); + vPointerPos.y += ( itemSize.y / 2.0f ); + + vPointerPos.x -= m_fPointerImageOffsetX; + vPointerPos.y -= m_fPointerImageOffsetY; + + //m_pointerControl->SetPosition( &vPointerPos ); + m_pointerPos = vPointerPos; + + IggyEvent mouseEvent; + S32 width, height; + m_parentLayer->getRenderDimensions(width, height); + S32 x = m_pointerPos.x*((float)width/m_movieWidth); + S32 y = m_pointerPos.y*((float)height/m_movieHeight); + IggyMakeEventMouseMove( &mouseEvent, x, y); + + IggyEventResult result; + IggyPlayerDispatchEventRS ( getMovie() , &mouseEvent , &result ); + +#ifdef USE_POINTER_ACCEL + m_fPointerVelX = 0.0f; + m_fPointerVelY = 0.0f; + m_fPointerAccelX = 0.0f; + m_fPointerAccelY = 0.0f; +#endif +} + +void UIScene_AbstractContainerMenu::tick() +{ + UIScene::tick(); + + onMouseTick(); + + IggyEvent mouseEvent; + S32 width, height; + m_parentLayer->getRenderDimensions(width, height); + S32 x = m_pointerPos.x*((float)width/m_movieWidth); + S32 y = m_pointerPos.y*((float)height/m_movieHeight); + IggyMakeEventMouseMove( &mouseEvent, x, y); + + // 4J Stu - This seems to be broken on Durango, so do it ourself +#ifdef _DURANGO + //mouseEvent.x = x; + //mouseEvent.y = y; +#endif + + IggyEventResult result; + IggyPlayerDispatchEventRS ( getMovie() , &mouseEvent , &result ); +} + +void UIScene_AbstractContainerMenu::render(S32 width, S32 height, C4JRender::eViewportType viewpBort) +{ + m_cacheSlotRenders = true; + + m_needsCacheRendered = m_needsCacheRendered || m_menu->needsRendered(); + + if(m_needsCacheRendered) + { + m_expectedCachedSlotCount = GetBaseSlotCount(); + unsigned int count = m_menu->getSize(); + for(unsigned int i = 0; i < count; ++i) + { + if(m_menu->getSlot(i)->hasItem()) + { + ++m_expectedCachedSlotCount; + } + } + } + + UIScene::render(width, height, viewpBort); + + m_needsCacheRendered = false; +} + +void UIScene_AbstractContainerMenu::customDraw(IggyCustomDrawCallbackRegion *region) +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + if(pMinecraft->localplayers[m_iPad] == NULL || pMinecraft->localgameModes[m_iPad] == NULL) return; + + shared_ptr item = nullptr; + int slotId = -1; + if(wcscmp((wchar_t *)region->name,L"pointerIcon")==0) + { + m_cacheSlotRenders = false; + item = pMinecraft->localplayers[m_iPad]->inventory->getCarried(); + } + else + { + swscanf((wchar_t*)region->name,L"slot_%d",&slotId); + if (slotId == -1) + { + app.DebugPrintf("This is not the control we are looking for\n"); + } + else + { + m_cacheSlotRenders = true; + Slot *slot = m_menu->getSlot(slotId); + item = slot->getItem(); + } + } + + if(item != NULL) customDrawSlotControl(region,m_iPad,item,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) +{ + if(m_bIgnoreInput) return; + + //app.DebugPrintf("UIScene_InventoryMenu handling input for pad %d, key %d, down- %s, pressed- %s, released- %s\n", iPad, key, down?"TRUE":"FALSE", pressed?"TRUE":"FALSE", released?"TRUE":"FALSE"); + ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); + + if(pressed) + { + handled = handleKeyDown(m_iPad, key, repeat); + } +} + +void UIScene_AbstractContainerMenu::SetPointerText(vector *description, bool 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); + // 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); + } + + m_focusSection = eSection; +} + +void UIScene_AbstractContainerMenu::setFocusToPointer(int iPad) +{ + if(m_focusSection != eSectionNone) + { + UIControl *currentFocus = getSection(m_focusSection); + if(currentFocus) currentFocus->setFocus(false); + } + m_focusSection = eSectionNone; +} + +shared_ptr UIScene_AbstractContainerMenu::getSlotItem(ESceneSection eSection, int iSlot) +{ + Slot *slot = m_menu->getSlot( getSectionStartOffset(eSection) + iSlot ); + if(slot) return slot->getItem(); + else return nullptr; +} + +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 ); + if(slot) return !slot->hasItem(); + else return false; +} + +void UIScene_AbstractContainerMenu::adjustPointerForSafeZone() +{ + // Handled by AS +} diff --git a/Minecraft.Client/Common/UI/UIScene_AbstractContainerMenu.h b/Minecraft.Client/Common/UI/UIScene_AbstractContainerMenu.h new file mode 100644 index 00000000..5f313a0e --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_AbstractContainerMenu.h @@ -0,0 +1,68 @@ +#pragma once + +#include "UIScene.h" +#include "IUIScene_AbstractContainerMenu.h" + +class AbstractContainerMenu; + +class UIScene_AbstractContainerMenu : public UIScene, public virtual IUIScene_AbstractContainerMenu +{ +private: + ESceneSection m_focusSection; + bool m_bIgnoreInput; + +protected: + UIControl m_controlMainPanel; + UIControl_SlotList m_slotListHotbar, m_slotListInventory; + UIControl_Cursor m_cursorPath; + UIControl_Label m_labelInventory, m_labelBrewingStand; + UIControl m_controlBackgroundPanel; + + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_controlMainPanel, "MainPanel" ) + UI_BEGIN_MAP_CHILD_ELEMENTS( m_controlMainPanel ) + UI_MAP_ELEMENT( m_controlBackgroundPanel, "BackgroundPanel" ) + UI_MAP_ELEMENT( m_slotListHotbar, "hotbarList") + UI_MAP_ELEMENT( m_slotListInventory, "inventoryList") + UI_MAP_ELEMENT( m_cursorPath, "cursor") + UI_MAP_ELEMENT( m_labelInventory, "inventoryLabel") + UI_END_MAP_CHILD_ELEMENTS() + UI_END_MAP_ELEMENTS_AND_NAMES() + +public: + UIScene_AbstractContainerMenu(int iPad, UILayer *parentLayer); + ~UIScene_AbstractContainerMenu(); + + virtual void handleDestroy(); + + int getPad() { return m_iPad; } + bool getIgnoreInput() { return m_bIgnoreInput; } + void setIgnoreInput(bool bVal) { m_bIgnoreInput=bVal; } + +protected: + virtual void PlatformInitialize(int iPad, int startIndex); + virtual void InitDataAssociations(int iPad, AbstractContainerMenu *menu, int startIndex = 0); + virtual bool doesSectionTreeHaveFocus(ESceneSection eSection) { return false; } + virtual void setSectionFocus(ESceneSection eSection, int iPad); + void setFocusToPointer(int iPad); + void SetPointerText(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); + + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); +}; diff --git a/Minecraft.Client/Common/UI/UIScene_AnvilMenu.cpp b/Minecraft.Client/Common/UI/UIScene_AnvilMenu.cpp new file mode 100644 index 00000000..c810ad45 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_AnvilMenu.cpp @@ -0,0 +1,400 @@ +#include "stdafx.h" +#include "UI.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.tile.entity.h" +#include "MultiPlayerLocalPlayer.h" +#include "..\..\Minecraft.h" +#include "UIScene_AnvilMenu.h" + +UIScene_AnvilMenu::UIScene_AnvilMenu(int iPad, void *_initData, UILayer *parentLayer) : UIScene_AbstractContainerMenu(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + m_showingCross = false; + m_textInputAnvil.init(m_itemName,eControl_TextInput); + + m_labelAnvil.init( app.GetString(IDS_REPAIR_AND_NAME) ); + + AnvilScreenInput *initData = (AnvilScreenInput *)_initData; + m_inventory = initData->inventory; + + Minecraft *pMinecraft = Minecraft::GetInstance(); + if( pMinecraft->localgameModes[iPad] != NULL ) + { + TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[iPad]; + m_previousTutorialState = gameMode->getTutorial()->getCurrentState(); + gameMode->getTutorial()->changeTutorialState(e_Tutorial_State_Anvil_Menu, this); + } + + m_repairMenu = new AnvilMenu( initData->inventory, initData->level, initData->x, initData->y, initData->z, pMinecraft->localplayers[iPad] ); + m_repairMenu->addSlotListener(this); + + Initialize( iPad, m_repairMenu, true, AnvilMenu::INV_SLOT_START, eSectionAnvilUsing, eSectionAnvilMax ); + + 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""; + + if(m_repairMenu->cost > 0) + { + if(m_repairMenu->cost >= 40 && !pMinecraft->localplayers[iPad]->abilities.instabuild) + { + m_costString = app.GetString(IDS_REPAIR_EXPENSIVE); + expensive = true; + } + else if(!m_repairMenu->getSlot(AnvilMenu::RESULT_SLOT)->hasItem()) + { + // Do nothing + } + else + { + LPCWSTR costString = app.GetString(IDS_REPAIR_COST); + wchar_t temp[256]; + swprintf(temp, 256, costString, m_repairMenu->cost); + m_costString = temp; + if(!m_repairMenu->getSlot(AnvilMenu::RESULT_SLOT)->mayPickup(dynamic_pointer_cast(m_inventory->player->shared_from_this()))) + { + expensive = true; + } + } + } + setCostLabel(m_costString, expensive); + + if(initData) delete initData; + + setIgnoreInput(false); + + app.SetRichPresenceContext(iPad, CONTEXT_GAME_STATE_ANVIL); +} + +wstring UIScene_AnvilMenu::getMoviePath() +{ + if(app.GetLocalPlayerCount() > 1) + { + return L"AnvilMenuSplit"; + } + else + { + return L"AnvilMenu"; + } +} + +void UIScene_AnvilMenu::handleReload() +{ + Initialize( m_iPad, m_menu, true, AnvilMenu::INV_SLOT_START, eSectionAnvilUsing, eSectionAnvilMax ); + + 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() +{ + UIScene_AbstractContainerMenu::tick(); + + handleTick(); +} + +int UIScene_AnvilMenu::getSectionColumns(ESceneSection eSection) +{ + int cols = 0; + switch( eSection ) + { + case eSectionAnvilItem1: + cols = 1; + break; + case eSectionAnvilItem2: + cols = 1; + break; + case eSectionAnvilResult: + cols = 1; + break; + case eSectionAnvilInventory: + cols = 9; + break; + case eSectionAnvilUsing: + cols = 9; + break; + default: + assert( false ); + break; + } + return cols; +} + +int UIScene_AnvilMenu::getSectionRows(ESceneSection eSection) +{ + int rows = 0; + switch( eSection ) + { + case eSectionAnvilItem1: + rows = 1; + break; + case eSectionAnvilItem2: + rows = 1; + break; + case eSectionAnvilResult: + rows = 1; + break; + case eSectionAnvilInventory: + rows = 3; + break; + case eSectionAnvilUsing: + rows = 1; + break; + default: + assert( false ); + break; + } + return rows; +} + +void UIScene_AnvilMenu::GetPositionOfSection( ESceneSection eSection, UIVec2D* pPosition ) +{ + switch( eSection ) + { + case eSectionAnvilItem1: + pPosition->x = m_slotListItem1.getXPos(); + pPosition->y = m_slotListItem1.getYPos(); + break; + case eSectionAnvilItem2: + pPosition->x = m_slotListItem2.getXPos(); + pPosition->y = m_slotListItem2.getYPos(); + break; + case eSectionAnvilResult: + pPosition->x = m_slotListResult.getXPos(); + pPosition->y = m_slotListResult.getYPos(); + break; + case eSectionAnvilName: + pPosition->x = m_textInputAnvil.getXPos(); + pPosition->y = m_textInputAnvil.getYPos(); + break; + case eSectionAnvilInventory: + pPosition->x = m_slotListInventory.getXPos(); + pPosition->y = m_slotListInventory.getYPos(); + break; + case eSectionAnvilUsing: + pPosition->x = m_slotListHotbar.getXPos(); + pPosition->y = m_slotListHotbar.getYPos(); + break; + default: + assert( false ); + break; + } +} + +void UIScene_AnvilMenu::GetItemScreenData( ESceneSection eSection, int iItemIndex, UIVec2D* pPosition, UIVec2D* pSize ) +{ + UIVec2D sectionSize; + + switch( eSection ) + { + case eSectionAnvilItem1: + sectionSize.x = m_slotListItem1.getWidth(); + sectionSize.y = m_slotListItem1.getHeight(); + break; + case eSectionAnvilItem2: + sectionSize.x = m_slotListItem2.getWidth(); + sectionSize.y = m_slotListItem2.getHeight(); + break; + case eSectionAnvilResult: + sectionSize.x = m_slotListResult.getWidth(); + sectionSize.y = m_slotListResult.getHeight(); + break; + case eSectionAnvilName: + sectionSize.x = m_textInputAnvil.getWidth(); + sectionSize.y = m_textInputAnvil.getHeight(); + break; + case eSectionAnvilInventory: + sectionSize.x = m_slotListInventory.getWidth(); + sectionSize.y = m_slotListInventory.getHeight(); + break; + case eSectionAnvilUsing: + sectionSize.x = m_slotListHotbar.getWidth(); + sectionSize.y = m_slotListHotbar.getHeight(); + break; + default: + assert( false ); + break; + } + + if(IsSectionSlotList(eSection)) + { + int rows = getSectionRows(eSection); + int cols = getSectionColumns(eSection); + + pSize->x = sectionSize.x/cols; + pSize->y = sectionSize.y/rows; + + int itemCol = iItemIndex % cols; + int itemRow = iItemIndex/cols; + + pPosition->x = itemCol * pSize->x; + pPosition->y = itemRow * pSize->y; + } + else + { + GetPositionOfSection(eSection, pPosition); + pSize->x = sectionSize.x; + pSize->y = sectionSize.y; + } +} + +void UIScene_AnvilMenu::setSectionSelectedSlot(ESceneSection eSection, int x, int y) +{ + int cols = getSectionColumns(eSection); + + int index = (y * cols) + x; + + UIControl_SlotList *slotList = NULL; + switch( eSection ) + { + case eSectionAnvilItem1: + slotList = &m_slotListItem1; + break; + case eSectionAnvilItem2: + slotList = &m_slotListItem2; + break; + case eSectionAnvilResult: + slotList = &m_slotListResult; + break; + case eSectionAnvilInventory: + slotList = &m_slotListInventory; + break; + case eSectionAnvilUsing: + slotList = &m_slotListHotbar; + break; + default: + assert( false ); + break; + } + + slotList->setHighlightSlot(index); +} + +UIControl *UIScene_AnvilMenu::getSection(ESceneSection eSection) +{ + UIControl *control = NULL; + switch( eSection ) + { + case eSectionAnvilItem1: + control = &m_slotListItem1; + break; + case eSectionAnvilItem2: + control = &m_slotListItem2; + break; + case eSectionAnvilResult: + control = &m_slotListResult; + break; + case eSectionAnvilName: + control = &m_textInputAnvil; + break; + case eSectionAnvilInventory: + control = &m_slotListInventory; + break; + case eSectionAnvilUsing: + control = &m_slotListHotbar; + break; + default: + assert( false ); + break; + } + return control; +} + +int UIScene_AnvilMenu::KeyboardCompleteCallback(LPVOID lpParam,bool bRes) +{ + // 4J HEG - No reason to set value if keyboard was cancelled + UIScene_AnvilMenu *pClass=(UIScene_AnvilMenu *)lpParam; + pClass->setIgnoreInput(false); + + if (bRes) + { + uint16_t pchText[128]; + ZeroMemory(pchText, 128 * sizeof(uint16_t) ); + InputManager.GetText(pchText); + pClass->setEditNameValue((wchar_t *)pchText); + pClass->m_itemName = (wchar_t *)pchText; + pClass->updateItemName(); + } + return 0; +} + +void UIScene_AnvilMenu::handleEditNamePressed() +{ + setIgnoreInput(true); +#if defined(__PS3__) || defined(__ORBIS__) || defined __PSVITA__ + int language = XGetLanguage(); + switch(language) + { + case XC_LANGUAGE_JAPANESE: + case XC_LANGUAGE_KOREAN: + case XC_LANGUAGE_TCHINESE: + InputManager.RequestKeyboard(app.GetString(IDS_TITLE_RENAME),m_textInputAnvil.getLabel(),(DWORD)m_iPad,30,&UIScene_AnvilMenu::KeyboardCompleteCallback,this,C_4JInput::EKeyboardMode_Default); + break; + default: + // 4J Stu - Use a different keyboard for non-asian languages so we don't have prediction on + InputManager.RequestKeyboard(app.GetString(IDS_TITLE_RENAME),m_textInputAnvil.getLabel(),(DWORD)m_iPad,30,&UIScene_AnvilMenu::KeyboardCompleteCallback,this,C_4JInput::EKeyboardMode_Alphabet_Extended); + break; + } +#else + InputManager.RequestKeyboard(app.GetString(IDS_TITLE_RENAME),m_textInputAnvil.getLabel(),(DWORD)m_iPad,30,&UIScene_AnvilMenu::KeyboardCompleteCallback,this,C_4JInput::EKeyboardMode_Default); +#endif +} + +void UIScene_AnvilMenu::setEditNameValue(const wstring &name) +{ + m_textInputAnvil.setLabel(name); +} + +void UIScene_AnvilMenu::setEditNameEditable(bool enabled) +{ +} + +void UIScene_AnvilMenu::setCostLabel(const wstring &label, bool canAfford) +{ + IggyDataValue result; + IggyDataValue value[2]; + + IggyStringUTF16 stringVal; + stringVal.string = (IggyUTF16*)label.c_str(); + stringVal.length = label.length(); + value[0].type = IGGY_DATATYPE_string_UTF16; + value[0].string16 = stringVal; + + value[1].type = IGGY_DATATYPE_boolean; + value[1].boolval = canAfford; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetCostLabel , 2 , value ); +} + +void UIScene_AnvilMenu::showCross(bool show) +{ + if(m_showingCross != show) + { + IggyDataValue result; + IggyDataValue value[1]; + + value[0].type = IGGY_DATATYPE_boolean; + value[0].boolval = show; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcShowRedCross , 1 , value ); + + m_showingCross = show; + } +} + +void UIScene_AnvilMenu::handleDestroy() +{ +#ifdef __PSVITA__ + app.DebugPrintf("missing InputManager.DestroyKeyboard on Vita !!!!!!\n"); +#endif + + // another player destroyed the anvil, so shut down the keyboard if it is displayed +#if ( defined __PS3__ || defined __ORBIS__ || defined _DURANGO) + InputManager.DestroyKeyboard(); +#endif + UIScene_AbstractContainerMenu::handleDestroy(); +} diff --git a/Minecraft.Client/Common/UI/UIScene_AnvilMenu.h b/Minecraft.Client/Common/UI/UIScene_AnvilMenu.h new file mode 100644 index 00000000..3afc6333 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_AnvilMenu.h @@ -0,0 +1,66 @@ +#pragma once + +#include "UIScene_AbstractContainerMenu.h" +#include "IUIScene_AnvilMenu.h" +#include "..\Minecraft.World\MerchantMenu.h" + +class InventoryMenu; + +class UIScene_AnvilMenu : public UIScene_AbstractContainerMenu, public IUIScene_AnvilMenu +{ +private: + bool m_showingCross; + + enum EControls + { + eControl_TextInput, + }; + +public: + UIScene_AnvilMenu(int iPad, void *initData, UILayer *parentLayer); + + virtual EUIScene getSceneType() { return eUIScene_AnvilMenu;} + +protected: + UIControl_SlotList m_slotListItem1, m_slotListItem2, m_slotListResult; + UIControl_Label m_labelAnvil; + UIControl_TextInput m_textInputAnvil; + + IggyName m_funcShowRedCross, m_funcSetCostLabel; + + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene_AbstractContainerMenu) + UI_BEGIN_MAP_CHILD_ELEMENTS( m_controlMainPanel ) + UI_MAP_ELEMENT( m_slotListItem1, "Ingredient") + UI_MAP_ELEMENT( m_slotListItem2, "Ingredient2") + UI_MAP_ELEMENT( m_slotListResult, "Result") + UI_MAP_ELEMENT( m_labelAnvil, "AnvilText") + UI_MAP_ELEMENT( m_textInputAnvil, "AnvilTextInput") + UI_END_MAP_CHILD_ELEMENTS() + + UI_MAP_NAME(m_funcShowRedCross, L"ShowRedCross") + UI_MAP_NAME(m_funcSetCostLabel, L"SetCostLabel") + UI_END_MAP_ELEMENTS_AND_NAMES() + + virtual wstring getMoviePath(); + virtual void handleReload(); + + virtual void tick(); + + virtual int getSectionColumns(ESceneSection eSection); + virtual int getSectionRows(ESceneSection eSection); + virtual void GetPositionOfSection( ESceneSection eSection, UIVec2D* pPosition ); + virtual void GetItemScreenData( ESceneSection eSection, int iItemIndex, UIVec2D* pPosition, UIVec2D* pSize ); + virtual void handleSectionClick(ESceneSection eSection) {} + virtual void setSectionSelectedSlot(ESceneSection eSection, int x, int y); + + virtual UIControl *getSection(ESceneSection eSection); + + static int KeyboardCompleteCallback(LPVOID lpParam,bool bRes); + virtual void handleEditNamePressed(); + virtual void setEditNameValue(const wstring &name); + virtual void setEditNameEditable(bool enabled); + virtual void handleDestroy(); + + void setCostLabel(const wstring &label, bool canAfford); + void showCross(bool show); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_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 new file mode 100644 index 00000000..8563054c --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_BrewingStandMenu.cpp @@ -0,0 +1,309 @@ +#include "stdafx.h" +#include "UI.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.alchemy.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.tile.entity.h" +#include "..\..\Minecraft.h" +#include "UIScene_BrewingStandMenu.h" + +UIScene_BrewingStandMenu::UIScene_BrewingStandMenu(int iPad, void *_initData, UILayer *parentLayer) : UIScene_AbstractContainerMenu(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + m_progressBrewingArrow.init(L"",0,0,PotionBrewing::BREWING_TIME_SECONDS * SharedConstants::TICKS_PER_SECOND,0); + m_progressBrewingBubbles.init(L"",0,0,30,0); + + BrewingScreenInput *initData = (BrewingScreenInput *)_initData; + m_brewingStand = initData->brewingStand; + + m_labelBrewingStand.init( m_brewingStand->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_Brewing_Menu, this); + } + + BrewingStandMenu* menu = new BrewingStandMenu( initData->inventory, initData->brewingStand ); + + Initialize( initData->iPad, menu, true, BrewingStandMenu::INV_SLOT_START, eSectionBrewingUsing, eSectionBrewingMax ); + + m_slotListIngredient.addSlots(BrewingStandMenu::INGREDIENT_SLOT, 1); + + for(unsigned int i = 0; i < 3; ++i) + { + m_slotListBottles[i].addSlots(BrewingStandMenu::BOTTLE_SLOT_START + i, 1); + } + + if(initData) delete initData; + + app.SetRichPresenceContext(iPad, CONTEXT_GAME_STATE_BREWING); +} + +wstring UIScene_BrewingStandMenu::getMoviePath() +{ + if(app.GetLocalPlayerCount() > 1) + { + return L"BrewingStandMenuSplit"; + } + else + { + return L"BrewingStandMenu"; + } +} + +void UIScene_BrewingStandMenu::handleReload() +{ + Initialize( m_iPad, m_menu, true, BrewingStandMenu::INV_SLOT_START, eSectionBrewingUsing, eSectionBrewingMax ); + + m_slotListIngredient.addSlots(BrewingStandMenu::INGREDIENT_SLOT, 1); + + for(unsigned int i = 0; i < 3; ++i) + { + m_slotListBottles[i].addSlots(BrewingStandMenu::BOTTLE_SLOT_START + i, 1); + } +} + +void UIScene_BrewingStandMenu::tick() +{ + m_progressBrewingArrow.setProgress( m_brewingStand->getBrewTime() ); + + int value = 0; + int bubbleStep = (m_brewingStand->getBrewTime() / 2) % 7; + switch (bubbleStep) + { + case 0: + value = 0; + break; + case 6: + value = 5; + break; + case 5: + value = 10; + break; + case 4: + value = 15; + break; + case 3: + value = 20; + break; + case 2: + value = 25; + break; + case 1: + value = 30; + break; + } + m_progressBrewingBubbles.setProgress( value); + UIScene_AbstractContainerMenu::tick(); +} + +int UIScene_BrewingStandMenu::getSectionColumns(ESceneSection eSection) +{ + int cols = 0; + switch( eSection ) + { + case eSectionBrewingBottle1: + cols = 1; + break; + case eSectionBrewingBottle2: + cols = 1; + break; + case eSectionBrewingBottle3: + cols = 1; + break; + case eSectionBrewingIngredient: + cols = 1; + break; + case eSectionBrewingInventory: + cols = 9; + break; + case eSectionBrewingUsing: + cols = 9; + break; + default: + assert( false ); + break; + } + return cols; +} + +int UIScene_BrewingStandMenu::getSectionRows(ESceneSection eSection) +{ + int rows = 0; + switch( eSection ) + { + case eSectionBrewingBottle1: + rows = 1; + break; + case eSectionBrewingBottle2: + rows = 1; + break; + case eSectionBrewingBottle3: + rows = 1; + break; + case eSectionBrewingIngredient: + rows = 1; + break; + case eSectionBrewingInventory: + rows = 3; + break; + case eSectionBrewingUsing: + rows = 1; + break; + default: + assert( false ); + break; + } + return rows; +} + +void UIScene_BrewingStandMenu::GetPositionOfSection( ESceneSection eSection, UIVec2D* pPosition ) +{ + switch( eSection ) + { + case eSectionBrewingBottle1: + pPosition->x = m_slotListBottles[0].getXPos(); + pPosition->y = m_slotListBottles[0].getYPos(); + break; + case eSectionBrewingBottle2: + pPosition->x = m_slotListBottles[1].getXPos(); + pPosition->y = m_slotListBottles[1].getYPos(); + break; + case eSectionBrewingBottle3: + pPosition->x = m_slotListBottles[2].getXPos(); + pPosition->y = m_slotListBottles[2].getYPos(); + break; + case eSectionBrewingIngredient: + pPosition->x = m_slotListIngredient.getXPos(); + pPosition->y = m_slotListIngredient.getYPos(); + break; + case eSectionBrewingInventory: + pPosition->x = m_slotListInventory.getXPos(); + pPosition->y = m_slotListInventory.getYPos(); + break; + case eSectionBrewingUsing: + pPosition->x = m_slotListHotbar.getXPos(); + pPosition->y = m_slotListHotbar.getYPos(); + break; + default: + assert( false ); + break; + } +} + +void UIScene_BrewingStandMenu::GetItemScreenData( ESceneSection eSection, int iItemIndex, UIVec2D* pPosition, UIVec2D* pSize ) +{ + UIVec2D sectionSize; + + switch( eSection ) + { + case eSectionBrewingBottle1: + sectionSize.x = m_slotListBottles[0].getWidth(); + sectionSize.y = m_slotListBottles[0].getHeight(); + break; + case eSectionBrewingBottle2: + sectionSize.x = m_slotListBottles[1].getWidth(); + sectionSize.y = m_slotListBottles[1].getHeight(); + break; + case eSectionBrewingBottle3: + sectionSize.x = m_slotListBottles[2].getWidth(); + sectionSize.y = m_slotListBottles[2].getHeight(); + break; + case eSectionBrewingIngredient: + sectionSize.x = m_slotListIngredient.getWidth(); + sectionSize.y = m_slotListIngredient.getHeight(); + break; + case eSectionBrewingInventory: + sectionSize.x = m_slotListInventory.getWidth(); + sectionSize.y = m_slotListInventory.getHeight(); + break; + case eSectionBrewingUsing: + sectionSize.x = m_slotListHotbar.getWidth(); + sectionSize.y = m_slotListHotbar.getHeight(); + break; + default: + assert( false ); + break; + } + + int rows = getSectionRows(eSection); + int cols = getSectionColumns(eSection); + + pSize->x = sectionSize.x/cols; + pSize->y = sectionSize.y/rows; + + int itemCol = iItemIndex % cols; + int itemRow = iItemIndex/cols; + + pPosition->x = itemCol * pSize->x; + pPosition->y = itemRow * pSize->y; +} + +void UIScene_BrewingStandMenu::setSectionSelectedSlot(ESceneSection eSection, int x, int y) +{ + int cols = getSectionColumns(eSection); + + int index = (y * cols) + x; + + UIControl_SlotList *slotList = NULL; + switch( eSection ) + { + case eSectionBrewingBottle1: + slotList = &m_slotListBottles[0]; + break; + case eSectionBrewingBottle2: + slotList = &m_slotListBottles[1]; + break; + case eSectionBrewingBottle3: + slotList = &m_slotListBottles[2]; + break; + case eSectionBrewingIngredient: + slotList = &m_slotListIngredient; + break; + case eSectionBrewingInventory: + slotList = &m_slotListInventory; + break; + case eSectionBrewingUsing: + slotList = &m_slotListHotbar; + break; + default: + assert( false ); + break; + } + + slotList->setHighlightSlot(index); +} + +UIControl *UIScene_BrewingStandMenu::getSection(ESceneSection eSection) +{ + UIControl *control = NULL; + switch( eSection ) + { + case eSectionBrewingBottle1: + control = &m_slotListBottles[0]; + break; + case eSectionBrewingBottle2: + control = &m_slotListBottles[1]; + break; + case eSectionBrewingBottle3: + control = &m_slotListBottles[2]; + break; + case eSectionBrewingIngredient: + control = &m_slotListIngredient; + break; + case eSectionBrewingInventory: + control = &m_slotListInventory; + break; + case eSectionBrewingUsing: + control = &m_slotListHotbar; + break; + default: + assert( false ); + break; + } + return control; +} diff --git a/Minecraft.Client/Common/UI/UIScene_BrewingStandMenu.h b/Minecraft.Client/Common/UI/UIScene_BrewingStandMenu.h new file mode 100644 index 00000000..5441a1ac --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_BrewingStandMenu.h @@ -0,0 +1,49 @@ +#pragma once + +#include "UIScene_AbstractContainerMenu.h" +#include "IUIScene_BrewingMenu.h" + +class InventoryMenu; + +class UIScene_BrewingStandMenu : public UIScene_AbstractContainerMenu, public IUIScene_BrewingMenu +{ +private: + shared_ptr m_brewingStand; + +public: + UIScene_BrewingStandMenu(int iPad, void *initData, UILayer *parentLayer); + + virtual EUIScene getSceneType() { return eUIScene_BrewingStandMenu;} + +protected: + UIControl_SlotList m_slotListBottles[3], m_slotListIngredient; + UIControl_Label m_labelBrewingStand; + UIControl_Progress m_progressBrewingArrow, m_progressBrewingBubbles; + + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene_AbstractContainerMenu) + UI_BEGIN_MAP_CHILD_ELEMENTS( m_controlMainPanel ) + UI_MAP_ELEMENT( m_slotListBottles[0], "Bottle1") + UI_MAP_ELEMENT( m_slotListBottles[1], "Bottle2") + UI_MAP_ELEMENT( m_slotListBottles[2], "Bottle3") + UI_MAP_ELEMENT( m_slotListIngredient, "Ingredient") + UI_MAP_ELEMENT( m_labelBrewingStand, "BrewingStandText") + + UI_MAP_ELEMENT( m_progressBrewingArrow, "BrewingArrow") + UI_MAP_ELEMENT( m_progressBrewingBubbles, "BrewingBubbles") + UI_END_MAP_CHILD_ELEMENTS() + UI_END_MAP_ELEMENTS_AND_NAMES() + + virtual wstring getMoviePath(); + virtual void handleReload(); + + virtual void tick(); + + virtual int getSectionColumns(ESceneSection eSection); + virtual int getSectionRows(ESceneSection eSection); + virtual void GetPositionOfSection( ESceneSection eSection, UIVec2D* pPosition ); + virtual void GetItemScreenData( ESceneSection eSection, int iItemIndex, UIVec2D* pPosition, UIVec2D* pSize ); + virtual void handleSectionClick(ESceneSection eSection) {} + virtual void setSectionSelectedSlot(ESceneSection eSection, int x, int y); + + virtual UIControl *getSection(ESceneSection eSection); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_ConnectingProgress.cpp b/Minecraft.Client/Common/UI/UIScene_ConnectingProgress.cpp new file mode 100644 index 00000000..968072a8 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_ConnectingProgress.cpp @@ -0,0 +1,267 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_ConnectingProgress.h" +#include "..\..\Minecraft.h" + +UIScene_ConnectingProgress::UIScene_ConnectingProgress(int iPad, void *_initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + parentLayer->addComponent(iPad,eUIComponent_Panorama); + parentLayer->addComponent(iPad,eUIComponent_Logo); + + m_progressBar.showBar(false); + m_progressBar.setVisible( false ); + m_labelTip.setVisible( false ); + + ConnectionProgressParams *param = (ConnectionProgressParams *)_initData; + + if( param->stringId >= 0 ) + { + m_labelTitle.init( app.GetString( param->stringId ) ); + } + else + { + m_labelTitle.init( L"" ); + } + m_progressBar.init(L"",0,0,100,0); + m_buttonConfirm.init( app.GetString( IDS_CONFIRM_OK ), eControl_Confirm ); + m_buttonConfirm.setVisible(false); + +#if 0 + if(app.GetLocalPlayerCount()>1) + { + app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad,false); + } +#endif + + m_showTooltips = param->showTooltips; + m_runFailTimer = param->setFailTimer; + m_timerTime = param->timerTime; + m_cancelFunc = param->cancelFunc; + m_cancelFuncParam = param->cancelFuncParam; + m_removeLocalPlayer = false; + m_showingButton = false; +} + +UIScene_ConnectingProgress::~UIScene_ConnectingProgress() +{ + m_parentLayer->removeComponent(eUIComponent_Panorama); + m_parentLayer->removeComponent(eUIComponent_Logo); +} + +void UIScene_ConnectingProgress::updateTooltips() +{ + // 4J-PB - removing the option of cancel join, since it didn't work anyway + //ui.SetTooltips( m_iPad, -1, m_showTooltips?IDS_TOOLTIPS_CANCEL_JOIN:-1); + ui.SetTooltips( m_iPad, -1, -1); +} + +void UIScene_ConnectingProgress::tick() +{ + UIScene::tick(); + + if( m_removeLocalPlayer ) + { + m_removeLocalPlayer = false; + + Minecraft *pMinecraft = Minecraft::GetInstance(); + pMinecraft->removeLocalPlayerIdx(m_iPad); +#ifdef _XBOX_ONE + ProfileManager.RemoveGamepadFromGame(m_iPad); +#endif + } +} + +wstring UIScene_ConnectingProgress::getMoviePath() +{ + if(app.GetLocalPlayerCount() > 1 && !m_parentLayer->IsFullscreenGroup()) + { + return L"FullscreenProgressSplit"; + } + else + { + return L"FullscreenProgress"; + } +} + +void UIScene_ConnectingProgress::handleGainFocus(bool navBack) +{ + UIScene::handleGainFocus(navBack); + if(!navBack && m_runFailTimer) addTimer(0,m_timerTime); +} + +void UIScene_ConnectingProgress::handleLoseFocus() +{ + int millisecsLeft = getTimer(0)->targetTime - System::currentTimeMillis(); + int millisecsTaken = getTimer(0)->duration - millisecsLeft; + app.DebugPrintf("\n"); + app.DebugPrintf("---------------------------------------------------------\n"); + app.DebugPrintf("---------------------------------------------------------\n"); + app.DebugPrintf("UIScene_ConnectingProgress time taken = %d millisecs\n", millisecsTaken); + app.DebugPrintf("---------------------------------------------------------\n"); + app.DebugPrintf("---------------------------------------------------------\n"); + app.DebugPrintf("\n"); + + + killTimer(0); +} + +void UIScene_ConnectingProgress::handleTimerComplete(int id) +{ + // Check if the connection failed + Minecraft *pMinecraft = Minecraft::GetInstance(); + + if( pMinecraft->m_connectionFailed[m_iPad] || !g_NetworkManager.IsInSession() ) + { + +#if 0 + app.RemoveBackScene(m_iPad); +#endif + + int exitReasonStringId; + switch(pMinecraft->m_connectionFailedReason[m_iPad]) + { + case DisconnectPacket::eDisconnect_LoginTooLong: + exitReasonStringId = IDS_DISCONNECTED_LOGIN_TOO_LONG; + break; + case DisconnectPacket::eDisconnect_ServerFull: + exitReasonStringId = IDS_DISCONNECTED_SERVER_FULL; + break; + case DisconnectPacket::eDisconnect_Kicked: + exitReasonStringId = IDS_DISCONNECTED_KICKED; + break; + case DisconnectPacket::eDisconnect_NoUGC_AllLocal: + exitReasonStringId = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_ALL_LOCAL; + break; + case DisconnectPacket::eDisconnect_NoUGC_Single_Local: + exitReasonStringId = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_SINGLE_LOCAL; + break; +#if defined(__PS3__) || defined(__ORBIS__) + case DisconnectPacket::eDisconnect_ContentRestricted_AllLocal: + exitReasonStringId = IDS_CONTENT_RESTRICTION_MULTIPLAYER; + break; + case DisconnectPacket::eDisconnect_ContentRestricted_Single_Local: + exitReasonStringId = IDS_CONTENT_RESTRICTION; + break; +#endif +#ifdef _XBOX + case DisconnectPacket::eDisconnect_NoUGC_Remote: + exitReasonStringId = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_REMOTE; + break; +#endif + case DisconnectPacket::eDisconnect_NoFlying: + exitReasonStringId = IDS_DISCONNECTED_FLYING; + break; + case DisconnectPacket::eDisconnect_Quitting: + exitReasonStringId = IDS_DISCONNECTED_SERVER_QUIT; + break; + case DisconnectPacket::eDisconnect_OutdatedServer: + exitReasonStringId = IDS_DISCONNECTED_SERVER_OLD; + break; + case DisconnectPacket::eDisconnect_OutdatedClient: + exitReasonStringId = IDS_DISCONNECTED_CLIENT_OLD; + break; +#if defined __ORBIS__ || defined __PS3__ || defined __PSVITA__ + case DisconnectPacket::eDisconnect_NATMismatch: + exitReasonStringId = IDS_DISCONNECTED_NAT_TYPE_MISMATCH; + break; +#endif + default: + exitReasonStringId = IDS_CONNECTION_LOST_SERVER; + break; + } + + if( m_iPad != ProfileManager.GetPrimaryPad() && g_NetworkManager.IsInSession() ) + { + m_buttonConfirm.setVisible(true); + m_showingButton = true; + + // Set text + m_labelTitle.setLabel( app.GetString( IDS_CONNECTION_FAILED ) ); + m_progressBar.setLabel( app.GetString( exitReasonStringId ) ); + m_progressBar.setVisible( true ); + m_controlTimer.setVisible( false ); + } + else + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestErrorMessage( IDS_CONNECTION_FAILED, exitReasonStringId, uiIDA,1,ProfileManager.GetPrimaryPad()); + exitReasonStringId = -1; + + //app.NavigateToHomeMenu(); + app.SetAction(ProfileManager.GetPrimaryPad(),eAppAction_ExitWorld,(void *)TRUE); + } + } +} + +void UIScene_ConnectingProgress::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + //app.DebugPrintf("UIScene_DebugOverlay handling input for pad %d, key %d, down- %s, pressed- %s, released- %s\n", iPad, key, down?"TRUE":"FALSE", pressed?"TRUE":"FALSE", released?"TRUE":"FALSE"); + + if( m_showTooltips ) + { + ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); + + switch(key) + { +// 4J-PB - Removed the option to cancel join - it didn't work anyway +// case ACTION_MENU_CANCEL: +// { +// if(m_cancelFunc != NULL) +// { +// m_cancelFunc(m_cancelFuncParam); +// } +// else +// { +// // Cancel the join +// Minecraft *pMinecraft = Minecraft::GetInstance(); +// pMinecraft->removeLocalPlayerIdx(m_iPad); +// } +// handled = true; +// } +// break; + case ACTION_MENU_OK: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + if(pressed) + { + sendInputToMovie(key, repeat, pressed, released); + } + break; + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + if(pressed) + { + sendInputToMovie(key, repeat, pressed, released); + } + break; + } + } +} + +void UIScene_ConnectingProgress::handlePress(F64 controlId, F64 childId) +{ + switch((int)controlId) + { + case eControl_Confirm: + if(m_showingButton) + { + if( m_iPad != ProfileManager.GetPrimaryPad() && g_NetworkManager.IsInSession() ) + { + // The connection failed if we see the button, so the temp player should be removed and the viewports updated again + // This is actually done in the tick as we can't pull down the scene we are currently in from here + m_removeLocalPlayer = true; + } + else + { + ui.NavigateToHomeMenu(); + //app.NavigateBack( ProfileManager.GetPrimaryPad() ); + } + } + break; + } +} diff --git a/Minecraft.Client/Common/UI/UIScene_ConnectingProgress.h b/Minecraft.Client/Common/UI/UIScene_ConnectingProgress.h new file mode 100644 index 00000000..2c52284c --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_ConnectingProgress.h @@ -0,0 +1,61 @@ +#pragma once + +#include "UIScene.h" + +class UIScene_ConnectingProgress : public UIScene +{ +private: + bool m_runFailTimer; + int m_timerTime; + bool m_showTooltips; + bool m_removeLocalPlayer; + bool m_showingButton; + void (*m_cancelFunc)(LPVOID param); + LPVOID m_cancelFuncParam; + + enum EControls + { + eControl_Confirm + }; + +protected: + UIControl_Progress m_progressBar; + UIControl_Label m_labelTitle, m_labelTip; + UIControl_Button m_buttonConfirm; + UIControl m_controlTimer; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_progressBar, "ProgressBar") + UI_MAP_ELEMENT( m_labelTitle, "Title") + UI_MAP_ELEMENT( m_labelTip, "Tip") + UI_MAP_ELEMENT( m_buttonConfirm, "Confirm") + UI_MAP_ELEMENT( m_controlTimer, "Timer") + UI_END_MAP_ELEMENTS_AND_NAMES() +public: + UIScene_ConnectingProgress(int iPad, void *initData, UILayer *parentLayer); + virtual ~UIScene_ConnectingProgress(); + + virtual void tick(); + + virtual EUIScene getSceneType() { return eUIScene_ConnectingProgress;} + + virtual void updateTooltips(); + virtual void handleGainFocus(bool navBack); + virtual void handleLoseFocus(); + + void handleTimerComplete(int id); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +#ifdef _DURANGO + virtual long long getDefaultGtcButtons() { return 0; } +#endif + +public: + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + +protected: + void handlePress(F64 controlId, F64 childId); +}; diff --git a/Minecraft.Client/Common/UI/UIScene_ContainerMenu.cpp b/Minecraft.Client/Common/UI/UIScene_ContainerMenu.cpp new file mode 100644 index 00000000..9e48a57b --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_ContainerMenu.cpp @@ -0,0 +1,223 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_ContainerMenu.h" + +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.h" +#include "..\..\..\Minecraft.World\net.minecraft.stats.h" +#include "..\..\LocalPlayer.h" +#include "..\..\Minecraft.h" +#include "..\Tutorial\Tutorial.h" +#include "..\Tutorial\TutorialMode.h" +#include "..\Tutorial\TutorialEnum.h" + +UIScene_ContainerMenu::UIScene_ContainerMenu(int iPad, void *_initData, UILayer *parentLayer) : UIScene_AbstractContainerMenu(iPad, parentLayer) +{ + ContainerScreenInput *initData = (ContainerScreenInput *)_initData; + m_bLargeChest = (initData->container->getContainerSize() > 3*9)?true:false; + + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + m_labelChest.init(initData->container->getName()); + + ContainerMenu* menu = new ContainerMenu( initData->inventory, initData->container ); + + Minecraft *pMinecraft = Minecraft::GetInstance(); + if( pMinecraft->localgameModes[iPad] != NULL ) + { + TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[initData->iPad]; + m_previousTutorialState = gameMode->getTutorial()->getCurrentState(); + gameMode->getTutorial()->changeTutorialState(e_Tutorial_State_Container_Menu, this); + } + + int containerSize = menu->getSize() - (27 + 9); + + Initialize( initData->iPad, menu, true, containerSize, eSectionContainerUsing, eSectionContainerMax); + + m_slotListContainer.addSlots(0, containerSize); + + if(initData) delete initData; +} + +wstring UIScene_ContainerMenu::getMoviePath() +{ + if(m_bLargeChest) + { + if(app.GetLocalPlayerCount() > 1) + { + return L"ChestLargeMenuSplit"; + } + else + { + return L"ChestLargeMenu"; + } + } + else + { + if(app.GetLocalPlayerCount() > 1) + { + return L"ChestMenuSplit"; + } + else + { + return L"ChestMenu"; + } + } +} + +void UIScene_ContainerMenu::handleReload() +{ + int containerSize = m_menu->getSize() - (27 + 9); + + Initialize( m_iPad, m_menu, true, containerSize, eSectionContainerUsing, eSectionContainerMax ); + + m_slotListContainer.addSlots(0, containerSize); +} + +int UIScene_ContainerMenu::getSectionColumns(ESceneSection eSection) +{ + int cols = 0; + switch( eSection ) + { + case eSectionContainerChest: + cols = 9; + break; + case eSectionContainerInventory: + cols = 9; + break; + case eSectionContainerUsing: + cols = 9; + break; + default: + assert( false ); + break; + } + return cols; +} + +int UIScene_ContainerMenu::getSectionRows(ESceneSection eSection) +{ + int rows = 0; + switch( eSection ) + { + case eSectionContainerChest: + rows = (m_menu->getSize() - (27 + 9)) / 9; + break; + case eSectionContainerInventory: + rows = 3; + break; + case eSectionContainerUsing: + rows = 1; + break; + default: + assert( false ); + break; + } + return rows; +} + +void UIScene_ContainerMenu::GetPositionOfSection( ESceneSection eSection, UIVec2D* pPosition ) +{ + switch( eSection ) + { + case eSectionContainerChest: + pPosition->x = m_slotListContainer.getXPos(); + pPosition->y = m_slotListContainer.getYPos(); + break; + case eSectionContainerInventory: + pPosition->x = m_slotListInventory.getXPos(); + pPosition->y = m_slotListInventory.getYPos(); + break; + case eSectionContainerUsing: + pPosition->x = m_slotListHotbar.getXPos(); + pPosition->y = m_slotListHotbar.getYPos(); + break; + default: + assert( false ); + break; + } +} + +void UIScene_ContainerMenu::GetItemScreenData( ESceneSection eSection, int iItemIndex, UIVec2D* pPosition, UIVec2D* pSize ) +{ + UIVec2D sectionSize; + + switch( eSection ) + { + case eSectionContainerChest: + sectionSize.x = m_slotListContainer.getWidth(); + sectionSize.y = m_slotListContainer.getHeight(); + break; + case eSectionContainerInventory: + sectionSize.x = m_slotListInventory.getWidth(); + sectionSize.y = m_slotListInventory.getHeight(); + break; + case eSectionContainerUsing: + sectionSize.x = m_slotListHotbar.getWidth(); + sectionSize.y = m_slotListHotbar.getHeight(); + break; + default: + assert( false ); + break; + } + + int rows = getSectionRows(eSection); + int cols = getSectionColumns(eSection); + + pSize->x = sectionSize.x/cols; + pSize->y = sectionSize.y/rows; + + int itemCol = iItemIndex % cols; + int itemRow = iItemIndex/cols; + + pPosition->x = itemCol * pSize->x; + pPosition->y = itemRow * pSize->y; +} + +void UIScene_ContainerMenu::setSectionSelectedSlot(ESceneSection eSection, int x, int y) +{ + int cols = getSectionColumns(eSection); + + int index = (y * cols) + x; + + UIControl_SlotList *slotList = NULL; + switch( eSection ) + { + case eSectionContainerChest: + slotList = &m_slotListContainer; + break; + case eSectionContainerInventory: + slotList = &m_slotListInventory; + break; + case eSectionContainerUsing: + slotList = &m_slotListHotbar; + break; + default: + assert( false ); + break; + } + + slotList->setHighlightSlot(index); +} + +UIControl *UIScene_ContainerMenu::getSection(ESceneSection eSection) +{ + UIControl *control = NULL; + switch( eSection ) + { + case eSectionContainerChest: + control = &m_slotListContainer; + break; + case eSectionContainerInventory: + control = &m_slotListInventory; + break; + case eSectionContainerUsing: + control = &m_slotListHotbar; + break; + default: + assert( false ); + break; + } + return control; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_ContainerMenu.h b/Minecraft.Client/Common/UI/UIScene_ContainerMenu.h new file mode 100644 index 00000000..f2ad743c --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_ContainerMenu.h @@ -0,0 +1,40 @@ +#pragma once + +#include "UIScene_AbstractContainerMenu.h" +#include "IUIScene_ContainerMenu.h" + +class InventoryMenu; + +class UIScene_ContainerMenu : public UIScene_AbstractContainerMenu, public IUIScene_ContainerMenu +{ +private: + bool m_bLargeChest; + +public: + UIScene_ContainerMenu(int iPad, void *initData, UILayer *parentLayer); + + virtual EUIScene getSceneType() { return eUIScene_ContainerMenu;} + +protected: + UIControl_SlotList m_slotListContainer; + UIControl_Label m_labelChest; + + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene_AbstractContainerMenu) + UI_BEGIN_MAP_CHILD_ELEMENTS( m_controlMainPanel ) + UI_MAP_ELEMENT( m_slotListContainer, "containerList") + UI_MAP_ELEMENT( m_labelChest, "chestLabel") + UI_END_MAP_CHILD_ELEMENTS() + UI_END_MAP_ELEMENTS_AND_NAMES() + + virtual wstring getMoviePath(); + virtual void handleReload(); + + virtual int getSectionColumns(ESceneSection eSection); + virtual int getSectionRows(ESceneSection eSection); + virtual void GetPositionOfSection( ESceneSection eSection, UIVec2D* pPosition ); + virtual void GetItemScreenData( ESceneSection eSection, int iItemIndex, UIVec2D* pPosition, UIVec2D* pSize ); + virtual void handleSectionClick(ESceneSection eSection) {} + virtual void setSectionSelectedSlot(ESceneSection eSection, int x, int y); + + virtual UIControl *getSection(ESceneSection eSection); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_ControlsMenu.cpp b/Minecraft.Client/Common/UI/UIScene_ControlsMenu.cpp new file mode 100644 index 00000000..57567248 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_ControlsMenu.cpp @@ -0,0 +1,336 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_ControlsMenu.h" +#include "..\..\Minecraft.h" +#include "..\..\MultiplayerLocalPlayer.h" + +UIScene_ControlsMenu::UIScene_ControlsMenu(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_number; +#if defined(_XBOX) || defined(_WIN64) + value[0].number = (F64)0; +#elif defined(_DURANGO) + value[0].number = (F64)1; +#elif defined(__PS3__) + value[0].number = (F64)2; +#elif defined(__ORBIS__) + value[0].number = (F64)3; +#elif defined(__PSVITA__) + value[0].number = (F64)4; +#endif + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetPlatform , 1 , value ); + + bool bNotInGame=(Minecraft::GetInstance()->level==NULL); + + if(bNotInGame) + { + LPWSTR layoutString = new wchar_t[ 128 ]; + swprintf( layoutString, 128, L"%ls", VER_PRODUCTVERSION_STR_W); + m_labelVersion.init(layoutString); + delete [] layoutString; + } + // 4J-PB - stop the label showing in the in-game controls menu + else + { + m_labelVersion.init(L" "); + } + m_bCreativeMode = !bNotInGame && Minecraft::GetInstance()->localplayers[m_iPad] && Minecraft::GetInstance()->localplayers[m_iPad]->abilities.mayfly; + +#ifndef __PSVITA__ +#ifdef __ORBIS__ + // no buttons to initialise if we're running this on PS4 remote play + if(!InputManager.UsingRemoteVita()) +#endif + { + m_buttonLayouts[0].init(L"1", eControl_Button0); + m_buttonLayouts[1].init(L"2", eControl_Button1); + m_buttonLayouts[2].init(L"3", eControl_Button2); + } +#endif + + m_checkboxInvert.init(app.GetString(IDS_INVERT_LOOK), eControl_InvertLook, app.GetGameSettings(m_iPad,eGameSetting_ControlInvertLook)); + m_checkboxSouthpaw.init(app.GetString(IDS_SOUTHPAW), eControl_Southpaw, app.GetGameSettings(m_iPad,eGameSetting_ControlSouthPaw)); + + m_iSchemeTextA[0]=IDS_CONTROLS_SCHEME0; + m_iSchemeTextA[1]=IDS_CONTROLS_SCHEME1; + m_iSchemeTextA[2]=IDS_CONTROLS_SCHEME2; + + int iSelected=app.GetGameSettings(m_iPad,eGameSetting_ControlScheme); + +#ifndef __PSVITA__ + LPWSTR layoutString = new wchar_t[ 128 ]; + swprintf( layoutString, 128, L"%ls : %ls", app.GetString( IDS_CURRENT_LAYOUT ),app.GetString(m_iSchemeTextA[iSelected])); +#ifdef __ORBIS__ + if (!InputManager.UsingRemoteVita()) +#endif + { + m_labelCurrentLayout.init(layoutString); + } +#endif + + m_iCurrentNavigatedControlsLayout = iSelected; + + +#ifdef __ORBIS__ + // don't set controller layout if we're entering the PS4 remote play scene + if(!InputManager.UsingRemoteVita()) +#endif + { + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = (F64)m_iCurrentNavigatedControlsLayout; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetControllerLayout , 1 , value ); + } + +#ifdef __ORBIS__ + // Set mapping to Vita mapping + if (InputManager.UsingRemoteVita()) m_iCurrentNavigatedControlsLayout = 3; +#elif defined __PSVITA__ + // Set mapping to Vita mapping + if (InputManager.IsVitaTV()) m_iCurrentNavigatedControlsLayout = 1; +#endif + + for(unsigned int i = 0; i < e_PadCOUNT; ++i) + { + m_labelsPad[i].init(L""); + m_controlLines[i].setVisible(false); + } + m_bLayoutChanged = false; + + + PositionAllText(m_iPad); +} + +wstring UIScene_ControlsMenu::getMoviePath() +{ +#ifdef __ORBIS__ + if(InputManager.UsingRemoteVita()) + { + return L"ControlsRemotePlay"; + } + else +#endif +#ifdef __PSVITA__ + if(InputManager.IsVitaTV()) + { + return L"ControlsTV"; + } + else +#endif + if(app.GetLocalPlayerCount() > 1) + { + return L"ControlsSplit"; + } + else + { + return L"Controls"; + } +} + +void UIScene_ControlsMenu::updateTooltips() +{ + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); +} + +void UIScene_ControlsMenu::tick() +{ + if(m_bLayoutChanged) PositionAllText(m_iPad); + UIScene::tick(); +} + +void UIScene_ControlsMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + //app.DebugPrintf("UIScene_DebugOverlay handling input for pad %d, key %d, down- %s, pressed- %s, released- %s\n", iPad, key, down?"TRUE":"FALSE", pressed?"TRUE":"FALSE", released?"TRUE":"FALSE"); + ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); + + switch(key) + { + case ACTION_MENU_CANCEL: + if(pressed) + { + app.CheckGameSettingsChanged(true,iPad); + navigateBack(); + } + break; + case ACTION_MENU_OK: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + if( pressed ) + { + //CD - Added for audio + ui.PlayUISFX(eSFX_Press); + } + sendInputToMovie(key, repeat, pressed, released); + break; + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + case ACTION_MENU_LEFT: + case ACTION_MENU_RIGHT: + sendInputToMovie(key, repeat, pressed, released); + break; + } +} + +void UIScene_ControlsMenu::handleCheckboxToggled(F64 controlId, bool selected) +{ + switch((int)controlId) + { + case eControl_InvertLook: + app.SetGameSettings(m_iPad,eGameSetting_ControlInvertLook,(unsigned char)( selected ) ); + break; + case eControl_Southpaw: + app.SetGameSettings(m_iPad,eGameSetting_ControlSouthPaw,(unsigned char)( selected ) ); + PositionAllText(m_iPad); + break; + }; +} + +void UIScene_ControlsMenu::handlePress(F64 controlId, F64 childId) +{ + int control = (int)controlId; + switch(control) + { + case eControl_Button0: + case eControl_Button1: + case eControl_Button2: + app.SetGameSettings(m_iPad,eGameSetting_ControlScheme,(unsigned char)control); + LPWSTR layoutString = new wchar_t[ 128 ]; + swprintf( layoutString, 128, L"%ls : %ls", app.GetString( IDS_CURRENT_LAYOUT ),app.GetString(m_iSchemeTextA[control])); +#ifdef __ORBIS__ + if (!InputManager.UsingRemoteVita()) +#endif + { + m_labelCurrentLayout.setLabel(layoutString); + } + + break; + }; +} + +void UIScene_ControlsMenu::handleFocusChange(F64 controlId, F64 childId) +{ + int control = (int)controlId; + switch(control) + { + case eControl_Button0: + case eControl_Button1: + case eControl_Button2: + m_iCurrentNavigatedControlsLayout=control; + m_bLayoutChanged = true; + break; + }; +} + +void UIScene_ControlsMenu::PositionAllText(int iPad) +{ + for(unsigned int i = 0; i < e_PadCOUNT; ++i) + { + m_labelsPad[i].setLabel(L""); + m_controlLines[i].setVisible(false); + } + + if(m_bCreativeMode) + { + PositionText(iPad,IDS_CONTROLS_JUMPFLY,MINECRAFT_ACTION_JUMP); + } + else + { + PositionText(iPad,IDS_CONTROLS_JUMP,MINECRAFT_ACTION_JUMP); + } + PositionText(iPad,IDS_CONTROLS_INVENTORY,MINECRAFT_ACTION_INVENTORY); + PositionText(iPad,IDS_CONTROLS_PAUSE,MINECRAFT_ACTION_PAUSEMENU); + if(m_bCreativeMode) + { + PositionText(iPad,IDS_CONTROLS_SNEAKFLY,MINECRAFT_ACTION_SNEAK_TOGGLE); + } + else + { + PositionText(iPad,IDS_CONTROLS_SNEAK,MINECRAFT_ACTION_SNEAK_TOGGLE); + } + PositionText(iPad,IDS_CONTROLS_USE,MINECRAFT_ACTION_USE); + PositionText(iPad,IDS_CONTROLS_ACTION,MINECRAFT_ACTION_ACTION); + PositionText(iPad,IDS_CONTROLS_HELDITEM,MINECRAFT_ACTION_RIGHT_SCROLL); + PositionText(iPad,IDS_CONTROLS_HELDITEM,MINECRAFT_ACTION_LEFT_SCROLL); + PositionText(iPad,IDS_CONTROLS_DROP,MINECRAFT_ACTION_DROP); + PositionText(iPad,IDS_CONTROLS_CRAFTING,MINECRAFT_ACTION_CRAFTING); + PositionText(iPad,IDS_CONTROLS_THIRDPERSON,MINECRAFT_ACTION_RENDER_THIRD_PERSON); + PositionText(iPad,IDS_CONTROLS_PLAYERS,MINECRAFT_ACTION_GAME_INFO); + + // Swap for southpaw. + if ( app.GetGameSettings(m_iPad,eGameSetting_ControlSouthPaw) ) + { + // Move + PositionText(iPad,IDS_CONTROLS_LOOK,MINECRAFT_ACTION_RIGHT); + // Look + PositionText(iPad,IDS_CONTROLS_MOVE,MINECRAFT_ACTION_LOOK_RIGHT); + } + else // Normal right handed. + { + // Move + PositionText(iPad,IDS_CONTROLS_MOVE,MINECRAFT_ACTION_RIGHT); + // Look + PositionText(iPad,IDS_CONTROLS_LOOK,MINECRAFT_ACTION_LOOK_RIGHT); + } + + bool layoutHasDpadFly; +#ifdef __PSVITA__ + layoutHasDpadFly = m_iCurrentNavigatedControlsLayout == 1; +#else + layoutHasDpadFly = m_iCurrentNavigatedControlsLayout == 0; +#endif + + // If we're in controls mode 1, and creative mode show the dpad for Creative Mode + if(m_bCreativeMode && layoutHasDpadFly) + { + PositionText(iPad,IDS_CONTROLS_DPAD,MINECRAFT_ACTION_DPAD_LEFT); + } + m_bLayoutChanged = false; +} + +void UIScene_ControlsMenu::PositionText(int iPad,int iTextID, unsigned char ucAction) +{ + unsigned int uiVal = InputManager.GetGameJoypadMaps(m_iCurrentNavigatedControlsLayout, ucAction); + + if (uiVal & _360_JOY_BUTTON_A) PositionTextDirect(iPad, iTextID, e_PadA, true); + if (uiVal & _360_JOY_BUTTON_B) PositionTextDirect(iPad, iTextID, e_PadB, true); + if (uiVal & _360_JOY_BUTTON_X) PositionTextDirect(iPad, iTextID, e_PadX, true); + if (uiVal & _360_JOY_BUTTON_Y) PositionTextDirect(iPad, iTextID, e_PadY, true); + if (uiVal & _360_JOY_BUTTON_BACK) + { +#ifdef __ORBIS__ + PositionTextDirect(iPad, iTextID, (InputManager.UsingRemoteVita() ? e_PadTouch : e_PadBack), true); +#else + PositionTextDirect(iPad, iTextID, e_PadBack, true); +#endif + } + if (uiVal & _360_JOY_BUTTON_START) PositionTextDirect(iPad, iTextID, e_PadStart, true); + if (uiVal & _360_JOY_BUTTON_RB) PositionTextDirect(iPad, iTextID, e_PadRB, true); + if (uiVal & _360_JOY_BUTTON_LB) PositionTextDirect(iPad, iTextID, e_PadLB, true); + if (uiVal & _360_JOY_BUTTON_RTHUMB) PositionTextDirect(iPad, iTextID, e_PadRS_1, true); + if (uiVal & _360_JOY_BUTTON_LTHUMB) PositionTextDirect(iPad, iTextID, e_PadLS_1, true); + // Look + if (uiVal & _360_JOY_BUTTON_RSTICK_RIGHT) PositionTextDirect(iPad, iTextID, e_PadRS_2, true); + // Move + if (uiVal & _360_JOY_BUTTON_LSTICK_RIGHT) PositionTextDirect(iPad, iTextID, e_PadLS_2, true); + if (uiVal & _360_JOY_BUTTON_RT) PositionTextDirect(iPad, iTextID, e_PadRT, true); + if (uiVal & _360_JOY_BUTTON_LT) PositionTextDirect(iPad, iTextID, e_PadLT, true); + if (uiVal & _360_JOY_BUTTON_DPAD_RIGHT) PositionTextDirect(iPad, iTextID, e_PadDPadRight, true); + if (uiVal & _360_JOY_BUTTON_DPAD_LEFT) PositionTextDirect(iPad, iTextID, e_PadDPadLeft, true); + if (uiVal & _360_JOY_BUTTON_DPAD_UP) PositionTextDirect(iPad, iTextID, e_PadDPadUp, true); + if (uiVal & _360_JOY_BUTTON_DPAD_DOWN) PositionTextDirect(iPad, iTextID, e_PadDPadDown, true); + } + +void UIScene_ControlsMenu::PositionTextDirect(int iPad,int iTextID, int iControlDetailsIndex, bool bShow) +{ + LPCWSTR text = app.GetString(iTextID); + + m_labelsPad[iControlDetailsIndex].setLabel(text); + m_controlLines[iControlDetailsIndex].setVisible(bShow); +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_ControlsMenu.h b/Minecraft.Client/Common/UI/UIScene_ControlsMenu.h new file mode 100644 index 00000000..538207fe --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_ControlsMenu.h @@ -0,0 +1,141 @@ +#pragma once + +#include "UIScene.h" + +class UIScene_ControlsMenu : public UIScene +{ +private: + enum EControl + { + // Buttons must be first three controls here + eControl_Button0, + eControl_Button1, + eControl_Button2, + eControl_InvertLook, + eControl_Southpaw, + }; + + enum EPadButtons + { + e_PadBack=0, + e_PadLT, + e_PadLB, + e_PadDPadLeft, + e_PadDPadRight, + e_PadDPadUp, + e_PadDPadDown, + e_PadLS_1, + e_PadLS_2, + e_PadStart, + e_PadRT, + e_PadRB, + e_PadY, + e_PadB, + e_PadA, + e_PadX, + e_PadRS_1, + e_PadRS_2, + e_PadTouch, + + e_PadCOUNT, + }; + + int m_iSchemeTextA[3]; + int m_iCurrentNavigatedControlsLayout; + bool m_bCreativeMode; + bool m_bLayoutChanged; + + UIControl_Label m_labelCurrentLayout; + UIControl_Label m_labelVersion; + UIControl_Label m_labelsPad[e_PadCOUNT]; + UIControl m_controlLines[e_PadCOUNT]; + UIControl_Button m_buttonLayouts[3]; + UIControl_CheckBox m_checkboxInvert, m_checkboxSouthpaw; + IggyName m_funcSetPlatform, m_funcSetControllerLayout; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + +#ifndef __PSVITA__ +#ifdef __ORBIS__ + if (!InputManager.UsingRemoteVita()) +#endif + { + UI_MAP_ELEMENT( m_labelCurrentLayout, "CurrentLayout") + + UI_MAP_ELEMENT( m_buttonLayouts[0], "Button1") + UI_MAP_ELEMENT( m_buttonLayouts[1], "Button2") + UI_MAP_ELEMENT( m_buttonLayouts[2], "Button3") + } +#endif + + UI_MAP_ELEMENT( m_labelsPad[e_PadBack], "LabelBack") + UI_MAP_ELEMENT( m_labelsPad[e_PadLT], "LabelLT") + UI_MAP_ELEMENT( m_labelsPad[e_PadLB], "LabelLB") + UI_MAP_ELEMENT( m_labelsPad[e_PadDPadLeft], "LabelDPadLeft") + UI_MAP_ELEMENT( m_labelsPad[e_PadDPadRight], "LabelDPadRight") + UI_MAP_ELEMENT( m_labelsPad[e_PadDPadUp], "LabelDPadUp") + UI_MAP_ELEMENT( m_labelsPad[e_PadDPadDown], "LabelDPadDown") + UI_MAP_ELEMENT( m_labelsPad[e_PadLS_1], "LabelLS_1") + UI_MAP_ELEMENT( m_labelsPad[e_PadLS_2], "LabelLS_2") + UI_MAP_ELEMENT( m_labelsPad[e_PadStart], "LabelStart") + UI_MAP_ELEMENT( m_labelsPad[e_PadRT], "LabelRT") + UI_MAP_ELEMENT( m_labelsPad[e_PadRB], "LabelRB") + UI_MAP_ELEMENT( m_labelsPad[e_PadY], "LabelY") + UI_MAP_ELEMENT( m_labelsPad[e_PadB], "LabelB") + UI_MAP_ELEMENT( m_labelsPad[e_PadA], "LabelA") + UI_MAP_ELEMENT( m_labelsPad[e_PadX], "LabelX") + UI_MAP_ELEMENT( m_labelsPad[e_PadRS_1], "LabelRS_1") + UI_MAP_ELEMENT( m_labelsPad[e_PadRS_2], "LabelRS_2") + UI_MAP_ELEMENT( m_labelsPad[e_PadTouch], "LabelTouch") + + UI_MAP_ELEMENT( m_controlLines[e_PadBack], "LineBack") + UI_MAP_ELEMENT( m_controlLines[e_PadLT], "LineLT") + UI_MAP_ELEMENT( m_controlLines[e_PadLB], "LineLB") + UI_MAP_ELEMENT( m_controlLines[e_PadDPadLeft], "LineDpadLeft") + UI_MAP_ELEMENT( m_controlLines[e_PadDPadRight], "LineDpadRight") + UI_MAP_ELEMENT( m_controlLines[e_PadDPadUp], "LineDpadUp") + UI_MAP_ELEMENT( m_controlLines[e_PadDPadDown], "LineDpadDown") + UI_MAP_ELEMENT( m_controlLines[e_PadLS_1], "LineL3") + UI_MAP_ELEMENT( m_controlLines[e_PadLS_2], "LineLeftStick") + UI_MAP_ELEMENT( m_controlLines[e_PadStart], "LineStart") + UI_MAP_ELEMENT( m_controlLines[e_PadRT], "LineRT") + UI_MAP_ELEMENT( m_controlLines[e_PadRB], "LineRB") + UI_MAP_ELEMENT( m_controlLines[e_PadY], "LineY") + UI_MAP_ELEMENT( m_controlLines[e_PadB], "LineB") + UI_MAP_ELEMENT( m_controlLines[e_PadA], "LineA") + UI_MAP_ELEMENT( m_controlLines[e_PadX], "LineX") + UI_MAP_ELEMENT( m_controlLines[e_PadRS_1], "LineR3") + UI_MAP_ELEMENT( m_controlLines[e_PadRS_2], "LineRightStick") + UI_MAP_ELEMENT( m_controlLines[e_PadTouch], "LineTouch") + + UI_MAP_ELEMENT( m_checkboxInvert, "InvertLook") + UI_MAP_ELEMENT( m_checkboxSouthpaw, "SouthPaw") + + UI_MAP_NAME( m_funcSetPlatform, L"SetPlatform") + UI_MAP_NAME( m_funcSetControllerLayout, L"SetControllerLayout") + UI_MAP_ELEMENT( m_labelVersion, "Version") + UI_END_MAP_ELEMENTS_AND_NAMES() +public: + UIScene_ControlsMenu(int iPad, void *initData, UILayer *parentLayer); + + virtual EUIScene getSceneType() { return eUIScene_ControlsMenu;} + + virtual void updateTooltips(); + virtual void tick(); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + + virtual void handleCheckboxToggled(F64 controlId, bool selected); + virtual void handlePress(F64 controlId, F64 childId); + virtual void handleFocusChange(F64 controlId, F64 childId); + +private: + void PositionText(int iPad,int iTextID, unsigned char ucAction); + void PositionTextDirect(int iPad,int iTextID, int iControlDetailsIndex, bool bShow); + void PositionAllText(int iPad); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_CraftingMenu.cpp b/Minecraft.Client/Common/UI/UIScene_CraftingMenu.cpp new file mode 100644 index 00000000..66d8c41e --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_CraftingMenu.cpp @@ -0,0 +1,787 @@ +#include "stdafx.h" +#include "UI.h" +#include "..\..\Minecraft.h" +#include "..\..\MultiplayerLocalPlayer.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" +#include "UIScene_CraftingMenu.h" + +#ifdef __PSVITA__ +#define GAME_CRAFTING_TOUCHUPDATE_TIMER_ID 0 +#define GAME_CRAFTING_TOUCHUPDATE_TIMER_TIME 100 +#endif + +UIScene_CraftingMenu::UIScene_CraftingMenu(int iPad, void *_initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + m_bIgnoreKeyPresses = false; + + CraftingPanelScreenInput* initData = (CraftingPanelScreenInput*)_initData; + m_iContainerType=initData->iContainerType; + m_pPlayer=initData->player; + m_bSplitscreen=initData->bSplitscreen; + + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + for(unsigned int i = 0; i < 4; ++i) m_labelIngredientsDesc[i].init(L""); + m_labelDescription.init(L""); + m_labelGroupName.init(L""); + m_labelItemName.init(L""); + m_labelInventory.init( app.GetString(IDS_INVENTORY) ); + m_labelIngredients.init( app.GetString(IDS_INGREDIENTS) ); + + if(m_iContainerType==RECIPE_TYPE_2x2) + { + m_menu = m_pPlayer->inventoryMenu; + m_iMenuInventoryStart = InventoryMenu::INV_SLOT_START; + m_iMenuHotBarStart = InventoryMenu::USE_ROW_SLOT_START; + } + else + { + CraftingMenu *menu = new CraftingMenu(m_pPlayer->inventory, m_pPlayer->level, initData->x, initData->y, initData->z); + Minecraft::GetInstance()->localplayers[m_iPad]->containerMenu = menu; + + m_menu = menu; + m_iMenuInventoryStart = CraftingMenu::INV_SLOT_START; + m_iMenuHotBarStart = CraftingMenu::USE_ROW_SLOT_START; + } + m_slotListInventory.addSlots(CRAFTING_INVENTORY_SLOT_START,CRAFTING_INVENTORY_SLOT_END - CRAFTING_INVENTORY_SLOT_START); + m_slotListHotBar.addSlots(CRAFTING_HOTBAR_SLOT_START, CRAFTING_HOTBAR_SLOT_END - CRAFTING_HOTBAR_SLOT_START); + +#if TO_BE_IMPLEMENTED + // if we are in splitscreen, then we need to figure out if we want to move this scene + if(m_bSplitscreen) + { + app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad); + } + + XuiElementSetShow(m_hGrid,TRUE); + XuiElementSetShow(m_hPanel,TRUE); +#endif + + if(m_iContainerType==RECIPE_TYPE_3x3) + { + m_iIngredientsMaxSlotC = m_iIngredients3x3SlotC; + m_pGroupA=(Recipy::_eGroupType *)&m_GroupTypeMapping9GridA; + m_pGroupTabA=(_eGroupTab *)&m_GroupTabBkgMapping3x3A; + m_iCraftablesMaxHSlotC=m_iMaxHSlot3x3C; + } + else + { + m_iIngredientsMaxSlotC = m_iIngredients2x2SlotC; + m_pGroupA=(Recipy::_eGroupType *)&m_GroupTypeMapping4GridA; + m_pGroupTabA=(_eGroupTab *)&m_GroupTabBkgMapping2x2A; + m_iCraftablesMaxHSlotC=m_iMaxHSlot2x2C; + } + +#if TO_BE_IMPLEMENTED + + + // display the first group tab + m_hTabGroupA[m_iGroupIndex].SetShow(TRUE); + + // store the slot 0 position + m_pHSlotsBrushImageControl[0]->GetPosition(&m_vSlot0Pos); + m_pHSlotsBrushImageControl[1]->GetPosition(&vec); + m_fSlotSize=vec.x-m_vSlot0Pos.x; + + // store the slot 0 highlight position + m_hHighlight.GetPosition(&m_vSlot0HighlightPos); + // Store the V slot position + m_hScrollBar2.GetPosition(&m_vSlot0V2ScrollPos); + m_hScrollBar3.GetPosition(&m_vSlot0V3ScrollPos); + + // get the position of the slot from the xui, and apply any offset needed + for(int i=0;iSetShow(FALSE); + } + + XuiElementSetShow(m_hGridInventory,FALSE); + + m_hScrollBar2.SetShow(FALSE); + m_hScrollBar3.SetShow(FALSE); + +#endif + + app.SetRichPresenceContext(m_iPad,CONTEXT_GAME_STATE_CRAFTING); + setGroupText(GetGroupNameText(m_pGroupA[m_iGroupIndex])); + + // Update the tutorial state + Minecraft *pMinecraft = Minecraft::GetInstance(); + + if( pMinecraft->localgameModes[m_iPad] != NULL ) + { + TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[m_iPad]; + m_previousTutorialState = gameMode->getTutorial()->getCurrentState(); + if(m_iContainerType==RECIPE_TYPE_2x2) + { + gameMode->getTutorial()->changeTutorialState(e_Tutorial_State_2x2Crafting_Menu, this); + } + else + { + gameMode->getTutorial()->changeTutorialState(e_Tutorial_State_3x3Crafting_Menu, this); + } + } + +#ifdef _TO_BE_IMPLEMENTED + XuiSetTimer(m_hObj,IGNORE_KEYPRESS_TIMERID,IGNORE_KEYPRESS_TIME); +#endif + + for(unsigned int i = 0; i < 4; ++i) + { + m_slotListIngredients[i].addSlot(CRAFTING_INGREDIENTS_DESCRIPTION_START + i); + } + m_slotListCraftingOutput.addSlot(CRAFTING_OUTPUT_SLOT_START); + m_slotListIngredientsLayout.addSlots(CRAFTING_INGREDIENTS_LAYOUT_START, m_iIngredientsMaxSlotC); + + // 3 Slot vertical scroll + m_slotListCrafting3VSlots[0].addSlot(CRAFTING_V_SLOT_START + 0); + m_slotListCrafting3VSlots[1].addSlot(CRAFTING_V_SLOT_START + 1); + m_slotListCrafting3VSlots[2].addSlot(CRAFTING_V_SLOT_START + 2); + + // 2 Slot vertical scroll + // 2 slot scroll has swapped order + m_slotListCrafting2VSlots[0].addSlot(CRAFTING_V_SLOT_START + 1); + m_slotListCrafting2VSlots[1].addSlot(CRAFTING_V_SLOT_START + 0); + + // 1 Slot scroll (for 480 mainly) + m_slotListCrafting1VSlots.addSlot(CRAFTING_V_SLOT_START); + + m_slotListCraftingHSlots.addSlots(CRAFTING_H_SLOT_START,m_iCraftablesMaxHSlotC); + + // Check which recipes are available with the resources we have + CheckRecipesAvailable(); + // reset the vertical slots + iVSlotIndexA[0]=CanBeMadeA[m_iCurrentSlotHIndex].iCount-1; + iVSlotIndexA[1]=0; + iVSlotIndexA[2]=1; + UpdateVerticalSlots(); + UpdateHighlight(); + + if(initData) delete initData; + + // in this scene, we override the press sound with our own for crafting success or fail + ui.OverrideSFX(m_iPad,ACTION_MENU_A,true); + ui.OverrideSFX(m_iPad,ACTION_MENU_OK,true); +#ifdef __ORBIS__ + ui.OverrideSFX(m_iPad,ACTION_MENU_TOUCHPAD_PRESS,true); +#endif + ui.OverrideSFX(m_iPad,ACTION_MENU_LEFT_SCROLL,true); + ui.OverrideSFX(m_iPad,ACTION_MENU_RIGHT_SCROLL,true); + ui.OverrideSFX(m_iPad,ACTION_MENU_LEFT,true); + ui.OverrideSFX(m_iPad,ACTION_MENU_RIGHT,true); + ui.OverrideSFX(m_iPad,ACTION_MENU_UP,true); + ui.OverrideSFX(m_iPad,ACTION_MENU_DOWN,true); + + // 4J-PB - Must be after the CanBeMade list has been set up with CheckRecipesAvailable + UpdateTooltips(); + +#ifdef __PSVITA__ + // initialise vita touch controls with ids + for(unsigned int i = 0; i < ETouchInput_Count; ++i) + { + m_TouchInput[i].init(i); + } + ui.TouchBoxRebuild(this); +#endif +} + +void UIScene_CraftingMenu::handleDestroy() +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + + if( pMinecraft->localgameModes[m_iPad] != NULL ) + { + TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[m_iPad]; + if(gameMode != NULL) gameMode->getTutorial()->changeTutorialState(m_previousTutorialState); + } + + // We need to make sure that we call closeContainer() anytime this menu is closed, even if it is forced to close by some other reason (like the player dying) + if(Minecraft::GetInstance()->localplayers[m_iPad] != NULL && Minecraft::GetInstance()->localplayers[m_iPad]->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); +#ifdef __ORBIS__ + ui.OverrideSFX(m_iPad,ACTION_MENU_TOUCHPAD_PRESS,false); +#endif + ui.OverrideSFX(m_iPad,ACTION_MENU_LEFT_SCROLL,false); + ui.OverrideSFX(m_iPad,ACTION_MENU_RIGHT_SCROLL,false); + ui.OverrideSFX(m_iPad,ACTION_MENU_LEFT,false); + ui.OverrideSFX(m_iPad,ACTION_MENU_RIGHT,false); + ui.OverrideSFX(m_iPad,ACTION_MENU_UP,false); + ui.OverrideSFX(m_iPad,ACTION_MENU_DOWN,false); +} + +EUIScene UIScene_CraftingMenu::getSceneType() +{ + if(m_iContainerType==RECIPE_TYPE_3x3) + { + return eUIScene_Crafting3x3Menu; + } + else + { + return eUIScene_Crafting2x2Menu; + } +} + +wstring UIScene_CraftingMenu::getMoviePath() +{ + if(app.GetLocalPlayerCount() > 1) + { + m_bSplitscreen = true; + if(m_iContainerType==RECIPE_TYPE_3x3) + { + return L"Crafting3x3MenuSplit"; + } + else + { + return L"Crafting2x2MenuSplit"; + } + } + else + { + if(m_iContainerType==RECIPE_TYPE_3x3) + { + return L"Crafting3x3Menu"; + } + else + { + return L"Crafting2x2Menu"; + } + } +} + +#ifdef __PSVITA__ +UIControl* UIScene_CraftingMenu::GetMainPanel() +{ + return &m_controlMainPanel; +} + +void UIScene_CraftingMenu::handleTouchInput(unsigned int iPad, S32 x, S32 y, int iId, bool bPressed, bool bRepeat, bool bReleased) +{ + // perform action on release + if(bPressed) + { + if(iId == ETouchInput_CraftingHSlots) + { + m_iCraftingSlotTouchStartY = y; + } + } + else if(bRepeat) + { + if(iId == ETouchInput_CraftingHSlots) + { + if(y >= m_iCraftingSlotTouchStartY + m_TouchInput[ETouchInput_CraftingHSlots].getHeight()) // scroll list down + { + if(iVSlotIndexA[1]==(CanBeMadeA[m_iCurrentSlotHIndex].iCount-1)) + { + iVSlotIndexA[1]=0; + } + else + { + iVSlotIndexA[1]++; + } + ui.PlayUISFX(eSFX_Focus); + + UpdateVerticalSlots(); + UpdateHighlight(); + + m_iCraftingSlotTouchStartY = y; + } + else if(y <= m_iCraftingSlotTouchStartY - m_TouchInput[ETouchInput_CraftingHSlots].getHeight()) // scroll list up + { + if(iVSlotIndexA[1]==0) + { + iVSlotIndexA[1]=CanBeMadeA[m_iCurrentSlotHIndex].iCount-1; + } + else + { + iVSlotIndexA[1]--; + } + ui.PlayUISFX(eSFX_Focus); + + UpdateVerticalSlots(); + UpdateHighlight(); + + m_iCraftingSlotTouchStartY = y; + } + } + } + else if(bReleased) + { + if(iId >= ETouchInput_TouchPanel_0 && iId <= ETouchInput_TouchPanel_6) // Touch Change Group + { + m_iGroupIndex = iId; + // turn on the new group + showTabHighlight(m_iGroupIndex,true); + + m_iCurrentSlotHIndex=0; + m_iCurrentSlotVIndex=1; + CheckRecipesAvailable(); + // reset the vertical slots + iVSlotIndexA[0]=CanBeMadeA[m_iCurrentSlotHIndex].iCount-1; + iVSlotIndexA[1]=0; + iVSlotIndexA[2]=1; + ui.PlayUISFX(eSFX_Focus); + UpdateVerticalSlots(); + UpdateHighlight(); + setGroupText(GetGroupNameText(m_pGroupA[m_iGroupIndex])); + } + else if(iId == ETouchInput_CraftingHSlots) // Touch Change Slot + { + int iMaxHSlots = 0; + if(m_iContainerType==RECIPE_TYPE_3x3) + { + iMaxHSlots = m_iMaxHSlot3x3C; + } + else + { + iMaxHSlots = m_iMaxHSlot2x2C; + } + + int iNewSlot = (x - m_TouchInput[ETouchInput_CraftingHSlots].getXPos() - m_controlMainPanel.getXPos()) / m_TouchInput[ETouchInput_CraftingHSlots].getHeight(); + + int iOldHSlot=m_iCurrentSlotHIndex; + + m_iCurrentSlotHIndex = iNewSlot; + if(m_iCurrentSlotHIndex>=m_iCraftablesMaxHSlotC) m_iCurrentSlotHIndex=0; + m_iCurrentSlotVIndex=1; + // clear the indices + iVSlotIndexA[0]=CanBeMadeA[m_iCurrentSlotHIndex].iCount-1; + iVSlotIndexA[1]=0; + iVSlotIndexA[2]=1; + + UpdateVerticalSlots(); + UpdateHighlight(); + // re-enable the old hslot + if(CanBeMadeA[iOldHSlot].iCount>0) + { + setShowCraftHSlot(iOldHSlot,true); + } + ui.PlayUISFX(eSFX_Focus); + } + } +} + +void UIScene_CraftingMenu::handleTouchBoxRebuild() +{ + addTimer(GAME_CRAFTING_TOUCHUPDATE_TIMER_ID,GAME_CRAFTING_TOUCHUPDATE_TIMER_TIME); +} + +void UIScene_CraftingMenu::handleTimerComplete(int id) +{ + if(id == GAME_CRAFTING_TOUCHUPDATE_TIMER_ID) + { + // we cannot rebuild touch boxes in an iggy callback because it requires further iggy calls + GetMainPanel()->UpdateControl(); + ui.TouchBoxRebuild(this); + killTimer(GAME_CRAFTING_TOUCHUPDATE_TIMER_ID); + } +} +#endif + +void UIScene_CraftingMenu::handleReload() +{ + m_slotListInventory.addSlots(CRAFTING_INVENTORY_SLOT_START,CRAFTING_INVENTORY_SLOT_END - CRAFTING_INVENTORY_SLOT_START); + m_slotListHotBar.addSlots(CRAFTING_HOTBAR_SLOT_START, CRAFTING_HOTBAR_SLOT_END - CRAFTING_HOTBAR_SLOT_START); + + for(unsigned int i = 0; i < 4; ++i) + { + m_slotListIngredients[i].addSlot(CRAFTING_INGREDIENTS_DESCRIPTION_START + i); + } + m_slotListCraftingOutput.addSlot(CRAFTING_OUTPUT_SLOT_START); + m_slotListIngredientsLayout.addSlots(CRAFTING_INGREDIENTS_LAYOUT_START, m_iIngredientsMaxSlotC); + + // 3 Slot vertical scroll + m_slotListCrafting3VSlots[0].addSlot(CRAFTING_V_SLOT_START + 0); + m_slotListCrafting3VSlots[1].addSlot(CRAFTING_V_SLOT_START + 1); + m_slotListCrafting3VSlots[2].addSlot(CRAFTING_V_SLOT_START + 2); + + // 2 Slot vertical scroll + // 2 slot scroll has swapped order + m_slotListCrafting2VSlots[0].addSlot(CRAFTING_V_SLOT_START + 1); + m_slotListCrafting2VSlots[1].addSlot(CRAFTING_V_SLOT_START + 0); + + // 1 Slot scroll (for 480 mainly) + m_slotListCrafting1VSlots.addSlot(CRAFTING_V_SLOT_START); + + m_slotListCraftingHSlots.addSlots(CRAFTING_H_SLOT_START,m_iCraftablesMaxHSlotC); + + app.DebugPrintf(app.USER_SR,"Reloading MultiPanel\n"); + int temp = m_iDisplayDescription; + m_iDisplayDescription = m_iDisplayDescription==0?1:0; + UpdateMultiPanel(); + m_iDisplayDescription = temp; + UpdateMultiPanel(); + + app.DebugPrintf(app.USER_SR,"Reloading Highlight and scroll\n"); + + // reset the vertical slots + m_iCurrentSlotHIndex = 0; + m_iCurrentSlotVIndex = 1; + iVSlotIndexA[0]=CanBeMadeA[m_iCurrentSlotHIndex].iCount-1; + iVSlotIndexA[1]=0; + iVSlotIndexA[2]=1; + UpdateVerticalSlots(); + UpdateHighlight(); + + app.DebugPrintf(app.USER_SR,"Reloading tabs\n"); + showTabHighlight(0,false); + showTabHighlight(m_iGroupIndex,true); +} + +void UIScene_CraftingMenu::customDraw(IggyCustomDrawCallbackRegion *region) +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + if(pMinecraft->localplayers[m_iPad] == NULL || pMinecraft->localgameModes[m_iPad] == NULL) return; + + shared_ptr item = nullptr; + int slotId = -1; + float alpha = 1.0f; + bool decorations = true; + bool inventoryItem = false; + swscanf((wchar_t*)region->name,L"slot_%d",&slotId); + if (slotId == -1) + { + app.DebugPrintf("This is not the control we are looking for\n"); + } + else if(slotId >= CRAFTING_INVENTORY_SLOT_START && slotId < CRAFTING_INVENTORY_SLOT_END) + { + int iIndex = slotId - CRAFTING_INVENTORY_SLOT_START; + iIndex += m_iMenuInventoryStart; + Slot *slot = m_menu->getSlot(iIndex); + item = slot->getItem(); + inventoryItem = true; + } + else if(slotId >= CRAFTING_HOTBAR_SLOT_START && slotId < CRAFTING_HOTBAR_SLOT_END) + { + int iIndex = slotId - CRAFTING_HOTBAR_SLOT_START; + iIndex += m_iMenuHotBarStart; + Slot *slot = m_menu->getSlot(iIndex); + item = slot->getItem(); + inventoryItem = true; + } + else if(slotId >= CRAFTING_V_SLOT_START && slotId < CRAFTING_V_SLOT_END ) + { + decorations = false; + int iIndex = slotId - CRAFTING_V_SLOT_START; + if(m_vSlotsInfo[iIndex].show) + { + item = m_vSlotsInfo[iIndex].item; + alpha = ((float)m_vSlotsInfo[iIndex].alpha)/31.0f; + } + } + else if(slotId >= CRAFTING_H_SLOT_START && slotId < (CRAFTING_H_SLOT_START + m_iCraftablesMaxHSlotC) ) + { + decorations = false; + int iIndex = slotId - CRAFTING_H_SLOT_START; + if(m_hSlotsInfo[iIndex].show) + { + item = m_hSlotsInfo[iIndex].item; + alpha = ((float)m_hSlotsInfo[iIndex].alpha)/31.0f; + } + } + else if(slotId >= CRAFTING_INGREDIENTS_LAYOUT_START && slotId < (CRAFTING_INGREDIENTS_LAYOUT_START + m_iIngredientsMaxSlotC) ) + { + int iIndex = slotId - CRAFTING_INGREDIENTS_LAYOUT_START; + if(m_ingredientsSlotsInfo[iIndex].show) + { + item = m_ingredientsSlotsInfo[iIndex].item; + alpha = ((float)m_ingredientsSlotsInfo[iIndex].alpha)/31.0f; + } + } + else if(slotId >= CRAFTING_INGREDIENTS_DESCRIPTION_START && slotId < (CRAFTING_INGREDIENTS_DESCRIPTION_START + 4) ) + { + int iIndex = slotId - CRAFTING_INGREDIENTS_DESCRIPTION_START; + if(m_ingredientsInfo[iIndex].show) + { + item = m_ingredientsInfo[iIndex].item; + alpha = ((float)m_ingredientsInfo[iIndex].alpha)/31.0f; + } + } + else if(slotId == CRAFTING_OUTPUT_SLOT_START ) + { + if(m_craftingOutputSlotInfo.show) + { + item = m_craftingOutputSlotInfo.item; + alpha = ((float)m_craftingOutputSlotInfo.alpha)/31.0f; + } + } + + if(item != NULL) + { + if(!inventoryItem) + { + if( item->id == Item::clock_Id || item->id == Item::compass_Id ) + { + // 4J Stu - For clocks and compasses we set the aux value to a special one that signals we should use a default texture + // rather than the dynamic one for the player + item->setAuxValue(0xFF); + } + else if( (item->getAuxValue() & 0xFF) == 0xFF) + { + // 4J Stu - If the aux value is set to match any + item->setAuxValue(0); + } + } + customDrawSlotControl(region,m_iPad,item,alpha,item->isFoil(),decorations); + } +} + +int UIScene_CraftingMenu::getPad() +{ + return m_iPad; +} + +bool UIScene_CraftingMenu::allowRepeat(int key) +{ + switch(key) + { + // X is used to open this menu, so don't let it repeat + case ACTION_MENU_X: + return false; + } + return true; +} + +void UIScene_CraftingMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + //app.DebugPrintf("UIScene_InventoryMenu handling input for pad %d, key %d, down- %s, pressed- %s, released- %s\n", iPad, key, down?"TRUE":"FALSE", pressed?"TRUE":"FALSE", released?"TRUE":"FALSE"); + ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); + + switch(key) + { + case ACTION_MENU_OTHER_STICK_UP: + case ACTION_MENU_OTHER_STICK_DOWN: + sendInputToMovie(key,repeat,pressed,released); + break; + default: + if(pressed) + { + handled = handleKeyDown(m_iPad, key, repeat); + } + break; + }; +} + +void UIScene_CraftingMenu::hideAllHSlots() +{ + for(unsigned int iIndex = 0; iIndex < m_iMaxHSlotC; ++iIndex) + { + m_hSlotsInfo[iIndex].item = nullptr; + m_hSlotsInfo[iIndex].alpha = 31; + m_hSlotsInfo[iIndex].show = false; + } +} + +void UIScene_CraftingMenu::hideAllVSlots() +{ + for(unsigned int iIndex = 0; iIndex < m_iMaxDisplayedVSlotC; ++iIndex) + { + m_vSlotsInfo[iIndex].item = nullptr; + m_vSlotsInfo[iIndex].alpha = 31; + m_vSlotsInfo[iIndex].show = false; + } +} + +void UIScene_CraftingMenu::hideAllIngredientsSlots() +{ + for(int i=0;i item, unsigned int uiAlpha) +{ + m_hSlotsInfo[iIndex].item = item; + m_hSlotsInfo[iIndex].alpha = uiAlpha; + m_hSlotsInfo[iIndex].show = true; +} + +void UIScene_CraftingMenu::setCraftVSlotItem(int iPad, int iIndex, shared_ptr item, unsigned int uiAlpha) +{ + m_vSlotsInfo[iIndex].item = item; + m_vSlotsInfo[iIndex].alpha = uiAlpha; + m_vSlotsInfo[iIndex].show = true; +} + +void UIScene_CraftingMenu::setCraftingOutputSlotItem(int iPad, shared_ptr item) +{ + m_craftingOutputSlotInfo.item = item; + m_craftingOutputSlotInfo.alpha = 31; + m_craftingOutputSlotInfo.show = item != NULL; +} + +void UIScene_CraftingMenu::setCraftingOutputSlotRedBox(bool show) +{ + m_slotListCraftingOutput.showSlotRedBox(0,show); +} + +void UIScene_CraftingMenu::setIngredientSlotItem(int iPad, int index, shared_ptr item) +{ + m_ingredientsSlotsInfo[index].item = item; + m_ingredientsSlotsInfo[index].alpha = 31; + m_ingredientsSlotsInfo[index].show = item != NULL; +} + +void UIScene_CraftingMenu::setIngredientSlotRedBox(int index, bool show) +{ + m_slotListIngredientsLayout.showSlotRedBox(index,show); +} + +void UIScene_CraftingMenu::setIngredientDescriptionItem(int iPad, int index, shared_ptr item) +{ + m_ingredientsInfo[index].item = item; + m_ingredientsInfo[index].alpha = 31; + m_ingredientsInfo[index].show = item != NULL; + + IggyDataValue result; + IggyDataValue value[2]; + + value[0].type = IGGY_DATATYPE_number; + value[0].number = index; + + value[1].type = IGGY_DATATYPE_boolean; + value[1].boolval = m_ingredientsInfo[index].show; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ) , m_funcShowIngredientSlot , 2 , value ); +} + +void UIScene_CraftingMenu::setIngredientDescriptionRedBox(int index, bool show) +{ + m_slotListIngredients[index].showSlotRedBox(0,show); +} + +void UIScene_CraftingMenu::setIngredientDescriptionText(int index, LPCWSTR text) +{ + m_labelIngredientsDesc[index].setLabel(text); +} + + +void UIScene_CraftingMenu::setShowCraftHSlot(int iIndex, bool show) +{ + m_hSlotsInfo[iIndex].show = show; +} + +void UIScene_CraftingMenu::showTabHighlight(int iIndex, bool show) +{ + if(show) + { + IggyDataValue result; + IggyDataValue value[1]; + + value[0].type = IGGY_DATATYPE_number; + value[0].number = iIndex; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ) , m_funcSetActiveTab , 1 , value ); + } +} + +void UIScene_CraftingMenu::setGroupText(LPCWSTR text) +{ + m_labelGroupName.setLabel(text); +} + +void UIScene_CraftingMenu::setDescriptionText(LPCWSTR text) +{ + m_labelDescription.setLabel(text); +} + +void UIScene_CraftingMenu::setItemText(LPCWSTR text) +{ + m_labelItemName.setLabel(text); +} + +void UIScene_CraftingMenu::UpdateMultiPanel() +{ + // Call Iggy function to show the current panel + IggyDataValue result; + IggyDataValue value[1]; + + value[0].type = IGGY_DATATYPE_number; + value[0].number = m_iDisplayDescription; + + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ) , m_funcShowPanelDisplay , 1 , value ); +} + +void UIScene_CraftingMenu::scrollDescriptionUp() +{ + // handled differently +} + +void UIScene_CraftingMenu::scrollDescriptionDown() +{ + // handled differently +} + +void UIScene_CraftingMenu::updateHighlightAndScrollPositions() +{ + { + IggyDataValue result; + IggyDataValue value[2]; + + value[0].type = IGGY_DATATYPE_number; + value[0].number = m_iCurrentSlotHIndex; + + int selectorType = 0; + if(CanBeMadeA[m_iCurrentSlotHIndex].iCount == 2) + { + selectorType = 1; + } + else if( CanBeMadeA[m_iCurrentSlotHIndex].iCount > 2) + { + selectorType = 2; + } + + value[1].type = IGGY_DATATYPE_number; + value[1].number = selectorType; + + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ) , m_funcMoveSelector , 2 , value ); + } + + { + IggyDataValue result; + IggyDataValue value[1]; + + value[0].type = IGGY_DATATYPE_number; + value[0].number = m_iCurrentSlotVIndex; + + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ) , m_funcSelectVerticalItem , 1 , value ); + } +} + +void UIScene_CraftingMenu::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 new file mode 100644 index 00000000..84c9ba65 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_CraftingMenu.h @@ -0,0 +1,211 @@ +#pragma once + +#include "UIScene.h" +#include "UIControl_SlotList.h" +#include "UIControl_Label.h" +#include "IUIScene_CraftingMenu.h" + +#define CRAFTING_INVENTORY_SLOT_START 0 +#define CRAFTING_INVENTORY_SLOT_END (CRAFTING_INVENTORY_SLOT_START + 27) + +#define CRAFTING_HOTBAR_SLOT_START CRAFTING_INVENTORY_SLOT_END +#define CRAFTING_HOTBAR_SLOT_END (CRAFTING_HOTBAR_SLOT_START + 9) + +// Ingredients etc should go here +#define CRAFTING_INGREDIENTS_DESCRIPTION_START CRAFTING_HOTBAR_SLOT_END +#define CRAFTING_INGREDEINTS_DESCRIPTION_END (CRAFTING_INGREDIENTS_DESCRIPTION_START + 4) + +#define CRAFTING_OUTPUT_SLOT_START CRAFTING_INGREDEINTS_DESCRIPTION_END +#define CRAFTING_OUTPUT_SLOT_END (CRAFTING_OUTPUT_SLOT_START + 1) + +#define CRAFTING_INGREDIENTS_LAYOUT_START CRAFTING_OUTPUT_SLOT_END +#define CRAFTING_INGREDIENTS_LAYOUT_END (CRAFTING_INGREDIENTS_LAYOUT_START+9) + +#define CRAFTING_V_SLOT_START CRAFTING_INGREDIENTS_LAYOUT_END +#define CRAFTING_V_SLOT_END (CRAFTING_V_SLOT_START+3) + +// H slots should go last in the count as it's dependent on which size of crafting panel we have +#define CRAFTING_H_SLOT_START CRAFTING_V_SLOT_END + +class UIScene_CraftingMenu : public UIScene, public IUIScene_CraftingMenu +{ +private: + typedef struct _SlotInfo + { + shared_ptr item; + unsigned int alpha; + bool show; + + _SlotInfo() + { + item = nullptr; + alpha = 31; + show = true; + } + } SlotInfo; + + SlotInfo m_hSlotsInfo[m_iMaxHSlotC]; + SlotInfo m_vSlotsInfo[m_iMaxDisplayedVSlotC]; + SlotInfo m_ingredientsSlotsInfo[m_iIngredients3x3SlotC]; + SlotInfo m_craftingOutputSlotInfo; + SlotInfo m_ingredientsInfo[4]; + + AbstractContainerMenu *m_menu; + + int m_iMenuInventoryStart; + int m_iMenuHotBarStart; + +public: + UIScene_CraftingMenu(int iPad, void *initData, UILayer *parentLayer); + + virtual void handleDestroy(); + + virtual EUIScene getSceneType(); + + virtual void customDraw(IggyCustomDrawCallbackRegion *region); + +#ifdef __PSVITA__ + virtual void handleTouchInput(unsigned int iPad, S32 x, S32 y, int iId, bool bPressed, bool bRepeat, bool bReleased); + virtual UIControl* GetMainPanel(); + virtual void handleTouchBoxRebuild(); + virtual void handleTimerComplete(int id); +#endif + +protected: + UIControl m_controlMainPanel; + UIControl m_control1Selector, m_control2Selector, m_control3Selector; + UIControl_SlotList m_slotListCraftingHSlots; + UIControl_SlotList m_slotListCrafting1VSlots, m_slotListCrafting2VSlots[2], m_slotListCrafting3VSlots[3]; + UIControl_SlotList m_slotListIngredientsLayout, m_slotListCraftingOutput; + UIControl_SlotList m_slotListIngredients[4]; + UIControl_SlotList m_slotListInventory, m_slotListHotBar; + UIControl_Label m_labelIngredientsDesc[4]; + UIControl_HTMLLabel m_labelDescription; + UIControl_Label m_labelGroupName, m_labelItemName, m_labelInventory, m_labelIngredients; + + IggyName m_funcMoveSelector, m_funcSelectVerticalItem, m_funcSetActiveTab; + IggyName m_funcShowPanelDisplay, m_funcShowIngredientSlot; + +#ifdef __PSVITA__ + enum ETouchInput + { + ETouchInput_TouchPanel_0, + ETouchInput_TouchPanel_1, + ETouchInput_TouchPanel_2, + ETouchInput_TouchPanel_3, + ETouchInput_TouchPanel_4, + ETouchInput_TouchPanel_5, + ETouchInput_TouchPanel_6, + ETouchInput_CraftingHSlots, + + ETouchInput_Count, + }; + UIControl_Touch m_TouchInput[ETouchInput_Count]; + S32 m_iCraftingSlotTouchStartY; +#endif + + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_controlMainPanel, "MainPanel" ) + UI_BEGIN_MAP_CHILD_ELEMENTS( m_controlMainPanel ) + UI_MAP_ELEMENT( m_slotListCraftingHSlots, "CraftingHSlots") + + UI_MAP_ELEMENT( m_control3Selector, "SlotSelector3" ) + UI_BEGIN_MAP_CHILD_ELEMENTS( m_control3Selector) + UI_MAP_ELEMENT( m_slotListCrafting3VSlots[0], "Crafting3VSlot1") + UI_MAP_ELEMENT( m_slotListCrafting3VSlots[1], "Crafting3VSlot2") + UI_MAP_ELEMENT( m_slotListCrafting3VSlots[2], "Crafting3VSlot3") + UI_END_MAP_CHILD_ELEMENTS() + + UI_MAP_ELEMENT( m_control2Selector, "SlotSelector2" ) + UI_BEGIN_MAP_CHILD_ELEMENTS( m_control2Selector) + UI_MAP_ELEMENT( m_slotListCrafting2VSlots[0], "Crafting2VSlot1") + UI_MAP_ELEMENT( m_slotListCrafting2VSlots[1], "Crafting2VSlot2") + UI_END_MAP_CHILD_ELEMENTS() + + UI_MAP_ELEMENT( m_control1Selector, "CraftingSelector" ) + UI_BEGIN_MAP_CHILD_ELEMENTS( m_control1Selector) + UI_MAP_ELEMENT( m_slotListCrafting1VSlots, "Crafting1VSlot1") + UI_END_MAP_CHILD_ELEMENTS() + + UI_MAP_ELEMENT( m_slotListIngredientsLayout, "IngredientsLayout") + UI_MAP_ELEMENT( m_slotListCraftingOutput, "CraftingOutput") + + UI_MAP_ELEMENT( m_slotListIngredients[0], "Ingredient1") + UI_MAP_ELEMENT( m_slotListIngredients[1], "Ingredient2") + UI_MAP_ELEMENT( m_slotListIngredients[2], "Ingredient3") + UI_MAP_ELEMENT( m_slotListIngredients[3], "Ingredient4") + + UI_MAP_ELEMENT( m_labelIngredientsDesc[0], "Ingredient1Desc") + UI_MAP_ELEMENT( m_labelIngredientsDesc[1], "Ingredient2Desc") + UI_MAP_ELEMENT( m_labelIngredientsDesc[2], "Ingredient3Desc") + UI_MAP_ELEMENT( m_labelIngredientsDesc[3], "Ingredient4Desc") + + UI_MAP_ELEMENT( m_labelIngredients, "IngredientsLabel") + + UI_MAP_ELEMENT( m_labelDescription, "DescriptionText") + + UI_MAP_ELEMENT( m_slotListInventory, "Inventory") + UI_MAP_ELEMENT( m_slotListHotBar, "HotBar") + + UI_MAP_ELEMENT( m_labelGroupName, "GroupName") + UI_MAP_ELEMENT( m_labelItemName, "ItemName") + UI_MAP_ELEMENT( m_labelInventory, "InventoryLabel") + + UI_MAP_NAME( m_funcMoveSelector, L"MoveSelector") + UI_MAP_NAME( m_funcSelectVerticalItem, L"SelectVerticalItem") + UI_MAP_NAME( m_funcSetActiveTab, L"SetActiveTab") + UI_MAP_NAME( m_funcShowPanelDisplay, L"showPanelDisplay") + UI_MAP_NAME( m_funcShowIngredientSlot, L"ShowIngredient") + +#ifdef __PSVITA__ + UI_MAP_ELEMENT( m_TouchInput[ETouchInput_TouchPanel_0], "TouchPanel_0" ) + UI_MAP_ELEMENT( m_TouchInput[ETouchInput_TouchPanel_1], "TouchPanel_1" ) + UI_MAP_ELEMENT( m_TouchInput[ETouchInput_TouchPanel_2], "TouchPanel_2" ) + UI_MAP_ELEMENT( m_TouchInput[ETouchInput_TouchPanel_3], "TouchPanel_3" ) + UI_MAP_ELEMENT( m_TouchInput[ETouchInput_TouchPanel_4], "TouchPanel_4" ) + UI_MAP_ELEMENT( m_TouchInput[ETouchInput_TouchPanel_5], "TouchPanel_5" ) + UI_MAP_ELEMENT( m_TouchInput[ETouchInput_TouchPanel_6], "TouchPanel_6" ) + UI_MAP_ELEMENT( m_TouchInput[ETouchInput_CraftingHSlots], "TouchPanel_CraftingHSlots" ) +#endif + + UI_END_MAP_CHILD_ELEMENTS() + UI_END_MAP_ELEMENTS_AND_NAMES() + + virtual wstring getMoviePath(); + virtual void handleReload(); + + virtual bool allowRepeat(int key); + void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + +protected: + virtual int getPad(); + virtual void hideAllHSlots(); + virtual void hideAllVSlots(); + virtual void hideAllIngredientsSlots(); + virtual void setCraftHSlotItem(int iPad, int iIndex, shared_ptr item, unsigned int uiAlpha); + virtual void setCraftVSlotItem(int iPad, int iIndex, shared_ptr item, unsigned int uiAlpha); + virtual void setCraftingOutputSlotItem(int iPad, shared_ptr item); + virtual void setCraftingOutputSlotRedBox(bool show); + virtual void setIngredientSlotItem(int iPad, int index, shared_ptr item); + virtual void setIngredientSlotRedBox(int index, bool show); + virtual void setIngredientDescriptionItem(int iPad, int index, shared_ptr item); + virtual void setIngredientDescriptionRedBox(int index, bool show); + virtual void setIngredientDescriptionText(int index, LPCWSTR text); + virtual void setShowCraftHSlot(int iIndex, bool show); + virtual void showTabHighlight(int iIndex, bool show); + virtual void setGroupText(LPCWSTR text); + virtual void setDescriptionText(LPCWSTR text); + virtual void setItemText(LPCWSTR text); + virtual void scrollDescriptionUp(); + virtual void scrollDescriptionDown(); + virtual void updateHighlightAndScrollPositions(); + virtual void updateVSlotPositions(int iSlots, int i); + + virtual void UpdateMultiPanel(); + + 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 new file mode 100644 index 00000000..1a81bb77 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_CreateWorldMenu.cpp @@ -0,0 +1,1444 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_CreateWorldMenu.h" +#include "..\..\MinecraftServer.h" +#include "..\..\Minecraft.h" +#include "..\..\Options.h" +#include "..\..\TexturePackRepository.h" +#include "..\..\TexturePack.h" +#include "..\..\..\Minecraft.World\LevelSettings.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\..\Minecraft.World\BiomeSource.h" +#include "..\..\..\Minecraft.World\IntCache.h" +#include "..\..\..\Minecraft.World\LevelType.h" +#include "..\..\DLCTexturePack.h" + +#ifdef __PSVITA__ +#include "PSVita\Network\SQRNetworkManager_AdHoc_Vita.h" +#endif + +#ifdef _WINDOWS64 + +#include +#include "Xbox\Resource.h" +#endif + +#define GAME_CREATE_ONLINE_TIMER_ID 0 +#define GAME_CREATE_ONLINE_TIMER_TIME 100 + +int UIScene_CreateWorldMenu::m_iDifficultyTitleSettingA[4]= +{ + IDS_DIFFICULTY_TITLE_PEACEFUL, + IDS_DIFFICULTY_TITLE_EASY, + IDS_DIFFICULTY_TITLE_NORMAL, + IDS_DIFFICULTY_TITLE_HARD +}; + +UIScene_CreateWorldMenu::UIScene_CreateWorldMenu(int iPad, void *initData, UILayer *parentLayer) : IUIScene_StartGame(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + m_worldName = app.GetString(IDS_DEFAULT_WORLD_NAME); + m_seed = L""; + + m_iPad=iPad; + + m_labelWorldName.init(app.GetString(IDS_WORLD_NAME)); + + m_editWorldName.init(m_worldName, eControl_EditWorldName); + + m_buttonGamemode.init(app.GetString(IDS_GAMEMODE_SURVIVAL),eControl_GameModeToggle); + m_buttonMoreOptions.init(app.GetString(IDS_MORE_OPTIONS),eControl_MoreOptions); + m_buttonCreateWorld.init(app.GetString(IDS_CREATE_NEW_WORLD),eControl_NewWorld); + + m_texturePackList.init(app.GetString(IDS_DLC_MENU_TEXTUREPACKS), eControl_TexturePackList); + + m_labelTexturePackName.init(L""); + m_labelTexturePackDescription.init(L""); + + WCHAR TempString[256]; + swprintf( (WCHAR *)TempString, 256, L"%ls: %ls", app.GetString( IDS_SLIDER_DIFFICULTY ),app.GetString(m_iDifficultyTitleSettingA[app.GetGameSettings(m_iPad,eGameSetting_Difficulty)])); + m_sliderDifficulty.init(TempString,eControl_Difficulty,0,3,app.GetGameSettings(m_iPad,eGameSetting_Difficulty)); + + m_MoreOptionsParams.bGenerateOptions=TRUE; + m_MoreOptionsParams.bStructures=TRUE; + m_MoreOptionsParams.bFlatWorld=FALSE; + m_MoreOptionsParams.bBonusChest=FALSE; + m_MoreOptionsParams.bPVP = TRUE; + m_MoreOptionsParams.bTrust = TRUE; + m_MoreOptionsParams.bFireSpreads = TRUE; + m_MoreOptionsParams.bHostPrivileges = FALSE; + m_MoreOptionsParams.bTNT = TRUE; + m_MoreOptionsParams.iPad = iPad; + + m_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; + + m_bMultiplayerAllowed = ProfileManager.IsSignedInLive( m_iPad ) && ProfileManager.AllowedToPlayMultiplayer(m_iPad); + // 4J-PB - read the settings for the online flag. We'll only save this setting if the user changed it. + bool bGameSetting_Online=(app.GetGameSettings(m_iPad,eGameSetting_Online)!=0); + m_MoreOptionsParams.bOnlineSettingChangedBySystem=false; + + // 4J-PB - Removing this so that we can attempt to create an online game on PS3 when we are a restricted child account + // It'll fail when we choose create, but this matches the behaviour of load game, and lets the player know why they can't play online, + // instead of just greying out the online setting in the More Options + // #ifdef __PS3__ + // if(ProfileManager.IsSignedInLive( m_iPad )) + // { + // ProfileManager.GetChatAndContentRestrictions(m_iPad,true,&bChatRestricted,&bContentRestricted,NULL); + // } + // #endif + + // Set the text for friends of friends, and default to on + if( m_bMultiplayerAllowed ) + { + m_MoreOptionsParams.bOnlineGame = bGameSetting_Online?TRUE:FALSE; + if(bGameSetting_Online) + { + m_MoreOptionsParams.bInviteOnly = (app.GetGameSettings(m_iPad,eGameSetting_InviteOnly)!=0)?TRUE:FALSE; + m_MoreOptionsParams.bAllowFriendsOfFriends = (app.GetGameSettings(m_iPad,eGameSetting_FriendsOfFriends)!=0)?TRUE:FALSE; + } + else + { + m_MoreOptionsParams.bInviteOnly = FALSE; + m_MoreOptionsParams.bAllowFriendsOfFriends = FALSE; + } + } + else + { + m_MoreOptionsParams.bOnlineGame = FALSE; + m_MoreOptionsParams.bInviteOnly = FALSE; + m_MoreOptionsParams.bAllowFriendsOfFriends = FALSE; + if(bGameSetting_Online) + { + // The profile settings say Online, but either the player is offline, or they are not allowed to play online + m_MoreOptionsParams.bOnlineSettingChangedBySystem=true; + } + } + + // 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); + + addTimer( GAME_CREATE_ONLINE_TIMER_ID,GAME_CREATE_ONLINE_TIMER_TIME ); +#if TO_BE_IMPLEMENTED + XuiSetTimer(m_hObj,CHECKFORAVAILABLETEXTUREPACKS_TIMER_ID,CHECKFORAVAILABLETEXTUREPACKS_TIMER_TIME); +#endif + + TelemetryManager->RecordMenuShown(m_iPad, eUIScene_CreateWorldMenu, 0); + + // block input if we're waiting for DLC to install, and wipe the saves list. The end of dlc mounting custom message will fill the list again + if(app.StartInstallDLCProcess(m_iPad)==true) + { + // not doing a mount, so enable input + m_bIgnoreInput=true; + } + else + { + m_bIgnoreInput = false; + + Minecraft *pMinecraft = Minecraft::GetInstance(); + int texturePacksCount = pMinecraft->skins->getTexturePackCount(); + for(unsigned int i = 0; i < texturePacksCount; ++i) + { + TexturePack *tp = pMinecraft->skins->getTexturePackByIndex(i); + + DWORD dwImageBytes; + PBYTE pbImageData = tp->getPackIcon(dwImageBytes); + + if(dwImageBytes > 0 && pbImageData) + { + wchar_t imageName[64]; + swprintf(imageName,64,L"tpack%08x",tp->getId()); + registerSubstitutionTexture(imageName, pbImageData, dwImageBytes); + m_texturePackList.addPack(i,imageName); + app.DebugPrintf("Adding texture pack %ls at %d\n",imageName,i); + } + } + +#if TO_BE_IMPLEMENTED + // 4J-PB - there may be texture packs we don't have, so use the info from TMS for this + + DLC_INFO *pDLCInfo=NULL; + + // first pass - look to see if there are any that are not in the list + bool bTexturePackAlreadyListed; + bool bNeedToGetTPD=false; + + for(unsigned int i = 0; i < app.GetDLCInfoTexturesOffersCount(); ++i) + { + bTexturePackAlreadyListed=false; + ULONGLONG ull=app.GetDLCInfoTexturesFullOffer(i); + pDLCInfo=app.GetDLCInfoForFullOfferID(ull); + for(unsigned int i = 0; i < texturePacksCount; ++i) + { + TexturePack *tp = pMinecraft->skins->getTexturePackByIndex(i); + if(pDLCInfo->iConfig==tp->getDLCParentPackId()) + { + bTexturePackAlreadyListed=true; + } + } + if(bTexturePackAlreadyListed==false) + { + // some missing + bNeedToGetTPD=true; + + m_iTexturePacksNotInstalled++; + } + } + + if(bNeedToGetTPD==true) + { + // add a TMS request for them + app.DebugPrintf("+++ Adding TMSPP request for texture pack data\n"); + app.AddTMSPPFileTypeRequest(e_DLC_TexturePackData); + m_iConfigA= new int [m_iTexturePacksNotInstalled]; + m_iTexturePacksNotInstalled=0; + + for(unsigned int i = 0; i < app.GetDLCInfoTexturesOffersCount(); ++i) + { + bTexturePackAlreadyListed=false; + ULONGLONG ull=app.GetDLCInfoTexturesFullOffer(i); + pDLCInfo=app.GetDLCInfoForFullOfferID(ull); + for(unsigned int i = 0; i < texturePacksCount; ++i) + { + TexturePack *tp = pMinecraft->skins->getTexturePackByIndex(i); + if(pDLCInfo->iConfig==tp->getDLCParentPackId()) + { + bTexturePackAlreadyListed=true; + } + } + if(bTexturePackAlreadyListed==false) + { + m_iConfigA[m_iTexturePacksNotInstalled++]=pDLCInfo->iConfig; + } + } + } +#endif + + UpdateTexturePackDescription(m_currentTexturePackIndex); + + + m_texturePackList.selectSlot(m_currentTexturePackIndex); + } +} + +UIScene_CreateWorldMenu::~UIScene_CreateWorldMenu() +{ +} + +void UIScene_CreateWorldMenu::updateTooltips() +{ + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); +} + +void UIScene_CreateWorldMenu::updateComponents() +{ + m_parentLayer->showComponent(m_iPad,eUIComponent_Panorama,true); + m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,false); +} + +wstring UIScene_CreateWorldMenu::getMoviePath() +{ + return L"CreateWorldMenu"; +} + +UIControl* UIScene_CreateWorldMenu::GetMainPanel() +{ + return &m_controlMainPanel; +} + +void UIScene_CreateWorldMenu::handleDestroy() +{ +#ifdef __PSVITA__ + app.DebugPrintf("missing InputManager.DestroyKeyboard on Vita !!!!!!\n"); +#endif + + // shut down the keyboard if it is displayed +#if ( defined __PS3__ || defined __ORBIS__ || defined _DURANGO) + InputManager.DestroyKeyboard(); +#endif +} + +void UIScene_CreateWorldMenu::tick() +{ + UIScene::tick(); + + if(m_iSetTexturePackDescription >= 0 ) + { + UpdateTexturePackDescription( m_iSetTexturePackDescription ); + m_iSetTexturePackDescription = -1; + } + if(m_bShowTexturePackDescription) + { + slideLeft(); + m_texturePackDescDisplayed = true; + + m_bShowTexturePackDescription = false; + } + +#ifdef __ORBIS__ + // check the status of the PSPlus common dialog + switch (sceNpCommerceDialogUpdateStatus()) + { + case SCE_COMMON_DIALOG_STATUS_FINISHED: + { + SceNpCommerceDialogResult Result; + sceNpCommerceDialogGetResult(&Result); + sceNpCommerceDialogTerminate(); + + if(Result.authorized) + { + ProfileManager.PsPlusUpdate(ProfileManager.GetPrimaryPad(), &Result); + // they just became a PSPlus member + checkStateAndStartGame(); + } + else + { + // continue offline? + UINT uiIDA[1]; + uiIDA[0]=IDS_PRO_NOTONLINE_DECLINE; + + // Give the player a warning about the texture pack missing + ui.RequestAlertMessage(IDS_PLAY_OFFLINE,IDS_NO_PLAYSTATIONPLUS, uiIDA, 1, ProfileManager.GetPrimaryPad(),&UIScene_CreateWorldMenu::ContinueOffline,dynamic_cast(this)); + } + } + break; + default: + break; + } +#endif +} + +#ifdef __ORBIS__ +int UIScene_CreateWorldMenu::ContinueOffline(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + UIScene_CreateWorldMenu* pClass = (UIScene_CreateWorldMenu*)pParam; + + // results switched for this dialog + if(result==C4JStorage::EMessage_ResultAccept) + { + pClass->m_MoreOptionsParams.bOnlineGame=false; + pClass->checkStateAndStartGame(); + } + return 0; +} + +#endif + +void UIScene_CreateWorldMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + if(m_bIgnoreInput) return; + + ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); + + switch(key) + { + case ACTION_MENU_CANCEL: + if(pressed) + { + navigateBack(); + handled = true; + } + break; + case ACTION_MENU_OK: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + + // 4J-JEV: Inform user why their game must be offline. +#if defined _XBOX_ONE + if ( pressed && controlHasFocus(m_checkboxOnline.getId()) && !m_checkboxOnline.IsEnabled() ) + { + UINT uiIDA[1] = { IDS_CONFIRM_OK }; + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1, iPad); + } +#endif + + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + case ACTION_MENU_LEFT: + case ACTION_MENU_RIGHT: + case ACTION_MENU_OTHER_STICK_UP: + case ACTION_MENU_OTHER_STICK_DOWN: + sendInputToMovie(key, repeat, pressed, released); + + 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; + } + } + + handled = true; + break; + } +} + +void UIScene_CreateWorldMenu::handlePress(F64 controlId, F64 childId) +{ + if(m_bIgnoreInput) return; + + //CD - Added for audio + ui.PlayUISFX(eSFX_Press); + + switch((int)controlId) + { + case eControl_EditWorldName: + { + m_bIgnoreInput=true; + InputManager.RequestKeyboard(app.GetString(IDS_CREATE_NEW_WORLD),m_editWorldName.getLabel(),(DWORD)0,25,&UIScene_CreateWorldMenu::KeyboardCompleteWorldNameCallback,this,C_4JInput::EKeyboardMode_Default); + } + break; + case eControl_GameModeToggle: + switch(m_iGameModeId) + { + case 0: // Survival + m_buttonGamemode.setLabel(app.GetString(IDS_GAMEMODE_CREATIVE)); + m_iGameModeId = GameType::CREATIVE->getId(); + m_bGameModeCreative = true; + break; + case 1: // Creative + m_buttonGamemode.setLabel(app.GetString(IDS_GAMEMODE_SURVIVAL)); + m_iGameModeId = GameType::SURVIVAL->getId(); + m_bGameModeCreative = false; + break; + }; + break; + case eControl_MoreOptions: + ui.NavigateToScene(m_iPad, eUIScene_LaunchMoreOptionsMenu, &m_MoreOptionsParams); + break; + case eControl_TexturePackList: + { + UpdateCurrentTexturePack((int)childId); + } + break; + case eControl_NewWorld: + { +#ifdef _DURANGO + if(m_MoreOptionsParams.bOnlineGame) + { + m_bIgnoreInput = true; + ProfileManager.CheckMultiplayerPrivileges(m_iPad, true, &checkPrivilegeCallback, this); + } + else +#endif + { + StartSharedLaunchFlow(); + } + break; + } + } +} + +#ifdef _DURANGO +void UIScene_CreateWorldMenu::checkPrivilegeCallback(LPVOID lpParam, bool hasPrivilege, int iPad) +{ + UIScene_CreateWorldMenu* pClass = (UIScene_CreateWorldMenu*)lpParam; + + if(hasPrivilege) + { + pClass->StartSharedLaunchFlow(); + } + else + { + pClass->m_bIgnoreInput = false; + } +} +#endif + +void UIScene_CreateWorldMenu::StartSharedLaunchFlow() +{ + Minecraft *pMinecraft=Minecraft::GetInstance(); + // Check if we need to upsell the texture pack + if(m_MoreOptionsParams.dwTexturePack!=0) + { + // texture pack hasn't been set yet, so check what it will be + TexturePack *pTexturePack = pMinecraft->skins->getTexturePackById(m_MoreOptionsParams.dwTexturePack); + + if(pTexturePack==NULL) + { +#if TO_BE_IMPLEMENTED + // They've selected a texture pack they don't have yet + // upsell + CXuiCtrl4JList::LIST_ITEM_INFO ListItem; + // get the current index of the list, and then get the data + ListItem=m_pTexturePacksList->GetData(m_currentTexturePackIndex); + + + // upsell the texture pack + // tell sentient about the upsell of the full version of the skin pack + ULONGLONG ullOfferID_Full; + app.GetDLCFullOfferIDForPackID(m_MoreOptionsParams.dwTexturePack,&ullOfferID_Full); + + TelemetryManager->RecordUpsellPresented(ProfileManager.GetPrimaryPad(), eSet_UpsellID_Texture_DLC, ullOfferID_Full & 0xFFFFFFFF); +#endif + + UINT uiIDA[2]; + + uiIDA[0]=IDS_TEXTUREPACK_FULLVERSION; + //uiIDA[1]=IDS_TEXTURE_PACK_TRIALVERSION; + uiIDA[1]=IDS_CONFIRM_CANCEL; + + // Give the player a warning about the texture pack missing + ui.RequestAlertMessage(IDS_DLC_TEXTUREPACK_NOT_PRESENT_TITLE, IDS_DLC_TEXTUREPACK_NOT_PRESENT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&TexturePackDialogReturned,this); + return; + } + } + m_bIgnoreInput = true; + + // if the profile data has been changed, then force a profile write (we save the online/invite/friends of friends settings) + // It seems we're allowed to break the 5 minute rule if it's the result of a user action + // check the checkboxes + + // Only save the online setting if the user changed it - we may change it because we're offline, but don't want that saved + if(!m_MoreOptionsParams.bOnlineSettingChangedBySystem) + { + app.SetGameSettings(m_iPad,eGameSetting_Online,m_MoreOptionsParams.bOnlineGame?1:0); + } + app.SetGameSettings(m_iPad,eGameSetting_InviteOnly,m_MoreOptionsParams.bInviteOnly?1:0); + app.SetGameSettings(m_iPad,eGameSetting_FriendsOfFriends,m_MoreOptionsParams.bAllowFriendsOfFriends?1:0); + + app.CheckGameSettingsChanged(true,m_iPad); + + // Check that we have the rights to use a texture pack we have selected. + if(m_MoreOptionsParams.dwTexturePack!=0) + { + // texture pack hasn't been set yet, so check what it will be + TexturePack *pTexturePack = pMinecraft->skins->getTexturePackById(m_MoreOptionsParams.dwTexturePack); + DLCTexturePack *pDLCTexPack=(DLCTexturePack *)pTexturePack; + m_pDLCPack=pDLCTexPack->getDLCInfoParentPack(); + + // do we have a license? + if(m_pDLCPack && !m_pDLCPack->hasPurchasedFile( DLCManager::e_DLCType_Texture, L"" )) + { + // no + + // We need to allow people to use a trial texture pack if they are offline - we only need them online if they want to buy it. + + /* + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + + if(!ProfileManager.IsSignedInLive(m_iPad)) + { + // need to be signed in to live + ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1); + m_bIgnoreInput = false; + return; + } + else */ + { + // upsell +#ifdef _XBOX + DLC_INFO *pDLCInfo = app.GetDLCInfoForTrialOfferID(m_pDLCPack->getPurchaseOfferId()); + ULONGLONG ullOfferID_Full; + + if(pDLCInfo!=NULL) + { + ullOfferID_Full=pDLCInfo->ullOfferID_Full; + } + else + { + ullOfferID_Full=pTexturePack->getDLCPack()->getPurchaseOfferId(); + } + + // tell sentient about the upsell of the full version of the texture pack + TelemetryManager->RecordUpsellPresented(m_iPad, eSet_UpsellID_Texture_DLC, ullOfferID_Full & 0xFFFFFFFF); +#endif + +#if defined(_DURANGO) || defined(_WINDOWS64) + // trial pack warning + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.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.RequestAlertMessage(IDS_WARNING_DLC_TRIALTEXTUREPACK_TITLE, IDS_USING_TRIAL_TEXUREPACK_WARNING, uiIDA, 2, m_iPad,&TrialTexturePackWarningReturned,this); +#endif + +#if defined _XBOX_ONE || defined __ORBIS__ + StorageManager.SetSaveDisabled(true); +#endif + return; + } + } + } +#if defined _XBOX_ONE || defined __ORBIS__ + app.SetGameHostOption(eGameHostOption_DisableSaving, m_MoreOptionsParams.bDisableSaving?1:0); + StorageManager.SetSaveDisabled(m_MoreOptionsParams.bDisableSaving); +#endif + checkStateAndStartGame(); +} + +void UIScene_CreateWorldMenu::handleSliderMove(F64 sliderId, F64 currentValue) +{ + WCHAR TempString[256]; + int value = (int)currentValue; + switch((int)sliderId) + { + case eControl_Difficulty: + m_sliderDifficulty.handleSliderMove(value); + + app.SetGameSettings(m_iPad,eGameSetting_Difficulty,value); + swprintf( (WCHAR *)TempString, 256, L"%ls: %ls", app.GetString( IDS_SLIDER_DIFFICULTY ),app.GetString(m_iDifficultyTitleSettingA[value])); + m_sliderDifficulty.setLabel(TempString); + break; + } +} + +void UIScene_CreateWorldMenu::handleTimerComplete(int id) +{ +#ifdef __PSVITA__ + // we cannot rebuild touch boxes in an iggy callback because it requires further iggy calls + if(m_bRebuildTouchBoxes) + { + GetMainPanel()->UpdateControl(); + ui.TouchBoxRebuild(this); + m_bRebuildTouchBoxes = false; + } +#endif + + switch(id) + { + case GAME_CREATE_ONLINE_TIMER_ID: + { + bool bMultiplayerAllowed = ProfileManager.IsSignedInLive( m_iPad ) && ProfileManager.AllowedToPlayMultiplayer(m_iPad); + + if(bMultiplayerAllowed != m_bMultiplayerAllowed) + { + if( bMultiplayerAllowed ) + { + bool bGameSetting_Online=(app.GetGameSettings(m_iPad,eGameSetting_Online)!=0); + m_MoreOptionsParams.bOnlineGame = bGameSetting_Online?TRUE:FALSE; + if(bGameSetting_Online) + { + m_MoreOptionsParams.bInviteOnly = (app.GetGameSettings(m_iPad,eGameSetting_InviteOnly)!=0)?TRUE:FALSE; + m_MoreOptionsParams.bAllowFriendsOfFriends = (app.GetGameSettings(m_iPad,eGameSetting_FriendsOfFriends)!=0)?TRUE:FALSE; + } + else + { + m_MoreOptionsParams.bInviteOnly = FALSE; + m_MoreOptionsParams.bAllowFriendsOfFriends = FALSE; + } + } + else + { + m_MoreOptionsParams.bOnlineGame = FALSE; + m_MoreOptionsParams.bInviteOnly = FALSE; + m_MoreOptionsParams.bAllowFriendsOfFriends = FALSE; + } + + m_checkboxOnline.SetEnable(bMultiplayerAllowed); + m_checkboxOnline.setChecked(m_MoreOptionsParams.bOnlineGame); + + m_bMultiplayerAllowed = bMultiplayerAllowed; + } + } + break; + // 4J-PB - Only Xbox will not have trial DLC patched into the game +#ifdef _XBOX + case CHECKFORAVAILABLETEXTUREPACKS_TIMER_ID: + { + // also check for any new texture packs info being available + // for each item in the mem list, check it's in the data list + + CXuiCtrl4JList::LIST_ITEM_INFO ListInfo; + // for each iConfig, check if the data is available, and add it to the List, then remove it from the viConfig + for(int i=0;i 0 && pbData) + { + DWORD dwImageBytes=0; + PBYTE pbImageData=NULL; + + app.GetFileFromTPD(eTPDFileType_Icon,pbData,dwBytes,&pbImageData,&dwImageBytes ); + ListInfo.fEnabled = TRUE; + ListInfo.iData = m_iConfigA[i]; + HRESULT hr=XuiCreateTextureBrushFromMemory(pbImageData,dwImageBytes,&ListInfo.hXuiBrush); + app.DebugPrintf("Adding texturepack %d from TPD\n",m_iConfigA[i]); + + m_pTexturePacksList->AddData(ListInfo); + + m_iConfigA[i]=-1; + } + } + } + } + break; +#endif + }; +} + +void UIScene_CreateWorldMenu::handleGainFocus(bool navBack) +{ + if(navBack) + { + m_checkboxOnline.setChecked(m_MoreOptionsParams.bOnlineGame); + } +} + +int UIScene_CreateWorldMenu::KeyboardCompleteWorldNameCallback(LPVOID lpParam,bool bRes) +{ + UIScene_CreateWorldMenu *pClass=(UIScene_CreateWorldMenu *)lpParam; + pClass->m_bIgnoreInput=false; + // 4J HEG - No reason to set value if keyboard was cancelled + if (bRes) + { + uint16_t pchText[128]; + ZeroMemory(pchText, 128 * sizeof(uint16_t) ); + InputManager.GetText(pchText); + + if(pchText[0]!=0) + { + pClass->m_editWorldName.setLabel((wchar_t *)pchText); + pClass->m_worldName = (wchar_t *)pchText; + } + + pClass->m_buttonCreateWorld.setEnable( !pClass->m_worldName.empty() ); + } + return 0; +} + +void UIScene_CreateWorldMenu::checkStateAndStartGame() +{ + int primaryPad = ProfileManager.GetPrimaryPad(); + bool isSignedInLive = true; + bool isOnlineGame = m_MoreOptionsParams.bOnlineGame; + int iPadNotSignedInLive = -1; + bool isLocalMultiplayerAvailable = app.IsLocalMultiplayerAvailable(); + + for(unsigned int i = 0; i < XUSER_MAX_COUNT; i++) + { + if (ProfileManager.IsSignedIn(i) && (i == primaryPad || isLocalMultiplayerAvailable)) + { + if (isSignedInLive && !ProfileManager.IsSignedInLive(i)) + { + // Record the first non signed in live pad + iPadNotSignedInLive = i; + } + + isSignedInLive = isSignedInLive && ProfileManager.IsSignedInLive(i); + } + } + + // If this is an online game but not all players are signed in to Live, stop! + if (isOnlineGame && !isSignedInLive) + { +#ifdef __ORBIS__ + assert(iPadNotSignedInLive != -1); + + // Check if PSN is unavailable because of age restriction + int npAvailability = ProfileManager.getNPAvailability(iPadNotSignedInLive); + if (npAvailability == SCE_NP_ERROR_AGE_RESTRICTION) + { + m_bIgnoreInput = false; + // 4J Stu - This is a bit messy and is due to the library incorrectly returning false for IsSignedInLive if the npAvailability isn't SCE_OK + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPadNotSignedInLive); + } + else + { + m_bIgnoreInput = true; + UINT uiIDA[2]; + uiIDA[0] = IDS_PRO_NOTONLINE_ACCEPT; + uiIDA[1] = IDS_CANCEL; + ui.RequestAlertMessage( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, iPadNotSignedInLive, &UIScene_CreateWorldMenu::MustSignInReturnedPSN, this); + } + return; +/* 4J-PB - Add this after release +#elif defined __PSVITA__ + m_bIgnoreInput=false; + // Determine why they're not "signed in live" + if (ProfileManager.IsSignedInPSN(ProfileManager.GetPrimaryPad())) + { + // Signed in to PSN but not connected (no internet access) + UINT uiIDA[1]; + uiIDA[0] = IDS_CONFIRM_OK; + ui.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.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.RequestAlertMessage( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA,1,ProfileManager.GetPrimaryPad()); + return; +#endif + } + +#ifdef __ORBIS__ + + bool bPlayStationPlus = true; + int iPadWithNoPlaystationPlus=0; + if(isOnlineGame && isSignedInLive) + { + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + if(ProfileManager.IsSignedIn(i) && (i == primaryPad || isLocalMultiplayerAvailable)) + { + if(ProfileManager.HasPlayStationPlus(i)==false) + { + bPlayStationPlus=false; + iPadWithNoPlaystationPlus=i; + break; + } + } + } + + if(bPlayStationPlus==false) + { + m_bIgnoreInput=false; + + 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(); + + SceNpCommerceDialogParam param; + sceNpCommerceDialogParamInitialize(¶m); + param.mode=SCE_NP_COMMERCE_DIALOG_MODE_PLUS; + param.features = SCE_NP_PLUS_FEATURE_REALTIME_MULTIPLAY; + param.userId = ProfileManager.getUserID(iPadWithNoPlaystationPlus); + + iResult=sceNpCommerceDialogOpen(¶m); + +// UINT uiIDA[2]; +// uiIDA[0]=IDS_PLAY_OFFLINE; +// uiIDA[1]=IDS_PLAYSTATIONPLUS_SIGNUP; +// ui.RequestMessageBox( IDS_FAILED_TO_CREATE_GAME_TITLE, IDS_NO_PLAYSTATIONPLUS, uiIDA,2,ProfileManager.GetPrimaryPad(),&UIScene_CreateWorldMenu::PSPlusReturned,this, app.GetStringTable(),NULL,0,false); + return; + } + } +#endif + + if(m_bGameModeCreative == true || m_MoreOptionsParams.bHostPrivileges == TRUE) + { + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_OK; + uiIDA[1]=IDS_CONFIRM_CANCEL; + if(m_bGameModeCreative == true) + { + ui.RequestAlertMessage(IDS_TITLE_START_GAME, IDS_CONFIRM_START_CREATIVE, uiIDA, 2, m_iPad,&UIScene_CreateWorldMenu::ConfirmCreateReturned,this); + } + else + { + ui.RequestAlertMessage(IDS_TITLE_START_GAME, IDS_CONFIRM_START_HOST_PRIVILEGES, uiIDA, 2, m_iPad,&UIScene_CreateWorldMenu::ConfirmCreateReturned,this); + } + } + else + { + // 4J Stu - If we only have one controller connected, then don't show the sign-in UI again + DWORD connectedControllers = 0; + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + if( InputManager.IsPadConnected(i) || ProfileManager.IsSignedIn(i) ) ++connectedControllers; + } + + // Check if user-created content is allowed, as we cannot play multiplayer if it's not + //bool isClientSide = ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad()) && m_MoreOptionsParams.bOnlineGame; + bool noUGC = false; + BOOL pccAllowed = TRUE; + BOOL pccFriendsAllowed = TRUE; + bool bContentRestricted = false; + + ProfileManager.AllowedPlayerCreatedContent(ProfileManager.GetPrimaryPad(),false,&pccAllowed,&pccFriendsAllowed); +#if defined(__PS3__) || defined(__PSVITA__) + if(isOnlineGame && isSignedInLive) + { + ProfileManager.GetChatAndContentRestrictions(ProfileManager.GetPrimaryPad(),false,NULL,&bContentRestricted,NULL); + } +#endif + + noUGC = !pccAllowed && !pccFriendsAllowed; + + if(isOnlineGame && isSignedInLive && app.IsLocalMultiplayerAvailable()) + { + // 4J-PB not sure why we aren't checking the content restriction for the main player here when multiple controllers are connected - adding now + if(noUGC ) + { + m_bIgnoreInput=false; + ui.RequestUGCMessageBox(); + } + else if(bContentRestricted ) + { + m_bIgnoreInput=false; + ui.RequestContentRestrictedMessageBox(); + } +#ifdef __ORBIS__ + else if(bPlayStationPlus==false) + { + m_bIgnoreInput=false; + + 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(); + + SceNpCommerceDialogParam param; + sceNpCommerceDialogParamInitialize(¶m); + param.mode=SCE_NP_COMMERCE_DIALOG_MODE_PLUS; + param.features = SCE_NP_PLUS_FEATURE_REALTIME_MULTIPLAY; + param.userId = ProfileManager.getUserID(iPadWithNoPlaystationPlus); + + iResult=sceNpCommerceDialogOpen(¶m); +// UINT uiIDA[2]; +// uiIDA[0]=IDS_PLAY_OFFLINE; +// uiIDA[1]=IDS_PLAYSTATIONPLUS_SIGNUP; +// ui.RequestMessageBox( IDS_FAILED_TO_CREATE_GAME_TITLE, IDS_NO_PLAYSTATIONPLUS, uiIDA,2,ProfileManager.GetPrimaryPad(),&UIScene_CreateWorldMenu::PSPlusReturned,this, app.GetStringTable(),NULL,0,false); + } + +#endif + else + { + //ProfileManager.RequestSignInUI(false, false, false, true, false,&CScene_MultiGameCreate::StartGame_SignInReturned, this,ProfileManager.GetPrimaryPad()); + SignInInfo info; + info.Func = &UIScene_CreateWorldMenu::StartGame_SignInReturned; + info.lpParam = this; + info.requireOnline = m_MoreOptionsParams.bOnlineGame; + ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_QuadrantSignin,&info); + } + } + else + { + if(!pccAllowed && !pccFriendsAllowed) noUGC = true; + + if(isOnlineGame && isSignedInLive && noUGC ) + { + m_bIgnoreInput=false; + ui.RequestUGCMessageBox(); + } + else if(isOnlineGame && isSignedInLive && bContentRestricted ) + { + m_bIgnoreInput=false; + ui.RequestContentRestrictedMessageBox(); + } +#ifdef __ORBIS__ + else if(isOnlineGame && isSignedInLive && (bPlayStationPlus==false)) + { + m_bIgnoreInput=false; + 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! + // upsell psplus + int32_t iResult=sceNpCommerceDialogInitialize(); + + SceNpCommerceDialogParam param; + sceNpCommerceDialogParamInitialize(¶m); + param.mode=SCE_NP_COMMERCE_DIALOG_MODE_PLUS; + param.features = SCE_NP_PLUS_FEATURE_REALTIME_MULTIPLAY; + param.userId = ProfileManager.getUserID(iPadWithNoPlaystationPlus); + + iResult=sceNpCommerceDialogOpen(¶m); + +// UINT uiIDA[2]; +// uiIDA[0]=IDS_PLAY_OFFLINE; +// uiIDA[1]=IDS_PLAYSTATIONPLUS_SIGNUP; +// ui.RequestMessageBox( IDS_FAILED_TO_CREATE_GAME_TITLE, IDS_NO_PLAYSTATIONPLUS, uiIDA,2,ProfileManager.GetPrimaryPad(),&UIScene_CreateWorldMenu::PSPlusReturned,this, app.GetStringTable(),NULL,0,false); + } + +#endif + else + { +#if defined(__ORBIS__) || defined(__PSVITA__) + if(isOnlineGame) + { + bool chatRestricted = false; + ProfileManager.GetChatAndContentRestrictions(ProfileManager.GetPrimaryPad(),false,&chatRestricted,NULL,NULL); + if(chatRestricted) + { + ProfileManager.DisplaySystemMessage( SCE_MSG_DIALOG_SYSMSG_TYPE_TRC_PSN_CHAT_RESTRICTION, ProfileManager.GetPrimaryPad() ); + } + } +#endif + CreateGame(this, 0); + } + } + } + +} + +// 4J Stu - Shared functionality that is the same whether we needed a quadrant sign-in or not +void UIScene_CreateWorldMenu::CreateGame(UIScene_CreateWorldMenu* pClass, DWORD dwLocalUsersMask) +{ +#if TO_BE_IMPLEMENTED + // stop the timer running that causes a check for new texture packs in TMS but not installed, since this will run all through the create game, and will crash if it tries to create an hbrush + XuiKillTimer(pClass->m_hObj,CHECKFORAVAILABLETEXTUREPACKS_TIMER_ID); +#endif + + bool isClientSide = ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad()) && pClass->m_MoreOptionsParams.bOnlineGame; +#ifdef __PSVITA__ + if(CGameNetworkManager::usingAdhocMode()) + { + if(SQRNetworkManager_AdHoc_Vita::GetAdhocStatus())// && pClass->m_MoreOptionsParams.bOnlineGame) + isClientSide = true; + } +#endif // __PSVITA__ + + bool isPrivate = pClass->m_MoreOptionsParams.bInviteOnly?true:false; + + // clear out the app's terrain features list + app.ClearTerrainFeaturePosition(); + + // create the world and launch + wstring wWorldName = pClass->m_worldName; + + StorageManager.ResetSaveData(); + // Make our next save default to the name of the level + StorageManager.SetSaveTitle((wchar_t *)wWorldName.c_str()); + + wstring wSeed; + if(!pClass->m_MoreOptionsParams.seed.empty() ) + { + wSeed=pClass->m_MoreOptionsParams.seed; + } + else + { + // random + wSeed=L""; + } + + // start the game + bool isFlat = (pClass->m_MoreOptionsParams.bFlatWorld==TRUE); + __int64 seedValue = 0; + + NetworkGameInitData *param = new NetworkGameInitData(); + + if (wSeed.length() != 0) + { + __int64 value = 0; + unsigned int len = (unsigned int)wSeed.length(); + + //Check if the input string contains a numerical value + bool isNumber = true; + for( unsigned int i = 0 ; i < len ; ++i ) + { + if( wSeed.at(i) < L'0' || wSeed.at(i) > L'9' ) + { + if( !(i==0 && wSeed.at(i) == L'-' ) ) + { + isNumber = false; + break; + } + } + } + + //If the input string is a numerical value, convert it to a number + if( isNumber ) + value = _fromString<__int64>(wSeed); + + //If the value is not 0 use it, otherwise use the algorithm from the java String.hashCode() function to hash it + if( value != 0 ) + seedValue = value; + else + { + int hashValue = 0; + for( unsigned int i = 0 ; i < len ; ++i ) + hashValue = 31 * hashValue + wSeed.at(i); + seedValue = hashValue; + } + } + else + { + param->findSeed = true; // 4J - java code sets the seed to was (new Random())->nextLong() here - we used to at this point find a suitable seed, but now just set a flag so this is performed in Minecraft::Server::initServer. + } + + + param->seed = seedValue; + param->saveData = NULL; + param->texturePackId = pClass->m_MoreOptionsParams.dwTexturePack; + + Minecraft *pMinecraft = Minecraft::GetInstance(); + pMinecraft->skins->selectTexturePackById(pClass->m_MoreOptionsParams.dwTexturePack); + + app.SetGameHostOption(eGameHostOption_Difficulty,Minecraft::GetInstance()->options->difficulty); + app.SetGameHostOption(eGameHostOption_FriendsOfFriends,pClass->m_MoreOptionsParams.bAllowFriendsOfFriends); + app.SetGameHostOption(eGameHostOption_Gamertags,app.GetGameSettings(pClass->m_iPad,eGameSetting_GamertagsVisible)?1:0); + + app.SetGameHostOption(eGameHostOption_BedrockFog,app.GetGameSettings(pClass->m_iPad,eGameSetting_BedrockFog)?1:0); + + app.SetGameHostOption(eGameHostOption_GameType,pClass->m_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 ); + + app.SetGameHostOption(eGameHostOption_PvP,pClass->m_MoreOptionsParams.bPVP); + app.SetGameHostOption(eGameHostOption_TrustPlayers,pClass->m_MoreOptionsParams.bTrust ); + app.SetGameHostOption(eGameHostOption_FireSpreads,pClass->m_MoreOptionsParams.bFireSpreads ); + app.SetGameHostOption(eGameHostOption_TNT,pClass->m_MoreOptionsParams.bTNT ); + app.SetGameHostOption(eGameHostOption_HostCanFly,pClass->m_MoreOptionsParams.bHostPrivileges); + app.SetGameHostOption(eGameHostOption_HostCanChangeHunger,pClass->m_MoreOptionsParams.bHostPrivileges); + app.SetGameHostOption(eGameHostOption_HostCanBeInvisible,pClass->m_MoreOptionsParams.bHostPrivileges ); + + 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); + + param->settings = app.GetGameHostOption( eGameHostOption_All ); + +#ifdef _LARGE_WORLDS + switch(pClass->m_MoreOptionsParams.worldSize) + { + case 0: + // Classic + param->xzSize = LEVEL_WIDTH_CLASSIC; + param->hellScale = HELL_LEVEL_SCALE_CLASSIC; // hellsize = 54/3 = 18 + break; + case 1: + // Small + param->xzSize = LEVEL_WIDTH_SMALL; + param->hellScale = HELL_LEVEL_SCALE_SMALL; // hellsize = ceil(64/3) = 22 + break; + case 2: + // Medium + param->xzSize = LEVEL_WIDTH_MEDIUM; + param->hellScale = HELL_LEVEL_SCALE_MEDIUM; // hellsize= ceil(3*64/6) = 32 + break; + case 3: + // Large + param->xzSize = LEVEL_WIDTH_LARGE; + param->hellScale = HELL_LEVEL_SCALE_LARGE; // hellsize = ceil(5*64/8) = 40 + break; + }; +#else + param->xzSize = LEVEL_MAX_WIDTH; + param->hellScale = HELL_LEVEL_MAX_SCALE; +#endif + +#ifndef _XBOX + g_NetworkManager.FakeLocalPlayerJoined(); +#endif + + LoadingInputParams *loadingParams = new LoadingInputParams(); + loadingParams->func = &CGameNetworkManager::RunNetworkGameThreadProc; + loadingParams->lpParam = (LPVOID)param; + + // Reset the autosave time + app.SetAutosaveTimerTime(); + + UIFullscreenProgressCompletionData *completionData = new UIFullscreenProgressCompletionData(); + completionData->bShowBackground=TRUE; + completionData->bShowLogo=TRUE; + completionData->type = e_ProgressCompletion_CloseAllPlayersUIScenes; + completionData->iPad = DEFAULT_XUI_MENU_USER; + loadingParams->completionData = completionData; + + ui.NavigateToScene(pClass->m_iPad,eUIScene_FullscreenProgress, loadingParams); +} + + +int UIScene_CreateWorldMenu::StartGame_SignInReturned(void *pParam,bool bContinue, int iPad) +{ + UIScene_CreateWorldMenu* pClass = (UIScene_CreateWorldMenu*)pParam; + + if(bContinue==true) + { + // It's possible that the player has not signed in - they can back out + if(ProfileManager.IsSignedIn(pClass->m_iPad)) + { + bool isOnlineGame = ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad()) && pClass->m_MoreOptionsParams.bOnlineGame; + // bool isOnlineGame = pClass->m_MoreOptionsParams.bOnlineGame; + int primaryPad = ProfileManager.GetPrimaryPad(); + bool noPrivileges = false; + DWORD dwLocalUsersMask = 0; + bool isSignedInLive = ProfileManager.IsSignedInLive(primaryPad); + int iPadNotSignedInLive = -1; + bool isLocalMultiplayerAvailable = app.IsLocalMultiplayerAvailable(); + + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + if (ProfileManager.IsSignedIn(i) && ((i == primaryPad) || isLocalMultiplayerAvailable)) + { + if (isSignedInLive && !ProfileManager.IsSignedInLive(i)) + { + // Record the first non signed in live pad + iPadNotSignedInLive = i; + } + + if( !ProfileManager.AllowedToPlayMultiplayer(i) ) noPrivileges = true; + dwLocalUsersMask |= CGameNetworkManager::GetLocalPlayerMask(i); + isSignedInLive = isSignedInLive && ProfileManager.IsSignedInLive(i); + } + } + + // If this is an online game but not all players are signed in to Live, stop! + if (isOnlineGame && !isSignedInLive) + { +#ifdef __ORBIS__ + assert(iPadNotSignedInLive != -1); + + // Check if PSN is unavailable because of age restriction + int npAvailability = ProfileManager.getNPAvailability(iPadNotSignedInLive); + if (npAvailability == SCE_NP_ERROR_AGE_RESTRICTION) + { + pClass->m_bIgnoreInput = false; + // 4J Stu - This is a bit messy and is due to the library incorrectly returning false for IsSignedInLive if the npAvailability isn't SCE_OK + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + ui.RequestAlertMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPadNotSignedInLive); + } + else + { + pClass->m_bIgnoreInput=true; + UINT uiIDA[2]; + uiIDA[0] = IDS_PRO_NOTONLINE_ACCEPT; + uiIDA[1] = IDS_CANCEL; + 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.RequestAlertMessage( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA,1,ProfileManager.GetPrimaryPad()); + return 0; +#endif + } + + // Check if user-created content is allowed, as we cannot play multiplayer if it's not + bool noUGC = false; + BOOL pccAllowed = TRUE; + BOOL pccFriendsAllowed = TRUE; + + ProfileManager.AllowedPlayerCreatedContent(ProfileManager.GetPrimaryPad(),false,&pccAllowed,&pccFriendsAllowed); + if(!pccAllowed && !pccFriendsAllowed) noUGC = true; + + if(isOnlineGame && (noPrivileges || noUGC) ) + { + if( noUGC ) + { + pClass->m_bIgnoreInput = false; + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.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.RequestAlertMessage( IDS_NO_MULTIPLAYER_PRIVILEGE_TITLE, IDS_NO_MULTIPLAYER_PRIVILEGE_HOST_TEXT, uiIDA,1,ProfileManager.GetPrimaryPad()); + } + } + else + { + // This is NOT called from a storage manager thread, and is in fact called from the main thread in the Profile library tick. Therefore we use the main threads IntCache. + CreateGame(pClass, dwLocalUsersMask); + } + } + } + else + { + pClass->m_bIgnoreInput = false; + } + return 0; +} + + +int UIScene_CreateWorldMenu::ConfirmCreateReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + UIScene_CreateWorldMenu* pClass = (UIScene_CreateWorldMenu*)pParam; + + if(result==C4JStorage::EMessage_ResultAccept) + { + bool isClientSide = ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad()) && pClass->m_MoreOptionsParams.bOnlineGame; + + // 4J Stu - If we only have one controller connected, then don't show the sign-in UI again + DWORD connectedControllers = 0; + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + if( InputManager.IsPadConnected(i) || ProfileManager.IsSignedIn(i) ) ++connectedControllers; + } + + if(isClientSide && app.IsLocalMultiplayerAvailable()) + { + //ProfileManager.RequestSignInUI(false, false, false, true, false,&UIScene_CreateWorldMenu::StartGame_SignInReturned, pClass,ProfileManager.GetPrimaryPad()); + SignInInfo info; + info.Func = &UIScene_CreateWorldMenu::StartGame_SignInReturned; + info.lpParam = pClass; + info.requireOnline = pClass->m_MoreOptionsParams.bOnlineGame; + ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_QuadrantSignin,&info); + } + else + { + // Check if user-created content is allowed, as we cannot play multiplayer if it's not + bool isClientSide = ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad()) && pClass->m_MoreOptionsParams.bOnlineGame; + bool noUGC = false; + BOOL pccAllowed = TRUE; + BOOL pccFriendsAllowed = TRUE; + + ProfileManager.AllowedPlayerCreatedContent(ProfileManager.GetPrimaryPad(),false,&pccAllowed,&pccFriendsAllowed); + if(!pccAllowed && !pccFriendsAllowed) noUGC = true; + + if(isClientSide && noUGC ) + { + pClass->m_bIgnoreInput = false; + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestAlertMessage( IDS_FAILED_TO_CREATE_GAME_TITLE, IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_CREATE, uiIDA,1,ProfileManager.GetPrimaryPad()); + } + else + { +#if defined( __ORBIS__) || defined(__PSVITA__) + bool isOnlineGame = ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad()) && pClass->m_MoreOptionsParams.bOnlineGame; + if(isOnlineGame) + { + bool chatRestricted = false; + ProfileManager.GetChatAndContentRestrictions(ProfileManager.GetPrimaryPad(),false,&chatRestricted,NULL,NULL); + if(chatRestricted) + { + ProfileManager.DisplaySystemMessage( SCE_MSG_DIALOG_SYSMSG_TYPE_TRC_PSN_CHAT_RESTRICTION, ProfileManager.GetPrimaryPad() ); + } + } +#endif + CreateGame(pClass, 0); + } + } + } + else + { + pClass->m_bIgnoreInput = false; + } + return 0; +} + +#ifdef __ORBIS__ +int UIScene_CreateWorldMenu::MustSignInReturnedPSN(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + UIScene_CreateWorldMenu* pClass = (UIScene_CreateWorldMenu *)pParam; + pClass->m_bIgnoreInput = false; + + if(result==C4JStorage::EMessage_ResultAccept) + { + SQRNetworkManager_Orbis::AttemptPSNSignIn(&UIScene_CreateWorldMenu::StartGame_SignInReturned, pClass, false, iPad); + } + + return 0; +} + +// int UIScene_CreateWorldMenu::PSPlusReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +// { +// int32_t iResult; +// UIScene_CreateWorldMenu *pClass = (UIScene_CreateWorldMenu *)pParam; +// +// // continue offline, or upsell PS Plus? +// if(result==C4JStorage::EMessage_ResultDecline) +// { +// // upsell psplus +// int32_t iResult=sceNpCommerceDialogInitialize(); +// +// SceNpCommerceDialogParam param; +// sceNpCommerceDialogParamInitialize(¶m); +// param.mode=SCE_NP_COMMERCE_DIALOG_MODE_PLUS; +// param.features = SCE_NP_PLUS_FEATURE_REALTIME_MULTIPLAY; +// param.userId = ProfileManager.getUserID(pClass->m_iPad); +// +// iResult=sceNpCommerceDialogOpen(¶m); +// } +// else if(result==C4JStorage::EMessage_ResultAccept) +// { +// // continue offline +// pClass->m_MoreOptionsParams.bOnlineGame=false; +// pClass->checkStateAndStartGame(); +// } +// +// pClass->m_bIgnoreInput=false; +// return 0; +// } +#endif + + +void UIScene_CreateWorldMenu::handleTouchBoxRebuild() +{ + m_bRebuildTouchBoxes = true; +} diff --git a/Minecraft.Client/Common/UI/UIScene_CreateWorldMenu.h b/Minecraft.Client/Common/UI/UIScene_CreateWorldMenu.h new file mode 100644 index 00000000..d6ae1c04 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_CreateWorldMenu.h @@ -0,0 +1,105 @@ +#pragma once + +#include "IUIScene_StartGame.h" + +class UIScene_CreateWorldMenu : public IUIScene_StartGame +{ +private: + enum EControls + { + eControl_EditWorldName, + eControl_TexturePackList, + eControl_GameModeToggle, + eControl_Difficulty, + eControl_MoreOptions, + eControl_NewWorld, + eControl_OnlineGame, + }; + + static int m_iDifficultyTitleSettingA[4]; + + + wstring m_worldName; + wstring m_seed; + + UIControl m_controlMainPanel; + UIControl_Label m_labelWorldName; + UIControl_Button m_buttonGamemode, m_buttonMoreOptions, m_buttonCreateWorld; + UIControl_TextInput m_editWorldName; + UIControl_Slider m_sliderDifficulty; + UIControl_CheckBox m_checkboxOnline; + + UIControl_BitmapIcon m_bitmapIcon, m_bitmapComparison; + + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(IUIScene_StartGame) + UI_MAP_ELEMENT( m_controlMainPanel, "MainPanel" ) + UI_BEGIN_MAP_CHILD_ELEMENTS( m_controlMainPanel ) + UI_MAP_ELEMENT( m_labelWorldName, "WorldName") + UI_MAP_ELEMENT( m_editWorldName, "EditWorldName") + UI_MAP_ELEMENT( m_texturePackList, "TexturePackSelector") + UI_MAP_ELEMENT( m_buttonGamemode, "GameModeToggle") + UI_MAP_ELEMENT( m_checkboxOnline, "CheckboxOnline") + 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_bGameModeCreative; + int m_iGameModeId; + bool m_bMultiplayerAllowed; + DLCPack * m_pDLCPack; + bool m_bRebuildTouchBoxes; + +public: + UIScene_CreateWorldMenu(int iPad, void *initData, UILayer *parentLayer); + virtual ~UIScene_CreateWorldMenu(); + + virtual void updateTooltips(); + virtual void updateComponents(); + + virtual EUIScene getSceneType() { return eUIScene_CreateWorldMenu;} + + virtual void handleDestroy(); + virtual void tick(); + + virtual UIControl* GetMainPanel(); + + virtual void handleTouchBoxRebuild(); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + + virtual void handleTimerComplete(int id); + virtual void handleGainFocus(bool navBack); + +public: + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + +private: + void StartSharedLaunchFlow(); + bool IsLocalMultiplayerAvailable(); + +#ifdef _DURANGO + static void checkPrivilegeCallback(LPVOID lpParam, bool hasPrivilege, int iPad); +#endif + +protected: + static int KeyboardCompleteWorldNameCallback(LPVOID lpParam,const bool bRes); + void handlePress(F64 controlId, F64 childId); + void handleSliderMove(F64 sliderId, F64 currentValue); + + static void CreateGame(UIScene_CreateWorldMenu* pClass, DWORD dwLocalUsersMask); + static int ConfirmCreateReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int StartGame_SignInReturned(void *pParam,bool bContinue, int iPad); + static int MustSignInReturnedPSN(void *pParam,int iPad,C4JStorage::EMessageResult result); + +#ifdef __ORBIS__ + //static int PSPlusReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int ContinueOffline(void *pParam,int iPad,C4JStorage::EMessageResult result); +#endif + + virtual void checkStateAndStartGame(); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_CreativeMenu.cpp b/Minecraft.Client/Common/UI/UIScene_CreativeMenu.cpp new file mode 100644 index 00000000..0895cdff --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_CreativeMenu.cpp @@ -0,0 +1,477 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_CreativeMenu.h" + +#include "..\Minecraft.World\JavaMath.h" +#include "..\..\LocalPlayer.h" +#include "..\Tutorial\Tutorial.h" +#include "..\Tutorial\TutorialMode.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.h" + +#ifdef __PSVITA__ +#define GAME_CREATIVE_TOUCHUPDATE_TIMER_ID 0 +#define GAME_CREATIVE_TOUCHUPDATE_TIMER_TIME 100 +#endif + +UIScene_CreativeMenu::UIScene_CreativeMenu(int iPad, void *_initData, UILayer *parentLayer) : UIScene_AbstractContainerMenu(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + InventoryScreenInput *initData = (InventoryScreenInput *)_initData; + + shared_ptr creativeContainer = shared_ptr(new SimpleContainer( 0, L"", false, TabSpec::MAX_SIZE )); + itemPickerMenu = new ItemPickerMenu(creativeContainer, initData->player->inventory); + + Initialize( initData->iPad, itemPickerMenu, false, -1, eSectionInventoryCreativeUsing, eSectionInventoryCreativeMax, initData->bNavigateBack); + + m_labelInventory.setLabel( L"" ); + m_bFirstCall=true; + + //m_slotListContainer.addSlots(0,TabSpec::MAX_SIZE); + //m_slotListHotbar.addSlots(TabSpec::MAX_SIZE,TabSpec::MAX_SIZE + 9); + for(unsigned int i = 0; i < TabSpec::MAX_SIZE; ++i) + { + m_slotListContainer.addSlot(i); + } + + for(unsigned int i = TabSpec::MAX_SIZE; i < TabSpec::MAX_SIZE + 9; ++i) + { + m_slotListHotbar.addSlot(i); + } + + Minecraft *pMinecraft = Minecraft::GetInstance(); + if( pMinecraft->localgameModes[initData->iPad] != NULL ) + { + TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[initData->iPad]; + m_previousTutorialState = gameMode->getTutorial()->getCurrentState(); + gameMode->getTutorial()->changeTutorialState(e_Tutorial_State_Creative_Inventory_Menu, this); + } + + if(initData) delete initData; + + m_curTab = eCreativeInventoryTab_COUNT; + switchTab(eCreativeInventoryTab_BuildingBlocks); + +#ifdef __PSVITA__ + // initialise vita touch controls with ids + for(unsigned int i = 0; i < ETouchInput_Count; ++i) + { + m_TouchInput[i].init(i); + } +#endif +} + +wstring UIScene_CreativeMenu::getMoviePath() +{ + if(app.GetLocalPlayerCount() > 1) + { + return L"CreativeMenuSplit"; + } + else + { + return L"CreativeMenu"; + } +} + +#ifdef __PSVITA__ +UIControl* UIScene_CreativeMenu::GetMainPanel() +{ + return &m_controlMainPanel; +} + +void UIScene_CreativeMenu::handleTouchInput(unsigned int iPad, S32 x, S32 y, int iId, bool bPressed, bool bRepeat, bool bReleased) +{ + // perform action on release + if(bReleased) + { + if(iId >= eCreativeInventoryTab_BuildingBlocks && iId <= eCreativeInventoryTab_Misc) + { + switchTab((ECreativeInventoryTabs)iId); + ui.PlayUISFX(eSFX_Focus); + } + } + if(bRepeat && iId == ETouchInput_TouchSlider && specs[m_curTab]->getPageCount() > 1) + { + // calculate relative touch position on slider + float fPosition = ((float)y - (float)m_TouchInput[ETouchInput_TouchSlider].getYPos() - m_controlMainPanel.getYPos()) / (float)m_TouchInput[ETouchInput_TouchSlider].getHeight(); + + // clamp + if(fPosition > 1) + fPosition = 1.0f; + else if(fPosition < 0) + fPosition = 0.0f; + + // calculate page position according to page count + int iCurrentPage = Math::round(fPosition * (specs[m_curTab]->getPageCount() - 1)); + + // set tab page + m_tabPage[m_curTab] = iCurrentPage; + + // update tab + switchTab(m_curTab); + } +} + +void UIScene_CreativeMenu::handleTouchBoxRebuild() +{ + addTimer(GAME_CREATIVE_TOUCHUPDATE_TIMER_ID,GAME_CREATIVE_TOUCHUPDATE_TIMER_TIME); +} + +void UIScene_CreativeMenu::handleTimerComplete(int id) +{ + if(id == GAME_CREATIVE_TOUCHUPDATE_TIMER_ID) + { + // we cannot rebuild touch boxes in an iggy callback because it requires further iggy calls + GetMainPanel()->UpdateControl(); + ui.TouchBoxRebuild(this); + killTimer(GAME_CREATIVE_TOUCHUPDATE_TIMER_ID); + } +} +#endif + +void UIScene_CreativeMenu::handleOtherClicked(int iPad, ESceneSection eSection, int buttonNum, bool quickKey) +{ + switch(eSection) + { + case eSectionInventoryCreativeTab_0: + case eSectionInventoryCreativeTab_1: + case eSectionInventoryCreativeTab_2: + case eSectionInventoryCreativeTab_3: + case eSectionInventoryCreativeTab_4: + case eSectionInventoryCreativeTab_5: + case eSectionInventoryCreativeTab_6: + case eSectionInventoryCreativeTab_7: + { + ECreativeInventoryTabs tab = (ECreativeInventoryTabs)((int)eCreativeInventoryTab_BuildingBlocks + (int)eSection - (int)eSectionInventoryCreativeTab_0); + if(tab != m_curTab) + { + switchTab(tab); + ui.PlayUISFX(eSFX_Focus); + } + } + break; + case eSectionInventoryCreativeSlider: + ScrollBar(this->m_pointerPos); + break; + } +} + +void UIScene_CreativeMenu::handleReload() +{ + Initialize( m_iPad, m_menu, false, -1, eSectionInventoryCreativeUsing, eSectionInventoryCreativeMax, m_bNavigateBack ); + + for(unsigned int i = 0; i < TabSpec::MAX_SIZE; ++i) + { + m_slotListContainer.addSlot(i); + } + + for(unsigned int i = TabSpec::MAX_SIZE; i < TabSpec::MAX_SIZE + 9; ++i) + { + m_slotListHotbar.addSlot(i); + } + + 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) +{ + // 4J-PB - going to ignore repeats on this scene + if(repeat) return; + + //app.DebugPrintf("UIScene_CreativeMenu handling input for pad %d, key %d, down- %s, pressed- %s, released- %s\n", iPad, key, down?"TRUE":"FALSE", pressed?"TRUE":"FALSE", released?"TRUE":"FALSE"); + ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); + + int dir = 1; + switch(key) + { + case VK_PAD_LSHOULDER: + dir = -1; + // Fall through intentional + case VK_PAD_RSHOULDER: + { + ECreativeInventoryTabs tab = (ECreativeInventoryTabs)(m_curTab + dir); + if (tab < 0) tab = (ECreativeInventoryTabs)(eCreativeInventoryTab_COUNT - 1); + if (tab >= eCreativeInventoryTab_COUNT) tab = eCreativeInventoryTab_BuildingBlocks; + switchTab(tab); + ui.PlayUISFX(eSFX_Focus); + } + break; + case VK_PAD_LTRIGGER: + // change the potion strength + { + ++m_tabDynamicPos[m_curTab]; + if(m_tabDynamicPos[m_curTab] >= specs[m_curTab]->m_dynamicGroupsCount) m_tabDynamicPos[m_curTab] = 0; + switchTab(m_curTab); + } + break; + default: + UIScene_AbstractContainerMenu::handleInput(iPad,key,repeat,pressed,released,handled); + break; + } +} + +void UIScene_CreativeMenu::updateTabHighlightAndText(ECreativeInventoryTabs tab) +{ + IggyDataValue result; + IggyDataValue value[1]; + + value[0].type = IGGY_DATATYPE_number; + value[0].number = (F64)tab; + + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ) , m_funcSetActiveTab , 1 , value ); + + m_labelInventory.setLabel(app.GetString(specs[tab]->m_descriptionId)); +} + +int UIScene_CreativeMenu::getSectionColumns(ESceneSection eSection) +{ + int cols = 0; + switch( eSection ) + { + case eSectionInventoryCreativeSelector: + cols = 10; + break; + case eSectionInventoryCreativeUsing: + cols = 9; + break; + default: + assert( false ); + break; + } + return cols; +} + +int UIScene_CreativeMenu::getSectionRows(ESceneSection eSection) +{ + int rows = 0; + switch( eSection ) + { + case eSectionInventoryCreativeSelector: + rows = 5; + break; + case eSectionInventoryCreativeUsing: + rows = 1; + break; + default: + assert( false ); + break; + } + return rows; +} + +void UIScene_CreativeMenu::GetPositionOfSection( ESceneSection eSection, UIVec2D* pPosition ) +{ + switch( eSection ) + { + case eSectionInventoryCreativeSelector: + pPosition->x = m_slotListContainer.getXPos(); + pPosition->y = m_slotListContainer.getYPos(); + break; + case eSectionInventoryCreativeUsing: + pPosition->x = m_slotListHotbar.getXPos(); + pPosition->y = m_slotListHotbar.getYPos(); + break; + case eSectionInventoryCreativeTab_0: + pPosition->x = m_TouchInput[ETouchInput_TouchPanel_0].getXPos(); + pPosition->y = m_TouchInput[ETouchInput_TouchPanel_0].getYPos(); + break; + case eSectionInventoryCreativeTab_1: + pPosition->x = m_TouchInput[ETouchInput_TouchPanel_1].getXPos(); + pPosition->y = m_TouchInput[ETouchInput_TouchPanel_1].getYPos(); + break; + case eSectionInventoryCreativeTab_2: + pPosition->x = m_TouchInput[ETouchInput_TouchPanel_2].getXPos(); + pPosition->y = m_TouchInput[ETouchInput_TouchPanel_2].getYPos(); + break; + case eSectionInventoryCreativeTab_3: + pPosition->x = m_TouchInput[ETouchInput_TouchPanel_3].getXPos(); + pPosition->y = m_TouchInput[ETouchInput_TouchPanel_3].getYPos(); + break; + case eSectionInventoryCreativeTab_4: + pPosition->x = m_TouchInput[ETouchInput_TouchPanel_4].getXPos(); + pPosition->y = m_TouchInput[ETouchInput_TouchPanel_4].getYPos(); + break; + case eSectionInventoryCreativeTab_5: + pPosition->x = m_TouchInput[ETouchInput_TouchPanel_5].getXPos(); + pPosition->y = m_TouchInput[ETouchInput_TouchPanel_5].getYPos(); + break; + case eSectionInventoryCreativeTab_6: + pPosition->x = m_TouchInput[ETouchInput_TouchPanel_6].getXPos(); + pPosition->y = m_TouchInput[ETouchInput_TouchPanel_6].getYPos(); + break; + case eSectionInventoryCreativeTab_7: + pPosition->x = m_TouchInput[ETouchInput_TouchPanel_7].getXPos(); + pPosition->y = m_TouchInput[ETouchInput_TouchPanel_7].getYPos(); + break; + case eSectionInventoryCreativeSlider: + pPosition->x = m_TouchInput[ETouchInput_TouchSlider].getXPos(); + pPosition->y = m_TouchInput[ETouchInput_TouchSlider].getYPos(); + break; + default: + assert( false ); + break; + } +} + +void UIScene_CreativeMenu::GetItemScreenData( ESceneSection eSection, int iItemIndex, UIVec2D* pPosition, UIVec2D* pSize ) +{ + UIVec2D sectionSize; + + switch( eSection ) + { + case eSectionInventoryCreativeSelector: + sectionSize.x = m_slotListContainer.getWidth(); + sectionSize.y = m_slotListContainer.getHeight(); + break; + case eSectionInventoryCreativeUsing: + sectionSize.x = m_slotListHotbar.getWidth(); + sectionSize.y = m_slotListHotbar.getHeight(); + break; + case eSectionInventoryCreativeTab_0: + sectionSize.x = m_TouchInput[ETouchInput_TouchPanel_0].getWidth(); + sectionSize.y = m_TouchInput[ETouchInput_TouchPanel_0].getHeight(); + break; + case eSectionInventoryCreativeTab_1: + sectionSize.x = m_TouchInput[ETouchInput_TouchPanel_1].getWidth(); + sectionSize.y = m_TouchInput[ETouchInput_TouchPanel_1].getHeight(); + break; + case eSectionInventoryCreativeTab_2: + sectionSize.x = m_TouchInput[ETouchInput_TouchPanel_2].getWidth(); + sectionSize.y = m_TouchInput[ETouchInput_TouchPanel_2].getHeight(); + break; + case eSectionInventoryCreativeTab_3: + sectionSize.x = m_TouchInput[ETouchInput_TouchPanel_3].getWidth(); + sectionSize.y = m_TouchInput[ETouchInput_TouchPanel_3].getHeight(); + break; + case eSectionInventoryCreativeTab_4: + sectionSize.x = m_TouchInput[ETouchInput_TouchPanel_4].getWidth(); + sectionSize.y = m_TouchInput[ETouchInput_TouchPanel_4].getHeight(); + break; + case eSectionInventoryCreativeTab_5: + sectionSize.x = m_TouchInput[ETouchInput_TouchPanel_5].getWidth(); + sectionSize.y = m_TouchInput[ETouchInput_TouchPanel_5].getHeight(); + break; + case eSectionInventoryCreativeTab_6: + sectionSize.x = m_TouchInput[ETouchInput_TouchPanel_6].getWidth(); + sectionSize.y = m_TouchInput[ETouchInput_TouchPanel_6].getHeight(); + break; + case eSectionInventoryCreativeTab_7: + sectionSize.x = m_TouchInput[ETouchInput_TouchPanel_7].getWidth(); + sectionSize.y = m_TouchInput[ETouchInput_TouchPanel_7].getHeight(); + break; + case eSectionInventoryCreativeSlider: + sectionSize.x = m_TouchInput[ETouchInput_TouchSlider].getWidth(); + sectionSize.y = m_TouchInput[ETouchInput_TouchSlider].getHeight(); + break; + default: + assert( false ); + break; + } + + if(IsSectionSlotList(eSection)) + { + int rows = getSectionRows(eSection); + int cols = getSectionColumns(eSection); + + pSize->x = sectionSize.x/cols; + pSize->y = sectionSize.y/rows; + + int itemCol = iItemIndex % cols; + int itemRow = iItemIndex/cols; + + pPosition->x = itemCol * pSize->x; + pPosition->y = itemRow * pSize->y; + } + else + { + GetPositionOfSection(eSection, pPosition); + pSize->x = sectionSize.x; + pSize->y = sectionSize.y; + } +} + +void UIScene_CreativeMenu::setSectionSelectedSlot(ESceneSection eSection, int x, int y) +{ + int cols = getSectionColumns(eSection); + + int index = (y * cols) + x; + + UIControl_SlotList *slotList = NULL; + switch( eSection ) + { + case eSectionInventoryCreativeSelector: + slotList = &m_slotListContainer; + break; + case eSectionInventoryCreativeUsing: + slotList = &m_slotListHotbar; + break; + default: + assert( false ); + break; + } + + slotList->setHighlightSlot(index); +} + +UIControl *UIScene_CreativeMenu::getSection(ESceneSection eSection) +{ + UIControl *control = NULL; + switch( eSection ) + { + case eSectionInventoryCreativeSelector: + control = &m_slotListContainer; + break; + case eSectionInventoryCreativeUsing: + control = &m_slotListHotbar; + break; + case eSectionInventoryCreativeTab_0: + control = &m_TouchInput[ETouchInput_TouchPanel_0]; + break; + case eSectionInventoryCreativeTab_1: + control = &m_TouchInput[ETouchInput_TouchPanel_1]; + break; + case eSectionInventoryCreativeTab_2: + control = &m_TouchInput[ETouchInput_TouchPanel_2]; + break; + case eSectionInventoryCreativeTab_3: + control = &m_TouchInput[ETouchInput_TouchPanel_3]; + break; + case eSectionInventoryCreativeTab_4: + control = &m_TouchInput[ETouchInput_TouchPanel_4]; + break; + case eSectionInventoryCreativeTab_5: + control = &m_TouchInput[ETouchInput_TouchPanel_5]; + break; + case eSectionInventoryCreativeTab_6: + control = &m_TouchInput[ETouchInput_TouchPanel_6]; + break; + case eSectionInventoryCreativeTab_7: + control = &m_TouchInput[ETouchInput_TouchPanel_7]; + break; + case eSectionInventoryCreativeSlider: + control = &m_TouchInput[ETouchInput_TouchSlider]; + break; + default: + assert( false ); + break; + } + return control; +} + +void UIScene_CreativeMenu::updateScrollCurrentPage(int currentPage, int pageCount) +{ + IggyDataValue result; + IggyDataValue value[2]; + + value[0].type = IGGY_DATATYPE_number; + value[0].number = (F64)pageCount; + + value[1].type = IGGY_DATATYPE_number; + value[1].number = (F64)currentPage - 1; + + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ) , m_funcSetScrollBar , 2 , value ); +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_CreativeMenu.h b/Minecraft.Client/Common/UI/UIScene_CreativeMenu.h new file mode 100644 index 00000000..530a7512 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_CreativeMenu.h @@ -0,0 +1,89 @@ +#pragma once + +#include "UIScene_AbstractContainerMenu.h" +#include "IUIScene_CreativeMenu.h" + +class UIScene_CreativeMenu : public UIScene_AbstractContainerMenu, public IUIScene_CreativeMenu +{ +public: + UIScene_CreativeMenu(int iPad, void *initData, UILayer *parentLayer); + + virtual EUIScene getSceneType() { return eUIScene_CreativeMenu;} + +protected: + UIControl_SlotList m_slotListContainer; + IggyName m_funcSetActiveTab, m_funcSetScrollBar; + + enum ETouchInput + { + ETouchInput_TouchPanel_0, + ETouchInput_TouchPanel_1, + ETouchInput_TouchPanel_2, + ETouchInput_TouchPanel_3, + ETouchInput_TouchPanel_4, + ETouchInput_TouchPanel_5, + ETouchInput_TouchPanel_6, + ETouchInput_TouchPanel_7, + ETouchInput_TouchSlider, + + ETouchInput_Count, + }; + +#ifdef __PSVITA__ + // 4J - TomK - this only needs to be a touch component on vita! + UIControl_Touch m_TouchInput[ETouchInput_Count]; +#else + UIControl_Base m_TouchInput[ETouchInput_Count]; +#endif + + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene_AbstractContainerMenu) + UI_BEGIN_MAP_CHILD_ELEMENTS( m_controlMainPanel ) + + UI_MAP_ELEMENT( m_TouchInput[ETouchInput_TouchPanel_0], "TouchPanel_0" ) + UI_MAP_ELEMENT( m_TouchInput[ETouchInput_TouchPanel_1], "TouchPanel_1" ) + UI_MAP_ELEMENT( m_TouchInput[ETouchInput_TouchPanel_2], "TouchPanel_2" ) + UI_MAP_ELEMENT( m_TouchInput[ETouchInput_TouchPanel_3], "TouchPanel_3" ) + UI_MAP_ELEMENT( m_TouchInput[ETouchInput_TouchPanel_4], "TouchPanel_4" ) + UI_MAP_ELEMENT( m_TouchInput[ETouchInput_TouchPanel_5], "TouchPanel_5" ) + UI_MAP_ELEMENT( m_TouchInput[ETouchInput_TouchPanel_6], "TouchPanel_6" ) + UI_MAP_ELEMENT( m_TouchInput[ETouchInput_TouchPanel_7], "TouchPanel_7" ) + UI_MAP_ELEMENT( m_TouchInput[ETouchInput_TouchSlider], "TouchPanel_Slider" ) + + UI_MAP_ELEMENT( m_slotListContainer, "containerList") + UI_END_MAP_CHILD_ELEMENTS() + + UI_MAP_NAME(m_funcSetActiveTab, L"SetActiveTab") + UI_MAP_NAME(m_funcSetScrollBar, L"SetScrollBar") + UI_END_MAP_ELEMENTS_AND_NAMES() + + virtual wstring getMoviePath(); + virtual void handleReload(); + + virtual int getSectionColumns(ESceneSection eSection); + virtual int getSectionRows(ESceneSection eSection); + virtual void GetPositionOfSection( ESceneSection eSection, UIVec2D* pPosition ); + virtual void GetItemScreenData( ESceneSection eSection, int iItemIndex, UIVec2D* pPosition, UIVec2D* pSize ); + virtual void handleSectionClick(ESceneSection eSection) {} + virtual void setSectionSelectedSlot(ESceneSection eSection, int x, int y); + + virtual UIControl *getSection(ESceneSection eSection); + + virtual void handleOtherClicked(int iPad, ESceneSection eSection, int buttonNum, bool quickKey); + +public: + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + +#ifdef __PSVITA__ + virtual void handleTouchInput(unsigned int iPad, S32 x, S32 y, int iId, bool bPressed, bool bRepeat, bool bReleased); + virtual UIControl* GetMainPanel(); + virtual void handleTouchBoxRebuild(); + virtual void handleTimerComplete(int id); +#endif + +private: + // IUIScene_CreativeMenu + void updateTabHighlightAndText(ECreativeInventoryTabs tab); + void updateScrollCurrentPage(int currentPage, int pageCount); + bool m_bFirstCall; +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_Credits.cpp b/Minecraft.Client/Common/UI/UIScene_Credits.cpp new file mode 100644 index 00000000..75ddf92f --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_Credits.cpp @@ -0,0 +1,698 @@ +#include "stdafx.h" +#include "UI.h" +#include "..\Minecraft.World\StringHelpers.h" +#include "UIScene_Credits.h" + +#define CREDIT_ICON -2 + +SCreditTextItemDef UIScene_Credits::gs_aCreditDefs[MAX_CREDIT_STRINGS] = +{ + { L"MOJANG", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eExtraLargeText }, + { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + { L"%ls", IDS_CREDITS_ORIGINALDESIGN, NO_TRANSLATED_STRING,eLargeText }, + { L"Markus Persson", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + { L"%ls", IDS_CREDITS_PMPROD, NO_TRANSLATED_STRING,eLargeText }, + { L"Daniel Kaplan", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + { L"%ls", IDS_CREDITS_RESTOFMOJANG, NO_TRANSLATED_STRING,eMediumText }, + { L"%ls", IDS_CREDITS_LEADPC, NO_TRANSLATED_STRING,eLargeText }, + { L"Jens Bergensten", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%ls", IDS_CREDITS_JON_KAGSTROM, NO_TRANSLATED_STRING,eSmallText }, + { L"%ls", IDS_CREDITS_CEO, NO_TRANSLATED_STRING,eLargeText }, + { L"Carl Manneh", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%ls", IDS_CREDITS_DOF, NO_TRANSLATED_STRING,eLargeText }, + { L"Lydia Winters", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%ls", IDS_CREDITS_WCW, NO_TRANSLATED_STRING,eLargeText }, + { L"Karin Severinsson", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%ls", IDS_CREDITS_CUSTOMERSUPPORT, NO_TRANSLATED_STRING,eLargeText }, + { L"Marc Watson", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + { L"%ls", IDS_CREDITS_DESPROG, NO_TRANSLATED_STRING,eLargeText }, + { L"Aron Nieminen", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + { L"%ls", IDS_CREDITS_CHIEFARCHITECT, NO_TRANSLATED_STRING,eLargeText }, + { L"Daniel Frisk", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%ls", IDS_CREDITS_CODENINJA, NO_TRANSLATED_STRING,eLargeText }, + { L"%ls", IDS_CREDITS_TOBIAS_MOLLSTAM, NO_TRANSLATED_STRING,eSmallText }, + { L"%ls", IDS_CREDITS_OFFICEDJ, NO_TRANSLATED_STRING,eLargeText }, + { L"Kristoffer Jelbring", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%ls", IDS_CREDITS_DEVELOPER, NO_TRANSLATED_STRING,eLargeText }, + { L"Leonard Axelsson", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%ls", IDS_CREDITS_BULLYCOORD, NO_TRANSLATED_STRING,eLargeText }, + { L"Jakob Porser", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%ls", IDS_CREDITS_ARTDEVELOPER, NO_TRANSLATED_STRING,eLargeText }, + { L"Junkboy", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%ls", IDS_CREDITS_EXPLODANIM, NO_TRANSLATED_STRING,eLargeText }, + { L"Mattis Grahm", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%ls", IDS_CREDITS_CONCEPTART, NO_TRANSLATED_STRING,eLargeText }, + { L"Henrik Petterson", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%ls", IDS_CREDITS_CRUNCHER, NO_TRANSLATED_STRING,eLargeText }, + { L"Patrick Geuder", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%ls", IDS_CREDITS_MUSICANDSOUNDS, NO_TRANSLATED_STRING,eLargeText }, + { L"Daniel Rosenfeld (C418)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + +// 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 }, + { L"Richard Reavy", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Stuart Ross", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"James Vaughan", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Mark Hughes", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Harry Gordon", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Thomas Kronberg", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, +#ifdef _XBOX + { L"Ian le Bruce", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Andy West", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Gordon McLean", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, +#endif + +#ifdef __PSVITA__ +// 4J-PB - Aaron didn't want to be in the credits { L"Aaron Puzey", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Chris Dawson", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, +#endif + + { L"%ls", IDS_CREDITS_ART, NO_TRANSLATED_STRING,eLargeText }, + { L"David Keningale", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, +#ifdef _XBOX + { L"Pat McGovern", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, +#endif + { L"Alan Redmond", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, +#ifdef _XBOX + { L"Julian Laing", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + + { L"Caitlin Goodale", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Scott Sutherland", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, +#endif + { L"Chris Reeves", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Kate Wright", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Michael Hansen", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, +#ifdef _XBOX + { L"Kate Flavell", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, +#endif + { L"Donald Robertson", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jamie Keddie", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Thomas Naylor", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Brian Lindsay", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Hannah Watts", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Rebecca O'Neil", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + + { L"%ls", IDS_CREDITS_QA, NO_TRANSLATED_STRING,eLargeText }, + { L"Steven Gary Woodward", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, +#ifdef _XBOX + { L"Richard Black", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, +#endif + { L"George Vaughan", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + { L"%ls", IDS_CREDITS_SPECIALTHANKS, NO_TRANSLATED_STRING,eLargeText }, + { L"Chris van der Kuyl", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Roni Percy", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Anne Clarke", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Anthony Kent", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, +#ifdef _XBOX + // credits are in the XUI file +#elif defined(__PS3__) +// font credits + { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + { L"%ls", IDS_DYNAFONT, NO_TRANSLATED_STRING,eLargeText }, + +#elif defined(__ORBIS__) +// font credits + { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + { L"%ls", IDS_DYNAFONT, NO_TRANSLATED_STRING,eLargeText }, + +#elif defined(_DURANGO) + { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + { L"Xbox LIVE Arcade Team", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eExtraLargeText }, + { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + { L"%s", IDS_CREDITS_LEADPRODUCER, NO_TRANSLATED_STRING,eLargeText }, + { L"Roger Carpenter", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_PRODUCER, NO_TRANSLATED_STRING,eLargeText }, + { L"Stuart Platt", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Riccardo Lenzi", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_LEADTESTER, NO_TRANSLATED_STRING,eLargeText }, + { L"Bill Brown (Insight Global)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Brandon McCurry (Insight Global)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Hakim Ronaque, Joe Dunavant", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Paul Loynd, Jeffery Stephens", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Rial Lerum (Xtreme Consulting Group Inc)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_DESIGNTEAM, NO_TRANSLATED_STRING,eLargeText }, + { L"Craig Leigh", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_DEVELOPMENTTEAM, NO_TRANSLATED_STRING,eLargeText }, + { L"Scott Guest", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jeff \"Dextor\" Blazier", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Yukie Yamaguchi", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jason Hewitt", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_RELEASEMANAGEMENT, NO_TRANSLATED_STRING,eLargeText }, + { L"Isaac Aubrey", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jordan Forbes", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Josh Mulanax", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Shogo Ishii (TekSystems)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Tyler Keenan (Xtreme Consulting Group Inc)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Joshua Bullard (TekSystems)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"GTO-E Compliance", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eLargeText }, + { L"Dominic Gara", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"James Small", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + + { L"%s", IDS_CREDITS_EXECPRODUCER, NO_TRANSLATED_STRING,eLargeText }, + { L"Mark Coates", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Avi Ben-Menahem", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Earnest Yuen", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + + + { L"%s", IDS_CREDITS_XBLADIRECTOR, NO_TRANSLATED_STRING,eLargeText }, + { L"Ted Woolsey", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_BIZDEV, NO_TRANSLATED_STRING,eLargeText }, + { L"Cherie Lutz", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Peter Zetterberg", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_PORTFOLIODIRECTOR, NO_TRANSLATED_STRING,eLargeText }, + { L"Chris Charla", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_PRODUCTMANAGER, NO_TRANSLATED_STRING,eLargeText }, + { L"Daniel McConnell", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_MARKETING, NO_TRANSLATED_STRING,eLargeText }, + { L"Brandon Wells", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Michael Wolf", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"John Dongelmans", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_COMMUNITYMANAGER, NO_TRANSLATED_STRING,eLargeText }, + { L"Alex Hebert", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_REDMONDLOC, NO_TRANSLATED_STRING,eLargeText }, + { L"Zeb Wedell", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Gabriella Mittiga (Pactera)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Scott Fielding (Global Studio Consulting)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Yong Zhao (Hisoft Envisage Inc)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Shogo Ishii (Insight Global)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_EUROPELOC, NO_TRANSLATED_STRING,eLargeText }, + { L"Gerard Dunne", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Ricardo Cordoba", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Magali Lucchini", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Malika Kherfi", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Lizzy Untermann", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Ian Walsh", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Alfonsina Mossello (Keywords International Ltd)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Marika Mauri (Keywords International Ltd)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Nobuhiro Izumisawa (Keywords International Ltd)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Sebastien Faucon (Keywords International Ltd)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jose Manuel Martinez (Keywords International Ltd)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Montse Garcia (Keywords International Ltd)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_ASIALOC, NO_TRANSLATED_STRING,eLargeText }, + { L"Takashi Sasaki", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Changseon Ha", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Shinya Muto (Zip Global Corporation)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Hiroshi Hosoda (Zip Global Corporation)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Natsuko Kudo (Zip Global Corporation)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Yong-Hong Park (Zip Global Corporation)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Yuko Yoshida (Zip Global Corporation)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_USERRESEARCH, NO_TRANSLATED_STRING,eLargeText }, + { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + { L"User Research Lead", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eLargeText }, + { L"Tim Nichols", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + { L"User Research Engineer", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eLargeText }, + { L"Michael Medlock", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Kristie Fisher", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + { L"%s", IDS_CREDITS_MGSCENTRAL, NO_TRANSLATED_STRING,eLargeText }, + { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + { L"Test Team Lead", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eLargeText }, + { L"Dan Smith", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_MILESTONEACCEPT, NO_TRANSLATED_STRING,eLargeText }, + { L"Justin Davis (VMC)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Microsoft Studios Sentient Development Team", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eLargeText }, + { L"Ellery Charlson", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Frank Klier", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jason Ronald", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Cullen Waters", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Steve Jackson", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Barath Vasudevan", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Derek Mantey", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Henry Sterchi", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Scott Fintel", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Soren Hannibal Nielsen", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Meetali Goel (Aditi)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Uladzimir Sadouski (Volt)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_SPECIALTHANKS, NO_TRANSLATED_STRING,eLargeText }, + + { L"Allan Murphy", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Allison Bokone", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Alvin Chen", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Arthur Yung", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Brian Tyler", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Daniel Taylor", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Dave Reed", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Duoc Nguyen", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Eric Voreis", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Evelyn Thomas", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jeff Braunstein", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jolynn Carpenter", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Justin Brown", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Kareem Choudhry", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Kevin Cogger", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Kevin La Chapelle", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Luc Rancourt", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Matt Bronder", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Michael Siebert", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Mike Harsh", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Mike Sterling", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Nick Rapp", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Orr Keshet", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Paul Hellyar", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Peter Giffin", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Richard Moe", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Scott Selfon", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Stephane St-Michel", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Steve Spiller", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Steven Trombetta", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Theo Michel", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Tina Lemire", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Tom Miller", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Travis St. Onge", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + + { L"Brianna Witherspoon (Nytec Inc)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jim Pekola (Xtreme Consulting Group Inc)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Greg Hjertager", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Masha Reutovski (Nytec Inc)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Chris Henry", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Matt Golz", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Chris Gaffney (Volt)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jared Barnhill (Aditi)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Laura Hawkins", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"2nd Cavalry", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"GTO Bug Bash Team", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Oliver Miyashita", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Kevin Salcedo", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Nick Bodenham", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Chris Giggins", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Ben Board", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Peter Choi", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Andy Su (CompuCom Systems Inc.)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"David Boker ", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Josh Bliggenstorfer", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Paul Amer", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Louise Smith", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Karin Behland (Aquent LLC)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"John Bruno", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Phil Spencer", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"John Smith", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Christi Davisson", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jacob Farley (Aditi)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Chad Stringer (Collabera)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Rick Rispoli (Collabera)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Test by Experis", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eExtraLargeText }, + { L"%s", IDS_CREDITS_TESTMANAGER, NO_TRANSLATED_STRING,eLargeText }, + { L"Matt Brown", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Gavin Kennedy", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_SRTESTLEAD, NO_TRANSLATED_STRING,eLargeText }, + { L"Lloyd Bell", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Tim Attuquayefio", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_TESTLEAD, NO_TRANSLATED_STRING,eLargeText }, + { L"Byron R. Monzon", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Marta Alombro", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_SDET, NO_TRANSLATED_STRING,eLargeText }, + { L"Valeriy Novytskyy", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_PROJECT, NO_TRANSLATED_STRING,eLargeText }, + { L"Allyson Burk", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"David Scott", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"John Shearer", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_ADDITIONALSTE, NO_TRANSLATED_STRING,eLargeText }, + { L"Chris Merritt", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Kimberlee Lyles", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Eric Ranz", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Russ Allen", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_TESTASSOCIATES, NO_TRANSLATED_STRING,eLargeText }, + { L"Michael Arvat", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Josh Breese", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"April Culberson", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jason Fox", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Clayton K. Hopper", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Matthew Howells", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Alan Hume", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jacob Martin", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Kevin Lourigan", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Tyler Lovemark", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_RISE_LUGO, NO_TRANSLATED_STRING,eSmallText }, + { L"Ryan Naegeli", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Isaac Price", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Masha Reutovski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Brad Shockey", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jonathan Tote", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Marc Williams", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Gillian Williams", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jeffrey Woito", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Tyler Young", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jae Yslas", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Amanda Swalling", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Ben Dienes", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Chris Kent", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Dustin Lukas", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Emily Lovering", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Nick Fowler", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + // EVEN MORE CREDITS + { L"Test by Lionbridge", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eExtraLargeText }, + { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + { L"%s", IDS_CREDITS_TESTMANAGER, NO_TRANSLATED_STRING,eLargeText }, + { L"Blazej Zawadzki", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_TESTLEAD, NO_TRANSLATED_STRING,eLargeText }, + { L"Jakub Garwacki", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Kamil Lahti", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Mariusz Gelnicki", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Karol Falak", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Lukasz Watroba", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + + { L"%s", IDS_CREDITS_PROJECT, NO_TRANSLATED_STRING,eLargeText }, + { L"Artur Grochowski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Grzegorz Kohorewicz", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Lukasz Derewonko", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Michal Celej", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + + { L"Senior Test Engineers", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eLargeText }, + { L"Jakub Rybacki", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Mateusz Szymanski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Arkadiusz Szczytowski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Rafal Rawski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + + { L"%s", IDS_CREDITS_TESTASSOCIATES, NO_TRANSLATED_STRING,eLargeText }, + { L"Adrian Klepacki", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Aleksander Pietraszak", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + + { L"Arkadiusz Kala", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Arkadiusz Sykula", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Bartlomiej Kmita", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jakub Malinowski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jan Prejs", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jedrzej Kucharek", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Kamil Dabrowski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Maciej Urlo", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Maciej Wygoda", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Marcin Piasecki", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Marcin Piotrowski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Marek Latacz", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Michal Biernat", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Michal Krupinski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Michal Warchal", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Michal Wascinski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Michal Zbrzezniak", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Milosz Maciejewicz", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Pawel Kumanowski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Przemyslaw Malinowski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Tomasz Dabrowicz", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Tomasz Trzebiatowski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Wojciech Kujawa", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + + { L"Blazej Kohorewicz", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Damian Mielnik", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Dariusz Nowakowski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Dominik Rzeznicki", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jacek Piotrowski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jakub Rybacki", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jakub Wozniakowski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jaroslaw Radzio", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Kamil Kaczor", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Karolina Szymanska", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Konrad Mady", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Krzysztof Galazka", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Ludwik Miszta", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Lukasz Kwiatkowski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Marcin Krzysiak", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Mateusz Szymanski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Michal Maslany", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Michal Nyszka", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Norbert Jankowski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Piotr Daszewski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Radoslaw Kozlowski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Tomasz Kalowski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_SPECIALTHANKS, NO_TRANSLATED_STRING,eLargeText }, + { L"David Hickey", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Sean Kellogg", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Adam Keating", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jerzy Tyminski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Paulina Sliwinska", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + + + { L"Test by Shield", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eExtraLargeText }, + { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + { L"GTO Shared Service Test Manager", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eLargeText }, + { L"Natahri Felton", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Shield Test Lead", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eLargeText }, + { L"Matt Giddings", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Shield IT Support", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eLargeText }, + { L"David Grant (Compucom Systems Inc)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Primary Team", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eLargeText }, + { L"Alex Chen (CompuCom Systems Inc)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Alex Hunte (CompuCom Systems Inc)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Brian Boye (CompuCom Systems Inc)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Bridgette Cummins (CompuCom Systems Inc)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Chris Carleson (Volt)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Christopher Hermey (CompuCom Systems Inc)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"David Hendrickson (CompuCom Systems Inc)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Ioana Preda (CompuCom Systems Inc)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jessica Jenkins (CompuCom Systems Inc)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Johnathan Ochs (CompuCom Systems Inc)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Michael Upham (CompuCom Systems Inc)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Nicholas Johansson (CompuCom Systems Inc)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Nicholas Starner (CompuCom Systems Inc)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Torr Vickers (Volt)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Victoria Bruder (CompuCom Systems Inc)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + +#elif defined(_WIN64) +#elif defined(__PSVITA__) +// font credits + { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + { L"%ls", IDS_DYNAFONT, NO_TRANSLATED_STRING,eLargeText }, + +#endif + +#ifndef _XBOX +// Miles & Iggy credits + { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + { L"", CREDIT_ICON, eCreditIcon_Iggy,eSmallText }, // extra blank line + { L"Uses Iggy.", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line +#ifdef __PS3__ + { L"Copyright (C) 2009-2013 by RAD Game Tools, Inc.", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line +#else + { L"Copyright (C) 2009-2014 by RAD Game Tools, Inc.", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line +#endif + { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + { L"", CREDIT_ICON, eCreditIcon_Miles,eSmallText }, // extra blank line + { L"Uses Miles Sound System.", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line +#ifdef __PS3__ + { L"Copyright (C) 1991-2013 by RAD Game Tools, Inc.", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line +#else + { L"Copyright (C) 1991-2014 by RAD Game Tools, Inc.", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line +#endif +#ifdef __PS3__ + { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + { L"", CREDIT_ICON, eCreditIcon_Dolby,eSmallText }, // extra blank line + { L"Dolby and the double-D symbol", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + { L"are trademarks of Dolby Laboratories.", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line +#endif +#endif +}; + +UIScene_Credits::UIScene_Credits(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + m_bAddNextLabel = false; + + // How many lines of text are in the credits? + m_iNumTextDefs = MAX_CREDIT_STRINGS; + + // Are there any additional lines needed for the DLC credits? + m_iNumTextDefs+=app.GetDLCCreditsCount(); + + m_iCurrDefIndex = -1; + + // Add the first 20 Flash can cope with + for(unsigned int i = 0; i < 20; ++i) + { + ++m_iCurrDefIndex; + + // Set up the new text element. + if ( gs_aCreditDefs[i].m_iStringID[0] == NO_TRANSLATED_STRING ) + { + setNextLabel(gs_aCreditDefs[i].m_Text,gs_aCreditDefs[i].m_eType); + } + else // using additional translated string. + { + LPWSTR creditsString = new wchar_t[ 128 ]; + if(gs_aCreditDefs[i].m_iStringID[1]!=NO_TRANSLATED_STRING) + { + swprintf( creditsString, 128, gs_aCreditDefs[i].m_Text, app.GetString( gs_aCreditDefs[i].m_iStringID[0] ), app.GetString( gs_aCreditDefs[i].m_iStringID[1] ) ); + } + else + { + swprintf( creditsString, 128, gs_aCreditDefs[i].m_Text, app.GetString( gs_aCreditDefs[i].m_iStringID[0] ) ); + } + setNextLabel(creditsString,gs_aCreditDefs[i].m_eType); + delete [] creditsString; + } + } +} + +wstring UIScene_Credits::getMoviePath() +{ + return L"Credits"; +} + +void UIScene_Credits::updateTooltips() +{ + ui.SetTooltips( m_iPad, -1, IDS_TOOLTIPS_BACK); +} + +void UIScene_Credits::updateComponents() +{ + m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,true); +} + +void UIScene_Credits::handleReload() +{ + // We don't allow this in splitscreen, so just go back + navigateBack(); +} + +void UIScene_Credits::tick() +{ + UIScene::tick(); + + if(m_bAddNextLabel) + { + m_bAddNextLabel = false; + + const SCreditTextItemDef* pDef; + + // Time to create next text item. + ++m_iCurrDefIndex; + + // Wrap back to start. + if ( m_iCurrDefIndex >= m_iNumTextDefs ) + { + m_iCurrDefIndex = 0; + } + + if(m_iCurrDefIndex >= MAX_CREDIT_STRINGS) + { + app.DebugPrintf("DLC credit %d\n",m_iCurrDefIndex-MAX_CREDIT_STRINGS); + // DLC credit + pDef = app.GetDLCCredits(m_iCurrDefIndex-MAX_CREDIT_STRINGS); + } + else + { + // Get text def for this item. + pDef = &( gs_aCreditDefs[ m_iCurrDefIndex ] ); + } + + // Set up the new text element. + if(pDef->m_Text!=NULL) // 4J-PB - think the RAD logo ones aren't set up yet and are coming is as null + { + if ( pDef->m_iStringID[0] == CREDIT_ICON ) + { + addImage((ECreditIcons)pDef->m_iStringID[1]); + } + else // using additional translated string. + { + wstring sanitisedString = wstring(pDef->m_Text); + + // 4J-JEV: Some DLC credits contain copyright or registered symbols that are not rendered in some fonts. + if ( !ui.UsingBitmapFont() ) + { + sanitisedString = replaceAll(sanitisedString, L"\u00A9", L"(C)"); + sanitisedString = replaceAll(sanitisedString, L"\u00AE", L"(R)"); + sanitisedString = replaceAll(sanitisedString, L"\u2013", L"-"); + } + + LPWSTR creditsString = new wchar_t[ 128 ]; + if (pDef->m_iStringID[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, sanitisedString.c_str(), app.GetString( pDef->m_iStringID[0] ) ); + } + + setNextLabel(creditsString,pDef->m_eType); + delete [] creditsString; + } + } + } +} + +void UIScene_Credits::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + //app.DebugPrintf("UIScene_DebugOverlay handling input for pad %d, key %d, down- %ls, pressed- %ls, released- %ls\n", iPad, key, down?"TRUE":"FALSE", pressed?"TRUE":"FALSE", released?"TRUE":"FALSE"); + + ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); + + switch(key) + { + case ACTION_MENU_CANCEL: + if(pressed && !repeat) + { + navigateBack(); + } + break; + case ACTION_MENU_OK: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + sendInputToMovie(key, repeat, pressed, released); + break; + } +} + +void UIScene_Credits::setNextLabel(const wstring &label, ECreditTextTypes size) +{ + IggyDataValue result; + IggyDataValue value[3]; + + IggyStringUTF16 stringVal; + stringVal.string = (IggyUTF16*)label.c_str(); + stringVal.length = label.length(); + value[0].type = IGGY_DATATYPE_string_UTF16; + value[0].string16 = stringVal; + + value[1].type = IGGY_DATATYPE_number; + value[1].number = (int)size; + + value[2].type = IGGY_DATATYPE_boolean; + value[2].boolval = (m_iCurrDefIndex == (m_iNumTextDefs - 1)); + + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetNextLabel , 3 , value ); +} + +void UIScene_Credits::addImage(ECreditIcons icon) +{ + IggyDataValue result; + IggyDataValue value[2]; + + value[0].type = IGGY_DATATYPE_number; + value[0].number = (int)icon; + + value[1].type = IGGY_DATATYPE_boolean; + value[1].boolval = (m_iCurrDefIndex == (m_iNumTextDefs - 1)); + + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcAddImage , 2 , value ); +} + +void UIScene_Credits::handleRequestMoreData(F64 startIndex, bool up) +{ + m_bAddNextLabel = true; +} diff --git a/Minecraft.Client/Common/UI/UIScene_Credits.h b/Minecraft.Client/Common/UI/UIScene_Credits.h new file mode 100644 index 00000000..ccb62831 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_Credits.h @@ -0,0 +1,71 @@ +#pragma once + +#include "UIScene.h" + +#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 + + +#ifdef __PS3__ +#define MAX_CREDIT_STRINGS (PS3_CREDITS_COUNT + MILES_AND_IGGY_CREDITS_COUNT + DYNAMODE_FONT_CREDITS_COUNT + PS3_DOLBY_CREDIT) +#elif defined(__ORBIS__) +#define MAX_CREDIT_STRINGS (PS4_CREDITS_COUNT + MILES_AND_IGGY_CREDITS_COUNT + DYNAMODE_FONT_CREDITS_COUNT) +#elif defined(_DURANGO) || defined _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) +#endif + +class UIScene_Credits : public UIScene +{ +private: + enum ECreditIcons + { + eCreditIcon_Iggy, + eCreditIcon_Miles, + eCreditIcon_Dolby, + }; + + static SCreditTextItemDef gs_aCreditDefs[MAX_CREDIT_STRINGS]; + + int m_iCurrDefIndex; // Index of last created text def. + int m_iNumTextDefs; // Total number of text defs in the credits. + + bool m_bAddNextLabel; + + IggyName m_funcSetNextLabel, m_funcAddImage; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_NAME(m_funcSetNextLabel, L"SetNextLabel") + UI_MAP_NAME(m_funcAddImage, L"AddImage") + UI_END_MAP_ELEMENTS_AND_NAMES() +public: + UIScene_Credits(int iPad, void *initData, UILayer *parentLayer); + + virtual EUIScene getSceneType() { return eUIScene_Credits;} + + virtual void updateTooltips(); + virtual void updateComponents(); + + void handleReload(); + + virtual void tick(); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + + virtual void handleRequestMoreData(F64 startIndex, bool up); + +private: + void setNextLabel(const wstring &label, ECreditTextTypes size); + void addImage(ECreditIcons icon); +}; diff --git a/Minecraft.Client/Common/UI/UIScene_DLCMainMenu.cpp b/Minecraft.Client/Common/UI/UIScene_DLCMainMenu.cpp new file mode 100644 index 00000000..77ffdffd --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_DLCMainMenu.cpp @@ -0,0 +1,242 @@ +#include "stdafx.h" +#include "UI.h" +#if defined(__PS3__) || defined(__ORBIS__) +#include "Common\Network\Sony\SonyCommerce.h" +#endif +#include "UIScene_DLCMainMenu.h" + +#define PLAYER_ONLINE_TIMER_ID 0 +#define PLAYER_ONLINE_TIMER_TIME 100 + +UIScene_DLCMainMenu::UIScene_DLCMainMenu(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + // Alert the app the we want to be informed of ethernet connections + app.SetLiveLinkRequired( true ); + + m_labelOffers.init(IDS_DOWNLOADABLE_CONTENT_OFFERS); + m_buttonListOffers.init(eControl_OffersList); + +#if defined _XBOX_ONE || defined __ORBIS__ + // load any local DLC images + app.LoadLocalDLCImages(); +#endif + +#if defined(__PS3__) || defined(__ORBIS__) || defined (__PSVITA__) + // show a timer on this menu + m_Timer.setVisible(true); + + m_bCategoriesShown=false; +#endif + + if(m_loadedResolution == eSceneResolution_1080) + { +#ifdef _DURANGO + m_labelXboxStore.init(IDS_XBOX_STORE); +#else + m_labelXboxStore.init( L"" ); +#endif + } + +#if defined(_DURANGO) + m_Timer.setVisible(false); + + 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 + app.StartInstallDLCProcess(iPad); +#endif + + TelemetryManager->RecordMenuShown(iPad, eUIScene_DLCMainMenu, 0); + +#if defined __ORBIS__ || defined __PSVITA__ + app.GetCommerce()->ShowPsStoreIcon(); +#endif + +#if ( defined __PS3__ || defined __ORBIS__ || defined __PSVITA__ ) + addTimer( PLAYER_ONLINE_TIMER_ID, PLAYER_ONLINE_TIMER_TIME ); +#endif +} + +UIScene_DLCMainMenu::~UIScene_DLCMainMenu() +{ + // Alert the app the we no longer want to be informed of ethernet connections + app.SetLiveLinkRequired( false ); +#if defined _XBOX_ONE || defined __ORBIS__ + app.FreeLocalDLCImages(); +#endif + +#ifdef _XBOX_ONE + // 4J-JEV: Have to switch back to user preferred languge now. + setLanguageOverride(true); +#endif +} + +wstring UIScene_DLCMainMenu::getMoviePath() +{ + return L"DLCMainMenu"; +} + +void UIScene_DLCMainMenu::updateTooltips() +{ + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT, IDS_TOOLTIPS_BACK ); +} + +void UIScene_DLCMainMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + //app.DebugPrintf("UIScene_DebugOverlay handling input for pad %d, key %d, down- %s, pressed- %s, released- %s\n", iPad, key, down?"TRUE":"FALSE", pressed?"TRUE":"FALSE", released?"TRUE":"FALSE"); + ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); + + switch(key) + { + case ACTION_MENU_CANCEL: + if(pressed) + { +#if defined __ORBIS__ || defined __PSVITA__ + app.GetCommerce()->HidePsStoreIcon(); +#endif + navigateBack(); + } + break; + case ACTION_MENU_OK: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + sendInputToMovie(key, repeat, pressed, released); + break; + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + case ACTION_MENU_LEFT: + case ACTION_MENU_RIGHT: + case ACTION_MENU_PAGEUP: + case ACTION_MENU_PAGEDOWN: + sendInputToMovie(key, repeat, pressed, released); + break; + } +} + +void UIScene_DLCMainMenu::handlePress(F64 controlId, F64 childId) +{ + switch((int)controlId) + { + case eControl_OffersList: + { + int iIndex = (int)childId; + DLCOffersParam *param = new DLCOffersParam(); + param->iPad = m_iPad; + + param->iType = iIndex; + // promote the DLC content request type + + // Xbox One will have requested the marketplace content - there is only that type +#ifndef _XBOX_ONE + app.AddDLCRequest((eDLCMarketplaceType)iIndex, true); +#endif + killTimer(PLAYER_ONLINE_TIMER_ID); + ui.NavigateToScene(m_iPad, eUIScene_DLCOffersMenu, param); + break; + } + }; +} + +void UIScene_DLCMainMenu::handleTimerComplete(int id) +{ +#if ( defined __PS3__ || defined __ORBIS__ || defined __PSVITA__) + switch(id) + { + case PLAYER_ONLINE_TIMER_ID: +#ifndef _WINDOWS64 + if(ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad())==false) + { + // check the player hasn't gone offline + // If they have, bring up the PSN warning and exit from the leaderboards + unsigned int uiIDA[1]; + uiIDA[0]=IDS_OK; + C4JStorage::EMessageResult result = ui.RequestErrorMessage( IDS_CONNECTION_LOST, g_NetworkManager.CorrectErrorIDS(IDS_CONNECTION_LOST_LIVE_NO_EXIT), uiIDA,1,ProfileManager.GetPrimaryPad(),UIScene_DLCMainMenu::ExitDLCMainMenu,this); + } +#endif + break; + } +#endif +} + +int UIScene_DLCMainMenu::ExitDLCMainMenu(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + UIScene_DLCMainMenu* pClass = (UIScene_DLCMainMenu*)pParam; + +#if defined __ORBIS__ || defined __PSVITA__ + app.GetCommerce()->HidePsStoreIcon(); +#endif + pClass->navigateBack(); + + return 0; +} + +void UIScene_DLCMainMenu::handleGainFocus(bool navBack) +{ + UIScene::handleGainFocus(navBack); + + updateTooltips(); + + if(navBack) + { + // add the timer back in +#if ( defined __PS3__ || defined __ORBIS__ || defined __PSVITA__ ) + addTimer( PLAYER_ONLINE_TIMER_ID, PLAYER_ONLINE_TIMER_TIME ); +#endif + } +} + +void UIScene_DLCMainMenu::tick() +{ + UIScene::tick(); + +#if defined(__PS3__) || defined(__ORBIS__) || defined (__PSVITA__) + if((m_bCategoriesShown==false) && (app.GetCommerceCategoriesRetrieved())) + { + // disable the timer display on this menu + m_Timer.setVisible(false); + m_bCategoriesShown=true; + + // add the categories to the list box + SonyCommerce::CategoryInfo *pCategories=app.GetCategoryInfo(); + std::list::iterator iter = pCategories->subCategories.begin(); + SonyCommerce::CategoryInfoSub category; + for(int i=0;icountOfSubCategories;i++) + { + // add a button in with the subcategory + category = (SonyCommerce::CategoryInfoSub)(*iter); + + string teststring=category.categoryName; + m_buttonListOffers.addItem(teststring,i); + + iter++; + } + + // set the focus to the first thing in the categories if there are any + if(pCategories->countOfSubCategories>0) + { + m_buttonListOffers.setFocus(true); + } + else + { +#if defined __ORBIS__ || defined __PSVITA__ || defined __PS3__ + app.CheckForEmptyStore(ProfileManager.GetPrimaryPad()); +#endif + // need to display text to say no downloadable content available yet + m_labelOffers.setLabel(app.GetString(IDS_NO_DLCCATEGORIES)); + +#ifdef __ORBIS__ + // 4J-JEV: TRC Requirement (R4055), need to display this system message. + ProfileManager.DisplaySystemMessage( SCE_MSG_DIALOG_SYSMSG_TYPE_TRC_EMPTY_STORE, ProfileManager.GetPrimaryPad() ); +#endif + } + + } +#endif +} + diff --git a/Minecraft.Client/Common/UI/UIScene_DLCMainMenu.h b/Minecraft.Client/Common/UI/UIScene_DLCMainMenu.h new file mode 100644 index 00000000..f23ee4b0 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_DLCMainMenu.h @@ -0,0 +1,50 @@ +#pragma once + +#include "UIScene.h" + +class UIScene_DLCMainMenu : public UIScene +{ +private: + enum EControls + { + eControl_OffersList, + }; + + UIControl_DynamicButtonList m_buttonListOffers; + UIControl_Label m_labelOffers, m_labelXboxStore; + UIControl m_Timer; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_buttonListOffers, "OffersList") + UI_MAP_ELEMENT( m_labelOffers, "OffersList_Title") + UI_MAP_ELEMENT( m_Timer, "Timer") + if(m_loadedResolution == eSceneResolution_1080) + { + UI_MAP_ELEMENT( m_labelXboxStore, "XboxLabel" ) + } + UI_END_MAP_ELEMENTS_AND_NAMES() + + static int ExitDLCMainMenu(void *pParam,int iPad,C4JStorage::EMessageResult result); + +#if defined(__PS3__) || defined(__ORBIS__) || defined (__PSVITA__) + bool m_bCategoriesShown; +#endif + +public: + UIScene_DLCMainMenu(int iPad, void *initData, UILayer *parentLayer); + ~UIScene_DLCMainMenu(); + virtual void handleTimerComplete(int id); + virtual void handleGainFocus(bool navBack); + + virtual EUIScene getSceneType() { return eUIScene_DLCMainMenu;} + virtual void tick(); + virtual void updateTooltips(); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + virtual void handlePress(F64 controlId, F64 childId); +}; diff --git a/Minecraft.Client/Common/UI/UIScene_DLCOffersMenu.cpp b/Minecraft.Client/Common/UI/UIScene_DLCOffersMenu.cpp new file mode 100644 index 00000000..65c1b6fc --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_DLCOffersMenu.cpp @@ -0,0 +1,931 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_DLCOffersMenu.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#if defined(__PS3__) || defined(__ORBIS__) || defined (__PSVITA__) +#include "Common\Network\Sony\SonyHttp.h" +#endif + +#ifdef __PSVITA__ +#include "PSVita\Network\SonyCommerce_Vita.h" +#endif + +#define PLAYER_ONLINE_TIMER_ID 0 +#define PLAYER_ONLINE_TIMER_TIME 100 + +UIScene_DLCOffersMenu::UIScene_DLCOffersMenu(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + m_bProductInfoShown=false; + DLCOffersParam *param=(DLCOffersParam *)initData; + m_iProductInfoIndex=param->iType; + m_iCurrentDLC=0; + m_iTotalDLC=0; +#if defined(__PS3__) || defined(__ORBIS__) || defined (__PSVITA__) + m_pvProductInfo=NULL; +#endif + m_bAddAllDLCButtons=true; + + // Setup all the Iggy references we need for this scene + initialiseMovie(); + // Alert the app the we want to be informed of ethernet connections + app.SetLiveLinkRequired( true ); + + m_bIsSD=!RenderManager.IsHiDef() && !RenderManager.IsWidescreen(); + + m_labelOffers.init(app.GetString(IDS_DOWNLOADABLE_CONTENT_OFFERS)); + m_buttonListOffers.init(eControl_OffersList); + m_labelHTMLSellText.init(L" "); + m_labelPriceTag.init(L" "); + TelemetryManager->RecordMenuShown(m_iPad, eUIScene_DLCOffersMenu, 0); + + m_bHasPurchased = false; + m_bIsSelected = false; + + if(m_loadedResolution == eSceneResolution_1080) + { +#ifdef _DURANGO + m_labelXboxStore.init( app.GetString(IDS_XBOX_STORE) ); +#else + m_labelXboxStore.init( L"" ); +#endif + } + +#ifdef _DURANGO + m_pNoImageFor_DLC = NULL; + // If we don't yet have this DLC, we need to display a timer + m_bDLCRequiredIsRetrieved=false; + m_bIgnorePress=true; + m_bSelectionChanged=true; + // display a timer + m_Timer.setVisible(true); + +#endif + +#ifdef __ORBIS__ + //sceNpCommerceShowPsStoreIcon(SCE_NP_COMMERCE_PS_STORE_ICON_CENTER); +#endif + +#if ( defined __PS3__ || defined __ORBIS__ || defined __PSVITA__ ) + addTimer( PLAYER_ONLINE_TIMER_ID, PLAYER_ONLINE_TIMER_TIME ); +#endif + +#ifdef __PSVITA__ + ui.TouchBoxRebuild(this); +#endif +} + +UIScene_DLCOffersMenu::~UIScene_DLCOffersMenu() +{ + // Alert the app the we no longer want to be informed of ethernet connections + app.SetLiveLinkRequired( false ); +} + +void UIScene_DLCOffersMenu::handleTimerComplete(int id) +{ +#if ( defined __PS3__ || defined __ORBIS__ || defined __PSVITA__) + switch(id) + { + case PLAYER_ONLINE_TIMER_ID: +#ifndef _WINDOWS64 + if(ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad())==false) + { + // check the player hasn't gone offline + // If they have, bring up the PSN warning and exit from the DLC menu + unsigned int uiIDA[1]; + uiIDA[0]=IDS_OK; + C4JStorage::EMessageResult result = ui.RequestErrorMessage( IDS_CONNECTION_LOST, g_NetworkManager.CorrectErrorIDS(IDS_CONNECTION_LOST_LIVE_NO_EXIT), uiIDA,1,ProfileManager.GetPrimaryPad(),UIScene_DLCOffersMenu::ExitDLCOffersMenu,this); + } +#endif + break; + } +#endif +} + +int UIScene_DLCOffersMenu::ExitDLCOffersMenu(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + UIScene_DLCOffersMenu* pClass = (UIScene_DLCOffersMenu*)pParam; + +#if defined __ORBIS__ || defined __PSVITA__ + app.GetCommerce()->HidePsStoreIcon(); +#endif + ui.NavigateToHomeMenu();//iPad,eUIScene_MainMenu); + + return 0; +} + +wstring UIScene_DLCOffersMenu::getMoviePath() +{ + return L"DLCOffersMenu"; +} + +void UIScene_DLCOffersMenu::updateTooltips() +{ + int iA = -1; + if(m_bIsSelected) + { + if( !m_bHasPurchased ) + { + iA = IDS_TOOLTIPS_INSTALL; + } + else + { + iA = IDS_TOOLTIPS_REINSTALL; + } + } + ui.SetTooltips( m_iPad, iA,IDS_TOOLTIPS_BACK); +} + +void UIScene_DLCOffersMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + //app.DebugPrintf("UIScene_DebugOverlay handling input for pad %d, key %d, down- %s, pressed- %s, released- %s\n", iPad, key, down?"TRUE":"FALSE", pressed?"TRUE":"FALSE", released?"TRUE":"FALSE"); + ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); + + switch(key) + { + case ACTION_MENU_CANCEL: + if(pressed) + { + navigateBack(); + } + break; + case ACTION_MENU_OK: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + sendInputToMovie(key, repeat, pressed, released); + break; + case ACTION_MENU_UP: + if(pressed) + { + // 4J - TomK don't proceed if there is no DLC to navigate through + if(m_iTotalDLC > 0) + { + if(m_iCurrentDLC > 0) + m_iCurrentDLC--; + + m_bProductInfoShown = false; + } + } + sendInputToMovie(key, repeat, pressed, released); + break; + + case ACTION_MENU_DOWN: + if(pressed) + { + // 4J - TomK don't proceed if there is no DLC to navigate through + if(m_iTotalDLC > 0) + { + if(m_iCurrentDLC < (m_iTotalDLC - 1)) + m_iCurrentDLC++; + + m_bProductInfoShown = false; + } + } + sendInputToMovie(key, repeat, pressed, released); + break; + + case ACTION_MENU_LEFT: + /* +#ifdef _DEBUG + static int iTextC=0; + switch(iTextC) + { + case 0: + m_labelHTMLSellText.init("Voici un fantastique mini-pack de 24 apparences pour personnaliser votre personnage Minecraft et vous mettre dans l'ambiance des ftes de fin d'anne.

1-4 joueurs
2-8 joueurs en rseau

Cet article fait lobjet dune licence ou dune sous-licence de Sony Computer Entertainment America, et est soumis aux conditions gnrales du service du rseau, au contrat dutilisateur, aux restrictions dutilisation de cet article et aux autres conditions applicables, disponibles sur le site www.us.playstation.com/support/useragreements. Si vous ne souhaitez pas accepter ces conditions, ne tlchargez pas ce produit. Cet article peut tre utilis avec un maximum de deux systmes PlayStation3 activs associs ce compte Sony Entertainment Network.

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

1-4 jugadores
2-8 jugadores en red

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

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

1-4 Jogadores
Jogadores em rede 2-8

Este item est sendo licenciado ou sublicenciado para voc pela Sony Computer Entertainment America e est sujeito aos Termos de Servio da Rede e Acordo do Usurio, as restries de uso deste item e outros termos aplicveis esto localizados em www.us.playstation.com/support/useragreements. Caso no queira aceitar todos esses termos, no baixe este item. Este item pode ser usado com at 2 sistemas PlayStation3 ativados associados a esta Conta de Rede Sony Entertainment.

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










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







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

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

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

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

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

"; + m_labelTip.setLabel(wsText); + } + break; + } +} + +void UIScene_FullscreenProgress::SetWasCancelled(bool wasCancelled) +{ + m_bWasCancelled = wasCancelled; +} + +bool UIScene_FullscreenProgress::isReadyToDelete() +{ + if( m_bWaitForThreadToDelete ) + { + return !thread->isRunning(); + } + else + { + return true; + } +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_FullscreenProgress.h b/Minecraft.Client/Common/UI/UIScene_FullscreenProgress.h new file mode 100644 index 00000000..aeb428c3 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_FullscreenProgress.h @@ -0,0 +1,69 @@ +#pragma once + +#include "UIScene.h" + +class UIScene_FullscreenProgress : public UIScene +{ +private: + enum EControl + { + eControl_Confirm, + }; + + static const int TIMER_FULLSCREEN_TIPS = 1; + static const int TIMER_FULLSCREEN_TIPS_TIME = 7000; + + C4JThread* thread; + bool threadStarted; + UIFullscreenProgressCompletionData *m_CompletionData; + bool m_threadCompleted; + int m_iPad; + void (*m_cancelFunc)(LPVOID param); + void (*m_completeFunc)(LPVOID param); + LPVOID m_cancelFuncParam; + LPVOID m_completeFuncParam; + bool m_bWaitForThreadToDelete; + + wstring m_titleText, m_statusText; + int m_lastTitle, m_lastStatus, m_lastProgress; + int m_cancelText; + bool m_bWasCancelled; + + UIControl_Progress m_progressBar; + UIControl_Label m_labelTitle, m_labelTip; + UIControl_Button m_buttonConfirm; + UIControl m_controlTimer; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_progressBar, "ProgressBar") + UI_MAP_ELEMENT( m_labelTitle, "Title") + UI_MAP_ELEMENT( m_labelTip, "Tip") + UI_MAP_ELEMENT( m_buttonConfirm, "Confirm") + UI_MAP_ELEMENT( m_controlTimer, "Timer") + UI_END_MAP_ELEMENTS_AND_NAMES() +public: + UIScene_FullscreenProgress(int iPad, void *initData, UILayer *parentLayer); + virtual ~UIScene_FullscreenProgress(); + + virtual EUIScene getSceneType() { return eUIScene_FullscreenProgress;} + virtual void updateTooltips(); + virtual void handleDestroy(); + + void tick(); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + + virtual long long getDefaultGtcButtons() { return 0; } + +public: + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + void handlePress(F64 controlId, F64 childId); + + virtual void handleTimerComplete(int id); + + void SetWasCancelled(bool wasCancelled); + + virtual bool isReadyToDelete(); +}; diff --git a/Minecraft.Client/Common/UI/UIScene_FurnaceMenu.cpp b/Minecraft.Client/Common/UI/UIScene_FurnaceMenu.cpp new file mode 100644 index 00000000..392221a6 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_FurnaceMenu.cpp @@ -0,0 +1,256 @@ +#include "stdafx.h" +#include "UI.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.tile.entity.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" +#include "..\..\Minecraft.h" +#include "UIScene_FurnaceMenu.h" + +UIScene_FurnaceMenu::UIScene_FurnaceMenu(int iPad, void *_initData, UILayer *parentLayer) : UIScene_AbstractContainerMenu(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + 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); + + Minecraft *pMinecraft = Minecraft::GetInstance(); + if( pMinecraft->localgameModes[initData->iPad] != NULL ) + { + TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[initData->iPad]; + m_previousTutorialState = gameMode->getTutorial()->getCurrentState(); + gameMode->getTutorial()->changeTutorialState(e_Tutorial_State_Furnace_Menu, this); + } + + FurnaceMenu* menu = new FurnaceMenu( initData->inventory, initData->furnace ); + + Initialize( initData->iPad, menu, true, FurnaceMenu::INV_SLOT_START, eSectionFurnaceUsing, eSectionFurnaceMax ); + + m_slotListFuel.addSlots(FurnaceMenu::FUEL_SLOT, 1); + m_slotListIngredient.addSlots(FurnaceMenu::INGREDIENT_SLOT, 1); + m_slotListResult.addSlots(FurnaceMenu::RESULT_SLOT, 1); + + app.SetRichPresenceContext(m_iPad,CONTEXT_GAME_STATE_FORGING); + + delete initData; +} + +wstring UIScene_FurnaceMenu::getMoviePath() +{ + if(app.GetLocalPlayerCount() > 1) + { + return L"FurnaceMenuSplit"; + } + else + { + return L"FurnaceMenu"; + } +} + +void UIScene_FurnaceMenu::handleReload() +{ + Initialize( m_iPad, m_menu, true, FurnaceMenu::INV_SLOT_START, eSectionFurnaceUsing, eSectionFurnaceMax ); + + m_slotListFuel.addSlots(FurnaceMenu::FUEL_SLOT, 1); + m_slotListIngredient.addSlots(FurnaceMenu::INGREDIENT_SLOT, 1); + m_slotListResult.addSlots(FurnaceMenu::RESULT_SLOT, 1); +} + +void UIScene_FurnaceMenu::tick() +{ + m_progressFurnaceFire.setProgress( m_furnace->getLitProgress( 12 ) ); + m_progressFurnaceArrow.setProgress( m_furnace->getBurnProgress( 24 ) ); + UIScene_AbstractContainerMenu::tick(); +} + +int UIScene_FurnaceMenu::getSectionColumns(ESceneSection eSection) +{ + int cols = 0; + switch( eSection ) + { + case eSectionFurnaceResult: + cols = 1; + break; + case eSectionFurnaceFuel: + cols = 1; + break; + case eSectionFurnaceIngredient: + cols = 1; + break; + case eSectionFurnaceInventory: + cols = 9; + break; + case eSectionFurnaceUsing: + cols = 9; + break; + default: + assert( false ); + break; + } + return cols; +} + +int UIScene_FurnaceMenu::getSectionRows(ESceneSection eSection) +{ + int rows = 0; + switch( eSection ) + { + case eSectionFurnaceResult: + rows = 1; + break; + case eSectionFurnaceFuel: + rows = 1; + break; + case eSectionFurnaceIngredient: + rows = 1; + break; + case eSectionFurnaceInventory: + rows = 3; + break; + case eSectionFurnaceUsing: + rows = 1; + break; + default: + assert( false ); + break; + } + return rows; +} + +void UIScene_FurnaceMenu::GetPositionOfSection( ESceneSection eSection, UIVec2D* pPosition ) +{ + switch( eSection ) + { + case eSectionFurnaceResult: + pPosition->x = m_slotListResult.getXPos(); + pPosition->y = m_slotListResult.getYPos(); + break; + case eSectionFurnaceFuel: + pPosition->x = m_slotListFuel.getXPos(); + pPosition->y = m_slotListFuel.getYPos(); + break; + case eSectionFurnaceIngredient: + pPosition->x = m_slotListIngredient.getXPos(); + pPosition->y = m_slotListIngredient.getYPos(); + break; + case eSectionFurnaceInventory: + pPosition->x = m_slotListInventory.getXPos(); + pPosition->y = m_slotListInventory.getYPos(); + break; + case eSectionFurnaceUsing: + pPosition->x = m_slotListHotbar.getXPos(); + pPosition->y = m_slotListHotbar.getYPos(); + break; + default: + assert( false ); + break; + } +} + +void UIScene_FurnaceMenu::GetItemScreenData( ESceneSection eSection, int iItemIndex, UIVec2D* pPosition, UIVec2D* pSize ) +{ + UIVec2D sectionSize; + switch( eSection ) + { + case eSectionFurnaceResult: + sectionSize.x = m_slotListResult.getWidth(); + sectionSize.y = m_slotListResult.getHeight(); + break; + case eSectionFurnaceFuel: + sectionSize.x = m_slotListFuel.getWidth(); + sectionSize.y = m_slotListFuel.getHeight(); + break; + case eSectionFurnaceIngredient: + sectionSize.x = m_slotListIngredient.getWidth(); + sectionSize.y = m_slotListIngredient.getHeight(); + break; + case eSectionFurnaceInventory: + sectionSize.x = m_slotListInventory.getWidth(); + sectionSize.y = m_slotListInventory.getHeight(); + break; + case eSectionFurnaceUsing: + sectionSize.x = m_slotListHotbar.getWidth(); + sectionSize.y = m_slotListHotbar.getHeight(); + break; + default: + assert( false ); + break; + } + + int rows = getSectionRows(eSection); + int cols = getSectionColumns(eSection); + + pSize->x = sectionSize.x/cols; + pSize->y = sectionSize.y/rows; + + int itemCol = iItemIndex % cols; + int itemRow = iItemIndex/cols; + + pPosition->x = itemCol * pSize->x; + pPosition->y = itemRow * pSize->y; +} + +void UIScene_FurnaceMenu::setSectionSelectedSlot(ESceneSection eSection, int x, int y) +{ + int cols = getSectionColumns(eSection); + + int index = (y * cols) + x; + + UIControl_SlotList *slotList = NULL; + switch( eSection ) + { + case eSectionFurnaceResult: + slotList = &m_slotListResult; + break; + case eSectionFurnaceFuel: + slotList = &m_slotListFuel; + break; + case eSectionFurnaceIngredient: + slotList = &m_slotListIngredient; + break; + case eSectionFurnaceInventory: + slotList = &m_slotListInventory; + break; + case eSectionFurnaceUsing: + slotList = &m_slotListHotbar; + break; + default: + assert( false ); + break; + } + + slotList->setHighlightSlot(index); +} + +UIControl *UIScene_FurnaceMenu::getSection(ESceneSection eSection) +{ + UIControl *control = NULL; + switch( eSection ) + { + case eSectionFurnaceResult: + control = &m_slotListResult; + break; + case eSectionFurnaceFuel: + control = &m_slotListFuel; + break; + case eSectionFurnaceIngredient: + control = &m_slotListIngredient; + break; + case eSectionFurnaceInventory: + control = &m_slotListInventory; + break; + case eSectionFurnaceUsing: + control = &m_slotListHotbar; + break; + default: + assert( false ); + break; + } + return control; +} diff --git a/Minecraft.Client/Common/UI/UIScene_FurnaceMenu.h b/Minecraft.Client/Common/UI/UIScene_FurnaceMenu.h new file mode 100644 index 00000000..dcea967e --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_FurnaceMenu.h @@ -0,0 +1,50 @@ +#pragma once + +#include "UIScene_AbstractContainerMenu.h" +#include "IUIScene_FurnaceMenu.h" + +class InventoryMenu; + +class UIScene_FurnaceMenu : public UIScene_AbstractContainerMenu, public IUIScene_FurnaceMenu +{ +private: + shared_ptr m_furnace; + +public: + UIScene_FurnaceMenu(int iPad, void *initData, UILayer *parentLayer); + + virtual EUIScene getSceneType() { return eUIScene_FurnaceMenu;} + +protected: + UIControl_SlotList m_slotListFuel, m_slotListIngredient, m_slotListResult; + UIControl_Label m_labelFurnace, m_labelIngredient, m_labelFuel; + UIControl_Progress m_progressFurnaceFire, m_progressFurnaceArrow; + + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene_AbstractContainerMenu) + UI_BEGIN_MAP_CHILD_ELEMENTS( m_controlMainPanel ) + UI_MAP_ELEMENT( m_slotListIngredient, "Ingredient") + UI_MAP_ELEMENT( m_slotListFuel, "Fuel") + UI_MAP_ELEMENT( m_slotListResult, "Result") + UI_MAP_ELEMENT( m_labelFurnace, "Furnace_text") + UI_MAP_ELEMENT( m_labelIngredient, "Ingredient_Label") + UI_MAP_ELEMENT( m_labelFuel, "Fuel_Label") + + UI_MAP_ELEMENT( m_progressFurnaceFire, "FurnaceFire") + UI_MAP_ELEMENT( m_progressFurnaceArrow, "FurnaceArrow") + UI_END_MAP_CHILD_ELEMENTS() + UI_END_MAP_ELEMENTS_AND_NAMES() + + virtual wstring getMoviePath(); + virtual void handleReload(); + + virtual void tick(); + + virtual int getSectionColumns(ESceneSection eSection); + virtual int getSectionRows(ESceneSection eSection); + virtual void GetPositionOfSection( ESceneSection eSection, UIVec2D* pPosition ); + virtual void GetItemScreenData( ESceneSection eSection, int iItemIndex, UIVec2D* pPosition, UIVec2D* pSize ); + virtual void handleSectionClick(ESceneSection eSection) {} + virtual void setSectionSelectedSlot(ESceneSection eSection, int x, int y); + + virtual UIControl *getSection(ESceneSection eSection); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_HUD.cpp b/Minecraft.Client/Common/UI/UIScene_HUD.cpp new file mode 100644 index 00000000..c3d52cf9 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_HUD.cpp @@ -0,0 +1,871 @@ +#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\StringHelpers.h" + +UIScene_HUD::UIScene_HUD(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + m_bSplitscreen = false; + + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + SetDragonLabel( app.GetString( IDS_BOSS_ENDERDRAGON_HEALTH ) ); + SetSelectedLabel(L""); + + for(unsigned int i = 0; i < CHAT_LINES_COUNT; ++i) + { + m_labelChatText[i].init(L""); + } + m_labelJukebox.init(L""); + + addTimer(0, 100); +} + +wstring UIScene_HUD::getMoviePath() +{ + switch( m_parentLayer->getViewport() ) + { + case C4JRender::VIEWPORT_TYPE_SPLIT_TOP: + case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: + case C4JRender::VIEWPORT_TYPE_SPLIT_LEFT: + case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_LEFT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT: + m_bSplitscreen = true; + return L"HUDSplit"; + break; + case C4JRender::VIEWPORT_TYPE_FULLSCREEN: + default: + m_bSplitscreen = false; + return L"HUD"; + break; + } +} + +void UIScene_HUD::updateSafeZone() +{ + // Distance from edge + F64 safeTop = 0.0; + F64 safeBottom = 0.0; + F64 safeLeft = 0.0; + F64 safeRight = 0.0; + + switch( m_parentLayer->getViewport() ) + { + case C4JRender::VIEWPORT_TYPE_SPLIT_TOP: + safeTop = getSafeZoneHalfHeight(); + safeLeft = getSafeZoneHalfWidth(); + safeRight = getSafeZoneHalfWidth(); + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: + safeBottom = getSafeZoneHalfHeight(); + safeLeft = getSafeZoneHalfWidth(); + safeRight = getSafeZoneHalfWidth(); + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_LEFT: + safeLeft = getSafeZoneHalfWidth(); + safeTop = getSafeZoneHalfHeight(); + safeBottom = getSafeZoneHalfHeight(); + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: + safeRight = getSafeZoneHalfWidth(); + safeTop = getSafeZoneHalfHeight(); + safeBottom = getSafeZoneHalfHeight(); + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_LEFT: + safeTop = getSafeZoneHalfHeight(); + safeLeft = getSafeZoneHalfWidth(); + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: + safeTop = getSafeZoneHalfHeight(); + safeRight = getSafeZoneHalfWidth(); + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT: + safeBottom = getSafeZoneHalfHeight(); + safeLeft = getSafeZoneHalfWidth(); + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT: + safeBottom = getSafeZoneHalfHeight(); + safeRight = getSafeZoneHalfWidth(); + break; + case C4JRender::VIEWPORT_TYPE_FULLSCREEN: + default: + safeTop = getSafeZoneHalfHeight(); + safeBottom = getSafeZoneHalfHeight(); + safeLeft = getSafeZoneHalfWidth(); + safeRight = getSafeZoneHalfWidth(); + break; + } + setSafeZone(safeTop, safeBottom, safeLeft, safeRight); +} + +void UIScene_HUD::tick() +{ + UIScene::tick(); + if(getMovie() && app.GetGameStarted()) + { + Minecraft *pMinecraft = Minecraft::GetInstance(); + if(pMinecraft->localplayers[m_iPad] == NULL || pMinecraft->localgameModes[m_iPad] == NULL) + { + return; + } + + // Is boss present? + bool noBoss = BossMobGuiInfo::name.empty() || BossMobGuiInfo::displayTicks <= 0; + if (noBoss) + { + if (m_showDragonHealth) + { + // No boss and health is visible + if(m_ticksWithNoBoss <= 20) + { + ++m_ticksWithNoBoss; + } + else + { + ShowDragonHealth(false); + } + } + } + else + { + BossMobGuiInfo::displayTicks--; + + m_ticksWithNoBoss = 0; + SetDragonHealth(BossMobGuiInfo::healthProgress); + + if (!m_showDragonHealth) + { + SetDragonLabel(BossMobGuiInfo::name); + ShowDragonHealth(true); + } + } + } +} + +void UIScene_HUD::customDraw(IggyCustomDrawCallbackRegion *region) +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + if(pMinecraft->localplayers[m_iPad] == NULL || pMinecraft->localgameModes[m_iPad] == NULL) return; + + int slot = -1; + swscanf((wchar_t*)region->name,L"slot_%d",&slot); + if (slot == -1) + { + app.DebugPrintf("This is not the control we are looking for\n"); + } + else + { + Slot *invSlot = pMinecraft->localplayers[m_iPad]->inventoryMenu->getSlot(InventoryMenu::USE_ROW_SLOT_START + slot); + shared_ptr item = invSlot->getItem(); + if(item != NULL) + { + unsigned char ucAlpha=app.GetGameSettings(ProfileManager.GetPrimaryPad(),eGameSetting_InterfaceOpacity); + float fVal; + + if(ucAlpha<80) + { + // check if we have the timer running for the opacity + unsigned int uiOpacityTimer=app.GetOpacityTimer(m_iPad); + if(uiOpacityTimer!=0) + { + if(uiOpacityTimer<10) + { + float fStep=(80.0f-(float)ucAlpha)/10.0f; + fVal=0.01f*(80.0f-((10.0f-(float)uiOpacityTimer)*fStep)); + } + else + { + fVal=0.01f*80.0f; + } + } + else + { + fVal=0.01f*(float)ucAlpha; + } + } + else + { + fVal=0.01f*(float)ucAlpha; + } + customDrawSlotControl(region,m_iPad,item,fVal,item->isFoil(),true); + } + } +} + +void UIScene_HUD::handleReload() +{ + m_lastActiveSlot = -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 = 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_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(BossMobGuiInfo::name); + SetSelectedLabel(L""); + + for(unsigned int i = 0; i < CHAT_LINES_COUNT; ++i) + { + m_labelChatText[i].init(L""); + } + m_labelJukebox.init(L""); + + int iGuiScale; + Minecraft *pMinecraft = Minecraft::GetInstance(); + if(pMinecraft->localplayers[m_iPad] == NULL || pMinecraft->localplayers[m_iPad]->m_iScreenSection == C4JRender::VIEWPORT_TYPE_FULLSCREEN) + { + iGuiScale=app.GetGameSettings(m_iPad,eGameSetting_UISize); + } + else + { + iGuiScale=app.GetGameSettings(m_iPad,eGameSetting_UISizeSplitscreen); + } + SetHudSize(iGuiScale); + + SetDisplayName(ProfileManager.GetDisplayName(m_iPad)); + + repositionHud(); + + SetTooltipsEnabled(((ui.GetMenuDisplayed(ProfileManager.GetPrimaryPad())) || (app.GetGameSettings(ProfileManager.GetPrimaryPad(),eGameSetting_Tooltips) != 0))); +} + +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_iGuiScale) + { + m_iGuiScale = scale; + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = scale; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcLoadHud , 1 , value ); + } +} + +void UIScene_HUD::SetExpBarProgress(float progress, int xpNeededForNextLevel) +{ + if(progress != m_lastExpProgress) + { + m_lastExpProgress = progress; + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = progress; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetExpBarProgress , 1 , value ); + } +} + +void UIScene_HUD::SetExpLevel(int level) +{ + if(level != m_lastExpLevel) + { + m_lastExpLevel = level; + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = level; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetPlayerLevel , 1 , value ); + } +} + +void UIScene_HUD::SetActiveSlot(int slot) +{ + if(slot != m_lastActiveSlot) + { + m_lastActiveSlot = slot; + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = slot; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetActiveSlot , 1 , value ); + } +} + +void UIScene_HUD::SetHealth(int iHealth, int iLastHealth, bool bBlink, bool bPoison, bool bWither) +{ + int maxHealth = max(iHealth, iLastHealth); + 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[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; + value[3].type = IGGY_DATATYPE_boolean; + value[3].boolval = bWither; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetHealth , 4 , value ); + } +} + +void UIScene_HUD::SetFood(int iFood, int iLastFood, bool bPoison) +{ + // Ignore iLastFood as food doesn't flash + int maxFood = iFood; //, iLastFood); + if(maxFood != m_iCurrentFood || bPoison != m_lastFoodPoison) + { + m_iCurrentFood = maxFood; + m_lastFoodPoison = bPoison; + + IggyDataValue result; + IggyDataValue value[2]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = maxFood; + value[1].type = IGGY_DATATYPE_boolean; + value[1].boolval = bPoison; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetFood , 2 , value ); + } +} + +void UIScene_HUD::SetAir(int iAir, int extra) +{ + if(iAir != m_lastAir) + { + app.DebugPrintf("SetAir to %d\n", iAir); + m_lastAir = iAir; + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = iAir; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetAir , 1 , value ); + } +} + +void UIScene_HUD::SetArmour(int iArmour) +{ + if(iArmour != m_lastArmour) + { + app.DebugPrintf("SetArmour to %d\n", iArmour); + m_lastArmour = iArmour; + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = iArmour; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetArmour , 1 , value ); + } +} + +void UIScene_HUD::ShowHealth(bool show) +{ + if(show != m_showHealth) + { + app.DebugPrintf("ShowHealth to %s\n", show?"TRUE":"FALSE"); + m_showHealth = show; + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_boolean; + value[0].boolval = show; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcShowHealth , 1 , value ); + } +} + +void UIScene_HUD::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) + { + app.DebugPrintf("ShowFood to %s\n", show?"TRUE":"FALSE"); + m_showFood = show; + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_boolean; + value[0].boolval = show; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcShowFood , 1 , value ); + } +} + +void UIScene_HUD::ShowAir(bool show) +{ + if(show != m_showAir) + { + app.DebugPrintf("ShowAir to %s\n", show?"TRUE":"FALSE"); + m_showAir = show; + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_boolean; + value[0].boolval = show; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcShowAir , 1 , value ); + } +} + +void UIScene_HUD::ShowArmour(bool show) +{ + if(show != m_showArmour) + { + app.DebugPrintf("ShowArmour to %s\n", show?"TRUE":"FALSE"); + m_showArmour = show; + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_boolean; + value[0].boolval = show; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcShowArmour , 1 , value ); + } +} + +void UIScene_HUD::ShowExpBar(bool show) +{ + if(show != m_showExpBar) + { + app.DebugPrintf("ShowExpBar to %s\n", show?"TRUE":"FALSE"); + m_showExpBar = show; + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_boolean; + value[0].boolval = show; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcShowExpbar , 1 , value ); + } +} + +void UIScene_HUD::SetRegenerationEffect(bool bEnabled) +{ + if(bEnabled != m_bRegenEffectEnabled) + { + app.DebugPrintf("SetRegenerationEffect to %s\n", bEnabled?"TRUE":"FALSE"); + m_bRegenEffectEnabled = bEnabled; + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_boolean; + value[0].boolval = bEnabled; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetRegenerationEffect , 1 , value ); + } +} + +void UIScene_HUD::SetFoodSaturationLevel(int iSaturation) +{ + if(iSaturation != m_iFoodSaturation) + { + app.DebugPrintf("Set saturation to %d\n", iSaturation); + m_iFoodSaturation = iSaturation; + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = iSaturation; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetFoodSaturationLevel , 1 , value ); + } +} + +void UIScene_HUD::SetDragonHealth(float health) +{ + if(health != m_lastDragonHealth) + { + app.DebugPrintf("Set dragon health to %f\n", health); + m_lastDragonHealth = health; + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = health; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetDragonHealth , 1 , value ); + } +} + +void UIScene_HUD::SetDragonLabel(const wstring &label) +{ + IggyDataValue result; + IggyDataValue value[1]; + IggyStringUTF16 stringVal; + stringVal.string = (IggyUTF16*)label.c_str(); + stringVal.length = label.length(); + value[0].type = IGGY_DATATYPE_string_UTF16; + value[0].string16 = stringVal; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetDragonLabel , 1 , value ); +} + +void UIScene_HUD::ShowDragonHealth(bool show) +{ + if(show != m_showDragonHealth) + { + app.DebugPrintf("ShowDragonHealth to %s\n", show?"TRUE":"FALSE"); + m_showDragonHealth = show; + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_boolean; + value[0].boolval = show; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcShowDragonHealth , 1 , value ); + } +} + +void UIScene_HUD::SetSelectedLabel(const wstring &label) +{ + // 4J Stu - Timing here is kept the same as on Xbox360, even though we do it differently now and do the fade out in Flash rather than directly setting opacity + if(!label.empty()) m_uiSelectedItemOpacityCountDown = SharedConstants::TICKS_PER_SECOND * 3; + + IggyDataValue result; + IggyDataValue value[1]; + IggyStringUTF16 stringVal; + stringVal.string = (IggyUTF16*)label.c_str(); + stringVal.length = label.length(); + value[0].type = IGGY_DATATYPE_string_UTF16; + value[0].string16 = stringVal; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetSelectedLabel , 1 , value ); +} + +void UIScene_HUD::HideSelectedLabel() +{ + IggyDataValue result; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcHideSelectedLabel , 0 , NULL ); +} + + +void UIScene_HUD::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) + { + S32 xPos = 0; + S32 yPos = 0; + switch( viewport ) + { + case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT: + yPos = (S32)(ui.getScreenHeight() / 2); + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: + xPos = (S32)(ui.getScreenWidth() / 2); + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT: + xPos = (S32)(ui.getScreenWidth() / 2); + yPos = (S32)(ui.getScreenHeight() / 2); + break; + } + ui.setupRenderPosition(xPos, yPos); + + S32 tileXStart = 0; + S32 tileYStart = 0; + S32 tileWidth = width; + S32 tileHeight = height; + + switch( viewport ) + { + case C4JRender::VIEWPORT_TYPE_SPLIT_LEFT: + case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: + tileHeight = (S32)(ui.getScreenHeight()); + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_TOP: + tileWidth = (S32)(ui.getScreenWidth()); + tileYStart = (S32)(m_movieHeight / 2); + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: + tileWidth = (S32)(ui.getScreenWidth()); + tileYStart = (S32)(m_movieHeight / 2); + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_LEFT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT: + tileYStart = (S32)(m_movieHeight / 2); + break; + } + + IggyPlayerSetDisplaySize( getMovie(), m_movieWidth, m_movieHeight ); + + m_renderWidth = tileWidth; + m_renderHeight = tileHeight; + + IggyPlayerDrawTilesStart ( getMovie() ); + IggyPlayerDrawTile ( getMovie() , + tileXStart , + tileYStart , + tileXStart + tileWidth , + tileYStart + tileHeight , + 0 ); + IggyPlayerDrawTilesEnd ( getMovie() ); + } + else + { + UIScene::render(width, height, viewport); + } +} + +void UIScene_HUD::handleTimerComplete(int id) +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + + bool anyVisible = false; + if(pMinecraft->localplayers[m_iPad]!= NULL) + { + Gui *pGui = pMinecraft->gui; + //DWORD messagesToDisplay = min( CHAT_LINES_COUNT, pGui->getMessagesCount(m_iPad) ); + for( unsigned int i = 0; i < CHAT_LINES_COUNT; ++i ) + { + float opacity = pGui->getOpacity(m_iPad, i); + if( opacity > 0 ) + { + m_controlLabelBackground[i].setOpacity(opacity); + m_labelChatText[i].setOpacity(opacity); + m_labelChatText[i].setLabel( pGui->getMessagesCount(m_iPad) ? pGui->getMessage(m_iPad,i) : L"" ); + + anyVisible = true; + } + else + { + m_controlLabelBackground[i].setOpacity(0); + m_labelChatText[i].setOpacity(0); + m_labelChatText[i].setLabel(L""); + } + } + if(pGui->getJukeboxOpacity(m_iPad) > 0) anyVisible = true; + m_labelJukebox.setOpacity( pGui->getJukeboxOpacity(m_iPad) ); + m_labelJukebox.setLabel( pGui->getJukeboxMessage(m_iPad) ); + } + else + { + for( unsigned int i = 0; i < CHAT_LINES_COUNT; ++i ) + { + m_controlLabelBackground[i].setOpacity(0); + m_labelChatText[i].setOpacity(0); + m_labelChatText[i].setLabel(L""); + } + m_labelJukebox.setOpacity( 0 ); + } + + //setVisible(anyVisible); +} + +void UIScene_HUD::repositionHud() +{ + if(!m_bSplitscreen) return; + + S32 width = 0; + S32 height = 0; + m_parentLayer->getRenderDimensions( width, height ); + + switch( m_parentLayer->getViewport() ) + { + case C4JRender::VIEWPORT_TYPE_SPLIT_LEFT: + case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: + height = (S32)(ui.getScreenHeight()); + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_TOP: + case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: + width = (S32)(ui.getScreenWidth()); + break; + } + + app.DebugPrintf(app.USER_SR, "Reposition HUD with dims %d, %d\n", width, height ); + + IggyDataValue result; + IggyDataValue value[2]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = width; + value[1].type = IGGY_DATATYPE_number; + value[1].number = height; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcRepositionHud , 2 , value ); +} + +void UIScene_HUD::ShowDisplayName(bool show) +{ + m_lastShowDisplayName = show; + m_labelDisplayName.setVisible(show); +} + +void UIScene_HUD::SetDisplayName(const wstring &displayName) +{ + if(displayName.compare(m_displayName) != 0) + { + m_displayName = displayName; + + IggyDataValue result; + IggyDataValue value[1]; + IggyStringUTF16 stringVal; + stringVal.string = (IggyUTF16*)displayName.c_str(); + stringVal.length = displayName.length(); + value[0].type = IGGY_DATATYPE_string_UTF16; + value[0].string16 = stringVal; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetDisplayName , 1 , value ); + + m_labelDisplayName.setVisible(m_lastShowDisplayName); + } +} + +void UIScene_HUD::SetTooltipsEnabled(bool bEnabled) +{ + if(m_bToolTipsVisible != bEnabled) + { + m_bToolTipsVisible = bEnabled; + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_boolean; + value[0].boolval = bEnabled; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetTooltipsEnabled , 1 , value ); + } +} + +void UIScene_HUD::handleGameTick() +{ + if(getMovie() && app.GetGameStarted()) + { + Minecraft *pMinecraft = Minecraft::GetInstance(); + if(pMinecraft->localplayers[m_iPad] == NULL || pMinecraft->localgameModes[m_iPad] == NULL) + { + m_parentLayer->showComponent(m_iPad, eUIScene_HUD,false); + return; + } + m_parentLayer->showComponent(m_iPad, eUIScene_HUD,true); + + 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 new file mode 100644 index 00000000..9d58ba4b --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_HUD.h @@ -0,0 +1,180 @@ +#pragma once + +#include "UIScene.h" +#include "IUIScene_HUD.h" + +#define CHAT_LINES_COUNT 10 + +class UIScene_HUD : public UIScene, public IUIScene_HUD +{ +private: + bool m_bSplitscreen; + +protected: + UIControl_Label m_labelChatText[CHAT_LINES_COUNT]; + UIControl_Label m_labelJukebox; + UIControl m_controlLabelBackground[CHAT_LINES_COUNT]; + UIControl_Label m_labelDisplayName; + + IggyName m_funcLoadHud, m_funcSetExpBarProgress, m_funcSetPlayerLevel, m_funcSetActiveSlot; + IggyName m_funcSetHealth, m_funcSetFood, m_funcSetAir, m_funcSetArmour; + IggyName m_funcShowHealth, m_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") + UI_MAP_ELEMENT(m_labelChatText[2],"Label3") + UI_MAP_ELEMENT(m_labelChatText[3],"Label4") + UI_MAP_ELEMENT(m_labelChatText[4],"Label5") + UI_MAP_ELEMENT(m_labelChatText[5],"Label6") + UI_MAP_ELEMENT(m_labelChatText[6],"Label7") + UI_MAP_ELEMENT(m_labelChatText[7],"Label8") + UI_MAP_ELEMENT(m_labelChatText[8],"Label9") + UI_MAP_ELEMENT(m_labelChatText[9],"Label10") + + UI_MAP_ELEMENT(m_controlLabelBackground[0],"Label1Background") + UI_MAP_ELEMENT(m_controlLabelBackground[1],"Label2Background") + UI_MAP_ELEMENT(m_controlLabelBackground[2],"Label3Background") + UI_MAP_ELEMENT(m_controlLabelBackground[3],"Label4Background") + UI_MAP_ELEMENT(m_controlLabelBackground[4],"Label5Background") + UI_MAP_ELEMENT(m_controlLabelBackground[5],"Label6Background") + UI_MAP_ELEMENT(m_controlLabelBackground[6],"Label7Background") + UI_MAP_ELEMENT(m_controlLabelBackground[7],"Label8Background") + UI_MAP_ELEMENT(m_controlLabelBackground[8],"Label9Background") + UI_MAP_ELEMENT(m_controlLabelBackground[9],"Label10Background") + + UI_MAP_ELEMENT(m_labelJukebox,"Jukebox") + + UI_MAP_ELEMENT(m_labelDisplayName,"LabelGamertag") + + UI_MAP_NAME(m_funcLoadHud, L"LoadHud") + UI_MAP_NAME(m_funcSetExpBarProgress, L"SetExpBarProgress") + UI_MAP_NAME(m_funcSetPlayerLevel, L"SetPlayerLevel") + UI_MAP_NAME(m_funcSetActiveSlot, L"SetActiveSlot") + + UI_MAP_NAME(m_funcSetHealth, L"SetHealth") + UI_MAP_NAME(m_funcSetFood, L"SetFood") + UI_MAP_NAME(m_funcSetAir, L"SetAir") + UI_MAP_NAME(m_funcSetArmour, L"SetArmour") + + UI_MAP_NAME(m_funcShowHealth, L"ShowHealth") + UI_MAP_NAME(m_funcShowHorseHealth, L"ShowHorseHealth") + UI_MAP_NAME(m_funcShowFood, L"ShowFood") + UI_MAP_NAME(m_funcShowAir, L"ShowAir") + UI_MAP_NAME(m_funcShowArmour, L"ShowArmour") + UI_MAP_NAME(m_funcShowExpbar, L"ShowExpBar") + + UI_MAP_NAME(m_funcSetRegenerationEffect, L"SetRegenerationEffect") + UI_MAP_NAME(m_funcSetFoodSaturationLevel, L"SetFoodSaturationLevel") + + UI_MAP_NAME(m_funcSetDragonHealth, L"SetDragonHealth") + UI_MAP_NAME(m_funcSetDragonLabel, L"SetDragonLabel") + UI_MAP_NAME(m_funcShowDragonHealth, L"ShowDragonHealthBar") + + UI_MAP_NAME(m_funcSetSelectedLabel, L"SetSelectedLabel") + UI_MAP_NAME(m_funcHideSelectedLabel, L"HideSelectedLabel") + + UI_MAP_NAME(m_funcRepositionHud, L"RepositionHud") + UI_MAP_NAME(m_funcSetDisplayName, L"SetGamertag") + + UI_MAP_NAME(m_funcSetTooltipsEnabled, L"SetTooltipsEnabled") + + UI_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: + UIScene_HUD(int iPad, void *initData, UILayer *parentLayer); + + virtual void tick(); + + virtual void updateSafeZone(); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + virtual EUIScene getSceneType() { return eUIScene_HUD;} + + // Returns true if this scene handles input + virtual bool stealsFocus() { return false; } + + // Returns true if this scene has focus for the pad passed in + virtual bool hasFocus(int iPad) { return false; } + + // Returns true if lower scenes in this scenes layer, or in any layer below this scenes layers should be hidden + virtual bool hidesLowerScenes() { return false; } + + virtual void customDraw(IggyCustomDrawCallbackRegion *region); + + virtual void handleReload(); + +private: + virtual int getPad(); + virtual void SetOpacity(float opacity); + virtual void SetVisible(bool visible); + + void SetHudSize(int scale); + void SetExpBarProgress(float progress, int xpNeededForNextLevel); + void SetExpLevel(int level); + void SetActiveSlot(int slot); + + void SetHealth(int iHealth, int iLastHealth, bool bBlink, bool bPoison, bool bWither); + void SetFood(int iFood, int iLastFood, bool bPoison); + 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); + void ShowExpBar(bool show); + + void SetRegenerationEffect(bool bEnabled); + void SetFoodSaturationLevel(int iSaturation); + + void SetDragonHealth(float health); + void SetDragonLabel(const wstring &label); + void ShowDragonHealth(bool show); + + void HideSelectedLabel(); + + void SetDisplayName(const wstring &displayName); + + void SetTooltipsEnabled(bool bEnabled); + + 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); + + void handleGameTick(); + + // RENDERING + virtual void render(S32 width, S32 height, C4JRender::eViewportType viewport); + +protected: + void handleTimerComplete(int id); + +#ifdef _DURANGO + virtual long long getDefaultGtcButtons() { return _360_GTC_PAUSE | _360_GTC_MENU | _360_GTC_VIEW; } +#endif + +private: + void repositionHud(); +}; diff --git a/Minecraft.Client/Common/UI/UIScene_HelpAndOptionsMenu.cpp b/Minecraft.Client/Common/UI/UIScene_HelpAndOptionsMenu.cpp new file mode 100644 index 00000000..a0d63172 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_HelpAndOptionsMenu.cpp @@ -0,0 +1,234 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_HelpAndOptionsMenu.h" +#include "..\..\Minecraft.h" + +UIScene_HelpAndOptionsMenu::UIScene_HelpAndOptionsMenu(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + m_bNotInGame=(Minecraft::GetInstance()->level==NULL); + + m_buttons[BUTTON_HAO_CHANGESKIN].init(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(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 ); + +#ifdef _FINAL_BUILD + removeControl( &m_buttons[BUTTON_HAO_DEBUG], false); +#else + if(!app.DebugSettingsOn()) removeControl( &m_buttons[BUTTON_HAO_DEBUG], false); +#endif + +#ifdef _XBOX_ONE + // 4J-PB - in order to buy the skin packs, we need the signed offer ids for them, which we get in the availability info + // we need to retrieve this info though, so do it here + app.AddDLCRequest(e_Marketplace_Content); // content is skin packs, texture packs and mash-up packs + + // we also need to mount the local DLC so we can tell what's been purchased + app.StartInstallDLCProcess(iPad); +#endif + + + + // 4J-PB - do not need a storage device to see this menu - just need one when you choose to re-install them + bool bNotInGame=(Minecraft::GetInstance()->level==NULL); + + // any content to be re-installed? + if(m_iPad==ProfileManager.GetPrimaryPad() && bNotInGame) + { + // We should show the reinstall menu + app.DebugPrintf("Reinstall Menu required...\n"); + } + else + { + removeControl( &m_buttons[BUTTON_HAO_REINSTALL], false); + } + + if(app.GetLocalPlayerCount()>1) + { + // no credits in splitscreen + removeControl( &m_buttons[BUTTON_HAO_CREDITS], false); + +#if TO_BE_IMPLEMENTED + app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad,false); +#endif + if(ProfileManager.GetPrimaryPad()!=m_iPad) + { + removeControl( &m_buttons[BUTTON_HAO_REINSTALL], false); + } + } + + if(!ProfileManager.IsFullVersion() )//|| ProfileManager.IsGuest(m_iPad)) + { + removeControl( &m_buttons[BUTTON_HAO_CHANGESKIN], false); + } + + // 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); +} + +UIScene_HelpAndOptionsMenu::~UIScene_HelpAndOptionsMenu() +{ +} + +wstring UIScene_HelpAndOptionsMenu::getMoviePath() +{ + if(app.GetLocalPlayerCount() > 1) + { + return L"HelpAndOptionsMenuSplit"; + } + else + { + return L"HelpAndOptionsMenu"; + } +} + +void UIScene_HelpAndOptionsMenu::updateTooltips() +{ + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); +} + +void UIScene_HelpAndOptionsMenu::updateComponents() +{ + bool bNotInGame=(Minecraft::GetInstance()->level==NULL); + if(bNotInGame) + { + m_parentLayer->showComponent(m_iPad,eUIComponent_Panorama,true); + m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,true); + } + else + { + m_parentLayer->showComponent(m_iPad,eUIComponent_Panorama,false); + + if( app.GetLocalPlayerCount() == 1 ) m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,true); + else m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,false); + + } +} + +void UIScene_HelpAndOptionsMenu::handleReload() +{ +#ifdef _FINAL_BUILD + removeControl( &m_buttons[BUTTON_HAO_DEBUG], false); +#else + if(!app.DebugSettingsOn()) removeControl( &m_buttons[BUTTON_HAO_DEBUG], false); +#endif + + // 4J-PB - do not need a storage device to see this menu - just need one when you choose to re-install them + bool bNotInGame=(Minecraft::GetInstance()->level==NULL); + + // any content to be re-installed? + if(m_iPad==ProfileManager.GetPrimaryPad() && bNotInGame) + { + // We should show the reinstall menu + app.DebugPrintf("Reinstall Menu required...\n"); + } + else + { + removeControl( &m_buttons[BUTTON_HAO_REINSTALL], false); + } + + if(app.GetLocalPlayerCount()>1) + { + // no credits in splitscreen + removeControl( &m_buttons[BUTTON_HAO_CREDITS], false); + +#if TO_BE_IMPLEMENTED + app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad,false); +#endif + if(ProfileManager.GetPrimaryPad()!=m_iPad) + { + removeControl( &m_buttons[BUTTON_HAO_REINSTALL], false); + } + } + + if(!ProfileManager.IsFullVersion() )//|| ProfileManager.IsGuest(m_iPad)) + { +#if TO_BE_IMPLEMENTED + m_Buttons[BUTTON_HAO_CHANGESKIN].SetEnable(FALSE); + m_Buttons[BUTTON_HAO_CHANGESKIN].EnableInput(FALSE); + // set the focus to the second button + + XuiElementSetUserFocus(m_Buttons[BUTTON_HAO_HOWTOPLAY].m_hObj, m_iPad); +#endif + } + + if(!ProfileManager.IsFullVersion() )//|| ProfileManager.IsGuest(m_iPad)) + { + removeControl( &m_buttons[BUTTON_HAO_CHANGESKIN], false); + } + + doHorizontalResizeCheck(); +} + +void UIScene_HelpAndOptionsMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + //app.DebugPrintf("UIScene_DebugOverlay handling input for pad %d, key %d, down- %s, pressed- %s, released- %s\n", iPad, key, down?"TRUE":"FALSE", pressed?"TRUE":"FALSE", released?"TRUE":"FALSE"); + + ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); + + switch(key) + { + case ACTION_MENU_CANCEL: + if(pressed && !repeat) + { + navigateBack(); + } + break; + case ACTION_MENU_OK: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + //CD - Added for audio + if(pressed) + { + ui.PlayUISFX(eSFX_Press); + } + + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + sendInputToMovie(key, repeat, pressed, released); + break; + } +} + +void UIScene_HelpAndOptionsMenu::handlePress(F64 controlId, F64 childId) +{ + switch((int)controlId) + { + case BUTTON_HAO_CHANGESKIN: + ui.NavigateToScene(m_iPad, eUIScene_SkinSelectMenu); + break; + case BUTTON_HAO_HOWTOPLAY: + ui.NavigateToScene(m_iPad, eUIScene_HowToPlayMenu); + break; + case BUTTON_HAO_CONTROLS: + ui.NavigateToScene(m_iPad, eUIScene_ControlsMenu); + break; + case BUTTON_HAO_SETTINGS: + ui.NavigateToScene(m_iPad, eUIScene_SettingsMenu); + break; + case BUTTON_HAO_CREDITS: + ui.NavigateToScene(m_iPad, eUIScene_Credits); + break; + case BUTTON_HAO_REINSTALL: + ui.NavigateToScene(m_iPad, eUIScene_ReinstallMenu); + break; + case BUTTON_HAO_DEBUG: + ui.NavigateToScene(m_iPad, eUIScene_DebugOptions); + break; + } +} diff --git a/Minecraft.Client/Common/UI/UIScene_HelpAndOptionsMenu.h b/Minecraft.Client/Common/UI/UIScene_HelpAndOptionsMenu.h new file mode 100644 index 00000000..203011d3 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_HelpAndOptionsMenu.h @@ -0,0 +1,50 @@ +#pragma once + +#include "UIScene.h" + +#define BUTTON_HAO_CHANGESKIN 0 +#define BUTTON_HAO_HOWTOPLAY 1 +#define BUTTON_HAO_CONTROLS 2 +#define BUTTON_HAO_SETTINGS 3 +#define BUTTON_HAO_CREDITS 4 +#define BUTTON_HAO_REINSTALL 5 +#define BUTTON_HAO_DEBUG 6 +#define BUTTONS_HAO_MAX BUTTON_HAO_DEBUG + 1 + +class UIScene_HelpAndOptionsMenu : public UIScene +{ +private: + UIControl_Button m_buttons[BUTTONS_HAO_MAX]; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_buttons[BUTTON_HAO_CHANGESKIN], "Button1") + UI_MAP_ELEMENT( m_buttons[BUTTON_HAO_HOWTOPLAY], "Button2") + UI_MAP_ELEMENT( m_buttons[BUTTON_HAO_CONTROLS], "Button3") + UI_MAP_ELEMENT( m_buttons[BUTTON_HAO_SETTINGS], "Button4") + UI_MAP_ELEMENT( m_buttons[BUTTON_HAO_CREDITS], "Button5") + UI_MAP_ELEMENT( m_buttons[BUTTON_HAO_REINSTALL], "Button6") + UI_MAP_ELEMENT( m_buttons[BUTTON_HAO_DEBUG], "Button7") + UI_END_MAP_ELEMENTS_AND_NAMES() + + bool m_bNotInGame; +public: + UIScene_HelpAndOptionsMenu(int iPad, void *initData, UILayer *parentLayer); + virtual ~UIScene_HelpAndOptionsMenu(); + + virtual EUIScene getSceneType() { return eUIScene_HelpAndOptionsMenu;} + + virtual void updateTooltips(); + virtual void updateComponents(); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + virtual void handleReload(); + + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + +protected: + void handlePress(F64 controlId, F64 childId); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_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 new file mode 100644 index 00000000..e33e24fe --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_HowToPlay.cpp @@ -0,0 +1,343 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_HowToPlay.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" + +static UIScene_HowToPlay::SHowToPlayPageDef gs_aPageDefs[ eHowToPlay_NumPages ] = +{ + { IDS_HOW_TO_PLAY_WHATSNEW, 0, 0}, // eHowToPlay_WhatsNew + { IDS_HOW_TO_PLAY_BASICS, 0, 0}, // eHowToPlay_Basics + { IDS_HOW_TO_PLAY_MULTIPLAYER, 0, 0}, // eHowToPlay_Multiplayer + { IDS_HOW_TO_PLAY_HUD, 0, 0}, // eHowToPlay_HUD + { IDS_HOW_TO_PLAY_CREATIVE, UIScene_HowToPlay::eHowToPlay_LabelCreativeInventory, 1}, // eHowToPlay_Creative + { IDS_HOW_TO_PLAY_INVENTORY, UIScene_HowToPlay::eHowToPlay_LabelIInventory, 1}, // eHowToPlay_Inventory + { IDS_HOW_TO_PLAY_CHEST, UIScene_HowToPlay::eHowToPlay_LabelSCInventory, 2}, // eHowToPlay_Chest + { IDS_HOW_TO_PLAY_LARGECHEST, UIScene_HowToPlay::eHowToPlay_LabelLCInventory, 2}, // eHowToPlay_LargeChest + { IDS_HOW_TO_PLAY_ENDERCHEST, 0, 0}, // eHowToPlay_EnderChest + { IDS_HOW_TO_PLAY_CRAFTING, UIScene_HowToPlay::eHowToPlay_LabelCItem, 3}, // eHowToPlay_InventoryCrafting + { IDS_HOW_TO_PLAY_CRAFT_TABLE, UIScene_HowToPlay::eHowToPlay_LabelCTItem, 3}, // eHowToPlay_CraftTable + { IDS_HOW_TO_PLAY_FURNACE, UIScene_HowToPlay::eHowToPlay_LabelFFuel, 4}, // eHowToPlay_Furnace + { IDS_HOW_TO_PLAY_DISPENSER, UIScene_HowToPlay::eHowToPlay_LabelDText, 2}, // eHowToPlay_Dispenser + { IDS_HOW_TO_PLAY_BREWING, UIScene_HowToPlay::eHowToPlay_LabelBBrew, 2}, // eHowToPlay_Brewing + { IDS_HOW_TO_PLAY_ENCHANTMENT, UIScene_HowToPlay::eHowToPlay_LabelEEnchant, 2}, // eHowToPlay_Enchantment + { IDS_HOW_TO_PLAY_ANVIL, UIScene_HowToPlay::eHowToPlay_LabelAnvil_Inventory, 3}, // eHowToPlay_Anvil + { IDS_HOW_TO_PLAY_FARMANIMALS, 0, 0}, // eHowToPlay_Breeding + { IDS_HOW_TO_PLAY_BREEDANIMALS, 0, 0}, // eHowToPlay_Breeding + { IDS_HOW_TO_PLAY_TRADING, UIScene_HowToPlay::eHowToPlay_LabelTrading_Inventory, 5}, // eHowToPlay_Trading + { IDS_HOW_TO_PLAY_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 + { IDS_HOW_TO_PLAY_SOCIALMEDIA, 0, 0}, // eHowToPlay_SocialMedia + { IDS_HOW_TO_PLAY_BANLIST, 0, 0}, // eHowToPlay_BanList +#endif + { IDS_HOW_TO_PLAY_HOSTOPTIONS, 0, 0}, // eHowToPlay_HostOptions +}; + +int gs_pageToFlashMapping[eHowToPlay_NumPages] = +{ + 0, //eHowToPlay_WhatsNew = 0, + 1, //eHowToPlay_Basics, + 2, //eHowToPlay_Multiplayer, + 3, //eHowToPlay_HUD, + 4, //eHowToPlay_Creative, + 5, //eHowToPlay_Inventory, + 6, //eHowToPlay_Chest, + 7, //eHowToPlay_LargeChest, + 23, //eHowToPlay_Enderchest, + 8, //eHowToPlay_InventoryCrafting, + 9, //eHowToPlay_CraftTable, + 10, //eHowToPlay_Furnace, + 11, //eHowToPlay_Dispenser, + + 12, //eHowToPlay_Brewing, + 13, //eHowToPlay_Enchantment, + 21, //eHowToPlay_Anvil, + 14, //eHowToPlay_FarmingAnimals, + 15, //eHowToPlay_Breeding, + 22, //eHowToPlay_Trading, + + 24, //eHowToPlay_Horses + 25, //eHowToPlay_Beacons + 26, //eHowToPlay_Fireworks + 27, //eHowToPlay_Hoppers + 28, //eHowToPlay_Droppers + + 16, //eHowToPlay_NetherPortal, + 17, //eHowToPlay_TheEnd, +#ifdef _XBOX + 18, //eHowToPlay_SocialMedia, + 19, //eHowToPlay_BanList, +#endif + 20, //eHowToPlay_HostOptions, +}; + +UIScene_HowToPlay::UIScene_HowToPlay(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + wstring inventoryString = app.GetString(IDS_INVENTORY); + m_labels[ eHowToPlay_LabelCTItem].init(app.GetString(IDS_ITEM_HATCHET_WOOD)); + m_labels[ eHowToPlay_LabelCTGroup].init(app.GetString(IDS_GROUPNAME_TOOLS)); + m_labels[ eHowToPlay_LabelCTInventory3x3].init(inventoryString); + m_labels[ eHowToPlay_LabelCItem].init(app.GetString(IDS_TILE_WORKBENCH)); + m_labels[ eHowToPlay_LabelCGroup].init(app.GetString(IDS_GROUPNAME_STRUCTURES)); + m_labels[ eHowToPlay_LabelCInventory2x2].init(inventoryString); + m_labels[ eHowToPlay_LabelFFuel].init(app.GetString(IDS_FUEL)); + m_labels[ eHowToPlay_LabelFInventory].init(inventoryString); + m_labels[ eHowToPlay_LabelFIngredient].init(app.GetString(IDS_INGREDIENT)); + m_labels[ eHowToPlay_LabelFChest].init(app.GetString(IDS_FURNACE)); + m_labels[ eHowToPlay_LabelLCInventory].init(inventoryString); + m_labels[ eHowToPlay_LabelCreativeInventory].init(app.GetString(IDS_GROUPNAME_BUILDING_BLOCKS)); + m_labels[ eHowToPlay_LabelLCChest].init(app.GetString(IDS_CHEST_LARGE)); + m_labels[ eHowToPlay_LabelSCInventory].init(inventoryString); + m_labels[ eHowToPlay_LabelSCChest].init(app.GetString(IDS_CHEST)); + m_labels[ eHowToPlay_LabelIInventory].init(inventoryString); + m_labels[ eHowToPlay_LabelDInventory].init(inventoryString); + m_labels[ eHowToPlay_LabelDText].init(app.GetString(IDS_DISPENSER)); + m_labels[ eHowToPlay_LabelEEnchant].init(app.GetString(IDS_ENCHANT)); + m_labels[ eHowToPlay_LabelEInventory].init(inventoryString); + m_labels[ eHowToPlay_LabelBBrew].init(app.GetString(IDS_BREWING_STAND)); + m_labels[ eHowToPlay_LabelBInventory].init(inventoryString); + m_labels[ eHowToPlay_LabelAnvil_Inventory].init(inventoryString.c_str()); + + wstring wsTemp = app.GetString(IDS_REPAIR_COST); + wsTemp.replace( wsTemp.find(L"%d"), 2, wstring(L"8") ); + + m_labels[ eHowToPlay_LabelAnvil_Cost].init(wsTemp.c_str()); + m_labels[ eHowToPlay_LabelAnvil_ARepairAndName].init(app.GetString(IDS_REPAIR_AND_NAME)); + m_labels[ eHowToPlay_LabelTrading_Inventory].init(inventoryString.c_str()); + m_labels[ eHowToPlay_LabelTrading_Offer2].init(app.GetString(IDS_ITEM_EMERALD)); + m_labels[ eHowToPlay_LabelTrading_Offer1].init(app.GetString(IDS_ITEM_EMERALD)); + m_labels[ eHowToPlay_LabelTrading_NeededForTrade].init(app.GetString(IDS_REQUIRED_ITEMS_FOR_TRADE)); + + 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)); + m_labels[ eHowToPlay_LabelTrading_VillagerOffers].init(wsTemp.c_str()); + + // Extract pad and required page from init data. We just put the data into the pointer rather than using it as an address. + size_t uiInitData = ( size_t )( initData ); + + EHowToPlayPage eStartPage = ( EHowToPlayPage )( ( uiInitData >> 16 ) & 0xFFF ); // Ignores MSB which is set to 1! + + TelemetryManager->RecordMenuShown(m_iPad, eUIScene_HowToPlay, (ETelemetry_HowToPlay_SubMenuId)eStartPage); + + StartPage( eStartPage ); +} + +wstring UIScene_HowToPlay::getMoviePath() +{ + if(app.GetLocalPlayerCount() > 1) + { + return L"HowToPlaySplit"; + } + else + { + return L"HowToPlay"; + } +} + +void UIScene_HowToPlay::updateTooltips() +{ + // Tool tips. + int iPage = ( int )( m_eCurrPage ); + + int firstPage = eHowToPlay_WhatsNew; + + // 4J Stu - Add back for future platforms +#if 0 + // No What's New for the first PS4 and Xbox One builds + if(true) + { + ++firstPage; + } +#endif + + int iA = -1; + int iX = -1; + if ( iPage == firstPage ) + { + // No previous page. + iA = IDS_HOW_TO_PLAY_NEXT; + } + else if ( ( iPage + 1 ) == eHowToPlay_NumPages ) + { + // No next page. + iX = IDS_HOW_TO_PLAY_PREV; + } + else + { + iA = IDS_HOW_TO_PLAY_NEXT; + iX = IDS_HOW_TO_PLAY_PREV; + } + ui.SetTooltips( m_iPad, iA, IDS_TOOLTIPS_BACK, iX ); +} + +void UIScene_HowToPlay::handleReload() +{ + StartPage( m_eCurrPage ); +} + +void UIScene_HowToPlay::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); + + switch(key) + { + case ACTION_MENU_CANCEL: + if(pressed) + { + navigateBack(); + handled = true; + } + break; + case ACTION_MENU_A: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + if(pressed) + { + // Next page + int iNextPage = ( int )( m_eCurrPage ) + 1; + if ( iNextPage != eHowToPlay_NumPages ) + { + StartPage( ( EHowToPlayPage )( iNextPage ) ); + ui.PlayUISFX(eSFX_Press); + } + handled = true; + } + break; + case ACTION_MENU_X: + if(pressed) + { + // Previous page + int iPrevPage = ( int )( m_eCurrPage ) - 1; + + // 4J Stu - Add back for future platforms +#if 0 + // No What's New for the first PS4 and Xbox One builds + if(true) + { + if ( iPrevPage >= 0 && !((iPrevPage==eHowToPlay_WhatsNew))) + { + StartPage( ( EHowToPlayPage )( iPrevPage ) ); + ui.PlayUISFX(eSFX_Press); + } + } + else +#endif + { + if ( iPrevPage >= 0 ) + { + StartPage( ( EHowToPlayPage )( iPrevPage ) ); + ui.PlayUISFX(eSFX_Press); + } + + } + handled = true; + } + break; + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + case ACTION_MENU_PAGEUP: + case ACTION_MENU_PAGEDOWN: + sendInputToMovie(key, repeat, pressed, released); + break; + } +} + +void UIScene_HowToPlay::StartPage( EHowToPlayPage ePage ) +{ + m_eCurrPage = ePage; + + // Turn on just what we need for this screen. + SHowToPlayPageDef* pDef = &( gs_aPageDefs[ m_eCurrPage ] ); + + // Replace button identifiers in the text with actual button images. + wstring replacedText = app.FormatHTMLString(m_iPad, app.GetString( pDef->m_iTextStringID )); + // 4J-PB - replace the title with the platform specific title, and the platform name +// replacedText = replaceAll(replacedText,L"{*TITLE_UPDATE_NAME*}",app.GetString(IDS_TITLE_UPDATE_NAME)); + replacedText = replaceAll(replacedText,L"{*KICK_PLAYER_DESCRIPTION*}",app.GetString(IDS_KICK_PLAYER_DESCRIPTION)); +#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 ); + + // Set the text colour + wstring finalText(replacedText.c_str() ); + wchar_t startTags[64]; + swprintf(startTags,64,L"",app.GetHTMLColour(eHTMLColor_White)); + finalText = startTags + finalText; + + vector paragraphs; + int lastIndex = 0; + for ( int index = finalText.find(L"\r\n", lastIndex, 2); + index != wstring::npos; + index = finalText.find(L"\r\n", lastIndex, 2) + ) + { + paragraphs.push_back( finalText.substr(lastIndex, index-lastIndex) + L" " ); + lastIndex = index + 2; + } + paragraphs.push_back( finalText.substr( lastIndex, finalText.length() - lastIndex ) ); + + // Set the text in the scene + IggyDataValue result; + + IggyDataValue *value = new IggyDataValue[paragraphs.size()+1]; + IggyStringUTF16 * stringVal = new IggyStringUTF16[paragraphs.size()]; + + value[0].type = IGGY_DATATYPE_number; + value[0].number = gs_pageToFlashMapping[(int)ePage]; + + for(unsigned int i = 0; i < paragraphs.size(); ++i) + { + stringVal[i].string = (IggyUTF16 *)paragraphs[i].c_str(); + stringVal[i].length = paragraphs[i].length(); + value[i+1].type = IGGY_DATATYPE_string_UTF16; + value[i+1].string16 = stringVal[i]; + } + + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcLoadPage , 1 + paragraphs.size(), value ); + + delete [] value; + delete [] stringVal; + + updateTooltips(); + + TelemetryManager->RecordMenuShown(m_iPad, eUIScene_HowToPlay, (ETelemetry_HowToPlay_SubMenuId)ePage); + +#ifdef __PSVITA__ + ui.TouchBoxRebuild(this); +#endif +} diff --git a/Minecraft.Client/Common/UI/UIScene_HowToPlay.h b/Minecraft.Client/Common/UI/UIScene_HowToPlay.h new file mode 100644 index 00000000..fe845896 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_HowToPlay.h @@ -0,0 +1,143 @@ +#pragma once + +#include "UIScene.h" + + +class UIScene_HowToPlay : public UIScene +{ +public: + enum EHowToPlayLabelControls + { + eHowToPlay_LabelNone = -1, + eHowToPlay_LabelIInventory =0, + eHowToPlay_LabelSCInventory , + eHowToPlay_LabelSCChest , + eHowToPlay_LabelLCInventory , + eHowToPlay_LabelLCChest , + eHowToPlay_LabelCItem , + eHowToPlay_LabelCGroup , + eHowToPlay_LabelCInventory2x2 , + eHowToPlay_LabelCTItem , + eHowToPlay_LabelCTGroup , + eHowToPlay_LabelCTInventory3x3 , + eHowToPlay_LabelFFuel , + eHowToPlay_LabelFInventory , + eHowToPlay_LabelFIngredient , + eHowToPlay_LabelFChest , + eHowToPlay_LabelDText , + eHowToPlay_LabelDInventory , + eHowToPlay_LabelCreativeInventory, + eHowToPlay_LabelEEnchant, + eHowToPlay_LabelEInventory, + eHowToPlay_LabelBBrew, + eHowToPlay_LabelBInventory, + eHowToPlay_LabelAnvil_Inventory, + eHowToPlay_LabelAnvil_Cost, + eHowToPlay_LabelAnvil_ARepairAndName, + eHowToPlay_LabelTrading_Inventory, + eHowToPlay_LabelTrading_Offer2, + eHowToPlay_LabelTrading_Offer1, + eHowToPlay_LabelTrading_NeededForTrade, + eHowToPlay_LabelTrading_VillagerOffers, + eHowToPlay_LabelBeacon_PrimaryPower, + eHowToPlay_LabelBeacon_SecondaryPower, + eHowToPlay_LabelFireworksText, + eHowToPlay_LabelFireworksInventory, + eHowToPlay_LabelHopperText, + eHowToPlay_LabelHopperInventory, + eHowToPlay_LabelDropperText, + eHowToPlay_LabelDropperInventory, + eHowToPlay_NumLabels + }; + + struct SHowToPlayPageDef + { + int m_iTextStringID; // -1 if not used. + int m_iLabelStartIndex; // index of the labels if there are any for the page + int m_iLabelCount; + }; + +private: + EHowToPlayPage m_eCurrPage; + + IggyName m_funcLoadPage; + UIControl_DynamicLabel m_DynamicLabel; + UIControl_Label m_labels[ eHowToPlay_NumLabels ]; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_DynamicLabel , "DynamicHtmlText" ) + + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelCTGroup ] , "Label1_9" ) + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelCTItem ] , "Label2_9") + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelCTInventory3x3 ] , "Label3_9" ) + + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelCGroup ] , "Label1_8" ) + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelCItem ] , "Label2_8" ) + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelCInventory2x2 ] , "Label3_8" ) + + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelFChest ] , "Label1_10" ) + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelFIngredient ] , "Label2_10" ) + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelFFuel ] , "Label3_10" ) + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelFInventory ] , "Label4_10" ) + + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelLCChest ] , "Label1_7" ) + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelLCInventory ] , "Label2_7" ) + + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelCreativeInventory ] , "Label1_4" ) + + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelSCChest ] , "Label1_6" ) + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelSCInventory ] , "Label2_6" ) + + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelIInventory ] , "Label1_5" ) + + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelDText ] , "Label1_11" ) + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelDInventory ] , "Label2_11" ) + + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelEEnchant ] , "Label1_13" ) + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelEInventory ] , "Label2_13" ) + + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelBBrew ] , "Label1_12" ) + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelBInventory ] , "Label2_12" ) + + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelTrading_VillagerOffers ] , "Label1_22" ) + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelTrading_NeededForTrade ] , "Label2_22" ) + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelTrading_Inventory ] , "Label3_22" ) + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelTrading_Offer1 ] , "Label4_22" ) + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelTrading_Offer2 ] , "Label5_22" ) + + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelAnvil_ARepairAndName ] , "Label1_21" ) + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelAnvil_Cost ] , "Label2_21" ) + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelAnvil_Inventory ] , "Label3_21" ) + + UI_MAP_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() +public: + UIScene_HowToPlay(int iPad, void *initData, UILayer *parentLayer); + + virtual EUIScene getSceneType() { return eUIScene_HowToPlay;} + virtual void updateTooltips(); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + virtual void handleReload(); + + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + +private: + void StartPage( EHowToPlayPage ePage ); +}; diff --git a/Minecraft.Client/Common/UI/UIScene_HowToPlayMenu.cpp b/Minecraft.Client/Common/UI/UIScene_HowToPlayMenu.cpp new file mode 100644 index 00000000..92e8bdef --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_HowToPlayMenu.cpp @@ -0,0 +1,203 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_HowToPlayMenu.h" + +// strings for buttons in the list +unsigned int UIScene_HowToPlayMenu::m_uiHTPButtonNameA[]= +{ + IDS_HOW_TO_PLAY_MENU_WHATSNEW, // eHTPButton_WhatsNew + IDS_HOW_TO_PLAY_MENU_BASICS, // eHTPButton_Basics, + IDS_HOW_TO_PLAY_MENU_MULTIPLAYER, // eHTPButton_Multiplayer + IDS_HOW_TO_PLAY_MENU_HUD, // eHTPButton_Hud, + IDS_HOW_TO_PLAY_MENU_CREATIVE, // eHTPButton_Creative, + IDS_HOW_TO_PLAY_MENU_INVENTORY, // eHTPButton_Inventory, + IDS_HOW_TO_PLAY_MENU_CHESTS, // eHTPButton_Chest, + IDS_HOW_TO_PLAY_MENU_CRAFTING, // eHTPButton_Crafting, + IDS_HOW_TO_PLAY_MENU_FURNACE, // eHTPButton_Furnace, + IDS_HOW_TO_PLAY_MENU_DISPENSER, // eHTPButton_Dispenser, + + IDS_HOW_TO_PLAY_MENU_BREWING, // eHTPButton_Brewing, + IDS_HOW_TO_PLAY_MENU_ENCHANTMENT, // eHTPButton_Enchantment, + IDS_HOW_TO_PLAY_MENU_ANVIL, + IDS_HOW_TO_PLAY_MENU_FARMANIMALS, // eHTPButton_Breeding, + IDS_HOW_TO_PLAY_MENU_BREEDANIMALS, // eHTPButton_Breeding, + IDS_HOW_TO_PLAY_MENU_TRADING, + + IDS_HOW_TO_PLAY_MENU_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 + IDS_HOW_TO_PLAY_MENU_SOCIALMEDIA, // eHTPButton_SocialMedia, + IDS_HOW_TO_PLAY_MENU_BANLIST, // eHTPButton_BanningLevels, +#endif + IDS_HOW_TO_PLAY_MENU_HOSTOPTIONS, // eHTPButton_HostOptions, +}; + +// mapping the buttons to a scene value +unsigned int UIScene_HowToPlayMenu::m_uiHTPSceneA[]= +{ + eHowToPlay_WhatsNew, + eHowToPlay_Basics, + eHowToPlay_Multiplayer, + eHowToPlay_HUD, + eHowToPlay_Creative, + eHowToPlay_Inventory, + eHowToPlay_Chest, + eHowToPlay_InventoryCrafting, + eHowToPlay_Furnace, + eHowToPlay_Dispenser, + + eHowToPlay_Brewing, + eHowToPlay_Enchantment, + eHowToPlay_Anvil, + eHowToPlay_FarmingAnimals, + eHowToPlay_Breeding, + eHowToPlay_Trading, + + eHowToPlay_Horses, + eHowToPlay_Beacons, + eHowToPlay_Fireworks, + eHowToPlay_Hoppers, + eHowToPlay_Droppers, + + eHowToPlay_NetherPortal, + eHowToPlay_TheEnd, +#ifdef _XBOX + eHowToPlay_SocialMedia, + eHowToPlay_BanList, +#endif + eHowToPlay_HostOptions, +}; + +UIScene_HowToPlayMenu::UIScene_HowToPlayMenu(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + m_buttonListHowTo.init(eControl_Buttons); + + for(unsigned int i = 0; i < eHTPButton_Max; ++i) + { + // 4J Stu - Re-add for future platforms +#if 0 + // No What's New + if(true) + { + if(!(i==eHTPButton_WhatsNew) ) + { + m_buttonListHowTo.addItem( app.GetString(m_uiHTPButtonNameA[i]) , i);//iCount++); + } + } + else +#endif + { + m_buttonListHowTo.addItem( app.GetString(m_uiHTPButtonNameA[i]) , i);//iCount++); + } + } + + doHorizontalResizeCheck(); +} + +wstring UIScene_HowToPlayMenu::getMoviePath() +{ + if(app.GetLocalPlayerCount() > 1) + { + return L"HowToPlayMenuSplit"; + } + else + { + return L"HowToPlayMenu"; + } +} + +void UIScene_HowToPlayMenu::updateTooltips() +{ + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); +} + +void UIScene_HowToPlayMenu::updateComponents() +{ + bool bNotInGame=(Minecraft::GetInstance()->level==NULL); + if(bNotInGame) + { + m_parentLayer->showComponent(m_iPad,eUIComponent_Panorama,true); + m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,true); + } + else + { + m_parentLayer->showComponent(m_iPad,eUIComponent_Panorama,false); + + if( app.GetLocalPlayerCount() == 1 ) m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,true); + else m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,false); + } +} + +void UIScene_HowToPlayMenu::handleReload() +{ + for(unsigned int i = 0; i < eHTPButton_Max; ++i) + { + // 4J Stu - Re-add for future platforms +#if 0 + // No What's New + if(true) + { + if(!(i==eHTPButton_WhatsNew) ) + { + m_buttonListHowTo.addItem( app.GetString(m_uiHTPButtonNameA[i]) , i); + } + } + else +#endif + { + m_buttonListHowTo.addItem( app.GetString(m_uiHTPButtonNameA[i]) , i); + } + } + + doHorizontalResizeCheck(); +} + +void UIScene_HowToPlayMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + //app.DebugPrintf("UIScene_DebugOverlay handling input for pad %d, key %d, down- %s, pressed- %s, released- %s\n", iPad, key, down?"TRUE":"FALSE", pressed?"TRUE":"FALSE", released?"TRUE":"FALSE"); + ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); + + switch(key) + { + case ACTION_MENU_CANCEL: + if(pressed) + { + navigateBack(); + } + break; + case ACTION_MENU_OK: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + sendInputToMovie(key, repeat, pressed, released); + break; + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + case ACTION_MENU_PAGEUP: + case ACTION_MENU_PAGEDOWN: + sendInputToMovie(key, repeat, pressed, released); + break; + } +} + +void UIScene_HowToPlayMenu::handlePress(F64 controlId, F64 childId) +{ + if( (int)controlId == eControl_Buttons) + { + //CD - Added for audio + ui.PlayUISFX(eSFX_Press); + + unsigned int uiInitData; + uiInitData = ( ( 1 << 31 ) | ( m_uiHTPSceneA[(int)childId] << 16 ) | ( short )( m_iPad ) ); + ui.NavigateToScene(m_iPad, eUIScene_HowToPlay, ( void* )( uiInitData ) ); + } +} diff --git a/Minecraft.Client/Common/UI/UIScene_HowToPlayMenu.h b/Minecraft.Client/Common/UI/UIScene_HowToPlayMenu.h new file mode 100644 index 00000000..1afcec38 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_HowToPlayMenu.h @@ -0,0 +1,73 @@ +#pragma once + +#include "UIScene.h" + +class UIScene_HowToPlayMenu : public UIScene +{ +private: + enum EControls + { + eControl_Buttons, + }; + + enum eHTPButton + { + eHTPButton_WhatsNew = 0, + eHTPButton_Basics, + eHTPButton_Multiplayer, + eHTPButton_Hud, + eHTPButton_Creative, + eHTPButton_Inventory, + eHTPButton_Chest, + eHTPButton_Crafting, + eHTPButton_Furnace, + eHTPButton_Dispenser, + eHTPButton_Brewing, + eHTPButton_Enchantment, + eHTPButton_Anvil, + eHTPButton_FarmingAnimals, + eHTPButton_Breeding, + eHTPButton_Trading, + eHTPButton_Horses, + eHTPButton_Beacons, + eHTPButton_Fireworks, + eHTPButton_Hoppers, + eHTPButton_Droppers, + eHTPButton_NetherPortal, + eHTPButton_TheEnd, +#ifdef _XBOX + eHTPButton_SocialMedia, + eHTPButton_BanningLevels, +#endif + eHTPButton_HostOptions, + eHTPButton_Max, + }; + + static unsigned int m_uiHTPButtonNameA[eHTPButton_Max]; + static unsigned int m_uiHTPSceneA[eHTPButton_Max]; + + UIControl_ButtonList m_buttonListHowTo; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_buttonListHowTo, "HowToList") + UI_END_MAP_ELEMENTS_AND_NAMES() + +public: + UIScene_HowToPlayMenu(int iPad, void *initData, UILayer *parentLayer); + + virtual EUIScene getSceneType() { return eUIScene_HowToPlayMenu;} + + virtual void updateTooltips(); + virtual void updateComponents(); + + virtual void handleReload(); +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + +protected: + void handlePress(F64 controlId, F64 childId); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_InGameHostOptionsMenu.cpp b/Minecraft.Client/Common/UI/UIScene_InGameHostOptionsMenu.cpp new file mode 100644 index 00000000..68ac537e --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_InGameHostOptionsMenu.cpp @@ -0,0 +1,161 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_InGameHostOptionsMenu.h" +#include "..\..\Minecraft.h" +#include "..\..\MultiPlayerLocalPlayer.h" +#include "..\..\ClientConnection.h" +#include "..\..\..\Minecraft.World\net.minecraft.network.h" +#include "..\..\..\Minecraft.World\net.minecraft.network.packet.h" + +UIScene_InGameHostOptionsMenu::UIScene_InGameHostOptionsMenu(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + m_checkboxFireSpreads.init(app.GetString(IDS_FIRE_SPREADS), eControl_FireSpreads, app.GetGameHostOption(eGameHostOption_FireSpreads)!=0); + m_checkboxTNT.init(app.GetString(IDS_TNT_EXPLODES), eControl_TNT, app.GetGameHostOption(eGameHostOption_TNT)!=0); + + 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) + && Player::getPlayerGamePrivilege(privs,Player::ePlayerGamePrivilege_CanTeleport) + && g_NetworkManager.GetPlayerCount() > 1) + { + m_buttonTeleportToPlayer.init(app.GetString(IDS_TELEPORT_TO_PLAYER), eControl_TeleportToPlayer); + m_buttonTeleportToMe.init(app.GetString(IDS_TELEPORT_TO_ME), eControl_TeleportToMe); + } + else + { + removeControl(&m_buttonTeleportToPlayer, true); + removeControl(&m_buttonTeleportToMe, true); + } +} + +wstring UIScene_InGameHostOptionsMenu::getMoviePath() +{ + if(app.GetLocalPlayerCount() > 1) + { + return L"InGameHostOptionsSplit"; + } + else + { + return L"InGameHostOptions"; + } +} + +void UIScene_InGameHostOptionsMenu::updateTooltips() +{ + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); +} + +void UIScene_InGameHostOptionsMenu::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"); + + ui.AnimateKeyPress(iPad, key, repeat, pressed, released); + switch(key) + { + case ACTION_MENU_CANCEL: + if(pressed) + { + unsigned int hostOptions = app.GetGameHostOption(eGameHostOption_All); + app.SetGameHostOption(hostOptions, eGameHostOption_FireSpreads, m_checkboxFireSpreads.IsChecked()); + app.SetGameHostOption(hostOptions, eGameHostOption_TNT, m_checkboxTNT.IsChecked()); + 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) ) + { + Minecraft *pMinecraft = Minecraft::GetInstance(); + shared_ptr player = pMinecraft->localplayers[m_iPad]; + if(player->connection) + { + player->connection->send( shared_ptr( new ServerSettingsChangedPacket( ServerSettingsChangedPacket::HOST_IN_GAME_SETTINGS, hostOptions) ) ); + } + } + + navigateBack(); + + handled = true; + } + break; + case ACTION_MENU_OK: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + sendInputToMovie(key, repeat, pressed, released); + break; + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + sendInputToMovie(key, repeat, pressed, released); + break; + } +} + +void UIScene_InGameHostOptionsMenu::handlePress(F64 controlId, F64 childId) +{ + TeleportMenuInitData *initData = new TeleportMenuInitData(); + initData->iPad = m_iPad; + initData->teleportToPlayer = false; + if( (int)controlId == eControl_TeleportToPlayer ) + { + initData->teleportToPlayer = true; + } + ui.NavigateToScene(m_iPad,eUIScene_TeleportMenu,(void*)initData); +} diff --git a/Minecraft.Client/Common/UI/UIScene_InGameHostOptionsMenu.h b/Minecraft.Client/Common/UI/UIScene_InGameHostOptionsMenu.h new file mode 100644 index 00000000..b198974f --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_InGameHostOptionsMenu.h @@ -0,0 +1,54 @@ +#pragma once + +#include "UIScene.h" + +class UIScene_InGameHostOptionsMenu : public UIScene +{ +private: + enum EControls + { + 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, 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() +public: + UIScene_InGameHostOptionsMenu(int iPad, void *initData, UILayer *parentLayer); + + 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(); + +public: + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + virtual void handlePress(F64 controlId, F64 childId); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_InGameInfoMenu.cpp b/Minecraft.Client/Common/UI/UIScene_InGameInfoMenu.cpp new file mode 100644 index 00000000..57acf345 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_InGameInfoMenu.cpp @@ -0,0 +1,538 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_InGameInfoMenu.h" +#include "..\..\MultiPlayerLocalPlayer.h" +#include "..\..\..\Minecraft.World\net.minecraft.network.packet.h" +#include "..\..\MultiPlayerLocalPlayer.h" +#include "..\..\ClientConnection.h" + +UIScene_InGameInfoMenu::UIScene_InGameInfoMenu(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + m_buttonGameOptions.init(app.GetString(IDS_HOST_OPTIONS),eControl_GameOptions); + m_labelTitle.init(app.GetString(IDS_PLAYERS_INVITE)); + m_playerList.init(eControl_GamePlayers); + + m_players = vector(); + + DWORD playerCount = g_NetworkManager.GetPlayerCount(); + + for(DWORD i = 0; i < playerCount; ++i) + { + INetworkPlayer *player = g_NetworkManager.GetPlayerByIndex( i ); + + if( player != NULL ) + { + PlayerInfo *info = BuildPlayerInfo(player); + + m_players.push_back(info); + m_playerList.addItem(info->m_name, info->m_colorState, info->m_voiceStatus); + } + } + + g_NetworkManager.RegisterPlayerChangedCallback(m_iPad, &UIScene_InGameInfoMenu::OnPlayerChanged, this); + + INetworkPlayer *thisPlayer = g_NetworkManager.GetLocalPlayerByUserIndex( m_iPad ); + m_isHostPlayer = false; + if(thisPlayer != NULL) m_isHostPlayer = thisPlayer->IsHost() == TRUE; + + Minecraft *pMinecraft = Minecraft::GetInstance(); + shared_ptr localPlayer = pMinecraft->localplayers[m_iPad]; + if(!m_isHostPlayer && !localPlayer->isModerator() ) + { + removeControl( &m_buttonGameOptions, false ); + } + + updateTooltips(); + +#if TO_BE_IMPLEMENTED + SetTimer( TOOLTIP_TIMERID , INGAME_INFO_TOOLTIP_TIMER ); +#endif + + // get rid of the quadrant display if it's on + ui.HidePressStart(); + +#if TO_BE_IMPLEMENTED + SetTimer(IGNORE_KEYPRESS_TIMERID,IGNORE_KEYPRESS_TIME); +#endif +} + +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) + { + return L"InGameInfoMenuSplit"; + } + else + { + return L"InGameInfoMenu"; + } +} + +void UIScene_InGameInfoMenu::updateTooltips() +{ + int keyX = IDS_TOOLTIPS_INVITE_FRIENDS; + int ikeyY = -1; + + XPARTY_USER_LIST partyList; + if((XPartyGetUserList( &partyList ) != XPARTY_E_NOT_IN_PARTY ) && (partyList.dwUserCount>1)) + { + keyX = IDS_TOOLTIPS_INVITE_PARTY; + } + + if(g_NetworkManager.IsLocalGame()) keyX = -1; +#ifdef __PSVITA__ + if(CGameNetworkManager::usingAdhocMode()) keyX = -1; +#endif + + INetworkPlayer *selectedPlayer = g_NetworkManager.GetPlayerBySmallId(m_players[m_playerList.getCurrentSelection()]->m_smallId); + + int keyA = -1; + Minecraft *pMinecraft = Minecraft::GetInstance(); + shared_ptr localPlayer = pMinecraft->localplayers[m_iPad]; + + bool isOp = m_isHostPlayer || localPlayer->isModerator(); + bool cheats = app.GetGameHostOption(eGameHostOption_CheatsEnabled) != 0; + bool trust = app.GetGameHostOption(eGameHostOption_TrustPlayers) != 0; + + if( isOp ) + { + if(m_buttonGameOptions.hasFocus()) + { + keyA = IDS_TOOLTIPS_SELECT; + } + else if( selectedPlayer != NULL) + { + bool editingHost = selectedPlayer->IsHost(); + if( (cheats && (m_isHostPlayer || !editingHost ) ) || (!trust && (m_isHostPlayer || !editingHost)) +#if (!defined(_CONTENT_PACKAGE) && !defined(_FINAL_BUILD) && defined(_DEBUG_MENUS_ENABLED)) + || (m_isHostPlayer && editingHost) +#endif + ) + { + keyA = IDS_TOOLTIPS_PRIVILEGES; + } + else if(selectedPlayer->IsLocal() != TRUE && selectedPlayer->IsSameSystem(g_NetworkManager.GetHostPlayer()) != TRUE) + { + // Only ops will hit this, can kick anyone not local and not local to the host + keyA = IDS_TOOLTIPS_KICK; + } + } + } + +#if defined(__PS3__) || defined(__ORBIS__) + if(m_iPad == ProfileManager.GetPrimaryPad() ) ikeyY = IDS_TOOLTIPS_GAME_INVITES; +#else + if(!m_buttonGameOptions.hasFocus()) + { + // if the player is me, then view gamer profile + if(selectedPlayer != NULL && selectedPlayer->IsLocal() && selectedPlayer->GetUserIndex()==m_iPad) + { + ikeyY = IDS_TOOLTIPS_VIEW_GAMERPROFILE; + } + else + { + ikeyY = IDS_TOOLTIPS_VIEW_GAMERCARD; + } + } +#endif + ui.SetTooltips( m_iPad, keyA,IDS_TOOLTIPS_BACK,keyX,ikeyY); +} + +void UIScene_InGameInfoMenu::handleDestroy() +{ + g_NetworkManager.UnRegisterPlayerChangedCallback(m_iPad, &UIScene_InGameInfoMenu::OnPlayerChanged, this); + + m_parentLayer->removeComponent(eUIComponent_MenuBackground); +} + +void UIScene_InGameInfoMenu::handleGainFocus(bool navBack) +{ + UIScene::handleGainFocus(navBack); + if( navBack ) g_NetworkManager.RegisterPlayerChangedCallback(m_iPad, &UIScene_InGameInfoMenu::OnPlayerChanged, this); +} + +void UIScene_InGameInfoMenu::handleReload() +{ + DWORD playerCount = g_NetworkManager.GetPlayerCount(); + + // 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 ) + { + PlayerInfo *info = BuildPlayerInfo(player); + + m_players.push_back(info); + m_playerList.addItem(info->m_name, info->m_colorState, info->m_voiceStatus); + } + } + + INetworkPlayer *thisPlayer = g_NetworkManager.GetLocalPlayerByUserIndex( m_iPad ); + m_isHostPlayer = false; + if(thisPlayer != NULL) m_isHostPlayer = thisPlayer->IsHost() == TRUE; + + Minecraft *pMinecraft = Minecraft::GetInstance(); + shared_ptr localPlayer = pMinecraft->localplayers[m_iPad]; + if(!m_isHostPlayer && !localPlayer->isModerator() ) + { + removeControl( &m_buttonGameOptions, false ); + } + + updateTooltips(); + + if(controlHasFocus(eControl_GamePlayers)) + { + m_playerList.setCurrentSelection(getControlChildFocus()); + } +} + +void UIScene_InGameInfoMenu::tick() +{ + UIScene::tick(); + + // Update players by index + for(DWORD i = 0; i < m_players.size(); ++i) + { + INetworkPlayer *player = g_NetworkManager.GetPlayerByIndex( i ); + + if(player != NULL) + { + PlayerInfo *info = BuildPlayerInfo(player); + + m_players[i]->m_smallId = info->m_smallId; + + if(info->m_voiceStatus != m_players[i]->m_voiceStatus) + { + 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(info->m_name.compare( m_players[i]->m_name ) != 0 ) + { + m_playerList.setButtonLabel(i, info->m_name); + m_players[i]->m_name = info->m_name; + } + + delete info; + } + } +} + +void UIScene_InGameInfoMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + //app.DebugPrintf("UIScene_DebugOverlay handling input for pad %d, key %d, down- %s, pressed- %s, released- %s\n", iPad, key, down?"TRUE":"FALSE", pressed?"TRUE":"FALSE", released?"TRUE":"FALSE"); + ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); + + switch(key) + { + case ACTION_MENU_CANCEL: + if(pressed && !repeat) + { + ui.PlayUISFX(eSFX_Back); + navigateBack(); + } + break; + case ACTION_MENU_Y: +#if defined(__PS3__) || defined(__ORBIS__) + if(pressed && iPad == ProfileManager.GetPrimaryPad()) + { +#ifdef __PS3__ + // are we offline? + if(!ProfileManager.IsSignedInLive(iPad)) + { + // get them to sign in to online + UINT uiIDA[2]; + uiIDA[0]=IDS_PRO_NOTONLINE_ACCEPT; + uiIDA[1]=IDS_PRO_NOTONLINE_DECLINE; + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&UIScene_InGameInfoMenu::MustSignInReturnedPSN,this); + } + else +#endif + { +#ifdef __ORBIS__ + SQRNetworkManager_Orbis::RecvInviteGUI(); +#else // __PS3__ + int ret = sceNpBasicRecvMessageCustom(SCE_NP_BASIC_MESSAGE_MAIN_TYPE_INVITE, SCE_NP_BASIC_RECV_MESSAGE_OPTIONS_INCLUDE_BOOTABLE, SYS_MEMORY_CONTAINER_ID_INVALID); + app.DebugPrintf("sceNpBasicRecvMessageCustom return %d ( %08x )\n", ret, ret); +#endif + } + } +#else + + + if(pressed && m_playerList.hasFocus() && (m_playerList.getItemCount() > 0) && (m_playerList.getCurrentSelection() < m_players.size()) ) + { + INetworkPlayer *player = g_NetworkManager.GetPlayerBySmallId(m_players[m_playerList.getCurrentSelection()]->m_smallId); + if( player != NULL ) + { + PlayerUID uid = player->GetUID(); + if( uid != INVALID_XUID ) + { +#ifdef __PSVITA__ + PSVITA_STUBBED; +#else + ProfileManager.ShowProfileCard(iPad,uid); +#endif + } + } + } + +#endif + break; + case ACTION_MENU_X: + + if(pressed && !repeat && !g_NetworkManager.IsLocalGame() ) + { +#ifdef __PSVITA__ + if(CGameNetworkManager::usingAdhocMode() == false) + g_NetworkManager.SendInviteGUI(iPad); +#else + g_NetworkManager.SendInviteGUI(iPad); +#endif + } + + break; + case ACTION_MENU_OK: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + case ACTION_MENU_PAGEUP: + case ACTION_MENU_PAGEDOWN: + sendInputToMovie(key, repeat, pressed, released); + break; + } +} + +void UIScene_InGameInfoMenu::handlePress(F64 controlId, F64 childId) +{ + app.DebugPrintf("Pressed = %d, %d\n", (int)controlId, (int)childId); + switch((int)controlId) + { + case eControl_GameOptions: + ui.NavigateToScene(m_iPad,eUIScene_InGameHostOptionsMenu); + break; + case eControl_GamePlayers: + int currentSelection = (int)childId; + INetworkPlayer *selectedPlayer = g_NetworkManager.GetPlayerBySmallId(m_players[currentSelection]->m_smallId); + + Minecraft *pMinecraft = Minecraft::GetInstance(); + shared_ptr localPlayer = pMinecraft->localplayers[m_iPad]; + + bool isOp = m_isHostPlayer || localPlayer->isModerator(); + bool cheats = app.GetGameHostOption(eGameHostOption_CheatsEnabled) != 0; + bool trust = app.GetGameHostOption(eGameHostOption_TrustPlayers) != 0; + + if( isOp && selectedPlayer != NULL) + { + bool editingHost = selectedPlayer->IsHost(); + if( (cheats && (m_isHostPlayer || !editingHost ) ) || (!trust && (m_isHostPlayer || !editingHost)) +#if (!defined(_CONTENT_PACKAGE) && !defined(_FINAL_BUILD) && defined(_DEBUG_MENUS_ENABLED)) + || (m_isHostPlayer && editingHost) +#endif + ) + { + InGamePlayerOptionsInitData *pInitData = new InGamePlayerOptionsInitData(); + pInitData->iPad = m_iPad; + pInitData->networkSmallId = m_players[currentSelection]->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]->m_smallId; + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_OK; + uiIDA[1]=IDS_CONFIRM_CANCEL; + + ui.RequestAlertMessage(IDS_UNLOCK_KICK_PLAYER_TITLE, IDS_UNLOCK_KICK_PLAYER, uiIDA, 2, m_iPad,&UIScene_InGameInfoMenu::KickPlayerReturned,smallId); + } + } + break; + } +} + +void UIScene_InGameInfoMenu::handleFocusChange(F64 controlId, F64 childId) +{ + switch((int)controlId) + { + case eControl_GamePlayers: + m_playerList.updateChildFocus( (int) childId ); + }; + updateTooltips(); +} + +void UIScene_InGameInfoMenu::OnPlayerChanged(void *callbackParam, INetworkPlayer *pPlayer, bool leaving) +{ + 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_players.size(); ++i) + { + 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 found + playerFound = true; + foundIndex = i; + } + } + + 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) + { + 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 the player is joining + if(!leaving) + { + app.DebugPrintf(" Player \"%ls\" not found, adding\n", pPlayer->GetOnlineName()); + + PlayerInfo *info = scene->BuildPlayerInfo(pPlayer); + scene->m_players.push_back(info); + + // Note that the tick updates buttons every tick so it's only really important that we + // add the button (not the order or content) + scene->m_playerList.addItem(info->m_name, info->m_colorState, info->m_voiceStatus); + } +} + +int UIScene_InGameInfoMenu::KickPlayerReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + BYTE smallId = *(BYTE *)pParam; + delete pParam; + + if(result==C4JStorage::EMessage_ResultAccept) + { + Minecraft *pMinecraft = Minecraft::GetInstance(); + shared_ptr localPlayer = pMinecraft->localplayers[iPad]; + if(localPlayer->connection) + { + localPlayer->connection->send( shared_ptr( new KickPlayerPacket(smallId) ) ); + } + } + + return 0; +} + +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) +{ + UIScene_InGameInfoMenu* pClass = (UIScene_InGameInfoMenu*)pParam; + + if(result==C4JStorage::EMessage_ResultAccept) + { +#ifdef __PS3__ + SQRNetworkManager_PS3::AttemptPSNSignIn(&UIScene_InGameInfoMenu::ViewInvites_SignInReturned, pClass); +#else // __PSVITA__ + SQRNetworkManager_Vita::AttemptPSNSignIn(&UIScene_InGameInfoMenu::ViewInvites_SignInReturned, pClass); +#endif + } + + return 0; +} + +int UIScene_InGameInfoMenu::ViewInvites_SignInReturned(void *pParam,bool bContinue, int iPad) +{ + if(bContinue==true) + { + // Check if we're signed in to LIVE + if(ProfileManager.IsSignedInLive(iPad)) + { +#ifdef __ORBIS__ + SQRNetworkManager_Orbis::RecvInviteGUI(); +#elif defined(__PS3__) + int ret = sceNpBasicRecvMessageCustom(SCE_NP_BASIC_MESSAGE_MAIN_TYPE_INVITE, SCE_NP_BASIC_RECV_MESSAGE_OPTIONS_INCLUDE_BOOTABLE, SYS_MEMORY_CONTAINER_ID_INVALID); + app.DebugPrintf("sceNpBasicRecvMessageCustom return %d ( %08x )\n", ret, ret); +#else // __PSVITA__ + SQRNetworkManager_Vita::RecvInviteGUI(); +#endif + } + } + return 0; +} +#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 new file mode 100644 index 00000000..464c83a0 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_InGameInfoMenu.h @@ -0,0 +1,74 @@ +#pragma once + +#include "UIScene.h" + +class UIScene_InGameInfoMenu : public UIScene +{ +private: + enum EControls + { + 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; + 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; + UIControl_Label m_labelTitle; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_buttonGameOptions, "GameOptions") + UI_MAP_ELEMENT( m_playerList, "GamePlayers") + UI_MAP_ELEMENT( m_labelTitle, "Title") + UI_END_MAP_ELEMENTS_AND_NAMES() +public: + UIScene_InGameInfoMenu(int iPad, void *initData, UILayer *parentLayer); + virtual ~UIScene_InGameInfoMenu(); + + virtual EUIScene getSceneType() { return eUIScene_InGameInfoMenu;} + virtual void updateTooltips(); + + virtual void handleReload(); + + virtual void tick(); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + +protected: + virtual void handleGainFocus(bool navBack); + void handlePress(F64 controlId, F64 childId); + virtual void handleDestroy(); + virtual void handleFocusChange(F64 controlId, F64 childId); + +public: + static int KickPlayerReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static void OnPlayerChanged(void *callbackParam, INetworkPlayer *pPlayer, bool leaving); + +private: + 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); +#endif +}; diff --git a/Minecraft.Client/Common/UI/UIScene_InGamePlayerOptionsMenu.cpp b/Minecraft.Client/Common/UI/UIScene_InGamePlayerOptionsMenu.cpp new file mode 100644 index 00000000..d7196849 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_InGamePlayerOptionsMenu.cpp @@ -0,0 +1,524 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_InGamePlayerOptionsMenu.h" +#include "..\..\Minecraft.h" +#include "..\..\MultiPlayerLocalPlayer.h" +#include "..\..\ClientConnection.h" +#include "..\..\..\Minecraft.World\net.minecraft.network.packet.h" + + +#define CHECKBOXES_TIMER_ID 0 +#define CHECKBOXES_TIMER_TIME 100 + +UIScene_InGamePlayerOptionsMenu::UIScene_InGamePlayerOptionsMenu(int iPad, void *_initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + m_bShouldNavBack = false; + + InGamePlayerOptionsInitData *initData = (InGamePlayerOptionsInitData *)_initData; + m_networkSmallId = initData->networkSmallId; + m_playerPrivileges = initData->playerPrivileges; + + INetworkPlayer *localPlayer = g_NetworkManager.GetLocalPlayerByUserIndex( m_iPad ); + INetworkPlayer *editingPlayer = g_NetworkManager.GetPlayerBySmallId(m_networkSmallId); + + if(editingPlayer != NULL) + { + m_labelGamertag.init(editingPlayer->GetDisplayName()); + } + + bool trustPlayers = app.GetGameHostOption(eGameHostOption_TrustPlayers) != 0; + bool cheats = app.GetGameHostOption(eGameHostOption_CheatsEnabled) != 0; + m_editingSelf = (localPlayer != NULL && localPlayer == editingPlayer); + + if( m_editingSelf || trustPlayers || editingPlayer->IsHost()) + { + removeControl( &m_checkboxes[eControl_BuildAndMine], true ); + removeControl( &m_checkboxes[eControl_UseDoorsAndSwitches], true ); + removeControl( &m_checkboxes[eControl_UseContainers], true ); + removeControl( &m_checkboxes[eControl_AttackPlayers], true ); + removeControl( &m_checkboxes[eControl_AttackAnimals], true ); + } + else + { + bool checked = (Player::getPlayerGamePrivilege(m_playerPrivileges, Player::ePlayerGamePrivilege_CannotMine)==0 && Player::getPlayerGamePrivilege(m_playerPrivileges, Player::ePlayerGamePrivilege_CannotBuild)==0); + m_checkboxes[eControl_BuildAndMine].init( app.GetString(IDS_CAN_BUILD_AND_MINE), eControl_BuildAndMine, checked); + + checked = (Player::getPlayerGamePrivilege(m_playerPrivileges, Player::ePlayerGamePrivilege_CanUseDoorsAndSwitches)!=0); + m_checkboxes[eControl_UseDoorsAndSwitches].init( app.GetString(IDS_CAN_USE_DOORS_AND_SWITCHES), eControl_UseDoorsAndSwitches, checked); + + checked = (Player::getPlayerGamePrivilege(m_playerPrivileges, Player::ePlayerGamePrivilege_CanUseContainers)!=0); + m_checkboxes[eControl_UseContainers].init( app.GetString(IDS_CAN_OPEN_CONTAINERS), eControl_UseContainers, checked); + + checked = Player::getPlayerGamePrivilege(m_playerPrivileges, Player::ePlayerGamePrivilege_CannotAttackPlayers)==0; + m_checkboxes[eControl_AttackPlayers].init( app.GetString(IDS_CAN_ATTACK_PLAYERS), eControl_AttackPlayers, checked); + + checked = Player::getPlayerGamePrivilege(m_playerPrivileges, Player::ePlayerGamePrivilege_CannotAttackAnimals)==0; + m_checkboxes[eControl_AttackAnimals].init( app.GetString(IDS_CAN_ATTACK_ANIMALS), eControl_AttackAnimals, checked); + } + + if(m_editingSelf) + { +#if (defined(_CONTENT_PACKAGE) || defined(_FINAL_BUILD) && !defined(_DEBUG_MENUS_ENABLED)) + removeControl( &m_checkboxes[eControl_Op], true ); +#else + m_checkboxes[eControl_Op].init(L"DEBUG: Creative",eControl_Op,Player::getPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_CreativeMode)); +#endif + + removeControl( &m_buttonKick, true ); + removeControl( &m_checkboxes[eControl_CheatTeleport], true ); + + if(cheats) + { + bool canBeInvisible = Player::getPlayerGamePrivilege(m_playerPrivileges, Player::ePlayerGamePrivilege_CanToggleInvisible) != 0; + m_checkboxes[eControl_HostInvisible].SetEnable(canBeInvisible); + bool checked = canBeInvisible && (Player::getPlayerGamePrivilege(m_playerPrivileges, Player::ePlayerGamePrivilege_Invisible)!=0 && Player::getPlayerGamePrivilege(m_playerPrivileges, Player::ePlayerGamePrivilege_Invulnerable)!=0); + m_checkboxes[eControl_HostInvisible].init( app.GetString(IDS_INVISIBLE), eControl_HostInvisible, checked); + + bool inCreativeMode = Player::getPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_CreativeMode) != 0; + if(inCreativeMode) + { + removeControl( &m_checkboxes[eControl_HostFly], true ); + removeControl( &m_checkboxes[eControl_HostHunger], true ); + } + else + { + bool canFly = Player::getPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_CanToggleFly); + bool canChangeHunger = Player::getPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_CanToggleClassicHunger); + + m_checkboxes[eControl_HostFly].SetEnable(canFly); + checked = canFly && Player::getPlayerGamePrivilege(m_playerPrivileges, Player::ePlayerGamePrivilege_CanFly)!=0; + m_checkboxes[eControl_HostFly].init( app.GetString(IDS_CAN_FLY), eControl_HostFly, checked); + + m_checkboxes[eControl_HostHunger].SetEnable(canChangeHunger); + checked = canChangeHunger && Player::getPlayerGamePrivilege(m_playerPrivileges, Player::ePlayerGamePrivilege_ClassicHunger)!=0; + m_checkboxes[eControl_HostHunger].init( app.GetString(IDS_DISABLE_EXHAUSTION), eControl_HostHunger, checked); + } + } + else + { + removeControl( &m_checkboxes[eControl_HostInvisible], true ); + removeControl( &m_checkboxes[eControl_HostFly], true ); + removeControl( &m_checkboxes[eControl_HostHunger], true ); + } + } + else + { + if(localPlayer->IsHost()) + { + // Only host can make people moderators, or enable teleporting for them + m_checkboxes[eControl_Op].init( app.GetString(IDS_MODERATOR), eControl_Op, Player::getPlayerGamePrivilege(m_playerPrivileges, Player::ePlayerGamePrivilege_Op)!=0); + } + else + { + removeControl( &m_checkboxes[eControl_Op], true ); + } + + /*if(localPlayer->IsHost() && cheats ) + { + m_checkboxes[eControl_HostInvisible].SetEnable(true); + bool checked = Player::getPlayerGamePrivilege(m_playerPrivileges, Player::ePlayerGamePrivilege_CanToggleInvisible)!=0; + m_checkboxes[eControl_HostInvisible].init( app.GetString(IDS_CAN_INVISIBLE), eControl_HostInvisible, checked); + + m_checkboxes[eControl_HostFly].SetEnable(true); + checked = Player::getPlayerGamePrivilege(m_playerPrivileges, Player::ePlayerGamePrivilege_CanToggleFly)!=0; + m_checkboxes[eControl_HostFly].init( app.GetString(IDS_CAN_FLY), eControl_HostFly, checked); + + m_checkboxes[eControl_HostHunger].SetEnable(true); + checked = Player::getPlayerGamePrivilege(m_playerPrivileges, Player::ePlayerGamePrivilege_CanToggleClassicHunger)!=0; + m_checkboxes[eControl_HostHunger].init( app.GetString(IDS_CAN_DISABLE_EXHAUSTION), eControl_HostHunger, checked); + + checked = Player::getPlayerGamePrivilege(m_playerPrivileges, Player::ePlayerGamePrivilege_CanTeleport)!=0; + m_checkboxes[eControl_CheatTeleport].init(app.GetString(IDS_ENABLE_TELEPORT),eControl_CheatTeleport,checked); + } + else + { + removeControl( &m_checkboxes[eControl_HostInvisible], true ); + removeControl( &m_checkboxes[eControl_HostFly], true ); + removeControl( &m_checkboxes[eControl_HostHunger], true ); + removeControl( &m_checkboxes[eControl_CheatTeleport], true ); + }*/ + + if(localPlayer->IsHost() && cheats ) + { + m_checkboxes[eControl_HostInvisible].SetEnable(true); + bool checked = Player::getPlayerGamePrivilege(m_playerPrivileges, Player::ePlayerGamePrivilege_CanToggleInvisible)!=0; + m_checkboxes[eControl_HostInvisible].init( app.GetString(IDS_CAN_INVISIBLE), eControl_HostInvisible, checked); + + + bool inCreativeMode = Player::getPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_CreativeMode) != 0; + if(inCreativeMode) + { + removeControl( &m_checkboxes[eControl_HostFly], true ); + removeControl( &m_checkboxes[eControl_HostHunger], true ); + } + else + { + m_checkboxes[eControl_HostFly].SetEnable(true); + checked = Player::getPlayerGamePrivilege(m_playerPrivileges, Player::ePlayerGamePrivilege_CanToggleFly)!=0; + m_checkboxes[eControl_HostFly].init( app.GetString(IDS_CAN_FLY), eControl_HostFly, checked); + + m_checkboxes[eControl_HostHunger].SetEnable(true); + checked = Player::getPlayerGamePrivilege(m_playerPrivileges, Player::ePlayerGamePrivilege_CanToggleClassicHunger)!=0; + m_checkboxes[eControl_HostHunger].init( app.GetString(IDS_CAN_DISABLE_EXHAUSTION), eControl_HostHunger, checked); + } + + checked = Player::getPlayerGamePrivilege(m_playerPrivileges, Player::ePlayerGamePrivilege_CanTeleport)!=0; + m_checkboxes[eControl_CheatTeleport].init(app.GetString(IDS_ENABLE_TELEPORT),eControl_CheatTeleport,checked); + } + else + { + removeControl( &m_checkboxes[eControl_HostInvisible], true ); + removeControl( &m_checkboxes[eControl_HostFly], true ); + removeControl( &m_checkboxes[eControl_HostHunger], true ); + removeControl( &m_checkboxes[eControl_CheatTeleport], true ); + } + + + // Can only kick people if they are not local, and not local to the host + if(editingPlayer->IsLocal() != TRUE && editingPlayer->IsSameSystem(g_NetworkManager.GetHostPlayer()) != TRUE) + { + m_buttonKick.init( app.GetString(IDS_KICK_PLAYER), eControl_Kick); + } + else + { + removeControl( &m_buttonKick, true ); + } + } + + short colourIndex = app.GetPlayerColour( m_networkSmallId ); + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = colourIndex; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetPlayerIcon , 1 , value ); + +#if TO_BE_IMPLEMENTED + if(app.GetLocalPlayerCount()>1) + { + app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad); + } +#endif + + m_bModeratorState = m_checkboxes[eControl_Op].IsChecked(); + + resetCheatCheckboxes(); + + addTimer(CHECKBOXES_TIMER_ID,CHECKBOXES_TIMER_TIME); + + g_NetworkManager.RegisterPlayerChangedCallback(m_iPad, &UIScene_InGamePlayerOptionsMenu::OnPlayerChanged, this); + +#ifdef __PSVITA__ + ui.TouchBoxRebuild(this); +#endif +} + +wstring UIScene_InGamePlayerOptionsMenu::getMoviePath() +{ + if(app.GetLocalPlayerCount() > 1) + { + return L"InGamePlayerOptionsSplit"; + } + else + { + return L"InGamePlayerOptions"; + } +} + +void UIScene_InGamePlayerOptionsMenu::updateTooltips() +{ + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); +} + +void UIScene_InGamePlayerOptionsMenu::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(); + + if(m_bShouldNavBack) + { + m_bShouldNavBack = false; + ui.NavigateBack(m_iPad); + } +} + +void UIScene_InGamePlayerOptionsMenu::handleDestroy() +{ + g_NetworkManager.UnRegisterPlayerChangedCallback(m_iPad, &UIScene_InGamePlayerOptionsMenu::OnPlayerChanged, this); +} + +void UIScene_InGamePlayerOptionsMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + //app.DebugPrintf("UIScene_DebugOverlay handling input for pad %d, key %d, down- %s, pressed- %s, released- %s\n", iPad, key, down?"TRUE":"FALSE", pressed?"TRUE":"FALSE", released?"TRUE":"FALSE"); + + ui.AnimateKeyPress(iPad, key, repeat, pressed, released); + switch(key) + { + case ACTION_MENU_CANCEL: + if(pressed) + { + bool trustPlayers = app.GetGameHostOption(eGameHostOption_TrustPlayers) != 0; + bool cheats = app.GetGameHostOption(eGameHostOption_CheatsEnabled) != 0; + if(m_editingSelf) + { +#if (defined(_CONTENT_PACKAGE) || defined(_FINAL_BUILD) && !defined(_DEBUG_MENUS_ENABLED)) +#else + Player::setPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_CreativeMode,m_checkboxes[eControl_Op].IsChecked()); +#endif + if(cheats) + { + bool canBeInvisible = Player::getPlayerGamePrivilege(m_playerPrivileges, Player::ePlayerGamePrivilege_CanToggleInvisible) != 0; + if(canBeInvisible) Player::setPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_Invisible,m_checkboxes[eControl_HostInvisible].IsChecked()); + if(canBeInvisible) Player::setPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_Invulnerable,m_checkboxes[eControl_HostInvisible].IsChecked()); + + bool inCreativeMode = Player::getPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_CreativeMode) != 0; + if(!inCreativeMode) + { + bool canFly = Player::getPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_CanToggleFly); + bool canChangeHunger = Player::getPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_CanToggleClassicHunger); + + if(canFly) Player::setPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_CanFly,m_checkboxes[eControl_HostFly].IsChecked()); + if(canChangeHunger) Player::setPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_ClassicHunger,m_checkboxes[eControl_HostHunger].IsChecked()); + } + } + } + else + { + INetworkPlayer *editingPlayer = g_NetworkManager.GetPlayerBySmallId(m_networkSmallId); + if(!trustPlayers && (editingPlayer != NULL && !editingPlayer->IsHost() ) ) + { + Player::setPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_CannotMine,!m_checkboxes[eControl_BuildAndMine].IsChecked()); + Player::setPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_CannotBuild,!m_checkboxes[eControl_BuildAndMine].IsChecked()); + Player::setPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_CannotAttackPlayers,!m_checkboxes[eControl_AttackPlayers].IsChecked()); + Player::setPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_CannotAttackAnimals, !m_checkboxes[eControl_AttackAnimals].IsChecked()); + Player::setPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_CanUseDoorsAndSwitches, m_checkboxes[eControl_UseDoorsAndSwitches].IsChecked()); + Player::setPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_CanUseContainers, m_checkboxes[eControl_UseContainers].IsChecked()); + } + + INetworkPlayer *localPlayer = g_NetworkManager.GetLocalPlayerByUserIndex( m_iPad ); + + if(localPlayer->IsHost()) + { + if(cheats) + { + Player::setPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_CanToggleInvisible,m_checkboxes[eControl_HostInvisible].IsChecked()); + Player::setPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_CanToggleFly,m_checkboxes[eControl_HostFly].IsChecked()); + Player::setPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_CanToggleClassicHunger,m_checkboxes[eControl_HostHunger].IsChecked()); + Player::setPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_CanTeleport,m_checkboxes[eControl_CheatTeleport].IsChecked()); + } + + Player::setPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_Op,m_checkboxes[eControl_Op].IsChecked()); + } + } + unsigned int originalPrivileges = app.GetPlayerPrivileges(m_networkSmallId); + if(originalPrivileges != m_playerPrivileges) + { + // Send update settings packet to server + Minecraft *pMinecraft = Minecraft::GetInstance(); + shared_ptr player = pMinecraft->localplayers[m_iPad]; + if(player->connection) + { + player->connection->send( shared_ptr( new PlayerInfoPacket( m_networkSmallId, -1, m_playerPrivileges) ) ); + } + } + navigateBack(); + + handled = true; + } + break; + case ACTION_MENU_OK: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + sendInputToMovie(key, repeat, pressed, released); + break; + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + sendInputToMovie(key, repeat, pressed, released); + break; + } +} + +void UIScene_InGamePlayerOptionsMenu::handlePress(F64 controlId, F64 childId) +{ + switch((int)controlId) + { + case eControl_Kick: + { + BYTE *smallId = new BYTE(); + *smallId = m_networkSmallId; + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_OK; + uiIDA[1]=IDS_CONFIRM_CANCEL; + + ui.RequestAlertMessage(IDS_UNLOCK_KICK_PLAYER_TITLE, IDS_UNLOCK_KICK_PLAYER, uiIDA, 2, m_iPad,&UIScene_InGamePlayerOptionsMenu::KickPlayerReturned,smallId); + } + break; + }; +} + +int UIScene_InGamePlayerOptionsMenu::KickPlayerReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + BYTE smallId = *(BYTE *)pParam; + delete pParam; + + if(result==C4JStorage::EMessage_ResultAccept) + { + Minecraft *pMinecraft = Minecraft::GetInstance(); + shared_ptr localPlayer = pMinecraft->localplayers[iPad]; + if(localPlayer->connection) + { + localPlayer->connection->send( shared_ptr( new KickPlayerPacket(smallId) ) ); + } + + // Fix for #61494 - [CRASH]: TU7: Code: Multiplayer: Title may crash while kicking a player from an online game. + // We cannot do a navigate back here is this actually occurs on a thread other than the main thread. On rare occasions this can clash + // with the XUI render and causes a crash. The OnPlayerChanged event should perform the navigate back on the main thread + //app.NavigateBack(iPad); + } + + return 0; +} + +void UIScene_InGamePlayerOptionsMenu::OnPlayerChanged(void *callbackParam, INetworkPlayer *pPlayer, bool leaving) +{ + app.DebugPrintf("UIScene_InGamePlayerOptionsMenu::OnPlayerChanged"); + UIScene_InGamePlayerOptionsMenu *scene = (UIScene_InGamePlayerOptionsMenu *)callbackParam; + + UIScene_InGameInfoMenu *infoScene = (UIScene_InGameInfoMenu *)scene->getBackScene(); + if(infoScene != NULL) UIScene_InGameInfoMenu::OnPlayerChanged(infoScene,pPlayer,leaving); + + if(leaving && pPlayer != NULL && pPlayer->GetSmallId() == scene->m_networkSmallId) + { + scene->m_bShouldNavBack = true; + } +} + +void UIScene_InGamePlayerOptionsMenu::resetCheatCheckboxes() +{ + bool isModerator = m_checkboxes[eControl_Op].IsChecked(); + //bool cheatsEnabled = app.GetGameHostOption(eGameHostOption_CheatsEnabled) != 0; + + if (!m_editingSelf) + { + m_checkboxes[eControl_HostInvisible].SetEnable(isModerator); + m_checkboxes[eControl_HostFly].SetEnable(isModerator); + m_checkboxes[eControl_HostHunger].SetEnable(isModerator); + m_checkboxes[eControl_CheatTeleport].SetEnable(isModerator); + } +} + +void UIScene_InGamePlayerOptionsMenu::handleCheckboxToggled(F64 controlId, bool selected) +{ + switch((int)controlId) + { + case eControl_Op: + // flag that the moderator state has changed + //resetCheatCheckboxes(); + break; + } +} + +void UIScene_InGamePlayerOptionsMenu::handleTimerComplete(int id) +{ + switch(id) + { + case CHECKBOXES_TIMER_ID: + { + bool bIsModerator = m_checkboxes[eControl_Op].IsChecked(); + if(m_bModeratorState!=bIsModerator) + { + m_bModeratorState=bIsModerator; + resetCheatCheckboxes(); + } + } + break; + } +} diff --git a/Minecraft.Client/Common/UI/UIScene_InGamePlayerOptionsMenu.h b/Minecraft.Client/Common/UI/UIScene_InGamePlayerOptionsMenu.h new file mode 100644 index 00000000..e78b6748 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_InGamePlayerOptionsMenu.h @@ -0,0 +1,92 @@ +#pragma once + +#include "UIScene.h" + +class UIScene_InGamePlayerOptionsMenu : public UIScene +{ +private: + enum EControls + { + // Checkboxes + eControl_BuildAndMine, + eControl_UseDoorsAndSwitches, + eControl_UseContainers, + eControl_AttackPlayers, + eControl_AttackAnimals, + eControl_Op, + eControl_CheatTeleport, + eControl_HostFly, + eControl_HostHunger, + eControl_HostInvisible, + + eControl_CHECKBOXES_COUNT, + + // Others + eControl_Kick = eControl_CHECKBOXES_COUNT, + }; + + bool m_bShouldNavBack; + bool m_editingSelf; + BYTE m_networkSmallId; + unsigned int m_playerPrivileges; + + UIControl_Label m_labelGamertag; + UIControl_CheckBox m_checkboxes[eControl_CHECKBOXES_COUNT]; + UIControl_Button m_buttonKick; + IggyName m_funcSetPlayerIcon; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_checkboxes[eControl_BuildAndMine], "CheckboxBuildAndMine") + UI_MAP_ELEMENT( m_checkboxes[eControl_UseDoorsAndSwitches], "CheckboxUseDoorsAndSwitches") + UI_MAP_ELEMENT( m_checkboxes[eControl_UseContainers], "CheckboxUseContainers") + UI_MAP_ELEMENT( m_checkboxes[eControl_AttackPlayers], "CheckboxAttackPlayers") + UI_MAP_ELEMENT( m_checkboxes[eControl_AttackAnimals], "CheckboxAttackAnimals") + UI_MAP_ELEMENT( m_checkboxes[eControl_Op], "CheckboxOp") + UI_MAP_ELEMENT( m_checkboxes[eControl_CheatTeleport], "CheckboxTeleport") + UI_MAP_ELEMENT( m_checkboxes[eControl_HostFly], "CheckboxHostFly") + UI_MAP_ELEMENT( m_checkboxes[eControl_HostHunger], "CheckboxHostHunger") + UI_MAP_ELEMENT( m_checkboxes[eControl_HostInvisible], "CheckboxHostInvisible") + + UI_MAP_ELEMENT( m_buttonKick, "ButtonKick") + + UI_MAP_ELEMENT( m_labelGamertag, "Gamertag") + + UI_MAP_NAME( m_funcSetPlayerIcon, L"SetPlayerIcon" ); + UI_END_MAP_ELEMENTS_AND_NAMES() + + bool m_bModeratorState; + + +public: + UIScene_InGamePlayerOptionsMenu(int iPad, void *initData, UILayer *parentLayer); + + virtual EUIScene getSceneType() { return eUIScene_InGamePlayerOptionsMenu;} + virtual void updateTooltips(); + + virtual void handleReload(); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + virtual void handleCheckboxToggled(F64 controlId, bool selected); + virtual void handleTimerComplete(int id); + +public: + virtual void tick(); + + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + + virtual void handleDestroy(); + virtual void handlePress(F64 controlId, F64 childId); + + + static int KickPlayerReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static void OnPlayerChanged(void *callbackParam, INetworkPlayer *pPlayer, bool leaving); + +private: + /** 4J-JEV: + For enabling/disabling 'Can Fly', 'Can Teleport', 'Can Disable Hunger' etc + used after changing the moderator checkbox. + */ + void resetCheatCheckboxes(); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_InGameSaveManagementMenu.cpp b/Minecraft.Client/Common/UI/UIScene_InGameSaveManagementMenu.cpp new file mode 100644 index 00000000..fa2c7e61 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_InGameSaveManagementMenu.cpp @@ -0,0 +1,497 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_InGameSaveManagementMenu.h" + +#if defined(__ORBIS__) || defined(__PSVITA__) +#include +#endif + +int UIScene_InGameSaveManagementMenu::LoadSaveDataThumbnailReturned(LPVOID lpParam,PBYTE pbThumbnail,DWORD dwThumbnailBytes) +{ + UIScene_InGameSaveManagementMenu *pClass= (UIScene_InGameSaveManagementMenu *)lpParam; + + app.DebugPrintf("Received data for save thumbnail\n"); + + if(pbThumbnail && dwThumbnailBytes) + { + pClass->m_saveDetails[pClass->m_iRequestingThumbnailId].pbThumbnailData = new BYTE[dwThumbnailBytes]; + memcpy(pClass->m_saveDetails[pClass->m_iRequestingThumbnailId].pbThumbnailData, pbThumbnail, dwThumbnailBytes); + pClass->m_saveDetails[pClass->m_iRequestingThumbnailId].dwThumbnailSize = dwThumbnailBytes; + } + else + { + pClass->m_saveDetails[pClass->m_iRequestingThumbnailId].pbThumbnailData = NULL; + pClass->m_saveDetails[pClass->m_iRequestingThumbnailId].dwThumbnailSize = 0; + app.DebugPrintf("Save thumbnail data is NULL, or has size 0\n"); + } + pClass->m_bSaveThumbnailReady = true; + + return 0; +} + +UIScene_InGameSaveManagementMenu::UIScene_InGameSaveManagementMenu(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + m_iRequestingThumbnailId = 0; + m_iSaveInfoC=0; + m_bIgnoreInput = false; + m_iState=e_SavesIdle; + //m_bRetrievingSaveInfo=false; + + m_buttonListSaves.init(eControl_SavesList); + + m_labelSavesListTitle.init( app.GetString(IDS_SAVE_INCOMPLETE_DELETE_SAVES) ); + m_controlSavesTimer.setVisible( true ); + + +#if defined(_XBOX_ONE) || defined(__ORBIS__) + m_spaceIndicatorSaves.init(L"",eControl_SpaceIndicator,0, (4LL *1024LL * 1024LL * 1024LL) ); +#endif + m_bUpdateSaveSize = false; + + m_bAllLoaded = false; + m_bRetrievingSaveThumbnails = false; + m_bSaveThumbnailReady = false; + m_bExitScene=false; + m_pSaveDetails=NULL; + m_bSavesDisplayed=false; + m_saveDetails = NULL; + m_iSaveDetailsCount = 0; + +#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) || defined(_DURANGO) + // Always clear the saves when we enter this menu + StorageManager.ClearSavesInfo(); +#endif + + // block input if we're waiting for DLC to install, and wipe the saves list. The end of dlc mounting custom message will fill the list again + if(app.StartInstallDLCProcess(m_iPad)==true || app.DLCInstallPending()) + { + // if we're waiting for DLC to mount, don't fill the save list. The custom message on end of dlc mounting will do that + m_bIgnoreInput = true; + } + else + { + Initialise(); + } + +#ifdef __PSVITA__ + if(CGameNetworkManager::usingAdhocMode() && SQRNetworkManager_AdHoc_Vita::GetAdhocStatus()) + { + g_NetworkManager.startAdhocMatching(); // create the client matching context and clear out the friends list + } + +#endif + + // If we're not ignoring input, then we aren't still waiting for the DLC to mount, and can now check for corrupt dlc. Otherwise this will happen when the dlc has finished mounting. + if( !m_bIgnoreInput) + { + app.m_dlcManager.checkForCorruptDLCAndAlert(); + } + + parentLayer->addComponent(iPad,eUIComponent_MenuBackground); +} + + +UIScene_InGameSaveManagementMenu::~UIScene_InGameSaveManagementMenu() +{ + m_parentLayer->removeComponent(eUIComponent_MenuBackground); + + if(m_saveDetails) + { + for(int i = 0; i < m_iSaveDetailsCount; ++i) + { + delete m_saveDetails[i].pbThumbnailData; + } + delete [] m_saveDetails; + } + app.LeaveSaveNotificationSection(); + StorageManager.SetSaveDisabled(false); + StorageManager.ContinueIncompleteOperation(); +} + +void UIScene_InGameSaveManagementMenu::updateTooltips() +{ + int iA = -1; + if( m_bSavesDisplayed && m_iSaveDetailsCount > 0) + { + iA = IDS_TOOLTIPS_DELETESAVE; + } + ui.SetTooltips( m_parentLayer->IsFullscreenGroup()?XUSER_INDEX_ANY:m_iPad, iA, IDS_SAVE_INCOMPLETE_RETRY_SAVING); +} + +// +void UIScene_InGameSaveManagementMenu::Initialise() +{ + m_iSaveListIndex = 0; + + // Check if we're in the trial version + if(ProfileManager.IsFullVersion()==false) + { + } + else if(StorageManager.GetSaveDisabled()) + { + GetSaveInfo(); + } + else + { + // 4J-PB - we need to check that there is enough space left to create a copy of the save (for a rename) + bool bCanRename = StorageManager.EnoughSpaceForAMinSaveGame(); + + GetSaveInfo(); + } + + m_bIgnoreInput=false; +} + +void UIScene_InGameSaveManagementMenu::handleReload() +{ + m_bIgnoreInput = false; + m_iRequestingThumbnailId = 0; + m_bAllLoaded=false; + m_bRetrievingSaveThumbnails=false; + m_bSavesDisplayed=false; + m_iSaveInfoC=0; +} + +void UIScene_InGameSaveManagementMenu::handleGainFocus(bool navBack) +{ + UIScene::handleGainFocus(navBack); + + updateTooltips(); + + if(navBack) + { + // re-enable button presses + m_bIgnoreInput=false; + } +} + +wstring UIScene_InGameSaveManagementMenu::getMoviePath() +{ + return L"SaveMenu"; +} + +void UIScene_InGameSaveManagementMenu::tick() +{ + UIScene::tick(); + + if(m_bExitScene) // navigate forward or back + { + if(!m_bRetrievingSaveThumbnails) + { + // need to wait for any callback retrieving thumbnail to complete + navigateBack(); + } + } + // Stop loading thumbnails if we navigate forwards + if(hasFocus(m_iPad)) + { + if(m_bUpdateSaveSize) + { + m_spaceIndicatorSaves.selectSave(m_iSaveListIndex); + m_bUpdateSaveSize = false; + } + + // Display the saves if we have them + if(!m_bSavesDisplayed) + { + m_pSaveDetails=StorageManager.ReturnSavesInfo(); + if(m_pSaveDetails!=NULL) + { + m_spaceIndicatorSaves.reset(); + + m_bSavesDisplayed=true; + + if(m_saveDetails!=NULL) + { + for(unsigned int i = 0; i < m_pSaveDetails->iSaveC; ++i) + { + if(m_saveDetails[i].pbThumbnailData!=NULL) + { + delete m_saveDetails[i].pbThumbnailData; + } + } + delete m_saveDetails; + } + m_saveDetails = new SaveListDetails[m_pSaveDetails->iSaveC]; + + m_iSaveDetailsCount = m_pSaveDetails->iSaveC; + for(unsigned int i = 0; i < m_pSaveDetails->iSaveC; ++i) + { +#if defined(_XBOX_ONE) + m_spaceIndicatorSaves.addSave( m_pSaveDetails->SaveInfoA[i].totalSize ); +#elif defined(__ORBIS__) + m_spaceIndicatorSaves.addSave( m_pSaveDetails->SaveInfoA[i].blocksUsed * (32 * 1024) ); +#endif +#ifdef _DURANGO + m_buttonListSaves.addItem(m_pSaveDetails->SaveInfoA[i].UTF16SaveTitle, L""); + + m_saveDetails[i].saveId = i; + memcpy(m_saveDetails[i].UTF16SaveName, m_pSaveDetails->SaveInfoA[i].UTF16SaveTitle, 128); + memcpy(m_saveDetails[i].UTF16SaveFilename, m_pSaveDetails->SaveInfoA[i].UTF16SaveFilename, MAX_SAVEFILENAME_LENGTH); +#else + m_buttonListSaves.addItem(m_pSaveDetails->SaveInfoA[i].UTF8SaveTitle, L""); + + m_saveDetails[i].saveId = i; + memcpy(m_saveDetails[i].UTF8SaveName, m_pSaveDetails->SaveInfoA[i].UTF8SaveTitle, 128); + memcpy(m_saveDetails[i].UTF8SaveFilename, m_pSaveDetails->SaveInfoA[i].UTF8SaveFilename, MAX_SAVEFILENAME_LENGTH); +#endif + } + m_controlSavesTimer.setVisible( false ); + + // set focus on the first button + + } + } + + if(!m_bExitScene && m_bSavesDisplayed && !m_bRetrievingSaveThumbnails && !m_bAllLoaded) + { + if( m_iRequestingThumbnailId < (m_buttonListSaves.getItemCount() )) + { + m_bRetrievingSaveThumbnails = true; + app.DebugPrintf("Requesting the first thumbnail\n"); + // set the save to load + PSAVE_DETAILS pSaveDetails=StorageManager.ReturnSavesInfo(); + C4JStorage::ESaveGameState eLoadStatus=StorageManager.LoadSaveDataThumbnail(&pSaveDetails->SaveInfoA[(int)m_iRequestingThumbnailId],&LoadSaveDataThumbnailReturned,this); + + if(eLoadStatus!=C4JStorage::ESaveGame_GetSaveThumbnail) + { + // something went wrong + m_bRetrievingSaveThumbnails=false; + m_bAllLoaded = true; + } + } + } + else if (m_bSavesDisplayed && m_bSaveThumbnailReady) + { + m_bSaveThumbnailReady = false; + + // check we're not waiting to exit the scene + if(!m_bExitScene) + { + // convert to utf16 + uint16_t u16Message[MAX_SAVEFILENAME_LENGTH]; +#ifdef _DURANGO + // Already utf16 on durango + memcpy(u16Message, m_saveDetails[m_iRequestingThumbnailId].UTF16SaveFilename, MAX_SAVEFILENAME_LENGTH); +#elif defined(_WINDOWS64) + int result = ::MultiByteToWideChar( + CP_UTF8, // convert from UTF-8 + MB_ERR_INVALID_CHARS, // error on invalid chars + m_saveDetails[m_iRequestingThumbnailId].UTF8SaveFilename, // source UTF-8 string + MAX_SAVEFILENAME_LENGTH, // total length of source UTF-8 string, + // in CHAR's (= bytes), including end-of-string \0 + (wchar_t *)u16Message, // destination buffer + MAX_SAVEFILENAME_LENGTH // size of destination buffer, in WCHAR's + ); +#else +#ifdef __PS3 + size_t srcmax,dstmax; +#else + uint32_t srcmax,dstmax; + uint32_t srclen,dstlen; +#endif + srcmax=MAX_SAVEFILENAME_LENGTH; + dstmax=MAX_SAVEFILENAME_LENGTH; + +#if defined(__PS3__) + L10nResult lres= UTF8stoUTF16s((uint8_t *)m_saveDetails[m_iRequestingThumbnailId].UTF8SaveFilename,&srcmax,u16Message,&dstmax); +#else + SceCesUcsContext context; + sceCesUcsContextInit(&context); + + sceCesUtf8StrToUtf16Str(&context, (uint8_t *)m_saveDetails[m_iRequestingThumbnailId].UTF8SaveFilename,srcmax,&srclen,u16Message,dstmax,&dstlen); +#endif +#endif + if( m_saveDetails[m_iRequestingThumbnailId].pbThumbnailData ) + { + registerSubstitutionTexture((wchar_t *)u16Message,m_saveDetails[m_iRequestingThumbnailId].pbThumbnailData,m_saveDetails[m_iRequestingThumbnailId].dwThumbnailSize); + } + m_buttonListSaves.setTextureName(m_iRequestingThumbnailId, (wchar_t *)u16Message); + + ++m_iRequestingThumbnailId; + if( m_iRequestingThumbnailId < (m_buttonListSaves.getItemCount() )) + { + app.DebugPrintf("Requesting another thumbnail\n"); + // set the save to load + PSAVE_DETAILS pSaveDetails=StorageManager.ReturnSavesInfo(); + C4JStorage::ESaveGameState eLoadStatus=StorageManager.LoadSaveDataThumbnail(&pSaveDetails->SaveInfoA[(int)m_iRequestingThumbnailId],&LoadSaveDataThumbnailReturned,this); + if(eLoadStatus!=C4JStorage::ESaveGame_GetSaveThumbnail) + { + // something went wrong + m_bRetrievingSaveThumbnails=false; + m_bAllLoaded = true; + } + } + else + { + m_bRetrievingSaveThumbnails = false; + m_bAllLoaded = true; + } + } + else + { + // stop retrieving thumbnails, and exit + m_bRetrievingSaveThumbnails = false; + } + } + } + + switch(m_iState) + { + case e_SavesIdle: + break; + case e_SavesRepopulateAfterDelete: + m_bIgnoreInput = false; + m_iRequestingThumbnailId = 0; + m_bAllLoaded=false; + m_bRetrievingSaveThumbnails=false; + m_bSavesDisplayed=false; + m_iSaveInfoC=0; + m_buttonListSaves.clearList(); + //StorageManager.ClearSavesInfo(); + //GetSaveInfo(); + m_iState=e_SavesIdle; + break; + } +} + +void UIScene_InGameSaveManagementMenu::GetSaveInfo( ) +{ + unsigned int uiSaveC=0; + + // This will return with the number retrieved in uiSaveC + + // clear the saves list + m_bSavesDisplayed = false; // we're blocking the exit from this scene until complete + m_buttonListSaves.clearList(); + m_iSaveInfoC=0; + m_controlSavesTimer.setVisible(true); + + m_pSaveDetails=StorageManager.ReturnSavesInfo(); + if(m_pSaveDetails==NULL) + { + C4JStorage::ESaveGameState eSGIStatus= StorageManager.GetSavesInfo(m_iPad,NULL,this,"save"); + } + + + return; +} + +void UIScene_InGameSaveManagementMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + if(m_bIgnoreInput) return; + + // if we're retrieving save info, ignore key presses + if(!m_bSavesDisplayed) return; + + ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); + + switch(key) + { + case ACTION_MENU_CANCEL: + if(pressed) + { +#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) + m_bExitScene=true; +#else + navigateBack(); +#endif + handled = true; + } + break; + case ACTION_MENU_OK: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + case ACTION_MENU_PAGEUP: + case ACTION_MENU_PAGEDOWN: + sendInputToMovie(key, repeat, pressed, released); + handled = true; + break; + } +} + +void UIScene_InGameSaveManagementMenu::handleInitFocus(F64 controlId, F64 childId) +{ + app.DebugPrintf(app.USER_SR, "UIScene_InGameSaveManagementMenu::handleInitFocus - %d , %d\n", (int)controlId, (int)childId); +} + +void UIScene_InGameSaveManagementMenu::handleFocusChange(F64 controlId, F64 childId) +{ + app.DebugPrintf(app.USER_SR, "UIScene_InGameSaveManagementMenu::handleFocusChange - %d , %d\n", (int)controlId, (int)childId); + m_iSaveListIndex = childId; + if(m_bSavesDisplayed) m_bUpdateSaveSize = true; + updateTooltips(); +} + +void UIScene_InGameSaveManagementMenu::handlePress(F64 controlId, F64 childId) +{ + switch((int)controlId) + { + case eControl_SavesList: + { + m_bIgnoreInput = true; + + // delete the save game + // Have to ask the player if they are sure they want to delete this game + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + ui.RequestErrorMessage(IDS_TOOLTIPS_DELETESAVE, IDS_TEXT_DELETE_SAVE, uiIDA, 2,m_iPad,&UIScene_InGameSaveManagementMenu::DeleteSaveDialogReturned,this); + + ui.PlayUISFX(eSFX_Press); + break; + } + } +} + +int UIScene_InGameSaveManagementMenu::DeleteSaveDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + UIScene_InGameSaveManagementMenu* pClass = (UIScene_InGameSaveManagementMenu*)pParam; + // results switched for this dialog + + if(result==C4JStorage::EMessage_ResultDecline) + { + if(app.DebugSettingsOn() && app.GetLoadSavesFromFolderEnabled()) + { + pClass->m_bIgnoreInput=false; + } + else + { + StorageManager.DeleteSaveData(&pClass->m_pSaveDetails->SaveInfoA[pClass->m_iSaveListIndex],UIScene_InGameSaveManagementMenu::DeleteSaveDataReturned,pClass); + pClass->m_controlSavesTimer.setVisible( true ); + } + } + else + { + pClass->m_bIgnoreInput=false; + } + + return 0; +} + +int UIScene_InGameSaveManagementMenu::DeleteSaveDataReturned(LPVOID lpParam,bool bRes) +{ + UIScene_InGameSaveManagementMenu* pClass = (UIScene_InGameSaveManagementMenu*)lpParam; + + if(bRes) + { + // wipe the list and repopulate it + pClass->m_iState=e_SavesRepopulateAfterDelete; + } + else pClass->m_bIgnoreInput=false; + + pClass->updateTooltips(); + + return 0; +} + +bool UIScene_InGameSaveManagementMenu::hasFocus(int iPad) +{ + return bHasFocus && (iPad == m_iPad || m_iPad == XUSER_INDEX_ANY); +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_InGameSaveManagementMenu.h b/Minecraft.Client/Common/UI/UIScene_InGameSaveManagementMenu.h new file mode 100644 index 00000000..3f9ace3a --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_InGameSaveManagementMenu.h @@ -0,0 +1,104 @@ +#pragma once + +#include "UIScene.h" + +class UIScene_InGameSaveManagementMenu : public UIScene +{ +private: + enum EControls + { + eControl_SavesList, +#if defined(_XBOX_ONE) || defined(__ORBIS__) + eControl_SpaceIndicator, +#endif + }; + + enum EState + { + e_SavesIdle, + e_SavesRepopulate, + e_SavesRepopulateAfterDelete + }; + + static const int JOIN_LOAD_CREATE_BUTTON_INDEX = 0; + + SaveListDetails *m_saveDetails; + int m_iSaveDetailsCount; + +protected: + UIControl_SaveList m_buttonListSaves; + UIControl_Label m_labelSavesListTitle; + UIControl m_controlSavesTimer; +#if defined(_XBOX_ONE) || defined(__ORBIS__) + UIControl_SpaceIndicatorBar m_spaceIndicatorSaves; +#endif + +private: + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_buttonListSaves, "SavesList") + + UI_MAP_ELEMENT( m_labelSavesListTitle, "SavesListTitle") + + UI_MAP_ELEMENT( m_controlSavesTimer, "SavesTimer") + +#if defined(_XBOX_ONE) || defined(__ORBIS__) + UI_MAP_ELEMENT( m_spaceIndicatorSaves, "SaveSizeBar") +#endif + UI_END_MAP_ELEMENTS_AND_NAMES() + + int m_iState; + + vector *m_saves; + + bool m_bIgnoreInput; + bool m_bAllLoaded; + bool m_bRetrievingSaveThumbnails; + bool m_bSaveThumbnailReady; + int m_iRequestingThumbnailId; + SAVE_DETAILS *m_pSaveDetails; + bool m_bSavesDisplayed; + bool m_bExitScene; + int m_iSaveInfoC; + int m_iSaveListIndex; + //int *m_iConfigA; // track the texture packs that we don't have installed + + bool m_bUpdateSaveSize; + +public: + UIScene_InGameSaveManagementMenu(int iPad, void *initData, UILayer *parentLayer); + virtual ~UIScene_InGameSaveManagementMenu(); + + virtual void updateTooltips(); + + virtual void handleReload(); + virtual void handleGainFocus(bool navBack); + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + virtual void handleFocusChange(F64 controlId, F64 childId); + virtual void handleInitFocus(F64 controlId, F64 childId); + + virtual EUIScene getSceneType() { return eUIScene_LoadOrJoinMenu;} + + // Returns true if lower scenes in this scenes layer, or in any layer below this scenes layers should be hidden + virtual bool hidesLowerScenes() { return true; } + + virtual bool hasFocus(int iPad); + + virtual void tick(); + +private: + void Initialise(); + void GetSaveInfo(); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + + static int LoadSaveDataThumbnailReturned(LPVOID lpParam,PBYTE pbThumbnail,DWORD dwThumbnailBytes); + static int DeleteSaveDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int DeleteSaveDataReturned(LPVOID lpParam,bool bRes); +protected: + void handlePress(F64 controlId, F64 childId); +}; diff --git a/Minecraft.Client/Common/UI/UIScene_Intro.cpp b/Minecraft.Client/Common/UI/UIScene_Intro.cpp new file mode 100644 index 00000000..7fc435b2 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_Intro.cpp @@ -0,0 +1,174 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_Intro.h" + + +UIScene_Intro::UIScene_Intro(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + m_bIgnoreNavigate = false; + m_bAnimationEnded = false; + + bool bSkipESRB = false; + 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; +#elif defined(_XBOX) + int platformIdx = 1; +#elif defined(_DURANGO) + int platformIdx = 2; +#elif defined(__PS3__) + int platformIdx = 3; +#elif defined(__ORBIS__) + int platformIdx = 4; +#elif defined(__PSVITA__) + int platformIdx = 5; +#endif + + IggyDataValue result; + IggyDataValue value[3]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = platformIdx; + + value[1].type = IGGY_DATATYPE_boolean; + 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 + m_TouchToSkip.init(0); +#endif +} + +wstring UIScene_Intro::getMoviePath() +{ + return L"Intro"; +} + +void UIScene_Intro::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); + + switch(key) + { + case ACTION_MENU_OK: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + if(!m_bIgnoreNavigate) + { + m_bIgnoreNavigate = true; + //ui.NavigateToHomeMenu(); +#if defined(__PS3__) || defined(__ORBIS__) || defined (__PSVITA__) + + // has the user seen the EULA already ? We need their options file loaded for this + C4JStorage::eOptionsCallback eStatus=app.GetOptionsCallbackStatus(0); + switch(eStatus) + { + case C4JStorage::eOptions_Callback_Read: + case C4JStorage::eOptions_Callback_Read_FileNotFound: + // we've either read it, or it wasn't found + if(app.GetGameSettings(0,eGameSetting_PS3_EULA_Read)==0) + { + ui.NavigateToScene(0,eUIScene_EULA); + } + else + { + ui.NavigateToScene(0,eUIScene_SaveMessage); + } + break; + default: + ui.NavigateToScene(0,eUIScene_EULA); + break; + } +#elif defined _XBOX_ONE + ui.NavigateToScene(0,eUIScene_MainMenu); +#else + ui.NavigateToScene(0,eUIScene_SaveMessage); +#endif + } + break; + } +} + +#ifdef __PSVITA__ +void UIScene_Intro::handleTouchInput(unsigned int iPad, S32 x, S32 y, int iId, bool bPressed, bool bRepeat, bool bReleased) +{ + if(bReleased) + { + bool handled = false; + handleInput(iPad, ACTION_MENU_OK, false, true, false, handled); + } +} +#endif + +void UIScene_Intro::handleAnimationEnd() +{ + if(!m_bIgnoreNavigate) + { + m_bIgnoreNavigate = true; + //ui.NavigateToHomeMenu(); +#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) + // has the user seen the EULA already ? We need their options file loaded for this + C4JStorage::eOptionsCallback eStatus=app.GetOptionsCallbackStatus(0); + switch(eStatus) + { + case C4JStorage::eOptions_Callback_Read: + case C4JStorage::eOptions_Callback_Read_FileNotFound: + // we've either read it, or it wasn't found + if(app.GetGameSettings(0,eGameSetting_PS3_EULA_Read)==0) + { + ui.NavigateToScene(0,eUIScene_EULA); + } + else + { + ui.NavigateToScene(0,eUIScene_SaveMessage); + } + break; + default: + ui.NavigateToScene(0,eUIScene_EULA); + break; + } + + +#elif defined _XBOX_ONE + // Don't navigate to the main menu if we don't have focus, as we could have the quadrant sign-in or a join game timer screen running, and then when Those finish they'll + // give the main menu focus which clears the signed in players and therefore breaks transitioning into the game + if( hasFocus( m_iPad ) ) + { + ui.NavigateToScene(0,eUIScene_MainMenu); + } + else + { + m_bAnimationEnded = true; + } +#else + ui.NavigateToScene(0,eUIScene_SaveMessage); +#endif + } +} + +void UIScene_Intro::handleGainFocus(bool navBack) +{ + // Only relevant on xbox one - if we didn't navigate to the main menu at animation end due to the timer or quadrant sign-in being up, then we'll need to + // do it now in case the user has cancelled or joining a game failed + if( m_bAnimationEnded ) + { + ui.NavigateToScene(0,eUIScene_MainMenu); + } +} diff --git a/Minecraft.Client/Common/UI/UIScene_Intro.h b/Minecraft.Client/Common/UI/UIScene_Intro.h new file mode 100644 index 00000000..8bdc030e --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_Intro.h @@ -0,0 +1,52 @@ +#pragma once + +#include "UIScene.h" + +class UIScene_Intro : public UIScene +{ +private: + bool m_bIgnoreNavigate; + bool m_bAnimationEnded; + + IggyName m_funcSetIntroPlatform; +#ifdef __PSVITA__ + UIControl_Touch m_TouchToSkip; +#endif + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) +#ifdef __PSVITA__ + UI_MAP_ELEMENT( m_TouchToSkip, "TouchToSkip" ) +#endif + UI_MAP_NAME( m_funcSetIntroPlatform, L"SetIntroPlatform") + UI_END_MAP_ELEMENTS_AND_NAMES() + +public: + UIScene_Intro(int iPad, void *initData, UILayer *parentLayer); + + virtual EUIScene getSceneType() { return eUIScene_Intro;} + + // Returns true if this scene has focus for the pad passed in +#ifndef __PS3__ + virtual bool hasFocus(int iPad) { return bHasFocus; } +#endif + +protected: + + + virtual wstring getMoviePath(); + +#ifdef _DURANGO + virtual long long getDefaultGtcButtons() { return 0; } +#endif + +public: + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + + virtual void handleAnimationEnd(); + virtual void handleGainFocus(bool navBack); + +#ifdef __PSVITA__ + virtual void handleTouchInput(unsigned int iPad, S32 x, S32 y, int iId, bool bPressed, bool bRepeat, bool bReleased); +#endif + +}; diff --git a/Minecraft.Client/Common/UI/UIScene_InventoryMenu.cpp b/Minecraft.Client/Common/UI/UIScene_InventoryMenu.cpp new file mode 100644 index 00000000..723937d0 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_InventoryMenu.cpp @@ -0,0 +1,334 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_InventoryMenu.h" + +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.h" +#include "..\..\..\Minecraft.World\net.minecraft.stats.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.effect.h" +#include "..\..\MultiplayerLocalPlayer.h" +#include "..\..\Minecraft.h" +#include "..\..\Options.h" +#include "..\..\EntityRenderDispatcher.h" +#include "..\..\Lighting.h" +#include "..\Tutorial\Tutorial.h" +#include "..\Tutorial\TutorialMode.h" +#include "..\Tutorial\TutorialEnum.h" + +#define INVENTORY_UPDATE_EFFECTS_TIMER_ID (10) +#define INVENTORY_UPDATE_EFFECTS_TIMER_TIME (1000) // 1 second + +UIScene_InventoryMenu::UIScene_InventoryMenu(int iPad, void *_initData, UILayer *parentLayer) : UIScene_AbstractContainerMenu(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + InventoryScreenInput *initData = (InventoryScreenInput *)_initData; + + Minecraft *pMinecraft = Minecraft::GetInstance(); + if( pMinecraft->localgameModes[initData->iPad] != NULL ) + { + TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[initData->iPad]; + m_previousTutorialState = gameMode->getTutorial()->getCurrentState(); + gameMode->getTutorial()->changeTutorialState(e_Tutorial_State_Inventory_Menu, this); + } + + InventoryMenu *menu = (InventoryMenu *)initData->player->inventoryMenu; + + initData->player->awardStat(GenericStats::openInventory(),GenericStats::param_openInventory()); + + Initialize( initData->iPad, menu, false, InventoryMenu::INV_SLOT_START, eSectionInventoryUsing, eSectionInventoryMax, initData->bNavigateBack ); + + m_slotListArmor.addSlots(InventoryMenu::ARMOR_SLOT_START, InventoryMenu::ARMOR_SLOT_END - InventoryMenu::ARMOR_SLOT_START); + + if(initData) delete initData; + + for(unsigned int i = 0; i < MobEffect::NUM_EFFECTS; ++i) + { + m_bEffectTime[i] = 0; + } + + updateEffectsDisplay(); + addTimer(INVENTORY_UPDATE_EFFECTS_TIMER_ID,INVENTORY_UPDATE_EFFECTS_TIMER_TIME); +} + +wstring UIScene_InventoryMenu::getMoviePath() +{ + if(app.GetLocalPlayerCount() > 1) + { + return L"InventoryMenuSplit"; + } + else + { + return L"InventoryMenu"; + } +} + +void UIScene_InventoryMenu::handleReload() +{ + Initialize( m_iPad, m_menu, false, InventoryMenu::INV_SLOT_START, eSectionInventoryUsing, eSectionInventoryMax, m_bNavigateBack ); + + m_slotListArmor.addSlots(InventoryMenu::ARMOR_SLOT_START, InventoryMenu::ARMOR_SLOT_END - InventoryMenu::ARMOR_SLOT_START); + + for(unsigned int i = 0; i < MobEffect::NUM_EFFECTS; ++i) + { + m_bEffectTime[i] = 0; + } +} + +int UIScene_InventoryMenu::getSectionColumns(ESceneSection eSection) +{ + int cols = 0; + switch( eSection ) + { + case eSectionInventoryArmor: + cols = 1; + break; + case eSectionInventoryInventory: + cols = 9; + break; + case eSectionInventoryUsing: + cols = 9; + break; + default: + assert( false ); + break; + } + return cols; +} + +int UIScene_InventoryMenu::getSectionRows(ESceneSection eSection) +{ + int rows = 0; + switch( eSection ) + { + case eSectionInventoryArmor: + rows = 4; + break; + case eSectionInventoryInventory: + rows = 3; + break; + case eSectionInventoryUsing: + rows = 1; + break; + default: + assert( false ); + break; + } + return rows; +} + +void UIScene_InventoryMenu::GetPositionOfSection( ESceneSection eSection, UIVec2D* pPosition ) +{ + switch( eSection ) + { + case eSectionInventoryArmor: + pPosition->x = m_slotListArmor.getXPos(); + pPosition->y = m_slotListArmor.getYPos(); + break; + case eSectionInventoryInventory: + pPosition->x = m_slotListInventory.getXPos(); + pPosition->y = m_slotListInventory.getYPos(); + break; + case eSectionInventoryUsing: + pPosition->x = m_slotListHotbar.getXPos(); + pPosition->y = m_slotListHotbar.getYPos(); + break; + default: + assert( false ); + break; + } +} + +void UIScene_InventoryMenu::GetItemScreenData( ESceneSection eSection, int iItemIndex, UIVec2D* pPosition, UIVec2D* pSize ) +{ + UIVec2D sectionSize; + + switch( eSection ) + { + case eSectionInventoryArmor: + sectionSize.x = m_slotListArmor.getWidth(); + sectionSize.y = m_slotListArmor.getHeight(); + break; + case eSectionInventoryInventory: + sectionSize.x = m_slotListInventory.getWidth(); + sectionSize.y = m_slotListInventory.getHeight(); + break; + case eSectionInventoryUsing: + sectionSize.x = m_slotListHotbar.getWidth(); + sectionSize.y = m_slotListHotbar.getHeight(); + break; + default: + assert( false ); + break; + } + + int rows = getSectionRows(eSection); + int cols = getSectionColumns(eSection); + + pSize->x = sectionSize.x/cols; + pSize->y = sectionSize.y/rows; + + int itemCol = iItemIndex % cols; + int itemRow = iItemIndex/cols; + + pPosition->x = itemCol * pSize->x; + pPosition->y = itemRow * pSize->y; +} + +void UIScene_InventoryMenu::setSectionSelectedSlot(ESceneSection eSection, int x, int y) +{ + int cols = getSectionColumns(eSection); + + int index = (y * cols) + x; + + UIControl_SlotList *slotList = NULL; + switch( eSection ) + { + case eSectionInventoryArmor: + slotList = &m_slotListArmor; + break; + case eSectionInventoryInventory: + slotList = &m_slotListInventory; + break; + case eSectionInventoryUsing: + slotList = &m_slotListHotbar; + break; + } + + slotList->setHighlightSlot(index); +} + +UIControl *UIScene_InventoryMenu::getSection(ESceneSection eSection) +{ + UIControl *control = NULL; + switch( eSection ) + { + case eSectionInventoryArmor: + control = &m_slotListArmor; + break; + case eSectionInventoryInventory: + control = &m_slotListInventory; + break; + case eSectionInventoryUsing: + control = &m_slotListHotbar; + break; + } + return control; +} + +void UIScene_InventoryMenu::customDraw(IggyCustomDrawCallbackRegion *region) +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + if(pMinecraft->localplayers[m_iPad] == NULL || pMinecraft->localgameModes[m_iPad] == NULL) return; + + if(wcscmp((wchar_t *)region->name,L"player")==0) + { + // Setup GDraw, normal game render states and matrices + CustomDrawData *customDrawRegion = ui.setupCustomDraw(this,region); + delete customDrawRegion; + + m_playerPreview.render(region); + + // Finish GDraw and anything else that needs to be finalised + ui.endCustomDraw(region); + } + else + { + UIScene_AbstractContainerMenu::customDraw(region); + } +} + +void UIScene_InventoryMenu::handleTimerComplete(int id) +{ + if(id == INVENTORY_UPDATE_EFFECTS_TIMER_ID) + { + updateEffectsDisplay(); + } +} + +void UIScene_InventoryMenu::updateEffectsDisplay() +{ + // Update with the current effects + Minecraft *pMinecraft = Minecraft::GetInstance(); + shared_ptr player = pMinecraft->localplayers[m_iPad]; + + if(player == NULL) return; + + vector *activeEffects = player->getActiveEffects(); + + // 4J - TomK setup time update value array size to update the active effects + int iValue = 0; + IggyDataValue *UpdateValue = new IggyDataValue[activeEffects->size()*2]; + + for(AUTO_VAR(it, activeEffects->begin()); it != activeEffects->end(); ++it) + { + MobEffectInstance *effect = *it; + + if(effect->getDuration() >= m_bEffectTime[effect->getId()]) + { + wstring effectString = app.GetString( effect->getDescriptionId() );//I18n.get(effect.getDescriptionId()).trim(); + if (effect->getAmplifier() > 0) + { + wstring potencyString = L""; + switch(effect->getAmplifier()) + { + case 1: + potencyString = L" "; + potencyString += app.GetString( IDS_POTION_POTENCY_1 ); + break; + case 2: + potencyString = L" "; + potencyString += app.GetString( IDS_POTION_POTENCY_2 ); + break; + case 3: + potencyString = L" "; + potencyString += app.GetString( IDS_POTION_POTENCY_3 ); + break; + default: + potencyString = app.GetString( IDS_POTION_POTENCY_0 ); + break; + } + effectString += potencyString; + } + int icon = 0; + MobEffect *mobEffect = MobEffect::effects[effect->getId()]; + if (mobEffect->hasIcon()) + { + icon = mobEffect->getIcon(); + } + IggyDataValue result; + IggyDataValue value[3]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = icon; + + IggyStringUTF16 stringVal; + stringVal.string = (IggyUTF16*)effectString.c_str(); + stringVal.length = effectString.length(); + value[1].type = IGGY_DATATYPE_string_UTF16; + value[1].string16 = stringVal; + + int seconds = effect->getDuration() / SharedConstants::TICKS_PER_SECOND; + value[2].type = IGGY_DATATYPE_number; + value[2].number = seconds; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcAddEffect , 3 , value ); + } + + if(MobEffect::effects[effect->getId()]->hasIcon()) + { + // 4J - TomK set ids and remaining duration so we can update the timers accurately in one call! (this prevents performance related timer sync issues, especially on PSVita) + UpdateValue[iValue].type = IGGY_DATATYPE_number; + UpdateValue[iValue].number = MobEffect::effects[effect->getId()]->getIcon(); + UpdateValue[iValue + 1].type = IGGY_DATATYPE_number; + UpdateValue[iValue + 1].number = (int)(effect->getDuration() / SharedConstants::TICKS_PER_SECOND); + iValue+=2; + } + + m_bEffectTime[effect->getId()] = effect->getDuration(); + } + + IggyDataValue result; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcUpdateEffects , activeEffects->size()*2 , UpdateValue ); + + delete activeEffects; +} diff --git a/Minecraft.Client/Common/UI/UIScene_InventoryMenu.h b/Minecraft.Client/Common/UI/UIScene_InventoryMenu.h new file mode 100644 index 00000000..fb8d57a2 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_InventoryMenu.h @@ -0,0 +1,51 @@ +#pragma once + +#include "UIScene_AbstractContainerMenu.h" +#include "IUIScene_InventoryMenu.h" + +#include "..\..\..\Minecraft.World\MobEffect.h" + +class InventoryMenu; + +class UIScene_InventoryMenu : public UIScene_AbstractContainerMenu, public IUIScene_InventoryMenu +{ + friend class UIControl_MinecraftPlayer; +private: + int m_bEffectTime[MobEffect::NUM_EFFECTS]; +public: + UIScene_InventoryMenu(int iPad, void *initData, UILayer *parentLayer); + + virtual EUIScene getSceneType() { return eUIScene_InventoryMenu;} + +protected: + UIControl_SlotList m_slotListArmor; + UIControl_MinecraftPlayer m_playerPreview; + IggyName m_funcUpdateEffects, m_funcAddEffect; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene_AbstractContainerMenu) + UI_BEGIN_MAP_CHILD_ELEMENTS( m_controlMainPanel ) + UI_MAP_ELEMENT( m_slotListArmor, "armorList") + UI_MAP_ELEMENT( m_playerPreview, "iggy_player") + + UI_MAP_NAME( m_funcUpdateEffects, L"UpdateEffects") + UI_MAP_NAME( m_funcAddEffect, L"AddEffect") + UI_END_MAP_CHILD_ELEMENTS() + UI_END_MAP_ELEMENTS_AND_NAMES() + + virtual wstring getMoviePath(); + virtual void handleReload(); + + virtual int getSectionColumns(ESceneSection eSection); + virtual int getSectionRows(ESceneSection eSection); + virtual void GetPositionOfSection( ESceneSection eSection, UIVec2D* pPosition ); + virtual void GetItemScreenData( ESceneSection eSection, int iItemIndex, UIVec2D* pPosition, UIVec2D* pSize ); + virtual void handleSectionClick(ESceneSection eSection) {} + virtual void setSectionSelectedSlot(ESceneSection eSection, int x, int y); + + virtual UIControl *getSection(ESceneSection eSection); + + virtual void customDraw(IggyCustomDrawCallbackRegion *region); + virtual void handleTimerComplete(int id); + +private: + void updateEffectsDisplay(); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_JoinMenu.cpp b/Minecraft.Client/Common/UI/UIScene_JoinMenu.cpp new file mode 100644 index 00000000..c036f7bf --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_JoinMenu.cpp @@ -0,0 +1,596 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_JoinMenu.h" +#include "..\..\Minecraft.h" +#include "..\..\TexturePackRepository.h" +#include "..\..\Options.h" +#include "..\..\MinecraftServer.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.h" + +#define UPDATE_PLAYERS_TIMER_ID 0 +#define UPDATE_PLAYERS_TIMER_TIME 30000 + +UIScene_JoinMenu::UIScene_JoinMenu(int iPad, void *_initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + JoinMenuInitData *initData = (JoinMenuInitData *)_initData; + m_selectedSession = initData->selectedSession; + m_friendInfoUpdatedOK = false; + m_friendInfoUpdatedERROR = false; + m_friendInfoRequestIssued = false; +} + +void UIScene_JoinMenu::updateTooltips() +{ + int iA = -1; + int iY = -1; + if (getControlFocus() == eControl_GamePlayers) + { +#ifdef _DURANGO + iY = IDS_TOOLTIPS_VIEW_GAMERCARD; +#endif + } + else + { + iA = IDS_TOOLTIPS_SELECT; + } + + ui.SetTooltips( DEFAULT_XUI_MENU_USER, iA, IDS_TOOLTIPS_BACK, -1, iY ); + +} + +void UIScene_JoinMenu::tick() +{ + if( !m_friendInfoRequestIssued ) + { + ui.NavigateToScene(m_iPad, eUIScene_Timer); + g_NetworkManager.GetFullFriendSessionInfo(m_selectedSession, &friendSessionUpdated, this); + m_friendInfoRequestIssued = true; + } + + if( m_friendInfoUpdatedOK ) + { + m_friendInfoUpdatedOK = false; + + m_buttonJoinGame.init(app.GetString(IDS_JOIN_GAME),eControl_JoinGame); + + m_buttonListPlayers.init(eControl_GamePlayers); + +#if defined(__PS3__) || defined(__ORBIS__) || defined __PSVITA__ + for( int i = 0; i < MINECRAFT_NET_MAX_PLAYERS; i++ ) + { + if( m_selectedSession->data.players[i] != NULL ) + { + #ifndef _CONTENT_PACKAGE + if(app.DebugSettingsOn() && (app.GetGameSettingsDebugMask()&(1L<data.players[i].getOnlineID()); + + #ifndef __PSVITA__ + // Append guest number (any players in an online game not signed into PSN are guests) + if( m_selectedSession->data.players[i].isSignedIntoPSN() == false ) + { + char suffix[5]; + sprintf(suffix, " (%d)", m_selectedSession->data.players[i].getQuadrant() + 1); + playerName.append(suffix); + } + #endif + m_buttonListPlayers.addItem(playerName); + } + } + else + { + // Leave the loop when we hit the first NULL player + break; + } + } +#elif defined(_DURANGO) + for( int i = 0; i < MINECRAFT_NET_MAX_PLAYERS; i++ ) + { + if ( m_selectedSession->searchResult.m_playerNames[i].size() ) + { + m_buttonListPlayers.addItem(m_selectedSession->searchResult.m_playerNames[i]); + } + else + { + // Leave the loop when we hit the first empty player name + break; + } + } +#endif + + m_labelLabels[eLabel_Difficulty].init(app.GetString(IDS_LABEL_DIFFICULTY)); + m_labelLabels[eLabel_GameType].init(app.GetString(IDS_LABEL_GAME_TYPE)); + m_labelLabels[eLabel_GamertagsOn].init(app.GetString(IDS_LABEL_GAMERTAGS)); + m_labelLabels[eLabel_Structures].init(app.GetString(IDS_LABEL_STRUCTURES)); + m_labelLabels[eLabel_LevelType].init(app.GetString(IDS_LABEL_LEVEL_TYPE)); + m_labelLabels[eLabel_PVP].init(app.GetString(IDS_LABEL_PvP)); + m_labelLabels[eLabel_Trust].init(app.GetString(IDS_LABEL_TRUST)); + m_labelLabels[eLabel_TNTOn].init(app.GetString(IDS_LABEL_TNT)); + m_labelLabels[eLabel_FireOn].init(app.GetString(IDS_LABEL_FIRE_SPREADS)); + + unsigned int uiGameHostSettings = m_selectedSession->data.m_uiGameHostSettings; + switch(app.GetGameHostOption(uiGameHostSettings,eGameHostOption_Difficulty)) + { + case Difficulty::EASY: + m_labelValues[eLabel_Difficulty].init( app.GetString(IDS_DIFFICULTY_TITLE_EASY) ); + break; + case Difficulty::NORMAL: + m_labelValues[eLabel_Difficulty].init( app.GetString(IDS_DIFFICULTY_TITLE_NORMAL) ); + break; + case Difficulty::HARD: + m_labelValues[eLabel_Difficulty].init( app.GetString(IDS_DIFFICULTY_TITLE_HARD) ); + break; + case Difficulty::PEACEFUL: + default: + m_labelValues[eLabel_Difficulty].init( app.GetString(IDS_DIFFICULTY_TITLE_PEACEFUL) ); + break; + } + + int option = app.GetGameHostOption(uiGameHostSettings,eGameHostOption_GameType); + if(option == GameType::CREATIVE->getId()) + { + m_labelValues[eLabel_GameType].init( app.GetString(IDS_CREATIVE) ); + } + else if(option == GameType::ADVENTURE->getId()) + { + m_labelValues[eLabel_GameType].init( app.GetString(IDS_ADVENTURE) ); + } + else + { + m_labelValues[eLabel_GameType].init( app.GetString(IDS_SURVIVAL) ); + } + + if(app.GetGameHostOption(uiGameHostSettings,eGameHostOption_Gamertags)) m_labelValues[eLabel_GamertagsOn].init( app.GetString(IDS_ON) ); + else m_labelValues[eLabel_GamertagsOn].init( app.GetString(IDS_OFF) ); + + if(app.GetGameHostOption(uiGameHostSettings,eGameHostOption_Structures)) m_labelValues[eLabel_Structures].init( app.GetString(IDS_ON) ); + else m_labelValues[eLabel_Structures].init( app.GetString(IDS_OFF) ); + + if(app.GetGameHostOption(uiGameHostSettings,eGameHostOption_LevelType)) m_labelValues[eLabel_LevelType].init( app.GetString(IDS_LEVELTYPE_SUPERFLAT) ); + else m_labelValues[eLabel_LevelType].init( app.GetString(IDS_LEVELTYPE_NORMAL) ); + + if(app.GetGameHostOption(uiGameHostSettings,eGameHostOption_PvP))m_labelValues[eLabel_PVP].init( app.GetString(IDS_ON) ); + else m_labelValues[eLabel_PVP].init( app.GetString(IDS_OFF) ); + + if(app.GetGameHostOption(uiGameHostSettings,eGameHostOption_TrustPlayers)) m_labelValues[eLabel_Trust].init( app.GetString(IDS_ON) ); + else m_labelValues[eLabel_Trust].init( app.GetString(IDS_OFF) ); + + if(app.GetGameHostOption(uiGameHostSettings,eGameHostOption_TNT)) m_labelValues[eLabel_TNTOn].init( app.GetString(IDS_ON) ); + else m_labelValues[eLabel_TNTOn].init( app.GetString(IDS_OFF) ); + + if(app.GetGameHostOption(uiGameHostSettings,eGameHostOption_FireSpreads)) m_labelValues[eLabel_FireOn].init( app.GetString(IDS_ON) ); + else m_labelValues[eLabel_FireOn].init( app.GetString(IDS_OFF) ); + + m_bIgnoreInput = false; + + // Alert the app the we want to be informed of ethernet connections + app.SetLiveLinkRequired( true ); + + TelemetryManager->RecordMenuShown(m_iPad, eUIScene_JoinMenu, 0); + + addTimer(UPDATE_PLAYERS_TIMER_ID,UPDATE_PLAYERS_TIMER_TIME); + } + + if( m_friendInfoUpdatedERROR ) + { + m_buttonJoinGame.init(app.GetString(IDS_JOIN_GAME),eControl_JoinGame); + + m_buttonListPlayers.init(eControl_GamePlayers); + + m_labelLabels[eLabel_Difficulty].init(app.GetString(IDS_LABEL_DIFFICULTY)); + m_labelLabels[eLabel_GameType].init(app.GetString(IDS_LABEL_GAME_TYPE)); + m_labelLabels[eLabel_GamertagsOn].init(app.GetString(IDS_LABEL_GAMERTAGS)); + m_labelLabels[eLabel_Structures].init(app.GetString(IDS_LABEL_STRUCTURES)); + m_labelLabels[eLabel_LevelType].init(app.GetString(IDS_LABEL_LEVEL_TYPE)); + m_labelLabels[eLabel_PVP].init(app.GetString(IDS_LABEL_PvP)); + m_labelLabels[eLabel_Trust].init(app.GetString(IDS_LABEL_TRUST)); + m_labelLabels[eLabel_TNTOn].init(app.GetString(IDS_LABEL_TNT)); + m_labelLabels[eLabel_FireOn].init(app.GetString(IDS_LABEL_FIRE_SPREADS)); + + m_labelValues[eLabel_Difficulty].init(app.GetString(IDS_DIFFICULTY_TITLE_PEACEFUL)); + m_labelValues[eLabel_GameType].init( app.GetString(IDS_CREATIVE) ); + m_labelValues[eLabel_GamertagsOn].init( app.GetString(IDS_OFF) ); + m_labelValues[eLabel_Structures].init( app.GetString(IDS_OFF) ); + m_labelValues[eLabel_LevelType].init( app.GetString(IDS_LEVELTYPE_NORMAL) ); + m_labelValues[eLabel_PVP].init( app.GetString(IDS_OFF) ); + m_labelValues[eLabel_Trust].init( app.GetString(IDS_OFF) ); + m_labelValues[eLabel_TNTOn].init( app.GetString(IDS_OFF) ); + m_labelValues[eLabel_FireOn].init( app.GetString(IDS_OFF) ); + + m_friendInfoUpdatedERROR = false; + + // Show a generic network error message, not always safe to assume the error was host quitting + // without bubbling more info up from the network manager so this is the best we can do + UINT uiIDA[1]; + uiIDA[0] = IDS_CONFIRM_OK; +#ifdef _XBOX_ONE + ui.RequestErrorMessage( IDS_CONNECTION_FAILED, IDS_DISCONNECTED_SERVER_QUIT, uiIDA,1,m_iPad,ErrorDialogReturned,this); +#else + ui.RequestErrorMessage( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA,1,m_iPad,ErrorDialogReturned,this); +#endif + } + + UIScene::tick(); +} + +void UIScene_JoinMenu::friendSessionUpdated(bool success, void *pParam) +{ + UIScene_JoinMenu *scene = (UIScene_JoinMenu *)pParam; + ui.NavigateBack(scene->m_iPad); + if( success ) + { + scene->m_friendInfoUpdatedOK = true; + } + else + { + scene->m_friendInfoUpdatedERROR = true; + } +} + +int UIScene_JoinMenu::ErrorDialogReturned(void *pParam, int iPad, const C4JStorage::EMessageResult) +{ + UIScene_JoinMenu *scene = (UIScene_JoinMenu *)pParam; + ui.NavigateBack(scene->m_iPad); + + return 0; +} + +void UIScene_JoinMenu::updateComponents() +{ + m_parentLayer->showComponent(m_iPad,eUIComponent_Panorama,true); + m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,true); +} + +wstring UIScene_JoinMenu::getMoviePath() +{ + return L"JoinMenu"; +} + +void UIScene_JoinMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + if(m_bIgnoreInput) return; + + ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); + + switch(key) + { + case ACTION_MENU_CANCEL: + if(pressed) + { + navigateBack(); + handled = true; + } + break; +#ifdef _DURANGO + case ACTION_MENU_Y: + if(m_selectedSession != NULL && getControlFocus() == eControl_GamePlayers && m_buttonListPlayers.getItemCount() > 0) + { + PlayerUID uid = m_selectedSession->searchResult.m_playerXuids[m_buttonListPlayers.getCurrentSelection()]; + if( uid != INVALID_XUID ) ProfileManager.ShowProfileCard(ProfileManager.GetLockedProfile(),uid); + } + break; +#endif + case ACTION_MENU_OK: + if (getControlFocus() != eControl_GamePlayers) + { + sendInputToMovie(key, repeat, pressed, released); + } + handled = true; + break; +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + case ACTION_MENU_PAGEUP: + case ACTION_MENU_PAGEDOWN: + sendInputToMovie(key, repeat, pressed, released); + handled = true; + break; + } +} + +void UIScene_JoinMenu::handlePress(F64 controlId, F64 childId) +{ + switch((int)controlId) + { + case eControl_JoinGame: + { + m_bIgnoreInput = true; + + //CD - Added for audio + ui.PlayUISFX(eSFX_Press); + +#ifdef _DURANGO + ProfileManager.CheckMultiplayerPrivileges(m_iPad, true, &checkPrivilegeCallback, (LPVOID)GetCallbackUniqueId()); +#else + StartSharedLaunchFlow(); +#endif + } + break; + case eControl_GamePlayers: + break; + }; +} + +void UIScene_JoinMenu::handleFocusChange(F64 controlId, F64 childId) +{ + switch((int)controlId) + { + case eControl_GamePlayers: + m_buttonListPlayers.updateChildFocus( (int) childId ); + }; + updateTooltips(); +} + +#ifdef _DURANGO +void UIScene_JoinMenu::checkPrivilegeCallback(LPVOID lpParam, bool hasPrivilege, int iPad) +{ + UIScene_JoinMenu* pClass = (UIScene_JoinMenu*)ui.GetSceneFromCallbackId((size_t)lpParam); + + if(pClass) + { + if(hasPrivilege) + { + pClass->StartSharedLaunchFlow(); + } + else + { + pClass->m_bIgnoreInput = false; + } + } +} +#endif + +void UIScene_JoinMenu::StartSharedLaunchFlow() +{ + if(!app.IsLocalMultiplayerAvailable()) + { + JoinGame(this); + } + else + { + //ProfileManager.RequestSignInUI(false, false, false, true, false,&UIScene_JoinMenu::StartGame_SignInReturned, this,ProfileManager.GetPrimaryPad()); + SignInInfo info; + info.Func = &UIScene_JoinMenu::StartGame_SignInReturned; + info.lpParam = (LPVOID)GetCallbackUniqueId(); + info.requireOnline = true; + ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_QuadrantSignin,&info); + } +} + +int UIScene_JoinMenu::StartGame_SignInReturned(void *pParam,bool bContinue, int iPad) +{ + UIScene_JoinMenu* pClass = (UIScene_JoinMenu*)ui.GetSceneFromCallbackId((size_t)pParam); + + if(pClass) + { + if(bContinue==true) + { + // It's possible that the player has not signed in - they can back out + if(ProfileManager.IsSignedIn(iPad)) + { + JoinGame(pClass); + } + else + { + pClass->m_bIgnoreInput=false; + } + } + else + { + pClass->m_bIgnoreInput=false; + } + } + return 0; +} + +// Shared function to join the game that is the same whether we used the sign-in UI or not +void UIScene_JoinMenu::JoinGame(UIScene_JoinMenu* pClass) +{ + DWORD dwSignedInUsers = 0; + bool noPrivileges = false; + DWORD dwLocalUsersMask = 0; + bool isSignedInLive = true; + int iPadNotSignedInLive = -1; + + ProfileManager.SetLockedProfile(0); // TEMP! + + // If we're in SD mode, then only the primary player gets to play + if (app.IsLocalMultiplayerAvailable()) + { + for(unsigned int index = 0; index < XUSER_MAX_COUNT; ++index) + { + if(ProfileManager.IsSignedIn(index)) + { + if (isSignedInLive && !ProfileManager.IsSignedInLive(index)) + { + // Record the first non signed in live pad + iPadNotSignedInLive = index; + } + + if( !ProfileManager.AllowedToPlayMultiplayer(index) ) noPrivileges = true; + dwLocalUsersMask |= CGameNetworkManager::GetLocalPlayerMask(index); + isSignedInLive = isSignedInLive && ProfileManager.IsSignedInLive(index); + } + } + } + else + { + if(ProfileManager.IsSignedIn(ProfileManager.GetPrimaryPad())) + { + if( !ProfileManager.AllowedToPlayMultiplayer(ProfileManager.GetPrimaryPad()) ) noPrivileges = true; + dwLocalUsersMask |= CGameNetworkManager::GetLocalPlayerMask(ProfileManager.GetPrimaryPad()); + + isSignedInLive = ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad()); +#ifdef __PSVITA__ + if(CGameNetworkManager::usingAdhocMode() && SQRNetworkManager_AdHoc_Vita::GetAdhocStatus()) + isSignedInLive = true; +#endif + + } + } + + // If this is an online game but not all players are signed in to Live, stop! + if (!isSignedInLive) + { +#ifdef __ORBIS__ + // Check if PSN is unavailable because of age restriction + int npAvailability = ProfileManager.getNPAvailability(iPadNotSignedInLive); + if (npAvailability == SCE_NP_ERROR_AGE_RESTRICTION) + { + pClass->m_bIgnoreInput = false; + // 4J Stu - This is a bit messy and is due to the library incorrectly returning false for IsSignedInLive if the npAvailability isn't SCE_OK + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPadNotSignedInLive); + } + else +#endif + { + pClass->m_bIgnoreInput=false; + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestErrorMessage( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA,1,ProfileManager.GetPrimaryPad()); + } + return; + } + + // Check if user-created content is allowed, as we cannot play multiplayer if it's not + bool noUGC = false; + BOOL pccAllowed = TRUE; + BOOL pccFriendsAllowed = TRUE; + +#if defined(__PS3__) || defined(__PSVITA__) + if(isSignedInLive) + { + ProfileManager.GetChatAndContentRestrictions(ProfileManager.GetPrimaryPad(),false,&noUGC,NULL,NULL); + } +#else + ProfileManager.AllowedPlayerCreatedContent(ProfileManager.GetPrimaryPad(),false,&pccAllowed,&pccFriendsAllowed); + if(!pccAllowed && !pccFriendsAllowed) noUGC = true; +#endif + + +#ifdef __PSVITA__ + if( CGameNetworkManager::usingAdhocMode() ) + { + noPrivileges = false; + noUGC = false; + } +#endif + + if(noUGC) + { + pClass->setVisible( true ); + pClass->m_bIgnoreInput=false; + + int messageText = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_SINGLE_LOCAL; + if(dwSignedInUsers > 1) messageText = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_ALL_LOCAL; + + ui.RequestUGCMessageBox(IDS_CONNECTION_FAILED, messageText); + } + else if(noPrivileges) + { + pClass->setVisible( true ); + pClass->m_bIgnoreInput=false; + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestErrorMessage( IDS_NO_MULTIPLAYER_PRIVILEGE_TITLE, IDS_NO_MULTIPLAYER_PRIVILEGE_JOIN_TEXT, uiIDA,1,ProfileManager.GetPrimaryPad()); + } + else + { +#if defined(__ORBIS__) || defined(__PSVITA__) + bool chatRestricted = false; + ProfileManager.GetChatAndContentRestrictions(ProfileManager.GetPrimaryPad(),false,&chatRestricted,NULL,NULL); + if(chatRestricted) + { + ProfileManager.DisplaySystemMessage( SCE_MSG_DIALOG_SYSMSG_TYPE_TRC_PSN_CHAT_RESTRICTION, ProfileManager.GetPrimaryPad() ); + } +#endif + CGameNetworkManager::eJoinGameResult result = g_NetworkManager.JoinGame( pClass->m_selectedSession, dwLocalUsersMask ); + + // Alert the app the we no longer want to be informed of ethernet connections + app.SetLiveLinkRequired( false ); + + if( result != CGameNetworkManager::JOINGAME_SUCCESS ) + { + int exitReasonStringId = -1; + switch(result) + { + case CGameNetworkManager::JOINGAME_FAIL_SERVER_FULL: + exitReasonStringId = IDS_DISCONNECTED_SERVER_FULL; + break; + } + + if( exitReasonStringId == -1 ) + { + ui.NavigateBack(pClass->m_iPad); + } + else + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestErrorMessage( IDS_CONNECTION_FAILED, exitReasonStringId, uiIDA,1,ProfileManager.GetPrimaryPad()); + exitReasonStringId = -1; + + ui.NavigateToHomeMenu(); + } + } + } +} + +void UIScene_JoinMenu::handleTimerComplete(int id) +{ + switch(id) + { + case UPDATE_PLAYERS_TIMER_ID: + { +#if TO_BE_IMPLEMENTED + PlayerUID selectedPlayerXUID = m_selectedSession->data.players[playersList.GetCurSel()]; + + bool success = g_NetworkManager.GetGameSessionInfo(m_iPad, m_selectedSession->sessionId,m_selectedSession); + + if( success ) + { + playersList.DeleteItems(0, playersList.GetItemCount()); + int selectedIndex = 0; + for(unsigned int i = 0; i < MINECRAFT_NET_MAX_PLAYERS; ++i) + { + if( m_selectedSession->data.players[i] != NULL ) + { + if(m_selectedSession->data.players[i] == selectedPlayerXUID) selectedIndex = i; + playersList.InsertItems(i,1); +#ifndef _CONTENT_PACKAGE + if(app.DebugSettingsOn() && (app.GetGameSettingsDebugMask()&(1L<data.szPlayers[i] ).c_str() ); + } + } + else + { + // Leave the loop when we hit the first NULL player + break; + } + } + playersList.SetCurSel(selectedIndex); + } +#endif + } + break; + }; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_JoinMenu.h b/Minecraft.Client/Common/UI/UIScene_JoinMenu.h new file mode 100644 index 00000000..817360ef --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_JoinMenu.h @@ -0,0 +1,98 @@ +#pragma once + +#include "UIScene.h" + +class UIScene_JoinMenu : public UIScene +{ +private: + enum EControls + { + eControl_JoinGame, + eControl_GamePlayers + }; + + enum ELabels + { + eLabel_Difficulty, + eLabel_GameType, + eLabel_GamertagsOn, + eLabel_Structures, + eLabel_LevelType, + eLabel_PVP, + eLabel_Trust, + eLabel_TNTOn, + eLabel_FireOn, + + eLabel_COUNT + }; + + UIControl_Button m_buttonJoinGame; + UIControl_ButtonList m_buttonListPlayers; + + UIControl_Label m_labelLabels[eLabel_COUNT]; + UIControl_Label m_labelValues[eLabel_COUNT]; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_buttonJoinGame, "JoinGame") + UI_MAP_ELEMENT( m_buttonListPlayers, "GamePlayers") + + UI_MAP_ELEMENT( m_labelLabels[0], "Label0") + UI_MAP_ELEMENT( m_labelLabels[1], "Label1") + UI_MAP_ELEMENT( m_labelLabels[2], "Label2") + UI_MAP_ELEMENT( m_labelLabels[3], "Label3") + UI_MAP_ELEMENT( m_labelLabels[4], "Label4") + UI_MAP_ELEMENT( m_labelLabels[5], "Label5") + UI_MAP_ELEMENT( m_labelLabels[6], "Label6") + UI_MAP_ELEMENT( m_labelLabels[7], "Label7") + UI_MAP_ELEMENT( m_labelLabels[8], "Label8") + + UI_MAP_ELEMENT( m_labelValues[0], "Value0") + UI_MAP_ELEMENT( m_labelValues[1], "Value1") + UI_MAP_ELEMENT( m_labelValues[2], "Value2") + UI_MAP_ELEMENT( m_labelValues[3], "Value3") + UI_MAP_ELEMENT( m_labelValues[4], "Value4") + UI_MAP_ELEMENT( m_labelValues[5], "Value5") + UI_MAP_ELEMENT( m_labelValues[6], "Value6") + UI_MAP_ELEMENT( m_labelValues[7], "Value7") + UI_MAP_ELEMENT( m_labelValues[8], "Value8") + UI_END_MAP_ELEMENTS_AND_NAMES() + + FriendSessionInfo *m_selectedSession; + bool m_bIgnoreInput; + bool m_friendInfoRequestIssued; + bool m_friendInfoUpdatedOK; + bool m_friendInfoUpdatedERROR; + +public: + UIScene_JoinMenu(int iPad, void *initData, UILayer *parentLayer); + void tick(); + static void friendSessionUpdated(bool success, void *pParam); + static int ErrorDialogReturned(void *pParam, int iPad, const C4JStorage::EMessageResult); + + virtual void updateTooltips(); + virtual void updateComponents(); + + virtual EUIScene getSceneType() { return eUIScene_LoadMenu;} + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + virtual void handleFocusChange(F64 controlId, F64 childId); + virtual void handleTimerComplete(int id); + +protected: + void handlePress(F64 controlId, F64 childId); + + + void StartSharedLaunchFlow(); + +#ifdef _DURANGO + static void checkPrivilegeCallback(LPVOID lpParam, bool hasPrivilege, int iPad); +#endif + + static int StartGame_SignInReturned(void *pParam, bool, int); + static void JoinGame(UIScene_JoinMenu* pClass); +}; diff --git a/Minecraft.Client/Common/UI/UIScene_Keyboard.cpp b/Minecraft.Client/Common/UI/UIScene_Keyboard.cpp new file mode 100644 index 00000000..fb1cc301 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_Keyboard.cpp @@ -0,0 +1,181 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_Keyboard.h" + +#define KEYBOARD_DONE_TIMER_ID 0 +#define KEYBOARD_DONE_TIMER_TIME 100 + +UIScene_Keyboard::UIScene_Keyboard(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + m_EnterTextLabel.init(L"Enter Sign Text"); + + m_KeyboardTextInput.init(L"", -1); + m_KeyboardTextInput.SetCharLimit(15); + + m_ButtonSpace.init(L"Space", -1); + m_ButtonCursorLeft.init(L"Cursor Left", -1); + m_ButtonCursorRight.init(L"Cursor Right", -1); + m_ButtonCaps.init(L"Caps", -1); + m_ButtonDone.init(L"Done", 0); // only the done button needs an id, the others will never call back! + m_ButtonSymbols.init(L"Symbols", -1); + m_ButtonBackspace.init(L"Backspace", -1); + + // Initialise function keyboard Buttons and set alternative symbol button string + wstring label = L"Abc"; + IggyStringUTF16 stringVal; + stringVal.string = (IggyUTF16*)label.c_str(); + stringVal.length = label.length(); + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_string_UTF16; + value[0].string16 = stringVal; + + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcInitFunctionButtons , 1 , value ); + + m_bKeyboardDonePressed = false; + + parentLayer->addComponent(iPad,eUIComponent_MenuBackground); +} + +UIScene_Keyboard::~UIScene_Keyboard() +{ + m_parentLayer->removeComponent(eUIComponent_MenuBackground); +} + +wstring UIScene_Keyboard::getMoviePath() +{ + if(app.GetLocalPlayerCount() > 1 && !m_parentLayer->IsFullscreenGroup()) + { + return L"KeyboardSplit"; + } + else + { + return L"Keyboard"; + } +} + +void UIScene_Keyboard::updateTooltips() +{ + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK, -1, -1); +} + +bool UIScene_Keyboard::allowRepeat(int key) +{ + // 4J - TomK - we want to allow X and Y repeats! + switch(key) + { + case ACTION_MENU_OK: + case ACTION_MENU_CANCEL: + case ACTION_MENU_A: + case ACTION_MENU_B: + case ACTION_MENU_PAUSEMENU: + //case ACTION_MENU_X: + //case ACTION_MENU_Y: + return false; + } + return true; +} + +void UIScene_Keyboard::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + IggyDataValue result; + IggyResult out; + + if(repeat || pressed) + { + switch(key) + { + case ACTION_MENU_CANCEL: + navigateBack(); + handled = true; + break; + case ACTION_MENU_X: // X + out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcBackspaceButtonPressed, 0 , NULL ); + handled = true; + break; + case ACTION_MENU_PAGEUP: // LT + out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSymbolButtonPressed, 0 , NULL ); + handled = true; + break; + case ACTION_MENU_Y: // Y + out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSpaceButtonPressed, 0 , NULL ); + handled = true; + break; + case ACTION_MENU_STICK_PRESS: // LS + out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcCapsButtonPressed, 0 , NULL ); + handled = true; + break; + case ACTION_MENU_LEFT_SCROLL: // LB + out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcCursorLeftButtonPressed, 0 , NULL ); + handled = true; + break; + case ACTION_MENU_RIGHT_SCROLL: // RB + out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcCursorRightButtonPressed, 0 , NULL ); + handled = true; + break; + case ACTION_MENU_PAUSEMENU: // Start + if(!m_bKeyboardDonePressed) + { + out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcDoneButtonPressed, 0 , NULL ); + + // kick off done timer + addTimer(KEYBOARD_DONE_TIMER_ID,KEYBOARD_DONE_TIMER_TIME); + m_bKeyboardDonePressed = true; + } + handled = true; + break; + } + } + + switch(key) + { + case ACTION_MENU_OK: + case ACTION_MENU_LEFT: + case ACTION_MENU_RIGHT: + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + sendInputToMovie(key, repeat, pressed, released); + handled = true; + break; + } +} + +void UIScene_Keyboard::handlePress(F64 controlId, F64 childId) +{ + if((int)controlId == 0) + { + // Done has been pressed. At this point we can query for the input string and pass it on to wherever it is needed. + // we can not query for m_KeyboardTextInput.getLabel() here because we're in an iggy callback so we need to wait a frame. + if(!m_bKeyboardDonePressed) + { + // kick off done timer + addTimer(KEYBOARD_DONE_TIMER_ID,KEYBOARD_DONE_TIMER_TIME); + m_bKeyboardDonePressed = true; + } + } +} + +void UIScene_Keyboard::handleTimerComplete(int id) +{ + if(id == KEYBOARD_DONE_TIMER_ID) + { + // remove timer + killTimer(KEYBOARD_DONE_TIMER_ID); + + // we're done here! + KeyboardDonePressed(); + } +} + +void UIScene_Keyboard::KeyboardDonePressed() +{ + // Debug + app.DebugPrintf("UI Keyboard - DONE - [%ls]\n", m_KeyboardTextInput.getLabel()); + + // ToDo: Keyboard can now pass on its final string value and close itself down + navigateBack(); +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_Keyboard.h b/Minecraft.Client/Common/UI/UIScene_Keyboard.h new file mode 100644 index 00000000..f4e4c899 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_Keyboard.h @@ -0,0 +1,79 @@ +#pragma once + +#include "UIScene.h" + +class UIScene_Keyboard : public UIScene +{ +private: + bool m_bKeyboardDonePressed; + +protected: + UIControl_Label m_EnterTextLabel; + UIControl_TextInput m_KeyboardTextInput; + UIControl_Button m_ButtonSpace, m_ButtonCursorLeft, m_ButtonCursorRight, m_ButtonCaps, m_ButtonDone, m_ButtonSymbols, m_ButtonBackspace; + + IggyName m_funcInitFunctionButtons; + IggyName m_funcCursorRightButtonPressed, m_funcCursorLeftButtonPressed, m_funcCapsButtonPressed, m_funcBackspaceButtonPressed; + IggyName m_funcSpaceButtonPressed, m_funcSymbolButtonPressed, m_funcDoneButtonPressed; + + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT(m_EnterTextLabel, "EnterTextLabel") + UI_MAP_ELEMENT(m_KeyboardTextInput, "KeyboardTextInput") + + UI_MAP_ELEMENT(m_ButtonSpace, "Button_space") + UI_MAP_ELEMENT(m_ButtonCursorLeft, "Button_CursorLeft") + UI_MAP_ELEMENT(m_ButtonCursorRight, "Button_CursorRight") + UI_MAP_ELEMENT(m_ButtonCaps, "Button_Caps") + UI_MAP_ELEMENT(m_ButtonDone, "Button_Done") + UI_MAP_ELEMENT(m_ButtonSymbols, "Button_symbols") + UI_MAP_ELEMENT(m_ButtonBackspace, "Button_bspace") + + UI_MAP_NAME(m_funcInitFunctionButtons, L"InitFunctionButtons"); + + UI_MAP_NAME(m_funcCursorRightButtonPressed, L"CursorRightButtonPressed"); + UI_MAP_NAME(m_funcCursorLeftButtonPressed, L"CursorLeftButtonPressed"); + UI_MAP_NAME(m_funcCapsButtonPressed, L"CapsButtonPressed"); + UI_MAP_NAME(m_funcBackspaceButtonPressed, L"BackspaceButtonPressed"); + UI_MAP_NAME(m_funcSpaceButtonPressed, L"SpaceButtonPressed"); + UI_MAP_NAME(m_funcSymbolButtonPressed, L"SymbolButtonPressed"); + UI_MAP_NAME(m_funcDoneButtonPressed, L"DoneButtonPressed"); + UI_END_MAP_ELEMENTS_AND_NAMES() + +public: + UIScene_Keyboard(int iPad, void *initData, UILayer *parentLayer); + ~UIScene_Keyboard(); + + virtual void updateTooltips(); + + virtual bool allowRepeat(int key); + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + + virtual void handleTimerComplete(int id); + +protected: + void handlePress(F64 controlId, F64 childId); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +private: + void KeyboardDonePressed(); + +public: + virtual EUIScene getSceneType() { return eUIScene_Keyboard;} + + // Returns true if this scene handles input + //virtual bool stealsFocus() { return false; } + + // Returns true if this scene has focus for the pad passed in + //virtual bool hasFocus(int iPad) { return false; } + // Returns true if this scene has focus for the pad passed in +#ifndef __PS3__ + virtual bool hasFocus(int iPad) { return bHasFocus; } +#endif + + // Returns true if lower scenes in this scenes layer, or in any layer below this scenes layers should be hidden + virtual bool hidesLowerScenes() { return false; } +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_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 new file mode 100644 index 00000000..d6f89832 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_LaunchMoreOptionsMenu.cpp @@ -0,0 +1,655 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_LaunchMoreOptionsMenu.h" + +#define GAME_CREATE_ONLINE_TIMER_ID 0 +#define GAME_CREATE_ONLINE_TIMER_TIME 100 + +#ifdef _LARGE_WORLDS +int m_iWorldSizeTitleA[4] = +{ + IDS_WORLD_SIZE_TITLE_CLASSIC, + IDS_WORLD_SIZE_TITLE_SMALL, + IDS_WORLD_SIZE_TITLE_MEDIUM, + IDS_WORLD_SIZE_TITLE_LARGE, +}; +#endif + +UIScene_LaunchMoreOptionsMenu::UIScene_LaunchMoreOptionsMenu(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + m_params = (LaunchMoreOptionsMenuInitData *)initData; + + m_labelWorldOptions.init(app.GetString(IDS_WORLD_OPTIONS)); + + IggyDataValue result; + +#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; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetMenuType , 1 , value ); +#endif + + m_bMultiplayerAllowed = ProfileManager.IsSignedInLive( m_params->iPad ) && ProfileManager.AllowedToPlayMultiplayer(m_params->iPad); + + bool bOnlineGame, bInviteOnly, bAllowFriendsOfFriends; + bOnlineGame = m_params->bOnlineGame; + bInviteOnly = m_params->bInviteOnly; + bAllowFriendsOfFriends = m_params->bAllowFriendsOfFriends; + + // 4J-PB - to stop an offline game being able to select the online flag + if(ProfileManager.IsSignedInLive(m_params->iPad) == false) + { + m_checkboxes[eLaunchCheckbox_Online].SetEnable(false); + } + + if ( m_params->bOnlineSettingChangedBySystem && !m_bMultiplayerAllowed ) + { + // 4J-JEV: Disable and uncheck these boxes if they can't play multiplayer. + m_checkboxes[eLaunchCheckbox_Online].SetEnable(false); + m_checkboxes[eLaunchCheckbox_InviteOnly].SetEnable(false); + m_checkboxes[eLaunchCheckbox_AllowFoF].SetEnable(false); + + bOnlineGame = bInviteOnly = bAllowFriendsOfFriends = false; + } + else if(!m_params->bOnlineGame) + { + m_checkboxes[eLaunchCheckbox_InviteOnly].SetEnable(false); + m_checkboxes[eLaunchCheckbox_AllowFoF].SetEnable(false); + } + + // 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); + m_checkboxes[eLaunchCheckbox_PVP].init(app.GetString(IDS_PLAYER_VS_PLAYER),eLaunchCheckbox_PVP,m_params->bPVP); + m_checkboxes[eLaunchCheckbox_TrustSystem].init(app.GetString(IDS_TRUST_PLAYERS),eLaunchCheckbox_TrustSystem,m_params->bTrust); + m_checkboxes[eLaunchCheckbox_FireSpreads].init(app.GetString(IDS_FIRE_SPREADS),eLaunchCheckbox_FireSpreads,m_params->bFireSpreads); + m_checkboxes[eLaunchCheckbox_TNT].init(app.GetString(IDS_TNT_EXPLODES),eLaunchCheckbox_TNT,m_params->bTNT); + m_checkboxes[eLaunchCheckbox_HostPrivileges].init(app.GetString(IDS_HOST_PRIVILEGES),eLaunchCheckbox_HostPrivileges,m_params->bHostPrivileges); + m_checkboxes[eLaunchCheckbox_ResetNether].init(app.GetString(IDS_RESET_NETHER),eLaunchCheckbox_ResetNether,m_params->bResetNether); + m_checkboxes[eLaunchCheckbox_Structures].init(app.GetString(IDS_GENERATE_STRUCTURES),eLaunchCheckbox_Structures,m_params->bStructures); + m_checkboxes[eLaunchCheckbox_FlatWorld].init(app.GetString(IDS_SUPERFLAT_WORLD),eLaunchCheckbox_FlatWorld,m_params->bFlatWorld); + m_checkboxes[eLaunchCheckbox_BonusChest].init(app.GetString(IDS_BONUS_CHEST),eLaunchCheckbox_BonusChest,m_params->bBonusChest); + + m_checkboxes[eLaunchCheckbox_KeepInventory].init(app.GetString(IDS_KEEP_INVENTORY), eLaunchCheckbox_KeepInventory, m_params->bKeepInventory); + m_checkboxes[eLaunchCheckbox_MobSpawning].init(app.GetString(IDS_MOB_SPAWNING), eLaunchCheckbox_MobSpawning, m_params->bDoMobSpawning); + m_checkboxes[eLaunchCheckbox_MobLoot].init(app.GetString(IDS_MOB_LOOT), eLaunchCheckbox_MobLoot, m_params->bDoMobLoot); + m_checkboxes[eLaunchCheckbox_MobGriefing].init(app.GetString(IDS_MOB_GRIEFING), eLaunchCheckbox_MobGriefing, m_params->bMobGriefing); + m_checkboxes[eLaunchCheckbox_TileDrops].init(app.GetString(IDS_TILE_DROPS), eLaunchCheckbox_TileDrops, m_params->bDoTileDrops); + m_checkboxes[eLaunchCheckbox_NaturalRegeneration].init(app.GetString(IDS_NATURAL_REGEN), eLaunchCheckbox_NaturalRegeneration, m_params->bNaturalRegeneration); + m_checkboxes[eLaunchCheckbox_DayLightCycle].init(app.GetString(IDS_DAYLIGHT_CYCLE), eLaunchCheckbox_DayLightCycle, m_params->bDoDaylightCycle); + + m_labelGameOptions.init( app.GetString(IDS_GAME_OPTIONS) ); + m_labelSeed.init(app.GetString(IDS_CREATE_NEW_WORLD_SEED)); + m_labelRandomSeed.init(app.GetString(IDS_CREATE_NEW_WORLD_RANDOM_SEED)); + m_editSeed.init(m_params->seed, eControl_EditSeed); + +#ifdef _LARGE_WORLDS + m_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 + // #ifndef _XBOX + // 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""; + if(m_params->bGenerateOptions) + { + wsText = app.GetString(IDS_GAMEOPTION_SEED); + } + else + { + wsText = app.GetString(IDS_GAMEOPTION_ONLINE); + } +#else + wstring wsText=app.GetString(IDS_GAMEOPTION_ONLINE); +#endif + EHTMLFontSize size = eHTMLSize_Normal; + if(!RenderManager.IsHiDef() && !RenderManager.IsWidescreen()) + { + size = eHTMLSize_Splitscreen; + } + wchar_t startTags[64]; + swprintf(startTags,64,L"",app.GetHTMLColour(eHTMLColor_White)); + wsText= startTags + wsText; + 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; +} + +void UIScene_LaunchMoreOptionsMenu::updateTooltips() +{ + int changeTabTooltip = -1; + + // Set tooltip for change tab (only two tabs) + if (m_tabIndex == TAB_GAME_OPTIONS) + { + changeTabTooltip = IDS_WORLD_OPTIONS; + } + else + { + changeTabTooltip = IDS_GAME_OPTIONS; + } + + // If there's a change tab tooltip, left bumper symbol should show but not the text (-2) + int lb = changeTabTooltip == -1 ? -1 : -2; + + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT, IDS_TOOLTIPS_BACK, -1, -1, -1, -1, lb, changeTabTooltip); +} + +void UIScene_LaunchMoreOptionsMenu::updateComponents() +{ + m_parentLayer->showComponent(m_iPad,eUIComponent_Panorama,true); +//#ifdef _LARGE_WORLDS +// m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,true); +//#else + m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,false); +//#endif +} + +wstring UIScene_LaunchMoreOptionsMenu::getMoviePath() +{ + return L"LaunchMoreOptionsMenu"; +} + +void UIScene_LaunchMoreOptionsMenu::tick() +{ + UIScene::tick(); + + bool bMultiplayerAllowed = ProfileManager.IsSignedInLive(m_params->iPad) && ProfileManager.AllowedToPlayMultiplayer(m_params->iPad); + + if (bMultiplayerAllowed != m_bMultiplayerAllowed) + { + m_checkboxes[ eLaunchCheckbox_Online].SetEnable(bMultiplayerAllowed); + m_checkboxes[eLaunchCheckbox_InviteOnly].SetEnable(bMultiplayerAllowed); + m_checkboxes[ eLaunchCheckbox_AllowFoF].SetEnable(bMultiplayerAllowed); + + if (bMultiplayerAllowed) + { + m_checkboxes[ eLaunchCheckbox_Online].setChecked(true); + m_checkboxes[eLaunchCheckbox_AllowFoF].setChecked(true); + } + + m_bMultiplayerAllowed = bMultiplayerAllowed; + } + + // Check cheats + if (m_bUpdateCheats) + { + UpdateCheats(); + m_bUpdateCheats = false; + } + // check online + if(m_bUpdateOnline) + { + UpdateOnline(); + m_bUpdateOnline = false; + } +} + +void UIScene_LaunchMoreOptionsMenu::handleDestroy() +{ +#ifdef __PSVITA__ + app.DebugPrintf("missing InputManager.DestroyKeyboard on Vita !!!!!!\n"); +#endif + + // so shut down the keyboard if it is displayed +#if ( defined __PS3__ || defined __ORBIS__ || defined _DURANGO) + InputManager.DestroyKeyboard(); +#endif +} + +void UIScene_LaunchMoreOptionsMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + if(m_bIgnoreInput) return; + + //app.DebugPrintf("UIScene_DebugOverlay handling input for pad %d, key %d, down- %s, pressed- %s, released- %s\n", iPad, key, down?"TRUE":"FALSE", pressed?"TRUE":"FALSE", released?"TRUE":"FALSE"); + ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); + + switch(key) + { + case ACTION_MENU_CANCEL: + if(pressed) + { + navigateBack(); + handled = true; + } + break; + case ACTION_MENU_OK: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + // 4J-JEV: Inform user why their game must be offline. +#if defined _XBOX_ONE + { + UIControl_CheckBox *checkboxOnline = &m_checkboxes[eLaunchCheckbox_Online]; + if ( pressed && controlHasFocus( checkboxOnline->getId()) && !checkboxOnline->IsEnabled() ) + { + UINT uiIDA[1] = { IDS_CONFIRM_OK }; + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1, iPad); + } + } +#endif + + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + case ACTION_MENU_LEFT: + case ACTION_MENU_RIGHT: + case ACTION_MENU_PAGEUP: + case ACTION_MENU_PAGEDOWN: + case ACTION_MENU_OTHER_STICK_UP: + case ACTION_MENU_OTHER_STICK_DOWN: + sendInputToMovie(key, repeat, pressed, released); + handled = true; + break; + case ACTION_MENU_LEFT_SCROLL: + case ACTION_MENU_RIGHT_SCROLL: + if(pressed) + { + // Toggle tab index + m_tabIndex = m_tabIndex == 0 ? 1 : 0; + updateTooltips(); + IggyDataValue result; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcChangeTab , 0 , NULL ); + } + break; + } +} + +#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 + ui.PlayUISFX(eSFX_Press); + + switch((EControls)((int)controlId)) + { + case eLaunchCheckbox_Online: + m_params->bOnlineGame = selected; + m_bUpdateOnline = true; + break; + case eLaunchCheckbox_InviteOnly: + m_params->bInviteOnly = selected; + break; + case eLaunchCheckbox_AllowFoF: + m_params->bAllowFriendsOfFriends = selected; + break; + case eLaunchCheckbox_PVP: + m_params->bPVP = selected; + break; + case eLaunchCheckbox_TrustSystem: + m_params->bTrust = selected; + break; + case eLaunchCheckbox_FireSpreads: + m_params->bFireSpreads = selected; + break; + case eLaunchCheckbox_TNT: + m_params->bTNT = selected; + break; + case eLaunchCheckbox_HostPrivileges: + m_params->bHostPrivileges = selected; + m_bUpdateCheats = true; + break; + case eLaunchCheckbox_ResetNether: + m_params->bResetNether = selected; + break; + case eLaunchCheckbox_Structures: + m_params->bStructures = selected; + break; + case eLaunchCheckbox_FlatWorld: + m_params->bFlatWorld = selected; + break; + case eLaunchCheckbox_BonusChest: + m_params->bBonusChest = selected; + break; +#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; + }; +} + +void UIScene_LaunchMoreOptionsMenu::handleFocusChange(F64 controlId, F64 childId) +{ + int stringId = 0; + switch((int)controlId) + { + case eLaunchCheckbox_Online: + stringId = IDS_GAMEOPTION_ONLINE; + break; + case eLaunchCheckbox_InviteOnly: + stringId = IDS_GAMEOPTION_INVITEONLY; + break; + case eLaunchCheckbox_AllowFoF: + stringId = IDS_GAMEOPTION_ALLOWFOF; + break; + case eLaunchCheckbox_PVP: + stringId = IDS_GAMEOPTION_PVP; + break; + case eLaunchCheckbox_TrustSystem: + stringId = IDS_GAMEOPTION_TRUST; + break; + case eLaunchCheckbox_FireSpreads: + stringId = IDS_GAMEOPTION_FIRE_SPREADS; + break; + case eLaunchCheckbox_TNT: + stringId = IDS_GAMEOPTION_TNT_EXPLODES; + break; + case eLaunchCheckbox_HostPrivileges: + stringId = IDS_GAMEOPTION_HOST_PRIVILEGES; + break; + case eLaunchCheckbox_ResetNether: + stringId = IDS_GAMEOPTION_RESET_NETHER; + break; + case eLaunchCheckbox_Structures: + stringId = IDS_GAMEOPTION_STRUCTURES; + break; + case eLaunchCheckbox_FlatWorld: + stringId = IDS_GAMEOPTION_SUPERFLAT; + break; + case eLaunchCheckbox_BonusChest: + stringId = IDS_GAMEOPTION_BONUS_CHEST; + break; + 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 + }; + + wstring wsText=app.GetString(stringId); + EHTMLFontSize size = eHTMLSize_Normal; + if(!RenderManager.IsHiDef() && !RenderManager.IsWidescreen()) + { + size = eHTMLSize_Splitscreen; + } + wchar_t startTags[64]; + swprintf(startTags,64,L"",app.GetHTMLColour(eHTMLColor_White)); + wsText = startTags + wsText; + + if (m_tabIndex == TAB_WORLD_OPTIONS) + m_labelDescription_WorldOptions.setLabel(wsText); + else + m_labelDescription_GameOptions.setLabel(wsText); +} + +void UIScene_LaunchMoreOptionsMenu::handleTimerComplete(int id) +{ + /*switch(id) //4J-JEV: Moved this over to the tick. + { + case GAME_CREATE_ONLINE_TIMER_ID: + { + bool bMultiplayerAllowed + = ProfileManager.IsSignedInLive(m_params->iPad) + && ProfileManager.AllowedToPlayMultiplayer(m_params->iPad); + + if (bMultiplayerAllowed != m_bMultiplayerAllowed) + { + m_checkboxes[ eLaunchCheckbox_Online].SetEnable(bMultiplayerAllowed); + m_checkboxes[eLaunchCheckbox_InviteOnly].SetEnable(bMultiplayerAllowed); + m_checkboxes[ eLaunchCheckbox_AllowFoF].SetEnable(bMultiplayerAllowed); + + m_checkboxes[eLaunchCheckbox_Online].setChecked(bMultiplayerAllowed); + + m_bMultiplayerAllowed = bMultiplayerAllowed; + } + } + break; + };*/ +} + +int UIScene_LaunchMoreOptionsMenu::KeyboardCompleteSeedCallback(LPVOID lpParam,bool bRes) +{ + UIScene_LaunchMoreOptionsMenu *pClass=(UIScene_LaunchMoreOptionsMenu *)lpParam; + pClass->m_bIgnoreInput=false; + // 4J HEG - No reason to set value if keyboard was cancelled + if (bRes) + { +#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; + } + return 0; +} + +void UIScene_LaunchMoreOptionsMenu::handlePress(F64 controlId, F64 childId) +{ + if(m_bIgnoreInput) return; + + switch((int)controlId) + { + case eControl_EditSeed: + { + m_bIgnoreInput=true; +#ifdef __PS3__ + int language = XGetLanguage(); + switch(language) + { + case XC_LANGUAGE_JAPANESE: + case XC_LANGUAGE_KOREAN: + case XC_LANGUAGE_TCHINESE: + InputManager.RequestKeyboard(app.GetString(IDS_CREATE_NEW_WORLD_SEED),m_editSeed.getLabel(),(DWORD)0,60,&UIScene_LaunchMoreOptionsMenu::KeyboardCompleteSeedCallback,this,C_4JInput::EKeyboardMode_Default); + break; + default: + // 4J Stu - Use a different keyboard for non-asian languages so we don't have prediction on + InputManager.RequestKeyboard(app.GetString(IDS_CREATE_NEW_WORLD_SEED),m_editSeed.getLabel(),(DWORD)0,60,&UIScene_LaunchMoreOptionsMenu::KeyboardCompleteSeedCallback,this,C_4JInput::EKeyboardMode_Alphabet_Extended); + break; + } +#else + InputManager.RequestKeyboard(app.GetString(IDS_CREATE_NEW_WORLD_SEED),m_editSeed.getLabel(),(DWORD)0,60,&UIScene_LaunchMoreOptionsMenu::KeyboardCompleteSeedCallback,this,C_4JInput::EKeyboardMode_Default); +#endif + } + break; + } +} + + +void UIScene_LaunchMoreOptionsMenu::handleSliderMove(F64 sliderId, F64 currentValue) +{ + int value = (int)currentValue; + switch((int)sliderId) + { + case eControl_WorldSize: +#ifdef _LARGE_WORLDS + m_sliderWorldSize.handleSliderMove(value); + m_params->worldSize = value; + m_sliderWorldSize.setLabel(app.GetString(m_iWorldSizeTitleA[value])); +#endif + break; + 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 new file mode 100644 index 00000000..367db10d --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_LaunchMoreOptionsMenu.h @@ -0,0 +1,165 @@ +#pragma once + +#include "UIScene.h" + +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 + eLaunchCheckbox_Online, + eLaunchCheckbox_InviteOnly, + eLaunchCheckbox_AllowFoF, + eLaunchCheckbox_PVP, + eLaunchCheckbox_TrustSystem, + eLaunchCheckbox_FireSpreads, + eLaunchCheckbox_TNT, + eLaunchCheckbox_HostPrivileges, + eLaunchCheckbox_ResetNether, + eLaunchCheckbox_Structures, + eLaunchCheckbox_FlatWorld, + eLaunchCheckbox_BonusChest, + eLaunchCheckbox_DisableSaving, + 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_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; + UIControl_Slider m_sliderWorldResize; + IggyName m_funcSetMenuType, m_funcChangeTab, m_funcSetDescription; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_labelGameOptions, "LabelGame") + UI_MAP_ELEMENT( m_labelWorldOptions, "LabelWorld") + + UI_MAP_ELEMENT( m_gameOptions, "GameOptions") + UI_BEGIN_MAP_CHILD_ELEMENTS(m_gameOptions) +#ifdef __PSVITA__ + UI_MAP_ELEMENT( m_TouchTabGame, "TouchTabGame" ) +#endif + UI_MAP_ELEMENT( m_labelDescription_GameOptions, "Description_GameOptions") + + UI_MAP_ELEMENT( m_checkboxes[eLaunchCheckbox_Online], "CheckboxOnline") + UI_MAP_ELEMENT( m_checkboxes[eLaunchCheckbox_InviteOnly], "CheckboxInviteOnly") + UI_MAP_ELEMENT( m_checkboxes[eLaunchCheckbox_AllowFoF], "CheckboxAllowFoF") + UI_MAP_ELEMENT( m_checkboxes[eLaunchCheckbox_PVP], "CheckboxPVP") + UI_MAP_ELEMENT( m_checkboxes[eLaunchCheckbox_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_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; + int m_tabIndex; + +public: + UIScene_LaunchMoreOptionsMenu(int iPad, void *initData, UILayer *parentLayer); + + virtual void updateTooltips(); + virtual void updateComponents(); + + virtual EUIScene getSceneType() { return eUIScene_LaunchMoreOptionsMenu;} + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + virtual void tick(); + virtual void handleDestroy(); + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + virtual void handleFocusChange(F64 controlId, F64 childId); + virtual void handleTimerComplete(int id); + static int KeyboardCompleteSeedCallback(LPVOID lpParam,const bool bRes); + virtual void handlePress(F64 controlId, F64 childId); + virtual void handleSliderMove(F64 sliderId, F64 currentValue); + +protected: + void handleCheckboxToggled(F64 controlId, bool selected); + +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 new file mode 100644 index 00000000..12b21905 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_LeaderboardsMenu.cpp @@ -0,0 +1,1047 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_LeaderboardsMenu.h" +#include "..\Leaderboards\LeaderboardManager.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.tile.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.h" + +#define PLAYER_ONLINE_TIMER_ID 0 +#define PLAYER_ONLINE_TIMER_TIME 100 + +// if the value is greater than 32000, it's an xzp icon that needs displayed, rather than the game icon +const int UIScene_LeaderboardsMenu::TitleIcons[UIScene_LeaderboardsMenu::NUM_LEADERBOARDS][7] = +{ + { UIControl_LeaderboardList::e_ICON_TYPE_WALKED, UIControl_LeaderboardList::e_ICON_TYPE_FALLEN, Item::minecart_Id, Item::boat_Id, NULL }, + { Tile::dirt_Id, Tile::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] = { + { + UIScene_LeaderboardsMenu::LeaderboardDescriptor( 4, true, IDS_LEADERBOARD_TRAVELLING_PEACEFUL), // Travelling Peaceful + UIScene_LeaderboardsMenu::LeaderboardDescriptor( 4, true, IDS_LEADERBOARD_TRAVELLING_EASY), // Travelling Easy + UIScene_LeaderboardsMenu::LeaderboardDescriptor( 4, true, IDS_LEADERBOARD_TRAVELLING_NORMAL), // Travelling Normal + UIScene_LeaderboardsMenu::LeaderboardDescriptor( 4, true, IDS_LEADERBOARD_TRAVELLING_HARD), // Travelling Hard + }, + { + UIScene_LeaderboardsMenu::LeaderboardDescriptor( 7, false, IDS_LEADERBOARD_MINING_BLOCKS_PEACEFUL), // Mining Peaceful + UIScene_LeaderboardsMenu::LeaderboardDescriptor( 7, false, IDS_LEADERBOARD_MINING_BLOCKS_EASY), // Mining Easy + UIScene_LeaderboardsMenu::LeaderboardDescriptor( 7, false, IDS_LEADERBOARD_MINING_BLOCKS_NORMAL), // Mining Normal + UIScene_LeaderboardsMenu::LeaderboardDescriptor( 7, false, IDS_LEADERBOARD_MINING_BLOCKS_HARD), // Mining Hard + }, + { + UIScene_LeaderboardsMenu::LeaderboardDescriptor( 6, false, IDS_LEADERBOARD_FARMING_PEACEFUL), // Farming Peaceful + UIScene_LeaderboardsMenu::LeaderboardDescriptor( 6, false, IDS_LEADERBOARD_FARMING_EASY), // Farming Easy + UIScene_LeaderboardsMenu::LeaderboardDescriptor( 6, false, IDS_LEADERBOARD_FARMING_NORMAL), // Farming Normal + UIScene_LeaderboardsMenu::LeaderboardDescriptor( 6, false, IDS_LEADERBOARD_FARMING_HARD), // Farming Hard + }, + { + UIScene_LeaderboardsMenu::LeaderboardDescriptor( 0, false, -1), // + UIScene_LeaderboardsMenu::LeaderboardDescriptor( 7, false, IDS_LEADERBOARD_KILLS_EASY), // Kills Easy + UIScene_LeaderboardsMenu::LeaderboardDescriptor( 7, false, IDS_LEADERBOARD_KILLS_NORMAL), // Kills Normal + UIScene_LeaderboardsMenu::LeaderboardDescriptor( 7, false, IDS_LEADERBOARD_KILLS_HARD), // Kills Hard + }, +}; + +UIScene_LeaderboardsMenu::UIScene_LeaderboardsMenu(int iPad, void *initData, UILayer *parentLayer) + : UIScene(iPad, parentLayer), m_interface(LeaderboardManager::Instance()) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + m_bReady=false; + + m_bPopulatedOnce = false; + + m_newTop = m_newSel = -1; + m_isProcessingStatsRead = false; + // Ignore input until we're retrieved stats, or functions will be called in here after we've backed out of the scene + m_bIgnoreInput=true; + + // Alert the app the we want to be informed of ethernet connections + app.SetLiveLinkRequired( true ); + + //GetFriends(); + + m_currentLeaderboard = 0; + m_currentDifficulty = 2; + SetLeaderboardHeader(); + m_currentFilter = LeaderboardManager::eFM_Friends; + + wchar_t filterBuffer[40]; + swprintf(filterBuffer, 40, L"%ls%ls", app.GetString(IDS_LEADERBOARD_FILTER), app.GetString(IDS_LEADERBOARD_FILTER_FRIENDS)); + m_labelFilter.init(filterBuffer); + + wchar_t entriesBuffer[40]; + swprintf(entriesBuffer, 40, L"%ls%i", app.GetString(IDS_LEADERBOARD_ENTRIES), 0); + m_labelEntries.init(entriesBuffer); + + ReadStats(-1); + +#if ( defined __PS3__ || defined __ORBIS__ || defined __PSVITA__ ) + addTimer( PLAYER_ONLINE_TIMER_ID, PLAYER_ONLINE_TIMER_TIME ); +#endif +} + +UIScene_LeaderboardsMenu::~UIScene_LeaderboardsMenu() +{ + // Alert the app the we no longer want to be informed of ethernet connections + app.SetLiveLinkRequired( false ); +} + +void UIScene_LeaderboardsMenu::updateTooltips() +{ + int iTooltipFriendRequest=-1; + int iTooltipGamerCardOrProfile=-1; + +#ifdef _DURANGO + //if( m_leaderboard.m_entries.size() > 0 ) + if(m_leaderboard.m_totalEntryCount > 0) + { + unsigned int selection = m_newSel; + + // If the selected user is me, don't show Send Friend Request, and show the gamer profile, not the gamer card + + // Check that the index is actually within range of the data we've got before accessing the m_leaderboard.m_entries array + int idx = selection - GetEntryStartIndex(); + if( ( idx < 0 ) || ( idx >= m_leaderboard.m_entries.size() ) ) + { + return; + } + if(m_leaderboard.m_entries[idx].m_bPlayer) + { + iTooltipGamerCardOrProfile=IDS_TOOLTIPS_VIEW_GAMERPROFILE; + } + else + { + iTooltipGamerCardOrProfile=IDS_TOOLTIPS_VIEW_GAMERCARD; + +#ifdef _XBOX + // if we're on the friends filter, then don't show the Send Friend Request + if(!m_currentFilter == LeaderboardManager::eFM_Friends) +#endif + { + // check the entry we're on + if( m_leaderboard.m_entries.size() > 0 ) + { + if( selection >= GetEntryStartIndex() && + selection < (GetEntryStartIndex() + m_leaderboard.m_entries.size()) ) + { +#ifdef _XBOX + if( (m_leaderboard.m_entries[selection - (m_leaderboard.m_entryStartIndex-1)].m_bFriend==false) + && (m_leaderboard.m_entries[selection - (m_leaderboard.m_entryStartIndex-1)].m_bRequestedFriend==false)) +#endif + { + iTooltipFriendRequest=IDS_TOOLTIPS_SEND_FRIEND_REQUEST; + } + } + } + } + } + } +#endif + + ui.SetTooltips(m_iPad, iTooltipFriendRequest, IDS_TOOLTIPS_BACK, IDS_TOOLTIPS_CHANGE_FILTER, iTooltipGamerCardOrProfile); +} + +void UIScene_LeaderboardsMenu::updateComponents() +{ + m_parentLayer->showComponent(m_iPad,eUIComponent_Panorama,!app.GetGameStarted()); + m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,false); +} + +wstring UIScene_LeaderboardsMenu::getMoviePath() +{ + return L"LeaderboardMenu"; +} + +void UIScene_LeaderboardsMenu::tick() +{ + UIScene::tick(); + m_interface.tick(); +} + +void UIScene_LeaderboardsMenu::handleReload() +{ + // We don't allow this in splitscreen, so just go back + navigateBack(); +} + +void UIScene_LeaderboardsMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + if(m_bIgnoreInput && key != ACTION_MENU_CANCEL) return; + + ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); + + // If this is not a press, do not action + if (!pressed) return; + + + /*app.DebugPrintf( + " m_newSel = %i [bottomId] = %i [topId] = %i, [size] = %i\n", + m_newSel, + m_leaderboard.m_entries.size() == 0 ? 0 : m_leaderboard.m_entries[m_leaderboard.m_entries.size()-1].m_row, + GetEntryStartIndex(), + m_leaderboard.m_entries.size() + );*/ + + switch(key) + { + case ACTION_MENU_CANCEL: + if(pressed) + { + navigateBack(); + handled = true; + } + break; + case ACTION_MENU_UP: + --m_newSel; + if(m_newSel<0)m_newSel = 0; + sendInputToMovie(key, repeat, pressed, released); + break; + case ACTION_MENU_DOWN: + ++m_newSel; + if(m_newSel>=m_leaderboard.m_totalEntryCount) m_newSel = m_leaderboard.m_totalEntryCount - 1; + sendInputToMovie(key, repeat, pressed, released); + break; + case ACTION_MENU_LEFT_SCROLL: + case ACTION_MENU_RIGHT_SCROLL: + { + //Do nothing if a stats read is currently in progress, otherwise the system complains about to many read requests + if( pressed && m_bPopulatedOnce && LeaderboardManager::Instance()->isIdle() ) + { + //CD - Added for audio + ui.PlayUISFX(eSFX_Scroll); + + if( key == ACTION_MENU_RIGHT_SCROLL ) + { + ++m_currentDifficulty; + if( m_currentDifficulty == 4 ) + m_currentDifficulty = 0; + + if( m_currentLeaderboard == LEADERBOARD_KILLS_POSITION && m_currentDifficulty == 0 ) + m_currentDifficulty = 1; + } + else + { + if( m_currentDifficulty == 0 ) + m_currentDifficulty = 4; + --m_currentDifficulty; + + if( m_currentLeaderboard == LEADERBOARD_KILLS_POSITION && m_currentDifficulty == 0 ) + m_currentDifficulty = 3; + } + + SetLeaderboardHeader(); + + ReadStats(-1); + ui.PlayUISFX(eSFX_Press); + } + + handled = true; + } + break; + case ACTION_MENU_LEFT: + case ACTION_MENU_RIGHT: + { + //Do nothing if a stats read is currently in progress, otherwise the system complains about to many read requests + if ( pressed && m_bPopulatedOnce && LeaderboardManager::Instance()->isIdle() ) + { + //CD - Added for audio + ui.PlayUISFX(eSFX_Scroll); + + m_bReady=false; + if(key == ACTION_MENU_RIGHT) + { + ++m_currentLeaderboard; + if( m_currentLeaderboard == NUM_LEADERBOARDS ) + m_currentLeaderboard = 0; + } + else + { + if( m_currentLeaderboard == 0 ) + m_currentLeaderboard = NUM_LEADERBOARDS; + --m_currentLeaderboard; + } + + if( m_currentLeaderboard == LEADERBOARD_KILLS_POSITION && m_currentDifficulty == 0 ) + m_currentDifficulty = 1; + + SetLeaderboardHeader(); + + ReadStats(-1); + ui.PlayUISFX(eSFX_Press); + } + handled = true; + } + break; + case ACTION_MENU_PAGEUP: + case ACTION_MENU_PAGEDOWN: + { + //Do nothing if a stats read is currently in progress, otherwise the system complains about to many read requests + if( pressed && m_bPopulatedOnce && LeaderboardManager::Instance()->isIdle() ) + { + //CD - Added for audio + ui.PlayUISFX(eSFX_Scroll); + + if( m_leaderboard.m_totalEntryCount <= 10 ) + break; + + sendInputToMovie(key, repeat, pressed, released); + +#if 0 + if( key == ACTION_MENU_PAGEUP ) + { + m_newTop = m_listGamers.GetTopItem() - 10; + + if( m_newTop < 0 ) + m_newTop = 0; + + m_newSel = m_newTop; + } + else + { + + m_newTop = m_listGamers.GetTopItem() + 10; + + if( m_newTop+10 > (int)m_leaderboard.m_totalEntryCount ) + { + m_newTop = m_leaderboard.m_totalEntryCount - 10; + if( m_newTop < 0 ) + m_newTop = 0; + } + + m_newSel = m_newTop; + } +#endif + } + handled = true; + } + break; + case ACTION_MENU_X: + { + //Do nothing if a stats read is currently in progress, otherwise the system complains about to many read requests + if( pressed && m_bPopulatedOnce && LeaderboardManager::Instance()->isIdle() ) + { + //CD - Added for audio + ui.PlayUISFX(eSFX_Scroll); + + switch( m_currentFilter ) + { + case LeaderboardManager::eFM_Friends: + { + m_currentFilter = LeaderboardManager::eFM_MyScore; + wchar_t filterBuffer[40]; + swprintf(filterBuffer, 40, L"%ls%ls", app.GetString(IDS_LEADERBOARD_FILTER), app.GetString(IDS_LEADERBOARD_FILTER_MYSCORE)); + m_labelFilter.setLabel(filterBuffer); + } + break; + case LeaderboardManager::eFM_MyScore: + { + m_currentFilter = LeaderboardManager::eFM_TopRank; + wchar_t filterBuffer[40]; + swprintf(filterBuffer, 40, L"%ls%ls", app.GetString(IDS_LEADERBOARD_FILTER), app.GetString(IDS_LEADERBOARD_FILTER_OVERALL)); + m_labelFilter.setLabel(filterBuffer); + } + break; + case LeaderboardManager::eFM_TopRank: + { + m_currentFilter = LeaderboardManager::eFM_Friends; + wchar_t filterBuffer[40]; + swprintf(filterBuffer, 40, L"%ls%ls", app.GetString(IDS_LEADERBOARD_FILTER), app.GetString(IDS_LEADERBOARD_FILTER_FRIENDS)); + m_labelFilter.setLabel(filterBuffer); + } + break; + } + + ReadStats(-1); + ui.PlayUISFX(eSFX_Press); + } + handled = true; + } + break; + case ACTION_MENU_Y: + { +#ifdef _DURANGO + //Show gamercard + //if( m_leaderboard.m_entries.size() > 0 ) + if(m_leaderboard.m_totalEntryCount > 0) + { + unsigned int selection = m_newSel; + if( selection >= GetEntryStartIndex() && + selection < (GetEntryStartIndex() + m_leaderboard.m_entries.size()) ) + { + PlayerUID uid = m_leaderboard.m_entries[selection - GetEntryStartIndex()].m_xuid; + if( uid != INVALID_XUID ) + { + ProfileManager.ShowProfileCard(ProfileManager.GetLockedProfile(),uid); + ui.PlayUISFX(eSFX_Press); + } + } + } +#endif + handled = true; + } + break; + case ACTION_MENU_A: + { +#ifdef _DURANGO + //Send friend request if the filter mode is not friend, and they're not a friend or a pending friend +#ifdef _XBOX + if( m_currentFilter != LeaderboardManager::eFM_Friends ) +#endif + { + if( m_leaderboard.m_entries.size() > 0 ) + { + unsigned int selection = m_newSel; + if( selection >= GetEntryStartIndex() && + selection < (GetEntryStartIndex() + m_leaderboard.m_entries.size()) ) + { + //If not the player and neither currently a friend or requested to be a friend + if( !m_leaderboard.m_entries[selection - GetEntryStartIndex()].m_bPlayer +#ifdef _XBOX + && !m_leaderboard.m_entries[selection - (m_leaderboard.m_entryStartIndex-1) ].m_bFriend + && !m_leaderboard.m_entries[selection - (m_leaderboard.m_entryStartIndex-1) ].m_bRequestedFriend +#endif + ) + { + PlayerUID xuid = m_leaderboard.m_entries[selection - GetEntryStartIndex()].m_xuid; + if( xuid != INVALID_XUID ) + { + ProfileManager.ShowAddFriend(m_iPad,xuid); + ui.PlayUISFX(eSFX_Press); + } + } + } + } + } +#endif + handled = true; + } + break; + } +} + +void UIScene_LeaderboardsMenu::ReadStats(int startIndex) +{ + //If startIndex == -1, then use default values + if( startIndex == -1 ) + { + m_newEntryIndex = 1; + m_newReadSize = READ_SIZE; + + m_newEntriesCount = 0; + + m_leaderboard.m_totalEntryCount = 0; + + m_listEntries.clearList(); + } + else + { + m_newEntryIndex = (unsigned int)startIndex; + // m_newReadSize = min((int)READ_SIZE, (int)m_leaderboard.m_totalEntryCount-(startIndex-1)); + } + + //app.DebugPrintf("Requesting stats read %d - %d - %d\n", m_currentLeaderboard, startIndex == -1 ? m_currentFilter : LeaderboardManager::eFM_TopRank, m_currentDifficulty); + + LeaderboardManager::EFilterMode filtermode; + if ( m_currentFilter == LeaderboardManager::eFM_MyScore + || m_currentFilter == LeaderboardManager::eFM_TopRank ) + { + filtermode = (startIndex == -1 ? m_currentFilter : LeaderboardManager::eFM_TopRank); + } + else + { + // 4J-JEV: Friends filter shouldn't switch to toprank. + filtermode = m_currentFilter; + } + + switch (filtermode) + { + case LeaderboardManager::eFM_TopRank: + { + 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); + m_interface.ReadStats_MyScore( this, + m_currentDifficulty, (LeaderboardManager::EStatsType) m_currentLeaderboard, + uid /*ignored on PS3*/, + m_newReadSize + ); + } + break; + case LeaderboardManager::eFM_Friends: + { + PlayerUID uid; + ProfileManager.GetXUID(ProfileManager.GetPrimaryPad(),&uid, true); + m_interface.ReadStats_Friends( this, + m_currentDifficulty, (LeaderboardManager::EStatsType) m_currentLeaderboard, + uid /*ignored on PS3*/, + m_newEntryIndex, m_newReadSize + ); + } + break; + } + + //Show the loading message + m_labelInfo.setLabel(app.GetString(IDS_LEADERBOARD_LOADING)); + m_labelInfo.setVisible(true); +} + +bool UIScene_LeaderboardsMenu::OnStatsReadComplete(LeaderboardManager::eStatsReturn retIn, int numResults, LeaderboardManager::ViewOut results) +{ + //CScene_Leaderboards* scene = reinterpret_cast(userdata); + + m_isProcessingStatsRead = true; + + //bool noResults = LeaderboardManager::Instance()->GetStatsState() != XboxLeaderboardManager::eStatsState_Ready; + bool ret; + + //app.DebugPrintf("Leaderboards read %d stats\n", numResults); + + m_numStats = numResults; + m_stats = results; + ret = RetrieveStats(); + + //else LeaderboardManager::Instance()->SetStatsRetrieved(false); + + PopulateLeaderboard(retIn); + + updateTooltips(); + + m_isProcessingStatsRead = false; + + // allow user input now + m_bIgnoreInput=false; + + return ret; +} + +bool UIScene_LeaderboardsMenu::RetrieveStats() +{ + if(app.DebugSettingsOn() && (app.GetGameSettingsDebugMask()&(1L<SetStatsRetrieved(true); + + m_newEntryIndex = 0; + m_newEntriesCount = NUM_ENTRIES; + + return true; + } + + //assert( LeaderboardManager::Instance()->GetStats() != NULL ); + //PXUSER_STATS_READ_RESULTS stats = LeaderboardManager::Instance()->GetStats(); + //if( m_currentFilter == LeaderboardManager::eFM_Friends ) LeaderboardManager::Instance()->SortFriendStats(); + + bool isDistanceLeaderboard = LEADERBOARD_DESCRIPTORS[m_currentLeaderboard][m_currentDifficulty].m_isDistanceLeaderboard; + + m_newEntriesCount = m_stats.m_numQueries; + + // First read + if( m_leaderboard.m_totalEntryCount == 0 ) + { + m_leaderboard.m_entries.clear(); + +#if _DURANGO + m_leaderboard.m_totalEntryCount = m_numStats; +#else + m_leaderboard.m_totalEntryCount = (m_currentFilter == LeaderboardManager::eFM_Friends) ? m_newEntriesCount : m_numStats; +#endif + + if( m_leaderboard.m_totalEntryCount == 0 || m_newEntriesCount == 0 ) + { + //LeaderboardManager::Instance()->SetStatsRetrieved(false); + return false; + } + + m_leaderboard.m_numColumns = m_stats.m_queries[0].m_statsSize; + + for( unsigned int entryIndex=0 ; entryIndex < m_newEntriesCount; ++entryIndex ) + { + m_leaderboard.m_entries.push_back(LeaderboardEntry()); + CopyLeaderboardEntry(&(m_stats.m_queries[entryIndex]), entryIndex, isDistanceLeaderboard); + } + + m_newEntryIndex = 0; + + // Clear these values so that we know whether or not they are set in the next block + m_newTop = -1; + m_newSel = -1; + + // If the filter mode is "My Score" then centre the list around the entries and select the player's score + if( m_currentFilter == LeaderboardManager::eFM_MyScore) + { + //Centre the leaderboard list on the entries + m_newTop = GetEntryStartIndex(); + + //Select the player entry + for( unsigned int i = GetEntryStartIndex(); i< GetEntryStartIndex() + m_leaderboard.m_entries.size(); ++i ) + { + if( m_leaderboard.m_entries[i - GetEntryStartIndex()].m_bPlayer ) + { + m_newSel = i; // this might be off the screen! + // and reposition the top one + if(m_newSel-m_newTop>9) + { + m_newTop=m_newSel-9; + } + break; + } + } + } + + // If not set, default to start index + if (m_newSel < 0) m_newTop = m_newSel = GetEntryStartIndex(); + } + // Additional read + else + { + if(m_newEntryIndex < GetEntryStartIndex() && m_newEntryIndex == 1) + { + // If we're at the top the new entries count is incorrect, so amend + m_newEntriesCount = GetEntryStartIndex(); + } + + bool deleteFront = false; + bool deleteBack = false; + + bool trim = m_leaderboard.m_entries.size() + m_newEntriesCount >= NUM_ENTRIES; + + unsigned int insertPosition = 0; + + // If the first new entry is at a smaller index than the current first entry + if(m_newEntryIndex < GetEntryStartIndex()) + { + insertPosition = 0; + if (trim) deleteBack = true; + } + else + { + insertPosition = m_leaderboard.m_entries.size(); + if (trim) deleteFront = true; + } + + m_newEntryIndex = insertPosition; + + // Copy results to entries list + for( unsigned int i=0 ; i < m_newEntriesCount ; ++i ) + { + m_leaderboard.m_entries.insert(m_leaderboard.m_entries.begin() + insertPosition, LeaderboardEntry()); + CopyLeaderboardEntry(&(m_stats.m_queries[i]), insertPosition, isDistanceLeaderboard); + + insertPosition++; + } + + if (deleteFront) + { + // Delete front x entries + m_leaderboard.m_entries.erase(m_leaderboard.m_entries.begin(), m_leaderboard.m_entries.begin() + READ_SIZE); + m_newEntryIndex -= m_newReadSize; + } + else if (deleteBack) + { + // Delete back x entries + m_leaderboard.m_entries.erase(m_leaderboard.m_entries.end() - READ_SIZE, m_leaderboard.m_entries.end()); + } + } + + return true; +} + +void UIScene_LeaderboardsMenu::CopyLeaderboardEntry(LeaderboardManager::ReadScore *statsRow, int leaderboardEntryIndex, bool isDistanceLeaderboard) +{ + LeaderboardEntry* leaderboardEntry = &(m_leaderboard.m_entries[leaderboardEntryIndex]); + + ZeroMemory(leaderboardEntry, sizeof(LeaderboardEntry)); + leaderboardEntry->m_xuid = statsRow->m_uid; + + // Copy the rank + leaderboardEntry->m_rank = statsRow->m_rank; + DWORD displayRank = leaderboardEntry->m_rank; + if(displayRank > 9999999) displayRank = 9999999; + swprintf(leaderboardEntry->m_wcRank, 12, L"%u", displayRank); + + leaderboardEntry->m_idsErrorMessage = statsRow->m_idsErrorMessage; + + // Build a row ID + if (m_currentFilter == LeaderboardManager::eFM_Friends) + { + // If friends don't ID rows by rank + leaderboardEntry->m_row = leaderboardEntryIndex; + } + else + { + leaderboardEntry->m_row = statsRow->m_rank - 1; + if (leaderboardEntryIndex > 0) { + // Check this row ID (/rank) against the last one, it might be the same + // (this happens on PS3 when players have the same score, i.e. if they share 76th position there'll be two rank 76 + // and the following entry will be rank 78) + LeaderboardEntry* prevEntry = &(m_leaderboard.m_entries[leaderboardEntryIndex - 1]); + if (leaderboardEntry->m_row <= prevEntry->m_row) + { + leaderboardEntry->m_row = prevEntry->m_row + 1; + } + } + } + +#ifdef __PS3__ + // m_name can be unicode characters somehow for Japan - should use m_onlineID + wstring wstr=convStringToWstring(statsRow->m_uid.getOnlineID()); + swprintf(leaderboardEntry->m_gamerTag, XUSER_NAME_SIZE, L"%ls",wstr.c_str()); +#else + memcpy(leaderboardEntry->m_gamerTag, statsRow->m_name.data(), statsRow->m_name.size() * sizeof(wchar_t)); +#endif + + // Copy the other columns + for( unsigned int i=0 ; im_statsSize ; i++ ) + { + leaderboardEntry->m_columns[i] = statsRow->m_statsData[i]; + ZeroMemory(leaderboardEntry->m_wcColumns[i],12*sizeof(WCHAR)); + if( !isDistanceLeaderboard ) + { + DWORD displayValue = leaderboardEntry->m_columns[i]; + if(displayValue > 99999) displayValue = 99999; + swprintf(leaderboardEntry->m_wcColumns[i], 12, L"%u",displayValue); +#ifdef _DEBUG + //app.DebugPrintf("Value - %d\n",leaderboardEntry->m_columns[i]); +#endif + } + else + { + // check how many digits we have + int iDigitC=0; + unsigned int uiVal=leaderboardEntry->m_columns[i]; +// uiVal=0xFFFFFFFF; +// leaderboardEntry->m_columns[i-1]=uiVal; + + while(uiVal!=0) + { + uiVal/=10; + iDigitC++; + } + +#ifdef _DEBUG + //app.DebugPrintf("Value - %d\n",leaderboardEntry->m_columns[i]); +#endif + if(iDigitC<4) + { + // m + swprintf(leaderboardEntry->m_wcColumns[i], 12, L"%um", leaderboardEntry->m_columns[i]); +#ifdef _DEBUG + //app.DebugPrintf("Display - %um\n", leaderboardEntry->m_columns[i]); +#endif + } + else if(iDigitC<8) + { + // km with a .X + swprintf(leaderboardEntry->m_wcColumns[i], 12, L"%.1fkm", ((float)leaderboardEntry->m_columns[i])/1000.f); +#ifdef _DEBUG + //app.DebugPrintf("Display - %.1fkm\n", ((float)leaderboardEntry->m_columns[i])/1000.f); +#endif + } + else + { + // bigger than that, so no decimal point + swprintf(leaderboardEntry->m_wcColumns[i], 12, L"%.0fkm", ((float)leaderboardEntry->m_columns[i])/1000.f); +#ifdef _DEBUG + //app.DebugPrintf("Display - %.0fkm\n", ((float)leaderboardEntry->m_columns[i])/1000.f); +#endif + } + } + } + +#ifdef _DURANGO + //Is the player + PlayerUID myXuid; + ProfileManager.GetXUID(ProfileManager.GetPrimaryPad(),&myXuid,true); + if( statsRow->m_uid == myXuid ) + { + leaderboardEntry->m_bPlayer = true; + leaderboardEntry->m_bOnline = false; + leaderboardEntry->m_bFriend = false; + leaderboardEntry->m_bRequestedFriend = false; + } + else + { + leaderboardEntry->m_bPlayer = false; + leaderboardEntry->m_bOnline = false; + leaderboardEntry->m_bFriend = false; + leaderboardEntry->m_bRequestedFriend = false; + +#ifdef _XBOX + //Check for friend status + for( unsigned int friendIndex=0 ; friendIndexm_uid ) + { + if( ( m_friends[friendIndex].dwFriendState & ( XONLINE_FRIENDSTATE_FLAG_SENTREQUEST | XONLINE_FRIENDSTATE_FLAG_RECEIVEDREQUEST ) ) == 0 ) + { + //Is friend, might be online + leaderboardEntry->m_bFriend = true; + leaderboardEntry->m_bOnline = ( m_friends[friendIndex].dwFriendState & XONLINE_FRIENDSTATE_FLAG_ONLINE ); + leaderboardEntry->m_bRequestedFriend = false; + } + else + { + //Friend request sent but not accepted yet + leaderboardEntry->m_bOnline = false; + leaderboardEntry->m_bFriend = false; + leaderboardEntry->m_bRequestedFriend = true; + } + + break; + } + } +#endif + } +#endif +} + +void UIScene_LeaderboardsMenu::PopulateLeaderboard(LeaderboardManager::eStatsReturn ret) +{ + int iValidSlots=SetLeaderboardTitleIcons(); + if( ret == LeaderboardManager::eStatsReturn_Success && m_leaderboard.m_totalEntryCount > 0 ) + { + m_listEntries.setupTitles( app.GetString( IDS_LEADERBOARD_RANK ), app.GetString( IDS_LEADERBOARD_GAMERTAG ) ); + + //Update entries display + wchar_t entriesBuffer[40]; + if(app.DebugSettingsOn() && (app.GetGameSettingsDebugMask()&(1L< 0) + { + m_listEntries.addDataSet( + isLast, + m_leaderboard.m_entries[i].m_row, + m_leaderboard.m_entries[i].m_rank, + m_leaderboard.m_entries[i].m_gamerTag, + + true, // 4J-JEV: Has error message to display. + + app.GetString(idsErrorMessage), + L"", L"", L"", L"", L"", L"" + ); + } + else + { + m_listEntries.addDataSet( + isLast, + m_leaderboard.m_entries[i].m_row, + m_leaderboard.m_entries[i].m_rank, + m_leaderboard.m_entries[i].m_gamerTag, + + // 4J-TomK | The bDisplayMessage Flag defines if Leaderboard Data should be + // displayed (false) or if a specific message (true - when data is private for example) + // should be displayed. The message itself should be passed on in col0! + false, + + m_leaderboard.m_entries[i].m_wcColumns[0], + m_leaderboard.m_entries[i].m_wcColumns[1], + m_leaderboard.m_entries[i].m_wcColumns[2], + m_leaderboard.m_entries[i].m_wcColumns[3], + m_leaderboard.m_entries[i].m_wcColumns[4], + m_leaderboard.m_entries[i].m_wcColumns[5], + m_leaderboard.m_entries[i].m_wcColumns[6] + ); + } + } + } + else + { + m_listEntries.setupTitles( L"", L"" ); + + //Update entries display (to zero) + wchar_t entriesBuffer[40]; + swprintf(entriesBuffer, 40, L"%ls0", app.GetString(IDS_LEADERBOARD_ENTRIES)); + m_labelEntries.setLabel(entriesBuffer); + + //Show the no results message +#if !(defined(_XBOX) || defined(_WINDOWS64)) // 4J Stu - Temp to get the win build running, but so we check this for other platforms + if (ret == LeaderboardManager::eStatsReturn_NetworkError) + m_labelInfo.setLabel(app.GetString(IDS_ERROR_NETWORK)); + else +#endif + m_labelInfo.setLabel(app.GetString(IDS_LEADERBOARD_NORESULTS)); + m_labelInfo.setVisible(true); + } + m_bPopulatedOnce = true; +} + +void UIScene_LeaderboardsMenu::SetLeaderboardHeader() +{ + m_labelLeaderboard.setLabel(app.GetString(LEADERBOARD_DESCRIPTORS[m_currentLeaderboard][m_currentDifficulty].m_title)); +} + +int UIScene_LeaderboardsMenu::SetLeaderboardTitleIcons() +{ + int iValidIcons=0; + + for(int i=0;i<7;i++) + { + if(TitleIcons[m_currentLeaderboard][i]==0) + { + //m_pHTitleIconSlots[i]->SetShow(FALSE); + } + else + { + iValidIcons++; + m_listEntries.setColumnIcon(i,TitleIcons[m_currentLeaderboard][i]); + } + } + + return iValidIcons; +} + +void UIScene_LeaderboardsMenu::customDraw(IggyCustomDrawCallbackRegion *region) +{ + int slotId = -1; + swscanf((wchar_t*)region->name,L"slot_%d",&slotId); + if (slotId == -1) + { + //app.DebugPrintf("This is not the control we are looking for\n"); + } + else + { + shared_ptr item = shared_ptr( new ItemInstance(TitleIcons[m_currentLeaderboard][slotId], 1, 0) ); + customDrawSlotControl(region,m_iPad,item,1.0f,false,false); + } +} + +void UIScene_LeaderboardsMenu::handleSelectionChanged(F64 selectedId) +{ + ui.PlayUISFX(eSFX_Focus); + m_newSel = (int)selectedId; + updateTooltips(); +} + +// Handle a request from Iggy for more data +void UIScene_LeaderboardsMenu::handleRequestMoreData(F64 startIndex, bool up) +{ + unsigned int item = (int)startIndex; + + if( m_leaderboard.m_totalEntryCount > 0 && (item+1) < GetEntryStartIndex() ) + { + if( LeaderboardManager::Instance()->isIdle() ) + { + int readIndex = (GetEntryStartIndex() + 1) - READ_SIZE; + if( readIndex <= 0 ) + readIndex = 1; + assert( readIndex >= 1 && readIndex <= (int)m_leaderboard.m_totalEntryCount ); + ReadStats(readIndex); + } + } + else if( m_leaderboard.m_totalEntryCount > 0 && (item+1) >= (GetEntryStartIndex() + m_leaderboard.m_entries.size()) ) + { + if( LeaderboardManager::Instance()->isIdle() ) + { + int readIndex = (GetEntryStartIndex() + 1) + m_leaderboard.m_entries.size(); + assert( readIndex >= 1 && readIndex <= (int)m_leaderboard.m_totalEntryCount ); + ReadStats(readIndex); + } + } +} + +void UIScene_LeaderboardsMenu::handleTimerComplete(int id) +{ +#if ( defined __PS3__ || defined __ORBIS__ || defined __PSVITA__) + switch(id) + { + case PLAYER_ONLINE_TIMER_ID: +#ifndef _WINDOWS64 + if(ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad())==false) + { + // check the player hasn't gone offline + // If they have, bring up the PSN warning and exit from the leaderboards + unsigned int uiIDA[1]; + uiIDA[0]=IDS_OK; + C4JStorage::EMessageResult result = ui.RequestErrorMessage( IDS_CONNECTION_LOST, g_NetworkManager.CorrectErrorIDS(IDS_CONNECTION_LOST_LIVE_NO_EXIT), uiIDA,1,ProfileManager.GetPrimaryPad(),UIScene_LeaderboardsMenu::ExitLeaderboards,this); + } +#endif + break; + } +#endif +} + +int UIScene_LeaderboardsMenu::ExitLeaderboards(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + UIScene_LeaderboardsMenu* pClass = (UIScene_LeaderboardsMenu*)pParam; + + pClass->navigateBack(); + + return 0; +} + +// Get entry start size, if no entries returns 0 +int UIScene_LeaderboardsMenu::GetEntryStartIndex() +{ + return m_leaderboard.m_entries.size() == 0 ? 0 : m_leaderboard.m_entries[0].m_row; +} diff --git a/Minecraft.Client/Common/UI/UIScene_LeaderboardsMenu.h b/Minecraft.Client/Common/UI/UIScene_LeaderboardsMenu.h new file mode 100644 index 00000000..bcd4fe87 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_LeaderboardsMenu.h @@ -0,0 +1,147 @@ +#pragma once + +#include "UIScene.h" +// #include "..\Leaderboards\LeaderboardManager.h" +#include "..\Leaderboards\LeaderboardInterface.h" + +class UIScene_LeaderboardsMenu : public UIScene, public LeaderboardReadListener +{ +private: + // 4J Stu - Because the kills leaderboard doesn't a peaceful entry there are some special + // handling to make it skip that. We have re-arranged the order of the leaderboards so + // I am making this in case we do it again. + // 4J Stu - Made it a member of the class, rather than a #define + static const int LEADERBOARD_KILLS_POSITION = 3; + + static const int NUM_LEADERBOARDS = 4;//6; //Number of leaderboards + static const int NUM_ENTRIES = 101; //Cache up to this many entries + static const int READ_SIZE = 15; //Read this many entries at a time + + struct LeaderboardDescriptor { + unsigned int m_columnCount; + bool m_isDistanceLeaderboard; + unsigned int m_title; + + LeaderboardDescriptor(unsigned int columnCount, bool isDistanceLeaderboard, unsigned int title) + { + m_columnCount = columnCount; + m_isDistanceLeaderboard = isDistanceLeaderboard; + m_title = title; + } + }; + + static const LeaderboardDescriptor LEADERBOARD_DESCRIPTORS[NUM_LEADERBOARDS][4]; + static const int TitleIcons[NUM_LEADERBOARDS][7]; + + struct LeaderboardEntry { + PlayerUID m_xuid; + unsigned int m_row; // Row identifier for passing to Iggy as a unique identifier + DWORD m_rank; + WCHAR m_wcRank[12]; + WCHAR m_gamerTag[XUSER_NAME_SIZE+1]; + //int m_locale; + unsigned int m_columns[7]; + WCHAR m_wcColumns[7][12]; + bool m_bPlayer; //Is the player + bool m_bOnline; //Is online + bool m_bFriend; //Is friend + bool m_bRequestedFriend; //Friend request sent but not answered + int m_idsErrorMessage; // 4J-JEV: Non-zero if this entry has an error message instead of results. + }; + + struct Leaderboard { + DWORD m_totalEntryCount; //Either total number of entries in leaderboard, or total number of results for a friends query + vector m_entries; + DWORD m_numColumns; + }; + + Leaderboard m_leaderboard; //All leaderboard data for the currently selected filter + + unsigned int m_currentLeaderboard; //The current leaderboard selected for view + LeaderboardManager::EFilterMode m_currentFilter; //The current filter selected + unsigned int m_currentDifficulty; //The current difficulty selected + + unsigned int m_newEntryIndex; //Index of the first entry being read + unsigned int m_newReadSize; //Number of entries in the current read operation + + unsigned int m_newEntriesCount; // Number of new entries in this update + + int m_newTop; //Index of the element that should be at the top of the list + int m_newSel; //Index of the element that should be selected in the list + + bool m_isProcessingStatsRead; + bool m_bPopulatedOnce; + bool m_bReady; + + LeaderboardInterface m_interface; + + UIControl_LeaderboardList m_listEntries; + UIControl_Label m_labelFilter, m_labelLeaderboard, m_labelEntries, m_labelInfo; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_listEntries, "Gamers") + + UI_MAP_ELEMENT( m_labelFilter, "Filter") + UI_MAP_ELEMENT( m_labelLeaderboard, "Leaderboard") + UI_MAP_ELEMENT( m_labelEntries, "Entries") + UI_MAP_ELEMENT( m_labelInfo, "Info") + UI_END_MAP_ELEMENTS_AND_NAMES() + + static int ExitLeaderboards(void *pParam,int iPad,C4JStorage::EMessageResult result); + +public: + UIScene_LeaderboardsMenu(int iPad, void *initData, UILayer *parentLayer); + ~UIScene_LeaderboardsMenu(); + + virtual void updateTooltips(); + virtual void updateComponents(); + + virtual EUIScene getSceneType() { return eUIScene_LeaderboardsMenu;} + + // Returns true if this scene has focus for the pad passed in + virtual bool hasFocus(int iPad) { return bHasFocus; } + virtual void handleTimerComplete(int id); + +private: + int GetEntryStartIndex(); + +protected: + virtual wstring getMoviePath(); + +public: + virtual void tick(); + virtual void handleReload(); + + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + +private: + //Start a read request with the current parameters + void ReadStats(int startIndex); + + //Copy the stats from the raw m_stats structure into the m_leaderboards structure + int m_numStats; + LeaderboardManager::ViewOut m_stats; + bool RetrieveStats(); + + // Copy a leaderboard entry from the stats row + void CopyLeaderboardEntry(LeaderboardManager::ReadScore *statsRow, int leaderboardEntryIndex, bool isDistanceLeaderboard); + + //Populate the XUI leaderboard with the contents of m_leaderboards + void PopulateLeaderboard(LeaderboardManager::eStatsReturn ret); + + //Set the header text of the leaderboard + void SetLeaderboardHeader(); + + // Set the title icons + int SetLeaderboardTitleIcons(); + + //Callback function called when stats read completes, userdata contains pointer to instance of CScene_Leaderboards + virtual bool OnStatsReadComplete(LeaderboardManager::eStatsReturn ret, int numResults, LeaderboardManager::ViewOut results); + + virtual void customDraw(IggyCustomDrawCallbackRegion *region); + + virtual void handleSelectionChanged(F64 selectedId); + virtual void handleRequestMoreData(F64 startIndex, bool up); + + bool m_bIgnoreInput; +}; diff --git a/Minecraft.Client/Common/UI/UIScene_LoadMenu.cpp b/Minecraft.Client/Common/UI/UIScene_LoadMenu.cpp new file mode 100644 index 00000000..b9e6c5cc --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_LoadMenu.cpp @@ -0,0 +1,1831 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_LoadMenu.h" +#include "..\..\Minecraft.h" +#include "..\..\TexturePackRepository.h" +#include "..\..\Options.h" +#include "..\..\MinecraftServer.h" +#include "..\..\..\Minecraft.World\LevelSettings.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) +#include "Common\Network\Sony\SonyHttp.h" +#endif +#include "..\..\DLCTexturePack.h" +#if defined(__ORBIS__) || defined(__PSVITA__) +#include +#endif + +#define GAME_CREATE_ONLINE_TIMER_ID 0 +#define GAME_CREATE_ONLINE_TIMER_TIME 100 +// 4J-PB - Only Xbox will not have trial DLC patched into the game +#ifdef _XBOX +#define CHECKFORAVAILABLETEXTUREPACKS_TIMER_ID 1 +#define CHECKFORAVAILABLETEXTUREPACKS_TIMER_TIME 50 +#endif + +int UIScene_LoadMenu::m_iDifficultyTitleSettingA[4]= +{ + IDS_DIFFICULTY_TITLE_PEACEFUL, + IDS_DIFFICULTY_TITLE_EASY, + IDS_DIFFICULTY_TITLE_NORMAL, + IDS_DIFFICULTY_TITLE_HARD +}; + +int UIScene_LoadMenu::LoadSaveDataThumbnailReturned(LPVOID lpParam,PBYTE pbThumbnail,DWORD dwThumbnailBytes) +{ + UIScene_LoadMenu *pClass= (UIScene_LoadMenu *)ui.GetSceneFromCallbackId((size_t)lpParam); + + if(pClass) + { + app.DebugPrintf("Received data for a thumbnail\n"); + + if(pbThumbnail && dwThumbnailBytes) + { + pClass->registerSubstitutionTexture(pClass->m_thumbnailName,pbThumbnail,dwThumbnailBytes); + + pClass->m_pbThumbnailData = pbThumbnail; + pClass->m_uiThumbnailSize = dwThumbnailBytes; + pClass->m_bSaveThumbnailReady = true; + } + else + { + app.DebugPrintf("Thumbnail data is NULL, or has size 0\n"); + pClass->m_bThumbnailGetFailed = true; + } + pClass->m_bRetrievingSaveThumbnail = false; + } + + return 0; +} + +UIScene_LoadMenu::UIScene_LoadMenu(int iPad, void *initData, UILayer *parentLayer) : IUIScene_StartGame(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + LoadMenuInitData *params = (LoadMenuInitData *)initData; + + //m_labelGameName.init(app.GetString(IDS_WORLD_NAME)); + m_labelSeed.init(L""); + m_labelCreatedMode.init(app.GetString(IDS_CREATED_IN_SURVIVAL)); + + m_buttonGamemode.init(app.GetString(IDS_GAMEMODE_SURVIVAL),eControl_GameMode); + m_buttonMoreOptions.init(app.GetString(IDS_MORE_OPTIONS),eControl_MoreOptions); + m_buttonLoadWorld.init(app.GetString(IDS_LOAD),eControl_LoadWorld); + m_texturePackList.init(app.GetString(IDS_DLC_MENU_TEXTUREPACKS), eControl_TexturePackList); + + m_labelTexturePackName.init(L""); + m_labelTexturePackDescription.init(L""); + + m_CurrentDifficulty=app.GetGameSettings(m_iPad,eGameSetting_Difficulty); + WCHAR TempString[256]; + swprintf( (WCHAR *)TempString, 256, L"%ls: %ls", app.GetString( IDS_SLIDER_DIFFICULTY ),app.GetString(m_iDifficultyTitleSettingA[app.GetGameSettings(m_iPad,eGameSetting_Difficulty)])); + m_sliderDifficulty.init(TempString,eControl_Difficulty,0,3,app.GetGameSettings(m_iPad,eGameSetting_Difficulty)); + + m_MoreOptionsParams.bGenerateOptions=FALSE; + m_MoreOptionsParams.bPVP = TRUE; + m_MoreOptionsParams.bTrust = TRUE; + m_MoreOptionsParams.bFireSpreads = TRUE; + m_MoreOptionsParams.bHostPrivileges = FALSE; + m_MoreOptionsParams.bTNT = TRUE; + m_MoreOptionsParams.iPad = iPad; + + m_iSaveGameInfoIndex=params->iSaveGameInfoIndex; + m_levelGen = params->levelGen; + + m_bGameModeCreative = false; + m_iGameModeId = GameType::SURVIVAL->getId(); + m_bHasBeenInCreative = false; + m_bIsSaveOwner = true; + + m_bSaveThumbnailReady = false; + m_bRetrievingSaveThumbnail = true; + m_bShowTimer = false; + m_pDLCPack = NULL; + m_bAvailableTexturePacksChecked=false; + m_bRequestQuadrantSignin = false; + m_iTexturePacksNotInstalled=0; + m_bRebuildTouchBoxes = false; + m_bThumbnailGetFailed = false; + m_seed = 0; + m_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. + bool bGameSetting_Online=(app.GetGameSettings(m_iPad,eGameSetting_Online)!=0); + m_MoreOptionsParams.bOnlineSettingChangedBySystem=false; + + // Set the text for friends of friends, and default to on + if( m_bMultiplayerAllowed) + { + m_MoreOptionsParams.bOnlineGame = bGameSetting_Online?TRUE:FALSE; + if(bGameSetting_Online) + { + m_MoreOptionsParams.bInviteOnly = (app.GetGameSettings(m_iPad,eGameSetting_InviteOnly)!=0)?TRUE:FALSE; + m_MoreOptionsParams.bAllowFriendsOfFriends = (app.GetGameSettings(m_iPad,eGameSetting_FriendsOfFriends)!=0)?TRUE:FALSE; + } + else + { + m_MoreOptionsParams.bInviteOnly = FALSE; + m_MoreOptionsParams.bAllowFriendsOfFriends = FALSE; + } + } + else + { + m_MoreOptionsParams.bOnlineGame = FALSE; + m_MoreOptionsParams.bInviteOnly = FALSE; + m_MoreOptionsParams.bAllowFriendsOfFriends = FALSE; + if(bGameSetting_Online) + { + // The profile settings say Online, but either the player is offline, or they are not allowed to play online + m_MoreOptionsParams.bOnlineSettingChangedBySystem=true; + } + } + + // 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); + + // Level gen + if(m_levelGen) + { + m_labelGameName.init(m_levelGen->getDisplayName()); + if(m_levelGen->requiresTexturePack()) + { + m_MoreOptionsParams.dwTexturePack = m_levelGen->getRequiredTexturePackId(); + + m_texturePackList.setEnabled(false); + + + // retrieve the save icon from the texture pack, if there is one + TexturePack *tp = Minecraft::GetInstance()->skins->getTexturePackById(m_MoreOptionsParams.dwTexturePack); + DWORD dwImageBytes; + PBYTE pbImageData = tp->getPackIcon(dwImageBytes); + + if(dwImageBytes > 0 && pbImageData) + { + wchar_t textureName[64]; + swprintf(textureName,64,L"loadsave"); + registerSubstitutionTexture(textureName,pbImageData,dwImageBytes); + m_bitmapIcon.setTextureName( textureName ); + } + } + // Set this level as created in creative mode, so that people can't use the themed worlds as an easy way to get achievements + m_bHasBeenInCreative = 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 + { + +#if defined(__PS3__) || defined(__ORBIS__)|| defined(_DURANGO) || defined (__PSVITA__) + // convert to utf16 + uint16_t u16Message[MAX_SAVEFILENAME_LENGTH]; + size_t srclen,dstlen; + srclen=MAX_SAVEFILENAME_LENGTH; + dstlen=MAX_SAVEFILENAME_LENGTH; +#ifdef __PS3__ + L10nResult lres= UTF8stoUTF16s((uint8_t *)params->saveDetails->UTF8SaveFilename,&srclen,u16Message,&dstlen); +#elif defined(_DURANGO) + // Already utf16 on durango + memcpy(u16Message,params->saveDetails->UTF16SaveFilename, MAX_SAVEFILENAME_LENGTH); +#else // __ORBIS__ + { + SceCesUcsContext Context; + sceCesUcsContextInit( &Context ); + uint32_t utf8Len, utf16Len; + sceCesUtf8StrToUtf16Str(&Context, (uint8_t *)params->saveDetails->UTF8SaveFilename, srclen, &utf8Len, u16Message, dstlen, &utf16Len); + } +#endif + m_thumbnailName = (wchar_t *)u16Message; + if(params->saveDetails->pbThumbnailData) + { + m_pbThumbnailData = params->saveDetails->pbThumbnailData; + m_uiThumbnailSize = params->saveDetails->dwThumbnailSize; + m_bSaveThumbnailReady = true; + } + else + { + app.DebugPrintf("Requesting the save thumbnail\n"); + // set the save to load + PSAVE_DETAILS pSaveDetails=StorageManager.ReturnSavesInfo(); +#ifdef _DURANGO + // On Durango, we have an extra flag possible with LoadSaveDataThumbnail, which if true will force the loading of this thumbnail even if the save data isn't sync'd from + // the cloud at this stage. This could mean that there could be a pretty large delay before the callback happens, in this case. + C4JStorage::ESaveGameState eLoadStatus=StorageManager.LoadSaveDataThumbnail(&pSaveDetails->SaveInfoA[(int)m_iSaveGameInfoIndex],&LoadSaveDataThumbnailReturned,(LPVOID)GetCallbackUniqueId(),true); +#else + 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 + 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 + } + + TelemetryManager->RecordMenuShown(m_iPad, eUIScene_LoadMenu, 0); + m_iTexturePacksNotInstalled=0; + + // block input if we're waiting for DLC to install, and wipe the saves list. The end of dlc mounting custom message will fill the list again + if(app.StartInstallDLCProcess(m_iPad)==true) + { + // not doing a mount, so enable input + m_bIgnoreInput=true; + } + else + { + m_bIgnoreInput = false; + + Minecraft *pMinecraft = Minecraft::GetInstance(); + int texturePacksCount = pMinecraft->skins->getTexturePackCount(); + for(unsigned int i = 0; i < texturePacksCount; ++i) + { + TexturePack *tp = pMinecraft->skins->getTexturePackByIndex(i); + + DWORD dwImageBytes; + PBYTE pbImageData = tp->getPackIcon(dwImageBytes); + + if(dwImageBytes > 0 && pbImageData) + { + wchar_t imageName[64]; + swprintf(imageName,64,L"tpack%08x",tp->getId()); + registerSubstitutionTexture(imageName, pbImageData, dwImageBytes); + m_texturePackList.addPack(i,imageName); + } + } + m_currentTexturePackIndex = pMinecraft->skins->getTexturePackIndex(m_MoreOptionsParams.dwTexturePack); + UpdateTexturePackDescription(m_currentTexturePackIndex); + m_texturePackList.selectSlot(m_currentTexturePackIndex); + + // 4J-PB - Only Xbox will not have trial DLC patched into the game +#ifdef _XBOX + // 4J-PB - there may be texture packs we don't have, so use the info from TMS for this + + // 4J-PB - Any texture packs available that we don't have installed? +#if defined(__PS3__) || defined(__ORBIS__) + if(!m_bAvailableTexturePacksChecked && app.GetCommerceProductListRetrieved()&& app.GetCommerceProductListInfoRetrieved()) +#else + if(!m_bAvailableTexturePacksChecked) +#endif + { + DLC_INFO *pDLCInfo=NULL; + + // first pass - look to see if there are any that are not in the list + bool bTexturePackAlreadyListed; + bool bNeedToGetTPD=false; + + for(unsigned int i = 0; i < app.GetDLCInfoTexturesOffersCount(); ++i) + { + bTexturePackAlreadyListed=false; +#if defined(__PS3__) || defined(__ORBIS__) + char *pchName=app.GetDLCInfoTextures(i); + pDLCInfo=app.GetDLCInfo(pchName); +#else + ULONGLONG ull=app.GetDLCInfoTexturesFullOffer(i); + pDLCInfo=app.GetDLCInfoForFullOfferID(ull); +#endif + + for(unsigned int i = 0; i < texturePacksCount; ++i) + { + TexturePack *tp = pMinecraft->skins->getTexturePackByIndex(i); + if(pDLCInfo && pDLCInfo->iConfig==tp->getDLCParentPackId()) + { + bTexturePackAlreadyListed=true; + } + } + if(bTexturePackAlreadyListed==false) + { + // some missing + bNeedToGetTPD=true; + + m_iTexturePacksNotInstalled++; + } + } + + if(bNeedToGetTPD==true) + { + // add a TMS request for them + app.DebugPrintf("+++ Adding TMSPP request for texture pack data\n"); + app.AddTMSPPFileTypeRequest(e_DLC_TexturePackData); + m_iConfigA= new int [m_iTexturePacksNotInstalled]; + m_iTexturePacksNotInstalled=0; + + for(unsigned int i = 0; i < app.GetDLCInfoTexturesOffersCount(); ++i) + { + bTexturePackAlreadyListed=false; +#if defined(__PS3__) || defined(__ORBIS__) + char *pchName=app.GetDLCInfoTextures(i); + pDLCInfo=app.GetDLCInfo(pchName); +#else + ULONGLONG ull=app.GetDLCInfoTexturesFullOffer(i); + pDLCInfo=app.GetDLCInfoForFullOfferID(ull); +#endif + + if(pDLCInfo) + { + for(unsigned int i = 0; i < texturePacksCount; ++i) + { + TexturePack *tp = pMinecraft->skins->getTexturePackByIndex(i); + if(pDLCInfo && pDLCInfo->iConfig==tp->getDLCParentPackId()) + { + bTexturePackAlreadyListed=true; + } + } + if(bTexturePackAlreadyListed==false) + { + m_iConfigA[m_iTexturePacksNotInstalled++]=pDLCInfo->iConfig; + } + } + } + } + } +#endif + } + +#ifdef _XBOX + addTimer(CHECKFORAVAILABLETEXTUREPACKS_TIMER_ID,CHECKFORAVAILABLETEXTUREPACKS_TIMER_TIME); +#endif + + if(params) delete params; + addTimer(GAME_CREATE_ONLINE_TIMER_ID,GAME_CREATE_ONLINE_TIMER_TIME); +} + +void UIScene_LoadMenu::updateTooltips() +{ + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK, -1, -1); +} + +void UIScene_LoadMenu::updateComponents() +{ + m_parentLayer->showComponent(m_iPad,eUIComponent_Panorama,true); + + if(RenderManager.IsWidescreen()) + { + m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,true); + } + else + { + m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,false); + } +} + +wstring UIScene_LoadMenu::getMoviePath() +{ + return L"LoadMenu"; +} + +UIControl* UIScene_LoadMenu::GetMainPanel() +{ + return &m_controlMainPanel; +} + +void UIScene_LoadMenu::tick() +{ + if(m_bShowTimer) + { + m_bShowTimer = false; + ui.NavigateToScene(m_iPad, eUIScene_Timer); + } + + if( m_bThumbnailGetFailed ) + { + // On Durango, this can happen if a save is still not been synchronised (user cancelled, or some error). Return back to give them a choice to pick another save. + ui.NavigateBack(m_iPad, false, eUIScene_LoadOrJoinMenu); + return; + } + + if( m_bSaveThumbnailReady ) + { + m_bSaveThumbnailReady = false; + + m_bitmapIcon.setTextureName( m_thumbnailName.c_str() ); + + // retrieve the seed value from the image metadata + bool bHostOptionsRead = false; + unsigned int uiHostOptions = 0; + + char szSeed[50]; + ZeroMemory(szSeed,50); + app.GetImageTextData(m_pbThumbnailData,m_uiThumbnailSize,(unsigned char *)&szSeed,uiHostOptions,bHostOptionsRead,m_MoreOptionsParams.dwTexturePack); + +#if defined(_XBOX_ONE) || defined(__ORBIS__) + sscanf_s(szSeed, "%I64d", &m_seed); +#endif + + // #ifdef _DEBUG + // // dump out the thumbnail + // HANDLE hThumbnail = CreateFile("GAME:\\thumbnail.png", GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_FLAG_RANDOM_ACCESS, NULL); + // DWORD dwBytes; + // WriteFile(hThumbnail,pbImageData,dwImageBytes,&dwBytes,NULL); + // XCloseHandle(hThumbnail); + // #endif + + if(szSeed[0]!=0) + { + WCHAR TempString[256]; + swprintf( (WCHAR *)TempString, 256, L"%ls: %hs", app.GetString( IDS_SEED ),szSeed); + m_labelSeed.setLabel(TempString); + } + else + { + m_labelSeed.setLabel(L""); + } + + // Setup all the text and checkboxes to match what the game was saved with on + if(bHostOptionsRead) + { + m_MoreOptionsParams.bPVP = app.GetGameHostOption(uiHostOptions,eGameHostOption_PvP)>0?TRUE:FALSE; + m_MoreOptionsParams.bTrust = app.GetGameHostOption(uiHostOptions,eGameHostOption_TrustPlayers)>0?TRUE:FALSE; + m_MoreOptionsParams.bFireSpreads = app.GetGameHostOption(uiHostOptions,eGameHostOption_FireSpreads)>0?TRUE:FALSE; + m_MoreOptionsParams.bTNT = app.GetGameHostOption(uiHostOptions,eGameHostOption_TNT)>0?TRUE:FALSE; + m_MoreOptionsParams.bHostPrivileges = app.GetGameHostOption(uiHostOptions,eGameHostOption_CheatsEnabled)>0?TRUE:FALSE; + m_MoreOptionsParams.bDisableSaving = app.GetGameHostOption(uiHostOptions,eGameHostOption_DisableSaving)>0?TRUE:FALSE; + 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 + // uiHostOptions&=~GAME_HOST_OPTION_BITMASK_BEENINCREATIVE; + // 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) + { + m_labelCreatedMode.setLabel( app.GetString(IDS_CREATED_IN_CREATIVE) ); + } + else + { + m_labelCreatedMode.setLabel( app.GetString(IDS_CREATED_IN_SURVIVAL) ); + } + + switch(app.GetGameHostOption(uiHostOptions,eGameHostOption_GameType)) + { + case 1: // Creative + m_buttonGamemode.setLabel(app.GetString(IDS_GAMEMODE_CREATIVE)); + 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)) + { + m_MoreOptionsParams.bAllowFriendsOfFriends = TRUE; + } + } + + Minecraft *pMinecraft = Minecraft::GetInstance(); + m_currentTexturePackIndex = pMinecraft->skins->getTexturePackIndex(m_MoreOptionsParams.dwTexturePack); + + UpdateTexturePackDescription(m_currentTexturePackIndex); + + m_texturePackList.selectSlot(m_currentTexturePackIndex); + + //m_labelGameName.setLabel(m_XContentData.szDisplayName); + + ui.NavigateBack(m_iPad, false, getSceneType() ); + } + + if(m_iSetTexturePackDescription >= 0 ) + { + UpdateTexturePackDescription( m_iSetTexturePackDescription ); + m_iSetTexturePackDescription = -1; + } + if(m_bShowTexturePackDescription) + { + slideLeft(); + m_texturePackDescDisplayed = true; + + m_bShowTexturePackDescription = false; + } + + if(m_bRequestQuadrantSignin) + { + m_bRequestQuadrantSignin = false; + SignInInfo info; + info.Func = &UIScene_LoadMenu::StartGame_SignInReturned; + info.lpParam = this; + info.requireOnline = m_MoreOptionsParams.bOnlineGame; + ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_QuadrantSignin,&info); + } + +#ifdef __ORBIS__ + // check the status of the PSPlus common dialog + switch (sceNpCommerceDialogUpdateStatus()) + { + case SCE_COMMON_DIALOG_STATUS_FINISHED: + { + SceNpCommerceDialogResult Result; + sceNpCommerceDialogGetResult(&Result); + sceNpCommerceDialogTerminate(); + + if(Result.authorized) + { + ProfileManager.PsPlusUpdate(ProfileManager.GetPrimaryPad(), &Result); + // they just became a PSPlus member + LoadDataComplete(this); + } + else + { + // continue offline? + UINT uiIDA[1]; + uiIDA[0]=IDS_PRO_NOTONLINE_DECLINE; + + // Give the player a warning about the texture pack missing + ui.RequestAlertMessage(IDS_PLAY_OFFLINE,IDS_NO_PLAYSTATIONPLUS, uiIDA, 1, ProfileManager.GetPrimaryPad(),&UIScene_LoadMenu::ContinueOffline,this); + } + } + break; + default: + break; + } +#endif + + UIScene::tick(); +} + +#ifdef __ORBIS__ +int UIScene_LoadMenu::ContinueOffline(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + UIScene_LoadMenu* pClass = (UIScene_LoadMenu*)pParam; + + // results switched for this dialog + if(result==C4JStorage::EMessage_ResultAccept) + { + pClass->m_MoreOptionsParams.bOnlineGame=false; + pClass->LoadDataComplete(pClass); + } + return 0; +} + +#endif + +void UIScene_LoadMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + if(m_bIgnoreInput) return; + + ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); + + switch(key) + { + case ACTION_MENU_CANCEL: + if(pressed) + { + app.SetCorruptSaveDeleted(false); + navigateBack(); + handled = true; + } + break; + case ACTION_MENU_OK: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + + // 4J-JEV: Inform user why their game must be offline. +#if defined _XBOX_ONE + if ( pressed && controlHasFocus(m_checkboxOnline.getId()) && !m_checkboxOnline.IsEnabled() ) + { + UINT uiIDA[1] = { IDS_CONFIRM_OK }; + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1, iPad); + } +#endif + + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + case ACTION_MENU_LEFT: + case ACTION_MENU_RIGHT: + case ACTION_MENU_OTHER_STICK_UP: + case ACTION_MENU_OTHER_STICK_DOWN: + sendInputToMovie(key, repeat, pressed, released); + + 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; + } + } + + handled = true; + break; + } +} + +void UIScene_LoadMenu::handlePress(F64 controlId, F64 childId) +{ + if(m_bIgnoreInput) return; + + //CD - Added for audio + ui.PlayUISFX(eSFX_Press); + + switch((int)controlId) + { + case eControl_GameMode: + switch(m_iGameModeId) + { + case 0: // Survival + m_buttonGamemode.setLabel(app.GetString(IDS_GAMEMODE_CREATIVE)); + 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_iGameModeId = GameType::SURVIVAL->getId(); + m_bGameModeCreative = false; + break; + }; + break; + case eControl_MoreOptions: + ui.NavigateToScene(m_iPad, eUIScene_LaunchMoreOptionsMenu, &m_MoreOptionsParams); + break; + case eControl_TexturePackList: + { + UpdateCurrentTexturePack((int)childId); + } + break; + case eControl_LoadWorld: + { +#ifdef _DURANGO + if(m_MoreOptionsParams.bOnlineGame) + { + m_bIgnoreInput = true; + ProfileManager.CheckMultiplayerPrivileges(m_iPad, true, &checkPrivilegeCallback, this); + } + else +#endif + { + StartSharedLaunchFlow(); + } + } + break; + }; +} + +#ifdef _DURANGO +void UIScene_LoadMenu::checkPrivilegeCallback(LPVOID lpParam, bool hasPrivilege, int iPad) +{ + UIScene_LoadMenu* pClass = (UIScene_LoadMenu*)lpParam; + + if(hasPrivilege) + { + pClass->StartSharedLaunchFlow(); + } + else + { + pClass->m_bIgnoreInput = false; + } +} +#endif + +void UIScene_LoadMenu::StartSharedLaunchFlow() +{ + Minecraft *pMinecraft=Minecraft::GetInstance(); + // Check if we need to upsell the texture pack + if(m_MoreOptionsParams.dwTexturePack!=0) + { + // texture pack hasn't been set yet, so check what it will be + TexturePack *pTexturePack = pMinecraft->skins->getTexturePackById(m_MoreOptionsParams.dwTexturePack); + + if(pTexturePack==NULL) + { +#if TO_BE_IMPLEMENTED + // They've selected a texture pack they don't have yet + // upsell + CXuiCtrl4JList::LIST_ITEM_INFO ListItem; + // get the current index of the list, and then get the data + ListItem=m_pTexturePacksList->GetData(m_currentTexturePackIndex); + + + // upsell the texture pack + // tell sentient about the upsell of the full version of the skin pack + ULONGLONG ullOfferID_Full; + app.GetDLCFullOfferIDForPackID(m_MoreOptionsParams.dwTexturePack,&ullOfferID_Full); + + TelemetryManager->RecordUpsellPresented(ProfileManager.GetPrimaryPad(), eSet_UpsellID_Texture_DLC, ullOfferID_Full & 0xFFFFFFFF); +#endif + + UINT uiIDA[2]; + + uiIDA[0]=IDS_TEXTUREPACK_FULLVERSION; + //uiIDA[1]=IDS_TEXTURE_PACK_TRIALVERSION; + uiIDA[1]=IDS_CONFIRM_CANCEL; + + // Give the player a warning about the texture pack missing + ui.RequestAlertMessage(IDS_DLC_TEXTUREPACK_NOT_PRESENT_TITLE, IDS_DLC_TEXTUREPACK_NOT_PRESENT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&TexturePackDialogReturned,this); + return; + } + } + m_bIgnoreInput = true; + + // if the profile data has been changed, then force a profile write (we save the online/invite/friends of friends settings) + // It seems we're allowed to break the 5 minute rule if it's the result of a user action + // check the checkboxes + + // Only save the online setting if the user changed it - we may change it because we're offline, but don't want that saved + if(!m_MoreOptionsParams.bOnlineSettingChangedBySystem) + { + app.SetGameSettings(m_iPad,eGameSetting_Online,m_MoreOptionsParams.bOnlineGame?1:0); + } + app.SetGameSettings(m_iPad,eGameSetting_InviteOnly,m_MoreOptionsParams.bInviteOnly?1:0); + app.SetGameSettings(m_iPad,eGameSetting_FriendsOfFriends,m_MoreOptionsParams.bAllowFriendsOfFriends?1:0); + + app.CheckGameSettingsChanged(true,m_iPad); + + // Check that we have the rights to use a texture pack we have selected. + if(m_MoreOptionsParams.dwTexturePack!=0) + { + // texture pack hasn't been set yet, so check what it will be + TexturePack *pTexturePack = pMinecraft->skins->getTexturePackById(m_MoreOptionsParams.dwTexturePack); + DLCTexturePack *pDLCTexPack=(DLCTexturePack *)pTexturePack; + m_pDLCPack=pDLCTexPack->getDLCInfoParentPack(); + + // do we have a license? + if(m_pDLCPack && !m_pDLCPack->hasPurchasedFile( DLCManager::e_DLCType_Texture, L"" )) + { + // no + + // We need to allow people to use a trial texture pack if they are offline - we only need them online if they want to buy it. + + /* + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + + if(!ProfileManager.IsSignedInLive(m_iPad)) + { + // need to be signed in to live + ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1); + m_bIgnoreInput = false; + return; + } + else */ + { + // upsell +#ifdef _XBOX + DLC_INFO *pDLCInfo = app.GetDLCInfoForTrialOfferID(m_pDLCPack->getPurchaseOfferId()); + ULONGLONG ullOfferID_Full; + + if(pDLCInfo!=NULL) + { + ullOfferID_Full=pDLCInfo->ullOfferID_Full; + } + else + { + ullOfferID_Full=pTexturePack->getDLCPack()->getPurchaseOfferId(); + } + + // tell sentient about the upsell of the full version of the texture pack + TelemetryManager->RecordUpsellPresented(m_iPad, eSet_UpsellID_Texture_DLC, ullOfferID_Full & 0xFFFFFFFF); +#endif + +#if defined(_WINDOWS64) || defined(_DURANGO) + // trial pack warning + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.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.RequestAlertMessage(IDS_WARNING_DLC_TRIALTEXTUREPACK_TITLE, IDS_USING_TRIAL_TEXUREPACK_WARNING, uiIDA, 2, m_iPad,&TrialTexturePackWarningReturned,this); +#endif + +#if defined _XBOX_ONE || defined __ORBIS__ + StorageManager.SetSaveDisabled(true); +#endif + return; + } + } + } + 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 + // Reset the background downloading, in case we changed it by attempting to download a texture pack + XBackgroundDownloadSetMode(XBACKGROUND_DOWNLOAD_MODE_AUTO); +#endif + + // Check if they have the Reset Nether flag set, and confirm they want to do this + if(m_MoreOptionsParams.bResetNether==TRUE) + { + UINT uiIDA[2]; + uiIDA[0]=IDS_DONT_RESET_NETHER; + uiIDA[1]=IDS_RESET_NETHER; + + ui.RequestAlertMessage(IDS_RESETNETHER_TITLE, IDS_RESETNETHER_TEXT, uiIDA, 2, m_iPad,&UIScene_LoadMenu::CheckResetNetherReturned,this); + } + else + { + LaunchGame(); + } +} + +void UIScene_LoadMenu::handleSliderMove(F64 sliderId, F64 currentValue) +{ + WCHAR TempString[256]; + int value = (int)currentValue; + switch((int)sliderId) + { + case eControl_Difficulty: + m_sliderDifficulty.handleSliderMove(value); + + app.SetGameSettings(m_iPad,eGameSetting_Difficulty,value); + swprintf( (WCHAR *)TempString, 256, L"%ls: %ls", app.GetString( IDS_SLIDER_DIFFICULTY ),app.GetString(m_iDifficultyTitleSettingA[value])); + m_sliderDifficulty.setLabel(TempString); + break; + } +} + +void UIScene_LoadMenu::handleTouchBoxRebuild() +{ + m_bRebuildTouchBoxes = true; +} + + +void UIScene_LoadMenu::handleTimerComplete(int id) +{ +#ifdef __PSVITA__ + // we cannot rebuild touch boxes in an iggy callback because it requires further iggy calls + if(m_bRebuildTouchBoxes) + { + GetMainPanel()->UpdateControl(); + ui.TouchBoxRebuild(this); + m_bRebuildTouchBoxes = false; + } +#endif + + switch(id) + { + case GAME_CREATE_ONLINE_TIMER_ID: + { + bool bMultiplayerAllowed = ProfileManager.IsSignedInLive( m_iPad ) && ProfileManager.AllowedToPlayMultiplayer(m_iPad); + + if(bMultiplayerAllowed != m_bMultiplayerAllowed) + { + if( bMultiplayerAllowed ) + { + bool bGameSetting_Online=(app.GetGameSettings(m_iPad,eGameSetting_Online)!=0); + m_MoreOptionsParams.bOnlineGame = bGameSetting_Online?TRUE:FALSE; + if(bGameSetting_Online) + { + m_MoreOptionsParams.bInviteOnly = (app.GetGameSettings(m_iPad,eGameSetting_InviteOnly)!=0)?TRUE:FALSE; + m_MoreOptionsParams.bAllowFriendsOfFriends = (app.GetGameSettings(m_iPad,eGameSetting_FriendsOfFriends)!=0)?TRUE:FALSE; + } + else + { + m_MoreOptionsParams.bInviteOnly = FALSE; + m_MoreOptionsParams.bAllowFriendsOfFriends = FALSE; + } + } + else + { + m_MoreOptionsParams.bOnlineGame = FALSE; + m_MoreOptionsParams.bInviteOnly = FALSE; + m_MoreOptionsParams.bAllowFriendsOfFriends = FALSE; + } + + m_checkboxOnline.SetEnable(bMultiplayerAllowed); + m_checkboxOnline.setChecked(m_MoreOptionsParams.bOnlineGame); + + m_bMultiplayerAllowed = bMultiplayerAllowed; + } + } + break; + // 4J-PB - Only Xbox will not have trial DLC patched into the game +#ifdef _XBOX + case CHECKFORAVAILABLETEXTUREPACKS_TIMER_ID: + { + +#if defined(__PS3__) || defined(__ORBIS__) + for(int i=0;ichImageURL); + + if(hasRegisteredSubstitutionTexture(textureName)==false) + { + PBYTE pbImageData; + int iImageDataBytes=0; + SonyHttp::getDataFromURL(pDLCInfo->chImageURL,(void **)&pbImageData,&iImageDataBytes); + + if(iImageDataBytes!=0) + { + // set the image + registerSubstitutionTexture(textureName,pbImageData,iImageDataBytes,true); + // add an item in + m_texturePackList.addPack(m_iConfigA[i],textureName); + m_iConfigA[i]=-1; + } + } + else + { + // already have the image, so add an item in + m_texturePackList.addPack(m_iConfigA[i],textureName); + m_iConfigA[i]=-1; + } + } + } + } + + bool bAllDone=true; + for(int i=0;iSaveInfoA[(int)m_iSaveGameInfoIndex].UTF8SaveTitle,pSaveDetails->SaveInfoA[(int)m_iSaveGameInfoIndex].UTF8SaveFilename); +#endif + C4JStorage::ESaveGameState eLoadStatus=StorageManager.LoadSaveData(&pSaveDetails->SaveInfoA[(int)m_iSaveGameInfoIndex],&LoadSaveDataReturned,this); + +#if TO_BE_IMPLEMENTED + if(eLoadStatus==C4JStorage::ELoadGame_DeviceRemoved) + { + // disable saving + StorageManager.SetSaveDisabled(true); + StorageManager.SetSaveDeviceSelected(m_iPad,false); + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + ui.RequestErrorMessage(IDS_STORAGEDEVICEPROBLEM_TITLE, IDS_FAILED_TO_LOADSAVE_TEXT, uiIDA, 1, m_iPad,&CScene_LoadGameSettings::DeviceRemovedDialogReturned,this); + + } +#endif + } + } + else + { + // ask if they're sure they want to turn this into a creative map + ui.RequestAlertMessage(IDS_TITLE_START_GAME, IDS_CONFIRM_START_CREATIVE, uiIDA, 2, m_iPad,&UIScene_LoadMenu::ConfirmLoadReturned,this); + } + } + } + else + { + ui.RequestAlertMessage(IDS_TITLE_START_GAME, IDS_CONFIRM_START_HOST_PRIVILEGES, uiIDA, 2, m_iPad,&UIScene_LoadMenu::ConfirmLoadReturned,this); + } + } + else + { + if(m_levelGen != NULL) + { + m_bIsCorrupt = false; + LoadDataComplete(this); + } + else + { + // set the save to load + PSAVE_DETAILS pSaveDetails=StorageManager.ReturnSavesInfo(); +#ifndef _DURANGO + app.DebugPrintf("Loading save %s [%s]\n",pSaveDetails->SaveInfoA[(int)m_iSaveGameInfoIndex].UTF8SaveTitle,pSaveDetails->SaveInfoA[(int)m_iSaveGameInfoIndex].UTF8SaveFilename); +#endif + C4JStorage::ESaveGameState eLoadStatus=StorageManager.LoadSaveData(&pSaveDetails->SaveInfoA[(int)m_iSaveGameInfoIndex],&LoadSaveDataReturned,this); + +#if TO_BE_IMPLEMENTED + if(eLoadStatus==C4JStorage::ELoadGame_DeviceRemoved) + { + // disable saving + StorageManager.SetSaveDisabled(true); + StorageManager.SetSaveDeviceSelected(m_iPad,false); + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + ui.RequestErrorMessage(IDS_STORAGEDEVICEPROBLEM_TITLE, IDS_FAILED_TO_LOADSAVE_TEXT, uiIDA, 1, m_iPad,&CScene_LoadGameSettings::DeviceRemovedDialogReturned,this); + } +#endif + } + } + //return 0; +} + +int UIScene_LoadMenu::CheckResetNetherReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + UIScene_LoadMenu* pClass = (UIScene_LoadMenu*)pParam; + + // results switched for this dialog + if(result==C4JStorage::EMessage_ResultDecline) + { + // continue and reset the nether + pClass->LaunchGame(); + } + else if(result==C4JStorage::EMessage_ResultAccept) + { + // turn off the reset nether and continue + pClass->m_MoreOptionsParams.bResetNether=FALSE; + pClass->LaunchGame(); + } + else + { + // else they chose cancel + pClass->m_bIgnoreInput=false; + } + return 0; +} + +int UIScene_LoadMenu::ConfirmLoadReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + UIScene_LoadMenu* pClass = (UIScene_LoadMenu*)pParam; + + if(result==C4JStorage::EMessage_ResultAccept) + { + if(pClass->m_levelGen != NULL) + { + pClass->m_bIsCorrupt = false; + pClass->LoadDataComplete(pClass); + } + else + { + // set the save to load + PSAVE_DETAILS pSaveDetails=StorageManager.ReturnSavesInfo(); +#ifndef _DURANGO + app.DebugPrintf("Loading save %s [%s]\n",pSaveDetails->SaveInfoA[(int)pClass->m_iSaveGameInfoIndex].UTF8SaveTitle,pSaveDetails->SaveInfoA[(int)pClass->m_iSaveGameInfoIndex].UTF8SaveFilename); +#endif + C4JStorage::ESaveGameState eLoadStatus=StorageManager.LoadSaveData(&pSaveDetails->SaveInfoA[(int)pClass->m_iSaveGameInfoIndex],&LoadSaveDataReturned,pClass); + +#if TO_BE_IMPLEMENTED + if(eLoadStatus==C4JStorage::ELoadGame_DeviceRemoved) + { + // disable saving + StorageManager.SetSaveDisabled(true); + StorageManager.SetSaveDeviceSelected(m_iPad,false); + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + ui.RequestErrorMessage(IDS_STORAGEDEVICEPROBLEM_TITLE, IDS_FAILED_TO_LOADSAVE_TEXT, uiIDA, 1, m_iPad,&CScene_LoadGameSettings::DeviceRemovedDialogReturned,this); + } +#endif + } + } + else + { + pClass->m_bIgnoreInput=false; + } + return 0; +} + +int UIScene_LoadMenu::LoadDataComplete(void *pParam) +{ + UIScene_LoadMenu* pClass = (UIScene_LoadMenu*)pParam; + + if(!pClass->m_bIsCorrupt) + { + int iPrimaryPad = ProfileManager.GetPrimaryPad(); + bool isSignedInLive = true; + bool isOnlineGame = pClass->m_MoreOptionsParams.bOnlineGame; + int iPadNotSignedInLive = -1; + bool isLocalMultiplayerAvailable = app.IsLocalMultiplayerAvailable(); + + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + if (ProfileManager.IsSignedIn(i) && ((i == iPrimaryPad) || isLocalMultiplayerAvailable)) + { + if (isSignedInLive && !ProfileManager.IsSignedInLive(i)) + { + // Record the first non signed in live pad + iPadNotSignedInLive = i; + } + + isSignedInLive = isSignedInLive && ProfileManager.IsSignedInLive(i); + } + } + + // If this is an online game but not all players are signed in to Live, stop! + if (isOnlineGame && !isSignedInLive) + { +#ifdef __ORBIS__ + assert(iPadNotSignedInLive != -1); + // Check if PSN is unavailable because of age restriction + int npAvailability = ProfileManager.getNPAvailability(iPadNotSignedInLive); + if (npAvailability == SCE_NP_ERROR_AGE_RESTRICTION) + { + pClass->m_bIgnoreInput = false; + // 4J Stu - This is a bit messy and is due to the library incorrectly returning false for IsSignedInLive if the npAvailability isn't SCE_OK + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPadNotSignedInLive); + } + else + { + pClass->m_bIgnoreInput=true; + UINT uiIDA[2]; + uiIDA[0] = IDS_PRO_NOTONLINE_ACCEPT; + uiIDA[1] = IDS_CANCEL; + 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.RequestAlertMessage( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA,1,ProfileManager.GetPrimaryPad()); + return 0; +#endif + } + + // Check if user-created content is allowed, as we cannot play multiplayer if it's not + bool noUGC = false; + BOOL pccAllowed = TRUE; + BOOL pccFriendsAllowed = TRUE; + bool bContentRestricted = false; + ProfileManager.AllowedPlayerCreatedContent(ProfileManager.GetPrimaryPad(),false,&pccAllowed,&pccFriendsAllowed); +#if defined(__PS3__) || defined(__PSVITA__) + if(isOnlineGame) + { + ProfileManager.GetChatAndContentRestrictions(ProfileManager.GetPrimaryPad(),false,NULL,&bContentRestricted,NULL); + } +#endif + +#ifdef __ORBIS__ + bool bPlayStationPlus=true; + int iPadWithNoPlaystationPlus=0; + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + if(ProfileManager.IsSignedIn(i) && ((i == iPrimaryPad) || isLocalMultiplayerAvailable)) + { + if(!ProfileManager.HasPlayStationPlus(i)) + { + bPlayStationPlus=false; + iPadWithNoPlaystationPlus=i; + break; + } + } + } +#endif + noUGC = !pccAllowed && !pccFriendsAllowed; + + if(!isOnlineGame || !isLocalMultiplayerAvailable) + { + if(isOnlineGame && noUGC ) + { + pClass->setVisible( true ); + + ui.RequestUGCMessageBox(); + + pClass->m_bIgnoreInput=false; + } + else if(isOnlineGame && bContentRestricted ) + { + pClass->setVisible( true ); + + ui.RequestContentRestrictedMessageBox(); + pClass->m_bIgnoreInput=false; + } +#ifdef __ORBIS__ + else if(isOnlineGame && (bPlayStationPlus==false)) + { + pClass->setVisible( true ); + pClass->m_bIgnoreInput=false; + + 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(); + + SceNpCommerceDialogParam param; + sceNpCommerceDialogParamInitialize(¶m); + param.mode=SCE_NP_COMMERCE_DIALOG_MODE_PLUS; + param.features = SCE_NP_PLUS_FEATURE_REALTIME_MULTIPLAY; + param.userId = ProfileManager.getUserID(iPadWithNoPlaystationPlus); + + iResult=sceNpCommerceDialogOpen(¶m); + +// UINT uiIDA[2]; +// uiIDA[0]=IDS_PLAY_OFFLINE; +// uiIDA[1]=IDS_PLAYSTATIONPLUS_SIGNUP; +// ui.RequestMessageBox( IDS_FAILED_TO_CREATE_GAME_TITLE, IDS_NO_PLAYSTATIONPLUS, uiIDA,2,ProfileManager.GetPrimaryPad(),&UIScene_LoadMenu::PSPlusReturned,pClass, app.GetStringTable(),NULL,0,false); + } + +#endif + else + { + +#if defined(__ORBIS__) || defined(__PSVITA__) + if(isOnlineGame) + { + bool chatRestricted = false; + ProfileManager.GetChatAndContentRestrictions(ProfileManager.GetPrimaryPad(),false,&chatRestricted,NULL,NULL); + if(chatRestricted) + { + ProfileManager.DisplaySystemMessage( SCE_MSG_DIALOG_SYSMSG_TYPE_TRC_PSN_CHAT_RESTRICTION, ProfileManager.GetPrimaryPad() ); + } + } +#endif + DWORD dwLocalUsersMask = CGameNetworkManager::GetLocalPlayerMask(ProfileManager.GetPrimaryPad()); + + // No guest problems so we don't need to force a sign-in of players here + StartGameFromSave(pClass, dwLocalUsersMask); + } + } + else + { + // 4J-PB not sure why we aren't checking the content restriction for the main player here when multiple controllers are connected - adding now + if(isOnlineGame && noUGC ) + { + pClass->setVisible( true ); + ui.RequestUGCMessageBox(); + pClass->m_bIgnoreInput=false; + } + else if(isOnlineGame && bContentRestricted ) + { + pClass->setVisible( true ); + ui.RequestContentRestrictedMessageBox(); + pClass->m_bIgnoreInput=false; + } +#ifdef __ORBIS__ + else if(bPlayStationPlus==false) + { + pClass->setVisible( true ); + pClass->m_bIgnoreInput=false; + + 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(); + + SceNpCommerceDialogParam param; + sceNpCommerceDialogParamInitialize(¶m); + param.mode=SCE_NP_COMMERCE_DIALOG_MODE_PLUS; + param.features = SCE_NP_PLUS_FEATURE_REALTIME_MULTIPLAY; + param.userId = ProfileManager.getUserID(iPadWithNoPlaystationPlus); + + iResult=sceNpCommerceDialogOpen(¶m); + +// UINT uiIDA[2]; +// uiIDA[0]=IDS_PLAY_OFFLINE; +// uiIDA[1]=IDS_PLAYSTATIONPLUS_SIGNUP; +// ui.RequestMessageBox( IDS_FAILED_TO_CREATE_GAME_TITLE, IDS_NO_PLAYSTATIONPLUS, uiIDA,2,ProfileManager.GetPrimaryPad(),&UIScene_LoadMenu::PSPlusReturned,pClass, app.GetStringTable(),NULL,0,false); + } +#endif + else + { + pClass->m_bRequestQuadrantSignin = true; + } + } + } + else + { + // the save is corrupt! + pClass->m_bIgnoreInput=false; + + // give the option to delete the save + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + ui.RequestAlertMessage(IDS_CORRUPT_OR_DAMAGED_SAVE_TITLE, IDS_CORRUPT_OR_DAMAGED_SAVE_TEXT, uiIDA, 2, pClass->m_iPad,&UIScene_LoadMenu::DeleteSaveDialogReturned,pClass); + + } + + return 0; +} + +int UIScene_LoadMenu::LoadSaveDataReturned(void *pParam,bool bIsCorrupt, bool bIsOwner) +{ + 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); + } + else + { + // messagebox + pClass->m_bIgnoreInput=false; + +#if defined(__PS3__) || defined(__ORBIS__) || defined (__PSVITA__) + // show the message that trophies are disabled + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestErrorMessage(IDS_SAVEDATA_COPIED_TITLE, IDS_SAVEDATA_COPIED_TEXT, uiIDA, 1, + pClass->m_iPad,&UIScene_LoadMenu::TrophyDialogReturned,pClass); + app.SetGameHostOption(eGameHostOption_WasntSaveOwner, true); +#endif + } + + + return 0; +} + +int UIScene_LoadMenu::TrophyDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + UIScene_LoadMenu* pClass = (UIScene_LoadMenu*)pParam; + return LoadDataComplete(pClass); +} + +int UIScene_LoadMenu::DeleteSaveDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + UIScene_LoadMenu* pClass = (UIScene_LoadMenu*)pParam; + + // results switched for this dialog + if(result==C4JStorage::EMessage_ResultDecline) + { + PSAVE_DETAILS pSaveDetails=StorageManager.ReturnSavesInfo(); + StorageManager.DeleteSaveData(&pSaveDetails->SaveInfoA[(int)pClass->m_iSaveGameInfoIndex],UIScene_LoadMenu::DeleteSaveDataReturned,pClass); + } + else + { + pClass->m_bIgnoreInput=false; + } + return 0; +} + +int UIScene_LoadMenu::DeleteSaveDataReturned(void *pParam,bool bSuccess) +{ + UIScene_LoadMenu* pClass = (UIScene_LoadMenu*)pParam; + + app.SetCorruptSaveDeleted(true); + pClass->navigateBack(); + + return 0; +} + +// 4J Stu - Shared functionality that is the same whether we needed a quadrant sign-in or not +void UIScene_LoadMenu::StartGameFromSave(UIScene_LoadMenu* pClass, DWORD dwLocalUsersMask) +{ + 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__ + if(CGameNetworkManager::usingAdhocMode()) + { + if(SQRNetworkManager_AdHoc_Vita::GetAdhocStatus())// && pClass->m_MoreOptionsParams.bOnlineGame) + isClientSide = true; + } +#endif // __PSVITA__ + + bool isPrivate = (app.GetGameSettings(pClass->m_iPad,eGameSetting_InviteOnly)>0)?true:false; + + PSAVE_DETAILS pSaveDetails=StorageManager.ReturnSavesInfo(); + + NetworkGameInitData *param = new NetworkGameInitData(); + param->seed = pClass->m_seed; + param->saveData = NULL; + param->levelGen = pClass->m_levelGen; + param->texturePackId = pClass->m_MoreOptionsParams.dwTexturePack; + + Minecraft *pMinecraft = Minecraft::GetInstance(); + pMinecraft->skins->selectTexturePackById(pClass->m_MoreOptionsParams.dwTexturePack); + //pMinecraft->skins->updateUI(); + + app.SetGameHostOption(eGameHostOption_Difficulty,Minecraft::GetInstance()->options->difficulty); + app.SetGameHostOption(eGameHostOption_FriendsOfFriends,app.GetGameSettings(pClass->m_iPad,eGameSetting_FriendsOfFriends)); + app.SetGameHostOption(eGameHostOption_Gamertags,app.GetGameSettings(pClass->m_iPad,eGameSetting_GamertagsVisible)); + + app.SetGameHostOption(eGameHostOption_BedrockFog,app.GetGameSettings(pClass->m_iPad,eGameSetting_BedrockFog)?1:0); + + app.SetGameHostOption(eGameHostOption_PvP,pClass->m_MoreOptionsParams.bPVP); + app.SetGameHostOption(eGameHostOption_TrustPlayers,pClass->m_MoreOptionsParams.bTrust ); + app.SetGameHostOption(eGameHostOption_FireSpreads,pClass->m_MoreOptionsParams.bFireSpreads ); + app.SetGameHostOption(eGameHostOption_TNT,pClass->m_MoreOptionsParams.bTNT ); + app.SetGameHostOption(eGameHostOption_HostCanFly,pClass->m_MoreOptionsParams.bHostPrivileges); + app.SetGameHostOption(eGameHostOption_HostCanChangeHunger,pClass->m_MoreOptionsParams.bHostPrivileges); + app.SetGameHostOption(eGameHostOption_HostCanBeInvisible,pClass->m_MoreOptionsParams.bHostPrivileges ); + + 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_iGameModeId ); + + g_NetworkManager.HostGame(dwLocalUsersMask,isClientSide,isPrivate,MINECRAFT_NET_MAX_PLAYERS,0); + + param->settings = app.GetGameHostOption( eGameHostOption_All ); + +#ifndef _XBOX + g_NetworkManager.FakeLocalPlayerJoined(); +#endif + + LoadingInputParams *loadingParams = new LoadingInputParams(); + loadingParams->func = &CGameNetworkManager::RunNetworkGameThreadProc; + loadingParams->lpParam = (LPVOID)param; + + // Reset the autosave time + app.SetAutosaveTimerTime(); + + UIFullscreenProgressCompletionData *completionData = new UIFullscreenProgressCompletionData(); + completionData->bShowBackground=TRUE; + completionData->bShowLogo=TRUE; + completionData->type = e_ProgressCompletion_CloseAllPlayersUIScenes; + completionData->iPad = DEFAULT_XUI_MENU_USER; + loadingParams->completionData = completionData; + + ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_FullscreenProgress, loadingParams); +} + +void UIScene_LoadMenu::checkStateAndStartGame() +{ + // Check if they have the Reset Nether flag set, and confirm they want to do this + if(m_MoreOptionsParams.bResetNether==TRUE) + { + UINT uiIDA[2]; + uiIDA[0]=IDS_DONT_RESET_NETHER; + uiIDA[1]=IDS_RESET_NETHER; + + ui.RequestAlertMessage(IDS_RESETNETHER_TITLE, IDS_RESETNETHER_TEXT, uiIDA, 2, m_iPad,&UIScene_LoadMenu::CheckResetNetherReturned,this); + } + else + { + LaunchGame(); + } +} + +int UIScene_LoadMenu::StartGame_SignInReturned(void *pParam,bool bContinue, int iPad) +{ + UIScene_LoadMenu* pClass = (UIScene_LoadMenu*)pParam; + + if(bContinue==true) + { + // It's possible that the player has not signed in - they can back out + if(ProfileManager.IsSignedIn(pClass->m_iPad)) + { + int primaryPad = ProfileManager.GetPrimaryPad(); + bool noPrivileges = false; + DWORD dwLocalUsersMask = 0; + bool isSignedInLive = ProfileManager.IsSignedInLive(primaryPad); + bool isOnlineGame = pClass->m_MoreOptionsParams.bOnlineGame; + int iPadNotSignedInLive = -1; + bool isLocalMultiplayerAvailable = app.IsLocalMultiplayerAvailable(); + + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + if (ProfileManager.IsSignedIn(i) && ((i == primaryPad) || isLocalMultiplayerAvailable)) + { + if (isSignedInLive && !ProfileManager.IsSignedInLive(i)) + { + // Record the first non signed in live pad + iPadNotSignedInLive = i; + } + + if( !ProfileManager.AllowedToPlayMultiplayer(i) ) noPrivileges = true; + dwLocalUsersMask |= CGameNetworkManager::GetLocalPlayerMask(i); + isSignedInLive = isSignedInLive && ProfileManager.IsSignedInLive(i); + } + } + + // If this is an online game but not all players are signed in to Live, stop! + if (isOnlineGame && !isSignedInLive) + { +#ifdef __ORBIS__ + assert(iPadNotSignedInLive != -1); + + // Check if PSN is unavailable because of age restriction + int npAvailability = ProfileManager.getNPAvailability(iPadNotSignedInLive); + if (npAvailability == SCE_NP_ERROR_AGE_RESTRICTION) + { + pClass->m_bIgnoreInput = false; + // 4J Stu - This is a bit messy and is due to the library incorrectly returning false for IsSignedInLive if the npAvailability isn't SCE_OK + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPadNotSignedInLive); + } + else + { + pClass->m_bIgnoreInput=true; + UINT uiIDA[2]; + uiIDA[0] = IDS_PRO_NOTONLINE_ACCEPT; + uiIDA[1] = IDS_CANCEL; + 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.RequestAlertMessage( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA,1,ProfileManager.GetPrimaryPad()); + return 0; +#endif + } + + // Check if user-created content is allowed, as we cannot play multiplayer if it's not + bool noUGC = false; + BOOL pccAllowed = TRUE; + BOOL pccFriendsAllowed = TRUE; + + ProfileManager.AllowedPlayerCreatedContent(ProfileManager.GetPrimaryPad(),false,&pccAllowed,&pccFriendsAllowed); + if(!pccAllowed && !pccFriendsAllowed) noUGC = true; + + if(isSignedInLive && isOnlineGame && (noPrivileges || noUGC) ) + { + if( noUGC ) + { + pClass->m_bIgnoreInput = false; + pClass->setVisible( true ); + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestAlertMessage( IDS_FAILED_TO_CREATE_GAME_TITLE, IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_CREATE, uiIDA,1,ProfileManager.GetPrimaryPad()); + } + else + { + pClass->m_bIgnoreInput = false; + pClass->setVisible( true ); + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestAlertMessage( IDS_NO_MULTIPLAYER_PRIVILEGE_TITLE, IDS_NO_MULTIPLAYER_PRIVILEGE_HOST_TEXT, uiIDA,1,ProfileManager.GetPrimaryPad()); + } + } + else + { +#if defined( __ORBIS__) || defined(__PSVITA__) + if(isOnlineGame) + { + // show the chat restriction message for all users that it applies to + for(unsigned int i = 0; i < XUSER_MAX_COUNT; i++) + { + if(ProfileManager.IsSignedInLive(i)) + { + bool chatRestricted = false; + ProfileManager.GetChatAndContentRestrictions(i,false,&chatRestricted,NULL,NULL); + if(chatRestricted) + { + ProfileManager.DisplaySystemMessage( SCE_MSG_DIALOG_SYSMSG_TYPE_TRC_PSN_CHAT_RESTRICTION, i ); + } + } + } + } +#endif + // This is NOT called from a storage manager thread, and is in fact called from the main thread in the Profile library tick. Therefore we use the main threads IntCache. + StartGameFromSave(pClass, dwLocalUsersMask); + } + } + } + else + { + pClass->m_bIgnoreInput=false; + } + + return 0; +} + +void UIScene_LoadMenu::handleGainFocus(bool navBack) +{ + if(navBack) + { + m_checkboxOnline.setChecked(m_MoreOptionsParams.bOnlineGame == TRUE); + } +} + +#ifdef __ORBIS__ +int UIScene_LoadMenu::MustSignInReturnedPSN(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + UIScene_LoadMenu* pClass = (UIScene_LoadMenu *)pParam; + pClass->m_bIgnoreInput = false; + + if(result==C4JStorage::EMessage_ResultAccept) + { + SQRNetworkManager_Orbis::AttemptPSNSignIn(&UIScene_LoadMenu::StartGame_SignInReturned, pClass, false, iPad); + } + + return 0; +} + +// int UIScene_LoadMenu::PSPlusReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +// { +// int32_t iResult; +// UIScene_LoadMenu *pClass = (UIScene_LoadMenu *)pParam; +// +// // continue offline, or upsell PS Plus? +// if(result==C4JStorage::EMessage_ResultDecline) +// { +// // upsell psplus +// iResult=sceNpCommerceDialogInitialize(); +// +// SceNpCommerceDialogParam param; +// sceNpCommerceDialogParamInitialize(¶m); +// param.mode=SCE_NP_COMMERCE_DIALOG_MODE_PLUS; +// param.features = SCE_NP_PLUS_FEATURE_REALTIME_MULTIPLAY; +// param.userId = ProfileManager.getUserID(pClass->m_iPad); +// +// +// iResult=sceNpCommerceDialogOpen(¶m); +// } +// else if(result==C4JStorage::EMessage_ResultAccept) +// { +// // continue offline +// pClass->m_MoreOptionsParams.bOnlineGame=false; +// pClass->LoadDataComplete(pClass); +// } +// +// pClass->m_bIgnoreInput=false; +// return 0; +// } +#endif \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_LoadMenu.h b/Minecraft.Client/Common/UI/UIScene_LoadMenu.h new file mode 100644 index 00000000..12955151 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_LoadMenu.h @@ -0,0 +1,127 @@ +#pragma once + +#include "IUIScene_StartGame.h" + +class UIScene_LoadMenu : public IUIScene_StartGame +{ +private: + enum EControls + { + eControl_GameMode, + eControl_Difficulty, + eControl_MoreOptions, + eControl_LoadWorld, + eControl_TexturePackList, + eControl_OnlineGame, + }; + + static int m_iDifficultyTitleSettingA[4]; + + UIControl m_controlMainPanel; + UIControl_Label m_labelGameName, m_labelSeed, m_labelCreatedMode; + UIControl_Button m_buttonGamemode, m_buttonMoreOptions, m_buttonLoadWorld; + UIControl_Slider m_sliderDifficulty; + UIControl_BitmapIcon m_bitmapIcon; + + UIControl_CheckBox m_checkboxOnline; + + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(IUIScene_StartGame) + UI_MAP_ELEMENT( m_controlMainPanel, "MainPanel" ) + UI_BEGIN_MAP_CHILD_ELEMENTS( m_controlMainPanel ) + UI_MAP_ELEMENT( m_labelGameName, "GameName") + UI_MAP_ELEMENT( m_labelCreatedMode, "CreatedMode") + UI_MAP_ELEMENT( m_labelSeed, "Seed") + UI_MAP_ELEMENT( m_texturePackList, "TexturePackSelector") + UI_MAP_ELEMENT( m_buttonGamemode, "GameModeToggle") + UI_MAP_ELEMENT( m_checkboxOnline, "CheckboxOnline") + UI_MAP_ELEMENT( m_buttonMoreOptions, "MoreOptions") + UI_MAP_ELEMENT( m_buttonLoadWorld, "LoadSettings") + UI_MAP_ELEMENT( m_sliderDifficulty, "Difficulty") + UI_MAP_ELEMENT( m_bitmapIcon, "LevelIcon") + UI_END_MAP_CHILD_ELEMENTS() + UI_END_MAP_ELEMENTS_AND_NAMES() + + LevelGenerationOptions *m_levelGen; + DLCPack * m_pDLCPack; + + int m_iSaveGameInfoIndex; + int m_CurrentDifficulty; + bool m_bGameModeCreative; + int m_iGameModeId; + bool m_bHasBeenInCreative; + bool m_bIsSaveOwner; + bool m_bRetrievingSaveThumbnail; + bool m_bSaveThumbnailReady; + bool m_bMultiplayerAllowed; + bool m_bShowTimer; + bool m_bAvailableTexturePacksChecked; + bool m_bRequestQuadrantSignin; + bool m_bIsCorrupt; + bool m_bThumbnailGetFailed; + __int64 m_seed; + +#ifdef __PS3__ + std::vector*m_pvProductInfo; +#endif + //int *m_iConfigA; // track the texture packs that we don't have installed + + PBYTE m_pbThumbnailData; + unsigned int m_uiThumbnailSize; + wstring m_thumbnailName; + + bool m_bRebuildTouchBoxes; +public: + UIScene_LoadMenu(int iPad, void *initData, UILayer *parentLayer); + + virtual void updateTooltips(); + virtual void updateComponents(); + + virtual EUIScene getSceneType() { return eUIScene_LoadMenu;} + + virtual void tick(); + + virtual UIControl* GetMainPanel(); + + virtual void handleTouchBoxRebuild(); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + virtual void handleTimerComplete(int id); + +protected: + void handlePress(F64 controlId, F64 childId); + void handleSliderMove(F64 sliderId, F64 currentValue); + virtual void handleGainFocus(bool navBack); + +private: + void StartSharedLaunchFlow(); + virtual void checkStateAndStartGame(); + void LaunchGame(void); + +#ifdef _DURANGO + static void checkPrivilegeCallback(LPVOID lpParam, bool hasPrivilege, int iPad); +#endif + + static int ConfirmLoadReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static void StartGameFromSave(UIScene_LoadMenu* pClass, DWORD dwLocalUsersMask); + static int LoadSaveDataReturned(void *pParam,bool bIsCorrupt, bool bIsOwner); + static int TrophyDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int LoadDataComplete(void *pParam); + static int LoadSaveDataThumbnailReturned(LPVOID lpParam,PBYTE pbThumbnail,DWORD dwThumbnailBytes); + static int CheckResetNetherReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int DeleteSaveDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int DeleteSaveDataReturned(void *pParam,bool bSuccess); + static int MustSignInReturnedPSN(void *pParam,int iPad,C4JStorage::EMessageResult result); +#ifdef __ORBIS__ + //static int PSPlusReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int ContinueOffline(void *pParam,int iPad,C4JStorage::EMessageResult result); +#endif + +public: + static int StartGame_SignInReturned(LPVOID pParam, bool, int); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_LoadOrJoinMenu.cpp b/Minecraft.Client/Common/UI/UIScene_LoadOrJoinMenu.cpp new file mode 100644 index 00000000..6ceeaf2d --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_LoadOrJoinMenu.cpp @@ -0,0 +1,3759 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_LoadOrJoinMenu.h" + +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.chunk.storage.h" +#include "..\..\..\Minecraft.World\ConsoleSaveFile.h" +#include "..\..\..\Minecraft.World\ConsoleSaveFileOriginal.h" +#include "..\..\..\Minecraft.World\ConsoleSaveFileSplit.h" +#include "..\..\ProgressRenderer.h" +#include "..\..\MinecraftServer.h" +#include "..\..\TexturePackRepository.h" +#include "..\..\TexturePack.h" +#include "..\Network\SessionInfo.h" +#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) +#include "Common\Network\Sony\SonyHttp.h" +#include "Common\Network\Sony\SonyRemoteStorage.h" +#include "DLCTexturePack.h" +#endif +#if defined(__ORBIS__) || defined(__PSVITA__) +#include +#endif +#ifdef __PSVITA__ +#include "message_dialog.h" +#endif + + +#ifdef SONY_REMOTE_STORAGE_DOWNLOAD +unsigned long UIScene_LoadOrJoinMenu::m_ulFileSize=0L; +wstring UIScene_LoadOrJoinMenu::m_wstrStageText=L""; +bool UIScene_LoadOrJoinMenu::m_bSaveTransferRunning = false; +#endif + + +#define JOIN_LOAD_ONLINE_TIMER_ID 0 +#define JOIN_LOAD_ONLINE_TIMER_TIME 100 + +#ifdef _XBOX +#define CHECKFORAVAILABLETEXTUREPACKS_TIMER_ID 3 +#define CHECKFORAVAILABLETEXTUREPACKS_TIMER_TIME 50 +#endif + +#ifdef _XBOX_ONE +UIScene_LoadOrJoinMenu::ESaveTransferFiles UIScene_LoadOrJoinMenu::s_eSaveTransferFile; +unsigned long UIScene_LoadOrJoinMenu::s_ulFileSize=0L; +byteArray UIScene_LoadOrJoinMenu::s_transferData = byteArray(); +wstring UIScene_LoadOrJoinMenu::m_wstrStageText=L""; + +#ifdef _DEBUG_MENUS_ENABLED +C4JStorage::SAVETRANSFER_FILE_DETAILS UIScene_LoadOrJoinMenu::m_debugTransferDetails; +#endif +#endif + +int UIScene_LoadOrJoinMenu::LoadSaveDataThumbnailReturned(LPVOID lpParam,PBYTE pbThumbnail,DWORD dwThumbnailBytes) +{ + UIScene_LoadOrJoinMenu *pClass= (UIScene_LoadOrJoinMenu *)lpParam; + + app.DebugPrintf("Received data for save thumbnail\n"); + + if(pbThumbnail && dwThumbnailBytes) + { + pClass->m_saveDetails[pClass->m_iRequestingThumbnailId].pbThumbnailData = new BYTE[dwThumbnailBytes]; + memcpy(pClass->m_saveDetails[pClass->m_iRequestingThumbnailId].pbThumbnailData, pbThumbnail, dwThumbnailBytes); + pClass->m_saveDetails[pClass->m_iRequestingThumbnailId].dwThumbnailSize = dwThumbnailBytes; + } + else + { + pClass->m_saveDetails[pClass->m_iRequestingThumbnailId].pbThumbnailData = NULL; + pClass->m_saveDetails[pClass->m_iRequestingThumbnailId].dwThumbnailSize = 0; + app.DebugPrintf("Save thumbnail data is NULL, or has size 0\n"); + } + pClass->m_bSaveThumbnailReady = true; + + return 0; +} + +int UIScene_LoadOrJoinMenu::LoadSaveCallback(LPVOID lpParam,bool bRes) +{ + //UIScene_LoadOrJoinMenu *pClass= (UIScene_LoadOrJoinMenu *)lpParam; + // Get the save data now + if(bRes) + { + app.DebugPrintf("Loaded save OK\n"); + } + return 0; +} + +UIScene_LoadOrJoinMenu::UIScene_LoadOrJoinMenu(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + app.SetLiveLinkRequired( true ); + + m_iRequestingThumbnailId = 0; + m_iSaveInfoC=0; + m_bIgnoreInput = false; + m_bShowingPartyGamesOnly = false; + m_bInParty = false; + m_currentSessions = NULL; + m_iState=e_SavesIdle; + //m_bRetrievingSaveInfo=false; + + m_buttonListSaves.init(eControl_SavesList); + m_buttonListGames.init(eControl_GamesList); + + m_labelSavesListTitle.init( 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 ); + + +#if defined(_XBOX_ONE) || defined(__ORBIS__) + m_spaceIndicatorSaves.init(L"",eControl_SpaceIndicator,0, (4LL *1024LL * 1024LL * 1024LL) ); +#endif + m_bUpdateSaveSize = false; + + m_bAllLoaded = false; + m_bRetrievingSaveThumbnails = false; + m_bSaveThumbnailReady = false; + m_bExitScene=false; + m_pSaveDetails=NULL; + m_bSavesDisplayed=false; + m_saveDetails = NULL; + m_iSaveDetailsCount = 0; + m_iTexturePacksNotInstalled = 0; + m_bCopying = false; + m_bCopyingCancelled = false; + +#ifndef _XBOX_ONE + m_bSaveTransferCancelled=false; + m_bSaveTransferInProgress=false; +#endif + m_eAction = eAction_None; + + m_bMultiplayerAllowed = ProfileManager.IsSignedInLive( m_iPad ) && ProfileManager.AllowedToPlayMultiplayer(m_iPad); + +#ifdef _XBOX_ONE + // 4J-PB - in order to buy the skin packs & texture packs, we need the signed offer ids for them, which we get in the availability info + // we need to retrieve this info though, so do it here + app.AddDLCRequest(e_Marketplace_Content); // content is skin packs, texture packs and mash-up packs +#endif + + + int iLB = -1; + +#ifdef _XBOX + XPARTY_USER_LIST partyList; + + if((XPartyGetUserList( &partyList ) != XPARTY_E_NOT_IN_PARTY ) && (partyList.dwUserCount>1)) + { + m_bInParty=true; + } + else + { + m_bInParty=false; + } +#endif + +#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) || defined(_DURANGO) + // Always clear the saves when we enter this menu + StorageManager.ClearSavesInfo(); +#endif + + // block input if we're waiting for DLC to install, and wipe the saves list. The end of dlc mounting custom message will fill the list again + if(app.StartInstallDLCProcess(m_iPad)==true || app.DLCInstallPending()) + { + // if we're waiting for DLC to mount, don't fill the save list. The custom message on end of dlc mounting will do that + m_bIgnoreInput = true; + } + else + { + Initialise(); + } + +#ifdef __PSVITA__ + if(CGameNetworkManager::usingAdhocMode() && SQRNetworkManager_AdHoc_Vita::GetAdhocStatus()) + { + g_NetworkManager.startAdhocMatching(); // create the client matching context and clear out the friends list + } + +#endif + + UpdateGamesList(); + + g_NetworkManager.SetSessionsUpdatedCallback( &UpdateGamesListCallback, this ); + + m_initData= new JoinMenuInitData(); + + // 4J Stu - Fix for #12530 -TCR 001 BAS Game Stability: Title will crash if the player disconnects while starting a new world and then opts to play the tutorial once they have been returned to the Main Menu. + MinecraftServer::resetFlags(); + + // If we're not ignoring input, then we aren't still waiting for the DLC to mount, and can now check for corrupt dlc. Otherwise this will happen when the dlc has finished mounting. + if( !m_bIgnoreInput) + { + app.m_dlcManager.checkForCorruptDLCAndAlert(); + } + + // 4J-PB - Only Xbox will not have trial DLC patched into the game +#ifdef _XBOX + // 4J-PB - there may be texture packs we don't have, so use the info from TMS for this + + DLC_INFO *pDLCInfo=NULL; + + // first pass - look to see if there are any that are not in the list + bool bTexturePackAlreadyListed; + bool bNeedToGetTPD=false; + Minecraft *pMinecraft = Minecraft::GetInstance(); + int texturePacksCount = pMinecraft->skins->getTexturePackCount(); + + for(unsigned int i = 0; i < app.GetDLCInfoTexturesOffersCount(); ++i) + { + bTexturePackAlreadyListed=false; +#if defined(__PS3__) || defined(__ORBIS__) + char *pchDLCName=app.GetDLCInfoTextures(i); + pDLCInfo=app.GetDLCInfo(pchDLCName); +#else + ULONGLONG ull=app.GetDLCInfoTexturesFullOffer(i); + pDLCInfo=app.GetDLCInfoForFullOfferID(ull); +#endif + for(unsigned int i = 0; i < texturePacksCount; ++i) + { + TexturePack *tp = pMinecraft->skins->getTexturePackByIndex(i); + if(pDLCInfo && pDLCInfo->iConfig==tp->getDLCParentPackId()) + { + bTexturePackAlreadyListed=true; + } + } + if(bTexturePackAlreadyListed==false) + { + // some missing + bNeedToGetTPD=true; + + m_iTexturePacksNotInstalled++; + } + } + + if(bNeedToGetTPD==true) + { + // add a TMS request for them + app.DebugPrintf("+++ Adding TMSPP request for texture pack data\n"); + app.AddTMSPPFileTypeRequest(e_DLC_TexturePackData); + m_iConfigA= new int [m_iTexturePacksNotInstalled]; + m_iTexturePacksNotInstalled=0; + + for(unsigned int i = 0; i < app.GetDLCInfoTexturesOffersCount(); ++i) + { + bTexturePackAlreadyListed=false; +#if defined(__PS3__) || defined(__ORBIS__) + char *pchDLCName=app.GetDLCInfoTextures(i); + pDLCInfo=app.GetDLCInfo(pchDLCName); +#else + ULONGLONG ull=app.GetDLCInfoTexturesFullOffer(i); + pDLCInfo=app.GetDLCInfoForFullOfferID(ull); +#endif + for(unsigned int i = 0; i < texturePacksCount; ++i) + { + TexturePack *tp = pMinecraft->skins->getTexturePackByIndex(i); + if(pDLCInfo->iConfig==tp->getDLCParentPackId()) + { + bTexturePackAlreadyListed=true; + } + } + if(bTexturePackAlreadyListed==false) + { + m_iConfigA[m_iTexturePacksNotInstalled++]=pDLCInfo->iConfig; + } + } + } + + addTimer(CHECKFORAVAILABLETEXTUREPACKS_TIMER_ID,CHECKFORAVAILABLETEXTUREPACKS_TIMER_TIME); +#endif + +#ifdef SONY_REMOTE_STORAGE_DOWNLOAD + m_eSaveTransferState = eSaveTransfer_Idle; +#endif +} + + +UIScene_LoadOrJoinMenu::~UIScene_LoadOrJoinMenu() +{ + g_NetworkManager.SetSessionsUpdatedCallback( NULL, NULL ); + app.SetLiveLinkRequired( false ); + + if(m_currentSessions) + { + for(AUTO_VAR(it, m_currentSessions->begin()); it < m_currentSessions->end(); ++it) + { + delete (*it); + } + } + +#if TO_BE_IMPLEMENTED + // Reset the background downloading, in case we changed it by attempting to download a texture pack + XBackgroundDownloadSetMode(XBACKGROUND_DOWNLOAD_MODE_AUTO); +#endif + + if(m_saveDetails) + { + for(int i = 0; i < m_iSaveDetailsCount; ++i) + { + delete m_saveDetails[i].pbThumbnailData; + } + delete [] m_saveDetails; + } +} + +void UIScene_LoadOrJoinMenu::updateTooltips() +{ +#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 + int iRB=-1; + int iY = -1; + int iLB = -1; + int iX=-1; + if (DoesGamesListHaveFocus() && m_buttonListGames.getItemCount() > 0) + { + iY = IDS_TOOLTIPS_VIEW_GAMERCARD; + } + else if (DoesSavesListHaveFocus()) + { + if((m_iDefaultButtonsC > 0) && (m_iSaveListIndex >= m_iDefaultButtonsC)) + { + if(StorageManager.GetSaveDisabled()) + { + iRB=IDS_TOOLTIPS_DELETESAVE; + } + else + { + if(StorageManager.EnoughSpaceForAMinSaveGame()) + { + iRB=IDS_TOOLTIPS_SAVEOPTIONS; + } + else + { + iRB=IDS_TOOLTIPS_DELETESAVE; + } + } + } + } + else if(DoesMashUpWorldHaveFocus()) + { + // If it's a mash-up pack world, give the Hide option + iRB=IDS_TOOLTIPS_HIDE; + } + + if(m_bInParty) + { + if( m_bShowingPartyGamesOnly ) iLB = IDS_TOOLTIPS_ALL_GAMES; + else iLB = IDS_TOOLTIPS_PARTY_GAMES; + } + +#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) + if(m_iPad == ProfileManager.GetPrimaryPad() ) iY = IDS_TOOLTIPS_GAME_INVITES; +#endif + + if(ProfileManager.IsFullVersion()==false ) + { + iRB = -1; + } + else if(StorageManager.GetSaveDisabled()) + { +#ifdef _XBOX + iX = IDS_TOOLTIPS_SELECTDEVICE; +#endif + } + else + { +#if defined _XBOX_ONE + if(ProfileManager.IsSignedInLive( m_iPad )) + { + // Is there a save from 360 on TMS? + iX=IDS_TOOLTIPS_SAVETRANSFER_DOWNLOAD; + } +#elif defined SONY_REMOTE_STORAGE_DOWNLOAD + // Is there a save from PS3 or PSVita available? + // Sony asked that this be displayed at all times so users are aware of the functionality. We'll display some text when there's no save available + //if(app.getRemoteStorage()->saveIsAvailable()) + { + bool bSignedInLive = ProfileManager.IsSignedInLive(m_iPad); + if(bSignedInLive) + { + iX=IDS_TOOLTIPS_SAVETRANSFER_DOWNLOAD; + } + } +#else + iX = IDS_TOOLTIPS_CHANGEDEVICE; +#endif + } + + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT, IDS_TOOLTIPS_BACK, iX, iY,-1,-1,iLB,iRB); +} + +// +void UIScene_LoadOrJoinMenu::Initialise() +{ + m_iSaveListIndex = 0; + m_iGameListIndex = 0; + + m_iDefaultButtonsC = 0; + m_iMashUpButtonsC=0; + + // Check if we're in the trial version + if(ProfileManager.IsFullVersion()==false) + { + + + AddDefaultButtons(); + +#if TO_BE_IMPLEMENTED + m_pSavesList->SetCurSelVisible(0); +#endif + } + else if(StorageManager.GetSaveDisabled()) + { +#if defined(__PS3__) || defined(__ORBIS__) || defined (__PSVITA__) + GetSaveInfo(); +#else + +#if TO_BE_IMPLEMENTED + if(StorageManager.GetSaveDeviceSelected(m_iPad)) +#endif + { + // saving is disabled, but we should still be able to load from a selected save device + + + + GetSaveInfo(); + } +#if TO_BE_IMPLEMENTED + else + { + AddDefaultButtons(); + m_controlSavesTimer.setVisible( false ); + } +#endif +#endif // __PS3__ || __ORBIS + } + else + { + // 4J-PB - we need to check that there is enough space left to create a copy of the save (for a rename) + bool bCanRename = StorageManager.EnoughSpaceForAMinSaveGame(); + + GetSaveInfo(); + } + + m_bIgnoreInput=false; + app.m_dlcManager.checkForCorruptDLCAndAlert(); +} + +void UIScene_LoadOrJoinMenu::updateComponents() +{ + m_parentLayer->showComponent(m_iPad,eUIComponent_Panorama,true); + m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,true); +} + +void UIScene_LoadOrJoinMenu::handleDestroy() +{ +#ifdef __PSVITA__ + app.DebugPrintf("missing InputManager.DestroyKeyboard on Vita !!!!!!\n"); +#endif + + // shut down the keyboard if it is displayed +#if ( defined __PS3__ || defined __ORBIS__ || defined _DURANGO) + InputManager.DestroyKeyboard(); +#endif +} + +void UIScene_LoadOrJoinMenu::handleGainFocus(bool navBack) +{ + UIScene::handleGainFocus(navBack); + + updateTooltips(); + + // Add load online timer + addTimer(JOIN_LOAD_ONLINE_TIMER_ID,JOIN_LOAD_ONLINE_TIMER_TIME); + + if(navBack) + { + app.SetLiveLinkRequired( true ); + + m_bMultiplayerAllowed = ProfileManager.IsSignedInLive( m_iPad ) && ProfileManager.AllowedToPlayMultiplayer(m_iPad); + + // re-enable button presses + m_bIgnoreInput=false; + + // block input if we're waiting for DLC to install, and wipe the saves list. The end of dlc mounting custom message will fill the list again + if(app.StartInstallDLCProcess(m_iPad)==false) + { + // not doing a mount, so re-enable input + m_bIgnoreInput=false; + } + else + { + m_bIgnoreInput=true; + m_buttonListSaves.clearList(); + m_controlSavesTimer.setVisible(true); + } + + if( m_bMultiplayerAllowed ) + { +#if TO_BE_IMPLEMENTED + HXUICLASS hClassFullscreenProgress = XuiFindClass( L"CScene_FullscreenProgress" ); + HXUICLASS hClassConnectingProgress = XuiFindClass( L"CScene_ConnectingProgress" ); + + // If we are navigating back from a full screen progress scene, then that means a connection attempt failed + if( XuiIsInstanceOf( hSceneFrom, hClassFullscreenProgress ) || XuiIsInstanceOf( hSceneFrom, hClassConnectingProgress ) ) + { + UpdateGamesList(); + } +#endif + } + else + { + m_buttonListGames.clearList(); + m_controlJoinTimer.setVisible(true); + m_labelNoGames.setVisible(false); +#if TO_BE_IMPLEMENTED + m_SavesList.InitFocus(m_iPad); +#endif + } + + // are we back here because of a delete of a corrupt save? + + if(app.GetCorruptSaveDeleted()) + { + // wipe the list and repopulate it + m_iState=e_SavesRepopulateAfterDelete; + app.SetCorruptSaveDeleted(false); + } + } +} + +void UIScene_LoadOrJoinMenu::handleLoseFocus() +{ + // Kill load online timer + killTimer(JOIN_LOAD_ONLINE_TIMER_ID); +} + +wstring UIScene_LoadOrJoinMenu::getMoviePath() +{ + return L"LoadOrJoinMenu"; +} + +void UIScene_LoadOrJoinMenu::tick() +{ + UIScene::tick(); + + + +#if (defined __PS3__ || defined __ORBIS__ || defined _DURANGO || defined _WINDOWS64 || defined __PSVITA__) + if(m_bExitScene) // navigate forward or back + { + if(!m_bRetrievingSaveThumbnails) + { + // need to wait for any callback retrieving thumbnail to complete + navigateBack(); + } + } + // Stop loading thumbnails if we navigate forwards + if(hasFocus(m_iPad)) + { +#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) + { + if((m_iDefaultButtonsC > 0) && (m_iSaveListIndex >= m_iDefaultButtonsC)) + { + m_spaceIndicatorSaves.selectSave(m_iSaveListIndex-m_iDefaultButtonsC); + } + else + { + m_spaceIndicatorSaves.selectSave(-1); + } + m_bUpdateSaveSize = false; + } +#endif + // Display the saves if we have them + if(!m_bSavesDisplayed) + { + m_pSaveDetails=StorageManager.ReturnSavesInfo(); + if(m_pSaveDetails!=NULL) + { + //CD - Fix - Adding define for ORBIS/XBOXONE +#if defined(_XBOX_ONE) || defined(__ORBIS__) + m_spaceIndicatorSaves.reset(); +#endif + + AddDefaultButtons(); + m_bSavesDisplayed=true; + UpdateGamesList(); + + if(m_saveDetails!=NULL) + { + for(unsigned int i = 0; i < m_iSaveDetailsCount; ++i) + { + if(m_saveDetails[i].pbThumbnailData!=NULL) + { + delete m_saveDetails[i].pbThumbnailData; + } + } + delete m_saveDetails; + } + m_saveDetails = new SaveListDetails[m_pSaveDetails->iSaveC]; + + m_iSaveDetailsCount = m_pSaveDetails->iSaveC; + for(unsigned int i = 0; i < m_pSaveDetails->iSaveC; ++i) + { +#if defined(_XBOX_ONE) + m_spaceIndicatorSaves.addSave(m_pSaveDetails->SaveInfoA[i].totalSize); +#elif defined(__ORBIS__) + m_spaceIndicatorSaves.addSave(m_pSaveDetails->SaveInfoA[i].blocksUsed * (32 * 1024) ); +#endif +#ifdef _DURANGO + m_buttonListSaves.addItem(m_pSaveDetails->SaveInfoA[i].UTF16SaveTitle, L""); + + m_saveDetails[i].saveId = i; + memcpy(m_saveDetails[i].UTF16SaveName, m_pSaveDetails->SaveInfoA[i].UTF16SaveTitle, 128); + memcpy(m_saveDetails[i].UTF16SaveFilename, m_pSaveDetails->SaveInfoA[i].UTF16SaveFilename, MAX_SAVEFILENAME_LENGTH); +#else + m_buttonListSaves.addItem(m_pSaveDetails->SaveInfoA[i].UTF8SaveTitle, L""); + + m_saveDetails[i].saveId = i; + memcpy(m_saveDetails[i].UTF8SaveName, m_pSaveDetails->SaveInfoA[i].UTF8SaveTitle, 128); + memcpy(m_saveDetails[i].UTF8SaveFilename, m_pSaveDetails->SaveInfoA[i].UTF8SaveFilename, MAX_SAVEFILENAME_LENGTH); +#endif + } + m_controlSavesTimer.setVisible( false ); + + // set focus on the first button + + } + } + + if(!m_bExitScene && m_bSavesDisplayed && !m_bRetrievingSaveThumbnails && !m_bAllLoaded) + { + if( m_iRequestingThumbnailId < (m_buttonListSaves.getItemCount() - m_iDefaultButtonsC )) + { + m_bRetrievingSaveThumbnails = true; + app.DebugPrintf("Requesting the first thumbnail\n"); + // set the save to load + PSAVE_DETAILS pSaveDetails=StorageManager.ReturnSavesInfo(); + C4JStorage::ESaveGameState eLoadStatus=StorageManager.LoadSaveDataThumbnail(&pSaveDetails->SaveInfoA[(int)m_iRequestingThumbnailId],&LoadSaveDataThumbnailReturned,this); + + if(eLoadStatus!=C4JStorage::ESaveGame_GetSaveThumbnail) + { + // something went wrong + m_bRetrievingSaveThumbnails=false; + m_bAllLoaded = true; + } + } + } + else if (m_bSavesDisplayed && m_bSaveThumbnailReady) + { + m_bSaveThumbnailReady = false; + + // check we're not waiting to exit the scene + if(!m_bExitScene) + { + // convert to utf16 + uint16_t u16Message[MAX_SAVEFILENAME_LENGTH]; +#ifdef _DURANGO + // Already utf16 on durango + memcpy(u16Message, m_saveDetails[m_iRequestingThumbnailId].UTF16SaveFilename, MAX_SAVEFILENAME_LENGTH); +#elif defined(_WINDOWS64) + int result = ::MultiByteToWideChar( + CP_UTF8, // convert from UTF-8 + MB_ERR_INVALID_CHARS, // error on invalid chars + m_saveDetails[m_iRequestingThumbnailId].UTF8SaveFilename, // source UTF-8 string + MAX_SAVEFILENAME_LENGTH, // total length of source UTF-8 string, + // in CHAR's (= bytes), including end-of-string \0 + (wchar_t *)u16Message, // destination buffer + MAX_SAVEFILENAME_LENGTH // size of destination buffer, in WCHAR's + ); +#else +#ifdef __PS3 + size_t srcmax,dstmax; +#else + uint32_t srcmax,dstmax; + uint32_t srclen,dstlen; +#endif + srcmax=MAX_SAVEFILENAME_LENGTH; + dstmax=MAX_SAVEFILENAME_LENGTH; + +#if defined(__PS3__) + L10nResult lres= UTF8stoUTF16s((uint8_t *)m_saveDetails[m_iRequestingThumbnailId].UTF8SaveFilename,&srcmax,u16Message,&dstmax); +#else + SceCesUcsContext context; + sceCesUcsContextInit(&context); + + sceCesUtf8StrToUtf16Str(&context, (uint8_t *)m_saveDetails[m_iRequestingThumbnailId].UTF8SaveFilename,srcmax,&srclen,u16Message,dstmax,&dstlen); +#endif +#endif + if( m_saveDetails[m_iRequestingThumbnailId].pbThumbnailData ) + { + registerSubstitutionTexture((wchar_t *)u16Message,m_saveDetails[m_iRequestingThumbnailId].pbThumbnailData,m_saveDetails[m_iRequestingThumbnailId].dwThumbnailSize); + } + m_buttonListSaves.setTextureName(m_iRequestingThumbnailId + m_iDefaultButtonsC, (wchar_t *)u16Message); + + ++m_iRequestingThumbnailId; + if( m_iRequestingThumbnailId < (m_buttonListSaves.getItemCount() - m_iDefaultButtonsC )) + { + app.DebugPrintf("Requesting another thumbnail\n"); + // set the save to load + PSAVE_DETAILS pSaveDetails=StorageManager.ReturnSavesInfo(); + C4JStorage::ESaveGameState eLoadStatus=StorageManager.LoadSaveDataThumbnail(&pSaveDetails->SaveInfoA[(int)m_iRequestingThumbnailId],&LoadSaveDataThumbnailReturned,this); + if(eLoadStatus!=C4JStorage::ESaveGame_GetSaveThumbnail) + { + // something went wrong + m_bRetrievingSaveThumbnails=false; + m_bAllLoaded = true; + } + } + else + { + m_bRetrievingSaveThumbnails = false; + m_bAllLoaded = true; + } + } + else + { + // stop retrieving thumbnails, and exit + m_bRetrievingSaveThumbnails = false; + } + } + } + + switch(m_iState) + { + case e_SavesIdle: + break; + case e_SavesRepopulate: + m_bIgnoreInput = false; + m_iState=e_SavesIdle; + m_bAllLoaded=false; + m_bRetrievingSaveThumbnails=false; + m_iRequestingThumbnailId = 0; + GetSaveInfo(); + break; + case e_SavesRepopulateAfterMashupHide: + m_bIgnoreInput = false; + m_iRequestingThumbnailId = 0; + m_bAllLoaded=false; + m_bRetrievingSaveThumbnails=false; + m_bSavesDisplayed=false; + m_iSaveInfoC=0; + m_buttonListSaves.clearList(); + GetSaveInfo(); + m_iState=e_SavesIdle; + break; + case e_SavesRepopulateAfterDelete: + case e_SavesRepopulateAfterTransferDownload: + m_bIgnoreInput = false; + m_iRequestingThumbnailId = 0; + m_bAllLoaded=false; + m_bRetrievingSaveThumbnails=false; + m_bSavesDisplayed=false; + m_iSaveInfoC=0; + m_buttonListSaves.clearList(); + StorageManager.ClearSavesInfo(); + GetSaveInfo(); + m_iState=e_SavesIdle; + break; + } +#else + if(!m_bSavesDisplayed) + { + AddDefaultButtons(); + m_bSavesDisplayed=true; + m_controlSavesTimer.setVisible( false ); + } +#endif + +#ifdef _XBOX_ONE + if(g_NetworkManager.ShouldMessageForFullSession()) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestErrorMessage( IDS_CONNECTION_FAILED, IDS_IN_PARTY_SESSION_FULL, uiIDA,1,ProfileManager.GetPrimaryPad()); + } +#endif + + // SAVE TRANSFERS +#ifdef __ORBIS__ + // check the status of the PSPlus common dialog + switch (sceNpCommerceDialogUpdateStatus()) + { + case SCE_COMMON_DIALOG_STATUS_FINISHED: + { + SceNpCommerceDialogResult Result; + sceNpCommerceDialogGetResult(&Result); + sceNpCommerceDialogTerminate(); + + if(Result.authorized) + { + // they just became a PSPlus member + ProfileManager.PsPlusUpdate(ProfileManager.GetPrimaryPad(), &Result); + + } + else + { + + } + + // 4J-JEV: Fix for PS4 #5148 - [ONLINE] If the user attempts to join a game when they do not have Playstation Plus, the title will lose all functionality. + m_bIgnoreInput = false; + } + break; + default: + break; + } +#endif + +} + +void UIScene_LoadOrJoinMenu::GetSaveInfo() +{ + unsigned int uiSaveC=0; + + // This will return with the number retrieved in uiSaveC + + if(app.DebugSettingsOn() && app.GetLoadSavesFromFolderEnabled()) + { +#ifdef __ORBIS__ + // We need to make sure this is non-null so that we have an idea of free space + m_pSaveDetails=StorageManager.ReturnSavesInfo(); + if(m_pSaveDetails==NULL) + { + C4JStorage::ESaveGameState eSGIStatus= StorageManager.GetSavesInfo(m_iPad,NULL,this,"save"); + } +#endif + + uiSaveC = 0; +#ifdef _XBOX + File savesDir(L"GAME:\\Saves"); +#else + File savesDir(L"Saves"); +#endif + if( savesDir.exists() ) + { + m_saves = savesDir.listFiles(); + uiSaveC = (unsigned int)m_saves->size(); + } + // add the New Game and Tutorial after the saves list is retrieved, if there are any saves + + // Add two for New Game and Tutorial + unsigned int listItems = uiSaveC; + + AddDefaultButtons(); + + for(unsigned int i=0;iat(i)->getName(); + wchar_t *name = new wchar_t[wName.size()+1]; + for(unsigned int j = 0; j < wName.size(); ++j) + { + name[j] = wName[j]; + } + name[wName.size()] = 0; + m_buttonListSaves.addItem(name,L""); + } + m_bSavesDisplayed = true; + m_bAllLoaded = true; + m_bIgnoreInput = false; + } + else + { + // clear the saves list + m_bSavesDisplayed = false; // we're blocking the exit from this scene until complete + m_buttonListSaves.clearList(); + m_iSaveInfoC=0; + m_controlSavesTimer.setVisible(true); + + m_pSaveDetails=StorageManager.ReturnSavesInfo(); + if(m_pSaveDetails==NULL) + { + C4JStorage::ESaveGameState eSGIStatus= StorageManager.GetSavesInfo(m_iPad,NULL,this,"save"); + } + +#if TO_BE_IMPLEMENTED + if(eSGIStatus==C4JStorage::ESGIStatus_NoSaves) + { + uiSaveC=0; + m_controlSavesTimer.setVisible( false ); + m_SavesList.SetEnable(TRUE); + } +#endif + } + + return; +} + +void UIScene_LoadOrJoinMenu::AddDefaultButtons() +{ + m_iDefaultButtonsC = 0; + m_iMashUpButtonsC=0; + m_generators.clear(); + + m_buttonListSaves.addItem(app.GetString(IDS_CREATE_NEW_WORLD)); + m_iDefaultButtonsC++; + + int i = 0; + + for(AUTO_VAR(it, app.getLevelGenerators()->begin()); it != app.getLevelGenerators()->end(); ++it) + { + LevelGenerationOptions *levelGen = *it; + + // retrieve the save icon from the texture pack, if there is one + unsigned int uiTexturePackID=levelGen->getRequiredTexturePackId(); + + if(uiTexturePackID!=0) + { + unsigned int uiMashUpWorldsBitmask=app.GetMashupPackWorlds(m_iPad); + + if((uiMashUpWorldsBitmask & (1<<(uiTexturePackID-1024)))==0) + { + // this world is hidden, so skip + continue; + } + } + + // 4J-JEV: For debug. Ignore worlds with no name. + LPCWSTR wstr = levelGen->getWorldName(); + m_buttonListSaves.addItem( wstr ); + m_generators.push_back(levelGen); + + if(uiTexturePackID!=0) + { + // increment the count of the mash-up pack worlds in the save list + m_iMashUpButtonsC++; + TexturePack *tp = Minecraft::GetInstance()->skins->getTexturePackById(levelGen->getRequiredTexturePackId()); + DWORD dwImageBytes; + PBYTE pbImageData = tp->getPackIcon(dwImageBytes); + + if(dwImageBytes > 0 && pbImageData) + { + wchar_t imageName[64]; + swprintf(imageName,64,L"tpack%08x",tp->getId()); + registerSubstitutionTexture(imageName, pbImageData, dwImageBytes); + m_buttonListSaves.setTextureName( m_buttonListSaves.getItemCount() - 1, imageName ); + } + } + + ++i; + } + m_iDefaultButtonsC += i; +} + +void UIScene_LoadOrJoinMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + if(m_bIgnoreInput) return; + + // if we're retrieving save info, ignore key presses + if(!m_bSavesDisplayed) return; + + ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); + + switch(key) + { + case ACTION_MENU_CANCEL: + if(pressed) + { +#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) + m_bExitScene=true; +#else + navigateBack(); +#endif + handled = true; + } + break; + case ACTION_MENU_X: +#if TO_BE_IMPLEMENTED + // Change device + // Fix for #12531 - TCR 001: BAS Game Stability: When a player selects to change a storage + // device, and repeatedly backs out of the SD screen, disconnects from LIVE, and then selects a SD, the title crashes. + m_bIgnoreInput=true; + StorageManager.SetSaveDevice(&CScene_MultiGameJoinLoad::DeviceSelectReturned,this,true); + ui.PlayUISFX(eSFX_Press); +#endif + // Save Transfer +#ifdef _XBOX_ONE + if(ProfileManager.IsSignedInLive( m_iPad )) + { + UIScene_LoadOrJoinMenu::s_ulFileSize=0; + LaunchSaveTransfer(); + } +#endif +#ifdef SONY_REMOTE_STORAGE_DOWNLOAD + { + bool bSignedInLive = ProfileManager.IsSignedInLive(iPad); + if(bSignedInLive) + { + LaunchSaveTransfer(); + } + } +#endif + break; + case ACTION_MENU_Y: +#if defined(__PS3__) || defined(__PSVITA__) || defined(__ORBIS__) + m_eAction = eAction_ViewInvites; + if(pressed && iPad == ProfileManager.GetPrimaryPad()) + { +#ifdef __ORBIS__ + // Check if PSN is unavailable because of age restriction + int npAvailability = ProfileManager.getNPAvailability(iPad); + if (npAvailability == SCE_NP_ERROR_AGE_RESTRICTION) + { + UINT uiIDA[1]; + uiIDA[0] = IDS_OK; + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPad); + + break; + } +#endif + + // are we offline? + if(!ProfileManager.IsSignedInLive(iPad)) + { + // get them to sign in to online + UINT uiIDA[2]; + uiIDA[0]=IDS_PRO_NOTONLINE_ACCEPT; + uiIDA[1]=IDS_PRO_NOTONLINE_DECLINE; + ui.RequestAlertMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad(), &UIScene_LoadOrJoinMenu::MustSignInReturnedPSN, this); + } + else + { +#ifdef __ORBIS__ + SQRNetworkManager_Orbis::RecvInviteGUI(); +#elif defined __PSVITA__ + SQRNetworkManager_Vita::RecvInviteGUI(); +#else + int ret = sceNpBasicRecvMessageCustom(SCE_NP_BASIC_MESSAGE_MAIN_TYPE_INVITE, SCE_NP_BASIC_RECV_MESSAGE_OPTIONS_INCLUDE_BOOTABLE, SYS_MEMORY_CONTAINER_ID_INVALID); + app.DebugPrintf("sceNpBasicRecvMessageCustom return %d ( %08x )\n", ret, ret); +#endif + } + } +#elif defined(_DURANGO) + if(getControlFocus() == eControl_GamesList && m_buttonListGames.getItemCount() > 0) + { + DWORD nIndex = m_buttonListGames.getCurrentSelection(); + FriendSessionInfo *pSelectedSession = m_currentSessions->at( nIndex ); + + PlayerUID uid = pSelectedSession->searchResult.m_playerXuids[0]; + if( uid != INVALID_XUID ) ProfileManager.ShowProfileCard(ProfileManager.GetLockedProfile(),uid); + ui.PlayUISFX(eSFX_Press); + } +#endif // __PS3__ || __ORBIS__ + break; + + case ACTION_MENU_RIGHT_SCROLL: + if(DoesSavesListHaveFocus()) + { + // 4J-PB - check we are on a valid save + if((m_iDefaultButtonsC != 0) && (m_iSaveListIndex >= m_iDefaultButtonsC)) + { + m_bIgnoreInput = true; + + // Could be delete save or Save Options + if(StorageManager.GetSaveDisabled()) + { + // delete the save game + // Have to ask the player if they are sure they want to delete this game + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + ui.RequestAlertMessage(IDS_TOOLTIPS_DELETESAVE, IDS_TEXT_DELETE_SAVE, uiIDA, 2, iPad,&UIScene_LoadOrJoinMenu::DeleteSaveDialogReturned,this); + } + else + { + if(StorageManager.EnoughSpaceForAMinSaveGame()) + { + UINT uiIDA[4]; + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_TITLE_RENAMESAVE; + uiIDA[2]=IDS_TOOLTIPS_DELETESAVE; + int numOptions = 3; +#ifdef SONY_REMOTE_STORAGE_UPLOAD + if(ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad())) + { + numOptions = 4; + uiIDA[3]=IDS_TOOLTIPS_SAVETRANSFER_UPLOAD; + } +#endif +#if defined _XBOX_ONE || defined __ORBIS__ + numOptions = 4; + uiIDA[3]=IDS_COPYSAVE; +#endif + ui.RequestAlertMessage(IDS_TOOLTIPS_SAVEOPTIONS, IDS_TEXT_SAVEOPTIONS, uiIDA, numOptions, iPad,&UIScene_LoadOrJoinMenu::SaveOptionsDialogReturned,this); + } + else + { + // delete the save game + // Have to ask the player if they are sure they want to delete this game + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + ui.RequestAlertMessage(IDS_TOOLTIPS_DELETESAVE, IDS_TEXT_DELETE_SAVE, uiIDA, 2,iPad,&UIScene_LoadOrJoinMenu::DeleteSaveDialogReturned,this); + } + } + ui.PlayUISFX(eSFX_Press); + } + } + else if(DoesMashUpWorldHaveFocus()) + { + // hiding a mash-up world + if((m_iSaveListIndex != JOIN_LOAD_CREATE_BUTTON_INDEX)) + { + LevelGenerationOptions *levelGen = m_generators.at(m_iSaveListIndex - 1); + + if(!levelGen->isTutorial()) + { + if(levelGen->requiresTexturePack()) + { + unsigned int uiPackID=levelGen->getRequiredTexturePackId(); + + m_bIgnoreInput = true; + app.HideMashupPackWorld(m_iPad,uiPackID); + + // update the saves list + m_iState = e_SavesRepopulateAfterMashupHide; + } + } + } + ui.PlayUISFX(eSFX_Press); + + } + break; + case ACTION_MENU_LEFT_SCROLL: +#ifdef _XBOX + if( m_bInParty ) + { + m_bShowingPartyGamesOnly = !m_bShowingPartyGamesOnly; + UpdateGamesList(); + CXuiSceneBase::PlayUISFX(eSFX_Press); + } +#endif + break; + case ACTION_MENU_LEFT: + case ACTION_MENU_RIGHT: + { + // if we are on the saves menu, check there are games in the games list to move to + if(DoesSavesListHaveFocus()) + { + if( m_buttonListGames.getItemCount() > 0) + { + sendInputToMovie(key, repeat, pressed, released); + } + } + else + { + sendInputToMovie(key, repeat, pressed, released); + } + } + break; + + case ACTION_MENU_OK: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + case ACTION_MENU_PAGEUP: + case ACTION_MENU_PAGEDOWN: + sendInputToMovie(key, repeat, pressed, released); + handled = true; + break; + } +} + +int UIScene_LoadOrJoinMenu::KeyboardCompleteWorldNameCallback(LPVOID lpParam,bool bRes) +{ + // 4J HEG - No reason to set value if keyboard was cancelled + UIScene_LoadOrJoinMenu *pClass=(UIScene_LoadOrJoinMenu *)lpParam; + pClass->m_bIgnoreInput=false; + if (bRes) + { + uint16_t ui16Text[128]; + ZeroMemory(ui16Text, 128 * sizeof(uint16_t) ); + InputManager.GetText(ui16Text); + + // check the name is valid + if(ui16Text[0]!=0) + { +#if (defined __PS3__ || defined __ORBIS__ || defined _DURANGO || defined(__PSVITA__)) + // open the save and overwrite the metadata + StorageManager.RenameSaveData(pClass->m_iSaveListIndex - pClass->m_iDefaultButtonsC, ui16Text,&UIScene_LoadOrJoinMenu::RenameSaveDataReturned,pClass); +#endif + } + else + { + pClass->m_bIgnoreInput=false; + pClass->updateTooltips(); + } + } + else + { + pClass->m_bIgnoreInput=false; + pClass->updateTooltips(); + } + + + return 0; +} +void UIScene_LoadOrJoinMenu::handleInitFocus(F64 controlId, F64 childId) +{ + app.DebugPrintf(app.USER_SR, "UIScene_LoadOrJoinMenu::handleInitFocus - %d , %d\n", (int)controlId, (int)childId); +} + +void UIScene_LoadOrJoinMenu::handleFocusChange(F64 controlId, F64 childId) +{ + app.DebugPrintf(app.USER_SR, "UIScene_LoadOrJoinMenu::handleFocusChange - %d , %d\n", (int)controlId, (int)childId); + + switch((int)controlId) + { + case eControl_GamesList: + m_iGameListIndex = childId; + m_buttonListGames.updateChildFocus( (int) childId ); + break; + case eControl_SavesList: + m_iSaveListIndex = childId; + m_bUpdateSaveSize = true; + break; + }; + updateTooltips(); +} + + +#ifdef SONY_REMOTE_STORAGE_DOWNLOAD +void UIScene_LoadOrJoinMenu::remoteStorageGetSaveCallback(LPVOID lpParam, SonyRemoteStorage::Status s, int error_code) +{ + app.DebugPrintf("remoteStorageGetCallback err : 0x%08x\n", error_code); + assert(error_code == 0); + ((UIScene_LoadOrJoinMenu*)lpParam)->LoadSaveFromCloud(); +} +#endif + +void UIScene_LoadOrJoinMenu::handlePress(F64 controlId, F64 childId) +{ + switch((int)controlId) + { + case eControl_SavesList: + { + m_bIgnoreInput=true; + + int lGenID = (int)childId - 1; + + //CD - Added for audio + ui.PlayUISFX(eSFX_Press); + + if((int)childId == JOIN_LOAD_CREATE_BUTTON_INDEX) + { + app.SetTutorialMode( false ); + + m_controlJoinTimer.setVisible( false ); + + app.SetCorruptSaveDeleted(false); + + CreateWorldMenuInitData *params = new CreateWorldMenuInitData(); + params->iPad = m_iPad; + ui.NavigateToScene(m_iPad,eUIScene_CreateWorldMenu,(void *)params); + } + else if (lGenID < m_generators.size()) + { + LevelGenerationOptions *levelGen = m_generators.at(lGenID); + app.SetTutorialMode( levelGen->isTutorial() ); + // Reset the autosave time + app.SetAutosaveTimerTime(); + + if(levelGen->isTutorial()) + { + LoadLevelGen(levelGen); + } + else + { + LoadMenuInitData *params = new LoadMenuInitData(); + params->iPad = m_iPad; + // need to get the iIndex from the list item, since the position in the list doesn't correspond to the GetSaveGameInfo list because of sorting + params->iSaveGameInfoIndex=-1; + //params->pbSaveRenamed=&m_bSaveRenamed; + params->levelGen = levelGen; + params->saveDetails = NULL; + + // navigate to the settings scene + ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_LoadMenu, params); + } + } + else + { +#ifdef __ORBIS__ + // check if this is a damaged save + PSAVE_INFO pSaveInfo = &m_pSaveDetails->SaveInfoA[((int)childId)-m_iDefaultButtonsC]; + if(pSaveInfo->thumbnailData == NULL && pSaveInfo->modifiedTime == 0) // no thumbnail data and time of zero and zero blocks useset for corrupt files + { + // give the option to delete the save + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + ui.RequestAlertMessage(IDS_CORRUPT_OR_DAMAGED_SAVE_TITLE, IDS_CORRUPT_OR_DAMAGED_SAVE_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&UIScene_LoadOrJoinMenu::DeleteSaveDialogReturned,this); + + } + else +#endif + { + app.SetTutorialMode( false ); + + if(app.DebugSettingsOn() && app.GetLoadSavesFromFolderEnabled()) + { + LoadSaveFromDisk(m_saves->at((int)childId-m_iDefaultButtonsC)); + } + else + { + LoadMenuInitData *params = new LoadMenuInitData(); + params->iPad = m_iPad; + // need to get the iIndex from the list item, since the position in the list doesn't correspond to the GetSaveGameInfo list because of sorting + params->iSaveGameInfoIndex=((int)childId)-m_iDefaultButtonsC; + //params->pbSaveRenamed=&m_bSaveRenamed; + params->levelGen = NULL; + params->saveDetails = &m_saveDetails[ ((int)childId)-m_iDefaultButtonsC ]; + +#ifdef _XBOX_ONE + // On XB1, saves might need syncing, in which case inform the user so they can decide whether they want to wait for this to happen + if( m_pSaveDetails->SaveInfoA[params->iSaveGameInfoIndex].needsSync ) + { + unsigned int uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_SYNC; + uiIDA[1]=IDS_CONFIRM_CANCEL; + + m_loadMenuInitData = params; + ui.RequestAlertMessage(IDS_LOAD_SAVED_WORLD, IDS_CONFIRM_SYNC_REQUIRED, uiIDA, 2, ProfileManager.GetPrimaryPad(),&NeedSyncMessageReturned,this); + } + else +#endif + { + // navigate to the settings scene + ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_LoadMenu, params); + } + } + } + } + } + break; + case eControl_GamesList: + { + m_bIgnoreInput=true; + + m_eAction = eAction_JoinGame; + + //CD - Added for audio + ui.PlayUISFX(eSFX_Press); + + { + int nIndex = (int)childId; + m_iGameListIndex = nIndex; + CheckAndJoinGame(nIndex); + } + + break; + } + } +} + +void UIScene_LoadOrJoinMenu::CheckAndJoinGame(int gameIndex) +{ + if( m_buttonListGames.getItemCount() > 0 && gameIndex < m_currentSessions->size() ) + { +#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) + // 4J-PB - is the player allowed to join games? + bool noUGC=false; + bool bContentRestricted=false; + + // we're online, since we are joining a game + ProfileManager.GetChatAndContentRestrictions(m_iPad,true,&noUGC,&bContentRestricted,NULL); + +#ifdef __ORBIS__ + // 4J Stu - On PS4 we don't restrict playing multiplayer based on chat restriction, so remove this check + noUGC = false; + + bool bPlayStationPlus=true; + int iPadWithNoPlaystationPlus=0; + bool isSignedInLive = true; + int iPadNotSignedInLive = -1; + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + if( InputManager.IsPadConnected(i) || ProfileManager.IsSignedIn(i) ) + { + if (isSignedInLive && !ProfileManager.IsSignedInLive(i)) + { + // Record the first non signed in live pad + iPadNotSignedInLive = i; + } + + isSignedInLive = isSignedInLive && ProfileManager.IsSignedInLive(i); + if(ProfileManager.HasPlayStationPlus(i)==false) + { + bPlayStationPlus=false; + break; + } + } + } +#endif +#ifdef __PSVITA__ + if( CGameNetworkManager::usingAdhocMode() ) + { + bContentRestricted = false; + noUGC = false; + } +#endif + + if(noUGC) + { + // not allowed to join +#ifndef __PSVITA__ + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + // Not allowed to play online + ui.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 ); +#endif + + m_bIgnoreInput=false; + return; + } + else if(bContentRestricted) + { + ui.RequestContentRestrictedMessageBox(); + + m_bIgnoreInput=false; + return; + } +#ifdef __ORBIS__ + // If this is an online game but not all players are signed in to Live, stop! + else if (!isSignedInLive) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + + // Check if PSN is unavailable because of age restriction + int npAvailability = ProfileManager.getNPAvailability(iPadNotSignedInLive); + if (npAvailability == SCE_NP_ERROR_AGE_RESTRICTION) + { + m_bIgnoreInput = false; + // 4J Stu - This is a bit messy and is due to the library incorrectly returning false for IsSignedInLive if the npAvailability isn't SCE_OK + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPadNotSignedInLive); + } + else + { + 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 + int32_t iResult=sceNpCommerceDialogInitialize(); + + SceNpCommerceDialogParam param; + sceNpCommerceDialogParamInitialize(¶m); + param.mode=SCE_NP_COMMERCE_DIALOG_MODE_PLUS; + param.features = SCE_NP_PLUS_FEATURE_REALTIME_MULTIPLAY; + param.userId = ProfileManager.getUserID(iPadWithNoPlaystationPlus); + + iResult=sceNpCommerceDialogOpen(¶m); + + // UINT uiIDA[2]; + // uiIDA[0]=IDS_CONFIRM_OK; + // uiIDA[1]=IDS_PLAYSTATIONPLUS_SIGNUP; + // ui.RequestMessageBox( IDS_FAILED_TO_CREATE_GAME_TITLE, IDS_NO_PLAYSTATIONPLUS, uiIDA,2,ProfileManager.GetPrimaryPad(),&UIScene_LoadOrJoinMenu::PSPlusReturned,this, app.GetStringTable(),NULL,0,false); + + m_bIgnoreInput=false; + return; + } + +#endif +#endif + + //CScene_MultiGameInfo::JoinMenuInitData *initData = new CScene_MultiGameInfo::JoinMenuInitData(); + m_initData->iPad = 0;; + m_initData->selectedSession = m_currentSessions->at( gameIndex ); + + // check that we have the texture pack available + // If it's not the default texture pack + if(m_initData->selectedSession->data.texturePackParentId!=0) + { + int texturePacksCount = Minecraft::GetInstance()->skins->getTexturePackCount(); + bool bHasTexturePackInstalled=false; + + for(int i=0;iskins->getTexturePackByIndex(i); + if(tp->getDLCParentPackId()==m_initData->selectedSession->data.texturePackParentId) + { + bHasTexturePackInstalled=true; + break; + } + } + + if(bHasTexturePackInstalled==false) + { + // upsell the texture pack + // tell sentient about the upsell of the full version of the skin pack +#ifdef _XBOX + ULONGLONG ullOfferID_Full; + app.GetDLCFullOfferIDForPackID(m_initData->selectedSession->data.texturePackParentId,&ullOfferID_Full); + + TelemetryManager->RecordUpsellPresented(m_iPad, eSet_UpsellID_Texture_DLC, ullOfferID_Full & 0xFFFFFFFF); +#endif + UINT uiIDA[2]; + + uiIDA[0]=IDS_TEXTUREPACK_FULLVERSION; + //uiIDA[1]=IDS_TEXTURE_PACK_TRIALVERSION; + uiIDA[1]=IDS_CONFIRM_CANCEL; + + + // Give the player a warning about the texture pack missing + ui.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 ); + +#ifdef _XBOX + // Reset the background downloading, in case we changed it by attempting to download a texture pack + XBackgroundDownloadSetMode(XBACKGROUND_DOWNLOAD_MODE_AUTO); +#endif + + m_bIgnoreInput=true; + ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_JoinMenu,m_initData); + } +} + +void UIScene_LoadOrJoinMenu::LoadLevelGen(LevelGenerationOptions *levelGen) +{ + // Load data from disc + //File saveFile( L"Tutorial\\Tutorial" ); + //LoadSaveFromDisk(&saveFile); + + // clear out the app's terrain features list + app.ClearTerrainFeaturePosition(); + + StorageManager.ResetSaveData(); + // Make our next save default to the name of the level + StorageManager.SetSaveTitle(levelGen->getDefaultSaveName().c_str()); + + bool isClientSide = false; + bool isPrivate = false; + // TODO int maxPlayers = MINECRAFT_NET_MAX_PLAYERS; + int maxPlayers = 8; + + if( app.GetTutorialMode() ) + { + isClientSide = false; + maxPlayers = 4; + } + + g_NetworkManager.HostGame(0,isClientSide,isPrivate,maxPlayers,0); + + NetworkGameInitData *param = new NetworkGameInitData(); + param->seed = 0; + param->saveData = NULL; + param->settings = app.GetGameHostOption( eGameHostOption_Tutorial ); + param->levelGen = levelGen; + + if(levelGen->requiresTexturePack()) + { + param->texturePackId = levelGen->getRequiredTexturePackId(); + + Minecraft *pMinecraft = Minecraft::GetInstance(); + pMinecraft->skins->selectTexturePackById(param->texturePackId); + //pMinecraft->skins->updateUI(); + } + +#ifndef _XBOX + g_NetworkManager.FakeLocalPlayerJoined(); +#endif + + LoadingInputParams *loadingParams = new LoadingInputParams(); + loadingParams->func = &CGameNetworkManager::RunNetworkGameThreadProc; + loadingParams->lpParam = (LPVOID)param; + + UIFullscreenProgressCompletionData *completionData = new UIFullscreenProgressCompletionData(); + completionData->bShowBackground=TRUE; + completionData->bShowLogo=TRUE; + completionData->type = e_ProgressCompletion_CloseAllPlayersUIScenes; + completionData->iPad = DEFAULT_XUI_MENU_USER; + loadingParams->completionData = completionData; + + ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_FullscreenProgress, loadingParams); +} + +void UIScene_LoadOrJoinMenu::UpdateGamesListCallback(LPVOID pParam) +{ + if(pParam != NULL) + { + UIScene_LoadOrJoinMenu *pScene = (UIScene_LoadOrJoinMenu *)pParam; + pScene->UpdateGamesList(); + } +} + +void UIScene_LoadOrJoinMenu::UpdateGamesList() +{ + // If we're ignoring input scene isn't active so do nothing + if (m_bIgnoreInput) return; + + // If a texture pack is loading, or will be loading, then ignore this ( we are going to be destroyed anyway) + if( Minecraft::GetInstance()->skins->getSelected()->isLoadingData() || (Minecraft::GetInstance()->skins->needsUIUpdate() || ui.IsReloadingSkin()) ) return; + + // if we're retrieving save info, don't show the list yet as we will be ignoring press events + if(!m_bSavesDisplayed) + { + return; + } + + + FriendSessionInfo *pSelectedSession = NULL; + if(DoesGamesListHaveFocus() && m_buttonListGames.getItemCount() > 0) + { + unsigned int nIndex = m_buttonListGames.getCurrentSelection(); + pSelectedSession = m_currentSessions->at( nIndex ); + } + + SessionID selectedSessionId; + ZeroMemory(&selectedSessionId,sizeof(SessionID)); + if( pSelectedSession != NULL )selectedSessionId = pSelectedSession->sessionId; + pSelectedSession = NULL; + + m_controlJoinTimer.setVisible( false ); + + // if the saves list has focus, then we should show the Delete Save tooltip + // if the games list has focus, then we should show the View Gamercard tooltip + int iRB=-1; + int iY = -1; + int iX=-1; + + delete m_currentSessions; + m_currentSessions = g_NetworkManager.GetSessionList( m_iPad, 1, m_bShowingPartyGamesOnly ); + + // Update the xui list displayed + unsigned int xuiListSize = m_buttonListGames.getItemCount(); + unsigned int filteredListSize = (unsigned int)m_currentSessions->size(); + + BOOL gamesListHasFocus = DoesGamesListHaveFocus(); + + if(filteredListSize > 0) + { +#if TO_BE_IMPLEMENTED + if( !m_pGamesList->IsEnabled() ) + { + m_pGamesList->SetEnable(TRUE); + m_pGamesList->SetCurSel( 0 ); + } +#endif + m_labelNoGames.setVisible( false ); + m_controlJoinTimer.setVisible( false ); + } + else + { +#if TO_BE_IMPLEMENTED + m_pGamesList->SetEnable(FALSE); +#endif + m_controlJoinTimer.setVisible( false ); + m_labelNoGames.setVisible( true ); + +#if TO_BE_IMPLEMENTED + if( gamesListHasFocus ) m_pGamesList->InitFocus(m_iPad); +#endif + } + + // clear out the games list and re-fill + m_buttonListGames.clearList(); + + if( filteredListSize > 0 ) + { + // Reset the focus to the selected session if it still exists + unsigned int sessionIndex = 0; + m_buttonListGames.setCurrentSelection(0); + + for( AUTO_VAR(it, m_currentSessions->begin()); it < m_currentSessions->end(); ++it) + { + FriendSessionInfo *sessionInfo = *it; + + wchar_t textureName[64] = L"\0"; + + // Is this a default game or a texture pack game? + if(sessionInfo->data.texturePackParentId!=0) + { + // Do we have the texture pack + Minecraft *pMinecraft = Minecraft::GetInstance(); + TexturePack *tp = pMinecraft->skins->getTexturePackById(sessionInfo->data.texturePackParentId); + HRESULT hr; + + DWORD dwImageBytes=0; + PBYTE pbImageData=NULL; + + if(tp==NULL) + { + DWORD dwBytes=0; + PBYTE pbData=NULL; + app.GetTPD(sessionInfo->data.texturePackParentId,&pbData,&dwBytes); + + // is it in the tpd data ? + app.GetFileFromTPD(eTPDFileType_Icon,pbData,dwBytes,&pbImageData,&dwImageBytes ); + if(dwImageBytes > 0 && pbImageData) + { + swprintf(textureName,64,L"%ls",sessionInfo->displayLabel); + registerSubstitutionTexture(textureName,pbImageData,dwImageBytes); + } + } + else + { + pbImageData = tp->getPackIcon(dwImageBytes); + if(dwImageBytes > 0 && pbImageData) + { + swprintf(textureName,64,L"%ls",sessionInfo->displayLabel); + registerSubstitutionTexture(textureName,pbImageData,dwImageBytes); + } + } + } + else + { + // default texture pack + Minecraft *pMinecraft = Minecraft::GetInstance(); + TexturePack *tp = pMinecraft->skins->getTexturePackByIndex(0); + + DWORD dwImageBytes; + PBYTE pbImageData = tp->getPackIcon(dwImageBytes); + + if(dwImageBytes > 0 && pbImageData) + { + swprintf(textureName,64,L"%ls",sessionInfo->displayLabel); + registerSubstitutionTexture(textureName,pbImageData,dwImageBytes); + } + } + + m_buttonListGames.addItem( sessionInfo->displayLabel, textureName ); + + if(memcmp( &selectedSessionId, &sessionInfo->sessionId, sizeof(SessionID) ) == 0) + { + m_buttonListGames.setCurrentSelection(sessionIndex); + break; + } + ++sessionIndex; + } + } + + updateTooltips(); +} + +void UIScene_LoadOrJoinMenu::HandleDLCMountingComplete() +{ + Initialise(); +} + +bool UIScene_LoadOrJoinMenu::DoesSavesListHaveFocus() +{ + if( m_buttonListSaves.hasFocus() ) + { + // check it's not the first or second element (new world or tutorial) + if(m_iSaveListIndex > (m_iDefaultButtonsC-1)) + { + return true; + } + } + return false; +} + +bool UIScene_LoadOrJoinMenu::DoesMashUpWorldHaveFocus() +{ + if(m_buttonListSaves.hasFocus()) + { + // check it's not the first or second element (new world or tutorial) + if(m_iSaveListIndex > (m_iDefaultButtonsC - 1)) + { + return false; + } + + if(m_iSaveListIndex > (m_iDefaultButtonsC - 1 - m_iMashUpButtonsC)) + { + return true; + } + else return false; + } + else return false; +} + +bool UIScene_LoadOrJoinMenu::DoesGamesListHaveFocus() +{ + return m_buttonListGames.hasFocus(); +} + +void UIScene_LoadOrJoinMenu::handleTimerComplete(int id) +{ + switch(id) + { + case JOIN_LOAD_ONLINE_TIMER_ID: + { +#ifdef _XBOX + XPARTY_USER_LIST partyList; + + if((XPartyGetUserList( &partyList ) != XPARTY_E_NOT_IN_PARTY ) && (partyList.dwUserCount>1)) + { + m_bInParty=true; + } + else + { + m_bInParty=false; + } +#endif + + bool bMultiplayerAllowed = ProfileManager.IsSignedInLive( m_iPad ) && ProfileManager.AllowedToPlayMultiplayer(m_iPad); + if(bMultiplayerAllowed != m_bMultiplayerAllowed) + { + if( bMultiplayerAllowed ) + { + // m_CheckboxOnline.SetEnable(TRUE); + // m_CheckboxPrivate.SetEnable(TRUE); + } + else + { + m_bInParty = false; + m_buttonListGames.clearList(); + m_controlJoinTimer.setVisible( true ); + m_labelNoGames.setVisible( false ); + } + + m_bMultiplayerAllowed = bMultiplayerAllowed; + } + } + break; + // 4J-PB - Only Xbox will not have trial DLC patched into the game +#ifdef _XBOX + case CHECKFORAVAILABLETEXTUREPACKS_TIMER_ID: + { + +#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) + for(int i=0;ichImageURL); + + if(hasRegisteredSubstitutionTexture(textureName)==false) + { + PBYTE pbImageData; + int iImageDataBytes=0; + SonyHttp::getDataFromURL(pDLCInfo->chImageURL,(void **)&pbImageData,&iImageDataBytes); + + if(iImageDataBytes!=0) + { + // set the image + registerSubstitutionTexture(textureName,pbImageData,iImageDataBytes,true); + m_iConfigA[i]=-1; + } + + } + } + } + } + + bool bAllDone=true; + for(int i=0;igetName().c_str()); + + __int64 fileSize = saveFile->length(); + FileInputStream fis(*saveFile); + byteArray ba(fileSize); + fis.read(ba); + fis.close(); + + + + bool isClientSide = false; + bool isPrivate = false; + int maxPlayers = MINECRAFT_NET_MAX_PLAYERS; + + if( app.GetTutorialMode() ) + { + isClientSide = false; + maxPlayers = 4; + } + + app.SetGameHostOption(eGameHostOption_GameType,GameType::CREATIVE->getId() ); + + g_NetworkManager.HostGame(0,isClientSide,isPrivate,maxPlayers,0); + + LoadSaveDataThreadParam *saveData = new LoadSaveDataThreadParam(ba.data, ba.length, saveFile->getName()); + + NetworkGameInitData *param = new NetworkGameInitData(); + param->seed = 0; + param->saveData = saveData; + param->settings = app.GetGameHostOption( eGameHostOption_All ); + param->savePlatform = savePlatform; + +#ifndef _XBOX + g_NetworkManager.FakeLocalPlayerJoined(); +#endif + + LoadingInputParams *loadingParams = new LoadingInputParams(); + loadingParams->func = &CGameNetworkManager::RunNetworkGameThreadProc; + loadingParams->lpParam = (LPVOID)param; + + UIFullscreenProgressCompletionData *completionData = new UIFullscreenProgressCompletionData(); + completionData->bShowBackground=TRUE; + completionData->bShowLogo=TRUE; + completionData->type = e_ProgressCompletion_CloseAllPlayersUIScenes; + completionData->iPad = DEFAULT_XUI_MENU_USER; + loadingParams->completionData = completionData; + + ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_FullscreenProgress, loadingParams); +} + +#ifdef SONY_REMOTE_STORAGE_DOWNLOAD +void UIScene_LoadOrJoinMenu::LoadSaveFromCloud() +{ + + wchar_t wFileName[128]; + mbstowcs(wFileName, app.getRemoteStorage()->getLocalFilename(), strlen(app.getRemoteStorage()->getLocalFilename())+1); // plus null + File cloudFile(wFileName); + + + StorageManager.ResetSaveData(); + + // Make our next save default to the name of the level + wchar_t wSaveName[128]; + mbstowcs(wSaveName, app.getRemoteStorage()->getSaveNameUTF8(), strlen(app.getRemoteStorage()->getSaveNameUTF8())+1); // plus null + StorageManager.SetSaveTitle(wSaveName); + + __int64 fileSize = cloudFile.length(); + FileInputStream fis(cloudFile); + byteArray ba(fileSize); + fis.read(ba); + fis.close(); + + + + bool isClientSide = false; + bool isPrivate = false; + int maxPlayers = MINECRAFT_NET_MAX_PLAYERS; + + if( app.GetTutorialMode() ) + { + isClientSide = false; + maxPlayers = 4; + } + + app.SetGameHostOption(eGameHostOption_All, app.getRemoteStorage()->getSaveHostOptions() ); + + g_NetworkManager.HostGame(0,isClientSide,isPrivate,maxPlayers,0); + + LoadSaveDataThreadParam *saveData = new LoadSaveDataThreadParam(ba.data, ba.length, cloudFile.getName()); + + NetworkGameInitData *param = new NetworkGameInitData(); + param->seed = app.getRemoteStorage()->getSaveSeed(); + param->saveData = saveData; + param->settings = app.GetGameHostOption( eGameHostOption_All ); + param->savePlatform = app.getRemoteStorage()->getSavePlatform(); + param->texturePackId = app.getRemoteStorage()->getSaveTexturePack(); + +#ifndef _XBOX + g_NetworkManager.FakeLocalPlayerJoined(); +#endif + + LoadingInputParams *loadingParams = new LoadingInputParams(); + loadingParams->func = &CGameNetworkManager::RunNetworkGameThreadProc; + loadingParams->lpParam = (LPVOID)param; + + UIFullscreenProgressCompletionData *completionData = new UIFullscreenProgressCompletionData(); + completionData->bShowBackground=TRUE; + completionData->bShowLogo=TRUE; + completionData->type = e_ProgressCompletion_CloseAllPlayersUIScenes; + completionData->iPad = DEFAULT_XUI_MENU_USER; + loadingParams->completionData = completionData; + + ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_FullscreenProgress, loadingParams); +} + +#endif //SONY_REMOTE_STORAGE_DOWNLOAD + +int UIScene_LoadOrJoinMenu::DeleteSaveDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + UIScene_LoadOrJoinMenu* pClass = (UIScene_LoadOrJoinMenu*)pParam; + // results switched for this dialog + + // Check that we have a valid save selected (can get a bad index if the save list has been refreshed) + bool validSelection= pClass->m_iDefaultButtonsC != 0 && pClass->m_iSaveListIndex >= pClass->m_iDefaultButtonsC; + + if(result==C4JStorage::EMessage_ResultDecline && validSelection) + { + if(app.DebugSettingsOn() && app.GetLoadSavesFromFolderEnabled()) + { + pClass->m_bIgnoreInput=false; + } + else + { + StorageManager.DeleteSaveData(&pClass->m_pSaveDetails->SaveInfoA[pClass->m_iSaveListIndex - pClass->m_iDefaultButtonsC], UIScene_LoadOrJoinMenu::DeleteSaveDataReturned, (LPVOID)pClass->GetCallbackUniqueId()); + pClass->m_controlSavesTimer.setVisible( true ); + } + } + else + { + pClass->m_bIgnoreInput=false; + } + + return 0; +} + +int UIScene_LoadOrJoinMenu::DeleteSaveDataReturned(LPVOID lpParam,bool bRes) +{ + ui.EnterCallbackIdCriticalSection(); + UIScene_LoadOrJoinMenu* pClass = (UIScene_LoadOrJoinMenu*)ui.GetSceneFromCallbackId((size_t)lpParam); + + if(pClass) + { + if(bRes) + { + // wipe the list and repopulate it + pClass->m_iState=e_SavesRepopulateAfterDelete; + } + else pClass->m_bIgnoreInput=false; + + pClass->updateTooltips(); + } + ui.LeaveCallbackIdCriticalSection(); + return 0; +} + + +int UIScene_LoadOrJoinMenu::RenameSaveDataReturned(LPVOID lpParam,bool bRes) +{ + UIScene_LoadOrJoinMenu* pClass = (UIScene_LoadOrJoinMenu*)lpParam; + + if(bRes) + { + pClass->m_iState=e_SavesRepopulate; + } + else pClass->m_bIgnoreInput=false; + + pClass->updateTooltips(); + + return 0; +} + +#ifdef __ORBIS__ + + +void UIScene_LoadOrJoinMenu::LoadRemoteFileFromDisk(char* remoteFilename) +{ + wchar_t wSaveName[128]; + mbstowcs(wSaveName, remoteFilename, strlen(remoteFilename)+1); // plus null + + // processConsoleSave(wSaveName, L"ProcessedSave.bin"); + + // File remoteFile(L"ProcessedSave.bin"); + File remoteFile(wSaveName); + LoadSaveFromDisk(&remoteFile, SAVE_FILE_PLATFORM_PS3); +} +#endif + + +int UIScene_LoadOrJoinMenu::SaveOptionsDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + UIScene_LoadOrJoinMenu* pClass = (UIScene_LoadOrJoinMenu*)pParam; + + // results switched for this dialog + // EMessage_ResultAccept means cancel + switch(result) + { + case C4JStorage::EMessage_ResultDecline: // rename + { + pClass->m_bIgnoreInput=true; +#ifdef _DURANGO + // bring up a keyboard + InputManager.RequestKeyboard(app.GetString(IDS_RENAME_WORLD_TITLE), (pClass->m_saveDetails[pClass->m_iSaveListIndex-pClass->m_iDefaultButtonsC]).UTF16SaveName,(DWORD)0,25,&UIScene_LoadOrJoinMenu::KeyboardCompleteWorldNameCallback,pClass,C_4JInput::EKeyboardMode_Default); +#else + // bring up a keyboard + wchar_t wSaveName[128]; + //CD - Fix - We must memset the SaveName + ZeroMemory(wSaveName, 128 * sizeof(wchar_t) ); + mbstowcs(wSaveName, pClass->m_saveDetails[pClass->m_iSaveListIndex - pClass->m_iDefaultButtonsC].UTF8SaveName, strlen(pClass->m_saveDetails->UTF8SaveName)+1); // plus null + LPWSTR ptr = wSaveName; + InputManager.RequestKeyboard(app.GetString(IDS_RENAME_WORLD_TITLE),wSaveName,(DWORD)0,25,&UIScene_LoadOrJoinMenu::KeyboardCompleteWorldNameCallback,pClass,C_4JInput::EKeyboardMode_Default); +#endif + } + break; + + case C4JStorage::EMessage_ResultThirdOption: // delete - + { + // delete the save game + // Have to ask the player if they are sure they want to delete this game + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + ui.RequestAlertMessage(IDS_TOOLTIPS_DELETESAVE, IDS_TEXT_DELETE_SAVE, uiIDA, 2, iPad,&UIScene_LoadOrJoinMenu::DeleteSaveDialogReturned,pClass); + } + break; + +#ifdef SONY_REMOTE_STORAGE_UPLOAD + case C4JStorage::EMessage_ResultFourthOption: // upload to cloud + { + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_OK; + uiIDA[1]=IDS_CONFIRM_CANCEL; + + ui.RequestAlertMessage(IDS_TOOLTIPS_SAVETRANSFER_UPLOAD, IDS_SAVE_TRANSFER_TEXT, uiIDA, 2, iPad,&UIScene_LoadOrJoinMenu::SaveTransferDialogReturned,pClass); + } + break; +#endif // SONY_REMOTE_STORAGE_UPLOAD +#if defined _XBOX_ONE || defined __ORBIS__ + case C4JStorage::EMessage_ResultFourthOption: // copy save + { + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_OK; + uiIDA[1]=IDS_CONFIRM_CANCEL; + + ui.RequestAlertMessage(IDS_COPYSAVE, IDS_TEXT_COPY_SAVE, uiIDA, 2, iPad,&UIScene_LoadOrJoinMenu::CopySaveDialogReturned,pClass); + } + break; +#endif + + case C4JStorage::EMessage_Cancelled: + default: + { + // reset the tooltips + pClass->updateTooltips(); + pClass->m_bIgnoreInput=false; + } + break; + } + 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; + + // Exit with or without saving + if(result==C4JStorage::EMessage_ResultAccept) + { + // we need to enable background downloading for the DLC + XBackgroundDownloadSetMode(XBACKGROUND_DOWNLOAD_MODE_ALWAYS_ALLOW); +#if 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 + + 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); + } + } + } +#endif + + +#if defined _XBOX_ONE + if(ProfileManager.IsSignedIn(iPad)) + { + if (ProfileManager.IsSignedInLive(iPad)) + { + wstring ProductId; + app.GetDLCFullOfferIDForPackID(pClass->m_initData->selectedSession->data.texturePackParentId,ProductId); + + StorageManager.InstallOffer(1,(WCHAR *)ProductId.c_str(),NULL,NULL); + } + else + { + // 4J-JEV: Fix for XB1: #165863 - XR-074: Compliance: With no active network connection user is unable to convert from Trial to Full texture pack and is not messaged why. + UINT uiIDA[1] = { IDS_CONFIRM_OK }; + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1, iPad); + } + } +#endif + + } + pClass->m_bIgnoreInput=false; + return 0; +} + +#if defined __PS3__ || defined __PSVITA__ || defined __ORBIS__ +int UIScene_LoadOrJoinMenu::MustSignInReturnedPSN(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + UIScene_LoadOrJoinMenu* pClass = (UIScene_LoadOrJoinMenu*)pParam; + + if(result==C4JStorage::EMessage_ResultAccept) + { +#if defined(__PS3__) + SQRNetworkManager_PS3::AttemptPSNSignIn(&UIScene_LoadOrJoinMenu::PSN_SignInReturned, pClass); +#elif defined __PSVITA__ + SQRNetworkManager_Vita::AttemptPSNSignIn(&UIScene_LoadOrJoinMenu::PSN_SignInReturned, pClass); +#else + SQRNetworkManager_Orbis::AttemptPSNSignIn(&UIScene_LoadOrJoinMenu::PSN_SignInReturned, pClass, false, iPad); +#endif + } + else + { + pClass->m_bIgnoreInput = false; + } + + return 0; +} + +int UIScene_LoadOrJoinMenu::PSN_SignInReturned(void *pParam,bool bContinue, int iPad) +{ + UIScene_LoadOrJoinMenu* pClass = (UIScene_LoadOrJoinMenu*)pParam; + if(bContinue==true) + { + switch(pClass->m_eAction) + { + case eAction_ViewInvites: + // Check if we're signed in to LIVE + if(ProfileManager.IsSignedInLive(iPad)) + { +#if defined(__PS3__) + int ret = sceNpBasicRecvMessageCustom(SCE_NP_BASIC_MESSAGE_MAIN_TYPE_INVITE, SCE_NP_BASIC_RECV_MESSAGE_OPTIONS_INCLUDE_BOOTABLE, SYS_MEMORY_CONTAINER_ID_INVALID); + app.DebugPrintf("sceNpBasicRecvMessageCustom return %d ( %08x )\n", ret, ret); +#elif defined __PSVITA__ + SQRNetworkManager_Vita::RecvInviteGUI(); +#else + SQRNetworkManager_Orbis::RecvInviteGUI(); +#endif + } + break; + case eAction_JoinGame: + pClass->CheckAndJoinGame(pClass->m_iGameListIndex); + break; + } + } + else + { + pClass->m_bIgnoreInput = false; + } + return 0; +} +#endif + +#ifdef SONY_REMOTE_STORAGE_DOWNLOAD + +void UIScene_LoadOrJoinMenu::LaunchSaveTransfer() +{ + LoadingInputParams *loadingParams = new LoadingInputParams(); + loadingParams->func = &UIScene_LoadOrJoinMenu::DownloadSonyCrossSaveThreadProc; + loadingParams->lpParam = (LPVOID)this; + + UIFullscreenProgressCompletionData *completionData = new UIFullscreenProgressCompletionData(); + completionData->bShowBackground=TRUE; + completionData->bShowLogo=TRUE; + completionData->type = e_ProgressCompletion_NavigateBackToScene; + completionData->iPad = DEFAULT_XUI_MENU_USER; + loadingParams->completionData = completionData; + + loadingParams->cancelFunc=&UIScene_LoadOrJoinMenu::CancelSaveTransferCallback; + loadingParams->m_cancelFuncParam=this; + loadingParams->cancelText=IDS_TOOLTIPS_CANCEL; + + ui.NavigateToScene(m_iPad,eUIScene_FullscreenProgress, loadingParams); +} + + + + +int UIScene_LoadOrJoinMenu::CreateDummySaveDataCallback(LPVOID lpParam,bool bRes) +{ + UIScene_LoadOrJoinMenu* pClass = (UIScene_LoadOrJoinMenu *) lpParam; + if(bRes) + { + pClass->m_eSaveTransferState = eSaveTransfer_GetSavesInfo; + } + else + { + pClass->m_eSaveTransferState = eSaveTransfer_Error; + app.DebugPrintf("CreateDummySaveDataCallback failed\n"); + + } + return 0; +} + +int UIScene_LoadOrJoinMenu::CrossSaveGetSavesInfoCallback(LPVOID lpParam, SAVE_DETAILS *pSaveDetails, bool bRes) +{ + UIScene_LoadOrJoinMenu* pClass = (UIScene_LoadOrJoinMenu *) lpParam; + if(bRes) + { + pClass->m_eSaveTransferState = eSaveTransfer_GetFileData; + } + else + { + pClass->m_eSaveTransferState = eSaveTransfer_Error; + app.DebugPrintf("CrossSaveGetSavesInfoCallback failed\n"); + } + return 0; +} + +int UIScene_LoadOrJoinMenu::LoadCrossSaveDataCallback( void *pParam,bool bIsCorrupt, bool bIsOwner ) +{ + UIScene_LoadOrJoinMenu* pClass = (UIScene_LoadOrJoinMenu *) pParam; + if(bIsCorrupt == false && bIsOwner) + { + pClass->m_eSaveTransferState = eSaveTransfer_CreatingNewSave; + } + else + { + pClass->m_eSaveTransferState = eSaveTransfer_Error; + app.DebugPrintf("LoadCrossSaveDataCallback failed \n"); + + } + return 0; +} + +int UIScene_LoadOrJoinMenu::CrossSaveFinishedCallback(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + UIScene_LoadOrJoinMenu* pClass = (UIScene_LoadOrJoinMenu *) pParam; + pClass->m_eSaveTransferState = eSaveTransfer_Idle; + return 0; +} + + +int UIScene_LoadOrJoinMenu::CrossSaveDeleteOnErrorReturned(LPVOID lpParam,bool bRes) +{ + UIScene_LoadOrJoinMenu* pClass = (UIScene_LoadOrJoinMenu *) lpParam; + pClass->m_eSaveTransferState = eSaveTransfer_ErrorMesssage; + return 0; +} + +int UIScene_LoadOrJoinMenu::RemoteSaveNotFoundCallback(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + UIScene_LoadOrJoinMenu* pClass = (UIScene_LoadOrJoinMenu *) pParam; + pClass->m_eSaveTransferState = eSaveTransfer_Idle; + return 0; +} + +// MGH - added this global to force the delete of the previous data, for the remote storage saves +// need to speak to Chris why this is necessary +bool g_bForceVitaSaveWipe = false; + + +int UIScene_LoadOrJoinMenu::DownloadSonyCrossSaveThreadProc( LPVOID lpParameter ) +{ + 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; + wchar_t wSaveName[128]; + + // get the save file size + pMinecraft->progressRenderer->progressStagePercentage(0); + pMinecraft->progressRenderer->progressStart(IDS_TOOLTIPS_SAVETRANSFER_DOWNLOAD); + pMinecraft->progressRenderer->progressStage( IDS_TOOLTIPS_SAVETRANSFER_DOWNLOAD ); + + ConsoleSaveFile* pSave = NULL; + + pClass->m_eSaveTransferState = eSaveTransfer_GetRemoteSaveInfo; + + + while(pClass->m_eSaveTransferState!=eSaveTransfer_Idle) + { + switch(pClass->m_eSaveTransferState) + { + case eSaveTransfer_Idle: + break; + case eSaveTransfer_GetRemoteSaveInfo: + app.DebugPrintf("UIScene_LoadOrJoinMenu getSaveInfo\n"); + app.getRemoteStorage()->getSaveInfo(); + pClass->m_eSaveTransferState = eSaveTransfer_GettingRemoteSaveInfo; + break; + case eSaveTransfer_GettingRemoteSaveInfo: + if(pClass->m_saveTransferDownloadCancelled) + { + pClass->m_eSaveTransferState = eSaveTransfer_Error; + break; + } + if(app.getRemoteStorage()->waitingForSaveInfo() == false) + { + if(app.getRemoteStorage()->saveIsAvailable()) + { + 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 + { + // no save available, inform the user about the functionality + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestAlertMessage(IDS_TOOLTIPS_SAVETRANSFER_DOWNLOAD, IDS_SAVE_TRANSFER_NOT_AVAILABLE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad(),RemoteSaveNotFoundCallback,pClass); + } + } + break; + case eSaveTransfer_CreateDummyFile: + { + StorageManager.ResetSaveData(); + byte *compData = (byte *)StorageManager.AllocateSaveData( app.getRemoteStorage()->getSaveFilesize() ); + // Make our next save default to the name of the level + const char* pNameUTF8 = app.getRemoteStorage()->getSaveNameUTF8(); + mbstowcs(wSaveName, pNameUTF8, strlen(pNameUTF8)+1); // plus null + StorageManager.SetSaveTitle(wSaveName); + PBYTE pbThumbnailData=NULL; + DWORD dwThumbnailDataSize=0; + + PBYTE pbDataSaveImage=NULL; + DWORD dwDataSizeSaveImage=0; + + StorageManager.GetDefaultSaveImage(&pbDataSaveImage, &dwDataSizeSaveImage); // Get the default save thumbnail (as set by SetDefaultImages) for use on saving games t + StorageManager.GetDefaultSaveThumbnail(&pbThumbnailData,&dwThumbnailDataSize); // Get the default save image (as set by SetDefaultImages) for use on saving games that + + BYTE bTextMetadata[88]; + ZeroMemory(bTextMetadata,88); + 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); + + app.getRemoteStorage()->waitForStorageManagerIdle(); + C4JStorage::ESaveGameState saveState = StorageManager.SaveSaveData( &UIScene_LoadOrJoinMenu::CreateDummySaveDataCallback, lpParameter ); + if(saveState == C4JStorage::ESaveGame_Save) + { + pClass->m_eSaveTransferState = eSaveTransfer_CreatingDummyFile; + } + else + { + app.DebugPrintf("Failed to create dummy save file\n"); + pClass->m_eSaveTransferState = eSaveTransfer_Error; + } + } + break; + case eSaveTransfer_CreatingDummyFile: + break; + case eSaveTransfer_GetSavesInfo: + { + // we can't cancel here, we need the saves info so we can delete the file + if(pClass->m_saveTransferDownloadCancelled) + { + WCHAR wcTemp[256]; + swprintf(wcTemp,256, app.GetString(IDS_CANCEL)); // MGH - should change this string to "cancelling download" + m_wstrStageText=wcTemp; + pMinecraft->progressRenderer->progressStage( m_wstrStageText ); + } + + app.getRemoteStorage()->waitForStorageManagerIdle(); + app.DebugPrintf("CALL GetSavesInfo B\n"); + C4JStorage::ESaveGameState eSGIStatus= StorageManager.GetSavesInfo(pClass->m_iPad,&UIScene_LoadOrJoinMenu::CrossSaveGetSavesInfoCallback,pClass,"save"); + pClass->m_eSaveTransferState = eSaveTransfer_GettingSavesInfo; + } + break; + case eSaveTransfer_GettingSavesInfo: + if(pClass->m_saveTransferDownloadCancelled) + { + WCHAR wcTemp[256]; + swprintf(wcTemp,256, app.GetString(IDS_CANCEL)); // MGH - should change this string to "cancelling download" + m_wstrStageText=wcTemp; + pMinecraft->progressRenderer->progressStage( m_wstrStageText ); + } + break; + + case eSaveTransfer_GetFileData: + { + bSaveFileCreated = true; + StorageManager.GetSaveUniqueFileDir(pClass->m_downloadedUniqueFilename); + + if(pClass->m_saveTransferDownloadCancelled) + { + pClass->m_eSaveTransferState = eSaveTransfer_Error; + break; + } + PSAVE_DETAILS pSaveDetails=StorageManager.ReturnSavesInfo(); + int idx = pClass->m_iSaveListIndex - pClass->m_iDefaultButtonsC; + app.getRemoteStorage()->waitForStorageManagerIdle(); + bool bGettingOK = app.getRemoteStorage()->getSaveData(pClass->m_downloadedUniqueFilename, SaveTransferReturned, pClass); + if(bGettingOK) + { + pClass->m_eSaveTransferState = eSaveTransfer_GettingFileData; + } + else + { + pClass->m_eSaveTransferState = eSaveTransfer_Error; + app.DebugPrintf("app.getRemoteStorage()->getSaveData failed\n"); + + } + } + + case eSaveTransfer_GettingFileData: + { + WCHAR wcTemp[256]; + + int dataProgress = app.getRemoteStorage()->getDataProgress(); + pMinecraft->progressRenderer->progressStagePercentage(dataProgress); + + //swprintf(wcTemp, 256, L"Downloading data : %d", dataProgress);//app.GetString(IDS_SAVETRANSFER_STAGE_GET_DATA),0,pClass->m_ulFileSize); + swprintf(wcTemp,256, app.GetString(IDS_SAVETRANSFER_STAGE_GET_DATA),dataProgress); + m_wstrStageText=wcTemp; + pMinecraft->progressRenderer->progressStage( m_wstrStageText ); + if(pClass->m_saveTransferDownloadCancelled && bAbortCalled == false) + { + app.getRemoteStorage()->abort(); + bAbortCalled = true; + } + } + break; + case eSaveTransfer_FileDataRetrieved: + pClass->m_eSaveTransferState = eSaveTransfer_LoadSaveFromDisc; + break; + case eSaveTransfer_LoadSaveFromDisc: + { + if(pClass->m_saveTransferDownloadCancelled) + { + pClass->m_eSaveTransferState = eSaveTransfer_Error; + break; + } + + PSAVE_DETAILS pSaveDetails=StorageManager.ReturnSavesInfo(); + int saveInfoIndex = -1; + for(int i=0;iiSaveC;i++) + { + if(strcmp(pSaveDetails->SaveInfoA[i].UTF8SaveFilename, pClass->m_downloadedUniqueFilename) == 0) + { + //found it + saveInfoIndex = i; + } + } + if(saveInfoIndex == -1) + { + pClass->m_eSaveTransferState = eSaveTransfer_Error; + app.DebugPrintf("CrossSaveGetSavesInfoCallback failed - couldn't find save\n"); + } + else + { +#ifdef __PS3__ + // ignore the CRC on PS3 + C4JStorage::ESaveGameState eLoadStatus=StorageManager.LoadSaveData(&pSaveDetails->SaveInfoA[saveInfoIndex],&LoadCrossSaveDataCallback,pClass, true); +#else + C4JStorage::ESaveGameState eLoadStatus=StorageManager.LoadSaveData(&pSaveDetails->SaveInfoA[saveInfoIndex],&LoadCrossSaveDataCallback,pClass); +#endif + if(eLoadStatus == C4JStorage::ESaveGame_Load) + { + pClass->m_eSaveTransferState = eSaveTransfer_LoadingSaveFromDisc; + } + else + { + pClass->m_eSaveTransferState = eSaveTransfer_Error; + } + } + } + break; + case eSaveTransfer_LoadingSaveFromDisc: + + break; + case eSaveTransfer_CreatingNewSave: + { + unsigned int fileSize = StorageManager.GetSaveSize(); + byteArray ba(fileSize); + StorageManager.GetSaveData(ba.data, &fileSize); + assert(ba.length == fileSize); + + + StorageManager.ResetSaveData(); + { + PBYTE pbThumbnailData=NULL; + DWORD dwThumbnailDataSize=0; + + PBYTE pbDataSaveImage=NULL; + DWORD dwDataSizeSaveImage=0; + + StorageManager.GetDefaultSaveImage(&pbDataSaveImage, &dwDataSizeSaveImage); // Get the default save thumbnail (as set by SetDefaultImages) for use on saving games t + StorageManager.GetDefaultSaveThumbnail(&pbThumbnailData,&dwThumbnailDataSize); // Get the default save image (as set by SetDefaultImages) for use on saving games that + + BYTE bTextMetadata[88]; + ZeroMemory(bTextMetadata,88); + 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); + } + + +#ifdef SPLIT_SAVES + ConsoleSaveFileOriginal oldFormatSave( wSaveName, ba.data, ba.length, false, app.getRemoteStorage()->getSavePlatform() ); + pSave = new ConsoleSaveFileSplit( &oldFormatSave, false, pMinecraft->progressRenderer ); + + pMinecraft->progressRenderer->progressStage(IDS_SAVETRANSFER_STAGE_SAVING); + pSave->Flush(false,false); + pClass->m_eSaveTransferState = eSaveTransfer_Saving; +#else + pSave = new ConsoleSaveFileOriginal( wSaveName, ba.data, ba.length, false, app.getRemoteStorage()->getSavePlatform() ); + pClass->m_eSaveTransferState = eSaveTransfer_Converting; + pMinecraft->progressRenderer->progressStage(IDS_SAVETRANSFER_STAGE_CONVERTING); +#endif + delete ba.data; + } + break; + case eSaveTransfer_Converting: + { + pSave->ConvertToLocalPlatform(); // check if we need to convert this file from PS3->PS4 + pClass->m_eSaveTransferState = eSaveTransfer_Saving; + pMinecraft->progressRenderer->progressStage(IDS_SAVETRANSFER_STAGE_SAVING); + StorageManager.SetSaveTitle(wSaveName); + StorageManager.SetSaveUniqueFilename(pClass->m_downloadedUniqueFilename); + + app.getRemoteStorage()->waitForStorageManagerIdle(); // we need to wait for the save system to be idle here, as Flush doesn't check for it. + pSave->Flush(false, false); + } + break; + case eSaveTransfer_Saving: + { + // On Durango/Orbis, we need to wait for all the asynchronous saving processes to complete before destroying the levels, as that will ultimately delete + // the directory level storage & therefore the ConsoleSaveSplit instance, which needs to be around until all the sub files have completed saving. +#if defined(_DURANGO) || defined(__ORBIS__) + while(StorageManager.GetSaveState() != C4JStorage::ESaveGame_Idle ) + { + Sleep(10); + StorageManager.Tick(); + } +#endif + + delete pSave; + + + pMinecraft->progressRenderer->progressStage(IDS_PROGRESS_SAVING_TO_DISC); + pClass->m_eSaveTransferState = eSaveTransfer_Succeeded; + } + break; + + case eSaveTransfer_Succeeded: + { + // if we've arrived here, the save has been created successfully + pClass->m_iState=e_SavesRepopulate; + pClass->updateTooltips(); + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + app.getRemoteStorage()->waitForStorageManagerIdle(); // wait for everything to complete before we hand control back to the player + ui.RequestErrorMessage( IDS_TOOLTIPS_SAVETRANSFER_DOWNLOAD, IDS_SAVE_TRANSFER_DOWNLOADCOMPLETE, uiIDA,1,ProfileManager.GetPrimaryPad(),CrossSaveFinishedCallback,pClass); + pClass->m_eSaveTransferState = eSaveTransfer_Finished; + } + break; + + case eSaveTransfer_Cancelled: // this is no longer used + { + assert(0); //pClass->m_eSaveTransferState = eSaveTransfer_Idle; + } + break; + case eSaveTransfer_Error: + { + if(bSaveFileCreated) + { + if(pClass->m_saveTransferDownloadCancelled) + { + WCHAR wcTemp[256]; + swprintf(wcTemp,256, app.GetString(IDS_CANCEL)); // MGH - should change this string to "cancelling download" + m_wstrStageText=wcTemp; + pMinecraft->progressRenderer->progressStage( m_wstrStageText ); + pMinecraft->progressRenderer->progressStage( m_wstrStageText ); + } + // if the save file has already been created we have to delete it again if there's been an error + PSAVE_DETAILS pSaveDetails=StorageManager.ReturnSavesInfo(); + int saveInfoIndex = -1; + for(int i=0;iiSaveC;i++) + { + if(strcmp(pSaveDetails->SaveInfoA[i].UTF8SaveFilename, pClass->m_downloadedUniqueFilename) == 0) + { + //found it + saveInfoIndex = i; + } + } + if(saveInfoIndex == -1) + { + app.DebugPrintf("eSaveTransfer_Error failed - couldn't find save\n"); + assert(0); + pClass->m_eSaveTransferState = eSaveTransfer_ErrorMesssage; + } + else + { + // delete the save file + app.getRemoteStorage()->waitForStorageManagerIdle(); + C4JStorage::ESaveGameState eDeleteStatus = StorageManager.DeleteSaveData(&pSaveDetails->SaveInfoA[saveInfoIndex],UIScene_LoadOrJoinMenu::CrossSaveDeleteOnErrorReturned,pClass); + if(eDeleteStatus == C4JStorage::ESaveGame_Delete) + { + pClass->m_eSaveTransferState = eSaveTransfer_ErrorDeletingSave; + } + else + { + app.DebugPrintf("StorageManager.DeleteSaveData failed!!\n"); + pClass->m_eSaveTransferState = eSaveTransfer_ErrorMesssage; + } + } + } + else + { + pClass->m_eSaveTransferState = eSaveTransfer_ErrorMesssage; + } + } + break; + + case eSaveTransfer_ErrorDeletingSave: + break; + case eSaveTransfer_ErrorMesssage: + { + app.getRemoteStorage()->waitForStorageManagerIdle(); // wait for everything to complete before we hand control back to the player + if(pClass->m_saveTransferDownloadCancelled) + { + pClass->m_eSaveTransferState = eSaveTransfer_Idle; + } + else + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + 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. + pClass->m_iState=e_SavesRepopulateAfterDelete; + else + pClass->m_iState=e_SavesRepopulate; + pClass->updateTooltips(); + } + break; + case eSaveTransfer_Finished: + { + } + // waiting to dismiss the dialog + break; + } + Sleep(50); + } + m_bSaveTransferRunning = false; +#ifdef __PS3__ + StorageManager.SetSaveTransferInProgress(false); +#endif + return 0; + +} + +void UIScene_LoadOrJoinMenu::SaveTransferReturned(LPVOID lpParam, SonyRemoteStorage::Status s, int error_code) +{ + UIScene_LoadOrJoinMenu* pClass = (UIScene_LoadOrJoinMenu *) lpParam; + + if(s == SonyRemoteStorage::e_getDataSucceeded) + { + pClass->m_eSaveTransferState = eSaveTransfer_FileDataRetrieved; + } + else + { + pClass->m_eSaveTransferState = eSaveTransfer_Error; + app.DebugPrintf("SaveTransferReturned failed with error code : 0x%08x\n", error_code); + } + +} +ConsoleSaveFile* UIScene_LoadOrJoinMenu::SonyCrossSaveConvert() +{ + return NULL; +} + +void UIScene_LoadOrJoinMenu::CancelSaveTransferCallback(LPVOID lpParam) +{ + UIScene_LoadOrJoinMenu* pClass = (UIScene_LoadOrJoinMenu *) lpParam; + pClass->m_saveTransferDownloadCancelled = true; + ui.SetTooltips( DEFAULT_XUI_MENU_USER, -1, -1, -1, -1,-1,-1,-1,-1); // MGH - added - remove the "cancel" tooltip, so the player knows it's underway (really needs a "cancelling" message) +} + +#endif + + + +#ifdef SONY_REMOTE_STORAGE_UPLOAD + +void UIScene_LoadOrJoinMenu::LaunchSaveUpload() +{ + LoadingInputParams *loadingParams = new LoadingInputParams(); + loadingParams->func = &UIScene_LoadOrJoinMenu::UploadSonyCrossSaveThreadProc; + loadingParams->lpParam = (LPVOID)this; + + UIFullscreenProgressCompletionData *completionData = new UIFullscreenProgressCompletionData(); + completionData->bShowBackground=TRUE; + completionData->bShowLogo=TRUE; + completionData->type = e_ProgressCompletion_NavigateBackToScene; + completionData->iPad = DEFAULT_XUI_MENU_USER; + loadingParams->completionData = completionData; + +// 4J-PB - Waiting for Sony to fix canceling a save upload + loadingParams->cancelFunc=&UIScene_LoadOrJoinMenu::CancelSaveUploadCallback; + loadingParams->m_cancelFuncParam = this; + loadingParams->cancelText=IDS_TOOLTIPS_CANCEL; + + ui.NavigateToScene(m_iPad,eUIScene_FullscreenProgress, loadingParams); + +} + +int UIScene_LoadOrJoinMenu::CrossSaveUploadFinishedCallback(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + UIScene_LoadOrJoinMenu* pClass = (UIScene_LoadOrJoinMenu *) pParam; + pClass->m_eSaveUploadState = eSaveUpload_Idle; + + return 0; +} + + +int UIScene_LoadOrJoinMenu::UploadSonyCrossSaveThreadProc( LPVOID lpParameter ) +{ + UIScene_LoadOrJoinMenu* pClass = (UIScene_LoadOrJoinMenu *) lpParameter; + pClass->m_saveTransferUploadCancelled = false; + bool bAbortCalled = false; + Minecraft *pMinecraft=Minecraft::GetInstance(); + + // get the save file size + pMinecraft->progressRenderer->progressStagePercentage(0); + pMinecraft->progressRenderer->progressStart(IDS_TOOLTIPS_SAVETRANSFER_UPLOAD); + pMinecraft->progressRenderer->progressStage( IDS_TOOLTIPS_SAVETRANSFER_UPLOAD ); + + PSAVE_DETAILS pSaveDetails=StorageManager.ReturnSavesInfo(); + int idx = pClass->m_iSaveListIndex - pClass->m_iDefaultButtonsC; + bool bSettingOK = app.getRemoteStorage()->setSaveData(&pSaveDetails->SaveInfoA[idx], SaveUploadReturned, pClass); + + if(bSettingOK) + { + pClass->m_eSaveUploadState = eSaveUpload_UploadingFileData; + pMinecraft->progressRenderer->progressStagePercentage(0); + } + else + { + pClass->m_eSaveUploadState = eSaveUpload_Error; + } + + while(pClass->m_eSaveUploadState!=eSaveUpload_Idle) + { + switch(pClass->m_eSaveUploadState) + { + case eSaveUpload_Idle: + break; + case eSaveUpload_UploadingFileData: + { + WCHAR wcTemp[256]; + int dataProgress = app.getRemoteStorage()->getDataProgress(); + pMinecraft->progressRenderer->progressStagePercentage(dataProgress); + + //swprintf(wcTemp, 256, L"Uploading data : %d", dataProgress);//app.GetString(IDS_SAVETRANSFER_STAGE_GET_DATA),0,pClass->m_ulFileSize); + swprintf(wcTemp,256, app.GetString(IDS_SAVETRANSFER_STAGE_PUT_DATA),dataProgress); + + m_wstrStageText=wcTemp; + pMinecraft->progressRenderer->progressStage( m_wstrStageText ); +// 4J-PB - Waiting for Sony to fix canceling a save upload + if(pClass->m_saveTransferUploadCancelled && bAbortCalled == false) + { + // we only really want to be able to cancel during the download of data, if it's taking a long time + app.getRemoteStorage()->abort(); + bAbortCalled = true; + } + } + break; + case eSaveUpload_FileDataUploaded: + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestErrorMessage( IDS_TOOLTIPS_SAVETRANSFER_UPLOAD, IDS_SAVE_TRANSFER_UPLOADCOMPLETE, uiIDA,1,ProfileManager.GetPrimaryPad(),CrossSaveUploadFinishedCallback,pClass); + pClass->m_eSaveUploadState = esaveUpload_Finished; + } + break; + case eSaveUpload_Cancelled: // this is no longer used + assert(0);// pClass->m_eSaveUploadState = eSaveUpload_Idle; + break; + case eSaveUpload_Error: + { + if(pClass->m_saveTransferUploadCancelled) + { + pClass->m_eSaveUploadState = eSaveUpload_Idle; + } + else + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestErrorMessage( IDS_TOOLTIPS_SAVETRANSFER_UPLOAD, IDS_SAVE_TRANSFER_UPLOADFAILED, uiIDA,1,ProfileManager.GetPrimaryPad(),CrossSaveUploadFinishedCallback,pClass); + pClass->m_eSaveUploadState = esaveUpload_Finished; + } + } + break; + case esaveUpload_Finished: + // waiting for dialog to be dismissed + break; + } + Sleep(50); + } + + return 0; + +} + +void UIScene_LoadOrJoinMenu::SaveUploadReturned(LPVOID lpParam, SonyRemoteStorage::Status s, int error_code) +{ + UIScene_LoadOrJoinMenu* pClass = (UIScene_LoadOrJoinMenu *) lpParam; + + if(pClass->m_saveTransferUploadCancelled) + { + UINT uiIDA[1] = { IDS_CONFIRM_OK }; + ui.RequestErrorMessage( IDS_CANCEL_UPLOAD_TITLE, IDS_CANCEL_UPLOAD_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad(), CrossSaveUploadFinishedCallback, pClass ); + pClass->m_eSaveUploadState=esaveUpload_Finished; + } + else + { + if(s == SonyRemoteStorage::e_setDataSucceeded) + pClass->m_eSaveUploadState = eSaveUpload_FileDataUploaded; + else if ( !pClass->m_saveTransferUploadCancelled ) + pClass->m_eSaveUploadState = eSaveUpload_Error; + } +} + +void UIScene_LoadOrJoinMenu::CancelSaveUploadCallback(LPVOID lpParam) +{ + UIScene_LoadOrJoinMenu* pClass = (UIScene_LoadOrJoinMenu *) lpParam; + pClass->m_saveTransferUploadCancelled = true; + app.DebugPrintf("m_saveTransferUploadCancelled = true\n"); + ui.SetTooltips( DEFAULT_XUI_MENU_USER, -1, -1, -1, -1,-1,-1,-1,-1); // MGH - added - remove the "cancel" tooltip, so the player knows it's underway (really needs a "cancelling" message) + + pClass->m_bIgnoreInput = true; +} + +int UIScene_LoadOrJoinMenu::SaveTransferDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + UIScene_LoadOrJoinMenu* pClass = (UIScene_LoadOrJoinMenu*)pParam; + // results switched for this dialog + if(result==C4JStorage::EMessage_ResultAccept) + { + // upload the save + pClass->LaunchSaveUpload(); + + pClass->m_bIgnoreInput=false; + } + else + { + pClass->m_bIgnoreInput=false; + } + return 0; +} +#endif // SONY_REMOTE_STORAGE_UPLOAD + + +#if defined _XBOX_ONE +void UIScene_LoadOrJoinMenu::LaunchSaveTransfer() +{ + SaveTransferStateContainer *stateContainer = new SaveTransferStateContainer(); + stateContainer->m_iProgress = 0; + stateContainer->m_bSaveTransferInProgress = false; + stateContainer->m_bSaveTransferCancelled = false; + stateContainer->m_iPad = m_iPad; + stateContainer->m_eSaveTransferState = C4JStorage::eSaveTransfer_Idle; + stateContainer->m_pClass = this; + + LoadingInputParams *loadingParams = new LoadingInputParams(); + loadingParams->func = &UIScene_LoadOrJoinMenu::DownloadXbox360SaveThreadProc; + loadingParams->lpParam = (LPVOID)stateContainer; + + UIFullscreenProgressCompletionData *completionData = new UIFullscreenProgressCompletionData(); + completionData->bShowBackground=TRUE; + completionData->bShowLogo=TRUE; + completionData->type = e_ProgressCompletion_NavigateBackToScene; + completionData->iPad = DEFAULT_XUI_MENU_USER; + completionData->bRequiresUserAction=TRUE; + loadingParams->completionData = completionData; + + loadingParams->cancelFunc=&UIScene_LoadOrJoinMenu::CancelSaveTransferCallback; + loadingParams->m_cancelFuncParam=stateContainer; + loadingParams->cancelText=IDS_TOOLTIPS_CANCEL; + + ui.NavigateToScene(m_iPad,eUIScene_FullscreenProgress, loadingParams); +} + + + +int UIScene_LoadOrJoinMenu::DownloadXbox360SaveThreadProc( LPVOID lpParameter ) +{ + Compression::UseDefaultThreadStorage(); + + SaveTransferStateContainer *pStateContainer = (SaveTransferStateContainer *) lpParameter; + Minecraft *pMinecraft=Minecraft::GetInstance(); + ConsoleSaveFile* pSave = NULL; + + while(StorageManager.SaveTransferClearState()!=C4JStorage::eSaveTransfer_Idle) + { + Sleep(5); + } + + pStateContainer->m_bSaveTransferInProgress=true; + + UIScene_LoadOrJoinMenu::s_eSaveTransferFile = eSaveTransferFile_Marker; + RequestFileSize( pStateContainer, L"completemarker" ); + + while((pStateContainer->m_eSaveTransferState!=C4JStorage::eSaveTransfer_Idle) && pStateContainer->m_bSaveTransferInProgress && !pStateContainer->m_bSaveTransferCancelled) + { + switch(pStateContainer->m_eSaveTransferState) + { + case C4JStorage::eSaveTransfer_Idle: + break; + case C4JStorage::eSaveTransfer_FileSizeRetrieved: + switch(UIScene_LoadOrJoinMenu::s_eSaveTransferFile) + { + case eSaveTransferFile_Marker: + if(UIScene_LoadOrJoinMenu::s_ulFileSize == 0) + { + pMinecraft->progressRenderer->progressStage(IDS_SAVETRANSFER_NONE_FOUND); + pStateContainer->m_eSaveTransferState=C4JStorage::eSaveTransfer_Idle; + } + else + { + RequestFileData( pStateContainer, L"completemarker" ); + } + break; + case eSaveTransferFile_Metadata: + RequestFileData( pStateContainer, L"metadata" ); + break; + case eSaveTransferFile_SaveData: + RequestFileData( pStateContainer, L"savedata" ); + break; + }; + break; + case C4JStorage::eSaveTransfer_GettingFileData: + + break; + case C4JStorage::eSaveTransfer_FileDataRetrieved: + switch(UIScene_LoadOrJoinMenu::s_eSaveTransferFile) + { + case eSaveTransferFile_Marker: + // 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: + { + ByteArrayInputStream bais(UIScene_LoadOrJoinMenu::s_transferData); + DataInputStream dis(&bais); + + wstring saveTitle = dis.readUTF(); + StorageManager.SetSaveTitle(saveTitle.c_str()); + + wstring saveUniqueName = dis.readUTF(); + + // 4J Stu - Don't set this any more. We added it so that we could share the ban list data for this save + // However if the player downloads the same save multiple times, it will overwrite the previous version + // with that filname, and they could have made changes to it. + //StorageManager.SetSaveUniqueFilename((wchar_t *)saveUniqueName.c_str()); + + int thumbnailSize = dis.readInt(); + if(thumbnailSize > 0) + { + byteArray ba(thumbnailSize); + dis.readFully(ba); + + + + // 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; + } + + UIScene_LoadOrJoinMenu::s_transferData = byteArray(); + UIScene_LoadOrJoinMenu::s_eSaveTransferFile = eSaveTransferFile_SaveData; + RequestFileSize( pStateContainer, L"savedata" ); + } + break; + case eSaveTransferFile_SaveData: + { +#ifdef SPLIT_SAVES + if(!pStateContainer->m_bSaveTransferCancelled) + { + ConsoleSaveFileOriginal oldFormatSave( L"Temp name", UIScene_LoadOrJoinMenu::s_transferData.data, UIScene_LoadOrJoinMenu::s_transferData.length, false, SAVE_FILE_PLATFORM_X360 ); + pSave = new ConsoleSaveFileSplit( &oldFormatSave, false, pMinecraft->progressRenderer ); + + pMinecraft->progressRenderer->progressStage(IDS_SAVETRANSFER_STAGE_SAVING); + if(!pStateContainer->m_bSaveTransferCancelled) pSave->Flush(false,false); + } + pStateContainer->m_eSaveTransferState=C4JStorage::eSaveTransfer_Saving; + +#else + pSave = new ConsoleSaveFileOriginal( wSaveName, m_transferData.data, m_transferData.length, false, SAVE_FILE_PLATFORM_X360 ); + pStateContainer->m_eSaveTransferState=C4JStorage::eSaveTransfer_Converting; +#endif + delete UIScene_LoadOrJoinMenu::s_transferData.data; + UIScene_LoadOrJoinMenu::s_transferData = byteArray(); + } + break; + }; + + pStateContainer->m_iProgress=0; + break; + case C4JStorage::eSaveTransfer_Converting: +#if 0 + pSave->ConvertToLocalPlatform(); + + pMinecraft->progressRenderer->progressStage(IDS_SAVETRANSFER_STAGE_SAVING); + if(!pStateContainer->m_bSaveTransferCancelled) pSave->Flush(false,false); + + pStateContainer->m_iProgress+=1; + if(pStateContainer->m_iProgress==101) + { + pStateContainer->m_eSaveTransferState=C4JStorage::eSaveTransfer_Saving; + pStateContainer->m_iProgress=0; + break; + } + pMinecraft->progressRenderer->progressStagePercentage(pStateContainer->m_iProgress); +#endif + break; + case C4JStorage::eSaveTransfer_Saving: + // On Durango/Orbis, we need to wait for all the asynchronous saving processes to complete before destroying the levels, as that will ultimately delete + // the directory level storage & therefore the ConsoleSaveSplit instance, which needs to be around until all the sub files have completed saving. +#if defined(_DURANGO) || defined(__ORBIS__) + pMinecraft->progressRenderer->progressStage(IDS_PROGRESS_SAVING_TO_DISC); + + while(StorageManager.GetSaveState() != C4JStorage::ESaveGame_Idle ) + { + Sleep(10); + + // 4J Stu - DO NOT tick this here. The main thread should be the only place ticking the StorageManager. You WILL get crashes. + //StorageManager.Tick(); + } +#endif + + delete pSave; + +#ifdef _XBOX_ONE + pMinecraft->progressRenderer->progressStage(IDS_SAVE_TRANSFER_DOWNLOAD_AND_CONVERT_COMPLETE); +#endif + + pStateContainer->m_eSaveTransferState=C4JStorage::eSaveTransfer_Idle; + + // wipe the list and repopulate it + if(!pStateContainer->m_bSaveTransferCancelled) pStateContainer->m_pClass->m_iState=e_SavesRepopulateAfterTransferDownload; + + //pClass->m_iProgress+=1; + //if(pClass->m_iProgress==101) + //{ + // pClass->m_iProgress=0; + // pClass->m_eSaveTransferState=C4JStorage::eSaveTransfer_Idle; + // pMinecraft->progressRenderer->progressStage( IDS_SAVE_TRANSFER_DOWNLOAD_AND_CONVERT_COMPLETE ); + + // break; + //} + //pMinecraft->progressRenderer->progressStagePercentage(pClass->m_iProgress); + + break; + } + Sleep(50); + } + + if(pStateContainer->m_bSaveTransferCancelled) + { + WCHAR wcTemp[256]; + + pStateContainer->m_bSaveTransferCancelled=false; + swprintf(wcTemp,app.GetString(IDS_SAVE_TRANSFER_DOWNLOAD_CANCELLED)); + m_wstrStageText=wcTemp; + pMinecraft->progressRenderer->progressStage( m_wstrStageText ); + + } + + pStateContainer->m_eSaveTransferState=C4JStorage::eSaveTransfer_Idle; + pStateContainer->m_bSaveTransferInProgress=false; + + delete pStateContainer; + + return 0; +} + +void UIScene_LoadOrJoinMenu::RequestFileSize( SaveTransferStateContainer *pClass, wchar_t *filename ) +{ + Minecraft *pMinecraft=Minecraft::GetInstance(); + + // get the save file size + pMinecraft->progressRenderer->progressStart(IDS_SAVETRANSFER_TITLE_GET); + pMinecraft->progressRenderer->progressStage( IDS_SAVETRANSFER_STAGE_GET_DETAILS ); + +#ifdef _DEBUG_MENUS_ENABLED + if(app.GetLoadSavesFromFolderEnabled()) + { + ZeroMemory(&m_debugTransferDetails, sizeof(C4JStorage::SAVETRANSFER_FILE_DETAILS) ); + + File targetFile( wstring(L"FakeTMSPP\\").append(filename) ); + if(targetFile.exists()) m_debugTransferDetails.ulFileLen = targetFile.length(); + + SaveTransferReturned(pClass,&m_debugTransferDetails); + } + else +#endif + { + do + { + pMinecraft->progressRenderer->progressStart(IDS_SAVETRANSFER_TITLE_GET); + pMinecraft->progressRenderer->progressStage( IDS_SAVETRANSFER_STAGE_GET_DETAILS ); + Sleep(1); + pClass->m_eSaveTransferState=StorageManager.SaveTransferGetDetails(pClass->m_iPad,C4JStorage::eGlobalStorage_TitleUser,filename,&UIScene_LoadOrJoinMenu::SaveTransferReturned,pClass); + } + while(pClass->m_eSaveTransferState == C4JStorage::eSaveTransfer_Busy && !pClass->m_bSaveTransferCancelled ); + } +} + +void UIScene_LoadOrJoinMenu::RequestFileData( SaveTransferStateContainer *pClass, wchar_t *filename ) +{ + Minecraft *pMinecraft=Minecraft::GetInstance(); + WCHAR wcTemp[256]; + + pMinecraft->progressRenderer->progressStagePercentage(0); + + swprintf(wcTemp,app.GetString(IDS_SAVETRANSFER_STAGE_GET_DATA),0,UIScene_LoadOrJoinMenu::s_ulFileSize); + m_wstrStageText=wcTemp; + + pMinecraft->progressRenderer->progressStage( m_wstrStageText ); + +#ifdef _DEBUG_MENUS_ENABLED + if(app.GetLoadSavesFromFolderEnabled()) + { + File targetFile( wstring(L"FakeTMSPP\\").append(filename) ); + if(targetFile.exists()) + { + HANDLE hSaveFile = CreateFile( targetFile.getPath().c_str(), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_FLAG_RANDOM_ACCESS, NULL); + + m_debugTransferDetails.pbData = new BYTE[m_debugTransferDetails.ulFileLen]; + + DWORD numberOfBytesRead = 0; + ReadFile( hSaveFile,m_debugTransferDetails.pbData,m_debugTransferDetails.ulFileLen,&numberOfBytesRead,NULL); + assert(numberOfBytesRead == m_debugTransferDetails.ulFileLen); + + CloseHandle(hSaveFile); + + SaveTransferReturned(pClass,&m_debugTransferDetails); + } + } + else +#endif + { + do + { + pMinecraft->progressRenderer->progressStart(IDS_SAVETRANSFER_TITLE_GET); + pMinecraft->progressRenderer->progressStage( -1 ); + Sleep(1); + pClass->m_eSaveTransferState=StorageManager.SaveTransferGetData(pClass->m_iPad,C4JStorage::eGlobalStorage_TitleUser,filename,&UIScene_LoadOrJoinMenu::SaveTransferReturned,&UIScene_LoadOrJoinMenu::SaveTransferUpdateProgress,pClass,pClass); + } + while(pClass->m_eSaveTransferState == C4JStorage::eSaveTransfer_Busy && !pClass->m_bSaveTransferCancelled ); + } +} + +int UIScene_LoadOrJoinMenu::SaveTransferReturned(LPVOID lpParam,C4JStorage::SAVETRANSFER_FILE_DETAILS *pSaveTransferDetails) +{ + SaveTransferStateContainer* pClass = (SaveTransferStateContainer *) lpParam; + app.DebugPrintf("Save Transfer - size is %d\n",pSaveTransferDetails->ulFileLen); + + // if the file data is null, then assume this is the file size retrieval + if(pSaveTransferDetails->pbData==NULL) + { + pClass->m_eSaveTransferState=C4JStorage::eSaveTransfer_FileSizeRetrieved; + UIScene_LoadOrJoinMenu::s_ulFileSize=pSaveTransferDetails->ulFileLen; + } + else + { + delete UIScene_LoadOrJoinMenu::s_transferData.data; + UIScene_LoadOrJoinMenu::s_transferData = byteArray(pSaveTransferDetails->pbData, UIScene_LoadOrJoinMenu::s_ulFileSize); + pClass->m_eSaveTransferState=C4JStorage::eSaveTransfer_FileDataRetrieved; + } + + return 0; +} + +int UIScene_LoadOrJoinMenu::SaveTransferUpdateProgress(LPVOID lpParam,unsigned long ulBytesReceived) +{ + WCHAR wcTemp[256]; + + SaveTransferStateContainer* pClass = (SaveTransferStateContainer *) lpParam; + Minecraft *pMinecraft=Minecraft::GetInstance(); + + if(pClass->m_bSaveTransferCancelled) // was cancelled + { + pMinecraft->progressRenderer->progressStage(IDS_SAVE_TRANSFER_DOWNLOAD_CANCELLING); + swprintf(wcTemp,app.GetString(IDS_SAVE_TRANSFER_DOWNLOAD_CANCELLING)); + m_wstrStageText=wcTemp; + pMinecraft->progressRenderer->progressStage( m_wstrStageText ); + } + else + { + unsigned int uiProgress=(unsigned int)(((float)ulBytesReceived/float(UIScene_LoadOrJoinMenu::s_ulFileSize))*100.0f); + + pMinecraft->progressRenderer->progressStagePercentage(uiProgress); + swprintf(wcTemp,app.GetString(IDS_SAVETRANSFER_STAGE_GET_DATA),((float)(ulBytesReceived))/1024000.0f,((float)UIScene_LoadOrJoinMenu::s_ulFileSize)/1024000.0f); + m_wstrStageText=wcTemp; + pMinecraft->progressRenderer->progressStage( m_wstrStageText ); + } + + return 0; +} + +void UIScene_LoadOrJoinMenu::CancelSaveTransferCallback(LPVOID lpParam) +{ + SaveTransferStateContainer* pClass = (SaveTransferStateContainer *) lpParam; + + if(!pClass->m_bSaveTransferCancelled) + { + StorageManager.CancelSaveTransfer(UIScene_LoadOrJoinMenu::CancelSaveTransferCompleteCallback,pClass); + + pClass->m_bSaveTransferCancelled=true; + } + //pClass->m_bSaveTransferInProgress=false; +} + +int UIScene_LoadOrJoinMenu::CancelSaveTransferCompleteCallback(LPVOID lpParam) +{ + SaveTransferStateContainer* pClass = (SaveTransferStateContainer *) lpParam; + // change the state to idle to get the download thread to terminate + pClass->m_eSaveTransferState=C4JStorage::eSaveTransfer_Idle; + return 0; +} + +int UIScene_LoadOrJoinMenu::NeedSyncMessageReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + UIScene_LoadOrJoinMenu *pClass = (UIScene_LoadOrJoinMenu *)pParam; + LoadMenuInitData *params = (LoadMenuInitData *)pParam; + + if( result == C4JStorage::EMessage_ResultAccept ) + { + // navigate to the settings scene + ui.NavigateToScene(ProfileManager.GetPrimaryPad(), eUIScene_LoadMenu, pClass->m_loadMenuInitData); + } + else + { + delete pClass->m_loadMenuInitData; + pClass->m_bIgnoreInput = false; + } + + return 0; +} + + +#endif + + +#ifdef _XBOX_ONE +void UIScene_LoadOrJoinMenu::HandleDLCLicenseChange() +{ + // may have installed Halloween on this menu + app.StartInstallDLCProcess(m_iPad); +} +#endif + +#if defined _XBOX_ONE || defined __ORBIS__ +int UIScene_LoadOrJoinMenu::CopySaveDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + UIScene_LoadOrJoinMenu* pClass = (UIScene_LoadOrJoinMenu*)pParam; + + if(result==C4JStorage::EMessage_ResultAccept) + { + + LoadingInputParams *loadingParams = new LoadingInputParams(); + void *uniqueId = (LPVOID)pClass->GetCallbackUniqueId(); + loadingParams->func = &UIScene_LoadOrJoinMenu::CopySaveThreadProc; + loadingParams->lpParam = uniqueId; + loadingParams->waitForThreadToDelete = true; + + UIFullscreenProgressCompletionData *completionData = new UIFullscreenProgressCompletionData(); + completionData->bShowBackground=TRUE; + completionData->bShowLogo=TRUE; + completionData->type = e_ProgressCompletion_NavigateBackToScene; + completionData->iPad = DEFAULT_XUI_MENU_USER; + loadingParams->completionData = completionData; + + loadingParams->cancelFunc=&UIScene_LoadOrJoinMenu::CancelCopySaveCallback; + loadingParams->m_cancelFuncParam=uniqueId; + loadingParams->cancelText=IDS_TOOLTIPS_CANCEL; + + ui.NavigateToScene(iPad,eUIScene_FullscreenProgress, loadingParams); + } + else + { + pClass->m_bIgnoreInput=false; + } + + return 0; +} + +int UIScene_LoadOrJoinMenu::CopySaveThreadProc( LPVOID lpParameter ) +{ + Minecraft *pMinecraft=Minecraft::GetInstance(); + pMinecraft->progressRenderer->progressStart(IDS_PROGRESS_COPYING_SAVE); + pMinecraft->progressRenderer->progressStage( -1 ); + + ui.EnterCallbackIdCriticalSection(); + UIScene_LoadOrJoinMenu* pClass = (UIScene_LoadOrJoinMenu*)ui.GetSceneFromCallbackId((size_t)lpParameter); + if( pClass ) + { + pClass->m_bCopying = true; + pClass->m_bCopyingCancelled = false; + ui.LeaveCallbackIdCriticalSection(); + // Copy save data takes two callbacks - one for completion, and one for progress. The progress callback also lets us cancel the operation, if we return false. + StorageManager.CopySaveData(&pClass->m_pSaveDetails->SaveInfoA[pClass->m_iSaveListIndex - pClass->m_iDefaultButtonsC],UIScene_LoadOrJoinMenu::CopySaveDataReturned,UIScene_LoadOrJoinMenu::CopySaveDataProgress,lpParameter); + + bool bContinue = true; + do + { + Sleep(100); + ui.EnterCallbackIdCriticalSection(); + pClass = (UIScene_LoadOrJoinMenu*)ui.GetSceneFromCallbackId((size_t)lpParameter); + if( pClass ) + { + bContinue = pClass->m_bCopying; + } + else + { + bContinue = false; + } + ui.LeaveCallbackIdCriticalSection(); + } while( bContinue ); + } + else + { + ui.LeaveCallbackIdCriticalSection(); + } + + return 0; +} + +int UIScene_LoadOrJoinMenu::CopySaveDataReturned(LPVOID lpParam, bool success, C4JStorage::ESaveGameState stat) +{ + ui.EnterCallbackIdCriticalSection(); + UIScene_LoadOrJoinMenu* pClass = (UIScene_LoadOrJoinMenu*)ui.GetSceneFromCallbackId((size_t)lpParam); + + if(pClass) + { + if(success) + { + pClass->m_bCopying = false; + // wipe the list and repopulate it + pClass->m_iState=e_SavesRepopulateAfterDelete; + ui.LeaveCallbackIdCriticalSection(); + } + else + { +#ifdef __ORBIS__ + UINT uiIDA[1]; + // you cancelled the save on exit after choosing exit and save? You go back to the Exit choices then. + uiIDA[0]=IDS_OK; + + if( stat == C4JStorage::ESaveGame_CopyCompleteFailLocalStorage ) + { + ui.LeaveCallbackIdCriticalSection(); + ui.RequestErrorMessage(IDS_COPYSAVE_FAILED_TITLE, IDS_COPYSAVE_FAILED_LOCAL, uiIDA, 1, ProfileManager.GetPrimaryPad(), CopySaveErrorDialogFinishedCallback, lpParam); + } + else if( stat == C4JStorage::ESaveGame_CopyCompleteFailQuota ) + { + ui.LeaveCallbackIdCriticalSection(); + ui.RequestErrorMessage(IDS_COPYSAVE_FAILED_TITLE, IDS_COPYSAVE_FAILED_QUOTA, uiIDA, 1, ProfileManager.GetPrimaryPad(), CopySaveErrorDialogFinishedCallback, lpParam); + } + else + { + pClass->m_bCopying = false; + ui.LeaveCallbackIdCriticalSection(); + } +#else + pClass->m_bCopying = false; + ui.LeaveCallbackIdCriticalSection(); +#endif + } + } + else + { + ui.LeaveCallbackIdCriticalSection(); + } + return 0; +} + +bool UIScene_LoadOrJoinMenu::CopySaveDataProgress(LPVOID lpParam, int percent) +{ + bool bContinue = false; + ui.EnterCallbackIdCriticalSection(); + UIScene_LoadOrJoinMenu* pClass = (UIScene_LoadOrJoinMenu*)ui.GetSceneFromCallbackId((size_t)lpParam); + if( pClass ) + { + bContinue = !pClass->m_bCopyingCancelled; + } + ui.LeaveCallbackIdCriticalSection(); + Minecraft *pMinecraft=Minecraft::GetInstance(); + pMinecraft->progressRenderer->progressStagePercentage(percent); + + return bContinue; +} + +void UIScene_LoadOrJoinMenu::CancelCopySaveCallback(LPVOID lpParam) +{ + ui.EnterCallbackIdCriticalSection(); + UIScene_LoadOrJoinMenu* pClass = (UIScene_LoadOrJoinMenu*)ui.GetSceneFromCallbackId((size_t)lpParam); + if( pClass ) + { + pClass->m_bCopyingCancelled = true; + } + ui.LeaveCallbackIdCriticalSection(); +} + +int UIScene_LoadOrJoinMenu::CopySaveErrorDialogFinishedCallback(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + ui.EnterCallbackIdCriticalSection(); + UIScene_LoadOrJoinMenu* pClass = (UIScene_LoadOrJoinMenu*)ui.GetSceneFromCallbackId((size_t)pParam); + if( pClass ) + { + pClass->m_bCopying = false; + } + ui.LeaveCallbackIdCriticalSection(); + + return 0; +} + +#endif // _XBOX_ONE diff --git a/Minecraft.Client/Common/UI/UIScene_LoadOrJoinMenu.h b/Minecraft.Client/Common/UI/UIScene_LoadOrJoinMenu.h new file mode 100644 index 00000000..3599aa37 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_LoadOrJoinMenu.h @@ -0,0 +1,310 @@ +#pragma once + +#include "UIScene.h" + +class LevelGenerationOptions; + + +#if defined __PS3__ || defined __ORBIS__ || defined(__PSVITA__) +#define SONY_REMOTE_STORAGE_DOWNLOAD +#endif +#if defined __PS3__ || __PSVITA__ +#define SONY_REMOTE_STORAGE_UPLOAD +#endif + + +class UIScene_LoadOrJoinMenu : public UIScene +{ +private: + enum EControls + { + eControl_SavesList, + eControl_GamesList, +#if defined(_XBOX_ONE) || defined(__ORBIS__) + eControl_SpaceIndicator, +#endif + }; + + enum EState + { + e_SavesIdle, + e_SavesRepopulate, + e_SavesRepopulateAfterMashupHide, + e_SavesRepopulateAfterDelete, + e_SavesRepopulateAfterTransferDownload, + }; + + enum eActions + { + eAction_None=0, + eAction_ViewInvites, + eAction_JoinGame, + }; + eActions m_eAction; + + static const int JOIN_LOAD_CREATE_BUTTON_INDEX = 0; + + SaveListDetails *m_saveDetails; + int m_iSaveDetailsCount; + +protected: + UIControl_SaveList m_buttonListSaves; + UIControl_SaveList m_buttonListGames; + UIControl_Label m_labelSavesListTitle, m_labelJoinListTitle, m_labelNoGames; + UIControl m_controlSavesTimer, m_controlJoinTimer; +#if defined(_XBOX_ONE) || defined(__ORBIS__) + UIControl_SpaceIndicatorBar m_spaceIndicatorSaves; +#endif + +private: + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_buttonListSaves, "SavesList") + UI_MAP_ELEMENT( m_buttonListGames, "JoinList") + + UI_MAP_ELEMENT( m_labelSavesListTitle, "SavesListTitle") + UI_MAP_ELEMENT( m_labelJoinListTitle, "JoinListTitle") + UI_MAP_ELEMENT( m_labelNoGames, "NoGames") + + UI_MAP_ELEMENT( m_controlSavesTimer, "SavesTimer") + UI_MAP_ELEMENT( m_controlJoinTimer, "JoinTimer") + +#if defined(_XBOX_ONE) || defined(__ORBIS__) + UI_MAP_ELEMENT( m_spaceIndicatorSaves, "SaveSizeBar") +#endif + UI_END_MAP_ELEMENTS_AND_NAMES() + + int m_iDefaultButtonsC; + int m_iMashUpButtonsC; + int m_iState; + + vector *m_currentSessions; + vector m_generators; + vector *m_saves; + + bool m_bIgnoreInput; + bool m_bAllLoaded; + bool m_bRetrievingSaveThumbnails; + bool m_bSaveThumbnailReady; + bool m_bShowingPartyGamesOnly; + bool m_bInParty; + JoinMenuInitData *m_initData; + bool m_bMultiplayerAllowed; + int m_iTexturePacksNotInstalled; + int m_iRequestingThumbnailId; + SAVE_DETAILS *m_pSaveDetails; + bool m_bSavesDisplayed; + bool m_bExitScene; + bool m_bCopying; + bool m_bCopyingCancelled; + int m_iSaveInfoC; + int m_iSaveListIndex; + int m_iGameListIndex; + //int *m_iConfigA; // track the texture packs that we don't have installed +#ifndef _XBOX_ONE + bool m_bSaveTransferInProgress; + bool m_bSaveTransferCancelled; +#endif + bool m_bUpdateSaveSize; + +public: + UIScene_LoadOrJoinMenu(int iPad, void *initData, UILayer *parentLayer); + virtual ~UIScene_LoadOrJoinMenu(); + + virtual void updateTooltips(); + virtual void updateComponents(); + + virtual void handleDestroy(); + virtual void handleLoseFocus(); + virtual void handleGainFocus(bool navBack); + virtual void handleTimerComplete(int id); + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + virtual void handleFocusChange(F64 controlId, F64 childId); + virtual void handleInitFocus(F64 controlId, F64 childId); + + virtual EUIScene getSceneType() { return eUIScene_LoadOrJoinMenu;} + + static void UpdateGamesListCallback(LPVOID pParam); +#ifdef _XBOX_ONE + void HandleDLCLicenseChange(); +#endif + virtual void tick(); + +private: + void Initialise(); + void GetSaveInfo(); + void UpdateGamesList(); + void AddDefaultButtons(); + bool DoesSavesListHaveFocus(); + bool DoesMashUpWorldHaveFocus(); + bool DoesGamesListHaveFocus(); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + + static int LoadSaveDataThumbnailReturned(LPVOID lpParam,PBYTE pbThumbnail,DWORD dwThumbnailBytes); + static int LoadSaveCallback(LPVOID lpParam,bool bRes); + static int DeleteSaveDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int SaveOptionsDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int TexturePackDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int DeleteSaveDataReturned(LPVOID lpParam,bool bRes); + static int RenameSaveDataReturned(LPVOID lpParam,bool bRes); + static int KeyboardCompleteWorldNameCallback(LPVOID lpParam,bool bRes); +#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); + void LoadSaveFromDisk(File *saveFile, ESavePlatform savePlatform = SAVE_FILE_PLATFORM_LOCAL); +#if defined(__PS3__) || defined(__PSVITA__) || defined(__ORBIS__) + void LoadSaveFromCloud(); +#endif +public: + virtual void HandleDLCMountingComplete(); + +#ifdef __ORBIS__ + void LoadRemoteFileFromDisk(char* remoteFilename); +#endif + +private: + void CheckAndJoinGame(int gameIndex); +#if defined(__PS3__) || defined(__PSVITA__) || defined(__ORBIS__) + static int MustSignInReturnedPSN(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int PSN_SignInReturned(void *pParam,bool bContinue, int iPad); + static void remoteStorageGetSaveCallback(LPVOID lpParam, SonyRemoteStorage::Status s, int error_code); +#endif + +#ifdef __ORBIS__ + //static int PSPlusReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); +#endif +#ifdef _XBOX_ONE + typedef struct _SaveTransferStateContainer + { + int m_iProgress; + bool m_bSaveTransferInProgress; + bool m_bSaveTransferCancelled; + int m_iPad; + C4JStorage::eSaveTransferState m_eSaveTransferState; + UIScene_LoadOrJoinMenu *m_pClass; + } SaveTransferStateContainer; + enum ESaveTransferFiles + { + eSaveTransferFile_Marker, + eSaveTransferFile_Metadata, + eSaveTransferFile_SaveData, + }; + static ESaveTransferFiles s_eSaveTransferFile; + static unsigned long s_ulFileSize; + static byteArray s_transferData; + static wstring m_wstrStageText; + LoadMenuInitData *m_loadMenuInitData; + +#ifdef _DEBUG_MENUS_ENABLED + static C4JStorage::SAVETRANSFER_FILE_DETAILS m_debugTransferDetails; +#endif + + void LaunchSaveTransfer(); + static int DownloadXbox360SaveThreadProc( LPVOID lpParameter ); + static void RequestFileSize( SaveTransferStateContainer *pClass, wchar_t *filename ); + static void RequestFileData( SaveTransferStateContainer *pClass, wchar_t *filename ); + static int SaveTransferReturned(LPVOID lpParam,C4JStorage::SAVETRANSFER_FILE_DETAILS *pSaveTransferDetails); + static int SaveTransferUpdateProgress(LPVOID lpParam,unsigned long ulBytesReceived); + static void CancelSaveTransferCallback(LPVOID lpParam); + static int NeedSyncMessageReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int CancelSaveTransferCompleteCallback(LPVOID lpParam); + +#endif + + + +#ifdef SONY_REMOTE_STORAGE_DOWNLOAD + enum eSaveTransferState + { + eSaveTransfer_Idle, + eSaveTransfer_Busy, + eSaveTransfer_GetRemoteSaveInfo, + eSaveTransfer_GettingRemoteSaveInfo, + eSaveTransfer_CreateDummyFile, + eSaveTransfer_CreatingDummyFile, + eSaveTransfer_GettingFileSize, + eSaveTransfer_FileSizeRetrieved, + eSaveTransfer_GetFileData, + eSaveTransfer_GettingFileData, + eSaveTransfer_FileDataRetrieved, + eSaveTransfer_GetSavesInfo, + eSaveTransfer_GettingSavesInfo, + eSaveTransfer_LoadSaveFromDisc, + eSaveTransfer_LoadingSaveFromDisc, + eSaveTransfer_CreatingNewSave, + eSaveTransfer_Converting, + eSaveTransfer_Saving, + eSaveTransfer_Succeeded, + eSaveTransfer_Cancelled, + eSaveTransfer_Error, + eSaveTransfer_ErrorDeletingSave, + eSaveTransfer_ErrorMesssage, + eSaveTransfer_Finished, + + }; + eSaveTransferState m_eSaveTransferState; + static unsigned long m_ulFileSize; + static wstring m_wstrStageText; + static bool m_bSaveTransferRunning; + int m_iProgress; + char m_downloadedUniqueFilename[64];//SCE_SAVE_DATA_DIRNAME_DATA_MAXSIZE]; + bool m_saveTransferDownloadCancelled; + void LaunchSaveTransfer(); + static int CreateDummySaveDataCallback(LPVOID lpParam,bool bRes); + static int CrossSaveGetSavesInfoCallback(LPVOID lpParam, SAVE_DETAILS *pSaveDetails,bool bRes); + static int LoadCrossSaveDataCallback(void *pParam,bool bIsCorrupt, bool bIsOwner); + static int CrossSaveFinishedCallback(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int CrossSaveDeleteOnErrorReturned(LPVOID lpParam,bool bRes); + static int RemoteSaveNotFoundCallback(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int DownloadSonyCrossSaveThreadProc( LPVOID lpParameter ); + static void SaveTransferReturned(LPVOID lpParam, SonyRemoteStorage::Status s, int error_code); + static ConsoleSaveFile* SonyCrossSaveConvert(); + + static void CancelSaveTransferCallback(LPVOID lpParam); +public: + static bool isSaveTransferRunning() { return m_bSaveTransferRunning; } +private: +#endif + +#ifdef SONY_REMOTE_STORAGE_UPLOAD + enum eSaveUploadState + { + eSaveUpload_Idle, + eSaveUpload_UploadingFileData, + eSaveUpload_FileDataUploaded, + eSaveUpload_Cancelled, + eSaveUpload_Error, + esaveUpload_Finished + }; + + eSaveUploadState m_eSaveUploadState; + bool m_saveTransferUploadCancelled; + + void LaunchSaveUpload(); + static int UploadSonyCrossSaveThreadProc( LPVOID lpParameter ); + static void SaveUploadReturned(LPVOID lpParam, SonyRemoteStorage::Status s, int error_code); + static void CancelSaveUploadCallback(LPVOID lpParam); + static int SaveTransferDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int CrossSaveUploadFinishedCallback(void *pParam,int iPad,C4JStorage::EMessageResult result); +#endif + +#if defined _XBOX_ONE || defined __ORBIS__ + static int CopySaveDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int CopySaveThreadProc( LPVOID lpParameter ); + static int CopySaveDataReturned( LPVOID lpParameter, bool success, C4JStorage::ESaveGameState state ); + static bool CopySaveDataProgress(LPVOID lpParam, int percent); + static void CancelCopySaveCallback(LPVOID lpParam); + static int CopySaveErrorDialogFinishedCallback(void *pParam,int iPad,C4JStorage::EMessageResult result); +#endif +}; diff --git a/Minecraft.Client/Common/UI/UIScene_MainMenu.cpp b/Minecraft.Client/Common/UI/UIScene_MainMenu.cpp new file mode 100644 index 00000000..e65a35b0 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_MainMenu.cpp @@ -0,0 +1,2151 @@ +#include "stdafx.h" +#include "..\..\..\Minecraft.World\Mth.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\..\Minecraft.World\Random.h" +#include "..\..\User.h" +#include "..\..\MinecraftServer.h" +#include "UI.h" +#include "UIScene_MainMenu.h" +#ifdef __ORBIS__ +#include +#endif + +Random *UIScene_MainMenu::random = new Random(); + +EUIScene UIScene_MainMenu::eNavigateWhenReady = (EUIScene) -1; + +UIScene_MainMenu::UIScene_MainMenu(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ +#ifdef __ORBIS + //m_ePatchCheckState=ePatchCheck_Idle; + m_bRunGameChosen=false; + m_bErrorDialogRunning=false; +#endif + + + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + parentLayer->addComponent(iPad,eUIComponent_Panorama); + parentLayer->addComponent(iPad,eUIComponent_Logo); + + m_eAction=eAction_None; + m_bIgnorePress=false; + + + m_buttons[(int)eControl_PlayGame].init(IDS_PLAY_GAME,eControl_PlayGame); + +#ifdef _XBOX_ONE + if(!ProfileManager.IsFullVersion()) m_buttons[(int)eControl_PlayGame].setLabel(IDS_PLAY_TRIAL_GAME); + app.SetReachedMainMenu(); +#endif + + 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(IDS_DOWNLOADABLECONTENT,eControl_UnlockOrDLC); + } + else + { + m_bTrialVersion=true; + 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(IDS_XBOX_HELP_APP, eControl_XboxHelp); +#endif + +#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) + // Not allowed to exit from a PS3 game from the game - have to use the PS button + removeControl( &m_buttons[(int)eControl_Exit], false ); + // We don't have a way to display trophies/achievements, so remove the button + removeControl( &m_buttons[(int)eControl_Achievements], false ); + m_bLaunchFullVersionPurchase=false; +#endif +#ifdef _DURANGO + // Allowed to not have achievements in the menu + removeControl( &m_buttons[(int)eControl_Achievements], false ); + // Not allowed to exit from a Xbox One game from the game - have to use the Home button + //removeControl( &m_buttons[(int)eControl_Exit], false ); + m_bWaitingForDLCInfo=false; +#endif + + doHorizontalResizeCheck(); + + m_splash = L""; + + wstring filename = L"splashes.txt"; + if( app.hasArchiveFile(filename) ) + { + byteArray splashesArray = app.getArchiveFile(filename); + ByteArrayInputStream bais(splashesArray); + InputStreamReader isr( &bais ); + BufferedReader br( &isr ); + + wstring line = L""; + while ( !(line = br.readLine()).empty() ) + { + line = trimString( line ); + if (line.length() > 0) + { + m_splashes.push_back(line); + } + } + + br.close(); + } + + m_bIgnorePress=false; + m_bLoadTrialOnNetworkManagerReady = false; + + // 4J Stu - Clear out any loaded game rules + app.setLevelGenerationOptions(NULL); + + // 4J Stu - Reset the leaving game flag so that we correctly handle signouts while in the menus + g_NetworkManager.ResetLeavingGame(); + +#if TO_BE_IMPLEMENTED + // Fix for #45154 - Frontend: DLC: Content can only be downloaded from the frontend if you have not joined/exited multiplayer + XBackgroundDownloadSetMode(XBACKGROUND_DOWNLOAD_MODE_ALWAYS_ALLOW); +#endif +} + +UIScene_MainMenu::~UIScene_MainMenu() +{ + m_parentLayer->removeComponent(eUIComponent_Panorama); + m_parentLayer->removeComponent(eUIComponent_Logo); +} + +void UIScene_MainMenu::updateTooltips() +{ + int iX = -1; + int iA = -1; + if(!m_bIgnorePress) + { + iA = IDS_TOOLTIPS_SELECT; + +#ifdef _XBOX_ONE + iX = IDS_TOOLTIPS_CHOOSE_USER; +#elif defined __PSVITA__ + if(ProfileManager.IsFullVersion()) + { + iX = IDS_TOOLTIP_CHANGE_NETWORK_MODE; + } +#endif + } + ui.SetTooltips( DEFAULT_XUI_MENU_USER, iA, -1, iX); +} + +void UIScene_MainMenu::updateComponents() +{ + m_parentLayer->showComponent(m_iPad,eUIComponent_Panorama,true); + m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,true); +} + +void UIScene_MainMenu::handleGainFocus(bool navBack) +{ + UIScene::handleGainFocus(navBack); + ui.ShowPlayerDisplayname(false); + m_bIgnorePress=false; + + if (eNavigateWhenReady >= 0) + { + return; + } + + // 4J-JEV: This needs to come before SetLockedProfile(-1) as it wipes the XbLive contexts. + if (!navBack) + { + for (int iPad = 0; iPad < MAX_LOCAL_PLAYERS; iPad++) + { + // For returning to menus after exiting a game. + if (ProfileManager.IsSignedIn(iPad) ) + { + ProfileManager.SetCurrentGameActivity(iPad, CONTEXT_PRESENCE_MENUS, false); + } + } + } + ProfileManager.SetLockedProfile(-1); + + m_bIgnorePress = false; + updateTooltips(); + +#ifdef _DURANGO + ProfileManager.ClearGameUsers(); +#endif + + if(navBack && ProfileManager.IsFullVersion()) + { + // Replace the Unlock Full Game with Downloadable Content + m_buttons[(int)eControl_UnlockOrDLC].setLabel(IDS_DOWNLOADABLECONTENT); + } + +#if TO_BE_IMPLEMENTED + // Fix for #45154 - Frontend: DLC: Content can only be downloaded from the frontend if you have not joined/exited multiplayer + XBackgroundDownloadSetMode(XBACKGROUND_DOWNLOAD_MODE_ALWAYS_ALLOW); + m_Timer.SetShow(FALSE); +#endif + m_controlTimer.setVisible( false ); + + // 4J-PB - remove the "hobo humping" message legal say we can't have, and the 1080p one for Vita +#ifdef __PSVITA__ + int splashIndex = eSplashRandomStart + 2 + random->nextInt( (int)m_splashes.size() - (eSplashRandomStart + 2) ); +#else + int splashIndex = eSplashRandomStart + 1 + random->nextInt( (int)m_splashes.size() - (eSplashRandomStart + 1) ); +#endif + + // Override splash text on certain dates + SYSTEMTIME LocalSysTime; + GetLocalTime( &LocalSysTime ); + if (LocalSysTime.wMonth == 11 && LocalSysTime.wDay == 9) + { + splashIndex = eSplashHappyBirthdayEx; + } + else if (LocalSysTime.wMonth == 6 && LocalSysTime.wDay == 1) + { + splashIndex = eSplashHappyBirthdayNotch; + } + else if (LocalSysTime.wMonth == 12 && LocalSysTime.wDay == 24) // the Java game shows this on Christmas Eve, so we will too + { + splashIndex = eSplashMerryXmas; + } + else if (LocalSysTime.wMonth == 1 && LocalSysTime.wDay == 1) + { + splashIndex = eSplashHappyNewYear; + } + //splashIndex = 47; // Very short string + //splashIndex = 194; // Very long string + //splashIndex = 295; // Coloured + //splashIndex = 296; // Noise + m_splash = m_splashes.at( splashIndex ); +} + +wstring UIScene_MainMenu::getMoviePath() +{ + return L"MainMenu"; +} + +void UIScene_MainMenu::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 || (eNavigateWhenReady >= 0) ) return; + +#if defined (__ORBIS__) || defined (__PSVITA__) + // ignore all players except player 0 - it's their profile that is currently being used + if(iPad!=0) return; +#endif + + ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); + + switch(key) + { + case ACTION_MENU_OK: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + if(pressed) + { + ProfileManager.SetPrimaryPad(iPad); + ProfileManager.SetLockedProfile(-1); + sendInputToMovie(key, repeat, pressed, released); + } + break; +#ifdef _XBOX_ONE + case ACTION_MENU_X: + if(pressed) + { + m_bIgnorePress = true; + ProfileManager.RequestSignInUI(false, false, false, false, false, ChooseUser_SignInReturned, this, iPad); + } + break; +#endif +#ifdef __PSVITA__ + case ACTION_MENU_X: + if(pressed && ProfileManager.IsFullVersion()) + { + UINT uiIDA[2]; + uiIDA[0]=IDS__NETWORK_PSN; + uiIDA[1]=IDS_NETWORK_ADHOC; + ui.RequestErrorMessage(IDS_SELECT_NETWORK_MODE_TITLE, IDS_SELECT_NETWORK_MODE_TEXT, uiIDA, 2, XUSER_INDEX_ANY, &UIScene_MainMenu::SelectNetworkModeReturned,this); + } + break; +#endif + + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + sendInputToMovie(key, repeat, pressed, released); + break; + } +} + +void UIScene_MainMenu::handlePress(F64 controlId, F64 childId) +{ + int primaryPad = ProfileManager.GetPrimaryPad(); + +#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) + { + case eControl_PlayGame: +#ifdef __ORBIS__ + { + m_bIgnorePress=true; + + //CD - Added for audio + ui.PlayUISFX(eSFX_Press); + + ProfileManager.RefreshChatAndContentRestrictions(RefreshChatAndContentRestrictionsReturned_PlayGame, this); + } +#else + m_eAction=eAction_RunGame; + //CD - Added for audio + ui.PlayUISFX(eSFX_Press); + + signInReturnedFunc = &UIScene_MainMenu::CreateLoad_SignInReturned; +#endif + break; + case eControl_Leaderboards: + //CD - Added for audio + ui.PlayUISFX(eSFX_Press); +#ifdef __ORBIS__ + ProfileManager.RefreshChatAndContentRestrictions(RefreshChatAndContentRestrictionsReturned_Leaderboards, this); +#else + m_eAction=eAction_RunLeaderboards; + signInReturnedFunc = &UIScene_MainMenu::Leaderboards_SignInReturned; +#endif + break; + case eControl_Achievements: + //CD - Added for audio + ui.PlayUISFX(eSFX_Press); + + m_eAction=eAction_RunAchievements; + signInReturnedFunc = &UIScene_MainMenu::Achievements_SignInReturned; + break; + case eControl_HelpAndOptions: + //CD - Added for audio + ui.PlayUISFX(eSFX_Press); + + m_eAction=eAction_RunHelpAndOptions; + signInReturnedFunc = &UIScene_MainMenu::HelpAndOptions_SignInReturned; + break; + case eControl_UnlockOrDLC: + //CD - Added for audio + ui.PlayUISFX(eSFX_Press); + + m_eAction=eAction_RunUnlockOrDLC; + signInReturnedFunc = &UIScene_MainMenu::UnlockFullGame_SignInReturned; + break; +#if defined _XBOX + case eControl_Exit: + if( ProfileManager.IsFullVersion() ) + { + UINT uiIDA[2]; + uiIDA[0]=IDS_CANCEL; + uiIDA[1]=IDS_OK; + ui.RequestErrorMessage(IDS_WARNING_ARCADE_TITLE, IDS_WARNING_ARCADE_TEXT, uiIDA, 2, XUSER_INDEX_ANY,&UIScene_MainMenu::ExitGameReturned,this); + } + else + { +#ifdef _XBOX_ONE + ui.ShowPlayerDisplayname(true); +#endif + ui.NavigateToScene(primaryPad,eUIScene_TrialExitUpsell); + } + break; +#endif + +#ifdef _DURANGO + case eControl_XboxHelp: + ui.PlayUISFX(eSFX_Press); + + m_eAction=eAction_RunXboxHelp; + signInReturnedFunc = &UIScene_MainMenu::XboxHelp_SignInReturned; + break; +#endif + + default: __debugbreak(); + } + + bool confirmUser = false; + + // Note: if no sign in returned func, assume this isn't required + if (signInReturnedFunc != NULL) + { + if(ProfileManager.IsSignedIn(primaryPad)) + { + if (confirmUser) + { + ProfileManager.RequestSignInUI(false, false, true, false, true, signInReturnedFunc, this, primaryPad); + } + else + { + RunAction(primaryPad); + } + } + else + { + // Ask user to sign in + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_OK; + uiIDA[1]=IDS_CONFIRM_CANCEL; + ui.RequestErrorMessage(IDS_MUST_SIGN_IN_TITLE, IDS_MUST_SIGN_IN_TEXT, uiIDA, 2, primaryPad, &UIScene_MainMenu::MustSignInReturned, this); + } + } +} + +// Run current action +void UIScene_MainMenu::RunAction(int iPad) +{ + switch(m_eAction) + { + case eAction_RunGame: + RunPlayGame(iPad); + break; + case eAction_RunLeaderboards: + RunLeaderboards(iPad); + break; + case eAction_RunAchievements: + RunAchievements(iPad); + break; + case eAction_RunHelpAndOptions: + RunHelpAndOptions(iPad); + break; + case eAction_RunUnlockOrDLC: + RunUnlockOrDLC(iPad); + break; +#ifdef _DURANGO + case eAction_RunXboxHelp: + // 4J: Launch the dummy xbox help application. + WXS::User^ user = ProfileManager.GetUser(ProfileManager.GetPrimaryPad()); + Windows::Xbox::ApplicationModel::Help::Show(user); + break; +#endif + } +} + +void UIScene_MainMenu::customDraw(IggyCustomDrawCallbackRegion *region) +{ + if(wcscmp((wchar_t *)region->name,L"Splash")==0) + { + PIXBeginNamedEvent(0,"Custom draw splash"); + customDrawSplash(region); + PIXEndNamedEvent(); + } +} + +void UIScene_MainMenu::customDrawSplash(IggyCustomDrawCallbackRegion *region) +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + + // 4J Stu - Move this to the ctor when the main menu is not the first scene we navigate to + ScreenSizeCalculator ssc(pMinecraft->options, pMinecraft->width_phys, pMinecraft->height_phys); + m_fScreenWidth=(float)pMinecraft->width_phys; + m_fRawWidth=(float)ssc.rawWidth; + m_fScreenHeight=(float)pMinecraft->height_phys; + m_fRawHeight=(float)ssc.rawHeight; + + + // Setup GDraw, normal game render states and matrices + CustomDrawData *customDrawRegion = ui.setupCustomDraw(this,region); + delete customDrawRegion; + + + Font *font = pMinecraft->font; + + // build and render with the game call + glDisable(GL_CULL_FACE); + glDisable(GL_DEPTH_TEST); + + glPushMatrix(); + + float width = region->x1 - region->x0; + float height = region->y1 - region->y0; + float xo = width/2; + float yo = height; + + glTranslatef(xo, yo, 0); + + glRotatef(-17, 0, 0, 1); + float sss = 1.8f - Mth::abs(Mth::sin(System::currentTimeMillis() % 1000 / 1000.0f * PI * 2) * 0.1f); + sss*=(m_fScreenWidth/m_fRawWidth); + + sss = sss * 100 / (font->width(m_splash) + 8 * 4); + glScalef(sss, sss, sss); + //drawCenteredString(font, splash, 0, -8, 0xffff00); + font->drawShadow(m_splash, 0 - (font->width(m_splash)) / 2, -8, 0xffff00); + glPopMatrix(); + + glDisable(GL_RESCALE_NORMAL); + + glEnable(GL_DEPTH_TEST); + + + // Finish GDraw and anything else that needs to be finalised + ui.endCustomDraw(region); +} + +int UIScene_MainMenu::MustSignInReturned(void *pParam, int iPad, C4JStorage::EMessageResult result) +{ + UIScene_MainMenu* pClass = (UIScene_MainMenu*)pParam; + + if(result==C4JStorage::EMessage_ResultAccept) + { + // we need to specify local game here to display local and LIVE profiles in the list + switch(pClass->m_eAction) + { + case eAction_RunGame: ProfileManager.RequestSignInUI(false, true, false, false, true, &UIScene_MainMenu::CreateLoad_SignInReturned, pClass, iPad ); break; + case eAction_RunHelpAndOptions: ProfileManager.RequestSignInUI(false, false, true, false, true, &UIScene_MainMenu::HelpAndOptions_SignInReturned, pClass, iPad ); break; + case eAction_RunLeaderboards: ProfileManager.RequestSignInUI(false, false, true, false, true, &UIScene_MainMenu::Leaderboards_SignInReturned, pClass, iPad ); break; + case eAction_RunAchievements: ProfileManager.RequestSignInUI(false, false, true, false, true, &UIScene_MainMenu::Achievements_SignInReturned, pClass, iPad ); break; + case eAction_RunUnlockOrDLC: ProfileManager.RequestSignInUI(false, false, true, false, true, &UIScene_MainMenu::UnlockFullGame_SignInReturned, pClass, iPad ); break; +#ifdef _DURANGO + case eAction_RunXboxHelp: ProfileManager.RequestSignInUI(false, false, true, false, true, &UIScene_MainMenu::XboxHelp_SignInReturned, pClass, iPad ); break; +#endif + } + } + else + { + pClass->m_bIgnorePress=false; + // unlock the profile + ProfileManager.SetLockedProfile(-1); + for(int i=0;im_eAction) + { + case eAction_RunLeaderboardsPSN: + SQRNetworkManager_PS3::AttemptPSNSignIn(&UIScene_MainMenu::Leaderboards_SignInReturned, pClass); + break; + case eAction_RunGamePSN: + SQRNetworkManager_PS3::AttemptPSNSignIn(&UIScene_MainMenu::CreateLoad_SignInReturned, pClass); + break; + case eAction_RunUnlockOrDLCPSN: + SQRNetworkManager_PS3::AttemptPSNSignIn(&UIScene_MainMenu::UnlockFullGame_SignInReturned, pClass); + break; + } +#elif defined __PSVITA__ + switch(pClass->m_eAction) + { + case eAction_RunLeaderboardsPSN: + //CD - Must force Ad-Hoc off if they want leaderboard PSN sign-in + //Save settings change + app.SetGameSettings(0, eGameSetting_PSVita_NetworkModeAdhoc, 0); + //Force off + CGameNetworkManager::setAdhocMode(false); + //Now Sign-in + SQRNetworkManager_Vita::AttemptPSNSignIn(&UIScene_MainMenu::Leaderboards_SignInReturned, pClass); + break; + case eAction_RunGamePSN: + 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 + //Save settings change + app.SetGameSettings(0, eGameSetting_PSVita_NetworkModeAdhoc, 0); + //Force off + CGameNetworkManager::setAdhocMode(false); + //Now Sign-in + SQRNetworkManager_Vita::AttemptPSNSignIn(&UIScene_MainMenu::UnlockFullGame_SignInReturned, pClass); + break; + } +#else + switch(pClass->m_eAction) + { + case eAction_RunLeaderboardsPSN: + SQRNetworkManager_Orbis::AttemptPSNSignIn(&UIScene_MainMenu::Leaderboards_SignInReturned, pClass, true, iPad); + break; + case eAction_RunGamePSN: + SQRNetworkManager_Orbis::AttemptPSNSignIn(&UIScene_MainMenu::CreateLoad_SignInReturned, pClass, true, iPad); + break; + case eAction_RunUnlockOrDLCPSN: + SQRNetworkManager_Orbis::AttemptPSNSignIn(&UIScene_MainMenu::UnlockFullGame_SignInReturned, pClass, true, iPad); + break; + } + +#endif + } + else + { + if( pClass->m_eAction == eAction_RunGamePSN ) + { + if( result == C4JStorage::EMessage_Cancelled) + CreateLoad_SignInReturned(pClass, false, 0); + else + CreateLoad_SignInReturned(pClass, true, 0); + } + else + { + pClass->m_bIgnorePress=false; + } + } + + return 0; +} +#endif + +#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; + + if(bContinue) + { + // 4J-JEV: Don't we only need to update rich-presence if the sign-in status changes. + ProfileManager.SetCurrentGameActivity(iPad, CONTEXT_PRESENCE_MENUS, false); + +#if TO_BE_IMPLEMENTED + if(app.GetTMSDLCInfoRead()) +#endif + { + ProfileManager.SetLockedProfile(ProfileManager.GetPrimaryPad()); +#ifdef _XBOX_ONE + ui.ShowPlayerDisplayname(true); +#endif + proceedToScene(iPad, eUIScene_HelpAndOptionsMenu); + } +#if TO_BE_IMPLEMENTED + else + { + // Changing to async TMS calls + app.SetTMSAction(iPad,eTMSAction_TMSPP_RetrieveFiles_HelpAndOptions); + + // block all input + pClass->m_bIgnorePress=true; + // We want to hide everything in this scene and display a timer until we get a completion for the TMS files + for(int i=0;im_Buttons[i].SetShow(FALSE); + } + + pClass->updateTooltips(); + + pClass->m_Timer.SetShow(TRUE); + } +#endif + } + else + { + pClass->m_bIgnorePress=false; + // unlock the profile + ProfileManager.SetLockedProfile(-1); + for(int i=0;im_bIgnorePress = false; + 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; + + if(bContinue) + { + // 4J-JEV: We only need to update rich-presence if the sign-in status changes. + ProfileManager.SetCurrentGameActivity(iPad, CONTEXT_PRESENCE_MENUS, false); + + UINT uiIDA[1] = { IDS_OK }; + + if(ProfileManager.IsGuest(ProfileManager.GetPrimaryPad())) + { + pClass->m_bIgnorePress=false; + ui.RequestErrorMessage(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1); + } + else + { + ProfileManager.SetLockedProfile(ProfileManager.GetPrimaryPad()); + + + // change the minecraft player name + Minecraft::GetInstance()->user->name = convStringToWstring( ProfileManager.GetGamertag(ProfileManager.GetPrimaryPad())); + + if(ProfileManager.IsFullVersion()) + { + bool bSignedInLive = ProfileManager.IsSignedInLive(iPad); +#ifdef __PSVITA__ + if(CGameNetworkManager::usingAdhocMode()) + { + if(SQRNetworkManager_AdHoc_Vita::GetAdhocStatus()) + { + bSignedInLive = true; + } + else + { + // adhoc mode, but we didn't make the connection, turn off adhoc mode, and just go with whatever the regular online status is + CGameNetworkManager::setAdhocMode(false); + bSignedInLive = ProfileManager.IsSignedInLive(iPad); + } + } +#endif + + // Check if we're signed in to LIVE + if(bSignedInLive) + { + // 4J-PB - Need to check for installed DLC + if(!app.DLCInstallProcessCompleted()) app.StartInstallDLCProcess(iPad); + + if(ProfileManager.IsGuest(iPad)) + { + pClass->m_bIgnorePress=false; + ui.RequestErrorMessage(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1); + } + else + { + // 4J Stu - Not relevant to PS3 +#ifdef _XBOX_ONE +// if(app.GetTMSDLCInfoRead() && app.GetBanListRead(iPad)) + if(app.GetBanListRead(iPad)) + { + Minecraft *pMinecraft=Minecraft::GetInstance(); + pMinecraft->user->name = convStringToWstring( ProfileManager.GetGamertag(ProfileManager.GetPrimaryPad())); + + // ensure we've applied this player's settings + app.ApplyGameSettingsChanged(iPad); + +#ifdef _XBOX_ONE + ui.ShowPlayerDisplayname(true); +#endif + proceedToScene(ProfileManager.GetPrimaryPad(), eUIScene_LoadOrJoinMenu); + } + else + { + app.SetTMSAction(iPad,eTMSAction_TMSPP_RetrieveFiles_RunPlayGame); + + // block all input + pClass->m_bIgnorePress=true; + // We want to hide everything in this scene and display a timer until we get a completion for the TMS files + // for(int i=0;iupdateTooltips(); + + pClass->m_controlTimer.setVisible( true ); + } +#endif +#if TO_BE_IMPLEMENTED + // check if all the TMS files are loaded + if(app.GetTMSDLCInfoRead() && app.GetTMSXUIDsFileRead() && app.GetBanListRead(iPad)) + { + if(StorageManager.SetSaveDevice(&UIScene_MainMenu::DeviceSelectReturned,pClass)==true) + { + // save device already selected + + // ensure we've applied this player's settings + app.ApplyGameSettingsChanged(ProfileManager.GetPrimaryPad()); + // check for DLC + // start timer to track DLC check finished + pClass->m_Timer.SetShow(TRUE); + XuiSetTimer(pClass->m_hObj,DLC_INSTALLED_TIMER_ID,DLC_INSTALLED_TIMER_TIME); + //app.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_MultiGameJoinLoad); + } + } + else + { + // Changing to async TMS calls + app.SetTMSAction(iPad,eTMSAction_TMSPP_RetrieveFiles_RunPlayGame); + + // block all input + pClass->m_bIgnorePress=true; + // We want to hide everything in this scene and display a timer until we get a completion for the TMS files + for(int i=0;im_Buttons[i].SetShow(FALSE); + } + + updateTooltips(); + + pClass->m_Timer.SetShow(TRUE); + } +#else + Minecraft *pMinecraft=Minecraft::GetInstance(); + pMinecraft->user->name = convStringToWstring( ProfileManager.GetGamertag(ProfileManager.GetPrimaryPad())); + + // ensure we've applied this player's settings + app.ApplyGameSettingsChanged(iPad); + +#ifdef _XBOX_ONE + ui.ShowPlayerDisplayname(true); +#endif + proceedToScene(ProfileManager.GetPrimaryPad(), eUIScene_LoadOrJoinMenu); +#endif + } + } + else + { +#if TO_BE_IMPLEMENTED + // offline + ProfileManager.DisplayOfflineProfile(&CScene_Main::CreateLoad_OfflineProfileReturned,pClass, ProfileManager.GetPrimaryPad() ); +#else + app.DebugPrintf("Offline Profile returned not implemented\n"); +#ifdef _XBOX_ONE + ui.ShowPlayerDisplayname(true); +#endif + proceedToScene(ProfileManager.GetPrimaryPad(), eUIScene_LoadOrJoinMenu); +#endif + } + } + else + { + // 4J-PB - if this is the trial game, we can't have any networking + // Can't apply the player's settings here - they haven't come back from the QuerySignInStatud call above yet. + // Need to let them action in the main loop when they come in + // ensure we've applied this player's settings + //app.ApplyGameSettingsChanged(iPad); + +#if defined(__PS3__) || defined(__ORBIS__) || defined( __PSVITA__) + // ensure we've applied this player's settings - we do have them on PS3 + app.ApplyGameSettingsChanged(iPad); +#endif + +#ifdef __ORBIS__ + if(!g_NetworkManager.IsReadyToPlayOrIdle()) + { + pClass->m_bLoadTrialOnNetworkManagerReady = true; + ui.NavigateToScene(iPad, eUIScene_Timer); + } + else +#endif + { + // go straight in to the trial level + LoadTrial(); + } + } + } + } + else + { + pClass->m_bIgnorePress=false; + + // unlock the profile + ProfileManager.SetLockedProfile(-1); + for(int i=0;im_bIgnorePress=false; + ui.RequestErrorMessage(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1); + } + else if(!ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad())) + { + pClass->m_bIgnorePress=false; + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1); + } + else + { + bool bContentRestricted=false; +#if defined(__PS3__) || defined(__PSVITA__) + ProfileManager.GetChatAndContentRestrictions(iPad,true,NULL,&bContentRestricted,NULL); +#endif + if(bContentRestricted) + { + pClass->m_bIgnorePress=false; +#if !(defined(_XBOX) || defined(_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.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad()); +#endif + } + else + { + ProfileManager.SetLockedProfile(ProfileManager.GetPrimaryPad()); +#ifdef _XBOX_ONE + ui.ShowPlayerDisplayname(true); +#endif + proceedToScene(ProfileManager.GetPrimaryPad(), eUIScene_LeaderboardsMenu); + } + } + } + else + { + pClass->m_bIgnorePress=false; + // unlock the profile + ProfileManager.SetLockedProfile(-1); + for(int i=0;im_bIgnorePress=false; + // 4J-JEV: We only need to update rich-presence if the sign-in status changes. + ProfileManager.SetCurrentGameActivity(iPad, CONTEXT_PRESENCE_MENUS, false); + + XShowAchievementsUI( ProfileManager.GetPrimaryPad() ); + } + else + { + pClass->m_bIgnorePress=false; + // unlock the profile + ProfileManager.SetLockedProfile(-1); + for(int i=0;iRunUnlockOrDLC(iPad); + } + else + { + pClass->m_bIgnorePress=false; + // unlock the profile + ProfileManager.SetLockedProfile(-1); + for(int i=0;im_errorCode = ProfileManager.getNPAvailability(ProfileManager.GetPrimaryPad()); + + bool bPatchAvailable; + switch(pClass->m_errorCode) + { + case SCE_NP_ERROR_LATEST_PATCH_PKG_EXIST: + case SCE_NP_ERROR_LATEST_PATCH_PKG_DOWNLOADED: + bPatchAvailable=true; + break; + default: + bPatchAvailable=false; + break; + } + + if(!bPatchAvailable) + { + pClass->m_eAction=eAction_RunGame; + signInReturnedFunc = &UIScene_MainMenu::CreateLoad_SignInReturned; + } + else + { + pClass->m_bRunGameChosen=true; + pClass->m_bErrorDialogRunning=true; + int32_t ret=sceErrorDialogInitialize(); + if ( ret==SCE_OK ) + { + SceErrorDialogParam param; + sceErrorDialogParamInitialize( ¶m ); + // 4J-PB - We want to display the option to get the patch now + param.errorCode = SCE_NP_ERROR_LATEST_PATCH_PKG_DOWNLOADED;//pClass->m_errorCode; + ret = sceUserServiceGetInitialUser( ¶m.userId ); + if ( ret == SCE_OK ) + { + ret=sceErrorDialogOpen( ¶m ); + } + return; + } + +// UINT uiIDA[1]; +// uiIDA[0]=IDS_OK; +// ui.RequestMessageBox(IDS_PATCH_AVAILABLE_TITLE, IDS_PATCH_AVAILABLE_TEXT, uiIDA, 1, XUSER_INDEX_ANY,NULL,pClass); + } + + // Check if PSN is unavailable because of age restriction + if (pClass->m_errorCode == SCE_NP_ERROR_AGE_RESTRICTION) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_PRO_NOTONLINE_DECLINE; + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad(), &UIScene_MainMenu::PlayOfflineReturned, pClass); + + return; + } + + bool confirmUser = false; + + // Note: if no sign in returned func, assume this isn't required + if (signInReturnedFunc != NULL) + { + if(ProfileManager.IsSignedIn(primaryPad)) + { + if (confirmUser) + { + ProfileManager.RequestSignInUI(false, false, true, false, true, signInReturnedFunc, pClass, primaryPad); + } + else + { + pClass->RunAction(primaryPad); + } + } + else + { + // Ask user to sign in + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_OK; + uiIDA[1]=IDS_CONFIRM_CANCEL; + ui.RequestErrorMessage(IDS_MUST_SIGN_IN_TITLE, IDS_MUST_SIGN_IN_TEXT, uiIDA, 2, primaryPad, &UIScene_MainMenu::MustSignInReturned, pClass); + } + } +} + +void UIScene_MainMenu::RefreshChatAndContentRestrictionsReturned_Leaderboards(void *pParam) +{ + int primaryPad = ProfileManager.GetPrimaryPad(); + + UIScene_MainMenu* pClass = (UIScene_MainMenu*)pParam; + + int (*signInReturnedFunc) (LPVOID,const bool, const int iPad) = NULL; + + // 4J-PB - Check if there is a patch for the game + pClass->m_errorCode = ProfileManager.getNPAvailability(ProfileManager.GetPrimaryPad()); + + bool bPatchAvailable; + switch(pClass->m_errorCode) + { + case SCE_NP_ERROR_LATEST_PATCH_PKG_EXIST: + case SCE_NP_ERROR_LATEST_PATCH_PKG_DOWNLOADED: + bPatchAvailable=true; + break; + default: + bPatchAvailable=false; + break; + } + + if(!bPatchAvailable) + { + pClass->m_eAction=eAction_RunLeaderboards; + signInReturnedFunc = &UIScene_MainMenu::Leaderboards_SignInReturned; + } + else + { + int32_t ret=sceErrorDialogInitialize(); + pClass->m_bErrorDialogRunning=true; + if ( ret==SCE_OK ) + { + SceErrorDialogParam param; + sceErrorDialogParamInitialize( ¶m ); + // 4J-PB - We want to display the option to get the patch now + param.errorCode = SCE_NP_ERROR_LATEST_PATCH_PKG_DOWNLOADED;//pClass->m_errorCode; + ret = sceUserServiceGetInitialUser( ¶m.userId ); + if ( ret == SCE_OK ) + { + ret=sceErrorDialogOpen( ¶m ); + } + } + +// UINT uiIDA[1]; +// uiIDA[0]=IDS_OK; +// ui.RequestMessageBox(IDS_PATCH_AVAILABLE_TITLE, IDS_PATCH_AVAILABLE_TEXT, uiIDA, 1, XUSER_INDEX_ANY,NULL,pClass); + } + + bool confirmUser = false; + + // Update error code + pClass->m_errorCode = ProfileManager.getNPAvailability(ProfileManager.GetPrimaryPad()); + + // Check if PSN is unavailable because of age restriction + if (pClass->m_errorCode == SCE_NP_ERROR_AGE_RESTRICTION) + { + UINT uiIDA[1]; + uiIDA[0] = IDS_CONFIRM_OK; + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad(), nullptr, pClass); + + return; + } + + // Note: if no sign in returned func, assume this isn't required + if (signInReturnedFunc != NULL) + { + if(ProfileManager.IsSignedIn(primaryPad)) + { + if (confirmUser) + { + ProfileManager.RequestSignInUI(false, false, true, false, true, signInReturnedFunc, pClass, primaryPad); + } + else + { + pClass->RunAction(primaryPad); + } + } + else + { + // Ask user to sign in + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_OK; + uiIDA[1]=IDS_CONFIRM_CANCEL; + ui.RequestErrorMessage(IDS_MUST_SIGN_IN_TITLE, IDS_MUST_SIGN_IN_TEXT, uiIDA, 2, primaryPad, &UIScene_MainMenu::MustSignInReturned, pClass); + } + } +} + +int UIScene_MainMenu::PlayOfflineReturned(void *pParam, int iPad, C4JStorage::EMessageResult result) +{ + UIScene_MainMenu* pClass = (UIScene_MainMenu*)pParam; + + if(result==C4JStorage::EMessage_ResultAccept) + { + if (pClass->m_eAction == eAction_RunGame) + { + CreateLoad_SignInReturned(pClass, true, 0); + } + else + { + pClass->m_bIgnorePress=false; + } + } + else + { + pClass->m_bIgnorePress=false; + } + + return 0; +} +#endif + +void UIScene_MainMenu::RunPlayGame(int iPad) +{ + Minecraft *pMinecraft=Minecraft::GetInstance(); + + // clear the remembered signed in users so their profiles get read again + app.ClearSignInChangeUsersMask(); + + app.ReleaseSaveThumbnail(); + + if(ProfileManager.IsGuest(iPad)) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + + m_bIgnorePress=false; + ui.RequestErrorMessage(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1); + } + else + { + ProfileManager.SetLockedProfile(iPad); + + // If the player was signed in before selecting play, we'll not have read the profile yet, so query the sign-in status to get this to happen + ProfileManager.QuerySigninStatus(); + + // 4J-PB - Need to check for installed DLC + if(!app.DLCInstallProcessCompleted()) app.StartInstallDLCProcess(iPad); + + if(ProfileManager.IsFullVersion()) + { + // are we offline? + bool bSignedInLive = ProfileManager.IsSignedInLive(iPad); +#ifdef __PSVITA__ + if(app.GetGameSettings(ProfileManager.GetPrimaryPad(),eGameSetting_PSVita_NetworkModeAdhoc) == true) + { + CGameNetworkManager::setAdhocMode(true); + bSignedInLive = SQRNetworkManager_AdHoc_Vita::GetAdhocStatus(); + app.DebugPrintf("Adhoc mode signed in : %s\n", bSignedInLive ? "true" : "false"); + } + else + { + CGameNetworkManager::setAdhocMode(false); + app.DebugPrintf("PSN mode signed in : %s\n", bSignedInLive ? "true" : "false"); + } + +#endif //__PSVITA__ + + if(!bSignedInLive) + { +#if defined(__PS3__) || defined __PSVITA__ + // enable input again + m_bIgnorePress=false; + + // Not sure why 360 doesn't need this, but leaving as __PS3__ only for now until we see that it does. Without this, on a PS3 offline game, the primary player just gets the default Player1234 type name + pMinecraft->user->name = convStringToWstring( ProfileManager.GetGamertag(ProfileManager.GetPrimaryPad())); + + m_eAction=eAction_RunGamePSN; + // get them to sign in to online + UINT uiIDA[2]; + uiIDA[0]=IDS_PRO_NOTONLINE_ACCEPT; + uiIDA[1]=IDS_PRO_NOTONLINE_DECLINE; + +#ifdef __PSVITA__ + if(CGameNetworkManager::usingAdhocMode()) + { + uiIDA[0]=IDS_NETWORK_ADHOC; + // this should be "Connect to adhoc network" + ui.RequestErrorMessage(IDS_PRO_NOTADHOCONLINE_TITLE, IDS_PRO_NOTADHOCONLINE_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&UIScene_MainMenu::MustSignInReturnedPSN,this); + } + else + { + /* 4J-PB - Add this after release + // Determine why they're not "signed in live" + if (ProfileManager.IsSignedInPSN(iPad)) + { + m_eAction=eAction_RunGame; + // Signed in to PSN but not connected (no internet access) + + UINT uiIDA[1]; + uiIDA[0] = IDS_PRO_NOTONLINE_DECLINE; + ui.RequestMessageBox( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, iPad, UIScene_MainMenu::PlayOfflineReturned, this, app.GetStringTable()); + } + else + { + m_eAction=eAction_RunGamePSN; + // Not signed in to PSN + ui.RequestMessageBox( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, iPad, &UIScene_MainMenu::MustSignInReturnedPSN, this, app.GetStringTable()); + return; + } */ + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&UIScene_MainMenu::MustSignInReturnedPSN,this); + + } +#else + + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, iPad, &UIScene_MainMenu::MustSignInReturnedPSN, this); +#endif + +#elif defined __ORBIS__ + + // Determine why they're not "signed in live" + if (ProfileManager.isSignedInPSN(iPad)) + { + m_eAction=eAction_RunGame; + // Signed in to PSN but not connected (no internet access) + assert(!ProfileManager.isConnectedToPSN(iPad)); + + UINT uiIDA[1]; + uiIDA[0] = IDS_PRO_NOTONLINE_DECLINE; + ui.RequestErrorMessage( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, iPad, UIScene_MainMenu::PlayOfflineReturned, this); + } + else + { + m_eAction=eAction_RunGamePSN; + // Not signed in to PSN + UINT uiIDA[2]; + uiIDA[0] = IDS_PRO_NOTONLINE_ACCEPT; + uiIDA[1] = IDS_PRO_NOTONLINE_DECLINE; + ui.RequestAlertMessage( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, iPad, &UIScene_MainMenu::MustSignInReturnedPSN, this); + return; + } +#else + ProfileManager.SetLockedProfile(iPad); +#ifdef _XBOX_ONE + ui.ShowPlayerDisplayname(true); +#endif + proceedToScene(ProfileManager.GetPrimaryPad(), eUIScene_LoadOrJoinMenu); +#endif + } + else + { +#ifdef _XBOX_ONE + if(!app.GetBanListRead(iPad)) + { + app.SetTMSAction(iPad,eTMSAction_TMSPP_RetrieveFiles_RunPlayGame); + + // block all input + m_bIgnorePress=true; + // We want to hide everything in this scene and display a timer until we get a completion for the TMS files +// for(int i=0;iuser->name = convStringToWstring( ProfileManager.GetGamertag(ProfileManager.GetPrimaryPad())); + // save device already selected + + // ensure we've applied this player's settings + app.ApplyGameSettingsChanged(iPad); + // check for DLC + // start timer to track DLC check finished + m_Timer.SetShow(TRUE); + XuiSetTimer(m_hObj,DLC_INSTALLED_TIMER_ID,DLC_INSTALLED_TIMER_TIME); + //app.NavigateToScene(iPad,eUIScene_MultiGameJoinLoad); + } + } + else + { + // Changing to async TMS calls + app.SetTMSAction(iPad,eTMSAction_TMSPP_RetrieveFiles_RunPlayGame); + + // block all input + m_bIgnorePress=true; + // We want to hide everything in this scene and display a timer until we get a completion for the TMS files + for(int i=0;iuser->name = convStringToWstring( ProfileManager.GetGamertag(ProfileManager.GetPrimaryPad())); + + // ensure we've applied this player's settings + app.ApplyGameSettingsChanged(iPad); + +#ifdef _XBOX_ONE + ui.ShowPlayerDisplayname(true); +#endif + proceedToScene(ProfileManager.GetPrimaryPad(), eUIScene_LoadOrJoinMenu); +#endif + } + } + else + { + // 4J-PB - if this is the trial game, we can't have any networking + // go straight in to the trial level + // change the minecraft player name + Minecraft::GetInstance()->user->name = convStringToWstring( ProfileManager.GetGamertag(ProfileManager.GetPrimaryPad())); + + // Can't apply the player's settings here - they haven't come back from the QuerySignInStatud call above yet. + // Need to let them action in the main loop when they come in + // ensure we've applied this player's settings + //app.ApplyGameSettingsChanged(iPad); + +#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) + // ensure we've applied this player's settings - we do have them on PS3 + app.ApplyGameSettingsChanged(iPad); +#endif + +#ifdef __ORBIS__ + if(!g_NetworkManager.IsReadyToPlayOrIdle()) + { + m_bLoadTrialOnNetworkManagerReady = true; + ui.NavigateToScene(iPad, eUIScene_Timer); + } + else +#endif + { + LoadTrial(); + } + } + } +} + +void UIScene_MainMenu::RunLeaderboards(int iPad) +{ + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + + // guests can't look at leaderboards + if(ProfileManager.IsGuest(iPad)) + { + ui.RequestErrorMessage(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1); + } + else if(!ProfileManager.IsSignedInLive(iPad)) + { +#if defined __PS3__ || defined __PSVITA__ + m_eAction=eAction_RunLeaderboardsPSN; + // get them to sign in to online + UINT uiIDA[1]; + uiIDA[0]=IDS_PRO_NOTONLINE_ACCEPT; + ui.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__ + m_eAction=eAction_RunLeaderboardsPSN; + // Determine why they're not "signed in live" + if (ProfileManager.IsSignedInPSN(iPad)) + { + // Signed in to PSN but not connected (no internet access) + UINT uiIDA[1]; + uiIDA[0] = IDS_PRO_NOTONLINE_ACCEPT; + ui.RequestMessageBox(IDS_PRO_CURRENTLY_NOT_ONLINE_TITLE, IDS_PRO_PSNOFFLINE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad(), &UIScene_MainMenu::MustSignInReturnedPSN, this, app.GetStringTable()); + } + else + { + // Not signed in to PSN + UINT uiIDA[1]; + uiIDA[0] = IDS_PRO_NOTONLINE_ACCEPT; + ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad(), &UIScene_MainMenu::MustSignInReturnedPSN, this, app.GetStringTable()); + return; + }*/ +#elif defined __ORBIS__ + m_eAction=eAction_RunLeaderboardsPSN; + // Determine why they're not "signed in live" + if (ProfileManager.isSignedInPSN(iPad)) + { + // Signed in to PSN but not connected (no internet access) + assert(!ProfileManager.isConnectedToPSN(iPad)); + + UINT uiIDA[1]; + uiIDA[0] = IDS_OK; + ui.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.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad(), &UIScene_MainMenu::MustSignInReturnedPSN, this); + return; + } +#else + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1); +#endif + } + else + { + // we're supposed to check for parental control restrictions before showing leaderboards + // The title enforces the user's NP parental control setting for age-based content + //restriction in network communications. + // If age restrictions are in place and the user's age does not meet + // the age restriction of the title's online service content rating (CERO, ESRB, PEGI, etc.), then the title must + //display a message such as the following and disallow online service for this user. + + bool bContentRestricted=false; +#if defined(__PS3__) || defined(__PSVITA__) + ProfileManager.GetChatAndContentRestrictions(iPad,true,NULL,&bContentRestricted,NULL); +#endif + if(bContentRestricted) + { +#if !(defined(_XBOX) || defined(_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.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad(),NULL,this); +#endif + } + else + { + ProfileManager.SetLockedProfile(iPad); + // If the player was signed in before selecting play, we'll not have read the profile yet, so query the sign-in status to get this to happen + ProfileManager.QuerySigninStatus(); + +#ifdef _XBOX_ONE + ui.ShowPlayerDisplayname(true); +#endif + proceedToScene(iPad, eUIScene_LeaderboardsMenu); + } + } +} +void UIScene_MainMenu::RunUnlockOrDLC(int iPad) +{ + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + + // Check if this means downloadable content + if(ProfileManager.IsFullVersion()) + { +#ifdef __ORBIS__ + // 4J-PB - Check if there is a patch for the game + m_errorCode = ProfileManager.getNPAvailability(ProfileManager.GetPrimaryPad()); + + bool bPatchAvailable; + switch(m_errorCode) + { + case SCE_NP_ERROR_LATEST_PATCH_PKG_EXIST: + case SCE_NP_ERROR_LATEST_PATCH_PKG_DOWNLOADED: + bPatchAvailable=true; + break; + default: + bPatchAvailable=false; + break; + } + + if(bPatchAvailable) + { + m_bIgnorePress=false; + + int32_t ret=sceErrorDialogInitialize(); + m_bErrorDialogRunning=true; + if ( ret==SCE_OK ) + { + SceErrorDialogParam param; + sceErrorDialogParamInitialize( ¶m ); + // 4J-PB - We want to display the option to get the patch now + param.errorCode = SCE_NP_ERROR_LATEST_PATCH_PKG_DOWNLOADED;//pClass->m_errorCode; + ret = sceUserServiceGetInitialUser( ¶m.userId ); + if ( ret == SCE_OK ) + { + ret=sceErrorDialogOpen( ¶m ); + } + } + +// UINT uiIDA[1]; +// uiIDA[0]=IDS_OK; +// ui.RequestMessageBox(IDS_PATCH_AVAILABLE_TITLE, IDS_PATCH_AVAILABLE_TEXT, uiIDA, 1, XUSER_INDEX_ANY,NULL,this); + return; + } + + // Check if PSN is unavailable because of age restriction + if (m_errorCode == SCE_NP_ERROR_AGE_RESTRICTION) + { + m_bIgnorePress=false; + UINT uiIDA[1]; + uiIDA[0] = IDS_OK; + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad(), nullptr, this); + + return; + } +#endif + // downloadable content + if(ProfileManager.IsSignedInLive(iPad)) + { + if(ProfileManager.IsGuest(iPad)) + { + m_bIgnorePress=false; + ui.RequestErrorMessage(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1); + } + else + { + + // If the player was signed in before selecting play, we'll not have read the profile yet, so query the sign-in status to get this to happen + ProfileManager.QuerySigninStatus(); + +#if defined _XBOX_ONE + if(app.GetTMSDLCInfoRead()) +#endif + { + bool bContentRestricted=false; +#if defined(__PS3__) || defined(__PSVITA__) + ProfileManager.GetChatAndContentRestrictions(iPad,true,NULL,&bContentRestricted,NULL); +#endif + if(bContentRestricted) + { + m_bIgnorePress=false; +#if !(defined(_XBOX) || defined(_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.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad(),NULL,this); +#endif + } + else + { + ProfileManager.SetLockedProfile(iPad); +#ifdef _XBOX_ONE + ui.ShowPlayerDisplayname(true); +#endif + proceedToScene(ProfileManager.GetPrimaryPad(), eUIScene_DLCMainMenu); + } + } +#if defined _XBOX_ONE + else + { + // Changing to async TMS calls + app.SetTMSAction(iPad,eTMSAction_TMSPP_RetrieveFiles_DLCMain); + + // block all input + m_bIgnorePress=true; + // We want to hide everything in this scene and display a timer until we get a completion for the TMS files +// for(int i=0;iRecordUpsellPresented(iPad, eSen_UpsellID_Full_Version_Of_Game, app.m_dwOfferID); + ProfileManager.DisplayFullVersionPurchase(false,iPad,eSen_UpsellID_Full_Version_Of_Game); +#endif + } + } +} + +void UIScene_MainMenu::tick() +{ + UIScene::tick(); + + if ( (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) + { + int iCommerceState=app.GetCommerceState(); + // 4J-PB - if there's a commerce error - store down, player can't access store - let the DisplayFullVersionPurchase show the error + if((iCommerceState==CConsoleMinecraftApp::eCommerce_State_Online) || (iCommerceState==CConsoleMinecraftApp::eCommerce_State_Error)) + { + m_bLaunchFullVersionPurchase=false; + m_bIgnorePress=false; + updateTooltips(); + + // 4J-PB - need to check this user can access the store + bool bContentRestricted=false; + ProfileManager.GetChatAndContentRestrictions(ProfileManager.GetPrimaryPad(),true,NULL,&bContentRestricted,NULL); + if(bContentRestricted) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad()); + } + else + { + TelemetryManager->RecordUpsellPresented(ProfileManager.GetPrimaryPad(), eSen_UpsellID_Full_Version_Of_Game, app.m_dwOfferID); + ProfileManager.DisplayFullVersionPurchase(false,ProfileManager.GetPrimaryPad(),eSen_UpsellID_Full_Version_Of_Game); + } + } + } + + // 4J-PB - check for a trial version changing to a full version + if(m_bTrialVersion) + { + if(ProfileManager.IsFullVersion()) + { + m_bTrialVersion=false; + m_buttons[(int)eControl_UnlockOrDLC].init(app.GetString(IDS_DOWNLOADABLECONTENT),eControl_UnlockOrDLC); + } + } +#endif + +#if defined _XBOX_ONE + if(m_bWaitingForDLCInfo) + { + if(app.GetTMSDLCInfoRead()) + { + m_bWaitingForDLCInfo=false; + ProfileManager.SetLockedProfile(m_iPad); + proceedToScene(ProfileManager.GetPrimaryPad(), eUIScene_DLCMainMenu); + } + } + + if(g_NetworkManager.ShouldMessageForFullSession()) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestErrorMessage( IDS_CONNECTION_FAILED, IDS_IN_PARTY_SESSION_FULL, uiIDA,1,ProfileManager.GetPrimaryPad()); + } +#endif + +#ifdef __ORBIS__ + + // process the error dialog (for a patch being available) + // SQRNetworkManager_Orbis::tickErrorDialog also runs the error dialog, so wrap this so this doesn't terminate a signin dialog + if(m_bErrorDialogRunning) + { + SceErrorDialogStatus stat = sceErrorDialogUpdateStatus(); + if( stat == SCE_ERROR_DIALOG_STATUS_FINISHED ) + { + sceErrorDialogTerminate(); + // if m_bRunGameChosen is true, we're here after selecting play game, and we should let the user continue with an offline game + if(m_bRunGameChosen) + { + m_bRunGameChosen=false; + m_eAction = eAction_RunGame; + + // give the option of continuing offline + UINT uiIDA[1]; + uiIDA[0]=IDS_PRO_NOTONLINE_DECLINE; + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION_PATCH_AVAILABLE, uiIDA, 1, ProfileManager.GetPrimaryPad(), &UIScene_MainMenu::PlayOfflineReturned, this); + + } + m_bErrorDialogRunning=false; + } + } + + if(m_bLoadTrialOnNetworkManagerReady && g_NetworkManager.IsReadyToPlayOrIdle()) + { + m_bLoadTrialOnNetworkManagerReady = false; + LoadTrial(); + } + +#endif +} + +void UIScene_MainMenu::RunAchievements(int iPad) +{ +#if TO_BE_IMPLEMENTED + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + + // guests can't look at achievements + if(ProfileManager.IsGuest(iPad)) + { + ui.RequestErrorMessage(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1); + } + else + { + XShowAchievementsUI( iPad ); + } +#endif +} + +void UIScene_MainMenu::RunHelpAndOptions(int iPad) +{ + if(ProfileManager.IsGuest(iPad)) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + ui.RequestErrorMessage(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1); + } + else + { + // If the player was signed in before selecting play, we'll not have read the profile yet, so query the sign-in status to get this to happen + ProfileManager.QuerySigninStatus(); + +#if TO_BE_IMPLEMENTED + // 4J-PB - You can be offline and still can go into help and options + if(app.GetTMSDLCInfoRead() || !ProfileManager.IsSignedInLive(iPad)) +#endif + { + ProfileManager.SetLockedProfile(iPad); +#ifdef _XBOX_ONE + ui.ShowPlayerDisplayname(true); +#endif + proceedToScene(iPad, eUIScene_HelpAndOptionsMenu); + } +#if TO_BE_IMPLEMENTED + else + { + // Changing to async TMS calls + app.SetTMSAction(iPad,eTMSAction_TMSPP_RetrieveFiles_HelpAndOptions); + + // block all input + m_bIgnorePress=true; + // We want to hide everything in this scene and display a timer until we get a completion for the TMS files + for(int i=0;iseed = 0; + param->saveData = NULL; + param->settings = app.GetGameHostOption( eGameHostOption_Tutorial ) | app.GetGameHostOption(eGameHostOption_DisableSaving); + + vector *generators = app.getLevelGenerators(); + param->levelGen = generators->at(0); + + LoadingInputParams *loadingParams = new LoadingInputParams(); + loadingParams->func = &CGameNetworkManager::RunNetworkGameThreadProc; + loadingParams->lpParam = (LPVOID)param; + + UIFullscreenProgressCompletionData *completionData = new UIFullscreenProgressCompletionData(); + completionData->bShowBackground=TRUE; + completionData->bShowLogo=TRUE; + completionData->type = e_ProgressCompletion_CloseAllPlayersUIScenes; + completionData->iPad = ProfileManager.GetPrimaryPad(); + loadingParams->completionData = completionData; + + ui.ShowTrialTimer(true); + +#ifdef _XBOX_ONE + ui.ShowPlayerDisplayname(true); +#endif + ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_FullscreenProgress, loadingParams); +} + +void UIScene_MainMenu::handleUnlockFullVersion() +{ + m_buttons[(int)eControl_UnlockOrDLC].setLabel(IDS_DOWNLOADABLECONTENT,true); +} + + +#ifdef __PSVITA__ +int UIScene_MainMenu::SelectNetworkModeReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + UIScene_MainMenu* pClass = (UIScene_MainMenu*)pParam; + + if(result==C4JStorage::EMessage_ResultAccept) + { + app.DebugPrintf("Setting network mode to PSN\n"); + app.SetGameSettings(0, eGameSetting_PSVita_NetworkModeAdhoc, 0); + } + else if(result==C4JStorage::EMessage_ResultDecline) + { + app.DebugPrintf("Setting network mode to Adhoc\n"); + app.SetGameSettings(0, eGameSetting_PSVita_NetworkModeAdhoc, 1); + } + pClass->updateTooltips(); + return 0; +} +#endif //__PSVITA__ diff --git a/Minecraft.Client/Common/UI/UIScene_MainMenu.h b/Minecraft.Client/Common/UI/UIScene_MainMenu.h new file mode 100644 index 00000000..2b49a44b --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_MainMenu.h @@ -0,0 +1,195 @@ +#pragma once + +#include "UIScene.h" + +class UIScene_MainMenu : public UIScene +{ +private: + enum EControls + { + eControl_PlayGame, + eControl_Leaderboards, + eControl_Achievements, + eControl_HelpAndOptions, + eControl_UnlockOrDLC, +#ifndef _DURANGO + eControl_Exit, +#else + eControl_XboxHelp, +#endif + eControl_Count, + }; + +// #ifdef __ORBIS__ +// enum EPatchCheck +// { +// ePatchCheck_Idle, +// ePatchCheck_Init, +// ePatchCheck_Running, +// }; +// #endif + + UIControl_Button m_buttons[eControl_Count]; + UIControl m_controlTimer; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_buttons[(int)eControl_PlayGame], "Button1") + UI_MAP_ELEMENT( m_buttons[(int)eControl_Leaderboards], "Button2") + UI_MAP_ELEMENT( m_buttons[(int)eControl_Achievements], "Button3") + UI_MAP_ELEMENT( m_buttons[(int)eControl_HelpAndOptions], "Button4") + UI_MAP_ELEMENT( m_buttons[(int)eControl_UnlockOrDLC], "Button5") +#ifndef _DURANGO + UI_MAP_ELEMENT( m_buttons[(int)eControl_Exit], "Button6") +#else + UI_MAP_ELEMENT( m_buttons[(int)eControl_XboxHelp], "Button6") +#endif + UI_MAP_ELEMENT( m_controlTimer, "Timer") + UI_END_MAP_ELEMENTS_AND_NAMES() + + static Random *random; + bool m_bIgnorePress; + bool m_bTrialVersion; + bool m_bLoadTrialOnNetworkManagerReady; +#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) + bool m_bLaunchFullVersionPurchase; +#endif + +#ifdef _XBOX_ONE + bool m_bWaitingForDLCInfo; +#endif + + float m_fScreenWidth,m_fScreenHeight; + float m_fRawWidth,m_fRawHeight; + vector m_splashes; + wstring m_splash; + enum eSplashIndexes + { + eSplashHappyBirthdayEx = 0, + eSplashHappyBirthdayNotch, + eSplashMerryXmas, + eSplashHappyNewYear, + + // The start index in the splashes vector from which we can select a random splash + eSplashRandomStart, + }; + + enum eActions + { + eAction_None=0, + eAction_RunGame, + eAction_RunLeaderboards, + eAction_RunAchievements, + eAction_RunHelpAndOptions, + eAction_RunUnlockOrDLC, +#if defined(__PS3__)|| defined(__PSVITA__) || defined(__ORBIS__) + eAction_RunLeaderboardsPSN, + eAction_RunGamePSN, + eAction_RunUnlockOrDLCPSN, +#elif defined _DURANGO + eAction_RunXboxHelp, +#endif + + }; + eActions m_eAction; + +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; } +#endif + + virtual void updateTooltips(); + virtual void updateComponents(); + + virtual EUIScene getSceneType() { return eUIScene_MainMenu;} + + virtual void customDraw(IggyCustomDrawCallbackRegion *region); +protected: + void customDrawSplash(IggyCustomDrawCallbackRegion *region); + + + virtual wstring getMoviePath(); + +public: + virtual void tick(); + virtual void handleReload(); + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + + virtual void handleUnlockFullVersion(); + +protected: + void handlePress(F64 controlId, F64 childId); + + void handleGainFocus(bool navBack); + + virtual long long getDefaultGtcButtons() { return 0; } + +private: + void RunPlayGame(int iPad); + void RunLeaderboards(int iPad); + void RunUnlockOrDLC(int iPad); + void RunAchievements(int iPad); + void RunHelpAndOptions(int iPad); + + void RunAction(int iPad); + + static void LoadTrial(); + +#ifdef _XBOX_ONE + static int ChooseUser_SignInReturned(void *pParam,bool bContinue, int iPad, 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); + static int MustSignInReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + +#if defined(__PS3__) || defined(__PSVITA__) || defined(__ORBIS__) + static int MustSignInReturnedPSN(void *pParam,int iPad,C4JStorage::EMessageResult result); +#endif + static int Leaderboards_SignInReturned(void* pParam, bool bContinue, int iPad); + static int UnlockFullGame_SignInReturned(void *pParam,bool bContinue,int iPad); + static int ExitGameReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + +#ifdef __ORBIS__ + static void RefreshChatAndContentRestrictionsReturned_PlayGame(void *pParam); + static void RefreshChatAndContentRestrictionsReturned_Leaderboards(void *pParam); + + static int PlayOfflineReturned(void *pParam, int iPad, C4JStorage::EMessageResult result); +#endif +#endif + +#ifdef __PSVITA__ + static int SelectNetworkModeReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); +#endif + +#ifdef __ORBIS__ + //EPatchCheck m_ePatchCheckState; + bool m_bRunGameChosen; + int32_t m_errorCode; + bool m_bErrorDialogRunning; +#endif +}; diff --git a/Minecraft.Client/Common/UI/UIScene_MessageBox.cpp b/Minecraft.Client/Common/UI/UIScene_MessageBox.cpp new file mode 100644 index 00000000..6b8dc552 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_MessageBox.cpp @@ -0,0 +1,161 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_MessageBox.h" + +UIScene_MessageBox::UIScene_MessageBox(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + MessageBoxInfo *param = (MessageBoxInfo *)initData; + + m_buttonCount = param->uiOptionC; + + IggyDataValue result; + IggyDataValue value[2]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = param->uiOptionC; + + value[1].type = IGGY_DATATYPE_number; + value[1].number = param->dwFocusButton; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcInit , 2 , value ); + + int buttonIndex = 0; + if(param->uiOptionC > 3) + { + m_buttonButtons[eControl_Button0].init(app.GetString(param->uiOptionA[buttonIndex]),buttonIndex); + ++buttonIndex; + } + if(param->uiOptionC > 2) + { + m_buttonButtons[eControl_Button1].init(app.GetString(param->uiOptionA[buttonIndex]),buttonIndex); + ++buttonIndex; + } + if(param->uiOptionC > 1) + { + m_buttonButtons[eControl_Button2].init(app.GetString(param->uiOptionA[buttonIndex]),buttonIndex); + ++buttonIndex; + } + m_buttonButtons[eControl_Button3].init(app.GetString(param->uiOptionA[buttonIndex]),buttonIndex); + + m_labelTitle.init(app.GetString(param->uiTitle)); + m_labelContent.init(app.GetString(param->uiText)); + + out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcAutoResize , 0 , NULL ); + + m_Func = param->Func; + m_lpParam = param->lpParam; + + parentLayer->addComponent(iPad,eUIComponent_MenuBackground); + + // 4J-TomK - rebuild touch after auto resize +#ifdef __PSVITA__ + ui.TouchBoxRebuild(this); +#endif +} + +UIScene_MessageBox::~UIScene_MessageBox() +{ + m_parentLayer->removeComponent(eUIComponent_MenuBackground); +} + +wstring UIScene_MessageBox::getMoviePath() +{ + if(app.GetLocalPlayerCount() > 1 && !m_parentLayer->IsFullscreenGroup()) + { + return L"MessageBoxSplit"; + } + else + { + return L"MessageBox"; + } +} + +void UIScene_MessageBox::updateTooltips() +{ + ui.SetTooltips( m_parentLayer->IsFullscreenGroup()?XUSER_INDEX_ANY:m_iPad, IDS_TOOLTIPS_SELECT, IDS_TOOLTIPS_CANCEL); +} + +void UIScene_MessageBox::handleReload() +{ + IggyDataValue result; + IggyDataValue value[2]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = m_buttonCount; + + value[1].type = IGGY_DATATYPE_number; + value[1].number = (F64)getControlFocus(); + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcInit , 2 , value ); + + out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcAutoResize , 0 , NULL ); +} + +void UIScene_MessageBox::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + //app.DebugPrintf("UIScene_DebugOverlay handling input for pad %d, key %d, down- %s, pressed- %s, released- %s\n", iPad, key, down?"TRUE":"FALSE", pressed?"TRUE":"FALSE", released?"TRUE":"FALSE"); + ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); + switch(key) + { + case ACTION_MENU_CANCEL: + if(pressed) + { + navigateBack(); + if(m_Func) m_Func(m_lpParam, iPad, C4JStorage::EMessage_Cancelled); + } + break; + case ACTION_MENU_OK: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + sendInputToMovie(key, repeat, pressed, released); + break; + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + sendInputToMovie(key, repeat, pressed, released); + break; + } + handled = true; +} + +void UIScene_MessageBox::handlePress(F64 controlId, F64 childId) +{ + C4JStorage::EMessageResult result = C4JStorage::EMessage_Cancelled; + switch((int)controlId) + { + case 0: + result = C4JStorage::EMessage_ResultAccept; + break; + case 1: + result = C4JStorage::EMessage_ResultDecline; + break; + case 2: + result = C4JStorage::EMessage_ResultThirdOption; + break; + case 3: + result = C4JStorage::EMessage_ResultFourthOption; + break; + } + + navigateBack(); + if(m_Func) m_Func(m_lpParam, m_iPad, result); +} + +bool UIScene_MessageBox::hasFocus(int iPad) +{ + // 4J-JEV: Fix for PS4 #5204 - [TRC][R4033] The application can be locked up by second user logging out of the system. + if (m_iPad == 255) + { + // Message box is for everyone + return bHasFocus; + } + else if (ProfileManager.IsSignedIn(m_iPad)) + { + // Owner is still present + return bHasFocus && (iPad == m_iPad); + } + else + { + // Original owner has left so let everyone interact + return bHasFocus; + } +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_MessageBox.h b/Minecraft.Client/Common/UI/UIScene_MessageBox.h new file mode 100644 index 00000000..c10f6ab8 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_MessageBox.h @@ -0,0 +1,60 @@ +#pragma once + +#include "UIScene.h" + +class UIScene_MessageBox : public UIScene +{ +private: + enum EControls + { + eControl_Button0, + eControl_Button1, + eControl_Button2, + eControl_Button3, + + eControl_COUNT + }; + + int( *m_Func)(LPVOID,int,const C4JStorage::EMessageResult); + LPVOID m_lpParam; + int m_buttonCount; + + UIControl_Button m_buttonButtons[eControl_COUNT]; + UIControl_Label m_labelTitle, m_labelContent; + IggyName m_funcInit, m_funcAutoResize; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_buttonButtons[eControl_Button0], "Button0") + UI_MAP_ELEMENT( m_buttonButtons[eControl_Button1], "Button1") + UI_MAP_ELEMENT( m_buttonButtons[eControl_Button2], "Button2") + UI_MAP_ELEMENT( m_buttonButtons[eControl_Button3], "Button3") + + UI_MAP_ELEMENT( m_labelTitle, "Title") + UI_MAP_ELEMENT( m_labelContent, "Content") + + UI_MAP_NAME( m_funcInit, L"Init") + UI_MAP_NAME( m_funcAutoResize, L"AutoResize") + UI_END_MAP_ELEMENTS_AND_NAMES() +public: + UIScene_MessageBox(int iPad, void *initData, UILayer *parentLayer); + ~UIScene_MessageBox(); + + virtual EUIScene getSceneType() { return eUIScene_MessageBox;} + + // Returns true if lower scenes in this scenes layer, or in any layer below this scenes layers should be hidden + virtual bool hidesLowerScenes() { return false; } + virtual bool blocksInput() { return true; } + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + + virtual void updateTooltips(); + +public: + virtual void handleReload(); + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + virtual bool hasFocus(int iPad); + +protected: + void handlePress(F64 controlId, F64 childId); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_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 new file mode 100644 index 00000000..6f502db8 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_PauseMenu.cpp @@ -0,0 +1,1481 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_PauseMenu.h" +#include "..\..\MinecraftServer.h" +#include "..\..\MultiplayerLocalPlayer.h" +#include "..\..\TexturePackRepository.h" +#include "..\..\TexturePack.h" +#include "..\..\DLCTexturePack.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#ifdef __ORBIS__ +#include +#endif + +#ifdef _DURANGO +#include "..\..\Durango\Leaderboards\DurangoStatsDebugger.h" +#endif + +#ifdef __PSVITA__ +#include "PSVita\Network\SonyCommerce_Vita.h" +#endif + +#if defined __PS3__ || defined __ORBIS__ +#define USE_SONY_REMOTE_STORAGE +#endif + +UIScene_PauseMenu::UIScene_PauseMenu(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + m_bIgnoreInput=false; + m_eAction=eAction_None; + + m_buttons[BUTTON_PAUSE_RESUMEGAME].init(app.GetString(IDS_RESUME_GAME),BUTTON_PAUSE_RESUMEGAME); + m_buttons[BUTTON_PAUSE_HELPANDOPTIONS].init(app.GetString(IDS_HELP_AND_OPTIONS),BUTTON_PAUSE_HELPANDOPTIONS); + m_buttons[BUTTON_PAUSE_LEADERBOARDS].init(app.GetString(IDS_LEADERBOARDS),BUTTON_PAUSE_LEADERBOARDS); +#ifdef _DURANGO + m_buttons[BUTTON_PAUSE_XBOXHELP].init(app.GetString(IDS_XBOX_HELP_APP), BUTTON_PAUSE_XBOXHELP); +#else + m_buttons[BUTTON_PAUSE_ACHIEVEMENTS].init(app.GetString(IDS_ACHIEVEMENTS),BUTTON_PAUSE_ACHIEVEMENTS); +#endif +#if defined(_XBOX_ONE) || defined(__ORBIS__) + m_bTrialTexturePack = false; + if(!Minecraft::GetInstance()->skins->isUsingDefaultSkin()) + { + TexturePack *tPack = Minecraft::GetInstance()->skins->getSelected(); + DLCTexturePack *pDLCTexPack=(DLCTexturePack *)tPack; + + m_pDLCPack=pDLCTexPack->getDLCInfoParentPack();//tPack->getDLCPack(); + + if(!m_pDLCPack->hasPurchasedFile( DLCManager::e_DLCType_Texture, L"" )) + { + m_bTrialTexturePack = true; + } + } + + // 4J-TomK - check for all possible labels being fed into BUTTON_PAUSE_SAVEGAME (Bug 163775) + // this has to be done before button initialisation! + wchar_t saveButtonLabels[2][256]; + swprintf( saveButtonLabels[0], 256, L"%ls", app.GetString( IDS_SAVE_GAME )); + swprintf( saveButtonLabels[1], 256, L"%ls", app.GetString( IDS_DISABLE_AUTOSAVE )); + m_buttons[BUTTON_PAUSE_SAVEGAME].setAllPossibleLabels(2,saveButtonLabels); + + if(app.GetGameHostOption(eGameHostOption_DisableSaving) || m_bTrialTexturePack) + { + m_savesDisabled = true; + m_buttons[BUTTON_PAUSE_SAVEGAME].init(app.GetString(IDS_SAVE_GAME),BUTTON_PAUSE_SAVEGAME); + } + else + { + m_savesDisabled = false; + m_buttons[BUTTON_PAUSE_SAVEGAME].init(app.GetString(IDS_DISABLE_AUTOSAVE),BUTTON_PAUSE_SAVEGAME); + } +#else + m_buttons[BUTTON_PAUSE_SAVEGAME].init(app.GetString(IDS_SAVE_GAME),BUTTON_PAUSE_SAVEGAME); +#endif + m_buttons[BUTTON_PAUSE_EXITGAME].init(app.GetString(IDS_EXIT_GAME),BUTTON_PAUSE_EXITGAME); + + if(!ProfileManager.IsFullVersion()) + { + // hide the trial timer + ui.ShowTrialTimer(false); + } + + updateControlsVisibility(); + + doHorizontalResizeCheck(); + + // get rid of the quadrant display if it's on + ui.HidePressStart(); + +#if TO_BE_IMPLEMENTED + XuiSetTimer(m_hObj,IGNORE_KEYPRESS_TIMERID,IGNORE_KEYPRESS_TIME); +#endif + + if( g_NetworkManager.IsLocalGame() && g_NetworkManager.GetPlayerCount() == 1 ) + { + app.SetXuiServerAction(ProfileManager.GetPrimaryPad(),eXuiServerAction_PauseServer,(void *)TRUE); + } + + TelemetryManager->RecordMenuShown(m_iPad, eUIScene_PauseMenu, 0); + TelemetryManager->RecordPauseOrInactive(m_iPad); + + Minecraft *pMinecraft = Minecraft::GetInstance(); + if(pMinecraft != NULL && pMinecraft->localgameModes[iPad] != NULL ) + { + TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[iPad]; + + // This just allows it to be shown + gameMode->getTutorial()->showTutorialPopup(false); + } + m_bErrorDialogRunning = false; +} + +UIScene_PauseMenu::~UIScene_PauseMenu() +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + if(pMinecraft != NULL && pMinecraft->localgameModes[m_iPad] != NULL ) + { + TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[m_iPad]; + + // This just allows it to be shown + gameMode->getTutorial()->showTutorialPopup(true); + } + + m_parentLayer->showComponent(m_iPad,eUIComponent_Panorama,false); + m_parentLayer->showComponent(m_iPad,eUIComponent_MenuBackground,false); + m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,false); +} + +wstring UIScene_PauseMenu::getMoviePath() +{ + if(app.GetLocalPlayerCount() > 1) + { + return L"PauseMenuSplit"; + } + else + { + return L"PauseMenu"; + } +} + +void UIScene_PauseMenu::tick() +{ + UIScene::tick(); + +#ifdef __PSVITA__ + // 4J-MGH - Need to check for installed DLC here, as we delay the installation of the key file on Vita + if(!app.DLCInstallProcessCompleted()) app.StartInstallDLCProcess(0); +#endif + + +#if defined _XBOX_ONE || defined __ORBIS__ + if(!m_bTrialTexturePack && m_savesDisabled != (app.GetGameHostOption(eGameHostOption_DisableSaving) != 0) && ProfileManager.GetPrimaryPad() == m_iPad ) + { + // We show the save button if saves are disabled as this lets us show a prompt to enable them (via purchasing a texture pack) + if( app.GetGameHostOption(eGameHostOption_DisableSaving) ) + { + m_savesDisabled = true; + m_buttons[BUTTON_PAUSE_SAVEGAME].setLabel( app.GetString(IDS_SAVE_GAME) ); + } + else + { + m_savesDisabled = false; + m_buttons[BUTTON_PAUSE_SAVEGAME].setLabel( app.GetString(IDS_DISABLE_AUTOSAVE) ); + } + } +#endif + +#ifdef __ORBIS__ + // Process the error dialog (for a patch being available) + if(m_bErrorDialogRunning) + { + SceErrorDialogStatus stat = sceErrorDialogUpdateStatus(); + if( stat == SCE_ERROR_DIALOG_STATUS_FINISHED ) + { + sceErrorDialogTerminate(); + m_bErrorDialogRunning=false; + } + } +#endif +} + +void UIScene_PauseMenu::updateTooltips() +{ + bool bUserisClientSide = ProfileManager.IsSignedInLive(m_iPad); + bool bIsisPrimaryHost=g_NetworkManager.IsHost() && (ProfileManager.GetPrimaryPad()==m_iPad); + +#ifdef _XBOX_ONE + bool bDisplayBanTip = !g_NetworkManager.IsLocalGame() && !bIsisPrimaryHost && !ProfileManager.IsGuest(m_iPad); +#endif + + int iY = -1; +#if defined __PS3__ || defined __ORBIS__ + if(m_iPad == ProfileManager.GetPrimaryPad() ) iY = IDS_TOOLTIPS_GAME_INVITES; +#endif + int iRB = -1; + int iX = -1; + + if(ProfileManager.IsFullVersion()) + { + if(StorageManager.GetSaveDisabled()) + { + iX = bIsisPrimaryHost?IDS_TOOLTIPS_SELECTDEVICE:-1; +#ifdef _XBOX_ONE + iRB = bDisplayBanTip?IDS_TOOLTIPS_BANLEVEL:-1; +#endif + if( CSocialManager::Instance()->IsTitleAllowedToPostImages() && CSocialManager::Instance()->AreAllUsersAllowedToPostImages() && bUserisClientSide ) + { +#ifndef __PS3__ + iY = IDS_TOOLTIPS_SHARE; +#endif + } + } + else + { + iX = bIsisPrimaryHost?IDS_TOOLTIPS_CHANGEDEVICE:-1; +#ifdef _XBOX_ONE + iRB = bDisplayBanTip?IDS_TOOLTIPS_BANLEVEL:-1; +#endif + if( CSocialManager::Instance()->IsTitleAllowedToPostImages() && CSocialManager::Instance()->AreAllUsersAllowedToPostImages() && bUserisClientSide) + { +#ifndef __PS3__ + iY = IDS_TOOLTIPS_SHARE; +#endif + } + } + } + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK,iX,iY, -1,-1,-1,iRB); +} + +void UIScene_PauseMenu::updateComponents() +{ + m_parentLayer->showComponent(m_iPad,eUIComponent_Panorama,false); + m_parentLayer->showComponent(m_iPad,eUIComponent_MenuBackground,true); + + if( app.GetLocalPlayerCount() == 1 ) m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,true); + else m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,false); +} + +void UIScene_PauseMenu::handlePreReload() +{ +#if defined _XBOX_ONE || defined __ORBIS__ + if(ProfileManager.GetPrimaryPad() == m_iPad) + { + // 4J-TomK - check for all possible labels being fed into BUTTON_PAUSE_SAVEGAME (Bug 163775) + // this has to be done before button initialisation! + wchar_t saveButtonLabels[2][256]; + swprintf( saveButtonLabels[0], 256, L"%ls", app.GetString( IDS_SAVE_GAME )); + swprintf( saveButtonLabels[1], 256, L"%ls", app.GetString( IDS_DISABLE_AUTOSAVE )); + m_buttons[BUTTON_PAUSE_SAVEGAME].setAllPossibleLabels(2,saveButtonLabels); + } +#endif +} + +void UIScene_PauseMenu::handleReload() +{ + updateTooltips(); + updateControlsVisibility(); + +#if defined _XBOX_ONE || defined __ORBIS__ + if(ProfileManager.GetPrimaryPad() == m_iPad) + { + // We show the save button if saves are disabled as this lets us show a prompt to enable them (via purchasing a texture pack) + if( app.GetGameHostOption(eGameHostOption_DisableSaving) || m_bTrialTexturePack ) + { + m_savesDisabled = true; + m_buttons[BUTTON_PAUSE_SAVEGAME].setLabel( app.GetString(IDS_SAVE_GAME) ); + } + else + { + m_savesDisabled = false; + m_buttons[BUTTON_PAUSE_SAVEGAME].setLabel( app.GetString(IDS_DISABLE_AUTOSAVE) ); + } + } +#endif + + doHorizontalResizeCheck(); +} + +void UIScene_PauseMenu::updateControlsVisibility() +{ + // are we the primary player? + // 4J-PB - fix for 7844 & 7845 - + // TCR # 128: XLA Pause Menu: When in a multiplayer game as a client the Pause Menu does not have a Leaderboards option. + // TCR # 128: XLA Pause Menu: When in a multiplayer game as a client the Pause Menu does not have an Achievements option. + if(ProfileManager.GetPrimaryPad()==m_iPad) // && g_NetworkManager.IsHost()) + { + // are we in splitscreen? + // how many local players do we have? + if( app.GetLocalPlayerCount()>1 ) + { + // Hide the BUTTON_PAUSE_LEADERBOARDS and BUTTON_PAUSE_ACHIEVEMENTS + removeControl( &m_buttons[BUTTON_PAUSE_LEADERBOARDS], false ); +#ifndef _XBOX_ONE + removeControl( &m_buttons[BUTTON_PAUSE_ACHIEVEMENTS], false ); +#endif + } +#ifdef __PSVITA__ + // MGH added - remove leaderboards in adhoc + if(CGameNetworkManager::usingAdhocMode()) + { + removeControl( &m_buttons[BUTTON_PAUSE_LEADERBOARDS], false ); + } +#endif + + if( !g_NetworkManager.IsHost() ) + { + // Hide the BUTTON_PAUSE_SAVEGAME + removeControl( &m_buttons[BUTTON_PAUSE_SAVEGAME], false ); + } + } + else + { + // Hide the BUTTON_PAUSE_LEADERBOARDS, BUTTON_PAUSE_ACHIEVEMENTS and BUTTON_PAUSE_SAVEGAME + removeControl( &m_buttons[BUTTON_PAUSE_LEADERBOARDS], false ); +#ifndef _XBOX_ONE + removeControl( &m_buttons[BUTTON_PAUSE_ACHIEVEMENTS], false ); +#endif + removeControl( &m_buttons[BUTTON_PAUSE_SAVEGAME], false ); + } + + // is saving disabled? + if(StorageManager.GetSaveDisabled()) + { +#ifdef _XBOX + // disable save button + m_buttons[BUTTON_PAUSE_SAVEGAME].setEnable(false); +#endif + } + +#if defined(__PS3__) || defined (__PSVITA__) || defined(__ORBIS__) + // We don't have a way to display trophies/achievements, so remove the button, and we're allowed to not have it on Xbox One + removeControl( &m_buttons[BUTTON_PAUSE_ACHIEVEMENTS], false ); +#endif + +} + +void UIScene_PauseMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + if(m_bIgnoreInput) + { + return; + } + + //app.DebugPrintf("UIScene_DebugOverlay handling input for pad %d, key %d, down- %s, pressed- %s, released- %s\n", iPad, key, down?"TRUE":"FALSE", pressed?"TRUE":"FALSE", released?"TRUE":"FALSE"); + ui.AnimateKeyPress(iPad, key, repeat, pressed, released); + +#ifdef _XBOX_ONE + bool bIsisPrimaryHost=g_NetworkManager.IsHost() && (ProfileManager.GetPrimaryPad()==iPad); + bool bDisplayBanTip = !g_NetworkManager.IsLocalGame() && !bIsisPrimaryHost && !ProfileManager.IsGuest(iPad); +#endif + + switch(key) + { +#ifdef _DURANGO + case ACTION_MENU_GTC_RESUME: +#endif +#if defined(__PS3__) // not for Orbis - we want to use the pause menu (touchpad press) to select a menu item + case ACTION_MENU_PAUSEMENU: +#endif + case ACTION_MENU_CANCEL: + if(pressed) + { +#ifdef _DURANGO + //DurangoStatsDebugger::PrintStats(iPad); +#endif + + if( iPad == ProfileManager.GetPrimaryPad() && g_NetworkManager.IsLocalGame() ) + { + app.SetXuiServerAction(ProfileManager.GetPrimaryPad(),eXuiServerAction_PauseServer,(void *)FALSE); + } + + ui.PlayUISFX(eSFX_Back); + navigateBack(); + if(!ProfileManager.IsFullVersion()) + { + ui.ShowTrialTimer(true); + } + } + break; + case ACTION_MENU_OK: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + if(pressed) + { + sendInputToMovie(key, repeat, pressed, released); + } + break; + +#if TO_BE_IMPLEMENTED + case VK_PAD_X: + // Change device + if(bIsisPrimaryHost) + { + // we need a function to deal with the return from this - if it changes, we need to update the pause menu and tooltips + // Fix for #12531 - TCR 001: BAS Game Stability: When a player selects to change a storage + // device, and repeatedly backs out of the SD screen, disconnects from LIVE, and then selects a SD, the title crashes. + m_bIgnoreInput=true; + + StorageManager.SetSaveDevice(&UIScene_PauseMenu::DeviceSelectReturned,this,true); + } + rfHandled = TRUE; + break; +#endif + + case ACTION_MENU_Y: + { + +#if defined(__PS3__) || defined(__ORBIS__) + if(pressed && iPad == ProfileManager.GetPrimaryPad()) + { +#ifdef __ORBIS__ + // If a patch is available, can't view invites + if (CheckForPatch()) break; +#endif + + // Are we offline? + if(!ProfileManager.IsSignedInLive(iPad)) + { + m_eAction=eAction_ViewInvitesPSN; +#ifdef __ORBIS__ + int npAvailability = ProfileManager.getNPAvailability(iPad); + if (npAvailability == SCE_NP_ERROR_AGE_RESTRICTION) + { + // 4J Stu - This is a bit messy and is due to the library incorrectly returning false for IsSignedInLive is the npAvailability isn't SCE_OK + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPad); + } + else + // Determine why they're not "signed in live" + if (ProfileManager.isSignedInPSN(iPad)) + { + // Signed in to PSN but not connected (no internet access) + assert(!ProfileManager.isConnectedToPSN(iPad)); + + UINT uiIDA[1]; + uiIDA[0] = IDS_OK; + ui.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.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.RequestAlertMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, iPad, &UIScene_PauseMenu::MustSignInReturnedPSN, (LPVOID)GetCallbackUniqueId() ); +#endif + } + else + { +#ifdef __ORBIS__ + SQRNetworkManager_Orbis::RecvInviteGUI(); +#else // __PS3__ + int ret = sceNpBasicRecvMessageCustom(SCE_NP_BASIC_MESSAGE_MAIN_TYPE_INVITE, SCE_NP_BASIC_RECV_MESSAGE_OPTIONS_INCLUDE_BOOTABLE, SYS_MEMORY_CONTAINER_ID_INVALID); + app.DebugPrintf("sceNpBasicRecvMessageCustom return %d ( %08x )\n", ret, ret); +#endif + } + } +#else +#if TO_BE_IMPLEMENTED + if(bUserisClientSide) + { + // 4J Stu - Added check in 1.8.2 bug fix (TU6) to stop repeat key presses + bool bCanScreenshot = true; + for(int j=0; j < XUSER_MAX_COUNT;++j) + { + if(app.GetXuiAction(j) == eAppAction_SocialPostScreenshot) + { + bCanScreenshot = false; + break; + } + } + if(bCanScreenshot) app.SetAction(pInputData->UserIndex,eAppAction_SocialPost); + } + rfHandled = TRUE; +#endif +#endif // __PS3__ + } + break; +#ifdef _XBOX_ONE + case ACTION_MENU_RIGHT_SCROLL: + if( bDisplayBanTip ) + { + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + ui.RequestAlertMessage(IDS_ACTION_BAN_LEVEL_TITLE, IDS_ACTION_BAN_LEVEL_DESCRIPTION, uiIDA, 2, iPad,&UIScene_PauseMenu::BanGameDialogReturned,(LPVOID)GetCallbackUniqueId() ); + + //rfHandled = TRUE; + } + break; +#endif + } +} + +void UIScene_PauseMenu::handlePress(F64 controlId, F64 childId) +{ + if(m_bIgnoreInput) return; + + switch((int)controlId) + { + case BUTTON_PAUSE_RESUMEGAME: + if( m_iPad == ProfileManager.GetPrimaryPad() && g_NetworkManager.IsLocalGame() ) + { + app.SetXuiServerAction(ProfileManager.GetPrimaryPad(),eXuiServerAction_PauseServer,(void *)FALSE); + } + navigateBack(); + break; + case BUTTON_PAUSE_LEADERBOARDS: + { + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + + //4J Gordon: Being used for the leaderboards proper now + // guests can't look at leaderboards + if(ProfileManager.IsGuest(m_iPad)) + { + ui.RequestAlertMessage(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad()); + } + else if(!ProfileManager.IsSignedInLive(m_iPad)) + { +#ifdef __ORBIS__ + // If a patch is available, can't show leaderboard + if (CheckForPatch()) break; + + // Check for content restricted user + // Update error code + int errorCode = ProfileManager.getNPAvailability(m_iPad); + + // Check if PSN is unavailable because of age restriction + if (errorCode == SCE_NP_ERROR_AGE_RESTRICTION) + { + UINT uiIDA[1]; + uiIDA[0] = IDS_CONFIRM_OK; + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, m_iPad); + + break;; + } + +#endif + +#if defined __PS3__ || __PSVITA__ + // get them to sign in to online + m_eAction=eAction_ViewLeaderboardsPSN; + UINT uiIDA[1]; + uiIDA[0]=IDS_PRO_NOTONLINE_ACCEPT; + ui.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); + if (npAvailability == SCE_NP_ERROR_AGE_RESTRICTION) + { + // 4J Stu - This is a bit messy and is due to the library incorrectly returning false for IsSignedInLive is the npAvailability isn't SCE_OK + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, m_iPad); + } + else + // Determine why they're not "signed in live" + if (ProfileManager.isSignedInPSN(m_iPad)) + { + // Signed in to PSN but not connected (no internet access) + + // Id + assert(!ProfileManager.isConnectedToPSN(m_iPad)); + + UINT uiIDA[1]; + uiIDA[0] = IDS_OK; + ui.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.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.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1, m_iPad); +#endif + } + else + { + bool bContentRestricted=false; +#if defined(__PS3__) || defined(__PSVITA__) + ProfileManager.GetChatAndContentRestrictions(m_iPad,true,NULL,&bContentRestricted,NULL); +#endif + if(bContentRestricted) + { +#if !(defined(_XBOX) || defined(_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.RequestAlertMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, m_iPad); +#endif + } + else + { + ui.NavigateToScene(m_iPad, eUIScene_LeaderboardsMenu); + } + } + } + break; +#ifdef _DURANGO + case BUTTON_PAUSE_XBOXHELP: + { + // 4J: Launch the crummy xbox help application. + WXS::User^ user = ProfileManager.GetUser(m_iPad); + Windows::Xbox::ApplicationModel::Help::Show(user); + } + break; +#elif TO_BE_IMPLEMENTED + case BUTTON_PAUSE_ACHIEVEMENTS: + + // guests can't look at achievements + if(ProfileManager.IsGuest(pNotifyPressData->UserIndex)) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + ui.RequestAlertMessage(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad()); + } + else + { + XShowAchievementsUI( pNotifyPressData->UserIndex ); + } + break; +#endif + + case BUTTON_PAUSE_HELPANDOPTIONS: + ui.NavigateToScene(m_iPad,eUIScene_HelpAndOptionsMenu); + break; + case BUTTON_PAUSE_SAVEGAME: + PerformActionSaveGame(); + break; + case BUTTON_PAUSE_EXITGAME: + { + Minecraft *pMinecraft = Minecraft::GetInstance(); + // Check if it's the trial version + if(ProfileManager.IsFullVersion()) + { + UINT uiIDA[3]; + + // is it the primary player exiting? + if(m_iPad==ProfileManager.GetPrimaryPad()) + { + int playTime = -1; + if( pMinecraft->localplayers[m_iPad] != NULL ) + { + playTime = (int)pMinecraft->localplayers[m_iPad]->getSessionTimer(); + } + +#if defined(_XBOX_ONE) || defined(__ORBIS__) + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + + if(g_NetworkManager.IsHost() && StorageManager.GetSaveDisabled()) + { + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_EXIT_GAME_SAVE; + uiIDA[2]=IDS_EXIT_GAME_NO_SAVE; + + if(g_NetworkManager.GetPlayerCount()>1) + { + ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME_CONFIRM_DISCONNECT_SAVE, uiIDA, 3, m_iPad,&UIScene_PauseMenu::ExitGameSaveDialogReturned, (LPVOID)GetCallbackUniqueId()); + } + else + { + 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.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME_CONFIRM_DISCONNECT, uiIDA, 2, m_iPad,&IUIScene_PauseMenu::ExitGameDialogReturned, (LPVOID)GetCallbackUniqueId()); + } + else + { + 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.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME_PROGRESS_LOST, uiIDA, 2, m_iPad,&IUIScene_PauseMenu::ExitGameDialogReturned, (LPVOID)GetCallbackUniqueId()); + } + else + { + if( g_NetworkManager.IsHost() ) + { + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_EXIT_GAME_SAVE; + uiIDA[2]=IDS_EXIT_GAME_NO_SAVE; + + if(g_NetworkManager.GetPlayerCount()>1) + { + ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME_CONFIRM_DISCONNECT_SAVE, uiIDA, 3, m_iPad,&UIScene_PauseMenu::ExitGameSaveDialogReturned, (LPVOID)GetCallbackUniqueId()); + } + else + { + ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME, uiIDA, 3, m_iPad,&UIScene_PauseMenu::ExitGameSaveDialogReturned, (LPVOID)GetCallbackUniqueId()); + } + } + else + { + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + + ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME, uiIDA, 2, m_iPad,&IUIScene_PauseMenu::ExitGameDialogReturned, (LPVOID)GetCallbackUniqueId()); + } + } +#endif + } + else + { + int playTime = -1; + if( pMinecraft->localplayers[m_iPad] != NULL ) + { + playTime = (int)pMinecraft->localplayers[m_iPad]->getSessionTimer(); + } + + TelemetryManager->RecordLevelExit(m_iPad, eSen_LevelExitStatus_Exited); + + + // just exit the player + app.SetAction(m_iPad,eAppAction_ExitPlayer); + } + } + else + { + // is it the primary player exiting? + if(m_iPad==ProfileManager.GetPrimaryPad()) + { + int playTime = -1; + if( pMinecraft->localplayers[m_iPad] != NULL ) + { + playTime = (int)pMinecraft->localplayers[m_iPad]->getSessionTimer(); + } + + // adjust the trial time played + ui.ReduceTrialTimerValue(); + + // exit the level + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME_PROGRESS_LOST, uiIDA, 2, m_iPad,&IUIScene_PauseMenu::ExitGameDialogReturned, (LPVOID)GetCallbackUniqueId()); + + } + else + { + int playTime = -1; + if( pMinecraft->localplayers[m_iPad] != NULL ) + { + playTime = (int)pMinecraft->localplayers[m_iPad]->getSessionTimer(); + } + + TelemetryManager->RecordLevelExit(m_iPad, eSen_LevelExitStatus_Exited); + + // just exit the player + app.SetAction(m_iPad,eAppAction_ExitPlayer); + } + } + } + break; + } +} + +void UIScene_PauseMenu::PerformActionSaveGame() +{ + // is the player trying to save in the trial version? + if(!ProfileManager.IsFullVersion()) + { +#ifdef __ORBIS__ + // If a patch is available, can't buy full game + if (CheckForPatch()) return; +#endif + + // Unlock the full version? + if(!ProfileManager.IsSignedInLive(m_iPad)) + { +#if defined(__PS3__) || defined (__PSVITA__) + m_eAction=eAction_SaveGamePSN; + 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_PauseMenu::MustSignInReturnedPSN,(LPVOID)GetCallbackUniqueId()); +#elif defined(__ORBIS__) + m_eAction=eAction_SaveGamePSN; + int npAvailability = ProfileManager.getNPAvailability(m_iPad); + if (npAvailability == SCE_NP_ERROR_AGE_RESTRICTION) + { + // 4J Stu - This is a bit messy and is due to the library incorrectly returning false for IsSignedInLive is the npAvailability isn't SCE_OK + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, m_iPad); + } + else + // Determine why they're not "signed in live" + if (ProfileManager.isSignedInPSN(m_iPad)) + { + // Signed in to PSN but not connected (no internet access) + assert(!ProfileManager.isConnectedToPSN(m_iPad)); + + UINT uiIDA[1]; + uiIDA[0] = IDS_OK; + ui.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.RequestAlertMessage( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, m_iPad, &UIScene_PauseMenu::MustSignInReturnedPSN, (LPVOID)GetCallbackUniqueId()); + } +#endif + } + else + { + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_OK; + uiIDA[1]=IDS_CONFIRM_CANCEL; + ui.RequestAlertMessage(IDS_UNLOCK_TITLE, IDS_UNLOCK_TOSAVE_TEXT, uiIDA, 2,m_iPad,&UIScene_PauseMenu::UnlockFullSaveReturned,(LPVOID)GetCallbackUniqueId()); + } + + return; + } + + // 4J-PB - Is the player trying to save but they are using a trial texturepack ? + if(!Minecraft::GetInstance()->skins->isUsingDefaultSkin()) + { + TexturePack *tPack = Minecraft::GetInstance()->skins->getSelected(); + DLCTexturePack *pDLCTexPack=(DLCTexturePack *)tPack; + + m_pDLCPack=pDLCTexPack->getDLCInfoParentPack();//tPack->getDLCPack(); + + if(!m_pDLCPack->hasPurchasedFile( DLCManager::e_DLCType_Texture, L"" )) + { + // upsell +#ifdef _XBOX + ULONGLONG ullOfferID_Full; + // get the dlc texture pack + DLCTexturePack *pDLCTexPack=(DLCTexturePack *)tPack; + + app.GetDLCFullOfferIDForPackID(pDLCTexPack->getDLCParentPackId(),&ullOfferID_Full); + + // tell sentient about the upsell of the full version of the texture pack + TelemetryManager->RecordUpsellPresented(m_iPad, eSet_UpsellID_Texture_DLC, ullOfferID_Full & 0xFFFFFFFF); +#endif + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_OK; + uiIDA[1]=IDS_CONFIRM_CANCEL; + + // Give the player a warning about the trial version of the texture pack +#ifdef __PSVITA__ + if(app.DLCInstallProcessCompleted() && !SonyCommerce_Vita::getDLCUpgradePending()) // MGH - devtrack #5861 On vita it can take a bit after the install has finished to register the purchase, so make sure we don't end up asking to purchase again +#endif + { + ui.RequestAlertMessage(IDS_WARNING_DLC_TRIALTEXTUREPACK_TITLE, IDS_WARNING_DLC_TRIALTEXTUREPACK_TEXT, uiIDA, 2, m_iPad,&UIScene_PauseMenu::WarningTrialTexturePackReturned,(LPVOID)GetCallbackUniqueId()); + } + + return; + } + else + { + m_bTrialTexturePack = false; + } + } + + // does the save exist? + bool bSaveExists; + C4JStorage::ESaveGameState result=StorageManager.DoesSaveExist(&bSaveExists); + +#ifdef _XBOX + if(result == C4JStorage::ELoadGame_DeviceRemoved) + { + // this will be a tester trying to be clever + UINT uiIDA[2]; + uiIDA[0]=IDS_SELECTANEWDEVICE; + uiIDA[1]=IDS_NODEVICE_DECLINE; + + ui.RequestAlertMessage(IDS_STORAGEDEVICEPROBLEM_TITLE, IDS_FAILED_TO_LOADSAVE_TEXT, uiIDA, 2, m_iPad,&IUIScene_PauseMenu::DeviceRemovedDialogReturned,(LPVOID)GetCallbackUniqueId()); + } + else +#endif + { +#if defined(_XBOX_ONE) || defined(__ORBIS__) + if(!m_savesDisabled) + { + UINT uiIDA[2]; + uiIDA[0]=IDS_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + ui.RequestAlertMessage(IDS_TITLE_DISABLE_AUTOSAVE, IDS_CONFIRM_DISABLE_AUTOSAVE, uiIDA, 2, m_iPad,&IUIScene_PauseMenu::DisableAutosaveDialogReturned,(LPVOID)GetCallbackUniqueId()); + } + else +#endif + // we need to ask if they are sure they want to overwrite the existing game + if(bSaveExists) + { + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + ui.RequestAlertMessage(IDS_TITLE_SAVE_GAME, IDS_CONFIRM_SAVE_GAME, uiIDA, 2, m_iPad,&IUIScene_PauseMenu::SaveGameDialogReturned,(LPVOID)GetCallbackUniqueId()); + } + else + { +#if defined(_XBOX_ONE) || defined(__ORBIS__) + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + 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); +#endif + } + } +} + +void UIScene_PauseMenu::ShowScene(bool show) +{ + app.DebugPrintf("UIScene_PauseMenu::ShowScene is not implemented\n"); +} + +void UIScene_PauseMenu::HandleDLCInstalled() +{ + // mounted DLC may have changed + if(app.StartInstallDLCProcess(m_iPad)==false) + { + // not doing a mount, so re-enable input + //m_bIgnoreInput=false; + app.DebugPrintf("UIScene_PauseMenu::HandleDLCInstalled - m_bIgnoreInput false\n"); + } + else + { + // 4J-PB - Somehow, on th edisc build, we get in here, but don't call HandleDLCMountingComplete, so input locks up + //m_bIgnoreInput=true; + app.DebugPrintf("UIScene_PauseMenu::HandleDLCInstalled - m_bIgnoreInput true\n"); + } + // this will send a CustomMessage_DLCMountingComplete when done +} + + +void UIScene_PauseMenu::HandleDLCMountingComplete() +{ + // check if we should display the save option + + //m_bIgnoreInput=false; + app.DebugPrintf("UIScene_PauseMenu::HandleDLCMountingComplete - m_bIgnoreInput false \n"); + + // if(ProfileManager.IsFullVersion()) + // { + // bool bIsisPrimaryHost=g_NetworkManager.IsHost() && (ProfileManager.GetPrimaryPad()==m_iPad); + // + // if(bIsisPrimaryHost) + // { + // m_buttons[BUTTON_PAUSE_SAVEGAME].setEnable(true); + // } + // } +} + +int UIScene_PauseMenu::UnlockFullSaveReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + Minecraft *pMinecraft=Minecraft::GetInstance(); + + if(result==C4JStorage::EMessage_ResultAccept) + { + if(ProfileManager.IsSignedInLive(pMinecraft->player->GetXboxPad())) + { + // 4J-PB - need to check this user can access the store +#if defined(__PS3__) || defined(__PSVITA__) + bool bContentRestricted; + ProfileManager.GetChatAndContentRestrictions(ProfileManager.GetPrimaryPad(),true,NULL,&bContentRestricted,NULL); + if(bContentRestricted) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestAlertMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad()); + } + else +#endif + { + ProfileManager.DisplayFullVersionPurchase(false,pMinecraft->player->GetXboxPad(),eSen_UpsellID_Full_Version_Of_Game); + } + } + } + else + { + //SentientManager.RecordUpsellResponded(iPad, eSen_UpsellID_Full_Version_Of_Game, app.m_dwOfferID, eSen_UpsellOutcome_Declined); + } + + return 0; +} + +int UIScene_PauseMenu::SaveGame_SignInReturned(void *pParam,bool bContinue, int iPad) +{ + UIScene_PauseMenu* pClass = (UIScene_PauseMenu*)ui.GetSceneFromCallbackId((size_t)pParam); + if(pClass) pClass->SetIgnoreInput(false); + + if(bContinue==true) + { + if(pClass) pClass->PerformActionSaveGame(); + } + + return 0; +} + +#ifdef _XBOX_ONE +int UIScene_PauseMenu::BanGameDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + // results switched for this dialog + if(result==C4JStorage::EMessage_ResultDecline) + { + app.SetAction(iPad,eAppAction_BanLevel); + } + return 0; +} +#endif + +#if defined(__PS3__) || defined (__PSVITA__) || defined(__ORBIS__) +int UIScene_PauseMenu::MustSignInReturnedPSN(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + UIScene_PauseMenu* pClass = (UIScene_PauseMenu*)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, pParam); + break; + case eAction_ViewInvitesPSN: + SQRNetworkManager_PS3::AttemptPSNSignIn(&UIScene_PauseMenu::ViewInvites_SignInReturned, pParam); + break; + case eAction_SaveGamePSN: + SQRNetworkManager_PS3::AttemptPSNSignIn(&UIScene_PauseMenu::SaveGame_SignInReturned, pParam); + break; + case eAction_BuyTexturePackPSN: + SQRNetworkManager_PS3::AttemptPSNSignIn(&UIScene_PauseMenu::BuyTexturePack_SignInReturned, pParam); + break; + } +#elif defined __PSVITA__ + switch(pClass->m_eAction) + { + case eAction_ViewLeaderboardsPSN: + //CD - Must force Ad-Hoc off if they want leaderboard PSN sign-in + //Save settings change + app.SetGameSettings(0, eGameSetting_PSVita_NetworkModeAdhoc, 0); + //Force off + CGameNetworkManager::setAdhocMode(false); + //Now Sign-in + SQRNetworkManager_Vita::AttemptPSNSignIn(&UIScene_PauseMenu::ViewLeaderboards_SignInReturned, pParam); + break; + case eAction_ViewInvitesPSN: + SQRNetworkManager_Vita::AttemptPSNSignIn(&UIScene_PauseMenu::ViewInvites_SignInReturned, pParam); + break; + case eAction_SaveGamePSN: + pClass->SetIgnoreInput(true); + SQRNetworkManager_Vita::AttemptPSNSignIn(&UIScene_PauseMenu::SaveGame_SignInReturned, pParam, true); + break; + case eAction_BuyTexturePackPSN: + SQRNetworkManager_Vita::AttemptPSNSignIn(&UIScene_PauseMenu::BuyTexturePack_SignInReturned, pParam); + break; + } +#else + switch(pClass->m_eAction) + { + case eAction_ViewLeaderboardsPSN: + SQRNetworkManager_Orbis::AttemptPSNSignIn(&UIScene_PauseMenu::ViewLeaderboards_SignInReturned, pClass, false, iPad); + break; + case eAction_ViewInvitesPSN: + SQRNetworkManager_Orbis::AttemptPSNSignIn(&UIScene_PauseMenu::ViewInvites_SignInReturned, pClass, false, iPad); + break; + case eAction_SaveGamePSN: + SQRNetworkManager_Orbis::AttemptPSNSignIn(&UIScene_PauseMenu::SaveGame_SignInReturned, pClass, false, iPad); + break; + case eAction_BuyTexturePackPSN: + SQRNetworkManager_Orbis::AttemptPSNSignIn(&UIScene_PauseMenu::BuyTexturePack_SignInReturned, pClass, false, iPad); + break; + } +#endif + } + + return 0; +} + +int UIScene_PauseMenu::ViewLeaderboards_SignInReturned(void *pParam,bool bContinue, int iPad) +{ + UIScene_PauseMenu* pClass = (UIScene_PauseMenu*)ui.GetSceneFromCallbackId((size_t)pParam); + if(!pClass) return 0; + + if(bContinue==true) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + + // guests can't look at leaderboards + if(ProfileManager.IsGuest(pClass->m_iPad)) + { + ui.RequestAlertMessage(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad()); + } + else if(ProfileManager.IsSignedInLive(iPad)) + { +#ifndef __ORBIS__ + bool bContentRestricted=false; + ProfileManager.GetChatAndContentRestrictions(pClass->m_iPad,true,NULL,&bContentRestricted,NULL); + if(bContentRestricted) + { + // you can't see leaderboards + ui.RequestAlertMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad()); + } + else +#endif + { + ui.NavigateToScene(pClass->m_iPad, eUIScene_LeaderboardsMenu); + } + } + } + + return 0; +} + +int UIScene_PauseMenu::WarningTrialTexturePackReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + UIScene_PauseMenu* pClass = (UIScene_PauseMenu*)ui.GetSceneFromCallbackId((size_t)pParam); + +#ifdef __ORBIS__ + // If a patch is available, can't proceed + if (!pClass || pClass->CheckForPatch()) return 0; +#endif + +#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) + if(result==C4JStorage::EMessage_ResultAccept) + { + if(!ProfileManager.IsSignedInLive(iPad)) + { + 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) + { + // 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.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPad); + } + else + // Determine why they're not "signed in live" + if (ProfileManager.isSignedInPSN(iPad)) + { + // Signed in to PSN but not connected (no internet access) + assert(!ProfileManager.isConnectedToPSN(iPad)); + + UINT uiIDA[1]; + uiIDA[0] = IDS_OK; + ui.RequestErrorMessage( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, iPad); + } + else + { + UINT uiIDA[1]; + uiIDA[0] = IDS_PRO_NOTONLINE_ACCEPT; + 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.RequestAlertMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 2, iPad,&UIScene_PauseMenu::MustSignInReturnedPSN,pParam); +#endif + } + else + { +#ifndef __ORBIS__ + // 4J-PB - need to check this user can access the store + bool bContentRestricted=false; + ProfileManager.GetChatAndContentRestrictions(ProfileManager.GetPrimaryPad(),true,NULL,&bContentRestricted,NULL); + if(bContentRestricted) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestAlertMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPad); + } + else +#endif + { + // need to get info on the pack to see if the user has already downloaded it + TexturePack *tPack = Minecraft::GetInstance()->skins->getSelected(); + DLCTexturePack *pDLCTexPack=(DLCTexturePack *)tPack; + + // retrieve the store name for the skin pack + DLCPack *pDLCPack=pDLCTexPack->getDLCInfoParentPack();//tPack->getDLCPack(); + const char *pchPackName=wstringtofilename(pDLCPack->getName()); + app.DebugPrintf("Texture Pack - %s\n",pchPackName); + SONYDLC *pSONYDLCInfo=app.GetSONYDLCInfo((char *)pchPackName); + + if(pSONYDLCInfo!=NULL) + { + char chName[42]; + char chKeyName[20]; + char chSkuID[SCE_NP_COMMERCE2_SKU_ID_LEN]; + + memset(chSkuID,0,SCE_NP_COMMERCE2_SKU_ID_LEN); + // find the info on the skin pack + // we have to retrieve the skuid from the store info, it can't be hardcoded since Sony may change it. + // So we assume the first sku for the product is the one we want + + // MGH - keyname in the DLC file is 16 chars long, but there's no space for a NULL terminating char + memset(chKeyName, 0, sizeof(chKeyName)); + strncpy(chKeyName, pSONYDLCInfo->chDLCKeyname, 16); + +#ifdef __ORBIS__ + strcpy(chName, chKeyName); +#else + sprintf(chName,"%s-%s",app.GetCommerceCategory(),chKeyName); +#endif + app.GetDLCSkuIDFromProductList(chName,chSkuID); + + // 4J-PB - need to check for an empty store +#if defined __ORBIS__ || defined __PSVITA__ || defined __PS3__ + if(app.CheckForEmptyStore(iPad)==false) +#endif + { + if(app.DLCAlreadyPurchased(chSkuID)) + { + app.DownloadAlreadyPurchased(chSkuID); + } + else + { + app.Checkout(chSkuID); + } + } + } + } + } + } +#endif // + + return 0; +} + +int UIScene_PauseMenu::BuyTexturePack_SignInReturned(void *pParam,bool bContinue, int iPad) +{ + if(bContinue==true) + { + // Check if we're signed in to LIVE + if(ProfileManager.IsSignedInLive(iPad)) + { +#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) + +#ifndef __ORBIS__ + // 4J-PB - need to check this user can access the store + bool bContentRestricted=false; + ProfileManager.GetChatAndContentRestrictions(iPad,true,NULL,&bContentRestricted,NULL); + if(bContentRestricted) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestAlertMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPad); + } + else +#endif + { + // need to get info on the pack to see if the user has already downloaded it + TexturePack *tPack = Minecraft::GetInstance()->skins->getSelected(); + DLCTexturePack *pDLCTexPack=(DLCTexturePack *)tPack; + + // retrieve the store name for the skin pack + DLCPack *pDLCPack=pDLCTexPack->getDLCInfoParentPack();//tPack->getDLCPack(); + const char *pchPackName=wstringtofilename(pDLCPack->getName()); + app.DebugPrintf("Texture Pack - %s\n",pchPackName); + SONYDLC *pSONYDLCInfo=app.GetSONYDLCInfo((char *)pchPackName); + + if(pSONYDLCInfo!=NULL) + { + char chName[42]; + char chKeyName[20]; + char chSkuID[SCE_NP_COMMERCE2_SKU_ID_LEN]; + + memset(chSkuID,0,SCE_NP_COMMERCE2_SKU_ID_LEN); + // find the info on the skin pack + // we have to retrieve the skuid from the store info, it can't be hardcoded since Sony may change it. + // So we assume the first sku for the product is the one we want + + // MGH - keyname in the DLC file is 16 chars long, but there's no space for a NULL terminating char + memset(chKeyName, 0, sizeof(chKeyName)); + strncpy(chKeyName, pSONYDLCInfo->chDLCKeyname, 16); + +#ifdef __ORBIS__ + strcpy(chName, chKeyName); +#else + sprintf(chName,"%s-%s",app.GetCommerceCategory(),chKeyName); +#endif + app.GetDLCSkuIDFromProductList(chName,chSkuID); + + // 4J-PB - need to check for an empty store +#if defined __ORBIS__ || defined __PSVITA__ || defined __PS3__ + if(app.CheckForEmptyStore(iPad)==false) +#endif + { + if(app.DLCAlreadyPurchased(chSkuID)) + { + app.DownloadAlreadyPurchased(chSkuID); + } + else + { + app.Checkout(chSkuID); + } + } + } + } +#else + // TO BE IMPEMENTED FOR ORBIS +#endif + } + } + return 0; +} + +int UIScene_PauseMenu::ViewInvites_SignInReturned(void *pParam,bool bContinue, int iPad) +{ + if(bContinue==true) + { + // Check if we're signed in to LIVE + if(ProfileManager.IsSignedInLive(iPad)) + { +#ifdef __ORBIS__ + SQRNetworkManager_Orbis::RecvInviteGUI(); +#elif defined __PS3__ + int ret = sceNpBasicRecvMessageCustom(SCE_NP_BASIC_MESSAGE_MAIN_TYPE_INVITE, SCE_NP_BASIC_RECV_MESSAGE_OPTIONS_INCLUDE_BOOTABLE, SYS_MEMORY_CONTAINER_ID_INVALID); + app.DebugPrintf("sceNpBasicRecvMessageCustom return %d ( %08x )\n", ret, ret); +#else // __PSVITA__ + PSVITA_STUBBED; +#endif + } + } + return 0; +} + + +int UIScene_PauseMenu::ExitGameSaveDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + // Exit with or without saving + // Decline means save in this dialog + if(result==C4JStorage::EMessage_ResultDecline || result==C4JStorage::EMessage_ResultThirdOption) + { + if( result==C4JStorage::EMessage_ResultDecline ) // Save + { + // 4J-PB - Is the player trying to save but they are using a trial texturepack ? + if(!Minecraft::GetInstance()->skins->isUsingDefaultSkin()) + { + TexturePack *tPack = Minecraft::GetInstance()->skins->getSelected(); + DLCTexturePack *pDLCTexPack=(DLCTexturePack *)tPack; + + DLCPack *pDLCPack=pDLCTexPack->getDLCInfoParentPack();//tPack->getDLCPack(); + if(!pDLCPack->hasPurchasedFile( DLCManager::e_DLCType_Texture, L"" )) + { +#ifdef _XBOX + // upsell + ULONGLONG ullOfferID_Full; + // get the dlc texture pack + DLCTexturePack *pDLCTexPack=(DLCTexturePack *)tPack; + + app.GetDLCFullOfferIDForPackID(pDLCTexPack->getDLCParentPackId(),&ullOfferID_Full); + + // tell sentient about the upsell of the full version of the skin pack + TelemetryManager->RecordUpsellPresented(iPad, eSet_UpsellID_Texture_DLC, ullOfferID_Full & 0xFFFFFFFF); +#endif + + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_OK; + uiIDA[1]=IDS_CONFIRM_CANCEL; + + // Give the player a warning about the trial version of the texture pack + ui.RequestAlertMessage(IDS_WARNING_DLC_TRIALTEXTUREPACK_TITLE, IDS_WARNING_DLC_TRIALTEXTUREPACK_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad() ,&UIScene_PauseMenu::WarningTrialTexturePackReturned, pParam); + + return S_OK; + } + } + + // does the save exist? + bool bSaveExists; + StorageManager.DoesSaveExist(&bSaveExists); + // 4J-PB - we check if the save exists inside the libs + // we need to ask if they are sure they want to overwrite the existing game + if(bSaveExists) + { + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + ui.RequestAlertMessage(IDS_TITLE_SAVE_GAME, IDS_CONFIRM_SAVE_GAME, uiIDA, 2, ProfileManager.GetPrimaryPad(),&IUIScene_PauseMenu::ExitGameAndSaveReturned, pParam); + return 0; + } + else + { +#if defined(_XBOX_ONE) || defined(__ORBIS__) + StorageManager.SetSaveDisabled(false); +#endif + MinecraftServer::getInstance()->setSaveOnExit( true ); + } + } + else + { + // been a few requests for a confirm on exit without saving + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + ui.RequestAlertMessage(IDS_TITLE_DECLINE_SAVE_GAME, IDS_CONFIRM_DECLINE_SAVE_GAME, uiIDA, 2, ProfileManager.GetPrimaryPad(),&IUIScene_PauseMenu::ExitGameDeclineSaveReturned, pParam); + return 0; + } + + app.SetAction(iPad,eAppAction_ExitWorld); + } + return 0; +} + +#endif + +void UIScene_PauseMenu::SetIgnoreInput(bool ignoreInput) +{ + m_bIgnoreInput = ignoreInput; +} + +#ifdef _XBOX_ONE +void UIScene_PauseMenu::HandleDLCLicenseChange() +{ +} +#endif + +#ifdef __ORBIS__ +bool UIScene_PauseMenu::CheckForPatch() +{ + int npAvailability = ProfileManager.getNPAvailability(ProfileManager.GetPrimaryPad()); + + bool bPatchAvailable; + switch(npAvailability) + { + case SCE_NP_ERROR_LATEST_PATCH_PKG_EXIST: + case SCE_NP_ERROR_LATEST_PATCH_PKG_DOWNLOADED: + bPatchAvailable=true; + break; + default: + bPatchAvailable=false; + break; + } + + if(bPatchAvailable) + { + int32_t ret = sceErrorDialogInitialize(); + if ( ret==SCE_OK ) + { + m_bErrorDialogRunning = true; + + SceErrorDialogParam param; + sceErrorDialogParamInitialize( ¶m ); + // 4J-PB - We want to display the option to get the patch now + param.errorCode = SCE_NP_ERROR_LATEST_PATCH_PKG_DOWNLOADED;//pClass->m_errorCode; + ret = sceUserServiceGetInitialUser( ¶m.userId ); + if ( ret == SCE_OK ) + { + ret = sceErrorDialogOpen( ¶m ); + } + else + { + sceErrorDialogTerminate(); + } + } + } + + return bPatchAvailable; +} +#endif \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_PauseMenu.h b/Minecraft.Client/Common/UI/UIScene_PauseMenu.h new file mode 100644 index 00000000..f1bd53aa --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_PauseMenu.h @@ -0,0 +1,112 @@ +#pragma once + +#include "UIScene.h" +#include "IUIScene_PauseMenu.h" + +#define BUTTON_PAUSE_RESUMEGAME 0 +#define BUTTON_PAUSE_HELPANDOPTIONS 1 +#define BUTTON_PAUSE_LEADERBOARDS 2 + +#ifdef _XBOX_ONE +#define BUTTON_PAUSE_XBOXHELP 3 +#else +#define BUTTON_PAUSE_ACHIEVEMENTS 3 +#endif + +#define BUTTON_PAUSE_SAVEGAME 4 +#define BUTTON_PAUSE_EXITGAME 5 +#define BUTTONS_PAUSE_MAX BUTTON_PAUSE_EXITGAME + 1 + +class UIScene_PauseMenu : public UIScene, public IUIScene_PauseMenu +{ +private: + bool m_savesDisabled; + bool m_bTrialTexturePack; + bool m_bErrorDialogRunning; + + enum eActions + { + eAction_None=0, +#if defined(__PS3__) || defined(__PSVITA__) || defined(__ORBIS__) + eAction_ViewLeaderboardsPSN, + eAction_ViewInvitesPSN, + eAction_SaveGamePSN, + eAction_BuyTexturePackPSN +#endif + + }; + eActions m_eAction; + + UIControl_Button m_buttons[BUTTONS_PAUSE_MAX]; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_buttons[BUTTON_PAUSE_RESUMEGAME], "Button1") + UI_MAP_ELEMENT( m_buttons[BUTTON_PAUSE_HELPANDOPTIONS], "Button2") + UI_MAP_ELEMENT( m_buttons[BUTTON_PAUSE_LEADERBOARDS], "Button3") +#ifdef _DURANGO + UI_MAP_ELEMENT( m_buttons[BUTTON_PAUSE_XBOXHELP], "Button4") +#else + UI_MAP_ELEMENT( m_buttons[BUTTON_PAUSE_ACHIEVEMENTS], "Button4") +#endif + UI_MAP_ELEMENT( m_buttons[BUTTON_PAUSE_SAVEGAME], "Button5") + UI_MAP_ELEMENT( m_buttons[BUTTON_PAUSE_EXITGAME], "Button6") + UI_END_MAP_ELEMENTS_AND_NAMES() + + virtual void HandleDLCMountingComplete(); + virtual void HandleDLCInstalled(); +#ifdef _XBOX_ONE + virtual void HandleDLCLicenseChange(); +#endif + static int UnlockFullSaveReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int SaveGame_SignInReturned(void *pParam,bool bContinue, int iPad); + +public: + UIScene_PauseMenu(int iPad, void *initData, UILayer *parentLayer); + virtual ~UIScene_PauseMenu(); + + virtual EUIScene getSceneType() { return eUIScene_PauseMenu;} + + virtual void tick(); + + virtual void updateTooltips(); + virtual void updateComponents(); + virtual void handlePreReload(); + virtual void handleReload(); + +protected: + void updateControlsVisibility(); + + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + +protected: + void handlePress(F64 controlId, F64 childId); + virtual void ShowScene(bool show); + virtual void SetIgnoreInput(bool ignoreInput); + bool m_bIgnoreInput; + +private: + void PerformActionSaveGame(); + +#if defined(__PS3__) || defined(__PSVITA__) || defined(__ORBIS__) + static int MustSignInReturnedPSN(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int ViewLeaderboards_SignInReturned(void *pParam,bool bContinue, int iPad); + static int ViewInvites_SignInReturned(void *pParam,bool bContinue, int iPad); + static int BuyTexturePack_SignInReturned(void *pParam,bool bContinue, int iPad); + static int WarningTrialTexturePackReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int ExitGameSaveDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); +#endif + +protected: +#ifdef _XBOX_ONE + static int BanGameDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + virtual long long getDefaultGtcButtons() { return _360_GTC_BACK | _360_GTC_PLAY; } +#endif + +#ifdef __ORBIS__ + bool CheckForPatch(); +#endif +}; diff --git a/Minecraft.Client/Common/UI/UIScene_QuadrantSignin.cpp b/Minecraft.Client/Common/UI/UIScene_QuadrantSignin.cpp new file mode 100644 index 00000000..0cb6cf2b --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_QuadrantSignin.cpp @@ -0,0 +1,342 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_QuadrantSignin.h" +#include "..\..\Minecraft.h" +#if defined(__ORBIS__) +#include "Common\Network\Sony\SonyHttp.h" +#endif + +UIScene_QuadrantSignin::UIScene_QuadrantSignin(int iPad, void *_initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + m_signInInfo = *((SignInInfo *)_initData); + + m_bIgnoreInput = false; + + m_lastRequestedAvatar = -1; + + _initQuadrants(); + +#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) + if(InputManager.IsCircleCrossSwapped()) + { + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_boolean; + value[0].boolval = true; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetABSwap , 1 , value ); + } +#endif + + parentLayer->addComponent(iPad,eUIComponent_MenuBackground); +} + +UIScene_QuadrantSignin::~UIScene_QuadrantSignin() +{ + m_parentLayer->removeComponent(eUIComponent_MenuBackground); +} + +wstring UIScene_QuadrantSignin::getMoviePath() +{ + return L"QuadrantSignin"; +} + +void UIScene_QuadrantSignin::updateTooltips() +{ + ui.SetTooltips(m_iPad, IDS_TOOLTIPS_CONTINUE, IDS_TOOLTIPS_CANCEL); +} + +// Returns true if this scene has focus for the pad passed in +bool UIScene_QuadrantSignin::hasFocus(int iPad) +{ + // Allow input from any controller + return bHasFocus; +} + +bool UIScene_QuadrantSignin::hidesLowerScenes() +{ + // This is a Modal dialog, so don't need to hide the scene behind + return false; +} + +void UIScene_QuadrantSignin::tick() +{ + if(!getMovie()) return; + + UIScene::tick(); + + updateState(); +} + +void UIScene_QuadrantSignin::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + app.DebugPrintf("UIScene_QuadrantSignin handling input for pad %d, key %d, repeat- %s, pressed- %s, released- %s\n", iPad, key, repeat?"TRUE":"FALSE", pressed?"TRUE":"FALSE", released?"TRUE":"FALSE"); + + if(!m_bIgnoreInput) + { + ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); + + switch(key) + { + case ACTION_MENU_CANCEL: + { + if(pressed) + { +#ifdef _XBOX_ONE + if(InputManager.IsPadLocked(iPad)) + { + if(iPad != ProfileManager.GetPrimaryPad()) + { + ProfileManager.RemoveGamepadFromGame(iPad); + } + else +#endif + { + m_bIgnoreInput = true; + m_signInInfo.Func(m_signInInfo.lpParam,false,iPad); + ProfileManager.CancelProfileAvatarRequest(); + + navigateBack(); + } + } +#ifdef _XBOX_ONE + } +#endif + } + break; + case ACTION_MENU_OK: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + 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 _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 + navigateBack(); + m_signInInfo.Func(m_signInInfo.lpParam,true,m_iPad); + } + else + { +#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; + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + if(pressed) + { + sendInputToMovie(key, repeat, pressed, released); + } + break; + } + } + + 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 _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 +#endif + { + pClass->m_bIgnoreInput = false; + pClass->updateState(); + } + + return 0; +} + +#ifdef _XBOX_ONE +void UIScene_QuadrantSignin::checkAllPrivilegesCallback(LPVOID lpParam, bool hasPrivileges, int iPad) +{ + UIScene_QuadrantSignin* pClass = (UIScene_QuadrantSignin*)lpParam; + + if(!hasPrivileges) + { + ProfileManager.RemoveGamepadFromGame(iPad); + } + pClass->m_bIgnoreInput = false; + pClass->updateState(); +} +#endif + +void UIScene_QuadrantSignin::updateState() +{ + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + if(ProfileManager.IsSignedIn(i) && InputManager.IsPadConnected(i)) + { + //app.DebugPrintf("Index %d is signed in, display name - '%s'\n", i, ProfileManager.GetDisplayName(i).data()); + +#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); + + if(!m_iconRequested[i]) + { + app.DebugPrintf(app.USER_SR, "Requesting avatar for %d\n", i); + if(ProfileManager.GetProfileAvatar(i, &UIScene_QuadrantSignin::AvatarReturned, this)) + { + m_iconRequested[i] = true; + m_lastRequestedAvatar = i; + } + } + } + else if(InputManager.IsPadConnected(i)) + { + //app.DebugPrintf("Index %d is not signed in\n", i); + + setControllerState(i, eControllerStatus_PressToJoin); + m_labelDisplayName[i].setLabel(L""); + m_iconRequested[i] = false; + } + else + { + //app.DebugPrintf("Index %d is not connected\n", i); + + setControllerState(i, eControllerStatus_ConnectController); + m_iconRequested[i] = false; + } + } +} + +void UIScene_QuadrantSignin::setControllerState(int iPad, EControllerStatus state) +{ + if(m_controllerStatus[iPad] != state) + { + m_controllerStatus[iPad] = state; + + IggyDataValue result; + IggyDataValue value[2]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = iPad; + + value[1].type = IGGY_DATATYPE_number; + value[1].number = (int)state; + + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetControllerStatus , 2 , value ); + } +} + +int UIScene_QuadrantSignin::AvatarReturned(LPVOID lpParam,PBYTE pbThumbnail,DWORD dwThumbnailBytes) +{ + UIScene_QuadrantSignin *pClass = (UIScene_QuadrantSignin *)lpParam; + app.DebugPrintf(app.USER_SR,"AvatarReturned callback\n"); + if(pbThumbnail != NULL) + { + // 4J-JEV - Added to ensure each new texture gets a unique name. + static unsigned int quadrantImageCount = 0; + + wchar_t iconName[32]; + swprintf(iconName,32,L"quadrantImage%05d",quadrantImageCount++); + + pClass->registerSubstitutionTexture(iconName,pbThumbnail,dwThumbnailBytes,true); + pClass->m_bitmapIcon[pClass->m_lastRequestedAvatar].setTextureName(iconName); + } + + pClass->m_lastRequestedAvatar = -1; + + return 0; +} + +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 new file mode 100644 index 00000000..691bb199 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_QuadrantSignin.h @@ -0,0 +1,121 @@ +#pragma once + +#include "UIScene.h" + +class UIScene_QuadrantSignin : public UIScene +{ +private: + enum EControllerStatus + { + eControllerStatus_ConnectController, + eControllerStatus_PressToJoin, + eControllerStatus_PlayerDetails, + eControllerStatus_PressToJoin_LoggedIn, + eControllerStatus_PressToJoin_NoController, + }; + + bool m_bIgnoreInput; + SignInInfo m_signInInfo; + + EControllerStatus m_controllerStatus[4]; + bool m_iconRequested[4]; + + int m_lastRequestedAvatar; + + UIControl m_controlPanels[4]; + UIControl_Label m_labelPressToJoin[4], m_labelDisplayName[4], m_labelAccountType[4], m_labelPlayerNumber[4], m_labelConnectController[4]; + UIControl_BitmapIcon m_bitmapIcon[4]; + IggyName m_funcJoinButtonPressed, m_funcSetControllerStatus, m_funcSetABSwap; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT(m_controlPanels[0],"Controller1") + UI_BEGIN_MAP_CHILD_ELEMENTS(m_controlPanels[0]) + UI_MAP_ELEMENT(m_labelPressToJoin[0], "PressLabel") + + UI_MAP_ELEMENT(m_labelDisplayName[0], "GamerTag") + UI_MAP_ELEMENT(m_labelAccountType[0], "AccountType") + UI_MAP_ELEMENT(m_labelPlayerNumber[0], "PlayerNumber") + UI_MAP_ELEMENT(m_bitmapIcon[0], "PlayerPic") + + UI_MAP_ELEMENT(m_labelConnectController[0], "ConnectControllerLabel") + UI_END_MAP_CHILD_ELEMENTS() + + UI_MAP_ELEMENT(m_controlPanels[1],"Controller2") + UI_BEGIN_MAP_CHILD_ELEMENTS(m_controlPanels[1]) + UI_MAP_ELEMENT(m_labelPressToJoin[1], "PressLabel") + + UI_MAP_ELEMENT(m_labelDisplayName[1], "GamerTag") + UI_MAP_ELEMENT(m_labelAccountType[1], "AccountType") + UI_MAP_ELEMENT(m_labelPlayerNumber[1], "PlayerNumber") + UI_MAP_ELEMENT(m_bitmapIcon[1], "PlayerPic") + + UI_MAP_ELEMENT(m_labelConnectController[1], "ConnectControllerLabel") + UI_END_MAP_CHILD_ELEMENTS() + + UI_MAP_ELEMENT(m_controlPanels[2],"Controller3") + UI_BEGIN_MAP_CHILD_ELEMENTS(m_controlPanels[2]) + UI_MAP_ELEMENT(m_labelPressToJoin[2], "PressLabel") + + UI_MAP_ELEMENT(m_labelDisplayName[2], "GamerTag") + UI_MAP_ELEMENT(m_labelAccountType[2], "AccountType") + UI_MAP_ELEMENT(m_labelPlayerNumber[2], "PlayerNumber") + UI_MAP_ELEMENT(m_bitmapIcon[2], "PlayerPic") + + UI_MAP_ELEMENT(m_labelConnectController[2], "ConnectControllerLabel") + UI_END_MAP_CHILD_ELEMENTS() + + UI_MAP_ELEMENT(m_controlPanels[3],"Controller4") + UI_BEGIN_MAP_CHILD_ELEMENTS(m_controlPanels[3]) + UI_MAP_ELEMENT(m_labelPressToJoin[3], "PressLabel") + + UI_MAP_ELEMENT(m_labelDisplayName[3], "GamerTag") + UI_MAP_ELEMENT(m_labelAccountType[3], "AccountType") + UI_MAP_ELEMENT(m_labelPlayerNumber[3], "PlayerNumber") + UI_MAP_ELEMENT(m_bitmapIcon[3], "PlayerPic") + + UI_MAP_ELEMENT(m_labelConnectController[3], "ConnectControllerLabel") + UI_END_MAP_CHILD_ELEMENTS() + + UI_MAP_NAME(m_funcJoinButtonPressed, L"JoinButtonPressed") + UI_MAP_NAME(m_funcSetControllerStatus, L"SetControllerStatus") + UI_MAP_NAME(m_funcSetABSwap, L"SetABSwap") + UI_END_MAP_ELEMENTS_AND_NAMES() +public: + UIScene_QuadrantSignin(int iPad, void *initData, UILayer *parentLayer); + ~UIScene_QuadrantSignin(); + + virtual EUIScene getSceneType() { return eUIScene_QuadrantSignin;} + virtual void updateTooltips(); + + virtual bool hasFocus(int iPad); + virtual bool hidesLowerScenes(); + + void tick(); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + +private: +#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(); + void setControllerState(int iPad, EControllerStatus state); + +#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_ReinstallMenu.cpp b/Minecraft.Client/Common/UI/UIScene_ReinstallMenu.cpp new file mode 100644 index 00000000..3b67f79e --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_ReinstallMenu.cpp @@ -0,0 +1,110 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_ReinstallMenu.h" + +UIScene_ReinstallMenu::UIScene_ReinstallMenu(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + +#if TO_BE_IMPLEMENTED + XuiControlSetText(m_Buttons[eControl_Theme],app.GetString(IDS_REINSTALL_THEME)); + XuiControlSetText(m_Buttons[eControl_Gamerpic1],app.GetString(IDS_REINSTALL_GAMERPIC_1)); + XuiControlSetText(m_Buttons[eControl_Gamerpic2],app.GetString(IDS_REINSTALL_GAMERPIC_2)); + XuiControlSetText(m_Buttons[eControl_Avatar1],app.GetString(IDS_REINSTALL_AVATAR_ITEM_1)); + XuiControlSetText(m_Buttons[eControl_Avatar2],app.GetString(IDS_REINSTALL_AVATAR_ITEM_2)); + XuiControlSetText(m_Buttons[eControl_Avatar3],app.GetString(IDS_REINSTALL_AVATAR_ITEM_3)); +#endif +} + +wstring UIScene_ReinstallMenu::getMoviePath() +{ + if(app.GetLocalPlayerCount() > 1) + { + return L"ReinstallSplit"; + } + else + { + return L"ReinstallMenu"; + } +} + +void UIScene_ReinstallMenu::updateTooltips() +{ + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK,IDS_TOOLTIPS_SELECTDEVICE); +} + +void UIScene_ReinstallMenu::updateComponents() +{ + bool bNotInGame=(Minecraft::GetInstance()->level==NULL); + if(bNotInGame) + { + m_parentLayer->showComponent(m_iPad,eUIComponent_Panorama,true); + m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,true); + } + else + { + m_parentLayer->showComponent(m_iPad,eUIComponent_Panorama,false); + + // 4J Stu - Do we want to show the logo in-game? + //if( app.GetLocalPlayerCount() == 1 ) m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,true); + //else m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,false); + m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,false); + + } +} + +void UIScene_ReinstallMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + //app.DebugPrintf("UIScene_DebugOverlay handling input for pad %d, key %d, down- %s, pressed- %s, released- %s\n", iPad, key, down?"TRUE":"FALSE", pressed?"TRUE":"FALSE", released?"TRUE":"FALSE"); + + ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); + + switch(key) + { + case ACTION_MENU_CANCEL: + if(pressed && !repeat) + { + navigateBack(); + } + break; + case ACTION_MENU_OK: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + sendInputToMovie(key, repeat, pressed, released); + break; + } +} + +void UIScene_ReinstallMenu::handlePress(F64 controlId, F64 childId) +{ +#if TO_BE_IMPLEMENTED + switch((int)controlId) + { + case BUTTON_HAO_CHANGESKIN: + ui.NavigateToScene(m_iPad, eUIScene_SkinSelectMenu); + break; + case BUTTON_HAO_HOWTOPLAY: + ui.NavigateToScene(m_iPad, eUIScene_HowToPlayMenu); + break; + case BUTTON_HAO_CONTROLS: + ui.NavigateToScene(m_iPad, eUIScene_ControlsMenu); + break; + case BUTTON_HAO_SETTINGS: + ui.NavigateToScene(m_iPad, eUIScene_SettingsMenu); + break; + case BUTTON_HAO_CREDITS: + ui.NavigateToScene(m_iPad, eUIScene_Credits); + break; + case BUTTON_HAO_REINSTALL: + ui.NavigateToScene(m_iPad, eUIScene_ReinstallMenu); + break; + case BUTTON_HAO_DEBUG: + ui.NavigateToScene(m_iPad, eUIScene_DebugOptions); + break; + } +#endif +} diff --git a/Minecraft.Client/Common/UI/UIScene_ReinstallMenu.h b/Minecraft.Client/Common/UI/UIScene_ReinstallMenu.h new file mode 100644 index 00000000..54c20a6e --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_ReinstallMenu.h @@ -0,0 +1,47 @@ +#pragma once + +#include "UIScene.h" + +class UIScene_ReinstallMenu : public UIScene +{ +private: + enum EControls + { + eControl_Theme, + eControl_Gamerpic1, + eControl_Gamerpic2, + eControl_Avatar1, + eControl_Avatar2, + eControl_Avatar3, + eControl_COUNT, + }; + UIControl_Button m_buttons[eControl_COUNT]; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_buttons[eControl_Theme], "Button1") + UI_MAP_ELEMENT( m_buttons[eControl_Gamerpic1], "Button2") + UI_MAP_ELEMENT( m_buttons[eControl_Gamerpic2], "Button3") + UI_MAP_ELEMENT( m_buttons[eControl_Avatar1], "Button4") + UI_MAP_ELEMENT( m_buttons[eControl_Avatar2], "Button5") + UI_MAP_ELEMENT( m_buttons[eControl_Avatar3], "Button6") + UI_END_MAP_ELEMENTS_AND_NAMES() + + //bool m_bNotInGame; +public: + UIScene_ReinstallMenu(int iPad, void *initData, UILayer *parentLayer); + + virtual EUIScene getSceneType() { return eUIScene_ReinstallMenu;} + + virtual void updateTooltips(); + virtual void updateComponents(); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + +protected: + void handlePress(F64 controlId, F64 childId); +}; diff --git a/Minecraft.Client/Common/UI/UIScene_SaveMessage.cpp b/Minecraft.Client/Common/UI/UIScene_SaveMessage.cpp new file mode 100644 index 00000000..b58f86fd --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_SaveMessage.cpp @@ -0,0 +1,188 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_SaveMessage.h" + +#define PROFILE_LOADED_TIMER_ID 0 +#define PROFILE_LOADED_TIMER_TIME 50 + +UIScene_SaveMessage::UIScene_SaveMessage(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + parentLayer->addComponent(iPad,eUIComponent_Panorama); + parentLayer->addComponent(iPad,eUIComponent_Logo); + + m_buttonConfirm.init(app.GetString(IDS_CONFIRM_OK),eControl_Confirm); + m_labelDescription.init(app.GetString(IDS_SAVE_ICON_MESSAGE)); + + IggyDataValue result; + + // Russian needs to resize the box + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcAutoResize , 0 , NULL ); + + // 4J-PB - If we have a signed in user connected, let's get the DLC now + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + if( (InputManager.IsPadConnected(i) || ProfileManager.IsSignedIn(i)) ) + { + if(!app.DLCInstallProcessCompleted() && !app.DLCInstallPending()) + { + app.StartInstallDLCProcess(i); + break; + } + } + } + + m_bIgnoreInput=false; + + // 4J-TomK - rebuild touch after auto resize +#ifdef __PSVITA__ + ui.TouchBoxRebuild(this); +#endif +} + +UIScene_SaveMessage::~UIScene_SaveMessage() +{ + m_parentLayer->removeComponent(eUIComponent_Panorama); + m_parentLayer->removeComponent(eUIComponent_Logo); +} + +wstring UIScene_SaveMessage::getMoviePath() +{ + return L"SaveMessage"; +} + +void UIScene_SaveMessage::updateTooltips() +{ + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT ); +} + +void UIScene_SaveMessage::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + if(m_bIgnoreInput) return; +#if defined (__ORBIS__) || defined (__PSVITA__) + // ignore all players except player 0 - it's their profile that is currently being used + if(iPad!=0) return; +#endif + + ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); + + switch(key) + { + case ACTION_MENU_OK: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + sendInputToMovie(key, repeat, pressed, released); + break; + // #ifdef __PS3__ + // case ACTION_MENU_Y: + // if(pressed) + // { + // // language select - switch to Greek for now + // if(app.GetMinecraftLanguage(iPad)==MINECRAFT_LANGUAGE_DEFAULT) + // { + // app.SetMinecraftLanguage(iPad,MINECRAFT_LANGUAGE_GREEK); + // } + // else + // { + // app.SetMinecraftLanguage(iPad,MINECRAFT_LANGUAGE_DEFAULT); + // } + // // reload the string table + // ui.SetupFont(); + // app.loadStringTable(); + // handleReload(); + // } + // break; + // #endif + } +} + +void UIScene_SaveMessage::handlePress(F64 controlId, F64 childId) +{ + switch((int)controlId) + { + case eControl_Confirm: + + //CD - Added for audio + ui.PlayUISFX(eSFX_Press); + + m_bIgnoreInput=true; + +#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) + // wait for the profile to be read - this has been kicked off earlier, so should be read by now + addTimer(PROFILE_LOADED_TIMER_ID,PROFILE_LOADED_TIMER_TIME); +#else + ui.NavigateToHomeMenu(); +#endif + break; + }; +} + +void UIScene_SaveMessage::handleTimerComplete(int id) +{ + switch(id) + { + case PROFILE_LOADED_TIMER_ID: + { +#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) + C4JStorage::eOptionsCallback eStatus=app.GetOptionsCallbackStatus(0); + + switch(eStatus) + { + case C4JStorage::eOptions_Callback_Read: + case C4JStorage::eOptions_Callback_Read_FileNotFound: + case C4JStorage::eOptions_Callback_Read_Fail: +#ifdef __PSVITA__ + case C4JStorage::eOptions_Callback_Write_Fail: + case C4JStorage::eOptions_Callback_Write: +#endif + // set defaults - which has already been done + killTimer(PROFILE_LOADED_TIMER_ID); + ui.NavigateToHomeMenu(); + SQRNetworkManager::SafeToRespondToGameBootInvite(); + app.SetOptionsCallbackStatus(0,C4JStorage::eOptions_Callback_Idle); + break; + case C4JStorage::eOptions_Callback_Read_CorruptDeleted: + killTimer(PROFILE_LOADED_TIMER_ID); + ui.NavigateToHomeMenu(); + SQRNetworkManager::SafeToRespondToGameBootInvite(); + app.SetOptionsCallbackStatus(0,C4JStorage::eOptions_Callback_Idle); + break; + case C4JStorage::eOptions_Callback_Read_Corrupt: + // get the user to delete the options file + app.DebugPrintf("Corrupt options file\n"); + app.SetOptionsCallbackStatus(0,C4JStorage::eOptions_Callback_Read_CorruptDeletePending); + m_bIgnoreInput=false; + // give the option to delete the save + UINT uiIDA[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 + } + + break; + } +} + +#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) +int UIScene_SaveMessage::DeleteOptionsDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + //UIScene_SaveMessage* pClass = (UIScene_SaveMessage*)pParam; + 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_SaveMessage.h b/Minecraft.Client/Common/UI/UIScene_SaveMessage.h new file mode 100644 index 00000000..cedc8c8f --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_SaveMessage.h @@ -0,0 +1,51 @@ +#pragma once + +#include "UIScene.h" + +class UIScene_SaveMessage : public UIScene +{ +private: + enum EControls + { + eControl_Confirm, + }; + + bool m_bIgnoreInput; + + UIControl_Button m_buttonConfirm; + UIControl_Label m_labelDescription; + IggyName m_funcAutoResize; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT(m_buttonConfirm, "Confirm") + UI_MAP_ELEMENT(m_labelDescription, "Description") + UI_MAP_NAME( m_funcAutoResize, L"AutoResize") + UI_END_MAP_ELEMENTS_AND_NAMES() + +#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) + static int DeleteOptionsDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); +#endif + +public: + UIScene_SaveMessage(int iPad, void *initData, UILayer *parentLayer); + ~UIScene_SaveMessage(); + + virtual EUIScene getSceneType() { return eUIScene_SaveMessage;} + // Returns true if this scene has focus for the pad passed in +#ifndef __PS3__ + virtual bool hasFocus(int iPad) { return bHasFocus; } +#endif + virtual void updateTooltips(); + +protected: + virtual wstring getMoviePath(); + +public: + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + virtual void handleTimerComplete(int id); + +protected: + void handlePress(F64 controlId, F64 childId); + + virtual long long getDefaultGtcButtons() { return 0; } +}; diff --git a/Minecraft.Client/Common/UI/UIScene_SettingsAudioMenu.cpp b/Minecraft.Client/Common/UI/UIScene_SettingsAudioMenu.cpp new file mode 100644 index 00000000..6d892d70 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_SettingsAudioMenu.cpp @@ -0,0 +1,116 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_SettingsAudioMenu.h" + +UIScene_SettingsAudioMenu::UIScene_SettingsAudioMenu(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + WCHAR TempString[256]; + swprintf( (WCHAR *)TempString, 256, L"%ls: %d%%", app.GetString( IDS_SLIDER_MUSIC ),app.GetGameSettings(m_iPad,eGameSetting_MusicVolume)); + m_sliderMusic.init(TempString,eControl_Music,0,100,app.GetGameSettings(m_iPad,eGameSetting_MusicVolume)); + + swprintf( (WCHAR *)TempString, 256, L"%ls: %d%%", app.GetString( IDS_SLIDER_SOUND ),app.GetGameSettings(m_iPad,eGameSetting_SoundFXVolume)); + m_sliderSound.init(TempString,eControl_Sound,0,100,app.GetGameSettings(m_iPad,eGameSetting_SoundFXVolume)); + + doHorizontalResizeCheck(); + + if(app.GetLocalPlayerCount()>1) + { +#if TO_BE_IMPLEMENTED + app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad); +#endif + } +} + +UIScene_SettingsAudioMenu::~UIScene_SettingsAudioMenu() +{ +} + +wstring UIScene_SettingsAudioMenu::getMoviePath() +{ + if(app.GetLocalPlayerCount() > 1) + { + return L"SettingsAudioMenuSplit"; + } + else + { + return L"SettingsAudioMenu"; + } +} + +void UIScene_SettingsAudioMenu::updateTooltips() +{ + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); +} + +void UIScene_SettingsAudioMenu::updateComponents() +{ + bool bNotInGame=(Minecraft::GetInstance()->level==NULL); + if(bNotInGame) + { + m_parentLayer->showComponent(m_iPad,eUIComponent_Panorama,true); + m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,true); + } + else + { + m_parentLayer->showComponent(m_iPad,eUIComponent_Panorama,false); + + if( app.GetLocalPlayerCount() == 1 ) m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,true); + else m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,false); + } +} + +void UIScene_SettingsAudioMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + //app.DebugPrintf("UIScene_DebugOverlay handling input for pad %d, key %d, down- %s, pressed- %s, released- %s\n", iPad, key, down?"TRUE":"FALSE", pressed?"TRUE":"FALSE", released?"TRUE":"FALSE"); + ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); + + switch(key) + { + case ACTION_MENU_CANCEL: + if(pressed) + { + navigateBack(); + } + break; + case ACTION_MENU_OK: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + sendInputToMovie(key, repeat, pressed, released); + break; + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + case ACTION_MENU_LEFT: + case ACTION_MENU_RIGHT: + sendInputToMovie(key, repeat, pressed, released); + break; + } +} + +void UIScene_SettingsAudioMenu::handleSliderMove(F64 sliderId, F64 currentValue) +{ + WCHAR TempString[256]; + int value = (int)currentValue; + switch((int)sliderId) + { + case eControl_Music: + m_sliderMusic.handleSliderMove(value); + + app.SetGameSettings(m_iPad,eGameSetting_MusicVolume,value); + swprintf( (WCHAR *)TempString, 256, L"%ls: %d%%", app.GetString( IDS_SLIDER_MUSIC ),value); + m_sliderMusic.setLabel(TempString); + + break; + case eControl_Sound: + m_sliderSound.handleSliderMove(value); + + app.SetGameSettings(m_iPad,eGameSetting_SoundFXVolume,value); + swprintf( (WCHAR *)TempString, 256, L"%ls: %d%%", app.GetString( IDS_SLIDER_SOUND ),value); + m_sliderSound.setLabel(TempString); + + break; + } +} diff --git a/Minecraft.Client/Common/UI/UIScene_SettingsAudioMenu.h b/Minecraft.Client/Common/UI/UIScene_SettingsAudioMenu.h new file mode 100644 index 00000000..6c48b22b --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_SettingsAudioMenu.h @@ -0,0 +1,38 @@ +#pragma once + +#include "UIScene.h" + +class UIScene_SettingsAudioMenu : public UIScene +{ +private: + enum EControls + { + eControl_Music, + eControl_Sound + }; + + UIControl_Slider m_sliderMusic, m_sliderSound; // Sliders + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_sliderMusic, "Music") + UI_MAP_ELEMENT( m_sliderSound, "Sound") + UI_END_MAP_ELEMENTS_AND_NAMES() + +public: + UIScene_SettingsAudioMenu(int iPad, void *initData, UILayer *parentLayer); + virtual ~UIScene_SettingsAudioMenu(); + + virtual EUIScene getSceneType() { return eUIScene_SettingsAudioMenu;} + + virtual void updateTooltips(); + virtual void updateComponents(); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + + virtual void handleSliderMove(F64 sliderId, F64 currentValue); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_SettingsControlMenu.cpp b/Minecraft.Client/Common/UI/UIScene_SettingsControlMenu.cpp new file mode 100644 index 00000000..d5447f77 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_SettingsControlMenu.cpp @@ -0,0 +1,116 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_SettingsControlMenu.h" + +UIScene_SettingsControlMenu::UIScene_SettingsControlMenu(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + WCHAR TempString[256]; + swprintf( (WCHAR *)TempString, 256, L"%ls: %d%%", app.GetString( IDS_SLIDER_SENSITIVITY_INGAME ),app.GetGameSettings(m_iPad,eGameSetting_Sensitivity_InGame)); + m_sliderSensitivityInGame.init(TempString,eControl_SensitivityInGame,0,200,app.GetGameSettings(m_iPad,eGameSetting_Sensitivity_InGame)); + + swprintf( (WCHAR *)TempString, 256, L"%ls: %d%%", app.GetString( IDS_SLIDER_SENSITIVITY_INMENU ),app.GetGameSettings(m_iPad,eGameSetting_Sensitivity_InMenu)); + m_sliderSensitivityInMenu.init(TempString,eControl_SensitivityInMenu,0,200,app.GetGameSettings(m_iPad,eGameSetting_Sensitivity_InMenu)); + + doHorizontalResizeCheck(); + + if(app.GetLocalPlayerCount()>1) + { +#if TO_BE_IMPLEMENTED + app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad,false); +#endif + } +} + +UIScene_SettingsControlMenu::~UIScene_SettingsControlMenu() +{ +} + +wstring UIScene_SettingsControlMenu::getMoviePath() +{ + if(app.GetLocalPlayerCount() > 1) + { + return L"SettingsControlMenuSplit"; + } + else + { + return L"SettingsControlMenu"; + } +} + +void UIScene_SettingsControlMenu::updateTooltips() +{ + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); +} + +void UIScene_SettingsControlMenu::updateComponents() +{ + bool bNotInGame=(Minecraft::GetInstance()->level==NULL); + if(bNotInGame) + { + m_parentLayer->showComponent(m_iPad,eUIComponent_Panorama,true); + m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,true); + } + else + { + m_parentLayer->showComponent(m_iPad,eUIComponent_Panorama,false); + + if( app.GetLocalPlayerCount() == 1 ) m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,true); + else m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,false); + } +} + +void UIScene_SettingsControlMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + ui.AnimateKeyPress(iPad, key, repeat, pressed, released); + + switch(key) + { + case ACTION_MENU_CANCEL: + if(pressed) + { + navigateBack(); + handled = true; + } + break; + case ACTION_MENU_OK: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + sendInputToMovie(key, repeat, pressed, released); + break; + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + case ACTION_MENU_LEFT: + case ACTION_MENU_RIGHT: + sendInputToMovie(key, repeat, pressed, released); + break; + } +} + +void UIScene_SettingsControlMenu::handleSliderMove(F64 sliderId, F64 currentValue) +{ + WCHAR TempString[256]; + int value = (int)currentValue; + switch((int)sliderId) + { + case eControl_SensitivityInGame: + m_sliderSensitivityInGame.handleSliderMove(value); + + app.SetGameSettings(m_iPad,eGameSetting_Sensitivity_InGame,value); + swprintf( (WCHAR *)TempString, 256, L"%ls: %d%%", app.GetString( IDS_SLIDER_SENSITIVITY_INGAME ),value); + m_sliderSensitivityInGame.setLabel(TempString); + + break; + case eControl_SensitivityInMenu: + m_sliderSensitivityInMenu.handleSliderMove(value); + + app.SetGameSettings(m_iPad,eGameSetting_Sensitivity_InMenu,value); + swprintf( (WCHAR *)TempString, 256, L"%ls: %d%%", app.GetString( IDS_SLIDER_SENSITIVITY_INMENU ),value); + m_sliderSensitivityInMenu.setLabel(TempString); + + break; + } +} diff --git a/Minecraft.Client/Common/UI/UIScene_SettingsControlMenu.h b/Minecraft.Client/Common/UI/UIScene_SettingsControlMenu.h new file mode 100644 index 00000000..6d3b864c --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_SettingsControlMenu.h @@ -0,0 +1,37 @@ +#pragma once + +#include "UIScene.h" + +class UIScene_SettingsControlMenu : public UIScene +{ +private: + enum EControls + { + eControl_SensitivityInGame, + eControl_SensitivityInMenu + }; + + UIControl_Slider m_sliderSensitivityInGame, m_sliderSensitivityInMenu; // Sliders + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_sliderSensitivityInGame, "SensitivityInGame") + UI_MAP_ELEMENT( m_sliderSensitivityInMenu, "SensitivityInMenu") + UI_END_MAP_ELEMENTS_AND_NAMES() +public: + UIScene_SettingsControlMenu(int iPad, void *initData, UILayer *parentLayer); + virtual ~UIScene_SettingsControlMenu(); + + virtual EUIScene getSceneType() { return eUIScene_SettingsControlMenu;} + + virtual void updateTooltips(); + virtual void updateComponents(); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + + virtual void handleSliderMove(F64 sliderId, F64 currentValue); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_SettingsGraphicsMenu.cpp b/Minecraft.Client/Common/UI/UIScene_SettingsGraphicsMenu.cpp new file mode 100644 index 00000000..1234121e --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_SettingsGraphicsMenu.cpp @@ -0,0 +1,153 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_SettingsGraphicsMenu.h" + +UIScene_SettingsGraphicsMenu::UIScene_SettingsGraphicsMenu(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + m_bNotInGame=(Minecraft::GetInstance()->level==NULL); + + m_checkboxClouds.init(app.GetString(IDS_CHECKBOX_RENDER_CLOUDS),eControl_Clouds,(app.GetGameSettings(m_iPad,eGameSetting_Clouds)!=0)); + m_checkboxBedrockFog.init(app.GetString(IDS_CHECKBOX_RENDER_BEDROCKFOG),eControl_BedrockFog,(app.GetGameSettings(m_iPad,eGameSetting_BedrockFog)!=0)); + m_checkboxCustomSkinAnim.init(app.GetString(IDS_CHECKBOX_CUSTOM_SKIN_ANIM),eControl_CustomSkinAnim,(app.GetGameSettings(m_iPad,eGameSetting_CustomSkinAnim)!=0)); + + + WCHAR TempString[256]; + + swprintf( (WCHAR *)TempString, 256, L"%ls: %d%%", app.GetString( IDS_SLIDER_GAMMA ),app.GetGameSettings(m_iPad,eGameSetting_Gamma)); + m_sliderGamma.init(TempString,eControl_Gamma,0,100,app.GetGameSettings(m_iPad,eGameSetting_Gamma)); + + swprintf( (WCHAR *)TempString, 256, L"%ls: %d%%", app.GetString( IDS_SLIDER_INTERFACEOPACITY ),app.GetGameSettings(m_iPad,eGameSetting_InterfaceOpacity)); + m_sliderInterfaceOpacity.init(TempString,eControl_InterfaceOpacity,0,100,app.GetGameSettings(m_iPad,eGameSetting_InterfaceOpacity)); + + doHorizontalResizeCheck(); + + bool bInGame=(Minecraft::GetInstance()->level!=NULL); + bool bIsPrimaryPad=(ProfileManager.GetPrimaryPad()==m_iPad); + // if we're not in the game, we need to use basescene 0 + if(bInGame) + { + // If the game has started, then you need to be the host to change the in-game gamertags + if(bIsPrimaryPad) + { + // we are the primary player on this machine, but not the game host + // are we the game host? If not, we need to remove the bedrockfog setting + if(!g_NetworkManager.IsHost()) + { + // hide the in-game bedrock fog setting + removeControl(&m_checkboxBedrockFog, true); + } + } + else + { + // We shouldn't have the bedrock fog option, or the m_CustomSkinAnim option + removeControl(&m_checkboxBedrockFog, true); + removeControl(&m_checkboxCustomSkinAnim, true); + } + } + + if(app.GetLocalPlayerCount()>1) + { +#if TO_BE_IMPLEMENTED + app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad); +#endif + } +} + +UIScene_SettingsGraphicsMenu::~UIScene_SettingsGraphicsMenu() +{ +} + +wstring UIScene_SettingsGraphicsMenu::getMoviePath() +{ + if(app.GetLocalPlayerCount() > 1) + { + return L"SettingsGraphicsMenuSplit"; + } + else + { + return L"SettingsGraphicsMenu"; + } +} + +void UIScene_SettingsGraphicsMenu::updateTooltips() +{ + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); +} + +void UIScene_SettingsGraphicsMenu::updateComponents() +{ + bool bNotInGame=(Minecraft::GetInstance()->level==NULL); + if(bNotInGame) + { + m_parentLayer->showComponent(m_iPad,eUIComponent_Panorama,true); + m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,true); + } + else + { + m_parentLayer->showComponent(m_iPad,eUIComponent_Panorama,false); + + if( app.GetLocalPlayerCount() == 1 ) m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,true); + else m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,false); + + } +} + +void UIScene_SettingsGraphicsMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + ui.AnimateKeyPress(iPad, key, repeat, pressed, released); + switch(key) + { + case ACTION_MENU_CANCEL: + if(pressed) + { + // check the checkboxes + app.SetGameSettings(m_iPad,eGameSetting_Clouds,m_checkboxClouds.IsChecked()?1:0); + app.SetGameSettings(m_iPad,eGameSetting_BedrockFog,m_checkboxBedrockFog.IsChecked()?1:0); + app.SetGameSettings(m_iPad,eGameSetting_CustomSkinAnim,m_checkboxCustomSkinAnim.IsChecked()?1:0); + + navigateBack(); + handled = true; + } + break; + case ACTION_MENU_OK: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + sendInputToMovie(key, repeat, pressed, released); + break; + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + case ACTION_MENU_LEFT: + case ACTION_MENU_RIGHT: + sendInputToMovie(key, repeat, pressed, released); + break; + } +} + +void UIScene_SettingsGraphicsMenu::handleSliderMove(F64 sliderId, F64 currentValue) +{ + WCHAR TempString[256]; + int value = (int)currentValue; + switch((int)sliderId) + { + case eControl_Gamma: + m_sliderGamma.handleSliderMove(value); + + app.SetGameSettings(m_iPad,eGameSetting_Gamma,value); + swprintf( (WCHAR *)TempString, 256, L"%ls: %d%%", app.GetString( IDS_SLIDER_GAMMA ),value); + m_sliderGamma.setLabel(TempString); + + break; + case eControl_InterfaceOpacity: + m_sliderInterfaceOpacity.handleSliderMove(value); + + app.SetGameSettings(m_iPad,eGameSetting_InterfaceOpacity,value); + swprintf( (WCHAR *)TempString, 256, L"%ls: %d%%", app.GetString( IDS_SLIDER_INTERFACEOPACITY ),value); + m_sliderInterfaceOpacity.setLabel(TempString); + + break; + } +} diff --git a/Minecraft.Client/Common/UI/UIScene_SettingsGraphicsMenu.h b/Minecraft.Client/Common/UI/UIScene_SettingsGraphicsMenu.h new file mode 100644 index 00000000..e9c4905c --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_SettingsGraphicsMenu.h @@ -0,0 +1,46 @@ +#pragma once + +#include "UIScene.h" + +class UIScene_SettingsGraphicsMenu : public UIScene +{ +private: + enum EControls + { + eControl_Clouds, + eControl_BedrockFog, + eControl_CustomSkinAnim, + eControl_Gamma, + eControl_InterfaceOpacity + }; + + UIControl_CheckBox m_checkboxClouds, m_checkboxBedrockFog, m_checkboxCustomSkinAnim; // Checkboxes + UIControl_Slider m_sliderGamma, m_sliderInterfaceOpacity; // Sliders + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_checkboxClouds, "Clouds") + UI_MAP_ELEMENT( m_checkboxBedrockFog, "BedrockFog") + UI_MAP_ELEMENT( m_checkboxCustomSkinAnim, "CustomSkinAnim") + UI_MAP_ELEMENT( m_sliderGamma, "Gamma") + UI_MAP_ELEMENT( m_sliderInterfaceOpacity, "InterfaceOpacity") + UI_END_MAP_ELEMENTS_AND_NAMES() + + bool m_bNotInGame; +public: + UIScene_SettingsGraphicsMenu(int iPad, void *initData, UILayer *parentLayer); + virtual ~UIScene_SettingsGraphicsMenu(); + + virtual EUIScene getSceneType() { return eUIScene_SettingsGraphicsMenu;} + + virtual void updateTooltips(); + virtual void updateComponents(); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + + virtual void handleSliderMove(F64 sliderId, F64 currentValue); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_SettingsMenu.cpp b/Minecraft.Client/Common/UI/UIScene_SettingsMenu.cpp new file mode 100644 index 00000000..39a0b7c6 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_SettingsMenu.cpp @@ -0,0 +1,169 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_SettingsMenu.h" +#include "..\..\Minecraft.h" + +UIScene_SettingsMenu::UIScene_SettingsMenu(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + bool bNotInGame=(Minecraft::GetInstance()->level==NULL); + + m_buttons[BUTTON_ALL_OPTIONS].init(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], bNotInGame); + removeControl( &m_buttons[BUTTON_ALL_GRAPHICS], bNotInGame); + } + + doHorizontalResizeCheck(); + + if(app.GetLocalPlayerCount()>1) + { +#if TO_BE_IMPLEMENTED + app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad,false); +#endif + } +} + +UIScene_SettingsMenu::~UIScene_SettingsMenu() +{ +} + +wstring UIScene_SettingsMenu::getMoviePath() +{ + if(app.GetLocalPlayerCount() > 1) + { + return L"SettingsMenuSplit"; + } + else + { + return L"SettingsMenu"; + } +} + +void UIScene_SettingsMenu::handleReload() +{ + bool bNotInGame=(Minecraft::GetInstance()->level==NULL); + if(ProfileManager.GetPrimaryPad()!=m_iPad) + { + removeControl( &m_buttons[BUTTON_ALL_AUDIO], bNotInGame); + removeControl( &m_buttons[BUTTON_ALL_GRAPHICS], bNotInGame); + } + + doHorizontalResizeCheck(); +} + +void UIScene_SettingsMenu::updateTooltips() +{ + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); +} + +void UIScene_SettingsMenu::updateComponents() +{ + bool bNotInGame=(Minecraft::GetInstance()->level==NULL); + if(bNotInGame) + { + m_parentLayer->showComponent(m_iPad,eUIComponent_Panorama,true); + m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,true); + } + else + { + m_parentLayer->showComponent(m_iPad,eUIComponent_Panorama,false); + + if( app.GetLocalPlayerCount() == 1 ) m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,true); + else m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,false); + + } +} + +void UIScene_SettingsMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + //app.DebugPrintf("UIScene_DebugOverlay handling input for pad %d, key %d, down- %s, pressed- %s, released- %s\n", iPad, key, down?"TRUE":"FALSE", pressed?"TRUE":"FALSE", released?"TRUE":"FALSE"); + ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); + + switch(key) + { + case ACTION_MENU_CANCEL: + if(pressed) + { + // if the profile data has been changed, then force a profile write + // It seems we're allowed to break the 5 minute rule if it's the result of a user action + + app.CheckGameSettingsChanged(true,iPad); + navigateBack(); + } + break; + case ACTION_MENU_OK: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + sendInputToMovie(key, repeat, pressed, released); + break; + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + sendInputToMovie(key, repeat, pressed, released); + break; + } +} + +void UIScene_SettingsMenu::handlePress(F64 controlId, F64 childId) +{ + //CD - Added for audio + ui.PlayUISFX(eSFX_Press); + + switch((int)controlId) + { + case BUTTON_ALL_OPTIONS: + ui.NavigateToScene(m_iPad, eUIScene_SettingsOptionsMenu); + break; + case BUTTON_ALL_AUDIO: + ui.NavigateToScene(m_iPad, eUIScene_SettingsAudioMenu); + break; + case BUTTON_ALL_CONTROL: + ui.NavigateToScene(m_iPad, eUIScene_SettingsControlMenu); + break; + case BUTTON_ALL_GRAPHICS: + ui.NavigateToScene(m_iPad, eUIScene_SettingsGraphicsMenu); + break; + case BUTTON_ALL_UI: + ui.NavigateToScene(m_iPad, eUIScene_SettingsUIMenu); + break; + case BUTTON_ALL_RESETTODEFAULTS: + { + // check they really want to do this + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + + ui.RequestAlertMessage(IDS_DEFAULTS_TITLE, IDS_DEFAULTS_TEXT, uiIDA, 2, m_iPad,&UIScene_SettingsMenu::ResetDefaultsDialogReturned,this); + } + break; + } +} + +int UIScene_SettingsMenu::ResetDefaultsDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + UIScene_SettingsMenu* pClass = (UIScene_SettingsMenu*)pParam; + + // results switched for this dialog + if(result==C4JStorage::EMessage_ResultDecline) + { +#if (defined __PS3__ || defined __ORBIS__ || defined _DURANGO || defined __PSVITA__) + app.SetDefaultOptions(StorageManager.GetDashboardProfileSettings(pClass->m_iPad),pClass->m_iPad); +#else + app.SetDefaultOptions(ProfileManager.GetDashboardProfileSettings(pClass->m_iPad),pClass->m_iPad); +#endif + // if the profile data has been changed, then force a profile write + // It seems we're allowed to break the 5 minute rule if it's the result of a user action + app.CheckGameSettingsChanged(true,iPad); + } + return 0; +} diff --git a/Minecraft.Client/Common/UI/UIScene_SettingsMenu.h b/Minecraft.Client/Common/UI/UIScene_SettingsMenu.h new file mode 100644 index 00000000..7f5fe169 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_SettingsMenu.h @@ -0,0 +1,47 @@ +#pragma once + +#include "UIScene.h" + +#define BUTTON_ALL_OPTIONS 0 +#define BUTTON_ALL_AUDIO 1 +#define BUTTON_ALL_CONTROL 2 +#define BUTTON_ALL_GRAPHICS 4 +#define BUTTON_ALL_UI 5 +#define BUTTON_ALL_RESETTODEFAULTS 6 +#define BUTTONS_ALL_MAX BUTTON_ALL_RESETTODEFAULTS + 1 + +class UIScene_SettingsMenu : public UIScene +{ +private: + UIControl_Button m_buttons[BUTTONS_ALL_MAX]; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_buttons[BUTTON_ALL_OPTIONS], "Button1") + UI_MAP_ELEMENT( m_buttons[BUTTON_ALL_AUDIO], "Button2") + UI_MAP_ELEMENT( m_buttons[BUTTON_ALL_CONTROL], "Button3") + UI_MAP_ELEMENT( m_buttons[BUTTON_ALL_GRAPHICS], "Button4") + UI_MAP_ELEMENT( m_buttons[BUTTON_ALL_UI], "Button5") + UI_MAP_ELEMENT( m_buttons[BUTTON_ALL_RESETTODEFAULTS], "Button6") + UI_END_MAP_ELEMENTS_AND_NAMES() +public: + UIScene_SettingsMenu(int iPad, void *initData, UILayer *parentLayer); + virtual ~UIScene_SettingsMenu(); + + virtual EUIScene getSceneType() { return eUIScene_SettingsMenu;} + + virtual void updateTooltips(); + virtual void updateComponents(); + virtual void handleReload(); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + +protected: + void handlePress(F64 controlId, F64 childId); + + static int ResetDefaultsDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_SettingsOptionsMenu.cpp b/Minecraft.Client/Common/UI/UIScene_SettingsOptionsMenu.cpp new file mode 100644 index 00000000..6898d489 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_SettingsOptionsMenu.cpp @@ -0,0 +1,428 @@ +#include "stdafx.h" +#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, + IDS_DIFFICULTY_EASY, + IDS_DIFFICULTY_NORMAL, + IDS_DIFFICULTY_HARD +}; + +int UIScene_SettingsOptionsMenu::m_iDifficultyTitleSettingA[4]= +{ + IDS_DIFFICULTY_TITLE_PEACEFUL, + IDS_DIFFICULTY_TITLE_EASY, + IDS_DIFFICULTY_TITLE_NORMAL, + IDS_DIFFICULTY_TITLE_HARD +}; + +UIScene_SettingsOptionsMenu::UIScene_SettingsOptionsMenu(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + m_bNavigateToLanguageSelector = false; + + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + m_bNotInGame=(Minecraft::GetInstance()->level==NULL); + + 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(IDS_UNHIDE_MASHUP_WORLDS,eControl_ShowMashUpWorlds,false); + } + else + { + //m_checkboxMashupWorlds.init(L"",eControl_ShowMashUpWorlds,false); + removeControl(&m_checkboxMashupWorlds, true); + m_bMashUpWorldsUnhideOption=false; + } + + unsigned char ucValue=app.GetGameSettings(m_iPad,eGameSetting_Autosave); + + wchar_t autosaveLabels[9][256]; + for(unsigned int i = 0; i < 9; ++i) + { + if(i==0) + { + swprintf( autosaveLabels[i], 256, L"%ls", app.GetString( IDS_SLIDER_AUTOSAVE_OFF )); + } + else + { + swprintf( autosaveLabels[i], 256, L"%ls: %d %ls", app.GetString( IDS_SLIDER_AUTOSAVE ),i*15, app.GetString( IDS_MINUTES )); + } + + } + m_sliderAutosave.setAllPossibleLabels(9,autosaveLabels); + m_sliderAutosave.init(autosaveLabels[ucValue],eControl_Autosave,0,8,ucValue); + +#if defined(_XBOX_ONE) || defined(__ORBIS__) + removeControl(&m_sliderAutosave,true); +#endif + + ucValue = app.GetGameSettings(m_iPad,eGameSetting_Difficulty); + wchar_t difficultyLabels[4][256]; + for(unsigned int i = 0; i < 4; ++i) + { + swprintf( difficultyLabels[i], 256, L"%ls: %ls", app.GetString( IDS_SLIDER_DIFFICULTY ),app.GetString(m_iDifficultyTitleSettingA[i])); + } + m_sliderDifficulty.setAllPossibleLabels(4,difficultyLabels); + m_sliderDifficulty.init(difficultyLabels[ucValue],eControl_Difficulty,0,3,ucValue); + + wstring wsText=app.GetString(m_iDifficultySettingA[app.GetGameSettings(m_iPad,eGameSetting_Difficulty)]); + EHTMLFontSize size = eHTMLSize_Normal; + if(!RenderManager.IsHiDef() && !RenderManager.IsWidescreen()) + { + size = eHTMLSize_Splitscreen; + } + wchar_t startTags[64]; + swprintf(startTags,64,L"",app.GetHTMLColour(eHTMLColor_White)); + wsText= startTags + wsText; + + m_labelDifficultyText.init(wsText); + + // If you are in-game, only the game host can change in-game gamertags, and you can't change difficulty + // only the primary player gets to change the autosave and difficulty settings + bool bRemoveDifficulty=false; + bool bRemoveAutosave=false; + bool bRemoveInGameGamertags=false; + + 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); + } + + // 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) + { +#if TO_BE_IMPLEMENTED + 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) + { + return L"SettingsOptionsMenuSplit"; + } + else + { + return L"SettingsOptionsMenu"; + } +} + +void UIScene_SettingsOptionsMenu::updateTooltips() +{ + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); +} + +void UIScene_SettingsOptionsMenu::updateComponents() +{ + bool bNotInGame=(Minecraft::GetInstance()->level==NULL); + if(bNotInGame) + { + m_parentLayer->showComponent(m_iPad,eUIComponent_Panorama,true); + m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,true); + } + else + { + m_parentLayer->showComponent(m_iPad,eUIComponent_Panorama,false); + + if( app.GetLocalPlayerCount() == 1 ) m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,RenderManager.IsHiDef()); + else m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,false); + } +} + +void UIScene_SettingsOptionsMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + ui.AnimateKeyPress(iPad, key, repeat, pressed, released); + switch(key) + { + case ACTION_MENU_CANCEL: + if(pressed) + { + setGameSettings(); + navigateBack(); + } + break; + case ACTION_MENU_OK: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + sendInputToMovie(key, repeat, pressed, released); + break; + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + case ACTION_MENU_LEFT: + case ACTION_MENU_RIGHT: + sendInputToMovie(key, repeat, pressed, released); + break; + } +} + +void UIScene_SettingsOptionsMenu::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) +{ + int value = (int)currentValue; + switch((int)sliderId) + { + case eControl_Autosave: + m_sliderAutosave.handleSliderMove(value); + + app.SetGameSettings(m_iPad,eGameSetting_Autosave,value); + // Update the autosave timer + app.SetAutosaveTimerTime(); + + break; + case eControl_Difficulty: + m_sliderDifficulty.handleSliderMove(value); + + app.SetGameSettings(m_iPad,eGameSetting_Difficulty,value); + + wstring wsText=app.GetString(m_iDifficultySettingA[value]); + EHTMLFontSize size = eHTMLSize_Normal; + if(!RenderManager.IsHiDef() && !RenderManager.IsWidescreen()) + { + size = eHTMLSize_Splitscreen; + } + wchar_t startTags[64]; + swprintf(startTags,64,L"",app.GetHTMLColour(eHTMLColor_White)); + wsText= startTags + wsText; + m_labelDifficultyText.setLabel(wsText.c_str()); + break; + } +} + +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 new file mode 100644 index 00000000..e9abb0a9 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_SettingsOptionsMenu.h @@ -0,0 +1,72 @@ +#pragma once + +#include "UIScene.h" + +class UIScene_SettingsOptionsMenu : public UIScene +{ +private: + enum EControls + { + eControl_ViewBob, + eControl_ShowHints, + eControl_ShowTooltips, + eControl_InGameGamertags, + eControl_ShowMashUpWorlds, + eControl_Autosave, + eControl_Languages, + eControl_Difficulty + }; +protected: + static int m_iDifficultySettingA[4]; + static int m_iDifficultyTitleSettingA[4]; + +private: + UIControl_CheckBox m_checkboxViewBob, m_checkboxShowHints, m_checkboxShowTooltips, m_checkboxInGameGamertags, m_checkboxMashupWorlds; // Checkboxes + UIControl_Slider m_sliderAutosave, m_sliderDifficulty; // Sliders + UIControl_Label m_labelDifficultyText; //Text + UIControl_Button m_buttonLanguageSelect; + + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_checkboxViewBob, "ViewBob") + UI_MAP_ELEMENT( m_checkboxShowHints, "ShowHints") + UI_MAP_ELEMENT( m_checkboxShowTooltips, "ShowTooltips") + UI_MAP_ELEMENT( m_checkboxInGameGamertags, "InGameGamertags") + UI_MAP_ELEMENT( m_checkboxMashupWorlds, "ShowMashUpWorlds") + UI_MAP_ELEMENT( m_sliderAutosave, "Autosave") + UI_MAP_ELEMENT( m_sliderDifficulty, "Difficulty") + UI_MAP_ELEMENT( m_labelDifficultyText, "DifficultyText") + UI_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(); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + virtual void handlePress(F64 controlId, F64 childId); + + virtual void 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_SettingsUIMenu.cpp b/Minecraft.Client/Common/UI/UIScene_SettingsUIMenu.cpp new file mode 100644 index 00000000..917012d6 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_SettingsUIMenu.cpp @@ -0,0 +1,183 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_SettingsUIMenu.h" + +UIScene_SettingsUIMenu::UIScene_SettingsUIMenu(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + m_bNotInGame=(Minecraft::GetInstance()->level==NULL); + + m_checkboxDisplayHUD.init(app.GetString(IDS_CHECKBOX_DISPLAY_HUD),eControl_DisplayHUD,(app.GetGameSettings(m_iPad,eGameSetting_DisplayHUD)!=0)); + m_checkboxDisplayHand.init(app.GetString(IDS_CHECKBOX_DISPLAY_HAND),eControl_DisplayHand,(app.GetGameSettings(m_iPad,eGameSetting_DisplayHand)!=0)); + m_checkboxDisplayDeathMessages.init(app.GetString(IDS_CHECKBOX_DEATH_MESSAGES),eControl_DisplayDeathMessages,(app.GetGameSettings(m_iPad,eGameSetting_DeathMessages)!=0)); + m_checkboxDisplayAnimatedCharacter.init(app.GetString(IDS_CHECKBOX_ANIMATED_CHARACTER),eControl_DisplayAnimatedCharacter,(app.GetGameSettings(m_iPad,eGameSetting_AnimatedCharacter)!=0)); + m_checkboxSplitscreen.init(app.GetString(IDS_CHECKBOX_VERTICAL_SPLIT_SCREEN),eControl_Splitscreen,(app.GetGameSettings(m_iPad,eGameSetting_SplitScreenVertical)!=0)); + m_checkboxShowSplitscreenGamertags.init(app.GetString(IDS_CHECKBOX_DISPLAY_SPLITSCREENGAMERTAGS),eControl_ShowSplitscreenGamertags,(app.GetGameSettings(m_iPad,eGameSetting_DisplaySplitscreenGamertags)!=0)); + + WCHAR TempString[256]; + + swprintf( (WCHAR *)TempString, 256, L"%ls: %d", app.GetString( IDS_SLIDER_UISIZE ),app.GetGameSettings(m_iPad,eGameSetting_UISize)+1); + m_sliderUISize.init(TempString,eControl_UISize,1,3,app.GetGameSettings(m_iPad,eGameSetting_UISize)+1); + + swprintf( (WCHAR *)TempString, 256, L"%ls: %d", app.GetString( IDS_SLIDER_UISIZESPLITSCREEN ),app.GetGameSettings(m_iPad,eGameSetting_UISizeSplitscreen)+1); + m_sliderUISizeSplitscreen.init(TempString,eControl_UISizeSplitscreen,1,3,app.GetGameSettings(m_iPad,eGameSetting_UISizeSplitscreen)+1); + + doHorizontalResizeCheck(); + + bool bInGame=(Minecraft::GetInstance()->level!=NULL); + bool bPrimaryPlayer = ProfileManager.GetPrimaryPad()==m_iPad; + + // if we're not in the game, we need to use basescene 0 + if(bInGame) + { + // If the game has started, then you need to be the host to change the in-game gamertags + if(!bPrimaryPlayer) + { + // hide things we don't want the splitscreen player changing + removeControl(&m_checkboxSplitscreen, true); + removeControl(&m_checkboxShowSplitscreenGamertags, true); + } + } + + + if(app.GetLocalPlayerCount()>1) + { +#if TO_BE_IMPLEMENTED + app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad); +#endif + } +} + +void UIScene_SettingsUIMenu::updateTooltips() +{ + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); +} + +void UIScene_SettingsUIMenu::updateComponents() +{ + bool bNotInGame=(Minecraft::GetInstance()->level==NULL); + if(bNotInGame) + { + m_parentLayer->showComponent(m_iPad,eUIComponent_Panorama,true); + m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,true); + } + else + { + m_parentLayer->showComponent(m_iPad,eUIComponent_Panorama,false); + + if( app.GetLocalPlayerCount() == 1 ) m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,true); + else m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,false); + + } +} + +UIScene_SettingsUIMenu::~UIScene_SettingsUIMenu() +{ +} + +wstring UIScene_SettingsUIMenu::getMoviePath() +{ + if(app.GetLocalPlayerCount() > 1) + { + return L"SettingsUIMenuSplit"; + } + else + { + return L"SettingsUIMenu"; + } +} + +void UIScene_SettingsUIMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + ui.AnimateKeyPress(iPad, key, repeat, pressed, released); + + switch(key) + { + case ACTION_MENU_CANCEL: + if(pressed) + { + // check the checkboxes + app.SetGameSettings(m_iPad,eGameSetting_DisplayHUD,m_checkboxDisplayHUD.IsChecked()?1:0); + app.SetGameSettings(m_iPad,eGameSetting_DisplayHand,m_checkboxDisplayHand.IsChecked()?1:0); + app.SetGameSettings(m_iPad,eGameSetting_DisplaySplitscreenGamertags,m_checkboxShowSplitscreenGamertags.IsChecked()?1:0); + app.SetGameSettings(m_iPad,eGameSetting_DeathMessages,m_checkboxDisplayDeathMessages.IsChecked()?1:0); + app.SetGameSettings(m_iPad,eGameSetting_AnimatedCharacter,m_checkboxDisplayAnimatedCharacter.IsChecked()?1:0); + + // if the splitscreen vertical/horizontal has changed, need to update the scenes + if(app.GetGameSettings(m_iPad,eGameSetting_SplitScreenVertical)!=(m_checkboxSplitscreen.IsChecked()?1:0)) + { + // changed + app.SetGameSettings(m_iPad,eGameSetting_SplitScreenVertical,m_checkboxSplitscreen.IsChecked()?1:0); + + // close the xui scenes, so we don't have the navigate backed to menu at the wrong place + if(app.GetLocalPlayerCount()==2) + { + ui.CloseAllPlayersScenes(); + } + else + { + navigateBack(); + } + } + else + { + navigateBack(); + } + handled = true; + } + break; + case ACTION_MENU_OK: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + sendInputToMovie(key, repeat, pressed, released); + break; + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + case ACTION_MENU_LEFT: + case ACTION_MENU_RIGHT: + sendInputToMovie(key, repeat, pressed, released); + break; + } +} + +void UIScene_SettingsUIMenu::handleSliderMove(F64 sliderId, F64 currentValue) +{ + WCHAR TempString[256]; + int value = (int)currentValue; + switch((int)sliderId) + { + case eControl_UISize: + m_sliderUISize.handleSliderMove(value); + + swprintf( (WCHAR *)TempString, 256, L"%ls: %d", app.GetString( IDS_SLIDER_UISIZE ),value); + m_sliderUISize.setLabel(TempString); + + // is this different from the current value? + if(value != app.GetGameSettings(m_iPad,eGameSetting_UISize)+1) + { + app.SetGameSettings(m_iPad,eGameSetting_UISize,value-1); + // Apply the changes to the selected text position + ui.UpdateSelectedItemPos(m_iPad); + } + + break; + case eControl_UISizeSplitscreen: + m_sliderUISizeSplitscreen.handleSliderMove(value); + + swprintf( (WCHAR *)TempString, 256, L"%ls: %d", app.GetString( IDS_SLIDER_UISIZESPLITSCREEN ),value); + m_sliderUISizeSplitscreen.setLabel(TempString); + + if(value != app.GetGameSettings(m_iPad,eGameSetting_UISizeSplitscreen)+1) + { + // slider is 1 to 3 + app.SetGameSettings(m_iPad,eGameSetting_UISizeSplitscreen,value-1); + // Apply the changes to the selected text position + ui.UpdateSelectedItemPos(m_iPad); + } + + break; + } +} diff --git a/Minecraft.Client/Common/UI/UIScene_SettingsUIMenu.h b/Minecraft.Client/Common/UI/UIScene_SettingsUIMenu.h new file mode 100644 index 00000000..8968bbe7 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_SettingsUIMenu.h @@ -0,0 +1,53 @@ +#pragma once + +#include "UIScene.h" + +class UIScene_SettingsUIMenu : public UIScene +{ +private: + enum EControls + { + eControl_DisplayHUD, + eControl_DisplayHand, + eControl_DisplayDeathMessages, + eControl_DisplayAnimatedCharacter, + eControl_Splitscreen, + eControl_ShowSplitscreenGamertags, + eControl_UISize, + eControl_UISizeSplitscreen + }; + + UIControl_CheckBox m_checkboxDisplayHUD, m_checkboxDisplayHand, m_checkboxDisplayDeathMessages, m_checkboxDisplayAnimatedCharacter, m_checkboxSplitscreen, m_checkboxShowSplitscreenGamertags; // Checkboxes + UIControl_Slider m_sliderUISize, m_sliderUISizeSplitscreen; // Sliders + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_checkboxDisplayHUD, "DisplayHUD") + UI_MAP_ELEMENT( m_checkboxDisplayHand, "DisplayHand") + UI_MAP_ELEMENT( m_checkboxDisplayDeathMessages, "DisplayDeathMessages") + UI_MAP_ELEMENT( m_checkboxDisplayAnimatedCharacter, "DisplayAnimatedCharacter") + UI_MAP_ELEMENT( m_checkboxSplitscreen, "Splitscreen") + UI_MAP_ELEMENT( m_checkboxShowSplitscreenGamertags, "ShowSplitscreenGamertags") + + UI_MAP_ELEMENT( m_sliderUISize, "UISize") + UI_MAP_ELEMENT( m_sliderUISizeSplitscreen, "UISizeSplitscreen") + UI_END_MAP_ELEMENTS_AND_NAMES() + + bool m_bNotInGame; +public: + UIScene_SettingsUIMenu(int iPad, void *initData, UILayer *parentLayer); + virtual ~UIScene_SettingsUIMenu(); + + virtual EUIScene getSceneType() { return eUIScene_SettingsUIMenu;} + + virtual void updateTooltips(); + virtual void updateComponents(); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + + virtual void handleSliderMove(F64 sliderId, F64 currentValue); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_SignEntryMenu.cpp b/Minecraft.Client/Common/UI/UIScene_SignEntryMenu.cpp new file mode 100644 index 00000000..c29bac2d --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_SignEntryMenu.cpp @@ -0,0 +1,206 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_SignEntryMenu.h" +#include "..\..\Minecraft.h" +#include "..\..\MultiPlayerLocalPlayer.h" +#include "..\..\MultiPlayerLevel.h" +#include "..\..\ClientConnection.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.tile.entity.h" + +UIScene_SignEntryMenu::UIScene_SignEntryMenu(int iPad, void *_initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + SignEntryScreenInput* initData = (SignEntryScreenInput*)_initData; + m_sign = initData->sign; + + m_bConfirmed = false; + m_bIgnoreInput = false; + + m_buttonConfirm.init(app.GetString(IDS_DONE), eControl_Confirm); + m_labelMessage.init(app.GetString(IDS_EDIT_SIGN_MESSAGE)); + + for(unsigned int i = 0; i<4; ++i) + { +#if TO_BE_IMPLEMENTED + // Have to have the Latin alphabet here, since that's what we have on the sign in-game + // but because the JAP/KOR/CHN fonts don't have extended European characters, let's restrict those languages to not having the extended character set, since they can't see what they are typing + switch(XGetLanguage()) + { + case XC_LANGUAGE_JAPANESE: + case XC_LANGUAGE_TCHINESE: + case XC_LANGUAGE_KOREAN: + case XC_LANGUAGE_RUSSIAN: + m_signRows[i].SetKeyboardType(C_4JInput::EKeyboardMode_Alphabet); + break; + default: + m_signRows[i].SetKeyboardType(C_4JInput::EKeyboardMode_Full); + break; + } + + m_signRows[i].SetText( m_sign->GetMessage(i).c_str() ); + m_signRows[i].SetTextLimit(15); + // Set the title and desc for the edit keyboard popup + m_signRows[i].SetTitleAndText(IDS_SIGN_TITLE,IDS_SIGN_TITLE_TEXT); +#endif + m_textInputLines[i].init(m_sign->GetMessage(i).c_str(), i); + } + + parentLayer->addComponent(iPad,eUIComponent_MenuBackground); +} + +UIScene_SignEntryMenu::~UIScene_SignEntryMenu() +{ + m_parentLayer->removeComponent(eUIComponent_MenuBackground); +} + +wstring UIScene_SignEntryMenu::getMoviePath() +{ + if(app.GetLocalPlayerCount() > 1) + { + return L"SignEntryMenuSplit"; + } + else + { + return L"SignEntryMenu"; + } +} + +void UIScene_SignEntryMenu::updateTooltips() +{ + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); +} + +void UIScene_SignEntryMenu::tick() +{ + UIScene::tick(); + + if(m_bConfirmed) + { + m_bConfirmed = false; + + // Set the sign text here so we on;y call the verify once it has been set, not while we're typing in to it + for(int i=0;i<4;i++) + { + wstring temp=m_textInputLines[i].getLabel(); + m_sign->SetMessage(i,temp); + } + + m_sign->setChanged(); + + Minecraft *pMinecraft=Minecraft::GetInstance(); + // need to send the new data + if (pMinecraft->level->isClientSide) + { + shared_ptr player = pMinecraft->localplayers[m_iPad]; + if(player != NULL && player->connection && player->connection->isStarted()) + { + player->connection->send( shared_ptr( new SignUpdatePacket(m_sign->x, m_sign->y, m_sign->z, m_sign->IsVerified(), m_sign->IsCensored(), m_sign->GetMessages()) ) ); + } + } + ui.CloseUIScenes(m_iPad); + } +} + +void UIScene_SignEntryMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + if(m_bConfirmed || m_bIgnoreInput) return; + + ui.AnimateKeyPress(iPad, key, repeat, pressed, released); + + switch(key) + { + case ACTION_MENU_CANCEL: + if(pressed) + { + // user backed out, so wipe the sign + wstring temp=L""; + + for(int i=0;i<4;i++) + { + m_sign->SetMessage(i,temp); + } + + navigateBack(); + ui.PlayUISFX(eSFX_Back); + handled = true; + } + break; + case ACTION_MENU_OK: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + sendInputToMovie(key, repeat, pressed, released); + handled = true; + break; + } +} + +int UIScene_SignEntryMenu::KeyboardCompleteCallback(LPVOID lpParam,bool bRes) +{ + // 4J HEG - No reason to set value if keyboard was cancelled + UIScene_SignEntryMenu *pClass=(UIScene_SignEntryMenu *)lpParam; + pClass->m_bIgnoreInput = false; + if (bRes) + { + uint16_t pchText[128]; + ZeroMemory(pchText, 128 * sizeof(uint16_t) ); + InputManager.GetText(pchText); + pClass->m_textInputLines[pClass->m_iEditingLine].setLabel((wchar_t *)pchText); + } + return 0; +} + +void UIScene_SignEntryMenu::handlePress(F64 controlId, F64 childId) +{ + switch((int)controlId) + { + case eControl_Confirm: + { + m_bConfirmed = true; + } + break; + case eControl_Line1: + case eControl_Line2: + case eControl_Line3: + case eControl_Line4: + { + m_iEditingLine = (int)controlId; + m_bIgnoreInput = true; +#ifdef _XBOX_ONE + // 4J-PB - Xbox One uses the Windows virtual keyboard, and doesn't have the Xbox 360 Latin keyboard type, so we can't restrict the input set to alphanumeric. The closest we get is the emailSmtpAddress type. + int language = XGetLanguage(); + switch(language) + { + case XC_LANGUAGE_JAPANESE: + case XC_LANGUAGE_KOREAN: + case XC_LANGUAGE_TCHINESE: + InputManager.RequestKeyboard(app.GetString(IDS_SIGN_TITLE),m_textInputLines[m_iEditingLine].getLabel(),(DWORD)m_iPad,15,&UIScene_SignEntryMenu::KeyboardCompleteCallback,this,C_4JInput::EKeyboardMode_Email); + break; + default: + InputManager.RequestKeyboard(app.GetString(IDS_SIGN_TITLE),m_textInputLines[m_iEditingLine].getLabel(),(DWORD)m_iPad,15,&UIScene_SignEntryMenu::KeyboardCompleteCallback,this,C_4JInput::EKeyboardMode_Alphabet); + break; + } +#else + InputManager.RequestKeyboard(app.GetString(IDS_SIGN_TITLE),m_textInputLines[m_iEditingLine].getLabel(),(DWORD)m_iPad,15,&UIScene_SignEntryMenu::KeyboardCompleteCallback,this,C_4JInput::EKeyboardMode_Alphabet); +#endif + } + break; + } +} + +void UIScene_SignEntryMenu::handleDestroy() +{ +#ifdef __PSVITA__ + app.DebugPrintf("missing InputManager.DestroyKeyboard on Vita !!!!!!\n"); +#endif + + // another player destroyed the anvil, so shut down the keyboard if it is displayed +#if ( defined __PS3__ || defined __ORBIS__ || defined _DURANGO) + InputManager.DestroyKeyboard(); +#endif +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_SignEntryMenu.h b/Minecraft.Client/Common/UI/UIScene_SignEntryMenu.h new file mode 100644 index 00000000..28b37d53 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_SignEntryMenu.h @@ -0,0 +1,58 @@ +#pragma once + +#include "UIScene.h" + +class SignTileEntity; + +class UIScene_SignEntryMenu : public UIScene +{ +private: + enum EControls + { + // Lines should be 0-3 + eControl_Line1, + eControl_Line2, + eControl_Line3, + eControl_Line4, + eControl_Confirm + }; + + shared_ptr m_sign; + int m_iEditingLine; + bool m_bConfirmed; + bool m_bIgnoreInput; + + UIControl_Button m_buttonConfirm; + UIControl_Label m_labelMessage; + UIControl_TextInput m_textInputLines[4]; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_buttonConfirm, "Confirm") + UI_MAP_ELEMENT( m_labelMessage, "Message") + + UI_MAP_ELEMENT( m_textInputLines[0], "Line1") + UI_MAP_ELEMENT( m_textInputLines[1], "Line2") + UI_MAP_ELEMENT( m_textInputLines[2], "Line3") + UI_MAP_ELEMENT( m_textInputLines[3], "Line4") + UI_END_MAP_ELEMENTS_AND_NAMES() +public: + UIScene_SignEntryMenu(int iPad, void *initData, UILayer *parentLayer); + virtual ~UIScene_SignEntryMenu(); + + virtual EUIScene getSceneType() { return eUIScene_SignEntryMenu;} + virtual void updateTooltips(); + + virtual void tick(); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + +protected: + void handlePress(F64 controlId, F64 childId); + static int KeyboardCompleteCallback(LPVOID lpParam,const bool bRes); + virtual void handleDestroy(); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_SkinSelectMenu.cpp b/Minecraft.Client/Common/UI/UIScene_SkinSelectMenu.cpp new file mode 100644 index 00000000..a9dd2d91 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_SkinSelectMenu.cpp @@ -0,0 +1,1722 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_SkinSelectMenu.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#ifdef __ORBIS__ +#include +#elif defined __PSVITA__ +#include +#endif + +#define SKIN_SELECT_PACK_DEFAULT 0 +#define SKIN_SELECT_PACK_FAVORITES 1 +//#define SKIN_SELECT_PACK_PLAYER_CUSTOM 1 +#define SKIN_SELECT_MAX_DEFAULTS 2 + +WCHAR *UIScene_SkinSelectMenu::wchDefaultNamesA[]= +{ + L"USE LOCALISED VERSION", // Server selected + L"Steve", + L"Tennis Steve", + L"Tuxedo Steve", + L"Athlete Steve", + L"Scottish Steve", + L"Prisoner Steve", + L"Cyclist Steve", + L"Boxer Steve", +}; + +UIScene_SkinSelectMenu::UIScene_SkinSelectMenu(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + m_labelSelected.init( app.GetString( IDS_SELECTED ) ); + +#ifdef __ORBIS__ + m_bErrorDialogRunning=false; +#endif + + m_bIgnoreInput=false; + m_bNoSkinsToShow = false; + + m_currentPack = NULL; + m_packIndex = SKIN_SELECT_PACK_DEFAULT; + m_skinIndex = 0; + + m_originalSkinId = app.GetPlayerSkinId(iPad); + m_currentSkinPath = app.GetPlayerSkinName(iPad); + m_selectedSkinPath = L""; + m_selectedCapePath = L""; + m_vAdditionalSkinBoxes = NULL; + + m_bSlidingSkins = false; + m_bAnimatingMove = false; + m_bSkinIndexChanged = false; + + m_currentNavigation = eSkinNavigation_Skin; + + m_currentPackCount = 0; + + m_characters[eCharacter_Current].SetFacing(UIControl_PlayerSkinPreview::e_SkinPreviewFacing_Forward); + + m_characters[eCharacter_Next1].SetFacing(UIControl_PlayerSkinPreview::e_SkinPreviewFacing_Left); + m_characters[eCharacter_Next2].SetFacing(UIControl_PlayerSkinPreview::e_SkinPreviewFacing_Left); + m_characters[eCharacter_Next3].SetFacing(UIControl_PlayerSkinPreview::e_SkinPreviewFacing_Left); + m_characters[eCharacter_Next4].SetFacing(UIControl_PlayerSkinPreview::e_SkinPreviewFacing_Left); + + m_characters[eCharacter_Previous1].SetFacing(UIControl_PlayerSkinPreview::e_SkinPreviewFacing_Right); + m_characters[eCharacter_Previous2].SetFacing(UIControl_PlayerSkinPreview::e_SkinPreviewFacing_Right); + m_characters[eCharacter_Previous3].SetFacing(UIControl_PlayerSkinPreview::e_SkinPreviewFacing_Right); + m_characters[eCharacter_Previous4].SetFacing(UIControl_PlayerSkinPreview::e_SkinPreviewFacing_Right); + + m_labelSkinName.init(L""); + m_labelSkinOrigin.init(L""); + + m_leftLabel = L""; + m_centreLabel = L""; + m_rightLabel = L""; + +#ifdef __PSVITA__ + // initialise vita tab controls with ids + m_TouchTabLeft.init(ETouchInput_TabLeft); + m_TouchTabRight.init(ETouchInput_TabRight); + m_TouchTabCenter.init(ETouchInput_TabCenter); + m_TouchIggyCharacters.init(ETouchInput_IggyCharacters); +#endif + + // block input if we're waiting for DLC to install. The end of dlc mounting custom message will fill the save list + if(app.StartInstallDLCProcess(m_iPad)) + { + // DLC mounting in progress, so disable input + m_bIgnoreInput=true; + + m_controlTimer.setVisible( true ); + m_controlIggyCharacters.setVisible( false ); + m_controlSkinNamePlate.setVisible( false ); + + setCharacterLocked(false); + setCharacterSelected(false); + } + else + { + m_controlTimer.setVisible( false ); + + if(app.m_dlcManager.getPackCount(DLCManager::e_DLCType_Skin)>0) + { + // Change to display the favorites if there are any. The current skin will be in there (probably) - need to check for it + m_currentPack = app.m_dlcManager.getPackContainingSkin(m_currentSkinPath); + bool bFound; + if(m_currentPack != NULL) + { + m_packIndex = app.m_dlcManager.getPackIndex(m_currentPack,bFound,DLCManager::e_DLCType_Skin) + SKIN_SELECT_MAX_DEFAULTS; + } + } + + // If we have any favourites, set this to the favourites + // first validate the favorite skins - we might have uninstalled the DLC needed for them + app.ValidateFavoriteSkins(m_iPad); + + if(app.GetPlayerFavoriteSkinsCount(m_iPad)>0) + { + m_packIndex = SKIN_SELECT_PACK_FAVORITES; + } + + handlePackIndexChanged(); + } + + // Display the tooltips + +#ifdef __PSVITA__ + InitializeCriticalSection(&m_DLCInstallCS); // to prevent a race condition between the install and the mounted callback +#endif + +} + +void UIScene_SkinSelectMenu::updateTooltips() +{ + ui.SetTooltips( m_iPad, m_bNoSkinsToShow?-1:IDS_TOOLTIPS_SELECT_SKIN,IDS_TOOLTIPS_CANCEL,-1,-1,-1,-1,-1,-1,IDS_TOOLTIPS_NAVIGATE); +} + +void UIScene_SkinSelectMenu::updateComponents() +{ + m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,false); +} + +wstring UIScene_SkinSelectMenu::getMoviePath() +{ + if(app.GetLocalPlayerCount() > 1) + { + return L"SkinSelectMenuSplit"; + } + else + { + return L"SkinSelectMenu"; + } +} + +void UIScene_SkinSelectMenu::tick() +{ + UIScene::tick(); + + if(m_bSkinIndexChanged) + { + m_bSkinIndexChanged = false; + handleSkinIndexChanged(); + } + + // check for new DLC installed + + // check for the patch error dialog +#ifdef __ORBIS__ + + // process the error dialog (for a patch being available) + if(m_bErrorDialogRunning) + { + SceErrorDialogStatus stat = sceErrorDialogUpdateStatus(); + if( stat == SCE_ERROR_DIALOG_STATUS_FINISHED ) + { + sceErrorDialogTerminate(); + m_bErrorDialogRunning=false; + } + } + +#endif +} + +void UIScene_SkinSelectMenu::handleAnimationEnd() +{ + if(m_bSlidingSkins) + { + m_bSlidingSkins = false; + + m_characters[eCharacter_Current].SetFacing(UIControl_PlayerSkinPreview::e_SkinPreviewFacing_Forward, false); + m_characters[eCharacter_Next1].SetFacing(UIControl_PlayerSkinPreview::e_SkinPreviewFacing_Left, false); + m_characters[eCharacter_Previous1].SetFacing(UIControl_PlayerSkinPreview::e_SkinPreviewFacing_Right, false); + + m_bSkinIndexChanged = true; + //handleSkinIndexChanged(); + + m_bAnimatingMove = false; + } +} + +void UIScene_SkinSelectMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + if (m_bIgnoreInput) return; + //app.DebugPrintf("UIScene_DebugOverlay handling input for pad %d, key %d, down- %s, pressed- %s, released- %s\n", iPad, key, down?"TRUE":"FALSE", pressed?"TRUE":"FALSE", released?"TRUE":"FALSE"); + + switch(key) + { + case ACTION_MENU_CANCEL: + if(pressed) + { + ui.AnimateKeyPress(iPad, key, repeat, pressed, released); + app.CheckGameSettingsChanged(true,iPad); + navigateBack(); + } + break; + case ACTION_MENU_OK: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + if(pressed) + { + InputActionOK(iPad); + } + break; + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + if(pressed) + { + if(m_packIndex==SKIN_SELECT_PACK_FAVORITES) + { + if(app.GetPlayerFavoriteSkinsCount(iPad)==0) + { + // ignore this, since there are no skins being displayed + break; + } + } + + ui.AnimateKeyPress(iPad, key, repeat, pressed, released); + ui.PlayUISFX(eSFX_Scroll); + switch(m_currentNavigation) + { + case eSkinNavigation_Pack: + m_currentNavigation = eSkinNavigation_Skin; + break; + case eSkinNavigation_Skin: + m_currentNavigation = eSkinNavigation_Pack; + break; + }; + sendInputToMovie(key, repeat, pressed, released); + } + break; + case ACTION_MENU_LEFT: + if(pressed) + { + if( m_currentNavigation == eSkinNavigation_Skin ) + { + if(!m_bAnimatingMove) + { + ui.AnimateKeyPress(iPad, key, repeat, pressed, released); + ui.PlayUISFX(eSFX_Scroll); + + m_skinIndex = getPreviousSkinIndex(m_skinIndex); + //handleSkinIndexChanged(); + + m_bSlidingSkins = true; + m_bAnimatingMove = true; + + m_characters[eCharacter_Current].SetFacing(UIControl_PlayerSkinPreview::e_SkinPreviewFacing_Left, true); + m_characters[eCharacter_Previous1].SetFacing(UIControl_PlayerSkinPreview::e_SkinPreviewFacing_Forward, true); + + // 4J Stu - Swapped nav buttons + sendInputToMovie(ACTION_MENU_RIGHT, repeat, pressed, released); + } + } + else if( m_currentNavigation == eSkinNavigation_Pack ) + { + ui.AnimateKeyPress(iPad, key, repeat, pressed, released); + ui.PlayUISFX(eSFX_Scroll); + DWORD startingIndex = m_packIndex; + m_packIndex = getPreviousPackIndex(m_packIndex); + if(startingIndex != m_packIndex) + { + handlePackIndexChanged(); + } + } + } + break; + case ACTION_MENU_RIGHT: + if(pressed) + { + if( m_currentNavigation == eSkinNavigation_Skin ) + { + if(!m_bAnimatingMove) + { + ui.AnimateKeyPress(iPad, key, repeat, pressed, released); + ui.PlayUISFX(eSFX_Scroll); + m_skinIndex = getNextSkinIndex(m_skinIndex); + //handleSkinIndexChanged(); + + m_bSlidingSkins = true; + m_bAnimatingMove = true; + + m_characters[eCharacter_Current].SetFacing(UIControl_PlayerSkinPreview::e_SkinPreviewFacing_Right, true); + m_characters[eCharacter_Next1].SetFacing(UIControl_PlayerSkinPreview::e_SkinPreviewFacing_Forward, true); + + // 4J Stu - Swapped nav buttons + sendInputToMovie(ACTION_MENU_LEFT, repeat, pressed, released); + } + } + else if( m_currentNavigation == eSkinNavigation_Pack ) + { + ui.AnimateKeyPress(iPad, key, repeat, pressed, released); + ui.PlayUISFX(eSFX_Scroll); + DWORD startingIndex = m_packIndex; + m_packIndex = getNextPackIndex(m_packIndex); + if(startingIndex != m_packIndex) + { + handlePackIndexChanged(); + } + } + } + break; + case ACTION_MENU_OTHER_STICK_PRESS: + if(pressed) + { + ui.PlayUISFX(eSFX_Press); + if( m_currentNavigation == eSkinNavigation_Skin ) + { + m_characters[eCharacter_Current].ResetRotation(); + } + } + break; + case ACTION_MENU_OTHER_STICK_LEFT: + if(pressed) + { + if( m_currentNavigation == eSkinNavigation_Skin ) + { + m_characters[eCharacter_Current].m_incYRot = true; + } + else + { + ui.PlayUISFX(eSFX_Scroll); + } + } + else if(released) + { + m_characters[eCharacter_Current].m_incYRot = false; + } + break; + case ACTION_MENU_OTHER_STICK_RIGHT: + if(pressed) + { + if( m_currentNavigation == eSkinNavigation_Skin ) + { + m_characters[eCharacter_Current].m_decYRot = true; + } + else + { + ui.PlayUISFX(eSFX_Scroll); + } + } + else if(released) + { + m_characters[eCharacter_Current].m_decYRot = false; + } + break; + case ACTION_MENU_OTHER_STICK_UP: + if(pressed) + { + if( m_currentNavigation == eSkinNavigation_Skin ) + { + //m_previewControl->m_incXRot = true; + m_characters[eCharacter_Current].CyclePreviousAnimation(); + } + else + { + ui.PlayUISFX(eSFX_Scroll); + } + } + break; + case ACTION_MENU_OTHER_STICK_DOWN: + if(pressed) + { + if( m_currentNavigation == eSkinNavigation_Skin ) + { + //m_previewControl->m_decXRot = true; + m_characters[eCharacter_Current].CycleNextAnimation(); + } + else + { + ui.PlayUISFX(eSFX_Scroll); + } + } + break; + } +} + +void UIScene_SkinSelectMenu::InputActionOK(unsigned int iPad) +{ + ui.AnimateKeyPress(iPad, ACTION_MENU_OK, false, true, false); + + // if the profile data has been changed, then force a profile write + // It seems we're allowed to break the 5 minute rule if it's the result of a user action + switch(m_packIndex) + { + case SKIN_SELECT_PACK_DEFAULT: + app.SetPlayerSkin(iPad, m_skinIndex); + app.SetPlayerCape(iPad, 0); + m_currentSkinPath = app.GetPlayerSkinName(iPad); + m_originalSkinId = app.GetPlayerSkinId(iPad); + setCharacterSelected(true); + ui.PlayUISFX(eSFX_Press); + break; + case SKIN_SELECT_PACK_FAVORITES: + if(app.GetPlayerFavoriteSkinsCount(iPad)>0) + { + // get the pack number from the skin id + wchar_t chars[256]; + swprintf(chars, 256, L"dlcskin%08d.png", app.GetPlayerFavoriteSkin(iPad,m_skinIndex)); + + DLCPack *Pack=app.m_dlcManager.getPackContainingSkin(chars); + + if(Pack) + { + DLCSkinFile *skinFile = Pack->getSkinFile(chars); + app.SetPlayerSkin(iPad, skinFile->getPath()); + app.SetPlayerCape(iPad, skinFile->getParameterAsString(DLCManager::e_DLCParamType_Cape)); + setCharacterSelected(true); + m_currentSkinPath = app.GetPlayerSkinName(iPad); + m_originalSkinId = app.GetPlayerSkinId(iPad); + app.SetPlayerFavoriteSkinsPos(iPad,m_skinIndex); + } +} + break; + default: + if( m_currentPack != NULL ) + { + bool renableInputAfterOperation = true; + m_bIgnoreInput = true; + + DLCSkinFile *skinFile = m_currentPack->getSkinFile(m_skinIndex); + + // Is this a free skin? + + if(!skinFile->getParameterAsBool( DLCManager::e_DLCParamType_Free )) + { + // do we have a license? + //if(true) + if(!m_currentPack->hasPurchasedFile( DLCManager::e_DLCType_Skin, skinFile->getPath() )) + { +#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.RequestAlertMessage(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1,iPad); + } +#if defined(__PS3__) || defined(__ORBIS__) || defined __PSVITA__ + // are we online? + else if(!ProfileManager.IsSignedInLive(iPad)) + { + showNotOnlineDialog(iPad); + } +#endif + else + { + // upsell +#ifdef _XBOX + DLC_INFO *pDLCInfo = app.GetDLCInfoForTrialOfferID(m_currentPack->getPurchaseOfferId()); + ULONGLONG ullOfferID_Full; + + if(pDLCInfo!=NULL) + { + ullOfferID_Full=pDLCInfo->ullOfferID_Full; + } + else + { + ullOfferID_Full=m_currentPack->getPurchaseOfferId(); + } + + // tell sentient about the upsell of the full version of the skin pack + SentientManager.RecordUpsellPresented(iPad, eSet_UpsellID_Skin_DLC, ullOfferID_Full & 0xFFFFFFFF); +#endif + bool bContentRestricted=false; +#if defined(__PS3__) || defined(__PSVITA__) + ProfileManager.GetChatAndContentRestrictions(m_iPad,true,NULL,&bContentRestricted,NULL); +#endif + if(bContentRestricted) + { +#if !(defined(_XBOX) || defined(_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.RequestAlertMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPad); +#endif + } + else + { + // 4J-PB - need to check for an empty store +#if defined __ORBIS__ || defined __PSVITA__ || defined __PS3__ + if(app.CheckForEmptyStore(iPad)==false) +#endif + { + m_bIgnoreInput = true; + renableInputAfterOperation = false; + + UINT uiIDA[2] = { IDS_CONFIRM_OK, IDS_CONFIRM_CANCEL }; + ui.RequestAlertMessage(IDS_UNLOCK_DLC_TITLE, IDS_UNLOCK_DLC_SKIN, uiIDA, 2, iPad,&UIScene_SkinSelectMenu::UnlockSkinReturned,this); + } + } + } + } + else + { + app.SetPlayerSkin(iPad, skinFile->getPath()); + app.SetPlayerCape(iPad, skinFile->getParameterAsString(DLCManager::e_DLCParamType_Cape)); + setCharacterSelected(true); + m_currentSkinPath = app.GetPlayerSkinName(iPad); + m_originalSkinId = app.GetPlayerSkinId(iPad); + + // push this onto the favorite list + AddFavoriteSkin(m_iPad,GET_DLC_SKIN_ID_FROM_BITMASK(m_originalSkinId)); + } + } + else + { + app.SetPlayerSkin(iPad, skinFile->getPath()); + app.SetPlayerCape(iPad, skinFile->getParameterAsString(DLCManager::e_DLCParamType_Cape)); + setCharacterSelected(true); + m_currentSkinPath = app.GetPlayerSkinName(iPad); + m_originalSkinId = app.GetPlayerSkinId(iPad); + + // push this onto the favorite list + AddFavoriteSkin(iPad,GET_DLC_SKIN_ID_FROM_BITMASK(m_originalSkinId)); + } + + if (renableInputAfterOperation) + { + m_bIgnoreInput = false; + } + } + + ui.PlayUISFX(eSFX_Press); + break; + } +} + +void UIScene_SkinSelectMenu::customDraw(IggyCustomDrawCallbackRegion *region) +{ + int characterId = -1; + swscanf((wchar_t*)region->name,L"Character%d",&characterId); + if (characterId == -1) + { + app.DebugPrintf("Invalid character to render found\n"); + } + else + { + // Setup GDraw, normal game render states and matrices + CustomDrawData *customDrawRegion = ui.setupCustomDraw(this,region); + delete customDrawRegion; + + //app.DebugPrintf("Scissor x0= %d, y0= %d, x1= %d, y1= %d\n", region->scissor_x0, region->scissor_y0, region->scissor_x1, region->scissor_y1); + //app.DebugPrintf("Stencil mask= %d, stencil ref= %d, stencil write= %d\n", region->stencil_func_mask, region->stencil_func_ref, region->stencil_write_mask); +#ifdef __PS3__ + if(region->stencil_func_ref != 0) RenderManager.StateSetStencil(GL_EQUAL,region->stencil_func_ref,region->stencil_func_mask); +#elif __PSVITA__ + // AP - make sure the skins are only drawn inside the smokey panel + if(region->stencil_func_ref != 0) RenderManager.StateSetStencil(SCE_GXM_STENCIL_FUNC_EQUAL,region->stencil_func_mask,region->stencil_write_mask); +#else + if(region->stencil_func_ref != 0) RenderManager.StateSetStencil(GL_EQUAL,region->stencil_func_ref, region->stencil_func_mask,region->stencil_write_mask); +#endif + m_characters[characterId].render(region); + + // Finish GDraw and anything else that needs to be finalised + ui.endCustomDraw(region); + } +} + +void UIScene_SkinSelectMenu::handleSkinIndexChanged() +{ + BOOL showPrevious = FALSE, showNext = FALSE; + DWORD previousIndex = 0, nextIndex = 0; + wstring skinName = L""; + wstring skinOrigin = L""; + bool bSkinIsFree=false; + bool bLicensed=false; + DLCSkinFile *skinFile=NULL; + DLCPack *Pack=NULL; + BYTE sidePreviewControlsL,sidePreviewControlsR; + m_bNoSkinsToShow=false; + + TEXTURE_NAME backupTexture = TN_MOB_CHAR; + + setCharacterSelected(false); + + m_controlSkinNamePlate.setVisible( false ); + + if( m_currentPack != NULL ) + { + skinFile = m_currentPack->getSkinFile(m_skinIndex); + m_selectedSkinPath = skinFile->getPath(); + m_selectedCapePath = skinFile->getParameterAsString(DLCManager::e_DLCParamType_Cape); + m_vAdditionalSkinBoxes = skinFile->getAdditionalBoxes(); + + skinName = skinFile->getParameterAsString( DLCManager::e_DLCParamType_DisplayName ); + skinOrigin = skinFile->getParameterAsString( DLCManager::e_DLCParamType_ThemeName ); + + if( m_selectedSkinPath.compare( m_currentSkinPath ) == 0 ) + { + setCharacterSelected(true); + } + + bSkinIsFree = skinFile->getParameterAsBool( DLCManager::e_DLCParamType_Free ); + bLicensed = m_currentPack->hasPurchasedFile( DLCManager::e_DLCType_Skin, m_selectedSkinPath ); + + setCharacterLocked(!(bSkinIsFree || bLicensed)); + + m_characters[eCharacter_Current].setVisible(true); + m_controlSkinNamePlate.setVisible( true ); + } + else + { + m_selectedSkinPath = L""; + m_selectedCapePath = L""; + m_vAdditionalSkinBoxes = NULL; + + switch(m_packIndex) + { + case SKIN_SELECT_PACK_DEFAULT: + backupTexture = getTextureId(m_skinIndex); + + if( m_skinIndex == eDefaultSkins_ServerSelected ) + { + skinName = app.GetString(IDS_DEFAULT_SKINS); + } + else + { + skinName = wchDefaultNamesA[m_skinIndex]; + } + + if( m_originalSkinId == m_skinIndex ) + { + setCharacterSelected(true); + } + setCharacterLocked(false); + setCharacterLocked(false); + + m_characters[eCharacter_Current].setVisible(true); + m_controlSkinNamePlate.setVisible( true ); + + break; + case SKIN_SELECT_PACK_FAVORITES: + + if(app.GetPlayerFavoriteSkinsCount(m_iPad)>0) + { + // get the pack number from the skin id + wchar_t chars[256]; + swprintf(chars, 256, L"dlcskin%08d.png", app.GetPlayerFavoriteSkin(m_iPad,m_skinIndex)); + + Pack=app.m_dlcManager.getPackContainingSkin(chars); + if(Pack) + { + skinFile = Pack->getSkinFile(chars); + + m_selectedSkinPath = skinFile->getPath(); + m_selectedCapePath = skinFile->getParameterAsString(DLCManager::e_DLCParamType_Cape); + m_vAdditionalSkinBoxes = skinFile->getAdditionalBoxes(); + + skinName = skinFile->getParameterAsString( DLCManager::e_DLCParamType_DisplayName ); + skinOrigin = skinFile->getParameterAsString( DLCManager::e_DLCParamType_ThemeName ); + + if( m_selectedSkinPath.compare( m_currentSkinPath ) == 0 ) + { + setCharacterSelected(true); + } + + bSkinIsFree = skinFile->getParameterAsBool( DLCManager::e_DLCParamType_Free ); + bLicensed = Pack->hasPurchasedFile( DLCManager::e_DLCType_Skin, m_selectedSkinPath ); + + setCharacterLocked(!(bSkinIsFree || bLicensed)); + m_controlSkinNamePlate.setVisible( true ); + } + else + { + setCharacterSelected(false); + setCharacterLocked(false); + } + } + else + { + //disable the display + m_characters[eCharacter_Current].setVisible(false); + + // change the tooltips + m_bNoSkinsToShow=true; + } + break; + } + } + + m_labelSkinName.setLabel(skinName); + m_labelSkinOrigin.setLabel(skinOrigin); + + + if(m_vAdditionalSkinBoxes && m_vAdditionalSkinBoxes->size()!=0) + { + // add the boxes to the humanoid model, but only if we've not done this already + + vector *pAdditionalModelParts = app.GetAdditionalModelParts(skinFile->getSkinID()); + if(pAdditionalModelParts==NULL) + { + pAdditionalModelParts = app.SetAdditionalSkinBoxes(skinFile->getSkinID(),m_vAdditionalSkinBoxes); + } + } + + if(skinFile!=NULL) + { + app.SetAnimOverrideBitmask(skinFile->getSkinID(),skinFile->getAnimOverrideBitmask()); + } + + m_characters[eCharacter_Current].SetTexture(m_selectedSkinPath, backupTexture); + m_characters[eCharacter_Current].SetCapeTexture(m_selectedCapePath); + + showNext = TRUE; + showPrevious = TRUE; + nextIndex = getNextSkinIndex(m_skinIndex); + previousIndex = getPreviousSkinIndex(m_skinIndex); + + wstring otherSkinPath = L""; + wstring otherCapePath = L""; + vector *othervAdditionalSkinBoxes=NULL; + wchar_t chars[256]; + + // turn off all displays + for(unsigned int i = eCharacter_Current + 1; i < eCharacter_COUNT; ++i) + { + m_characters[i].setVisible(false); + } + + unsigned int uiCurrentFavoriteC=app.GetPlayerFavoriteSkinsCount(m_iPad); + + if(m_packIndex==SKIN_SELECT_PACK_FAVORITES) + { + // might not be enough to cycle through + if(uiCurrentFavoriteC<((sidePreviewControls*2)+1)) + { + if(uiCurrentFavoriteC==0) + { + sidePreviewControlsL=sidePreviewControlsR=0; + } + // might be an odd number + else if((uiCurrentFavoriteC-1)%2==1) + { + sidePreviewControlsL=1+(uiCurrentFavoriteC-1)/2; + sidePreviewControlsR=(uiCurrentFavoriteC-1)/2; + } + else + { + sidePreviewControlsL=sidePreviewControlsR=(uiCurrentFavoriteC-1)/2; + } + } + else + { + sidePreviewControlsL=sidePreviewControlsR=sidePreviewControls; + } + } + else + { + sidePreviewControlsL=sidePreviewControlsR=sidePreviewControls; + } + + for(BYTE i = 0; i < sidePreviewControlsR; ++i) + { + if(showNext) + { + skinFile=NULL; + + m_characters[eCharacter_Next1 + i].setVisible(true); + + if( m_currentPack != NULL ) + { + skinFile = m_currentPack->getSkinFile(nextIndex); + otherSkinPath = skinFile->getPath(); + otherCapePath = skinFile->getParameterAsString(DLCManager::e_DLCParamType_Cape); + othervAdditionalSkinBoxes = skinFile->getAdditionalBoxes(); + backupTexture = TN_MOB_CHAR; + } + else + { + otherSkinPath = L""; + otherCapePath = L""; + othervAdditionalSkinBoxes=NULL; + switch(m_packIndex) + { + case SKIN_SELECT_PACK_DEFAULT: + backupTexture = getTextureId(nextIndex); + break; + case SKIN_SELECT_PACK_FAVORITES: + if(uiCurrentFavoriteC>0) + { + // get the pack number from the skin id + swprintf(chars, 256, L"dlcskin%08d.png", app.GetPlayerFavoriteSkin(m_iPad,nextIndex)); + + Pack=app.m_dlcManager.getPackContainingSkin(chars); + if(Pack) + { + skinFile = Pack->getSkinFile(chars); + + otherSkinPath = skinFile->getPath(); + otherCapePath = skinFile->getParameterAsString(DLCManager::e_DLCParamType_Cape); + othervAdditionalSkinBoxes = skinFile->getAdditionalBoxes(); + backupTexture = TN_MOB_CHAR; + } + } + break; + default: + break; + } + + } + if(othervAdditionalSkinBoxes && othervAdditionalSkinBoxes->size()!=0) + { + vector *pAdditionalModelParts = app.GetAdditionalModelParts(skinFile->getSkinID()); + if(pAdditionalModelParts==NULL) + { + pAdditionalModelParts = app.SetAdditionalSkinBoxes(skinFile->getSkinID(),othervAdditionalSkinBoxes); + } + } + // 4J-PB - anim override needs set before SetTexture + if(skinFile!=NULL) + { + app.SetAnimOverrideBitmask(skinFile->getSkinID(),skinFile->getAnimOverrideBitmask()); + } + m_characters[eCharacter_Next1 + i].SetTexture(otherSkinPath, backupTexture); + m_characters[eCharacter_Next1 + i].SetCapeTexture(otherCapePath); + } + + nextIndex = getNextSkinIndex(nextIndex); + } + + + + for(BYTE i = 0; i < sidePreviewControlsL; ++i) + { + if(showPrevious) + { + skinFile=NULL; + + m_characters[eCharacter_Previous1 + i].setVisible(true); + + if( m_currentPack != NULL ) + { + skinFile = m_currentPack->getSkinFile(previousIndex); + otherSkinPath = skinFile->getPath(); + otherCapePath = skinFile->getParameterAsString(DLCManager::e_DLCParamType_Cape); + othervAdditionalSkinBoxes = skinFile->getAdditionalBoxes(); + backupTexture = TN_MOB_CHAR; + } + else + { + otherSkinPath = L""; + otherCapePath = L""; + othervAdditionalSkinBoxes=NULL; + switch(m_packIndex) + { + case SKIN_SELECT_PACK_DEFAULT: + backupTexture = getTextureId(previousIndex); + break; + case SKIN_SELECT_PACK_FAVORITES: + if(uiCurrentFavoriteC>0) + { + // get the pack number from the skin id + swprintf(chars, 256, L"dlcskin%08d.png", app.GetPlayerFavoriteSkin(m_iPad,previousIndex)); + + Pack=app.m_dlcManager.getPackContainingSkin(chars); + if(Pack) + { + skinFile = Pack->getSkinFile(chars); + + otherSkinPath = skinFile->getPath(); + otherCapePath = skinFile->getParameterAsString(DLCManager::e_DLCParamType_Cape); + othervAdditionalSkinBoxes = skinFile->getAdditionalBoxes(); + backupTexture = TN_MOB_CHAR; + } + } + + break; + default: + break; + } + } + if(othervAdditionalSkinBoxes && othervAdditionalSkinBoxes->size()!=0) + { + vector *pAdditionalModelParts = app.GetAdditionalModelParts(skinFile->getSkinID()); + if(pAdditionalModelParts==NULL) + { + pAdditionalModelParts = app.SetAdditionalSkinBoxes(skinFile->getSkinID(),othervAdditionalSkinBoxes); + } + } + // 4J-PB - anim override needs set before SetTexture + if(skinFile) + { + app.SetAnimOverrideBitmask(skinFile->getSkinID(),skinFile->getAnimOverrideBitmask()); + } + m_characters[eCharacter_Previous1 + i].SetTexture(otherSkinPath, backupTexture); + m_characters[eCharacter_Previous1 + i].SetCapeTexture(otherCapePath); + } + + previousIndex = getPreviousSkinIndex(previousIndex); + } + + updateTooltips(); +} + +TEXTURE_NAME UIScene_SkinSelectMenu::getTextureId(int skinIndex) +{ + TEXTURE_NAME texture = TN_MOB_CHAR; + switch(skinIndex) + { + case eDefaultSkins_ServerSelected: + case eDefaultSkins_Skin0: + texture = TN_MOB_CHAR; + break; + case eDefaultSkins_Skin1: + texture = TN_MOB_CHAR1; + break; + case eDefaultSkins_Skin2: + texture = TN_MOB_CHAR2; + break; + case eDefaultSkins_Skin3: + texture = TN_MOB_CHAR3; + break; + case eDefaultSkins_Skin4: + texture = TN_MOB_CHAR4; + break; + case eDefaultSkins_Skin5: + texture = TN_MOB_CHAR5; + break; + case eDefaultSkins_Skin6: + texture = TN_MOB_CHAR6; + break; + case eDefaultSkins_Skin7: + texture = TN_MOB_CHAR7; + break; + }; + + return texture; +} + +int UIScene_SkinSelectMenu::getNextSkinIndex(DWORD sourceIndex) +{ + int nextSkin = sourceIndex; + + // special case for favourites + switch(m_packIndex) + { + + case SKIN_SELECT_PACK_FAVORITES: + ++nextSkin; + if(nextSkin>=app.GetPlayerFavoriteSkinsCount(m_iPad)) + { + nextSkin=0; + } + + break; + default: + ++nextSkin; + + if(m_packIndex == SKIN_SELECT_PACK_DEFAULT && nextSkin >= eDefaultSkins_Count) + { + nextSkin = eDefaultSkins_ServerSelected; + } + else if(m_currentPack != NULL && nextSkin>=m_currentPack->getSkinCount()) + { + nextSkin = 0; + } + break; + } + + + return nextSkin; +} + +int UIScene_SkinSelectMenu::getPreviousSkinIndex(DWORD sourceIndex) +{ + int previousSkin = sourceIndex; + switch(m_packIndex) + { + + case SKIN_SELECT_PACK_FAVORITES: + if(previousSkin==0) + { + previousSkin = app.GetPlayerFavoriteSkinsCount(m_iPad) - 1; + } + else + { + --previousSkin; + } + break; + default: + if(previousSkin==0) + { + if(m_packIndex == SKIN_SELECT_PACK_DEFAULT) + { + previousSkin = eDefaultSkins_Count - 1; + } + else if(m_currentPack != NULL) + { + previousSkin = m_currentPack->getSkinCount()-1; + } + } + else + { + --previousSkin; + } + break; + } + + + return previousSkin; +} + +void UIScene_SkinSelectMenu::handlePackIndexChanged() +{ + if(m_packIndex >= SKIN_SELECT_MAX_DEFAULTS) + { + m_currentPack = app.m_dlcManager.getPack(m_packIndex - SKIN_SELECT_MAX_DEFAULTS, DLCManager::e_DLCType_Skin); + } + else + { + m_currentPack = NULL; + } + m_skinIndex = 0; + if(m_currentPack != NULL) + { + bool found; + DWORD currentSkinIndex = m_currentPack->getSkinIndexAt(m_currentSkinPath, found); + if(found) m_skinIndex = currentSkinIndex; + } + else + { + switch(m_packIndex) + { + case SKIN_SELECT_PACK_DEFAULT: + if( !GET_IS_DLC_SKIN_FROM_BITMASK(m_originalSkinId) ) + { + DWORD ugcSkinIndex = GET_UGC_SKIN_ID_FROM_BITMASK(m_originalSkinId); + DWORD defaultSkinIndex = GET_DEFAULT_SKIN_ID_FROM_BITMASK(m_originalSkinId); + if( ugcSkinIndex == 0 ) + { + m_skinIndex = (EDefaultSkins) defaultSkinIndex; + } + } + break; + case SKIN_SELECT_PACK_FAVORITES: + if(app.GetPlayerFavoriteSkinsCount(m_iPad)>0) + { + bool found; + wchar_t chars[256]; + // get the pack number from the skin id + swprintf(chars, 256, L"dlcskin%08d.png", app.GetPlayerFavoriteSkin(m_iPad,app.GetPlayerFavoriteSkinsPos(m_iPad))); + + DLCPack *Pack=app.m_dlcManager.getPackContainingSkin(chars); + if(Pack) + { + DWORD currentSkinIndex = Pack->getSkinIndexAt(m_currentSkinPath, found); + if(found) m_skinIndex = app.GetPlayerFavoriteSkinsPos(m_iPad); + } + } + break; + default: + break; + } + } + handleSkinIndexChanged(); + updatePackDisplay(); +} + +void UIScene_SkinSelectMenu::updatePackDisplay() +{ + m_currentPackCount = app.m_dlcManager.getPackCount(DLCManager::e_DLCType_Skin) + SKIN_SELECT_MAX_DEFAULTS; + + if(m_packIndex >= SKIN_SELECT_MAX_DEFAULTS) + { + DLCPack *thisPack = app.m_dlcManager.getPack(m_packIndex - SKIN_SELECT_MAX_DEFAULTS, DLCManager::e_DLCType_Skin); + setCentreLabel(thisPack->getName().c_str()); + } + else + { + switch(m_packIndex) + { + case SKIN_SELECT_PACK_DEFAULT: + setCentreLabel(app.GetString(IDS_NO_SKIN_PACK)); + break; + case SKIN_SELECT_PACK_FAVORITES: + setCentreLabel(app.GetString(IDS_FAVORITES_SKIN_PACK)); + break; + } + } + + int nextPackIndex = getNextPackIndex(m_packIndex); + if(nextPackIndex >= SKIN_SELECT_MAX_DEFAULTS) + { + DLCPack *thisPack = app.m_dlcManager.getPack(nextPackIndex - SKIN_SELECT_MAX_DEFAULTS, DLCManager::e_DLCType_Skin); + setRightLabel(thisPack->getName().c_str()); + } + else + { + switch(nextPackIndex) + { + case SKIN_SELECT_PACK_DEFAULT: + setRightLabel(app.GetString(IDS_NO_SKIN_PACK)); + break; + case SKIN_SELECT_PACK_FAVORITES: + setRightLabel(app.GetString(IDS_FAVORITES_SKIN_PACK)); + break; + } + } + + int previousPackIndex = getPreviousPackIndex(m_packIndex); + if(previousPackIndex >= SKIN_SELECT_MAX_DEFAULTS) + { + DLCPack *thisPack = app.m_dlcManager.getPack(previousPackIndex - SKIN_SELECT_MAX_DEFAULTS, DLCManager::e_DLCType_Skin); + setLeftLabel(thisPack->getName().c_str()); + } + else + { + switch(previousPackIndex) + { + case SKIN_SELECT_PACK_DEFAULT: + setLeftLabel(app.GetString(IDS_NO_SKIN_PACK)); + break; + case SKIN_SELECT_PACK_FAVORITES: + setLeftLabel(app.GetString(IDS_FAVORITES_SKIN_PACK)); + break; + } + } + +} + +int UIScene_SkinSelectMenu::getNextPackIndex(DWORD sourceIndex) +{ + int nextPack = sourceIndex; + ++nextPack; + if(nextPack > app.m_dlcManager.getPackCount(DLCManager::e_DLCType_Skin) - 1 + SKIN_SELECT_MAX_DEFAULTS) + { + nextPack = SKIN_SELECT_PACK_DEFAULT; + } + + return nextPack; +} + +int UIScene_SkinSelectMenu::getPreviousPackIndex(DWORD sourceIndex) +{ + int previousPack = sourceIndex; + if (previousPack == SKIN_SELECT_PACK_DEFAULT) + { + DWORD packCount = app.m_dlcManager.getPackCount(DLCManager::e_DLCType_Skin); + + if (packCount > 0) + { + previousPack = packCount + SKIN_SELECT_MAX_DEFAULTS - 1; + } + else + { + previousPack = SKIN_SELECT_MAX_DEFAULTS - 1; + } + } + else + { + --previousPack; + } + + return previousPack; +} + +void UIScene_SkinSelectMenu::setCharacterSelected(bool selected) +{ + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_boolean; + value[0].boolval = selected; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetPlayerCharacterSelected , 1 , value ); +} + +void UIScene_SkinSelectMenu::setCharacterLocked(bool locked) +{ + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_boolean; + value[0].boolval = locked; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetCharacterLocked , 1 , value ); +} + +void UIScene_SkinSelectMenu::setLeftLabel(const wstring &label) +{ + if(label.compare(m_leftLabel) != 0) + { + m_leftLabel = label; + + IggyDataValue result; + IggyDataValue value[1]; + + IggyStringUTF16 stringVal; + stringVal.string = (IggyUTF16*)label.c_str(); + stringVal.length = label.length(); + + value[0].type = IGGY_DATATYPE_string_UTF16; + value[0].string16 = stringVal; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetLeftLabel , 1 , value ); + } +} + +void UIScene_SkinSelectMenu::setCentreLabel(const wstring &label) +{ + if(label.compare(m_centreLabel) != 0) + { + m_centreLabel = label; + + IggyDataValue result; + IggyDataValue value[1]; + + IggyStringUTF16 stringVal; + stringVal.string = (IggyUTF16*)label.c_str(); + stringVal.length = label.length(); + + value[0].type = IGGY_DATATYPE_string_UTF16; + value[0].string16 = stringVal; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetCentreLabel , 1 , value ); + } +} + +void UIScene_SkinSelectMenu::setRightLabel(const wstring &label) +{ + if(label.compare(m_rightLabel) != 0) + { + m_rightLabel = label; + + IggyDataValue result; + IggyDataValue value[1]; + + IggyStringUTF16 stringVal; + stringVal.string = (IggyUTF16*)label.c_str(); + stringVal.length = label.length(); + + value[0].type = IGGY_DATATYPE_string_UTF16; + value[0].string16 = stringVal; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetRightLabel , 1 , value ); + } +} + +#ifdef __PSVITA__ +void UIScene_SkinSelectMenu::handleTouchInput(unsigned int iPad, S32 x, S32 y, int iId, bool bPressed, bool bRepeat, bool bReleased) +{ + if(bPressed) + { + switch(iId) + { + case ETouchInput_TabLeft: + case ETouchInput_TabRight: + case ETouchInput_TabCenter: + // change to pack navigation if not already there! + if(m_currentNavigation != eSkinNavigation_Pack) + { + ui.PlayUISFX(eSFX_Scroll); + m_currentNavigation = eSkinNavigation_Pack; + sendInputToMovie(ACTION_MENU_UP, false, true, false); + } + break; + case ETouchInput_IggyCharacters: + if(m_packIndex == SKIN_SELECT_PACK_FAVORITES) + { + if(app.GetPlayerFavoriteSkinsCount(m_iPad)==0) + { + // ignore this, since there are no skins being displayed + break; + } + } + // change to skin navigation if not already there! + if(m_currentNavigation != eSkinNavigation_Skin) + { + ui.PlayUISFX(eSFX_Scroll); + m_currentNavigation = eSkinNavigation_Skin; + sendInputToMovie(ACTION_MENU_DOWN, false, true, false); + } + // remember touch x start + m_iTouchXStart = x; + m_bTouchScrolled = false; + break; + } + } + else if(bRepeat) + { + switch(iId) + { + case ETouchInput_TabLeft: + /* no action */ + break; + case ETouchInput_TabRight: + /* no action */ + break; + case ETouchInput_IggyCharacters: + if(m_currentNavigation != eSkinNavigation_Skin) + { + // not in skin select mode + break; + } + if(x < m_iTouchXStart - 50) + { + if(!m_bAnimatingMove && !m_bTouchScrolled) + { + ui.PlayUISFX(eSFX_Scroll); + m_skinIndex = getNextSkinIndex(m_skinIndex); + //handleSkinIndexChanged(); + + m_bSlidingSkins = true; + m_bAnimatingMove = true; + + m_characters[eCharacter_Current].SetFacing(UIControl_PlayerSkinPreview::e_SkinPreviewFacing_Right, true); + m_characters[eCharacter_Next1].SetFacing(UIControl_PlayerSkinPreview::e_SkinPreviewFacing_Forward, true); + + // 4J Stu - Swapped nav buttons + sendInputToMovie(ACTION_MENU_LEFT, false, true, false); + + m_bTouchScrolled = true; + } + } + else if(x > m_iTouchXStart + 50) + { + if(!m_bAnimatingMove && !m_bTouchScrolled) + { + ui.PlayUISFX(eSFX_Scroll); + + m_skinIndex = getPreviousSkinIndex(m_skinIndex); + //handleSkinIndexChanged(); + + m_bSlidingSkins = true; + m_bAnimatingMove = true; + + m_characters[eCharacter_Current].SetFacing(UIControl_PlayerSkinPreview::e_SkinPreviewFacing_Left, true); + m_characters[eCharacter_Previous1].SetFacing(UIControl_PlayerSkinPreview::e_SkinPreviewFacing_Forward, true); + + // 4J Stu - Swapped nav buttons + sendInputToMovie(ACTION_MENU_RIGHT, false, true, false); + + m_bTouchScrolled = true; + } + } + break; + } + } + else if(bReleased) + { + switch(iId) + { + case ETouchInput_TabLeft: + if( m_currentNavigation == eSkinNavigation_Pack ) + { + ui.PlayUISFX(eSFX_Scroll); + DWORD startingIndex = m_packIndex; + m_packIndex = getPreviousPackIndex(m_packIndex); + if(startingIndex != m_packIndex) + { + handlePackIndexChanged(); + } + } + break; + case ETouchInput_TabRight: + if( m_currentNavigation == eSkinNavigation_Pack ) + { + ui.PlayUISFX(eSFX_Scroll); + DWORD startingIndex = m_packIndex; + m_packIndex = getNextPackIndex(m_packIndex); + if(startingIndex != m_packIndex) + { + handlePackIndexChanged(); + } + } + break; + case ETouchInput_IggyCharacters: + if(!m_bTouchScrolled) + { + InputActionOK(iPad); + } + break; + } + } +} +#endif + +void UIScene_SkinSelectMenu::HandleDLCInstalled() +{ +#ifdef __PSVITA__ + EnterCriticalSection(&m_DLCInstallCS); // to prevent a race condition between the install and the mounted callback +#endif + + app.DebugPrintf(4,"UIScene_SkinSelectMenu::HandleDLCInstalled\n"); + // mounted DLC may have changed + if(app.StartInstallDLCProcess(m_iPad)==false) + { + // not doing a mount, so re-enable input + app.DebugPrintf(4,"UIScene_SkinSelectMenu::HandleDLCInstalled - not doing a mount, so re-enable input\n"); + m_bIgnoreInput=false; + } + else + { + m_bIgnoreInput=true; + m_controlTimer.setVisible( true ); + m_controlIggyCharacters.setVisible( false ); + m_controlSkinNamePlate.setVisible( false ); + } + + // this will send a CustomMessage_DLCMountingComplete when done + +#ifdef __PSVITA__ + LeaveCriticalSection(&m_DLCInstallCS); +#endif + +} + + +void UIScene_SkinSelectMenu::HandleDLCMountingComplete() +{ +#ifdef __PSVITA__ + EnterCriticalSection(&m_DLCInstallCS); // to prevent a race condition between the install and the mounted callback +#endif + app.DebugPrintf(4,"UIScene_SkinSelectMenu::HandleDLCMountingComplete\n"); + m_controlTimer.setVisible( false ); + m_controlIggyCharacters.setVisible( true ); + m_controlSkinNamePlate.setVisible( true ); + + m_packIndex = SKIN_SELECT_PACK_DEFAULT; + + if(app.m_dlcManager.getPackCount(DLCManager::e_DLCType_Skin)>0) + { + m_currentPack = app.m_dlcManager.getPackContainingSkin(m_currentSkinPath); + if(m_currentPack != NULL) + { + bool bFound = false; + m_packIndex = app.m_dlcManager.getPackIndex(m_currentPack,bFound,DLCManager::e_DLCType_Skin) + SKIN_SELECT_MAX_DEFAULTS; + } + } + + // If we have any favourites, set this to the favourites + // first validate the favorite skins - we might have uninstalled the DLC needed for them + app.ValidateFavoriteSkins(m_iPad); + + if(app.GetPlayerFavoriteSkinsCount(m_iPad)>0) + { + m_packIndex = SKIN_SELECT_PACK_FAVORITES; + } + + handlePackIndexChanged(); + + m_bIgnoreInput=false; + app.m_dlcManager.checkForCorruptDLCAndAlert(); + bool bInGame=(Minecraft::GetInstance()->level!=NULL); + +#if TO_BE_IMPLEMENTED + if(bInGame) XBackgroundDownloadSetMode(XBACKGROUND_DOWNLOAD_MODE_AUTO); +#endif +#ifdef __PSVITA__ + LeaveCriticalSection(&m_DLCInstallCS); +#endif +} + +void UIScene_SkinSelectMenu::showNotOnlineDialog(int iPad) +{ + // need to be signed in to live. get them to sign in to online +#if defined(__PS3__) + SQRNetworkManager_PS3::AttemptPSNSignIn(NULL, this); + +#elif defined(__PSVITA__) + 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); + +#elif defined(_DURANGO) + + UINT uiIDA[1] = { IDS_CONFIRM_OK }; + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1, iPad ); + +#endif +} + +int UIScene_SkinSelectMenu::UnlockSkinReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + UIScene_SkinSelectMenu* pScene = (UIScene_SkinSelectMenu*)pParam; + + if ( (result == C4JStorage::EMessage_ResultAccept) + && ProfileManager.IsSignedIn(iPad) + ) + { + if (ProfileManager.IsSignedInLive(iPad)) + { +#if defined(__PS3__) || defined(__ORBIS__) || defined __PSVITA__ + // need to get info on the pack to see if the user has already downloaded it + + // retrieve the store name for the skin pack + wstring wStrPackName=pScene->m_currentPack->getName(); + const char *pchPackName=wstringtofilename(wStrPackName); + SONYDLC *pSONYDLCInfo=app.GetSONYDLCInfo((char *)pchPackName); + + if (pSONYDLCInfo != NULL) + { + char chName[42]; + char chKeyName[20]; + char chSkuID[SCE_NP_COMMERCE2_SKU_ID_LEN]; + + memset(chSkuID,0,SCE_NP_COMMERCE2_SKU_ID_LEN); + // find the info on the skin pack + // we have to retrieve the skuid from the store info, it can't be hardcoded since Sony may change it. + // So we assume the first sku for the product is the one we want + + // while the store is screwed, hardcode the sku + //sprintf(chName,"%s-%s-%s",app.GetCommerceCategory(),pSONYDLCInfo->chDLCKeyname,"EURO"); + + // MGH - keyname in the DLC file is 16 chars long, but there's no space for a NULL terminating char + memset(chKeyName, 0, sizeof(chKeyName)); + strncpy(chKeyName, pSONYDLCInfo->chDLCKeyname, 16); + +#ifdef __ORBIS__ + strcpy(chName, chKeyName); +#else + sprintf(chName,"%s-%s",app.GetCommerceCategory(),chKeyName); +#endif + app.GetDLCSkuIDFromProductList(chName,chSkuID); + +#if defined __ORBIS__ || defined __PSVITA__ || defined __PS3__ + if (app.CheckForEmptyStore(iPad) == false) +#endif + { + if (app.DLCAlreadyPurchased(chSkuID)) + { + app.DebugPrintf("Already purchased this DLC - DownloadAlreadyPurchased \n"); + app.DownloadAlreadyPurchased(chSkuID); + } + else + { + app.DebugPrintf("Not yet purchased this DLC - Checkout \n"); + app.Checkout(chSkuID); + } + } + } + // need to re-enable input because the user can back out of the store purchase, and we'll be stuck + pScene->m_bIgnoreInput = false; // 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 + } + else // Is signed in, but not live. + { + pScene->showNotOnlineDialog(iPad); + pScene->m_bIgnoreInput = false; + } + } + else + { + pScene->m_bIgnoreInput = false; + } + + return 0; +} + +int UIScene_SkinSelectMenu::RenableInput(LPVOID lpVoid, int, int) +{ + ((UIScene_SkinSelectMenu*) lpVoid)->m_bIgnoreInput = false; + return 0; +} + +void UIScene_SkinSelectMenu::AddFavoriteSkin(int iPad,int iSkinID) +{ + // Is this favorite skin already in the array? + unsigned int uiCurrentFavoriteSkinsCount=app.GetPlayerFavoriteSkinsCount(iPad); + + for(int i=0;i0) + { + ucPos++; + } + else + { + ucPos=0; + } + } + + app.SetPlayerFavoriteSkin(iPad,(int)ucPos,iSkinID); + app.SetPlayerFavoriteSkinsPos(m_iPad,ucPos); +} + + +void UIScene_SkinSelectMenu::handleReload() +{ + // Reinitialise a few values to prevent problems on reload + m_bIgnoreInput=false; + + m_currentNavigation = eSkinNavigation_Skin; + m_currentPackCount = 0; + + m_labelSkinName.init(L""); + m_labelSkinOrigin.init(L""); + + m_leftLabel = L""; + m_centreLabel = L""; + m_rightLabel = L""; + + handlePackIndexChanged(); +} + +#ifdef _XBOX_ONE +void UIScene_SkinSelectMenu::HandleDLCLicenseChange() +{ + // update the lock flag + handleSkinIndexChanged(); +} +#endif + + + + +#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 new file mode 100644 index 00000000..e8d76096 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_SkinSelectMenu.h @@ -0,0 +1,195 @@ +#pragma once +#include "..\..\..\Minecraft.World\Definitions.h" +#include "UIScene.h" +#include "UIControl_PlayerSkinPreview.h" + +class UIScene_SkinSelectMenu : public UIScene +{ +private: + static WCHAR *wchDefaultNamesA[eDefaultSkins_Count]; + + // 4J Stu - How many to show on each side of the main control + static const BYTE sidePreviewControls = 4; + +#ifdef __PSVITA__ + enum ETouchInput + { + ETouchInput_TabLeft = 10, + ETouchInput_TabRight, + ETouchInput_TabCenter, + ETouchInput_IggyCharacters, + + ETouchInput_Count, + }; +#endif + + enum ESkinSelectNavigation + { + eSkinNavigation_Pack, + eSkinNavigation_Skin, + + eSkinNavigation_Count, + }; + + enum ECharacters + { + eCharacter_Current, + eCharacter_Next1, + eCharacter_Next2, + eCharacter_Next3, + eCharacter_Next4, + eCharacter_Previous1, + eCharacter_Previous2, + eCharacter_Previous3, + eCharacter_Previous4, + + eCharacter_COUNT, + }; + + UIControl_PlayerSkinPreview m_characters[eCharacter_COUNT]; + UIControl_Label m_labelSkinName, m_labelSkinOrigin; + UIControl_Label m_labelSelected; + UIControl m_controlSkinNamePlate, m_controlSelectedPanel, m_controlIggyCharacters, m_controlTimer; +#ifdef __PSVITA__ + UIControl_Touch m_TouchTabLeft, m_TouchTabRight, m_TouchTabCenter, m_TouchIggyCharacters; +#endif + IggyName m_funcSetPlayerCharacterSelected, m_funcSetCharacterLocked; + IggyName m_funcSetLeftLabel, m_funcSetRightLabel, m_funcSetCentreLabel; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) +#ifdef __PSVITA__ + UI_MAP_ELEMENT( m_TouchTabLeft, "TouchTabLeft" ) + UI_MAP_ELEMENT( m_TouchTabRight, "TouchTabRight" ) + UI_MAP_ELEMENT( m_TouchTabCenter, "TouchTabCenter" ) + UI_MAP_ELEMENT( m_TouchIggyCharacters, "TouchIggyCharacters" ) +#endif + UI_MAP_ELEMENT( m_controlSkinNamePlate, "SkinNamePlate") + UI_BEGIN_MAP_CHILD_ELEMENTS( m_controlSkinNamePlate ) + UI_MAP_ELEMENT( m_labelSkinName, "SkinTitle1") + UI_MAP_ELEMENT( m_labelSkinOrigin, "SkinTitle2") + UI_END_MAP_CHILD_ELEMENTS() + + UI_MAP_ELEMENT( m_controlSelectedPanel, "SelectedPanel" ) + UI_BEGIN_MAP_CHILD_ELEMENTS( m_controlSelectedPanel ) + UI_MAP_ELEMENT( m_labelSelected, "SelectedPanelLabel" ) + UI_END_MAP_CHILD_ELEMENTS() + + UI_MAP_ELEMENT( m_controlTimer, "Timer" ) + + // 4J Stu - These aren't really used a AS3 controls, but adding here means that they get ticked by the scene + UI_MAP_ELEMENT( m_controlIggyCharacters, "IggyCharacters" ) + UI_BEGIN_MAP_CHILD_ELEMENTS( m_controlIggyCharacters ) + UI_MAP_ELEMENT( m_characters[eCharacter_Current], "iggy_Character0" ) + + UI_MAP_ELEMENT( m_characters[eCharacter_Next1], "iggy_Character1" ) + UI_MAP_ELEMENT( m_characters[eCharacter_Next2], "iggy_Character2" ) + UI_MAP_ELEMENT( m_characters[eCharacter_Next3], "iggy_Character3" ) + UI_MAP_ELEMENT( m_characters[eCharacter_Next4], "iggy_Character4" ) + + UI_MAP_ELEMENT( m_characters[eCharacter_Previous1], "iggy_Character5" ) + UI_MAP_ELEMENT( m_characters[eCharacter_Previous2], "iggy_Character6" ) + UI_MAP_ELEMENT( m_characters[eCharacter_Previous3], "iggy_Character7" ) + UI_MAP_ELEMENT( m_characters[eCharacter_Previous4], "iggy_Character8" ) + UI_END_MAP_CHILD_ELEMENTS() + + UI_MAP_NAME( m_funcSetPlayerCharacterSelected, L"SetPlayerCharacterSelected" ) + UI_MAP_NAME( m_funcSetCharacterLocked, L"SetCharacterLocked" ) + + UI_MAP_NAME( m_funcSetLeftLabel, L"SetLeftLabel" ) + UI_MAP_NAME( m_funcSetCentreLabel, L"SetCenterLabel" ) + UI_MAP_NAME( m_funcSetRightLabel, L"SetRightLabel" ) + UI_END_MAP_ELEMENTS_AND_NAMES() + + DLCPack *m_currentPack; + DWORD m_packIndex, m_skinIndex; + DWORD m_originalSkinId; + wstring m_currentSkinPath, m_selectedSkinPath, m_selectedCapePath; + vector *m_vAdditionalSkinBoxes; + + bool m_bSlidingSkins, m_bAnimatingMove; + ESkinSelectNavigation m_currentNavigation; + + bool m_bNoSkinsToShow; + DWORD m_currentPackCount; + bool m_bIgnoreInput; + bool m_bSkinIndexChanged; + wstring m_leftLabel, m_centreLabel, m_rightLabel; + + S32 m_iTouchXStart; + bool m_bTouchScrolled; +public: + UIScene_SkinSelectMenu(int iPad, void *initData, UILayer *parentLayer); +#ifdef __PSVITA__ + virtual ~UIScene_SkinSelectMenu() { DeleteCriticalSection(&m_DLCInstallCS); } +#endif + + virtual void tick(); + + virtual void updateTooltips(); + virtual void updateComponents(); + + virtual EUIScene getSceneType() { return eUIScene_SkinSelectMenu;} + + virtual void handleAnimationEnd(); + + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + + virtual void customDraw(IggyCustomDrawCallbackRegion *region); + +private: + void handleSkinIndexChanged(); + int getNextSkinIndex(DWORD sourceIndex); + int getPreviousSkinIndex(DWORD sourceIndex); + + TEXTURE_NAME getTextureId(int skinIndex); + + void handlePackIndexChanged(); + void updatePackDisplay(); + int getNextPackIndex(DWORD sourceIndex); + int getPreviousPackIndex(DWORD sourceIndex); + + void setCharacterSelected(bool selected); + void setCharacterLocked(bool locked); + + void setLeftLabel(const wstring &label); + void setCentreLabel(const wstring &label); + void setRightLabel(const wstring &label); + + virtual void HandleDLCMountingComplete(); + virtual void HandleDLCInstalled(); +#ifdef _XBOX_ONE + virtual void HandleDLCLicenseChange(); +#endif + + void showNotOnlineDialog(int iPad); + + static int UnlockSkinReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int RenableInput(LPVOID lpVoid, int, int); + void AddFavoriteSkin(int iPad,int iSkinID); + + void InputActionOK(unsigned int iPad); +#ifdef __PSVITA__ + virtual void handleTouchInput(unsigned int iPad, S32 x, S32 y, int iId, bool bPressed, bool bRepeat, bool bReleased); +#endif //__PSVITA__ + virtual void handleReload(); + +#ifdef __ORBIS__ + bool m_bErrorDialogRunning; +#endif + +#ifdef __PSVITA__ + 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_TeleportMenu.cpp b/Minecraft.Client/Common/UI/UIScene_TeleportMenu.cpp new file mode 100644 index 00000000..f6916d13 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_TeleportMenu.cpp @@ -0,0 +1,344 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_TeleportMenu.h" +#include "..\..\MultiPlayerLocalPlayer.h" +#include "..\..\..\Minecraft.World\net.minecraft.network.packet.h" +#include "..\..\MultiPlayerLocalPlayer.h" +#include "..\..\ClientConnection.h" +#include "TeleportCommand.h" + +UIScene_TeleportMenu::UIScene_TeleportMenu(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + TeleportMenuInitData *initParam = (TeleportMenuInitData *)initData; + + m_teleportToPlayer = initParam->teleportToPlayer; + + delete initParam; + + if(m_teleportToPlayer) + { + m_labelTitle.init(app.GetString(IDS_TELEPORT_TO_PLAYER)); + } + else + { + m_labelTitle.init(app.GetString(IDS_TELEPORT_TO_ME)); + } + + m_playerList.init(eControl_GamePlayers); + + for(unsigned int i = 0; i < MINECRAFT_NET_MAX_PLAYERS; ++i) + { + m_playerNames[i] = L""; + } + + DWORD playerCount = g_NetworkManager.GetPlayerCount(); + + m_playersCount = 0; + for(DWORD i = 0; i < playerCount; ++i) + { + INetworkPlayer *player = g_NetworkManager.GetPlayerByIndex( i ); + + if( player != NULL && !(player->IsLocal() && player->GetUserIndex() == m_iPad) ) + { + m_players[m_playersCount] = player->GetSmallId(); + ++m_playersCount; + + wstring playerName = L""; +#ifndef _CONTENT_PACKAGE + if(app.DebugSettingsOn() && (app.GetGameSettingsDebugMask()&(1L<GetDisplayName(); + } + + int voiceStatus = 0; + if(player != NULL && player->HasVoice() ) + { + if( player->IsMutedByLocalUser(m_iPad) ) + { + // Muted image + voiceStatus = 3; + } + else if( player->IsTalking() ) + { + // Talking image + voiceStatus = 2; + } + else + { + // Not talking image + voiceStatus = 1; + } + } + + m_playersVoiceState[m_playersCount] = voiceStatus; + m_playersColourState[m_playersCount] = app.GetPlayerColour( m_players[m_playersCount] ); + m_playerNames[m_playersCount] = playerName; + m_playerList.addItem( playerName, app.GetPlayerColour( m_players[m_playersCount] ), voiceStatus); + } + } + + g_NetworkManager.RegisterPlayerChangedCallback(m_iPad, &UIScene_TeleportMenu::OnPlayerChanged, this); + + parentLayer->addComponent(iPad,eUIComponent_MenuBackground); + + // get rid of the quadrant display if it's on + ui.HidePressStart(); +} + +wstring UIScene_TeleportMenu::getMoviePath() +{ + if(app.GetLocalPlayerCount() > 1) + { + return L"InGameTeleportMenuSplit"; + } + else + { + return L"InGameTeleportMenu"; + } +} + +void UIScene_TeleportMenu::updateTooltips() +{ + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); +} + +void UIScene_TeleportMenu::handleDestroy() +{ + g_NetworkManager.UnRegisterPlayerChangedCallback(m_iPad, &UIScene_TeleportMenu::OnPlayerChanged, this); + + m_parentLayer->removeComponent(eUIComponent_MenuBackground); +} + +void UIScene_TeleportMenu::handleGainFocus(bool navBack) +{ + if( navBack ) g_NetworkManager.RegisterPlayerChangedCallback(m_iPad, &UIScene_TeleportMenu::OnPlayerChanged, this); +} + +void UIScene_TeleportMenu::handleReload() +{ + DWORD playerCount = g_NetworkManager.GetPlayerCount(); + + m_playersCount = 0; + for(DWORD i = 0; i < playerCount; ++i) + { + INetworkPlayer *player = g_NetworkManager.GetPlayerByIndex( i ); + + if( player != NULL && !(player->IsLocal() && player->GetUserIndex() == m_iPad) ) + { + m_players[m_playersCount] = player->GetSmallId(); + ++m_playersCount; + + wstring playerName = L""; +#ifndef _CONTENT_PACKAGE + if(app.DebugSettingsOn() && (app.GetGameSettingsDebugMask()&(1L<GetDisplayName(); + } + + int voiceStatus = 0; + if(player != NULL && player->HasVoice() ) + { + if( player->IsMutedByLocalUser(m_iPad) ) + { + // Muted image + voiceStatus = 3; + } + else if( player->IsTalking() ) + { + // Talking image + voiceStatus = 2; + } + else + { + // Not talking image + voiceStatus = 1; + } + } + + m_playersVoiceState[m_playersCount] = voiceStatus; + m_playersColourState[m_playersCount] = app.GetPlayerColour( m_players[m_playersCount] ); + m_playerNames[m_playersCount] = playerName; + m_playerList.addItem( playerName, app.GetPlayerColour( m_players[m_playersCount] ), voiceStatus); + } + } + + if(controlHasFocus(eControl_GamePlayers)) + { + m_playerList.setCurrentSelection(getControlChildFocus()); + } +} + +void UIScene_TeleportMenu::tick() +{ + UIScene::tick(); + + for(DWORD i = 0; i < m_playersCount; ++i) + { + INetworkPlayer *player = g_NetworkManager.GetPlayerBySmallId( m_players[i] ); + + if( player != NULL ) + { + m_players[i] = player->GetSmallId(); + + short icon = app.GetPlayerColour( m_players[i] ); + + if(icon != m_playersColourState[i]) + { + m_playersColourState[i] = icon; + m_playerList.setPlayerIcon( i, (int)app.GetPlayerColour( m_players[i] ) ); + } + + wstring playerName = L""; +#ifndef _CONTENT_PACKAGE + if(app.DebugSettingsOn() && (app.GetGameSettingsDebugMask()&(1L<GetDisplayName(); + } + if(playerName.compare( m_playerNames[i] ) != 0 ) + { + m_playerList.setButtonLabel(i, playerName); + m_playerNames[i] = playerName; + } + } + } +} + +void UIScene_TeleportMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + //app.DebugPrintf("UIScene_DebugOverlay handling input for pad %d, key %d, down- %s, pressed- %s, released- %s\n", iPad, key, down?"TRUE":"FALSE", pressed?"TRUE":"FALSE", released?"TRUE":"FALSE"); + ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); + + switch(key) + { + case ACTION_MENU_CANCEL: + if(pressed && !repeat) + { + ui.PlayUISFX(eSFX_Back); + navigateBack(); + } + break; + case ACTION_MENU_OK: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + case ACTION_MENU_PAGEUP: + case ACTION_MENU_PAGEDOWN: + sendInputToMovie(key, repeat, pressed, released); + break; + } +} + +void UIScene_TeleportMenu::handlePress(F64 controlId, F64 childId) +{ + app.DebugPrintf("Pressed = %d, %d\n", (int)controlId, (int)childId); + switch((int)controlId) + { + case eControl_GamePlayers: + int currentSelection = (int)childId; + INetworkPlayer *selectedPlayer = g_NetworkManager.GetPlayerBySmallId( m_players[ currentSelection ] ); + INetworkPlayer *thisPlayer = g_NetworkManager.GetLocalPlayerByUserIndex(m_iPad); + + shared_ptr packet; + if(m_teleportToPlayer) + { + packet = TeleportCommand::preparePacket(thisPlayer->GetUID(),selectedPlayer->GetUID()); + } + else + { + packet = TeleportCommand::preparePacket(selectedPlayer->GetUID(),thisPlayer->GetUID()); + } + ClientConnection *conn = Minecraft::GetInstance()->getConnection(m_iPad); + conn->send( packet ); + break; + } +} + +void UIScene_TeleportMenu::OnPlayerChanged(void *callbackParam, INetworkPlayer *pPlayer, bool leaving) +{ + UIScene_TeleportMenu *scene = (UIScene_TeleportMenu *)callbackParam; + bool playerFound = false; + int foundIndex = 0; + for(int i = 0; i < scene->m_playersCount; ++i) + { + if(!playerFound && scene->m_players[i] == pPlayer->GetSmallId() ) + { + if( scene->m_playerList.getCurrentSelection() == scene->m_playerList.getItemCount() - 1 ) + { + scene->m_playerList.setCurrentSelection( scene->m_playerList.getItemCount() - 2 ); + } + // Player removed + playerFound = true; + foundIndex = i; + } + } + + if( playerFound ) + { + --scene->m_playersCount; + scene->m_playersVoiceState[scene->m_playersCount] = 0; + scene->m_playersColourState[scene->m_playersCount] = 0; + scene->m_playerNames[scene->m_playersCount] = L""; + scene->m_playerList.removeItem(scene->m_playersCount); + } + + if( !playerFound ) + { + // Player added + scene->m_players[scene->m_playersCount] = pPlayer->GetSmallId(); + ++scene->m_playersCount; + + wstring playerName = L""; +#ifndef _CONTENT_PACKAGE + if(app.DebugSettingsOn() && (app.GetGameSettingsDebugMask()&(1L<GetDisplayName(); + } + + int voiceStatus = 0; + if(pPlayer != NULL && pPlayer->HasVoice() ) + { + if( pPlayer->IsMutedByLocalUser(scene->m_iPad) ) + { + // Muted image + voiceStatus = 3; + } + else if( pPlayer->IsTalking() ) + { + // Talking image + voiceStatus = 2; + } + else + { + // Not talking image + voiceStatus = 1; + } + } + + scene->m_playerList.addItem( playerName, app.GetPlayerColour( scene->m_players[scene->m_playersCount - 1] ), voiceStatus); + } +} diff --git a/Minecraft.Client/Common/UI/UIScene_TeleportMenu.h b/Minecraft.Client/Common/UI/UIScene_TeleportMenu.h new file mode 100644 index 00000000..ebbaa2a0 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_TeleportMenu.h @@ -0,0 +1,51 @@ +#pragma once + +#include "UIScene.h" + +class UIScene_TeleportMenu : public UIScene +{ +private: + enum EControls + { + eControl_GamePlayers, + }; + + bool m_teleportToPlayer; + int m_playersCount; + BYTE m_players[MINECRAFT_NET_MAX_PLAYERS]; // An array of QNet small-id's + char m_playersVoiceState[MINECRAFT_NET_MAX_PLAYERS]; + short m_playersColourState[MINECRAFT_NET_MAX_PLAYERS]; + wstring m_playerNames[MINECRAFT_NET_MAX_PLAYERS]; + + UIControl_PlayerList m_playerList; + UIControl_Label m_labelTitle; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_playerList, "GamePlayers") + UI_MAP_ELEMENT( m_labelTitle, "Title") + UI_END_MAP_ELEMENTS_AND_NAMES() +public: + UIScene_TeleportMenu(int iPad, void *initData, UILayer *parentLayer); + + virtual EUIScene getSceneType() { return eUIScene_TeleportMenu;} + + virtual void updateTooltips(); + virtual void handleReload(); + + virtual void tick(); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + +protected: + virtual void handleGainFocus(bool navBack); + void handlePress(F64 controlId, F64 childId); + virtual void handleDestroy(); + +public: + static void OnPlayerChanged(void *callbackParam, INetworkPlayer *pPlayer, bool leaving); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_Timer.cpp b/Minecraft.Client/Common/UI/UIScene_Timer.cpp new file mode 100644 index 00000000..3dec20a3 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_Timer.cpp @@ -0,0 +1,32 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_Timer.h" + + +UIScene_Timer::UIScene_Timer(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + // In normal usage, we want to hide the new background that's used during texture pack reloading + if(initData == 0) + { + m_controlBackground.setVisible(false); + } +} + +wstring UIScene_Timer::getMoviePath() +{ + return L"Timer"; +} + +void UIScene_Timer::reloadMovie(bool force) +{ + // Never needs reloaded +} + +bool UIScene_Timer::needsReloaded() +{ + // Never needs reloaded + return false; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_Timer.h b/Minecraft.Client/Common/UI/UIScene_Timer.h new file mode 100644 index 00000000..ef6aae94 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_Timer.h @@ -0,0 +1,28 @@ +#pragma once + +#include "UIScene.h" + +class UIScene_Timer : public UIScene +{ +private: + UIControl m_controlBackground; + + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT(m_controlBackground,"Background") + UI_END_MAP_ELEMENTS_AND_NAMES() + +public: + using UIScene::reloadMovie; + + UIScene_Timer(int iPad, void *initData, UILayer *parentLayer); + + virtual EUIScene getSceneType() { return eUIScene_Timer;} + + // Returns true if lower scenes in this scenes layer, or in any layer below this scenes layers should be hidden + virtual bool hidesLowerScenes() { return true; } + virtual void reloadMovie(bool force); + virtual bool needsReloaded(); + +protected: + virtual wstring getMoviePath(); +}; diff --git a/Minecraft.Client/Common/UI/UIScene_TradingMenu.cpp b/Minecraft.Client/Common/UI/UIScene_TradingMenu.cpp new file mode 100644 index 00000000..0a35c8e5 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_TradingMenu.cpp @@ -0,0 +1,295 @@ +#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" +#include "..\..\Minecraft.h" +#include "UIScene_TradingMenu.h" + +UIScene_TradingMenu::UIScene_TradingMenu(int iPad, void *_initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + m_showingLeftArrow = true; + m_showingRightArrow = true; + + // 4J-PB - "Villager" appears for a short time on opening the trading menu + //m_labelTrading.init( app.GetString(IDS_VILLAGER) ); + m_labelTrading.init( L"" ); + m_labelInventory.init( app.GetString(IDS_INVENTORY) ); + m_labelRequired.init( app.GetString(IDS_REQUIRED_ITEMS_FOR_TRADE) ); + + m_labelRequest1.init(L""); + m_labelRequest2.init(L""); + + TradingScreenInput *initData = (TradingScreenInput *)_initData; + m_merchant = initData->trader; + + Minecraft *pMinecraft = Minecraft::GetInstance(); + if( pMinecraft->localgameModes[iPad] != NULL ) + { + TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[iPad]; + m_previousTutorialState = gameMode->getTutorial()->getCurrentState(); + gameMode->getTutorial()->changeTutorialState(e_Tutorial_State_Trading_Menu, this); + } + + m_menu = new MerchantMenu( initData->inventory, initData->trader, initData->level ); + + Minecraft::GetInstance()->localplayers[iPad]->containerMenu = m_menu; + + m_slotListRequest1.addSlots(BUY_A,1); + m_slotListRequest2.addSlots(BUY_B,1); + + m_slotListTrades.addSlots(TRADES_START,DISPLAY_TRADES_COUNT); + + m_slotListInventory.addSlots(MerchantMenu::INV_SLOT_START, 27); + m_slotListHotbar.addSlots(MerchantMenu::USE_ROW_SLOT_START, 9); + + if(initData) delete initData; + + // in this scene, we override the press sound with our own for crafting success or fail + ui.OverrideSFX(m_iPad,ACTION_MENU_A,true); + ui.OverrideSFX(m_iPad,ACTION_MENU_OK,true); +#ifdef __ORBIS__ + ui.OverrideSFX(m_iPad,ACTION_MENU_TOUCHPAD_PRESS,true); +#endif + ui.OverrideSFX(m_iPad,ACTION_MENU_LEFT_SCROLL,true); + ui.OverrideSFX(m_iPad,ACTION_MENU_RIGHT_SCROLL,true); + ui.OverrideSFX(m_iPad,ACTION_MENU_LEFT,true); + ui.OverrideSFX(m_iPad,ACTION_MENU_RIGHT,true); + ui.OverrideSFX(m_iPad,ACTION_MENU_UP,true); + ui.OverrideSFX(m_iPad,ACTION_MENU_DOWN,true); + + app.SetRichPresenceContext(iPad, CONTEXT_GAME_STATE_TRADING); +} + +wstring UIScene_TradingMenu::getMoviePath() +{ + if(app.GetLocalPlayerCount() > 1) + { + return L"TradingMenuSplit"; + } + else + { + return L"TradingMenu"; + } +} + +void UIScene_TradingMenu::updateTooltips() +{ + ui.SetTooltips(m_iPad, IDS_TOOLTIPS_TRADE, IDS_TOOLTIPS_BACK); +} + +void UIScene_TradingMenu::handleDestroy() +{ + app.DebugPrintf("UIScene_TradingMenu::handleDestroy\n"); + Minecraft *pMinecraft = Minecraft::GetInstance(); + if( pMinecraft->localgameModes[m_iPad] != NULL ) + { + TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[m_iPad]; + if(gameMode != NULL) gameMode->getTutorial()->changeTutorialState(m_previousTutorialState); + } + + // 4J Stu - Fix for #11302 - TCR 001: Network Connectivity: Host crashed after being killed by the client while accessing a chest during burst packet loss. + // We need to make sure that we call closeContainer() anytime this menu is closed, even if it is forced to close by some other reason (like the player dying) + if(pMinecraft->localplayers[m_iPad] != NULL) pMinecraft->localplayers[m_iPad]->closeContainer(); + + ui.OverrideSFX(m_iPad,ACTION_MENU_A,false); + ui.OverrideSFX(m_iPad,ACTION_MENU_OK,false); +#ifdef __ORBIS__ + ui.OverrideSFX(m_iPad,ACTION_MENU_TOUCHPAD_PRESS,false); +#endif + ui.OverrideSFX(m_iPad,ACTION_MENU_LEFT_SCROLL,false); + ui.OverrideSFX(m_iPad,ACTION_MENU_RIGHT_SCROLL,false); + ui.OverrideSFX(m_iPad,ACTION_MENU_LEFT,false); + ui.OverrideSFX(m_iPad,ACTION_MENU_RIGHT,false); + ui.OverrideSFX(m_iPad,ACTION_MENU_UP,false); + ui.OverrideSFX(m_iPad,ACTION_MENU_DOWN,false); +} + +void UIScene_TradingMenu::handleReload() +{ + m_slotListRequest1.addSlots(BUY_A,1); + m_slotListRequest2.addSlots(BUY_B,1); + + m_slotListTrades.addSlots(TRADES_START,DISPLAY_TRADES_COUNT); + + m_slotListInventory.addSlots(MerchantMenu::INV_SLOT_START, 27); + m_slotListHotbar.addSlots(MerchantMenu::USE_ROW_SLOT_START, 9); + + 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() +{ + UIScene::tick(); + handleTick(); +} + +void UIScene_TradingMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + //app.DebugPrintf("UIScene_InventoryMenu handling input for pad %d, key %d, down- %s, pressed- %s, released- %s\n", iPad, key, down?"TRUE":"FALSE", pressed?"TRUE":"FALSE", released?"TRUE":"FALSE"); + ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); + + switch(key) + { + default: + if(pressed) + { + handled = handleKeyDown(m_iPad, key, repeat); + } + break; + }; +} + +void UIScene_TradingMenu::customDraw(IggyCustomDrawCallbackRegion *region) +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + if(pMinecraft->localplayers[m_iPad] == NULL || pMinecraft->localgameModes[m_iPad] == NULL) return; + + shared_ptr item = nullptr; + int slotId = -1; + swscanf((wchar_t*)region->name,L"slot_%d",&slotId); + + if(slotId < MerchantMenu::USE_ROW_SLOT_END) + { + Slot *slot = m_menu->getSlot(slotId); + item = slot->getItem(); + } + else if(slotId >= TRADES_START) + { + int tradeId = (slotId - TRADES_START) + m_offersStartIndex; + if(tradeId < m_activeOffers.size()) + { + item = m_activeOffers.at(tradeId).first->getSellItem(); + } + } + else + { + int tradeId = m_selectedSlot + m_offersStartIndex; + if( tradeId < m_activeOffers.size() ) + { + switch(slotId) + { + case BUY_A: + item = m_activeOffers.at(tradeId).first->getBuyAItem(); + break; + case BUY_B: + item = m_activeOffers.at(tradeId).first->getBuyBItem(); + break; + }; + } + } + if(item != NULL) customDrawSlotControl(region,m_iPad,item,1.0f,item->isFoil(),true); +} + +void UIScene_TradingMenu::showScrollRightArrow(bool show) +{ + if(m_showingRightArrow != show) + { + IggyDataValue result; + IggyDataValue value[1]; + + value[0].type = IGGY_DATATYPE_boolean; + value[0].boolval = show; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcShowScrollRightArrow , 1 , value ); + + m_showingRightArrow = show; + } +} + +void UIScene_TradingMenu::showScrollLeftArrow(bool show) +{ + if(m_showingLeftArrow != show) + { + IggyDataValue result; + IggyDataValue value[1]; + + value[0].type = IGGY_DATATYPE_boolean; + value[0].boolval = show; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcShowScrollLeftArrow , 1 , value ); + + m_showingLeftArrow = show; + } +} + +void UIScene_TradingMenu::moveSelector(bool right) +{ + IggyDataValue result; + IggyDataValue value[1]; + + value[0].type = IGGY_DATATYPE_boolean; + value[0].boolval = right; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcMoveSelector , 1 , value ); +} + +void UIScene_TradingMenu::setTitle(const wstring &name) +{ + m_labelTrading.setLabel(name); +} + +void UIScene_TradingMenu::setRequest1Name(const wstring &name) +{ + m_labelRequest1.setLabel(name); +} + +void UIScene_TradingMenu::setRequest2Name(const wstring &name) +{ + m_labelRequest2.setLabel(name); +} + +void UIScene_TradingMenu::setRequest1RedBox(bool show) +{ + m_slotListRequest1.showSlotRedBox(0,show); +} + +void UIScene_TradingMenu::setRequest2RedBox(bool show) +{ + m_slotListRequest2.showSlotRedBox(0,show); +} + +void UIScene_TradingMenu::setTradeRedBox(int index, bool show) +{ + m_slotListTrades.showSlotRedBox(index,show); +} + +void UIScene_TradingMenu::setOfferDescription(vector *description) +{ + wstring descriptionStr = HtmlString::Compose(description); + + IggyDataValue result; + IggyDataValue value[1]; + + IggyStringUTF16 stringVal; + 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 new file mode 100644 index 00000000..a22ba0cf --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_TradingMenu.h @@ -0,0 +1,82 @@ +#pragma once + +#include "IUIScene_TradingMenu.h" + +class InventoryMenu; + +class UIScene_TradingMenu : public UIScene, public IUIScene_TradingMenu +{ +private: + bool m_showingRightArrow, m_showingLeftArrow; + +public: + UIScene_TradingMenu(int iPad, void *initData, UILayer *parentLayer); + + virtual EUIScene getSceneType() { return eUIScene_TradingMenu;} + +protected: + UIControl m_controlMainPanel; + UIControl_SlotList m_slotListTrades; + UIControl_SlotList m_slotListRequest1, m_slotListRequest2; + UIControl_SlotList m_slotListHotbar, m_slotListInventory; + UIControl_Label m_labelInventory; + UIControl_Label m_labelTrading, m_labelRequired; + UIControl_Label m_labelRequest1, m_labelRequest2; + + IggyName m_funcMoveSelector, m_funcShowScrollRightArrow, m_funcShowScrollLeftArrow, m_funcSetOfferDescription, m_funcSetActiveSlot; + + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_controlMainPanel, "MainPanel" ) + UI_BEGIN_MAP_CHILD_ELEMENTS( m_controlMainPanel ) + UI_MAP_ELEMENT( m_slotListTrades, "TradingBar") + UI_MAP_ELEMENT( m_slotListRequest1, "Request1") + UI_MAP_ELEMENT( m_slotListRequest2, "Request2") + + UI_MAP_ELEMENT( m_labelTrading, "VillagerText") + UI_MAP_ELEMENT( m_labelRequired, "RequiredLabel") + + UI_MAP_ELEMENT( m_labelRequest1, "Request1Label") + UI_MAP_ELEMENT( m_labelRequest2, "Request2Label") + + UI_MAP_ELEMENT( m_slotListHotbar, "HotBar") + UI_MAP_ELEMENT( m_slotListInventory, "Inventory") + UI_MAP_ELEMENT( m_labelInventory, "InventoryLabel") + + UI_END_MAP_CHILD_ELEMENTS() + + UI_MAP_NAME(m_funcMoveSelector, L"MoveSelector") + UI_MAP_NAME(m_funcShowScrollRightArrow, L"ShowScrollRightArrow") + UI_MAP_NAME(m_funcShowScrollLeftArrow, L"ShowScrollLeftArrow") + UI_MAP_NAME(m_funcSetOfferDescription, L"SetOfferDescription") + UI_MAP_NAME(m_funcSetActiveSlot, L"SetSelectorSlot") + UI_END_MAP_ELEMENTS_AND_NAMES() + + virtual wstring getMoviePath(); + virtual void updateTooltips(); + virtual void handleDestroy(); + virtual void handleReload(); + + virtual void tick(); + + void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + + void customDraw(IggyCustomDrawCallbackRegion *region); + + virtual void showScrollRightArrow(bool show); + virtual void showScrollLeftArrow(bool show); + virtual void moveSelector(bool right); + virtual void setTitle(const wstring &name); + virtual void setRequest1Name(const wstring &name); + virtual void setRequest2Name(const wstring &name); + + virtual void setRequest1RedBox(bool show); + virtual void setRequest2RedBox(bool show); + virtual void setTradeRedBox(int index, bool show); + + virtual void setOfferDescription(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 new file mode 100644 index 00000000..9ef8f189 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_TrialExitUpsell.cpp @@ -0,0 +1,75 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_TrialExitUpsell.h" + + +UIScene_TrialExitUpsell::UIScene_TrialExitUpsell(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); +} + +wstring UIScene_TrialExitUpsell::getMoviePath() +{ + return L"TrialExitUpsell"; +} + +void UIScene_TrialExitUpsell::updateTooltips() +{ + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_EXIT_GAME,IDS_TOOLTIPS_BACK, IDS_UNLOCK_TITLE); +} + +void UIScene_TrialExitUpsell::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + //app.DebugPrintf("UIScene_DebugOverlay handling input for pad %d, key %d, down- %s, pressed- %s, released- %s\n", iPad, key, down?"TRUE":"FALSE", pressed?"TRUE":"FALSE", released?"TRUE":"FALSE"); + + ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); + + switch(key) + { + case ACTION_MENU_CANCEL: + navigateBack(); + break; + case ACTION_MENU_OK: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + if(pressed) + { + //CD - Added for audio + ui.PlayUISFX(eSFX_Press); + app.ExitGame(); + } + break; + case ACTION_MENU_X: + if(ProfileManager.IsSignedIn(iPad)) + { + //CD - Added for audio + ui.PlayUISFX(eSFX_Press); + + // 4J-PB - need to check this user can access the store +#if defined(__PS3__) || defined(__PSVITA__) + bool bContentRestricted; + ProfileManager.GetChatAndContentRestrictions(ProfileManager.GetPrimaryPad(),true,NULL,&bContentRestricted,NULL); + if(bContentRestricted) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad()); + } + else +#endif + { + TelemetryManager->RecordUpsellPresented(iPad, eSen_UpsellID_Full_Version_Of_Game, app.m_dwOfferID); + ProfileManager.DisplayFullVersionPurchase(false,iPad,eSen_UpsellID_Full_Version_Of_Game); + } + } + break; + } +} + +void UIScene_TrialExitUpsell::handleAnimationEnd() +{ + //ui.NavigateToHomeMenu(); + ui.NavigateToScene(0,eUIScene_SaveMessage); +} diff --git a/Minecraft.Client/Common/UI/UIScene_TrialExitUpsell.h b/Minecraft.Client/Common/UI/UIScene_TrialExitUpsell.h new file mode 100644 index 00000000..79e9edf5 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_TrialExitUpsell.h @@ -0,0 +1,31 @@ +#pragma once + +#include "UIScene.h" + +class UIScene_TrialExitUpsell : public UIScene +{ +private: + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_END_MAP_ELEMENTS_AND_NAMES() + +public: + UIScene_TrialExitUpsell(int iPad, void *initData, UILayer *parentLayer); + + virtual EUIScene getSceneType() { return eUIScene_TrialExitUpsell;} + + // Returns true if this scene has focus for the pad passed in +#ifndef __PS3__ + virtual bool hasFocus(int iPad) { return bHasFocus; } +#endif + virtual void updateTooltips(); + +protected: + virtual wstring getMoviePath(); + +public: + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + + virtual void handleAnimationEnd(); + +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/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 new file mode 100644 index 00000000..c41f2276 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIStructs.h @@ -0,0 +1,487 @@ +#pragma once + +#pragma message("UIStructs.h") + +#include "UIEnums.h" + +class Container; +class Inventory; +class BrewingStandTileEntity; +class DispenserTileEntity; +class FurnaceTileEntity; +class SignTileEntity; +class LevelGenerationOptions; +class LocalPlayer; +class Merchant; +class EntityHorse; +class BeaconTileEntity; +class Slot; +class AbstractContainerMenu; + +// 4J Stu - Structs shared by Iggy and Xui scenes. +typedef struct _UIVec2D +{ + float x; + float y; + + _UIVec2D& operator+=(const _UIVec2D &rhs) + { + x += rhs.x; + y += rhs.y; + return *this; + } +} UIVec2D; + +// Brewing +typedef struct _BrewingScreenInput +{ + shared_ptr inventory; + shared_ptr brewingStand; + int iPad; + bool bSplitscreen; +} BrewingScreenInput; + +// Chest +typedef struct _ContainerScreenInput +{ + shared_ptr inventory; + shared_ptr container; + int iPad; + bool bSplitscreen; +} ContainerScreenInput; + +// Dispenser +typedef struct _TrapScreenInput +{ + shared_ptr inventory; + shared_ptr trap; + int iPad; + bool bSplitscreen; +} TrapScreenInput; + +// Inventory and creative inventory +typedef struct _InventoryScreenInput +{ + shared_ptr player; + bool bNavigateBack; // If we came here from the crafting screen, go back to it, rather than closing the xui menus + int iPad; + bool bSplitscreen; +} InventoryScreenInput; + +// Enchanting +typedef struct _EnchantingScreenInput +{ + shared_ptr inventory; + Level *level; + int x; + int y; + int z; + int iPad; + bool bSplitscreen; + wstring name; +} +EnchantingScreenInput; + +// Furnace +typedef struct _FurnaceScreenInput +{ + shared_ptr inventory; + shared_ptr furnace; + int iPad; + bool bSplitscreen; +} FurnaceScreenInput; + +// Crafting +typedef struct _CraftingPanelScreenInput +{ + shared_ptr player; + int iContainerType; // RECIPE_TYPE_2x2 or RECIPE_TYPE_3x3 + bool bSplitscreen; + int iPad; + int x; + int y; + int z; +} +CraftingPanelScreenInput; + +// Fireworks +typedef struct _FireworksScreenInput +{ + shared_ptr player; + bool bSplitscreen; + int iPad; + int x; + int y; + int z; +} +FireworksScreenInput; + +// Trading +typedef struct _TradingScreenInput +{ + shared_ptr inventory; + shared_ptr trader; + Level *level; + int iPad; + bool bSplitscreen; +} +TradingScreenInput; + +// Anvil +typedef struct _AnvilScreenInput +{ + shared_ptr inventory; + Level *level; + int x; + int y; + int z; + int iPad; + bool bSplitscreen; +} +AnvilScreenInput; + +// 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 +{ + shared_ptr sign; + int iPad; +} SignEntryScreenInput; + +// Connecting progress +typedef struct _ConnectionProgressParams +{ + int iPad; + int stringId; + bool showTooltips; + bool setFailTimer; + int timerTime; + void (*cancelFunc)(LPVOID param); + LPVOID cancelFuncParam; + + _ConnectionProgressParams() + { + iPad = 0; + stringId = -1; + showTooltips = false; + setFailTimer = false; + timerTime = 0; + cancelFunc = NULL; + cancelFuncParam = NULL; + } +} ConnectionProgressParams; + +// Fullscreen progress +typedef struct _UIFullscreenProgressCompletionData +{ + BOOL bRequiresUserAction; + BOOL bShowBackground; + BOOL bShowLogo; + BOOL bShowTips; + ProgressionCompletionType type; + int iPad; + EUIScene scene; + + _UIFullscreenProgressCompletionData() + { + bRequiresUserAction = FALSE; + bShowBackground = TRUE; + bShowLogo = TRUE; + bShowTips = TRUE; + type = e_ProgressCompletion_NoAction; + } +} UIFullscreenProgressCompletionData; + +// Create world +typedef struct _CreateWorldMenuInitData +{ + BOOL bOnline; + BOOL bIsPrivate; + int iPad; +} +CreateWorldMenuInitData; + +// Join/Load saves list +typedef struct _SaveListDetails +{ + int saveId; + PBYTE pbThumbnailData; + DWORD dwThumbnailSize; +#ifdef _DURANGO + wchar_t UTF16SaveName[128]; + wchar_t UTF16SaveFilename[MAX_SAVEFILENAME_LENGTH]; +#else + char UTF8SaveName[128]; +#ifndef _XBOX + char UTF8SaveFilename[MAX_SAVEFILENAME_LENGTH]; +#endif +#endif + + _SaveListDetails() + { + saveId = 0; + pbThumbnailData = NULL; + dwThumbnailSize = 0; +#ifdef _DURANGO + ZeroMemory(UTF16SaveName,sizeof(wchar_t)*128); + ZeroMemory(UTF16SaveFilename,sizeof(wchar_t)*MAX_SAVEFILENAME_LENGTH); +#else + ZeroMemory(UTF8SaveName,128); +#ifndef _XBOX + ZeroMemory(UTF8SaveFilename,MAX_SAVEFILENAME_LENGTH); +#endif +#endif + } + +} SaveListDetails; + +// Load world +typedef struct _LoadMenuInitData +{ + int iPad; + int iSaveGameInfoIndex; + LevelGenerationOptions *levelGen; + SaveListDetails *saveDetails; +} +LoadMenuInitData; + +// Join Games +typedef struct _JoinMenuInitData +{ + FriendSessionInfo *selectedSession; + int iPad; +} JoinMenuInitData; + +// More Options +typedef struct _LaunchMoreOptionsMenuInitData +{ + bool bOnlineGame; + bool bInviteOnly; + bool bAllowFriendsOfFriends; + + bool bGenerateOptions; + bool bStructures; + bool bFlatWorld; + bool bBonusChest; + + bool bPVP; + bool bTrust; + bool bFireSpreads; + bool bTNT; + + bool bHostPrivileges; + bool bResetNether; + + bool bMobGriefing; + bool bKeepInventory; + bool bDoMobSpawning; + bool bDoMobLoot; + bool bDoTileDrops; + bool bNaturalRegeneration; + bool bDoDaylightCycle; + + bool bOnlineSettingChangedBySystem; + + int iPad; + + DWORD dwTexturePack; + + wstring seed; + 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; + 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; + +typedef struct _LoadingInputParams +{ + C4JThreadStartFunc* func; + LPVOID lpParam; + UIFullscreenProgressCompletionData *completionData; + + int cancelText; + void (*cancelFunc)(LPVOID param); + void (*completeFunc)(LPVOID param); + LPVOID m_cancelFuncParam; + LPVOID m_completeFuncParam; + bool waitForThreadToDelete; + + _LoadingInputParams() + { + func = NULL; + lpParam = NULL; + completionData = NULL; + + cancelText = -1; + cancelFunc = NULL; + completeFunc = NULL; + m_cancelFuncParam = NULL; + m_completeFuncParam = NULL; + waitForThreadToDelete = false; + } +} LoadingInputParams; + +// Tutorial +#ifndef _XBOX +class UIScene; +#endif +class Tutorial; +typedef struct _TutorialPopupInfo +{ +#ifdef _XBOX + CXuiScene *interactScene; +#else + UIScene *interactScene; +#endif + LPCWSTR desc; + LPCWSTR title; + int icon; + int iAuxVal /* = 0 */; + bool isFoil /* = false */; + bool allowFade /* = true */; + bool isReminder /*= false*/; + Tutorial *tutorial; + + _TutorialPopupInfo() + { + interactScene = NULL; + desc = L""; + title = L""; + icon = -1; + iAuxVal = 0; + isFoil = false; + allowFade = true; + isReminder = false; + tutorial = NULL; + } + +} TutorialPopupInfo; + +// Quadrant sign in +typedef struct _SignInInfo +{ + int( *Func)(LPVOID,const bool, const int iPad); + LPVOID lpParam; + bool requireOnline; +} SignInInfo; + +// Credits +typedef struct +{ + LPCWSTR m_Text; // Should contain string, optionally with %s to add in translated string ... e.g. "Andy West - %s" + int m_iStringID[2]; // May be NO_TRANSLATED_STRING if we do not require to add any translated string. + ECreditTextTypes m_eType; +} +SCreditTextItemDef; + +// Message box +typedef struct _MessageBoxInfo +{ + UINT uiTitle; + UINT uiText; + UINT *uiOptionA; + UINT uiOptionC; + DWORD dwPad; + int( *Func)(LPVOID,int,const C4JStorage::EMessageResult); + LPVOID lpParam; + //C4JStringTable *pStringTable; // 4J Stu - We don't need this for our internal message boxes + WCHAR *pwchFormatString; + DWORD dwFocusButton; +} MessageBoxInfo; + +typedef struct _DLCOffersParam +{ + int iPad; + int iOfferC; + int iType; +} +DLCOffersParam; + +typedef struct _InGamePlayerOptionsInitData +{ + int iPad; + BYTE networkSmallId; + unsigned int playerPrivileges; +} InGamePlayerOptionsInitData; + +typedef struct _DebugSetCameraPosition +{ + int player; + double m_camX, m_camY, m_camZ, m_yRot, m_elev; +} DebugSetCameraPosition; + +typedef struct _TeleportMenuInitData +{ + int iPad; + bool teleportToPlayer; +} TeleportMenuInitData; + +typedef struct _CustomDrawData +{ + float x0, y0, x1, y1; // the bounding box of the original DisplayObject, in object space + float mat[16]; +} CustomDrawData; + +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 new file mode 100644 index 00000000..5d72ed97 --- /dev/null +++ b/Minecraft.Client/Common/UI/UITTFFont.cpp @@ -0,0 +1,58 @@ +#include "stdafx.h" +#include "UI.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\..\Minecraft.World\File.h" +#include "UITTFFont.h" + +UITTFFont::UITTFFont(const string &name, const string &path, S32 fallbackCharacter) + : m_strFontName(name) +{ + app.DebugPrintf("UITTFFont opening %s\n",path.c_str()); + +#ifdef _UNICODE + wstring wPath = convStringToWstring(path); + HANDLE file = CreateFile(wPath.c_str(), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); +#else + HANDLE file = CreateFile(path.c_str(), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); +#endif + if( file == INVALID_HANDLE_VALUE ) + { + DWORD error = GetLastError(); + app.DebugPrintf("Failed to open TTF file with error code %d (%x)\n", error, error); + assert(false); + } + + DWORD dwHigh=0; + DWORD dwFileSize = GetFileSize(file,&dwHigh); + + if(dwFileSize!=0) + { + DWORD bytesRead; + + pbData = (PBYTE) new BYTE[dwFileSize]; + BOOL bSuccess = ReadFile(file,pbData,dwFileSize,&bytesRead,NULL); + if(bSuccess==FALSE) + { + app.FatalLoadError(); + } + CloseHandle(file); + + IggyFontInstallTruetypeUTF8 ( (void *)pbData, IGGY_TTC_INDEX_none, m_strFontName.c_str(), -1, IGGY_FONTFLAG_none ); + + 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 ); + IggyFontInstallTruetypeUTF8 ( (void *)pbData, IGGY_TTC_INDEX_none, "Arial", -1, IGGY_FONTFLAG_none ); + } +} + +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 new file mode 100644 index 00000000..023bd51b --- /dev/null +++ b/Minecraft.Client/Common/UI/UITTFFont.h @@ -0,0 +1,16 @@ +#pragma once + +class UITTFFont +{ +private: + const string m_strFontName; + + PBYTE pbData; + //DWORD dwDataSize; + +public: + UITTFFont(const string &name, const string &path, S32 fallbackCharacter); + ~UITTFFont(); + + string getFontName(); +}; diff --git a/Minecraft.Client/Common/res/1_2_2/achievement/bg.png b/Minecraft.Client/Common/res/1_2_2/achievement/bg.png new file mode 100644 index 00000000..23dd85a8 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/achievement/bg.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/achievement/icons.png b/Minecraft.Client/Common/res/1_2_2/achievement/icons.png new file mode 100644 index 00000000..6a3f3ea5 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/achievement/icons.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/armor/chain_1.png b/Minecraft.Client/Common/res/1_2_2/armor/chain_1.png new file mode 100644 index 00000000..3632af5b Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/armor/chain_1.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/armor/chain_2.png b/Minecraft.Client/Common/res/1_2_2/armor/chain_2.png new file mode 100644 index 00000000..330425b1 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/armor/chain_2.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/armor/cloth_1.png b/Minecraft.Client/Common/res/1_2_2/armor/cloth_1.png new file mode 100644 index 00000000..f3cf4aa3 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/armor/cloth_1.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/armor/cloth_2.png b/Minecraft.Client/Common/res/1_2_2/armor/cloth_2.png new file mode 100644 index 00000000..15fb9084 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/armor/cloth_2.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/armor/diamond_1.png b/Minecraft.Client/Common/res/1_2_2/armor/diamond_1.png new file mode 100644 index 00000000..339da658 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/armor/diamond_1.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/armor/diamond_2.png b/Minecraft.Client/Common/res/1_2_2/armor/diamond_2.png new file mode 100644 index 00000000..c220c123 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/armor/diamond_2.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/armor/gold_1.png b/Minecraft.Client/Common/res/1_2_2/armor/gold_1.png new file mode 100644 index 00000000..885f309b Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/armor/gold_1.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/armor/gold_2.png b/Minecraft.Client/Common/res/1_2_2/armor/gold_2.png new file mode 100644 index 00000000..9d1ea3b3 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/armor/gold_2.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/armor/iron_1.png b/Minecraft.Client/Common/res/1_2_2/armor/iron_1.png new file mode 100644 index 00000000..374ab076 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/armor/iron_1.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/armor/iron_2.png b/Minecraft.Client/Common/res/1_2_2/armor/iron_2.png new file mode 100644 index 00000000..53af4f4d Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/armor/iron_2.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/armor/power.png b/Minecraft.Client/Common/res/1_2_2/armor/power.png new file mode 100644 index 00000000..809539ca Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/armor/power.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/art/kz.png b/Minecraft.Client/Common/res/1_2_2/art/kz.png new file mode 100644 index 00000000..ecc4823e Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/art/kz.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/environment/clouds.png b/Minecraft.Client/Common/res/1_2_2/environment/clouds.png new file mode 100644 index 00000000..b4a78c2f Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/environment/clouds.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/environment/light_normal.png b/Minecraft.Client/Common/res/1_2_2/environment/light_normal.png new file mode 100644 index 00000000..023f3cd5 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/environment/light_normal.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/environment/rain.png b/Minecraft.Client/Common/res/1_2_2/environment/rain.png new file mode 100644 index 00000000..75d775b1 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/environment/rain.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/environment/snow.png b/Minecraft.Client/Common/res/1_2_2/environment/snow.png new file mode 100644 index 00000000..84417c5c Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/environment/snow.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/alternate.png b/Minecraft.Client/Common/res/1_2_2/font/alternate.png new file mode 100644 index 00000000..70a732e6 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/alternate.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/default.png b/Minecraft.Client/Common/res/1_2_2/font/default.png new file mode 100644 index 00000000..96094378 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/default.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_00.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_00.png new file mode 100644 index 00000000..badaa89a Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_00.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_01.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_01.png new file mode 100644 index 00000000..8b13263a Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_01.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_02.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_02.png new file mode 100644 index 00000000..b7f79b67 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_02.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_03.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_03.png new file mode 100644 index 00000000..66c8da1e Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_03.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_04.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_04.png new file mode 100644 index 00000000..f809f53a Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_04.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_05.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_05.png new file mode 100644 index 00000000..abeeb179 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_05.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_06.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_06.png new file mode 100644 index 00000000..b1b982ef Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_06.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_07.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_07.png new file mode 100644 index 00000000..9006d79c Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_07.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_09.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_09.png new file mode 100644 index 00000000..c7b8eb75 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_09.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_0A.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_0A.png new file mode 100644 index 00000000..febfc861 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_0A.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_0B.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_0B.png new file mode 100644 index 00000000..23a7d7fa Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_0B.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_0C.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_0C.png new file mode 100644 index 00000000..eaffa7e7 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_0C.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_0D.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_0D.png new file mode 100644 index 00000000..0f49ce7e Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_0D.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_0E.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_0E.png new file mode 100644 index 00000000..23d740d3 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_0E.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_0F.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_0F.png new file mode 100644 index 00000000..ebfda315 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_0F.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_10.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_10.png new file mode 100644 index 00000000..9f534d18 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_10.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_11.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_11.png new file mode 100644 index 00000000..3fd49256 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_11.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_12.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_12.png new file mode 100644 index 00000000..0733830b Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_12.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_13.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_13.png new file mode 100644 index 00000000..c242e269 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_13.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_14.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_14.png new file mode 100644 index 00000000..244a23af Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_14.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_15.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_15.png new file mode 100644 index 00000000..c9508d10 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_15.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_16.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_16.png new file mode 100644 index 00000000..09f817c1 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_16.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_17.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_17.png new file mode 100644 index 00000000..ab12c1b8 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_17.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_18.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_18.png new file mode 100644 index 00000000..abd40b8d Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_18.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_19.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_19.png new file mode 100644 index 00000000..b009479e Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_19.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_1A.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_1A.png new file mode 100644 index 00000000..eb856e9b Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_1A.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_1B.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_1B.png new file mode 100644 index 00000000..343d1db7 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_1B.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_1C.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_1C.png new file mode 100644 index 00000000..89d5a5b9 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_1C.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_1D.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_1D.png new file mode 100644 index 00000000..58f621a4 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_1D.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_1E.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_1E.png new file mode 100644 index 00000000..9c7fbf3b Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_1E.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_1F.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_1F.png new file mode 100644 index 00000000..a88a086a Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_1F.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_20.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_20.png new file mode 100644 index 00000000..7f58416b Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_20.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_21.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_21.png new file mode 100644 index 00000000..66964996 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_21.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_22.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_22.png new file mode 100644 index 00000000..c12beacd Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_22.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_23.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_23.png new file mode 100644 index 00000000..dc081c91 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_23.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_24.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_24.png new file mode 100644 index 00000000..a72608b9 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_24.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_25.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_25.png new file mode 100644 index 00000000..fba91722 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_25.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_26.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_26.png new file mode 100644 index 00000000..9641f840 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_26.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_27.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_27.png new file mode 100644 index 00000000..a6d99c8a Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_27.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_28.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_28.png new file mode 100644 index 00000000..358a414b Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_28.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_29.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_29.png new file mode 100644 index 00000000..7ece5346 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_29.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_2A.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_2A.png new file mode 100644 index 00000000..6713fbf1 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_2A.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_2B.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_2B.png new file mode 100644 index 00000000..7108270b Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_2B.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_2C.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_2C.png new file mode 100644 index 00000000..04369ea6 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_2C.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_2D.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_2D.png new file mode 100644 index 00000000..3a43bf9f Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_2D.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_2E.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_2E.png new file mode 100644 index 00000000..f17a127d Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_2E.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_2F.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_2F.png new file mode 100644 index 00000000..8049f83d Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_2F.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_30.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_30.png new file mode 100644 index 00000000..87a1b6d7 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_30.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_31.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_31.png new file mode 100644 index 00000000..d1a9e1ba Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_31.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_32.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_32.png new file mode 100644 index 00000000..06b38098 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_32.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_33.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_33.png new file mode 100644 index 00000000..31372341 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_33.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_34.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_34.png new file mode 100644 index 00000000..75240d6b Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_34.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_35.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_35.png new file mode 100644 index 00000000..c53366d3 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_35.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_36.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_36.png new file mode 100644 index 00000000..89dd0147 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_36.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_37.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_37.png new file mode 100644 index 00000000..86818e12 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_37.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_38.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_38.png new file mode 100644 index 00000000..0d7ce9ba Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_38.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_39.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_39.png new file mode 100644 index 00000000..323e0c3d Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_39.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_3A.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_3A.png new file mode 100644 index 00000000..8b2b4d8b Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_3A.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_3B.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_3B.png new file mode 100644 index 00000000..f42d51d4 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_3B.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_3C.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_3C.png new file mode 100644 index 00000000..083a92da Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_3C.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_3D.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_3D.png new file mode 100644 index 00000000..465b9b47 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_3D.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_3E.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_3E.png new file mode 100644 index 00000000..66c7d97e Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_3E.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_3F.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_3F.png new file mode 100644 index 00000000..fd557b58 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_3F.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_40.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_40.png new file mode 100644 index 00000000..f66192f6 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_40.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_41.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_41.png new file mode 100644 index 00000000..e73f5a4d Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_41.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_42.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_42.png new file mode 100644 index 00000000..abd075ce Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_42.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_43.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_43.png new file mode 100644 index 00000000..823bf103 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_43.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_44.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_44.png new file mode 100644 index 00000000..750ddf51 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_44.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_45.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_45.png new file mode 100644 index 00000000..055b239c Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_45.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_46.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_46.png new file mode 100644 index 00000000..b019f5a9 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_46.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_47.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_47.png new file mode 100644 index 00000000..7a3fe80f Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_47.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_48.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_48.png new file mode 100644 index 00000000..80c3065a Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_48.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_49.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_49.png new file mode 100644 index 00000000..d6c54c06 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_49.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_4A.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_4A.png new file mode 100644 index 00000000..438126be Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_4A.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_4B.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_4B.png new file mode 100644 index 00000000..0067b629 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_4B.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_4C.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_4C.png new file mode 100644 index 00000000..613d57f2 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_4C.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_4D.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_4D.png new file mode 100644 index 00000000..bd9b8b3e Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_4D.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_4E.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_4E.png new file mode 100644 index 00000000..0475ccca Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_4E.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_4F.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_4F.png new file mode 100644 index 00000000..8fb06bd2 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_4F.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_50.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_50.png new file mode 100644 index 00000000..19ef3f63 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_50.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_51.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_51.png new file mode 100644 index 00000000..8c2cc60e Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_51.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_52.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_52.png new file mode 100644 index 00000000..a1615f61 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_52.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_53.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_53.png new file mode 100644 index 00000000..d303d8b1 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_53.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_54.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_54.png new file mode 100644 index 00000000..7bc45be4 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_54.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_55.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_55.png new file mode 100644 index 00000000..457996ca Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_55.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_56.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_56.png new file mode 100644 index 00000000..10a8f788 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_56.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_57.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_57.png new file mode 100644 index 00000000..e147b255 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_57.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_58.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_58.png new file mode 100644 index 00000000..f0ffb445 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_58.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_59.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_59.png new file mode 100644 index 00000000..13f0155f Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_59.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_5A.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_5A.png new file mode 100644 index 00000000..5d5f7c74 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_5A.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_5B.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_5B.png new file mode 100644 index 00000000..e5d33f53 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_5B.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_5C.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_5C.png new file mode 100644 index 00000000..4a292e8b Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_5C.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_5D.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_5D.png new file mode 100644 index 00000000..975f832f Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_5D.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_5E.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_5E.png new file mode 100644 index 00000000..5e64061a Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_5E.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_5F.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_5F.png new file mode 100644 index 00000000..52d12d3a Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_5F.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_60.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_60.png new file mode 100644 index 00000000..6d677ab6 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_60.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_61.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_61.png new file mode 100644 index 00000000..28e6e314 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_61.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_62.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_62.png new file mode 100644 index 00000000..29b64848 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_62.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_63.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_63.png new file mode 100644 index 00000000..e4f5bbc7 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_63.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_64.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_64.png new file mode 100644 index 00000000..6ca84df0 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_64.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_65.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_65.png new file mode 100644 index 00000000..73000a53 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_65.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_66.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_66.png new file mode 100644 index 00000000..54a6506c Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_66.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_67.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_67.png new file mode 100644 index 00000000..a326f389 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_67.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_68.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_68.png new file mode 100644 index 00000000..26c2c086 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_68.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_69.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_69.png new file mode 100644 index 00000000..cf28465b Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_69.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_6A.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_6A.png new file mode 100644 index 00000000..f8a399a4 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_6A.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_6B.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_6B.png new file mode 100644 index 00000000..1ad415cf Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_6B.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_6C.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_6C.png new file mode 100644 index 00000000..c359f2b5 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_6C.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_6D.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_6D.png new file mode 100644 index 00000000..b1f96be8 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_6D.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_6E.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_6E.png new file mode 100644 index 00000000..4b69dc89 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_6E.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_6F.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_6F.png new file mode 100644 index 00000000..9678cdd3 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_6F.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_70.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_70.png new file mode 100644 index 00000000..245ee9f4 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_70.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_71.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_71.png new file mode 100644 index 00000000..54721e1d Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_71.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_72.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_72.png new file mode 100644 index 00000000..aad17f8c Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_72.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_73.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_73.png new file mode 100644 index 00000000..858e409b Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_73.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_74.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_74.png new file mode 100644 index 00000000..2613bbe4 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_74.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_75.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_75.png new file mode 100644 index 00000000..78fdb417 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_75.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_76.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_76.png new file mode 100644 index 00000000..232ebe3f Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_76.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_77.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_77.png new file mode 100644 index 00000000..1e0045c4 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_77.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_78.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_78.png new file mode 100644 index 00000000..24a124c2 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_78.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_79.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_79.png new file mode 100644 index 00000000..53fdd3e5 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_79.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_7A.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_7A.png new file mode 100644 index 00000000..2dcc560f Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_7A.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_7B.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_7B.png new file mode 100644 index 00000000..544dfe95 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_7B.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_7C.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_7C.png new file mode 100644 index 00000000..a476ce3c Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_7C.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_7D.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_7D.png new file mode 100644 index 00000000..b547d5bb Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_7D.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_7E.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_7E.png new file mode 100644 index 00000000..83feea20 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_7E.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_7F.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_7F.png new file mode 100644 index 00000000..beb0bed4 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_7F.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_80.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_80.png new file mode 100644 index 00000000..c97da9c0 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_80.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_81.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_81.png new file mode 100644 index 00000000..6c5944cc Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_81.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_82.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_82.png new file mode 100644 index 00000000..6c1fe0e4 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_82.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_83.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_83.png new file mode 100644 index 00000000..423c90a0 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_83.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_84.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_84.png new file mode 100644 index 00000000..8f2e8c85 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_84.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_85.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_85.png new file mode 100644 index 00000000..1799c0d3 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_85.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_86.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_86.png new file mode 100644 index 00000000..ddf36edb Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_86.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_87.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_87.png new file mode 100644 index 00000000..6950664e Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_87.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_88.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_88.png new file mode 100644 index 00000000..ba2afc91 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_88.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_89.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_89.png new file mode 100644 index 00000000..54f7f0f4 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_89.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_8A.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_8A.png new file mode 100644 index 00000000..44a98609 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_8A.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_8B.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_8B.png new file mode 100644 index 00000000..f8411526 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_8B.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_8C.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_8C.png new file mode 100644 index 00000000..f0e0faac Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_8C.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_8D.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_8D.png new file mode 100644 index 00000000..3448dfa2 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_8D.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_8E.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_8E.png new file mode 100644 index 00000000..24e378ae Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_8E.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_8F.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_8F.png new file mode 100644 index 00000000..da8116b1 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_8F.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_90.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_90.png new file mode 100644 index 00000000..8d322441 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_90.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_91.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_91.png new file mode 100644 index 00000000..25161436 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_91.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_92.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_92.png new file mode 100644 index 00000000..1dce777e Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_92.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_93.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_93.png new file mode 100644 index 00000000..0cd88c45 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_93.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_94.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_94.png new file mode 100644 index 00000000..e4ed8ffb Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_94.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_95.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_95.png new file mode 100644 index 00000000..c2351611 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_95.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_96.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_96.png new file mode 100644 index 00000000..8dd0b6ea Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_96.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_97.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_97.png new file mode 100644 index 00000000..e9f15153 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_97.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_98.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_98.png new file mode 100644 index 00000000..ccf000c8 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_98.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_99.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_99.png new file mode 100644 index 00000000..181cd07b Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_99.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_9A.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_9A.png new file mode 100644 index 00000000..75c49f6e Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_9A.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_9B.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_9B.png new file mode 100644 index 00000000..9501459d Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_9B.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_9C.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_9C.png new file mode 100644 index 00000000..af54e47e Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_9C.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_9D.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_9D.png new file mode 100644 index 00000000..1c61203a Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_9D.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_9E.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_9E.png new file mode 100644 index 00000000..ad805f8a Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_9E.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_9F.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_9F.png new file mode 100644 index 00000000..f1632c08 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_9F.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_A0.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_A0.png new file mode 100644 index 00000000..c11b46ae Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_A0.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_A1.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_A1.png new file mode 100644 index 00000000..79a554a2 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_A1.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_A2.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_A2.png new file mode 100644 index 00000000..712577b9 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_A2.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_A3.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_A3.png new file mode 100644 index 00000000..8913bc96 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_A3.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_A4.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_A4.png new file mode 100644 index 00000000..39f7f989 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_A4.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_A5.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_A5.png new file mode 100644 index 00000000..865620be Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_A5.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_A6.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_A6.png new file mode 100644 index 00000000..69012bcd Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_A6.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_A7.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_A7.png new file mode 100644 index 00000000..efd1cd11 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_A7.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_A8.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_A8.png new file mode 100644 index 00000000..55b79c02 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_A8.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_A9.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_A9.png new file mode 100644 index 00000000..a275c39b Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_A9.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_AA.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_AA.png new file mode 100644 index 00000000..5394ac7c Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_AA.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_AB.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_AB.png new file mode 100644 index 00000000..96a74786 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_AB.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_AC.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_AC.png new file mode 100644 index 00000000..bd34b867 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_AC.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_AD.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_AD.png new file mode 100644 index 00000000..026899f9 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_AD.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_AE.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_AE.png new file mode 100644 index 00000000..49cfab89 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_AE.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_AF.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_AF.png new file mode 100644 index 00000000..b6b666df Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_AF.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_B0.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_B0.png new file mode 100644 index 00000000..28dc440e Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_B0.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_B1.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_B1.png new file mode 100644 index 00000000..d944e6f1 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_B1.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_B2.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_B2.png new file mode 100644 index 00000000..ad6eaca4 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_B2.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_B3.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_B3.png new file mode 100644 index 00000000..0e11fadd Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_B3.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_B4.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_B4.png new file mode 100644 index 00000000..03e74324 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_B4.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_B5.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_B5.png new file mode 100644 index 00000000..4ebc7df6 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_B5.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_B6.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_B6.png new file mode 100644 index 00000000..7c73305a Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_B6.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_B7.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_B7.png new file mode 100644 index 00000000..299ca4ee Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_B7.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_B8.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_B8.png new file mode 100644 index 00000000..964f094a Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_B8.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_B9.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_B9.png new file mode 100644 index 00000000..2a4ba15d Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_B9.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_BA.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_BA.png new file mode 100644 index 00000000..e8e32e6d Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_BA.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_BB.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_BB.png new file mode 100644 index 00000000..130a7a6e Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_BB.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_BC.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_BC.png new file mode 100644 index 00000000..31584307 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_BC.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_BD.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_BD.png new file mode 100644 index 00000000..3c369874 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_BD.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_BE.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_BE.png new file mode 100644 index 00000000..bc1e4d90 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_BE.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_BF.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_BF.png new file mode 100644 index 00000000..95174381 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_BF.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_C0.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_C0.png new file mode 100644 index 00000000..f5af2962 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_C0.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_C1.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_C1.png new file mode 100644 index 00000000..b42f7982 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_C1.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_C2.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_C2.png new file mode 100644 index 00000000..483f9212 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_C2.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_C3.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_C3.png new file mode 100644 index 00000000..05b8c2bc Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_C3.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_C4.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_C4.png new file mode 100644 index 00000000..e1f23a14 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_C4.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_C5.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_C5.png new file mode 100644 index 00000000..8490de77 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_C5.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_C6.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_C6.png new file mode 100644 index 00000000..92123f77 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_C6.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_C7.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_C7.png new file mode 100644 index 00000000..86f444fc Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_C7.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_C8.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_C8.png new file mode 100644 index 00000000..e5e7f70c Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_C8.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_C9.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_C9.png new file mode 100644 index 00000000..b289f71b Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_C9.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_CA.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_CA.png new file mode 100644 index 00000000..5c3e6196 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_CA.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_CB.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_CB.png new file mode 100644 index 00000000..314e4134 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_CB.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_CC.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_CC.png new file mode 100644 index 00000000..75d5e30e Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_CC.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_CD.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_CD.png new file mode 100644 index 00000000..73a44121 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_CD.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_CE.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_CE.png new file mode 100644 index 00000000..c0836349 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_CE.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_CF.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_CF.png new file mode 100644 index 00000000..be4094a8 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_CF.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_D0.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_D0.png new file mode 100644 index 00000000..955bdbbb Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_D0.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_D1.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_D1.png new file mode 100644 index 00000000..8a50a7b6 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_D1.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_D2.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_D2.png new file mode 100644 index 00000000..eebd5ae5 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_D2.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_D3.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_D3.png new file mode 100644 index 00000000..2d3f63a2 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_D3.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_D4.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_D4.png new file mode 100644 index 00000000..b95104f6 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_D4.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_D5.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_D5.png new file mode 100644 index 00000000..ab562fbf Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_D5.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_D6.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_D6.png new file mode 100644 index 00000000..a181bd8c Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_D6.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_D7.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_D7.png new file mode 100644 index 00000000..83057df8 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_D7.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_F9.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_F9.png new file mode 100644 index 00000000..d683df45 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_F9.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_FA.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_FA.png new file mode 100644 index 00000000..25182d04 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_FA.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_FB.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_FB.png new file mode 100644 index 00000000..b6de14e3 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_FB.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_FC.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_FC.png new file mode 100644 index 00000000..0cfaa52c Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_FC.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_FD.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_FD.png new file mode 100644 index 00000000..79687861 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_FD.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_FE.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_FE.png new file mode 100644 index 00000000..9b508ba6 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_FE.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_FF.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_FF.png new file mode 100644 index 00000000..da328a78 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_FF.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_sizes.bin b/Minecraft.Client/Common/res/1_2_2/font/glyph_sizes.bin new file mode 100644 index 00000000..69c857e3 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_sizes.bin differ diff --git a/Minecraft.Client/Common/res/1_2_2/gui/alchemy.png b/Minecraft.Client/Common/res/1_2_2/gui/alchemy.png new file mode 100644 index 00000000..214a44bc Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/gui/alchemy.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/gui/allitems.png b/Minecraft.Client/Common/res/1_2_2/gui/allitems.png new file mode 100644 index 00000000..e1e5d779 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/gui/allitems.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/gui/background.png b/Minecraft.Client/Common/res/1_2_2/gui/background.png new file mode 100644 index 00000000..b29e0092 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/gui/background.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/gui/container.png b/Minecraft.Client/Common/res/1_2_2/gui/container.png new file mode 100644 index 00000000..bd1d383c Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/gui/container.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/gui/crafting.png b/Minecraft.Client/Common/res/1_2_2/gui/crafting.png new file mode 100644 index 00000000..da831189 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/gui/crafting.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/gui/crash_logo.png b/Minecraft.Client/Common/res/1_2_2/gui/crash_logo.png new file mode 100644 index 00000000..78c5ef17 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/gui/crash_logo.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/gui/enchant.png b/Minecraft.Client/Common/res/1_2_2/gui/enchant.png new file mode 100644 index 00000000..0fddfd4c Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/gui/enchant.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/gui/furnace.png b/Minecraft.Client/Common/res/1_2_2/gui/furnace.png new file mode 100644 index 00000000..8527289e Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/gui/furnace.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/gui/gui.png b/Minecraft.Client/Common/res/1_2_2/gui/gui.png new file mode 100644 index 00000000..70c39540 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/gui/gui.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/gui/icons.png b/Minecraft.Client/Common/res/1_2_2/gui/icons.png new file mode 100644 index 00000000..e5d56d73 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/gui/icons.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/gui/inventory.png b/Minecraft.Client/Common/res/1_2_2/gui/inventory.png new file mode 100644 index 00000000..4d991169 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/gui/inventory.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/gui/items.png b/Minecraft.Client/Common/res/1_2_2/gui/items.png new file mode 100644 index 00000000..8f8a877e Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/gui/items.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/gui/particles.png b/Minecraft.Client/Common/res/1_2_2/gui/particles.png new file mode 100644 index 00000000..ac7e39f4 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/gui/particles.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/gui/slot.png b/Minecraft.Client/Common/res/1_2_2/gui/slot.png new file mode 100644 index 00000000..caf4786a Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/gui/slot.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/gui/trap.png b/Minecraft.Client/Common/res/1_2_2/gui/trap.png new file mode 100644 index 00000000..594860a6 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/gui/trap.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/gui/unknown_pack.png b/Minecraft.Client/Common/res/1_2_2/gui/unknown_pack.png new file mode 100644 index 00000000..3a45a90e Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/gui/unknown_pack.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/item/arrows.png b/Minecraft.Client/Common/res/1_2_2/item/arrows.png new file mode 100644 index 00000000..75c58287 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/item/arrows.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/item/boat.png b/Minecraft.Client/Common/res/1_2_2/item/boat.png new file mode 100644 index 00000000..132a0f7c Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/item/boat.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/item/book.png b/Minecraft.Client/Common/res/1_2_2/item/book.png new file mode 100644 index 00000000..ae411ff2 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/item/book.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/item/cart.png b/Minecraft.Client/Common/res/1_2_2/item/cart.png new file mode 100644 index 00000000..ba73b60d Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/item/cart.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/item/chest.png b/Minecraft.Client/Common/res/1_2_2/item/chest.png new file mode 100644 index 00000000..fece5e1a Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/item/chest.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/item/door.png b/Minecraft.Client/Common/res/1_2_2/item/door.png new file mode 100644 index 00000000..52df2d92 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/item/door.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/item/largechest.png b/Minecraft.Client/Common/res/1_2_2/item/largechest.png new file mode 100644 index 00000000..fb6e94fe Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/item/largechest.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/item/sign.png b/Minecraft.Client/Common/res/1_2_2/item/sign.png new file mode 100644 index 00000000..e8294724 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/item/sign.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/item/xporb.png b/Minecraft.Client/Common/res/1_2_2/item/xporb.png new file mode 100644 index 00000000..33670ee6 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/item/xporb.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/misc/dial.png b/Minecraft.Client/Common/res/1_2_2/misc/dial.png new file mode 100644 index 00000000..140e7e34 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/misc/dial.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/misc/explosion.png b/Minecraft.Client/Common/res/1_2_2/misc/explosion.png new file mode 100644 index 00000000..732069b3 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/misc/explosion.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/misc/foliagecolor.png b/Minecraft.Client/Common/res/1_2_2/misc/foliagecolor.png new file mode 100644 index 00000000..81673cae Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/misc/foliagecolor.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/misc/footprint.png b/Minecraft.Client/Common/res/1_2_2/misc/footprint.png new file mode 100644 index 00000000..e29b6a6d Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/misc/footprint.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/misc/glint.png b/Minecraft.Client/Common/res/1_2_2/misc/glint.png new file mode 100644 index 00000000..67732093 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/misc/glint.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/misc/grasscolor.png b/Minecraft.Client/Common/res/1_2_2/misc/grasscolor.png new file mode 100644 index 00000000..a6d9c209 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/misc/grasscolor.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/misc/mapbg.png b/Minecraft.Client/Common/res/1_2_2/misc/mapbg.png new file mode 100644 index 00000000..ff2faaa7 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/misc/mapbg.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/misc/mapicons.png b/Minecraft.Client/Common/res/1_2_2/misc/mapicons.png new file mode 100644 index 00000000..9f325237 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/misc/mapicons.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/misc/particlefield.png b/Minecraft.Client/Common/res/1_2_2/misc/particlefield.png new file mode 100644 index 00000000..c8c56415 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/misc/particlefield.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/misc/pumpkinblur.png b/Minecraft.Client/Common/res/1_2_2/misc/pumpkinblur.png new file mode 100644 index 00000000..c6e2ffc9 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/misc/pumpkinblur.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/misc/shadow.png b/Minecraft.Client/Common/res/1_2_2/misc/shadow.png new file mode 100644 index 00000000..06d999b2 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/misc/shadow.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/misc/tunnel.png b/Minecraft.Client/Common/res/1_2_2/misc/tunnel.png new file mode 100644 index 00000000..dc479e07 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/misc/tunnel.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/misc/vignette.png b/Minecraft.Client/Common/res/1_2_2/misc/vignette.png new file mode 100644 index 00000000..f236acb3 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/misc/vignette.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/misc/water.png b/Minecraft.Client/Common/res/1_2_2/misc/water.png new file mode 100644 index 00000000..8b92f9bc Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/misc/water.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/misc/watercolor.png b/Minecraft.Client/Common/res/1_2_2/misc/watercolor.png new file mode 100644 index 00000000..38bff05e Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/misc/watercolor.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/cat_black.png b/Minecraft.Client/Common/res/1_2_2/mob/cat_black.png new file mode 100644 index 00000000..028ffcd1 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/cat_black.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/cat_red.png b/Minecraft.Client/Common/res/1_2_2/mob/cat_red.png new file mode 100644 index 00000000..5ca3fa1e Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/cat_red.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/cat_siamese.png b/Minecraft.Client/Common/res/1_2_2/mob/cat_siamese.png new file mode 100644 index 00000000..70a88aed Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/cat_siamese.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/cavespider.png b/Minecraft.Client/Common/res/1_2_2/mob/cavespider.png new file mode 100644 index 00000000..288e5c3c Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/cavespider.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/char.png b/Minecraft.Client/Common/res/1_2_2/mob/char.png new file mode 100644 index 00000000..7cfa08a8 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/char.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/chicken.png b/Minecraft.Client/Common/res/1_2_2/mob/chicken.png new file mode 100644 index 00000000..d4812939 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/chicken.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/cow.png b/Minecraft.Client/Common/res/1_2_2/mob/cow.png new file mode 100644 index 00000000..4264021e Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/cow.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/creeper.png b/Minecraft.Client/Common/res/1_2_2/mob/creeper.png new file mode 100644 index 00000000..e0a5e0a1 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/creeper.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/enderdragon/beam.png b/Minecraft.Client/Common/res/1_2_2/mob/enderdragon/beam.png new file mode 100644 index 00000000..b0042418 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/enderdragon/beam.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/enderdragon/body.png b/Minecraft.Client/Common/res/1_2_2/mob/enderdragon/body.png new file mode 100644 index 00000000..e604a7ce Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/enderdragon/body.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/enderdragon/crystal.png b/Minecraft.Client/Common/res/1_2_2/mob/enderdragon/crystal.png new file mode 100644 index 00000000..f825ed69 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/enderdragon/crystal.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/enderdragon/dragon.png b/Minecraft.Client/Common/res/1_2_2/mob/enderdragon/dragon.png new file mode 100644 index 00000000..6abddc82 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/enderdragon/dragon.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/enderdragon/ender.png b/Minecraft.Client/Common/res/1_2_2/mob/enderdragon/ender.png new file mode 100644 index 00000000..2ea98241 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/enderdragon/ender.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/enderdragon/ender_eyes.png b/Minecraft.Client/Common/res/1_2_2/mob/enderdragon/ender_eyes.png new file mode 100644 index 00000000..1a98ba1c Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/enderdragon/ender_eyes.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/enderdragon/shuffle.png b/Minecraft.Client/Common/res/1_2_2/mob/enderdragon/shuffle.png new file mode 100644 index 00000000..89be1d71 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/enderdragon/shuffle.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/enderman.png b/Minecraft.Client/Common/res/1_2_2/mob/enderman.png new file mode 100644 index 00000000..11b05d0e Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/enderman.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/enderman_eyes.png b/Minecraft.Client/Common/res/1_2_2/mob/enderman_eyes.png new file mode 100644 index 00000000..8265fd7f Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/enderman_eyes.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/fire.png b/Minecraft.Client/Common/res/1_2_2/mob/fire.png new file mode 100644 index 00000000..05364b49 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/fire.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/ghast.png b/Minecraft.Client/Common/res/1_2_2/mob/ghast.png new file mode 100644 index 00000000..e83a60da Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/ghast.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/ghast_fire.png b/Minecraft.Client/Common/res/1_2_2/mob/ghast_fire.png new file mode 100644 index 00000000..fff9718c Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/ghast_fire.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/lava.png b/Minecraft.Client/Common/res/1_2_2/mob/lava.png new file mode 100644 index 00000000..036812f2 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/lava.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/ozelot.png b/Minecraft.Client/Common/res/1_2_2/mob/ozelot.png new file mode 100644 index 00000000..7a0b8b39 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/ozelot.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/pig.png b/Minecraft.Client/Common/res/1_2_2/mob/pig.png new file mode 100644 index 00000000..1ed505b5 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/pig.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/pigman.png b/Minecraft.Client/Common/res/1_2_2/mob/pigman.png new file mode 100644 index 00000000..c900b362 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/pigman.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/pigzombie.png b/Minecraft.Client/Common/res/1_2_2/mob/pigzombie.png new file mode 100644 index 00000000..0a0a25a4 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/pigzombie.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/redcow.png b/Minecraft.Client/Common/res/1_2_2/mob/redcow.png new file mode 100644 index 00000000..c0a2c976 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/redcow.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/saddle.png b/Minecraft.Client/Common/res/1_2_2/mob/saddle.png new file mode 100644 index 00000000..aaea7a6d Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/saddle.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/sheep.png b/Minecraft.Client/Common/res/1_2_2/mob/sheep.png new file mode 100644 index 00000000..647d0dd2 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/sheep.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/sheep_fur.png b/Minecraft.Client/Common/res/1_2_2/mob/sheep_fur.png new file mode 100644 index 00000000..f1291a5f Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/sheep_fur.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/silverfish.png b/Minecraft.Client/Common/res/1_2_2/mob/silverfish.png new file mode 100644 index 00000000..cc84f1d0 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/silverfish.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/skeleton.png b/Minecraft.Client/Common/res/1_2_2/mob/skeleton.png new file mode 100644 index 00000000..9d223394 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/skeleton.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/slime.png b/Minecraft.Client/Common/res/1_2_2/mob/slime.png new file mode 100644 index 00000000..42fc8736 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/slime.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/snowman.png b/Minecraft.Client/Common/res/1_2_2/mob/snowman.png new file mode 100644 index 00000000..7cab7144 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/snowman.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/spider.png b/Minecraft.Client/Common/res/1_2_2/mob/spider.png new file mode 100644 index 00000000..08344a83 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/spider.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/spider_eyes.png b/Minecraft.Client/Common/res/1_2_2/mob/spider_eyes.png new file mode 100644 index 00000000..2a7734f9 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/spider_eyes.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/squid.png b/Minecraft.Client/Common/res/1_2_2/mob/squid.png new file mode 100644 index 00000000..ff3f5b0a Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/squid.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/villager.png b/Minecraft.Client/Common/res/1_2_2/mob/villager.png new file mode 100644 index 00000000..1a496f33 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/villager.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/villager/butcher.png b/Minecraft.Client/Common/res/1_2_2/mob/villager/butcher.png new file mode 100644 index 00000000..702cb8cf Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/villager/butcher.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/villager/farmer.png b/Minecraft.Client/Common/res/1_2_2/mob/villager/farmer.png new file mode 100644 index 00000000..683c3d51 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/villager/farmer.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/villager/librarian.png b/Minecraft.Client/Common/res/1_2_2/mob/villager/librarian.png new file mode 100644 index 00000000..5b7da625 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/villager/librarian.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/villager/priest.png b/Minecraft.Client/Common/res/1_2_2/mob/villager/priest.png new file mode 100644 index 00000000..928eab46 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/villager/priest.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/villager/smith.png b/Minecraft.Client/Common/res/1_2_2/mob/villager/smith.png new file mode 100644 index 00000000..c70b4bb8 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/villager/smith.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/villager/villager.png b/Minecraft.Client/Common/res/1_2_2/mob/villager/villager.png new file mode 100644 index 00000000..aa3afde8 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/villager/villager.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/villager_golem.png b/Minecraft.Client/Common/res/1_2_2/mob/villager_golem.png new file mode 100644 index 00000000..24c46185 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/villager_golem.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/wolf.png b/Minecraft.Client/Common/res/1_2_2/mob/wolf.png new file mode 100644 index 00000000..7a723066 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/wolf.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/wolf_angry.png b/Minecraft.Client/Common/res/1_2_2/mob/wolf_angry.png new file mode 100644 index 00000000..89b3d2d6 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/wolf_angry.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/wolf_tame.png b/Minecraft.Client/Common/res/1_2_2/mob/wolf_tame.png new file mode 100644 index 00000000..d46e572c Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/wolf_tame.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/zombie.png b/Minecraft.Client/Common/res/1_2_2/mob/zombie.png new file mode 100644 index 00000000..5f39fd80 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/zombie.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/pack.png b/Minecraft.Client/Common/res/1_2_2/pack.png new file mode 100644 index 00000000..973a7cf2 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/pack.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/pack.txt b/Minecraft.Client/Common/res/1_2_2/pack.txt new file mode 100644 index 00000000..c14bb3b4 --- /dev/null +++ b/Minecraft.Client/Common/res/1_2_2/pack.txt @@ -0,0 +1,2 @@ +The default look of Minecraft + diff --git a/Minecraft.Client/Common/res/1_2_2/particles.png b/Minecraft.Client/Common/res/1_2_2/particles.png new file mode 100644 index 00000000..de34f1b9 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/particles.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/terrain.png b/Minecraft.Client/Common/res/1_2_2/terrain.png new file mode 100644 index 00000000..4d2270b8 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/terrain.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/terrain/moon.png b/Minecraft.Client/Common/res/1_2_2/terrain/moon.png new file mode 100644 index 00000000..61cebbc7 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/terrain/moon.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/terrain/moon_phases.png b/Minecraft.Client/Common/res/1_2_2/terrain/moon_phases.png new file mode 100644 index 00000000..ce239ea7 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/terrain/moon_phases.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/terrain/sun.png b/Minecraft.Client/Common/res/1_2_2/terrain/sun.png new file mode 100644 index 00000000..43ba79a9 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/terrain/sun.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/title/bg/panorama0.png b/Minecraft.Client/Common/res/1_2_2/title/bg/panorama0.png new file mode 100644 index 00000000..8ba1dadd Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/title/bg/panorama0.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/title/bg/panorama1.png b/Minecraft.Client/Common/res/1_2_2/title/bg/panorama1.png new file mode 100644 index 00000000..c16841ad Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/title/bg/panorama1.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/title/bg/panorama2.png b/Minecraft.Client/Common/res/1_2_2/title/bg/panorama2.png new file mode 100644 index 00000000..0436d776 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/title/bg/panorama2.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/title/bg/panorama3.png b/Minecraft.Client/Common/res/1_2_2/title/bg/panorama3.png new file mode 100644 index 00000000..2c7ad778 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/title/bg/panorama3.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/title/bg/panorama4.png b/Minecraft.Client/Common/res/1_2_2/title/bg/panorama4.png new file mode 100644 index 00000000..03900967 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/title/bg/panorama4.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/title/bg/panorama5.png b/Minecraft.Client/Common/res/1_2_2/title/bg/panorama5.png new file mode 100644 index 00000000..0331ad4a Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/title/bg/panorama5.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/title/black.png b/Minecraft.Client/Common/res/1_2_2/title/black.png new file mode 100644 index 00000000..dc2ad3e7 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/title/black.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/title/credits.txt b/Minecraft.Client/Common/res/1_2_2/title/credits.txt new file mode 100644 index 00000000..8f593e24 --- /dev/null +++ b/Minecraft.Client/Common/res/1_2_2/title/credits.txt @@ -0,0 +1,57 @@ +[C]§f=============== +[C]§eMinecraft Credits +[C]§f=============== + +§7Created by: +§f Markus Persson + +§7Game design, programming and graphics: +§f Markus Persson +§f Jens Bergensten + +§7Music and sound: +§f Daniel Rosenfeld + +§7Ingame artwork and paintings: +§f Kristoffer Zetterstrand + +§7End game narrative: +§f Julian Gough + +§7Website development: +§f Tobias Möllstam +§f Daniel Frisk +§f Leonard Axelsson +§f Jens Bergensten +§f Markus Persson + +§7Logo and promotional artwork: +§f Markus Toivonen + +§7Business and administration: +§f Carl Manneh +§f Daniel Kaplan + +§7Director of fun: +§f Lydia Winters + +§7Number crunching and statistics: +§f Patrick Geuder + +§7Additional programming: +§f Paul Spooner +§f Ryan 'Scaevolus' Hitchman +§f Elliot 'Hippoplatimus' Segal + +§7Technologies used: +§f Java by Oracle +§f LWJGL by many talented people +§f "3d Sound System" by Paul Lamb +§f JOrbis by JCraft + + + + + + +§f"Twenty years from now you will be more disappointed by the things that you didn't do than by the ones you did do. So throw off the bowlines. Sail away from the safe harbor. Catch the trade winds in your sails. Explore. Dream. Discover." §7- Mark Twain \ No newline at end of file diff --git a/Minecraft.Client/Common/res/1_2_2/title/earlyplayers.txt b/Minecraft.Client/Common/res/1_2_2/title/earlyplayers.txt new file mode 100644 index 00000000..eee4d7bc --- /dev/null +++ b/Minecraft.Client/Common/res/1_2_2/title/earlyplayers.txt @@ -0,0 +1,722 @@ +ez +Racccccer12 +UlyssesSlaughter +newspaperboy55 +eatwhitefish +AmpTxFeaR +danteELITE +SoulPL +Ami2804 +Infamus +Rufus1852 +Raymoo9 +Muhs +MuHW +Steelion +Zee_Man +jackpeneycad +Mugz +Goonerman97 +Mimoun +bjoel2 +Pottux +timdv +DDJD9 +Damien27 +TheEyesOfLife +muji +Private_Public +BrickInTheHead +TimeZ +rip1427 +lennonzb654 +Parger129 +Snowbar +Vladivostok1 +Ginger879 +instagibb +marhom +paramime +RyleLGS +verbel +trovanon +Thorizzle +NinjaManBLAM +mudu +Delirus +SmickeyMcgee +MathewMkay +UncleMonteh +BigZ94 +tomtheuseless +Damien76 +Muff +snijboon1 +fuzzyliam780 +Gigith +Kanten +Jimmybean +Soulsy +SoulSR +Timic +deadlus +damien86 +Timin +Hutchenstein +damien95 +azoreanjeff +quackstar84 +korokun +randomshot +Triss247 +Tythiss +Murf +samwise +Murg +loltank +Murx +Harbinger617 +musa +killian123 +gumigoo +Soulix +BrettsFly +BrianBoyko +zarkboy +Mupz +Elad98 +tkranyak +kazeako +Turbopenguin42 +Tubbywatch +zionishe +johnyliltoe +Riczone +gamesta62 +AHungryHungarian +mups +varun_nath93 +Ratherdash +XenosEriadin +Vaedritol +dannyrocker +Mull +Tonya01 +sully96 +NJL97 +interfect +novack +spacepotatoman +Timan +funkjosh +teecubed333 +Snarkout89 +Nubsawce +DoubleOBond +Vault48 +Ninjila +DevonWargod +jkjk600 +Mulm +nathan329 +Mimore +reisyukaku +Georukh +Tokiko +NotBaldwin +zerox106 +Marakuja +Murhapuro +Bigbrown4114493 +boggyman123 +peter_buchan +Doozle +jpeuvion +iNTENZOR +Muzn +David987654321 +zjcain877 +nerbil +thaboyster +mitchyslick +Sirius_Amory +slatts +AndrijaG1 +JeffersonWilson +partyvan0 +Muzk +Muwo +TaoTev +sustainablejoe +destroyer451 +mune +hivemind101 +timbo +timba +Nodlehs +robotnik185 +darthmaul22 +jtslug +Shazbar +Brawlfanboy +nickschober +Muss +AceFantastic +deloctyte +Teck87 +sOuLsK +gnomerman +Sgt_Grumbles +imgreglol +InvertedMutiny +h4rris +CommodoreSkippy +Toysrmi +Slashwrists +SickThiele +Krakatoah +rellimnoraa +Muty +TazDontTap +borscht +Mikomaxless +blamblamblam +HelloMeow +Souleh +accronym +Darkokillzall +Nathan271 +djmousey +metalchaos +GentleBro +RorySmale +vipiao +Proffen93 +EwanJackson +doozey +Mikedood +blaskkaffe +josefkenny +Burned_Toast +Gigify +Justin_Joffrion +Yourself +MysterySMJ +Newbyninja +MidgetCo +Compwiz1993 +raymosh +Lucifersknight +irrationalistic +Shazbot +Lunchebox +kansom +shoggdog +mult +Fulibor +Murr +bails12 +Runn3R +scottlfc96 +Tim_K +Acctubi +suckonmyproness +Heenix +Fudgelette +deadmat +RedMageZidane +lukyluke +TaosSW +tegera1 +ThePaperclip +Arcsoft +Nik_Mahmood +Mark42 +Novaok +instagibz +ophelia123 +Mulk +nyleva +tazelhoff +liamh101 +lichking155 +drunkster +Timothy +Munk +Ginger987 +link825 +verado +markaidos13 +Sniper_Kill98 +czechplz +Sanctuary1 +TheBrokenOne +bdogproductions1 +mvit +LewisBroderick +Verace +picardan +Eskill +VictoriouSecret +Knightstrike +StatutoryApe66 +drewscreations +ollieg80 +anuador +Magneticmyst +Alaflex +OneOfTheAbove +TheEvilPenguin +Eskilo +voigt88 +ArtfulDodger42 +ws141 +BlondeUnknown +Pillsbury27530 +Stressless +DoctorProto +Evil_Otto +piippe +gohoosiers29 +Tullymanbanana +erikolanan +Muzy +loopylouise +drakkheim +VJ396768 +Invisix +Nametaker40 +mwoody +Jalathas +Wyrelade +starjik +Verail +frjulia +Mutagen +Zed_Boss +babymuseum +squiresfan +lephareamousse +Tilex +Larrss12 +VorSandwich +wollemamoth +Exodeux +O8GC +Keeko15 +danjt42 +farmerfarley +Ryan_Cook +Zharger +squalllion1uk +10882 +SLAPPAYURFACE +Tilan +nukerman +Arachnid0101 +Bzkill +toshiro7 +Link777 +ethos231 +olliedag +garrison888 +atronajs +Rafiki1996 +devinmrn +PutNameHere +JasonFozzy +ddj88 +MinwuWhite +imedio +JCabasquini +Raymose +Wyvryn +Artemisser +jcurses +Levis96 +MVec +Intenzio +Antthemighty +Coltrex +luckydog1123 +Utterballe +Kahdgar +doom195 +Bb505 +mnj777 +Teuprobont +koroke2 +ImaShortKid +Doomliquor +mvst +Helelos +Shuma22 +Zxcvbnmkj +TiLeN +spintherism +Aellia +Wrenky +Bipolarbear +TheShipoopi +Barkerman47 +Atercrest +ZeroPoints +Techvi +austinpika +Jinjithillion +PaRaDOX_578 +rocketseed +m616vp +GrasshopperInPJs +snyper1243 +Tash_Michael +Llamathelegend +MidgetMe +SOCCERKICK +Link709 +nathan420 +pleasedont +pants12 +Tilon +Tuddywutwut +slatie +Marict +bobless +musp +bigkev169 +AngryRhetoric +MisterYura +guster11 +thommyt +DiannaoChong +Nernums +Dartheh +Nyholtern +ApertureSci +heythomwhatsup +DarthFJ +sfbobz +Tiksi +irishgranader +LichKing112 +tim96 +tim92 +karlos_kumma +lomelith +flyers1980 +Penzane121 +p0megranates +xKRYPTiiCx +TheXshot +mrtibgfdk +techne +alanaki2 +derlandsknecht +Regrub +SgtWesticles +Tee_Bee +3b +eljay808 +George1997 +magnusgerner +MOMA231 +Mariko +haffissx +str3ss +Arkanatos +Ereh_Dogon +Tokida +Crimsonwave +NECHTOVIKING +dakota6565 +unjustend +kanuck +uncountedvermin +Dreamslinger +zach_pwns1 +mini_ninja +Timoteh +Hoppip +GracefulTed +The_WasteLands +TyphoonFour +TheNetherhero +namapus +Clowreisung +Mariel +jyscal +AndyR311 +hoshinokaze +Genshinin +Eddie0715 +erikadair +o7uk +DINOhurp +Sheridan +runnie +Eskiel +starian +Sakisbrat +Symbiote100 +Aramande +kantra +Gundozer +bongis1 +Mwonti +guspa01 +lightjedi5 +Darthim +asian0sensation +Techie +andocmdo +PatrickDyderski +pottan +darthd1 +8U +JetForceGemini1 +tk300 +thomjoo +dragonking17 +leekyboy +spike6599 +Anthony_Stone +TehJammers +LudVichzme +Crunchy_Chicken +Asytra +Hopper +Kantos +Starion +Xaiano +Tim87 +kurtje89 +ansemx13 +tiong +Tony_Perkis +Cephalopod +techk8 +Abbsence +NeonLotus +Slaveg +marfnl +Balisung +Funky_Zebra +xblah1242 +Leprkan +VerbNounGuy +MegaLoser +Delirix +Eladon +tman12354 +clorigu2 +Sputters +UnlabledMilk +Techin +Mark15 +scriptersx +starink +DGmustard +MarioG +Csheroe +nnutnut +TheCloak +shodan1138 +bigz2k +Tikot +TheAndy97 +L4rsThomas +mario1 +mariok +tadtad994 +bsdpunk +BigZ33 +LittleRaptor +Cazif +mwnj +Kjermy +TheKanKin +cousinoer5 +Goddish +Feragon +Adz666 +Radar38 +AK47Xeall +41dasircyril27 +Cazic +RinPinion +skinnyondrums +Nehmulos +User123abc +JockBassman +DragonKing06 +xXcr1sXx +Groblox +bonghit +cy1337 +exzzz +Kantuz +Jemeni +aronz11 +Nepthan +FlygonWing +MechaDolphin +Gamoocha +stark62 +raven10165 +MrBlackswordsman +wanderingman +fzuul +RedneckNinja +Cygggy +Navysealcdr +KenjiNinja +GaMeOvEr_Mac +Dr_Zandi +jiffman +Synthetic_Moose +kittemusen +Asyvan +GamerTheHut +Tim34 +g33kster +memnarch +Cazen +BLASTER504 +Nylhin +ClosetAxelsexual +toxicman44 +MrSalvador +Locaido +slava8 +vangunda +Tricky14 +Nathan051 +8BitAce +swashyson +juxxi +jclong98 +andy8271 +crystaldeluxe +Bongers +mariio +michellevisuano +glendrine +Rockeysa +DrillDazer +slaven +doclobsta +jcirque +Aldurg +underd0g +Blockbyblockx +Lathyrus +bjogje +Harbulblum +Jemeyr +faja2485 +jojo11 +muushu +McTwist +Parilax +BumTheBobo +Jerkakame +hawkeyeff7 +Xsdfa +JoJo07 +mwtb +proffenke +endairo +Kintine +wraytehbeast +onarga88 +Scoodles +Kurunth +Madcat2575 +MothBones +Grindforit +CaptMarion +RjRocket +abbysall19 +nicksandvich +Lil_Richard3 +onigame +DarthG1 +Swiftnsilent +Mini_Zen +hmv007 +my2k +McDeathNugget +Tinus +ag00dnewb +MarioZ +matidios +runjmc +cazjs +Blue1681 +Parilus +asger1002 +AzraelEternity +npack72 +KingGeebs +kmmeerts +samwii1 +tiohn +Bigbyrd39 +damienix +nathan105 +MartianCat +CraimerX +ErikyErik +TheClock +n1njabread +levinet +Dagabond +Supernurd +TNASESRaider +saki2fifty +green731 +Tnextdoor +jojo56 +lolcoptr +Tekneus +Sockrates +CraZyKoKeNo +PillowTalk +darkconsole +aus_smurf +Mwoa +Starman_MD +Dr_Tom +Dooxie +Feralparrot +Ewstar +Bonedust +MrTomnus +Marexx +RoughOutline +Bugler +Wonderwhale +nikeneo +damieng0 +Lolsarfesh +jemen9 +sdsmittie +MarkSoupial +Danthefat2 +TechTF +darkquilan +shnoka +DamienDe +JrFlav +ExiledRen1250 +theevilone +Disciple_of_Bob +lazormaggot +grantcallahan +MnehDroid +xnoobonex +slax01 +MarfXD +sniperwolf329 +ChestStrongwell +Poundcake \ No newline at end of file diff --git a/Minecraft.Client/Common/res/1_2_2/title/mclogo.png b/Minecraft.Client/Common/res/1_2_2/title/mclogo.png new file mode 100644 index 00000000..a69254d2 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/title/mclogo.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/title/mojang.png b/Minecraft.Client/Common/res/1_2_2/title/mojang.png new file mode 100644 index 00000000..023f0b4f Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/title/mojang.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/title/splashes.txt b/Minecraft.Client/Common/res/1_2_2/title/splashes.txt new file mode 100644 index 00000000..567f890d --- /dev/null +++ b/Minecraft.Client/Common/res/1_2_2/title/splashes.txt @@ -0,0 +1,304 @@ +This message will never appear on the splash screen, isn't that weird? +Hobo humping slobo babe! +This text is hard to read if you play the game at the default resolution, but at 1080p it's fine! +As seen on TV! +Awesome! +100% pure! +May contain nuts! +Better than Prey! +More polygons! +Sexy! +Limited edition! +Flashing letters! +Made by Notch! +It's here! +Best in class! +It's finished! +Kind of dragon free! +Excitement! +More than 500 sold! +One of a kind! +Heaps of hits on YouTube! +Indev! +Spiders everywhere! +Check it out! +Holy cow, man! +It's a game! +Made in Sweden! +Uses LWJGL! +Reticulating splines! +Minecraft! +Yaaay! +Singleplayer! +Keyboard compatible! +Undocumented! +Ingots! +Exploding creepers! +That's no moon! +l33t! +Create! +Survive! +Dungeon! +Exclusive! +The bee's knees! +Down with O.P.P.! +Closed source! +Classy! +Wow! +Not on steam! +Oh man! +Awesome community! +Pixels! +Teetsuuuuoooo! +Kaaneeeedaaaa! +Now with difficulty! +Enhanced! +90% bug free! +Pretty! +12 herbs and spices! +Fat free! +Absolutely no memes! +Free dental! +Ask your doctor! +Minors welcome! +Cloud computing! +Legal in Finland! +Hard to label! +Technically good! +Bringing home the bacon! +Indie! +GOTY! +Ceci n'est pas une title screen! +Euclidian! +Now in 3D! +Inspirational! +Herregud! +Complex cellular automata! +Yes, sir! +Played by cowboys! +OpenGL 1.2! +Thousands of colors! +Try it! +Age of Wonders is better! +Try the mushroom stew! +Sensational! +Hot tamale, hot hot tamale! +Play him off, keyboard cat! +Guaranteed! +Macroscopic! +Bring it on! +Random splash! +Call your mother! +Monster infighting! +Loved by millions! +Ultimate edition! +Freaky! +You've got a brand new key! +Water proof! +Uninflammable! +Whoa, dude! +All inclusive! +Tell your friends! +NP is not in P! +Notch <3 ez! +Music by C418! +Livestreamed! +Haunted! +Polynomial! +Terrestrial! +All is full of love! +Full of stars! +Scientific! +Cooler than Spock! +Collaborate and listen! +Never dig down! +Take frequent breaks! +Not linear! +Han shot first! +Nice to meet you! +Buckets of lava! +Ride the pig! +Larger than Earth! +sqrt(-1) love you! +Phobos anomaly! +Punching wood! +Falling off cliffs! +0% sugar! +150% hyperbole! +Synecdoche! +Let's danec! +Seecret Friday update! +Reference implementation! +Lewd with two dudes with food! +Kiss the sky! +20 GOTO 10! +Verlet intregration! +Peter Griffin! +Do not distribute! +Cogito ergo sum! +4815162342 lines of code! +A skeleton popped out! +The Work of Notch! +The sum of its parts! +BTAF used to be good! +I miss ADOM! +umop-apisdn! +OICU812! +Bring me Ray Cokes! +Finger-licking! +Thematic! +Pneumatic! +Sublime! +Octagonal! +Une baguette! +Gargamel plays it! +Rita is the new top dog! +SWM forever! +Representing Edsbyn! +Matt Damon! +Supercalifragilisticexpialidocious! +Consummate V's! +Cow Tools! +Double buffered! +Fan fiction! +Flaxkikare! +Jason! Jason! Jason! +Hotter than the sun! +Internet enabled! +Autonomous! +Engage! +Fantasy! +DRR! DRR! DRR! +Kick it root down! +Regional resources! +Woo, facepunch! +Woo, somethingawful! +Woo, /v/! +Woo, tigsource! +Woo, minecraftforum! +Woo, worldofminecraft! +Woo, reddit! +Woo, 2pp! +Google anlyticsed! +Now supports åäö! +Give us Gordon! +Tip your waiter! +Very fun! +12345 is a bad password! +Vote for net neutrality! +Lives in a pineapple under the sea! +MAP11 has two names! +Omnipotent! +Gasp! +...! +Bees, bees, bees, bees! +Jag känner en bot! +Haha, LOL! +Hampsterdance! +Switches and ores! +Menger sponge! +idspispopd! +Eple (original edit)! +So fresh, so clean! +Slow acting portals! +Try the Nether! +Don't look directly at the bugs! +Oh, ok, Pigmen! +Finally with ladders! +Scary! +Play Minecraft, Watch Topgear, Get Pig! +Twittered about! +Jump up, jump up, and get down! +Joel is neat! +A riddle, wrapped in a mystery! +Huge tracts of land! +Welcome to your Doom! +Stay a while, stay forever! +Stay a while and listen! +Treatment for your rash! +"Autological" is! +Information wants to be free! +"Almost never" is an interesting concept! +Lots of truthiness! +The creeper is a spy! +Turing complete! +It's groundbreaking! +Let our battle's begin! +The sky is the limit! +Jeb has amazing hair! +Casual gaming! +Undefeated! +Kinda like Lemmings! +Follow the train, CJ! +Leveraging synergy! +DungeonQuest is unfair! +110813! +90210! +Check out the far lands! +Tyrion would love it! +Also try VVVVVV! +Also try Super Meat Boy! +Also try Terraria! +Also try Mount And Blade! +Also try Project Zomboid! +Also try World of Goo! +Also try Limbo! +Also try Pixeljunk Shooter! +Also try Braid! +That's super! +Bread is pain! +Read more books! +Khaaaaaaaaan! +Less addictive than TV Tropes! +More addictive than lemonade! +Bigger than a bread box! +Millions of peaches! +Fnord! +This is my true form! +Totally forgot about Dre! +Don't bother with the clones! +Pumpkinhead! +Made by Jeb! +Has an ending! +Finally complete! +Feature packed! +Boots with the fur! +Stop, hammertime! +Testificates! +Conventional! +Homeomorphic to a 3-sphere! +Doesn't avoid double negatives! +Place ALL the blocks! +Does barrel rolls! +Meeting expectations! +PC gaming since 1873! +Ghoughpteighbteau tchoghs! +Déjà vu! +Déjà vu! +Got your nose! +Haley loves Elan! +Afraid of the big, black bat! +Doesn't use the U-word! +Child's play! +See you next Friday or so! +From the streets of Södermalm! +150 bpm for 400000 minutes! +Technologic! +Funk soul brother! +Pumpa kungen! +日本ハロー! +한국 안녕하세요! +Helo Cymru! +Cześć Polska! +你好中国! +Привет Россия! +Γεια σου Ελλάδα! +My life for Aiur! +Lennart lennart = new Lennart(); +I see your vocabulary has improved! +Who put it there? +You can't explain that! +if not ok then return end +§1C§2o§3l§4o§5r§6m§7a§8t§9i§ac +§kFUNKY LOL +SOPA means LOSER in Swedish diff --git a/Minecraft.Client/Common/res/1_2_2/title/win.txt b/Minecraft.Client/Common/res/1_2_2/title/win.txt new file mode 100644 index 00000000..72775248 --- /dev/null +++ b/Minecraft.Client/Common/res/1_2_2/title/win.txt @@ -0,0 +1,151 @@ +§3I see the player you mean. + +§2PLAYERNAME? + +§3Yes. Take care. It has reached a higher level now. It can read our thoughts. + +§2That doesn't matter. It thinks we are part of the game. + +§3I like this player. It played well. It did not give up. + +§2It is reading our thoughts as though they were words on a screen. + +§3That is how it chooses to imagine many things, when it is deep in the dream of a game. + +§2Words make a wonderful interface. Very flexible. And less terrifying than staring at the reality behind the screen. + +§3They used to hear voices. Before players could read. Back in the days when those who did not play called the players witches, and warlocks. And players dreamed they flew through the air, on sticks powered by demons. + +§2What did this player dream? + +§3This player dreamed of sunlight and trees. Of fire and water. It dreamed it created. And it dreamed it destroyed. It dreamed it hunted, and was hunted. It dreamed of shelter. + +§2Hah, the original interface. A million years old, and it still works. But what true structure did this player create, in the reality behind the screen? + +§3It worked, with a million others, to sculpt a true world in a fold of the §f§k§a§b§3, and created a §f§k§a§b§3 for §f§k§a§b§3, in the §f§k§a§b§3. + +§2It cannot read that thought. + +§3No. It has not yet achieved the highest level. That, it must achieve in the long dream of life, not the short dream of a game. + +§2Does it know that we love it? That the universe is kind? + +§3Sometimes, through the noise of its thoughts, it hears the universe, yes. + +§2But there are times it is sad, in the long dream. It creates worlds that have no summer, and it shivers under a black sun, and it takes its sad creation for reality. + +§3To cure it of sorrow would destroy it. The sorrow is part of its own private task. We cannot interfere. + +§2Sometimes when they are deep in dreams, I want to tell them, they are building true worlds in reality. Sometimes I want to tell them of their importance to the universe. Sometimes, when they have not made a true connection in a while, I want to help them to speak the word they fear. + +§3It reads our thoughts. + +§2Sometimes I do not care. Sometimes I wish to tell them, this world you take for truth is merely §f§k§a§b§2 and §f§k§a§b§2, I wish to tell them that they are §f§k§a§b§2 in the §f§k§a§b§2. They see so little of reality, in their long dream. + +§3And yet they play the game. + +§2But it would be so easy to tell them... + +§3Too strong for this dream. To tell them how to live is to prevent them living. + +§2I will not tell the player how to live. + +§3The player is growing restless. + +§2I will tell the player a story. + +§3But not the truth. + +§2No. A story that contains the truth safely, in a cage of words. Not the naked truth that can burn over any distance. + +§3Give it a body, again. + +§2Yes. Player... + +§3Use its name. + +§2PLAYERNAME. Player of games. + +§3Good. + +§2Take a breath, now. Take another. Feel air in your lungs. Let your limbs return. Yes, move your fingers. Have a body again, under gravity, in air. Respawn in the long dream. There you are. Your body touching the universe again at every point, as though you were separate things. As though we were separate things. + +§3Who are we? Once we were called the spirit of the mountain. Father sun, mother moon. Ancestral spirits, animal spirits. Jinn. Ghosts. The green man. Then gods, demons. Angels. Poltergeists. Aliens, extraterrestrials. Leptons, quarks. The words change. We do not change. + +§2We are the universe. We are everything you think isn't you. You are looking at us now, through your skin and your eyes. And why does the universe touch your skin, and throw light on you? To see you, player. To know you. And to be known. I shall tell you a story. + +§2Once upon a time, there was a player. + +§3The player was you, PLAYERNAME. + +§2Sometimes it thought itself human, on the thin crust of a spinning globe of molten rock. The ball of molten rock circled a ball of blazing gas that was three hundred and thirty thousand times more massive than it. They were so far apart that light took eight minutes to cross the gap. The light was information from a star, and it could burn your skin from a hundred and fifty million kilometres away. + +§2Sometimes the player dreamed it was a miner, on the surface of a world that was flat, and infinite. The sun was a square of white. The days were short; there was much to do; and death was a temporary inconvenience. + +§3Sometimes the player dreamed it was lost in a story. + +§2Sometimes the player dreamed it was other things, in other places. Sometimes these dreams were disturbing. Sometimes very beautiful indeed. Sometimes the player woke from one dream into another, then woke from that into a third. + +§3Sometimes the player dreamed it watched words on a screen. + +§2Let's go back. + +§2The atoms of the player were scattered in the grass, in the rivers, in the air, in the ground. A woman gathered the atoms; she drank and ate and inhaled; and the woman assembled the player, in her body. + +§2And the player awoke, from the warm, dark world of its mother's body, into the long dream. + +§2And the player was a new story, never told before, written in letters of DNA. And the player was a new program, never run before, generated by a sourcecode a billion years old. And the player was a new human, never alive before, made from nothing but milk and love. + +§3You are the player. The story. The program. The human. Made from nothing but milk and love. + +§2Let's go further back. + +§2The seven billion billion billion atoms of the player's body were created, long before this game, in the heart of a star. So the player, too, is information from a star. And the player moves through a story, which is a forest of information planted by a man called Julian, on a flat, infinite world created by a man called Markus, that exists inside a small, private world created by the player, who inhabits a universe created by... + +§3Shush. Sometimes the player created a small, private world that was soft and warm and simple. Sometimes hard, and cold, and complicated. Sometimes it built a model of the universe in its head; flecks of energy, moving through vast empty spaces. Sometimes it called those flecks "electrons" and "protons". + +§2Sometimes it called them "planets" and "stars". + +§2Sometimes it believed it was in a universe that was made of energy that was made of offs and ons; zeros and ones; lines of code. Sometimes it believed it was playing a game. Sometimes it believed it was reading words on a screen. + +§3You are the player, reading words... + +§2Shush... Sometimes the player read lines of code on a screen. Decoded them into words; decoded words into meaning; decoded meaning into feelings, emotions, theories, ideas, and the player started to breathe faster and deeper and realised it was alive, it was alive, those thousand deaths had not been real, the player was alive + +§3You. You. You are alive. + +§2and sometimes the player believed the universe had spoken to it through the sunlight that came through the shuffling leaves of the summer trees + +§3and sometimes the player believed the universe had spoken to it through the light that fell from the crisp night sky of winter, where a fleck of light in the corner of the player's eye might be a star a million times as massive as the sun, boiling its planets to plasma in order to be visible for a moment to the player, walking home at the far side of the universe, suddenly smelling food, almost at the familiar door, about to dream again + +§2and sometimes the player believed the universe had spoken to it through the zeros and ones, through the electricity of the world, through the scrolling words on a screen at the end of a dream + +§3and the universe said I love you + +§2and the universe said you have played the game well + +§3and the universe said everything you need is within you + +§2and the universe said you are stronger than you know + +§3and the universe said you are the daylight + +§2and the universe said you are the night + +§3and the universe said the darkness you fight is within you + +§2and the universe said the light you seek is within you + +§3and the universe said you are not alone + +§2and the universe said you are not separate from every other thing + +§3and the universe said you are the universe tasting itself, talking to itself, reading its own code + +§2and the universe said I love you because you are love. + +§3And the game was over and the player woke up from the dream. And the player began a new dream. And the player dreamed again, dreamed better. And the player was the universe. And the player was love. + +§3You are the player. + +§2Wake up. diff --git a/Minecraft.Client/Common/res/TitleUpdate/DLC/Candy/Data/TexturePack.xzp b/Minecraft.Client/Common/res/TitleUpdate/DLC/Candy/Data/TexturePack.xzp new file mode 100644 index 00000000..2eae0020 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/DLC/Candy/Data/TexturePack.xzp differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/DLC/Candy/Data/x16Data.pck b/Minecraft.Client/Common/res/TitleUpdate/DLC/Candy/Data/x16Data.pck new file mode 100644 index 00000000..7c548119 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/DLC/Candy/Data/x16Data.pck differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/DLC/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 new file mode 100644 index 00000000..d96eeeee Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/DLC/City/Data/TexturePack.xzp differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/DLC/City/Data/x32Data.pck b/Minecraft.Client/Common/res/TitleUpdate/DLC/City/Data/x32Data.pck new file mode 100644 index 00000000..52f0f98f Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/DLC/City/Data/x32Data.pck differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/DLC/Fantasy/Data/TexturePack.xzp b/Minecraft.Client/Common/res/TitleUpdate/DLC/Fantasy/Data/TexturePack.xzp new file mode 100644 index 00000000..00b9d61c Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/DLC/Fantasy/Data/TexturePack.xzp differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/DLC/Fantasy/Data/x32Data.pck b/Minecraft.Client/Common/res/TitleUpdate/DLC/Fantasy/Data/x32Data.pck new file mode 100644 index 00000000..103a8d82 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/DLC/Fantasy/Data/x32Data.pck differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/DLC/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 new file mode 100644 index 00000000..ca0a01ad Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/DLC/Halloween/Data/TexturePack.xzp differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/DLC/Halloween/Data/x16Data.pck b/Minecraft.Client/Common/res/TitleUpdate/DLC/Halloween/Data/x16Data.pck new file mode 100644 index 00000000..f519e006 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/DLC/Halloween/Data/x16Data.pck differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/DLC/Halo/Data/GameRules.grf b/Minecraft.Client/Common/res/TitleUpdate/DLC/Halo/Data/GameRules.grf new file mode 100644 index 00000000..05fb95d1 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/DLC/Halo/Data/GameRules.grf differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/DLC/Halo/Data/TexturePack.xzp b/Minecraft.Client/Common/res/TitleUpdate/DLC/Halo/Data/TexturePack.xzp new file mode 100644 index 00000000..908ce222 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/DLC/Halo/Data/TexturePack.xzp differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/DLC/Halo/Data/x16Data.pck b/Minecraft.Client/Common/res/TitleUpdate/DLC/Halo/Data/x16Data.pck new file mode 100644 index 00000000..7e2c79bf Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/DLC/Halo/Data/x16Data.pck differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/DLC/Halo/TexturePack.pck b/Minecraft.Client/Common/res/TitleUpdate/DLC/Halo/TexturePack.pck new file mode 100644 index 00000000..5820cd20 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/DLC/Halo/TexturePack.pck differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/DLC/MassEffect/Data/GameRules.grf b/Minecraft.Client/Common/res/TitleUpdate/DLC/MassEffect/Data/GameRules.grf new file mode 100644 index 00000000..48816b27 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/DLC/MassEffect/Data/GameRules.grf differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/DLC/MassEffect/Data/TexturePack.xzp b/Minecraft.Client/Common/res/TitleUpdate/DLC/MassEffect/Data/TexturePack.xzp new file mode 100644 index 00000000..3f021e56 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/DLC/MassEffect/Data/TexturePack.xzp differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/DLC/MassEffect/Data/masseffect.mcs b/Minecraft.Client/Common/res/TitleUpdate/DLC/MassEffect/Data/masseffect.mcs new file mode 100644 index 00000000..fdb2b532 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/DLC/MassEffect/Data/masseffect.mcs differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/DLC/MassEffect/Data/x16Data.pck b/Minecraft.Client/Common/res/TitleUpdate/DLC/MassEffect/Data/x16Data.pck new file mode 100644 index 00000000..85ac50a8 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/DLC/MassEffect/Data/x16Data.pck differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/DLC/MassEffect/TexturePack.pck b/Minecraft.Client/Common/res/TitleUpdate/DLC/MassEffect/TexturePack.pck new file mode 100644 index 00000000..1b60faf7 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/DLC/MassEffect/TexturePack.pck differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/DLC/Natural/Data/TexturePack.xzp b/Minecraft.Client/Common/res/TitleUpdate/DLC/Natural/Data/TexturePack.xzp new file mode 100644 index 00000000..a5509dff Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/DLC/Natural/Data/TexturePack.xzp differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/DLC/Natural/Data/x32Data.pck b/Minecraft.Client/Common/res/TitleUpdate/DLC/Natural/Data/x32Data.pck new file mode 100644 index 00000000..d211b05c Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/DLC/Natural/Data/x32Data.pck differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/DLC/Plastic/Data/TexturePack.xzp b/Minecraft.Client/Common/res/TitleUpdate/DLC/Plastic/Data/TexturePack.xzp new file mode 100644 index 00000000..3f3cceea Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/DLC/Plastic/Data/TexturePack.xzp differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/DLC/Plastic/Data/x16Data.pck b/Minecraft.Client/Common/res/TitleUpdate/DLC/Plastic/Data/x16Data.pck new file mode 100644 index 00000000..3e9f17fd Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/DLC/Plastic/Data/x16Data.pck differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/DLC/Skyrim/Data/GameRules.grf b/Minecraft.Client/Common/res/TitleUpdate/DLC/Skyrim/Data/GameRules.grf new file mode 100644 index 00000000..d52e6b03 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/DLC/Skyrim/Data/GameRules.grf differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/DLC/Skyrim/Data/TexturePack.xzp b/Minecraft.Client/Common/res/TitleUpdate/DLC/Skyrim/Data/TexturePack.xzp new file mode 100644 index 00000000..a0ad5910 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/DLC/Skyrim/Data/TexturePack.xzp differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/DLC/Skyrim/Data/x16Data.pck b/Minecraft.Client/Common/res/TitleUpdate/DLC/Skyrim/Data/x16Data.pck new file mode 100644 index 00000000..1560a2c1 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/DLC/Skyrim/Data/x16Data.pck differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/DLC/Skyrim/TexturePack.pck b/Minecraft.Client/Common/res/TitleUpdate/DLC/Skyrim/TexturePack.pck new file mode 100644 index 00000000..2f52919d Binary files /dev/null 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 new file mode 100644 index 00000000..e506da13 Binary files /dev/null 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/AdditionalMusic.xwb b/Minecraft.Client/Common/res/TitleUpdate/audio/AdditionalMusic.xwb new file mode 100644 index 00000000..ebea388f Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/audio/AdditionalMusic.xwb differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/audio/Minecraft.xgs b/Minecraft.Client/Common/res/TitleUpdate/audio/Minecraft.xgs new file mode 100644 index 00000000..c6e34ce0 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/audio/Minecraft.xgs differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/audio/additional.xsb b/Minecraft.Client/Common/res/TitleUpdate/audio/additional.xsb new file mode 100644 index 00000000..86c6ac69 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/audio/additional.xsb differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/audio/additional.xwb b/Minecraft.Client/Common/res/TitleUpdate/audio/additional.xwb new file mode 100644 index 00000000..983306db Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/audio/additional.xwb differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/audio/minecraft.xsb b/Minecraft.Client/Common/res/TitleUpdate/audio/minecraft.xsb new file mode 100644 index 00000000..2154729d Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/audio/minecraft.xsb differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/armor/cloth_1.png b/Minecraft.Client/Common/res/TitleUpdate/res/armor/cloth_1.png new file mode 100644 index 00000000..ebcfc411 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/armor/cloth_1.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/armor/cloth_1_b.png b/Minecraft.Client/Common/res/TitleUpdate/res/armor/cloth_1_b.png new file mode 100644 index 00000000..546397d5 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/armor/cloth_1_b.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/armor/cloth_2.png b/Minecraft.Client/Common/res/TitleUpdate/res/armor/cloth_2.png new file mode 100644 index 00000000..8d8bba6c Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/armor/cloth_2.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/armor/cloth_2_b.png b/Minecraft.Client/Common/res/TitleUpdate/res/armor/cloth_2_b.png new file mode 100644 index 00000000..56556598 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/armor/cloth_2_b.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/armor/power.png b/Minecraft.Client/Common/res/TitleUpdate/res/armor/power.png new file mode 100644 index 00000000..809539ca Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/armor/power.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/art/kz.png b/Minecraft.Client/Common/res/TitleUpdate/res/art/kz.png new file mode 100644 index 00000000..4cb9a07c Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/art/kz.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/colours.col b/Minecraft.Client/Common/res/TitleUpdate/res/colours.col new file mode 100644 index 00000000..ebdcf7a9 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/colours.col differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/colours.xml b/Minecraft.Client/Common/res/TitleUpdate/res/colours.xml new file mode 100644 index 00000000..6c45b660 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/res/colours.xml @@ -0,0 +1,299 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/font/Default.png b/Minecraft.Client/Common/res/TitleUpdate/res/font/Default.png new file mode 100644 index 00000000..9c499811 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/font/Default.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/font/Mojangles_11.png b/Minecraft.Client/Common/res/TitleUpdate/res/font/Mojangles_11.png new file mode 100644 index 00000000..32cbd515 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/font/Mojangles_11.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/font/Mojangles_7.png b/Minecraft.Client/Common/res/TitleUpdate/res/font/Mojangles_7.png new file mode 100644 index 00000000..7a1b3870 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/font/Mojangles_7.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/item/book.png b/Minecraft.Client/Common/res/TitleUpdate/res/item/book.png new file mode 100644 index 00000000..708eaab6 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/item/book.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/item/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/enderchest.png b/Minecraft.Client/Common/res/TitleUpdate/res/item/enderchest.png new file mode 100644 index 00000000..dc26c059 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/item/enderchest.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/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 new file mode 100644 index 00000000..5456083c Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/items.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/misc/additionalmapicons.png b/Minecraft.Client/Common/res/TitleUpdate/res/misc/additionalmapicons.png new file mode 100644 index 00000000..3f61270b Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/misc/additionalmapicons.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/misc/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/misc/explosion.png b/Minecraft.Client/Common/res/TitleUpdate/res/misc/explosion.png new file mode 100644 index 00000000..242d9115 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/misc/explosion.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/misc/footprint.png b/Minecraft.Client/Common/res/TitleUpdate/res/misc/footprint.png new file mode 100644 index 00000000..2260afeb Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/misc/footprint.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/misc/glint.png b/Minecraft.Client/Common/res/TitleUpdate/res/misc/glint.png new file mode 100644 index 00000000..ec9a3d1c Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/misc/glint.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/misc/mapicons.png b/Minecraft.Client/Common/res/TitleUpdate/res/misc/mapicons.png new file mode 100644 index 00000000..8371a52a Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/misc/mapicons.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/misc/particlefield.png b/Minecraft.Client/Common/res/TitleUpdate/res/misc/particlefield.png new file mode 100644 index 00000000..ea256619 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/misc/particlefield.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/misc/tunnel.png b/Minecraft.Client/Common/res/TitleUpdate/res/misc/tunnel.png new file mode 100644 index 00000000..2f82e845 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/misc/tunnel.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/mob/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/enderdragon/beam.png b/Minecraft.Client/Common/res/TitleUpdate/res/mob/enderdragon/beam.png new file mode 100644 index 00000000..9ddd1d15 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/mob/enderdragon/beam.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/mob/enderdragon/ender.png b/Minecraft.Client/Common/res/TitleUpdate/res/mob/enderdragon/ender.png new file mode 100644 index 00000000..f82ef136 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/mob/enderdragon/ender.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/mob/enderdragon/ender_eyes.png b/Minecraft.Client/Common/res/TitleUpdate/res/mob/enderdragon/ender_eyes.png new file mode 100644 index 00000000..b16c9a50 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/mob/enderdragon/ender_eyes.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/mob/enderman_eyes.png b/Minecraft.Client/Common/res/TitleUpdate/res/mob/enderman_eyes.png new file mode 100644 index 00000000..5e3f4782 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/mob/enderman_eyes.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/mob/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/redcow.png b/Minecraft.Client/Common/res/TitleUpdate/res/mob/redcow.png new file mode 100644 index 00000000..1d94cc0d Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/mob/redcow.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/mob/skeleton_wither.png b/Minecraft.Client/Common/res/TitleUpdate/res/mob/skeleton_wither.png new file mode 100644 index 00000000..b0db19df Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/mob/skeleton_wither.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/mob/snowman.png b/Minecraft.Client/Common/res/TitleUpdate/res/mob/snowman.png new file mode 100644 index 00000000..be61ec92 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/mob/snowman.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/mob/villager/butcher.png b/Minecraft.Client/Common/res/TitleUpdate/res/mob/villager/butcher.png new file mode 100644 index 00000000..935352f1 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/mob/villager/butcher.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/mob/villager/farmer.png b/Minecraft.Client/Common/res/TitleUpdate/res/mob/villager/farmer.png new file mode 100644 index 00000000..d01778ab Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/mob/villager/farmer.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/mob/villager/librarian.png b/Minecraft.Client/Common/res/TitleUpdate/res/mob/villager/librarian.png new file mode 100644 index 00000000..73b99518 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/mob/villager/librarian.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/mob/villager/priest.png b/Minecraft.Client/Common/res/TitleUpdate/res/mob/villager/priest.png new file mode 100644 index 00000000..14ae9398 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/mob/villager/priest.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/mob/villager/smith.png b/Minecraft.Client/Common/res/TitleUpdate/res/mob/villager/smith.png new file mode 100644 index 00000000..a97c37f9 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/mob/villager/smith.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/mob/villager/villager.png b/Minecraft.Client/Common/res/TitleUpdate/res/mob/villager/villager.png new file mode 100644 index 00000000..f002b0e5 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/mob/villager/villager.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/mob/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/mob/wolf_collar.png b/Minecraft.Client/Common/res/TitleUpdate/res/mob/wolf_collar.png new file mode 100644 index 00000000..62d85725 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/mob/wolf_collar.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/mob/wolf_tame.png b/Minecraft.Client/Common/res/TitleUpdate/res/mob/wolf_tame.png new file mode 100644 index 00000000..18830a05 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/mob/wolf_tame.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/mob/zombie.png b/Minecraft.Client/Common/res/TitleUpdate/res/mob/zombie.png new file mode 100644 index 00000000..333fcd6e Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/mob/zombie.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/mob/zombie_villager.png b/Minecraft.Client/Common/res/TitleUpdate/res/mob/zombie_villager.png new file mode 100644 index 00000000..0b2cecef Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/mob/zombie_villager.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/particles.png b/Minecraft.Client/Common/res/TitleUpdate/res/particles.png new file mode 100644 index 00000000..aed54da5 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/particles.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/terrain.png b/Minecraft.Client/Common/res/TitleUpdate/res/terrain.png new file mode 100644 index 00000000..0246b41d Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/terrain.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/terrainMipMapLevel2.png b/Minecraft.Client/Common/res/TitleUpdate/res/terrainMipMapLevel2.png new file mode 100644 index 00000000..02686b3e Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/terrainMipMapLevel2.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/terrainMipMapLevel3.png b/Minecraft.Client/Common/res/TitleUpdate/res/terrainMipMapLevel3.png new file mode 100644 index 00000000..dddef615 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/terrainMipMapLevel3.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/fire_0.png b/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/fire_0.png new file mode 100644 index 00000000..cf8910f6 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/fire_0.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/fire_0.txt b/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/fire_0.txt new file mode 100644 index 00000000..58d1715d --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/fire_0.txt @@ -0,0 +1,16 @@ +8, +9, +10, +11, +12, +13, +14, +15, +0, +1, +2, +3, +4, +5, +6, +7, diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/fire_1.png b/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/fire_1.png new file mode 100644 index 00000000..6db92ac4 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/fire_1.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/fire_1.txt b/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/fire_1.txt new file mode 100644 index 00000000..0519ecba --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/fire_1.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/lava.png b/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/lava.png new file mode 100644 index 00000000..78bb29d5 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/lava.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/lava.txt b/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/lava.txt new file mode 100644 index 00000000..b0a7c084 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/lava.txt @@ -0,0 +1,38 @@ +0*2 +1*2 +2*2 +3*2 +4*2 +5*2 +6*2 +7*2 +8*2 +9*2 +10*2 +11*2 +12*2 +13*2 +14*2 +15*2 +16*2 +17*2 +18*2 +19*2 +18*2 +17*2 +16*2 +15*2 +14*2 +13*2 +12*2 +11*2 +10*2 +9*2 +8*2 +7*2 +6*2 +5*2 +4*2 +3*2 +2*2 +1*2 diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/lava_flow.png b/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/lava_flow.png new file mode 100644 index 00000000..af07f91d Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/lava_flow.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/lava_flow.txt b/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/lava_flow.txt new file mode 100644 index 00000000..2e6ca4fc --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/lava_flow.txt @@ -0,0 +1,16 @@ +0*3 +1*3 +2*3 +3*3 +4*3 +5*3 +6*3 +7*3 +8*3 +9*3 +10*3 +11*3 +12*3 +13*3 +14*3 +15*3 diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/portal.png b/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/portal.png new file mode 100644 index 00000000..96859e2d Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/portal.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/portal.txt b/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/portal.txt new file mode 100644 index 00000000..0519ecba --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/portal.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/water.png b/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/water.png new file mode 100644 index 00000000..c7e90b07 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/water.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/water.txt b/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/water.txt new file mode 100644 index 00000000..d8fe765a --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/water.txt @@ -0,0 +1,32 @@ +0*2 +1*2 +2*2 +3*2 +4*2 +5*2 +6*2 +7*2 +8*2 +9*2 +10*2 +11*2 +12*2 +13*2 +14*2 +15*2 +16*2 +17*2 +18*2 +19*2 +20*2 +21*2 +22*2 +23*2 +24*2 +25*2 +26*2 +27*2 +28*2 +29*2 +30*2 +31*2 diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/water_flow.png b/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/water_flow.png new file mode 100644 index 00000000..e72280c4 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/water_flow.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/water_flow.txt b/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/water_flow.txt new file mode 100644 index 00000000..0519ecba --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/water_flow.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/textures/items/clock.png b/Minecraft.Client/Common/res/TitleUpdate/res/textures/items/clock.png new file mode 100644 index 00000000..069a0abf Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/textures/items/clock.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/textures/items/clock.txt b/Minecraft.Client/Common/res/TitleUpdate/res/textures/items/clock.txt new file mode 100644 index 00000000..0519ecba --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/res/textures/items/clock.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/textures/items/compass.png b/Minecraft.Client/Common/res/TitleUpdate/res/textures/items/compass.png new file mode 100644 index 00000000..9dcbdfe6 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/textures/items/compass.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/textures/items/compass.txt b/Minecraft.Client/Common/res/TitleUpdate/res/textures/items/compass.txt new file mode 100644 index 00000000..0519ecba --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/res/textures/items/compass.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Minecraft.Client/Common/res/TitleUpdate/tutorialDiff b/Minecraft.Client/Common/res/TitleUpdate/tutorialDiff new file mode 100644 index 00000000..be9e2e60 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/tutorialDiff differ diff --git a/Minecraft.Client/Common/res/achievement/bg.png b/Minecraft.Client/Common/res/achievement/bg.png new file mode 100644 index 00000000..23dd85a8 Binary files /dev/null and b/Minecraft.Client/Common/res/achievement/bg.png differ diff --git a/Minecraft.Client/Common/res/achievement/icons.png b/Minecraft.Client/Common/res/achievement/icons.png new file mode 100644 index 00000000..6a3f3ea5 Binary files /dev/null and b/Minecraft.Client/Common/res/achievement/icons.png differ diff --git a/Minecraft.Client/Common/res/armor/chain_1.png b/Minecraft.Client/Common/res/armor/chain_1.png new file mode 100644 index 00000000..3632af5b Binary files /dev/null and b/Minecraft.Client/Common/res/armor/chain_1.png differ diff --git a/Minecraft.Client/Common/res/armor/chain_2.png b/Minecraft.Client/Common/res/armor/chain_2.png new file mode 100644 index 00000000..330425b1 Binary files /dev/null and b/Minecraft.Client/Common/res/armor/chain_2.png differ diff --git a/Minecraft.Client/Common/res/armor/cloth_1.png b/Minecraft.Client/Common/res/armor/cloth_1.png new file mode 100644 index 00000000..f3cf4aa3 Binary files /dev/null and b/Minecraft.Client/Common/res/armor/cloth_1.png differ diff --git a/Minecraft.Client/Common/res/armor/cloth_2.png b/Minecraft.Client/Common/res/armor/cloth_2.png new file mode 100644 index 00000000..15fb9084 Binary files /dev/null and b/Minecraft.Client/Common/res/armor/cloth_2.png differ diff --git a/Minecraft.Client/Common/res/armor/diamond_1.png b/Minecraft.Client/Common/res/armor/diamond_1.png new file mode 100644 index 00000000..339da658 Binary files /dev/null and b/Minecraft.Client/Common/res/armor/diamond_1.png differ diff --git a/Minecraft.Client/Common/res/armor/diamond_2.png b/Minecraft.Client/Common/res/armor/diamond_2.png new file mode 100644 index 00000000..c220c123 Binary files /dev/null and b/Minecraft.Client/Common/res/armor/diamond_2.png differ diff --git a/Minecraft.Client/Common/res/armor/gold_1.png b/Minecraft.Client/Common/res/armor/gold_1.png new file mode 100644 index 00000000..885f309b Binary files /dev/null and b/Minecraft.Client/Common/res/armor/gold_1.png differ diff --git a/Minecraft.Client/Common/res/armor/gold_2.png b/Minecraft.Client/Common/res/armor/gold_2.png new file mode 100644 index 00000000..9d1ea3b3 Binary files /dev/null and b/Minecraft.Client/Common/res/armor/gold_2.png differ diff --git a/Minecraft.Client/Common/res/armor/iron_1.png b/Minecraft.Client/Common/res/armor/iron_1.png new file mode 100644 index 00000000..374ab076 Binary files /dev/null and b/Minecraft.Client/Common/res/armor/iron_1.png differ diff --git a/Minecraft.Client/Common/res/armor/iron_2.png b/Minecraft.Client/Common/res/armor/iron_2.png new file mode 100644 index 00000000..53af4f4d Binary files /dev/null and b/Minecraft.Client/Common/res/armor/iron_2.png differ diff --git a/Minecraft.Client/Common/res/armor/power.png b/Minecraft.Client/Common/res/armor/power.png new file mode 100644 index 00000000..809539ca Binary files /dev/null and b/Minecraft.Client/Common/res/armor/power.png differ diff --git a/Minecraft.Client/Common/res/art/kz.png b/Minecraft.Client/Common/res/art/kz.png new file mode 100644 index 00000000..ecc4823e Binary files /dev/null and b/Minecraft.Client/Common/res/art/kz.png differ diff --git a/Minecraft.Client/Common/res/audio/Minecraft.xgs b/Minecraft.Client/Common/res/audio/Minecraft.xgs new file mode 100644 index 00000000..9761e4ca Binary files /dev/null and b/Minecraft.Client/Common/res/audio/Minecraft.xgs differ diff --git a/Minecraft.Client/Common/res/audio/minecraft.xsb b/Minecraft.Client/Common/res/audio/minecraft.xsb new file mode 100644 index 00000000..4bfe9120 Binary files /dev/null and b/Minecraft.Client/Common/res/audio/minecraft.xsb differ diff --git a/Minecraft.Client/Common/res/audio/resident.xwb b/Minecraft.Client/Common/res/audio/resident.xwb new file mode 100644 index 00000000..3fa725a1 Binary files /dev/null and b/Minecraft.Client/Common/res/audio/resident.xwb differ diff --git a/Minecraft.Client/Common/res/audio/streamed.xwb b/Minecraft.Client/Common/res/audio/streamed.xwb new file mode 100644 index 00000000..ec2fb4ed Binary files /dev/null and b/Minecraft.Client/Common/res/audio/streamed.xwb differ diff --git a/Minecraft.Client/Common/res/environment/clouds.png b/Minecraft.Client/Common/res/environment/clouds.png new file mode 100644 index 00000000..b4a78c2f Binary files /dev/null and b/Minecraft.Client/Common/res/environment/clouds.png differ diff --git a/Minecraft.Client/Common/res/environment/rain.png b/Minecraft.Client/Common/res/environment/rain.png new file mode 100644 index 00000000..75d775b1 Binary files /dev/null and b/Minecraft.Client/Common/res/environment/rain.png differ diff --git a/Minecraft.Client/Common/res/environment/snow.png b/Minecraft.Client/Common/res/environment/snow.png new file mode 100644 index 00000000..84417c5c Binary files /dev/null and b/Minecraft.Client/Common/res/environment/snow.png differ diff --git a/Minecraft.Client/Common/res/font/Mojangles_11.png b/Minecraft.Client/Common/res/font/Mojangles_11.png new file mode 100644 index 00000000..1b8af338 Binary files /dev/null and b/Minecraft.Client/Common/res/font/Mojangles_11.png differ diff --git a/Minecraft.Client/Common/res/font/Mojangles_7.png b/Minecraft.Client/Common/res/font/Mojangles_7.png new file mode 100644 index 00000000..2ad933fe Binary files /dev/null and b/Minecraft.Client/Common/res/font/Mojangles_7.png differ diff --git a/Minecraft.Client/Common/res/font/default.png b/Minecraft.Client/Common/res/font/default.png new file mode 100644 index 00000000..96094378 Binary files /dev/null and b/Minecraft.Client/Common/res/font/default.png differ diff --git a/Minecraft.Client/Common/res/gui/background.png b/Minecraft.Client/Common/res/gui/background.png new file mode 100644 index 00000000..b29e0092 Binary files /dev/null and b/Minecraft.Client/Common/res/gui/background.png differ diff --git a/Minecraft.Client/Common/res/gui/container.png b/Minecraft.Client/Common/res/gui/container.png new file mode 100644 index 00000000..bd1d383c Binary files /dev/null and b/Minecraft.Client/Common/res/gui/container.png differ diff --git a/Minecraft.Client/Common/res/gui/crafting.png b/Minecraft.Client/Common/res/gui/crafting.png new file mode 100644 index 00000000..da831189 Binary files /dev/null and b/Minecraft.Client/Common/res/gui/crafting.png differ diff --git a/Minecraft.Client/Common/res/gui/furnace.png b/Minecraft.Client/Common/res/gui/furnace.png new file mode 100644 index 00000000..a5834e19 Binary files /dev/null and b/Minecraft.Client/Common/res/gui/furnace.png differ diff --git a/Minecraft.Client/Common/res/gui/gui.png b/Minecraft.Client/Common/res/gui/gui.png new file mode 100644 index 00000000..81af329e Binary files /dev/null and b/Minecraft.Client/Common/res/gui/gui.png differ diff --git a/Minecraft.Client/Common/res/gui/icons.png b/Minecraft.Client/Common/res/gui/icons.png new file mode 100644 index 00000000..73fe9bbd Binary files /dev/null and b/Minecraft.Client/Common/res/gui/icons.png differ diff --git a/Minecraft.Client/Common/res/gui/inventory.png b/Minecraft.Client/Common/res/gui/inventory.png new file mode 100644 index 00000000..0b5f2916 Binary files /dev/null and b/Minecraft.Client/Common/res/gui/inventory.png differ diff --git a/Minecraft.Client/Common/res/gui/items.png b/Minecraft.Client/Common/res/gui/items.png new file mode 100644 index 00000000..3f51245f Binary files /dev/null and b/Minecraft.Client/Common/res/gui/items.png differ diff --git a/Minecraft.Client/Common/res/gui/logo.png b/Minecraft.Client/Common/res/gui/logo.png new file mode 100644 index 00000000..b7c28795 Binary files /dev/null and b/Minecraft.Client/Common/res/gui/logo.png differ diff --git a/Minecraft.Client/Common/res/gui/particles.png b/Minecraft.Client/Common/res/gui/particles.png new file mode 100644 index 00000000..ac7e39f4 Binary files /dev/null and b/Minecraft.Client/Common/res/gui/particles.png differ diff --git a/Minecraft.Client/Common/res/gui/slot.png b/Minecraft.Client/Common/res/gui/slot.png new file mode 100644 index 00000000..4eb39baf Binary files /dev/null and b/Minecraft.Client/Common/res/gui/slot.png differ diff --git a/Minecraft.Client/Common/res/gui/trap.png b/Minecraft.Client/Common/res/gui/trap.png new file mode 100644 index 00000000..594860a6 Binary files /dev/null and b/Minecraft.Client/Common/res/gui/trap.png differ diff --git a/Minecraft.Client/Common/res/gui/unknown_pack.png b/Minecraft.Client/Common/res/gui/unknown_pack.png new file mode 100644 index 00000000..3a45a90e Binary files /dev/null and b/Minecraft.Client/Common/res/gui/unknown_pack.png differ diff --git a/Minecraft.Client/Common/res/item/arrows.png b/Minecraft.Client/Common/res/item/arrows.png new file mode 100644 index 00000000..75c58287 Binary files /dev/null and b/Minecraft.Client/Common/res/item/arrows.png differ diff --git a/Minecraft.Client/Common/res/item/boat.png b/Minecraft.Client/Common/res/item/boat.png new file mode 100644 index 00000000..132a0f7c Binary files /dev/null and b/Minecraft.Client/Common/res/item/boat.png differ diff --git a/Minecraft.Client/Common/res/item/cart.png b/Minecraft.Client/Common/res/item/cart.png new file mode 100644 index 00000000..32af68e3 Binary files /dev/null and b/Minecraft.Client/Common/res/item/cart.png differ diff --git a/Minecraft.Client/Common/res/item/door.png b/Minecraft.Client/Common/res/item/door.png new file mode 100644 index 00000000..52df2d92 Binary files /dev/null and b/Minecraft.Client/Common/res/item/door.png differ diff --git a/Minecraft.Client/Common/res/item/sign.png b/Minecraft.Client/Common/res/item/sign.png new file mode 100644 index 00000000..e8294724 Binary files /dev/null and b/Minecraft.Client/Common/res/item/sign.png differ diff --git a/Minecraft.Client/Common/res/misc/dial.png b/Minecraft.Client/Common/res/misc/dial.png new file mode 100644 index 00000000..140e7e34 Binary files /dev/null and b/Minecraft.Client/Common/res/misc/dial.png differ diff --git a/Minecraft.Client/Common/res/misc/foliagecolor.png b/Minecraft.Client/Common/res/misc/foliagecolor.png new file mode 100644 index 00000000..81673cae Binary files /dev/null and b/Minecraft.Client/Common/res/misc/foliagecolor.png differ diff --git a/Minecraft.Client/Common/res/misc/footprint.png b/Minecraft.Client/Common/res/misc/footprint.png new file mode 100644 index 00000000..e29b6a6d Binary files /dev/null and b/Minecraft.Client/Common/res/misc/footprint.png differ diff --git a/Minecraft.Client/Common/res/misc/grasscolor.png b/Minecraft.Client/Common/res/misc/grasscolor.png new file mode 100644 index 00000000..a6d9c209 Binary files /dev/null and b/Minecraft.Client/Common/res/misc/grasscolor.png differ diff --git a/Minecraft.Client/Common/res/misc/mapbg.png b/Minecraft.Client/Common/res/misc/mapbg.png new file mode 100644 index 00000000..3f67e74c Binary files /dev/null and b/Minecraft.Client/Common/res/misc/mapbg.png differ diff --git a/Minecraft.Client/Common/res/misc/mapicons.png b/Minecraft.Client/Common/res/misc/mapicons.png new file mode 100644 index 00000000..2dd03d19 Binary files /dev/null and b/Minecraft.Client/Common/res/misc/mapicons.png differ diff --git a/Minecraft.Client/Common/res/misc/pumpkinblur.png b/Minecraft.Client/Common/res/misc/pumpkinblur.png new file mode 100644 index 00000000..c6e2ffc9 Binary files /dev/null and b/Minecraft.Client/Common/res/misc/pumpkinblur.png differ diff --git a/Minecraft.Client/Common/res/misc/shadow.png b/Minecraft.Client/Common/res/misc/shadow.png new file mode 100644 index 00000000..06d999b2 Binary files /dev/null and b/Minecraft.Client/Common/res/misc/shadow.png differ diff --git a/Minecraft.Client/Common/res/misc/vignette.png b/Minecraft.Client/Common/res/misc/vignette.png new file mode 100644 index 00000000..f236acb3 Binary files /dev/null and b/Minecraft.Client/Common/res/misc/vignette.png differ diff --git a/Minecraft.Client/Common/res/misc/water.png b/Minecraft.Client/Common/res/misc/water.png new file mode 100644 index 00000000..8b92f9bc Binary files /dev/null and b/Minecraft.Client/Common/res/misc/water.png differ diff --git a/Minecraft.Client/Common/res/misc/watercolor.png b/Minecraft.Client/Common/res/misc/watercolor.png new file mode 100644 index 00000000..8537e0d0 Binary files /dev/null and b/Minecraft.Client/Common/res/misc/watercolor.png differ diff --git a/Minecraft.Client/Common/res/mob/char.png b/Minecraft.Client/Common/res/mob/char.png new file mode 100644 index 00000000..7cfa08a8 Binary files /dev/null and b/Minecraft.Client/Common/res/mob/char.png differ diff --git a/Minecraft.Client/Common/res/mob/char1.png b/Minecraft.Client/Common/res/mob/char1.png new file mode 100644 index 00000000..41576e63 Binary files /dev/null and b/Minecraft.Client/Common/res/mob/char1.png differ diff --git a/Minecraft.Client/Common/res/mob/char2.png b/Minecraft.Client/Common/res/mob/char2.png new file mode 100644 index 00000000..b921f856 Binary files /dev/null and b/Minecraft.Client/Common/res/mob/char2.png differ diff --git a/Minecraft.Client/Common/res/mob/char3.png b/Minecraft.Client/Common/res/mob/char3.png new file mode 100644 index 00000000..c7a39868 Binary files /dev/null and b/Minecraft.Client/Common/res/mob/char3.png differ diff --git a/Minecraft.Client/Common/res/mob/char4.png b/Minecraft.Client/Common/res/mob/char4.png new file mode 100644 index 00000000..25dcfec4 Binary files /dev/null and b/Minecraft.Client/Common/res/mob/char4.png differ diff --git a/Minecraft.Client/Common/res/mob/char5.png b/Minecraft.Client/Common/res/mob/char5.png new file mode 100644 index 00000000..4cc80ac1 Binary files /dev/null and b/Minecraft.Client/Common/res/mob/char5.png differ diff --git a/Minecraft.Client/Common/res/mob/char6.png b/Minecraft.Client/Common/res/mob/char6.png new file mode 100644 index 00000000..74a71c4f Binary files /dev/null and b/Minecraft.Client/Common/res/mob/char6.png differ diff --git a/Minecraft.Client/Common/res/mob/char7.png b/Minecraft.Client/Common/res/mob/char7.png new file mode 100644 index 00000000..5018dc45 Binary files /dev/null and b/Minecraft.Client/Common/res/mob/char7.png differ diff --git a/Minecraft.Client/Common/res/mob/chicken.png b/Minecraft.Client/Common/res/mob/chicken.png new file mode 100644 index 00000000..d4812939 Binary files /dev/null and b/Minecraft.Client/Common/res/mob/chicken.png differ diff --git a/Minecraft.Client/Common/res/mob/cow.png b/Minecraft.Client/Common/res/mob/cow.png new file mode 100644 index 00000000..2080ebcb Binary files /dev/null and b/Minecraft.Client/Common/res/mob/cow.png differ diff --git a/Minecraft.Client/Common/res/mob/creeper.png b/Minecraft.Client/Common/res/mob/creeper.png new file mode 100644 index 00000000..e0a5e0a1 Binary files /dev/null and b/Minecraft.Client/Common/res/mob/creeper.png differ diff --git a/Minecraft.Client/Common/res/mob/ghast.png b/Minecraft.Client/Common/res/mob/ghast.png new file mode 100644 index 00000000..e83a60da Binary files /dev/null and b/Minecraft.Client/Common/res/mob/ghast.png differ diff --git a/Minecraft.Client/Common/res/mob/ghast_fire.png b/Minecraft.Client/Common/res/mob/ghast_fire.png new file mode 100644 index 00000000..fff9718c Binary files /dev/null and b/Minecraft.Client/Common/res/mob/ghast_fire.png differ diff --git a/Minecraft.Client/Common/res/mob/pig.png b/Minecraft.Client/Common/res/mob/pig.png new file mode 100644 index 00000000..5c1efc2d Binary files /dev/null and b/Minecraft.Client/Common/res/mob/pig.png differ diff --git a/Minecraft.Client/Common/res/mob/pigman.png b/Minecraft.Client/Common/res/mob/pigman.png new file mode 100644 index 00000000..c900b362 Binary files /dev/null and b/Minecraft.Client/Common/res/mob/pigman.png differ diff --git a/Minecraft.Client/Common/res/mob/pigzombie.png b/Minecraft.Client/Common/res/mob/pigzombie.png new file mode 100644 index 00000000..0a0a25a4 Binary files /dev/null and b/Minecraft.Client/Common/res/mob/pigzombie.png differ diff --git a/Minecraft.Client/Common/res/mob/saddle.png b/Minecraft.Client/Common/res/mob/saddle.png new file mode 100644 index 00000000..aaea7a6d Binary files /dev/null and b/Minecraft.Client/Common/res/mob/saddle.png differ diff --git a/Minecraft.Client/Common/res/mob/sheep.png b/Minecraft.Client/Common/res/mob/sheep.png new file mode 100644 index 00000000..98cfa9ac Binary files /dev/null and b/Minecraft.Client/Common/res/mob/sheep.png differ diff --git a/Minecraft.Client/Common/res/mob/sheep_fur.png b/Minecraft.Client/Common/res/mob/sheep_fur.png new file mode 100644 index 00000000..f1291a5f Binary files /dev/null and b/Minecraft.Client/Common/res/mob/sheep_fur.png differ diff --git a/Minecraft.Client/Common/res/mob/skeleton.png b/Minecraft.Client/Common/res/mob/skeleton.png new file mode 100644 index 00000000..9d223394 Binary files /dev/null and b/Minecraft.Client/Common/res/mob/skeleton.png differ diff --git a/Minecraft.Client/Common/res/mob/slime.png b/Minecraft.Client/Common/res/mob/slime.png new file mode 100644 index 00000000..42fc8736 Binary files /dev/null and b/Minecraft.Client/Common/res/mob/slime.png differ diff --git a/Minecraft.Client/Common/res/mob/spider.png b/Minecraft.Client/Common/res/mob/spider.png new file mode 100644 index 00000000..08344a83 Binary files /dev/null and b/Minecraft.Client/Common/res/mob/spider.png differ diff --git a/Minecraft.Client/Common/res/mob/spider_eyes.png b/Minecraft.Client/Common/res/mob/spider_eyes.png new file mode 100644 index 00000000..2a7734f9 Binary files /dev/null and b/Minecraft.Client/Common/res/mob/spider_eyes.png differ diff --git a/Minecraft.Client/Common/res/mob/squid.png b/Minecraft.Client/Common/res/mob/squid.png new file mode 100644 index 00000000..ff3f5b0a Binary files /dev/null and b/Minecraft.Client/Common/res/mob/squid.png differ diff --git a/Minecraft.Client/Common/res/mob/wolf.png b/Minecraft.Client/Common/res/mob/wolf.png new file mode 100644 index 00000000..4b24458f Binary files /dev/null and b/Minecraft.Client/Common/res/mob/wolf.png differ diff --git a/Minecraft.Client/Common/res/mob/wolf_angry.png b/Minecraft.Client/Common/res/mob/wolf_angry.png new file mode 100644 index 00000000..89b3d2d6 Binary files /dev/null and b/Minecraft.Client/Common/res/mob/wolf_angry.png differ diff --git a/Minecraft.Client/Common/res/mob/wolf_tame.png b/Minecraft.Client/Common/res/mob/wolf_tame.png new file mode 100644 index 00000000..159f45b5 Binary files /dev/null and b/Minecraft.Client/Common/res/mob/wolf_tame.png differ diff --git a/Minecraft.Client/Common/res/mob/zombie.png b/Minecraft.Client/Common/res/mob/zombie.png new file mode 100644 index 00000000..0ab70895 Binary files /dev/null and b/Minecraft.Client/Common/res/mob/zombie.png differ diff --git a/Minecraft.Client/Common/res/pack.png b/Minecraft.Client/Common/res/pack.png new file mode 100644 index 00000000..973a7cf2 Binary files /dev/null and b/Minecraft.Client/Common/res/pack.png differ diff --git a/Minecraft.Client/Common/res/particles.png b/Minecraft.Client/Common/res/particles.png new file mode 100644 index 00000000..e1ec7d2d Binary files /dev/null and b/Minecraft.Client/Common/res/particles.png differ diff --git a/Minecraft.Client/Common/res/terrain.png b/Minecraft.Client/Common/res/terrain.png new file mode 100644 index 00000000..244f7668 Binary files /dev/null and b/Minecraft.Client/Common/res/terrain.png differ diff --git a/Minecraft.Client/Common/res/terrain/moon.png b/Minecraft.Client/Common/res/terrain/moon.png new file mode 100644 index 00000000..61cebbc7 Binary files /dev/null and b/Minecraft.Client/Common/res/terrain/moon.png differ diff --git a/Minecraft.Client/Common/res/terrain/sun.png b/Minecraft.Client/Common/res/terrain/sun.png new file mode 100644 index 00000000..d3433441 Binary files /dev/null and b/Minecraft.Client/Common/res/terrain/sun.png differ diff --git a/Minecraft.Client/Common/res/title/black.png b/Minecraft.Client/Common/res/title/black.png new file mode 100644 index 00000000..dc2ad3e7 Binary files /dev/null and b/Minecraft.Client/Common/res/title/black.png differ diff --git a/Minecraft.Client/Common/res/title/mclogo.png b/Minecraft.Client/Common/res/title/mclogo.png new file mode 100644 index 00000000..752da0e7 Binary files /dev/null and b/Minecraft.Client/Common/res/title/mclogo.png differ diff --git a/Minecraft.Client/Common/res/title/mojang.png b/Minecraft.Client/Common/res/title/mojang.png new file mode 100644 index 00000000..829cfc45 Binary files /dev/null and b/Minecraft.Client/Common/res/title/mojang.png differ diff --git a/Minecraft.Client/Common/xuiscene_base.h b/Minecraft.Client/Common/xuiscene_base.h new file mode 100644 index 00000000..a4e71ad6 --- /dev/null +++ b/Minecraft.Client/Common/xuiscene_base.h @@ -0,0 +1,176 @@ +#define IDC_BottomLeftAnchorPoint L"BottomLeftAnchorPoint" +#define IDC_TopLeftAnchorPoint L"TopLeftAnchorPoint" +#define IDC_XuiDarkOverlay L"XuiDarkOverlay" +#define IDC_Background L"Background" +#define IDC_Logo L"Logo" +#define IDC_XuiSceneHudRoot L"XuiSceneHudRoot" +#define IDC_XuiSceneChatRoot L"XuiSceneChatRoot" +#define IDC_XuiSceneContainer L"XuiSceneContainer" +#define IDC_LStick L"LStick" +#define IDC_LBButton L"LBButton" +#define IDC_RBButton L"RBButton" +#define IDC_RTrigger L"RTrigger" +#define IDC_LTrigger L"LTrigger" +#define IDC_YButton L"YButton" +#define IDC_XButton L"XButton" +#define IDC_BButton L"BButton" +#define IDC_AButton L"AButton" +#define IDC_Tooltips L"Tooltips" +#define IDC_LStick L"LStick" +#define IDC_LBButton L"LBButton" +#define IDC_RBButton L"RBButton" +#define IDC_RTrigger L"RTrigger" +#define IDC_LTrigger L"LTrigger" +#define IDC_YButton L"YButton" +#define IDC_XButton L"XButton" +#define IDC_BButton L"BButton" +#define IDC_AButton L"AButton" +#define IDC_TooltipsSmall L"TooltipsSmall" +#define IDC_SelectedItem L"SelectedItem" +#define IDC_SelectedItemSmall L"SelectedItemSmall" +#define IDC_TitleText L"TitleText" +#define IDC_ProgressBar1 L"ProgressBar1" +#define IDC_ProgressBar2 L"ProgressBar2" +#define IDC_ProgressBar3 L"ProgressBar3" +#define IDC_ProgressBar1_small L"ProgressBar1_small" +#define IDC_ProgressBar2_small L"ProgressBar2_small" +#define IDC_ProgressBar3_small L"ProgressBar3_small" +#define IDC_BossHealth L"BossHealth" +#define IDC_XuiSceneTutorialContainer L"XuiSceneTutorialContainer" +#define IDC_XuiGamertag L"XuiGamertag" +#define IDC_BasePlayer3 L"BasePlayer3" +#define IDC_BottomLeftAnchorPoint L"BottomLeftAnchorPoint" +#define IDC_TopLeftAnchorPoint L"TopLeftAnchorPoint" +#define IDC_XuiDarkOverlay L"XuiDarkOverlay" +#define IDC_Background L"Background" +#define IDC_Logo L"Logo" +#define IDC_XuiSceneHudRoot L"XuiSceneHudRoot" +#define IDC_XuiSceneChatRoot L"XuiSceneChatRoot" +#define IDC_XuiSceneContainer L"XuiSceneContainer" +#define IDC_LStick L"LStick" +#define IDC_LBButton L"LBButton" +#define IDC_RBButton L"RBButton" +#define IDC_RTrigger L"RTrigger" +#define IDC_LTrigger L"LTrigger" +#define IDC_YButton L"YButton" +#define IDC_XButton L"XButton" +#define IDC_BButton L"BButton" +#define IDC_AButton L"AButton" +#define IDC_Tooltips L"Tooltips" +#define IDC_LStick L"LStick" +#define IDC_LBButton L"LBButton" +#define IDC_RBButton L"RBButton" +#define IDC_RTrigger L"RTrigger" +#define IDC_LTrigger L"LTrigger" +#define IDC_YButton L"YButton" +#define IDC_XButton L"XButton" +#define IDC_BButton L"BButton" +#define IDC_AButton L"AButton" +#define IDC_TooltipsSmall L"TooltipsSmall" +#define IDC_SelectedItem L"SelectedItem" +#define IDC_SelectedItemSmall L"SelectedItemSmall" +#define IDC_TitleText L"TitleText" +#define IDC_ProgressBar1 L"ProgressBar1" +#define IDC_ProgressBar2 L"ProgressBar2" +#define IDC_ProgressBar3 L"ProgressBar3" +#define IDC_ProgressBar1_small L"ProgressBar1_small" +#define IDC_ProgressBar2_small L"ProgressBar2_small" +#define IDC_ProgressBar3_small L"ProgressBar3_small" +#define IDC_BossHealth L"BossHealth" +#define IDC_XuiSceneTutorialContainer L"XuiSceneTutorialContainer" +#define IDC_XuiGamertag L"XuiGamertag" +#define IDC_BasePlayer2 L"BasePlayer2" +#define IDC_BottomLeftAnchorPoint L"BottomLeftAnchorPoint" +#define IDC_TopLeftAnchorPoint L"TopLeftAnchorPoint" +#define IDC_XuiDarkOverlay L"XuiDarkOverlay" +#define IDC_Background L"Background" +#define IDC_Logo L"Logo" +#define IDC_XuiSceneHudRoot L"XuiSceneHudRoot" +#define IDC_XuiSceneChatRoot L"XuiSceneChatRoot" +#define IDC_XuiSceneContainer L"XuiSceneContainer" +#define IDC_LStick L"LStick" +#define IDC_LBButton L"LBButton" +#define IDC_RBButton L"RBButton" +#define IDC_RTrigger L"RTrigger" +#define IDC_LTrigger L"LTrigger" +#define IDC_YButton L"YButton" +#define IDC_XButton L"XButton" +#define IDC_BButton L"BButton" +#define IDC_AButton L"AButton" +#define IDC_Tooltips L"Tooltips" +#define IDC_LStick L"LStick" +#define IDC_LBButton L"LBButton" +#define IDC_RBButton L"RBButton" +#define IDC_RTrigger L"RTrigger" +#define IDC_LTrigger L"LTrigger" +#define IDC_YButton L"YButton" +#define IDC_XButton L"XButton" +#define IDC_BButton L"BButton" +#define IDC_AButton L"AButton" +#define IDC_TooltipsSmall L"TooltipsSmall" +#define IDC_SelectedItem L"SelectedItem" +#define IDC_SelectedItemSmall L"SelectedItemSmall" +#define IDC_TitleText L"TitleText" +#define IDC_ProgressBar1 L"ProgressBar1" +#define IDC_ProgressBar2 L"ProgressBar2" +#define IDC_ProgressBar3 L"ProgressBar3" +#define IDC_ProgressBar1_small L"ProgressBar1_small" +#define IDC_ProgressBar2_small L"ProgressBar2_small" +#define IDC_ProgressBar3_small L"ProgressBar3_small" +#define IDC_BossHealth L"BossHealth" +#define IDC_XuiSceneTutorialContainer L"XuiSceneTutorialContainer" +#define IDC_XuiGamertag L"XuiGamertag" +#define IDC_BasePlayer1 L"BasePlayer1" +#define IDC_BottomLeftAnchorPoint L"BottomLeftAnchorPoint" +#define IDC_TopLeftAnchorPoint L"TopLeftAnchorPoint" +#define IDC_XuiDarkOverlay L"XuiDarkOverlay" +#define IDC_Background L"Background" +#define IDC_Logo L"Logo" +#define IDC_XuiSceneHudRoot L"XuiSceneHudRoot" +#define IDC_XuiSceneChatRoot L"XuiSceneChatRoot" +#define IDC_XuiSceneContainer L"XuiSceneContainer" +#define IDC_LStick L"LStick" +#define IDC_LBButton L"LBButton" +#define IDC_RBButton L"RBButton" +#define IDC_RTrigger L"RTrigger" +#define IDC_LTrigger L"LTrigger" +#define IDC_YButton L"YButton" +#define IDC_XButton L"XButton" +#define IDC_BButton L"BButton" +#define IDC_AButton L"AButton" +#define IDC_Tooltips L"Tooltips" +#define IDC_LStick L"LStick" +#define IDC_LBButton L"LBButton" +#define IDC_RBButton L"RBButton" +#define IDC_RTrigger L"RTrigger" +#define IDC_LTrigger L"LTrigger" +#define IDC_YButton L"YButton" +#define IDC_XButton L"XButton" +#define IDC_BButton L"BButton" +#define IDC_AButton L"AButton" +#define IDC_TooltipsSmall L"TooltipsSmall" +#define IDC_SelectedItem L"SelectedItem" +#define IDC_SelectedItemSmall L"SelectedItemSmall" +#define IDC_TitleText L"TitleText" +#define IDC_ProgressBar1 L"ProgressBar1" +#define IDC_ProgressBar2 L"ProgressBar2" +#define IDC_ProgressBar3 L"ProgressBar3" +#define IDC_ProgressBar1_small L"ProgressBar1_small" +#define IDC_ProgressBar2_small L"ProgressBar2_small" +#define IDC_ProgressBar3_small L"ProgressBar3_small" +#define IDC_BossHealth L"BossHealth" +#define IDC_XuiSceneTutorialContainer L"XuiSceneTutorialContainer" +#define IDC_XuiGamertag L"XuiGamertag" +#define IDC_BasePlayer0 L"BasePlayer0" +#define IDC_XuiPressStartMessage L"XuiPressStartMessage" +#define IDC_XuiSceneDebugContainer L"XuiSceneDebugContainer" +#define IDC_XuiSavingIcon L"XuiSavingIcon" +#define IDC_XuiTrialTimer L"XuiTrialTimer" +#define IDC_SafeArea L"SafeArea" +#define IDC_XuiSoundXACTBack L"XuiSoundXACTBack" +#define IDC_XuiSoundXACTCraft L"XuiSoundXACTCraft" +#define IDC_XuiSoundXACTCraftFail L"XuiSoundXACTCraftFail" +#define IDC_XuiSoundXACTFocus L"XuiSoundXACTFocus" +#define IDC_XuiSoundXACTPress L"XuiSoundXACTPress" +#define IDC_XuiSoundXACTScroll L"XuiSoundXACTScroll" +#define IDC_XuiBaseScene L"XuiBaseScene" diff --git a/Minecraft.Client/Common/zlib/adler32.c b/Minecraft.Client/Common/zlib/adler32.c new file mode 100644 index 00000000..33d70c60 --- /dev/null +++ b/Minecraft.Client/Common/zlib/adler32.c @@ -0,0 +1,178 @@ +/* adler32.c -- compute the Adler-32 checksum of a data stream + * Copyright (C) 1995-2011 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ +#include "zutil.h" + +#define local static + +local uLong adler32_combine_ OF((uLong adler1, uLong adler2, z_off64_t len2)); + +#define BASE 65521 /* largest prime smaller than 65536 */ +#define NMAX 5552 +/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ + +#define DO1(buf,i) {adler += (buf)[i]; sum2 += adler;} +#define DO2(buf,i) DO1(buf,i); DO1(buf,i+1); +#define DO4(buf,i) DO2(buf,i); DO2(buf,i+2); +#define DO8(buf,i) DO4(buf,i); DO4(buf,i+4); +#define DO16(buf) DO8(buf,0); DO8(buf,8); + +/* use NO_DIVIDE if your processor does not do division in hardware -- + try it both ways to see which is faster */ +#ifdef NO_DIVIDE +/* note that this assumes BASE is 65521, where 65536 % 65521 == 15 + (thank you to John Reiser for pointing this out) */ +# define CHOP(a) \ + do { \ + unsigned long tmp = a >> 16; \ + a &= 0xffffUL; \ + a += (tmp << 4) - tmp; \ + } while (0) +# define MOD28(a) \ + do { \ + CHOP(a); \ + if (a >= BASE) a -= BASE; \ + } while (0) +# define MOD(a) \ + do { \ + CHOP(a); \ + MOD28(a); \ + } while (0) +# define MOD63(a) \ + do { /* this assumes a is not negative */ \ + z_off64_t tmp = a >> 32; \ + a &= 0xffffffffL; \ + a += (tmp << 8) - (tmp << 5) + tmp; \ + tmp = a >> 16; \ + a &= 0xffffL; \ + a += (tmp << 4) - tmp; \ + tmp = a >> 16; \ + a &= 0xffffL; \ + a += (tmp << 4) - tmp; \ + if (a >= BASE) a -= BASE; \ + } while (0) +#else +# define MOD(a) a %= BASE +# define MOD28(a) a %= BASE +# define MOD63(a) a %= BASE +#endif + +/* ========================================================================= */ +uLong ZEXPORT adler32(adler, buf, len) + uLong adler; + const Bytef *buf; + uInt len; +{ + unsigned long sum2; + unsigned n; + + /* split Adler-32 into component sums */ + sum2 = (adler >> 16) & 0xffff; + adler &= 0xffff; + + /* in case user likes doing a byte at a time, keep it fast */ + if (len == 1) { + adler += buf[0]; + if (adler >= BASE) + adler -= BASE; + sum2 += adler; + if (sum2 >= BASE) + sum2 -= BASE; + return adler | (sum2 << 16); + } + + /* initial Adler-32 value (deferred check for len == 1 speed) */ + if (buf == Z_NULL) + return 1L; + + /* in case short lengths are provided, keep it somewhat fast */ + if (len < 16) { + while (len--) { + adler += *buf++; + sum2 += adler; + } + if (adler >= BASE) + adler -= BASE; + MOD28(sum2); /* only added so many BASE's */ + return adler | (sum2 << 16); + } + + /* do length NMAX blocks -- requires just one modulo operation */ + while (len >= NMAX) { + len -= NMAX; + n = NMAX / 16; /* NMAX is divisible by 16 */ + do { + DO16(buf); /* 16 sums unrolled */ + buf += 16; + } while (--n); + MOD(adler); + MOD(sum2); + } + + /* do remaining bytes (less than NMAX, still just one modulo) */ + if (len) { /* avoid modulos if none remaining */ + while (len >= 16) { + len -= 16; + DO16(buf); + buf += 16; + } + while (len--) { + adler += *buf++; + sum2 += adler; + } + MOD(adler); + MOD(sum2); + } + + /* return recombined sums */ + return adler | (sum2 << 16); +} + +/* ========================================================================= */ +local uLong adler32_combine_(adler1, adler2, len2) + uLong adler1; + uLong adler2; + z_off64_t len2; +{ + unsigned long sum1; + unsigned long sum2; + unsigned rem; + + /* for negative len, return invalid adler32 as a clue for debugging */ + if (len2 < 0) + return 0xffffffffUL; + + /* the derivation of this formula is left as an exercise for the reader */ + MOD63(len2); /* assumes len2 >= 0 */ + rem = (unsigned)len2; + sum1 = adler1 & 0xffff; + sum2 = rem * sum1; + MOD(sum2); + sum1 += (adler2 & 0xffff) + BASE - 1; + sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem; + if (sum1 >= BASE) sum1 -= BASE; + if (sum1 >= BASE) sum1 -= BASE; + if (sum2 >= (BASE << 1)) sum2 -= (BASE << 1); + if (sum2 >= BASE) sum2 -= BASE; + return sum1 | (sum2 << 16); +} + +/* ========================================================================= */ +uLong ZEXPORT adler32_combine(adler1, adler2, len2) + uLong adler1; + uLong adler2; + z_off_t len2; +{ + return adler32_combine_(adler1, adler2, len2); +} + +uLong ZEXPORT adler32_combine64(adler1, adler2, len2) + uLong adler1; + uLong adler2; + z_off64_t len2; +{ + return adler32_combine_(adler1, adler2, len2); +} diff --git a/Minecraft.Client/Common/zlib/compress.c b/Minecraft.Client/Common/zlib/compress.c new file mode 100644 index 00000000..6f3f2593 --- /dev/null +++ b/Minecraft.Client/Common/zlib/compress.c @@ -0,0 +1,81 @@ +/* compress.c -- compress a memory buffer + * Copyright (C) 1995-2005 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#define ZLIB_INTERNAL +#include "zlib.h" + +/* =========================================================================== + Compresses the source buffer into the destination buffer. The level + parameter has the same meaning as in deflateInit. sourceLen is the byte + length of the source buffer. Upon entry, destLen is the total size of the + destination buffer, which must be at least 0.1% larger than sourceLen plus + 12 bytes. Upon exit, destLen is the actual size of the compressed buffer. + + compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_BUF_ERROR if there was not enough room in the output buffer, + Z_STREAM_ERROR if the level parameter is invalid. +*/ +int ZEXPORT compress2 (dest, destLen, source, sourceLen, level) + Bytef *dest; + uLongf *destLen; + const Bytef *source; + uLong sourceLen; + int level; +{ + z_stream stream; + int err; + + stream.next_in = (z_const Bytef *)source; + stream.avail_in = (uInt)sourceLen; +#ifdef MAXSEG_64K + /* Check for source > 64K on 16-bit machine: */ + if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; +#endif + stream.next_out = dest; + stream.avail_out = (uInt)*destLen; + if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; + + stream.zalloc = (alloc_func)0; + stream.zfree = (free_func)0; + stream.opaque = (voidpf)0; + + err = deflateInit(&stream, level); + if (err != Z_OK) return err; + + err = deflate(&stream, Z_FINISH); + if (err != Z_STREAM_END) { + deflateEnd(&stream); + return err == Z_OK ? Z_BUF_ERROR : err; + } + *destLen = stream.total_out; + + err = deflateEnd(&stream); + return err; +} + +/* =========================================================================== + */ +int ZEXPORT compress (dest, destLen, source, sourceLen) + Bytef *dest; + uLongf *destLen; + const Bytef *source; + uLong sourceLen; +{ + return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION); +} + + +/* =========================================================================== + If the default memLevel or windowBits for deflateInit() is changed, then + this function needs to be updated. + */ +uLong ZEXPORT compressBound (sourceLen) + uLong sourceLen; +{ + return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + + (sourceLen >> 25) + 13; +} diff --git a/Minecraft.Client/Common/zlib/crc32.c b/Minecraft.Client/Common/zlib/crc32.c new file mode 100644 index 00000000..979a7190 --- /dev/null +++ b/Minecraft.Client/Common/zlib/crc32.c @@ -0,0 +1,425 @@ +/* crc32.c -- compute the CRC-32 of a data stream + * Copyright (C) 1995-2006, 2010, 2011, 2012 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + * + * Thanks to Rodney Brown for his contribution of faster + * CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing + * tables for updating the shift register in one step with three exclusive-ors + * instead of four steps with four exclusive-ors. This results in about a + * factor of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3. + */ + +/* @(#) $Id$ */ + +/* + Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore + protection on the static variables used to control the first-use generation + of the crc tables. Therefore, if you #define DYNAMIC_CRC_TABLE, you should + first call get_crc_table() to initialize the tables before allowing more than + one thread to use crc32(). + + DYNAMIC_CRC_TABLE and MAKECRCH can be #defined to write out crc32.h. + */ + +#ifdef MAKECRCH +# include +# ifndef DYNAMIC_CRC_TABLE +# define DYNAMIC_CRC_TABLE +# endif /* !DYNAMIC_CRC_TABLE */ +#endif /* MAKECRCH */ + +#include "zutil.h" /* for STDC and FAR definitions */ + +#define local static + +/* Definitions for doing the crc four data bytes at a time. */ +#if !defined(NOBYFOUR) && defined(Z_U4) +# define BYFOUR +#endif +#ifdef BYFOUR + local unsigned long crc32_little OF((unsigned long, + const unsigned char FAR *, unsigned)); + local unsigned long crc32_big OF((unsigned long, + const unsigned char FAR *, unsigned)); +# define TBLS 8 +#else +# define TBLS 1 +#endif /* BYFOUR */ + +/* Local functions for crc concatenation */ +local unsigned long gf2_matrix_times OF((unsigned long *mat, + unsigned long vec)); +local void gf2_matrix_square OF((unsigned long *square, unsigned long *mat)); +local uLong crc32_combine_ OF((uLong crc1, uLong crc2, z_off64_t len2)); + + +#ifdef DYNAMIC_CRC_TABLE + +local volatile int crc_table_empty = 1; +local z_crc_t FAR crc_table[TBLS][256]; +local void make_crc_table OF((void)); +#ifdef MAKECRCH + local void write_table OF((FILE *, const z_crc_t FAR *)); +#endif /* MAKECRCH */ +/* + Generate tables for a byte-wise 32-bit CRC calculation on the polynomial: + x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1. + + Polynomials over GF(2) are represented in binary, one bit per coefficient, + with the lowest powers in the most significant bit. Then adding polynomials + is just exclusive-or, and multiplying a polynomial by x is a right shift by + one. If we call the above polynomial p, and represent a byte as the + polynomial q, also with the lowest power in the most significant bit (so the + byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p, + where a mod b means the remainder after dividing a by b. + + This calculation is done using the shift-register method of multiplying and + taking the remainder. The register is initialized to zero, and for each + incoming bit, x^32 is added mod p to the register if the bit is a one (where + x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by + x (which is shifting right by one and adding x^32 mod p if the bit shifted + out is a one). We start with the highest power (least significant bit) of + q and repeat for all eight bits of q. + + The first table is simply the CRC of all possible eight bit values. This is + all the information needed to generate CRCs on data a byte at a time for all + combinations of CRC register values and incoming bytes. The remaining tables + allow for word-at-a-time CRC calculation for both big-endian and little- + endian machines, where a word is four bytes. +*/ +local void make_crc_table() +{ + z_crc_t c; + int n, k; + z_crc_t poly; /* polynomial exclusive-or pattern */ + /* terms of polynomial defining this crc (except x^32): */ + static volatile int first = 1; /* flag to limit concurrent making */ + static const unsigned char p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26}; + + /* See if another task is already doing this (not thread-safe, but better + than nothing -- significantly reduces duration of vulnerability in + case the advice about DYNAMIC_CRC_TABLE is ignored) */ + if (first) { + first = 0; + + /* make exclusive-or pattern from polynomial (0xedb88320UL) */ + poly = 0; + for (n = 0; n < (int)(sizeof(p)/sizeof(unsigned char)); n++) + poly |= (z_crc_t)1 << (31 - p[n]); + + /* generate a crc for every 8-bit value */ + for (n = 0; n < 256; n++) { + c = (z_crc_t)n; + for (k = 0; k < 8; k++) + c = c & 1 ? poly ^ (c >> 1) : c >> 1; + crc_table[0][n] = c; + } + +#ifdef BYFOUR + /* generate crc for each value followed by one, two, and three zeros, + and then the byte reversal of those as well as the first table */ + for (n = 0; n < 256; n++) { + c = crc_table[0][n]; + crc_table[4][n] = ZSWAP32(c); + for (k = 1; k < 4; k++) { + c = crc_table[0][c & 0xff] ^ (c >> 8); + crc_table[k][n] = c; + crc_table[k + 4][n] = ZSWAP32(c); + } + } +#endif /* BYFOUR */ + + crc_table_empty = 0; + } + else { /* not first */ + /* wait for the other guy to finish (not efficient, but rare) */ + while (crc_table_empty) + ; + } + +#ifdef MAKECRCH + /* write out CRC tables to crc32.h */ + { + FILE *out; + + out = fopen("crc32.h", "w"); + if (out == NULL) return; + fprintf(out, "/* crc32.h -- tables for rapid CRC calculation\n"); + fprintf(out, " * Generated automatically by crc32.c\n */\n\n"); + fprintf(out, "local const z_crc_t FAR "); + fprintf(out, "crc_table[TBLS][256] =\n{\n {\n"); + write_table(out, crc_table[0]); +# ifdef BYFOUR + fprintf(out, "#ifdef BYFOUR\n"); + for (k = 1; k < 8; k++) { + fprintf(out, " },\n {\n"); + write_table(out, crc_table[k]); + } + fprintf(out, "#endif\n"); +# endif /* BYFOUR */ + fprintf(out, " }\n};\n"); + fclose(out); + } +#endif /* MAKECRCH */ +} + +#ifdef MAKECRCH +local void write_table(out, table) + FILE *out; + const z_crc_t FAR *table; +{ + int n; + + for (n = 0; n < 256; n++) + fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : " ", + (unsigned long)(table[n]), + n == 255 ? "\n" : (n % 5 == 4 ? ",\n" : ", ")); +} +#endif /* MAKECRCH */ + +#else /* !DYNAMIC_CRC_TABLE */ +/* ======================================================================== + * Tables of CRC-32s of all single-byte values, made by make_crc_table(). + */ +#include "crc32.h" +#endif /* DYNAMIC_CRC_TABLE */ + +/* ========================================================================= + * This function can be used by asm versions of crc32() + */ +const z_crc_t FAR * ZEXPORT get_crc_table() +{ +#ifdef DYNAMIC_CRC_TABLE + if (crc_table_empty) + make_crc_table(); +#endif /* DYNAMIC_CRC_TABLE */ + return (const z_crc_t FAR *)crc_table; +} + +/* ========================================================================= */ +#define DO1 crc = crc_table[0][((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8) +#define DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1 + +/* ========================================================================= */ +unsigned long ZEXPORT crc32(crc, buf, len) + unsigned long crc; + const unsigned char FAR *buf; + uInt len; +{ + if (buf == Z_NULL) return 0UL; + +#ifdef DYNAMIC_CRC_TABLE + if (crc_table_empty) + make_crc_table(); +#endif /* DYNAMIC_CRC_TABLE */ + +#ifdef BYFOUR + if (sizeof(void *) == sizeof(ptrdiff_t)) { + z_crc_t endian; + + endian = 1; + if (*((unsigned char *)(&endian))) + return crc32_little(crc, buf, len); + else + return crc32_big(crc, buf, len); + } +#endif /* BYFOUR */ + crc = crc ^ 0xffffffffUL; + while (len >= 8) { + DO8; + len -= 8; + } + if (len) do { + DO1; + } while (--len); + return crc ^ 0xffffffffUL; +} + +#ifdef BYFOUR + +/* ========================================================================= */ +#define DOLIT4 c ^= *buf4++; \ + c = crc_table[3][c & 0xff] ^ crc_table[2][(c >> 8) & 0xff] ^ \ + crc_table[1][(c >> 16) & 0xff] ^ crc_table[0][c >> 24] +#define DOLIT32 DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4 + +/* ========================================================================= */ +local unsigned long crc32_little(crc, buf, len) + unsigned long crc; + const unsigned char FAR *buf; + unsigned len; +{ + register z_crc_t c; + register const z_crc_t FAR *buf4; + + c = (z_crc_t)crc; + c = ~c; + while (len && ((ptrdiff_t)buf & 3)) { + c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); + len--; + } + + buf4 = (const z_crc_t FAR *)(const void FAR *)buf; + while (len >= 32) { + DOLIT32; + len -= 32; + } + while (len >= 4) { + DOLIT4; + len -= 4; + } + buf = (const unsigned char FAR *)buf4; + + if (len) do { + c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); + } while (--len); + c = ~c; + return (unsigned long)c; +} + +/* ========================================================================= */ +#define DOBIG4 c ^= *++buf4; \ + c = crc_table[4][c & 0xff] ^ crc_table[5][(c >> 8) & 0xff] ^ \ + crc_table[6][(c >> 16) & 0xff] ^ crc_table[7][c >> 24] +#define DOBIG32 DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4 + +/* ========================================================================= */ +local unsigned long crc32_big(crc, buf, len) + unsigned long crc; + const unsigned char FAR *buf; + unsigned len; +{ + register z_crc_t c; + register const z_crc_t FAR *buf4; + + c = ZSWAP32((z_crc_t)crc); + c = ~c; + while (len && ((ptrdiff_t)buf & 3)) { + c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); + len--; + } + + buf4 = (const z_crc_t FAR *)(const void FAR *)buf; + buf4--; + while (len >= 32) { + DOBIG32; + len -= 32; + } + while (len >= 4) { + DOBIG4; + len -= 4; + } + buf4++; + buf = (const unsigned char FAR *)buf4; + + if (len) do { + c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); + } while (--len); + c = ~c; + return (unsigned long)(ZSWAP32(c)); +} + +#endif /* BYFOUR */ + +#define GF2_DIM 32 /* dimension of GF(2) vectors (length of CRC) */ + +/* ========================================================================= */ +local unsigned long gf2_matrix_times(mat, vec) + unsigned long *mat; + unsigned long vec; +{ + unsigned long sum; + + sum = 0; + while (vec) { + if (vec & 1) + sum ^= *mat; + vec >>= 1; + mat++; + } + return sum; +} + +/* ========================================================================= */ +local void gf2_matrix_square(square, mat) + unsigned long *square; + unsigned long *mat; +{ + int n; + + for (n = 0; n < GF2_DIM; n++) + square[n] = gf2_matrix_times(mat, mat[n]); +} + +/* ========================================================================= */ +local uLong crc32_combine_(crc1, crc2, len2) + uLong crc1; + uLong crc2; + z_off64_t len2; +{ + int n; + unsigned long row; + unsigned long even[GF2_DIM]; /* even-power-of-two zeros operator */ + unsigned long odd[GF2_DIM]; /* odd-power-of-two zeros operator */ + + /* degenerate case (also disallow negative lengths) */ + if (len2 <= 0) + return crc1; + + /* put operator for one zero bit in odd */ + odd[0] = 0xedb88320UL; /* CRC-32 polynomial */ + row = 1; + for (n = 1; n < GF2_DIM; n++) { + odd[n] = row; + row <<= 1; + } + + /* put operator for two zero bits in even */ + gf2_matrix_square(even, odd); + + /* put operator for four zero bits in odd */ + gf2_matrix_square(odd, even); + + /* apply len2 zeros to crc1 (first square will put the operator for one + zero byte, eight zero bits, in even) */ + do { + /* apply zeros operator for this bit of len2 */ + gf2_matrix_square(even, odd); + if (len2 & 1) + crc1 = gf2_matrix_times(even, crc1); + len2 >>= 1; + + /* if no more bits set, then done */ + if (len2 == 0) + break; + + /* another iteration of the loop with odd and even swapped */ + gf2_matrix_square(odd, even); + if (len2 & 1) + crc1 = gf2_matrix_times(odd, crc1); + len2 >>= 1; + + /* if no more bits set, then done */ + } while (len2 != 0); + + /* return combined crc */ + crc1 ^= crc2; + return crc1; +} + +/* ========================================================================= */ +uLong ZEXPORT crc32_combine(crc1, crc2, len2) + uLong crc1; + uLong crc2; + z_off_t len2; +{ + return crc32_combine_(crc1, crc2, len2); +} + +uLong ZEXPORT crc32_combine64(crc1, crc2, len2) + uLong crc1; + uLong crc2; + z_off64_t len2; +{ + return crc32_combine_(crc1, crc2, len2); +} diff --git a/Minecraft.Client/Common/zlib/crc32.h b/Minecraft.Client/Common/zlib/crc32.h new file mode 100644 index 00000000..9e0c7781 --- /dev/null +++ b/Minecraft.Client/Common/zlib/crc32.h @@ -0,0 +1,441 @@ +/* crc32.h -- tables for rapid CRC calculation + * Generated automatically by crc32.c + */ + +local const z_crc_t FAR crc_table[TBLS][256] = +{ + { + 0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL, + 0x706af48fUL, 0xe963a535UL, 0x9e6495a3UL, 0x0edb8832UL, 0x79dcb8a4UL, + 0xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL, + 0x90bf1d91UL, 0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL, + 0x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL, 0x136c9856UL, + 0x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL, 0x63066cd9UL, + 0xfa0f3d63UL, 0x8d080df5UL, 0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL, + 0xa2677172UL, 0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL, + 0x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL, + 0x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL, 0x26d930acUL, 0x51de003aUL, + 0xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL, + 0xb8bda50fUL, 0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL, + 0x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL, 0x76dc4190UL, + 0x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL, 0x06b6b51fUL, + 0x9fbfe4a5UL, 0xe8b8d433UL, 0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL, + 0xe10e9818UL, 0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL, + 0x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL, + 0x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL, 0x65b0d9c6UL, 0x12b7e950UL, + 0x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL, + 0xfbd44c65UL, 0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL, + 0x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL, 0x4369e96aUL, + 0x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL, 0x33031de5UL, + 0xaa0a4c5fUL, 0xdd0d7cc9UL, 0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL, + 0xc90c2086UL, 0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL, + 0x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL, + 0x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL, 0xedb88320UL, 0x9abfb3b6UL, + 0x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL, 0x9dd277afUL, 0x04db2615UL, + 0x73dc1683UL, 0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL, + 0xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL, 0xf00f9344UL, + 0x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL, 0x806567cbUL, + 0x196c3671UL, 0x6e6b06e7UL, 0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL, + 0x67dd4accUL, 0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL, + 0xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL, 0xd1bb67f1UL, + 0xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL, 0xd80d2bdaUL, 0xaf0a1b4cUL, + 0x36034af6UL, 0x41047a60UL, 0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL, + 0x4669be79UL, 0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL, + 0xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL, 0xc5ba3bbeUL, + 0xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL, 0xc2d7ffa7UL, 0xb5d0cf31UL, + 0x2cd99e8bUL, 0x5bdeae1dUL, 0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL, + 0x026d930aUL, 0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL, + 0x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL, 0x92d28e9bUL, + 0xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL, 0x86d3d2d4UL, 0xf1d4e242UL, + 0x68ddb3f8UL, 0x1fda836eUL, 0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL, + 0x18b74777UL, 0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL, + 0x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL, 0xa00ae278UL, + 0xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL, 0xa7672661UL, 0xd06016f7UL, + 0x4969474dUL, 0x3e6e77dbUL, 0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL, + 0x37d83bf0UL, 0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL, + 0xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL, 0xbad03605UL, + 0xcdd70693UL, 0x54de5729UL, 0x23d967bfUL, 0xb3667a2eUL, 0xc4614ab8UL, + 0x5d681b02UL, 0x2a6f2b94UL, 0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL, + 0x2d02ef8dUL +#ifdef BYFOUR + }, + { + 0x00000000UL, 0x191b3141UL, 0x32366282UL, 0x2b2d53c3UL, 0x646cc504UL, + 0x7d77f445UL, 0x565aa786UL, 0x4f4196c7UL, 0xc8d98a08UL, 0xd1c2bb49UL, + 0xfaefe88aUL, 0xe3f4d9cbUL, 0xacb54f0cUL, 0xb5ae7e4dUL, 0x9e832d8eUL, + 0x87981ccfUL, 0x4ac21251UL, 0x53d92310UL, 0x78f470d3UL, 0x61ef4192UL, + 0x2eaed755UL, 0x37b5e614UL, 0x1c98b5d7UL, 0x05838496UL, 0x821b9859UL, + 0x9b00a918UL, 0xb02dfadbUL, 0xa936cb9aUL, 0xe6775d5dUL, 0xff6c6c1cUL, + 0xd4413fdfUL, 0xcd5a0e9eUL, 0x958424a2UL, 0x8c9f15e3UL, 0xa7b24620UL, + 0xbea97761UL, 0xf1e8e1a6UL, 0xe8f3d0e7UL, 0xc3de8324UL, 0xdac5b265UL, + 0x5d5daeaaUL, 0x44469febUL, 0x6f6bcc28UL, 0x7670fd69UL, 0x39316baeUL, + 0x202a5aefUL, 0x0b07092cUL, 0x121c386dUL, 0xdf4636f3UL, 0xc65d07b2UL, + 0xed705471UL, 0xf46b6530UL, 0xbb2af3f7UL, 0xa231c2b6UL, 0x891c9175UL, + 0x9007a034UL, 0x179fbcfbUL, 0x0e848dbaUL, 0x25a9de79UL, 0x3cb2ef38UL, + 0x73f379ffUL, 0x6ae848beUL, 0x41c51b7dUL, 0x58de2a3cUL, 0xf0794f05UL, + 0xe9627e44UL, 0xc24f2d87UL, 0xdb541cc6UL, 0x94158a01UL, 0x8d0ebb40UL, + 0xa623e883UL, 0xbf38d9c2UL, 0x38a0c50dUL, 0x21bbf44cUL, 0x0a96a78fUL, + 0x138d96ceUL, 0x5ccc0009UL, 0x45d73148UL, 0x6efa628bUL, 0x77e153caUL, + 0xbabb5d54UL, 0xa3a06c15UL, 0x888d3fd6UL, 0x91960e97UL, 0xded79850UL, + 0xc7cca911UL, 0xece1fad2UL, 0xf5facb93UL, 0x7262d75cUL, 0x6b79e61dUL, + 0x4054b5deUL, 0x594f849fUL, 0x160e1258UL, 0x0f152319UL, 0x243870daUL, + 0x3d23419bUL, 0x65fd6ba7UL, 0x7ce65ae6UL, 0x57cb0925UL, 0x4ed03864UL, + 0x0191aea3UL, 0x188a9fe2UL, 0x33a7cc21UL, 0x2abcfd60UL, 0xad24e1afUL, + 0xb43fd0eeUL, 0x9f12832dUL, 0x8609b26cUL, 0xc94824abUL, 0xd05315eaUL, + 0xfb7e4629UL, 0xe2657768UL, 0x2f3f79f6UL, 0x362448b7UL, 0x1d091b74UL, + 0x04122a35UL, 0x4b53bcf2UL, 0x52488db3UL, 0x7965de70UL, 0x607eef31UL, + 0xe7e6f3feUL, 0xfefdc2bfUL, 0xd5d0917cUL, 0xcccba03dUL, 0x838a36faUL, + 0x9a9107bbUL, 0xb1bc5478UL, 0xa8a76539UL, 0x3b83984bUL, 0x2298a90aUL, + 0x09b5fac9UL, 0x10aecb88UL, 0x5fef5d4fUL, 0x46f46c0eUL, 0x6dd93fcdUL, + 0x74c20e8cUL, 0xf35a1243UL, 0xea412302UL, 0xc16c70c1UL, 0xd8774180UL, + 0x9736d747UL, 0x8e2de606UL, 0xa500b5c5UL, 0xbc1b8484UL, 0x71418a1aUL, + 0x685abb5bUL, 0x4377e898UL, 0x5a6cd9d9UL, 0x152d4f1eUL, 0x0c367e5fUL, + 0x271b2d9cUL, 0x3e001cddUL, 0xb9980012UL, 0xa0833153UL, 0x8bae6290UL, + 0x92b553d1UL, 0xddf4c516UL, 0xc4eff457UL, 0xefc2a794UL, 0xf6d996d5UL, + 0xae07bce9UL, 0xb71c8da8UL, 0x9c31de6bUL, 0x852aef2aUL, 0xca6b79edUL, + 0xd37048acUL, 0xf85d1b6fUL, 0xe1462a2eUL, 0x66de36e1UL, 0x7fc507a0UL, + 0x54e85463UL, 0x4df36522UL, 0x02b2f3e5UL, 0x1ba9c2a4UL, 0x30849167UL, + 0x299fa026UL, 0xe4c5aeb8UL, 0xfdde9ff9UL, 0xd6f3cc3aUL, 0xcfe8fd7bUL, + 0x80a96bbcUL, 0x99b25afdUL, 0xb29f093eUL, 0xab84387fUL, 0x2c1c24b0UL, + 0x350715f1UL, 0x1e2a4632UL, 0x07317773UL, 0x4870e1b4UL, 0x516bd0f5UL, + 0x7a468336UL, 0x635db277UL, 0xcbfad74eUL, 0xd2e1e60fUL, 0xf9ccb5ccUL, + 0xe0d7848dUL, 0xaf96124aUL, 0xb68d230bUL, 0x9da070c8UL, 0x84bb4189UL, + 0x03235d46UL, 0x1a386c07UL, 0x31153fc4UL, 0x280e0e85UL, 0x674f9842UL, + 0x7e54a903UL, 0x5579fac0UL, 0x4c62cb81UL, 0x8138c51fUL, 0x9823f45eUL, + 0xb30ea79dUL, 0xaa1596dcUL, 0xe554001bUL, 0xfc4f315aUL, 0xd7626299UL, + 0xce7953d8UL, 0x49e14f17UL, 0x50fa7e56UL, 0x7bd72d95UL, 0x62cc1cd4UL, + 0x2d8d8a13UL, 0x3496bb52UL, 0x1fbbe891UL, 0x06a0d9d0UL, 0x5e7ef3ecUL, + 0x4765c2adUL, 0x6c48916eUL, 0x7553a02fUL, 0x3a1236e8UL, 0x230907a9UL, + 0x0824546aUL, 0x113f652bUL, 0x96a779e4UL, 0x8fbc48a5UL, 0xa4911b66UL, + 0xbd8a2a27UL, 0xf2cbbce0UL, 0xebd08da1UL, 0xc0fdde62UL, 0xd9e6ef23UL, + 0x14bce1bdUL, 0x0da7d0fcUL, 0x268a833fUL, 0x3f91b27eUL, 0x70d024b9UL, + 0x69cb15f8UL, 0x42e6463bUL, 0x5bfd777aUL, 0xdc656bb5UL, 0xc57e5af4UL, + 0xee530937UL, 0xf7483876UL, 0xb809aeb1UL, 0xa1129ff0UL, 0x8a3fcc33UL, + 0x9324fd72UL + }, + { + 0x00000000UL, 0x01c26a37UL, 0x0384d46eUL, 0x0246be59UL, 0x0709a8dcUL, + 0x06cbc2ebUL, 0x048d7cb2UL, 0x054f1685UL, 0x0e1351b8UL, 0x0fd13b8fUL, + 0x0d9785d6UL, 0x0c55efe1UL, 0x091af964UL, 0x08d89353UL, 0x0a9e2d0aUL, + 0x0b5c473dUL, 0x1c26a370UL, 0x1de4c947UL, 0x1fa2771eUL, 0x1e601d29UL, + 0x1b2f0bacUL, 0x1aed619bUL, 0x18abdfc2UL, 0x1969b5f5UL, 0x1235f2c8UL, + 0x13f798ffUL, 0x11b126a6UL, 0x10734c91UL, 0x153c5a14UL, 0x14fe3023UL, + 0x16b88e7aUL, 0x177ae44dUL, 0x384d46e0UL, 0x398f2cd7UL, 0x3bc9928eUL, + 0x3a0bf8b9UL, 0x3f44ee3cUL, 0x3e86840bUL, 0x3cc03a52UL, 0x3d025065UL, + 0x365e1758UL, 0x379c7d6fUL, 0x35dac336UL, 0x3418a901UL, 0x3157bf84UL, + 0x3095d5b3UL, 0x32d36beaUL, 0x331101ddUL, 0x246be590UL, 0x25a98fa7UL, + 0x27ef31feUL, 0x262d5bc9UL, 0x23624d4cUL, 0x22a0277bUL, 0x20e69922UL, + 0x2124f315UL, 0x2a78b428UL, 0x2bbade1fUL, 0x29fc6046UL, 0x283e0a71UL, + 0x2d711cf4UL, 0x2cb376c3UL, 0x2ef5c89aUL, 0x2f37a2adUL, 0x709a8dc0UL, + 0x7158e7f7UL, 0x731e59aeUL, 0x72dc3399UL, 0x7793251cUL, 0x76514f2bUL, + 0x7417f172UL, 0x75d59b45UL, 0x7e89dc78UL, 0x7f4bb64fUL, 0x7d0d0816UL, + 0x7ccf6221UL, 0x798074a4UL, 0x78421e93UL, 0x7a04a0caUL, 0x7bc6cafdUL, + 0x6cbc2eb0UL, 0x6d7e4487UL, 0x6f38fadeUL, 0x6efa90e9UL, 0x6bb5866cUL, + 0x6a77ec5bUL, 0x68315202UL, 0x69f33835UL, 0x62af7f08UL, 0x636d153fUL, + 0x612bab66UL, 0x60e9c151UL, 0x65a6d7d4UL, 0x6464bde3UL, 0x662203baUL, + 0x67e0698dUL, 0x48d7cb20UL, 0x4915a117UL, 0x4b531f4eUL, 0x4a917579UL, + 0x4fde63fcUL, 0x4e1c09cbUL, 0x4c5ab792UL, 0x4d98dda5UL, 0x46c49a98UL, + 0x4706f0afUL, 0x45404ef6UL, 0x448224c1UL, 0x41cd3244UL, 0x400f5873UL, + 0x4249e62aUL, 0x438b8c1dUL, 0x54f16850UL, 0x55330267UL, 0x5775bc3eUL, + 0x56b7d609UL, 0x53f8c08cUL, 0x523aaabbUL, 0x507c14e2UL, 0x51be7ed5UL, + 0x5ae239e8UL, 0x5b2053dfUL, 0x5966ed86UL, 0x58a487b1UL, 0x5deb9134UL, + 0x5c29fb03UL, 0x5e6f455aUL, 0x5fad2f6dUL, 0xe1351b80UL, 0xe0f771b7UL, + 0xe2b1cfeeUL, 0xe373a5d9UL, 0xe63cb35cUL, 0xe7fed96bUL, 0xe5b86732UL, + 0xe47a0d05UL, 0xef264a38UL, 0xeee4200fUL, 0xeca29e56UL, 0xed60f461UL, + 0xe82fe2e4UL, 0xe9ed88d3UL, 0xebab368aUL, 0xea695cbdUL, 0xfd13b8f0UL, + 0xfcd1d2c7UL, 0xfe976c9eUL, 0xff5506a9UL, 0xfa1a102cUL, 0xfbd87a1bUL, + 0xf99ec442UL, 0xf85cae75UL, 0xf300e948UL, 0xf2c2837fUL, 0xf0843d26UL, + 0xf1465711UL, 0xf4094194UL, 0xf5cb2ba3UL, 0xf78d95faUL, 0xf64fffcdUL, + 0xd9785d60UL, 0xd8ba3757UL, 0xdafc890eUL, 0xdb3ee339UL, 0xde71f5bcUL, + 0xdfb39f8bUL, 0xddf521d2UL, 0xdc374be5UL, 0xd76b0cd8UL, 0xd6a966efUL, + 0xd4efd8b6UL, 0xd52db281UL, 0xd062a404UL, 0xd1a0ce33UL, 0xd3e6706aUL, + 0xd2241a5dUL, 0xc55efe10UL, 0xc49c9427UL, 0xc6da2a7eUL, 0xc7184049UL, + 0xc25756ccUL, 0xc3953cfbUL, 0xc1d382a2UL, 0xc011e895UL, 0xcb4dafa8UL, + 0xca8fc59fUL, 0xc8c97bc6UL, 0xc90b11f1UL, 0xcc440774UL, 0xcd866d43UL, + 0xcfc0d31aUL, 0xce02b92dUL, 0x91af9640UL, 0x906dfc77UL, 0x922b422eUL, + 0x93e92819UL, 0x96a63e9cUL, 0x976454abUL, 0x9522eaf2UL, 0x94e080c5UL, + 0x9fbcc7f8UL, 0x9e7eadcfUL, 0x9c381396UL, 0x9dfa79a1UL, 0x98b56f24UL, + 0x99770513UL, 0x9b31bb4aUL, 0x9af3d17dUL, 0x8d893530UL, 0x8c4b5f07UL, + 0x8e0de15eUL, 0x8fcf8b69UL, 0x8a809decUL, 0x8b42f7dbUL, 0x89044982UL, + 0x88c623b5UL, 0x839a6488UL, 0x82580ebfUL, 0x801eb0e6UL, 0x81dcdad1UL, + 0x8493cc54UL, 0x8551a663UL, 0x8717183aUL, 0x86d5720dUL, 0xa9e2d0a0UL, + 0xa820ba97UL, 0xaa6604ceUL, 0xaba46ef9UL, 0xaeeb787cUL, 0xaf29124bUL, + 0xad6fac12UL, 0xacadc625UL, 0xa7f18118UL, 0xa633eb2fUL, 0xa4755576UL, + 0xa5b73f41UL, 0xa0f829c4UL, 0xa13a43f3UL, 0xa37cfdaaUL, 0xa2be979dUL, + 0xb5c473d0UL, 0xb40619e7UL, 0xb640a7beUL, 0xb782cd89UL, 0xb2cddb0cUL, + 0xb30fb13bUL, 0xb1490f62UL, 0xb08b6555UL, 0xbbd72268UL, 0xba15485fUL, + 0xb853f606UL, 0xb9919c31UL, 0xbcde8ab4UL, 0xbd1ce083UL, 0xbf5a5edaUL, + 0xbe9834edUL + }, + { + 0x00000000UL, 0xb8bc6765UL, 0xaa09c88bUL, 0x12b5afeeUL, 0x8f629757UL, + 0x37def032UL, 0x256b5fdcUL, 0x9dd738b9UL, 0xc5b428efUL, 0x7d084f8aUL, + 0x6fbde064UL, 0xd7018701UL, 0x4ad6bfb8UL, 0xf26ad8ddUL, 0xe0df7733UL, + 0x58631056UL, 0x5019579fUL, 0xe8a530faUL, 0xfa109f14UL, 0x42acf871UL, + 0xdf7bc0c8UL, 0x67c7a7adUL, 0x75720843UL, 0xcdce6f26UL, 0x95ad7f70UL, + 0x2d111815UL, 0x3fa4b7fbUL, 0x8718d09eUL, 0x1acfe827UL, 0xa2738f42UL, + 0xb0c620acUL, 0x087a47c9UL, 0xa032af3eUL, 0x188ec85bUL, 0x0a3b67b5UL, + 0xb28700d0UL, 0x2f503869UL, 0x97ec5f0cUL, 0x8559f0e2UL, 0x3de59787UL, + 0x658687d1UL, 0xdd3ae0b4UL, 0xcf8f4f5aUL, 0x7733283fUL, 0xeae41086UL, + 0x525877e3UL, 0x40edd80dUL, 0xf851bf68UL, 0xf02bf8a1UL, 0x48979fc4UL, + 0x5a22302aUL, 0xe29e574fUL, 0x7f496ff6UL, 0xc7f50893UL, 0xd540a77dUL, + 0x6dfcc018UL, 0x359fd04eUL, 0x8d23b72bUL, 0x9f9618c5UL, 0x272a7fa0UL, + 0xbafd4719UL, 0x0241207cUL, 0x10f48f92UL, 0xa848e8f7UL, 0x9b14583dUL, + 0x23a83f58UL, 0x311d90b6UL, 0x89a1f7d3UL, 0x1476cf6aUL, 0xaccaa80fUL, + 0xbe7f07e1UL, 0x06c36084UL, 0x5ea070d2UL, 0xe61c17b7UL, 0xf4a9b859UL, + 0x4c15df3cUL, 0xd1c2e785UL, 0x697e80e0UL, 0x7bcb2f0eUL, 0xc377486bUL, + 0xcb0d0fa2UL, 0x73b168c7UL, 0x6104c729UL, 0xd9b8a04cUL, 0x446f98f5UL, + 0xfcd3ff90UL, 0xee66507eUL, 0x56da371bUL, 0x0eb9274dUL, 0xb6054028UL, + 0xa4b0efc6UL, 0x1c0c88a3UL, 0x81dbb01aUL, 0x3967d77fUL, 0x2bd27891UL, + 0x936e1ff4UL, 0x3b26f703UL, 0x839a9066UL, 0x912f3f88UL, 0x299358edUL, + 0xb4446054UL, 0x0cf80731UL, 0x1e4da8dfUL, 0xa6f1cfbaUL, 0xfe92dfecUL, + 0x462eb889UL, 0x549b1767UL, 0xec277002UL, 0x71f048bbUL, 0xc94c2fdeUL, + 0xdbf98030UL, 0x6345e755UL, 0x6b3fa09cUL, 0xd383c7f9UL, 0xc1366817UL, + 0x798a0f72UL, 0xe45d37cbUL, 0x5ce150aeUL, 0x4e54ff40UL, 0xf6e89825UL, + 0xae8b8873UL, 0x1637ef16UL, 0x048240f8UL, 0xbc3e279dUL, 0x21e91f24UL, + 0x99557841UL, 0x8be0d7afUL, 0x335cb0caUL, 0xed59b63bUL, 0x55e5d15eUL, + 0x47507eb0UL, 0xffec19d5UL, 0x623b216cUL, 0xda874609UL, 0xc832e9e7UL, + 0x708e8e82UL, 0x28ed9ed4UL, 0x9051f9b1UL, 0x82e4565fUL, 0x3a58313aUL, + 0xa78f0983UL, 0x1f336ee6UL, 0x0d86c108UL, 0xb53aa66dUL, 0xbd40e1a4UL, + 0x05fc86c1UL, 0x1749292fUL, 0xaff54e4aUL, 0x322276f3UL, 0x8a9e1196UL, + 0x982bbe78UL, 0x2097d91dUL, 0x78f4c94bUL, 0xc048ae2eUL, 0xd2fd01c0UL, + 0x6a4166a5UL, 0xf7965e1cUL, 0x4f2a3979UL, 0x5d9f9697UL, 0xe523f1f2UL, + 0x4d6b1905UL, 0xf5d77e60UL, 0xe762d18eUL, 0x5fdeb6ebUL, 0xc2098e52UL, + 0x7ab5e937UL, 0x680046d9UL, 0xd0bc21bcUL, 0x88df31eaUL, 0x3063568fUL, + 0x22d6f961UL, 0x9a6a9e04UL, 0x07bda6bdUL, 0xbf01c1d8UL, 0xadb46e36UL, + 0x15080953UL, 0x1d724e9aUL, 0xa5ce29ffUL, 0xb77b8611UL, 0x0fc7e174UL, + 0x9210d9cdUL, 0x2aacbea8UL, 0x38191146UL, 0x80a57623UL, 0xd8c66675UL, + 0x607a0110UL, 0x72cfaefeUL, 0xca73c99bUL, 0x57a4f122UL, 0xef189647UL, + 0xfdad39a9UL, 0x45115eccUL, 0x764dee06UL, 0xcef18963UL, 0xdc44268dUL, + 0x64f841e8UL, 0xf92f7951UL, 0x41931e34UL, 0x5326b1daUL, 0xeb9ad6bfUL, + 0xb3f9c6e9UL, 0x0b45a18cUL, 0x19f00e62UL, 0xa14c6907UL, 0x3c9b51beUL, + 0x842736dbUL, 0x96929935UL, 0x2e2efe50UL, 0x2654b999UL, 0x9ee8defcUL, + 0x8c5d7112UL, 0x34e11677UL, 0xa9362eceUL, 0x118a49abUL, 0x033fe645UL, + 0xbb838120UL, 0xe3e09176UL, 0x5b5cf613UL, 0x49e959fdUL, 0xf1553e98UL, + 0x6c820621UL, 0xd43e6144UL, 0xc68bceaaUL, 0x7e37a9cfUL, 0xd67f4138UL, + 0x6ec3265dUL, 0x7c7689b3UL, 0xc4caeed6UL, 0x591dd66fUL, 0xe1a1b10aUL, + 0xf3141ee4UL, 0x4ba87981UL, 0x13cb69d7UL, 0xab770eb2UL, 0xb9c2a15cUL, + 0x017ec639UL, 0x9ca9fe80UL, 0x241599e5UL, 0x36a0360bUL, 0x8e1c516eUL, + 0x866616a7UL, 0x3eda71c2UL, 0x2c6fde2cUL, 0x94d3b949UL, 0x090481f0UL, + 0xb1b8e695UL, 0xa30d497bUL, 0x1bb12e1eUL, 0x43d23e48UL, 0xfb6e592dUL, + 0xe9dbf6c3UL, 0x516791a6UL, 0xccb0a91fUL, 0x740cce7aUL, 0x66b96194UL, + 0xde0506f1UL + }, + { + 0x00000000UL, 0x96300777UL, 0x2c610eeeUL, 0xba510999UL, 0x19c46d07UL, + 0x8ff46a70UL, 0x35a563e9UL, 0xa395649eUL, 0x3288db0eUL, 0xa4b8dc79UL, + 0x1ee9d5e0UL, 0x88d9d297UL, 0x2b4cb609UL, 0xbd7cb17eUL, 0x072db8e7UL, + 0x911dbf90UL, 0x6410b71dUL, 0xf220b06aUL, 0x4871b9f3UL, 0xde41be84UL, + 0x7dd4da1aUL, 0xebe4dd6dUL, 0x51b5d4f4UL, 0xc785d383UL, 0x56986c13UL, + 0xc0a86b64UL, 0x7af962fdUL, 0xecc9658aUL, 0x4f5c0114UL, 0xd96c0663UL, + 0x633d0ffaUL, 0xf50d088dUL, 0xc8206e3bUL, 0x5e10694cUL, 0xe44160d5UL, + 0x727167a2UL, 0xd1e4033cUL, 0x47d4044bUL, 0xfd850dd2UL, 0x6bb50aa5UL, + 0xfaa8b535UL, 0x6c98b242UL, 0xd6c9bbdbUL, 0x40f9bcacUL, 0xe36cd832UL, + 0x755cdf45UL, 0xcf0dd6dcUL, 0x593dd1abUL, 0xac30d926UL, 0x3a00de51UL, + 0x8051d7c8UL, 0x1661d0bfUL, 0xb5f4b421UL, 0x23c4b356UL, 0x9995bacfUL, + 0x0fa5bdb8UL, 0x9eb80228UL, 0x0888055fUL, 0xb2d90cc6UL, 0x24e90bb1UL, + 0x877c6f2fUL, 0x114c6858UL, 0xab1d61c1UL, 0x3d2d66b6UL, 0x9041dc76UL, + 0x0671db01UL, 0xbc20d298UL, 0x2a10d5efUL, 0x8985b171UL, 0x1fb5b606UL, + 0xa5e4bf9fUL, 0x33d4b8e8UL, 0xa2c90778UL, 0x34f9000fUL, 0x8ea80996UL, + 0x18980ee1UL, 0xbb0d6a7fUL, 0x2d3d6d08UL, 0x976c6491UL, 0x015c63e6UL, + 0xf4516b6bUL, 0x62616c1cUL, 0xd8306585UL, 0x4e0062f2UL, 0xed95066cUL, + 0x7ba5011bUL, 0xc1f40882UL, 0x57c40ff5UL, 0xc6d9b065UL, 0x50e9b712UL, + 0xeab8be8bUL, 0x7c88b9fcUL, 0xdf1ddd62UL, 0x492dda15UL, 0xf37cd38cUL, + 0x654cd4fbUL, 0x5861b24dUL, 0xce51b53aUL, 0x7400bca3UL, 0xe230bbd4UL, + 0x41a5df4aUL, 0xd795d83dUL, 0x6dc4d1a4UL, 0xfbf4d6d3UL, 0x6ae96943UL, + 0xfcd96e34UL, 0x468867adUL, 0xd0b860daUL, 0x732d0444UL, 0xe51d0333UL, + 0x5f4c0aaaUL, 0xc97c0dddUL, 0x3c710550UL, 0xaa410227UL, 0x10100bbeUL, + 0x86200cc9UL, 0x25b56857UL, 0xb3856f20UL, 0x09d466b9UL, 0x9fe461ceUL, + 0x0ef9de5eUL, 0x98c9d929UL, 0x2298d0b0UL, 0xb4a8d7c7UL, 0x173db359UL, + 0x810db42eUL, 0x3b5cbdb7UL, 0xad6cbac0UL, 0x2083b8edUL, 0xb6b3bf9aUL, + 0x0ce2b603UL, 0x9ad2b174UL, 0x3947d5eaUL, 0xaf77d29dUL, 0x1526db04UL, + 0x8316dc73UL, 0x120b63e3UL, 0x843b6494UL, 0x3e6a6d0dUL, 0xa85a6a7aUL, + 0x0bcf0ee4UL, 0x9dff0993UL, 0x27ae000aUL, 0xb19e077dUL, 0x44930ff0UL, + 0xd2a30887UL, 0x68f2011eUL, 0xfec20669UL, 0x5d5762f7UL, 0xcb676580UL, + 0x71366c19UL, 0xe7066b6eUL, 0x761bd4feUL, 0xe02bd389UL, 0x5a7ada10UL, + 0xcc4add67UL, 0x6fdfb9f9UL, 0xf9efbe8eUL, 0x43beb717UL, 0xd58eb060UL, + 0xe8a3d6d6UL, 0x7e93d1a1UL, 0xc4c2d838UL, 0x52f2df4fUL, 0xf167bbd1UL, + 0x6757bca6UL, 0xdd06b53fUL, 0x4b36b248UL, 0xda2b0dd8UL, 0x4c1b0aafUL, + 0xf64a0336UL, 0x607a0441UL, 0xc3ef60dfUL, 0x55df67a8UL, 0xef8e6e31UL, + 0x79be6946UL, 0x8cb361cbUL, 0x1a8366bcUL, 0xa0d26f25UL, 0x36e26852UL, + 0x95770cccUL, 0x03470bbbUL, 0xb9160222UL, 0x2f260555UL, 0xbe3bbac5UL, + 0x280bbdb2UL, 0x925ab42bUL, 0x046ab35cUL, 0xa7ffd7c2UL, 0x31cfd0b5UL, + 0x8b9ed92cUL, 0x1daede5bUL, 0xb0c2649bUL, 0x26f263ecUL, 0x9ca36a75UL, + 0x0a936d02UL, 0xa906099cUL, 0x3f360eebUL, 0x85670772UL, 0x13570005UL, + 0x824abf95UL, 0x147ab8e2UL, 0xae2bb17bUL, 0x381bb60cUL, 0x9b8ed292UL, + 0x0dbed5e5UL, 0xb7efdc7cUL, 0x21dfdb0bUL, 0xd4d2d386UL, 0x42e2d4f1UL, + 0xf8b3dd68UL, 0x6e83da1fUL, 0xcd16be81UL, 0x5b26b9f6UL, 0xe177b06fUL, + 0x7747b718UL, 0xe65a0888UL, 0x706a0fffUL, 0xca3b0666UL, 0x5c0b0111UL, + 0xff9e658fUL, 0x69ae62f8UL, 0xd3ff6b61UL, 0x45cf6c16UL, 0x78e20aa0UL, + 0xeed20dd7UL, 0x5483044eUL, 0xc2b30339UL, 0x612667a7UL, 0xf71660d0UL, + 0x4d476949UL, 0xdb776e3eUL, 0x4a6ad1aeUL, 0xdc5ad6d9UL, 0x660bdf40UL, + 0xf03bd837UL, 0x53aebca9UL, 0xc59ebbdeUL, 0x7fcfb247UL, 0xe9ffb530UL, + 0x1cf2bdbdUL, 0x8ac2bacaUL, 0x3093b353UL, 0xa6a3b424UL, 0x0536d0baUL, + 0x9306d7cdUL, 0x2957de54UL, 0xbf67d923UL, 0x2e7a66b3UL, 0xb84a61c4UL, + 0x021b685dUL, 0x942b6f2aUL, 0x37be0bb4UL, 0xa18e0cc3UL, 0x1bdf055aUL, + 0x8def022dUL + }, + { + 0x00000000UL, 0x41311b19UL, 0x82623632UL, 0xc3532d2bUL, 0x04c56c64UL, + 0x45f4777dUL, 0x86a75a56UL, 0xc796414fUL, 0x088ad9c8UL, 0x49bbc2d1UL, + 0x8ae8effaUL, 0xcbd9f4e3UL, 0x0c4fb5acUL, 0x4d7eaeb5UL, 0x8e2d839eUL, + 0xcf1c9887UL, 0x5112c24aUL, 0x1023d953UL, 0xd370f478UL, 0x9241ef61UL, + 0x55d7ae2eUL, 0x14e6b537UL, 0xd7b5981cUL, 0x96848305UL, 0x59981b82UL, + 0x18a9009bUL, 0xdbfa2db0UL, 0x9acb36a9UL, 0x5d5d77e6UL, 0x1c6c6cffUL, + 0xdf3f41d4UL, 0x9e0e5acdUL, 0xa2248495UL, 0xe3159f8cUL, 0x2046b2a7UL, + 0x6177a9beUL, 0xa6e1e8f1UL, 0xe7d0f3e8UL, 0x2483dec3UL, 0x65b2c5daUL, + 0xaaae5d5dUL, 0xeb9f4644UL, 0x28cc6b6fUL, 0x69fd7076UL, 0xae6b3139UL, + 0xef5a2a20UL, 0x2c09070bUL, 0x6d381c12UL, 0xf33646dfUL, 0xb2075dc6UL, + 0x715470edUL, 0x30656bf4UL, 0xf7f32abbUL, 0xb6c231a2UL, 0x75911c89UL, + 0x34a00790UL, 0xfbbc9f17UL, 0xba8d840eUL, 0x79dea925UL, 0x38efb23cUL, + 0xff79f373UL, 0xbe48e86aUL, 0x7d1bc541UL, 0x3c2ade58UL, 0x054f79f0UL, + 0x447e62e9UL, 0x872d4fc2UL, 0xc61c54dbUL, 0x018a1594UL, 0x40bb0e8dUL, + 0x83e823a6UL, 0xc2d938bfUL, 0x0dc5a038UL, 0x4cf4bb21UL, 0x8fa7960aUL, + 0xce968d13UL, 0x0900cc5cUL, 0x4831d745UL, 0x8b62fa6eUL, 0xca53e177UL, + 0x545dbbbaUL, 0x156ca0a3UL, 0xd63f8d88UL, 0x970e9691UL, 0x5098d7deUL, + 0x11a9ccc7UL, 0xd2fae1ecUL, 0x93cbfaf5UL, 0x5cd76272UL, 0x1de6796bUL, + 0xdeb55440UL, 0x9f844f59UL, 0x58120e16UL, 0x1923150fUL, 0xda703824UL, + 0x9b41233dUL, 0xa76bfd65UL, 0xe65ae67cUL, 0x2509cb57UL, 0x6438d04eUL, + 0xa3ae9101UL, 0xe29f8a18UL, 0x21cca733UL, 0x60fdbc2aUL, 0xafe124adUL, + 0xeed03fb4UL, 0x2d83129fUL, 0x6cb20986UL, 0xab2448c9UL, 0xea1553d0UL, + 0x29467efbUL, 0x687765e2UL, 0xf6793f2fUL, 0xb7482436UL, 0x741b091dUL, + 0x352a1204UL, 0xf2bc534bUL, 0xb38d4852UL, 0x70de6579UL, 0x31ef7e60UL, + 0xfef3e6e7UL, 0xbfc2fdfeUL, 0x7c91d0d5UL, 0x3da0cbccUL, 0xfa368a83UL, + 0xbb07919aUL, 0x7854bcb1UL, 0x3965a7a8UL, 0x4b98833bUL, 0x0aa99822UL, + 0xc9fab509UL, 0x88cbae10UL, 0x4f5def5fUL, 0x0e6cf446UL, 0xcd3fd96dUL, + 0x8c0ec274UL, 0x43125af3UL, 0x022341eaUL, 0xc1706cc1UL, 0x804177d8UL, + 0x47d73697UL, 0x06e62d8eUL, 0xc5b500a5UL, 0x84841bbcUL, 0x1a8a4171UL, + 0x5bbb5a68UL, 0x98e87743UL, 0xd9d96c5aUL, 0x1e4f2d15UL, 0x5f7e360cUL, + 0x9c2d1b27UL, 0xdd1c003eUL, 0x120098b9UL, 0x533183a0UL, 0x9062ae8bUL, + 0xd153b592UL, 0x16c5f4ddUL, 0x57f4efc4UL, 0x94a7c2efUL, 0xd596d9f6UL, + 0xe9bc07aeUL, 0xa88d1cb7UL, 0x6bde319cUL, 0x2aef2a85UL, 0xed796bcaUL, + 0xac4870d3UL, 0x6f1b5df8UL, 0x2e2a46e1UL, 0xe136de66UL, 0xa007c57fUL, + 0x6354e854UL, 0x2265f34dUL, 0xe5f3b202UL, 0xa4c2a91bUL, 0x67918430UL, + 0x26a09f29UL, 0xb8aec5e4UL, 0xf99fdefdUL, 0x3accf3d6UL, 0x7bfde8cfUL, + 0xbc6ba980UL, 0xfd5ab299UL, 0x3e099fb2UL, 0x7f3884abUL, 0xb0241c2cUL, + 0xf1150735UL, 0x32462a1eUL, 0x73773107UL, 0xb4e17048UL, 0xf5d06b51UL, + 0x3683467aUL, 0x77b25d63UL, 0x4ed7facbUL, 0x0fe6e1d2UL, 0xccb5ccf9UL, + 0x8d84d7e0UL, 0x4a1296afUL, 0x0b238db6UL, 0xc870a09dUL, 0x8941bb84UL, + 0x465d2303UL, 0x076c381aUL, 0xc43f1531UL, 0x850e0e28UL, 0x42984f67UL, + 0x03a9547eUL, 0xc0fa7955UL, 0x81cb624cUL, 0x1fc53881UL, 0x5ef42398UL, + 0x9da70eb3UL, 0xdc9615aaUL, 0x1b0054e5UL, 0x5a314ffcUL, 0x996262d7UL, + 0xd85379ceUL, 0x174fe149UL, 0x567efa50UL, 0x952dd77bUL, 0xd41ccc62UL, + 0x138a8d2dUL, 0x52bb9634UL, 0x91e8bb1fUL, 0xd0d9a006UL, 0xecf37e5eUL, + 0xadc26547UL, 0x6e91486cUL, 0x2fa05375UL, 0xe836123aUL, 0xa9070923UL, + 0x6a542408UL, 0x2b653f11UL, 0xe479a796UL, 0xa548bc8fUL, 0x661b91a4UL, + 0x272a8abdUL, 0xe0bccbf2UL, 0xa18dd0ebUL, 0x62defdc0UL, 0x23efe6d9UL, + 0xbde1bc14UL, 0xfcd0a70dUL, 0x3f838a26UL, 0x7eb2913fUL, 0xb924d070UL, + 0xf815cb69UL, 0x3b46e642UL, 0x7a77fd5bUL, 0xb56b65dcUL, 0xf45a7ec5UL, + 0x370953eeUL, 0x763848f7UL, 0xb1ae09b8UL, 0xf09f12a1UL, 0x33cc3f8aUL, + 0x72fd2493UL + }, + { + 0x00000000UL, 0x376ac201UL, 0x6ed48403UL, 0x59be4602UL, 0xdca80907UL, + 0xebc2cb06UL, 0xb27c8d04UL, 0x85164f05UL, 0xb851130eUL, 0x8f3bd10fUL, + 0xd685970dUL, 0xe1ef550cUL, 0x64f91a09UL, 0x5393d808UL, 0x0a2d9e0aUL, + 0x3d475c0bUL, 0x70a3261cUL, 0x47c9e41dUL, 0x1e77a21fUL, 0x291d601eUL, + 0xac0b2f1bUL, 0x9b61ed1aUL, 0xc2dfab18UL, 0xf5b56919UL, 0xc8f23512UL, + 0xff98f713UL, 0xa626b111UL, 0x914c7310UL, 0x145a3c15UL, 0x2330fe14UL, + 0x7a8eb816UL, 0x4de47a17UL, 0xe0464d38UL, 0xd72c8f39UL, 0x8e92c93bUL, + 0xb9f80b3aUL, 0x3cee443fUL, 0x0b84863eUL, 0x523ac03cUL, 0x6550023dUL, + 0x58175e36UL, 0x6f7d9c37UL, 0x36c3da35UL, 0x01a91834UL, 0x84bf5731UL, + 0xb3d59530UL, 0xea6bd332UL, 0xdd011133UL, 0x90e56b24UL, 0xa78fa925UL, + 0xfe31ef27UL, 0xc95b2d26UL, 0x4c4d6223UL, 0x7b27a022UL, 0x2299e620UL, + 0x15f32421UL, 0x28b4782aUL, 0x1fdeba2bUL, 0x4660fc29UL, 0x710a3e28UL, + 0xf41c712dUL, 0xc376b32cUL, 0x9ac8f52eUL, 0xada2372fUL, 0xc08d9a70UL, + 0xf7e75871UL, 0xae591e73UL, 0x9933dc72UL, 0x1c259377UL, 0x2b4f5176UL, + 0x72f11774UL, 0x459bd575UL, 0x78dc897eUL, 0x4fb64b7fUL, 0x16080d7dUL, + 0x2162cf7cUL, 0xa4748079UL, 0x931e4278UL, 0xcaa0047aUL, 0xfdcac67bUL, + 0xb02ebc6cUL, 0x87447e6dUL, 0xdefa386fUL, 0xe990fa6eUL, 0x6c86b56bUL, + 0x5bec776aUL, 0x02523168UL, 0x3538f369UL, 0x087faf62UL, 0x3f156d63UL, + 0x66ab2b61UL, 0x51c1e960UL, 0xd4d7a665UL, 0xe3bd6464UL, 0xba032266UL, + 0x8d69e067UL, 0x20cbd748UL, 0x17a11549UL, 0x4e1f534bUL, 0x7975914aUL, + 0xfc63de4fUL, 0xcb091c4eUL, 0x92b75a4cUL, 0xa5dd984dUL, 0x989ac446UL, + 0xaff00647UL, 0xf64e4045UL, 0xc1248244UL, 0x4432cd41UL, 0x73580f40UL, + 0x2ae64942UL, 0x1d8c8b43UL, 0x5068f154UL, 0x67023355UL, 0x3ebc7557UL, + 0x09d6b756UL, 0x8cc0f853UL, 0xbbaa3a52UL, 0xe2147c50UL, 0xd57ebe51UL, + 0xe839e25aUL, 0xdf53205bUL, 0x86ed6659UL, 0xb187a458UL, 0x3491eb5dUL, + 0x03fb295cUL, 0x5a456f5eUL, 0x6d2fad5fUL, 0x801b35e1UL, 0xb771f7e0UL, + 0xeecfb1e2UL, 0xd9a573e3UL, 0x5cb33ce6UL, 0x6bd9fee7UL, 0x3267b8e5UL, + 0x050d7ae4UL, 0x384a26efUL, 0x0f20e4eeUL, 0x569ea2ecUL, 0x61f460edUL, + 0xe4e22fe8UL, 0xd388ede9UL, 0x8a36abebUL, 0xbd5c69eaUL, 0xf0b813fdUL, + 0xc7d2d1fcUL, 0x9e6c97feUL, 0xa90655ffUL, 0x2c101afaUL, 0x1b7ad8fbUL, + 0x42c49ef9UL, 0x75ae5cf8UL, 0x48e900f3UL, 0x7f83c2f2UL, 0x263d84f0UL, + 0x115746f1UL, 0x944109f4UL, 0xa32bcbf5UL, 0xfa958df7UL, 0xcdff4ff6UL, + 0x605d78d9UL, 0x5737bad8UL, 0x0e89fcdaUL, 0x39e33edbUL, 0xbcf571deUL, + 0x8b9fb3dfUL, 0xd221f5ddUL, 0xe54b37dcUL, 0xd80c6bd7UL, 0xef66a9d6UL, + 0xb6d8efd4UL, 0x81b22dd5UL, 0x04a462d0UL, 0x33cea0d1UL, 0x6a70e6d3UL, + 0x5d1a24d2UL, 0x10fe5ec5UL, 0x27949cc4UL, 0x7e2adac6UL, 0x494018c7UL, + 0xcc5657c2UL, 0xfb3c95c3UL, 0xa282d3c1UL, 0x95e811c0UL, 0xa8af4dcbUL, + 0x9fc58fcaUL, 0xc67bc9c8UL, 0xf1110bc9UL, 0x740744ccUL, 0x436d86cdUL, + 0x1ad3c0cfUL, 0x2db902ceUL, 0x4096af91UL, 0x77fc6d90UL, 0x2e422b92UL, + 0x1928e993UL, 0x9c3ea696UL, 0xab546497UL, 0xf2ea2295UL, 0xc580e094UL, + 0xf8c7bc9fUL, 0xcfad7e9eUL, 0x9613389cUL, 0xa179fa9dUL, 0x246fb598UL, + 0x13057799UL, 0x4abb319bUL, 0x7dd1f39aUL, 0x3035898dUL, 0x075f4b8cUL, + 0x5ee10d8eUL, 0x698bcf8fUL, 0xec9d808aUL, 0xdbf7428bUL, 0x82490489UL, + 0xb523c688UL, 0x88649a83UL, 0xbf0e5882UL, 0xe6b01e80UL, 0xd1dadc81UL, + 0x54cc9384UL, 0x63a65185UL, 0x3a181787UL, 0x0d72d586UL, 0xa0d0e2a9UL, + 0x97ba20a8UL, 0xce0466aaUL, 0xf96ea4abUL, 0x7c78ebaeUL, 0x4b1229afUL, + 0x12ac6fadUL, 0x25c6adacUL, 0x1881f1a7UL, 0x2feb33a6UL, 0x765575a4UL, + 0x413fb7a5UL, 0xc429f8a0UL, 0xf3433aa1UL, 0xaafd7ca3UL, 0x9d97bea2UL, + 0xd073c4b5UL, 0xe71906b4UL, 0xbea740b6UL, 0x89cd82b7UL, 0x0cdbcdb2UL, + 0x3bb10fb3UL, 0x620f49b1UL, 0x55658bb0UL, 0x6822d7bbUL, 0x5f4815baUL, + 0x06f653b8UL, 0x319c91b9UL, 0xb48adebcUL, 0x83e01cbdUL, 0xda5e5abfUL, + 0xed3498beUL + }, + { + 0x00000000UL, 0x6567bcb8UL, 0x8bc809aaUL, 0xeeafb512UL, 0x5797628fUL, + 0x32f0de37UL, 0xdc5f6b25UL, 0xb938d79dUL, 0xef28b4c5UL, 0x8a4f087dUL, + 0x64e0bd6fUL, 0x018701d7UL, 0xb8bfd64aUL, 0xddd86af2UL, 0x3377dfe0UL, + 0x56106358UL, 0x9f571950UL, 0xfa30a5e8UL, 0x149f10faUL, 0x71f8ac42UL, + 0xc8c07bdfUL, 0xada7c767UL, 0x43087275UL, 0x266fcecdUL, 0x707fad95UL, + 0x1518112dUL, 0xfbb7a43fUL, 0x9ed01887UL, 0x27e8cf1aUL, 0x428f73a2UL, + 0xac20c6b0UL, 0xc9477a08UL, 0x3eaf32a0UL, 0x5bc88e18UL, 0xb5673b0aUL, + 0xd00087b2UL, 0x6938502fUL, 0x0c5fec97UL, 0xe2f05985UL, 0x8797e53dUL, + 0xd1878665UL, 0xb4e03addUL, 0x5a4f8fcfUL, 0x3f283377UL, 0x8610e4eaUL, + 0xe3775852UL, 0x0dd8ed40UL, 0x68bf51f8UL, 0xa1f82bf0UL, 0xc49f9748UL, + 0x2a30225aUL, 0x4f579ee2UL, 0xf66f497fUL, 0x9308f5c7UL, 0x7da740d5UL, + 0x18c0fc6dUL, 0x4ed09f35UL, 0x2bb7238dUL, 0xc518969fUL, 0xa07f2a27UL, + 0x1947fdbaUL, 0x7c204102UL, 0x928ff410UL, 0xf7e848a8UL, 0x3d58149bUL, + 0x583fa823UL, 0xb6901d31UL, 0xd3f7a189UL, 0x6acf7614UL, 0x0fa8caacUL, + 0xe1077fbeUL, 0x8460c306UL, 0xd270a05eUL, 0xb7171ce6UL, 0x59b8a9f4UL, + 0x3cdf154cUL, 0x85e7c2d1UL, 0xe0807e69UL, 0x0e2fcb7bUL, 0x6b4877c3UL, + 0xa20f0dcbUL, 0xc768b173UL, 0x29c70461UL, 0x4ca0b8d9UL, 0xf5986f44UL, + 0x90ffd3fcUL, 0x7e5066eeUL, 0x1b37da56UL, 0x4d27b90eUL, 0x284005b6UL, + 0xc6efb0a4UL, 0xa3880c1cUL, 0x1ab0db81UL, 0x7fd76739UL, 0x9178d22bUL, + 0xf41f6e93UL, 0x03f7263bUL, 0x66909a83UL, 0x883f2f91UL, 0xed589329UL, + 0x546044b4UL, 0x3107f80cUL, 0xdfa84d1eUL, 0xbacff1a6UL, 0xecdf92feUL, + 0x89b82e46UL, 0x67179b54UL, 0x027027ecUL, 0xbb48f071UL, 0xde2f4cc9UL, + 0x3080f9dbUL, 0x55e74563UL, 0x9ca03f6bUL, 0xf9c783d3UL, 0x176836c1UL, + 0x720f8a79UL, 0xcb375de4UL, 0xae50e15cUL, 0x40ff544eUL, 0x2598e8f6UL, + 0x73888baeUL, 0x16ef3716UL, 0xf8408204UL, 0x9d273ebcUL, 0x241fe921UL, + 0x41785599UL, 0xafd7e08bUL, 0xcab05c33UL, 0x3bb659edUL, 0x5ed1e555UL, + 0xb07e5047UL, 0xd519ecffUL, 0x6c213b62UL, 0x094687daUL, 0xe7e932c8UL, + 0x828e8e70UL, 0xd49eed28UL, 0xb1f95190UL, 0x5f56e482UL, 0x3a31583aUL, + 0x83098fa7UL, 0xe66e331fUL, 0x08c1860dUL, 0x6da63ab5UL, 0xa4e140bdUL, + 0xc186fc05UL, 0x2f294917UL, 0x4a4ef5afUL, 0xf3762232UL, 0x96119e8aUL, + 0x78be2b98UL, 0x1dd99720UL, 0x4bc9f478UL, 0x2eae48c0UL, 0xc001fdd2UL, + 0xa566416aUL, 0x1c5e96f7UL, 0x79392a4fUL, 0x97969f5dUL, 0xf2f123e5UL, + 0x05196b4dUL, 0x607ed7f5UL, 0x8ed162e7UL, 0xebb6de5fUL, 0x528e09c2UL, + 0x37e9b57aUL, 0xd9460068UL, 0xbc21bcd0UL, 0xea31df88UL, 0x8f566330UL, + 0x61f9d622UL, 0x049e6a9aUL, 0xbda6bd07UL, 0xd8c101bfUL, 0x366eb4adUL, + 0x53090815UL, 0x9a4e721dUL, 0xff29cea5UL, 0x11867bb7UL, 0x74e1c70fUL, + 0xcdd91092UL, 0xa8beac2aUL, 0x46111938UL, 0x2376a580UL, 0x7566c6d8UL, + 0x10017a60UL, 0xfeaecf72UL, 0x9bc973caUL, 0x22f1a457UL, 0x479618efUL, + 0xa939adfdUL, 0xcc5e1145UL, 0x06ee4d76UL, 0x6389f1ceUL, 0x8d2644dcUL, + 0xe841f864UL, 0x51792ff9UL, 0x341e9341UL, 0xdab12653UL, 0xbfd69aebUL, + 0xe9c6f9b3UL, 0x8ca1450bUL, 0x620ef019UL, 0x07694ca1UL, 0xbe519b3cUL, + 0xdb362784UL, 0x35999296UL, 0x50fe2e2eUL, 0x99b95426UL, 0xfcdee89eUL, + 0x12715d8cUL, 0x7716e134UL, 0xce2e36a9UL, 0xab498a11UL, 0x45e63f03UL, + 0x208183bbUL, 0x7691e0e3UL, 0x13f65c5bUL, 0xfd59e949UL, 0x983e55f1UL, + 0x2106826cUL, 0x44613ed4UL, 0xaace8bc6UL, 0xcfa9377eUL, 0x38417fd6UL, + 0x5d26c36eUL, 0xb389767cUL, 0xd6eecac4UL, 0x6fd61d59UL, 0x0ab1a1e1UL, + 0xe41e14f3UL, 0x8179a84bUL, 0xd769cb13UL, 0xb20e77abUL, 0x5ca1c2b9UL, + 0x39c67e01UL, 0x80fea99cUL, 0xe5991524UL, 0x0b36a036UL, 0x6e511c8eUL, + 0xa7166686UL, 0xc271da3eUL, 0x2cde6f2cUL, 0x49b9d394UL, 0xf0810409UL, + 0x95e6b8b1UL, 0x7b490da3UL, 0x1e2eb11bUL, 0x483ed243UL, 0x2d596efbUL, + 0xc3f6dbe9UL, 0xa6916751UL, 0x1fa9b0ccUL, 0x7ace0c74UL, 0x9461b966UL, + 0xf10605deUL +#endif + } +}; diff --git a/Minecraft.Client/Common/zlib/deflate.c b/Minecraft.Client/Common/zlib/deflate.c new file mode 100644 index 00000000..69695770 --- /dev/null +++ b/Minecraft.Client/Common/zlib/deflate.c @@ -0,0 +1,1967 @@ +/* deflate.c -- compress data using the deflation algorithm + * Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + * ALGORITHM + * + * The "deflation" process depends on being able to identify portions + * of the input text which are identical to earlier input (within a + * sliding window trailing behind the input currently being processed). + * + * The most straightforward technique turns out to be the fastest for + * most input files: try all possible matches and select the longest. + * The key feature of this algorithm is that insertions into the string + * dictionary are very simple and thus fast, and deletions are avoided + * completely. Insertions are performed at each input character, whereas + * string matches are performed only when the previous match ends. So it + * is preferable to spend more time in matches to allow very fast string + * insertions and avoid deletions. The matching algorithm for small + * strings is inspired from that of Rabin & Karp. A brute force approach + * is used to find longer strings when a small match has been found. + * A similar algorithm is used in comic (by Jan-Mark Wams) and freeze + * (by Leonid Broukhis). + * A previous version of this file used a more sophisticated algorithm + * (by Fiala and Greene) which is guaranteed to run in linear amortized + * time, but has a larger average cost, uses more memory and is patented. + * However the F&G algorithm may be faster for some highly redundant + * files if the parameter max_chain_length (described below) is too large. + * + * ACKNOWLEDGEMENTS + * + * The idea of lazy evaluation of matches is due to Jan-Mark Wams, and + * I found it in 'freeze' written by Leonid Broukhis. + * Thanks to many people for bug reports and testing. + * + * REFERENCES + * + * Deutsch, L.P.,"DEFLATE Compressed Data Format Specification". + * Available in http://tools.ietf.org/html/rfc1951 + * + * A description of the Rabin and Karp algorithm is given in the book + * "Algorithms" by R. Sedgewick, Addison-Wesley, p252. + * + * Fiala,E.R., and Greene,D.H. + * Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595 + * + */ + +/* @(#) $Id$ */ + +#include "deflate.h" + +const char deflate_copyright[] = + " deflate 1.2.8 Copyright 1995-2013 Jean-loup Gailly and Mark Adler "; +/* + If you use the zlib library in a product, an acknowledgment is welcome + in the documentation of your product. If for some reason you cannot + include such an acknowledgment, I would appreciate that you keep this + copyright string in the executable of your product. + */ + +/* =========================================================================== + * Function prototypes. + */ +typedef enum { + need_more, /* block not completed, need more input or more output */ + block_done, /* block flush performed */ + finish_started, /* finish started, need only more output at next deflate */ + finish_done /* finish done, accept no more input or output */ +} block_state; + +typedef block_state (*compress_func) OF((deflate_state *s, int flush)); +/* Compression function. Returns the block state after the call. */ + +local void fill_window OF((deflate_state *s)); +local block_state deflate_stored OF((deflate_state *s, int flush)); +local block_state deflate_fast OF((deflate_state *s, int flush)); +#ifndef FASTEST +local block_state deflate_slow OF((deflate_state *s, int flush)); +#endif +local block_state deflate_rle OF((deflate_state *s, int flush)); +local block_state deflate_huff OF((deflate_state *s, int flush)); +local void lm_init OF((deflate_state *s)); +local void putShortMSB OF((deflate_state *s, uInt b)); +local void flush_pending OF((z_streamp strm)); +local int read_buf OF((z_streamp strm, Bytef *buf, unsigned size)); +#ifdef ASMV + void match_init OF((void)); /* asm code initialization */ + uInt longest_match OF((deflate_state *s, IPos cur_match)); +#else +local uInt longest_match OF((deflate_state *s, IPos cur_match)); +#endif + +#ifdef DEBUG +local void check_match OF((deflate_state *s, IPos start, IPos match, + int length)); +#endif + +/* =========================================================================== + * Local data + */ + +#define NIL 0 +/* Tail of hash chains */ + +#ifndef TOO_FAR +# define TOO_FAR 4096 +#endif +/* Matches of length 3 are discarded if their distance exceeds TOO_FAR */ + +/* Values for max_lazy_match, good_match and max_chain_length, depending on + * the desired pack level (0..9). The values given below have been tuned to + * exclude worst case performance for pathological files. Better values may be + * found for specific files. + */ +typedef struct config_s { + ush good_length; /* reduce lazy search above this match length */ + ush max_lazy; /* do not perform lazy search above this match length */ + ush nice_length; /* quit search above this match length */ + ush max_chain; + compress_func func; +} config; + +#ifdef FASTEST +local const config configuration_table[2] = { +/* good lazy nice chain */ +/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ +/* 1 */ {4, 4, 8, 4, deflate_fast}}; /* max speed, no lazy matches */ +#else +local const config configuration_table[10] = { +/* good lazy nice chain */ +/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ +/* 1 */ {4, 4, 8, 4, deflate_fast}, /* max speed, no lazy matches */ +/* 2 */ {4, 5, 16, 8, deflate_fast}, +/* 3 */ {4, 6, 32, 32, deflate_fast}, + +/* 4 */ {4, 4, 16, 16, deflate_slow}, /* lazy matches */ +/* 5 */ {8, 16, 32, 32, deflate_slow}, +/* 6 */ {8, 16, 128, 128, deflate_slow}, +/* 7 */ {8, 32, 128, 256, deflate_slow}, +/* 8 */ {32, 128, 258, 1024, deflate_slow}, +/* 9 */ {32, 258, 258, 4096, deflate_slow}}; /* max compression */ +#endif + +/* Note: the deflate() code requires max_lazy >= MIN_MATCH and max_chain >= 4 + * For deflate_fast() (levels <= 3) good is ignored and lazy has a different + * meaning. + */ + +#define EQUAL 0 +/* result of memcmp for equal strings */ + +#ifndef NO_DUMMY_DECL +struct static_tree_desc_s {int dummy;}; /* for buggy compilers */ +#endif + +/* rank Z_BLOCK between Z_NO_FLUSH and Z_PARTIAL_FLUSH */ +#define RANK(f) (((f) << 1) - ((f) > 4 ? 9 : 0)) + +/* =========================================================================== + * Update a hash value with the given input byte + * IN assertion: all calls to to UPDATE_HASH are made with consecutive + * input characters, so that a running hash key can be computed from the + * previous key instead of complete recalculation each time. + */ +#define UPDATE_HASH(s,h,c) (h = (((h)<hash_shift) ^ (c)) & s->hash_mask) + + +/* =========================================================================== + * Insert string str in the dictionary and set match_head to the previous head + * of the hash chain (the most recent string with same hash key). Return + * the previous length of the hash chain. + * If this file is compiled with -DFASTEST, the compression level is forced + * to 1, and no hash chains are maintained. + * IN assertion: all calls to to INSERT_STRING are made with consecutive + * input characters and the first MIN_MATCH bytes of str are valid + * (except for the last MIN_MATCH-1 bytes of the input file). + */ +#ifdef FASTEST +#define INSERT_STRING(s, str, match_head) \ + (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ + match_head = s->head[s->ins_h], \ + s->head[s->ins_h] = (Pos)(str)) +#else +#define INSERT_STRING(s, str, match_head) \ + (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ + match_head = s->prev[(str) & s->w_mask] = s->head[s->ins_h], \ + s->head[s->ins_h] = (Pos)(str)) +#endif + +/* =========================================================================== + * Initialize the hash table (avoiding 64K overflow for 16 bit systems). + * prev[] will be initialized on the fly. + */ +#define CLEAR_HASH(s) \ + s->head[s->hash_size-1] = NIL; \ + zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head)); + +/* ========================================================================= */ +int ZEXPORT deflateInit_(strm, level, version, stream_size) + z_streamp strm; + int level; + const char *version; + int stream_size; +{ + return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, + Z_DEFAULT_STRATEGY, version, stream_size); + /* To do: ignore strm->next_in if we use it as window */ +} + +/* ========================================================================= */ +int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, + version, stream_size) + z_streamp strm; + int level; + int method; + int windowBits; + int memLevel; + int strategy; + const char *version; + int stream_size; +{ + deflate_state *s; + int wrap = 1; + static const char my_version[] = ZLIB_VERSION; + + ushf *overlay; + /* We overlay pending_buf and d_buf+l_buf. This works since the average + * output size for (length,distance) codes is <= 24 bits. + */ + + if (version == Z_NULL || version[0] != my_version[0] || + stream_size != sizeof(z_stream)) { + return Z_VERSION_ERROR; + } + if (strm == Z_NULL) return Z_STREAM_ERROR; + + strm->msg = Z_NULL; + if (strm->zalloc == (alloc_func)0) { +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zalloc = zcalloc; + strm->opaque = (voidpf)0; +#endif + } + if (strm->zfree == (free_func)0) +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zfree = zcfree; +#endif + +#ifdef FASTEST + if (level != 0) level = 1; +#else + if (level == Z_DEFAULT_COMPRESSION) level = 6; +#endif + + if (windowBits < 0) { /* suppress zlib wrapper */ + wrap = 0; + windowBits = -windowBits; + } +#ifdef GZIP + else if (windowBits > 15) { + wrap = 2; /* write gzip wrapper instead */ + windowBits -= 16; + } +#endif + if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED || + windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || + strategy < 0 || strategy > Z_FIXED) { + return Z_STREAM_ERROR; + } + if (windowBits == 8) windowBits = 9; /* until 256-byte window bug fixed */ + s = (deflate_state *) ZALLOC(strm, 1, sizeof(deflate_state)); + if (s == Z_NULL) return Z_MEM_ERROR; + strm->state = (struct internal_state FAR *)s; + s->strm = strm; + + s->wrap = wrap; + s->gzhead = Z_NULL; + s->w_bits = windowBits; + s->w_size = 1 << s->w_bits; + s->w_mask = s->w_size - 1; + + s->hash_bits = memLevel + 7; + s->hash_size = 1 << s->hash_bits; + s->hash_mask = s->hash_size - 1; + s->hash_shift = ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH); + + s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte)); + s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos)); + s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos)); + + s->high_water = 0; /* nothing written to s->window yet */ + + s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ + + overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2); + s->pending_buf = (uchf *) overlay; + s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L); + + if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL || + s->pending_buf == Z_NULL) { + s->status = FINISH_STATE; + strm->msg = ERR_MSG(Z_MEM_ERROR); + deflateEnd (strm); + return Z_MEM_ERROR; + } + s->d_buf = overlay + s->lit_bufsize/sizeof(ush); + s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize; + + s->level = level; + s->strategy = strategy; + s->method = (Byte)method; + + return deflateReset(strm); +} + +/* ========================================================================= */ +int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength) + z_streamp strm; + const Bytef *dictionary; + uInt dictLength; +{ + deflate_state *s; + uInt str, n; + int wrap; + unsigned avail; + z_const unsigned char *next; + + if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL) + return Z_STREAM_ERROR; + s = strm->state; + wrap = s->wrap; + if (wrap == 2 || (wrap == 1 && s->status != INIT_STATE) || s->lookahead) + return Z_STREAM_ERROR; + + /* when using zlib wrappers, compute Adler-32 for provided dictionary */ + if (wrap == 1) + strm->adler = adler32(strm->adler, dictionary, dictLength); + s->wrap = 0; /* avoid computing Adler-32 in read_buf */ + + /* if dictionary would fill window, just replace the history */ + if (dictLength >= s->w_size) { + if (wrap == 0) { /* already empty otherwise */ + CLEAR_HASH(s); + s->strstart = 0; + s->block_start = 0L; + s->insert = 0; + } + dictionary += dictLength - s->w_size; /* use the tail */ + dictLength = s->w_size; + } + + /* insert dictionary into window and hash */ + avail = strm->avail_in; + next = strm->next_in; + strm->avail_in = dictLength; + strm->next_in = (z_const Bytef *)dictionary; + fill_window(s); + while (s->lookahead >= MIN_MATCH) { + str = s->strstart; + n = s->lookahead - (MIN_MATCH-1); + do { + UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); +#ifndef FASTEST + s->prev[str & s->w_mask] = s->head[s->ins_h]; +#endif + s->head[s->ins_h] = (Pos)str; + str++; + } while (--n); + s->strstart = str; + s->lookahead = MIN_MATCH-1; + fill_window(s); + } + s->strstart += s->lookahead; + s->block_start = (long)s->strstart; + s->insert = s->lookahead; + s->lookahead = 0; + s->match_length = s->prev_length = MIN_MATCH-1; + s->match_available = 0; + strm->next_in = next; + strm->avail_in = avail; + s->wrap = wrap; + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflateResetKeep (strm) + z_streamp strm; +{ + deflate_state *s; + + if (strm == Z_NULL || strm->state == Z_NULL || + strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) { + return Z_STREAM_ERROR; + } + + strm->total_in = strm->total_out = 0; + strm->msg = Z_NULL; /* use zfree if we ever allocate msg dynamically */ + strm->data_type = Z_UNKNOWN; + + s = (deflate_state *)strm->state; + s->pending = 0; + s->pending_out = s->pending_buf; + + if (s->wrap < 0) { + s->wrap = -s->wrap; /* was made negative by deflate(..., Z_FINISH); */ + } + s->status = s->wrap ? INIT_STATE : BUSY_STATE; + strm->adler = +#ifdef GZIP + s->wrap == 2 ? crc32(0L, Z_NULL, 0) : +#endif + adler32(0L, Z_NULL, 0); + s->last_flush = Z_NO_FLUSH; + + _tr_init(s); + + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflateReset (strm) + z_streamp strm; +{ + int ret; + + ret = deflateResetKeep(strm); + if (ret == Z_OK) + lm_init(strm->state); + return ret; +} + +/* ========================================================================= */ +int ZEXPORT deflateSetHeader (strm, head) + z_streamp strm; + gz_headerp head; +{ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + if (strm->state->wrap != 2) return Z_STREAM_ERROR; + strm->state->gzhead = head; + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflatePending (strm, pending, bits) + unsigned *pending; + int *bits; + z_streamp strm; +{ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + if (pending != Z_NULL) + *pending = strm->state->pending; + if (bits != Z_NULL) + *bits = strm->state->bi_valid; + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflatePrime (strm, bits, value) + z_streamp strm; + int bits; + int value; +{ + deflate_state *s; + int put; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + s = strm->state; + if ((Bytef *)(s->d_buf) < s->pending_out + ((Buf_size + 7) >> 3)) + return Z_BUF_ERROR; + do { + put = Buf_size - s->bi_valid; + if (put > bits) + put = bits; + s->bi_buf |= (ush)((value & ((1 << put) - 1)) << s->bi_valid); + s->bi_valid += put; + _tr_flush_bits(s); + value >>= put; + bits -= put; + } while (bits); + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflateParams(strm, level, strategy) + z_streamp strm; + int level; + int strategy; +{ + deflate_state *s; + compress_func func; + int err = Z_OK; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + s = strm->state; + +#ifdef FASTEST + if (level != 0) level = 1; +#else + if (level == Z_DEFAULT_COMPRESSION) level = 6; +#endif + if (level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) { + return Z_STREAM_ERROR; + } + func = configuration_table[s->level].func; + + if ((strategy != s->strategy || func != configuration_table[level].func) && + strm->total_in != 0) { + /* Flush the last buffer: */ + err = deflate(strm, Z_BLOCK); + if (err == Z_BUF_ERROR && s->pending == 0) + err = Z_OK; + } + if (s->level != level) { + s->level = level; + s->max_lazy_match = configuration_table[level].max_lazy; + s->good_match = configuration_table[level].good_length; + s->nice_match = configuration_table[level].nice_length; + s->max_chain_length = configuration_table[level].max_chain; + } + s->strategy = strategy; + return err; +} + +/* ========================================================================= */ +int ZEXPORT deflateTune(strm, good_length, max_lazy, nice_length, max_chain) + z_streamp strm; + int good_length; + int max_lazy; + int nice_length; + int max_chain; +{ + deflate_state *s; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + s = strm->state; + s->good_match = good_length; + s->max_lazy_match = max_lazy; + s->nice_match = nice_length; + s->max_chain_length = max_chain; + return Z_OK; +} + +/* ========================================================================= + * For the default windowBits of 15 and memLevel of 8, this function returns + * a close to exact, as well as small, upper bound on the compressed size. + * They are coded as constants here for a reason--if the #define's are + * changed, then this function needs to be changed as well. The return + * value for 15 and 8 only works for those exact settings. + * + * For any setting other than those defaults for windowBits and memLevel, + * the value returned is a conservative worst case for the maximum expansion + * resulting from using fixed blocks instead of stored blocks, which deflate + * can emit on compressed data for some combinations of the parameters. + * + * This function could be more sophisticated to provide closer upper bounds for + * every combination of windowBits and memLevel. But even the conservative + * upper bound of about 14% expansion does not seem onerous for output buffer + * allocation. + */ +uLong ZEXPORT deflateBound(strm, sourceLen) + z_streamp strm; + uLong sourceLen; +{ + deflate_state *s; + uLong complen, wraplen; + Bytef *str; + + /* conservative upper bound for compressed data */ + complen = sourceLen + + ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 5; + + /* if can't get parameters, return conservative bound plus zlib wrapper */ + if (strm == Z_NULL || strm->state == Z_NULL) + return complen + 6; + + /* compute wrapper length */ + s = strm->state; + switch (s->wrap) { + case 0: /* raw deflate */ + wraplen = 0; + break; + case 1: /* zlib wrapper */ + wraplen = 6 + (s->strstart ? 4 : 0); + break; + case 2: /* gzip wrapper */ + wraplen = 18; + if (s->gzhead != Z_NULL) { /* user-supplied gzip header */ + if (s->gzhead->extra != Z_NULL) + wraplen += 2 + s->gzhead->extra_len; + str = s->gzhead->name; + if (str != Z_NULL) + do { + wraplen++; + } while (*str++); + str = s->gzhead->comment; + if (str != Z_NULL) + do { + wraplen++; + } while (*str++); + if (s->gzhead->hcrc) + wraplen += 2; + } + break; + default: /* for compiler happiness */ + wraplen = 6; + } + + /* if not default parameters, return conservative bound */ + if (s->w_bits != 15 || s->hash_bits != 8 + 7) + return complen + wraplen; + + /* default settings: return tight bound for that case */ + return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + + (sourceLen >> 25) + 13 - 6 + wraplen; +} + +/* ========================================================================= + * Put a short in the pending buffer. The 16-bit value is put in MSB order. + * IN assertion: the stream state is correct and there is enough room in + * pending_buf. + */ +local void putShortMSB (s, b) + deflate_state *s; + uInt b; +{ + put_byte(s, (Byte)(b >> 8)); + put_byte(s, (Byte)(b & 0xff)); +} + +/* ========================================================================= + * Flush as much pending output as possible. All deflate() output goes + * through this function so some applications may wish to modify it + * to avoid allocating a large strm->next_out buffer and copying into it. + * (See also read_buf()). + */ +local void flush_pending(strm) + z_streamp strm; +{ + unsigned len; + deflate_state *s = strm->state; + + _tr_flush_bits(s); + len = s->pending; + if (len > strm->avail_out) len = strm->avail_out; + if (len == 0) return; + + zmemcpy(strm->next_out, s->pending_out, len); + strm->next_out += len; + s->pending_out += len; + strm->total_out += len; + strm->avail_out -= len; + s->pending -= len; + if (s->pending == 0) { + s->pending_out = s->pending_buf; + } +} + +/* ========================================================================= */ +int ZEXPORT deflate (strm, flush) + z_streamp strm; + int flush; +{ + int old_flush; /* value of flush param for previous deflate call */ + deflate_state *s; + + if (strm == Z_NULL || strm->state == Z_NULL || + flush > Z_BLOCK || flush < 0) { + return Z_STREAM_ERROR; + } + s = strm->state; + + if (strm->next_out == Z_NULL || + (strm->next_in == Z_NULL && strm->avail_in != 0) || + (s->status == FINISH_STATE && flush != Z_FINISH)) { + ERR_RETURN(strm, Z_STREAM_ERROR); + } + if (strm->avail_out == 0) ERR_RETURN(strm, Z_BUF_ERROR); + + s->strm = strm; /* just in case */ + old_flush = s->last_flush; + s->last_flush = flush; + + /* Write the header */ + if (s->status == INIT_STATE) { +#ifdef GZIP + if (s->wrap == 2) { + strm->adler = crc32(0L, Z_NULL, 0); + put_byte(s, 31); + put_byte(s, 139); + put_byte(s, 8); + if (s->gzhead == Z_NULL) { + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, s->level == 9 ? 2 : + (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? + 4 : 0)); + put_byte(s, OS_CODE); + s->status = BUSY_STATE; + } + else { + put_byte(s, (s->gzhead->text ? 1 : 0) + + (s->gzhead->hcrc ? 2 : 0) + + (s->gzhead->extra == Z_NULL ? 0 : 4) + + (s->gzhead->name == Z_NULL ? 0 : 8) + + (s->gzhead->comment == Z_NULL ? 0 : 16) + ); + put_byte(s, (Byte)(s->gzhead->time & 0xff)); + put_byte(s, (Byte)((s->gzhead->time >> 8) & 0xff)); + put_byte(s, (Byte)((s->gzhead->time >> 16) & 0xff)); + put_byte(s, (Byte)((s->gzhead->time >> 24) & 0xff)); + put_byte(s, s->level == 9 ? 2 : + (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? + 4 : 0)); + put_byte(s, s->gzhead->os & 0xff); + if (s->gzhead->extra != Z_NULL) { + put_byte(s, s->gzhead->extra_len & 0xff); + put_byte(s, (s->gzhead->extra_len >> 8) & 0xff); + } + if (s->gzhead->hcrc) + strm->adler = crc32(strm->adler, s->pending_buf, + s->pending); + s->gzindex = 0; + s->status = EXTRA_STATE; + } + } + else +#endif + { + uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8; + uInt level_flags; + + if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2) + level_flags = 0; + else if (s->level < 6) + level_flags = 1; + else if (s->level == 6) + level_flags = 2; + else + level_flags = 3; + header |= (level_flags << 6); + if (s->strstart != 0) header |= PRESET_DICT; + header += 31 - (header % 31); + + s->status = BUSY_STATE; + putShortMSB(s, header); + + /* Save the adler32 of the preset dictionary: */ + if (s->strstart != 0) { + putShortMSB(s, (uInt)(strm->adler >> 16)); + putShortMSB(s, (uInt)(strm->adler & 0xffff)); + } + strm->adler = adler32(0L, Z_NULL, 0); + } + } +#ifdef GZIP + if (s->status == EXTRA_STATE) { + if (s->gzhead->extra != Z_NULL) { + uInt beg = s->pending; /* start of bytes to update crc */ + + while (s->gzindex < (s->gzhead->extra_len & 0xffff)) { + if (s->pending == s->pending_buf_size) { + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + flush_pending(strm); + beg = s->pending; + if (s->pending == s->pending_buf_size) + break; + } + put_byte(s, s->gzhead->extra[s->gzindex]); + s->gzindex++; + } + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + if (s->gzindex == s->gzhead->extra_len) { + s->gzindex = 0; + s->status = NAME_STATE; + } + } + else + s->status = NAME_STATE; + } + if (s->status == NAME_STATE) { + if (s->gzhead->name != Z_NULL) { + uInt beg = s->pending; /* start of bytes to update crc */ + int val; + + do { + if (s->pending == s->pending_buf_size) { + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + flush_pending(strm); + beg = s->pending; + if (s->pending == s->pending_buf_size) { + val = 1; + break; + } + } + val = s->gzhead->name[s->gzindex++]; + put_byte(s, val); + } while (val != 0); + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + if (val == 0) { + s->gzindex = 0; + s->status = COMMENT_STATE; + } + } + else + s->status = COMMENT_STATE; + } + if (s->status == COMMENT_STATE) { + if (s->gzhead->comment != Z_NULL) { + uInt beg = s->pending; /* start of bytes to update crc */ + int val; + + do { + if (s->pending == s->pending_buf_size) { + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + flush_pending(strm); + beg = s->pending; + if (s->pending == s->pending_buf_size) { + val = 1; + break; + } + } + val = s->gzhead->comment[s->gzindex++]; + put_byte(s, val); + } while (val != 0); + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + if (val == 0) + s->status = HCRC_STATE; + } + else + s->status = HCRC_STATE; + } + if (s->status == HCRC_STATE) { + if (s->gzhead->hcrc) { + if (s->pending + 2 > s->pending_buf_size) + flush_pending(strm); + if (s->pending + 2 <= s->pending_buf_size) { + put_byte(s, (Byte)(strm->adler & 0xff)); + put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); + strm->adler = crc32(0L, Z_NULL, 0); + s->status = BUSY_STATE; + } + } + else + s->status = BUSY_STATE; + } +#endif + + /* Flush as much pending output as possible */ + if (s->pending != 0) { + flush_pending(strm); + if (strm->avail_out == 0) { + /* Since avail_out is 0, deflate will be called again with + * more output space, but possibly with both pending and + * avail_in equal to zero. There won't be anything to do, + * but this is not an error situation so make sure we + * return OK instead of BUF_ERROR at next call of deflate: + */ + s->last_flush = -1; + return Z_OK; + } + + /* Make sure there is something to do and avoid duplicate consecutive + * flushes. For repeated and useless calls with Z_FINISH, we keep + * returning Z_STREAM_END instead of Z_BUF_ERROR. + */ + } else if (strm->avail_in == 0 && RANK(flush) <= RANK(old_flush) && + flush != Z_FINISH) { + ERR_RETURN(strm, Z_BUF_ERROR); + } + + /* User must not provide more input after the first FINISH: */ + if (s->status == FINISH_STATE && strm->avail_in != 0) { + ERR_RETURN(strm, Z_BUF_ERROR); + } + + /* Start a new block or continue the current one. + */ + if (strm->avail_in != 0 || s->lookahead != 0 || + (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) { + block_state bstate; + + bstate = s->strategy == Z_HUFFMAN_ONLY ? deflate_huff(s, flush) : + (s->strategy == Z_RLE ? deflate_rle(s, flush) : + (*(configuration_table[s->level].func))(s, flush)); + + if (bstate == finish_started || bstate == finish_done) { + s->status = FINISH_STATE; + } + if (bstate == need_more || bstate == finish_started) { + if (strm->avail_out == 0) { + s->last_flush = -1; /* avoid BUF_ERROR next call, see above */ + } + return Z_OK; + /* If flush != Z_NO_FLUSH && avail_out == 0, the next call + * of deflate should use the same flush parameter to make sure + * that the flush is complete. So we don't have to output an + * empty block here, this will be done at next call. This also + * ensures that for a very small output buffer, we emit at most + * one empty block. + */ + } + if (bstate == block_done) { + if (flush == Z_PARTIAL_FLUSH) { + _tr_align(s); + } else if (flush != Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */ + _tr_stored_block(s, (char*)0, 0L, 0); + /* For a full flush, this empty block will be recognized + * as a special marker by inflate_sync(). + */ + if (flush == Z_FULL_FLUSH) { + CLEAR_HASH(s); /* forget history */ + if (s->lookahead == 0) { + s->strstart = 0; + s->block_start = 0L; + s->insert = 0; + } + } + } + flush_pending(strm); + if (strm->avail_out == 0) { + s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */ + return Z_OK; + } + } + } + Assert(strm->avail_out > 0, "bug2"); + + if (flush != Z_FINISH) return Z_OK; + if (s->wrap <= 0) return Z_STREAM_END; + + /* Write the trailer */ +#ifdef GZIP + if (s->wrap == 2) { + put_byte(s, (Byte)(strm->adler & 0xff)); + put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); + put_byte(s, (Byte)((strm->adler >> 16) & 0xff)); + put_byte(s, (Byte)((strm->adler >> 24) & 0xff)); + put_byte(s, (Byte)(strm->total_in & 0xff)); + put_byte(s, (Byte)((strm->total_in >> 8) & 0xff)); + put_byte(s, (Byte)((strm->total_in >> 16) & 0xff)); + put_byte(s, (Byte)((strm->total_in >> 24) & 0xff)); + } + else +#endif + { + putShortMSB(s, (uInt)(strm->adler >> 16)); + putShortMSB(s, (uInt)(strm->adler & 0xffff)); + } + flush_pending(strm); + /* If avail_out is zero, the application will call deflate again + * to flush the rest. + */ + if (s->wrap > 0) s->wrap = -s->wrap; /* write the trailer only once! */ + return s->pending != 0 ? Z_OK : Z_STREAM_END; +} + +/* ========================================================================= */ +int ZEXPORT deflateEnd (strm) + z_streamp strm; +{ + int status; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + + status = strm->state->status; + if (status != INIT_STATE && + status != EXTRA_STATE && + status != NAME_STATE && + status != COMMENT_STATE && + status != HCRC_STATE && + status != BUSY_STATE && + status != FINISH_STATE) { + return Z_STREAM_ERROR; + } + + /* Deallocate in reverse order of allocations: */ + TRY_FREE(strm, strm->state->pending_buf); + TRY_FREE(strm, strm->state->head); + TRY_FREE(strm, strm->state->prev); + TRY_FREE(strm, strm->state->window); + + ZFREE(strm, strm->state); + strm->state = Z_NULL; + + return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK; +} + +/* ========================================================================= + * Copy the source state to the destination state. + * To simplify the source, this is not supported for 16-bit MSDOS (which + * doesn't have enough memory anyway to duplicate compression states). + */ +int ZEXPORT deflateCopy (dest, source) + z_streamp dest; + z_streamp source; +{ +#ifdef MAXSEG_64K + return Z_STREAM_ERROR; +#else + deflate_state *ds; + deflate_state *ss; + ushf *overlay; + + + if (source == Z_NULL || dest == Z_NULL || source->state == Z_NULL) { + return Z_STREAM_ERROR; + } + + ss = source->state; + + zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream)); + + ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state)); + if (ds == Z_NULL) return Z_MEM_ERROR; + dest->state = (struct internal_state FAR *) ds; + zmemcpy((voidpf)ds, (voidpf)ss, sizeof(deflate_state)); + ds->strm = dest; + + ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte)); + ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos)); + ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos)); + overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2); + ds->pending_buf = (uchf *) overlay; + + if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL || + ds->pending_buf == Z_NULL) { + deflateEnd (dest); + return Z_MEM_ERROR; + } + /* following zmemcpy do not work for 16-bit MSDOS */ + zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte)); + zmemcpy((voidpf)ds->prev, (voidpf)ss->prev, ds->w_size * sizeof(Pos)); + zmemcpy((voidpf)ds->head, (voidpf)ss->head, ds->hash_size * sizeof(Pos)); + zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size); + + ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf); + ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush); + ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize; + + ds->l_desc.dyn_tree = ds->dyn_ltree; + ds->d_desc.dyn_tree = ds->dyn_dtree; + ds->bl_desc.dyn_tree = ds->bl_tree; + + return Z_OK; +#endif /* MAXSEG_64K */ +} + +/* =========================================================================== + * Read a new buffer from the current input stream, update the adler32 + * and total number of bytes read. All deflate() input goes through + * this function so some applications may wish to modify it to avoid + * allocating a large strm->next_in buffer and copying from it. + * (See also flush_pending()). + */ +local int read_buf(strm, buf, size) + z_streamp strm; + Bytef *buf; + unsigned size; +{ + unsigned len = strm->avail_in; + + if (len > size) len = size; + if (len == 0) return 0; + + strm->avail_in -= len; + + zmemcpy(buf, strm->next_in, len); + if (strm->state->wrap == 1) { + strm->adler = adler32(strm->adler, buf, len); + } +#ifdef GZIP + else if (strm->state->wrap == 2) { + strm->adler = crc32(strm->adler, buf, len); + } +#endif + strm->next_in += len; + strm->total_in += len; + + return (int)len; +} + +/* =========================================================================== + * Initialize the "longest match" routines for a new zlib stream + */ +local void lm_init (s) + deflate_state *s; +{ + s->window_size = (ulg)2L*s->w_size; + + CLEAR_HASH(s); + + /* Set the default configuration parameters: + */ + s->max_lazy_match = configuration_table[s->level].max_lazy; + s->good_match = configuration_table[s->level].good_length; + s->nice_match = configuration_table[s->level].nice_length; + s->max_chain_length = configuration_table[s->level].max_chain; + + s->strstart = 0; + s->block_start = 0L; + s->lookahead = 0; + s->insert = 0; + s->match_length = s->prev_length = MIN_MATCH-1; + s->match_available = 0; + s->ins_h = 0; +#ifndef FASTEST +#ifdef ASMV + match_init(); /* initialize the asm code */ +#endif +#endif +} + +#ifndef FASTEST +/* =========================================================================== + * Set match_start to the longest match starting at the given string and + * return its length. Matches shorter or equal to prev_length are discarded, + * in which case the result is equal to prev_length and match_start is + * garbage. + * IN assertions: cur_match is the head of the hash chain for the current + * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 + * OUT assertion: the match length is not greater than s->lookahead. + */ +#ifndef ASMV +/* For 80x86 and 680x0, an optimized version will be provided in match.asm or + * match.S. The code will be functionally equivalent. + */ +local uInt longest_match(s, cur_match) + deflate_state *s; + IPos cur_match; /* current match */ +{ + unsigned chain_length = s->max_chain_length;/* max hash chain length */ + register Bytef *scan = s->window + s->strstart; /* current string */ + register Bytef *match; /* matched string */ + register int len; /* length of current match */ + int best_len = s->prev_length; /* best match length so far */ + int nice_match = s->nice_match; /* stop if match long enough */ + IPos limit = s->strstart > (IPos)MAX_DIST(s) ? + s->strstart - (IPos)MAX_DIST(s) : NIL; + /* Stop when cur_match becomes <= limit. To simplify the code, + * we prevent matches with the string of window index 0. + */ + Posf *prev = s->prev; + uInt wmask = s->w_mask; + +#ifdef UNALIGNED_OK + /* Compare two bytes at a time. Note: this is not always beneficial. + * Try with and without -DUNALIGNED_OK to check. + */ + register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1; + register ush scan_start = *(ushf*)scan; + register ush scan_end = *(ushf*)(scan+best_len-1); +#else + register Bytef *strend = s->window + s->strstart + MAX_MATCH; + register Byte scan_end1 = scan[best_len-1]; + register Byte scan_end = scan[best_len]; +#endif + + /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. + * It is easy to get rid of this optimization if necessary. + */ + Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); + + /* Do not waste too much time if we already have a good match: */ + if (s->prev_length >= s->good_match) { + chain_length >>= 2; + } + /* Do not look for matches beyond the end of the input. This is necessary + * to make deflate deterministic. + */ + if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; + + Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); + + do { + Assert(cur_match < s->strstart, "no future"); + match = s->window + cur_match; + + /* Skip to next match if the match length cannot increase + * or if the match length is less than 2. Note that the checks below + * for insufficient lookahead only occur occasionally for performance + * reasons. Therefore uninitialized memory will be accessed, and + * conditional jumps will be made that depend on those values. + * However the length of the match is limited to the lookahead, so + * the output of deflate is not affected by the uninitialized values. + */ +#if (defined(UNALIGNED_OK) && MAX_MATCH == 258) + /* This code assumes sizeof(unsigned short) == 2. Do not use + * UNALIGNED_OK if your compiler uses a different size. + */ + if (*(ushf*)(match+best_len-1) != scan_end || + *(ushf*)match != scan_start) continue; + + /* It is not necessary to compare scan[2] and match[2] since they are + * always equal when the other bytes match, given that the hash keys + * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at + * strstart+3, +5, ... up to strstart+257. We check for insufficient + * lookahead only every 4th comparison; the 128th check will be made + * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is + * necessary to put more guard bytes at the end of the window, or + * to check more often for insufficient lookahead. + */ + Assert(scan[2] == match[2], "scan[2]?"); + scan++, match++; + do { + } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) && + *(ushf*)(scan+=2) == *(ushf*)(match+=2) && + *(ushf*)(scan+=2) == *(ushf*)(match+=2) && + *(ushf*)(scan+=2) == *(ushf*)(match+=2) && + scan < strend); + /* The funny "do {}" generates better code on most compilers */ + + /* Here, scan <= window+strstart+257 */ + Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); + if (*scan == *match) scan++; + + len = (MAX_MATCH - 1) - (int)(strend-scan); + scan = strend - (MAX_MATCH-1); + +#else /* UNALIGNED_OK */ + + if (match[best_len] != scan_end || + match[best_len-1] != scan_end1 || + *match != *scan || + *++match != scan[1]) continue; + + /* The check at best_len-1 can be removed because it will be made + * again later. (This heuristic is not always a win.) + * It is not necessary to compare scan[2] and match[2] since they + * are always equal when the other bytes match, given that + * the hash keys are equal and that HASH_BITS >= 8. + */ + scan += 2, match++; + Assert(*scan == *match, "match[2]?"); + + /* We check for insufficient lookahead only every 8th comparison; + * the 256th check will be made at strstart+258. + */ + do { + } while (*++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + scan < strend); + + Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); + + len = MAX_MATCH - (int)(strend - scan); + scan = strend - MAX_MATCH; + +#endif /* UNALIGNED_OK */ + + if (len > best_len) { + s->match_start = cur_match; + best_len = len; + if (len >= nice_match) break; +#ifdef UNALIGNED_OK + scan_end = *(ushf*)(scan+best_len-1); +#else + scan_end1 = scan[best_len-1]; + scan_end = scan[best_len]; +#endif + } + } while ((cur_match = prev[cur_match & wmask]) > limit + && --chain_length != 0); + + if ((uInt)best_len <= s->lookahead) return (uInt)best_len; + return s->lookahead; +} +#endif /* ASMV */ + +#else /* FASTEST */ + +/* --------------------------------------------------------------------------- + * Optimized version for FASTEST only + */ +local uInt longest_match(s, cur_match) + deflate_state *s; + IPos cur_match; /* current match */ +{ + register Bytef *scan = s->window + s->strstart; /* current string */ + register Bytef *match; /* matched string */ + register int len; /* length of current match */ + register Bytef *strend = s->window + s->strstart + MAX_MATCH; + + /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. + * It is easy to get rid of this optimization if necessary. + */ + Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); + + Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); + + Assert(cur_match < s->strstart, "no future"); + + match = s->window + cur_match; + + /* Return failure if the match length is less than 2: + */ + if (match[0] != scan[0] || match[1] != scan[1]) return MIN_MATCH-1; + + /* The check at best_len-1 can be removed because it will be made + * again later. (This heuristic is not always a win.) + * It is not necessary to compare scan[2] and match[2] since they + * are always equal when the other bytes match, given that + * the hash keys are equal and that HASH_BITS >= 8. + */ + scan += 2, match += 2; + Assert(*scan == *match, "match[2]?"); + + /* We check for insufficient lookahead only every 8th comparison; + * the 256th check will be made at strstart+258. + */ + do { + } while (*++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + scan < strend); + + Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); + + len = MAX_MATCH - (int)(strend - scan); + + if (len < MIN_MATCH) return MIN_MATCH - 1; + + s->match_start = cur_match; + return (uInt)len <= s->lookahead ? (uInt)len : s->lookahead; +} + +#endif /* FASTEST */ + +#ifdef DEBUG +/* =========================================================================== + * Check that the match at match_start is indeed a match. + */ +local void check_match(s, start, match, length) + deflate_state *s; + IPos start, match; + int length; +{ + /* check that the match is indeed a match */ + if (zmemcmp(s->window + match, + s->window + start, length) != EQUAL) { + fprintf(stderr, " start %u, match %u, length %d\n", + start, match, length); + do { + fprintf(stderr, "%c%c", s->window[match++], s->window[start++]); + } while (--length != 0); + z_error("invalid match"); + } + if (z_verbose > 1) { + fprintf(stderr,"\\[%d,%d]", start-match, length); + do { putc(s->window[start++], stderr); } while (--length != 0); + } +} +#else +# define check_match(s, start, match, length) +#endif /* DEBUG */ + +/* =========================================================================== + * Fill the window when the lookahead becomes insufficient. + * Updates strstart and lookahead. + * + * IN assertion: lookahead < MIN_LOOKAHEAD + * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD + * At least one byte has been read, or avail_in == 0; reads are + * performed for at least two bytes (required for the zip translate_eol + * option -- not supported here). + */ +local void fill_window(s) + deflate_state *s; +{ + register unsigned n, m; + register Posf *p; + unsigned more; /* Amount of free space at the end of the window. */ + uInt wsize = s->w_size; + + Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead"); + + do { + more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart); + + /* Deal with !@#$% 64K limit: */ + if (sizeof(int) <= 2) { + if (more == 0 && s->strstart == 0 && s->lookahead == 0) { + more = wsize; + + } else if (more == (unsigned)(-1)) { + /* Very unlikely, but possible on 16 bit machine if + * strstart == 0 && lookahead == 1 (input done a byte at time) + */ + more--; + } + } + + /* If the window is almost full and there is insufficient lookahead, + * move the upper half to the lower one to make room in the upper half. + */ + if (s->strstart >= wsize+MAX_DIST(s)) { + + zmemcpy(s->window, s->window+wsize, (unsigned)wsize); + s->match_start -= wsize; + s->strstart -= wsize; /* we now have strstart >= MAX_DIST */ + s->block_start -= (long) wsize; + + /* Slide the hash table (could be avoided with 32 bit values + at the expense of memory usage). We slide even when level == 0 + to keep the hash table consistent if we switch back to level > 0 + later. (Using level 0 permanently is not an optimal usage of + zlib, so we don't care about this pathological case.) + */ + n = s->hash_size; + p = &s->head[n]; + do { + m = *--p; + *p = (Pos)(m >= wsize ? m-wsize : NIL); + } while (--n); + + n = wsize; +#ifndef FASTEST + p = &s->prev[n]; + do { + m = *--p; + *p = (Pos)(m >= wsize ? m-wsize : NIL); + /* If n is not on any hash chain, prev[n] is garbage but + * its value will never be used. + */ + } while (--n); +#endif + more += wsize; + } + if (s->strm->avail_in == 0) break; + + /* If there was no sliding: + * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && + * more == window_size - lookahead - strstart + * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) + * => more >= window_size - 2*WSIZE + 2 + * In the BIG_MEM or MMAP case (not yet supported), + * window_size == input_size + MIN_LOOKAHEAD && + * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. + * Otherwise, window_size == 2*WSIZE so more >= 2. + * If there was sliding, more >= WSIZE. So in all cases, more >= 2. + */ + Assert(more >= 2, "more < 2"); + + n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more); + s->lookahead += n; + + /* Initialize the hash value now that we have some input: */ + if (s->lookahead + s->insert >= MIN_MATCH) { + uInt str = s->strstart - s->insert; + s->ins_h = s->window[str]; + UPDATE_HASH(s, s->ins_h, s->window[str + 1]); +#if MIN_MATCH != 3 + Call UPDATE_HASH() MIN_MATCH-3 more times +#endif + while (s->insert) { + UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); +#ifndef FASTEST + s->prev[str & s->w_mask] = s->head[s->ins_h]; +#endif + s->head[s->ins_h] = (Pos)str; + str++; + s->insert--; + if (s->lookahead + s->insert < MIN_MATCH) + break; + } + } + /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, + * but this is not important since only literal bytes will be emitted. + */ + + } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0); + + /* If the WIN_INIT bytes after the end of the current data have never been + * written, then zero those bytes in order to avoid memory check reports of + * the use of uninitialized (or uninitialised as Julian writes) bytes by + * the longest match routines. Update the high water mark for the next + * time through here. WIN_INIT is set to MAX_MATCH since the longest match + * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead. + */ + if (s->high_water < s->window_size) { + ulg curr = s->strstart + (ulg)(s->lookahead); + ulg init; + + if (s->high_water < curr) { + /* Previous high water mark below current data -- zero WIN_INIT + * bytes or up to end of window, whichever is less. + */ + init = s->window_size - curr; + if (init > WIN_INIT) + init = WIN_INIT; + zmemzero(s->window + curr, (unsigned)init); + s->high_water = curr + init; + } + else if (s->high_water < (ulg)curr + WIN_INIT) { + /* High water mark at or above current data, but below current data + * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up + * to end of window, whichever is less. + */ + init = (ulg)curr + WIN_INIT - s->high_water; + if (init > s->window_size - s->high_water) + init = s->window_size - s->high_water; + zmemzero(s->window + s->high_water, (unsigned)init); + s->high_water += init; + } + } + + Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD, + "not enough room for search"); +} + +/* =========================================================================== + * Flush the current block, with given end-of-file flag. + * IN assertion: strstart is set to the end of the current match. + */ +#define FLUSH_BLOCK_ONLY(s, last) { \ + _tr_flush_block(s, (s->block_start >= 0L ? \ + (charf *)&s->window[(unsigned)s->block_start] : \ + (charf *)Z_NULL), \ + (ulg)((long)s->strstart - s->block_start), \ + (last)); \ + s->block_start = s->strstart; \ + flush_pending(s->strm); \ + Tracev((stderr,"[FLUSH]")); \ +} + +/* Same but force premature exit if necessary. */ +#define FLUSH_BLOCK(s, last) { \ + FLUSH_BLOCK_ONLY(s, last); \ + if (s->strm->avail_out == 0) return (last) ? finish_started : need_more; \ +} + +/* =========================================================================== + * Copy without compression as much as possible from the input stream, return + * the current block state. + * This function does not insert new strings in the dictionary since + * uncompressible data is probably not useful. This function is used + * only for the level=0 compression option. + * NOTE: this function should be optimized to avoid extra copying from + * window to pending_buf. + */ +local block_state deflate_stored(s, flush) + deflate_state *s; + int flush; +{ + /* Stored blocks are limited to 0xffff bytes, pending_buf is limited + * to pending_buf_size, and each stored block has a 5 byte header: + */ + ulg max_block_size = 0xffff; + ulg max_start; + + if (max_block_size > s->pending_buf_size - 5) { + max_block_size = s->pending_buf_size - 5; + } + + /* Copy as much as possible from input to output: */ + for (;;) { + /* Fill the window as much as possible: */ + if (s->lookahead <= 1) { + + Assert(s->strstart < s->w_size+MAX_DIST(s) || + s->block_start >= (long)s->w_size, "slide too late"); + + fill_window(s); + if (s->lookahead == 0 && flush == Z_NO_FLUSH) return need_more; + + if (s->lookahead == 0) break; /* flush the current block */ + } + Assert(s->block_start >= 0L, "block gone"); + + s->strstart += s->lookahead; + s->lookahead = 0; + + /* Emit a stored block if pending_buf will be full: */ + max_start = s->block_start + max_block_size; + if (s->strstart == 0 || (ulg)s->strstart >= max_start) { + /* strstart == 0 is possible when wraparound on 16-bit machine */ + s->lookahead = (uInt)(s->strstart - max_start); + s->strstart = (uInt)max_start; + FLUSH_BLOCK(s, 0); + } + /* Flush if we may have to slide, otherwise block_start may become + * negative and the data will be gone: + */ + if (s->strstart - (uInt)s->block_start >= MAX_DIST(s)) { + FLUSH_BLOCK(s, 0); + } + } + s->insert = 0; + if (flush == Z_FINISH) { + FLUSH_BLOCK(s, 1); + return finish_done; + } + if ((long)s->strstart > s->block_start) + FLUSH_BLOCK(s, 0); + return block_done; +} + +/* =========================================================================== + * Compress as much as possible from the input stream, return the current + * block state. + * This function does not perform lazy evaluation of matches and inserts + * new strings in the dictionary only for unmatched strings or for short + * matches. It is used only for the fast compression options. + */ +local block_state deflate_fast(s, flush) + deflate_state *s; + int flush; +{ + IPos hash_head; /* head of the hash chain */ + int bflush; /* set if current block must be flushed */ + + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the next match, plus MIN_MATCH bytes to insert the + * string following the next match. + */ + if (s->lookahead < MIN_LOOKAHEAD) { + fill_window(s); + if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { + return need_more; + } + if (s->lookahead == 0) break; /* flush the current block */ + } + + /* Insert the string window[strstart .. strstart+2] in the + * dictionary, and set hash_head to the head of the hash chain: + */ + hash_head = NIL; + if (s->lookahead >= MIN_MATCH) { + INSERT_STRING(s, s->strstart, hash_head); + } + + /* Find the longest match, discarding those <= prev_length. + * At this point we have always match_length < MIN_MATCH + */ + if (hash_head != NIL && s->strstart - hash_head <= MAX_DIST(s)) { + /* To simplify the code, we prevent matches with the string + * of window index 0 (in particular we have to avoid a match + * of the string with itself at the start of the input file). + */ + s->match_length = longest_match (s, hash_head); + /* longest_match() sets match_start */ + } + if (s->match_length >= MIN_MATCH) { + check_match(s, s->strstart, s->match_start, s->match_length); + + _tr_tally_dist(s, s->strstart - s->match_start, + s->match_length - MIN_MATCH, bflush); + + s->lookahead -= s->match_length; + + /* Insert new strings in the hash table only if the match length + * is not too large. This saves time but degrades compression. + */ +#ifndef FASTEST + if (s->match_length <= s->max_insert_length && + s->lookahead >= MIN_MATCH) { + s->match_length--; /* string at strstart already in table */ + do { + s->strstart++; + INSERT_STRING(s, s->strstart, hash_head); + /* strstart never exceeds WSIZE-MAX_MATCH, so there are + * always MIN_MATCH bytes ahead. + */ + } while (--s->match_length != 0); + s->strstart++; + } else +#endif + { + s->strstart += s->match_length; + s->match_length = 0; + s->ins_h = s->window[s->strstart]; + UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); +#if MIN_MATCH != 3 + Call UPDATE_HASH() MIN_MATCH-3 more times +#endif + /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not + * matter since it will be recomputed at next deflate call. + */ + } + } else { + /* No match, output a literal byte */ + Tracevv((stderr,"%c", s->window[s->strstart])); + _tr_tally_lit (s, s->window[s->strstart], bflush); + s->lookahead--; + s->strstart++; + } + if (bflush) FLUSH_BLOCK(s, 0); + } + s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1; + if (flush == Z_FINISH) { + FLUSH_BLOCK(s, 1); + return finish_done; + } + if (s->last_lit) + FLUSH_BLOCK(s, 0); + return block_done; +} + +#ifndef FASTEST +/* =========================================================================== + * Same as above, but achieves better compression. We use a lazy + * evaluation for matches: a match is finally adopted only if there is + * no better match at the next window position. + */ +local block_state deflate_slow(s, flush) + deflate_state *s; + int flush; +{ + IPos hash_head; /* head of hash chain */ + int bflush; /* set if current block must be flushed */ + + /* Process the input block. */ + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the next match, plus MIN_MATCH bytes to insert the + * string following the next match. + */ + if (s->lookahead < MIN_LOOKAHEAD) { + fill_window(s); + if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { + return need_more; + } + if (s->lookahead == 0) break; /* flush the current block */ + } + + /* Insert the string window[strstart .. strstart+2] in the + * dictionary, and set hash_head to the head of the hash chain: + */ + hash_head = NIL; + if (s->lookahead >= MIN_MATCH) { + INSERT_STRING(s, s->strstart, hash_head); + } + + /* Find the longest match, discarding those <= prev_length. + */ + s->prev_length = s->match_length, s->prev_match = s->match_start; + s->match_length = MIN_MATCH-1; + + if (hash_head != NIL && s->prev_length < s->max_lazy_match && + s->strstart - hash_head <= MAX_DIST(s)) { + /* To simplify the code, we prevent matches with the string + * of window index 0 (in particular we have to avoid a match + * of the string with itself at the start of the input file). + */ + s->match_length = longest_match (s, hash_head); + /* longest_match() sets match_start */ + + if (s->match_length <= 5 && (s->strategy == Z_FILTERED +#if TOO_FAR <= 32767 + || (s->match_length == MIN_MATCH && + s->strstart - s->match_start > TOO_FAR) +#endif + )) { + + /* If prev_match is also MIN_MATCH, match_start is garbage + * but we will ignore the current match anyway. + */ + s->match_length = MIN_MATCH-1; + } + } + /* If there was a match at the previous step and the current + * match is not better, output the previous match: + */ + if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) { + uInt max_insert = s->strstart + s->lookahead - MIN_MATCH; + /* Do not insert strings in hash table beyond this. */ + + check_match(s, s->strstart-1, s->prev_match, s->prev_length); + + _tr_tally_dist(s, s->strstart -1 - s->prev_match, + s->prev_length - MIN_MATCH, bflush); + + /* Insert in hash table all strings up to the end of the match. + * strstart-1 and strstart are already inserted. If there is not + * enough lookahead, the last two strings are not inserted in + * the hash table. + */ + s->lookahead -= s->prev_length-1; + s->prev_length -= 2; + do { + if (++s->strstart <= max_insert) { + INSERT_STRING(s, s->strstart, hash_head); + } + } while (--s->prev_length != 0); + s->match_available = 0; + s->match_length = MIN_MATCH-1; + s->strstart++; + + if (bflush) FLUSH_BLOCK(s, 0); + + } else if (s->match_available) { + /* If there was no match at the previous position, output a + * single literal. If there was a match but the current match + * is longer, truncate the previous match to a single literal. + */ + Tracevv((stderr,"%c", s->window[s->strstart-1])); + _tr_tally_lit(s, s->window[s->strstart-1], bflush); + if (bflush) { + FLUSH_BLOCK_ONLY(s, 0); + } + s->strstart++; + s->lookahead--; + if (s->strm->avail_out == 0) return need_more; + } else { + /* There is no previous match to compare with, wait for + * the next step to decide. + */ + s->match_available = 1; + s->strstart++; + s->lookahead--; + } + } + Assert (flush != Z_NO_FLUSH, "no flush?"); + if (s->match_available) { + Tracevv((stderr,"%c", s->window[s->strstart-1])); + _tr_tally_lit(s, s->window[s->strstart-1], bflush); + s->match_available = 0; + } + s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1; + if (flush == Z_FINISH) { + FLUSH_BLOCK(s, 1); + return finish_done; + } + if (s->last_lit) + FLUSH_BLOCK(s, 0); + return block_done; +} +#endif /* FASTEST */ + +/* =========================================================================== + * For Z_RLE, simply look for runs of bytes, generate matches only of distance + * one. Do not maintain a hash table. (It will be regenerated if this run of + * deflate switches away from Z_RLE.) + */ +local block_state deflate_rle(s, flush) + deflate_state *s; + int flush; +{ + int bflush; /* set if current block must be flushed */ + uInt prev; /* byte at distance one to match */ + Bytef *scan, *strend; /* scan goes up to strend for length of run */ + + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the longest run, plus one for the unrolled loop. + */ + if (s->lookahead <= MAX_MATCH) { + fill_window(s); + if (s->lookahead <= MAX_MATCH && flush == Z_NO_FLUSH) { + return need_more; + } + if (s->lookahead == 0) break; /* flush the current block */ + } + + /* See how many times the previous byte repeats */ + s->match_length = 0; + if (s->lookahead >= MIN_MATCH && s->strstart > 0) { + scan = s->window + s->strstart - 1; + prev = *scan; + if (prev == *++scan && prev == *++scan && prev == *++scan) { + strend = s->window + s->strstart + MAX_MATCH; + do { + } while (prev == *++scan && prev == *++scan && + prev == *++scan && prev == *++scan && + prev == *++scan && prev == *++scan && + prev == *++scan && prev == *++scan && + scan < strend); + s->match_length = MAX_MATCH - (int)(strend - scan); + if (s->match_length > s->lookahead) + s->match_length = s->lookahead; + } + Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan"); + } + + /* Emit match if have run of MIN_MATCH or longer, else emit literal */ + if (s->match_length >= MIN_MATCH) { + check_match(s, s->strstart, s->strstart - 1, s->match_length); + + _tr_tally_dist(s, 1, s->match_length - MIN_MATCH, bflush); + + s->lookahead -= s->match_length; + s->strstart += s->match_length; + s->match_length = 0; + } else { + /* No match, output a literal byte */ + Tracevv((stderr,"%c", s->window[s->strstart])); + _tr_tally_lit (s, s->window[s->strstart], bflush); + s->lookahead--; + s->strstart++; + } + if (bflush) FLUSH_BLOCK(s, 0); + } + s->insert = 0; + if (flush == Z_FINISH) { + FLUSH_BLOCK(s, 1); + return finish_done; + } + if (s->last_lit) + FLUSH_BLOCK(s, 0); + return block_done; +} + +/* =========================================================================== + * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table. + * (It will be regenerated if this run of deflate switches away from Huffman.) + */ +local block_state deflate_huff(s, flush) + deflate_state *s; + int flush; +{ + int bflush; /* set if current block must be flushed */ + + for (;;) { + /* Make sure that we have a literal to write. */ + if (s->lookahead == 0) { + fill_window(s); + if (s->lookahead == 0) { + if (flush == Z_NO_FLUSH) + return need_more; + break; /* flush the current block */ + } + } + + /* Output a literal byte */ + s->match_length = 0; + Tracevv((stderr,"%c", s->window[s->strstart])); + _tr_tally_lit (s, s->window[s->strstart], bflush); + s->lookahead--; + s->strstart++; + if (bflush) FLUSH_BLOCK(s, 0); + } + s->insert = 0; + if (flush == Z_FINISH) { + FLUSH_BLOCK(s, 1); + return finish_done; + } + if (s->last_lit) + FLUSH_BLOCK(s, 0); + return block_done; +} diff --git a/Minecraft.Client/Common/zlib/deflate.h b/Minecraft.Client/Common/zlib/deflate.h new file mode 100644 index 00000000..ce0299ed --- /dev/null +++ b/Minecraft.Client/Common/zlib/deflate.h @@ -0,0 +1,346 @@ +/* deflate.h -- internal compression state + * Copyright (C) 1995-2012 Jean-loup Gailly + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* @(#) $Id$ */ + +#ifndef DEFLATE_H +#define DEFLATE_H + +#include "zutil.h" + +/* define NO_GZIP when compiling if you want to disable gzip header and + trailer creation by deflate(). NO_GZIP would be used to avoid linking in + the crc code when it is not needed. For shared libraries, gzip encoding + should be left enabled. */ +#ifndef NO_GZIP +# define GZIP +#endif + +/* =========================================================================== + * Internal compression state. + */ + +#define LENGTH_CODES 29 +/* number of length codes, not counting the special END_BLOCK code */ + +#define LITERALS 256 +/* number of literal bytes 0..255 */ + +#define L_CODES (LITERALS+1+LENGTH_CODES) +/* number of Literal or Length codes, including the END_BLOCK code */ + +#define D_CODES 30 +/* number of distance codes */ + +#define BL_CODES 19 +/* number of codes used to transfer the bit lengths */ + +#define HEAP_SIZE (2*L_CODES+1) +/* maximum heap size */ + +#define MAX_BITS 15 +/* All codes must not exceed MAX_BITS bits */ + +#define Buf_size 16 +/* size of bit buffer in bi_buf */ + +#define INIT_STATE 42 +#define EXTRA_STATE 69 +#define NAME_STATE 73 +#define COMMENT_STATE 91 +#define HCRC_STATE 103 +#define BUSY_STATE 113 +#define FINISH_STATE 666 +/* Stream status */ + + +/* Data structure describing a single value and its code string. */ +typedef struct ct_data_s { + union { + ush freq; /* frequency count */ + ush code; /* bit string */ + } fc; + union { + ush dad; /* father node in Huffman tree */ + ush len; /* length of bit string */ + } dl; +} FAR ct_data; + +#define Freq fc.freq +#define Code fc.code +#define Dad dl.dad +#define Len dl.len + +typedef struct static_tree_desc_s static_tree_desc; + +typedef struct tree_desc_s { + ct_data *dyn_tree; /* the dynamic tree */ + int max_code; /* largest code with non zero frequency */ + static_tree_desc *stat_desc; /* the corresponding static tree */ +} FAR tree_desc; + +typedef ush Pos; +typedef Pos FAR Posf; +typedef unsigned IPos; + +/* A Pos is an index in the character window. We use short instead of int to + * save space in the various tables. IPos is used only for parameter passing. + */ + +typedef struct internal_state { + z_streamp strm; /* pointer back to this zlib stream */ + int status; /* as the name implies */ + Bytef *pending_buf; /* output still pending */ + ulg pending_buf_size; /* size of pending_buf */ + Bytef *pending_out; /* next pending byte to output to the stream */ + uInt pending; /* nb of bytes in the pending buffer */ + int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ + gz_headerp gzhead; /* gzip header information to write */ + uInt gzindex; /* where in extra, name, or comment */ + Byte method; /* can only be DEFLATED */ + int last_flush; /* value of flush param for previous deflate call */ + + /* used by deflate.c: */ + + uInt w_size; /* LZ77 window size (32K by default) */ + uInt w_bits; /* log2(w_size) (8..16) */ + uInt w_mask; /* w_size - 1 */ + + Bytef *window; + /* Sliding window. Input bytes are read into the second half of the window, + * and move to the first half later to keep a dictionary of at least wSize + * bytes. With this organization, matches are limited to a distance of + * wSize-MAX_MATCH bytes, but this ensures that IO is always + * performed with a length multiple of the block size. Also, it limits + * the window size to 64K, which is quite useful on MSDOS. + * To do: use the user input buffer as sliding window. + */ + + ulg window_size; + /* Actual size of window: 2*wSize, except when the user input buffer + * is directly used as sliding window. + */ + + Posf *prev; + /* Link to older string with same hash index. To limit the size of this + * array to 64K, this link is maintained only for the last 32K strings. + * An index in this array is thus a window index modulo 32K. + */ + + Posf *head; /* Heads of the hash chains or NIL. */ + + uInt ins_h; /* hash index of string to be inserted */ + uInt hash_size; /* number of elements in hash table */ + uInt hash_bits; /* log2(hash_size) */ + uInt hash_mask; /* hash_size-1 */ + + uInt hash_shift; + /* Number of bits by which ins_h must be shifted at each input + * step. It must be such that after MIN_MATCH steps, the oldest + * byte no longer takes part in the hash key, that is: + * hash_shift * MIN_MATCH >= hash_bits + */ + + long block_start; + /* Window position at the beginning of the current output block. Gets + * negative when the window is moved backwards. + */ + + uInt match_length; /* length of best match */ + IPos prev_match; /* previous match */ + int match_available; /* set if previous match exists */ + uInt strstart; /* start of string to insert */ + uInt match_start; /* start of matching string */ + uInt lookahead; /* number of valid bytes ahead in window */ + + uInt prev_length; + /* Length of the best match at previous step. Matches not greater than this + * are discarded. This is used in the lazy match evaluation. + */ + + uInt max_chain_length; + /* To speed up deflation, hash chains are never searched beyond this + * length. A higher limit improves compression ratio but degrades the + * speed. + */ + + uInt max_lazy_match; + /* Attempt to find a better match only when the current match is strictly + * smaller than this value. This mechanism is used only for compression + * levels >= 4. + */ +# define max_insert_length max_lazy_match + /* Insert new strings in the hash table only if the match length is not + * greater than this length. This saves time but degrades compression. + * max_insert_length is used only for compression levels <= 3. + */ + + int level; /* compression level (1..9) */ + int strategy; /* favor or force Huffman coding*/ + + uInt good_match; + /* Use a faster search when the previous match is longer than this */ + + int nice_match; /* Stop searching when current match exceeds this */ + + /* used by trees.c: */ + /* Didn't use ct_data typedef below to suppress compiler warning */ + struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ + struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */ + struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */ + + struct tree_desc_s l_desc; /* desc. for literal tree */ + struct tree_desc_s d_desc; /* desc. for distance tree */ + struct tree_desc_s bl_desc; /* desc. for bit length tree */ + + ush bl_count[MAX_BITS+1]; + /* number of codes at each bit length for an optimal tree */ + + int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */ + int heap_len; /* number of elements in the heap */ + int heap_max; /* element of largest frequency */ + /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. + * The same heap array is used to build all trees. + */ + + uch depth[2*L_CODES+1]; + /* Depth of each subtree used as tie breaker for trees of equal frequency + */ + + uchf *l_buf; /* buffer for literals or lengths */ + + uInt lit_bufsize; + /* Size of match buffer for literals/lengths. There are 4 reasons for + * limiting lit_bufsize to 64K: + * - frequencies can be kept in 16 bit counters + * - if compression is not successful for the first block, all input + * data is still in the window so we can still emit a stored block even + * when input comes from standard input. (This can also be done for + * all blocks if lit_bufsize is not greater than 32K.) + * - if compression is not successful for a file smaller than 64K, we can + * even emit a stored file instead of a stored block (saving 5 bytes). + * This is applicable only for zip (not gzip or zlib). + * - creating new Huffman trees less frequently may not provide fast + * adaptation to changes in the input data statistics. (Take for + * example a binary file with poorly compressible code followed by + * a highly compressible string table.) Smaller buffer sizes give + * fast adaptation but have of course the overhead of transmitting + * trees more frequently. + * - I can't count above 4 + */ + + uInt last_lit; /* running index in l_buf */ + + ushf *d_buf; + /* Buffer for distances. To simplify the code, d_buf and l_buf have + * the same number of elements. To use different lengths, an extra flag + * array would be necessary. + */ + + ulg opt_len; /* bit length of current block with optimal trees */ + ulg static_len; /* bit length of current block with static trees */ + uInt matches; /* number of string matches in current block */ + uInt insert; /* bytes at end of window left to insert */ + +#ifdef DEBUG + ulg compressed_len; /* total bit length of compressed file mod 2^32 */ + ulg bits_sent; /* bit length of compressed data sent mod 2^32 */ +#endif + + ush bi_buf; + /* Output buffer. bits are inserted starting at the bottom (least + * significant bits). + */ + int bi_valid; + /* Number of valid bits in bi_buf. All bits above the last valid bit + * are always zero. + */ + + ulg high_water; + /* High water mark offset in window for initialized bytes -- bytes above + * this are set to zero in order to avoid memory check warnings when + * longest match routines access bytes past the input. This is then + * updated to the new high water mark. + */ + +} FAR deflate_state; + +/* Output a byte on the stream. + * IN assertion: there is enough room in pending_buf. + */ +#define put_byte(s, c) {s->pending_buf[s->pending++] = (c);} + + +#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) +/* Minimum amount of lookahead, except at the end of the input file. + * See deflate.c for comments about the MIN_MATCH+1. + */ + +#define MAX_DIST(s) ((s)->w_size-MIN_LOOKAHEAD) +/* In order to simplify the code, particularly on 16 bit machines, match + * distances are limited to MAX_DIST instead of WSIZE. + */ + +#define WIN_INIT MAX_MATCH +/* Number of bytes after end of data in window to initialize in order to avoid + memory checker errors from longest match routines */ + + /* in trees.c */ +void ZLIB_INTERNAL _tr_init OF((deflate_state *s)); +int ZLIB_INTERNAL _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc)); +void ZLIB_INTERNAL _tr_flush_block OF((deflate_state *s, charf *buf, + ulg stored_len, int last)); +void ZLIB_INTERNAL _tr_flush_bits OF((deflate_state *s)); +void ZLIB_INTERNAL _tr_align OF((deflate_state *s)); +void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf, + ulg stored_len, int last)); + +#define d_code(dist) \ + ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)]) +/* Mapping from a distance to a distance code. dist is the distance - 1 and + * must not have side effects. _dist_code[256] and _dist_code[257] are never + * used. + */ + +#ifndef DEBUG +/* Inline versions of _tr_tally for speed: */ + +#if defined(GEN_TREES_H) || !defined(STDC) + extern uch ZLIB_INTERNAL _length_code[]; + extern uch ZLIB_INTERNAL _dist_code[]; +#else + extern const uch ZLIB_INTERNAL _length_code[]; + extern const uch ZLIB_INTERNAL _dist_code[]; +#endif + +# define _tr_tally_lit(s, c, flush) \ + { uch cc = (c); \ + s->d_buf[s->last_lit] = 0; \ + s->l_buf[s->last_lit++] = cc; \ + s->dyn_ltree[cc].Freq++; \ + flush = (s->last_lit == s->lit_bufsize-1); \ + } +# define _tr_tally_dist(s, distance, length, flush) \ + { uch len = (length); \ + ush dist = (distance); \ + s->d_buf[s->last_lit] = dist; \ + s->l_buf[s->last_lit++] = len; \ + dist--; \ + s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \ + s->dyn_dtree[d_code(dist)].Freq++; \ + flush = (s->last_lit == s->lit_bufsize-1); \ + } +#else +# define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c) +# define _tr_tally_dist(s, distance, length, flush) \ + flush = _tr_tally(s, distance, length) +#endif + +#endif /* DEFLATE_H */ diff --git a/Minecraft.Client/Common/zlib/gzclose.c b/Minecraft.Client/Common/zlib/gzclose.c new file mode 100644 index 00000000..caeb99a3 --- /dev/null +++ b/Minecraft.Client/Common/zlib/gzclose.c @@ -0,0 +1,25 @@ +/* gzclose.c -- zlib gzclose() function + * Copyright (C) 2004, 2010 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "gzguts.h" + +/* gzclose() is in a separate file so that it is linked in only if it is used. + That way the other gzclose functions can be used instead to avoid linking in + unneeded compression or decompression routines. */ +int ZEXPORT gzclose(file) + gzFile file; +{ +#ifndef NO_GZCOMPRESS + gz_statep state; + + if (file == NULL) + return Z_STREAM_ERROR; + state = (gz_statep)file; + + return state->mode == GZ_READ ? gzclose_r(file) : gzclose_w(file); +#else + return gzclose_r(file); +#endif +} diff --git a/Minecraft.Client/Common/zlib/gzguts.h b/Minecraft.Client/Common/zlib/gzguts.h new file mode 100644 index 00000000..d87659d0 --- /dev/null +++ b/Minecraft.Client/Common/zlib/gzguts.h @@ -0,0 +1,209 @@ +/* gzguts.h -- zlib internal header definitions for gz* operations + * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#ifdef _LARGEFILE64_SOURCE +# ifndef _LARGEFILE_SOURCE +# define _LARGEFILE_SOURCE 1 +# endif +# ifdef _FILE_OFFSET_BITS +# undef _FILE_OFFSET_BITS +# endif +#endif + +#ifdef HAVE_HIDDEN +# define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) +#else +# define ZLIB_INTERNAL +#endif + +#include +#include "zlib.h" +#ifdef STDC +# include +# include +# include +#endif +#include + +#ifdef _WIN32 +# include +#endif + +#if defined(__TURBOC__) || defined(_MSC_VER) || defined(_WIN32) +# include +#endif + +#ifdef WINAPI_FAMILY +# define open _open +# define read _read +# define write _write +# define close _close +#endif + +#ifdef NO_DEFLATE /* for compatibility with old definition */ +# define NO_GZCOMPRESS +#endif + +#if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif + +#if defined(__CYGWIN__) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif + +#if defined(MSDOS) && defined(__BORLANDC__) && (BORLANDC > 0x410) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif + +#ifndef HAVE_VSNPRINTF +# ifdef MSDOS +/* vsnprintf may exist on some MS-DOS compilers (DJGPP?), + but for now we just assume it doesn't. */ +# define NO_vsnprintf +# endif +# ifdef __TURBOC__ +# define NO_vsnprintf +# endif +# ifdef WIN32 +/* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */ +# if !defined(vsnprintf) && !defined(NO_vsnprintf) +# if !defined(_MSC_VER) || ( defined(_MSC_VER) && _MSC_VER < 1500 ) +# define vsnprintf _vsnprintf +# endif +# endif +# endif +# ifdef __SASC +# define NO_vsnprintf +# endif +# ifdef VMS +# define NO_vsnprintf +# endif +# ifdef __OS400__ +# define NO_vsnprintf +# endif +# ifdef __MVS__ +# define NO_vsnprintf +# endif +#endif + +/* unlike snprintf (which is required in C99, yet still not supported by + Microsoft more than a decade later!), _snprintf does not guarantee null + termination of the result -- however this is only used in gzlib.c where + the result is assured to fit in the space provided */ +#ifdef _MSC_VER +# define snprintf _snprintf +#endif + +#ifndef local +# define local static +#endif +/* compile with -Dlocal if your debugger can't find static symbols */ + +/* gz* functions always use library allocation functions */ +#ifndef STDC + extern voidp malloc OF((uInt size)); + extern void free OF((voidpf ptr)); +#endif + +/* get errno and strerror definition */ +#if defined UNDER_CE +# include +# define zstrerror() gz_strwinerror((DWORD)GetLastError()) +#else +# ifndef NO_STRERROR +# include +# define zstrerror() strerror(errno) +# else +# define zstrerror() "stdio error (consult errno)" +# endif +#endif + +/* provide prototypes for these when building zlib without LFS */ +#if !defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0 + ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); + ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); + ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); + ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); +#endif + +/* default memLevel */ +#if MAX_MEM_LEVEL >= 8 +# define DEF_MEM_LEVEL 8 +#else +# define DEF_MEM_LEVEL MAX_MEM_LEVEL +#endif + +/* default i/o buffer size -- double this for output when reading (this and + twice this must be able to fit in an unsigned type) */ +#define GZBUFSIZE 8192 + +/* gzip modes, also provide a little integrity check on the passed structure */ +#define GZ_NONE 0 +#define GZ_READ 7247 +#define GZ_WRITE 31153 +#define GZ_APPEND 1 /* mode set to GZ_WRITE after the file is opened */ + +/* values for gz_state how */ +#define LOOK 0 /* look for a gzip header */ +#define COPY 1 /* copy input directly */ +#define GZIP 2 /* decompress a gzip stream */ + +/* internal gzip file state data structure */ +typedef struct { + /* exposed contents for gzgetc() macro */ + struct gzFile_s x; /* "x" for exposed */ + /* x.have: number of bytes available at x.next */ + /* x.next: next output data to deliver or write */ + /* x.pos: current position in uncompressed data */ + /* used for both reading and writing */ + int mode; /* see gzip modes above */ + int fd; /* file descriptor */ + char *path; /* path or fd for error messages */ + unsigned size; /* buffer size, zero if not allocated yet */ + unsigned want; /* requested buffer size, default is GZBUFSIZE */ + unsigned char *in; /* input buffer */ + unsigned char *out; /* output buffer (double-sized when reading) */ + int direct; /* 0 if processing gzip, 1 if transparent */ + /* just for reading */ + int how; /* 0: get header, 1: copy, 2: decompress */ + z_off64_t start; /* where the gzip data started, for rewinding */ + int eof; /* true if end of input file reached */ + int past; /* true if read requested past end */ + /* just for writing */ + int level; /* compression level */ + int strategy; /* compression strategy */ + /* seek request */ + z_off64_t skip; /* amount to skip (already rewound if backwards) */ + int seek; /* true if seek request pending */ + /* error information */ + int err; /* error code */ + char *msg; /* error message */ + /* zlib inflate or deflate stream */ + z_stream strm; /* stream structure in-place (not a pointer) */ +} gz_state; +typedef gz_state FAR *gz_statep; + +/* shared functions */ +void ZLIB_INTERNAL gz_error OF((gz_statep, int, const char *)); +#if defined UNDER_CE +char ZLIB_INTERNAL *gz_strwinerror OF((DWORD error)); +#endif + +/* GT_OFF(x), where x is an unsigned value, is true if x > maximum z_off64_t + value -- needed when comparing unsigned to z_off64_t, which is signed + (possible z_off64_t types off_t, off64_t, and long are all signed) */ +#ifdef INT_MAX +# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > INT_MAX) +#else +unsigned ZLIB_INTERNAL gz_intmax OF((void)); +# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > gz_intmax()) +#endif diff --git a/Minecraft.Client/Common/zlib/gzlib.c b/Minecraft.Client/Common/zlib/gzlib.c new file mode 100644 index 00000000..fae202ef --- /dev/null +++ b/Minecraft.Client/Common/zlib/gzlib.c @@ -0,0 +1,634 @@ +/* gzlib.c -- zlib functions common to reading and writing gzip files + * Copyright (C) 2004, 2010, 2011, 2012, 2013 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "gzguts.h" + +#if defined(_WIN32) && !defined(__BORLANDC__) +# define LSEEK _lseeki64 +#else +#if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0 +# define LSEEK lseek64 +#else +# define LSEEK lseek +#endif +#endif + +/* Local functions */ +local void gz_reset OF((gz_statep)); +local gzFile gz_open OF((const void *, int, const char *)); + +#if defined UNDER_CE + +/* Map the Windows error number in ERROR to a locale-dependent error message + string and return a pointer to it. Typically, the values for ERROR come + from GetLastError. + + The string pointed to shall not be modified by the application, but may be + overwritten by a subsequent call to gz_strwinerror + + The gz_strwinerror function does not change the current setting of + GetLastError. */ +char ZLIB_INTERNAL *gz_strwinerror (error) + DWORD error; +{ + static char buf[1024]; + + wchar_t *msgbuf; + DWORD lasterr = GetLastError(); + DWORD chars = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM + | FORMAT_MESSAGE_ALLOCATE_BUFFER, + NULL, + error, + 0, /* Default language */ + (LPVOID)&msgbuf, + 0, + NULL); + if (chars != 0) { + /* If there is an \r\n appended, zap it. */ + if (chars >= 2 + && msgbuf[chars - 2] == '\r' && msgbuf[chars - 1] == '\n') { + chars -= 2; + msgbuf[chars] = 0; + } + + if (chars > sizeof (buf) - 1) { + chars = sizeof (buf) - 1; + msgbuf[chars] = 0; + } + + wcstombs(buf, msgbuf, chars + 1); + LocalFree(msgbuf); + } + else { + sprintf(buf, "unknown win32 error (%ld)", error); + } + + SetLastError(lasterr); + return buf; +} + +#endif /* UNDER_CE */ + +/* Reset gzip file state */ +local void gz_reset(state) + gz_statep state; +{ + state->x.have = 0; /* no output data available */ + if (state->mode == GZ_READ) { /* for reading ... */ + state->eof = 0; /* not at end of file */ + state->past = 0; /* have not read past end yet */ + state->how = LOOK; /* look for gzip header */ + } + state->seek = 0; /* no seek request pending */ + gz_error(state, Z_OK, NULL); /* clear error */ + state->x.pos = 0; /* no uncompressed data yet */ + state->strm.avail_in = 0; /* no input data yet */ +} + +/* Open a gzip file either by name or file descriptor. */ +local gzFile gz_open(path, fd, mode) + const void *path; + int fd; + const char *mode; +{ + gz_statep state; + size_t len; + int oflag; +#ifdef O_CLOEXEC + int cloexec = 0; +#endif +#ifdef O_EXCL + int exclusive = 0; +#endif + + /* check input */ + if (path == NULL) + return NULL; + + /* allocate gzFile structure to return */ + state = (gz_statep)malloc(sizeof(gz_state)); + if (state == NULL) + return NULL; + state->size = 0; /* no buffers allocated yet */ + state->want = GZBUFSIZE; /* requested buffer size */ + state->msg = NULL; /* no error message yet */ + + /* interpret mode */ + state->mode = GZ_NONE; + state->level = Z_DEFAULT_COMPRESSION; + state->strategy = Z_DEFAULT_STRATEGY; + state->direct = 0; + while (*mode) { + if (*mode >= '0' && *mode <= '9') + state->level = *mode - '0'; + else + switch (*mode) { + case 'r': + state->mode = GZ_READ; + break; +#ifndef NO_GZCOMPRESS + case 'w': + state->mode = GZ_WRITE; + break; + case 'a': + state->mode = GZ_APPEND; + break; +#endif + case '+': /* can't read and write at the same time */ + free(state); + return NULL; + case 'b': /* ignore -- will request binary anyway */ + break; +#ifdef O_CLOEXEC + case 'e': + cloexec = 1; + break; +#endif +#ifdef O_EXCL + case 'x': + exclusive = 1; + break; +#endif + case 'f': + state->strategy = Z_FILTERED; + break; + case 'h': + state->strategy = Z_HUFFMAN_ONLY; + break; + case 'R': + state->strategy = Z_RLE; + break; + case 'F': + state->strategy = Z_FIXED; + break; + case 'T': + state->direct = 1; + break; + default: /* could consider as an error, but just ignore */ + ; + } + mode++; + } + + /* must provide an "r", "w", or "a" */ + if (state->mode == GZ_NONE) { + free(state); + return NULL; + } + + /* can't force transparent read */ + if (state->mode == GZ_READ) { + if (state->direct) { + free(state); + return NULL; + } + state->direct = 1; /* for empty file */ + } + + /* save the path name for error messages */ +#ifdef _WIN32 + if (fd == -2) { + len = wcstombs(NULL, path, 0); + if (len == (size_t)-1) + len = 0; + } + else +#endif + len = strlen((const char *)path); + state->path = (char *)malloc(len + 1); + if (state->path == NULL) { + free(state); + return NULL; + } +#ifdef _WIN32 + if (fd == -2) + if (len) + wcstombs(state->path, path, len + 1); + else + *(state->path) = 0; + else +#endif +#if !defined(NO_snprintf) && !defined(NO_vsnprintf) + snprintf(state->path, len + 1, "%s", (const char *)path); +#else + strcpy(state->path, path); +#endif + + /* compute the flags for open() */ + oflag = +#ifdef O_LARGEFILE + O_LARGEFILE | +#endif +#ifdef O_BINARY + O_BINARY | +#endif +#ifdef O_CLOEXEC + (cloexec ? O_CLOEXEC : 0) | +#endif + (state->mode == GZ_READ ? + O_RDONLY : + (O_WRONLY | O_CREAT | +#ifdef O_EXCL + (exclusive ? O_EXCL : 0) | +#endif + (state->mode == GZ_WRITE ? + O_TRUNC : + O_APPEND))); + + /* open the file with the appropriate flags (or just use fd) */ + state->fd = fd > -1 ? fd : ( +#ifdef _WIN32 + fd == -2 ? _wopen(path, oflag, 0666) : +#endif + open((const char *)path, oflag, 0666)); + if (state->fd == -1) { + free(state->path); + free(state); + return NULL; + } + if (state->mode == GZ_APPEND) + state->mode = GZ_WRITE; /* simplify later checks */ + + /* save the current position for rewinding (only if reading) */ + if (state->mode == GZ_READ) { + state->start = LSEEK(state->fd, 0, SEEK_CUR); + if (state->start == -1) state->start = 0; + } + + /* initialize stream */ + gz_reset(state); + + /* return stream */ + return (gzFile)state; +} + +/* -- see zlib.h -- */ +gzFile ZEXPORT gzopen(path, mode) + const char *path; + const char *mode; +{ + return gz_open(path, -1, mode); +} + +/* -- see zlib.h -- */ +gzFile ZEXPORT gzopen64(path, mode) + const char *path; + const char *mode; +{ + return gz_open(path, -1, mode); +} + +/* -- see zlib.h -- */ +gzFile ZEXPORT gzdopen(fd, mode) + int fd; + const char *mode; +{ + char *path; /* identifier for error messages */ + gzFile gz; + + if (fd == -1 || (path = (char *)malloc(7 + 3 * sizeof(int))) == NULL) + return NULL; +#if !defined(NO_snprintf) && !defined(NO_vsnprintf) + snprintf(path, 7 + 3 * sizeof(int), "", fd); /* for debugging */ +#else + sprintf(path, "", fd); /* for debugging */ +#endif + gz = gz_open(path, fd, mode); + free(path); + return gz; +} + +/* -- see zlib.h -- */ +#ifdef _WIN32 +gzFile ZEXPORT gzopen_w(path, mode) + const wchar_t *path; + const char *mode; +{ + return gz_open(path, -2, mode); +} +#endif + +/* -- see zlib.h -- */ +int ZEXPORT gzbuffer(file, size) + gzFile file; + unsigned size; +{ + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return -1; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return -1; + + /* make sure we haven't already allocated memory */ + if (state->size != 0) + return -1; + + /* check and set requested size */ + if (size < 2) + size = 2; /* need two bytes to check magic header */ + state->want = size; + return 0; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzrewind(file) + gzFile file; +{ + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + + /* check that we're reading and that there's no error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) + return -1; + + /* back up and start over */ + if (LSEEK(state->fd, state->start, SEEK_SET) == -1) + return -1; + gz_reset(state); + return 0; +} + +/* -- see zlib.h -- */ +z_off64_t ZEXPORT gzseek64(file, offset, whence) + gzFile file; + z_off64_t offset; + int whence; +{ + unsigned n; + z_off64_t ret; + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return -1; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return -1; + + /* check that there's no error */ + if (state->err != Z_OK && state->err != Z_BUF_ERROR) + return -1; + + /* can only seek from start or relative to current position */ + if (whence != SEEK_SET && whence != SEEK_CUR) + return -1; + + /* normalize offset to a SEEK_CUR specification */ + if (whence == SEEK_SET) + offset -= state->x.pos; + else if (state->seek) + offset += state->skip; + state->seek = 0; + + /* if within raw area while reading, just go there */ + if (state->mode == GZ_READ && state->how == COPY && + state->x.pos + offset >= 0) { + ret = LSEEK(state->fd, offset - state->x.have, SEEK_CUR); + if (ret == -1) + return -1; + state->x.have = 0; + state->eof = 0; + state->past = 0; + state->seek = 0; + gz_error(state, Z_OK, NULL); + state->strm.avail_in = 0; + state->x.pos += offset; + return state->x.pos; + } + + /* calculate skip amount, rewinding if needed for back seek when reading */ + if (offset < 0) { + if (state->mode != GZ_READ) /* writing -- can't go backwards */ + return -1; + offset += state->x.pos; + if (offset < 0) /* before start of file! */ + return -1; + if (gzrewind(file) == -1) /* rewind, then skip to offset */ + return -1; + } + + /* if reading, skip what's in output buffer (one less gzgetc() check) */ + if (state->mode == GZ_READ) { + n = GT_OFF(state->x.have) || (z_off64_t)state->x.have > offset ? + (unsigned)offset : state->x.have; + state->x.have -= n; + state->x.next += n; + state->x.pos += n; + offset -= n; + } + + /* request skip (if not zero) */ + if (offset) { + state->seek = 1; + state->skip = offset; + } + return state->x.pos + offset; +} + +/* -- see zlib.h -- */ +z_off_t ZEXPORT gzseek(file, offset, whence) + gzFile file; + z_off_t offset; + int whence; +{ + z_off64_t ret; + + ret = gzseek64(file, (z_off64_t)offset, whence); + return ret == (z_off_t)ret ? (z_off_t)ret : -1; +} + +/* -- see zlib.h -- */ +z_off64_t ZEXPORT gztell64(file) + gzFile file; +{ + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return -1; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return -1; + + /* return position */ + return state->x.pos + (state->seek ? state->skip : 0); +} + +/* -- see zlib.h -- */ +z_off_t ZEXPORT gztell(file) + gzFile file; +{ + z_off64_t ret; + + ret = gztell64(file); + return ret == (z_off_t)ret ? (z_off_t)ret : -1; +} + +/* -- see zlib.h -- */ +z_off64_t ZEXPORT gzoffset64(file) + gzFile file; +{ + z_off64_t offset; + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return -1; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return -1; + + /* compute and return effective offset in file */ + offset = LSEEK(state->fd, 0, SEEK_CUR); + if (offset == -1) + return -1; + if (state->mode == GZ_READ) /* reading */ + offset -= state->strm.avail_in; /* don't count buffered input */ + return offset; +} + +/* -- see zlib.h -- */ +z_off_t ZEXPORT gzoffset(file) + gzFile file; +{ + z_off64_t ret; + + ret = gzoffset64(file); + return ret == (z_off_t)ret ? (z_off_t)ret : -1; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzeof(file) + gzFile file; +{ + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return 0; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return 0; + + /* return end-of-file state */ + return state->mode == GZ_READ ? state->past : 0; +} + +/* -- see zlib.h -- */ +const char * ZEXPORT gzerror(file, errnum) + gzFile file; + int *errnum; +{ + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return NULL; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return NULL; + + /* return error information */ + if (errnum != NULL) + *errnum = state->err; + return state->err == Z_MEM_ERROR ? "out of memory" : + (state->msg == NULL ? "" : state->msg); +} + +/* -- see zlib.h -- */ +void ZEXPORT gzclearerr(file) + gzFile file; +{ + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return; + + /* clear error and end-of-file */ + if (state->mode == GZ_READ) { + state->eof = 0; + state->past = 0; + } + gz_error(state, Z_OK, NULL); +} + +/* Create an error message in allocated memory and set state->err and + state->msg accordingly. Free any previous error message already there. Do + not try to free or allocate space if the error is Z_MEM_ERROR (out of + memory). Simply save the error message as a static string. If there is an + allocation failure constructing the error message, then convert the error to + out of memory. */ +void ZLIB_INTERNAL gz_error(state, err, msg) + gz_statep state; + int err; + const char *msg; +{ + /* free previously allocated message and clear */ + if (state->msg != NULL) { + if (state->err != Z_MEM_ERROR) + free(state->msg); + state->msg = NULL; + } + + /* if fatal, set state->x.have to 0 so that the gzgetc() macro fails */ + if (err != Z_OK && err != Z_BUF_ERROR) + state->x.have = 0; + + /* set error code, and if no message, then done */ + state->err = err; + if (msg == NULL) + return; + + /* for an out of memory error, return literal string when requested */ + if (err == Z_MEM_ERROR) + return; + + /* construct error message with path */ + if ((state->msg = (char *)malloc(strlen(state->path) + strlen(msg) + 3)) == + NULL) { + state->err = Z_MEM_ERROR; + return; + } +#if !defined(NO_snprintf) && !defined(NO_vsnprintf) + snprintf(state->msg, strlen(state->path) + strlen(msg) + 3, + "%s%s%s", state->path, ": ", msg); +#else + strcpy(state->msg, state->path); + strcat(state->msg, ": "); + strcat(state->msg, msg); +#endif + return; +} + +#ifndef INT_MAX +/* portably return maximum value for an int (when limits.h presumed not + available) -- we need to do this to cover cases where 2's complement not + used, since C standard permits 1's complement and sign-bit representations, + otherwise we could just use ((unsigned)-1) >> 1 */ +unsigned ZLIB_INTERNAL gz_intmax() +{ + unsigned p, q; + + p = 1; + do { + q = p; + p <<= 1; + p++; + } while (p > q); + return q >> 1; +} +#endif diff --git a/Minecraft.Client/Common/zlib/gzread.c b/Minecraft.Client/Common/zlib/gzread.c new file mode 100644 index 00000000..bf4538eb --- /dev/null +++ b/Minecraft.Client/Common/zlib/gzread.c @@ -0,0 +1,594 @@ +/* gzread.c -- zlib functions for reading gzip files + * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "gzguts.h" + +/* Local functions */ +local int gz_load OF((gz_statep, unsigned char *, unsigned, unsigned *)); +local int gz_avail OF((gz_statep)); +local int gz_look OF((gz_statep)); +local int gz_decomp OF((gz_statep)); +local int gz_fetch OF((gz_statep)); +local int gz_skip OF((gz_statep, z_off64_t)); + +/* Use read() to load a buffer -- return -1 on error, otherwise 0. Read from + state->fd, and update state->eof, state->err, and state->msg as appropriate. + This function needs to loop on read(), since read() is not guaranteed to + read the number of bytes requested, depending on the type of descriptor. */ +local int gz_load(state, buf, len, have) + gz_statep state; + unsigned char *buf; + unsigned len; + unsigned *have; +{ + int ret; + + *have = 0; + do { + ret = read(state->fd, buf + *have, len - *have); + if (ret <= 0) + break; + *have += ret; + } while (*have < len); + if (ret < 0) { + gz_error(state, Z_ERRNO, zstrerror()); + return -1; + } + if (ret == 0) + state->eof = 1; + return 0; +} + +/* Load up input buffer and set eof flag if last data loaded -- return -1 on + error, 0 otherwise. Note that the eof flag is set when the end of the input + file is reached, even though there may be unused data in the buffer. Once + that data has been used, no more attempts will be made to read the file. + If strm->avail_in != 0, then the current data is moved to the beginning of + the input buffer, and then the remainder of the buffer is loaded with the + available data from the input file. */ +local int gz_avail(state) + gz_statep state; +{ + unsigned got; + z_streamp strm = &(state->strm); + + if (state->err != Z_OK && state->err != Z_BUF_ERROR) + return -1; + if (state->eof == 0) { + if (strm->avail_in) { /* copy what's there to the start */ + unsigned char *p = state->in; + unsigned const char *q = strm->next_in; + unsigned n = strm->avail_in; + do { + *p++ = *q++; + } while (--n); + } + if (gz_load(state, state->in + strm->avail_in, + state->size - strm->avail_in, &got) == -1) + return -1; + strm->avail_in += got; + strm->next_in = state->in; + } + return 0; +} + +/* Look for gzip header, set up for inflate or copy. state->x.have must be 0. + If this is the first time in, allocate required memory. state->how will be + left unchanged if there is no more input data available, will be set to COPY + if there is no gzip header and direct copying will be performed, or it will + be set to GZIP for decompression. If direct copying, then leftover input + data from the input buffer will be copied to the output buffer. In that + case, all further file reads will be directly to either the output buffer or + a user buffer. If decompressing, the inflate state will be initialized. + gz_look() will return 0 on success or -1 on failure. */ +local int gz_look(state) + gz_statep state; +{ + z_streamp strm = &(state->strm); + + /* allocate read buffers and inflate memory */ + if (state->size == 0) { + /* allocate buffers */ + state->in = (unsigned char *)malloc(state->want); + state->out = (unsigned char *)malloc(state->want << 1); + if (state->in == NULL || state->out == NULL) { + if (state->out != NULL) + free(state->out); + if (state->in != NULL) + free(state->in); + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + state->size = state->want; + + /* allocate inflate memory */ + state->strm.zalloc = Z_NULL; + state->strm.zfree = Z_NULL; + state->strm.opaque = Z_NULL; + state->strm.avail_in = 0; + state->strm.next_in = Z_NULL; + if (inflateInit2(&(state->strm), 15 + 16) != Z_OK) { /* gunzip */ + free(state->out); + free(state->in); + state->size = 0; + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + } + + /* get at least the magic bytes in the input buffer */ + if (strm->avail_in < 2) { + if (gz_avail(state) == -1) + return -1; + if (strm->avail_in == 0) + return 0; + } + + /* look for gzip magic bytes -- if there, do gzip decoding (note: there is + a logical dilemma here when considering the case of a partially written + gzip file, to wit, if a single 31 byte is written, then we cannot tell + whether this is a single-byte file, or just a partially written gzip + file -- for here we assume that if a gzip file is being written, then + the header will be written in a single operation, so that reading a + single byte is sufficient indication that it is not a gzip file) */ + if (strm->avail_in > 1 && + strm->next_in[0] == 31 && strm->next_in[1] == 139) { + inflateReset(strm); + state->how = GZIP; + state->direct = 0; + return 0; + } + + /* no gzip header -- if we were decoding gzip before, then this is trailing + garbage. Ignore the trailing garbage and finish. */ + if (state->direct == 0) { + strm->avail_in = 0; + state->eof = 1; + state->x.have = 0; + return 0; + } + + /* doing raw i/o, copy any leftover input to output -- this assumes that + the output buffer is larger than the input buffer, which also assures + space for gzungetc() */ + state->x.next = state->out; + if (strm->avail_in) { + memcpy(state->x.next, strm->next_in, strm->avail_in); + state->x.have = strm->avail_in; + strm->avail_in = 0; + } + state->how = COPY; + state->direct = 1; + return 0; +} + +/* Decompress from input to the provided next_out and avail_out in the state. + On return, state->x.have and state->x.next point to the just decompressed + data. If the gzip stream completes, state->how is reset to LOOK to look for + the next gzip stream or raw data, once state->x.have is depleted. Returns 0 + on success, -1 on failure. */ +local int gz_decomp(state) + gz_statep state; +{ + int ret = Z_OK; + unsigned had; + z_streamp strm = &(state->strm); + + /* fill output buffer up to end of deflate stream */ + had = strm->avail_out; + do { + /* get more input for inflate() */ + if (strm->avail_in == 0 && gz_avail(state) == -1) + return -1; + if (strm->avail_in == 0) { + gz_error(state, Z_BUF_ERROR, "unexpected end of file"); + break; + } + + /* decompress and handle errors */ + ret = inflate(strm, Z_NO_FLUSH); + if (ret == Z_STREAM_ERROR || ret == Z_NEED_DICT) { + gz_error(state, Z_STREAM_ERROR, + "internal error: inflate stream corrupt"); + return -1; + } + if (ret == Z_MEM_ERROR) { + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + if (ret == Z_DATA_ERROR) { /* deflate stream invalid */ + gz_error(state, Z_DATA_ERROR, + strm->msg == NULL ? "compressed data error" : strm->msg); + return -1; + } + } while (strm->avail_out && ret != Z_STREAM_END); + + /* update available output */ + state->x.have = had - strm->avail_out; + state->x.next = strm->next_out - state->x.have; + + /* if the gzip stream completed successfully, look for another */ + if (ret == Z_STREAM_END) + state->how = LOOK; + + /* good decompression */ + return 0; +} + +/* Fetch data and put it in the output buffer. Assumes state->x.have is 0. + Data is either copied from the input file or decompressed from the input + file depending on state->how. If state->how is LOOK, then a gzip header is + looked for to determine whether to copy or decompress. Returns -1 on error, + otherwise 0. gz_fetch() will leave state->how as COPY or GZIP unless the + end of the input file has been reached and all data has been processed. */ +local int gz_fetch(state) + gz_statep state; +{ + z_streamp strm = &(state->strm); + + do { + switch(state->how) { + case LOOK: /* -> LOOK, COPY (only if never GZIP), or GZIP */ + if (gz_look(state) == -1) + return -1; + if (state->how == LOOK) + return 0; + break; + case COPY: /* -> COPY */ + if (gz_load(state, state->out, state->size << 1, &(state->x.have)) + == -1) + return -1; + state->x.next = state->out; + return 0; + case GZIP: /* -> GZIP or LOOK (if end of gzip stream) */ + strm->avail_out = state->size << 1; + strm->next_out = state->out; + if (gz_decomp(state) == -1) + return -1; + } + } while (state->x.have == 0 && (!state->eof || strm->avail_in)); + return 0; +} + +/* Skip len uncompressed bytes of output. Return -1 on error, 0 on success. */ +local int gz_skip(state, len) + gz_statep state; + z_off64_t len; +{ + unsigned n; + + /* skip over len bytes or reach end-of-file, whichever comes first */ + while (len) + /* skip over whatever is in output buffer */ + if (state->x.have) { + n = GT_OFF(state->x.have) || (z_off64_t)state->x.have > len ? + (unsigned)len : state->x.have; + state->x.have -= n; + state->x.next += n; + state->x.pos += n; + len -= n; + } + + /* output buffer empty -- return if we're at the end of the input */ + else if (state->eof && state->strm.avail_in == 0) + break; + + /* need more data to skip -- load up output buffer */ + else { + /* get more output, looking for header if required */ + if (gz_fetch(state) == -1) + return -1; + } + return 0; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzread(file, buf, len) + gzFile file; + voidp buf; + unsigned len; +{ + unsigned got, n; + gz_statep state; + z_streamp strm; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + strm = &(state->strm); + + /* check that we're reading and that there's no (serious) error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) + return -1; + + /* since an int is returned, make sure len fits in one, otherwise return + with an error (this avoids the flaw in the interface) */ + if ((int)len < 0) { + gz_error(state, Z_DATA_ERROR, "requested length does not fit in int"); + return -1; + } + + /* if len is zero, avoid unnecessary operations */ + if (len == 0) + return 0; + + /* process a skip request */ + if (state->seek) { + state->seek = 0; + if (gz_skip(state, state->skip) == -1) + return -1; + } + + /* get len bytes to buf, or less than len if at the end */ + got = 0; + do { + /* first just try copying data from the output buffer */ + if (state->x.have) { + n = state->x.have > len ? len : state->x.have; + memcpy(buf, state->x.next, n); + state->x.next += n; + state->x.have -= n; + } + + /* output buffer empty -- return if we're at the end of the input */ + else if (state->eof && strm->avail_in == 0) { + state->past = 1; /* tried to read past end */ + break; + } + + /* need output data -- for small len or new stream load up our output + buffer */ + else if (state->how == LOOK || len < (state->size << 1)) { + /* get more output, looking for header if required */ + if (gz_fetch(state) == -1) + return -1; + continue; /* no progress yet -- go back to copy above */ + /* the copy above assures that we will leave with space in the + output buffer, allowing at least one gzungetc() to succeed */ + } + + /* large len -- read directly into user buffer */ + else if (state->how == COPY) { /* read directly */ + if (gz_load(state, (unsigned char *)buf, len, &n) == -1) + return -1; + } + + /* large len -- decompress directly into user buffer */ + else { /* state->how == GZIP */ + strm->avail_out = len; + strm->next_out = (unsigned char *)buf; + if (gz_decomp(state) == -1) + return -1; + n = state->x.have; + state->x.have = 0; + } + + /* update progress */ + len -= n; + buf = (char *)buf + n; + got += n; + state->x.pos += n; + } while (len); + + /* return number of bytes read into user buffer (will fit in int) */ + return (int)got; +} + +/* -- see zlib.h -- */ +#ifdef Z_PREFIX_SET +# undef z_gzgetc +#else +# undef gzgetc +#endif +int ZEXPORT gzgetc(file) + gzFile file; +{ + int ret; + unsigned char buf[1]; + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + + /* check that we're reading and that there's no (serious) error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) + return -1; + + /* try output buffer (no need to check for skip request) */ + if (state->x.have) { + state->x.have--; + state->x.pos++; + return *(state->x.next)++; + } + + /* nothing there -- try gzread() */ + ret = gzread(file, buf, 1); + return ret < 1 ? -1 : buf[0]; +} + +int ZEXPORT gzgetc_(file) +gzFile file; +{ + return gzgetc(file); +} + +/* -- see zlib.h -- */ +int ZEXPORT gzungetc(c, file) + int c; + gzFile file; +{ + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + + /* check that we're reading and that there's no (serious) error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) + return -1; + + /* process a skip request */ + if (state->seek) { + state->seek = 0; + if (gz_skip(state, state->skip) == -1) + return -1; + } + + /* can't push EOF */ + if (c < 0) + return -1; + + /* if output buffer empty, put byte at end (allows more pushing) */ + if (state->x.have == 0) { + state->x.have = 1; + state->x.next = state->out + (state->size << 1) - 1; + state->x.next[0] = c; + state->x.pos--; + state->past = 0; + return c; + } + + /* if no room, give up (must have already done a gzungetc()) */ + if (state->x.have == (state->size << 1)) { + gz_error(state, Z_DATA_ERROR, "out of room to push characters"); + return -1; + } + + /* slide output data if needed and insert byte before existing data */ + if (state->x.next == state->out) { + unsigned char *src = state->out + state->x.have; + unsigned char *dest = state->out + (state->size << 1); + while (src > state->out) + *--dest = *--src; + state->x.next = dest; + } + state->x.have++; + state->x.next--; + state->x.next[0] = c; + state->x.pos--; + state->past = 0; + return c; +} + +/* -- see zlib.h -- */ +char * ZEXPORT gzgets(file, buf, len) + gzFile file; + char *buf; + int len; +{ + unsigned left, n; + char *str; + unsigned char *eol; + gz_statep state; + + /* check parameters and get internal structure */ + if (file == NULL || buf == NULL || len < 1) + return NULL; + state = (gz_statep)file; + + /* check that we're reading and that there's no (serious) error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) + return NULL; + + /* process a skip request */ + if (state->seek) { + state->seek = 0; + if (gz_skip(state, state->skip) == -1) + return NULL; + } + + /* copy output bytes up to new line or len - 1, whichever comes first -- + append a terminating zero to the string (we don't check for a zero in + the contents, let the user worry about that) */ + str = buf; + left = (unsigned)len - 1; + if (left) do { + /* assure that something is in the output buffer */ + if (state->x.have == 0 && gz_fetch(state) == -1) + return NULL; /* error */ + if (state->x.have == 0) { /* end of file */ + state->past = 1; /* read past end */ + break; /* return what we have */ + } + + /* look for end-of-line in current output buffer */ + n = state->x.have > left ? left : state->x.have; + eol = (unsigned char *)memchr(state->x.next, '\n', n); + if (eol != NULL) + n = (unsigned)(eol - state->x.next) + 1; + + /* copy through end-of-line, or remainder if not found */ + memcpy(buf, state->x.next, n); + state->x.have -= n; + state->x.next += n; + state->x.pos += n; + left -= n; + buf += n; + } while (left && eol == NULL); + + /* return terminated string, or if nothing, end of file */ + if (buf == str) + return NULL; + buf[0] = 0; + return str; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzdirect(file) + gzFile file; +{ + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return 0; + state = (gz_statep)file; + + /* if the state is not known, but we can find out, then do so (this is + mainly for right after a gzopen() or gzdopen()) */ + if (state->mode == GZ_READ && state->how == LOOK && state->x.have == 0) + (void)gz_look(state); + + /* return 1 if transparent, 0 if processing a gzip stream */ + return state->direct; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzclose_r(file) + gzFile file; +{ + int ret, err; + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return Z_STREAM_ERROR; + state = (gz_statep)file; + + /* check that we're reading */ + if (state->mode != GZ_READ) + return Z_STREAM_ERROR; + + /* free memory and close file */ + if (state->size) { + inflateEnd(&(state->strm)); + free(state->out); + free(state->in); + } + err = state->err == Z_BUF_ERROR ? Z_BUF_ERROR : Z_OK; + gz_error(state, Z_OK, NULL); + free(state->path); + ret = close(state->fd); + free(state); + return ret ? Z_ERRNO : err; +} diff --git a/Minecraft.Client/Common/zlib/gzwrite.c b/Minecraft.Client/Common/zlib/gzwrite.c new file mode 100644 index 00000000..aa767fbf --- /dev/null +++ b/Minecraft.Client/Common/zlib/gzwrite.c @@ -0,0 +1,577 @@ +/* gzwrite.c -- zlib functions for writing gzip files + * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "gzguts.h" + +/* Local functions */ +local int gz_init OF((gz_statep)); +local int gz_comp OF((gz_statep, int)); +local int gz_zero OF((gz_statep, z_off64_t)); + +/* Initialize state for writing a gzip file. Mark initialization by setting + state->size to non-zero. Return -1 on failure or 0 on success. */ +local int gz_init(state) + gz_statep state; +{ + int ret; + z_streamp strm = &(state->strm); + + /* allocate input buffer */ + state->in = (unsigned char *)malloc(state->want); + if (state->in == NULL) { + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + + /* only need output buffer and deflate state if compressing */ + if (!state->direct) { + /* allocate output buffer */ + state->out = (unsigned char *)malloc(state->want); + if (state->out == NULL) { + free(state->in); + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + + /* allocate deflate memory, set up for gzip compression */ + strm->zalloc = Z_NULL; + strm->zfree = Z_NULL; + strm->opaque = Z_NULL; + ret = deflateInit2(strm, state->level, Z_DEFLATED, + MAX_WBITS + 16, DEF_MEM_LEVEL, state->strategy); + if (ret != Z_OK) { + free(state->out); + free(state->in); + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + } + + /* mark state as initialized */ + state->size = state->want; + + /* initialize write buffer if compressing */ + if (!state->direct) { + strm->avail_out = state->size; + strm->next_out = state->out; + state->x.next = strm->next_out; + } + return 0; +} + +/* Compress whatever is at avail_in and next_in and write to the output file. + Return -1 if there is an error writing to the output file, otherwise 0. + flush is assumed to be a valid deflate() flush value. If flush is Z_FINISH, + then the deflate() state is reset to start a new gzip stream. If gz->direct + is true, then simply write to the output file without compressing, and + ignore flush. */ +local int gz_comp(state, flush) + gz_statep state; + int flush; +{ + int ret, got; + unsigned have; + z_streamp strm = &(state->strm); + + /* allocate memory if this is the first time through */ + if (state->size == 0 && gz_init(state) == -1) + return -1; + + /* write directly if requested */ + if (state->direct) { + got = write(state->fd, strm->next_in, strm->avail_in); + if (got < 0 || (unsigned)got != strm->avail_in) { + gz_error(state, Z_ERRNO, zstrerror()); + return -1; + } + strm->avail_in = 0; + return 0; + } + + /* run deflate() on provided input until it produces no more output */ + ret = Z_OK; + do { + /* write out current buffer contents if full, or if flushing, but if + doing Z_FINISH then don't write until we get to Z_STREAM_END */ + if (strm->avail_out == 0 || (flush != Z_NO_FLUSH && + (flush != Z_FINISH || ret == Z_STREAM_END))) { + have = (unsigned)(strm->next_out - state->x.next); + if (have && ((got = write(state->fd, state->x.next, have)) < 0 || + (unsigned)got != have)) { + gz_error(state, Z_ERRNO, zstrerror()); + return -1; + } + if (strm->avail_out == 0) { + strm->avail_out = state->size; + strm->next_out = state->out; + } + state->x.next = strm->next_out; + } + + /* compress */ + have = strm->avail_out; + ret = deflate(strm, flush); + if (ret == Z_STREAM_ERROR) { + gz_error(state, Z_STREAM_ERROR, + "internal error: deflate stream corrupt"); + return -1; + } + have -= strm->avail_out; + } while (have); + + /* if that completed a deflate stream, allow another to start */ + if (flush == Z_FINISH) + deflateReset(strm); + + /* all done, no errors */ + return 0; +} + +/* Compress len zeros to output. Return -1 on error, 0 on success. */ +local int gz_zero(state, len) + gz_statep state; + z_off64_t len; +{ + int first; + unsigned n; + z_streamp strm = &(state->strm); + + /* consume whatever's left in the input buffer */ + if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) + return -1; + + /* compress len zeros (len guaranteed > 0) */ + first = 1; + while (len) { + n = GT_OFF(state->size) || (z_off64_t)state->size > len ? + (unsigned)len : state->size; + if (first) { + memset(state->in, 0, n); + first = 0; + } + strm->avail_in = n; + strm->next_in = state->in; + state->x.pos += n; + if (gz_comp(state, Z_NO_FLUSH) == -1) + return -1; + len -= n; + } + return 0; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzwrite(file, buf, len) + gzFile file; + voidpc buf; + unsigned len; +{ + unsigned put = len; + gz_statep state; + z_streamp strm; + + /* get internal structure */ + if (file == NULL) + return 0; + state = (gz_statep)file; + strm = &(state->strm); + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return 0; + + /* since an int is returned, make sure len fits in one, otherwise return + with an error (this avoids the flaw in the interface) */ + if ((int)len < 0) { + gz_error(state, Z_DATA_ERROR, "requested length does not fit in int"); + return 0; + } + + /* if len is zero, avoid unnecessary operations */ + if (len == 0) + return 0; + + /* allocate memory if this is the first time through */ + if (state->size == 0 && gz_init(state) == -1) + return 0; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return 0; + } + + /* for small len, copy to input buffer, otherwise compress directly */ + if (len < state->size) { + /* copy to input buffer, compress when full */ + do { + unsigned have, copy; + + if (strm->avail_in == 0) + strm->next_in = state->in; + have = (unsigned)((strm->next_in + strm->avail_in) - state->in); + copy = state->size - have; + if (copy > len) + copy = len; + memcpy(state->in + have, buf, copy); + strm->avail_in += copy; + state->x.pos += copy; + buf = (const char *)buf + copy; + len -= copy; + if (len && gz_comp(state, Z_NO_FLUSH) == -1) + return 0; + } while (len); + } + else { + /* consume whatever's left in the input buffer */ + if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) + return 0; + + /* directly compress user buffer to file */ + strm->avail_in = len; + strm->next_in = (z_const Bytef *)buf; + state->x.pos += len; + if (gz_comp(state, Z_NO_FLUSH) == -1) + return 0; + } + + /* input was all buffered or compressed (put will fit in int) */ + return (int)put; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzputc(file, c) + gzFile file; + int c; +{ + unsigned have; + unsigned char buf[1]; + gz_statep state; + z_streamp strm; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + strm = &(state->strm); + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return -1; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return -1; + } + + /* try writing to input buffer for speed (state->size == 0 if buffer not + initialized) */ + if (state->size) { + if (strm->avail_in == 0) + strm->next_in = state->in; + have = (unsigned)((strm->next_in + strm->avail_in) - state->in); + if (have < state->size) { + state->in[have] = c; + strm->avail_in++; + state->x.pos++; + return c & 0xff; + } + } + + /* no room in buffer or not initialized, use gz_write() */ + buf[0] = c; + if (gzwrite(file, buf, 1) != 1) + return -1; + return c & 0xff; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzputs(file, str) + gzFile file; + const char *str; +{ + int ret; + unsigned len; + + /* write string */ + len = (unsigned)strlen(str); + ret = gzwrite(file, str, len); + return ret == 0 && len != 0 ? -1 : ret; +} + +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +#include + +/* -- see zlib.h -- */ +int ZEXPORTVA gzvprintf(gzFile file, const char *format, va_list va) +{ + int size, len; + gz_statep state; + z_streamp strm; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + strm = &(state->strm); + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return 0; + + /* make sure we have some buffer space */ + if (state->size == 0 && gz_init(state) == -1) + return 0; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return 0; + } + + /* consume whatever's left in the input buffer */ + if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) + return 0; + + /* do the printf() into the input buffer, put length in len */ + size = (int)(state->size); + state->in[size - 1] = 0; +#ifdef NO_vsnprintf +# ifdef HAS_vsprintf_void + (void)vsprintf((char *)(state->in), format, va); + for (len = 0; len < size; len++) + if (state->in[len] == 0) break; +# else + len = vsprintf((char *)(state->in), format, va); +# endif +#else +# ifdef HAS_vsnprintf_void + (void)vsnprintf((char *)(state->in), size, format, va); + len = strlen((char *)(state->in)); +# else + len = vsnprintf((char *)(state->in), size, format, va); +# endif +#endif + + /* check that printf() results fit in buffer */ + if (len <= 0 || len >= (int)size || state->in[size - 1] != 0) + return 0; + + /* update buffer and position, defer compression until needed */ + strm->avail_in = (unsigned)len; + strm->next_in = state->in; + state->x.pos += len; + return len; +} + +int ZEXPORTVA gzprintf(gzFile file, const char *format, ...) +{ + va_list va; + int ret; + + va_start(va, format); + ret = gzvprintf(file, format, va); + va_end(va); + return ret; +} + +#else /* !STDC && !Z_HAVE_STDARG_H */ + +/* -- see zlib.h -- */ +int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, + a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) + gzFile file; + const char *format; + int a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, + a11, a12, a13, a14, a15, a16, a17, a18, a19, a20; +{ + int size, len; + gz_statep state; + z_streamp strm; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + strm = &(state->strm); + + /* check that can really pass pointer in ints */ + if (sizeof(int) != sizeof(void *)) + return 0; + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return 0; + + /* make sure we have some buffer space */ + if (state->size == 0 && gz_init(state) == -1) + return 0; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return 0; + } + + /* consume whatever's left in the input buffer */ + if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) + return 0; + + /* do the printf() into the input buffer, put length in len */ + size = (int)(state->size); + state->in[size - 1] = 0; +#ifdef NO_snprintf +# ifdef HAS_sprintf_void + sprintf((char *)(state->in), format, a1, a2, a3, a4, a5, a6, a7, a8, + a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); + for (len = 0; len < size; len++) + if (state->in[len] == 0) break; +# else + len = sprintf((char *)(state->in), format, a1, a2, a3, a4, a5, a6, a7, a8, + a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); +# endif +#else +# ifdef HAS_snprintf_void + snprintf((char *)(state->in), size, format, a1, a2, a3, a4, a5, a6, a7, a8, + a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); + len = strlen((char *)(state->in)); +# else + len = snprintf((char *)(state->in), size, format, a1, a2, a3, a4, a5, a6, + a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, + a19, a20); +# endif +#endif + + /* check that printf() results fit in buffer */ + if (len <= 0 || len >= (int)size || state->in[size - 1] != 0) + return 0; + + /* update buffer and position, defer compression until needed */ + strm->avail_in = (unsigned)len; + strm->next_in = state->in; + state->x.pos += len; + return len; +} + +#endif + +/* -- see zlib.h -- */ +int ZEXPORT gzflush(file, flush) + gzFile file; + int flush; +{ + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return Z_STREAM_ERROR; + + /* check flush parameter */ + if (flush < 0 || flush > Z_FINISH) + return Z_STREAM_ERROR; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return -1; + } + + /* compress remaining data with requested flush */ + gz_comp(state, flush); + return state->err; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzsetparams(file, level, strategy) + gzFile file; + int level; + int strategy; +{ + gz_statep state; + z_streamp strm; + + /* get internal structure */ + if (file == NULL) + return Z_STREAM_ERROR; + state = (gz_statep)file; + strm = &(state->strm); + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return Z_STREAM_ERROR; + + /* if no change is requested, then do nothing */ + if (level == state->level && strategy == state->strategy) + return Z_OK; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return -1; + } + + /* change compression parameters for subsequent input */ + if (state->size) { + /* flush previous input with previous parameters before changing */ + if (strm->avail_in && gz_comp(state, Z_PARTIAL_FLUSH) == -1) + return state->err; + deflateParams(strm, level, strategy); + } + state->level = level; + state->strategy = strategy; + return Z_OK; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzclose_w(file) + gzFile file; +{ + int ret = Z_OK; + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return Z_STREAM_ERROR; + state = (gz_statep)file; + + /* check that we're writing */ + if (state->mode != GZ_WRITE) + return Z_STREAM_ERROR; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + ret = state->err; + } + + /* flush, free memory, and close file */ + if (gz_comp(state, Z_FINISH) == -1) + ret = state->err; + if (state->size) { + if (!state->direct) { + (void)deflateEnd(&(state->strm)); + free(state->out); + } + free(state->in); + } + gz_error(state, Z_OK, NULL); + free(state->path); + if (close(state->fd) == -1) + ret = Z_ERRNO; + free(state); + return ret; +} diff --git a/Minecraft.Client/Common/zlib/infback.c b/Minecraft.Client/Common/zlib/infback.c new file mode 100644 index 00000000..f3833c2e --- /dev/null +++ b/Minecraft.Client/Common/zlib/infback.c @@ -0,0 +1,640 @@ +/* infback.c -- inflate using a call-back interface + * Copyright (C) 1995-2011 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + This code is largely copied from inflate.c. Normally either infback.o or + inflate.o would be linked into an application--not both. The interface + with inffast.c is retained so that optimized assembler-coded versions of + inflate_fast() can be used with either inflate.c or infback.c. + */ + +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" + +/* function prototypes */ +local void fixedtables OF((struct inflate_state FAR *state)); + +/* + strm provides memory allocation functions in zalloc and zfree, or + Z_NULL to use the library memory allocation functions. + + windowBits is in the range 8..15, and window is a user-supplied + window and output buffer that is 2**windowBits bytes. + */ +int ZEXPORT inflateBackInit_(strm, windowBits, window, version, stream_size) +z_streamp strm; +int windowBits; +unsigned char FAR *window; +const char *version; +int stream_size; +{ + struct inflate_state FAR *state; + + if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || + stream_size != (int)(sizeof(z_stream))) + return Z_VERSION_ERROR; + if (strm == Z_NULL || window == Z_NULL || + windowBits < 8 || windowBits > 15) + return Z_STREAM_ERROR; + strm->msg = Z_NULL; /* in case we return an error */ + if (strm->zalloc == (alloc_func)0) { +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zalloc = zcalloc; + strm->opaque = (voidpf)0; +#endif + } + if (strm->zfree == (free_func)0) +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zfree = zcfree; +#endif + state = (struct inflate_state FAR *)ZALLOC(strm, 1, + sizeof(struct inflate_state)); + if (state == Z_NULL) return Z_MEM_ERROR; + Tracev((stderr, "inflate: allocated\n")); + strm->state = (struct internal_state FAR *)state; + state->dmax = 32768U; + state->wbits = windowBits; + state->wsize = 1U << windowBits; + state->window = window; + state->wnext = 0; + state->whave = 0; + return Z_OK; +} + +/* + Return state with length and distance decoding tables and index sizes set to + fixed code decoding. Normally this returns fixed tables from inffixed.h. + If BUILDFIXED is defined, then instead this routine builds the tables the + first time it's called, and returns those tables the first time and + thereafter. This reduces the size of the code by about 2K bytes, in + exchange for a little execution time. However, BUILDFIXED should not be + used for threaded applications, since the rewriting of the tables and virgin + may not be thread-safe. + */ +local void fixedtables(state) +struct inflate_state FAR *state; +{ +#ifdef BUILDFIXED + static int virgin = 1; + static code *lenfix, *distfix; + static code fixed[544]; + + /* build fixed huffman tables if first call (may not be thread safe) */ + if (virgin) { + unsigned sym, bits; + static code *next; + + /* literal/length table */ + sym = 0; + while (sym < 144) state->lens[sym++] = 8; + while (sym < 256) state->lens[sym++] = 9; + while (sym < 280) state->lens[sym++] = 7; + while (sym < 288) state->lens[sym++] = 8; + next = fixed; + lenfix = next; + bits = 9; + inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); + + /* distance table */ + sym = 0; + while (sym < 32) state->lens[sym++] = 5; + distfix = next; + bits = 5; + inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); + + /* do this just once */ + virgin = 0; + } +#else /* !BUILDFIXED */ +# include "inffixed.h" +#endif /* BUILDFIXED */ + state->lencode = lenfix; + state->lenbits = 9; + state->distcode = distfix; + state->distbits = 5; +} + +/* Macros for inflateBack(): */ + +/* Load returned state from inflate_fast() */ +#define LOAD() \ + do { \ + put = strm->next_out; \ + left = strm->avail_out; \ + next = strm->next_in; \ + have = strm->avail_in; \ + hold = state->hold; \ + bits = state->bits; \ + } while (0) + +/* Set state from registers for inflate_fast() */ +#define RESTORE() \ + do { \ + strm->next_out = put; \ + strm->avail_out = left; \ + strm->next_in = next; \ + strm->avail_in = have; \ + state->hold = hold; \ + state->bits = bits; \ + } while (0) + +/* Clear the input bit accumulator */ +#define INITBITS() \ + do { \ + hold = 0; \ + bits = 0; \ + } while (0) + +/* Assure that some input is available. If input is requested, but denied, + then return a Z_BUF_ERROR from inflateBack(). */ +#define PULL() \ + do { \ + if (have == 0) { \ + have = in(in_desc, &next); \ + if (have == 0) { \ + next = Z_NULL; \ + ret = Z_BUF_ERROR; \ + goto inf_leave; \ + } \ + } \ + } while (0) + +/* Get a byte of input into the bit accumulator, or return from inflateBack() + with an error if there is no input available. */ +#define PULLBYTE() \ + do { \ + PULL(); \ + have--; \ + hold += (unsigned long)(*next++) << bits; \ + bits += 8; \ + } while (0) + +/* Assure that there are at least n bits in the bit accumulator. If there is + not enough available input to do that, then return from inflateBack() with + an error. */ +#define NEEDBITS(n) \ + do { \ + while (bits < (unsigned)(n)) \ + PULLBYTE(); \ + } while (0) + +/* Return the low n bits of the bit accumulator (n < 16) */ +#define BITS(n) \ + ((unsigned)hold & ((1U << (n)) - 1)) + +/* Remove n bits from the bit accumulator */ +#define DROPBITS(n) \ + do { \ + hold >>= (n); \ + bits -= (unsigned)(n); \ + } while (0) + +/* Remove zero to seven bits as needed to go to a byte boundary */ +#define BYTEBITS() \ + do { \ + hold >>= bits & 7; \ + bits -= bits & 7; \ + } while (0) + +/* Assure that some output space is available, by writing out the window + if it's full. If the write fails, return from inflateBack() with a + Z_BUF_ERROR. */ +#define ROOM() \ + do { \ + if (left == 0) { \ + put = state->window; \ + left = state->wsize; \ + state->whave = left; \ + if (out(out_desc, put, left)) { \ + ret = Z_BUF_ERROR; \ + goto inf_leave; \ + } \ + } \ + } while (0) + +/* + strm provides the memory allocation functions and window buffer on input, + and provides information on the unused input on return. For Z_DATA_ERROR + returns, strm will also provide an error message. + + in() and out() are the call-back input and output functions. When + inflateBack() needs more input, it calls in(). When inflateBack() has + filled the window with output, or when it completes with data in the + window, it calls out() to write out the data. The application must not + change the provided input until in() is called again or inflateBack() + returns. The application must not change the window/output buffer until + inflateBack() returns. + + in() and out() are called with a descriptor parameter provided in the + inflateBack() call. This parameter can be a structure that provides the + information required to do the read or write, as well as accumulated + information on the input and output such as totals and check values. + + in() should return zero on failure. out() should return non-zero on + failure. If either in() or out() fails, than inflateBack() returns a + Z_BUF_ERROR. strm->next_in can be checked for Z_NULL to see whether it + was in() or out() that caused in the error. Otherwise, inflateBack() + returns Z_STREAM_END on success, Z_DATA_ERROR for an deflate format + error, or Z_MEM_ERROR if it could not allocate memory for the state. + inflateBack() can also return Z_STREAM_ERROR if the input parameters + are not correct, i.e. strm is Z_NULL or the state was not initialized. + */ +int ZEXPORT inflateBack(strm, in, in_desc, out, out_desc) +z_streamp strm; +in_func in; +void FAR *in_desc; +out_func out; +void FAR *out_desc; +{ + struct inflate_state FAR *state; + z_const unsigned char FAR *next; /* next input */ + unsigned char FAR *put; /* next output */ + unsigned have, left; /* available input and output */ + unsigned long hold; /* bit buffer */ + unsigned bits; /* bits in bit buffer */ + unsigned copy; /* number of stored or match bytes to copy */ + unsigned char FAR *from; /* where to copy match bytes from */ + code here; /* current decoding table entry */ + code last; /* parent table entry */ + unsigned len; /* length to copy for repeats, bits to drop */ + int ret; /* return code */ + static const unsigned short order[19] = /* permutation of code lengths */ + {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; + + /* Check that the strm exists and that the state was initialized */ + if (strm == Z_NULL || strm->state == Z_NULL) + return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + + /* Reset the state */ + strm->msg = Z_NULL; + state->mode = TYPE; + state->last = 0; + state->whave = 0; + next = strm->next_in; + have = next != Z_NULL ? strm->avail_in : 0; + hold = 0; + bits = 0; + put = state->window; + left = state->wsize; + + /* Inflate until end of block marked as last */ + for (;;) + switch (state->mode) { + case TYPE: + /* determine and dispatch block type */ + if (state->last) { + BYTEBITS(); + state->mode = DONE; + break; + } + NEEDBITS(3); + state->last = BITS(1); + DROPBITS(1); + switch (BITS(2)) { + case 0: /* stored block */ + Tracev((stderr, "inflate: stored block%s\n", + state->last ? " (last)" : "")); + state->mode = STORED; + break; + case 1: /* fixed block */ + fixedtables(state); + Tracev((stderr, "inflate: fixed codes block%s\n", + state->last ? " (last)" : "")); + state->mode = LEN; /* decode codes */ + break; + case 2: /* dynamic block */ + Tracev((stderr, "inflate: dynamic codes block%s\n", + state->last ? " (last)" : "")); + state->mode = TABLE; + break; + case 3: + strm->msg = (char *)"invalid block type"; + state->mode = BAD; + } + DROPBITS(2); + break; + + case STORED: + /* get and verify stored block length */ + BYTEBITS(); /* go to byte boundary */ + NEEDBITS(32); + if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { + strm->msg = (char *)"invalid stored block lengths"; + state->mode = BAD; + break; + } + state->length = (unsigned)hold & 0xffff; + Tracev((stderr, "inflate: stored length %u\n", + state->length)); + INITBITS(); + + /* copy stored block from input to output */ + while (state->length != 0) { + copy = state->length; + PULL(); + ROOM(); + if (copy > have) copy = have; + if (copy > left) copy = left; + zmemcpy(put, next, copy); + have -= copy; + next += copy; + left -= copy; + put += copy; + state->length -= copy; + } + Tracev((stderr, "inflate: stored end\n")); + state->mode = TYPE; + break; + + case TABLE: + /* get dynamic table entries descriptor */ + NEEDBITS(14); + state->nlen = BITS(5) + 257; + DROPBITS(5); + state->ndist = BITS(5) + 1; + DROPBITS(5); + state->ncode = BITS(4) + 4; + DROPBITS(4); +#ifndef PKZIP_BUG_WORKAROUND + if (state->nlen > 286 || state->ndist > 30) { + strm->msg = (char *)"too many length or distance symbols"; + state->mode = BAD; + break; + } +#endif + Tracev((stderr, "inflate: table sizes ok\n")); + + /* get code length code lengths (not a typo) */ + state->have = 0; + while (state->have < state->ncode) { + NEEDBITS(3); + state->lens[order[state->have++]] = (unsigned short)BITS(3); + DROPBITS(3); + } + while (state->have < 19) + state->lens[order[state->have++]] = 0; + state->next = state->codes; + state->lencode = (code const FAR *)(state->next); + state->lenbits = 7; + ret = inflate_table(CODES, state->lens, 19, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid code lengths set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: code lengths ok\n")); + + /* get length and distance code code lengths */ + state->have = 0; + while (state->have < state->nlen + state->ndist) { + for (;;) { + here = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if (here.val < 16) { + DROPBITS(here.bits); + state->lens[state->have++] = here.val; + } + else { + if (here.val == 16) { + NEEDBITS(here.bits + 2); + DROPBITS(here.bits); + if (state->have == 0) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + len = (unsigned)(state->lens[state->have - 1]); + copy = 3 + BITS(2); + DROPBITS(2); + } + else if (here.val == 17) { + NEEDBITS(here.bits + 3); + DROPBITS(here.bits); + len = 0; + copy = 3 + BITS(3); + DROPBITS(3); + } + else { + NEEDBITS(here.bits + 7); + DROPBITS(here.bits); + len = 0; + copy = 11 + BITS(7); + DROPBITS(7); + } + if (state->have + copy > state->nlen + state->ndist) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + while (copy--) + state->lens[state->have++] = (unsigned short)len; + } + } + + /* handle error breaks in while */ + if (state->mode == BAD) break; + + /* check for end-of-block code (better have one) */ + if (state->lens[256] == 0) { + strm->msg = (char *)"invalid code -- missing end-of-block"; + state->mode = BAD; + break; + } + + /* build code tables -- note: do not change the lenbits or distbits + values here (9 and 6) without reading the comments in inftrees.h + concerning the ENOUGH constants, which depend on those values */ + state->next = state->codes; + state->lencode = (code const FAR *)(state->next); + state->lenbits = 9; + ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid literal/lengths set"; + state->mode = BAD; + break; + } + state->distcode = (code const FAR *)(state->next); + state->distbits = 6; + ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, + &(state->next), &(state->distbits), state->work); + if (ret) { + strm->msg = (char *)"invalid distances set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: codes ok\n")); + state->mode = LEN; + + case LEN: + /* use inflate_fast() if we have enough input and output */ + if (have >= 6 && left >= 258) { + RESTORE(); + if (state->whave < state->wsize) + state->whave = state->wsize - left; + inflate_fast(strm, state->wsize); + LOAD(); + break; + } + + /* get a literal, length, or end-of-block code */ + for (;;) { + here = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if (here.op && (here.op & 0xf0) == 0) { + last = here; + for (;;) { + here = state->lencode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + here.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + } + DROPBITS(here.bits); + state->length = (unsigned)here.val; + + /* process literal */ + if (here.op == 0) { + Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", here.val)); + ROOM(); + *put++ = (unsigned char)(state->length); + left--; + state->mode = LEN; + break; + } + + /* process end of block */ + if (here.op & 32) { + Tracevv((stderr, "inflate: end of block\n")); + state->mode = TYPE; + break; + } + + /* invalid code */ + if (here.op & 64) { + strm->msg = (char *)"invalid literal/length code"; + state->mode = BAD; + break; + } + + /* length code -- get extra bits, if any */ + state->extra = (unsigned)(here.op) & 15; + if (state->extra != 0) { + NEEDBITS(state->extra); + state->length += BITS(state->extra); + DROPBITS(state->extra); + } + Tracevv((stderr, "inflate: length %u\n", state->length)); + + /* get distance code */ + for (;;) { + here = state->distcode[BITS(state->distbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if ((here.op & 0xf0) == 0) { + last = here; + for (;;) { + here = state->distcode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + here.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + } + DROPBITS(here.bits); + if (here.op & 64) { + strm->msg = (char *)"invalid distance code"; + state->mode = BAD; + break; + } + state->offset = (unsigned)here.val; + + /* get distance extra bits, if any */ + state->extra = (unsigned)(here.op) & 15; + if (state->extra != 0) { + NEEDBITS(state->extra); + state->offset += BITS(state->extra); + DROPBITS(state->extra); + } + if (state->offset > state->wsize - (state->whave < state->wsize ? + left : 0)) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } + Tracevv((stderr, "inflate: distance %u\n", state->offset)); + + /* copy match from window to output */ + do { + ROOM(); + copy = state->wsize - state->offset; + if (copy < left) { + from = put + copy; + copy = left - copy; + } + else { + from = put - state->offset; + copy = left; + } + if (copy > state->length) copy = state->length; + state->length -= copy; + left -= copy; + do { + *put++ = *from++; + } while (--copy); + } while (state->length != 0); + break; + + case DONE: + /* inflate stream terminated properly -- write leftover output */ + ret = Z_STREAM_END; + if (left < state->wsize) { + if (out(out_desc, state->window, state->wsize - left)) + ret = Z_BUF_ERROR; + } + goto inf_leave; + + case BAD: + ret = Z_DATA_ERROR; + goto inf_leave; + + default: /* can't happen, but makes compilers happy */ + ret = Z_STREAM_ERROR; + goto inf_leave; + } + + /* Return unused input */ + inf_leave: + strm->next_in = next; + strm->avail_in = have; + return ret; +} + +int ZEXPORT inflateBackEnd(strm) +z_streamp strm; +{ + if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) + return Z_STREAM_ERROR; + ZFREE(strm, strm->state); + strm->state = Z_NULL; + Tracev((stderr, "inflate: end\n")); + return Z_OK; +} diff --git a/Minecraft.Client/Common/zlib/inffast.c b/Minecraft.Client/Common/zlib/inffast.c new file mode 100644 index 00000000..bda59ceb --- /dev/null +++ b/Minecraft.Client/Common/zlib/inffast.c @@ -0,0 +1,340 @@ +/* inffast.c -- fast decoding + * Copyright (C) 1995-2008, 2010, 2013 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" + +#ifndef ASMINF + +/* Allow machine dependent optimization for post-increment or pre-increment. + Based on testing to date, + Pre-increment preferred for: + - PowerPC G3 (Adler) + - MIPS R5000 (Randers-Pehrson) + Post-increment preferred for: + - none + No measurable difference: + - Pentium III (Anderson) + - M68060 (Nikl) + */ +#ifdef POSTINC +# define OFF 0 +# define PUP(a) *(a)++ +#else +# define OFF 1 +# define PUP(a) *++(a) +#endif + +/* + Decode literal, length, and distance codes and write out the resulting + literal and match bytes until either not enough input or output is + available, an end-of-block is encountered, or a data error is encountered. + When large enough input and output buffers are supplied to inflate(), for + example, a 16K input buffer and a 64K output buffer, more than 95% of the + inflate execution time is spent in this routine. + + Entry assumptions: + + state->mode == LEN + strm->avail_in >= 6 + strm->avail_out >= 258 + start >= strm->avail_out + state->bits < 8 + + On return, state->mode is one of: + + LEN -- ran out of enough output space or enough available input + TYPE -- reached end of block code, inflate() to interpret next block + BAD -- error in block data + + Notes: + + - The maximum input bits used by a length/distance pair is 15 bits for the + length code, 5 bits for the length extra, 15 bits for the distance code, + and 13 bits for the distance extra. This totals 48 bits, or six bytes. + Therefore if strm->avail_in >= 6, then there is enough input to avoid + checking for available input while decoding. + + - The maximum bytes that a single length/distance pair can output is 258 + bytes, which is the maximum length that can be coded. inflate_fast() + requires strm->avail_out >= 258 for each loop to avoid checking for + output space. + */ +void ZLIB_INTERNAL inflate_fast(strm, start) +z_streamp strm; +unsigned start; /* inflate()'s starting value for strm->avail_out */ +{ + struct inflate_state FAR *state; + z_const unsigned char FAR *in; /* local strm->next_in */ + z_const unsigned char FAR *last; /* have enough input while in < last */ + unsigned char FAR *out; /* local strm->next_out */ + unsigned char FAR *beg; /* inflate()'s initial strm->next_out */ + unsigned char FAR *end; /* while out < end, enough space available */ +#ifdef INFLATE_STRICT + unsigned dmax; /* maximum distance from zlib header */ +#endif + unsigned wsize; /* window size or zero if not using window */ + unsigned whave; /* valid bytes in the window */ + unsigned wnext; /* window write index */ + unsigned char FAR *window; /* allocated sliding window, if wsize != 0 */ + unsigned long hold; /* local strm->hold */ + unsigned bits; /* local strm->bits */ + code const FAR *lcode; /* local strm->lencode */ + code const FAR *dcode; /* local strm->distcode */ + unsigned lmask; /* mask for first level of length codes */ + unsigned dmask; /* mask for first level of distance codes */ + code here; /* retrieved table entry */ + unsigned op; /* code bits, operation, extra bits, or */ + /* window position, window bytes to copy */ + unsigned len; /* match length, unused bytes */ + unsigned dist; /* match distance */ + unsigned char FAR *from; /* where to copy match from */ + + /* copy state to local variables */ + state = (struct inflate_state FAR *)strm->state; + in = strm->next_in - OFF; + last = in + (strm->avail_in - 5); + out = strm->next_out - OFF; + beg = out - (start - strm->avail_out); + end = out + (strm->avail_out - 257); +#ifdef INFLATE_STRICT + dmax = state->dmax; +#endif + wsize = state->wsize; + whave = state->whave; + wnext = state->wnext; + window = state->window; + hold = state->hold; + bits = state->bits; + lcode = state->lencode; + dcode = state->distcode; + lmask = (1U << state->lenbits) - 1; + dmask = (1U << state->distbits) - 1; + + /* decode literals and length/distances until end-of-block or not enough + input data or output space */ + do { + if (bits < 15) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + } + here = lcode[hold & lmask]; + dolen: + op = (unsigned)(here.bits); + hold >>= op; + bits -= op; + op = (unsigned)(here.op); + if (op == 0) { /* literal */ + Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", here.val)); + PUP(out) = (unsigned char)(here.val); + } + else if (op & 16) { /* length base */ + len = (unsigned)(here.val); + op &= 15; /* number of extra bits */ + if (op) { + if (bits < op) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + } + len += (unsigned)hold & ((1U << op) - 1); + hold >>= op; + bits -= op; + } + Tracevv((stderr, "inflate: length %u\n", len)); + if (bits < 15) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + } + here = dcode[hold & dmask]; + dodist: + op = (unsigned)(here.bits); + hold >>= op; + bits -= op; + op = (unsigned)(here.op); + if (op & 16) { /* distance base */ + dist = (unsigned)(here.val); + op &= 15; /* number of extra bits */ + if (bits < op) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + if (bits < op) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + } + } + dist += (unsigned)hold & ((1U << op) - 1); +#ifdef INFLATE_STRICT + if (dist > dmax) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#endif + hold >>= op; + bits -= op; + Tracevv((stderr, "inflate: distance %u\n", dist)); + op = (unsigned)(out - beg); /* max distance in output */ + if (dist > op) { /* see if copy from window */ + op = dist - op; /* distance back in window */ + if (op > whave) { + if (state->sane) { + strm->msg = + (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + if (len <= op - whave) { + do { + PUP(out) = 0; + } while (--len); + continue; + } + len -= op - whave; + do { + PUP(out) = 0; + } while (--op > whave); + if (op == 0) { + from = out - dist; + do { + PUP(out) = PUP(from); + } while (--len); + continue; + } +#endif + } + from = window - OFF; + if (wnext == 0) { /* very common case */ + from += wsize - op; + if (op < len) { /* some from window */ + len -= op; + do { + PUP(out) = PUP(from); + } while (--op); + from = out - dist; /* rest from output */ + } + } + else if (wnext < op) { /* wrap around window */ + from += wsize + wnext - op; + op -= wnext; + if (op < len) { /* some from end of window */ + len -= op; + do { + PUP(out) = PUP(from); + } while (--op); + from = window - OFF; + if (wnext < len) { /* some from start of window */ + op = wnext; + len -= op; + do { + PUP(out) = PUP(from); + } while (--op); + from = out - dist; /* rest from output */ + } + } + } + else { /* contiguous in window */ + from += wnext - op; + if (op < len) { /* some from window */ + len -= op; + do { + PUP(out) = PUP(from); + } while (--op); + from = out - dist; /* rest from output */ + } + } + while (len > 2) { + PUP(out) = PUP(from); + PUP(out) = PUP(from); + PUP(out) = PUP(from); + len -= 3; + } + if (len) { + PUP(out) = PUP(from); + if (len > 1) + PUP(out) = PUP(from); + } + } + else { + from = out - dist; /* copy direct from output */ + do { /* minimum length is three */ + PUP(out) = PUP(from); + PUP(out) = PUP(from); + PUP(out) = PUP(from); + len -= 3; + } while (len > 2); + if (len) { + PUP(out) = PUP(from); + if (len > 1) + PUP(out) = PUP(from); + } + } + } + else if ((op & 64) == 0) { /* 2nd level distance code */ + here = dcode[here.val + (hold & ((1U << op) - 1))]; + goto dodist; + } + else { + strm->msg = (char *)"invalid distance code"; + state->mode = BAD; + break; + } + } + else if ((op & 64) == 0) { /* 2nd level length code */ + here = lcode[here.val + (hold & ((1U << op) - 1))]; + goto dolen; + } + else if (op & 32) { /* end-of-block */ + Tracevv((stderr, "inflate: end of block\n")); + state->mode = TYPE; + break; + } + else { + strm->msg = (char *)"invalid literal/length code"; + state->mode = BAD; + break; + } + } while (in < last && out < end); + + /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ + len = bits >> 3; + in -= len; + bits -= len << 3; + hold &= (1U << bits) - 1; + + /* update state and return */ + strm->next_in = in + OFF; + strm->next_out = out + OFF; + strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last)); + strm->avail_out = (unsigned)(out < end ? + 257 + (end - out) : 257 - (out - end)); + state->hold = hold; + state->bits = bits; + return; +} + +/* + inflate_fast() speedups that turned out slower (on a PowerPC G3 750CXe): + - Using bit fields for code structure + - Different op definition to avoid & for extra bits (do & for table bits) + - Three separate decoding do-loops for direct, window, and wnext == 0 + - Special case for distance > 1 copies to do overlapped load and store copy + - Explicit branch predictions (based on measured branch probabilities) + - Deferring match copy and interspersed it with decoding subsequent codes + - Swapping literal/length else + - Swapping window/direct else + - Larger unrolled copy loops (three is about right) + - Moving len -= 3 statement into middle of loop + */ + +#endif /* !ASMINF */ diff --git a/Minecraft.Client/Common/zlib/inffast.h b/Minecraft.Client/Common/zlib/inffast.h new file mode 100644 index 00000000..e5c1aa4c --- /dev/null +++ b/Minecraft.Client/Common/zlib/inffast.h @@ -0,0 +1,11 @@ +/* inffast.h -- header to use inffast.c + * Copyright (C) 1995-2003, 2010 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +void ZLIB_INTERNAL inflate_fast OF((z_streamp strm, unsigned start)); diff --git a/Minecraft.Client/Common/zlib/inffixed.h b/Minecraft.Client/Common/zlib/inffixed.h new file mode 100644 index 00000000..d6283277 --- /dev/null +++ b/Minecraft.Client/Common/zlib/inffixed.h @@ -0,0 +1,94 @@ + /* inffixed.h -- table for decoding fixed codes + * Generated automatically by makefixed(). + */ + + /* WARNING: this file should *not* be used by applications. + It is part of the implementation of this library and is + subject to change. Applications should only use zlib.h. + */ + + static const code lenfix[512] = { + {96,7,0},{0,8,80},{0,8,16},{20,8,115},{18,7,31},{0,8,112},{0,8,48}, + {0,9,192},{16,7,10},{0,8,96},{0,8,32},{0,9,160},{0,8,0},{0,8,128}, + {0,8,64},{0,9,224},{16,7,6},{0,8,88},{0,8,24},{0,9,144},{19,7,59}, + {0,8,120},{0,8,56},{0,9,208},{17,7,17},{0,8,104},{0,8,40},{0,9,176}, + {0,8,8},{0,8,136},{0,8,72},{0,9,240},{16,7,4},{0,8,84},{0,8,20}, + {21,8,227},{19,7,43},{0,8,116},{0,8,52},{0,9,200},{17,7,13},{0,8,100}, + {0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232},{16,7,8}, + {0,8,92},{0,8,28},{0,9,152},{20,7,83},{0,8,124},{0,8,60},{0,9,216}, + {18,7,23},{0,8,108},{0,8,44},{0,9,184},{0,8,12},{0,8,140},{0,8,76}, + {0,9,248},{16,7,3},{0,8,82},{0,8,18},{21,8,163},{19,7,35},{0,8,114}, + {0,8,50},{0,9,196},{17,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2}, + {0,8,130},{0,8,66},{0,9,228},{16,7,7},{0,8,90},{0,8,26},{0,9,148}, + {20,7,67},{0,8,122},{0,8,58},{0,9,212},{18,7,19},{0,8,106},{0,8,42}, + {0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244},{16,7,5},{0,8,86}, + {0,8,22},{64,8,0},{19,7,51},{0,8,118},{0,8,54},{0,9,204},{17,7,15}, + {0,8,102},{0,8,38},{0,9,172},{0,8,6},{0,8,134},{0,8,70},{0,9,236}, + {16,7,9},{0,8,94},{0,8,30},{0,9,156},{20,7,99},{0,8,126},{0,8,62}, + {0,9,220},{18,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142}, + {0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{21,8,131},{18,7,31}, + {0,8,113},{0,8,49},{0,9,194},{16,7,10},{0,8,97},{0,8,33},{0,9,162}, + {0,8,1},{0,8,129},{0,8,65},{0,9,226},{16,7,6},{0,8,89},{0,8,25}, + {0,9,146},{19,7,59},{0,8,121},{0,8,57},{0,9,210},{17,7,17},{0,8,105}, + {0,8,41},{0,9,178},{0,8,9},{0,8,137},{0,8,73},{0,9,242},{16,7,4}, + {0,8,85},{0,8,21},{16,8,258},{19,7,43},{0,8,117},{0,8,53},{0,9,202}, + {17,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133},{0,8,69}, + {0,9,234},{16,7,8},{0,8,93},{0,8,29},{0,9,154},{20,7,83},{0,8,125}, + {0,8,61},{0,9,218},{18,7,23},{0,8,109},{0,8,45},{0,9,186},{0,8,13}, + {0,8,141},{0,8,77},{0,9,250},{16,7,3},{0,8,83},{0,8,19},{21,8,195}, + {19,7,35},{0,8,115},{0,8,51},{0,9,198},{17,7,11},{0,8,99},{0,8,35}, + {0,9,166},{0,8,3},{0,8,131},{0,8,67},{0,9,230},{16,7,7},{0,8,91}, + {0,8,27},{0,9,150},{20,7,67},{0,8,123},{0,8,59},{0,9,214},{18,7,19}, + {0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139},{0,8,75},{0,9,246}, + {16,7,5},{0,8,87},{0,8,23},{64,8,0},{19,7,51},{0,8,119},{0,8,55}, + {0,9,206},{17,7,15},{0,8,103},{0,8,39},{0,9,174},{0,8,7},{0,8,135}, + {0,8,71},{0,9,238},{16,7,9},{0,8,95},{0,8,31},{0,9,158},{20,7,99}, + {0,8,127},{0,8,63},{0,9,222},{18,7,27},{0,8,111},{0,8,47},{0,9,190}, + {0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80},{0,8,16}, + {20,8,115},{18,7,31},{0,8,112},{0,8,48},{0,9,193},{16,7,10},{0,8,96}, + {0,8,32},{0,9,161},{0,8,0},{0,8,128},{0,8,64},{0,9,225},{16,7,6}, + {0,8,88},{0,8,24},{0,9,145},{19,7,59},{0,8,120},{0,8,56},{0,9,209}, + {17,7,17},{0,8,104},{0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72}, + {0,9,241},{16,7,4},{0,8,84},{0,8,20},{21,8,227},{19,7,43},{0,8,116}, + {0,8,52},{0,9,201},{17,7,13},{0,8,100},{0,8,36},{0,9,169},{0,8,4}, + {0,8,132},{0,8,68},{0,9,233},{16,7,8},{0,8,92},{0,8,28},{0,9,153}, + {20,7,83},{0,8,124},{0,8,60},{0,9,217},{18,7,23},{0,8,108},{0,8,44}, + {0,9,185},{0,8,12},{0,8,140},{0,8,76},{0,9,249},{16,7,3},{0,8,82}, + {0,8,18},{21,8,163},{19,7,35},{0,8,114},{0,8,50},{0,9,197},{17,7,11}, + {0,8,98},{0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229}, + {16,7,7},{0,8,90},{0,8,26},{0,9,149},{20,7,67},{0,8,122},{0,8,58}, + {0,9,213},{18,7,19},{0,8,106},{0,8,42},{0,9,181},{0,8,10},{0,8,138}, + {0,8,74},{0,9,245},{16,7,5},{0,8,86},{0,8,22},{64,8,0},{19,7,51}, + {0,8,118},{0,8,54},{0,9,205},{17,7,15},{0,8,102},{0,8,38},{0,9,173}, + {0,8,6},{0,8,134},{0,8,70},{0,9,237},{16,7,9},{0,8,94},{0,8,30}, + {0,9,157},{20,7,99},{0,8,126},{0,8,62},{0,9,221},{18,7,27},{0,8,110}, + {0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253},{96,7,0}, + {0,8,81},{0,8,17},{21,8,131},{18,7,31},{0,8,113},{0,8,49},{0,9,195}, + {16,7,10},{0,8,97},{0,8,33},{0,9,163},{0,8,1},{0,8,129},{0,8,65}, + {0,9,227},{16,7,6},{0,8,89},{0,8,25},{0,9,147},{19,7,59},{0,8,121}, + {0,8,57},{0,9,211},{17,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9}, + {0,8,137},{0,8,73},{0,9,243},{16,7,4},{0,8,85},{0,8,21},{16,8,258}, + {19,7,43},{0,8,117},{0,8,53},{0,9,203},{17,7,13},{0,8,101},{0,8,37}, + {0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235},{16,7,8},{0,8,93}, + {0,8,29},{0,9,155},{20,7,83},{0,8,125},{0,8,61},{0,9,219},{18,7,23}, + {0,8,109},{0,8,45},{0,9,187},{0,8,13},{0,8,141},{0,8,77},{0,9,251}, + {16,7,3},{0,8,83},{0,8,19},{21,8,195},{19,7,35},{0,8,115},{0,8,51}, + {0,9,199},{17,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131}, + {0,8,67},{0,9,231},{16,7,7},{0,8,91},{0,8,27},{0,9,151},{20,7,67}, + {0,8,123},{0,8,59},{0,9,215},{18,7,19},{0,8,107},{0,8,43},{0,9,183}, + {0,8,11},{0,8,139},{0,8,75},{0,9,247},{16,7,5},{0,8,87},{0,8,23}, + {64,8,0},{19,7,51},{0,8,119},{0,8,55},{0,9,207},{17,7,15},{0,8,103}, + {0,8,39},{0,9,175},{0,8,7},{0,8,135},{0,8,71},{0,9,239},{16,7,9}, + {0,8,95},{0,8,31},{0,9,159},{20,7,99},{0,8,127},{0,8,63},{0,9,223}, + {18,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143},{0,8,79}, + {0,9,255} + }; + + static const code distfix[32] = { + {16,5,1},{23,5,257},{19,5,17},{27,5,4097},{17,5,5},{25,5,1025}, + {21,5,65},{29,5,16385},{16,5,3},{24,5,513},{20,5,33},{28,5,8193}, + {18,5,9},{26,5,2049},{22,5,129},{64,5,0},{16,5,2},{23,5,385}, + {19,5,25},{27,5,6145},{17,5,7},{25,5,1537},{21,5,97},{29,5,24577}, + {16,5,4},{24,5,769},{20,5,49},{28,5,12289},{18,5,13},{26,5,3073}, + {22,5,193},{64,5,0} + }; diff --git a/Minecraft.Client/Common/zlib/inflate.c b/Minecraft.Client/Common/zlib/inflate.c new file mode 100644 index 00000000..870f89bb --- /dev/null +++ b/Minecraft.Client/Common/zlib/inflate.c @@ -0,0 +1,1512 @@ +/* inflate.c -- zlib decompression + * Copyright (C) 1995-2012 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + * Change history: + * + * 1.2.beta0 24 Nov 2002 + * - First version -- complete rewrite of inflate to simplify code, avoid + * creation of window when not needed, minimize use of window when it is + * needed, make inffast.c even faster, implement gzip decoding, and to + * improve code readability and style over the previous zlib inflate code + * + * 1.2.beta1 25 Nov 2002 + * - Use pointers for available input and output checking in inffast.c + * - Remove input and output counters in inffast.c + * - Change inffast.c entry and loop from avail_in >= 7 to >= 6 + * - Remove unnecessary second byte pull from length extra in inffast.c + * - Unroll direct copy to three copies per loop in inffast.c + * + * 1.2.beta2 4 Dec 2002 + * - Change external routine names to reduce potential conflicts + * - Correct filename to inffixed.h for fixed tables in inflate.c + * - Make hbuf[] unsigned char to match parameter type in inflate.c + * - Change strm->next_out[-state->offset] to *(strm->next_out - state->offset) + * to avoid negation problem on Alphas (64 bit) in inflate.c + * + * 1.2.beta3 22 Dec 2002 + * - Add comments on state->bits assertion in inffast.c + * - Add comments on op field in inftrees.h + * - Fix bug in reuse of allocated window after inflateReset() + * - Remove bit fields--back to byte structure for speed + * - Remove distance extra == 0 check in inflate_fast()--only helps for lengths + * - Change post-increments to pre-increments in inflate_fast(), PPC biased? + * - Add compile time option, POSTINC, to use post-increments instead (Intel?) + * - Make MATCH copy in inflate() much faster for when inflate_fast() not used + * - Use local copies of stream next and avail values, as well as local bit + * buffer and bit count in inflate()--for speed when inflate_fast() not used + * + * 1.2.beta4 1 Jan 2003 + * - Split ptr - 257 statements in inflate_table() to avoid compiler warnings + * - Move a comment on output buffer sizes from inffast.c to inflate.c + * - Add comments in inffast.c to introduce the inflate_fast() routine + * - Rearrange window copies in inflate_fast() for speed and simplification + * - Unroll last copy for window match in inflate_fast() + * - Use local copies of window variables in inflate_fast() for speed + * - Pull out common wnext == 0 case for speed in inflate_fast() + * - Make op and len in inflate_fast() unsigned for consistency + * - Add FAR to lcode and dcode declarations in inflate_fast() + * - Simplified bad distance check in inflate_fast() + * - Added inflateBackInit(), inflateBack(), and inflateBackEnd() in new + * source file infback.c to provide a call-back interface to inflate for + * programs like gzip and unzip -- uses window as output buffer to avoid + * window copying + * + * 1.2.beta5 1 Jan 2003 + * - Improved inflateBack() interface to allow the caller to provide initial + * input in strm. + * - Fixed stored blocks bug in inflateBack() + * + * 1.2.beta6 4 Jan 2003 + * - Added comments in inffast.c on effectiveness of POSTINC + * - Typecasting all around to reduce compiler warnings + * - Changed loops from while (1) or do {} while (1) to for (;;), again to + * make compilers happy + * - Changed type of window in inflateBackInit() to unsigned char * + * + * 1.2.beta7 27 Jan 2003 + * - Changed many types to unsigned or unsigned short to avoid warnings + * - Added inflateCopy() function + * + * 1.2.0 9 Mar 2003 + * - Changed inflateBack() interface to provide separate opaque descriptors + * for the in() and out() functions + * - Changed inflateBack() argument and in_func typedef to swap the length + * and buffer address return values for the input function + * - Check next_in and next_out for Z_NULL on entry to inflate() + * + * The history for versions after 1.2.0 are in ChangeLog in zlib distribution. + */ + +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" + +#ifdef MAKEFIXED +# ifndef BUILDFIXED +# define BUILDFIXED +# endif +#endif + +/* function prototypes */ +local void fixedtables OF((struct inflate_state FAR *state)); +local int updatewindow OF((z_streamp strm, const unsigned char FAR *end, + unsigned copy)); +#ifdef BUILDFIXED + void makefixed OF((void)); +#endif +local unsigned syncsearch OF((unsigned FAR *have, const unsigned char FAR *buf, + unsigned len)); + +int ZEXPORT inflateResetKeep(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + strm->total_in = strm->total_out = state->total = 0; + strm->msg = Z_NULL; + if (state->wrap) /* to support ill-conceived Java test suite */ + strm->adler = state->wrap & 1; + state->mode = HEAD; + state->last = 0; + state->havedict = 0; + state->dmax = 32768U; + state->head = Z_NULL; + state->hold = 0; + state->bits = 0; + state->lencode = state->distcode = state->next = state->codes; + state->sane = 1; + state->back = -1; + Tracev((stderr, "inflate: reset\n")); + return Z_OK; +} + +int ZEXPORT inflateReset(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + state->wsize = 0; + state->whave = 0; + state->wnext = 0; + return inflateResetKeep(strm); +} + +int ZEXPORT inflateReset2(strm, windowBits) +z_streamp strm; +int windowBits; +{ + int wrap; + struct inflate_state FAR *state; + + /* get the state */ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + + /* extract wrap request from windowBits parameter */ + if (windowBits < 0) { + wrap = 0; + windowBits = -windowBits; + } + else { + wrap = (windowBits >> 4) + 1; +#ifdef GUNZIP + if (windowBits < 48) + windowBits &= 15; +#endif + } + + /* set number of window bits, free window if different */ + if (windowBits && (windowBits < 8 || windowBits > 15)) + return Z_STREAM_ERROR; + if (state->window != Z_NULL && state->wbits != (unsigned)windowBits) { + ZFREE(strm, state->window); + state->window = Z_NULL; + } + + /* update state and reset the rest of it */ + state->wrap = wrap; + state->wbits = (unsigned)windowBits; + return inflateReset(strm); +} + +int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size) +z_streamp strm; +int windowBits; +const char *version; +int stream_size; +{ + int ret; + struct inflate_state FAR *state; + + if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || + stream_size != (int)(sizeof(z_stream))) + return Z_VERSION_ERROR; + if (strm == Z_NULL) return Z_STREAM_ERROR; + strm->msg = Z_NULL; /* in case we return an error */ + if (strm->zalloc == (alloc_func)0) { +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zalloc = zcalloc; + strm->opaque = (voidpf)0; +#endif + } + if (strm->zfree == (free_func)0) +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zfree = zcfree; +#endif + state = (struct inflate_state FAR *) + ZALLOC(strm, 1, sizeof(struct inflate_state)); + if (state == Z_NULL) return Z_MEM_ERROR; + Tracev((stderr, "inflate: allocated\n")); + strm->state = (struct internal_state FAR *)state; + state->window = Z_NULL; + ret = inflateReset2(strm, windowBits); + if (ret != Z_OK) { + ZFREE(strm, state); + strm->state = Z_NULL; + } + return ret; +} + +int ZEXPORT inflateInit_(strm, version, stream_size) +z_streamp strm; +const char *version; +int stream_size; +{ + return inflateInit2_(strm, DEF_WBITS, version, stream_size); +} + +int ZEXPORT inflatePrime(strm, bits, value) +z_streamp strm; +int bits; +int value; +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (bits < 0) { + state->hold = 0; + state->bits = 0; + return Z_OK; + } + if (bits > 16 || state->bits + bits > 32) return Z_STREAM_ERROR; + value &= (1L << bits) - 1; + state->hold += value << state->bits; + state->bits += bits; + return Z_OK; +} + +/* + Return state with length and distance decoding tables and index sizes set to + fixed code decoding. Normally this returns fixed tables from inffixed.h. + If BUILDFIXED is defined, then instead this routine builds the tables the + first time it's called, and returns those tables the first time and + thereafter. This reduces the size of the code by about 2K bytes, in + exchange for a little execution time. However, BUILDFIXED should not be + used for threaded applications, since the rewriting of the tables and virgin + may not be thread-safe. + */ +local void fixedtables(state) +struct inflate_state FAR *state; +{ +#ifdef BUILDFIXED + static int virgin = 1; + static code *lenfix, *distfix; + static code fixed[544]; + + /* build fixed huffman tables if first call (may not be thread safe) */ + if (virgin) { + unsigned sym, bits; + static code *next; + + /* literal/length table */ + sym = 0; + while (sym < 144) state->lens[sym++] = 8; + while (sym < 256) state->lens[sym++] = 9; + while (sym < 280) state->lens[sym++] = 7; + while (sym < 288) state->lens[sym++] = 8; + next = fixed; + lenfix = next; + bits = 9; + inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); + + /* distance table */ + sym = 0; + while (sym < 32) state->lens[sym++] = 5; + distfix = next; + bits = 5; + inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); + + /* do this just once */ + virgin = 0; + } +#else /* !BUILDFIXED */ +# include "inffixed.h" +#endif /* BUILDFIXED */ + state->lencode = lenfix; + state->lenbits = 9; + state->distcode = distfix; + state->distbits = 5; +} + +#ifdef MAKEFIXED +#include + +/* + Write out the inffixed.h that is #include'd above. Defining MAKEFIXED also + defines BUILDFIXED, so the tables are built on the fly. makefixed() writes + those tables to stdout, which would be piped to inffixed.h. A small program + can simply call makefixed to do this: + + void makefixed(void); + + int main(void) + { + makefixed(); + return 0; + } + + Then that can be linked with zlib built with MAKEFIXED defined and run: + + a.out > inffixed.h + */ +void makefixed() +{ + unsigned low, size; + struct inflate_state state; + + fixedtables(&state); + puts(" /* inffixed.h -- table for decoding fixed codes"); + puts(" * Generated automatically by makefixed()."); + puts(" */"); + puts(""); + puts(" /* WARNING: this file should *not* be used by applications."); + puts(" It is part of the implementation of this library and is"); + puts(" subject to change. Applications should only use zlib.h."); + puts(" */"); + puts(""); + size = 1U << 9; + printf(" static const code lenfix[%u] = {", size); + low = 0; + for (;;) { + if ((low % 7) == 0) printf("\n "); + printf("{%u,%u,%d}", (low & 127) == 99 ? 64 : state.lencode[low].op, + state.lencode[low].bits, state.lencode[low].val); + if (++low == size) break; + putchar(','); + } + puts("\n };"); + size = 1U << 5; + printf("\n static const code distfix[%u] = {", size); + low = 0; + for (;;) { + if ((low % 6) == 0) printf("\n "); + printf("{%u,%u,%d}", state.distcode[low].op, state.distcode[low].bits, + state.distcode[low].val); + if (++low == size) break; + putchar(','); + } + puts("\n };"); +} +#endif /* MAKEFIXED */ + +/* + Update the window with the last wsize (normally 32K) bytes written before + returning. If window does not exist yet, create it. This is only called + when a window is already in use, or when output has been written during this + inflate call, but the end of the deflate stream has not been reached yet. + It is also called to create a window for dictionary data when a dictionary + is loaded. + + Providing output buffers larger than 32K to inflate() should provide a speed + advantage, since only the last 32K of output is copied to the sliding window + upon return from inflate(), and since all distances after the first 32K of + output will fall in the output data, making match copies simpler and faster. + The advantage may be dependent on the size of the processor's data caches. + */ +local int updatewindow(strm, end, copy) +z_streamp strm; +const Bytef *end; +unsigned copy; +{ + struct inflate_state FAR *state; + unsigned dist; + + state = (struct inflate_state FAR *)strm->state; + + /* if it hasn't been done already, allocate space for the window */ + if (state->window == Z_NULL) { + state->window = (unsigned char FAR *) + ZALLOC(strm, 1U << state->wbits, + sizeof(unsigned char)); + if (state->window == Z_NULL) return 1; + } + + /* if window not in use yet, initialize */ + if (state->wsize == 0) { + state->wsize = 1U << state->wbits; + state->wnext = 0; + state->whave = 0; + } + + /* copy state->wsize or less output bytes into the circular window */ + if (copy >= state->wsize) { + zmemcpy(state->window, end - state->wsize, state->wsize); + state->wnext = 0; + state->whave = state->wsize; + } + else { + dist = state->wsize - state->wnext; + if (dist > copy) dist = copy; + zmemcpy(state->window + state->wnext, end - copy, dist); + copy -= dist; + if (copy) { + zmemcpy(state->window, end - copy, copy); + state->wnext = copy; + state->whave = state->wsize; + } + else { + state->wnext += dist; + if (state->wnext == state->wsize) state->wnext = 0; + if (state->whave < state->wsize) state->whave += dist; + } + } + return 0; +} + +/* Macros for inflate(): */ + +/* check function to use adler32() for zlib or crc32() for gzip */ +#ifdef GUNZIP +# define UPDATE(check, buf, len) \ + (state->flags ? crc32(check, buf, len) : adler32(check, buf, len)) +#else +# define UPDATE(check, buf, len) adler32(check, buf, len) +#endif + +/* check macros for header crc */ +#ifdef GUNZIP +# define CRC2(check, word) \ + do { \ + hbuf[0] = (unsigned char)(word); \ + hbuf[1] = (unsigned char)((word) >> 8); \ + check = crc32(check, hbuf, 2); \ + } while (0) + +# define CRC4(check, word) \ + do { \ + hbuf[0] = (unsigned char)(word); \ + hbuf[1] = (unsigned char)((word) >> 8); \ + hbuf[2] = (unsigned char)((word) >> 16); \ + hbuf[3] = (unsigned char)((word) >> 24); \ + check = crc32(check, hbuf, 4); \ + } while (0) +#endif + +/* Load registers with state in inflate() for speed */ +#define LOAD() \ + do { \ + put = strm->next_out; \ + left = strm->avail_out; \ + next = strm->next_in; \ + have = strm->avail_in; \ + hold = state->hold; \ + bits = state->bits; \ + } while (0) + +/* Restore state from registers in inflate() */ +#define RESTORE() \ + do { \ + strm->next_out = put; \ + strm->avail_out = left; \ + strm->next_in = next; \ + strm->avail_in = have; \ + state->hold = hold; \ + state->bits = bits; \ + } while (0) + +/* Clear the input bit accumulator */ +#define INITBITS() \ + do { \ + hold = 0; \ + bits = 0; \ + } while (0) + +/* Get a byte of input into the bit accumulator, or return from inflate() + if there is no input available. */ +#define PULLBYTE() \ + do { \ + if (have == 0) goto inf_leave; \ + have--; \ + hold += (unsigned long)(*next++) << bits; \ + bits += 8; \ + } while (0) + +/* Assure that there are at least n bits in the bit accumulator. If there is + not enough available input to do that, then return from inflate(). */ +#define NEEDBITS(n) \ + do { \ + while (bits < (unsigned)(n)) \ + PULLBYTE(); \ + } while (0) + +/* Return the low n bits of the bit accumulator (n < 16) */ +#define BITS(n) \ + ((unsigned)hold & ((1U << (n)) - 1)) + +/* Remove n bits from the bit accumulator */ +#define DROPBITS(n) \ + do { \ + hold >>= (n); \ + bits -= (unsigned)(n); \ + } while (0) + +/* Remove zero to seven bits as needed to go to a byte boundary */ +#define BYTEBITS() \ + do { \ + hold >>= bits & 7; \ + bits -= bits & 7; \ + } while (0) + +/* + inflate() uses a state machine to process as much input data and generate as + much output data as possible before returning. The state machine is + structured roughly as follows: + + for (;;) switch (state) { + ... + case STATEn: + if (not enough input data or output space to make progress) + return; + ... make progress ... + state = STATEm; + break; + ... + } + + so when inflate() is called again, the same case is attempted again, and + if the appropriate resources are provided, the machine proceeds to the + next state. The NEEDBITS() macro is usually the way the state evaluates + whether it can proceed or should return. NEEDBITS() does the return if + the requested bits are not available. The typical use of the BITS macros + is: + + NEEDBITS(n); + ... do something with BITS(n) ... + DROPBITS(n); + + where NEEDBITS(n) either returns from inflate() if there isn't enough + input left to load n bits into the accumulator, or it continues. BITS(n) + gives the low n bits in the accumulator. When done, DROPBITS(n) drops + the low n bits off the accumulator. INITBITS() clears the accumulator + and sets the number of available bits to zero. BYTEBITS() discards just + enough bits to put the accumulator on a byte boundary. After BYTEBITS() + and a NEEDBITS(8), then BITS(8) would return the next byte in the stream. + + NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return + if there is no input available. The decoding of variable length codes uses + PULLBYTE() directly in order to pull just enough bytes to decode the next + code, and no more. + + Some states loop until they get enough input, making sure that enough + state information is maintained to continue the loop where it left off + if NEEDBITS() returns in the loop. For example, want, need, and keep + would all have to actually be part of the saved state in case NEEDBITS() + returns: + + case STATEw: + while (want < need) { + NEEDBITS(n); + keep[want++] = BITS(n); + DROPBITS(n); + } + state = STATEx; + case STATEx: + + As shown above, if the next state is also the next case, then the break + is omitted. + + A state may also return if there is not enough output space available to + complete that state. Those states are copying stored data, writing a + literal byte, and copying a matching string. + + When returning, a "goto inf_leave" is used to update the total counters, + update the check value, and determine whether any progress has been made + during that inflate() call in order to return the proper return code. + Progress is defined as a change in either strm->avail_in or strm->avail_out. + When there is a window, goto inf_leave will update the window with the last + output written. If a goto inf_leave occurs in the middle of decompression + and there is no window currently, goto inf_leave will create one and copy + output to the window for the next call of inflate(). + + In this implementation, the flush parameter of inflate() only affects the + return code (per zlib.h). inflate() always writes as much as possible to + strm->next_out, given the space available and the provided input--the effect + documented in zlib.h of Z_SYNC_FLUSH. Furthermore, inflate() always defers + the allocation of and copying into a sliding window until necessary, which + provides the effect documented in zlib.h for Z_FINISH when the entire input + stream available. So the only thing the flush parameter actually does is: + when flush is set to Z_FINISH, inflate() cannot return Z_OK. Instead it + will return Z_BUF_ERROR if it has not reached the end of the stream. + */ + +int ZEXPORT inflate(strm, flush) +z_streamp strm; +int flush; +{ + struct inflate_state FAR *state; + z_const unsigned char FAR *next; /* next input */ + unsigned char FAR *put; /* next output */ + unsigned have, left; /* available input and output */ + unsigned long hold; /* bit buffer */ + unsigned bits; /* bits in bit buffer */ + unsigned in, out; /* save starting available input and output */ + unsigned copy; /* number of stored or match bytes to copy */ + unsigned char FAR *from; /* where to copy match bytes from */ + code here; /* current decoding table entry */ + code last; /* parent table entry */ + unsigned len; /* length to copy for repeats, bits to drop */ + int ret; /* return code */ +#ifdef GUNZIP + unsigned char hbuf[4]; /* buffer for gzip header crc calculation */ +#endif + static const unsigned short order[19] = /* permutation of code lengths */ + {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; + + if (strm == Z_NULL || strm->state == Z_NULL || strm->next_out == Z_NULL || + (strm->next_in == Z_NULL && strm->avail_in != 0)) + return Z_STREAM_ERROR; + + state = (struct inflate_state FAR *)strm->state; + if (state->mode == TYPE) state->mode = TYPEDO; /* skip check */ + LOAD(); + in = have; + out = left; + ret = Z_OK; + for (;;) + switch (state->mode) { + case HEAD: + if (state->wrap == 0) { + state->mode = TYPEDO; + break; + } + NEEDBITS(16); +#ifdef GUNZIP + if ((state->wrap & 2) && hold == 0x8b1f) { /* gzip header */ + state->check = crc32(0L, Z_NULL, 0); + CRC2(state->check, hold); + INITBITS(); + state->mode = FLAGS; + break; + } + state->flags = 0; /* expect zlib header */ + if (state->head != Z_NULL) + state->head->done = -1; + if (!(state->wrap & 1) || /* check if zlib header allowed */ +#else + if ( +#endif + ((BITS(8) << 8) + (hold >> 8)) % 31) { + strm->msg = (char *)"incorrect header check"; + state->mode = BAD; + break; + } + if (BITS(4) != Z_DEFLATED) { + strm->msg = (char *)"unknown compression method"; + state->mode = BAD; + break; + } + DROPBITS(4); + len = BITS(4) + 8; + if (state->wbits == 0) + state->wbits = len; + else if (len > state->wbits) { + strm->msg = (char *)"invalid window size"; + state->mode = BAD; + break; + } + state->dmax = 1U << len; + Tracev((stderr, "inflate: zlib header ok\n")); + strm->adler = state->check = adler32(0L, Z_NULL, 0); + state->mode = hold & 0x200 ? DICTID : TYPE; + INITBITS(); + break; +#ifdef GUNZIP + case FLAGS: + NEEDBITS(16); + state->flags = (int)(hold); + if ((state->flags & 0xff) != Z_DEFLATED) { + strm->msg = (char *)"unknown compression method"; + state->mode = BAD; + break; + } + if (state->flags & 0xe000) { + strm->msg = (char *)"unknown header flags set"; + state->mode = BAD; + break; + } + if (state->head != Z_NULL) + state->head->text = (int)((hold >> 8) & 1); + if (state->flags & 0x0200) CRC2(state->check, hold); + INITBITS(); + state->mode = TIME; + case TIME: + NEEDBITS(32); + if (state->head != Z_NULL) + state->head->time = hold; + if (state->flags & 0x0200) CRC4(state->check, hold); + INITBITS(); + state->mode = OS; + case OS: + NEEDBITS(16); + if (state->head != Z_NULL) { + state->head->xflags = (int)(hold & 0xff); + state->head->os = (int)(hold >> 8); + } + if (state->flags & 0x0200) CRC2(state->check, hold); + INITBITS(); + state->mode = EXLEN; + case EXLEN: + if (state->flags & 0x0400) { + NEEDBITS(16); + state->length = (unsigned)(hold); + if (state->head != Z_NULL) + state->head->extra_len = (unsigned)hold; + if (state->flags & 0x0200) CRC2(state->check, hold); + INITBITS(); + } + else if (state->head != Z_NULL) + state->head->extra = Z_NULL; + state->mode = EXTRA; + case EXTRA: + if (state->flags & 0x0400) { + copy = state->length; + if (copy > have) copy = have; + if (copy) { + if (state->head != Z_NULL && + state->head->extra != Z_NULL) { + len = state->head->extra_len - state->length; + zmemcpy(state->head->extra + len, next, + len + copy > state->head->extra_max ? + state->head->extra_max - len : copy); + } + if (state->flags & 0x0200) + state->check = crc32(state->check, next, copy); + have -= copy; + next += copy; + state->length -= copy; + } + if (state->length) goto inf_leave; + } + state->length = 0; + state->mode = NAME; + case NAME: + if (state->flags & 0x0800) { + if (have == 0) goto inf_leave; + copy = 0; + do { + len = (unsigned)(next[copy++]); + if (state->head != Z_NULL && + state->head->name != Z_NULL && + state->length < state->head->name_max) + state->head->name[state->length++] = len; + } while (len && copy < have); + if (state->flags & 0x0200) + state->check = crc32(state->check, next, copy); + have -= copy; + next += copy; + if (len) goto inf_leave; + } + else if (state->head != Z_NULL) + state->head->name = Z_NULL; + state->length = 0; + state->mode = COMMENT; + case COMMENT: + if (state->flags & 0x1000) { + if (have == 0) goto inf_leave; + copy = 0; + do { + len = (unsigned)(next[copy++]); + if (state->head != Z_NULL && + state->head->comment != Z_NULL && + state->length < state->head->comm_max) + state->head->comment[state->length++] = len; + } while (len && copy < have); + if (state->flags & 0x0200) + state->check = crc32(state->check, next, copy); + have -= copy; + next += copy; + if (len) goto inf_leave; + } + else if (state->head != Z_NULL) + state->head->comment = Z_NULL; + state->mode = HCRC; + case HCRC: + if (state->flags & 0x0200) { + NEEDBITS(16); + if (hold != (state->check & 0xffff)) { + strm->msg = (char *)"header crc mismatch"; + state->mode = BAD; + break; + } + INITBITS(); + } + if (state->head != Z_NULL) { + state->head->hcrc = (int)((state->flags >> 9) & 1); + state->head->done = 1; + } + strm->adler = state->check = crc32(0L, Z_NULL, 0); + state->mode = TYPE; + break; +#endif + case DICTID: + NEEDBITS(32); + strm->adler = state->check = ZSWAP32(hold); + INITBITS(); + state->mode = DICT; + case DICT: + if (state->havedict == 0) { + RESTORE(); + return Z_NEED_DICT; + } + strm->adler = state->check = adler32(0L, Z_NULL, 0); + state->mode = TYPE; + case TYPE: + if (flush == Z_BLOCK || flush == Z_TREES) goto inf_leave; + case TYPEDO: + if (state->last) { + BYTEBITS(); + state->mode = CHECK; + break; + } + NEEDBITS(3); + state->last = BITS(1); + DROPBITS(1); + switch (BITS(2)) { + case 0: /* stored block */ + Tracev((stderr, "inflate: stored block%s\n", + state->last ? " (last)" : "")); + state->mode = STORED; + break; + case 1: /* fixed block */ + fixedtables(state); + Tracev((stderr, "inflate: fixed codes block%s\n", + state->last ? " (last)" : "")); + state->mode = LEN_; /* decode codes */ + if (flush == Z_TREES) { + DROPBITS(2); + goto inf_leave; + } + break; + case 2: /* dynamic block */ + Tracev((stderr, "inflate: dynamic codes block%s\n", + state->last ? " (last)" : "")); + state->mode = TABLE; + break; + case 3: + strm->msg = (char *)"invalid block type"; + state->mode = BAD; + } + DROPBITS(2); + break; + case STORED: + BYTEBITS(); /* go to byte boundary */ + NEEDBITS(32); + if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { + strm->msg = (char *)"invalid stored block lengths"; + state->mode = BAD; + break; + } + state->length = (unsigned)hold & 0xffff; + Tracev((stderr, "inflate: stored length %u\n", + state->length)); + INITBITS(); + state->mode = COPY_; + if (flush == Z_TREES) goto inf_leave; + case COPY_: + state->mode = COPY; + case COPY: + copy = state->length; + if (copy) { + if (copy > have) copy = have; + if (copy > left) copy = left; + if (copy == 0) goto inf_leave; + zmemcpy(put, next, copy); + have -= copy; + next += copy; + left -= copy; + put += copy; + state->length -= copy; + break; + } + Tracev((stderr, "inflate: stored end\n")); + state->mode = TYPE; + break; + case TABLE: + NEEDBITS(14); + state->nlen = BITS(5) + 257; + DROPBITS(5); + state->ndist = BITS(5) + 1; + DROPBITS(5); + state->ncode = BITS(4) + 4; + DROPBITS(4); +#ifndef PKZIP_BUG_WORKAROUND + if (state->nlen > 286 || state->ndist > 30) { + strm->msg = (char *)"too many length or distance symbols"; + state->mode = BAD; + break; + } +#endif + Tracev((stderr, "inflate: table sizes ok\n")); + state->have = 0; + state->mode = LENLENS; + case LENLENS: + while (state->have < state->ncode) { + NEEDBITS(3); + state->lens[order[state->have++]] = (unsigned short)BITS(3); + DROPBITS(3); + } + while (state->have < 19) + state->lens[order[state->have++]] = 0; + state->next = state->codes; + state->lencode = (const code FAR *)(state->next); + state->lenbits = 7; + ret = inflate_table(CODES, state->lens, 19, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid code lengths set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: code lengths ok\n")); + state->have = 0; + state->mode = CODELENS; + case CODELENS: + while (state->have < state->nlen + state->ndist) { + for (;;) { + here = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if (here.val < 16) { + DROPBITS(here.bits); + state->lens[state->have++] = here.val; + } + else { + if (here.val == 16) { + NEEDBITS(here.bits + 2); + DROPBITS(here.bits); + if (state->have == 0) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + len = state->lens[state->have - 1]; + copy = 3 + BITS(2); + DROPBITS(2); + } + else if (here.val == 17) { + NEEDBITS(here.bits + 3); + DROPBITS(here.bits); + len = 0; + copy = 3 + BITS(3); + DROPBITS(3); + } + else { + NEEDBITS(here.bits + 7); + DROPBITS(here.bits); + len = 0; + copy = 11 + BITS(7); + DROPBITS(7); + } + if (state->have + copy > state->nlen + state->ndist) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + while (copy--) + state->lens[state->have++] = (unsigned short)len; + } + } + + /* handle error breaks in while */ + if (state->mode == BAD) break; + + /* check for end-of-block code (better have one) */ + if (state->lens[256] == 0) { + strm->msg = (char *)"invalid code -- missing end-of-block"; + state->mode = BAD; + break; + } + + /* build code tables -- note: do not change the lenbits or distbits + values here (9 and 6) without reading the comments in inftrees.h + concerning the ENOUGH constants, which depend on those values */ + state->next = state->codes; + state->lencode = (const code FAR *)(state->next); + state->lenbits = 9; + ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid literal/lengths set"; + state->mode = BAD; + break; + } + state->distcode = (const code FAR *)(state->next); + state->distbits = 6; + ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, + &(state->next), &(state->distbits), state->work); + if (ret) { + strm->msg = (char *)"invalid distances set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: codes ok\n")); + state->mode = LEN_; + if (flush == Z_TREES) goto inf_leave; + case LEN_: + state->mode = LEN; + case LEN: + if (have >= 6 && left >= 258) { + RESTORE(); + inflate_fast(strm, out); + LOAD(); + if (state->mode == TYPE) + state->back = -1; + break; + } + state->back = 0; + for (;;) { + here = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if (here.op && (here.op & 0xf0) == 0) { + last = here; + for (;;) { + here = state->lencode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + here.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + state->back += last.bits; + } + DROPBITS(here.bits); + state->back += here.bits; + state->length = (unsigned)here.val; + if ((int)(here.op) == 0) { + Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", here.val)); + state->mode = LIT; + break; + } + if (here.op & 32) { + Tracevv((stderr, "inflate: end of block\n")); + state->back = -1; + state->mode = TYPE; + break; + } + if (here.op & 64) { + strm->msg = (char *)"invalid literal/length code"; + state->mode = BAD; + break; + } + state->extra = (unsigned)(here.op) & 15; + state->mode = LENEXT; + case LENEXT: + if (state->extra) { + NEEDBITS(state->extra); + state->length += BITS(state->extra); + DROPBITS(state->extra); + state->back += state->extra; + } + Tracevv((stderr, "inflate: length %u\n", state->length)); + state->was = state->length; + state->mode = DIST; + case DIST: + for (;;) { + here = state->distcode[BITS(state->distbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if ((here.op & 0xf0) == 0) { + last = here; + for (;;) { + here = state->distcode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + here.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + state->back += last.bits; + } + DROPBITS(here.bits); + state->back += here.bits; + if (here.op & 64) { + strm->msg = (char *)"invalid distance code"; + state->mode = BAD; + break; + } + state->offset = (unsigned)here.val; + state->extra = (unsigned)(here.op) & 15; + state->mode = DISTEXT; + case DISTEXT: + if (state->extra) { + NEEDBITS(state->extra); + state->offset += BITS(state->extra); + DROPBITS(state->extra); + state->back += state->extra; + } +#ifdef INFLATE_STRICT + if (state->offset > state->dmax) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#endif + Tracevv((stderr, "inflate: distance %u\n", state->offset)); + state->mode = MATCH; + case MATCH: + if (left == 0) goto inf_leave; + copy = out - left; + if (state->offset > copy) { /* copy from window */ + copy = state->offset - copy; + if (copy > state->whave) { + if (state->sane) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + Trace((stderr, "inflate.c too far\n")); + copy -= state->whave; + if (copy > state->length) copy = state->length; + if (copy > left) copy = left; + left -= copy; + state->length -= copy; + do { + *put++ = 0; + } while (--copy); + if (state->length == 0) state->mode = LEN; + break; +#endif + } + if (copy > state->wnext) { + copy -= state->wnext; + from = state->window + (state->wsize - copy); + } + else + from = state->window + (state->wnext - copy); + if (copy > state->length) copy = state->length; + } + else { /* copy from output */ + from = put - state->offset; + copy = state->length; + } + if (copy > left) copy = left; + left -= copy; + state->length -= copy; + do { + *put++ = *from++; + } while (--copy); + if (state->length == 0) state->mode = LEN; + break; + case LIT: + if (left == 0) goto inf_leave; + *put++ = (unsigned char)(state->length); + left--; + state->mode = LEN; + break; + case CHECK: + if (state->wrap) { + NEEDBITS(32); + out -= left; + strm->total_out += out; + state->total += out; + if (out) + strm->adler = state->check = + UPDATE(state->check, put - out, out); + out = left; + if (( +#ifdef GUNZIP + state->flags ? hold : +#endif + ZSWAP32(hold)) != state->check) { + strm->msg = (char *)"incorrect data check"; + state->mode = BAD; + break; + } + INITBITS(); + Tracev((stderr, "inflate: check matches trailer\n")); + } +#ifdef GUNZIP + state->mode = LENGTH; + case LENGTH: + if (state->wrap && state->flags) { + NEEDBITS(32); + if (hold != (state->total & 0xffffffffUL)) { + strm->msg = (char *)"incorrect length check"; + state->mode = BAD; + break; + } + INITBITS(); + Tracev((stderr, "inflate: length matches trailer\n")); + } +#endif + state->mode = DONE; + case DONE: + ret = Z_STREAM_END; + goto inf_leave; + case BAD: + ret = Z_DATA_ERROR; + goto inf_leave; + case MEM: + return Z_MEM_ERROR; + case SYNC: + default: + return Z_STREAM_ERROR; + } + + /* + Return from inflate(), updating the total counts and the check value. + If there was no progress during the inflate() call, return a buffer + error. Call updatewindow() to create and/or update the window state. + Note: a memory error from inflate() is non-recoverable. + */ + inf_leave: + RESTORE(); + if (state->wsize || (out != strm->avail_out && state->mode < BAD && + (state->mode < CHECK || flush != Z_FINISH))) + if (updatewindow(strm, strm->next_out, out - strm->avail_out)) { + state->mode = MEM; + return Z_MEM_ERROR; + } + in -= strm->avail_in; + out -= strm->avail_out; + strm->total_in += in; + strm->total_out += out; + state->total += out; + if (state->wrap && out) + strm->adler = state->check = + UPDATE(state->check, strm->next_out - out, out); + strm->data_type = state->bits + (state->last ? 64 : 0) + + (state->mode == TYPE ? 128 : 0) + + (state->mode == LEN_ || state->mode == COPY_ ? 256 : 0); + if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK) + ret = Z_BUF_ERROR; + return ret; +} + +int ZEXPORT inflateEnd(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) + return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (state->window != Z_NULL) ZFREE(strm, state->window); + ZFREE(strm, strm->state); + strm->state = Z_NULL; + Tracev((stderr, "inflate: end\n")); + return Z_OK; +} + +int ZEXPORT inflateGetDictionary(strm, dictionary, dictLength) +z_streamp strm; +Bytef *dictionary; +uInt *dictLength; +{ + struct inflate_state FAR *state; + + /* check state */ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + + /* copy dictionary */ + if (state->whave && dictionary != Z_NULL) { + zmemcpy(dictionary, state->window + state->wnext, + state->whave - state->wnext); + zmemcpy(dictionary + state->whave - state->wnext, + state->window, state->wnext); + } + if (dictLength != Z_NULL) + *dictLength = state->whave; + return Z_OK; +} + +int ZEXPORT inflateSetDictionary(strm, dictionary, dictLength) +z_streamp strm; +const Bytef *dictionary; +uInt dictLength; +{ + struct inflate_state FAR *state; + unsigned long dictid; + int ret; + + /* check state */ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (state->wrap != 0 && state->mode != DICT) + return Z_STREAM_ERROR; + + /* check for correct dictionary identifier */ + if (state->mode == DICT) { + dictid = adler32(0L, Z_NULL, 0); + dictid = adler32(dictid, dictionary, dictLength); + if (dictid != state->check) + return Z_DATA_ERROR; + } + + /* copy dictionary to window using updatewindow(), which will amend the + existing dictionary if appropriate */ + ret = updatewindow(strm, dictionary + dictLength, dictLength); + if (ret) { + state->mode = MEM; + return Z_MEM_ERROR; + } + state->havedict = 1; + Tracev((stderr, "inflate: dictionary set\n")); + return Z_OK; +} + +int ZEXPORT inflateGetHeader(strm, head) +z_streamp strm; +gz_headerp head; +{ + struct inflate_state FAR *state; + + /* check state */ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if ((state->wrap & 2) == 0) return Z_STREAM_ERROR; + + /* save header structure */ + state->head = head; + head->done = 0; + return Z_OK; +} + +/* + Search buf[0..len-1] for the pattern: 0, 0, 0xff, 0xff. Return when found + or when out of input. When called, *have is the number of pattern bytes + found in order so far, in 0..3. On return *have is updated to the new + state. If on return *have equals four, then the pattern was found and the + return value is how many bytes were read including the last byte of the + pattern. If *have is less than four, then the pattern has not been found + yet and the return value is len. In the latter case, syncsearch() can be + called again with more data and the *have state. *have is initialized to + zero for the first call. + */ +local unsigned syncsearch(have, buf, len) +unsigned FAR *have; +const unsigned char FAR *buf; +unsigned len; +{ + unsigned got; + unsigned next; + + got = *have; + next = 0; + while (next < len && got < 4) { + if ((int)(buf[next]) == (got < 2 ? 0 : 0xff)) + got++; + else if (buf[next]) + got = 0; + else + got = 4 - got; + next++; + } + *have = got; + return next; +} + +int ZEXPORT inflateSync(strm) +z_streamp strm; +{ + unsigned len; /* number of bytes to look at or looked at */ + unsigned long in, out; /* temporary to save total_in and total_out */ + unsigned char buf[4]; /* to restore bit buffer to byte string */ + struct inflate_state FAR *state; + + /* check parameters */ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR; + + /* if first time, start search in bit buffer */ + if (state->mode != SYNC) { + state->mode = SYNC; + state->hold <<= state->bits & 7; + state->bits -= state->bits & 7; + len = 0; + while (state->bits >= 8) { + buf[len++] = (unsigned char)(state->hold); + state->hold >>= 8; + state->bits -= 8; + } + state->have = 0; + syncsearch(&(state->have), buf, len); + } + + /* search available input */ + len = syncsearch(&(state->have), strm->next_in, strm->avail_in); + strm->avail_in -= len; + strm->next_in += len; + strm->total_in += len; + + /* return no joy or set up to restart inflate() on a new block */ + if (state->have != 4) return Z_DATA_ERROR; + in = strm->total_in; out = strm->total_out; + inflateReset(strm); + strm->total_in = in; strm->total_out = out; + state->mode = TYPE; + return Z_OK; +} + +/* + Returns true if inflate is currently at the end of a block generated by + Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP + implementation to provide an additional safety check. PPP uses + Z_SYNC_FLUSH but removes the length bytes of the resulting empty stored + block. When decompressing, PPP checks that at the end of input packet, + inflate is waiting for these length bytes. + */ +int ZEXPORT inflateSyncPoint(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + return state->mode == STORED && state->bits == 0; +} + +int ZEXPORT inflateCopy(dest, source) +z_streamp dest; +z_streamp source; +{ + struct inflate_state FAR *state; + struct inflate_state FAR *copy; + unsigned char FAR *window; + unsigned wsize; + + /* check input */ + if (dest == Z_NULL || source == Z_NULL || source->state == Z_NULL || + source->zalloc == (alloc_func)0 || source->zfree == (free_func)0) + return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)source->state; + + /* allocate space */ + copy = (struct inflate_state FAR *) + ZALLOC(source, 1, sizeof(struct inflate_state)); + if (copy == Z_NULL) return Z_MEM_ERROR; + window = Z_NULL; + if (state->window != Z_NULL) { + window = (unsigned char FAR *) + ZALLOC(source, 1U << state->wbits, sizeof(unsigned char)); + if (window == Z_NULL) { + ZFREE(source, copy); + return Z_MEM_ERROR; + } + } + + /* copy state */ + zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream)); + zmemcpy((voidpf)copy, (voidpf)state, sizeof(struct inflate_state)); + if (state->lencode >= state->codes && + state->lencode <= state->codes + ENOUGH - 1) { + copy->lencode = copy->codes + (state->lencode - state->codes); + copy->distcode = copy->codes + (state->distcode - state->codes); + } + copy->next = copy->codes + (state->next - state->codes); + if (window != Z_NULL) { + wsize = 1U << state->wbits; + zmemcpy(window, state->window, wsize); + } + copy->window = window; + dest->state = (struct internal_state FAR *)copy; + return Z_OK; +} + +int ZEXPORT inflateUndermine(strm, subvert) +z_streamp strm; +int subvert; +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + state->sane = !subvert; +#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + return Z_OK; +#else + state->sane = 1; + return Z_DATA_ERROR; +#endif +} + +long ZEXPORT inflateMark(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return -1L << 16; + state = (struct inflate_state FAR *)strm->state; + return ((long)(state->back) << 16) + + (state->mode == COPY ? state->length : + (state->mode == MATCH ? state->was - state->length : 0)); +} diff --git a/Minecraft.Client/Common/zlib/inflate.h b/Minecraft.Client/Common/zlib/inflate.h new file mode 100644 index 00000000..95f4986d --- /dev/null +++ b/Minecraft.Client/Common/zlib/inflate.h @@ -0,0 +1,122 @@ +/* inflate.h -- internal inflate state definition + * Copyright (C) 1995-2009 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* define NO_GZIP when compiling if you want to disable gzip header and + trailer decoding by inflate(). NO_GZIP would be used to avoid linking in + the crc code when it is not needed. For shared libraries, gzip decoding + should be left enabled. */ +#ifndef NO_GZIP +# define GUNZIP +#endif + +/* Possible inflate modes between inflate() calls */ +typedef enum { + HEAD, /* i: waiting for magic header */ + FLAGS, /* i: waiting for method and flags (gzip) */ + TIME, /* i: waiting for modification time (gzip) */ + OS, /* i: waiting for extra flags and operating system (gzip) */ + EXLEN, /* i: waiting for extra length (gzip) */ + EXTRA, /* i: waiting for extra bytes (gzip) */ + NAME, /* i: waiting for end of file name (gzip) */ + COMMENT, /* i: waiting for end of comment (gzip) */ + HCRC, /* i: waiting for header crc (gzip) */ + DICTID, /* i: waiting for dictionary check value */ + DICT, /* waiting for inflateSetDictionary() call */ + TYPE, /* i: waiting for type bits, including last-flag bit */ + TYPEDO, /* i: same, but skip check to exit inflate on new block */ + STORED, /* i: waiting for stored size (length and complement) */ + COPY_, /* i/o: same as COPY below, but only first time in */ + COPY, /* i/o: waiting for input or output to copy stored block */ + TABLE, /* i: waiting for dynamic block table lengths */ + LENLENS, /* i: waiting for code length code lengths */ + CODELENS, /* i: waiting for length/lit and distance code lengths */ + LEN_, /* i: same as LEN below, but only first time in */ + LEN, /* i: waiting for length/lit/eob code */ + LENEXT, /* i: waiting for length extra bits */ + DIST, /* i: waiting for distance code */ + DISTEXT, /* i: waiting for distance extra bits */ + MATCH, /* o: waiting for output space to copy string */ + LIT, /* o: waiting for output space to write literal */ + CHECK, /* i: waiting for 32-bit check value */ + LENGTH, /* i: waiting for 32-bit length (gzip) */ + DONE, /* finished check, done -- remain here until reset */ + BAD, /* got a data error -- remain here until reset */ + MEM, /* got an inflate() memory error -- remain here until reset */ + SYNC /* looking for synchronization bytes to restart inflate() */ +} inflate_mode; + +/* + State transitions between above modes - + + (most modes can go to BAD or MEM on error -- not shown for clarity) + + Process header: + HEAD -> (gzip) or (zlib) or (raw) + (gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME -> COMMENT -> + HCRC -> TYPE + (zlib) -> DICTID or TYPE + DICTID -> DICT -> TYPE + (raw) -> TYPEDO + Read deflate blocks: + TYPE -> TYPEDO -> STORED or TABLE or LEN_ or CHECK + STORED -> COPY_ -> COPY -> TYPE + TABLE -> LENLENS -> CODELENS -> LEN_ + LEN_ -> LEN + Read deflate codes in fixed or dynamic block: + LEN -> LENEXT or LIT or TYPE + LENEXT -> DIST -> DISTEXT -> MATCH -> LEN + LIT -> LEN + Process trailer: + CHECK -> LENGTH -> DONE + */ + +/* state maintained between inflate() calls. Approximately 10K bytes. */ +struct inflate_state { + inflate_mode mode; /* current inflate mode */ + int last; /* true if processing last block */ + int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ + int havedict; /* true if dictionary provided */ + int flags; /* gzip header method and flags (0 if zlib) */ + unsigned dmax; /* zlib header max distance (INFLATE_STRICT) */ + unsigned long check; /* protected copy of check value */ + unsigned long total; /* protected copy of output count */ + gz_headerp head; /* where to save gzip header information */ + /* sliding window */ + unsigned wbits; /* log base 2 of requested window size */ + unsigned wsize; /* window size or zero if not using window */ + unsigned whave; /* valid bytes in the window */ + unsigned wnext; /* window write index */ + unsigned char FAR *window; /* allocated sliding window, if needed */ + /* bit accumulator */ + unsigned long hold; /* input bit accumulator */ + unsigned bits; /* number of bits in "in" */ + /* for string and stored block copying */ + unsigned length; /* literal or length of data to copy */ + unsigned offset; /* distance back to copy string from */ + /* for table and code decoding */ + unsigned extra; /* extra bits needed */ + /* fixed and dynamic code tables */ + code const FAR *lencode; /* starting table for length/literal codes */ + code const FAR *distcode; /* starting table for distance codes */ + unsigned lenbits; /* index bits for lencode */ + unsigned distbits; /* index bits for distcode */ + /* dynamic table building */ + unsigned ncode; /* number of code length code lengths */ + unsigned nlen; /* number of length code lengths */ + unsigned ndist; /* number of distance code lengths */ + unsigned have; /* number of code lengths in lens[] */ + code FAR *next; /* next available space in codes[] */ + unsigned short lens[320]; /* temporary storage for code lengths */ + unsigned short work[288]; /* work area for code table building */ + code codes[ENOUGH]; /* space for code tables */ + int sane; /* if false, allow invalid distance too far */ + int back; /* bits back of last unprocessed length/lit */ + unsigned was; /* initial length of match */ +}; diff --git a/Minecraft.Client/Common/zlib/inftrees.c b/Minecraft.Client/Common/zlib/inftrees.c new file mode 100644 index 00000000..44d89cf2 --- /dev/null +++ b/Minecraft.Client/Common/zlib/inftrees.c @@ -0,0 +1,306 @@ +/* inftrees.c -- generate Huffman trees for efficient decoding + * Copyright (C) 1995-2013 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zutil.h" +#include "inftrees.h" + +#define MAXBITS 15 + +const char inflate_copyright[] = + " inflate 1.2.8 Copyright 1995-2013 Mark Adler "; +/* + If you use the zlib library in a product, an acknowledgment is welcome + in the documentation of your product. If for some reason you cannot + include such an acknowledgment, I would appreciate that you keep this + copyright string in the executable of your product. + */ + +/* + Build a set of tables to decode the provided canonical Huffman code. + The code lengths are lens[0..codes-1]. The result starts at *table, + whose indices are 0..2^bits-1. work is a writable array of at least + lens shorts, which is used as a work area. type is the type of code + to be generated, CODES, LENS, or DISTS. On return, zero is success, + -1 is an invalid code, and +1 means that ENOUGH isn't enough. table + on return points to the next available entry's address. bits is the + requested root table index bits, and on return it is the actual root + table index bits. It will differ if the request is greater than the + longest code or if it is less than the shortest code. + */ +int ZLIB_INTERNAL inflate_table(type, lens, codes, table, bits, work) +codetype type; +unsigned short FAR *lens; +unsigned codes; +code FAR * FAR *table; +unsigned FAR *bits; +unsigned short FAR *work; +{ + unsigned len; /* a code's length in bits */ + unsigned sym; /* index of code symbols */ + unsigned min, max; /* minimum and maximum code lengths */ + unsigned root; /* number of index bits for root table */ + unsigned curr; /* number of index bits for current table */ + unsigned drop; /* code bits to drop for sub-table */ + int left; /* number of prefix codes available */ + unsigned used; /* code entries in table used */ + unsigned huff; /* Huffman code */ + unsigned incr; /* for incrementing code, index */ + unsigned fill; /* index for replicating entries */ + unsigned low; /* low bits for current root entry */ + unsigned mask; /* mask for low root bits */ + code here; /* table entry for duplication */ + code FAR *next; /* next available space in table */ + const unsigned short FAR *base; /* base value table to use */ + const unsigned short FAR *extra; /* extra bits table to use */ + int end; /* use base and extra for symbol > end */ + unsigned short count[MAXBITS+1]; /* number of codes of each length */ + unsigned short offs[MAXBITS+1]; /* offsets in table for each length */ + static const unsigned short lbase[31] = { /* Length codes 257..285 base */ + 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, + 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; + static const unsigned short lext[31] = { /* Length codes 257..285 extra */ + 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, + 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78}; + static const unsigned short dbase[32] = { /* Distance codes 0..29 base */ + 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, + 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, + 8193, 12289, 16385, 24577, 0, 0}; + static const unsigned short dext[32] = { /* Distance codes 0..29 extra */ + 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, + 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, + 28, 28, 29, 29, 64, 64}; + + /* + Process a set of code lengths to create a canonical Huffman code. The + code lengths are lens[0..codes-1]. Each length corresponds to the + symbols 0..codes-1. The Huffman code is generated by first sorting the + symbols by length from short to long, and retaining the symbol order + for codes with equal lengths. Then the code starts with all zero bits + for the first code of the shortest length, and the codes are integer + increments for the same length, and zeros are appended as the length + increases. For the deflate format, these bits are stored backwards + from their more natural integer increment ordering, and so when the + decoding tables are built in the large loop below, the integer codes + are incremented backwards. + + This routine assumes, but does not check, that all of the entries in + lens[] are in the range 0..MAXBITS. The caller must assure this. + 1..MAXBITS is interpreted as that code length. zero means that that + symbol does not occur in this code. + + The codes are sorted by computing a count of codes for each length, + creating from that a table of starting indices for each length in the + sorted table, and then entering the symbols in order in the sorted + table. The sorted table is work[], with that space being provided by + the caller. + + The length counts are used for other purposes as well, i.e. finding + the minimum and maximum length codes, determining if there are any + codes at all, checking for a valid set of lengths, and looking ahead + at length counts to determine sub-table sizes when building the + decoding tables. + */ + + /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ + for (len = 0; len <= MAXBITS; len++) + count[len] = 0; + for (sym = 0; sym < codes; sym++) + count[lens[sym]]++; + + /* bound code lengths, force root to be within code lengths */ + root = *bits; + for (max = MAXBITS; max >= 1; max--) + if (count[max] != 0) break; + if (root > max) root = max; + if (max == 0) { /* no symbols to code at all */ + here.op = (unsigned char)64; /* invalid code marker */ + here.bits = (unsigned char)1; + here.val = (unsigned short)0; + *(*table)++ = here; /* make a table to force an error */ + *(*table)++ = here; + *bits = 1; + return 0; /* no symbols, but wait for decoding to report error */ + } + for (min = 1; min < max; min++) + if (count[min] != 0) break; + if (root < min) root = min; + + /* check for an over-subscribed or incomplete set of lengths */ + left = 1; + for (len = 1; len <= MAXBITS; len++) { + left <<= 1; + left -= count[len]; + if (left < 0) return -1; /* over-subscribed */ + } + if (left > 0 && (type == CODES || max != 1)) + return -1; /* incomplete set */ + + /* generate offsets into symbol table for each length for sorting */ + offs[1] = 0; + for (len = 1; len < MAXBITS; len++) + offs[len + 1] = offs[len] + count[len]; + + /* sort symbols by length, by symbol order within each length */ + for (sym = 0; sym < codes; sym++) + if (lens[sym] != 0) work[offs[lens[sym]]++] = (unsigned short)sym; + + /* + Create and fill in decoding tables. In this loop, the table being + filled is at next and has curr index bits. The code being used is huff + with length len. That code is converted to an index by dropping drop + bits off of the bottom. For codes where len is less than drop + curr, + those top drop + curr - len bits are incremented through all values to + fill the table with replicated entries. + + root is the number of index bits for the root table. When len exceeds + root, sub-tables are created pointed to by the root entry with an index + of the low root bits of huff. This is saved in low to check for when a + new sub-table should be started. drop is zero when the root table is + being filled, and drop is root when sub-tables are being filled. + + When a new sub-table is needed, it is necessary to look ahead in the + code lengths to determine what size sub-table is needed. The length + counts are used for this, and so count[] is decremented as codes are + entered in the tables. + + used keeps track of how many table entries have been allocated from the + provided *table space. It is checked for LENS and DIST tables against + the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in + the initial root table size constants. See the comments in inftrees.h + for more information. + + sym increments through all symbols, and the loop terminates when + all codes of length max, i.e. all codes, have been processed. This + routine permits incomplete codes, so another loop after this one fills + in the rest of the decoding tables with invalid code markers. + */ + + /* set up for code type */ + switch (type) { + case CODES: + base = extra = work; /* dummy value--not used */ + end = 19; + break; + case LENS: + base = lbase; + base -= 257; + extra = lext; + extra -= 257; + end = 256; + break; + default: /* DISTS */ + base = dbase; + extra = dext; + end = -1; + } + + /* initialize state for loop */ + huff = 0; /* starting code */ + sym = 0; /* starting code symbol */ + len = min; /* starting code length */ + next = *table; /* current table to fill in */ + curr = root; /* current table index bits */ + drop = 0; /* current bits to drop from code for index */ + low = (unsigned)(-1); /* trigger new sub-table when len > root */ + used = 1U << root; /* use root table entries */ + mask = used - 1; /* mask for comparing low */ + + /* check available table space */ + if ((type == LENS && used > ENOUGH_LENS) || + (type == DISTS && used > ENOUGH_DISTS)) + return 1; + + /* process all codes and make table entries */ + for (;;) { + /* create table entry */ + here.bits = (unsigned char)(len - drop); + if ((int)(work[sym]) < end) { + here.op = (unsigned char)0; + here.val = work[sym]; + } + else if ((int)(work[sym]) > end) { + here.op = (unsigned char)(extra[work[sym]]); + here.val = base[work[sym]]; + } + else { + here.op = (unsigned char)(32 + 64); /* end of block */ + here.val = 0; + } + + /* replicate for those indices with low len bits equal to huff */ + incr = 1U << (len - drop); + fill = 1U << curr; + min = fill; /* save offset to next table */ + do { + fill -= incr; + next[(huff >> drop) + fill] = here; + } while (fill != 0); + + /* backwards increment the len-bit code huff */ + incr = 1U << (len - 1); + while (huff & incr) + incr >>= 1; + if (incr != 0) { + huff &= incr - 1; + huff += incr; + } + else + huff = 0; + + /* go to next symbol, update count, len */ + sym++; + if (--(count[len]) == 0) { + if (len == max) break; + len = lens[work[sym]]; + } + + /* create new sub-table if needed */ + if (len > root && (huff & mask) != low) { + /* if first time, transition to sub-tables */ + if (drop == 0) + drop = root; + + /* increment past last table */ + next += min; /* here min is 1 << curr */ + + /* determine length of next table */ + curr = len - drop; + left = (int)(1 << curr); + while (curr + drop < max) { + left -= count[curr + drop]; + if (left <= 0) break; + curr++; + left <<= 1; + } + + /* check for enough space */ + used += 1U << curr; + if ((type == LENS && used > ENOUGH_LENS) || + (type == DISTS && used > ENOUGH_DISTS)) + return 1; + + /* point entry in root table to sub-table */ + low = huff & mask; + (*table)[low].op = (unsigned char)curr; + (*table)[low].bits = (unsigned char)root; + (*table)[low].val = (unsigned short)(next - *table); + } + } + + /* fill in remaining table entry if code is incomplete (guaranteed to have + at most one remaining entry, since if the code is incomplete, the + maximum code length that was allowed to get this far is one bit) */ + if (huff != 0) { + here.op = (unsigned char)64; /* invalid code marker */ + here.bits = (unsigned char)(len - drop); + here.val = (unsigned short)0; + next[huff] = here; + } + + /* set return parameters */ + *table += used; + *bits = root; + return 0; +} diff --git a/Minecraft.Client/Common/zlib/inftrees.h b/Minecraft.Client/Common/zlib/inftrees.h new file mode 100644 index 00000000..baa53a0b --- /dev/null +++ b/Minecraft.Client/Common/zlib/inftrees.h @@ -0,0 +1,62 @@ +/* inftrees.h -- header to use inftrees.c + * Copyright (C) 1995-2005, 2010 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* Structure for decoding tables. Each entry provides either the + information needed to do the operation requested by the code that + indexed that table entry, or it provides a pointer to another + table that indexes more bits of the code. op indicates whether + the entry is a pointer to another table, a literal, a length or + distance, an end-of-block, or an invalid code. For a table + pointer, the low four bits of op is the number of index bits of + that table. For a length or distance, the low four bits of op + is the number of extra bits to get after the code. bits is + the number of bits in this code or part of the code to drop off + of the bit buffer. val is the actual byte to output in the case + of a literal, the base length or distance, or the offset from + the current table to the next table. Each entry is four bytes. */ +typedef struct { + unsigned char op; /* operation, extra bits, table bits */ + unsigned char bits; /* bits in this part of the code */ + unsigned short val; /* offset in table or code value */ +} code; + +/* op values as set by inflate_table(): + 00000000 - literal + 0000tttt - table link, tttt != 0 is the number of table index bits + 0001eeee - length or distance, eeee is the number of extra bits + 01100000 - end of block + 01000000 - invalid code + */ + +/* Maximum size of the dynamic table. The maximum number of code structures is + 1444, which is the sum of 852 for literal/length codes and 592 for distance + codes. These values were found by exhaustive searches using the program + examples/enough.c found in the zlib distribtution. The arguments to that + program are the number of symbols, the initial root table size, and the + maximum bit length of a code. "enough 286 9 15" for literal/length codes + returns returns 852, and "enough 30 6 15" for distance codes returns 592. + The initial root table size (9 or 6) is found in the fifth argument of the + inflate_table() calls in inflate.c and infback.c. If the root table size is + changed, then these maximum sizes would be need to be recalculated and + updated. */ +#define ENOUGH_LENS 852 +#define ENOUGH_DISTS 592 +#define ENOUGH (ENOUGH_LENS+ENOUGH_DISTS) + +/* Type of code to build for inflate_table() */ +typedef enum { + CODES, + LENS, + DISTS +} codetype; + +int ZLIB_INTERNAL inflate_table OF((codetype type, unsigned short FAR *lens, + unsigned codes, code FAR * FAR *table, + unsigned FAR *bits, unsigned short FAR *work)); diff --git a/Minecraft.Client/Common/zlib/trees.c b/Minecraft.Client/Common/zlib/trees.c new file mode 100644 index 00000000..1fd7759e --- /dev/null +++ b/Minecraft.Client/Common/zlib/trees.c @@ -0,0 +1,1226 @@ +/* trees.c -- output deflated data using Huffman coding + * Copyright (C) 1995-2012 Jean-loup Gailly + * detect_data_type() function provided freely by Cosmin Truta, 2006 + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + * ALGORITHM + * + * The "deflation" process uses several Huffman trees. The more + * common source values are represented by shorter bit sequences. + * + * Each code tree is stored in a compressed form which is itself + * a Huffman encoding of the lengths of all the code strings (in + * ascending order by source values). The actual code strings are + * reconstructed from the lengths in the inflate process, as described + * in the deflate specification. + * + * REFERENCES + * + * Deutsch, L.P.,"'Deflate' Compressed Data Format Specification". + * Available in ftp.uu.net:/pub/archiving/zip/doc/deflate-1.1.doc + * + * Storer, James A. + * Data Compression: Methods and Theory, pp. 49-50. + * Computer Science Press, 1988. ISBN 0-7167-8156-5. + * + * Sedgewick, R. + * Algorithms, p290. + * Addison-Wesley, 1983. ISBN 0-201-06672-6. + */ + +/* @(#) $Id$ */ + +/* #define GEN_TREES_H */ + +#include "deflate.h" + +#ifdef DEBUG +# include +#endif + +/* =========================================================================== + * Constants + */ + +#define MAX_BL_BITS 7 +/* Bit length codes must not exceed MAX_BL_BITS bits */ + +#define END_BLOCK 256 +/* end of block literal code */ + +#define REP_3_6 16 +/* repeat previous bit length 3-6 times (2 bits of repeat count) */ + +#define REPZ_3_10 17 +/* repeat a zero length 3-10 times (3 bits of repeat count) */ + +#define REPZ_11_138 18 +/* repeat a zero length 11-138 times (7 bits of repeat count) */ + +local const int extra_lbits[LENGTH_CODES] /* extra bits for each length code */ + = {0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0}; + +local const int extra_dbits[D_CODES] /* extra bits for each distance code */ + = {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; + +local const int extra_blbits[BL_CODES]/* extra bits for each bit length code */ + = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7}; + +local const uch bl_order[BL_CODES] + = {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15}; +/* The lengths of the bit length codes are sent in order of decreasing + * probability, to avoid transmitting the lengths for unused bit length codes. + */ + +/* =========================================================================== + * Local data. These are initialized only once. + */ + +#define DIST_CODE_LEN 512 /* see definition of array dist_code below */ + +#if defined(GEN_TREES_H) || !defined(STDC) +/* non ANSI compilers may not accept trees.h */ + +local ct_data static_ltree[L_CODES+2]; +/* The static literal tree. Since the bit lengths are imposed, there is no + * need for the L_CODES extra codes used during heap construction. However + * The codes 286 and 287 are needed to build a canonical tree (see _tr_init + * below). + */ + +local ct_data static_dtree[D_CODES]; +/* The static distance tree. (Actually a trivial tree since all codes use + * 5 bits.) + */ + +uch _dist_code[DIST_CODE_LEN]; +/* Distance codes. The first 256 values correspond to the distances + * 3 .. 258, the last 256 values correspond to the top 8 bits of + * the 15 bit distances. + */ + +uch _length_code[MAX_MATCH-MIN_MATCH+1]; +/* length code for each normalized match length (0 == MIN_MATCH) */ + +local int base_length[LENGTH_CODES]; +/* First normalized length for each code (0 = MIN_MATCH) */ + +local int base_dist[D_CODES]; +/* First normalized distance for each code (0 = distance of 1) */ + +#else +# include "trees.h" +#endif /* GEN_TREES_H */ + +struct static_tree_desc_s { + const ct_data *static_tree; /* static tree or NULL */ + const intf *extra_bits; /* extra bits for each code or NULL */ + int extra_base; /* base index for extra_bits */ + int elems; /* max number of elements in the tree */ + int max_length; /* max bit length for the codes */ +}; + +local static_tree_desc static_l_desc = +{static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS}; + +local static_tree_desc static_d_desc = +{static_dtree, extra_dbits, 0, D_CODES, MAX_BITS}; + +local static_tree_desc static_bl_desc = +{(const ct_data *)0, extra_blbits, 0, BL_CODES, MAX_BL_BITS}; + +/* =========================================================================== + * Local (static) routines in this file. + */ + +local void tr_static_init OF((void)); +local void init_block OF((deflate_state *s)); +local void pqdownheap OF((deflate_state *s, ct_data *tree, int k)); +local void gen_bitlen OF((deflate_state *s, tree_desc *desc)); +local void gen_codes OF((ct_data *tree, int max_code, ushf *bl_count)); +local void build_tree OF((deflate_state *s, tree_desc *desc)); +local void scan_tree OF((deflate_state *s, ct_data *tree, int max_code)); +local void send_tree OF((deflate_state *s, ct_data *tree, int max_code)); +local int build_bl_tree OF((deflate_state *s)); +local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes, + int blcodes)); +local void compress_block OF((deflate_state *s, const ct_data *ltree, + const ct_data *dtree)); +local int detect_data_type OF((deflate_state *s)); +local unsigned bi_reverse OF((unsigned value, int length)); +local void bi_windup OF((deflate_state *s)); +local void bi_flush OF((deflate_state *s)); +local void copy_block OF((deflate_state *s, charf *buf, unsigned len, + int header)); + +#ifdef GEN_TREES_H +local void gen_trees_header OF((void)); +#endif + +#ifndef DEBUG +# define send_code(s, c, tree) send_bits(s, tree[c].Code, tree[c].Len) + /* Send a code of the given tree. c and tree must not have side effects */ + +#else /* DEBUG */ +# define send_code(s, c, tree) \ + { if (z_verbose>2) fprintf(stderr,"\ncd %3d ",(c)); \ + send_bits(s, tree[c].Code, tree[c].Len); } +#endif + +/* =========================================================================== + * Output a short LSB first on the stream. + * IN assertion: there is enough room in pendingBuf. + */ +#define put_short(s, w) { \ + put_byte(s, (uch)((w) & 0xff)); \ + put_byte(s, (uch)((ush)(w) >> 8)); \ +} + +/* =========================================================================== + * Send a value on a given number of bits. + * IN assertion: length <= 16 and value fits in length bits. + */ +#ifdef DEBUG +local void send_bits OF((deflate_state *s, int value, int length)); + +local void send_bits(s, value, length) + deflate_state *s; + int value; /* value to send */ + int length; /* number of bits */ +{ + Tracevv((stderr," l %2d v %4x ", length, value)); + Assert(length > 0 && length <= 15, "invalid length"); + s->bits_sent += (ulg)length; + + /* If not enough room in bi_buf, use (valid) bits from bi_buf and + * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid)) + * unused bits in value. + */ + if (s->bi_valid > (int)Buf_size - length) { + s->bi_buf |= (ush)value << s->bi_valid; + put_short(s, s->bi_buf); + s->bi_buf = (ush)value >> (Buf_size - s->bi_valid); + s->bi_valid += length - Buf_size; + } else { + s->bi_buf |= (ush)value << s->bi_valid; + s->bi_valid += length; + } +} +#else /* !DEBUG */ + +#define send_bits(s, value, length) \ +{ int len = length;\ + if (s->bi_valid > (int)Buf_size - len) {\ + int val = value;\ + s->bi_buf |= (ush)val << s->bi_valid;\ + put_short(s, s->bi_buf);\ + s->bi_buf = (ush)val >> (Buf_size - s->bi_valid);\ + s->bi_valid += len - Buf_size;\ + } else {\ + s->bi_buf |= (ush)(value) << s->bi_valid;\ + s->bi_valid += len;\ + }\ +} +#endif /* DEBUG */ + + +/* the arguments must not have side effects */ + +/* =========================================================================== + * Initialize the various 'constant' tables. + */ +local void tr_static_init() +{ +#if defined(GEN_TREES_H) || !defined(STDC) + static int static_init_done = 0; + int n; /* iterates over tree elements */ + int bits; /* bit counter */ + int length; /* length value */ + int code; /* code value */ + int dist; /* distance index */ + ush bl_count[MAX_BITS+1]; + /* number of codes at each bit length for an optimal tree */ + + if (static_init_done) return; + + /* For some embedded targets, global variables are not initialized: */ +#ifdef NO_INIT_GLOBAL_POINTERS + static_l_desc.static_tree = static_ltree; + static_l_desc.extra_bits = extra_lbits; + static_d_desc.static_tree = static_dtree; + static_d_desc.extra_bits = extra_dbits; + static_bl_desc.extra_bits = extra_blbits; +#endif + + /* Initialize the mapping length (0..255) -> length code (0..28) */ + length = 0; + for (code = 0; code < LENGTH_CODES-1; code++) { + base_length[code] = length; + for (n = 0; n < (1< dist code (0..29) */ + dist = 0; + for (code = 0 ; code < 16; code++) { + base_dist[code] = dist; + for (n = 0; n < (1<>= 7; /* from now on, all distances are divided by 128 */ + for ( ; code < D_CODES; code++) { + base_dist[code] = dist << 7; + for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) { + _dist_code[256 + dist++] = (uch)code; + } + } + Assert (dist == 256, "tr_static_init: 256+dist != 512"); + + /* Construct the codes of the static literal tree */ + for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0; + n = 0; + while (n <= 143) static_ltree[n++].Len = 8, bl_count[8]++; + while (n <= 255) static_ltree[n++].Len = 9, bl_count[9]++; + while (n <= 279) static_ltree[n++].Len = 7, bl_count[7]++; + while (n <= 287) static_ltree[n++].Len = 8, bl_count[8]++; + /* Codes 286 and 287 do not exist, but we must include them in the + * tree construction to get a canonical Huffman tree (longest code + * all ones) + */ + gen_codes((ct_data *)static_ltree, L_CODES+1, bl_count); + + /* The static distance tree is trivial: */ + for (n = 0; n < D_CODES; n++) { + static_dtree[n].Len = 5; + static_dtree[n].Code = bi_reverse((unsigned)n, 5); + } + static_init_done = 1; + +# ifdef GEN_TREES_H + gen_trees_header(); +# endif +#endif /* defined(GEN_TREES_H) || !defined(STDC) */ +} + +/* =========================================================================== + * Genererate the file trees.h describing the static trees. + */ +#ifdef GEN_TREES_H +# ifndef DEBUG +# include +# endif + +# define SEPARATOR(i, last, width) \ + ((i) == (last)? "\n};\n\n" : \ + ((i) % (width) == (width)-1 ? ",\n" : ", ")) + +void gen_trees_header() +{ + FILE *header = fopen("trees.h", "w"); + int i; + + Assert (header != NULL, "Can't open trees.h"); + fprintf(header, + "/* header created automatically with -DGEN_TREES_H */\n\n"); + + fprintf(header, "local const ct_data static_ltree[L_CODES+2] = {\n"); + for (i = 0; i < L_CODES+2; i++) { + fprintf(header, "{{%3u},{%3u}}%s", static_ltree[i].Code, + static_ltree[i].Len, SEPARATOR(i, L_CODES+1, 5)); + } + + fprintf(header, "local const ct_data static_dtree[D_CODES] = {\n"); + for (i = 0; i < D_CODES; i++) { + fprintf(header, "{{%2u},{%2u}}%s", static_dtree[i].Code, + static_dtree[i].Len, SEPARATOR(i, D_CODES-1, 5)); + } + + fprintf(header, "const uch ZLIB_INTERNAL _dist_code[DIST_CODE_LEN] = {\n"); + for (i = 0; i < DIST_CODE_LEN; i++) { + fprintf(header, "%2u%s", _dist_code[i], + SEPARATOR(i, DIST_CODE_LEN-1, 20)); + } + + fprintf(header, + "const uch ZLIB_INTERNAL _length_code[MAX_MATCH-MIN_MATCH+1]= {\n"); + for (i = 0; i < MAX_MATCH-MIN_MATCH+1; i++) { + fprintf(header, "%2u%s", _length_code[i], + SEPARATOR(i, MAX_MATCH-MIN_MATCH, 20)); + } + + fprintf(header, "local const int base_length[LENGTH_CODES] = {\n"); + for (i = 0; i < LENGTH_CODES; i++) { + fprintf(header, "%1u%s", base_length[i], + SEPARATOR(i, LENGTH_CODES-1, 20)); + } + + fprintf(header, "local const int base_dist[D_CODES] = {\n"); + for (i = 0; i < D_CODES; i++) { + fprintf(header, "%5u%s", base_dist[i], + SEPARATOR(i, D_CODES-1, 10)); + } + + fclose(header); +} +#endif /* GEN_TREES_H */ + +/* =========================================================================== + * Initialize the tree data structures for a new zlib stream. + */ +void ZLIB_INTERNAL _tr_init(s) + deflate_state *s; +{ + tr_static_init(); + + s->l_desc.dyn_tree = s->dyn_ltree; + s->l_desc.stat_desc = &static_l_desc; + + s->d_desc.dyn_tree = s->dyn_dtree; + s->d_desc.stat_desc = &static_d_desc; + + s->bl_desc.dyn_tree = s->bl_tree; + s->bl_desc.stat_desc = &static_bl_desc; + + s->bi_buf = 0; + s->bi_valid = 0; +#ifdef DEBUG + s->compressed_len = 0L; + s->bits_sent = 0L; +#endif + + /* Initialize the first block of the first file: */ + init_block(s); +} + +/* =========================================================================== + * Initialize a new block. + */ +local void init_block(s) + deflate_state *s; +{ + int n; /* iterates over tree elements */ + + /* Initialize the trees. */ + for (n = 0; n < L_CODES; n++) s->dyn_ltree[n].Freq = 0; + for (n = 0; n < D_CODES; n++) s->dyn_dtree[n].Freq = 0; + for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0; + + s->dyn_ltree[END_BLOCK].Freq = 1; + s->opt_len = s->static_len = 0L; + s->last_lit = s->matches = 0; +} + +#define SMALLEST 1 +/* Index within the heap array of least frequent node in the Huffman tree */ + + +/* =========================================================================== + * Remove the smallest element from the heap and recreate the heap with + * one less element. Updates heap and heap_len. + */ +#define pqremove(s, tree, top) \ +{\ + top = s->heap[SMALLEST]; \ + s->heap[SMALLEST] = s->heap[s->heap_len--]; \ + pqdownheap(s, tree, SMALLEST); \ +} + +/* =========================================================================== + * Compares to subtrees, using the tree depth as tie breaker when + * the subtrees have equal frequency. This minimizes the worst case length. + */ +#define smaller(tree, n, m, depth) \ + (tree[n].Freq < tree[m].Freq || \ + (tree[n].Freq == tree[m].Freq && depth[n] <= depth[m])) + +/* =========================================================================== + * Restore the heap property by moving down the tree starting at node k, + * exchanging a node with the smallest of its two sons if necessary, stopping + * when the heap property is re-established (each father smaller than its + * two sons). + */ +local void pqdownheap(s, tree, k) + deflate_state *s; + ct_data *tree; /* the tree to restore */ + int k; /* node to move down */ +{ + int v = s->heap[k]; + int j = k << 1; /* left son of k */ + while (j <= s->heap_len) { + /* Set j to the smallest of the two sons: */ + if (j < s->heap_len && + smaller(tree, s->heap[j+1], s->heap[j], s->depth)) { + j++; + } + /* Exit if v is smaller than both sons */ + if (smaller(tree, v, s->heap[j], s->depth)) break; + + /* Exchange v with the smallest son */ + s->heap[k] = s->heap[j]; k = j; + + /* And continue down the tree, setting j to the left son of k */ + j <<= 1; + } + s->heap[k] = v; +} + +/* =========================================================================== + * Compute the optimal bit lengths for a tree and update the total bit length + * for the current block. + * IN assertion: the fields freq and dad are set, heap[heap_max] and + * above are the tree nodes sorted by increasing frequency. + * OUT assertions: the field len is set to the optimal bit length, the + * array bl_count contains the frequencies for each bit length. + * The length opt_len is updated; static_len is also updated if stree is + * not null. + */ +local void gen_bitlen(s, desc) + deflate_state *s; + tree_desc *desc; /* the tree descriptor */ +{ + ct_data *tree = desc->dyn_tree; + int max_code = desc->max_code; + const ct_data *stree = desc->stat_desc->static_tree; + const intf *extra = desc->stat_desc->extra_bits; + int base = desc->stat_desc->extra_base; + int max_length = desc->stat_desc->max_length; + int h; /* heap index */ + int n, m; /* iterate over the tree elements */ + int bits; /* bit length */ + int xbits; /* extra bits */ + ush f; /* frequency */ + int overflow = 0; /* number of elements with bit length too large */ + + for (bits = 0; bits <= MAX_BITS; bits++) s->bl_count[bits] = 0; + + /* In a first pass, compute the optimal bit lengths (which may + * overflow in the case of the bit length tree). + */ + tree[s->heap[s->heap_max]].Len = 0; /* root of the heap */ + + for (h = s->heap_max+1; h < HEAP_SIZE; h++) { + n = s->heap[h]; + bits = tree[tree[n].Dad].Len + 1; + if (bits > max_length) bits = max_length, overflow++; + tree[n].Len = (ush)bits; + /* We overwrite tree[n].Dad which is no longer needed */ + + if (n > max_code) continue; /* not a leaf node */ + + s->bl_count[bits]++; + xbits = 0; + if (n >= base) xbits = extra[n-base]; + f = tree[n].Freq; + s->opt_len += (ulg)f * (bits + xbits); + if (stree) s->static_len += (ulg)f * (stree[n].Len + xbits); + } + if (overflow == 0) return; + + Trace((stderr,"\nbit length overflow\n")); + /* This happens for example on obj2 and pic of the Calgary corpus */ + + /* Find the first bit length which could increase: */ + do { + bits = max_length-1; + while (s->bl_count[bits] == 0) bits--; + s->bl_count[bits]--; /* move one leaf down the tree */ + s->bl_count[bits+1] += 2; /* move one overflow item as its brother */ + s->bl_count[max_length]--; + /* The brother of the overflow item also moves one step up, + * but this does not affect bl_count[max_length] + */ + overflow -= 2; + } while (overflow > 0); + + /* Now recompute all bit lengths, scanning in increasing frequency. + * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all + * lengths instead of fixing only the wrong ones. This idea is taken + * from 'ar' written by Haruhiko Okumura.) + */ + for (bits = max_length; bits != 0; bits--) { + n = s->bl_count[bits]; + while (n != 0) { + m = s->heap[--h]; + if (m > max_code) continue; + if ((unsigned) tree[m].Len != (unsigned) bits) { + Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); + s->opt_len += ((long)bits - (long)tree[m].Len) + *(long)tree[m].Freq; + tree[m].Len = (ush)bits; + } + n--; + } + } +} + +/* =========================================================================== + * Generate the codes for a given tree and bit counts (which need not be + * optimal). + * IN assertion: the array bl_count contains the bit length statistics for + * the given tree and the field len is set for all tree elements. + * OUT assertion: the field code is set for all tree elements of non + * zero code length. + */ +local void gen_codes (tree, max_code, bl_count) + ct_data *tree; /* the tree to decorate */ + int max_code; /* largest code with non zero frequency */ + ushf *bl_count; /* number of codes at each bit length */ +{ + ush next_code[MAX_BITS+1]; /* next code value for each bit length */ + ush code = 0; /* running code value */ + int bits; /* bit index */ + int n; /* code index */ + + /* The distribution counts are first used to generate the code values + * without bit reversal. + */ + for (bits = 1; bits <= MAX_BITS; bits++) { + next_code[bits] = code = (code + bl_count[bits-1]) << 1; + } + /* Check that the bit counts in bl_count are consistent. The last code + * must be all ones. + */ + Assert (code + bl_count[MAX_BITS]-1 == (1<dyn_tree; + const ct_data *stree = desc->stat_desc->static_tree; + int elems = desc->stat_desc->elems; + int n, m; /* iterate over heap elements */ + int max_code = -1; /* largest code with non zero frequency */ + int node; /* new node being created */ + + /* Construct the initial heap, with least frequent element in + * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. + * heap[0] is not used. + */ + s->heap_len = 0, s->heap_max = HEAP_SIZE; + + for (n = 0; n < elems; n++) { + if (tree[n].Freq != 0) { + s->heap[++(s->heap_len)] = max_code = n; + s->depth[n] = 0; + } else { + tree[n].Len = 0; + } + } + + /* The pkzip format requires that at least one distance code exists, + * and that at least one bit should be sent even if there is only one + * possible code. So to avoid special checks later on we force at least + * two codes of non zero frequency. + */ + while (s->heap_len < 2) { + node = s->heap[++(s->heap_len)] = (max_code < 2 ? ++max_code : 0); + tree[node].Freq = 1; + s->depth[node] = 0; + s->opt_len--; if (stree) s->static_len -= stree[node].Len; + /* node is 0 or 1 so it does not have extra bits */ + } + desc->max_code = max_code; + + /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, + * establish sub-heaps of increasing lengths: + */ + for (n = s->heap_len/2; n >= 1; n--) pqdownheap(s, tree, n); + + /* Construct the Huffman tree by repeatedly combining the least two + * frequent nodes. + */ + node = elems; /* next internal node of the tree */ + do { + pqremove(s, tree, n); /* n = node of least frequency */ + m = s->heap[SMALLEST]; /* m = node of next least frequency */ + + s->heap[--(s->heap_max)] = n; /* keep the nodes sorted by frequency */ + s->heap[--(s->heap_max)] = m; + + /* Create a new node father of n and m */ + tree[node].Freq = tree[n].Freq + tree[m].Freq; + s->depth[node] = (uch)((s->depth[n] >= s->depth[m] ? + s->depth[n] : s->depth[m]) + 1); + tree[n].Dad = tree[m].Dad = (ush)node; +#ifdef DUMP_BL_TREE + if (tree == s->bl_tree) { + fprintf(stderr,"\nnode %d(%d), sons %d(%d) %d(%d)", + node, tree[node].Freq, n, tree[n].Freq, m, tree[m].Freq); + } +#endif + /* and insert the new node in the heap */ + s->heap[SMALLEST] = node++; + pqdownheap(s, tree, SMALLEST); + + } while (s->heap_len >= 2); + + s->heap[--(s->heap_max)] = s->heap[SMALLEST]; + + /* At this point, the fields freq and dad are set. We can now + * generate the bit lengths. + */ + gen_bitlen(s, (tree_desc *)desc); + + /* The field len is now set, we can generate the bit codes */ + gen_codes ((ct_data *)tree, max_code, s->bl_count); +} + +/* =========================================================================== + * Scan a literal or distance tree to determine the frequencies of the codes + * in the bit length tree. + */ +local void scan_tree (s, tree, max_code) + deflate_state *s; + ct_data *tree; /* the tree to be scanned */ + int max_code; /* and its largest code of non zero frequency */ +{ + int n; /* iterates over all tree elements */ + int prevlen = -1; /* last emitted length */ + int curlen; /* length of current code */ + int nextlen = tree[0].Len; /* length of next code */ + int count = 0; /* repeat count of the current code */ + int max_count = 7; /* max repeat count */ + int min_count = 4; /* min repeat count */ + + if (nextlen == 0) max_count = 138, min_count = 3; + tree[max_code+1].Len = (ush)0xffff; /* guard */ + + for (n = 0; n <= max_code; n++) { + curlen = nextlen; nextlen = tree[n+1].Len; + if (++count < max_count && curlen == nextlen) { + continue; + } else if (count < min_count) { + s->bl_tree[curlen].Freq += count; + } else if (curlen != 0) { + if (curlen != prevlen) s->bl_tree[curlen].Freq++; + s->bl_tree[REP_3_6].Freq++; + } else if (count <= 10) { + s->bl_tree[REPZ_3_10].Freq++; + } else { + s->bl_tree[REPZ_11_138].Freq++; + } + count = 0; prevlen = curlen; + if (nextlen == 0) { + max_count = 138, min_count = 3; + } else if (curlen == nextlen) { + max_count = 6, min_count = 3; + } else { + max_count = 7, min_count = 4; + } + } +} + +/* =========================================================================== + * Send a literal or distance tree in compressed form, using the codes in + * bl_tree. + */ +local void send_tree (s, tree, max_code) + deflate_state *s; + ct_data *tree; /* the tree to be scanned */ + int max_code; /* and its largest code of non zero frequency */ +{ + int n; /* iterates over all tree elements */ + int prevlen = -1; /* last emitted length */ + int curlen; /* length of current code */ + int nextlen = tree[0].Len; /* length of next code */ + int count = 0; /* repeat count of the current code */ + int max_count = 7; /* max repeat count */ + int min_count = 4; /* min repeat count */ + + /* tree[max_code+1].Len = -1; */ /* guard already set */ + if (nextlen == 0) max_count = 138, min_count = 3; + + for (n = 0; n <= max_code; n++) { + curlen = nextlen; nextlen = tree[n+1].Len; + if (++count < max_count && curlen == nextlen) { + continue; + } else if (count < min_count) { + do { send_code(s, curlen, s->bl_tree); } while (--count != 0); + + } else if (curlen != 0) { + if (curlen != prevlen) { + send_code(s, curlen, s->bl_tree); count--; + } + Assert(count >= 3 && count <= 6, " 3_6?"); + send_code(s, REP_3_6, s->bl_tree); send_bits(s, count-3, 2); + + } else if (count <= 10) { + send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count-3, 3); + + } else { + send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count-11, 7); + } + count = 0; prevlen = curlen; + if (nextlen == 0) { + max_count = 138, min_count = 3; + } else if (curlen == nextlen) { + max_count = 6, min_count = 3; + } else { + max_count = 7, min_count = 4; + } + } +} + +/* =========================================================================== + * Construct the Huffman tree for the bit lengths and return the index in + * bl_order of the last bit length code to send. + */ +local int build_bl_tree(s) + deflate_state *s; +{ + int max_blindex; /* index of last bit length code of non zero freq */ + + /* Determine the bit length frequencies for literal and distance trees */ + scan_tree(s, (ct_data *)s->dyn_ltree, s->l_desc.max_code); + scan_tree(s, (ct_data *)s->dyn_dtree, s->d_desc.max_code); + + /* Build the bit length tree: */ + build_tree(s, (tree_desc *)(&(s->bl_desc))); + /* opt_len now includes the length of the tree representations, except + * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. + */ + + /* Determine the number of bit length codes to send. The pkzip format + * requires that at least 4 bit length codes be sent. (appnote.txt says + * 3 but the actual value used is 4.) + */ + for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) { + if (s->bl_tree[bl_order[max_blindex]].Len != 0) break; + } + /* Update opt_len to include the bit length tree and counts */ + s->opt_len += 3*(max_blindex+1) + 5+5+4; + Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", + s->opt_len, s->static_len)); + + return max_blindex; +} + +/* =========================================================================== + * Send the header for a block using dynamic Huffman trees: the counts, the + * lengths of the bit length codes, the literal tree and the distance tree. + * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. + */ +local void send_all_trees(s, lcodes, dcodes, blcodes) + deflate_state *s; + int lcodes, dcodes, blcodes; /* number of codes for each tree */ +{ + int rank; /* index in bl_order */ + + Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); + Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, + "too many codes"); + Tracev((stderr, "\nbl counts: ")); + send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */ + send_bits(s, dcodes-1, 5); + send_bits(s, blcodes-4, 4); /* not -3 as stated in appnote.txt */ + for (rank = 0; rank < blcodes; rank++) { + Tracev((stderr, "\nbl code %2d ", bl_order[rank])); + send_bits(s, s->bl_tree[bl_order[rank]].Len, 3); + } + Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); + + send_tree(s, (ct_data *)s->dyn_ltree, lcodes-1); /* literal tree */ + Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); + + send_tree(s, (ct_data *)s->dyn_dtree, dcodes-1); /* distance tree */ + Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); +} + +/* =========================================================================== + * Send a stored block + */ +void ZLIB_INTERNAL _tr_stored_block(s, buf, stored_len, last) + deflate_state *s; + charf *buf; /* input block */ + ulg stored_len; /* length of input block */ + int last; /* one if this is the last block for a file */ +{ + send_bits(s, (STORED_BLOCK<<1)+last, 3); /* send block type */ +#ifdef DEBUG + s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L; + s->compressed_len += (stored_len + 4) << 3; +#endif + copy_block(s, buf, (unsigned)stored_len, 1); /* with header */ +} + +/* =========================================================================== + * Flush the bits in the bit buffer to pending output (leaves at most 7 bits) + */ +void ZLIB_INTERNAL _tr_flush_bits(s) + deflate_state *s; +{ + bi_flush(s); +} + +/* =========================================================================== + * Send one empty static block to give enough lookahead for inflate. + * This takes 10 bits, of which 7 may remain in the bit buffer. + */ +void ZLIB_INTERNAL _tr_align(s) + deflate_state *s; +{ + send_bits(s, STATIC_TREES<<1, 3); + send_code(s, END_BLOCK, static_ltree); +#ifdef DEBUG + s->compressed_len += 10L; /* 3 for block type, 7 for EOB */ +#endif + bi_flush(s); +} + +/* =========================================================================== + * Determine the best encoding for the current block: dynamic trees, static + * trees or store, and output the encoded block to the zip file. + */ +void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last) + deflate_state *s; + charf *buf; /* input block, or NULL if too old */ + ulg stored_len; /* length of input block */ + int last; /* one if this is the last block for a file */ +{ + ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */ + int max_blindex = 0; /* index of last bit length code of non zero freq */ + + /* Build the Huffman trees unless a stored block is forced */ + if (s->level > 0) { + + /* Check if the file is binary or text */ + if (s->strm->data_type == Z_UNKNOWN) + s->strm->data_type = detect_data_type(s); + + /* Construct the literal and distance trees */ + build_tree(s, (tree_desc *)(&(s->l_desc))); + Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, + s->static_len)); + + build_tree(s, (tree_desc *)(&(s->d_desc))); + Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, + s->static_len)); + /* At this point, opt_len and static_len are the total bit lengths of + * the compressed block data, excluding the tree representations. + */ + + /* Build the bit length tree for the above two trees, and get the index + * in bl_order of the last bit length code to send. + */ + max_blindex = build_bl_tree(s); + + /* Determine the best encoding. Compute the block lengths in bytes. */ + opt_lenb = (s->opt_len+3+7)>>3; + static_lenb = (s->static_len+3+7)>>3; + + Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", + opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, + s->last_lit)); + + if (static_lenb <= opt_lenb) opt_lenb = static_lenb; + + } else { + Assert(buf != (char*)0, "lost buf"); + opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ + } + +#ifdef FORCE_STORED + if (buf != (char*)0) { /* force stored block */ +#else + if (stored_len+4 <= opt_lenb && buf != (char*)0) { + /* 4: two words for the lengths */ +#endif + /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. + * Otherwise we can't have processed more than WSIZE input bytes since + * the last block flush, because compression would have been + * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to + * transform a block into a stored block. + */ + _tr_stored_block(s, buf, stored_len, last); + +#ifdef FORCE_STATIC + } else if (static_lenb >= 0) { /* force static trees */ +#else + } else if (s->strategy == Z_FIXED || static_lenb == opt_lenb) { +#endif + send_bits(s, (STATIC_TREES<<1)+last, 3); + compress_block(s, (const ct_data *)static_ltree, + (const ct_data *)static_dtree); +#ifdef DEBUG + s->compressed_len += 3 + s->static_len; +#endif + } else { + send_bits(s, (DYN_TREES<<1)+last, 3); + send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1, + max_blindex+1); + compress_block(s, (const ct_data *)s->dyn_ltree, + (const ct_data *)s->dyn_dtree); +#ifdef DEBUG + s->compressed_len += 3 + s->opt_len; +#endif + } + Assert (s->compressed_len == s->bits_sent, "bad compressed size"); + /* The above check is made mod 2^32, for files larger than 512 MB + * and uLong implemented on 32 bits. + */ + init_block(s); + + if (last) { + bi_windup(s); +#ifdef DEBUG + s->compressed_len += 7; /* align on byte boundary */ +#endif + } + Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, + s->compressed_len-7*last)); +} + +/* =========================================================================== + * Save the match info and tally the frequency counts. Return true if + * the current block must be flushed. + */ +int ZLIB_INTERNAL _tr_tally (s, dist, lc) + deflate_state *s; + unsigned dist; /* distance of matched string */ + unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ +{ + s->d_buf[s->last_lit] = (ush)dist; + s->l_buf[s->last_lit++] = (uch)lc; + if (dist == 0) { + /* lc is the unmatched char */ + s->dyn_ltree[lc].Freq++; + } else { + s->matches++; + /* Here, lc is the match length - MIN_MATCH */ + dist--; /* dist = match distance - 1 */ + Assert((ush)dist < (ush)MAX_DIST(s) && + (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && + (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); + + s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++; + s->dyn_dtree[d_code(dist)].Freq++; + } + +#ifdef TRUNCATE_BLOCK + /* Try to guess if it is profitable to stop the current block here */ + if ((s->last_lit & 0x1fff) == 0 && s->level > 2) { + /* Compute an upper bound for the compressed length */ + ulg out_length = (ulg)s->last_lit*8L; + ulg in_length = (ulg)((long)s->strstart - s->block_start); + int dcode; + for (dcode = 0; dcode < D_CODES; dcode++) { + out_length += (ulg)s->dyn_dtree[dcode].Freq * + (5L+extra_dbits[dcode]); + } + out_length >>= 3; + Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", + s->last_lit, in_length, out_length, + 100L - out_length*100L/in_length)); + if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1; + } +#endif + return (s->last_lit == s->lit_bufsize-1); + /* We avoid equality with lit_bufsize because of wraparound at 64K + * on 16 bit machines and because stored blocks are restricted to + * 64K-1 bytes. + */ +} + +/* =========================================================================== + * Send the block data compressed using the given Huffman trees + */ +local void compress_block(s, ltree, dtree) + deflate_state *s; + const ct_data *ltree; /* literal tree */ + const ct_data *dtree; /* distance tree */ +{ + unsigned dist; /* distance of matched string */ + int lc; /* match length or unmatched char (if dist == 0) */ + unsigned lx = 0; /* running index in l_buf */ + unsigned code; /* the code to send */ + int extra; /* number of extra bits to send */ + + if (s->last_lit != 0) do { + dist = s->d_buf[lx]; + lc = s->l_buf[lx++]; + if (dist == 0) { + send_code(s, lc, ltree); /* send a literal byte */ + Tracecv(isgraph(lc), (stderr," '%c' ", lc)); + } else { + /* Here, lc is the match length - MIN_MATCH */ + code = _length_code[lc]; + send_code(s, code+LITERALS+1, ltree); /* send the length code */ + extra = extra_lbits[code]; + if (extra != 0) { + lc -= base_length[code]; + send_bits(s, lc, extra); /* send the extra length bits */ + } + dist--; /* dist is now the match distance - 1 */ + code = d_code(dist); + Assert (code < D_CODES, "bad d_code"); + + send_code(s, code, dtree); /* send the distance code */ + extra = extra_dbits[code]; + if (extra != 0) { + dist -= base_dist[code]; + send_bits(s, dist, extra); /* send the extra distance bits */ + } + } /* literal or match pair ? */ + + /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ + Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx, + "pendingBuf overflow"); + + } while (lx < s->last_lit); + + send_code(s, END_BLOCK, ltree); +} + +/* =========================================================================== + * Check if the data type is TEXT or BINARY, using the following algorithm: + * - TEXT if the two conditions below are satisfied: + * a) There are no non-portable control characters belonging to the + * "black list" (0..6, 14..25, 28..31). + * b) There is at least one printable character belonging to the + * "white list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255). + * - BINARY otherwise. + * - The following partially-portable control characters form a + * "gray list" that is ignored in this detection algorithm: + * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}). + * IN assertion: the fields Freq of dyn_ltree are set. + */ +local int detect_data_type(s) + deflate_state *s; +{ + /* black_mask is the bit mask of black-listed bytes + * set bits 0..6, 14..25, and 28..31 + * 0xf3ffc07f = binary 11110011111111111100000001111111 + */ + unsigned long black_mask = 0xf3ffc07fUL; + int n; + + /* Check for non-textual ("black-listed") bytes. */ + for (n = 0; n <= 31; n++, black_mask >>= 1) + if ((black_mask & 1) && (s->dyn_ltree[n].Freq != 0)) + return Z_BINARY; + + /* Check for textual ("white-listed") bytes. */ + if (s->dyn_ltree[9].Freq != 0 || s->dyn_ltree[10].Freq != 0 + || s->dyn_ltree[13].Freq != 0) + return Z_TEXT; + for (n = 32; n < LITERALS; n++) + if (s->dyn_ltree[n].Freq != 0) + return Z_TEXT; + + /* There are no "black-listed" or "white-listed" bytes: + * this stream either is empty or has tolerated ("gray-listed") bytes only. + */ + return Z_BINARY; +} + +/* =========================================================================== + * Reverse the first len bits of a code, using straightforward code (a faster + * method would use a table) + * IN assertion: 1 <= len <= 15 + */ +local unsigned bi_reverse(code, len) + unsigned code; /* the value to invert */ + int len; /* its bit length */ +{ + register unsigned res = 0; + do { + res |= code & 1; + code >>= 1, res <<= 1; + } while (--len > 0); + return res >> 1; +} + +/* =========================================================================== + * Flush the bit buffer, keeping at most 7 bits in it. + */ +local void bi_flush(s) + deflate_state *s; +{ + if (s->bi_valid == 16) { + put_short(s, s->bi_buf); + s->bi_buf = 0; + s->bi_valid = 0; + } else if (s->bi_valid >= 8) { + put_byte(s, (Byte)s->bi_buf); + s->bi_buf >>= 8; + s->bi_valid -= 8; + } +} + +/* =========================================================================== + * Flush the bit buffer and align the output on a byte boundary + */ +local void bi_windup(s) + deflate_state *s; +{ + if (s->bi_valid > 8) { + put_short(s, s->bi_buf); + } else if (s->bi_valid > 0) { + put_byte(s, (Byte)s->bi_buf); + } + s->bi_buf = 0; + s->bi_valid = 0; +#ifdef DEBUG + s->bits_sent = (s->bits_sent+7) & ~7; +#endif +} + +/* =========================================================================== + * Copy a stored block, storing first the length and its + * one's complement if requested. + */ +local void copy_block(s, buf, len, header) + deflate_state *s; + charf *buf; /* the input data */ + unsigned len; /* its length */ + int header; /* true if block header must be written */ +{ + bi_windup(s); /* align on byte boundary */ + + if (header) { + put_short(s, (ush)len); + put_short(s, (ush)~len); +#ifdef DEBUG + s->bits_sent += 2*16; +#endif + } +#ifdef DEBUG + s->bits_sent += (ulg)len<<3; +#endif + while (len--) { + put_byte(s, *buf++); + } +} diff --git a/Minecraft.Client/Common/zlib/trees.h b/Minecraft.Client/Common/zlib/trees.h new file mode 100644 index 00000000..d35639d8 --- /dev/null +++ b/Minecraft.Client/Common/zlib/trees.h @@ -0,0 +1,128 @@ +/* header created automatically with -DGEN_TREES_H */ + +local const ct_data static_ltree[L_CODES+2] = { +{{ 12},{ 8}}, {{140},{ 8}}, {{ 76},{ 8}}, {{204},{ 8}}, {{ 44},{ 8}}, +{{172},{ 8}}, {{108},{ 8}}, {{236},{ 8}}, {{ 28},{ 8}}, {{156},{ 8}}, +{{ 92},{ 8}}, {{220},{ 8}}, {{ 60},{ 8}}, {{188},{ 8}}, {{124},{ 8}}, +{{252},{ 8}}, {{ 2},{ 8}}, {{130},{ 8}}, {{ 66},{ 8}}, {{194},{ 8}}, +{{ 34},{ 8}}, {{162},{ 8}}, {{ 98},{ 8}}, {{226},{ 8}}, {{ 18},{ 8}}, +{{146},{ 8}}, {{ 82},{ 8}}, {{210},{ 8}}, {{ 50},{ 8}}, {{178},{ 8}}, +{{114},{ 8}}, {{242},{ 8}}, {{ 10},{ 8}}, {{138},{ 8}}, {{ 74},{ 8}}, +{{202},{ 8}}, {{ 42},{ 8}}, {{170},{ 8}}, {{106},{ 8}}, {{234},{ 8}}, +{{ 26},{ 8}}, {{154},{ 8}}, {{ 90},{ 8}}, {{218},{ 8}}, {{ 58},{ 8}}, +{{186},{ 8}}, {{122},{ 8}}, {{250},{ 8}}, {{ 6},{ 8}}, {{134},{ 8}}, +{{ 70},{ 8}}, {{198},{ 8}}, {{ 38},{ 8}}, {{166},{ 8}}, {{102},{ 8}}, +{{230},{ 8}}, {{ 22},{ 8}}, {{150},{ 8}}, {{ 86},{ 8}}, {{214},{ 8}}, +{{ 54},{ 8}}, {{182},{ 8}}, {{118},{ 8}}, {{246},{ 8}}, {{ 14},{ 8}}, +{{142},{ 8}}, {{ 78},{ 8}}, {{206},{ 8}}, {{ 46},{ 8}}, {{174},{ 8}}, +{{110},{ 8}}, {{238},{ 8}}, {{ 30},{ 8}}, {{158},{ 8}}, {{ 94},{ 8}}, +{{222},{ 8}}, {{ 62},{ 8}}, {{190},{ 8}}, {{126},{ 8}}, {{254},{ 8}}, +{{ 1},{ 8}}, {{129},{ 8}}, {{ 65},{ 8}}, {{193},{ 8}}, {{ 33},{ 8}}, +{{161},{ 8}}, {{ 97},{ 8}}, {{225},{ 8}}, {{ 17},{ 8}}, {{145},{ 8}}, +{{ 81},{ 8}}, {{209},{ 8}}, {{ 49},{ 8}}, {{177},{ 8}}, {{113},{ 8}}, +{{241},{ 8}}, {{ 9},{ 8}}, {{137},{ 8}}, {{ 73},{ 8}}, {{201},{ 8}}, +{{ 41},{ 8}}, {{169},{ 8}}, {{105},{ 8}}, {{233},{ 8}}, {{ 25},{ 8}}, +{{153},{ 8}}, {{ 89},{ 8}}, {{217},{ 8}}, {{ 57},{ 8}}, {{185},{ 8}}, +{{121},{ 8}}, {{249},{ 8}}, {{ 5},{ 8}}, {{133},{ 8}}, {{ 69},{ 8}}, +{{197},{ 8}}, {{ 37},{ 8}}, {{165},{ 8}}, {{101},{ 8}}, {{229},{ 8}}, +{{ 21},{ 8}}, {{149},{ 8}}, {{ 85},{ 8}}, {{213},{ 8}}, {{ 53},{ 8}}, +{{181},{ 8}}, {{117},{ 8}}, {{245},{ 8}}, {{ 13},{ 8}}, {{141},{ 8}}, +{{ 77},{ 8}}, {{205},{ 8}}, {{ 45},{ 8}}, {{173},{ 8}}, {{109},{ 8}}, +{{237},{ 8}}, {{ 29},{ 8}}, {{157},{ 8}}, {{ 93},{ 8}}, {{221},{ 8}}, +{{ 61},{ 8}}, {{189},{ 8}}, {{125},{ 8}}, {{253},{ 8}}, {{ 19},{ 9}}, +{{275},{ 9}}, {{147},{ 9}}, {{403},{ 9}}, {{ 83},{ 9}}, {{339},{ 9}}, +{{211},{ 9}}, {{467},{ 9}}, {{ 51},{ 9}}, {{307},{ 9}}, {{179},{ 9}}, +{{435},{ 9}}, {{115},{ 9}}, {{371},{ 9}}, {{243},{ 9}}, {{499},{ 9}}, +{{ 11},{ 9}}, {{267},{ 9}}, {{139},{ 9}}, {{395},{ 9}}, {{ 75},{ 9}}, +{{331},{ 9}}, {{203},{ 9}}, {{459},{ 9}}, {{ 43},{ 9}}, {{299},{ 9}}, +{{171},{ 9}}, {{427},{ 9}}, {{107},{ 9}}, {{363},{ 9}}, {{235},{ 9}}, +{{491},{ 9}}, {{ 27},{ 9}}, {{283},{ 9}}, {{155},{ 9}}, {{411},{ 9}}, +{{ 91},{ 9}}, {{347},{ 9}}, {{219},{ 9}}, {{475},{ 9}}, {{ 59},{ 9}}, +{{315},{ 9}}, {{187},{ 9}}, {{443},{ 9}}, {{123},{ 9}}, {{379},{ 9}}, +{{251},{ 9}}, {{507},{ 9}}, {{ 7},{ 9}}, {{263},{ 9}}, {{135},{ 9}}, +{{391},{ 9}}, {{ 71},{ 9}}, {{327},{ 9}}, {{199},{ 9}}, {{455},{ 9}}, +{{ 39},{ 9}}, {{295},{ 9}}, {{167},{ 9}}, {{423},{ 9}}, {{103},{ 9}}, +{{359},{ 9}}, {{231},{ 9}}, {{487},{ 9}}, {{ 23},{ 9}}, {{279},{ 9}}, +{{151},{ 9}}, {{407},{ 9}}, {{ 87},{ 9}}, {{343},{ 9}}, {{215},{ 9}}, +{{471},{ 9}}, {{ 55},{ 9}}, {{311},{ 9}}, {{183},{ 9}}, {{439},{ 9}}, +{{119},{ 9}}, {{375},{ 9}}, {{247},{ 9}}, {{503},{ 9}}, {{ 15},{ 9}}, +{{271},{ 9}}, {{143},{ 9}}, {{399},{ 9}}, {{ 79},{ 9}}, {{335},{ 9}}, +{{207},{ 9}}, {{463},{ 9}}, {{ 47},{ 9}}, {{303},{ 9}}, {{175},{ 9}}, +{{431},{ 9}}, {{111},{ 9}}, {{367},{ 9}}, {{239},{ 9}}, {{495},{ 9}}, +{{ 31},{ 9}}, {{287},{ 9}}, {{159},{ 9}}, {{415},{ 9}}, {{ 95},{ 9}}, +{{351},{ 9}}, {{223},{ 9}}, {{479},{ 9}}, {{ 63},{ 9}}, {{319},{ 9}}, +{{191},{ 9}}, {{447},{ 9}}, {{127},{ 9}}, {{383},{ 9}}, {{255},{ 9}}, +{{511},{ 9}}, {{ 0},{ 7}}, {{ 64},{ 7}}, {{ 32},{ 7}}, {{ 96},{ 7}}, +{{ 16},{ 7}}, {{ 80},{ 7}}, {{ 48},{ 7}}, {{112},{ 7}}, {{ 8},{ 7}}, +{{ 72},{ 7}}, {{ 40},{ 7}}, {{104},{ 7}}, {{ 24},{ 7}}, {{ 88},{ 7}}, +{{ 56},{ 7}}, {{120},{ 7}}, {{ 4},{ 7}}, {{ 68},{ 7}}, {{ 36},{ 7}}, +{{100},{ 7}}, {{ 20},{ 7}}, {{ 84},{ 7}}, {{ 52},{ 7}}, {{116},{ 7}}, +{{ 3},{ 8}}, {{131},{ 8}}, {{ 67},{ 8}}, {{195},{ 8}}, {{ 35},{ 8}}, +{{163},{ 8}}, {{ 99},{ 8}}, {{227},{ 8}} +}; + +local const ct_data static_dtree[D_CODES] = { +{{ 0},{ 5}}, {{16},{ 5}}, {{ 8},{ 5}}, {{24},{ 5}}, {{ 4},{ 5}}, +{{20},{ 5}}, {{12},{ 5}}, {{28},{ 5}}, {{ 2},{ 5}}, {{18},{ 5}}, +{{10},{ 5}}, {{26},{ 5}}, {{ 6},{ 5}}, {{22},{ 5}}, {{14},{ 5}}, +{{30},{ 5}}, {{ 1},{ 5}}, {{17},{ 5}}, {{ 9},{ 5}}, {{25},{ 5}}, +{{ 5},{ 5}}, {{21},{ 5}}, {{13},{ 5}}, {{29},{ 5}}, {{ 3},{ 5}}, +{{19},{ 5}}, {{11},{ 5}}, {{27},{ 5}}, {{ 7},{ 5}}, {{23},{ 5}} +}; + +const uch ZLIB_INTERNAL _dist_code[DIST_CODE_LEN] = { + 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, + 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, +10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, +11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, +12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, +13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, +13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, +14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, +14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, +14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, +15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, +15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, +15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 16, 17, +18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, +23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, +24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, +26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, +26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, +27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, +27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, +28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, +28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, +28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, +29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, +29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, +29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29 +}; + +const uch ZLIB_INTERNAL _length_code[MAX_MATCH-MIN_MATCH+1]= { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, +13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, +17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, +19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, +21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, +22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, +23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, +24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, +25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, +25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, +26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, +26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, +27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28 +}; + +local const int base_length[LENGTH_CODES] = { +0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56, +64, 80, 96, 112, 128, 160, 192, 224, 0 +}; + +local const int base_dist[D_CODES] = { + 0, 1, 2, 3, 4, 6, 8, 12, 16, 24, + 32, 48, 64, 96, 128, 192, 256, 384, 512, 768, + 1024, 1536, 2048, 3072, 4096, 6144, 8192, 12288, 16384, 24576 +}; + diff --git a/Minecraft.Client/Common/zlib/uncompr.c b/Minecraft.Client/Common/zlib/uncompr.c new file mode 100644 index 00000000..242e9493 --- /dev/null +++ b/Minecraft.Client/Common/zlib/uncompr.c @@ -0,0 +1,59 @@ +/* uncompr.c -- decompress a memory buffer + * Copyright (C) 1995-2003, 2010 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#define ZLIB_INTERNAL +#include "zlib.h" + +/* =========================================================================== + Decompresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total + size of the destination buffer, which must be large enough to hold the + entire uncompressed data. (The size of the uncompressed data must have + been saved previously by the compressor and transmitted to the decompressor + by some mechanism outside the scope of this compression library.) + Upon exit, destLen is the actual size of the compressed buffer. + + uncompress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer, or Z_DATA_ERROR if the input data was corrupted. +*/ +int ZEXPORT uncompress (dest, destLen, source, sourceLen) + Bytef *dest; + uLongf *destLen; + const Bytef *source; + uLong sourceLen; +{ + z_stream stream; + int err; + + stream.next_in = (z_const Bytef *)source; + stream.avail_in = (uInt)sourceLen; + /* Check for source > 64K on 16-bit machine: */ + if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; + + stream.next_out = dest; + stream.avail_out = (uInt)*destLen; + if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; + + stream.zalloc = (alloc_func)0; + stream.zfree = (free_func)0; + + err = inflateInit(&stream); + if (err != Z_OK) return err; + + err = inflate(&stream, Z_FINISH); + if (err != Z_STREAM_END) { + inflateEnd(&stream); + if (err == Z_NEED_DICT || (err == Z_BUF_ERROR && stream.avail_in == 0)) + return Z_DATA_ERROR; + return err; + } + *destLen = stream.total_out; + + err = inflateEnd(&stream); + return err; +} diff --git a/Minecraft.Client/Common/zlib/zconf.h b/Minecraft.Client/Common/zlib/zconf.h new file mode 100644 index 00000000..9987a775 --- /dev/null +++ b/Minecraft.Client/Common/zlib/zconf.h @@ -0,0 +1,511 @@ +/* zconf.h -- configuration of the zlib compression library + * Copyright (C) 1995-2013 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#ifndef ZCONF_H +#define ZCONF_H + +/* + * If you *really* need a unique prefix for all types and library functions, + * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. + * Even better than compiling with -DZ_PREFIX would be to use configure to set + * this permanently in zconf.h using "./configure --zprefix". + */ +#ifdef Z_PREFIX /* may be set to #if 1 by ./configure */ +# define Z_PREFIX_SET + +/* all linked symbols */ +# define _dist_code z__dist_code +# define _length_code z__length_code +# define _tr_align z__tr_align +# define _tr_flush_bits z__tr_flush_bits +# define _tr_flush_block z__tr_flush_block +# define _tr_init z__tr_init +# define _tr_stored_block z__tr_stored_block +# define _tr_tally z__tr_tally +# define adler32 z_adler32 +# define adler32_combine z_adler32_combine +# define adler32_combine64 z_adler32_combine64 +# ifndef Z_SOLO +# define compress z_compress +# define compress2 z_compress2 +# define compressBound z_compressBound +# endif +# define crc32 z_crc32 +# define crc32_combine z_crc32_combine +# define crc32_combine64 z_crc32_combine64 +# define deflate z_deflate +# define deflateBound z_deflateBound +# define deflateCopy z_deflateCopy +# define deflateEnd z_deflateEnd +# define deflateInit2_ z_deflateInit2_ +# define deflateInit_ z_deflateInit_ +# define deflateParams z_deflateParams +# define deflatePending z_deflatePending +# define deflatePrime z_deflatePrime +# define deflateReset z_deflateReset +# define deflateResetKeep z_deflateResetKeep +# define deflateSetDictionary z_deflateSetDictionary +# define deflateSetHeader z_deflateSetHeader +# define deflateTune z_deflateTune +# define deflate_copyright z_deflate_copyright +# define get_crc_table z_get_crc_table +# ifndef Z_SOLO +# define gz_error z_gz_error +# define gz_intmax z_gz_intmax +# define gz_strwinerror z_gz_strwinerror +# define gzbuffer z_gzbuffer +# define gzclearerr z_gzclearerr +# define gzclose z_gzclose +# define gzclose_r z_gzclose_r +# define gzclose_w z_gzclose_w +# define gzdirect z_gzdirect +# define gzdopen z_gzdopen +# define gzeof z_gzeof +# define gzerror z_gzerror +# define gzflush z_gzflush +# define gzgetc z_gzgetc +# define gzgetc_ z_gzgetc_ +# define gzgets z_gzgets +# define gzoffset z_gzoffset +# define gzoffset64 z_gzoffset64 +# define gzopen z_gzopen +# define gzopen64 z_gzopen64 +# ifdef _WIN32 +# define gzopen_w z_gzopen_w +# endif +# define gzprintf z_gzprintf +# define gzvprintf z_gzvprintf +# define gzputc z_gzputc +# define gzputs z_gzputs +# define gzread z_gzread +# define gzrewind z_gzrewind +# define gzseek z_gzseek +# define gzseek64 z_gzseek64 +# define gzsetparams z_gzsetparams +# define gztell z_gztell +# define gztell64 z_gztell64 +# define gzungetc z_gzungetc +# define gzwrite z_gzwrite +# endif +# define inflate z_inflate +# define inflateBack z_inflateBack +# define inflateBackEnd z_inflateBackEnd +# define inflateBackInit_ z_inflateBackInit_ +# define inflateCopy z_inflateCopy +# define inflateEnd z_inflateEnd +# define inflateGetHeader z_inflateGetHeader +# define inflateInit2_ z_inflateInit2_ +# define inflateInit_ z_inflateInit_ +# define inflateMark z_inflateMark +# define inflatePrime z_inflatePrime +# define inflateReset z_inflateReset +# define inflateReset2 z_inflateReset2 +# define inflateSetDictionary z_inflateSetDictionary +# define inflateGetDictionary z_inflateGetDictionary +# define inflateSync z_inflateSync +# define inflateSyncPoint z_inflateSyncPoint +# define inflateUndermine z_inflateUndermine +# define inflateResetKeep z_inflateResetKeep +# define inflate_copyright z_inflate_copyright +# define inflate_fast z_inflate_fast +# define inflate_table z_inflate_table +# ifndef Z_SOLO +# define uncompress z_uncompress +# endif +# define zError z_zError +# ifndef Z_SOLO +# define zcalloc z_zcalloc +# define zcfree z_zcfree +# endif +# define zlibCompileFlags z_zlibCompileFlags +# define zlibVersion z_zlibVersion + +/* all zlib typedefs in zlib.h and zconf.h */ +# define Byte z_Byte +# define Bytef z_Bytef +# define alloc_func z_alloc_func +# define charf z_charf +# define free_func z_free_func +# ifndef Z_SOLO +# define gzFile z_gzFile +# endif +# define gz_header z_gz_header +# define gz_headerp z_gz_headerp +# define in_func z_in_func +# define intf z_intf +# define out_func z_out_func +# define uInt z_uInt +# define uIntf z_uIntf +# define uLong z_uLong +# define uLongf z_uLongf +# define voidp z_voidp +# define voidpc z_voidpc +# define voidpf z_voidpf + +/* all zlib structs in zlib.h and zconf.h */ +# define gz_header_s z_gz_header_s +# define internal_state z_internal_state + +#endif + +#if defined(__MSDOS__) && !defined(MSDOS) +# define MSDOS +#endif +#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) +# define OS2 +#endif +#if defined(_WINDOWS) && !defined(WINDOWS) +# define WINDOWS +#endif +#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__) +# ifndef WIN32 +# define WIN32 +# endif +#endif +#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) +# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) +# ifndef SYS16BIT +# define SYS16BIT +# endif +# endif +#endif + +/* + * Compile with -DMAXSEG_64K if the alloc function cannot allocate more + * than 64k bytes at a time (needed on systems with 16-bit int). + */ +#ifdef SYS16BIT +# define MAXSEG_64K +#endif +#ifdef MSDOS +# define UNALIGNED_OK +#endif + +#ifdef __STDC_VERSION__ +# ifndef STDC +# define STDC +# endif +# if __STDC_VERSION__ >= 199901L +# ifndef STDC99 +# define STDC99 +# endif +# endif +#endif +#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) +# define STDC +#endif +#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) +# define STDC +#endif +#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) +# define STDC +#endif +#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) +# define STDC +#endif + +#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ +# define STDC +#endif + +#ifndef STDC +# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ +# define const /* note: need a more gentle solution here */ +# endif +#endif + +#if defined(ZLIB_CONST) && !defined(z_const) +# define z_const const +#else +# define z_const +#endif + +/* Some Mac compilers merge all .h files incorrectly: */ +#if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__) +# define NO_DUMMY_DECL +#endif + +/* Maximum value for memLevel in deflateInit2 */ +#ifndef MAX_MEM_LEVEL +# ifdef MAXSEG_64K +# define MAX_MEM_LEVEL 8 +# else +# define MAX_MEM_LEVEL 9 +# endif +#endif + +/* Maximum value for windowBits in deflateInit2 and inflateInit2. + * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files + * created by gzip. (Files created by minigzip can still be extracted by + * gzip.) + */ +#ifndef MAX_WBITS +# define MAX_WBITS 15 /* 32K LZ77 window */ +#endif + +/* The memory requirements for deflate are (in bytes): + (1 << (windowBits+2)) + (1 << (memLevel+9)) + that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) + plus a few kilobytes for small objects. For example, if you want to reduce + the default memory requirements from 256K to 128K, compile with + make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" + Of course this will generally degrade compression (there's no free lunch). + + The memory requirements for inflate are (in bytes) 1 << windowBits + that is, 32K for windowBits=15 (default value) plus a few kilobytes + for small objects. +*/ + + /* Type declarations */ + +#ifndef OF /* function prototypes */ +# ifdef STDC +# define OF(args) args +# else +# define OF(args) () +# endif +#endif + +#ifndef Z_ARG /* function prototypes for stdarg */ +# if defined(STDC) || defined(Z_HAVE_STDARG_H) +# define Z_ARG(args) args +# else +# define Z_ARG(args) () +# endif +#endif + +/* The following definitions for FAR are needed only for MSDOS mixed + * model programming (small or medium model with some far allocations). + * This was tested only with MSC; for other MSDOS compilers you may have + * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, + * just define FAR to be empty. + */ +#ifdef SYS16BIT +# if defined(M_I86SM) || defined(M_I86MM) + /* MSC small or medium model */ +# define SMALL_MEDIUM +# ifdef _MSC_VER +# define FAR _far +# else +# define FAR far +# endif +# endif +# if (defined(__SMALL__) || defined(__MEDIUM__)) + /* Turbo C small or medium model */ +# define SMALL_MEDIUM +# ifdef __BORLANDC__ +# define FAR _far +# else +# define FAR far +# endif +# endif +#endif + +#if defined(WINDOWS) || defined(WIN32) + /* If building or using zlib as a DLL, define ZLIB_DLL. + * This is not mandatory, but it offers a little performance increase. + */ +# ifdef ZLIB_DLL +# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) +# ifdef ZLIB_INTERNAL +# define ZEXTERN extern __declspec(dllexport) +# else +# define ZEXTERN extern __declspec(dllimport) +# endif +# endif +# endif /* ZLIB_DLL */ + /* If building or using zlib with the WINAPI/WINAPIV calling convention, + * define ZLIB_WINAPI. + * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. + */ +# ifdef ZLIB_WINAPI +# ifdef FAR +# undef FAR +# endif +# include + /* No need for _export, use ZLIB.DEF instead. */ + /* For complete Windows compatibility, use WINAPI, not __stdcall. */ +# define ZEXPORT WINAPI +# ifdef WIN32 +# define ZEXPORTVA WINAPIV +# else +# define ZEXPORTVA FAR CDECL +# endif +# endif +#endif + +#if defined (__BEOS__) +# ifdef ZLIB_DLL +# ifdef ZLIB_INTERNAL +# define ZEXPORT __declspec(dllexport) +# define ZEXPORTVA __declspec(dllexport) +# else +# define ZEXPORT __declspec(dllimport) +# define ZEXPORTVA __declspec(dllimport) +# endif +# endif +#endif + +#ifndef ZEXTERN +# define ZEXTERN extern +#endif +#ifndef ZEXPORT +# define ZEXPORT +#endif +#ifndef ZEXPORTVA +# define ZEXPORTVA +#endif + +#ifndef FAR +# define FAR +#endif + +#if !defined(__MACTYPES__) +typedef unsigned char Byte; /* 8 bits */ +#endif +typedef unsigned int uInt; /* 16 bits or more */ +typedef unsigned long uLong; /* 32 bits or more */ + +#ifdef SMALL_MEDIUM + /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ +# define Bytef Byte FAR +#else + typedef Byte FAR Bytef; +#endif +typedef char FAR charf; +typedef int FAR intf; +typedef uInt FAR uIntf; +typedef uLong FAR uLongf; + +#ifdef STDC + typedef void const *voidpc; + typedef void FAR *voidpf; + typedef void *voidp; +#else + typedef Byte const *voidpc; + typedef Byte FAR *voidpf; + typedef Byte *voidp; +#endif + +#if !defined(Z_U4) && !defined(Z_SOLO) && defined(STDC) +# include +# if (UINT_MAX == 0xffffffffUL) +# define Z_U4 unsigned +# elif (ULONG_MAX == 0xffffffffUL) +# define Z_U4 unsigned long +# elif (USHRT_MAX == 0xffffffffUL) +# define Z_U4 unsigned short +# endif +#endif + +#ifdef Z_U4 + typedef Z_U4 z_crc_t; +#else + typedef unsigned long z_crc_t; +#endif + +#ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */ +# define Z_HAVE_UNISTD_H +#endif + +#ifdef HAVE_STDARG_H /* may be set to #if 1 by ./configure */ +# define Z_HAVE_STDARG_H +#endif + +#ifdef STDC +# ifndef Z_SOLO +# include /* for off_t */ +# endif +#endif + +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +# ifndef Z_SOLO +# include /* for va_list */ +# endif +#endif + +#ifdef _WIN32 +# ifndef Z_SOLO +# include /* for wchar_t */ +# endif +#endif + +/* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and + * "#define _LARGEFILE64_SOURCE 1" as requesting 64-bit operations, (even + * though the former does not conform to the LFS document), but considering + * both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as + * equivalently requesting no 64-bit operations + */ +#if defined(_LARGEFILE64_SOURCE) && -_LARGEFILE64_SOURCE - -1 == 1 +# undef _LARGEFILE64_SOURCE +#endif + +#if defined(__WATCOMC__) && !defined(Z_HAVE_UNISTD_H) +# define Z_HAVE_UNISTD_H +#endif +#ifndef Z_SOLO +# if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE) +# include /* for SEEK_*, off_t, and _LFS64_LARGEFILE */ +# ifdef VMS +# include /* for off_t */ +# endif +# ifndef z_off_t +# define z_off_t off_t +# endif +# endif +#endif + +#if defined(_LFS64_LARGEFILE) && _LFS64_LARGEFILE-0 +# define Z_LFS64 +#endif + +#if defined(_LARGEFILE64_SOURCE) && defined(Z_LFS64) +# define Z_LARGE64 +#endif + +#if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS-0 == 64 && defined(Z_LFS64) +# define Z_WANT64 +#endif + +#if !defined(SEEK_SET) && !defined(Z_SOLO) +# define SEEK_SET 0 /* Seek from beginning of file. */ +# define SEEK_CUR 1 /* Seek from current position. */ +# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ +#endif + +#ifndef z_off_t +# define z_off_t long +#endif + +#if !defined(_WIN32) && defined(Z_LARGE64) +# define z_off64_t off64_t +#else +# if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO) +# define z_off64_t __int64 +# else +# define z_off64_t z_off_t +# endif +#endif + +/* MVS linker does not support external names larger than 8 bytes */ +#if defined(__MVS__) + #pragma map(deflateInit_,"DEIN") + #pragma map(deflateInit2_,"DEIN2") + #pragma map(deflateEnd,"DEEND") + #pragma map(deflateBound,"DEBND") + #pragma map(inflateInit_,"ININ") + #pragma map(inflateInit2_,"ININ2") + #pragma map(inflateEnd,"INEND") + #pragma map(inflateSync,"INSY") + #pragma map(inflateSetDictionary,"INSEDI") + #pragma map(compressBound,"CMBND") + #pragma map(inflate_table,"INTABL") + #pragma map(inflate_fast,"INFA") + #pragma map(inflate_copyright,"INCOPY") +#endif + +#endif /* ZCONF_H */ diff --git a/Minecraft.Client/Common/zlib/zlib.h b/Minecraft.Client/Common/zlib/zlib.h new file mode 100644 index 00000000..3e0c7672 --- /dev/null +++ b/Minecraft.Client/Common/zlib/zlib.h @@ -0,0 +1,1768 @@ +/* zlib.h -- interface of the 'zlib' general purpose compression library + version 1.2.8, April 28th, 2013 + + Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu + + + The data format used by the zlib library is described by RFCs (Request for + Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950 + (zlib format), rfc1951 (deflate format) and rfc1952 (gzip format). +*/ + +#ifndef ZLIB_H +#define ZLIB_H + +#include "zconf.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define ZLIB_VERSION "1.2.8" +#define ZLIB_VERNUM 0x1280 +#define ZLIB_VER_MAJOR 1 +#define ZLIB_VER_MINOR 2 +#define ZLIB_VER_REVISION 8 +#define ZLIB_VER_SUBREVISION 0 + +/* + The 'zlib' compression library provides in-memory compression and + decompression functions, including integrity checks of the uncompressed data. + This version of the library supports only one compression method (deflation) + but other algorithms will be added later and will have the same stream + interface. + + Compression can be done in a single step if the buffers are large enough, + or can be done by repeated calls of the compression function. In the latter + case, the application must provide more input and/or consume the output + (providing more output space) before each call. + + The compressed data format used by default by the in-memory functions is + the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped + around a deflate stream, which is itself documented in RFC 1951. + + The library also supports reading and writing files in gzip (.gz) format + with an interface similar to that of stdio using the functions that start + with "gz". The gzip format is different from the zlib format. gzip is a + gzip wrapper, documented in RFC 1952, wrapped around a deflate stream. + + This library can optionally read and write gzip streams in memory as well. + + The zlib format was designed to be compact and fast for use in memory + and on communications channels. The gzip format was designed for single- + file compression on file systems, has a larger header than zlib to maintain + directory information, and uses a different, slower check method than zlib. + + The library does not install any signal handler. The decoder checks + the consistency of the compressed data, so the library should never crash + even in case of corrupted input. +*/ + +typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); +typedef void (*free_func) OF((voidpf opaque, voidpf address)); + +struct internal_state; + +typedef struct z_stream_s { + z_const Bytef *next_in; /* next input byte */ + uInt avail_in; /* number of bytes available at next_in */ + uLong total_in; /* total number of input bytes read so far */ + + Bytef *next_out; /* next output byte should be put there */ + uInt avail_out; /* remaining free space at next_out */ + uLong total_out; /* total number of bytes output so far */ + + z_const char *msg; /* last error message, NULL if no error */ + struct internal_state FAR *state; /* not visible by applications */ + + alloc_func zalloc; /* used to allocate the internal state */ + free_func zfree; /* used to free the internal state */ + voidpf opaque; /* private data object passed to zalloc and zfree */ + + int data_type; /* best guess about the data type: binary or text */ + uLong adler; /* adler32 value of the uncompressed data */ + uLong reserved; /* reserved for future use */ +} z_stream; + +typedef z_stream FAR *z_streamp; + +/* + gzip header information passed to and from zlib routines. See RFC 1952 + for more details on the meanings of these fields. +*/ +typedef struct gz_header_s { + int text; /* true if compressed data believed to be text */ + uLong time; /* modification time */ + int xflags; /* extra flags (not used when writing a gzip file) */ + int os; /* operating system */ + Bytef *extra; /* pointer to extra field or Z_NULL if none */ + uInt extra_len; /* extra field length (valid if extra != Z_NULL) */ + uInt extra_max; /* space at extra (only when reading header) */ + Bytef *name; /* pointer to zero-terminated file name or Z_NULL */ + uInt name_max; /* space at name (only when reading header) */ + Bytef *comment; /* pointer to zero-terminated comment or Z_NULL */ + uInt comm_max; /* space at comment (only when reading header) */ + int hcrc; /* true if there was or will be a header crc */ + int done; /* true when done reading gzip header (not used + when writing a gzip file) */ +} gz_header; + +typedef gz_header FAR *gz_headerp; + +/* + The application must update next_in and avail_in when avail_in has dropped + to zero. It must update next_out and avail_out when avail_out has dropped + to zero. The application must initialize zalloc, zfree and opaque before + calling the init function. All other fields are set by the compression + library and must not be updated by the application. + + The opaque value provided by the application will be passed as the first + parameter for calls of zalloc and zfree. This can be useful for custom + memory management. The compression library attaches no meaning to the + opaque value. + + zalloc must return Z_NULL if there is not enough memory for the object. + If zlib is used in a multi-threaded application, zalloc and zfree must be + thread safe. + + On 16-bit systems, the functions zalloc and zfree must be able to allocate + exactly 65536 bytes, but will not be required to allocate more than this if + the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, pointers + returned by zalloc for objects of exactly 65536 bytes *must* have their + offset normalized to zero. The default allocation function provided by this + library ensures this (see zutil.c). To reduce memory requirements and avoid + any allocation of 64K objects, at the expense of compression ratio, compile + the library with -DMAX_WBITS=14 (see zconf.h). + + The fields total_in and total_out can be used for statistics or progress + reports. After compression, total_in holds the total size of the + uncompressed data and may be saved for use in the decompressor (particularly + if the decompressor wants to decompress everything in a single step). +*/ + + /* constants */ + +#define Z_NO_FLUSH 0 +#define Z_PARTIAL_FLUSH 1 +#define Z_SYNC_FLUSH 2 +#define Z_FULL_FLUSH 3 +#define Z_FINISH 4 +#define Z_BLOCK 5 +#define Z_TREES 6 +/* Allowed flush values; see deflate() and inflate() below for details */ + +#define Z_OK 0 +#define Z_STREAM_END 1 +#define Z_NEED_DICT 2 +#define Z_ERRNO (-1) +#define Z_STREAM_ERROR (-2) +#define Z_DATA_ERROR (-3) +#define Z_MEM_ERROR (-4) +#define Z_BUF_ERROR (-5) +#define Z_VERSION_ERROR (-6) +/* Return codes for the compression/decompression functions. Negative values + * are errors, positive values are used for special but normal events. + */ + +#define Z_NO_COMPRESSION 0 +#define Z_BEST_SPEED 1 +#define Z_BEST_COMPRESSION 9 +#define Z_DEFAULT_COMPRESSION (-1) +/* compression levels */ + +#define Z_FILTERED 1 +#define Z_HUFFMAN_ONLY 2 +#define Z_RLE 3 +#define Z_FIXED 4 +#define Z_DEFAULT_STRATEGY 0 +/* compression strategy; see deflateInit2() below for details */ + +#define Z_BINARY 0 +#define Z_TEXT 1 +#define Z_ASCII Z_TEXT /* for compatibility with 1.2.2 and earlier */ +#define Z_UNKNOWN 2 +/* Possible values of the data_type field (though see inflate()) */ + +#define Z_DEFLATED 8 +/* The deflate compression method (the only one supported in this version) */ + +#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ + +#define zlib_version zlibVersion() +/* for compatibility with versions < 1.0.2 */ + + + /* basic functions */ + +ZEXTERN const char * ZEXPORT zlibVersion OF((void)); +/* The application can compare zlibVersion and ZLIB_VERSION for consistency. + If the first character differs, the library code actually used is not + compatible with the zlib.h header file used by the application. This check + is automatically made by deflateInit and inflateInit. + */ + +/* +ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); + + Initializes the internal stream state for compression. The fields + zalloc, zfree and opaque must be initialized before by the caller. If + zalloc and zfree are set to Z_NULL, deflateInit updates them to use default + allocation functions. + + The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: + 1 gives best speed, 9 gives best compression, 0 gives no compression at all + (the input data is simply copied a block at a time). Z_DEFAULT_COMPRESSION + requests a default compromise between speed and compression (currently + equivalent to level 6). + + deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if level is not a valid compression level, or + Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible + with the version assumed by the caller (ZLIB_VERSION). msg is set to null + if there is no error message. deflateInit does not perform any compression: + this will be done by deflate(). +*/ + + +ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); +/* + deflate compresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may introduce + some output latency (reading input without producing any output) except when + forced to flush. + + The detailed semantics are as follows. deflate performs one or both of the + following actions: + + - Compress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in and avail_in are updated and + processing will resume at this point for the next call of deflate(). + + - Provide more output starting at next_out and update next_out and avail_out + accordingly. This action is forced if the parameter flush is non zero. + Forcing flush frequently degrades the compression ratio, so this parameter + should be set only when necessary (in interactive applications). Some + output may be provided even if flush is not set. + + Before the call of deflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming more + output, and updating avail_in or avail_out accordingly; avail_out should + never be zero before the call. The application can consume the compressed + output when it wants, for example when the output buffer is full (avail_out + == 0), or after each call of deflate(). If deflate returns Z_OK and with + zero avail_out, it must be called again after making room in the output + buffer because there might be more output pending. + + Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to + decide how much data to accumulate before producing output, in order to + maximize compression. + + If the parameter flush is set to Z_SYNC_FLUSH, all pending output is + flushed to the output buffer and the output is aligned on a byte boundary, so + that the decompressor can get all input data available so far. (In + particular avail_in is zero after the call if enough output space has been + provided before the call.) Flushing may degrade compression for some + compression algorithms and so it should be used only when necessary. This + completes the current deflate block and follows it with an empty stored block + that is three bits plus filler bits to the next byte, followed by four bytes + (00 00 ff ff). + + If flush is set to Z_PARTIAL_FLUSH, all pending output is flushed to the + output buffer, but the output is not aligned to a byte boundary. All of the + input data so far will be available to the decompressor, as for Z_SYNC_FLUSH. + This completes the current deflate block and follows it with an empty fixed + codes block that is 10 bits long. This assures that enough bytes are output + in order for the decompressor to finish the block before the empty fixed code + block. + + If flush is set to Z_BLOCK, a deflate block is completed and emitted, as + for Z_SYNC_FLUSH, but the output is not aligned on a byte boundary, and up to + seven bits of the current block are held to be written as the next byte after + the next deflate block is completed. In this case, the decompressor may not + be provided enough bits at this point in order to complete decompression of + the data provided so far to the compressor. It may need to wait for the next + block to be emitted. This is for advanced applications that need to control + the emission of deflate blocks. + + If flush is set to Z_FULL_FLUSH, all output is flushed as with + Z_SYNC_FLUSH, and the compression state is reset so that decompression can + restart from this point if previous compressed data has been damaged or if + random access is desired. Using Z_FULL_FLUSH too often can seriously degrade + compression. + + If deflate returns with avail_out == 0, this function must be called again + with the same value of the flush parameter and more output space (updated + avail_out), until the flush is complete (deflate returns with non-zero + avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that + avail_out is greater than six to avoid repeated flush markers due to + avail_out == 0 on return. + + If the parameter flush is set to Z_FINISH, pending input is processed, + pending output is flushed and deflate returns with Z_STREAM_END if there was + enough output space; if deflate returns with Z_OK, this function must be + called again with Z_FINISH and more output space (updated avail_out) but no + more input data, until it returns with Z_STREAM_END or an error. After + deflate has returned Z_STREAM_END, the only possible operations on the stream + are deflateReset or deflateEnd. + + Z_FINISH can be used immediately after deflateInit if all the compression + is to be done in a single step. In this case, avail_out must be at least the + value returned by deflateBound (see below). Then deflate is guaranteed to + return Z_STREAM_END. If not enough output space is provided, deflate will + not return Z_STREAM_END, and it must be called again as described above. + + deflate() sets strm->adler to the adler32 checksum of all input read + so far (that is, total_in bytes). + + deflate() may update strm->data_type if it can make a good guess about + the input data type (Z_BINARY or Z_TEXT). In doubt, the data is considered + binary. This field is only for information purposes and does not affect the + compression algorithm in any manner. + + deflate() returns Z_OK if some progress has been made (more input + processed or more output produced), Z_STREAM_END if all input has been + consumed and all output has been produced (only when flush is set to + Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example + if next_in or next_out was Z_NULL), Z_BUF_ERROR if no progress is possible + (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not + fatal, and deflate() can be called again with more input and more output + space to continue compressing. +*/ + + +ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any pending + output. + + deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the + stream state was inconsistent, Z_DATA_ERROR if the stream was freed + prematurely (some input or output was discarded). In the error case, msg + may be set but then points to a static string (which must not be + deallocated). +*/ + + +/* +ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); + + Initializes the internal stream state for decompression. The fields + next_in, avail_in, zalloc, zfree and opaque must be initialized before by + the caller. If next_in is not Z_NULL and avail_in is large enough (the + exact value depends on the compression method), inflateInit determines the + compression method from the zlib header and allocates all data structures + accordingly; otherwise the allocation will be deferred to the first call of + inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to + use default allocation functions. + + inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_VERSION_ERROR if the zlib library version is incompatible with the + version assumed by the caller, or Z_STREAM_ERROR if the parameters are + invalid, such as a null pointer to the structure. msg is set to null if + there is no error message. inflateInit does not perform any decompression + apart from possibly reading the zlib header if present: actual decompression + will be done by inflate(). (So next_in and avail_in may be modified, but + next_out and avail_out are unused and unchanged.) The current implementation + of inflateInit() does not process any header information -- that is deferred + until inflate() is called. +*/ + + +ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); +/* + inflate decompresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may introduce + some output latency (reading input without producing any output) except when + forced to flush. + + The detailed semantics are as follows. inflate performs one or both of the + following actions: + + - Decompress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in is updated and processing will + resume at this point for the next call of inflate(). + + - Provide more output starting at next_out and update next_out and avail_out + accordingly. inflate() provides as much output as possible, until there is + no more input data or no more space in the output buffer (see below about + the flush parameter). + + Before the call of inflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming more + output, and updating the next_* and avail_* values accordingly. The + application can consume the uncompressed output when it wants, for example + when the output buffer is full (avail_out == 0), or after each call of + inflate(). If inflate returns Z_OK and with zero avail_out, it must be + called again after making room in the output buffer because there might be + more output pending. + + The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, Z_FINISH, + Z_BLOCK, or Z_TREES. Z_SYNC_FLUSH requests that inflate() flush as much + output as possible to the output buffer. Z_BLOCK requests that inflate() + stop if and when it gets to the next deflate block boundary. When decoding + the zlib or gzip format, this will cause inflate() to return immediately + after the header and before the first block. When doing a raw inflate, + inflate() will go ahead and process the first block, and will return when it + gets to the end of that block, or when it runs out of data. + + The Z_BLOCK option assists in appending to or combining deflate streams. + Also to assist in this, on return inflate() will set strm->data_type to the + number of unused bits in the last byte taken from strm->next_in, plus 64 if + inflate() is currently decoding the last block in the deflate stream, plus + 128 if inflate() returned immediately after decoding an end-of-block code or + decoding the complete header up to just before the first byte of the deflate + stream. The end-of-block will not be indicated until all of the uncompressed + data from that block has been written to strm->next_out. The number of + unused bits may in general be greater than seven, except when bit 7 of + data_type is set, in which case the number of unused bits will be less than + eight. data_type is set as noted here every time inflate() returns for all + flush options, and so can be used to determine the amount of currently + consumed input in bits. + + The Z_TREES option behaves as Z_BLOCK does, but it also returns when the + end of each deflate block header is reached, before any actual data in that + block is decoded. This allows the caller to determine the length of the + deflate block header for later use in random access within a deflate block. + 256 is added to the value of strm->data_type when inflate() returns + immediately after reaching the end of the deflate block header. + + inflate() should normally be called until it returns Z_STREAM_END or an + error. However if all decompression is to be performed in a single step (a + single call of inflate), the parameter flush should be set to Z_FINISH. In + this case all pending input is processed and all pending output is flushed; + avail_out must be large enough to hold all of the uncompressed data for the + operation to complete. (The size of the uncompressed data may have been + saved by the compressor for this purpose.) The use of Z_FINISH is not + required to perform an inflation in one step. However it may be used to + inform inflate that a faster approach can be used for the single inflate() + call. Z_FINISH also informs inflate to not maintain a sliding window if the + stream completes, which reduces inflate's memory footprint. If the stream + does not complete, either because not all of the stream is provided or not + enough output space is provided, then a sliding window will be allocated and + inflate() can be called again to continue the operation as if Z_NO_FLUSH had + been used. + + In this implementation, inflate() always flushes as much output as + possible to the output buffer, and always uses the faster approach on the + first call. So the effects of the flush parameter in this implementation are + on the return value of inflate() as noted below, when inflate() returns early + when Z_BLOCK or Z_TREES is used, and when inflate() avoids the allocation of + memory for a sliding window when Z_FINISH is used. + + If a preset dictionary is needed after this call (see inflateSetDictionary + below), inflate sets strm->adler to the Adler-32 checksum of the dictionary + chosen by the compressor and returns Z_NEED_DICT; otherwise it sets + strm->adler to the Adler-32 checksum of all output produced so far (that is, + total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described + below. At the end of the stream, inflate() checks that its computed adler32 + checksum is equal to that saved by the compressor and returns Z_STREAM_END + only if the checksum is correct. + + inflate() can decompress and check either zlib-wrapped or gzip-wrapped + deflate data. The header type is detected automatically, if requested when + initializing with inflateInit2(). Any information contained in the gzip + header is not retained, so applications that need that information should + instead use raw inflate, see inflateInit2() below, or inflateBack() and + perform their own processing of the gzip header and trailer. When processing + gzip-wrapped deflate data, strm->adler32 is set to the CRC-32 of the output + producted so far. The CRC-32 is checked against the gzip trailer. + + inflate() returns Z_OK if some progress has been made (more input processed + or more output produced), Z_STREAM_END if the end of the compressed data has + been reached and all uncompressed output has been produced, Z_NEED_DICT if a + preset dictionary is needed at this point, Z_DATA_ERROR if the input data was + corrupted (input stream not conforming to the zlib format or incorrect check + value), Z_STREAM_ERROR if the stream structure was inconsistent (for example + next_in or next_out was Z_NULL), Z_MEM_ERROR if there was not enough memory, + Z_BUF_ERROR if no progress is possible or if there was not enough room in the + output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and + inflate() can be called again with more input and more output space to + continue decompressing. If Z_DATA_ERROR is returned, the application may + then call inflateSync() to look for a good compression block if a partial + recovery of the data is desired. +*/ + + +ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any pending + output. + + inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state + was inconsistent. In the error case, msg may be set but then points to a + static string (which must not be deallocated). +*/ + + + /* Advanced functions */ + +/* + The following functions are needed only in some special applications. +*/ + +/* +ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, + int level, + int method, + int windowBits, + int memLevel, + int strategy)); + + This is another version of deflateInit with more compression options. The + fields next_in, zalloc, zfree and opaque must be initialized before by the + caller. + + The method parameter is the compression method. It must be Z_DEFLATED in + this version of the library. + + The windowBits parameter is the base two logarithm of the window size + (the size of the history buffer). It should be in the range 8..15 for this + version of the library. Larger values of this parameter result in better + compression at the expense of memory usage. The default value is 15 if + deflateInit is used instead. + + windowBits can also be -8..-15 for raw deflate. In this case, -windowBits + determines the window size. deflate() will then generate raw deflate data + with no zlib header or trailer, and will not compute an adler32 check value. + + windowBits can also be greater than 15 for optional gzip encoding. Add + 16 to windowBits to write a simple gzip header and trailer around the + compressed data instead of a zlib wrapper. The gzip header will have no + file name, no extra data, no comment, no modification time (set to zero), no + header crc, and the operating system will be set to 255 (unknown). If a + gzip stream is being written, strm->adler is a crc32 instead of an adler32. + + The memLevel parameter specifies how much memory should be allocated + for the internal compression state. memLevel=1 uses minimum memory but is + slow and reduces compression ratio; memLevel=9 uses maximum memory for + optimal speed. The default value is 8. See zconf.h for total memory usage + as a function of windowBits and memLevel. + + The strategy parameter is used to tune the compression algorithm. Use the + value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a + filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no + string match), or Z_RLE to limit match distances to one (run-length + encoding). Filtered data consists mostly of small values with a somewhat + random distribution. In this case, the compression algorithm is tuned to + compress them better. The effect of Z_FILTERED is to force more Huffman + coding and less string matching; it is somewhat intermediate between + Z_DEFAULT_STRATEGY and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as + fast as Z_HUFFMAN_ONLY, but give better compression for PNG image data. The + strategy parameter only affects the compression ratio but not the + correctness of the compressed output even if it is not set appropriately. + Z_FIXED prevents the use of dynamic Huffman codes, allowing for a simpler + decoder for special applications. + + deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if any parameter is invalid (such as an invalid + method), or Z_VERSION_ERROR if the zlib library version (zlib_version) is + incompatible with the version assumed by the caller (ZLIB_VERSION). msg is + set to null if there is no error message. deflateInit2 does not perform any + compression: this will be done by deflate(). +*/ + +ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, + const Bytef *dictionary, + uInt dictLength)); +/* + Initializes the compression dictionary from the given byte sequence + without producing any compressed output. When using the zlib format, this + function must be called immediately after deflateInit, deflateInit2 or + deflateReset, and before any call of deflate. When doing raw deflate, this + function must be called either before any call of deflate, or immediately + after the completion of a deflate block, i.e. after all input has been + consumed and all output has been delivered when using any of the flush + options Z_BLOCK, Z_PARTIAL_FLUSH, Z_SYNC_FLUSH, or Z_FULL_FLUSH. The + compressor and decompressor must use exactly the same dictionary (see + inflateSetDictionary). + + The dictionary should consist of strings (byte sequences) that are likely + to be encountered later in the data to be compressed, with the most commonly + used strings preferably put towards the end of the dictionary. Using a + dictionary is most useful when the data to be compressed is short and can be + predicted with good accuracy; the data can then be compressed better than + with the default empty dictionary. + + Depending on the size of the compression data structures selected by + deflateInit or deflateInit2, a part of the dictionary may in effect be + discarded, for example if the dictionary is larger than the window size + provided in deflateInit or deflateInit2. Thus the strings most likely to be + useful should be put at the end of the dictionary, not at the front. In + addition, the current implementation of deflate will use at most the window + size minus 262 bytes of the provided dictionary. + + Upon return of this function, strm->adler is set to the adler32 value + of the dictionary; the decompressor may later use this value to determine + which dictionary has been used by the compressor. (The adler32 value + applies to the whole dictionary even if only a subset of the dictionary is + actually used by the compressor.) If a raw deflate was requested, then the + adler32 value is not computed and strm->adler is not set. + + deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a + parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is + inconsistent (for example if deflate has already been called for this stream + or if not at a block boundary for raw deflate). deflateSetDictionary does + not perform any compression: this will be done by deflate(). +*/ + +ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, + z_streamp source)); +/* + Sets the destination stream as a complete copy of the source stream. + + This function can be useful when several compression strategies will be + tried, for example when there are several ways of pre-processing the input + data with a filter. The streams that will be discarded should then be freed + by calling deflateEnd. Note that deflateCopy duplicates the internal + compression state which can be quite large, so this strategy is slow and can + consume lots of memory. + + deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being Z_NULL). msg is left unchanged in both source and + destination. +*/ + +ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); +/* + This function is equivalent to deflateEnd followed by deflateInit, + but does not free and reallocate all the internal compression state. The + stream will keep the same compression level and any other attributes that + may have been set by deflateInit2. + + deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being Z_NULL). +*/ + +ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, + int level, + int strategy)); +/* + Dynamically update the compression level and compression strategy. The + interpretation of level and strategy is as in deflateInit2. This can be + used to switch between compression and straight copy of the input data, or + to switch to a different kind of input data requiring a different strategy. + If the compression level is changed, the input available so far is + compressed with the old level (and may be flushed); the new level will take + effect only at the next call of deflate(). + + Before the call of deflateParams, the stream state must be set as for + a call of deflate(), since the currently available input may have to be + compressed and flushed. In particular, strm->avail_out must be non-zero. + + deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source + stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR if + strm->avail_out was zero. +*/ + +ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm, + int good_length, + int max_lazy, + int nice_length, + int max_chain)); +/* + Fine tune deflate's internal compression parameters. This should only be + used by someone who understands the algorithm used by zlib's deflate for + searching for the best matching string, and even then only by the most + fanatic optimizer trying to squeeze out the last compressed bit for their + specific input data. Read the deflate.c source code for the meaning of the + max_lazy, good_length, nice_length, and max_chain parameters. + + deflateTune() can be called after deflateInit() or deflateInit2(), and + returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream. + */ + +ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, + uLong sourceLen)); +/* + deflateBound() returns an upper bound on the compressed size after + deflation of sourceLen bytes. It must be called after deflateInit() or + deflateInit2(), and after deflateSetHeader(), if used. This would be used + to allocate an output buffer for deflation in a single pass, and so would be + called before deflate(). If that first deflate() call is provided the + sourceLen input bytes, an output buffer allocated to the size returned by + deflateBound(), and the flush value Z_FINISH, then deflate() is guaranteed + to return Z_STREAM_END. Note that it is possible for the compressed size to + be larger than the value returned by deflateBound() if flush options other + than Z_FINISH or Z_NO_FLUSH are used. +*/ + +ZEXTERN int ZEXPORT deflatePending OF((z_streamp strm, + unsigned *pending, + int *bits)); +/* + deflatePending() returns the number of bytes and bits of output that have + been generated, but not yet provided in the available output. The bytes not + provided would be due to the available output space having being consumed. + The number of bits of output not provided are between 0 and 7, where they + await more bits to join them in order to fill out a full byte. If pending + or bits are Z_NULL, then those values are not set. + + deflatePending returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. + */ + +ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, + int bits, + int value)); +/* + deflatePrime() inserts bits in the deflate output stream. The intent + is that this function is used to start off the deflate output with the bits + leftover from a previous deflate stream when appending to it. As such, this + function can only be used for raw deflate, and must be used before the first + deflate() call after a deflateInit2() or deflateReset(). bits must be less + than or equal to 16, and that many of the least significant bits of value + will be inserted in the output. + + deflatePrime returns Z_OK if success, Z_BUF_ERROR if there was not enough + room in the internal buffer to insert the bits, or Z_STREAM_ERROR if the + source stream state was inconsistent. +*/ + +ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, + gz_headerp head)); +/* + deflateSetHeader() provides gzip header information for when a gzip + stream is requested by deflateInit2(). deflateSetHeader() may be called + after deflateInit2() or deflateReset() and before the first call of + deflate(). The text, time, os, extra field, name, and comment information + in the provided gz_header structure are written to the gzip header (xflag is + ignored -- the extra flags are set according to the compression level). The + caller must assure that, if not Z_NULL, name and comment are terminated with + a zero byte, and that if extra is not Z_NULL, that extra_len bytes are + available there. If hcrc is true, a gzip header crc is included. Note that + the current versions of the command-line version of gzip (up through version + 1.3.x) do not support header crc's, and will report that it is a "multi-part + gzip file" and give up. + + If deflateSetHeader is not used, the default gzip header has text false, + the time set to zero, and os set to 255, with no extra, name, or comment + fields. The gzip header is returned to the default state by deflateReset(). + + deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +/* +ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, + int windowBits)); + + This is another version of inflateInit with an extra parameter. The + fields next_in, avail_in, zalloc, zfree and opaque must be initialized + before by the caller. + + The windowBits parameter is the base two logarithm of the maximum window + size (the size of the history buffer). It should be in the range 8..15 for + this version of the library. The default value is 15 if inflateInit is used + instead. windowBits must be greater than or equal to the windowBits value + provided to deflateInit2() while compressing, or it must be equal to 15 if + deflateInit2() was not used. If a compressed stream with a larger window + size is given as input, inflate() will return with the error code + Z_DATA_ERROR instead of trying to allocate a larger window. + + windowBits can also be zero to request that inflate use the window size in + the zlib header of the compressed stream. + + windowBits can also be -8..-15 for raw inflate. In this case, -windowBits + determines the window size. inflate() will then process raw deflate data, + not looking for a zlib or gzip header, not generating a check value, and not + looking for any check values for comparison at the end of the stream. This + is for use with other formats that use the deflate compressed data format + such as zip. Those formats provide their own check values. If a custom + format is developed using the raw deflate format for compressed data, it is + recommended that a check value such as an adler32 or a crc32 be applied to + the uncompressed data as is done in the zlib, gzip, and zip formats. For + most applications, the zlib format should be used as is. Note that comments + above on the use in deflateInit2() applies to the magnitude of windowBits. + + windowBits can also be greater than 15 for optional gzip decoding. Add + 32 to windowBits to enable zlib and gzip decoding with automatic header + detection, or add 16 to decode only the gzip format (the zlib format will + return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is a + crc32 instead of an adler32. + + inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_VERSION_ERROR if the zlib library version is incompatible with the + version assumed by the caller, or Z_STREAM_ERROR if the parameters are + invalid, such as a null pointer to the structure. msg is set to null if + there is no error message. inflateInit2 does not perform any decompression + apart from possibly reading the zlib header if present: actual decompression + will be done by inflate(). (So next_in and avail_in may be modified, but + next_out and avail_out are unused and unchanged.) The current implementation + of inflateInit2() does not process any header information -- that is + deferred until inflate() is called. +*/ + +ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, + const Bytef *dictionary, + uInt dictLength)); +/* + Initializes the decompression dictionary from the given uncompressed byte + sequence. This function must be called immediately after a call of inflate, + if that call returned Z_NEED_DICT. The dictionary chosen by the compressor + can be determined from the adler32 value returned by that call of inflate. + The compressor and decompressor must use exactly the same dictionary (see + deflateSetDictionary). For raw inflate, this function can be called at any + time to set the dictionary. If the provided dictionary is smaller than the + window and there is already data in the window, then the provided dictionary + will amend what's there. The application must insure that the dictionary + that was used for compression is provided. + + inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a + parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is + inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the + expected one (incorrect adler32 value). inflateSetDictionary does not + perform any decompression: this will be done by subsequent calls of + inflate(). +*/ + +ZEXTERN int ZEXPORT inflateGetDictionary OF((z_streamp strm, + Bytef *dictionary, + uInt *dictLength)); +/* + Returns the sliding dictionary being maintained by inflate. dictLength is + set to the number of bytes in the dictionary, and that many bytes are copied + to dictionary. dictionary must have enough space, where 32768 bytes is + always enough. If inflateGetDictionary() is called with dictionary equal to + Z_NULL, then only the dictionary length is returned, and nothing is copied. + Similary, if dictLength is Z_NULL, then it is not set. + + inflateGetDictionary returns Z_OK on success, or Z_STREAM_ERROR if the + stream state is inconsistent. +*/ + +ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); +/* + Skips invalid compressed data until a possible full flush point (see above + for the description of deflate with Z_FULL_FLUSH) can be found, or until all + available input is skipped. No output is provided. + + inflateSync searches for a 00 00 FF FF pattern in the compressed data. + All full flush points have this pattern, but not all occurrences of this + pattern are full flush points. + + inflateSync returns Z_OK if a possible full flush point has been found, + Z_BUF_ERROR if no more input was provided, Z_DATA_ERROR if no flush point + has been found, or Z_STREAM_ERROR if the stream structure was inconsistent. + In the success case, the application may save the current current value of + total_in which indicates where valid compressed data was found. In the + error case, the application may repeatedly call inflateSync, providing more + input each time, until success or end of the input data. +*/ + +ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, + z_streamp source)); +/* + Sets the destination stream as a complete copy of the source stream. + + This function can be useful when randomly accessing a large stream. The + first pass through the stream can periodically record the inflate state, + allowing restarting inflate at those points when randomly accessing the + stream. + + inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being Z_NULL). msg is left unchanged in both source and + destination. +*/ + +ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); +/* + This function is equivalent to inflateEnd followed by inflateInit, + but does not free and reallocate all the internal decompression state. The + stream will keep attributes that may have been set by inflateInit2. + + inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being Z_NULL). +*/ + +ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm, + int windowBits)); +/* + This function is the same as inflateReset, but it also permits changing + the wrap and window size requests. The windowBits parameter is interpreted + the same as it is for inflateInit2. + + inflateReset2 returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being Z_NULL), or if + the windowBits parameter is invalid. +*/ + +ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, + int bits, + int value)); +/* + This function inserts bits in the inflate input stream. The intent is + that this function is used to start inflating at a bit position in the + middle of a byte. The provided bits will be used before any bytes are used + from next_in. This function should only be used with raw inflate, and + should be used before the first inflate() call after inflateInit2() or + inflateReset(). bits must be less than or equal to 16, and that many of the + least significant bits of value will be inserted in the input. + + If bits is negative, then the input stream bit buffer is emptied. Then + inflatePrime() can be called again to put bits in the buffer. This is used + to clear out bits leftover after feeding inflate a block description prior + to feeding inflate codes. + + inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +ZEXTERN long ZEXPORT inflateMark OF((z_streamp strm)); +/* + This function returns two values, one in the lower 16 bits of the return + value, and the other in the remaining upper bits, obtained by shifting the + return value down 16 bits. If the upper value is -1 and the lower value is + zero, then inflate() is currently decoding information outside of a block. + If the upper value is -1 and the lower value is non-zero, then inflate is in + the middle of a stored block, with the lower value equaling the number of + bytes from the input remaining to copy. If the upper value is not -1, then + it is the number of bits back from the current bit position in the input of + the code (literal or length/distance pair) currently being processed. In + that case the lower value is the number of bytes already emitted for that + code. + + A code is being processed if inflate is waiting for more input to complete + decoding of the code, or if it has completed decoding but is waiting for + more output space to write the literal or match data. + + inflateMark() is used to mark locations in the input data for random + access, which may be at bit positions, and to note those cases where the + output of a code may span boundaries of random access blocks. The current + location in the input stream can be determined from avail_in and data_type + as noted in the description for the Z_BLOCK flush parameter for inflate. + + inflateMark returns the value noted above or -1 << 16 if the provided + source stream state was inconsistent. +*/ + +ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, + gz_headerp head)); +/* + inflateGetHeader() requests that gzip header information be stored in the + provided gz_header structure. inflateGetHeader() may be called after + inflateInit2() or inflateReset(), and before the first call of inflate(). + As inflate() processes the gzip stream, head->done is zero until the header + is completed, at which time head->done is set to one. If a zlib stream is + being decoded, then head->done is set to -1 to indicate that there will be + no gzip header information forthcoming. Note that Z_BLOCK or Z_TREES can be + used to force inflate() to return immediately after header processing is + complete and before any actual data is decompressed. + + The text, time, xflags, and os fields are filled in with the gzip header + contents. hcrc is set to true if there is a header CRC. (The header CRC + was valid if done is set to one.) If extra is not Z_NULL, then extra_max + contains the maximum number of bytes to write to extra. Once done is true, + extra_len contains the actual extra field length, and extra contains the + extra field, or that field truncated if extra_max is less than extra_len. + If name is not Z_NULL, then up to name_max characters are written there, + terminated with a zero unless the length is greater than name_max. If + comment is not Z_NULL, then up to comm_max characters are written there, + terminated with a zero unless the length is greater than comm_max. When any + of extra, name, or comment are not Z_NULL and the respective field is not + present in the header, then that field is set to Z_NULL to signal its + absence. This allows the use of deflateSetHeader() with the returned + structure to duplicate the header. However if those fields are set to + allocated memory, then the application will need to save those pointers + elsewhere so that they can be eventually freed. + + If inflateGetHeader is not used, then the header information is simply + discarded. The header is always checked for validity, including the header + CRC if present. inflateReset() will reset the process to discard the header + information. The application would need to call inflateGetHeader() again to + retrieve the header from the next gzip stream. + + inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +/* +ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits, + unsigned char FAR *window)); + + Initialize the internal stream state for decompression using inflateBack() + calls. The fields zalloc, zfree and opaque in strm must be initialized + before the call. If zalloc and zfree are Z_NULL, then the default library- + derived memory allocation routines are used. windowBits is the base two + logarithm of the window size, in the range 8..15. window is a caller + supplied buffer of that size. Except for special applications where it is + assured that deflate was used with small window sizes, windowBits must be 15 + and a 32K byte window must be supplied to be able to decompress general + deflate streams. + + See inflateBack() for the usage of these routines. + + inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of + the parameters are invalid, Z_MEM_ERROR if the internal state could not be + allocated, or Z_VERSION_ERROR if the version of the library does not match + the version of the header file. +*/ + +typedef unsigned (*in_func) OF((void FAR *, + z_const unsigned char FAR * FAR *)); +typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned)); + +ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, + in_func in, void FAR *in_desc, + out_func out, void FAR *out_desc)); +/* + inflateBack() does a raw inflate with a single call using a call-back + interface for input and output. This is potentially more efficient than + inflate() for file i/o applications, in that it avoids copying between the + output and the sliding window by simply making the window itself the output + buffer. inflate() can be faster on modern CPUs when used with large + buffers. inflateBack() trusts the application to not change the output + buffer passed by the output function, at least until inflateBack() returns. + + inflateBackInit() must be called first to allocate the internal state + and to initialize the state with the user-provided window buffer. + inflateBack() may then be used multiple times to inflate a complete, raw + deflate stream with each call. inflateBackEnd() is then called to free the + allocated state. + + A raw deflate stream is one with no zlib or gzip header or trailer. + This routine would normally be used in a utility that reads zip or gzip + files and writes out uncompressed files. The utility would decode the + header and process the trailer on its own, hence this routine expects only + the raw deflate stream to decompress. This is different from the normal + behavior of inflate(), which expects either a zlib or gzip header and + trailer around the deflate stream. + + inflateBack() uses two subroutines supplied by the caller that are then + called by inflateBack() for input and output. inflateBack() calls those + routines until it reads a complete deflate stream and writes out all of the + uncompressed data, or until it encounters an error. The function's + parameters and return types are defined above in the in_func and out_func + typedefs. inflateBack() will call in(in_desc, &buf) which should return the + number of bytes of provided input, and a pointer to that input in buf. If + there is no input available, in() must return zero--buf is ignored in that + case--and inflateBack() will return a buffer error. inflateBack() will call + out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. out() + should return zero on success, or non-zero on failure. If out() returns + non-zero, inflateBack() will return with an error. Neither in() nor out() + are permitted to change the contents of the window provided to + inflateBackInit(), which is also the buffer that out() uses to write from. + The length written by out() will be at most the window size. Any non-zero + amount of input may be provided by in(). + + For convenience, inflateBack() can be provided input on the first call by + setting strm->next_in and strm->avail_in. If that input is exhausted, then + in() will be called. Therefore strm->next_in must be initialized before + calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called + immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in + must also be initialized, and then if strm->avail_in is not zero, input will + initially be taken from strm->next_in[0 .. strm->avail_in - 1]. + + The in_desc and out_desc parameters of inflateBack() is passed as the + first parameter of in() and out() respectively when they are called. These + descriptors can be optionally used to pass any information that the caller- + supplied in() and out() functions need to do their job. + + On return, inflateBack() will set strm->next_in and strm->avail_in to + pass back any unused input that was provided by the last in() call. The + return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR + if in() or out() returned an error, Z_DATA_ERROR if there was a format error + in the deflate stream (in which case strm->msg is set to indicate the nature + of the error), or Z_STREAM_ERROR if the stream was not properly initialized. + In the case of Z_BUF_ERROR, an input or output error can be distinguished + using strm->next_in which will be Z_NULL only if in() returned an error. If + strm->next_in is not Z_NULL, then the Z_BUF_ERROR was due to out() returning + non-zero. (in() will always be called before out(), so strm->next_in is + assured to be defined if out() returns non-zero.) Note that inflateBack() + cannot return Z_OK. +*/ + +ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm)); +/* + All memory allocated by inflateBackInit() is freed. + + inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream + state was inconsistent. +*/ + +ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); +/* Return flags indicating compile-time options. + + Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other: + 1.0: size of uInt + 3.2: size of uLong + 5.4: size of voidpf (pointer) + 7.6: size of z_off_t + + Compiler, assembler, and debug options: + 8: DEBUG + 9: ASMV or ASMINF -- use ASM code + 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention + 11: 0 (reserved) + + One-time table building (smaller code, but not thread-safe if true): + 12: BUILDFIXED -- build static block decoding tables when needed + 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed + 14,15: 0 (reserved) + + Library content (indicates missing functionality): + 16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking + deflate code when not needed) + 17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect + and decode gzip streams (to avoid linking crc code) + 18-19: 0 (reserved) + + Operation variations (changes in library functionality): + 20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate + 21: FASTEST -- deflate algorithm with only one, lowest compression level + 22,23: 0 (reserved) + + The sprintf variant used by gzprintf (zero is best): + 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format + 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure! + 26: 0 = returns value, 1 = void -- 1 means inferred string length returned + + Remainder: + 27-31: 0 (reserved) + */ + +#ifndef Z_SOLO + + /* utility functions */ + +/* + The following utility functions are implemented on top of the basic + stream-oriented functions. To simplify the interface, some default options + are assumed (compression level and memory usage, standard memory allocation + functions). The source code of these utility functions can be modified if + you need special options. +*/ + +ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen)); +/* + Compresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total size + of the destination buffer, which must be at least the value returned by + compressBound(sourceLen). Upon exit, destLen is the actual size of the + compressed buffer. + + compress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer. +*/ + +ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen, + int level)); +/* + Compresses the source buffer into the destination buffer. The level + parameter has the same meaning as in deflateInit. sourceLen is the byte + length of the source buffer. Upon entry, destLen is the total size of the + destination buffer, which must be at least the value returned by + compressBound(sourceLen). Upon exit, destLen is the actual size of the + compressed buffer. + + compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_BUF_ERROR if there was not enough room in the output buffer, + Z_STREAM_ERROR if the level parameter is invalid. +*/ + +ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen)); +/* + compressBound() returns an upper bound on the compressed size after + compress() or compress2() on sourceLen bytes. It would be used before a + compress() or compress2() call to allocate the destination buffer. +*/ + +ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen)); +/* + Decompresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total size + of the destination buffer, which must be large enough to hold the entire + uncompressed data. (The size of the uncompressed data must have been saved + previously by the compressor and transmitted to the decompressor by some + mechanism outside the scope of this compression library.) Upon exit, destLen + is the actual size of the uncompressed buffer. + + uncompress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. In + the case where there is not enough room, uncompress() will fill the output + buffer with the uncompressed data up to that point. +*/ + + /* gzip file access functions */ + +/* + This library supports reading and writing files in gzip (.gz) format with + an interface similar to that of stdio, using the functions that start with + "gz". The gzip format is different from the zlib format. gzip is a gzip + wrapper, documented in RFC 1952, wrapped around a deflate stream. +*/ + +typedef struct gzFile_s *gzFile; /* semi-opaque gzip file descriptor */ + +/* +ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); + + Opens a gzip (.gz) file for reading or writing. The mode parameter is as + in fopen ("rb" or "wb") but can also include a compression level ("wb9") or + a strategy: 'f' for filtered data as in "wb6f", 'h' for Huffman-only + compression as in "wb1h", 'R' for run-length encoding as in "wb1R", or 'F' + for fixed code compression as in "wb9F". (See the description of + deflateInit2 for more information about the strategy parameter.) 'T' will + request transparent writing or appending with no compression and not using + the gzip format. + + "a" can be used instead of "w" to request that the gzip stream that will + be written be appended to the file. "+" will result in an error, since + reading and writing to the same gzip file is not supported. The addition of + "x" when writing will create the file exclusively, which fails if the file + already exists. On systems that support it, the addition of "e" when + reading or writing will set the flag to close the file on an execve() call. + + These functions, as well as gzip, will read and decode a sequence of gzip + streams in a file. The append function of gzopen() can be used to create + such a file. (Also see gzflush() for another way to do this.) When + appending, gzopen does not test whether the file begins with a gzip stream, + nor does it look for the end of the gzip streams to begin appending. gzopen + will simply append a gzip stream to the existing file. + + gzopen can be used to read a file which is not in gzip format; in this + case gzread will directly read from the file without decompression. When + reading, this will be detected automatically by looking for the magic two- + byte gzip header. + + gzopen returns NULL if the file could not be opened, if there was + insufficient memory to allocate the gzFile state, or if an invalid mode was + specified (an 'r', 'w', or 'a' was not provided, or '+' was provided). + errno can be checked to determine if the reason gzopen failed was that the + file could not be opened. +*/ + +ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); +/* + gzdopen associates a gzFile with the file descriptor fd. File descriptors + are obtained from calls like open, dup, creat, pipe or fileno (if the file + has been previously opened with fopen). The mode parameter is as in gzopen. + + The next call of gzclose on the returned gzFile will also close the file + descriptor fd, just like fclose(fdopen(fd, mode)) closes the file descriptor + fd. If you want to keep fd open, use fd = dup(fd_keep); gz = gzdopen(fd, + mode);. The duplicated descriptor should be saved to avoid a leak, since + gzdopen does not close fd if it fails. If you are using fileno() to get the + file descriptor from a FILE *, then you will have to use dup() to avoid + double-close()ing the file descriptor. Both gzclose() and fclose() will + close the associated file descriptor, so they need to have different file + descriptors. + + gzdopen returns NULL if there was insufficient memory to allocate the + gzFile state, if an invalid mode was specified (an 'r', 'w', or 'a' was not + provided, or '+' was provided), or if fd is -1. The file descriptor is not + used until the next gz* read, write, seek, or close operation, so gzdopen + will not detect if fd is invalid (unless fd is -1). +*/ + +ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size)); +/* + Set the internal buffer size used by this library's functions. The + default buffer size is 8192 bytes. This function must be called after + gzopen() or gzdopen(), and before any other calls that read or write the + file. The buffer memory allocation is always deferred to the first read or + write. Two buffers are allocated, either both of the specified size when + writing, or one of the specified size and the other twice that size when + reading. A larger buffer size of, for example, 64K or 128K bytes will + noticeably increase the speed of decompression (reading). + + The new buffer size also affects the maximum length for gzprintf(). + + gzbuffer() returns 0 on success, or -1 on failure, such as being called + too late. +*/ + +ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); +/* + Dynamically update the compression level or strategy. See the description + of deflateInit2 for the meaning of these parameters. + + gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not + opened for writing. +*/ + +ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); +/* + Reads the given number of uncompressed bytes from the compressed file. If + the input file is not in gzip format, gzread copies the given number of + bytes into the buffer directly from the file. + + After reaching the end of a gzip stream in the input, gzread will continue + to read, looking for another gzip stream. Any number of gzip streams may be + concatenated in the input file, and will all be decompressed by gzread(). + If something other than a gzip stream is encountered after a gzip stream, + that remaining trailing garbage is ignored (and no error is returned). + + gzread can be used to read a gzip file that is being concurrently written. + Upon reaching the end of the input, gzread will return with the available + data. If the error code returned by gzerror is Z_OK or Z_BUF_ERROR, then + gzclearerr can be used to clear the end of file indicator in order to permit + gzread to be tried again. Z_OK indicates that a gzip stream was completed + on the last gzread. Z_BUF_ERROR indicates that the input file ended in the + middle of a gzip stream. Note that gzread does not return -1 in the event + of an incomplete gzip stream. This error is deferred until gzclose(), which + will return Z_BUF_ERROR if the last gzread ended in the middle of a gzip + stream. Alternatively, gzerror can be used before gzclose to detect this + case. + + gzread returns the number of uncompressed bytes actually read, less than + len for end of file, or -1 for error. +*/ + +ZEXTERN int ZEXPORT gzwrite OF((gzFile file, + voidpc buf, unsigned len)); +/* + Writes the given number of uncompressed bytes into the compressed file. + gzwrite returns the number of uncompressed bytes written or 0 in case of + error. +*/ + +ZEXTERN int ZEXPORTVA gzprintf Z_ARG((gzFile file, const char *format, ...)); +/* + Converts, formats, and writes the arguments to the compressed file under + control of the format string, as in fprintf. gzprintf returns the number of + uncompressed bytes actually written, or 0 in case of error. The number of + uncompressed bytes written is limited to 8191, or one less than the buffer + size given to gzbuffer(). The caller should assure that this limit is not + exceeded. If it is exceeded, then gzprintf() will return an error (0) with + nothing written. In this case, there may also be a buffer overflow with + unpredictable consequences, which is possible only if zlib was compiled with + the insecure functions sprintf() or vsprintf() because the secure snprintf() + or vsnprintf() functions were not available. This can be determined using + zlibCompileFlags(). +*/ + +ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); +/* + Writes the given null-terminated string to the compressed file, excluding + the terminating null character. + + gzputs returns the number of characters written, or -1 in case of error. +*/ + +ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); +/* + Reads bytes from the compressed file until len-1 characters are read, or a + newline character is read and transferred to buf, or an end-of-file + condition is encountered. If any characters are read or if len == 1, the + string is terminated with a null character. If no characters are read due + to an end-of-file or len < 1, then the buffer is left untouched. + + gzgets returns buf which is a null-terminated string, or it returns NULL + for end-of-file or in case of error. If there was an error, the contents at + buf are indeterminate. +*/ + +ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); +/* + Writes c, converted to an unsigned char, into the compressed file. gzputc + returns the value that was written, or -1 in case of error. +*/ + +ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); +/* + Reads one byte from the compressed file. gzgetc returns this byte or -1 + in case of end of file or error. This is implemented as a macro for speed. + As such, it does not do all of the checking the other functions do. I.e. + it does not check to see if file is NULL, nor whether the structure file + points to has been clobbered or not. +*/ + +ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); +/* + Push one character back onto the stream to be read as the first character + on the next read. At least one character of push-back is allowed. + gzungetc() returns the character pushed, or -1 on failure. gzungetc() will + fail if c is -1, and may fail if a character has been pushed but not read + yet. If gzungetc is used immediately after gzopen or gzdopen, at least the + output buffer size of pushed characters is allowed. (See gzbuffer above.) + The pushed character will be discarded if the stream is repositioned with + gzseek() or gzrewind(). +*/ + +ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); +/* + Flushes all pending output into the compressed file. The parameter flush + is as in the deflate() function. The return value is the zlib error number + (see function gzerror below). gzflush is only permitted when writing. + + If the flush parameter is Z_FINISH, the remaining data is written and the + gzip stream is completed in the output. If gzwrite() is called again, a new + gzip stream will be started in the output. gzread() is able to read such + concatented gzip streams. + + gzflush should be called only when strictly necessary because it will + degrade compression if called too often. +*/ + +/* +ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, + z_off_t offset, int whence)); + + Sets the starting position for the next gzread or gzwrite on the given + compressed file. The offset represents a number of bytes in the + uncompressed data stream. The whence parameter is defined as in lseek(2); + the value SEEK_END is not supported. + + If the file is opened for reading, this function is emulated but can be + extremely slow. If the file is opened for writing, only forward seeks are + supported; gzseek then compresses a sequence of zeroes up to the new + starting position. + + gzseek returns the resulting offset location as measured in bytes from + the beginning of the uncompressed stream, or -1 in case of error, in + particular if the file is opened for writing and the new starting position + would be before the current position. +*/ + +ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); +/* + Rewinds the given file. This function is supported only for reading. + + gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) +*/ + +/* +ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); + + Returns the starting position for the next gzread or gzwrite on the given + compressed file. This position represents a number of bytes in the + uncompressed data stream, and is zero when starting, even if appending or + reading a gzip stream from the middle of a file using gzdopen(). + + gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) +*/ + +/* +ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile file)); + + Returns the current offset in the file being read or written. This offset + includes the count of bytes that precede the gzip stream, for example when + appending or when using gzdopen() for reading. When reading, the offset + does not include as yet unused buffered input. This information can be used + for a progress indicator. On error, gzoffset() returns -1. +*/ + +ZEXTERN int ZEXPORT gzeof OF((gzFile file)); +/* + Returns true (1) if the end-of-file indicator has been set while reading, + false (0) otherwise. Note that the end-of-file indicator is set only if the + read tried to go past the end of the input, but came up short. Therefore, + just like feof(), gzeof() may return false even if there is no more data to + read, in the event that the last read request was for the exact number of + bytes remaining in the input file. This will happen if the input file size + is an exact multiple of the buffer size. + + If gzeof() returns true, then the read functions will return no more data, + unless the end-of-file indicator is reset by gzclearerr() and the input file + has grown since the previous end of file was detected. +*/ + +ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); +/* + Returns true (1) if file is being copied directly while reading, or false + (0) if file is a gzip stream being decompressed. + + If the input file is empty, gzdirect() will return true, since the input + does not contain a gzip stream. + + If gzdirect() is used immediately after gzopen() or gzdopen() it will + cause buffers to be allocated to allow reading the file to determine if it + is a gzip file. Therefore if gzbuffer() is used, it should be called before + gzdirect(). + + When writing, gzdirect() returns true (1) if transparent writing was + requested ("wT" for the gzopen() mode), or false (0) otherwise. (Note: + gzdirect() is not needed when writing. Transparent writing must be + explicitly requested, so the application already knows the answer. When + linking statically, using gzdirect() will include all of the zlib code for + gzip file reading and decompression, which may not be desired.) +*/ + +ZEXTERN int ZEXPORT gzclose OF((gzFile file)); +/* + Flushes all pending output if necessary, closes the compressed file and + deallocates the (de)compression state. Note that once file is closed, you + cannot call gzerror with file, since its structures have been deallocated. + gzclose must not be called more than once on the same file, just as free + must not be called more than once on the same allocation. + + gzclose will return Z_STREAM_ERROR if file is not valid, Z_ERRNO on a + file operation error, Z_MEM_ERROR if out of memory, Z_BUF_ERROR if the + last read ended in the middle of a gzip stream, or Z_OK on success. +*/ + +ZEXTERN int ZEXPORT gzclose_r OF((gzFile file)); +ZEXTERN int ZEXPORT gzclose_w OF((gzFile file)); +/* + Same as gzclose(), but gzclose_r() is only for use when reading, and + gzclose_w() is only for use when writing or appending. The advantage to + using these instead of gzclose() is that they avoid linking in zlib + compression or decompression code that is not used when only reading or only + writing respectively. If gzclose() is used, then both compression and + decompression code will be included the application when linking to a static + zlib library. +*/ + +ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); +/* + Returns the error message for the last error which occurred on the given + compressed file. errnum is set to zlib error number. If an error occurred + in the file system and not in the compression library, errnum is set to + Z_ERRNO and the application may consult errno to get the exact error code. + + The application must not modify the returned string. Future calls to + this function may invalidate the previously returned string. If file is + closed, then the string previously returned by gzerror will no longer be + available. + + gzerror() should be used to distinguish errors from end-of-file for those + functions above that do not distinguish those cases in their return values. +*/ + +ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); +/* + Clears the error and end-of-file flags for file. This is analogous to the + clearerr() function in stdio. This is useful for continuing to read a gzip + file that is being written concurrently. +*/ + +#endif /* !Z_SOLO */ + + /* checksum functions */ + +/* + These functions are not related to compression but are exported + anyway because they might be useful in applications using the compression + library. +*/ + +ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); +/* + Update a running Adler-32 checksum with the bytes buf[0..len-1] and + return the updated checksum. If buf is Z_NULL, this function returns the + required initial value for the checksum. + + An Adler-32 checksum is almost as reliable as a CRC32 but can be computed + much faster. + + Usage example: + + uLong adler = adler32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + adler = adler32(adler, buffer, length); + } + if (adler != original_adler) error(); +*/ + +/* +ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, + z_off_t len2)); + + Combine two Adler-32 checksums into one. For two sequences of bytes, seq1 + and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for + each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of + seq1 and seq2 concatenated, requiring only adler1, adler2, and len2. Note + that the z_off_t type (like off_t) is a signed integer. If len2 is + negative, the result has no meaning or utility. +*/ + +ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); +/* + Update a running CRC-32 with the bytes buf[0..len-1] and return the + updated CRC-32. If buf is Z_NULL, this function returns the required + initial value for the crc. Pre- and post-conditioning (one's complement) is + performed within this function so it shouldn't be done by the application. + + Usage example: + + uLong crc = crc32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + crc = crc32(crc, buffer, length); + } + if (crc != original_crc) error(); +*/ + +/* +ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2)); + + Combine two CRC-32 check values into one. For two sequences of bytes, + seq1 and seq2 with lengths len1 and len2, CRC-32 check values were + calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32 + check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and + len2. +*/ + + + /* various hacks, don't look :) */ + +/* deflateInit and inflateInit are macros to allow checking the zlib version + * and the compiler's view of z_stream: + */ +ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method, + int windowBits, int memLevel, + int strategy, const char *version, + int stream_size)); +ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, + unsigned char FAR *window, + const char *version, + int stream_size)); +#define deflateInit(strm, level) \ + deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream)) +#define inflateInit(strm) \ + inflateInit_((strm), ZLIB_VERSION, (int)sizeof(z_stream)) +#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ + deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ + (strategy), ZLIB_VERSION, (int)sizeof(z_stream)) +#define inflateInit2(strm, windowBits) \ + inflateInit2_((strm), (windowBits), ZLIB_VERSION, \ + (int)sizeof(z_stream)) +#define inflateBackInit(strm, windowBits, window) \ + inflateBackInit_((strm), (windowBits), (window), \ + ZLIB_VERSION, (int)sizeof(z_stream)) + +#ifndef Z_SOLO + +/* gzgetc() macro and its supporting function and exposed data structure. Note + * that the real internal state is much larger than the exposed structure. + * This abbreviated structure exposes just enough for the gzgetc() macro. The + * user should not mess with these exposed elements, since their names or + * behavior could change in the future, perhaps even capriciously. They can + * only be used by the gzgetc() macro. You have been warned. + */ +struct gzFile_s { + unsigned have; + unsigned char *next; + z_off64_t pos; +}; +ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ +#ifdef Z_PREFIX_SET +# undef z_gzgetc +# define z_gzgetc(g) \ + ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : gzgetc(g)) +#else +# define gzgetc(g) \ + ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : gzgetc(g)) +#endif + +/* provide 64-bit offset functions if _LARGEFILE64_SOURCE defined, and/or + * change the regular functions to 64 bits if _FILE_OFFSET_BITS is 64 (if + * both are true, the application gets the *64 functions, and the regular + * functions are changed to 64 bits) -- in case these are set on systems + * without large file support, _LFS64_LARGEFILE must also be true + */ +#ifdef Z_LARGE64 + ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); + ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); + ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); + ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); + ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off64_t)); + ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off64_t)); +#endif + +#if !defined(ZLIB_INTERNAL) && defined(Z_WANT64) +# ifdef Z_PREFIX_SET +# define z_gzopen z_gzopen64 +# define z_gzseek z_gzseek64 +# define z_gztell z_gztell64 +# define z_gzoffset z_gzoffset64 +# define z_adler32_combine z_adler32_combine64 +# define z_crc32_combine z_crc32_combine64 +# else +# define gzopen gzopen64 +# define gzseek gzseek64 +# define gztell gztell64 +# define gzoffset gzoffset64 +# define adler32_combine adler32_combine64 +# define crc32_combine crc32_combine64 +# endif +# ifndef Z_LARGE64 + ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); + ZEXTERN z_off_t ZEXPORT gzseek64 OF((gzFile, z_off_t, int)); + ZEXTERN z_off_t ZEXPORT gztell64 OF((gzFile)); + ZEXTERN z_off_t ZEXPORT gzoffset64 OF((gzFile)); + ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); +# endif +#else + ZEXTERN gzFile ZEXPORT gzopen OF((const char *, const char *)); + ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile, z_off_t, int)); + ZEXTERN z_off_t ZEXPORT gztell OF((gzFile)); + ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile)); + ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); +#endif + +#else /* Z_SOLO */ + + ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); + +#endif /* !Z_SOLO */ + +/* hack for buggy compilers */ +#if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL) + struct internal_state {int dummy;}; +#endif + +/* undocumented functions */ +ZEXTERN const char * ZEXPORT zError OF((int)); +ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp)); +ZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table OF((void)); +ZEXTERN int ZEXPORT inflateUndermine OF((z_streamp, int)); +ZEXTERN int ZEXPORT inflateResetKeep OF((z_streamp)); +ZEXTERN int ZEXPORT deflateResetKeep OF((z_streamp)); +#if defined(_WIN32) && !defined(Z_SOLO) +ZEXTERN gzFile ZEXPORT gzopen_w OF((const wchar_t *path, + const char *mode)); +#endif +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +# ifndef Z_SOLO +ZEXTERN int ZEXPORTVA gzvprintf Z_ARG((gzFile file, + const char *format, + va_list va)); +# endif +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* ZLIB_H */ diff --git a/Minecraft.Client/Common/zlib/zutil.c b/Minecraft.Client/Common/zlib/zutil.c new file mode 100644 index 00000000..23d2ebef --- /dev/null +++ b/Minecraft.Client/Common/zlib/zutil.c @@ -0,0 +1,324 @@ +/* zutil.c -- target dependent utility functions for the compression library + * Copyright (C) 1995-2005, 2010, 2011, 2012 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#include "zutil.h" +#ifndef Z_SOLO +# include "gzguts.h" +#endif + +#ifndef NO_DUMMY_DECL +struct internal_state {int dummy;}; /* for buggy compilers */ +#endif + +z_const char * const z_errmsg[10] = { +"need dictionary", /* Z_NEED_DICT 2 */ +"stream end", /* Z_STREAM_END 1 */ +"", /* Z_OK 0 */ +"file error", /* Z_ERRNO (-1) */ +"stream error", /* Z_STREAM_ERROR (-2) */ +"data error", /* Z_DATA_ERROR (-3) */ +"insufficient memory", /* Z_MEM_ERROR (-4) */ +"buffer error", /* Z_BUF_ERROR (-5) */ +"incompatible version",/* Z_VERSION_ERROR (-6) */ +""}; + + +const char * ZEXPORT zlibVersion() +{ + return ZLIB_VERSION; +} + +uLong ZEXPORT zlibCompileFlags() +{ + uLong flags; + + flags = 0; + switch ((int)(sizeof(uInt))) { + case 2: break; + case 4: flags += 1; break; + case 8: flags += 2; break; + default: flags += 3; + } + switch ((int)(sizeof(uLong))) { + case 2: break; + case 4: flags += 1 << 2; break; + case 8: flags += 2 << 2; break; + default: flags += 3 << 2; + } + switch ((int)(sizeof(voidpf))) { + case 2: break; + case 4: flags += 1 << 4; break; + case 8: flags += 2 << 4; break; + default: flags += 3 << 4; + } + switch ((int)(sizeof(z_off_t))) { + case 2: break; + case 4: flags += 1 << 6; break; + case 8: flags += 2 << 6; break; + default: flags += 3 << 6; + } +#ifdef DEBUG + flags += 1 << 8; +#endif +#if defined(ASMV) || defined(ASMINF) + flags += 1 << 9; +#endif +#ifdef ZLIB_WINAPI + flags += 1 << 10; +#endif +#ifdef BUILDFIXED + flags += 1 << 12; +#endif +#ifdef DYNAMIC_CRC_TABLE + flags += 1 << 13; +#endif +#ifdef NO_GZCOMPRESS + flags += 1L << 16; +#endif +#ifdef NO_GZIP + flags += 1L << 17; +#endif +#ifdef PKZIP_BUG_WORKAROUND + flags += 1L << 20; +#endif +#ifdef FASTEST + flags += 1L << 21; +#endif +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +# ifdef NO_vsnprintf + flags += 1L << 25; +# ifdef HAS_vsprintf_void + flags += 1L << 26; +# endif +# else +# ifdef HAS_vsnprintf_void + flags += 1L << 26; +# endif +# endif +#else + flags += 1L << 24; +# ifdef NO_snprintf + flags += 1L << 25; +# ifdef HAS_sprintf_void + flags += 1L << 26; +# endif +# else +# ifdef HAS_snprintf_void + flags += 1L << 26; +# endif +# endif +#endif + return flags; +} + +#ifdef DEBUG + +# ifndef verbose +# define verbose 0 +# endif +int ZLIB_INTERNAL z_verbose = verbose; + +void ZLIB_INTERNAL z_error (m) + char *m; +{ + fprintf(stderr, "%s\n", m); + exit(1); +} +#endif + +/* exported to allow conversion of error code to string for compress() and + * uncompress() + */ +const char * ZEXPORT zError(err) + int err; +{ + return ERR_MSG(err); +} + +#if defined(_WIN32_WCE) + /* The Microsoft C Run-Time Library for Windows CE doesn't have + * errno. We define it as a global variable to simplify porting. + * Its value is always 0 and should not be used. + */ + int errno = 0; +#endif + +#ifndef HAVE_MEMCPY + +void ZLIB_INTERNAL zmemcpy(dest, source, len) + Bytef* dest; + const Bytef* source; + uInt len; +{ + if (len == 0) return; + do { + *dest++ = *source++; /* ??? to be unrolled */ + } while (--len != 0); +} + +int ZLIB_INTERNAL zmemcmp(s1, s2, len) + const Bytef* s1; + const Bytef* s2; + uInt len; +{ + uInt j; + + for (j = 0; j < len; j++) { + if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1; + } + return 0; +} + +void ZLIB_INTERNAL zmemzero(dest, len) + Bytef* dest; + uInt len; +{ + if (len == 0) return; + do { + *dest++ = 0; /* ??? to be unrolled */ + } while (--len != 0); +} +#endif + +#ifndef Z_SOLO + +#ifdef SYS16BIT + +#ifdef __TURBOC__ +/* Turbo C in 16-bit mode */ + +# define MY_ZCALLOC + +/* Turbo C malloc() does not allow dynamic allocation of 64K bytes + * and farmalloc(64K) returns a pointer with an offset of 8, so we + * must fix the pointer. Warning: the pointer must be put back to its + * original form in order to free it, use zcfree(). + */ + +#define MAX_PTR 10 +/* 10*64K = 640K */ + +local int next_ptr = 0; + +typedef struct ptr_table_s { + voidpf org_ptr; + voidpf new_ptr; +} ptr_table; + +local ptr_table table[MAX_PTR]; +/* This table is used to remember the original form of pointers + * to large buffers (64K). Such pointers are normalized with a zero offset. + * Since MSDOS is not a preemptive multitasking OS, this table is not + * protected from concurrent access. This hack doesn't work anyway on + * a protected system like OS/2. Use Microsoft C instead. + */ + +voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, unsigned items, unsigned size) +{ + voidpf buf = opaque; /* just to make some compilers happy */ + ulg bsize = (ulg)items*size; + + /* If we allocate less than 65520 bytes, we assume that farmalloc + * will return a usable pointer which doesn't have to be normalized. + */ + if (bsize < 65520L) { + buf = farmalloc(bsize); + if (*(ush*)&buf != 0) return buf; + } else { + buf = farmalloc(bsize + 16L); + } + if (buf == NULL || next_ptr >= MAX_PTR) return NULL; + table[next_ptr].org_ptr = buf; + + /* Normalize the pointer to seg:0 */ + *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4; + *(ush*)&buf = 0; + table[next_ptr++].new_ptr = buf; + return buf; +} + +void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) +{ + int n; + if (*(ush*)&ptr != 0) { /* object < 64K */ + farfree(ptr); + return; + } + /* Find the original pointer */ + for (n = 0; n < next_ptr; n++) { + if (ptr != table[n].new_ptr) continue; + + farfree(table[n].org_ptr); + while (++n < next_ptr) { + table[n-1] = table[n]; + } + next_ptr--; + return; + } + ptr = opaque; /* just to make some compilers happy */ + Assert(0, "zcfree: ptr not found"); +} + +#endif /* __TURBOC__ */ + + +#ifdef M_I86 +/* Microsoft C in 16-bit mode */ + +# define MY_ZCALLOC + +#if (!defined(_MSC_VER) || (_MSC_VER <= 600)) +# define _halloc halloc +# define _hfree hfree +#endif + +voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, uInt items, uInt size) +{ + if (opaque) opaque = 0; /* to make compiler happy */ + return _halloc((long)items, size); +} + +void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) +{ + if (opaque) opaque = 0; /* to make compiler happy */ + _hfree(ptr); +} + +#endif /* M_I86 */ + +#endif /* SYS16BIT */ + + +#ifndef MY_ZCALLOC /* Any system without a special alloc function */ + +#ifndef STDC +extern voidp malloc OF((uInt size)); +extern voidp calloc OF((uInt items, uInt size)); +extern void free OF((voidpf ptr)); +#endif + +voidpf ZLIB_INTERNAL zcalloc (opaque, items, size) + voidpf opaque; + unsigned items; + unsigned size; +{ + if (opaque) items += size - size; /* make compiler happy */ + return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) : + (voidpf)calloc(items, size); +} + +void ZLIB_INTERNAL zcfree (opaque, ptr) + voidpf opaque; + voidpf ptr; +{ + free(ptr); + if (opaque) return; /* make compiler happy */ +} + +#endif /* MY_ZCALLOC */ + +#endif /* !Z_SOLO */ diff --git a/Minecraft.Client/Common/zlib/zutil.h b/Minecraft.Client/Common/zlib/zutil.h new file mode 100644 index 00000000..24ab06b1 --- /dev/null +++ b/Minecraft.Client/Common/zlib/zutil.h @@ -0,0 +1,253 @@ +/* zutil.h -- internal interface and configuration of the compression library + * Copyright (C) 1995-2013 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* @(#) $Id$ */ + +#ifndef ZUTIL_H +#define ZUTIL_H + +#ifdef HAVE_HIDDEN +# define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) +#else +# define ZLIB_INTERNAL +#endif + +#include "zlib.h" + +#if defined(STDC) && !defined(Z_SOLO) +# if !(defined(_WIN32_WCE) && defined(_MSC_VER)) +# include +# endif +# include +# include +#endif + +#ifdef Z_SOLO + typedef long ptrdiff_t; /* guess -- will be caught if guess is wrong */ +#endif + +#ifndef local +# define local static +#endif +/* compile with -Dlocal if your debugger can't find static symbols */ + +typedef unsigned char uch; +typedef uch FAR uchf; +typedef unsigned short ush; +typedef ush FAR ushf; +typedef unsigned long ulg; + +extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ +/* (size given to avoid silly warnings with Visual C++) */ + +#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)] + +#define ERR_RETURN(strm,err) \ + return (strm->msg = ERR_MSG(err), (err)) +/* To be used only when the state is known to be valid */ + + /* common constants */ + +#ifndef DEF_WBITS +# define DEF_WBITS MAX_WBITS +#endif +/* default windowBits for decompression. MAX_WBITS is for compression only */ + +#if MAX_MEM_LEVEL >= 8 +# define DEF_MEM_LEVEL 8 +#else +# define DEF_MEM_LEVEL MAX_MEM_LEVEL +#endif +/* default memLevel */ + +#define STORED_BLOCK 0 +#define STATIC_TREES 1 +#define DYN_TREES 2 +/* The three kinds of block type */ + +#define MIN_MATCH 3 +#define MAX_MATCH 258 +/* The minimum and maximum match lengths */ + +#define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */ + + /* target dependencies */ + +#if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32)) +# define OS_CODE 0x00 +# ifndef Z_SOLO +# if defined(__TURBOC__) || defined(__BORLANDC__) +# if (__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__)) + /* Allow compilation with ANSI keywords only enabled */ + void _Cdecl farfree( void *block ); + void *_Cdecl farmalloc( unsigned long nbytes ); +# else +# include +# endif +# else /* MSC or DJGPP */ +# include +# endif +# endif +#endif + +#ifdef AMIGA +# define OS_CODE 0x01 +#endif + +#if defined(VAXC) || defined(VMS) +# define OS_CODE 0x02 +# define F_OPEN(name, mode) \ + fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512") +#endif + +#if defined(ATARI) || defined(atarist) +# define OS_CODE 0x05 +#endif + +#ifdef OS2 +# define OS_CODE 0x06 +# if defined(M_I86) && !defined(Z_SOLO) +# include +# endif +#endif + +#if defined(MACOS) || defined(TARGET_OS_MAC) +# define OS_CODE 0x07 +# ifndef Z_SOLO +# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os +# include /* for fdopen */ +# else +# ifndef fdopen +# define fdopen(fd,mode) NULL /* No fdopen() */ +# endif +# endif +# endif +#endif + +#ifdef TOPS20 +# define OS_CODE 0x0a +#endif + +#ifdef WIN32 +# ifndef __CYGWIN__ /* Cygwin is Unix, not Win32 */ +# define OS_CODE 0x0b +# endif +#endif + +#ifdef __50SERIES /* Prime/PRIMOS */ +# define OS_CODE 0x0f +#endif + +#if defined(_BEOS_) || defined(RISCOS) +# define fdopen(fd,mode) NULL /* No fdopen() */ +#endif + +#if (defined(_MSC_VER) && (_MSC_VER > 600)) && !defined __INTERIX +# if defined(_WIN32_WCE) +# define fdopen(fd,mode) NULL /* No fdopen() */ +# ifndef _PTRDIFF_T_DEFINED + typedef int ptrdiff_t; +# define _PTRDIFF_T_DEFINED +# endif +# else +# define fdopen(fd,type) _fdopen(fd,type) +# endif +#endif + +#if defined(__BORLANDC__) && !defined(MSDOS) + #pragma warn -8004 + #pragma warn -8008 + #pragma warn -8066 +#endif + +/* provide prototypes for these when building zlib without LFS */ +#if !defined(_WIN32) && \ + (!defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0) + ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); +#endif + + /* common defaults */ + +#ifndef OS_CODE +# define OS_CODE 0x03 /* assume Unix */ +#endif + +#ifndef F_OPEN +# define F_OPEN(name, mode) fopen((name), (mode)) +#endif + + /* functions */ + +#if defined(pyr) || defined(Z_SOLO) +# define NO_MEMCPY +#endif +#if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__) + /* Use our own functions for small and medium model with MSC <= 5.0. + * You may have to use the same strategy for Borland C (untested). + * The __SC__ check is for Symantec. + */ +# define NO_MEMCPY +#endif +#if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY) +# define HAVE_MEMCPY +#endif +#ifdef HAVE_MEMCPY +# ifdef SMALL_MEDIUM /* MSDOS small or medium model */ +# define zmemcpy _fmemcpy +# define zmemcmp _fmemcmp +# define zmemzero(dest, len) _fmemset(dest, 0, len) +# else +# define zmemcpy memcpy +# define zmemcmp memcmp +# define zmemzero(dest, len) memset(dest, 0, len) +# endif +#else + void ZLIB_INTERNAL zmemcpy OF((Bytef* dest, const Bytef* source, uInt len)); + int ZLIB_INTERNAL zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len)); + void ZLIB_INTERNAL zmemzero OF((Bytef* dest, uInt len)); +#endif + +/* Diagnostic functions */ +#ifdef DEBUG +# include + extern int ZLIB_INTERNAL z_verbose; + extern void ZLIB_INTERNAL z_error OF((char *m)); +# define Assert(cond,msg) {if(!(cond)) z_error(msg);} +# define Trace(x) {if (z_verbose>=0) fprintf x ;} +# define Tracev(x) {if (z_verbose>0) fprintf x ;} +# define Tracevv(x) {if (z_verbose>1) fprintf x ;} +# define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;} +# define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;} +#else +# define Assert(cond,msg) +# define Trace(x) +# define Tracev(x) +# define Tracevv(x) +# define Tracec(c,x) +# define Tracecv(c,x) +#endif + +#ifndef Z_SOLO + voidpf ZLIB_INTERNAL zcalloc OF((voidpf opaque, unsigned items, + unsigned size)); + void ZLIB_INTERNAL zcfree OF((voidpf opaque, voidpf ptr)); +#endif + +#define ZALLOC(strm, items, size) \ + (*((strm)->zalloc))((strm)->opaque, (items), (size)) +#define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr)) +#define TRY_FREE(s, p) {if (p) ZFREE(s, p);} + +/* Reverse the bytes in a 32-bit value */ +#define ZSWAP32(q) ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \ + (((q) & 0xff00) << 8) + (((q) & 0xff) << 24)) + +#endif /* ZUTIL_H */ diff --git a/Minecraft.Client/CompassTexture.cpp b/Minecraft.Client/CompassTexture.cpp new file mode 100644 index 00000000..bba43b78 --- /dev/null +++ b/Minecraft.Client/CompassTexture.cpp @@ -0,0 +1,142 @@ +#include "stdafx.h" +#include "Minecraft.h" +#include "..\Minecraft.World\net.minecraft.world.level.h" +#include "..\Minecraft.World\net.minecraft.world.level.dimension.h" +#include "MultiplayerLocalPlayer.h" +#include "..\Minecraft.World\JavaMath.h" +#include "Texture.h" +#include "CompassTexture.h" + +CompassTexture *CompassTexture::instance = NULL; + +CompassTexture::CompassTexture() : StitchedTexture(L"compass",L"compass") +{ + instance = this; + + m_dataTexture = NULL; + m_iPad = XUSER_INDEX_ANY; + + rot = rota = 0.0; +} + +CompassTexture::CompassTexture(int iPad, CompassTexture *dataTexture) : StitchedTexture(L"compass",L"compass") +{ + m_dataTexture = dataTexture; + m_iPad = iPad; + + rot = rota = 0.0; +} + +void CompassTexture::cycleFrames() +{ + Minecraft *mc = Minecraft::GetInstance(); + + if (m_iPad >= 0 && m_iPad < XUSER_MAX_COUNT && mc->level != NULL && mc->localplayers[m_iPad] != NULL) + { + updateFromPosition(mc->localplayers[m_iPad]->level, mc->localplayers[m_iPad]->x, mc->localplayers[m_iPad]->z, mc->localplayers[m_iPad]->yRot, false, false); + } + else + { + frame = 1; + updateFromPosition(NULL, 0, 0, 0, false, true); + } +} + +void CompassTexture::updateFromPosition(Level *level, double x, double z, double yRot, bool noNeedle, bool instant) +{ + double rott = 0; + if (level != NULL && !noNeedle) + { + Pos *spawnPos = level->getSharedSpawnPos(); + double xa = spawnPos->x - x; + double za = spawnPos->z - z; + delete spawnPos; + yRot = (int)yRot % 360; + rott = -((yRot - 90) * PI / 180 - atan2(za, xa)); + if (!level->dimension->isNaturalDimension()) + { + rott = Math::random() * PI * 2; + } + } + + if (instant) + { + rot = rott; + } + else + { + double rotd = rott - rot; + while (rotd < -PI) + rotd += PI * 2; + while (rotd >= PI) + rotd -= PI * 2; + if (rotd < -1) rotd = -1; + if (rotd > 1) rotd = 1; + rota += rotd * 0.1; + rota *= 0.8; + rot += rota; + } + + // 4J Stu - We share data with another texture + if(m_dataTexture != NULL) + { + int newFrame = (int) (((rot / (PI * 2)) + 1.0) * m_dataTexture->frames->size()) % m_dataTexture->frames->size(); + while (newFrame < 0) + { + newFrame = (newFrame + m_dataTexture->frames->size()) % m_dataTexture->frames->size(); + } + if (newFrame != frame) + { + frame = newFrame; + m_dataTexture->source->blit(this->x, this->y, m_dataTexture->frames->at(this->frame), rotated); + } + } + else + { + int newFrame = (int) (((rot / (PI * 2)) + 1.0) * frames->size()) % frames->size(); + while (newFrame < 0) + { + newFrame = (newFrame + frames->size()) % frames->size(); + } + if (newFrame != frame) + { + frame = newFrame; + source->blit(this->x, this->y, frames->at(this->frame), rotated); + } + } +} + +int CompassTexture::getSourceWidth() const +{ + return source->getWidth(); +} + +int CompassTexture::getSourceHeight() const +{ + return source->getHeight(); +} + +int CompassTexture::getFrames() +{ + if(m_dataTexture == NULL) + { + return StitchedTexture::getFrames(); + } + else + { + return m_dataTexture->getFrames(); + } +} + +void CompassTexture::freeFrameTextures() +{ + if(m_dataTexture == NULL) + { + StitchedTexture::freeFrameTextures(); + } +} + +bool CompassTexture::hasOwnData() +{ + return m_dataTexture == NULL; +} \ No newline at end of file diff --git a/Minecraft.Client/CompassTexture.h b/Minecraft.Client/CompassTexture.h new file mode 100644 index 00000000..44c99e07 --- /dev/null +++ b/Minecraft.Client/CompassTexture.h @@ -0,0 +1,25 @@ +#pragma once +#include "StitchedTexture.h" + +class CompassTexture : public StitchedTexture +{ +private: + int m_iPad; + CompassTexture* m_dataTexture; + +public: + static CompassTexture *instance; + double rot, rota; + + CompassTexture(); + CompassTexture(int iPad, CompassTexture *dataTexture); + + void cycleFrames(); + void updateFromPosition(Level *level, double x, double z, double yRot, bool noNeedle, bool instant); + + virtual int getSourceWidth() const; + virtual int getSourceHeight() const; + virtual int getFrames(); + virtual void freeFrameTextures(); // 4J added + virtual bool hasOwnData(); // 4J Added +}; \ No newline at end of file diff --git a/Minecraft.Client/ConfirmScreen.cpp b/Minecraft.Client/ConfirmScreen.cpp new file mode 100644 index 00000000..b67ea19d --- /dev/null +++ b/Minecraft.Client/ConfirmScreen.cpp @@ -0,0 +1,55 @@ +#include "stdafx.h" +#include "ConfirmScreen.h" +#include "SmallButton.h" +#include "..\Minecraft.World\net.minecraft.locale.h" + +ConfirmScreen::ConfirmScreen(Screen *parent, const wstring& title1, const wstring& title2, int id) +{ + this->parent = parent; + this->title1 = title1; + this->title2 = title2; + this->id = id; + + Language *language = Language::getInstance(); + yesButton = language->getElement(L"gui.yes"); + noButton = language->getElement(L"gui.no"); +} + +ConfirmScreen::ConfirmScreen(Screen *parent, const wstring& title1, const wstring& title2, const wstring& yesButton, const wstring& noButton, int id) +{ + this->parent = parent; + this->title1 = title1; + this->title2 = title2; + this->yesButton = yesButton; + this->noButton = noButton; + this->id = id; +} + +void ConfirmScreen::init() +{ + buttons.push_back(new SmallButton(0, width / 2 - 155 + 0 % 2 * 160, height / 6 + 24 * 4, yesButton)); + buttons.push_back(new SmallButton(1, width / 2 - 155 + 1 % 2 * 160, height / 6 + 24 * 4, noButton)); +} + +void ConfirmScreen::buttonClicked(Button *button) +{ + parent->confirmResult(button->id == 0, id); +} + +void ConfirmScreen::render(int xm, int ym, float a) +{ + renderBackground(); + + drawCenteredString(font, title1, width / 2, 70, 0xffffff); + drawCenteredString(font, title2, width / 2, 90, 0xffffff); + + Screen::render(xm, ym, a); + + // 4J - debug code - remove + static int count = 0; + if( count++ == 100 ) + { + count = 0; + buttonClicked(buttons[0]); + } +} \ No newline at end of file diff --git a/Minecraft.Client/ConfirmScreen.h b/Minecraft.Client/ConfirmScreen.h new file mode 100644 index 00000000..12b85693 --- /dev/null +++ b/Minecraft.Client/ConfirmScreen.h @@ -0,0 +1,23 @@ +#pragma once +#include "Screen.h" +using namespace std; + +class ConfirmScreen : public Screen +{ +private: + Screen *parent; + wstring title1; + wstring title2; + wstring yesButton; + wstring noButton; + int id; + +public: + ConfirmScreen(Screen *parent, const wstring& title1, const wstring& title2, int id); + ConfirmScreen(Screen *parent, const wstring& title1, const wstring& title2, const wstring& yesButton, const wstring& noButton, int id); + virtual void init(); +protected: + virtual void buttonClicked(Button *button); +public: + virtual void render(int xm, int ym, float a); +}; \ No newline at end of file diff --git a/Minecraft.Client/ConnectScreen.cpp b/Minecraft.Client/ConnectScreen.cpp new file mode 100644 index 00000000..2cf005b6 --- /dev/null +++ b/Minecraft.Client/ConnectScreen.cpp @@ -0,0 +1,95 @@ +#include "stdafx.h" +#include "ConnectScreen.h" +#include "ClientConnection.h" +#include "TitleScreen.h" +#include "Button.h" +#include "Minecraft.h" +#include "User.h" +#include "..\Minecraft.World\net.minecraft.locale.h" + + +ConnectScreen::ConnectScreen(Minecraft *minecraft, const wstring& ip, int port) +{ + aborted = false; +// System.out.println("Connecting to " + ip + ", " + port); + minecraft->setLevel(NULL); +#if 1 + // 4J - removed from separate thread, but need to investigate what we actually need here + connection = new ClientConnection(minecraft, ip, port); + if (aborted) return; + connection->send( shared_ptr( new PreLoginPacket(minecraft->user->name) ) ); +#else + + new Thread() { + public void run() { + + try { + connection = new ClientConnection(minecraft, ip, port); + if (aborted) return; + connection.send(new PreLoginPacket(minecraft.user.name)); + } catch (UnknownHostException e) { + if (aborted) return; + minecraft.setScreen(new DisconnectedScreen("connect.failed", "disconnect.genericReason", "Unknown host '" + ip + "'")); + } catch (ConnectException e) { + if (aborted) return; + minecraft.setScreen(new DisconnectedScreen("connect.failed", "disconnect.genericReason", e.getMessage())); + } catch (Exception e) { + if (aborted) return; + e.printStackTrace(); + minecraft.setScreen(new DisconnectedScreen("connect.failed", "disconnect.genericReason", e.toString())); + } + } + }.start(); +#endif +} + +void ConnectScreen::tick() +{ + if (connection != NULL) + { + connection->tick(); + } +} + +void ConnectScreen::keyPressed(char eventCharacter, int eventKey) +{ +} + +void ConnectScreen::init() +{ + Language *language = Language::getInstance(); + + buttons.clear(); + buttons.push_back(new Button(0, width / 2 - 100, height / 4 + 24 * 5 + 12, language->getElement(L"gui.cancel"))); + +} + +void ConnectScreen::buttonClicked(Button *button) +{ + if (button->id == 0) + { + aborted = true; + if (connection != NULL) connection->close(); + minecraft->setScreen(new TitleScreen()); + } +} + +void ConnectScreen::render(int xm, int ym, float a) +{ + renderBackground(); + + Language *language = Language::getInstance(); + + if (connection == NULL) + { + drawCenteredString(font, language->getElement(L"connect.connecting"), width / 2, height / 2 - 50, 0xffffff); + drawCenteredString(font, L"", width / 2, height / 2 - 10, 0xffffff); + } + else + { + drawCenteredString(font, language->getElement(L"connect.authorizing"), width / 2, height / 2 - 50, 0xffffff); + drawCenteredString(font, connection->message, width / 2, height / 2 - 10, 0xffffff); + } + + Screen::render(xm, ym, a); +} \ No newline at end of file diff --git a/Minecraft.Client/ConnectScreen.h b/Minecraft.Client/ConnectScreen.h new file mode 100644 index 00000000..07e65cbb --- /dev/null +++ b/Minecraft.Client/ConnectScreen.h @@ -0,0 +1,24 @@ +#pragma once +#include "Screen.h" +class ClientConnection; +class Minecraft; + +using namespace std; + +class ConnectScreen : public Screen +{ +private: + ClientConnection *connection; + bool aborted; +public: + ConnectScreen(Minecraft *minecraft, const wstring& ip, int port); + virtual void tick(); +protected: + virtual void keyPressed(char eventCharacter, int eventKey); +public: + virtual void init(); +protected: + virtual void buttonClicked(Button *button); +public: + virtual void render(int xm, int ym, float a); +}; \ No newline at end of file diff --git a/Minecraft.Client/ConsoleInput.cpp b/Minecraft.Client/ConsoleInput.cpp new file mode 100644 index 00000000..7fd6c492 --- /dev/null +++ b/Minecraft.Client/ConsoleInput.cpp @@ -0,0 +1,8 @@ +#include "stdafx.h" +#include "ConsoleInput.h" + +ConsoleInput::ConsoleInput(const wstring& msg, ConsoleInputSource *source) +{ + this->msg = msg; + this->source = source; +} \ No newline at end of file diff --git a/Minecraft.Client/ConsoleInput.h b/Minecraft.Client/ConsoleInput.h new file mode 100644 index 00000000..1206b24e --- /dev/null +++ b/Minecraft.Client/ConsoleInput.h @@ -0,0 +1,12 @@ +#pragma once +#include "ConsoleInputSource.h" +using namespace std; + +class ConsoleInput +{ +public: + wstring msg; + ConsoleInputSource *source; + + ConsoleInput(const wstring& msg, ConsoleInputSource *source); +}; \ No newline at end of file diff --git a/Minecraft.Client/ConsoleInputSource.h b/Minecraft.Client/ConsoleInputSource.h new file mode 100644 index 00000000..ab2a2587 --- /dev/null +++ b/Minecraft.Client/ConsoleInputSource.h @@ -0,0 +1,9 @@ +#pragma once + +class ConsoleInputSource +{ +public: + virtual void info(const wstring& string) = 0; + virtual void warn(const wstring& string) = 0; + virtual wstring getConsoleName() = 0; +}; diff --git a/Minecraft.Client/ContainerScreen.cpp b/Minecraft.Client/ContainerScreen.cpp new file mode 100644 index 00000000..17b45406 --- /dev/null +++ b/Minecraft.Client/ContainerScreen.cpp @@ -0,0 +1,40 @@ +#include "stdafx.h" +#include "ContainerScreen.h" +#include "Textures.h" +#include "..\Minecraft.World\net.minecraft.world.inventory.h" + +ContainerScreen::ContainerScreen(shared_ptr inventory, shared_ptr container) : AbstractContainerScreen(new ContainerMenu(inventory, container)) +{ + this->inventory = inventory; + this->container = container; + this->passEvents = false; + + int defaultHeight = 222; + int noRowHeight = defaultHeight - 6 * 18; + containerRows = container->getContainerSize() / 9; + + imageHeight = noRowHeight + containerRows * 18; + +} + +void ContainerScreen::renderLabels() +{ +#if 0 + font->draw(container->getName(), 8, 2 + 2 + 2, 0x404040); + font->draw(inventory->getName(), 8, imageHeight - 96 + 2, 0x404040); +#endif +} + +void ContainerScreen::renderBg(float a) +{ + // 4J Unused +#if 0 + int tex = minecraft->textures->loadTexture(L"/gui/container.png"); + glColor4f(1, 1, 1, 1); + minecraft->textures->bind(tex); + int xo = (width - imageWidth) / 2; + int yo = (height - imageHeight) / 2; + this->blit(xo, yo, 0, 0, imageWidth, containerRows * 18 + 17); + this->blit(xo, yo + containerRows * 18 + 17, 0, 222 - 96, imageWidth, 96); +#endif +} \ No newline at end of file diff --git a/Minecraft.Client/ContainerScreen.h b/Minecraft.Client/ContainerScreen.h new file mode 100644 index 00000000..38806c1e --- /dev/null +++ b/Minecraft.Client/ContainerScreen.h @@ -0,0 +1,19 @@ +#pragma once +#include "AbstractContainerScreen.h" +class Container; + +class ContainerScreen : public AbstractContainerScreen +{ +private: + shared_ptr inventory; + shared_ptr container; + + int containerRows; + +public: + ContainerScreen(shared_ptrinventory, shared_ptrcontainer); + +protected: + virtual void renderLabels(); + virtual void renderBg(float a); +}; \ No newline at end of file diff --git a/Minecraft.Client/ControlsScreen.cpp b/Minecraft.Client/ControlsScreen.cpp new file mode 100644 index 00000000..487dbb16 --- /dev/null +++ b/Minecraft.Client/ControlsScreen.cpp @@ -0,0 +1,80 @@ +#include "stdafx.h" +#include "ControlsScreen.h" +#include "Options.h" +#include "SmallButton.h" +#include "..\Minecraft.World\net.minecraft.locale.h" + +ControlsScreen::ControlsScreen(Screen *lastScreen, Options *options) +{ + // 4J - added initialisers + title == L"Controls"; + selectedKey = -1; + + this->lastScreen = lastScreen; + this->options = options; +} + +int ControlsScreen::getLeftScreenPosition() +{ + return width / 2 - 155; +} + +void ControlsScreen::init() +{ + Language *language = Language::getInstance(); + + int leftPos = getLeftScreenPosition(); + for (int i = 0; i < Options::keyMappings_length; i++) + { + buttons.push_back(new SmallButton(i, leftPos + i % 2 * ROW_WIDTH, height / 6 + 24 * (i >> 1), BUTTON_WIDTH, 20, options->getKeyMessage(i))); + } + + buttons.push_back(new Button(200, width / 2 - 100, height / 6 + 24 * 7, language->getElement(L"gui.done"))); + title = language->getElement(L"controls.title"); + +} + +void ControlsScreen::buttonClicked(Button *button) +{ + for (int i = 0; i < Options::keyMappings_length; i++) + { + buttons[i]->msg = options->getKeyMessage(i); + } + if (button->id == 200) + { + minecraft->setScreen(lastScreen); + } + else + { + selectedKey = button->id; + button->msg = L"> " + options->getKeyMessage(button->id) + L" <"; + } +} + +void ControlsScreen::keyPressed(wchar_t eventCharacter, int eventKey) +{ + if (selectedKey >= 0) + { + options->setKey(selectedKey, eventKey); + buttons[selectedKey]->msg = options->getKeyMessage(selectedKey); + selectedKey = -1; + } + else + { + Screen::keyPressed(eventCharacter, eventKey); + } +} + +void ControlsScreen::render(int xm, int ym, float a) +{ + renderBackground(); + drawCenteredString(font, title, width / 2, 20, 0xffffff); + + int leftPos = getLeftScreenPosition(); + for (int i = 0; i < Options::keyMappings_length; i++) + { + drawString(font, options->getKeyDescription(i), leftPos + i % 2 * ROW_WIDTH + BUTTON_WIDTH + 6, height / 6 + 24 * (i >> 1) + 7, 0xffffffff); + } + + Screen::render(xm, ym, a); +} \ No newline at end of file diff --git a/Minecraft.Client/ControlsScreen.h b/Minecraft.Client/ControlsScreen.h new file mode 100644 index 00000000..b70bc4e1 --- /dev/null +++ b/Minecraft.Client/ControlsScreen.h @@ -0,0 +1,31 @@ +#pragma once +#include "Screen.h" +using namespace std; +class Options; + +class ControlsScreen : public Screen +{ +private: + Screen *lastScreen; +protected: + wstring title; +private: + Options *options; + + int selectedKey; + + static const int BUTTON_WIDTH = 70; + static const int ROW_WIDTH = 160; + +public: + ControlsScreen(Screen *lastScreen, Options *options); +private: + int getLeftScreenPosition(); +public: + void init(); +protected: + void buttonClicked(Button *button); + void keyPressed(wchar_t eventCharacter, int eventKey); +public: + void render(int xm, int ym, float a); +}; \ No newline at end of file diff --git a/Minecraft.Client/CowModel.cpp b/Minecraft.Client/CowModel.cpp new file mode 100644 index 00000000..bf16ade9 --- /dev/null +++ b/Minecraft.Client/CowModel.cpp @@ -0,0 +1,32 @@ +#include "stdafx.h" +#include "CowModel.h" +#include "ModelPart.h" + +CowModel::CowModel() : QuadrupedModel(12,0) +{ + head = new ModelPart(this, 0, 0); + head->addBox(-4, -4, -6, 8, 8, 6, 0); // Head + head->setPos(0, 12 - 6 - 2, -8); + head->texOffs(22, 0)->addBox(-5, -5, -4, 1, 3, 1, 0); // Horn1 + head->texOffs(22, 0)->addBox(+4, -5, -4, 1, 3, 1, 0); // Horn1 + + body = new ModelPart(this, 18, 4); + body->addBox(-6, -10, -7, 12, 18, 10, 0); // Body + body->setPos(0, 11 + 6 - 12, 2); + body->texOffs(52, 0)->addBox(-2, 2, -8, 4, 6, 1); + + leg0->x -= 1; + leg1->x += 1; + leg0->z += 0; + leg1->z += 0; + leg2->x -= 1; + leg3->x += 1; + leg2->z -= 1; + leg3->z -= 1; + + this->zHeadOffs += 2; + + // 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); +} diff --git a/Minecraft.Client/CowModel.h b/Minecraft.Client/CowModel.h new file mode 100644 index 00000000..617bb94f --- /dev/null +++ b/Minecraft.Client/CowModel.h @@ -0,0 +1,10 @@ +#pragma once +#include "QuadrupedModel.h" + +class CowModel : public QuadrupedModel +{ +public: + CowModel(); +// virtual void render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); +// virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale); +}; diff --git a/Minecraft.Client/CowRenderer.cpp b/Minecraft.Client/CowRenderer.cpp new file mode 100644 index 00000000..ee0dd99f --- /dev/null +++ b/Minecraft.Client/CowRenderer.cpp @@ -0,0 +1,18 @@ +#include "stdafx.h" +#include "CowRenderer.h" + +ResourceLocation CowRenderer::COW_LOCATION = ResourceLocation(TN_MOB_COW); + +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 new file mode 100644 index 00000000..3e4e9a0c --- /dev/null +++ b/Minecraft.Client/CowRenderer.h @@ -0,0 +1,14 @@ +#pragma once +#include "MobRenderer.h" + +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/CraftingScreen.cpp b/Minecraft.Client/CraftingScreen.cpp new file mode 100644 index 00000000..c28df18d --- /dev/null +++ b/Minecraft.Client/CraftingScreen.cpp @@ -0,0 +1,34 @@ +#include "stdafx.h" +#include "CraftingScreen.h" +#include "Textures.h" +#include "MultiplayerLocalPlayer.h" +#include "..\Minecraft.World\net.minecraft.world.inventory.h" + +CraftingScreen::CraftingScreen(shared_ptr inventory, Level *level, int x, int y, int z) : AbstractContainerScreen(new CraftingMenu(inventory, level, x, y, z)) +{ +} + +void CraftingScreen::removed() +{ + AbstractContainerScreen::removed(); + menu->removed(dynamic_pointer_cast(minecraft->player)); +} + +void CraftingScreen::renderLabels() +{ + font->draw(L"Crafting", 8 + 16 + 4, 2 + 2 + 2, 0x404040); + font->draw(L"Inventory", 8, imageHeight - 96 + 2, 0x404040); +} + +void CraftingScreen::renderBg(float a) +{ + // 4J Unused +#if 0 + int tex = minecraft->textures->loadTexture(L"/gui/crafting.png"); + glColor4f(1, 1, 1, 1); + minecraft->textures->bind(tex); + int xo = (width - imageWidth) / 2; + int yo = (height - imageHeight) / 2; + this->blit(xo, yo, 0, 0, imageWidth, imageHeight); +#endif +} \ No newline at end of file diff --git a/Minecraft.Client/CraftingScreen.h b/Minecraft.Client/CraftingScreen.h new file mode 100644 index 00000000..2de1681f --- /dev/null +++ b/Minecraft.Client/CraftingScreen.h @@ -0,0 +1,14 @@ +#pragma once +#include "AbstractContainerScreen.h" +class Inventory; +class Level; + +class CraftingScreen : public AbstractContainerScreen +{ +public: + CraftingScreen(shared_ptr inventory, Level *level, int x, int y, int z); + virtual void removed(); +protected: + virtual void renderLabels(); + virtual void renderBg(float a); +}; \ No newline at end of file diff --git a/Minecraft.Client/CreateWorldScreen.cpp b/Minecraft.Client/CreateWorldScreen.cpp new file mode 100644 index 00000000..b9856c7e --- /dev/null +++ b/Minecraft.Client/CreateWorldScreen.cpp @@ -0,0 +1,183 @@ +#include "stdafx.h" +#include "CreateWorldScreen.h" +#include "EditBox.h" +#include "Button.h" +#include "SurvivalMode.h" +#include "..\Minecraft.World\net.minecraft.locale.h" +#include "..\Minecraft.World\StringHelpers.h" +#include "..\Minecraft.World\net.minecraft.world.level.h" +#include "..\Minecraft.World\net.minecraft.world.level.storage.h" +#include "..\Minecraft.World\SharedConstants.h" +#include "..\Minecraft.World\Random.h" + +CreateWorldScreen::CreateWorldScreen(Screen *lastScreen) +{ + done = false; // 4J added + this->lastScreen = lastScreen; +} + +void CreateWorldScreen::tick() +{ + nameEdit->tick(); + seedEdit->tick(); + + // 4J - debug code - to be removed + static int count = 0; + if(count++ == 100 ) buttonClicked(buttons[0]); +} + +void CreateWorldScreen::init() +{ + Language *language = Language::getInstance(); + + Keyboard::enableRepeatEvents(true); + buttons.clear(); + buttons.push_back(new Button(0, width / 2 - 100, height / 4 + 24 * 4 + 12, language->getElement(L"selectWorld.create"))); + buttons.push_back(new Button(1, width / 2 - 100, height / 4 + 24 * 5 + 12, language->getElement(L"gui.cancel"))); + + nameEdit = new EditBox(this, font, width / 2 - 100, 60, 200, 20, language->getElement(L"testWorld")); // 4J - test - should be L"selectWorld.newWorld" + nameEdit->inFocus = true; + nameEdit->setMaxLength(32); + + seedEdit = new EditBox(this, font, width / 2 - 100, 116, 200, 20, L""); + + updateResultFolder(); +} + +void CreateWorldScreen::updateResultFolder() +{ + resultFolder = trimString(nameEdit->getValue()); + + for( int i = 0; i < SharedConstants::ILLEGAL_FILE_CHARACTERS_LENGTH; i++ ) + { + size_t pos; + while( (pos = resultFolder.find(SharedConstants::ILLEGAL_FILE_CHARACTERS[i])) != wstring::npos) + { + resultFolder[pos] = L'_'; + } + } + + if (resultFolder.length()==0) + { + resultFolder = L"World"; + } + resultFolder = CreateWorldScreen::findAvailableFolderName(minecraft->getLevelSource(), resultFolder); + +} + +wstring CreateWorldScreen::findAvailableFolderName(LevelStorageSource *levelSource, const wstring& folder) +{ + wstring folder2 = folder; // 4J - copy input as it is const + +#if 0 + while (levelSource->getDataTagFor(folder2) != NULL) + { + folder2 = folder2 + L"-"; + } +#endif + return folder2; +} + +void CreateWorldScreen::removed() +{ + Keyboard::enableRepeatEvents(false); +} + +void CreateWorldScreen::buttonClicked(Button *button) +{ + if (!button->active) return; + if (button->id == 1) + { + minecraft->setScreen(lastScreen); + } + else if (button->id == 0) + { + // note: code copied from SelectWorldScreen + minecraft->setScreen(NULL); + if (done) return; + done = true; + + __int64 seedValue = (new Random())->nextLong(); + wstring seedString = seedEdit->getValue(); + + if (seedString.length() != 0) + { + // try to convert it to a long first +// try { // 4J - removed try/catch + __int64 value = _fromString<__int64>(seedString); + if (value != 0) + { + seedValue = value; + } + // } catch (NumberFormatException e) { + // // not a number, fetch hash value + // seedValue = seedString.hashCode(); + // } + } + +// 4J Stu - This screen is not used, so removing this to stop the build failing +#if 0 + minecraft->gameMode = new SurvivalMode(minecraft); + minecraft->selectLevel(resultFolder, nameEdit->getValue(), seedValue); + minecraft->setScreen(NULL); +#endif + } + +} + +void CreateWorldScreen::keyPressed(wchar_t ch, int eventKey) +{ + if (nameEdit->inFocus) nameEdit->keyPressed(ch, eventKey); + else seedEdit->keyPressed(ch, eventKey); + + if (ch == 13) + { + buttonClicked(buttons[0]); + } + buttons[0]->active = nameEdit->getValue().length() > 0; + + updateResultFolder(); +} + +void CreateWorldScreen::mouseClicked(int x, int y, int buttonNum) +{ + Screen::mouseClicked(x, y, buttonNum); + + nameEdit->mouseClicked(x, y, buttonNum); + seedEdit->mouseClicked(x, y, buttonNum); +} + +void CreateWorldScreen::render(int xm, int ym, float a) +{ + Language *language = Language::getInstance(); + + // fill(0, 0, width, height, 0x40000000); + renderBackground(); + + drawCenteredString(font, language->getElement(L"selectWorld.create"), width / 2, height / 4 - 60 + 20, 0xffffff); + drawString(font, language->getElement(L"selectWorld.enterName"), width / 2 - 100, 47, 0xa0a0a0); + drawString(font, language->getElement(L"selectWorld.resultFolder") + L" " + resultFolder, width / 2 - 100, 85, 0xa0a0a0); + + drawString(font, language->getElement(L"selectWorld.enterSeed"), width / 2 - 100, 104, 0xa0a0a0); + drawString(font, language->getElement(L"selectWorld.seedInfo"), width / 2 - 100, 140, 0xa0a0a0); + + nameEdit->render(); + seedEdit->render(); + + Screen::render(xm, ym, a); + +} + +void CreateWorldScreen::tabPressed() +{ + if (nameEdit->inFocus) + { + nameEdit->focus(false); + seedEdit->focus(true); + } + else + { + nameEdit->focus(true); + seedEdit->focus(false); + } +} \ No newline at end of file diff --git a/Minecraft.Client/CreateWorldScreen.h b/Minecraft.Client/CreateWorldScreen.h new file mode 100644 index 00000000..78081786 --- /dev/null +++ b/Minecraft.Client/CreateWorldScreen.h @@ -0,0 +1,32 @@ +#pragma once +#include "Screen.h" +class EditBox; +class LevelStorageSource; +using namespace std; + +class CreateWorldScreen : public Screen +{ +private: + Screen *lastScreen; + EditBox *nameEdit; + EditBox *seedEdit; + wstring resultFolder; + bool done; + +public: + CreateWorldScreen(Screen *lastScreen); + virtual void tick(); + virtual void init(); +private: + void updateResultFolder(); +public: + static wstring findAvailableFolderName(LevelStorageSource *levelSource, const wstring& folder); + virtual void removed(); +protected: + virtual void buttonClicked(Button *button); + virtual void keyPressed(wchar_t ch, int eventKey); + virtual void mouseClicked(int x, int y, int buttonNum); +public: + virtual void render(int xm, int ym, float a); + virtual void tabPressed(); +}; \ No newline at end of file diff --git a/Minecraft.Client/CreativeMode.cpp b/Minecraft.Client/CreativeMode.cpp new file mode 100644 index 00000000..48342ebc --- /dev/null +++ b/Minecraft.Client/CreativeMode.cpp @@ -0,0 +1,128 @@ +#include "stdafx.h" +#include "CreativeMode.h" +#include "User.h" +#include "LocalPlayer.h" +#include "..\Minecraft.World\\net.minecraft.world.entity.player.h" +#include "..\Minecraft.World\net.minecraft.world.item.h" +#include "..\Minecraft.World\net.minecraft.world.inventory.h" +#include "..\Minecraft.World\net.minecraft.world.level.h" +#include "..\Minecraft.World\net.minecraft.world.level.tile.h" + +CreativeMode::CreativeMode(Minecraft *minecraft) : GameMode(minecraft) +{ + destroyDelay = 0; + instaBuild = true; +} + +void CreativeMode::init() +{ + // initPlayer(); +} + +void CreativeMode::enableCreativeForPlayer(shared_ptr player) +{ + // please check ServerPlayerGameMode.java if you change these + player->abilities.mayfly = true; + player->abilities.instabuild = true; + player->abilities.invulnerable = true; +} + +void CreativeMode::disableCreativeForPlayer(shared_ptr player) +{ + player->abilities.mayfly = false; + player->abilities.flying = false; + player->abilities.instabuild = false; + player->abilities.invulnerable = false; +} + +void CreativeMode::adjustPlayer(shared_ptr player) +{ + enableCreativeForPlayer(player); + + for (int i = 0; i < 9; i++) + { + if (player->inventory->items[i] == NULL) + { + player->inventory->items[i] = shared_ptr( new ItemInstance(User::allowedTiles[i]) ); + } + else + { + // 4J-PB - this line is commented out in 1.0.1 + //player->inventory->items[i]->count = 1; + } + } +} + +void CreativeMode::creativeDestroyBlock(Minecraft *minecraft, GameMode *gameMode, int x, int y, int z, int face) +{ + if(!minecraft->level->extinguishFire(minecraft->player, x, y, z, face)) + { + gameMode->destroyBlock(x, y, z, face); + } +} + +bool CreativeMode::useItemOn(shared_ptr player, Level *level, shared_ptr item, int x, int y, int z, int face, bool bTestUseOnOnly, bool *pbUsedItem) +{ + int t = level->getTile(x, y, z); + if (t > 0) + { + if (Tile::tiles[t]->use(level, x, y, z, player)) return true; + } + if (item == NULL) return false; + int aux = item->getAuxValue(); + int count = item->count; + bool success = item->useOn(player, level, x, y, z, face); + item->setAuxValue(aux); + item->count = count; + return success; +} + +void CreativeMode::startDestroyBlock(int x, int y, int z, int face) +{ + creativeDestroyBlock(minecraft, this, x, y, z, face); + destroyDelay = 5; +} + +void CreativeMode::continueDestroyBlock(int x, int y, int z, int face) +{ + destroyDelay--; + if (destroyDelay <= 0) + { + destroyDelay = 5; + creativeDestroyBlock(minecraft, this, x, y, z, face); + } +} + +void CreativeMode::stopDestroyBlock() +{ +} + +bool CreativeMode::canHurtPlayer() +{ + return false; +} + +void CreativeMode::initLevel(Level *level) +{ + GameMode::initLevel(level); +} + +float CreativeMode::getPickRange() +{ + return 5.0f; +} + +bool CreativeMode::hasMissTime() +{ + return false; +} + +bool CreativeMode::hasInfiniteItems() +{ + return true; +} + +bool CreativeMode::hasFarPickRange() +{ + return true; +} \ No newline at end of file diff --git a/Minecraft.Client/CreativeMode.h b/Minecraft.Client/CreativeMode.h new file mode 100644 index 00000000..10b27a53 --- /dev/null +++ b/Minecraft.Client/CreativeMode.h @@ -0,0 +1,26 @@ +#pragma once +#include "GameMode.h" + +class CreativeMode : public GameMode +{ +private: + int destroyDelay; + +public: + CreativeMode(Minecraft *minecraft); + virtual void init(); + static void enableCreativeForPlayer(shared_ptr player); + static void disableCreativeForPlayer(shared_ptr player); + virtual void adjustPlayer(shared_ptr player); + static void creativeDestroyBlock(Minecraft *minecraft, GameMode *gameMode, int x, int y, int z, int face); + virtual bool useItemOn(shared_ptr player, Level *level, shared_ptr item, int x, int y, int z, int face, bool bTestUseOnOnly=false, bool *pbUsedItem = NULL); + virtual void startDestroyBlock(int x, int y, int z, int face); + virtual void continueDestroyBlock(int x, int y, int z, int face); + virtual void stopDestroyBlock(); + virtual bool canHurtPlayer(); + virtual void initLevel(Level *level); + virtual float getPickRange(); + virtual bool hasMissTime(); + virtual bool hasInfiniteItems(); + virtual bool hasFarPickRange(); +}; \ No newline at end of file diff --git a/Minecraft.Client/CreeperModel.cpp b/Minecraft.Client/CreeperModel.cpp new file mode 100644 index 00000000..dd9ef193 --- /dev/null +++ b/Minecraft.Client/CreeperModel.cpp @@ -0,0 +1,80 @@ +#include "stdafx.h" +#include "..\Minecraft.World\Mth.h" +#include "CreeperModel.h" +#include "ModelPart.h" + +// 4J - added +void CreeperModel::_init(float g) +{ + int yo = 4; + + head = new ModelPart(this, 0, 0); + head->addBox(-4, - 8, -4, 8, 8, 8, g); // Head + head->setPos(0, (float)(yo), 0); + + hair = new ModelPart(this, 32, 0); + hair->addBox(-4, -8, -4, 8, 8, 8, g + 0.5f); // Head + hair->setPos(0, (float)(yo), 0); + + body = new ModelPart(this, 16, 16); + body->addBox(-4, 0, -2, 8, 12, 4, g); // Body + body->setPos(0, (float)(yo), 0); + + leg0 = new ModelPart(this, 0, 16); + leg0->addBox(-2, 0, -2, 4, 6, 4, g); // Leg0 + leg0->setPos(-2, (float)(12 + yo), 4); + + leg1 = new ModelPart(this, 0, 16); + leg1->addBox(-2, 0, -2, 4, 6, 4, g); // Leg1 + leg1->setPos(2, (float)(12 + yo), 4); + + leg2 = new ModelPart(this, 0, 16); + leg2->addBox(-2, 0, -2, 4, 6, 4, g); // Leg2 + leg2->setPos(-2, (float)(12 + yo), -4); + + leg3 = new ModelPart(this, 0, 16); + leg3->addBox(-2, 0, -2, 4, 6, 4, g); // Leg3 + leg3->setPos(2, (float)(12 + yo), -4); + + // 4J added - compile now to avoid random performance hit first time cubes are rendered + head->compile(1.0f/16.0f); + hair->compile(1.0f/16.0f); + body->compile(1.0f/16.0f); + leg0->compile(1.0f/16.0f); + leg1->compile(1.0f/16.0f); + leg2->compile(1.0f/16.0f); + leg3->compile(1.0f/16.0f); +} + +CreeperModel::CreeperModel() : Model() +{ + _init(0); +} + +CreeperModel::CreeperModel(float g) : Model() +{ + _init(g); +} + +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, entity); + + head->render(scale, usecompiled); + body->render(scale, usecompiled); + leg0->render(scale, usecompiled); + leg1->render(scale, usecompiled); + leg2->render(scale, usecompiled); + leg3->render(scale, usecompiled); +} + +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); + + leg0->xRot = (Mth::cos(time * 0.6662f) * 1.4f) * r; + leg1->xRot = (Mth::cos(time * 0.6662f + PI) * 1.4f) * r; + leg2->xRot = (Mth::cos(time * 0.6662f + PI) * 1.4f) * r; + leg3->xRot = (Mth::cos(time * 0.6662f) * 1.4f) * r; +} \ No newline at end of file diff --git a/Minecraft.Client/CreeperModel.h b/Minecraft.Client/CreeperModel.h new file mode 100644 index 00000000..93334a18 --- /dev/null +++ b/Minecraft.Client/CreeperModel.h @@ -0,0 +1,14 @@ +#pragma once +#include "Model.h" + +class CreeperModel : public Model +{ +public: + ModelPart *head, *hair, *body, *leg0, *leg1, *leg2, *leg3; + + void _init(float g); // 4J added + 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, 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 new file mode 100644 index 00000000..a9d16314 --- /dev/null +++ b/Minecraft.Client/CreeperRenderer.cpp @@ -0,0 +1,98 @@ +#include "stdafx.h" +#include "CreeperRenderer.h" +#include "CreeperModel.h" +#include "..\Minecraft.World\net.minecraft.world.entity.monster.h" +#include "..\Minecraft.World\Mth.h" + +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) +{ + shared_ptr creeper = dynamic_pointer_cast(mob); + + float g = creeper->getSwelling(a); + + float wobble = 1.0f + Mth::sin(g * 100) * g * 0.01f; + if (g < 0) g = 0; + if (g > 1) g = 1; + g = g * g; + g = g * g; + float s = (1.0f + g * 0.4f) * wobble; + float hs = (1.0f + g * 0.1f) / wobble; + glScalef(s, hs, s); +} + +int CreeperRenderer::getOverlayColor(shared_ptr mob, float br, float a) +{ + shared_ptr creeper = dynamic_pointer_cast(mob); + + float step = creeper->getSwelling(a); + + if ((int) (step * 10) % 2 == 0) return 0; + + int _a = (int) (step * 0.2f * 255) + 25; // 4J - added 25 here as our entities are rendered with alpha test still enabled, and so anything less is invisible + if (_a < 0) _a = 0; + if (_a > 255) _a = 255; + + int r = 255; + int g = 255; + int b = 255; + + return (_a << 24) | (r << 16) | (g << 8) | b; +} + +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); + if (mob->isPowered()) + { + if (mob->isInvisible()) glDepthMask(false); + else glDepthMask(true); + + if (layer == 1) + { + float time = mob->tickCount + a; + bindTexture(&POWER_LOCATION); + glMatrixMode(GL_TEXTURE); + glLoadIdentity(); + float uo = time * 0.01f; + float vo = time * 0.01f; + glTranslatef(uo, vo, 0); + setArmor(armorModel); + glMatrixMode(GL_MODELVIEW); + glEnable(GL_BLEND); + float br = 0.5f; + glColor4f(br, br, br, 1); + glDisable(GL_LIGHTING); + glBlendFunc(GL_ONE, GL_ONE); + return 1; + } + if (layer == 2) + { + glMatrixMode(GL_TEXTURE); + glLoadIdentity(); + glMatrixMode(GL_MODELVIEW); + glEnable(GL_LIGHTING); + glDisable(GL_BLEND); + } + } + return -1; + +} + +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 new file mode 100644 index 00000000..23718e0a --- /dev/null +++ b/Minecraft.Client/CreeperRenderer.h @@ -0,0 +1,20 @@ +#pragma once +#include "MobRenderer.h" + +class CreeperRenderer: public MobRenderer +{ +private: + 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 ResourceLocation *getTextureLocation(shared_ptr mob); +}; \ No newline at end of file diff --git a/Minecraft.Client/CritParticle.cpp b/Minecraft.Client/CritParticle.cpp new file mode 100644 index 00000000..6c71b027 --- /dev/null +++ b/Minecraft.Client/CritParticle.cpp @@ -0,0 +1,61 @@ +#include "stdafx.h" +#include "CritParticle.h" +#include "..\Minecraft.World\net.minecraft.world.entity.h" +#include "..\Minecraft.World\Random.h" +#include "..\Minecraft.World\net.minecraft.world.phys.h" +#include "..\Minecraft.World\net.minecraft.world.level.h" + +void CritParticle::_init(Level *level, shared_ptr entity, ePARTICLE_TYPE type) +{ + life = 0; + this->entity = entity; + lifeTime = 3; + particleName = type; + // 4J-PB - can't use a shared_from_this in the constructor + //tick(); +} + +CritParticle::CritParticle(Level *level, shared_ptr entity) : Particle(level, entity->x, entity->bb->y0 + entity->bbHeight / 2, entity->z, entity->xd, entity->yd, entity->zd) +{ + _init(level,entity,eParticleType_crit); +} + +CritParticle::CritParticle(Level *level, shared_ptr entity, ePARTICLE_TYPE type) : Particle(level, entity->x, entity->bb->y0 + entity->bbHeight / 2, entity->z, entity->xd, entity->yd, entity->zd) +{ + _init(level, entity, type); +} + +// 4J - Added this so that we can use some shared_ptr functions that were needed in the ctor +void CritParticle::CritParticlePostConstructor(void) +{ + tick(); +} + +void CritParticle::render(Tesselator *t, float a, float xa, float ya, float za, float xa2, float za2) +{ +} + +void CritParticle::tick() +{ + for (int i=0; i<16; i++) + { + double xa = random->nextFloat()*2-1; + double ya = random->nextFloat()*2-1; + double za = random->nextFloat()*2-1; + if (xa*xa+ya*ya+za*za>1) continue; + double x = entity->x+xa*entity->bbWidth/4; + double y = entity->bb->y0+entity->bbHeight/2+ya*entity->bbHeight/4; + double z = entity->z+za*entity->bbWidth/4; + level->addParticle(particleName, x, y, z, xa, ya+0.2, za); + } + life++; + if (life >= lifeTime) + { + remove(); + } +} + +int CritParticle::getParticleTexture() +{ + return ParticleEngine::ENTITY_PARTICLE_TEXTURE; +} \ No newline at end of file diff --git a/Minecraft.Client/CritParticle.h b/Minecraft.Client/CritParticle.h new file mode 100644 index 00000000..23f30339 --- /dev/null +++ b/Minecraft.Client/CritParticle.h @@ -0,0 +1,25 @@ +#pragma once + +#include "Particle.h" + +class Entity; + +class CritParticle : public Particle +{ +private: + shared_ptr entity; + int life; + int lifeTime; + ePARTICLE_TYPE particleName; + + void _init(Level *level, shared_ptr entity, ePARTICLE_TYPE type); + +public: + virtual eINSTANCEOF GetType() { return eType_CRITPARTICLE; } + CritParticle(Level *level, shared_ptr entity); + CritParticle(Level *level, shared_ptr entity, ePARTICLE_TYPE type); + void CritParticlePostConstructor(void); + void render(Tesselator *t, float a, float xa, float ya, float za, float xa2, float za2); + void tick(); + int getParticleTexture(); +}; \ No newline at end of file diff --git a/Minecraft.Client/CritParticle2.cpp b/Minecraft.Client/CritParticle2.cpp new file mode 100644 index 00000000..363e8f08 --- /dev/null +++ b/Minecraft.Client/CritParticle2.cpp @@ -0,0 +1,93 @@ +#include "stdafx.h" +#include "CritParticle2.h" +#include "..\Minecraft.World\JavaMath.h" + +void CritParticle2::_init(double xa, double ya, double za, float scale) +{ + xd *= 0.1f; + yd *= 0.1f; + zd *= 0.1f; + xd += xa * 0.4; + yd += ya * 0.4; + zd += za * 0.4; + + rCol = gCol = bCol = (float) (Math::random() * 0.3f + 0.6f); + size *= 0.75f; + size *= scale; + oSize = size; + + lifetime = (int) (6 / (Math::random() * 0.8 + 0.6)); + lifetime *= scale; + noPhysics = false; + + setMiscTex(16 * 4 + 1); + // 4J-PB - can't use a shared_from_this in the constructor + //tick(); + m_bAgeUniformly=false; // 4J added +} + +CritParticle2::CritParticle2(Level *level, double x, double y, double z, double xa, double ya, double za) : Particle(level, x, y, z, 0, 0, 0) +{ + _init(xa,ya,za,1); +} + +CritParticle2::CritParticle2(Level *level, double x, double y, double z, double xa, double ya, double za, float scale) : Particle(level, x, y, z, 0, 0, 0) +{ + _init(xa,ya,za,scale); +} + +void CritParticle2::CritParticle2PostConstructor(void) +{ + tick(); +} + +void CritParticle2::render(Tesselator *t, float a, float xa, float ya, float za, float xa2, float za2) +{ + float l = ((age + a) / lifetime) * 32; + if (l < 0) l = 0; + if (l > 1) l = 1; + + size = oSize * l; + Particle::render(t, a, xa, ya, za, xa2, za2); +} + +void CritParticle2::SetAgeUniformly() +{ + m_bAgeUniformly=true; +} + +void CritParticle2::tick() +{ + xo = x; + yo = y; + zo = z; + + if (age++ >= lifetime) remove(); + + move(xd, yd, zd); + gCol *= 0.96; + bCol *= 0.9; + + if(m_bAgeUniformly) + { + rCol *= 0.99; + gCol *= 0.99; + bCol *= 0.99; + } + else + { + gCol *= 0.96; + bCol *= 0.9; + } + + xd *= 0.70f; + yd *= 0.70f; + zd *= 0.70f; + yd-=0.02f; + + if (onGround) + { + xd *= 0.7f; + zd *= 0.7f; + } +} diff --git a/Minecraft.Client/CritParticle2.h b/Minecraft.Client/CritParticle2.h new file mode 100644 index 00000000..3febb0ff --- /dev/null +++ b/Minecraft.Client/CritParticle2.h @@ -0,0 +1,19 @@ +#pragma once + +#include "Particle.h" + +class CritParticle2 : public Particle +{ +public: + float oSize; + bool m_bAgeUniformly; // 4J added for Halo texture pack + + virtual eINSTANCEOF GetType() { return eType_CRITPARTICLE2; } + void _init(double xa, double ya, double za, float scale); + CritParticle2(Level *level, double x, double y, double z, double xa, double ya, double za); + CritParticle2(Level *level, double x, double y, double z, double xa, double ya, double za, float scale); + void CritParticle2PostConstructor(void); + void render(Tesselator *t, float a, float xa, float ya, float za, float xa2, float za2); + void tick(); + void SetAgeUniformly(); +}; diff --git a/Minecraft.Client/Cube.cpp b/Minecraft.Client/Cube.cpp new file mode 100644 index 00000000..813a6959 --- /dev/null +++ b/Minecraft.Client/Cube.cpp @@ -0,0 +1,113 @@ +#include "stdafx.h" +#include "Model.h" +#include "ModelPart.h" +#include "Cube.h" + + + +// 4J - added - helper function to set up vertex arrays +VertexArray Cube::VertexArray4(Vertex *v0, Vertex *v1, Vertex *v2, Vertex *v3) +{ + VertexArray ret = VertexArray(4); + ret[0] = v0; + ret[1] = v1; + ret[2] = v2; + ret[3] = v3; + + return ret; +} + +//void Cube::addBox(float x0, float y0, float z0, int w, int h, int d, float g) +Cube::Cube(ModelPart *modelPart, int xTexOffs, int yTexOffs, float x0, float y0, float z0, int w, int h, int d, float g, int faceMask /* = 63 */, bool bFlipPoly3UVs) : // 4J - added faceMask, added bFlipPoly3UVs to reverse the uvs back so player skins display right + x0(x0), + y0(y0), + z0(z0), + x1(x0 + w), + y1(y0 + h), + z1(z0 + d) +{ +// this->x0 = x0; +// this->y0 = y0; +// this->z0 = z0; +// this->x1 = x0 + w; +// this->y1 = y0 + h; +// this->z1 = z0 + d; + + vertices = VertexArray(8); + polygons = PolygonArray(6); + + float x1 = x0 + w; + float y1 = y0 + h; + float z1 = z0 + d; + + x0 -= g; + y0 -= g; + z0 -= g; + x1 += g; + y1 += g; + z1 += g; + + if (modelPart->bMirror) + { + float tmp = x1; + x1 = x0; + x0 = tmp; + } + + Vertex *u0 = new Vertex(x0, y0, z0, 0, 0); + Vertex *u1 = new Vertex(x1, y0, z0, 0, 8); + Vertex *u2 = new Vertex(x1, y1, z0, 8, 8); + Vertex *u3 = new Vertex(x0, y1, z0, 8, 0); + + Vertex *l0 = new Vertex(x0, y0, z1, 0, 0); + Vertex *l1 = new Vertex(x1, y0, z1, 0, 8); + Vertex *l2 = new Vertex(x1, y1, z1, 8, 8); + Vertex *l3 = new Vertex(x0, y1, z1, 8, 0); + + vertices[0] = u0; + vertices[1] = u1; + vertices[2] = u2; + vertices[3] = u3; + vertices[4] = l0; + vertices[5] = l1; + vertices[6] = l2; + vertices[7] = l3; + + // 4J - added ability to mask individual faces + int faceCount = 0; + if( faceMask & 1 ) polygons[faceCount++] = new _Polygon(VertexArray4(l1, u1, u2, l2), xTexOffs + d + w, yTexOffs + d, xTexOffs + d + w + d, yTexOffs + d + h, modelPart->xTexSize, modelPart->yTexSize); // Right + if( faceMask & 2 ) polygons[faceCount++] = new _Polygon(VertexArray4(u0, l0, l3, u3), xTexOffs + 0, yTexOffs + d, xTexOffs + d, yTexOffs + d + h, modelPart->xTexSize, modelPart->yTexSize); // Left + if( faceMask & 4 ) polygons[faceCount++] = new _Polygon(VertexArray4(l1, l0, u0, u1), xTexOffs + d, yTexOffs + 0, xTexOffs + d + w, yTexOffs + d, modelPart->xTexSize, modelPart->yTexSize); // Up + if(bFlipPoly3UVs) + { + if( faceMask & 8 ) polygons[faceCount++] = new _Polygon(VertexArray4(u2, u3, l3, l2), xTexOffs + d + w, yTexOffs + 0, xTexOffs + d + w + w, yTexOffs + d, modelPart->xTexSize, modelPart->yTexSize); // Down + } + else + { + if( faceMask & 8 ) polygons[faceCount++] = new _Polygon(VertexArray4(u2, u3, l3, l2), xTexOffs + d + w, yTexOffs + d, xTexOffs + d + w + w, yTexOffs + 0, modelPart->xTexSize, modelPart->yTexSize); // Down + } + if( faceMask & 16 ) polygons[faceCount++] = new _Polygon(VertexArray4(u1, u0, u3, u2), xTexOffs + d, yTexOffs + d, xTexOffs + d + w, yTexOffs + d + h, modelPart->xTexSize, modelPart->yTexSize); // Front + if( faceMask & 32 ) polygons[faceCount++] = new _Polygon(VertexArray4(l0, l1, l2, l3), xTexOffs + d + w + d, yTexOffs + d, xTexOffs + d + w + d + w, yTexOffs + d + h, modelPart->xTexSize, modelPart->yTexSize); // Back + polygons.length = faceCount; + + if (modelPart->bMirror) + { + for (unsigned int i = 0; i < polygons.length; i++) + polygons[i]->mirror(); + } +} + + +void Cube::render(Tesselator *t,float scale) +{ + for (int i = 0; i < polygons.length; i++) + { + polygons[i]->render(t, scale); + } +} + +Cube *Cube::setId(const wstring &id) +{ + this->id = id; + return this; +} diff --git a/Minecraft.Client/Cube.h b/Minecraft.Client/Cube.h new file mode 100644 index 00000000..3aee2b65 --- /dev/null +++ b/Minecraft.Client/Cube.h @@ -0,0 +1,29 @@ +#pragma once +#include "..\Minecraft.World\ArrayWithLength.h" +#include "Vertex.h" +#include "Polygon.h" + +class Model; + +class Cube +{ + +private: + VertexArray vertices; + PolygonArray polygons; + +public: + + const float x0, y0, z0, x1, y1, z1; + wstring id; + +public: + Cube(ModelPart *modelPart, int xTexOffs, int yTexOffs, float x0, float y0, float z0, int w, int h, int d, float g, int faceMask = 63, bool bFlipPoly3UVs = false); // 4J - added faceMask + +private: + VertexArray VertexArray4(Vertex *v0, Vertex *v1, Vertex *v2, Vertex *v3); // 4J added + +public: + void render(Tesselator *t,float scale); + Cube *setId(const wstring &id); +}; diff --git a/Minecraft.Client/Culler.h b/Minecraft.Client/Culler.h new file mode 100644 index 00000000..bd428ac0 --- /dev/null +++ b/Minecraft.Client/Culler.h @@ -0,0 +1,11 @@ +#pragma once +#include "..\Minecraft.World\AABB.h" + +class Culler +{ +public: + virtual bool isVisible(AABB *bb) = 0; + virtual bool cubeInFrustum(double x0, double y0, double z0, double x1, double y1, double z1) = 0; + virtual bool cubeFullyInFrustum(double x0, double y0, double z0, double x1, double y1, double z1) = 0; + virtual void prepare(double xOff, double yOff, double zOff) = 0; +}; \ No newline at end of file diff --git a/Minecraft.Client/DLCTexturePack.cpp b/Minecraft.Client/DLCTexturePack.cpp new file mode 100644 index 00000000..553128d9 --- /dev/null +++ b/Minecraft.Client/DLCTexturePack.cpp @@ -0,0 +1,623 @@ +#include "stdafx.h" +#include "Common\DLC\DLCGameRulesFile.h" +#include "Common\DLC\DLCGameRulesHeader.h" +#include "Common\DLC\DLCGameRules.h" +#include "DLCTexturePack.h" +#include "Common\DLC\DLCColourTableFile.h" +#include "Common\DLC\DLCUIDataFile.h" +#include "Common\DLC\DLCTextureFile.h" +#include "Common\DLC\DLCLocalisationFile.h" +#include "..\Minecraft.World\StringHelpers.h" +#include "StringTable.h" +#include "Common\DLC\DLCAudioFile.h" + +#if defined _XBOX || defined _WINDOWS64 +#include "Xbox\XML\ATGXmlParser.h" +#include "Xbox\XML\xmlFilesCallback.h" +#endif + +DLCTexturePack::DLCTexturePack(DWORD id, DLCPack *pack, TexturePack *fallback) : AbstractTexturePack(id, NULL, pack->getName(), fallback) +{ + m_dlcInfoPack = pack; + m_dlcDataPack = NULL; + bUILoaded = false; + m_bLoadingData = false; + m_bHasLoadedData = false; + m_archiveFile = NULL; + if (app.getLevelGenerationOptions()) app.getLevelGenerationOptions()->setLoadedData(); + m_bUsingDefaultColourTable = true; + + m_stringTable = NULL; + +#ifdef _XBOX + m_pStreamedWaveBank=NULL; + m_pSoundBank=NULL; +#endif + + if(m_dlcInfoPack->doesPackContainFile(DLCManager::e_DLCType_LocalisationData, L"languages.loc")) + { + DLCLocalisationFile *localisationFile = (DLCLocalisationFile *)m_dlcInfoPack->getFile(DLCManager::e_DLCType_LocalisationData, L"languages.loc"); + m_stringTable = localisationFile->getStringTable(); + } + + // 4J Stu - These calls need to be in the most derived version of the class + loadIcon(); + loadName(); + loadDescription(); + //loadDefaultHTMLColourTable(); +} + +void DLCTexturePack::loadIcon() +{ + if(m_dlcInfoPack->doesPackContainFile(DLCManager::e_DLCType_Texture, L"icon.png")) + { + DLCTextureFile *textureFile = (DLCTextureFile *)m_dlcInfoPack->getFile(DLCManager::e_DLCType_Texture, L"icon.png"); + m_iconData = textureFile->getData(m_iconSize); + } + else + { + AbstractTexturePack::loadIcon(); + } +} + +void DLCTexturePack::loadComparison() +{ + if(m_dlcInfoPack->doesPackContainFile(DLCManager::e_DLCType_Texture, L"comparison.png")) + { + DLCTextureFile *textureFile = (DLCTextureFile *)m_dlcInfoPack->getFile(DLCManager::e_DLCType_Texture, L"comparison.png"); + m_comparisonData = textureFile->getData(m_comparisonSize); + } +} + +void DLCTexturePack::loadName() +{ + texname = L""; + + if(m_dlcInfoPack->GetPackID()&1024) + { + if(m_stringTable != NULL) + { + texname = m_stringTable->getString(L"IDS_DISPLAY_NAME"); + m_wsWorldName=m_stringTable->getString(L"IDS_WORLD_NAME"); + } + } + else + { + if(m_stringTable != NULL) + { + texname = m_stringTable->getString(L"IDS_DISPLAY_NAME"); + } + } + +} + +void DLCTexturePack::loadDescription() +{ + desc1 = L""; + + if(m_stringTable != NULL) + { + desc1 = m_stringTable->getString(L"IDS_TP_DESCRIPTION"); + } +} + +wstring DLCTexturePack::getResource(const wstring& name) +{ + // 4J Stu - We should never call this function +#ifndef __CONTENT_PACKAGE + __debugbreak(); +#endif + return L""; +} + +InputStream *DLCTexturePack::getResourceImplementation(const wstring &name) //throws IOException +{ + // 4J Stu - We should never call this function +#ifndef _CONTENT_PACKAGE + __debugbreak(); + if(hasFile(name)) return NULL; +#endif + return NULL; //resource; +} + +bool DLCTexturePack::hasFile(const wstring &name) +{ + bool hasFile = false; + if(m_dlcDataPack != NULL) hasFile = m_dlcDataPack->doesPackContainFile(DLCManager::e_DLCType_Texture, name); + return hasFile; +} + +bool DLCTexturePack::isTerrainUpdateCompatible() +{ + return true; +} + +wstring DLCTexturePack::getPath(bool bTitleUpdateTexture /*= false*/, const char *pchBDPatchFilename) +{ + return L""; +} + +wstring DLCTexturePack::getAnimationString(const wstring &textureName, const wstring &path) +{ + wstring result = L""; + + wstring fullpath = L"res/" + path + textureName + L".png"; + if(hasFile(fullpath)) + { + result = m_dlcDataPack->getFile(DLCManager::e_DLCType_Texture, fullpath)->getParameterAsString(DLCManager::e_DLCParamType_Anim); + } + + return result; +} + +BufferedImage *DLCTexturePack::getImageResource(const wstring& File, bool filenameHasExtension /*= false*/, bool bTitleUpdateTexture /*=false*/, const wstring &drive /*=L""*/) +{ + if(m_dlcDataPack) return new BufferedImage(m_dlcDataPack, L"/" + File, filenameHasExtension); + else return fallback->getImageResource(File, filenameHasExtension, bTitleUpdateTexture, drive); +} + +DLCPack * DLCTexturePack::getDLCPack() +{ + return m_dlcDataPack; +} + +void DLCTexturePack::loadColourTable() +{ + // Load the game colours + if(m_dlcDataPack != NULL && m_dlcDataPack->doesPackContainFile(DLCManager::e_DLCType_ColourTable, L"colours.col")) + { + DLCColourTableFile *colourFile = (DLCColourTableFile *)m_dlcDataPack->getFile(DLCManager::e_DLCType_ColourTable, L"colours.col"); + m_colourTable = colourFile->getColourTable(); + m_bUsingDefaultColourTable = false; + } + else + { + // 4J Stu - We can delete the default colour table, but not the one from the DLCColourTableFile + if(!m_bUsingDefaultColourTable) m_colourTable = NULL; + loadDefaultColourTable(); + m_bUsingDefaultColourTable = true; + } + + // Load the text colours +#ifdef _XBOX + if(m_dlcDataPack != NULL && m_dlcDataPack->doesPackContainFile(DLCManager::e_DLCType_UIData, L"TexturePack.xzp")) + { + DLCUIDataFile *dataFile = (DLCUIDataFile *)m_dlcDataPack->getFile(DLCManager::e_DLCType_UIData, L"TexturePack.xzp"); + + DWORD dwSize = 0; + PBYTE pbData = dataFile->getData(dwSize); + + const DWORD LOCATOR_SIZE = 256; // Use this to allocate space to hold a ResourceLocator string + WCHAR szResourceLocator[ LOCATOR_SIZE ]; + + // Try and load the HTMLColours.col based off the common XML first, before the deprecated xuiscene_colourtable + swprintf(szResourceLocator, LOCATOR_SIZE,L"memory://%08X,%04X#HTMLColours.col",pbData, dwSize); + BYTE *data; + UINT dataLength; + if(XuiResourceLoadAll(szResourceLocator, &data, &dataLength) == S_OK) + { + m_colourTable->loadColoursFromData(data,dataLength); + + XuiFree(data); + } + else + { + + swprintf(szResourceLocator, LOCATOR_SIZE,L"memory://%08X,%04X#xuiscene_colourtable.xur",pbData, dwSize); + HXUIOBJ hScene; + HRESULT hr = XuiSceneCreate(szResourceLocator,szResourceLocator, NULL, &hScene); + + if(HRESULT_SUCCEEDED(hr)) + { + loadHTMLColourTableFromXuiScene(hScene); + } + else + { + loadDefaultHTMLColourTable(); + } + } + } + else + { + loadDefaultHTMLColourTable(); + } +#else + if(app.hasArchiveFile(L"HTMLColours.col")) + { + byteArray textColours = app.getArchiveFile(L"HTMLColours.col"); + m_colourTable->loadColoursFromData(textColours.data,textColours.length); + + delete [] textColours.data; + } +#endif +} + +void DLCTexturePack::loadData() +{ + int mountIndex = m_dlcInfoPack->GetDLCMountIndex(); + + if(mountIndex > -1) + { +#ifdef _DURANGO + if(StorageManager.MountInstalledDLC(ProfileManager.GetPrimaryPad(),mountIndex,&DLCTexturePack::packMounted,this,L"TPACK")!=ERROR_IO_PENDING) +#else + if(StorageManager.MountInstalledDLC(ProfileManager.GetPrimaryPad(),mountIndex,&DLCTexturePack::packMounted,this,"TPACK")!=ERROR_IO_PENDING) +#endif + { + // corrupt DLC + m_bHasLoadedData = true; + if (app.getLevelGenerationOptions()) app.getLevelGenerationOptions()->setLoadedData(); + app.DebugPrintf("Failed to mount texture pack DLC %d for pad %d\n",mountIndex,ProfileManager.GetPrimaryPad()); + } + else + { + m_bLoadingData = true; + app.DebugPrintf("Attempted to mount DLC data for texture pack %d\n", mountIndex); + } + } + else + { + m_bHasLoadedData = true; + if (app.getLevelGenerationOptions()) app.getLevelGenerationOptions()->setLoadedData(); + app.SetAction(ProfileManager.GetPrimaryPad(), eAppAction_ReloadTexturePack); + } +} + + + + + +wstring DLCTexturePack::getFilePath(DWORD packId, wstring filename, bool bAddDataFolder) +{ + return app.getFilePath(packId,filename,bAddDataFolder); +} + +int DLCTexturePack::packMounted(LPVOID pParam,int iPad,DWORD dwErr,DWORD dwLicenceMask) +{ + DLCTexturePack *texturePack = (DLCTexturePack *)pParam; + texturePack->m_bLoadingData = false; + if(dwErr!=ERROR_SUCCESS) + { + // corrupt DLC + app.DebugPrintf("Failed to mount DLC for pad %d: %d\n",iPad,dwErr); + } + else + { + app.DebugPrintf("Mounted DLC for texture pack, attempting to load data\n"); + texturePack->m_dlcDataPack = new DLCPack(texturePack->m_dlcInfoPack->getName(), dwLicenceMask); + texturePack->setHasAudio(false); + DWORD dwFilesProcessed = 0; + // Load the DLC textures + wstring dataFilePath = texturePack->m_dlcInfoPack->getFullDataPath(); + if(!dataFilePath.empty()) + { + if(!app.m_dlcManager.readDLCDataFile(dwFilesProcessed, getFilePath(texturePack->m_dlcInfoPack->GetPackID(), dataFilePath),texturePack->m_dlcDataPack)) + { + delete texturePack->m_dlcDataPack; + texturePack->m_dlcDataPack = NULL; + } + + // Load the UI data + if(texturePack->m_dlcDataPack != NULL) + { +#ifdef _XBOX + File xzpPath(getFilePath(texturePack->m_dlcInfoPack->GetPackID(), wstring(L"TexturePack.xzp") ) ); + + if(xzpPath.exists()) + { + const char *pchFilename=wstringtofilename(xzpPath.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 + ); + + if( fileHandle != INVALID_HANDLE_VALUE ) + { + DWORD dwFileSize = xzpPath.length(); + DWORD bytesRead; + PBYTE pbData = (PBYTE) new BYTE[dwFileSize]; + BOOL success = ReadFile(fileHandle,pbData,dwFileSize,&bytesRead,NULL); + CloseHandle(fileHandle); + if(success) + { + DLCUIDataFile *uiDLCFile = (DLCUIDataFile *)texturePack->m_dlcDataPack->addFile(DLCManager::e_DLCType_UIData,L"TexturePack.xzp"); + uiDLCFile->addData(pbData,bytesRead,true); + + } + } + } +#else + File archivePath(getFilePath(texturePack->m_dlcInfoPack->GetPackID(), wstring(L"media.arc") ) ); + if(archivePath.exists()) texturePack->m_archiveFile = new ArchiveFile(archivePath); +#endif + + /** + 4J-JEV: + For all the GameRuleHeader files we find + */ + DLCPack *pack = texturePack->m_dlcInfoPack->GetParentPack(); + LevelGenerationOptions *levelGen = app.getLevelGenerationOptions(); + if (levelGen != NULL && !levelGen->hasLoadedData()) + { + int gameRulesCount = pack->getDLCItemsCount(DLCManager::e_DLCType_GameRulesHeader); + for(int i = 0; i < gameRulesCount; ++i) + { + DLCGameRulesHeader *dlcFile = (DLCGameRulesHeader *) pack->getFile(DLCManager::e_DLCType_GameRulesHeader, i); + + if (!dlcFile->getGrfPath().empty()) + { + File grf( getFilePath(texturePack->m_dlcInfoPack->GetPackID(), dlcFile->getGrfPath() ) ); + 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, texturePack->m_stringTable); + + delete [] pbData; + + app.m_gameRules.setLevelGenerationOptions( dlcFile->lgo ); + } + } + } + } + if(levelGen->requiresBaseSave() && !levelGen->getBaseSavePath().empty() ) + { + File grf(getFilePath(texturePack->m_dlcInfoPack->GetPackID(), levelGen->getBaseSavePath() )); + 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? + levelGen->setBaseSaveData(pbData, dwFileSize); + } + } + } + } + + + // any audio data? +#ifdef _XBOX + File audioXSBPath(getFilePath(texturePack->m_dlcInfoPack->GetPackID(), wstring(L"MashUp.xsb") ) ); + File audioXWBPath(getFilePath(texturePack->m_dlcInfoPack->GetPackID(), wstring(L"MashUp.xwb") ) ); + + if(audioXSBPath.exists() && audioXWBPath.exists()) + { + + texturePack->setHasAudio(true); + const char *pchXWBFilename=wstringtofilename(audioXWBPath.getPath()); + Minecraft::GetInstance()->soundEngine->CreateStreamingWavebank(pchXWBFilename,&texturePack->m_pStreamedWaveBank); + const char *pchXSBFilename=wstringtofilename(audioXSBPath.getPath()); + Minecraft::GetInstance()->soundEngine->CreateSoundbank(pchXSBFilename,&texturePack->m_pSoundBank); + + } +#else + //DLCPack *pack = texturePack->m_dlcInfoPack->GetParentPack(); + if(pack->getDLCItemsCount(DLCManager::e_DLCType_Audio)>0) + { + DLCAudioFile *dlcFile = (DLCAudioFile *) pack->getFile(DLCManager::e_DLCType_Audio, 0); + texturePack->setHasAudio(true); + // init the streaming sound ids for this texture pack + int iOverworldStart, iNetherStart, iEndStart; + int iOverworldC, iNetherC, iEndC; + + iOverworldStart=0; + iOverworldC=dlcFile->GetCountofType(DLCAudioFile::e_AudioType_Overworld); + iNetherStart=iOverworldC; + iNetherC=dlcFile->GetCountofType(DLCAudioFile::e_AudioType_Nether); + iEndStart=iOverworldC+iNetherC; + iEndC=dlcFile->GetCountofType(DLCAudioFile::e_AudioType_End); + + 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 +} + texturePack->loadColourTable(); + } + + // 4J-PB - we need to leave the texture pack mounted if it contained streaming audio + if(texturePack->hasAudio()==false) + { +#ifdef _XBOX + StorageManager.UnmountInstalledDLC("TPACK"); +#endif + } + } + + texturePack->m_bHasLoadedData = true; + if (app.getLevelGenerationOptions()) app.getLevelGenerationOptions()->setLoadedData(); + app.SetAction(ProfileManager.GetPrimaryPad(), eAppAction_ReloadTexturePack); + + return 0; +} + +void DLCTexturePack::loadUI() +{ +#ifdef _XBOX +//Syntax: "memory://" + Address + "," + Size + "#" + File +//L"memory://0123ABCD,21A3#skin_default.xur" + + // Load new skin + if(m_dlcDataPack != NULL && m_dlcDataPack->doesPackContainFile(DLCManager::e_DLCType_UIData, L"TexturePack.xzp")) + { + DLCUIDataFile *dataFile = (DLCUIDataFile *)m_dlcDataPack->getFile(DLCManager::e_DLCType_UIData, L"TexturePack.xzp"); + + DWORD dwSize = 0; + PBYTE pbData = dataFile->getData(dwSize); + + const DWORD LOCATOR_SIZE = 256; // Use this to allocate space to hold a ResourceLocator string + WCHAR szResourceLocator[ LOCATOR_SIZE ]; + swprintf(szResourceLocator, LOCATOR_SIZE,L"memory://%08X,%04X#skin_Minecraft.xur",pbData, dwSize); + + XuiFreeVisuals(L""); + + + HRESULT hr = app.LoadSkin(szResourceLocator,NULL);//L"TexturePack"); + if(HRESULT_SUCCEEDED(hr)) + { + bUILoaded = true; + //CXuiSceneBase::GetInstance()->SetVisualPrefix(L"TexturePack"); + //CXuiSceneBase::GetInstance()->SkinChanged(CXuiSceneBase::GetInstance()->m_hObj); + } + } +#else + if(m_archiveFile && m_archiveFile->hasFile(L"skin.swf")) + { + ui.ReloadSkin(); + bUILoaded = true; + } +#endif + else + { + loadDefaultUI(); + bUILoaded = true; + } + + AbstractTexturePack::loadUI(); +#ifndef _XBOX + if(hasAudio()==false && !ui.IsReloadingSkin()) + { +#ifdef _DURANGO + StorageManager.UnmountInstalledDLC(L"TPACK"); +#else + StorageManager.UnmountInstalledDLC("TPACK"); +#endif + } +#endif +} + +void DLCTexturePack::unloadUI() +{ + // Unload skin + if(bUILoaded) + { +#ifdef _XBOX + XuiFreeVisuals(L"TexturePack"); + XuiFreeVisuals(L""); + CXuiSceneBase::GetInstance()->SetVisualPrefix(L""); + CXuiSceneBase::GetInstance()->SkinChanged(CXuiSceneBase::GetInstance()->m_hObj); +#endif + setHasAudio(false); + } + AbstractTexturePack::unloadUI(); + + app.m_dlcManager.removePack(m_dlcDataPack); + m_dlcDataPack = NULL; + delete m_archiveFile; + m_bHasLoadedData = false; + + bUILoaded = false; +} + +wstring DLCTexturePack::getXuiRootPath() +{ + wstring path = L""; + if(m_dlcDataPack != NULL && m_dlcDataPack->doesPackContainFile(DLCManager::e_DLCType_UIData, L"TexturePack.xzp")) + { + DLCUIDataFile *dataFile = (DLCUIDataFile *)m_dlcDataPack->getFile(DLCManager::e_DLCType_UIData, L"TexturePack.xzp"); + + DWORD dwSize = 0; + PBYTE pbData = dataFile->getData(dwSize); + + const DWORD LOCATOR_SIZE = 256; // Use this to allocate space to hold a ResourceLocator string + WCHAR szResourceLocator[ LOCATOR_SIZE ]; + swprintf(szResourceLocator, LOCATOR_SIZE,L"memory://%08X,%04X#",pbData, dwSize); + path = szResourceLocator; + } + return path; +} + +unsigned int DLCTexturePack::getDLCParentPackId() +{ + return m_dlcInfoPack->GetParentPackId(); +} + +unsigned char DLCTexturePack::getDLCSubPackId() +{ + return (m_dlcInfoPack->GetPackId()>>24)&0xFF; +} + +DLCPack * DLCTexturePack::getDLCInfoParentPack() +{ + return m_dlcInfoPack->GetParentPack(); +} + +XCONTENTDEVICEID DLCTexturePack::GetDLCDeviceID() +{ + return m_dlcInfoPack->GetDLCDeviceID(); +} diff --git a/Minecraft.Client/DLCTexturePack.h b/Minecraft.Client/DLCTexturePack.h new file mode 100644 index 00000000..153f3d43 --- /dev/null +++ b/Minecraft.Client/DLCTexturePack.h @@ -0,0 +1,76 @@ +#pragma once + +#include "AbstractTexturePack.h" + +class DLCPack; +class StringTable; + +class DLCTexturePack : public AbstractTexturePack +{ +private: + DLCPack *m_dlcInfoPack; // Description, icon etc + DLCPack *m_dlcDataPack; // Actual textures + StringTable *m_stringTable; + bool bUILoaded; + bool m_bLoadingData, m_bHasLoadedData; + bool m_bUsingDefaultColourTable; + //bool m_bHasAudio; + ArchiveFile *m_archiveFile; + + + +public: + using AbstractTexturePack::getResource; + + DLCTexturePack(DWORD id, DLCPack *pack, TexturePack *fallback); + ~DLCTexturePack(); + + 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; + IXACT3SoundBank *m_pSoundBank; +#endif +protected: + //@Override + void loadIcon(); + void loadComparison(); + void loadName(); + void loadDescription(); + InputStream *getResourceImplementation(const wstring &name); //throws IOException + +public: + //@Override + bool hasFile(const wstring &name); + bool isTerrainUpdateCompatible(); + + // 4J Added + 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(); + virtual bool hasData() { return m_bHasLoadedData; } + virtual bool isLoadingData() { return m_bLoadingData; } + +private: + static wstring getRootPath(DWORD packId, bool allowOverride, bool bAddDataFolder); + static wstring getFilePath(DWORD packId, wstring filename, bool bAddDataFolder=true); + +public: + static int packMounted(LPVOID pParam,int iPad,DWORD dwErr,DWORD dwLicenceMask); + virtual void loadData(); + virtual void loadUI(); + virtual void unloadUI(); + virtual wstring getXuiRootPath(); + virtual ArchiveFile *getArchiveFile() { return m_archiveFile; } + + virtual unsigned int getDLCParentPackId(); + virtual DLCPack *getDLCInfoParentPack(); + virtual unsigned char getDLCSubPackId(); + XCONTENTDEVICEID GetDLCDeviceID(); +}; diff --git a/Minecraft.Client/DeathScreen.cpp b/Minecraft.Client/DeathScreen.cpp new file mode 100644 index 00000000..a06606ec --- /dev/null +++ b/Minecraft.Client/DeathScreen.cpp @@ -0,0 +1,67 @@ +#include "stdafx.h" +#include "..\Minecraft.World\StringHelpers.h" +#include "DeathScreen.h" +#include "Button.h" +#include "MultiplayerLocalPlayer.h" +#include "TitleScreen.h" + +void DeathScreen::init() +{ + buttons.clear(); + buttons.push_back(new Button(1, width / 2 - 100, height / 4 + 24 * 3, L"Respawn")); + buttons.push_back(new Button(2, width / 2 - 100, height / 4 + 24 * 4, L"Title menu")); + + if (minecraft->user == NULL) + { + buttons[1]->active = false; + } +} + +void DeathScreen::keyPressed(char eventCharacter, int eventKey) +{ +} + +void DeathScreen::buttonClicked(Button *button) +{ + if (button->id == 0) + { + // minecraft.setScreen(new OptionsScreen(this, minecraft.options)); + } + if (button->id == 1) + { + minecraft->player->respawn(); + minecraft->setScreen(NULL); + // minecraft.setScreen(new NewLevelScreen(this)); + } + if (button->id == 2) + { + minecraft->setLevel(NULL); + minecraft->setScreen(new TitleScreen()); + } +} + +void DeathScreen::render(int xm, int ym, float a) +{ + fillGradient(0, 0, width, height, 0x60500000, 0xa0803030); + + glPushMatrix(); + glScalef(2, 2, 2); + drawCenteredString(font, L"Game over!", width / 2 / 2, 60 / 2, 0xffffff); + glPopMatrix(); + drawCenteredString(font, L"Score: &e" + _toString( minecraft->player->getScore() ), width / 2, 100, 0xffffff); + + Screen::render(xm, ym, a); + + // 4J - debug code - remove + static int count = 0; + if( count++ == 100 ) + { + count = 0; + buttonClicked(buttons[0]); + } +} + +bool DeathScreen::isPauseScreen() +{ + return false; +} \ No newline at end of file diff --git a/Minecraft.Client/DeathScreen.h b/Minecraft.Client/DeathScreen.h new file mode 100644 index 00000000..6fbf2349 --- /dev/null +++ b/Minecraft.Client/DeathScreen.h @@ -0,0 +1,14 @@ +#pragma once +#include "Screen.h" + +class DeathScreen : public Screen +{ +public: + virtual void init(); +protected: + virtual void keyPressed(char eventCharacter, int eventKey); + virtual void buttonClicked(Button *button); +public: + virtual void render(int xm, int ym, float a); + virtual bool isPauseScreen(); +}; \ No newline at end of file diff --git a/Minecraft.Client/DefaultRenderer.cpp b/Minecraft.Client/DefaultRenderer.cpp new file mode 100644 index 00000000..d4c15737 --- /dev/null +++ b/Minecraft.Client/DefaultRenderer.cpp @@ -0,0 +1,11 @@ +#include "stdafx.h" +#include "DefaultRenderer.h" +#include "..\Minecraft.World\net.minecraft.world.entity.h" + +void DefaultRenderer::render(shared_ptr entity, double x, double y, double z, float rot, float a) +{ + glPushMatrix(); +// 4J - removed following line as doesn't really make any sense +// render(entity->bb, (x-entity->xOld), (y-entity->yOld), (z-entity->zOld)); + glPopMatrix(); +} diff --git a/Minecraft.Client/DefaultRenderer.h b/Minecraft.Client/DefaultRenderer.h new file mode 100644 index 00000000..04b95390 --- /dev/null +++ b/Minecraft.Client/DefaultRenderer.h @@ -0,0 +1,9 @@ +#pragma once +#include "EntityRenderer.h" + +class DefaultRenderer : public EntityRenderer +{ +public: + 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/DefaultTexturePack.cpp b/Minecraft.Client/DefaultTexturePack.cpp new file mode 100644 index 00000000..d2974b6d --- /dev/null +++ b/Minecraft.Client/DefaultTexturePack.cpp @@ -0,0 +1,131 @@ +#include "stdafx.h" +#include "DefaultTexturePack.h" +#include "Textures.h" +#include "..\Minecraft.World\StringHelpers.h" + + +DefaultTexturePack::DefaultTexturePack() : AbstractTexturePack(0, NULL, L"Minecraft", NULL) +{ + // 4J Stu - These calls need to be in the most derived version of the class + loadIcon(); + loadName(); // 4J-PB - added so the PS3 can have localised texture names' + loadDescription(); + loadColourTable(); +} + +void DefaultTexturePack::loadIcon() +{ +#ifdef _XBOX + // 4J Stu - Temporary only + const DWORD LOCATOR_SIZE = 256; // Use this to allocate space to hold a ResourceLocator string + WCHAR szResourceLocator[ LOCATOR_SIZE ]; + + const ULONG_PTR c_ModuleHandle = (ULONG_PTR)GetModuleHandle(NULL); + swprintf(szResourceLocator, LOCATOR_SIZE ,L"section://%X,%ls#%ls",c_ModuleHandle,L"media", L"media/Graphics/TexturePackIcon.png"); + + UINT size = 0; + HRESULT hr = XuiResourceLoadAllNoLoc(szResourceLocator, &m_iconData, &size); + m_iconSize = size; +#else + if(app.hasArchiveFile(L"Graphics\\TexturePackIcon.png")) + { + byteArray ba = app.getArchiveFile(L"Graphics\\TexturePackIcon.png"); + m_iconData = ba.data; + m_iconSize = ba.length; + } +#endif +} + +void DefaultTexturePack::loadDescription() +{ + desc1 = L"LOCALISE ME: The default look of Minecraft"; +} +void DefaultTexturePack::loadName() +{ + texname = L"Minecraft"; +} + +bool DefaultTexturePack::hasFile(const wstring &name) +{ +// return DefaultTexturePack::class->getResourceAsStream(name) != null; + return true; +} + +bool DefaultTexturePack::isTerrainUpdateCompatible() +{ + return true; +} + +InputStream *DefaultTexturePack::getResourceImplementation(const wstring &name)// throws FileNotFoundException +{ + wstring wDrive = L""; + // Make the content package point to to the UPDATE: drive is needed +#ifdef _XBOX + #ifdef _TU_BUILD + wDrive=L"UPDATE:\\res"; + #else + + wDrive=L"GAME:\\res\\TitleUpdate\\res"; + #endif +#elif __PS3__ + + char *pchUsrDir; + if(app.GetBootedFromDiscPatch()) + { + const char *pchTextureName=wstringtofilename(name); + pchUsrDir = app.GetBDUsrDirPath(pchTextureName); + app.DebugPrintf("DefaultTexturePack::getResourceImplementation - texture %s - Drive - %s\n",pchTextureName,pchUsrDir); + } + else + { + const char *pchTextureName=wstringtofilename(name); + pchUsrDir=getUsrDirPath(); + app.DebugPrintf("DefaultTexturePack::getResourceImplementation - texture %s - Drive - %s\n",pchTextureName,pchUsrDir); + } + + + wstring wstr (pchUsrDir, pchUsrDir+strlen(pchUsrDir)); + + wDrive = wstr + L"\\Common\\res\\TitleUpdate\\res"; +#elif __PSVITA__ + + /* + char *pchUsrDir=getUsrDirPath(); + wstring wstr (pchUsrDir, pchUsrDir+strlen(pchUsrDir)); + + wDrive = wstr + L"Common\\res\\TitleUpdate\\res"; + */ + wDrive = L"Common\\res\\TitleUpdate\\res"; +#else + wDrive = L"Common\\res\\TitleUpdate\\res"; + +#endif + InputStream *resource = InputStream::getResourceAsStream(wDrive + name); + //InputStream *stream = DefaultTexturePack::class->getResourceAsStream(name); + //if (stream == NULL) + //{ + // throw new FileNotFoundException(name); + //} + + //return stream; + return resource; +} + +void DefaultTexturePack::loadUI() +{ + loadDefaultUI(); + + AbstractTexturePack::loadUI(); +} + +void DefaultTexturePack::unloadUI() +{ +#ifdef _XBOX + // Unload skin + XuiFreeVisuals(L"TexturePack"); + XuiFreeVisuals(L""); + CXuiSceneBase::GetInstance()->SetVisualPrefix(L""); + CXuiSceneBase::GetInstance()->SkinChanged(CXuiSceneBase::GetInstance()->m_hObj); +#endif + AbstractTexturePack::unloadUI(); +} diff --git a/Minecraft.Client/DefaultTexturePack.h b/Minecraft.Client/DefaultTexturePack.h new file mode 100644 index 00000000..9aa87a07 --- /dev/null +++ b/Minecraft.Client/DefaultTexturePack.h @@ -0,0 +1,33 @@ +#pragma once +#include "AbstractTexturePack.h" + +class DefaultTexturePack : public AbstractTexturePack +{ +public: + DefaultTexturePack(); + DLCPack * getDLCPack() {return NULL;} + +protected: + //@Override + void loadIcon(); + void loadName(); + void loadDescription(); + +public: + //@Override + bool hasFile(const wstring &name); + bool isTerrainUpdateCompatible(); + + wstring getDesc1() {return app.GetString(IDS_DEFAULT_TEXTUREPACK);} + +protected: + //@Override + InputStream *getResourceImplementation(const wstring &name); // throws FileNotFoundException + +public: + virtual bool hasData() { return true; } + virtual bool hasAudio() { return false; } + virtual bool isLoadingData() { return false; } + virtual void loadUI(); + virtual void unloadUI(); +}; \ No newline at end of file diff --git a/Minecraft.Client/DemoLevel.cpp b/Minecraft.Client/DemoLevel.cpp new file mode 100644 index 00000000..91d23397 --- /dev/null +++ b/Minecraft.Client/DemoLevel.cpp @@ -0,0 +1,12 @@ +#include "stdafx.h" +#include "DemoLevel.h" +#include "..\Minecraft.World\net.minecraft.world.level.storage.h" + +DemoLevel::DemoLevel(shared_ptr levelStorage, const wstring& levelName) : Level(levelStorage, levelName, DEMO_LEVEL_SEED) +{ +} + +void DemoLevel::setInitialSpawn() +{ + levelData->setSpawn(DEMO_SPAWN_X, DEMO_SPAWN_Y, DEMO_SPAWN_Z); +} \ No newline at end of file diff --git a/Minecraft.Client/DemoLevel.h b/Minecraft.Client/DemoLevel.h new file mode 100644 index 00000000..8364d5b4 --- /dev/null +++ b/Minecraft.Client/DemoLevel.h @@ -0,0 +1,16 @@ +#pragma once +#include "..\Minecraft.World\net.minecraft.world.level.h" + +class DemoLevel : public Level +{ +private: + static const __int64 DEMO_LEVEL_SEED = 0; // 4J - TODO - was "Don't Look Back".hashCode(); + static const int DEMO_SPAWN_X = 796; + static const int DEMO_SPAWN_Y = 72; + static const int DEMO_SPAWN_Z = -731; +public: + DemoLevel(shared_ptr levelStorage, const wstring& levelName); + DemoLevel(Level *level, Dimension *dimension); +protected: + virtual void setInitialSpawn(); +}; diff --git a/Minecraft.Client/DemoMode.cpp b/Minecraft.Client/DemoMode.cpp new file mode 100644 index 00000000..3b24af7a --- /dev/null +++ b/Minecraft.Client/DemoMode.cpp @@ -0,0 +1,125 @@ +#include "stdafx.h" +#include "DemoMode.h" +#include "..\Minecraft.World\net.minecraft.world.level.h" + +DemoMode::DemoMode(Minecraft *minecraft) : SurvivalMode(minecraft) +{ + demoHasEnded = false; + demoEndedReminder = 0; +} + +void DemoMode::tick() +{ + SurvivalMode::tick(); + +/* 4J - TODO - seems unlikely we need this demo mode anyway + __int64 time = minecraft->level->getTime(); + __int64 day = (time / Level::TICKS_PER_DAY) + 1; + + demoHasEnded = (time > (500 + Level::TICKS_PER_DAY * DEMO_DAYS)); + if (demoHasEnded) + { + demoEndedReminder++; + } + + if ((time % Level::TICKS_PER_DAY) == 500) + { + if (day <= (DEMO_DAYS + 1)) + { + minecraft->gui->displayClientMessage(L"demo.day." + _toString<__int64>(day)); + } + } + else if (day == 1) + { + Options *options = minecraft->options; + wstring message; + + if (time == 100) { + minecraft.gui.addMessage("Seed: " + minecraft.level.getSeed()); + message = language.getElement("demo.help.movement"); + message = String.format(message, Keyboard.getKeyName(options.keyUp.key), Keyboard.getKeyName(options.keyLeft.key), Keyboard.getKeyName(options.keyDown.key), + Keyboard.getKeyName(options.keyRight.key)); + } else if (time == 175) { + message = language.getElement("demo.help.jump"); + message = String.format(message, Keyboard.getKeyName(options.keyJump.key)); + } else if (time == 250) { + message = language.getElement("demo.help.inventory"); + message = String.format(message, Keyboard.getKeyName(options.keyBuild.key)); + } + if (message != null) { + minecraft.gui.addMessage(message); + } + } else if (day == DEMO_DAYS) { + if ((time % Level.TICKS_PER_DAY) == 22000) { + minecraft.gui.displayClientMessage("demo.day.warning"); + } + } +*/ +} + +void DemoMode::outputDemoReminder() +{ +/* 4J - TODO + if (demoEndedReminder > 100) { + minecraft.gui.displayClientMessage("demo.reminder"); + demoEndedReminder = 0; + } + */ +} + +void DemoMode::startDestroyBlock(int x, int y, int z, int face) +{ + if (demoHasEnded) + { + outputDemoReminder(); + return; + } + SurvivalMode::startDestroyBlock(x, y, z, face); +} + +void DemoMode::continueDestroyBlock(int x, int y, int z, int face) +{ + if (demoHasEnded) + { + return; + } + SurvivalMode::continueDestroyBlock(x, y, z, face); +} + +bool DemoMode::destroyBlock(int x, int y, int z, int face) +{ + if (demoHasEnded) + { + return false; + } + return SurvivalMode::destroyBlock(x, y, z, face); +} + +bool DemoMode::useItem(shared_ptr player, Level *level, shared_ptr item) +{ + if (demoHasEnded) + { + outputDemoReminder(); + return false; + } + return SurvivalMode::useItem(player, level, item); +} + +bool DemoMode::useItemOn(shared_ptr player, Level *level, shared_ptr item, int x, int y, int z, int face) +{ + if (demoHasEnded) { + outputDemoReminder(); + return false; + } + return SurvivalMode::useItemOn(player, level, item, x, y, z, face); +} + +void DemoMode::attack(shared_ptr player, shared_ptr entity) +{ + if (demoHasEnded) + { + outputDemoReminder(); + return; + } + SurvivalMode::attack(player, entity); +} diff --git a/Minecraft.Client/DemoMode.h b/Minecraft.Client/DemoMode.h new file mode 100644 index 00000000..429c9ec3 --- /dev/null +++ b/Minecraft.Client/DemoMode.h @@ -0,0 +1,27 @@ +#pragma once +#include "SurvivalMode.h" + +class DemoMode : public SurvivalMode +{ +private: + static const int DEMO_DAYS = 5; + + bool demoHasEnded; + int demoEndedReminder; + +public: + DemoMode(Minecraft *minecraft); + virtual void tick(); +private: + void outputDemoReminder(); +public: + using GameMode::useItem; + using SurvivalMode::useItemOn; + + virtual void startDestroyBlock(int x, int y, int z, int face); + virtual void continueDestroyBlock(int x, int y, int z, int face); + virtual bool destroyBlock(int x, int y, int z, int face); + virtual bool useItem(shared_ptr player, Level *level, shared_ptr item); + virtual bool useItemOn(shared_ptr player, Level *level, shared_ptr item, int x, int y, int z, int face); + virtual void attack(shared_ptr player, shared_ptr entity); +}; diff --git a/Minecraft.Client/DemoUser.cpp b/Minecraft.Client/DemoUser.cpp new file mode 100644 index 00000000..b19b3687 --- /dev/null +++ b/Minecraft.Client/DemoUser.cpp @@ -0,0 +1,6 @@ +#include "stdafx.h" +#include "DemoUser.h" + +DemoUser::DemoUser() : User(L"DemoUser", L"n/a") +{ +} \ No newline at end of file diff --git a/Minecraft.Client/DemoUser.h b/Minecraft.Client/DemoUser.h new file mode 100644 index 00000000..d10085d9 --- /dev/null +++ b/Minecraft.Client/DemoUser.h @@ -0,0 +1,8 @@ +#pragma once +#include "User.h" + +class DemoUser : public User +{ +public: + DemoUser(); +}; \ No newline at end of file diff --git a/Minecraft.Client/DerivedServerLevel.cpp b/Minecraft.Client/DerivedServerLevel.cpp new file mode 100644 index 00000000..a67408d7 --- /dev/null +++ b/Minecraft.Client/DerivedServerLevel.cpp @@ -0,0 +1,29 @@ +#include "stdafx.h" +#include "DerivedServerLevel.h" +#include "..\Minecraft.World\SavedDataStorage.h" +#include "..\Minecraft.World\DerivedLevelData.h" + +DerivedServerLevel::DerivedServerLevel(MinecraftServer *server, shared_ptr levelStorage, const wstring& levelName, int dimension, LevelSettings *levelSettings, ServerLevel *wrapped) + : ServerLevel(server, levelStorage, levelName, dimension, levelSettings) +{ + // 4J-PB - we're going to override the savedDataStorage, so we need to delete the current one + if(this->savedDataStorage) + { + delete this->savedDataStorage; + this->savedDataStorage=NULL; + } + this->savedDataStorage = wrapped->savedDataStorage; + levelData = new DerivedLevelData(wrapped->getLevelData()); +} + +DerivedServerLevel::~DerivedServerLevel() +{ + // we didn't allocate savedDataStorage here, so we don't want the level destructor to delete it + this->savedDataStorage=NULL; +} + +void DerivedServerLevel::saveLevelData() +{ + // Do nothing? + // Do nothing! +} \ No newline at end of file diff --git a/Minecraft.Client/DerivedServerLevel.h b/Minecraft.Client/DerivedServerLevel.h new file mode 100644 index 00000000..2d49e4fa --- /dev/null +++ b/Minecraft.Client/DerivedServerLevel.h @@ -0,0 +1,12 @@ +#pragma once +#include "ServerLevel.h" + +class DerivedServerLevel : public ServerLevel +{ +public: + DerivedServerLevel(MinecraftServer *server, shared_ptrlevelStorage, const wstring& levelName, int dimension, LevelSettings *levelSettings, ServerLevel *wrapped); + ~DerivedServerLevel(); + +protected: + void saveLevelData(); +}; \ No newline at end of file diff --git a/Minecraft.Client/DirtyChunkSorter.cpp b/Minecraft.Client/DirtyChunkSorter.cpp new file mode 100644 index 00000000..ebeed96d --- /dev/null +++ b/Minecraft.Client/DirtyChunkSorter.cpp @@ -0,0 +1,26 @@ +#include "stdafx.h" +#include "DirtyChunkSorter.h" +#include "../Minecraft.World/net.minecraft.world.entity.player.h" +#include "Chunk.h" + +DirtyChunkSorter::DirtyChunkSorter(shared_ptr cameraEntity, int playerIndex) // 4J - added player index +{ + this->cameraEntity = cameraEntity; + this->playerIndex = playerIndex; +} + +bool DirtyChunkSorter::operator()(const Chunk *c0, const Chunk *c1) const +{ + bool i0 = c0->clipChunk->visible; + bool i1 = c1->clipChunk->visible; + if (i0 && !i1) return false; + if (i1 && !i0) return true; + + double d0 = c0->distanceToSqr(cameraEntity); + double d1 = c1->distanceToSqr(cameraEntity); + + if (d0 < d1) return false; + if (d0 > d1) return true; + + return c0->id >= c1->id; // 4J - was c0.id < c1.id ? 1 : -1 +} \ No newline at end of file diff --git a/Minecraft.Client/DirtyChunkSorter.h b/Minecraft.Client/DirtyChunkSorter.h new file mode 100644 index 00000000..1bf8b61f --- /dev/null +++ b/Minecraft.Client/DirtyChunkSorter.h @@ -0,0 +1,14 @@ +#pragma once +class Chunk; +class Mob; + +class DirtyChunkSorter : public std::binary_function +{ +private: + shared_ptr cameraEntity; + int playerIndex; // 4J added + +public: + 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/DisconnectedScreen.cpp b/Minecraft.Client/DisconnectedScreen.cpp new file mode 100644 index 00000000..b445e4d0 --- /dev/null +++ b/Minecraft.Client/DisconnectedScreen.cpp @@ -0,0 +1,55 @@ +#include "stdafx.h" +#include "DisconnectedScreen.h" +#include "TitleScreen.h" +#include "Button.h" +#include "..\Minecraft.World\net.minecraft.locale.h" + +DisconnectedScreen::DisconnectedScreen(const wstring& title, const wstring reason, void *reasonObjects, ...) +{ + Language *language = Language::getInstance(); + + this->title = language->getElement(title); + if (reasonObjects != NULL) + { + this->reason = language->getElement(reason, reasonObjects); + } + else + { + this->reason = language->getElement(reason); + } +} + +void DisconnectedScreen::tick() +{ +} + +void DisconnectedScreen::keyPressed(char eventCharacter, int eventKey) +{ +} + +void DisconnectedScreen::init() +{ + Language *language = Language::getInstance(); + + buttons.clear(); + buttons.push_back(new Button(0, width / 2 - 100, height / 4 + 24 * 5 + 12, language->getElement(L"gui.toMenu"))); + +} + +void DisconnectedScreen::buttonClicked(Button *button) +{ + if (button->id == 0) + { + minecraft->setScreen(new TitleScreen()); + } +} + +void DisconnectedScreen::render(int xm, int ym, float a) +{ + renderBackground(); + + drawCenteredString(font, title, width / 2, height / 2 - 50, 0xffffff); + drawCenteredString(font, reason, width / 2, height / 2 - 10, 0xffffff); + + Screen::render(xm, ym, a); +} diff --git a/Minecraft.Client/DisconnectedScreen.h b/Minecraft.Client/DisconnectedScreen.h new file mode 100644 index 00000000..78e61afa --- /dev/null +++ b/Minecraft.Client/DisconnectedScreen.h @@ -0,0 +1,23 @@ +#pragma once +#include "Screen.h" +using namespace std; + +class DisconnectedScreen : public Screen +{ +private: + wstring title, reason; + +public: + DisconnectedScreen(const wstring& title, const wstring reason, void *reasonObjects, ...); + virtual void tick(); +protected: + using Screen::keyPressed; + + virtual void keyPressed(char eventCharacter, int eventKey); +public: + virtual void init(); +protected: + virtual void buttonClicked(Button *button); +public: + virtual void render(int xm, int ym, float a); +}; 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/DistanceChunkSorter.cpp b/Minecraft.Client/DistanceChunkSorter.cpp new file mode 100644 index 00000000..80ac0cdf --- /dev/null +++ b/Minecraft.Client/DistanceChunkSorter.cpp @@ -0,0 +1,24 @@ +#include "stdafx.h" +#include "DistanceChunkSorter.h" +#include "../Minecraft.World/net.minecraft.world.entity.player.h" +#include "Chunk.h" + +DistanceChunkSorter::DistanceChunkSorter(shared_ptr player) +{ + ix = -player->x; + iy = -player->y; + iz = -player->z; +} + +bool DistanceChunkSorter::operator()(const Chunk *c0, const Chunk *c1) const +{ + double xd0 = c0->xm + ix; + double yd0 = c0->ym + iy; + double zd0 = c0->zm + iz; + + double xd1 = c1->xm + ix; + double yd1 = c1->ym + iy; + double zd1 = c1->zm + iz; + + return (((xd0 * xd0 + yd0 * yd0 + zd0 * zd0) - (xd1 * xd1 + yd1 * yd1 + zd1 * zd1)) * 1024) < 0.0; +} \ No newline at end of file diff --git a/Minecraft.Client/DistanceChunkSorter.h b/Minecraft.Client/DistanceChunkSorter.h new file mode 100644 index 00000000..4789070d --- /dev/null +++ b/Minecraft.Client/DistanceChunkSorter.h @@ -0,0 +1,13 @@ +#pragma once +class Entity; +class Chunk; + +class DistanceChunkSorter : public std::binary_function +{ +private: + double ix, iy, iz; + +public: + DistanceChunkSorter(shared_ptr player); + bool operator()(const Chunk *a, const Chunk *b) const; +}; \ No newline at end of file diff --git a/Minecraft.Client/DragonBreathParticle.cpp b/Minecraft.Client/DragonBreathParticle.cpp new file mode 100644 index 00000000..0d0f75f3 --- /dev/null +++ b/Minecraft.Client/DragonBreathParticle.cpp @@ -0,0 +1,104 @@ +#include "stdafx.h" +#include "..\Minecraft.World\JavaMath.h" +#include "DragonBreathParticle.h" + +void DragonBreathParticle::init(Level *level, double x, double y, double z, double xa, double ya, double za, float scale) +{ + xd *= 0.1f; + yd *= 0.1f; + zd *= 0.1f; + xd = xa; //+= xa; + yd = ya; //+= ya; + zd = za; //+= za; + + unsigned int cMin = Minecraft::GetInstance()->getColourTable()->getColor( eMinecraftColour_Particle_DragonBreathMin ); //0xb700d2 + unsigned int cMax = Minecraft::GetInstance()->getColourTable()->getColor( eMinecraftColour_Particle_DragonBreathMax ); //0xdf00f9 + double rMin = ( (cMin>>16)&0xFF )/255.0f, gMin = ( (cMin>>8)&0xFF )/255.0, bMin = ( cMin&0xFF )/255.0; + double rMax = ( (cMax>>16)&0xFF )/255.0f, gMax = ( (cMax>>8)&0xFF )/255.0, bMax = ( cMax&0xFF )/255.0; + + rCol = (rMax - rMin) * Math::random() + rMin; // 184/255 -- 224/255 + gCol = (gMax - gMin) * Math::random() + gMin; // 0,0 + bCol = (bMax - bMin) * Math::random() + bMin; // 210/255 -- 250/255 + + size *= 0.75f; + size *= scale; + oSize = size; + + lifetime = (int) (20 / (Math::random() * 0.8 + 0.2)); + lifetime = (int) (lifetime * scale); + noPhysics = false; + + m_bHasHitGround = false; +} + +DragonBreathParticle::DragonBreathParticle(Level *level, double x, double y, double z, double xa, double ya, double za) : Particle(level, x, y, z, 0, 0, 0) +{ + init(level, x, y, z, xa, ya, za, 1); +} + +DragonBreathParticle::DragonBreathParticle(Level *level, double x, double y, double z, double xa, double ya, double za, float scale) : Particle(level, x, y, z, 0, 0, 0) +{ + init(level, x, y, z, xa, ya, za, scale); +} + +void DragonBreathParticle::render(Tesselator *t, float a, float xa, float ya, float za, float xa2, float za2) +{ + float l = ((age + a) / lifetime) * 32; + if (l < 0) l = 0; + if (l > 1) l = 1; + + size = oSize * l; + Particle::render(t, a, xa, ya, za, xa2, za2); +} + +void DragonBreathParticle::tick() +{ + xo = x; + yo = y; + zo = z; + + if (age++ >= lifetime) remove(); + + setMiscTex( ( 3 * age / lifetime) + 5 ); + + if(onGround) + { + yd = 0; + m_bHasHitGround = true; + } + + if(m_bHasHitGround) yd += 0.002; //0.004; + + move(xd, yd, zd); + if (y == yo) + { + xd *= 1.1; + zd *= 1.1; + } + xd *= 0.96f; + zd *= 0.96f; + + if(m_bHasHitGround) yd *= 0.96f; + + // if (onGround) + //{ + // xd *= 0.7f; + // zd *= 0.7f; + // } +} + +int DragonBreathParticle::getParticleTexture() +{ + return ParticleEngine::DRAGON_BREATH_TEXTURE; +} + +float DragonBreathParticle::getBrightness(float a) +{ + float l = ((age + a) / lifetime) * 32; + if (l < 0) l = 0; + if (l > 1) l = 1; + + float brightness = (0.5f / l) + 0.5f; + + return brightness; +} \ No newline at end of file diff --git a/Minecraft.Client/DragonBreathParticle.h b/Minecraft.Client/DragonBreathParticle.h new file mode 100644 index 00000000..e9199d7c --- /dev/null +++ b/Minecraft.Client/DragonBreathParticle.h @@ -0,0 +1,20 @@ +#pragma once +#include "Particle.h" + +class DragonBreathParticle : public Particle +{ +public: + virtual eINSTANCEOF GetType() { return eTYPE_DRAGONBREATHPARTICLE; } +private: + bool m_bHasHitGround; + void init(Level *level, double x, double y, double z, double xa, double ya, double za, float scale); // 4J - added +public: + DragonBreathParticle(Level *level, double x, double y, double z, double xa, double ya, double za); + float oSize; + + DragonBreathParticle(Level *level, double x, double y, double z, double xa, double ya, double za, float scale); + virtual void render(Tesselator *t, float a, float xa, float ya, float za, float xa2, float za2); + virtual void tick(); + virtual int getParticleTexture(); + virtual float getBrightness(float a); +}; \ No newline at end of file diff --git a/Minecraft.Client/DragonModel.cpp b/Minecraft.Client/DragonModel.cpp new file mode 100644 index 00000000..9e0499a9 --- /dev/null +++ b/Minecraft.Client/DragonModel.cpp @@ -0,0 +1,248 @@ +#include "stdafx.h" +#include "DragonModel.h" +#include "..\Minecraft.World\Mth.h" +#include "..\Minecraft.World\Enderdragon.h" + +DragonModel::DragonModel(float g) : Model() +{ + // 4J-PB + texWidth = 256; + texHeight = 256; + + setMapTex(L"body.body", 0, 0); + setMapTex(L"wing.skin", -56, 88); + setMapTex(L"wingtip.skin", -56, 144); + setMapTex(L"rearleg.main", 0, 0); + setMapTex(L"rearfoot.main", 112, 0); + setMapTex(L"rearlegtip.main", 196, 0); + setMapTex(L"head.upperhead", 112, 30); + setMapTex(L"wing.bone", 112, 88); + setMapTex(L"head.upperlip", 176, 44); + setMapTex(L"jaw.jaw", 176, 65); + setMapTex(L"frontleg.main", 112, 104); + setMapTex(L"wingtip.bone", 112, 136); + setMapTex(L"frontfoot.main", 144, 104); + setMapTex(L"neck.box", 192, 104); + setMapTex(L"frontlegtip.main", 226, 138); + setMapTex(L"body.scale", 220, 53); + setMapTex(L"head.scale", 0, 0); + setMapTex(L"neck.scale", 48, 0); + setMapTex(L"head.nostril", 112, 0); + + float zo = -16; + head = new ModelPart(this, L"head"); + head->addBox(L"upperlip", -6, -1, -8 + zo, 12, 5, 16); + head->addBox(L"upperhead", -8, -8, 6 + zo, 16, 16, 16); + head->bMirror = true; + head->addBox(L"scale", -1 - 4, -12, 12 + zo, 2, 4, 6); + head->addBox(L"nostril", -1 - 4, -3, -6 + zo, 2, 2, 4); + head->bMirror = false; + head->addBox(L"scale", -1 + 4, -12, 12 + zo, 2, 4, 6); + head->addBox(L"nostril", -1 + 4, -3, -6 + zo, 2, 2, 4); + + jaw = new ModelPart(this, L"jaw"); + jaw->setPos(0, 4, 8 + zo); + jaw->addBox(L"jaw", -6, 0, -16, 12, 4, 16); + head->addChild(jaw); + + neck = new ModelPart(this, L"neck"); + neck->addBox(L"box", -5, -5, -5, 10, 10, 10); + neck->addBox(L"scale", -1, -9, -5 + 2, 2, 4, 6); + + body = new ModelPart(this, L"body"); + body->setPos(0, 4, 8); + body->addBox(L"body", -12, 0, -16, 24, 24, 64); + body->addBox(L"scale", -1, -6, -10 + 20 * 0, 2, 6, 12); + body->addBox(L"scale", -1, -6, -10 + 20 * 1, 2, 6, 12); + body->addBox(L"scale", -1, -6, -10 + 20 * 2, 2, 6, 12); + + wing = new ModelPart(this, L"wing"); + wing->setPos(-12, 5, 2); + wing->addBox(L"bone", -56, -4, -4, 56, 8, 8); + wing->addBox(L"skin", -56, 0, +2, 56, 0, 56); + wingTip = new ModelPart(this, L"wingtip"); + wingTip->setPos(-56, 0, 0); + wingTip->addBox(L"bone", -56, -2, -2, 56, 4, 4); + wingTip->addBox(L"skin", -56, 0, +2, 56, 0, 56); + wing->addChild(wingTip); + + frontLeg = new ModelPart(this, L"frontleg"); + frontLeg->setPos(-12, 20, 2); + frontLeg->addBox(L"main", -4, -4, -4, 8, 24, 8); + frontLegTip = new ModelPart(this, L"frontlegtip"); + frontLegTip->setPos(0, 20, -1); + frontLegTip->addBox(L"main", -3, -1, -3, 6, 24, 6); + frontLeg->addChild(frontLegTip); + frontFoot = new ModelPart(this, L"frontfoot"); + frontFoot->setPos(0, 23, 0); + frontFoot->addBox(L"main", -4, 0, -12, 8, 4, 16); + frontLegTip->addChild(frontFoot); + + rearLeg = new ModelPart(this, L"rearleg"); + rearLeg->setPos(-12 - 4, 16, 2 + 40); + rearLeg->addBox(L"main", -8, -4, -8, 16, 32, 16); + rearLegTip = new ModelPart(this, L"rearlegtip"); + rearLegTip->setPos(0, 32, -4); + rearLegTip->addBox(L"main", -6, -2, 0, 12, 32, 12); + rearLeg->addChild(rearLegTip); + rearFoot = new ModelPart(this, L"rearfoot"); + rearFoot->setPos(0, 31, 4); + rearFoot->addBox(L"main", -9, 0, -20, 18, 6, 24); + rearLegTip->addChild(rearFoot); + + // 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); + jaw->compile(1.0f/16.0f); + neck->compile(1.0f/16.0f); + body->compile(1.0f/16.0f); + wing->compile(1.0f/16.0f); + wingTip->compile(1.0f/16.0f); + frontLeg->compile(1.0f/16.0f); + frontLegTip->compile(1.0f/16.0f); + frontFoot->compile(1.0f/16.0f); + rearLeg->compile(1.0f/16.0f); + rearLegTip->compile(1.0f/16.0f); + rearFoot->compile(1.0f/16.0f); +} + +void DragonModel::prepareMobModel(shared_ptr mob, float time, float r, float a) +{ + this->a = a; +} + +void DragonModel::render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) +{ + glPushMatrix(); + shared_ptr dragon = dynamic_pointer_cast(entity); + + float ttt = dragon->oFlapTime + (dragon->flapTime - dragon->oFlapTime) * a; + jaw->xRot = (float) (Mth::sin(ttt * PI * 2) + 1) * 0.2f; + + float yo = (float) (Mth::sin(ttt * PI * 2 - 1) + 1); + yo = (yo * yo * 1 + yo * 2) * 0.05f; + + glTranslatef(0, yo - 2.0f, -3); + glRotatef(yo * 2, 1, 0, 0); + + float yy = -30.0f; + float zz = 22.0f; + float xx = 0.0f; + + float rotScale = 1.5f; + + + double startComponents[3]; + doubleArray start = doubleArray(startComponents,3); + dragon->getLatencyPos(start, 6, a); + + double latencyPosAComponents[3], latencyPosBComponents[3]; + doubleArray latencyPosA = doubleArray( latencyPosAComponents, 3 ); + doubleArray latencyPosB = doubleArray( latencyPosBComponents, 3 ); + dragon->getLatencyPos(latencyPosA, 5, a); + dragon->getLatencyPos(latencyPosB, 10, a); + float rot2 = rotWrap(latencyPosA[0] - latencyPosB[0]); + float rot = rotWrap(latencyPosA[0] + rot2 / 2); + + yy += 2.0f; + + float rr = 0; + float roff = ttt * PI * 2.0f; + yy = 20.0f; + zz = -12.0f; + double pComponents[3]; + doubleArray p = doubleArray(pComponents,3); + + for (int i = 0; i < 5; i++) + { + dragon->getLatencyPos(p, 5 - i, a); + + rr = (float) Mth::cos(i * 0.45f + roff) * 0.15f; + neck->yRot = rotWrap(dragon->getHeadPartYRotDiff(i, start, p)) * PI / 180.0f * rotScale; // 4J replaced "p[0] - start[0] with call to getHeadPartYRotDiff + neck->xRot = rr + (float) (dragon->getHeadPartYOffset(i, start, p)) * PI / 180.0f * rotScale * 5.0f; // 4J replaced "p[1] - start[1]" with call to getHeadPartYOffset + neck->zRot = -rotWrap(p[0] - rot) * PI / 180.0f * rotScale; + + neck->y = yy; + neck->z = zz; + neck->x = xx; + yy += Mth::sin(neck->xRot) * 10.0f; + zz -= Mth::cos(neck->yRot) * Mth::cos(neck->xRot) * 10.0f; + xx -= Mth::sin(neck->yRot) * Mth::cos(neck->xRot) * 10.0f; + neck->render(scale,usecompiled); + } + + head->y = yy; + head->z = zz; + head->x = xx; + dragon->getLatencyPos(p, 0, a); + head->yRot = rotWrap(dragon->getHeadPartYRotDiff(6, start, p)) * PI / 180.0f * 1; // 4J replaced "p[0] - start[0] with call to getHeadPartYRotDiff + head->xRot = (float) (dragon->getHeadPartYOffset(6, start, p)) * PI / 180.0f * rotScale * 5.0f; // 4J Added + head->zRot = -rotWrap(p[0] - rot) * PI / 180 * 1; + head->render(scale,usecompiled); + glPushMatrix(); + glTranslatef(0, 1, 0); + glRotatef(-(float) (rot2) * rotScale * 1, 0, 0, 1); + glTranslatef(0, -1, 0); + body->zRot = 0; + body->render(scale,usecompiled); + + glEnable(GL_CULL_FACE); + for (int i = 0; i < 2; i++) + { + float flapTime = ttt * PI * 2; + wing->xRot = 0.125f - (float) (Mth::cos(flapTime)) * 0.2f; + wing->yRot = 0.25f; + wing->zRot = (float) (Mth::sin(flapTime) + 0.125f) * 0.8f; + wingTip->zRot = -(float) (Mth::sin(flapTime + 2.0f) + 0.5f) * 0.75f; + + rearLeg->xRot = 1.0f + yo * 0.1f; + rearLegTip->xRot = 0.5f + yo * 0.1f; + rearFoot->xRot = 0.75f + yo * 0.1f; + + frontLeg->xRot = 1.3f + yo * 0.1f; + frontLegTip->xRot = -0.5f - yo * 0.1f; + frontFoot->xRot = 0.75f + yo * 0.1f; + wing->render(scale,usecompiled); + frontLeg->render(scale,usecompiled); + rearLeg->render(scale,usecompiled); + glScalef(-1, 1, 1); + if (i == 0) + { + glCullFace(GL_FRONT); + } + } + glPopMatrix(); + glCullFace(GL_BACK); + glDisable(GL_CULL_FACE); + + rr = -(float) Mth::sin(ttt * PI * 2) * 0.0f; + roff = ttt * PI * 2; + yy = 10; + zz = 60; + xx = 0; + dragon->getLatencyPos(start, 11, a); + for (int i = 0; i < 12; i++) + { + dragon->getLatencyPos(p, 12 + i, a); + rr += Mth::sin(i * 0.45f + roff) * 0.05f; + neck->yRot = (rotWrap(p[0] - start[0]) * rotScale + 180) * PI / 180; + neck->xRot = rr + (float) (p[1] - start[1]) * PI / 180 * rotScale * 5; + neck->zRot = rotWrap(p[0] - rot) * PI / 180 * rotScale; + neck->y = yy; + neck->z = zz; + neck->x = xx; + yy += Mth::sin(neck->xRot) * 10; + zz -= Mth::cos(neck->yRot) * Mth::cos(neck->xRot) * 10; + xx -= Mth::sin(neck->yRot) * Mth::cos(neck->xRot) * 10; + neck->render(scale,usecompiled); + } + glPopMatrix(); +} +float DragonModel::rotWrap(double d) +{ + while (d >= 180) + d -= 360; + while (d < -180) + d += 360; + return (float) d; +} \ No newline at end of file diff --git a/Minecraft.Client/DragonModel.h b/Minecraft.Client/DragonModel.h new file mode 100644 index 00000000..7adbc137 --- /dev/null +++ b/Minecraft.Client/DragonModel.h @@ -0,0 +1,35 @@ +#pragma once +#include "Model.h" +#include "ModelPart.h" + +class DragonModel : public Model +{ +public: + static const int MODEL_ID = 4; + +private: + ModelPart *head; + ModelPart *neck; + ModelPart *jaw; + ModelPart *body; + ModelPart *rearLeg; + ModelPart *frontLeg; + ModelPart *rearLegTip; + ModelPart *frontLegTip; + ModelPart *rearFoot; + ModelPart *frontFoot; + ModelPart *wing; + ModelPart *wingTip; + float a; + +public: + + ModelPart *cubes[5]; + DragonModel(float g); + void prepareMobModel(shared_ptr mob, float time, float r, float a); + virtual void render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); + +private: + float rotWrap(double d); + +}; \ No newline at end of file diff --git a/Minecraft.Client/DripParticle.cpp b/Minecraft.Client/DripParticle.cpp new file mode 100644 index 00000000..9463976e --- /dev/null +++ b/Minecraft.Client/DripParticle.cpp @@ -0,0 +1,132 @@ +#include "stdafx.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\JavaMath.h" +#include "..\Minecraft.World\Mth.h" +#include "DripParticle.h" + +DripParticle::DripParticle(Level *level, double x, double y, double z, Material *material) : Particle(level, x, y, z, 0, 0, 0) +{ + xd = yd = zd = 0; + + unsigned int clr; + if (material == Material::water) + { + clr = Minecraft::GetInstance()->getColourTable()->getColor( eMinecraftColour_Particle_DripWater); + } + else + { + clr = Minecraft::GetInstance()->getColourTable()->getColor( eMinecraftColour_Particle_DripLavaStart ); + } + + rCol = ( (clr>>16)&0xFF )/255.0f; + gCol = ( (clr>>8)&0xFF )/255.0; + bCol = ( clr&0xFF )/255.0; + + setMiscTex(16 * 7 + 1); + this->setSize(0.01f, 0.01f); + gravity = 0.06f; + this->material = material; + stuckTime = 40; + + lifetime = (int) (64 / (Math::random() * 0.8 + 0.2)); + xd = yd = zd = 0; +} + +int DripParticle::getLightColor(float a) +{ + if (material == Material::water) return Particle::getLightColor(a); + + // 4J-JEV: Looks like this value was never used on the java version, + // but it is on ours, so I've changed this to be bright manualy. + int s = 0x0f; + int b = 0x0f; + return s << 20 | b << 4; // MGH changed this to a proper value as PS3 wasn't clamping the values. +} + +float DripParticle::getBrightness(float a) +{ + if (material == Material::water) return Particle::getBrightness(a); + else return 1.0f; +} + +void DripParticle::tick() +{ + xo = x; + yo = y; + zo = z; + + if (material == Material::water) + { + //rCol = 0.2f; + //gCol = 0.3f; + //bCol = 1.0f; + + unsigned int clr = Minecraft::GetInstance()->getColourTable()->getColor( eMinecraftColour_Particle_DripWater); + rCol = ( (clr>>16)&0xFF )/255.0f; + gCol = ( (clr>>8)&0xFF )/255.0; + bCol = ( clr&0xFF )/255.0; + } + else + { + //rCol = 1.0f; + //gCol = 16.0f / (40 - stuckTime + 16); + //bCol = 4.0f / (40 - stuckTime + 8); + + unsigned int cStart = Minecraft::GetInstance()->getColourTable()->getColor( eMinecraftColour_Particle_DripLavaStart ); + unsigned int cEnd = Minecraft::GetInstance()->getColourTable()->getColor( eMinecraftColour_Particle_DripLavaEnd ); + double rStart = ( (cStart>>16)&0xFF )/255.0f, gStart = ( (cStart>>8)&0xFF )/255.0, bStart = ( cStart&0xFF )/255.0; + double rEnd = ( (cEnd>>16)&0xFF )/255.0f, gEnd = ( (cEnd>>8)&0xFF )/255.0, bEnd = ( cEnd&0xFF )/255.0; + + float variance = (40 - stuckTime); + rCol = rStart - ((rStart - rEnd)/40) * variance; + gCol = gStart - ((gStart - gEnd)/40) * variance; + bCol = bStart - ((bStart - bEnd)/40) * variance; + } + + yd -= gravity; + if (stuckTime-- > 0) + { + xd *= 0.02; + yd *= 0.02; + zd *= 0.02; + setMiscTex(16 * 7 + 1); + } + else + { + setMiscTex(16 * 7 + 0); + } + move(xd, yd, zd); + xd *= 0.98f; + yd *= 0.98f; + zd *= 0.98f; + + if (lifetime-- <= 0) remove(); + + if (onGround) + { + if (material == Material::water) + { + remove(); + level->addParticle(eParticleType_splash, x, y, z, 0, 0, 0); + } + else + { + setMiscTex(16 * 7 + 2); + + } + xd *= 0.7f; + zd *= 0.7f; + } + + Material *m = level->getMaterial(Mth::floor(x), Mth::floor(y), Mth::floor(z)); + if (m->isLiquid() || m->isSolid()) + { + double y0 = Mth::floor(y) + 1 - LiquidTile::getHeight(level->getData(Mth::floor(x), Mth::floor(y), Mth::floor(z))); + if (y < y0) + { + remove(); + } + } +} diff --git a/Minecraft.Client/DripParticle.h b/Minecraft.Client/DripParticle.h new file mode 100644 index 00000000..1549c338 --- /dev/null +++ b/Minecraft.Client/DripParticle.h @@ -0,0 +1,22 @@ +#pragma once + +#include "Particle.h" + +class Level; +class Material; + +class DripParticle : public Particle +{ +private: + Material *material; + int stuckTime; + +public: + virtual eINSTANCEOF GetType() { return eTYPE_DRIPPARTICLE; } + + DripParticle(Level *level, double x, double y, double z, Material *material); + + virtual int getLightColor(float a); + virtual float getBrightness(float a); + virtual void tick(); +}; \ No newline at end of file diff --git a/Minecraft.Client/EchantmentTableParticle.cpp b/Minecraft.Client/EchantmentTableParticle.cpp new file mode 100644 index 00000000..5af7ef36 --- /dev/null +++ b/Minecraft.Client/EchantmentTableParticle.cpp @@ -0,0 +1,71 @@ +#include "stdafx.h" +#include "..\Minecraft.World\JavaMath.h" +#include "EchantmentTableParticle.h" + +EchantmentTableParticle::EchantmentTableParticle(Level *level, double x, double y, double z, double xd, double yd, double zd) : Particle(level, x, y, z, xd, yd, zd) +{ + this->xd = xd; + this->yd = yd; + this->zd = zd; + this->xStart = this->x = x; + this->yStart = this->y = y; + this->zStart = this->z = z; + + unsigned int clr = Minecraft::GetInstance()->getColourTable()->getColor( eMinecraftColour_Particle_EnchantmentTable ); //0xE5E5FF + double r = ( (clr>>16)&0xFF )/255.0f, g = ( (clr>>8)&0xFF )/255.0, b = ( clr&0xFF )/255.0; + + float br = random->nextFloat() * 0.6f + 0.4f; + rCol = r * br; + gCol = g * br; + bCol = b * br; + + oSize = size = random->nextFloat() * 0.5f + 0.2f; + + lifetime = (int) (Math::random() * 10) + 30; + noPhysics = true; + setMiscTex( (int) (Math::random() * 26 + 1 + 14 * 16) ); +} + +int EchantmentTableParticle::getLightColor(float a) +{ + int br = Particle::getLightColor(a); + + float pos = age / (float) lifetime; + pos = pos * pos; + pos = pos * pos; + + int br1 = (br) & 0xff; + int br2 = (br >> 16) & 0xff; + br2 += (int) (pos * 15 * 16); + if (br2 > 15 * 16) br2 = 15 * 16; + return br1 | br2 << 16; +} + +float EchantmentTableParticle::getBrightness(float a) +{ + float br = Particle::getBrightness(a); + float pos = age / (float) lifetime; + pos = pos * pos; + pos = pos * pos; + return br * (1 - pos) + pos; +} + +void EchantmentTableParticle::tick() +{ + xo = x; + yo = y; + zo = z; + + float pos = age / (float) lifetime; + + pos = 1 - pos; + + float pp = 1 - pos; + pp = pp * pp; + pp = pp * pp; + x = xStart + xd * pos; + y = yStart + yd * pos - pp * 1.2f; + z = zStart + zd * pos; + + if (age++ >= lifetime) remove(); +} \ No newline at end of file diff --git a/Minecraft.Client/EchantmentTableParticle.h b/Minecraft.Client/EchantmentTableParticle.h new file mode 100644 index 00000000..98b027c6 --- /dev/null +++ b/Minecraft.Client/EchantmentTableParticle.h @@ -0,0 +1,21 @@ +#pragma once + +#include "Particle.h" + +class Level; + +class EchantmentTableParticle : public Particle +{ +private: + float oSize; + double xStart, yStart, zStart; + +public: + virtual eINSTANCEOF GetType() { return eTYPE_ENCHANTMENTTABLEPARTICLE; } + + EchantmentTableParticle(Level *level, double x, double y, double z, double xd, double yd, double zd); + + virtual int getLightColor(float a); + virtual float getBrightness(float a); + virtual void tick(); +}; \ No newline at end of file diff --git a/Minecraft.Client/EditBox.cpp b/Minecraft.Client/EditBox.cpp new file mode 100644 index 00000000..54ee62ef --- /dev/null +++ b/Minecraft.Client/EditBox.cpp @@ -0,0 +1,110 @@ +#include "stdafx.h" +#include "EditBox.h" +#include "..\Minecraft.World\SharedConstants.h" + +EditBox::EditBox(Screen *screen, Font *font, int x, int y, int width, int height, const wstring& value) +{ + // 4J - added initialisers + maxLength = 0; + frame = 0; + + this->screen = screen; + this->font = font; + this->x = x; + this->y = y; + this->width = width; + this->height = height; + this->setValue(value); +} + +void EditBox::setValue(const wstring& value) +{ + this->value = value; +} + +wstring EditBox::getValue() +{ + return value; +} + +void EditBox::tick() +{ + frame++; +} + +void EditBox::keyPressed(wchar_t ch, int eventKey) +{ + if (!active || !inFocus) { + return; + } + + + if (ch == 9) + { + screen->tabPressed(); + } +/* 4J removed + if (ch == 22) + { + String msg = Screen.getClipboard(); + if (msg == null) msg = ""; + int toAdd = 32 - value.length(); + if (toAdd > msg.length()) toAdd = msg.length(); + if (toAdd > 0) { + value += msg.substring(0, toAdd); + } + } + */ + + if (eventKey == Keyboard::KEY_BACK && value.length() > 0) + { + value = value.substr(0, value.length() - 1); + } + if (SharedConstants::acceptableLetters.find(ch) != wstring::npos && (value.length() < maxLength || maxLength == 0)) + { + value += ch; + } + +} + +void EditBox::mouseClicked(int mouseX, int mouseY, int buttonNum) +{ + bool newFocus = active && (mouseX >= x && mouseX < (x + width) && mouseY >= y && mouseY < (y + height)); + focus(newFocus); +} + +void EditBox::focus(bool newFocus) +{ + if (newFocus && !inFocus) + { + // reset the underscore counter to give quicker selection feedback + frame = 0; + } + inFocus = newFocus; +} + +void EditBox::render() +{ + fill(x - 1, y - 1, x + width + 1, y + height + 1, 0xffa0a0a0); + fill(x, y, x + width, y + height, 0xff000000); + + if (active) + { + bool renderUnderscore = inFocus && (frame / 6 % 2 == 0); + drawString(font, value + (renderUnderscore ? L"_" : L""), x + 4, y + (height - 8) / 2, 0xe0e0e0); + } + else + { + drawString(font, value, x + 4, y + (height - 8) / 2, 0x707070); + } +} + +void EditBox::setMaxLength(int maxLength) +{ + this->maxLength = maxLength; +} + +int EditBox::getMaxLength() +{ + return maxLength; +} \ No newline at end of file diff --git a/Minecraft.Client/EditBox.h b/Minecraft.Client/EditBox.h new file mode 100644 index 00000000..9e24553f --- /dev/null +++ b/Minecraft.Client/EditBox.h @@ -0,0 +1,36 @@ +#pragma once +#include "GuiComponent.h" +using namespace std; +class Font; +class Screen; + +class EditBox : public GuiComponent +{ +private: + Font *font; + int x; + int y; + int width; + int height; + wstring value; + unsigned int maxLength; + int frame; + +public: + bool inFocus; + bool active; +private: + Screen *screen; + +public: + EditBox(Screen *screen, Font *font, int x, int y, int width, int height, const wstring& value); + void setValue(const wstring& value); + wstring getValue(); + void tick(); + void keyPressed(wchar_t ch, int eventKey); + void mouseClicked(int mouseX, int mouseY, int buttonNum); + void focus(bool newFocus); + void render(); + void setMaxLength(int maxLength); + int getMaxLength(); +}; \ No newline at end of file diff --git a/Minecraft.Client/EnchantTableRenderer.cpp b/Minecraft.Client/EnchantTableRenderer.cpp new file mode 100644 index 00000000..ff539fcd --- /dev/null +++ b/Minecraft.Client/EnchantTableRenderer.cpp @@ -0,0 +1,62 @@ +#include "stdafx.h" +#include "BookModel.h" +#include "..\Minecraft.World\net.minecraft.world.level.tile.entity.h" +#include "..\Minecraft.World\Mth.h" +#include "EnchantTableRenderer.h" + +ResourceLocation EnchantTableRenderer::BOOK_LOCATION = ResourceLocation(TN_ITEM_BOOK); + +EnchantTableRenderer::EnchantTableRenderer() +{ + bookModel = new BookModel(); +} + +EnchantTableRenderer::~EnchantTableRenderer() +{ + delete bookModel; +} + +void EnchantTableRenderer::render(shared_ptr _table, double x, double y, double z, float a, bool setColor, float alpha, bool useCompiled) +{ + // 4J Convert as we aren't using a templated class + shared_ptr table = dynamic_pointer_cast(_table); + +#ifdef __PSVITA__ + // AP - the book pages are made with 0 depth so the front and back polys are at the same location. This can cause z-fighting if culling is disabled which can sometimes happen + // depending on what object was last seen so make sure culling is always enabled. Should this be a problem for other platforms? + glEnable(GL_CULL_FACE); +#endif + + glPushMatrix(); + glTranslatef((float) x + 0.5f, (float) y + 12 / 16.0f, (float) z + 0.5f); + + float tt = table->time + a; + + glTranslatef(0, 0.1f + sin(tt * 0.1f) * 0.01f, 0); + float orot = (table->rot - table->oRot); + while (orot >= PI) + orot -= PI * 2; + while (orot < -PI) + orot += PI * 2; + + float yRot = table->oRot + orot * a; + + glRotatef(-yRot * 180 / PI, 0, 1, 0); + glRotatef(80, 0, 0, 1); + 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; + ff1 = (ff1 - Mth::fastFloor(ff1)) * 1.6f - 0.3f; + ff2 = (ff2 - Mth::fastFloor(ff2)) * 1.6f - 0.3f; + + if (ff1 < 0) ff1 = 0; + if (ff2 < 0) ff2 = 0; + if (ff1 > 1) ff1 = 1; + if (ff2 > 1) ff2 = 1; + + 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 new file mode 100644 index 00000000..0710d1ec --- /dev/null +++ b/Minecraft.Client/EnchantTableRenderer.h @@ -0,0 +1,20 @@ +#pragma once +#include "TileEntityRenderer.h" + +class BookModel; + +class EnchantTableRenderer : public TileEntityRenderer +{ + friend class CXuiCtrlEnchantmentBook; + friend class UIControl_EnchantmentBook; +private: + static ResourceLocation BOOK_LOCATION; + + BookModel *bookModel; + +public: + EnchantTableRenderer(); + ~EnchantTableRenderer(); + + virtual void render(shared_ptr _table, double x, double y, double z, float a, bool setColor, float alpha=1.0f, bool useCompiled = true); +}; diff --git a/Minecraft.Client/EnderChestRenderer.cpp b/Minecraft.Client/EnderChestRenderer.cpp new file mode 100644 index 00000000..52fdede9 --- /dev/null +++ b/Minecraft.Client/EnderChestRenderer.cpp @@ -0,0 +1,48 @@ +#include "stdafx.h" +#include "..\Minecraft.World\net.minecraft.world.level.tile.entity.h" +#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 + shared_ptr chest = dynamic_pointer_cast(_chest); + + int data = 0; + + if (chest->hasLevel()) + { + data = chest->getData(); + } + + bindTexture(&ENDER_CHEST_LOCATION); + + glPushMatrix(); + glEnable(GL_RESCALE_NORMAL); + //glColor4f(1, 1, 1, 1); + if( setColor ) glColor4f(1, 1, 1, alpha); + glTranslatef((float) x, (float) y + 1, (float) z + 1); + glScalef(1, -1, -1); + + glTranslatef(0.5f, 0.5f, 0.5f); + int rot = 0; + if (data == 2) rot = 180; + if (data == 3) rot = 0; + if (data == 4) rot = 90; + if (data == 5) rot = -90; + + glRotatef(rot, 0, 1, 0); + glTranslatef(-0.5f, -0.5f, -0.5f); + + float open = chest->oOpenness + (chest->openness - chest->oOpenness) * a; + open = 1 - open; + open = 1 - open * open * open; + + chestModel.lid->xRot = -(open * PI / 2); + chestModel.render(useCompiled); + glDisable(GL_RESCALE_NORMAL); + glPopMatrix(); + if( setColor ) glColor4f(1, 1, 1, 1); +} diff --git a/Minecraft.Client/EnderChestRenderer.h b/Minecraft.Client/EnderChestRenderer.h new file mode 100644 index 00000000..b3c5223e --- /dev/null +++ b/Minecraft.Client/EnderChestRenderer.h @@ -0,0 +1,13 @@ +#pragma once +#include "TileEntityRenderer.h" +#include "ChestModel.h" + +class EnderChestRenderer : public TileEntityRenderer +{ +private: + static ResourceLocation ENDER_CHEST_LOCATION; + ChestModel chestModel; + +public: + void render(shared_ptr _chest, double x, double y, double z, float a, bool setColor, float alpha=1.0f, bool useCompiled = true); // 4J added setColor param +}; diff --git a/Minecraft.Client/EnderCrystalModel.cpp b/Minecraft.Client/EnderCrystalModel.cpp new file mode 100644 index 00000000..fde03cd8 --- /dev/null +++ b/Minecraft.Client/EnderCrystalModel.cpp @@ -0,0 +1,44 @@ +#include "stdafx.h" +#include "EnderCrystalModel.h" + + + +EnderCrystalModel::EnderCrystalModel(float g) +{ + glass = new ModelPart(this, L"glass"); + glass->texOffs(0, 0)->addBox(-4, -4, -4, 8, 8, 8); + + cube = new ModelPart(this, L"cube"); + cube->texOffs(32, 0)->addBox(-4, -4, -4, 8, 8, 8); + + base = new ModelPart(this, L"base"); + base->texOffs(0, 16)->addBox(-6, 0, -6, 12, 4, 12); + + // 4J added - compile now to avoid random performance hit first time cubes are rendered + glass->compile(1.0f/16.0f); + cube->compile(1.0f/16.0f); + base->compile(1.0f/16.0f); +} + + +void EnderCrystalModel::render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) +{ + glPushMatrix(); + glScalef(2, 2, 2); + glTranslatef(0, -0.5f, 0); + base->render(scale,usecompiled); + glRotatef(r, 0, 1, 0); + glTranslatef(0, 0.8f + bob, 0); + glRotatef(60, 0.7071f, 0, 0.7071f); + glass->render(scale,usecompiled); + float ss = 14 / 16.0f; + glScalef(ss, ss, ss); + glRotatef(60, 0.7071f, 0, 0.7071f); + glRotatef(r, 0, 1, 0); + glass->render(scale,usecompiled); + glScalef(ss, ss, ss); + glRotatef(60, 0.7071f, 0, 0.7071f); + glRotatef(r, 0, 1, 0); + cube->render(scale,usecompiled); + glPopMatrix(); +} \ No newline at end of file diff --git a/Minecraft.Client/EnderCrystalModel.h b/Minecraft.Client/EnderCrystalModel.h new file mode 100644 index 00000000..71f1db10 --- /dev/null +++ b/Minecraft.Client/EnderCrystalModel.h @@ -0,0 +1,18 @@ +#pragma once +#include "Model.h" +#include "ModelPart.h" + +class EnderCrystalModel : public Model +{ +public: + static const int MODEL_ID = 1; + +private: + ModelPart *cube; + ModelPart *glass; + ModelPart *base; + +public: + EnderCrystalModel(float g); + virtual void render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); +}; \ No newline at end of file diff --git a/Minecraft.Client/EnderCrystalRenderer.cpp b/Minecraft.Client/EnderCrystalRenderer.cpp new file mode 100644 index 00000000..d2eba5e8 --- /dev/null +++ b/Minecraft.Client/EnderCrystalRenderer.cpp @@ -0,0 +1,40 @@ +#include "stdafx.h" +#include "EnderCrystalModel.h" +#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; + this->shadowRadius = 0.5f; +} + +void EnderCrystalRenderer::render(shared_ptr _crystal, double x, double y, double z, float rot, float a) +{ + // 4J - original version used generics and thus had an input parameter of type EnderCrystal rather than shared_ptr we have here - + // do some casting around instead + shared_ptr crystal = dynamic_pointer_cast(_crystal); + if (currentModel != EnderCrystalModel::MODEL_ID) + { + model = new EnderCrystalModel(0); + currentModel = EnderCrystalModel::MODEL_ID; + } + + + float tt = crystal->time + a; + glPushMatrix(); + glTranslatef((float) x, (float) y, (float) z); + 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 new file mode 100644 index 00000000..76e3b171 --- /dev/null +++ b/Minecraft.Client/EnderCrystalRenderer.h @@ -0,0 +1,18 @@ +#pragma once +#include "EntityRenderer.h" + +class Model; + +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 new file mode 100644 index 00000000..037552ed --- /dev/null +++ b/Minecraft.Client/EnderDragonRenderer.cpp @@ -0,0 +1,269 @@ +#include "stdafx.h" +#include "DragonModel.h" +#include "..\Minecraft.World\net.minecraft.world.entity.boss.enderdragon.h" +#include "Tesselator.h" +#include "Lighting.h" +#include "EnderDragonRenderer.h" +#include "BossMobGuiInfo.h" + +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) +{ + dragonModel = (DragonModel *) model; + setArmor(model); // TODO: Make second constructor that assigns this. +} + +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); + + // 4J - reorganised a bit so we can free allocations + double lpComponents[3]; + doubleArray lp = doubleArray(lpComponents, 3); + mob->getLatencyPos(lp, 7, a); + float yr = lp[0]; + //mob->getLatencyPos(lp, 5, a); + //float rot2 = lp[1]; + //mob->getLatencyPos(lp, 10,a); + //rot2 -= lp[1]; + float rot2 = mob->getTilt(a); + + glRotatef(-yr, 0, 1, 0); + + glRotatef(rot2, 1, 0, 0); + //glRotatef(rot2 * 10, 1, 0, 0); + + glTranslatef(0, 0, 1); + 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); + } +} + +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); + + if (mob->dragonDeathTime > 0) + { + float tt = (mob->dragonDeathTime / 200.0f); + glDepthFunc(GL_LEQUAL); + glEnable(GL_ALPHA_TEST); + glAlphaFunc(GL_GREATER, tt); + 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); + + glDepthFunc(GL_EQUAL); + } + + + bindTexture(mob); + model->render(mob, wp, ws, bob, headRotMinusBodyRot, headRotx, scale, true); + + if (mob->hurtTime > 0) + { + glDepthFunc(GL_EQUAL); + glDisable(GL_TEXTURE_2D); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glColor4f(1, 0, 0, 0.5f); +#ifdef __PSVITA__ + // AP - not sure that the usecompiled flag is supposed to be false. This makes it really slow on vita. Making it true still seems to look the same + model->render(mob, wp, ws, bob, headRotMinusBodyRot, headRotx, scale, true); +#else + model->render(mob, wp, ws, bob, headRotMinusBodyRot, headRotx, scale, false); +#endif + glEnable(GL_TEXTURE_2D); + glDisable(GL_BLEND); + glDepthFunc(GL_LEQUAL); + } +} + +void EnderDragonRenderer::render(shared_ptr _mob, double x, double y, double z, float rot, float a) +{ + // 4J - dynamic cast required because we aren't using templates/generics in our version + shared_ptr mob = dynamic_pointer_cast(_mob); + BossMobGuiInfo::setBossHealth(mob, false); + MobRenderer::render(mob, x, y, z, rot, a); + if (mob->nearestCrystal != NULL) + { + float tt = mob->nearestCrystal->time + a; + float hh = sin(tt * 0.2f) / 2 + 0.5f; + hh = (hh * hh + hh) * 0.2f; + + float xd = (float) (mob->nearestCrystal->x - mob->x - (mob->xo - mob->x) * (1 - a)); + float yd = (float) (hh + mob->nearestCrystal->y - 1 - mob->y - (mob->yo - mob->y) * (1 - a)); + float zd = (float) (mob->nearestCrystal->z - mob->z - (mob->zo - mob->z) * (1 - a)); + + float sdd = sqrt(xd * xd + zd * zd); + float dd = sqrt(xd * xd + yd * yd + zd * zd); + + // this fixes a problem when the dragon is hit and the beam goes black because the diffuse colour isn't being reset in MobRenderer::render + glColor4f(1, 1, 1, 1); + + glPushMatrix(); + glTranslatef((float) x, (float) y + 2, (float) z); + glRotatef((float) (-atan2(zd, xd)) * 180.0f / PI - 90.0f, 0, 1, 0); + glRotatef((float) (-atan2(sdd, yd)) * 180.0f / PI - 90.0f, 1, 0, 0); + + // 4J-PB - Rotating the healing beam too + static float fRot=0.0f; + glRotatef(fRot, 0, 0, 1); + fRot+=0.5f; // 4J - rate of rotation changed from 5.0 to 0.5 for photosensitivity reasons + if(fRot>=360.0f) + { + fRot=0.0f; + } + + Tesselator *t = Tesselator::getInstance(); + Lighting::turnOff(); + glDisable(GL_CULL_FACE); + + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_DST_ALPHA); + + bindTexture(&CRYSTAL_BEAM_LOCATION); // 4J was "/mob/enderdragon/beam.png" + + glShadeModel(GL_SMOOTH); + + float v0 = 0 - (mob->tickCount + a) * 0.005f; // 4J - rate of movement changed from 0.01 to 0.005 for photosensitivity reasons + float v1 = sqrt(xd * xd + yd * yd + zd * zd) / 32.0f - (mob->tickCount + a) * 0.005f; + + t->begin(GL_TRIANGLE_STRIP); + + int steps = 8; + for (int i = 0; i <= steps; i++) + { + double d=i % steps * PI * 2 / steps; + float s = sin(i % steps * PI * 2 / steps) * 0.75f; + float c = cos(i % steps * PI * 2 / steps) * 0.75f; + float u = i % steps * 1.0f / steps; + //t->color(0x000000); + t->vertexUV(s * 0.2f, c * 0.2f, 0, u, v1); + //t->color(0xffffff); + t->vertexUV(s, c, dd, u, v0); + } + + t->end(); + glEnable(GL_CULL_FACE); + glShadeModel(GL_FLAT); + glDisable(GL_BLEND); + + glPopMatrix(); + Lighting::turnOn(); + } +} + +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); + MobRenderer::additionalRendering(mob, a); + Tesselator *t = Tesselator::getInstance(); + + if (mob->dragonDeathTime > 0) + { + Lighting::turnOff(); + float tt = ((mob->dragonDeathTime + a) / 200.0f); + float overDrive = 0; + if (tt > 0.8f) + { + overDrive = (tt - 0.8f) / 0.2f; + } + + Random random(432); + glDisable(GL_TEXTURE_2D); + glShadeModel(GL_SMOOTH); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE); + glDisable(GL_ALPHA_TEST); + glEnable(GL_CULL_FACE); + glDepthMask(false); + glPushMatrix(); + glTranslatef(0, -1, -2); + for (int i = 0; i < (tt + tt * tt) / 2 * 60; i++) + { + glRotatef(random.nextFloat() * 360, 1, 0, 0); + glRotatef(random.nextFloat() * 360, 0, 1, 0); + glRotatef(random.nextFloat() * 360, 0, 0, 1); + glRotatef(random.nextFloat() * 360, 1, 0, 0); + glRotatef(random.nextFloat() * 360, 0, 1, 0); + glRotatef(random.nextFloat() * 360 + tt * 90, 0, 0, 1); + t->begin(GL_TRIANGLE_FAN); + float dist = random.nextFloat() * 20 + 5 + overDrive * 10; + float w = random.nextFloat() * 2 + 1 + overDrive * 2; + t->color(0xffffff, (int) (255 * (1 - overDrive))); + t->vertex(0, 0, 0); + t->color(0xff00ff, 0); + t->vertex(-0.866 * w, dist, -0.5f * w); + t->vertex(+0.866 * w, dist, -0.5f * w); + t->vertex(0, dist, 1 * w); + t->vertex(-0.866 * w, dist, -0.5f * w); + t->end(); + } + glPopMatrix(); + glDepthMask(true); + glDisable(GL_CULL_FACE); + glDisable(GL_BLEND); + glShadeModel(GL_FLAT); + glColor4f(1, 1, 1, 1); + glEnable(GL_TEXTURE_2D); + glEnable(GL_ALPHA_TEST); + Lighting::turnOn(); + } + +} + +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); + + if (layer == 1) + { + glDepthFunc(GL_LEQUAL); + } + if (layer != 0) return -1; + + 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) + // 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); +#endif + glBlendFunc(GL_ONE, GL_ONE); + glDisable(GL_LIGHTING); + glDepthFunc(GL_EQUAL); + + if (SharedConstants::TEXTURE_LIGHTING) + { + int col = 0xf0f0; + int u = col % 65536; + int v = col / 65536; + + glMultiTexCoord2f(GL_TEXTURE1, u / 1.0f, v / 1.0f); + glColor4f(1, 1, 1, 1); + } + + glEnable(GL_LIGHTING); + glColor4f(1, 1, 1, br); + return 1; +} diff --git a/Minecraft.Client/EnderDragonRenderer.h b/Minecraft.Client/EnderDragonRenderer.h new file mode 100644 index 00000000..19209a45 --- /dev/null +++ b/Minecraft.Client/EnderDragonRenderer.h @@ -0,0 +1,34 @@ +#pragma once +#include "MobRenderer.h" + +#ifdef _XBOX +class EnderDragon; +#endif +class DragonModel; + +class EnderDragonRenderer : public MobRenderer +{ +private: + static ResourceLocation DRAGON_EXPLODING_LOCATION; + static ResourceLocation CRYSTAL_BEAM_LOCATION; + static ResourceLocation DRAGON_EYES_LOCATION; + static ResourceLocation DRAGON_LOCATION; + +protected: + DragonModel *dragonModel; + +public: + EnderDragonRenderer(); + +protected: + 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); +}; \ No newline at end of file diff --git a/Minecraft.Client/EnderParticle.cpp b/Minecraft.Client/EnderParticle.cpp new file mode 100644 index 00000000..3889bf92 --- /dev/null +++ b/Minecraft.Client/EnderParticle.cpp @@ -0,0 +1,94 @@ +#include "stdafx.h" +#include "EnderParticle.h" +#include "..\Minecraft.World\JavaMath.h" +#include "..\Minecraft.World\Random.h" + +// 4J Stu - This class was originally "PortalParticle" but I have split the two uses of the particle +// End creatures/items (e.g. EnderMan, EyeOfEnder, etc) use this particle + +EnderParticle::EnderParticle(Level *level, double x, double y, double z, double xd, double yd, double zd) : Particle(level, x, y, z, xd, yd, zd) +{ + this->xd = xd; + this->yd = yd; + this->zd = zd; + this->xStart = this->x = x; + this->yStart = this->y = y; + this->zStart = this->z = z; + + // 4J-JEV: Set particle colour from colour-table. + unsigned int col = Minecraft::GetInstance()->getColourTable()->getColor( eMinecraftColour_Particle_Ender ); //0xE54CFF + rCol = ( (col>>16)&0xFF )/255.0f, gCol = ( (col>>8)&0xFF )/255.0, bCol = ( col&0xFF )/255.0; + + float br = random->nextFloat() * 0.6f + 0.4f; + rCol *= br; gCol *= br; bCol *= br; + + //rCol = gCol = bCol = 1.0f*br; + //gCol *= 0.3f; + //rCol *= 0.9f; + + oSize = size = random->nextFloat()*0.2f+0.5f; + + lifetime = (int) (Math::random()*10) + 40; + noPhysics = true; + setMiscTex((int)(Math::random()*8)); +} + +void EnderParticle::render(Tesselator *t, float a, float xa, float ya, float za, float xa2, float za2) +{ + float s = (age + a) / (float) lifetime; + s = 1-s; + s = s*s; + s = 1-s; + size = oSize * (s); + Particle::render(t, a, xa, ya, za, xa2, za2); +} + +// 4J - brought forward from 1.8.2 +int EnderParticle::getLightColor(float a) +{ + int br = Particle::getLightColor(a); + + float pos = age/(float)lifetime; + pos = pos*pos; + pos = pos*pos; + + int br1 = (br) & 0xff; + int br2 = (br >> 16) & 0xff; + br2 += (int) (pos * 15 * 16); + if (br2 > 15 * 16) br2 = 15 * 16; + return br1 | br2 << 16; +} + +float EnderParticle::getBrightness(float a) +{ + float br = Particle::getBrightness(a); + float pos = age/(float)lifetime; + pos = pos*pos; + pos = pos*pos; + return br*(1-pos)+pos; +} + +void EnderParticle::tick() +{ + xo = x; + yo = y; + zo = z; + + float pos = age/(float)lifetime; + float a = pos; + pos = -pos+pos*pos*2; +// pos = pos*pos; +// pos = pos*pos; + pos = 1-pos; + + x = xStart+xd*pos; + y = yStart+yd*pos+(1-a); + z = zStart+zd*pos; + + +// spd+=0.002/lifetime*age; + + if (age++ >= lifetime) remove(); + +// move(xd*spd, yd*spd, zd*spd); +} diff --git a/Minecraft.Client/EnderParticle.h b/Minecraft.Client/EnderParticle.h new file mode 100644 index 00000000..56b75b61 --- /dev/null +++ b/Minecraft.Client/EnderParticle.h @@ -0,0 +1,21 @@ +#pragma once +#include "Particle.h" + +// 4J Stu - This class was originally "PortalParticle" but I have split the two uses of the particle +// End creatures/items (e.g. EnderMan, EyeOfEnder, etc) use this particle + +class EnderParticle : public Particle +{ +public: + virtual eINSTANCEOF GetType() { return eType_ENDERPARTICLE; } +private: + float oSize; + double xStart, yStart, zStart; + +public: + EnderParticle(Level *level, double x, double y, double z, double xd, double yd, double zd); + virtual void render(Tesselator *t, float a, float xa, float ya, float za, float xa2, float za2); + virtual int getLightColor(float a); // 4J - brought forward from 1.8.2 + virtual float getBrightness(float a); + virtual void tick(); +}; \ No newline at end of file diff --git a/Minecraft.Client/EndermanModel.cpp b/Minecraft.Client/EndermanModel.cpp new file mode 100644 index 00000000..3a32f011 --- /dev/null +++ b/Minecraft.Client/EndermanModel.cpp @@ -0,0 +1,120 @@ +#include "stdafx.h" +#include "EndermanModel.h" +#include "ModelPart.h" + +EndermanModel::EndermanModel() : HumanoidModel(0, -14, 64, 32) +{ + carrying = false; + creepy = false; + + float yOffset = -14.0f; + float g = 0; + + delete hair; + hair = new ModelPart(this, 0, 16); + hair->addBox(-4.0f, -8.0f, -4.0f, 8, 8, 8, g - 0.5f); // Head + hair->setPos(0.0f, 0.0f + yOffset, 0.0f); + + delete body; + body = new ModelPart(this, 32, 16); + body->addBox(-4.0f, 0.0f, -2.0f, 8, 12, 4, g); // Body + body->setPos(0.0f, 0.0f + yOffset, 0.0f); + + + delete arm0; + arm0 = new ModelPart(this, 56, 0); + arm0->addBox(-1.0f, -2.0f, -1.0f, 2, 30, 2, g); // Arm0 + arm0->setPos(-3.0f, 2.0f + yOffset, 0.0f); + + + delete arm1; + arm1 = new ModelPart(this, 56, 0); + arm1->bMirror = true; + arm1->addBox(-1.0f, -2.0f, -1.0f, 2, 30, 2, g); // Arm1 + arm1->setPos(5.0f, 2.0f + yOffset, 0.0f); + + delete leg0; + leg0 = new ModelPart(this, 56, 0); + leg0->addBox(-1.0f, 0.0f, -1.0f, 2, 30, 2, g); // Leg0 + leg0->setPos(-2.0f, 12.0f + yOffset, 0.0f); + + delete leg1; + leg1 = new ModelPart(this, 56, 0); + leg1->bMirror = true; + leg1->addBox(-1.0f, 0.0f, -1.0f, 2, 30, 2, g); // Leg1 + leg1->setPos(2.0f, 12.0f + yOffset, 0.0f); + + // 4J added - compile now to avoid random performance hit first time cubes are rendered + body->compile(1.0f/16.0f); + arm0->compile(1.0f/16.0f); + arm1->compile(1.0f/16.0f); + 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, shared_ptr entity, unsigned int uiBitmaskOverrideAnim) +{ + HumanoidModel::setupAnim(time, r, bob, yRot, xRot, scale, entity, uiBitmaskOverrideAnim); + + head->visible = true; + + float yOffs = -14.0f; + body->xRot = 0.0f; + body->y = yOffs; + body->z = -0.0f; + + leg0->xRot -= 0.0f; + leg1->xRot -= 0.0f; + + arm0->xRot *= 0.5f; + arm1->xRot *= 0.5f; + leg0->xRot *= 0.5f; + leg1->xRot *= 0.5f; + + float max = 0.4f; + if (arm0->xRot > +max) arm0->xRot = +max; + if (arm1->xRot > +max) arm1->xRot = +max; + if (arm0->xRot < -max) arm0->xRot = -max; + if (arm1->xRot < -max) arm1->xRot = -max; + if (leg0->xRot > +max) leg0->xRot = +max; + if (leg1->xRot > +max) leg1->xRot = +max; + if (leg0->xRot < -max) leg0->xRot = -max; + if (leg1->xRot < -max) leg1->xRot = -max; + + + if (carrying) + { + arm0->xRot = -0.5f; + arm1->xRot = -0.5f; + arm0->zRot = 0.05f; + arm1->zRot = -0.05f; + } + + arm0->z = -0.0f; + arm1->z = -0.0f; + leg0->z = -0.0f; + leg1->z = -0.0f; + + arm0->y = 2.0f + yOffs; + arm1->y = 2.0f + yOffs; + + leg0->y = +9.0f + yOffs; + leg1->y = +9.0f + yOffs; + + head->z = -0.0f; + head->y = +yOffs + 1; + + hair->x = head->x; + hair->y = head->y; + hair->z = head->z; + hair->xRot = head->xRot; + hair->yRot = head->yRot; + hair->zRot = head->zRot; + + if (creepy) + { + float amt = 1; + head->y -= (float) (amt * 5); + } +} \ No newline at end of file diff --git a/Minecraft.Client/EndermanModel.h b/Minecraft.Client/EndermanModel.h new file mode 100644 index 00000000..5042f553 --- /dev/null +++ b/Minecraft.Client/EndermanModel.h @@ -0,0 +1,13 @@ +#pragma once + +#include "HumanoidModel.h" + +class EndermanModel : public HumanoidModel +{ +public: + bool carrying; + bool creepy; + + EndermanModel(); + 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 new file mode 100644 index 00000000..f6e5220a --- /dev/null +++ b/Minecraft.Client/EndermanRenderer.cpp @@ -0,0 +1,122 @@ +#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; + this->setArmor(model); +} + +void EndermanRenderer::render(shared_ptr _mob, double x, double y, double z, float rot, float a) +{ + // 4J - original version used generics and thus had an input parameter of type Boat rather than shared_ptr we have here - + // do some casting around instead + shared_ptr mob = dynamic_pointer_cast(_mob); + + model->carrying = mob->getCarryingTile() > 0; + model->creepy = mob->isCreepy(); + + if (mob->isCreepy()) + { + double d = 0.02; + x += random.nextGaussian() * d; + z += random.nextGaussian() * d; + } + + MobRenderer::render(mob, x, y, z, rot, 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 + shared_ptr mob = dynamic_pointer_cast(_mob); + + MobRenderer::additionalRendering(_mob, a); + + if (mob->getCarryingTile() > 0) + { + glEnable(GL_RESCALE_NORMAL); + glPushMatrix(); + + float s = 8 / 16.0f; + glTranslatef(-0 / 16.0f, 11 / 16.0f, -12 / 16.0f); + s *= 1.00f; + glRotatef(20, 1, 0, 0); + glRotatef(45, 0, 1, 0); + glScalef(-s, -s, s); + + + if (SharedConstants::TEXTURE_LIGHTING) + { + int col = mob->getLightColor(a); + int u = col % 65536; + int v = col / 65536; + + glMultiTexCoord2f(GL_TEXTURE1, u / 1.0f, v / 1.0f); + glColor4f(1, 1, 1, 1); + } + + glColor4f(1, 1, 1, 1); + 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) +{ + // 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 + shared_ptr mob = dynamic_pointer_cast(_mob); + + if (layer != 0) return -1; + + 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) + // 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); +#endif + glBlendFunc(GL_ONE, GL_ONE); + glDisable(GL_LIGHTING); + + if (mob->isInvisible()) + { + glDepthMask(false); + } + else + { + glDepthMask(true); + } + + if (SharedConstants::TEXTURE_LIGHTING) + { + int col = 0xf0f0; + int u = col % 65536; + int v = col / 65536; + + glMultiTexCoord2f(GL_TEXTURE1, u / 1.0f, v / 1.0f); + glColor4f(1, 1, 1, 1); + } + + glEnable(GL_LIGHTING); + glColor4f(1, 1, 1, br); + return 1; +} \ No newline at end of file diff --git a/Minecraft.Client/EndermanRenderer.h b/Minecraft.Client/EndermanRenderer.h new file mode 100644 index 00000000..a65464c0 --- /dev/null +++ b/Minecraft.Client/EndermanRenderer.h @@ -0,0 +1,24 @@ +#pragma once +#include "MobRenderer.h" + +class EnderMan; +class EndermanModel; + +class EndermanRenderer : public MobRenderer +{ +private: + EndermanModel *model; + Random random; + static ResourceLocation ENDERMAN_EYES_LOCATION; + static ResourceLocation ENDERMAN_LOCATION; + +public: + EndermanRenderer(); + + 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: + 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 new file mode 100644 index 00000000..f23c713c --- /dev/null +++ b/Minecraft.Client/EntityRenderDispatcher.cpp @@ -0,0 +1,370 @@ +#include "stdafx.h" +#include "EntityRenderDispatcher.h" +#include "..\Minecraft.World\net.minecraft.world.entity.projectile.h" +#include "..\Minecraft.World\net.minecraft.world.entity.animal.h" +#include "..\Minecraft.World\net.minecraft.world.entity.monster.h" +#include "..\Minecraft.World\net.minecraft.world.entity.item.h" +#include "..\Minecraft.World\net.minecraft.world.entity.global.h" +#include "..\Minecraft.World\net.minecraft.world.entity.player.h" +#include "..\Minecraft.World\net.minecraft.world.entity.boss.enderdragon.h" +#include "..\Minecraft.World\net.minecraft.world.entity.npc.h" +#include "..\Minecraft.World\net.minecraft.world.entity.h" +#include "..\Minecraft.World\net.minecraft.world.level.h" +#include "..\Minecraft.World\net.minecraft.world.level.tile.h" +#include "..\Minecraft.World\net.minecraft.world.item.h" +#include "..\Minecraft.World\net.minecraft.world.item.alchemy.h" +#include "SpiderRenderer.h" +#include "PigRenderer.h" +#include "SheepRenderer.h" +#include "CowRenderer.h" +#include "WolfRenderer.h" +#include "ChickenRenderer.h" +#include "CreeperRenderer.h" +#include "SlimeRenderer.h" +#include "PlayerRenderer.h" +#include "GhastRenderer.h" +#include "SquidRenderer.h" +#include "MobRenderer.h" +#include "GiantMobRenderer.h" +#include "EntityRenderer.h" +#include "PaintingRenderer.h" +#include "ArrowRenderer.h" +#include "FireballRenderer.h" +#include "ItemRenderer.h" +#include "ItemSpriteRenderer.h" +#include "TntRenderer.h" +#include "FallingTileRenderer.h" +#include "MinecartRenderer.h" +#include "BoatRenderer.h" +#include "FishingHookRenderer.h" +#include "LightningBoltRenderer.h" +#include "HumanoidMobRenderer.h" +#include "DefaultRenderer.h" +#include "EndermanRenderer.h" +#include "ExperienceOrbRenderer.h" +#include "SilverfishRenderer.h" +#include "MushroomCowRenderer.h" +#include "SnowmanRenderer.h" +#include "LavaSlimeRenderer.h" +#include "VillagerRenderer.h" +#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" +#include "CowModel.h" +#include "WolfModel.h" +#include "ChickenModel.h" +#include "CreeperModel.h" +#include "SlimeModel.h" +#include "GhastModel.h" +#include "SquidModel.h" +#include "MinecartModel.h" +#include "BoatModel.h" +#include "HumanoidModel.h" +#include "SheepFurModel.h" +#include "SkeletonModel.h" +#include "ModelHorse.h" +#include "Options.h" +#include "ItemFrameRenderer.h" +#include "OcelotRenderer.h" +#include "VillagerGolemRenderer.h" +#include "OcelotModel.h" +#include "ZombieRenderer.h" +#include "BatRenderer.h" +#include "CaveSpiderRenderer.h" + +double EntityRenderDispatcher::xOff = 0.0; +double EntityRenderDispatcher::yOff = 0.0; +double EntityRenderDispatcher::zOff = 0.0; + +EntityRenderDispatcher *EntityRenderDispatcher::instance = NULL; + +void EntityRenderDispatcher::staticCtor() +{ + instance = new EntityRenderDispatcher(); +} + +EntityRenderDispatcher::EntityRenderDispatcher() +{ + glEnable(GL_LIGHTING); + renderers[eTYPE_SPIDER] = 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_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 SkeletonRenderer(); + renderers[eTYPE_WITCH] = new WitchRenderer(); + renderers[eTYPE_BLAZE] = new BlazeRenderer(); + renderers[eTYPE_ZOMBIE] = new ZombieRenderer(); + 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(); + renderers[eTYPE_GIANT] = new GiantMobRenderer(new ZombieModel(), 0.5f, 6); + renderers[eTYPE_GHAST] = new GhastRenderer(); + 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_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); + renderers[eTYPE_EYEOFENDERSIGNAL] = new ItemSpriteRenderer(Item::eyeOfEnder); + 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_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_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(); + glDisable(GL_LIGHTING); + + AUTO_VAR(itEnd, renderers.end()); + for( classToRendererMap::iterator it = renderers.begin(); it != itEnd; it++ ) + { + it->second->init(this); + } + + isGuiRender = false; // 4J added +} + +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) + { + EntityRenderer *r = getRenderer(dynamic_cast( e->getSuperclass() )); + renderers.insert( classToRendererMap::value_type( e, r ) ); + return r; + //assert(false); + }*/ + return it->second; +} + +EntityRenderer *EntityRenderDispatcher::getRenderer(shared_ptr e) +{ + return getRenderer(e->GetType()); +} + +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->crosshairPickMob = crosshairPickMob; + + 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 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; + } + + shared_ptr pl = dynamic_pointer_cast(player); + if (pl->ThirdPersonView() == 2) + { + 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; + +} + +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; + + // 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 + float rotDiff = entity->yRot - entity->yRotO; + if( rotDiff > 180 || rotDiff < -180) + { + if(entity->yRot > entity->yRotO) + { + rotDiff = (entity->yRot - 360) - entity->yRotO; + } + else + { + rotDiff = entity->yRot - (entity->yRotO - 360); + } + } + 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); + + 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) + { + renderer->SetItemFrame(bItemFrame); + + renderer->render(entity, x, y, z, rot, a); + 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; +} + +Font *EntityRenderDispatcher::getFont() +{ + return font; +} + +void EntityRenderDispatcher::registerTerrainTextures(IconRegister *iconRegister) +{ + //for (EntityRenderer renderer : renderers.values()) + for(AUTO_VAR(it, renderers.begin()); it != renderers.end(); ++it) + { + 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 new file mode 100644 index 00000000..07ab7c4d --- /dev/null +++ b/Minecraft.Client/EntityRenderDispatcher.h @@ -0,0 +1,55 @@ +#pragma once +#include "EntityRenderer.h" +#include "..\Minecraft.World\Entity.h" +#include "..\Minecraft.World\JavaIntHash.h" +class font; +using namespace std; + +class EntityRenderDispatcher +{ +public: + static void staticCtor(); // 4J added +private: + typedef unordered_map classToRendererMap; + classToRendererMap renderers; + // 4J - was: +// Map, EntityRenderer> renderers = new HashMap, EntityRenderer>(); + +public: + static EntityRenderDispatcher *instance; +private: + Font *font; + +public: + static double xOff, yOff, zOff; + + Textures *textures; + ItemInHandRenderer *itemInHandRenderer; + Level *level; + shared_ptr cameraEntity; + shared_ptr crosshairPickMob; + float playerRotY; + float playerRotX; + Options *options; + bool isGuiRender; // 4J added + + double xPlayer, yPlayer, zPlayer; + +private: + EntityRenderDispatcher(); + +public: + EntityRenderer *getRenderer(eINSTANCEOF e); + EntityRenderer *getRenderer(shared_ptr e); + 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 new file mode 100644 index 00000000..9aa4ad7d --- /dev/null +++ b/Minecraft.Client/EntityRenderer.cpp @@ -0,0 +1,410 @@ +#include "stdafx.h" +#include "EntityRenderer.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\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" + +ResourceLocation EntityRenderer::SHADOW_LOCATION = ResourceLocation(TN__CLAMP__MISC_SHADOW); + +// 4J - added +EntityRenderer::EntityRenderer() +{ + model = NULL; + tileRenderer = new TileRenderer(); + shadowRadius = 0; + shadowStrength = 1.0f; +} + +EntityRenderer::~EntityRenderer() +{ + delete tileRenderer; +} + +void EntityRenderer::bindTexture(shared_ptr entity) +{ + bindTexture(getTextureLocation(entity)); +} + +void EntityRenderer::bindTexture(ResourceLocation *location) +{ + entityRenderDispatcher->textures->bindTexture(location); +} + +bool EntityRenderer::bindTexture(const wstring& urlTexture, int backupTexture) +{ + Textures *t = entityRenderDispatcher->textures; + + // 4J-PB - no http textures on the xbox, mem textures instead + + //int id = t->loadHttpTexture(urlTexture, backupTexture); + int id = t->loadMemTexture(urlTexture, backupTexture); + + if (id >= 0) + { + glBindTexture(GL_TEXTURE_2D, id); + t->clearLastBoundId(); + return true; + } + else + { + return false; + } +} + +bool EntityRenderer::bindTexture(const wstring& urlTexture, const wstring &backupTexture) +{ + Textures *t = entityRenderDispatcher->textures; + + // 4J-PB - no http textures on the xbox, mem textures instead + + //int id = t->loadHttpTexture(urlTexture, backupTexture); + int id = t->loadMemTexture(urlTexture, backupTexture); + + if (id >= 0) + { + glBindTexture(GL_TEXTURE_2D, id); + t->clearLastBoundId(); + return true; + } + else + { + return false; + } +} + +void EntityRenderer::renderFlame(shared_ptr e, double x, double y, double z, float a) +{ + glDisable(GL_LIGHTING); + + Icon *fire1 = Tile::fire->getTextureLayer(0); + Icon *fire2 = Tile::fire->getTextureLayer(1); + + glPushMatrix(); + glTranslatef((float) x, (float) y, (float) z); + + float s = e->bbWidth * 1.4f; + glScalef(s, s, s); + MemSect(31); + bindTexture(&TextureAtlas::LOCATION_BLOCKS); + MemSect(0); + Tesselator *t = Tesselator::getInstance(); + + float r = 0.5f; + float xo = 0.0f; + + float h = e->bbHeight / s; + float yo = (float) (e->y - e->bb->y0); + + 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) + { + Icon *tex = NULL; + if (ss % 2 == 0) + { + tex = fire1; + } + else + { + tex = fire2; + } + + float u0 = tex->getU0(); + float v0 = tex->getV0(); + float u1 = tex->getU1(); + float v1 = tex->getV1(); + + 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); + +} +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); + + MemSect(31); + entityRenderDispatcher->textures->bindTexture(&SHADOW_LOCATION); + MemSect(0); + + Level *level = getLevel(); + + glDepthMask(false); + float r = shadowRadius; + float fYLocalPlayerShadowOffset=0.0f; + + if (e->instanceof(eTYPE_MOB)) + { + shared_ptr mob = dynamic_pointer_cast(e); + r *= mob->getSizeScale(); + + + if (mob->instanceof(eTYPE_ANIMAL)) + { + if (dynamic_pointer_cast(mob)->isBaby()) + { + r *= 0.5f; + } + } + } + + 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(e->instanceof(eTYPE_LOCALPLAYER)) + { + ey-=1.62; + fYLocalPlayerShadowOffset=-1.62f; + } + 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); + + double xo = x - ex; + double yo = y - ey; + 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++) + { + 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(); + + glColor4f(1, 1, 1, 1); + glDisable(GL_BLEND); + glDepthMask(true); + glEnable(GL_LIGHTING); + +} + +Level *EntityRenderer::getLevel() +{ + return entityRenderDispatcher->level; +} + +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; + + double a = ((pow - (y - (yt + yo)) / 2) * 0.5f) * getLevel()->getBrightness(xt, yt, zt); + if (a < 0) return; + if (a > 1) a = 1; + + t->color(1.0f, 1.0f, 1.0f, (float) a); + // glColor4f(1, 1, 1, (float) a); + + double x0 = xt + tt->getShapeX0() + xo; + double x1 = xt + tt->getShapeX1() + xo; + double y0 = yt + tt->getShapeY0() + yo + 1.0 / 64.0f; + double z0 = zt + tt->getShapeZ0() + zo; + double z1 = zt + tt->getShapeZ1() + zo; + + float u0 = (float) ((x - (x0)) / 2 / r + 0.5f); + float u1 = (float) ((x - (x1)) / 2 / r + 0.5f); + float v0 = (float) ((z - (z0)) / 2 / r + 0.5f); + float v1 = (float) ((z - (z1)) / 2 / r + 0.5f); + + // u0 = 0; + // v0 = 0; + // u1 = 1; + // v1 = 1; + + t->vertexUV((float)(x0), (float)( y0), (float)( z0), (float)( u0), (float)( v0)); + t->vertexUV((float)(x0), (float)( y0), (float)( z1), (float)( u0), (float)( v1)); + t->vertexUV((float)(x1), (float)( y0), (float)( z1), (float)( u1), (float)( v1)); + t->vertexUV((float)(x1), (float)( y0), (float)( z0), (float)( u1), (float)( v0)); +} + +void EntityRenderer::render(AABB *bb, double xo, double yo, double zo) +{ + glDisable(GL_TEXTURE_2D); + Tesselator *t = Tesselator::getInstance(); + glColor4f(1, 1, 1, 1); + t->begin(); + t->offset((float)xo, (float)yo, (float)zo); + t->normal(0, 0, -1); + t->vertex((float)(bb->x0), (float)( bb->y1), (float)( bb->z0)); + t->vertex((float)(bb->x1), (float)( bb->y1), (float)( bb->z0)); + t->vertex((float)(bb->x1), (float)( bb->y0), (float)( bb->z0)); + t->vertex((float)(bb->x0), (float)( bb->y0), (float)( bb->z0)); + + t->normal(0, 0, 1); + t->vertex((float)(bb->x0), (float)( bb->y0), (float)( bb->z1)); + t->vertex((float)(bb->x1), (float)( bb->y0), (float)( bb->z1)); + t->vertex((float)(bb->x1), (float)( bb->y1), (float)( bb->z1)); + t->vertex((float)(bb->x0), (float)( bb->y1), (float)( bb->z1)); + + t->normal(0, -1, 0); + t->vertex((float)(bb->x0), (float)( bb->y0), (float)( bb->z0)); + t->vertex((float)(bb->x1), (float)( bb->y0), (float)( bb->z0)); + t->vertex((float)(bb->x1), (float)( bb->y0), (float)( bb->z1)); + t->vertex((float)(bb->x0), (float)( bb->y0), (float)( bb->z1)); + + t->normal(0, 1, 0); + t->vertex((float)(bb->x0), (float)( bb->y1), (float)( bb->z1)); + t->vertex((float)(bb->x1), (float)( bb->y1), (float)( bb->z1)); + t->vertex((float)(bb->x1), (float)( bb->y1), (float)( bb->z0)); + t->vertex((float)(bb->x0), (float)( bb->y1), (float)( bb->z0)); + + t->normal(-1, 0, 0); + t->vertex((float)(bb->x0), (float)( bb->y0), (float)( bb->z1)); + t->vertex((float)(bb->x0), (float)( bb->y1), (float)( bb->z1)); + t->vertex((float)(bb->x0), (float)( bb->y1), (float)( bb->z0)); + t->vertex((float)(bb->x0), (float)( bb->y0), (float)( bb->z0)); + + t->normal(1, 0, 0); + t->vertex((float)(bb->x1), (float)( bb->y0), (float)( bb->z0)); + t->vertex((float)(bb->x1), (float)( bb->y1), (float)( bb->z0)); + t->vertex((float)(bb->x1), (float)( bb->y1), (float)( bb->z1)); + t->vertex((float)(bb->x1), (float)( bb->y0), (float)( bb->z1)); + t->offset(0, 0, 0); + t->end(); + glEnable(GL_TEXTURE_2D); + // model.render(0, 1) +} + +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(); +} + +void EntityRenderer::renderFlat(float x0, float y0, float z0, float x1, float y1, float z1) +{ + Tesselator *t = Tesselator::getInstance(); + t->begin(); + t->vertex(x0, y1, z0); + t->vertex(x1, y1, z0); + t->vertex(x1, y0, z0); + t->vertex(x0, y0, z0); + t->vertex(x0, y0, z1); + t->vertex(x1, y0, z1); + t->vertex(x1, y1, z1); + t->vertex(x0, y1, z1); + t->vertex(x0, y0, z0); + t->vertex(x1, y0, z0); + t->vertex(x1, y0, z1); + t->vertex(x0, y0, z1); + t->vertex(x0, y1, z1); + t->vertex(x1, y1, z1); + t->vertex(x1, y1, z0); + t->vertex(x0, y1, z0); + t->vertex(x0, y0, z1); + t->vertex(x0, y1, z1); + t->vertex(x0, y1, z0); + t->vertex(x0, y0, z0); + t->vertex(x1, y0, z0); + t->vertex(x1, y1, z0); + t->vertex(x1, y1, z1); + t->vertex(x1, y0, z1); + t->end(); +} + +void EntityRenderer::init(EntityRenderDispatcher *entityRenderDispatcher) +{ + this->entityRenderDispatcher = entityRenderDispatcher; +} + +void EntityRenderer::postRender(shared_ptr entity, double x, double y, double z, float rot, float a, bool bRenderPlayerShadow) +{ + if( !entityRenderDispatcher->isGuiRender ) // 4J - added, don't render shadow in gui as it uses its own blending, and we have globally enabled blending for interface opacity + { + if (bRenderPlayerShadow && entityRenderDispatcher->options->fancyGraphics && shadowRadius > 0 && !entity->isInvisible()) + { + double dist = entityRenderDispatcher->distanceToSqr(entity->x, entity->y, entity->z); + float pow = (float) ((1 - dist / (16.0f * 16.0f)) * shadowStrength); + if (pow > 0) + { + renderShadow(entity, x, y, z, pow, a); + } + } + } + if (entity->isOnFire()) renderFlame(entity, x, y, z, a); +} + +Font *EntityRenderer::getFont() +{ + return entityRenderDispatcher->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 new file mode 100644 index 00000000..ef3b63bd --- /dev/null +++ b/Minecraft.Client/EntityRenderer.h @@ -0,0 +1,72 @@ +#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; + +class EntityRenderDispatcher; +class Font; + +// 4J - this was originally a generic of type EntityRenderer +class EntityRenderer +{ + friend class PlayerRenderer; // 4J Added to allow PlayerRenderer to call renderShadow +protected: + EntityRenderDispatcher *entityRenderDispatcher; + +private: + 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 + +protected: + float shadowRadius; + float shadowStrength; + +public: + EntityRenderer(); // 4J - added + virtual ~EntityRenderer(); +public: + virtual void render(shared_ptr entity, double x, double y, double z, float rot, float a) = 0; +protected: + 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 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); + + virtual Level *getLevel(); + virtual void renderTileShadow(Tile *tt, double x, double y, double z, int xt, int yt, int zt, float pow, float r, double xo, double yo, double zo); +public: + virtual void render(AABB *bb, double xo, double yo, double zo); + static void renderFlat(AABB *bb); + static void renderFlat(float x0, float y0, float z0, float x1, float y1, float z1); + virtual void init(EntityRenderDispatcher *entityRenderDispatcher); + virtual void postRender(shared_ptr entity, double x, double y, double z, float rot, float a, bool bRenderPlayerShadow); + virtual Font *getFont(); + virtual void registerTerrainTextures(IconRegister *iconRegister); + +public: + // 4J Added + virtual Model *getModel() { return model; } + virtual void SetItemFrame(bool bSet) {} +}; diff --git a/Minecraft.Client/EntityTileRenderer.cpp b/Minecraft.Client/EntityTileRenderer.cpp new file mode 100644 index 00000000..deed369e --- /dev/null +++ b/Minecraft.Client/EntityTileRenderer.cpp @@ -0,0 +1,30 @@ +#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; + +EntityTileRenderer::EntityTileRenderer() +{ + chest = shared_ptr(new ChestTileEntity()); + trappedChest = shared_ptr(new ChestTileEntity(ChestTile::TYPE_TRAP)); + enderChest = shared_ptr(new EnderChestTileEntity()); +} + +void EntityTileRenderer::render(Tile *tile, int data, float brightness, float alpha, bool setColor, bool useCompiled) +{ + if (tile->id == Tile::enderChest_Id) + { + 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 new file mode 100644 index 00000000..b5f714dc --- /dev/null +++ b/Minecraft.Client/EntityTileRenderer.h @@ -0,0 +1,20 @@ +#pragma once + +class ChestTileEntity; +class EnderChestTileEntity; +class Tile; + +class EntityTileRenderer + { + public: + static EntityTileRenderer *instance; + + private: + shared_ptr chest; + shared_ptr trappedChest; + shared_ptr enderChest; + + public: + EntityTileRenderer(); + void render(Tile *tile, int data, float brightness, float alpha, bool setColor = true, bool useCompiled = true); // 4J - added setColor parameter and alpha for chest in the crafting menu, and added useCompiled +}; diff --git a/Minecraft.Client/EntityTracker.cpp b/Minecraft.Client/EntityTracker.cpp new file mode 100644 index 00000000..adc230ee --- /dev/null +++ b/Minecraft.Client/EntityTracker.cpp @@ -0,0 +1,248 @@ +#include "stdafx.h" +#include "EntityTracker.h" +#include "MinecraftServer.h" +#include "PlayerList.h" +#include "TrackedEntity.h" +#include "ServerPlayer.h" +#include "ServerLevel.h" +#include "..\Minecraft.World\Mth.h" +#include "..\Minecraft.World\net.minecraft.world.entity.h" +#include "..\Minecraft.World\net.minecraft.world.entity.item.h" +#include "..\Minecraft.World\net.minecraft.world.entity.monster.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.global.h" +#include "..\Minecraft.World\net.minecraft.world.entity.projectile.h" +#include "..\Minecraft.World\net.minecraft.world.entity.boss.enderdragon.h" +#include "..\Minecraft.World\net.minecraft.network.packet.h" +#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) +{ + this->level = level; + maxRange = level->getServer()->getPlayers()->getMaxRange(); +} + +void EntityTracker::addEntity(shared_ptr e) +{ + if (e->instanceof(eTYPE_SERVERPLAYER)) + { + addEntity(e, 32 * 16, 2); + shared_ptr player = dynamic_pointer_cast(e); + for( AUTO_VAR(it, entities.begin()); it != entities.end(); it++ ) + { + if( (*it)->e != player ) + { + (*it)->updatePlayer(this, player); + } + } + } + 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->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) +{ + addEntity(e, range, updateInterval, false); +} + +void EntityTracker::addEntity(shared_ptr e, int range, int updateInterval, bool trackDeltas) +{ + if (range > maxRange) range = maxRange; + if (entityMap.find(e->entityId) != entityMap.end()) + { + assert(false); // Entity already tracked + } + if( e->entityId >= 2048 ) + { + __debugbreak(); + } + shared_ptr te = shared_ptr( new TrackedEntity(e, range, updateInterval, trackDeltas) ); + entities.insert(te); + entityMap[e->entityId] = te; + te->updatePlayers(this, &level->players); +} + +// 4J - have split removeEntity into two bits - it used to do the equivalent of EntityTracker::removePlayer followed by EntityTracker::removeEntity. +// This is to allow us to now choose to remove the player as a "seenBy" only when the player has actually been removed from the level's own player array +void EntityTracker::removeEntity(shared_ptr e) +{ + AUTO_VAR(it, entityMap.find(e->entityId)); + if( it != entityMap.end() ) + { + shared_ptr te = it->second; + entityMap.erase(it); + entities.erase(te); + te->broadcastRemoved(); + } +} + +void EntityTracker::removePlayer(shared_ptr e) +{ + if (e->GetType() == eTYPE_SERVERPLAYER) + { + shared_ptr player = dynamic_pointer_cast(e); + for( AUTO_VAR(it, entities.begin()); it != entities.end(); it++ ) + { + (*it)->removePlayer(player); + } + + // 4J: Flush now to ensure remove packets are sent before player respawns and add entity packets are sent + player->flushEntitiesToRemove(); + } +} + +void EntityTracker::tick() +{ + vector > movedPlayers; + for( AUTO_VAR(it, entities.begin()); it != entities.end(); it++ ) + { + shared_ptr te = *it; + te->tick(this, &level->players); + if (te->moved && te->e->GetType() == eTYPE_SERVERPLAYER) + { + movedPlayers.push_back(dynamic_pointer_cast(te->e)); + } + } + + // 4J Stu - If one player on a system is updated, then make sure they all are as they all have their + // range extended to include entities visible by any other player on the system + // Fix for #11194 - Gameplay: Host player and their split-screen avatars can become invisible and invulnerable to client. + MinecraftServer *server = MinecraftServer::getInstance(); + for( unsigned int i = 0; i < server->getPlayers()->players.size(); i++ ) + { + shared_ptr ep = server->getPlayers()->players[i]; + if( ep->dimension != level->dimension->id ) continue; + + if( ep->connection == NULL ) continue; + INetworkPlayer *thisPlayer = ep->connection->getNetworkPlayer(); + if( thisPlayer == NULL ) continue; + + bool addPlayer = false; + for (unsigned int j = 0; j < movedPlayers.size(); j++) + { + shared_ptr sp = movedPlayers[j]; + + if( sp == ep ) break; + + if(sp->connection == NULL) continue; + INetworkPlayer *otherPlayer = sp->connection->getNetworkPlayer(); + if( otherPlayer != NULL && thisPlayer->IsSameSystem(otherPlayer) ) + { + addPlayer = true; + break; + } + } + if( addPlayer ) movedPlayers.push_back( ep ); + } + + for (unsigned int i = 0; i < movedPlayers.size(); i++) + { + shared_ptr player = movedPlayers[i]; + if(player->connection == NULL) continue; + for( AUTO_VAR(it, entities.begin()); it != entities.end(); it++ ) + { + shared_ptr te = *it; + if (te->e != player) + { + te->updatePlayer(this, player); + } + } + } + + // 4J Stu - We want to do this for dead players as they don't tick normally + for(AUTO_VAR(it, level->players.begin()); it != level->players.end(); ++it) + { + shared_ptr player = dynamic_pointer_cast(*it); + if(!player->isAlive()) + { + player->flushEntitiesToRemove(); + } + } +} + +void EntityTracker::broadcast(shared_ptr e, shared_ptr packet) +{ + AUTO_VAR(it, entityMap.find( e->entityId )); + if( it != entityMap.end() ) + { + shared_ptr te = it->second; + te->broadcast(packet); + } +} + +void EntityTracker::broadcastAndSend(shared_ptr e, shared_ptr packet) +{ + AUTO_VAR(it, entityMap.find( e->entityId )); + if( it != entityMap.end() ) + { + shared_ptr te = it->second; + te->broadcastAndSend(packet); + } +} + +void EntityTracker::clear(shared_ptr serverPlayer) +{ + for( AUTO_VAR(it, entities.begin()); it != entities.end(); it++ ) + { + shared_ptr te = *it; + te->clear(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() +{ + maxRange = level->getServer()->getPlayers()->getMaxRange(); +} + + +shared_ptr EntityTracker::getTracker(shared_ptr e) +{ + AUTO_VAR(it, entityMap.find(e->entityId)); + if( it != entityMap.end() ) + { + return it->second; + } + return nullptr; +} \ No newline at end of file diff --git a/Minecraft.Client/EntityTracker.h b/Minecraft.Client/EntityTracker.h new file mode 100644 index 00000000..6ff9fe0f --- /dev/null +++ b/Minecraft.Client/EntityTracker.h @@ -0,0 +1,37 @@ +#pragma once +#include "..\Minecraft.World\HashExtension.h" +#include "..\Minecraft.World\JavaIntHash.h" +class Entity; +class ServerPlayer; +class TrackedEntity; +class MinecraftServer; +class Packet; + +using namespace std; + +class EntityTracker +{ +private: + ServerLevel *level; + unordered_set > entities; + unordered_map , IntKeyHash2, IntKeyEq> entityMap; // was IntHashMap + int maxRange; + +public: + EntityTracker(ServerLevel *level); + void addEntity(shared_ptr e); + void addEntity(shared_ptr e, int range, int updateInterval); + void addEntity(shared_ptr e, int range, int updateInterval, bool trackDeltas); + void removeEntity(shared_ptr e); + void removePlayer(shared_ptr e); // 4J added + void tick(); + void broadcast(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 + + + // 4J-JEV: Added, needed access to tracked entity of a riders mount. + shared_ptr getTracker(shared_ptr entity); +}; diff --git a/Minecraft.Client/ErrorScreen.cpp b/Minecraft.Client/ErrorScreen.cpp new file mode 100644 index 00000000..44cb6501 --- /dev/null +++ b/Minecraft.Client/ErrorScreen.cpp @@ -0,0 +1,27 @@ +#include "stdafx.h" +#include "ErrorScreen.h" + +ErrorScreen::ErrorScreen(const wstring& title, const wstring& message) +{ + this->title = title; + this->message = message; +} + +void ErrorScreen::init() +{ +} + +void ErrorScreen::render(int xm, int ym, float a) +{ + // fill(0, 0, width, height, 0x40000000); + fillGradient(0, 0, width, height, 0xff402020, 0xff501010); + + drawCenteredString(font, title, width/2, 90, 0xffffff); + drawCenteredString(font, message, width/2, 110, 0xffffff); + + Screen::render(xm, ym, a); +} + +void ErrorScreen::keyPressed(wchar_t eventCharacter, int eventKey) +{ +} \ No newline at end of file diff --git a/Minecraft.Client/ErrorScreen.h b/Minecraft.Client/ErrorScreen.h new file mode 100644 index 00000000..84ff667f --- /dev/null +++ b/Minecraft.Client/ErrorScreen.h @@ -0,0 +1,14 @@ +#pragma once +#include "Screen.h" + +class ErrorScreen : public Screen +{ +private: + wstring title, message; +public: + ErrorScreen(const wstring& title, const wstring& message); + virtual void init(); + virtual void render(int xm, int ym, float a); +protected: + virtual void keyPressed(wchar_t eventCharacter, int eventKey); +}; \ No newline at end of file diff --git a/Minecraft.Client/ExperienceOrbRenderer.cpp b/Minecraft.Client/ExperienceOrbRenderer.cpp new file mode 100644 index 00000000..c0eae756 --- /dev/null +++ b/Minecraft.Client/ExperienceOrbRenderer.cpp @@ -0,0 +1,93 @@ +#include "stdafx.h" +#include "ExperienceOrbRenderer.h" +#include "..\Minecraft.World\net.minecraft.world.entity.h" +#include "..\Minecraft.World\net.minecraft.world.level.tile.h" +#include "..\Minecraft.World\net.minecraft.world.item.h" +#include "Tesselator.h" +#include "EntityRenderDispatcher.h" +#include "..\Minecraft.World\Mth.h" +#include "..\Minecraft.World\JavaMath.h" + +ResourceLocation ExperienceOrbRenderer::XP_ORB_LOCATION = ResourceLocation(TN_ITEM_EXPERIENCE_ORB); + +ExperienceOrbRenderer::ExperienceOrbRenderer() +{ + 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); + glPushMatrix(); + glTranslatef((float) x, (float) y, (float) z); + + int icon = orb->getIcon(); + bindTexture(orb); // 4J was L"/item/xporb.png" + + float u0 = ((icon % 4) * 16 + 0) / 64.0f; + float u1 = ((icon % 4) * 16 + 16) / 64.0f; + float v0 = ((icon / 4) * 16 + 0) / 64.0f; + float v1 = ((icon / 4) * 16 + 16) / 64.0f; + + + float r = 1.0f; + float xo = 0.5f; + float yo = 0.25f; + + if (SharedConstants::TEXTURE_LIGHTING) + { + int col = orb->getLightColor(a); + 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 = orb->getBrightness(a); + glColor4f(br, br, br, 1); + } + float br = 255.0f; + float rr = (orb->tickCount + a) / 2; + int rc = (int) ((Mth::sin(rr + 0 * PI * 2 / 3) + 1) * 0.5f * br); + int gc = (int) (br); + int bc = (int) ((Mth::sin(rr + 2 * PI * 2 / 3) + 1) * 0.1f * br); + int col = rc << 16 | gc << 8 | bc; + glRotatef(180 - entityRenderDispatcher->playerRotY, 0, 1, 0); + 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); + t->vertexUV(0 - xo, 0 - yo, 0, u0, v1); + t->vertexUV(r - xo, 0 - yo, 0, u1, v1); + t->vertexUV(r - xo, 1 - yo, 0, u1, v0); + t->vertexUV(0 - xo, 1 - yo, 0, u0, v0); + t->end(); + + glDisable(GL_BLEND); + glDisable(GL_RESCALE_NORMAL); + 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; + float us = 1 / 256.0f; + float vs = 1 / 256.0f; + Tesselator *t = Tesselator::getInstance(); + t->begin(); + t->vertexUV(x + 0, y + h, blitOffset, (sx + 0) * us, (sy + h) * vs); + t->vertexUV(x + w, y + h, blitOffset, (sx + w) * us, (sy + h) * vs); + t->vertexUV(x + w, y + 0, blitOffset, (sx + w) * us, (sy + 0) * vs); + t->vertexUV(x + 0, y + 0, blitOffset, (sx + 0) * us, (sy + 0) * vs); + t->end(); +} \ No newline at end of file diff --git a/Minecraft.Client/ExperienceOrbRenderer.h b/Minecraft.Client/ExperienceOrbRenderer.h new file mode 100644 index 00000000..68047b80 --- /dev/null +++ b/Minecraft.Client/ExperienceOrbRenderer.h @@ -0,0 +1,16 @@ +#pragma once +#include "EntityRenderer.h" + +class ExperienceOrbRenderer : public EntityRenderer +{ +private: + static ResourceLocation XP_ORB_LOCATION; + +public: + ExperienceOrbRenderer(); + + 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/ExplodeParticle.cpp b/Minecraft.Client/ExplodeParticle.cpp new file mode 100644 index 00000000..fa950a03 --- /dev/null +++ b/Minecraft.Client/ExplodeParticle.cpp @@ -0,0 +1,62 @@ +#include "stdafx.h" +#include "ExplodeParticle.h" +#include "..\Minecraft.World\JavaMath.h" +#include "..\Minecraft.World\Random.h" + +ExplodeParticle::ExplodeParticle(Level *level, double x, double y, double z, double xa, double ya, double za) : Particle(level, x, y, z, xa, ya, za) +{ + xd = xa+(float)(Math::random()*2-1)*0.05f; + yd = ya+(float)(Math::random()*2-1)*0.05f; + zd = za+(float)(Math::random()*2-1)*0.05f; + + //rCol = gCol = bCol = random->nextFloat()*.3f+.7; + + unsigned int clr = Minecraft::GetInstance()->getColourTable()->getColor( eMinecraftColour_Particle_Explode ); //0xFFFFFF + double r = ( (clr>>16)&0xFF )/255.0f, g = ( (clr>>8)&0xFF )/255.0, b = ( clr&0xFF )/255.0; + + float br = random->nextFloat() * 0.3f + 0.7f; + rCol = r * br; + gCol = g * br; + bCol = b * br; + + size = random->nextFloat()*random->nextFloat()*6+1; + + lifetime = (int)(16/(random->nextFloat()*0.8+0.2))+2; +// noPhysics = true; +} + +void ExplodeParticle::render(Tesselator *t, float a, float xa, float ya, float za, float xa2, float za2) +{ + // 4J - don't render explosion particles that are less than 3 metres away, to try and avoid large particles that are causing us problems with photosensitivity testing + 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); + + float distSq = (x*x + y*y + z*z); + if( distSq < (3.0f * 3.0f) ) return; + + Particle::render(t, a, xa, ya, za, xa2, za2); +} + +void ExplodeParticle::tick() +{ + xo = x; + yo = y; + zo = z; + + if (age++ >= lifetime) remove(); + + setMiscTex(7-age*8/lifetime); + + yd += 0.004; + move(xd, yd, zd); + xd *= 0.90f; + yd *= 0.90f; + zd *= 0.90f; + + if (onGround) + { + xd *= 0.7f; + zd *= 0.7f; + } +} \ No newline at end of file diff --git a/Minecraft.Client/ExplodeParticle.h b/Minecraft.Client/ExplodeParticle.h new file mode 100644 index 00000000..e25243d6 --- /dev/null +++ b/Minecraft.Client/ExplodeParticle.h @@ -0,0 +1,11 @@ +#pragma once +#include "Particle.h" + +class ExplodeParticle : public Particle +{ +public: + virtual eINSTANCEOF GetType() { return eType_EXPLODEPARTICLE; } + ExplodeParticle(Level *level, double x, double y, double z, double xa, double ya, double za); + virtual void render(Tesselator *t, float a, float xa, float ya, float za, float xa2, float za2); + virtual void tick(); +}; \ No newline at end of file diff --git a/Minecraft.Client/Extrax64Stubs.cpp b/Minecraft.Client/Extrax64Stubs.cpp new file mode 100644 index 00000000..334f0123 --- /dev/null +++ b/Minecraft.Client/Extrax64Stubs.cpp @@ -0,0 +1,653 @@ +#include "stdafx.h" +#ifndef __PS3__ +//#include +#endif // __PS3__ + +#ifdef __PS3__ +#include "PS3\Sentient\SentientManager.h" +#include "StatsCounter.h" +#include "PS3\Social\SocialManager.h" +#include +#include +#elif defined _DURANGO +#include "Durango\Sentient\SentientManager.h" +#include "StatsCounter.h" +#include "Durango\Social\SocialManager.h" +#include "Durango\Sentient\DynamicConfigurations.h" +#include "Durango\DurangoExtras\xcompress.h" +#elif defined _WINDOWS64 +#include "Windows64\Sentient\SentientManager.h" +#include "StatsCounter.h" +#include "Windows64\Social\SocialManager.h" +#include "Windows64\Sentient\DynamicConfigurations.h" +#elif defined __PSVITA__ +#include "PSVita\Sentient\SentientManager.h" +#include "StatsCounter.h" +#include "PSVita\Social\SocialManager.h" +#include "PSVita\Sentient\DynamicConfigurations.h" +#include +#else +#include "Orbis\Sentient\SentientManager.h" +#include "StatsCounter.h" +#include "Orbis\Social\SocialManager.h" +#include "Orbis\Sentient\DynamicConfigurations.h" +#include +#endif + +#if !defined(__PS3__) && !defined(__ORBIS__) && !defined(__PSVITA__) +#ifdef _WINDOWS64 +//C4JStorage StorageManager; +C_4JProfile ProfileManager; +#endif +#endif // __PS3__ +CSentientManager SentientManager; +CXuiStringTable StringTable; + +#ifndef _XBOX_ONE +ATG::XMLParser::XMLParser() {} +ATG::XMLParser::~XMLParser() {} +HRESULT ATG::XMLParser::ParseXMLBuffer( CONST CHAR* strBuffer, UINT uBufferSize ) { return S_OK; } +VOID ATG::XMLParser::RegisterSAXCallbackInterface( ISAXCallback *pISAXCallback ) {} +#endif + +bool CSocialManager::IsTitleAllowedToPostAnything() { return false; } +bool CSocialManager::AreAllUsersAllowedToPostImages() { return false; } +bool CSocialManager::IsTitleAllowedToPostImages() { return false; } + +bool CSocialManager::PostLinkToSocialNetwork( ESocialNetwork eSocialNetwork, DWORD dwUserIndex, bool bUsingKinect ) { return false; } +bool CSocialManager::PostImageToSocialNetwork( ESocialNetwork eSocialNetwork, DWORD dwUserIndex, bool bUsingKinect ) { return false; } +CSocialManager *CSocialManager::Instance() { return NULL; } +void CSocialManager::SetSocialPostText(LPCWSTR Title, LPCWSTR Caption, LPCWSTR Desc) {}; + +DWORD XShowPartyUI(DWORD dwUserIndex) { return 0; } +DWORD XShowFriendsUI(DWORD dwUserIndex) { return 0; } +HRESULT XPartyGetUserList(XPARTY_USER_LIST *pUserList) { return S_OK; } +DWORD XContentGetThumbnail(DWORD dwUserIndex, const XCONTENT_DATA *pContentData, PBYTE pbThumbnail, PDWORD pcbThumbnail, PXOVERLAPPED *pOverlapped) { return 0; } +void XShowAchievementsUI(int i) {} +DWORD XBackgroundDownloadSetMode(XBACKGROUND_DOWNLOAD_MODE Mode) { return 0; } + +#ifndef _DURANGO +void PIXAddNamedCounter(int a, char *b, ...) {} +//#define PS3_USE_PIX_EVENTS +//#define PS4_USE_PIX_EVENTS +void PIXBeginNamedEvent(int a, char *b, ...) +{ +#ifdef PS4_USE_PIX_EVENTS + char buf[512]; + va_list args; + va_start(args,b); + vsprintf(buf,b,args); + sceRazorCpuPushMarker(buf, 0xffffffff, SCE_RAZOR_MARKER_ENABLE_HUD); + +#endif +#ifdef PS3_USE_PIX_EVENTS + char buf[256]; + wchar_t wbuf[256]; + va_list args; + va_start(args,b); + vsprintf(buf,b,args); + snPushMarker(buf); + +// mbstowcs(wbuf,buf,256); +// RenderManager.BeginEvent(wbuf); + va_end(args); +#endif +} +#if 0//__PSVITA__ + if( PixDepth < 64 ) + { + char buf[512]; + va_list args; + va_start(args,b); + vsprintf(buf,b,args); + sceRazorCpuPushMarkerWithHud(buf, 0xffffffff, SCE_RAZOR_MARKER_ENABLE_HUD); + } + PixDepth += 1; +#endif + + +void PIXEndNamedEvent() +{ +#ifdef PS4_USE_PIX_EVENTS + sceRazorCpuPopMarker(); +#endif +#ifdef PS3_USE_PIX_EVENTS + snPopMarker(); +// RenderManager.EndEvent(); +#endif +#if 0//__PSVITA__ + if( PixDepth <= 64 ) + { + sceRazorCpuPopMarker(); + } + PixDepth -= 1; +#endif +} +void PIXSetMarkerDeprecated(int a, char *b, ...) {} +#else +// 4J Stu - Removed this implementation in favour of a macro that will convert our string format +// conversion at compile time rather than at runtime +//void PIXBeginNamedEvent(int a, char *b, ...) +//{ +// char buf[256]; +// wchar_t wbuf[256]; +// va_list args; +// va_start(args,b); +// vsprintf(buf,b,args); +// +// mbstowcs(wbuf,buf,256); +// PIXBeginEvent(a,wbuf); +//} +// +//void PIXEndNamedEvent() +//{ +// PIXEndEvent(); +//} +// +//void PIXSetMarkerDeprecated(int a, char *b, ...) +//{ +// char buf[256]; +// wchar_t wbuf[256]; +// va_list args; +// va_start(args,b); +// vsprintf(buf,b,args); +// +// mbstowcs(wbuf,buf,256); +// PIXSetMarker(a, wbuf); +//} +#endif + +// void *D3DXBUFFER::GetBufferPointer() { return NULL; } +// int D3DXBUFFER::GetBufferSize() { return 0; } +// void D3DXBUFFER::Release() {} + +// #ifdef _DURANGO +// void GetLocalTime(SYSTEMTIME *time) {} +// #endif + + +bool IsEqualXUID(PlayerUID a, PlayerUID b) +{ +#if defined(__PS3__) || defined(__ORBIS__) || defined (__PSVITA__) || defined(_DURANGO) + return (a == b); +#else + return false; +#endif +} + +void XMemCpy(void *a, const void *b, size_t s) { memcpy(a, b, s); } +void XMemSet(void *a, int t, size_t s) { memset(a, t, s); } +void XMemSet128(void *a, int t, size_t s) { memset(a, t, s); } +void *XPhysicalAlloc(SIZE_T a, ULONG_PTR b, ULONG_PTR c, DWORD d) { return malloc(a); } +void XPhysicalFree(void *a) { free(a); } + +D3DXVECTOR3::D3DXVECTOR3() {} +D3DXVECTOR3::D3DXVECTOR3(float x,float y,float z) : x(x), y(y), z(z) {} +D3DXVECTOR3& D3DXVECTOR3::operator += ( CONST D3DXVECTOR3& add ) { x += add.x; y += add.y; z += add.z; return *this; } + +BYTE IQNetPlayer::GetSmallId() { return 0; } +void IQNetPlayer::SendData(IQNetPlayer *player, const void *pvData, DWORD dwDataSize, DWORD dwFlags) +{ + app.DebugPrintf("Sending from 0x%x to 0x%x %d bytes\n",this,player,dwDataSize); +} +bool IQNetPlayer::IsSameSystem(IQNetPlayer *player) { return true; } +DWORD IQNetPlayer::GetSendQueueSize( IQNetPlayer *player, DWORD dwFlags ) { return 0; } +DWORD IQNetPlayer::GetCurrentRtt() { return 0; } +bool IQNetPlayer::IsHost() { return this == &IQNet::m_player[0]; } +bool IQNetPlayer::IsGuest() { return false; } +bool IQNetPlayer::IsLocal() { return true; } +PlayerUID IQNetPlayer::GetXuid() { return INVALID_XUID; } +LPCWSTR IQNetPlayer::GetGamertag() { static const wchar_t *test = L"stub"; return test; } +int IQNetPlayer::GetSessionIndex() { return 0; } +bool IQNetPlayer::IsTalking() { return false; } +bool IQNetPlayer::IsMutedByLocalUser(DWORD dwUserIndex) { return false; } +bool IQNetPlayer::HasVoice() { return false; } +bool IQNetPlayer::HasCamera() { return false; } +int IQNetPlayer::GetUserIndex() { return this - &IQNet::m_player[0]; } +void IQNetPlayer::SetCustomDataValue(ULONG_PTR ulpCustomDataValue) { + m_customData = ulpCustomDataValue; +} +ULONG_PTR IQNetPlayer::GetCustomDataValue() { + return m_customData; +} + +IQNetPlayer IQNet::m_player[4]; + +bool _bQNetStubGameRunning = false; + +HRESULT IQNet::AddLocalPlayerByUserIndex(DWORD dwUserIndex){ return S_OK; } +IQNetPlayer *IQNet::GetHostPlayer() { return &m_player[0]; } +IQNetPlayer *IQNet::GetLocalPlayerByUserIndex(DWORD dwUserIndex) { return &m_player[dwUserIndex]; } +IQNetPlayer *IQNet::GetPlayerByIndex(DWORD dwPlayerIndex) { return &m_player[0]; } +IQNetPlayer *IQNet::GetPlayerBySmallId(BYTE SmallId){ return &m_player[0]; } +IQNetPlayer *IQNet::GetPlayerByXuid(PlayerUID xuid){ return &m_player[0]; } +DWORD IQNet::GetPlayerCount() { return 1; } +QNET_STATE IQNet::GetState() { return _bQNetStubGameRunning ? QNET_STATE_GAME_PLAY : QNET_STATE_IDLE; } +bool IQNet::IsHost() { return true; } +HRESULT IQNet::JoinGameFromInviteInfo(DWORD dwUserIndex, DWORD dwUserMask, const INVITE_INFO *pInviteInfo) { return S_OK; } +void IQNet::HostGame() { _bQNetStubGameRunning = true; } +void IQNet::EndGame() { _bQNetStubGameRunning = false; } + +DWORD MinecraftDynamicConfigurations::GetTrialTime() { return DYNAMIC_CONFIG_DEFAULT_TRIAL_TIME; } + +void XSetThreadProcessor(HANDLE a, int b) {} +// #if !(defined __PS3__) && !(defined __ORBIS__) +// BOOL XCloseHandle(HANDLE a) { return CloseHandle(a); } +// #endif // __PS3__ + +DWORD XUserGetSigninInfo( + DWORD dwUserIndex, + DWORD dwFlags, + PXUSER_SIGNIN_INFO pSigninInfo +) +{ + return 0; +} + +LPCWSTR CXuiStringTable::Lookup(LPCWSTR szId) { return szId; } +LPCWSTR CXuiStringTable::Lookup(UINT nIndex) { return L"String"; } +void CXuiStringTable::Clear() {} +HRESULT CXuiStringTable::Load(LPCWSTR szId) { return S_OK; } + +DWORD XUserAreUsersFriends( DWORD dwUserIndex, PPlayerUID pXuids, DWORD dwXuidCount, PBOOL pfResult, void *pOverlapped) { return 0; } + +#if defined __ORBIS__ || defined __PS3__ || defined _XBOX_ONE +#else +HRESULT XMemDecompress( + XMEMDECOMPRESSION_CONTEXT Context, + VOID *pDestination, + SIZE_T *pDestSize, + CONST VOID *pSource, + SIZE_T SrcSize +) +{ + memcpy(pDestination, pSource, SrcSize); + *pDestSize = SrcSize; + return S_OK; + + /* + DECOMPRESSOR_HANDLE Decompressor = (DECOMPRESSOR_HANDLE)Context; + if( Decompress( + Decompressor, // Decompressor handle + (void *)pSource, // Compressed data + SrcSize, // Compressed data size + pDestination, // Decompressed buffer + *pDestSize, // Decompressed buffer size + pDestSize) ) // Decompressed data size + { + return S_OK; + } + else + */ + { + return E_FAIL; + } +} + +HRESULT XMemCompress( + XMEMCOMPRESSION_CONTEXT Context, + VOID *pDestination, + SIZE_T *pDestSize, + CONST VOID *pSource, + SIZE_T SrcSize +) +{ + memcpy(pDestination, pSource, SrcSize); + *pDestSize = SrcSize; + return S_OK; + + /* + COMPRESSOR_HANDLE Compressor = (COMPRESSOR_HANDLE)Context; + if( Compress( + Compressor, // Compressor Handle + (void *)pSource, // Input buffer, Uncompressed data + SrcSize, // Uncompressed data size + pDestination, // Compressed Buffer + *pDestSize, // Compressed Buffer size + pDestSize) ) // Compressed Data size + { + return S_OK; + } + else + */ + { + return E_FAIL; + } +} + +HRESULT XMemCreateCompressionContext( + XMEMCODEC_TYPE CodecType, + CONST VOID *pCodecParams, + DWORD Flags, + XMEMCOMPRESSION_CONTEXT *pContext +) +{ + /* + COMPRESSOR_HANDLE Compressor = NULL; + + HRESULT hr = CreateCompressor( + COMPRESS_ALGORITHM_XPRESS_HUFF, // Compression Algorithm + NULL, // Optional allocation routine + &Compressor); // Handle + + pContext = (XMEMDECOMPRESSION_CONTEXT *)Compressor; + return hr; + */ + return 0; +} + +HRESULT XMemCreateDecompressionContext( + XMEMCODEC_TYPE CodecType, + CONST VOID *pCodecParams, + DWORD Flags, + XMEMDECOMPRESSION_CONTEXT *pContext +) +{ + /* + DECOMPRESSOR_HANDLE Decompressor = NULL; + + HRESULT hr = CreateDecompressor( + COMPRESS_ALGORITHM_XPRESS_HUFF, // Compression Algorithm + NULL, // Optional allocation routine + &Decompressor); // Handle + + pContext = (XMEMDECOMPRESSION_CONTEXT *)Decompressor; + return hr; + */ + return 0; +} + +void XMemDestroyCompressionContext(XMEMCOMPRESSION_CONTEXT Context) +{ +// COMPRESSOR_HANDLE Compressor = (COMPRESSOR_HANDLE)Context; +// CloseCompressor(Compressor); +} + +void XMemDestroyDecompressionContext(XMEMDECOMPRESSION_CONTEXT Context) +{ +// DECOMPRESSOR_HANDLE Decompressor = (DECOMPRESSOR_HANDLE)Context; +// CloseDecompressor(Decompressor); +} +#endif + +//#ifndef __PS3__ +#if !(defined _DURANGO || defined __PS3__ || defined __ORBIS__ || defined __PSVITA__) +DWORD XGetLanguage() { return 1; } +DWORD XGetLocale() { return 0; } +DWORD XEnableGuestSignin(BOOL fEnable) { return 0; } +#endif + + + +/////////////////////////////////////////////// Profile library +#ifdef _WINDOWS64 +static void *profileData[4]; +static bool s_bProfileIsFullVersion; +void C_4JProfile::Initialise( DWORD dwTitleID, + DWORD dwOfferID, + unsigned short usProfileVersion, + UINT uiProfileValuesC, + UINT uiProfileSettingsC, + DWORD *pdwProfileSettingsA, + int iGameDefinedDataSizeX4, + unsigned int *puiGameDefinedDataChangedBitmask) +{ + for( int i = 0; i < 4; i++ ) + { + profileData[i] = new byte[iGameDefinedDataSizeX4/4]; + ZeroMemory(profileData[i],sizeof(byte)*iGameDefinedDataSizeX4/4); + + // Set some sane initial values! + GAME_SETTINGS *pGameSettings = (GAME_SETTINGS *)profileData[i]; + pGameSettings->ucMenuSensitivity=100; //eGameSetting_Sensitivity_InMenu + pGameSettings->ucInterfaceOpacity=80; //eGameSetting_Sensitivity_InMenu + pGameSettings->usBitmaskValues|=0x0200; //eGameSetting_DisplaySplitscreenGamertags - on + pGameSettings->usBitmaskValues|=0x0400; //eGameSetting_Hints - on + pGameSettings->usBitmaskValues|=0x1000; //eGameSetting_Autosave - 2 + pGameSettings->usBitmaskValues|=0x8000; //eGameSetting_Tooltips - on + pGameSettings->uiBitmaskValues=0L; // reset + pGameSettings->uiBitmaskValues|=GAMESETTING_CLOUDS; //eGameSetting_Clouds - on + pGameSettings->uiBitmaskValues|=GAMESETTING_ONLINE; //eGameSetting_GameSetting_Online - on + pGameSettings->uiBitmaskValues|=GAMESETTING_FRIENDSOFFRIENDS; //eGameSetting_GameSetting_FriendsOfFriends - on + pGameSettings->uiBitmaskValues|=GAMESETTING_DISPLAYUPDATEMSG; //eGameSetting_DisplayUpdateMessage (counter) + pGameSettings->uiBitmaskValues&=~GAMESETTING_BEDROCKFOG; //eGameSetting_BedrockFog - off + pGameSettings->uiBitmaskValues|=GAMESETTING_DISPLAYHUD; //eGameSetting_DisplayHUD - on + pGameSettings->uiBitmaskValues|=GAMESETTING_DISPLAYHAND; //eGameSetting_DisplayHand - on + pGameSettings->uiBitmaskValues|=GAMESETTING_CUSTOMSKINANIM; //eGameSetting_CustomSkinAnim - on + pGameSettings->uiBitmaskValues|=GAMESETTING_DEATHMESSAGES; //eGameSetting_DeathMessages - on + pGameSettings->uiBitmaskValues|=(GAMESETTING_UISIZE&0x00000800); // uisize 2 + pGameSettings->uiBitmaskValues|=(GAMESETTING_UISIZE_SPLITSCREEN&0x00004000); // splitscreen ui size 3 + pGameSettings->uiBitmaskValues|=GAMESETTING_ANIMATEDCHARACTER; //eGameSetting_AnimatedCharacter - on + + // TU12 + // favorite skins added, but only set in TU12 - set to FFs + for(int i=0;iuiFavoriteSkinA[i]=0xFFFFFFFF; + } + pGameSettings->ucCurrentFavoriteSkinPos=0; + // Added a bitmask in TU13 to enable/disable display of the Mash-up pack worlds in the saves list + pGameSettings->uiMashUpPackWorldsDisplay = 0xFFFFFFFF; + + // PS3DEC13 + pGameSettings->uiBitmaskValues&=~GAMESETTING_PS3EULAREAD; //eGameSetting_PS3_EULA_Read - off + + // PS3 1.05 - added Greek + pGameSettings->ucLanguage = MINECRAFT_LANGUAGE_DEFAULT; // use the system language + + // PS Vita - network mode added + pGameSettings->uiBitmaskValues&=~GAMESETTING_PSVITANETWORKMODEADHOC; //eGameSetting_PSVita_NetworkModeAdhoc - off + + + // Tutorials for most menus, and a few other things + pGameSettings->ucTutorialCompletion[0] = 0xFF; + pGameSettings->ucTutorialCompletion[1] = 0xFF; + pGameSettings->ucTutorialCompletion[2] = 0xF; + + // Has gone halfway through the tutorial + pGameSettings->ucTutorialCompletion[28] |= 1<<0; + } +} +void C_4JProfile::SetTrialTextStringTable(CXuiStringTable *pStringTable,int iAccept,int iReject) {} +void C_4JProfile::SetTrialAwardText(eAwardType AwardType,int iTitle,int iText) {} +int C_4JProfile::GetLockedProfile() { return 0; } +void C_4JProfile::SetLockedProfile(int iProf) {} +bool C_4JProfile::IsSignedIn(int iQuadrant) { return ( iQuadrant == 0); } +bool C_4JProfile::IsSignedInLive(int iProf) { return true; } +bool C_4JProfile::IsGuest(int iQuadrant) { return false; } +UINT C_4JProfile::RequestSignInUI(bool bFromInvite,bool bLocalGame,bool bNoGuestsAllowed,bool bMultiplayerSignIn,bool bAddUser, int( *Func)(LPVOID,const bool, const int iPad),LPVOID lpParam,int iQuadrant) { return 0; } +UINT C_4JProfile::DisplayOfflineProfile(int( *Func)(LPVOID,const bool, const int iPad),LPVOID lpParam,int iQuadrant) { return 0; } +UINT C_4JProfile::RequestConvertOfflineToGuestUI(int( *Func)(LPVOID,const bool, const int iPad),LPVOID lpParam,int iQuadrant) { return 0; } +void C_4JProfile::SetPrimaryPlayerChanged(bool bVal) {} +bool C_4JProfile::QuerySigninStatus(void) { return true; } +void C_4JProfile::GetXUID(int iPad, PlayerUID *pXuid,bool bOnlineXuid) {*pXuid = 0xe000d45248242f2e; } +BOOL C_4JProfile::AreXUIDSEqual(PlayerUID xuid1,PlayerUID xuid2) { return false; } +BOOL C_4JProfile::XUIDIsGuest(PlayerUID xuid) { return false; } +bool C_4JProfile::AllowedToPlayMultiplayer(int iProf) { return true; } + +#if defined(__ORBIS__) +bool C_4JProfile::GetChatAndContentRestrictions(int iPad, bool thisQuadrantOnly, bool *pbChatRestricted,bool *pbContentRestricted,int *piAge) +{ + if(pbChatRestricted) *pbChatRestricted = false; + if(pbContentRestricted) *pbContentRestricted = false; + if(piAge) *piAge = 100; + return true; +} +#endif + +void C_4JProfile::StartTrialGame() {} +void C_4JProfile::AllowedPlayerCreatedContent(int iPad, bool thisQuadrantOnly, BOOL *allAllowed, BOOL *friendsAllowed) {} +BOOL C_4JProfile::CanViewPlayerCreatedContent(int iPad, bool thisQuadrantOnly, PPlayerUID pXuids, DWORD dwXuidCount ) { return true; } +bool C_4JProfile::GetProfileAvatar(int iPad,int( *Func)(LPVOID lpParam,PBYTE pbThumbnail,DWORD dwThumbnailBytes), LPVOID lpParam) { return false; } +void C_4JProfile::CancelProfileAvatarRequest() {} +int C_4JProfile::GetPrimaryPad() { return 0; } +void C_4JProfile::SetPrimaryPad(int iPad) {} +#ifdef _DURANGO +char fakeGamerTag[32] = "PlayerName"; +void SetFakeGamertag(char *name){ strcpy_s(fakeGamerTag, name); } +char* C_4JProfile::GetGamertag(int iPad){ return fakeGamerTag; } +#else +char* C_4JProfile::GetGamertag(int iPad){ return "PlayerName"; } +wstring C_4JProfile::GetDisplayName(int iPad){ return L"PlayerName"; } +#endif +bool C_4JProfile::IsFullVersion() { return s_bProfileIsFullVersion; } +void C_4JProfile::SetSignInChangeCallback(void ( *Func)(LPVOID, bool, unsigned int),LPVOID lpParam) {} +void C_4JProfile::SetNotificationsCallback(void ( *Func)(LPVOID, DWORD, unsigned int),LPVOID lpParam) {} +bool C_4JProfile::RegionIsNorthAmerica(void) { return false; } +bool C_4JProfile::LocaleIsUSorCanada(void) { return false; } +HRESULT C_4JProfile::GetLiveConnectionStatus() { return S_OK; } +bool C_4JProfile::IsSystemUIDisplayed() { return false; } +void C_4JProfile::SetProfileReadErrorCallback(void ( *Func)(LPVOID), LPVOID lpParam) {} +int( *defaultOptionsCallback)(LPVOID,C_4JProfile::PROFILESETTINGS *, const int iPad) = NULL; +LPVOID lpProfileParam = NULL; +int C_4JProfile::SetDefaultOptionsCallback(int( *Func)(LPVOID,PROFILESETTINGS *, const int iPad),LPVOID lpParam) +{ + defaultOptionsCallback = Func; + lpProfileParam = lpParam; + return 0; +} +int C_4JProfile::SetOldProfileVersionCallback(int( *Func)(LPVOID,unsigned char *, const unsigned short,const int),LPVOID lpParam) { return 0; } + +// To store the dashboard preferences for controller flipped, etc. +C_4JProfile::PROFILESETTINGS ProfileSettingsA[XUSER_MAX_COUNT]; + +C_4JProfile::PROFILESETTINGS * C_4JProfile::GetDashboardProfileSettings(int iPad) { return &ProfileSettingsA[iPad]; } +void C_4JProfile::WriteToProfile(int iQuadrant, bool bGameDefinedDataChanged, bool bOverride5MinuteLimitOnProfileWrites) {} +void C_4JProfile::ForceQueuedProfileWrites(int iPad) {} +void *C_4JProfile::GetGameDefinedProfileData(int iQuadrant) +{ + // 4J Stu - Don't reset the options when we call this!! + //defaultOptionsCallback(lpProfileParam, (C_4JProfile::PROFILESETTINGS *)profileData[iQuadrant], iQuadrant); + //pApp->SetDefaultOptions(pSettings,iPad); + + return profileData[iQuadrant]; +} +void C_4JProfile::ResetProfileProcessState() {} +void C_4JProfile::Tick( void ) {} +void C_4JProfile::RegisterAward(int iAwardNumber,int iGamerconfigID, eAwardType eType, bool bLeaderboardAffected, + CXuiStringTable*pStringTable, int iTitleStr, int iTextStr, int iAcceptStr, char *pszThemeName, unsigned int ulThemeSize) {} +int C_4JProfile::GetAwardId(int iAwardNumber) { return 0; } +eAwardType C_4JProfile::GetAwardType(int iAwardNumber) { return eAwardType_Achievement; } +bool C_4JProfile::CanBeAwarded(int iQuadrant, int iAwardNumber) { return false; } +void C_4JProfile::Award(int iQuadrant, int iAwardNumber, bool bForce) {} +bool C_4JProfile::IsAwardsFlagSet(int iQuadrant, int iAward) { return false; } +void C_4JProfile::RichPresenceInit(int iPresenceCount, int iContextCount) {} +void C_4JProfile::RegisterRichPresenceContext(int iGameConfigContextID) {} +void C_4JProfile::SetRichPresenceContextValue(int iPad,int iContextID, int iVal) {} +void C_4JProfile::SetCurrentGameActivity(int iPad,int iNewPresence, bool bSetOthersToIdle) {} +void C_4JProfile::DisplayFullVersionPurchase(bool bRequired, int iQuadrant, int iUpsellParam) {} +void C_4JProfile::SetUpsellCallback(void ( *Func)(LPVOID lpParam, eUpsellType type, eUpsellResponse response, int iUserData),LPVOID lpParam) {} +void C_4JProfile::SetDebugFullOverride(bool bVal) {s_bProfileIsFullVersion = bVal;} +void C_4JProfile::ShowProfileCard(int iPad, PlayerUID targetUid) {} + +/////////////////////////////////////////////// Storage library +//#ifdef _WINDOWS64 +#if 0 +C4JStorage::C4JStorage() {} +void C4JStorage::Tick() {} +C4JStorage::EMessageResult C4JStorage::RequestMessageBox(UINT uiTitle, UINT uiText, UINT *uiOptionA,UINT uiOptionC, DWORD dwPad, int( *Func)(LPVOID,int,const C4JStorage::EMessageResult),LPVOID lpParam, C4JStringTable *pStringTable, WCHAR *pwchFormatString,DWORD dwFocusButton) { return C4JStorage::EMessage_Undefined; } +C4JStorage::EMessageResult C4JStorage::GetMessageBoxResult() { return C4JStorage::EMessage_Undefined; } +bool C4JStorage::SetSaveDevice(int( *Func)(LPVOID,const bool),LPVOID lpParam, bool bForceResetOfSaveDevice) { return true; } +void C4JStorage::Init(LPCWSTR pwchDefaultSaveName,char *pszSavePackName,int iMinimumSaveSize, int( *Func)(LPVOID, const ESavingMessage, int),LPVOID lpParam) {} +void C4JStorage::ResetSaveData() {} +void C4JStorage::SetDefaultSaveNameForKeyboardDisplay(LPCWSTR pwchDefaultSaveName) {} +void C4JStorage::SetSaveTitle(LPCWSTR pwchDefaultSaveName) {} +LPCWSTR C4JStorage::GetSaveTitle() { return L""; } +bool C4JStorage::GetSaveUniqueNumber(INT *piVal) { return true; } +bool C4JStorage::GetSaveUniqueFilename(char *pszName) { return true; } +void C4JStorage::SetSaveUniqueFilename(char *szFilename) { } +void C4JStorage::SetState(ESaveGameControlState eControlState,int( *Func)(LPVOID,const bool),LPVOID lpParam) {} +void C4JStorage::SetSaveDisabled(bool bDisable) {} +bool C4JStorage::GetSaveDisabled(void) { return false; } +unsigned int C4JStorage::GetSaveSize() { return 0; } +void C4JStorage::GetSaveData(void *pvData,unsigned int *pulBytes) {} +PVOID C4JStorage::AllocateSaveData(unsigned int ulBytes) { return new char[ulBytes]; } +void C4JStorage::SaveSaveData(unsigned int ulBytes,PBYTE pbThumbnail,DWORD cbThumbnail,PBYTE pbTextData, DWORD dwTextLen) {} +void C4JStorage::CopySaveDataToNewSave(PBYTE pbThumbnail,DWORD cbThumbnail,WCHAR *wchNewName,int ( *Func)(LPVOID lpParam, bool), LPVOID lpParam) {} +void C4JStorage::SetSaveDeviceSelected(unsigned int uiPad,bool bSelected) {} +bool C4JStorage::GetSaveDeviceSelected(unsigned int iPad) { return true; } +C4JStorage::ELoadGameStatus C4JStorage::DoesSaveExist(bool *pbExists) { return C4JStorage::ELoadGame_Idle; } +bool C4JStorage::EnoughSpaceForAMinSaveGame() { return true; } +void C4JStorage::SetSaveMessageVPosition(float fY) {} +//C4JStorage::ESGIStatus C4JStorage::GetSavesInfo(int iPad,bool ( *Func)(LPVOID, int, CACHEINFOSTRUCT *, int, HRESULT),LPVOID lpParam,char *pszSavePackName) { return C4JStorage::ESGIStatus_Idle; } +C4JStorage::ESaveGameState C4JStorage::GetSavesInfo(int iPad,int ( *Func)(LPVOID lpParam,SAVE_DETAILS *pSaveDetails,const bool),LPVOID lpParam,char *pszSavePackName) { return C4JStorage::ESaveGame_Idle; } + +void C4JStorage::GetSaveCacheFileInfo(DWORD dwFile,XCONTENT_DATA &xContentData) {} +void C4JStorage::GetSaveCacheFileInfo(DWORD dwFile, PBYTE *ppbImageData, DWORD *pdwImageBytes) {} +C4JStorage::ESaveGameState C4JStorage::LoadSaveData(PSAVE_INFO pSaveInfo,int( *Func)(LPVOID lpParam,const bool, const bool), LPVOID lpParam) {return C4JStorage::ESaveGame_Idle;} +C4JStorage::EDeleteGameStatus C4JStorage::DeleteSaveData(PSAVE_INFO pSaveInfo,int( *Func)(LPVOID lpParam,const bool), LPVOID lpParam) { return C4JStorage::EDeleteGame_Idle; } +PSAVE_DETAILS C4JStorage::ReturnSavesInfo() {return NULL;} + +void C4JStorage::RegisterMarketplaceCountsCallback(int ( *Func)(LPVOID lpParam, C4JStorage::DLC_TMS_DETAILS *, int), LPVOID lpParam ) {} +void C4JStorage::SetDLCPackageRoot(char *pszDLCRoot) {} +C4JStorage::EDLCStatus C4JStorage::GetDLCOffers(int iPad,int( *Func)(LPVOID, int, DWORD, int),LPVOID lpParam, DWORD dwOfferTypesBitmaskT) { return C4JStorage::EDLC_Idle; } +DWORD C4JStorage::CancelGetDLCOffers() { return 0; } +void C4JStorage::ClearDLCOffers() {} +XMARKETPLACE_CONTENTOFFER_INFO& C4JStorage::GetOffer(DWORD dw) { static XMARKETPLACE_CONTENTOFFER_INFO retval = {0}; return retval; } +int C4JStorage::GetOfferCount() { return 0; } +DWORD C4JStorage::InstallOffer(int iOfferIDC,ULONGLONG *ullOfferIDA,int( *Func)(LPVOID, int, int),LPVOID lpParam, bool bTrial) { return 0; } +DWORD C4JStorage::GetAvailableDLCCount( int iPad) { return 0; } +XCONTENT_DATA& C4JStorage::GetDLC(DWORD dw) { static XCONTENT_DATA retval = {0}; return retval; } +C4JStorage::EDLCStatus C4JStorage::GetInstalledDLC(int iPad,int( *Func)(LPVOID, int, int),LPVOID lpParam) { return C4JStorage::EDLC_Idle; } +DWORD C4JStorage::MountInstalledDLC(int iPad,DWORD dwDLC,int( *Func)(LPVOID, int, DWORD,DWORD),LPVOID lpParam,LPCSTR szMountDrive) { return 0; } +DWORD C4JStorage::UnmountInstalledDLC(LPCSTR szMountDrive) { return 0; } +C4JStorage::ETMSStatus C4JStorage::ReadTMSFile(int iQuadrant,eGlobalStorage eStorageFacility,C4JStorage::eTMS_FileType eFileType, WCHAR *pwchFilename,BYTE **ppBuffer,DWORD *pdwBufferSize,int( *Func)(LPVOID, WCHAR *,int, bool, int),LPVOID lpParam, int iAction) { return C4JStorage::ETMSStatus_Idle; } +bool C4JStorage::WriteTMSFile(int iQuadrant,eGlobalStorage eStorageFacility,WCHAR *pwchFilename,BYTE *pBuffer,DWORD dwBufferSize) { return true; } +bool C4JStorage::DeleteTMSFile(int iQuadrant,eGlobalStorage eStorageFacility,WCHAR *pwchFilename) { return true; } +void C4JStorage::StoreTMSPathName(WCHAR *pwchName) {} +unsigned int C4JStorage::CRC(unsigned char *buf, int len) { return 0; } + +struct PTMSPP_FILEDATA; +C4JStorage::ETMSStatus C4JStorage::TMSPP_ReadFile(int iPad,C4JStorage::eGlobalStorage eStorageFacility,C4JStorage::eTMS_FILETYPEVAL eFileTypeVal,LPCSTR szFilename,int( *Func)(LPVOID,int,int,PTMSPP_FILEDATA, LPCSTR)/*=NULL*/,LPVOID lpParam/*=NULL*/, int iUserData/*=0*/) {return C4JStorage::ETMSStatus_Idle;} +#endif // _WINDOWS64 + +#endif // __PS3__ + +/////////////////////////////////////////////////////// Sentient manager + +HRESULT CSentientManager::Init() { return S_OK; } +HRESULT CSentientManager::Tick() { return S_OK; } +HRESULT CSentientManager::Flush() { return S_OK; } +BOOL CSentientManager::RecordPlayerSessionStart(DWORD dwUserId) { return true; } +BOOL CSentientManager::RecordPlayerSessionExit(DWORD dwUserId, int exitStatus) { return true; } +BOOL CSentientManager::RecordHeartBeat(DWORD dwUserId) { return true; } +BOOL CSentientManager::RecordLevelStart(DWORD dwUserId, ESen_FriendOrMatch friendsOrMatch, ESen_CompeteOrCoop competeOrCoop, int difficulty, DWORD numberOfLocalPlayers, DWORD numberOfOnlinePlayers) { return true; } +BOOL CSentientManager::RecordLevelExit(DWORD dwUserId, ESen_LevelExitStatus levelExitStatus) { return true; } +BOOL CSentientManager::RecordLevelSaveOrCheckpoint(DWORD dwUserId, INT saveOrCheckPointID, INT saveSizeInBytes) { return true; } +BOOL CSentientManager::RecordLevelResume(DWORD dwUserId, ESen_FriendOrMatch friendsOrMatch, ESen_CompeteOrCoop competeOrCoop, int difficulty, DWORD numberOfLocalPlayers, DWORD numberOfOnlinePlayers, INT saveOrCheckPointID) { return true; } +BOOL CSentientManager::RecordPauseOrInactive(DWORD dwUserId) { return true; } +BOOL CSentientManager::RecordUnpauseOrActive(DWORD dwUserId) { return true; } +BOOL CSentientManager::RecordMenuShown(DWORD dwUserId, INT menuID, INT optionalMenuSubID) { return true; } +BOOL CSentientManager::RecordAchievementUnlocked(DWORD dwUserId, INT achievementID, INT achievementGamerscore) { return true; } +BOOL CSentientManager::RecordMediaShareUpload(DWORD dwUserId, ESen_MediaDestination mediaDestination, ESen_MediaType mediaType) { return true; } +BOOL CSentientManager::RecordUpsellPresented(DWORD dwUserId, ESen_UpsellID upsellId, INT marketplaceOfferID) { return true; } +BOOL CSentientManager::RecordUpsellResponded(DWORD dwUserId, ESen_UpsellID upsellId, INT marketplaceOfferID, ESen_UpsellOutcome upsellOutcome) { return true; } +BOOL CSentientManager::RecordPlayerDiedOrFailed(DWORD dwUserId, INT lowResMapX, INT lowResMapY, INT lowResMapZ, INT mapID, INT playerWeaponID, INT enemyWeaponID, ETelemetryChallenges enemyTypeID) { return true; } +BOOL CSentientManager::RecordEnemyKilledOrOvercome(DWORD dwUserId, INT lowResMapX, INT lowResMapY, INT lowResMapZ, INT mapID, INT playerWeaponID, INT enemyWeaponID, ETelemetryChallenges enemyTypeID) { return true; } +BOOL CSentientManager::RecordSkinChanged(DWORD dwUserId, DWORD dwSkinId) { return true; } +BOOL CSentientManager::RecordBanLevel(DWORD dwUserId) { return true; } +BOOL CSentientManager::RecordUnBanLevel(DWORD dwUserId) { return true; } +INT CSentientManager::GetMultiplayerInstanceID() { return 0; } +INT CSentientManager::GenerateMultiplayerInstanceId() { return 0; } +void CSentientManager::SetMultiplayerInstanceId(INT value) {} + +//////////////////////////////////////////////////////// Stats counter + +/* +StatsCounter::StatsCounter() {} +void StatsCounter::award(Stat *stat, unsigned int difficulty, unsigned int count) {} +bool StatsCounter::hasTaken(Achievement *ach) { return true; } +bool StatsCounter::canTake(Achievement *ach) { return true; } +unsigned int StatsCounter::getValue(Stat *stat, unsigned int difficulty) { return 0; } +unsigned int StatsCounter::getTotalValue(Stat *stat) { return 0; } +void StatsCounter::tick(int player) {} +void StatsCounter::parse(void* data) {} +void StatsCounter::clear() {} +void StatsCounter::save(int player, bool force) {} +void StatsCounter::flushLeaderboards() {} +void StatsCounter::saveLeaderboards() {} +void StatsCounter::setupStatBoards() {} +#ifdef _DEBUG +void StatsCounter::WipeLeaderboards() {} +#endif +*/ diff --git a/Minecraft.Client/FallingTileRenderer.cpp b/Minecraft.Client/FallingTileRenderer.cpp new file mode 100644 index 00000000..2d9f5dae --- /dev/null +++ b/Minecraft.Client/FallingTileRenderer.cpp @@ -0,0 +1,67 @@ +#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" +#include "..\Minecraft.World\net.minecraft.world.level.tile.h" +#include "EntityRenderDispatcher.h" + +FallingTileRenderer::FallingTileRenderer() : EntityRenderer() +{ + tileRenderer = new TileRenderer(); + this->shadowRadius = 0.5f; +} + +void FallingTileRenderer::render(shared_ptr _tile, double x, double y, double z, float rot, float a) +{ + // 4J - dynamic cast required because we aren't using templates/generics in our version + shared_ptr tile = dynamic_pointer_cast(_tile); + Level *level = tile->getLevel(); + + if (level->getTile(floor(tile->x), floor(tile->y), floor(tile->z)) != tile->tile) + { + 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(); + } +} + +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 new file mode 100644 index 00000000..de4c5bfc --- /dev/null +++ b/Minecraft.Client/FallingTileRenderer.h @@ -0,0 +1,14 @@ +#pragma once +#include "EntityRenderer.h" + +class FallingTileRenderer : public EntityRenderer +{ +private: + TileRenderer *tileRenderer; + +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/FileTexturePack.cpp b/Minecraft.Client/FileTexturePack.cpp new file mode 100644 index 00000000..af58dc1e --- /dev/null +++ b/Minecraft.Client/FileTexturePack.cpp @@ -0,0 +1,86 @@ +#include "stdafx.h" +#include "FileTexturePack.h" + +FileTexturePack::FileTexturePack(DWORD id, File *file, TexturePack *fallback) : AbstractTexturePack(id, file, file->getName(), fallback) +{ + // 4J Stu - These calls need to be in the most derived version of the class + loadIcon(); + loadName(); + loadDescription(); +} + +void FileTexturePack::unload(Textures *textures) +{ +#if 0 + super.unload(textures); + + try { + if (zipFile != null) zipFile.close(); + } + catch (IOException ignored) + { + } + zipFile = null; +#endif +} + +InputStream *FileTexturePack::getResourceImplementation(const wstring &name) //throws IOException +{ +#if 0 + loadZipFile(); + + ZipEntry entry = zipFile.getEntry(name.substring(1)); + if (entry == null) { + throw new FileNotFoundException(name); + } + + return zipFile.getInputStream(entry); +#endif + return NULL; +} + +bool FileTexturePack::hasFile(const wstring &name) +{ +#if 0 + try { + loadZipFile(); + + return zipFile.getEntry(name.substring(1)) != null; + } catch (Exception e) { + return false; + } +#endif + return false; +} + +void FileTexturePack::loadZipFile() //throws IOException +{ +#if 0 + if (zipFile != null) { + return; + } + + zipFile = new ZipFile(file); +#endif +} + +bool FileTexturePack::isTerrainUpdateCompatible() +{ +#if 0 + try { + loadZipFile(); + + Enumeration entries = zipFile.entries(); + while (entries.hasMoreElements()) { + ZipEntry entry = entries.nextElement(); + if (entry.getName().startsWith("textures/")) { + return true; + } + } + } catch (Exception ignored) { + } + boolean hasOldFiles = hasFile("terrain.png") || hasFile("gui/items.png"); + return !hasOldFiles; +#endif + return false; +} \ No newline at end of file diff --git a/Minecraft.Client/FileTexturePack.h b/Minecraft.Client/FileTexturePack.h new file mode 100644 index 00000000..85221d11 --- /dev/null +++ b/Minecraft.Client/FileTexturePack.h @@ -0,0 +1,32 @@ +#pragma once +#include "AbstractTexturePack.h" +//class ZipFile; +class BufferedImage; +class File; +class Textures; +using namespace std; + +class FileTexturePack : public AbstractTexturePack +{ +private: + //ZipFile *zipFile; + +public: + FileTexturePack(DWORD id, File *file, TexturePack *fallback); + + //@Override + void unload(Textures *textures); + +protected: + InputStream *getResourceImplementation(const wstring &name); //throws IOException + +public: + //@Override + bool hasFile(const wstring &name); + +private: + void loadZipFile(); //throws IOException + +public: + bool isTerrainUpdateCompatible(); +}; diff --git a/Minecraft.Client/FireballRenderer.cpp b/Minecraft.Client/FireballRenderer.cpp new file mode 100644 index 00000000..3b1ab924 --- /dev/null +++ b/Minecraft.Client/FireballRenderer.cpp @@ -0,0 +1,115 @@ +#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" +#include "..\Minecraft.World\net.minecraft.world.phys.h" +#include "..\Minecraft.World\net.minecraft.world.h" + +FireballRenderer::FireballRenderer(float scale) +{ + this->scale = scale; +} + +void FireballRenderer::render(shared_ptr _fireball, double x, double y, double z, float rot, float a) +{ + // 4J - dynamic cast required because we aren't using templates/generics in our version + shared_ptr fireball = dynamic_pointer_cast(_fireball); + + glPushMatrix(); + + glTranslatef((float) x, (float) y, (float) z); + glEnable(GL_RESCALE_NORMAL); + float s = scale; + 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(fireball); + MemSect(0); + Tesselator *t = Tesselator::getInstance(); + + float u0 = icon->getU0(); + float u1 = icon->getU1(); + float v0 = icon->getV0(); + float v1 = icon->getV1(); + + float r = 1.0f; + float xo = 0.5f; + float yo = 0.25f; + + glRotatef(180 - entityRenderDispatcher->playerRotY, 0, 1, 0); + glRotatef(-entityRenderDispatcher->playerRotX, 1, 0, 0); + t->begin(); + t->normal(0, 1, 0); + t->vertexUV((float)(0 - xo), (float)( 0 - yo), (float)( 0), (float)( u0), (float)( v1)); + t->vertexUV((float)(r - xo), (float)( 0 - yo), (float)( 0), (float)( u1), (float)( v1)); + t->vertexUV((float)(r - xo), (float)( 1 - yo), (float)( 0), (float)( u1), (float)( v0)); + t->vertexUV((float)(0 - xo), (float)( 1 - yo), (float)( 0), (float)( u0), (float)( v0)); + t->end(); + + glDisable(GL_RESCALE_NORMAL); + glPopMatrix(); + +} + +// 4J Added override. Based on EntityRenderer::renderFlame +void FireballRenderer::renderFlame(shared_ptr e, double x, double y, double z, float a) +{ + glDisable(GL_LIGHTING); + Icon *tex = Tile::fire->getTextureLayer(0); + + glPushMatrix(); + glTranslatef((float) x, (float) y, (float) z); + + float s = e->bbWidth * 1.4f; + glScalef(s, s, s); + MemSect(31); + bindTexture(&TextureAtlas::LOCATION_BLOCKS); + MemSect(0); + Tesselator *t = Tesselator::getInstance(); + + float r = 1.0f; + float xo = 0.5f; +// float yo = 0.0f; + + float h = e->bbHeight / s; + float yo = (float) (e->y - e->bb->y0); + + //glRotatef(-entityRenderDispatcher->playerRotY, 0, 1, 0); + + + glRotatef(180 - entityRenderDispatcher->playerRotY, 0, 1, 0); + glRotatef(-entityRenderDispatcher->playerRotX, 1, 0, 0); + glTranslatef(0,0,0.1f); + //glTranslatef(0, 0, -0.3f + ((int) h) * 0.02f); + glColor4f(1, 1, 1, 1); + // glRotatef(-playerRotX, 1, 0, 0); + float zo = 0; + t->begin(); + t->normal(0, 1, 0); + + float u0 = tex->getU0(); + float v0 = tex->getV0(); + float u1 = tex->getU1(); + float v1 = tex->getV1(); + + float tmp = u1; + u1 = u0; + u0 = tmp; + + t->vertexUV((float)(0 - xo), (float)( 0 - yo), (float)( 0), (float)( u1), (float)( v1)); + t->vertexUV((float)(r - xo), (float)( 0 - yo), (float)( 0), (float)( u0), (float)( v1)); + t->vertexUV((float)(r - xo), (float)( 1.4f - yo), (float)( 0), (float)( u0), (float)( v0)); + t->vertexUV((float)(0 - xo), (float)( 1.4f - yo), (float)( 0), (float)( u1), (float)( v0)); + + 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 new file mode 100644 index 00000000..44b8b4c4 --- /dev/null +++ b/Minecraft.Client/FireballRenderer.h @@ -0,0 +1,18 @@ +#pragma once +#include "EntityRenderer.h" + +class FireballRenderer : public EntityRenderer +{ +private: + float scale; + +public: + FireballRenderer(float scale); + + virtual void render(shared_ptr _fireball, double x, double y, double z, float rot, float a); + +private: + // 4J Added override + 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 new file mode 100644 index 00000000..9d60a9ac --- /dev/null +++ b/Minecraft.Client/FishingHookRenderer.cpp @@ -0,0 +1,108 @@ +#include "stdafx.h" +#include "FishingHookRenderer.h" +#include "EntityRenderDispatcher.h" +#include "Options.h" +#include "..\Minecraft.World\net.minecraft.world.entity.projectile.h" +#include "..\Minecraft.World\net.minecraft.world.entity.player.h" +#include "..\Minecraft.World\Vec3.h" +#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 + shared_ptr hook = dynamic_pointer_cast(_hook); + + glPushMatrix(); + + glTranslatef((float) x, (float) y, (float) z); + glEnable(GL_RESCALE_NORMAL); + glScalef(1 / 2.0f, 1 / 2.0f, 1 / 2.0f); + int xi = 1; + int yi = 2; + 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 r = 1.0f; + float xo = 0.5f; + float yo = 0.5f; + + glRotatef(180 - entityRenderDispatcher->playerRotY, 0, 1, 0); + glRotatef(-entityRenderDispatcher->playerRotX, 1, 0, 0); + t->begin(); + t->normal(0, 1, 0); + t->vertexUV((float)(0 - xo), (float)( 0 - yo), (float)( 0), (float)( u0), (float)( v1)); + t->vertexUV((float)(r - xo), (float)( 0 - yo), (float)( 0), (float)( u1), (float)( v1)); + t->vertexUV((float)(r - xo), (float)( 1 - yo), (float)( 0), (float)( u1), (float)( v0)); + t->vertexUV((float)(0 - xo), (float)( 1 - yo), (float)( 0), (float)( u0), (float)( v0)); + t->end(); + + glDisable(GL_RESCALE_NORMAL); + glPopMatrix(); + + + if (hook->owner != NULL) + { + float swing = hook->owner->getAttackAnim(a); + float swing2 = (float) Mth::sin(sqrt(swing) * PI); + + + Vec3 *vv = Vec3::newTemp(-0.5, 0.03, 0.8); + vv->xRot(-(hook->owner->xRotO + (hook->owner->xRot - hook->owner->xRotO) * a) * PI / 180); + vv->yRot(-(hook->owner->yRotO + (hook->owner->yRot - hook->owner->yRotO) * a) * PI / 180); + vv->yRot(swing2 * 0.5f); + vv->xRot(-swing2 * 0.7f); + + 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) ? 0 : hook->owner->getHeadHeight(); + + // 4J-PB - changing this to be per player + //if (this->entityRenderDispatcher->options->thirdPersonView) + if (hook->owner->ThirdPersonView() > 0) + { + float rr = (float) (hook->owner->yBodyRotO + (hook->owner->yBodyRot - hook->owner->yBodyRotO) * a) * PI / 180; + double ss = Mth::sin((float) rr); + double cc = Mth::cos((float) rr); + xp = hook->owner->xo + (hook->owner->x - hook->owner->xo) * a - cc * 0.35 - ss * 0.85; + yp = hook->owner->yo + yOffset + (hook->owner->y - hook->owner->yo) * a - 0.45; + zp = hook->owner->zo + (hook->owner->z - hook->owner->zo) * a - ss * 0.35 + cc * 0.85; + } + + double xh = hook->xo + (hook->x - hook->xo) * a; + double yh = hook->yo + (hook->y - hook->yo) * a + 4 / 16.0f; + double zh = hook->zo + (hook->z - hook->zo) * a; + + double xa = (float) (xp - xh); + double ya = (float) (yp - yh); + double za = (float) (zp - zh); + + glDisable(GL_TEXTURE_2D); + glDisable(GL_LIGHTING); + t->begin(GL_LINE_STRIP); + t->color(0x000000); + int steps = 16; + for (int i = 0; i <= steps; i++) + { + float aa = i / (float) steps; + t->vertex((float)(x + xa * aa), (float)( y + ya * (aa * aa + aa) * 0.5 + 4 / 16.0f), (float)( z + za * aa)); + } + t->end(); + glEnable(GL_LIGHTING); + 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 new file mode 100644 index 00000000..8c58ea9b --- /dev/null +++ b/Minecraft.Client/FishingHookRenderer.h @@ -0,0 +1,12 @@ +#pragma once +#include "EntityRenderer.h" + +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/FlameParticle.cpp b/Minecraft.Client/FlameParticle.cpp new file mode 100644 index 00000000..eb12dbfd --- /dev/null +++ b/Minecraft.Client/FlameParticle.cpp @@ -0,0 +1,73 @@ +#include "stdafx.h" +#include "..\Minecraft.World\JavaMath.h" +#include "..\Minecraft.World\Random.h" +#include "FlameParticle.h" + +FlameParticle::FlameParticle(Level *level, double x, double y, double z, double xd, double yd, double zd) : Particle(level, x, y, z, xd, yd, zd) +{ + this->xd=this->xd*0.01f+xd; + this->yd=this->yd*0.01f+yd; + this->zd=this->zd*0.01f+zd; + x+=(random->nextFloat()-random->nextFloat())*0.05f; + y+=(random->nextFloat()-random->nextFloat())*0.05f; + z+=(random->nextFloat()-random->nextFloat())*0.05f; + + oSize = size; + rCol = gCol = bCol = 1.0f; + + lifetime = (int)(8/(Math::random()*0.8+0.2))+4; + noPhysics = true; + setMiscTex(48); +} + +void FlameParticle::render(Tesselator *t, float a, float xa, float ya, float za, float xa2, float za2) +{ + float s = (age + a) / (float) lifetime; + size = oSize * (1 - s*s*0.5f); + Particle::render(t, a, xa, ya, za, xa2, za2); +} + +// 4J - brought forward from 1.8.2 +int FlameParticle::getLightColor(float a) +{ + float l = (age + a) / lifetime; + if (l < 0) l = 0; + if (l > 1) l = 1; + int br = Particle::getLightColor(a); + + int br1 = (br) & 0xff; + int br2 = (br >> 16) & 0xff; + br1 += (int) (l * 15 * 16); + if (br1 > 15 * 16) br1 = 15 * 16; + return br1 | br2 << 16; +} + +float FlameParticle::getBrightness(float a) +{ + float l = (age+a)/lifetime; + if (l<0) l = 0; + if (l>1) l = 1; + float br = Particle::getBrightness(a); + + return br*l+(1-l); +} + +void FlameParticle::tick() +{ + xo = x; + yo = y; + zo = z; + + if (age++ >= lifetime) remove(); + + move(xd, yd, zd); + xd *= 0.96f; + yd *= 0.96f; + zd *= 0.96f; + + if (onGround) + { + xd *= 0.7f; + zd *= 0.7f; + } +} \ No newline at end of file diff --git a/Minecraft.Client/FlameParticle.h b/Minecraft.Client/FlameParticle.h new file mode 100644 index 00000000..7097d9dc --- /dev/null +++ b/Minecraft.Client/FlameParticle.h @@ -0,0 +1,17 @@ +#pragma once +#include "Particle.h" + +class FlameParticle : public Particle +{ +public: + virtual eINSTANCEOF GetType() { return eType_FLAMEPARTICLE; } +private: + float oSize; + +public: + FlameParticle(Level *level, double x, double y, double z, double xd, double yd, double zd); + virtual void render(Tesselator *t, float a, float xa, float ya, float za, float xa2, float za2); + virtual int getLightColor(float a); // 4J - brought forward from 1.8.2 + virtual float getBrightness(float a); + virtual void tick(); +}; \ No newline at end of file diff --git a/Minecraft.Client/FolderTexturePack.cpp b/Minecraft.Client/FolderTexturePack.cpp new file mode 100644 index 00000000..4b65dc7f --- /dev/null +++ b/Minecraft.Client/FolderTexturePack.cpp @@ -0,0 +1,110 @@ +#include "stdafx.h" +#include "FolderTexturePack.h" + +FolderTexturePack::FolderTexturePack(DWORD id, const wstring &name, File *folder, TexturePack *fallback) : AbstractTexturePack(id, folder, name, fallback) +{ + // 4J Stu - These calls need to be in the most derived version of the class + loadIcon(); + loadName(); + loadDescription(); + + bUILoaded = false; +} + +InputStream *FolderTexturePack::getResourceImplementation(const wstring &name) //throws IOException +{ +#if 0 + final File file = new File(this.file, name.substring(1)); + if (!file.exists()) { + throw new FileNotFoundException(name); + } + + return new BufferedInputStream(new FileInputStream(file)); +#endif + + wstring wDrive = L""; + // Make the content package point to to the UPDATE: drive is needed +#ifdef _XBOX + wDrive=L"GAME:\\DummyTexturePack\\res"; +#else + wDrive = L"Common\\DummyTexturePack\\res"; +#endif + InputStream *resource = InputStream::getResourceAsStream(wDrive + name); + //InputStream *stream = DefaultTexturePack::class->getResourceAsStream(name); + //if (stream == NULL) + //{ + // throw new FileNotFoundException(name); + //} + + //return stream; + return resource; +} + +bool FolderTexturePack::hasFile(const wstring &name) +{ + File file = File( getPath() + name); + return file.exists() && file.isFile(); + //return true; +} + +bool FolderTexturePack::isTerrainUpdateCompatible() +{ +#if 0 + final File dir = new File(this.file, "textures/"); + final boolean hasTexturesFolder = dir.exists() && dir.isDirectory(); + final boolean hasOldFiles = hasFile("terrain.png") || hasFile("gui/items.png"); + return hasTexturesFolder || !hasOldFiles; +#endif + return true; +} + +wstring FolderTexturePack::getPath(bool bTitleUpdateTexture /*= false*/,const char *pchBDPatchFilename) +{ + wstring wDrive; +#ifdef _XBOX + wDrive=L"GAME:\\" + file->getPath() + L"\\"; +#else + wDrive=L"Common\\" + file->getPath() + L"\\"; +#endif + return wDrive; +} + +void FolderTexturePack::loadUI() +{ +#ifdef _XBOX + //"file://" + Drive + PathToXZP + "#" + PathInsideXZP + + //L"file://game:/ui.xzp#skin_default.xur" + + // Load new skin + if(hasFile(L"TexturePack.xzp")) + { + const DWORD LOCATOR_SIZE = 256; // Use this to allocate space to hold a ResourceLocator string + WCHAR szResourceLocator[ LOCATOR_SIZE ]; + + swprintf(szResourceLocator, LOCATOR_SIZE,L"file://%lsTexturePack.xzp#skin_Minecraft.xur",getPath().c_str()); + + XuiFreeVisuals(L""); + app.LoadSkin(szResourceLocator,NULL);//L"TexturePack"); + bUILoaded = true; + //CXuiSceneBase::GetInstance()->SetVisualPrefix(L"TexturePack"); + } + + AbstractTexturePack::loadUI(); +#endif +} + +void FolderTexturePack::unloadUI() +{ +#ifdef _XBOX + // Unload skin + if(bUILoaded) + { + XuiFreeVisuals(L"TexturePack"); + XuiFreeVisuals(L""); + CXuiSceneBase::GetInstance()->SetVisualPrefix(L""); + CXuiSceneBase::GetInstance()->SkinChanged(CXuiSceneBase::GetInstance()->m_hObj); + } + AbstractTexturePack::unloadUI(); +#endif +} \ No newline at end of file diff --git a/Minecraft.Client/FolderTexturePack.h b/Minecraft.Client/FolderTexturePack.h new file mode 100644 index 00000000..40921078 --- /dev/null +++ b/Minecraft.Client/FolderTexturePack.h @@ -0,0 +1,26 @@ +#pragma once + +#include "AbstractTexturePack.h" + +class FolderTexturePack : public AbstractTexturePack +{ +private: + bool bUILoaded; + +public: + FolderTexturePack(DWORD id, const wstring &name, File *folder, TexturePack *fallback); + +protected: + //@Override + InputStream *getResourceImplementation(const wstring &name); //throws IOException + +public: + //@Override + bool hasFile(const wstring &name); + bool isTerrainUpdateCompatible(); + + // 4J Added + 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 new file mode 100644 index 00000000..7a37dd7b --- /dev/null +++ b/Minecraft.Client/Font.cpp @@ -0,0 +1,617 @@ +#include "stdafx.h" +#include "Textures.h" +#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, 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 + + charWidths = new int[charC]; + + // 4J - added initialisers + memset(charWidths, 0, charC); + + enforceUnicodeSheet = false; + bidirectional = false; + xPos = yPos = 0.0f; + + // Set up member variables + m_cols = cols; + m_rows = rows; + m_charWidth = charWidth; + m_charHeight = charHeight; + m_textureLocation = textureLocation; + + // Build character map + if (charMap != NULL) + { + for(int i = 0; i < charC; i++) + { + m_charMap.insert(std::make_pair(charMap[i], i)); + } + } + + random = new Random(); + + // Load the image + BufferedImage *img = textures->readImage(textureLocation->getTexture(), name); + + /* - 4J - TODO + try { + img = ImageIO.read(Textures.class.getResourceAsStream(name)); + } catch (IOException e) { + throw new RuntimeException(e); + } + */ + + int w = img->getWidth(); + int h = img->getHeight(); + intArray rawPixels(w * h); + img->getRGB(0, 0, w, h, rawPixels, 0, w); + + for (int i = 0; i < charC; i++) + { + int xt = i % m_cols; + int yt = i / m_cols; + + int x = 7; + for (; x >= 0; x--) + { + int xPixel = xt * 8 + x; + bool emptyColumn = true; + for (int y = 0; y < 8 && emptyColumn; y++) + { + int yPixel = (yt * 8 + y) * w; + bool emptyPixel = (rawPixels[xPixel + yPixel] >> 24) == 0; // Check the alpha value + if (!emptyPixel) emptyColumn = false; + } + if (!emptyColumn) + { + break; + } + } + + if (i == ' ') x = 4 - 2; + charWidths[i] = x + 2; + } + + delete img; + + // calculate colors + for (int colorN = 0; colorN < 32; ++colorN) + { + int var10 = (colorN >> 3 & 1) * 85; + int red = (colorN >> 2 & 1) * 170 + var10; + int green = (colorN >> 1 & 1) * 170 + var10; + int blue = (colorN >> 0 & 1) * 170 + var10; + + if (colorN == 6) + { + red += 85; + } + + if (options->anaglyph3d) + { + int tmpRed = (red * 30 + green * 59 + blue * 11) / 100; + int tmpGreen = (red * 30 + green * 70) / 100; + int tmpBlue = (red * 30 + blue * 70) / 100; + red = tmpRed; + green = tmpGreen; + blue = tmpBlue; + } + + if (colorN >= 16) + { + red /= 4; + green /= 4; + blue /= 4; + } + + colors[colorN] = (red & 255) << 16 | (green & 255) << 8 | (blue & 255); + } +} + +#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::~Font() +{ + delete[] charWidths; +} +#endif + +void Font::renderCharacter(wchar_t c) +{ + float xOff = c % m_cols * m_charWidth; + float yOff = c / m_cols * m_charWidth; + + float width = charWidths[c] - .01f; + float height = m_charHeight - .01f; + + float fontWidth = m_cols * m_charWidth; + float fontHeight = m_rows * m_charHeight; + + Tesselator *t = Tesselator::getInstance(); + // 4J Stu - Changed to a quad so that we can use within a command buffer +#if 1 + t->begin(); + t->tex(xOff / fontWidth, (yOff + 7.99f) / fontHeight); + t->vertex(xPos, yPos + height, 0.0f); + + t->tex((xOff + width) / fontWidth, (yOff + 7.99f) / fontHeight); + t->vertex(xPos + width, yPos + height, 0.0f); + + t->tex((xOff + width) / fontWidth, yOff / fontHeight); + t->vertex(xPos + width, yPos, 0.0f); + + t->tex(xOff / fontWidth, yOff / fontHeight); + t->vertex(xPos, yPos, 0.0f); + + t->end(); +#else + t->begin(GL_TRIANGLE_STRIP); + t->tex(xOff / 128.0F, yOff / 128.0F); + t->vertex(xPos, yPos, 0.0f); + t->tex(xOff / 128.0F, (yOff + 7.99f) / 128.0F); + t->vertex(xPos, yPos + 7.99f, 0.0f); + t->tex((xOff + width) / 128.0F, yOff / 128.0F); + t->vertex(xPos + width, yPos, 0.0f); + t->tex((xOff + width) / 128.0F, (yOff + 7.99f) / 128.0F); + t->vertex(xPos + width, yPos + 7.99f, 0.0f); + t->end(); +#endif + + xPos += (float) charWidths[c]; +} + +void Font::drawShadow(const wstring& str, int x, int y, int color) +{ + draw(str, x + 1, y + 1, color, true); + draw(str, x, y, color, false); +} + +void Font::drawShadowWordWrap(const wstring &str, int x, int y, int w, int color, int h) +{ + drawWordWrapInternal(str, x + 1, y + 1, w, color, true, h); + drawWordWrapInternal(str, x, y, w, color, h); +} + +void Font::draw(const wstring& str, int x, int y, int color) +{ + draw(str, x, y, color, false); +} + +wstring Font::reorderBidi(const wstring &str) +{ + // 4J Not implemented + return str; +} + +void Font::draw(const wstring &str, bool dropShadow) +{ + // Bind the texture + textures->bindTexture(m_textureLocation); + + bool noise = false; + wstring cleanStr = sanitize(str); + + for (int i = 0; i < (int)cleanStr.length(); ++i) + { + // Map character + wchar_t c = cleanStr.at(i); + + if (c == 167 && i + 1 < cleanStr.length()) + { + // 4J - following block was: + // int colorN = L"0123456789abcdefk".indexOf(str.toLowerCase().charAt(i + 1)); + wchar_t ca = cleanStr[i+1]; + int colorN = 16; + if(( ca >= L'0' ) && (ca <= L'9')) colorN = ca - L'0'; + else if(( ca >= L'a' ) && (ca <= L'f')) colorN = (ca - L'a') + 10; + else if(( ca >= L'A' ) && (ca <= L'F')) colorN = (ca - L'A') + 10; + + if (colorN == 16) + { + noise = true; + } + else + { + noise = false; + if (colorN < 0 || colorN > 15) colorN = 15; + + if (dropShadow) colorN += 16; + + int color = colors[colorN]; + glColor3f((color >> 16) / 255.0F, ((color >> 8) & 255) / 255.0F, (color & 255) / 255.0F); + } + + + i += 1; + continue; + } + + // "noise" for crazy splash screen message + if (noise) + { + int newc; + do + { + newc = random->nextInt(SharedConstants::acceptableLetters.length()); + } while (charWidths[c + 32] != charWidths[newc + 32]); + c = newc; + } + + renderCharacter(c); + } +} + +void Font::draw(const wstring& str, int x, int y, int color, bool dropShadow) +{ + if (!str.empty()) + { + if ((color & 0xFC000000) == 0) color |= 0xFF000000; // force alpha + // if not set + + if (dropShadow) // divide RGB by 4, preserve alpha + color = (color & 0xfcfcfc) >> 2 | (color & (-1 << 24)); + + glColor4f((color >> 16 & 255) / 255.0F, (color >> 8 & 255) / 255.0F, (color & 255) / 255.0F, (color >> 24 & 255) / 255.0F); + + xPos = x; + yPos = y; + draw(str, dropShadow); + } +} + +int Font::width(const wstring& str) +{ + wstring cleanStr = sanitize(str); + + if (cleanStr == L"") return 0; // 4J - was NULL comparison + int len = 0; + + for (int i = 0; i < cleanStr.length(); ++i) + { + wchar_t c = cleanStr.at(i); + + if(c == 167) + { + // Ignore the character used to define coloured text + ++i; + } + else + { + len += charWidths[c]; + } + } + + return len; +} + +wstring Font::sanitize(const wstring& str) +{ + wstring sb = str; + + for (unsigned int i = 0; i < sb.length(); i++) + { + if (CharacterExists(sb[i])) + { + sb[i] = MapCharacter(sb[i]); + } + else + { + // If this character isn't supported, just show the first character (empty square box character) + sb[i] = 0; + } + } + return sb; +} + +int Font::MapCharacter(wchar_t c) +{ + if (!m_charMap.empty()) + { + // Don't map space character + return c == ' ' ? c : m_charMap[c]; + } + else + { + return c; + } +} + +bool Font::CharacterExists(wchar_t c) +{ + if (!m_charMap.empty()) + { + return m_charMap.find(c) != m_charMap.end(); + } + else + { + return c >= 0 && c <= m_rows*m_cols; + } +} + +void Font::drawWordWrap(const wstring &string, int x, int y, int w, int col, int h) +{ + //if (bidirectional) + //{ + // string = reorderBidi(string); + //} + drawWordWrapInternal(string, x, y, w, col, h); +} + +void Font::drawWordWrapInternal(const wstring &string, int x, int y, int w, int col, int h) +{ + drawWordWrapInternal(string, x, y, w, col, false, h); +} + +void Font::drawWordWrap(const wstring &string, int x, int y, int w, int col, bool darken, int h) +{ + //if (bidirectional) + //{ + // string = reorderBidi(string); + //} + drawWordWrapInternal(string, x, y, w, col, darken, h); +} + +void Font::drawWordWrapInternal(const wstring& string, int x, int y, int w, int col, bool darken, int h) +{ + vectorlines = stringSplit(string,L'\n'); + if (lines.size() > 1) + { + AUTO_VAR(itEnd, lines.end()); + for (AUTO_VAR(it, lines.begin()); it != itEnd; it++) + { + // 4J Stu - Don't draw text that will be partially cutoff/overlap something it shouldn't + if( (y + this->wordWrapHeight(*it, w)) > h) break; + drawWordWrapInternal(*it, x, y, w, col, h); + y += this->wordWrapHeight(*it, w); + } + return; + } + vector words = stringSplit(string,L' '); + unsigned int pos = 0; + while (pos < words.size()) + { + wstring line = words[pos++] + L" "; + while (pos < words.size() && width(line + words[pos]) < w) + { + line += words[pos++] + L" "; + } + while (width(line) > w) + { + int l = 0; + while (width(line.substr(0, l + 1)) <= w) + { + l++; + } + if (trimString(line.substr(0, l)).length() > 0) + { + draw(line.substr(0, l), x, y, col); + y += 8; + } + line = line.substr(l); + + // 4J Stu - Don't draw text that will be partially cutoff/overlap something it shouldn't + if( (y + 8) > h) break; + } + // 4J Stu - Don't draw text that will be partially cutoff/overlap something it shouldn't + if (trimString(line).length() > 0 && !( (y + 8) > h) ) + { + draw(line, x, y, col); + y += 8; + } + } + +} + +int Font::wordWrapHeight(const wstring& string, int w) +{ + vector lines = stringSplit(string,L'\n'); + if (lines.size() > 1) + { + int h = 0; + AUTO_VAR(itEnd, lines.end()); + for (AUTO_VAR(it, lines.begin()); it != itEnd; it++) + { + h += this->wordWrapHeight(*it, w); + } + return h; + } + vector words = stringSplit(string,L' '); + unsigned int pos = 0; + int y = 0; + while (pos < words.size()) + { + wstring line = words[pos++] + L" "; + while (pos < words.size() && width(line + words[pos]) < w) + { + line += words[pos++] + L" "; + } + while (width(line) > w) + { + int l = 0; + while (width(line.substr(0, l + 1)) <= w) + { + l++; + } + if (trimString(line.substr(0, l)).length() > 0) + { + y += 8; + } + line = line.substr(l); + } + if (trimString(line).length() > 0) { + y += 8; + } + } + if (y < 8) y += 8; + return y; + +} + +void Font::setEnforceUnicodeSheet(bool enforceUnicodeSheet) +{ + this->enforceUnicodeSheet = enforceUnicodeSheet; +} + +void Font::setBidirectional(bool bidirectional) +{ + this->bidirectional = bidirectional; +} + +bool Font::AllCharactersValid(const wstring &str) +{ + for (int i = 0; i < (int)str.length(); ++i) + { + wchar_t c = str.at(i); + + if (c == 167 && i + 1 < str.length()) + { + // skip special color setting + i += 1; + continue; + } + + int index = SharedConstants::acceptableLetters.find(c); + + if ((c != ' ') && !(index > 0 && !enforceUnicodeSheet)) + { + return false; + } + } + return true; +} + +// Not in use +/*// 4J - this code is lifted from #if 0 section above, so that we can directly create what would have gone in each of our 256 + 32 command buffers +void Font::renderFakeCB(IntBuffer *ib) +{ + Tesselator *t = Tesselator::getInstance(); + + int i; + + for(unsigned int j = 0; j < ib->limit(); j++) + { + int cb = ib->get(j); + + if( cb < 256 ) + { + i = cb; + t->begin(); + int ix = i % 16 * 8; + int iy = i / 16 * 8; + // float s = 7.99f; + float s = 7.99f; + + float uo = (0.0f) / 128.0f; + float vo = (0.0f) / 128.0f; + + t->vertexUV((float)(0), (float)( 0 + s), (float)( 0), (float)( ix / 128.0f + uo), (float)( (iy + s) / 128.0f + vo)); + t->vertexUV((float)(0 + s), (float)( 0 + s), (float)( 0), (float)( (ix + s) / 128.0f + uo), (float)( (iy + s) / 128.0f + vo)); + t->vertexUV((float)(0 + s), (float)( 0), (float)( 0), (float)( (ix + s) / 128.0f + uo), (float)( iy / 128.0f + vo)); + t->vertexUV((float)(0), (float)( 0), (float)( 0), (float)( ix / 128.0f + uo), (float)( iy / 128.0f + vo)); + // target.colorBlit(texture, x + xo, y, color, ix, iy, + // charWidths[chars[i]], 8); + t->end(); + + glTranslatef((float)charWidths[i], 0, 0); + } + else + { + i = cb - 256; + + int br = ((i >> 3) & 1) * 0x55; + int r = ((i >> 2) & 1) * 0xaa + br; + int g = ((i >> 1) & 1) * 0xaa + br; + int b = ((i >> 0) & 1) * 0xaa + br; + if (i == 6) + { + r += 0x55; + } + bool darken = i >= 16; + + // color = r << 16 | g << 8 | b; + if (darken) + { + r /= 4; + g /= 4; + b /= 4; + } + glColor3f(r / 255.0f, g / 255.0f, b / 255.0f); + } + } +} + +void Font::loadUnicodePage(int page) +{ + wchar_t fileName[25]; + //String fileName = String.format("/1_2_2/font/glyph_%02X.png", page); + swprintf(fileName,25,L"/1_2_2/font/glyph_%02X.png",page); + BufferedImage *image = new BufferedImage(fileName); + //try + //{ + // image = ImageIO.read(Textures.class.getResourceAsStream(fileName.toString())); + //} + //catch (IOException e) + //{ + // throw new RuntimeException(e); + //} + + unicodeTexID[page] = textures->getTexture(image); + lastBoundTexture = unicodeTexID[page]; +} + +void Font::renderUnicodeCharacter(wchar_t c) +{ + if (unicodeWidth[c] == 0) + { + // System.out.println("no-width char " + c); + return; + } + + int page = c / 256; + + if (unicodeTexID[page] == 0) loadUnicodePage(page); + + if (lastBoundTexture != unicodeTexID[page]) + { + glBindTexture(GL_TEXTURE_2D, unicodeTexID[page]); + lastBoundTexture = unicodeTexID[page]; + } + + // first column with non-trans pixels + int firstLeft = unicodeWidth[c] >> 4; + // last column with non-trans pixels + int firstRight = unicodeWidth[c] & 0xF; + + float left = firstLeft; + float right = firstRight + 1; + + float xOff = c % 16 * 16 + left; + float yOff = (c & 0xFF) / 16 * 16; + float width = right - left - .02f; + + Tesselator *t = Tesselator::getInstance(); + t->begin(GL_TRIANGLE_STRIP); + t->tex(xOff / 256.0F, yOff / 256.0F); + t->vertex(xPos, yPos, 0.0f); + t->tex(xOff / 256.0F, (yOff + 15.98f) / 256.0F); + t->vertex(xPos, yPos + 7.99f, 0.0f); + t->tex((xOff + width) / 256.0F, yOff / 256.0F); + t->vertex(xPos + width / 2, yPos, 0.0f); + t->tex((xOff + width) / 256.0F, (yOff + 15.98f) / 256.0F); + t->vertex(xPos + width / 2, yPos + 7.99f, 0.0f); + t->end(); + + xPos += (right - left) / 2 + 1; +} +*/ + diff --git a/Minecraft.Client/Font.h b/Minecraft.Client/Font.h new file mode 100644 index 00000000..18d9bf91 --- /dev/null +++ b/Minecraft.Client/Font.h @@ -0,0 +1,85 @@ +#pragma once + +class IntBuffer; +class Options; +class Textures; +class ResourceLocation; + +class Font +{ +private: + int *charWidths; +public: + int fontTexture; + Random *random; + +private: + int colors[32]; // RGB colors for formatting + + Textures *textures; + + float xPos; + float yPos; + + bool enforceUnicodeSheet; // use unicode sheet for ascii + bool bidirectional; // use bidi to flip strings + + int m_cols; // Number of columns in font sheet + int m_rows; // Number of rows in font sheet + int m_charWidth; // Maximum character width + int m_charHeight; // Maximum character height + ResourceLocation *m_textureLocation; // Texture + std::map m_charMap; + +public: + 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(); +#endif + void renderFakeCB(IntBuffer *cb); // 4J added + +private: + void renderCharacter(wchar_t c); // 4J added + +public: + void drawShadow(const wstring& str, int x, int y, int color); + void drawShadowWordWrap(const wstring &str, int x, int y, int w, int color, int h); // 4J Added h param + void draw(const wstring &str, int x, int y, int color); + /** + * Reorders the string according to bidirectional levels. A bit expensive at + * the moment. + * + * @param str + * @return + */ +private: + wstring reorderBidi(const wstring &str); + + void draw(const wstring &str, bool dropShadow); + void draw(const wstring& str, int x, int y, int color, bool dropShadow); + int MapCharacter(wchar_t c); // 4J added + bool CharacterExists(wchar_t c); // 4J added + +public: + int width(const wstring& str); + wstring sanitize(const wstring& str); + void drawWordWrap(const wstring &string, int x, int y, int w, int col, int h); // 4J Added h param + +private: + void drawWordWrapInternal(const wstring &string, int x, int y, int w, int col, int h); // 4J Added h param + +public: + void drawWordWrap(const wstring &string, int x, int y, int w, int col, bool darken, int h); // 4J Added h param + +private: + void drawWordWrapInternal(const wstring& string, int x, int y, int w, int col, bool darken, int h); // 4J Added h param + +public: + int wordWrapHeight(const wstring& string, int w); + void setEnforceUnicodeSheet(bool enforceUnicodeSheet); + void setBidirectional(bool bidirectional); + + // 4J-PB - check for invalid player name - Japanese local name + bool AllCharactersValid(const wstring &str); +}; diff --git a/Minecraft.Client/FootstepParticle.cpp b/Minecraft.Client/FootstepParticle.cpp new file mode 100644 index 00000000..300575eb --- /dev/null +++ b/Minecraft.Client/FootstepParticle.cpp @@ -0,0 +1,66 @@ +#include "stdafx.h" +#include "FootstepParticle.h" +#include "Textures.h" +#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) +{ + // 4J added initialisers + life = 0; + lifeTime = 0; + + this->textures = textures; + xd = yd = zd = 0; + lifeTime = 200; +} + +void FootstepParticle::render(Tesselator *t, float a, float xa, float ya, float za, float xa2, float za2) +{ + float time = (life + a) / lifeTime; + time = time * time; + + float alpha = 2 - time * 2; + if (alpha > 1) alpha = 1; + alpha = alpha * 0.2f; + + glDisable(GL_LIGHTING); + float r = 2 / 16.0f; + + float xx = (float) (x - xOff); + float yy = (float) (y - yOff); + float zz = (float) (z - zOff); + + float br = level->getBrightness(Mth::floor(x), Mth::floor(y), Mth::floor(z)); + + textures->bindTexture(&FOOTPRINT_LOCATION); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + t->begin(); + t->color(br, br, br, alpha); + t->vertexUV((float)(xx - r), (float)( yy), (float)( zz + r), (float)( 0), (float)( 1)); + t->vertexUV((float)(xx + r), (float)( yy), (float)( zz + r), (float)( 1), (float)( 1)); + t->vertexUV((float)(xx + r), (float)( yy), (float)( zz - r), (float)( 1), (float)( 0)); + t->vertexUV((float)(xx - r), (float)( yy), (float)( zz - r), (float)( 0), (float)( 0)); + t->end(); + + glDisable(GL_BLEND); + glEnable(GL_LIGHTING); + +} + +void FootstepParticle::tick() +{ + life++; + if (life == lifeTime) remove(); +} + +int FootstepParticle::getParticleTexture() +{ + return ParticleEngine::ENTITY_PARTICLE_TEXTURE; +} \ No newline at end of file diff --git a/Minecraft.Client/FootstepParticle.h b/Minecraft.Client/FootstepParticle.h new file mode 100644 index 00000000..56f2b915 --- /dev/null +++ b/Minecraft.Client/FootstepParticle.h @@ -0,0 +1,21 @@ +#pragma once +#include "Particle.h" +class Textures; + +class FootstepParticle : public Particle +{ +public: + virtual eINSTANCEOF GetType() { return eType_FOOTSTEPPARTICLE; } + +private: + static ResourceLocation FOOTPRINT_LOCATION; + int life; + int lifeTime; + Textures *textures; + +public: + FootstepParticle(Textures *textures, Level *level, double x, double y, double z); + virtual void render(Tesselator *t, float a, float xa, float ya, float za, float xa2, float za2); + virtual void tick(); + virtual int getParticleTexture(); +}; \ No newline at end of file diff --git a/Minecraft.Client/Frustum.cpp b/Minecraft.Client/Frustum.cpp new file mode 100644 index 00000000..c40f7c6f --- /dev/null +++ b/Minecraft.Client/Frustum.cpp @@ -0,0 +1,149 @@ +#include "stdafx.h" +#include "..\Minecraft.World\FloatBuffer.h" +#include "Frustum.h" + +Frustum *Frustum::frustum = new Frustum(); + +Frustum::Frustum() +{ + _proj = MemoryTracker::createFloatBuffer(16); + _modl = MemoryTracker::createFloatBuffer(16); + _clip = MemoryTracker::createFloatBuffer(16); +} + +Frustum::~Frustum() +{ + delete _proj; + delete _modl; + delete _clip; +} + + +FrustumData *Frustum::getFrustum() +{ + frustum->calculateFrustum(); + return frustum; +} + + + ///////////////////////////////// NORMALIZE PLANE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\* + ///// + ///// This normalizes a plane (A side) from a given frustum. + ///// + ///////////////////////////////// NORMALIZE PLANE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\* + +void Frustum::normalizePlane(float **frustum, int side) +{ + float magnitude = (float) sqrt(frustum[side][A] * frustum[side][A] + frustum[side][B] * frustum[side][B] + frustum[side][C] * frustum[side][C]); + + // Then we divide the plane's values by it's magnitude. + // This makes it easier to work with. + frustum[side][A] /= magnitude; + frustum[side][B] /= magnitude; + frustum[side][C] /= magnitude; + frustum[side][D] /= magnitude; +} + +void Frustum::calculateFrustum() +{ + _proj->clear(); + _modl->clear(); + _clip->clear(); + + // glGetFloatv() is used to extract information about our OpenGL world. + // Below, we pass in GL_PROJECTION_MATRIX to abstract our projection matrix. + // It then stores the matrix into an array of [16]. + glGetFloat(GL_PROJECTION_MATRIX, _proj); + + // By passing in GL_MODELVIEW_MATRIX, we can abstract our model view matrix. + // This also stores it in an array of [16]. + glGetFloat(GL_MODELVIEW_MATRIX, _modl); + + _proj->flip()->limit(16); + _proj->get(&proj); + _modl->flip()->limit(16); + _modl->get(&modl); + + // Now that we have our modelview and projection matrix, if we combine these 2 matrices, + // it will give us our clipping planes. To combine 2 matrices, we multiply them. + + clip[0] = modl[0] * proj[0] + modl[1] * proj[4] + modl[2] * proj[8] + modl[3] * proj[12]; + clip[1] = modl[0] * proj[1] + modl[1] * proj[5] + modl[2] * proj[9] + modl[3] * proj[13]; + clip[2] = modl[0] * proj[2] + modl[1] * proj[6] + modl[2] * proj[10] + modl[3] * proj[14]; + clip[3] = modl[0] * proj[3] + modl[1] * proj[7] + modl[2] * proj[11] + modl[3] * proj[15]; + + clip[4] = modl[4] * proj[0] + modl[5] * proj[4] + modl[6] * proj[8] + modl[7] * proj[12]; + clip[5] = modl[4] * proj[1] + modl[5] * proj[5] + modl[6] * proj[9] + modl[7] * proj[13]; + clip[6] = modl[4] * proj[2] + modl[5] * proj[6] + modl[6] * proj[10] + modl[7] * proj[14]; + clip[7] = modl[4] * proj[3] + modl[5] * proj[7] + modl[6] * proj[11] + modl[7] * proj[15]; + + clip[8] = modl[8] * proj[0] + modl[9] * proj[4] + modl[10] * proj[8] + modl[11] * proj[12]; + clip[9] = modl[8] * proj[1] + modl[9] * proj[5] + modl[10] * proj[9] + modl[11] * proj[13]; + clip[10] = modl[8] * proj[2] + modl[9] * proj[6] + modl[10] * proj[10] + modl[11] * proj[14]; + clip[11] = modl[8] * proj[3] + modl[9] * proj[7] + modl[10] * proj[11] + modl[11] * proj[15]; + + clip[12] = modl[12] * proj[0] + modl[13] * proj[4] + modl[14] * proj[8] + modl[15] * proj[12]; + clip[13] = modl[12] * proj[1] + modl[13] * proj[5] + modl[14] * proj[9] + modl[15] * proj[13]; + clip[14] = modl[12] * proj[2] + modl[13] * proj[6] + modl[14] * proj[10] + modl[15] * proj[14]; + clip[15] = modl[12] * proj[3] + modl[13] * proj[7] + modl[14] * proj[11] + modl[15] * proj[15]; + + // Now we actually want to get the sides of the frustum. To do this we take + // the clipping planes we received above and extract the sides from them. + + // This will extract the RIGHT side of the frustum + m_Frustum[RIGHT][A] = clip[3] - clip[0]; + m_Frustum[RIGHT][B] = clip[7] - clip[4]; + m_Frustum[RIGHT][C] = clip[11] - clip[8]; + m_Frustum[RIGHT][D] = clip[15] - clip[12]; + + // Now that we have a normal (A,B,C) and a distance (D) to the plane, + // we want to normalize that normal and distance. + + // Normalize the RIGHT side + normalizePlane(m_Frustum, RIGHT); + + // This will extract the LEFT side of the frustum + m_Frustum[LEFT][A] = clip[3] + clip[0]; + m_Frustum[LEFT][B] = clip[7] + clip[4]; + m_Frustum[LEFT][C] = clip[11] + clip[8]; + m_Frustum[LEFT][D] = clip[15] + clip[12]; + + // Normalize the LEFT side + normalizePlane(m_Frustum, LEFT); + + // This will extract the BOTTOM side of the frustum + m_Frustum[BOTTOM][A] = clip[3] + clip[1]; + m_Frustum[BOTTOM][B] = clip[7] + clip[5]; + m_Frustum[BOTTOM][C] = clip[11] + clip[9]; + m_Frustum[BOTTOM][D] = clip[15] + clip[13]; + + // Normalize the BOTTOM side + normalizePlane(m_Frustum, BOTTOM); + + // This will extract the TOP side of the frustum + m_Frustum[TOP][A] = clip[3] - clip[1]; + m_Frustum[TOP][B] = clip[7] - clip[5]; + m_Frustum[TOP][C] = clip[11] - clip[9]; + m_Frustum[TOP][D] = clip[15] - clip[13]; + + // Normalize the TOP side + normalizePlane(m_Frustum, TOP); + + // This will extract the BACK side of the frustum + m_Frustum[BACK][A] = clip[3] - clip[2]; + m_Frustum[BACK][B] = clip[7] - clip[6]; + m_Frustum[BACK][C] = clip[11] - clip[10]; + m_Frustum[BACK][D] = clip[15] - clip[14]; + + // Normalize the BACK side + normalizePlane(m_Frustum, BACK); + + // This will extract the FRONT side of the frustum + m_Frustum[FRONT][A] = clip[3] + clip[2]; + m_Frustum[FRONT][B] = clip[7] + clip[6]; + m_Frustum[FRONT][C] = clip[11] + clip[10]; + m_Frustum[FRONT][D] = clip[15] + clip[14]; + + // Normalize the FRONT side + normalizePlane(m_Frustum, FRONT); +} \ No newline at end of file diff --git a/Minecraft.Client/Frustum.h b/Minecraft.Client/Frustum.h new file mode 100644 index 00000000..4ce37160 --- /dev/null +++ b/Minecraft.Client/Frustum.h @@ -0,0 +1,29 @@ +#pragma once +#include "FrustumData.h" + +class Frustum : public FrustumData +{ +private: + static Frustum *frustum; + +public: + static FrustumData *getFrustum(); + + ///////////////////////////////// NORMALIZE PLANE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\* + ///// + ///// This normalizes a plane (A side) from a given frustum. + ///// + ///////////////////////////////// NORMALIZE PLANE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\* + +private: + void normalizePlane(float **frustum, int side); + + FloatBuffer *_proj; + FloatBuffer *_modl; + FloatBuffer *_clip; + + void calculateFrustum(); + + Frustum(); + ~Frustum(); +}; \ No newline at end of file diff --git a/Minecraft.Client/FrustumCuller.cpp b/Minecraft.Client/FrustumCuller.cpp new file mode 100644 index 00000000..da4abd4a --- /dev/null +++ b/Minecraft.Client/FrustumCuller.cpp @@ -0,0 +1,29 @@ +#include "stdafx.h" +#include "FrustumCuller.h" + +FrustumCuller::FrustumCuller() +{ + frustum = Frustum::getFrustum(); +} + +void FrustumCuller::prepare(double xOff, double yOff, double zOff) +{ + this->xOff = xOff; + this->yOff = yOff; + this->zOff = zOff; +} + +bool FrustumCuller::cubeFullyInFrustum(double x0, double y0, double z0, double x1, double y1, double z1) +{ + return frustum->cubeFullyInFrustum(x0 - xOff, y0 - yOff, z0 - zOff, x1 - xOff, y1 - yOff, z1 - zOff); +} + +bool FrustumCuller::cubeInFrustum(double x0, double y0, double z0, double x1, double y1, double z1) +{ + return frustum->cubeInFrustum(x0 - xOff, y0 - yOff, z0 - zOff, x1 - xOff, y1 - yOff, z1 - zOff); +} + +bool FrustumCuller::isVisible(AABB *bb) +{ + return cubeInFrustum(bb->x0, bb->y0, bb->z0, bb->x1, bb->y1, bb->z1); +} \ No newline at end of file diff --git a/Minecraft.Client/FrustumCuller.h b/Minecraft.Client/FrustumCuller.h new file mode 100644 index 00000000..962f850e --- /dev/null +++ b/Minecraft.Client/FrustumCuller.h @@ -0,0 +1,16 @@ +#include "stdafx.h" +#include "Culler.h" +#include "Frustum.h" + +class FrustumCuller : public Culler +{ +public: + FrustumData *frustum; + FrustumCuller(); + double xOff, yOff, zOff; +public: + virtual void prepare(double xOff, double yOff, double zOff); + virtual bool cubeFullyInFrustum(double x0, double y0, double z0, double x1, double y1, double z1); + virtual bool cubeInFrustum(double x0, double y0, double z0, double x1, double y1, double z1); + virtual bool isVisible(AABB *bb); +}; diff --git a/Minecraft.Client/FrustumData.cpp b/Minecraft.Client/FrustumData.cpp new file mode 100644 index 00000000..177a51f7 --- /dev/null +++ b/Minecraft.Client/FrustumData.cpp @@ -0,0 +1,90 @@ +#include "stdafx.h" +#include "FrustumData.h" + +float** m_Frustum; + + +FrustumData::FrustumData() +{ + m_Frustum = new float *[16]; + for( int i = 0; i < 16; i++ ) m_Frustum[i] = new float[16]; + proj = floatArray( 16 ); + modl = floatArray( 16 ); + clip = floatArray( 16 ); +} + +FrustumData::~FrustumData() +{ + delete[] proj.data; + delete[] modl.data; + delete[] clip.data; + for( int i = 0; i < 16; i++ ) delete[] m_Frustum[i]; + delete[] m_Frustum; +} + +bool FrustumData::pointInFrustum(float x, float y, float z) +{ + for (int i = 0; i < 6; i++) + { + if (m_Frustum[i][A] * x + m_Frustum[i][B] * y + m_Frustum[i][C] * z + m_Frustum[i][D] <= 0) + { + return false; + } + } + + return true; +} + +bool FrustumData::sphereInFrustum(float x, float y, float z, float radius) +{ + for (int i = 0; i < 6; i++) + { + if (m_Frustum[i][A] * x + m_Frustum[i][B] * y + m_Frustum[i][C] * z + m_Frustum[i][D] <= -radius) + { + return false; + } + } + + return true; +} + +bool FrustumData::cubeFullyInFrustum(double x1, double y1, double z1, double x2, double y2, double z2) +{ + for (int i = 0; i < 6; i++) + { + if (!(m_Frustum[i][A] * (x1) + m_Frustum[i][B] * (y1) + m_Frustum[i][C] * (z1) + m_Frustum[i][D] > 0)) return false; + if (!(m_Frustum[i][A] * (x2) + m_Frustum[i][B] * (y1) + m_Frustum[i][C] * (z1) + m_Frustum[i][D] > 0)) return false; + if (!(m_Frustum[i][A] * (x1) + m_Frustum[i][B] * (y2) + m_Frustum[i][C] * (z1) + m_Frustum[i][D] > 0)) return false; + if (!(m_Frustum[i][A] * (x2) + m_Frustum[i][B] * (y2) + m_Frustum[i][C] * (z1) + m_Frustum[i][D] > 0)) return false; + if (!(m_Frustum[i][A] * (x1) + m_Frustum[i][B] * (y1) + m_Frustum[i][C] * (z2) + m_Frustum[i][D] > 0)) return false; + if (!(m_Frustum[i][A] * (x2) + m_Frustum[i][B] * (y1) + m_Frustum[i][C] * (z2) + m_Frustum[i][D] > 0)) return false; + if (!(m_Frustum[i][A] * (x1) + m_Frustum[i][B] * (y2) + m_Frustum[i][C] * (z2) + m_Frustum[i][D] > 0)) return false; + if (!(m_Frustum[i][A] * (x2) + m_Frustum[i][B] * (y2) + m_Frustum[i][C] * (z2) + m_Frustum[i][D] > 0)) return false; + } + + return true; +} + +bool FrustumData::cubeInFrustum(double x1, double y1, double z1, double x2, double y2, double z2) +{ + for (int i = 0; i < 6; i++) + { + if (m_Frustum[i][A] * (x1) + m_Frustum[i][B] * (y1) + m_Frustum[i][C] * (z1) + m_Frustum[i][D] > 0) continue; + if (m_Frustum[i][A] * (x2) + m_Frustum[i][B] * (y1) + m_Frustum[i][C] * (z1) + m_Frustum[i][D] > 0) continue; + if (m_Frustum[i][A] * (x1) + m_Frustum[i][B] * (y2) + m_Frustum[i][C] * (z1) + m_Frustum[i][D] > 0) continue; + if (m_Frustum[i][A] * (x2) + m_Frustum[i][B] * (y2) + m_Frustum[i][C] * (z1) + m_Frustum[i][D] > 0) continue; + if (m_Frustum[i][A] * (x1) + m_Frustum[i][B] * (y1) + m_Frustum[i][C] * (z2) + m_Frustum[i][D] > 0) continue; + if (m_Frustum[i][A] * (x2) + m_Frustum[i][B] * (y1) + m_Frustum[i][C] * (z2) + m_Frustum[i][D] > 0) continue; + if (m_Frustum[i][A] * (x1) + m_Frustum[i][B] * (y2) + m_Frustum[i][C] * (z2) + m_Frustum[i][D] > 0) continue; + if (m_Frustum[i][A] * (x2) + m_Frustum[i][B] * (y2) + m_Frustum[i][C] * (z2) + m_Frustum[i][D] > 0) continue; + + return false; + } + + return true; +} + +bool FrustumData::isVisible(AABB *aabb) +{ + return cubeInFrustum(aabb->x0, aabb->y0, aabb->z0, aabb->x1, aabb->y1, aabb->z1); +} \ No newline at end of file diff --git a/Minecraft.Client/FrustumData.h b/Minecraft.Client/FrustumData.h new file mode 100644 index 00000000..7285f145 --- /dev/null +++ b/Minecraft.Client/FrustumData.h @@ -0,0 +1,35 @@ +#pragma once +#include "..\Minecraft.World\AABB.h" + +class FrustumData +{ +public: + //enum FrustumSide + static const int RIGHT = 0; // The RIGHT side of the frustum + static const int LEFT = 1; // The LEFT side of the frustum + static const int BOTTOM = 2; // The BOTTOM side of the frustum + static const int TOP = 3; // The TOP side of the frustum + static const int BACK = 4; // The BACK side of the frustum + static const int FRONT = 5; // The FRONT side of the frustum + + // Like above, instead of saying a number for the ABC and D of the plane, we + // want to be more descriptive. + static const int A = 0; // The X value of the plane's normal + static const int B = 1; // The Y value of the plane's normal + static const int C = 2; // The Z value of the plane's normal + static const int D = 3; // The distance the plane is from the origin + + float** m_Frustum; + floatArray proj; + floatArray modl; + floatArray clip; + + FrustumData(); + ~FrustumData(); + + bool pointInFrustum(float x, float y, float z); + bool sphereInFrustum(float x, float y, float z, float radius); + bool cubeFullyInFrustum(double x1, double y1, double z1, double x2, double y2, double z2); + bool cubeInFrustum(double x1, double y1, double z1, double x2, double y2, double z2); + bool isVisible(AABB *aabb); +}; \ No newline at end of file diff --git a/Minecraft.Client/FurnaceScreen.cpp b/Minecraft.Client/FurnaceScreen.cpp new file mode 100644 index 00000000..20ec7104 --- /dev/null +++ b/Minecraft.Client/FurnaceScreen.cpp @@ -0,0 +1,39 @@ +#include "stdafx.h" +#include "FurnaceScreen.h" +#include "Textures.h" +#include "LocalPlayer.h" +#include "Font.h" +#include "..\Minecraft.World\net.minecraft.world.inventory.h" +#include "..\Minecraft.World\FurnaceTileEntity.h" + +FurnaceScreen::FurnaceScreen(shared_ptr inventory, shared_ptr furnace) : AbstractContainerScreen(new FurnaceMenu(inventory, furnace)) +{ + this->furnace = furnace; +} + +void FurnaceScreen::renderLabels() +{ + font->draw(L"Furnace", 16 + 4 + 40, 2 + 2 + 2, 0x404040); + font->draw(L"Inventory", 8, imageHeight - 96 + 2, 0x404040); +} + +void FurnaceScreen::renderBg(float a) +{ + // 4J Unused +#if 0 + int tex = minecraft->textures->loadTexture(L"/gui/furnace.png"); + glColor4f(1, 1, 1, 1); + minecraft->textures->bind(tex); + int xo = (width - imageWidth) / 2; + int yo = (height - imageHeight) / 2; + this->blit(xo, yo, 0, 0, imageWidth, imageHeight); + if (furnace->isLit()) + { + int p = furnace->getLitProgress(12); + this->blit(xo + 56, yo + 36 + 12 - p, 176, 12 - p, 14, p + 2); + } + + int p = furnace->getBurnProgress(24); + this->blit(xo + 79, yo + 34, 176, 14, p + 1, 16); +#endif +} \ No newline at end of file diff --git a/Minecraft.Client/FurnaceScreen.h b/Minecraft.Client/FurnaceScreen.h new file mode 100644 index 00000000..f018093f --- /dev/null +++ b/Minecraft.Client/FurnaceScreen.h @@ -0,0 +1,17 @@ +#pragma once +#include "AbstractContainerScreen.h" + +class FurnaceTileEntity; +class Inventory; + +class FurnaceScreen : public AbstractContainerScreen +{ +private: + shared_ptr furnace; + +public: + FurnaceScreen(shared_ptr inventory, shared_ptr furnace); +protected: + virtual void renderLabels(); + virtual void renderBg(float a); +}; \ No newline at end of file diff --git a/Minecraft.Client/GameMode.cpp b/Minecraft.Client/GameMode.cpp new file mode 100644 index 00000000..a11d6c07 --- /dev/null +++ b/Minecraft.Client/GameMode.cpp @@ -0,0 +1,182 @@ +#include "stdafx.h" +#include "GameMode.h" +#include "LocalPlayer.h" +#include "LevelRenderer.h" +#include "..\Minecraft.World\net.minecraft.world.level.h" +#include "..\Minecraft.World\net.minecraft.world.level.tile.h" +#include "..\Minecraft.World\net.minecraft.world.level.dimension.h" +#include "..\Minecraft.World\net.minecraft.world.item.h" +#include "..\Minecraft.World\net.minecraft.world.inventory.h" +#include "..\Minecraft.World\net.minecraft.world.entity.player.h" +#include "..\Minecraft.World\net.minecraft.world.level.chunk.h" + +GameMode::GameMode(Minecraft *minecraft) +{ + instaBuild = false; // 4J - added + this->minecraft = minecraft; +} + +void GameMode::initLevel(Level *level) +{ +} + +bool GameMode::destroyBlock(int x, int y, int z, int face) +{ + Level *level = minecraft->level; + Tile *oldTile = Tile::tiles[level->getTile(x, y, z)]; + if (oldTile == NULL) return false; + + // 4J - Let the rendering side of thing know we are about to destroy the tile, so we can synchronise collision with async render data upates. + minecraft->levelRenderer->destroyedTileManager->destroyingTileAt(level, x, y, z); + 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); + // 4J - before we remove the tile, recalc the heightmap - setTile depends on this being valid to be able to do + // a quick update of skylighting when the block is removed, and there are cases with falling tiles where this can get out of sync + level->getChunkAt(x,z)->recalcHeightmapOnly(); + bool changed = level->setTile(x, y, z, 0); + + if (oldTile != NULL && changed) + { + oldTile->destroy(level, x, y, z, data); + } + return changed; +} + +void GameMode::render(float a) +{ +} + +bool GameMode::useItem(shared_ptr player, Level *level, shared_ptr item, bool bTestUseOnly) +{ +} + +void GameMode::initPlayer(shared_ptr player) +{ +} + +void GameMode::tick() +{ +} + +void GameMode::adjustPlayer(shared_ptr player) +{ +} + +//bool GameMode::useItemOn(shared_ptr player, Level *level, shared_ptr item, int x, int y, int z, int face, bool bTestUseOnOnly) +//{ +// // 4J-PB - Adding a test only version to allow tooltips to be displayed +// int t = level->getTile(x, y, z); +// if (t > 0) +// { +// if(bTestUseOnOnly) +// { +// switch(t) +// { +// case Tile::recordPlayer_Id: +// case Tile::bed_Id: // special case for a bed +// if (Tile::tiles[t]->TestUse(level, x, y, z, player )) +// { +// return true; +// } +// else +// { +// // 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 )) return true; +// } +// } +// +// if (item == NULL) return false; +// return item->useOn(player, level, x, y, z, face, bTestUseOnOnly); +//} + + +shared_ptr GameMode::createPlayer(Level *level) +{ + return shared_ptr( new LocalPlayer(minecraft, level, minecraft->user, level->dimension->id) ); +} + +bool GameMode::interact(shared_ptr player, shared_ptr entity) +{ + return player->interact(entity); +} + +void GameMode::attack(shared_ptr player, shared_ptr entity) +{ + player->attack(entity); +} + +shared_ptr GameMode::handleInventoryMouseClick(int containerId, int slotNum, int buttonNum, bool quickKeyHeld, shared_ptr player) +{ + return nullptr; +} + +void GameMode::handleCloseInventory(int containerId, shared_ptr player) +{ + player->containerMenu->removed(player); + delete player->containerMenu; + player->containerMenu = player->inventoryMenu; +} + +void GameMode::handleInventoryButtonClick(int containerId, int buttonId) +{ + +} + +bool GameMode::isCutScene() +{ + return false; +} + +void GameMode::releaseUsingItem(shared_ptr player) +{ + player->releaseUsingItem(); +} + +bool GameMode::hasExperience() +{ + return false; +} + +bool GameMode::hasMissTime() +{ + return true; +} + +bool GameMode::hasInfiniteItems() +{ + return false; +} + +bool GameMode::hasFarPickRange() +{ + return false; +} + +void GameMode::handleCreativeModeItemAdd(shared_ptr clicked, int i) +{ +} + +void GameMode::handleCreativeModeItemDrop(shared_ptr clicked) +{ +} + +bool GameMode::handleCraftItem(int recipe, shared_ptr player) +{ + return true; +} + +// 4J-PB +void GameMode::handleDebugOptions(unsigned int uiVal, shared_ptr player) +{ + player->SetDebugOptions(uiVal); +} diff --git a/Minecraft.Client/GameMode.h b/Minecraft.Client/GameMode.h new file mode 100644 index 00000000..ab9ec9d1 --- /dev/null +++ b/Minecraft.Client/GameMode.h @@ -0,0 +1,59 @@ +#pragma once + +class Minecraft; +class Level; +class Player; +class ItemInstance; +class Entity; + +class Tutorial; + +class GameMode +{ +protected: + Minecraft *minecraft; +public: + bool instaBuild; + + GameMode(Minecraft *minecraft); + virtual ~GameMode() {} + + virtual void initLevel(Level *level) ; + virtual void startDestroyBlock(int x, int y, int z, int face) = 0; + virtual bool destroyBlock(int x, int y, int z, int face); + virtual void continueDestroyBlock(int x, int y, int z, int face) = 0; + virtual void stopDestroyBlock() = 0; + virtual void render(float a); + virtual float getPickRange() = 0; + virtual void initPlayer(shared_ptr player); + virtual void tick(); + virtual bool canHurtPlayer() = 0; + virtual void adjustPlayer(shared_ptr player); + virtual bool useItem(shared_ptr player, Level *level, shared_ptr item, bool bTestUseOnly=false); + virtual bool useItemOn(shared_ptr player, Level *level, shared_ptr item, int x, int y, int z, int face, bool bTestUseOnOnly=false, bool *pbUsedItem = NULL) = 0; + + virtual shared_ptr createPlayer(Level *level); + virtual bool interact(shared_ptr player, shared_ptr entity); + virtual void attack(shared_ptr player, shared_ptr entity); + virtual shared_ptr handleInventoryMouseClick(int containerId, int slotNum, int buttonNum, bool quickKeyHeld, shared_ptr player); + virtual void handleCloseInventory(int containerId, shared_ptr player); + virtual void handleInventoryButtonClick(int containerId, int buttonId); + + virtual bool isCutScene(); + virtual void releaseUsingItem(shared_ptr player); + virtual bool hasExperience(); + virtual bool hasMissTime(); + virtual bool hasInfiniteItems(); + virtual bool hasFarPickRange(); + virtual void handleCreativeModeItemAdd(shared_ptr clicked, int i); + virtual void handleCreativeModeItemDrop(shared_ptr clicked); + + // 4J Stu - Added so we can send packets for this in the network game + virtual bool handleCraftItem(int recipe, shared_ptr player); + virtual void handleDebugOptions(unsigned int uiVal, shared_ptr player); + + // 4J Stu - Added for tutorial checks + virtual bool isInputAllowed(int mapping) { return true; } + virtual bool isTutorial() { return false; } + virtual Tutorial *getTutorial() { return NULL; } +}; diff --git a/Minecraft.Client/GameRenderer.cpp b/Minecraft.Client/GameRenderer.cpp new file mode 100644 index 00000000..5e52459c --- /dev/null +++ b/Minecraft.Client/GameRenderer.cpp @@ -0,0 +1,2104 @@ +#include "stdafx.h" +#include "GameRenderer.h" +#include "ItemInHandRenderer.h" +#include "LevelRenderer.h" +#include "Frustum.h" +#include "FrustumCuller.h" +#include "Textures.h" +#include "Tesselator.h" +#include "ParticleEngine.h" +#include "SmokeParticle.h" +#include "WaterDropParticle.h" +#include "GameMode.h" +#include "CreativeMode.h" +#include "Lighting.h" +#include "Options.h" +#include "MultiplayerLocalPlayer.h" +#include "GuiParticles.h" +#include "MultiPlayerLevel.h" +#include "Chunk.h" +#include "..\Minecraft.World\net.minecraft.world.entity.h" +#include "..\Minecraft.World\net.minecraft.world.entity.player.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" +#include "..\Minecraft.World\SparseLightStorage.h" +#include "..\Minecraft.World\CompressedTileStorage.h" +#include "..\Minecraft.World\SparseDataStorage.h" +#include "..\Minecraft.World\JavaMath.h" +#include "..\Minecraft.World\Facing.h" +#include "..\Minecraft.World\MobEffect.h" +#include "..\Minecraft.World\IntCache.h" +#include "..\Minecraft.World\SmoothFloat.h" +#include "..\Minecraft.World\MobEffectInstance.h" +#include "..\Minecraft.World\Item.h" +#include "Camera.h" +#include "..\Minecraft.World\SoundTypes.h" +#include "HumanoidModel.h" +#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; + +#ifdef MULTITHREAD_ENABLE +C4JThread* GameRenderer::m_updateThread; +C4JThread::EventArray* GameRenderer::m_updateEvents; +bool GameRenderer::nearThingsToDo = false; +bool GameRenderer::updateRunning = false; +vector GameRenderer::m_deleteStackByte; +vector GameRenderer::m_deleteStackSparseLightStorage; +vector GameRenderer::m_deleteStackCompressedTileStorage; +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 + renderDistance = 0; + _tick = 0; + hovered = nullptr; + thirdDistance = 4; + thirdDistanceO = 4; + thirdRotation = 0; + thirdRotationO = 0; + thirdTilt = 0; + thirdTiltO = 0; + + accumulatedSmoothXO = 0; + accumulatedSmoothYO = 0; + tickSmoothXO = 0; + tickSmoothYO = 0; + lastTickA = 0; + + cameraPos = Vec3::newPermanent(0.0f,0.0f,0.0f); + + fovOffset = 0; + fovOffsetO = 0; + cameraRoll = 0; + cameraRollO = 0; + for( int i = 0; i < 4; i++ ) + { + fov[i] = 0.0f; + oFov[i] = 0.0f; + tFov[i] = 0.0f; + } + isInClouds = false; + zoom = 1; + zoom_x = 0; + zoom_y = 0; + rainXa = NULL; + rainZa = NULL; + lastActiveTime = Minecraft::currentTimeMillis(); + lastNsTime = 0; + random = new Random(); + rainSoundTime = 0; + xMod = 0; + yMod = 0; + lb = MemoryTracker::createFloatBuffer(16); + fr = 0.0f; + fg = 0.0f; + fb = 0.0f; + fogBrO = 0.0f; + fogBr = 0.0f; + cameraFlip = 0; + _updateLightTexture = false; + blr = 0.0f; + blrt = 0.0f; + blg = 0.0f; + blgt = 0.0f; + + darkenWorldAmount = 0.0f; + darkenWorldAmountO = 0.0f; + + m_fov=70.0f; + + // 4J Stu - Init these so they are setup before the tick + for( int i = 0; i < 4; i++ ) + { + fov[i] = oFov[i] = 1.0f; + } + + this->mc = mc; + itemInHandRenderer = NULL; + + // 4J-PB - set up the local players iteminhand renderers here - needs to be done with lighting enabled so that the render geometry gets compiled correctly + glEnable(GL_LIGHTING); + mc->localitemInHandRenderers[0] = new ItemInHandRenderer(mc);//itemInHandRenderer; + mc->localitemInHandRenderers[1] = new ItemInHandRenderer(mc); + mc->localitemInHandRenderers[2] = new ItemInHandRenderer(mc); + mc->localitemInHandRenderers[3] = new ItemInHandRenderer(mc); + glDisable(GL_LIGHTING); + + // 4J - changes brought forward from 1.8.2 + BufferedImage *img = new BufferedImage(16, 16, BufferedImage::TYPE_INT_RGB); + for( int i = 0; i < NUM_LIGHT_TEXTURES; i++ ) + { + lightTexture[i] = mc->textures->getTexture(img); // 4J - changed to one light texture per level to support split screen + } + delete img; +#ifdef __PS3__ + // we're using the RSX now to upload textures to vram, so we need the main ram textures allocated from io space + for(int i=0;iSet(eUpdateEventIsFinished); + + InitializeCriticalSection(&m_csDeleteStack); + m_updateThread = new C4JThread(runUpdate, NULL, "Chunk update"); +#ifdef __PS3__ + m_updateThread->SetPriority(THREAD_PRIORITY_ABOVE_NORMAL); +#endif// __PS3__ + m_updateThread->SetProcessor(CPU_CORE_CHUNK_UPDATE); + m_updateThread->Run(); +#endif +} + +// 4J Stu Added to go with 1.8.2 change +GameRenderer::~GameRenderer() +{ + if(rainXa != NULL) delete [] rainXa; + if(rainZa != NULL) delete [] rainZa; +} + +void GameRenderer::tick(bool first) // 4J - add bFirst +{ + tickFov(); + tickLightTexture(); // 4J - change brought forward from 1.8.2 + fogBrO = fogBr; + thirdDistanceO = thirdDistance; + thirdRotationO = thirdRotation; + thirdTiltO = thirdTilt; + fovOffsetO = fovOffset; + cameraRollO = cameraRoll; + + 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); + } + + float brr = mc->level->getBrightness(Mth::floor(mc->cameraTargetPlayer->x), Mth::floor(mc->cameraTargetPlayer->y), Mth::floor(mc->cameraTargetPlayer->z)); + float whiteness = (3 - mc->options->viewDistance) / 3.0f; + float fogBrT = brr * (1 - whiteness) + whiteness; + fogBr += (fogBrT - fogBr) * 0.1f; + + itemInHandRenderer->tick(); + + PIXBeginNamedEvent(0,"Rain tick"); + 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++; +} + +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); + mc->hitResult = mc->cameraTargetPlayer->pick(range, a); + MemSect(0); + + // 4J - added - stop blocks right at the edge of the world from being pickable so we shouldn't be able to directly destroy or create anything there + if( mc->hitResult ) + { + int maxxz = ( ( mc->level->chunkSource->m_XZSize / 2 ) * 16 ) - 2; + int minxz = ( -( mc->level->chunkSource->m_XZSize / 2 ) * 16 ) + 1; + + // Don't select the tops of the very edge blocks, or the sides of the next blocks in + // 4J Stu - Only block the sides that are facing an outside block + int hitx = mc->hitResult->x; + int hitz = mc->hitResult->z; + int face = mc->hitResult->f; + if( face == Facing::WEST && hitx < 0 ) hitx -= 1; + if( face == Facing::EAST && hitx > 0 ) hitx += 1; + if( face == Facing::NORTH && hitz < 0 ) hitz -= 1; + if( face == Facing::SOUTH && hitz > 0 ) hitz += 1; + + if( ( hitx < minxz ) || ( hitx > maxxz) || + ( hitz < minxz ) || ( hitz > maxxz) ) + { + delete mc->hitResult; + mc->hitResult = NULL; + } + } + + double dist = range; + Vec3 *from = mc->cameraTargetPlayer->getPos(a); + + if (mc->gameMode->hasFarPickRange()) + { + dist = range = 6; + } + else + { + if (dist > 3) dist = 3; + range = dist; + } + + if (mc->hitResult != NULL) + { + 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; + + 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; + + float rr = e->getPickRadius(); + AABB *bb = e->bb->grow(rr, rr, rr); + HitResult *p = bb->clip(from, to); + if (bb->contains(from)) + { + if (0 < nearest || nearest == 0) + { + hovered = e; + nearest = 0; + } + } + else if (p != NULL) + { + double dd = from->distanceTo(p->pos); + if (e == mc->cameraTargetPlayer->riding != NULL) + { + if (nearest == 0) + { + hovered = e; + } + } + else + { + hovered = e; + nearest = dd; + } + } + delete p; + } + + if (hovered != NULL) + { + if (nearest < dist || (mc->hitResult == NULL)) + { + if( mc->hitResult != NULL ) + delete mc->hitResult; + mc->hitResult = new HitResult(hovered); + if (hovered->instanceof(eTYPE_LIVINGENTITY)) + { + mc->crosshairPickMob = dynamic_pointer_cast(hovered); + } + } + } +} + +void GameRenderer::SetFovVal(float fov) +{ + m_fov=fov; +} + +float GameRenderer::GetFovVal() +{ + return m_fov; +} + +void GameRenderer::tickFov() +{ + shared_ptrplayer = dynamic_pointer_cast(mc->cameraTargetPlayer); + + int playerIdx = player ? player->GetXboxPad() : 0; + tFov[playerIdx] = player->getFieldOfViewModifier(); + + 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) +{ + if (cameraFlip > 0 ) return 90; + + shared_ptr player = dynamic_pointer_cast(mc->cameraTargetPlayer); + int playerIdx = player ? player->GetXboxPad() : 0; + float fov = m_fov;//70; + if (applyEffects) + { + fov += mc->options->fov * 40; + fov *= oFov[playerIdx] + (this->fov[playerIdx] - oFov[playerIdx]) * a; + } + if (player->getHealth() <= 0) + { + float duration = player->deathTime + a; + + 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; + + return fov + fovOffsetO + (fovOffset - fovOffsetO) * a; + +} + +void GameRenderer::bobHurt(float a) +{ + shared_ptr player = mc->cameraTargetPlayer; + + float hurt = player->hurtTime - a; + + if (player->getHealth() <= 0) + { + float duration = player->deathTime + a; + + glRotatef(40 - (40 * 200) / (duration + 200), 0, 0, 1); + } + + if (hurt < 0) return; + hurt /= player->hurtDuration; + hurt = (float) Mth::sin(hurt * hurt * hurt * hurt * PI); + + float rr = player->hurtDir; + + + glRotatef(-rr, 0, 1, 0); + glRotatef(-hurt * 14, 0, 0, 1); + glRotatef(+rr, 0, 1, 0); + +} + +void GameRenderer::bobView(float a) +{ + if (!mc->cameraTargetPlayer->instanceof(eTYPE_LIVINGENTITY)) return; + + shared_ptr player = dynamic_pointer_cast(mc->cameraTargetPlayer); + + float wda = player->walkDist - player->walkDistO; + float b = -(player->walkDist + wda * a); + float bob = player->oBob + (player->bob - player->oBob) * a; + float tilt = player->oTilt + (player->tilt - player->oTilt) * a; + glTranslatef((float) Mth::sin(b * PI) * bob * 0.5f, -(float) abs(Mth::cos(b * PI) * bob), 0); + glRotatef((float) Mth::sin(b * PI) * bob * 3, 0, 0, 1); + glRotatef((float) abs(Mth::cos(b * PI - 0.2f) * bob) * 5, 1, 0, 0); + glRotatef((float) tilt, 1, 0, 0); +} + +void GameRenderer::moveCameraToPlayer(float a) +{ + shared_ptr player = mc->cameraTargetPlayer; + shared_ptr localplayer = dynamic_pointer_cast(mc->cameraTargetPlayer); + float heightOffset = player->heightOffset - 1.62f; + + double x = player->xo + (player->x - player->xo) * a; + double y = player->yo + (player->y - player->yo) * a - heightOffset; + double z = player->zo + (player->z - player->zo) * a; + + + glRotatef(cameraRollO + (cameraRoll - cameraRollO) * a, 0, 0, 1); + + if (player->isSleeping()) + { + heightOffset += 1.0; + glTranslatef(0.0f, 0.3f, 0); + if (!mc->options->fixedCamera) + { + int t = mc->level->getTile(Mth::floor(player->x), Mth::floor(player->y), Mth::floor(player->z)); + if (t == Tile::bed_Id) + { + int data = mc->level->getData(Mth::floor(player->x), Mth::floor(player->y), Mth::floor(player->z)); + + int direction = data & 3; + glRotatef((float)direction * 90,0.0f, 1.0f, 0.0f); + } + glRotatef(player->yRotO + (player->yRot - player->yRotO) * a + 180, 0, -1, 0); + glRotatef(player->xRotO + (player->xRot - player->xRotO) * a, -1, 0, 0); + } + } + // 4J-PB - changing this to be per player + //else if (mc->options->thirdPersonView) + else if (localplayer->ThirdPersonView()) + { + double cameraDist = thirdDistanceO + (thirdDistance - thirdDistanceO) * a; + + if (mc->options->fixedCamera) + { + + float rotationY = thirdRotationO + (thirdRotation - thirdRotationO) * a; + float xRot = thirdTiltO + (thirdTilt - thirdTiltO) * a; + + glTranslatef(0, 0, (float) -cameraDist); + glRotatef(xRot, 1, 0, 0); + glRotatef(rotationY, 0, 1, 0); + } + 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 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 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 + xRot += 180.0f; + } + + double xd = -Mth::sin(yRot / 180 * PI) * Mth::cos(xRot / 180 * PI) * cameraDist; + double zd = Mth::cos(yRot / 180 * PI) * Mth::cos(xRot / 180 * PI) * cameraDist; + double yd = -Mth::sin(xRot / 180 * PI) * cameraDist; + + for (int i = 0; i < 8; i++) + { + float xo = (float)((i & 1) * 2 - 1); + float yo = (float)(((i >> 1) & 1) * 2 - 1); + float zo = (float)(((i >> 2) & 1) * 2 - 1); + + xo *= 0.1f; + yo *= 0.1f; + zo *= 0.1f; + + // 4J - corrected bug here where zo was also added to x component + HitResult *hr = mc->level->clip(Vec3::newTemp(x + xo, y + yo, z + zo), Vec3::newTemp(x - xd + xo, y - yd + yo, z - zd + zo)); + if (hr != NULL) + { + double dist = hr->pos->distanceTo(Vec3::newTemp(x, y, z)); + if (dist < cameraDist) cameraDist = dist; + delete hr; + } + } + + 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 - playerYRot, 0, 1, 0); + glRotatef(xRot - playerXRot, 1, 0, 0); + } + } + else + { + glTranslatef(0, 0, -0.1f); + } + + if (!mc->options->fixedCamera) + { + glRotatef(player->xRotO + (player->xRot - player->xRotO) * a, 1, 0, 0); + glRotatef(player->yRotO + (player->yRot - player->yRotO) * a + 180, 0, 1, 0); + } + + glTranslatef(0, heightOffset, 0); + + x = player->xo + (player->x - player->xo) * a; + y = player->yo + (player->y - player->yo) * a - heightOffset; + z = player->zo + (player->z - player->zo) * a; + + isInClouds = mc->levelRenderer->isInCloud(x, y, z, a); + +} + + +void GameRenderer::zoomRegion(double zoom, double xa, double ya) +{ + zoom = zoom; + zoom_x = xa; + zoom_y = ya; +} + +void GameRenderer::unZoomRegion() +{ + zoom = 1; +} + +// 4J added as we have more complex adjustments to make for fov & aspect on account of viewports +void GameRenderer::getFovAndAspect(float& fov, float& aspect, float a, bool applyEffects) +{ + // 4J - split out aspect ratio and fov here so we can adjust for viewports - we might need to revisit these as + // they are maybe be too generous for performance. + aspect = mc->width / (float) mc->height; + fov = getFov(a, applyEffects); + + if( ( mc->player->m_iScreenSection == C4JRender::VIEWPORT_TYPE_SPLIT_TOP ) || + ( mc->player->m_iScreenSection == C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM ) ) + { + aspect *= 2.0f; + fov *= 0.7f; // Reduce FOV to make things less fish-eye, at the expense of reducing vertical FOV from single player mode + } + else if( ( mc->player->m_iScreenSection == C4JRender::VIEWPORT_TYPE_SPLIT_LEFT ) || + ( mc->player->m_iScreenSection == C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT) ) + { + // Ideally I'd like to make the fov bigger here, but if I do then you an see that the arm isn't very long... + aspect *= 0.5f; + } +} + +void GameRenderer::setupCamera(float a, int eye) +{ + renderDistance = (float)(16 * 16 >> (mc->options->viewDistance)); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + + 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 aspect, fov; + getFovAndAspect(fov, aspect, a, true); + + if (zoom != 1) + { + glTranslatef((float) zoom_x, (float) -zoom_y, 0); + glScaled(zoom, zoom, 1); + } + gluPerspective(fov, aspect, 0.05f, renderDistance * 2); + + if (mc->gameMode->isCutScene()) + { + float s = 1 / 1.5f; + glScalef(1, s, 1); + } + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + if (mc->options->anaglyph3d) glTranslatef((eye * 2 - 1) * 0.10f, 0, 0); + + bobHurt(a); + + // 4J-PB - this is a per-player option + //if (mc->options->bobView) bobView(a); + + bool bNoLegAnim =(mc->player->getAnimOverrideBitmask()&(1<player->getAnimOverrideBitmask()&(1<player->GetXboxPad(),eGameSetting_ViewBob) && !mc->player->abilities.flying && !bNoLegAnim && !bNoBobbingAnim) bobView(a); + + float pt = mc->player->oPortalTime + (mc->player->portalTime - mc->player->oPortalTime) * a; + if (pt > 0) + { + int multiplier = 20; + if (mc->player->hasEffect(MobEffect::confusion)) + { + multiplier = 7; + } + + float skew = 5 / (pt * pt + 5) - pt * 0.04f; + skew *= skew; + glRotatef((_tick + a) * multiplier, 0, 1, 1); + glScalef(1 / skew, 1, 1); + glRotatef(-(_tick + a) * multiplier, 0, 1, 1); + } + + + moveCameraToPlayer(a); + + 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); + } +} + +void GameRenderer::renderItemInHand(float a, int eye) +{ + if (cameraFlip > 0) return; + + // 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 ) renderHand = false; + } + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + + 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) + { + glTranslatef((float) zoom_x, (float) -zoom_y, 0); + glScaled(zoom, zoom, 1); + } + gluPerspective(fov, aspect, 0.05f, renderDistance * 2); + + if (mc->gameMode->isCutScene()) + { + float s = 1 / 1.5f; + glScalef(1, s, 1); + } + + glMatrixMode(GL_MODELVIEW); + + glLoadIdentity(); + if (mc->options->anaglyph3d) glTranslatef((eye * 2 - 1) * 0.10f, 0, 0); + + glPushMatrix(); + bobHurt(a); + + // 4J-PB - changing this to be per player + //if (mc->options->bobView) bobView(a); + bool bNoLegAnim =(localplayer->getAnimOverrideBitmask()&( (1<GetXboxPad(),eGameSetting_ViewBob) && !localplayer->abilities.flying && !bNoLegAnim) bobView(a); + + // 4J: Skip hand rendering if render hand is off + if (renderHand) + { + // 4J-PB - changing this to be per player + //if (!mc->options->thirdPersonView && !mc->cameraTargetPlayer->isSleeping()) + if (!localplayer->ThirdPersonView() && !mc->cameraTargetPlayer->isSleeping()) + { + 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()) + { + 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); +} + +// 4J - change brought forward from 1.8.2 +void GameRenderer::turnOffLightLayer(double alpha) +{ // 4J - TODO +#if 0 + if (SharedConstants::TEXTURE_LIGHTING) + { + glClientActiveTexture(GL_TEXTURE1); + glActiveTexture(GL_TEXTURE1); + glDisable(GL_TEXTURE_2D); + glClientActiveTexture(GL_TEXTURE0); + glActiveTexture(GL_TEXTURE0); + } +#endif + RenderManager.TextureBindVertex(-1); +} + +// 4J - change brought forward from 1.8.2 +void GameRenderer::turnOnLightLayer(double alpha) +{ // 4J - TODO +#if 0 + if (SharedConstants::TEXTURE_LIGHTING) + { + glClientActiveTexture(GL_TEXTURE1); + glActiveTexture(GL_TEXTURE1); + glMatrixMode(GL_TEXTURE); + glLoadIdentity(); + // float s = 1 / 16f / 15.0f*16/14.0f; + float s = 1 / 16.0f / 15.0f * 15 / 16; + glScalef(s, s, s); + glTranslatef(8f, 8f, 8f); + glMatrixMode(GL_MODELVIEW); + + mc->textures->bind(lightTexture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + glColor4f(1, 1, 1, 1); + glEnable(GL_TEXTURE_2D); + glClientActiveTexture(GL_TEXTURE0); + glActiveTexture(GL_TEXTURE0); + } +#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_MAG_FILTER, GL_LINEAR); + 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; +} + +void GameRenderer::updateLightTexture(float a) +{ + // 4J-JEV: Now doing light textures on PER PLAYER basis. + // 4J - we *had* added separate light textures for all dimensions, and this loop to update them all here + for(int j = 0; j < XUSER_MAX_COUNT; j++ ) + { + // Loop over all the players + shared_ptr player = Minecraft::GetInstance()->localplayers[j]; + if (player == NULL) continue; + + Level *level = player->level; // 4J - was mc->level when it was just to update the one light texture + + float skyDarken1 = level->getSkyDarken((float) 1); + for (int i = 0; i < 256; i++) + { + float darken = skyDarken1 * 0.95f + 0.05f; + float sky = level->dimension->brightnessRamp[i / 16] * darken; + float block = level->dimension->brightnessRamp[i % 16] * (blr * 0.1f + 1.5f); + + if (level->skyFlashTime > 0) + { + sky = level->dimension->brightnessRamp[i / 16]; + } + + float rs = sky * (skyDarken1 * 0.65f + 0.35f); + float gs = sky * (skyDarken1 * 0.65f + 0.35f); + float bs = sky; + + float rb = block; + float gb = block * ((block * 0.6f + 0.4f) * 0.6f + 0.4f); + float bb = block * ((block * block) * 0.6f + 0.4f); + + float _r = (rs + rb); + float _g = (gs + gb); + float _b = (bs + bb); + + _r = _r * 0.96f + 0.03f; + _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); + _g = (0.28f + gb * 0.75f); + _b = (0.25f + bb * 0.75f); + } + + if (player->hasEffect(MobEffect::nightVision)) + { + float scale = getNightVisionScale(player, a); + { + float dist = 1.0f / _r; + if (dist > (1.0f / _g)) + { + dist = (1.0f / _g); + } + if (dist > (1.0f / _b)) + { + dist = (1.0f / _b); + } + _r = _r * (1.0f - scale) + (_r * dist) * scale; + _g = _g * (1.0f - scale) + (_g * dist) * scale; + _b = _b * (1.0f - scale) + (_b * dist) * scale; + } + } + + 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; + ir = 1 - (ir * ir * ir * ir); + ig = 1 - (ig * ig * ig * ig); + ib = 1 - (ib * ib * ib * ib); + _r = _r * (1 - brightness) + ir * brightness; + _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; + if (_r < 0) _r = 0; + if (_g < 0) _g = 0; + if (_b < 0) _b = 0; + + 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] = alpha << 24 | b << 16 | g << 8 | r; +#elif ( defined _XBOX || defined __ORBIS__ ) + lightPixels[j][i] = alpha << 24 | r << 16 | g << 8 | b; +#else + 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; + } +} + +float GameRenderer::getNightVisionScale(shared_ptr player, float a) +{ + int duration = player->getEffect(MobEffect::nightVision)->getDuration(); + if (duration > (SharedConstants::TICKS_PER_SECOND * 10)) + { + return 1.0f; + } + else + { + float flash = max(0.0f, (float)duration - a); + return .7f + Mth::sin(flash * PI * .05f) * .3f; // was: .7 + sin(flash*pi*0.2) * .3 + } +} + +// 4J added, so we can have a light texture for each player to support split screen +int GameRenderer::getLightTexture(int iPad, Level *level) +{ + // Turn the current dimenions id into an index from 0 to 2 + // int idx = level->dimension->id; + // if( idx == -1 ) idx = 2; + + return lightTexture[iPad]; // 4J-JEV: Changing to Per Player lighting textures. +} + +void GameRenderer::render(float a, bool bFirst) +{ + if( _updateLightTexture && bFirst) updateLightTexture(a); + if (Display::isActive()) + { + lastActiveTime = System::currentTimeMillis(); + } + else + { + if (System::currentTimeMillis() - lastActiveTime > 500) + { + mc->pauseGame(); + } + } + +#if 0 // 4J - TODO + if (mc->mouseGrabbed && focused) { + mc->mouseHandler.poll(); + + float ss = mc->options->sensitivity * 0.6f + 0.2f; + float sens = (ss * ss * ss) * 8; + float xo = mc->mouseHandler.xd * sens; + float yo = mc->mouseHandler.yd * sens; + + int yAxis = 1; + if (mc->options->invertYMouse) yAxis = -1; + + if (mc->options->smoothCamera) { + + xo = smoothTurnX.getNewDeltaValue(xo, .05f * sens); + yo = smoothTurnY.getNewDeltaValue(yo, .05f * sens); + + } + + mc->player.turn(xo, yo * yAxis); + } +#endif + + if (mc->noRender) return; + GameRenderer::anaglyph3d = mc->options->anaglyph3d; + + glViewport(0, 0, mc->width, mc->height); // 4J - added + ScreenSizeCalculator ssc(mc->options, mc->width, mc->height); + int screenWidth = ssc.getWidth(); + int screenHeight = ssc.getHeight(); + int xMouse = Mouse::getX() * screenWidth / mc->width; + int yMouse = screenHeight - Mouse::getY() * screenHeight / mc->height - 1; + + int maxFps = getFpsCap(mc->options->framerateLimit); + + if (mc->level != NULL) + { + if (mc->options->framerateLimit == 0) + { + renderLevel(a, 0); + } + else + { + renderLevel(a, lastNsTime + 1000000000 / maxFps); + } + + lastNsTime = System::nanoTime(); + + + if (!mc->options->hideGui || mc->screen != NULL) + { + mc->gui->render(a, mc->screen != NULL, xMouse, yMouse); + } + } + else + { + glViewport(0, 0, mc->width, mc->height); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + setupGuiScreen(); + + lastNsTime = System::nanoTime(); + } + + + if (mc->screen != NULL) + { + glClear(GL_DEPTH_BUFFER_BIT); + mc->screen->render(xMouse, yMouse, a); + if (mc->screen != NULL && mc->screen->particles != NULL) mc->screen->particles->render(a); + } + +} + +void GameRenderer::renderLevel(float a) +{ + renderLevel(a, 0); +} + +#ifdef MULTITHREAD_ENABLE +// Request that an item be deleted, when it is safe to do so +void GameRenderer::AddForDelete(byte *deleteThis) +{ + EnterCriticalSection(&m_csDeleteStack); + m_deleteStackByte.push_back(deleteThis); +} + +void GameRenderer::AddForDelete(SparseLightStorage *deleteThis) +{ + EnterCriticalSection(&m_csDeleteStack); + m_deleteStackSparseLightStorage.push_back(deleteThis); +} + +void GameRenderer::AddForDelete(CompressedTileStorage *deleteThis) +{ + EnterCriticalSection(&m_csDeleteStack); + m_deleteStackCompressedTileStorage.push_back(deleteThis); +} + +void GameRenderer::AddForDelete(SparseDataStorage *deleteThis) +{ + EnterCriticalSection(&m_csDeleteStack); + m_deleteStackSparseDataStorage.push_back(deleteThis); +} + +void GameRenderer::FinishedReassigning() +{ + LeaveCriticalSection(&m_csDeleteStack); +} + +int GameRenderer::runUpdate(LPVOID lpParam) +{ + Minecraft *minecraft = Minecraft::GetInstance(); + Vec3::CreateNewThreadStorage(); + AABB::CreateNewThreadStorage(); + IntCache::CreateNewThreadStorage(); + Tesselator::CreateNewThreadStorage(1024*1024); + Compression::UseDefaultThreadStorage(); + RenderManager.InitialiseContext(); +#ifdef _LARGE_WORLDS + Chunk::CreateNewThreadStorage(); +#endif + Tile::CreateNewThreadStorage(); + + ShutdownManager::HasStarted(ShutdownManager::eRenderChunkUpdateThread,m_updateEvents); + while(ShutdownManager::ShouldRun(ShutdownManager::eRenderChunkUpdateThread)) + { + //m_updateEvents->Clear(eUpdateEventIsFinished); + //m_updateEvents->WaitForSingle(eUpdateCanRun,INFINITE); + // 4J Stu - We Need to have this happen atomically to avoid deadlocks + m_updateEvents->WaitForAll(INFINITE); + + if( !ShutdownManager::ShouldRun(ShutdownManager::eRenderChunkUpdateThread) ) + { + break; + } + + m_updateEvents->Set(eUpdateCanRun); + + // 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 + // Now limiting maximum number of updates that can be deferred as have noticed that with redstone clock circuits, it is possible to create + // things that need constant updating, so if you stand near them, the render data Never gets updated and the game just keeps going until it runs out of render memory... + int count = 0; + static const int MAX_DEFERRED_UPDATES = 10; + bool shouldContinue = false; + do + { + shouldContinue = minecraft->levelRenderer->updateDirtyChunks(); + count++; + } while ( shouldContinue && count < MAX_DEFERRED_UPDATES ); + + // 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 + // flags to say that this deferred chunk is over and they are actually safe to be removed now + minecraft->levelRenderer->fullyFlagRenderableTileEntitiesToBeRemoved(); + + // We've got stacks for things that can only safely be deleted whilst this thread isn't updating things - delete those things now + EnterCriticalSection(&m_csDeleteStack); + for(unsigned int i = 0; i < m_deleteStackByte.size(); i++ ) + { + delete m_deleteStackByte[i]; + } + m_deleteStackByte.clear(); + for(unsigned int i = 0; i < m_deleteStackSparseLightStorage.size(); i++ ) + { + delete m_deleteStackSparseLightStorage[i]; + } + m_deleteStackSparseLightStorage.clear(); + for(unsigned int i = 0; i < m_deleteStackCompressedTileStorage.size(); i++ ) + { + delete m_deleteStackCompressedTileStorage[i]; + } + m_deleteStackCompressedTileStorage.clear(); + for(unsigned int i = 0; i < m_deleteStackSparseDataStorage.size(); i++ ) + { + delete m_deleteStackSparseDataStorage[i]; + } + m_deleteStackSparseDataStorage.clear(); + LeaveCriticalSection(&m_csDeleteStack); + + // PIXEndNamedEvent(); + + AABB::resetPool(); + Vec3::resetPool(); + IntCache::Reset(); + m_updateEvents->Set(eUpdateEventIsFinished); + } + + ShutdownManager::HasFinished(ShutdownManager::eRenderChunkUpdateThread); + return 0; +} +#endif + +void GameRenderer::EnableUpdateThread() +{ + // #ifdef __PS3__ // MGH - disable the update on PS3 for now + // return; + // #endif +#ifdef MULTITHREAD_ENABLE + if( updateRunning) return; + app.DebugPrintf("------------------EnableUpdateThread--------------------\n"); + updateRunning = true; + m_updateEvents->Set(eUpdateCanRun); + m_updateEvents->Set(eUpdateEventIsFinished); +#endif +} + +void GameRenderer::DisableUpdateThread() +{ + // #ifdef __PS3__ // MGH - disable the update on PS3 for now + // return; + // #endif +#ifdef MULTITHREAD_ENABLE + if( !updateRunning) return; + app.DebugPrintf("------------------DisableUpdateThread--------------------\n"); + updateRunning = false; + m_updateEvents->Clear(eUpdateCanRun); + m_updateEvents->WaitForSingle(eUpdateEventIsFinished,INFINITE); +#endif +} + +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 + + glEnable(GL_CULL_FACE); + glEnable(GL_DEPTH_TEST); + + // Is this the primary player? Only do the updating of chunks if it is. This controls the creation of render data for each chunk - all of this we are only + // 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 + { + mc->cameraTargetPlayer = mc->player; + } + pick(a); + + shared_ptr cameraEntity = mc->cameraTargetPlayer; + LevelRenderer *levelRenderer = mc->levelRenderer; + ParticleEngine *particleEngine = mc->particleEngine; + double xOff = cameraEntity->xOld + (cameraEntity->x - cameraEntity->xOld) * a; + double yOff = cameraEntity->yOld + (cameraEntity->y - cameraEntity->yOld) * a; + double zOff = cameraEntity->zOld + (cameraEntity->z - cameraEntity->zOld) * a; + + for (int i = 0; i < 2; i++) + { + if (mc->options->anaglyph3d) + { + GameRenderer::anaglyphPass = i; + if (GameRenderer::anaglyphPass == 0) glColorMask(false, true, true, false); + else glColorMask(true, false, false, false); + } + + + glViewport(0, 0, mc->width, mc->height); + setupClearColor(a); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glEnable(GL_CULL_FACE); + + setupCamera(a, i); + Camera::prepare(mc->player, mc->player->ThirdPersonView() == 2); + + Frustum::getFrustum(); + if (mc->options->viewDistance < 2) + { + setupFog(-1, a); + levelRenderer->renderSky(a); + if(mc->skins->getSelected()->getId() == 1026 ) levelRenderer->renderHaloRing(a); + } + glEnable(GL_FOG); + setupFog(1, a); + + if (mc->options->ambientOcclusion) + { + GL11::glShadeModel(GL11::GL_SMOOTH); + } + + PIXBeginNamedEvent(0,"Culling"); + MemSect(31); + // Culler *frustum = new FrustumCuller(); + FrustumCuller frustObj; + Culler *frustum = &frustObj; + MemSect(0); + frustum->prepare(xOff, yOff, zOff); + + mc->levelRenderer->cull(frustum, a); + PIXEndNamedEvent(); + +#ifndef MULTITHREAD_ENABLE + if ( (i == 0) && updateChunks ) // 4J - added updateChunks condition + { + int PIXPass = 0; + PIXBeginNamedEvent(0,"Updating dirty chunks"); + do + { + PIXBeginNamedEvent(0,"Updating dirty chunks pass %d",PIXPass++); + bool retval = mc->levelRenderer->updateDirtyChunks(cameraEntity, false); + PIXEndNamedEvent(); + if( retval ) break; + + + if (until == 0) break; + + __int64 diff = until - System::nanoTime(); + if (diff < 0) break; + if (diff > 1000000000) break; + } while (true); + 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(&TextureAtlas::LOCATION_BLOCKS); // 4J was L"/terrain.png" + MemSect(0); + Lighting::turnOff(); + PIXBeginNamedEvent(0,"Level render"); + levelRenderer->render(cameraEntity, 0, a, updateChunks); + PIXEndNamedEvent(); + + GL11::glShadeModel(GL11::GL_FLAT); + + if (cameraFlip == 0 ) + { + Lighting::turnOn(); + PIXBeginNamedEvent(0,"Entity render"); + // 4J - for entities, don't include the "a" factor that interpolates from the old to new position, as the AABBs for the entities are already fully at the new position + // This fixes flickering minecarts, and pigs that you are riding on + frustum->prepare(cameraEntity->x,cameraEntity->y,cameraEntity->z); + // 4J Stu - When rendering entities, in the end if the dragon is hurt or we have a lot of entities we can end up wrapping + // our index into the temp Vec3 cache and overwrite the one that was storing the camera position + // Fix for #77745 - TU9: Content: Gameplay: Items and mobs not belonging to end world are disappearing when Enderdragon is damaged. + Vec3 *cameraPosTemp = cameraEntity->getPos(a); + cameraPos->x = cameraPosTemp->x; + cameraPos->y = cameraPosTemp->y; + cameraPos->z = cameraPosTemp->z; + levelRenderer->renderEntities(cameraPos, frustum, a); +#ifdef __PSVITA__ + // AP - make sure we're using the Alpha cut out effect for particles + glEnable(GL_ALPHA_TEST); +#endif + PIXEndNamedEvent(); + PIXBeginNamedEvent(0,"Particle render"); + turnOnLightLayer(a); // 4J - brought forward from 1.8.2 + particleEngine->renderLit(cameraEntity, a, ParticleEngine::OPAQUE_LIST); + Lighting::turnOff(); + setupFog(0, a); + particleEngine->render(cameraEntity, a, ParticleEngine::OPAQUE_LIST); + PIXEndNamedEvent(); + turnOffLightLayer(a); // 4J - brought forward from 1.8.2 + + if ( (mc->hitResult != NULL) && cameraEntity->isUnderLiquid(Material::water) && cameraEntity->instanceof(eTYPE_PLAYER) ) //&& !mc->options.hideGui) + { + shared_ptr player = dynamic_pointer_cast(cameraEntity); + glDisable(GL_ALPHA_TEST); + levelRenderer->renderHit(player, mc->hitResult, 0, player->inventory->getSelected(), a); + glEnable(GL_ALPHA_TEST); + } + } + + 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(&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 + // to achieve the same effect. + if (true) // (mc->options->fancyGraphics) + { + if (mc->options->ambientOcclusion) + { + GL11::glShadeModel(GL11::GL_SMOOTH); + } + + glBlendFunc(GL_ZERO, GL_ONE); + PIXBeginNamedEvent(0,"Fancy second pass - writing z"); + int visibleWaterChunks = levelRenderer->render(cameraEntity, 1, a, updateChunks); + PIXEndNamedEvent(); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + if (visibleWaterChunks > 0) + { + PIXBeginNamedEvent(0,"Fancy second pass - actual rendering"); + levelRenderer->render(cameraEntity, 1, a, updateChunks); // 4J - chanaged, used to be renderSameAsLast but we don't support that anymore + PIXEndNamedEvent(); + } + + GL11::glShadeModel(GL11::GL_FLAT); + } + else + { + PIXBeginNamedEvent(0,"Second pass level render"); + levelRenderer->render(cameraEntity, 1, a, updateChunks); + 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) && 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->renderHitOutline(player, mc->hitResult, 0, a); + glEnable(GL_ALPHA_TEST); + } + } + + /* 4J - moved rain rendering to after clouds so that it alpha blends onto them properly + PIXBeginNamedEvent(0,"Rendering snow and rain"); + renderSnowAndRain(a); + PIXEndNamedEvent(); + glDisable(GL_FOG); + */ + + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE); + levelRenderer->renderDestroyAnimation(Tesselator::getInstance(), dynamic_pointer_cast(cameraEntity), a); + glDisable(GL_BLEND); + + if (cameraEntity->y >= Level::genDepth) + { + prepareAndRenderClouds(levelRenderer, a); + } + + // 4J - rain rendering moved here so that it renders after clouds & can blend properly onto them + setupFog(0, a); + glEnable(GL_FOG); + PIXBeginNamedEvent(0,"Rendering snow and rain"); + renderSnowAndRain(a); + PIXEndNamedEvent(); + glDisable(GL_FOG); + + + if (zoom == 1) + { + glClear(GL_DEPTH_BUFFER_BIT); + renderItemInHand(a, i); + } + + + if (!mc->options->anaglyph3d) + { + return; + } + } + 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); + + if (!mc->options->fancyGraphics) rainLevel /= 2; + if (rainLevel == 0) return; + + rainLevel /= ( mc->levelRenderer->activePlayers() + 1 ); + + random->setSeed(_tick * 312987231l); + shared_ptr player = mc->cameraTargetPlayer; + Level *level = mc->level; + + int x0 = Mth::floor(player->x); + int y0 = Mth::floor(player->y); + int z0 = Mth::floor(player->z); + + int r = 10; + + double rainPosX = 0; + double rainPosY = 0; + double rainPosZ = 0; + int rainPosSamples = 0; + + int rainCount = (int) (100 * rainLevel * rainLevel); + if (mc->options->particles == 1) + { + rainCount >>= 1; + } else if (mc->options->particles == 2) + { + 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); + int y = level->getTopRainBlock(x, z); + int t = level->getTile(x, y - 1, z); + Biome *biome = level->getBiome(x,z); + if (y <= y0 + r && y >= y0 - r && biome->hasRain() && biome->getTemperature() >= 0.2f) + { + float xa = random->nextFloat(); + float za = random->nextFloat(); + if (t > 0) + { + if (Tile::tiles[t]->material == Material::lava) + { + mc->particleEngine->add( shared_ptr( new SmokeParticle(level, x + xa, y + 0.1f - Tile::tiles[t]->getShapeY0(), z + za, 0, 0, 0) ) ); + } + else + { + if (random->nextInt(++rainPosSamples) == 0) + { + rainPosX = x + xa; + rainPosY = y + 0.1f - Tile::tiles[t]->getShapeY0(); + rainPosZ = z + za; + } + mc->particleEngine->add( shared_ptr( new WaterDropParticle(level, x + xa, y + 0.1f - Tile::tiles[t]->getShapeY0(), z + za) ) ); + } + } + } + } + + + if (rainPosSamples > 0 && random->nextInt(3) < rainSoundTime++) + { + rainSoundTime = 0; + MemSect(24); + if (rainPosY > player->y + 1 && level->getTopRainBlock(Mth::floor(player->x), Mth::floor(player->z)) > Mth::floor(player->y)) + { + mc->level->playLocalSound(rainPosX, rainPosY, rainPosZ, eSoundType_AMBIENT_WEATHER_RAIN, 0.1f, 0.5f); + } + else + { + mc->level->playLocalSound(rainPosX, rainPosY, rainPosZ, eSoundType_AMBIENT_WEATHER_RAIN, 0.2f, 1.0f); + } + MemSect(0); + } + +} + +// 4J - this whole function updated from 1.8.2 +void GameRenderer::renderSnowAndRain(float a) +{ + float rainLevel = mc->level->getRainLevel(a); + if (rainLevel <= 0) return; + + // 4J - rain is relatively low poly, but high fill-rate - better to clip it + RenderManager.StateSetEnableViewportClipPlanes(true); + + turnOnLightLayer(a); + + if (rainXa == NULL) + { + rainXa = new float[32 * 32]; + rainZa = new float[32 * 32]; + + for (int z = 0; z < 32; z++) + { + 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; + } + } + } + + shared_ptr player = mc->cameraTargetPlayer; + Level *level = mc->level; + + int x0 = Mth::floor(player->x); + int y0 = Mth::floor(player->y); + int z0 = Mth::floor(player->z); + + Tesselator *t = Tesselator::getInstance(); + glDisable(GL_CULL_FACE); + glNormal3f(0, 1, 0); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glAlphaFunc(GL_GREATER, 0.01f); + + MemSect(31); + mc->textures->bindTexture(&SNOW_LOCATION); // 4J was L"/environment/snow.png" + MemSect(0); + + double xo = player->xOld + (player->x - player->xOld) * a; + double yo = player->yOld + (player->y - player->yOld) * a; + double zo = player->zOld + (player->z - player->zOld) * a; + + int yMin = Mth::floor(yo); + + + int r = 5; + // 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; + } + + // 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); + + 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; + + // 4J - changes here brought forward from 1.8.2 + Biome *b = level->getBiome(x, z); + if (!b->hasRain() && !b->hasSnow()) continue; + + int floor = level->getTopRainBlock(x, z); + + int yy0 = y0 - r; + int yy1 = y0 + r; + + if (yy0 < floor) yy0 = floor; + if (yy1 < floor) yy1 = floor; + float s = 1; + + int yl = floor; + if (yl < yMin) yl = yMin; + + if (yy0 != yy1) + { + random->setSeed((x * x * 3121 + x * 45238971) ^ (z * z * 418711 + z * 13761)); + + // 4J - changes here brought forward from 1.8.2 + float temp = b->getTemperature(); + if (level->getBiomeSource()->scaleTemp(temp, floor) >= 0.15f) + { + if (mode != 0) + { + 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()); + + double xd = (x + 0.5f) - player->x; + 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); +#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); +#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->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, 0 * s, yy1 * s / 4.0f + ra * s); +#endif + t->offset(0, 0, 0); + t->end(); + } + else + { + if (mode != 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); +#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); +#endif + t->offset(0, 0, 0); + } + } + } + + if( mode >= 0 ) t->end(); + glEnable(GL_CULL_FACE); + glDisable(GL_BLEND); + glAlphaFunc(GL_GREATER, 0.1f); + turnOffLightLayer(a); + + RenderManager.StateSetEnableViewportClipPlanes(false); +} + +// 4J - added forceScale parameter +void GameRenderer::setupGuiScreen(int forceScale /*=-1*/) +{ + ScreenSizeCalculator ssc(mc->options, mc->width, mc->height, forceScale); + + glClear(GL_DEPTH_BUFFER_BIT); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho(0, (float)ssc.rawWidth, (float)ssc.rawHeight, 0, 1000, 3000); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glTranslatef(0, 0, -2000); +} + +void GameRenderer::setupClearColor(float a) +{ + Level *level = mc->level; + shared_ptr player = mc->cameraTargetPlayer; + + float whiteness = 1.0f / (4 - mc->options->viewDistance); + whiteness = 1 - (float) pow((double)whiteness, 0.25); + + Vec3 *skyColor = level->getSkyColor(mc->cameraTargetPlayer, a); + float sr = (float) skyColor->x; + float sg = (float) skyColor->y; + float sb = (float) skyColor->z; + + Vec3 *fogColor = level->getFogColor(a); + fr = (float) fogColor->x; + fg = (float) fogColor->y; + fb = (float) fogColor->z; + + 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 *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; + } + } + } + + fr += (sr - fr) * whiteness; + fg += (sg - fg) * whiteness; + fb += (sb - fb) * whiteness; + + float rainLevel = level->getRainLevel(a); + if (rainLevel > 0) + { + float ba = 1 - rainLevel * 0.5f; + float bb = 1 - rainLevel * 0.4f; + fr *= ba; + fg *= ba; + fb *= bb; + } + float thunderLevel = level->getThunderLevel(a); + if (thunderLevel > 0) + { + float ba = 1 - thunderLevel * 0.5f; + fr *= ba; + fg *= ba; + fb *= ba; + } + + int t = Camera::getBlockAt(mc->level, player, a); + if (isInClouds) + { + Vec3 *cc = level->getCloudColor(a); + fr = (float) cc->x; + fg = (float) cc->y; + fb = (float) cc->z; + } + 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 + 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); + byte blueComponent = ((colour)&0xFF); + + fr = (float)redComponent/256;//0.6f; + fg = (float)greenComponent/256;//0.1f; + fb = (float)blueComponent/256;//0.00f; + } + + float brr = fogBrO + (fogBr - fogBrO) * a; + fr *= brr; + fg *= brr; + fb *= brr; + + 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)) + { + int duration = player->getEffect(MobEffect::blindness)->getDuration(); + if (duration < 20) + { + yy = yy * (1.0f - (float) duration / 20.0f); + } + else + { + yy = 0; + } + } + + if (yy < 1) + { + 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)) + { + float scale = getNightVisionScale(mc->player, a); + { + float dist = FLT_MAX; // MGH - changed this to avoid divide by zero + if ( (fr > 0) && (dist > (1.0f / fr)) ) + { + dist = (1.0f / fr); + } + if ( (fg > 0) && (dist > (1.0f / fg)) ) + { + dist = (1.0f / fg); + } + if ( (fb > 0) && (dist > (1.0f / fb)) ) + { + dist = (1.0f / fb); + } + fr = fr * (1.0f - scale) + (fr * dist) * scale; + fg = fg * (1.0f - scale) + (fg * dist) * scale; + fb = fb * (1.0f - scale) + (fb * dist) * scale; + } + } + + if (mc->options->anaglyph3d) + { + float frr = (fr * 30 + fg * 59 + fb * 11) / 100; + float fgg = (fr * 30 + fg * 70) / (100); + float fbb = (fr * 30 + fb * 70) / (100); + + fr = frr; + fg = fgg; + fb = fbb; + } + + glClearColor(fr, fg, fb, 0.0f); + +} + +void GameRenderer::setupFog(int i, float alpha) +{ + shared_ptr player = mc->cameraTargetPlayer; + + // 4J - check for creative mode brought forward from 1.2.3 + bool creative = false; + if ( player->instanceof(eTYPE_PLAYER) ) + { + creative = (dynamic_pointer_cast(player))->abilities.instabuild; + } + + 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); + + if (GLContext.getCapabilities().GL_NV_fog_distance) { + glFogi(NVFogDistance.GL_FOG_DISTANCE_MODE_NV, NVFogDistance.GL_EYE_RADIAL_NV); + } + + glFogf(GL_FOG_START, 0); + */ + 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); + + if (player->hasEffect(MobEffect::blindness)) + { + 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); + } + + glFogi(GL_FOG_MODE, GL_LINEAR); + if (i < 0) + { + 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 - TODO investigate implementing this + // 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 + } + else if (t > 0 && Tile::tiles[t]->material == Material::water) + { + glFogi(GL_FOG_MODE, GL_EXP); + if (player->hasEffect(MobEffect::waterBreathing)) + { + glFogf(GL_FOG_DENSITY, 0.05f); // was 0.06 + } + else + { + 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 + } + else + { + float distance = renderDistance; + if (!mc->level->dimension->hasCeiling) + { + // 4J - test for doing bedrockfog brought forward from 1.2.3 + if (mc->level->dimension->hasBedrockFog() && !creative) + { + double yy = ((player->getLightColor(alpha) & 0xf00000) >> 20) / 16.0 + (player->yOld + (player->y - player->yOld) * alpha + 4) / 32; + if (yy < 1) + { + if (yy < 0) yy = 0; + yy = yy * yy; + float dist = 100 * (float) yy; + if (dist < 5) dist = 5; + if (distance > dist) distance = dist; + } + } + } + + glFogi(GL_FOG_MODE, GL_LINEAR); + glFogf(GL_FOG_START, distance * 0.25f); + glFogf(GL_FOG_END, distance); + if (i < 0) + { + 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); + } + */ + + if (mc->level->dimension->isFoggyAt((int) player->x, (int) player->z)) + { + glFogf(GL_FOG_START, distance * 0.05f); + glFogf(GL_FOG_END, min(distance, 16 * 16 * .75f) * .5f); + } + } + + glEnable(GL_COLOR_MATERIAL); + glColorMaterial(GL_FRONT, GL_AMBIENT); + +} + +FloatBuffer *GameRenderer::getBuffer(float a, float b, float c, float d) +{ + lb->clear(); + lb->put(a)->put(b)->put(c)->put(d); + lb->flip(); + return lb; +} + +int GameRenderer::getFpsCap(int option) +{ + int maxFps = 200; + if (option == 1) maxFps = 120; + if (option == 2) maxFps = 35; + return maxFps; +} + +void GameRenderer::updateAllChunks() +{ + // mc->levelRenderer->updateDirtyChunks(mc->cameraTargetPlayer, true); +} diff --git a/Minecraft.Client/GameRenderer.h b/Minecraft.Client/GameRenderer.h new file mode 100644 index 00000000..1db7713a --- /dev/null +++ b/Minecraft.Client/GameRenderer.h @@ -0,0 +1,180 @@ +#pragma once +class Minecraft; +class Entity; +class Random; +class FloatBuffer; +class ItemInHandRenderer; +class DataLayer; +class SparseLightStorage; +class CompressedTileStorage; +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; + +private: + Minecraft *mc; + float renderDistance; +public: + ItemInHandRenderer *itemInHandRenderer; +private: + int _tick; + shared_ptr hovered; + + // smooth camera movement + SmoothFloat smoothTurnX; + SmoothFloat smoothTurnY; + + // third-person distance etc + SmoothFloat smoothDistance; + SmoothFloat smoothRotation; + SmoothFloat smoothTilt; + SmoothFloat smoothRoll; + float thirdDistance; + float thirdDistanceO; + float thirdRotation; + float thirdRotationO; + float thirdTilt; + float thirdTiltO; + float accumulatedSmoothXO, accumulatedSmoothYO; + float tickSmoothXO, tickSmoothYO, lastTickA; + Vec3 *cameraPos; // 4J added + + // fov modification + float fovOffset; + float fovOffsetO; + + // roll modification + float cameraRoll; + float cameraRollO; + + // 4J - changes brought forward from 1.8.2 + static const int NUM_LIGHT_TEXTURES = 4;// * 3; + int lightTexture[NUM_LIGHT_TEXTURES]; // 4J - changed so that we have one lightTexture per level, to support split screen + int getLightTexture(int iPad, Level *level); // 4J added + intArray lightPixels[NUM_LIGHT_TEXTURES]; + + float fov[4]; + float oFov[4]; + float tFov[4]; + + float darkenWorldAmount; + float darkenWorldAmountO; + + bool isInClouds; + + float m_fov; +public: + GameRenderer(Minecraft *mc); + ~GameRenderer(); + void SetFovVal(float fov); + float GetFovVal(); + +public: + void tick(bool bFirst); + void pick(float a); +private: + void tickFov(); + float getFov(float a, bool applyEffects); + void bobHurt(float a); + void bobView(float a); + void moveCameraToPlayer(float a); + double zoom; + double zoom_x; + double zoom_y; +public: + void zoomRegion(double zoom, double xa, double ya); + void unZoomRegion(); +private: + void getFovAndAspect(float& fov, float& aspect, float a, bool applyEffects); // 4J added +public: + void setupCamera(float a, int eye); +private: + void renderItemInHand(float a, int eye); + __int64 lastActiveTime; + __int64 lastNsTime; + // 4J - changes brought forward from 1.8.2 + bool _updateLightTexture; +public: + float blr; + float blrt; + float blg; + float blgt; + void turnOffLightLayer(double alpha); + void turnOnLightLayer(double alpha); +private: + void tickLightTexture(); + void updateLightTexture(float a); + float getNightVisionScale(shared_ptr player, float a); +public: + void render(float a, bool bFirst); // 4J added bFirst + void renderLevel(float a); + void renderLevel(float a, __int64 until); +private: + Random *random; + int rainSoundTime; + void prepareAndRenderClouds(LevelRenderer *levelRenderer, float a); + void tickRain(); +private: + // 4J - brought forward from 1.8.2 + float *rainXa; + float *rainZa; +protected: + void renderSnowAndRain(float a); + volatile int xMod; + volatile int yMod; +public: + void setupGuiScreen(int forceScale=-1); // 4J - added forceScale parameter + + FloatBuffer *lb; + float fr; + float fg; + float fb; +private: + void setupClearColor(float a); + float fogBrO, fogBr; + int cameraFlip; + + void setupFog(int i, float alpha); + FloatBuffer *getBuffer(float a, float b, float c, float d); + static int getFpsCap(int option); +public: + void updateAllChunks(); + +#ifdef MULTITHREAD_ENABLE + static C4JThread* m_updateThread; + static int runUpdate(LPVOID lpParam); + static C4JThread::EventArray* m_updateEvents; + enum EUpdateEvents + { + eUpdateCanRun, + eUpdateEventIsFinished, + eUpdateEventCount, + }; + static bool nearThingsToDo; + static bool updateRunning; +#endif + static vector m_deleteStackByte; + static vector m_deleteStackSparseLightStorage; + static vector m_deleteStackCompressedTileStorage; + static vector m_deleteStackSparseDataStorage; + static CRITICAL_SECTION m_csDeleteStack; + static void AddForDelete(byte *deleteThis); + static void AddForDelete(SparseLightStorage *deleteThis); + static void AddForDelete(CompressedTileStorage *deleteThis); + static void AddForDelete(SparseDataStorage *deleteThis); + static void FinishedReassigning(); + void EnableUpdateThread(); + void DisableUpdateThread(); +}; diff --git a/Minecraft.Client/GhastModel.cpp b/Minecraft.Client/GhastModel.cpp new file mode 100644 index 00000000..14277c43 --- /dev/null +++ b/Minecraft.Client/GhastModel.cpp @@ -0,0 +1,59 @@ +#include "stdafx.h" +#include "..\Minecraft.World\Random.h" +#include "..\Minecraft.World\Mth.h" +#include "GhastModel.h" +#include "ModelPart.h" + +GhastModel::GhastModel() : Model() +{ + int yoffs = -16; + body = new ModelPart(this, 0, 0); + body->addBox(-8, -8, -8, 16, 16, 16); + body->y += (8 + 16) + yoffs; + + Random *random = new Random(1660); + for (int i = 0; i < TENTACLESLENGTH; i++) // 4J - 9 was tentacles.length + { + tentacles[i] = new ModelPart(this, 0, 0); + + float xo = (((i % 3 - (i / 3 % 2) * 0.5f + 0.25f) / 2.0f * 2 - 1) * 5); + float yo = (((i / 3) / 2.0f * 2 - 1) * 5); + int len = random->nextInt(7) + 8; + tentacles[i]->addBox(-1, 0, -1, 2, len, 2); + + tentacles[i]->x = xo; + tentacles[i]->z = yo; + tentacles[i]->y = (float)(31 + yoffs); + } + + // 4J added - compile now to avoid random performance hit first time cubes are rendered + body->compile(1.0f/16.0f); + for( int i = 0; i < TENTACLESLENGTH; i++ ) + { + tentacles[i]->compile(1.0f/16.0f); + } +} + +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 + { + tentacles[i]->xRot = 0.2f * Mth::sin(bob * 0.3f + i) + 0.4f; + } +} + +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, entity); + + glPushMatrix(); + glTranslatef(0, .6f, 0); + + body->render(scale, usecompiled); + for (int i = 0; i < TENTACLESLENGTH; i++) // 4J - 9 was tentacles.length + { + tentacles[i]->render(scale, usecompiled); + } + + glPopMatrix(); +} \ No newline at end of file diff --git a/Minecraft.Client/GhastModel.h b/Minecraft.Client/GhastModel.h new file mode 100644 index 00000000..25f7e116 --- /dev/null +++ b/Minecraft.Client/GhastModel.h @@ -0,0 +1,14 @@ +#pragma once +#include "Model.h" + +class GhastModel : public Model +{ +public: + static const int TENTACLESLENGTH=9; + ModelPart *body; + ModelPart *tentacles[TENTACLESLENGTH]; + + GhastModel(); + 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 new file mode 100644 index 00000000..cecb4eaf --- /dev/null +++ b/Minecraft.Client/GhastRenderer.cpp @@ -0,0 +1,36 @@ +#include "stdafx.h" +#include "GhastRenderer.h" +#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) +{ + shared_ptr ghast = dynamic_pointer_cast(mob); + + float ss = (ghast->oCharge+(ghast->charge-ghast->oCharge)*a)/20.0f; + if (ss<0) ss = 0; + ss = 1/(ss*ss*ss*ss*ss*2+1); + float s = (8+ss)/2; + 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 new file mode 100644 index 00000000..eb4618b1 --- /dev/null +++ b/Minecraft.Client/GhastRenderer.h @@ -0,0 +1,16 @@ +#pragma once +#include "MobRenderer.h" + +class GhastRenderer : public MobRenderer +{ +private: + static ResourceLocation GHAST_LOCATION; + static ResourceLocation GHAST_SHOOTING_LOCATION; + +public: + GhastRenderer(); + +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/GiantMobRenderer.cpp b/Minecraft.Client/GiantMobRenderer.cpp new file mode 100644 index 00000000..6b232746 --- /dev/null +++ b/Minecraft.Client/GiantMobRenderer.cpp @@ -0,0 +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) +{ + 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 new file mode 100644 index 00000000..420fbc49 --- /dev/null +++ b/Minecraft.Client/GiantMobRenderer.h @@ -0,0 +1,16 @@ +#pragma once +#include "MobRenderer.h" + +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 ResourceLocation *getTextureLocation(shared_ptr mob); +}; \ No newline at end of file diff --git a/Minecraft.Client/Gui.cpp b/Minecraft.Client/Gui.cpp new file mode 100644 index 00000000..2db0c83c --- /dev/null +++ b/Minecraft.Client/Gui.cpp @@ -0,0 +1,1588 @@ +#include "stdafx.h" +#include "Gui.h" +#include "ItemRenderer.h" +#include "GameRenderer.h" +#include "Options.h" +#include "MultiplayerLocalPlayer.h" +#include "Textures.h" +#include "TextureAtlas.h" +#include "GameMode.h" +#include "Lighting.h" +#include "ChatScreen.h" +#include "MultiPlayerLevel.h" +#include "..\Minecraft.World\JavaMath.h" +#include "..\Minecraft.World\net.minecraft.world.entity.player.h" +#include "..\Minecraft.World\net.minecraft.world.effect.h" +#include "..\Minecraft.World\net.minecraft.world.food.h" +#include "..\Minecraft.World\net.minecraft.world.item.h" +#include "..\Minecraft.World\net.minecraft.world.level.h" +#include "..\Minecraft.World\LevelData.h" +#include "..\Minecraft.World\net.minecraft.world.level.tile.h" +#include "..\Minecraft.World\System.h" +#include "..\Minecraft.World\Language.h" +#include "EntityRenderDispatcher.h" +#include "..\Minecraft.World\Dimension.h" +#include "..\Minecraft.World\net.minecraft.world.entity.boss.enderdragon.h" +#include "EnderDragonRenderer.h" +#include "..\Minecraft.World\net.minecraft.h" +#include "..\Minecraft.World\net.minecraft.world.h" +#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 +//#define RENDER_HUD 1 +//#endif + +float Gui::currentGuiBlendFactor = 1.0f; // 4J added +float Gui::currentGuiScaleFactor = 1.0f; // 4J added +ItemRenderer *Gui::itemRenderer = new ItemRenderer(); + +Gui::Gui(Minecraft *minecraft) +{ + // 4J - initialisers added + random = new Random(); + tickCount = 0; + overlayMessageTime = 0; + animateOverlayMessageColor = false; + progress = 0.0f; + tbr = 1.0f; + fAlphaIncrementPerCent=255.0f/100.0f; + + this->minecraft = minecraft; + + lastTickA = 0.0f; +} + +void Gui::render(float a, bool mouseFree, int xMouse, int yMouse) +{ + // 4J Stu - I have copied this code for XUI_BaseScene. If/when it gets changed it should be broken out + // 4J - altered to force full screen mode to 3X scaling, and any split screen modes to 2X scaling. This is so that the further scaling by 0.5 that + // happens in split screen modes results in a final scaling of 1 rather than 1.5. + int splitYOffset;// = 20; // This offset is applied when doing the 2X scaling above to move the gui out of the way of the tool tips + int guiScale;// = ( minecraft->player->m_iScreenSection == C4JRender::VIEWPORT_TYPE_FULLSCREEN ? 3 : 2 ); + int iPad=minecraft->player->GetXboxPad(); + int iWidthOffset=0,iHeightOffset=0; // used to get the interface looking right on a 2 player split screen game + + // 4J-PB - selected the gui scale based on the slider settings + if(minecraft->player->m_iScreenSection == C4JRender::VIEWPORT_TYPE_FULLSCREEN) + { + guiScale=app.GetGameSettings(iPad,eGameSetting_UISize) + 2; + } + else + { + guiScale=app.GetGameSettings(iPad,eGameSetting_UISizeSplitscreen) + 2; + } + + + ScreenSizeCalculator ssc(minecraft->options, minecraft->width, minecraft->height, guiScale ); + int screenWidth = ssc.getWidth(); + int screenHeight = ssc.getHeight(); + int iSafezoneXHalf=0,iSafezoneYHalf=0,iSafezoneTopYHalf=0; + int iTooltipsYOffset=0; + int quickSelectWidth=182; + int quickSelectHeight=22; + float fScaleFactorWidth=1.0f,fScaleFactorHeight=1.0f; + bool bTwoPlayerSplitscreen=false; + currentGuiScaleFactor = (float) guiScale; // Keep static copy of scale so we know how gui coordinates map to physical pixels - this is also affected by the viewport + + switch(guiScale) + { + case 3: + splitYOffset = 0; + break; + case 4: + splitYOffset = -5; + break; + default: // 2 + splitYOffset = 10; + break; + } + + // Check which screen section this player is in + switch(minecraft->player->m_iScreenSection) + { + case C4JRender::VIEWPORT_TYPE_FULLSCREEN: + // 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; + bTwoPlayerSplitscreen=true; + currentGuiScaleFactor *= 0.5f; + break; + 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; + bTwoPlayerSplitscreen=true; + currentGuiScaleFactor *= 0.5f; + break; + 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; + bTwoPlayerSplitscreen=true; + currentGuiScaleFactor *= 0.5f; + break; + 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; + bTwoPlayerSplitscreen=true; + currentGuiScaleFactor *= 0.5f; + break; + 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; + + } + + // 4J-PB - turn off the slot display if a xui menu is up, or if we're autosaving + bool bDisplayGui=!ui.GetMenuDisplayed(iPad) && !(app.GetXuiAction(iPad)==eAppAction_AutosaveSaveGameCapturedThumbnail); + + // if tooltips are off, set the y offset to zero + if(app.GetGameSettings(iPad,eGameSetting_Tooltips)==0 && bDisplayGui) + { + switch(minecraft->player->m_iScreenSection) + { + case C4JRender::VIEWPORT_TYPE_FULLSCREEN: + iTooltipsYOffset=screenHeight/10; + break; + default: + //iTooltipsYOffset=screenHeight/10; + switch(guiScale) + { + case 3: + iTooltipsYOffset=28;//screenHeight/10; + break; + case 4: + iTooltipsYOffset=28;//screenHeight/10; + break; + default: // 2 + iTooltipsYOffset=14;//screenHeight/10; + break; + } + break; + } + } + + // 4J-PB - Turn off interface if eGameSetting_DisplayHUD is off - for screen shots/videos. + if ( app.GetGameSettings(iPad,eGameSetting_DisplayHUD)==0 ) + { + bDisplayGui = false; + } + + Font *font = minecraft->font; + + + minecraft->gameRenderer->setupGuiScreen(guiScale); + + + + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // 4J - added - this did actually get set in renderVignette but that code is currently commented out + + if (Minecraft::useFancyGraphics()) + { + renderVignette(minecraft->player->getBrightness(a), screenWidth, screenHeight); + } + + ///////////////////////////////////////////////////////////////////////////////////// + // Display the pumpkin screen effect + ///////////////////////////////////////////////////////////////////////////////////// + + shared_ptr headGear = minecraft->player->inventory->getArmor(3); + + // 4J-PB - changing this to be per player + //if (!minecraft->options->thirdPersonView && headGear != NULL && headGear->id == Tile::pumpkin_Id) renderPumpkin(screenWidth, screenHeight); + if ((minecraft->player->ThirdPersonView()==0) && headGear != NULL && headGear->id == Tile::pumpkin_Id) renderPumpkin(screenWidth, screenHeight); + if (!minecraft->player->hasEffect(MobEffect::confusion)) + { + float pt = minecraft->player->oPortalTime + (minecraft->player->portalTime - minecraft->player->oPortalTime) * a; + if (pt > 0) + { + renderTp(pt, screenWidth, screenHeight); + } + } + + if (!minecraft->gameMode->isCutScene()) + { + if(bDisplayGui && bTwoPlayerSplitscreen) + { + // need to apply scale factors depending on the mode + glPushMatrix(); + glScalef(fScaleFactorWidth, fScaleFactorHeight, fScaleFactorWidth); + } +#if RENDER_HUD + ///////////////////////////////////////////////////////////////////////////////////// + // Display the quick select background, the quick select selection, and the crosshair + ///////////////////////////////////////////////////////////////////////////////////// + + glColor4f(1, 1, 1, 1); + + // 4J - this is where to set the blend factor for gui things + // use the primary player's settings + unsigned char ucAlpha=app.GetGameSettings(ProfileManager.GetPrimaryPad(),eGameSetting_InterfaceOpacity); + + // If the user has started to navigate their quickselect bar, ignore the alpha setting, and display at default value + float fVal=fAlphaIncrementPerCent*(float)ucAlpha; + if(ucAlpha<80) + { + // 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=fAlphaIncrementPerCent*(80.0f-((10.0f-(float)uiOpacityTimer)*fStep)); + } + else + { + fVal=fAlphaIncrementPerCent*80.0f; + } + } + else + { + fVal=fAlphaIncrementPerCent*(float)ucAlpha; + } + } + else + { + fVal=fAlphaIncrementPerCent*(float)ucAlpha; + } + + RenderManager.StateSetBlendFactor(0xffffff |(((unsigned int)fVal)<<24)); + currentGuiBlendFactor = fVal / 255.0f; + // RenderManager.StateSetBlendFactor(0x40ffffff); + glBlendFunc(GL_CONSTANT_ALPHA, GL_ONE_MINUS_CONSTANT_ALPHA); + + blitOffset = -90; + + ///////////////////////////////////////////////////////////////////////////////////// + // Display the quick select background, the quick select selection, and the crosshair + ///////////////////////////////////////////////////////////////////////////////////// + if(bDisplayGui) + { + MemSect(31); + minecraft->textures->bindTexture(TN_GUI_GUI); // 4J was L"/gui/gui.png" + MemSect(0); + + shared_ptr inventory = minecraft->player->inventory; + if(bTwoPlayerSplitscreen) + { + // need to apply scale factors depending on the mode + + // 4J Stu - Moved this push and scale further up as we still need to do it for the few HUD components not replaced by xui + //glPushMatrix(); + //glScalef(fScaleFactorWidth, fScaleFactorHeight, fScaleFactorWidth); + + // 4J-PB - move into the safe zone, and account for 2 player splitscreen + blit(iWidthOffset + (screenWidth - quickSelectWidth)/2, iHeightOffset + screenHeight - iSafezoneYHalf - iTooltipsYOffset , 0, 0, 182, 22); + blit(iWidthOffset + (screenWidth - quickSelectWidth)/2 - 1 + inventory->selected * 20, iHeightOffset + screenHeight - iSafezoneYHalf - iTooltipsYOffset - 1, 0, 22, 24, 22); + } + else + { + blit(iWidthOffset + screenWidth / 2 - quickSelectWidth / 2, iHeightOffset + screenHeight - iSafezoneYHalf - iTooltipsYOffset , 0, 0, 182, 22); + blit(iWidthOffset + screenWidth / 2 - quickSelectWidth / 2 - 1 + inventory->selected * 20, iHeightOffset + screenHeight - iSafezoneYHalf - iTooltipsYOffset - 1, 0, 22, 24, 22); + } + + + MemSect(31); + minecraft->textures->bindTexture(TN_GUI_ICONS);//L"/gui/icons.png")); + MemSect(0); + glEnable(GL_BLEND); + RenderManager.StateSetBlendFactor(0xffffff |(((unsigned int)fVal)<<24)); + glBlendFunc(GL_CONSTANT_ALPHA, GL_ONE_MINUS_CONSTANT_ALPHA); + //glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ONE_MINUS_SRC_COLOR); + // 4J Stu - We don't want to adjust the cursor by the safezone, we want it centred + if(bTwoPlayerSplitscreen) + { + blit(iWidthOffset + screenWidth / 2 - 7, (iHeightOffset + screenHeight) / 2 - 7, 0, 0, 16, 16); + } + else + { + blit(screenWidth / 2 - 7, screenHeight / 2 - 7, 0, 0, 16, 16); + } + glDisable(GL_BLEND); + + // if(bTwoPlayerSplitscreen) + // { + // glPopMatrix(); + // } + + } + + bool blink = minecraft->player->invulnerableTime / 3 % 2 == 1; + if (minecraft->player->invulnerableTime < 10) blink = false; + int iHealth = minecraft->player->getHealth(); + int iLastHealth = minecraft->player->lastHealth; + random->setSeed(tickCount * 312871); + + bool foodBlink = false; + FoodData *foodData = minecraft->player->getFoodData(); + int food = foodData->getFoodLevel(); + int oldFood = foodData->getLastFoodLevel(); + +// if (false) //(true) +// { +// renderBossHealth(); +// } + + ///////////////////////////////////////////////////////////////////////////////////// + // Display the experience, food, armour, health and the air bubbles + ///////////////////////////////////////////////////////////////////////////////////// + if(bDisplayGui) + { + // 4J - added blend for fading gui + glEnable(GL_BLEND); + glBlendFunc(GL_CONSTANT_ALPHA, GL_ONE_MINUS_CONSTANT_ALPHA); + + if (minecraft->gameMode->canHurtPlayer()) + { + int xLeft, xRight; + // 4J Stu - TODO Work out proper positioning for splitscreen + if(bTwoPlayerSplitscreen) + { + xLeft = iWidthOffset + (screenWidth - quickSelectWidth)/2; + xRight = iWidthOffset + (screenWidth + quickSelectWidth)/2; + } + else + { + xLeft = (screenWidth - quickSelectWidth)/2; + xRight = (screenWidth + quickSelectWidth) / 2; + } + + // render experience bar + int xpNeededForNextLevel = minecraft->player->getXpNeededForNextLevel(); + if (xpNeededForNextLevel > 0) + { + int w = 182; + + int progress = (int) (minecraft->player->experienceProgress * (float) (w + 1)); + + int yo = screenHeight - iSafezoneYHalf - iTooltipsYOffset - 8; + if(bTwoPlayerSplitscreen) + { + yo+=iHeightOffset; + } + blit(xLeft, yo, 0, 64, w, 5); + if (progress > 0) + { + blit(xLeft, yo, 0, 69, progress, 5); + } + } + + int yLine1, yLine2; + if(bTwoPlayerSplitscreen) + { + //yo = iHeightOffset + screenHeight - 10 - iSafezoneYHalf - iTooltipsYOffset; + yLine1 = iHeightOffset + screenHeight - 18 - iSafezoneYHalf - iTooltipsYOffset; + yLine2 = yLine1 - 10; + } + else + { + //yo = screenHeight - 10 - iSafezoneYHalf - iTooltipsYOffset; + yLine1 = screenHeight - 18 - iSafezoneYHalf - iTooltipsYOffset; + 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 % (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; + 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)) + { + healthTexBaseX += 4 * 9; + } + else if (minecraft.player.hasEffect(MobEffect.wither)) + { + healthTexBaseX += 8 * 9; + } + + int bg = 0; + if (blink) bg = 1; + 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); + } + + if (i == heartOffsetIndex) + { + yo -= 2; + } + + int y0 = 0; + + // 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 < 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); + } + } + + std::shared_ptr riding = minecraft->localplayers[iPad].get()->riding; + std::shared_ptr living = dynamic_pointer_cast(riding); + if (riding == NULL) + { + // render food + for (int i = 0; i < FoodConstants::MAX_FOOD / 2; i++) + { + int yo = yLine1; + + + int texBaseX = 16; + int bg = 0; + if (minecraft->player->hasEffect(MobEffect::hunger)) + { + texBaseX += 4 * 9; + bg = 13; + } + + 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; + } + + int yo = yLine1; + int baseHealth = 0; + + while (hearts > 0) + { + 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; + } + } + + // render air bubbles + if (minecraft->player->isUnderLiquid(Material::water)) + { + int count = (int) ceil((minecraft->player->getAirSupply() - 2) * 10.0f / Player::TOTAL_AIR_SUPPLY); + int extra = (int) ceil((minecraft->player->getAirSupply()) * 10.0f / Player::TOTAL_AIR_SUPPLY) - count; + for (int i = 0; i < count + extra; i++) + { + // Air bubbles + if (i < count) blit(xRight - i * 8 - 9, yLine2, 16, 9 * 2, 9, 9); + else blit(xRight - i * 8 - 9, yLine2, 16 + 9, 9 * 2, 9, 9); + } + } + } + + } + + // 4J-PB - turn off the slot display if a xui menu is up + + //////////////////////////// + // render the slot contents + //////////////////////////// + if(bDisplayGui) + { + // glDisable(GL_BLEND); 4J - removed - we want to be able to fade our gui + + glEnable(GL_RESCALE_NORMAL); + + Lighting::turnOnGui(); + + + int x,y; + + for (int i = 0; i < 9; i++) + { + if(bTwoPlayerSplitscreen) + { + x = iWidthOffset + screenWidth / 2 - 9 * 10 + i * 20 + 2; + y = iHeightOffset + screenHeight - iSafezoneYHalf - iTooltipsYOffset - 16 - 3 + 22; + } + else + { + x = screenWidth / 2 - 9 * 10 + i * 20 + 2; + y = screenHeight - iSafezoneYHalf - iTooltipsYOffset - 16 - 3 + 22; + } + this->renderSlot(i, x, y, a); + } + Lighting::turnOff(); + glDisable(GL_RESCALE_NORMAL); + } +#endif // RENDER_HUD + + // 4J - do render of crouched player. This code is largely taken from the inventory render of the player, with some special hard-coded positions + // worked out by hand from the xui implementation of the crouch icon + + if(app.GetGameSettings(iPad,eGameSetting_AnimatedCharacter)) + { + //int playerIdx = minecraft->player->GetXboxPad(); + + static int characterDisplayTimer[4] = {0}; + if( !bDisplayGui ) + { + characterDisplayTimer[iPad] = 0; + } + else if( minecraft->player->isSneaking() ) + { + characterDisplayTimer[iPad] = 30; + } + else if( minecraft->player->isSprinting() ) + { + characterDisplayTimer[iPad] = 30; + } + else if( minecraft->player->abilities.flying) + { + characterDisplayTimer[iPad] = 5; // quickly get rid of the player display if they stop flying + } + else if( characterDisplayTimer[iPad] > 0 ) + { + --characterDisplayTimer[iPad]; + } + bool displayCrouch = minecraft->player->isSneaking() || ( characterDisplayTimer[iPad] > 0 ); + bool displaySprint = minecraft->player->isSprinting() || ( characterDisplayTimer[iPad] > 0 ); + bool displayFlying = minecraft->player->abilities.flying || ( characterDisplayTimer[iPad] > 0 ); + + if( bDisplayGui && (displayCrouch || displaySprint || displayFlying) ) + { + EntityRenderDispatcher::instance->prepare(minecraft->level, minecraft->textures, minecraft->font, minecraft->cameraTargetPlayer, minecraft->crosshairPickMob, minecraft->options, a); + glEnable(GL_RESCALE_NORMAL); + glEnable(GL_COLOR_MATERIAL); + + // 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, (float)yo, 50); + float ss = 12; + glScalef(-ss, ss, ss); + glRotatef(180, 0, 0, 1); + + float oyr = minecraft->player->yRot; + float oyrO = minecraft->player->yRotO; + float oxr = minecraft->player->xRot; + int ofire = minecraft->player->onFire; + bool ofireflag = minecraft->player->getSharedFlag(Entity::FLAG_ONFIRE); + + float xd = -40; + float yd = 10; + + // 4J Stu - This is all based on the inventory player renderer, with changes to ensure that capes render correctly + // by minimising the changes to member variables of the player which are all related + + glRotatef(45 + 90, 0, 1, 0); + Lighting::turnOn(); + glRotatef(-45 - 90, 0, 1, 0); + + glRotatef(-(float) atan(yd / 40.0f ) * 20, 1, 0, 0); + float bodyRot = (minecraft->player->yBodyRotO + (minecraft->player->yBodyRot - minecraft->player->yBodyRotO)); + // Fixed rotation angle of degrees, adjusted by bodyRot to negate the rotation that occurs in the renderer + // bodyRot in the rotation below is a simplification of "180 - (180 - bodyRot)" where the first 180 is EntityRenderDispatcher::instance->playerRotY that we set below + // and (180 - bodyRot) is the angle of rotation that is performed within the mob renderer + glRotatef( bodyRot - ( (float) atan(xd / 40.0f) * 20), 0, 1, 0); + glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + + // Set head rotation to body rotation to make head static + minecraft->player->yRot = bodyRot; + minecraft->player->yRotO = minecraft->player->yRot; + minecraft->player->xRot = -(float) atan(yd / 40.0f) * 20; + + minecraft->player->onFire = 0; + minecraft->player->setSharedFlag(Entity::FLAG_ONFIRE, false); + + // 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); + EntityRenderDispatcher::instance->isGuiRender = false; + + minecraft->player->yRot = oyr; + minecraft->player->yRotO = oyrO; + minecraft->player->xRot = oxr; + minecraft->player->onFire = ofire; + minecraft->player->setSharedFlag(Entity::FLAG_ONFIRE,ofireflag); + glPopMatrix(); + Lighting::turnOff(); + glDisable(GL_RESCALE_NORMAL); + } + } + } + +#if RENDER_HUD + // Moved so the opacity blend is applied to it + if (bDisplayGui && minecraft->gameMode->hasExperience() && minecraft->player->experienceLevel > 0) + { + if (true) + { + bool blink = false; + int col = blink ? 0xffffff : 0x80ff20; + wchar_t formatted[10]; + swprintf(formatted, 10, L"%d",minecraft->player->experienceLevel); + + wstring str = formatted; + int x = iWidthOffset + (screenWidth - font->width(str)) / 2; + int y = screenHeight - iSafezoneYHalf - iTooltipsYOffset; + // If we're in creative mode, we don't need to offset the XP display so much + if (minecraft->gameMode->canHurtPlayer()) + { + y-=18; + } + else + { + y-=13; + } + + if(bTwoPlayerSplitscreen) + { + y+=iHeightOffset; + } + //int y = screenHeight - 31 - 4; + font->draw(str, x + 1, y, 0x000000); + font->draw(str, x - 1, y, 0x000000); + font->draw(str, x, y + 1, 0x000000); + font->draw(str, x, y - 1, 0x000000); + // font->draw(str, x + 1, y + 1, 0x000000); + // font->draw(str, x - 1, y + 1, 0x000000); + // font->draw(str, x + 1, y - 1, 0x000000); + // font->draw(str, x - 1, y - 1, 0x000000); + font->draw(str, x, y, col); + } + } +#endif // RENDER_HUD + + // 4J - added to disable blends, which we have enabled previously to allow gui fading + glDisable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + // if the player is falling asleep we render a dark overlay + if (minecraft->player->getSleepTimer() > 0) + { + glDisable(GL_DEPTH_TEST); + glDisable(GL_ALPHA_TEST); + int timer = minecraft->player->getSleepTimer(); + float amount = (float) timer / (float) Player::SLEEP_DURATION; + if (amount > 1) + { + // waking up + amount = 1.0f - ((float) (timer - Player::SLEEP_DURATION) / (float) Player::WAKE_UP_DURATION); + } + + int color = (int) (220.0f * amount) << 24 | (0x101020); + fill(0, 0, screenWidth/fScaleFactorWidth, screenHeight/fScaleFactorHeight, color); + glEnable(GL_ALPHA_TEST); + glEnable(GL_DEPTH_TEST); + } + + // 4J-PB - Request from Mojang to have a red death screen + if (!minecraft->player->isAlive()) + { + glDisable(GL_DEPTH_TEST); + glDisable(GL_ALPHA_TEST); + int timer = minecraft->player->getDeathFadeTimer(); + float amount = (float) timer / (float) Player::DEATHFADE_DURATION; + + int color = (int) (220.0f * amount) << 24 | (0x200000); + fill(0, 0, screenWidth/fScaleFactorWidth, screenHeight/fScaleFactorHeight, color); + glEnable(GL_ALPHA_TEST); + glEnable(GL_DEPTH_TEST); + + } + + + // { + // String str = "" + minecraft.player.getFoodData().getExhaustionLevel() + ", " + minecraft.player.getFoodData().getSaturationLevel(); + // int x = (screenWidth - font.width(str)) / 2; + // int y = screenHeight - 64; + // font.draw(str, x + 1, y, 0xffffff); + // } + +#ifndef _FINAL_BUILD + MemSect(31); + if (minecraft->options->renderDebug) + { + glPushMatrix(); + if (Minecraft::warezTime > 0) glTranslatef(0, 32, 0); + font->drawShadow(ClientConstants::VERSION_STRING + L" (" + minecraft->fpsString + L")", iSafezoneXHalf+2, 20, 0xffffff); + font->drawShadow(L"Seed: " + _toString<__int64>(minecraft->level->getLevelData()->getSeed() ), iSafezoneXHalf+2, 32 + 00, 0xffffff); + font->drawShadow(minecraft->gatherStats1(), iSafezoneXHalf+2, 32 + 10, 0xffffff); + font->drawShadow(minecraft->gatherStats2(), iSafezoneXHalf+2, 32 + 20, 0xffffff); + font->drawShadow(minecraft->gatherStats3(), iSafezoneXHalf+2, 32 + 30, 0xffffff); + font->drawShadow(minecraft->gatherStats4(), iSafezoneXHalf+2, 32 + 40, 0xffffff); + + // TERRAIN FEATURES + int iYPos=82; + + if(minecraft->level->dimension->id==0) + { + wstring wfeature[eTerrainFeature_Count]; + + wfeature[eTerrainFeature_Stronghold] = L"Stronghold: "; + wfeature[eTerrainFeature_Mineshaft] = L"Mineshaft: "; + wfeature[eTerrainFeature_Village] = L"Village: "; + wfeature[eTerrainFeature_Ravine] = L"Ravine: "; + + for(int i=0;i( pFeatureData->x*16 ) + L", " + _toString( pFeatureData->z*16 ) + L"] "; + wfeature[pFeatureData->eTerrainFeature] += itemInfo; + } + + for( int i = eTerrainFeature_Stronghold; i < (int) eTerrainFeature_Count; i++ ) + { + font->drawShadow(wfeature[i], iSafezoneXHalf + 2, iYPos, 0xffffff); + iYPos+=10; + } + } + + //font->drawShadow(minecraft->gatherStats5(), iSafezoneXHalf+2, 32 + 10, 0xffffff); + { + /* 4J - removed + long max = Runtime.getRuntime().maxMemory(); + long total = Runtime.getRuntime().totalMemory(); + long free = Runtime.getRuntime().freeMemory(); + long used = total - free; + String msg = "Used memory: " + (used * 100 / max) + "% (" + (used / 1024 / 1024) + "MB) of " + (max / 1024 / 1024) + "MB"; + drawString(font, msg, screenWidth - font.width(msg) - 2, 2, 0xe0e0e0); + msg = "Allocated memory: " + (total * 100 / max) + "% (" + (total / 1024 / 1024) + "MB)"; + drawString(font, msg, screenWidth - font.width(msg) - 2, 12, 0xe0e0e0); + */ + } + // 4J Stu - Moved these so that they don't overlap + double xBlockPos = floor(minecraft->player->x); + double yBlockPos = floor(minecraft->player->y); + double zBlockPos = floor(minecraft->player->z); + drawString(font, L"x: " + _toString(minecraft->player->x) + L"/ Head: " + _toString(xBlockPos) + L"/ Chunk: " + _toString(minecraft->player->xChunk), iSafezoneXHalf+2, iYPos + 8 * 0, 0xe0e0e0); + drawString(font, L"y: " + _toString(minecraft->player->y) + L"/ Head: " + _toString(yBlockPos), iSafezoneXHalf+2, iYPos + 8 * 1, 0xe0e0e0); + drawString(font, L"z: " + _toString(minecraft->player->z) + L"/ Head: " + _toString(zBlockPos) + L"/ Chunk: " + _toString(minecraft->player->zChunk), iSafezoneXHalf+2, iYPos + 8 * 2, 0xe0e0e0); + drawString(font, L"f: " + _toString(Mth::floor(minecraft->player->yRot * 4.0f / 360.0f + 0.5) & 0x3) + L"/ yRot: " + _toString(minecraft->player->yRot), iSafezoneXHalf+2, iYPos + 8 * 3, 0xe0e0e0); + iYPos += 8*4; + + int px = Mth::floor(minecraft->player->x); + int py = Mth::floor(minecraft->player->y); + int pz = Mth::floor(minecraft->player->z); + if (minecraft->level != NULL && minecraft->level->hasChunkAt(px, py, pz)) + { + LevelChunk *chunkAt = minecraft->level->getChunkAt(px, pz); + Biome *biome = chunkAt->getBiome(px & 15, pz & 15, minecraft->level->getBiomeSource()); + drawString( + font, + L"b: " + biome->m_name + L" (" + _toString(biome->id) + L")", iSafezoneXHalf+2, iYPos, 0xe0e0e0); + } + + glPopMatrix(); + } + MemSect(0); +#endif + + lastTickA = a; + // 4J Stu - This is now displayed in a xui scene +#if 0 + // Jukebox CD message + if (overlayMessageTime > 0) + { + float t = overlayMessageTime - a; + int alpha = (int) (t * 256 / 20); + if (alpha > 255) alpha = 255; + if (alpha > 0) + { + glPushMatrix(); + + if(bTwoPlayerSplitscreen) + { + glTranslatef((float)((screenWidth / 2)+iWidthOffset), ((float)(screenHeight+iHeightOffset)) - iTooltipsYOffset -12 -iSafezoneYHalf, 0); + } + else + { + glTranslatef(((float)screenWidth) / 2, ((float)screenHeight) - iTooltipsYOffset - 12 -iSafezoneYHalf, 0); + } + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + int col = 0xffffff; + if (animateOverlayMessageColor) + { + col = Color::HSBtoRGB(t / 50.0f, 0.7f, 0.6f) & 0xffffff; + } + // 4J-PB - this is the string displayed when cds are placed in a jukebox + font->draw(overlayMessageString,-font->width(overlayMessageString) / 2, -20, col + (alpha << 24)); + glDisable(GL_BLEND); + glPopMatrix(); + } + } +#endif + + unsigned int max = 10; + bool isChatting = false; + if (dynamic_cast(minecraft->screen) != NULL) + { + max = 20; + isChatting = true; + } + + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glDisable(GL_ALPHA_TEST); + +// 4J Stu - We have moved the chat text to a xui +#if 0 + glPushMatrix(); + // 4J-PB we need to move this up a bit because we've moved the quick select + //glTranslatef(0, ((float)screenHeight) - 48, 0); + glTranslatef(0.0f, (float)(screenHeight - iSafezoneYHalf - iTooltipsYOffset - 16 - 3 + 22) - 24.0f, 0.0f); + // glScalef(1.0f / ssc.scale, 1.0f / ssc.scale, 1); + + // 4J-PB - we need gui messages for each of the possible 4 splitscreen players + if(bDisplayGui) + { + int iPad=minecraft->player->GetXboxPad(); + for (unsigned int i = 0; i < guiMessages[iPad].size() && i < max; i++) + { + if (guiMessages[iPad][i].ticks < 20 * 10 || isChatting) + { + double t = guiMessages[iPad][i].ticks / (20 * 10.0); + t = 1 - t; + t = t * 10; + if (t < 0) t = 0; + if (t > 1) t = 1; + t = t * t; + int alpha = (int) (255 * t); + if (isChatting) alpha = 255; + + if (alpha > 0) + { + int x = iSafezoneXHalf+2; + int y = -((int)i) * 9; + if(bTwoPlayerSplitscreen) + { + y+= iHeightOffset; + } + + wstring msg = guiMessages[iPad][i].string; + // 4J-PB - fill the black bar across the whole screen, otherwise it looks odd due to the safe area + this->fill(0, y - 1, screenWidth/fScaleFactorWidth, y + 8, (alpha / 2) << 24); + glEnable(GL_BLEND); + + font->drawShadow(msg, iSafezoneXHalf+4, y, 0xffffff + (alpha << 24)); + } + } + } + } + glPopMatrix(); +#endif + + // 4J Stu - Copied over but not used +#if 0 + if (minecraft.player instanceof MultiplayerLocalPlayer && minecraft.options.keyPlayerList.isDown) + { + ClientConnection connection = ((MultiplayerLocalPlayer) minecraft.player).connection; + List playerInfos = connection.playerInfos; + int slots = connection.maxPlayers; + + int rows = slots; + int cols = 1; + while (rows > 20) { + cols++; + rows = (slots + cols - 1) / cols; + } + + /* + * int fakeCount = 39; while (playerInfos.size() > fakeCount) + * playerInfos.remove(playerInfos.size() - 1); while (playerInfos.size() < + * fakeCount) playerInfos.add(new PlayerInfo("fiddle")); + */ + + int slotWidth = 300 / cols; + if (slotWidth > 150) slotWidth = 150; + + int xxo = (screenWidth - cols * slotWidth) / 2; + int yyo = 10; + fill(xxo - 1, yyo - 1, xxo + slotWidth * cols, yyo + 9 * rows, 0x80000000); + for (int i = 0; i < slots; i++) { + int xo = xxo + i % cols * slotWidth; + int yo = yyo + i / cols * 9; + + fill(xo, yo, xo + slotWidth - 1, yo + 8, 0x20ffffff); + glColor4f(1, 1, 1, 1); + glEnable(GL_ALPHA_TEST); + + if (i < playerInfos.size()) { + PlayerInfo pl = playerInfos.get(i); + font.drawShadow(pl.name, xo, yo, 0xffffff); + minecraft.textures.bind(minecraft.textures.loadTexture("/gui/icons.png")); + int xt = 0; + int yt = 0; + xt = 0; + yt = 0; + if (pl.latency < 0) yt = 5; + else if (pl.latency < 150) yt = 0; + else if (pl.latency < 300) yt = 1; + else if (pl.latency < 600) yt = 2; + else if (pl.latency < 1000) yt = 3; + else yt = 4; + + blitOffset += 100; + blit(xo + slotWidth - 12, yo, 0 + xt * 10, 176 + yt * 8, 10, 8); + blitOffset -= 100; + } + } + } +#endif + + if(bDisplayGui && bTwoPlayerSplitscreen) + { + // pop the scaled matrix + glPopMatrix(); + } + + glColor4f(1, 1, 1, 1); + glDisable(GL_BLEND); + glEnable(GL_ALPHA_TEST); +} + +// Moved to the xui base scene +// void Gui::renderBossHealth(void) +// { +// if (EnderDragonRenderer::bossInstance == NULL) return; +// +// shared_ptr boss = EnderDragonRenderer::bossInstance; +// EnderDragonRenderer::bossInstance = NULL; +// +// Minecraft *pMinecraft=Minecraft::GetInstance(); +// +// Font *font = pMinecraft->font; +// +// ScreenSizeCalculator ssc(pMinecraft->options, pMinecraft->width_phys, pMinecraft->height_phys); +// int screenWidth = ssc.getWidth(); +// +// int w = 182; +// int xLeft = screenWidth / 2 - w / 2; +// +// int progress = (int) (boss->getSynchedHealth() / (float) boss->getMaxHealth() * (float) (w + 1)); +// +// int yo = 12; +// blit(xLeft, yo, 0, 74, w, 5); +// blit(xLeft, yo, 0, 74, w, 5); +// if (progress > 0) +// { +// blit(xLeft, yo, 0, 79, progress, 5); +// } +// +// wstring msg = L"Boss health - NON LOCALISED"; +// font->drawShadow(msg, screenWidth / 2 - font->width(msg) / 2, yo - 10, 0xff00ff); +// glColor4f(1, 1, 1, 1); +// glBindTexture(GL_TEXTURE_2D, pMinecraft->textures->loadTexture(TN_GUI_ICONS) );//"/gui/icons.png")); +// +// } + +void Gui::renderPumpkin(int w, int h) +{ + glDisable(GL_DEPTH_TEST); + glDepthMask(false); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glColor4f(1, 1, 1, 1); + glDisable(GL_ALPHA_TEST); + + MemSect(31); + minecraft->textures->bindTexture(&PUMPKIN_BLUR_LOCATION); + MemSect(0); + Tesselator *t = Tesselator::getInstance(); + t->begin(); + t->vertexUV((float)(0), (float)( h), (float)( -90), (float)( 0), (float)( 1)); + t->vertexUV((float)(w), (float)( h), (float)( -90), (float)( 1), (float)( 1)); + t->vertexUV((float)(w), (float)( 0), (float)( -90), (float)( 1), (float)( 0)); + t->vertexUV((float)(0), (float)( 0), (float)( -90), (float)( 0), (float)( 0)); + t->end(); + glDepthMask(true); + glEnable(GL_DEPTH_TEST); + glEnable(GL_ALPHA_TEST); + glColor4f(1, 1, 1, 1); + +} + +void Gui::renderVignette(float br, int w, int h) +{ + br = 1 - br; + if (br < 0) br = 0; + if (br > 1) br = 1; + tbr += (br - tbr) * 0.01f; + +#if 0 // 4J - removed - TODO put back when we have blend functions implemented + glDisable(GL_DEPTH_TEST); + glDepthMask(false); + glBlendFunc(GL_ZERO, GL_ONE_MINUS_SRC_COLOR); + glColor4f(tbr, tbr, tbr, 1); + glBindTexture(GL_TEXTURE_2D, minecraft->textures->loadTexture(TN__BLUR__MISC_VIGNETTE));//L"%blur%/misc/vignette.png")); + Tesselator *t = Tesselator::getInstance(); + t->begin(); + t->vertexUV((float)(0), (float)( h), (float)( -90), (float)( 0), (float)( 1)); + t->vertexUV((float)(w), (float)( h), (float)( -90), (float)( 1), (float)( 1)); + t->vertexUV((float)(w), (float)( 0), (float)( -90), (float)( 1), (float)( 0)); + t->vertexUV((float)(0), (float)( 0), (float)( -90), (float)( 0), (float)( 0)); + t->end(); + glDepthMask(true); + glEnable(GL_DEPTH_TEST); + glColor4f(1, 1, 1, 1); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); +#endif +} + +void Gui::renderTp(float br, int w, int h) +{ + if (br < 1) + { + br = br * br; + br = br * br; + br = br * 0.8f + 0.2f; + } + + glDisable(GL_ALPHA_TEST); + glDisable(GL_DEPTH_TEST); + glDepthMask(false); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glColor4f(1, 1, 1, br); + MemSect(31); + minecraft->textures->bindTexture(&TextureAtlas::LOCATION_BLOCKS); + MemSect(0); + + Icon *slot = Tile::portalTile->getTexture(Facing::UP); + float u0 = slot->getU0(); + float v0 = slot->getV0(); + float u1 = slot->getU1(); + float v1 = slot->getV1(); + Tesselator *t = Tesselator::getInstance(); + t->begin(); + t->vertexUV((float)(0), (float)( h), (float)( -90), (float)( u0), (float)( v1)); + t->vertexUV((float)(w), (float)( h), (float)( -90), (float)( u1), (float)( v1)); + t->vertexUV((float)(w), (float)( 0), (float)( -90), (float)( u1), (float)( v0)); + t->vertexUV((float)(0), (float)( 0), (float)( -90), (float)( u0), (float)( v0)); + t->end(); + glDepthMask(true); + glEnable(GL_DEPTH_TEST); + glEnable(GL_ALPHA_TEST); + glColor4f(1, 1, 1, 1); + +} + +void Gui::renderSlot(int slot, int x, int y, float a) +{ + shared_ptr item = minecraft->player->inventory->items[slot]; + if (item == NULL) return; + + float pop = item->popTime - a; + if (pop > 0) + { + glPushMatrix(); + float squeeze = 1 + pop / (float) Inventory::POP_TIME_DURATION; + glTranslatef((float)(x + 8), (float)(y + 12), 0); + glScalef(1 / squeeze, (squeeze + 1) / 2, 1); + glTranslatef((float)-(x + 8), (float)-(y + 12), 0); + } + + itemRenderer->renderAndDecorateItem(minecraft->font, minecraft->textures, item, x, y); + + if (pop > 0) + { + glPopMatrix(); + } + + itemRenderer->renderGuiItemDecorations(minecraft->font, minecraft->textures, item, x, y); + +} + +void Gui::tick() +{ + if (overlayMessageTime > 0) overlayMessageTime--; + tickCount++; + + for(int iPad=0;iPadlocalplayers[i]) + { + guiMessages[i].clear(); + } + } + } + else + { + guiMessages[iPad].clear(); + } +} + + +void Gui::addMessage(const wstring& _string,int iPad,bool bIsDeathMessage) +{ + wstring string = _string; // 4J - Take copy of input as it is const + //int iScale=1; + + //if((minecraft->player->m_iScreenSection==C4JRender::VIEWPORT_TYPE_SPLIT_TOP) || + // (minecraft->player->m_iScreenSection==C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM)) + //{ + // iScale=2; + //} + + // while (minecraft->font->width(string) > (m_iMaxMessageWidth*iScale)) + //{ + // unsigned int i = 1; + // while (i < string.length() && minecraft->font->width(string.substr(0, i + 1)) <= (m_iMaxMessageWidth*iScale)) + // { + // i++; + // } + // int iLast=string.find_last_of(L" ",i); + + // // if a space was found, include the space on this line + // if(iLast!=i) + // { + // iLast++; + // } + // addMessage(string.substr(0, iLast), iPad); + // string = string.substr(iLast); + // } + + int maximumChars; + + switch(minecraft->player->m_iScreenSection) + { + case C4JRender::VIEWPORT_TYPE_SPLIT_TOP: + case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: + case C4JRender::VIEWPORT_TYPE_FULLSCREEN: + if(RenderManager.IsHiDef()) + { + maximumChars = 105; + } + else + { + maximumChars = 55; + } +#ifdef __PSVITA__ + maximumChars = 90; +#endif + switch(XGetLanguage()) + { + case XC_LANGUAGE_JAPANESE: + case XC_LANGUAGE_TCHINESE: + case XC_LANGUAGE_KOREAN: + if(RenderManager.IsHiDef()) + { + maximumChars = 70; + } + else + { + maximumChars = 35; + } +#ifdef __PSVITA__ + maximumChars = 55; +#endif + break; + } + break; + default: + maximumChars = 55; + switch(XGetLanguage()) + { + case XC_LANGUAGE_JAPANESE: + case XC_LANGUAGE_TCHINESE: + case XC_LANGUAGE_KOREAN: + maximumChars = 35; + break; + } + break; + } + + + while (string.length() > maximumChars) + { + unsigned int i = 1; + while (i < string.length() && (i + 1) <= maximumChars) + { + i++; + } + int iLast=(int)string.find_last_of(L" ",i); + switch(XGetLanguage()) + { + case XC_LANGUAGE_JAPANESE: + case XC_LANGUAGE_TCHINESE: + case XC_LANGUAGE_KOREAN: + iLast = maximumChars; + break; + default: + iLast=(int)string.find_last_of(L" ",i); + break; + } + + // if a space was found, include the space on this line + if(iLast!=i) + { + iLast++; + } + addMessage(string.substr(0, iLast), iPad, bIsDeathMessage); + string = string.substr(iLast); + } + + if(iPad==-1) + { + // add to all + for(int i=0;ilocalplayers[i] && !(bIsDeathMessage && app.GetGameSettings(i,eGameSetting_DeathMessages)==0)) + { + guiMessages[i].insert(guiMessages[i].begin(), GuiMessage(string)); + while (guiMessages[i].size() > 50) + { + guiMessages[i].pop_back(); + } + } + } + } + else if(!(bIsDeathMessage && app.GetGameSettings(iPad,eGameSetting_DeathMessages)==0)) + { + guiMessages[iPad].insert(guiMessages[iPad].begin(), GuiMessage(string)); + while (guiMessages[iPad].size() > 50) + { + guiMessages[iPad].pop_back(); + } + } + + +} + +// 4J Added +float Gui::getOpacity(int iPad, DWORD index) +{ + float opacityPercentage = 0; + if (guiMessages[iPad].size() > index && guiMessages[iPad][index].ticks < 20 * 10) + { + double t = guiMessages[iPad][index].ticks / (20 * 10.0); + t = 1 - t; + t = t * 10; + if (t < 0) t = 0; + if (t > 1) t = 1; + t = t * t; + opacityPercentage = t; + } + return opacityPercentage; +} + +float Gui::getJukeboxOpacity(int iPad) +{ + float t = overlayMessageTime - lastTickA; + int alpha = (int) (t * 256 / 20); + if (alpha > 255) alpha = 255; + alpha /= 255; + + return alpha; +} + +void Gui::setNowPlaying(const wstring& string) +{ +// overlayMessageString = L"Now playing: " + string; + overlayMessageString = app.GetString(IDS_NOWPLAYING) + string; + overlayMessageTime = 20 * 3; + animateOverlayMessageColor = true; +} + +void Gui::displayClientMessage(int messageId, int iPad) +{ + //Language *language = Language::getInstance(); + wstring languageString = app.GetString(messageId);//language->getElement(messageId); + + addMessage(languageString, iPad); +} + +// 4J Added +void Gui::renderGraph(int dataLength, int dataPos, __int64 *dataA, float dataAScale, int dataAWarning, __int64 *dataB, float dataBScale, int dataBWarning) +{ + int height = minecraft->height; + // This causes us to cover xScale*dataLength pixels in the horizontal + int xScale = 1; + if(dataA != NULL && dataB != NULL) xScale = 2; + + glClear(GL_DEPTH_BUFFER_BIT); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho(0, (float)minecraft->width, (float)height, 0, 1000, 3000); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glTranslatef(0, 0, -2000); + + glLineWidth(1); + glDisable(GL_TEXTURE_2D); + Tesselator *t = Tesselator::getInstance(); + + t->begin(GL_LINES); + for (int i = 0; i < dataLength; i++) + { + int col = ((i - dataPos) & (dataLength - 1)) * 255 / dataLength; + int cc = col * col / 255; + cc = cc * cc / 255; + int cc2 = cc * cc / 255; + cc2 = cc2 * cc2 / 255; + + if( dataA != NULL ) + { + if (dataA[i] > dataAWarning) + { + t->color(0xff000000 + cc * 65536); + } + else + { + t->color(0xff000000 + cc * 256); + } + + __int64 aVal = dataA[i] / dataAScale; + + t->vertex((float)(xScale*i + 0.5f), (float)( height - aVal + 0.5f), (float)( 0)); + t->vertex((float)(xScale*i + 0.5f), (float)( height + 0.5f), (float)( 0)); + } + + if( dataB != NULL ) + { + if (dataB[i]>dataBWarning) + { + t->color(0xff000000 + cc * 65536 + cc * 256 + cc * 1); + } + else + { + t->color(0xff808080 + cc/2 * 256); + } + + __int64 bVal = dataB[i] / dataBScale; + + t->vertex((float)(xScale*i + (xScale - 1) + 0.5f), (float)( height - bVal + 0.5f), (float)( 0)); + t->vertex((float)(xScale*i + (xScale - 1) + 0.5f), (float)( height + 0.5f), (float)( 0)); + } + } + t->end(); + + glEnable(GL_TEXTURE_2D); +} + +void Gui::renderStackedGraph(int dataPos, int dataLength, int dataSources, __int64 (*func)(unsigned int dataPos, unsigned int dataSource) ) +{ + int height = minecraft->height; + + glClear(GL_DEPTH_BUFFER_BIT); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho(0, (float)minecraft->width, (float)height, 0, 1000, 3000); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glTranslatef(0, 0, -2000); + + glLineWidth(1); + glDisable(GL_TEXTURE_2D); + Tesselator *t = Tesselator::getInstance(); + + t->begin(GL_LINES); + __int64 thisVal = 0; + __int64 topVal = 0; + for (int i = 0; i < dataLength; i++) + { + thisVal = 0; + topVal = 0; + int col = ((i - dataPos) & (dataLength - 1)) * 255 / dataLength; + int cc = col * col / 255; + cc = cc * cc / 255; + int cc2 = cc * cc / 255; + cc2 = cc2 * cc2 / 255; + + + for(unsigned int source = 0; source < dataSources; ++source ) + { + thisVal = func( i, source ); + + if( thisVal > 0 ) + { + float vary = (float)source/dataSources; + int fColour = floor(vary * 0xffffff); + + int colour = 0xff000000 + fColour; + //printf("Colour is %x\n", colour); + t->color(colour); + + t->vertex((float)(i + 0.5f), (float)( height - topVal - thisVal + 0.5f), (float)( 0)); + t->vertex((float)(i + 0.5f), (float)( height - topVal + 0.5f), (float)( 0)); + + topVal += thisVal; + } + } + + // Draw some horizontals + for(unsigned int horiz = 1; horiz < 7; ++horiz ) + { + t->color(0xff000000); + + t->vertex((float)(0 + 0.5f), (float)( height - (horiz*100) + 0.5f), (float)( 0)); + t->vertex((float)(dataLength + 0.5f), (float)( height - (horiz*100) + 0.5f), (float)( 0)); + } + } + t->end(); + + glEnable(GL_TEXTURE_2D); +} diff --git a/Minecraft.Client/Gui.h b/Minecraft.Client/Gui.h new file mode 100644 index 00000000..9352308f --- /dev/null +++ b/Minecraft.Client/Gui.h @@ -0,0 +1,72 @@ +#pragma once +#include "ResourceLocation.h" +#include "GuiComponent.h" +#include "GuiMessage.h" +#include "ResourceLocation.h" + +class Random; +class Minecraft; +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; + + Minecraft *minecraft; +public: + wstring selectedName; +private: + int tickCount; + wstring overlayMessageString; + int overlayMessageTime; + bool animateOverlayMessageColor; + + // 4J Added + float lastTickA; + float fAlphaIncrementPerCent; +public: + static float currentGuiBlendFactor; // 4J added + static float currentGuiScaleFactor; // 4J added + + float progress; + + // private DecimalFormat df = new DecimalFormat("##.00"); + +public: + Gui(Minecraft *minecraft); + + 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); +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); + + // 4J Added + DWORD getMessagesCount(int iPad) { return (int)guiMessages[iPad].size(); } + wstring getMessage(int iPad, DWORD index) { return guiMessages[iPad].at(index).string; } + float getOpacity(int iPad, DWORD index); + + wstring getJukeboxMessage(int iPad) { return overlayMessageString; } + float getJukeboxOpacity(int iPad); + + // 4J Added + void renderGraph(int dataLength, int dataPos, __int64 *dataA, float dataAScale, int dataAWarning, __int64 *dataB, float dataBScale, int dataBWarning); + void renderStackedGraph(int dataPos, int dataLength, int dataSources, __int64 (*func)(unsigned int dataPos, unsigned int dataSource) ); +}; diff --git a/Minecraft.Client/GuiComponent.cpp b/Minecraft.Client/GuiComponent.cpp new file mode 100644 index 00000000..92abf36d --- /dev/null +++ b/Minecraft.Client/GuiComponent.cpp @@ -0,0 +1,136 @@ +#include "stdafx.h" +#include "GuiComponent.h" +#include "Tesselator.h" + +void GuiComponent::hLine(int x0, int x1, int y, int col) +{ + if (x1 < x0) + { + int tmp = x0; + x0 = x1; + x1 = tmp; + } + fill(x0, y, x1 + 1, y + 1, col); +} + +void GuiComponent::vLine(int x, int y0, int y1, int col) +{ + if (y1 < y0) + { + int tmp = y0; + y0 = y1; + y1 = tmp; + } + fill(x, y0 + 1, x + 1, y1, col); +} + +void GuiComponent::fill(int x0, int y0, int x1, int y1, int col) +{ + if (x0 < x1) + { + int tmp = x0; + x0 = x1; + x1 = tmp; + } + if (y0 < y1) + { + int tmp = y0; + y0 = y1; + y1 = tmp; + } + float a = ((col >> 24) & 0xff) / 255.0f; + float r = ((col >> 16) & 0xff) / 255.0f; + float g = ((col >> 8) & 0xff) / 255.0f; + float b = ((col) & 0xff) / 255.0f; + Tesselator *t = Tesselator::getInstance(); + glEnable(GL_BLEND); + glDisable(GL_TEXTURE_2D); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glColor4f(r, g, b, a); + t->begin(); + t->vertex((float)(x0), (float)( y1), (float)( 0)); + t->vertex((float)(x1), (float)( y1), (float)( 0)); + t->vertex((float)(x1), (float)( y0), (float)( 0)); + t->vertex((float)(x0), (float)( y0), (float)( 0)); + t->end(); + glEnable(GL_TEXTURE_2D); + glDisable(GL_BLEND); +} + +void GuiComponent::fillGradient(int x0, int y0, int x1, int y1, int col1, int col2) +{ + float a1 = ((col1 >> 24) & 0xff) / 255.0f; + float r1 = ((col1 >> 16) & 0xff) / 255.0f; + float g1 = ((col1 >> 8) & 0xff) / 255.0f; + float b1 = ((col1) & 0xff) / 255.0f; + + float a2 = ((col2 >> 24) & 0xff) / 255.0f; + float r2 = ((col2 >> 16) & 0xff) / 255.0f; + float g2 = ((col2 >> 8) & 0xff) / 255.0f; + float b2 = ((col2) & 0xff) / 255.0f; + glDisable(GL_TEXTURE_2D); + glEnable(GL_BLEND); + glDisable(GL_ALPHA_TEST); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glShadeModel(GL_SMOOTH); + + Tesselator *t = Tesselator::getInstance(); + t->begin(); + t->color(r1, g1, b1, a1); + t->vertex((float)(x1), (float)( y0), blitOffset); + t->vertex((float)(x0), (float)( y0), blitOffset); + t->color(r2, g2, b2, a2); + t->vertex((float)(x0), (float)( y1), blitOffset); + t->vertex((float)(x1), (float)( y1), blitOffset); + t->end(); + + glShadeModel(GL_FLAT); + glDisable(GL_BLEND); + glEnable(GL_ALPHA_TEST); + glEnable(GL_TEXTURE_2D); +} + +GuiComponent::GuiComponent() +{ + blitOffset = 0; +} + +void GuiComponent::drawCenteredString(Font *font, const wstring& str, int x, int y, int color) +{ + font->drawShadow(str, x - (font->width(str)) / 2, y, color); +} + +void GuiComponent::drawString(Font *font, const wstring& str, int x, int y, int color) +{ + font->drawShadow(str, x, y, color); +} + +void GuiComponent::blit(int x, int y, int sx, int sy, int w, int h) +{ + float us = 1 / 256.0f; + float vs = 1 / 256.0f; + Tesselator *t = Tesselator::getInstance(); + t->begin(); + + // This is a bit of a mystery. In general this ought to be 0.5 to match the centre of texels & pixels in the DX9 version of things. However, when scaling the GUI by a factor of 1.5, I'm + // really not sure how exactly point sampled rasterisation works, but when shifting by 0.5 we get a discontinuity down the diagonal of quads. Setting this shift to 0.75 in all cases seems to work fine. + const float extraShift = 0.75f; + + // 4J - subtracting extraShift (actual screen pixels, so need to compensate for physical & game width) from each x & y coordinate to compensate for centre of pixels in directx vs openGL + float dx = ( extraShift * (float)Minecraft::GetInstance()->width ) / (float)Minecraft::GetInstance()->width_phys; + // 4J - Also factor in the scaling from gui coordinate space to the screen. This varies based on user-selected gui scale, and whether we are in a viewport mode or not + dx /= Gui::currentGuiScaleFactor; + float dy = extraShift / Gui::currentGuiScaleFactor; + // Ensure that the x/y, width and height are actually pixel aligned at our current scale factor - in particular, for split screen mode with the default (3X) + // scale, we have an overall scale factor of 3 * 0.5 = 1.5, and so any odd pixels won't align + float fx = (floorf((float)x * Gui::currentGuiScaleFactor)) / Gui::currentGuiScaleFactor; + float fy = (floorf((float)y * Gui::currentGuiScaleFactor)) / Gui::currentGuiScaleFactor; + float fw = (floorf((float)w * Gui::currentGuiScaleFactor)) / Gui::currentGuiScaleFactor; + float fh = (floorf((float)h * Gui::currentGuiScaleFactor)) / Gui::currentGuiScaleFactor; + + t->vertexUV(fx + 0 - dx, fy + fh - dy, (float)( blitOffset), (float)( (sx + 0) * us), (float)( (sy + h) * vs)); + t->vertexUV(fx + fw - dx, fy + fh - dy, (float)( blitOffset), (float)( (sx + w) * us), (float)( (sy + h) * vs)); + t->vertexUV(fx + fw - dx, fy + 0 - dy, (float)( blitOffset), (float)( (sx + w) * us), (float)( (sy + 0) * vs)); + t->vertexUV(fx + 0 - dx, fy + 0 - dy, (float)( blitOffset), (float)( (sx + 0) * us), (float)( (sy + 0) * vs)); + t->end(); +} \ No newline at end of file diff --git a/Minecraft.Client/GuiComponent.h b/Minecraft.Client/GuiComponent.h new file mode 100644 index 00000000..7073db40 --- /dev/null +++ b/Minecraft.Client/GuiComponent.h @@ -0,0 +1,19 @@ +#pragma once +class Font; +using namespace std; + +class GuiComponent +{ +protected: + float blitOffset; +protected: + void hLine(int x0, int x1, int y, int col); + void vLine(int x, int y0, int y1, int col); + void fill(int x0, int y0, int x1, int y1, int col); + void fillGradient(int x0, int y0, int x1, int y1, int col1, int col2); +public: + GuiComponent(); // 4J added + void drawCenteredString(Font *font, const wstring& str, int x, int y, int color); + void drawString(Font *font, const wstring& str, int x, int y, int color); + void blit(int x, int y, int sx, int sy, int w, int h); +}; diff --git a/Minecraft.Client/GuiMessage.cpp b/Minecraft.Client/GuiMessage.cpp new file mode 100644 index 00000000..6a7fa7e0 --- /dev/null +++ b/Minecraft.Client/GuiMessage.cpp @@ -0,0 +1,8 @@ +#include "stdafx.h" +#include "GuiMessage.h" + +GuiMessage::GuiMessage(const wstring& string) +{ + this->string = string; + ticks = 0; +} \ No newline at end of file diff --git a/Minecraft.Client/GuiMessage.h b/Minecraft.Client/GuiMessage.h new file mode 100644 index 00000000..dac9a9e3 --- /dev/null +++ b/Minecraft.Client/GuiMessage.h @@ -0,0 +1,10 @@ +#pragma once +using namespace std; + +class GuiMessage +{ +public: + wstring string; + int ticks; + GuiMessage(const wstring& string); +}; \ No newline at end of file diff --git a/Minecraft.Client/GuiParticle.cpp b/Minecraft.Client/GuiParticle.cpp new file mode 100644 index 00000000..25859c70 --- /dev/null +++ b/Minecraft.Client/GuiParticle.cpp @@ -0,0 +1,60 @@ +#include "stdafx.h" +#include "GuiParticle.h" +#include "..\Minecraft.World\Random.h" + +Random *GuiParticle::random = new Random(); + +GuiParticle::GuiParticle(double x, double y, double xa, double ya) +{ + // 4J - added initialisation block + removed = false; + life = 0; + a = 1; + oR = oG = oB = oA = 0; + + this->xo = this->x = x; + this->yo = this->y = y; + this->xa = xa; + this->ya = ya; + + int col = Color::HSBtoRGB(random->nextFloat(), 0.5f, 1); + r = ((col >> 16) & 0xff) / 255.0; + g = ((col >> 8) & 0xff) / 255.0; + b = ((col) & 0xff) / 255.0; + + friction = 1.0 / (random->nextDouble() * 0.05 + 1.01); + + lifeTime = (int) (10.0 / (random->nextDouble() * 2 + 0.1)); +} + +void GuiParticle::tick(GuiParticles *guiParticles) +{ + x += xa; + y += ya; + + xa *= friction; + ya *= friction; + + ya += 0.1; + if (++life > lifeTime) remove(); + a = 2 - (life / (double) lifeTime) * 2; + if (a > 1) a = 1; + a = a * a; + a *= 0.5; +} + +void GuiParticle::preTick() +{ + oR = r; + oG = g; + oB = b; + oA = a; + + xo = x; + yo = y; +} + +void GuiParticle::remove() +{ + removed = true; +} \ No newline at end of file diff --git a/Minecraft.Client/GuiParticle.h b/Minecraft.Client/GuiParticle.h new file mode 100644 index 00000000..27b14a69 --- /dev/null +++ b/Minecraft.Client/GuiParticle.h @@ -0,0 +1,25 @@ +#pragma once +class GuiParticles; +class Random; + +class GuiParticle +{ +private: + static Random *random; + +public: + double x, y; + double xo, yo; + double xa, ya; + double friction; + bool removed; + int life, lifeTime; + + double r, g, b, a; + double oR, oG, oB, oA; // MGH - remaned these, as PS3 complained about "or" var name + + GuiParticle(double x, double y, double xa, double ya); + void tick(GuiParticles *guiParticles); + void preTick(); + void remove(); +}; \ No newline at end of file diff --git a/Minecraft.Client/GuiParticles.cpp b/Minecraft.Client/GuiParticles.cpp new file mode 100644 index 00000000..6716de7a --- /dev/null +++ b/Minecraft.Client/GuiParticles.cpp @@ -0,0 +1,56 @@ +#include "stdafx.h" +#include "GuiParticles.h" +#include "GuiParticle.h" +#include "Textures.h" + +GuiParticles::GuiParticles(Minecraft *mc) +{ + this->mc = mc; +} + +void GuiParticles::tick() +{ + for (unsigned int i = 0; i < particles.size(); i++) + { + GuiParticle *gp = particles[i]; + + gp->preTick(); + gp->tick(this); + + if (gp->removed) + { + particles.erase(particles.begin()+i); + i--; + } + } +} + +void GuiParticles::add(GuiParticle *guiParticle) +{ + particles.push_back(guiParticle); + guiParticle->preTick(); +} + +void GuiParticles::render(float a) +{ + // 4J Stu - Never used +#if 0 + mc->textures->bindTexture(L"/gui/particles.png"); + + AUTO_VAR(itEnd, particles.end()); + for (AUTO_VAR(it, particles.begin()); it != itEnd; it++) + { + GuiParticle *gp = *it; //particles[i]; + int xx = (int) (gp->xo + (gp->x - gp->xo) * a - 4); + int yy = (int) (gp->yo + (gp->y - gp->yo) * a - 4); + + float alpha = ((float) (gp->oA + (gp->a - gp->oA) * a)); + float r = ((float) (gp->oR + (gp->r - gp->oR) * a)); + float g = ((float) (gp->oG + (gp->g - gp->oG) * a)); + float b = ((float) (gp->oB + (gp->b - gp->oB) * a)); + + glColor4f(r, g, b, alpha); + blit(xx, yy, 8 * 5, 0, 8, 8); + } +#endif +} diff --git a/Minecraft.Client/GuiParticles.h b/Minecraft.Client/GuiParticles.h new file mode 100644 index 00000000..0fe31811 --- /dev/null +++ b/Minecraft.Client/GuiParticles.h @@ -0,0 +1,19 @@ +#pragma once +#include "GuiComponent.h" + +class GuiParticle; +class Minecraft; +using namespace std; + +class GuiParticles : public GuiComponent +{ +private: + vector particles; + Minecraft *mc; + +public: + GuiParticles(Minecraft *mc); + void tick(); + void add(GuiParticle *guiParticle); + void render(float a); +}; diff --git a/Minecraft.Client/HeartParticle.cpp b/Minecraft.Client/HeartParticle.cpp new file mode 100644 index 00000000..24576c6b --- /dev/null +++ b/Minecraft.Client/HeartParticle.cpp @@ -0,0 +1,66 @@ +#include "stdafx.h" +#include "HeartParticle.h" + +// 4J - added +void HeartParticle::init(Level *level, double x, double y, double z, double xa, double ya, double za, float scale) +{ + xd *= 0.01f; + yd *= 0.01f; + zd *= 0.01f; + yd += 0.1; + + size *= 0.75f; + size *= scale; + oSize = size; + + lifetime = 16; + noPhysics = false; + + + setMiscTex(16 * 5); +} + +HeartParticle::HeartParticle(Level *level, double x, double y, double z, double xa, double ya, double za) : Particle(level, x, y, z, 0, 0, 0) +{ + init(level, x, y, z, xa, ya, za, 2); +} + +HeartParticle::HeartParticle(Level *level, double x, double y, double z, double xa, double ya, double za, float scale) : Particle(level, x, y, z, 0, 0, 0) +{ + init(level,x,y,z,xa,ya,za,scale); +} + +void HeartParticle::render(Tesselator *t, float a, float xa, float ya, float za, float xa2, float za2) +{ + float l = ((age + a) / lifetime) * 32; + if (l < 0) l = 0; + if (l > 1) l = 1; + + size = oSize * l; + Particle::render(t, a, xa, ya, za, xa2, za2); +} + +void HeartParticle::tick() +{ + xo = x; + yo = y; + zo = z; + + if (age++ >= lifetime) remove(); + + move(xd, yd, zd); + if (y == yo) + { + xd *= 1.1; + zd *= 1.1; + } + xd *= 0.86f; + yd *= 0.86f; + zd *= 0.86f; + + if (onGround) + { + xd *= 0.7f; + zd *= 0.7f; + } +} \ No newline at end of file diff --git a/Minecraft.Client/HeartParticle.h b/Minecraft.Client/HeartParticle.h new file mode 100644 index 00000000..f249325e --- /dev/null +++ b/Minecraft.Client/HeartParticle.h @@ -0,0 +1,19 @@ +#pragma once +#include "Particle.h" + +class HeartParticle : public Particle +{ +public: + virtual eINSTANCEOF GetType() { return eType_HEARTPARTICLE; } +private: + void init(Level *level, double x, double y, double z, double xa, double ya, double za, float scale); // 4J added +public: + HeartParticle(Level *level, double x, double y, double z, double xa, double ya, double za); + + float oSize; + + HeartParticle(Level *level, double x, double y, double z, double xa, double ya, double za, float scale); + + virtual void render(Tesselator *t, float a, float xa, float ya, float za, float xa2, float za2); + virtual void tick(); +}; diff --git a/Minecraft.Client/HorseRenderer.cpp b/Minecraft.Client/HorseRenderer.cpp new file mode 100644 index 00000000..ab2bfcdb --- /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,-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/HttpTexture.cpp b/Minecraft.Client/HttpTexture.cpp new file mode 100644 index 00000000..0f452e87 --- /dev/null +++ b/Minecraft.Client/HttpTexture.cpp @@ -0,0 +1,12 @@ +#include "stdafx.h" +#include "HttpTexture.h" + +HttpTexture::HttpTexture(const wstring& _url, HttpTextureProcessor *processor) +{ + // 4J - added + count = 1; + id = -1; + isLoaded = false; + + // 4J - TODO - actually implement +} \ No newline at end of file diff --git a/Minecraft.Client/HttpTexture.h b/Minecraft.Client/HttpTexture.h new file mode 100644 index 00000000..469ef6cb --- /dev/null +++ b/Minecraft.Client/HttpTexture.h @@ -0,0 +1,14 @@ +#pragma once +class BufferedImage; +class HttpTextureProcessor; +using namespace std; + +class HttpTexture { +public: + BufferedImage *loadedImage; + int count; + int id; + bool isLoaded; + + HttpTexture(const wstring& _url, HttpTextureProcessor *processor); +}; \ No newline at end of file diff --git a/Minecraft.Client/HttpTextureProcessor.h b/Minecraft.Client/HttpTextureProcessor.h new file mode 100644 index 00000000..a585a034 --- /dev/null +++ b/Minecraft.Client/HttpTextureProcessor.h @@ -0,0 +1,8 @@ +#pragma once +class BufferedImage; + +class HttpTextureProcessor +{ +public: + virtual BufferedImage *process(BufferedImage *read) = 0; +}; \ No newline at end of file diff --git a/Minecraft.Client/HugeExplosionParticle.cpp b/Minecraft.Client/HugeExplosionParticle.cpp new file mode 100644 index 00000000..2a104c19 --- /dev/null +++ b/Minecraft.Client/HugeExplosionParticle.cpp @@ -0,0 +1,85 @@ +#include "stdafx.h" +#include "HugeExplosionParticle.h" +#include "..\Minecraft.World\Random.h" +#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) +{ + life = 0; + + this->textures = textures; + lifeTime = 6 + random->nextInt(4); + + // rCol = gCol = bCol = random->nextFloat() * 0.6f + 0.4f; + + unsigned int clr = Minecraft::GetInstance()->getColourTable()->getColor( eMinecraftColour_Particle_HugeExplosion ); //0x999999 + double r = ( (clr>>16)&0xFF )/255.0f, g = ( (clr>>8)&0xFF )/255.0, b = ( clr&0xFF )/255.0; + + double br = random->nextFloat() * 0.6 + 0.4; + rCol = r * br; + gCol = g * br; + bCol = b * br; + + size = 1 - (float) xa * 0.5f; +} + +void HugeExplosionParticle::render(Tesselator *t, float a, float xa, float ya, float za, float xa2, float za2) +{ + int tex = (int) ((life + a) * 15 / lifeTime); + if (tex > 15) return; + textures->bindTexture(&EXPLOSION_LOCATION); + + float u0 = (tex % 4) / 4.0f; + float u1 = u0 + 0.999f / 4.0f; + float v0 = (tex / 4) / 4.0f; + float v1 = v0 + 0.999f / 4.0f; + + float r = 2.0f * size; + + 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); + + // 4J - don't render explosion particles that are less than 3 metres away, to try and avoid large particles that are causing us problems with photosensitivity testing + float distSq = (x*x + y*y + z*z); + if( distSq < ( 3.0f * 3.0f )) return; + + glColor4f(1, 1, 1, 1); + glDisable(GL_LIGHTING); + Lighting::turnOff(); + t->begin(); + t->color(rCol, gCol, bCol, 1.0f); + t->normal(0, 1, 0); + t->tex2(0x00f0); + 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); + t->end(); + glPolygonOffset(0, 0.0f); + glEnable(GL_LIGHTING); +} + +int HugeExplosionParticle::getLightColor(float a) +{ + return 0xf0f0; +} + +void HugeExplosionParticle::tick() +{ + xo = x; + yo = y; + zo = z; + life++; + if (life == lifeTime) remove(); +} + +int HugeExplosionParticle::getParticleTexture() +{ + return ParticleEngine::ENTITY_PARTICLE_TEXTURE; +} \ No newline at end of file diff --git a/Minecraft.Client/HugeExplosionParticle.h b/Minecraft.Client/HugeExplosionParticle.h new file mode 100644 index 00000000..5c386d63 --- /dev/null +++ b/Minecraft.Client/HugeExplosionParticle.h @@ -0,0 +1,21 @@ +#pragma once + +#include "Particle.h" + +class HugeExplosionParticle : public Particle +{ +private: + static ResourceLocation EXPLOSION_LOCATION; + int life; + int lifeTime; + Textures *textures; + float size; + +public: + virtual eINSTANCEOF GetType() { return eType_HUGEEXPLOSIONPARTICLE; } + HugeExplosionParticle(Textures *textures, Level *level, double x, double y, double z, double xa, double ya, double za); + void render(Tesselator *t, float a, float xa, float ya, float za, float xa2, float za2); + int getLightColor(float a); + void tick(); + int getParticleTexture(); +}; \ No newline at end of file diff --git a/Minecraft.Client/HugeExplosionSeedParticle.cpp b/Minecraft.Client/HugeExplosionSeedParticle.cpp new file mode 100644 index 00000000..7514cc44 --- /dev/null +++ b/Minecraft.Client/HugeExplosionSeedParticle.cpp @@ -0,0 +1,37 @@ +#include "stdafx.h" +#include "HugeExplosionSeedParticle.h" +#include "..\Minecraft.World\Random.h" +#include "..\Minecraft.World\net.minecraft.world.level.h" + +HugeExplosionSeedParticle::HugeExplosionSeedParticle(Level *level, double x, double y, double z, double xa, double ya, double za) : Particle(level,x,y,z,0,0,0) +{ + life = 0; + + lifeTime = 8; +} + +void HugeExplosionSeedParticle::render(Tesselator *t, float a, float xa, float ya, float za, float xa2, float za2) +{ +} + +void HugeExplosionSeedParticle::tick() +{ + // 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. + Minecraft::GetInstance()->animateTickLevel = level; + for (int i = 0; i < 6; i++) { + double xx = x + (random->nextDouble() - random->nextDouble()) * 4; + double yy = y + (random->nextDouble() - random->nextDouble()) * 4; + double zz = z + (random->nextDouble() - random->nextDouble()) * 4; + level->addParticle(eParticleType_largeexplode, xx, yy, zz, life / (float) lifeTime, 0, 0); + } + Minecraft::GetInstance()->animateTickLevel = NULL; + life++; + if (life == lifeTime) remove(); +} + +int HugeExplosionSeedParticle::getParticleTexture() +{ + return ParticleEngine::TERRAIN_TEXTURE; +} \ No newline at end of file diff --git a/Minecraft.Client/HugeExplosionSeedParticle.h b/Minecraft.Client/HugeExplosionSeedParticle.h new file mode 100644 index 00000000..445c8a34 --- /dev/null +++ b/Minecraft.Client/HugeExplosionSeedParticle.h @@ -0,0 +1,17 @@ +#pragma once + +#include "Particle.h" + +class HugeExplosionSeedParticle : public Particle +{ +private: + int life; + int lifeTime; + +public: + virtual eINSTANCEOF GetType() { return eType_HUGEEXPLOSIONSEEDPARTICLE; } + HugeExplosionSeedParticle(Level *level, double x, double y, double z, double xa, double ya, double za); + void render(Tesselator *t, float a, float xa, float ya, float za, float xa2, float za2); + void tick(); + int getParticleTexture(); +}; \ No newline at end of file diff --git a/Minecraft.Client/HumanoidMobRenderer.cpp b/Minecraft.Client/HumanoidMobRenderer.cpp new file mode 100644 index 00000000..a9ff25c4 --- /dev/null +++ b/Minecraft.Client/HumanoidMobRenderer.cpp @@ -0,0 +1,294 @@ +#include "stdafx.h" +#include "HumanoidMobRenderer.h" +#include "SkullTileRenderer.h" +#include "HumanoidModel.h" +#include "ModelPart.h" +#include "EntityRenderDispatcher.h" +#include "..\Minecraft.World\net.minecraft.world.item.h" +#include "..\Minecraft.World\net.minecraft.world.level.tile.h" +#include "..\Minecraft.World\net.minecraft.world.entity.h" +#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) +{ + _init(humanoidModel, 1.0f); +} + +HumanoidMobRenderer::HumanoidMobRenderer(HumanoidModel *humanoidModel, float shadow, float scale) : MobRenderer(humanoidModel, shadow) +{ + _init(humanoidModel, scale); +} + +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() +{ + armorParts1 = new HumanoidModel(1.0f); + armorParts2 = new HumanoidModel(0.5f); +} + +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 headGear = mob->getArmor(3); + + if (headGear != NULL) + { + // don't render the pumpkin of skulls for the skins with that disabled + // 4J-PB - need to disable rendering armour/skulls/pumpkins for some special skins (Daleks) + + if((mob->getAnimOverrideBitmask()&(1<head->translateTo(1 / 16.0f); + + if (headGear->getItem()->id < 256) + { + if (Tile::tiles[headGear->id] != NULL && TileRenderer::canRender(Tile::tiles[headGear->id]->getRenderShape())) + { + float s = 10 / 16.0f; + glTranslatef(-0 / 16.0f, -4 / 16.0f, 0 / 16.0f); + glRotatef(90, 0, 1, 0); + glScalef(s, -s, -s); + } + + this->entityRenderDispatcher->itemInHandRenderer->renderItem(mob, headGear, 0); + } + else if (headGear->getItem()->id == Item::skull_Id) + { + float s = 17 / 16.0f; + glScalef(s, -s, -s); + + wstring extra = L""; + if (headGear->hasTag() && headGear->getTag()->contains(L"SkullOwner")) + { + extra = headGear->getTag()->getString(L"SkullOwner"); + } + SkullTileRenderer::instance->renderSkull(-0.5f, 0, -0.5f, Facing::UP, 180, headGear->getAuxValue(), extra); + } + + glPopMatrix(); + } + } + + 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); + } + + 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())) + { + 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; + 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); + } + + this->entityRenderDispatcher->itemInHandRenderer->renderItem(mob, item, 0); + if (item->getItem()->hasMultipleSpriteLayers()) + { + this->entityRenderDispatcher->itemInHandRenderer->renderItem(mob, item, 1); + } + + glPopMatrix(); + } + +} + +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 new file mode 100644 index 00000000..98d8b8db --- /dev/null +++ b/Minecraft.Client/HumanoidMobRenderer.h @@ -0,0 +1,38 @@ +#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; + HumanoidModel *armorParts1; + HumanoidModel *armorParts2; + + 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 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 new file mode 100644 index 00000000..05d132fa --- /dev/null +++ b/Minecraft.Client/HumanoidModel.cpp @@ -0,0 +1,497 @@ +#include "stdafx.h" +#include "HumanoidModel.h" +#include "..\Minecraft.World\Mth.h" +#include "..\Minecraft.World\Entity.h" +#include "ModelPart.h" + +// 4J added + +ModelPart * HumanoidModel::AddOrRetrievePart(SKIN_BOX *pBox) +{ + ModelPart *pAttachTo=NULL; + + switch(pBox->ePart) + { + case eBodyPart_Head: + pAttachTo=head; + break; + case eBodyPart_Body: + pAttachTo=body; + break; + case eBodyPart_Arm0: + pAttachTo=arm0; + break; + case eBodyPart_Arm1: + pAttachTo=arm1; + break; + case eBodyPart_Leg0: + pAttachTo=leg0; + break; + case eBodyPart_Leg1: + pAttachTo=leg1; + break; + } + + // first check this box doesn't already exist + ModelPart *pNewBox = pAttachTo->retrieveChild(pBox); + + if(pNewBox) + { + if((pNewBox->getfU()!=(int)pBox->fU) || (pNewBox->getfV()!=(int)pBox->fV)) + { + app.DebugPrintf("HumanoidModel::AddOrRetrievePart - Box geometry was found, but with different uvs\n"); + pNewBox=NULL; + } + } + if(pNewBox==NULL) + { + //app.DebugPrintf("HumanoidModel::AddOrRetrievePart - Adding box to model part\n"); + + pNewBox = new ModelPart(this, (int)pBox->fU, (int)pBox->fV); + pNewBox->visible=false; + pNewBox->addHumanoidBox(pBox->fX, pBox->fY, pBox->fZ, pBox->fW, pBox->fH, pBox->fD, 0); + // 4J-PB - don't compile here, since the lighting isn't set up. It'll be compiled on first use. + //pNewBox->compile(1.0f/16.0f); + pAttachTo->addChild(pNewBox); + } + + return pNewBox; +} + +void HumanoidModel::_init(float g, float yOffset, int texWidth, int texHeight) +{ + this->texWidth = texWidth; + this->texHeight = texHeight; + + m_fYOffset=yOffset; + cloak = new ModelPart(this, 0, 0); + cloak->addHumanoidBox(-5, -0, -1, 10, 16, 1, g); // Cloak + + ear = new ModelPart(this, 24, 0); + ear->addHumanoidBox(-3, -6, -1, 6, 6, 1, g); // Ear + + head = new ModelPart(this, 0, 0); + head->addHumanoidBox(-4, -8, -4, 8, 8, 8, g); // Head + head->setPos(0, 0 + yOffset, 0); + + hair = new ModelPart(this, 32, 0); + hair->addHumanoidBox(-4, -8, -4, 8, 8, 8, g + 0.5f); // Head + hair->setPos(0, 0 + yOffset, 0); + + body = new ModelPart(this, 16, 16); + body->addHumanoidBox(-4, 0, -2, 8, 12, 4, g); // Body + body->setPos(0, 0 + yOffset, 0); + + arm0 = new ModelPart(this, 24 + 16, 16); + arm0->addHumanoidBox(-3, -2, -2, 4, 12, 4, g); // Arm0 + arm0->setPos(-5, 2 + yOffset, 0); + + arm1 = new ModelPart(this, 24 + 16, 16); + arm1->bMirror = true; + arm1->addHumanoidBox(-1, -2, -2, 4, 12, 4, g); // Arm1 + arm1->setPos(5, 2 + yOffset, 0); + + leg0 = new ModelPart(this, 0, 16); + leg0->addHumanoidBox(-2, 0, -2, 4, 12, 4, g); // Leg0 + leg0->setPos(-1.9, 12 + yOffset, 0); + + leg1 = new ModelPart(this, 0, 16); + leg1->bMirror = true; + leg1->addHumanoidBox(-2, 0, -2, 4, 12, 4, g); // Leg1 + leg1->setPos(1.9, 12 + yOffset, 0); + + // 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 + cloak->compile(1.0f/16.0f); + ear->compile(1.0f/16.0f); + head->compile(1.0f/16.0f); + body->compile(1.0f/16.0f); + arm0->compile(1.0f/16.0f); + arm1->compile(1.0f/16.0f); + leg0->compile(1.0f/16.0f); + leg1->compile(1.0f/16.0f); + hair->compile(1.0f/16.0f); + + holdingLeftHand=0; + holdingRightHand=0; + sneaking=false; + idle=false; + bowAndArrow=false; + + // 4J added + eating = false; + eating_t = 0.0f; + eating_swing = 0.0f; + m_uiAnimOverrideBitmask = 0L; +} + +HumanoidModel::HumanoidModel() : Model() +{ + _init(0, 0, 64, 32); +} + +HumanoidModel::HumanoidModel(float g) : Model() +{ + _init(g, 0, 64, 32); +} + +HumanoidModel::HumanoidModel(float g, float yOffset, int texWidth, int texHeight) : Model() +{ + _init(g,yOffset,texWidth,texHeight); +} + +void HumanoidModel::render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) +{ + if(entity != NULL) + { + m_uiAnimOverrideBitmask=entity->getAnimOverrideBitmask(); + } + + setupAnim(time, r, bob, yRot, xRot, scale, entity, m_uiAnimOverrideBitmask); + + if (young) + { + float ss = 2.0f; + glPushMatrix(); + glScalef(1.5f / ss, 1.5f / ss, 1.5f / ss); + glTranslatef(0, 16 * scale, 0); + head->render(scale, usecompiled); + glPopMatrix(); + glPushMatrix(); + glScalef(1 / ss, 1 / ss, 1 / ss); + glTranslatef(0, 24 * scale, 0); + body->render(scale, usecompiled); + arm0->render(scale, usecompiled); + arm1->render(scale, usecompiled); + leg0->render(scale, usecompiled); + leg1->render(scale, usecompiled); + hair->render(scale, usecompiled); + glPopMatrix(); + } + else + { + head->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); + body->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); + arm0->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); + arm1->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); + leg0->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); + leg1->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); + hair->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); + } +} + +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); + + { + head->yRot = yRot / (float) (180.0f / PI); + 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? + + if(uiBitmaskOverrideAnim&(1<xRot=0.0f; + arm1->xRot=0.0f; + arm0->zRot = 0.0f; + arm1->zRot = 0.0f; + + } + else if(uiBitmaskOverrideAnim&(1<xRot=-HALF_PI; + arm1->xRot=-HALF_PI; + arm0->zRot = 0.0f; + arm1->zRot = 0.0f; + } + else if(uiBitmaskOverrideAnim&(1<xRot = (Mth::cos(time * 0.6662f + PI) * 2.0f) * r * 0.5f; + arm1->xRot = (Mth::cos(time * 0.6662f + PI) * 2.0f) * r * 0.5f; + arm0->zRot = 0.0f; + arm1->zRot = 0.0f; + } + // 4J-PB - Weeping Angel - does't look good holding something in the arm that's up + else if((uiBitmaskOverrideAnim&(1<xRot = -PI; + arm0->zRot = -0.3f; + arm1->xRot = ( Mth::cos(time * 0.6662f) * 2.0f) * r * 0.5f; + arm1->zRot = 0.0f; + } + else + { + arm0->xRot = (Mth::cos(time * 0.6662f + PI) * 2.0f) * r * 0.5f; + arm1->xRot = ( Mth::cos(time * 0.6662f) * 2.0f) * r * 0.5f; + arm0->zRot = 0.0f; + arm1->zRot = 0.0f; + } + // arm0.zRot = ((float) (util.Mth.cos(time * 0.2312f) + 1) * 1) * r; + + + // arm1.zRot = ((float) (util.Mth.cos(time * 0.2812f) - 1) * 1) * r; + + + leg0->yRot = 0.0f; + leg1->yRot = 0.0f; + + if (riding) + { + 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 ) + { + leg0->xRot = -HALF_PI; + leg1->xRot = -HALF_PI; + leg0->yRot = HALF_PI * 0.2f; + leg1->yRot = -HALF_PI * 0.2f; + } + else if(uiBitmaskOverrideAnim&(1<xRot=0.0f; + leg0->zRot=0.0f; + leg1->xRot=0.0f; + leg1->zRot=0.0f; + leg0->yRot = 0.0f; + leg1->yRot = 0.0f; + } + else if(uiBitmaskOverrideAnim&(1<xRot = ( Mth::cos(time * 0.6662f) * 1.4f) * r; + leg1->xRot = ( Mth::cos(time * 0.6662f) * 1.4f) * r; + } + else + { + leg0->xRot = ( Mth::cos(time * 0.6662f) * 1.4f) * r; + leg1->xRot = ( Mth::cos(time * 0.6662f + PI) * 1.4f) * r; + } + + + if (holdingLeftHand != 0) + { + arm1->xRot = arm1->xRot * 0.5f - HALF_PI * 0.2f * holdingLeftHand; + } + if (holdingRightHand != 0) + { + arm0->xRot = arm0->xRot * 0.5f - HALF_PI * 0.2f * holdingRightHand; + } + + arm0->yRot = 0.0f; + arm1->yRot = 0.0f; + if (attackTime > -9990.0f) + { + float swing = attackTime; + body->yRot = Mth::sin(sqrt(swing) * PI * 2.0f) * 0.2f; + arm0->z = Mth::sin(body->yRot) * 5.0f; + arm0->x = -Mth::cos(body->yRot) * 5.0f; + arm1->z = -Mth::sin(body->yRot) * 5.0f; + arm1->x = Mth::cos(body->yRot) * 5.0f; + arm0->yRot += body->yRot; + arm1->yRot += body->yRot; + arm1->xRot += body->yRot; + + swing = 1.0f - attackTime; + swing *= swing; + swing *= swing; + swing = 1.0f - swing; + float aa = Mth::sin(swing * PI); + float bb = Mth::sin(attackTime * PI) * -(head->xRot - 0.7f) * 0.75f; + arm0->xRot -= aa * 1.2f + bb; // 4J - changed 1.2 -> 1.2f + arm0->yRot += body->yRot * 2.0f; + + if((uiBitmaskOverrideAnim&(1<zRot -= Mth::sin(attackTime * PI) * -0.4f; + } + else + { + arm0->zRot = Mth::sin(attackTime * PI) * -0.4f; + } + } + + // 4J added + if( eating ) + { + // These factors are largely lifted from ItemInHandRenderer to try and keep the 3rd person eating animation as similar as possible + float is = 1 - eating_swing; + is = is * is * is; + is = is * is * is; + is = is * is * is; + float iss = 1 - is; + arm0->xRot = - Mth::abs(Mth::cos(eating_t / 4.0f * PI) * 0.1f) * (eating_swing > 0.2 ? 1.0f : 0.0f) * 2.0f; // This factor is the chomping bit (conditional factor is so that he doesn't eat whilst the food is being pulled away at the end) + arm0->yRot -= iss * 0.5f; // This factor and the following to the general arm movement through the life of the swing + arm0->xRot -= iss * 1.2f; + + } + + if (sneaking) + { + 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 + { + body->xRot = 0.0f; + leg0->z = 0.1f; + leg1->z = 0.1f; + + if(!riding && idle) + { + leg0->y = 22.0f; + leg1->y = 22.0f; + body->y = 10.0f; + arm0->y = 12.0f; + arm1->y = 12.0f; + head->y = 10.0f; + hair->y = 10.0f; + ear->y = 11.0f; + cloak->y = 10.0f; + } + else + { + leg0->y = 12.0f; + leg1->y = 12.0f; + body->y = 0.0f; + arm0->y = 2.0f; + arm1->y = 2.0f; + head->y = 0.0f; + hair->y = 0.0f; + ear->y = 1.0f; + cloak->y = 0.0f; + } + } + + + arm0->zRot += ((Mth::cos(bob * 0.09f)) * 0.05f + 0.05f); + arm1->zRot -= ((Mth::cos(bob * 0.09f)) * 0.05f + 0.05f); + arm0->xRot += ((Mth::sin(bob * 0.067f)) * 0.05f); + arm1->xRot -= ((Mth::sin(bob * 0.067f)) * 0.05f); + + if (bowAndArrow) + { + float attack2 = 0.0f; + float attack = 0.0f; + + arm0->zRot = 0.0f; + arm1->zRot = 0.0f; + arm0->yRot = -(0.1f - attack2 * 0.6f) + head->yRot; + arm1->yRot = +(0.1f - attack2 * 0.6f) + head->yRot + 0.4f; + arm0->xRot = -HALF_PI + head->xRot; + arm1->xRot = -HALF_PI + head->xRot; + arm0->xRot -= attack2 * 1.2f - attack * 0.4f; + arm1->xRot -= attack2 * 1.2f - attack * 0.4f; + arm0->zRot += ((float) (Mth::cos(bob * 0.09f)) * 0.05f + 0.05f); + arm1->zRot -= ((float) (Mth::cos(bob * 0.09f)) * 0.05f + 0.05f); + arm0->xRot += ((float) (Mth::sin(bob * 0.067f)) * 0.05f); + arm1->xRot -= ((float) (Mth::sin(bob * 0.067f)) * 0.05f); + } + } +} + +void HumanoidModel::renderHair(float scale,bool usecompiled) +{ + hair->yRot = head->yRot; + hair->xRot = head->xRot; + hair->render(scale,usecompiled); +} + +void HumanoidModel::renderEars(float scale,bool usecompiled) +{ + ear->yRot = head->yRot; + ear->xRot = head->xRot; + ear->x=0; + ear->y=0; + ear->render(scale,usecompiled); +} + +void HumanoidModel::renderCloak(float scale,bool usecompiled) +{ + cloak->render(scale,usecompiled); +} + +void HumanoidModel::render(HumanoidModel *model, float scale, bool usecompiled) +{ + head->yRot = model->head->yRot; + head->y = model->head->y; + head->xRot = model->head->xRot; + hair->y = head->y; + hair->yRot = head->yRot; + hair->xRot = head->xRot; + + body->yRot = model->body->yRot; + + arm0->xRot = model->arm0->xRot; + arm0->yRot = model->arm0->yRot; + arm0->zRot = model->arm0->zRot; + + arm1->xRot = model->arm1->xRot; + arm1->yRot = model->arm1->yRot; + arm1->zRot = model->arm1->zRot; + + leg0->xRot = model->leg0->xRot; + leg1->xRot = model->leg1->xRot; + + head->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); + body->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); + arm0->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); + arm1->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); + leg0->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); + leg1->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); + hair->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<0); +} diff --git a/Minecraft.Client/HumanoidModel.h b/Minecraft.Client/HumanoidModel.h new file mode 100644 index 00000000..52f9d98e --- /dev/null +++ b/Minecraft.Client/HumanoidModel.h @@ -0,0 +1,66 @@ +#pragma once +#include "Model.h" + +class HumanoidModel : public Model +{ +public: + ModelPart *head, *hair, *body, *arm0, *arm1, *leg0, *leg1, *ear, *cloak; + //ModelPart *hat; + + int holdingLeftHand; + int holdingRightHand; + bool idle; + bool sneaking; + bool bowAndArrow; + bool eating; // 4J added + float eating_t; // 4J added + float eating_swing; // 4J added + unsigned int m_uiAnimOverrideBitmask; // 4J added + float m_fYOffset; // 4J added + enum animbits + { + eAnim_ArmsDown =0, + eAnim_ArmsOutFront, + eAnim_NoLegAnim, + eAnim_HasIdle, + eAnim_ForceAnim, // Claptrap looks bad if the user turns off custom skin anim + // 4J-PB - DaveK wants Fish characters to move both legs in the same way + eAnim_SingleLegs, + eAnim_SingleArms, + eAnim_StatueOfLiberty, // Dr Who Weeping Angel + eAnim_DontRenderArmour, // Dr Who Daleks + eAnim_NoBobbing, // Dr Who Daleks + eAnim_DisableRenderHead, + eAnim_DisableRenderArm0, + eAnim_DisableRenderArm1, + eAnim_DisableRenderTorso, + eAnim_DisableRenderLeg0, + eAnim_DisableRenderLeg1, + eAnim_DisableRenderHair, + eAnim_SmallModel // Maggie Simpson for riding horse, etc + + }; + + static const unsigned int m_staticBitmaskIgnorePlayerCustomAnimSetting= (1< 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); + void renderHair(float scale, bool usecompiled); + void renderEars(float scale, bool usecompiled); + void renderCloak(float scale, bool usecompiled); + void render(HumanoidModel *model, float scale, bool usecompiled); + +// Add new bits to models + ModelPart * AddOrRetrievePart(SKIN_BOX *pBox); +}; diff --git a/Minecraft.Client/InBedChatScreen.cpp b/Minecraft.Client/InBedChatScreen.cpp new file mode 100644 index 00000000..fca3d022 --- /dev/null +++ b/Minecraft.Client/InBedChatScreen.cpp @@ -0,0 +1,70 @@ +#include "stdafx.h" +#include "InBedChatScreen.h" +#include "Button.h" +#include "MultiplayerLocalPlayer.h" +#include "..\Minecraft.World\net.minecraft.locale.h" +#include "..\Minecraft.World\StringHelpers.h" + +void InBedChatScreen::init() +{ + Keyboard::enableRepeatEvents(true); + + Language *language = Language::getInstance(); + + buttons.push_back(new Button(WAKE_UP_BUTTON, width / 2 - 100, height - 40, language->getElement(L"multiplayer.stopSleeping"))); + +} + +void InBedChatScreen::removed() +{ + Keyboard::enableRepeatEvents(false); +} + +void InBedChatScreen::keyPressed(wchar_t ch, int eventKey) +{ + if (eventKey == Keyboard::KEY_ESCAPE) + { + sendWakeUp(); + } + else if (eventKey == Keyboard::KEY_RETURN) + { + wstring msg = trimString(message); + if (msg.length() > 0) + { + minecraft->player->chat(trimString(message)); + } + message = L""; + } + else + { + ChatScreen::keyPressed(ch, eventKey); + } +} + +void InBedChatScreen::render(int xm, int ym, float a) +{ + ChatScreen::render(xm, ym, a); +} + +void InBedChatScreen::buttonClicked(Button *button) +{ + if (button->id == WAKE_UP_BUTTON) + { + sendWakeUp(); + } + else + { + ChatScreen::buttonClicked(button); + } +} + +void InBedChatScreen::sendWakeUp() +{ + /* 4J - TODO + if (minecraft.player instanceof MultiplayerLocalPlayer) + { + ClientConnection connection = ((MultiplayerLocalPlayer) minecraft.player).connection; + connection.send(new PlayerCommandPacket(minecraft.player, PlayerCommandPacket.STOP_SLEEPING)); + } + */ +} \ No newline at end of file diff --git a/Minecraft.Client/InBedChatScreen.h b/Minecraft.Client/InBedChatScreen.h new file mode 100644 index 00000000..84bfd681 --- /dev/null +++ b/Minecraft.Client/InBedChatScreen.h @@ -0,0 +1,20 @@ +#pragma once + +#include "ChatScreen.h" + +class InBedChatScreen : public ChatScreen +{ +private: + static const int WAKE_UP_BUTTON = 1; +public: + virtual void init(); + virtual void removed(); +protected: + virtual void keyPressed(wchar_t ch, int eventKey); +public: + virtual void render(int xm, int ym, float a); +protected: + virtual void buttonClicked(Button *button); +private: + void sendWakeUp(); +}; \ No newline at end of file diff --git a/Minecraft.Client/Input.cpp b/Minecraft.Client/Input.cpp new file mode 100644 index 00000000..080f2e81 --- /dev/null +++ b/Minecraft.Client/Input.cpp @@ -0,0 +1,118 @@ +#include "stdafx.h" +#include "Minecraft.h" +#include "GameMode.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.storage.h" +#include "Input.h" +#include "..\Minecraft.Client\LocalPlayer.h" +#include "Options.h" + +Input::Input() +{ + xa = 0; + ya = 0; + wasJumping = false; + jumping = false; + sneaking = false; + + lReset = false; + rReset = false; +} + +void Input::tick(LocalPlayer *player) +{ + // 4J Stu - Assume that we only need one input class, even though the java has subclasses for keyboard/controller + // This function is based on the ControllerInput class in the Java, and will probably need changed + //OutputDebugString("INPUT: Beginning input tick\n"); + + Minecraft *pMinecraft=Minecraft::GetInstance(); + int iPad=player->GetXboxPad(); + + // 4J-PB minecraft movement seems to be the wrong way round, so invert x! + if( pMinecraft->localgameModes[iPad]->isInputAllowed(MINECRAFT_ACTION_LEFT) || pMinecraft->localgameModes[iPad]->isInputAllowed(MINECRAFT_ACTION_RIGHT) ) + xa = -InputManager.GetJoypadStick_LX(iPad); + else + xa = 0.0f; + + if( pMinecraft->localgameModes[iPad]->isInputAllowed(MINECRAFT_ACTION_FORWARD) || pMinecraft->localgameModes[iPad]->isInputAllowed(MINECRAFT_ACTION_BACKWARD) ) + ya = InputManager.GetJoypadStick_LY(iPad); + else + ya = 0.0f; + +#ifndef _CONTENT_PACKAGE + if (app.GetFreezePlayers()) + { + xa = ya = 0.0f; + player->abilities.flying = true; + } +#endif + + if (!lReset) + { + if (xa*xa+ya*ya==0.0f) + { + lReset = true; + } + xa = ya = 0.0f; + } + + // 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)) + { + sneaking=!sneaking; + } + } + + if(sneaking) + { + xa*=0.3f; + ya*=0.3f; + } + + float turnSpeed = 50.0f; + + float tx = 0.0f; + float ty = 0.0f; + if( pMinecraft->localgameModes[iPad]->isInputAllowed(MINECRAFT_ACTION_LOOK_LEFT) || pMinecraft->localgameModes[iPad]->isInputAllowed(MINECRAFT_ACTION_LOOK_RIGHT) ) + tx = InputManager.GetJoypadStick_RX(iPad)*(((float)app.GetGameSettings(iPad,eGameSetting_Sensitivity_InGame))/100.0f); // apply sensitivity to look + if( pMinecraft->localgameModes[iPad]->isInputAllowed(MINECRAFT_ACTION_LOOK_UP) || pMinecraft->localgameModes[iPad]->isInputAllowed(MINECRAFT_ACTION_LOOK_DOWN) ) + ty = InputManager.GetJoypadStick_RY(iPad)*(((float)app.GetGameSettings(iPad,eGameSetting_Sensitivity_InGame))/100.0f); // apply sensitivity to look + +#ifndef _CONTENT_PACKAGE + if (app.GetFreezePlayers()) tx = ty = 0.0f; +#endif + + // 4J: WESTY : Invert look Y if required. + if ( app.GetGameSettings(iPad,eGameSetting_ControlInvertLook) ) + { + ty = -ty; + } + + if (!rReset) + { + if (tx*tx+ty*ty==0.0f) + { + rReset = true; + } + tx = ty = 0.0f; + } + player->interpolateTurn(tx * abs(tx) * turnSpeed, ty * abs(ty) * turnSpeed); + + //jumping = controller.isButtonPressed(0); + + + unsigned int jump = InputManager.GetValue(iPad, MINECRAFT_ACTION_JUMP); + if( jump > 0 && pMinecraft->localgameModes[iPad]->isInputAllowed(MINECRAFT_ACTION_JUMP) ) + jumping = true; + else + jumping = false; + +#ifndef _CONTENT_PACKAGE + if (app.GetFreezePlayers()) jumping = false; +#endif + + //OutputDebugString("INPUT: End input tick\n"); +} \ No newline at end of file diff --git a/Minecraft.Client/Input.h b/Minecraft.Client/Input.h new file mode 100644 index 00000000..0a44d765 --- /dev/null +++ b/Minecraft.Client/Input.h @@ -0,0 +1,22 @@ +#pragma once +class Player; + +class Input +{ +public: + float xa; + float ya; + + bool wasJumping; + bool jumping; + bool sneaking; + + Input(); // 4J - added + + virtual void tick(LocalPlayer *player); + +private: + + bool lReset; + bool rReset; +}; \ No newline at end of file diff --git a/Minecraft.Client/InventoryScreen.cpp b/Minecraft.Client/InventoryScreen.cpp new file mode 100644 index 00000000..726a5e8d --- /dev/null +++ b/Minecraft.Client/InventoryScreen.cpp @@ -0,0 +1,96 @@ +#include "stdafx.h" +#include "InventoryScreen.h" +#include "MultiplayerLocalPlayer.h" +#include "Font.h" +#include "EntityRenderDispatcher.h" +#include "Lighting.h" +#include "Textures.h" +#include "Button.h" +#include "AchievementScreen.h" +#include "StatsScreen.h" +#include "..\Minecraft.World\net.minecraft.stats.h" + +InventoryScreen::InventoryScreen(shared_ptr player) : AbstractContainerScreen(player->inventoryMenu) +{ + xMouse = yMouse = 0.0f; // 4J added + + this->passEvents = true; + player->awardStat(GenericStats::openInventory(), GenericStats::param_noArgs()); +} + +void InventoryScreen::init() +{ + buttons.clear(); +} + +void InventoryScreen::renderLabels() +{ + font->draw(L"Crafting", 84 + 2, 8 * 2, 0x404040); +} + +void InventoryScreen::render(int xm, int ym, float a) +{ + AbstractContainerScreen::render(xm, ym, a); + this->xMouse = (float)xm; + this->yMouse = (float)ym; +} + +void InventoryScreen::renderBg(float a) +{ + // 4J Unused +#if 0 + int tex = minecraft->textures->loadTexture(L"/gui/inventory.png"); + glColor4f(1, 1, 1, 1); + minecraft->textures->bind(tex); + int xo = (width - imageWidth) / 2; + int yo = (height - imageHeight) / 2; + this->blit(xo, yo, 0, 0, imageWidth, imageHeight); + + glEnable(GL_RESCALE_NORMAL); + glEnable(GL_COLOR_MATERIAL); + + glPushMatrix(); + glTranslatef((float)xo + 51, (float)yo + 75, 50); + float ss = 30; + glScalef(-ss, ss, ss); + glRotatef(180, 0, 0, 1); + + float oybr = minecraft->player->yBodyRot; + float oyr = minecraft->player->yRot; + float oxr = minecraft->player->xRot; + + float xd = (xo + 51) - xMouse; + float yd = (yo + 75 - 50) - yMouse; + + glRotatef(45 + 90, 0, 1, 0); + Lighting::turnOn(); + glRotatef(-45 - 90, 0, 1, 0); + + glRotatef(-(float) atan(yd / 40.0f) * 20, 1, 0, 0); + + minecraft->player->yBodyRot = (float) atan(xd / 40.0f) * 20; + minecraft->player->yRot = (float) atan(xd / 40.0f) * 40; + minecraft->player->xRot = -(float) atan(yd / 40.0f) * 20; + glTranslatef(0, minecraft->player->heightOffset, 0); + EntityRenderDispatcher::instance->playerRotY = 180; + EntityRenderDispatcher::instance->render(minecraft->player, 0, 0, 0, 0, 1); + minecraft->player->yBodyRot = oybr; + minecraft->player->yRot = oyr; + minecraft->player->xRot = oxr; + glPopMatrix(); + Lighting::turnOff(); + glDisable(GL_RESCALE_NORMAL); +#endif +} + +void InventoryScreen::buttonClicked(Button *button) +{ + if (button->id == 0) + { + minecraft->setScreen(new AchievementScreen(minecraft->stats[minecraft->player->GetXboxPad()])); + } + if (button->id == 1) + { + minecraft->setScreen(new StatsScreen(this, minecraft->stats[minecraft->player->GetXboxPad()])); + } +} diff --git a/Minecraft.Client/InventoryScreen.h b/Minecraft.Client/InventoryScreen.h new file mode 100644 index 00000000..c39edfe0 --- /dev/null +++ b/Minecraft.Client/InventoryScreen.h @@ -0,0 +1,20 @@ +#pragma once +#include "AbstractContainerScreen.h" +class Player; +class Button; + +class InventoryScreen : public AbstractContainerScreen +{ +public: + InventoryScreen(shared_ptr player); + virtual void init(); +protected: + virtual void renderLabels(); +private: + float xMouse, yMouse; +public: + virtual void render(int xm, int ym, float a); +protected: + virtual void renderBg(float a); + virtual void buttonClicked(Button *button); +}; \ No newline at end of file diff --git a/Minecraft.Client/ItemFrameRenderer.cpp b/Minecraft.Client/ItemFrameRenderer.cpp new file mode 100644 index 00000000..2d7493ec --- /dev/null +++ b/Minecraft.Client/ItemFrameRenderer.cpp @@ -0,0 +1,187 @@ +#include "stdafx.h" +#include "ItemRenderer.h" +#include "tileRenderer.h" +#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" +#include "..\Minecraft.World\net.minecraft.world.Item.h" +#include "..\Minecraft.World\net.minecraft.world.Item.alchemy.h" +#include "..\Minecraft.World\net.minecraft.world.level.tile.h" +#include "..\Minecraft.World\StringHelpers.h" +#include "Minecraft.h" +#include "..\Minecraft.World\Item.h" +#include "..\Minecraft.World\net.minecraft.world.h" +#include "..\Minecraft.World\net.minecraft.h" +#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"); +} + +void ItemFrameRenderer::render(shared_ptr _itemframe, double x, double y, double z, float rot, float a) +{ + // 4J - original version used generics and thus had an input parameter of type EnderCrystal rather than shared_ptr we have here - + // do some casting around instead + shared_ptr itemFrame = dynamic_pointer_cast(_itemframe); + + glPushMatrix(); + float xOffs = (float) (itemFrame->x - x) - 0.5f; + float yOffs = (float) (itemFrame->y - y) - 0.5f; + float zOffs = (float) (itemFrame->z - z) - 0.5f; + + int xt = itemFrame->xTile + Direction::STEP_X[itemFrame->dir]; + int yt = itemFrame->yTile; + int zt = itemFrame->zTile + Direction::STEP_Z[itemFrame->dir]; + + glTranslatef((float) xt - xOffs, (float) yt - yOffs, (float) zt - zOffs); + + drawFrame(itemFrame); + drawItem(itemFrame); + + glPopMatrix(); +} + + +void ItemFrameRenderer::drawFrame(shared_ptr itemFrame) +{ + Minecraft *pMinecraft=Minecraft::GetInstance(); + + glPushMatrix(); + entityRenderDispatcher->textures->bindTexture(&TextureAtlas::LOCATION_BLOCKS); + glRotatef(itemFrame->yRot, 0, 1, 0); + + Tile *wood = Tile::wood; + float depth = 1.0f / 16.0f; + float width = 12.0f / 16.0f; + float widthHalf = width / 2.0f; + + // Back + glPushMatrix(); + + tileRenderer->setFixedShape(0, 0.5f - widthHalf + 1.0f / 16.0f, 0.5f - widthHalf + 1.0f / 16.0f, depth * .5f, 0.5f + widthHalf - 1.0f / 16.0f, 0.5f + widthHalf - 1.0f / 16.0f); + tileRenderer->setFixedTexture(backTexture); + tileRenderer->renderTile(wood, 0, 1); + tileRenderer->clearFixedTexture(); + tileRenderer->clearFixedShape(); + glPopMatrix(); + + tileRenderer->setFixedTexture(Tile::wood->getTexture(Facing::UP, TreeTile::BIRCH_TRUNK)); + + // Bottom + glPushMatrix(); + tileRenderer->setFixedShape(0, 0.5f - widthHalf, 0.5f - widthHalf, depth + 0.0001f, depth + 0.5f - widthHalf, 0.5f + widthHalf); + tileRenderer->renderTile(wood, 0, 1); + glPopMatrix(); + + // Top + glPushMatrix(); + tileRenderer->setFixedShape(0, 0.5f + widthHalf - depth, 0.5f - widthHalf, depth + 0.0001f, 0.5f + widthHalf, 0.5f + widthHalf); + tileRenderer->renderTile(wood, 0, 1); + glPopMatrix(); + + // Right + glPushMatrix(); + tileRenderer->setFixedShape(0, 0.5f - widthHalf, 0.5f - widthHalf, depth, 0.5f + widthHalf, depth + 0.5f - widthHalf); + tileRenderer->renderTile(wood, 0, 1); + glPopMatrix(); + + // Left + glPushMatrix(); + tileRenderer->setFixedShape(0, 0.5f - widthHalf, 0.5f + widthHalf - depth, depth, 0.5f + widthHalf, 0.5f + widthHalf); + tileRenderer->renderTile(wood, 0, 1); + glPopMatrix(); + + tileRenderer->clearFixedShape(); + tileRenderer->clearFixedTexture(); + + glPopMatrix(); +} + +void ItemFrameRenderer::drawItem(shared_ptr entity) +{ + Minecraft *pMinecraft=Minecraft::GetInstance(); + + shared_ptr instance = entity->getItem(); + if (instance == NULL) return; + + shared_ptr itemEntity = shared_ptr(new ItemEntity(entity->level, 0, 0, 0, instance)); + itemEntity->getItem()->count = 1; + itemEntity->bobOffs = 0; + + glPushMatrix(); + + glTranslatef((-7.25f / 16.0f) * Direction::STEP_X[entity->dir], -0.18f, (-7.25f / 16.0f) * Direction::STEP_Z[entity->dir]); + glRotatef(180 + entity->yRot, 0, 1, 0); + glRotatef(-90 * entity->getRotation(), 0, 0, 1); + + switch (entity->getRotation()) + { + case 1: + glTranslatef(-0.16f, -0.16f, 0); + break; + case 2: + glTranslatef(0, -0.32f, 0); + break; + case 3: + glTranslatef(0.16f, -0.16f, 0); + break; + } + + if (itemEntity->getItem()->getItem() == Item::map) + { + entityRenderDispatcher->textures->bindTexture(&MAP_BACKGROUND_LOCATION); + Tesselator *t = Tesselator::getInstance(); + + glRotatef(180, 0, 1, 0); + glRotatef(180, 0, 0, 1); + glScalef(1.0f / 256.0f, 1.0f / 256.0f, 1.0f / 256.0f); + glTranslatef(-65, -107, -3); + glNormal3f(0, 0, -1); + t->begin(); + int vo = 7; + t->vertexUV(0 - vo, 128 + vo, 0, 0, 1); + t->vertexUV(128 + vo, 128 + vo, 0, 1, 1); + t->vertexUV(128 + vo, 0 - vo, 0, 1, 0); + t->vertexUV(0 - vo, 0 - vo, 0, 0, 0); + t->end(); + + shared_ptr data = Item::map->getSavedData(itemEntity->getItem(), entity->level); + if (data != NULL) + { + entityRenderDispatcher->itemInHandRenderer->minimap->render(nullptr, entityRenderDispatcher->textures, data, entity->entityId); + } + } + else + { + if (itemEntity->getItem()->getItem() == Item::compass) + { + CompassTexture *ct = CompassTexture::instance; + double compassRot = ct->rot; + double compassRotA = ct->rota; + ct->rot = 0; + ct->rota = 0; + ct->updateFromPosition(entity->level, entity->x, entity->z, Mth::wrapDegrees( (float)(180 + entity->dir * 90) ), false, true); + ct->rot = compassRot; + ct->rota = compassRotA; + } + + EntityRenderDispatcher::instance->render(itemEntity, 0, 0, 0, 0, 0, true); + + if (itemEntity->getItem()->getItem() == Item::compass) + { + CompassTexture *ct = CompassTexture::instance; + ct->cycleFrames(); + } + } + + glPopMatrix(); +} + diff --git a/Minecraft.Client/ItemFrameRenderer.h b/Minecraft.Client/ItemFrameRenderer.h new file mode 100644 index 00000000..a6eea8f4 --- /dev/null +++ b/Minecraft.Client/ItemFrameRenderer.h @@ -0,0 +1,17 @@ +#pragma once +#include "EntityRenderer.h" + +class ItemFrameRenderer : public EntityRenderer +{ +private: + static ResourceLocation MAP_BACKGROUND_LOCATION; + Icon *backTexture; + +public: + void registerTerrainTextures(IconRegister *iconRegister); + virtual void render(shared_ptr _itemframe, double x, double y, double z, float rot, float a); + +private: + void drawFrame(shared_ptr itemFrame); + void drawItem(shared_ptr entity); +}; diff --git a/Minecraft.Client/ItemInHandRenderer.cpp b/Minecraft.Client/ItemInHandRenderer.cpp new file mode 100644 index 00000000..1e1ca1dd --- /dev/null +++ b/Minecraft.Client/ItemInHandRenderer.cpp @@ -0,0 +1,942 @@ +#include "stdafx.h" +#include "ItemInHandRenderer.h" +#include "TileRenderer.h" +#include "Tesselator.h" +#include "Textures.h" +#include "TextureAtlas.h" +#include "EntityRenderer.h" +#include "PlayerRenderer.h" +#include "EntityRenderDispatcher.h" +#include "Lighting.h" +#include "MultiplayerLocalPlayer.h" +#include "Minimap.h" +#include "MultiPlayerLevel.h" +#include "..\Minecraft.World\net.minecraft.world.item.h" +#include "..\Minecraft.World\net.minecraft.world.level.tile.h" +#include "..\Minecraft.World\net.minecraft.world.entity.h" +#include "..\Minecraft.World\net.minecraft.world.entity.player.h" +#include "..\Minecraft.World\net.minecraft.world.level.h" +#include "..\Minecraft.World\net.minecraft.world.h" + +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 *minecraft, bool optimisedMinimap) +{ + // 4J - added + height = 0; + oHeight = 0; + selectedItem = nullptr; + tileRenderer = new TileRenderer(); + lastSlot = -1; + + 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( listItem == -1 ) + { + listItem = MemoryTracker::genLists(1); + float dd = 1 / 16.0f; + + glNewList(listItem, 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) / 256.0f; + u += 0.5f / 256.0f; + v += 0.5f / 256.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(); + } + + // 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 ) + { + listGlint = MemoryTracker::genLists(1); + float dd = 1 / 16.0f; + + glNewList(listGlint, GL_COMPILE); + glDepthFunc(GL_EQUAL); + Tesselator *t = Tesselator::getInstance(); + t->begin(); + for( int yp = 0; yp < 16; yp++ ) + for( int xp = 0; xp < 16; xp++ ) + { + float u0 = (15-xp) / 16.0f; + float v0 = (15-yp) / 16.0f; + float u1 = u0 - (1.0f/16.0f); + float v1 = v0 - (1.0f/16.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; + + float br = 0.76f; + t->color(0.5f * br, 0.25f * br, 0.8f * br, 1.0f); // MGH - added the color here, as the glColour below wasn't making it through to render + + t->normal(0, 0, 1); + t->vertexUV(x0, y0, z0, u0, v0); + t->vertexUV(x1, y0, z0, u1, v0); + t->vertexUV(x1, y1, z0, u1, v1); + t->vertexUV(x0, y1, z0, u0, v1); + t->normal(0, 0, -1); + t->vertexUV(x0, y1, z1, u0, v1); + t->vertexUV(x1, y1, z1, u1, v1); + t->vertexUV(x1, y0, z1, u1, v0); + t->vertexUV(x0, y0, z1, u0, v0); + t->normal(-1, 0, 0); + t->vertexUV(x0, y0, z1, u0, v0); + t->vertexUV(x0, y0, z0, u0, v0); + t->vertexUV(x0, y1, z0, u0, v1); + t->vertexUV(x0, y1, z1, u0, v1); + t->normal(1, 0, 0); + t->vertexUV(x1, y1, z1, u1, v1); + t->vertexUV(x1, y1, z0, u1, v1); + t->vertexUV(x1, y0, z0, u1, v0); + t->vertexUV(x1, y0, z1, u1, v0); + t->normal(0, 1, 0); + t->vertexUV(x1, y0, z0, u1, v0); + t->vertexUV(x0, y0, z0, u0, v0); + t->vertexUV(x0, y0, z1, u0, v0); + t->vertexUV(x1, y0, z1, u1, v0); + t->normal(0, -1, 0); + t->vertexUV(x1, y1, z1, u1, v1); + t->vertexUV(x0, y1, z1, u0, v1); + t->vertexUV(x0, y1, z0, u0, v1); + t->vertexUV(x1, y1, z0, u1, v1); + } + t->end(); + glDepthFunc(GL_LEQUAL); + glEndList(); + } + +} + +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. + if ( (setColor) && (item != NULL) ) + { + int col = Item::items[item->id]->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); + } + + glPushMatrix(); + Tile *tile = Tile::tiles[item->id]; + if (item->getIconType() == Icon::TYPE_TERRAIN && tile != NULL && TileRenderer::canRender(tile->getRenderShape())) + { + MemSect(31); + minecraft->textures->bindTexture(minecraft->textures->getTextureLocation(Icon::TYPE_TERRAIN)); + MemSect(0); + 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 + { + MemSect(31); + Icon *icon = mob->getItemInHandIcon(item, layer); + if (icon == NULL) + { + glPopMatrix(); + MemSect(0); + return; + } + + bool bIsTerrain = item->getIconType() == Icon::TYPE_TERRAIN; + minecraft->textures->bindTexture(minecraft->textures->getTextureLocation(item->getIconType())); + + MemSect(0); + Tesselator *t = Tesselator::getInstance(); + + // Consider forcing the mipmap LOD level to use, if this is to be rendered from a larger than standard source texture. + int iconWidth = icon->getWidth(); + int LOD = -1; // Default to not doing anything special with LOD forcing + if( iconWidth == 32 ) + { + LOD = 1; // Force LOD level 1 to achieve texture reads from 256x256 map + } + else if( iconWidth == 64 ) + { + LOD = 2; // Force LOD level 2 to achieve texture reads from 256x256 map + } + RenderManager.StateSetForceLOD(LOD); + + // 4J Original comment + // Yes, these are backwards. + // No, I don't know why. + // 4J Stu - Make them the right way round...u coords were swapped + float u0 = icon->getU0(); + float u1 = icon->getU1(); + float v0 = icon->getV0(); + float v1 = icon->getV1(); + + float xo = 0.0f; + float yo = 0.3f; + + glEnable(GL_RESCALE_NORMAL); + glTranslatef(-xo, -yo, 0); + float s = 1.5f; + glScalef(s, s, s); + + glRotatef(50, 0, 1, 0); + glRotatef(45 + 290, 0, 0, 1); + glTranslatef(-15 / 16.0f, -1 / 16.0f, 0); + float dd = 1 / 16.0f; + + 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); + minecraft->textures->bindTexture(&ENCHANT_GLINT_LOCATION); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_COLOR, GL_ONE); + float br = 0.76f; + glColor4f(0.5f * br, 0.25f * br, 0.8f * br, 1); // MGH - for some reason this colour isn't making it through to the render, so I've added to the tesselator for the glint geom above + glMatrixMode(GL_TEXTURE); + glPushMatrix(); + float ss = 1 / 8.0f; + glScalef(ss, ss, ss); + float sx = Minecraft::currentTimeMillis() % (3000) / (3000.0f) * 8; + glTranslatef(sx, 0, 0); + glRotatef(-50, 0, 0, 1); + + renderItem3D(t, 0, 0, 1, 1, 256, 256, 1 / 16.0f, true, bIsTerrain); + glPopMatrix(); + glPushMatrix(); + glScalef(ss, ss, ss); + sx = System::currentTimeMillis() % (3000 + 1873) / (3000 + 1873.0f) * 8; + glTranslatef(-sx, 0, 0); + glRotatef(10, 0, 0, 1); + renderItem3D(t, 0, 0, 1, 1, 256, 256, 1 / 16.0f, true, bIsTerrain); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); + glDisable(GL_BLEND); + glEnable(GL_LIGHTING); + glDepthFunc(GL_LEQUAL); + } + + RenderManager.StateSetForceLOD(-1); + + glDisable(GL_RESCALE_NORMAL); + } + glPopMatrix(); +} + +// 4J added useList parameter +void ItemInHandRenderer::renderItem3D(Tesselator *t, float u0, float v0, float u1, float v1, int width, int height, float depth, bool isGlint, bool isTerrain) +{ + float r = 1.0f; + + // 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 + + if( isGlint ) + { + glCallList(listGlint); + } + else + { + // 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 + + glMatrixMode(GL_TEXTURE); + glLoadIdentity(); + glTranslatef(u0, v0, 0); + glCallList(isTerrain? listTerrain : listItem); + glLoadIdentity(); + glMatrixMode(GL_MODELVIEW); + } + // 4J added since we are setting the colour to other values at the start of the function now + glColor4f(1.0f,1.0f,1.0f,1.0f); +} + +void ItemInHandRenderer::render(float a) +{ + float h = oHeight + (height - oHeight) * a; + 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; + float fudgeY = 0.0f; + float fudgeZ = 0.0f; + bool splitHoriz = false; + shared_ptr localPlayer = dynamic_pointer_cast(player); + if( localPlayer ) + { + if( localPlayer->m_iScreenSection == C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM || + localPlayer->m_iScreenSection == C4JRender::VIEWPORT_TYPE_SPLIT_TOP ) + { + fudgeY = 0.08f; + splitHoriz = true; + } + else if( localPlayer->m_iScreenSection == C4JRender::VIEWPORT_TYPE_SPLIT_LEFT || + localPlayer->m_iScreenSection == C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT ) + { + fudgeX = -0.18f; + } + } + + float xr = player->xRotO + (player->xRot - player->xRotO) * a; + + glPushMatrix(); + glRotatef(xr, 1, 0, 0); + glRotatef(player->yRotO + (player->yRot - player->yRotO) * a, 0, 1, 0); + Lighting::turnOn(); + glPopMatrix(); + + if (localPlayer) + { + float xrr = localPlayer->xBobO + (localPlayer->xBob - localPlayer->xBobO) * a; + float yrr = localPlayer->yBobO + (localPlayer->yBob - localPlayer->yBobO) * a; + // 4J - was using player->xRot and yRot directly here rather than interpolating between old & current with a + float yr = player->yRotO + (player->yRot - player->yRotO) * a; + glRotatef((xr - xrr) * 0.1f, 1, 0, 0); + glRotatef((yr - yrr) * 0.1f, 0, 1, 0); + } + + shared_ptr item = selectedItem; + + 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 = 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); + glColor4f(1, 1, 1, 1); + } + if (item != NULL) + { + int col = Item::items[item->id]->getColor(item,0); + float red = ((col >> 16) & 0xff) / 255.0f; + float g = ((col >> 8) & 0xff) / 255.0f; + float b = ((col) & 0xff) / 255.0f; + + glColor4f(br * red, br * g, br * b, 1); + } + else + { + glColor4f(br, br, br, 1); + } + + if (item != NULL && item->id == Item::map->id) + { + glPushMatrix(); + float d = 0.8f; + + // 4J - move the map away a bit if we're in horizontal split screen, so it doesn't clip out of the save zone + if( splitHoriz ) + { + glTranslatef(0.0f, 0.0f, -0.3f ); + } + + { + float swing = player->getAttackAnim(a); + + float swing1 = Mth::sin(swing * PI); + float swing2 = Mth::sin((sqrt(swing)) * PI); + glTranslatef(-swing2 * 0.4f, Mth::sin(sqrt(swing) * PI * 2) * 0.2f, -swing1 * 0.2f); + } + + float tilt = 1 - xr / 45.0f + 0.1f; + if (tilt < 0) tilt = 0; + if (tilt > 1) tilt = 1; + tilt = -Mth::cos(tilt * PI) * 0.5f + 0.5f; + + glTranslatef(0.0f, 0.0f * d - (1 - h) * 1.2f - tilt * 0.5f + 0.04f, -0.9f * d); + + glRotatef(90, 0, 1, 0); + glRotatef((tilt) * -85, 0, 0, 1); + glEnable(GL_RESCALE_NORMAL); + + + { + // 4J-PB - if we've got a player texture, use that + //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; + glPushMatrix(); + + glTranslatef(-0.0f, -0.6f, 1.1f * flip); + glRotatef((float)(-45 * flip), 1, 0, 0); + glRotatef(-90, 0, 0, 1); + glRotatef(59, 0, 0, 1); + glRotatef((float)(-65 * flip), 0, 1, 0); + + EntityRenderer *er = EntityRenderDispatcher::instance->getRenderer(minecraft->player); + PlayerRenderer *playerRenderer = (PlayerRenderer *) er; + float ss = 1; + glScalef(ss, ss, ss); + + // Can't turn off the hand if the player is holding a map + shared_ptr itemInstance = player->inventory->getSelected(); + if ((itemInstance && (itemInstance->getItem()->id==Item::map_Id)) || app.GetGameSettings(localPlayer->GetXboxPad(),eGameSetting_DisplayHand)!=0 ) + { + playerRenderer->renderHand(); + } + glPopMatrix(); + } + } + + { + float swing = player->getAttackAnim(a); + float swing3 = Mth::sin(swing * swing * PI); + float swing2 = Mth::sin(sqrt(swing) * PI); + glRotatef(-swing3 * 20, 0, 1, 0); + glRotatef(-swing2 * 20, 0, 0, 1); + glRotatef(-swing2 * 80, 1, 0, 0); + } + + float ss = 0.38f; + glScalef(ss, ss, ss); + + glRotatef(90, 0, 1, 0); + glRotatef(180, 0, 0, 1); + + glTranslatef(-1, -1, +0); + + float s = 2 / 128.0f; + glScalef(s, s, s); + + MemSect(31); + minecraft->textures->bindTexture(&MAP_BACKGROUND_LOCATION); // 4J was L"/misc/mapbg.png" + MemSect(0); + Tesselator *t = Tesselator::getInstance(); + +// glNormal3f(0, 0, -1); // 4J - changed to use tesselator + t->begin(); + int vo = 7; + t->normal(0,0,-1); + t->vertexUV((float)(0 - vo), (float)( 128 + vo), (float)( 0), (float)( 0), (float)( 1)); + t->vertexUV((float)(128 + vo), (float)( 128 + vo), (float)( 0), (float)( 1), (float)( 1)); + t->vertexUV((float)(128 + vo), (float)( 0 - vo), (float)( 0), (float)( 1), (float)( 0)); + t->vertexUV((float)(0 - vo), (float)( 0 - vo), (float)( 0), (float)( 0), (float)( 0)); + t->end(); + + shared_ptr data = Item::map->getSavedData(item, minecraft->level); + PIXBeginNamedEvent(0,"Minimap render"); + if(data != NULL) minimap->render(minecraft->player, minecraft->textures, data, minecraft->player->entityId); + PIXEndNamedEvent(); + + glPopMatrix(); + } + else if (item != NULL) + { + glPushMatrix(); + float d = 0.8f; + +#if defined __ORBIS__ || defined __PS3__ + static const float swingPowFactor = 1.0f; +#else + static const float swingPowFactor = 4.0f; // 4J added, to slow the swing down when nearest the player for avoiding luminance flash issues +#endif + if (player->getUseItemDuration() > 0) + { + UseAnim anim = item->getUseAnimation(); + if ( (anim == UseAnim_eat) || (anim == UseAnim_drink) ) + { + float t = (player->getUseItemDuration() - a + 1); + float swing = 1 - (t / item->getUseDuration()); + + float is = 1 - swing; + is = is * is * is; + is = is * is * is; + is = is * is * is; + float iss = 1 - is; + glTranslatef(0, Mth::abs(Mth::cos(t / 4 * PI) * 0.1f) * (swing > 0.2 ? 1 : 0), 0); + glTranslatef(iss * 0.6f, -iss * 0.5f, 0); + glRotatef(iss * 90, 0, 1, 0); + glRotatef(iss * 10, 1, 0, 0); + glRotatef(iss * 30, 0, 0, 1); + } + } + else + { + float swing = powf(player->getAttackAnim(a),swingPowFactor); + + float swing1 = Mth::sin(swing * PI); + float swing2 = Mth::sin((sqrt(swing)) * PI); + glTranslatef(-swing2 * 0.4f, Mth::sin(sqrt(swing) * PI * 2) * 0.2f, -swing1 * 0.2f); + + } + + glTranslatef(0.7f * d, -0.65f * d - (1 - h) * 0.6f, -0.9f * d); + glTranslatef(fudgeX, fudgeY, fudgeZ); // 4J added + + glRotatef(45, 0, 1, 0); + glEnable(GL_RESCALE_NORMAL); + + float swing = powf(player->getAttackAnim(a),swingPowFactor); + float swing3 = Mth::sin(swing * swing * PI); + float swing2 = Mth::sin(sqrt(swing) * PI); + glRotatef(-swing3 * 20, 0, 1, 0); + glRotatef(-swing2 * 20, 0, 0, 1); + glRotatef(-swing2 * 80, 1, 0, 0); + + float ss = 0.4f; + glScalef(ss, ss, ss); + + if (player->getUseItemDuration() > 0) + { + UseAnim anim = item->getUseAnimation(); + if (anim == UseAnim_block) + { + glTranslatef(-0.5f, 0.2f, 0.0f); + glRotatef(30, 0, 1, 0); + glRotatef(-80, 1, 0, 0); + glRotatef(60, 0, 1, 0); + } + else if (anim == UseAnim_bow) + { + + glRotatef(-18, 0, 0, 1); + glRotatef(-12, 0, 1, 0); + glRotatef(-8, 1, 0, 0); + glTranslatef(-0.9f, 0.2f, 0.0f); + float timeHeld = (item->getUseDuration() - (player->getUseItemDuration() - a + 1)); + float pow = timeHeld / (float) (BowItem::MAX_DRAW_DURATION); + pow = ((pow * pow) + pow * 2) / 3; + if (pow > 1) pow = 1; + if (pow > 0.1f) + { + glTranslatef(0, Mth::sin((timeHeld - 0.1f) * 1.3f) * 0.01f * (pow - 0.1f), 0); + } + glTranslatef(0, 0, pow * 0.1f); + + glRotatef(-45 - 290, 0, 0, 1); + glRotatef(-50, 0, 1, 0); + glTranslatef(0, 0.5f, 0); + float ys = 1 + pow * 0.2f; + glScalef(1, 1, ys); + glTranslatef(0, -0.5f, 0); + glRotatef(50, 0, 1, 0); + glRotatef(45 + 290, 0, 0, 1); + } + } + + + if (item->getItem()->isMirroredArt()) + { + glRotatef(180, 0, 1, 0); + } + + if (item->getItem()->hasMultipleSpriteLayers()) + { + // special case for potions, refactor this when we get more + // items that have two layers + renderItem(player, item, 0, false); + + int col = Item::items[item->id]->getColor(item, 1); + float red = ((col >> 16) & 0xff) / 255.0f; + float g = ((col >> 8) & 0xff) / 255.0f; + float b = ((col) & 0xff) / 255.0f; + + glColor4f(br * red, br * g, br * b, 1); + + renderItem(player, item, 1, false); + } + else + { + renderItem(player, item, 0, false); + } + glPopMatrix(); + } + else if (!player->isInvisible()) + { + glPushMatrix(); + float d = 0.8f; + + { + float swing = player->getAttackAnim(a); + + float swing1 = Mth::sin(swing * PI); + float swing2 = Mth::sin((sqrt(swing)) * PI); + glTranslatef(-swing2 * 0.3f, Mth::sin(sqrt(swing) * PI * 2) * 0.4f, -swing1 * 0.4f); + } + + glTranslatef(0.8f * d, -0.75f * d - (1 - h) * 0.6f, -0.9f * d); + glTranslatef(fudgeX, fudgeY, fudgeZ); // 4J added + + glRotatef(45, 0, 1, 0); + glEnable(GL_RESCALE_NORMAL); + { + float swing = player->getAttackAnim(a); + float swing3 = Mth::sin(swing * swing * PI); + float swing2 = Mth::sin(sqrt(swing) * PI); + glRotatef(swing2 * 70, 0, 1, 0); + glRotatef(-swing3 * 20, 0, 0, 1); + } + + // 4J-PB - if we've got a player texture, use that + + //glBindTexture(GL_TEXTURE_2D, minecraft->textures->loadHttpTexture(minecraft->player->customTextureUrl, minecraft->player->getTexture())); + + MemSect(31); + glBindTexture(GL_TEXTURE_2D, minecraft->textures->loadMemTexture(minecraft->player->customTextureUrl, minecraft->player->getTexture())); + MemSect(0); + minecraft->textures->clearLastBoundId(); + glTranslatef(-1.0f, +3.6f, +3.5f); + glRotatef(120, 0, 0, 1); + glRotatef(180 + 20, 1, 0, 0); + glRotatef(-90 - 45, 0, 1, 0); + 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(minecraft->player); + PlayerRenderer *playerRenderer = (PlayerRenderer *) er; + float ss = 1; + glScalef(ss, ss, ss); + MemSect(31); + // Can't turn off the hand if the player is holding a map + shared_ptr itemInstance = player->inventory->getSelected(); + + if ( (itemInstance && (itemInstance->getItem()->id==Item::map_Id)) || app.GetGameSettings(localPlayer->GetXboxPad(),eGameSetting_DisplayHand)!=0 ) + { + playerRenderer->renderHand(); + } + MemSect(0); + glPopMatrix(); + } + + glDisable(GL_RESCALE_NORMAL); + Lighting::turnOff(); + +} + +void ItemInHandRenderer::renderScreenEffect(float a) +{ + glDisable(GL_ALPHA_TEST); + if (minecraft->player->isOnFire()) + { + renderFire(a); + } + + if (minecraft->player->isInWall()) // Inside a tile + { + int x = Mth::floor(minecraft->player->x); + int y = Mth::floor(minecraft->player->y); + int z = Mth::floor(minecraft->player->z); + + int tile = minecraft->level->getTile(x, y, z); + if (minecraft->level->isSolidBlockingTile(x, y, z)) + { + renderTex(a, Tile::tiles[tile]->getTexture(2)); + } + else + { + for (int i = 0; i < 8; i++) + { + 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 (minecraft->level->isSolidBlockingTile(xt, yt, zt)) + { + tile = minecraft->level->getTile(xt, yt, zt); + } + } + } + + if (Tile::tiles[tile] != NULL) renderTex(a, Tile::tiles[tile]->getTexture(2)); + } + + if (minecraft->player->isUnderLiquid(Material::water)) + { + MemSect(31); + minecraft->textures->bindTexture(&UNDERWATER_LOCATION); // 4J was L"/misc/water.png" + MemSect(0); + renderWater(a); + } + glEnable(GL_ALPHA_TEST); + +} + +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; + br = 0.1f; + glColor4f(br, br, br, 0.5f); + + glPushMatrix(); + + float x0 = -1; + float x1 = +1; + float y0 = -1; + float y1 = +1; + float z0 = -0.5f; + + float r = 2 / 256.0f; + float u0 = slot->getU0(); + float u1 = slot->getU1(); + float v0 = slot->getV0(); + float v1 = slot->getV1(); + + t->begin(); + t->vertexUV((float)(x0), (float)( y0), (float)( z0), (float)( u1), (float)( v1)); + t->vertexUV((float)(x1), (float)( y0), (float)( z0), (float)( u0), (float)( v1)); + t->vertexUV((float)(x1), (float)( y1), (float)( z0), (float)( u0), (float)( v0)); + t->vertexUV((float)(x0), (float)( y1), (float)( z0), (float)( u1), (float)( v0)); + t->end(); + glPopMatrix(); + + glColor4f(1, 1, 1, 1); + +} + +void ItemInHandRenderer::renderWater(float a) +{ + minecraft->textures->bindTexture(&UNDERWATER_LOCATION); + + Tesselator *t = Tesselator::getInstance(); + + float br = minecraft->player->getBrightness(a); + glColor4f(br, br, br, 0.5f); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + glPushMatrix(); + + float size = 4; + + float x0 = -1; + float x1 = +1; + float y0 = -1; + float y1 = +1; + float z0 = -0.5f; + + 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)); + t->vertexUV((float)(x1), (float)( y0), (float)( z0), (float)( 0 + uo), (float)( size + vo)); + t->vertexUV((float)(x1), (float)( y1), (float)( z0), (float)( 0 + uo), (float)( 0 + vo)); + t->vertexUV((float)(x0), (float)( y1), (float)( z0), (float)( size + uo), (float)( 0 + vo)); + t->end(); + glPopMatrix(); + + glColor4f(1, 1, 1, 1); + glDisable(GL_BLEND); + +} + +void ItemInHandRenderer::renderFire(float a) +{ + Tesselator *t = Tesselator::getInstance(); + + 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); + + float size = 1; + for (int i = 0; i < 2; i++) + { + 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); + float v0 = slot->getV0(true); + float v1 = slot->getV1(true); + + float x0 = (0 - size) / 2; + float x1 = x0 + size; + float y0 = 0 - size / 2; + float y1 = y0 + size; + float z0 = -0.5f; + glTranslatef(-(i * 2 - 1) * 0.24f, -0.3f, 0); + glRotatef((i * 2 - 1) * 10.0f, 0, 1, 0); + + t->begin(); + t->vertexUV((float)(x0), (float)( y0), (float)( z0), (float)( u1), (float)( v1)); + t->vertexUV((float)(x1), (float)( y0), (float)( z0), (float)( u0), (float)( v1)); + t->vertexUV((float)(x1), (float)( y1), (float)( z0), (float)( u0), (float)( v0)); + t->vertexUV((float)(x0), (float)( y1), (float)( z0), (float)( u1), (float)( v0)); + t->end(); + glPopMatrix(); + } + glColor4f(1, 1, 1, 1); + glDisable(GL_BLEND); + +} + +void ItemInHandRenderer::tick() +{ + oHeight = height; + + + shared_ptr player = minecraft->player; + shared_ptr nextTile = player->inventory->getSelected(); + + bool matches = lastSlot == player->inventory->selected && nextTile == selectedItem; + if (selectedItem == NULL && nextTile == NULL) + { + matches = true; + } + if (nextTile != NULL && selectedItem != NULL && nextTile != selectedItem && nextTile->id == selectedItem->id && nextTile->getAuxValue() == selectedItem->getAuxValue()) + { + selectedItem = nextTile; + matches = true; + } + + float max = 0.4f; + float tHeight = matches ? 1.0f : 0; + float dd = tHeight - height; + if (dd < -max) dd = -max; + if (dd > max) dd = max; + + height += dd; + if (height < 0.1f) + { + selectedItem = nextTile; + lastSlot = player->inventory->selected; + } + +} + +void ItemInHandRenderer::itemPlaced() +{ + height = 0; +} + +void ItemInHandRenderer::itemUsed() +{ + height = 0; +} + diff --git a/Minecraft.Client/ItemInHandRenderer.h b/Minecraft.Client/ItemInHandRenderer.h new file mode 100644 index 00000000..b5d840a2 --- /dev/null +++ b/Minecraft.Client/ItemInHandRenderer.h @@ -0,0 +1,46 @@ +#pragma once + +class Minecraft; +class ItemInstance; +class Minimap; +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 *minecraft; + shared_ptr selectedItem; + float height; + float oHeight; + TileRenderer *tileRenderer; + static int listItem, listGlint, listTerrain; + +public: + // 4J Stu - Made public so we can use it from ItemFramRenderer + Minimap *minimap; + +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, bool isTerrain); // 4J added isGlint and isTerrain parameter +public: + void render(float a); + void renderScreenEffect(float a); +private: + void renderTex(float a, Icon *slot); + void renderWater(float a); + void renderFire(float a); + int lastSlot; +public: + void tick(); + void itemPlaced(); + void itemUsed(); +}; diff --git a/Minecraft.Client/ItemRenderer.cpp b/Minecraft.Client/ItemRenderer.cpp new file mode 100644 index 00000000..49e25060 --- /dev/null +++ b/Minecraft.Client/ItemRenderer.cpp @@ -0,0 +1,764 @@ +#include "stdafx.h" +#include "ItemRenderer.h" +#include "TileRenderer.h" +#include "entityRenderDispatcher.h" +#include "..\Minecraft.World\JavaMath.h" +#include "..\Minecraft.World\net.minecraft.world.entity.item.h" +#include "..\Minecraft.World\net.minecraft.world.item.h" +#include "..\Minecraft.World\net.minecraft.world.item.alchemy.h" +#include "..\Minecraft.World\net.minecraft.world.level.tile.h" +#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() +{ + random = new Random(); + setColor = true; + blitOffset = 0; + + shadowRadius = 0.15f; + shadowStrength = 0.75f; + + // 4J added + m_bItemFrame= false; +} + +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; + float spin = ((itemEntity->age + a) / 20.0f + itemEntity->bobOffs) * Mth::RADDEG; + + int count = 1; + 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); + + if (m_bItemFrame) + { + glScalef(1.25f, 1.25f, 1.25f); + glTranslatef(0, 0.05f, 0); + glRotatef(-90, 0, 1, 0); + } + + 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 ) + { + s = 0.5f; + } + + glScalef(s, s, s); + for (int i = 0; i < count; i++) + { + glPushMatrix(); + if (i > 0) + { + float xo = (random->nextFloat() * 2 - 1) * 0.2f / s; + float yo = (random->nextFloat() * 2 - 1) * 0.2f / s; + float zo = (random->nextFloat() * 2 - 1) * 0.2f / s; + glTranslatef(xo, yo, zo); + } + // 4J - change brought forward from 1.8.2 + float br = SharedConstants::TEXTURE_LIGHTING ? 1.0f : itemEntity->getBrightness(a); + tileRenderer->renderTile(tile, item->getAuxValue(), br); + glPopMatrix(); + } + } + else if (item->getIconType() == Icon::TYPE_ITEM && item->getItem()->hasMultipleSpriteLayers()) + { + if (m_bItemFrame) + { + glScalef(1 / 1.95f, 1 / 1.95f, 1 / 1.95f); + glTranslatef(0, -0.05f, 0); + glDisable(GL_LIGHTING); + } + else + { + glScalef(1 / 2.0f, 1 / 2.0f, 1 / 2.0f); + } + + bindTexture(&TextureAtlas::LOCATION_ITEMS); // 4J was "/gui/items.png" + + for (int layer = 0; layer <= 1; layer++) + { + random->setSeed(187); + Icon *icon = item->getItem()->getLayerIcon(item->getAuxValue(), layer); + float brightness = SharedConstants::TEXTURE_LIGHTING ? 1 : itemEntity->getBrightness(a); + if (setColor) + { + int col = Item::items[item->id]->getColor(item, layer); + 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, 1); + renderItemBillboard(itemEntity, icon, count, a, red * brightness, g * brightness, b * brightness); + } + else + { + renderItemBillboard(itemEntity, icon, count, a, 1, 1, 1); + } + } + } + else + { + if (m_bItemFrame) + { + glScalef(1 / 1.95f, 1 / 1.95f, 1 / 1.95f); + glTranslatef(0, -0.05f, 0); + glDisable(GL_LIGHTING); + } + else + { + glScalef(1 / 2.0f, 1 / 2.0f, 1 / 2.0f); + } + + // 4J Stu - For rendering the static compass, we give it a non-zero aux value + if(item->id == Item::compass_Id) item->setAuxValue(255); + if(item->id == Item::compass_Id) item->setAuxValue(0); + + Icon *icon = item->getIcon(); + if (setColor) + { + int col = Item::items[item->id]->getColor(item,0); + float red = ((col >> 16) & 0xff) / 255.0f; + float g = ((col >> 8) & 0xff) / 255.0f; + float b = ((col) & 0xff) / 255.0f; + float brightness = SharedConstants::TEXTURE_LIGHTING ? 1 : itemEntity->getBrightness(a); + + glColor4f(red * brightness, g * brightness, b * brightness, 1); + renderItemBillboard(itemEntity, icon, count, a, red * brightness, g * brightness, b * brightness); + } + else + { + renderItemBillboard(itemEntity, icon, count, a, 1, 1, 1); + } + + } + glDisable(GL_RESCALE_NORMAL); + glPopMatrix(); + if( m_bItemFrame ) + { + glEnable(GL_LIGHTING); + } +} + +void ItemRenderer::renderItemBillboard(shared_ptr entity, Icon *icon, int count, float a, float red, float green, float blue) +{ + Tesselator *t = Tesselator::getInstance(); + + if (icon == NULL) icon = entityRenderDispatcher->textures->getMissingIcon(entity->getItem()->getIconType()); + float u0 = icon->getU0(); + float u1 = icon->getU1(); + float v0 = icon->getV0(); + float v1 = icon->getV1(); + + float r = 1.0f; + float xo = 0.5f; + float yo = 0.25f; + + if (entityRenderDispatcher->options->fancyGraphics) + { + // Consider forcing the mipmap LOD level to use, if this is to be rendered from a larger than standard source texture. + int iconWidth = icon->getWidth(); + int LOD = -1; // Default to not doing anything special with LOD forcing + if( iconWidth == 32 ) + { + LOD = 1; // Force LOD level 1 to achieve texture reads from 256x256 map + } + else if( iconWidth == 64 ) + { + LOD = 2; // Force LOD level 2 to achieve texture reads from 256x256 map + } + RenderManager.StateSetForceLOD(LOD); + + glPushMatrix(); + if (m_bItemFrame) + { + glRotatef(180, 0, 1, 0); + } + else + { + glRotatef(((entity->age + a) / 20.0f + entity->bobOffs) * Mth::RADDEG, 0, 1, 0); + } + + float width = 1 / 16.0f; + float margin = 0.35f / 16.0f; + shared_ptr item = entity->getItem(); + int items = item->count; + + if (items < 2) + { + count = 1; + } + else if (items < 16) + { + count = 2; + } + else if (items < 32) + { + count = 3; + } + else + { + count = 4; + } + + glTranslatef(-xo, -yo, -((width + margin) * count / 2)); + + 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) + { + bIsTerrain = true; + bindTexture(&TextureAtlas::LOCATION_BLOCKS); // TODO: Do this sanely by Icon + } + else + { + 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, bIsTerrain); + + if (item != NULL && item->isFoil()) + { + glDepthFunc(GL_EQUAL); + glDisable(GL_LIGHTING); + entityRenderDispatcher->textures->bindTexture(&ItemInHandRenderer::ENCHANT_GLINT_LOCATION); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_COLOR, GL_ONE); + float br = 0.76f; + glColor4f(0.5f * br, 0.25f * br, 0.8f * br, 1); + glMatrixMode(GL_TEXTURE); + glPushMatrix(); + float ss = 1 / 8.0f; + glScalef(ss, ss, ss); + float sx = Minecraft::currentTimeMillis() % (3000) / (3000.0f) * 8; + glTranslatef(sx, 0, 0); + glRotatef(-50, 0, 0, 1); + + 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, bIsTerrain); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); + glDisable(GL_BLEND); + glEnable(GL_LIGHTING); + glDepthFunc(GL_LEQUAL); + } + } + + glPopMatrix(); + + RenderManager.StateSetForceLOD(-1); + } + else + { + for (int i = 0; i < count; i++) + { + glPushMatrix(); + if (i > 0) + { + float _xo = (random->nextFloat() * 2 - 1) * 0.3f; + float _yo = (random->nextFloat() * 2 - 1) * 0.3f; + float _zo = (random->nextFloat() * 2 - 1) * 0.3f; + glTranslatef(_xo, _yo, _zo); + } + if (!m_bItemFrame) glRotatef(180 - entityRenderDispatcher->playerRotY, 0, 1, 0); + glColor4f(red, green, blue, 1); + t->begin(); + t->normal(0, 1, 0); + t->vertexUV((float)(0 - xo), (float)( 0 - yo), (float)( 0), (float)( u0), (float)( v1)); + t->vertexUV((float)(r - xo), (float)( 0 - yo), (float)( 0), (float)( u1), (float)( v1)); + t->vertexUV((float)(r - xo), (float)( 1 - yo), (float)( 0), (float)( u1), (float)( v0)); + t->vertexUV((float)(0 - xo), (float)( 1 - yo), (float)( 0), (float)( u0), (float)( v0)); + t->end(); + + glPopMatrix(); + } +} +} + +void ItemRenderer::renderGuiItem(Font *font, Textures *textures, shared_ptr item, float x, float y, float fScale, float fAlpha) +{ + renderGuiItem(font,textures,item,x,y,fScale,fScale,fAlpha, true); +} + +// 4J - this used to take x and y as ints, and no scale and alpha - but this interface is now implemented as a wrapper round this more fully featured one +void ItemRenderer::renderGuiItem(Font *font, Textures *textures, shared_ptr item, float x, float y, float fScaleX,float fScaleY, float fAlpha, bool useCompiled) +{ + int itemId = item->id; + int itemAuxValue = item->getAuxValue(); + Icon *itemIcon = item->getIcon(); + + if (item->getIconType() == Icon::TYPE_TERRAIN && TileRenderer::canRender(Tile::tiles[itemId]->getRenderShape())) + { + PIXBeginNamedEvent(0,"3D gui item render %d\n",itemId); + MemSect(31); + textures->bindTexture(&TextureAtlas::LOCATION_BLOCKS); + MemSect(0); + + Tile *tile = Tile::tiles[itemId]; + glPushMatrix(); + // 4J - original code left here for reference +#if 0 + glTranslatef((float)(x), (float)(y), 0.0f); + glScalef(fScale, fScale, fScale); + glTranslatef(-2.0f,3.0f, -3.0f + blitOffset); + glScalef(10.0f, 10.0f, 10.0f); + glTranslatef(1.0f, 0.5f, 8.0f); + glScalef(1.0f, 1.0f, -1.0f); + glRotatef(180.0f + 30.0f, 1.0f, 0.0f, 0.0f); + glRotatef(45.0f, 0.0f, 1.0f, 0.0f); +#else + glTranslatef(x, y, 0.0f); // Translate to screen coords + glScalef(16.0f*fScaleX, 16.0f*fScaleY, 1.0f); // Scale to 0 to 16*scale range + glTranslatef(0.5f,0.5f,0.0f); // Translate to 0 to 1 range + glScalef(0.55f,0.55f, -1.0f); // Scale to occupy full -0.5 to 0.5 bounding region (just touching top & bottom) + // 0.55 comes from 1/(1+sqrt(2)/sqrt(3)) which is determined by the angles that the cube is rotated in an orthographic projection + glRotatef(180.0f + 30.0f, 1.0f, 0.0f, 0.0f); // Rotate round x axis (centre at origin) + glRotatef(45.0f, 0.0f, 1.0f, 0.0f); // Rotate round y axis (centre at origin) +#endif + // 4J-PB - pass the alpha value in - the grass block render has the top surface coloured differently to the rest of the block + glRotatef(-90.0f, 0.0f, 1.0f, 0.0f); + tileRenderer->renderTile(tile, itemAuxValue, 1, fAlpha, useCompiled); + + glPopMatrix(); + PIXEndNamedEvent(); + } + else if (Item::items[itemId]->hasMultipleSpriteLayers()) + { + PIXBeginNamedEvent(0,"Potion gui item render %d\n",itemIcon); + // special double-layered + glDisable(GL_LIGHTING); + + ResourceLocation *location = getTextureLocation(item->getIconType()); + textures->bindTexture(location); + + for (int layer = 0; layer <= 1; layer++) + { + Icon *fillingIcon = Item::items[itemId]->getLayerIcon(itemAuxValue, layer); + + int col = Item::items[itemId]->getColor(item, layer); + float r = ((col >> 16) & 0xff) / 255.0f; + float g = ((col >> 8) & 0xff) / 255.0f; + float b = ((col) & 0xff) / 255.0f; + + if (setColor) glColor4f(r, g, b, fAlpha); + // scale the x and y by the scale factor + if((fScaleX!=1.0f) ||(fScaleY!=1.0f)) + { + blit(x, y, fillingIcon, 16 * fScaleX, 16 * fScaleY); + } + else + { + blit((int)x, (int)y, fillingIcon, 16, 16); + } + } + glEnable(GL_LIGHTING); + PIXEndNamedEvent(); + } + else + { + PIXBeginNamedEvent(0,"2D gui item render %d\n",itemIcon); + glDisable(GL_LIGHTING); + MemSect(31); + if (item->getIconType() == Icon::TYPE_TERRAIN) + { + textures->bindTexture(&TextureAtlas::LOCATION_BLOCKS);//L"/terrain.png")); + } + else + { + 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 + g_pD3DDevice->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR ); +#endif + + } + MemSect(0); + + if (itemIcon == NULL) + { + itemIcon = textures->getMissingIcon(item->getIconType()); + } + + int col = Item::items[itemId]->getColor(item,0); + float r = ((col >> 16) & 0xff) / 255.0f; + float g = ((col >> 8) & 0xff) / 255.0f; + float b = ((col) & 0xff) / 255.0f; + + if (setColor) glColor4f(r, g, b, fAlpha); + + // scale the x and y by the scale factor + if((fScaleX!=1.0f) ||(fScaleY!=1.0f)) + { + blit(x, y, itemIcon, 16 * fScaleX, 16 * fScaleY); + } + else + { + blit((int)x, (int)y, itemIcon, 16, 16); + } + glEnable(GL_LIGHTING); + PIXEndNamedEvent(); + + } + glEnable(GL_CULL_FACE); + +} + +// 4J - original interface, now just a wrapper for preceding overload +void ItemRenderer::renderGuiItem(Font *font, Textures *textures, shared_ptr item, int x, int y) +{ + renderGuiItem(font, textures, item, (float)x, (float)y, 1.0f, 1.0f ); +} + +// 4J - this used to take x and y as ints, and no scale, alpha or foil - but this interface is now implemented as a wrapper round this more fully featured one +void ItemRenderer::renderAndDecorateItem(Font *font, Textures *textures, const shared_ptr item, float x, float y,float fScale,float fAlpha, bool isFoil) +{ + if(item==NULL) return; + renderAndDecorateItem(font, textures, item, x, y,fScale, fScale, fAlpha, isFoil, true); +} + +// 4J - added isConstantBlended and blendFactor parameters. This is true if the gui item is being rendered from a context where it already has blending enabled to do general interface fading +// (ie from the gui rather than xui). In this case we dno't want to enable/disable blending, and do need to restore the blend state when we are done. +void ItemRenderer::renderAndDecorateItem(Font *font, Textures *textures, const shared_ptr item, float x, float y,float fScaleX, float fScaleY,float fAlpha, bool isFoil, bool isConstantBlended, bool useCompiled) +{ + if (item == NULL) + { + return; + } + + renderGuiItem(font, textures, item, x, y,fScaleX,fScaleY,fAlpha, useCompiled); + + if (isFoil || item->isFoil()) + { + glDepthFunc(GL_GREATER); + glDisable(GL_LIGHTING); + glDepthMask(false); + textures->bindTexture(&ItemInHandRenderer::ENCHANT_GLINT_LOCATION); // 4J was "%blur%/misc/glint.png" + blitOffset -= 50; + if( !isConstantBlended ) glEnable(GL_BLEND); + + glBlendFunc(GL_DST_COLOR, GL_ONE); // 4J - changed blend equation from GL_DST_COLOR, GL_DST_COLOR so we can fade this out + + float blendFactor = isConstantBlended ? Gui::currentGuiBlendFactor : 1.0f; + + glColor4f(0.5f * blendFactor, 0.25f * blendFactor, 0.8f * blendFactor, 1); // 4J - scale back colourisation with blendFactor + // scale the x and y by the scale factor + if((fScaleX!=1.0f) ||(fScaleY!=1.0f)) + { + // 4J Stu - Scales were multiples of 20, making 16 to not overlap in xui scenes + blitGlint(x * 431278612 + y * 32178161, x - 2, y - 2, 16 * fScaleX, 16 * fScaleY); + } + else + { + blitGlint(x * 431278612 + y * 32178161, x - 2, y - 2, 20, 20); + } + glColor4f(1.0f, 1.0f, 1.0f, 1); // 4J added + if( !isConstantBlended ) glDisable(GL_BLEND); + + glDepthMask(true); + blitOffset += 50; + glEnable(GL_LIGHTING); + glDepthFunc(GL_LEQUAL); + + if( isConstantBlended ) glBlendFunc(GL_CONSTANT_ALPHA, GL_ONE_MINUS_CONSTANT_ALPHA); + } +} + +// 4J - original interface, now just a wrapper for preceding overload +void ItemRenderer::renderAndDecorateItem(Font *font, Textures *textures, const shared_ptr item, int x, int y) +{ + renderAndDecorateItem( font, textures, item, (float)x, (float)y, 1.0f, 1.0f, item->isFoil() ); +} + +// 4J - a few changes here to get x, y, w, h in as floats (for xui rendering accuracy), and to align +// final pixels to the final screen resolution +void ItemRenderer::blitGlint(int id, float x, float y, float w, float h) +{ + float us = 1.0f / 64.0f / 4; + float vs = 1.0f / 64.0f / 4; + + // 4J - calculate what the pixel coordinates will be in final screen coordinates + float sfx = (float)Minecraft::GetInstance()->width / (float)Minecraft::GetInstance()->width_phys; + float sfy = (float)Minecraft::GetInstance()->height / (float)Minecraft::GetInstance()->height_phys; + float xx0 = x * sfx; + float xx1 = ( x + w ) * sfx; + float yy0 = y * sfy; + float yy1 = ( y + h ) * sfy; + // Round to whole pixels - rounding inwards so that we don't overlap any surrounding graphics + xx0 = ceilf(xx0); + xx1 = floorf(xx1); + yy0 = ceilf(yy0); + yy1 = floorf(yy1); + // Offset by half to get actual centre of pixel - again moving inwards to avoid overlap with surrounding graphics + xx0 += 0.5f; + xx1 -= 0.5f; + yy0 += 0.5f; + yy1 -= 0.5f; + // Convert back to game coordinate space + float xx0f = xx0 / sfx; + float xx1f = xx1 / sfx; + float yy0f = yy0 / sfy; + float yy1f = yy1 / sfy; + + for (int i = 0; i < 2; i++) + { + if (i == 0) glBlendFunc(GL_SRC_COLOR, GL_ONE); + if (i == 1) glBlendFunc(GL_SRC_COLOR, GL_ONE); + float sx = Minecraft::currentTimeMillis() % (3000 + i * 1873) / (3000.0f + i * 1873) * 256; + float sy = 0; + Tesselator *t = Tesselator::getInstance(); + float vv = 4; + if (i == 1) vv = -1; + t->begin(); + t->vertexUV(xx0f, yy1f, blitOffset, (sx + h * vv) * us, (sy + h) * vs); + t->vertexUV(xx1f, yy1f, blitOffset, (sx + w + h * vv) * us, (sy + h) * vs); + t->vertexUV(xx1f, yy0f, blitOffset, (sx + w) * us, (sy + 0) * vs); + t->vertexUV(xx0f, yy0f, blitOffset, (sx + 0) * us, (sy + 0) * vs); + t->end(); + } +} + +void ItemRenderer::renderGuiItemDecorations(Font *font, Textures *textures, shared_ptr item, int x, int y, float fAlpha) +{ + renderGuiItemDecorations(font, textures, item, x, y, L"", fAlpha); +} + +void ItemRenderer::renderGuiItemDecorations(Font *font, Textures *textures, shared_ptr item, int x, int y, const wstring &countText, float fAlpha) +{ + if (item == NULL) + { + return; + } + + if (item->count > 1 || !countText.empty() || item->GetForceNumberDisplay()) + { + MemSect(31); + wstring amount = countText; + if(amount.empty()) + { + int count = item->count; + if(count > 64) + { + amount = _toString(64) + L"+"; + } + else + { + amount = _toString(item->count); + } + } + MemSect(0); + glDisable(GL_LIGHTING); + glDisable(GL_DEPTH_TEST); + 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); + } + + if (item->isDamaged()) + { + int p = (int) Math::round(13.0 - (double) item->getDamageValue() * 13.0 / (double) item->getMaxDamage()); + int cc = (int) Math::round(255.0 - (double) item->getDamageValue() * 255.0 / (double) item->getMaxDamage()); + glDisable(GL_LIGHTING); + glDisable(GL_DEPTH_TEST); + glDisable(GL_TEXTURE_2D); + + Tesselator *t = Tesselator::getInstance(); + + int ca = (255 - cc) << 16 | (cc) << 8; + int cb = ((255 - cc) / 4) << 16 | (255 / 4) << 8; + fillRect(t, x + 2, y + 13, 13, 2, 0x000000); + fillRect(t, x + 2, y + 13, 12, 1, cb); + fillRect(t, x + 2, y + 13, p, 1, ca); + + glEnable(GL_TEXTURE_2D); + glEnable(GL_LIGHTING); + glEnable(GL_DEPTH_TEST); + glColor4f(1, 1, 1, 1); + } + else if(item->hasPotionStrengthBar()) + { + glDisable(GL_LIGHTING); + glDisable(GL_DEPTH_TEST); + glDisable(GL_TEXTURE_2D); + + Tesselator *t = Tesselator::getInstance(); + + fillRect(t, x + 3, y + 13, 11, 2, 0x000000); + //fillRect(t, x + 2, y + 13, 13, 1, 0x1dabc0); + fillRect(t, x + 3, y + 13, m_iPotionStrengthBarWidth[item->GetPotionStrength()], 2, 0x00e1eb); + fillRect(t, x + 2 + 3, y + 13, 1, 2, 0x000000); + fillRect(t, x + 2 + 3+3, y + 13, 1, 2, 0x000000); + fillRect(t, x + 2 + 3+3+3, y + 13, 1, 2, 0x000000); + + + glEnable(GL_TEXTURE_2D); + glEnable(GL_LIGHTING); + glEnable(GL_DEPTH_TEST); + glColor4f(1, 1, 1, 1); + } + glDisable(GL_BLEND); +} + +const int ItemRenderer::m_iPotionStrengthBarWidth[]= +{ + 3,6,9,11 +}; + +void ItemRenderer::fillRect(Tesselator *t, int x, int y, int w, int h, int c) +{ + t->begin(); + t->color(c); + t->vertex((float)(x + 0), (float)( y + 0), (float)( 0)); + t->vertex((float)(x + 0), (float)( y + h), (float)( 0)); + t->vertex((float)(x + w), (float)( y + h), (float)( 0)); + t->vertex((float)(x + w), (float)( y + 0), (float)( 0)); + t->end(); +} + +// 4J - a few changes here to get x, y, w, h in as floats (for xui rendering accuracy), and to align +// final pixels to the final screen resolution +void ItemRenderer::blit(float x, float y, int sx, int sy, float w, float h) +{ + float us = 1 / 256.0f; + float vs = 1 / 256.0f; + Tesselator *t = Tesselator::getInstance(); + t->begin(); + + // 4J - calculate what the pixel coordinates will be in final screen coordinates + float sfx = (float)Minecraft::GetInstance()->width / (float)Minecraft::GetInstance()->width_phys; + float sfy = (float)Minecraft::GetInstance()->height / (float)Minecraft::GetInstance()->height_phys; + float xx0 = x * sfx; + float xx1 = ( x + w ) * sfx; + float yy0 = y * sfy; + float yy1 = ( y + h ) * sfy; + // Round to whole pixels - rounding inwards so that we don't overlap any surrounding graphics + xx0 = ceilf(xx0); + xx1 = floorf(xx1); + yy0 = ceilf(yy0); + yy1 = floorf(yy1); + // Offset by half to get actual centre of pixel - again moving inwards to avoid overlap with surrounding graphics + xx0 += 0.5f; + xx1 -= 0.5f; + yy0 += 0.5f; + yy1 -= 0.5f; + // Convert back to game coordinate space + float xx0f = xx0 / sfx; + float xx1f = xx1 / sfx; + float yy0f = yy0 / sfy; + float yy1f = yy1 / sfy; + + // 4J - subtracting 0.5f (actual screen pixels, so need to compensate for physical & game width) from each x & y coordinate to compensate for centre of pixels in directx vs openGL + float f = ( 0.5f * (float)Minecraft::GetInstance()->width ) / (float)Minecraft::GetInstance()->width_phys; + + t->vertexUV(xx0f, yy1f, (float)( blitOffset), (float)( (sx + 0) * us), (float)( (sy + 16) * vs)); + t->vertexUV(xx1f, yy1f, (float)( blitOffset), (float)( (sx + 16) * us), (float)( (sy + 16) * vs)); + t->vertexUV(xx1f, yy0f, (float)( blitOffset), (float)( (sx + 16) * us), (float)( (sy + 0) * vs)); + t->vertexUV(xx0f, yy0f, (float)( blitOffset), (float)( (sx + 0) * us), (float)( (sy + 0) * vs)); + t->end(); +} + +void ItemRenderer::blit(float x, float y, Icon *tex, float w, float h) +{ + Tesselator *t = Tesselator::getInstance(); + t->begin(); + + // 4J - calculate what the pixel coordinates will be in final screen coordinates + float sfx = (float)Minecraft::GetInstance()->width / (float)Minecraft::GetInstance()->width_phys; + float sfy = (float)Minecraft::GetInstance()->height / (float)Minecraft::GetInstance()->height_phys; + float xx0 = x * sfx; + float xx1 = ( x + w ) * sfx; + float yy0 = y * sfy; + float yy1 = ( y + h ) * sfy; + // Round to whole pixels - rounding inwards so that we don't overlap any surrounding graphics + xx0 = ceilf(xx0); + xx1 = floorf(xx1); + yy0 = ceilf(yy0); + yy1 = floorf(yy1); + // Offset by half to get actual centre of pixel - again moving inwards to avoid overlap with surrounding graphics + xx0 += 0.5f; + xx1 -= 0.5f; + yy0 += 0.5f; + yy1 -= 0.5f; + // Convert back to game coordinate space + float xx0f = xx0 / sfx; + float xx1f = xx1 / sfx; + float yy0f = yy0 / sfy; + float yy1f = yy1 / sfy; + + // 4J - subtracting 0.5f (actual screen pixels, so need to compensate for physical & game width) from each x & y coordinate to compensate for centre of pixels in directx vs openGL + float f = ( 0.5f * (float)Minecraft::GetInstance()->width ) / (float)Minecraft::GetInstance()->width_phys; + + t->vertexUV(xx0f, yy1f, blitOffset, tex->getU0(true), tex->getV1(true)); + t->vertexUV(xx1f, yy1f, blitOffset, tex->getU1(true), tex->getV1(true)); + t->vertexUV(xx1f, yy0f, blitOffset, tex->getU1(true), tex->getV0(true)); + t->vertexUV(xx0f, yy0f, blitOffset, tex->getU0(true), tex->getV0(true)); + t->end(); +} diff --git a/Minecraft.Client/ItemRenderer.h b/Minecraft.Client/ItemRenderer.h new file mode 100644 index 00000000..687b2491 --- /dev/null +++ b/Minecraft.Client/ItemRenderer.h @@ -0,0 +1,54 @@ +#pragma once +#include "EntityRenderer.h" + +class Textures; +class ItemInstance; +class Random; +class ItemEntity; + +class ItemRenderer : public EntityRenderer +{ +private: +// TileRenderer *tileRenderer; // 4J - removed - this is shadowing the tilerenderer from entityrenderer + Random *random; + bool m_bItemFrame; +public: + bool setColor; + float blitOffset; + + 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); + +public: + // 4J - original 2 interface variants + void renderGuiItem(Font *font, Textures *textures, shared_ptr item, int x, int y); + void renderAndDecorateItem(Font *font, Textures *textures, const shared_ptr item, int x, int y); + // 4J - new interfaces added + void renderGuiItem(Font *font, Textures *textures, shared_ptr item, float x, float y, float fScale, float fAlpha); + void renderGuiItem(Font *font, Textures *textures, shared_ptr item, float x, float y, float fScaleX,float fScaleY, float fAlpha, bool useCompiled); // 4J Added useCompiled + void renderAndDecorateItem(Font *font, Textures *textures, const shared_ptr item, float x, float y, float fScale, float fAlpha, bool isFoil); + void renderAndDecorateItem(Font *font, Textures *textures, const shared_ptr item, float x, float y, float fScaleX, float fScaleY, float fAlpha, bool isFoil, bool isConstantBlended, bool useCompiled = true); // 4J - added isConstantBlended and useCompiled + + // 4J Added + virtual void SetItemFrame(bool bSet) {m_bItemFrame=bSet;} + + static const int m_iPotionStrengthBarWidth[4]; + +private: + void blitGlint(int id, float x, float y, float w, float h); // 4J - changed x,y,w,h to floats + +public: + void renderGuiItemDecorations(Font *font, Textures *textures, shared_ptr item, int x, int y, float fAlpha = 1.0f); + void renderGuiItemDecorations(Font *font, Textures *textures, shared_ptr item, int x, int y, const wstring &countText, float fAlpha = 1.0f); +private: + void fillRect(Tesselator *t, int x, int y, int w, int h, int c); +public: + void blit(float x, float y, int sx, int sy, float w, float h); // 4J - changed x,y,w,h to floats + void blit(float x, float y, Icon *tex, float w, float h); +}; diff --git a/Minecraft.Client/ItemSpriteRenderer.cpp b/Minecraft.Client/ItemSpriteRenderer.cpp new file mode 100644 index 00000000..5f1c7089 --- /dev/null +++ b/Minecraft.Client/ItemSpriteRenderer.cpp @@ -0,0 +1,85 @@ +#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" +#include "..\Minecraft.World\net.minecraft.world.h" + +ItemSpriteRenderer::ItemSpriteRenderer(Item *sourceItem, int sourceItemAuxValue /*= 0*/) : EntityRenderer() +{ + this->sourceItem = sourceItem; + this->sourceItemAuxValue = sourceItemAuxValue; +} + +//ItemSpriteRenderer::ItemSpriteRenderer(int icon) : EntityRenderer() +//{ +// this(sourceItem, 0); +//} + +void ItemSpriteRenderer::render(shared_ptr e, double x, double y, double z, float rot, float a) +{ + // the icon is already cached in the item object, so there should not be any performance impact by not caching it here + Icon *icon = sourceItem->getIcon(sourceItemAuxValue); + if (icon == NULL) + { + return; + } + + glPushMatrix(); + + glTranslatef((float) x, (float) y, (float) z); + glEnable(GL_RESCALE_NORMAL); + glScalef(1 / 2.0f, 1 / 2.0f, 1 / 2.0f); + bindTexture(e); + Tesselator *t = Tesselator::getInstance(); + + if (icon == PotionItem::getTexture(PotionItem::THROWABLE_ICON) ) + { + + int col = PotionBrewing::getColorValue((dynamic_pointer_cast(e) )->getPotionValue(), false); + float red = ((col >> 16) & 0xff) / 255.0f; + float g = ((col >> 8) & 0xff) / 255.0f; + float b = ((col) & 0xff) / 255.0f; + + + glColor3f(red, g, b); + glPushMatrix(); + renderIcon(t, PotionItem::getTexture(PotionItem::CONTENTS_ICON)); + glPopMatrix(); + glColor3f(1, 1, 1); + } + + renderIcon(t, icon); + + glDisable(GL_RESCALE_NORMAL); + glPopMatrix(); +} + +void ItemSpriteRenderer::renderIcon(Tesselator *t, Icon *icon) +{ + float u0 = icon->getU0(); + float u1 = icon->getU1(); + float v0 = icon->getV0(); + float v1 = icon->getV1(); + + float r = 1.0f; + float xo = 0.5f; + float yo = 0.25f; + + glRotatef(180 - entityRenderDispatcher->playerRotY, 0, 1, 0); + glRotatef(-entityRenderDispatcher->playerRotX, 1, 0, 0); + t->begin(); + t->normal(0, 1, 0); + t->vertexUV((float)(0 - xo), (float)( 0 - yo), (float)( 0), (float)( u0), (float)( v1)); + t->vertexUV((float)(r - xo), (float)( 0 - yo), (float)( 0), (float)( u1), (float)( v1)); + 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 new file mode 100644 index 00000000..79499e94 --- /dev/null +++ b/Minecraft.Client/ItemSpriteRenderer.h @@ -0,0 +1,19 @@ +#pragma once +#include "EntityRenderer.h" + +class Item; + +class ItemSpriteRenderer : public EntityRenderer +{ +private: + Item *sourceItem; + int sourceItemAuxValue; +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); +}; \ No newline at end of file diff --git a/Minecraft.Client/JoinMultiplayerScreen.cpp b/Minecraft.Client/JoinMultiplayerScreen.cpp new file mode 100644 index 00000000..a98e7bee --- /dev/null +++ b/Minecraft.Client/JoinMultiplayerScreen.cpp @@ -0,0 +1,128 @@ +#include "stdafx.h" +#include "JoinMultiplayerScreen.h" +#include "Button.h" +#include "EditBox.h" +#include "Options.h" +#include "..\Minecraft.World\net.minecraft.locale.h" + +JoinMultiplayerScreen::JoinMultiplayerScreen(Screen *lastScreen) +{ + ipEdit = NULL; + this->lastScreen = lastScreen; +} + +void JoinMultiplayerScreen::tick() +{ + ipEdit->tick(); +} + +void JoinMultiplayerScreen::init() +{ + Language *language = Language::getInstance(); + + Keyboard::enableRepeatEvents(true); + buttons.clear(); + buttons.push_back(new Button(0, width / 2 - 100, height / 4 + 24 * 4 + 12, language->getElement(L"multiplayer.connect"))); + buttons.push_back(new Button(1, width / 2 - 100, height / 4 + 24 * 5 + 12, language->getElement(L"gui.cancel"))); + wstring ip = replaceAll(minecraft->options->lastMpIp,L"_", L":"); + buttons[0]->active = ip.length() > 0; + + ipEdit = new EditBox(this, font, width / 2 - 100, height / 4 - 10 + 50 + 18, 200, 20, ip); + ipEdit->inFocus = true; + ipEdit->setMaxLength(128); + +} + +void JoinMultiplayerScreen::removed() +{ + Keyboard::enableRepeatEvents(false); +} + +void JoinMultiplayerScreen::buttonClicked(Button *button) +{ + if (!button->active) return; + if (button->id == 1) + { + minecraft->setScreen(lastScreen); + } + else if (button->id == 0) + { + wstring ip = trimString(ipEdit->getValue()); + + minecraft->options->lastMpIp = replaceAll(ip,L":", L"_"); + minecraft->options->save(); + + vector parts = stringSplit(ip,L'L'); + if (ip[0]==L'[') + { + int pos = (int)ip.find(L"]"); + if (pos != wstring::npos) + { + wstring path = ip.substr(1, pos); + wstring port = trimString(ip.substr(pos + 1)); + if (port[0]==L':' && port.length() > 0) + { + port = port.substr(1); + parts.clear(); + parts.push_back(path); + parts.push_back(port); + } + else + { + parts.clear(); + parts.push_back(path); + } + } + + } + if (parts.size() > 2) + { + parts.clear(); + parts.push_back(ip); + } + + // 4J - TODO +// minecraft->setScreen(new ConnectScreen(minecraft, parts[0], parts.length > 1 ? parseInt(parts[1], 25565) : 25565)); + } +} + +int JoinMultiplayerScreen::parseInt(const wstring& str, int def) +{ + return _fromString(str); +} + +void JoinMultiplayerScreen::keyPressed(wchar_t ch, int eventKey) +{ + ipEdit->keyPressed(ch, eventKey); + + if (ch == 13) + { + buttonClicked(buttons[0]); + } + buttons[0]->active = ipEdit->getValue().length() > 0; +} + +void JoinMultiplayerScreen::mouseClicked(int x, int y, int buttonNum) +{ + Screen::mouseClicked(x, y, buttonNum); + + ipEdit->mouseClicked(x, y, buttonNum); +} + +void JoinMultiplayerScreen::render(int xm, int ym, float a) +{ + Language *language = Language::getInstance(); + + // fill(0, 0, width, height, 0x40000000); + renderBackground(); + + drawCenteredString(font, language->getElement(L"multiplayer.title"), width / 2, height / 4 - 60 + 20, 0xffffff); + drawString(font, language->getElement(L"multiplayer.info1"), width / 2 - 140, height / 4 - 60 + 60 + 9 * 0, 0xa0a0a0); + drawString(font, language->getElement(L"multiplayer.info2"), width / 2 - 140, height / 4 - 60 + 60 + 9 * 1, 0xa0a0a0); + drawString(font, language->getElement(L"multiplayer.ipinfo"), width / 2 - 140, height / 4 - 60 + 60 + 9 * 4, 0xa0a0a0); + + ipEdit->render(); + + Screen::render(xm, ym, a); + +} \ No newline at end of file diff --git a/Minecraft.Client/JoinMultiplayerScreen.h b/Minecraft.Client/JoinMultiplayerScreen.h new file mode 100644 index 00000000..99b77078 --- /dev/null +++ b/Minecraft.Client/JoinMultiplayerScreen.h @@ -0,0 +1,26 @@ +#pragma once +#include "Screen.h" +class EditBox; +class Button; + +class JoinMultiplayerScreen : public Screen +{ +private: + Screen *lastScreen; + EditBox *ipEdit; + +public: + JoinMultiplayerScreen(Screen *lastScreen); + virtual void tick(); + virtual void init(); + virtual void removed(); +protected: + virtual void buttonClicked(Button *button); +private: + virtual int parseInt(const wstring& str, int def); +protected: + virtual void keyPressed(wchar_t ch, int eventKey); + virtual void mouseClicked(int x, int y, int buttonNum); +public: + virtual void render(int xm, int ym, float a); +}; \ No newline at end of file diff --git a/Minecraft.Client/KeyMapping.cpp b/Minecraft.Client/KeyMapping.cpp new file mode 100644 index 00000000..9e930412 --- /dev/null +++ b/Minecraft.Client/KeyMapping.cpp @@ -0,0 +1,8 @@ +#include "stdafx.h" +#include "KeyMapping.h" + +KeyMapping::KeyMapping(const wstring& name, int key) +{ + this->name = name; + this->key = key; +} \ No newline at end of file diff --git a/Minecraft.Client/KeyMapping.h b/Minecraft.Client/KeyMapping.h new file mode 100644 index 00000000..45be54a3 --- /dev/null +++ b/Minecraft.Client/KeyMapping.h @@ -0,0 +1,10 @@ +#pragma once +using namespace std; +// 4J Stu - Not updated to 1.8.2 as we don't use this +class KeyMapping +{ +public: + wstring name; + int key; + KeyMapping(const wstring& name, int key); +}; \ No newline at end of file diff --git a/Minecraft.Client/LargeChestModel.cpp b/Minecraft.Client/LargeChestModel.cpp new file mode 100644 index 00000000..fad7aae1 --- /dev/null +++ b/Minecraft.Client/LargeChestModel.cpp @@ -0,0 +1,29 @@ +#include "stdafx.h" +#include "LargeChestModel.h" +#include "ModelPart.h" + +LargeChestModel::LargeChestModel() +{ + lid = ((new ModelPart(this, 0, 0)))->setTexSize(128, 64); + lid->addBox(0.0f, -5.0f, -14.0f, 14+16, 5, 14, 0.0f); + lid->x = 1; + lid->y = 7; + lid->z = 15; + + lock = ((new ModelPart(this, 0, 0)))->setTexSize(128, 64); + lock->addBox(-1.0f, -2.0f, -15.0f, 2, 4, 1, 0.0f); + lock->x = 8+8; + lock->y = 7; + lock->z = 15; + + bottom = ((new ModelPart(this, 0, 19)))->setTexSize(128, 64); + bottom->addBox(0.0f, 0.0f, 0.0f, 14+16, 10, 14, 0.0f); + bottom->x = 1; + bottom->y = 6; + bottom->z = 1; + + // 4J added - compile now to avoid random performance hit first time cubes are rendered + lid->compile(1.0f/16.0f); + lock->compile(1.0f/16.0f); + bottom->compile(1.0f/16.0f); +} \ No newline at end of file diff --git a/Minecraft.Client/LargeChestModel.h b/Minecraft.Client/LargeChestModel.h new file mode 100644 index 00000000..a2dcb991 --- /dev/null +++ b/Minecraft.Client/LargeChestModel.h @@ -0,0 +1,9 @@ +#pragma once + +#include "ChestModel.h" + +class LargeChestModel : public ChestModel +{ +public: + LargeChestModel(); +}; \ No newline at end of file diff --git a/Minecraft.Client/LavaParticle.cpp b/Minecraft.Client/LavaParticle.cpp new file mode 100644 index 00000000..ac0608e5 --- /dev/null +++ b/Minecraft.Client/LavaParticle.cpp @@ -0,0 +1,69 @@ +#include "stdafx.h" +#include "LavaParticle.h" +#include "..\Minecraft.World\JavaMath.h" +#include "..\Minecraft.World\Random.h" +#include "..\Minecraft.World\net.minecraft.world.level.h" + +LavaParticle::LavaParticle(Level *level, double x, double y, double z) : Particle(level, x, y, z, 0, 0, 0) +{ + xd *= 0.8f; + yd *= 0.8f; + zd *= 0.8f; + yd = random->nextFloat() * 0.4f + 0.05f; + + rCol = gCol = bCol = 1; + size *= (random->nextFloat() * 2 + 0.2f); + oSize = size; + + lifetime = (int) (16 / (Math::random() * 0.8 + 0.2)); + noPhysics = false; + setMiscTex(49); +} + +// 4J - brought forward from 1.8.2 +int LavaParticle::getLightColor(float a) +{ + float l = (age + a) / lifetime; + if (l < 0) l = 0; + if (l > 1) l = 1; + int br = Particle::getLightColor(a); + + int br1 = 15 * 16; + int br2 = (br >> 16) & 0xff; + return br1 | br2 << 16; +} + +float LavaParticle::getBrightness(float a) +{ + return 1; +} + +void LavaParticle::render(Tesselator *t, float a, float xa, float ya, float za, float xa2, float za2) +{ + float s = (age + a) / (float) lifetime; + size = oSize * (1 - s*s); + Particle::render(t, a, xa, ya, za, xa2, za2); +} + +void LavaParticle::tick() +{ + xo = x; + yo = y; + zo = z; + + if (age++ >= lifetime) remove(); + float odds = age / (float) lifetime; + if (random->nextFloat() > odds) level->addParticle(eParticleType_smoke, x, y, z, xd, yd, zd); + + yd -= 0.03; + move(xd, yd, zd); + xd *= 0.999f; + yd *= 0.999f; + zd *= 0.999f; + + if (onGround) + { + xd *= 0.7f; + zd *= 0.7f; + } +} diff --git a/Minecraft.Client/LavaParticle.h b/Minecraft.Client/LavaParticle.h new file mode 100644 index 00000000..235edcf4 --- /dev/null +++ b/Minecraft.Client/LavaParticle.h @@ -0,0 +1,16 @@ +#pragma once +#include "Particle.h" + +class LavaParticle : public Particle +{ +public: + virtual eINSTANCEOF GetType() { return eType_LAVAPARTICLE; } +private: + float oSize; +public: + LavaParticle(Level *level, double x, double y, double z); + virtual int getLightColor(float a); // 4J - brought forward from 1.8.2 + virtual float getBrightness(float a); + virtual void render(Tesselator *t, float a, float xa, float ya, float za, float xa2, float za2); + virtual void tick(); +}; diff --git a/Minecraft.Client/LavaSlimeModel.cpp b/Minecraft.Client/LavaSlimeModel.cpp new file mode 100644 index 00000000..052850f8 --- /dev/null +++ b/Minecraft.Client/LavaSlimeModel.cpp @@ -0,0 +1,71 @@ +#include "stdafx.h" +#include "..\Minecraft.World\Mth.h" +#include "LavaSlimeModel.h" +#include "ModelPart.h" +#include "..\Minecraft.World\LavaSlime.h" + + +LavaSlimeModel::LavaSlimeModel() +{ + for (int i = 0; i < BODYCUBESLENGTH; i++) + { + int u = 0; + int v = i; + if (i == 2) + { + u = 24; + v = 10; + } + else if (i == 3) + { + u = 24; + v = 19; + } + bodyCubes[i] = new ModelPart(this, u, v); + bodyCubes[i]->addBox(-4.0f, 16.0f + (float)i, -4.0f, 8, 1, 8); + } + + insideCube = new ModelPart(this, 0, 16); + insideCube->addBox(-2, 16 + 2, -2, 4, 4, 4); + + // 4J added - compile now to avoid random performance hit first time cubes are rendered + insideCube->compile(1.0f/16.0f); + for( int i = 0; i < BODYCUBESLENGTH; i++ ) + { + bodyCubes[i]->compile(1.0f/16.0f); + } +} + +int LavaSlimeModel::getModelVersion() +{ + return 5; +} + +void LavaSlimeModel::prepareMobModel(shared_ptr mob, float time, float r, float a) +{ + shared_ptr lavaSlime = dynamic_pointer_cast(mob); + + float slimeSquish = (lavaSlime->oSquish + (lavaSlime->squish - lavaSlime->oSquish) * a); + if (slimeSquish < 0) + { + slimeSquish = 0.0f; + } + + for (int i = 0; i < BODYCUBESLENGTH; i++) + { + bodyCubes[i]->y = -(4 - i) * slimeSquish * 1.7f; + } +} + +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, entity); + + insideCube->render(scale, usecompiled); + for (int i = 0; i < BODYCUBESLENGTH; i++) + { + bodyCubes[i]->render(scale, usecompiled); + } + +} + diff --git a/Minecraft.Client/LavaSlimeModel.h b/Minecraft.Client/LavaSlimeModel.h new file mode 100644 index 00000000..29e5e951 --- /dev/null +++ b/Minecraft.Client/LavaSlimeModel.h @@ -0,0 +1,15 @@ +#pragma once +#include "Model.h" + +class LavaSlimeModel : public Model +{ + static const int BODYCUBESLENGTH=8; + ModelPart *bodyCubes[BODYCUBESLENGTH]; + ModelPart *insideCube; + +public: + LavaSlimeModel(); + int getModelVersion(); + 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 new file mode 100644 index 00000000..e828a353 --- /dev/null +++ b/Minecraft.Client/LavaSlimeRenderer.cpp @@ -0,0 +1,28 @@ +#include "stdafx.h" +#include "..\Minecraft.World\net.minecraft.world.entity.monster.h" +#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(); +} + +ResourceLocation *LavaSlimeRenderer::getTextureLocation(shared_ptr mob) +{ + return &MAGMACUBE_LOCATION; +} + +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 + shared_ptr slime = dynamic_pointer_cast(_slime); + int size = slime->getSize(); + float ss = (slime->oSquish + (slime->squish - slime->oSquish) * a) / (size * 0.5f + 1); + float w = 1 / (ss + 1); + float s = size; + glScalef(w * s, 1 / w * s, w * s); +} \ No newline at end of file diff --git a/Minecraft.Client/LavaSlimeRenderer.h b/Minecraft.Client/LavaSlimeRenderer.h new file mode 100644 index 00000000..1743c574 --- /dev/null +++ b/Minecraft.Client/LavaSlimeRenderer.h @@ -0,0 +1,16 @@ +#pragma once +#include "MobRenderer.h" + +class LavaSlimeRenderer : public MobRenderer +{ +private: + int modelVersion; + static ResourceLocation MAGMACUBE_LOCATION; + +public: + LavaSlimeRenderer(); + virtual ResourceLocation *getTextureLocation(shared_ptr mob); + +protected: + 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 new file mode 100644 index 00000000..8216f1fe --- /dev/null +++ b/Minecraft.Client/LevelRenderer.cpp @@ -0,0 +1,3774 @@ +#include "stdafx.h" +#include "LevelRenderer.h" +#include "Textures.h" +#include "TextureAtlas.h" +#include "Tesselator.h" +#include "Chunk.h" +#include "EntityRenderDispatcher.h" +#include "TileEntityRenderDispatcher.h" +#include "DistanceChunkSorter.h" +#include "DirtyChunkSorter.h" +#include "MobSkinTextureProcessor.h" +#include "MobSkinMemTextureProcessor.h" +#include "GameRenderer.h" +#include "BubbleParticle.h" +#include "SmokeParticle.h" +#include "NoteParticle.h" +#include "NetherPortalParticle.h" +#include "EnderParticle.h" +#include "ExplodeParticle.h" +#include "FlameParticle.h" +#include "LavaParticle.h" +#include "FootstepParticle.h" +#include "SplashParticle.h" +#include "SmokeParticle.h" +#include "RedDustParticle.h" +#include "BreakingItemParticle.h" +#include "SnowShovelParticle.h" +#include "BreakingItemParticle.h" +#include "HeartParticle.h" +#include "HugeExplosionParticle.h" +#include "HugeExplosionSeedParticle.h" +#include "SuspendedParticle.h" +#include "SuspendedTownParticle.h" +#include "CritParticle2.h" +#include "TerrainParticle.h" +#include "SpellParticle.h" +#include "DripParticle.h" +#include "EchantmentTableParticle.h" +#include "DragonBreathParticle.h" +#include "FireworksParticles.h" +#include "Lighting.h" +#include "Options.h" +#include "MultiPlayerChunkCache.h" +#include "..\Minecraft.World\ParticleTypes.h" +#include "..\Minecraft.World\IntCache.h" +#include "..\Minecraft.World\IntBuffer.h" +#include "..\Minecraft.World\JavaMath.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.tile.h" +#include "..\Minecraft.World\net.minecraft.world.phys.h" +#include "..\Minecraft.World\net.minecraft.world.entity.player.h" +#include "..\Minecraft.World\net.minecraft.world.item.h" +#include "..\Minecraft.World\System.h" +#include "..\Minecraft.World\StringHelpers.h" +#include "..\Minecraft.World\net.minecraft.world.level.chunk.h" +#include "..\Minecraft.World\net.minecraft.world.entity.projectile.h" +#include "..\Minecraft.World\net.minecraft.world.h" +#include "MultiplayerLocalPlayer.h" +#include "MultiPlayerLevel.h" +#include "..\Minecraft.World\SoundTypes.h" +#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" +#include "C4JSpursJob.h" + +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 +Chunk LevelRenderer::permaChunk[MAX_CONCURRENT_CHUNK_REBUILDS]; +C4JThread *LevelRenderer::rebuildThreads[MAX_CHUNK_REBUILD_THREADS]; +C4JThread::EventArray *LevelRenderer::s_rebuildCompleteEvents; +C4JThread::Event *LevelRenderer::s_activationEventA[MAX_CHUNK_REBUILD_THREADS]; + +// This defines the maximum size of renderable level, must be big enough to cope with actual size of level + view distance at each side +// so that we can render the "infinite" sea at the edges. Currently defined as: +const int overworldSize = LEVEL_MAX_WIDTH + LevelRenderer::PLAYER_VIEW_DISTANCE + LevelRenderer::PLAYER_VIEW_DISTANCE; +const int netherSize = HELL_LEVEL_MAX_WIDTH + 2; // 4J Stu - The plus 2 is really just to make our total chunk count a multiple of 8 for the flags, we will never see these in the nether +const int endSize = END_LEVEL_MAX_WIDTH; +const int LevelRenderer::MAX_LEVEL_RENDER_SIZE[3] = { overworldSize, netherSize, endSize }; +const int LevelRenderer::DIMENSION_OFFSETS[3] = { 0, (overworldSize * overworldSize * CHUNK_Y_COUNT) , (overworldSize * overworldSize * CHUNK_Y_COUNT) + ( netherSize * netherSize * CHUNK_Y_COUNT ) }; +#else +// This defines the maximum size of renderable level, must be big enough to cope with actual size of level + view distance at each side +// so that we can render the "infinite" sea at the edges. Currently defined as: +// Dimension idx 0 (overworld) : 80 ( = 54 + 13 + 13 ) +// Dimension idx 1 (nether) : 44 ( = 18 + 13 + 13 ) +// Dimension idx 2 (the end) : 44 ( = 18 + 13 + 13 ) + +const int LevelRenderer::MAX_LEVEL_RENDER_SIZE[3] = { 80, 44, 44 }; + +// Linked directly to the sizes in the previous array, these next values dictate the start offset for each dimension index into the global array for these things. +// Each dimension uses MAX_LEVEL_RENDER_SIZE[i]^2 * 8 indices, as a MAX_LEVEL_RENDER_SIZE * MAX_LEVEL_RENDER_SIZE * 8 sized cube of references. + +const int LevelRenderer::DIMENSION_OFFSETS[3] = { 0, (80 * 80 * CHUNK_Y_COUNT) , (80 * 80 * CHUNK_Y_COUNT) + ( 44 * 44 * CHUNK_Y_COUNT ) }; +#endif + +LevelRenderer::LevelRenderer(Minecraft *mc, Textures *textures) +{ + breakingTextures = NULL; + + for( int i = 0; i < 4; i++ ) + { + level[i] = NULL; + tileRenderer[i] = NULL; + xOld[i] = -9999; + yOld[i] = -9999; + zOld[i] = -9999; + } + xChunks= yChunks= zChunks = 0; + chunkLists = 0; + + ticks = 0; + starList= skyList= darkList = 0; + xMinChunk= yMinChunk= zMinChunk = 0; + xMaxChunk= yMaxChunk= zMaxChunk = 0; + lastViewDistance = -1; + noEntityRenderFrames = 2; + totalEntities = 0; + renderedEntities = 0; + culledEntities = 0; + chunkFixOffs = 0; + frame = 0; + repeatList = MemoryTracker::genLists(1); + + destroyProgress = 0.0f; + + totalChunks= offscreenChunks= occludedChunks= renderedChunks= emptyChunks = 0; + for( int i = 0; i < 4; i++ ) + { + // sortedChunks[i] = NULL; // 4J - removed - not sorting our chunks anymore + chunks[i] = ClipChunkArray(); + lastPlayerCount[i] = 0; + } + + InitializeCriticalSection(&m_csDirtyChunks); + InitializeCriticalSection(&m_csRenderableTileEntities); +#ifdef _LARGE_WORLDS + InitializeCriticalSection(&m_csChunkFlags); +#endif + + dirtyChunkPresent = false; + lastDirtyChunkFound = 0; + + this->mc = mc; + this->textures = textures; + + chunkLists = MemoryTracker::genLists(getGlobalChunkCount()*2); // *2 here is because there is one renderlist per chunk here for each of the opaque & transparent layers + globalChunkFlags = new unsigned char[getGlobalChunkCount()]; + memset(globalChunkFlags, 0, getGlobalChunkCount()); + + starList = MemoryTracker::genLists(4); + + glPushMatrix(); + glNewList(starList, GL_COMPILE); + renderStars(); + glEndList(); + + // 4J added - create geometry for rendering clouds + createCloudMesh(); + + glPopMatrix(); + + + + Tesselator *t = Tesselator::getInstance(); + skyList = starList + 1; + glNewList(skyList, GL_COMPILE); + 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; + for (int xx = -s * d; xx <= s * d; xx += s) + { + for (int zz = -s * d; zz <= s * d; zz += s) + { + t->begin(); + t->vertex((float)(xx + 0), (float)( yy), (float)( zz + 0)); + t->vertex((float)(xx + s), (float)( yy), (float)( zz + 0)); + t->vertex((float)(xx + s), (float)( yy), (float)( zz + s)); + t->vertex((float)(xx + 0), (float)( yy), (float)( zz + s)); + t->end(); + } + } + glEndList(); + + darkList = starList + 2; + glNewList(darkList, GL_COMPILE); + yy = -(float) 16; + t->begin(); + for (int xx = -s * d; xx <= s * d; xx += s) + { + for (int zz = -s * d; zz <= s * d; zz += s) + { + t->vertex((float)(xx + s), (float)( yy), (float)( zz + 0)); + t->vertex((float)(xx + 0), (float)( yy), (float)( zz + 0)); + t->vertex((float)(xx + 0), (float)( yy), (float)( zz + s)); + t->vertex((float)(xx + s), (float)( yy), (float)( zz + s)); + } + } + t->end(); + glEndList(); + + // HALO ring for the texture pack + { + const unsigned int ARC_SEGMENTS = 50; + const float VERTICAL_OFFSET = HALO_RING_RADIUS * 999/1000; // How much we raise the circle origin to make the circle curve back towards us + const int WIDTH = 10; + const float ARC_RADIANS = 2.0f*PI/ARC_SEGMENTS; + const float HALF_ARC_SEG = ARC_SEGMENTS/2; + const float WIDE_ARC_SEGS = ARC_SEGMENTS/8; + const float WIDE_ARC_SEGS_SQR = WIDE_ARC_SEGS * WIDE_ARC_SEGS; + + float u = 0.0f; + float width = WIDTH; + + haloRingList = starList + 3; + glNewList(haloRingList, GL_COMPILE); + t->begin(GL_TRIANGLE_STRIP); + t->color(0xffffff); + + for(unsigned int i = 0; i <= ARC_SEGMENTS; ++i) + { + float DIFF = abs(i - HALF_ARC_SEG); + if(DIFF<(HALF_ARC_SEG-WIDE_ARC_SEGS)) DIFF = 0; + else DIFF-=(HALF_ARC_SEG-WIDE_ARC_SEGS); + width = 1 + ( (DIFF * DIFF) / (WIDE_ARC_SEGS_SQR) ) * WIDTH; + t->vertexUV((HALO_RING_RADIUS * cos(i*ARC_RADIANS)) - VERTICAL_OFFSET, (HALO_RING_RADIUS * sin(i*ARC_RADIANS)), 0-width, u, 0); + t->vertexUV((HALO_RING_RADIUS * cos(i*ARC_RADIANS)) - VERTICAL_OFFSET, (HALO_RING_RADIUS * sin(i*ARC_RADIANS)), 0+width, u, 1); + //--u; + u -= 0.25; + } + t->end(); + glEndList(); + } + + Chunk::levelRenderer = this; + + destroyedTileManager = new DestroyedTileManager(); + + dirtyChunksLockFreeStack.Initialize(); +#ifdef __PS3__ + m_jobPort_CullSPU = new C4JSpursJobQueue::Port("C4JSpursJob_LevelRenderer_cull"); + m_jobPort_FindNearestChunk = new C4JSpursJobQueue::Port("C4JSpursJob_LevelRenderer_FindNearestChunk"); +#endif // __PS3__ +} + +void LevelRenderer::renderStars() +{ + Random random = Random(10842); + Tesselator *t = Tesselator::getInstance(); + t->begin(); + for (int i = 0; i < 1500; i++) + { + double x = random.nextFloat() * 2 - 1; + double y = random.nextFloat() * 2 - 1; + double z = random.nextFloat() * 2 - 1; + double ss = 0.15f + random.nextFloat() * 0.10f; + double d = x * x + y * y + z * z; + if (d < 1 && d > 0.01) + { + d = 1 / sqrt(d); + x *= d; + y *= d; + z *= d; + double xp = x * 160; // 4J - moved further away (were 100) as they were cutting through far chunks + double yp = y * 160; + double zp = z * 160; + + double yRot = atan2(x, z); + double ySin = sin(yRot); + double yCos = cos(yRot); + + double xRot = atan2(sqrt(x * x + z * z), y); + double xSin = sin(xRot); + double xCos = cos(xRot); + + double zRot = random.nextDouble() * PI * 2; + double zSin = sin(zRot); + double zCos = cos(zRot); + + for (int c = 0; c < 4; c++) + { + double ___xo = 0; + double ___yo = ((c & 2) - 1) * ss; + double ___zo = ((c + 1 & 2) - 1) * ss; + + double __xo = ___xo; + double __yo = ___yo * zCos - ___zo * zSin; + double __zo = ___zo * zCos + ___yo * zSin; + + double _zo = __zo; + double _yo = __yo * xSin + __xo * xCos; + double _xo = __xo * xSin - __yo * xCos; + + double xo = _xo * ySin - _zo * yCos; + double yo = _yo; + double zo = _zo * ySin + _xo * yCos; + + t->vertex((float)(xp + xo), (float)( yp + yo), (float)( zp + zo)); + } + } + } + t->end(); + +} + + +void LevelRenderer::setLevel(int playerIndex, MultiPlayerLevel *level) +{ + if (this->level[playerIndex] != NULL) + { + // Remove listener for this level if this is the last player referencing it + Level *prevLevel = this->level[playerIndex]; + int refCount = 0; + for( int i = 0; i < 4; i++ ) + { + if( this->level[i] == prevLevel ) refCount++; + } + if( refCount == 1 ) + { + this->level[playerIndex]->removeListener(this); + } + } + + xOld[playerIndex] = -9999; + yOld[playerIndex] = -9999; + zOld[playerIndex] = -9999; + + this->level[playerIndex] = level; + if( tileRenderer[playerIndex] != NULL ) + { + delete tileRenderer[playerIndex]; + } + tileRenderer[playerIndex] = new TileRenderer(level); + if (level != NULL) + { + // If we're the only player referencing this level, add a new listener for it + int refCount = 0; + for( int i = 0; i < 4; i++ ) + { + if( this->level[i] == level ) refCount++; + } + if( refCount == 1 ) + { + level->addListener(this); + } + + allChanged(playerIndex); + } + else + { + // printf("NULLing player %d, chunks @ 0x%x\n",playerIndex,chunks[playerIndex]); + if( chunks[playerIndex].data != NULL ) + { + for (unsigned int i = 0; i < chunks[playerIndex].length; i++) + { + chunks[playerIndex][i].chunk->_delete(); + delete chunks[playerIndex][i].chunk; + } + delete chunks[playerIndex].data; + chunks[playerIndex].data = NULL; + chunks[playerIndex].length = 0; + // delete sortedChunks[playerIndex]; // 4J - removed - not sorting our chunks anymore + // sortedChunks[playerIndex] = NULL; // 4J - removed - not sorting our chunks anymore + } + + // 4J Stu - If we do this for splitscreen players leaving, then all the tile entities in the world dissappear + // We should only do this when actually exiting the game, so only when the primary player sets there level to NULL + if(playerIndex == ProfileManager.GetPrimaryPad()) renderableTileEntities.clear(); + } +} + +void LevelRenderer::AddDLCSkinsToMemTextures() +{ + for(int i=0;iaddMemTexture(app.vSkinNames[i], new MobSkinMemTextureProcessor()); + } +} + +void LevelRenderer::allChanged() +{ + int playerIndex = mc->player->GetXboxPad(); // 4J added + allChanged(playerIndex); +} + +int LevelRenderer::activePlayers() +{ + int playerCount = 0; + for( int i = 0; i < 4; i++ ) + { + if( level[i] ) playerCount++; + } + return playerCount; +} + +void LevelRenderer::allChanged(int playerIndex) +{ + // 4J Stu - This was required by the threaded Minecraft::tick(). If we need to add it back then: + // If this CS is entered before DisableUpdateThread is called then (on 360 at least) we can get a + // deadlock when starting a game in splitscreen. + //EnterCriticalSection(&m_csDirtyChunks); + if( level == NULL ) + { + return; + } + + Minecraft::GetInstance()->gameRenderer->DisableUpdateThread(); + + Tile::leaves->setFancy(mc->options->fancyGraphics); + lastViewDistance = mc->options->viewDistance; + + // Calculate size of area we can render based on number of players we need to render for + int dist = (int)sqrtf( (float)PLAYER_RENDER_AREA / (float)activePlayers() ); + + // AP - poor little Vita just can't cope with such a big area +#ifdef __PSVITA__ + dist = 10; +#endif + + lastPlayerCount[playerIndex] = activePlayers(); + + xChunks = dist; + yChunks = Level::maxBuildHeight / CHUNK_SIZE; + zChunks = dist; + + if( chunks[playerIndex].data != NULL ) + { + for (unsigned int i = 0; i < chunks[playerIndex].length; i++) + { + chunks[playerIndex][i].chunk->_delete(); + delete chunks[playerIndex][i].chunk; + } + delete chunks[playerIndex].data; + // delete sortedChunks[playerIndex]; // 4J - removed - not sorting our chunks anymore + } + + chunks[playerIndex] = ClipChunkArray(xChunks * yChunks * zChunks); + // sortedChunks[playerIndex] = new vector(xChunks * yChunks * zChunks); // 4J - removed - not sorting our chunks anymore + int id = 0; + int count = 0; + + xMinChunk = 0; + yMinChunk = 0; + zMinChunk = 0; + xMaxChunk = xChunks; + yMaxChunk = yChunks; + zMaxChunk = zChunks; + + // 4J removed - we now only fully clear this on exiting the game (setting level to NULL). Apart from that, the chunk rebuilding is responsible for maintaining this + // renderableTileEntities.clear(); + + for (int x = 0; x < xChunks; x++) + { + for (int y = 0; y < yChunks; y++) + { + for (int z = 0; z < zChunks; z++) + { + chunks[playerIndex][(z * yChunks + y) * xChunks + x].chunk = new Chunk(level[playerIndex], renderableTileEntities, m_csRenderableTileEntities, x * CHUNK_XZSIZE, y * CHUNK_SIZE, z * CHUNK_XZSIZE, &chunks[playerIndex][(z * yChunks + y) * xChunks + x]); + chunks[playerIndex][(z * yChunks + y) * xChunks + x].visible = true; + chunks[playerIndex][(z * yChunks + y) * xChunks + x].chunk->id = count++; + // sortedChunks[playerIndex]->at((z * yChunks + y) * xChunks + x) = chunks[playerIndex]->at((z * yChunks + y) * xChunks + x); // 4J - removed - not sorting our chunks anymore + + id += 3; + } + } + } + nonStackDirtyChunksAdded(); + + if (level != NULL) + { + shared_ptr player = mc->cameraTargetPlayer; + if (player != NULL) + { + this->resortChunks(Mth::floor(player->x), Mth::floor(player->y), Mth::floor(player->z)); + // sort(sortedChunks[playerIndex]->begin(),sortedChunks[playerIndex]->end(), DistanceChunkSorter(player)); // 4J - removed - not sorting our chunks anymore + } + } + + noEntityRenderFrames = 2; + + Minecraft::GetInstance()->gameRenderer->EnableUpdateThread(); + + // 4J Stu - Remove. See comment above. + //LeaveCriticalSection(&m_csDirtyChunks); +} + +void LevelRenderer::renderEntities(Vec3 *cam, Culler *culler, float a) +{ + int playerIndex = mc->player->GetXboxPad(); // 4J added + + // 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->crosshairPickMob, mc->options, a); + + if (noEntityRenderFrames > 0) + { + noEntityRenderFrames--; + return; + } + + totalEntities = 0; + renderedEntities = 0; + culledEntities = 0; + + shared_ptr player = mc->cameraTargetPlayer; + + EntityRenderDispatcher::xOff = (player->xOld + (player->x - player->xOld) * a); + EntityRenderDispatcher::yOff = (player->yOld + (player->y - player->yOld) * a); + EntityRenderDispatcher::zOff = (player->zOld + (player->z - player->zOld) * a); + TileEntityRenderDispatcher::xOff = (player->xOld + (player->x - player->xOld) * a); + TileEntityRenderDispatcher::yOff = (player->yOld + (player->y - player->yOld) * a); + TileEntityRenderDispatcher::zOff = (player->zOld + (player->z - player->zOld) * a); + + mc->gameRenderer->turnOnLightLayer(a); // 4J - brought forward from 1.8.2 + + vector > entities = level[playerIndex]->getAllEntities(); + totalEntities = (int)entities.size(); + + AUTO_VAR(itEndGE, level[playerIndex]->globalEntities.end()); + for (AUTO_VAR(it, level[playerIndex]->globalEntities.begin()); it != itEndGE; it++) + { + shared_ptr entity = *it; //level->globalEntities[i]; + renderedEntities++; + if (entity->shouldRender(cam)) EntityRenderDispatcher::instance->render(entity, a); + } + + AUTO_VAR(itEndEnts, entities.end()); + for (AUTO_VAR(it, entities.begin()); it != itEndEnts; it++) + { + shared_ptr entity = *it; //entities[i]; + + 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 = mc->cameraTargetPlayer->instanceof(eTYPE_LOCALPLAYER) ? dynamic_pointer_cast(mc->cameraTargetPlayer) : nullptr; + + if (localplayer && entity == mc->cameraTargetPlayer && !localplayer->ThirdPersonView() && !mc->cameraTargetPlayer->isSleeping()) continue; + + if (!level[playerIndex]->hasChunkAt(Mth::floor(entity->x), 0, Mth::floor(entity->z))) + { + continue; + } + renderedEntities++; + EntityRenderDispatcher::instance->render(entity, a); + } + } + + Lighting::turnOn(); + // 4J - have restructed this so that the tile entities are stored within a hashmap by chunk/dimension index. The index + // is calculated in the same way as the global flags. + EnterCriticalSection(&m_csRenderableTileEntities); + for (AUTO_VAR(it, renderableTileEntities.begin()); it != renderableTileEntities.end(); it++) + { + int idx = it->first; + // Don't render if it isn't in the same dimension as this player + if( !isGlobalIndexInSameDimension(idx, level[playerIndex]) ) continue; + + for( AUTO_VAR(it2, it->second.begin()); it2 != it->second.end(); it2++) + { + TileEntityRenderDispatcher::instance->render(*it2, a); + } + } + + // Now consider if any of these renderable tile entities have been flagged for removal, and if so, remove + for (AUTO_VAR(it, renderableTileEntities.begin()); it != renderableTileEntities.end();) + { + int idx = it->first; + + for( AUTO_VAR(it2, it->second.begin()); it2 != it->second.end(); ) + { + // If it has been flagged for removal, remove + if((*it2)->shouldRemoveForRender()) + { + it2 = it->second.erase(it2); + } + else + { + it2++; + } + } + + // If there aren't any entities left for this key, then delete the key + if( it->second.size() == 0 ) + { + it = renderableTileEntities.erase(it); + } + else + { + it++; + } + } + + LeaveCriticalSection(&m_csRenderableTileEntities); + + mc->gameRenderer->turnOffLightLayer(a); // 4J - brought forward from 1.8.2 +} + +wstring LevelRenderer::gatherStats1() +{ + return L"C: " + _toString(renderedChunks) + L"/" + _toString(totalChunks) + L". F: " + _toString(offscreenChunks) + L", O: " + _toString(occludedChunks) + L", E: " + _toString(emptyChunks); +} + +wstring LevelRenderer::gatherStats2() +{ + return L"E: " + _toString(renderedEntities) + L"/" + _toString(totalEntities) + L". B: " + _toString(culledEntities) + L", I: " + _toString((totalEntities - culledEntities) - renderedEntities); +} + +void LevelRenderer::resortChunks(int xc, int yc, int zc) +{ + EnterCriticalSection(&m_csDirtyChunks); + xc -= CHUNK_XZSIZE / 2; + yc -= CHUNK_SIZE / 2; + zc -= CHUNK_XZSIZE / 2; + xMinChunk = INT_MAX; + yMinChunk = INT_MAX; + zMinChunk = INT_MAX; + xMaxChunk = INT_MIN; + yMaxChunk = INT_MIN; + zMaxChunk = INT_MIN; + + int playerIndex = mc->player->GetXboxPad(); // 4J added + + int s2 = xChunks * CHUNK_XZSIZE; + int s1 = s2 / 2; + + for (int x = 0; x < xChunks; x++) + { + int xx = x * CHUNK_XZSIZE; + + int xOff = (xx + s1 - xc); + if (xOff < 0) xOff -= (s2 - 1); + xOff /= s2; + xx -= xOff * s2; + + if (xx < xMinChunk) xMinChunk = xx; + if (xx > xMaxChunk) xMaxChunk = xx; + + for (int z = 0; z < zChunks; z++) + { + int zz = z * CHUNK_XZSIZE; + int zOff = (zz + s1 - zc); + if (zOff < 0) zOff -= (s2 - 1); + zOff /= s2; + zz -= zOff * s2; + + if (zz < zMinChunk) zMinChunk = zz; + if (zz > zMaxChunk) zMaxChunk = zz; + + for (int y = 0; y < yChunks; y++) + { + int yy = y * CHUNK_SIZE; + if (yy < yMinChunk) yMinChunk = yy; + if (yy > yMaxChunk) yMaxChunk = yy; + + Chunk *chunk = chunks[playerIndex][(z * yChunks + y) * xChunks + x].chunk; + chunk->setPos(xx, yy, zz); + } + } + } + nonStackDirtyChunksAdded(); + LeaveCriticalSection(&m_csDirtyChunks); +} + +int LevelRenderer::render(shared_ptr player, int layer, double alpha, bool updateChunks) +{ + int playerIndex = mc->player->GetXboxPad(); + + // 4J - added - if the number of players has changed, we need to rebuild things for the new draw distance this will require + if( lastPlayerCount[playerIndex] != activePlayers() ) + { + allChanged(); + } + else if (mc->options->viewDistance != lastViewDistance) + { + allChanged(); + } + + if (layer == 0) + { + totalChunks = 0; + offscreenChunks = 0; + occludedChunks = 0; + renderedChunks = 0; + emptyChunks = 0; + } + + 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; + + double xd = player->x - xOld[playerIndex]; + double yd = player->y - yOld[playerIndex]; + double zd = player->z - zOld[playerIndex]; + + if (xd * xd + yd * yd + zd * zd > 4 * 4) + { + xOld[playerIndex] = player->x; + yOld[playerIndex] = player->y; + zOld[playerIndex] = player->z; + + resortChunks(Mth::floor(player->x), Mth::floor(player->y), Mth::floor(player->z)); + // sort(sortedChunks[playerIndex]->begin(),sortedChunks[playerIndex]->end(), DistanceChunkSorter(player)); // 4J - removed - not sorting our chunks anymore + } + Lighting::turnOff(); + + int count = renderChunks(0, (int)chunks[playerIndex].length, layer, alpha); + + return count; + +} + +#ifdef __PSVITA__ +#include + +// this is need to sort the chunks by depth +typedef struct +{ + int Index; + float Depth; +} SChunckSort; + +int compare (const void * a, const void * b) +{ + return ( ((SChunckSort*)a)->Depth - ((SChunckSort*)b)->Depth ); +} + +#endif + +int LevelRenderer::renderChunks(int from, int to, int layer, double alpha) +{ + int playerIndex = mc->player->GetXboxPad(); // 4J added + +#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; + 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; + + glPushMatrix(); + glTranslatef((float)-xOff, (float)-yOff, (float)-zOff); + +#ifdef __PSVITA__ + // AP - also set the camera position so we can work out if a chunk is fogged or not + RenderManager.SetCameraPosition((float)-xOff, (float)-yOff, (float)-zOff); +#endif + +#if defined __PS3__ && !defined DISABLE_SPU_CODE + // pre- calc'd on the SPU + int count = 0; + waitForCull_SPU(); + if(layer == 0) + { + count = g_cullDataIn[playerIndex].numToRender_layer0; + RenderManager.CBuffCallMultiple(g_cullDataIn[playerIndex].listArray_layer0, count); + } + else // layer == 1 + { + count = g_cullDataIn[playerIndex].numToRender_layer1; + RenderManager.CBuffCallMultiple(g_cullDataIn[playerIndex].listArray_layer1, count); + } + +#else // __PS3__ + +#ifdef __PSVITA__ + // AP - alpha cut out is expensive on vita. First render all the non-alpha cut outs + glDisable(GL_ALPHA_TEST); +#endif + + bool first = true; + int count = 0; + ClipChunk *pClipChunk = chunks[playerIndex].data; + unsigned char emptyFlag = LevelRenderer::CHUNK_FLAG_EMPTY0 << layer; + for( int i = 0; i < chunks[playerIndex].length; i++, pClipChunk++ ) + { + if( !pClipChunk->visible ) continue; // This will be set if the chunk isn't visible, or isn't compiled, or has both empty flags set + if( pClipChunk->globalIdx == -1 ) continue; // Not sure if we should ever encounter this... TODO check + if( ( globalChunkFlags[pClipChunk->globalIdx] & emptyFlag ) == emptyFlag ) continue; // Check that this particular layer isn't empty + + // List can be calculated directly from the chunk's global idex + int list = pClipChunk->globalIdx * 2 + layer; + list += chunkLists; + + if(RenderManager.CBuffCall(list, first)) + { + first = false; + } + count++; + } + +#ifdef __PSVITA__ + // AP - alpha cut out is expensive on vita. Now we render all the alpha cut outs + glEnable(GL_ALPHA_TEST); + RenderManager.StateSetForceLOD(0); // AP - force mipmapping off for cut outs + first = true; + pClipChunk = chunks[playerIndex].data; + emptyFlag = LevelRenderer::CHUNK_FLAG_EMPTY0 << layer; + for( int i = 0; i < chunks[playerIndex].length; i++, pClipChunk++ ) + { + if( !pClipChunk->visible ) continue; // This will be set if the chunk isn't visible, or isn't compiled, or has both empty flags set + if( pClipChunk->globalIdx == -1 ) continue; // Not sure if we should ever encounter this... TODO check + if( ( globalChunkFlags[pClipChunk->globalIdx] & emptyFlag ) == emptyFlag ) continue; // Check that this particular layer isn't empty + if( !(globalChunkFlags[pClipChunk->globalIdx] & LevelRenderer::CHUNK_FLAG_CUT_OUT) ) continue; // Does this chunk contain any cut out geometry + + // List can be calculated directly from the chunk's global idex + int list = pClipChunk->globalIdx * 2 + layer; + list += chunkLists; + + if(RenderManager.CBuffCallCutOut(list, first)) + { + first = false; + } + } + RenderManager.StateSetForceLOD(-1); // AP - back to normal mipmapping +#endif + +#endif // __PS3__ + + glPopMatrix(); + mc->gameRenderer->turnOffLightLayer(alpha); // 4J - brought forward from 1.8.2 + +#else + _renderChunks.clear(); + // int p = 0; + int count = 0; + for (int i = from; i < to; i++) + { + if (layer == 0) + { + totalChunks++; + if (sortedChunks[playerIndex]->at(i)->emptyFlagSet(layer)) emptyChunks++; + else if (!sortedChunks[playerIndex]->at(i)->visible) offscreenChunks++; + else renderedChunks++; + } + + // if (!sortedChunks[i].empty[layer] && sortedChunks[i].visible && (sortedChunks[i].occlusion_visible)) { + if (!(sortedChunks[playerIndex]->at(i)->emptyFlagSet(layer) && sortedChunks[playerIndex]->at(i)->visible )) + { + int list = sortedChunks[playerIndex]->at(i)->getList(layer); + if (list >= 0) + { + _renderChunks.push_back(sortedChunks[playerIndex]->at(i)); + count++; + } + } + } + + 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; + + int lists = 0; + for (int l = 0; l < RENDERLISTS_LENGTH; l++) + { + renderLists[l].clear(); + } + + AUTO_VAR(itEnd, _renderChunks.end()); + for (AUTO_VAR(it, _renderChunks.begin()); it != itEnd; it++) + { + Chunk *chunk = *it; //_renderChunks[i]; + + int list = -1; + for (int l = 0; l < lists; l++) + { + if (renderLists[l].isAt(chunk->xRender, chunk->yRender, chunk->zRender)) + { + list = l; + } + } + if (list < 0) + { + list = lists++; + renderLists[list].init(chunk->xRender, chunk->yRender, chunk->zRender, xOff, yOff, zOff); + } + + renderLists[list].add(chunk->getList(layer)); + } + + renderSameAsLast(layer, alpha); +#endif + + return count; + +} + + +void LevelRenderer::renderSameAsLast(int layer, double alpha) +{ + for (int i = 0; i < RENDERLISTS_LENGTH; i++) + { + renderLists[i].render(); + } +} + +void LevelRenderer::tick() +{ + ticks++; + + if ((ticks % SharedConstants::TICKS_PER_SECOND) == 0) + { + AUTO_VAR(it , destroyingBlocks.begin()); + while (it != destroyingBlocks.end()) + { + BlockDestructionProgress *block = it->second; + + int updatedRenderTick = block->getUpdatedRenderTick(); + + if (ticks - updatedRenderTick > (SharedConstants::TICKS_PER_SECOND * 20)) + { + delete it->second; + it = destroyingBlocks.erase(it); + } + else + { + ++it; + } + } + } +} + +void LevelRenderer::renderSky(float alpha) +{ + if (mc->level->dimension->id == 1) + { + glDisable(GL_FOG); + glDisable(GL_ALPHA_TEST); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + Lighting::turnOff(); + + + glDepthMask(false); + 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++) + { + glPushMatrix(); + if (i == 1) glRotatef(90, 1, 0, 0); + if (i == 2) glRotatef(-90, 1, 0, 0); + if (i == 3) glRotatef(180, 1, 0, 0); + if (i == 4) glRotatef(90, 0, 0, 1); + if (i == 5) glRotatef(-90, 0, 0, 1); + t->begin(); + t->color(0x282828); + t->vertexUV(-100, -100, -100, 0, 0); + t->vertexUV(-100, -100, +100, 0, 16); + t->vertexUV(+100, -100, +100, 16, 16); + t->vertexUV(+100, -100, -100, 16, 0); + t->end(); + glPopMatrix(); + } + t->setMipmapEnable(true); + glDepthMask(true); + glEnable(GL_TEXTURE_2D); + glEnable(GL_ALPHA_TEST); + + return; + } + + if (!mc->level->dimension->isNaturalDimension()) return; + + glDisable(GL_TEXTURE_2D); + + int playerIndex = mc->player->GetXboxPad(); + Vec3 *sc = level[playerIndex]->getSkyColor(mc->cameraTargetPlayer, alpha); + float sr = (float) sc->x; + float sg = (float) sc->y; + float sb = (float) sc->z; + + if (mc->options->anaglyph3d) + { + float srr = (sr * 30 + sg * 59 + sb * 11) / 100; + float sgg = (sr * 30 + sg * 70) / (100); + float sbb = (sr * 30 + sb * 70) / (100); + + sr = srr; + sg = sgg; + sb = sbb; + } + + glColor3f(sr, sg, sb); + + Tesselator *t = Tesselator::getInstance(); + + glDepthMask(false); + +#ifdef __PSVITA__ + // AP - alpha cut out is expensive on vita. + glDisable(GL_ALPHA_TEST); +#endif + + glEnable(GL_FOG); + glColor3f(sr, sg, sb); + glCallList(skyList); + + glDisable(GL_FOG); + glDisable(GL_ALPHA_TEST); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + Lighting::turnOff(); + + float *c = level[playerIndex]->dimension->getSunriseColor(level[playerIndex]->getTimeOfDay(alpha), alpha); + if (c != NULL) + { + glDisable(GL_TEXTURE_2D); + glShadeModel(GL_SMOOTH); + + glPushMatrix(); + { + glRotatef(90, 1, 0, 0); + glRotatef(Mth::sin(level[playerIndex]->getSunAngle(alpha)) < 0 ? 180 : 0, 0, 0, 1); + glRotatef(90, 0, 0, 1); + + float r = c[0]; + float g = c[1]; + float b = c[2]; + if (mc->options->anaglyph3d) + { + float srr = (r * 30 + g * 59 + b * 11) / 100; + float sgg = (r * 30 + g * 70) / (100); + float sbb = (r * 30 + b * 70) / (100); + + r = srr; + g = sgg; + b = sbb; + } + + t->begin(GL_TRIANGLE_FAN); + t->color(r, g, b, c[3]); + + t->vertex((float)(0), (float)( 100), (float)( 0)); + int steps = 16; + t->color(c[0], c[1], c[2], 0.0f); + for (int i = 0; i <= steps; i++) + { + float a = i * PI * 2 / steps; + float _sin = Mth::sin(a); + float _cos = Mth::cos(a); + t->vertex((float)(_sin * 120), (float)( _cos * 120), (float)( -_cos * 40 * c[3])); + } + t->end(); + } + glPopMatrix(); + glShadeModel(GL_FLAT); + } + + glEnable(GL_TEXTURE_2D); + glBlendFunc(GL_SRC_ALPHA, GL_ONE); + glPushMatrix(); + { + float rainBrightness = 1 - level[playerIndex]->getRainLevel(alpha); + float xp = 0; + float yp = 0; + float zp = 0; + glColor4f(1, 1, 1, rainBrightness); + glTranslatef(xp, yp, zp); + glRotatef(-90, 0, 1, 0); + glRotatef(level[playerIndex]->getTimeOfDay(alpha) * 360, 1, 0, 0); + float ss = 30; + + MemSect(31); + textures->bindTexture(&SUN_LOCATION); + MemSect(0); + t->begin(); + t->vertexUV((float)(-ss), (float)( 100), (float)( -ss), (float)( 0), (float)( 0)); + t->vertexUV((float)(+ss), (float)( 100), (float)( -ss), (float)( 1), (float)( 0)); + t->vertexUV((float)(+ss), (float)( 100), (float)( +ss), (float)( 1), (float)( 1)); + t->vertexUV((float)(-ss), (float)( 100), (float)( +ss), (float)( 0), (float)( 1)); + t->end(); + + ss = 20; + 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; + float v0 = (v + 0) / 2.0f; + float u1 = (u + 1) / 4.0f; + float v1 = (v + 1) / 2.0f; + t->begin(); + t->vertexUV(-ss, -100, +ss, u1, v1); + t->vertexUV(+ss, -100, +ss, u0, v1); + t->vertexUV(+ss, -100, -ss, u0, v0); + t->vertexUV(-ss, -100, -ss, u1, v0); + t->end(); + + glDisable(GL_TEXTURE_2D); + float br = level[playerIndex]->getStarBrightness(alpha) * rainBrightness; + if (br > 0) + { + glColor4f(br, br, br, br); + glCallList(starList); + } + glColor4f(1, 1, 1, 1); + } + glDisable(GL_BLEND); + glEnable(GL_ALPHA_TEST); + glEnable(GL_FOG); + +#ifdef __PSVITA__ + // AP - alpha cut out is expensive on vita. + glDisable(GL_ALPHA_TEST); +#endif + + glPopMatrix(); + glDisable(GL_TEXTURE_2D); + glColor3f(0, 0, 0); + + double yy = mc->player->getPos(alpha)->y - level[playerIndex]->getHorizonHeight(); // 4J - getHorizonHeight moved forward from 1.2.3 + if (yy < 0) + { + glPushMatrix(); + glTranslatef(0, -(float) (-12), 0); + glCallList(darkList); + glPopMatrix(); + + // 4J - can't work out what this big black box is for. Taking it out until someone misses it... it causes a big black box to visible appear in 3rd person mode whilst under the ground. +#if 0 + float ss = 1; + float yo = -(float) (yy + 65); + float y0 = -ss; + float y1 = yo; + + + t->begin(); + t->color(0x000000, 255); + t->vertex(-ss, y1, ss); + t->vertex(+ss, y1, ss); + t->vertex(+ss, y0, ss); + t->vertex(-ss, y0, ss); + + t->vertex(-ss, y0, -ss); + t->vertex(+ss, y0, -ss); + t->vertex(+ss, y1, -ss); + t->vertex(-ss, y1, -ss); + + t->vertex(+ss, y0, -ss); + t->vertex(+ss, y0, +ss); + t->vertex(+ss, y1, +ss); + t->vertex(+ss, y1, -ss); + + t->vertex(-ss, y1, -ss); + t->vertex(-ss, y1, +ss); + t->vertex(-ss, y0, +ss); + t->vertex(-ss, y0, -ss); + + t->vertex(-ss, y0, -ss); + t->vertex(-ss, y0, +ss); + t->vertex(+ss, y0, +ss); + t->vertex(+ss, y0, -ss); + t->end(); +#endif + } + + if (level[playerIndex]->dimension->hasGround()) + { + glColor3f(sr * 0.2f + 0.04f, sg * 0.2f + 0.04f, sb * 0.6f + 0.1f); + } + else + { + glColor3f(sr, sg, sb); + } + glPushMatrix(); + glTranslatef(0, -(float) (yy - 16), 0); + glCallList(darkList); + glPopMatrix(); + glEnable(GL_TEXTURE_2D); + + glDepthMask(true); +} + +void LevelRenderer::renderHaloRing(float alpha) +{ +#if !defined(__PS3__) && !defined(__ORBIS__) && !defined(__PSVITA__) + if (!mc->level->dimension->isNaturalDimension()) return; + + glDisable(GL_ALPHA_TEST); + glDisable(GL_TEXTURE_2D); + glDepthMask(false); + glEnable(GL_FOG); + + int playerIndex = mc->player->GetXboxPad(); + + Vec3 *sc = level[playerIndex]->getSkyColor(mc->cameraTargetPlayer, alpha); + float sr = (float) sc->x; + float sg = (float) sc->y; + float sb = (float) sc->z; + + // Rough lumninance calculation + float Y = (sr+sr+sb+sg+sg+sg)/6; + float br = 0.6f + (Y*0.4f); + //app.DebugPrintf("Luminance = %f, brightness = %f\n", Y, br); + glColor3f(br,br,br); + + // Fog at the base near the world + glFogi(GL_FOG_MODE, GL_LINEAR); + glFogf(GL_FOG_START, HALO_RING_RADIUS); + glFogf(GL_FOG_END, HALO_RING_RADIUS * 0.20f); + + Lighting::turnOn(); + + glDepthMask(false); + textures->bindTexture(L"misc/haloRing.png"); // 4J was L"/1_2_2/misc/tunnel.png" + Tesselator *t = Tesselator::getInstance(); + bool prev = t->setMipmapEnable(true); + + glPushMatrix(); + glRotatef(-90, 1, 0, 0); + glRotatef(90, 0, 1, 0); + glCallList(haloRingList); + glPopMatrix(); + t->setMipmapEnable(prev); + + glDepthMask(true); + glEnable(GL_TEXTURE_2D); + glEnable(GL_ALPHA_TEST); + + glDisable(GL_FOG); +#endif +} + +void LevelRenderer::renderClouds(float alpha) +{ + int iTicks=ticks; + int playerIndex = mc->player->GetXboxPad(); + + // if the primary player has clouds off, so do all players on this machine + if(app.GetGameSettings(ProfileManager.GetPrimaryPad(),eGameSetting_Clouds)==0) + { + return; + } + + // debug setting added to keep it at day time + if (!mc->level->dimension->isNaturalDimension()) return; + + if (mc->options->fancyGraphics) + { + renderAdvancedClouds(alpha); + return; + } + + if(app.DebugSettingsOn()) + { + if(app.GetGameSettingsDebugMask(ProfileManager.GetPrimaryPad())&(1L<cameraTargetPlayer->yOld + (mc->cameraTargetPlayer->y - mc->cameraTargetPlayer->yOld) * alpha); + int s = 32; + int d = 256 / s; + Tesselator *t = Tesselator::getInstance(); + + textures->bindTexture(&CLOUDS_LOCATION); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + Vec3 *cc = level[playerIndex]->getCloudColor(alpha); + float cr = (float) cc->x; + float cg = (float) cc->y; + float cb = (float) cc->z; + + if (mc->options->anaglyph3d) + { + float crr = (cr * 30 + cg * 59 + cb * 11) / 100; + float cgg = (cr * 30 + cg * 70) / (100); + float cbb = (cr * 30 + cb * 70) / (100); + + cr = crr; + cg = cgg; + cb = cbb; + } + + + + float scale = 1 / 2048.0f; + + double time = (ticks + alpha); + double xo = mc->cameraTargetPlayer->xo + (mc->cameraTargetPlayer->x - mc->cameraTargetPlayer->xo) * alpha + time * 0.03f; + double zo = mc->cameraTargetPlayer->zo + (mc->cameraTargetPlayer->z - mc->cameraTargetPlayer->zo) * alpha; + int xOffs = Mth::floor(xo / 2048); + int zOffs = Mth::floor(zo / 2048); + xo -= xOffs * 2048; + zo -= zOffs * 2048; + + float yy = (float) (level[playerIndex]->dimension->getCloudHeight() - yOffs + 0.33f); + float uo = (float) (xo * scale); + float vo = (float) (zo * scale); + t->begin(); + + t->color(cr, cg, cb, 0.8f); + for (int xx = -s * d; xx < +s * d; xx += s) + { + for (int zz = -s * d; zz < +s * d; zz += s) + { + t->vertexUV((float)(xx + 0), (float)( yy), (float)( zz + s), (float)( (xx + 0) * scale + uo), (float)( (zz + s) * scale + vo)); + t->vertexUV((float)(xx + s), (float)( yy), (float)( zz + s), (float)( (xx + s) * scale + uo), (float)( (zz + s) * scale + vo)); + t->vertexUV((float)(xx + s), (float)( yy), (float)( zz + 0), (float)( (xx + s) * scale + uo), (float)( (zz + 0) * scale + vo)); + t->vertexUV((float)(xx + 0), (float)( yy), (float)( zz + 0), (float)( (xx + 0) * scale + uo), (float)( (zz + 0) * scale + vo)); + } + } + t->end(); + + glColor4f(1, 1, 1, 1.0f); + glDisable(GL_BLEND); + glEnable(GL_CULL_FACE); + + if(app.DebugSettingsOn()) + { + + if(!(app.GetGameSettingsDebugMask(ProfileManager.GetPrimaryPad())&(1L<begin(); + for( int zt = 0; zt < D; zt++ ) + { + for( int xt = 0; xt < D; xt++ ) + { + float u = (((float) xt ) + 0.5f ) / 256.0f; + float v = (((float) zt ) + 0.5f ) / 256.0f; + float x0 = (float)xt; + float x1 = x0 + 1.0f; + float y0 = 0; + float y1 = h; + float z0 = (float)zt; + float z1 = z0 + 1.0f; + t->color(0.7f, 0.7f, 0.7f, 0.8f); + t->normal(0, -1, 0); + t->vertexUV(x0, y0, z0, u, v ); + t->vertexUV(x1, y0, z0, u, v ); + t->vertexUV(x1, y0, z1, u, v ); + t->vertexUV(x0, y0, z1, u, v ); + } + } + t->end(); + } + if( ( i == 1 ) || ( i == 6 ) ) + { + t->begin(); + for( int zt = 0; zt < D; zt++ ) + { + for( int xt = 0; xt < D; xt++ ) + { + float u = (((float) xt ) + 0.5f ) / 256.0f; + float v = (((float) zt ) + 0.5f ) / 256.0f; + float x0 = (float)xt; + float x1 = x0 + 1.0f; + float y0 = 0; + float y1 = h; + float z0 = (float)zt; + float z1 = z0 + 1.0f; + t->color(1.0f, 1.0f, 1.0f, 0.8f); + t->normal(0, 1, 0); + t->vertexUV(x0, y1, z1, u, v ); + t->vertexUV(x1, y1, z1, u, v ); + t->vertexUV(x1, y1, z0, u, v ); + t->vertexUV(x0, y1, z0, u, v ); + } + } + t->end(); + } + if( ( i == 2 ) || ( i == 6 ) ) + { + t->begin(); + for( int zt = 0; zt < D; zt++ ) + { + for( int xt = 0; xt < D; xt++ ) + { + float u = (((float) xt ) + 0.5f ) / 256.0f; + float v = (((float) zt ) + 0.5f ) / 256.0f; + float x0 = (float)xt; + float x1 = x0 + 1.0f; + float y0 = 0; + float y1 = h; + float z0 = (float)zt; + float z1 = z0 + 1.0f; + t->color(0.9f, 0.9f, 0.9f, 0.8f); + t->normal(-1, 0, 0); + t->vertexUV(x0, y0, z1, u, v ); + t->vertexUV(x0, y1, z1, u, v ); + t->vertexUV(x0, y1, z0, u, v ); + t->vertexUV(x0, y0, z0, u, v ); + } + } + t->end(); + } + if( ( i == 3 ) || ( i == 6 ) ) + { + t->begin(); + for( int zt = 0; zt < D; zt++ ) + { + for( int xt = 0; xt < D; xt++ ) + { + float u = (((float) xt ) + 0.5f ) / 256.0f; + float v = (((float) zt ) + 0.5f ) / 256.0f; + float x0 = (float)xt; + float x1 = x0 + 1.0f; + float y0 = 0; + float y1 = h; + float z0 = (float)zt; + float z1 = z0 + 1.0f; + t->color(0.9f, 0.9f, 0.9f, 0.8f); + t->normal(1, 0, 0); + t->vertexUV(x1, y0, z0, u, v ); + t->vertexUV(x1, y1, z0, u, v ); + t->vertexUV(x1, y1, z1, u, v ); + t->vertexUV(x1, y0, z1, u, v ); + } + } + t->end(); + } + if( ( i == 4 ) || ( i == 6 ) ) + { + t->begin(); + for( int zt = 0; zt < D; zt++ ) + { + for( int xt = 0; xt < D; xt++ ) + { + float u = (((float) xt ) + 0.5f ) / 256.0f; + float v = (((float) zt ) + 0.5f ) / 256.0f; + float x0 = (float)xt; + float x1 = x0 + 1.0f; + float y0 = 0; + float y1 = h; + float z0 = (float)zt; + float z1 = z0 + 1.0f; + t->color(0.8f, 0.8f, 0.8f, 0.8f); + t->normal(-1, 0, 0); + t->vertexUV(x0, y1, z0, u, v ); + t->vertexUV(x1, y1, z0, u, v ); + t->vertexUV(x1, y0, z0, u, v ); + t->vertexUV(x0, y0, z0, u, v ); + } + } + t->end(); + } + if( ( i == 5 ) || ( i == 6 ) ) + { + t->begin(); + for( int zt = 0; zt < D; zt++ ) + { + for( int xt = 0; xt < D; xt++ ) + { + float u = (((float) xt ) + 0.5f ) / 256.0f; + float v = (((float) zt ) + 0.5f ) / 256.0f; + float x0 = (float)xt; + float x1 = x0 + 1.0f; + float y0 = 0; + float y1 = h; + float z0 = (float)zt; + float z1 = z0 + 1.0f; + t->color(0.8f, 0.8f, 0.8f, 0.8f); + t->normal(1, 0, 0); + t->vertexUV(x0, y0, z1, u, v ); + t->vertexUV(x1, y0, z1, u, v ); + t->vertexUV(x1, y1, z1, u, v ); + t->vertexUV(x0, y1, z1, u, v ); + } + } + t->end(); + } + glEndList(); + } +} + +void LevelRenderer::renderAdvancedClouds(float alpha) +{ + // MGH - added, we were getting dark clouds sometimes on PS3, with this being setup incorrectly + glMultiTexCoord2f(GL_TEXTURE1, 0, 0); + + + // 4J - most of our viewports are now rendered with no clip planes but using stencilling to limit the area drawn to. Clouds have a relatively large fill area compared to + // the number of vertices that they have, and so enabling clipping here to try and reduce fill rate cost. + RenderManager.StateSetEnableViewportClipPlanes(true); + float yOffs = (float) (mc->cameraTargetPlayer->yOld + (mc->cameraTargetPlayer->y - mc->cameraTargetPlayer->yOld) * alpha); + Tesselator *t = Tesselator::getInstance(); + int playerIndex = mc->player->GetXboxPad(); + + int iTicks=ticks; + + if(app.DebugSettingsOn()) + { + if(app.GetGameSettingsDebugMask(ProfileManager.GetPrimaryPad())&(1L<cameraTargetPlayer->xo + (mc->cameraTargetPlayer->x - mc->cameraTargetPlayer->xo) * alpha + time * 0.03f) / ss; + double zo = (mc->cameraTargetPlayer->zo + (mc->cameraTargetPlayer->z - mc->cameraTargetPlayer->zo) * alpha) / ss + 0.33f; + float yy = (float) (level[playerIndex]->dimension->getCloudHeight() - yOffs + 0.33f); + int xOffs = Mth::floor(xo / 2048); + int zOffs = Mth::floor(zo / 2048); + xo -= xOffs * 2048; + zo -= zOffs * 2048; + + // 4J - we are now conditionally rendering the clouds in two ways + // (1) if we are (by our y height) in the clouds, then we render in a mode quite like the original, with no backface culling, and + // decisions on which sides of the clouds to render based on the positions of the 8x8 blocks of cloud texels + // (2) if we aren't in the clouds, then we do a simpler form of rendering with backface culling on + // This is because the complex sort of rendering is really there so that the clouds seem more solid when you might be in them, but it has more risk of artifacts so + // we don't want to do it when not necessary + + bool noBFCMode = ( (yy > -h - 1) && (yy <= h + 1) ); + if( noBFCMode ) + { + glDisable(GL_CULL_FACE); + } + else + { + glEnable(GL_CULL_FACE); + } + + MemSect(31); + textures->bindTexture(&CLOUDS_LOCATION); // 4J was L"/environment/clouds.png" + MemSect(0); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + Vec3 *cc = level[playerIndex]->getCloudColor(alpha); + float cr = (float) cc->x; + float cg = (float) cc->y; + float cb = (float) cc->z; + + if (mc->options->anaglyph3d) + { + float crr = (cr * 30 + cg * 59 + cb * 11) / 100; + float cgg = (cr * 30 + cg * 70) / (100); + float cbb = (cr * 30 + cb * 70) / (100); + + cr = crr; + cg = cgg; + cb = cbb; + } + + float uo = (float) (xo * 0); + float vo = (float) (zo * 0); + + float scale = 1 / 256.0f; + + uo = (float) (Mth::floor(xo)) * scale; + vo = (float) (Mth::floor(zo)) * scale; + // 4J - keep our UVs +ve - there's a small bug in the xbox GPU that incorrectly rounds small -ve UVs (between -1/(64*size) and 0) up to 0, which leaves gaps in our clouds... + while( uo < 1.0f ) uo += 1.0f; + while( vo < 1.0f ) vo += 1.0f; + + float xoffs = (float) (xo - Mth::floor(xo)); + float zoffs = (float) (zo - Mth::floor(zo)); + + int D = 8; + + int radius = 3; + if( activePlayers() > 2 ) radius = 2; // 4J - reduce the cloud render distance a bit for 3 & 4 player split screen + float e = 1 / 1024.0f; + glScalef(ss, 1, ss); + FrustumData* pFrustumData = Frustum::getFrustum(); + for (int pass = 0; pass < 2; pass++) + { + if (pass == 0) + { + // 4J - changed to use blend rather than color mask to avoid writing to frame buffer, to work with our command buffers + glBlendFunc(GL_ZERO, GL_ONE); + // glColorMask(false, false, false, false); + } + else + { + // 4J - changed to use blend rather than color mask to avoid writing to frame buffer, to work with our command buffers + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + // glColorMask(true, true, true, true); + } + for (int xPos = -radius + 1; xPos <= radius; xPos++) + { + for (int zPos = -radius + 1; zPos <= radius; zPos++) + { + // 4J - reimplemented the clouds with full cube-per-texel geometry to get rid of seams. This is a huge amount more quads to render, so + // now using command buffers to render each section to cut CPU hit. +#if 1 + float xx = (float)(xPos * D); + float zz = (float)(zPos * D); + float xp = xx - xoffs; + float zp = zz - zoffs; + + if( !pFrustumData->cubeInFrustum(0+xp,0+yy,0+zp, 8+xp,4+yy,8+zp) ) + continue; + + + + glMatrixMode(GL_TEXTURE); + glLoadIdentity(); + glTranslatef(xx / 256.0f + uo, zz / 256.0f + vo, 0); + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glTranslatef(xp,yy,zp); + + glColor4f(cr, cg, cb, 1.0f ); + if( noBFCMode ) + { + // This is the more complex form of render the clouds, based on the way that the original code picked which sides to render, with backface culling disabled. + // This is to give a more solid version of the clouds for when the player might be inside them. + bool draw[6] = {false,false,false,false,false,false}; + + // These rules to decide which sides to draw are the same as the original code below + if (yy > -h - 1) draw[0] = true; + if (yy <= h + 1) draw[1] = true; + if (xPos > -1) draw[2] = true; + if (xPos <= 1) draw[3] = true; + if (zPos > -1) draw[4] = true; + if (zPos <= 1) draw[5] = true; + + // Top and bottom just render when required + if( draw[0] ) glCallList(cloudList); + if( draw[1] ) glCallList(cloudList + 1); + // For x facing sides, if we are actually in the clouds and about to draw both sides of the x sides too, then + // do a little offsetting here to avoid z fighting + if( draw[0] && draw[1] && draw[2] && draw[3] ) + { + glTranslatef(e, 0.0f, 0.0f ); + glCallList(cloudList + 2); + glTranslatef(-e, 0.0f, 0.0f ); + glCallList(cloudList + 3); + } + else + { + if( draw[2] ) glCallList(cloudList + 2); + if( draw[3] ) glCallList(cloudList + 3); + } + // For z facing sides, if we are actually in the clouds and about to draw both sides of the z sides too, then + // do a little offsetting here to avoid z fighting + if( draw[0] && draw[1] && draw[4] && draw[5] ) + { + glTranslatef(0.0f, 0.0f, e ); + glCallList(cloudList + 4); + glTranslatef(0.0f, 0.0f, -e ); + glCallList(cloudList + 5); + } + else + { + if( draw[4] ) glCallList(cloudList + 4); + if( draw[5] ) glCallList(cloudList + 5); + } + } + else + { + // Simpler form of rendering that we can do most of the time, when we aren't potentially inside a cloud + glCallList(cloudList + 6); + } + glPopMatrix(); + glMatrixMode(GL_TEXTURE); + glLoadIdentity(); + glMatrixMode(GL_MODELVIEW); +#else + + t->begin(); + float xx = (float)(xPos * D); + float zz = (float)(zPos * D); + float xp = xx - xoffs; + float zp = zz - zoffs; + + + if (yy > -h - 1) + { + t->color(cr * 0.7f, cg * 0.7f, cb * 0.7f, 0.8f); + t->normal(0, -1, 0); + t->vertexUV((float)(xp + 0), (float)( yy + 0), (float)( zp + D), (float)( (xx + 0) * scale + uo), (float)( (zz + D) * scale + vo)); + t->vertexUV((float)(xp + D), (float)( yy + 0), (float)( zp + D), (float)( (xx + D) * scale + uo), (float)( (zz + D) * scale + vo)); + t->vertexUV((float)(xp + D), (float)( yy + 0), (float)( zp + 0), (float)( (xx + D) * scale + uo), (float)( (zz + 0) * scale + vo)); + t->vertexUV((float)(xp + 0), (float)( yy + 0), (float)( zp + 0), (float)( (xx + 0) * scale + uo), (float)( (zz + 0) * scale + vo)); + } + + if (yy <= h + 1) + { + t->color(cr, cg, cb, 0.8f); + t->normal(0, 1, 0); + t->vertexUV((float)(xp + 0), (float)( yy + h - e), (float)( zp + D), (float)( (xx + 0) * scale + uo), (float)( (zz + D) * scale + vo)); + t->vertexUV((float)(xp + D), (float)( yy + h - e), (float)( zp + D), (float)( (xx + D) * scale + uo), (float)( (zz + D) * scale + vo)); + t->vertexUV((float)(xp + D), (float)( yy + h - e), (float)( zp + 0), (float)( (xx + D) * scale + uo), (float)( (zz + 0) * scale + vo)); + t->vertexUV((float)(xp + 0), (float)( yy + h - e), (float)( zp + 0), (float)( (xx + 0) * scale + uo), (float)( (zz + 0) * scale + vo)); + } + + t->color(cr * 0.9f, cg * 0.9f, cb * 0.9f, 0.8f); + if (xPos > -1) + { + t->normal(-1, 0, 0); + for (int i = 0; i < D; i++) + { + t->vertexUV((float)(xp + i + 0), (float)( yy + 0), (float)( zp + D), (float)( (xx + i + 0.5f) * scale + uo), (float)( (zz + D) * scale + vo)); + t->vertexUV((float)(xp + i + 0), (float)( yy + h), (float)( zp + D), (float)( (xx + i + 0.5f) * scale + uo), (float)( (zz + D) * scale + vo)); + t->vertexUV((float)(xp + i + 0), (float)( yy + h), (float)( zp + 0), (float)( (xx + i + 0.5f) * scale + uo), (float)( (zz + 0) * scale + vo)); + t->vertexUV((float)(xp + i + 0), (float)( yy + 0), (float)( zp + 0), (float)( (xx + i + 0.5f) * scale + uo), (float)( (zz + 0) * scale + vo)); + } + } + + if (xPos <= 1) + { + t->normal(+1, 0, 0); + for (int i = 0; i < D; i++) + { + t->vertexUV((float)(xp + i + 1 - e), (float)( yy + 0), (float)( zp + D), (float)( (xx + i + 0.5f) * scale + uo), (float)( (zz + D) * scale + vo)); + t->vertexUV((float)(xp + i + 1 - e), (float)( yy + h), (float)( zp + D), (float)( (xx + i + 0.5f) * scale + uo), (float)( (zz + D) * scale + vo)); + t->vertexUV((float)(xp + i + 1 - e), (float)( yy + h), (float)( zp + 0), (float)( (xx + i + 0.5f) * scale + uo), (float)( (zz + 0) * scale + vo)); + t->vertexUV((float)(xp + i + 1 - e), (float)( yy + 0), (float)( zp + 0), (float)( (xx + i + 0.5f) * scale + uo), (float)( (zz + 0) * scale + vo)); + } + } + + t->color(cr * 0.8f, cg * 0.8f, cb * 0.8f, 0.8f); + if (zPos > -1) + { + t->normal(0, 0, -1); + for (int i = 0; i < D; i++) + { + t->vertexUV((float)(xp + 0), (float)( yy + h), (float)( zp + i + 0), (float)( (xx + 0) * scale + uo), (float)( (zz + i + 0.5f) * scale + vo)); + t->vertexUV((float)(xp + D), (float)( yy + h), (float)( zp + i + 0), (float)( (xx + D) * scale + uo), (float)( (zz + i + 0.5f) * scale + vo)); + t->vertexUV((float)(xp + D), (float)( yy + 0), (float)( zp + i + 0), (float)( (xx + D) * scale + uo), (float)( (zz + i + 0.5f) * scale + vo)); + t->vertexUV((float)(xp + 0), (float)( yy + 0), (float)( zp + i + 0), (float)( (xx + 0) * scale + uo), (float)( (zz + i + 0.5f) * scale + vo)); + } + } + + if (zPos <= 1) + { + t->normal(0, 0, 1); + for (int i = 0; i < D; i++) + { + t->vertexUV((float)(xp + 0), (float)( yy + h), (float)( zp + i + 1 - e), (float)( (xx + 0) * scale + uo), (float)( (zz + i + 0.5f) * scale + vo)); + t->vertexUV((float)(xp + D), (float)( yy + h), (float)( zp + i + 1 - e), (float)( (xx + D) * scale + uo), (float)( (zz + i + 0.5f) * scale + vo)); + t->vertexUV((float)(xp + D), (float)( yy + 0), (float)( zp + i + 1 - e), (float)( (xx + D) * scale + uo), (float)( (zz + i + 0.5f) * scale + vo)); + t->vertexUV((float)(xp + 0), (float)( yy + 0), (float)( zp + i + 1 - e), (float)( (xx + 0) * scale + uo), (float)( (zz + i + 0.5f) * scale + vo)); + } + } + t->end(); +#endif + } + } + } + + glColor4f(1, 1, 1, 1.0f); + glDisable(GL_BLEND); + glEnable(GL_CULL_FACE); + + + if(app.DebugSettingsOn()) + { + if(!(app.GetGameSettingsDebugMask(ProfileManager.GetPrimaryPad())&(1L< > nearestClipChunks; +#endif + + ClipChunk *nearChunk = NULL; // Nearest chunk that is dirty + int veryNearCount = 0; + int minDistSq = 0x7fffffff; // Distances to this chunk + + + // Set a flag if we should only rebuild existing chunks, not create anything new + unsigned int memAlloc = RenderManager.CBuffSize(-1); + /* + static int throttle = 0; + if( ( throttle % 100 ) == 0 ) + { + app.DebugPrintf("CBuffSize: %d\n",memAlloc/(1024*1024)); + } + throttle++; + */ + PIXAddNamedCounter(((float)memAlloc)/(1024.0f*1024.0f),"Command buffer allocations"); + bool onlyRebuild = ( memAlloc >= MAX_COMMANDBUFFER_ALLOCATIONS ); + EnterCriticalSection(&m_csDirtyChunks); + + // Move any dirty chunks stored in the lock free stack into global flags + int index = 0; + + do + { + // See comment on dirtyChunksLockFreeStack.Push() regarding details of this casting/subtracting -2. + index = (size_t)dirtyChunksLockFreeStack.Pop(); +#ifdef _CRITICAL_CHUNKS + int oldIndex = index; + index &= 0x0fffffff; // remove the top bit that marked the chunk as non-critical +#endif + if( index == 1 ) dirtyChunkPresent = true; // 1 is a special value passed to let this thread know that a chunk which isn't on this stack has been set to dirty + else if( index > 1 ) + { + int i2 = index - 2; + if( i2 >= DIMENSION_OFFSETS[2] ) + { + i2 -= DIMENSION_OFFSETS[2]; + int y2 = i2 & (CHUNK_Y_COUNT-1); + i2 /= CHUNK_Y_COUNT; + int z2 = i2 / MAX_LEVEL_RENDER_SIZE[2]; + int x2 = i2 - z2 * MAX_LEVEL_RENDER_SIZE[2]; + x2 -= MAX_LEVEL_RENDER_SIZE[2] / 2; + z2 -= MAX_LEVEL_RENDER_SIZE[2] / 2; + } + setGlobalChunkFlag(index - 2, CHUNK_FLAG_DIRTY); + +#ifdef _CRITICAL_CHUNKS + if( !(oldIndex & 0x10000000) ) // was this chunk not marked as non-critical. Ugh double negatives + { + setGlobalChunkFlag(index - 2, CHUNK_FLAG_CRITICAL); + } +#endif + + dirtyChunkPresent = true; + } + } while( index ); + + // Only bother searching round all the chunks if we have some dirty chunk(s) + if( dirtyChunkPresent ) + { + lastDirtyChunkFound = System::currentTimeMillis(); + PIXBeginNamedEvent(0,"Finding nearest chunk\n"); +#if defined __PS3__ && !defined DISABLE_SPU_CODE + // find the nearest chunk with a spu task, copy all the data over here for uploading to SPU + g_findNearestChunkDataIn.numGlobalChunks = getGlobalChunkCount(); + g_findNearestChunkDataIn.pGlobalChunkFlags = globalChunkFlags; + g_findNearestChunkDataIn.onlyRebuild = onlyRebuild; + g_findNearestChunkDataIn.lowerOffset = (int)&((LevelChunk*)0)->lowerBlocks; // dodgy bit of class structure poking, as we don't want to try and get the whole of LevelChunk copmpiling on SPU + g_findNearestChunkDataIn.upperOffset = (int)&((LevelChunk*)0)->upperBlocks; + g_findNearestChunkDataIn.xChunks = xChunks; + g_findNearestChunkDataIn.yChunks = yChunks; + g_findNearestChunkDataIn.zChunks = zChunks; + + for(int i=0;i<4;i++) + { + g_findNearestChunkDataIn.chunks[i] = (LevelRenderer_FindNearestChunk_DataIn::ClipChunk*)chunks[i].data; + g_findNearestChunkDataIn.chunkLengths[i] = chunks[i].length; + g_findNearestChunkDataIn.level[i] = level[i]; + g_findNearestChunkDataIn.playerData[i].bValid = mc->localplayers[i] != NULL; + if(mc->localplayers[i] != NULL) + { + g_findNearestChunkDataIn.playerData[i].x = mc->localplayers[i]->x; + g_findNearestChunkDataIn.playerData[i].y = mc->localplayers[i]->y; + g_findNearestChunkDataIn.playerData[i].z = mc->localplayers[i]->z; + + } + if(level[i] != NULL) + { + g_findNearestChunkDataIn.multiplayerChunkCache[i].XZOFFSET = ((MultiPlayerChunkCache*)(level[i]->chunkSource))->XZOFFSET; + g_findNearestChunkDataIn.multiplayerChunkCache[i].XZSIZE = ((MultiPlayerChunkCache*)(level[i]->chunkSource))->XZSIZE; + g_findNearestChunkDataIn.multiplayerChunkCache[i].cache = (void**)((MultiPlayerChunkCache*)(level[i]->chunkSource))->cache; + } + + } + + // assert(sizeof(LevelRenderer_FindNearestChunk_DataIn::Chunk) == sizeof(Chunk)); + C4JSpursJob_LevelRenderer_FindNearestChunk findJob(&g_findNearestChunkDataIn); + m_jobPort_FindNearestChunk->submitJob(&findJob); + m_jobPort_FindNearestChunk->waitForCompletion(); + nearChunk = (ClipChunk*)g_findNearestChunkDataIn.nearChunk; + veryNearCount = g_findNearestChunkDataIn.veryNearCount; +#else // __PS3__ + +#ifdef _LARGE_WORLDS + int maxNearestChunks = MAX_CONCURRENT_CHUNK_REBUILDS; + // 4J Stu - On XboxOne we should cut this down if in a constrained state so the saving threads get more time +#endif + // Find nearest chunk that is dirty + for( int p = 0; p < XUSER_MAX_COUNT; p++ ) + { + // It's possible that the localplayers member can be set to NULL on the main thread when a player chooses to exit the game + // So take a reference to the player object now. As it is a shared_ptr it should live as long as we need it + shared_ptr player = mc->localplayers[p]; + if( player == NULL ) continue; + if( chunks[p].data == NULL ) continue; + if( level[p] == NULL ) continue; + if( chunks[p].length != xChunks * zChunks * CHUNK_Y_COUNT ) continue; + int px = (int)player->x; + int py = (int)player->y; + int pz = (int)player->z; + + // app.DebugPrintf("!! %d %d %d, %d %d %d {%d,%d} ",px,py,pz,stackChunkDirty,nonStackChunkDirty,onlyRebuild, xChunks, zChunks); + + int considered = 0; + int wouldBeNearButEmpty = 0; + for( int x = 0; x < xChunks; x++ ) + { + for( int z = 0; z < zChunks; z++ ) + { + for( int y = 0; y < CHUNK_Y_COUNT; y++ ) + { + ClipChunk *pClipChunk = &chunks[p][(z * yChunks + y) * xChunks + x]; + // Get distance to this chunk - deliberately not calling the chunk's method of doing this to avoid overheads (passing entitie, type conversion etc.) that this involves + int xd = pClipChunk->xm - px; + int yd = pClipChunk->ym - py; + int zd = pClipChunk->zm - pz; + int distSq = xd * xd + yd * yd + zd * zd; + int distSqWeighted = xd * xd + yd * yd * 4 + zd * zd; // Weighting against y to prioritise things in same x/z plane as player first + + if( globalChunkFlags[ pClipChunk->globalIdx ] & CHUNK_FLAG_DIRTY ) + { + if( (!onlyRebuild) || + globalChunkFlags[ pClipChunk->globalIdx ] & CHUNK_FLAG_COMPILED || + ( distSq < 20 * 20 ) ) // Always rebuild really near things or else building (say) at tower up into empty blocks when we are low on memory will not create render data + { + considered++; + // Is this chunk nearer than our nearest? +#ifdef _LARGE_WORLDS + bool isNearer = nearestClipChunks.empty(); + AUTO_VAR(itNearest, nearestClipChunks.begin()); + for(; itNearest != nearestClipChunks.end(); ++itNearest) + { + isNearer = distSqWeighted < itNearest->second; + if(isNearer) break; + } + isNearer = isNearer || (nearestClipChunks.size() < maxNearestChunks); +#else + bool isNearer = distSqWeighted < minDistSq; +#endif + +#ifdef _CRITICAL_CHUNKS + // AP - this will make sure that if a deferred grouping has started, only critical chunks go into that + // grouping, even if a non-critical chunk is closer. + if( (!veryNearCount && isNearer) || + (distSq < 20 * 20 && (globalChunkFlags[ pClipChunk->globalIdx ] & CHUNK_FLAG_CRITICAL)) ) +#else + if( isNearer ) +#endif + { + // At this point we've got a chunk that we would like to consider for rendering, at least based on its proximity to the player(s). + // Its *quite* quick to generate empty render data for render chunks, but if we let the rebuilding do that then the after rebuilding we will have + // to start searching for the next nearest chunk from scratch again. Instead, its better to detect empty chunks at this stage, flag them up as not dirty + // (and empty), and carry on. The levelchunk's isRenderChunkEmpty method can be quite optimal as it can make use of the chunk's data compression to detect + // emptiness without actually testing as many data items as uncompressed data would. + Chunk *chunk = pClipChunk->chunk; + LevelChunk *lc = level[p]->getChunkAt(chunk->x,chunk->z); + if( !lc->isRenderChunkEmpty(y * 16) ) + { + nearChunk = pClipChunk; + minDistSq = distSqWeighted; +#ifdef _LARGE_WORLDS + nearestClipChunks.insert(itNearest, std::pair(nearChunk, minDistSq) ); + if(nearestClipChunks.size() > maxNearestChunks) + { + nearestClipChunks.pop_back(); + } +#endif + } + else + { + chunk->clearDirty(); + globalChunkFlags[ pClipChunk->globalIdx ] |= CHUNK_FLAG_EMPTYBOTH; + wouldBeNearButEmpty++; + } + } + +#ifdef _CRITICAL_CHUNKS + // AP - is the chunk near and also critical + if( distSq < 20 * 20 && ((globalChunkFlags[ pClipChunk->globalIdx ] & CHUNK_FLAG_CRITICAL)) ) +#else + if( distSq < 20 * 20 ) +#endif + { + veryNearCount++; + } + } + } + } + } + } + // app.DebugPrintf("[%d,%d,%d]\n",nearestClipChunks.empty(),considered,wouldBeNearButEmpty); + } +#endif // __PS3__ + PIXEndNamedEvent(); + } + + + + Chunk *chunk = NULL; +#ifdef _LARGE_WORLDS + if(!nearestClipChunks.empty()) + { + int index = 0; + for(AUTO_VAR(it, nearestClipChunks.begin()); it != nearestClipChunks.end(); ++it) + { + chunk = it->first->chunk; + // If this chunk is very near, then move the renderer into a deferred mode. This won't commit any command buffers + // for rendering until we call CBuffDeferredModeEnd(), allowing us to group any near changes into an atomic unit. This + // is essential so we don't temporarily create any holes in the environment whilst updating one chunk and not the neighbours. + // The "ver near" aspect of this is just a cosmetic nicety - exactly the same thing would happen further away, but we just don't + // care about it so much from terms of visual impact. + if( veryNearCount > 0 ) + { + RenderManager.CBuffDeferredModeStart(); + } + // Build this chunk & return false to continue processing + chunk->clearDirty(); + // Take a copy of the details that are required for chunk rebuilding, and rebuild That instead of the original chunk data. This is done within + // the m_csDirtyChunks critical section, which means that any chunks can't be repositioned whilst we are doing this copy. The copy will then + // be guaranteed to be consistent whilst rebuilding takes place outside of that critical section. + permaChunk[index].makeCopyForRebuild(chunk); + ++index; + } + LeaveCriticalSection(&m_csDirtyChunks); + + --index; // Bring it back into 0 counted range + + for(int i = MAX_CHUNK_REBUILD_THREADS - 1; i >= 0; --i) + { + // Set the events that won't run + if( (i+1) > index) s_rebuildCompleteEvents->Set(i); + else break; + } + + for(; index >=0; --index) + { + bool bAtomic = false; + if((veryNearCount > 0)) + bAtomic = true; //MGH - if veryNearCount, then we're trying to rebuild atomically, so do it all on the main thread + + if( bAtomic || (index == 0) ) + { + //PIXBeginNamedEvent(0,"Rebuilding near chunk %d %d %d",chunk->x, chunk->y, chunk->z); + // static __int64 totalTime = 0; + // static __int64 countTime = 0; + // __int64 startTime = System::currentTimeMillis(); + + //app.DebugPrintf("Rebuilding permaChunk %d\n", index); + + permaChunk[index].rebuild(); + + if(index !=0) + s_rebuildCompleteEvents->Set(index-1); // MGH - this rebuild happening on the main thread instead, mark the thread it should have been running on as complete + + // __int64 endTime = System::currentTimeMillis(); + // totalTime += (endTime - startTime); + // countTime++; + // printf("%d : %f\n", countTime, (float)totalTime / (float)countTime); + //PIXEndNamedEvent(); + } + // 4J Stu - Ignore this path when in constrained mode on Xbox One + else + { + // Activate thread to rebuild this chunk + s_activationEventA[index - 1]->Set(); + } + } + + // Wait for the other threads to be done as well + s_rebuildCompleteEvents->WaitForAll(INFINITE); + } +#else + if( nearChunk ) + { + chunk = nearChunk->chunk; + PIXBeginNamedEvent(0,"Rebuilding near chunk %d %d %d",chunk->x, chunk->y, chunk->z); + // If this chunk is very near, then move the renderer into a deferred mode. This won't commit any command buffers + // for rendering until we call CBuffDeferredModeEnd(), allowing us to group any near changes into an atomic unit. This + // is essential so we don't temporarily create any holes in the environment whilst updating one chunk and not the neighbours. + // The "ver near" aspect of this is just a cosmetic nicety - exactly the same thing would happen further away, but we just don't + // care about it so much from terms of visual impact. + if( veryNearCount > 0 ) + { + RenderManager.CBuffDeferredModeStart(); + } + // Build this chunk & return false to continue processing + chunk->clearDirty(); + // Take a copy of the details that are required for chunk rebuilding, and rebuild That instead of the original chunk data. This is done within + // the m_csDirtyChunks critical section, which means that any chunks can't be repositioned whilst we are doing this copy. The copy will then + // be guaranteed to be consistent whilst rebuilding takes place outside of that critical section. + static Chunk permaChunk; + permaChunk.makeCopyForRebuild(chunk); + LeaveCriticalSection(&m_csDirtyChunks); + // static __int64 totalTime = 0; + // static __int64 countTime = 0; + // __int64 startTime = System::currentTimeMillis(); + permaChunk.rebuild(); + // __int64 endTime = System::currentTimeMillis(); + // totalTime += (endTime - startTime); + // countTime++; + // printf("%d : %f\n", countTime, (float)totalTime / (float)countTime); + PIXEndNamedEvent(); + } +#endif + else + { + // Nothing to do - clear flags that there are things to process, unless it's been a while since we found any dirty chunks in which case force a check next time through + if( ( System::currentTimeMillis() - lastDirtyChunkFound ) > FORCE_DIRTY_CHUNK_CHECK_PERIOD_MS ) + { + dirtyChunkPresent = true; + } + else + { + dirtyChunkPresent = false; + } + LeaveCriticalSection(&m_csDirtyChunks); +#ifdef __PS3__ + Sleep(5); +#endif // __PS3__ + return false; + } + + // If there was more than one very near thing found in our initial assessment, then return true so that we will keep doing the other one(s) + // in an atomic unit + if( veryNearCount > 1 ) + { + destroyedTileManager->updatedChunkAt(chunk->level, chunk->x, chunk->y, chunk->z, veryNearCount ); + return true; + } + // If the chunk we've just built was near, and it has been marked dirty at some point while we are rebuilding, also return true so + // we can rebuild the same thing atomically - if its data was changed during creating render data, it may well be invalid + if( ( veryNearCount == 1 ) && getGlobalChunkFlag(chunk->x, chunk->y, chunk->z, chunk->level, CHUNK_FLAG_DIRTY ) ) + { + destroyedTileManager->updatedChunkAt(chunk->level, chunk->x, chunk->y, chunk->z, veryNearCount + 1); + return true; + } + + if( nearChunk ) destroyedTileManager->updatedChunkAt(chunk->level, chunk->x, chunk->y, chunk->z, veryNearCount ); + + return false; +} + +void LevelRenderer::renderHit(shared_ptr player, HitResult *h, int mode, shared_ptr inventoryItem, float a) +{ + Tesselator *t = Tesselator::getInstance(); + glEnable(GL_BLEND); + glEnable(GL_ALPHA_TEST); + glBlendFunc(GL_SRC_ALPHA, GL_ONE); + glColor4f(1, 1, 1, ((float) (Mth::sin(Minecraft::currentTimeMillis() / 100.0f)) * 0.2f + 0.4f) * 0.5f); + if (mode != 0 && inventoryItem != NULL) + { + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + 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(&TextureAtlas::LOCATION_BLOCKS); + } + glDisable(GL_BLEND); + glDisable(GL_ALPHA_TEST); +} + +void LevelRenderer::renderDestroyAnimation(Tesselator *t, shared_ptr player, float a) +{ + double xo = player->xOld + (player->x - player->xOld) * a; + double yo = player->yOld + (player->y - player->yOld) * a; + double zo = player->zOld + (player->z - player->zOld) * a; + + int playerIndex = mc->player->GetXboxPad(); + if (!destroyingBlocks.empty()) + { + glBlendFunc(GL_DST_COLOR, GL_SRC_COLOR); + + textures->bindTexture(&TextureAtlas::LOCATION_BLOCKS); + glColor4f(1, 1, 1, 0.5f); + glPushMatrix(); + + glDisable(GL_ALPHA_TEST); + + glPolygonOffset(-3.0f, -3.0f); + glEnable(GL_POLYGON_OFFSET_FILL); + + glEnable(GL_ALPHA_TEST); + t->begin(); +#ifdef __PSVITA__ + // AP : fix for bug 4952. No amount of polygon offset will push this close enough to be seen above the second tile layer when looking straight down + // so just add on a little bit of y to fix this. hacky hacky + t->offset((float)-xo, (float)-yo + 0.01f,(float) -zo); +#else + t->offset((float)-xo, (float)-yo,(float) -zo); +#endif + t->noColor(); + + AUTO_VAR(it, destroyingBlocks.begin()); + while (it != destroyingBlocks.end()) + { + BlockDestructionProgress *block = it->second; + double xd = block->getX() - xo; + double yd = block->getY() - yo; + double zd = block->getZ() - zo; + + if (xd * xd + yd * yd + zd * zd < 32 * 32) // 4J MGH - now only culling instead of removing, as the list is shared in split screen + { + 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::stone; + tileRenderer[iPad]->tesselateInWorldFixedTexture(tile, block->getX(), block->getY(), block->getZ(), breakingTextures[block->getProgress()]); // 4J renamed to differentiate from tesselateInWorld + } + ++it; + } + + t->end(); + t->offset(0, 0, 0); + glDisable(GL_ALPHA_TEST); + /* + * for (int i = 0; i < 6; i++) { tile.renderFace(t, h.x, h.y, + * h.z, i, 15 * 16 + (int) (destroyProgress * 10)); } + */ + glPolygonOffset(0.0f, 0.0f); + glDisable(GL_POLYGON_OFFSET_FILL); + glEnable(GL_ALPHA_TEST); + + glDepthMask(true); + glPopMatrix(); + } +} + +void LevelRenderer::renderHitOutline(shared_ptr player, HitResult *h, int mode, float a) +{ + + if (mode == 0 && h->type == HitResult::TILE) + { + int iPad = mc->player->GetXboxPad(); // 4J added + + // 4J-PB - If Display HUD is false, don't render the hit outline + if ( app.GetGameSettings(iPad,eGameSetting_DisplayHUD)==0 ) return; + + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glColor4f(0, 0, 0, 0.4f); + glLineWidth(2.0f); + glDisable(GL_TEXTURE_2D); + glDepthMask(false); + float ss = 0.002f; + int tileId = level[iPad]->getTile(h->x, h->y, h->z); + + if (tileId > 0) + { + Tile::tiles[tileId]->updateShape(level[iPad], h->x, h->y, h->z); + double xo = player->xOld + (player->x - player->xOld) * a; + double yo = player->yOld + (player->y - player->yOld) * a; + double zo = player->zOld + (player->z - player->zOld) * a; + render(Tile::tiles[tileId]->getTileAABB(level[iPad], h->x, h->y, h->z)->grow(ss, ss, ss)->cloneMove(-xo, -yo, -zo)); + } + glDepthMask(true); + glEnable(GL_TEXTURE_2D); + glDisable(GL_BLEND); + } +} + +void LevelRenderer::render(AABB *b) +{ + Tesselator *t = Tesselator::getInstance(); + + t->begin(GL_LINE_STRIP); + t->vertex((float)(b->x0), (float)( b->y0), (float)( b->z0)); + t->vertex((float)(b->x1), (float)( b->y0), (float)( b->z0)); + t->vertex((float)(b->x1), (float)( b->y0), (float)( b->z1)); + t->vertex((float)(b->x0), (float)( b->y0), (float)( b->z1)); + t->vertex((float)(b->x0), (float)( b->y0), (float)( b->z0)); + t->end(); + + t->begin(GL_LINE_STRIP); + t->vertex((float)(b->x0), (float)( b->y1), (float)( b->z0)); + t->vertex((float)(b->x1), (float)( b->y1), (float)( b->z0)); + t->vertex((float)(b->x1), (float)( b->y1), (float)( b->z1)); + t->vertex((float)(b->x0), (float)( b->y1), (float)( b->z1)); + t->vertex((float)(b->x0), (float)( b->y1), (float)( b->z0)); + t->end(); + + t->begin(GL_LINES); + t->vertex((float)(b->x0), (float)( b->y0), (float)( b->z0)); + t->vertex((float)(b->x0), (float)( b->y1), (float)( b->z0)); + t->vertex((float)(b->x1), (float)( b->y0), (float)( b->z0)); + t->vertex((float)(b->x1), (float)( b->y1), (float)( b->z0)); + t->vertex((float)(b->x1), (float)( b->y0), (float)( b->z1)); + t->vertex((float)(b->x1), (float)( b->y1), (float)( b->z1)); + t->vertex((float)(b->x0), (float)( b->y0), (float)( b->z1)); + t->vertex((float)(b->x0), (float)( b->y1), (float)( b->z1)); + t->end(); +} + +void LevelRenderer::setDirty(int x0, int y0, int z0, int x1, int y1, int z1, Level *level) // 4J - added level param +{ + // 4J - level is passed if this is coming from setTilesDirty, which could come from when connection is being ticked outside of normal level tick, and player won't + // be set up + if( level == NULL ) level = this->level[mc->player->GetXboxPad()]; + // EnterCriticalSection(&m_csDirtyChunks); + int _x0 = Mth::intFloorDiv(x0, CHUNK_XZSIZE); + int _y0 = Mth::intFloorDiv(y0, CHUNK_SIZE); + int _z0 = Mth::intFloorDiv(z0, CHUNK_XZSIZE); + int _x1 = Mth::intFloorDiv(x1, CHUNK_XZSIZE); + int _y1 = Mth::intFloorDiv(y1, CHUNK_SIZE); + int _z1 = Mth::intFloorDiv(z1, CHUNK_XZSIZE); + + for (int x = _x0; x <= _x1; x++) + { + for (int y = _y0; y <= _y1; y++) + { + for (int z = _z0; z <= _z1; z++) + { + // printf("Setting %d %d %d dirty\n",x,y,z); + int index = getGlobalIndexForChunk(x * 16, y * 16, z * 16, level); + // Rather than setting the flags directly, add any dirty chunks into a lock free stack - this avoids having to lock m_csDirtyChunks . + // These chunks are then added to the global flags in the render update thread. + // An XLockFreeQueue actually implements a queue of pointers to its templated type, and I don't want to have to go allocating ints here just to store the + // pointer to them in a queue. Hence actually pretending that the int Is a pointer here. Our Index has a a valid range from 0 to something quite big, + // but including zero. The lock free queue, since it thinks it is dealing with pointers, uses a NULL pointer to signify that a Pop hasn't succeeded. + // We also want to reserve one special value (of 1 ) for use when multiple chunks not individually listed are made dirty. Therefore adding 2 to our + // index value here to move our valid range from 1 to something quite big + 2 + if( index > -1 ) + { +#ifdef _CRITICAL_CHUNKS + index += 2; + + // AP - by the time we reach this function the area passed in has a 1 block border added to it to make sure geometry and lighting is updated correctly. + // Some of those blocks will only need lighting updated so it is acceptable to not have those blocks grouped in the deferral system as the mismatch + // will hardly be noticable. The blocks that need geometry updated will be adjacent to the original, non-bordered area. + // This bit of code will mark a chunk as 'non-critical' if all of the blocks inside it are NOT adjacent to the original area. This has the greatest effect + // when digging a single block. Only 6 of the blocks out of the possible 26 are actually adjacent to the original block. The other 20 only need lighting updated. + // Note I have noticed a new side effect of this system where it's possible to see into the sides of water but this is acceptable compared to seeing through + // the entire landscape. + // is the left or right most block just inside this chunk + if( ((x0 & 15) == 15 && x == _x0) || ((x1 & 15) == 0 && x == _x1) ) + { + // is the front, back, top or bottom most block just inside this chunk + if( ((z0 & 15) == 15 && z == _z0) || ((z1 & 15) == 0 && z == _z1) || + ((y0 & 15) == 15 && y == _y0) || ((y1 & 15) == 0 && y == _y1)) + { + index |= 0x10000000; + } + } + else + { + // is the front or back most block just inside this chunk + if( ((z0 & 15) == 15 && z == _z0) || ((z1 & 15) == 0 && z == _z1) ) + { + // is the top or bottom most block just inside this chunk + if( ((y0 & 15) == 15 && y == _y0) || ((y1 & 15) == 0 && y == _y1)) + { + index |= 0x10000000; + } + } + } + + dirtyChunksLockFreeStack.Push((int *)(index)); +#else + dirtyChunksLockFreeStack.Push((int *)(index + 2)); +#endif + +#ifdef _XBOX + PIXSetMarker(0,"Setting chunk %d %d %d dirty",x * 16,y * 16,z * 16); +#else + PIXSetMarkerDeprecated(0,"Setting chunk %d %d %d dirty",x * 16,y * 16,z * 16); +#endif + } + // setGlobalChunkFlag(x * 16, y * 16, z * 16, level, CHUNK_FLAG_DIRTY); + } + } + } + // LeaveCriticalSection(&m_csDirtyChunks); +} + +void LevelRenderer::tileChanged(int x, int y, int z) +{ + setDirty(x - 1, y - 1, z - 1, x + 1, y + 1, z + 1, NULL); +} + +void LevelRenderer::tileLightChanged(int x, int y, int z) +{ + setDirty(x - 1, y - 1, z - 1, x + 1, y + 1, z + 1, NULL); +} + +void LevelRenderer::setTilesDirty(int x0, int y0, int z0, int x1, int y1, int z1, Level *level) // 4J - added level param +{ + setDirty(x0 - 1, y0 - 1, z0 - 1, x1 + 1, y1 + 1, z1 + 1, level); +} + +bool inline clip(float *bb, float *frustum) +{ + for (int i = 0; i < 6; ++i, frustum += 4) + { + if (frustum[0] * (bb[0]) + frustum[1] * (bb[1]) + frustum[2] * (bb[2]) + frustum[3] > 0) continue; + if (frustum[0] * (bb[3]) + frustum[1] * (bb[1]) + frustum[2] * (bb[2]) + frustum[3] > 0) continue; + if (frustum[0] * (bb[0]) + frustum[1] * (bb[4]) + frustum[2] * (bb[2]) + frustum[3] > 0) continue; + if (frustum[0] * (bb[3]) + frustum[1] * (bb[4]) + frustum[2] * (bb[2]) + frustum[3] > 0) continue; + if (frustum[0] * (bb[0]) + frustum[1] * (bb[1]) + frustum[2] * (bb[5]) + frustum[3] > 0) continue; + if (frustum[0] * (bb[3]) + frustum[1] * (bb[1]) + frustum[2] * (bb[5]) + frustum[3] > 0) continue; + if (frustum[0] * (bb[0]) + frustum[1] * (bb[4]) + frustum[2] * (bb[5]) + frustum[3] > 0) continue; + if (frustum[0] * (bb[3]) + frustum[1] * (bb[4]) + frustum[2] * (bb[5]) + frustum[3] > 0) continue; + + return false; + } + + return true; +} + +#ifdef __PS3__ +int g_listArray_layer0[4][LevelRenderer_cull_DataIn::sc_listSize]__attribute__((__aligned__(16))); // 8000 +int g_listArray_layer1[4][LevelRenderer_cull_DataIn::sc_listSize]__attribute__((__aligned__(16))); +float g_zDepth_layer0[4][LevelRenderer_cull_DataIn::sc_listSize]__attribute__((__aligned__(16))); // 8000 +float g_zDepth_layer1[4][LevelRenderer_cull_DataIn::sc_listSize]__attribute__((__aligned__(16))); + +volatile bool g_useIdent = false; +volatile float g_maxDepthRender = 1000; +volatile float g_maxHeightRender = -1000; +volatile float g_offMulVal = 1; + +void LevelRenderer::cull_SPU(int playerIndex, Culler *culler, float a) +{ + if(m_bSPUCullStarted[playerIndex]) + { + return; // running already + } + + FrustumCuller *fc = (FrustumCuller *)culler; + FrustumData *fd = fc->frustum; + float fdraw[6 * 4]; + for( int i = 0; i < 6; i++ ) + { + double fx = fd->m_Frustum[i][0]; + double fy = fd->m_Frustum[i][1]; + double fz = fd->m_Frustum[i][2]; + fdraw[i * 4 + 0] = (float)fx; + fdraw[i * 4 + 1] = (float)fy; + fdraw[i * 4 + 2] = (float)fz; + fdraw[i * 4 + 3] = (float)(fd->m_Frustum[i][3] + ( fx * -fc->xOff ) + ( fy * - fc->yOff ) + ( fz * -fc->zOff )); + } + + memcpy(&g_cullDataIn[playerIndex].fdraw, fdraw, sizeof(fdraw)); + g_cullDataIn[playerIndex].numClipChunks = chunks[playerIndex].length; + g_cullDataIn[playerIndex].pClipChunks = (ClipChunk_SPU*)chunks[playerIndex].data; + g_cullDataIn[playerIndex].numGlobalChunks = getGlobalChunkCount(); + g_cullDataIn[playerIndex].pGlobalChunkFlags = globalChunkFlags; + g_cullDataIn[playerIndex].chunkLists = chunkLists; + g_cullDataIn[playerIndex].listArray_layer0 = g_listArray_layer0[playerIndex]; + g_cullDataIn[playerIndex].listArray_layer1 = g_listArray_layer1[playerIndex]; + g_cullDataIn[playerIndex].zDepth_layer0 = g_zDepth_layer0[playerIndex]; + g_cullDataIn[playerIndex].zDepth_layer1 = g_zDepth_layer1[playerIndex]; + g_cullDataIn[playerIndex].maxDepthRender = g_maxDepthRender; + g_cullDataIn[playerIndex].maxHeightRender = g_maxHeightRender; + + if(g_useIdent) + g_cullDataIn[playerIndex].clipMat = Vectormath::Aos::Matrix4::identity(); + else + { + memcpy(&g_cullDataIn[playerIndex].clipMat, &fc->frustum->modl[0], sizeof(float) * 16); + g_cullDataIn[playerIndex].clipMat[3][0] = -fc->xOff; + g_cullDataIn[playerIndex].clipMat[3][1] = -fc->yOff; + g_cullDataIn[playerIndex].clipMat[3][2] = -fc->zOff; + } + + + C4JSpursJob_LevelRenderer_cull cullJob(&g_cullDataIn[playerIndex]); + C4JSpursJob_LevelRenderer_zSort sortJob(&g_cullDataIn[playerIndex]); + + m_jobPort_CullSPU->submitJob(&cullJob); + m_jobPort_CullSPU->submitSync(); + // static int doSort = false; + // if(doSort) + { + m_jobPort_CullSPU->submitJob(&sortJob); + } + // doSort ^= 1; + m_bSPUCullStarted[playerIndex] = true; +} +void LevelRenderer::waitForCull_SPU() +{ + m_jobPort_CullSPU->waitForCompletion(); + int playerIndex = mc->player->GetXboxPad(); // 4J added + m_bSPUCullStarted[playerIndex] = false; +} +#endif // __PS3__ + +void LevelRenderer::cull(Culler *culler, float a) +{ + int playerIndex = mc->player->GetXboxPad(); // 4J added + +#if defined __PS3__ && !defined DISABLE_SPU_CODE + cull_SPU(playerIndex, culler, a); + return; +#endif // __PS3__ + + + FrustumCuller *fc = (FrustumCuller *)culler; + FrustumData *fd = fc->frustum; + float fdraw[6 * 4]; + for( int i = 0; i < 6; i++ ) + { + double fx = fd->m_Frustum[i][0]; + double fy = fd->m_Frustum[i][1]; + double fz = fd->m_Frustum[i][2]; + fdraw[i * 4 + 0] = (float)fx; + fdraw[i * 4 + 1] = (float)fy; + fdraw[i * 4 + 2] = (float)fz; + fdraw[i * 4 + 3] = (float)(fd->m_Frustum[i][3] + ( fx * -fc->xOff ) + ( fy * - fc->yOff ) + ( fz * -fc->zOff )); + } + + ClipChunk *pClipChunk = chunks[playerIndex].data; + int vis = 0; + int total = 0; + int numWrong = 0; + for (unsigned int i = 0; i < chunks[playerIndex].length; i++) + { + unsigned char flags = pClipChunk->globalIdx == -1 ? 0 : globalChunkFlags[ pClipChunk->globalIdx ]; + + if ( (flags & CHUNK_FLAG_COMPILED ) && ( ( flags & CHUNK_FLAG_EMPTYBOTH ) != CHUNK_FLAG_EMPTYBOTH ) ) + { + bool clipres = clip(pClipChunk->aabb, fdraw); + pClipChunk->visible = clipres; + if( pClipChunk->visible ) vis++; + total++; + } + else + { + pClipChunk->visible = false; + } + pClipChunk++; + } +} + +void LevelRenderer::playStreamingMusic(const wstring& name, int x, int y, int z) +{ + if (name != L"") + { + mc->gui->setNowPlaying(L"C418 - " + name); + } + mc->soundEngine->playStreaming(name, (float) x, (float) y, (float) z, 1, 1); +} + +void LevelRenderer::playSound(int iSound, double x, double y, double z, float volume, float pitch, float fSoundClipDist) +{ + // 4J-PB - removed in 1.4 + + //float dd = 16; + /*if (volume > 1) fSoundClipDist *= volume; + + // 4J - find min distance to any players rather than just the current one + float minDistSq = FLT_MAX; + for( int i = 0; i < XUSER_MAX_COUNT; i++ ) + { + if( mc->localplayers[i] ) + { + float distSq = mc->localplayers[i]->distanceToSqr(x, y, z ); + if( distSq < minDistSq ) + { + minDistSq = distSq; + } + } + } + + if (minDistSq < fSoundClipDist * fSoundClipDist) + { + mc->soundEngine->play(iSound, (float) x, (float) y, (float) z, volume, pitch); + } */ +} + +void LevelRenderer::playSound(shared_ptr entity,int iSound, double x, double y, double z, float volume, float pitch, float fSoundClipDist) +{ +} + +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 - +/* +void LevelRenderer::addParticle(const wstring& name, double x, double y, double z, double xa, double ya, double za) +{ +if (mc == NULL || mc->cameraTargetPlayer == NULL || mc->particleEngine == NULL) return; + +double xd = mc->cameraTargetPlayer->x - x; +double yd = mc->cameraTargetPlayer->y - y; +double zd = mc->cameraTargetPlayer->z - z; + +double particleDistance = 16; +if (xd * xd + yd * yd + zd * zd > particleDistance * particleDistance) return; + +int playerIndex = mc->player->GetXboxPad(); // 4J added + +if (name== L"bubble") mc->particleEngine->add(shared_ptr( new BubbleParticle(level[playerIndex], x, y, z, xa, ya, za) ) ); +else if (name== L"smoke") mc->particleEngine->add(shared_ptr( new SmokeParticle(level[playerIndex], x, y, z, xa, ya, za) ) ); +else if (name== L"note") mc->particleEngine->add(shared_ptr( new NoteParticle(level[playerIndex], x, y, z, xa, ya, za) ) ); +else if (name== L"portal") mc->particleEngine->add(shared_ptr( new PortalParticle(level[playerIndex], x, y, z, xa, ya, za) ) ); +else if (name== L"explode") mc->particleEngine->add(shared_ptr( new ExplodeParticle(level[playerIndex], x, y, z, xa, ya, za) ) ); +else if (name== L"flame") mc->particleEngine->add(shared_ptr( new FlameParticle(level[playerIndex], x, y, z, xa, ya, za) ) ); +else if (name== L"lava") mc->particleEngine->add(shared_ptr( new LavaParticle(level[playerIndex], x, y, z) ) ); +else if (name== L"footstep") mc->particleEngine->add(shared_ptr( new FootstepParticle(textures, level[playerIndex], x, y, z) ) ); +else if (name== L"splash") mc->particleEngine->add(shared_ptr( new SplashParticle(level[playerIndex], x, y, z, xa, ya, za) ) ); +else if (name== L"largesmoke") mc->particleEngine->add(shared_ptr( new SmokeParticle(level[playerIndex], x, y, z, xa, ya, za, 2.5f) ) ); +else if (name== L"reddust") mc->particleEngine->add(shared_ptr( new RedDustParticle(level[playerIndex], x, y, z, (float) xa, (float) ya, (float) za) ) ); +else if (name== L"snowballpoof") mc->particleEngine->add(shared_ptr( new BreakingItemParticle(level[playerIndex], x, y, z, Item::snowBall) ) ); +else if (name== L"snowshovel") mc->particleEngine->add(shared_ptr( new SnowShovelParticle(level[playerIndex], x, y, z, xa, ya, za) ) ); +else if (name== L"slime") mc->particleEngine->add(shared_ptr( new BreakingItemParticle(level[playerIndex], x, y, z, Item::slimeBall)) ) ; +else if (name== L"heart") mc->particleEngine->add(shared_ptr( new HeartParticle(level[playerIndex], x, y, z, xa, ya, za) ) ); +} +*/ + +void LevelRenderer::addParticle(ePARTICLE_TYPE eParticleType, double x, double y, double z, double xa, double ya, double za) +{ + addParticleInternal( eParticleType, x, y, z, xa, ya, za ); +} + +shared_ptr LevelRenderer::addParticleInternal(ePARTICLE_TYPE eParticleType, double x, double y, double z, double xa, double ya, double za) +{ + if (mc == NULL || mc->cameraTargetPlayer == NULL || mc->particleEngine == NULL) + { + return nullptr; + } + + // 4J added - do some explicit checking for NaN. The normal depth clipping seems to generally work for NaN (ie they get rejected), except on optimised PS3 code which + // reverses the logic on the comparison with particleDistanceSquared and gets the opposite result to what you might expect. + if( Double::isNaN(x) ) return nullptr; + if( Double::isNaN(y) ) return nullptr; + if( Double::isNaN(z) ) return nullptr; + + int particleLevel = mc->options->particles; + + Level *lev; + int playerIndex = mc->player->GetXboxPad(); // 4J added + lev = level[playerIndex]; + + if (particleLevel == 1) + { + // when playing at "decreased" particle level, randomly filter + // particles by setting the level to "minimal" + if (level[playerIndex]->random->nextInt(3) == 0) + { + particleLevel = 2; + } + } + + // 4J - the java code doesn't distance cull these two particle types, we need to implement this behaviour differently as our distance check is + // mixed up with other things + bool distCull = true; + if ( (eParticleType == eParticleType_hugeexplosion) || (eParticleType == eParticleType_largeexplode) || (eParticleType == eParticleType_dragonbreath) ) + { + distCull = false; + } + + // 4J - this is a bit of hack to get communication through from the level itself, but if Minecraft::animateTickLevel is NULL then + // we are to behave as normal, and if it is set, then we should use that as a pointer to the level the particle is to be created with + // rather than try to work it out from the current player. This is because in this state we are calling from a loop that is trying + // to amalgamate particle creation between all players for a particular level. Also don't do distance clipping as it isn't for a particular + // player, and distance is already taken into account before we get here anyway by the code in Level::animateTickDoWork + if( mc->animateTickLevel == NULL ) + { + double particleDistanceSquared = 16 * 16; + double xd = 0.0f; + double yd = 0.0f; + double zd = 0.0f; + + // 4J Stu - Changed this as we need to check all local players in case one of them is in range of this particle + // Fix for #13454 - art : note blocks do not show notes + bool inRange = false; + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + shared_ptr thisPlayer = mc->localplayers[i]; + if(thisPlayer != NULL && level[i] == lev) + { + xd = thisPlayer->x - x; + yd = thisPlayer->y - y; + zd = thisPlayer->z - z; + if (xd * xd + yd * yd + zd * zd <= particleDistanceSquared) inRange = true; + } + } + if( (!inRange) && distCull ) return nullptr; + } + else + { + lev = mc->animateTickLevel; + } + + if (particleLevel > 1) + { + // TODO: If any of the particles below are necessary even if + // particles are turned off, then modify this if statement + return nullptr; + } + + shared_ptr particle; + + switch(eParticleType) + { + case eParticleType_hugeexplosion: + particle = shared_ptr(new HugeExplosionSeedParticle(lev, x, y, z, xa, ya, za)); + break; + 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) ); + break; + + case eParticleType_suspended: + particle = shared_ptr( new SuspendedParticle(lev, x, y, z, xa, ya, za) ); + break; + case eParticleType_depthsuspend: + particle = shared_ptr( new SuspendedTownParticle(lev, x, y, z, xa, ya, za) ); + break; + case eParticleType_townaura: + particle = shared_ptr( new SuspendedTownParticle(lev, x, y, z, xa, ya, za) ); + break; + case eParticleType_crit: + { + shared_ptr critParticle2 = shared_ptr(new CritParticle2(lev, x, y, z, xa, ya, za)); + critParticle2->CritParticle2PostConstructor(); + particle = shared_ptr( critParticle2 ); + // request from 343 to set pink for the needler in the Halo Texture Pack + // Set particle colour from colour-table. + unsigned int cStart = Minecraft::GetInstance()->getColourTable()->getColor( eMinecraftColour_Particle_CritStart ); + unsigned int cEnd = Minecraft::GetInstance()->getColourTable()->getColor( eMinecraftColour_Particle_CritEnd ); + + // If the start and end colours are the same, just set that colour, otherwise random between them + if(cStart==cEnd) + { + critParticle2->SetAgeUniformly(); + particle->setColor( ( (cStart>>16)&0xFF )/255.0f, ( (cStart>>8)&0xFF )/255.0, ( cStart&0xFF )/255.0 ); + } + else + { + float fStart=((float)(cStart&0xFF)); + float fDiff=(float)((cEnd-cStart)&0xFF); + + float fCol = (fStart + (Math::random() * fDiff))/255.0f; + particle->setColor( fCol, fCol, fCol ); + } + } + break; + case eParticleType_magicCrit: + { + shared_ptr critParticle2 = shared_ptr(new CritParticle2(lev, x, y, z, xa, ya, za)); + critParticle2->CritParticle2PostConstructor(); + particle = shared_ptr(critParticle2); + particle->setColor(particle->getRedCol() * 0.3f, particle->getGreenCol() * 0.8f, particle->getBlueCol()); + particle->setNextMiscAnimTex(); + } + break; + case eParticleType_smoke: + particle = shared_ptr( new SmokeParticle(lev, x, y, z, xa, ya, za) ); + break; + case eParticleType_endportal: // 4J - Added. + { + SmokeParticle *tmp = new SmokeParticle(lev, x, y, z, xa, ya, za); + + // 4J-JEV: Set particle colour from colour-table. + unsigned int col = Minecraft::GetInstance()->getColourTable()->getColor( eMinecraftColour_Particle_EnderPortal ); + tmp->setColor( ( (col>>16)&0xFF )/255.0f, ( (col>>8)&0xFF )/255.0, ( col&0xFF )/255.0 ); + + particle = shared_ptr(tmp); + } + break; + case eParticleType_mobSpell: + 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); + break; + case eParticleType_note: + particle = shared_ptr( new NoteParticle(lev, x, y, z, xa, ya, za) ); + break; + case eParticleType_netherportal: + particle = shared_ptr( new NetherPortalParticle(lev, x, y, z, xa, ya, za) ); + break; + case eParticleType_ender: + particle = shared_ptr( new EnderParticle(lev, x, y, z, xa, ya, za) ); + break; + case eParticleType_enchantmenttable: + particle = shared_ptr(new EchantmentTableParticle(lev, x, y, z, xa, ya, za) ); + break; + case eParticleType_explode: + particle = shared_ptr( new ExplodeParticle(lev, x, y, z, xa, ya, za) ); + break; + case eParticleType_flame: + particle = shared_ptr( new FlameParticle(lev, x, y, z, xa, ya, za) ); + break; + case eParticleType_lava: + particle = shared_ptr( new LavaParticle(lev, x, y, z) ); + break; + case eParticleType_footstep: + particle = shared_ptr( new FootstepParticle(textures, lev, x, y, z) ); + break; + case eParticleType_splash: + particle = shared_ptr( new SplashParticle(lev, x, y, z, xa, ya, za) ); + break; + case eParticleType_largesmoke: + particle = shared_ptr( new SmokeParticle(lev, x, y, z, xa, ya, za, 2.5f) ); + break; + case eParticleType_reddust: + particle = shared_ptr( new RedDustParticle(lev, x, y, z, (float) xa, (float) ya, (float) za) ); + break; + case eParticleType_snowballpoof: + particle = shared_ptr( new BreakingItemParticle(lev, x, y, z, Item::snowBall, textures) ); + break; + case eParticleType_dripWater: + particle = shared_ptr( new DripParticle(lev, x, y, z, Material::water) ); + break; + case eParticleType_dripLava: + particle = shared_ptr( new DripParticle(lev, x, y, z, Material::lava) ); + break; + case eParticleType_snowshovel: + particle = shared_ptr( new SnowShovelParticle(lev, x, y, z, xa, ya, za) ); + break; + case eParticleType_slime: + particle = shared_ptr( new BreakingItemParticle(lev, x, y, z, Item::slimeBall, textures)); + break; + case eParticleType_heart: + particle = shared_ptr( new HeartParticle(lev, x, y, z, xa, ya, za) ); + break; + case eParticleType_angryVillager: + particle = shared_ptr( new HeartParticle(lev, x, y + 0.5f, z, xa, ya, za) ); + particle->setMiscTex(1 + 16 * 5); + particle->setColor(1, 1, 1); + break; + case eParticleType_happyVillager: + particle = shared_ptr( new SuspendedTownParticle(lev, x, y, z, xa, ya, za) ); + particle->setMiscTex(2 + 16 * 5); + particle->setColor(1, 1, 1); + break; + case eParticleType_dragonbreath: + particle = shared_ptr( new DragonBreathParticle(lev, x, y, z, xa, ya, za) ); + break; + default: + if( ( eParticleType >= eParticleType_iconcrack_base ) && ( eParticleType <= eParticleType_iconcrack_last ) ) + { + int id = PARTICLE_CRACK_ID(eParticleType), data = PARTICLE_CRACK_DATA(eParticleType); + particle = shared_ptr(new BreakingItemParticle(lev, x, y, z, xa, ya, za, Item::items[id], textures, data)); + } + else if( ( eParticleType >= eParticleType_tilecrack_base ) && ( eParticleType <= eParticleType_tilecrack_last ) ) + { + int id = PARTICLE_CRACK_ID(eParticleType), data = PARTICLE_CRACK_DATA(eParticleType); + particle = dynamic_pointer_cast( shared_ptr(new TerrainParticle(lev, x, y, z, xa, ya, za, Tile::tiles[id], 0, data, textures))->init(data) ); + } + } + + if (particle != NULL) + { + mc->particleEngine->add(particle); + } + + return particle; +} + +void LevelRenderer::entityAdded(shared_ptr entity) +{ + if(entity->instanceof(eTYPE_PLAYER)) + { + shared_ptr player = dynamic_pointer_cast(entity); + player->prepareCustomTextures(); + + // 4J-PB - adding these from global title storage + if (player->customTextureUrl != L"") + { + textures->addMemTexture(player->customTextureUrl, new MobSkinMemTextureProcessor()); + } + if (player->customTextureUrl2 != L"") + { + textures->addMemTexture(player->customTextureUrl2, new MobSkinMemTextureProcessor()); + } + } +} + +void LevelRenderer::entityRemoved(shared_ptr entity) +{ + if(entity->instanceof(eTYPE_PLAYER)) + { + shared_ptr player = dynamic_pointer_cast(entity); + if (player->customTextureUrl != L"") + { + textures->removeMemTexture(player->customTextureUrl); + } + if (player->customTextureUrl2 != L"") + { + textures->removeMemTexture(player->customTextureUrl2); + } + } +} + +void LevelRenderer::skyColorChanged() +{ + // 4J - no longer used +#if 0 + EnterCriticalSection(&m_csDirtyChunks); + for( int i = 0; i < getGlobalChunkCountForOverworld(); i++ ) + { + if( ( globalChunkFlags[i] & CHUNK_FLAG_NOTSKYLIT ) == 0 ) + { + globalChunkFlags[i] |= CHUNK_FLAG_DIRTY; + } + } + LeaveCriticalSection(&m_csDirtyChunks); +#endif +} + +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 + Random *random = level[playerIndex]->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 = x - mc->cameraTargetPlayer->x; + double dy = y - mc->cameraTargetPlayer->y; + double dz = z - 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; + } + + level[playerIndex]->playLocalSound(sx, sy, sz, eSoundType_MOB_ENDERDRAGON_END, 5.0f, 1.0f); + } + 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, false); + break; + case LevelEvent::SOUND_CLICK: + 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, false); + break; + case LevelEvent::PARTICLES_SHOOT: + { + int xd = (data % 3) - 1; + int zd = (data / 3 % 3) - 1; + double xp = x + xd * 0.6 + 0.5; + double yp = y + 0.5; + double zp = z + zd * 0.6 + 0.5; + for (int i = 0; i < 10; i++) + { + double pow = random->nextDouble() * 0.2 + 0.01; + double xs = xp + xd * 0.01 + (random->nextDouble() - 0.5) * zd * 0.5; + double ys = yp + (random->nextDouble() - 0.5) * 0.5; + double zs = zp + zd * 0.01 + (random->nextDouble() - 0.5) * xd * 0.5; + double xsa = xd * pow + random->nextGaussian() * 0.01; + double ysa = -0.03 + random->nextGaussian() * 0.01; + double zsa = zd * pow + random->nextGaussian() * 0.01; + addParticle(eParticleType_smoke, xs, ys, zs, xsa, ysa, zsa); + } + break; + } + case LevelEvent::PARTICLES_EYE_OF_ENDER_DEATH: + { + double xp = x + 0.5; + double yp = y; + double zp = z + 0.5; + + ePARTICLE_TYPE particle = PARTICLE_ICONCRACK(Item::eyeOfEnder->id,0); + for (int i = 0; i < 8; i++) + { + addParticle(particle, xp, yp, zp, random->nextGaussian() * 0.15, random->nextDouble() * 0.2, random->nextGaussian() * .15); + } + for (double a = 0; a < PI * 2.0; a += PI * 0.05) + { + addParticle(eParticleType_ender, xp + cos(a) * 5, yp - .4, zp + sin(a) * 5, cos(a) * -5, 0, sin(a) * -5); + addParticle(eParticleType_ender, xp + cos(a) * 5, yp - .4, zp + sin(a) * 5, cos(a) * -7, 0, sin(a) * -7); + } + + } + break; + case LevelEvent::PARTICLES_POTION_SPLASH: + { + double xp = x; + double yp = y; + double zp = z; + + 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); + } + + + int colorValue = Item::potion->getColor(data); + + float red = (float) ((colorValue >> 16) & 0xff) / 255.0f; + float green = (float) ((colorValue >> 8) & 0xff) / 255.0f; + float blue = (float) ((colorValue >> 0) & 0xff) / 255.0f; + + ePARTICLE_TYPE particleName = eParticleType_spell; + if (Item::potion->hasInstantenousEffects(data)) + { + particleName = eParticleType_instantSpell; + } + + for (int i = 0; i < 100; i++) + { + double dist = random->nextDouble() * ThrownPotion::SPLASH_RANGE; + double angle = random->nextDouble() * PI * 2; + double xs = cos(angle) * dist; + double ys = 0.01 + random->nextDouble() * 0.5; + double zs = sin(angle) * dist; + + shared_ptr spellParticle = addParticleInternal(particleName, xp + xs * 0.1, yp + 0.3, zp + zs * 0.1, xs, ys, zs); + if (spellParticle != NULL) + { + float randBrightness = 0.75f + random->nextFloat() * 0.25f; + spellParticle->setColor(red * randBrightness, green * randBrightness, blue * randBrightness); + 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, false); + } + break; + case LevelEvent::ENDERDRAGON_FIREBALL_SPLASH: + { + double xp = x; + double yp = y; + double zp = z; + + ePARTICLE_TYPE particleName = eParticleType_dragonbreath; + + for (int i = 0; i < 200; i++) + { + double dist = random->nextDouble() * DragonFireball::SPLASH_RANGE; + double angle = random->nextDouble() * PI * 2; + double xs = cos(angle) * dist; + double ys = 0.01 + random->nextDouble() * 0.5; + double zs = sin(angle) * dist; + + shared_ptr acidParticle = addParticleInternal(particleName, xp + xs * 0.1, yp + 0.3, zp + zs * 0.1, xs, ys, zs); + if (acidParticle != NULL) + { + float randBrightness = 0.75f + random->nextFloat() * 0.25f; + acidParticle->setPower((float) dist); + } + } + level[playerIndex]->playLocalSound(x + 0.5, y + 0.5, z + 0.5, eSoundType_RANDOM_EXPLODE, 1, level[playerIndex]->random->nextFloat() * 0.1f + 0.9f); + } + break; + case LevelEvent::PARTICLES_DESTROY_BLOCK: + { + int t = data & Tile::TILE_NUM_MASK; + if (t > 0) + { + Tile *oldTile = Tile::tiles[t]; + mc->soundEngine->play(oldTile->soundType->getBreakSound(), x + 0.5f, y + 0.5f, z + 0.5f, (oldTile->soundType->getVolume() + 1) / 2, oldTile->soundType->getPitch() * 0.8f); + } + + mc->particleEngine->destroy(x, y, z, data & Tile::TILE_NUM_MASK, (data >> Tile::TILE_NUM_SHIFT) & 0xff); + break; + } + case LevelEvent::PARTICLES_MOBTILE_SPAWN: + { + for (int i = 0; i < 20; i++) + { + + double xP = x + 0.5 + (level[playerIndex]->random->nextFloat() - 0.5) * 2; + double yP = y + 0.5 + (level[playerIndex]->random->nextFloat() - 0.5) * 2; + double zP = z + 0.5 + (level[playerIndex]->random->nextFloat() - 0.5) * 2; + + level[playerIndex]->addParticle(eParticleType_smoke, xP, yP, zP, 0, 0, 0); + level[playerIndex]->addParticle(eParticleType_flame, xP, yP, zP, 0, 0, 0); + } + 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, 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, 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, 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, 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, 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, false); + break; + case LevelEvent::SOUND_PLAY_RECORDING: + { + RecordingItem *rci = dynamic_cast(Item::items[data]); + if (rci != NULL) + { + level[playerIndex]->playStreamingMusic(rci->recording, x, y, z); + } + else + { + // 4J-PB - only play streaming music if there isn't already some playing - the CD playing may have finished, and game music started playing already + if(!mc->soundEngine->GetIsPlayingStreamingGameMusic()) + { + level[playerIndex]->playStreamingMusic(L"", x, y, z); // 4J - used to pass NULL, but using empty string here now instead + } + } + mc->localplayers[playerIndex]->updateRichPresence(); + } + 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, 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, 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); + break; + case LevelEvent::SOUND_ZOMBIE_DOOR_CRASH: + level[playerIndex]->playLocalSound(x + 0.5, y + 0.5, z + 0.5, eSoundType_MOB_ZOMBIE_WOOD_BREAK, 2.0f, (random->nextFloat() - random->nextFloat()) * 0.2f + 1.0f); + break; + 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; + case LevelEvent::SOUND_ZOMBIE_CONVERTED: + level[playerIndex]->playLocalSound(x + 0.5, y + 0.5, z + 0.5, eSoundType_MOB_ZOMBIE_UNFECT, 2.0f, (random->nextFloat() - random->nextFloat()) * 0.2f + 1.0f);//, false); + break; + // 4J Added TU9 to fix #77475 - TU9: Content: Art: Dragon egg teleport particle effect isn't present. + case LevelEvent::END_EGG_TELEPORT: + // 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; + } + +} + +void LevelRenderer::destroyTileProgress(int id, int x, int y, int z, int progress) +{ + if (progress < 0 || progress >= 10) + { + AUTO_VAR(it, destroyingBlocks.find(id)); + if(it != destroyingBlocks.end()) + { + delete it->second; + destroyingBlocks.erase(it); + } + //destroyingBlocks.remove(id); + } + else + { + BlockDestructionProgress *entry = NULL; + + AUTO_VAR(it, destroyingBlocks.find(id)); + if(it != destroyingBlocks.end()) entry = it->second; + + if (entry == NULL || entry->getX() != x || entry->getY() != y || entry->getZ() != z) + { + entry = new BlockDestructionProgress(id, x, y, z); + destroyingBlocks.insert( unordered_map::value_type(id, entry) ); + } + + entry->setProgress(progress); + entry->updateTick(ticks); + } +} + +void LevelRenderer::registerTextures(IconRegister *iconRegister) +{ + breakingTextures = new Icon*[10]; + + for (int i = 0; i < 10; i++) + { + breakingTextures[i] = iconRegister->registerIcon(L"destroy_" + _toString(i) ); + } +} + +// Gets a dimension index (0, 1, or 2) from an id ( 0, -1, 1) +int LevelRenderer::getDimensionIndexFromId(int id) +{ + return ( 3 - id ) % 3; +} + +// 4J - added for new render list handling. Render lists used to be allocated per chunk, but these are now allocated per fixed chunk position +// in our (now finite) maps. +int LevelRenderer::getGlobalIndexForChunk(int x, int y, int z, Level *level) +{ + return getGlobalIndexForChunk(x,y,z,level->dimension->id); +} + +int LevelRenderer::getGlobalIndexForChunk(int x, int y, int z, int dimensionId) +{ + int dimIdx = getDimensionIndexFromId(dimensionId); + int xx = ( x / CHUNK_XZSIZE ) + ( MAX_LEVEL_RENDER_SIZE[dimIdx] / 2 ); + int yy = y / CHUNK_SIZE; + int zz = ( z / CHUNK_XZSIZE ) + ( MAX_LEVEL_RENDER_SIZE[dimIdx] / 2 ); + + if( ( xx < 0 ) || ( xx >= MAX_LEVEL_RENDER_SIZE[dimIdx] ) ) return -1; + if( ( zz < 0 ) || ( zz >= MAX_LEVEL_RENDER_SIZE[dimIdx] ) ) return -1; + if( ( yy < 0 ) || ( yy >= CHUNK_Y_COUNT ) ) return -1; + + int dimOffset = DIMENSION_OFFSETS[dimIdx]; + + int offset = dimOffset; // Offset caused by current dimension + offset += ( zz * MAX_LEVEL_RENDER_SIZE[dimIdx] + xx ) * CHUNK_Y_COUNT; // Offset by x/z pos + offset += yy; // Offset by y pos + + return offset; +} + +bool LevelRenderer::isGlobalIndexInSameDimension( int idx, Level *level) +{ + int dim = getDimensionIndexFromId(level->dimension->id); + int idxDim = 0; + if( idx >= DIMENSION_OFFSETS[2] ) idxDim = 2; + else if ( idx >= DIMENSION_OFFSETS[1] ) idxDim = 1; + return (dim == idxDim); +} + +int LevelRenderer::getGlobalChunkCount() +{ + return ( MAX_LEVEL_RENDER_SIZE[0] * MAX_LEVEL_RENDER_SIZE[0] * CHUNK_Y_COUNT ) + + ( MAX_LEVEL_RENDER_SIZE[1] * MAX_LEVEL_RENDER_SIZE[1] * CHUNK_Y_COUNT ) + + ( MAX_LEVEL_RENDER_SIZE[2] * MAX_LEVEL_RENDER_SIZE[2] * CHUNK_Y_COUNT ); +} + +int LevelRenderer::getGlobalChunkCountForOverworld() +{ + return ( MAX_LEVEL_RENDER_SIZE[0] * MAX_LEVEL_RENDER_SIZE[0] * CHUNK_Y_COUNT ); +} + +unsigned char LevelRenderer::getGlobalChunkFlags(int x, int y, int z, Level *level) +{ + int index = getGlobalIndexForChunk(x, y, z, level); + if( index == -1 ) + { + return 0; + } + else + { + return globalChunkFlags[ index ]; + } +} + +void LevelRenderer::setGlobalChunkFlags(int x, int y, int z, Level *level, unsigned char flags) +{ + int index = getGlobalIndexForChunk(x, y, z, level); + if( index != -1 ) + { +#ifdef _LARGE_WORLDS + EnterCriticalSection(&m_csChunkFlags); +#endif + globalChunkFlags[ index ] = flags; +#ifdef _LARGE_WORLDS + LeaveCriticalSection(&m_csChunkFlags); +#endif + } +} + +void LevelRenderer::setGlobalChunkFlag(int index, unsigned char flag, unsigned char shift) +{ + unsigned char sflag = flag << shift; + + if( index != -1 ) + { +#ifdef _LARGE_WORLDS + EnterCriticalSection(&m_csChunkFlags); +#endif + globalChunkFlags[ index ] |= sflag; +#ifdef _LARGE_WORLDS + LeaveCriticalSection(&m_csChunkFlags); +#endif + } +} + +void LevelRenderer::setGlobalChunkFlag(int x, int y, int z, Level *level, unsigned char flag, unsigned char shift) +{ + unsigned char sflag = flag << shift; + int index = getGlobalIndexForChunk(x, y, z, level); + if( index != -1 ) + { +#ifdef _LARGE_WORLDS + EnterCriticalSection(&m_csChunkFlags); +#endif + globalChunkFlags[ index ] |= sflag; +#ifdef _LARGE_WORLDS + LeaveCriticalSection(&m_csChunkFlags); +#endif + } +} + +void LevelRenderer::clearGlobalChunkFlag(int x, int y, int z, Level *level, unsigned char flag, unsigned char shift) +{ + unsigned char sflag = flag << shift; + int index = getGlobalIndexForChunk(x, y, z, level); + if( index != -1 ) + { +#ifdef _LARGE_WORLDS + EnterCriticalSection(&m_csChunkFlags); +#endif + globalChunkFlags[ index ] &= ~sflag; +#ifdef _LARGE_WORLDS + LeaveCriticalSection(&m_csChunkFlags); +#endif + } +} + +bool LevelRenderer::getGlobalChunkFlag(int x, int y, int z, Level *level, unsigned char flag, unsigned char shift) +{ + unsigned char sflag = flag << shift; + int index = getGlobalIndexForChunk(x, y, z, level); + if( index == -1 ) + { + return false; + } + else + { + return ( globalChunkFlags[ index ] & sflag ) == sflag; + } +} + +unsigned char LevelRenderer::incGlobalChunkRefCount(int x, int y, int z, Level *level) +{ + int index = getGlobalIndexForChunk(x, y, z, level); + if( index != -1 ) + { + unsigned char flags = globalChunkFlags[ index ]; + unsigned char refCount = (flags >> CHUNK_FLAG_REF_SHIFT ) & CHUNK_FLAG_REF_MASK; + refCount++; + flags &= ~(CHUNK_FLAG_REF_MASK<> CHUNK_FLAG_REF_SHIFT ) & CHUNK_FLAG_REF_MASK; + refCount--; + flags &= ~(CHUNK_FLAG_REF_MASK<second.end()); + for( AUTO_VAR(it2, it->second.begin()); it2 != itTEEnd; it2++ ) + { + (*it2)->upgradeRenderRemoveStage(); + } + } + LeaveCriticalSection(&m_csRenderableTileEntities); +} + +LevelRenderer::DestroyedTileManager::RecentTile::RecentTile(int x, int y, int z, Level *level) : x(x), y(y), z(z), level(level) +{ + timeout_ticks = 20; + rebuilt = false; +} + +LevelRenderer::DestroyedTileManager::RecentTile::~RecentTile() +{ + for( AUTO_VAR(it, boxes.begin()); it!= boxes.end(); it++ ) + { + delete *it; + } +} + +LevelRenderer::DestroyedTileManager::DestroyedTileManager() +{ + InitializeCriticalSection(&m_csDestroyedTiles); +} + +LevelRenderer::DestroyedTileManager::~DestroyedTileManager() +{ + DeleteCriticalSection(&m_csDestroyedTiles); + for( unsigned int i = 0; i < m_destroyedTiles.size(); i++ ) + { + delete m_destroyedTiles[i]; + } +} + + +// For game to let this manager know that a tile is about to be destroyed (must be called before it actually is) +void LevelRenderer::DestroyedTileManager::destroyingTileAt( Level *level, int x, int y, int z ) +{ + EnterCriticalSection(&m_csDestroyedTiles); + + // Store a list of AABBs that the tile to be destroyed would have made, before we go and destroy it. This + // is made slightly more complicated as the addAABBs method for tiles adds temporary AABBs and we need permanent + // ones, so make a temporary list and then copy over + + RecentTile *recentTile = new RecentTile(x, y, z, level); + AABB *box = AABB::newTemp((float)x, (float)y, (float)z, (float)(x+1), (float)(y+1), (float)(z+1)); + Tile *tile = Tile::tiles[level->getTile(x, y, z)]; + + if (tile != NULL) + { + tile->addAABBs(level, x, y, z, box, &recentTile->boxes, nullptr); + } + + // Make these temporary AABBs into permanently allocated AABBs + for( unsigned int i = 0; i < recentTile->boxes.size(); i++ ) + { + recentTile->boxes[i] = AABB::newPermanent(recentTile->boxes[i]->x0, + recentTile->boxes[i]->y0, + recentTile->boxes[i]->z0, + recentTile->boxes[i]->x1, + recentTile->boxes[i]->y1, + recentTile->boxes[i]->z1); + } + + m_destroyedTiles.push_back( recentTile ); + + LeaveCriticalSection(&m_csDestroyedTiles); +} + +// For chunk rebuilding to inform the manager that a chunk (a 16x16x16 tile render chunk) has been updated +void LevelRenderer::DestroyedTileManager::updatedChunkAt(Level *level, int x, int y, int z, int veryNearCount) +{ + EnterCriticalSection(&m_csDestroyedTiles); + + // There's 2 stages to this. This function is called when a renderer chunk has been rebuilt, but that chunk's render data might be grouped atomically with + // changes to other very near chunks. Therefore, we don't want to consider the render data to be fully updated until the chunk that it is in has been + // rebuilt, AND there aren't any very near things waiting to be rebuilt. + + // First pass through - see if any tiles are within the chunk which is being rebuilt, and mark up by setting their rebuilt flag + bool printed = false; + for( unsigned int i = 0; i < m_destroyedTiles.size(); i++) + { + if( ( m_destroyedTiles[i]->level == level ) && + ( m_destroyedTiles[i]->x >= x ) && ( m_destroyedTiles[i]->x < ( x + 16 ) ) && + ( m_destroyedTiles[i]->y >= y ) && ( m_destroyedTiles[i]->y < ( y + 16 ) ) && + ( m_destroyedTiles[i]->z >= z ) && ( m_destroyedTiles[i]->z < ( z + 16 ) ) ) + { + printed = true; + m_destroyedTiles[i]->rebuilt = true; + } + } + + // Now go through every tile that has been marked up as already being rebuilt, and fully remove it once there aren't going to be any more + // very near chunks. This might not happen on the same call to this function that rebuilt the chunk with the tile in. + if( veryNearCount <= 1 ) + { + for( unsigned int i = 0; i < m_destroyedTiles.size(); ) + { + if( m_destroyedTiles[i]->rebuilt ) + { + printed = true; + delete m_destroyedTiles[i]; + m_destroyedTiles[i] = m_destroyedTiles[m_destroyedTiles.size() - 1]; + m_destroyedTiles.pop_back(); + } + else + { + i++; + } + } + } + + LeaveCriticalSection(&m_csDestroyedTiles); +} + +// For game to get any AABBs that the user should be colliding with as render data has not yet been updated +void LevelRenderer::DestroyedTileManager::addAABBs( Level *level, AABB *box, AABBList *boxes ) +{ + EnterCriticalSection(&m_csDestroyedTiles); + + for( unsigned int i = 0; i < m_destroyedTiles.size(); i++ ) + { + if( m_destroyedTiles[i]->level == level ) + { + for( unsigned int j = 0; j < m_destroyedTiles[i]->boxes.size(); j++ ) + { + // If we find any AABBs intersecting the region we are interested in, add them to the output list, making a temp AABB copy so that we can destroy our own copy + // without worrying about the lifespan of the copy we've passed out + if( m_destroyedTiles[i]->boxes[j]->intersects( box ) ) + { + boxes->push_back(AABB::newTemp( m_destroyedTiles[i]->boxes[j]->x0, + m_destroyedTiles[i]->boxes[j]->y0, + m_destroyedTiles[i]->boxes[j]->z0, + m_destroyedTiles[i]->boxes[j]->x1, + m_destroyedTiles[i]->boxes[j]->y1, + m_destroyedTiles[i]->boxes[j]->z1 ) ); + } + } + } + } + + LeaveCriticalSection(&m_csDestroyedTiles); +} + +void LevelRenderer::DestroyedTileManager::tick() +{ + EnterCriticalSection(&m_csDestroyedTiles); + + // Remove any tiles that have timed out + for( unsigned int i = 0; i < m_destroyedTiles.size(); ) + { + if( --m_destroyedTiles[i]->timeout_ticks == 0 ) + { + delete m_destroyedTiles[i]; + m_destroyedTiles[i] = m_destroyedTiles[m_destroyedTiles.size() - 1]; + m_destroyedTiles.pop_back(); + } + else + { + i++; + } + } + + LeaveCriticalSection(&m_csDestroyedTiles); +} + +#ifdef _LARGE_WORLDS +void LevelRenderer::staticCtor() +{ + s_rebuildCompleteEvents = new C4JThread::EventArray(MAX_CHUNK_REBUILD_THREADS); + char threadName[256]; + for(unsigned int i = 0; i < MAX_CHUNK_REBUILD_THREADS; ++i) + { + sprintf(threadName,"Rebuild Chunk Thread %d\n",i); + rebuildThreads[i] = new C4JThread(rebuildChunkThreadProc,(void *)i,threadName); + + s_activationEventA[i] = new C4JThread::Event(); + + // Threads 1,3 and 5 are generally idle so use them + if((i%3) == 0) rebuildThreads[i]->SetProcessor(CPU_CORE_CHUNK_REBUILD_A); + else if((i%3) == 1) + { + rebuildThreads[i]->SetProcessor(CPU_CORE_CHUNK_REBUILD_B); +#ifdef __ORBIS__ + rebuildThreads[i]->SetPriority(THREAD_PRIORITY_BELOW_NORMAL); // On Orbis, this core is also used for Matching 2, and that priority of that seems to be always at default no matter what we set it to. Prioritise this below Matching 2. +#endif + } + else if((i%3) == 2) rebuildThreads[i]->SetProcessor(CPU_CORE_CHUNK_REBUILD_C); + + //ResumeThread( saveThreads[j] ); + rebuildThreads[i]->Run(); + } +} + +int LevelRenderer::rebuildChunkThreadProc(LPVOID lpParam) +{ + Vec3::CreateNewThreadStorage(); + AABB::CreateNewThreadStorage(); + IntCache::CreateNewThreadStorage(); + Tesselator::CreateNewThreadStorage(1024*1024); + RenderManager.InitialiseContext(); + Chunk::CreateNewThreadStorage(); + Tile::CreateNewThreadStorage(); + + int index = (size_t)lpParam; + + while(true) + { + s_activationEventA[index]->WaitForSignal(INFINITE); + + //app.DebugPrintf("Rebuilding permaChunk %d\n", index + 1); + permaChunk[index + 1].rebuild(); + + // Inform the producer thread that we are done with this chunk + s_rebuildCompleteEvents->Set(index); + } + + return 0; +} +#endif + +// This is called when chunks require rebuilding, but they haven't been added individually to the dirtyChunksLockFreeStack. Once in this +// state, the rebuilding thread will keep assuming there are dirty chunks until it has had a full pass through the chunks and found no dirty ones +void LevelRenderer::nonStackDirtyChunksAdded() +{ + dirtyChunksLockFreeStack.Push((int *)1); +} + +// 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 new file mode 100644 index 00000000..8374dc09 --- /dev/null +++ b/Minecraft.Client/LevelRenderer.h @@ -0,0 +1,290 @@ +#pragma once +#include "..\Minecraft.World\LevelListener.h" +#include "..\Minecraft.World\Definitions.h" +#include "OffsettedRenderList.h" +#include "..\Minecraft.World\JavaIntHash.h" +#include "..\Minecraft.World\Level.h" +#include "ResourceLocation.h" +#include +#ifdef __PS3__ +#include "C4JSpursJob.h" +#endif +class MultiPlayerLevel; +class Textures; +class Chunk; +class Minecraft; +class TileRenderer; +class Culler; +class Entity; +class TileEntity; +class Mob; +class Vec3; +class Particle; +class BlockDestructionProgress; +class IconRegister; +class Tesselator; +using namespace std; + +// AP - this is a system that works out which chunks actually need to be grouped together via the deferral system when doing chunk::rebuild. Doing this will reduce the number +// of chunks built in a single group and reduce the chance of seeing through the landscape when digging near the edges/corners of a chunk. +// I've added another chunk flag to mark a chunk critical so it swipes a bit from the reference count value (goes to 3 bits to 2). This works on Vita because it doesn't have +// split screen reference counting. +#ifdef __PSVITA__ +#define _CRITICAL_CHUNKS +#endif + +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 + static const int CHUNK_SIZE = 16; +#else + static const int CHUNK_SIZE = 16; +#endif + static const int CHUNK_Y_COUNT = Level::maxBuildHeight / CHUNK_SIZE; +#if ( defined _XBOX_ONE || defined _WINDOWS64 ) + static const int MAX_COMMANDBUFFER_ALLOCATIONS = 512 * 1024 * 1024; // 4J - added +#elif defined __ORBIS__ + static const int MAX_COMMANDBUFFER_ALLOCATIONS = 448 * 1024 * 1024; // 4J - added - hard limit is 512 so giving a lot of headroom here for fragmentation (have seen 16MB lost to fragmentation in multiplayer crash dump before) +#elif defined __PS3__ + static const int MAX_COMMANDBUFFER_ALLOCATIONS = 110 * 1024 * 1024; // 4J - added +#else + static const int MAX_COMMANDBUFFER_ALLOCATIONS = 55 * 1024 * 1024; // 4J - added +#endif +public: + LevelRenderer(Minecraft *mc, Textures *textures); +private: + void renderStars(); + void createCloudMesh(); // 4J added +public: + void setLevel(int playerIndex, MultiPlayerLevel *level); + void allChanged(); + void allChanged(int playerIndex); + + // 4J-PB added + void AddDLCSkinsToMemTextures(); +public: + void renderEntities(Vec3 *cam, Culler *culler, float a); + wstring gatherStats1(); + wstring gatherStats2(); +private: + void resortChunks(int xc, int yc, int zc); +public: + int render(shared_ptr player, int layer, double alpha, bool updateChunks); +private: + int renderChunks(int from, int to, int layer, double alpha); +public: + int activePlayers(); // 4J - added +public: + void renderSameAsLast(int layer, double alpha); + void tick(); + void renderSky(float alpha); + void renderHaloRing(float alpha); + void renderClouds(float alpha); + bool isInCloud(double x, double y, double z, float alpha); + void renderAdvancedClouds(float alpha); + bool updateDirtyChunks(); + +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, 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); + void tileLightChanged(int x, int y, int z); + void setTilesDirty(int x0, int y0, int z0, int x1, int y1, int z1, Level *level); // 4J - added level param + +#ifdef __PS3__ + void cull_SPU(int playerIndex, Culler *culler, float a); + void waitForCull_SPU(); + C4JSpursJobQueue::Port* m_jobPort_CullSPU; + C4JSpursJobQueue::Port* m_jobPort_FindNearestChunk; + bool m_bSPUCullStarted[4]; +#endif // __PS3__ + void cull(Culler *culler, float a); + void playStreamingMusic(const wstring& name, int x, int y, int z); + void playSound(int iSound, double x, double y, double z, float volume, float pitch, float fSoundClipDist=16.0f); + void playSound(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); + void entityRemoved(shared_ptr entity); + void playerRemoved(shared_ptr entity) {} // 4J added - for when a player is removed from the level's player array, not just the entity storage + void skyColorChanged(); + void clear(); + void 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); + + typedef unordered_map >, IntKeyHash, IntKeyEq> rteMap; +private: + + // debug + int m_freezeticks; // used to freeze the clouds + + // 4J - this block of declarations was scattered round the code but have gathered everything into one place + rteMap renderableTileEntities; // 4J - changed - was vector, now hashed by chunk so we can find them + CRITICAL_SECTION m_csRenderableTileEntities; + MultiPlayerLevel *level[4]; // 4J - now one per player + Textures *textures; + // vector *sortedChunks[4]; // 4J - removed - not sorting our chunks anymore + ClipChunkArray chunks[4]; // 4J - now one per player + int lastPlayerCount[4]; // 4J - added + int xChunks, yChunks, zChunks; + int chunkLists; + Minecraft *mc; + TileRenderer *tileRenderer[4]; // 4J - now one per player + int ticks; + int starList, skyList, darkList, haloRingList; + int cloudList; // 4J added + int xMinChunk, yMinChunk, zMinChunk; + int xMaxChunk, yMaxChunk, zMaxChunk; + int lastViewDistance; + int noEntityRenderFrames; + int totalEntities; + int renderedEntities; + int culledEntities; + int chunkFixOffs; + vector _renderChunks; + int frame; + int repeatList; + double xOld[4]; // 4J - now one per player + double yOld[4]; // 4J - now one per player + double zOld[4]; // 4J - now one per player + + int totalChunks, offscreenChunks, occludedChunks, renderedChunks, emptyChunks; + static const int RENDERLISTS_LENGTH = 4; // 4J - added + OffsettedRenderList renderLists[RENDERLISTS_LENGTH]; + + unordered_map destroyingBlocks; + Icon **breakingTextures; + +public: + void fullyFlagRenderableTileEntitiesToBeRemoved(); // 4J added + + CRITICAL_SECTION m_csDirtyChunks; + bool m_nearDirtyChunk; + + + // 4J - Destroyed Tile Management - these things added so we can track tiles which have been recently destroyed, and + // provide temporary collision for them until the render data has been updated to reflect this change + class DestroyedTileManager + { + private: + class RecentTile + { + public: + int x; + int y; + int z; + Level *level; + AABBList boxes; + int timeout_ticks; + bool rebuilt; + RecentTile(int x, int y, int z, Level *level); + ~RecentTile(); + }; + CRITICAL_SECTION m_csDestroyedTiles; + vector m_destroyedTiles; + public: + void destroyingTileAt( Level *level, int x, int y, int z ); // For game to let this manager know that a tile is about to be destroyed (must be called before it actually is) + void updatedChunkAt( Level * level, int x, int y, int z, int veryNearCount ); // For chunk rebuilding to inform the manager that a chunk (a 16x16x16 tile render chunk) has been updated + void addAABBs( Level *level, AABB *box, AABBList *boxes ); // For game to get any AABBs that the user should be colliding with as render data has not yet been updated + void tick(); + DestroyedTileManager(); + ~DestroyedTileManager(); + }; + DestroyedTileManager *destroyedTileManager; + + float destroyProgress; + + // 4J - added for new render list handling + // This defines the maximum size of renderable level, must be big enough to cope with actual size of level + view distance at each side + // so that we can render the "infinite" sea at the edges + static const int MAX_LEVEL_RENDER_SIZE[3]; + static const int DIMENSION_OFFSETS[3]; + // This is the TOTAL area of columns of chunks to be allocated for render round the players. So for one player, it would be a region of + // sqrt(PLAYER_RENDER_AREA) x sqrt(PLAYER_RENDER_AREA) +#ifdef _LARGE_WORLDS + static const int PLAYER_VIEW_DISTANCE = 18; // Straight line distance from centre to extent of visible world + static const int PLAYER_RENDER_AREA = (PLAYER_VIEW_DISTANCE * PLAYER_VIEW_DISTANCE * 4); +#else + static const int PLAYER_RENDER_AREA = 400; +#endif + + static int getDimensionIndexFromId(int id); + static int getGlobalIndexForChunk(int x, int y, int z, Level *level); + static int getGlobalIndexForChunk(int x, int y, int z, int dimensionId); + static bool isGlobalIndexInSameDimension( int idx, Level *level); + static int getGlobalChunkCount(); + static int getGlobalChunkCountForOverworld(); + + // Get/set/clear individual flags + bool getGlobalChunkFlag(int x, int y, int z, Level *level, unsigned char flag, unsigned char shift = 0); + void setGlobalChunkFlag(int x, int y, int z, Level *level, unsigned char flag, unsigned char shift = 0); + void setGlobalChunkFlag(int index, unsigned char flag, unsigned char shift = 0); + void clearGlobalChunkFlag(int x, int y, int z, Level *level, unsigned char flag, unsigned char shift = 0); + + // Get/set whole byte of flags + unsigned char getGlobalChunkFlags(int x, int y, int z, Level *level); + void setGlobalChunkFlags(int x, int y, int z, Level *level, unsigned char flags); + + // Reference counting + unsigned char incGlobalChunkRefCount(int x, int y, int z, Level *level); + unsigned char decGlobalChunkRefCount(int x, int y, int z, Level *level); + + // Actual storage for flags + unsigned char *globalChunkFlags; + + // The flag definitions + static const int CHUNK_FLAG_COMPILED = 0x01; + static const int CHUNK_FLAG_DIRTY = 0x02; + static const int CHUNK_FLAG_EMPTY0 = 0x04; + static const int CHUNK_FLAG_EMPTY1 = 0x08; + static const int CHUNK_FLAG_EMPTYBOTH = 0x0c; + static const int CHUNK_FLAG_NOTSKYLIT = 0x10; +#ifdef _CRITICAL_CHUNKS + static const int CHUNK_FLAG_CRITICAL = 0x20; + static const int CHUNK_FLAG_CUT_OUT = 0x40; + static const int CHUNK_FLAG_REF_MASK = 0x01; + static const int CHUNK_FLAG_REF_SHIFT = 7; +#else + static const int CHUNK_FLAG_REF_MASK = 0x07; + static const int CHUNK_FLAG_REF_SHIFT = 5; +#endif + + XLockFreeStack dirtyChunksLockFreeStack; + + bool dirtyChunkPresent; + __int64 lastDirtyChunkFound; + static const int FORCE_DIRTY_CHUNK_CHECK_PERIOD_MS = 250; + +#ifdef _LARGE_WORLDS + static const int MAX_CONCURRENT_CHUNK_REBUILDS = 4; + static const int MAX_CHUNK_REBUILD_THREADS = MAX_CONCURRENT_CHUNK_REBUILDS - 1; + static Chunk permaChunk[MAX_CONCURRENT_CHUNK_REBUILDS]; + static C4JThread *rebuildThreads[MAX_CHUNK_REBUILD_THREADS]; + static C4JThread::EventArray *s_rebuildCompleteEvents; + static C4JThread::Event *s_activationEventA[MAX_CHUNK_REBUILD_THREADS]; + static void staticCtor(); + static int rebuildChunkThreadProc(LPVOID lpParam); + + CRITICAL_SECTION m_csChunkFlags; +#endif + void nonStackDirtyChunksAdded(); + + int checkAllPresentChunks(bool *faultFound); // 4J - added for testing +}; diff --git a/Minecraft.Client/Lighting.cpp b/Minecraft.Client/Lighting.cpp new file mode 100644 index 00000000..50529d51 --- /dev/null +++ b/Minecraft.Client/Lighting.cpp @@ -0,0 +1,65 @@ +#include "stdafx.h" +#include "Lighting.h" +#include "..\Minecraft.World\FloatBuffer.h" +#include "..\Minecraft.World\Vec3.h" + +FloatBuffer *Lighting::lb = new FloatBuffer(16); + + +void Lighting::turnOff() +{ + glDisable(GL_LIGHTING); + glDisable(GL_LIGHT0); + glDisable(GL_LIGHT1); + glDisable(GL_COLOR_MATERIAL); +} + +void Lighting::turnOn() +{ + glEnable(GL_LIGHTING); + glEnable(GL_LIGHT0); + glEnable(GL_LIGHT1); + glEnable(GL_COLOR_MATERIAL); + glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE); + float a = 0.4f; + float d = 0.6f; + float s = 0.0f; + + Vec3 *l = Vec3::newTemp(0.2f, 1.0f, -0.7f)->normalize(); + glLight(GL_LIGHT0, GL_POSITION, getBuffer(l->x, l->y, l->z, 0)); + glLight(GL_LIGHT0, GL_DIFFUSE, getBuffer(d, d, d, 1)); + glLight(GL_LIGHT0, GL_AMBIENT, getBuffer(0.0f, 0.0f, 0.0f, 1.0f)); + glLight(GL_LIGHT0, GL_SPECULAR, getBuffer(s, s, s, 1.0f)); + + l = Vec3::newTemp(-0.2f, 1.0f, 0.7f)->normalize(); + glLight(GL_LIGHT1, GL_POSITION, getBuffer(l->x, l->y, l->z, 0)); + glLight(GL_LIGHT1, GL_DIFFUSE, getBuffer(d, d, d, 1)); + glLight(GL_LIGHT1, GL_AMBIENT, getBuffer(0.0f, 0.0f, 0.0f, 1.0f)); + glLight(GL_LIGHT1, GL_SPECULAR, getBuffer(s, s, s, 1.0f)); + + glShadeModel(GL_FLAT); + glLightModel(GL_LIGHT_MODEL_AMBIENT, getBuffer(a, a, a, 1)); + +} + +FloatBuffer *Lighting::getBuffer(double a, double b, double c, double d) +{ + return getBuffer((float) a, (float) b, (float) c, (float) d); +} + +FloatBuffer *Lighting::getBuffer(float a, float b, float c, float d) +{ + lb->clear(); + lb->put(a)->put(b)->put(c)->put(d); + lb->flip(); + return lb; +} + +void Lighting::turnOnGui() +{ + glPushMatrix(); + glRotatef(-30, 0, 1, 0); + glRotatef(165, 1, 0, 0); + turnOn(); + glPopMatrix(); +} \ No newline at end of file diff --git a/Minecraft.Client/Lighting.h b/Minecraft.Client/Lighting.h new file mode 100644 index 00000000..c06fd539 --- /dev/null +++ b/Minecraft.Client/Lighting.h @@ -0,0 +1,16 @@ +#pragma once +class FloatBuffer; + +class Lighting +{ +private: + static FloatBuffer *lb; + +public: + static void turnOff(); + static void turnOn(); + static void turnOnGui(); +private: + static FloatBuffer *getBuffer(double a, double b, double c, double d); + static FloatBuffer *getBuffer(float a, float b, float c, float d); +}; diff --git a/Minecraft.Client/LightningBoltRenderer.cpp b/Minecraft.Client/LightningBoltRenderer.cpp new file mode 100644 index 00000000..d02ea7f7 --- /dev/null +++ b/Minecraft.Client/LightningBoltRenderer.cpp @@ -0,0 +1,97 @@ +#include "stdafx.h" +#include "LightningBoltRenderer.h" +#include "Tesselator.h" +#include "..\Minecraft.World\net.minecraft.world.entity.global.h" + +void LightningBoltRenderer::render(shared_ptr _bolt, double x, double y, double z, float rot, float a) +{ + // 4J - dynamic cast required because we aren't using templates/generics in our version + shared_ptr bolt = dynamic_pointer_cast(_bolt); + + Tesselator *t = Tesselator::getInstance(); + + glDisable(GL_TEXTURE_2D); + glDisable(GL_LIGHTING); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE); + + + double xOffs[8]; + double zOffs[8]; + double xOff = 0; + double zOff = 0; + { + Random *random = new Random(bolt->seed); + for (int h = 7; h >= 0; h--) + { + xOffs[h] = xOff; + zOffs[h] = zOff; + xOff += random->nextInt(11) - 5; + zOff += random->nextInt(11) - 5; + } + } + + for (int r = 0; r < 4; r++) + { + Random *random = new Random(bolt->seed); + for (int p = 0; p < 3; p++) + { + int hs = 7; + int ht = 0; + if (p > 0) hs = 7 - p; + if (p > 0) ht = hs - 2; + double xo0 = xOffs[hs] - xOff; + double zo0 = zOffs[hs] - zOff; + for (int h = hs; h >= ht; h--) + { + double xo1 = xo0; + double zo1 = zo0; + if (p == 0) + { + xo0 += random->nextInt(11) - 5; + zo0 += random->nextInt(11) - 5; + } + else + { + xo0 += random->nextInt(31) - 15; + zo0 += random->nextInt(31) - 15; + } + + t->begin(GL_TRIANGLE_STRIP); + float br = 0.5f; + t->color(0.9f * br, 0.9f * br, 1 * br, 0.3f); + + double rr1 = (0.1 + r * 0.2); + if (p == 0) rr1 *= (h * 0.1 + 1); + + double rr2 = (0.1 + r * 0.2); + if (p == 0) rr2 *= ((h-1) * 0.1 + 1); + + for (int i = 0; i < 5; i++) + { + double xx1 = x + 0.5 - rr1; + double zz1 = z + 0.5 - rr1; + if (i == 1 || i == 2) xx1 += rr1 * 2; + if (i == 2 || i == 3) zz1 += rr1 * 2; + + double xx2 = x + 0.5 - rr2; + double zz2 = z + 0.5 - rr2; + if (i == 1 || i == 2) xx2 += rr2 * 2; + if (i == 2 || i == 3) zz2 += rr2 * 2; + + t->vertex((float)(xx2 + xo0), (float)( y + (h) * 16), (float)( zz2 + zo0)); + t->vertex((float)(xx1 + xo1), (float)( y + (h + 1) * 16), (float)( zz1 + zo1)); + + } + + t->end(); + } + } + } + + + glDisable(GL_BLEND); + glEnable(GL_LIGHTING); + glEnable(GL_TEXTURE_2D); + +} \ No newline at end of file diff --git a/Minecraft.Client/LightningBoltRenderer.h b/Minecraft.Client/LightningBoltRenderer.h new file mode 100644 index 00000000..5a2b33a3 --- /dev/null +++ b/Minecraft.Client/LightningBoltRenderer.h @@ -0,0 +1,8 @@ +#pragma once +#include "EntityRenderer.h" + +class LightningBoltRenderer : public EntityRenderer +{ +public: + virtual void render(shared_ptr bolt, double x, double y, double z, float rot, float a); +}; \ No newline at end of file diff --git a/Minecraft.Client/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 new file mode 100644 index 00000000..77ce5121 --- /dev/null +++ b/Minecraft.Client/LocalPlayer.cpp @@ -0,0 +1,1721 @@ +#include "stdafx.h" +#include "LocalPlayer.h" +#include "User.h" +#include "Input.h" +#include "StatsCounter.h" +#include "ParticleEngine.h" +#include "TakeAnimationParticle.h" +#include "Options.h" +#include "TextEditScreen.h" +#include "ContainerScreen.h" +#include "CraftingScreen.h" +#include "FurnaceScreen.h" +#include "TrapScreen.h" + +#include "MultiPlayerLocalPlayer.h" +#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" + +// 4J : WESTY : Added for new achievements. +#include "..\Minecraft.World\item.h" +#include "..\Minecraft.World\mapitem.h" +#include "..\Minecraft.World\tile.h" + +// 4J Stu - Added for tutorial callbacks +#include "Minecraft.h" + +#include "..\Minecraft.World\Minecart.h" +#include "..\Minecraft.World\Boat.h" +#include "..\Minecraft.World\Pig.h" + +#include "..\Minecraft.World\StringHelpers.h" + +#include "Options.h" +#include "..\Minecraft.World\Dimension.h" + +#ifndef _DURANGO +#include "..\Minecraft.World\CommonStats.h" +#endif + + + +LocalPlayer::LocalPlayer(Minecraft *minecraft, Level *level, User *user, int dimension) : Player(level, user->name) +{ + flyX = flyY = flyZ = 0.0f; // 4J added + m_awardedThisSession = 0; + + sprintTriggerTime = 0; + sprintTriggerRegisteredReturn = false; + 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; + + if (user != NULL && user->name.length() > 0) + { + customTextureUrl = L"http://s3.amazonaws.com/MinecraftSkins/" + user->name + L".png"; + } + if( user != NULL ) + { + this->name = user->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()); + if(pMojangData) + { + customTextureUrl=pMojangData->wchSkin; + } + + } + input = NULL; + m_iPad = -1; + m_iScreenSection=C4JRender::VIEWPORT_TYPE_FULLSCREEN; // assume singleplayer default + m_bPlayerRespawned=false; + ullButtonsPressed=0LL; + ullDpad_last = ullDpad_this = ullDpad_filtered = 0; + + // 4J-PB - moved in from the minecraft structure + //ticks=0; + missTime=0; + lastClickTick[0] = 0; + lastClickTick[1] = 0; + isRaining=false; + + m_bIsIdle = false; + m_iThirdPersonView=0; + + // 4J Stu - Added for telemetry + SetSessionTimerStart(); + + // 4J - added for auto repeat in creative mode + lastClickState = lastClick_invalid; + lastClickTolerance = 0.0f; + + m_bHasAwardedStayinFrosty = false; +} + +LocalPlayer::~LocalPlayer() +{ + if( this->input != NULL ) + delete input; +} + +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); +} + +void LocalPlayer::serverAiStep() +{ + Player::serverAiStep(); + + if( abilities.flying && abilities.mayfly ) + { + // snap y rotation for flying to nearest 90 degrees in world space + float fMag = sqrtf(input->xa * input->xa + input->ya * input->ya); + // Don't bother for tiny inputs + if( fMag >= 0.1f ) + { + // Get angle (in player rotated space) of input controls + float yRotInput = atan2f(input->ya, input->xa) * (180.0f / PI); + // Now get in world space + float yRotFinal = yRotInput + yRot; + // Snap this to nearest 90 degrees + float yRotSnapped = floorf((yRotFinal / 45.0f) + 0.5f) * 45.0f; + // Find out how much we had to move to do this snap + float yRotDiff = yRotSnapped - yRotFinal; + // Apply the same difference to the player rotated space angle + float yRotInputAdjust = yRotInput + yRotDiff; + + // Calculate final x/y player-space movement required + this->xxa = cos(yRotInputAdjust * ( PI / 180.0f) ) * fMag; + this->yya = sin(yRotInputAdjust * ( PI / 180.0f) ) * fMag; + } + else + { + this->xxa = input->xa; + this->yya = input->ya; + } + } + else + { + this->xxa = input->xa; + this->yya = input->ya; + } + this->jumping = input->jumping; + + yBobO = yBob; + xBobO = xBob; + xBob += (xRot - xBob) * 0.5; + yBob += (yRot - yBob) * 0.5; + + // TODO 4J - Remove + //if (input->jumping) + // mapPlayerChunk(8); +} + +bool LocalPlayer::isEffectiveAi() +{ + return true; +} + +void LocalPlayer::aiStep() +{ + if (sprintTime > 0) + { + sprintTime--; + if (sprintTime == 0) + { + setSprinting(false); + } + } + if (sprintTriggerTime > 0) sprintTriggerTime--; + if (minecraft->gameMode->isCutScene()) + { + x = z = 0.5; + x = 0; + z = 0; + yRot = tickCount / 12.0f; + xRot = 10; + y = 68.5; + return; + } + oPortalTime = portalTime; + if (isInsidePortal) + { + if (!level->isClientSide) + { + if (riding != NULL) this->ride(nullptr); + } + if (minecraft->screen != NULL) minecraft->setScreen(NULL); + + if (portalTime == 0) + { + minecraft->soundEngine->playUI(eSoundType_PORTAL_TRIGGER, 1, random->nextFloat() * 0.4f + 0.8f); + } + portalTime += 1 / 80.0f; + if (portalTime >= 1) + { + portalTime = 1; + } + isInsidePortal = false; + } + else if (hasEffect(MobEffect::confusion) && getEffect(MobEffect::confusion)->getDuration() > (SharedConstants::TICKS_PER_SECOND * 3)) + { + portalTime += 1 / 150.0f; + if (portalTime > 1) + { + portalTime = 1; + } + } + else + { + if (portalTime > 0) portalTime -= 1 / 20.0f; + if (portalTime < 0) portalTime = 0; + } + + if (changingDimensionDelay > 0) changingDimensionDelay--; + bool wasJumping = input->jumping; + float runTreshold = 0.8f; + + bool wasRunning = input->ya >= runTreshold; + //input->tick( dynamic_pointer_cast( shared_from_this() ) ); + // 4J-PB - make it a localplayer + input->tick( this ); + 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 + { + 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); + + bool enoughFoodToSprint = getFoodData()->getFoodLevel() > FoodConstants::MAX_FOOD * FoodConstants::FOOD_SATURATION_LOW; + + // 4J Stu - If we can fly, then we should be able to sprint without requiring food. This is particularly a problem for people who save a survival + // world with low food, then reload it in creative. + if(abilities.mayfly || isAllowedToFly() ) enoughFoodToSprint = true; + + // 4J - altered this slightly to make sure that the joypad returns to below returnTreshold in between registering two movements up to runThreshold + if (onGround && !isSprinting() && enoughFoodToSprint && !isUsingItem() && !hasEffect(MobEffect::blindness)) + { + if( !wasRunning && input->ya >= runTreshold ) + { + if (sprintTriggerTime == 0) + { + sprintTriggerTime = 7; + sprintTriggerRegisteredReturn = false; + } + else + { + if( sprintTriggerRegisteredReturn ) + { + setSprinting(true); + sprintTriggerTime = 0; + sprintTriggerRegisteredReturn = false; + } + } + } + else if( ( sprintTriggerTime > 0 ) && ( input->ya == 0.0f ) ) // ya of 0.0f here signifies that we have returned to the deadzone + { + sprintTriggerRegisteredReturn = true; + } + } + if (isSneaking()) sprintTriggerTime = 0; + // 4J-PB - try not stopping sprint on collision + //if (isSprinting() && (input->ya < runTreshold || horizontalCollision || !enoughFoodToSprint)) + if (isSprinting() && (input->ya < runTreshold || !enoughFoodToSprint)) + { + setSprinting(false); + } + + // 4J Stu - Fix for #52705 - Customer Encountered: Player can fly in bed while being in Creative mode. + if (!isSleeping() && (abilities.mayfly || isAllowedToFly() )) + { + // 4J altered to require jump button to released after being tapped twice to trigger move between flying / not flying + if (!wasJumping && input->jumping) + { + if (jumpTriggerTime == 0) + { + jumpTriggerTime = 10; // was 7 + twoJumpsRegistered = false; + } + else + { + twoJumpsRegistered = true; + } + } + else if( ( !input->jumping ) && ( jumpTriggerTime > 0 ) && twoJumpsRegistered ) + { +#ifndef _CONTENT_PACKAGE + printf("flying was %s\n", abilities.flying ? "on" : "off"); +#endif + abilities.flying = !abilities.flying; +#ifndef _CONTENT_PACKAGE + printf("flying is %s\n", abilities.flying ? "on" : "off"); +#endif + jumpTriggerTime = 0; + twoJumpsRegistered = false; + if( abilities.flying ) input->sneaking = false; // 4J added - would we ever intentially want to go into flying mode whilst sneaking? + } + } + else if(abilities.flying) + { +#ifdef _DEBUG_MENUS_ENABLED + if(!abilities.debugflying) +#endif + { + abilities.flying = false; + } + } + + + if (abilities.flying) + { + // yd = 0; + // 4J - note that the 0.42 added for going down is to make it match with what happens when you jump - jumping itself adds 0.42 to yd in Mob::jumpFromGround + if (ullButtonsPressed & (1LL<jumping) + { + noJumpDelay = 0; + yd += 0.15; + } + + // snap y rotation to nearest 90 degree axis aligned value + float yRotSnapped = floorf((yRot / 90.0f) + 0.5f) * 90.0f; + + if(InputManager.GetJoypadMapVal(m_iPad) == 0) + { + if( ullDpad_filtered & (1LL<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() ) + { + if (onGround && abilities.flying) + { +#ifdef _DEBUG_MENUS_ENABLED + if(!abilities.debugflying) +#endif + { + abilities.flying = false; + } + } + } + + if( abilities.flying )//minecraft->options->isFlying ) + { + Vec3* viewVector = getViewVector(1.0f); + + // 4J-PB - To let the player build easily while flying, we need to change this + +#ifdef _DEBUG_MENUS_ENABLED + if(abilities.debugflying) + { + flyX = (float)viewVector->x * input->ya; + flyY = (float)viewVector->y * input->ya; + flyZ = (float)viewVector->z * input->ya; + } + else +#endif + { + if( isSprinting() ) + { + // Accelrate up to full speed if we are sprinting, moving in the direction of the view vector + flyX = (float)viewVector->x * input->ya; + flyY = (float)viewVector->y * input->ya; + flyZ = (float)viewVector->z * input->ya; + + float scale = ((float)(SPRINT_DURATION - sprintTime))/10.0f; + scale = scale * scale; + if ( scale > 1.0f ) scale = 1.0f; + flyX *= scale; + flyY *= scale; + flyZ *= scale; + } + else + { + flyX = 0.0f; + flyY = 0.0f; + flyZ = 0.0f; + if( ullDpad_filtered & (1LL< PLAYER_IDLE_TIME ) + { + ProfileManager.SetCurrentGameActivity(m_iPad,CONTEXT_PRESENCE_IDLE,false); + m_bIsIdle = true; + } + else if ( m_bIsIdle && InputManager.GetIdleSeconds( m_iPad ) < PLAYER_IDLE_TIME ) + { + // Are we offline or online, and how many players are there + if(g_NetworkManager.GetPlayerCount()>1) + { + // only do it for this player here - each player will run this code + if(g_NetworkManager.IsLocalGame()) + { + ProfileManager.SetCurrentGameActivity(m_iPad,CONTEXT_PRESENCE_MULTIPLAYEROFFLINE,false); + } + else + { + ProfileManager.SetCurrentGameActivity(m_iPad,CONTEXT_PRESENCE_MULTIPLAYER,false); + } + } + else + { + if(g_NetworkManager.IsLocalGame()) + { + ProfileManager.SetCurrentGameActivity(m_iPad,CONTEXT_PRESENCE_MULTIPLAYER_1POFFLINE,false); + } + else + { + ProfileManager.SetCurrentGameActivity(m_iPad,CONTEXT_PRESENCE_MULTIPLAYER_1P,false); + } + } + updateRichPresence(); + m_bIsIdle = false; + } +} + +void LocalPlayer::changeDimension(int i) +{ + if (!level->isClientSide) + { + if (dimension == 1 && i == 1) + { + awardStat(GenericStats::winGame(), GenericStats::param_noArgs()); + //minecraft.setScreen(new WinScreen()); +#ifndef _CONTENT_PACKAGE + app.DebugPrintf("LocalPlayer::changeDimension from 1 to 1 but WinScreen has not been implemented.\n"); + __debugbreak(); +#endif + } + else + { + awardStat(GenericStats::theEnd(), GenericStats::param_theEnd()); + + minecraft->soundEngine->playUI(eSoundType_PORTAL_TRAVEL, 1, random->nextFloat() * 0.4f + 0.8f); + } + } +} + +float LocalPlayer::getFieldOfViewModifier() +{ + float targetFov = 1.0f; + + // modify for movement + if (abilities.flying) targetFov *= 1.1f; + + AttributeInstance *speed = getAttribute(SharedMonsterAttributes::MOVEMENT_SPEED); + targetFov *= (speed->getValue() / abilities.getWalkingSpeed() + 1) / 2; + + // modify for bow =) + if (isUsingItem() && getUseItem()->id == Item::bow->id) + { + int ticksHeld = getTicksUsingItem(); + float scale = (float) ticksHeld / BowItem::MAX_DRAW_DURATION; + if (scale > 1) + { + scale = 1; + } + else + { + scale *= scale; + } + targetFov *= 1.0f - scale * .15f; + } + + return targetFov; +} + +void LocalPlayer::addAdditonalSaveData(CompoundTag *entityTag) +{ + Player::addAdditonalSaveData(entityTag); + //entityTag->putInt(L"Score", score); +} + +void LocalPlayer::readAdditionalSaveData(CompoundTag *entityTag) +{ + Player::readAdditionalSaveData(entityTag); + //score = entityTag->getInt(L"Score"); +} + +void LocalPlayer::closeContainer() +{ + 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. + ui.PlayUISFX(eSFX_Back); + ui.CloseUIScenes( m_iPad ); +} + +void LocalPlayer::openTextEdit(shared_ptr tileEntity) +{ + 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)); +} + +bool LocalPlayer::openContainer(shared_ptr container) +{ + bool success = app.LoadContainerMenu(GetXboxPad(), inventory, container ); + if( success ) ui.PlayUISFX(eSFX_Press); + //minecraft->setScreen(new ContainerScreen(inventory, 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 ); + if( success ) ui.PlayUISFX(eSFX_Press); + //app.LoadXuiCraftMenu(0,inventory, level, x, y, z); + //minecraft->setScreen(new CraftingScreen(inventory, level, x, y, z)); + return success; +} + +bool LocalPlayer::openFireworks(int x, int y, int z) +{ + bool success = app.LoadFireworksMenu(GetXboxPad(), dynamic_pointer_cast( shared_from_this() ), x, y, z ); + if( success ) ui.PlayUISFX(eSFX_Press); + return success; +} + +bool LocalPlayer::startEnchanting(int x, int y, int z, const wstring &name) +{ + bool success = app.LoadEnchantingMenu(GetXboxPad(), inventory, x, y, z, level, name); + if( success ) ui.PlayUISFX(eSFX_Press); + //minecraft.setScreen(new EnchantmentScreen(inventory, level, x, y, z)); + return success; +} + +bool LocalPlayer::startRepairing(int x, int y, int z) +{ + bool success = app.LoadRepairingMenu(GetXboxPad(), inventory, level, x, y, z ); + if( success ) ui.PlayUISFX(eSFX_Press); + //minecraft.setScreen(new RepairScreen(inventory, level, x, y, z)); + return success; +} + +bool LocalPlayer::openFurnace(shared_ptr furnace) +{ + bool success = app.LoadFurnaceMenu(GetXboxPad(),inventory, furnace); + if( success ) ui.PlayUISFX(eSFX_Press); + //minecraft->setScreen(new FurnaceScreen(inventory, furnace)); + return success; +} + +bool LocalPlayer::openBrewingStand(shared_ptr brewingStand) +{ + bool success = app.LoadBrewingStandMenu(GetXboxPad(),inventory, brewingStand); + if( success ) ui.PlayUISFX(eSFX_Press); + //minecraft.setScreen(new BrewingStandScreen(inventory, brewingStand)); + 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); + if( success ) ui.PlayUISFX(eSFX_Press); + //minecraft->setScreen(new TrapScreen(inventory, trap)); + return success; +} + +bool LocalPlayer::openTrading(shared_ptr traderTarget, const wstring &name) +{ + bool success = app.LoadTradingMenu(GetXboxPad(),inventory, traderTarget, level, name); + if( success ) ui.PlayUISFX(eSFX_Press); + //minecraft.setScreen(new MerchantScreen(inventory, traderTarget, level)); + return success; +} + +void LocalPlayer::crit(shared_ptr e) +{ + shared_ptr critParticle = shared_ptr( new CritParticle((Level *)minecraft->level, e) ); + critParticle->CritParticlePostConstructor(); + minecraft->particleEngine->add(critParticle); +} + +void LocalPlayer::magicCrit(shared_ptr e) +{ + shared_ptr critParticle = shared_ptr( new CritParticle((Level *)minecraft->level, e, eParticleType_magicCrit) ); + critParticle->CritParticlePostConstructor(); + minecraft->particleEngine->add(critParticle); +} + +void LocalPlayer::take(shared_ptr e, int orgCount) +{ + minecraft->particleEngine->add( shared_ptr( new TakeAnimationParticle((Level *)minecraft->level, e, shared_from_this(), -0.5f) ) ); +} + +void LocalPlayer::chat(const wstring& message) +{ +} + +bool LocalPlayer::isSneaking() +{ + return input->sneaking && !m_isSleeping; +} + +void LocalPlayer::hurtTo(float newHealth, ETelemetryChallenges damageSource) +{ + float dmg = getHealth() - newHealth; + if (dmg <= 0) + { + setHealth(newHealth); + if (dmg < 0) + { + invulnerableTime = invulnerableDuration / 2; + } + } + else + { + lastHurt = dmg; + setHealth(getHealth()); + invulnerableTime = invulnerableDuration; + actuallyHurt(DamageSource::genericSource,dmg); + hurtTime = hurtDuration = 10; + } + + + if( this->getHealth() <= 0) + { + 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); + + // if there are any xuiscenes up for this player, close them + if(ui.GetMenuDisplayed(GetXboxPad())) + { + ui.CloseUIScenes(GetXboxPad()); + } + } + +} + +void LocalPlayer::respawn() +{ + // Select the right payer to respawn + minecraft->respawnPlayer(GetXboxPad(), 0, 0); +} + +void LocalPlayer::animateRespawn() +{ +// Player.animateRespawn(this, level); +} + +void LocalPlayer::displayClientMessage(int messageId) +{ + minecraft->gui->displayClientMessage(messageId, GetXboxPad()); +} + +void LocalPlayer::awardStat(Stat *stat, byteArray param) +{ +#ifdef _DURANGO + // 4J-JEV: Maybe we want to fine tune this later? #TODO + if ( !ProfileManager.IsGuest(GetXboxPad()) + && app.CanRecordStatsAndAchievements() + && ProfileManager.IsFullVersion() + ) + { + stat->handleParamBlob(dynamic_pointer_cast(shared_from_this()), param); + } + delete [] param.data; +#else + int count = CommonStats::readParam(param); + delete [] param.data; + + if (!app.CanRecordStatsAndAchievements()) return; + if (stat == NULL) return; + + if (stat->isAchievement()) + { + 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)) + { + // 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 + // e.g. Splitscreen players cannot get theme/avatar/gamerpic and Trial players cannot get any + // This causes some extreme flooding of some awards + if(ProfileManager.CanBeAwarded(m_iPad, ach->getAchievementID() ) ) + { + // 4J Stu - We don't (currently) care about the gamerscore, so setting to a default of 0 points + TelemetryManager->RecordAchievementUnlocked(m_iPad,ach->getAchievementID(),0); + + // 4J Stu - Some awards cause a menu to popup. This can be bad, especially if you are surrounded by mobs! + // We cannot pause the game unless in offline single player, but lets at least do it then + if( g_NetworkManager.IsLocalGame() && g_NetworkManager.GetPlayerCount() == 1 && ProfileManager.GetAwardType(ach->getAchievementID() ) != eAwardType_Achievement ) + { + ui.CloseUIScenes(m_iPad); + ui.NavigateToScene(m_iPad,eUIScene_PauseMenu); + } + } + + // 4J-JEV: To stop spamming trophies. + unsigned long long achBit = ((unsigned long long)1) << ach->getAchievementID(); + if ( !(achBit & m_awardedThisSession) ) + { + ProfileManager.Award(m_iPad, ach->getAchievementID()); + 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); + + // 4J-JEV: Check achievements for unlocks. + + // LEADER OF THE PACK + if ( stat == GenericStats::tamedEntity(eTYPE_WOLF) ) + { + // Check to see if we have befriended 5 wolves! Is this really the best place to do this??!! + if ( pStats->getTotalValue(GenericStats::tamedEntity(eTYPE_WOLF)) >= 5 ) + { + awardStat(GenericStats::leaderOfThePack(), GenericStats::param_noArgs()); + } + } + + // MOAR TOOLS + { + Stat *toolStats[4][5]; + toolStats[0][0] = GenericStats::itemsCrafted(Item::shovel_wood->id); + toolStats[0][1] = GenericStats::itemsCrafted(Item::shovel_stone->id); + toolStats[0][2] = GenericStats::itemsCrafted(Item::shovel_iron->id); + toolStats[0][3] = GenericStats::itemsCrafted(Item::shovel_diamond->id); + toolStats[0][4] = GenericStats::itemsCrafted(Item::shovel_gold->id); + toolStats[1][0] = GenericStats::itemsCrafted(Item::pickAxe_wood->id); + toolStats[1][1] = GenericStats::itemsCrafted(Item::pickAxe_stone->id); + toolStats[1][2] = GenericStats::itemsCrafted(Item::pickAxe_iron->id); + toolStats[1][3] = GenericStats::itemsCrafted(Item::pickAxe_diamond->id); + toolStats[1][4] = GenericStats::itemsCrafted(Item::pickAxe_gold->id); + toolStats[2][0] = GenericStats::itemsCrafted(Item::hatchet_wood->id); + toolStats[2][1] = GenericStats::itemsCrafted(Item::hatchet_stone->id); + toolStats[2][2] = GenericStats::itemsCrafted(Item::hatchet_iron->id); + toolStats[2][3] = GenericStats::itemsCrafted(Item::hatchet_diamond->id); + toolStats[2][4] = GenericStats::itemsCrafted(Item::hatchet_gold->id); + toolStats[3][0] = GenericStats::itemsCrafted(Item::hoe_wood->id); + toolStats[3][1] = GenericStats::itemsCrafted(Item::hoe_stone->id); + toolStats[3][2] = GenericStats::itemsCrafted(Item::hoe_iron->id); + toolStats[3][3] = GenericStats::itemsCrafted(Item::hoe_diamond->id); + toolStats[3][4] = GenericStats::itemsCrafted(Item::hoe_gold->id); + + bool justCraftedTool = false; + for (int i=0; i<4; i++) + { + for (int j=0; j<5; j++) + { + if ( stat == toolStats[i][j] ) + { + justCraftedTool = true; + break; + } + } + } + + if (justCraftedTool) + { + bool awardNow = true; + for (int i=0; i<4; i++) + { + bool craftedThisTool = false; + for (int j=0; j<5; j++) + { + if ( pStats->getTotalValue(toolStats[i][j]) > 0 ) + craftedThisTool = true; + } + + if (!craftedThisTool) + { + awardNow = false; + break; + } + } + + if (awardNow) + { + awardStat(GenericStats::MOARTools(), GenericStats::param_noArgs()); + } + } + + } + +#ifdef _XBOX + // AWARD: Have we killed 10 creepers? + if ( pStats->getTotalValue( GenericStats::killsCreeper() ) >= 10 ) + { + awardStat( GenericStats::kill10Creepers(), GenericStats::param_noArgs()); + } + + // AWARD : Have we been playing for 100 game days? + if ( pStats->getTotalValue( GenericStats::timePlayed() ) >= ( Level::TICKS_PER_DAY * 100 ) ) + { + awardStat( GenericStats::play100Days(), GenericStats::param_noArgs()); + } + // AWARD : Have we mined 100 blocks? + if ( pStats->getTotalValue( GenericStats::totalBlocksMined() ) >= 100 ) + { + awardStat( GenericStats::mine100Blocks(), GenericStats::param_noArgs()); + } +#endif + +#ifdef _EXTENDED_ACHIEVEMENTS + + // AWARD : Porkchop, cook and eat a porkchop. + { + Stat *cookPorkchop, *eatPorkchop; + cookPorkchop = GenericStats::itemsCrafted(Item::porkChop_cooked_Id); + eatPorkchop = GenericStats::itemsUsed(Item::porkChop_cooked_Id); + + if ( stat == cookPorkchop || stat == eatPorkchop ) + { + int numCookPorkchop, numEatPorkchop; + numCookPorkchop = pStats->getTotalValue(cookPorkchop); + numEatPorkchop = pStats->getTotalValue(eatPorkchop); + + app.DebugPrintf( + "[AwardStat] Check unlock 'Porkchop': " + "pork_cooked=%i, pork_eaten=%i.\n", + numCookPorkchop, numEatPorkchop + ); + + if ( (0 < numCookPorkchop) && (0 < numEatPorkchop) ) + { + awardStat( GenericStats::porkChop(), GenericStats::param_porkChop() ); + } + } + } + + // AWARD : Passing the Time, play for 100 minecraft days. + { + Stat *timePlayed = GenericStats::timePlayed(); + + if ( stat == timePlayed ) + { + int iPlayedTicks, iRequiredTicks; + iPlayedTicks = pStats->getTotalValue(timePlayed); + iRequiredTicks = Level::TICKS_PER_DAY * 100; + + /* app.DebugPrintf( + "[AwardStat] Check unlock 'Passing the Time': " + "total_ticks=%i, req=%i.\n", + iPlayedTicks, iRequiredTicks + ); */ + + if (iPlayedTicks >= iRequiredTicks) + { + awardStat( GenericStats::passingTheTime(), GenericStats::param_passingTheTime() ); + } + } + } + + // AWARD : The Haggler, Acquire 30 emeralds. + { + Stat *emeraldMined, *emeraldBought; + emeraldMined = GenericStats::blocksMined(Tile::emeraldOre_Id); + emeraldBought = GenericStats::itemsBought(Item::emerald_Id); + + if ( stat == emeraldMined || stat == emeraldBought ) + { + int numEmeraldMined, numEmeraldBought, totalSum; + numEmeraldMined = pStats->getTotalValue(emeraldMined); + numEmeraldBought = pStats->getTotalValue(emeraldBought); + totalSum = numEmeraldMined + numEmeraldBought; + + app.DebugPrintf( + "[AwardStat] Check unlock 'The Haggler': " + "emerald_mined=%i, emerald_bought=%i, sum=%i.\n", + numEmeraldMined, numEmeraldBought, totalSum + ); + + if (totalSum >= 30) awardStat( GenericStats::theHaggler(), GenericStats::param_theHaggler() ); + } + } + + // AWARD : Pot Planter, craft and place a flowerpot. + { + Stat *craftFlowerpot, *placeFlowerpot; + craftFlowerpot = GenericStats::itemsCrafted(Item::flowerPot_Id); + placeFlowerpot = GenericStats::blocksPlaced(Tile::flowerPot_Id); + + if ( stat == craftFlowerpot || stat == placeFlowerpot ) + { + if ( (pStats->getTotalValue(craftFlowerpot) > 0) && (pStats->getTotalValue(placeFlowerpot) > 0) ) + { + awardStat( GenericStats::potPlanter(), GenericStats::param_potPlanter() ); + } + } + } + + // AWARD : It's a Sign, craft and place a sign. + { + Stat *craftSign, *placeWallsign, *placeSignpost; + craftSign = GenericStats::itemsCrafted(Item::sign_Id); + placeWallsign = GenericStats::blocksPlaced(Tile::wallSign_Id); + placeSignpost = GenericStats::blocksPlaced(Tile::sign_Id); + + if ( stat == craftSign || stat == placeWallsign || stat == placeSignpost ) + { + int numCraftedSigns, numPlacedWallSign, numPlacedSignpost; + numCraftedSigns = pStats->getTotalValue(craftSign); + numPlacedWallSign = pStats->getTotalValue(placeWallsign); + numPlacedSignpost = pStats->getTotalValue(placeSignpost); + + app.DebugPrintf( + "[AwardStat] Check unlock 'It's a Sign': " + "crafted=%i, placedWallSigns=%i, placedSignposts=%i.\n", + numCraftedSigns, numPlacedWallSign, numPlacedSignpost + ); + + if ( (numCraftedSigns>0) && ((numPlacedWallSign+numPlacedSignpost)>0) ) + { + awardStat( GenericStats::itsASign(), GenericStats::param_itsASign()); + } + } + } + + // AWARD : Rainbow Collection, collect all different colours of wool. + { + bool justPickedupWool = false; + + for (int i=0; i<16; i++) + if ( stat == GenericStats::itemsCollected(Tile::wool_Id, i) ) + justPickedupWool = true; + + if (justPickedupWool) + { + unsigned int woolCount = 0; + + for (unsigned int i = 0; i < 16; i++) + { + if (pStats->getTotalValue(GenericStats::itemsCollected(Tile::wool_Id, i)) > 0) + woolCount++; + } + + if (woolCount >= 16) awardStat( GenericStats::rainbowCollection(), GenericStats::param_rainbowCollection() ); + } + } + + // AWARD : Adventuring Time, visit at least 17 biomes + { + bool justEnteredBiome = false; + + for (int i=0; i<23; i++) + if ( stat == GenericStats::enteredBiome(i) ) + justEnteredBiome = true; + + if (justEnteredBiome) + { + unsigned int biomeCount = 0; + + for (unsigned int i = 0; i < 23; i++) + { + if (pStats->getTotalValue(GenericStats::enteredBiome(i)) > 0) + biomeCount++; + } + + if (biomeCount >= 17) awardStat( GenericStats::adventuringTime(), GenericStats::param_adventuringTime() ); + } + } +#endif + } +#endif +} + +bool LocalPlayer::isSolidBlock(int x, int y, int z) +{ + return level->isSolidBlockingTile(x, y, 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); + + double xd = x - xTile; + double zd = z - zTile; + + if (isSolidBlock(xTile, yTile, zTile) || isSolidBlock(xTile, yTile + 1, zTile)) + { + bool west = !isSolidBlock(xTile - 1, yTile, zTile) && !isSolidBlock(xTile - 1, yTile + 1, zTile); + bool east = !isSolidBlock(xTile + 1, yTile, zTile) && !isSolidBlock(xTile + 1, yTile + 1, zTile); + bool north = !isSolidBlock(xTile, yTile, zTile - 1) && !isSolidBlock(xTile, yTile + 1, zTile - 1); + bool south = !isSolidBlock(xTile, yTile, zTile + 1) && !isSolidBlock(xTile, yTile + 1, zTile + 1); + + int dir = -1; + double closest = 9999; + if (west && xd < closest) + { + closest = xd; + dir = 0; + } + if (east && 1 - xd < closest) + { + closest = 1 - xd; + dir = 1; + } + if (north && zd < closest) + { + closest = zd; + dir = 4; + } + if (south && 1 - zd < closest) + { + closest = 1 - zd; + dir = 5; + } + + float speed = 0.1f; + if (dir == 0) this->xd = -speed; + if (dir == 1) this->xd = +speed; + if (dir == 4) this->zd = -speed; + if (dir == 5) this->zd = +speed; + } + + return false; + +} + +void LocalPlayer::setSprinting(bool value) +{ + Player::setSprinting(value); + if (value == false) sprintTime = 0; + else sprintTime = SPRINT_DURATION; +} + +void LocalPlayer::setExperienceValues(float experienceProgress, int totalExp, int 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) +{ + return level->getLevelData()->getAllowCommands(); +} + +void LocalPlayer::onCrafted(shared_ptr item) +{ + if( minecraft->localgameModes[m_iPad] != NULL ) + { + TutorialMode *gameMode = (TutorialMode *)minecraft->localgameModes[m_iPad]; + gameMode->getTutorial()->onCrafted(item); + } +} + +void LocalPlayer::setAndBroadcastCustomSkin(DWORD skinId) +{ + setCustomSkin(skinId); +} + +void LocalPlayer::setAndBroadcastCustomCape(DWORD capeId) +{ + setCustomCape(capeId); +} + +// 4J TODO - Remove +#include "..\Minecraft.World\LevelChunk.h" +void LocalPlayer::mapPlayerChunk(const unsigned int flagTileType) +{ + int cx = this->xChunk; + int cz = this->zChunk; + + int pZ = ((int) floor(this->z)) %16; + int pX = ((int) floor(this->x)) %16; + + cout<<"player in chunk ("<x<<","<y<<","<z<<")\n"; + + for (int v = -1; v < 2; v++) + for (unsigned int z = 0; z < 16; z++) + { + for (int u = -1; u < 2; u++) + for (unsigned int x = 0; x < 16; x++) + { + LevelChunk *cc = level->getChunk(cx+u, cz+v); + if ( x==pX && z==pZ && u==0 && v==0) + cout << "O"; + else for (unsigned int y = 127; y > 0; y--) + { + int t = cc->getTile(x,y,z); + if (flagTileType != 0 && t == flagTileType) { cout << "@"; break; } + else if (t != 0 && t < 10) { cout << t; break; } + else if (t > 0) { cout << "#"; break; } + } + } + cout << "\n"; + } + + cout << "\n"; +} + + +void LocalPlayer::handleMouseDown(int button, bool down) +{ + // 4J Stu - We should not accept any input while asleep, except the above to wake up + if(isSleeping() && level != NULL && level->isClientSide) + { + return; + } + if (!down) missTime = 0; + if (button == 0 && missTime > 0) return; + + 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; + + // 4J - addition to stop layer mining out of the top or bottom of the world + // 4J Stu - Allow this for The End + if( ( ( y == 0 ) || ( ( y == 127 ) && level->dimension->hasCeiling ) ) && level->dimension->id != 1 ) return; + + minecraft->gameMode->continueDestroyBlock(x, y, z, minecraft->hitResult->f); + + if(mayDestroyBlockAt(x,y,z)) + { + minecraft->particleEngine->crack(x, y, z, minecraft->hitResult->f); + swing(); + } + } + else + { + minecraft->gameMode->stopDestroyBlock(); + } +} + +bool LocalPlayer::creativeModeHandleMouseClick(int button, bool buttonPressed) +{ + if( buttonPressed ) + { + if( lastClickState == lastClick_oldRepeat ) + { + return false; + } + + // Are we in an auto-repeat situation? - If so only tell the game that we've clicked if we move more than a unit away from our last + // click position in any axis + if( lastClickState != lastClick_invalid ) + { + // If we're in disabled mode already (set when sprinting) then don't do anything - if we're sprinting, we don't auto-repeat at all. + // With auto repeat on, we can quickly place fires causing photosensitivity issues due to rapid flashing + if( lastClickState == lastClick_disabled ) return false; + // If we've started sprinting, go into this mode & also don't do anything + // Ignore repeate when sleeping + if( isSprinting() ) + { + lastClickState = lastClick_disabled; + return false; + } + + // Get distance from last click point in each axis + float dX = (float)x - lastClickX; + float dY = (float)y - lastClickY; + float dZ = (float)z - lastClickZ; + bool newClick = false; + + float ddx = dX - lastClickdX; + float ddy = dY - lastClickdY; + float ddz = dZ - lastClickdZ; + + if( lastClickState == lastClick_moving ) + { + float deltaChange = sqrtf(ddx * ddx + ddy * ddy + ddz * ddz ); + if( deltaChange < 0.01f ) + { + lastClickState = lastClick_stopped; + lastClickTolerance = 0.0f; + } + } + else if( lastClickState == lastClick_stopped ) + { + float deltaChange = sqrtf(ddx * ddx + ddy * ddy + ddz * ddz ); + if( deltaChange >= 0.01f ) + { + lastClickState = lastClick_moving; + lastClickTolerance = 0.0f; + } + else + { + lastClickTolerance += 0.1f; + if( lastClickTolerance > 0.7f ) + { + lastClickTolerance = 0.0f; + lastClickState = lastClick_init; + } + } + } + + lastClickdX = dX; + lastClickdY = dY; + lastClickdZ = dZ; + + // If we have moved more than one unit in any one axis, then register a new click + // The new click position is normalised at one unit in the direction of movement, so that we don't gradually drift away if we detect the movement a fraction over + // the unit distance each time + + if( fabsf(dX) >= 1.0f ) + { + dX= ( dX < 0.0f ) ? ceilf(dX) : floorf(dX); + newClick = true; + } + else if( fabsf(dY) >= 1.0f ) + { + dY= ( dY < 0.0f ) ? ceilf(dY) : floorf(dY); + newClick = true; + } + else if( fabsf(dZ) >= 1.0f ) + { + dZ= ( dZ < 0.0f ) ? ceilf(dZ) : floorf(dZ); + newClick = true; + } + + if( ( !newClick ) && ( lastClickTolerance > 0.0f ) ) + { + float fTarget = 1.0f - lastClickTolerance; + + if( fabsf(dX) >= fTarget ) newClick = true; + if( fabsf(dY) >= fTarget ) newClick = true; + if( fabsf(dZ) >= fTarget ) newClick = true; + } + + if( newClick ) + { + lastClickX += dX; + lastClickY += dY; + lastClickZ += dZ; + + // Get a more accurate pick from the position where the new click should ideally have come from, rather than + // where we happen to be now (ie a rounded number of units from the last Click position) + double oldX = x; + double oldY = y; + double oldZ = z; + x = lastClickX; + y = lastClickY; + z = lastClickZ; + + minecraft->gameRenderer->pick(1); + + x = oldX; + y = oldY; + z = oldZ; + + handleMouseClick(button); + + if( lastClickState == lastClick_stopped ) + { + lastClickState = lastClick_init; + lastClickTolerance = 0.0f; + } + else + { + lastClickState = lastClick_moving; + lastClickTolerance = 0.0f; + } + } + } + else + { + // First click - just record position & handle + lastClickX = (float)x; + lastClickY = (float)y; + lastClickZ = (float)z; + // If we actually placed an item, then move into the init state as we are going to be doing the special creative mode auto repeat + bool itemPlaced = handleMouseClick(button); + // If we're sprinting or riding, don't auto-repeat at all. With auto repeat on, we can quickly place fires causing photosensitivity issues due to rapid flashing + // Also ignore repeats when the player is sleeping + if( isSprinting() || isRiding() || isSleeping() ) + { + lastClickState = lastClick_disabled; + } + else + { + if( itemPlaced ) + { + lastClickState = lastClick_init; + lastClickTolerance = 0.0f; + } + else + { + // Didn't place an item - might actually be activating a switch or door or something - just do a standard auto repeat in this case + lastClickState = lastClick_oldRepeat; + } + } + return true; + } + } + else + { + lastClickState = lastClick_invalid; + } + return false; + +} + +bool LocalPlayer::handleMouseClick(int button) +{ + bool returnItemPlaced = false; + + if (button == 0 && missTime > 0) return false; + if (button == 0) + { + //app.DebugPrintf("handleMouseClick - Player %d is swinging\n",GetXboxPad()); + swing(); + } + + bool mayUse = true; + + // 4J-PB - Adding a special case in here for sleeping in a bed in a multiplayer game - we need to wake up, and we don't have the inbedchatscreen with a button + + if(button==1 && (isSleeping() && level != NULL && level->isClientSide)) + { + if(lastClickState == lastClick_oldRepeat) return false; + + + shared_ptr mplp = dynamic_pointer_cast( shared_from_this() ); + + if(mplp && mplp->connection) mplp->StopSleeping(); + + } + // 4J Stu - We should not accept any input while asleep, except the above to wake up + if(isSleeping() && level != NULL && level->isClientSide) + { + return false; + } + + shared_ptr oldItem = inventory->getSelected(); + + if (minecraft->hitResult == NULL) + { + if (button == 0 && minecraft->localgameModes[GetXboxPad()]->hasMissTime()) missTime = 10; + } + else if (minecraft->hitResult->type == HitResult::ENTITY) + { + if (button == 0) + { + minecraft->gameMode->attack(minecraft->localplayers[GetXboxPad()], minecraft->hitResult->entity); + } + if (button == 1) + { + // 4J-PB - if we milk a cow here, and end up with a bucket of milk, the if (mayUse && button == 1) further down will + // then empty our bucket if we're pointing at a tile + // It looks like interact really should be returning a result so we can check this, but it's possibly just the + // milk bucket that causes a problem + + if(minecraft->hitResult->entity->GetType()==eTYPE_COW) + { + // If I have an empty bucket in my hand, it's going to be filled with milk, so turn off mayUse + shared_ptr item = inventory->getSelected(); + if(item && (item->id==Item::bucket_empty_Id)) + { + mayUse=false; + } + } + if( minecraft->gameMode->interact(minecraft->localplayers[GetXboxPad()], minecraft->hitResult->entity) ) + { + mayUse = false; + } + } + } + else if (minecraft->hitResult->type == HitResult::TILE) + { + int x = minecraft->hitResult->x; + int y = minecraft->hitResult->y; + int z = minecraft->hitResult->z; + int face = minecraft->hitResult->f; + + if (button == 0) + { + // 4J - addition to stop layer mining out of the top or bottom of the world + // 4J Stu - Allow this for The End + if( !( ( y == 0 ) || ( ( y == 127 ) && level->dimension->hasCeiling ) ) || level->dimension->id == 1 ) + { + minecraft->gameMode->startDestroyBlock(x, y, z, minecraft->hitResult->f); + } + } + else + { + shared_ptr item = oldItem; + int oldCount = item != NULL ? item->count : 0; + bool usedItem = false; + if (minecraft->gameMode->useItemOn(minecraft->localplayers[GetXboxPad()], level, item, x, y, z, face, minecraft->hitResult->pos, false, &usedItem)) + { + // Presume that if we actually used the held item, then we've placed it + if( usedItem ) + { + returnItemPlaced = true; + } + mayUse = false; + //app.DebugPrintf("Player %d is swinging\n",GetXboxPad()); + swing(); + } + if (item == NULL) + { + return false; + } + + if (item->count == 0) + { + inventory->items[inventory->selected] = nullptr; + } + else if (item->count != oldCount || minecraft->localgameModes[GetXboxPad()]->hasInfiniteItems()) + { + minecraft->gameRenderer->itemInHandRenderer->itemPlaced(); + } + } + } + + if (mayUse && button == 1) + { + shared_ptr item = inventory->getSelected(); + if (item != NULL) + { + if (minecraft->gameMode->useItem(minecraft->localplayers[GetXboxPad()], level, item)) + { + minecraft->gameRenderer->itemInHandRenderer->itemUsed(); + } + } + } + return returnItemPlaced; +} + +void LocalPlayer::updateRichPresence() +{ + if((m_iPad!=-1)/* && !ui.GetMenuDisplayed(m_iPad)*/ ) + { + shared_ptr selectedItem = inventory->getSelected(); + if(selectedItem != NULL && selectedItem->id == Item::fishingRod_Id) + { + app.SetRichPresenceContext(m_iPad,CONTEXT_GAME_STATE_FISHING); + } + else if(selectedItem != NULL && selectedItem->id == Item::map_Id) + { + app.SetRichPresenceContext(m_iPad,CONTEXT_GAME_STATE_MAP); + } + else if ( (riding != NULL) && riding->instanceof(eTYPE_MINECART) ) + { + app.SetRichPresenceContext(m_iPad,CONTEXT_GAME_STATE_RIDING_MINECART); + } + else if ( (riding != NULL) && riding->instanceof(eTYPE_BOAT) ) + { + app.SetRichPresenceContext(m_iPad,CONTEXT_GAME_STATE_BOATING); + } + else if ( (riding != NULL) && riding->instanceof(eTYPE_PIG) ) + { + app.SetRichPresenceContext(m_iPad,CONTEXT_GAME_STATE_RIDING_PIG); + } + else if( this->dimension == -1 ) + { + app.SetRichPresenceContext(m_iPad,CONTEXT_GAME_STATE_NETHER); + } + else if( minecraft->soundEngine->GetIsPlayingStreamingCDMusic() ) + { + app.SetRichPresenceContext(m_iPad,CONTEXT_GAME_STATE_CD); + } + else + { + app.SetRichPresenceContext(m_iPad,CONTEXT_GAME_STATE_BLANK); + } + } +} + +// 4J Stu - Added for telemetry +void LocalPlayer::SetSessionTimerStart(void) +{ + m_sessionTimeStart=app.getAppTime(); + m_dimensionTimeStart=m_sessionTimeStart; +} + +float LocalPlayer::getSessionTimer(void) +{ + return app.getAppTime()-m_sessionTimeStart; +} + +float LocalPlayer::getAndResetChangeDimensionTimer() +{ + float appTime = app.getAppTime(); + float returnVal = appTime - m_dimensionTimeStart; + m_dimensionTimeStart = appTime; + return returnVal; +} + +void LocalPlayer::handleCollectItem(shared_ptr item) +{ + if(item != NULL) + { + unsigned int itemCountAnyAux = 0; + unsigned int itemCountThisAux = 0; + for (unsigned int k = 0; k < inventory->items.length; ++k) + { + if (inventory->items[k] != NULL) + { + // do they have the item + if(inventory->items[k]->id == item->id) + { + unsigned int quantity = inventory->items[k]->GetCount(); + + itemCountAnyAux += quantity; + + if( inventory->items[k]->getAuxValue() == item->getAuxValue() ) + { + itemCountThisAux += quantity; + } + } + } + } + TutorialMode *gameMode = (TutorialMode *)minecraft->localgameModes[m_iPad]; + gameMode->getTutorial()->onTake(item, itemCountAnyAux, itemCountThisAux); + } + + if(ui.IsContainerMenuDisplayed(m_iPad)) + { + ui.HandleInventoryUpdated(m_iPad); + } +} + +void LocalPlayer::SetPlayerAdditionalModelParts(vectorpAdditionalModelParts) +{ + m_pAdditionalModelParts=pAdditionalModelParts; +} + diff --git a/Minecraft.Client/LocalPlayer.h b/Minecraft.Client/LocalPlayer.h new file mode 100644 index 00000000..0a5b14b2 --- /dev/null +++ b/Minecraft.Client/LocalPlayer.h @@ -0,0 +1,219 @@ +#pragma once +#include "..\Minecraft.World\SmoothFloat.h" +#include "..\Minecraft.World\net.minecraft.world.entity.player.h" +#include "..\Minecraft.World\Pos.h" +class Level; +class User; +class CompoundTag; +class FurnaceTileEntity; +class DispenserTileEntity; +class SignTileEntity; +class Container; +class Input; +class Stat; +class Minecraft; + +using namespace std; + +// Time in seconds before the players presence is update to Idle +#define PLAYER_IDLE_TIME 300 + +class LocalPlayer : public Player +{ +public: + static const int SPRINT_DURATION = 20 * 30; + + eINSTANCEOF GetType() { return eTYPE_LOCALPLAYER; } + + Input *input; +protected: + Minecraft *minecraft; + int sprintTriggerTime; + bool sprintTriggerRegisteredReturn; // 4J added + bool twoJumpsRegistered; // 4J added + + unsigned int m_uiInactiveTicks; // To measure time for idle anims + + unsigned long long m_awardedThisSession; + + // 4J - Last time we checked for achievement uunlocks. + //long long m_lastAchievementUpdate; + +public: + int sprintTime; + + float yBob, xBob; + float yBobO, xBobO; + + float portalTime; + float oPortalTime; + + LocalPlayer(Minecraft *minecraft, Level *level, User *user, int dimension); + virtual ~LocalPlayer(); + + 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 + + __uint64 ullDpad_last; + __uint64 ullDpad_this; + __uint64 ullDpad_filtered; + + // 4J-PB - moved these in from the minecraft structure, since they are per player things for splitscreen + //int ticks; + int missTime; + int lastClickTick[2]; + bool isRaining ; + int m_iThirdPersonView; + + bool m_bHasAwardedStayinFrosty; + +private: + float flyX, flyY, flyZ; + + int jumpRidingTicks; + float jumpRidingScale; + +protected: + // 4J-PB - player's xbox pad + int m_iPad; + + bool m_bIsIdle; + +private: + // local player fly + // -------------------------------------------------------------------------- + // smooth camera settings + + SmoothFloat smoothFlyX; + SmoothFloat smoothFlyY; + SmoothFloat smoothFlyZ; + + void calculateFlight(float xa, float ya, float za); + +public: + virtual void serverAiStep(); + +protected: + bool isEffectiveAi(); + +public: + 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 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 openBrewingStand(shared_ptr brewingStand); // 4J added bool return + 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 bool isSneaking(); + //virtual bool isIdle(); + 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;} + + void ResetInactiveTicks() { m_uiInactiveTicks=0;} + unsigned int GetInactiveTicks() { return m_uiInactiveTicks;} + void IncrementInactiveTicks() { if(m_uiInactiveTicks<255) m_uiInactiveTicks++;} + + void mapPlayerChunk(unsigned int); + // 4J-PB - xbox pad for this player + void SetXboxPad(int iPad) {m_iPad=iPad;} + int GetXboxPad() {return m_iPad;} + void SetPlayerRespawned(bool bVal) {m_bPlayerRespawned=bVal;} + bool GetPlayerRespawned() {return m_bPlayerRespawned;} + + // 4J-PB - Moved these in here from the minecraft structure since they are local player related + void handleMouseDown(int button, bool down); + bool handleMouseClick(int button); + + // 4J - added for improved autorepeat + bool creativeModeHandleMouseClick(int button, bool buttonPressed); + float lastClickX; + float lastClickY; + float lastClickZ; + float lastClickdX; + float lastClickdY; + float lastClickdZ; + enum eLastClickState + { + lastClick_invalid, + lastClick_init, + lastClick_moving, + lastClick_stopped, + lastClick_oldRepeat, + lastClick_disabled + }; + float lastClickTolerance; + int lastClickState; + + // 4J Stu - Added to allow callback to tutorial to stay within Minecraft.Client + virtual void onCrafted(shared_ptr item); + + virtual void setAndBroadcastCustomSkin(DWORD skinId); + virtual void setAndBroadcastCustomCape(DWORD capeId); + +private: + bool isSolidBlock(int x, int y, int z); + bool m_bPlayerRespawned; + +protected: + bool checkInTile(double x, double y, double z); + +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(); + + // 4J Stu - Added for telemetry + float m_sessionTimeStart; + float m_dimensionTimeStart; + + void SetSessionTimerStart(void); + float getSessionTimer(void); + + float getAndResetChangeDimensionTimer(); + + virtual void handleCollectItem(shared_ptr item); + void SetPlayerAdditionalModelParts(vectorpAdditionalModelParts); + +private: + vector m_pAdditionalModelParts; +}; + + diff --git a/Minecraft.Client/MemTexture.cpp b/Minecraft.Client/MemTexture.cpp new file mode 100644 index 00000000..f587e82f --- /dev/null +++ b/Minecraft.Client/MemTexture.cpp @@ -0,0 +1,33 @@ +#include "stdafx.h" +#include "MemTexture.h" + +MemTexture::MemTexture(const wstring& _url, PBYTE pbData,DWORD dwBytes, MemTextureProcessor *processor) +{ + // 4J - added + count = 1; + id = -1; + isLoaded = false; + ticksSinceLastUse = 0; + + // 4J - TODO - actually implement + + // load the texture, and process it + //loadedImage=Textures::getTexture() + // 4J - remember to add deletes in here for any created BufferedImages when implemented + loadedImage = new BufferedImage(pbData,dwBytes); + if(processor==NULL) + { + + } + else + { + //loadedImage=processor.process(ImageIO.read(huc.getInputStream())); + } + + +} + +MemTexture::~MemTexture() +{ + delete loadedImage; +} \ No newline at end of file diff --git a/Minecraft.Client/MemTexture.h b/Minecraft.Client/MemTexture.h new file mode 100644 index 00000000..d11d68b1 --- /dev/null +++ b/Minecraft.Client/MemTexture.h @@ -0,0 +1,17 @@ +#pragma once +class BufferedImage; +class MemTextureProcessor; +using namespace std; + +class MemTexture { +public: + BufferedImage *loadedImage; + int count; + int id; + bool isLoaded; + int ticksSinceLastUse; + static const int UNUSED_TICKS_TO_FREE = 20; + + MemTexture(const wstring& _name, PBYTE pbData, DWORD dwBytes, MemTextureProcessor *processor); + ~MemTexture(); +}; \ No newline at end of file diff --git a/Minecraft.Client/MemTextureProcessor.h b/Minecraft.Client/MemTextureProcessor.h new file mode 100644 index 00000000..8e945e1d --- /dev/null +++ b/Minecraft.Client/MemTextureProcessor.h @@ -0,0 +1,8 @@ +#pragma once +class BufferedImage; + +class MemTextureProcessor +{ +public: + virtual BufferedImage *process(BufferedImage *read) = 0; +}; \ No newline at end of file diff --git a/Minecraft.Client/MemoryTracker.cpp b/Minecraft.Client/MemoryTracker.cpp new file mode 100644 index 00000000..c1652d3b --- /dev/null +++ b/Minecraft.Client/MemoryTracker.cpp @@ -0,0 +1,70 @@ +#include "stdafx.h" +#include "MemoryTracker.h" +#include "..\Minecraft.World\IntBuffer.h" +#include "..\Minecraft.World\ByteBuffer.h" +#include "..\Minecraft.World\FloatBuffer.h" + +unordered_map MemoryTracker::GL_LIST_IDS; +vector MemoryTracker::TEXTURE_IDS; + +int MemoryTracker::genLists(int count) +{ + int id = glGenLists(count); + GL_LIST_IDS.insert( pair(id,count) ); + return id; +} + +int MemoryTracker::genTextures() +{ + int id = glGenTextures(); + TEXTURE_IDS.push_back(id); + return id; +} + +void MemoryTracker::releaseLists(int id) +{ + AUTO_VAR(it, GL_LIST_IDS.find(id)); + if( it != GL_LIST_IDS.end() ) + { + glDeleteLists(id, it->second); + GL_LIST_IDS.erase(it); + } +} + +void MemoryTracker::releaseTextures() +{ + for (int i = 0; i < TEXTURE_IDS.size(); i++) + { + glDeleteTextures(TEXTURE_IDS.at(i)); + } + TEXTURE_IDS.clear(); +} + +void MemoryTracker::release() +{ + //for (Map.Entry entry : GL_LIST_IDS.entrySet()) + for(AUTO_VAR(it, GL_LIST_IDS.begin()); it != GL_LIST_IDS.end(); ++it) + { + glDeleteLists(it->first, it->second); + } + GL_LIST_IDS.clear(); + + releaseTextures(); +} + +ByteBuffer *MemoryTracker::createByteBuffer(int size) +{ + // 4J - was ByteBuffer.allocateDirect(size).order(ByteOrder.nativeOrder()) + ByteBuffer *bb = ByteBuffer::allocate(size); + return bb; +} + +IntBuffer *MemoryTracker::createIntBuffer(int size) +{ + return createByteBuffer(size << 2)->asIntBuffer(); +} + +FloatBuffer *MemoryTracker::createFloatBuffer(int size) +{ + return createByteBuffer(size << 2)->asFloatBuffer(); +} \ No newline at end of file diff --git a/Minecraft.Client/MemoryTracker.h b/Minecraft.Client/MemoryTracker.h new file mode 100644 index 00000000..9567fac9 --- /dev/null +++ b/Minecraft.Client/MemoryTracker.h @@ -0,0 +1,28 @@ +#pragma once +#include "MemoryTracker.h" +class ByteBuffer; +class IntBuffer; +class FloatBuffer; +using namespace std; + +/** Original comment + * This class is used so we can release all memory (allocated on the graphics card on shutdown) + */ +// 4J - all member functions in here were synchronized +class MemoryTracker +{ +private: + static unordered_map GL_LIST_IDS; + static vector TEXTURE_IDS; + +public: + static int genLists(int count); + static int genTextures(); + static void releaseLists(int id); + static void releaseTextures(); + static void release(); + // 4J - note - have removed buffer types from here that we aren't using + static ByteBuffer *createByteBuffer(int size); + static IntBuffer *createIntBuffer(int size); + static FloatBuffer *createFloatBuffer(int size); +}; diff --git a/Minecraft.Client/MinecartModel.cpp b/Minecraft.Client/MinecartModel.cpp new file mode 100644 index 00000000..8a1ce0d7 --- /dev/null +++ b/Minecraft.Client/MinecartModel.cpp @@ -0,0 +1,57 @@ +#include "stdafx.h" +#include "MinecartModel.h" +#include "ModelPart.h" + +MinecartModel::MinecartModel() : Model() +{ + cubes[0] = new ModelPart(this, 0, 10); + cubes[1] = new ModelPart(this, 0, 0); + cubes[2] = new ModelPart(this, 0, 0); + cubes[3] = new ModelPart(this, 0, 0); + cubes[4] = new ModelPart(this, 0, 0); + cubes[5] = new ModelPart(this, 44, 10); + + int w = 20; + int d = 8; + int h = 16; + int yOff = 4; + + cubes[0]->addBox((float)(-w / 2), (float)(-h / 2), -1, w, h, 2, 0); + cubes[0]->setPos(0, (float)(0 + yOff), 0); + + cubes[5]->addBox((float)(-w / 2 + 1), (float)(-h / 2 + 1), -1, w - 2, h - 2, 1, 0); + cubes[5]->setPos(0, (float)(0 + yOff), 0); + + cubes[1]->addBox((float)(-w / 2 + 2), (float)(-d - 1), -1, w - 4, d, 2, 0); + cubes[1]->setPos((float)(-w / 2 + 1), (float)(0 + yOff), 0); + + cubes[2]->addBox((float)(-w / 2 + 2), (float)(-d - 1), -1, w - 4, d, 2, 0); + cubes[2]->setPos((float)(+w / 2 - 1), (float)(0 + yOff), 0); + + cubes[3]->addBox((float)(-w / 2 + 2), (float)(-d - 1), -1, w - 4, d, 2, 0); + cubes[3]->setPos(0, (float)(0 + yOff), (float)(-h / 2 + 1)); + + cubes[4]->addBox((float)(-w / 2 + 2), (float)(-d - 1), -1, w - 4, d, 2, 0); + cubes[4]->setPos(0, (float)(0 + yOff), (float)(+h / 2 - 1)); + + cubes[0]->xRot = PI / 2; + cubes[1]->yRot = PI / 2 * 3; + cubes[2]->yRot = PI / 2 * 1; + cubes[3]->yRot = PI / 2 * 2; + cubes[5]->xRot = -PI / 2; + + // 4J added - compile now to avoid random performance hit first time cubes are rendered + for (int i = 0; i < MINECART_LENGTH; i++) + { + cubes[i]->compile(1.0f/16.0f); + } +} + +void MinecartModel::render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) +{ + cubes[5]->y = 4 - bob; + for (int i = 0; i < MINECART_LENGTH; i++) + { + cubes[i]->render(scale, usecompiled); + } +} diff --git a/Minecraft.Client/MinecartModel.h b/Minecraft.Client/MinecartModel.h new file mode 100644 index 00000000..de925566 --- /dev/null +++ b/Minecraft.Client/MinecartModel.h @@ -0,0 +1,13 @@ +#pragma once +#include "Model.h" + +class MinecartModel : public Model +{ +public: + static const int MINECART_LENGTH=6; + + ModelPart *cubes[MINECART_LENGTH]; + + MinecartModel(); + virtual void render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); +}; diff --git a/Minecraft.Client/MinecartRenderer.cpp b/Minecraft.Client/MinecartRenderer.cpp new file mode 100644 index 00000000..fd907019 --- /dev/null +++ b/Minecraft.Client/MinecartRenderer.cpp @@ -0,0 +1,151 @@ +#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(); + renderer = new TileRenderer(); +} + +void MinecartRenderer::render(shared_ptr _cart, double x, double y, double z, float rot, float a) +{ + // 4J - dynamic cast required because we aren't using templates/generics in our version + shared_ptr cart = dynamic_pointer_cast(_cart); + + glPushMatrix(); + + bindTexture(cart); + + __int64 seed = cart->entityId * 493286711l; + seed = seed * seed * 4392167121l + seed * 98761; + + float xo = ((((seed >> 16) & 0x7) + 0.5f) / 8.0f - 0.5f) * 0.004f; + float yo = ((((seed >> 20) & 0x7) + 0.5f) / 8.0f - 0.5f) * 0.004f; + float zo = ((((seed >> 24) & 0x7) + 0.5f) / 8.0f - 0.5f) * 0.004f; + + 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 r = 0.3f; + + Vec3 *p = cart->getPos(xx, yy, zz); + + float xRot = cart->xRotO + (cart->xRot - cart->xRotO) * a; + + 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; + + 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) + { + } + else + { + dir = dir->normalize(); + rot = (float) (atan2(dir->z, dir->x) * 180 / PI); + xRot = (float) (atan(dir->y) * 73); + } + } + glTranslatef((float) x, (float) y, (float) z); + + glRotatef(180 - rot, 0, 1, 0); + glRotatef(-xRot, 0, 0, 1); + float hurt = cart->getHurtTime() - a; + float dmg = cart->getDamage() - a; + if (dmg < 0) dmg = 0; + if (hurt > 0) + { + glRotatef(Mth::sin(hurt) * hurt * dmg / 10 * cart->getHurtDir(), 1, 0, 0); + } + + int yOffset = cart->getDisplayOffset(); + Tile *tile = cart->getDisplayTile(); + int tileData = cart->getDisplayData(); + + if (tile != NULL) + { + glPushMatrix(); + + 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); + } + + 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 new file mode 100644 index 00000000..f35092a1 --- /dev/null +++ b/Minecraft.Client/MinecartRenderer.h @@ -0,0 +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(); + 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 new file mode 100644 index 00000000..b37fd00d --- /dev/null +++ b/Minecraft.Client/Minecraft.Client.vcxproj @@ -0,0 +1,43069 @@ + + + + + ContentPackage_NO_TU + Durango + + + ContentPackage_NO_TU + ORBIS + + + ContentPackage_NO_TU + PS3 + + + ContentPackage_NO_TU + PSVita + + + ContentPackage_NO_TU + Win32 + + + ContentPackage_NO_TU + x64 + + + ContentPackage_NO_TU + Xbox 360 + + + CONTENTPACKAGE_SYMBOLS + Durango + + + CONTENTPACKAGE_SYMBOLS + ORBIS + + + CONTENTPACKAGE_SYMBOLS + PS3 + + + CONTENTPACKAGE_SYMBOLS + PSVita + + + CONTENTPACKAGE_SYMBOLS + Win32 + + + CONTENTPACKAGE_SYMBOLS + x64 + + + CONTENTPACKAGE_SYMBOLS + Xbox 360 + + + ContentPackage_Vita + Durango + + + ContentPackage_Vita + ORBIS + + + ContentPackage_Vita + PS3 + + + ContentPackage_Vita + PSVita + + + ContentPackage_Vita + Win32 + + + ContentPackage_Vita + x64 + + + ContentPackage_Vita + Xbox 360 + + + ContentPackage + Durango + + + ContentPackage + ORBIS + + + ContentPackage + PS3 + + + ContentPackage + PSVita + + + ContentPackage + Win32 + + + ContentPackage + x64 + + + ContentPackage + Xbox 360 + + + Debug + Durango + + + Debug + ORBIS + + + Debug + PS3 + + + Debug + PSVita + + + Debug + Win32 + + + Debug + x64 + + + Debug + Xbox 360 + + + ReleaseForArt + Durango + + + ReleaseForArt + ORBIS + + + ReleaseForArt + PS3 + + + ReleaseForArt + PSVita + + + ReleaseForArt + Win32 + + + ReleaseForArt + x64 + + + ReleaseForArt + Xbox 360 + + + Release + Durango + + + Release + ORBIS + + + Release + PS3 + + + Release + PSVita + + + Release + Win32 + + + Release + x64 + + + Release + Xbox 360 + + + + en-US + {1B9A8C38-DD48-448C-AA24-E1A35E0089A3} + SAK + SAK + SAK + SAK + Xbox360Proj + title + + + + Application + MultiByte + + + Application + MultiByte + + + Application + MultiByte + + + Application + MultiByte + WithExceptsWithRtti + SNC + + + Application + MultiByte + WithExceptsWithRtti + SNC + + + Application + MultiByte + WithExceptsWithRtti + NoTocRestore2 + + + Application + MultiByte + WithExceptsWithRtti + NoTocRestore2 + + + Application + MultiByte + WithExceptsWithRtti + NoTocRestore2 + + + Application + MultiByte + WithExceptsWithRtti + NoTocRestore2 + + + Application + MultiByte + v110 + + + Application + MultiByte + v110 + + + Application + Unicode + v110 + false + + + Application + MultiByte + v110 + + + Application + MultiByte + v110 + + + Application + MultiByte + v110 + + + Application + MultiByte + v110 + + + Application + Unicode + v110 + true + + + Application + Unicode + v110 + true + + + Application + MultiByte + true + + + Application + MultiByte + true + + + Application + MultiByte + true + + + Application + MultiByte + true + + + Application + MultiByte + true + WithExceptsWithRtti + NoTocRestore2 + + + Application + MultiByte + WithExceptsWithRtti + NoTocRestore2 + + + Application + MultiByte + true + WithExceptsWithRtti + NoTocRestore2 + + + Application + MultiByte + true + WithExceptsWithRtti + NoTocRestore2 + + + Application + MultiByte + true + WithExceptsWithRtti + + + Application + MultiByte + true + WithExceptsWithRtti + + + Application + MultiByte + true + + + Application + MultiByte + true + + + Application + MultiByte + true + v110 + + + Application + MultiByte + true + v110 + + + Application + MultiByte + true + v110 + + + Application + MultiByte + true + v110 + + + Application + MultiByte + true + v110 + + + Application + MultiByte + true + v110 + + + Application + MultiByte + true + v110 + + + Application + MultiByte + true + v110 + + + Application + Unicode + true + v110 + + + Application + MultiByte + true + v110 + + + Application + MultiByte + true + v110 + + + Application + MultiByte + true + v110 + + + Application + MultiByte + true + v110 + + + Clang + + + Clang + + + Clang + + + Clang + + + Clang + + + Clang + + + Clang + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + $(OutDir)$(ProjectName)_D.xex + $(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) + + + false + $(OutDir)$(ProjectName).xex + $(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) + + + false + $(OutDir)$(ProjectName).xex + $(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) + + + true + $(OutDir)$(ProjectName)_D.xex + $(ProjectDir)\..\Minecraft.Client\PS3\Assert;$(SCE_PS3_ROOT)\target\ppu\include;$(SCE_PS3_ROOT)\target\common\include;$(SCE_PS3_ROOT)\host-win32\sn\ppu\include;$(ProjectDir)\..\Minecraft.Client\PS3\PS3Extras;$(ProjectDir)\..\Minecraft.Client\PS3\PS3Extras\boost_1_53_0\boost\tr1\tr1;$(ProjectDir)\..\Minecraft.Client\PS3\PS3Extras\boost_1_53_0;$(ProjectDir)..\Minecraft.World\x64headers + false + + + true + $(OutDir)$(ProjectName)_D.xex + $(SCE_PSP2_SDK_DIR)/target\src\npToolkit\include;$(ProjectDir)\..\Minecraft.Client\PSVita\Assert;$(ProjectDir);$(ProjectDir)..\Minecraft.World\x64headers;$(ProjectDir)\..\Minecraft.Client\PSVita\PSVitaExtras + false + + + true + $(OutDir)$(ProjectName)_D.xex + $(ProjectDir)\..\Minecraft.Client\PS3\Assert;$(SCE_PS3_ROOT)\target\ppu\include;$(SCE_PS3_ROOT)\target\common\include;$(SCE_PS3_ROOT)\host-win32\sn\ppu\include;$(ProjectDir)\..\Minecraft.Client\PS3\PS3Extras;$(ProjectDir)\..\Minecraft.Client\PS3\PS3Extras\boost_1_53_0\boost\tr1\tr1;$(ProjectDir)\..\Minecraft.Client\PS3\PS3Extras\boost_1_53_0;$(ProjectDir)..\Minecraft.World\x64headers + + + true + $(OutDir)$(ProjectName)_D.xex + $(ProjectDir)\..\Minecraft.Client\PS3\Assert;$(SCE_PS3_ROOT)\target\ppu\include;$(SCE_PS3_ROOT)\target\common\include;$(SCE_PS3_ROOT)\host-win32\sn\ppu\include;$(ProjectDir)\..\Minecraft.Client\PS3\PS3Extras;$(ProjectDir)\..\Minecraft.Client\PS3\PS3Extras\boost_1_53_0\boost\tr1\tr1;$(ProjectDir)\..\Minecraft.Client\PS3\PS3Extras\boost_1_53_0;$(ProjectDir)..\Minecraft.World\x64headers + + + true + $(OutDir)$(ProjectName)_D.xex + $(SCE_PSP2_SDK_DIR)/target\src\npToolkit\include;$(ProjectDir)..\Minecraft.Client\PSVita\Assert;$(ProjectDir);$(ProjectDir)..\Minecraft.World\x64headers;$(ProjectDir)\..\Minecraft.Client\PSVita\PSVitaExtras + + + 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 + + + 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)Durango\DurangoExtras;$(ProjectDir)\..\Minecraft.World\x64headers;$(ProjectDir)\Xbox\Sentient\Include;$(Console_SdkIncludeRoot) + $(Console_SdkRoot)bin;$(VCInstallDir)bin\x86_amd64;$(VCInstallDir)bin;$(WindowsSDK_ExecutablePath_x86);$(VSInstallDir)Common7\Tools\bin;$(VSInstallDir)Common7\tools;$(VSInstallDir)Common7\ide;$(ProgramFiles)\HTML Help Workshop;$(MSBuildToolsPath32);$(FxCopDir);$(PATH); + $(Console_SdkLibPath);$(Console_SdkWindowsMetadataPath) + $(Console_SdkLibPath) + $(Console_SdkLibPath);$(Console_SdkWindowsMetadataPath) + true + $(ProjectName) + $(Platform)_$(Configuration)\ + $(SolutionDir)$(Platform)_$(Configuration)\ + false + + + + + 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 + $(ProjectDir)\..\Minecraft.World\x64headers;$(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) + + + true + $(OutDir)$(ProjectName)_D.xex + $(ProjectDir)Durango\DurangoExtras;$(ProjectDir)\x64headers;$(ProjectDir)\..\Minecraft.World\x64headers;$(ProjectDir)\Xbox\Sentient\Include;$(Console_SdkIncludeRoot) + $(Console_SdkRoot)bin;$(VCInstallDir)bin\x86_amd64;$(VCInstallDir)bin;$(WindowsSDK_ExecutablePath_x86);$(VSInstallDir)Common7\Tools\bin;$(VSInstallDir)Common7\tools;$(VSInstallDir)Common7\ide;$(ProgramFiles)\HTML Help Workshop;$(MSBuildToolsPath32);$(FxCopDir);$(PATH); + $(Console_SdkLibPath);$(Console_SdkWindowsMetadataPath) + $(Console_SdkLibPath) + $(Console_SdkLibPath);$(Console_SdkWindowsMetadataPath) + $(ProjectName) + $(Platform)_$(Configuration)\ + $(SolutionDir)$(Platform)_$(Configuration)\ + + + true + $(OutDir)$(ProjectName)_D.xex + $(ProjectDir)Durango\DurangoExtras;$(ProjectDir)\x64headers;$(ProjectDir)\..\Minecraft.World\x64headers;$(ProjectDir)\Xbox\Sentient\Include;$(Console_SdkIncludeRoot) + $(Console_SdkRoot)bin;$(VCInstallDir)bin\x86_amd64;$(VCInstallDir)bin;$(WindowsSDK_ExecutablePath_x86);$(VSInstallDir)Common7\Tools\bin;$(VSInstallDir)Common7\tools;$(VSInstallDir)Common7\ide;$(ProgramFiles)\HTML Help Workshop;$(MSBuildToolsPath32);$(FxCopDir);$(PATH); + $(Console_SdkLibPath);$(Console_SdkWindowsMetadataPath) + $(Console_SdkLibPath) + $(Console_SdkLibPath);$(Console_SdkWindowsMetadataPath) + $(ProjectName) + $(Platform)_$(Configuration)\ + $(SolutionDir)$(Platform)_$(Configuration)\ + + + 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)\..\Minecraft.Client\PS3\Assert;$(SCE_PS3_ROOT)\target\ppu\include;$(SCE_PS3_ROOT)\target\common\include;$(SCE_PS3_ROOT)\host-win32\sn\ppu\include;$(ProjectDir)\..\Minecraft.Client\PS3\PS3Extras;$(ProjectDir)\..\Minecraft.Client\PS3\PS3Extras\boost_1_53_0\boost\tr1\tr1;$(ProjectDir)\..\Minecraft.Client\PS3\PS3Extras\boost_1_53_0;$(ProjectDir)..\Minecraft.World\x64headers + .elf + + + true + $(OutDir)$(ProjectName)_D.xex + $(SCE_PSP2_SDK_DIR)/target\src\npToolkit\include;$(ProjectDir)..\Minecraft.Client\PSVita\Assert;$(ProjectDir);$(ProjectDir)..\Minecraft.World\x64headers;$(ProjectDir)\..\Minecraft.Client\PSVita\PSVitaExtras + + + false + $(OutDir)default$(TargetExt) + $(OutDir)default.xex + $(ProjectDir)\..\Minecraft.Client\PS3\Assert;$(SCE_PS3_ROOT)\target\ppu\include;$(SCE_PS3_ROOT)\target\common\include;$(SCE_PS3_ROOT)\host-win32\sn\ppu\include;$(ProjectDir)\..\Minecraft.Client\PS3\PS3Extras;$(ProjectDir)\..\Minecraft.Client\PS3\PS3Extras\boost_1_53_0\boost\tr1\tr1;$(ProjectDir)\..\Minecraft.Client\PS3\PS3Extras\boost_1_53_0;$(ProjectDir)..\Minecraft.World\x64headers + .elf + + + false + $(OutDir)default$(TargetExt) + $(OutDir)default.xex + $(ProjectDir)..\Minecraft.World\x64headers;$(ProjectDir)\..\Minecraft.Client\PSVita\PSVitaExtras + .elf + + + false + $(OutDir)default$(TargetExt) + $(OutDir)default.xex + $(ProjectDir)\..\Minecraft.Client\PS3\Assert;$(SCE_PS3_ROOT)\target\ppu\include;$(SCE_PS3_ROOT)\target\common\include;$(SCE_PS3_ROOT)\host-win32\sn\ppu\include;$(ProjectDir)\..\Minecraft.Client\PS3\PS3Extras;$(ProjectDir)\..\Minecraft.Client\PS3\PS3Extras\boost_1_53_0\boost\tr1\tr1;$(ProjectDir)\..\Minecraft.Client\PS3\PS3Extras\boost_1_53_0;$(ProjectDir)..\Minecraft.World\x64headers + .self + + + false + $(OutDir)default$(TargetExt) + $(OutDir)default.xex + $(SCE_PSP2_SDK_DIR)/target\src\npToolkit\include;$(ProjectDir)\..\Minecraft.Client\PSVita\Assert;$(ProjectDir);$(ProjectDir)..\Minecraft.World\x64headers;$(ProjectDir)\..\Minecraft.Client\PSVita\PSVitaExtras + .self + + + false + $(OutDir)default$(TargetExt) + $(OutDir)default.xex + $(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) + + + false + $(OutDir)default$(TargetExt) + $(OutDir)default.xex + $(ProjectDir)..\Minecraft.World\x64headers;$(ProjectDir)\..\Minecraft.Client\PSVita\PSVitaExtras + + + false + $(OutDir)default$(TargetExt) + $(OutDir)default.xex + $(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) + + + false + $(OutDir)default$(TargetExt) + $(OutDir)default.xex + $(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) + + + false + $(OutDir)default$(TargetExt) + $(OutDir)default.xex + $(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) + + + false + $(OutDir)default$(TargetExt) + $(OutDir)default.xex + $(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) + + + false + $(OutDir)default$(TargetExt) + $(OutDir)default.xex + $(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) + + + false + $(OutDir)default$(TargetExt) + $(OutDir)default.xex + $(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) + + + false + $(OutDir)default$(TargetExt) + $(OutDir)default.xex + $(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) + + + false + $(OutDir)default$(TargetExt) + $(OutDir)default.xex + $(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) + + + false + $(OutDir)default$(TargetExt) + $(OutDir)default.xex + $(ProjectDir)Durango\DurangoExtras;$(ProjectDir)\x64headers;$(ProjectDir)\..\Minecraft.World\x64headers;$(ProjectDir)\Xbox\Sentient\Include;$(Console_SdkIncludeRoot) + $(Console_SdkRoot)bin;$(VCInstallDir)bin\x86_amd64;$(VCInstallDir)bin;$(WindowsSDK_ExecutablePath_x86);$(VSInstallDir)Common7\Tools\bin;$(VSInstallDir)Common7\tools;$(VSInstallDir)Common7\ide;$(ProgramFiles)\HTML Help Workshop;$(MSBuildToolsPath32);$(FxCopDir);$(PATH); + $(Console_SdkLibPath);$(Console_SdkWindowsMetadataPath) + $(Console_SdkLibPath) + $(Console_SdkLibPath);$(Console_SdkWindowsMetadataPath) + $(ProjectName) + $(SolutionDir)$(Platform)_$(Configuration)\ + $(Platform)_$(Configuration)\ + true + + + false + $(OutDir)default$(TargetExt) + $(OutDir)default.xex + $(ProjectDir)\..\Minecraft.World\x64headers;$(ProjectDir)\Xbox\Sentient\Include;$(Console_SdkIncludeRoot) + $(Console_SdkRoot)bin;$(VCInstallDir)bin\x86_amd64;$(VCInstallDir)bin;$(WindowsSDK_ExecutablePath_x86);$(VSInstallDir)Common7\Tools\bin;$(VSInstallDir)Common7\tools;$(VSInstallDir)Common7\ide;$(ProgramFiles)\HTML Help Workshop;$(MSBuildToolsPath32);$(FxCopDir);$(PATH); + $(Console_SdkLibPath);$(Console_SdkWindowsMetadataPath) + $(Console_SdkLibPath) + $(Console_SdkLibPath);$(Console_SdkWindowsMetadataPath) + + + false + $(OutDir)default$(TargetExt) + $(OutDir)default.xex + $(ProjectDir)\..\Minecraft.World\x64headers;$(ProjectDir)\Xbox\Sentient\Include;$(Console_SdkIncludeRoot) + $(Console_SdkRoot)bin;$(VCInstallDir)bin\x86_amd64;$(VCInstallDir)bin;$(WindowsSDK_ExecutablePath_x86);$(VSInstallDir)Common7\Tools\bin;$(VSInstallDir)Common7\tools;$(VSInstallDir)Common7\ide;$(ProgramFiles)\HTML Help Workshop;$(MSBuildToolsPath32);$(FxCopDir);$(PATH); + $(Console_SdkLibPath);$(Console_SdkWindowsMetadataPath) + $(Console_SdkLibPath) + $(Console_SdkLibPath);$(Console_SdkWindowsMetadataPath) + + + false + $(OutDir)default$(TargetExt) + $(OutDir)default.xex + $(ProjectDir)\..\Minecraft.World\x64headers;$(ProjectDir)\Xbox\Sentient\Include;$(Console_SdkIncludeRoot) + $(Console_SdkRoot)bin;$(VCInstallDir)bin\x86_amd64;$(VCInstallDir)bin;$(WindowsSDK_ExecutablePath_x86);$(VSInstallDir)Common7\Tools\bin;$(VSInstallDir)Common7\tools;$(VSInstallDir)Common7\ide;$(ProgramFiles)\HTML Help Workshop;$(MSBuildToolsPath32);$(FxCopDir);$(PATH); + $(Console_SdkLibPath);$(Console_SdkWindowsMetadataPath) + $(Console_SdkLibPath) + $(Console_SdkLibPath);$(Console_SdkWindowsMetadataPath) + + + false + $(OutDir)default$(TargetExt) + $(OutDir)default.xex + $(ProjectDir)\..\Minecraft.World\x64headers;$(ProjectDir)\Xbox\Sentient\Include;$(Console_SdkIncludeRoot) + $(Console_SdkRoot)bin;$(VCInstallDir)bin\x86_amd64;$(VCInstallDir)bin;$(WindowsSDK_ExecutablePath_x86);$(VSInstallDir)Common7\Tools\bin;$(VSInstallDir)Common7\tools;$(VSInstallDir)Common7\ide;$(ProgramFiles)\HTML Help Workshop;$(MSBuildToolsPath32);$(FxCopDir);$(PATH); + $(Console_SdkLibPath);$(Console_SdkWindowsMetadataPath) + $(Console_SdkLibPath) + $(Console_SdkLibPath);$(Console_SdkWindowsMetadataPath) + + + $(ProjectDir)\..\Minecraft.Client\Orbis\Assert;$(ProjectDir)\..\Minecraft.World\x64headers;$(ProjectDir)Orbis\OrbisExtras;$(SCE_ORBIS_SDK_DIR)\host_tools\lib\clang\include;$(SCE_ORBIS_SDK_DIR)\target\include;$(SCE_ORBIS_SDK_DIR)\target\include_common + + + $(ProjectDir)\..\Minecraft.Client\Orbis\Assert;$(ProjectDir)\..\Minecraft.World\x64headers;$(ProjectDir)Orbis\OrbisExtras;$(SCE_ORBIS_SDK_DIR)\host_tools\lib\clang\include;$(SCE_ORBIS_SDK_DIR)\target\include;$(SCE_ORBIS_SDK_DIR)\target\include_common + + + $(ProjectDir)\..\Minecraft.World\x64headers;$(ProjectDir)Orbis\OrbisExtras;$(SCE_ORBIS_SDK_DIR)\host_tools\lib\clang\include;$(SCE_ORBIS_SDK_DIR)\target\include;$(SCE_ORBIS_SDK_DIR)\target\include_common; + + + $(ProjectDir)\..\Minecraft.World\x64headers;$(ProjectDir)Orbis\OrbisExtras;$(SCE_ORBIS_SDK_DIR)\host_tools\lib\clang\include;$(SCE_ORBIS_SDK_DIR)\target\include;$(SCE_ORBIS_SDK_DIR)\target\include_common; + + + $(ProjectDir)\..\Minecraft.Client\Orbis\Assert;$(ProjectDir);$(ProjectDir)\..\Minecraft.World\x64headers;$(ProjectDir)Orbis\OrbisExtras;$(SCE_ORBIS_SDK_DIR)\host_tools\lib\clang\include;$(SCE_ORBIS_SDK_DIR)\target\include;$(SCE_ORBIS_SDK_DIR)\target\include_common + + + $(ProjectDir)\..\Minecraft.Client\Orbis\Assert;$(ProjectDir);$(ProjectDir)\..\Minecraft.World\x64headers;$(ProjectDir)Orbis\OrbisExtras;$(SCE_ORBIS_SDK_DIR)\host_tools\lib\clang\include;$(SCE_ORBIS_SDK_DIR)\target\include;$(SCE_ORBIS_SDK_DIR)\target\include_common + + + $(ProjectDir)\..\Minecraft.Client\Orbis\Assert;$(ProjectDir);$(ProjectDir)\..\Minecraft.World\x64headers;$(ProjectDir)Orbis\OrbisExtras;$(SCE_ORBIS_SDK_DIR)\host_tools\lib\clang\include;$(SCE_ORBIS_SDK_DIR)\target\include;$(SCE_ORBIS_SDK_DIR)\target\include_common + + + false + false + + + + Use + Level3 + ProgramDatabase + Disabled + false + false + false + $(OutDir)$(ProjectName).pch + MultiThreadedDebug + _DEBUG_MENUS_ENABLED;_ITERATOR_DEBUG_LEVEL=0;_SECURE_SCL=0;_DEBUG;_XBOX;%(PreprocessorDefinitions) + Disabled + $(ProjectDir);%(AdditionalIncludeDirectories) + true + true + Default + false + $(IntDir)/%(RelativeDir)/ + + + true + $(OutDir)$(ProjectName).pdb + xavatar2d.lib;xapilibd.lib;d3d9d.lib;d3dx9d.lib;xgraphicsd.lib;xboxkrnl.lib;xnetd.lib;xaudiod2.lib;xactd3.lib;x3daudiod.lib;xmcored.lib;xbdm.lib;vcompd.lib;xuirund.lib;xuirenderd.lib;xuihtmld.lib;xonline.lib;xhvd2.lib;qnetxaudio2d.lib;xpartyd.lib;..\Minecraft.World\Debug\Minecraft.World.lib;xbox\4JLibs\libs\4J_Input_d.lib;xbox\4JLibs\libs\4J_Storage_d.lib;xbox\4JLibs\libs\4J_Profile_d.lib;xbox\4JLibs\libs\4J_Render_d.lib;xsocialpostd.lib;xrnmd.lib;xbox\Sentient\libs\SenCoreD.lib;xbox\Sentient\libs\SenNewsD.lib;xbox\Sentient\libs\SenUGCD.lib;xbox\Sentient\libs\SenBoxArtD.lib;nuiapid.lib;STd.lib;NuiFitnessApid.lib;NuiHandlesd.lib;NuiSpeechd.lib;xhttpd.lib;xauthd.lib;xgetserviceendpointd.lib;xavd.lib;xjsond.lib;xbox\4JLibs\libs\4J_XTMS_d.lib;%(AdditionalDependencies) + + + $(ProjectDir)xbox\xex-dev.xml + + + 1480659447 + + + 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)XboxMedia\XZP\Minecraft.xzp,RO + true + + + CopyToHardDrive + $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Common\res;$(RemoteRoot)=XboxMedia\AvatarAwards;$(RemoteRoot)\Tutorial=Common\Tutorial\Tutorial;$(RemoteRoot)=XboxMedia\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech;$(RemoteRoot)=XboxMedia\XZP\TMSFiles.xzp;$(RemoteRoot)\DummyTexturePack=Common\DummyTexturePack + + + + + Use + Level3 + ProgramDatabase + Full + false + false + false + $(OutDir)$(ProjectName).pch + MultiThreaded + _DEBUG_MENUS_ENABLED;_ITERATOR_DEBUG_LEVEL=0;NDEBUG;_XBOX;%(PreprocessorDefinitions);PROFILE + Disabled + $(ProjectDir);%(AdditionalIncludeDirectories) + true + true + Default + false + Speed + true + true + true + $(IntDir)/%(RelativeDir)/ + + + true + $(OutDir)$(ProjectName).pdb + xavatar2.lib;xapilibi.lib;d3d9i.lib;d3dx9.lib;xgraphics.lib;xboxkrnl.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;xparty.lib;xbox\4JLibs\libs\4J_Input_r.lib;xbox\4JLibs\libs\4J_Storage_r.lib;xbox\4JLibs\libs\4J_Profile_r.lib;xbox\4JLibs\libs\4J_Render.lib;..\Minecraft.World\Release\Minecraft.World.lib;xbdm.lib;xsocialpost.lib;xrnm.lib;xbox\Sentient\libs\SenCore.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;xbox\4JLibs\libs\4J_XTMS_r.lib;%(AdditionalDependencies) + xapilib.lib + true + false + UseLinkTimeCodeGeneration + true + + + $(ProjectDir)xbox\xex-dev.xml + + + 1480659447 + + + 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)XboxMedia\XZP\Minecraft.xzp,RO + false + + + CopyToHardDrive + $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Common\res;$(RemoteRoot)=XboxMedia\AvatarAwards;$(RemoteRoot)\Tutorial=Common\Tutorial\Tutorial;$(RemoteRoot)=XboxMedia\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech;$(RemoteRoot)=XboxMedia\XZP\TMSFiles.xzp;$(RemoteRoot)\DummyTexturePack=Common\DummyTexturePack + + + + + Use + Level3 + ProgramDatabase + Full + false + false + false + $(OutDir)$(ProjectName).pch + MultiThreaded + _DEBUG_MENUS_ENABLED;_ITERATOR_DEBUG_LEVEL=0;NDEBUG;_XBOX;%(PreprocessorDefinitions);PROFILE + Disabled + $(ProjectDir);%(AdditionalIncludeDirectories) + true + true + Default + false + Speed + true + true + true + $(IntDir)/%(RelativeDir)/ + + + true + $(OutDir)$(ProjectName).pdb + xavatar2.lib;xapilibi.lib;d3d9i.lib;d3dx9.lib;xgraphics.lib;xboxkrnl.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;xparty.lib;xbox\4JLibs\libs\4J_Input_r.lib;xbox\4JLibs\libs\4J_Storage_r.lib;xbox\4JLibs\libs\4J_Profile_r.lib;xbox\4JLibs\libs\4J_Render.lib;..\Minecraft.World\Release\Minecraft.World.lib;xbdm.lib;xsocialpost.lib;xrnm.lib;xbox\Sentient\libs\SenCore.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;xtms.lib;%(AdditionalDependencies) + xapilib.lib + true + false + UseLinkTimeCodeGeneration + true + + + $(ProjectDir)xbox\xex-dev.xml + + + 1480659447 + + + 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)XboxMedia\XZP\Minecraft.xzp,RO + false + + + CopyToHardDrive + $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Common\res;$(RemoteRoot)=XboxMedia\AvatarAwards;$(RemoteRoot)\Tutorial=Common\Tutorial\Tutorial;$(RemoteRoot)=XboxMedia\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech;$(RemoteRoot)=XboxMedia\XZP\TMSFiles.xzp;$(RemoteRoot)\DummyTexturePack=Common\DummyTexturePack + + + + + Use + Level3 + ProgramDatabase + Disabled + false + true + false + $(OutDir)$(ProjectName).pch + MultiThreadedDebug + _DEBUG_MENUS_ENABLED;_ITERATOR_DEBUG_LEVEL=0;_SECURE_SCL=0;_DEBUG;%(PreprocessorDefinitions) + Disabled + PS3\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) + true + true + Default + true + true + GenerateWarnings + Level0 + 1700;613;1011 + -Xpch_override=1 %(AdditionalOptions) + + + true + $(OutDir)$(ProjectName).pdb + $(OutDir)Minecraft.World.a;ps3\4JLibs\libs\4j_Render_d.a;ps3\4JLibs\libs\4j_Input_d.a;ps3\4JLibs\libs\4j_Storage_d.a;ps3\4JLibs\libs\4j_Profile_d.a;ps3\Miles\lib\mssps3.a;ps3\Miles\lib\mssspurs.o;ps3\Miles\lib\audps3.a;ps3\Miles\lib\BinkAPS3.A;ps3\Miles\lib\spu\mssppu_spurs.a;PS3\Iggy\lib\libiggy_ps3.a;ps3\Edge\lib\libedgezlib_dbg.a;Common\Network\Sony\sceRemoteStorage\ps3\lib\sceRemoteStorage.a;PS3\PS3Extras\HeapInspector\Server\PS3\Debug_RTTI_EH\libHeapInspectorServer.a;libsntuner.a;libpngdec_stub.a;libpngenc_stub.a;libjpgdec_stub.a;libjpgenc_stub.a;libnet_stub.a;libsysutil_savedata_stub.a;libsysutil_userinfo_stub.a;libsysutil_np_trophy_stub.a;libsysutil_game_stub.a;libsysutil_avc2_stub.a;libsysutil_np_commerce2_stub.a;libsysutil_avconf_ext_stub.a;libhttp_stub.a;libhttp_util_stub.a;libssl_stub.a;libsysutil_screenshot_stub.a;libsysutil_np_tus_stub.a;-lresc_stub;-lgcm_cmddbg;-lgcm_sys_stub;-lsysmodule_stub;-lm;-lsysutil_stub;-lio_stub;-ldbgfont_gcm;-lpthread;-lpadfilter;-lcgb;-laudio_stub;-lfs_stub;-lspurs_stub;-lspurs_jq_stub;-lrtc_stub;-lsysutil_oskdialog_ext_stub;-ll10n_stub;-lsysutil_np_stub;-lsysutil_np2_stub;-lnetctl_stub;-lnet_stub;-lrudp_stub;%(AdditionalDependencies) + StripFuncsAndData + + + $(ProjectDir)xbox\xex-dev.xml + + + 1480659447 + + + 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO + true + + + CopyToHardDrive + $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech;$(RemoteRoot)=Xbox\XZP\TMSFiles.xzp + + + + + + + + + Use + Level3 + ProgramDatabase + Disabled + false + true + false + $(OutDir)$(ProjectName).pch + MultiThreadedDebug + _EXTENDED_ACHIEVEMENTS;_DEBUG_MENUS_ENABLED;_ITERATOR_DEBUG_LEVEL=0;_SECURE_SCL=0;_DEBUG;__PSVITA__;%(PreprocessorDefinitions) + Disabled + PSVita\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) + true + true + Default + true + true + GenerateWarnings + Level0 + 1700;613;1011;1786;2623;2624;1628 + -Xpch_override=1 %(AdditionalOptions) + Cpp11 + true + + + true + $(OutDir)$(ProjectName).pdb + -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;libSceNpCommerce2_stub.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 + StripFuncsAndData + --strip-duplicates + + + $(ProjectDir)xbox\xex-dev.xml + + + 1480659447 + + + 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO + true + + + CopyToHardDrive + $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech;$(RemoteRoot)=Xbox\XZP\TMSFiles.xzp + + + + + + + xcopy /I /Y "$(SCE_PSP2_SDK_DIR)\target\sce_module" "$(TargetDir)\sce_module\" +if not exist "$(TargetDir)\savedata" mkdir "$(TargetDir)\savedata" + + + + + Use + Level3 + ProgramDatabase + Disabled + false + true + false + $(OutDir)$(ProjectName).pch + MultiThreadedDebug + _DEBUG_MENUS_ENABLED;_ITERATOR_DEBUG_LEVEL=0;_SECURE_SCL=0;%(PreprocessorDefinitions) + Disabled + PS3\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) + true + true + Default + true + true + GenerateWarnings + Levels + Branchless2 + 1700;613;1011 + -Xpch_override=1 %(AdditionalOptions) + $(ProjectDir)\..\Minecraft.Client\PS3\Assert + true + Yes + + + true + $(OutDir)$(ProjectName).pdb + $(OutDir)Minecraft.World.a;ps3\Miles\lib\mssps3.a;ps3\Miles\lib\mssspurs.o;ps3\Miles\lib\audps3.a;ps3\Miles\lib\BinkAPS3.A;ps3\Miles\lib\spu\mssppu_spurs.a;PS3\Iggy\lib\libiggy_ps3.a;ps3\Edge\lib\libedgezlib.a;Common\Network\Sony\sceRemoteStorage\ps3\lib\sceRemoteStorage.a;PS3\PS3Extras\HeapInspector\Server\PS3\Debug_RTTI_EH\libHeapInspectorServer.a;libsntuner.a;libpngdec_stub.a;libpngenc_stub.a;libjpgdec_stub.a;libjpgenc_stub.a;libnet_stub.a;libsysutil_savedata_stub.a;libsysutil_userinfo_stub.a;libsysutil_np_trophy_stub.a;libsysutil_game_stub.a;libsysutil_avc2_stub.a;libsysutil_np_commerce2_stub.a;libsysutil_avconf_ext_stub.a;libhttp_stub.a;libhttp_util_stub.a;libssl_stub.a;libsysutil_screenshot_stub.a;libsysutil_np_tus_stub.a;-lresc_stub;-lgcm_cmd;-lgcm_sys_stub;-lsysmodule_stub;-lm;-lsysutil_stub;-lio_stub;-ldbgfont_gcm;-lpthread;-lpadfilter;-lcgb;-laudio_stub;-lfs_stub;-lspurs_stub;-lspurs_jq_stub;-lrtc_stub;-lsysutil_oskdialog_ext_stub;-ll10n_stub;-lsysutil_np_stub;-lsysutil_np2_stub;-lnetctl_stub;-lnet_stub;-lrudp_stub;%(AdditionalDependencies) + StripFuncsAndData + --no-toc-restore --strip-duplicates + None + + + $(ProjectDir)xbox\xex-dev.xml + + + 1480659447 + + + 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO + true + + + CopyToHardDrive + $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech;$(RemoteRoot)=Xbox\XZP\TMSFiles.xzp + + + + + + + + + Use + Level3 + ProgramDatabase + Disabled + false + true + false + $(OutDir)$(ProjectName).pch + MultiThreadedDebug + _DEBUG_MENUS_ENABLED;_ITERATOR_DEBUG_LEVEL=0;_SECURE_SCL=0;%(PreprocessorDefinitions) + Disabled + PS3\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) + true + true + Default + true + true + GenerateWarnings + Levels + Branchless2 + 1700;613;1011 + -Xpch_override=1 %(AdditionalOptions) + $(ProjectDir)\..\Minecraft.Client\PS3\Assert + true + Yes + + + true + $(OutDir)$(ProjectName).pdb + $(OutDir)Minecraft.World.a;ps3\Miles\lib\mssps3.a;ps3\Miles\lib\mssspurs.o;ps3\Miles\lib\audps3.a;ps3\Miles\lib\BinkAPS3.A;ps3\Miles\lib\spu\mssppu_spurs.a;PS3\Iggy\lib\libiggy_ps3.a;ps3\Edge\lib\libedgezlib.a;Common\Network\Sony\sceRemoteStorage\ps3\lib\sceRemoteStorage.a;PS3\PS3Extras\HeapInspector\Server\PS3\Debug_RTTI_EH\libHeapInspectorServer.a;libsntuner.a;libpngdec_stub.a;libpngenc_stub.a;libjpgdec_stub.a;libjpgenc_stub.a;libnet_stub.a;libsysutil_savedata_stub.a;libsysutil_userinfo_stub.a;libsysutil_np_trophy_stub.a;libsysutil_game_stub.a;libsysutil_avc2_stub.a;libsysutil_np_commerce2_stub.a;libsysutil_avconf_ext_stub.a;libhttp_stub.a;libhttp_util_stub.a;libssl_stub.a;libsysutil_screenshot_stub.a;libsysutil_np_tus_stub.a;-lresc_stub;-lgcm_cmd;-lgcm_sys_stub;-lsysmodule_stub;-lm;-lsysutil_stub;-lio_stub;-ldbgfont_gcm;-lpthread;-lpadfilter;-lcgb;-laudio_stub;-lfs_stub;-lspurs_stub;-lspurs_jq_stub;-lrtc_stub;-lsysutil_oskdialog_ext_stub;-ll10n_stub;-lsysutil_np_stub;-lsysutil_np2_stub;-lnetctl_stub;-lnet_stub;-lrudp_stub;%(AdditionalDependencies) + StripFuncsAndData + --no-toc-restore --strip-duplicates + None + + + $(ProjectDir)xbox\xex-dev.xml + + + 1480659447 + + + 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO + true + + + CopyToHardDrive + $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech;$(RemoteRoot)=Xbox\XZP\TMSFiles.xzp + + + + + + + + + Use + Level3 + ProgramDatabase + Disabled + false + true + false + $(OutDir)$(ProjectName).pch + MultiThreadedDebug + _EXTENDED_ACHIEVEMENTS;_DEBUG_MENUS_ENABLED;_ITERATOR_DEBUG_LEVEL=0;_SECURE_SCL=0;__PSVITA__;%(PreprocessorDefinitions) + Disabled + PSVita\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) + true + true + Default + true + true + GenerateWarnings + Levels + Branchless2 + 1700;613;1011 + -Xpch_override=1 %(AdditionalOptions) + true + Yes + Cpp11 + true + + + true + $(OutDir)$(ProjectName).pdb + -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 + StripFuncsAndData + --strip-duplicates + None + + + $(ProjectDir)xbox\xex-dev.xml + + + 1480659447 + + + 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO + true + + + CopyToHardDrive + $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech;$(RemoteRoot)=Xbox\XZP\TMSFiles.xzp + + + + + + + xcopy /I /Y "$(SCE_PSP2_SDK_DIR)\target\sce_module" "$(TargetDir)\sce_module\" +if not exist "$(TargetDir)\savedata" mkdir "$(TargetDir)\savedata" + + + + + Use + Level3 + ProgramDatabase + Disabled + false + true + false + $(OutDir)$(ProjectName).pch + MultiThreadedDebug + _EXTENDED_ACHIEVEMENTS;_CONTENT_PACKAGE;_FINAL_BUILD;__PSVITA__;%(PreprocessorDefinitions) + Disabled + PSVita\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) + true + true + Default + true + false + GenerateWarnings + Level3 + Branchless2 + 1700;613;1011 + -Xpch_override=1 %(AdditionalOptions) + false + Yes + Cpp11 + true + + + true + $(OutDir)$(ProjectName).pdb + -lSceGxm_stub;-lSceAppUtil_stub;-lSceCommonDialog_stub;-lSceDisplay_stub;-lSceTouch_stub;-lSceCtrl_stub;-lSceAudio_stub;-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;libSceHttp_stub.a;libSceNet_stub.a;libSceSsl_stub.a;libSceNetCtl_stub.a;libSceNpManager_stub.a;libSceNpBasic_stub.a;libSceNpCommon_stub.a;libSceNpUtility_stub.a;libSceNpMatching2_stub.a;libSceNpScore_stub.a;libSceNpToolkit.a;libSceNpToolkitUtils.a;libSceNpTrophy_stub.a;libSceRudp_stub_weak.a;libSceVoice_stub.a;libSceNetAdhocMatching_stub.a;libScePspnetAdhoc_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;libSceAppMgr_stub.a;libSceSysmodule_stub.a;libSceCommonDialog_stub.a;libSceCtrl_stub.a;libSceGxm_stub.a;libSceDisplay_stub.a;libSceSystemGesture_stub.a;libSceTouch_stub.a;libSceFios2_stub.a;libSceAppUtil_stub.a;libSceNearUtil_stub.a;libScePower_stub.a;..\Minecraft.Client\PSVita\4JLibs\libs\4J_Input.a;..\Minecraft.Client\PSVita\4JLibs\libs\4J_Profile.a;..\Minecraft.Client\PSVita\4JLibs\libs\4J_Render.a;..\Minecraft.Client\PSVita\4JLibs\libs\4J_Storage.a;..\Minecraft.Client\Common\Network\Sony\sceRemoteStorage\psvita\lib\sceRemoteStorage.a + StripFuncsAndData + --strip-duplicates + None + + + $(ProjectDir)xbox\xex-dev.xml + + + 1480659447 + + + 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO + true + + + CopyToHardDrive + $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech;$(RemoteRoot)=Xbox\XZP\TMSFiles.xzp + + + + + + + xcopy /I /Y "$(SCE_PSP2_SDK_DIR)\target\sce_module" "$(TargetDir)\sce_module\" +if not exist "$(TargetDir)\savedata" mkdir "$(TargetDir)\savedata" + + + + + Use + Level3 + ProgramDatabase + Disabled + Sync + false + $(OutDir)$(ProjectName).pch + MultiThreadedDebugDLL + _LARGE_WORLDS;_DEBUG_MENUS_ENABLED;_DEBUG;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_WINDOWS64;%(PreprocessorDefinitions) + Disabled + Windows64\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) + true + true + Default + false + + + true + $(OutDir)$(ProjectName).pdb + d3d11.lib;..\Minecraft.World\x64_Debug\Minecraft.World.lib;%(AdditionalDependencies);XInput9_1_0.lib;..\Minecraft.Client\Windows64\Miles\Lib\mss64.lib;Windows64\HeapInspector\Server\PC_Windows\Debug_x64_VS2012\HeapInspectorServer.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 + + + + + Use + Level3 + ProgramDatabase + Disabled + Sync + false + $(OutDir)$(ProjectName).pch + MultiThreadedDebug + _LARGE_WORLDS;_DEBUG_MENUS_ENABLED;_DEBUG;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_WINDOWS64;%(PreprocessorDefinitions) + Disabled + Windows64\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) + true + true + Default + false + + + true + $(OutDir)$(ProjectName).pdb + d3d11.lib;..\Minecraft.World\x64_Debug\Minecraft.World.lib;%(AdditionalDependencies);XInput9_1_0.lib;..\Minecraft.Client\Windows64\Miles\Lib\mss64.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 + + + + + Use + Level3 + ProgramDatabase + Disabled + Sync + true + $(OutDir)$(ProjectName).pch + MultiThreadedDebugDLL + SPLIT_SAVES;_LARGE_WORLDS;_EXTENDED_ACHIEVEMENTS;UNICODE;_UNICODE;__WRL_NO_DEFAULT_LIB__;WINAPI_FAMILY=WINAPI_FAMILY_TV_TITLE;WIN32_LEAN_AND_MEAN;_XM_AVX_INTRINSICS_;_DEBUG_MENUS_ENABLED;_DEBUG;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_DURANGO;_ITERATOR_DEBUG_LEVEL=0;%(PreprocessorDefinitions) + Disabled + Durango\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) + true + true + EnableFastChecks + false + true + true + $(ForcedInc) + $(SlashAI) + false + false + + + true + $(OutDir)$(ProjectName).pdb + ws2_32.lib;pixEvt.lib;d3d11_x.lib;combase.lib;kernelx.lib;uuid.lib;xaudio2.lib;..\Minecraft.World\Durango_Debug\Minecraft.World.lib;EtwPlus.lib;..\Minecraft.Client\Durango\DurangoExtras\xcompress.lib + NotSet + true + Console + true + + + false + false + Default + kernel32.lib;oldnames.lib;runtimeobject.lib;ole32.lib + + + $(ProjectDir)xbox\xex-dev.xml + + + 1480659447 + + + 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO + true + + + CopyToHardDrive + $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech;$(RemoteRoot)=Xbox\XZP\TMSFiles.xzp + + + xcopy /q /y /i /s /e $(ProjectDir)Common\res $(LayoutDir)Image\Loose\Common\res +xcopy /q /y /i /s /e $(ProjectDir)Common\media\font\*.ttf $(LayoutDir)Image\Loose\Common\media\font +xcopy /q /y $(ProjectDir)Durango\*.png $(LayoutDir)Image\Loose +xcopy /q /y $(ProjectDir)Common\media\MediaDurango.arc $(LayoutDir)Image\Loose\Common\media +xcopy /q /y /i /s /e $(ProjectDir)Durango\Sound $(LayoutDir)Image\Loose\Sound +xcopy /q /y /i /s /e $(ProjectDir)music $(LayoutDir)Image\Loose\music +xcopy /q /y /i /s /e $(ProjectDir)DurangoMedia\DLC $(LayoutDir)Image\Loose\DLC +xcopy /q /y /i /s /e $(ProjectDir)DurangoMedia\Tutorial $(LayoutDir)Image\Loose\Tutorial +copy /B /Y $(ProjectDir)Durango\DurangoExtras\xcompress.dll $(LayoutDir)Image\Loose\ +xcopy /q /y $(ProjectDir)Durango\DLCImages\*.png $(LayoutDir)Image\Loose\DLCImages\ +xcopy /q /y $(ProjectDir)Durango\DLCXbox1.cmp $(LayoutDir)Image\Loose +xcopy /q /y $(ProjectDir)DurangoMedia\DLC $(LayoutDir)Image\Loose\DLC +xcopy /q /y /i /s /e $(ProjectDir)DurangoMedia\CU $(LayoutDir)Image\Loose\CU + + + Copying files for deployment + + + Package.appxmanifest + + + call $(ProjectDir)\Build\XboxOne\AppxPrebuild.cmd $(ProjectDir) + + + /VM %(AdditionalOptions) + + + call $(ProjectDir)\DurangoBuild\AppxPrebuild.cmd $(ProjectDir) + $(ProjectDir)\Durango\Autogenerated.appxmanifest + Creating Autogenerated.appxmanifest + $(ProjectDir)\Durango\manifest.xml + true + + + + + Use + Level3 + ProgramDatabase + Full + Sync + false + $(OutDir)$(ProjectName).pch + MultiThreaded + _LARGE_WORLDS;_DEBUG_MENUS_ENABLED;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_WINDOWS64;%(PreprocessorDefinitions) + Disabled + Windows64\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) + true + true + Default + false + Speed + + + true + $(OutDir)$(ProjectName).pdb + d3d11.lib;..\Minecraft.World\x64_Release\Minecraft.World.lib;XInput9_1_0.lib;Windows64\Iggy\lib\iggy_w64.lib;%(AdditionalDependencies) + NotSet + false + + + $(ProjectDir)xbox\xex-dev.xml + + + 1480659447 + + + 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO + true + + + CopyToHardDrive + $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech;$(RemoteRoot)=Xbox\XZP\TMSFiles.xzp + + + + + Use + Level3 + ProgramDatabase + Full + Sync + false + $(OutDir)$(ProjectName).pch + MultiThreaded + _LARGE_WORLDS;_DEBUG_MENUS_ENABLED;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_WINDOWS64;%(PreprocessorDefinitions) + Disabled + Windows64\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) + true + true + Default + false + Speed + + + true + $(OutDir)$(ProjectName).pdb + d3d11.lib;..\Minecraft.World\x64_Release\Minecraft.World.lib;XInput9_1_0.lib;Windows64\Iggy\lib\iggy_w64.lib;%(AdditionalDependencies) + NotSet + false + + + $(ProjectDir)xbox\xex-dev.xml + + + 1480659447 + + + 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO + true + + + CopyToHardDrive + $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech;$(RemoteRoot)=Xbox\XZP\TMSFiles.xzp + + + + + Use + Level3 + ProgramDatabase + Full + Sync + false + $(OutDir)$(ProjectName).pch + MultiThreaded + _LARGE_WORLDS;_DEBUG_MENUS_ENABLED;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_WINDOWS64;%(PreprocessorDefinitions) + Disabled + Windows64\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) + true + true + Default + false + Speed + + + true + $(OutDir)$(ProjectName).pdb + d3d11.lib;..\Minecraft.World\x64_Release\Minecraft.World.lib;XInput9_1_0.lib;Windows64\Iggy\lib\iggy_w64.lib;%(AdditionalDependencies) + NotSet + false + + + $(ProjectDir)xbox\xex-dev.xml + + + 1480659447 + + + 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO + true + + + CopyToHardDrive + $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech;$(RemoteRoot)=Xbox\XZP\TMSFiles.xzp + + + + + Use + Level3 + ProgramDatabase + Full + Sync + false + $(OutDir)$(ProjectName).pch + MultiThreaded + _LARGE_WORLDS;_DEBUG_MENUS_ENABLED;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_WINDOWS64;%(PreprocessorDefinitions) + Disabled + Windows64\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) + true + true + Default + false + Speed + + + true + $(OutDir)$(ProjectName).pdb + d3d11.lib;..\Minecraft.World\x64_Release\Minecraft.World.lib;XInput9_1_0.lib;Windows64\Iggy\lib\iggy_w64.lib;%(AdditionalDependencies) + NotSet + false + + + $(ProjectDir)xbox\xex-dev.xml + + + 1480659447 + + + 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO + true + + + CopyToHardDrive + $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech;$(RemoteRoot)=Xbox\XZP\TMSFiles.xzp + + + + + Use + Level3 + ProgramDatabase + MaxSpeed + Sync + true + $(OutDir)$(ProjectName).pch + MultiThreadedDLL + SPLIT_SAVES;_LARGE_WORLDS;_EXTENDED_ACHIEVEMENTS;PROFILE;NDEBUG;UNICODE;_UNICODE;__WRL_NO_DEFAULT_LIB__;WINAPI_FAMILY=WINAPI_FAMILY_TV_TITLE;WIN32_LEAN_AND_MEAN;_XM_AVX_INTRINSICS_;_DEBUG_MENUS_ENABLED;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_DURANGO;%(PreprocessorDefinitions) + Disabled + Durango\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) + true + true + Default + false + Speed + true + true + $(ForcedInc) + false + false + + + true + $(OutDir)$(ProjectName).pdb + ws2_32.lib;pixEvt.lib;d3d11_x.lib;combase.lib;kernelx.lib;uuid.lib;xaudio2.lib;..\Minecraft.World\Durango_Release\Minecraft.World.lib;EtwPlus.lib;..\Minecraft.Client\Durango\DurangoExtras\xcompress.lib + NotSet + true + Console + + + true + true + + + kernel32.lib;oldnames.lib;runtimeobject.lib;ole32.lib + Default + + + $(ProjectDir)xbox\xex-dev.xml + + + 1480659447 + + + 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO + true + + + CopyToHardDrive + $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech;$(RemoteRoot)=Xbox\XZP\TMSFiles.xzp + + + xcopy /q /y /i /s /e $(ProjectDir)Common\res $(LayoutDir)Image\Loose\Common\res +xcopy /q /y /i /s /e $(ProjectDir)Common\media\font\*.ttf $(LayoutDir)Image\Loose\Common\media\font +xcopy /q /y $(ProjectDir)Durango\*.png $(LayoutDir)Image\Loose +xcopy /q /y $(ProjectDir)Common\media\MediaDurango.arc $(LayoutDir)Image\Loose\Common\media +xcopy /q /y /i /s /e $(ProjectDir)Durango\Sound $(LayoutDir)Image\Loose\Sound +xcopy /q /y /i /s /e $(ProjectDir)music $(LayoutDir)Image\Loose\music +xcopy /q /y /i /s /e $(ProjectDir)DurangoMedia\DLC $(LayoutDir)Image\Loose\DLC +xcopy /q /y /i /s /e $(ProjectDir)DurangoMedia\Tutorial $(LayoutDir)Image\Loose\Tutorial +copy /B /Y $(ProjectDir)Durango\DurangoExtras\xcompress.dll $(LayoutDir)Image\Loose\ +xcopy /q /y $(ProjectDir)Durango\DLCImages\*.png $(LayoutDir)Image\Loose\DLCImages\ +xcopy /q /y $(ProjectDir)Durango\DLCXbox1.cmp $(LayoutDir)Image\Loose +xcopy /q /y $(ProjectDir)DurangoMedia\DLC $(LayoutDir)Image\Loose\DLC +xcopy /q /y /i /s /e $(ProjectDir)DurangoMedia\CU $(LayoutDir)Image\Loose\CU + + + Copying files for deployment + + + Package.appxmanifest + + + call $(ProjectDir)\Build\XboxOne\AppxPrebuild.cmd $(ProjectDir) + + + + + Use + Level3 + ProgramDatabase + MaxSpeed + Sync + true + $(OutDir)$(ProjectName).pch + MultiThreadedDLL + SPLIT_SAVES;_LARGE_WORLDS;_EXTENDED_ACHIEVEMENTS;PROFILE;NDEBUG;UNICODE;_UNICODE;__WRL_NO_DEFAULT_LIB__;WINAPI_FAMILY=WINAPI_FAMILY_TV_TITLE;WIN32_LEAN_AND_MEAN;_XM_AVX_INTRINSICS_;_DEBUG_MENUS_ENABLED;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_DURANGO;%(PreprocessorDefinitions) + Disabled + Durango\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) + true + true + Default + false + Speed + true + true + $(ForcedInc) + false + false + + + true + $(OutDir)$(ProjectName).pdb + ws2_32.lib;pixEvt.lib;d3d11_x.lib;combase.lib;kernelx.lib;uuid.lib;xaudio2.lib;..\Minecraft.World\Durango_Release\Minecraft.World.lib;EtwPlus.lib;..\Minecraft.Client\Durango\DurangoExtras\xcompress.lib + NotSet + true + Console + + + true + true + + + kernel32.lib;oldnames.lib;runtimeobject.lib;ole32.lib + Default + + + $(ProjectDir)xbox\xex-dev.xml + + + 1480659447 + + + 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO + true + + + CopyToHardDrive + $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech;$(RemoteRoot)=Xbox\XZP\TMSFiles.xzp + + + xcopy /q /y /i /s /e $(ProjectDir)Common\res $(LayoutDir)Image\Loose\Common\res +xcopy /q /y /i /s /e $(ProjectDir)Common\media\font\*.ttf $(LayoutDir)Image\Loose\Common\media\font +xcopy /q /y $(ProjectDir)Durango\*.png $(LayoutDir)Image\Loose +xcopy /q /y $(ProjectDir)Common\media\MediaDurango.arc $(LayoutDir)Image\Loose\Common\media +xcopy /q /y /i /s /e $(ProjectDir)Durango\Sound $(LayoutDir)Image\Loose\Sound +xcopy /q /y /i /s /e $(ProjectDir)music $(LayoutDir)Image\Loose\music +copy /B /Y $(ProjectDir)Durango\DurangoExtras\xcompress.dll $(LayoutDir)Image\Loose\ + + + Copying files for deployment + + + Package.appxmanifest + + + + + + + + + Level3 + Use + Full + true + true + ProgramDatabase + Speed + false + false + $(OutDir)$(ProjectName).pch + MultiThreaded + _TU_BUILD;_FINAL_BUILD;_ITERATOR_DEBUG_LEVEL=0;NDEBUG;_XBOX;_CONTENT_PACKAGE;%(PreprocessorDefinitions); + true + true + Disabled + Default + $(ProjectDir);%(AdditionalIncludeDirectories) + $(IntDir)/%(RelativeDir)/ + + + true + true + true + $(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;xbox\4JLibs\libs\4J_XTMS_r.lib;%(AdditionalDependencies) + xapilib.lib + false + false + + + $(ProjectDir)xbox\xex.xml + 1480659447 + 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)XboxMedia\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 + true + + + + + Level3 + Use + Full + true + true + ProgramDatabase + Speed + false + false + $(OutDir)$(ProjectName).pch + MultiThreaded + _TU_BUILD;_FINAL_BUILD;_ITERATOR_DEBUG_LEVEL=0;NDEBUG;_XBOX;_CONTENT_PACKAGE;%(PreprocessorDefinitions); + true + true + Disabled + Default + $(ProjectDir);%(AdditionalIncludeDirectories) + + + true + true + true + $(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;xtms.lib;%(AdditionalDependencies) + xapilib.lib + false + false + + + $(ProjectDir)xbox\xex.xml + 1480659447 + 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)XboxMedia\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 + true + + + + + Level3 + Use + Full + true + true + ProgramDatabase + Speed + false + false + $(OutDir)$(ProjectName).pch + MultiThreaded + _TU_BUILD;_FINAL_BUILD;_ITERATOR_DEBUG_LEVEL=0;NDEBUG;_XBOX;_CONTENT_PACKAGE;%(PreprocessorDefinitions); + true + true + Disabled + Default + $(ProjectDir);%(AdditionalIncludeDirectories) + + + true + true + true + $(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;xtms.lib;%(AdditionalDependencies) + xapilib.lib + false + false + + + $(ProjectDir)xbox\xex.xml + 1480659447 + 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)XboxMedia\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 + true + + + + + Level3 + Use + Full + true + true + ProgramDatabase + Speed + false + false + $(OutDir)$(ProjectName).pch + MultiThreaded + _FINAL_BUILD;_CONTENT_PACKAGE;NDEBUG;_ITERATOR_DEBUG_LEVEL=0;_XBOX;%(PreprocessorDefinitions) + true + true + Disabled + Default + $(ProjectDir);%(AdditionalIncludeDirectories) + $(IntDir)/%(RelativeDir)/ + + + true + true + true + $(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_NO_TU\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;xbox\4JLibs\libs\4J_XTMS_r.lib;%(AdditionalDependencies) + xapilib.lib + false + false + + + $(ProjectDir)xbox\xex.xml + 1480659447 + 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)XboxMedia\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 + true + + + + + Level3 + Use + Full + true + true + ProgramDatabase + Speed + Sync + false + $(OutDir)$(ProjectName).pch + MultiThreaded + _CONTENT_PACKAGE;_FINAL_BUILD;_ITERATOR_DEBUG_LEVEL=0;_SECURE_SCL=0;%(PreprocessorDefinitions) + true + true + Disabled + Default + 1700;613;1011 + -Xpch_override=1 %(AdditionalOptions) + PS3\Iggy\include;%(AdditionalIncludeDirectories) + Levels + true + Branchless2 + Yes + + + true + true + false + $(OutDir)default.pdb + true + $(OutDir)Minecraft.World.a;ps3\4JLibs\libs\4j_Render.a;ps3\4JLibs\libs\4j_Input.a;ps3\4JLibs\libs\4j_Storage.a;ps3\4JLibs\libs\4j_Profile.a;ps3\Miles\lib\mssps3.a;ps3\Miles\lib\audps3.a;ps3\Miles\lib\spu\mssppu_spurs.a;ps3\Miles\lib\BinkAPS3.A;PS3\Iggy\lib\libiggy_ps3.a;ps3\Miles\lib\mssspurs.o;ps3\Edge\lib\libedgezlib.a;Common\Network\Sony\sceRemoteStorage\ps3\lib\sceRemoteStorage.a;libsntuner.a;libpngdec_stub.a;libpngenc_stub.a;libnet_stub.a;libsysutil_savedata_stub.a;libsysutil_userinfo_stub.a;libsysutil_np_trophy_stub.a;libsysutil_game_stub.a;libhttp_stub.a;libhttp_util_stub.a;libssl_stub.a;libjpgdec_stub.a;libjpgenc_stub.a;libsysutil_avc2_stub.a;libsysutil_np_commerce2_stub.a;libsysutil_avconf_ext_stub.a;libsysutil_screenshot_stub.a;libsysutil_np_tus_stub.a;-lresc_stub;-lgcm_cmd;-lgcm_sys_stub;-lsysmodule_stub;-lm;-lsysutil_stub;-lio_stub;-ldbgfont_gcm;-lpthread;-lpadfilter;-lcgb;-laudio_stub;-lfs_stub;-lspurs_stub;-lspurs_jq_stub;-lrtc_stub;-lsysutil_oskdialog_ext_stub;-ll10n_stub;-lsysutil_np_stub;-lsysutil_np2_stub;-lnetctl_stub;-lnet_stub;-lrudp_stub;-lsysutil_avconf_ext_stub;%(AdditionalDependencies) + xapilib.lib + false + false + ELFFile + FullMapFile + --no-toc-restore --strip-duplicates --ppuguid %(AdditionalOptions) + StripSymsAndDebug + StripFuncsAndData + + + $(ProjectDir)xbox\xex.xml + 1480659447 + 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO + + + CopyToHardDrive + $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech + + + + + Level3 + Use + Full + true + true + ProgramDatabase + Speed + Sync + false + $(OutDir)$(ProjectName).pch + MultiThreaded + _EXTENDED_ACHIEVEMENTS;_CONTENT_PACKAGE;_FINAL_BUILD;__PSVITA__;%(PreprocessorDefinitions) + true + true + Disabled + Default + 1700;613;1011 + -Xpch_override=1 %(AdditionalOptions) + PSVita\Iggy\include;%(AdditionalIncludeDirectories) + Level3 + false + Branchless2 + Yes + Cpp11 + true + true + + + true + $(OutDir)$(ProjectName).pdb + -lSceGxm_stub;-lSceAppUtil_stub;-lSceCommonDialog_stub;-lSceDisplay_stub;-lSceTouch_stub;-lSceCtrl_stub;-lSceAudio_stub;-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;libSceHttp_stub.a;libSceNet_stub.a;libSceSsl_stub.a;libSceNetCtl_stub.a;libSceNpManager_stub.a;libSceNpBasic_stub.a;libSceNpCommon_stub.a;libSceNpUtility_stub.a;libSceNpMatching2_stub.a;libSceNpScore_stub.a;libSceNpToolkit.a;libSceNpToolkitUtils.a;libSceNpTrophy_stub.a;libSceRudp_stub_weak.a;libSceVoice_stub.a;libSceNetAdhocMatching_stub.a;libScePspnetAdhoc_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;libSceAppMgr_stub.a;libSceSysmodule_stub.a;libSceCommonDialog_stub.a;libSceCtrl_stub.a;libSceGxm_stub.a;libSceDisplay_stub.a;libSceSystemGesture_stub.a;libSceTouch_stub.a;libSceFios2_stub.a;libSceAppUtil_stub.a;libSceNearUtil_stub.a;libScePower_stub.a;..\Minecraft.Client\PSVita\4JLibs\libs\4J_Input.a;..\Minecraft.Client\PSVita\4JLibs\libs\4J_Profile.a;..\Minecraft.Client\PSVita\4JLibs\libs\4J_Render.a;..\Minecraft.Client\PSVita\4JLibs\libs\4J_Storage.a;..\Minecraft.Client\Common\Network\Sony\sceRemoteStorage\psvita\lib\sceRemoteStorage.a + StripFuncsAndData + --strip-duplicates + None + + + $(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 + + + xcopy /I /Y "$(SCE_PSP2_SDK_DIR)\target\sce_module" "$(TargetDir)\sce_module\" +if not exist "$(TargetDir)\savedata" mkdir "$(TargetDir)\savedata" + + + + + Level3 + Use + Full + true + true + ProgramDatabase + Speed + Sync + false + $(OutDir)$(ProjectName).pch + MultiThreaded + _CONTENT_PACKAGE;_FINAL_BUILD;_ITERATOR_DEBUG_LEVEL=0;_SECURE_SCL=0;%(PreprocessorDefinitions) + true + true + Disabled + Default + 1700;613;1011 + -Xpch_override=1 %(AdditionalOptions) + PS3\Iggy\include;%(AdditionalIncludeDirectories) + Levels + true + Branchless2 + Yes + + + true + true + false + $(OutDir)default.pdb + true + $(OutDir)Minecraft.World.a;ps3\4JLibs\libs\4j_Render.a;ps3\4JLibs\libs\4j_Input.a;ps3\4JLibs\libs\4j_Storage.a;ps3\4JLibs\libs\4j_Profile.a;ps3\Miles\lib\mssps3.a;ps3\Miles\lib\audps3.a;ps3\Miles\lib\spu\mssppu_spurs.a;ps3\Miles\lib\BinkAPS3.A;PS3\Iggy\lib\libiggy_ps3.a;ps3\Miles\lib\mssspurs.o;ps3\Edge\lib\libedgezlib.a;Common\Network\Sony\sceRemoteStorage\ps3\lib\sceRemoteStorage.a;libsntuner.a;libpngdec_stub.a;libpngenc_stub.a;libnet_stub.a;libsysutil_savedata_stub.a;libsysutil_userinfo_stub.a;libsysutil_np_trophy_stub.a;libsysutil_game_stub.a;libhttp_stub.a;libhttp_util_stub.a;libssl_stub.a;libjpgdec_stub.a;libjpgenc_stub.a;libsysutil_avc2_stub.a;libsysutil_np_commerce2_stub.a;libsysutil_avconf_ext_stub.a;libsysutil_screenshot_stub.a;libsysutil_np_tus_stub.a;-lresc_stub;-lgcm_cmd;-lgcm_sys_stub;-lsysmodule_stub;-lm;-lsysutil_stub;-lio_stub;-ldbgfont_gcm;-lpthread;-lpadfilter;-lcgb;-laudio_stub;-lfs_stub;-lspurs_stub;-lspurs_jq_stub;-lrtc_stub;-lsysutil_oskdialog_ext_stub;-ll10n_stub;-lsysutil_np_stub;-lsysutil_np2_stub;-lnetctl_stub;-lnet_stub;-lrudp_stub;-lsysutil_avconf_ext_stub;%(AdditionalDependencies) + xapilib.lib + false + false + ELFFile + FullMapFile + --no-toc-restore --strip-duplicates --ppuguid %(AdditionalOptions) + None + StripFuncsAndData + + + $(ProjectDir)xbox\xex.xml + 1480659447 + 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO + + + CopyToHardDrive + $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech + + + + + Level3 + Use + Full + true + true + ProgramDatabase + Speed + Sync + false + $(OutDir)$(ProjectName).pch + MultiThreaded + _EXTENDED_ACHIEVEMENTS;_CONTENT_PACKAGE;_FINAL_BUILD;_ITERATOR_DEBUG_LEVEL=0;_SECURE_SCL=0;__PSVITA__;%(PreprocessorDefinitions) + true + true + Disabled + Default + 1700;613;1011 + -Xpch_override=1 %(AdditionalOptions) + PS3\Iggy\include;%(AdditionalIncludeDirectories) + Levels + true + Branchless2 + Yes + Cpp11 + + + true + true + false + $(OutDir)default.pdb + true + $(OutDir)Minecraft.World.a + xapilib.lib + false + false + ELFFile + FullMapFile + --strip-duplicates + None + StripFuncsAndData + + + $(ProjectDir)xbox\xex.xml + 1480659447 + 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO + + + CopyToHardDrive + $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech + + + + + Level3 + Use + Full + true + true + ProgramDatabase + Speed + Sync + false + $(OutDir)$(ProjectName).pch + MultiThreaded + _RELEASE_FOR_ART;_DEBUG_MENUS_ENABLED;_ITERATOR_DEBUG_LEVEL=0;_SECURE_SCL=0;%(PreprocessorDefinitions) + true + true + Disabled + Default + 1700;613;1011 + -Xpch_override=1 %(AdditionalOptions) + PS3\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) + Level2 + false + Branchless2 + $(ProjectDir)\..\Minecraft.Client\PS3\Assert + + + true + true + false + $(OutDir)default.pdb + true + $(OutDir)Minecraft.World.a;ps3\4JLibs\libs\4j_Render_r.a;ps3\4JLibs\libs\4j_Input_r.a;ps3\4JLibs\libs\4j_Storage_r.a;ps3\4JLibs\libs\4j_Profile_r.a;ps3\Miles\lib\mssps3.a;ps3\Miles\lib\mssspurs.o;ps3\Miles\lib\audps3.a;ps3\Miles\lib\BinkAPS3.A;ps3\Miles\lib\spu\mssppu_spurs.a;PS3\Iggy\lib\libiggy_ps3.a;Common\Network\Sony\sceRemoteStorage\ps3\lib\sceRemoteStorage.a;PS3\PS3Extras\HeapInspector\Server\PS3\Release_RTTI_EH\libHeapInspectorServer.a;libsntuner.a;libpngdec_stub.a;libpngenc_stub.a;libjpgdec_stub.a;libjpgenc_stub.a;libnet_stub.a;libedgezlib_dbg.a;libsysutil_savedata_stub.a;libsysutil_userinfo_stub.a;libsysutil_np_trophy_stub.a;libsysutil_game_stub.a;libsysutil_avc2_stub.a;libsysutil_np_commerce2_stub.a;libsysutil_avconf_ext_stub.a;libhttp_stub.a;libhttp_util_stub.a;libssl_stub.a;libsysutil_screenshot_stub.a;libsysutil_np_tus_stub.a;-lresc_stub;-lgcm_cmd;-lgcm_sys_stub;-lsysmodule_stub;-lm;-lsysutil_stub;-lio_stub;-ldbgfont_gcm;-lpthread;-lpadfilter;-lcgb;-laudio_stub;-lfs_stub;-lspurs_stub;-lspurs_jq_stub;-lrtc_stub;-lsysutil_oskdialog_ext_stub;-ll10n_stub;-lsysutil_np_stub;-lsysutil_np2_stub;-lnetctl_stub;-lnet_stub;-lrudp_stub;%(AdditionalDependencies) + xapilib.lib + false + false + FSELFFile + None + + + StripFuncsAndData + + + $(ProjectDir)xbox\xex.xml + 1480659447 + 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO + + + CopyToHardDrive + $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech + + + + + Level3 + Use + Full + true + true + ProgramDatabase + Speed + Sync + false + $(OutDir)$(ProjectName).pch + MultiThreaded + _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) + PSVita\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) + Level3 + true + Branchless2 + Cpp11 + true + + + true + true + false + $(OutDir)default.pdb + true + -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 + FSELFFile + None + --strip-duplicates + StripFuncsAndData + StripSymsAndDebug + + + $(ProjectDir)xbox\xex.xml + 1480659447 + 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO + + + CopyToHardDrive + $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech + + + + + Level3 + Use + Full + true + true + ProgramDatabase + Speed + Sync + false + $(OutDir)$(ProjectName).pch + MultiThreaded + _TU_BUILD;_FINAL_BUILD;_ITERATOR_DEBUG_LEVEL=0;NDEBUG;_XBOX;_CONTENT_PACKAGE;%(PreprocessorDefinitions); + true + true + Disabled + Default + 1700;613;1011 + -Xpch_override=1 %(AdditionalOptions) + + + 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 + StripFuncsAndData + + + $(ProjectDir)xbox\xex.xml + 1480659447 + 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO + + + CopyToHardDrive + $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech + + + + + Level3 + Use + Full + true + true + ProgramDatabase + Speed + Sync + false + $(OutDir)$(ProjectName).pch + MultiThreaded + _EXTENDED_ACHIEVEMENTS;_TU_BUILD;_FINAL_BUILD;_ITERATOR_DEBUG_LEVEL=0;NDEBUG;_XBOX;__PSVITA__;_CONTENT_PACKAGE;%(PreprocessorDefinitions) + true + true + Disabled + Default + 1700;613;1011 + -Xpch_override=1 %(AdditionalOptions) + Cpp11 + + + true + true + false + $(OutDir)default.pdb + true + $(OutDir)Minecraft.World.a + xapilib.lib + false + false + StripFuncsAndData + --strip-duplicates + + + $(ProjectDir)xbox\xex.xml + 1480659447 + 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO + + + CopyToHardDrive + $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech + + + + + Level3 + Use + Full + true + true + ProgramDatabase + Speed + Sync + false + $(OutDir)$(ProjectName).pch + MultiThreaded + _TU_BUILD;_FINAL_BUILD;_ITERATOR_DEBUG_LEVEL=0;NDEBUG;_XBOX;_CONTENT_PACKAGE;%(PreprocessorDefinitions); + true + true + Disabled + Default + + + true + true + false + $(OutDir)default.pdb + true + xavatar2.lib;xapilib.lib;d3d9.lib;d3dx9.lib;xgraphics.lib;xboxkrnl.lib;xbox\Sentient\libs\SenCore.lib;xnet.lib;xaudio2.lib;xact3.lib;x3daudio.lib;xmcore.lib;vcomp.lib;xuirun.lib;xuirender.lib;xuihtml.lib;xonline.lib;xhv2.lib;qnetxaudio2.lib;xbox\4JLibs\libs\4J_Input.lib;xbox\4JLibs\libs\4J_Storage.lib;xbox\4JLibs\libs\4J_Profile.lib;xbox\4JLibs\libs\4J_Render.lib;..\Minecraft.World\ContentPackage\Minecraft.World.lib;xsocialpost.lib;xrnm.lib;xparty.lib;xbox\Sentient\libs\SenNews.lib;xbox\Sentient\libs\SenUGC.lib;xbox\Sentient\libs\SenBoxArt.lib;NuiApi.lib;ST.lib;NuiFitnessApi.lib;NuiHandles.lib;NuiSpeech.lib;NuiAudio.lib;xhttp.lib;xauth.lib;xgetserviceendpoint.lib;xav.lib;xjson.lib;%(AdditionalDependencies) + xapilib.lib + false + false + + + $(ProjectDir)xbox\xex.xml + 1480659447 + 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO + + + CopyToHardDrive + $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech + + + + + Level3 + Use + Full + true + true + ProgramDatabase + Speed + Sync + false + $(OutDir)$(ProjectName).pch + MultiThreaded + _TU_BUILD;_FINAL_BUILD;_ITERATOR_DEBUG_LEVEL=0;NDEBUG;_XBOX;_CONTENT_PACKAGE;%(PreprocessorDefinitions); + true + true + Disabled + Default + + + true + true + false + $(OutDir)default.pdb + true + xavatar2.lib;xapilib.lib;d3d9.lib;d3dx9.lib;xgraphics.lib;xboxkrnl.lib;xbox\Sentient\libs\SenCore.lib;xnet.lib;xaudio2.lib;xact3.lib;x3daudio.lib;xmcore.lib;vcomp.lib;xuirun.lib;xuirender.lib;xuihtml.lib;xonline.lib;xhv2.lib;qnetxaudio2.lib;xbox\4JLibs\libs\4J_Input.lib;xbox\4JLibs\libs\4J_Storage.lib;xbox\4JLibs\libs\4J_Profile.lib;xbox\4JLibs\libs\4J_Render.lib;..\Minecraft.World\ContentPackage\Minecraft.World.lib;xsocialpost.lib;xrnm.lib;xparty.lib;xbox\Sentient\libs\SenNews.lib;xbox\Sentient\libs\SenUGC.lib;xbox\Sentient\libs\SenBoxArt.lib;NuiApi.lib;ST.lib;NuiFitnessApi.lib;NuiHandles.lib;NuiSpeech.lib;NuiAudio.lib;xhttp.lib;xauth.lib;xgetserviceendpoint.lib;xav.lib;xjson.lib;%(AdditionalDependencies) + xapilib.lib + false + false + + + $(ProjectDir)xbox\xex.xml + 1480659447 + 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO + + + CopyToHardDrive + $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech + + + + + Level3 + Use + Full + true + true + ProgramDatabase + Speed + Sync + false + $(OutDir)$(ProjectName).pch + MultiThreaded + _TU_BUILD;_FINAL_BUILD;_ITERATOR_DEBUG_LEVEL=0;NDEBUG;_CONTENT_PACKAGE;%(PreprocessorDefinitions) + true + true + Disabled + Default + + + true + true + false + $(OutDir)default.pdb + true + xavatar2.lib;xapilib.lib;d3d9.lib;d3dx9.lib;xgraphics.lib;xboxkrnl.lib;xbox\Sentient\libs\SenCore.lib;xnet.lib;xaudio2.lib;xact3.lib;x3daudio.lib;xmcore.lib;vcomp.lib;xuirun.lib;xuirender.lib;xuihtml.lib;xonline.lib;xhv2.lib;qnetxaudio2.lib;xbox\4JLibs\libs\4J_Input.lib;xbox\4JLibs\libs\4J_Storage.lib;xbox\4JLibs\libs\4J_Profile.lib;xbox\4JLibs\libs\4J_Render.lib;..\Minecraft.World\ContentPackage\Minecraft.World.lib;xsocialpost.lib;xrnm.lib;xparty.lib;xbox\Sentient\libs\SenNews.lib;xbox\Sentient\libs\SenUGC.lib;xbox\Sentient\libs\SenBoxArt.lib;NuiApi.lib;ST.lib;NuiFitnessApi.lib;NuiHandles.lib;NuiSpeech.lib;NuiAudio.lib;xhttp.lib;xauth.lib;xgetserviceendpoint.lib;xav.lib;xjson.lib;%(AdditionalDependencies) + xapilib.lib + false + false + + + $(ProjectDir)xbox\xex.xml + 1480659447 + 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO + + + CopyToHardDrive + $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech + + + + + Level3 + Use + Full + true + true + ProgramDatabase + Speed + Sync + false + $(OutDir)$(ProjectName).pch + MultiThreaded + _TU_BUILD;_FINAL_BUILD;_ITERATOR_DEBUG_LEVEL=0;NDEBUG;_CONTENT_PACKAGE;%(PreprocessorDefinitions) + true + true + Disabled + Default + + + true + true + false + $(OutDir)default.pdb + true + xavatar2.lib;xapilib.lib;d3d9.lib;d3dx9.lib;xgraphics.lib;xboxkrnl.lib;xbox\Sentient\libs\SenCore.lib;xnet.lib;xaudio2.lib;xact3.lib;x3daudio.lib;xmcore.lib;vcomp.lib;xuirun.lib;xuirender.lib;xuihtml.lib;xonline.lib;xhv2.lib;qnetxaudio2.lib;xbox\4JLibs\libs\4J_Input.lib;xbox\4JLibs\libs\4J_Storage.lib;xbox\4JLibs\libs\4J_Profile.lib;xbox\4JLibs\libs\4J_Render.lib;..\Minecraft.World\ContentPackage\Minecraft.World.lib;xsocialpost.lib;xrnm.lib;xparty.lib;xbox\Sentient\libs\SenNews.lib;xbox\Sentient\libs\SenUGC.lib;xbox\Sentient\libs\SenBoxArt.lib;NuiApi.lib;ST.lib;NuiFitnessApi.lib;NuiHandles.lib;NuiSpeech.lib;NuiAudio.lib;xhttp.lib;xauth.lib;xgetserviceendpoint.lib;xav.lib;xjson.lib;%(AdditionalDependencies) + xapilib.lib + false + false + + + $(ProjectDir)xbox\xex.xml + 1480659447 + 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO + + + CopyToHardDrive + $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech + + + + + Level3 + Use + Full + true + true + ProgramDatabase + Speed + Sync + false + $(OutDir)$(ProjectName).pch + MultiThreaded + _TU_BUILD;_FINAL_BUILD;_ITERATOR_DEBUG_LEVEL=0;NDEBUG;_XBOX;_CONTENT_PACKAGE;%(PreprocessorDefinitions); + true + true + Disabled + Default + + + true + true + false + $(OutDir)default.pdb + true + xavatar2.lib;xapilib.lib;d3d9.lib;d3dx9.lib;xgraphics.lib;xboxkrnl.lib;xbox\Sentient\libs\SenCore.lib;xnet.lib;xaudio2.lib;xact3.lib;x3daudio.lib;xmcore.lib;vcomp.lib;xuirun.lib;xuirender.lib;xuihtml.lib;xonline.lib;xhv2.lib;qnetxaudio2.lib;xbox\4JLibs\libs\4J_Input.lib;xbox\4JLibs\libs\4J_Storage.lib;xbox\4JLibs\libs\4J_Profile.lib;xbox\4JLibs\libs\4J_Render.lib;..\Minecraft.World\ContentPackage\Minecraft.World.lib;xsocialpost.lib;xrnm.lib;xparty.lib;xbox\Sentient\libs\SenNews.lib;xbox\Sentient\libs\SenUGC.lib;xbox\Sentient\libs\SenBoxArt.lib;NuiApi.lib;ST.lib;NuiFitnessApi.lib;NuiHandles.lib;NuiSpeech.lib;NuiAudio.lib;xhttp.lib;xauth.lib;xgetserviceendpoint.lib;xav.lib;xjson.lib;%(AdditionalDependencies) + xapilib.lib + false + false + + + $(ProjectDir)xbox\xex.xml + 1480659447 + 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO + + + CopyToHardDrive + $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech + + + + + Level3 + Use + Full + true + true + ProgramDatabase + Speed + Sync + false + $(OutDir)$(ProjectName).pch + MultiThreaded + _TU_BUILD;_FINAL_BUILD;_ITERATOR_DEBUG_LEVEL=0;NDEBUG;_XBOX;_CONTENT_PACKAGE;%(PreprocessorDefinitions); + true + true + Disabled + Default + + + true + true + false + $(OutDir)default.pdb + true + xavatar2.lib;xapilib.lib;d3d9.lib;d3dx9.lib;xgraphics.lib;xboxkrnl.lib;xbox\Sentient\libs\SenCore.lib;xnet.lib;xaudio2.lib;xact3.lib;x3daudio.lib;xmcore.lib;vcomp.lib;xuirun.lib;xuirender.lib;xuihtml.lib;xonline.lib;xhv2.lib;qnetxaudio2.lib;xbox\4JLibs\libs\4J_Input.lib;xbox\4JLibs\libs\4J_Storage.lib;xbox\4JLibs\libs\4J_Profile.lib;xbox\4JLibs\libs\4J_Render.lib;..\Minecraft.World\ContentPackage\Minecraft.World.lib;xsocialpost.lib;xrnm.lib;xparty.lib;xbox\Sentient\libs\SenNews.lib;xbox\Sentient\libs\SenUGC.lib;xbox\Sentient\libs\SenBoxArt.lib;NuiApi.lib;ST.lib;NuiFitnessApi.lib;NuiHandles.lib;NuiSpeech.lib;NuiAudio.lib;xhttp.lib;xauth.lib;xgetserviceendpoint.lib;xav.lib;xjson.lib;%(AdditionalDependencies) + xapilib.lib + false + false + + + $(ProjectDir)xbox\xex.xml + 1480659447 + 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO + + + CopyToHardDrive + $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech + + + + + Level3 + Use + Full + true + true + ProgramDatabase + Speed + Sync + false + $(OutDir)$(ProjectName).pch + MultiThreaded + _TU_BUILD;_FINAL_BUILD;_ITERATOR_DEBUG_LEVEL=0;NDEBUG;_XBOX;_CONTENT_PACKAGE;%(PreprocessorDefinitions); + true + true + Disabled + Default + + + true + true + false + $(OutDir)default.pdb + true + xavatar2.lib;xapilib.lib;d3d9.lib;d3dx9.lib;xgraphics.lib;xboxkrnl.lib;xbox\Sentient\libs\SenCore.lib;xnet.lib;xaudio2.lib;xact3.lib;x3daudio.lib;xmcore.lib;vcomp.lib;xuirun.lib;xuirender.lib;xuihtml.lib;xonline.lib;xhv2.lib;qnetxaudio2.lib;xbox\4JLibs\libs\4J_Input.lib;xbox\4JLibs\libs\4J_Storage.lib;xbox\4JLibs\libs\4J_Profile.lib;xbox\4JLibs\libs\4J_Render.lib;..\Minecraft.World\ContentPackage\Minecraft.World.lib;xsocialpost.lib;xrnm.lib;xparty.lib;xbox\Sentient\libs\SenNews.lib;xbox\Sentient\libs\SenUGC.lib;xbox\Sentient\libs\SenBoxArt.lib;NuiApi.lib;ST.lib;NuiFitnessApi.lib;NuiHandles.lib;NuiSpeech.lib;NuiAudio.lib;xhttp.lib;xauth.lib;xgetserviceendpoint.lib;xav.lib;xjson.lib;%(AdditionalDependencies) + xapilib.lib + false + false + + + $(ProjectDir)xbox\xex.xml + 1480659447 + 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO + + + CopyToHardDrive + $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech + + + + + Level3 + Use + Full + true + true + ProgramDatabase + Speed + Sync + false + $(OutDir)$(ProjectName).pch + MultiThreaded + _TU_BUILD;_FINAL_BUILD;_ITERATOR_DEBUG_LEVEL=0;NDEBUG;_XBOX;_CONTENT_PACKAGE;%(PreprocessorDefinitions); + true + true + Disabled + Default + + + true + true + false + $(OutDir)default.pdb + true + xavatar2.lib;xapilib.lib;d3d9.lib;d3dx9.lib;xgraphics.lib;xboxkrnl.lib;xbox\Sentient\libs\SenCore.lib;xnet.lib;xaudio2.lib;xact3.lib;x3daudio.lib;xmcore.lib;vcomp.lib;xuirun.lib;xuirender.lib;xuihtml.lib;xonline.lib;xhv2.lib;qnetxaudio2.lib;xbox\4JLibs\libs\4J_Input.lib;xbox\4JLibs\libs\4J_Storage.lib;xbox\4JLibs\libs\4J_Profile.lib;xbox\4JLibs\libs\4J_Render.lib;..\Minecraft.World\ContentPackage\Minecraft.World.lib;xsocialpost.lib;xrnm.lib;xparty.lib;xbox\Sentient\libs\SenNews.lib;xbox\Sentient\libs\SenUGC.lib;xbox\Sentient\libs\SenBoxArt.lib;NuiApi.lib;ST.lib;NuiFitnessApi.lib;NuiHandles.lib;NuiSpeech.lib;NuiAudio.lib;xhttp.lib;xauth.lib;xgetserviceendpoint.lib;xav.lib;xjson.lib;%(AdditionalDependencies) + xapilib.lib + false + false + + + $(ProjectDir)xbox\xex.xml + 1480659447 + 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO + + + CopyToHardDrive + $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech + + + + + Level3 + Use + MaxSpeed + true + true + ProgramDatabase + Speed + Sync + false + $(OutDir)$(ProjectName).pch + MultiThreadedDLL + SPLIT_SAVES;_LARGE_WORLDS;_EXTENDED_ACHIEVEMENTS;_FINAL_BUILD;_CONTENT_PACKAGE;NDEBUG;__WRL_NO_DEFAULT_LIB__;_XM_AVX_INTRINSICS_;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + true + true + Disabled + Default + Durango\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) + true + false + $(ForcedInc) + + + true + true + false + $(OutDir)$(ProjectName).pdb + false + ws2_32.lib;d3d11_x.lib;combase.lib;kernelx.lib;uuid.lib;xaudio2.lib;..\Minecraft.World\Durango_ContentPackage\Minecraft.World.lib;EtwPlus.lib;..\Minecraft.Client\Durango\DurangoExtras\xcompress.lib + kernel32.lib;oldnames.lib;runtimeobject.lib;ole32.lib + true + false + Console + + + $(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 + + + xcopy /q /y /i /s /e $(ProjectDir)Common\res $(LayoutDir)Image\Loose\Common\res +xcopy /q /y /i /s /e $(ProjectDir)Common\media\font\*.ttf $(LayoutDir)Image\Loose\Common\media\font +xcopy /q /y $(ProjectDir)Durango\*.png $(LayoutDir)Image\Loose +xcopy /q /y $(ProjectDir)Common\media\MediaDurango.arc $(LayoutDir)Image\Loose\Common\media +xcopy /q /y /i /s /e $(ProjectDir)Durango\Sound $(LayoutDir)Image\Loose\Sound +xcopy /q /y /i /s /e $(ProjectDir)music $(LayoutDir)Image\Loose\music +copy /B /Y $(ProjectDir)Durango\DurangoExtras\xcompress.dll $(LayoutDir)Image\Loose\ +xcopy /q /y $(ProjectDir)Durango\DLCImages\*.png $(LayoutDir)Image\Loose\DLCImages\ +xcopy /q /y $(ProjectDir)Durango\DLCXbox1.cmp $(LayoutDir)Image\Loose +xcopy /q /y $(ProjectDir)DurangoMedia\DLC $(LayoutDir)Image\Loose\DLC +xcopy /q /y /i /s /e $(ProjectDir)DurangoMedia\Tutorial $(LayoutDir)Image\Loose\Tutorial +xcopy /q /y /i /s /e $(ProjectDir)DurangoMedia\CU $(LayoutDir)Image\Loose\CU + + + Copying files for deployment + + + Autogenerated.appxmanifest + + + call $(ProjectDir)\Build\XboxOne\AppxPrebuild.cmd $(ProjectDir) + + + _UNICODE;UNICODE;%(PreprocessorDefinitions) + + + + + 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 + + + xcopy /q /y /i /s /e $(ProjectDir)Common\res $(LayoutDir)Image\Loose\Common\res + + + Copying files for deployment + + + call $(ProjectDir)\DurangoBuild\AppxPrebuild.cmd $(ProjectDir) + + + + + 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;..\Minecraft.Client\Durango\DurangoExtras\xcompress.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 + + + xcopy /q /y /i /s /e $(ProjectDir)Common\res $(LayoutDir)Image\Loose\Common\res +xcopy /q /y /i /s /e $(ProjectDir)Common\media\font\*.ttf $(LayoutDir)Image\Loose\Common\media\font +xcopy /q /y $(ProjectDir)Durango\*.png $(LayoutDir)Image\Loose +xcopy /q /y $(ProjectDir)Common\media\MediaDurango.arc $(LayoutDir)Image\Loose\Common\media +xcopy /q /y /i /s /e $(ProjectDir)Durango\Sound $(LayoutDir)Image\Loose\Sound +xcopy /q /y /i /s /e $(ProjectDir)music $(LayoutDir)Image\Loose\music +xcopy /q /y /i /s /e $(ProjectDir)DurangoMedia\DLC $(LayoutDir)Image\Loose\DLC +copy /B /Y $(ProjectDir)Durango\DurangoExtras\xcompress.dll $(LayoutDir)Image\Loose\ +xcopy /q /y $(ProjectDir)Durango\DLCImages\*.png $(LayoutDir)Image\Loose\DLCImages\ +xcopy /q /y $(ProjectDir)Durango\DLCXbox1.cmp $(LayoutDir)Image\Loose +xcopy /q /y $(ProjectDir)DurangoMedia\DLC $(LayoutDir)Image\Loose\DLC +xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU + + + Copying files for deployment + + + call $(ProjectDir)\DurangoBuild\AppxPrebuild.cmd $(ProjectDir) + + + + + 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 + + + xcopy /q /y /i /s /e $(ProjectDir)Common\res $(LayoutDir)Image\Loose\Common\res + + + Copying files for deployment + + + call $(ProjectDir)\DurangoBuild\AppxPrebuild.cmd $(ProjectDir) + + + + + 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 + + + xcopy /q /y /i /s /e $(ProjectDir)Common\res $(LayoutDir)Image\Loose\Common\res + + + Copying files for deployment + + + + + WarningsOff + true + Use + $(OutDir)$(ProjectName).pch + true + true + Level2 + Orbis\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) + SPLIT_SAVES;_LARGE_WORLDS;_EXTENDED_ACHIEVEMENTS;_DEBUG_MENUS_ENABLED + + + ..\Minecraft.World\ORBIS_Release\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;%(AdditionalDependencies) + true + + + false + + + + + WarningsOff + true + Use + $(OutDir)$(ProjectName).pch + true + true + Level2 + Orbis\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) + SPLIT_SAVES;_LARGE_WORLDS;_EXTENDED_ACHIEVEMENTS;_DEBUG_MENUS_ENABLED + + + ..\Minecraft.World\ORBIS_Release\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;%(AdditionalDependencies) + true + + + false + + + + + Use + $(OutDir)$(ProjectName).pch + true + Level3 + true + true + Orbis\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) + SPLIT_SAVES;_LARGE_WORLDS;_EXTENDED_ACHIEVEMENTS;_CONTENT_PACKAGE;_FINAL_BUILD + false + true + + + false + + + ..\ORBIS_ContentPackage\Minecraft.World.a;Orbis\4JLibs\libs\4j_Render.a;Orbis\4JLibs\libs\4j_Input.a;Orbis\4JLibs\libs\4J_Storage.a;Orbis\4JLibs\libs\4J_Profile.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;-lSceRudp_stub_weak;-lSceAppContent_stub_weak;-lSceVoice_stub_weak;-lSceAudioIn_stub_weak;-lSceRemoteplay_stub_weak;-lSceSaveDataDialog_stub_weak;-lSceNpSnsFacebookDialog_stub_weak;-lSceErrorDialog_stub_weak;-lSceMsgDialog_stub_weak;-lSceGameLiveStreaming_stub_weak + + + None + + + StripFuncsAndData + + + + + Use + $(OutDir)$(ProjectName).pch + true + Orbis\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) + SPLIT_SAVES;_LARGE_WORLDS;_EXTENDED_ACHIEVEMENTS;_CONTENT_PACKAGE;_FINAL_BUILD + Level3 + true + true + false + true + + + false + + + ..\ORBIS_ContentPackage\Minecraft.World.a;Orbis\4JLibs\libs\4j_Render.a;Orbis\4JLibs\libs\4j_Input.a;Orbis\4JLibs\libs\4J_Storage.a;Orbis\4JLibs\libs\4J_Profile.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;-lSceRudp_stub_weak;-lSceAppContent_stub_weak;-lSceVoice_stub_weak;-lSceAudioIn_stub_weak;-lSceRemoteplay_stub_weak;-lSceSaveDataDialog_stub_weak + StripFuncsAndData + + + + + Use + $(OutDir)$(ProjectName).pch + true + Orbis\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) + SPLIT_SAVES;_LARGE_WORLDS;_EXTENDED_ACHIEVEMENTS;_DEBUG_MENUS_ENABLED;_ART_BUILD + WarningsOff + Levels + + + false + + + StripSymsAndDebug + + + 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;-lSceGameLiveStreaming_stub_weak + + + + + Use + $(OutDir)$(ProjectName).pch + true + + + false + + + + + Use + $(OutDir)$(ProjectName).pch + true + true + WarningsOff + true + true + Orbis\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) + SPLIT_SAVES;_LARGE_WORLDS;_EXTENDED_ACHIEVEMENTS;_DEBUG_MENUS_ENABLED;_DEBUG;%(PreprocessorDefinitions) + + + ..\Minecraft.World\ORBIS_Debug\Minecraft.World.a;Orbis\4JLibs\libs\4j_Render_d.a;Orbis\4JLibs\libs\4j_Input_d.a;Orbis\4JLibs\libs\4J_Storage_d.a;Orbis\4JLibs\libs\4J_Profile_d.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;-lScePerf_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;-lSceRudp_stub_weak;-lSceAppContent_stub_weak;-lSceVoice_stub_weak;-lSceAudioIn_stub_weak;-lSceNpSnsFacebookDialog_stub_weak;-lSceRemotePlay_stub_weak;-lSceSaveDataDialog_stub_weak;-lSceErrorDialog_stub_weak;-lSceMsgDialog_stub_weak;-lSceGameLiveStreaming_stub_weak + + + false + + + + + + XML + Designer + + + true + true + true + true + true + + + true + true + true + true + true + + + true + true + true + true + true + + + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + + true + true + true + true + true + true + true + true + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + false + true + false + true + true + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + 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 + true + true + true + true + true + true + true + true + true + true + false + true + true + true + true + true + true + true + true + true + true + false + true + false + true + false + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + false + false + true + true + true + true + true + true + true + true + true + true + false + true + true + true + true + true + true + true + true + true + true + false + true + false + true + false + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + 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 + 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 + false + false + false + false + false + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + + + + + + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + Designer + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + 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 + + + + + + + + + + + + + + + + + + + + + + + + + false + false + false + false + false + false + false + false + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + 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 + false + false + false + false + false + false + false + + + 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 + false + false + false + false + false + false + false + + + 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 + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + false + false + false + false + false + false + false + + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + true + false + false + false + false + true + + + true + true + true + true + true + true + true + false + true + false + false + false + false + true + + + true + true + true + true + true + true + true + false + true + false + false + false + false + true + + + true + true + true + true + true + true + true + false + true + false + false + false + false + true + + + true + true + true + true + true + true + true + false + true + false + false + false + false + true + + + true + true + true + true + true + true + true + false + true + false + false + false + false + true + + + true + true + true + true + true + true + true + false + true + false + false + false + false + true + + + true + true + true + true + true + true + true + false + true + false + false + false + false + true + + + true + true + true + true + true + true + true + false + true + false + false + false + false + true + + + true + true + true + true + true + true + true + false + true + false + false + false + false + true + + + true + true + true + true + true + true + true + false + true + false + false + false + false + true + + + true + true + true + true + true + true + true + false + + + true + true + true + true + true + true + true + false + true + false + false + false + false + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + false + false + false + false + false + false + false + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + true + false + false + false + false + true + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + true + false + false + false + false + true + + + true + true + true + true + true + true + true + false + true + false + false + false + false + true + + + true + true + true + true + true + true + true + false + true + false + false + false + false + true + + + true + true + true + true + true + true + true + false + true + false + false + false + false + true + + + true + true + true + true + true + true + true + false + true + false + false + false + false + true + + + true + true + true + true + true + true + true + false + true + false + false + false + false + true + + + true + true + true + true + true + true + true + false + true + false + false + false + false + true + + + true + true + true + true + true + true + true + false + true + false + false + false + false + true + + + true + true + true + true + true + true + true + false + true + false + false + false + false + true + + + true + true + true + true + true + true + true + false + true + false + false + false + false + true + + + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + 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 + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + + + 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 + false + false + true + true + true + true + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + false + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + true + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + false + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + 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 + true + true + true + true + true + true + true + true + true + true + true + true + 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 + true + true + true + true + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + false + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + true + true + true + false + true + true + true + true + true + true + false + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + false + true + false + true + false + true + false + true + false + true + false + false + true + true + + + true + true + true + true + true + true + true + false + true + false + true + false + true + false + true + false + true + false + false + true + true + + + true + true + true + true + true + true + true + false + true + false + true + false + true + false + true + false + true + false + false + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + false + true + false + true + false + true + false + true + false + true + false + false + true + true + + + true + true + true + true + true + true + true + false + true + false + true + false + true + false + true + false + true + false + false + true + true + + + true + true + true + true + true + true + true + false + true + false + true + false + true + false + true + false + true + false + false + true + true + + + true + true + true + true + true + true + true + false + true + false + true + false + true + false + true + false + true + false + false + true + true + + + true + true + true + true + true + true + true + false + true + false + true + false + true + false + true + false + true + false + false + true + true + + + true + true + true + true + true + true + true + false + true + false + true + false + true + false + true + false + true + false + false + true + true + + + true + true + true + true + true + true + true + false + true + false + true + false + true + false + true + false + true + false + false + true + true + + + true + true + true + true + true + true + true + false + true + false + true + false + true + false + true + false + true + false + false + true + true + + + + + true + true + true + true + true + true + true + true + true + + + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + + + + + + + + + + + + + + + true + true + true + true + true + true + true + true + true + + + + + + + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + 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 + 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 + + + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + + + true + true + true + true + true + + + true + true + true + true + true + + + true + true + true + true + true + + + true + true + true + true + true + + + true + true + true + true + true + + + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + + + + + + + + + + + + + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + 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 + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + 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 + true + true + true + true + true + true + true + true + true + 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 + true + true + true + true + true + true + true + true + true + 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 + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + 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 + true + true + false + true + true + true + true + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + + + + + + + + + + + + + + + + + + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + 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 + false + false + + + + + + false + false + false + false + false + false + false + false + false + + + false + false + false + false + false + false + false + false + false + + + false + false + false + false + false + false + false + false + false + + + false + false + false + false + false + false + false + false + false + + + + + + + + true + true + true + true + true + true + true + true + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + 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 + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + false + true + true + true + true + true + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + false + false + true + true + true + true + true + true + true + true + true + true + true + false + true + true + true + true + true + true + true + true + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + + + + + + + true + true + true + true + true + true + true + true + true + + + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + 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 + true + true + true + true + true + true + true + true + true + true + false + true + true + true + true + true + true + true + true + true + true + false + true + false + true + false + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + + + true + true + true + true + false + false + true + true + true + true + true + true + true + true + true + true + false + true + true + true + true + true + true + true + true + true + true + false + true + false + true + false + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + true + true + true + true + true + false + true + false + true + false + true + true + true + false + true + true + + + true + true + true + true + false + false + true + true + true + true + true + true + true + true + true + true + false + true + true + true + true + true + true + true + true + true + true + false + true + false + true + false + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + false + false + true + true + true + true + true + true + true + true + true + true + false + true + true + true + true + true + true + true + true + true + true + false + true + false + true + false + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + 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 + false + false + false + false + false + false + true + false + true + false + true + false + true + false + false + true + true + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + true + false + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + 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 + true + true + true + true + true + true + true + true + true + true + false + true + true + true + true + true + true + true + true + true + true + false + true + false + true + false + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + true + true + true + true + true + false + false + true + true + true + true + true + true + true + true + false + true + false + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + 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 + false + false + + + + + + false + false + false + false + false + false + false + false + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + false + false + true + false + false + false + false + true + true + false + false + false + false + false + false + true + true + false + false + false + false + false + false + false + false + false + false + false + false + false + + + + + + + + + + + + + + + + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + + + + + + + + + + + + + + + + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + 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 + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + 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 + 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 + 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 + false + false + false + false + false + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + 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 + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + false + false + false + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + 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 + false + false + false + false + false + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + false + false + false + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + false + false + false + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + false + false + false + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + false + false + false + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + false + false + false + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + false + false + false + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + false + false + false + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + false + false + false + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + + + + + + + + + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + 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 + true + true + true + true + false + true + true + true + true + true + true + true + true + true + true + true + true + false + false + false + + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + 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 + true + true + true + true + true + true + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + false + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + true + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + false + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + + + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + 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 + + + + + + + + + + + + + + + + + + + + + + + + + false + false + false + false + false + false + false + false + false + + + + + + true + true + true + true + true + true + true + false + false + false + false + false + false + true + true + false + false + false + false + false + false + false + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + 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 + false + false + false + false + false + false + false + + + 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 + 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 + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + 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 + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + true + false + false + false + false + true + + + true + true + true + true + true + true + true + false + true + false + false + false + false + true + + + true + true + true + true + true + true + true + false + true + false + false + false + false + true + + + true + true + true + true + true + true + true + false + true + false + false + false + false + true + + + true + true + true + true + true + true + true + false + true + false + false + false + false + true + + + true + true + true + true + true + true + true + false + true + false + false + false + false + true + + + true + true + true + true + true + true + true + false + true + false + false + false + false + true + + + true + true + true + true + true + true + true + false + true + false + false + false + false + true + + + true + true + true + true + true + true + true + false + true + false + false + false + false + true + + + true + true + true + true + true + true + true + false + true + false + false + false + false + true + + + true + true + true + true + true + true + true + false + true + false + false + false + false + true + + + true + true + true + true + true + true + true + false + + + true + true + true + true + true + true + true + false + true + false + false + false + false + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + false + false + false + false + false + false + false + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + true + false + false + false + false + true + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + true + false + false + false + false + true + + + true + true + true + true + true + true + true + false + true + false + false + false + false + true + + + true + true + true + true + true + true + true + false + true + false + false + false + false + true + + + true + true + true + true + true + true + true + false + true + false + false + false + false + true + + + true + true + true + true + true + true + true + false + true + false + false + false + false + true + + + true + true + true + true + true + true + true + false + true + false + false + false + false + true + + + true + true + true + true + true + true + true + false + true + false + false + false + false + true + + + true + true + true + true + true + true + true + false + true + false + false + false + false + true + + + true + true + true + true + true + true + true + false + true + false + false + false + false + true + + + true + true + true + true + true + true + true + false + true + false + false + false + false + true + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + 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 + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + + 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 + false + false + true + true + true + true + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + false + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + true + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + false + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + 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 + true + true + true + true + true + true + true + true + true + true + true + true + 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 + true + true + true + true + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + false + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + false + true + false + true + false + true + false + true + false + true + false + false + true + true + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + false + false + false + false + + + NotUsing + + + true + true + true + true + true + true + true + false + true + false + true + false + true + false + true + false + true + false + false + true + true + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + false + false + false + NotUsing + false + + + true + true + true + true + true + true + true + false + true + false + true + false + true + false + true + false + true + false + false + true + true + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + false + false + false + NotUsing + false + + + true + true + true + true + true + true + true + false + true + false + true + false + true + false + true + false + true + false + false + true + true + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + false + false + false + NotUsing + false + + + true + true + true + true + true + true + true + false + true + false + true + false + true + false + true + false + true + false + false + true + true + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + false + false + false + true + true + true + true + true + true + true + NotUsing + false + + + true + true + true + true + true + true + true + false + true + false + true + false + true + false + true + false + true + false + false + true + true + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + false + false + false + true + true + true + true + true + true + true + NotUsing + false + + + true + true + true + true + true + true + true + false + true + false + true + false + true + false + true + false + true + false + false + true + true + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + false + false + false + true + true + true + true + true + true + true + NotUsing + false + + + true + true + true + true + true + true + true + false + true + false + true + false + true + false + true + false + true + false + false + true + true + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + false + false + false + true + true + true + true + true + true + true + NotUsing + false + + + true + true + true + true + true + true + true + false + true + false + true + false + true + false + true + false + true + false + false + true + true + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + false + false + false + NotUsing + false + + + true + true + true + true + true + true + true + false + true + false + true + false + true + false + true + false + true + false + false + true + true + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + false + false + false + NotUsing + false + + + true + true + true + true + true + true + true + false + true + false + true + false + true + false + true + false + true + false + false + true + true + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + false + false + false + NotUsing + false + + + true + true + true + true + true + true + true + false + true + false + true + false + true + false + true + false + true + false + false + true + true + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + false + false + false + NotUsing + false + + + true + true + true + true + true + true + true + false + true + false + true + false + true + false + true + false + true + false + false + true + true + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + false + false + false + NotUsing + false + + + true + true + true + true + true + true + true + false + true + false + true + false + true + false + true + false + true + false + false + true + true + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + false + false + false + NotUsing + false + + + true + true + true + true + true + true + true + false + true + false + true + false + true + false + true + false + true + false + false + true + true + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + false + false + false + NotUsing + false + + + + + true + true + true + true + true + true + true + true + true + + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + + + + + + + + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + + + + true + true + true + true + true + true + true + true + true + + + + + + + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + 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 + 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 + + + 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 + + + false + false + true + true + true + true + true + true + true + true + true + true + true + true + false + 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 + + + false + false + true + true + true + true + true + true + true + true + true + true + true + true + false + true + true + true + true + true + true + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + 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 + true + true + false + true + true + true + true + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + 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 + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + Use + 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 + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + 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 + true + true + true + true + true + true + true + true + true + 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 + true + true + true + true + true + true + true + true + true + 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 + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + + + + + + + + + + + + + + + + + + true + true + true + true + true + true + true + + + + + + + + + + + + + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + + + + + true + true + true + + + + + + + + + + + + + + + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + + + + + + + + + + + + + Disabled + Disabled + Disabled + Disabled + false + false + + + + + + + + + + + false + false + false + false + false + false + false + false + false + + + false + false + false + false + false + false + false + false + false + + + + + + + + + + + false + false + false + false + false + false + false + false + false + + + false + false + false + false + false + false + false + false + false + + + false + false + false + false + false + false + false + false + false + + + false + false + false + false + false + false + false + false + false + + + + + + + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + 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 + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + false + false + true + true + true + true + true + true + true + true + true + true + true + false + true + true + true + true + true + true + true + true + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + 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 + false + false + + + + + + + + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + false + true + true + true + true + true + + + true + true + true + true + false + false + true + true + true + true + true + true + true + true + true + true + false + true + true + true + true + true + true + true + true + true + true + false + true + false + true + false + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + false + false + true + true + true + true + true + true + true + true + true + true + false + true + true + true + true + true + true + true + true + true + true + false + true + false + true + false + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + true + true + true + true + true + false + true + false + true + false + true + true + true + false + true + true + + + true + true + true + true + false + false + true + true + true + true + true + true + true + true + true + true + false + true + true + true + true + true + true + true + true + true + true + false + true + false + true + false + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + false + false + false + false + false + false + false + false + false + false + false + false + false + true + false + true + false + true + false + true + false + false + true + true + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + true + false + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + 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 + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + true + false + true + false + true + true + true + true + true + true + true + true + true + true + true + true + false + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + true + true + true + true + true + false + false + true + true + true + true + true + true + true + true + false + true + false + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + true + true + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + + + + + Create + Create + Create + Create + Create + Create + Create + Create + Create + Create + Create + Create + Create + Create + Create + Create + Create + Create + Create + Create + Create + Create + Create + Create + Create + Create + Create + Create + Create + Create + Create + Create + Create + Create + Create + Create + Create + Create + Create + Create + Create + Create + Create + false + false + false + false + false + false + false + false + false + Create + Create + Create + Create + Create + Create + Create + $(OutDir)$(ProjectName).pch + $(OutDir)$(ProjectName).pch + $(OutDir)$(ProjectName).pch + $(OutDir)$(ProjectName).pch + $(OutDir)$(ProjectName).pch + $(OutDir)$(ProjectName).pch + $(OutDir)$(ProjectName).pch + $(OutDir)$(ProjectName).pch + $(OutDir)$(ProjectName).pch + $(OutDir)$(ProjectName).pch + $(OutDir)$(ProjectName).pch + $(OutDir)$(ProjectName).pch + $(OutDir)$(ProjectName).pch + $(OutDir)$(ProjectName).pch + $(IntDir)%(Filename)$(ObjectExt) + $(IntDir)%(Filename)$(ObjectExt) + + + + + + + + + + + + + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + + + + + + + + + + + + + + + + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + + + + + + + + + + + true + true + true + true + true + true + true + true + true + true + true + true + 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 + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + false + false + false + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + false + false + false + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + + + + + + + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + 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 + true + true + true + true + false + true + true + true + true + true + true + true + true + true + true + true + true + false + false + false + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + 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 + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + NotUsing + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + 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 + true + true + true + true + true + true + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + false + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + -Xpch_override=1 + -Xpch_override=1 + -Xpch_override=1 + -Xpch_override=1 + -Xpch_override=1 + -Xpch_override=1 + -Xpch_override=1 + -Xpch_override=1 + -Xpch_override=1 + -Xpch_override=1 + -Xpch_override=1 + -Xpch_override=1 + -Xpch_override=1 + -Xpch_override=1 + true + true + true + true + true + true + true + true + true + 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 + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + false + false + false + false + false + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + + + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + 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 + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + 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 + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + 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 + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + true + true + true + true + true + true + + + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + + + true + true + true + true + true + true + + + true + true + true + true + true + true + true + false + true + true + true + true + true + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + false + 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 + + + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + false + true + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + false + true + false + true + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + false + true + false + true + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + false + true + false + true + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + false + true + false + true + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + + + + true + + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + + + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + 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 + 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 + 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 + false + false + false + false + false + false + false + false + true + true + true + true + false + false + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + false + false + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + 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 + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + 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 + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + 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 + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + true + true + true + false + true + true + + + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + + + + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + + + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + true + false + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + true + false + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + true + false + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + true + false + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + true + false + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + true + false + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + true + false + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + true + false + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + true + false + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + 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 + false + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + 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 + 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 + 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 + 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 + 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 + 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 + 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 + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + 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 + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + 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 + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + 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 + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + 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 + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + 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 + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + 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 + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + 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 + true + true + true + true + true + + + + + + + + + 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 new file mode 100644 index 00000000..c1b43c00 --- /dev/null +++ b/Minecraft.Client/Minecraft.Client.vcxproj.filters @@ -0,0 +1,6287 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {e23474e2-447c-41a9-82be-e32747f5b196} + + + {d7b60dd5-624a-46b3-b81d-f5f74550f613} + + + {68105641-375c-4565-9945-7890df6d82d9} + + + {8be4617d-3699-46a4-8769-28edb23c89f0} + + + {0b94741f-653f-48c2-874f-6aa69e7e9622} + + + {20606602-63d3-460c-b33e-d3e747a3d8db} + + + {4afb96fe-3fcb-4bd1-89a1-adfea86c73fb} + + + {304b5ee1-bfdb-489f-8e24-0a4e61177ca1} + + + {225f9542-472d-45c1-9046-eb2a46ab029c} + + + {14e20ee1-fe3b-481b-acce-7a634ee9c1d6} + + + {486b537f-d140-4a23-8409-fe3bc4184009} + + + {91ef92f9-432b-4b8f-9f16-4efd211003a1} + + + {66656f96-a5da-48c6-a7f9-79ab343dbd2f} + + + {3423fd63-b0d7-4f50-b0ca-549386c6cf57} + + + {d097d6ee-2ae4-48d8-8b5a-9b48882bdb2c} + + + {1d0a6eec-14cd-4e6d-8a0a-f5f8f0ab5240} + + + {269fab49-d870-4358-baef-32ed6ac9eca7} + + + {fef42379-3d37-4ef3-aa73-b19aaa77e3cc} + + + {bce4041a-9336-45e7-bd40-ed057ed96ee8} + + + {9756cb73-3f40-4fcb-9bab-5a3ce3c4d2f6} + + + {bb820acc-a8eb-4e36-8b4e-9517263ed51b} + + + {3c3aca1d-0e3e-43f1-b4cd-f8dfce2d29e7} + + + {9f1bf1ed-5366-4a29-b3f3-296725a7b01c} + + + {3e905494-b5dc-4084-a1fe-cbd91b9af667} + + + {afb98298-0033-42ec-98a5-93f8d347ee0d} + + + {1953b4f7-41ea-430b-ad2d-e3d7c352b647} + + + {39ab4d1f-8199-4ec7-948e-3d42ad8c8573} + + + {73bbdc5b-04f3-42f8-bf3b-769335e19178} + + + {385338b7-fa77-4c46-a7f2-89c82dc6e192} + + + {0f94b57d-88f8-4a20-b4e4-d1fa95d8f439} + + + {abe2942f-f984-4930-9e2d-9c9c2b35ac74} + + + {a2be9911-8785-4f6a-932e-e03321ee466b} + + + {7cb56f76-52cf-4303-8631-e1471fdc09a0} + + + {098e2985-9c15-450f-baa2-78604e7c1f54} + + + {6c286ad1-f871-408a-be6e-db44e7edcd2c} + + + {7c254dd0-f36f-4001-83cc-1634a2c792c2} + + + {2a26afce-4160-4fb0-8d01-e394a669dae6} + + + {9229f78c-152c-47d5-858a-fd054b856a1c} + + + {81ab078c-fc67-460c-befd-616dbe4bc3bc} + + + {db324829-af2c-428d-9710-8ad20ecc3fd0} + + + {758ac0be-6bd7-42c0-9b09-fdd452c0e134} + + + {c2dcdce8-b00f-4094-b0de-dad838d49525} + + + {8fd2f4e7-b93a-4067-93b8-a7ebac6d4a9c} + + + {93a41380-e12e-4f7a-bb7b-459f7169faed} + + + {4eb1ba28-620f-4136-979c-4dc91c44b666} + + + {5ac21685-36c0-4cd1-8861-e6a0e4a37c62} + + + {1b4710ff-c513-4a11-9d34-ff36fe1b4246} + + + {f4877497-fdf4-48a8-ada4-e6042f632e7a} + + + {45f40847-5b95-4dca-82f2-7616d7a35e54} + + + {1a98ef4c-6c9d-4a22-93d7-89f0fc3320fd} + + + {3be02e3c-c628-4315-a507-a9fe7733af01} + + + {c6dffb6d-2cf6-4c3e-89a3-fb05229b98aa} + + + {7d088a48-eeda-4783-94f7-c0d09b06f347} + + + {a466219c-afde-4184-8b84-91df32e5b892} + + + {40d6ff43-3d13-42ab-99ae-ebc9d585110f} + + + {047a3693-2040-404d-a386-2e5795b231d3} + + + {2509ddc5-330c-45da-a6f9-d37b858acd34} + + + {b2935b29-33d3-4d57-a145-753a646e5de4} + + + {26661545-d0a0-438a-a775-31cec1fb7849} + + + {5f5f5678-57b0-4f7f-b7dc-1ddd01ea2774} + + + {a19d2d41-9a2f-4631-941b-c3bfa7c2fdfd} + + + {bcdb8322-b7e6-482b-a3da-eb3f84dac713} + + + {e2959475-d5c8-4874-a782-fb5266e4441c} + + + {794dfcdb-98c6-4939-b04d-86b9657d4ff6} + + + {775f3088-bc52-43a3-b9ec-7f3f58508240} + + + {ebe1835b-76a8-408d-b3ee-70ffa4db7907} + + + {45bddf1c-e6d6-4a78-9b7d-73d7511e070d} + + + {16186163-4c73-4fa8-85c7-57d2b34e3fe9} + + + {b33b6793-e585-487e-8626-0096242f8e04} + + + {1264d92e-fa06-40ef-846c-4ce2a99e8ccc} + + + {b28c2ec8-a257-41ca-aad2-cf2ced04e4fa} + + + {7369fca1-3096-4b7d-a93e-924587f23108} + + + {e0eabf73-2721-46f9-bc46-4e0292bb53d3} + + + {bf450dfd-c9e8-4120-8a4c-3860b606637e} + + + {4412cd12-307d-407c-8d4a-34df3274c892} + + + {91fbb0f7-3d94-4786-aa07-c9c57a6db9a9} + + + {afb9404f-f23d-46b1-b4d5-4b1096d5bf40} + + + {716a30f7-f9dd-43bf-9228-646dff4c58b1} + + + {3531c304-b08e-48ae-860c-773f6702ec4d} + + + {924f367a-618c-429e-9866-f60821f21d4a} + + + {e3e43b8f-e455-4222-a92e-f6567a41e326} + + + {61ac879d-17b0-402b-b29f-88c60a1161c7} + + + {4f5c7e99-5cbc-4db4-99c4-37db45537198} + + + {33341824-5702-4a56-b75c-9dac57e49349} + + + {4dbeff57-70bc-4b4c-b5d0-4c6834968d85} + + + {4be5c8d2-8944-4e8f-9d79-b1abc4b66f8f} + + + {ba24985e-3b16-45af-963e-9f2edca20b1a} + + + {77957a66-a869-4b9b-bbda-e7f43e01096f} + + + {fa09ab64-0a3f-429b-93cb-149ee490767b} + + + {dec59bc5-d9d3-4be5-b449-3df3b430eb39} + + + {0bcca89e-0d2d-407b-b1e4-878465404901} + + + {395a09e4-1ff9-458c-8fb8-a4cb28aa4881} + + + {056ec81c-c93f-4c56-9bcb-697cda24a612} + + + {d3d4cc74-edfa-4bbb-8e66-7252dbbc131b} + + + {1511a94f-13bc-49e0-bf75-7cdf98f1e77f} + + + {f0b2e12a-e042-49bc-a5fa-78d1cf79e5d3} + + + {d2020762-d261-4c89-bbb9-0c7113012882} + + + {88ebd63d-2bbc-438a-a810-9b26fcfdd908} + + + {2cf98618-28c5-46df-9ff7-3d331ee4a275} + + + {3c643f18-092d-4870-a206-8dc906748a64} + + + {11cc2598-d569-47ad-8843-7a8296878be9} + + + {33371180-d4ec-4439-8a95-059babcc1db9} + + + {c6d264ea-d4ac-4f3f-81f7-0d91fdc27713} + + + {bde45e25-7dce-4a39-a2bf-dad234708b07} + + + {9685dbaa-ed65-453c-ba57-ec01e59022ae} + + + {92ead381-f2b8-4c6d-a3ca-c6fbc7753361} + + + {2031e778-56ff-4126-b09d-4ec59453b21c} + + + {98e39923-fe62-42d5-8650-746c2d61efd2} + + + {094cddb4-1ac5-424b-80e3-e3b0e9bb3b05} + + + {914f66a5-b1a7-4615-9adc-287d28158eee} + + + {36ba326b-c3a1-473e-8cb4-054e34c276a8} + + + {f9dae5df-fabf-41f9-9b13-8d32e5b5baa5} + + + {e634a43c-ee4c-4adc-8847-c667fdc73c5f} + + + {71d6ccac-7a6e-4399-987b-06b606056f59} + + + {05765c7e-26d6-4760-b0f6-7aa9f374d163} + + + {02363026-02fd-4efc-a115-6ae3dc652546} + + + {d71c6707-d6ba-4ab5-a505-a916e007e60d} + + + {eb5eb5f3-0ea7-4658-a8fb-634eb289941d} + + + {46d5754b-1818-4685-a16d-f7415f61868c} + + + {541f67ae-2627-40af-8316-d76ee9bb6985} + + + {ccfdb851-7965-4551-88bb-4312ddbf830a} + + + {2b9abc76-798a-4aae-ba50-2dfc8f78ae81} + + + {35491a01-dd6f-4313-b857-5e3eb323b44f} + + + {bcac2142-c160-4a73-96c5-cbdf681a16f0} + + + {290b2f1c-dcd8-4ebc-9d6d-fa6de190117e} + + + {a7ec80a7-ea10-438c-a10f-7eeef759c32d} + + + {9a2c49f6-2f9d-4e9d-a4ea-a0a04ecba75f} + + + {24e96065-3dd4-4150-bde2-128d133fd2c4} + + + {10961b95-cb43-4a00-b999-04b66a1a0b43} + + + {6aaa8af3-3df6-43f4-9346-9adfe45ca3a7} + + + {aba0f713-fcfb-417e-9616-c8474225de71} + + + {94298ae6-25e0-4cc9-8c5a-efd53e156baa} + + + {6ec99327-b465-4e61-b064-023a09bdf907} + + + {2095b7df-1779-4788-b004-3479d5ab59d8} + + + {4c9eb137-a48c-44a4-be08-ef1745834ece} + + + {2bae7445-385f-4b0e-a3ec-11c1c584f930} + + + {7c655cf2-f74e-4e6a-9114-405f5bc28a56} + + + {a392080f-8e8b-42be-832a-a35869dba580} + + + {42dca5dc-e462-4537-9929-847a044eb116} + + + {0da3a534-f8c9-4d0c-a73f-dfeb402b27c1} + + + {2e1858a4-a24b-49d8-b19c-c24b45f75a4f} + + + {096eb9da-ee6c-46ba-a0f4-dd8d1748b6a1} + + + {50dc7509-93df-4e0a-8a9a-cea040e92180} + + + {67544d93-633f-46a8-9cdf-8ae646a745d1} + + + {08da2d2a-3276-4109-b190-05fbc4709398} + + + {cef89641-7631-4c30-855f-603163446077} + + + {a15076ff-0dbe-4fb5-8b58-4ceb4b189c8f} + + + {a36a05f3-bc99-4097-b7a8-f81c37eec6e3} + + + {c9fd57aa-ede6-46f3-b968-0f4a7c64f7f1} + + + {bcd2eaff-60b9-41f4-8e1a-258639b27f99} + + + {ebc154be-8d55-478b-9038-856d445aaf15} + + + {0749340b-e216-450a-a02e-001917097ba5} + + + {6b6c31a6-0b8d-4dc0-8d6e-38ab6de709ff} + + + {d7537fdd-877b-461c-9c86-3235843fcfc0} + + + {61e77fc3-d018-4e08-985c-9871eca81fe2} + + + {2c983999-feb8-40db-885b-abf061e2ab58} + + + {093a811c-5f90-4c0e-b260-4b637079730a} + + + {c2fdb165-80e4-4ce0-9bf1-12e5c58f83a5} + + + {ad68d69a-99d0-4eea-9bb4-58cb7083a7a1} + + + {a04f2d63-3e47-470f-b4ac-c1d5caf8ce56} + + + {a0aa2098-142e-4688-8d73-00ec7e5e9361} + + + {f7fc551a-1d1a-4584-af3b-2eadb712b0f7} + + + {7155e1ba-d9b6-473b-8c59-77dd883b766f} + + + {017984f1-6659-4a44-96fd-7dbb8f9b2654} + + + {5d6f34a3-c647-479d-a1a9-89a9ffca4ab9} + + + {6f049254-6585-4a90-be74-70d3878d864f} + + + {e4051e75-f566-41ce-b86a-46c838872963} + + + {18d3c9bc-132e-4770-a665-fc030eb86394} + + + {8a2156f5-3462-447b-b04d-e555a917fbf2} + + + {e0cb4d67-dd35-43ab-88cc-63173cc31125} + + + {090821e7-2a93-44de-bf5e-d5dbbcb41621} + + + {11f70fef-83b4-4fb9-85ab-51109fbb6a56} + + + {7b594635-988d-40aa-8a00-0d60b1f49a5a} + + + {e7df083d-5b13-46bc-a5b9-610c3ffb33bc} + + + {2ef42e03-cbaa-4077-a7f4-008150037f01} + + + {4d1da71a-dd84-4073-be6d-1e534eca98f3} + + + {acb27adb-45a3-45cf-85f5-3ae00cf3357d} + + + {3a9d8989-ff64-411c-84ad-b7dfb2520d5a} + + + {de5f0642-c9ab-431b-a255-a936076ffed2} + + + {76ac5981-4824-487a-992f-273bfa73fb68} + + + {b1794e73-9397-4e45-8a0d-a4f6dc72c321} + + + {ff6b8d80-d0ed-4225-b56c-1d0a19824e2f} + + + {4d0806f8-ae38-4bac-8469-0a82fc61eecd} + + + {67f51112-db23-4c8a-af1b-f748f7bbce8f} + + + {a47c9da7-bf36-42ae-aedf-c00c071c0582} + + + {017967fb-353e-448b-ae2c-639a182f3ee0} + + + {f4d6c5f9-40d6-4e52-bc03-fef06e9f0221} + + + {122ac1f3-113d-4f91-8676-bbe16e236f4f} + + + {1d28fadf-f748-4616-830b-ec2faa1b5f8e} + + + {bf865c6c-8bf4-4bd6-aaed-ff2a7c92706a} + + + {3eefa342-44e2-493a-9165-40f85bcef557} + + + {f88c0f6a-8051-41e7-9bf6-b9d3c7bb2937} + + + {a6b9803b-8dc2-4552-856e-470f78757533} + + + {21ba77e3-ca31-4dbb-b85d-48ddf892e1da} + + + {06443c48-8447-447b-895f-da725cc13c0c} + + + {ba60dadb-f607-49b7-ab07-0da3a6e06138} + + + {abc41045-2c80-41e8-a8e5-80383e3331b7} + + + {6e66e638-15af-47a6-83de-93bb0cb8ae3d} + + + {b2a3a14e-806c-4ebf-9413-0bbca21b6699} + + + {57a41953-69e1-408c-94ca-5a0fc35bee3d} + + + {afe55d4b-8cbd-4fc0-b4b5-e823d35ac9f6} + + + {ff3c3e8d-02aa-446f-912b-876aad8bb71a} + + + {5ce05bd9-a7f6-47cf-81c3-8c95d3627c5c} + + + {f90e55f2-d904-4421-8284-db37fe80c549} + + + {4c8bf8d5-d6d9-4b6b-96dd-00d64f476027} + + + {90c63e2f-0b47-4aca-a1df-26c436af7c69} + + + {ad3528e0-0c39-42d5-b756-fdf691df5f17} + + + {262a14ae-51b7-4d11-be00-2bf7840dc67d} + + + {40ad6aa5-e972-4aaf-bbb0-c783e72fb341} + + + {d705167f-d99e-49b5-a667-24c0c2fe7bcc} + + + {d52b4de1-b2d7-4c80-afb4-7c6edae1efcb} + + + {61ac299e-6446-4df9-b5cc-9b2c0890b47c} + + + {147837b5-da79-4938-abcf-f8926a72b25c} + + + {34edb787-189e-49c7-8412-f5def16b6f99} + + + {1f029554-0246-45da-8bfd-8d4bc8d4cffc} + + + {15633337-4260-4618-bffa-df945dba2b1a} + + + {81d283e0-15b7-4dcf-a85d-961169a993cd} + + + {dea799c3-4584-461c-a788-9766f61cea56} + + + {619bbb82-dfbc-499e-b078-048ad7e26222} + + + {f5065760-0ad8-4fb3-b6a9-f3ba06be0e51} + + + {360a336e-01e3-4a34-8608-efd2c7c72ef7} + + + {1d9e76bb-7f51-487f-b0b4-de3419fd1925} + + + {177ed754-f97c-4e53-9e75-1f548ae2a0b4} + + + {4b317e13-b7e6-4468-8a2e-bfbbe3bb272b} + + + {acc4e8ae-a1f1-4f2b-9bf2-e12b74fa3a1a} + + + {893769f2-22f7-4c41-ad2b-cb8668fb3b66} + + + {c1441371-f323-4549-90a0-53c6f743b4b1} + + + {b043e348-607a-4ac2-95de-f573db5dd04f} + + + {af98fe8e-ce25-437a-8ab9-efa9d8f0a5b0} + + + {9a61fbe5-f9a2-4c83-b407-5a295808664e} + + + {f55d07b2-80f2-4a01-8fb8-0b09545bf916} + + + {829b148f-b0d9-4a70-87ea-22f57281ac1f} + + + {08832b8f-5370-4c06-95ab-b5b285eb5fc5} + + + {918450ce-de83-4daf-8f25-7aaa8afcb856} + + + {5d807c82-39b9-4651-ab8a-14244deff851} + + + {9dee27ed-5aaf-4fad-b219-faebcebbe450} + + + {22d0b2d5-3279-4144-a23c-8eafb9d90e63} + + + {0061db22-43de-4b54-a161-c43958cdcd7e} + + + {889a84db-3009-4a7c-8234-4bf93d412690} + + + + + + Xbox\GameConfig + + + Xbox\GameConfig + + + Xbox\res\audio + + + Xbox\res\audio + + + Xbox\res\audio + + + Xbox\4JLibs\Media + + + Xbox\res + + + Xbox\res + + + Xbox\xexxml + + + Xbox\xexxml + + + Xbox\Source Files\Sentient\Telemetry + + + Xbox\Source Files\Sentient\DynamicConf + + + + Windows64\GameConfig + + + Windows64\GameConfig + + + Durango + + + Durango + + + Durango + + + + Orbis\4JLibs\libs + + + Orbis\4JLibs\libs + + + Orbis\4JLibs\libs + + + Orbis\4JLibs\libs + + + Orbis\Miles Sound System\lib + + + PS3\Miles Sound System\lib + + + PS3\Miles Sound System\lib + + + PS3\Miles Sound System\lib + + + PS3\Miles Sound System\lib\spu + + + PS3\Miles Sound System\lib\spu + + + PS3\Miles Sound System\lib\spu + + + PS3\Miles Sound System\lib\spu + + + PS3\Miles Sound System\lib\spu + + + PS3\Miles Sound System\lib\spu + + + PS3\Miles Sound System\lib\spu + + + PS3\Miles Sound System\lib\spu + + + Windows64\Iggy\gdraw + + + Windows64\Iggy\gdraw + + + Windows64\Iggy\gdraw + + + Windows64\Iggy\gdraw + + + Durango\Iggy\gdraw + + + Durango\Iggy\gdraw + + + Durango\Iggy\gdraw + + + PS3\Iggy\gdraw + + + PS3\Iggy\gdraw + + + Windows64\Iggy\gdraw + + + Orbis\Iggy\gdraw + + + Orbis\Iggy\gdraw + + + Common\Source Files\Network + + + PSVita\GameConfig + + + PSVita\GameConfig + + + Orbis\4JLibs\libs + + + PSVita\Iggy\gdraw + + + PSVita\Iggy\gdraw + + + + + Header Files + + + net\minecraft\client\renderer\culling + + + net\minecraft\client\renderer\culling + + + net\minecraft\client\renderer\culling + + + net\minecraft\client\renderer\culling + + + Header Files + + + net\minecraft\client\renderer\culling + + + net\minecraft\client\renderer\culling + + + net\minecraft\client\renderer + + + net\minecraft\client\renderer + + + 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\model + + + 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\model + + + 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\renderer + + + 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\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\player + + + 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\tileentity + + + net\minecraft\client\renderer\tileentity + + + net\minecraft\client\renderer\tileentity + + + net\minecraft\client\renderer + + + net\minecraft\client\skins + + + net\minecraft\client\skins + + + net\minecraft\client\skins + + + net\minecraft\client\skins + + + net\minecraft\client\renderer + + + net\minecraft\client\renderer + + + net\minecraft\client\renderer + + + net\minecraft\client\renderer + + + net\minecraft\client\renderer + + + net\minecraft\client\renderer + + + net\minecraft\client\renderer + + + net\minecraft\client\renderer + + + net\minecraft\client\renderer + + + net\minecraft\client\particle + + + net\minecraft\client\particle + + + net\minecraft\client\particle + + + net\minecraft\client\particle + + + net\minecraft\client\particle + + + net\minecraft\client\particle + + + net\minecraft\client\particle + + + net\minecraft\client\particle + + + net\minecraft\client\particle + + + net\minecraft\client\particle + + + net\minecraft\client\particle + + + net\minecraft\client\particle + + + net\minecraft\client\particle + + + net\minecraft\client\particle + + + net\minecraft\client\particle + + + net\minecraft\client\particle + + + net\minecraft\client\particle + + + net\minecraft\client + + + net\minecraft\client\player + + + net\minecraft\stats + + + net\minecraft\stats + + + net\minecraft\client\player + + + net\minecraft\client + + + net\minecraft\client + + + net\minecraft\client + + + net\minecraft\client + + + net\minecraft\client + + + net\minecraft\client + + + net\minecraft\client + + + net\minecraft\client\level + + + net\minecraft\client + + + net\minecraft\client\gui + + + net\minecraft\client\gui + + + net\minecraft\client + + + net\minecraft\client\gui + + + net\minecraft\client\gui + + + net\minecraft\client\gui + + + net\minecraft\client\gui\particle + + + net\minecraft\client\gui\particle + + + net\minecraft\client\gui + + + net\minecraft\client\gui + + + net\minecraft\client\gui + + + net\minecraft\client\gui + + + net\minecraft\client\gui + + + net\minecraft\client\gui + + + net\minecraft\client\gui + + + net\minecraft\client\gui + + + net\minecraft\client\gui + + + net\minecraft\client\gui + + + net\minecraft\client\gui + + + net\minecraft\client\gui + + + net\minecraft\client\gui + + + net\minecraft\client\title + + + net\minecraft\client\gui + + + net\minecraft\client\gui + + + net\minecraft\client\gui + + + net\minecraft\client\gui + + + net\minecraft\client\gui + + + net\minecraft\client\gui + + + net\minecraft\client\gui + + + net\minecraft\client\gui\inventory + + + net\minecraft\client\gui\inventory + + + net\minecraft\client\gui\inventory + + + net\minecraft\client\gui\inventory + + + net\minecraft\client\gui\inventory + + + net\minecraft\client\gui\inventory + + + net\minecraft\client\gui\inventory + + + net\minecraft\client\gui\achievement + + + net\minecraft\client\gui\achievement + + + net\minecraft\client\gui\achievement + + + Xbox\4JLibs\inc + + + Xbox\4JLibs\inc + + + Xbox\4JLibs\inc + + + Xbox\4JLibs\inc + + + Xbox\GameConfig + + + Xbox\Source Files + + + net\minecraft\server\network + + + net\minecraft\server\network + + + net\minecraft\server\level + + + net\minecraft\server\level + + + net\minecraft\server\level + + + net\minecraft\server\level + + + net\minecraft\server\level + + + net\minecraft\server\level + + + net\minecraft\server\level + + + net\minecraft\server + + + net\minecraft\server + + + net\minecraft\server + + + net\minecraft\server + + + net\minecraft\server + + + net\minecraft\server\level + + + Xbox\Source Files\XUI\Menu screens + + + Xbox\Source Files\XUI\Menu screens + + + net\minecraft\client\multiplayer + + + net\minecraft\client\multiplayer + + + net\minecraft\client\multiplayer + + + net\minecraft\client\multiplayer + + + net\minecraft\client\multiplayer + + + net\minecraft\client\multiplayer + + + net\minecraft\client\multiplayer + + + net\minecraft\client\multiplayer + + + Xbox\Source Files\XUI\Menu screens + + + Xbox\Source Files\XUI\Menu screens + + + Xbox\Source Files\XUI\Menu screens + + + Xbox\Source Files\XUI\Menu screens + + + Xbox\Source Files\XUI\Menu screens\Help & Options + + + Xbox\Source Files\XUI\Menu screens\Help & Options\Controls + + + Xbox\Source Files\XUI\Menu screens\Help & Options\Credits + + + Xbox\Source Files\XUI\Menu screens\Help & Options\How To Play + + + Xbox\Source Files\XUI\Menu screens\Help & Options\How To Play + + + Xbox\Source Files\XUI\Menu screens + + + Xbox\Source Files\XUI\Menu screens + + + Xbox\Source Files\XUI\Menu screens + + + Xbox\Source Files\XUI\Menu screens\Tutorial + + + Xbox\Source Files\XUI\Menu screens\Leaderboards + + + Xbox\Source Files\XUI\Menu screens\Pause + + + Xbox\Source Files\XUI\Menu screens + + + Xbox\Source Files\XUI\Menu screens\Debug + + + Xbox\Source Files\XUI\Menu screens\Debug + + + Xbox\Source Files\XUI\Menu screens + + + Xbox\Source Files\XUI\Menu screens + + + Xbox\Source Files\XUI\Controls + + + Xbox\Source Files\XUI\Controls + + + Xbox\Source Files\XUI\Controls + + + Xbox\Source Files\XUI\Controls + + + Xbox\Source Files\XUI\Controls + + + Xbox\Source Files\XUI\Controls + + + Xbox\Source Files\XUI\Controls + + + Xbox\Source Files\XUI\Controls + + + Xbox\Source Files\XUI\Controls + + + Xbox\Source Files\XUI\Controls + + + Xbox\Source Files\XUI\Controls + + + Xbox\Source Files\XUI\Controls + + + Xbox\Source Files\XUI\Controls + + + Xbox\Source Files\XUI\Controls + + + Xbox\Source Files\XUI\Menu screens\Social + + + Header Files + + + Header Files + + + Header Files + + + Xbox\Source Files\XUI\Menu screens + + + Xbox\Source Files\XUI\Menu screens + + + Xbox\Source Files\XUI\Menu screens + + + Xbox\XML + + + Xbox\SentientLibs\inc + + + Xbox\SentientLibs\inc + + + Xbox\SentientLibs\inc + + + Xbox\SentientLibs\inc + + + Xbox\SentientLibs\inc + + + Xbox\SentientLibs\inc + + + Xbox\SentientLibs\inc + + + Xbox\SentientLibs\inc + + + Xbox\SentientLibs\inc + + + Xbox\SentientLibs\inc + + + Xbox\SentientLibs\inc + + + Xbox\SentientLibs\inc + + + Xbox\SentientLibs\inc + + + Xbox\SentientLibs\inc + + + Xbox\SentientLibs\inc + + + Xbox\SentientLibs\inc + + + Xbox\SentientLibs\inc + + + Xbox\SentientLibs\inc + + + Xbox\SentientLibs\inc + + + Xbox\SentientLibs\inc + + + Xbox\SentientLibs\inc + + + Xbox\SentientLibs\inc + + + Xbox\SentientLibs\inc + + + Xbox\SentientLibs\inc + + + Xbox\SentientLibs\inc + + + Xbox\SentientLibs\inc + + + Xbox\SentientLibs\inc + + + Xbox\SentientLibs\inc + + + Xbox\SentientLibs\inc + + + Xbox\SentientLibs\inc + + + Xbox\Source Files\Sentient\Telemetry + + + Xbox\Source Files\Sentient\Telemetry + + + Xbox\Source Files\Sentient\Telemetry + + + Xbox\Source Files\XUI\Menu screens\Help & Options\Settings + + + Xbox\Source Files\XUI\Controls + + + Xbox\Source Files\Sentient\DynamicConf + + + Xbox\Source Files\XUI\Menu screens + + + Xbox\Source Files\XUI\Controls + + + Xbox\Source Files\Font + + + Xbox\Source Files\Font + + + Xbox\Source Files\Font + + + Xbox\Source Files\XUI\Menu screens\Debug + + + net\minecraft\server\network + + + Xbox\Source Files\XUI\Menu screens\Help & Options\Settings + + + Xbox\Source Files\XUI\Controls + + + net\minecraft\client\renderer\tileentity + + + Xbox\Source Files\Sentient + + + Xbox\Source Files\Sentient\Telemetry + + + Xbox\Source Files\XUI\Menu screens\Help & Options\Settings + + + Xbox\Source Files\XUI\Menu screens\Help & Options\Settings + + + Xbox\Source Files\XUI\Menu screens\Help & Options\Settings + + + Xbox\Source Files\XUI\Menu screens\Help & Options\Settings + + + Xbox\XML + + + net\minecraft\server\level + + + net\minecraft\server\network + + + net\minecraft\client + + + net\minecraft\client\model + + + net\minecraft\client\model + + + net\minecraft\client\model + + + net\minecraft\client\model + + + net\minecraft\client\multiplayer + + + net\minecraft\client\particle + + + net\minecraft\client\particle + + + net\minecraft\client\particle + + + net\minecraft\client\particle + + + net\minecraft\client\particle + + + net\minecraft\client\particle + + + net\minecraft\client\particle + + + net\minecraft\client\renderer + + + net\minecraft\client\renderer\entity + + + net\minecraft\client\renderer\entity + + + net\minecraft\client\renderer\entity + + + net\minecraft\client\renderer\tileentity + + + Xbox\Source Files\XUI\Menu screens\Debug + + + Xbox\Source Files\XUI\Menu screens\Debug + + + Xbox\Source Files\XUI\Menu screens + + + Xbox\Source Files\XUI\Menu screens + + + Xbox\Source Files\XUI\Menu screens + + + net\minecraft\client + + + Xbox\Source Files\XUI\Menu screens + + + net\minecraft\server + + + 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\tileentity + + + net\minecraft\client\model\geom + + + net\minecraft\client\model\geom + + + net\minecraft\client\model\dragon + + + net\minecraft\client\particle + + + net\minecraft\client\particle + + + net\minecraft\client\model\geom + + + net\minecraft\client\particle + + + net\minecraft\client\model\geom + + + net\minecraft\client\model\dragon + + + net\minecraft\client\model + + + net\minecraft\client\model + + + net\minecraft\client\model\geom + + + net\minecraft\client\model + + + net\minecraft\client\model + + + net\minecraft\client\model + + + net\minecraft\client\model\geom + + + Xbox\Source Files\XUI\Controls + + + Xbox\Source Files\XUI\Controls + + + Xbox\Source Files\XUI\Controls + + + Xbox\Source Files\XUI\Controls + + + Xbox\Source Files\XUI\Controls + + + Xbox\Source Files\XUI\Controls + + + Header Files + + + Xbox\Source Files\XUI\Menu screens + + + Xbox\Source Files\Social + + + Header Files + + + Windows + + + Windows + + + Durango\4JLibs\inc + + + Durango\4JLibs\inc + + + Durango\4JLibs\inc + + + Durango\4JLibs\inc + + + Common\Source Files\Trial + + + Common\Source Files\Tutorial\Constraints + + + Common\Source Files\Tutorial\Constraints + + + Common\Source Files\Tutorial\Constraints + + + Common\Source Files\Tutorial\Constraints + + + Common\Source Files\Tutorial\Constraints + + + Common\Source Files\Tutorial\Hints + + + Common\Source Files\Tutorial\Hints + + + Common\Source Files\Tutorial\Hints + + + Common\Source Files\Tutorial\Hints + + + Common\Source Files\Tutorial\Hints + + + Common\Source Files\Tutorial\Hints + + + Common\Source Files\Tutorial\Tasks + + + Common\Source Files\Tutorial\Tasks + + + Common\Source Files\Tutorial\Tasks + + + Common\Source Files\Tutorial\Tasks + + + Common\Source Files\Tutorial\Tasks + + + Common\Source Files\Tutorial\Tasks + + + Common\Source Files\Tutorial\Tasks + + + Common\Source Files\Tutorial\Tasks + + + Common\Source Files\Tutorial\Tasks + + + Common\Source Files\Tutorial\Tasks + + + Common\Source Files\Tutorial\Tasks + + + Common\Source Files\Tutorial\Tasks + + + Common\Source Files\Tutorial\Tasks + + + Common\Source Files\Tutorial\Tasks + + + Common\Source Files\Tutorial\Tasks + + + Common\Source Files\Tutorial\Tasks + + + Common\Source Files\Tutorial\Tasks + + + Common\Source Files\Tutorial\Tasks + + + Common\Source Files\GameRules\LevelGeneration\StructureActions + + + Common\Source Files\GameRules\LevelGeneration\StructureActions + + + Common\Source Files\GameRules\LevelGeneration\StructureActions + + + Common\Source Files\GameRules\LevelGeneration\StructureActions + + + Common\Source Files\GameRules\LevelGeneration + + + Common\Source Files\GameRules\LevelRules\RuleDefinitions + + + Common\Source Files\GameRules\LevelRules\RuleDefinitions + + + Common\Source Files\GameRules\LevelRules\RuleDefinitions + + + Common\Source Files\GameRules\LevelRules\RuleDefinitions + + + Common\Source Files\GameRules\LevelRules\RuleDefinitions + + + Common\Source Files\GameRules\LevelRules\RuleDefinitions + + + Common\Source Files\GameRules\LevelRules\RuleDefinitions + + + Common\Source Files\Tutorial + + + Common\Source Files\Tutorial + + + Common\Source Files\Tutorial + + + Common\Source Files\Tutorial + + + Common\Source Files\Tutorial + + + Common\Source Files\Tutorial + + + Durango\Source Files + + + Common\Source Files\Tutorial\Hints + + + Durango\Source Files\Sentient + + + Durango\Source Files\Sentient + + + Durango\Source Files\Sentient + + + Durango\Source Files\Sentient + + + Durango\Source Files\Sentient + + + Durango\XML + + + Durango\Source Files\Sentient + + + Durango\Source Files\Social + + + Durango + + + Common + + + PS3\4JLibs\inc + + + PS3\4JLibs\inc + + + PS3\4JLibs\inc + + + PS3\4JLibs\inc + + + PS3\Source Files\Social + + + PS3\Source Files\Sentient + + + PS3\Source Files\Sentient + + + PS3\Source Files\Sentient + + + PS3\Source Files\Sentient + + + PS3\Source Files\Sentient + + + PS3\Source Files\Sentient + + + PS3\Source Files + + + PS3\PS3Extras + + + PS3\PS3Extras + + + Durango + + + Common\Source Files + + + Common\Source Files + + + Common\Source Files + + + Common\Source Files\GameRules\LevelGeneration + + + Common\Source Files\GameRules\LevelGeneration + + + Common\Source Files\GameRules + + + Common\Source Files\GameRules + + + PS3 + + + Xbox\Source Files\XUI + + + Xbox\Source Files\XUI + + + Xbox\Source Files\XUI + + + Xbox\Source Files\XUI\Base Scene + + + Xbox\Source Files\XUI\Base Scene + + + Xbox\Source Files\XUI\Base Scene + + + Xbox\Source Files\XUI\Containers + + + Xbox\Source Files\XUI\Containers + + + Xbox\Source Files\XUI\Containers + + + Xbox\Source Files\XUI\Containers + + + Xbox\Source Files\XUI\Containers + + + Xbox\Source Files\XUI\Containers + + + Xbox\Source Files\XUI\Containers + + + Xbox\Source Files\XUI\Containers + + + Xbox\Source Files\XUI\Containers + + + Xbox\Source Files\XUI\Controls + + + Xbox\Source Files\XUI\Controls + + + net\minecraft\client\skins + + + net\minecraft\client\particle + + + net\minecraft\client\skins + + + net\minecraft\client\renderer\entity + + + net\minecraft\client\renderer + + + net\minecraft\client\renderer\texture + + + net\minecraft\client\renderer\texture + + + net\minecraft\client\renderer\texture + + + net\minecraft\client\renderer\texture + + + net\minecraft\client\renderer\texture + + + net\minecraft\client\renderer\texture + + + net\minecraft\client\renderer\texture + + + net\minecraft\client\renderer\texture\custom + + + net\minecraft\client\renderer\texture\custom + + + Xbox\Source Files\XUI\Menu screens\Help & Options\Settings + + + Xbox\Source Files\XUI + + + PS3\PS3Extras + + + PS3\PS3Extras + + + net\minecraft\client\renderer\texture + + + net\minecraft\client\renderer\texture + + + net\minecraft\client\skins + + + Common\Source Files\DLC + + + Common\Source Files\DLC + + + Common\Source Files\DLC + + + Common\Source Files\DLC + + + Common\Source Files\DLC + + + Common\Source Files\DLC + + + Header Files + + + Windows64\4JLibs\inc + + + Windows64\4JLibs\inc + + + Windows64\4JLibs\inc + + + Windows64\4JLibs\inc + + + Windows64\GameConfig + + + Windows64\XML + + + Windows64\Source Files + + + Windows64\Source Files\Social + + + Windows64\Source Files\Sentient + + + Windows64\Source Files\Sentient + + + Windows64\Source Files\Sentient + + + Windows64\Source Files\Sentient + + + Windows64\Source Files\Sentient + + + Windows64\Source Files\Sentient + + + Windows64 + + + Windows64 + + + Durango\Source Files + + + Orbis\OrbisExtras + + + Orbis\4JLibs\inc + + + Orbis\4JLibs\inc + + + Orbis\4JLibs\inc + + + Orbis\4JLibs\inc + + + Orbis\OrbisExtras + + + Orbis\OrbisExtras + + + Xbox\Source Files\XUI\Base Scene + + + Header Files + + + Common\Source Files\DLC + + + Orbis + + + Orbis\OrbisExtras + + + Orbis\Source Files\Sentient + + + Orbis\Source Files\Sentient + + + Orbis\Source Files\Sentient + + + Orbis\Source Files\Sentient + + + Orbis\Source Files\Sentient + + + Orbis\Source Files\Sentient + + + Orbis\Source Files\Social + + + Orbis\XML + + + Orbis\Source Files + + + Orbis\OrbisExtras + + + net\minecraft\client\particle + + + net\minecraft\client\particle + + + Common + + + Common + + + Common + + + Common + + + net\minecraft\client\model + + + net\minecraft\client\renderer\entity + + + Windows64\Miles Sound System\Include + + + Windows64\Miles Sound System\Include + + + Orbis\Miles Sound System\include + + + Orbis\Miles Sound System\include + + + Durango\Miles Sound System\include + + + Durango\Miles Sound System\include + + + PS3\Miles Sound System\include + + + PS3\Miles Sound System\include + + + Common\Source Files\Audio + + + Xbox\Source Files\Audio + + + Common\Source Files\Audio + + + PS3\PS3Extras + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\CompressedTile_SPU + + + Common\Source Files\Localisation + + + Common\Source Files\DLC + + + Common\Source Files\GameRules\LevelGeneration + + + Common\Source Files\GameRules\LevelGeneration + + + Common\Source Files\GameRules\LevelGeneration + + + Common\Source Files\GameRules\LevelRules\RuleDefinitions + + + Common\Source Files\GameRules\LevelRules\Rules + + + Common\Source Files\GameRules\LevelRules + + + Common\Source Files\DLC + + + PS3 + + + Common\Source Files\GameRules\LevelRules\Rules + + + Common\Source Files\GameRules + + + Common\Source Files\GameRules + + + Common\Source Files\GameRules\LevelRules\RuleDefinitions + + + Common\Source Files\GameRules\LevelRules\RuleDefinitions + + + Common\Source Files\UI + + + Windows64\Iggy\include + + + Windows64\Iggy\include + + + Windows64\Iggy\include + + + Windows64\Iggy\include + + + Windows64\Iggy\include + + + Windows64\Iggy\gdraw + + + Windows64 + + + Common\Source Files\UI + + + Common\Source Files\UI + + + Common\Source Files\UI + + + Common\Source Files\UI + + + Common\Source Files\GameRules\LevelGeneration + + + net\minecraft\client\renderer\tileentity + + + net\minecraft\client\model + + + Xbox\Source Files\XUI\Menu screens\Debug + + + Common\Source Files\DLC + + + Common\Source Files\Colours + + + Common\Source Files\DLC + + + Common\Source Files\DLC + + + Common\Source Files\DLC + + + Durango\DurangoExtras + + + Durango\Iggy\include + + + Durango\Iggy\include + + + Durango\Iggy\include + + + Durango\Iggy\include + + + Durango\Iggy\include + + + Durango\Iggy\gdraw + + + Durango + + + PS3 + + + PS3\Iggy\gdraw + + + PS3\Iggy\include + + + PS3\Iggy\include + + + PS3\Iggy\include + + + PS3\Iggy\include + + + PS3\Iggy\include + + + PS3\Iggy\include + + + Common\Source Files\zlib + + + Common\Source Files\zlib + + + Common\Source Files\zlib + + + Common\Source Files\zlib + + + Common\Source Files\zlib + + + Common\Source Files\zlib + + + Common\Source Files\zlib + + + Common\Source Files\zlib + + + Common\Source Files\zlib + + + Common\Source Files\zlib + + + Common\Source Files\zlib + + + Orbis\Iggy\gdraw + + + Orbis\Iggy\include + + + Orbis\Iggy\include + + + Orbis\Iggy\include + + + Orbis\Iggy\include + + + Orbis\Iggy\include + + + Orbis\Iggy\include + + + Common\Source Files\Network + + + Common\Source Files\UI + + + Common\Source Files\UI + + + Common\Source Files\UI\Scenes\Debug + + + Xbox\Source Files + + + Common\Source Files\Network + + + Common\Source Files\Network + + + PS3\PS3Extras + + + Common\Source Files\UI\Scenes\Frontend Menu screens + + + Common\Source Files\UI\Scenes\In-Game Menu Screens\Containers + + + Common\Source Files\UI\Scenes\In-Game Menu Screens\Containers + + + Common\Source Files\UI\Scenes\In-Game Menu Screens\Containers + + + Common\Source Files\UI\Scenes\In-Game Menu Screens\Containers + + + Common\Source Files\UI\Scenes\Frontend Menu screens + + + PS3\PS3Extras + + + Common\Source Files\UI\Scenes\Frontend Menu screens + + + Common\Source Files\UI\Scenes + + + Common\Source Files\UI\Components + + + Common\Source Files\UI\Components + + + Common\Source Files\UI\Scenes\Frontend Menu screens + + + Common\Source Files\UI\Scenes\Frontend Menu screens + + + Common\Source Files\UI\All Platforms + + + Common\Source Files\UI\All Platforms + + + Common\Source Files\UI\All Platforms + + + Common\Source Files\UI\All Platforms + + + Common\Source Files\UI\All Platforms + + + Common\Source Files\UI\All Platforms + + + Common\Source Files\UI\All Platforms + + + Common\Source Files\UI\All Platforms + + + Common\Source Files\UI\All Platforms + + + Common\Source Files\UI\All Platforms + + + Common\Source Files\UI\Scenes\In-Game Menu Screens\Containers + + + Common\Source Files\UI\Scenes\In-Game Menu Screens\Containers + + + Common\Source Files\UI\Scenes\In-Game Menu Screens\Containers + + + Common\Source Files\UI\Scenes\In-Game Menu Screens\Containers + + + Common\Source Files\UI\Scenes\Help & Options + + + Common\Source Files\UI\Scenes\Help & Options + + + Common\Source Files\UI\Scenes\Help & Options + + + Common\Source Files\UI\Controls + + + Common\Source Files\UI\Controls + + + Common\Source Files\UI\Controls + + + Common\Source Files\UI\Controls + + + Common\Source Files\UI\Controls + + + Common\Source Files\UI\Controls + + + Common\Source Files\UI\Controls + + + Common\Source Files\UI\Controls + + + Common\Source Files\UI\Controls + + + Common\Source Files\UI\Scenes\Help & Options + + + Common\Source Files\UI\Scenes\Help & Options + + + Common\Source Files\UI\Scenes\Help & Options + + + Common\Source Files\UI\Scenes\Help & Options + + + Common\Source Files\Network + + + Common\Source Files\UI\All Platforms + + + Common\Source Files\UI\Scenes\Debug + + + Common\Source Files\UI\Components + + + Xbox\Source Files\Network + + + Common\Source Files\Network + + + Xbox\Source Files\Network + + + Orbis + + + Common\Source Files\UI\Controls + + + Common\Source Files\UI\Scenes\Frontend Menu screens + + + Common\Source Files\UI\Components + + + Common\Source Files\UI\Components + + + Common\Source Files\UI\Scenes\In-Game Menu Screens + + + Common\Source Files\UI\Scenes\In-Game Menu Screens + + + Common\Source Files\UI\Scenes + + + Common\Source Files\BuildVer + + + Common\Source Files\UI\Scenes\Help & Options + + + Common\Source Files\UI\Controls + + + Common\Source Files\UI\All Platforms + + + Common\Source Files\UI\All Platforms + + + Common\Source Files\UI\Scenes\In-Game Menu Screens + + + Common\Source Files\UI\Components + + + Common\Source Files\UI\Scenes\Frontend Menu screens + + + PS3 + + + Common\Source Files\UI\Scenes\Frontend Menu screens + + + Common\Source Files\UI\Scenes\Help & Options + + + Common\Source Files\UI\Scenes\In-Game Menu Screens + + + Common\Source Files\UI\Scenes + + + Common\Source Files\UI\All Platforms + + + Common\Source Files\UI\Components + + + Common\Source Files\UI\Scenes + + + Common\Source Files\UI\Controls + + + PS3\Source Files\Network + + + PS3\Source Files\Leaderboards + + + Common\Source Files\Leaderboards + + + Xbox\Source Files\Leaderboards + + + Common\Source Files\UI\Scenes\Help & Options + + + Common\Source Files\UI\Scenes\In-Game Menu Screens + + + Common\Source Files\UI\Scenes\Frontend Menu screens + + + Common\Source Files\UI\Controls + + + Windows64\Source Files\Leaderboards + + + Orbis\Source Files\Leaderboards + + + Durango\Source Files\Leaderboards + + + Common\Source Files\UI\Scenes\Help & Options + + + Common\Source Files\UI\Scenes\Frontend Menu screens + + + Common\Source Files\UI\Scenes\Frontend Menu screens + + + Common\Source Files\UI\Controls + + + Common\Source Files\UI\Controls + + + Common\Source Files\UI\Controls + + + Common\Source Files\UI\Scenes + + + Common\Source Files\UI\Controls + + + Common\Source Files\UI\Controls + + + PS3\PS3Extras + + + Common\Source Files\UI\Scenes\In-Game Menu Screens + + + Common\Source Files\UI\Controls + + + Common\Source Files\UI\Controls + + + Common\Source Files\UI\Controls + + + Common\Source Files\UI\Scenes\In-Game Menu Screens + + + Common\Source Files\UI\Controls + + + Common\Source Files\UI\Scenes\In-Game Menu Screens + + + PS3\PS3Extras + + + Common\Source Files\UI\Scenes\Frontend Menu screens + + + Common\Source Files\UI\Scenes\Help & Options + + + Common\Source Files\UI\Scenes\Help & Options + + + Common\Source Files\UI\Components + + + PS3\4JLibs + + + Common\Source Files\UI\Components + + + Common\Source Files\UI\Scenes\Frontend Menu screens + + + PS3\Source Files + + + Common\Source Files\UI\Controls + + + Xbox\Source Files\XUI\Menu screens + + + net\minecraft\client\renderer\tileentity + + + Common\Source Files\UI\All Platforms + + + Common\Source Files\UI\Scenes\In-Game Menu Screens\Containers + + + Durango\Source Files\Achievements + + + Common\Source Files\UI\Scenes\Debug + + + Xbox\Source Files\XUI\Containers + + + Common\Source Files\UI\Scenes\In-Game Menu Screens\Containers + + + Common\Source Files\UI\All Platforms + + + Xbox\Source Files\XUI\Containers + + + net\minecraft\client\model + + + net\minecraft\client\renderer\entity + + + Orbis + + + Orbis\Source Files + + + Orbis\Network + + + net\minecraft\server\commands + + + net\minecraft\server\commands + + + Durango\Network + + + Durango\Network + + + Durango\Network + + + Common\Source Files\Network\Sony + + + Common\Source Files\Network\Sony + + + Orbis\Network + + + PS3\Source Files\Network + + + Common\Source Files\Network\Sony + + + Common\Source Files\Network\Sony + + + Orbis\Network + + + Common\Source Files\Network\Sony + + + Common\Source Files\Network\Sony + + + PS3\Source Files\Network + + + PS3\Source Files\Network + + + Orbis\Network + + + Common\Source Files\GameRules\LevelGeneration + + + Durango\Network + + + Common\Source Files\UI\Scenes\In-Game Menu Screens + + + Xbox\Source Files\XUI\Menu screens + + + Durango\Network + + + PSVita\4JLibs\inc + + + PSVita\4JLibs\inc + + + PSVita\4JLibs\inc + + + PSVita\4JLibs\inc + + + PSVita\PSVitaExtras + + + PSVita\PSVitaExtras + + + PSVita\PSVitaExtras + + + PSVita + + + PSVita\Source Files\Sentient + + + PSVita\Source Files\Sentient + + + PSVita\Source Files\Sentient + + + PSVita\Source Files\Sentient + + + PSVita\Source Files\Sentient + + + PSVita\Source Files\Sentient + + + PSVita\Source Files\Social + + + PSVita\XML + + + PSVita + + + PSVita\GameConfig + + + Orbis\Network + + + Common\Source Files\UI\Scenes\Debug + + + Durango\Source Files + + + Durango\Network + + + Durango\Source Files\Leaderboards + + + Common\Source Files\Telemetry + + + Durango\Source Files\Sentient + + + Durango\ServiceConfig + + + Common\Source Files\UI + + + Common\Source Files\Network\Sony + + + Orbis\Network + + + PS3\Source Files\Network + + + Common\Source Files\UI\Components + + + Durango\Network + + + Durango\XML + + + PSVita\Iggy\gdraw + + + PSVita\Iggy\include + + + PSVita\Iggy\include + + + PSVita\Iggy\include + + + PSVita\Iggy\include + + + PSVita\Iggy\include + + + PSVita\Iggy\include + + + PSVita\PSVitaExtras + + + PSVita\PSVitaExtras + + + PSVita\PSVitaExtras + + + PSVita\PSVitaExtras + + + PSVita\PSVitaExtras + + + PSVita\PSVitaExtras + + + PSVita\PSVitaExtras + + + Common\Source Files\UI\Controls + + + PSVita\Source Files\Network + + + PSVita\Source Files\Network + + + PSVita\Source Files\Network + + + PSVita\Source Files\Leaderboards + + + Common\Source Files\UI\Scenes\Frontend Menu screens + + + PSVita\Miles Sound System\Include + + + PSVita\Miles Sound System\Include + + + Durango\Source Files\Leaderboards + + + PSVita\Source Files\Network + + + PSVita\Source Files\Network + + + PSVita\PSVitaExtras + + + PSVita\PSVitaExtras + + + Xbox\4JLibs\inc + + + Common\Source Files\UI\Controls + + + Common\Source Files\UI\Scenes\In-Game Menu Screens + + + PSVita\Source Files\Network + + + PSVita\Source Files\Network + + + Orbis\Network + + + Xbox\Source Files\Network + + + 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 + + + + + Source Files + + + net\minecraft\client\renderer\culling + + + net\minecraft\client\renderer\culling + + + net\minecraft\client\renderer\culling + + + net\minecraft\client\renderer\culling + + + net\minecraft\client\renderer\culling + + + Source Files + + + net\minecraft\client\renderer + + + net\minecraft\client\renderer + + + 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\model + + + 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\model + + + 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\renderer + + + 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\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\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\tileentity + + + net\minecraft\client\renderer\tileentity + + + net\minecraft\client\renderer\tileentity + + + net\minecraft\client\renderer + + + net\minecraft\client\skins + + + net\minecraft\client\skins + + + net\minecraft\client\skins + + + net\minecraft\client\renderer + + + net\minecraft\client\renderer + + + net\minecraft\client\renderer + + + net\minecraft\client\renderer + + + net\minecraft\client\renderer + + + net\minecraft\client\renderer + + + net\minecraft\client\renderer + + + net\minecraft\client\renderer + + + net\minecraft\client\particle + + + net\minecraft\client\particle + + + net\minecraft\client\particle + + + net\minecraft\client\particle + + + net\minecraft\client\particle + + + net\minecraft\client\particle + + + net\minecraft\client\particle + + + net\minecraft\client\particle + + + net\minecraft\client\particle + + + net\minecraft\client\particle + + + net\minecraft\client\particle + + + net\minecraft\client\particle + + + net\minecraft\client\particle + + + net\minecraft\client\particle + + + net\minecraft\client\particle + + + net\minecraft\client\particle + + + net\minecraft\client\particle + + + net\minecraft\client + + + net\minecraft\client\player + + + net\minecraft\client\player + + + net\minecraft\stats + + + net\minecraft\stats + + + net\minecraft\client\player + + + net\minecraft\client + + + net\minecraft\client + + + net\minecraft\client + + + net\minecraft\client + + + net\minecraft\client + + + net\minecraft\client + + + net\minecraft\client + + + net\minecraft\client\level + + + net\minecraft\client + + + net\minecraft\client\gui + + + net\minecraft\client + + + net\minecraft\client\gui + + + net\minecraft\client\gui + + + net\minecraft\client\gui + + + net\minecraft\client\gui + + + net\minecraft\client\gui\particle + + + net\minecraft\client\gui\particle + + + net\minecraft\client\gui + + + net\minecraft\client\gui + + + net\minecraft\client\gui + + + net\minecraft\client\gui + + + net\minecraft\client\gui + + + net\minecraft\client\gui + + + net\minecraft\client\gui + + + net\minecraft\client\gui + + + net\minecraft\client\gui + + + net\minecraft\client\gui + + + net\minecraft\client\gui + + + net\minecraft\client\gui + + + net\minecraft\client\gui + + + net\minecraft\client\title + + + net\minecraft\client\gui + + + net\minecraft\client\gui + + + net\minecraft\client\gui + + + net\minecraft\client\gui + + + net\minecraft\client\gui + + + net\minecraft\client\gui + + + net\minecraft\client\gui + + + net\minecraft\client\gui\inventory + + + net\minecraft\client\gui\inventory + + + net\minecraft\client\gui\inventory + + + net\minecraft\client\gui\inventory + + + net\minecraft\client\gui\inventory + + + net\minecraft\client\gui\inventory + + + net\minecraft\client\gui\inventory + + + net\minecraft\client\gui\achievement + + + net\minecraft\client\gui\achievement + + + net\minecraft\client\gui\achievement + + + Source Files + + + Source Files + + + Xbox\Source Files + + + Xbox\Source Files + + + net\minecraft\server\network + + + net\minecraft\server\network + + + net\minecraft\server\network + + + net\minecraft\server + + + net\minecraft\server + + + net\minecraft\server\level + + + net\minecraft\server\level + + + net\minecraft\server\level + + + net\minecraft\server\level + + + net\minecraft\server + + + net\minecraft\server\level + + + net\minecraft\server + + + net\minecraft\server\level + + + net\minecraft\server\level + + + net\minecraft\server\level + + + Xbox\Source Files\XUI\Menu screens + + + net\minecraft\client\multiplayer + + + net\minecraft\client\multiplayer + + + net\minecraft\client\multiplayer + + + net\minecraft\client\multiplayer + + + net\minecraft\client\multiplayer + + + net\minecraft\client\multiplayer + + + net\minecraft\client\multiplayer + + + net\minecraft\client\multiplayer + + + Xbox\Source Files\XUI\Menu screens + + + Xbox\Source Files\XUI\Menu screens + + + Xbox\Source Files\XUI\Menu screens + + + Xbox\Source Files\XUI\Menu screens\Help & Options + + + Xbox\Source Files\XUI\Menu screens\Help & Options\Controls + + + Xbox\Source Files\XUI\Menu screens\Help & Options\Credits + + + Xbox\Source Files\XUI\Menu screens\Help & Options\How To Play + + + Xbox\Source Files\XUI\Menu screens\Help & Options\How To Play + + + Xbox\Source Files\XUI\Menu screens + + + Xbox\Source Files\XUI\Menu screens + + + Xbox\Source Files\XUI\Menu screens + + + Xbox\Source Files\XUI\Menu screens\Tutorial + + + Xbox\Source Files\XUI\Menu screens\Leaderboards + + + Xbox\Source Files\XUI\Menu screens\Pause + + + Xbox\Source Files\XUI\Menu screens + + + Xbox\Source Files\XUI\Menu screens\Debug + + + Xbox\Source Files\XUI\Menu screens\Debug + + + Xbox\Source Files\XUI\Menu screens + + + Xbox\Source Files\XUI\Menu screens + + + Xbox\Source Files\XUI\Controls + + + Xbox\Source Files\XUI\Controls + + + Xbox\Source Files\XUI\Controls + + + Xbox\Source Files\XUI\Controls + + + Xbox\Source Files\XUI\Controls + + + Xbox\Source Files\XUI\Controls + + + Xbox\Source Files\XUI\Controls + + + Xbox\Source Files\XUI\Controls + + + Xbox\Source Files\XUI\Controls + + + Xbox\Source Files\XUI\Controls + + + Xbox\Source Files\XUI\Controls + + + Xbox\Source Files\XUI\Controls + + + Xbox\Source Files\XUI\Menu screens\Social + + + net\minecraft\client\renderer + + + net\minecraft\client\renderer + + + Xbox\Source Files\XUI\Menu screens + + + Xbox\Source Files\XUI\Menu screens + + + Xbox\Source Files\XUI\Menu screens + + + Xbox\XML + + + Xbox\Source Files\Sentient\Telemetry + + + Xbox\Source Files\XUI\Menu screens\Help & Options\Settings + + + Xbox\Source Files\XUI\Controls + + + Xbox\Source Files\Sentient\DynamicConf + + + Xbox\Source Files\XUI\Menu screens + + + Xbox\Source Files\XUI\Controls + + + Xbox\Source Files\Font + + + Xbox\Source Files\Font + + + Xbox\Source Files\Font + + + Xbox\Source Files\XUI\Menu screens\Debug + + + Xbox\Source Files\Sentient + + + Xbox\Source Files\XUI\Menu screens\Help & Options\Settings + + + Xbox\Source Files\XUI\Controls + + + net\minecraft\client\renderer\tileentity + + + Xbox\Source Files\XUI\Menu screens\Help & Options\Settings + + + Xbox\Source Files\XUI\Menu screens\Help & Options\Settings + + + Xbox\Source Files\XUI\Menu screens\Help & Options\Settings + + + Xbox\Source Files\XUI\Menu screens\Help & Options\Settings + + + net\minecraft\server\level + + + net\minecraft\client + + + net\minecraft\client\model + + + net\minecraft\client\model + + + net\minecraft\client\model + + + net\minecraft\client\model + + + net\minecraft\client\particle + + + net\minecraft\client\particle + + + net\minecraft\client\particle + + + net\minecraft\client\particle + + + net\minecraft\client\particle + + + net\minecraft\client\particle + + + net\minecraft\client\particle + + + net\minecraft\client\renderer + + + net\minecraft\client\renderer\entity + + + net\minecraft\client\renderer\entity + + + net\minecraft\client\renderer\entity + + + net\minecraft\client\renderer\tileentity + + + Xbox\Source Files\XUI\Menu screens\Debug + + + Xbox\Source Files\XUI\Menu screens\Debug + + + Xbox\Source Files\XUI\Menu screens + + + Xbox\Source Files\XUI\Menu screens + + + Xbox\Source Files\XUI\Menu screens + + + net\minecraft\client + + + Xbox\Source Files\XUI\Menu screens + + + 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\tileentity + + + net\minecraft\client\particle + + + net\minecraft\client\particle + + + net\minecraft\client\particle + + + net\minecraft\client\model\geom + + + net\minecraft\client\model\geom + + + net\minecraft\client\model\geom + + + net\minecraft\client\model\dragon + + + net\minecraft\client\model\geom + + + net\minecraft\client\model\dragon + + + net\minecraft\client\model + + + net\minecraft\client\model + + + net\minecraft\client\model + + + net\minecraft\client\model + + + net\minecraft\client\model + + + net\minecraft\client\model\geom + + + Xbox\Source Files\XUI\Controls + + + Xbox\Source Files\XUI\Controls + + + Xbox\Source Files\XUI\Controls + + + Xbox\Source Files\XUI\Controls + + + Xbox\Source Files\XUI\Controls + + + Xbox\Source Files\XUI\Controls + + + Xbox\Source Files\XUI\Menu screens + + + Xbox\Source Files\Social + + + Source Files + + + Common\Source Files\Trial + + + Common\Source Files\Tutorial\Constraints + + + Common\Source Files\Tutorial\Constraints + + + Common\Source Files\Tutorial\Constraints + + + Common\Source Files\Tutorial\Hints + + + Common\Source Files\Tutorial\Hints + + + Common\Source Files\Tutorial\Hints + + + Common\Source Files\Tutorial\Hints + + + Common\Source Files\Tutorial\Hints + + + Common\Source Files\Tutorial\Tasks + + + Common\Source Files\Tutorial\Tasks + + + Common\Source Files\Tutorial\Tasks + + + Common\Source Files\Tutorial\Tasks + + + Common\Source Files\Tutorial\Tasks + + + Common\Source Files\Tutorial\Tasks + + + Common\Source Files\Tutorial\Tasks + + + Common\Source Files\Tutorial\Tasks + + + Common\Source Files\Tutorial\Tasks + + + Common\Source Files\Tutorial\Tasks + + + Common\Source Files\Tutorial\Tasks + + + Common\Source Files\Tutorial\Tasks + + + Common\Source Files\Tutorial\Tasks + + + Common\Source Files\Tutorial\Tasks + + + Common\Source Files\Tutorial\Tasks + + + Common\Source Files\Tutorial\Tasks + + + Common\Source Files\GameRules\LevelGeneration\StructureActions + + + Common\Source Files\GameRules\LevelGeneration\StructureActions + + + Common\Source Files\GameRules\LevelGeneration\StructureActions + + + Common\Source Files\GameRules\LevelGeneration\StructureActions + + + Common\Source Files\GameRules\LevelGeneration + + + Common\Source Files\GameRules\LevelRules\RuleDefinitions + + + Common\Source Files\GameRules\LevelRules\RuleDefinitions + + + Common\Source Files\GameRules\LevelRules\RuleDefinitions + + + Common\Source Files\GameRules\LevelRules\RuleDefinitions + + + Common\Source Files\GameRules\LevelRules\RuleDefinitions + + + Common\Source Files\GameRules\LevelRules\RuleDefinitions + + + Common\Source Files\GameRules\LevelRules\RuleDefinitions + + + Common\Source Files\Tutorial + + + Common\Source Files\Tutorial + + + Common\Source Files\Tutorial + + + Common\Source Files\Tutorial + + + Common\Source Files\Tutorial + + + Common\Source Files\Tutorial\Hints + + + PS3\Source Files + + + PS3\PS3Extras + + + Durango + + + Durango\Source Files + + + Common\Source Files + + + Common\Source Files + + + Common\Source Files\GameRules\LevelGeneration + + + PS3 + + + Xbox\Source Files\XUI + + + Xbox\Source Files\XUI + + + Xbox\Source Files\XUI\Base Scene + + + Xbox\Source Files\XUI\Base Scene + + + Xbox\Source Files\XUI\Base Scene + + + Xbox\Source Files\XUI\Containers + + + Xbox\Source Files\XUI\Containers + + + Xbox\Source Files\XUI\Containers + + + Xbox\Source Files\XUI\Containers + + + Xbox\Source Files\XUI\Containers + + + Xbox\Source Files\XUI\Containers + + + Xbox\Source Files\XUI\Containers + + + Xbox\Source Files\XUI\Containers + + + Xbox\Source Files\XUI\Containers + + + Xbox\Source Files\XUI\Controls + + + net\minecraft\client\skins + + + net\minecraft\client\particle + + + net\minecraft\client\skins + + + net\minecraft\client\renderer\entity + + + net\minecraft\client\renderer + + + net\minecraft\client\renderer\texture + + + net\minecraft\client\renderer\texture + + + net\minecraft\client\renderer\texture + + + net\minecraft\client\renderer\texture + + + net\minecraft\client\renderer\texture + + + net\minecraft\client\renderer\texture + + + net\minecraft\client\renderer\texture + + + net\minecraft\client\renderer\texture\custom + + + net\minecraft\client\renderer\texture\custom + + + Xbox\Source Files\XUI\Menu screens\Help & Options\Settings + + + PS3\PS3Extras + + + Xbox\Source Files\XUI\Menu screens + + + net\minecraft\client\skins + + + net\minecraft\client\renderer\texture + + + net\minecraft\client\renderer\texture + + + net\minecraft\client\skins + + + Common\Source Files\DLC + + + Common\Source Files\DLC + + + Common\Source Files\DLC + + + Common\Source Files\DLC + + + Common\Source Files\DLC + + + Common\Source Files\DLC + + + Windows64\Source Files + + + Windows64 + + + Durango\Source Files + + + Orbis\OrbisExtras + + + Xbox\Source Files\XUI\Base Scene + + + Common\Source Files\DLC + + + Orbis\OrbisExtras + + + Orbis + + + Orbis\Source Files + + + net\minecraft\client\particle + + + net\minecraft\client\particle + + + Common + + + net\minecraft\client\renderer\entity + + + net\minecraft\client\model + + + Xbox\Source Files\Audio + + + Common\Source Files\Audio + + + Common\Source Files\Audio + + + PS3\PS3Extras + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\ChunkRebuild_SPU + + + PS3\CompressedTile_SPU + + + Common\Source Files\Localisation + + + Common\Source Files\DLC + + + Common\Source Files\GameRules\LevelGeneration + + + Common\Source Files\GameRules\LevelGeneration + + + Common\Source Files\GameRules\LevelGeneration + + + Common\Source Files\GameRules\LevelRules\RuleDefinitions + + + Common\Source Files\GameRules\LevelRules\Rules + + + Common\Source Files\GameRules\LevelRules + + + Common\Source Files\DLC + + + PS3 + + + Common\Source Files\GameRules + + + Common\Source Files\GameRules + + + Common\Source Files\GameRules\LevelRules\RuleDefinitions + + + Common\Source Files\GameRules\LevelRules\RuleDefinitions + + + Common\Source Files\UI + + + Windows64\Iggy\gdraw + + + Windows64 + + + Common\Source Files\UI + + + Common\Source Files\UI + + + Common\Source Files\UI + + + Common\Source Files\GameRules\LevelGeneration + + + net\minecraft\client\renderer\tileentity + + + net\minecraft\client\model + + + Xbox\Source Files\XUI\Menu screens\Debug + + + Common\Source Files\DLC + + + Common\Source Files\Colours + + + Common\Source Files\DLC + + + Common\Source Files\DLC + + + Durango\DurangoExtras + + + Durango\Iggy\gdraw + + + Durango + + + PS3 + + + PS3\Iggy\gdraw + + + Common\Source Files\zlib + + + Common\Source Files\zlib + + + Common\Source Files\zlib + + + Common\Source Files\zlib + + + Common\Source Files\zlib + + + Common\Source Files\zlib + + + Common\Source Files\zlib + + + Common\Source Files\zlib + + + Common\Source Files\zlib + + + Common\Source Files\zlib + + + Common\Source Files\zlib + + + Common\Source Files\zlib + + + Common\Source Files\zlib + + + Common\Source Files\zlib + + + Common\Source Files\zlib + + + PS3\Source Files\Audio + + + Common\Source Files\UI + + + Common\Source Files\UI + + + Orbis\Iggy\gdraw + + + Common\Source Files\UI\Scenes\Debug + + + Xbox\Source Files + + + Common\Source Files\Network + + + PS3\PS3Extras + + + Common\Source Files\UI\Scenes\Frontend Menu screens + + + Common\Source Files\UI\Scenes\In-Game Menu Screens\Containers + + + Common\Source Files\UI\Scenes\In-Game Menu Screens\Containers + + + Common\Source Files\UI\Scenes\In-Game Menu Screens\Containers + + + Common\Source Files\UI\Scenes\In-Game Menu Screens\Containers + + + Common\Source Files\UI\Scenes\Frontend Menu screens + + + Common\Source Files\UI\Scenes\Frontend Menu screens + + + Common\Source Files\UI\Scenes + + + Common\Source Files\UI\Components + + + Common\Source Files\UI\Components + + + Common\Source Files\UI\Scenes\Frontend Menu screens + + + Common\Source Files\UI\Scenes\Frontend Menu screens + + + Common\Source Files\UI\All Platforms + + + Common\Source Files\UI\All Platforms + + + Common\Source Files\UI\All Platforms + + + Common\Source Files\UI\All Platforms + + + Common\Source Files\UI\All Platforms + + + Common\Source Files\UI\All Platforms + + + Common\Source Files\UI\All Platforms + + + Common\Source Files\UI\All Platforms + + + Common\Source Files\UI\Scenes\In-Game Menu Screens\Containers + + + Common\Source Files\UI\Scenes\In-Game Menu Screens\Containers + + + Common\Source Files\UI\Scenes\In-Game Menu Screens\Containers + + + Common\Source Files\UI\Scenes\In-Game Menu Screens\Containers + + + Common\Source Files\UI\Scenes\Help & Options + + + Common\Source Files\UI\Scenes\Help & Options + + + Common\Source Files\UI\Scenes\Help & Options + + + Common\Source Files\UI\Controls + + + Common\Source Files\UI\Controls + + + Common\Source Files\UI\Controls + + + Common\Source Files\UI\Controls + + + Common\Source Files\UI\Controls + + + Common\Source Files\UI\Controls + + + Common\Source Files\UI\Controls + + + Common\Source Files\UI\Controls + + + Common\Source Files\UI\Controls + + + Common\Source Files\UI\Scenes\Help & Options + + + Common\Source Files\UI\Scenes\Help & Options + + + Common\Source Files\UI\Scenes\Help & Options + + + Common\Source Files\UI\Scenes\Help & Options + + + Common\Source Files\UI\All Platforms + + + Common\Source Files\UI\Scenes\Debug + + + Common\Source Files\UI\Components + + + Xbox\Source Files\Network + + + Common\Source Files\Network + + + Xbox\Source Files\Network + + + Orbis + + + Common\Source Files\UI\Controls + + + Common\Source Files\UI\Scenes\Frontend Menu screens + + + Common\Source Files\UI\Components + + + Common\Source Files\UI\Components + + + Common\Source Files\UI\Scenes\In-Game Menu Screens + + + Common\Source Files\UI\Scenes\In-Game Menu Screens + + + Common\Source Files\UI\Scenes + + + Common\Source Files\UI\Scenes\Help & Options + + + Common\Source Files\UI\Controls + + + Common\Source Files\UI\All Platforms + + + Common\Source Files\UI\Scenes\In-Game Menu Screens + + + Common\Source Files\UI\Components + + + Common\Source Files\UI\Scenes\Frontend Menu screens + + + Common\Source Files\UI\Scenes\Frontend Menu screens + + + Common\Source Files\UI\Scenes\Help & Options + + + Common\Source Files\UI\Scenes\In-Game Menu Screens + + + Common\Source Files\UI\Scenes + + + Common\Source Files\UI\All Platforms + + + Common\Source Files\UI\Components + + + Common\Source Files\UI\Scenes + + + Common\Source Files\UI\Controls + + + PS3\Source Files\Network + + + PS3\Source Files\Leaderboards + + + Common\Source Files\Leaderboards + + + Xbox\Source Files\Leaderboards + + + Common\Source Files\UI\Scenes\Help & Options + + + Common\Source Files\UI\Scenes\In-Game Menu Screens + + + Common\Source Files\UI\Scenes\Frontend Menu screens + + + Common\Source Files\UI\Controls + + + Windows64\Source Files\Leaderboards + + + Orbis\Source Files\Leaderboards + + + Durango\Source Files\Leaderboards + + + Common\Source Files\UI\Scenes\Help & Options + + + Common\Source Files\UI\Scenes\Frontend Menu screens + + + Common\Source Files\UI\Scenes\Frontend Menu screens + + + Common\Source Files\UI\Controls + + + Common\Source Files\UI\Controls + + + Common\Source Files\UI\Controls + + + Common\Source Files\UI\Scenes + + + Common\Source Files\UI\Controls + + + Common\Source Files\UI\Controls + + + PS3\PS3Extras + + + Common\Source Files\UI\Scenes\In-Game Menu Screens + + + Common\Source Files\UI\Controls + + + Common\Source Files\UI\Controls + + + Common\Source Files\UI\Controls + + + Common\Source Files\UI\Scenes\In-Game Menu Screens + + + Common\Source Files\UI\Controls + + + Common\Source Files\UI\Scenes\In-Game Menu Screens + + + PS3\PS3Extras + + + Common\Source Files\UI\Scenes\Frontend Menu screens + + + Common\Source Files\UI\Scenes\Help & Options + + + Common\Source Files\UI\Scenes\Help & Options + + + Common\Source Files\UI\Components + + + PS3\4JLibs + + + Common\Source Files\UI\Components + + + Common\Source Files\UI\Scenes\Frontend Menu screens + + + Common\Source Files\Audio + + + PS3\Source Files + + + Common\Source Files\UI\Controls + + + Xbox\Source Files\XUI\Menu screens + + + net\minecraft\client\renderer\tileentity + + + Common\Source Files\UI\All Platforms + + + Common\Source Files\UI\Scenes\In-Game Menu Screens\Containers + + + Durango\Source Files\Achievements + + + Common\Source Files\UI\Scenes\Debug + + + Xbox\Source Files\XUI\Containers + + + Common\Source Files\UI\All Platforms + + + Common\Source Files\UI\Scenes\In-Game Menu Screens\Containers + + + Xbox\Source Files\XUI\Containers + + + net\minecraft\client\model + + + net\minecraft\client\renderer\entity + + + Orbis + + + Orbis\Network + + + net\minecraft\server\commands + + + net\minecraft\server\commands + + + Durango\Network + + + Durango\Network + + + Durango\Network + + + Common\Source Files\Network\Sony + + + Common\Source Files\Network\Sony + + + Common\Source Files\Network\Sony + + + PS3\Source Files\Network + + + Orbis\Network + + + Orbis\Network + + + Common\Source Files\Network\Sony + + + PS3\Source Files\Network + + + PS3\Source Files\Network + + + Orbis\Network + + + Common\Source Files\GameRules\LevelGeneration + + + Durango\Network + + + Common\Source Files\UI\Scenes\In-Game Menu Screens + + + Xbox\Source Files\XUI\Menu screens + + + Durango\Network + + + PSVita + + + PSVita + + + PSVita\Source Files + + + PSVita\PSVitaExtras + + + Orbis\Network + + + Common\Source Files\Network\Sony + + + Common\Source Files\UI\Scenes\Debug + + + Durango\Network + + + Durango\Source Files\Leaderboards + + + Common\Source Files\Telemetry + + + Durango\Source Files\Sentient + + + Common\Source Files\UI + + + Orbis\Network + + + PS3\Source Files\Network + + + Common\Source Files\Network\Sony + + + Orbis + + + Orbis + + + Orbis + + + Common\Source Files\UI\Components + + + Durango\Network + + + Durango\Network + + + Durango\Network + + + Durango\Network + + + Durango\Network + + + Durango\XML + + + PSVita\Iggy\gdraw + + + PSVita\PSVitaExtras + + + PSVita\PSVitaExtras + + + PSVita\PSVitaExtras + + + PSVita\PSVitaExtras + + + PSVita\PSVitaExtras + + + PSVita\PSVitaExtras + + + Common\Source Files\UI\Controls + + + PSVita\Source Files\Network + + + PSVita\Source Files\Network + + + PSVita\Source Files\Network + + + PSVita\Source Files\Leaderboards + + + Common\Source Files\UI\Scenes\Frontend Menu screens + + + Durango\Source Files\Leaderboards + + + PSVita\Source Files\Network + + + PSVita\Source Files\Network + + + PSVita\PSVitaExtras + + + PSVita\PSVitaExtras + + + Common\Source Files\UI\Controls + + + Common\Source Files\UI\Scenes\In-Game Menu Screens + + + PSVita\Source Files\Network + + + PSVita\Source Files\Network + + + Orbis\Network + + + 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 + + + + + Xbox\4JLibs\libs + + + Xbox\4JLibs\libs + + + Durango\4JLibs\libs + + + Xbox\4JLibs\libs + + + Xbox\4JLibs\libs + + + Xbox\4JLibs\libs + + + Xbox\4JLibs\libs + + + Xbox\4JLibs\libs + + + Xbox\4JLibs\libs + + + Xbox\4JLibs\libs + + + Xbox\4JLibs\libs + + + Xbox\4JLibs\libs + + + Durango\4JLibs\libs + + + Durango\4JLibs\libs + + + Durango\4JLibs\libs + + + Windows64\4JLibs\libs + + + Windows64\4JLibs\libs + + + Windows64\4JLibs\libs + + + Windows64\4JLibs\libs + + + Windows64\Miles Sound System\lib + + + Windows64\Iggy\lib + + + Windows64\Iggy\lib + + + Windows64\Iggy\lib + + + Durango\Iggy\lib + + + Durango\Iggy\lib + + + Durango\Iggy\lib + + + Durango\Iggy\lib + + + PS3\Iggy\lib + + + PS3\Iggy\lib + + + PS3\Iggy\lib + + + Orbis\Iggy\lib + + + Orbis\Iggy\lib + + + PS3\4JLibs\libs + + + PS3\4JLibs\libs + + + PS3\4JLibs\libs + + + PS3\4JLibs\libs + + + PS3\4JLibs\libs + + + PS3\4JLibs\libs + + + PS3\4JLibs\libs + + + PS3\4JLibs\libs + + + Durango\Miles Sound System\lib + + + Durango\Miles Sound System\lib + + + PS3\4JLibs\libs + + + PS3\4JLibs\libs + + + PS3\4JLibs\libs + + + PS3\4JLibs\libs + + + Orbis\4JLibs\libs + + + Orbis\4JLibs\libs + + + Orbis\4JLibs\libs + + + Durango\4JLibs\libs + + + Durango\4JLibs\libs + + + Durango\4JLibs\libs + + + Windows64\4JLibs\libs + + + Windows64\4JLibs\libs + + + Durango\4JLibs\libs + + + Durango\4JLibs\libs + + + Orbis\4JLibs\libs + + + Orbis\4JLibs\libs + + + Orbis\4JLibs\libs + + + Durango\4JLibs\libs + + + Durango\4JLibs\libs + + + PSVita\4JLibs\libs + + + PSVita\4JLibs\libs + + + PSVita\4JLibs\libs + + + PSVita\4JLibs\libs + + + PSVita\4JLibs\libs + + + PSVita\4JLibs\libs + + + PSVita\4JLibs\libs + + + PSVita\4JLibs\libs + + + PSVita\4JLibs\libs + + + PSVita\4JLibs\libs + + + PSVita\4JLibs\libs + + + PSVita\4JLibs\libs + + + PSVita\Iggy\Lib + + + 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 + + + PSVita\4JLibs\libs + + + PSVita\4JLibs\libs + + + PSVita\4JLibs\libs + + + PSVita\4JLibs\libs + + + + + Xbox\SentientLibs + + + + + Windows + + + Windows + + + Durango + + + + + Windows + + + + + PS3\SPUObjFiles\Release + + + PS3\SPUObjFiles\Release + + + PS3\SPUObjFiles\Release + + + PS3\SPUObjFiles\Release + + + PS3\SPUObjFiles\Release + + + PS3\SPUObjFiles\Release + + + PS3\SPUObjFiles\Release + + + PS3\SPUObjFiles\Release + + + PS3\SPUObjFiles\Release + + + PS3\SPUObjFiles\Debug + + + PS3\SPUObjFiles\Debug + + + PS3\SPUObjFiles\Debug + + + PS3\SPUObjFiles\Debug + + + PS3\SPUObjFiles\Debug + + + PS3\SPUObjFiles\Debug + + + PS3\SPUObjFiles\Debug + + + PS3\SPUObjFiles\Debug + + + PS3\SPUObjFiles\Debug + + + PS3\SPUObjFiles\ContentPackage + + + PS3\SPUObjFiles\ContentPackage + + + PS3\SPUObjFiles\ContentPackage + + + PS3\SPUObjFiles\ContentPackage + + + PS3\SPUObjFiles\ContentPackage + + + PS3\SPUObjFiles\ContentPackage + + + PS3\SPUObjFiles\ContentPackage + + + PS3\SPUObjFiles\ContentPackage + + + PS3\SPUObjFiles\ContentPackage + + + PS3\SPUObjFiles\Release + + + PS3\SPUObjFiles\Debug + + + PS3\SPUObjFiles\ContentPackage + + + + + + + + + \ No newline at end of file diff --git a/Minecraft.Client/Minecraft.Client.vcxproj.user b/Minecraft.Client/Minecraft.Client.vcxproj.user new file mode 100644 index 00000000..ace9a86a --- /dev/null +++ b/Minecraft.Client/Minecraft.Client.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/Minecraft.Client/Minecraft.Client.vcxproj.vspscc b/Minecraft.Client/Minecraft.Client.vcxproj.vspscc new file mode 100644 index 00000000..78a55451 --- /dev/null +++ b/Minecraft.Client/Minecraft.Client.vcxproj.vspscc @@ -0,0 +1,11 @@ +"" +{ +"FILE_VERSION" = "9237" +"ENLISTMENT_CHOICE" = "NEVER" +"PROJECT_FILE_RELATIVE_PATH" = "" +"NUMBER_OF_EXCLUDED_FILES" = "1" +"EXCLUDED_FILE0" = "Durango\\Autogenerated.appxmanifest" +"ORIGINAL_PROJECT_FILE_PATH" = "" +"NUMBER_OF_NESTED_PROJECTS" = "0" +"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER" +} diff --git a/Minecraft.Client/Minecraft.cpp b/Minecraft.Client/Minecraft.cpp new file mode 100644 index 00000000..488be368 --- /dev/null +++ b/Minecraft.Client/Minecraft.cpp @@ -0,0 +1,4993 @@ +#include "stdafx.h" +#include "Minecraft.h" +#include "GameMode.h" +#include "Timer.h" +#include "ProgressRenderer.h" +#include "LevelRenderer.h" +#include "ParticleEngine.h" +#include "MultiPlayerLocalPlayer.h" +#include "User.h" +#include "Textures.h" +#include "GameRenderer.h" +#include "HumanoidModel.h" +#include "Options.h" +#include "TexturePackRepository.h" +#include "StatsCounter.h" +#include "EntityRenderDispatcher.h" +#include "TileEntityRenderDispatcher.h" +#include "SurvivalMode.h" +#include "Chunk.h" +#include "CreativeMode.h" +#include "DemoLevel.h" +#include "MultiPlayerLevel.h" +#include "MultiPlayerLocalPlayer.h" +#include "DemoUser.h" +#include "GuiParticles.h" +#include "Screen.h" +#include "DeathScreen.h" +#include "ErrorScreen.h" +#include "TitleScreen.h" +#include "InventoryScreen.h" +#include "InBedChatScreen.h" +#include "AchievementPopup.h" +#include "Input.h" +#include "FrustumCuller.h" +#include "Camera.h" + +#include "..\Minecraft.World\MobEffect.h" +#include "..\Minecraft.World\Difficulty.h" +#include "..\Minecraft.World\net.minecraft.world.level.h" +#include "..\Minecraft.World\net.minecraft.world.entity.h" +#include "..\Minecraft.World\net.minecraft.world.entity.player.h" +#include "..\Minecraft.World\net.minecraft.world.entity.item.h" +#include "..\Minecraft.World\net.minecraft.world.phys.h" +#include "..\Minecraft.World\File.h" +#include "..\Minecraft.World\net.minecraft.world.level.storage.h" +#include "..\Minecraft.World\net.minecraft.h" +#include "..\Minecraft.World\net.minecraft.stats.h" +#include "..\Minecraft.World\System.h" +#include "..\Minecraft.World\ByteBuffer.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.dimension.h" +#include "..\Minecraft.World\net.minecraft.world.item.h" +#include "..\Minecraft.World\Minecraft.World.h" +#include "ClientConnection.h" +#include "..\Minecraft.World\HellRandomLevelSource.h" +#include "..\Minecraft.World\net.minecraft.world.entity.animal.h" +#include "..\Minecraft.World\net.minecraft.world.entity.monster.h" +#include "..\Minecraft.World\StrongholdFeature.h" +#include "..\Minecraft.World\IntCache.h" +#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" +#endif +#include "Common\UI\IUIScene_CreativeMenu.h" +#include "Common\UI\UIFontData.h" +#include "DLCTexturePack.h" + +#ifdef __ORBIS__ +#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 + +// If not disabled, this creates an event queue on a seperate thread so that the Level::tick calls can be offloaded +// from the main thread, and have longer to run, since it's called at 20Hz instead of 60 +#define DISABLE_LEVELTICK_THREAD + +Minecraft *Minecraft::m_instance = NULL; +__int64 Minecraft::frameTimes[512]; +__int64 Minecraft::tickTimes[512]; +int Minecraft::frameTimePos = 0; +__int64 Minecraft::warezTime = 0; +File Minecraft::workDir = File(L""); + +#ifdef __PSVITA__ + +TOUCHSCREENRECT QuickSelectRect[3]= +{ + { 560, 890, 1360, 980 }, + { 450, 840, 1449, 960 }, + { 320, 840, 1600, 970 }, +}; + +int QuickSelectBoxWidth[3]= +{ + 89, + 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 + gameMode = NULL; + hasCrashed = false; + timer = new Timer(SharedConstants::TICKS_PER_SECOND); + oldLevel = NULL; //4J Stu added + level = NULL; + levels = MultiPlayerLevelArray(3); // 4J Added + levelRenderer = NULL; + player = nullptr; + cameraTargetPlayer = nullptr; + particleEngine = NULL; + user = NULL; + parent = NULL; + pause = false; + textures = NULL; + font = NULL; + screen = NULL; + localPlayerIdx = 0; + rightClickDelay = 0; + + // 4J Stu Added + InitializeCriticalSection( &ProgressRenderer::s_progress ); + InitializeCriticalSection(&m_setLevelCS); + //m_hPlayerRespawned = CreateEvent(NULL, FALSE, FALSE, NULL); + + progressRenderer = NULL; + gameRenderer = NULL; + bgLoader = NULL; + + ticks = 0; + // 4J-PB - moved into the local player + //missTime = 0; + //lastClickTick = 0; + //isRaining = false; + // 4J-PB - end + + orgWidth = orgHeight = 0; + achievementPopup = new AchievementPopup(this); + gui = NULL; + noRender = false; + humanoidModel = new HumanoidModel(0); + hitResult = 0; + options = NULL; + soundEngine = new SoundEngine(); + mouseHandler = NULL; + skins = NULL; + workingDirectory = File(L""); + levelSource = NULL; + stats[0] = NULL; + stats[1] = NULL; + stats[2] = NULL; + stats[3] = NULL; + connectToPort = 0; + workDir = File(L""); + // 4J removed + //wasDown = false; + lastTimer = -1; + + // 4J removed + //lastTickTime = System::currentTimeMillis(); + recheckPlayerIn = 0; + running = true; + unoccupiedQuadrant = -1; + + Stats::init(); + + orgHeight = height; + this->fullscreen = fullscreen; + this->minecraftApplet = NULL; + + this->parent = parent; + // 4J - Our actual physical frame buffer is always 1280x720 ie in a 16:9 ratio. If we want to do a 4:3 mode, we are telling the original minecraft code + // that the width is 3/4 what it actually is, to correctly present a 4:3 image. Have added width_phys and height_phys for any code we add that requires + // to know the real physical dimensions of the frame buffer. + if( RenderManager.IsWidescreen() ) + { + this->width = width; + } + else + { + this->width = (width * 3 ) / 4; + } + this->height = height; + this->width_phys = width; + this->height_phys = height; + + this->fullscreen = fullscreen; + + appletMode = false; + + Minecraft::m_instance = this; + TextureManager::createInstance(); + + for(int i=0;isoundEngine->init(NULL); +#endif + +#ifndef DISABLE_LEVELTICK_THREAD + levelTickEventQueue = new C4JThread::EventQueue(levelTickUpdateFunc, levelTickThreadInitFunc, "LevelTick_EventQueuePoll"); + levelTickEventQueue->setProcessor(3); + levelTickEventQueue->setPriority(THREAD_PRIORITY_NORMAL); +#endif // DISABLE_LEVELTICK_THREAD +} + +void Minecraft::clearConnectionFailed() +{ + for(int i=0;iaddDebugPacks(); + textures = new Textures(skins, options); + //renderLoadingScreen(); + + 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); + // // font.setEnforceUnicodeSheet("true".equalsIgnoreCase(I18n.get("language.enforceUnicode"))); + // font.setEnforceUnicodeSheet(Language.getInstance().isSelectedLanguageIsUnicode()); + // font.setBidirectional(Language.isBidirectional(options.languageCode)); + //} + + // 4J Stu - Not using these any more + //WaterColor::init(textures->loadTexturePixels(L"misc/watercolor.png")); + //GrassColor::init(textures->loadTexturePixels(L"misc/grasscolor.png")); + //FoliageColor::init(textures->loadTexturePixels(L"misc/foliagecolor.png")); + + gameRenderer = new GameRenderer(this); + EntityRenderDispatcher::instance->itemInHandRenderer = new ItemInHandRenderer(this,false); + + for( int i=0 ; i<4 ; ++i ) + stats[i] = new StatsCounter(); + + /* 4J - TODO, 4J-JEV: Unnecessary. + Achievements::openInventory->setDescFormatter(NULL); + Achievements.openInventory.setDescFormatter(new DescFormatter(){ + public String format(String i18nValue) { + return String.format(i18nValue, Keyboard.getKeyName(options.keyBuild.key)); + } + }); + */ + + // 4J-PB - We'll do this in a xui intro + //renderLoadingScreen(); + + //Keyboard::create(); + Mouse::create(); +#if 0 // 4J - removed + mouseHandler = new MouseHandler(parent); + try { + Controllers.create(); + } catch (Exception e) { + e.printStackTrace(); + } +#endif + + MemSect(31); + checkGlError(L"Pre startup"); + MemSect(0); + + // width = Display.getDisplayMode().getWidth(); + // height = Display.getDisplayMode().getHeight(); + + glEnable(GL_TEXTURE_2D); + glShadeModel(GL_SMOOTH); + glClearDepth(1.0); + glEnable(GL_DEPTH_TEST); + glDepthFunc(GL_LEQUAL); + glEnable(GL_ALPHA_TEST); + glAlphaFunc(GL_GREATER, 0.1f); + glCullFace(GL_BACK); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glMatrixMode(GL_MODELVIEW); + MemSect(31); + checkGlError(L"Startup"); + MemSect(0); + + // 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); + + MemSect(31); + checkGlError(L"Post startup"); + MemSect(0); + gui = new Gui(this); + + if (connectToIp != L"") // 4J - was NULL comparison + { + // setScreen(new ConnectScreen(this, connectToIp, connectToPort)); // 4J TODO - put back in + } + else + { + setScreen(new TitleScreen()); + } + progressRenderer = new ProgressRenderer(this); + + RenderManager.CBuffLockStaticCreations(); +} + +void Minecraft::renderLoadingScreen() +{ + // 4J Unused + // testing stuff on vita just now +#ifdef __PSVITA__ + ScreenSizeCalculator ssc(options, width, height); + + // xxx + RenderManager.StartFrame(); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho(0, (float)ssc.rawWidth, (float)ssc.rawHeight, 0, 1000, 3000); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glTranslatef(0, 0, -2000); + glViewport(0, 0, width, height); + glClearColor(0, 0, 0, 0); + + Tesselator *t = Tesselator::getInstance(); + + glDisable(GL_LIGHTING); + glEnable(GL_TEXTURE_2D); + glDisable(GL_FOG); + // xxx + glBindTexture(GL_TEXTURE_2D, textures->loadTexture(TN_MOB_PIG)); + t->begin(); + t->color(0xffffff); + t->vertexUV((float)(0), (float)( height), (float)( 0), (float)( 0), (float)( 0)); + t->vertexUV((float)(width), (float)( height), (float)( 0), (float)( 0), (float)( 0)); + t->vertexUV((float)(width), (float)( 0), (float)( 0), (float)( 0), (float)( 0)); + t->vertexUV((float)(0), (float)( 0), (float)( 0), (float)( 0), (float)( 0)); + t->end(); + + int lw = 256; + int lh = 256; + glColor4f(1, 1, 1, 1); + t->color(0xffffff); + blit((ssc.getWidth() - lw) / 2, (ssc.getHeight() - lh) / 2, 0, 0, lw, lh); + glDisable(GL_LIGHTING); + glDisable(GL_FOG); + + glEnable(GL_ALPHA_TEST); + glAlphaFunc(GL_GREATER, 0.1f); + + Display::swapBuffers(); + // xxx + RenderManager.Present(); +#endif +} + +void Minecraft::blit(int x, int y, int sx, int sy, int w, int h) +{ + float us = 1 / 256.0f; + float vs = 1 / 256.0f; + Tesselator *t = Tesselator::getInstance(); + t->begin(); + t->vertexUV((float)(x + 0), (float)( y + h), (float)( 0), (float)( (sx + 0) * us), (float)( (sy + h) * vs)); + t->vertexUV((float)(x + w), (float)( y + h), (float)( 0), (float)( (sx + w) * us), (float)( (sy + h) * vs)); + t->vertexUV((float)(x + w), (float)( y + 0), (float)( 0), (float)( (sx + w) * us), (float)( (sy + 0) * vs)); + t->vertexUV((float)(x + 0), (float)( y + 0), (float)( 0), (float)( (sx + 0) * us), (float)( (sy + 0) * vs)); + t->end(); +} + +LevelStorageSource *Minecraft::getLevelSource() +{ + return levelSource; +} + +void Minecraft::setScreen(Screen *screen) +{ + if (this->screen != NULL) + { + this->screen->removed(); + } + + //4J Gordon: Do not force a stats save here + /*if (dynamic_cast(screen)!=NULL) + { + stats->forceSend(); + } + stats->forceSave();*/ + + if (screen == NULL && level == NULL) + { + screen = new TitleScreen(); + } + else if (player != NULL && !ui.GetMenuDisplayed(player->GetXboxPad()) && player->getHealth() <= 0) + { + //screen = new DeathScreen(); + + // 4J Stu - If we exit from the death screen then we are saved as being dead. In the Java + // game when you load the game you are still dead, but this is silly so only show the dead + // screen if we have died during gameplay + if(ticks==0) + { + player->respawn(); + } + else + { + ui.NavigateToScene(player->GetXboxPad(),eUIScene_DeathMenu,NULL); + } + } + + if (dynamic_cast(screen)!=NULL) + { + options->renderDebug = false; + gui->clearMessages(); + } + + this->screen = screen; + if (screen != NULL) + { + // releaseMouse(); // 4J - removed + ScreenSizeCalculator ssc(options, width, height); + int screenWidth = ssc.getWidth(); + int screenHeight = ssc.getHeight(); + screen->init(this, screenWidth, screenHeight); + noRender = false; + } + else + { + // grabMouse(); // 4J - removed + } + + // 4J-PB - if a screen has been set, go into menu mode + // it's possible that player doesn't exist here yet + /*if(screen!=NULL) + { + if(player && player->GetXboxPad()!=-1) + { + InputManager.SetMenuDisplayed(player->GetXboxPad(),true); + } + else + { + // set all + //InputManager.SetMenuDisplayed(XUSER_INDEX_ANY,true); + } + } + else + { + if(player && player->GetXboxPad()!=-1) + { + InputManager.SetMenuDisplayed(player->GetXboxPad(),false); + } + else + { + //InputManager.SetMenuDisplayed(XUSER_INDEX_ANY,false); + } + }*/ +} + +void Minecraft::checkGlError(const wstring& string) +{ + // 4J - TODO +} + +void Minecraft::destroy() +{ + //4J Gordon: Do not force a stats save here + /*stats->forceSend(); + stats->forceSave();*/ + + // try { + setLevel(NULL); + // } catch (Throwable e) { + // } + + // try { + MemoryTracker::release(); + // } catch (Throwable e) { + // } + + soundEngine->destroy(); + //} finally { + Display::destroy(); + // if (!hasCrashed) System.exit(0); //4J - removed + //} + //System.gc(); // 4J - removed +} + +// 4J-PB - splitting this function into 3 parts, so we can call the middle part from our xbox game loop + +#if 0 +void Minecraft::run() +{ + running = true; + // try { // 4J - removed try/catch + init(); + // } catch (Exception e) { + // e.printStackTrace(); + // crash(new CrashReport("Failed to start game", e)); + // return; + // } + // try { // 4J - removed try/catch + if (Minecraft::FLYBY_MODE) + { + generateFlyby(); + return; + } + + __int64 lastTime = System::currentTimeMillis(); + int frames = 0; + + while (running) + { + // try { // 4J - removed try/catch + // if (minecraftApplet != null && !minecraftApplet.isActive()) break; // 4J - removed + AABB::resetPool(); + Vec3::resetPool(); + + // if (parent == NULL && Display.isCloseRequested()) { // 4J - removed + // stop(); + // } + + if (pause && level != NULL) + { + float lastA = timer->a; + timer->advanceTime(); + timer->a = lastA; + } + else + { + timer->advanceTime(); + } + + __int64 beforeTickTime = System::nanoTime(); + for (int i = 0; i < timer->ticks; i++) + { + ticks++; + // try { // 4J - try/catch removed + tick(); + // } catch (LevelConflictException e) { + // this.level = null; + // setLevel(null); + // setScreen(new LevelConflictScreen()); + // } + } + __int64 tickDuraction = System::nanoTime() - beforeTickTime; + checkGlError(L"Pre render"); + + TileRenderer::fancy = options->fancyGraphics; + + // if (pause) timer.a = 1; + + soundEngine->update(player, timer->a); + + glEnable(GL_TEXTURE_2D); + if (level != NULL) level->updateLights(); + + // if (!Keyboard::isKeyDown(Keyboard.KEY_F7)) Display.update(); // 4J - removed + + if (player != NULL && player->isInWall()) options->thirdPersonView = false; + if (!noRender) + { + if (gameMode != NULL) gameMode->render(timer->a); + gameRenderer->render(timer->a); + } + + /* 4J - removed + if (!Display::isActive()) + { + if (fullscreen) + { + this->toggleFullScreen(); + } + Sleep(10); + } + */ + + if (options->renderDebug) + { + renderFpsMeter(tickDuraction); + } + else + { + lastTimer = System::nanoTime(); + } + + achievementPopup->render(); + + Sleep(0); // 4J - was Thread.yield() + + // if (Keyboard::isKeyDown(Keyboard::KEY_F7)) Display.update(); // 4J - removed condition + Display::update(); + + // checkScreenshot(); // 4J - removed + + /* 4J - removed + if (parent != NULL && !fullscreen) + { + if (parent.getWidth() != width || parent.getHeight() != height) + { + width = parent.getWidth(); + height = parent.getHeight(); + if (width <= 0) width = 1; + if (height <= 0) height = 1; + + resize(width, height); + } + } + */ + checkGlError(L"Post render"); + frames++; + pause = !isClientSide() && screen != NULL && screen->isPauseScreen(); + + while (System::currentTimeMillis() >= lastTime + 1000) + { + fpsString = _toString(frames) + L" fps, " + _toString(Chunk::updates) + L" chunk updates"; + Chunk::updates = 0; + lastTime += 1000; + frames = 0; + } + /* + } catch (LevelConflictException e) { + this.level = null; + setLevel(null); + setScreen(new LevelConflictScreen()); + } catch (OutOfMemoryError e) { + emergencySave(); + setScreen(new OutOfMemoryScreen()); + System.gc(); + } + */ + } + /* + } catch (StopGameException e) { + } catch (Throwable e) { + emergencySave(); + e.printStackTrace(); + crash(new CrashReport("Unexpected error", e)); + } finally { + destroy(); + } + */ + destroy(); +} +#endif + +void Minecraft::run() +{ + running = true; + // try { // 4J - removed try/catch + init(); + // } catch (Exception e) { + // e.printStackTrace(); + // crash(new CrashReport("Failed to start game", e)); + // return; + // } + // try { // 4J - removed try/catch + } + +// 4J added - Selects which local player is currently active for processing by the existing minecraft code +bool Minecraft::setLocalPlayerIdx(int idx) +{ + localPlayerIdx = idx; + // If the player is not null, but the game mode is then this is just a temp player + // whose only real purpose is to hold the viewport position + if( localplayers[idx] == NULL || localgameModes[idx] == NULL ) return false; + + gameMode = localgameModes[idx]; + player = localplayers[idx]; + cameraTargetPlayer = localplayers[idx]; + gameRenderer->itemInHandRenderer = localitemInHandRenderers[idx]; + level = getLevel( localplayers[idx]->dimension ); + particleEngine->setLevel( level ); + + return true; +} + +int Minecraft::getLocalPlayerIdx() +{ + return localPlayerIdx; +} + +void Minecraft::updatePlayerViewportAssignments() +{ + unoccupiedQuadrant = -1; + // Find out how many viewports we'll be needing + int viewportsRequired = 0; + for( int i = 0; i < XUSER_MAX_COUNT; i++ ) + { + if( localplayers[i] != NULL ) viewportsRequired++; + } + if( viewportsRequired == 3 ) viewportsRequired = 4; + + // Allocate away... + if( viewportsRequired == 1 ) + { + // Single viewport + for( int i = 0; i < XUSER_MAX_COUNT; i++ ) + { + if( localplayers[i] != NULL ) localplayers[i]->m_iScreenSection = C4JRender::VIEWPORT_TYPE_FULLSCREEN; + } + } + else if( viewportsRequired == 2 ) + { + // Split screen - TODO - option for vertical/horizontal split + int found = 0; + for( int i = 0; i < XUSER_MAX_COUNT; i++ ) + { + if( localplayers[i] != NULL ) + { + // Primary player settings decide what the mode is + if(app.GetGameSettings(ProfileManager.GetPrimaryPad(),eGameSetting_SplitScreenVertical)) + { + localplayers[i]->m_iScreenSection = C4JRender::VIEWPORT_TYPE_SPLIT_LEFT + found; + } + else + { + localplayers[i]->m_iScreenSection = C4JRender::VIEWPORT_TYPE_SPLIT_TOP + found; + } + found++; + } + } + } + else if( viewportsRequired >= 3 ) + { + // Quadrants - this is slightly more complicated. We don't want to move viewports around if we are going from 3 to 4, or 4 to 3 players, + // so persist any allocations for quadrants that already exist. + bool quadrantsAllocated[4] = {false,false,false,false}; + + for( int i = 0; i < XUSER_MAX_COUNT; i++ ) + { + if( localplayers[i] != NULL ) + { + + // 4J Stu - If the game hasn't started, ignore current allocations (as the players won't have seen them) + // This fixes an issue with the primary player being the 4th controller quadrant, but ending up in the 3rd viewport. + if(app.GetGameStarted()) + { + if( ( localplayers[i]->m_iScreenSection >= C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_LEFT ) && + ( localplayers[i]->m_iScreenSection <= C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT ) ) + { + quadrantsAllocated[localplayers[i]->m_iScreenSection - C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_LEFT] = true; + } + } + else + { + // Reset the viewport so that it can be assigned in the next loop + localplayers[i]->m_iScreenSection = C4JRender::VIEWPORT_TYPE_FULLSCREEN; + } + } + } + + // Found which quadrants are currently in use, now allocate out any spares that are required + for( int i = 0; i < XUSER_MAX_COUNT; i++ ) + { + if( localplayers[i] != NULL ) + { + if( ( localplayers[i]->m_iScreenSection < C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_LEFT ) || + ( localplayers[i]->m_iScreenSection > C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT ) ) + { + for( int j = 0; j < 4; j++ ) + { + if( !quadrantsAllocated[j] ) + { + localplayers[i]->m_iScreenSection = C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_LEFT + j; + quadrantsAllocated[j] = true; + break; + } + } + } + } + } + // If there's an unoccupied quadrant, record which one so we can clear it to black when rendering + for( int i = 0; i < XUSER_MAX_COUNT; i++ ) + { + if( quadrantsAllocated[i] == false ) + { + unoccupiedQuadrant = i; + } + } + } + + // 4J Stu - If the game is not running we do not want to do this yet, and should wait until the task + // that caused the app to not be running is finished + if(app.GetGameStarted())ui.UpdatePlayerBasePositions(); +} + +// Add a temporary player so that the viewports get re-arranged, and add the player to the game session +bool Minecraft::addLocalPlayer(int idx) +{ + //int iLocalPlayerC=app.GetLocalPlayerCount(); + if( m_pendingLocalConnections[idx] != NULL ) + { + // 4J Stu - Should we ever be in a state where this happens? + assert(false); + m_pendingLocalConnections[idx]->close(); + } + m_connectionFailed[idx] = false; + m_pendingLocalConnections[idx] = NULL; + + bool success=g_NetworkManager.AddLocalPlayerByUserIndex(idx); + + if(success) + { + app.DebugPrintf("Adding temp local player on pad %d\n", idx); + localplayers[idx] = shared_ptr( new MultiplayerLocalPlayer(this, level, user, NULL ) ); + localgameModes[idx] = NULL; + + updatePlayerViewportAssignments(); + +#ifdef _XBOX + // tell the xui scenes a splitscreen player joined + XUIMessage xuiMsg; + CustomMessage_Splitscreenplayer_Struct myMsgData; + CustomMessage_Splitscreenplayer( &xuiMsg, &myMsgData, true); + + // send the message + for(int i=0;iiPad = idx; + param->stringId = IDS_PROGRESS_CONNECTING; + param->showTooltips = true; + param->setFailTimer = true; + param->timerTime = CONNECTING_PROGRESS_CHECK_TIME; + + // Joining as second player so always the small progress + ui.NavigateToScene(idx, eUIScene_ConnectingProgress, param); + + } + else + { + app.DebugPrintf("g_NetworkManager.AddLocalPlayerByUserIndex failed\n"); +#ifdef _DURANGO + ProfileManager.RemoveGamepadFromGame(idx); +#endif + } + + return success; +} + +void Minecraft::addPendingLocalConnection(int idx, ClientConnection *connection) +{ + m_pendingLocalConnections[idx] = connection; +} + +shared_ptr Minecraft::createExtraLocalPlayer(int idx, const wstring& name, int iPad, int iDimension, ClientConnection *clientConnection /*= NULL*/,MultiPlayerLevel *levelpassedin) +{ + if( clientConnection == NULL) return nullptr; + + if( clientConnection == m_pendingLocalConnections[idx] ) + { + int tempScreenSection = C4JRender::VIEWPORT_TYPE_FULLSCREEN; + if( localplayers[idx] != NULL && localgameModes[idx] == NULL ) + { + // A temp player displaying a connecting screen + tempScreenSection = localplayers[idx]->m_iScreenSection; + } + wstring prevname = user->name; + user->name = name; + + // Don't need this any more + m_pendingLocalConnections[idx] = NULL; + + // Add the connection to the level which will now take responsibility for ticking it + // 4J-PB - can't use the dimension from localplayers[idx], since there may be no localplayers at this point + //MultiPlayerLevel *mpLevel = (MultiPlayerLevel *)getLevel( localplayers[idx]->dimension ); + + MultiPlayerLevel *mpLevel; + + if(levelpassedin) + { + level=levelpassedin; + mpLevel=levelpassedin; + } + else + { + level=getLevel( iDimension ); + mpLevel = getLevel( iDimension ); + mpLevel->addClientConnection( clientConnection ); + } + + if( app.GetTutorialMode() ) + { + localgameModes[idx] = new FullTutorialMode(idx, this, clientConnection); + } + // check if we're in the trial version + else if(ProfileManager.IsFullVersion()==false) + { + localgameModes[idx] = new TrialMode(idx, this, clientConnection); + } + else + { + localgameModes[idx] = new ConsoleGameMode(idx, this, clientConnection); + } + + // 4J-PB - can't do this here because they use a render context, but this is running from a thread. + // Moved the creation of these into the main thread, before level launch + //localitemInHandRenderers[idx] = new ItemInHandRenderer(this); + localplayers[idx] = localgameModes[idx]->createPlayer(level); + + PlayerUID playerXUIDOffline = INVALID_XUID; + PlayerUID playerXUIDOnline = INVALID_XUID; + ProfileManager.GetXUID(idx,&playerXUIDOffline,false); + ProfileManager.GetXUID(idx,&playerXUIDOnline,true); + localplayers[idx]->setXuid(playerXUIDOffline); + localplayers[idx]->setOnlineXuid(playerXUIDOnline); + localplayers[idx]->setIsGuest(ProfileManager.IsGuest(idx)); + + localplayers[idx]->m_displayName = ProfileManager.GetDisplayName(idx); + + localplayers[idx]->m_iScreenSection = tempScreenSection; + + if( levelpassedin == NULL) level->addEntity(localplayers[idx]); // Don't add if we're passing the level in, we only do this from the client connection & we'll be handling adding it ourselves + + localplayers[idx]->SetXboxPad(iPad); + + if( localplayers[idx]->input != NULL ) delete localplayers[idx]->input; + localplayers[idx]->input = new Input(); + + localplayers[idx]->resetPos(); + + levelRenderer->setLevel(idx, level); + localplayers[idx]->level = level; + + user->name = prevname; + + updatePlayerViewportAssignments(); + + // 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 to ClientConnection::handleMovePlayer +// // 4J-PB - can't call this when this function is called from the qnet thread (GetGameStarted will be false) +// if(app.GetGameStarted()) +// { +// ui.CloseUIScenes(idx); +// } + } + + return localplayers[idx]; +} + +// on a respawn of the local player, just store them +void Minecraft::storeExtraLocalPlayer(int idx) +{ + localplayers[idx] = player; + + if( localplayers[idx]->input != NULL ) delete localplayers[idx]->input; + localplayers[idx]->input = new Input(); + + if(ProfileManager.IsSignedIn(idx)) + { + localplayers[idx]->name = convStringToWstring( ProfileManager.GetGamertag(idx) ); + } +} + +void Minecraft::removeLocalPlayerIdx(int idx) +{ + bool updateXui = true; + if(localgameModes[idx] != NULL) + { + if( getLevel( localplayers[idx]->dimension )->isClientSide ) + { + shared_ptr mplp = localplayers[idx]; + ( (MultiPlayerLevel *)getLevel( localplayers[idx]->dimension ) )->removeClientConnection(mplp->connection, true); + delete mplp->connection; + mplp->connection = NULL; + g_NetworkManager.RemoveLocalPlayerByUserIndex(idx); + } + getLevel( localplayers[idx]->dimension )->removeEntity(localplayers[idx]); + +#ifdef _XBOX + // 4J Stu - Fix for #12368 - Crash: Game crashes when saving then exiting and selecting to save + app.TutorialSceneNavigateBack(idx); +#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 + playerLeftTutorial( idx ); + + delete localgameModes[idx]; + localgameModes[idx] = NULL; + } + else if( m_pendingLocalConnections[idx] != NULL ) + { + m_pendingLocalConnections[idx]->sendAndDisconnect( shared_ptr( new DisconnectPacket(DisconnectPacket::eDisconnect_Quitting) ) );; + delete m_pendingLocalConnections[idx]; + m_pendingLocalConnections[idx] = NULL; + g_NetworkManager.RemoveLocalPlayerByUserIndex(idx); + } + else + { + // Not sure how this works on qnet, but for other platforms, calling RemoveLocalPlayerByUserIndex won't do anything if there isn't a local user to remove + // Now just updating the UI directly in this case +#ifdef _XBOX + // 4J Stu - A signout early in the game creation before this player has connected to the game server + updateXui = false; +#endif + // 4J Stu - Adding this back in for exactly the reason my comment above suggests it was added in the first place +#if defined(_XBOX_ONE) || defined(__ORBIS__) + g_NetworkManager.RemoveLocalPlayerByUserIndex(idx); +#endif + } + localplayers[idx] = nullptr; + + if( idx == ProfileManager.GetPrimaryPad() ) + { + // We should never try to remove the Primary player in this way + assert(false); + /* + // If we are removing the primary player then there can't be a valid gamemode left anymore, this + // pointer will be referring to the one we've just deleted + gameMode = NULL; + // Remove references to player + player = NULL; + cameraTargetPlayer = NULL; + EntityRenderDispatcher::instance->cameraEntity = NULL; + TileEntityRenderDispatcher::instance->cameraEntity = NULL; + */ + } + else if( updateXui ) + { + gameRenderer->DisableUpdateThread(); + levelRenderer->setLevel(idx, NULL); + gameRenderer->EnableUpdateThread(); + ui.CloseUIScenes(idx,true); + updatePlayerViewportAssignments(); + } + + // We only create these once ever so don't delete it here + //delete localitemInHandRenderers[idx]; +} + +void Minecraft::createPrimaryLocalPlayer(int iPad) +{ + localgameModes[iPad] = gameMode; + localplayers[iPad] = player; + //gameRenderer->itemInHandRenderer = localitemInHandRenderers[iPad]; + // Give them the gamertag if they're signed in + if(ProfileManager.IsSignedIn(ProfileManager.GetPrimaryPad())) + { + user->name = convStringToWstring( ProfileManager.GetGamertag(ProfileManager.GetPrimaryPad()) ); + } +} + +void Minecraft::run_middle() +{ + static __int64 lastTime = 0; + static bool bFirstTimeIntoGame = true; + static bool bAutosaveTimerSet=false; + static unsigned int uiAutosaveTimer=0; + static int iFirstTimeCountdown=60; + if( lastTime == 0 ) lastTime = System::nanoTime(); + static int frames = 0; + + EnterCriticalSection(&m_setLevelCS); + + if(running) + { + if (reloadTextures) + { + reloadTextures = false; + textures->reloadAll(); + } + + //while (running) + { + // try { // 4J - removed try/catch + // if (minecraftApplet != null && !minecraftApplet.isActive()) break; // 4J - removed + AABB::resetPool(); + Vec3::resetPool(); + + // if (parent == NULL && Display.isCloseRequested()) { // 4J - removed + // stop(); + // } + + // 4J-PB - AUTOSAVE TIMER - only in the full game and if the player is the host + if(level!=NULL && ProfileManager.IsFullVersion() && g_NetworkManager.IsHost()) + { + /*if(!bAutosaveTimerSet) + { + // set the timer + bAutosaveTimerSet=true; + + app.SetAutosaveTimerTime(); + } + else*/ + { + // if the pause menu is up for the primary player, don't autosave + // If saving isn't disabled, and the main player has a app action running , or has any crafting or containers open, don't autosave + if(!StorageManager.GetSaveDisabled() && (app.GetXuiAction(ProfileManager.GetPrimaryPad())==eAppAction_Idle) ) + { + if(!ui.IsPauseMenuDisplayed(ProfileManager.GetPrimaryPad()) && !ui.IsIgnoreAutosaveMenuDisplayed(ProfileManager.GetPrimaryPad())) + { + // check if the autotimer countdown has reached zero + unsigned char ucAutosaveVal=app.GetGameSettings(ProfileManager.GetPrimaryPad(),eGameSetting_Autosave); + bool bTrialTexturepack=false; + if(!Minecraft::GetInstance()->skins->isUsingDefaultSkin()) + { + TexturePack *tPack = Minecraft::GetInstance()->skins->getSelected(); + DLCTexturePack *pDLCTexPack=(DLCTexturePack *)tPack; + + DLCPack *pDLCPack=pDLCTexPack->getDLCInfoParentPack(); + + if( pDLCPack ) + { + if(!pDLCPack->hasPurchasedFile( DLCManager::e_DLCType_Texture, L"" )) + { + bTrialTexturepack=true; + } + } + } + + // If the autosave value is not zero, and the player isn't using a trial texture pack, then check whether we need to save this tick + if((ucAutosaveVal!=0) && !bTrialTexturepack) + { + if(app.AutosaveDue()) + { + // disable the autosave countdown + ui.ShowAutosaveCountdownTimer(false); + + // Need to save now + app.DebugPrintf("+++++++++++\n"); + app.DebugPrintf("+++Autosave\n"); + app.DebugPrintf("+++++++++++\n"); + app.SetAction(ProfileManager.GetPrimaryPad(),eAppAction_AutosaveSaveGame); + //app.SetAutosaveTimerTime(); +#ifndef _CONTENT_PACKAGE + { + // print the time + SYSTEMTIME UTCSysTime; + GetSystemTime( &UTCSysTime ); + //char szTime[15]; + + app.DebugPrintf("%02d:%02d:%02d\n",UTCSysTime.wHour,UTCSysTime.wMinute,UTCSysTime.wSecond); + } +#endif + } + else + { + unsigned int uiTimeToAutosave=app.SecondsToAutosave(); + + if(uiTimeToAutosave<6) + { + ui.ShowAutosaveCountdownTimer(true); + ui.UpdateAutosaveCountdownTimer(uiTimeToAutosave); + } + } + } + } + else + { + // disable the autosave countdown + ui.ShowAutosaveCountdownTimer(false); + } + } + } + } + + // 4J-PB - Once we're in the level, check if the players have the level in their banned list and ask if they want to play it + for( int i = 0; i < XUSER_MAX_COUNT; i++ ) + { + if( localplayers[i] && (app.GetBanListCheck(i)==false) && !Minecraft::GetInstance()->isTutorial() && ProfileManager.IsSignedInLive(i) && !ProfileManager.IsGuest(i) ) + { + // If there is a sys ui displayed, we can't display the message box here, so ignore until we can + if(!ProfileManager.IsSystemUIDisplayed()) + { + app.SetBanListCheck(i,true); + // 4J-PB - check if the level is in the banned level list + // get the unique save name and xuid from whoever is the host +#if defined _XBOX || defined _XBOX_ONE + INetworkPlayer *pHostPlayer = g_NetworkManager.GetHostPlayer(); + +#ifdef _XBOX + PlayerUID xuid=((NetworkPlayerXbox *)pHostPlayer)->GetUID(); +#else + PlayerUID xuid=pHostPlayer->GetUID(); +#endif + + if(app.IsInBannedLevelList(i,xuid,app.GetUniqueMapName())) + { + // put up a message box asking if the player would like to unban this level + app.DebugPrintf("This level is banned\n"); + // set the app action to bring up the message box to give them the option to remove from the ban list or exit the level + app.SetAction(i,eAppAction_LevelInBanLevelList,(void *)TRUE); + } +#endif + } + } + } + + if(!ProfileManager.IsSystemUIDisplayed() && app.DLCInstallProcessCompleted() && !app.DLCInstallPending() && app.m_dlcManager.NeedsCorruptCheck() ) + { + app.m_dlcManager.checkForCorruptDLCAndAlert(); + } + + // When we go into the first loaded level, check if the console has active joypads that are not in the game, and bring up the quadrant display to remind them to press start (if the session has space) + if(level!=NULL && bFirstTimeIntoGame && g_NetworkManager.SessionHasSpace()) + { + // have a short delay before the display + if(iFirstTimeCountdown==0) + { + bFirstTimeIntoGame=false; + + if(app.IsLocalMultiplayerAvailable()) + { + for( int i = 0; i < XUSER_MAX_COUNT; i++ ) + { + if((localplayers[i] == NULL) && InputManager.IsPadConnected(i)) + { + if(!ui.PressStartPlaying(i)) + { + ui.ShowPressStart(i); + } + } + } + } + } + else iFirstTimeCountdown--; + } + // 4J-PB - store any button toggles for the players, since the minecraft::tick may not be called if we're running fast, and a button press and release will be missed + + for( int i = 0; i < XUSER_MAX_COUNT; i++ ) + { +#ifdef __ORBIS__ + if ( m_pPsPlusUpsell != NULL && m_pPsPlusUpsell->hasResponse() && m_pPsPlusUpsell->m_userIndex == i ) + { + delete m_pPsPlusUpsell; + m_pPsPlusUpsell = NULL; + + if ( ProfileManager.HasPlayStationPlus(i) ) + { + app.DebugPrintf(" Player_%i is now authorised for PsPlus.\n", i); + if (!ui.PressStartPlaying(i)) ui.ShowPressStart(i); + } + else + { + UINT uiIDA[1] = { IDS_OK }; + ui.RequestErrorMessage( IDS_CANTJOIN_TITLE, IDS_NO_PLAYSTATIONPLUS, uiIDA, 1, i); + } + } + else +#endif + if(localplayers[i]) + { + // 4J-PB - add these to check for coming out of idle + if(InputManager.ButtonPressed(i, MINECRAFT_ACTION_JUMP)) localplayers[i]->ullButtonsPressed|=1LL<ullButtonsPressed|=1LL<ullButtonsPressed|=1LL<ullButtonsPressed|=1LL<ullButtonsPressed|=1LL<ullButtonsPressed|=1LL<ullButtonsPressed|=1LL<ullButtonsPressed|=1LL<abilities.flying) + { + if(InputManager.ButtonDown(i, MINECRAFT_ACTION_SNEAK_TOGGLE)) localplayers[i]->ullButtonsPressed|=1LL<ullButtonsPressed|=1LL<ullButtonsPressed|=1LL<ullButtonsPressed|=1LL<ullDpad_last = 0; + localplayers[i]->ullDpad_this = 0; + localplayers[i]->ullDpad_filtered = 0; + if(InputManager.ButtonPressed(i, MINECRAFT_ACTION_DPAD_RIGHT)) localplayers[i]->ullButtonsPressed|=1LL<ullButtonsPressed|=1LL<ullButtonsPressed|=1LL<ullButtonsPressed|=1LL<ullDpad_this = 0; + int dirCount = 0; + +#ifndef __PSVITA__ + if(InputManager.ButtonDown(i, MINECRAFT_ACTION_DPAD_LEFT)) { localplayers[i]->ullDpad_this|=1LL<ullDpad_this|=1LL<ullDpad_this|=1LL<ullDpad_this|=1LL<ullDpad_last = localplayers[i]->ullDpad_this; + localplayers[i]->ullDpad_filtered = localplayers[i]->ullDpad_this; + } + else + { + localplayers[i]->ullDpad_filtered = localplayers[i]->ullDpad_last; + } + } + + // for the opacity timer + if(InputManager.ButtonPressed(i, MINECRAFT_ACTION_LEFT_SCROLL) || InputManager.ButtonPressed(i, MINECRAFT_ACTION_RIGHT_SCROLL)) + //InputManager.ButtonPressed(i, MINECRAFT_ACTION_USE) || InputManager.ButtonPressed(i, MINECRAFT_ACTION_ACTION)) + { + app.SetOpacityTimer(i); + } + } + else + { + // 4J Stu - This doesn't make any sense with the way we handle XboxOne users +#ifndef _DURANGO + // did we just get input from a player who doesn't exist? They'll be wanting to join the game then + bool tryJoin = !pause && !ui.IsIgnorePlayerJoinMenuDisplayed(ProfileManager.GetPrimaryPad()) && g_NetworkManager.SessionHasSpace() && RenderManager.IsHiDef() && InputManager.ButtonPressed(i); +#ifdef __ORBIS__ + // Check for remote play + tryJoin = tryJoin && InputManager.IsLocalMultiplayerAvailable(); + + // 4J Stu - Check that content restriction information has been received + if( !g_NetworkManager.IsLocalGame() ) + { + tryJoin = tryJoin && ProfileManager.GetChatAndContentRestrictions(i,true,NULL,NULL,NULL); + } +#endif + if(tryJoin) + { + if(!ui.PressStartPlaying(i)) + { +#ifdef __ORBIS__ + // Don't let player start joining until their PS Plus check has finished + if (g_NetworkManager.IsLocalGame() || !ProfileManager.RequestingPlaystationPlus(i)) +#endif + { + ui.ShowPressStart(i); + } + } + else + { + // did we just get input from a player who doesn't exist? They'll be wanting to join the game then +#ifdef __ORBIS__ + if(InputManager.ButtonPressed(i, ACTION_MENU_A)) +#else + if(InputManager.ButtonPressed(i, MINECRAFT_ACTION_PAUSEMENU)) +#endif + { + // Let them join + + // are they signed in? + if(ProfileManager.IsSignedIn(i)) + { + // if this is a local game, then the player just needs to be signed in + if( g_NetworkManager.IsLocalGame() || (ProfileManager.IsSignedInLive(i) && ProfileManager.AllowedToPlayMultiplayer(i) ) ) + { +#ifdef __ORBIS__ + bool contentRestricted = false; + ProfileManager.GetChatAndContentRestrictions(i,false,NULL,&contentRestricted,NULL); // TODO! + + if (!g_NetworkManager.IsLocalGame() && contentRestricted) + { + ui.RequestContentRestrictedMessageBox(IDS_NO_MULTIPLAYER_PRIVILEGE_TITLE, IDS_CONTENT_RESTRICTION, i); + } + else if(!g_NetworkManager.IsLocalGame() && !ProfileManager.HasPlayStationPlus(i)) + { + m_pPsPlusUpsell = new PsPlusUpsellWrapper(i); + m_pPsPlusUpsell->displayUpsell(); + } + else +#endif + if( level->isClientSide ) + { + bool success=addLocalPlayer(i); + + if(!success) + { + app.DebugPrintf("Bringing up the sign in ui\n"); + ProfileManager.RequestSignInUI(false, g_NetworkManager.IsLocalGame(), true, false,true,&Minecraft::InGame_SignInReturned, this,i); + } + else + { +#ifdef __ORBIS__ + if(g_NetworkManager.IsLocalGame() == false) + { + bool chatRestricted = false; + ProfileManager.GetChatAndContentRestrictions(i,false,&chatRestricted,NULL,NULL); + if(chatRestricted) + { + ProfileManager.DisplaySystemMessage( SCE_MSG_DIALOG_SYSMSG_TYPE_TRC_PSN_CHAT_RESTRICTION, i ); + } + } +#endif + } + } + else + { + // create the localplayer + shared_ptr player = localplayers[i]; + if( player == NULL) + { + player = createExtraLocalPlayer(i, (convStringToWstring( ProfileManager.GetGamertag(i) )).c_str(), i, level->dimension->id); + } + } + } + else + { + if( ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad()) && !ProfileManager.AllowedToPlayMultiplayer(i) ) + { + ProfileManager.RequestConvertOfflineToGuestUI( &Minecraft::InGame_SignInReturned, this,i); + // 4J Stu - Don't allow converting to guests as we don't allow any guest sign-in while in the game + // Fix for #66516 - TCR #124: MPS Guest Support ; #001: BAS Game Stability: TU8: The game crashes when second Guest signs-in on console which takes part in Xbox LIVE multiplayer session. + //ProfileManager.RequestConvertOfflineToGuestUI( &Minecraft::InGame_SignInReturned, this,i); + +#ifndef _XBOX + ui.HidePressStart(); +#endif + +#ifdef __ORBIS__ + int npAvailability = ProfileManager.getNPAvailability(i); + + // Check if PSN is unavailable because of age restriction + if (npAvailability == SCE_NP_ERROR_AGE_RESTRICTION) + { + UINT uiIDA[1]; + uiIDA[0] = IDS_OK; + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, i); + } + else if (ProfileManager.IsSignedIn(i) && !ProfileManager.IsSignedInLive(i)) + { + // You're not signed in to PSN! + UINT uiIDA[2]; + uiIDA[0] = IDS_PRO_NOTONLINE_ACCEPT; + uiIDA[1] = IDS_CANCEL; + 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.RequestErrorMessage(IDS_NO_MULTIPLAYER_PRIVILEGE_TITLE, IDS_NO_MULTIPLAYER_PRIVILEGE_JOIN_TEXT, uiIDA, 1, i); + } + } + //else + { + // player not signed in to live + // bring up the sign in dialog + app.DebugPrintf("Bringing up the sign in ui\n"); + ProfileManager.RequestSignInUI(false, g_NetworkManager.IsLocalGame(), true, false,true,&Minecraft::InGame_SignInReturned, this,i); + } + } + } + else + { + // bring up the sign in dialog + app.DebugPrintf("Bringing up the sign in ui\n"); + ProfileManager.RequestSignInUI(false, g_NetworkManager.IsLocalGame(), true, false,true,&Minecraft::InGame_SignInReturned, this,i); + } + } + } + } +#endif // _DURANGO + } + } + +#ifdef _DURANGO + // did we just get input from a player who doesn't exist? They'll be wanting to join the game then + if(!pause && !ui.IsIgnorePlayerJoinMenuDisplayed(ProfileManager.GetPrimaryPad()) && g_NetworkManager.SessionHasSpace() && RenderManager.IsHiDef() ) + { + int firstEmptyUser = 0; + for( int i = 0; i < XUSER_MAX_COUNT; i++ ) + { + if(localplayers[i] == NULL) + { + firstEmptyUser = i; + break; + } + } + + // For durango, check for unmapped controllers + for(unsigned int iPad = XUSER_MAX_COUNT; iPad < (XUSER_MAX_COUNT + InputManager.MAX_GAMEPADS); ++iPad) + { + bool isPadLocked = InputManager.IsPadLocked(iPad), isPadConnected = InputManager.IsPadConnected(iPad), buttonPressed = InputManager.ButtonPressed(iPad); + if (isPadLocked || !isPadConnected || !buttonPressed) continue; + + if(!ui.PressStartPlaying(firstEmptyUser)) + { + ui.ShowPressStart(firstEmptyUser); + } + else + { + // did we just get input from a player who doesn't exist? They'll be wanting to join the game then + if(InputManager.ButtonPressed(iPad, MINECRAFT_ACTION_PAUSEMENU)) + { + // bring up the sign in dialog + app.DebugPrintf("Bringing up the sign in ui\n"); + ProfileManager.RequestSignInUI(false, g_NetworkManager.IsLocalGame(), true, false,true,&Minecraft::InGame_SignInReturned, this,iPad); + + // 4J Stu - If we are joining a pad here, then we don't want to try and join any others + break; + } + } + } + } +#endif + + if (pause && level != NULL) + { + float lastA = timer->a; + timer->advanceTime(); + timer->a = lastA; + } + else + { + timer->advanceTime(); + } + + //__int64 beforeTickTime = System::nanoTime(); + for (int i = 0; i < timer->ticks; i++) + { + bool bLastTimerTick = ( i == ( timer->ticks - 1 ) ); + // 4J-PB - the tick here can run more than once, and this is a problem for our input, which would see the a key press twice with the same time - let's tick the inputmanager again + if(i!=0) + { + InputManager.Tick(); + app.HandleButtonPresses(); + } + + ticks++; + // try { // 4J - try/catch removed + bool bFirst = true; + for( int idx = 0; idx < XUSER_MAX_COUNT; idx++ ) + { + // 4J - If we are waiting for this connection to do something, then tick it here. + // This replaces many of the original Java scenes which would tick the connection while showing that scene + if( m_pendingLocalConnections[idx] != NULL ) + { + m_pendingLocalConnections[idx]->tick(); + } + + // reset the player inactive tick + if(localplayers[idx]!=NULL) + { + // any input received? + if((localplayers[idx]->ullButtonsPressed!=0) || InputManager.GetJoypadStick_LX(idx,false)!=0.0f || + InputManager.GetJoypadStick_LY(idx,false)!=0.0f || InputManager.GetJoypadStick_RX(idx,false)!=0.0f || + InputManager.GetJoypadStick_RY(idx,false)!=0.0f ) + { + localplayers[idx]->ResetInactiveTicks(); + } + else + { + localplayers[idx]->IncrementInactiveTicks(); + } + + if(localplayers[idx]->GetInactiveTicks()>200) + { + if(!localplayers[idx]->isIdle() && localplayers[idx]->onGround) + { + localplayers[idx]->setIsIdle(true); + } + } + else + { + if(localplayers[idx]->isIdle()) + { + localplayers[idx]->setIsIdle(false); + } + } + } + + if( setLocalPlayerIdx(idx) ) + { + tick(bFirst, bLastTimerTick); + bFirst = false; + // clear the stored button downs since the tick for this player will now have actioned them + player->ullButtonsPressed=0LL; + } + } + + ui.HandleGameTick(); + + setLocalPlayerIdx(ProfileManager.GetPrimaryPad()); + + // 4J - added - now do the equivalent of level::animateTick, but taking into account the positions of all our players + + for( int l = 0; l < levels.length; l++ ) + { + if( levels[l] ) + { + levels[l]->animateTickDoWork(); + } + } + + // } catch (LevelConflictException e) { + // this.level = null; + // setLevel(null); + // setScreen(new LevelConflictScreen()); + // } +// SparseLightStorage::tick(); // 4J added +// CompressedTileStorage::tick(); // 4J added +// SparseDataStorage::tick(); // 4J added + } + //__int64 tickDuraction = System::nanoTime() - beforeTickTime; + MemSect(31); + checkGlError(L"Pre render"); + MemSect(0); + + TileRenderer::fancy = options->fancyGraphics; + + // if (pause) timer.a = 1; + + PIXBeginNamedEvent(0,"Sound engine update"); + soundEngine->tick((shared_ptr *)localplayers, timer->a); + PIXEndNamedEvent(); + + PIXBeginNamedEvent(0,"Light update"); + + glEnable(GL_TEXTURE_2D); + + PIXEndNamedEvent(); + + // if (!Keyboard::isKeyDown(Keyboard.KEY_F7)) Display.update(); // 4J - removed + + // 4J-PB - changing this to be per player + //if (player != NULL && player->isInWall()) options->thirdPersonView = false; + if (player != NULL && player->isInWall()) player->SetThirdPersonView(0); + + if (!noRender) + { + bool bFirst = true; + int iPrimaryPad=ProfileManager.GetPrimaryPad(); + for( int i = 0; i < XUSER_MAX_COUNT; i++ ) + { + if( setLocalPlayerIdx(i) ) + { + PIXBeginNamedEvent(0,"Game render player idx %d",i); + RenderManager.StateSetViewport((C4JRender::eViewportType)player->m_iScreenSection); + gameRenderer->render(timer->a, bFirst); + bFirst = false; + PIXEndNamedEvent(); + + if(i==iPrimaryPad) + { +#ifdef __ORBIS__ + // PS4 does much of the screen-capturing for every frame, to simplify the synchronisation when we actually want a capture. This call tells it the point in the frame to do it. + RenderManager.InternalScreenCapture(); +#endif + // check to see if we need to capture a screenshot for the save game thumbnail + switch(app.GetXuiAction(i)) + { + case eAppAction_ExitWorldCapturedThumbnail: + case eAppAction_SaveGameCapturedThumbnail: + case eAppAction_AutosaveSaveGameCapturedThumbnail: + // capture the save thumbnail + app.CaptureSaveThumbnail(); + break; + } + } + } + } + // If there's an unoccupied quadrant, then clear that to black + if( unoccupiedQuadrant > -1 ) + { + // render a logo + RenderManager.StateSetViewport((C4JRender::eViewportType)(C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_LEFT + unoccupiedQuadrant)); + glClearColor(0, 0, 0, 0); + glClear(GL_COLOR_BUFFER_BIT); + + ui.SetEmptyQuadrantLogo(C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_LEFT + unoccupiedQuadrant); + } + setLocalPlayerIdx(iPrimaryPad); + RenderManager.StateSetViewport(C4JRender::VIEWPORT_TYPE_FULLSCREEN); + +#ifdef _XBOX + // Do we need to capture a screenshot for a social post? + for( int i = 0; i < XUSER_MAX_COUNT; i++ ) + { + if(app.GetXuiAction(i)==eAppAction_SocialPostScreenshot) + { + app.CaptureScreenshot(i); + } + } +#endif + } + glFlush(); + + /* 4J - removed + if (!Display::isActive()) + { + if (fullscreen) + { + this->toggleFullScreen(); + } + Sleep(10); + } + */ + +#if PACKET_ENABLE_STAT_TRACKING + Packet::updatePacketStatsPIX(); +#endif + + if (options->renderDebug) + { + //renderFpsMeter(tickDuraction); + +#if DEBUG_RENDER_SHOWS_PACKETS + // To show data for only one packet type + //Packet::renderPacketStats(31); + + // To show data for all packet types selected as being renderable in the Packet:static_ctor call to Packet::map + Packet::renderAllPacketStats(); +#else + // To show the size of the QNet queue in bytes and messages + g_NetworkManager.renderQueueMeter(); +#endif + } + else + { + lastTimer = System::nanoTime(); + } + + achievementPopup->render(); + + PIXBeginNamedEvent(0,"Sleeping"); + Sleep(0); // 4J - was Thread.yield() + PIXEndNamedEvent(); + + // if (Keyboard::isKeyDown(Keyboard::KEY_F7)) Display.update(); // 4J - removed condition + PIXBeginNamedEvent(0,"Display update"); + Display::update(); + PIXEndNamedEvent(); + + // checkScreenshot(); // 4J - removed + + /* 4J - removed + if (parent != NULL && !fullscreen) + { + if (parent.getWidth() != width || parent.getHeight() != height) + { + width = parent.getWidth(); + height = parent.getHeight(); + if (width <= 0) width = 1; + if (height <= 0) height = 1; + + resize(width, height); + } + } + */ + MemSect(31); + checkGlError(L"Post render"); + MemSect(0); + frames++; + //pause = !isClientSide() && screen != NULL && screen->isPauseScreen(); + //pause = g_NetworkManager.IsLocalGame() && g_NetworkManager.GetPlayerCount() == 1 && app.IsPauseMenuDisplayed(ProfileManager.GetPrimaryPad()); + pause = app.IsAppPaused(); + +#ifndef _CONTENT_PACKAGE + while (System::nanoTime() >= lastTime + 1000000000) + { + MemSect(31); + fpsString = _toString(frames) + L" fps, " + _toString(Chunk::updates) + L" chunk updates"; + MemSect(0); + Chunk::updates = 0; + lastTime += 1000000000; + frames = 0; + } +#endif + /* + } catch (LevelConflictException e) { + this.level = null; + setLevel(null); + setScreen(new LevelConflictScreen()); + } catch (OutOfMemoryError e) { + emergencySave(); + setScreen(new OutOfMemoryScreen()); + System.gc(); + } + */ + } + /* + } catch (StopGameException e) { + } catch (Throwable e) { + emergencySave(); + e.printStackTrace(); + crash(new CrashReport("Unexpected error", e)); + } finally { + destroy(); + } + */ + } + LeaveCriticalSection(&m_setLevelCS); +} + +void Minecraft::run_end() +{ + destroy(); +} + +void Minecraft::emergencySave() +{ + // 4J - lots of try/catches removed here, and garbage collector things + levelRenderer->clear(); + AABB::clearPool(); + Vec3::clearPool(); + setLevel(NULL); +} + +void Minecraft::renderFpsMeter(__int64 tickTime) +{ + int nsPer60Fps = 1000000000l / 60; + if (lastTimer == -1) + { + lastTimer = System::nanoTime(); + } + __int64 now = System::nanoTime(); + Minecraft::tickTimes[(Minecraft::frameTimePos) & (Minecraft::frameTimes_length - 1)] = tickTime; + Minecraft::frameTimes[(Minecraft::frameTimePos++) & (Minecraft::frameTimes_length - 1)] = now - lastTimer; + lastTimer = now; + + glClear(GL_DEPTH_BUFFER_BIT); + glMatrixMode(GL_PROJECTION); + glEnable(GL_COLOR_MATERIAL); + glLoadIdentity(); + glOrtho(0, (float)width, (float)height, 0, 1000, 3000); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glTranslatef(0, 0, -2000); + + glLineWidth(1); + glDisable(GL_TEXTURE_2D); + Tesselator *t = Tesselator::getInstance(); + t->begin(GL_QUADS); + int hh1 = (int) (nsPer60Fps / 200000); + t->color(0x20000000); + t->vertex((float)(0), (float)( height - hh1), (float)( 0)); + t->vertex((float)(0), (float)( height), (float)( 0)); + t->vertex((float)(Minecraft::frameTimes_length), (float)( height), (float)( 0)); + t->vertex((float)(Minecraft::frameTimes_length), (float)( height - hh1), (float)( 0)); + + t->color(0x20200000); + t->vertex((float)(0), (float)( height - hh1 * 2), (float)( 0)); + t->vertex((float)(0), (float)( height - hh1), (float)( 0)); + t->vertex((float)(Minecraft::frameTimes_length), (float)( height - hh1), (float)( 0)); + t->vertex((float)(Minecraft::frameTimes_length), (float)( height - hh1 * 2), (float)( 0)); + + t->end(); + __int64 totalTime = 0; + for (int i = 0; i < Minecraft::frameTimes_length; i++) + { + totalTime += Minecraft::frameTimes[i]; + } + int hh = (int) (totalTime / 200000 / Minecraft::frameTimes_length); + t->begin(GL_QUADS); + t->color(0x20400000); + t->vertex((float)(0), (float)( height - hh), (float)( 0)); + t->vertex((float)(0), (float)( height), (float)( 0)); + t->vertex((float)(Minecraft::frameTimes_length), (float)( height), (float)( 0)); + t->vertex((float)(Minecraft::frameTimes_length), (float)( height - hh), (float)( 0)); + t->end(); + t->begin(GL_LINES); + for (int i = 0; i < Minecraft::frameTimes_length; i++) + { + int col = ((i - Minecraft::frameTimePos) & (Minecraft::frameTimes_length - 1)) * 255 / Minecraft::frameTimes_length; + int cc = col * col / 255; + cc = cc * cc / 255; + int cc2 = cc * cc / 255; + cc2 = cc2 * cc2 / 255; + if (Minecraft::frameTimes[i] > nsPer60Fps) + { + t->color(0xff000000 + cc * 65536); + } + else + { + t->color(0xff000000 + cc * 256); + } + + __int64 time = Minecraft::frameTimes[i] / 200000; + __int64 time2 = Minecraft::tickTimes[i] / 200000; + + t->vertex((float)(i + 0.5f), (float)( height - time + 0.5f), (float)( 0)); + t->vertex((float)(i + 0.5f), (float)( height + 0.5f), (float)( 0)); + + // if (Minecraft.frameTimes[i]>nsPer60Fps) { + t->color(0xff000000 + cc * 65536 + cc * 256 + cc * 1); + // } else { + // t.color(0xff808080 + cc/2 * 256); + // } + t->vertex((float)(i + 0.5f), (float)( height - time + 0.5f), (float)( 0)); + t->vertex((float)(i + 0.5f), (float)( height - (time - time2) + 0.5f), (float)( 0)); + } + t->end(); + + glEnable(GL_TEXTURE_2D); +} + +void Minecraft::stop() +{ + running = false; + // keepPolling = false; +} + +void Minecraft::pauseGame() +{ + if (screen != NULL) return; + + // setScreen(new PauseScreen()); // 4J - TODO put back in +} + +void Minecraft::resize(int width, int height) +{ + if (width <= 0) width = 1; + if (height <= 0) height = 1; + this->width = width; + this->height = height; + + if (screen != NULL) + { + ScreenSizeCalculator ssc(options, width, height); + int screenWidth = ssc.getWidth(); + int screenHeight = ssc.getHeight(); + // screen->init(this, screenWidth, screenHeight); // 4J - TODO - put back in + } +} + +void Minecraft::verify() +{ + /* 4J - TODO + new Thread() { + public void run() { + try { + HttpURLConnection huc = (HttpURLConnection) new URL("https://login.minecraft.net/session?name=" + user.name + "&session=" + user.sessionId).openConnection(); + huc.connect(); + if (huc.getResponseCode() == 400) { + warezTime = System.currentTimeMillis(); + } + huc.disconnect(); + } catch (Exception e) { + e.printStackTrace(); + } + } + }.start(); + */ +} + + + + +void Minecraft::levelTickUpdateFunc(void* pParam) +{ + Level* pLevel = (Level*)pParam; + pLevel->tick(); +} + +void Minecraft::levelTickThreadInitFunc() +{ + AABB::CreateNewThreadStorage(); + Vec3::CreateNewThreadStorage(); + IntCache::CreateNewThreadStorage(); + Compression::UseDefaultThreadStorage(); +} + + +// 4J - added bFirst parameter, which is true for the first active viewport in splitscreen +// 4J - added bUpdateTextures, which is true if the actual renderer textures are to be updated - this will be true for the last time this tick runs with bFirst true +void Minecraft::tick(bool bFirst, bool bUpdateTextures) +{ + int iPad=player->GetXboxPad(); + //OutputDebugString("Minecraft::tick\n"); + + //4J-PB - only tick this player's stats + stats[iPad]->tick(iPad); + + // Tick the opacity timer (to display the interface at default opacity for a certain time if the user has been navigating it) + app.TickOpacityTimer(iPad); + + // 4J added + if( bFirst ) levelRenderer->destroyedTileManager->tick(); + + gui->tick(); + gameRenderer->pick(1); +#if 0 + // 4J - removed - we don't use ChunkCache anymore + if (player != NULL) + { + ChunkSource *cs = level->getChunkSource(); + if (dynamic_cast(cs) != NULL) + { + ChunkCache *spcc = (ChunkCache *)cs; + + // 4J - there was also Mth::floors on these ints but that seems superfluous + int xt = ((int) player->x) >> 4; + int zt = ((int) player->z) >> 4; + spcc->centerOn(xt, zt); + } + } +#endif + + // soundEngine.playMusicTick(); + + if (!pause && level != NULL) gameMode->tick(); + MemSect(31); + glBindTexture(GL_TEXTURE_2D, textures->loadTexture(TN_TERRAIN)); //L"/terrain.png")); + MemSect(0); + if( bFirst ) + { + PIXBeginNamedEvent(0,"Texture tick"); + if (!pause) textures->tick(bUpdateTextures); + PIXEndNamedEvent(); + } + + /* + * if (serverConnection != null && !(screen instanceof ErrorScreen)) { + * if (!serverConnection.isConnected()) { + * progressRenderer.progressStart("Connecting.."); + * progressRenderer.progressStagePercentage(0); } else { + * serverConnection.tick(); serverConnection.sendPosition(player); } } + */ + if (screen == NULL && player != NULL ) + { + if (player->getHealth() <= 0 && !ui.GetMenuDisplayed(iPad) ) + { + setScreen(NULL); + } + else if (player->isSleeping() && level != NULL && level->isClientSide) + { + // setScreen(new InBedChatScreen()); // 4J - TODO put back in + } + } + else if (screen != NULL && (dynamic_cast(screen)!=NULL) && !player->isSleeping()) + { + setScreen(NULL); + } + + if (screen != NULL) + { + player->missTime = 10000; + player->lastClickTick[0] = ticks + 10000; + player->lastClickTick[1] = ticks + 10000; + } + + if (screen != NULL) + { + screen->updateEvents(); + if (screen != NULL) + { + screen->particles->tick(); + screen->tick(); + } + } + + 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, iLS=-1, iRS=-1; + + if(player->abilities.instabuild) + { + iX=IDS_TOOLTIPS_CREATIVE; + } + else + { + iX=IDS_CONTROLS_CRAFTING; + } + // control scheme remapping can move the Action button, so we need to check this + 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) + { + case _360_JOY_BUTTON_RT: + piAction=&iRT; + break; + case _360_JOY_BUTTON_LT: + piAction=&iLT; + break; + case _360_JOY_BUTTON_LB: + piAction=&iLB; + break; + case _360_JOY_BUTTON_RB: + piAction=&iRB; + break; + case _360_JOY_BUTTON_A: + default: + piAction=&iA; + break; + } + + switch(uiJump) + { + case _360_JOY_BUTTON_LT: + piJump=&iLT; + break; + case _360_JOY_BUTTON_RT: + piJump=&iRT; + break; + case _360_JOY_BUTTON_LB: + piJump=&iLB; + break; + case _360_JOY_BUTTON_RB: + piJump=&iRB; + break; + case _360_JOY_BUTTON_A: + default: + piJump=&iA; + break; + } + + switch(uiUse) + { + case _360_JOY_BUTTON_LB: + piUse=&iLB; + break; + case _360_JOY_BUTTON_RB: + piUse=&iRB; + break; + case _360_JOY_BUTTON_LT: + piUse=&iLT; + break; + case _360_JOY_BUTTON_RT: + default: + piUse=&iRT; + break; + } + + switch(uiAlt) + { + default: + case _360_JOY_BUTTON_LSTICK_RIGHT: + piAlt=&iRS; + break; + + //TODO + } + + if (player->isUnderLiquid(Material::water)) + { + *piJump=IDS_TOOLTIPS_SWIMUP; + } + else + { + *piJump=-1; + } + + *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) + { + *piUse=IDS_TOOLTIPS_WAKEUP; + } + 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(); + + // 4J-JEV: Moved all this here to avoid having it in 3 different places. + if (itemInstance) + { + // 4J-PB - very special case for boat and empty bucket and glass bottle and more + bool bUseItem = gameMode->useItem(player, level, itemInstance, true); + + switch (itemInstance->getItem()->id) + { + // food + case Item::potatoBaked_Id: + case Item::potato_Id: + case Item::pumpkinPie_Id: + case Item::potatoPoisonous_Id: + case Item::carrotGolden_Id: + case Item::carrots_Id: + case Item::mushroomStew_Id: + case Item::apple_Id: + case Item::bread_Id: + case Item::porkChop_raw_Id: + case Item::porkChop_cooked_Id: + case Item::apple_gold_Id: + case Item::fish_raw_Id: + case Item::fish_cooked_Id: + case Item::cookie_Id: + case Item::beef_cooked_Id: + case Item::beef_raw_Id: + case Item::chicken_cooked_Id: + case Item::chicken_raw_Id: + case Item::melon_Id: + case Item::rotten_flesh_Id: + case Item::spiderEye_Id: + // Check that we are actually hungry so will eat this item + { + FoodItem *food = (FoodItem *)itemInstance->getItem(); + if (food != NULL && food->canEat(player)) + { + *piUse=IDS_TOOLTIPS_EAT; + } + } + break; + + case Item::bucket_milk_Id: + *piUse=IDS_TOOLTIPS_DRINK; + break; + + case Item::fishingRod_Id: // use + case Item::emptyMap_Id: + *piUse=IDS_TOOLTIPS_USE; + break; + + case Item::egg_Id: // throw + case Item::snowBall_Id: + *piUse=IDS_TOOLTIPS_THROW; + break; + + case Item::bow_Id: // draw or release + if ( player->abilities.instabuild || player->inventory->hasResource(Item::arrow_Id) ) + { + if (player->isUsingItem()) *piUse=IDS_TOOLTIPS_RELEASE_BOW; + else *piUse=IDS_TOOLTIPS_DRAW_BOW; + } + break; + + case Item::sword_wood_Id: + case Item::sword_stone_Id: + case Item::sword_iron_Id: + case Item::sword_diamond_Id: + case Item::sword_gold_Id: + *piUse=IDS_TOOLTIPS_BLOCK; + break; + + case Item::bucket_empty_Id: + case Item::glassBottle_Id: + 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; + break; + + case Item::potion_Id: + if (bUseItem) + { + if (MACRO_POTION_IS_SPLASH(itemInstance->getAuxValue())) *piUse=IDS_TOOLTIPS_THROW; + else *piUse=IDS_TOOLTIPS_DRINK; + } + break; + + case Item::enderPearl_Id: + if (bUseItem) *piUse=IDS_TOOLTIPS_THROW; + break; + + case Item::eyeOfEnder_Id: + // This will only work if there is a stronghold in this dimension + if ( bUseItem && (level->dimension->id==0) && level->getLevelData()->getHasStronghold() ) + { + *piUse=IDS_TOOLTIPS_THROW; + } + break; + + case Item::expBottle_Id: + if (bUseItem) *piUse=IDS_TOOLTIPS_THROW; + break; + } + } + + if (hitResult!=NULL) + { + switch(hitResult->type) + { + case HitResult::TILE: + { + int x,y,z; + x=hitResult->x; + y=hitResult->y; + z=hitResult->z; + int face = hitResult->f; + + int iTileID=level->getTile(x,y ,z ); + int iData = level->getData(x, y, z); + + 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()->onLookAt(iTileID,iData); + } + + // 4J-PB - Call the useItemOn with the TestOnly flag set + bool bUseItemOn=gameMode->useItemOn(player, level, itemInstance, x, y, z, face, hitResult->pos, true); + + /* 4J-Jev: + * Moved this here so we have item tooltips to fallback on + * for noteblocks, enderportals and flowerpots in case of non-standard items. + * (ie. ignite behaviour) + */ + if (bUseItemOn && itemInstance!=NULL) + { + switch (itemInstance->getItem()->id) + { + case Tile::mushroom_brown_Id: + case Tile::mushroom_red_Id: + case Tile::tallgrass_Id: + case Tile::cactus_Id: + case Tile::sapling_Id: + case Tile::reeds_Id: + case Tile::flower_Id: + case Tile::rose_Id: + *piUse=IDS_TOOLTIPS_PLANT; + break; + + // Things to USE + case Item::hoe_wood_Id: + case Item::hoe_stone_Id: + case Item::hoe_iron_Id: + case Item::hoe_diamond_Id: + case Item::hoe_gold_Id: + *piUse=IDS_TOOLTIPS_TILL; + break; + + case Item::seeds_wheat_Id: + case Item::netherwart_seeds_Id: + *piUse=IDS_TOOLTIPS_PLANT; + break; + + case Item::dye_powder_Id: + // bonemeal grows various plants + if (itemInstance->getAuxValue() == DyePowderItem::WHITE) + { + switch(iTileID) + { + case Tile::sapling_Id: + case Tile::wheat_Id: + case Tile::grass_Id: + case Tile::mushroom_brown_Id: + case Tile::mushroom_red_Id: + case Tile::melonStem_Id: + case Tile::pumpkinStem_Id: + case Tile::carrots_Id: + case Tile::potatoes_Id: + *piUse=IDS_TOOLTIPS_GROW; + break; + } + } + break; + + case Item::painting_Id: + *piUse=IDS_TOOLTIPS_HANG; + break; + + case Item::flintAndSteel_Id: + case Item::fireball_Id: + *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; + } + } + + switch(iTileID) + { + case Tile::anvil_Id: + case Tile::enchantTable_Id: + case Tile::brewingStand_Id: + case Tile::workBench_Id: + case Tile::furnace_Id: + case Tile::furnace_lit_Id: + case Tile::door_wood_Id: + case Tile::dispenser_Id: + case Tile::lever_Id: + case Tile::button_stone_Id: + 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: + if (bUseItemOn) *piUse=IDS_TOOLTIPS_PLACE; + *piAction=IDS_TOOLTIPS_MINE; + break; + + case Tile::bed_Id: + if (bUseItemOn) *piUse=IDS_TOOLTIPS_SLEEP; + *piAction=IDS_TOOLTIPS_MINE; + break; + + case Tile::noteblock_Id: + // if in creative mode, we will mine + if (player->abilities.instabuild) *piAction=IDS_TOOLTIPS_MINE; + else *piAction=IDS_TOOLTIPS_PLAY; + *piUse=IDS_TOOLTIPS_CHANGEPITCH; + break; + + case Tile::sign_Id: + *piAction=IDS_TOOLTIPS_MINE; + break; + + case Tile::cauldron_Id: + // special case for a cauldron of water and an empty bottle + if (itemInstance) + { + int iID=itemInstance->getItem()->id; + int currentData = level->getData(x, y, z); + if ((iID==Item::glassBottle_Id) && (currentData > 0)) + { + *piUse=IDS_TOOLTIPS_COLLECT; + } + } + *piAction=IDS_TOOLTIPS_MINE; + break; + + case Tile::cake_Id: + if (player->abilities.instabuild) // if in creative mode, we will mine + { + *piAction=IDS_TOOLTIPS_MINE; + } + else + { + if (player->getFoodData()->needsFood() ) // 4J-JEV: Changed from healthto hunger. + { + *piAction=IDS_TOOLTIPS_EAT; + *piUse=IDS_TOOLTIPS_EAT; + } + else + { + *piAction=IDS_TOOLTIPS_MINE; + } + } + break; + + case Tile::jukebox_Id: + if (!bUseItemOn && itemInstance!=NULL) + { + int iID=itemInstance->getItem()->id; + if ( (iID>=Item::record_01_Id) && (iID<=Item::record_12_Id) ) + { + *piUse=IDS_TOOLTIPS_PLAY; + } + *piAction=IDS_TOOLTIPS_MINE; + } + else + { + if (Tile::jukebox->TestUse(level, x, y, z, player)) // means we can eject + { + *piUse=IDS_TOOLTIPS_EJECT; + } + *piAction=IDS_TOOLTIPS_MINE; + } + break; + + case Tile::flowerPot_Id: + if ( !bUseItemOn && (itemInstance != NULL) && (iData == 0) ) + { + int iID = itemInstance->getItem()->id; + if (iID<256) // is it a tile? + { + switch(iID) + { + case Tile::flower_Id: + case Tile::rose_Id: + case Tile::sapling_Id: + case Tile::mushroom_brown_Id: + case Tile::mushroom_red_Id: + case Tile::cactus_Id: + case Tile::deadBush_Id: + *piUse=IDS_TOOLTIPS_PLANT; + break; + + case Tile::tallgrass_Id: + if (itemInstance->getAuxValue() != TallGrass::TALL_GRASS) *piUse=IDS_TOOLTIPS_PLANT; + break; + } + } + } + *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; + } + } + break; + + case HitResult::ENTITY: + eINSTANCEOF entityType = hitResult->entity->GetType(); + + 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(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; + + 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: + { + 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; + + shared_ptr animal = dynamic_pointer_cast(hitResult->entity); + + if (animal->isLeashed() && animal->getLeashHolder() == player) + { + *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: + { + // 4J-PB - Fix for #13081 - No tooltip is displayed for hitting a cow when you have nothing in your hand + if(player->isAllowedToAttackAnimals()) *piAction=IDS_TOOLTIPS_HIT; + + shared_ptr 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; + *piUse=IDS_TOOLTIPS_SAIL; + break; + + 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; + } + + 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: + { + // convert to tile-based color value (0 is white instead of black) + int newColor = ColoredTile::getTileDataForItemAuxValue(heldItem->getAuxValue()); + + // can only use a dye on sheep that haven't been sheared + if(!(sheep->isSheared() && sheep->getColor() != newColor)) + { + *piUse=IDS_TOOLTIPS_DYE; + } + } + break; + case Item::shears_Id: + { + // can only shear a sheep that hasn't been sheared + if ( !sheep->isBaby() && !sheep->isSheared() ) + { + *piUse=IDS_TOOLTIPS_SHEAR; + } + } + + break; + default: + { + if(!sheep->isBaby() && !sheep->isInLove() && (sheep->getAge() == 0) && sheep->isFood(heldItem)) + { + *piUse=IDS_TOOLTIPS_LOVEMODE; + } + } + break; + + case -1: break; // 4J-JEV: Empty hand. + } + } + break; + + case eTYPE_PIG: + { + // can ride a pig + if(player->isAllowedToAttackAnimals()) *piAction=IDS_TOOLTIPS_HIT; + + 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()) + { + switch(heldItemId) + { + case Item::saddle_Id: + *piUse=IDS_TOOLTIPS_SADDLE; + break; + + default: + { + if (!pig->isInLove() && (pig->getAge() == 0) && pig->isFood(heldItem)) + { + *piUse=IDS_TOOLTIPS_LOVEMODE; + } + } + break; + } + } + } + } + break; + + case eTYPE_WOLF: + // can be tamed, fed, and made to sit/stand, or enter love mode + { + shared_ptr wolf = dynamic_pointer_cast(hitResult->entity); + + if(player->isAllowedToAttackAnimals()) *piAction=IDS_TOOLTIPS_HIT; + + 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()) + { + *piUse=IDS_TOOLTIPS_TAME; + } + else if (equalsIgnoreCase(player->getUUID(), wolf->getOwnerUUID())) + { + if(wolf->isSitting()) + { + *piUse=IDS_TOOLTIPS_FOLLOWME; + } + else + { + *piUse=IDS_TOOLTIPS_SIT; + } + } + + break; + case Item::enderPearl_Id: + // Use is throw, so don't change the tips for the wolf + break; + case Item::dye_powder_Id: + if (wolf->isTame()) + { + if (ColoredTile::getTileDataForItemAuxValue(heldItem->getAuxValue()) != wolf->getCollarColor()) + { + *piUse=IDS_TOOLTIPS_DYECOLLAR; + } + else if (wolf->isSitting()) + { + *piUse=IDS_TOOLTIPS_FOLLOWME; + } + else + { + *piUse=IDS_TOOLTIPS_SIT; + } + } + break; + default: + if(wolf->isTame()) + { + if(wolf->isFood(heldItem)) + { + if(wolf->GetSynchedHealth() < wolf->getMaxHealth()) + { + *piUse=IDS_TOOLTIPS_HEAL; + } + else + { + if(!wolf->isBaby() && !wolf->isInLove() && (wolf->getAge() == 0)) + { + *piUse=IDS_TOOLTIPS_LOVEMODE; + } + } + // break out here + break; + } + + if (equalsIgnoreCase(player->getUUID(), wolf->getOwnerUUID())) + { + if(wolf->isSitting()) + { + *piUse=IDS_TOOLTIPS_FOLLOWME; + } + else + { + *piUse=IDS_TOOLTIPS_SIT; + } + } + } + break; + } + } + break; + case eTYPE_OCELOT: + { + shared_ptr ocelot = dynamic_pointer_cast(hitResult->entity); + + if(player->isAllowedToAttackAnimals()) *piAction=IDS_TOOLTIPS_HIT; + + 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)) + { + if(!ocelot->isBaby()) + { + if(!ocelot->isInLove()) + { + if(ocelot->getAge() == 0) + { + *piUse=IDS_TOOLTIPS_LOVEMODE; + } + } + else + { + *piUse=IDS_TOOLTIPS_FEED; + } + } + + } + else if (equalsIgnoreCase(player->getUUID(), ocelot->getOwnerUUID()) && !ocelot->isSittingOnTile() ) + { + if(ocelot->isSitting()) + { + *piUse=IDS_TOOLTIPS_FOLLOWME; + } + else + { + *piUse=IDS_TOOLTIPS_SIT; + } + } + } + else if(heldItemId >= 0) + { + if (ocelot->isFood(heldItem)) *piUse=IDS_TOOLTIPS_TAME; + } + } + break; + + case eTYPE_PLAYER: + { + // Fix for #58576 - TU6: Content: Gameplay: Hit button prompt is available when attacking a host who has "Invisible" option turned on + shared_ptr TargetPlayer = dynamic_pointer_cast(hitResult->entity); + + if(!TargetPlayer->hasInvisiblePrivilege()) // This means they are invisible, not just that they have the privilege + { + if( app.GetGameHostOption(eGameHostOption_PvP) && player->isAllowedToAttackPlayers()) + { + *piAction=IDS_TOOLTIPS_HIT; + } + } + } + break; + + case eTYPE_ITEM_FRAME: + { + shared_ptr itemFrame = dynamic_pointer_cast(hitResult->entity); + + // is the frame occupied? + if(itemFrame->getItem()!=NULL) + { + // rotate the item + *piUse=IDS_TOOLTIPS_ROTATE; + } + else + { + // is there an object in hand? + 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()) + { + *piUse=IDS_TOOLTIPS_TRADE; + } + *piAction=IDS_TOOLTIPS_HIT; + } + break; + + case eTYPE_ZOMBIE: + { + shared_ptr zomb = dynamic_pointer_cast(hitResult->entity); + static GoldenAppleItem *goldapple = (GoldenAppleItem *) Item::apple_gold; + + //zomb->hasEffect(MobEffect::weakness) - not present on client. + if ( zomb->isVillager() && zomb->isWeakened() && (heldItemId == Item::apple_gold_Id) && !goldapple->isFoil(heldItem) ) + { + *piUse=IDS_TOOLTIPS_CURE; + } + *piAction=IDS_TOOLTIPS_HIT; + } + break; + + 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; + } + } + } + + // 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) ) + { + wheel = 1; + } + else if (InputManager.GetValue(iPad, MINECRAFT_ACTION_RIGHT_SCROLL,true) > 0 && gameMode->isInputAllowed(MINECRAFT_ACTION_RIGHT_SCROLL) ) + { + wheel = -1; + } + if (wheel != 0) + { + player->inventory->swapPaint(wheel); + + if( gameMode != NULL && gameMode->getTutorial() != NULL ) + { + // 4J Stu - For the tutorial we want to be able to record what items we are using so that we can give hints + gameMode->getTutorial()->onSelectedItemChanged(player->inventory->getSelected()); + } + + // Update presence + player->updateRichPresence(); + + if (options->isFlying) + { + if (wheel > 0) wheel = 1; + if (wheel < 0) wheel = -1; + + options->flySpeed += wheel * .25f; + } + } + + if( gameMode->isInputAllowed(MINECRAFT_ACTION_ACTION) ) + { + if((player->ullButtonsPressed&(1LL<handleMouseClick(0); + player->lastClickTick[0] = ticks; + } + + if (InputManager.ButtonDown(iPad, MINECRAFT_ACTION_ACTION) && ticks - player->lastClickTick[0] >= timer->ticksPerSecond / 4) + { + //printf("MINECRAFT_ACTION_ACTION ButtonDown"); + player->handleMouseClick(0); + player->lastClickTick[0] = ticks; + } + + if(InputManager.ButtonDown(iPad, MINECRAFT_ACTION_ACTION) ) + { + player->handleMouseDown(0, true ); + } + else + { + player->handleMouseDown(0, false ); + } + } + + // 4J Stu - This is how we used to handle the USE action. It has now been replaced with the block below which is more like the way the Java game does it, + // however we may find that the way we had it previously is more fun to play. + /* + if ((InputManager.GetValue(iPad, MINECRAFT_ACTION_USE,true)>0) && gameMode->isInputAllowed(MINECRAFT_ACTION_USE) ) + { + handleMouseClick(1); + lastClickTick = ticks; + } + */ + if( player->isUsingItem() ) + { + if(!InputManager.ButtonDown(iPad, MINECRAFT_ACTION_USE)) gameMode->releaseUsingItem(player); + } + else if( gameMode->isInputAllowed(MINECRAFT_ACTION_USE) ) + { + if( player->abilities.instabuild ) + { + // 4J - attempt to handle click in special creative mode fashion if possible (used for placing blocks at regular intervals) + bool didClick = player->creativeModeHandleMouseClick(1, InputManager.ButtonDown(iPad, MINECRAFT_ACTION_USE) ); + // If this handler has put us in lastClick_oldRepeat mode then it is because we aren't placing blocks - behave largely as the code used to + if( player->lastClickState == LocalPlayer::lastClick_oldRepeat ) + { + // If we've already handled the click in creativeModeHandleMouseClick then just record the time of this click + if( didClick ) + { + player->lastClickTick[1] = ticks; + } + else + { + // Otherwise just the original game code for handling autorepeat + if (InputManager.ButtonDown(iPad, MINECRAFT_ACTION_USE) && ticks - player->lastClickTick[1] >= timer->ticksPerSecond / 4) + { + player->handleMouseClick(1); + player->lastClickTick[1] = ticks; + } + } + } + } + else + { + // Consider as a click if we've had a period of not pressing the button, or we've reached auto-repeat time since the last time + // Auto-repeat is only considered if we aren't riding or sprinting, to avoid photo sensitivity issues when placing fire whilst doing fast things + // Also disable repeat when the player is sleeping to stop the waking up right after using the bed + bool firstClick = ( player->lastClickTick[1] == 0 ); + bool autoRepeat = ticks - player->lastClickTick[1] >= timer->ticksPerSecond / 4; + if ( player->isRiding() || player->isSprinting() || player->isSleeping() ) autoRepeat = false; + if (InputManager.ButtonDown(iPad, MINECRAFT_ACTION_USE) ) + { + // If the player has just exited a bed, then delay the time before a repeat key is allowed without releasing + if(player->isSleeping() ) player->lastClickTick[1] = ticks + (timer->ticksPerSecond * 2); + if( firstClick || autoRepeat ) + { + bool wasSleeping = player->isSleeping(); + + player->handleMouseClick(1); + + // If the player has just exited a bed, then delay the time before a repeat key is allowed without releasing + if(wasSleeping) player->lastClickTick[1] = ticks + (timer->ticksPerSecond * 2); + else player->lastClickTick[1] = ticks; + } + } + else + { + player->lastClickTick[1] = 0; + } + } + } + + if(app.DebugSettingsOn()) + { + if (player->ullButtonsPressed & ( 1LL << MINECRAFT_ACTION_CHANGE_SKIN) ) + { + player->ChangePlayerSkin(); + } + } + + if (player->missTime > 0) player->missTime--; + +#ifdef _DEBUG_MENUS_ENABLED + if(app.DebugSettingsOn()) + { +#ifndef __PSVITA__ + // 4J-PB - debugoverlay for primary player only + if(iPad==ProfileManager.GetPrimaryPad()) + { + if((player->ullButtonsPressed&(1LL<renderDebug = !options->renderDebug; +#ifdef _XBOX + app.EnableDebugOverlay(options->renderDebug,iPad); +#else + // 4J Stu - The xbox uses a completely different way of navigating to this scene + ui.NavigateToScene(0, eUIScene_DebugOverlay, NULL, eUILayer_Debug); +#endif +#endif + } + + if((player->ullButtonsPressed&(1LL< mob = dynamic_pointer_cast(Creeper::_class->newInstance( level )); + //shared_ptr mob = dynamic_pointer_cast(Wolf::_class->newInstance( level )); + shared_ptr mob = dynamic_pointer_cast(shared_ptr(new Spider( level ))); + mob->moveTo(player->x+1, player->y, player->z+1, level->random->nextFloat() * 360, 0); + level->addEntity(mob); + } + } + + if( (player->ullButtonsPressed&(1LL<abilities.debugflying = !player->abilities.debugflying; + player->abilities.flying = !player->abilities.flying; + } +#endif // PSVITA + } +#endif + + if((player->ullButtonsPressed&(1LL<isInputAllowed(MINECRAFT_ACTION_RENDER_THIRD_PERSON)) + { + // 4J-PB - changing this to be per player + player->SetThirdPersonView((player->ThirdPersonView()+1)%3); + //options->thirdPersonView = !options->thirdPersonView; + } + + if((player->ullButtonsPressed&(1LL<isInputAllowed(MINECRAFT_ACTION_GAME_INFO)) + { + ui.NavigateToScene(iPad,eUIScene_InGameInfoMenu); + ui.PlayUISFX(eSFX_Press); + } + + if((player->ullButtonsPressed&(1LL<isInputAllowed(MINECRAFT_ACTION_INVENTORY)) + { + shared_ptr player = Minecraft::GetInstance()->player; + ui.PlayUISFX(eSFX_Press); + + if(gameMode->isServerControlledInventory()) + { + player->sendOpenInventory(); + } + else + { + app.LoadInventoryMenu(iPad,player); + } + } + + if((player->ullButtonsPressed&(1LL<isInputAllowed(MINECRAFT_ACTION_CRAFTING)) + { + 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 + if(gameMode->hasInfiniteItems()) + { + // Creative mode + + ui.PlayUISFX(eSFX_Press); + app.LoadCreativeMenu(iPad,player); + } + // 4J-PB - Microsoft request that we use the 3x3 crafting if someone presses X while at the workbench + else if ((hitResult!=NULL) && (hitResult->type == HitResult::TILE) && (level->getTile(hitResult->x, hitResult->y, hitResult->z) == Tile::workBench_Id)) + { + //ui.PlayUISFX(eSFX_Press); + //app.LoadXuiCrafting3x3Menu(iPad,player,hitResult->x, hitResult->y, hitResult->z); + bool usedItem = false; + gameMode->useItemOn(player, level, nullptr, hitResult->x, hitResult->y, hitResult->z, 0, hitResult->pos, false, &usedItem); + } + else + { + ui.PlayUISFX(eSFX_Press); + app.LoadCrafting2x2Menu(iPad,player); + } + } + + if ( (player->ullButtonsPressed&(1LL<ullButtonsPressed&(1LL<GetXboxPad()); + ui.PlayUISFX(eSFX_Press); + ui.NavigateToScene(iPad, eUIScene_PauseMenu, NULL, eUILayer_Scene); + } + + if((player->ullButtonsPressed&(1LL<isInputAllowed(MINECRAFT_ACTION_DROP)) + { + player->drop(); + } + + __uint64 ullButtonsPressed=player->ullButtonsPressed; + + bool selected = false; +#ifdef __PSVITA__ + // 4J-PB - use the touchscreen for quickselect + SceTouchData* pTouchData = InputManager.GetTouchPadData(iPad,false); + + 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+iYOffset)&&(pTouchData->report[0].yinventory->selected=(pTouchData->report[0].x-QuickSelectRect[iHudSize].left)/QuickSelectBoxWidth[iHudSize]; + selected = true; + app.DebugPrintf("Touch %d\n",player->inventory->selected); + } + } +#endif + if( selected || wheel != 0 || (player->ullButtonsPressed&(1LL< selectedItem = player->getSelectedItem(); + // Dropping items happens over network, so if we only have one then assume that we dropped it and should hide the item + int iCount=0; + + if(selectedItem != NULL) iCount=selectedItem->GetCount(); + if(selectedItem != NULL && !( (player->ullButtonsPressed&(1LL<GetCount() == 1)) + { + itemName = selectedItem->getHoverName(); + } + if( !(player->ullButtonsPressed&(1LL<GetCount() <= 1) ) ui.SetSelectedItem( iPad, itemName ); + } + } + else + { + // 4J-PB + if (InputManager.GetValue(iPad, ACTION_MENU_CANCEL) > 0 && gameMode->isInputAllowed(ACTION_MENU_CANCEL)) + { + setScreen(NULL); + } + } + + // monitor for keyboard input + // #ifndef _CONTENT_PACKAGE + // if(!(ui.GetMenuDisplayed(iPad))) + // { + // WCHAR wchInput; + // if(InputManager.InputDetected(iPad,&wchInput)) + // { + // printf("Input Detected!\n"); + // + // // see if we can react to this + // if(app.GetXuiAction(iPad)==eAppAction_Idle) + // { + // app.SetAction(iPad,eAppAction_DebugText,(LPVOID)wchInput); + // } + // } + // } + // #endif + +#if 0 + // 4J - TODO - some replacement for input handling... + if (screen == NULL || screen.passEvents) + { + while (Mouse.next()) + { + long passedTime = System.currentTimeMillis() - lastTickTime; + if (passedTime > 200) continue; + + int wheel = Mouse.getEventDWheel(); + if (wheel != 0) { + player->inventory.swapPaint(wheel); + + if (options.isFlying) { + if (wheel > 0) wheel = 1; + if (wheel < 0) wheel = -1; + + options.flySpeed += wheel * .25f; + } + } + + if (screen == null) { + if (!mouseGrabbed && Mouse.getEventButtonState()) { + grabMouse(); + } else { + if (Mouse.getEventButton() == 0 && Mouse.getEventButtonState()) { + handleMouseClick(0); + lastClickTick = ticks; + } + if (Mouse.getEventButton() == 1 && Mouse.getEventButtonState()) { + handleMouseClick(1); + lastClickTick = ticks; + } + if (Mouse.getEventButton() == 2 && Mouse.getEventButtonState()) { + handleGrabTexture(); + } + } + } else if (screen != null) { + screen.mouseEvent(); + } + } + + if (missTime > 0) missTime--; + + while (Keyboard.next()) { + player->setKey(Keyboard.getEventKey(), Keyboard.getEventKeyState()); + if (Keyboard.getEventKeyState()) { + if (Keyboard.getEventKey() == Keyboard.KEY_F11) { + toggleFullScreen(); + continue; + } + /* + * if (Keyboard.getEventKey() == Keyboard.KEY_F4) { new + * PortalForcer().createPortal(level, player); continue; } + */ + + /* + * if (Keyboard.getEventKey() == Keyboard.KEY_RETURN) { + * level.pathFind(); continue; } + */ + + if (screen != null) { + screen.keyboardEvent(); + } else { + if (Keyboard.getEventKey() == Keyboard.KEY_ESCAPE) { + pauseGame(); + } + + if (Keyboard.getEventKey() == Keyboard.KEY_S && Keyboard.isKeyDown(Keyboard.KEY_F3)) { + reloadSound(); + } + + // if (Keyboard.getEventKey() == Keyboard.KEY_P) { + // gameMode = new DemoMode(this); + // selectLevel(CreateWorldScreen.findAvailableFolderName(getLevelSource(), "Demo"), "Demo World", 0L); + // setScreen(null); + // + // } + + if (Keyboard.getEventKey() == Keyboard.KEY_F1) { + options.hideGui = !options.hideGui; + } + if (Keyboard.getEventKey() == Keyboard.KEY_F3) { + options.renderDebug = !options.renderDebug; + } + if (Keyboard.getEventKey() == Keyboard.KEY_F5) { + options.thirdPersonView = !options.thirdPersonView; + } + if (Keyboard.getEventKey() == Keyboard.KEY_F8) { + options.smoothCamera = !options.smoothCamera; + } + if (DEADMAU5_CAMERA_CHEATS) { + if (Keyboard.getEventKey() == Keyboard.KEY_F6) { + options.isFlying = !options.isFlying; + } + if (Keyboard.getEventKey() == Keyboard.KEY_F9) { + options.fixedCamera = !options.fixedCamera; + } + if (Keyboard.getEventKey() == Keyboard.KEY_ADD) { + options.cameraSpeed += .1f; + } + if (Keyboard.getEventKey() == Keyboard.KEY_SUBTRACT) { + options.cameraSpeed -= .1f; + if (options.cameraSpeed < 0) { + options.cameraSpeed = 0; + } + } + } + + if (Keyboard.getEventKey() == options.keyBuild.key) { + setScreen(new InventoryScreen(player)); + } + + if (Keyboard.getEventKey() == options.keyDrop.key) { + player->drop(); + } + if (isClientSide() && Keyboard.getEventKey() == options.keyChat.key) { + setScreen(new ChatScreen()); + } + } + + for (int i = 0; i < 9; i++) { + if (Keyboard.getEventKey() == Keyboard.KEY_1 + i) player->inventory.selected = i; + } + if (Keyboard.getEventKey() == options.keyFog.key) { + options.toggle(Options.Option.RENDER_DISTANCE, Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_RSHIFT) ? -1 : 1); + } + } + } + + if (screen == null) { + if (Mouse.isButtonDown(0) && ticks - lastClickTick >= timer.ticksPerSecond / 4 && mouseGrabbed) { + handleMouseClick(0); + lastClickTick = ticks; + } + if (Mouse.isButtonDown(1) && ticks - lastClickTick >= timer.ticksPerSecond / 4 && mouseGrabbed) { + handleMouseClick(1); + lastClickTick = ticks; + } + } + + handleMouseDown(0, screen == null && Mouse.isButtonDown(0) && mouseGrabbed); + } +#endif + + if (level != NULL) + { + if (player != NULL) + { + recheckPlayerIn++; + if (recheckPlayerIn == 30) + { + recheckPlayerIn = 0; + level->ensureAdded(player); + } + } + // 4J Changed - We are setting the difficulty the same as the server so that leaderboard updates work correctly + //level->difficulty = options->difficulty; + //if (level->isClientSide) level->difficulty = Difficulty::HARD; + if( !level->isClientSide ) + { + //app.DebugPrintf("Minecraft::tick - Difficulty = %d",options->difficulty); + level->difficulty = options->difficulty; + } + + PIXBeginNamedEvent(0,"Game renderer tick"); + if (!pause) gameRenderer->tick( bFirst); + PIXEndNamedEvent(); + + // 4J - we want to tick each level once only per frame, and do it when a player that is actually in that level happens to be active. + // This is important as things that get called in the level tick (eg the levellistener) eventually end up working out what the current + // level is by determing it from the current player. Use flags here to make sure each level is only ticked the once. + static unsigned int levelsTickedFlags; + if( bFirst ) + { + levelsTickedFlags = 0; + +#ifndef DISABLE_LEVELTICK_THREAD + PIXBeginNamedEvent(0,"levelTickEventQueue waitForFinish"); + levelTickEventQueue->waitForFinish(); + PIXEndNamedEvent(); +#endif // DISABLE_LEVELTICK_THREAD + SparseLightStorage::tick(); // 4J added + CompressedTileStorage::tick(); // 4J added + SparseDataStorage::tick(); // 4J added + } + + for(unsigned int i = 0; i < levels.length; ++i) + { + if( player->level != levels[i] ) continue; // Don't tick if the current player isn't in this level + + // 4J - this doesn't fully tick the animateTick here, but does register this player's position. The actual + // work is now done in Level::animateTickDoWork() so we can take into account multiple players in the one level. + if (!pause && levels[i] != NULL) levels[i]->animateTick(Mth::floor(player->x), Mth::floor(player->y), Mth::floor(player->z)); + + if( levelsTickedFlags & ( 1 << i ) ) continue; // Don't tick further if we've already ticked this level this frame + levelsTickedFlags |= (1 << i); + + PIXBeginNamedEvent(0,"Level renderer tick"); + if (!pause) levelRenderer->tick(); + PIXEndNamedEvent(); + // if (!pause && player!=null) { + // if (player != null && !level.entities.contains(player)) { + // level.addEntity(player); + // } + // } + if( levels[i] != NULL ) + { + if (!pause) + { + if (levels[i]->skyFlashTime > 0) levels[i]->skyFlashTime--; + PIXBeginNamedEvent(0,"Level entity tick"); + levels[i]->tickEntities(); + PIXEndNamedEvent(); + } + + // optimisation to set the culling off early, in parallel with other stuff +#if defined __PS3__ && !defined DISABLE_SPU_CODE + // kick off the culling for all valid players in this level + int currPlayerIdx = getLocalPlayerIdx(); + for( int idx = 0; idx < XUSER_MAX_COUNT; idx++ ) + { + if(localplayers[idx]!=NULL) + { + if( localplayers[idx]->level == levels[i] ) + { + setLocalPlayerIdx(idx); + gameRenderer->setupCamera(timer->a, i); + Camera::prepare(localplayers[idx], localplayers[idx]->ThirdPersonView() == 2); + 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; + FrustumCuller frustObj; + Culler *frustum = &frustObj; + MemSect(0); + frustum->prepare(xOff, yOff, zOff); + levelRenderer->cull_SPU(idx, frustum, 0); + } + } + } + setLocalPlayerIdx(currPlayerIdx); +#endif // __PS3__ + + // 4J Stu - We are always online, but still could be paused + if (!pause) // || isClientSide()) + { + //app.DebugPrintf("Minecraft::tick spawn settings - Difficulty = %d",options->difficulty); + levels[i]->setSpawnSettings(level->difficulty > 0, true); + PIXBeginNamedEvent(0,"Level tick"); +#ifdef DISABLE_LEVELTICK_THREAD + levels[i]->tick(); +#else + levelTickEventQueue->sendEvent(levels[i]); +#endif // DISABLE_LEVELTICK_THREAD + PIXEndNamedEvent(); + } + } + } + + if( bFirst ) + { + PIXBeginNamedEvent(0,"Particle tick"); + if (!pause) particleEngine->tick(); + PIXEndNamedEvent(); + } + + // 4J Stu - Keep ticking the connections if paused so that they don't time out + if( pause ) tickAllConnections(); + // player->tick(); + } +#ifdef __PS3__ + +// while(!g_tickLevelQueue.empty()) +// { +// Level* pLevel = g_tickLevelQueue.front(); +// g_tickLevelQueue.pop(); +// pLevel->tick(); +// }; + +#endif + + // if (Keyboard.isKeyDown(Keyboard.KEY_NUMPAD7) || + // Keyboard.isKeyDown(Keyboard.KEY_Q)) rota++; + // if (Keyboard.isKeyDown(Keyboard.KEY_NUMPAD9) || + // Keyboard.isKeyDown(Keyboard.KEY_E)) rota--; + // 4J removed + //lastTickTime = System::currentTimeMillis(); +} + +void Minecraft::reloadSound() +{ + // System.out.println("FORCING RELOAD!"); // 4J - removed + soundEngine = new SoundEngine(); + soundEngine->init(options); + bgLoader->forceReload(); +} + +bool Minecraft::isClientSide() +{ + return level != NULL && level->isClientSide; +} + +void Minecraft::selectLevel(ConsoleSaveFile *saveFile, const wstring& levelId, const wstring& levelName, LevelSettings *levelSettings) +{ + } + +bool Minecraft::saveSlot(int slot, const wstring& name) +{ + return false; +} + +bool Minecraft::loadSlot(const wstring& userName, int slot) +{ + return false; +} + +void Minecraft::releaseLevel(int message) +{ + //this->level = NULL; + setLevel(NULL, message); +} + +// 4J Stu - This code was within setLevel, but I moved it out so that I can call it at a better +// time when exiting from an online game +void Minecraft::forceStatsSave(int idx) +{ + //4J Gordon: Force a stats save + stats[idx]->save(idx, true); + + //4J Gordon: If the player is signed in, save the leaderboards + if( ProfileManager.IsSignedInLive(idx) ) + { + int tempLockedProfile = ProfileManager.GetLockedProfile(); + ProfileManager.SetLockedProfile(idx); + stats[idx]->saveLeaderboards(); + ProfileManager.SetLockedProfile(tempLockedProfile); + } +} + +// 4J Added +MultiPlayerLevel *Minecraft::getLevel(int dimension) +{ + if (dimension == -1) return levels[1]; + else if(dimension == 1) return levels[2]; + else return levels[0]; +} + +// 4J Stu - Removed as redundant with default values in params. +//void Minecraft::setLevel(Level *level, bool doForceStatsSave /*= true*/) +//{ +// setLevel(level, -1, NULL, doForceStatsSave); +//} + +// Also causing ambiguous call for some reason +// as it is matching shared_ptr from the func below with bool from this one +//void Minecraft::setLevel(Level *level, const wstring& message, bool doForceStatsSave /*= true*/) +//{ +// setLevel(level, message, NULL, doForceStatsSave); +//} + +void Minecraft::forceaddLevel(MultiPlayerLevel *level) +{ + int dimId = level->dimension->id; + if (dimId == -1) levels[1] = level; + else if(dimId == 1) levels[2] = level; + else levels[0] = level; +} + +void Minecraft::setLevel(MultiPlayerLevel *level, int message /*=-1*/, shared_ptr forceInsertPlayer /*=NULL*/, bool doForceStatsSave /*=true*/, bool bPrimaryPlayerSignedOut /*=false*/) +{ + EnterCriticalSection(&m_setLevelCS); + bool playerAdded = false; + this->cameraTargetPlayer = nullptr; + + if(progressRenderer != NULL) + { + this->progressRenderer->progressStart(message); + this->progressRenderer->progressStage(-1); + } + + // 4J-PB - since we now play music in the menu, just let it keep playing + //soundEngine->playStreaming(L"", 0, 0, 0, 0, 0); + + // 4J - stop update thread from processing this level, which blocks until it is safe to move on - will be re-enabled if we set the level to be non-NULL + gameRenderer->DisableUpdateThread(); + + for(unsigned int i = 0; i < levels.length; ++i) + { + // 4J We only need to save out in multiplayer is we are setting the level to NULL + // If we ever go back to making single player only then this will not work properly! + if (levels[i] != NULL && level == NULL) + { + // 4J Stu - This is really only relevant for single player (ie not what we do at the moment) + if((doForceStatsSave==true) && player!=NULL) + forceStatsSave(player->GetXboxPad() ); + + // 4J Stu - Added these for the case when we exit a level so we are setting the level to NULL + // The level renderer needs to have it's stored level set to NULL so that it doesn't break next time we set one + if (levelRenderer != NULL) + { + for(DWORD p = 0; p < XUSER_MAX_COUNT; ++p) + { + levelRenderer->setLevel(p, NULL); + } + } + if (particleEngine != NULL) particleEngine->setLevel(NULL); + } + } + // 4J If we are setting the level to NULL then we are exiting, so delete the levels + if( level == NULL ) + { + if(levels[0]!=NULL) + { + delete levels[0]; + levels[0] = NULL; + + // Both level share the same savedDataStorage + if(levels[1]!=NULL) levels[1]->savedDataStorage = NULL; + } + if(levels[1]!=NULL) + { + delete levels[1]; + levels[1] = NULL; + } + if(levels[2]!=NULL) + { + delete levels[2]; + levels[2] = NULL; + } + + // Delete all the player objects + for(unsigned int idx = 0; idx < XUSER_MAX_COUNT; ++idx) + { + shared_ptr mplp = localplayers[idx]; + if(mplp != NULL && mplp->connection != NULL ) + { + delete mplp->connection; + mplp->connection = NULL; + } + + if( localgameModes[idx] != NULL ) + { + delete localgameModes[idx]; + localgameModes[idx] = NULL; + } + + if( m_pendingLocalConnections[idx] != NULL ) + { + delete m_pendingLocalConnections[idx]; + m_pendingLocalConnections[idx] = NULL; + } + + localplayers[idx] = nullptr; + } + // If we are removing the primary player then there can't be a valid gamemode left anymore, this + // pointer will be referring to the one we've just deleted + gameMode = NULL; + // Remove references to player + player = nullptr; + cameraTargetPlayer = nullptr; + EntityRenderDispatcher::instance->cameraEntity = nullptr; + TileEntityRenderDispatcher::instance->cameraEntity = nullptr; + } + this->level = level; + + if (level != NULL) + { + int dimId = level->dimension->id; + if (dimId == -1) levels[1] = level; + else if(dimId == 1) levels[2] = level; + else levels[0] = level; + + // If no player has been set, then this is the first level to be set this game, so set up + // a primary player & initialise some other things + if (player == NULL) + { + int iPrimaryPlayer = ProfileManager.GetPrimaryPad(); + + player = gameMode->createPlayer(level); + + PlayerUID playerXUIDOffline = INVALID_XUID; + PlayerUID playerXUIDOnline = INVALID_XUID; + ProfileManager.GetXUID(iPrimaryPlayer,&playerXUIDOffline,false); + ProfileManager.GetXUID(iPrimaryPlayer,&playerXUIDOnline,true); +#ifdef __PSVITA__ + if(CGameNetworkManager::usingAdhocMode() && playerXUIDOnline.getOnlineID()[0] == 0) + { + // player doesn't have an online UID, set it from the player name + playerXUIDOnline.setForAdhoc(); + } +#endif + player->setXuid(playerXUIDOffline); + player->setOnlineXuid(playerXUIDOnline); + + player->m_displayName = ProfileManager.GetDisplayName(iPrimaryPlayer); + + + + player->resetPos(); + gameMode->initPlayer(player); + + player->SetXboxPad(iPrimaryPlayer); + + for(int i=0;iresetPos(); + // gameMode.initPlayer(player); + if (level != NULL) + { + level->addEntity(player); + playerAdded = true; + } + } + + if(player->input != NULL) delete player->input; + player->input = new Input(); + + if (levelRenderer != NULL) levelRenderer->setLevel(player->GetXboxPad(), level); + if (particleEngine != NULL) particleEngine->setLevel(level); + +#if 0 + // 4J - removed - we don't use ChunkCache anymore + ChunkSource *cs = level->getChunkSource(); + if (dynamic_cast(cs) != NULL) + { + ChunkCache *spcc = (ChunkCache *)cs; + + // 4J - these had a Mth::floor which seems unrequired + int xt = ((int) player->x) >> 4; + int zt = ((int) player->z) >> 4; + + spcc->centerOn(xt, zt); + } +#endif + gameMode->adjustPlayer(player); + + for(int i=0;icameraTargetPlayer = player; + + // 4J - allow update thread to start processing the level now both it & the player should be ok + gameRenderer->EnableUpdateThread(); + } + else + { + levelSource->clearAll(); + player = nullptr; + + // Clear all players if the new level is NULL + for(int i=0;iclose(); + m_pendingLocalConnections[i] = NULL; + localplayers[i] = nullptr; + localgameModes[i] = NULL; + } + } + + // System.gc(); // 4J - removed + // 4J removed + //this->lastTickTime = 0; + LeaveCriticalSection(&m_setLevelCS); +} + +void Minecraft::prepareLevel(int title) +{ + if(progressRenderer != NULL) + { + this->progressRenderer->progressStart(title); + this->progressRenderer->progressStage(IDS_PROGRESS_BUILDING_TERRAIN); + } + int r = 128; + if (gameMode->isCutScene()) r = 64; + int pp = 0; + int max = r * 2 / 16 + 1; + max = max * max; + ChunkSource *cs = level->getChunkSource(); + + Pos *spawnPos = level->getSharedSpawnPos(); + if (player != NULL) + { + spawnPos->x = (int) player->x; + spawnPos->z = (int) player->z; + } + +#if 0 + // 4J - removed - we don't use ChunkCache anymore + if (dynamic_cast(cs)!=NULL) + { + ChunkCache *spcc = (ChunkCache *) cs; + + spcc->centerOn(spawnPos->x >> 4, spawnPos->z >> 4); + } +#endif + + for (int x = -r; x <= r; x += 16) + { + for (int z = -r; z <= r; z += 16) + { + if(progressRenderer != NULL) this->progressRenderer->progressStagePercentage((pp++) * 100 / max); + level->getTile(spawnPos->x + x, 64, spawnPos->z + z); + if (!gameMode->isCutScene()) { + } + } + } + delete spawnPos; + if (!gameMode->isCutScene()) + { + if(progressRenderer != NULL) this->progressRenderer->progressStage(IDS_PROGRESS_SIMULATING_WORLD); + max = 2000; +} +} + +wstring Minecraft::gatherStats1() +{ + //return levelRenderer->gatherStats1(); + return L"Time to autosave: " + _toString( app.SecondsToAutosave() ) + L"s"; +} + +wstring Minecraft::gatherStats2() +{ + return g_NetworkManager.GatherStats(); + //return levelRenderer->gatherStats2(); +} + +wstring Minecraft::gatherStats3() +{ + return g_NetworkManager.GatherRTTStats(); + //return L"P: " + particleEngine->countParticles() + L". T: " + level->gatherStats(); +} + +wstring Minecraft::gatherStats4() +{ + return level->gatherChunkSourceStats(); +} + +void Minecraft::respawnPlayer(int iPad, int dimension, int newEntityId) +{ + gameRenderer->DisableUpdateThread(); // 4J - don't do updating whilst we are adjusting the player & localplayer array + shared_ptr localPlayer = localplayers[iPad]; + + level->validateSpawn(); + level->removeAllPendingEntityRemovals(); + + if (localPlayer != NULL) + { + level->removeEntity(localPlayer); + } + + shared_ptr oldPlayer = localPlayer; + cameraTargetPlayer = nullptr; + + // 4J-PB - copy and set the players xbox pad + int iTempPad=localPlayer->GetXboxPad(); + int iTempScreenSection = localPlayer->m_iScreenSection; + EDefaultSkins skin = localPlayer->getPlayerDefaultSkin(); + player = localgameModes[iPad]->createPlayer(level); + + PlayerUID playerXUIDOffline = INVALID_XUID; + PlayerUID playerXUIDOnline = INVALID_XUID; + ProfileManager.GetXUID(iTempPad,&playerXUIDOffline,false); + ProfileManager.GetXUID(iTempPad,&playerXUIDOnline,true); + player->setXuid(playerXUIDOffline); + player->setOnlineXuid(playerXUIDOnline); + player->setIsGuest( ProfileManager.IsGuest(iTempPad) ); + + player->m_displayName = ProfileManager.GetDisplayName(iPad); + + player->SetXboxPad(iTempPad); + + player->m_iScreenSection = iTempScreenSection; + player->setPlayerIndex( localPlayer->getPlayerIndex() ); + player->setCustomSkin(localPlayer->getCustomSkin()); + player->setPlayerDefaultSkin( skin ); + player->setCustomCape(localPlayer->getCustomCape()); + player->m_sessionTimeStart = localPlayer->m_sessionTimeStart; + player->m_dimensionTimeStart = localPlayer->m_dimensionTimeStart; + player->setPlayerGamePrivilege(Player::ePlayerGamePrivilege_All, localPlayer->getAllPlayerGamePrivileges()); + + player->SetThirdPersonView(oldPlayer->ThirdPersonView()); + + // Fix for #63021 - TU7: Content: UI: Travelling from/to the Nether results in switching currently held item to another. + // 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 + if( localPlayer->getHealth() > 0 && localPlayer->y > -64) + { + player->inventory->selected = localPlayer->inventory->selected; + } + + // Set the animation override if the skin has one + DWORD dwSkinID=app.getSkinIdFromPath(player->customTextureUrl); + if(GET_IS_DLC_SKIN_FROM_BITMASK(dwSkinID)) + { + player->setAnimOverrideBitmask(player->getSkinAnimOverrideBitmask(dwSkinID)); + } + + player->dimension = dimension; + cameraTargetPlayer = player; + + // 4J-PB - are we the primary player or a local player? + if(iPad==ProfileManager.GetPrimaryPad()) + { + createPrimaryLocalPlayer(iPad); + + // update the debugoptions + app.SetGameSettingsDebugMask(ProfileManager.GetPrimaryPad(),app.GetGameSettingsDebugMask(-1,true)); + } + else + { + storeExtraLocalPlayer(iPad); + } + + player->setShowOnMaps(app.GetGameHostOption(eGameHostOption_Gamertags)!=0?true:false); + + player->resetPos(); + level->addEntity(player); + gameMode->initPlayer(player); + + if(player->input != NULL) delete player->input; + player->input = new Input(); + player->entityId = newEntityId; + player->animateRespawn(); + gameMode->adjustPlayer(player); + + // 4J - added isClientSide check here + if (!level->isClientSide) + { + prepareLevel(IDS_PROGRESS_RESPAWNING); + } + + // 4J Added for multiplayer. At this point we know everything is ready to run again + //SetEvent(m_hPlayerRespawned); + player->SetPlayerRespawned(true); + + if (dynamic_cast(screen) != NULL) setScreen(NULL); + + gameRenderer->EnableUpdateThread(); +} + +void Minecraft::start(const wstring& name, const wstring& sid) +{ + startAndConnectTo(name, sid, L""); +} + +void Minecraft::startAndConnectTo(const wstring& name, const wstring& sid, const wstring& url) +{ + bool fullScreen = false; + wstring userName = name; + + /* 4J - removed window handling things here + final Frame frame = new Frame("Minecraft"); + Canvas canvas = new Canvas(); + frame.setLayout(new BorderLayout()); + + frame.add(canvas, BorderLayout.CENTER); + + // OverlayLayout oll = new OverlayLayout(frame); + // oll.addLayoutComponent(canvas, BorderLayout.CENTER); + // oll.addLayoutComponent(new JLabel("TEST"), BorderLayout.EAST); + + canvas.setPreferredSize(new Dimension(854, 480)); + frame.pack(); + frame.setLocationRelativeTo(null); + */ + + Minecraft *minecraft; + // 4J - was new Minecraft(frame, canvas, NULL, 854, 480, fullScreen); + + minecraft = new Minecraft(NULL, NULL, NULL, 1280, 720, fullScreen); + + /* - 4J - removed + { + @Override + public void onCrash(CrashReport crashReport) { + frame.removeAll(); + frame.add(new CrashInfoPanel(crashReport), BorderLayout.CENTER); + frame.validate(); + } + }; */ + + /* 4J - removed + final Thread thread = new Thread(minecraft, "Minecraft main thread"); + thread.setPriority(Thread.MAX_PRIORITY); + */ + minecraft->serverDomain = L"www.minecraft.net"; + + // 4J Stu - We never want the player to be DemoUser, we always want them to have their gamertag displayed + //if (ProfileManager.IsFullVersion()) + { + if (userName != L"" && sid != L"") // 4J - username & side were compared with NULL rather than empty strings + { + minecraft->user = new User(userName, sid); + } + else + { + minecraft->user = new User(L"Player" + _toString(System::currentTimeMillis() % 1000), L""); + } + } + //else + //{ + // minecraft->user = new DemoUser(); + //} + + /* 4J - TODO + if (url != NULL) + { + String[] tokens = url.split(":"); + minecraft.connectTo(tokens[0], Integer.parseInt(tokens[1])); + } + */ + + /* 4J - removed + frame.setVisible(true); + frame.addWindowListener(new WindowAdapter() { + public void windowClosing(WindowEvent arg0) { + minecraft.stop(); + try { + thread.join(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + System.exit(0); + } + }); + */ + // 4J - TODO - consider whether we need to actually create a thread here + minecraft->run(); +} + +ClientConnection *Minecraft::getConnection(int iPad) +{ + return localplayers[iPad]->connection; +} + +// 4J-PB - so we can access this from within our xbox game loop +Minecraft *Minecraft::GetInstance() +{ + return m_instance; +} + +bool useLomp = false; + +int g_iMainThreadId; + +void Minecraft::main() +{ + wstring name; + wstring sessionId; + + //g_iMainThreadId = GetCurrentThreadId(); + + useLomp = true; + + MinecraftWorld_RunStaticCtors(); + EntityRenderDispatcher::staticCtor(); + TileEntityRenderDispatcher::staticCtor(); + User::staticCtor(); + Tutorial::staticCtor(); + ColourTable::staticCtor(); + app.loadDefaultGameRules(); + +#ifdef _LARGE_WORLDS + LevelRenderer::staticCtor(); +#endif + + // 4J Stu - This block generates XML for the game rules schema +#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() )); + } + } + + 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()) + { + name = L"Player" + _toString<__int64>(System::currentTimeMillis() % 1000); + sessionId = L"-"; + /* 4J - TODO - get a session ID from somewhere? + if (args.length > 0) name = args[0]; + sessionId = "-"; + if (args.length > 1) sessionId = args[1]; + */ + } + + // Common for all platforms + IUIScene_CreativeMenu::staticCtor(); + + // On PS4, we call Minecraft::Start from another thread, as this has been timed taking ~2.5 seconds and we need to do some basic + // rendering stuff so that we don't break the TRCs on SubmitDone calls +#ifndef __ORBIS__ + Minecraft::start(name, sessionId); +#endif +} + +bool Minecraft::renderNames() +{ + if (m_instance == NULL || !m_instance->options->hideGui) + { + return true; + } + return false; +} + +bool Minecraft::useFancyGraphics() +{ + return (m_instance != NULL && m_instance->options->fancyGraphics); +} + +bool Minecraft::useAmbientOcclusion() +{ + return (m_instance != NULL && m_instance->options->ambientOcclusion != Options::AO_OFF); +} + +bool Minecraft::renderDebug() +{ + return (m_instance != NULL && m_instance->options->renderDebug); +} + +bool Minecraft::handleClientSideCommand(const wstring& chatMessage) +{ + return false; +} + +int Minecraft::maxSupportedTextureSize() +{ + // 4J Force value + return 1024; + + //for (int texSize = 16384; texSize > 0; texSize >>= 1) { + // GL11.glTexImage2D(GL11.GL_PROXY_TEXTURE_2D, 0, GL11.GL_RGBA, texSize, texSize, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null); + // final int width = GL11.glGetTexLevelParameteri(GL11.GL_PROXY_TEXTURE_2D, 0, GL11.GL_TEXTURE_WIDTH); + // if (width != 0) { + // return texSize; + // } + //} + //return -1; +} + +void Minecraft::delayTextureReload() +{ + reloadTextures = true; +} + +__int64 Minecraft::currentTimeMillis() +{ + return System::currentTimeMillis();//(Sys.getTime() * 1000) / Sys.getTimerResolution(); +} + +/*void Minecraft::handleMouseDown(int button, bool down) +{ +if (gameMode->instaBuild) return; +if (!down) missTime = 0; +if (button == 0 && missTime > 0) return; + +if (down && hitResult != NULL && hitResult->type == HitResult::TILE && button == 0) +{ +int x = hitResult->x; +int y = hitResult->y; +int z = hitResult->z; +gameMode->continueDestroyBlock(x, y, z, hitResult->f); +particleEngine->crack(x, y, z, hitResult->f); +} +else +{ +gameMode->stopDestroyBlock(); +} +} + +void Minecraft::handleMouseClick(int button) +{ +if (button == 0 && missTime > 0) return; +if (button == 0) +{ +app.DebugPrintf("handleMouseClick - Player %d is swinging\n",player->GetXboxPad()); +player->swing(); +} + +bool mayUse = true; + +// * if (button == 1) { ItemInstance item = +// * player.inventory.getSelected(); if (item != null) { if +// * (gameMode.useItem(player, item)) { +// * gameRenderer.itemInHandRenderer.itemUsed(); return; } } } + +// 4J-PB - Adding a special case in here for sleeping in a bed in a multiplayer game - we need to wake up, and we don't have the inbedchatscreen with a button + +if(button==1 && (player->isSleeping() && level != NULL && level->isClientSide)) +{ +shared_ptr mplp = dynamic_pointer_cast( player ); + +if(mplp) mplp->StopSleeping(); + +// 4J - TODO +//if (minecraft.player instanceof MultiplayerLocalPlayer) +//{ +// ClientConnection connection = ((MultiplayerLocalPlayer) minecraft.player).connection; +// connection.send(new PlayerCommandPacket(minecraft.player, PlayerCommandPacket.STOP_SLEEPING)); +//} +} + +if (hitResult == NULL) +{ +if (button == 0 && !(dynamic_cast(gameMode) != NULL)) missTime = 10; +} +else if (hitResult->type == HitResult::ENTITY) +{ +if (button == 0) +{ +gameMode->attack(player, hitResult->entity); +} +if (button == 1) +{ +gameMode->interact(player, hitResult->entity); +} +} +else if (hitResult->type == HitResult::TILE) +{ +int x = hitResult->x; +int y = hitResult->y; +int z = hitResult->z; +int face = hitResult->f; + +// * if (button != 0) { if (hitResult.f == 0) y--; if (hitResult.f == +// * 1) y++; if (hitResult.f == 2) z--; if (hitResult.f == 3) z++; if +// * (hitResult.f == 4) x--; if (hitResult.f == 5) x++; } + +// if (isClientSide()) +// { +// return; +// } + +if (button == 0) +{ +gameMode->startDestroyBlock(x, y, z, hitResult->f); +} +else +{ +shared_ptr item = player->inventory->getSelected(); +int oldCount = item != NULL ? item->count : 0; +if (gameMode->useItemOn(player, level, item, x, y, z, face)) +{ +mayUse = false; +app.DebugPrintf("Player %d is swinging\n",player->GetXboxPad()); +player->swing(); +} +if (item == NULL) +{ +return; +} + +if (item->count == 0) +{ +player->inventory->items[player->inventory->selected] = NULL; +} +else if (item->count != oldCount) +{ +gameRenderer->itemInHandRenderer->itemPlaced(); +} +} +} + +if (mayUse && button == 1) +{ +shared_ptr item = player->inventory->getSelected(); +if (item != NULL) +{ +if (gameMode->useItem(player, level, item)) +{ +gameRenderer->itemInHandRenderer->itemUsed(); +} +} +} +} +*/ + +// 4J-PB +Screen * Minecraft::getScreen() +{ + return screen; +} + +bool Minecraft::isTutorial() +{ + return m_inFullTutorialBits > 0; + + /*if( gameMode != NULL && gameMode->isTutorial() ) + { + return true; + } + else + { + return false; + }*/ +} + +void Minecraft::playerStartedTutorial(int iPad) +{ + // If the app doesn't think we are in a tutorial mode then just ignore this add + if( app.GetTutorialMode() ) m_inFullTutorialBits = m_inFullTutorialBits | ( 1 << iPad ); +} + +void Minecraft::playerLeftTutorial(int iPad) +{ + // 4J Stu - Fix for bug that was flooding Sentient with LevelStart events + // If the tutorial bits are already 0 then don't need to update anything + if(m_inFullTutorialBits == 0) + { + app.SetTutorialMode( false ); + return; + } + + m_inFullTutorialBits = m_inFullTutorialBits & ~( 1 << iPad ); + if(m_inFullTutorialBits == 0) + { + app.SetTutorialMode( false ); + + // 4J Stu -This telemetry event means something different on XboxOne, so we don't call it for simple state changes like this +#ifndef _XBOX_ONE + for(DWORD idx = 0; idx < XUSER_MAX_COUNT; ++idx) + { + if(localplayers[idx] != NULL) + { + TelemetryManager->RecordLevelStart(idx, eSen_FriendOrMatch_Playing_With_Invited_Friends, eSen_CompeteOrCoop_Coop_and_Competitive, level->difficulty, app.GetLocalPlayerCount(), g_NetworkManager.GetOnlinePlayerCount()); + } + } +#endif + } +} + +#ifdef _DURANGO +void Minecraft::inGameSignInCheckAllPrivilegesCallback(LPVOID lpParam, bool hasPrivileges, int iPad) +{ + Minecraft* pClass = (Minecraft*)lpParam; + + if(!hasPrivileges) + { + ProfileManager.RemoveGamepadFromGame(iPad); + } + else + { + if( !g_NetworkManager.SessionHasSpace() ) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + ui.RequestErrorMessage(IDS_MULTIPLAYER_FULL_TITLE, IDS_MULTIPLAYER_FULL_TEXT, uiIDA, 1); + ProfileManager.RemoveGamepadFromGame(iPad); + } + else if( ProfileManager.IsSignedInLive(iPad) && ProfileManager.AllowedToPlayMultiplayer(iPad) ) + { + // create the local player for the iPad + shared_ptr player = pClass->localplayers[iPad]; + if( player == NULL) + { + if( pClass->level->isClientSide ) + { + pClass->addLocalPlayer(iPad); + } + else + { + // create the local player for the iPad + shared_ptr player = pClass->localplayers[iPad]; + if( player == NULL) + { + player = pClass->createExtraLocalPlayer(iPad, (convStringToWstring( ProfileManager.GetGamertag(iPad) )).c_str(), iPad, pClass->level->dimension->id); + } + } + } + } + } +} +#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; + + if(g_NetworkManager.IsInSession()) + { + // 4J Stu - There seems to be a bug in the signin ui call that enables guest sign in. We never allow this within game, so make sure that it's disabled + // Fix for #66516 - TCR #124: MPS Guest Support ; #001: BAS Game Stability: TU8: The game crashes when second Guest signs-in on console which takes part in Xbox LIVE multiplayer session. + app.DebugPrintf("Disabling Guest Signin\n"); + XEnableGuestSignin(FALSE); + } + + // If sign in succeded, we're in game and this player isn't already playing, continue + if(bContinue==true && g_NetworkManager.IsInSession() && pMinecraftClass->localplayers[iPad] == NULL) + { + // It's possible that the player has not signed in - they can back out or choose no for the converttoguest + if(ProfileManager.IsSignedIn(iPad)) + { +#ifdef _DURANGO + if(!g_NetworkManager.IsLocalGame() && ProfileManager.IsSignedInLive(iPad) && ProfileManager.AllowedToPlayMultiplayer(iPad)) + { + ProfileManager.CheckMultiplayerPrivileges(iPad, true, &inGameSignInCheckAllPrivilegesCallback, pMinecraftClass); + } + else +#endif + if( !g_NetworkManager.SessionHasSpace() ) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + ui.RequestErrorMessage(IDS_MULTIPLAYER_FULL_TITLE, IDS_MULTIPLAYER_FULL_TEXT, uiIDA, 1); +#ifdef _DURANGO + ProfileManager.RemoveGamepadFromGame(iPad); +#endif + } + // if this is a local game then profiles just need to be signed in + else if( g_NetworkManager.IsLocalGame() || (ProfileManager.IsSignedInLive(iPad) && ProfileManager.AllowedToPlayMultiplayer(iPad)) ) + { +#ifdef __ORBIS__ + bool contentRestricted = false; + ProfileManager.GetChatAndContentRestrictions(iPad,false,NULL,&contentRestricted,NULL); // TODO! + + if (!g_NetworkManager.IsLocalGame() && contentRestricted) + { + ui.RequestContentRestrictedMessageBox(IDS_NO_MULTIPLAYER_PRIVILEGE_TITLE, IDS_CONTENT_RESTRICTION, iPad); + } + else if(!g_NetworkManager.IsLocalGame() && !ProfileManager.HasPlayStationPlus(iPad)) + { + pMinecraftClass->m_pPsPlusUpsell = new PsPlusUpsellWrapper(iPad); + pMinecraftClass->m_pPsPlusUpsell->displayUpsell(); + } + else +#endif + if( pMinecraftClass->level->isClientSide ) + { + pMinecraftClass->addLocalPlayer(iPad); + } + else + { + // create the local player for the iPad + shared_ptr player = pMinecraftClass->localplayers[iPad]; + if( player == NULL) + { + player = pMinecraftClass->createExtraLocalPlayer(iPad, (convStringToWstring( ProfileManager.GetGamertag(iPad) )).c_str(), iPad, pMinecraftClass->level->dimension->id); + } + } + } + else if( ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad()) && !ProfileManager.AllowedToPlayMultiplayer(iPad) ) + { + // 4J Stu - Don't allow converting to guests as we don't allow any guest sign-in while in the game + // Fix for #66516 - TCR #124: MPS Guest Support ; #001: BAS Game Stability: TU8: The game crashes when second Guest signs-in on console which takes part in Xbox LIVE multiplayer session. + //ProfileManager.RequestConvertOfflineToGuestUI( &Minecraft::InGame_SignInReturned, pMinecraftClass,iPad); + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestErrorMessage( IDS_NO_MULTIPLAYER_PRIVILEGE_TITLE, IDS_NO_MULTIPLAYER_PRIVILEGE_JOIN_TEXT, uiIDA,1,iPad); +#ifdef _DURANGO + ProfileManager.RemoveGamepadFromGame(iPad); +#endif + } + } + } + return 0; +} + +void Minecraft::tickAllConnections() +{ + int oldIdx = getLocalPlayerIdx(); + for(unsigned int i = 0; i < XUSER_MAX_COUNT; i++ ) + { + shared_ptr mplp = localplayers[i]; + if( mplp && mplp->connection) + { + setLocalPlayerIdx(i); + mplp->connection->tick(); + } + } + setLocalPlayerIdx(oldIdx); +} + +bool Minecraft::addPendingClientTextureRequest(const wstring &textureName) +{ + AUTO_VAR(it, find( m_pendingTextureRequests.begin(), m_pendingTextureRequests.end(), textureName)); + if( it == m_pendingTextureRequests.end() ) + { + m_pendingTextureRequests.push_back(textureName); + return true; + } + return false; +} + +void Minecraft::handleClientTextureReceived(const wstring &textureName) +{ + AUTO_VAR(it, find( m_pendingTextureRequests.begin(), m_pendingTextureRequests.end(), textureName)); + if( it != m_pendingTextureRequests.end() ) + { + m_pendingTextureRequests.erase(it); + } +} + +unsigned int Minecraft::getCurrentTexturePackId() +{ + return skins->getSelected()->getId(); +} + +ColourTable *Minecraft::getColourTable() +{ + TexturePack *selected = skins->getSelected(); + + ColourTable *colours = selected->getColourTable(); + + if(colours == NULL) + { + colours = skins->getDefault()->getColourTable(); + } + + return colours; +} + +#if defined __ORBIS__ +int Minecraft::MustSignInReturnedPSN(void *pParam, int iPad, C4JStorage::EMessageResult result) +{ + Minecraft* pMinecraft = (Minecraft *)pParam; + + if(result == C4JStorage::EMessage_ResultAccept) + { + SQRNetworkManager_Orbis::AttemptPSNSignIn(&Minecraft::InGame_SignInReturned, pMinecraft, false, iPad); + } + + return 0; +} +#endif + diff --git a/Minecraft.Client/Minecraft.h b/Minecraft.Client/Minecraft.h new file mode 100644 index 00000000..2fe1297a --- /dev/null +++ b/Minecraft.Client/Minecraft.h @@ -0,0 +1,348 @@ +#pragma once +class Timer; +class MultiPlayerLevel; +class LevelRenderer; +class MultiplayerLocalPlayer; +class Player; +class Mob; +class ParticleEngine; +class User; +class Canvas; +class Textures; +class Font; +class Screen; +class ProgressRenderer; +class GameRenderer; +class BackgroundDownloader; +class HumanoidModel; +class HitResult; +class Options; +class SoundEngine; +class MinecraftApplet; +class MouseHandler; +class TexturePackRepository; +class File; +class LevelStorageSource; +class StatsCounter; +class Component; +class Entity; +class AchievementPopup; +class WaterTexture; +class LavaTexture; +class Gui; +class ClientConnection; +class ConsoleSaveFile; +class ItemInHandRenderer; +class LevelSettings; +class ColourTable; +class MultiPlayerGameMode; +class PsPlusUpsellWrapper; + +#include "..\Minecraft.World\File.h" +#include "..\Minecraft.World\DisconnectPacket.h" +#include "..\Minecraft.World\C4JThread.h" +#include "ResourceLocation.h" + +using namespace std; + +class Minecraft +{ +private: + enum OS{ + 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); + void init(); + + // 4J - removed + // void crash(CrashReport crash); + // public abstract void onCrash(CrashReport crash); + +private: + static Minecraft *m_instance; + +public: + MultiPlayerGameMode *gameMode; + +private: + bool fullscreen; + bool hasCrashed; + + C4JThread::EventQueue* levelTickEventQueue; + + static void levelTickUpdateFunc(void* pParam); + static void levelTickThreadInitFunc(); + +public: + int width, height; + int width_phys, height_phys; // 4J - added + // private OpenGLCapabilities openGLCapabilities; + +private: + Timer *timer; + bool reloadTextures; +public: + Level *oldLevel; // 4J Stu added to keep a handle on an old level so we can delete it + //HANDLE m_hPlayerRespawned; // 4J Added so we can wait in menus until it is done (for async in multiplayer) +public: + + MultiPlayerLevel *level; + LevelRenderer *levelRenderer; + shared_ptr player; + + MultiPlayerLevelArray levels; + + shared_ptr localplayers[XUSER_MAX_COUNT]; + MultiPlayerGameMode *localgameModes[XUSER_MAX_COUNT]; + int localPlayerIdx; + ItemInHandRenderer *localitemInHandRenderers[XUSER_MAX_COUNT]; + // 4J-PB - so we can have debugoptions in the server + unsigned int uiDebugOptionsA[XUSER_MAX_COUNT]; + + // 4J Stu - Added these so that we can show a Xui scene while connecting + bool m_connectionFailed[XUSER_MAX_COUNT]; + DisconnectPacket::eDisconnectReason m_connectionFailedReason[XUSER_MAX_COUNT]; + ClientConnection *m_pendingLocalConnections[XUSER_MAX_COUNT]; + + bool addLocalPlayer(int idx); // Re-arrange the screen and start the connection + void addPendingLocalConnection(int idx, ClientConnection *connection); + void connectionDisconnected(int idx, DisconnectPacket::eDisconnectReason reason) { m_connectionFailed[idx] = true; m_connectionFailedReason[idx] = reason; } + + shared_ptr createExtraLocalPlayer(int idx, const wstring& name, int pad, int iDimension, ClientConnection *clientConnection = NULL,MultiPlayerLevel *levelpassedin=NULL); + void createPrimaryLocalPlayer(int iPad); + bool setLocalPlayerIdx(int idx); + int getLocalPlayerIdx(); + void removeLocalPlayerIdx(int idx); + void storeExtraLocalPlayer(int idx); + void updatePlayerViewportAssignments(); + int unoccupiedQuadrant; // 4J - added + + shared_ptr cameraTargetPlayer; + shared_ptr crosshairPickMob; + ParticleEngine *particleEngine; + User *user; + wstring serverDomain; + Canvas *parent; + bool appletMode; + + // 4J - per player ? + volatile bool pause; + + Textures *textures; + Font *font, *altFont; + Screen *screen; + ProgressRenderer *progressRenderer; + GameRenderer *gameRenderer; +private: + BackgroundDownloader *bgLoader; + + int ticks; + // 4J-PB - moved to per player + + //int missTime; + + int orgWidth, orgHeight; +public: + AchievementPopup *achievementPopup; +public: + Gui *gui; + // 4J - move to the per player structure? + bool noRender; + + HumanoidModel *humanoidModel; + HitResult *hitResult; + Options *options; +protected: + MinecraftApplet *minecraftApplet; +public: + SoundEngine *soundEngine; + MouseHandler *mouseHandler; +public: + TexturePackRepository *skins; + File workingDirectory; +private: + LevelStorageSource *levelSource; +public: + static const int frameTimes_length = 512; + static __int64 frameTimes[frameTimes_length]; + static const int tickTimes_length = 512; + static __int64 tickTimes[tickTimes_length]; + static int frameTimePos; + static __int64 warezTime; +private: + int rightClickDelay; +public: + // 4J- this should really be in localplayer + StatsCounter* stats[4]; + +private: + wstring connectToIp; + int connectToPort; + +public: + void clearConnectionFailed(); + void connectTo(const wstring& server, int port); + +private: + void renderLoadingScreen(); + +public: + void blit(int x, int y, int sx, int sy, int w, int h); + +private: + static File workDir; + +public: + LevelStorageSource *getLevelSource(); + void setScreen(Screen *screen); +private: + void checkGlError(const wstring& string); + +#ifdef __ORBIS__ + PsPlusUpsellWrapper *m_pPsPlusUpsell; +#endif + +public: + void destroy(); + volatile bool running; + wstring fpsString; + void run(); + // 4J-PB - split the run into 3 parts so we can run it from our xbox game loop + static Minecraft *GetInstance(); + void run_middle(); + void run_end(); + + void emergencySave(); + + // 4J - removed + //bool wasDown ; +private: + // void checkScreenshot(); // 4J - removed + // String grabHugeScreenshot(File workDir2, int width, int height, int ssWidth, int ssHeight); // 4J - removed + + // 4J - per player thing? + __int64 lastTimer; + + void renderFpsMeter(__int64 tickTime); +public: + void stop(); + // 4J removed + // bool mouseGrabbed; + // void grabMouse(); + // void releaseMouse(); + // 4J-PB - moved these into localplayer + //void handleMouseDown(int button, bool down); + //void handleMouseClick(int button); + + void pauseGame(); + // void toggleFullScreen(); // 4J - removed +private: + void resize(int width, int height); + +public: + // 4J - Moved to per player + //bool isRaining ; + + // 4J - Moved to per player + //__int64 lastTickTime; + +private: + // 4J- per player? + int recheckPlayerIn; + void verify(); + +public: + // 4J - added bFirst parameter, which is true for the first active viewport in splitscreen + // 4J - added bUpdateTextures, which is true if the actual renderer textures are to be updated - this will be true for the last time this tick runs with bFirst true + void tick(bool bFirst, bool bUpdateTextures); +private: + void reloadSound(); +public: + bool isClientSide(); + void selectLevel(ConsoleSaveFile *saveFile, const wstring& levelId, const wstring& levelName, LevelSettings *levelSettings); + //void toggleDimension(int targetDimension); + bool saveSlot(int slot, const wstring& name); + bool loadSlot(const wstring& userName, int slot); + void releaseLevel(int message); + // 4J Stu - Added the doForceStatsSave param + //void setLevel(Level *level, bool doForceStatsSave = true); + //void setLevel(Level *level, const wstring& message, bool doForceStatsSave = true); + void setLevel(MultiPlayerLevel *level, int message = -1, shared_ptr forceInsertPlayer = nullptr, bool doForceStatsSave = true,bool bPrimaryPlayerSignedOut=false); + // 4J-PB - added to force in the 'other' level when the main player creates the level at game load time + void forceaddLevel(MultiPlayerLevel *level); + void prepareLevel(int title); // 4J - changed to public + // OpenGLCapabilities getOpenGLCapabilities(); // 4J - removed + + wstring gatherStats1(); + wstring gatherStats2(); + wstring gatherStats3(); + wstring gatherStats4(); + + void respawnPlayer(int iPad,int dimension,int newEntityId); + static void start(const wstring& name, const wstring& sid); + static void startAndConnectTo(const wstring& name, const wstring& sid, const wstring& url); + ClientConnection *getConnection(int iPad); // 4J Stu added iPad param + static void main(); + static bool renderNames(); + static bool useFancyGraphics(); + static bool useAmbientOcclusion(); + static bool renderDebug(); + bool handleClientSideCommand(const wstring& chatMessage); + + static int maxSupportedTextureSize(); + void delayTextureReload(); + static __int64 currentTimeMillis(); + +#ifdef _DURANGO + static void inGameSignInCheckAllPrivilegesCallback(LPVOID lpParam, bool hasPrivileges, int iPad); + 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(); + + // 4J Stu + void forceStatsSave(int idx); + + CRITICAL_SECTION m_setLevelCS; +private: + // A bit field that store whether a particular quadrant is in the full tutorial or not + BYTE m_inFullTutorialBits; +public: + bool isTutorial(); + void playerStartedTutorial(int iPad); + void playerLeftTutorial(int iPad); + + // 4J Added + MultiPlayerLevel *getLevel(int dimension); + + void tickAllConnections(); + + Level *animateTickLevel; // 4J added + + // 4J - When a client requests a texture, it should add it to here while we are waiting for it + vector m_pendingTextureRequests; + vector m_pendingGeometryRequests; // additional skin box geometry + + // 4J Added + bool addPendingClientTextureRequest(const wstring &textureName); + void handleClientTextureReceived(const wstring &textureName); + void clearPendingClientTextureRequests() { m_pendingTextureRequests.clear(); } + bool addPendingClientGeometryRequest(const wstring &textureName); + void handleClientGeometryReceived(const wstring &textureName); + void clearPendingClientGeometryRequests() { m_pendingGeometryRequests.clear(); } + + unsigned int getCurrentTexturePackId(); + ColourTable *getColourTable(); + +#if defined __ORBIS__ + static int MustSignInReturnedPSN(void *pParam, int iPad, C4JStorage::EMessageResult result); +#endif +}; diff --git a/Minecraft.Client/Minecraft.msscmp b/Minecraft.Client/Minecraft.msscmp new file mode 100644 index 00000000..729475fa Binary files /dev/null and b/Minecraft.Client/Minecraft.msscmp differ diff --git a/Minecraft.Client/MinecraftServer.cpp b/Minecraft.Client/MinecraftServer.cpp new file mode 100644 index 00000000..4206a399 --- /dev/null +++ b/Minecraft.Client/MinecraftServer.cpp @@ -0,0 +1,1953 @@ +#include "stdafx.h" +//#include "Minecraft.h" + +#include + +#include "ConsoleInput.h" +#include "DerivedServerLevel.h" +#include "DispenserBootstrap.h" +#include "EntityTracker.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" +#include "..\Minecraft.World\net.minecraft.world.level.dimension.h" +#include "..\Minecraft.World\net.minecraft.world.level.storage.h" +#include "..\Minecraft.World\net.minecraft.world.h" +#include "..\Minecraft.World\net.minecraft.world.level.h" +#include "..\Minecraft.World\net.minecraft.world.level.tile.h" +#include "..\Minecraft.World\Pos.h" +#include "..\Minecraft.World\System.h" +#include "..\Minecraft.World\StringHelpers.h" +#ifdef SPLIT_SAVES +#include "..\Minecraft.World\ConsoleSaveFileSplit.h" +#endif +#include "..\Minecraft.World\ConsoleSaveFileOriginal.h" +#include "..\Minecraft.World\Socket.h" +#include "..\Minecraft.World\net.minecraft.world.entity.h" +#include "ProgressRenderer.h" +#include "ServerPlayer.h" +#include "GameRenderer.h" +#include "..\Minecraft.World\ThreadName.h" +#include "..\Minecraft.World\IntCache.h" +#include "..\Minecraft.World\CompressedTileStorage.h" +#include "..\Minecraft.World\SparseLightStorage.h" +#include "..\Minecraft.World\SparseDataStorage.h" +#include "..\Minecraft.World\compression.h" +#ifdef _XBOX +#include "Common\XUI\XUI_DebugSetCamera.h" +#endif +#include "PS3\PS3Extras\ShutdownManager.h" +#include "ServerCommandDispatcher.h" +#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 + +//4J Added +MinecraftServer *MinecraftServer::server = NULL; +bool MinecraftServer::setTimeAtEndOfTick = false; +__int64 MinecraftServer::setTime = 0; +bool MinecraftServer::setTimeOfDayAtEndOfTick = false; +__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; + +MinecraftServer::MinecraftServer() +{ + // 4J - added initialisers + connection = NULL; + settings = NULL; + players = NULL; + commands = NULL; + running = true; + m_bLoaded = false; + stopped = false; + tickCount = 0; + wstring progressStatus; + progress = 0; + motd = L""; + + m_isServerPaused = false; + m_serverPausedEvent = new C4JThread::Event; + + m_saveOnExit = false; + m_suspending = false; + + m_ugcPlayersVersion = 0; + m_texturePackId = 0; + maxBuildHeight = Level::maxBuildHeight; + playerIdleTimeout = 0; + m_postUpdateThread = NULL; + forceGameType = false; + + commandDispatcher = new ServerCommandDispatcher(); + + DispenserBootstrap::bootStrap(); +} + +MinecraftServer::~MinecraftServer() +{ +} + +bool MinecraftServer::initServer(__int64 seed, NetworkGameInitData *initData, DWORD initSettings, bool findSeed) +{ + // 4J - removed +#if 0 + commands = new ConsoleCommands(this); + + Thread t = new Thread() { + public void run() { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + String line = null; + try { + while (!stopped && running && (line = br.readLine()) != null) { + handleConsoleInput(line, MinecraftServer.this); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + }; + t.setDaemon(true); + t.start(); + + + LogConfigurator.initLogger(); + logger.info("Starting minecraft server version " + VERSION); + + if (Runtime.getRuntime().maxMemory() / 1024 / 1024 < 512) { + logger.warning("**** NOT ENOUGH RAM!"); + logger.warning("To start the server with more ram, launch it as \"java -Xmx1024M -Xms1024M -jar minecraft_server.jar\""); + } + + logger.info("Loading properties"); +#endif + settings = new Settings(new File(L"server.properties")); + + app.DebugPrintf("\n*** SERVER SETTINGS ***\n"); + app.DebugPrintf("ServerSettings: host-friends-only is %s\n",(app.GetGameHostOption(eGameHostOption_FriendsOfFriends)>0)?"on":"off"); + app.DebugPrintf("ServerSettings: game-type is %s\n",(app.GetGameHostOption(eGameHostOption_GameType)==0)?"Survival Mode":"Creative Mode"); + app.DebugPrintf("ServerSettings: pvp is %s\n",(app.GetGameHostOption(eGameHostOption_PvP)>0)?"on":"off"); + app.DebugPrintf("ServerSettings: fire spreads is %s\n",(app.GetGameHostOption(eGameHostOption_FireSpreads)>0)?"on":"off"); + app.DebugPrintf("ServerSettings: tnt explodes is %s\n",(app.GetGameHostOption(eGameHostOption_TNT)>0)?"on":"off"); + app.DebugPrintf("\n"); + + // TODO 4J Stu - Init a load of settings based on data passed as params + //settings->setBooleanAndSave( L"host-friends-only", (app.GetGameHostOption(eGameHostOption_FriendsOfFriends)>0) ); + + // 4J - Unused + //localIp = settings->getString(L"server-ip", L""); + //onlineMode = settings->getBoolean(L"online-mode", true); + //motd = settings->getString(L"motd", L"A Minecraft Server"); + //motd.replace('', '$'); + + setAnimals(settings->getBoolean(L"spawn-animals", true)); + setNpcsEnabled(settings->getBoolean(L"spawn-npcs", true)); + setPvpAllowed(app.GetGameHostOption( eGameHostOption_PvP )>0?true:false); // settings->getBoolean(L"pvp", true); + + // 4J Stu - We should never have hacked clients flying when they shouldn't be like the PC version, so enable flying always + // Fix for #46612 - TU5: Code: Multiplayer: A client can be banned for flying when accidentaly being blown by dynamite + setFlightAllowed(true); //settings->getBoolean(L"allow-flight", false); + + // 4J Stu - Enabling flight to stop it kicking us when we use it +#ifdef _DEBUG_MENUS_ENABLED + setFlightAllowed(true); +#endif + +#if 1 + connection = new ServerConnection(this); + Socket::Initialise(connection); // 4J - added +#else + // 4J - removed + InetAddress localAddress = null; + if (localIp.length() > 0) localAddress = InetAddress.getByName(localIp); + port = settings.getInt("server-port", DEFAULT_MINECRAFT_PORT); + + logger.info("Starting Minecraft server on " + (localIp.length() == 0 ? "*" : localIp) + ":" + port); + try { + connection = new ServerConnection(this, localAddress, port); + } catch (IOException e) { + logger.warning("**** FAILED TO BIND TO PORT!"); + logger.log(Level.WARNING, "The exception was: " + e.toString()); + logger.warning("Perhaps a server is already running on that port?"); + return false; + } + + if (!onlineMode) { + logger.warning("**** SERVER IS RUNNING IN OFFLINE/INSECURE MODE!"); + logger.warning("The server will make no attempt to authenticate usernames. Beware."); + logger.warning("While this makes the game possible to play without internet access, it also opens up the ability for hackers to connect with any username they choose."); + logger.warning("To change this, set \"online-mode\" to \"true\" in the server.settings file."); + } +#endif + setPlayers(new PlayerList(this)); + + // 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. + } + + __int64 levelNanoTime = System::nanoTime(); + + 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"); + } + + LevelType *pLevelType = LevelType::getLevelType(levelTypeString); + if (pLevelType == NULL) + { + pLevelType = LevelType::lvl_normal; + } + + ProgressRenderer *mcprogress = Minecraft::GetInstance()->progressRenderer; + mcprogress->progressStart(IDS_PROGRESS_INITIALISING_SERVER); + + if( findSeed ) + { +#ifdef __PSVITA__ + seed = BiomeSource::findSeed(pLevelType, &running); +#else + 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); + +#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; + } + + g_NetworkManager.ServerReady(); // 4J added + return m_bLoaded; + +} + +// 4J - added - extra thread to post processing on separate thread during level creation +int MinecraftServer::runPostUpdate(void* lpParam) +{ + ShutdownManager::HasStarted(ShutdownManager::ePostProcessThread); + + MinecraftServer *server = (MinecraftServer *)lpParam; + Entity::useSmallIds(); // This thread can end up spawning entities as resources + IntCache::CreateNewThreadStorage(); + AABB::CreateNewThreadStorage(); + Vec3::CreateNewThreadStorage(); + Compression::UseDefaultThreadStorage(); + Level::enableLightingCache(); + Tile::CreateNewThreadStorage(); + + // Update lights for both levels until we are signalled to terminate + do + { + EnterCriticalSection(&server->m_postProcessCS); + if( server->m_postProcessRequests.size() ) + { + MinecraftServer::postProcessRequest request = server->m_postProcessRequests.back(); + server->m_postProcessRequests.pop_back(); + LeaveCriticalSection(&server->m_postProcessCS); + static int count = 0; + PIXBeginNamedEvent(0,"Post processing %d ", (count++)%8); + request.chunkSource->postProcess(request.chunkSource, request.x, request.z ); + PIXEndNamedEvent(); + } + else + { + LeaveCriticalSection(&server->m_postProcessCS); + } + Sleep(1); + } while (!server->m_postUpdateTerminate && ShutdownManager::ShouldRun(ShutdownManager::ePostProcessThread)); + //#ifndef __PS3__ + // One final pass through updates to make sure we're done + EnterCriticalSection(&server->m_postProcessCS); + int maxRequests = server->m_postProcessRequests.size(); + while(server->m_postProcessRequests.size() && ShutdownManager::ShouldRun(ShutdownManager::ePostProcessThread) ) + { + MinecraftServer::postProcessRequest request = server->m_postProcessRequests.back(); + server->m_postProcessRequests.pop_back(); + LeaveCriticalSection(&server->m_postProcessCS); + request.chunkSource->postProcess(request.chunkSource, request.x, request.z ); +#ifdef __PS3__ +#ifndef _CONTENT_PACKAGE + if((server->m_postProcessRequests.size() % 10) == 0) + printf("processing request %00d\n", server->m_postProcessRequests.size()); +#endif + Sleep(1); +#endif + EnterCriticalSection(&server->m_postProcessCS); + } + LeaveCriticalSection(&server->m_postProcessCS); + //#endif //__PS3__ + Tile::ReleaseThreadStorage(); + IntCache::ReleaseThreadStorage(); + AABB::ReleaseThreadStorage(); + Vec3::ReleaseThreadStorage(); + Level::destroyLightingCache(); + + ShutdownManager::HasFinished(ShutdownManager::ePostProcessThread); + + return 0; +} + +void MinecraftServer::addPostProcessRequest(ChunkSource *chunkSource, int x, int z) +{ + EnterCriticalSection(&m_postProcessCS); + m_postProcessRequests.push_back(MinecraftServer::postProcessRequest(x,z,chunkSource)); + LeaveCriticalSection(&m_postProcessCS); +} + +void MinecraftServer::postProcessTerminate(ProgressRenderer *mcprogress) +{ + DWORD status = 0; + + EnterCriticalSection(&server->m_postProcessCS); + size_t postProcessItemCount = server->m_postProcessRequests.size(); + LeaveCriticalSection(&server->m_postProcessCS); + + do + { + status = m_postUpdateThread->WaitForCompletion(50); + if( status == WAIT_TIMEOUT ) + { + EnterCriticalSection(&server->m_postProcessCS); + size_t postProcessItemRemaining = server->m_postProcessRequests.size(); + LeaveCriticalSection(&server->m_postProcessCS); + + if( postProcessItemCount ) + { + mcprogress->progressStagePercentage((postProcessItemCount - postProcessItemRemaining) * 100 / postProcessItemCount); + } + CompressedTileStorage::tick(); + SparseLightStorage::tick(); + SparseDataStorage::tick(); + } + } while ( status == WAIT_TIMEOUT ); + delete m_postUpdateThread; + m_postUpdateThread = NULL; + DeleteCriticalSection(&m_postProcessCS); +} + +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); + // } + ProgressRenderer *mcprogress = Minecraft::GetInstance()->progressRenderer; + + // 4J TODO - free levels here if there are already some? + levels = ServerLevelArray(3); + + int gameTypeId = settings->getInt(L"gamemode", app.GetGameHostOption(eGameHostOption_GameType));//LevelSettings::GAMETYPE_SURVIVAL); + GameType *gameType = LevelSettings::validateGameType(gameTypeId); + app.DebugPrintf("Default game type: %d\n" , gameTypeId); + + LevelSettings *levelSettings = new LevelSettings(levelSeed, gameType, app.GetGameHostOption(eGameHostOption_Structures)>0?true:false, isHardcore(), true, pLevelType, initData->xzSize, initData->hellScale); + if( app.GetGameHostOption(eGameHostOption_BonusChest ) ) levelSettings->enableStartingBonusItems(); + + // 4J - temp - load existing level + shared_ptr storage = nullptr; + bool levelChunksNeedConverted = false; + if( initData->saveData != NULL ) + { + // We are loading a file from disk with the data passed in + +#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 ); +#endif + if(pSave->isSaveEndianDifferent()) + levelChunksNeedConverted = true; + pSave->ConvertToLocalPlatform(); // check if we need to convert this file from PS3->PS4 + + storage = shared_ptr(new McRegionLevelStorage(pSave, File(L"."), name, true)); + } + else + { + // We are loading a save from the storage manager +#ifdef SPLIT_SAVES + bool bLevelGenBaseSave = false; + LevelGenerationOptions *levelGen = app.getLevelGenerationOptions(); + if( levelGen != NULL && levelGen->requiresBaseSave()) + { + DWORD fileSize = 0; + LPVOID pvSaveData = levelGen->getBaseSaveData(fileSize); + if(pvSaveData && fileSize != 0) bLevelGenBaseSave = true; + } + ConsoleSaveFileSplit *newFormatSave = NULL; + if(bLevelGenBaseSave) + { + ConsoleSaveFileOriginal oldFormatSave( L"" ); + newFormatSave = new ConsoleSaveFileSplit( &oldFormatSave ); + } + else + { + newFormatSave = new ConsoleSaveFileSplit( L"" ); + } + + storage = shared_ptr(new McRegionLevelStorage(newFormatSave, File(L"."), name, true)); +#else + storage = shared_ptr(new McRegionLevelStorage(new ConsoleSaveFileOriginal( L"" ), File(L"."), name, true)); +#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++) + { + if( s_bServerHalted || !g_NetworkManager.IsInSession() ) + { + return false; + } + + // String levelName = name; + // if (i == 1) levelName += "_nether"; + int dimension = 0; + if (i == 1) dimension = -1; + if (i == 2) dimension = 1; + if (i == 0) + { + levels[i] = new ServerLevel(this, storage, name, dimension, levelSettings); + if(app.getLevelGenerationOptions() != NULL) + { + LevelGenerationOptions *mapOptions = app.getLevelGenerationOptions(); + Pos *spawnPos = mapOptions->getSpawnPos(); + if( spawnPos != NULL ) + { + levels[i]->setSpawnPos( spawnPos ); + } + + 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 + + // 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; + Minecraft *pMinecraft = Minecraft::GetInstance(); + // 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); +#else + levels[i]->setSpawnSettings(settings->getBoolean(L"spawn-monsters", true), animals); +#endif + levels[i]->getLevelData()->setGameType(gameType); + + if(app.getLevelGenerationOptions() != NULL) + { + LevelGenerationOptions *mapOptions = app.getLevelGenerationOptions(); + levels[i]->getLevelData()->setHasBeenInCreative(mapOptions->getLevelHasBeenInCreative() ); + } + + players->setLevel(levels); + } + + if( levels[0]->isNew ) + { + mcprogress->progressStage(IDS_PROGRESS_GENERATING_SPAWN_AREA); + } + else + { + mcprogress->progressStage(IDS_PROGRESS_LOADING_SPAWN_AREA); + } + app.SetGameHostOption( eGameHostOption_HasBeenInCreative, gameType == GameType::CREATIVE || levels[0]->getHasBeenInCreative() ); + app.SetGameHostOption( eGameHostOption_Structures, levels[0]->isGenerateMapFeatures() ); + + if( s_bServerHalted || !g_NetworkManager.IsInSession() ) return false; + + // 4J - Make a new thread to do post processing + InitializeCriticalSection(&m_postProcessCS); + + // 4J-PB - fix for 108310 - TCR #001 BAS Game Stability: TU12: Code: Compliance: Crash after creating world on "journey" seed. + // Stack gets very deep with some sand tower falling, so increased the stacj to 256K from 128k on other platforms (was already set to that on PS3 and Orbis) + + m_postUpdateThread = new C4JThread(runPostUpdate, this, "Post processing", 256*1024); + + m_postUpdateTerminate = false; + m_postUpdateThread->SetProcessor(CPU_CORE_POST_PROCESSING); + m_postUpdateThread->SetPriority(THREAD_PRIORITY_ABOVE_NORMAL); + m_postUpdateThread->Run(); + + __int64 startTime = System::currentTimeMillis(); + + // 4J Stu - Added this to temporarily make starting games on vita faster +#ifdef __PSVITA__ + int r = 48; +#else + int r = 196; +#endif + + // 4J JEV: load gameRules. + ConsoleSavePath filepath(GAME_RULE_SAVENAME); + ConsoleSaveFile *csf = getLevel(0)->getLevelStorage()->getSaveFile(); + if( csf->doesFileExist(filepath) ) + { + DWORD numberOfBytesRead; + byteArray ba_gameRules; + + FileEntry *fe = csf->createFile(filepath); + + ba_gameRules.length = fe->getFileSize(); + ba_gameRules.data = new BYTE[ ba_gameRules.length ]; + + csf->setFilePointer(fe,0,NULL,FILE_BEGIN); + csf->readFile(fe, ba_gameRules.data, ba_gameRules.length, &numberOfBytesRead); + assert(numberOfBytesRead == ba_gameRules.length); + + app.m_gameRules.loadGameRules(ba_gameRules.data, ba_gameRules.length); + csf->closeHandle(fe); + } + + __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++) + { + // logger.info("Preparing start region for level " + i); + if (i == 0 || settings->getBoolean(L"allow-nether", true)) + { + ServerLevel *level = levels[i]; + if(levelChunksNeedConverted) + { + // storage->getSaveFile()->convertLevelChunks(level) + } + +#if 0 + __int64 lastStorageTickTime = System::currentTimeMillis(); + + // Test code to enable full creation of levels at start up + int halfsidelen = ( i == 0 ) ? 27 : 9; + for( int x = -halfsidelen; x < halfsidelen; x++ ) + { + for( int z = -halfsidelen; z < halfsidelen; z++ ) + { + int total = halfsidelen * halfsidelen * 4; + int pos = z + halfsidelen + ( ( x + halfsidelen ) * 2 * halfsidelen ); + mcprogress->progressStagePercentage((pos) * 100 / total); + level->cache->create(x,z, true); // 4J - added parameter to disable postprocessing here + + if( System::currentTimeMillis() - lastStorageTickTime > 50 ) + { + CompressedTileStorage::tick(); + SparseLightStorage::tick(); + SparseDataStorage::tick(); + lastStorageTickTime = System::currentTimeMillis(); + } + } + } +#else + __int64 lastStorageTickTime = System::currentTimeMillis(); + Pos *spawnPos = level->getSharedSpawnPos(); + + int twoRPlusOne = r*2 + 1; + int total = twoRPlusOne * twoRPlusOne; + for (int x = -r; x <= r && running; x += 16) + { + for (int z = -r; z <= r && running; z += 16) + { + if( s_bServerHalted || !g_NetworkManager.IsInSession() ) + { + delete spawnPos; + m_postUpdateTerminate = true; + 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) + { + int pos = (x + r) * twoRPlusOne + (z + 1); + // setProgress(L"Preparing spawn area", (pos) * 100 / total); + mcprogress->progressStagePercentage((pos+r) * 100 / total); + // 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 + PIXEndNamedEvent(); + // while (level->updateLights() && running) + // ; + if( System::currentTimeMillis() - lastStorageTickTime > 50 ) + { + CompressedTileStorage::tick(); + SparseLightStorage::tick(); + 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 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); + PIXEndNamedEvent(); + } + } +#endif + + delete spawnPos; +#endif + } + } + // 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; + + postProcessTerminate(mcprogress); + + + // stronghold position? + if(levels[0]->dimension->id==0) + { + + app.DebugPrintf("===================================\n"); + + if(!levels[0]->getLevelData()->getHasStronghold()) + { + int x,z; + if(app.GetTerrainFeaturePosition(eTerrainFeature_Stronghold,&x,&z)) + { + levels[0]->getLevelData()->setXStronghold(x); + levels[0]->getLevelData()->setZStronghold(z); + levels[0]->getLevelData()->setHasStronghold(); + + app.DebugPrintf("=== FOUND stronghold in terrain features list\n"); + + } + else + { + // can't find the stronghold position in the terrain feature list. Do we have to run a post-process? + app.DebugPrintf("=== Can't find stronghold in terrain features list\n"); + } + } + else + { + app.DebugPrintf("=== Leveldata has stronghold position\n"); + } + app.DebugPrintf("===================================\n"); + } + + // printf("Post processing 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); + } + + if( s_bServerHalted || !g_NetworkManager.IsInSession() ) return false; + + if( levels[2]->isNew ) + { + levels[2]->save(true, mcprogress); + } + + if( s_bServerHalted || !g_NetworkManager.IsInSession() ) return false; + + // 4J - added - immediately save newly created level, like single player game + // 4J Stu - We also want to immediately save the tutorial + if ( levels[0]->isNew ) + saveGameRules(); + + if( levels[0]->isNew ) + { + levels[0]->save(true, mcprogress); + } + + if( s_bServerHalted || !g_NetworkManager.IsInSession() ) return false; + + if( levels[0]->isNew || levels[1]->isNew || levels[2]->isNew ) + { + levels[0]->saveToDisc(mcprogress, false); + } + + 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(); + + 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 + "%"); +} + +void MinecraftServer::endProgress() +{ + progressStatus = L""; + this->progress = 0; +} + +void MinecraftServer::saveAllChunks() +{ + // 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 + if( m_bPrimaryPlayerSignedOut ) break; +#endif + // 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]; + 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); + + // Only close the level storage when we have saved the last level, otherwise we need to recreate the region files + // when saving the next levels + if( i == (levels.length - 1)) + { + level->closeLevelStorage(); + } + } + } +} + +// 4J-JEV: Added +void MinecraftServer::saveGameRules() +{ +#ifndef _CONTENT_PACKAGE + if(app.DebugSettingsOn() && app.GetGameSettingsDebugMask(ProfileManager.GetPrimaryPad())&(1L<getLevelStorage()->getSaveFile(); + FileEntry *fe = csf->createFile(ConsoleSavePath(GAME_RULE_SAVENAME)); + csf->setFilePointer(fe, 0, NULL, FILE_BEGIN); + DWORD length; + csf->writeFile(fe, ba.data, ba.length, &length ); + + delete [] ba.data; + + csf->closeHandle(fe); + } + } +} + +void MinecraftServer::Suspend() +{ + PIXBeginNamedEvent(0,"Suspending server"); + m_suspending = true; + // 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; + // Save the start time + QueryPerformanceCounter( &qwTime ); + if(m_bLoaded && ProfileManager.IsFullVersion() && (!StorageManager.GetSaveDisabled())) + { + if (players != NULL) + { + players->saveAll(NULL); + } + for (unsigned int j = 0; j < levels.length; j++) + { + if( s_bServerHalted ) break; + // 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 - j]; + level->Suspend(); + } + if( !s_bServerHalted ) + { + saveGameRules(); + levels[0]->saveToDisc(NULL, true); + } + } + QueryPerformanceCounter( &qwNewTime ); + + qwDeltaTime.QuadPart = qwNewTime.QuadPart - qwTime.QuadPart; + fElapsedTime = fSecsPerTick * ((FLOAT)(qwDeltaTime.QuadPart)); + + // 4J-JEV: Flush stats and call PlayerSessionExit. + for (int iPad = 0; iPad < XUSER_MAX_COUNT; iPad++) + { + if (ProfileManager.IsSignedIn(iPad)) + { + TelemetryManager->RecordPlayerSessionExit(iPad, DisconnectPacket::eDisconnect_Quitting); + } + } + + m_suspending = false; + app.DebugPrintf("Suspend server: Elapsed time %f\n", fElapsedTime); + PIXEndNamedEvent(); +} + +bool MinecraftServer::IsSuspending() +{ + return m_suspending; +} + +void MinecraftServer::stopServer(bool didInit) +{ + + // 4J-PB - need to halt the rendering of the data, since we're about to remove it +#ifdef __PS3__ + if( ShutdownManager::ShouldRun(ShutdownManager::eServerThread ) ) // This thread will take itself out if we are shutting down +#endif + { + Minecraft::GetInstance()->gameRenderer->DisableUpdateThread(); + } + + connection->stop(); + + app.DebugPrintf("Stopping server\n"); + // logger.info("Stopping server"); + // 4J-PB - If the primary player has signed out, then don't attempt to save anything + + // also need to check for a profile switch here - primary player signs out, and another player signs in before dismissing the dash +#ifdef _DURANGO + // On Durango check if the primary user is signed in OR mid-sign-out + if(ProfileManager.GetUser(0, true) != nullptr) +#else + if((m_bPrimaryPlayerSignedOut==false) && ProfileManager.IsSignedIn(ProfileManager.GetPrimaryPad())) +#endif + { +#if defined(_XBOX_ONE) || defined(__ORBIS__) + // 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. 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) + { + players->saveAll(Minecraft::GetInstance()->progressRenderer, true); + } + // 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. + //for (unsigned int i = levels.length - 1; i >= 0; i--) + //{ + // ServerLevel *level = levels[i]; + // if (level != NULL) + // { + saveAllChunks(); + // } + //} + + saveGameRules(); + app.m_gameRules.unloadCurrentGameRules(); + if( levels[0] != NULL ) // This can be null if stopServer happens very quickly due to network error + { + levels[0]->saveToDisc(Minecraft::GetInstance()->progressRenderer, false); + } + } + } + // reset the primary player signout flag + m_bPrimaryPlayerSignedOut=false; + s_bServerHalted = false; + + // On Durango/Orbis, we need to wait for all the asynchronous saving processes to complete before destroying the levels, as that will ultimately delete + // the directory level storage & therefore the ConsoleSaveSplit instance, which needs to be around until all the sub files have completed saving. +#if defined(_DURANGO) || defined(__ORBIS__) || defined(__PSVITA__) + while(StorageManager.GetSaveState() != C4JStorage::ESaveGame_Idle ) + { + Sleep(10); + } +#endif + + // 4J-PB remove the server levels + unsigned int iServerLevelC=levels.length; + for (unsigned int i = 0; i < iServerLevelC; i++) + { + if(levels[i]!=NULL) + { + delete levels[i]; + levels[i] = NULL; + } + } + +#if defined(__PS3__) || defined(__ORBIS__) + // Clear the update flags as it's possible they could be out of sync, causing a crash when starting a new world after the first new level ticks + // Fix for PS3 #1538 - [IN GAME] If the user 'Exit without saving' from inside the Nether or The End, the title can hang when loading back into the save. +#endif + + delete connection; + connection = NULL; + delete players; + players = NULL; + delete settings; + settings = NULL; + + g_NetworkManager.ServerStopped(); +} + +void MinecraftServer::halt() +{ + running = false; +} + +void MinecraftServer::setMaxBuildHeight(int maxBuildHeight) +{ + this->maxBuildHeight = maxBuildHeight; +} + +int MinecraftServer::getMaxBuildHeight() +{ + return maxBuildHeight; +} + +PlayerList *MinecraftServer::getPlayers() +{ + return players; +} + +void MinecraftServer::setPlayers(PlayerList *players) +{ + this->players = players; +} + +ServerConnection *MinecraftServer::getConnection() +{ + return connection; +} + +bool MinecraftServer::isAnimals() +{ + return animals; +} + +void MinecraftServer::setAnimals(bool animals) +{ + this->animals = animals; +} + +bool MinecraftServer::isNpcsEnabled() +{ + return npcs; +} + +void MinecraftServer::setNpcsEnabled(bool npcs) +{ + this->npcs = npcs; +} + +bool MinecraftServer::isPvpAllowed() +{ + return pvp; +} + +void MinecraftServer::setPvpAllowed(bool pvp) +{ + this->pvp = pvp; +} + +bool MinecraftServer::isFlightAllowed() +{ + return allowFlight; +} + +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); +} + +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) +{ + NetworkGameInitData *initData = NULL; + DWORD initSettings = 0; + bool findSeed = false; + if(lpParameter != NULL) + { + initData = (NetworkGameInitData *)lpParameter; + initSettings = app.GetGameHostOption(eGameHostOption_All); + findSeed = initData->findSeed; + m_texturePackId = initData->texturePackId; + } + // 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(); + LevelData *pLevelData=levelNormalDimension->getLevelData(); + + if(pLevelData && pLevelData->getHasStronghold()==false) + { + int x,z; + if(app.GetTerrainFeaturePosition(eTerrainFeature_Stronghold,&x,&z)) + { + pLevelData->setXStronghold(x); + pLevelData->setZStronghold(z); + pLevelData->setHasStronghold(); + } + } + + __int64 lastTime = getCurrentTimeMillis(); + __int64 unprocessedTime = 0; + while (running && !s_bServerHalted) + { + __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) + { + // 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; + + // 4J Added ability to pause the server + if( !m_isServerPaused ) + { + bool didTick = false; + if (levels[0]->allPlayersAreSleeping()) + { + tick(); + unprocessedTime = 0; + } + else + { + // 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)); + + chunkPacketManagement_PostTick(); + } +// __int64 afterall = System::currentTimeMillis(); +// PIXReportCounter(L"Server time all",(float)(afterall-beforeall)); +// PIXReportCounter(L"Server ticks",(float)tickcount); + } + } + else + { + // 4J Stu - TU1-hotfix + //Fix for #13191 - The host of a game can get a message informing them that the connection to the server has been lost + // The connections should tick at the same frequency even when paused + while (unprocessedTime > MS_PER_TICK) + { + unprocessedTime -= MS_PER_TICK; + // Keep ticking the connections to stop them timing out + connection->tick(); + } + } + if(MinecraftServer::setTimeAtEndOfTick) + { + MinecraftServer::setTimeAtEndOfTick = false; + for (unsigned int i = 0; i < levels.length; i++) + { + // if (i == 0 || settings->getBoolean(L"allow-nether", true)) // 4J removed - we always have nether + { + ServerLevel *level = levels[i]; + level->setGameTime( MinecraftServer::setTime ); + } + } + } + if(MinecraftServer::setTimeOfDayAtEndOfTick) + { + MinecraftServer::setTimeOfDayAtEndOfTick = false; + for (unsigned int i = 0; i < levels.length; i++) + { + if (i == 0 || settings->getBoolean(L"allow-nether", true)) + { + ServerLevel *level = levels[i]; + level->setDayTime( MinecraftServer::setTimeOfDay ); + } + } + } + + // Process delayed actions + eXuiServerAction eAction; + LPVOID param; + for(int i=0;isaveAll(NULL); + } + + for (unsigned int j = 0; j < levels.length; j++) + { + if( s_bServerHalted ) break; + // 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 - j]; + PIXBeginNamedEvent(0, "Saving level %d",levels.length - 1 - j); + level->save(false, NULL, true); + PIXEndNamedEvent(); + } + if( !s_bServerHalted ) + { + PIXBeginNamedEvent(0,"Saving game rules"); + saveGameRules(); + PIXEndNamedEvent(); + + PIXBeginNamedEvent(0,"Save to disc"); + levels[0]->saveToDisc(Minecraft::GetInstance()->progressRenderer, true); + PIXEndNamedEvent(); + } + PIXEndNamedEvent(); + + QueryPerformanceCounter( &qwNewTime ); + qwDeltaTime.QuadPart = qwNewTime.QuadPart - qwTime.QuadPart; + fElapsedTime = fSecsPerTick * ((FLOAT)(qwDeltaTime.QuadPart)); + app.DebugPrintf("Autosave: Elapsed time %f\n", fElapsedTime); + } + break; +#endif + case eXuiServerAction_SaveGame: + app.EnterSaveNotificationSection(); + if (players != NULL) + { + players->saveAll(Minecraft::GetInstance()->progressRenderer); + } + + players->broadcastAll( shared_ptr( new UpdateProgressPacket(20) ) ); + + for (unsigned int j = 0; j < levels.length; j++) + { + if( s_bServerHalted ) break; + // 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 - j]; + level->save(true, Minecraft::GetInstance()->progressRenderer, (eAction==eXuiServerAction_AutoSaveGame)); + + players->broadcastAll( shared_ptr( new UpdateProgressPacket(33 + (j*33) ) ) ); + } + if( !s_bServerHalted ) + { + saveGameRules(); + + levels[0]->saveToDisc(Minecraft::GetInstance()->progressRenderer, (eAction==eXuiServerAction_AutoSaveGame)); + } + app.LeaveSaveNotificationSection(); + break; + 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 ) ) ); + } + 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); + } + break; + case eXuiServerAction_PauseServer: + m_isServerPaused = ( (size_t) param == TRUE ); + if( m_isServerPaused ) + { + m_serverPausedEvent->Set(); + } + break; + case eXuiServerAction_ToggleRain: + { + bool isRaining = levels[0]->getLevelData()->isRaining(); + levels[0]->getLevelData()->setRaining(!isRaining); + levels[0]->getLevelData()->setRainTime(levels[0]->random->nextInt(Level::TICKS_PER_DAY * 7) + Level::TICKS_PER_DAY / 2); + } + break; + case eXuiServerAction_ToggleThunder: + { + bool isThundering = levels[0]->getLevelData()->isThundering(); + levels[0]->getLevelData()->setThundering(!isThundering); + levels[0]->getLevelData()->setThunderTime(levels[0]->random->nextInt(Level::TICKS_PER_DAY * 7) + Level::TICKS_PER_DAY / 2); + } + break; + case eXuiServerAction_ServerSettingChanged_Gamertags: + players->broadcastAll( shared_ptr( new ServerSettingsChangedPacket( ServerSettingsChangedPacket::HOST_OPTIONS, app.GetGameHostOption(eGameHostOption_Gamertags)) ) ); + break; + case eXuiServerAction_ServerSettingChanged_BedrockFog: + players->broadcastAll( shared_ptr( new ServerSettingsChangedPacket( ServerSettingsChangedPacket::HOST_IN_GAME_SETTINGS, app.GetGameHostOption(eGameHostOption_All)) ) ); + break; + + case eXuiServerAction_ServerSettingChanged_Difficulty: + players->broadcastAll( shared_ptr( new ServerSettingsChangedPacket( ServerSettingsChangedPacket::HOST_DIFFICULTY, Minecraft::GetInstance()->options->difficulty) ) ); + break; + case eXuiServerAction_ExportSchematic: +#ifndef _CONTENT_PACKAGE + app.EnterSaveNotificationSection(); + + //players->broadcastAll( shared_ptr( new UpdateProgressPacket(20) ) ); + + if( !s_bServerHalted ) + { + ConsoleSchematicFile::XboxSchematicInitParam *initData = (ConsoleSchematicFile::XboxSchematicInitParam *)param; +#ifdef _XBOX + File targetFileDir(File::pathRoot + File::pathSeparator + L"Schematics"); +#else + File targetFileDir(L"Schematics"); +#endif + if(!targetFileDir.exists()) targetFileDir.mkdir(); + + wchar_t filename[128]; + swprintf(filename,128,L"%ls%dx%dx%d.sch",initData->name,(initData->endX - initData->startX + 1), (initData->endY - initData->startY + 1), (initData->endZ - initData->startZ + 1)); + + File dataFile = File( targetFileDir, wstring(filename) ); + if(dataFile.exists()) dataFile._delete(); + FileOutputStream fos = FileOutputStream(dataFile); + DataOutputStream dos = DataOutputStream(&fos); + ConsoleSchematicFile::generateSchematicFile(&dos, levels[0], initData->startX, initData->startY, initData->startZ, initData->endX, initData->endY, initData->endZ, initData->bSaveMobs, initData->compressionType); + dos.close(); + + delete initData; + } + app.LeaveSaveNotificationSection(); +#endif + break; + case eXuiServerAction_SetCameraLocation: +#ifndef _CONTENT_PACKAGE + { + DebugSetCameraPosition *pos = (DebugSetCameraPosition *)param; + + 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 + ); + + 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 ); + + // Doesn't work + //player->setYHeadRot(pos->m_yRot); + //player->absMoveTo(pos->m_camX, pos->m_camY, pos->m_camZ, pos->m_yRot, pos->m_elev); + } +#endif + break; + } + + app.SetXuiServerAction(i,eXuiServerAction_Idle); + } + + Sleep(1); + } + } + //else + //{ + // while (running) + // { + // 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(); + } finally { + System::exit(0); + } +} +#endif + + // 4J Stu - Stop the server when the loops complete, as the finally would do + stopServer(didInit); + stopped = true; +} + +void MinecraftServer::broadcastStartSavingPacket() +{ + players->broadcastAll( shared_ptr( new GameEventPacket(GameEventPacket::START_SAVING, 0) ) );; +} + +void MinecraftServer::broadcastStopSavingPacket() +{ + if( !s_bServerHalted ) + { + players->broadcastAll( shared_ptr( new GameEventPacket(GameEventPacket::STOP_SAVING, 0) ) );; + } +} + +void MinecraftServer::tick() +{ + vector toRemove; + for (AUTO_VAR(it, ironTimers.begin()); it != ironTimers.end(); it++ ) + { + int t = it->second; + if (t > 0) + { + ironTimers[it->first] = t - 1; + } + else + { + toRemove.push_back(it->first); + } + } + for (unsigned int i = 0; i < toRemove.size(); i++) + { + ironTimers.erase(toRemove[i]); + } + + 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) + { + 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++) + { + // if (i == 0 || settings->getBoolean(L"allow-nether", true)) // 4J removed - we always have nether + { + 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; + +#if DEBUG_SERVER_DONT_SPAWN_MOBS + level->setSpawnSettings(false, false); +#else + level->setSpawnSettings(level->difficulty > 0 && !Minecraft::GetInstance()->isTutorial(), animals); +#endif + + if (tickCount % 20 == 0) + { + 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(); + __int64 st1 = System::currentTimeMillis(); + PIXEndNamedEvent(); + PIXBeginNamedEvent(0,"Update lights %d",i); + + __int64 st2 = System::currentTimeMillis(); + PIXEndNamedEvent(); + PIXBeginNamedEvent(0,"Entity tick %d",i); + // 4J added to stop ticking entities in levels when players are not in those levels. + // Note: now changed so that we also tick if there are entities to be removed, as this also happens as a result of calling tickEntities. If we don't do this, then the + // entities get removed at the first point that there is a player count in the level - this has been causing a problem when going from normal dimension -> nether -> normal, + // as the player is getting flagged as to be removed (from the normal dimension) when going to the nether, but Actually gets removed only when it returns + if( ( players->getPlayerCount(level) > 0) || ( level->hasEntitiesToRemove() ) ) + { +#ifdef __PSVITA__ + // AP - the PlayerList->viewDistance initially starts out at 3 to make starting a level speedy + // the problem with this is that spawned monsters are always generated on the edge of the known map + // which means they wont process (unless they are surrounded by 2 visible chunks). This means + // they wont checkDespawn so they are NEVER removed which results in monsters not spawning. + // This bit of hack will modify the view distance once the level is up and running. + int newViewDistance = 5; + level->getServer()->getPlayers()->setViewDistance(newViewDistance); + level->getTracker()->updateMaxRange(); + level->getChunkMap()->setRadius(level->getServer()->getPlayers()->getViewDistance()); +#endif + level->tickEntities(); + } + PIXEndNamedEvent(); + + PIXBeginNamedEvent(0,"Entity tracker tick"); + level->getTracker()->tick(); + PIXEndNamedEvent(); + + __int64 st3 = System::currentTimeMillis(); + // printf(">>>>>>>>>>>>>>>>>>>>>> Tick %d %d %d : %d\n", st1 - st0, st2 - st1, st3 - st2, st0 - stc ); + stc = st0; + // #endif// __PS3__ + } + } + Entity::tickExtraWandering(); // 4J added + + PIXBeginNamedEvent(0,"Connection tick"); + connection->tick(); + PIXEndNamedEvent(); + PIXBeginNamedEvent(0,"Players tick"); + players->tick(); + PIXEndNamedEvent(); + + // 4J - removed +#if 0 + 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); + // } +} + +void MinecraftServer::handleConsoleInput(const wstring& msg, ConsoleInputSource *source) +{ + consoleInput.push_back(new ConsoleInput(msg, source)); +} + +void MinecraftServer::handleConsoleInputs() +{ + while (consoleInput.size() > 0) + { + AUTO_VAR(it, consoleInput.begin()); + ConsoleInput *input = *it; + consoleInput.erase(it); + // commands->handleCommand(input); // 4J - removed - TODO - do we want equivalent of console commands? + } +} + +void MinecraftServer::main(__int64 seed, void *lpParameter) +{ +#if __PS3__ + ShutdownManager::HasStarted(ShutdownManager::eServerThread ); +#endif + server = new MinecraftServer(); + server->run(seed, lpParameter); + delete server; + server = NULL; + ShutdownManager::HasFinished(ShutdownManager::eServerThread ); +} + +void MinecraftServer::HaltServer(bool bPrimaryPlayerSignedOut) +{ + s_bServerHalted = true; + if( server != NULL ) + { + m_bPrimaryPlayerSignedOut=bPrimaryPlayerSignedOut; + server->halt(); + } +} + +File *MinecraftServer::getFile(const wstring& name) +{ + return new File(name); +} + +void MinecraftServer::info(const wstring& string) +{ +} + +void MinecraftServer::warn(const wstring& string) +{ +} + +wstring MinecraftServer::getConsoleName() +{ + return L"CONSOLE"; +} + +ServerLevel *MinecraftServer::getLevel(int dimension) +{ + if (dimension == -1) return levels[1]; + else if (dimension == 1) return levels[2]; + else return levels[0]; +} + +// 4J added +void MinecraftServer::setLevel(int dimension, ServerLevel *level) +{ + if (dimension == -1) levels[1] = level; + else if (dimension == 1) levels[2] = 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::chunkPacketManagement_CanSendTo(INetworkPlayer *player) +{ + if( player == NULL ) return false; + + int time = GetTickCount(); + if( player->GetSessionIndex() == s_slowQueuePlayerIndex && (time - s_slowQueueLastTime) > MINECRAFT_SERVER_SLOW_QUEUE_DELAY ) + { +// app.DebugPrintf("Slow queue OK for player #%d\n", player->GetSessionIndex()); + return true; + } + + 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; + + int startingIndex = s_slowQueuePlayerIndex; + INetworkPlayer *currentPlayer = NULL; + DWORD currentPlayerCount = 0; + do + { + currentPlayerCount = g_NetworkManager.GetPlayerCount(); + if( startingIndex >= currentPlayerCount ) startingIndex = 0; + ++s_slowQueuePlayerIndex; + + if( currentPlayerCount > 0 ) + { + s_slowQueuePlayerIndex %= currentPlayerCount; + // Fix for #9530 - NETWORKING: Attempting to fill a multiplayer game beyond capacity results in a softlock for the last players to join. + // The QNet session might be ending while we do this, so do a few more checks that the player is real + currentPlayer = g_NetworkManager.GetPlayerByIndex( s_slowQueuePlayerIndex ); + } + else + { + s_slowQueuePlayerIndex = 0; + } + } while ( g_NetworkManager.IsInSession() && + currentPlayerCount > 0 && + s_slowQueuePlayerIndex != startingIndex && + currentPlayer != NULL && + currentPlayer->IsLocal() + ); +// 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 +// and nothing is set up. +bool MinecraftServer::flagEntitiesToBeRemoved(unsigned int *flags) +{ + bool removedFound = false; + for( unsigned int i = 0; i < levels.length; i++ ) + { + ServerLevel *level = levels[i]; + if( level ) + { + level->flagEntitiesToBeRemoved( flags, &removedFound ); + } + } + return removedFound; +} diff --git a/Minecraft.Client/MinecraftServer.h b/Minecraft.Client/MinecraftServer.h new file mode 100644 index 00000000..5f33fa85 --- /dev/null +++ b/Minecraft.Client/MinecraftServer.h @@ -0,0 +1,277 @@ +#pragma once +#include "ConsoleInputSource.h" +#include "..\Minecraft.World\ArrayWithLength.h" +#include "..\Minecraft.World\SharedConstants.h" +#include "..\Minecraft.World\C4JThread.h" + +class ServerConnection; +class Settings; +class PlayerList; +class EntityTracker; +class ConsoleInput; +class ConsoleCommands; +class LevelStorageSource; +class ChunkSource; +class INetworkPlayer; +class LevelRuleset; +class LevelType; +class ProgressRenderer; +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; + __int64 fileSize; + const wstring saveName; + _LoadSaveDataThreadParam(LPVOID data, __int64 filesize, const wstring &saveName) : data( data ), fileSize( filesize ), saveName( saveName ) {} +} LoadSaveDataThreadParam; + +typedef struct _NetworkGameInitData +{ + __int64 seed; + LoadSaveDataThreadParam *saveData; + DWORD settings; + LevelGenerationOptions *levelGen; + DWORD texturePackId; + bool findSeed; + unsigned int xzSize; + unsigned char hellScale; + ESavePlatform savePlatform; + + _NetworkGameInitData() + { + seed = 0; + saveData = NULL; + settings = 0; + levelGen = NULL; + texturePackId = 0; + findSeed = false; + xzSize = LEVEL_LEGACY_WIDTH; + hellScale = HELL_LEVEL_LEGACY_SCALE; + savePlatform = SAVE_FILE_PLATFORM_LOCAL; + } +} NetworkGameInitData; + +using namespace std; + +// 4J Stu - 1.0.1 updates the server to implement the ServerInterface class, but I don't think we will use any of the functions that defines so not implementing here +class MinecraftServer : public ConsoleInputSource +{ +public: + static const wstring VERSION; + static const int TICK_STATS_SPAN = SharedConstants::TICKS_PER_SECOND * 5; + +// static Logger logger = Logger.getLogger("Minecraft"); + static unordered_map ironTimers; + +private: + static const int DEFAULT_MINECRAFT_PORT = 25565; + static const int MS_PER_TICK = 1000 / SharedConstants::TICKS_PER_SECOND; + + // 4J Stu - Added 1.0.1, Not needed + //wstring localIp; + //int port; +public: + ServerConnection *connection; + Settings *settings; + ServerLevelArray levels; + +private: + PlayerList *players; + + // 4J Stu - Added 1.0.1, Not needed + //long[] tickTimes = new long[TICK_STATS_SPAN]; + //long[][] levelTickTimes; +private: + ConsoleCommands *commands; + bool running; + bool m_bLoaded; +public: + bool stopped; + int tickCount; + +public: + wstring progressStatus; + int progress; +private: +// vector tickables = new ArrayList(); // 4J - removed + CommandDispatcher *commandDispatcher; + vector consoleInput; // 4J - was synchronizedList - TODO - investigate +public: + bool onlineMode; + bool animals; + bool npcs; + bool pvp; + bool allowFlight; + wstring motd; + int maxBuildHeight; + int playerIdleTimeout; + bool forceGameType; + +private: + // 4J Added + //int m_lastSentDifficulty; + +public: + // 4J Stu - This value should be incremented every time the list of players with friends-only UGC settings changes + // It is sent with PreLoginPacket and compared when it comes back in the LoginPacket + DWORD m_ugcPlayersVersion; + + // This value is used to store the texture pack id for the currently loaded world + DWORD m_texturePackId; + +public: + MinecraftServer(); + ~MinecraftServer(); +private: + // 4J Added - LoadSaveDataThreadParam + bool initServer(__int64 seed, NetworkGameInitData *initData, DWORD initSettings, bool findSeed); + void postProcessTerminate(ProgressRenderer *mcprogress); + bool loadLevel(LevelStorageSource *storageSource, const wstring& name, __int64 levelSeed, LevelType *pLevelType, NetworkGameInitData *initData); + void setProgress(const wstring& status, int progress); + void endProgress(); + void saveAllChunks(); + void saveGameRules(); + 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(); + PlayerList *getPlayers(); + void setPlayers(PlayerList *players); + ServerConnection *getConnection(); + bool isAnimals(); + void setAnimals(bool animals); + bool isNpcsEnabled(); + void setNpcsEnabled(bool npcs); + bool isPvpAllowed(); + 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(); + void run(__int64 seed, void *lpParameter); + + void broadcastStartSavingPacket(); + void broadcastStopSavingPacket(); + +private: + void tick(); +public: + void handleConsoleInput(const wstring& msg, ConsoleInputSource *source); + void handleConsoleInputs(); +// void addTickable(Tickable tickable); // 4J removed + static void main(__int64 seed, void *lpParameter); + static void HaltServer(bool bPrimaryPlayerSignedOut=false); + + File *getFile(const wstring& name); + void info(const wstring& string); + void warn(const wstring& string); + wstring getConsoleName(); + ServerLevel *getLevel(int dimension); + void setLevel(int dimension, ServerLevel *level); // 4J added + static MinecraftServer *getInstance() { return server; } // 4J added + static bool serverHalted() { return s_bServerHalted; } + static bool saveOnExitAnswered() { return s_bSaveOnExitAnswered; } + static void resetFlags() { s_bServerHalted = false; s_bSaveOnExitAnswered = false; } + + bool flagEntitiesToBeRemoved(unsigned int *flags); // 4J added +private: + //4J Added + static MinecraftServer *server; + + static bool setTimeOfDayAtEndOfTick; + static __int64 setTimeOfDay; + static bool setTimeAtEndOfTick; + static __int64 setTime; + + static bool m_bPrimaryPlayerSignedOut; // 4J-PB added to tell the stopserver not to save the game - another player may have signed in in their place, so ProfileManager.IsSignedIn isn't enough + static bool s_bServerHalted; // 4J Stu Added so that we can halt the server even before it's been created properly + static bool s_bSaveOnExitAnswered; // 4J Stu Added so that we only ask this question once when we exit + + // 4J - added so that we can have a separate thread for post processing chunks on level creation + static int runPostUpdate(void* lpParam); + C4JThread* m_postUpdateThread; + bool m_postUpdateTerminate; + class postProcessRequest + { + public: + int x, z; + ChunkSource *chunkSource; + postProcessRequest(int x, int z, ChunkSource *chunkSource) : x(x), z(z), chunkSource(chunkSource) {} + }; + vector m_postProcessRequests; + CRITICAL_SECTION m_postProcessCS; +public: + void addPostProcessRequest(ChunkSource *chunkSource, int x, int z); + +public: + static PlayerList *getPlayerList() { if( server != NULL ) return server->players; else return NULL; } + static void SetTimeOfDay(__int64 time) { setTimeOfDayAtEndOfTick = true; setTimeOfDay = time; } + static void SetTime(__int64 time) { setTimeAtEndOfTick = true; setTime = time; } + + C4JThread::Event* m_serverPausedEvent; +private: + // 4J Added + 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; + static bool s_slowQueuePacketSent; +#endif + + bool IsServerPaused() { return m_isServerPaused; } + +private: + // 4J Added + bool m_saveOnExit; + bool m_suspending; + +public: + 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(); + bool IsSuspending(); + + // 4J Stu - A load of functions were all added in 1.0.1 in the ServerInterface, but I don't think we need any of them +}; diff --git a/Minecraft.Client/Minimap.cpp b/Minecraft.Client/Minimap.cpp new file mode 100644 index 00000000..c18cd267 --- /dev/null +++ b/Minecraft.Client/Minimap.cpp @@ -0,0 +1,262 @@ +#include "stdafx.h" +#include "Minecraft.h" +#include "Minimap.h" +#include "Font.h" +#include "Options.h" +#include "Textures.h" +#include "Tesselator.h" +#include "..\Minecraft.World\net.minecraft.world.level.saveddata.h" +#include "..\Minecraft.World\net.minecraft.world.level.material.h" + +#ifdef __ORBIS__ +short Minimap::LUT[256]; // 4J added +#else +int Minimap::LUT[256]; // 4J added +#endif +bool Minimap::genLUT = true; // 4J added + +Minimap::Minimap(Font *font, Options *options, Textures *textures, bool optimised) +{ +#ifdef __PS3__ + // we're using the RSX now to upload textures to vram, so we need the main ram textures allocated from io space + this->pixels = intArray((int*)RenderManager.allocIOMem(w*h*sizeof(int)), 16*16); + +#elif defined __ORBIS__ + this->pixels = shortArray(w*h); +#else + this->pixels = intArray(w*h); +#endif + this->options = options; + this->font = font; + BufferedImage *img = new BufferedImage(w, h, BufferedImage::TYPE_INT_ARGB); +#ifdef __ORBIS__ + mapTexture = textures->getTexture(img, C4JRender::TEXTURE_FORMAT_RxGyBzAw5551, false ); // 4J - make sure we aren't mipmapping as we never set the data for mipmaps +#else + mapTexture = textures->getTexture(img, C4JRender::TEXTURE_FORMAT_RxGyBzAw, false ); // 4J - make sure we aren't mipmapping as we never set the data for mipmaps +#endif + delete img; + for (int i = 0; i < w * h; i++) + { + pixels[i] = 0x00000000; + } + + // 4J added - generate the colour mapping that we'll be needing as a LUT to minimise processing we actually need to do during normal rendering + if( genLUT ) + { + reloadColours(); + } + renderCount = 0; // 4J added + m_optimised = optimised; +} + +void Minimap::reloadColours() +{ + ColourTable *colourTable = Minecraft::GetInstance()->getColourTable(); + // 4J note that this code has been extracted pretty much as it was in Minimap::render, although with some byte order changes + for( int i = 0; i < (14 * 4); i++ ) // 14 material colours currently, 4 brightnesses of each + { + if (i / 4 == 0) + { + // 4J - changed byte order to save having to reorder later +#ifdef __ORBIS__ + LUT[i] = 0; +#else + LUT[i] = (((i + i / w) & 1) * 8 + 16); +#endif + //pixels[i] = (((i + i / w) & 1) * 8 + 16) << 24; + } + else + { + int color = colourTable->getColor( MaterialColor::colors[i / 4]->col ); + int brightness = i & 3; + + int br = 220; + if (brightness == 2) br = 255; + if (brightness == 0) br = 180; + + int r = ((color >> 16) & 0xff) * br / 255; + int g = ((color >> 8) & 0xff) * br / 255; + int b = ((color) & 0xff) * br / 255; + + // 4J - changed byte order to save having to reorder later +#if ( defined _DURANGO || defined _WIN64 || __PSVITA__ ) + LUT[i] = 255 << 24 | b << 16 | g << 8 | r; +#elif defined _XBOX + LUT[i] = 255 << 24 | r << 16 | g << 8 | b; +#elif defined __ORBIS__ + r >>= 3; g >>= 3; b >>= 3; + LUT[i] = 1 << 15 | ( r << 10 ) | ( g << 5 ) | b; +#else + LUT[i] = r << 24 | g << 16 | b << 8 | 255; +#endif + + //pixels[i] = (255) << 24 | r << 16 | g << 8 | b; + } + + } + genLUT = false; +} + +// 4J added entityId +void Minimap::render(shared_ptr player, Textures *textures, shared_ptr data, int entityId) +{ + // 4J - only update every 8 renders, as an optimisation + // We don't want to use this for ItemFrame renders of maps, as then we can't have different maps together + if( !m_optimised || ( renderCount & 7 ) == 0 ) + { + for (int i = 0; i < w * h; i++) + { + int val = data->colors[i]; + // 4J - moved the code that used to run here into a LUT that is generated once in the ctor above + pixels[i] = LUT[val]; + } + } + renderCount++; + + // 4J - changed - have changed texture generation here to put the bytes in the right order already, so we don't have to do any copying round etc. in the texture replacement itself + textures->replaceTextureDirect(pixels, w, h, mapTexture); + + int x = 0; + int y = 0; + Tesselator *t = Tesselator::getInstance(); + + float vo = 0; + + glBindTexture(GL_TEXTURE_2D, mapTexture); + glEnable(GL_BLEND); + glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); + glDisable(GL_ALPHA_TEST); + t->begin(); + // 4J - moved to -0.02 to stop z fighting ( was -0.01) + // AP - Vita still has issues so push it a bit more + float Offset = -0.02f; +#ifdef __PSVITA__ + Offset = -0.03f; +#endif + t->vertexUV((float)(x + 0 + vo), (float)( y + h - vo), (float)( Offset), (float)( 0), (float)( 1)); + t->vertexUV((float)(x + w - vo), (float)( y + h - vo), (float)( Offset), (float)( 1), (float)( 1)); + t->vertexUV((float)(x + w - vo), (float)( y + 0 + vo), (float)( Offset), (float)( 1), (float)( 0)); + t->vertexUV((float)(x + 0 + vo), (float)( y + 0 + vo), (float)( Offset), (float)( 0), (float)( 0)); + t->end(); + glEnable(GL_ALPHA_TEST); + glDisable(GL_BLEND); + + + textures->bind(textures->loadTexture(TN_MISC_MAPICONS));//L"/misc/mapicons.png")); + + AUTO_VAR(itEnd, data->decorations.end()); + +#ifdef _LARGE_WORLDS + vector m_edgeIcons; +#endif + + // 4J-PB - stack the map icons + float fIconZ=-0.04f;// 4J - moved to -0.04 (was -0.02) to stop z fighting + for( vector::iterator it = data->decorations.begin(); it != itEnd; it++ ) + { + MapItemSavedData::MapDecoration *dec = *it; + + if(!dec->visible) continue; + + char imgIndex = dec->img; + +#ifdef _LARGE_WORLDS + // For edge icons, use a different texture + if(imgIndex >= 16) + { + m_edgeIcons.push_back(dec); + continue; + } +#endif + + // 4J Stu - For item frame renders, the player is NULL. We do not want to show player icons on the frames. + if(player == NULL && (imgIndex != 12)) continue; + else if (player != NULL && imgIndex == 12) continue; + else if( imgIndex == 12 && dec->entityId != entityId) continue; + + glPushMatrix(); + glTranslatef(x + dec->x / 2.0f + w / 2, y + dec->y / 2.0f + h / 2, fIconZ); + glRotatef(dec->rot * 360 / 16.0f, 0, 0, 1); + glScalef(4, 4, 3); + glTranslatef(-1.0f / 8.0f, +1.0f / 8.0f, 0); + + float u0 = (imgIndex % 4 + 0) / 4.0f; + float v0 = (imgIndex / 4 + 0) / 4.0f; + float u1 = (imgIndex % 4 + 1) / 4.0f; + float v1 = (imgIndex / 4 + 1) / 4.0f; + + t->begin(); + t->vertexUV((float)(-1), (float)( +1), (float)( 0), (float)( u0), (float)( v0)); + t->vertexUV((float)(+1), (float)( +1), (float)( 0), (float)( u1), (float)( v0)); + t->vertexUV((float)(+1), (float)( -1), (float)( 0), (float)( u1), (float)( v1)); + t->vertexUV((float)(-1), (float)( -1), (float)( 0), (float)( u0), (float)( v1)); + t->end(); + glPopMatrix(); + fIconZ-=0.01f; + } + +#ifdef _LARGE_WORLDS + // For players on the edge of the world + textures->bind(textures->loadTexture(TN_MISC_ADDITIONALMAPICONS)); + + fIconZ=-0.04f;// 4J - moved to -0.04 (was -0.02) to stop z fighting + for( AUTO_VAR(it,m_edgeIcons.begin()); it != m_edgeIcons.end(); it++ ) + { + MapItemSavedData::MapDecoration *dec = *it; + + char imgIndex = dec->img; + imgIndex -= 16; + + // 4J Stu - For item frame renders, the player is NULL. We do not want to show player icons on the frames. + if(player == NULL && (imgIndex != 12)) continue; + else if (player != NULL && imgIndex == 12) continue; + else if( imgIndex == 12 && dec->entityId != entityId) continue; + + glPushMatrix(); + glTranslatef(x + dec->x / 2.0f + w / 2, y + dec->y / 2.0f + h / 2, fIconZ); + glRotatef(dec->rot * 360 / 16.0f, 0, 0, 1); + glScalef(4, 4, 3); + glTranslatef(-1.0f / 8.0f, +1.0f / 8.0f, 0); + + float u0 = (imgIndex % 4 + 0) / 4.0f; + float v0 = (imgIndex / 4 + 0) / 4.0f; + float u1 = (imgIndex % 4 + 1) / 4.0f; + float v1 = (imgIndex / 4 + 1) / 4.0f; + + t->begin(); + t->vertexUV((float)(-1), (float)( +1), (float)( 0), (float)( u0), (float)( v0)); + t->vertexUV((float)(+1), (float)( +1), (float)( 0), (float)( u1), (float)( v0)); + t->vertexUV((float)(+1), (float)( -1), (float)( 0), (float)( u1), (float)( v1)); + t->vertexUV((float)(-1), (float)( -1), (float)( 0), (float)( u0), (float)( v1)); + t->end(); + glPopMatrix(); + fIconZ-=0.01f; + } +#endif + + glPushMatrix(); +// glRotatef(0, 1, 0, 0); + glTranslatef(0, 0, -0.06f); + glScalef(1, 1, 1); +// 4J Stu - Don't render the text name, except in debug +//#if 1 +//#ifdef _DEBUG +// font->draw(data->id, x, y, 0xff000000); +//#else + // 4J Stu - TU-1 hotfix + // DCR: Render the players current position here instead + if(player != NULL) + { + wchar_t playerPosText[32]; + ZeroMemory(&playerPosText, sizeof(wchar_t) * 32); + int posx = floor(player->x); + int posy = floor(player->y); + int posz = floor(player->z); + swprintf(playerPosText, 32, L"X: %d, Y: %d, Z: %d", posx, posy, posz); + + font->draw(playerPosText, x, y, Minecraft::GetInstance()->getColourTable()->getColour(eMinecraftColour_Map_Text)); + } +//#endif + glPopMatrix(); + +} diff --git a/Minecraft.Client/Minimap.h b/Minecraft.Client/Minimap.h new file mode 100644 index 00000000..758d8a8a --- /dev/null +++ b/Minecraft.Client/Minimap.h @@ -0,0 +1,35 @@ +#pragma once +#include "..\Minecraft.World\MapItem.h" +class Options; +class Font; +class Textures; +class Player; +class MapItemSavedData; + +class Minimap +{ +private: + static const int w = MapItem::IMAGE_WIDTH; + static const int h = MapItem::IMAGE_HEIGHT; +#ifdef __ORBIS__ + static short LUT[256]; // 4J added +#else + static int LUT[256]; // 4J added +#endif + static bool genLUT; // 4J added + int renderCount; // 4J added + bool m_optimised; // 4J Added +#ifdef __ORBIS__ + shortArray pixels; +#else + intArray pixels; +#endif + int mapTexture; + Options *options; + Font *font; + +public: + Minimap(Font *font, Options *options, Textures *textures, bool optimised = true); // 4J Added optimised param + static void reloadColours(); + void render(shared_ptr player, Textures *textures, shared_ptr data, int entityId); // 4J added entityId param +}; diff --git a/Minecraft.Client/MobRenderer.cpp b/Minecraft.Client/MobRenderer.cpp new file mode 100644 index 00000000..ee512530 --- /dev/null +++ b/Minecraft.Client/MobRenderer.cpp @@ -0,0 +1,127 @@ +#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" +#include "..\Minecraft.World\net.minecraft.world.entity.projectile.h" +#include "..\Minecraft.World\StringHelpers.h" +#include "..\Minecraft.World\Mth.h" +#include "entityRenderDispatcher.h" + +MobRenderer::MobRenderer(Model *model, float shadow) : LivingEntityRenderer(model, shadow) +{ +} + +void MobRenderer::render(shared_ptr _mob, double x, double y, double z, float rot, float a) +{ + shared_ptr mob = dynamic_pointer_cast(_mob); + + LivingEntityRenderer::render(mob, x, y, z, rot, a); + renderLeash(mob, x, y, z, rot, a); +} + +bool MobRenderer::shouldShowName(shared_ptr mob) +{ + return LivingEntityRenderer::shouldShowName(mob) && (mob->shouldShowName() || dynamic_pointer_cast(mob)->hasCustomName() && mob == entityRenderDispatcher->crosshairPickMob); +} + +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)) + { + rotOffCos = 0; + rotOffSin = 0; + yOff = -1; + } + double swingOff = cos(roperXRot); + double endX = lerp(roper->xo, roper->x, a) - (rotOffCos * 0.7) - (rotOffSin * 0.5 * swingOff); + double endY = lerp(roper->yo + roper->getHeadHeight() * .7, roper->y + roper->getHeadHeight() * .7, a) - (yOff * 0.5) - .25; + double endZ = lerp(roper->zo, roper->z, a) - (rotOffSin * 0.7) + (rotOffCos * 0.5 * swingOff); + + double entityYRot = lerp(entity->yBodyRotO, entity->yBodyRot, a) * Mth::RAD_TO_GRAD + PI * .5; + rotOffCos = cos(entityYRot) * entity->bbWidth * .4; + rotOffSin = sin(entityYRot) * entity->bbWidth * .4; + double startX = lerp(entity->xo, entity->x, a) + rotOffCos; + double startY = lerp(entity->yo, entity->y, a); + double startZ = lerp(entity->zo, entity->z, a) + rotOffSin; + x += rotOffCos; + z += rotOffSin; + + double dx = (float) (endX - startX); + double dy = (float) (endY - startY); + double dz = (float) (endZ - startZ); + + glDisable(GL_TEXTURE_2D); + glDisable(GL_LIGHTING); + glDisable(GL_CULL_FACE); + + unsigned int lightCol = Minecraft::GetInstance()->getColourTable()->getColor( eMinecraftColour_Leash_Light_Colour ); + float rLightCol = ( (lightCol>>16)&0xFF )/255.0f; + float gLightCol = ( (lightCol>>8)&0xFF )/255.0; + float bLightCol = ( lightCol&0xFF )/255.0; + + unsigned int darkCol = Minecraft::GetInstance()->getColourTable()->getColor( eMinecraftColour_Leash_Dark_Colour ); + float rDarkCol = ( (darkCol>>16)&0xFF )/255.0f; + float gDarkCol = ( (darkCol>>8)&0xFF )/255.0; + float bDarkCol = ( darkCol&0xFF )/255.0; + + int steps = 24; + double width = .025; + tessellator->begin(GL_TRIANGLE_STRIP); + for (int k = 0; k <= steps; k++) + { + 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), z + (dz * aa)); + tessellator->vertex(x + (dx * aa) + width, y + (dy * ((aa * aa) + aa) * 0.5) + ((((float) steps - (float) k) / (steps * 0.75F)) + 0.125F) + width, z + (dz * aa)); + } + tessellator->end(); + + 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(); + + glEnable(GL_LIGHTING); + glEnable(GL_TEXTURE_2D); + glEnable(GL_CULL_FACE); + } +} + +double MobRenderer::lerp(double prev, double next, double a) +{ + return prev + (next - prev) * a; +} \ No newline at end of file diff --git a/Minecraft.Client/MobRenderer.h b/Minecraft.Client/MobRenderer.h new file mode 100644 index 00000000..6ab4af0c --- /dev/null +++ b/Minecraft.Client/MobRenderer.h @@ -0,0 +1,24 @@ +#pragma once +#include "LivingEntityRenderer.h" +class Mob; +using namespace std; + +// 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*/ + +// 4J - this used to be a generic : public class MobRenderer extends EntityRenderer +class MobRenderer : public LivingEntityRenderer +{ +public: + MobRenderer(Model *model, float shadow); + virtual void render(shared_ptr mob, double x, double y, double z, float rot, float a); + +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/MobSkinMemTextureProcessor.cpp b/Minecraft.Client/MobSkinMemTextureProcessor.cpp new file mode 100644 index 00000000..a6fdf527 --- /dev/null +++ b/Minecraft.Client/MobSkinMemTextureProcessor.cpp @@ -0,0 +1,72 @@ +#include "stdafx.h" +#include "MobSkinMemTextureProcessor.h" + +BufferedImage *MobSkinMemTextureProcessor::process(BufferedImage *in) +{ + if (in == NULL) return NULL; + + width = 64; + height = 32; + + BufferedImage *out = new BufferedImage(width, height, BufferedImage::TYPE_INT_ARGB); + Graphics *g = out->getGraphics(); + g->drawImage(in, 0, 0, NULL); + g->dispose(); + + pixels = out->getData(); + + setNoAlpha(0, 0, 32, 16); + setForceAlpha(32, 0, 64, 32); + setNoAlpha(0, 16, 64, 32); + bool hasAlpha = false; + for (int x = 32; x < 64; x++) + for (int y = 0; y < 16; y++) + { + int pix = pixels[x + y * 64]; + if (((pix >> 24) & 0xff) < 128) hasAlpha = true; + } + + // 4J-PB - looks like the code below is wrong, and really should be looping from 0 to <32 + if (!hasAlpha) + { + for (int x = 32; x < 64; x++) + for (int y = 0; y < 16; y++) + { + int pix = pixels[x + y * 64]; + if (((pix >> 24) & 0xff) < 128) hasAlpha = true; + } + } + + return out; +} + +void MobSkinMemTextureProcessor::setForceAlpha(int x0, int y0, int x1, int y1) +{ + if (hasAlpha(x0, y0, x1, y1)) return; + + for (int x = x0; x < x1; x++) + for (int y = y0; y < y1; y++) + { + pixels[x + y * width] &= 0x00ffffff; + } +} + +void MobSkinMemTextureProcessor::setNoAlpha(int x0, int y0, int x1, int y1) +{ + for (int x = x0; x < x1; x++) + for (int y = y0; y < y1; y++) + { + pixels[x + y * width] |= 0xff000000; + } +} + +bool MobSkinMemTextureProcessor::hasAlpha(int x0, int y0, int x1, int y1) +{ + for (int x = x0; x < x1; x++) + for (int y = y0; y < y1; y++) + { + int pix = pixels[x + y * width]; + if (((pix >> 24) & 0xff) < 128) return true; + } + return false; +} \ No newline at end of file diff --git a/Minecraft.Client/MobSkinMemTextureProcessor.h b/Minecraft.Client/MobSkinMemTextureProcessor.h new file mode 100644 index 00000000..a28f80a3 --- /dev/null +++ b/Minecraft.Client/MobSkinMemTextureProcessor.h @@ -0,0 +1,16 @@ +#pragma once +#include "MemTextureProcessor.h" + +class MobSkinMemTextureProcessor : public MemTextureProcessor +{ +private: + int *pixels; + int width, height; +public: + virtual BufferedImage *process(BufferedImage *in); + +private: + void setForceAlpha(int x0, int y0, int x1, int y1); + void setNoAlpha(int x0, int y0, int x1, int y1); + bool hasAlpha(int x0, int y0, int x1, int y1); +}; \ No newline at end of file diff --git a/Minecraft.Client/MobSkinTextureProcessor.cpp b/Minecraft.Client/MobSkinTextureProcessor.cpp new file mode 100644 index 00000000..dffb467a --- /dev/null +++ b/Minecraft.Client/MobSkinTextureProcessor.cpp @@ -0,0 +1,71 @@ +#include "stdafx.h" +#include "MobSkinTextureProcessor.h" + +BufferedImage *MobSkinTextureProcessor::process(BufferedImage *in) +{ + if (in == NULL) return NULL; + + width = 64; + height = 32; + + BufferedImage *out = new BufferedImage(width, height, BufferedImage::TYPE_INT_ARGB); + Graphics *g = out->getGraphics(); + g->drawImage(in, 0, 0, NULL); + g->dispose(); + + pixels = out->getData(); + + setNoAlpha(0, 0, 32, 16); + setForceAlpha(32, 0, 64, 32); + setNoAlpha(0, 16, 64, 32); + bool hasAlpha = false; + for (int x = 32; x < 64; x++) + for (int y = 0; y < 16; y++) + { + int pix = pixels[x + y * 64]; + if (((pix >> 24) & 0xff) < 128) hasAlpha = true; + } + + if (!hasAlpha) + { + for (int x = 32; x < 64; x++) + for (int y = 0; y < 16; y++) + { + int pix = pixels[x + y * 64]; + if (((pix >> 24) & 0xff) < 128) hasAlpha = true; + } + } + + return out; +} + +void MobSkinTextureProcessor::setForceAlpha(int x0, int y0, int x1, int y1) +{ + if (hasAlpha(x0, y0, x1, y1)) return; + + for (int x = x0; x < x1; x++) + for (int y = y0; y < y1; y++) + { + pixels[x + y * width] &= 0x00ffffff; + } +} + +void MobSkinTextureProcessor::setNoAlpha(int x0, int y0, int x1, int y1) +{ + for (int x = x0; x < x1; x++) + for (int y = y0; y < y1; y++) + { + pixels[x + y * width] |= 0xff000000; + } +} + +bool MobSkinTextureProcessor::hasAlpha(int x0, int y0, int x1, int y1) +{ + for (int x = x0; x < x1; x++) + for (int y = y0; y < y1; y++) + { + int pix = pixels[x + y * width]; + if (((pix >> 24) & 0xff) < 128) return true; + } + return false; +} \ No newline at end of file diff --git a/Minecraft.Client/MobSkinTextureProcessor.h b/Minecraft.Client/MobSkinTextureProcessor.h new file mode 100644 index 00000000..ee51a8a3 --- /dev/null +++ b/Minecraft.Client/MobSkinTextureProcessor.h @@ -0,0 +1,16 @@ +#pragma once +#include "HttpTextureProcessor.h" + +class MobSkinTextureProcessor : public HttpTextureProcessor +{ +private: + int *pixels; + int width, height; +public: + virtual BufferedImage *process(BufferedImage *in); + +private: + void setForceAlpha(int x0, int y0, int x1, int y1); + void setNoAlpha(int x0, int y0, int x1, int y1); + bool hasAlpha(int x0, int y0, int x1, int y1); +}; \ No newline at end of file diff --git a/Minecraft.Client/MobSpawnerRenderer.cpp b/Minecraft.Client/MobSpawnerRenderer.cpp new file mode 100644 index 00000000..02aac27f --- /dev/null +++ b/Minecraft.Client/MobSpawnerRenderer.cpp @@ -0,0 +1,34 @@ +#include "stdafx.h" +#include "MobSpawnerRenderer.h" +#include "TileEntityRenderDispatcher.h" +#include "EntityRenderDispatcher.h" +#include "..\Minecraft.World\net.minecraft.world.level.tile.entity.h" +#include "..\Minecraft.World\net.minecraft.world.entity.h" + +void MobSpawnerRenderer::render(shared_ptr _spawner, double x, double y, double z, float a, bool setColor, float alpha, bool useCompiled) +{ + // 4J - dynamic cast required because we aren't using templates/generics in our version + 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->getLevel()); + float s = 7 / 16.0f; + glTranslatef(0, 0.4f, 0); + glRotatef((float) (spawner->oSpin + (spawner->spin - spawner->oSpin) * a) * 10, 0, 1, 0); + glRotatef(-30, 1, 0, 0); + glTranslatef(0, -0.4f, 0); + glScalef(s, s, s); + e->moveTo(x, y, z, 0, 0); + EntityRenderDispatcher::instance->render(e, 0, 0, 0, 0, a); + } +} diff --git a/Minecraft.Client/MobSpawnerRenderer.h b/Minecraft.Client/MobSpawnerRenderer.h new file mode 100644 index 00000000..984886e5 --- /dev/null +++ b/Minecraft.Client/MobSpawnerRenderer.h @@ -0,0 +1,14 @@ +#pragma once +#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.cpp b/Minecraft.Client/Model.cpp new file mode 100644 index 00000000..63ba0c53 --- /dev/null +++ b/Minecraft.Client/Model.cpp @@ -0,0 +1,23 @@ +#include "stdafx.h" +#include "TexOffs.h" +#include "Model.h" + + +Model::Model() +{ + riding = false; + young=true; + texWidth=64; + texHeight=32; +} + +void Model::setMapTex(wstring id, int x, int y) +{ + mappedTexOffs[id]=new TexOffs(x, y); +} + +TexOffs *Model::getMapTex(wstring id) +{ + // 4J-PB - assuming there will always be this one + return mappedTexOffs[id]; +} \ No newline at end of file diff --git a/Minecraft.Client/Model.h b/Minecraft.Client/Model.h new file mode 100644 index 00000000..5a4b6f2e --- /dev/null +++ b/Minecraft.Client/Model.h @@ -0,0 +1,35 @@ +#pragma once +using namespace std; +#include "..\Minecraft.World\Random.h" +#include "..\Minecraft.Client\SkinBox.h" +class Mob; +class ModelPart; +class TexOffs; +class LivingEntity; + + +class Model +{ +public: + float attackTime; + bool riding; + vector cubes; + bool young; + unordered_map mappedTexOffs; + int texWidth; + int texHeight; + + 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, 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); + TexOffs *getMapTex(wstring id); + +protected: + float yHeadOffs; + float zHeadOffs; +}; 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 new file mode 100644 index 00000000..615ff8bd --- /dev/null +++ b/Minecraft.Client/ModelPart.cpp @@ -0,0 +1,327 @@ +#include "stdafx.h" +#include "TexOffs.h" +#include "ModelPart.h" +#include "Cube.h" + +const float ModelPart::RAD = (180.0f / PI); + +void ModelPart::_init() +{ + xTexSize = 64.0f; + yTexSize = 32.0f; + list = 0; + compiled=false; + bMirror = false; + visible = true; + neverRender = false; + x=y=z = 0.0f; + xRot=yRot=zRot = 0.0f; + translateX = translateY = translateZ = 0.0f; +} + +ModelPart::ModelPart() +{ + _init(); +} + +ModelPart::ModelPart(Model *model, const wstring& id) +{ + construct(model, id); +} + +ModelPart::ModelPart(Model *model) +{ + construct(model); +} + +ModelPart::ModelPart(Model *model, int xTexOffs, int yTexOffs) +{ + construct(model, xTexOffs, yTexOffs); +} + + +void ModelPart::construct(Model *model, const wstring& id) +{ + _init(); + this->model = model; + model->cubes.push_back(this); + this->id = id; + setTexSize(model->texWidth, model->texHeight); +} + +void ModelPart::construct(Model *model) +{ + _init(); + construct(model, L""); +} + +void ModelPart::construct(Model *model, int xTexOffs, int yTexOffs) +{ + _init(); + construct(model); + texOffs(xTexOffs, yTexOffs); +} + + +void ModelPart::addChild(ModelPart *child) +{ + //if (children == NULL) children = new ModelPartArray; + children.push_back(child); +} + +ModelPart * ModelPart::retrieveChild(SKIN_BOX *pBox) +{ + for(AUTO_VAR(it, children.begin()); it != children.end(); ++it) + { + ModelPart *child=*it; + + for(AUTO_VAR(itcube, child->cubes.begin()); itcube != child->cubes.end(); ++itcube) + { + Cube *pCube=*itcube; + + if((pCube->x0==pBox->fX) && + (pCube->y0==pBox->fY) && + (pCube->z0==pBox->fZ) && + (pCube->x1==(pBox->fX + pBox->fW)) && + (pCube->y1==(pBox->fY + pBox->fH)) && + (pCube->z1==(pBox->fZ + pBox->fD)) + ) + { + return child; + break; + } + } + } + + return NULL; +} + +ModelPart *ModelPart::mirror() +{ + bMirror = !bMirror; + return this; +} + +ModelPart *ModelPart::texOffs(int xTexOffs, int yTexOffs) +{ + this->xTexOffs = xTexOffs; + this->yTexOffs = yTexOffs; + return this; +} + +ModelPart *ModelPart::addBox(wstring id, float x0, float y0, float z0, int w, int h, int d) +{ + id = this->id + L"." + id; + TexOffs *offs = model->getMapTex(id); + texOffs(offs->x, offs->y); + cubes.push_back((new Cube(this, xTexOffs, yTexOffs, x0, y0, z0, w, h, d, 0))->setId(id)); + return this; +} + +ModelPart *ModelPart::addBox(float x0, float y0, float z0, int w, int h, int d) +{ + cubes.push_back(new Cube(this, xTexOffs, yTexOffs, x0, y0, z0, w, h, d, 0)); + return this; +} + +void ModelPart::addHumanoidBox(float x0, float y0, float z0, int w, int h, int d, float g) +{ + cubes.push_back(new Cube(this, xTexOffs, yTexOffs, x0, y0, z0, w, h, d, g, 63, true)); +} + +ModelPart *ModelPart::addBoxWithMask(float x0, float y0, float z0, int w, int h, int d, int faceMask) +{ + cubes.push_back(new Cube(this, xTexOffs, yTexOffs, x0, y0, z0, w, h, d, 0, faceMask)); + return this; +} + +void ModelPart::addBox(float x0, float y0, float z0, int w, int h, int d, float g) +{ + cubes.push_back(new Cube(this, xTexOffs, yTexOffs, x0, y0, z0, w, h, d, g)); +} + + +void ModelPart::addTexBox(float x0, float y0, float z0, int w, int h, int d, int tex) +{ + cubes.push_back(new Cube(this, xTexOffs, yTexOffs, x0, y0, z0, w, h, d, (float)tex)); +} + +void ModelPart::setPos(float x, float y, float z) +{ + this->x = x; + this->y = y; + this->z = z; +} + +void ModelPart::render(float scale, bool usecompiled, bool bHideParentBodyPart) +{ + if (neverRender) return; + if (!visible) return; + if (!compiled) compile(scale); + + glTranslatef(translateX, translateY, translateZ); + + if (xRot != 0 || yRot != 0 || zRot != 0) + { + glPushMatrix(); + glTranslatef(x * scale, y * scale, z * scale); + if (zRot != 0) glRotatef(zRot * RAD, 0, 0, 1); + if (yRot != 0) glRotatef(yRot * RAD, 0, 1, 0); + if (xRot != 0) glRotatef(xRot * RAD, 1, 0, 0); + + if(!bHideParentBodyPart) + { + if( usecompiled ) + { + glCallList(list); + } + else + { + Tesselator *t = Tesselator::getInstance(); + for (unsigned int i = 0; i < cubes.size(); i++) + { + cubes[i]->render(t, scale); + } + } + } + //if (children != NULL) + { + for (unsigned int i = 0; i < children.size(); i++) + { + children.at(i)->render(scale,usecompiled); + } + } + + glPopMatrix(); + } + else if (x != 0 || y != 0 || z != 0) + { + glTranslatef(x * scale, y * scale, z * scale); + if(!bHideParentBodyPart) + { + if( usecompiled ) + { + glCallList(list); + } + else + { + Tesselator *t = Tesselator::getInstance(); + for (unsigned int i = 0; i < cubes.size(); i++) + { + cubes[i]->render(t, scale); + } + } + } + //if (children != NULL) + { + for (unsigned int i = 0; i < children.size(); i++) + { + children.at(i)->render(scale,usecompiled); + } + } + glTranslatef(-x * scale, -y * scale, -z * scale); + } + else + { + if(!bHideParentBodyPart) + { + if( usecompiled ) + { + glCallList(list); + } + else + { + Tesselator *t = Tesselator::getInstance(); + for (unsigned int i = 0; i < cubes.size(); i++) + { + cubes[i]->render(t, scale); + } + } + } + //if (children != NULL) + { + for (unsigned int i = 0; i < children.size(); i++) + { + children.at(i)->render(scale,usecompiled); + } + } + } + + glTranslatef(-translateX, -translateY, -translateZ); +} + +void ModelPart::renderRollable(float scale, bool usecompiled) +{ + if (neverRender) return; + if (!visible) return; + if (!compiled) compile(scale); + + glPushMatrix(); + glTranslatef(x * scale, y * scale, z * scale); + if (yRot != 0) glRotatef(yRot * RAD, 0, 1, 0); + if (xRot != 0) glRotatef(xRot * RAD, 1, 0, 0); + if (zRot != 0) glRotatef(zRot * RAD, 0, 0, 1); + glCallList(list); + glPopMatrix(); + +} + +void ModelPart::translateTo(float scale) +{ + if (neverRender) return; + if (!visible) return; + if (!compiled) compile(scale); + + if (xRot != 0 || yRot != 0 || zRot != 0) + { + glTranslatef(x * scale, y * scale, z * scale); + if (zRot != 0) glRotatef(zRot * RAD, 0, 0, 1); + if (yRot != 0) glRotatef(yRot * RAD, 0, 1, 0); + if (xRot != 0) glRotatef(xRot * RAD, 1, 0, 0); + } + else if (x != 0 || y != 0 || z != 0) + { + glTranslatef(x * scale, y * scale, z * scale); + } + else + { + } +} + +void ModelPart::compile(float scale) +{ + list = MemoryTracker::genLists(1); + + glNewList(list, GL_COMPILE); + // Set a few render states that aren't configured by default + glEnable(GL_DEPTH_TEST); + glDepthFunc(GL_LEQUAL); + glDepthMask(true); + Tesselator *t = Tesselator::getInstance(); + + for (unsigned int i = 0; i < cubes.size(); i++) + { + cubes.at(i)->render(t, scale); + } + + glEndList(); + + compiled = true; +} + +ModelPart *ModelPart::setTexSize(int xs, int ys) +{ + this->xTexSize = (float)xs; + this->yTexSize = (float)ys; + return this; +} + +void ModelPart::mimic(ModelPart *o) +{ + x = o->x; + y = o->y; + z = o->z; + xRot = o->xRot; + yRot = o->yRot; + zRot = o->zRot; +} diff --git a/Minecraft.Client/ModelPart.h b/Minecraft.Client/ModelPart.h new file mode 100644 index 00000000..c6458e71 --- /dev/null +++ b/Minecraft.Client/ModelPart.h @@ -0,0 +1,63 @@ +#pragma once +#include "..\Minecraft.World\ArrayWithLength.h" +#include "Vertex.h" +#include "Polygon.h" +#include "Model.h" +#include "..\Minecraft.Client\SkinBox.h" + +class Cube; + +class ModelPart +{ +public: + float xTexSize; + float yTexSize; + float x, y, z; + float xRot, yRot, zRot; + bool bMirror; + bool visible; + bool neverRender; + vector cubes; + vector children; + static const float RAD; + float translateX, translateY, translateZ; + +private: + wstring id; + int xTexOffs, yTexOffs; + boolean compiled; + int list; + Model *model; + +public: + void _init(); // 4J added + ModelPart(); + ModelPart(Model *model, const wstring &id); + ModelPart(Model *model); + ModelPart(Model *model, int xTexOffs, int yTexOffs); + + // MGH - had to add these for PS3, as calling constructors from others was only introduced in c++11 - https://en.wikipedia.org/wiki/C++11#Object_construction_improvement + void construct(Model *model, const wstring &id); + void construct(Model *model); + void construct(Model *model, int xTexOffs, int yTexOffs); + + void addChild(ModelPart *child); + ModelPart * retrieveChild(SKIN_BOX *pBox); + ModelPart *mirror(); + ModelPart *texOffs(int xTexOffs, int yTexOffs); + ModelPart *addBox(wstring id, float x0, float y0, float z0, int w, int h, int d); + ModelPart *addBox(float x0, float y0, float z0, int w, int h, int d); + ModelPart *addBoxWithMask(float x0, float y0, float z0, int w, int h, int d, int faceMask); // 4J added + void addBox(float x0, float y0, float z0, int w, int h, int d, float g); + void addHumanoidBox(float x0, float y0, float z0, int w, int h, int d, float g); // 4J - to flip the poly 3 uvs so the skin maps correctly + void addTexBox(float x0, float y0, float z0, int w, int h, int d, int tex); + void setPos(float x, float y, float z); + void render(float scale, bool usecompiled,bool bHideParentBodyPart=false); + void renderRollable(float scale, bool usecompiled); + void translateTo(float scale); + ModelPart *setTexSize(int xs, int ys); + void mimic(ModelPart *o); + void compile(float scale); + int getfU() {return xTexOffs;} + int getfV() {return yTexOffs;} + }; diff --git a/Minecraft.Client/MultiPlayerChunkCache.cpp b/Minecraft.Client/MultiPlayerChunkCache.cpp new file mode 100644 index 00000000..b5e1dd25 --- /dev/null +++ b/Minecraft.Client/MultiPlayerChunkCache.cpp @@ -0,0 +1,310 @@ +#include "stdafx.h" +#include "MultiPlayerChunkCache.h" +#include "ServerChunkCache.h" +#include "..\Minecraft.World\net.minecraft.world.level.chunk.h" +#include "..\Minecraft.World\net.minecraft.world.level.dimension.h" +#include "..\Minecraft.World\Arrays.h" +#include "..\Minecraft.World\StringHelpers.h" +#include "MinecraftServer.h" +#include "ServerLevel.h" +#include "..\Minecraft.World\Tile.h" +#include "..\Minecraft.World\WaterLevelChunk.h" + +MultiPlayerChunkCache::MultiPlayerChunkCache(Level *level) +{ + XZSIZE = level->dimension->getXZSize(); // 4J Added + XZOFFSET = XZSIZE/2; // 4J Added + m_XZSize = XZSIZE; + hasData = new bool[XZSIZE * XZSIZE]; + memset(hasData, 0, sizeof(bool) * XZSIZE * XZSIZE); + + emptyChunk = new EmptyLevelChunk(level, byteArray(16 * 16 * Level::maxBuildHeight), 0, 0); + + // For normal world dimension, create a chunk that can be used to create the illusion of infinite water at the edge of the world + if( level->dimension->id == 0 ) + { + byteArray bytes = byteArray(16 * 16 * 128); + + // Superflat.... make grass, not water... + if(level->getLevelData()->getGenerator() == LevelType::lvl_flat) + { + for( int x = 0; x < 16; x++ ) + for( int y = 0; y < 128; y++ ) + for( int z = 0; z < 16; z++ ) + { + unsigned char tileId = 0; + if( y == 3 ) tileId = Tile::grass_Id; + else if( y <= 2 ) tileId = Tile::dirt_Id; + + bytes[x << 11 | z << 7 | y] = tileId; + } + } + else + { + for( int x = 0; x < 16; x++ ) + for( int y = 0; y < 128; y++ ) + for( int z = 0; z < 16; z++ ) + { + unsigned char tileId = 0; + 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; + } + } + + waterChunk = new WaterLevelChunk(level, bytes, 0, 0); + + delete[] bytes.data; + + if(level->getLevelData()->getGenerator() == LevelType::lvl_flat) + { + for( int x = 0; x < 16; x++ ) + for( int y = 0; y < 128; y++ ) + for( int z = 0; z < 16; z++ ) + { + if( y >= 3 ) + { + ((WaterLevelChunk *)waterChunk)->setLevelChunkBrightness(LightLayer::Sky,x,y,z,15); + } + } + } + else + { + for( int x = 0; x < 16; x++ ) + for( int y = 0; y < 128; y++ ) + for( int z = 0; z < 16; z++ ) + { + if( y >= ( level->getSeaLevel() - 1 ) ) + { + ((WaterLevelChunk *)waterChunk)->setLevelChunkBrightness(LightLayer::Sky,x,y,z,15); + } + else + { + ((WaterLevelChunk *)waterChunk)->setLevelChunkBrightness(LightLayer::Sky,x,y,z,2); + } + } + } + } + else + { + waterChunk = NULL; + } + + this->level = level; + + this->cache = new LevelChunk *[XZSIZE * XZSIZE]; + memset(this->cache, 0, XZSIZE * XZSIZE * sizeof(LevelChunk *)); + InitializeCriticalSectionAndSpinCount(&m_csLoadCreate,4000); +} + +MultiPlayerChunkCache::~MultiPlayerChunkCache() +{ + delete emptyChunk; + delete waterChunk; + delete cache; + delete hasData; + + AUTO_VAR(itEnd, loadedChunkList.end()); + for (AUTO_VAR(it, loadedChunkList.begin()); it != itEnd; it++) + delete *it; + + DeleteCriticalSection(&m_csLoadCreate); +} + + +bool MultiPlayerChunkCache::hasChunk(int x, int z) +{ + // This cache always claims to have chunks, although it might actually just return empty data if it doesn't have anything + return true; +} + +// 4J added - find out if we actually really do have a chunk in our cache +bool MultiPlayerChunkCache::reallyHasChunk(int x, int z) +{ + int ix = x + XZOFFSET; + int iz = z + XZOFFSET; + // Check we're in range of the stored level - if we aren't, then consider that we do have that chunk as we'll be able to use the water chunk there + if( ( ix < 0 ) || ( ix >= XZSIZE ) ) return true; + if( ( iz < 0 ) || ( iz >= XZSIZE ) ) return true; + int idx = ix * XZSIZE + iz; + + LevelChunk *chunk = cache[idx]; + if( chunk == NULL ) + { + return false; + } + return hasData[idx]; +} + +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()) + { + // 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); + + // 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) +{ + int ix = x + XZOFFSET; + int iz = z + XZOFFSET; + // Check we're in range of the stored level + if( ( ix < 0 ) || ( ix >= XZSIZE ) ) return ( waterChunk ? waterChunk : emptyChunk ); + if( ( iz < 0 ) || ( iz >= XZSIZE ) ) return ( waterChunk ? waterChunk : emptyChunk ); + int idx = ix * XZSIZE + iz; + LevelChunk *chunk = cache[idx]; + LevelChunk *lastChunk = chunk; + + if( chunk == NULL ) + { + EnterCriticalSection(&m_csLoadCreate); + + //LevelChunk *chunk; + if( g_NetworkManager.IsHost() ) // force here to disable sharing of data + { + // 4J-JEV: We are about to use shared data, abort if the server is stopped and the data is deleted. + if (MinecraftServer::getInstance()->serverHalted()) return NULL; + + // If we're the host, then don't create the chunk, share data from the server's copy +#ifdef _LARGE_WORLDS + LevelChunk *serverChunk = MinecraftServer::getInstance()->getLevel(level->dimension->id)->cache->getChunkLoadedOrUnloaded(x,z); +#else + LevelChunk *serverChunk = MinecraftServer::getInstance()->getLevel(level->dimension->id)->cache->getChunk(x,z); +#endif + chunk = new LevelChunk(level, x, z, serverChunk); + // Let renderer know that this chunk has been created - it might have made render data from the EmptyChunk if it got to a chunk before the server sent it + level->setTilesDirty( x * 16 , 0 , z * 16 , x * 16 + 15, 127, z * 16 + 15); + hasData[idx] = true; + } + else + { + // Passing an empty array into the LevelChunk ctor, which it now detects and sets up the chunk as compressed & empty + byteArray bytes; + + chunk = new LevelChunk(level, bytes, x, z); + + // 4J - changed to use new methods for lighting + chunk->setSkyLightDataAllBright(); + // Arrays::fill(chunk->skyLight->data, (byte) 255); + } + + chunk->loaded = true; + + LeaveCriticalSection(&m_csLoadCreate); + +#if ( defined _WIN64 || defined __LP64__ ) + if( InterlockedCompareExchangeRelease64((LONG64 *)&cache[idx],(LONG64)chunk,(LONG64)lastChunk) == (LONG64)lastChunk ) +#else + if( InterlockedCompareExchangeRelease((LONG *)&cache[idx],(LONG)chunk,(LONG)lastChunk) == (LONG)lastChunk ) +#endif // _DURANGO + { + // If we're sharing with the server, we'll need to calculate our heightmap now, which isn't shared. If we aren't sharing with the server, + // then this will be calculated when the chunk data arrives. + if( g_NetworkManager.IsHost() ) + { + chunk->recalcHeightmapOnly(); + } + + // Successfully updated the cache + EnterCriticalSection(&m_csLoadCreate); + loadedChunkList.push_back(chunk); + LeaveCriticalSection(&m_csLoadCreate); + } + else + { + // Something else must have updated the cache. Return that chunk and discard this one. This really shouldn't be happening + // in multiplayer + delete chunk; + return cache[idx]; + } + + } + else + { + chunk->load(); + } + + return chunk; +} + +LevelChunk *MultiPlayerChunkCache::getChunk(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 ) ) return ( waterChunk ? waterChunk : emptyChunk ); + if( ( iz < 0 ) || ( iz >= XZSIZE ) ) return ( waterChunk ? waterChunk : emptyChunk ); + int idx = ix * XZSIZE + iz; + + LevelChunk *chunk = cache[idx]; + if( chunk == NULL ) + { + return emptyChunk; + } + else + { + return chunk; + } +} + +bool MultiPlayerChunkCache::save(bool force, ProgressListener *progressListener) +{ + return true; +} + +bool MultiPlayerChunkCache::tick() +{ + return false; +} + +bool MultiPlayerChunkCache::shouldSave() +{ + return false; +} + +void MultiPlayerChunkCache::postProcess(ChunkSource *parent, int x, int z) +{ +} + +vector *MultiPlayerChunkCache::getMobsAt(MobCategory *mobCategory, int x, int y, int z) +{ + return NULL; +} + +TilePos *MultiPlayerChunkCache::findNearestMapFeature(Level *level, const wstring &featureName, int x, int y, int z) +{ + 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) +{ + int ix = x + XZOFFSET; + int iz = z + XZOFFSET; + // Check we're in range of the stored level + if( ( ix < 0 ) || ( ix >= XZSIZE ) ) return; + if( ( iz < 0 ) || ( iz >= XZSIZE ) ) return; + int idx = ix * XZSIZE + iz; + hasData[idx] = true; +} \ No newline at end of file diff --git a/Minecraft.Client/MultiPlayerChunkCache.h b/Minecraft.Client/MultiPlayerChunkCache.h new file mode 100644 index 00000000..c180f858 --- /dev/null +++ b/Minecraft.Client/MultiPlayerChunkCache.h @@ -0,0 +1,48 @@ +#pragma once +#include "..\Minecraft.World\net.minecraft.world.level.h" +#include "..\Minecraft.World\net.minecraft.world.level.chunk.h" +#include "..\Minecraft.World\RandomLevelSource.h" + +using namespace std; +class ServerChunkCache; + +// 4J - various alterations here to make this thread safe, and operate as a fixed sized cache +class MultiPlayerChunkCache : public ChunkSource +{ + friend class LevelRenderer; +private: + LevelChunk *emptyChunk; + LevelChunk *waterChunk; + + vector loadedChunkList; + + LevelChunk **cache; + // 4J - added for multithreaded support + CRITICAL_SECTION m_csLoadCreate; + // 4J - size of cache is defined by size of one side - must be even + int XZSIZE; + int XZOFFSET; + bool *hasData; + + Level *level; + +public: + MultiPlayerChunkCache(Level *level); + ~MultiPlayerChunkCache(); + 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 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 +}; \ No newline at end of file diff --git a/Minecraft.Client/MultiPlayerGameMode.cpp b/Minecraft.Client/MultiPlayerGameMode.cpp new file mode 100644 index 00000000..cbf8a7ab --- /dev/null +++ b/Minecraft.Client/MultiPlayerGameMode.cpp @@ -0,0 +1,519 @@ +#include "stdafx.h" +#include "MultiPlayerGameMode.h" +#include "CreativeMode.h" +#include "MultiPlayerLocalPlayer.h" +#include "MultiPlayerLevel.h" +#include "Minecraft.h" +#include "ClientConnection.h" +#include "LevelRenderer.h" +#include "..\Minecraft.World\net.minecraft.world.level.h" +#include "..\Minecraft.World\net.minecraft.world.item.h" +#include "..\Minecraft.World\net.minecraft.world.entity.player.h" +#include "..\Minecraft.World\net.minecraft.world.level.tile.h" +#include "..\Minecraft.World\net.minecraft.world.inventory.h" +#include "..\Minecraft.World\net.minecraft.h" + +MultiPlayerGameMode::MultiPlayerGameMode(Minecraft *minecraft, ClientConnection *connection) +{ + // 4J - added initialisers + xDestroyBlock = -1; + yDestroyBlock = -1; + zDestroyBlock = -1; + destroyingItem = nullptr; + destroyProgress = 0; + destroyTicks = 0; + destroyDelay = 0; + isDestroying = false; + carriedItem = 0; + localPlayerMode = GameType::SURVIVAL; + this->minecraft = minecraft; + this->connection = connection; +} + +void MultiPlayerGameMode::creativeDestroyBlock(Minecraft *minecraft, MultiPlayerGameMode *gameMode, int x, int y, int z, int face) +{ + if (!minecraft->level->extinguishFire(minecraft->player, x, y, z, face)) + { + gameMode->destroyBlock(x, y, z, face); + } +} + +void MultiPlayerGameMode::adjustPlayer(shared_ptr player) +{ + localPlayerMode->updatePlayerAbilities(&player->abilities); +} + +bool MultiPlayerGameMode::isCutScene() +{ + return false; +} + +void MultiPlayerGameMode::setLocalMode(GameType *mode) +{ + localPlayerMode = mode; + localPlayerMode->updatePlayerAbilities(&minecraft->player->abilities); +} + +void MultiPlayerGameMode::initPlayer(shared_ptr player) +{ + player->yRot = -180; +} + +bool MultiPlayerGameMode::canHurtPlayer() +{ + return localPlayerMode->isSurvival(); +} + +bool MultiPlayerGameMode::destroyBlock(int x, int y, int z, int face) +{ + if (localPlayerMode->isAdventureRestricted()) { + if (!minecraft->player->mayDestroyBlockAt(x, y, z)) { + return false; + } + } + + if (localPlayerMode->isCreative()) + { + if (minecraft->player->getCarriedItem() != NULL && dynamic_cast(minecraft->player->getCarriedItem()->getItem()) != NULL) + { + return false; + } + } + + Level *level = minecraft->level; + Tile *oldTile = Tile::tiles[level->getTile(x, y, z)]; + + if (oldTile == NULL) return false; + + 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->removeTile(x, y, z); + if (changed) + { + oldTile->destroy(level, x, y, z, data); + } + yDestroyBlock = -1; + + if (!localPlayerMode->isCreative()) + { + shared_ptr item = minecraft->player->getSelectedItem(); + if (item != NULL) + { + item->mineBlock(level, oldTile->id, x, y, z, minecraft->player); + if (item->count == 0) + { + minecraft->player->removeSelectedItem(); + } + } + } + + return changed; +} + +void MultiPlayerGameMode::startDestroyBlock(int x, int y, int z, int face) +{ + if(!minecraft->player->isAllowedToMine()) return; + + if (localPlayerMode->isAdventureRestricted()) + { + if (!minecraft->player->mayDestroyBlockAt(x, y, z)) + { + return; + } + } + + if (localPlayerMode->isCreative()) + { + connection->send(shared_ptr( new PlayerActionPacket(PlayerActionPacket::START_DESTROY_BLOCK, x, y, z, face) )); + creativeDestroyBlock(minecraft, this, x, y, z, face); + destroyDelay = 5; + } + else if (!isDestroying || !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<player->getCarriedItem(); + destroyProgress = 0; + destroyTicks = 0; + minecraft->level->destroyTileProgress(minecraft->player->entityId, xDestroyBlock, yDestroyBlock, zDestroyBlock, (int)(destroyProgress * 10) - 1); + } + } + +} + +void MultiPlayerGameMode::stopDestroyBlock() +{ + if (isDestroying) + { + connection->send(shared_ptr(new PlayerActionPacket(PlayerActionPacket::ABORT_DESTROY_BLOCK, xDestroyBlock, yDestroyBlock, zDestroyBlock, -1))); + } + + isDestroying = false; + destroyProgress = 0; + minecraft->level->destroyTileProgress(minecraft->player->entityId, xDestroyBlock, yDestroyBlock, zDestroyBlock, -1); +} + +void MultiPlayerGameMode::continueDestroyBlock(int x, int y, int z, int face) +{ + if(!minecraft->player->isAllowedToMine()) return; + ensureHasSentCarriedItem(); +// connection.send(new PlayerActionPacket(PlayerActionPacket.CONTINUE_DESTROY_BLOCK, x, y, z, face)); + + if (destroyDelay > 0) + { + destroyDelay--; + return; + } + + if (localPlayerMode->isCreative()) + { + destroyDelay = 5; + connection->send(shared_ptr( new PlayerActionPacket(PlayerActionPacket::START_DESTROY_BLOCK, x, y, z, face) ) ); + creativeDestroyBlock(minecraft, this, x, y, z, face); + return; + } + + if (sameDestroyTarget(x, y, z)) + { + int t = minecraft->level->getTile(x, y, z); + if (t == 0) + { + isDestroying = false; + return; + } + Tile *tile = Tile::tiles[t]; + + destroyProgress += tile->getDestroyProgress(minecraft->player, minecraft->player->level, x, y, z); + + if (destroyTicks % 4 == 0) + { + if (tile != NULL) + { + int iStepSound=tile->soundType->getStepSound(); + + minecraft->soundEngine->play(iStepSound, x + 0.5f, y + 0.5f, z + 0.5f, (tile->soundType->getVolume() + 1) / 8, tile->soundType->getPitch() * 0.5f); + } + } + + destroyTicks++; + + if (destroyProgress >= 1) + { + isDestroying = false; + connection->send( shared_ptr( new PlayerActionPacket(PlayerActionPacket::STOP_DESTROY_BLOCK, x, y, z, face) ) ); + destroyBlock(x, y, z, face); + destroyProgress = 0; + destroyTicks = 0; + destroyDelay = 5; + } + + minecraft->level->destroyTileProgress(minecraft->player->entityId, xDestroyBlock, yDestroyBlock, zDestroyBlock, (int)(destroyProgress * 10) - 1); + } + else + { + startDestroyBlock(x, y, z, face); + } + +} + +float MultiPlayerGameMode::getPickRange() +{ + if (localPlayerMode->isCreative()) + { + return 5.0f; + } + return 4.5f; +} + +void MultiPlayerGameMode::tick() +{ + ensureHasSentCarriedItem(); + //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; + if (newItem != carriedItem) + { + carriedItem = newItem; + connection->send( shared_ptr( new SetCarriedItemPacket(carriedItem) ) ); + } +} + +bool MultiPlayerGameMode::useItemOn(shared_ptr player, Level *level, shared_ptr item, int x, int y, int z, int face, Vec3 *hit, bool bTestUseOnly, bool *pbUsedItem) +{ + if( pbUsedItem ) *pbUsedItem = false; // Did we actually use the held item? + + // 4J-PB - Adding a test only version to allow tooltips to be displayed + if(!bTestUseOnly) + { + ensureHasSentCarriedItem(); + } + float clickX = (float) hit->x - x; + float clickY = (float) hit->y - y; + float clickZ = (float) hit->z - z; + bool didSomething = false; + + if (!player->isSneaking() || player->getCarriedItem() == NULL) + { + int t = level->getTile(x, y, z); + if (t > 0 && player->isAllowedToUse(Tile::tiles[t])) + { + if(bTestUseOnly) + { + switch(t) + { + 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; + } + } + } + + if (!didSomething && item != NULL && dynamic_cast(item->getItem())) + { + TileItem *tile = dynamic_cast(item->getItem()); + if (!tile->mayPlace(level, x, y, z, face, player, item)) return false; + } + + // 4J Stu - In Java we send the use packet before the above check for item being NULL + // so the following never gets executed but the packet still gets sent (for opening chests etc) + if(item != NULL) + { + if(!didSomething && player->isAllowedToUse(item)) + { + if (localPlayerMode->isCreative()) + { + int aux = item->getAuxValue(); + int count = item->count; + didSomething = item->useOn(player, level, x, y, z, face, clickX, clickY, clickZ, bTestUseOnly); + item->setAuxValue(aux); + item->count = count; + } + else + { + didSomething = item->useOn(player, level, x, y, z, face, clickX, clickY, clickZ, bTestUseOnly); + } + if( didSomething ) + { + if( pbUsedItem ) *pbUsedItem = true; + } + } + } + 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 + // are meant to be directly caused by this. If we don't do this, then the sounds never happen as the tile's use method is only called on the + // server, and that won't allow any sounds that are directly made, or broadcast back level events to us that would make the sound, since we are + // the source of the event. + if( ( t > 0 ) && ( !bTestUseOnly ) && player->isAllowedToUse(Tile::tiles[t]) ) + { + Tile::tiles[t]->use(level, x, y, z, player, face, clickX, clickY, clickZ, true); + } + } + + // 4J Stu - Do the action before we send the packet, so that our predicted count is sent in the packet and the server + // doesn't think it has to update us + // Fix for #7904 - Gameplay: Players can dupe torches by throwing them repeatedly into water. + if(!bTestUseOnly) + { + connection->send( shared_ptr( new UseItemPacket(x, y, z, face, player->inventory->getSelected(), clickX, clickY, clickZ) ) ); + } + return didSomething; +} + +bool MultiPlayerGameMode::useItem(shared_ptr player, Level *level, shared_ptr item, bool bTestUseOnly) +{ + if(!player->isAllowedToUse(item)) return false; + + // 4J-PB - Adding a test only version to allow tooltips to be displayed + if(!bTestUseOnly) + { + ensureHasSentCarriedItem(); + } + + // 4J Stu - Do the action before we send the packet, so that our predicted count is sent in the packet and the server + // doesn't think it has to update us, or can update us if we are wrong + // Fix for #13120 - Using a bucket of water or lava in the spawn area (centre of the map) causes the inventory to get out of sync + bool result = false; + + // 4J-PB added for tooltips to test use only + if(bTestUseOnly) + { + result = item->TestUse(item, level, player); + } + else + { + int oldCount = item->count; + shared_ptr itemInstance = item->use(level, player); + if ((itemInstance != NULL && itemInstance != item) || (itemInstance != NULL && itemInstance->count != oldCount)) + { + player->inventory->items[player->inventory->selected] = itemInstance; + if (itemInstance->count == 0) + { + player->inventory->items[player->inventory->selected] = nullptr; + } + result = true; + } + } + + if(!bTestUseOnly) + { + connection->send( shared_ptr( new UseItemPacket(-1, -1, -1, 255, player->inventory->getSelected(), 0, 0, 0) ) ); + } + return result; +} + +shared_ptr MultiPlayerGameMode::createPlayer(Level *level) +{ + return shared_ptr( new MultiplayerLocalPlayer(minecraft, level, minecraft->user, connection) ); +} + +void MultiPlayerGameMode::attack(shared_ptr player, shared_ptr entity) +{ + ensureHasSentCarriedItem(); + connection->send( shared_ptr( new InteractPacket(player->entityId, entity->entityId, InteractPacket::ATTACK) ) ); + player->attack(entity); +} + +bool MultiPlayerGameMode::interact(shared_ptr player, shared_ptr entity) +{ + ensureHasSentCarriedItem(); + connection->send(shared_ptr( new InteractPacket(player->entityId, entity->entityId, InteractPacket::INTERACT) ) ); + return player->interact(entity); +} + +shared_ptr MultiPlayerGameMode::handleInventoryMouseClick(int containerId, int slotNum, int buttonNum, bool quickKeyHeld, shared_ptr player) +{ + short changeUid = player->containerMenu->backup(player->inventory); + + shared_ptr clicked = player->containerMenu->clicked(slotNum, buttonNum, quickKeyHeld?AbstractContainerMenu::CLICK_QUICK_MOVE:AbstractContainerMenu::CLICK_PICKUP, player); + connection->send( shared_ptr( new ContainerClickPacket(containerId, slotNum, buttonNum, quickKeyHeld, clicked, changeUid) ) ); + + return clicked; +} + +void MultiPlayerGameMode::handleInventoryButtonClick(int containerId, int buttonId) +{ + connection->send(shared_ptr( new ContainerButtonClickPacket(containerId, buttonId) )); +} + +void MultiPlayerGameMode::handleCreativeModeItemAdd(shared_ptr clicked, int slot) +{ + if (localPlayerMode->isCreative()) + { + connection->send(shared_ptr( new SetCreativeModeSlotPacket(slot, clicked) ) ); + } +} + +void MultiPlayerGameMode::handleCreativeModeItemDrop(shared_ptr clicked) +{ + if (localPlayerMode->isCreative() && clicked != NULL) + { + connection->send(shared_ptr( new SetCreativeModeSlotPacket(-1, clicked) ) ); + } +} + +void MultiPlayerGameMode::releaseUsingItem(shared_ptr player) +{ + ensureHasSentCarriedItem(); + connection->send(shared_ptr( new PlayerActionPacket(PlayerActionPacket::RELEASE_USE_ITEM, 0, 0, 0, 255) ) ); + player->releaseUsingItem(); +} + +bool MultiPlayerGameMode::hasExperience() +{ + return localPlayerMode->isSurvival(); +} + +bool MultiPlayerGameMode::hasMissTime() +{ + return !localPlayerMode->isCreative(); +} + +bool MultiPlayerGameMode::hasInfiniteItems() +{ + return localPlayerMode->isCreative(); +} + +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); + + connection->send( shared_ptr( new CraftItemPacket(recipe, changeUid) ) ); + + return true; +} + +void MultiPlayerGameMode::handleDebugOptions(unsigned int uiVal, shared_ptr player) +{ + player->SetDebugOptions(uiVal); + connection->send( shared_ptr( new DebugOptionsPacket(uiVal) ) ); +} diff --git a/Minecraft.Client/MultiPlayerGameMode.h b/Minecraft.Client/MultiPlayerGameMode.h new file mode 100644 index 00000000..76aa8fc8 --- /dev/null +++ b/Minecraft.Client/MultiPlayerGameMode.h @@ -0,0 +1,69 @@ +#pragma once +#include "GameMode.h" +class ClientConnection; +class GameType; +class Vec3; + +class MultiPlayerGameMode +{ +private: + int xDestroyBlock; + int yDestroyBlock; + int zDestroyBlock; + shared_ptr destroyingItem; + float destroyProgress; + int destroyTicks; // 4J was float but doesn't seem to need to be + int destroyDelay; + bool isDestroying; + GameType *localPlayerMode; + ClientConnection *connection; + +protected: + Minecraft *minecraft; + +public: + MultiPlayerGameMode(Minecraft *minecraft, ClientConnection *connection); + static void creativeDestroyBlock(Minecraft *minecraft, MultiPlayerGameMode *gameMode, int x, int y, int z, int face); + void adjustPlayer(shared_ptr player); + bool isCutScene(); + void setLocalMode(GameType *mode); + virtual void initPlayer(shared_ptr player); + virtual bool canHurtPlayer(); + virtual bool destroyBlock(int x, int y, int z, int face); + virtual void startDestroyBlock(int x, int y, int z, int face); + virtual void stopDestroyBlock(); + virtual void continueDestroyBlock(int x, int y, int z, int face); + virtual float getPickRange(); + virtual void tick(); +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); + virtual bool useItem(shared_ptr player, Level *level, shared_ptr item, bool bTestUseOnly=false); + virtual shared_ptr createPlayer(Level *level); + virtual void attack(shared_ptr player, shared_ptr entity); + virtual bool interact(shared_ptr player, shared_ptr entity); + virtual shared_ptr handleInventoryMouseClick(int containerId, int slotNum, int buttonNum, bool quickKeyHeld, shared_ptr player); + virtual void handleInventoryButtonClick(int containerId, int buttonId); + virtual void handleCreativeModeItemAdd(shared_ptr clicked, int slot); + virtual void handleCreativeModeItemDrop(shared_ptr clicked); + virtual void releaseUsingItem(shared_ptr player); + virtual bool hasExperience(); + virtual bool hasMissTime(); + virtual bool hasInfiniteItems(); + virtual bool hasFarPickRange(); + 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); + virtual void handleDebugOptions(unsigned int uiVal, shared_ptr player); + + // 4J Stu - Added for tutorial checks + virtual bool isInputAllowed(int mapping) { return true; } + virtual bool isTutorial() { return false; } + virtual Tutorial *getTutorial() { return NULL; } +}; \ No newline at end of file diff --git a/Minecraft.Client/MultiPlayerLevel.cpp b/Minecraft.Client/MultiPlayerLevel.cpp new file mode 100644 index 00000000..5c27e450 --- /dev/null +++ b/Minecraft.Client/MultiPlayerLevel.cpp @@ -0,0 +1,959 @@ +#include "stdafx.h" +#include "MultiPlayerLevel.h" +#include "MultiPlayerLocalPlayer.h" +#include "ClientConnection.h" +#include "MultiPlayerChunkCache.h" +#include "..\Minecraft.World\net.minecraft.world.level.storage.h" +#include "..\Minecraft.World\net.minecraft.world.level.dimension.h" +#include "..\Minecraft.World\Pos.h" +#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; +} + +MultiPlayerLevel::MultiPlayerLevel(ClientConnection *connection, LevelSettings *levelSettings, int dimension, int difficulty) + : Level(shared_ptr(new MockedLevelStorage()), L"MpServer", Dimension::getNew(dimension), levelSettings, false) +{ + minecraft = Minecraft::GetInstance(); + + // 4J - this this used to be called in parent ctor via a virtual fn + chunkSource = createChunkSource(); + // 4J - optimisation - keep direct reference of underlying cache here + chunkSourceCache = chunkSource->getCache(); + chunkSourceXZSize = chunkSource->m_XZSize; + + // 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()) + { + initializeLevel(levelSettings); + levelData->setInitialized(true); + } + + if(connection !=NULL) + { + this->connections.push_back( connection ); + } + this->difficulty = difficulty; + // 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)); + // The base ctor already has made some storage, so need to delete that + if( this->savedDataStorage ) delete savedDataStorage; + if(connection !=NULL) + { + savedDataStorage = connection->savedDataStorage; + } + unshareCheckX = 0; + unshareCheckZ = 0; + compressCheckX = 0; + compressCheckZ = 0; + + // 4J Added, as there are some times when we don't want to add tile updates to the updatesToReset vector + m_bEnableResetChanges = true; +} + +MultiPlayerLevel::~MultiPlayerLevel() +{ + // Don't let the base class delete this, it comes from the connection for multiplayerlevels, and we'll delete there + this->savedDataStorage = NULL; +} + +void MultiPlayerLevel::unshareChunkAt(int x, int z) +{ + if( g_NetworkManager.IsHost() ) + { + Level::getChunkAt(x,z)->stopSharingTilesAndData(); + } +} + +void MultiPlayerLevel::shareChunkAt(int x, int z) +{ + if( g_NetworkManager.IsHost() ) + { + Level::getChunkAt(x,z)->startSharingTilesAndData(); + } +} + + +void MultiPlayerLevel::tick() +{ + PIXBeginNamedEvent(0,"Sky color changing"); + setGameTime(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<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++) + { + shared_ptr e = *(reEntries.begin()); + + if (find(entities.begin(), entities.end(), e) == entities.end() ) addEntity(e); + } + LeaveCriticalSection(&m_entitiesCS); + PIXEndNamedEvent(); + + PIXBeginNamedEvent(0,"Connection ticking"); + // 4J HEG - Copy the connections vector to prevent crash when moving to Nether + vector connectionsTemp = connections; + for(AUTO_VAR(connection, connectionsTemp.begin()); connection < connectionsTemp.end(); ++connection ) + { + (*connection)->tick(); + } + PIXEndNamedEvent(); + + PIXBeginNamedEvent(0,"Updating resets"); + unsigned int lastIndexToRemove = 0; + bool eraseElements = false; + for (unsigned int i = 0; i < updatesToReset.size(); i++) + { + ResetInfo& r = updatesToReset[i]; + if (--r.ticks == 0) + { + 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) + { + updatesToReset.erase(updatesToReset.begin(), updatesToReset.begin()+lastIndexToRemove); + } + PIXEndNamedEvent(); + + chunkCache->tick(); + tickTiles(); + + // 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() ) + { + if( Level::reallyHasChunk(unshareCheckX - ( ls / 2), unshareCheckZ - ( ls / 2 ) ) ) + { + LevelChunk *lc = Level::getChunk(unshareCheckX - ( ls / 2), unshareCheckZ - ( ls / 2 )); + if( g_NetworkManager.IsHost() ) + { + lc->startSharingTilesAndData(1000 * 60 * 2); + } + } + + unshareCheckX++; + if( unshareCheckX >= ls ) + { + unshareCheckX = 0; + unshareCheckZ++; + if( unshareCheckZ >= ls ) + { + unshareCheckZ = 0; + } + } + } + + // 4J added - also similar thing tosee if we can compress the lighting in any of these chunks. This is slightly different + // as it does try to make sure that at least one chunk has something done to it. + + // At most loop round at least one row the chunks, so we should be able to at least find a non-empty chunk to do something with in 2.7 seconds of ticks, and process the whole thing in about 2.4 minutes. + for( int i = 0; i < ls; i++ ) + { + compressCheckX++; + if( compressCheckX >= ls ) + { + compressCheckX = 0; + compressCheckZ++; + if( compressCheckZ >= ls ) + { + compressCheckZ = 0; + } + } + + if( Level::reallyHasChunk(compressCheckX - ( ls / 2), compressCheckZ - ( ls / 2 ) ) ) + { + LevelChunk *lc = Level::getChunk(compressCheckX - ( ls / 2), compressCheckZ - ( ls / 2 )); + lc->compressLighting(); + lc->compressBlocks(); + lc->compressData(); + break; + } + } + +#ifdef LIGHT_COMPRESSION_STATS + static int updateTick = 0; + + if( ( updateTick % 60 ) == 0 ) + { + unsigned int totalBLu = 0; + unsigned int totalBLl = 0; + unsigned int totalSLu = 0; + unsigned int totalSLl = 0; + unsigned int totalChunks = 0; + + for( int lcs_x = 0; lcs_x < ls; lcs_x++ ) + for( int lcs_z = 0; lcs_z < ls; lcs_z++ ) + { + if( Level::reallyHasChunk(lcs_x - ( ls / 2), lcs_z - ( ls / 2 ) ) ) + { + LevelChunk *lc = Level::getChunk(lcs_x - ( ls / 2), lcs_z - ( ls / 2 )); + totalChunks++; + totalBLu += lc->getBlockLightPlanesUpper(); + totalBLl += lc->getBlockLightPlanesLower(); + totalSLu += lc->getSkyLightPlanesUpper(); + totalSLl += lc->getSkyLightPlanesLower(); + } + } + 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) ); + } + } + updateTick++; + +#endif + +#ifdef DATA_COMPRESSION_STATS + static int updateTick = 0; + + if( ( updateTick % 60 ) == 0 ) + { + unsigned int totalData = 0; + unsigned int totalChunks = 0; + + for( int lcs_x = 0; lcs_x < ls; lcs_x++ ) + for( int lcs_z = 0; lcs_z < ls; lcs_z++ ) + { + if( Level::reallyHasChunk(lcs_x - ( ls / 2), lcs_z - ( ls / 2 ) ) ) + { + LevelChunk *lc = Level::getChunk(lcs_x - ( ls / 2), lcs_z - ( ls / 2 )); + totalChunks++; + totalData += lc->getDataPlanes(); + } + } + 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) ); + } + } + updateTick++; + +#endif + +#ifdef BLOCK_COMPRESSION_STATS + static int updateTick = 0; + + if( ( updateTick % 60 ) == 0 ) + { + unsigned int total = 0; + unsigned int totalChunks = 0; + unsigned int total0 = 0, total1 = 0, total2 = 0, total4 = 0, total8 = 0; + + printf("*****************************************************************************************************************************************\n"); + printf("TODO: Report upper chunk data as well\n"); + for( int lcs_x = 0; lcs_x < ls; lcs_x++ ) + for( int lcs_z = 0; lcs_z < ls; lcs_z++ ) + { + if( Level::reallyHasChunk(lcs_x - ( ls / 2), lcs_z - ( ls / 2 ) ) ) + { + LevelChunk *lc = Level::getChunk(lcs_x - ( ls / 2), lcs_z - ( ls / 2 )); + totalChunks++; + int i0, i1, i2, i4, i8; + int thisSize = lc->getBlocksAllocatedSize(&i0, &i1, &i2, &i4, &i8); + total0 += i0; + total1 += i1; + total2 += i2; + total4 += i4; + total8 += i8; + printf("%d ",thisSize); + thisSize = ( thisSize + 0xfff ) & 0xfffff000; // round to 4096k blocks for actual memory consumption + 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("%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(); + +} + +void MultiPlayerLevel::clearResetRegion(int x0, int y0, int z0, int x1, int y1, int z1) +{ + 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) + { + updatesToReset.erase(updatesToReset.begin()+i); + i--; + } + } +} + +ChunkSource *MultiPlayerLevel::createChunkSource() +{ + chunkCache = new MultiPlayerChunkCache(this); + + return chunkCache; +} + +void MultiPlayerLevel::validateSpawn() +{ + // 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)); +} + +void MultiPlayerLevel::tickTiles() +{ + chunksToPoll.clear(); // 4J - added or else we don't reset this set at all in a multiplayer level... think current java now resets in buildAndPrepareChunksToPoll rather than the calling functions + + PIXBeginNamedEvent(0,"Ticking tiles (multiplayer)"); + PIXBeginNamedEvent(0,"buildAndPrepareChunksToPoll"); + Level::tickTiles(); + PIXEndNamedEvent(); + + PIXBeginNamedEvent(0,"Ticking client side tiles"); +#ifdef __PSVITA__ + // AP - see CustomSet.h for and explanation + for( int i = 0;i < chunksToPoll.end();i += 1 ) + { + ChunkPos cp = chunksToPoll.get(i); +#else + AUTO_VAR(itEndCtp, chunksToPoll.end()); + for (AUTO_VAR(it, chunksToPoll.begin()); it != itEndCtp; it++) + { + ChunkPos cp = *it; +#endif + int xo = cp.x * 16; + int zo = cp.z * 16; + + LevelChunk *lc = getChunk(cp.x, cp.z); + + tickClientSideTiles(xo, zo, lc); + } + PIXEndNamedEvent(); + PIXEndNamedEvent(); +} + +void MultiPlayerLevel::setChunkVisible(int x, int z, bool visible) +{ + if (visible) + { + chunkCache->create(x, z); + } + else + { + chunkCache->drop(x, z); + } + if (!visible) + { + 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); + + if (!ok) + { + reEntries.insert(e); + } + + return ok; +} + +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()) + { + reEntries.erase(it); + } + + Level::removeEntity(e); + forced.erase(e); +} + +void MultiPlayerLevel::entityAdded(shared_ptr e) +{ + Level::entityAdded(e); + AUTO_VAR(it, reEntries.find(e)); + if (it!=reEntries.end()) + { + reEntries.erase(it); + } +} + +void MultiPlayerLevel::entityRemoved(shared_ptr e) +{ + Level::entityRemoved(e); + AUTO_VAR(it, forced.find(e)); + if (it!=forced.end()) + { + reEntries.insert(e); + } +} + +void MultiPlayerLevel::putEntity(int id, shared_ptr e) +{ + shared_ptr old = getEntity(id); + if (old != NULL) + { + removeEntity(old); + } + + forced.insert(e); + e->entityId = id; + if (!addEntity(e)) + { + reEntries.insert(e); + } + entitiesById[id] = e; +} + +shared_ptr MultiPlayerLevel::getEntity(int id) +{ + AUTO_VAR(it, entitiesById.find(id)); + if( it == entitiesById.end() ) return nullptr; + return it->second; +} + +shared_ptr MultiPlayerLevel::removeEntity(int id) +{ + shared_ptr e; + AUTO_VAR(it, entitiesById.find(id)); + if( it != entitiesById.end() ) + { + e = it->second; + entitiesById.erase(it); + forced.erase(e); + removeEntity(e); + } + else + { + } + return e; +} + +// 4J Added to remove the entities from the forced list +// This gets called when a chunk is unloaded, but we only do half an unload to remove entities slightly differently +void MultiPlayerLevel::removeEntities(vector > *list) +{ + for(AUTO_VAR(it, list->begin()); it < list->end(); ++it) + { + shared_ptr e = *it; + + AUTO_VAR(reIt, reEntries.find(e)); + if (reIt!=reEntries.end()) + { + reEntries.erase(reIt); + } + + forced.erase(e); + } + Level::removeEntities(list); +} + +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 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 ) ) + { + // 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::setTileAndData(x, y, z, tile, data, updateFlags)) + { + //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); + + // 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 ) ) ) ); + // 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, Tile::UPDATE_ALL) || g_NetworkManager.IsHost() ) ) + { + if( g_NetworkManager.IsHost() && visuallyImportant ) + { + // 4J Stu - This got removed from the tileUpdated function in TU14. Adding it back here as we need it + // to handle the cases where the chunk data is shared so the normal paths never call this + sendTileUpdated(x,y,z); + + tileUpdated(x, y, z, tile); + } + return true; + } + return false; +} + +void MultiPlayerLevel::disconnect(bool sendDisconnect /*= true*/) +{ + if( sendDisconnect ) + { + for(AUTO_VAR(it, connections.begin()); it < connections.end(); ++it ) + { + (*it)->sendAndDisconnect( shared_ptr( new DisconnectPacket(DisconnectPacket::eDisconnect_Quitting) ) ); + } + } + else + { + for(AUTO_VAR(it, connections.begin()); it < connections.end(); ++it ) + { + (*it)->close(); + } + } +} + +Tickable *MultiPlayerLevel::makeSoundUpdater(shared_ptr minecart) +{ + return NULL; //new MinecartSoundUpdater(minecraft->soundEngine, minecart, minecraft->player); +} + +void MultiPlayerLevel::tickWeather() +{ + if (dimension->hasCeiling) return; + + oRainLevel = rainLevel; + if (levelData->isRaining()) + { + rainLevel += 0.01; + } + else + { + rainLevel -= 0.01; + } + if (rainLevel < 0) rainLevel = 0; + if (rainLevel > 1) rainLevel = 1; + + oThunderLevel = thunderLevel; + if (levelData->isThundering()) + { + thunderLevel += 0.01; + } + else + { + thunderLevel -= 0.01; + } + if (thunderLevel < 0) thunderLevel = 0; + if (thunderLevel > 1) thunderLevel = 1; + +} + +void MultiPlayerLevel::animateTick(int xt, int yt, int zt) +{ + // Get 8x8x8 chunk (ie not like the renderer or game chunks... maybe we need another word here...) that the player is in + // We then want to add a 3x3 region of chunks into a set that we'll be ticking over. Set is stored as unsigned ints which encode + // this chunk position + int cx = xt >> 3; + int cy = yt >> 3; + int cz = zt >> 3; + + for( int xx = -1; xx <= 1; xx++ ) + for( int yy = -1; yy <= 1; yy++ ) + for( int zz = -1; zz <= 1; zz++ ) + { + if( ( cy + yy ) < 0 ) continue; + if( ( cy + yy ) > 15 ) continue; + // Note - LEVEL_MAX_WIDTH is in game (16) tile chunks, and so our level goes from -LEVEL_MAX_WIDTH to LEVEL_MAX_WIDTH of our half-sized chunks + if( ( cx + xx ) >= LEVEL_MAX_WIDTH ) continue; + if( ( cx + xx ) < -LEVEL_MAX_WIDTH ) continue; + if( ( cz + zz ) >= LEVEL_MAX_WIDTH ) continue; + if( ( cz + zz ) < -LEVEL_MAX_WIDTH ) continue; + chunksToAnimate.insert( ( ( ( cx + xx ) & 0xff ) << 16 ) | ( ( ( cy + yy ) & 0xff ) << 8 ) | ( ( ( cz + zz ) & 0xff ) ) ); + } +} + +// 4J - the game used to tick 1000 tiles in a random region +/- 16 units round the player. We've got a 3x3 region of 8x8x8 chunks round each +// player. So the original game was ticking 1000 things in a 32x32x32 region ie had about a 1 in 32 chance of updating any one tile per tick. +// We're not dealing with quite such a big region round each player (24x24x24) but potentially we've got 4 players. Ultimately, we could end +// up ticking anywhere between 432 and 1728 tiles depending on how many players we've got, which seems like a good tradeoff from the original. +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. + Minecraft::GetInstance()->animateTickLevel = this; + + MemSect(31); + Random *animateRandom = new Random(); + MemSect(0); + + for( int i = 0; i < ticksPerChunk; i++ ) + { + for( AUTO_VAR(it, chunksToAnimate.begin()); it != chunksToAnimate.end(); it++ ) + { + int packed = *it; + int cx = ( packed << 8 ) >> 24; + int cy = ( packed << 16 ) >> 24; + int cz = ( packed << 24 ) >> 24; + cx <<= 3; + cy <<= 3; + cz <<= 3; + int x = cx + random->nextInt(8); + int y = cy + random->nextInt(8); + int z = cz + random->nextInt(8); + 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); + } + else if (t > 0) + { + Tile::tiles[t]->animateTick(this, x, y, z, animateRandom); + } + } + } + + Minecraft::GetInstance()->animateTickLevel = NULL; + delete animateRandom; + + chunksToAnimate.clear(); + +} + +void MultiPlayerLevel::playSound(shared_ptr entity, int iSound, float volume, float pitch) +{ + 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, bool distanceDelay/*= false */, float fClipSoundDist) +{ + //float dd = 16; + if (volume > 1) fClipSoundDist *= volume; + + // 4J - find min distance to any players rather than just the current one + float minDistSq = FLT_MAX; + for( int i = 0; i < XUSER_MAX_COUNT; i++ ) + { + if( minecraft->localplayers[i] ) + { + float distSq = minecraft->localplayers[i]->distanceToSqr(x, y, z ); + if( distSq < minDistSq ) + { + minDistSq = distSq; + } + } + } + + if (minDistSq < fClipSoundDist * fClipSoundDist) + { + 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); + + EnterCriticalSection(&m_entitiesCS); + for( AUTO_VAR(it, entities.begin()); it != entities.end(); ) + { + bool found = false; + for( AUTO_VAR(it2, entitiesToRemove.begin()); it2 != entitiesToRemove.end(); it2++ ) + { + if( (*it) == (*it2) ) + { + found = true; + break; + } + } + if( found ) + { + it = entities.erase(it); + } + else + { + it++; + } + } + LeaveCriticalSection(&m_entitiesCS); + + AUTO_VAR(endIt, entitiesToRemove.end()); + for (AUTO_VAR(it, entitiesToRemove.begin()); it != endIt; it++) + { + shared_ptr e = *it; + int xc = e->xChunk; + int zc = e->zChunk; + if (e->inChunk && hasChunk(xc, zc)) + { + getChunk(xc, zc)->removeEntity(e); + } + } + + // 4J Stu - Is there a reason do this in a separate loop? Thats what the Java does... + endIt = entitiesToRemove.end(); + for (AUTO_VAR(it, entitiesToRemove.begin()); it != endIt; it++) + { + entityRemoved(*it); + } + entitiesToRemove.clear(); + + //for (int i = 0; i < entities.size(); i++) + EnterCriticalSection(&m_entitiesCS); + vector >::iterator it = entities.begin(); + while( it != entities.end() ) + { + shared_ptr e = *it;//entities.at(i); + + if (e->riding != NULL) + { + if (e->riding->removed || e->riding->rider.lock() != e) + { + e->riding->rider = weak_ptr(); + e->riding = nullptr; + } + else + { + ++it; + continue; + } + } + + if (e->removed) + { + int xc = e->xChunk; + int zc = e->zChunk; + if (e->inChunk && hasChunk(xc, zc)) + { + getChunk(xc, zc)->removeEntity(e); + } + //entities.remove(i--); + + it = entities.erase( it ); + entityRemoved(e); + } + else + { + it++; + } + } + LeaveCriticalSection(&m_entitiesCS); +} + +void MultiPlayerLevel::removeClientConnection(ClientConnection *c, bool sendDisconnect) +{ + if( sendDisconnect ) + { + c->sendAndDisconnect( shared_ptr( new DisconnectPacket(DisconnectPacket::eDisconnect_Quitting) ) ); + } + + AUTO_VAR(it, find( connections.begin(), connections.end(), c )); + if( it != connections.end() ) + { + connections.erase( it ); + } +} + +void MultiPlayerLevel::tickAllConnections() +{ + PIXBeginNamedEvent(0,"Connection ticking"); + for(AUTO_VAR(it, connections.begin()); it < connections.end(); ++it ) + { + (*it)->tick(); + } + PIXEndNamedEvent(); +} + +void MultiPlayerLevel::dataReceivedForChunk(int x, int z) +{ + chunkCache->dataReceived(x, z); +} + +// 4J added - removes all tile entities in the given region from both level & levelchunks +void MultiPlayerLevel::removeUnusedTileEntitiesInRegion(int x0, int y0, int z0, int x1, int y1, int z1) +{ + EnterCriticalSection(&m_tileEntityListCS); + + 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) + { + LevelChunk *lc = getChunk(te->x >> 4, te->z >> 4); + if (lc != NULL) + { + // Only remove tile entities where this is no longer a tile entity + int tileId = lc->getTile(te->x & 15, te->y, te->z & 15 ); + if( Tile::tiles[tileId] == NULL || !Tile::tiles[tileId]->isEntityTile()) + { + tileEntityList[i] = tileEntityList.back(); + tileEntityList.pop_back(); + + // 4J Stu - Chests can create new tile entities when being removed, so disable this + m_bDisableAddNewTileEntities = true; + lc->removeTileEntity(te->x & 15, te->y, te->z & 15); + m_bDisableAddNewTileEntities = false; + removed = true; + } + } + } + if( !removed ) i++; + } + + LeaveCriticalSection(&m_tileEntityListCS); +} + diff --git a/Minecraft.Client/MultiPlayerLevel.h b/Minecraft.Client/MultiPlayerLevel.h new file mode 100644 index 00000000..6e5b0086 --- /dev/null +++ b/Minecraft.Client/MultiPlayerLevel.h @@ -0,0 +1,107 @@ +#pragma once +using namespace std; +#include "..\Minecraft.World\HashExtension.h" +#include "..\Minecraft.World\net.minecraft.world.level.h" +#include "..\Minecraft.World\net.minecraft.world.entity.h" +#include "..\Minecraft.World\JavaIntHash.h" + +class ClientConnection; +class MultiPlayerChunkCache; + +using namespace std; + +class MultiPlayerLevel : public Level +{ +private: + static const int TICKS_BEFORE_RESET = 20 * 4; + + class ResetInfo + { + public: + 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 +public: + void unshareChunkAt(int x, int z); // 4J - added + void shareChunkAt(int x, int z); // 4J - added + + void enableResetChanges(bool enable) { m_bEnableResetChanges = enable; } // 4J Added +private: + int unshareCheckX; // 4J - added + 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; + Minecraft *minecraft; + Scoreboard *scoreboard; + +public: + MultiPlayerLevel(ClientConnection *connection, LevelSettings *levelSettings, int dimension, int difficulty); + virtual ~MultiPlayerLevel(); + 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 +public: + virtual void validateSpawn(); +protected: + virtual void tickTiles(); +public: + void setChunkVisible(int x, int z, bool visible); + +private: + unordered_map, IntKeyHash2, IntKeyEq> entitiesById; // 4J - was IntHashMap + unordered_set > forced; + unordered_set > reEntries; + +public: + virtual bool addEntity(shared_ptr e); + virtual void removeEntity(shared_ptr e); +protected: + virtual void entityAdded(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); + virtual void removeEntities(vector > *list); // 4J Added override + 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: + void animateTickDoWork(); // 4J added + unordered_set chunksToAnimate; // 4J added + +public: + void removeAllPendingEntityRemovals(); + + 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, 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 ); } + void removeClientConnection(ClientConnection *c, bool sendDisconnect); + + void tickAllConnections(); + + void dataReceivedForChunk(int x, int z); // 4J added + void removeUnusedTileEntitiesInRegion(int x0, int y0, int z0, int x1, int y1, int z1); // 4J added +}; diff --git a/Minecraft.Client/MultiPlayerLocalPlayer.cpp b/Minecraft.Client/MultiPlayerLocalPlayer.cpp new file mode 100644 index 00000000..25bf06bf --- /dev/null +++ b/Minecraft.Client/MultiPlayerLocalPlayer.cpp @@ -0,0 +1,486 @@ +#include "stdafx.h" +//#include "..\Minecraft.World\JavaMath.h" +#include "MultiplayerLocalPlayer.h" +#include "ClientConnection.h" +#include "..\Minecraft.World\net.minecraft.world.level.h" +#include "..\Minecraft.World\net.minecraft.network.h" +#include "..\Minecraft.World\Mth.h" +#include "..\Minecraft.World\AABB.h" +#include "..\Minecraft.World\net.minecraft.stats.h" +#include "..\Minecraft.World\net.minecraft.world.inventory.h" +#include "..\Minecraft.World\net.minecraft.world.level.dimension.h" +#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) +{ + // 4J - added initialisers + flashOnSetHealth = false; + xLast = yLast1 = yLast2 = zLast = 0; + yRotLast = xRotLast = 0; + lastOnGround = false; + lastSneaked = false; + lastIdle = false; + lastSprinting = false; + positionReminder = 0; + + this->connection = connection; +} + +bool MultiplayerLocalPlayer::hurt(DamageSource *source, float dmg) +{ + return false; +} + +void MultiplayerLocalPlayer::heal(float heal) +{ +} + +void MultiplayerLocalPlayer::tick() +{ + // 4J Added + // 4J-PB - changing this to a game host option ot hide gamertags + //bool bIsisPrimaryHost=g_NetworkManager.IsHost() && (ProfileManager.GetPrimaryPad()==m_iPad); + + /*if((app.GetGameSettings(m_iPad,eGameSetting_PlayerVisibleInMap)!=0) != m_bShownOnMaps) + { + m_bShownOnMaps = (app.GetGameSettings(m_iPad,eGameSetting_PlayerVisibleInMap)!=0); + if (m_bShownOnMaps) connection->send( shared_ptr( new PlayerCommandPacket(shared_from_this(), PlayerCommandPacket::SHOW_ON_MAPS) ) ); + else connection->send( shared_ptr( new PlayerCommandPacket(shared_from_this(), PlayerCommandPacket::HIDE_ON_MAPS) ) ); + }*/ + + if (!level->hasChunkAt(Mth::floor(x), 0, Mth::floor(z))) return; + + double tempX = x, tempY = y, tempZ = z; + + LocalPlayer::tick(); + + // 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)) + { + 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 + { + //app.Debugprintf("Cannot move to position (%f, %f, %f), falling back to (%f, %f, %f)\n", x, y, z, tempX, y, tempZ); + this->setPos(tempX, y, tempZ); + } +} + +void MultiplayerLocalPlayer::sendPosition() +{ + bool sprinting = isSprinting(); + if (sprinting != lastSprinting) + { + if (sprinting) connection->send(shared_ptr( new PlayerCommandPacket(shared_from_this(), PlayerCommandPacket::START_SPRINTING))); + else connection->send(shared_ptr( new PlayerCommandPacket(shared_from_this(), PlayerCommandPacket::STOP_SPRINTING))); + + lastSprinting = sprinting; + } + + bool sneaking = isSneaking(); + if (sneaking != lastSneaked) + { + if (sneaking) connection->send( shared_ptr( new PlayerCommandPacket(shared_from_this(), PlayerCommandPacket::START_SNEAKING) ) ); + else connection->send( shared_ptr( new PlayerCommandPacket(shared_from_this(), PlayerCommandPacket::STOP_SNEAKING) ) ); + + lastSneaked = sneaking; + } + + bool idle = isIdle(); + if (idle != lastIdle) + { + if (idle) connection->send( shared_ptr( new PlayerCommandPacket(shared_from_this(), PlayerCommandPacket::START_IDLEANIM) ) ); + else connection->send( shared_ptr( new PlayerCommandPacket(shared_from_this(), PlayerCommandPacket::STOP_IDLEANIM) ) ); + + lastIdle = idle; + } + + double xdd = x - xLast; + double ydd1 = bb->y0 - yLast1; + double zdd = z - zLast; + + double rydd = yRot - yRotLast; + double rxdd = xRot - xRotLast; + + bool move = (xdd * xdd + ydd1 * ydd1 + zdd * zdd) > 0.03 * 0.03 || positionReminder >= POSITION_REMINDER_INTERVAL; + bool rot = rydd != 0 || rxdd != 0; + if (riding != NULL) + { + connection->send( shared_ptr( new MovePlayerPacket::PosRot(xd, -999, -999, zd, yRot, xRot, onGround, abilities.flying) ) ); + move = false; + } + else + { + if (move && rot) + { + connection->send( shared_ptr( new MovePlayerPacket::PosRot(x, bb->y0, y, z, yRot, xRot, onGround, abilities.flying) ) ); + } + else if (move) + { + connection->send( shared_ptr( new MovePlayerPacket::Pos(x, bb->y0, y, z, onGround, abilities.flying) ) ); + } + else if (rot) + { + connection->send( shared_ptr( new MovePlayerPacket::Rot(yRot, xRot, onGround, abilities.flying) ) ); + } + else + { + connection->send( shared_ptr( new MovePlayerPacket(onGround, abilities.flying) ) ); + } + } + + positionReminder++; + lastOnGround = onGround; + + if (move) + { + xLast = x; + yLast1 = bb->y0; + yLast2 = y; + zLast = z; + positionReminder = 0; + } + if (rot) + { + yRotLast = yRot; + xRotLast = xRot; + } + +} + +shared_ptr MultiplayerLocalPlayer::drop() +{ + connection->send( shared_ptr( new PlayerActionPacket(PlayerActionPacket::DROP_ITEM, 0, 0, 0, 0) ) ); + return nullptr; +} + +void MultiplayerLocalPlayer::reallyDrop(shared_ptr itemEntity) +{ +} + +void MultiplayerLocalPlayer::chat(const wstring& message) +{ + connection->send( shared_ptr( new ChatPacket(message) ) ); +} + +void MultiplayerLocalPlayer::swing() +{ + LocalPlayer::swing(); + connection->send( shared_ptr( new AnimatePacket(shared_from_this(), AnimatePacket::SWING) ) ); + +} + +void MultiplayerLocalPlayer::respawn() +{ + connection->send( shared_ptr( new ClientCommandPacket(ClientCommandPacket::PERFORM_RESPAWN))); +} + + +void MultiplayerLocalPlayer::actuallyHurt(DamageSource *source, float dmg) +{ + if (isInvulnerable()) return; + setHealth(getHealth() - dmg); +} + +// 4J Added override to capture event for tutorial messages +void MultiplayerLocalPlayer::completeUsingItem() +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + if(useItem != NULL && pMinecraft->localgameModes[m_iPad] != NULL ) + { + TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[m_iPad]; + Tutorial *tutorial = gameMode->getTutorial(); + tutorial->completeUsingItem(useItem); + } + Player::completeUsingItem(); +} + +void MultiplayerLocalPlayer::onEffectAdded(MobEffectInstance *effect) +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + if(pMinecraft->localgameModes[m_iPad] != NULL ) + { + TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[m_iPad]; + Tutorial *tutorial = gameMode->getTutorial(); + tutorial->onEffectChanged(MobEffect::effects[effect->getId()]); + } + Player::onEffectAdded(effect); +} + + +void MultiplayerLocalPlayer::onEffectUpdated(MobEffectInstance *effect, bool doRefreshAttributes) +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + if(pMinecraft->localgameModes[m_iPad] != NULL ) + { + TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[m_iPad]; + Tutorial *tutorial = gameMode->getTutorial(); + tutorial->onEffectChanged(MobEffect::effects[effect->getId()]); + } + Player::onEffectUpdated(effect, doRefreshAttributes); +} + + +void MultiplayerLocalPlayer::onEffectRemoved(MobEffectInstance *effect) +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + if(pMinecraft->localgameModes[m_iPad] != NULL ) + { + TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[m_iPad]; + Tutorial *tutorial = gameMode->getTutorial(); + tutorial->onEffectChanged(MobEffect::effects[effect->getId()],true); + } + Player::onEffectRemoved(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(float newHealth, ETelemetryChallenges damageSource) +{ + if (flashOnSetHealth) + { + LocalPlayer::hurtTo(newHealth, damageSource); + } + else + { + setHealth(newHealth); + flashOnSetHealth = true; + } +} + +void MultiplayerLocalPlayer::awardStat(Stat *stat, byteArray param) +{ + if (stat == NULL) + { + delete [] param.data; + return; + } + + if (stat->awardLocallyOnly) + { + LocalPlayer::awardStat(stat, param); + } + else + { + delete [] param.data; + return; + } +} + +void MultiplayerLocalPlayer::awardStatFromServer(Stat *stat, byteArray param) +{ + if ( stat != NULL && !stat->awardLocallyOnly ) + { + LocalPlayer::awardStat(stat, param); + } + else delete [] param.data; +} + +void MultiplayerLocalPlayer::onUpdateAbilities() +{ + connection->send(shared_ptr(new PlayerAbilitiesPacket(&abilities))); +} + +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; + if( this->riding != NULL ) + { + switch(riding->GetType()) + { + case eTYPE_BOAT: + eventType = eTelemetryInGame_Ride_Boat; + break; + case eTYPE_MINECART: + eventType = eTelemetryInGame_Ride_Minecart; + break; + case eTYPE_PIG: + eventType = eTelemetryInGame_Ride_Pig; + break; + }; + } + TelemetryManager->RecordEnemyKilledOrOvercome(GetXboxPad(), 0, y, 0, 0, 0, 0, eventType); + } + + updateRichPresence(); + + Minecraft *pMinecraft = Minecraft::GetInstance(); + + if( pMinecraft->localgameModes[m_iPad] != NULL ) + { + TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[m_iPad]; + if(wasRiding && !isRiding) + { + gameMode->getTutorial()->changeTutorialState(e_Tutorial_State_Gameplay); + } + else if (!wasRiding && isRiding) + { + gameMode->getTutorial()->onRideEntity(e); + } + } +} + +void MultiplayerLocalPlayer::StopSleeping() +{ + connection->send( shared_ptr( new PlayerCommandPacket(shared_from_this(), PlayerCommandPacket::STOP_SLEEPING) ) ); +} + +// 4J Added +void MultiplayerLocalPlayer::setAndBroadcastCustomSkin(DWORD skinId) +{ + DWORD oldSkinIndex = getCustomSkin(); + LocalPlayer::setCustomSkin(skinId); +#ifndef _CONTENT_PACKAGE + wprintf(L"Skin for local player %ls has changed to %ls (%d)\n", name.c_str(), customTextureUrl.c_str(), getPlayerDefaultSkin() ); +#endif + if(getCustomSkin() != oldSkinIndex) connection->send( shared_ptr( new TextureAndGeometryChangePacket( shared_from_this(), app.GetPlayerSkinName(GetXboxPad()) ) ) ); +} + +void MultiplayerLocalPlayer::setAndBroadcastCustomCape(DWORD capeId) +{ + DWORD oldCapeIndex = getCustomCape(); + LocalPlayer::setCustomCape(capeId); +#ifndef _CONTENT_PACKAGE + wprintf(L"Cape for local player %ls has changed to %ls\n", name.c_str(), customTextureUrl2.c_str()); +#endif + if(getCustomCape() != oldCapeIndex) connection->send( 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 new file mode 100644 index 00000000..e660a96a --- /dev/null +++ b/Minecraft.Client/MultiPlayerLocalPlayer.h @@ -0,0 +1,87 @@ +#pragma once +#include "LocalPlayer.h" +#include "..\Minecraft.World\SharedConstants.h" + +class ClientConnection; +class Minecraft; +class Level; + +//#define STRESS_TEST_MOVE + +class MultiplayerLocalPlayer : public LocalPlayer +{ +private: + static const int POSITION_REMINDER_INTERVAL = SharedConstants::TICKS_PER_SECOND; +public: + ClientConnection *connection; +private: + bool flashOnSetHealth; +public: + MultiplayerLocalPlayer(Minecraft *minecraft, Level *level, User *user, ClientConnection *connection); +private: + double xLast, yLast1, yLast2, zLast; + float yRotLast, xRotLast; +public: + virtual bool hurt(DamageSource *source, float dmg); + virtual void heal(float heal); + virtual void tick(); +private: + bool lastOnGround; + bool lastSneaked; + bool lastIdle; + bool lastSprinting; + int positionReminder; +public: + void sendPosition(); + + using Player::drop; + virtual shared_ptr drop(); +protected: + virtual void reallyDrop(shared_ptr itemEntity); +public: + virtual void chat(const wstring& message); + virtual void swing(); + virtual void respawn(); +protected: + 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, bool doRefreshAttributes); + virtual void onEffectRemoved(MobEffectInstance *effect); +public: + virtual void closeContainer(); + 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); + + // 4J Overriding this so we can flag an event for the tutorial + virtual void ride(shared_ptr e); + + // 4J - added for the Stop Sleeping + virtual void StopSleeping(); + + // 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 new file mode 100644 index 00000000..b5f9ba9f --- /dev/null +++ b/Minecraft.Client/MushroomCowRenderer.cpp @@ -0,0 +1,58 @@ +#include "stdafx.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) +{ +} + +void MushroomCowRenderer::render(shared_ptr _mob, double x, double y, double z, float rot, float a) +{ + // 4J - original version used generics and thus had an input parameter of type MushroomCow rather than shared_ptr we have here - + // do some casting around instead + //shared_ptr mob = dynamic_pointer_cast(_mob); + + // 4J Stu - No need to do the cast, just pass through as-is + MobRenderer::render(_mob, x, y, z, rot, a); +} + +void MushroomCowRenderer::additionalRendering(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(&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::mushroom_red, 0, 1); + glTranslatef(0.1f, 0, -0.6f); + glRotatef(42, 0, 1, 0); + tileRenderer->renderTile(Tile::mushroom_red, 0, 1); + glPopMatrix(); + + glPushMatrix(); + ((QuadrupedModel *) model)->head->translateTo(1 / 16.0f); + glScalef(1, -1, 1); + glTranslatef(0, 0.75f, -0.2f); + glRotatef(12, 0, 1, 0); + 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 new file mode 100644 index 00000000..69dc1dd7 --- /dev/null +++ b/Minecraft.Client/MushroomCowRenderer.h @@ -0,0 +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 ResourceLocation *getTextureLocation(shared_ptr mob); +}; \ No newline at end of file diff --git a/Minecraft.Client/NameEntryScreen.cpp b/Minecraft.Client/NameEntryScreen.cpp new file mode 100644 index 00000000..c9df7024 --- /dev/null +++ b/Minecraft.Client/NameEntryScreen.cpp @@ -0,0 +1,78 @@ +#include "stdafx.h" +#include "NameEntryScreen.h" +#include "Button.h" +#include "..\Minecraft.World\StringHelpers.h" + +const wstring NameEntryScreen::allowedChars = L"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 ,.:-_'*!\"#%/()=+?[]{}<>"; + +NameEntryScreen::NameEntryScreen(Screen *lastScreen, const wstring& oldName, int slot) +{ + frame = 0; // 4J added + + this->lastScreen = lastScreen; + this->slot = slot; + this->name = oldName; + if (name==L"-") name = L""; +} + +void NameEntryScreen::init() +{ + buttons.clear(); + Keyboard::enableRepeatEvents(true); + buttons.push_back(new Button(0, width / 2 - 100, height / 4 + 24 * 5, L"Save")); + buttons.push_back(new Button(1, width / 2 - 100, height / 4 + 24 * 6, L"Cancel")); + buttons[0]->active = trimString(name).length() > 1; +} + +void NameEntryScreen::removed() +{ + Keyboard::enableRepeatEvents(false); +} + +void NameEntryScreen::tick() +{ + frame++; +} + +void NameEntryScreen::buttonClicked(Button button) +{ + if (!button.active) return; + + if (button.id == 0 && trimString(name).length() > 1) + { + minecraft->saveSlot(slot, trimString(name)); + minecraft->setScreen(NULL); +// minecraft->grabMouse(); // 4J - removed + } + if (button.id == 1) + { + minecraft->setScreen(lastScreen); + } +} + +void NameEntryScreen::keyPressed(wchar_t ch, int eventKey) +{ + if (eventKey == Keyboard::KEY_BACK && name.length() > 0) name = name.substr(0, name.length() - 1); + if (allowedChars.find(ch) != wstring::npos && name.length()<64) + { + name += ch; + } + buttons[0]->active = trimString(name).length() > 1; +} + +void NameEntryScreen::render(int xm, int ym, float a) +{ + renderBackground(); + + drawCenteredString(font, title, width / 2, 40, 0xffffff); + + int bx = width / 2 - 100; + int by = height / 2 - 10; + int bw = 200; + int bh = 20; + fill(bx - 1, by - 1, bx + bw + 1, by + bh + 1, 0xffa0a0a0); + fill(bx, by, bx + bw, by + bh, 0xff000000); + drawString(font, name + (frame / 6 % 2 == 0 ? L"_" : L""), bx + 4, by + (bh - 8) / 2, 0xe0e0e0); + + Screen::render(xm, ym, a); +} \ No newline at end of file diff --git a/Minecraft.Client/NameEntryScreen.h b/Minecraft.Client/NameEntryScreen.h new file mode 100644 index 00000000..7507748a --- /dev/null +++ b/Minecraft.Client/NameEntryScreen.h @@ -0,0 +1,27 @@ +#pragma once +#include "Screen.h" + +class NameEntryScreen : public Screen +{ +private: + Screen *lastScreen; +protected: + wstring title; +private: + int slot; + wstring name; + int frame; +public: + NameEntryScreen(Screen *lastScreen, const wstring& oldName, int slot); + virtual void init(); + virtual void removed(); + virtual void tick(); +protected: + virtual void buttonClicked(Button button); +private: + static const wstring allowedChars; +protected: + virtual void keyPressed(wchar_t ch, int eventKey); +public: + virtual void render(int xm, int ym, float a); +}; \ No newline at end of file diff --git a/Minecraft.Client/NetherPortalParticle.cpp b/Minecraft.Client/NetherPortalParticle.cpp new file mode 100644 index 00000000..4b70d38f --- /dev/null +++ b/Minecraft.Client/NetherPortalParticle.cpp @@ -0,0 +1,99 @@ +#include "stdafx.h" +#include "NetherPortalParticle.h" +#include "..\Minecraft.World\JavaMath.h" +#include "..\Minecraft.World\Random.h" +#include "Minecraft.h" + +// 4J Stu - This class was originally "PortalParticle" but I have split the two uses of the particle +// Only the nether portal uses this particle + +NetherPortalParticle::NetherPortalParticle(Level *level, double x, double y, double z, double xd, double yd, double zd) : Particle(level, x, y, z, xd, yd, zd) +{ + this->xd = xd; + this->yd = yd; + this->zd = zd; + this->xStart = this->x = x; + this->yStart = this->y = y; + this->zStart = this->z = z; + + float br = random->nextFloat()*0.6f+0.4f; + oSize = size = random->nextFloat()*0.2f+0.5f; + //rCol = gCol = bCol = 1.0f*br; + //gCol *= 0.3f; + //rCol *= 0.9f; + + // Default colour (0.9f, 0.3f, 1.0f) + // 0xE64DFF + + unsigned int colour = Minecraft::GetInstance()->getColourTable()->getColor( eMinecraftColour_Particle_NetherPortal ); + int r = (colour>>16)&0xFF; + int g = (colour>>8)&0xFF; + int b = colour&0xFF; + rCol = (r/255.0f)*br; + gCol = (g/255.0f)*br; + bCol = (b/255.0f)*br; + + lifetime = (int) (Math::random()*10) + 40; + noPhysics = true; + setMiscTex((int)(Math::random()*8)); +} + +void NetherPortalParticle::render(Tesselator *t, float a, float xa, float ya, float za, float xa2, float za2) +{ + float s = (age + a) / (float) lifetime; + s = 1-s; + s = s*s; + s = 1-s; + size = oSize * (s); + Particle::render(t, a, xa, ya, za, xa2, za2); +} + +// 4J - brought forward from 1.8.2 +int NetherPortalParticle::getLightColor(float a) +{ + int br = Particle::getLightColor(a); + + float pos = age/(float)lifetime; + pos = pos*pos; + pos = pos*pos; + + int br1 = (br) & 0xff; + int br2 = (br >> 16) & 0xff; + br2 += (int) (pos * 15 * 16); + if (br2 > 15 * 16) br2 = 15 * 16; + return br1 | br2 << 16; +} + +float NetherPortalParticle::getBrightness(float a) +{ + float br = Particle::getBrightness(a); + float pos = age/(float)lifetime; + pos = pos*pos; + pos = pos*pos; + return br*(1-pos)+pos; +} + +void NetherPortalParticle::tick() +{ + xo = x; + yo = y; + zo = z; + + float pos = age/(float)lifetime; + float a = pos; + pos = -pos+pos*pos*2; +// pos = pos*pos; +// pos = pos*pos; + pos = 1-pos; + + x = xStart+xd*pos; + y = yStart+yd*pos+(1-a); + z = zStart+zd*pos; + + +// spd+=0.002/lifetime*age; + + if (age++ >= lifetime) remove(); + +// move(xd*spd, yd*spd, zd*spd); +} diff --git a/Minecraft.Client/NetherPortalParticle.h b/Minecraft.Client/NetherPortalParticle.h new file mode 100644 index 00000000..85aa8c66 --- /dev/null +++ b/Minecraft.Client/NetherPortalParticle.h @@ -0,0 +1,21 @@ +#pragma once +#include "Particle.h" + +// 4J Stu - This class was originally "PortalParticle" but I have split the two uses of the particle +// Only the nether portal uses this particle + +class NetherPortalParticle : public Particle +{ +public: + virtual eINSTANCEOF GetType() { return eType_NETHERPORTALPARTICLE; } +private: + float oSize; + double xStart, yStart, zStart; + +public: + NetherPortalParticle(Level *level, double x, double y, double z, double xd, double yd, double zd); + virtual void render(Tesselator *t, float a, float xa, float ya, float za, float xa2, float za2); + virtual int getLightColor(float a); // 4J - brought forward from 1.8.2 + virtual float getBrightness(float a); + virtual void tick(); +}; \ No newline at end of file diff --git a/Minecraft.Client/Network Implementation Notes.txt b/Minecraft.Client/Network Implementation Notes.txt new file mode 100644 index 00000000..e482952c --- /dev/null +++ b/Minecraft.Client/Network Implementation Notes.txt @@ -0,0 +1,45 @@ +NETWORK CODE IMPLEMENTATION NOTES +--------------------------------- + +The networking classes are organised as follows: + + Game \ + ^ | + | | + +-----------------------------+-----------------------------+ | + | | | + v v | +Game Network Manager <--------------------------------> Network Player Interface |- platform independent layers + ^ ^ | + | | | + v | | +Platform Network Manager Interface | | + ^ | / + | | + v v \ +Platform Network Manager Implementation(1) <------> Network Player Implementation (3) | + ^ ^ |_ platform specific layers + | | | + v v | +Platform specific network code(2) Platform specific player code (4) / + + +In general the game should only communicate with the GameNetworkManager and NetworkPlayerInterface APIs, which provide a platform independent +interface for networking functionality. The GameNetworkManager may in general have code which is aware of the game itself, but it shouldn't have +any platform-specific networking code. It communicates with a platform specific implementation of a PlatformNetworkManagerInterface to achieve this. + +The platform specific layers shouldn't contain any general game code, as this is much better placed in the platform independent layers to avoid +duplicating effort. + +Platform specific files for each platform for the numbered classes in the previous diagram are currently: + + + Xbox 360 Sony Other + +(1) PlatformNetworkManagerXbox PlatformNetworkManagerSony PlatformNetworkManagerStub +(2) Provided by QNET SQRNetworkManager Qnet stub* +(3) NetworkPlayerXbox NetworkPlayerSony NetworkPlayerXbox +(4) Provided by QNET SQRNetworkPlayer Qnet stub* + + *temporarily provided by extra64.h + diff --git a/Minecraft.Client/NoteParticle.cpp b/Minecraft.Client/NoteParticle.cpp new file mode 100644 index 00000000..2e2320c8 --- /dev/null +++ b/Minecraft.Client/NoteParticle.cpp @@ -0,0 +1,87 @@ +#include "stdafx.h" +#include "..\Minecraft.World\Mth.h" +#include "NoteParticle.h" + +void NoteParticle::init(Level *level, double x, double y, double z, double xa, double ya, double za, float scale) +{ + xd *= 0.01f; + yd *= 0.01f; + zd *= 0.01f; + yd += 0.2; + + /* + unsigned int cMin = Minecraft::GetInstance()->getColourTable()->getColor( eMinecraftColour_Particle_NoteMin ); + unsigned int cMax = Minecraft::GetInstance()->getColourTable()->getColor( eMinecraftColour_Particle_NoteMax ); + double rMin = ( (cMin>>16)&0xFF )/255.0f, gMin = ( (cMin>>8)&0xFF )/255.0, bMin = ( cMin&0xFF )/255.0; + double rMax = ( (cMax>>16)&0xFF )/255.0f, gMax = ( (cMax>>8)&0xFF )/255.0, bMax = ( cMax&0xFF )/255.0; + + rCol = Mth::sin(((float) xa + 0.0f / 3) * PI * 2) * (rMax - rMin) + rMin; + gCol = Mth::sin(((float) xa + 1.0f / 3) * PI * 2) * (gMax - gMin) + gMin; + bCol = Mth::sin(((float) xa + 2.0f / 3) * PI * 2) * (bMax - bMin) + bMin; + */ + + // 4J-JEV: Added, + // There are 24 valid colours for this particle input through the 'xa' field (0.0-1.0). + int note = (int) floor(0.5 + (xa*24.0)) + (int) eMinecraftColour_Particle_Note_00; + unsigned int col = Minecraft::GetInstance()->getColourTable()->getColor( (eMinecraftColour) note ); + + rCol = ( (col>>16)&0xFF )/255.0; + gCol = ( (col>>8)&0xFF )/255.0; + bCol = ( col&0xFF )/255.0; + + size *= 0.75f; + size *= scale; + oSize = size; + + lifetime = 6; + noPhysics = false; + + + setMiscTex(16 * 4); +} + +NoteParticle::NoteParticle(Level *level, double x, double y, double z, double xa, double ya, double za) : Particle(level, x, y, z, 0, 0, 0) +{ + init(level, x, y, z, xa, ya, za, 2); +} + +NoteParticle::NoteParticle(Level *level, double x, double y, double z, double xa, double ya, double za, float scale) : Particle(level, x, y, z, 0, 0, 0) +{ + init(level, x, y, z, xa, ya, za, scale); +} + +void NoteParticle::render(Tesselator *t, float a, float xa, float ya, float za, float xa2, float za2) +{ + float l = ((age + a) / lifetime) * 32; + if (l < 0) l = 0; + if (l > 1) l = 1; + + size = oSize * l; + Particle::render(t, a, xa, ya, za, xa2, za2); +} + +void NoteParticle::tick() +{ + xo = x; + yo = y; + zo = z; + + if (age++ >= lifetime) remove(); + + move(xd, yd, zd); + if (y == yo) + { + xd *= 1.1; + zd *= 1.1; + } + xd *= 0.66f; + yd *= 0.66f; + zd *= 0.66f; + + if (onGround) + { + xd *= 0.7f; + zd *= 0.7f; + } + +} diff --git a/Minecraft.Client/NoteParticle.h b/Minecraft.Client/NoteParticle.h new file mode 100644 index 00000000..b53910b8 --- /dev/null +++ b/Minecraft.Client/NoteParticle.h @@ -0,0 +1,16 @@ +#pragma once +#include "Particle.h" + +class NoteParticle : public Particle +{ +public: + virtual eINSTANCEOF GetType() { return eType_NOTEPARTICLE; } +private: + void init(Level *level, double x, double y, double z, double xa, double ya, double za, float scale); // 4J - added +public: + NoteParticle(Level *level, double x, double y, double z, double xa, double ya, double za); + float oSize; + NoteParticle(Level *level, double x, double y, double z, double xa, double ya, double za, float scale); + virtual void render(Tesselator *t, float a, float xa, float ya, float za, float xa2, float za2); + virtual void tick(); +}; diff --git a/Minecraft.Client/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/OffsettedRenderList.cpp b/Minecraft.Client/OffsettedRenderList.cpp new file mode 100644 index 00000000..729d26f9 --- /dev/null +++ b/Minecraft.Client/OffsettedRenderList.cpp @@ -0,0 +1,65 @@ +#include "stdafx.h" +#include "..\Minecraft.World\IntBuffer.h" +#include "OffsettedRenderList.h" + +// 4J added +OffsettedRenderList::OffsettedRenderList() +{ + x = y = z = 0; + xOff = yOff = zOff = 0; + lists = MemoryTracker::createIntBuffer(1024 * 64); + inited = false; + rendered = false; +} + +void OffsettedRenderList::init(int x, int y, int z, double xOff, double yOff, double zOff) +{ + inited = true; + lists->clear(); + this->x = x; + this->y = y; + this->z = z; + + this->xOff = (float) xOff; + this->yOff = (float) yOff; + this->zOff = (float) zOff; +} + +bool OffsettedRenderList::isAt(int x, int y, int z) +{ + if (!inited) return false; + return x == this->x && y == this->y && z == this->z; +} + +void OffsettedRenderList::add(int list) +{ + // 4J - added - chunkList::getList returns -1 when chunks aren't visible, we really don't want to end up sending that to glCallLists + if( list >= 0 ) + { + lists->put(list); + } + if (lists->remaining() == 0) render(); +} + +void OffsettedRenderList::render() +{ + if (!inited) return; + if (!rendered) + { + lists->flip(); + rendered = true; + } + if (lists->remaining() > 0) + { + glPushMatrix(); + glTranslatef(x - xOff, y - yOff, z - zOff); + glCallLists(lists); + glPopMatrix(); + } +} + +void OffsettedRenderList::clear() +{ + inited = false; + rendered = false; +} \ No newline at end of file diff --git a/Minecraft.Client/OffsettedRenderList.h b/Minecraft.Client/OffsettedRenderList.h new file mode 100644 index 00000000..c989da31 --- /dev/null +++ b/Minecraft.Client/OffsettedRenderList.h @@ -0,0 +1,21 @@ +#pragma once + +class IntBuffer; + +class OffsettedRenderList +{ +private: + int x, y, z; + float xOff, yOff, zOff; + IntBuffer *lists; + bool inited; + bool rendered ; + +public: + OffsettedRenderList(); // 4J added + void init(int x, int y, int z, double xOff, double yOff, double zOff); + bool isAt(int x, int y, int z); + void add(int list); + void render(); + void clear(); +}; \ No newline at end of file diff --git a/Minecraft.Client/Options.cpp b/Minecraft.Client/Options.cpp new file mode 100644 index 00000000..9952fc8c --- /dev/null +++ b/Minecraft.Client/Options.cpp @@ -0,0 +1,525 @@ +#include "stdafx.h" +#include "Options.h" +#include "KeyMapping.h" +#include "LevelRenderer.h" +#include "Textures.h" +#include "..\Minecraft.World\net.minecraft.locale.h" +#include "..\Minecraft.World\Language.h" +#include "..\Minecraft.World\File.h" +#include "..\Minecraft.World\BufferedReader.h" +#include "..\Minecraft.World\DataInputStream.h" +#include "..\Minecraft.World\InputStreamReader.h" +#include "..\Minecraft.World\FileInputStream.h" +#include "..\Minecraft.World\FileOutputStream.h" +#include "..\Minecraft.World\DataOutputStream.h" +#include "..\Minecraft.World\StringHelpers.h" + +// 4J - the Option sub-class used to be an java enumerated type, trying to emulate that functionality here +const Options::Option Options::Option::options[17] = +{ + Options::Option(L"options.music", true, false), + Options::Option(L"options.sound", true, false), + Options::Option(L"options.invertMouse", false, true), + Options::Option(L"options.sensitivity", true, false), + Options::Option(L"options.renderDistance", false, false), + Options::Option(L"options.viewBobbing", false, true), + Options::Option(L"options.anaglyph", false, true), + Options::Option(L"options.advancedOpengl", false, true), + Options::Option(L"options.framerateLimit", false, false), + Options::Option(L"options.difficulty", false, false), + Options::Option(L"options.graphics", false, false), + Options::Option(L"options.ao", false, true), + Options::Option(L"options.guiScale", false, false), + Options::Option(L"options.fov", true, false), + Options::Option(L"options.gamma", true, false), + Options::Option(L"options.renderClouds",false, true), + Options::Option(L"options.particles", false, false), +}; + +const Options::Option *Options::Option::MUSIC = &Options::Option::options[0]; +const Options::Option *Options::Option::SOUND = &Options::Option::options[1]; +const Options::Option *Options::Option::INVERT_MOUSE = &Options::Option::options[2]; +const Options::Option *Options::Option::SENSITIVITY = &Options::Option::options[3]; +const Options::Option *Options::Option::RENDER_DISTANCE = &Options::Option::options[4]; +const Options::Option *Options::Option::VIEW_BOBBING = &Options::Option::options[5]; +const Options::Option *Options::Option::ANAGLYPH = &Options::Option::options[6]; +const Options::Option *Options::Option::ADVANCED_OPENGL = &Options::Option::options[7]; +const Options::Option *Options::Option::FRAMERATE_LIMIT = &Options::Option::options[8]; +const Options::Option *Options::Option::DIFFICULTY = &Options::Option::options[9]; +const Options::Option *Options::Option::GRAPHICS = &Options::Option::options[10]; +const Options::Option *Options::Option::AMBIENT_OCCLUSION = &Options::Option::options[11]; +const Options::Option *Options::Option::GUI_SCALE = &Options::Option::options[12]; +const Options::Option *Options::Option::FOV = &Options::Option::options[13]; +const Options::Option *Options::Option::GAMMA = &Options::Option::options[14]; +const Options::Option *Options::Option::RENDER_CLOUDS = &Options::Option::options[15]; +const Options::Option *Options::Option::PARTICLES = &Options::Option::options[16]; + + +const Options::Option *Options::Option::getItem(int id) +{ + return &options[id]; +} + +Options::Option::Option(const wstring& captionId, bool hasProgress, bool isBoolean) : _isProgress(hasProgress), _isBoolean(isBoolean), captionId(captionId) +{ +} + +bool Options::Option::isProgress() const +{ + return _isProgress; +} + +bool Options::Option::isBoolean() const +{ + return _isBoolean; +} + +int Options::Option::getId() const +{ + return (int)(this-options); +} + +wstring Options::Option::getCaptionId() const +{ + return captionId; +} + +const wstring Options::RENDER_DISTANCE_NAMES[] = +{ + L"options.renderDistance.far", L"options.renderDistance.normal", L"options.renderDistance.short", L"options.renderDistance.tiny" +}; +const wstring Options::DIFFICULTY_NAMES[] = +{ + L"options.difficulty.peaceful", L"options.difficulty.easy", L"options.difficulty.normal", L"options.difficulty.hard" +}; +const wstring Options::GUI_SCALE[] = +{ + L"options.guiScale.auto", L"options.guiScale.small", L"options.guiScale.normal", L"options.guiScale.large" +}; +const wstring Options::FRAMERATE_LIMITS[] = +{ + L"performance.max", L"performance.balanced", L"performance.powersaver" +}; + +const wstring Options::PARTICLES[] = { + L"options.particles.all", L"options.particles.decreased", L"options.particles.minimal" +}; + +// 4J added +void Options::init() +{ + music = 1; + sound = 1; + sensitivity = 0.5f; + invertYMouse = false; + viewDistance = 0; + bobView = true; + anaglyph3d = false; + advancedOpengl = false; + framerateLimit = 2; + fancyGraphics = true; + ambientOcclusion = true; + renderClouds = true; + skin = L"Default"; + + keyUp = new KeyMapping(L"key.forward", Keyboard::KEY_W); + keyLeft = new KeyMapping(L"key.left", Keyboard::KEY_A); + keyDown = new KeyMapping(L"key.back", Keyboard::KEY_S); + keyRight = new KeyMapping(L"key.right", Keyboard::KEY_D); + keyJump = new KeyMapping(L"key.jump", Keyboard::KEY_SPACE); + keyBuild = new KeyMapping(L"key.inventory", Keyboard::KEY_E); + keyDrop = new KeyMapping(L"key.drop", Keyboard::KEY_Q); + keyChat = new KeyMapping(L"key.chat", Keyboard::KEY_T); + keySneak = new KeyMapping(L"key.sneak", Keyboard::KEY_LSHIFT); + keyAttack = new KeyMapping(L"key.attack", -100 + 0); + keyUse = new KeyMapping(L"key.use", -100 + 1); + keyPlayerList = new KeyMapping(L"key.playerlist", Keyboard::KEY_TAB); + keyPickItem = new KeyMapping(L"key.pickItem", -100 + 2); + keyToggleFog = new KeyMapping(L"key.fog", Keyboard::KEY_F); + + keyMappings[0] = keyAttack; + keyMappings[1] = keyUse; + keyMappings[2] = keyUp; + keyMappings[3] = keyLeft; + keyMappings[4] = keyDown; + keyMappings[5] = keyRight; + keyMappings[6] = keyJump; + keyMappings[7] = keySneak; + keyMappings[8] = keyDrop; + keyMappings[9] = keyBuild; + keyMappings[10] = keyChat; + keyMappings[11] = keyPlayerList; + keyMappings[12] = keyPickItem; + keyMappings[13] = keyToggleFog; + + minecraft = NULL; + //optionsFile = NULL; + + difficulty = 2; + hideGui = false; + thirdPersonView = false; + renderDebug = false; + lastMpIp = L""; + + isFlying = false; + smoothCamera = false; + fixedCamera = false; + flySpeed = 1; + cameraSpeed = 1; + guiScale = 0; + particles = 0; + fov = 0; + gamma = 0; +} + +Options::Options(Minecraft *minecraft, File workingDirectory) +{ + init(); + this->minecraft = minecraft; + optionsFile = File(workingDirectory, L"options.txt"); +} + +Options::Options() +{ + init(); +} + +wstring Options::getKeyDescription(int i) +{ + Language *language = Language::getInstance(); + return language->getElement(keyMappings[i]->name); +} + +wstring Options::getKeyMessage(int i) +{ + int key = keyMappings[i]->key; + if (key < 0) { + return I18n::get(L"key.mouseButton", key + 101); + } else { + return Keyboard::getKeyName(keyMappings[i]->key); + } +} + +void Options::setKey(int i, int key) +{ + keyMappings[i]->key = key; + save(); +} + +void Options::set(const Options::Option *item, float fVal) +{ + if (item == Option::MUSIC) + { + music = fVal; +#ifdef _XBOX + minecraft->soundEngine->updateMusicVolume(fVal*2.0f); +#else + minecraft->soundEngine->updateMusicVolume(fVal); +#endif + } + if (item == Option::SOUND) + { + sound = fVal; +#ifdef _XBOX + minecraft->soundEngine->updateSoundEffectVolume(fVal*2.0f); +#else + minecraft->soundEngine->updateSoundEffectVolume(fVal); +#endif + } + if (item == Option::SENSITIVITY) + { + sensitivity = fVal; + } + if (item == Option::FOV) + { + fov = fVal; + } + if (item == Option::GAMMA) + { + gamma = fVal; + } +} + +void Options::toggle(const Options::Option *option, int dir) +{ + if (option == Option::INVERT_MOUSE) invertYMouse = !invertYMouse; + if (option == Option::RENDER_DISTANCE) viewDistance = (viewDistance + dir) & 3; + if (option == Option::GUI_SCALE) guiScale = (guiScale + dir) & 3; + if (option == Option::PARTICLES) particles = (particles + dir) % 3; + + // 4J-PB - changing + //if (option == Option::VIEW_BOBBING) bobView = !bobView; + if (option == Option::VIEW_BOBBING) ((dir==0)?bobView=false: bobView=true); + if (option == Option::RENDER_CLOUDS) renderClouds = !renderClouds; + if (option == Option::ADVANCED_OPENGL) + { + advancedOpengl = !advancedOpengl; + minecraft->levelRenderer->allChanged(); + } + if (option == Option::ANAGLYPH) + { + anaglyph3d = !anaglyph3d; + minecraft->textures->reloadAll(); + } + if (option == Option::FRAMERATE_LIMIT) framerateLimit = (framerateLimit + dir + 3) % 3; + + // 4J-PB - Change for Xbox + //if (option == Option::DIFFICULTY) difficulty = (difficulty + dir) & 3; + if (option == Option::DIFFICULTY) difficulty = (dir) & 3; + + app.DebugPrintf("Option::DIFFICULTY = %d",difficulty); + + if (option == Option::GRAPHICS) + { + fancyGraphics = !fancyGraphics; + minecraft->levelRenderer->allChanged(); + } + if (option == Option::AMBIENT_OCCLUSION) + { + ambientOcclusion = !ambientOcclusion; + minecraft->levelRenderer->allChanged(); + } + + // 4J-PB - don't do the file save on the xbox + // save(); + +} + +float Options::getProgressValue(const Options::Option *item) +{ + if (item == Option::FOV) return fov; + if (item == Option::GAMMA) return gamma; + if (item == Option::MUSIC) return music; + if (item == Option::SOUND) return sound; + if (item == Option::SENSITIVITY) return sensitivity; + return 0; +} + +bool Options::getBooleanValue(const Options::Option *item) +{ + // 4J - was a switch statement which we can't do with our Option:: pointer types + if( item == Option::INVERT_MOUSE) return invertYMouse; + if( item == Option::VIEW_BOBBING) return bobView; + if( item == Option::ANAGLYPH) return anaglyph3d; + if( item == Option::ADVANCED_OPENGL) return advancedOpengl; + if( item == Option::AMBIENT_OCCLUSION) return ambientOcclusion; + if( item == Option::RENDER_CLOUDS) return renderClouds; + return false; +} + +wstring Options::getMessage(const Options::Option *item) +{ + // 4J TODO, should these wstrings append rather than add? + + Language *language = Language::getInstance(); + wstring caption = language->getElement(item->getCaptionId()) + L": "; + + if (item->isProgress()) + { + float progressValue = getProgressValue(item); + + if (item == Option::SENSITIVITY) + { + if (progressValue == 0) + { + return caption + language->getElement(L"options.sensitivity.min"); + } + if (progressValue == 1) + { + return caption + language->getElement(L"options.sensitivity.max"); + } + return caption + _toString((int) (progressValue * 200)) + L"%"; + } else if (item == Option::FOV) + { + if (progressValue == 0) + { + return caption + language->getElement(L"options.fov.min"); + } + if (progressValue == 1) + { + return caption + language->getElement(L"options.fov.max"); + } + return caption + _toString((int) (70 + progressValue * 40)); + } else if (item == Option::GAMMA) + { + if (progressValue == 0) + { + return caption + language->getElement(L"options.gamma.min"); + } + if (progressValue == 1) + { + return caption + language->getElement(L"options.gamma.max"); + } + return caption + L"+" + _toString((int) (progressValue * 100)) + L"%"; + } + else + { + if (progressValue == 0) + { + return caption + language->getElement(L"options.off"); + } + return caption + _toString((int) (progressValue * 100)) + L"%"; + } + } else if (item->isBoolean()) + { + + bool booleanValue = getBooleanValue(item); + if (booleanValue) + { + return caption + language->getElement(L"options.on"); + } + return caption + language->getElement(L"options.off"); + } + else if (item == Option::RENDER_DISTANCE) + { + return caption + language->getElement(RENDER_DISTANCE_NAMES[viewDistance]); + } + else if (item == Option::DIFFICULTY) + { + return caption + language->getElement(DIFFICULTY_NAMES[difficulty]); + } + else if (item == Option::GUI_SCALE) + { + return caption + language->getElement(GUI_SCALE[guiScale]); + } + else if (item == Option::PARTICLES) + { + return caption + language->getElement(PARTICLES[particles]); + } + else if (item == Option::FRAMERATE_LIMIT) + { + return caption + I18n::get(FRAMERATE_LIMITS[framerateLimit]); + } + else if (item == Option::GRAPHICS) + { + if (fancyGraphics) + { + return caption + language->getElement(L"options.graphics.fancy"); + } + return caption + language->getElement(L"options.graphics.fast"); + } + + return caption; + +} + +void Options::load() +{ + // 4J - removed try/catch +// try { + if (!optionsFile.exists()) return; + // 4J - was new BufferedReader(new FileReader(optionsFile)); + BufferedReader *br = new BufferedReader(new InputStreamReader( new FileInputStream( optionsFile ) ) ); + + wstring line = L""; + while ((line = br->readLine()) != L"") // 4J - was check against NULL - do we need to distinguish between empty lines and a fail here? + { + // 4J - removed try/catch +// try { + wstring cmds[2]; + int splitpos = (int)line.find(L":"); + if( splitpos == wstring::npos ) + { + cmds[0] = line; + cmds[1] = L""; + } + else + { + cmds[0] = line.substr(0,splitpos); + cmds[1] = line.substr(splitpos,line.length()-splitpos); + } + + if (cmds[0] == L"music") music = readFloat(cmds[1]); + if (cmds[0] == L"sound") sound = readFloat(cmds[1]); + if (cmds[0] == L"mouseSensitivity") sensitivity = readFloat(cmds[1]); + if (cmds[0] == L"fov") fov = readFloat(cmds[1]); + if (cmds[0] == L"gamma") gamma = readFloat(cmds[1]); + if (cmds[0] == L"invertYMouse") invertYMouse = cmds[1]==L"true"; + if (cmds[0] == L"viewDistance") viewDistance = _fromString(cmds[1]); + if (cmds[0] == L"guiScale") guiScale =_fromString(cmds[1]); + if (cmds[0] == L"particles") particles = _fromString(cmds[1]); + if (cmds[0] == L"bobView") bobView = cmds[1]==L"true"; + if (cmds[0] == L"anaglyph3d") anaglyph3d = cmds[1]==L"true"; + if (cmds[0] == L"advancedOpengl") advancedOpengl = cmds[1]==L"true"; + if (cmds[0] == L"fpsLimit") framerateLimit = _fromString(cmds[1]); + if (cmds[0] == L"difficulty") difficulty = _fromString(cmds[1]); + if (cmds[0] == L"fancyGraphics") fancyGraphics = cmds[1]==L"true"; + if (cmds[0] == L"ao") ambientOcclusion = cmds[1]==L"true"; + if (cmds[0] == L"clouds") renderClouds = cmds[1]==L"true"; + if (cmds[0] == L"skin") skin = cmds[1]; + if (cmds[0] == L"lastServer") lastMpIp = cmds[1]; + + for (int i = 0; i < keyMappings_length; i++) + { + if (cmds[0] == (L"key_" + keyMappings[i]->name)) + { + keyMappings[i]->key = _fromString(cmds[1]); + } + } +// } catch (Exception e) { +// System.out.println("Skipping bad option: " + line); +// } + } + //KeyMapping.resetMapping(); // 4J Not implemented + br->close(); +// } catch (Exception e) { +// System.out.println("Failed to load options"); +// e.printStackTrace(); +// } + +} + +float Options::readFloat(wstring string) +{ + if (string == L"true") return 1; + if (string == L"false") return 0; + return _fromString(string); +} + +void Options::save() +{ + // 4J - try/catch removed +// try { + + // 4J - original used a PrintWriter & FileWriter, but seems a bit much implementing these just to do this + FileOutputStream fos = FileOutputStream(optionsFile); + DataOutputStream dos = DataOutputStream(&fos); +// PrintWriter pw = new PrintWriter(new FileWriter(optionsFile)); + + dos.writeChars(L"music:" + _toString(music) + L"\n"); + dos.writeChars(L"sound:" + _toString(sound) + L"\n"); + dos.writeChars(L"invertYMouse:" + wstring(invertYMouse ? L"true" : L"false") + L"\n"); + dos.writeChars(L"mouseSensitivity:" + _toString(sensitivity)); + dos.writeChars(L"fov:" + _toString(fov)); + dos.writeChars(L"gamma:" + _toString(gamma)); + dos.writeChars(L"viewDistance:" + _toString(viewDistance)); + dos.writeChars(L"guiScale:" + _toString(guiScale)); + dos.writeChars(L"particles:" + _toString(particles)); + dos.writeChars(L"bobView:" + wstring(bobView ? L"true" : L"false")); + dos.writeChars(L"anaglyph3d:" + wstring(anaglyph3d ? L"true" : L"false")); + dos.writeChars(L"advancedOpengl:" + wstring(advancedOpengl ? L"true" : L"false")); + dos.writeChars(L"fpsLimit:" + _toString(framerateLimit)); + dos.writeChars(L"difficulty:" + _toString(difficulty)); + dos.writeChars(L"fancyGraphics:" + wstring(fancyGraphics ? L"true" : L"false")); + dos.writeChars(L"ao:" + wstring(ambientOcclusion ? L"true" : L"false")); + dos.writeChars(L"clouds:" + _toString(renderClouds)); + dos.writeChars(L"skin:" + skin); + dos.writeChars(L"lastServer:" + lastMpIp); + + for (int i = 0; i < keyMappings_length; i++) + { + dos.writeChars(L"key_" + keyMappings[i]->name + L":" + _toString(keyMappings[i]->key)); + } + + dos.close(); +// } catch (Exception e) { +// System.out.println("Failed to save options"); +// e.printStackTrace(); +// } + +} + +bool Options::isCloudsOn() +{ + return viewDistance < 2 && renderClouds; +} \ No newline at end of file diff --git a/Minecraft.Client/Options.h b/Minecraft.Client/Options.h new file mode 100644 index 00000000..8be61ac6 --- /dev/null +++ b/Minecraft.Client/Options.h @@ -0,0 +1,132 @@ +#pragma once +using namespace std; +class Minecraft; +class KeyMapping; +#include "..\Minecraft.World\File.h" + +class Options +{ +public: + static const int AO_OFF = 0; + static const int AO_MIN = 1; + static const int AO_MAX = 2; + + // 4J - this used to be an enum + class Option + { + public: + static const Option options[17]; + static const Option *MUSIC; + static const Option *SOUND; + static const Option *INVERT_MOUSE; + static const Option *SENSITIVITY; + static const Option *RENDER_DISTANCE; + static const Option *VIEW_BOBBING; + static const Option *ANAGLYPH; + static const Option *ADVANCED_OPENGL; + static const Option *FRAMERATE_LIMIT; + static const Option *DIFFICULTY; + static const Option *GRAPHICS; + static const Option *AMBIENT_OCCLUSION; + static const Option *GUI_SCALE; + static const Option *FOV; + static const Option *GAMMA; + static const Option *RENDER_CLOUDS; + static const Option *PARTICLES; + + private: + const bool _isProgress; + const bool _isBoolean; + const wstring captionId; + + public: + static const Option *getItem(int id); + + Option(const wstring& captionId, bool hasProgress, bool isBoolean); + bool isProgress() const; + bool isBoolean() const; + int getId() const; + wstring getCaptionId() const; + }; + +private: + static const wstring RENDER_DISTANCE_NAMES[]; + static const wstring DIFFICULTY_NAMES[]; + static const wstring GUI_SCALE[]; + static const wstring FRAMERATE_LIMITS[]; + static const wstring PARTICLES[]; + +public: + float music; + float sound; + float sensitivity; + bool invertYMouse; + int viewDistance; + bool bobView; + bool anaglyph3d; + bool advancedOpengl; + int framerateLimit; + bool fancyGraphics; + bool ambientOcclusion; + bool renderClouds; + wstring skin; + + KeyMapping *keyUp; + KeyMapping *keyLeft; + KeyMapping *keyDown; + KeyMapping *keyRight; + KeyMapping *keyJump; + KeyMapping *keyBuild; + KeyMapping *keyDrop; + KeyMapping *keyChat; + KeyMapping *keySneak; + KeyMapping *keyAttack; + KeyMapping *keyUse; + KeyMapping *keyPlayerList; + KeyMapping *keyPickItem; + KeyMapping *keyToggleFog; + + static const int keyMappings_length = 14; + KeyMapping *keyMappings[keyMappings_length]; + +protected: + Minecraft *minecraft; +private: + File optionsFile; + +public: + int difficulty; + bool hideGui; + bool thirdPersonView; + bool renderDebug; + wstring lastMpIp; + + bool isFlying; + bool smoothCamera; + bool fixedCamera; + float flySpeed; + float cameraSpeed; + int guiScale; + int particles; // 0 is all, 1 is decreased and 2 is minimal + float fov; + float gamma; + + void init(); // 4J added + Options(Minecraft *minecraft, File workingDirectory); + Options(); + wstring getKeyDescription(int i); + wstring getKeyMessage(int i); + void setKey(int i, int key); + void set(const Options::Option *item, float value); + void toggle(const Options::Option *option, int dir); + float getProgressValue(const Options::Option *item); + bool getBooleanValue(const Options::Option *item); + wstring getMessage(const Options::Option *item); + void load(); +private: + float readFloat(wstring string); +public: + void save(); + + bool isCloudsOn(); +}; diff --git a/Minecraft.Client/OptionsScreen.cpp b/Minecraft.Client/OptionsScreen.cpp new file mode 100644 index 00000000..b5c2f5e6 --- /dev/null +++ b/Minecraft.Client/OptionsScreen.cpp @@ -0,0 +1,77 @@ +#include "stdafx.h" +#include "OptionsScreen.h" +#include "SmallButton.h" +#include "SlideButton.h" +#include "Options.h" +#include "ControlsScreen.h" +#include "VideoSettingsScreen.h" +#include "..\Minecraft.World\net.minecraft.locale.h" + +OptionsScreen::OptionsScreen(Screen *lastScreen, Options *options) +{ + title = L"Options"; // 4J added + + this->lastScreen = lastScreen; + this->options = options; +} + +void OptionsScreen::init() +{ + Language *language = Language::getInstance(); + this->title = language->getElement(L"options.title"); + + int position = 0; + + // 4J - this was as static array but moving it into the function to remove any issues with static initialisation order + const Options::Option *items[5] = {Options::Option::MUSIC, Options::Option::SOUND, Options::Option::INVERT_MOUSE, Options::Option::SENSITIVITY, Options::Option::DIFFICULTY}; + for (int i = 0; i < 5; i++) + { + const Options::Option *item = items[i]; + if (!item->isProgress()) + { + buttons.push_back(new SmallButton(item->getId(), width / 2 - 155 + position % 2 * 160, height / 6 + 24 * (position >> 1), item, options->getMessage(item))); + } + else + { + buttons.push_back(new SlideButton(item->getId(), width / 2 - 155 + position % 2 * 160, height / 6 + 24 * (position >> 1), item, options->getMessage(item), options->getProgressValue(item))); + } + position++; + } + + buttons.push_back(new Button(VIDEO_BUTTON_ID, width / 2 - 100, height / 6 + 24 * 4 + 12, language->getElement(L"options.video"))); + buttons.push_back(new Button(CONTROLS_BUTTON_ID, width / 2 - 100, height / 6 + 24 * 5 + 12, language->getElement(L"options.controls"))); + buttons.push_back(new Button(200, width / 2 - 100, height / 6 + 24 * 7, language->getElement(L"gui.done"))); + +} + +void OptionsScreen::buttonClicked(Button *button) +{ + if (!button->active) return; + if (button->id < 100 && (dynamic_cast(button) != NULL)) + { + options->toggle(((SmallButton *) button)->getOption(), 1); + button->msg = options->getMessage(Options::Option::getItem(button->id)); + } + if (button->id == VIDEO_BUTTON_ID) + { + minecraft->options->save(); + minecraft->setScreen(new VideoSettingsScreen(this, options)); + } + if (button->id == CONTROLS_BUTTON_ID) + { + minecraft->options->save(); + minecraft->setScreen(new ControlsScreen(this, options)); + } + if (button->id == 200) + { + minecraft->options->save(); + minecraft->setScreen(lastScreen); + } +} + +void OptionsScreen::render(int xm, int ym, float a) +{ + renderBackground(); + drawCenteredString(font, title, width / 2, 20, 0xffffff); + Screen::render(xm, ym, a); +} \ No newline at end of file diff --git a/Minecraft.Client/OptionsScreen.h b/Minecraft.Client/OptionsScreen.h new file mode 100644 index 00000000..69a2ffa7 --- /dev/null +++ b/Minecraft.Client/OptionsScreen.h @@ -0,0 +1,23 @@ +#pragma once +#include "Screen.h" +class Options; +using namespace std; + +class OptionsScreen : public Screen +{ +private: + static const int CONTROLS_BUTTON_ID = 100; + static const int VIDEO_BUTTON_ID = 101; + Screen *lastScreen; +protected: + wstring title; +private: + Options *options; +public: + OptionsScreen(Screen *lastScreen, Options *options); + virtual void init(); +protected: + virtual void buttonClicked(Button *button); +public: + virtual void render(int xm, int ym, float a); +}; \ No newline at end of file diff --git a/Minecraft.Client/PSVita/4JLibs/inc/4J_Input.h b/Minecraft.Client/PSVita/4JLibs/inc/4J_Input.h new file mode 100644 index 00000000..c0209eb6 --- /dev/null +++ b/Minecraft.Client/PSVita/4JLibs/inc/4J_Input.h @@ -0,0 +1,177 @@ +#pragma once + +#include +#include + +#define MAP_STYLE_0 0 +#define MAP_STYLE_1 1 +#define MAP_STYLE_2 2 + +#define _360_JOY_BUTTON_A 0x00000001 +#define _360_JOY_BUTTON_B 0x00000002 +#define _360_JOY_BUTTON_X 0x00000004 +#define _360_JOY_BUTTON_Y 0x00000008 + +#define _360_JOY_BUTTON_START 0x00000010 +#define _360_JOY_BUTTON_BACK 0x00000020 +#define _360_JOY_BUTTON_RB 0x00000040 +#define _360_JOY_BUTTON_LB 0x00000080 + +#define _360_JOY_BUTTON_RTHUMB 0x00000100 +#define _360_JOY_BUTTON_LTHUMB 0x00000200 +#define _360_JOY_BUTTON_DPAD_UP 0x00000400 +#define _360_JOY_BUTTON_DPAD_DOWN 0x00000800 + +#define _360_JOY_BUTTON_DPAD_LEFT 0x00001000 +#define _360_JOY_BUTTON_DPAD_RIGHT 0x00002000 +// fake digital versions of analog values +#define _360_JOY_BUTTON_LSTICK_RIGHT 0x00004000 +#define _360_JOY_BUTTON_LSTICK_LEFT 0x00008000 + +#define _360_JOY_BUTTON_RSTICK_DOWN 0x00010000 +#define _360_JOY_BUTTON_RSTICK_UP 0x00020000 +#define _360_JOY_BUTTON_RSTICK_RIGHT 0x00040000 +#define _360_JOY_BUTTON_RSTICK_LEFT 0x00080000 + +#define _360_JOY_BUTTON_LSTICK_DOWN 0x00100000 +#define _360_JOY_BUTTON_LSTICK_UP 0x00200000 +#define _360_JOY_BUTTON_RT 0x00400000 +#define _360_JOY_BUTTON_LT 0x00800000 + +// PSVita equivalents + +#define _PSV_JOY_BUTTON_X _360_JOY_BUTTON_A +#define _PSV_JOY_BUTTON_O _360_JOY_BUTTON_B +#define _PSV_JOY_BUTTON_SQUARE _360_JOY_BUTTON_X +#define _PSV_JOY_BUTTON_TRIANGLE _360_JOY_BUTTON_Y +#define _PSV_JOY_BUTTON_START _360_JOY_BUTTON_START +#define _PSV_JOY_BUTTON_SELECT _360_JOY_BUTTON_BACK +#define _PSV_JOY_BUTTON_R1 _360_JOY_BUTTON_RB +#define _PSV_JOY_BUTTON_L1 _360_JOY_BUTTON_LB +#define _PSV_JOY_BUTTON_R3 _360_JOY_BUTTON_RTHUMB +#define _PSV_JOY_BUTTON_L3 _360_JOY_BUTTON_LTHUMB +#define _PSV_JOY_BUTTON_DPAD_UP _360_JOY_BUTTON_DPAD_UP +#define _PSV_JOY_BUTTON_DPAD_DOWN _360_JOY_BUTTON_DPAD_DOWN +#define _PSV_JOY_BUTTON_DPAD_LEFT _360_JOY_BUTTON_DPAD_LEFT +#define _PSV_JOY_BUTTON_DPAD_RIGHT _360_JOY_BUTTON_DPAD_RIGHT +#define _PSV_JOY_BUTTON_LSTICK_RIGHT _360_JOY_BUTTON_LSTICK_RIGHT +#define _PSV_JOY_BUTTON_LSTICK_LEFT _360_JOY_BUTTON_LSTICK_LEFT +#define _PSV_JOY_BUTTON_RSTICK_DOWN _360_JOY_BUTTON_RSTICK_DOWN +#define _PSV_JOY_BUTTON_RSTICK_UP _360_JOY_BUTTON_RSTICK_UP +#define _PSV_JOY_BUTTON_RSTICK_RIGHT _360_JOY_BUTTON_RSTICK_RIGHT +#define _PSV_JOY_BUTTON_RSTICK_LEFT _360_JOY_BUTTON_RSTICK_LEFT +#define _PSV_JOY_BUTTON_LSTICK_DOWN _360_JOY_BUTTON_LSTICK_DOWN +#define _PSV_JOY_BUTTON_LSTICK_UP _360_JOY_BUTTON_LSTICK_UP +#define _PSV_JOY_BUTTON_R2 _360_JOY_BUTTON_RT +#define _PSV_JOY_BUTTON_L2 _360_JOY_BUTTON_LT + + +// Stick axis maps - to allow changes for SouthPaw in-game axis mapping +#define AXIS_MAP_LX 0 +#define AXIS_MAP_LY 1 +#define AXIS_MAP_RX 2 +#define AXIS_MAP_RY 3 + +// Trigger map - to allow for swap triggers in-game +#define TRIGGER_MAP_0 0 +#define TRIGGER_MAP_1 1 + +enum EKeyboardResult +{ + EKeyboard_Pending, + EKeyboard_Cancelled, + EKeyboard_ResultAccept, + EKeyboard_ResultDecline, +}; + +typedef struct _STRING_VERIFY_RESPONSE +{ + WORD wNumStrings; + HRESULT *pStringResult; +} +STRING_VERIFY_RESPONSE; + +class C_4JInput +{ +public: + + + enum EKeyboardMode + { + EKeyboardMode_Default, + EKeyboardMode_Numeric, + EKeyboardMode_Password, + EKeyboardMode_Alphabet, + EKeyboardMode_Full, + EKeyboardMode_Alphabet_Extended, + EKeyboardMode_IP_Address, + EKeyboardMode_Phone + }; + + void Initialise( int iInputStateC, unsigned char ucMapC,unsigned char ucActionC, unsigned char ucMenuActionC ); + void Tick(void); + void SetDeadzoneAndMovementRange(unsigned int uiDeadzone, unsigned int uiMovementRangeMax ); + void SetGameJoypadMaps(unsigned char ucMap,unsigned char ucAction,unsigned int uiActionVal); + unsigned int GetGameJoypadMaps(unsigned char ucMap,unsigned char ucAction); + void SetJoypadMapVal(int iPad,unsigned char ucMap); + unsigned char GetJoypadMapVal(int iPad); + void SetJoypadSensitivity(int iPad, float fSensitivity); + unsigned int GetValue(int iPad,unsigned char ucAction, bool bRepeat=false); + bool ButtonPressed(int iPad,unsigned char ucAction=255); // toggled + bool ButtonReleased(int iPad,unsigned char ucAction); //toggled + bool ButtonDown(int iPad,unsigned char ucAction=255); // button held down + // Functions to remap the axis and triggers for in-game (not menus) - SouthPaw, etc + void SetJoypadStickAxisMap(int iPad,unsigned int uiFrom, unsigned int uiTo); + void SetJoypadStickTriggerMap(int iPad,unsigned int uiFrom, unsigned int uiTo); + void SetKeyRepeatRate(float fRepeatDelaySecs,float fRepeatRateSecs); + void SetDebugSequence( const char *chSequenceA,int( *Func)(LPVOID),LPVOID lpParam ); + FLOAT GetIdleSeconds(int iPad); + bool IsPadConnected(int iPad); + void SetCircleCrossSwapped(bool swapped); + bool IsCircleCrossSwapped(); + + // Map touch input to buttons + void MapTouchInput(int iPad, unsigned int uiActionVal); + + // In-Game values which may have been remapped due to Southpaw, swap triggers, etc + float GetJoypadStick_LX(int iPad, bool bCheckMenuDisplay=true); + float GetJoypadStick_LY(int iPad, bool bCheckMenuDisplay=true); + float GetJoypadStick_RX(int iPad, bool bCheckMenuDisplay=true); + float GetJoypadStick_RY(int iPad, bool bCheckMenuDisplay=true); + unsigned char GetJoypadLTrigger(int iPad, bool bCheckMenuDisplay=true); + unsigned char GetJoypadRTrigger(int iPad, bool bCheckMenuDisplay=true); + + SceTouchData* GetTouchPadData(int iPad, bool bCheckMenuDisplay); + + void SetMenuDisplayed(int iPad, bool bVal); + +// EKeyboardResult RequestKeyboard(UINT uiTitle, UINT uiText, UINT uiDesc, DWORD dwPad, WCHAR *pwchResult, UINT uiResultSize,int( *Func)(LPVOID,const bool),LPVOID lpParam,EKeyboardMode eMode,C4JStringTable *pStringTable=NULL); +// EKeyboardResult RequestKeyboard(UINT uiTitle, LPCWSTR pwchDefault, UINT uiDesc, DWORD dwPad, WCHAR *pwchResult, UINT uiResultSize,int( *Func)(LPVOID,const bool),LPVOID lpParam, EKeyboardMode eMode,C4JStringTable *pStringTable=NULL); + EKeyboardResult RequestKeyboard(LPCWSTR Title, LPCWSTR Text, DWORD dwPad, UINT uiMaxChars, int( *Func)(LPVOID,const bool),LPVOID lpParam,C_4JInput::EKeyboardMode eMode); + void GetText(uint16_t *UTF16String); + + // Online check strings against offensive list - TCR 92 + // TCR # 092 CMTV Player Text String Verification + // Requirement Any player-entered text visible to another player on Xbox LIVE must be verified using the Xbox LIVE service before being transmitted. Text that is rejected by the Xbox LIVE service must not be displayed. + // + // Remarks + // This requirement applies to any player-entered string that can be exposed to other players on Xbox LIVE. It includes session names, content descriptions, text messages, tags, team names, mottos, comments, and so on. + // + // Games may decide to not send the text, blank it out, or use generic text if the text was rejected by the Xbox LIVE service. + // + // Games verify the text by calling the XStringVerify function. + // + // Exemption It is not required to use the Xbox LIVE service to verify real-time text communication. An example of real-time text communication is in-game text chat. + // + // Intent Protect players from inappropriate language. + bool VerifyStrings(WCHAR **pwStringA,int iStringC,int( *Func)(LPVOID,STRING_VERIFY_RESPONSE *),LPVOID lpParam); + void CancelQueuedVerifyStrings(int( *Func)(LPVOID,STRING_VERIFY_RESPONSE *),LPVOID lpParam); + void CancelAllVerifyInProgress(void); + + bool IsVitaTV(); + + //bool InputDetected(DWORD dwUserIndex,WCHAR *pwchInput); +}; + +// Singleton +extern C_4JInput InputManager; diff --git a/Minecraft.Client/PSVita/4JLibs/inc/4J_Profile.h b/Minecraft.Client/PSVita/4JLibs/inc/4J_Profile.h new file mode 100644 index 00000000..ab6b6131 --- /dev/null +++ b/Minecraft.Client/PSVita/4JLibs/inc/4J_Profile.h @@ -0,0 +1,264 @@ +#pragma once +#include +#include +#include +#include + +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, + eAwardType_GamerPic, + eAwardType_Theme, + eAwardType_AvatarItem, +}; + +enum eUpsellType +{ + eUpsellType_Custom = 0, // This is the default, and means that the upsell dialog was initiated in the app code + eUpsellType_Achievement, + eUpsellType_GamerPic, + eUpsellType_Theme, + eUpsellType_AvatarItem, +}; + +enum eUpsellResponse +{ + eUpsellResponse_Declined, + eUpsellResponse_Accepted_NoPurchase, + eUpsellResponse_Accepted_Purchase, + eUpsellResponse_UserNotSignedInPSN +}; + +class C_4JProfile +{ +public: + + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // INIT + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // 4 players have game defined data, puiGameDefinedDataChangedBitmask needs to be checked by the game side to see if there's an update needed - it'll have the bits set for players to be updated + void Initialise( const SceNpCommunicationConfig _commsId, + const std::string _serviceID, + unsigned short usProfileVersion, + UINT uiProfileValuesC, + UINT uiProfileSettingsC, + DWORD *pdwProfileSettingsA, + int iGameDefinedDataSizeX4, + unsigned int *puiGameDefinedDataChangedBitmask); + + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // SIGN-IN/USERS + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + bool IsSignedIn(int iQuadrant); + bool IsSignedInLive(int iProf); + bool IsSignedInPSN(int iProf); + bool IsGuest(int iQuadrant); + UINT RequestSignInUI(bool bFromInvite,bool bLocalGame,bool bNoGuestsAllowed,bool bMultiplayerSignIn,bool bAddUser, int( *Func)(LPVOID,const bool, const int iPad),LPVOID lpParam,int iQuadrant=XUSER_INDEX_ANY); + UINT DisplayOfflineProfile(int( *Func)(LPVOID,const bool, const int iPad),LPVOID lpParam,int iQuadrant=XUSER_INDEX_ANY); + UINT RequestConvertOfflineToGuestUI(int( *Func)(LPVOID,const bool, const int iPad),LPVOID lpParam,int iQuadrant=XUSER_INDEX_ANY); + void SetPrimaryPlayerChanged(bool bVal); + bool QuerySigninStatus(void); + void GetXUID(int iPad, PlayerUID *pXuid,bool bOnlineXuid); + BOOL AreXUIDSEqual(PlayerUID xuid1,PlayerUID xuid2); + void GetSceNpId(int iPad, SceNpId *npId); + DWORD GetSignedInUsersMask(); + void SetNetworkStatus(bool bOnlinePSN, bool bSignedInPSN); + + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // MISC + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + int GetLockedProfile(); + void SetLockedProfile(int iProf); + void SetGetStringFunc(LPCWSTR ( *Func)(int)); + void SetPlayerListTitleID(int id); + bool AllowedToPlayMultiplayer(int iProf); + bool HasPlayStationPlus(int iProf); + void StartTrialGame(); // disables saves and leaderboard, and change state to readyforgame from pregame + void AllowedPlayerCreatedContent(int iPad, bool thisQuadrantOnly, BOOL *allAllowed, BOOL *friendsAllowed); + BOOL CanViewPlayerCreatedContent(int iPad, bool thisQuadrantOnly, PPlayerUID pXuids, DWORD dwXuidCount ); + void ResetProfileProcessState(); // after a sign out from the primary player, call this + void Tick( void ); + + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // AVATAR + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + typedef struct + { + int iPad; + int ( *m_fnFunc)(LPVOID lpParam,PBYTE pbThumbnail,DWORD dwThumbnailBytes); + LPVOID m_fnFunc_Param; + } + FUNCPARAMS; + bool GetProfileAvatar(int iPad,int( *Func)(LPVOID lpParam,PBYTE pbThumbnail,DWORD dwThumbnailBytes), LPVOID lpParam); + void CancelProfileAvatarRequest(); + + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // SYS + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + int GetPrimaryPad(); + void SetPrimaryPad(int iPad); + char* GetGamertag(int iPad); + std::wstring GetDisplayName(int iPad); + + bool IsFullVersion(); + void SetFullVersion(bool bFull); + void SetSignInChangeCallback(void ( *Func)(LPVOID, bool, unsigned int),LPVOID lpParam); + void SetNotificationsCallback(void ( *Func)(LPVOID, DWORD, unsigned int),LPVOID lpParam); + bool RegionIsNorthAmerica(void); + bool LocaleIsUSorCanada(void); + HRESULT GetLiveConnectionStatus(); + bool IsSystemUIDisplayed(); + void SetSysUIShowing( bool bUIDisplayed ); + void DisplaySystemMessage( SceMsgDialogSystemMessageType _type, int iQuadrant); + void SetProfileReadErrorCallback(void ( *Func)(LPVOID), LPVOID lpParam); + void ShowSystemMessage( int _type, int _val ); + + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // ACHIEVEMENTS & AWARDS + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + void InitialiseTrophies(); //CD - Don't use this, auto setup after login + void RegisterAward(int iAwardNumber,int iGamerconfigID, eAwardType eType, bool bLeaderboardAffected=false, + CXuiStringTable*pStringTable=NULL, int iTitleStr=-1, int iTextStr=-1, int iAcceptStr=-1, char *pszThemeName=NULL, unsigned int uiThemeSize=0L); + int GetAwardId(int iAwardNumber); + eAwardType GetAwardType(int iAwardNumber); + bool CanBeAwarded(int iQuadrant, int iAwardNumber); + void Award(int iQuadrant, int iAwardNumber, bool bForce=false); + bool IsAwardsFlagSet(int iQuadrant, int iAward); + void Terminate(); + void SetFatalTrophyErrorID(int id); //CD - Deprecated + int WaitTrophyInitComplete(); //CD - Deprecated + int tryWaitTrophyInitComplete(); //CD - Deprecated + void SetTrialTextStringTable(CXuiStringTable *pStringTable,int iAccept,int iReject); + void SetTrialAwardText(eAwardType AwardType,int iTitle,int iText); // achievement popup in the trial game + void SetHDDFreeKB(int iHDDFreeKB); + void SetMinSaveKB(int iMinSaveKB); + int GetHDDFreeKB(void); + bool AreTrophiesInstalled(); + + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // RICH PRESENCE + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + void RichPresenceRegisterPresenceString(int index, const char* str); + void RichPresenceRegisterContext(int ctxID, const char* token); + void RichPresenceRegisterContextString(int ctxID, int strIndex, const char* str); + void RichPresenceInit(int iPresenceCount, int iContextCount); + void SetRichPresenceContextValue(int iPad,int iContextID, int iVal); + void SetCurrentGameActivity(int iPad,int iNewPresence, bool bSetOthersToIdle=false); + void SetRichPresenceSettingFn(int ( *SetPresenceInfoFn)(const void *data)); + + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // PURCHASE + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + void DisplayFullVersionPurchase(bool bRequired, int iQuadrant, int iUpsellParam = -1); + void SetUpsellCallback(void ( *Func)(LPVOID lpParam, eUpsellType type, eUpsellResponse response, int iUserData),LPVOID lpParam); + + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // Debug + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + void SetDebugFullOverride(bool bVal); // To override the license version (trail/full). Only in debug/release, not ContentPackage + + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // Chat and content restrictions + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + bool GetChatAndContentRestrictions(int iPad, bool thisQuadrantOnly,bool *pbChatRestricted,bool *pbContentRestricted,int *piAge); + void SetServiceID(char *pchServiceID); // needed for the ticket request for the chat restrictions of secondary PSN players + void HandleNetworkTicket(int result,void *arg); + void SetMinimumAge(int iAge, int iRegion);// 0 - SCEE, 1- SCEA, 2 - SCEJ + int GetMinimumAge(); + void SetGermanyMinimumAge(int iAge); + int GetGermanyMinimumAge(); + void SetRussiaMinimumAge(int iAge); + int GetRussiaMinimumAge(); + void SetAustraliaMinimumAge(int iAge); + int GetAustraliaMinimumAge(); + void SetJapanMinimumAge(int iAge); + int GetJapanMinimumAge(); + void SetKoreaMinimumAge(int iAge); + int GetKoreaMinimumAge(); + int getUserID(int iQuadrant); // grab the PS4 userID for this quadrant (SCE_USER_SERVICE_USER_ID_INVALID if it's not signed in) + + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // Http calls + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + bool SonyHttp_init(); + void SonyHttp_shutdown(); + bool SonyHttp_getDataFromURL(const char* szURL, void** ppOutData, int* pDataSize); + +}; + +// Singleton +extern C_4JProfile ProfileManager; + diff --git a/Minecraft.Client/PSVita/4JLibs/inc/4J_Render.h b/Minecraft.Client/PSVita/4JLibs/inc/4J_Render.h new file mode 100644 index 00000000..b08c9fba --- /dev/null +++ b/Minecraft.Client/PSVita/4JLibs/inc/4J_Render.h @@ -0,0 +1,326 @@ +#pragma once + +#include + + + +class ImageFileBuffer +{ +public: + enum EImageType + { + e_typePNG, + e_typeJPG + }; + + EImageType m_type; + void* m_pBuffer; + int m_bufferSize; + + int GetType() { return m_type; } + void *GetBufferPointer() { return m_pBuffer; } + int GetBufferSize() { return m_bufferSize; } + void Release() { free(m_pBuffer); m_pBuffer = NULL; } + bool Allocated() { return m_pBuffer != NULL; } +}; + +typedef struct +{ + int Width; + int Height; +}D3DXIMAGE_INFO; + +typedef struct _XSOCIAL_PREVIEWIMAGE { + BYTE *pBytes; + DWORD Pitch; + DWORD Width; + DWORD Height; +// D3DFORMAT Format; +} XSOCIAL_PREVIEWIMAGE, *PXSOCIAL_PREVIEWIMAGE; + +class C4JRender +{ +public: + void Tick(); + void UpdateGamma(unsigned short usGamma); + + // Matrix stack + void MatrixMode(int type); + void MatrixSetIdentity(); + void MatrixTranslate(float x,float y,float z); + void MatrixRotate(float angle, float x, float y, float z); + void MatrixScale(float x, float y, float z); + void MatrixPerspective(float fovy, float aspect, float zNear, float zFar); + void MatrixOrthogonal(float left,float right,float bottom,float top,float zNear,float zFar); + void MatrixPop(); + void MatrixPush(); + void MatrixMult(float *mat); + const float *MatrixGet(int type); + void Set_matrixDirty(); + + // Core + void Initialise(); + void InitialiseContext(); + void StartFrame(); + void Present(); + void Clear(int flags, D3D11_RECT *pRect = NULL); + void SetClearColour(const float colourRGBA[4]); + bool IsWidescreen(); + bool IsHiDef(); + void CaptureThumbnail(ImageFileBuffer *pngOut); + void CaptureScreen(ImageFileBuffer *jpgOut, XSOCIAL_PREVIEWIMAGE *previewOut); + void BeginConditionalSurvey(int identifier); + void EndConditionalSurvey(); + void BeginConditionalRendering(int identifier); + void EndConditionalRendering(); + + // Vertex data handling + typedef enum + { + VERTEX_TYPE_PF3_TF2_CB4_NB4_XW1, // Position 3 x float, texture 2 x float, colour 4 x byte, normal 4 x byte, padding 1 DWORD + 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; + + // Pixel shader + 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; + + typedef enum + { + VIEWPORT_TYPE_FULLSCREEN, + VIEWPORT_TYPE_SPLIT_TOP, + VIEWPORT_TYPE_SPLIT_BOTTOM, + VIEWPORT_TYPE_SPLIT_LEFT, + VIEWPORT_TYPE_SPLIT_RIGHT, + VIEWPORT_TYPE_QUADRANT_TOP_LEFT, + VIEWPORT_TYPE_QUADRANT_TOP_RIGHT, + VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT, + VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT, + } eViewportType; + + typedef enum + { + PRIMITIVE_TYPE_TRIANGLE_LIST, + PRIMITIVE_TYPE_TRIANGLE_STRIP, + PRIMITIVE_TYPE_TRIANGLE_FAN, + PRIMITIVE_TYPE_QUAD_LIST, + PRIMITIVE_TYPE_LINE_LIST, + PRIMITIVE_TYPE_LINE_STRIP, + PRIMITIVE_TYPE_COUNT + } ePrimitiveType; + + void DrawVertices(ePrimitiveType PrimitiveType, int count, void *dataIn, eVertexType vType, C4JRender::ePixelShaderType psType); +#ifdef __PSVITA__ + void DrawVerticesCutOut(ePrimitiveType PrimitiveType, int count, void *dataIn, eVertexType vType, C4JRender::ePixelShaderType psType); +#endif + void DrawVertexBuffer(ePrimitiveType PrimitiveType, int count, ID3D11Buffer *buffer, C4JRender::eVertexType vType, C4JRender::ePixelShaderType psType); + + // Command buffers + void CBuffLockStaticCreations(); + int CBuffCreate(int count); + void CBuffDelete(int first, int count); + void CBuffStart(int index); + void CBuffClear(int index); + int CBuffSize(int index); + void CBuffEnd(); + bool CBuffCall(int index, bool full = true); +#ifdef __PSVITA__ + bool CBuffCallCutOut(int index, bool full = true); +#endif + void CBuffTick(); + void CBuffDeferredModeStart(); + void CBuffDeferredModeEnd(); + + typedef enum + { + TEXTURE_FORMAT_RxGyBzAw, // Normal 32-bit RGBA texture, 8 bits per component + /* Don't think these are all directly available on D3D 11 - leaving for now + TEXTURE_FORMAT_R0G0B0Ax, // One 8-bit component mapped to alpha channel, R=G=B=0 + TEXTURE_FORMAT_R1G1B1Ax, // One 8-bit component mapped to alpha channel, R=G=B=1 + TEXTURE_FORMAT_RxGxBxAx, // One 8-bit component mapped to all channels + */ + MAX_TEXTURE_FORMATS + } eTextureFormat; + + // Textures + 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(); + unsigned char * TextureData(int width, int height, void *data, int level, eTextureFormat format = TEXTURE_FORMAT_RxGyBzAw); + void TextureDataUpdate(int xoffset, int yoffset, int width, int height, void *data, int level); + void TextureSetParam(int param, int value); + void TextureDynamicUpdateStart(); + void TextureDynamicUpdateEnd(); + HRESULT LoadTextureData(const char *szFilename,D3DXIMAGE_INFO *pSrcInfo, int **ppDataOut); + HRESULT LoadTextureData(BYTE *pbData, DWORD dwBytes,D3DXIMAGE_INFO *pSrcInfo, int **ppDataOut); + HRESULT SaveTextureData(const char *szFilename, D3DXIMAGE_INFO *pSrcInfo, int *ppDataOut); + void TextureGetStats(); + SceGxmTexture *TextureGetTexture(int idx); + + // State control + void StateSetColour(float r, float g, float b, float a); + void StateSetDepthMask(bool enable); + void StateSetBlendEnable(bool enable); + void StateSetBlendFunc(int src, int dst); + void StateSetBlendFactor(unsigned int colour); + void StateSetAlphaFunc(int func, float param); + void StateSetDepthFunc(int func); + void StateSetFaceCull(bool enable); + void StateSetFaceCullCW(bool enable); + void StateSetLineWidth(float width); + void StateSetWriteEnable(bool red, bool green, bool blue, bool alpha); + void StateSetDepthTestEnable(bool enable); + void StateSetAlphaTestEnable(bool enable); + void StateSetDepthSlopeAndBias(float slope, float bias); + void StateSetFogEnable(bool enable); + void StateSetFogMode(int mode); + void StateSetFogNearDistance(float dist); + void StateSetFogFarDistance(float dist); + void StateSetFogDensity(float density); + void StateSetFogColour(float red, float green, float blue); + void StateSetLightingEnable(bool enable); + void StateSetVertexTextureUV( float u, float v); + void StateSetLightColour(int light, float red, float green, float blue); + void StateSetLightAmbientColour(float red, float green, float blue); + void StateSetLightDirection(int light, float x, float y, float z); + void StateSetLightEnable(int light, bool enable); + void StateSetViewport(eViewportType viewportType); + void StateSetEnableViewportClipPlanes(bool enable); + void StateSetTexGenCol(int col, float x, float y, float z, float w, bool eyeSpace); + void StateSetStencil(SceGxmStencilFunc Function, uint8_t stencil_func_mask, uint8_t stencil_write_mask); + void StateSetForceLOD(int LOD); + + // Event tracking + void BeginEvent(LPCWSTR eventName); + void EndEvent(); + + void* allocGPURWMem(const size_t size,const size_t alignment = 16); + void freeGPURWMem(void* mem); + void* allocGPUROMem(const size_t size,const size_t alignment = 16); + void freeGPUROMem(void* mem); + void* allocGPUCDMem(const size_t size,const size_t alignment = 16); + void freeGPUCDMem(void* mem); + int getDisplayBufferCount(); + volatile uint32_t *getNotificationRegion(); + SceGxmContext *getGXMContext(); + SceGxmColorSurface *getCurrentDisplaySurface(); + SceGxmDepthStencilSurface *getCurrentDepthSurface(); + SceGxmShaderPatcher *getGXMShaderPatcher(); + void setFragmentNotification(SceGxmNotification notification); + bool GetIsInScene(); + void SetCameraPosition(float x, float y, float z); +}; + + +const int GL_MODELVIEW_MATRIX = 0; +const int GL_PROJECTION_MATRIX = 1; +const int GL_MODELVIEW = 0; +const int GL_PROJECTION = 1; +const int GL_TEXTURE = 2; + +// These things required for tex gen + +const int GL_S = 0; +const int GL_T = 1; +const int GL_R = 2; +const int GL_Q = 3; + +const int GL_TEXTURE_GEN_S = 0; +const int GL_TEXTURE_GEN_T = 1; +const int GL_TEXTURE_GEN_Q = 2; +const int GL_TEXTURE_GEN_R = 3; + +const int GL_TEXTURE_GEN_MODE = 0; +const int GL_OBJECT_LINEAR = 0; +const int GL_EYE_LINEAR = 1; +const int GL_OBJECT_PLANE = 0; +const int GL_EYE_PLANE = 1; + + +// These things are used by glEnable/glDisable so must be different and non-zero (zero is used by things we haven't assigned yet) +const int GL_TEXTURE_2D = 1; +const int GL_BLEND = 2; +const int GL_CULL_FACE = 3; +const int GL_ALPHA_TEST = 4; +const int GL_DEPTH_TEST = 5; +const int GL_FOG = 6; +const int GL_LIGHTING = 7; +const int GL_LIGHT0 = 8; +const int GL_LIGHT1 = 9; + +const int CLEAR_DEPTH_FLAG = 1; +const int CLEAR_COLOUR_FLAG = 2; + +const int GL_DEPTH_BUFFER_BIT = CLEAR_DEPTH_FLAG; +const int GL_COLOR_BUFFER_BIT = CLEAR_COLOUR_FLAG; + +const int GL_SRC_ALPHA = D3D11_BLEND_SRC_ALPHA; +const int GL_ONE_MINUS_SRC_ALPHA = D3D11_BLEND_INV_SRC_ALPHA; +const int GL_ONE = D3D11_BLEND_ONE; +const int GL_ZERO = D3D11_BLEND_ZERO; +const int GL_DST_ALPHA = D3D11_BLEND_DEST_ALPHA; +const int GL_SRC_COLOR = D3D11_BLEND_SRC_COLOR; +const int GL_DST_COLOR = D3D11_BLEND_DEST_COLOR; +const int GL_ONE_MINUS_DST_COLOR = D3D11_BLEND_INV_DEST_COLOR; +const int GL_ONE_MINUS_SRC_COLOR = D3D11_BLEND_INV_SRC_COLOR; +const int GL_CONSTANT_ALPHA = D3D11_BLEND_BLEND_FACTOR; +const int GL_ONE_MINUS_CONSTANT_ALPHA = D3D11_BLEND_INV_BLEND_FACTOR; + +const int GL_GREATER = D3D11_COMPARISON_GREATER; +const int GL_EQUAL = D3D11_COMPARISON_EQUAL; +const int GL_LEQUAL = D3D11_COMPARISON_LESS_EQUAL; +const int GL_GEQUAL = D3D11_COMPARISON_GREATER_EQUAL; +const int GL_ALWAYS = D3D11_COMPARISON_ALWAYS; + +const int GL_TEXTURE_MIN_FILTER = 1; +const int GL_TEXTURE_MAG_FILTER = 2; +const int GL_TEXTURE_WRAP_S = 3; +const int GL_TEXTURE_WRAP_T = 4; + +const int GL_NEAREST = 0; +const int GL_LINEAR = 1; +const int GL_EXP = 2; +const int GL_NEAREST_MIPMAP_LINEAR = 0; // TODO - mipmapping bit of this + +const int GL_CLAMP = 0; +const int GL_REPEAT = 1; + +const int GL_FOG_START = 1; +const int GL_FOG_END = 2; +const int GL_FOG_MODE = 3; +const int GL_FOG_DENSITY = 4; +const int GL_FOG_COLOR = 5; + +const int GL_POSITION = 1; +const int GL_AMBIENT = 2; +const int GL_DIFFUSE = 3; +const int GL_SPECULAR = 4; + +const int GL_LIGHT_MODEL_AMBIENT = 1; + +const int GL_LINES = C4JRender::PRIMITIVE_TYPE_LINE_LIST; +const int GL_LINE_STRIP = C4JRender::PRIMITIVE_TYPE_LINE_STRIP; +const int GL_QUADS = C4JRender::PRIMITIVE_TYPE_QUAD_LIST; +const int GL_TRIANGLE_FAN = C4JRender::PRIMITIVE_TYPE_TRIANGLE_FAN; +const int GL_TRIANGLE_STRIP = C4JRender::PRIMITIVE_TYPE_TRIANGLE_STRIP; + +// Singleton +extern C4JRender RenderManager; + + diff --git a/Minecraft.Client/PSVita/4JLibs/inc/4J_Storage.h b/Minecraft.Client/PSVita/4JLibs/inc/4J_Storage.h new file mode 100644 index 00000000..552c247d --- /dev/null +++ b/Minecraft.Client/PSVita/4JLibs/inc/4J_Storage.h @@ -0,0 +1,389 @@ +#pragma once +using namespace std; + +#include + +//#define MAX_DISPLAYNAME_LENGTH 128 // SCE_SAVE_DATA_SUBTITLE_MAXSIZE on PS4 +#define MAX_DISPLAYNAME_LENGTH 128 // SCE_APPUTIL_SAVEDATA_SLOT_SUBTITLE_MAXSIZE on Vita + +//#define MAX_SAVEFILENAME_LENGTH 32 // SCE_SAVE_DATA_DIRNAME_DATA_MAXSIZE on PS4 +#define MAX_SAVEFILENAME_LENGTH 64//SCE_APPUTIL_SAVEDATA_SLOT_TITLE_MAXSIZE on Vita + +#define USER_INDEX_ANY 0x000000FF +#define RESULT LONG + +class StringTable; + +typedef struct +{ + char UTF8SaveFilename[MAX_SAVEFILENAME_LENGTH]; + char UTF8SaveTitle[MAX_DISPLAYNAME_LENGTH]; + time_t modifiedTime; + PBYTE thumbnailData; + unsigned int thumbnailSize; + //int sizeKB; +} +SAVE_INFO,*PSAVE_INFO; + +typedef struct +{ + int iSaveC; + PSAVE_INFO SaveInfoA; +} +SAVE_DETAILS,*PSAVE_DETAILS; + +class CONTENT_DATA +{ +public: + enum Type + { + e_contentLocked, + e_contentUnlocked + }; + int DeviceID; + DWORD dwContentType; + WCHAR wszDisplayName[256]; + CHAR szFileName[SCE_FIOS_PATH_MAX]; +}; +typedef CONTENT_DATA XCONTENT_DATA, *PXCONTENT_DATA; // TODO - put back in when actually interfacing with game + +#define MARKETPLACE_CONTENTOFFER_INFO int + +// Current version of the dlc data creator +#define CURRENT_DLC_VERSION_NUM 3 + +// MGH - moved these here from Orbis_App.h +enum e_SONYDLCType +{ + eSONYDLCType_SkinPack=0, + eSONYDLCType_TexturePack, + eSONYDLCType_MashUpPack, + eSONYDLCType_All +}; + +typedef struct +{ + char chDLCKeyname[16]; + //char chDLCTitle[64]; + e_SONYDLCType eDLCType; + int iFirstSkin; + int iConfig; // used for texture pack data files +} +SONYDLC; + +class C4JStorage +{ +public: + + struct PROFILESETTINGS + { + int iYAxisInversion; + int iControllerSensitivity; + int iVibration; + bool bSwapSticks; + }; + + // Structs defined in the DLC_Creator, but added here to be used in the app + typedef struct + { + unsigned int uiFileSize; + DWORD dwType; + DWORD dwWchCount; // count of WCHAR in next array + WCHAR wchFile[1]; + } + DLC_FILE_DETAILS, *PDLC_FILE_DETAILS; + + typedef struct + { + DWORD dwType; + DWORD dwWchCount; // count of WCHAR in next array; + WCHAR wchData[1]; // will be an array of size dwBytes + } + DLC_FILE_PARAM, *PDLC_FILE_PARAM; + // End of DLC_Creator structs + + typedef struct + { + DWORD dwVersion; + DWORD dwNewOffers; + DWORD dwTotalOffers; + DWORD dwInstalledTotalOffers; + BYTE bPadding[1024-sizeof(DWORD)*4]; // future expansion + } + DLC_TMS_DETAILS; + + typedef struct + { + DWORD dwSize; + PBYTE pbData; + } + TMSPP_FILEDATA, *PTMSPP_FILEDATA; + + enum eTMS_FILETYPEVAL + { + TMS_FILETYPE_BINARY=0, + TMS_FILETYPE_CONFIG=1, + TMS_FILETYPE_JSON=2, + TMS_FILETYPE_MAX, + }; + + enum eGlobalStorage + { + //eGlobalStorage_GameClip=0, + eGlobalStorage_Title=0, + eGlobalStorage_TitleUser, + eGlobalStorage_Max + }; + + enum EMessageResult + { + EMessage_Undefined=0, + EMessage_Busy, + EMessage_Pending, + EMessage_Cancelled, + EMessage_ResultAccept, + EMessage_ResultDecline, + EMessage_ResultThirdOption, + EMessage_ResultFourthOption + }; + + enum ESaveGameState + { + ESaveGame_Idle=0, + + ESaveGame_Save, + ESaveGame_SaveCompleteSuccess, + ESaveGame_SaveCompleteFail, + ESaveGame_SaveIncomplete, + ESaveGame_SaveIncomplete_WaitingOnResponse, + + ESaveGame_Load, + ESaveGame_LoadCompleteSuccess, + ESaveGame_LoadCompleteFail, + + ESaveGame_Delete, + ESaveGame_DeleteSuccess, + ESaveGame_DeleteFail, + + ESaveGame_Rename, + ESaveGame_RenameSuccess, + ESaveGame_RenameFail, + + ESaveGame_GetSaveThumbnail, // Not used as an actual state in the PS4, but the game expects this to be returned to indicate success when getting a thumbnail + ESaveGame_GetSaveInfo, + + ESaveGame_SaveCache, + ESaveGame_ReconstructCache + }; + + enum EOptionsState + { + EOptions_Idle=0, + EOptions_Save, + EOptions_Load, + EOptions_Delete, + EOptions_NoSpace, + EOptions_Corrupt, + }; + + enum ESaveGameStatus + { + EDeleteGame_Idle=0, + EDeleteGame_InProgress, + }; + + enum EDLCStatus + { + EDLC_Error=0, + EDLC_Idle, + EDLC_NoOffers, + EDLC_AlreadyEnumeratedAllOffers, + EDLC_NoInstalledDLC, + EDLC_Pending, + EDLC_LoadInProgress, + EDLC_Loaded, + EDLC_ChangedDevice + }; + + enum ESavingMessage + { + ESavingMessage_None=0, + ESavingMessage_Short, + ESavingMessage_Long + }; + + enum ESaveIncompleteType + { + ESaveIncomplete_None, + ESaveIncomplete_OutOfQuota, + ESaveIncomplete_OutOfLocalStorage, + ESaveIncomplete_Unknown + }; + + enum ETMSStatus + { + ETMSStatus_Idle=0, + ETMSStatus_Fail, + ETMSStatus_ReadInProgress, + ETMSStatus_ReadFileListInProgress, + ETMSStatus_WriteInProgress, + ETMSStatus_Fail_ReadInProgress, + ETMSStatus_Fail_ReadFileListInProgress, + ETMSStatus_Fail_ReadDetailsNotRetrieved, + ETMSStatus_Fail_WriteInProgress, + ETMSStatus_DeleteInProgress, + ETMSStatus_Pending, + }; + + enum eTMS_FileType + { + eTMS_FileType_Normal=0, + eTMS_FileType_Graphic, + }; + + enum ESGIStatus + { + ESGIStatus_Error=0, + ESGIStatus_Idle, + ESGIStatus_ReadInProgress, + ESGIStatus_NoSaves, + }; + + enum + { + PROFILE_READTYPE_ALL, + PROFILE_READTYPE_XBOXSETTINGS // just read the settings (after a notification of settings change) + }; + + enum eOptionsCallback + { + eOptions_Callback_Idle, + eOptions_Callback_Write, + eOptions_Callback_Write_Fail_NoSpace, + eOptions_Callback_Write_Fail, + eOptions_Callback_Read, + eOptions_Callback_Read_Fail, + eOptions_Callback_Read_FileNotFound, + eOptions_Callback_Read_Corrupt, + eOptions_Callback_Read_CorruptDeletePending, + eOptions_Callback_Read_CorruptDeleted + }; + + ///////////////////////////////////////////////////////////////////////////// Global storage manager ////////////////////////////////////////////////////////////////////////////// + + C4JStorage(); + void Tick(void); // General storage manager tick to be called from game + + ///////////////////////////////////////////////////////////////////////////// Savegame data /////////////////////////////////////////////////////////////////////////////////////// + + // Initialisation + void Init(unsigned int uiSaveVersion,LPCWSTR pwchDefaultSaveName,char *pszSavePackName,int iMinimumSaveSize, // General manager initialisation + int( *Func)(LPVOID, const ESavingMessage, int),LPVOID lpParam,LPCSTR szGroupID); + void SetGameSaveFolderTitle(WCHAR *wszGameSaveFolderTitle); // Sets the title to be set in the param.sfo of saves (this doesn't vary, the sub-title is used for the user cho + void SetSaveCacheFolderTitle(WCHAR *wszSaveCacheFolderTitle); // Sets the title to be set in the param.sfo of the save cache + void SetOptionsFolderTitle(WCHAR *wszOptionsFolderTitle); // Sets the title to be set in the param.sfo of the options file + void SetGameSaveFolderPrefix(char *szGameSaveFolderPrefix); // Sets the prefix to be added to the unique filename of each save to construct a final folder name + void SetMaxSaves(int iMaxC); // Sets the maximum number of saves to be evaluated by GetSavesInfo etc. + void SetDefaultImages(PBYTE pbOptionsImage,DWORD dwOptionsImageBytes,PBYTE pbSaveImage,DWORD dwSaveImageBytes, // Sets default save image and thumbnail, which can be used when saving a game that hasn't generated any yet + PBYTE pbSaveThumbnail,DWORD dwSaveThumbnailBytes); + + void SetIncompleteSaveCallback(void( *Func)(LPVOID, const ESaveIncompleteType, int blocksRequired), LPVOID param); // Sets callback to be used in the event of a save method not being able to complete + + // Miscellaneous control + void SetSaveDisabled(bool bDisable); // Sets saving disabled/enabled state + bool GetSaveDisabled(void); // Determines whether saving has been disabled + void ResetSaveData(); // Releases any internal storage being held for previously saved/loaded data + C4JStorage::ESaveGameState DoesSaveExist(bool *pbExists); // Determine if current savegame exists on storage device + bool EnoughSpaceForAMinSaveGame(); + + // Get details of existing savedata + C4JStorage::ESaveGameState GetSavesInfo(int iPad,int ( *Func)(LPVOID lpParam,SAVE_DETAILS *pSaveDetails,const bool),LPVOID lpParam,char *pszSavePackName); // Start search + PSAVE_DETAILS ReturnSavesInfo(); // Returns result of search (or NULL if not yet received) + void ClearSavesInfo(); // Clears results + C4JStorage::ESaveGameState LoadSaveDataThumbnail(PSAVE_INFO pSaveInfo,int( *Func)(LPVOID lpParam,PBYTE pbThumbnail,DWORD dwThumbnailBytes), LPVOID lpParam); // Get the thumbnail for an individual save referenced by pSaveInfo + + // Loading savedata & obtaining information from just-loaded file + C4JStorage::ESaveGameState LoadSaveData(PSAVE_INFO pSaveInfo,int( *Func)(LPVOID lpParam,const bool, const bool), LPVOID lpParam); // Loads savedata referenced by pSaveInfo, calls callback once complete + unsigned int GetSaveSize(); // Obtains sizse of just-loaded save + void GetSaveData(void *pvData,unsigned int *puiBytes); // Obtains pointer to, and size, of just-loaded save + bool GetSaveUniqueNumber(INT *piVal); // Gets the unique numeric portion of the folder name used for the save (encodes m + bool GetSaveUniqueFilename(char *pszName); // Get the full unique "filename" used as part of the folder name for the save + bool GetSaveUniqueFileDir(char *pszName); // Get the full unique "filename" used as part of the folder name for the save + + // Saving savedata + void SetSaveTitle(const wchar_t *UTF16String); // Sets the name which is used as a sub-title in the savedata param.sfo + PVOID AllocateSaveData(unsigned int uiBytes); // Allocate storage manager owned memory to the data which is to be saved to + void SetSaveDataSize(unsigned int uiBytes); // Set the actual size of data to be saved + void GetDefaultSaveImage(PBYTE *ppbSaveImage,DWORD *pdwSaveImageBytes); // Get the default save thumbnail (as set by SetDefaultImages) for use on saving games t + void GetDefaultSaveThumbnail(PBYTE *ppbSaveThumbnail,DWORD *pdwSaveThumbnailBytes); // Get the default save image (as set by SetDefaultImages) for use on saving games that + void SetSaveImages( PBYTE pbThumbnail,DWORD dwThumbnailBytes,PBYTE pbImage,DWORD dwImageBytes, PBYTE pbTextData ,DWORD dwTextDataBytes); // Sets the thumbnail & image for the save, optionally setting the metadata in the png + C4JStorage::ESaveGameState SaveSaveData(int( *Func)(LPVOID ,const bool),LPVOID lpParam); // Save the actual data, calling callback on completion + + // Handling of incomplete saves (either sub-files or save data). To be used after game has had callback for an incomplete save event + void ContinueIncompleteOperation(); + void CancelIncompleteOperation(); + + ESaveIncompleteType GetSaveError(); // Returns the save error [SaveData] + void ClearSaveError(); // Clears any save error + ESaveIncompleteType GetOptionsSaveError(); // Returns the save error [Options] + void ClearOptionsSaveError(); // Clears any save error + + // Other file operations + C4JStorage::ESaveGameState DeleteSaveData(PSAVE_INFO pSaveInfo,int( *Func)(LPVOID lpParam,const bool), LPVOID lpParam); // Deletes savedata referenced by pSaveInfo, calls callback when comple + C4JStorage::ESaveGameState RenameSaveData(int iRenameIndex, uint16_t*pui16NewName, int( *Func)(LPVOID lpParam,const bool), LPVOID lpParam); // Renamed savedata with index from last established ReturnSavesInfo. + + // Internal methods +private: + void GetSaveImage(PBYTE *ppbSaveImage, int *puiSaveImageBytes); + void GetSaveThumbnail(PBYTE *ppbSaveThumbnail, int *puiSaveThumbnailBytes); +public: + void SetSaveUniqueFilename(char *szFilename); // MGH - made this public, used for the cross save stuff + void EnableDownloadSave(); // CD - Used for cross/download-save, sets a flag for saving + + ///////////////////////////////////////////////////////////////////////////// Profile data //////////////////////////////////////////////////////////////////////////////////////// +public: + // Initialisation + void InitialiseProfileData(unsigned short usProfileVersion, UINT uiProfileValuesC, UINT uiProfileSettingsC, DWORD *pdwProfileSettingsA, int iGameDefinedDataSizeX4, unsigned int *puiGameDefinedDataChangedBitmask); // General initialisation + int SetDefaultOptionsCallback(int( *Func)(LPVOID,PROFILESETTINGS *, const int iPad),LPVOID lpParam); // Set a callback that can initialise a profile's storage to its default settings + void SetOptionsDataCallback(int( *Func)(LPVOID, int iPad, unsigned short usVersion, C4JStorage::eOptionsCallback),LPVOID lpParam); // Sets callback that is called when status of any options has changed + int SetOldProfileVersionCallback(int( *Func)(LPVOID,unsigned char *, const unsigned short,const int),LPVOID lpParam); + + // Getting and setting of profile data + PROFILESETTINGS * GetDashboardProfileSettings(int iPad); // Get pointer to the standard (originally xbox dashboard) profile data for one user + void *GetGameDefinedProfileData(int iQuadrant); // Get pointer to the game-defined profile data for one user + + // Reading and writing profiles + void ReadFromProfile(int iQuadrant, int iReadType=PROFILE_READTYPE_ALL); // Initiate read profile data for one user - read type is ignored on this platform + void WriteToProfile(int iQuadrant, bool bGameDefinedDataChanged=false, bool bOverride5MinuteLimitOnProfileWrites=false); // Initiate write profile for one user + void DeleteOptionsData(int iPad); // Delete profile data for one user + void ForceQueuedProfileWrites(int iPad=XUSER_INDEX_ANY); // Force any queued profile writes to write now + C4JStorage::ESaveGameState GetSaveState(); + + + ///////////////////////////////////////////////////////////////////////////// Unimplemented stubs ///////////////////////////////////////////////////////////////////////////////// + void SetSaveDeviceSelected(unsigned int uiPad,bool bSelected) {} + bool GetSaveDeviceSelected(unsigned int iPad) { return true; } + void ClearDLCOffers() {} + C4JStorage::ETMSStatus ReadTMSFile(int iQuadrant,eGlobalStorage eStorageFacility,C4JStorage::eTMS_FileType eFileType, WCHAR *pwchFilename,BYTE **ppBuffer,DWORD *pdwBufferSize,int( *Func)(LPVOID, WCHAR *,int, bool, int),LPVOID lpParam, int iAction) { return C4JStorage::ETMSStatus_Idle; } + bool WriteTMSFile(int iQuadrant,eGlobalStorage eStorageFacility,WCHAR *pwchFilename,BYTE *pBuffer,DWORD dwBufferSize) { return true; } + bool DeleteTMSFile(int iQuadrant,eGlobalStorage eStorageFacility,WCHAR *pwchFilename) { return true; } + C4JStorage::EDLCStatus GetDLCOffers(int iPad,int( *Func)(LPVOID, int, DWORD, int),LPVOID lpParam, DWORD dwOfferTypesBitmaskT) { return C4JStorage::EDLC_Idle; } + + // DLC + void SetDLCPackageRoot(char *pszDLCRoot); + EDLCStatus GetInstalledDLC(int iPad,int( *Func)(LPVOID, int, int),LPVOID lpParam); + CONTENT_DATA& GetDLC(DWORD dw); + DWORD GetAvailableDLCCount( int iPad ); + DWORD MountInstalledDLC(int iPad,DWORD dwDLC,int( *Func)(LPVOID, int, DWORD,DWORD),LPVOID lpParam,LPCSTR szMountDrive = NULL); + DWORD UnmountInstalledDLC(LPCSTR szMountDrive = NULL); + void GetMountedDLCFileList(const char* szMountDrive, std::vector& fileList); + std::string GetMountedPath(std::string szMount); + void SetDLCProductCode(const char* szProductCode); + void SetProductUpgradeKey(const char* szKey); + bool CheckForTrialUpgradeKey(void( *Func)(LPVOID, bool),LPVOID lpParam); + void SetDLCInfoMap(std::unordered_map* pSONYDLCMap); + void EntitlementsCallback(bool bFoundEntitlements); + +}; + +extern C4JStorage StorageManager; diff --git a/Minecraft.Client/PSVita/4JLibs/libs/4J_Input.a b/Minecraft.Client/PSVita/4JLibs/libs/4J_Input.a new file mode 100644 index 00000000..3dbc0fc6 Binary files /dev/null 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 new file mode 100644 index 00000000..141b00b9 Binary files /dev/null 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 new file mode 100644 index 00000000..5844343a Binary files /dev/null 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 new file mode 100644 index 00000000..0913ae64 Binary files /dev/null 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 new file mode 100644 index 00000000..b00f82c4 Binary files /dev/null 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 new file mode 100644 index 00000000..b1ad68f8 Binary files /dev/null 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 new file mode 100644 index 00000000..ae0c2e5e Binary files /dev/null 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 new file mode 100644 index 00000000..2e7d1011 Binary files /dev/null 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 new file mode 100644 index 00000000..77d47b5b Binary files /dev/null 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 new file mode 100644 index 00000000..9ba5bd68 Binary files /dev/null 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 new file mode 100644 index 00000000..35b9c683 Binary files /dev/null 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 new file mode 100644 index 00000000..631943a9 Binary files /dev/null and b/Minecraft.Client/PSVita/4JLibs/libs/4J_Storage_r.a differ diff --git a/Minecraft.Client/PSVita/4JLibs/libs/libSceNpToolkitUtils_rtti.a b/Minecraft.Client/PSVita/4JLibs/libs/libSceNpToolkitUtils_rtti.a new file mode 100644 index 00000000..e6665a20 Binary files /dev/null and b/Minecraft.Client/PSVita/4JLibs/libs/libSceNpToolkitUtils_rtti.a differ diff --git a/Minecraft.Client/PSVita/4JLibs/libs/libSceNpToolkitUtils_rtti_dbg.a b/Minecraft.Client/PSVita/4JLibs/libs/libSceNpToolkitUtils_rtti_dbg.a new file mode 100644 index 00000000..5334a002 Binary files /dev/null and b/Minecraft.Client/PSVita/4JLibs/libs/libSceNpToolkitUtils_rtti_dbg.a differ diff --git a/Minecraft.Client/PSVita/4JLibs/libs/libSceNpToolkit_rtti.a b/Minecraft.Client/PSVita/4JLibs/libs/libSceNpToolkit_rtti.a new file mode 100644 index 00000000..c2e5b3bf Binary files /dev/null and b/Minecraft.Client/PSVita/4JLibs/libs/libSceNpToolkit_rtti.a differ diff --git a/Minecraft.Client/PSVita/4JLibs/libs/libSceNpToolkit_rtti_dbg.a b/Minecraft.Client/PSVita/4JLibs/libs/libSceNpToolkit_rtti_dbg.a new file mode 100644 index 00000000..7bdd3af6 Binary files /dev/null and b/Minecraft.Client/PSVita/4JLibs/libs/libSceNpToolkit_rtti_dbg.a differ diff --git a/Minecraft.Client/PSVita/Assert/assert.h b/Minecraft.Client/PSVita/Assert/assert.h new file mode 100644 index 00000000..578b32e0 --- /dev/null +++ b/Minecraft.Client/PSVita/Assert/assert.h @@ -0,0 +1,20 @@ + +#pragma once +#include +#include + +#ifdef _CONTENT_PACKAGE +#define PSVITA_ASSERT(val) +#elif defined(_RELEASE_FOR_ART) +#define PSVITA_ASSERT(val) +#else +#define PSVITA_ASSERT(val) if(!(val)) { printf("------------------------------------------ \n"); \ + printf("Func : %s \n", __FUNCTION__); \ + printf("File : %s \n", __FILE__); \ + printf("Line : %d \n",__LINE__ ); \ + printf("assert(%s) failed!!!\n", #val); \ + printf("------------------------------------------ \n"); \ + SCE_BREAK(); } +#endif + +#define assert PSVITA_ASSERT diff --git a/Minecraft.Client/PSVita/GameConfig/Minecraft.gameconfig b/Minecraft.Client/PSVita/GameConfig/Minecraft.gameconfig new file mode 100644 index 00000000..14885d53 Binary files /dev/null and b/Minecraft.Client/PSVita/GameConfig/Minecraft.gameconfig differ diff --git a/Minecraft.Client/PSVita/GameConfig/Minecraft.spa b/Minecraft.Client/PSVita/GameConfig/Minecraft.spa new file mode 100644 index 00000000..ff87b0c6 Binary files /dev/null and b/Minecraft.Client/PSVita/GameConfig/Minecraft.spa differ diff --git a/Minecraft.Client/PSVita/GameConfig/Minecraft.spa.h b/Minecraft.Client/PSVita/GameConfig/Minecraft.spa.h new file mode 100644 index 00000000..9bf94461 --- /dev/null +++ b/Minecraft.Client/PSVita/GameConfig/Minecraft.spa.h @@ -0,0 +1,702 @@ +//////////////////////////////////////////////////////////////////// +// +// C:\Work\4J\Mojang\Minecraft\Minecraft360-dev\Minecraft.Client\Xbox\GameConfig\Minecraft.spa.h +// +// Auto-generated on Thursday, 10 May 2012 at 21:23:22 +// Xbox LIVE Game Config project version 1.0.173.0 +// SPA Compiler version 1.0.0.0 +// +//////////////////////////////////////////////////////////////////// + +#ifndef __MINECRAFT_SPA_H__ +#define __MINECRAFT_SPA_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +// +// Title info +// + +#define TITLEID_MINECRAFT 0x584111F7 + +// +// Context ids +// +// These values are passed as the dwContextId to XUserSetContext. +// + +#define CONTEXT_GAME_STATE 0 + +// +// Context values +// +// These values are passed as the dwContextValue to XUserSetContext. +// + +// Values for CONTEXT_GAME_STATE + +#define CONTEXT_GAME_STATE_BLANK 0 +#define CONTEXT_GAME_STATE_RIDING_PIG 1 +#define CONTEXT_GAME_STATE_RIDING_MINECART 2 +#define CONTEXT_GAME_STATE_BOATING 3 +#define CONTEXT_GAME_STATE_FISHING 4 +#define CONTEXT_GAME_STATE_CRAFTING 5 +#define CONTEXT_GAME_STATE_FORGING 6 +#define CONTEXT_GAME_STATE_NETHER 7 +#define CONTEXT_GAME_STATE_CD 8 +#define CONTEXT_GAME_STATE_MAP 9 +#define CONTEXT_GAME_STATE_ENCHANTING 10 +#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 + +#define CONTEXT_PRESENCE_IDLE 0 +#define CONTEXT_PRESENCE_MENUS 1 +#define CONTEXT_PRESENCE_MULTIPLAYER 2 +#define CONTEXT_PRESENCE_MULTIPLAYEROFFLINE 3 +#define CONTEXT_PRESENCE_MULTIPLAYER_1P 4 +#define CONTEXT_PRESENCE_MULTIPLAYER_1POFFLINE 5 + +// Values for X_CONTEXT_GAME_MODE + +#define CONTEXT_GAME_MODE_GAMEMODE 0 +#define CONTEXT_GAME_MODE_MULTIPLAYER 1 + +// +// Property ids +// +// These values are passed as the dwPropertyId value to XUserSetProperty +// and as the dwPropertyId value in the XUSER_PROPERTY structure. +// + +#define PROPERTY_LOCALE 0x10000008 +#define PROPERTY_KILLS_ZOMBIE 0x1000000A +#define PROPERTY_KILLS_SKELETON 0x1000000B +#define PROPERTY_KILLS_CREEPER 0x1000000C +#define PROPERTY_KILLS_SPIDER 0x1000000D +#define PROPERTY_KILLS_SPIDERJOCKEY 0x1000000E +#define PROPERTY_KILLS_ZOMBIEPIGMAN 0x1000000F +#define PROPERTY_KILLS_SLIME 0x10000010 +#define PROPERTY_KILLS_GHAST 0x10000011 +#define PROPERTY_MINED_DIRT 0x10000012 +#define PROPERTY_MINED_STONE 0x10000013 +#define PROPERTY_MINED_SAND 0x10000014 +#define PROPERTY_MINED_COBBLESTONE 0x10000015 +#define PROPERTY_MINED_GRAVEL 0x10000016 +#define PROPERTY_MINED_CLAY 0x10000017 +#define PROPERTY_MINED_OBSIDIAN 0x10000018 +#define PROPERTY_MINED_COAL 0x10000019 +#define PROPERTY_MINED_IRON 0x1000001A +#define PROPERTY_MINED_GOLD 0x1000001B +#define PROPERTY_MINED_DIAMOND 0x1000001C +#define PROPERTY_MINED_REDSTONE 0x1000001D +#define PROPERTY_MINED_LAPISLAZULI 0x1000001E +#define PROPERTY_MINED_NETHERRACK 0x1000001F +#define PROPERTY_MINED_SOULSAND 0x10000020 +#define PROPERTY_MINED_GLOWSTONE 0x10000021 +#define PROPERTY_COLLECTED_EGG 0x10000022 +#define PROPERTY_COLLECTED_WHEAT 0x10000023 +#define PROPERTY_COLLECTED_MUSHROOM 0x10000024 +#define PROPERTY_COLLECTED_SUGARCANE 0x10000025 +#define PROPERTY_COLLECTED_MILK 0x10000026 +#define PROPERTY_COLLECTED_PUMPKIN 0x10000027 +#define PROPERTY_TRAVEL_WALK 0x10000028 +#define PROPERTY_TRAVEL_SWIM 0x10000029 +#define PROPERTY_TRAVEL_FALL 0x1000002A +#define PROPERTY_TRAVEL_CLIMB 0x1000002B +#define PROPERTY_TRAVEL_MINECART 0x1000002C +#define PROPERTY_TRAVEL_BOAT 0x1000002D +#define PROPERTY_PORTALS_CREATED 0x1000002F +#define PROPERTY_COLLECTED_NETHERLAVA 0x10000030 +#define PROPERTY_RATING 0x20000009 + +// +// Achievement ids +// +// These values are used in the dwAchievementId member of the +// XUSER_ACHIEVEMENT structure that is used with +// XUserWriteAchievements and XUserCreateAchievementEnumerator. +// + +#define ACHIEVEMENT_01 1 +#define ACHIEVEMENT_02 2 +#define ACHIEVEMENT_03 3 +#define ACHIEVEMENT_04 4 +#define ACHIEVEMENT_05 5 +#define ACHIEVEMENT_06 6 +#define ACHIEVEMENT_07 7 +#define ACHIEVEMENT_08 8 +#define ACHIEVEMENT_09 9 +#define ACHIEVEMENT_10 10 +#define ACHIEVEMENT_11 11 +#define ACHIEVEMENT_12 12 +#define ACHIEVEMENT_13 13//4 //CD - Changed these as they unlocked the next trophy +#define ACHIEVEMENT_14 14//5 +#define ACHIEVEMENT_15 15//6 +#define ACHIEVEMENT_16 16//7 +#define ACHIEVEMENT_17 17//8 +#define ACHIEVEMENT_18 18//9 +#define ACHIEVEMENT_19 19//20 +#define ACHIEVEMENT_20 20//1 +#define ACHIEVEMENT_21 21//2 +#define ACHIEVEMENT_22 22//3 +#define ACHIEVEMENT_23 23//4 +#define ACHIEVEMENT_24 24//5 +#define ACHIEVEMENT_25 25//6 +#define ACHIEVEMENT_26 26//7 +#define ACHIEVEMENT_27 27//8 +#define ACHIEVEMENT_28 28//9 + +// 4J - Expanded Achivements (29-50), initially added for Durango. +#define ACHIEVEMENT_29 29 +#define ACHIEVEMENT_30 30 +#define ACHIEVEMENT_31 31 +#define ACHIEVEMENT_32 32 +#define ACHIEVEMENT_33 33 +#define ACHIEVEMENT_34 34 +#define ACHIEVEMENT_35 35 +#define ACHIEVEMENT_36 36 +#define ACHIEVEMENT_37 37 +#define ACHIEVEMENT_38 38 +#define ACHIEVEMENT_39 39 +#define ACHIEVEMENT_40 40 +#define ACHIEVEMENT_41 41 +#define ACHIEVEMENT_42 42 +#define ACHIEVEMENT_43 43 +#define ACHIEVEMENT_44 44 +#define ACHIEVEMENT_45 45 +#define ACHIEVEMENT_46 46 +#define ACHIEVEMENT_47 47 +#define ACHIEVEMENT_48 48 +#define ACHIEVEMENT_49 49 +#define ACHIEVEMENT_50 50 + + +// +// AvatarAssetAward ids +// + +#define AVATARASSETAWARD_PORKCHOP_TSHIRT 1 +#define AVATARASSETAWARD_WATCH 2 +#define AVATARASSETAWARD_CAP 5 + +// +// Stats view ids +// +// These are used in the dwViewId member of the XUSER_STATS_SPEC structure +// passed to the XUserReadStats* and XUserCreateStatsEnumerator* functions. +// + +// Skill leaderboards for ranked game modes + +#define STATS_VIEW_SKILL_RANKED_GAMEMODE 0xFFFF0000 +#define STATS_VIEW_SKILL_RANKED_MULTIPLAYER 0xFFFF0001 + +// Skill leaderboards for unranked (standard) game modes + +#define STATS_VIEW_SKILL_STANDARD_GAMEMODE 0xFFFE0000 +#define STATS_VIEW_SKILL_STANDARD_MULTIPLAYER 0xFFFE0001 + +// Title defined leaderboards + +#define STATS_VIEW_KILLS_EASY 4 +#define STATS_VIEW_KILLS_NORMAL 5 +#define STATS_VIEW_KILLS_HARD 6 +#define STATS_VIEW_MINING_BLOCKS_PEACEFUL 7 +#define STATS_VIEW_MINING_BLOCKS_EASY 8 +#define STATS_VIEW_MINING_BLOCKS_NORMAL 9 +#define STATS_VIEW_MINING_BLOCKS_HARD 10 +#define STATS_VIEW_FARMING_PEACEFUL 15 +#define STATS_VIEW_FARMING_EASY 16 +#define STATS_VIEW_FARMING_NORMAL 17 +#define STATS_VIEW_FARMING_HARD 18 +#define STATS_VIEW_TRAVELLING_PEACEFUL 19 +#define STATS_VIEW_TRAVELLING_EASY 20 +#define STATS_VIEW_TRAVELLING_NORMAL 21 +#define STATS_VIEW_TRAVELLING_HARD 22 +#define STATS_VIEW_TRAVELLING_TOTAL 27 + +// +// Stats view column ids +// +// These ids are used to read columns of stats views. They are specified in +// the rgwColumnIds array of the XUSER_STATS_SPEC structure. Rank, rating +// and gamertag are not retrieved as custom columns and so are not included +// in the following definitions. They can be retrieved from each row's +// header (e.g., pStatsResults->pViews[x].pRows[y].dwRank, etc.). +// + +// Column ids for KILLS_EASY + +#define STATS_COLUMN_KILLS_EASY_LOCALE 9 +#define STATS_COLUMN_KILLS_EASY_ZOMBIES 1 +#define STATS_COLUMN_KILLS_EASY_SKELETONS 2 +#define STATS_COLUMN_KILLS_EASY_CREEPERS 3 +#define STATS_COLUMN_KILLS_EASY_SPIDERS 4 +#define STATS_COLUMN_KILLS_EASY_SPIDERJOCKEYS 5 +#define STATS_COLUMN_KILLS_EASY_ZOMBIEPIGMEN 6 +#define STATS_COLUMN_KILLS_EASY_SLIME 7 + +// Column ids for KILLS_NORMAL + +#define STATS_COLUMN_KILLS_NORMAL_LOCALE 9 +#define STATS_COLUMN_KILLS_NORMAL_ZOMBIES 1 +#define STATS_COLUMN_KILLS_NORMAL_SKELETONS 2 +#define STATS_COLUMN_KILLS_NORMAL_CREEPERS 3 +#define STATS_COLUMN_KILLS_NORMAL_SPIDERS 4 +#define STATS_COLUMN_KILLS_NORMAL_SPIDERJOCKEYS 5 +#define STATS_COLUMN_KILLS_NORMAL_ZOMBIEPIGMEN 6 +#define STATS_COLUMN_KILLS_NORMAL_SLIME 7 + +// Column ids for KILLS_HARD + +#define STATS_COLUMN_KILLS_HARD_LOCALE 9 +#define STATS_COLUMN_KILLS_HARD_ZOMBIES 1 +#define STATS_COLUMN_KILLS_HARD_SKELETONS 2 +#define STATS_COLUMN_KILLS_HARD_CREEPERS 3 +#define STATS_COLUMN_KILLS_HARD_SPIDERS 4 +#define STATS_COLUMN_KILLS_HARD_SPIDERJOCKEYS 5 +#define STATS_COLUMN_KILLS_HARD_ZOMBIEPIGMEN 6 +#define STATS_COLUMN_KILLS_HARD_SLIME 7 + +// Column ids for MINING_BLOCKS_PEACEFUL + +#define STATS_COLUMN_MINING_BLOCKS_PEACEFUL_LOCALE 1 +#define STATS_COLUMN_MINING_BLOCKS_PEACEFUL_DIRT 2 +#define STATS_COLUMN_MINING_BLOCKS_PEACEFUL_STONE 3 +#define STATS_COLUMN_MINING_BLOCKS_PEACEFUL_SAND 4 +#define STATS_COLUMN_MINING_BLOCKS_PEACEFUL_COBBLESTONE 5 +#define STATS_COLUMN_MINING_BLOCKS_PEACEFUL_GRAVEL 6 +#define STATS_COLUMN_MINING_BLOCKS_PEACEFUL_CLAY 7 +#define STATS_COLUMN_MINING_BLOCKS_PEACEFUL_OBSIDIAN 8 + +// Column ids for MINING_BLOCKS_EASY + +#define STATS_COLUMN_MINING_BLOCKS_EASY_LOCALE 1 +#define STATS_COLUMN_MINING_BLOCKS_EASY_DIRT 2 +#define STATS_COLUMN_MINING_BLOCKS_EASY_STONE 3 +#define STATS_COLUMN_MINING_BLOCKS_EASY_SAND 4 +#define STATS_COLUMN_MINING_BLOCKS_EASY_COBBLESTONE 5 +#define STATS_COLUMN_MINING_BLOCKS_EASY_GRAVEL 6 +#define STATS_COLUMN_MINING_BLOCKS_EASY_CLAY 7 +#define STATS_COLUMN_MINING_BLOCKS_EASY_OBSIDIAN 8 + +// Column ids for MINING_BLOCKS_NORMAL + +#define STATS_COLUMN_MINING_BLOCKS_NORMAL_LOCALE 1 +#define STATS_COLUMN_MINING_BLOCKS_NORMAL_DIRT 2 +#define STATS_COLUMN_MINING_BLOCKS_NORMAL_STONE 3 +#define STATS_COLUMN_MINING_BLOCKS_NORMAL_SAND 4 +#define STATS_COLUMN_MINING_BLOCKS_NORMAL_COBBLESTONE 5 +#define STATS_COLUMN_MINING_BLOCKS_NORMAL_GRAVEL 6 +#define STATS_COLUMN_MINING_BLOCKS_NORMAL_CLAY 7 +#define STATS_COLUMN_MINING_BLOCKS_NORMAL_OBSIDIAN 8 + +// Column ids for MINING_BLOCKS_HARD + +#define STATS_COLUMN_MINING_BLOCKS_HARD_LOCALE 1 +#define STATS_COLUMN_MINING_BLOCKS_HARD_DIRT 2 +#define STATS_COLUMN_MINING_BLOCKS_HARD_STONE 3 +#define STATS_COLUMN_MINING_BLOCKS_HARD_SAND 4 +#define STATS_COLUMN_MINING_BLOCKS_HARD_COBBLESTONE 5 +#define STATS_COLUMN_MINING_BLOCKS_HARD_GRAVEL 6 +#define STATS_COLUMN_MINING_BLOCKS_HARD_CLAY 7 +#define STATS_COLUMN_MINING_BLOCKS_HARD_OBSIDIAN 8 + +// Column ids for FARMING_PEACEFUL + +#define STATS_COLUMN_FARMING_PEACEFUL_LOCALE 1 +#define STATS_COLUMN_FARMING_PEACEFUL_EGGS 2 +#define STATS_COLUMN_FARMING_PEACEFUL_WHEAT 3 +#define STATS_COLUMN_FARMING_PEACEFUL_MUSHROOMS 4 +#define STATS_COLUMN_FARMING_PEACEFUL_SUGARCANE 5 +#define STATS_COLUMN_FARMING_PEACEFUL_MILK 6 +#define STATS_COLUMN_FARMING_PEACEFUL_PUMPKINS 7 + +// Column ids for FARMING_EASY + +#define STATS_COLUMN_FARMING_EASY_LOCALE 1 +#define STATS_COLUMN_FARMING_EASY_EGGS 2 +#define STATS_COLUMN_FARMING_EASY_WHEAT 3 +#define STATS_COLUMN_FARMING_EASY_MUSHROOMS 4 +#define STATS_COLUMN_FARMING_EASY_SUGARCANE 5 +#define STATS_COLUMN_FARMING_EASY_MILK 6 +#define STATS_COLUMN_FARMING_EASY_PUMPKINS 7 + +// Column ids for FARMING_NORMAL + +#define STATS_COLUMN_FARMING_NORMAL_LOCALE 1 +#define STATS_COLUMN_FARMING_NORMAL_EGGS 2 +#define STATS_COLUMN_FARMING_NORMAL_WHEAT 3 +#define STATS_COLUMN_FARMING_NORMAL_MUSHROOMS 4 +#define STATS_COLUMN_FARMING_NORMAL_SUGARCANE 5 +#define STATS_COLUMN_FARMING_NORMAL_MILK 6 +#define STATS_COLUMN_FARMING_NORMAL_PUMPKINS 7 + +// Column ids for FARMING_HARD + +#define STATS_COLUMN_FARMING_HARD_LOCALE 1 +#define STATS_COLUMN_FARMING_HARD_EGGS 2 +#define STATS_COLUMN_FARMING_HARD_WHEAT 3 +#define STATS_COLUMN_FARMING_HARD_MUSHROOMS 4 +#define STATS_COLUMN_FARMING_HARD_SUGARCANE 5 +#define STATS_COLUMN_FARMING_HARD_MILK 6 +#define STATS_COLUMN_FARMING_HARD_PUMPKINS 7 + +// Column ids for TRAVELLING_PEACEFUL + +#define STATS_COLUMN_TRAVELLING_PEACEFUL_LOCALE 1 +#define STATS_COLUMN_TRAVELLING_PEACEFUL_WALKED 2 +#define STATS_COLUMN_TRAVELLING_PEACEFUL_SWAM 3 +#define STATS_COLUMN_TRAVELLING_PEACEFUL_FALLEN 4 +#define STATS_COLUMN_TRAVELLING_PEACEFUL_CLIMBED 5 +#define STATS_COLUMN_TRAVELLING_PEACEFUL_MINECART 6 +#define STATS_COLUMN_TRAVELLING_PEACEFUL_BOAT 7 + +// Column ids for TRAVELLING_EASY + +#define STATS_COLUMN_TRAVELLING_EASY_LOCALE 1 +#define STATS_COLUMN_TRAVELLING_EASY_WALKED 2 +#define STATS_COLUMN_TRAVELLING_EASY_SWAM 3 +#define STATS_COLUMN_TRAVELLING_EASY_FALLEN 4 +#define STATS_COLUMN_TRAVELLING_EASY_CLIMBED 5 +#define STATS_COLUMN_TRAVELLING_EASY_MINECART 6 +#define STATS_COLUMN_TRAVELLING_EASY_BOAT 7 + +// Column ids for TRAVELLING_NORMAL + +#define STATS_COLUMN_TRAVELLING_NORMAL_LOCALE 1 +#define STATS_COLUMN_TRAVELLING_NORMAL_WALKED 2 +#define STATS_COLUMN_TRAVELLING_NORMAL_SWAM 3 +#define STATS_COLUMN_TRAVELLING_NORMAL_FALLEN 4 +#define STATS_COLUMN_TRAVELLING_NORMAL_CLIMBED 5 +#define STATS_COLUMN_TRAVELLING_NORMAL_MINECART 6 +#define STATS_COLUMN_TRAVELLING_NORMAL_BOAT 7 + +// Column ids for TRAVELLING_HARD + +#define STATS_COLUMN_TRAVELLING_HARD_LOCALE 1 +#define STATS_COLUMN_TRAVELLING_HARD_WALKED 2 +#define STATS_COLUMN_TRAVELLING_HARD_SWAM 3 +#define STATS_COLUMN_TRAVELLING_HARD_FALLEN 4 +#define STATS_COLUMN_TRAVELLING_HARD_CLIMBED 5 +#define STATS_COLUMN_TRAVELLING_HARD_MINECART 6 +#define STATS_COLUMN_TRAVELLING_HARD_BOAT 7 + +// Column ids for TRAVELLING_TOTAL + + +// +// Matchmaking queries +// +// These values are passed as the dwProcedureIndex parameter to +// XSessionSearch to indicate which matchmaking query to run. +// + +#define SESSION_MATCH_QUERY_FRIENDS 0 + +// +// Gamer pictures +// +// These ids are passed as the dwPictureId parameter to XUserAwardGamerTile. +// + +#define GAMER_PICTURE_GAMERPIC1 12 +#define GAMER_PICTURE_GAMERPIC2 13 + +// +// Strings +// +// These ids are passed as the dwStringId parameter to XReadStringsFromSpaFile. +// + +#define SPASTRING_PRESENCE_IDLE_NAME 4 +#define SPASTRING_PRESENCE_MENUS_NAME 10 +#define SPASTRING_ACH_01_NAME 376 +#define SPASTRING_ACH_02_NAME 377 +#define SPASTRING_ACH_03_NAME 378 +#define SPASTRING_ACH_07_NAME 379 +#define SPASTRING_ACH_08_NAME 380 +#define SPASTRING_ACH_09_NAME 381 +#define SPASTRING_ACH_13_NAME 382 +#define SPASTRING_ACH_14_NAME 383 +#define SPASTRING_ACH_15_NAME 384 +#define SPASTRING_ACH_16_NAME 385 +#define SPASTRING_ACH_04_NAME 386 +#define SPASTRING_ACH_10_NAME 387 +#define SPASTRING_ACH_01_DESC 388 +#define SPASTRING_ACH_02_DESC 389 +#define SPASTRING_ACH_03_DESC 390 +#define SPASTRING_ACH_07_DESC 391 +#define SPASTRING_ACH_08_DESC 392 +#define SPASTRING_ACH_09_DESC 393 +#define SPASTRING_ACH_13_DESC 394 +#define SPASTRING_ACH_14_DESC 395 +#define SPASTRING_ACH_15_DESC 396 +#define SPASTRING_ACH_16_DESC 397 +#define SPASTRING_ACH_04_DESC 398 +#define SPASTRING_ACH_10_DESC 399 +#define SPASTRING_ACH_01_HOWTO 400 +#define SPASTRING_ACH_02_HOWTO 401 +#define SPASTRING_ACH_03_HOWTO 402 +#define SPASTRING_ACH_07_HOWTO 403 +#define SPASTRING_ACH_08_HOWTO 404 +#define SPASTRING_ACH_09_HOWTO 405 +#define SPASTRING_ACH_13_HOWTO 406 +#define SPASTRING_ACH_14_HOWTO 407 +#define SPASTRING_ACH_15_HOWTO 408 +#define SPASTRING_ACH_16_HOWTO 409 +#define SPASTRING_ACH_04_HOWTO 410 +#define SPASTRING_ACH_10_HOWTO 411 +#define SPASTRING_STR_GAMEMODE_SINGLEPLAYER 420 +#define SPASTRING_ACH_05_HOWTO 429 +#define SPASTRING_ACH_05_NAME 430 +#define SPASTRING_ACH_05_DESC 431 +#define SPASTRING_ACH_11_HOWTO 432 +#define SPASTRING_ACH_11_NAME 433 +#define SPASTRING_ACH_11_DESC 434 +#define SPASTRING_ACH_06_HOWTO 435 +#define SPASTRING_ACH_06_NAME 436 +#define SPASTRING_ACH_06_DESC 437 +#define SPASTRING_ACH_12_HOWTO 438 +#define SPASTRING_ACH_12_NAME 439 +#define SPASTRING_ACH_12_DESC 440 +#define SPASTRING_ACH_17_HOWTO 441 +#define SPASTRING_ACH_17_NAME 442 +#define SPASTRING_ACH_17_DESC 443 +#define SPASTRING_ACH_18_HOWTO 444 +#define SPASTRING_ACH_18_NAME 445 +#define SPASTRING_ACH_18_DESC 446 +#define SPASTRING_ACH_19_HOWTO 447 +#define SPASTRING_ACH_19_NAME 448 +#define SPASTRING_ACH_19_DESC 449 +#define SPASTRING_ACH_20_HOWTO 450 +#define SPASTRING_ACH_20_NAME 451 +#define SPASTRING_ACH_20_DESC 452 +#define SPASTRING_AV_PORKCHOP_TSHIRT_HOWTO 473 +#define SPASTRING_AV_PORKCHOP_TSHIRT_TITLE1 474 +#define SPASTRING_AV_PORKCHOP_TSHIRT_TITLE2 475 +#define SPASTRING_AV_PORKCHOP_TSHIRT_DESC 476 +#define SPASTRING_AV_WATCH_HOWTO 477 +#define SPASTRING_AV_WATCH_TITLE1 478 +#define SPASTRING_AV_WATCH_TITLE2 479 +#define SPASTRING_AV_WATCH_DESC 480 +#define SPASTRING_PRESENCE_MULTIPLAYER_NAME 490 +#define SPASTRING_CT_GAME_STATE_NAME 492 +#define SPASTRING_CV_GAME_STATE_BLANK_NAME 496 +#define SPASTRING_CV_GAME_STATE_RIDING_PIG_NAME 497 +#define SPASTRING_CV_GAME_STATE_RIDING_MINECART_NAME 498 +#define SPASTRING_CV_GAME_STATE_BOATING_NAME 499 +#define SPASTRING_CV_GAME_STATE_FISHING_NAME 500 +#define SPASTRING_CV_GAME_STATE_CRAFTING_NAME 501 +#define SPASTRING_CV_GAME_STATE_FORGING_NAME 502 +#define SPASTRING_CV_GAME_STATE_NETHER_NAME 503 +#define SPASTRING_CV_GAME_STATE_CD_NAME 504 +#define SPASTRING_CV_GAME_STATE_MAP_NAME 505 +#define SPASTRING_AV_CAP_HOWTO 506 +#define SPASTRING_AV_CAP_TITLE1 507 +#define SPASTRING_AV_CAP_TITLE2 508 +#define SPASTRING_AV_CAP_DESC 509 +#define SPASTRING_GM_MULTIPLAYER_NAME 517 +#define SPASTRING_PROPERTY_LOCALE_NAME 520 +#define SPASTRING_LB_KILLS_EASY_NAME 523 +#define SPASTRING_LB_KILLS_EASY_ZOMBIES_NAME 524 +#define SPASTRING_LB_KILLS_EASY_SKELETONS_NAME 525 +#define SPASTRING_LB_KILLS_EASY_CREEPERS_NAME 526 +#define SPASTRING_LB_KILLS_EASY_SPIDERS_NAME 527 +#define SPASTRING_LB_KILLS_EASY_SPIDERJOCKEYS_NAME 528 +#define SPASTRING_LB_KILLS_EASY_ZOMBIEPIGMEN_NAME 529 +#define SPASTRING_LB_KILLS_EASY_SLIME_NAME 530 +#define SPASTRING_LB_KILLS_EASY_RATING_NAME 531 +#define SPASTRING_PROPERTY_RATING_NAME 532 +#define SPASTRING_LB_KILLS_EASY_LOCALE_NAME 533 +#define SPASTRING_PROPERTY_KILLS_ZOMBIE_NAME 534 +#define SPASTRING_PROPERTY_KILLS_SKELETON_NAME 535 +#define SPASTRING_PROPERTY_KILLS_CREEPER_NAME 536 +#define SPASTRING_PROPERTY_KILLS_SPIDER_NAME 537 +#define SPASTRING_PROPERTY_KILLS_SPIDERJOCKEY_NAME 538 +#define SPASTRING_PROPERTY_KILLS_ZOMBIEPIGMAN_NAME 539 +#define SPASTRING_PROPERTY_KILLS_SLIME_NAME 540 +#define SPASTRING_PROPERTY_KILLS_GHAST_NAME 541 +#define SPASTRING_LB_KILLS_NORMAL_NAME 543 +#define SPASTRING_LB_KILLS_NORMAL_LOCALE_NAME 544 +#define SPASTRING_LB_KILLS_NORMAL_ZOMBIES_NAME 545 +#define SPASTRING_LB_KILLS_NORMAL_SKELETONS_NAME 546 +#define SPASTRING_LB_KILLS_NORMAL_CREEPERS_NAME 547 +#define SPASTRING_LB_KILLS_NORMAL_SPIDERS_NAME 548 +#define SPASTRING_LB_KILLS_NORMAL_SPIDERJOCKEYS_NAME 549 +#define SPASTRING_LB_KILLS_NORMAL_ZOMBIEPIGMEN_NAME 550 +#define SPASTRING_LB_KILLS_NORMAL_SLIME_NAME 551 +#define SPASTRING_LB_KILLS_NORMAL_RATING_NAME 552 +#define SPASTRING_LB_KILLS_HARD_NAME 554 +#define SPASTRING_LB_KILLS_HARD_LOCALE_NAME 555 +#define SPASTRING_LB_KILLS_HARD_ZOMBIES_NAME 556 +#define SPASTRING_LB_KILLS_HARD_SKELETONS_NAME 557 +#define SPASTRING_LB_KILLS_HARD_CREEPERS_NAME 558 +#define SPASTRING_LB_KILLS_HARD_SPIDERS_NAME 559 +#define SPASTRING_LB_KILLS_HARD_SPIDERJOCKEYS_NAME 560 +#define SPASTRING_LB_KILLS_HARD_ZOMBIEPIGMEN_NAME 561 +#define SPASTRING_LB_KILLS_HARD_SLIME_NAME 562 +#define SPASTRING_LB_KILLS_HARD_RATING_NAME 563 +#define SPASTRING_LB_MINING_BLOCKS_PEACEFUL_NAME 564 +#define SPASTRING_LB_MINING_BLOCKS_PEACEFUL_LOCALE_NAME 565 +#define SPASTRING_LB_MINING_BLOCKS_PEACEFUL_DIRT_NAME 566 +#define SPASTRING_LB_MINING_BLOCKS_PEACEFUL_STONE_NAME 567 +#define SPASTRING_LB_MINING_BLOCKS_PEACEFUL_SAND_NAME 568 +#define SPASTRING_LB_MINING_BLOCKS_PEACEFUL_COBBLESTONE_NAME 569 +#define SPASTRING_LB_MINING_BLOCKS_PEACEFUL_GRAVEL_NAME 570 +#define SPASTRING_LB_MINING_BLOCKS_PEACEFUL_CLAY_NAME 571 +#define SPASTRING_LB_MINING_BLOCKS_PEACEFUL_OBSIDIAN_NAME 572 +#define SPASTRING_LB_MINING_BLOCKS_PEACEFUL_RATING_NAME 573 +#define SPASTRING_PROPERTY_MINED_DIRT_NAME 574 +#define SPASTRING_PROPERTY_MINED_STONE_NAME 575 +#define SPASTRING_PROPERTY_MINED_SAND_NAME 576 +#define SPASTRING_PROPERTY_MINED_COBBLESTONE_NAME 577 +#define SPASTRING_PROPERTY_MINED_GRAVEL_NAME 578 +#define SPASTRING_PROPERTY_MINED_CLAY_NAME 579 +#define SPASTRING_PROPERTY_MINED_OBSIDIAN_NAME 580 +#define SPASTRING_PROPERTY_MINED_COAL_NAME 581 +#define SPASTRING_PROPERTY_MINED_IRON_NAME 582 +#define SPASTRING_PROPERTY_MINED_GOLD_NAME 583 +#define SPASTRING_PROPERTY_MINED_DIAMOND_NAME 584 +#define SPASTRING_PROPERTY_MINED_REDSTONE_NAME 585 +#define SPASTRING_PROPERTY_MINED_LAPISLAZULI_NAME 586 +#define SPASTRING_PROPERTY_MINED_NETHERRACK_NAME 587 +#define SPASTRING_PROPERTY_MINED_SOULSAND_NAME 588 +#define SPASTRING_PROPERTY_MINED_GLOWSTONE_NAME 589 +#define SPASTRING_PROPERTY_COLLECTED_EGG_NAME 590 +#define SPASTRING_PROPERTY_COLLECTED_WHEAT_NAME 591 +#define SPASTRING_PROPERTY_COLLECTED_MUSHROOM_NAME 592 +#define SPASTRING_PROPERTY_COLLECTED_SUGARCANE_NAME 593 +#define SPASTRING_PROPERTY_COLLECTED_MILK_NAME 594 +#define SPASTRING_PROPERTY_COLLECTED_PUMPKIN_NAME 595 +#define SPASTRING_PROPERTY_TRAVEL_WALK_NAME 596 +#define SPASTRING_PROPERTY_TRAVEL_SWIM_NAME 597 +#define SPASTRING_PROPERTY_TRAVEL_FALL_NAME 598 +#define SPASTRING_PROPERTY_TRAVEL_CLIMB_NAME 599 +#define SPASTRING_PROPERTY_TRAVEL_MINECART_NAME 600 +#define SPASTRING_PROPERTY_TRAVEL_BOAT_NAME 601 +#define SPASTRING_PROPERTY_PORTALS_CREATED_NAME 603 +#define SPASTRING_LB_MINING_BLOCKS_EASY_NAME 605 +#define SPASTRING_LB_MINING_BLOCKS_EASY_LOCALE_NAME 606 +#define SPASTRING_LB_MINING_BLOCKS_EASY_DIRT_NAME 607 +#define SPASTRING_LB_MINING_BLOCKS_EASY_STONE_NAME 608 +#define SPASTRING_LB_MINING_BLOCKS_EASY_SAND_NAME 609 +#define SPASTRING_LB_MINING_BLOCKS_EASY_COBBLESTONE_NAME 610 +#define SPASTRING_LB_MINING_BLOCKS_EASY_GRAVEL_NAME 611 +#define SPASTRING_LB_MINING_BLOCKS_EASY_CLAY_NAME 612 +#define SPASTRING_LB_MINING_BLOCKS_EASY_OBSIDIAN_NAME 613 +#define SPASTRING_LB_MINING_BLOCKS_EASY_RATING_NAME 614 +#define SPASTRING_LB_MINING_BLOCKS_NORMAL_NAME 616 +#define SPASTRING_LB_MINING_BLOCKS_NORMAL_LOCALE_NAME 617 +#define SPASTRING_LB_MINING_BLOCKS_NORMAL_DIRT_NAME 618 +#define SPASTRING_LB_MINING_BLOCKS_NORMAL_STONE_NAME 619 +#define SPASTRING_LB_MINING_BLOCKS_NORMAL_SAND_NAME 620 +#define SPASTRING_LB_MINING_BLOCKS_NORMAL_COBBLESTONE_NAME 621 +#define SPASTRING_LB_MINING_BLOCKS_NORMAL_GRAVEL_NAME 622 +#define SPASTRING_LB_MINING_BLOCKS_NORMAL_CLAY_NAME 623 +#define SPASTRING_LB_MINING_BLOCKS_NORMAL_OBSIDIAN_NAME 624 +#define SPASTRING_LB_MINING_BLOCKS_NORMAL_RATING_NAME 625 +#define SPASTRING_LB_MINING_BLOCKS_HARD_NAME 627 +#define SPASTRING_LB_MINING_BLOCKS_HARD_LOCALE_NAME 628 +#define SPASTRING_LB_MINING_BLOCKS_HARD_DIRT_NAME 629 +#define SPASTRING_LB_MINING_BLOCKS_HARD_STONE_NAME 630 +#define SPASTRING_LB_MINING_BLOCKS_HARD_SAND_NAME 631 +#define SPASTRING_LB_MINING_BLOCKS_HARD_COBBLESTONE_NAME 632 +#define SPASTRING_LB_MINING_BLOCKS_HARD_GRAVEL_NAME 633 +#define SPASTRING_LB_MINING_BLOCKS_HARD_CLAY_NAME 634 +#define SPASTRING_LB_MINING_BLOCKS_HARD_OBSIDIAN_NAME 635 +#define SPASTRING_LB_MINING_BLOCKS_HARD_RATING_NAME 636 +#define SPASTRING_LB_FARMING_PEACEFUL_NAME 676 +#define SPASTRING_LB_FARMING_PEACEFUL_LOCALE_NAME 677 +#define SPASTRING_LB_FARMING_PEACEFUL_EGGS_NAME 678 +#define SPASTRING_LB_FARMING_PEACEFUL_WHEAT_NAME 679 +#define SPASTRING_LB_FARMING_PEACEFUL_MUSHROOMS_NAME 680 +#define SPASTRING_LB_FARMING_PEACEFUL_SUGARCANE_NAME 681 +#define SPASTRING_LB_FARMING_PEACEFUL_MILK_NAME 682 +#define SPASTRING_LB_FARMING_PEACEFUL_PUMPKINS_NAME 683 +#define SPASTRING_LB_FARMING_PEACEFUL_RATING_NAME 684 +#define SPASTRING_LB_FARMING_EASY_NAME 686 +#define SPASTRING_LB_FARMING_EASY_LOCALE_NAME 687 +#define SPASTRING_LB_FARMING_EASY_EGGS_NAME 688 +#define SPASTRING_LB_FARMING_EASY_WHEAT_NAME 689 +#define SPASTRING_LB_FARMING_EASY_MUSHROOMS_NAME 690 +#define SPASTRING_LB_FARMING_EASY_SUGARCANE_NAME 691 +#define SPASTRING_LB_FARMING_EASY_MILK_NAME 692 +#define SPASTRING_LB_FARMING_EASY_PUMPKINS_NAME 693 +#define SPASTRING_LB_FARMING_EASY_RATING_NAME 694 +#define SPASTRING_LB_FARMING_NORMAL_NAME 696 +#define SPASTRING_LB_FARMING_NORMAL_LOCALE_NAME 697 +#define SPASTRING_LB_FARMING_NORMAL_EGGS_NAME 698 +#define SPASTRING_LB_FARMING_NORMAL_WHEAT_NAME 699 +#define SPASTRING_LB_FARMING_NORMAL_MUSHROOMS_NAME 700 +#define SPASTRING_LB_FARMING_NORMAL_SUGARCANE_NAME 701 +#define SPASTRING_LB_FARMING_NORMAL_MILK_NAME 702 +#define SPASTRING_LB_FARMING_NORMAL_PUMPKINS_NAME 703 +#define SPASTRING_LB_FARMING_NORMAL_RATING_NAME 704 +#define SPASTRING_LB_FARMING_HARD_NAME 706 +#define SPASTRING_LB_FARMING_HARD_LOCALE_NAME 707 +#define SPASTRING_LB_FARMING_HARD_EGGS_NAME 708 +#define SPASTRING_LB_FARMING_HARD_WHEAT_NAME 709 +#define SPASTRING_LB_FARMING_HARD_MUSHROOMS_NAME 710 +#define SPASTRING_LB_FARMING_HARD_SUGARCANE_NAME 711 +#define SPASTRING_LB_FARMING_HARD_MILK_NAME 712 +#define SPASTRING_LB_FARMING_HARD_PUMPKINS_NAME 713 +#define SPASTRING_LB_FARMING_HARD_RATING_NAME 714 +#define SPASTRING_LB_TRAVELLING_PEACEFUL_NAME 715 +#define SPASTRING_LB_TRAVELLING_PEACEFUL_LOCALE_NAME 716 +#define SPASTRING_LB_TRAVELLING_PEACEFUL_WALKED_NAME 717 +#define SPASTRING_LB_TRAVELLING_PEACEFUL_SWAM_NAME 718 +#define SPASTRING_LB_TRAVELLING_PEACEFUL_FALLEN_NAME 719 +#define SPASTRING_LB_TRAVELLING_PEACEFUL_CLIMBED_NAME 720 +#define SPASTRING_LB_TRAVELLING_PEACEFUL_MINECART_NAME 721 +#define SPASTRING_LB_TRAVELLING_PEACEFUL_BOAT_NAME 722 +#define SPASTRING_LB_TRAVELLING_PEACEFUL_RATING_NAME 724 +#define SPASTRING_LB_TRAVELLING_EASY_NAME 726 +#define SPASTRING_LB_TRAVELLING_EASY_LOCALE_NAME 727 +#define SPASTRING_LB_TRAVELLING_EASY_WALKED_NAME 728 +#define SPASTRING_LB_TRAVELLING_EASY_SWAM_NAME 729 +#define SPASTRING_LB_TRAVELLING_EASY_FALLEN_NAME 730 +#define SPASTRING_LB_TRAVELLING_EASY_CLIMBED_NAME 731 +#define SPASTRING_LB_TRAVELLING_EASY_MINECART_NAME 732 +#define SPASTRING_LB_TRAVELLING_EASY_BOAT_NAME 733 +#define SPASTRING_LB_TRAVELLING_EASY_RATING_NAME 735 +#define SPASTRING_LB_TRAVELLING_NORMAL_NAME 737 +#define SPASTRING_LB_TRAVELLING_NORMAL_LOCALE_NAME 738 +#define SPASTRING_LB_TRAVELLING_NORMAL_WALKED_NAME 739 +#define SPASTRING_LB_TRAVELLING_NORMAL_SWAM_NAME 740 +#define SPASTRING_LB_TRAVELLING_NORMAL_FALLEN_NAME 741 +#define SPASTRING_LB_TRAVELLING_NORMAL_CLIMBED_NAME 742 +#define SPASTRING_LB_TRAVELLING_NORMAL_MINECART_NAME 743 +#define SPASTRING_LB_TRAVELLING_NORMAL_BOAT_NAME 744 +#define SPASTRING_LB_TRAVELLING_NORMAL_RATING_NAME 746 +#define SPASTRING_LB_TRAVELLING_HARD_NAME 748 +#define SPASTRING_LB_TRAVELLING_HARD_LOCALE_NAME 749 +#define SPASTRING_LB_TRAVELLING_HARD_WALKED_NAME 750 +#define SPASTRING_LB_TRAVELLING_HARD_SWAM_NAME 751 +#define SPASTRING_LB_TRAVELLING_HARD_FALLEN_NAME 752 +#define SPASTRING_LB_TRAVELLING_HARD_CLIMBED_NAME 753 +#define SPASTRING_LB_TRAVELLING_HARD_MINECART_NAME 754 +#define SPASTRING_LB_TRAVELLING_HARD_BOAT_NAME 755 +#define SPASTRING_LB_TRAVELLING_HARD_RATING_NAME 757 +#define SPASTRING_LB_TRAVELLING_TOTAL_NAME 795 +#define SPASTRING_LB_TRAVELLING_TOTAL_RATING_NAME 796 +#define SPASTRING_LB_ARCADE_TRAVELLING_TOTAL_RATING_NAME 797 +#define SPASTRING_PROPERTY_COLLECTED_NETHERLAVA_NAME 799 +#define SPASTRING_PRESENCE_MULTIPLAYEROFFLINE_NAME 803 +#define SPASTRING_PRESENCE_MULTIPLAYER_1P_NAME 804 +#define SPASTRING_PRESENCE_MULTIPLAYER_1POFFLINE_NAME 805 + + +#ifdef __cplusplus +} +#endif + +#endif // __MINECRAFT_SPA_H__ + + diff --git a/Minecraft.Client/PSVita/GameConfig/Minecraft.trp b/Minecraft.Client/PSVita/GameConfig/Minecraft.trp new file mode 100644 index 00000000..76340ec3 Binary files /dev/null and b/Minecraft.Client/PSVita/GameConfig/Minecraft.trp differ diff --git a/Minecraft.Client/PSVita/GameConfig/Minecraft_signed.trp b/Minecraft.Client/PSVita/GameConfig/Minecraft_signed.trp new file mode 100644 index 00000000..cb459345 Binary files /dev/null and b/Minecraft.Client/PSVita/GameConfig/Minecraft_signed.trp differ diff --git a/Minecraft.Client/PSVita/GameConfig/TROP000.PNG b/Minecraft.Client/PSVita/GameConfig/TROP000.PNG new file mode 100644 index 00000000..d005a63b Binary files /dev/null and b/Minecraft.Client/PSVita/GameConfig/TROP000.PNG differ diff --git a/Minecraft.Client/PSVita/GameConfig/TROP001.PNG b/Minecraft.Client/PSVita/GameConfig/TROP001.PNG new file mode 100644 index 00000000..a7fd3d54 Binary files /dev/null and b/Minecraft.Client/PSVita/GameConfig/TROP001.PNG differ diff --git a/Minecraft.Client/PSVita/GameConfig/TROP002.PNG b/Minecraft.Client/PSVita/GameConfig/TROP002.PNG new file mode 100644 index 00000000..381804a8 Binary files /dev/null and b/Minecraft.Client/PSVita/GameConfig/TROP002.PNG differ diff --git a/Minecraft.Client/PSVita/GameConfig/TROP003.PNG b/Minecraft.Client/PSVita/GameConfig/TROP003.PNG new file mode 100644 index 00000000..6e1543c3 Binary files /dev/null and b/Minecraft.Client/PSVita/GameConfig/TROP003.PNG differ diff --git a/Minecraft.Client/PSVita/GameConfig/TROP004.PNG b/Minecraft.Client/PSVita/GameConfig/TROP004.PNG new file mode 100644 index 00000000..21bc096c Binary files /dev/null and b/Minecraft.Client/PSVita/GameConfig/TROP004.PNG differ diff --git a/Minecraft.Client/PSVita/GameConfig/TROP005.PNG b/Minecraft.Client/PSVita/GameConfig/TROP005.PNG new file mode 100644 index 00000000..abf53f6d Binary files /dev/null and b/Minecraft.Client/PSVita/GameConfig/TROP005.PNG differ diff --git a/Minecraft.Client/PSVita/GameConfig/TROP006.PNG b/Minecraft.Client/PSVita/GameConfig/TROP006.PNG new file mode 100644 index 00000000..d017c15e Binary files /dev/null and b/Minecraft.Client/PSVita/GameConfig/TROP006.PNG differ diff --git a/Minecraft.Client/PSVita/GameConfig/TROP007.PNG b/Minecraft.Client/PSVita/GameConfig/TROP007.PNG new file mode 100644 index 00000000..843b000c Binary files /dev/null and b/Minecraft.Client/PSVita/GameConfig/TROP007.PNG differ diff --git a/Minecraft.Client/PSVita/GameConfig/TROP008.PNG b/Minecraft.Client/PSVita/GameConfig/TROP008.PNG new file mode 100644 index 00000000..dc3d5b81 Binary files /dev/null and b/Minecraft.Client/PSVita/GameConfig/TROP008.PNG differ diff --git a/Minecraft.Client/PSVita/GameConfig/TROP009.PNG b/Minecraft.Client/PSVita/GameConfig/TROP009.PNG new file mode 100644 index 00000000..261a5536 Binary files /dev/null and b/Minecraft.Client/PSVita/GameConfig/TROP009.PNG differ diff --git a/Minecraft.Client/PSVita/GameConfig/TROP010.PNG b/Minecraft.Client/PSVita/GameConfig/TROP010.PNG new file mode 100644 index 00000000..8043f338 Binary files /dev/null and b/Minecraft.Client/PSVita/GameConfig/TROP010.PNG differ diff --git a/Minecraft.Client/PSVita/GameConfig/TROP011.PNG b/Minecraft.Client/PSVita/GameConfig/TROP011.PNG new file mode 100644 index 00000000..d64c4512 Binary files /dev/null and b/Minecraft.Client/PSVita/GameConfig/TROP011.PNG differ diff --git a/Minecraft.Client/PSVita/GameConfig/TROP012.PNG b/Minecraft.Client/PSVita/GameConfig/TROP012.PNG new file mode 100644 index 00000000..01ac110b Binary files /dev/null and b/Minecraft.Client/PSVita/GameConfig/TROP012.PNG differ diff --git a/Minecraft.Client/PSVita/GameConfig/TROP013.PNG b/Minecraft.Client/PSVita/GameConfig/TROP013.PNG new file mode 100644 index 00000000..4a83948c Binary files /dev/null and b/Minecraft.Client/PSVita/GameConfig/TROP013.PNG differ diff --git a/Minecraft.Client/PSVita/GameConfig/TROP014.PNG b/Minecraft.Client/PSVita/GameConfig/TROP014.PNG new file mode 100644 index 00000000..92229a86 Binary files /dev/null and b/Minecraft.Client/PSVita/GameConfig/TROP014.PNG differ diff --git a/Minecraft.Client/PSVita/GameConfig/TROP015.PNG b/Minecraft.Client/PSVita/GameConfig/TROP015.PNG new file mode 100644 index 00000000..349b54ac Binary files /dev/null and b/Minecraft.Client/PSVita/GameConfig/TROP015.PNG differ diff --git a/Minecraft.Client/PSVita/GameConfig/TROP016.PNG b/Minecraft.Client/PSVita/GameConfig/TROP016.PNG new file mode 100644 index 00000000..0d85bd31 Binary files /dev/null and b/Minecraft.Client/PSVita/GameConfig/TROP016.PNG differ diff --git a/Minecraft.Client/PSVita/GameConfig/TROP017.PNG b/Minecraft.Client/PSVita/GameConfig/TROP017.PNG new file mode 100644 index 00000000..4e7228d4 Binary files /dev/null and b/Minecraft.Client/PSVita/GameConfig/TROP017.PNG differ diff --git a/Minecraft.Client/PSVita/GameConfig/TROP018.PNG b/Minecraft.Client/PSVita/GameConfig/TROP018.PNG new file mode 100644 index 00000000..0790fd48 Binary files /dev/null and b/Minecraft.Client/PSVita/GameConfig/TROP018.PNG differ diff --git a/Minecraft.Client/PSVita/GameConfig/TROP019.PNG b/Minecraft.Client/PSVita/GameConfig/TROP019.PNG new file mode 100644 index 00000000..6739fd3d Binary files /dev/null and b/Minecraft.Client/PSVita/GameConfig/TROP019.PNG differ diff --git a/Minecraft.Client/PSVita/GameConfig/TROP020.PNG b/Minecraft.Client/PSVita/GameConfig/TROP020.PNG new file mode 100644 index 00000000..bd3c940b Binary files /dev/null and b/Minecraft.Client/PSVita/GameConfig/TROP020.PNG differ diff --git a/Minecraft.Client/PSVita/GameConfig/TROP021.PNG b/Minecraft.Client/PSVita/GameConfig/TROP021.PNG new file mode 100644 index 00000000..17baffd4 Binary files /dev/null and b/Minecraft.Client/PSVita/GameConfig/TROP021.PNG differ diff --git a/Minecraft.Client/PSVita/GameConfig/TROP022.PNG b/Minecraft.Client/PSVita/GameConfig/TROP022.PNG new file mode 100644 index 00000000..25ef8c22 Binary files /dev/null and b/Minecraft.Client/PSVita/GameConfig/TROP022.PNG differ diff --git a/Minecraft.Client/PSVita/GameConfig/TROP023.PNG b/Minecraft.Client/PSVita/GameConfig/TROP023.PNG new file mode 100644 index 00000000..0f7bb7b3 Binary files /dev/null and b/Minecraft.Client/PSVita/GameConfig/TROP023.PNG differ diff --git a/Minecraft.Client/PSVita/GameConfig/TROP024.PNG b/Minecraft.Client/PSVita/GameConfig/TROP024.PNG new file mode 100644 index 00000000..518aa13b Binary files /dev/null and b/Minecraft.Client/PSVita/GameConfig/TROP024.PNG differ diff --git a/Minecraft.Client/PSVita/GameConfig/TROP025.PNG b/Minecraft.Client/PSVita/GameConfig/TROP025.PNG new file mode 100644 index 00000000..519d8fad Binary files /dev/null and b/Minecraft.Client/PSVita/GameConfig/TROP025.PNG differ diff --git a/Minecraft.Client/PSVita/GameConfig/TROP026.PNG b/Minecraft.Client/PSVita/GameConfig/TROP026.PNG new file mode 100644 index 00000000..57ff7bd7 Binary files /dev/null and b/Minecraft.Client/PSVita/GameConfig/TROP026.PNG differ diff --git a/Minecraft.Client/PSVita/GameConfig/TROP027.PNG b/Minecraft.Client/PSVita/GameConfig/TROP027.PNG new file mode 100644 index 00000000..3b5174cb Binary files /dev/null and b/Minecraft.Client/PSVita/GameConfig/TROP027.PNG differ diff --git a/Minecraft.Client/PSVita/GameConfig/TROP028.PNG b/Minecraft.Client/PSVita/GameConfig/TROP028.PNG new file mode 100644 index 00000000..243f8041 Binary files /dev/null and b/Minecraft.Client/PSVita/GameConfig/TROP028.PNG differ diff --git a/Minecraft.Client/PSVita/GameConfig/TROP029.PNG b/Minecraft.Client/PSVita/GameConfig/TROP029.PNG new file mode 100644 index 00000000..ff7bc7ee Binary files /dev/null and b/Minecraft.Client/PSVita/GameConfig/TROP029.PNG differ diff --git a/Minecraft.Client/PSVita/GameConfig/TROP030.PNG b/Minecraft.Client/PSVita/GameConfig/TROP030.PNG new file mode 100644 index 00000000..fe279421 Binary files /dev/null and b/Minecraft.Client/PSVita/GameConfig/TROP030.PNG differ diff --git a/Minecraft.Client/PSVita/GameConfig/TROP031.PNG b/Minecraft.Client/PSVita/GameConfig/TROP031.PNG new file mode 100644 index 00000000..56712b58 Binary files /dev/null and b/Minecraft.Client/PSVita/GameConfig/TROP031.PNG differ diff --git a/Minecraft.Client/PSVita/GameConfig/TROP032.PNG b/Minecraft.Client/PSVita/GameConfig/TROP032.PNG new file mode 100644 index 00000000..0e26bf9e Binary files /dev/null and b/Minecraft.Client/PSVita/GameConfig/TROP032.PNG differ diff --git a/Minecraft.Client/PSVita/GameConfig/TROP033.PNG b/Minecraft.Client/PSVita/GameConfig/TROP033.PNG new file mode 100644 index 00000000..634a5362 Binary files /dev/null and b/Minecraft.Client/PSVita/GameConfig/TROP033.PNG differ diff --git a/Minecraft.Client/PSVita/GameConfig/TROP034.PNG b/Minecraft.Client/PSVita/GameConfig/TROP034.PNG new file mode 100644 index 00000000..6d2780e8 Binary files /dev/null and b/Minecraft.Client/PSVita/GameConfig/TROP034.PNG differ diff --git a/Minecraft.Client/PSVita/GameConfig/TROP035.PNG b/Minecraft.Client/PSVita/GameConfig/TROP035.PNG new file mode 100644 index 00000000..6a4df60f Binary files /dev/null and b/Minecraft.Client/PSVita/GameConfig/TROP035.PNG differ diff --git a/Minecraft.Client/PSVita/GameConfig/TROP036.PNG b/Minecraft.Client/PSVita/GameConfig/TROP036.PNG new file mode 100644 index 00000000..174ae404 Binary files /dev/null and b/Minecraft.Client/PSVita/GameConfig/TROP036.PNG differ diff --git a/Minecraft.Client/PSVita/GameConfig/TROP037.PNG b/Minecraft.Client/PSVita/GameConfig/TROP037.PNG new file mode 100644 index 00000000..180c3c0b Binary files /dev/null and b/Minecraft.Client/PSVita/GameConfig/TROP037.PNG differ diff --git a/Minecraft.Client/PSVita/GameConfig/TROP038.PNG b/Minecraft.Client/PSVita/GameConfig/TROP038.PNG new file mode 100644 index 00000000..9ff5cafe Binary files /dev/null and b/Minecraft.Client/PSVita/GameConfig/TROP038.PNG differ diff --git a/Minecraft.Client/PSVita/GameConfig/TROP039.PNG b/Minecraft.Client/PSVita/GameConfig/TROP039.PNG new file mode 100644 index 00000000..7382b183 Binary files /dev/null and b/Minecraft.Client/PSVita/GameConfig/TROP039.PNG differ diff --git a/Minecraft.Client/PSVita/GameConfig/TROP040.PNG b/Minecraft.Client/PSVita/GameConfig/TROP040.PNG new file mode 100644 index 00000000..7c9cb2f7 Binary files /dev/null and b/Minecraft.Client/PSVita/GameConfig/TROP040.PNG differ diff --git a/Minecraft.Client/PSVita/GameConfig/TROP041.PNG b/Minecraft.Client/PSVita/GameConfig/TROP041.PNG new file mode 100644 index 00000000..1279d6e7 Binary files /dev/null and b/Minecraft.Client/PSVita/GameConfig/TROP041.PNG differ diff --git a/Minecraft.Client/PSVita/GameConfig/TROP042.PNG b/Minecraft.Client/PSVita/GameConfig/TROP042.PNG new file mode 100644 index 00000000..c4678a2f Binary files /dev/null and b/Minecraft.Client/PSVita/GameConfig/TROP042.PNG differ diff --git a/Minecraft.Client/PSVita/GameConfig/TROP043.PNG b/Minecraft.Client/PSVita/GameConfig/TROP043.PNG new file mode 100644 index 00000000..561d54cd Binary files /dev/null and b/Minecraft.Client/PSVita/GameConfig/TROP043.PNG differ diff --git a/Minecraft.Client/PSVita/GameConfig/TROP044.PNG b/Minecraft.Client/PSVita/GameConfig/TROP044.PNG new file mode 100644 index 00000000..925c8471 Binary files /dev/null and b/Minecraft.Client/PSVita/GameConfig/TROP044.PNG differ diff --git a/Minecraft.Client/PSVita/GameConfig/TROP045.PNG b/Minecraft.Client/PSVita/GameConfig/TROP045.PNG new file mode 100644 index 00000000..4d9c34d6 Binary files /dev/null and b/Minecraft.Client/PSVita/GameConfig/TROP045.PNG differ diff --git a/Minecraft.Client/PSVita/GameConfig/TROP046.PNG b/Minecraft.Client/PSVita/GameConfig/TROP046.PNG new file mode 100644 index 00000000..485f98dd Binary files /dev/null and b/Minecraft.Client/PSVita/GameConfig/TROP046.PNG differ diff --git a/Minecraft.Client/PSVita/GameConfig/TROP047.PNG b/Minecraft.Client/PSVita/GameConfig/TROP047.PNG new file mode 100644 index 00000000..e6a085ce Binary files /dev/null and b/Minecraft.Client/PSVita/GameConfig/TROP047.PNG differ diff --git a/Minecraft.Client/PSVita/GameConfig/TROP048.PNG b/Minecraft.Client/PSVita/GameConfig/TROP048.PNG new file mode 100644 index 00000000..25cd8a70 Binary files /dev/null and b/Minecraft.Client/PSVita/GameConfig/TROP048.PNG differ diff --git a/Minecraft.Client/PSVita/GameConfig/TROP049.PNG b/Minecraft.Client/PSVita/GameConfig/TROP049.PNG new file mode 100644 index 00000000..38df7667 Binary files /dev/null and b/Minecraft.Client/PSVita/GameConfig/TROP049.PNG differ diff --git a/Minecraft.Client/PSVita/GameConfig/TROP050.PNG b/Minecraft.Client/PSVita/GameConfig/TROP050.PNG new file mode 100644 index 00000000..65778493 Binary files /dev/null and b/Minecraft.Client/PSVita/GameConfig/TROP050.PNG differ diff --git a/Minecraft.Client/PSVita/GameConfig/rename.py b/Minecraft.Client/PSVita/GameConfig/rename.py new file mode 100644 index 00000000..8d0f6152 --- /dev/null +++ b/Minecraft.Client/PSVita/GameConfig/rename.py @@ -0,0 +1,69 @@ + +from os.path import isfile +from shutil import move + +trophynames = [ + "MCTrophy_All.png", # "All_Trophies.png", # Special for ps3/ps4 + "MCTrophy_00.png", # "TakingInventory_icon.png", + "MCTrophy_01.png", # "GettingWood_icon.png", + "MCTrophy_02.png", # "Benchmarking_icon.png", + "MCTrophy_10.png", # "TimeToMine_icon.png", + "MCTrophy_12.png", # "HotTopic_icon.png", + "MCTrophy_14.png", # "AcquireHardware_icon.png", + "MCTrophy_03.png", # "TimeToFarm_icon.png", + "MCTrophy_04.png", # "BakeBread_icon.png", + "MCTrophy_05.png", # "TheLie_icon.png", + "MCTrophy_11.png", # "GettingAnUpgrade_icon.png", + "MCTrophy_13.png", # "DeliciousFish_icon.png", + "MCTrophy_15.png", # "OnARail_icon.png", + "MCTrophy_06.png", # "TimeToStrike_icon.png", + "MCTrophy_07.png", # "MonsterHunter_icon.png", + "MCTrophy_08.png", # "CowTipper_icon.png", + "MCTrophy_09.png", # "WhenPigsFly_icon.png", + "MCTrophy_16.png", # "LeaderOfThePack_icon.png", + "MCTrophy_17.png", # "MOARTools_icon.png", + "MCTrophy_18.png", # "DispenseWithThis_icon.png", + "MCTrophy_19.png", # "IntoTheNether_icon.png", + "MCTrophy_20.png", # "SniperDuel_icon.png", + "MCTrophy_21.png", # "Diamonds_icon.png", + "MCTrophy_22.png", # "ReturnToSender_icon.png", + "MCTrophy_23.png", # "IntoFire_icon.png", + "MCTrophy_24.png", # "LocalBrewery_icon.png", + "MCTrophy_25.png", # "TheEnd_icon.png", + "MCTrophy_26.png", # "The_Other_End_icon.png", + "MCTrophy_27.png", # "Enchanter_icon.png", + "MCTrophy_28.png", # "Overkill_icon.png", + "MCTrophy_29.png", # "Librarian_icon.png", + "MCTrophy_30.png", # "AdventuringTime_icon.png", + "MCTrophy_31.png", # "Repopulation_icon.png", + "MCTrophy_32.png", # "DiamondsToYou_icon.png", + "MCTrophy_33.png", # "PorkChop_icon.png", + "MCTrophy_34.png", # "PassingTheTime_icon.png", + "MCTrophy_35.png", # "Archer_icon.png", + "MCTrophy_36.png", # "TheHaggler_icon.png", + "MCTrophy_37.png", # "PotPlanter_icon.png", + "MCTrophy_38.png", # "ItsASign_icon.png", + "MCTrophy_39.png", # "IronBelly_icon.png", + "MCTrophy_40.png", # "HaveAShearfulDay_icon.png", + "MCTrophy_41.png", # "RainbowCollection_icon.png", + "MCTrophy_42.png", # "StayinFrosty_icon.png", + "MCTrophy_43.png", # "ChestfulOfCobblestone_icon.png", + "MCTrophy_44.png", # "RenewableEnergy_icon.png", + "MCTrophy_45.png", # "MusicToMyEars_icon.png", + "MCTrophy_46.png", # "BodyGuard_icon.png", + "MCTrophy_47.png", # "IronMan_icon.png", + "MCTrophy_48.png", # "ZombieDoctor_icon.png", + "MCTrophy_49.png", # "LionTamer_icon.png" + ] + +def getTargetName(id): + return 'TROP%03d.PNG' % id + +if __name__=="__main__": + for id, name in enumerate(trophynames): + if isfile(name): + print ("Found: " + name) + move(name, getTargetName(id)) + else: + print ("Can't find '"+name+"'") + \ No newline at end of file diff --git a/Minecraft.Client/PSVita/Iggy/gdraw/gdraw_psp2.cpp b/Minecraft.Client/PSVita/Iggy/gdraw/gdraw_psp2.cpp new file mode 100644 index 00000000..fc5b190a --- /dev/null +++ b/Minecraft.Client/PSVita/Iggy/gdraw/gdraw_psp2.cpp @@ -0,0 +1,2101 @@ +// gdraw_psp2.cpp - author: Fabian Giesen - copyright 2014 RAD Game Tools +// +// This implements the Iggy graphics driver layer for PSP2. + +// GDraw consists of several components that interact fairly loosely with each other; +// e.g. the resource management, drawing and filtering parts are all fairly independent +// of each other. If you want to modify some aspect of GDraw - say the texture allocation +// logic - your best bet is usually to just look for one of the related entry points, +// e.g. MakeTextureBegin, and take it from there. There's a bunch of code in this file, +// but most of it isn't really complicated. The bits that are somewhat tricky have a more +// detailed explanation at the top of the relevant section. + +#include +#include +#include +#include +#include +#include "iggy.h" +#include "gdraw.h" + +#include "gdraw_psp2.h" + +typedef union { + struct { + SceGxmTexture *gxm; + } tex; + + struct { + void *verts; + void *inds; + } vbuf; +} GDrawNativeHandle; + +#define GDRAW_MANAGE_MEM +#define GDRAW_MANAGE_MEM_TWOPOOL +#define GDRAW_NO_BLURS +#define GDRAW_MIN_FREE_AMOUNT (64*1024) // always try to free at least this many bytes when throwing out old textures +#define GDRAW_MAYBE_UNUSED __attribute__((unused)) +#include "gdraw_shared.inl" + +#define MAX_SAMPLERS 1 +#define AATEX_SAMPLER 1 // sampler that aa_tex gets set in +#define QUAD_IB_COUNT 1024 // quad index buffer has indices for this many quads + +#define ASSERT_COUNT(a,b) ((a) == (b) ? (b) : -1) + +#define MAX_TEXTURE2D_DIM 4096 +#define MAX_AATEX_WIDTH 64 +#define GPU_MEMCPY_ALIGN 16 // bytes + +static GDrawFunctions gdraw_funcs; + +struct ShaderCode +{ + void *blob; + union + { + void *dummy; + SceGxmShaderPatcherId id; + }; + bool registered; +}; + +// Canonical blends +enum gdraw_canonical_blend +{ + GDRAW_CBLEND_none, // direct copy + GDRAW_CBLEND_alpha, // premultiplied alpha + GDRAW_CBLEND_add, // add + GDRAW_CBLEND_nowrite, // color writes disabled + + GDRAW_CBLEND__count +}; + +enum gdraw_outstanding_transfer +{ + GDRAW_TRANSFER_texture = 1 << 0, + GDRAW_TRANSFER_vertex = 1 << 1, +}; + +/////////////////////////////////////////////////////////////////////////////// +// +// GDraw data structure +// +// +// This is the primary rendering abstraction, which hides all +// the platform-specific rendering behavior from Iggy. It is +// full of platform-specific graphics state, and also general +// graphics state so that it doesn't have to callback into Iggy +// to get at that graphics state. + +struct GDraw +{ + // 16-byte aligned! + F32 projection[4]; // always 2D scale+2D translate. first two are scale, last two are translate. + + // scale factor converting worldspace to viewspace <0,0>.. + F32 world_to_pixel[2]; + + // graphics context + SceGxmContext *gxm; + + // cached state + U32 scissor_state; // 0=disabled, 1=enabled. + U32 z_stencil_key; // field built from z/stencil test flags. 0 = no z/stencil test, ~0 is used for "unknown state" + + gswf_recti cur_scissor; + + GDrawTexture *active_tex[MAX_SAMPLERS]; + SceGxmFragmentProgram *cur_fp; + SceGxmVertexProgram *cur_vp; + + // viewport setting (in pixels) for the current tile + S32 vx, vy; + S32 fw, fh; // full width/height of virtual display + S32 tw, th; // actual width/height of current tile + S32 tpw, tph; // width/height of padded version of tile + + S32 tx0, ty0; + S32 tx0p, ty0p; + + S32 tx0v, ty0v; // tile bounds relative to tile origin + + struct { + S32 x0, y0, x1, y1; + } cview; // current viewport + + gswf_recti screen_bounds; + + SceGxmTexture aa_tex; + GDrawArena context_arena; + + // texture and vertex buffer pools + GDrawHandleCache *texturecache; + GDrawHandleCache *vbufcache; + + // dynamic data buffer + GDrawArena dynamic; + gdraw_psp2_dynamic_stats dynamic_stats; + gdraw_psp2_dynamic_buffer *dyn_buf; + + // fragment programs + SceGxmFragmentProgram *main_fp[GDRAW_TEXTURE__count][3][GDRAW_CBLEND__count]; // [texmode][additive][cblend] + SceGxmFragmentProgram *clear_fp; + SceGxmFragmentProgram *mask_update_fp; + + // vertex programs + SceGxmVertexProgram *vp[GDRAW_vformat__basic_count]; + SceGxmVertexProgram *mask_vp; + + // baked index buffers + U16 *quad_ib; + U16 *mask_ib; + + // precomputed mask draw + SceGxmPrecomputedDraw mask_draw; + void *mask_draw_gpu; + + // synchronization + volatile U32 *fence_label; + U64 next_fence_index; + GDrawFence scene_end_fence; + + // mipmapping + GDrawMipmapContext mipmap; + + // shader patcher + SceGxmShaderPatcher *patcher; + + // clear color + F32 clear_color_rgba[4]; + const F32 *next_tile_clear; + + // transfers + U32 outstanding_transfers; + U32 draw_transfer_flush_mask; +}; + +static GDraw *gdraw; +static const F32 four_zeros[4] = { 0.0f, 0.0f, 0.0f, 0.0f }; + +//////////////////////////////////////////////////////////////////////// +// +// Synchronization, pointer wrangling and command buffer management +// + +static RADINLINE GDrawFence get_next_fence() +{ + GDrawFence fence; + fence.value = gdraw->next_fence_index; + return fence; +} + +static SceGxmNotification scene_end_notification() +{ + SceGxmNotification n; + n.address = (uint32_t *)gdraw->fence_label; + n.value = (uint32_t)gdraw->next_fence_index; + gdraw->scene_end_fence.value = gdraw->next_fence_index; + gdraw->next_fence_index++; + return n; +} + +static RADINLINE rrbool is_fence_pending(GDrawFence fence) +{ + // if it's older than one full wrap of the fence counter, + // we know it's retired. (can't have >=4 billion frames in + // flight!) + if (gdraw->next_fence_index - fence.value > 0xffffffffu) + return false; + + // this is how far the GPU is. + U32 retired = *gdraw->fence_label; + + // everything between "retired" (exclusive) and + // "next_fence_index" (inclusive) is pending. everything else + // is definitely done. + // + // this is a bit subtle; it uses unsigned wraparound to handle + // the edge case where we've wrapped around recently. + + // number of pending fences (next_fence_index hasn't been submitted yet!) + U32 num_pending = (U32)gdraw->next_fence_index - retired; + + return (U32)(gdraw->next_fence_index - fence.value) < num_pending; +} + +static void wait_on_fence(GDrawFence fence) +{ + if (is_fence_pending(fence)) { + // Is the fence in a scene we haven't even submitted yet? We can't do that. + // + // NOTE: you might see this from user code if you try to do the following + // seqeuence within a single GXM scene: + // - Render an Iggy + // - Tick it (or otherwise trigger some event that causes a font cache + // update). + // - Render the same Iggy again. + // This is not supported. If you modify the state, you *have* to end the + // scene first. + if (fence.value >= gdraw->next_fence_index) // uh oh, it's in a scene we haven't even submitted yet. this is a bug! + RR_BREAK(); + + IggyWaitOnFence(&fence, 0); + } +} + +extern "C" void gdraw_psp2_wait(U64 fence_val) +{ + GDrawFence fence; + fence.value = fence_val; + + // NOTE: if you see this function, either in Razor as a time hog or in the + // Debugger because you're stuck here, there's a problem with how you're using + // GDraw. These two cases are related but seperate, and I'll cover them here. + // + // PERF PROBLEM ("why do we spend a lot of time here?"): + // GDraw calls this function when it wants to recycle memory in its + // resource pools; to do so, it needs to wait until any previous GPU + // commands using that memory have finished. + // + // Generally, GDraw will free resources in LRU (least recently used) order. + // This means that whatever memory is being freed has (hopefully) not been + // touched for a few frames, and GDraw should be able to reuse it without + // having to wait. + // + // However, if you see this function show up in your profile, that's + // clearly not the case. In that case, you might be thrashing the resource + // pools. GDraw will warn about this - do you have an Iggy warning callback + // installed? Anyway, if there are resource thrashing warnings, try increasing + // the size of the corresponding resource pool and this stall should go away. + // + // The other reason why GDraw would wait is because you're passing a "dynamic + // buffer" to gdraw_psp2_Begin() that the GPU is still reading from a previous + // frame. If that's the case (just check whether your callstack contains + // "WaitForDynamicBufferIdle"), you might be using just one dynamic buffer. + // Consider double- or triple-buffering it instead to avoid this kind of stall. + // + // DEADLOCK ("the app is stuck here and never makes any progress"): + // + // GDraw uses this function when it needs to wait for the GPU to complete + // rendering a previous scene, because we're trying to reuse memory we used + // in that scene. + // + // If you end up here, this could mean one of several things: + // + // 1. The GPU isn't writing the scene completion notifications that GDraw is + // waiting for. Did you remember to pass the SceGxmNotification returned + // by gdraw_psp2_End as "fragmentNotification" to sceGxmEndScene? This is + // necessary for GDraw's memory management to work! + // 2. Check that the notification label passed to GDraw (on CreateContext) + // is not being used by someone else. Again, GDraw's memory management + // mechanism will break if we read unexpected valus! Just make sure that + // GDraw has its own notification label. There are lots of notification + // labels (SCE_GXM_NOTIFICATION_COUNT, 512 at the time of this writing) + // so this shouldn't be an issue. + // 3. You are using gdraw_psp2_Begin incorrectly. You may only have one call + // to gdraw_psp2_Begin per scene (this should not be a limitation since + // you can draw multiple Iggys or do other rendering during that time), + // and you must make sure that the scene containing a gdraw_psp2_Begin + // is submitted before you can call it again. + // + // The latter needs a bit of explanation. If you're on an immediate context, + // it's pretty easy. In any GXM scene that's supposed to contain Iggy + // rendering, adhere to the following pattern: + // + // sceGxmBeginScene(imm_ctx, ...) + // // --- may issue rendering calls here (but not draw Iggys) + // gdraw_psp2_Begin(...); + // // --- may issue other rendering calls and/or call IggyPlayerDraw + // // (once or several times) here + // SceGxmNotification notify = gdraw_psp2_End(); + // // --- again, may issue rendering calls here (but not draw Iggys) + // sceGxmEndScene(imm_ctx, NULL, ¬ify); + // + // That is, exactly one gdraw_psp2_Begin/_End pair for that scene, and + // all IggyPlayerDraws must be inside that pair. That's it. + // + // On a deferred context, *the same rules apply* - you must still make + // sure to render a GXM scene using the notification returned by + // gdraw_psp2_End before you call gdraw_psp2_Begin again. This means + // that you can't prepare multiple independent command lists for + // separate scenes on one thread and then issue them all later on + // the main thread (sorry). + // + // It's definitely easier to stick with immediate contexts. If you + // really need deferred contexts and are running into problems with + // this, contact Iggy support. + + while (is_fence_pending(fence)) + sceGxmWaitEvent(); +} + +//////////////////////////////////////////////////////////////////////// +// +// Texture/vertex memory defragmentation support code +// + +static void gdraw_gpu_memcpy(GDrawHandleCache *c, void *dst, void *src, U32 num_bytes) +{ + // "If srcFormat is SCE_GXM_TRANSFER_FORMAT_RAW128, then a maximum of 262144 pixels can be copied (512x512)." + static const U32 max_width = 512; + static const U32 max_height = 512; + static const U32 row_size = max_width * GPU_MEMCPY_ALIGN; + + U8 *dstp = (U8 *)dst; + U8 *srcp = (U8 *)src; + U32 offs = 0; + + // needs to be properly aligned + assert(((UINTa)dstp & (GPU_MEMCPY_ALIGN - 1)) == 0); + assert(((UINTa)srcp & (GPU_MEMCPY_ALIGN - 1)) == 0); + + // copy using 512-wide transfers for the bulk part + while (num_bytes - offs >= row_size) { + U32 num_rows = (num_bytes - offs) / row_size; + num_rows = RR_MIN(num_rows, max_height); + + sceGxmTransferCopy(max_width, num_rows, + 0, 0, SCE_GXM_TRANSFER_COLORKEY_NONE, + SCE_GXM_TRANSFER_FORMAT_RAW128, SCE_GXM_TRANSFER_LINEAR, srcp + offs, 0, 0, row_size, + SCE_GXM_TRANSFER_FORMAT_RAW128, SCE_GXM_TRANSFER_LINEAR, dstp + offs, 0, 0, row_size, + NULL, 0, NULL); + + offs += num_rows * row_size; + } + + // handle the rest + // NOTE: our 16-byte alignment guarantees that despite rounding up, we're not going + // to overwrite memory belonging to another resource. + if (offs < num_bytes) { + U32 remaining_pixels = (num_bytes - offs + GPU_MEMCPY_ALIGN - 1) / GPU_MEMCPY_ALIGN; + + sceGxmTransferCopy(remaining_pixels, 1, + 0, 0, SCE_GXM_TRANSFER_COLORKEY_NONE, + SCE_GXM_TRANSFER_FORMAT_RAW128, SCE_GXM_TRANSFER_LINEAR, srcp + offs, 0, 0, row_size, + SCE_GXM_TRANSFER_FORMAT_RAW128, SCE_GXM_TRANSFER_LINEAR, dstp + offs, 0, 0, row_size, + NULL, 0, NULL); + } + + if (c->is_vertex) + gdraw->outstanding_transfers |= GDRAW_TRANSFER_vertex; + else + gdraw->outstanding_transfers |= GDRAW_TRANSFER_texture; +} + +static void gdraw_resource_moved(GDrawHandle *t) +{ + if (!t->cache->is_vertex) + sceGxmTextureSetData(t->handle.tex.gxm, t->raw_ptr); + else { + SINTa index_offs = (U8 *)t->handle.vbuf.inds - (U8 *)t->handle.vbuf.verts; + t->handle.vbuf.verts = t->raw_ptr; + t->handle.vbuf.inds = (U8 *)t->raw_ptr + index_offs; + } +} + +static void gdraw_gpu_wait_for_transfer_completion() +{ + if (gdraw->outstanding_transfers) { + sceGxmTransferFinish(); + gdraw->outstanding_transfers = 0; + } +} +static void gdraw_defragment_cache(GDrawHandleCache *c, GDrawStats *stats) +{ + // wait until we're done with the previous frame + + wait_on_fence(gdraw->scene_end_fence); + + // reap; after this point, the only remaining dead resources + // should be ones we've touched in this frame. + gdraw_res_reap(c, stats); + + // at this point, the pool we're switching to should be empty; + // we can still have outstanding references to the previous pool + // (from this frame), but not anything to the pool from before then. + if (!gfxalloc_is_empty(c->alloc_other)) { + // if this triggers, there's a bug in GDraw's resource management. + RR_BREAK(); + } + + rrbool ok = gdraw_TwoPoolDefragmentMain(c, stats); + if (!ok) // if this went wrong, we had some serious heap corruption. + RR_BREAK(); +} + +static void handle_cache_tick(GDrawHandleCache *c, GDrawFence now, GDrawStats *stats) +{ + gdraw_PostDefragmentCleanup(c, stats); + gdraw_HandleCacheTick(c, now); +} + +static void api_free_resource(GDrawHandle *r) +{ + if (!r->cache->is_vertex) { + for (S32 i=0; i < MAX_SAMPLERS; i++) + if (gdraw->active_tex[i] == (GDrawTexture *) r) + gdraw->active_tex[i] = NULL; + } +} + +static void RADLINK gdraw_UnlockHandles(GDrawStats *stats) +{ + // We're on a tiled renderer; the Iggy side doesn't get to unlock *anything*. + // We do the unlock ourselves once we're done with the scene, in + // gdraw_psp2_End. +} + +//////////////////////////////////////////////////////////////////////// +// +// Various helpers +// + +static void track_dynamic_alloc_attempt(U32 size, U32 align) +{ + gdraw->dynamic_stats.allocs_attempted++; + gdraw->dynamic_stats.bytes_attempted += size; + gdraw->dynamic_stats.largest_bytes_attempted = RR_MAX(gdraw->dynamic_stats.largest_bytes_attempted, size); +} + +static void track_dynamic_alloc_failed() +{ + if (gdraw->dynamic_stats.allocs_attempted == gdraw->dynamic_stats.allocs_succeeded + 1) { // warn the first time we run out of mem + IggyGDrawSendWarning(NULL, "GDraw out of dynamic memory"); + } +} + +static void *alloc_dynamic(U32 size, U32 align) +{ + track_dynamic_alloc_attempt(size, align); + + void *ptr = gdraw_arena_alloc(&gdraw->dynamic, size, align); + if (ptr) { + gdraw->dynamic_stats.allocs_succeeded++; + gdraw->dynamic_stats.bytes_succeeded += size; + gdraw->dynamic_stats.largest_bytes_succeeded = RR_MAX(gdraw->dynamic_stats.largest_bytes_succeeded, size); + } else + track_dynamic_alloc_failed(); + + return ptr; +} + +static void *alloc_and_set_fragment_uniforms(SceGxmContext *gxm, U32 slot, size_t size) +{ + void *ptr = alloc_dynamic(size, sizeof(U32)); + if (ptr) + sceGxmSetFragmentUniformBuffer(gxm, 0, ptr); + return ptr; +} + +static void *alloc_and_set_vertex_uniforms(SceGxmContext *gxm, U32 slot, size_t size) +{ + void *ptr = alloc_dynamic(size, sizeof(U32)); + if (ptr) + sceGxmSetVertexUniformBuffer(gxm, 0, ptr); + return ptr; +} + +//////////////////////////////////////////////////////////////////////// +// +// Texture creation/updating/deletion +// + +GDrawTexture * RADLINK gdraw_psp2_WrappedTextureCreate(SceGxmTexture *tex) +{ + GDrawStats stats = {}; + GDrawHandle *p = gdraw_res_alloc_begin(gdraw->texturecache, 0, &stats); + gdraw_HandleCacheAllocateEnd(p, 0, NULL, GDRAW_HANDLE_STATE_user_owned); + gdraw_psp2_WrappedTextureChange((GDrawTexture *) p, tex); + return (GDrawTexture *) p; +} + +void RADLINK gdraw_psp2_WrappedTextureChange(GDrawTexture *handle, SceGxmTexture *tex) +{ + GDrawHandle *p = (GDrawHandle *) handle; + *p->handle.tex.gxm = *tex; +} + +void RADLINK gdraw_psp2_WrappedTextureDestroy(GDrawTexture *handle) +{ + GDrawStats stats = {}; + gdraw_res_free((GDrawHandle *) handle, &stats); +} + +static void RADLINK gdraw_SetTextureUniqueID(GDrawTexture *tex, void *old_id, void *new_id) +{ + GDrawHandle *p = (GDrawHandle *) tex; + // if this is still the handle it's thought to be, change the owner; + // if the owner *doesn't* match, then they're changing a stale handle, so ignore + if (p->owner == old_id) + p->owner = new_id; +} + +static U32 align_down(U32 x, U32 align) +{ + return x & ~(align - 1); +} + +static U32 align_up(U32 x, U32 align) +{ + return (x + align - 1) & ~(align - 1); +} + +static U32 round_up_to_pow2(U32 x) +{ + x--; + x |= x >> 16; + x |= x >> 8; + x |= x >> 4; + x |= x >> 2; + x |= x >> 1; + return x + 1; +} + +static U32 tex_linear_stride(U32 width) +{ + return align_up(width, 8); +} + +static rrbool RADLINK gdraw_MakeTextureBegin(void *owner, S32 width, S32 height, gdraw_texture_format gformat, U32 flags, GDraw_MakeTexture_ProcessingInfo *p, GDrawStats *stats) +{ + S32 bytes_pixel = 4; + GDrawHandle *t = NULL; + + SceGxmTextureFormat format = SCE_GXM_TEXTURE_FORMAT_U8U8U8U8_ABGR; + if (width > MAX_TEXTURE2D_DIM || height > MAX_TEXTURE2D_DIM) { + IggyGDrawSendWarning(NULL, "GDraw %d x %d texture not supported by hardware (dimension limit %d)", width, height, MAX_TEXTURE2D_DIM); + return false; + } + + if (gformat == GDRAW_TEXTURE_FORMAT_font) { + format = SCE_GXM_TEXTURE_FORMAT_U8_RRRR; + bytes_pixel = 1; + } + + // determine the number of mipmaps to use and size of resulting surface + U32 mipmaps = 0; + U32 size = 0; + U32 base_stride = tex_linear_stride(width); + + if (flags & GDRAW_MAKETEXTURE_FLAGS_mipmap) { + U32 pow2_w = round_up_to_pow2(width); + U32 pow2_h = round_up_to_pow2(height); + do { + // mip offsets are based on size rounded up to pow2, so we pay for that amount of space. + size += RR_MAX(pow2_w >> mipmaps, 1) * RR_MAX(pow2_h >> mipmaps, 1) * bytes_pixel; + mipmaps++; + } + while ((width >> mipmaps) || (height >> mipmaps)); + } else { + // no mips + mipmaps = 1; + size = base_stride * height * bytes_pixel; + } + + // allocate a handle and make room in the cache for this much data + t = gdraw_res_alloc_begin(gdraw->texturecache, size, stats); + if (!t) + return false; + + sceGxmTextureInitLinear(t->handle.tex.gxm, t->raw_ptr, format, width, height, mipmaps); + + gdraw_HandleCacheAllocateEnd(t, size, owner, (flags & GDRAW_MAKETEXTURE_FLAGS_never_flush) ? GDRAW_HANDLE_STATE_pinned : GDRAW_HANDLE_STATE_locked); + stats->nonzero_flags |= GDRAW_STATS_alloc_tex; + stats->alloc_tex += 1; + stats->alloc_tex_bytes += size; + + p->texture_type = GDRAW_TEXTURE_TYPE_rgba; + p->p0 = t; + if (flags & GDRAW_MAKETEXTURE_FLAGS_mipmap) { + rrbool ok; + + assert(p->temp_buffer != NULL); + ok = gdraw_MipmapBegin(&gdraw->mipmap, width, height, mipmaps, + bytes_pixel, p->temp_buffer, p->temp_buffer_bytes); + if (!ok) + RR_BREAK(); // this should never trigger unless the temp_buffer is way too small (Iggy bug) + + p->p1 = &gdraw->mipmap; + p->texture_data = gdraw->mipmap.pixels[0]; + p->num_rows = gdraw->mipmap.bheight; + p->stride_in_bytes = gdraw->mipmap.pitch[0]; + p->i0 = 0; // current output y + p->i1 = width; + p->i2 = height; + } else { + // non-mipmapped textures, we just upload straight to their destination + p->p1 = NULL; + p->texture_data = (U8 *)t->raw_ptr; + p->num_rows = height; + p->stride_in_bytes = base_stride * bytes_pixel; + } + + return true; +} + +static rrbool RADLINK gdraw_MakeTextureMore(GDraw_MakeTexture_ProcessingInfo *p) +{ + GDrawHandle *t = (GDrawHandle *)p->p0; + + if (p->p1) { + U8 *mipstart = (U8 *)t->raw_ptr; + GDrawMipmapContext *c = (GDrawMipmapContext *)p->p1; + U32 width = p->i1; + U32 height = p->i2; + U32 bheight = c->bheight; + U32 w_pow2 = round_up_to_pow2(width); + U32 h_pow2 = round_up_to_pow2(height); + U32 level = 0; + U32 outy = p->i0; + + if (outy >= height) // wait, we've already processed the whole texture! + return false; + + do { + U32 pitch = tex_linear_stride(width) * c->bpp; + U32 srcpitch = c->pitch[level]; + + // copy image data to destination + U8 *dest = mipstart + (outy >> level) * pitch; + U8 *src = c->pixels[level]; + for (U32 y=0; y < bheight; y++) + memcpy(dest + y*pitch, src + y*srcpitch, width * c->bpp); + + // mip offsets are computed from pow2 base size + mipstart += RR_MAX(w_pow2 >> level, 1) * RR_MAX(h_pow2 >> level, 1) * c->bpp; + width = RR_MAX(width >> 1, 1); + height = RR_MAX(height >> 1, 1); + bheight = RR_MAX(bheight >> 1, 1); + } while(gdraw_MipmapAddLines(c, ++level)); + + // next chunk please! + p->i0 += p->num_rows; + p->texture_data = c->pixels[0]; + p->num_rows = c->bheight = RR_MIN(c->bheight, p->i2 - p->i0); + return true; + } else + return false; // non-streaming upload; you got the full image first time! +} + +static GDrawTexture * RADLINK gdraw_MakeTextureEnd(GDraw_MakeTexture_ProcessingInfo *p, GDrawStats *stats) +{ + if (p->p1) + gdraw_MakeTextureMore(p); // submit last piece of data + + RR_UNUSED_VARIABLE(stats); + return (GDrawTexture *) p->p0; +} + +static rrbool RADLINK gdraw_UpdateTextureBegin(GDrawTexture *t, void *unique_id, GDrawStats *stats) +{ + return gdraw_HandleCacheLockStats((GDrawHandle *) t, unique_id, stats); +} + +static void RADLINK gdraw_UpdateTextureRect(GDrawTexture *t, void *unique_id, S32 x, S32 y, S32 stride, S32 w, S32 h, U8 *samples, gdraw_texture_format format) +{ + RR_UNUSED_VARIABLE(unique_id); + GDrawHandle *s = (GDrawHandle *) t; + U32 bpp = (format == GDRAW_TEXTURE_FORMAT_font) ? 1 : 4; + + // make sure texture is not active. note that we don't implement texture ghosting; + // this is an actual wait and you can't update a texture you've already used during + // the current frame. (we only use this path for font cache updates) + wait_on_fence(s->fence); + + U32 bpl = w * bpp; + U32 dpitch = tex_linear_stride(sceGxmTextureGetWidth(s->handle.tex.gxm)) * bpp; + U8 *src = samples; + U8 *dst = (U8 *)s->raw_ptr + y*dpitch + x*bpp; + for (S32 row=0; row < h; row++) + memcpy(dst + row*dpitch, src + row*stride, bpl); +} + +static void RADLINK gdraw_UpdateTextureEnd(GDrawTexture *t, void *unique_id, GDrawStats *stats) +{ + RR_UNUSED_VARIABLE(unique_id); + RR_UNUSED_VARIABLE(stats); + RR_UNUSED_VARIABLE(t); + // no unlock! (tiled renderer again) +} + +static void RADLINK gdraw_FreeTexture(GDrawTexture *tt, void *unique_id, GDrawStats *stats) +{ + GDrawHandle *t = (GDrawHandle *) tt; + assert(t != NULL); + if (t->owner == unique_id || unique_id == NULL) { + gdraw_res_kill(t, stats); + } +} + +static rrbool RADLINK gdraw_TryToLockTexture(GDrawTexture *t, void *unique_id, GDrawStats *stats) +{ + return gdraw_HandleCacheLockStats((GDrawHandle *) t, unique_id, stats); +} + +static void RADLINK gdraw_DescribeTexture(GDrawTexture *tex, GDraw_Texture_Description *desc) +{ + GDrawHandle *p = (GDrawHandle *) tex; + desc->width = sceGxmTextureGetWidth(p->handle.tex.gxm); + desc->height = sceGxmTextureGetHeight(p->handle.tex.gxm); + desc->size_in_bytes = p->bytes; +} + +static void RADLINK gdraw_SetAntialiasTexture(S32 width, U8 *rgba) +{ + if (sceGxmTextureGetData(&gdraw->aa_tex) != NULL) + return; + + assert(width <= MAX_AATEX_WIDTH); + void *ptr = gdraw_arena_alloc(&gdraw->context_arena, width * 4, GDRAW_PSP2_TEXTURE_ALIGNMENT); + if (!ptr) + return; + + sceGxmTextureInitLinear(&gdraw->aa_tex, ptr, SCE_GXM_TEXTURE_FORMAT_U8U8U8U8_ABGR, width, 1, 1); + memcpy(ptr, rgba, width * 4); +} + +//////////////////////////////////////////////////////////////////////// +// +// Vertex buffer creation/deletion +// + +static rrbool RADLINK gdraw_MakeVertexBufferBegin(void *unique_id, gdraw_vformat vformat, S32 vbuf_size, S32 ibuf_size, GDraw_MakeVertexBuffer_ProcessingInfo *p, GDrawStats *stats) +{ + GDrawHandle *vb; + vb = gdraw_res_alloc_begin(gdraw->vbufcache, vbuf_size + ibuf_size, stats); + if (!vb) + return false; + + vb->handle.vbuf.verts = vb->raw_ptr; + vb->handle.vbuf.inds = (U8 *) vb->raw_ptr + vbuf_size; + + p->p0 = vb; + p->vertex_data = (U8 *)vb->handle.vbuf.verts; + p->index_data = (U8 *)vb->handle.vbuf.inds; + p->vertex_data_length = vbuf_size; + p->index_data_length = ibuf_size; + + gdraw_HandleCacheAllocateEnd(vb, vbuf_size + ibuf_size, unique_id, GDRAW_HANDLE_STATE_locked); + return true; +} + +static rrbool RADLINK gdraw_MakeVertexBufferMore(GDraw_MakeVertexBuffer_ProcessingInfo *p) +{ + RR_BREAK(); + return false; +} + +static GDrawVertexBuffer * RADLINK gdraw_MakeVertexBufferEnd(GDraw_MakeVertexBuffer_ProcessingInfo *p, GDrawStats *stats) +{ + RR_UNUSED_VARIABLE(stats); + return (GDrawVertexBuffer *)p->p0; +} + +static rrbool RADLINK gdraw_TryLockVertexBuffer(GDrawVertexBuffer *vb, void *unique_id, GDrawStats *stats) +{ + return gdraw_HandleCacheLockStats((GDrawHandle *) vb, unique_id, stats); +} + +static void RADLINK gdraw_FreeVertexBuffer(GDrawVertexBuffer *vb, void *unique_id, GDrawStats *stats) +{ + GDrawHandle *h = (GDrawHandle *) vb; + assert(h != NULL); // @GDRAW_ASSERT + if (h->owner == unique_id) + gdraw_res_kill(h, stats); +} + +static void RADLINK gdraw_DescribeVertexBuffer(GDrawVertexBuffer *vbuf, GDraw_VertexBuffer_Description *desc) +{ + GDrawHandle *p = (GDrawHandle *) vbuf; + desc->size_in_bytes = p->bytes; +} + +//////////////////////////////////////////////////////////////////////// +// +// Constant buffer layouts +// + +struct VertexVars +{ + F32 world[2][4]; + F32 x_offs[4]; + F32 texgen_s[4]; + F32 texgen_t[4]; + F32 viewproj[4]; +}; + +struct PixelCommonVars +{ + F32 color_mul[4]; + F32 color_add[4]; + F32 focal[4]; +}; + +//////////////////////////////////////////////////////////////////////// +// +// Rendering helpers +// + +static void set_gxm_texture(U32 unit, SceGxmTexture *tex, U32 wrap, U32 nearest) +{ + static const U32 addrbits[ASSERT_COUNT(GDRAW_WRAP__count, 4)] = { +#define CLAMPMODE(x) ((SCE_GXM_PDS_DOUTT0_UADDRMODE_##x << SCE_GXM_PDS_DOUTT0_UADDRMODE_SHIFT) | (SCE_GXM_PDS_DOUTT0_VADDRMODE_##x << SCE_GXM_PDS_DOUTT0_VADDRMODE_SHIFT)) + CLAMPMODE(CLAMP), // GDRAW_WRAP_clamp + CLAMPMODE(REPEAT), // GDRAW_WRAP_repeat + CLAMPMODE(MIRROR), // GDRAW_WRAP_mirror + CLAMPMODE(CLAMP), // GDRAW_WRAP_clamp_to_border (unused in this impl - just use regular clamp) +#undef CLAMPMODE + }; + static const U32 addrmask = SCE_GXM_PDS_DOUTT0_UADDRMODE_MASK | SCE_GXM_PDS_DOUTT0_VADDRMODE_MASK; + + static const U32 filterbits[2] = { + // nearest off + SCE_GXM_PDS_DOUTT0_MINFILTER_MASK | SCE_GXM_PDS_DOUTT0_MAGFILTER_MASK | SCE_GXM_PDS_DOUTT0_MIPFILTER_MASK, + // nearest on + SCE_GXM_PDS_DOUTT0_MINFILTER_MASK | SCE_GXM_PDS_DOUTT0_MIPFILTER_MASK, + }; + static const U32 filtermask = SCE_GXM_PDS_DOUTT0_MINFILTER_MASK | SCE_GXM_PDS_DOUTT0_MAGFILTER_MASK | SCE_GXM_PDS_DOUTT0_MIPFILTER_MASK; + + assert(wrap < GDRAW_WRAP__count); + assert(nearest < 2); + + SceGxmTexture texv = *tex; + texv.controlWords[0] = (tex->controlWords[0] & ~(addrmask | filtermask)) | addrbits[wrap] | filterbits[nearest]; + sceGxmSetFragmentTexture(gdraw->gxm, unit, &texv); +} + +static void remove_scissor(); + +static inline void disable_scissor(bool force) +{ + if (gdraw->scissor_state) + remove_scissor(); + + if (force || gdraw->scissor_state != 0) { + gdraw->scissor_state = 0; + sceGxmSetRegionClip(gdraw->gxm, SCE_GXM_REGION_CLIP_OUTSIDE, gdraw->cview.x0, gdraw->cview.y0, gdraw->cview.x1 - 1, gdraw->cview.y1 - 1); + } +} + +static void set_viewport_raw(S32 x, S32 y, S32 w, S32 h) +{ + gdraw->cview.x0 = x; + gdraw->cview.y0 = y; + gdraw->cview.x1 = x + w; + gdraw->cview.y1 = y + h; + + // AP - ZOffset/ZScale were set to 0.0/1.0 which is wrong. This fixed the bad poly draw order effect on the models in Skin Select + sceGxmSetViewport(gdraw->gxm, + (F32)x + (F32)w*0.5f, (F32)w * 0.5f, + (F32)y + (F32)h*0.5f, (F32)h * -0.5f, + 0.5f, 0.5f); +} + +static void set_projection_raw(S32 x0, S32 x1, S32 y0, S32 y1) +{ + gdraw->projection[0] = 2.0f / (x1-x0); + gdraw->projection[1] = 2.0f / (y1-y0); + gdraw->projection[2] = (x1 + x0) / (F32) (x0 - x1); + gdraw->projection[3] = (y1 + y0) / (F32) (y0 - y1); +} + +static void set_viewport() +{ + set_viewport_raw(gdraw->vx, gdraw->vy, gdraw->tw, gdraw->th); +} + +static void set_projection() +{ + set_projection_raw(gdraw->tx0, gdraw->tx0 + gdraw->tw, gdraw->ty0 + gdraw->th, gdraw->ty0); +} + +static void clear_renderstate() +{ + SceGxmContext *gxm = gdraw->gxm; + sceGxmSetFrontDepthFunc(gxm, SCE_GXM_DEPTH_FUNC_ALWAYS); + sceGxmSetFrontDepthWriteEnable(gxm, SCE_GXM_DEPTH_WRITE_DISABLED); + sceGxmSetFrontStencilFunc(gxm, SCE_GXM_STENCIL_FUNC_ALWAYS, SCE_GXM_STENCIL_OP_KEEP, SCE_GXM_STENCIL_OP_KEEP, SCE_GXM_STENCIL_OP_KEEP, 0, 0); + + // AP - Added this in to reset the clip region to full screen. This fixed the Splash text not appearing and the bad draw order on the 2x2 crafting cursor. + disable_scissor(true); + + gdraw->z_stencil_key = 0; +} + +static void set_common_renderstate() +{ + SceGxmContext *gxm = gdraw->gxm; + + // clear our state caching + memset(gdraw->active_tex, 0, sizeof(gdraw->active_tex)); + gdraw->scissor_state = 0; + gdraw->cur_fp = NULL; + gdraw->cur_vp = NULL; + + // all the state we won't touch again until we're done rendering + sceGxmSetCullMode(gxm, SCE_GXM_CULL_NONE); + sceGxmSetFrontDepthBias(gxm, 0, 0); + sceGxmSetFrontFragmentProgramEnable(gxm, SCE_GXM_FRAGMENT_PROGRAM_ENABLED); + sceGxmSetFrontPolygonMode(gxm, SCE_GXM_POLYGON_MODE_TRIANGLE_FILL); + sceGxmSetFrontVisibilityTestEnable(gxm, SCE_GXM_VISIBILITY_TEST_DISABLED); + sceGxmSetFrontStencilRef(gxm, 255); + sceGxmSetTwoSidedEnable(gxm, SCE_GXM_TWO_SIDED_DISABLED); + sceGxmSetViewportEnable(gxm, SCE_GXM_VIEWPORT_ENABLED); + sceGxmSetWBufferEnable(gxm, SCE_GXM_WBUFFER_DISABLED); + sceGxmSetWClampValue(gxm, 0.00001f); + sceGxmSetWClampEnable(gxm, SCE_GXM_WCLAMP_MODE_ENABLED); + + set_gxm_texture(AATEX_SAMPLER, &gdraw->aa_tex, GDRAW_WRAP_clamp, 0); + + // states we modify during regular rendering + clear_renderstate(); + set_viewport(); + set_projection(); + disable_scissor(true); +} + +static void set_fragment_program(SceGxmFragmentProgram *fp); +static void do_screen_quad(gswf_recti *s, const F32 *tc, F32 z, GDrawStats *stats); + +static void render_clear_quad(gswf_recti *r, GDrawStats *stats) +{ + do_screen_quad(r, four_zeros, 1.0f, stats); + + stats->nonzero_flags |= GDRAW_STATS_clears; + stats->num_clears++; + stats->cleared_pixels += (r->x1 - r->x0) * (r->y1 - r->y0); +} + +static void clear_whole_surf(bool clear_depth, bool clear_stencil, const F32 *clear_color, GDrawStats *stats) +{ + SceGxmContext *gxm = gdraw->gxm; + + gdraw->z_stencil_key = ~0u; // force reset on next draw + SceGxmStencilOp stencil_op = clear_stencil ? SCE_GXM_STENCIL_OP_ZERO : SCE_GXM_STENCIL_OP_KEEP; + + sceGxmSetFrontDepthFunc(gxm, SCE_GXM_DEPTH_FUNC_ALWAYS); + sceGxmSetFrontDepthWriteEnable(gxm, clear_depth ? SCE_GXM_DEPTH_WRITE_ENABLED : SCE_GXM_DEPTH_WRITE_DISABLED); + sceGxmSetFrontStencilFunc(gxm, SCE_GXM_STENCIL_FUNC_ALWAYS, stencil_op, stencil_op, stencil_op, 0xff, 0xff); + + set_fragment_program(gdraw->clear_fp); + PixelCommonVars *para = (PixelCommonVars *)alloc_and_set_fragment_uniforms(gxm, 0, sizeof(PixelCommonVars)); + if (!para) + return; + memset(para, 0, sizeof(*para)); + + if (clear_color) + vst1q_f32(para->color_mul, vld1q_f32(clear_color)); + else + sceGxmSetFrontFragmentProgramEnable(gxm, SCE_GXM_FRAGMENT_PROGRAM_DISABLED); + + set_viewport_raw(0, 0, gdraw->screen_bounds.x1, gdraw->screen_bounds.y1); + set_projection_raw(0, gdraw->screen_bounds.x1, gdraw->screen_bounds.y1, 0); + render_clear_quad(&gdraw->screen_bounds, stats); + + if (!clear_color) + sceGxmSetFrontFragmentProgramEnable(gxm, SCE_GXM_FRAGMENT_PROGRAM_ENABLED); + + set_viewport(); + set_projection(); +} + +//////////////////////////////////////////////////////////////////////// +// +// Begin rendering for a frame +// + +void gdraw_psp2_SetTileOrigin(S32 x, S32 y) +{ + gdraw->vx = x; + gdraw->vy = y; +} + +void gdraw_psp2_ClearBeforeNextRender(const F32 clear_color_rgba[4]) +{ + for (U32 i=0; i < 4; i++) + gdraw->clear_color_rgba[i] = clear_color_rgba[i]; + gdraw->next_tile_clear = gdraw->clear_color_rgba; +} + +static void RADLINK gdraw_SetViewSizeAndWorldScale(S32 w, S32 h, F32 scalex, F32 scaley) +{ + gdraw->fw = w; + gdraw->fh = h; + gdraw->tw = w; + gdraw->th = h; + gdraw->world_to_pixel[0] = scalex; + gdraw->world_to_pixel[1] = scaley; +} + +// must include anything necessary for texture creation/update +static void RADLINK gdraw_RenderingBegin(void) +{ + assert(gdraw->gxm != NULL); // call after gdraw_psp2_Begin + set_common_renderstate(); +} + +static void RADLINK gdraw_RenderingEnd(void) +{ + clear_renderstate(); +} + +static void RADLINK gdraw_RenderTileBegin(S32 x0, S32 y0, S32 x1, S32 y1, S32 pad, GDrawStats *stats) +{ + pad = 0; // no reason to ever pad, we don't do filters. + + gdraw->tx0 = x0; + gdraw->ty0 = y0; + gdraw->tw = x1-x0; + gdraw->th = y1-y0; + + gdraw->tx0v = gdraw->tx0 - gdraw->vx; + gdraw->ty0v = gdraw->ty0 - gdraw->vy; + + // padded region + gdraw->tx0p = RR_MAX(x0 - pad, 0); + gdraw->ty0p = RR_MAX(y0 - pad, 0); + gdraw->tpw = RR_MIN(x1 + pad, gdraw->fw) - gdraw->tx0p; + gdraw->tph = RR_MIN(y1 + pad, gdraw->fh) - gdraw->ty0p; + + // clear our depth/stencil buffers (and also color if requested) + clear_whole_surf(true, true, gdraw->next_tile_clear, stats); + gdraw->next_tile_clear = NULL; +} + +static void RADLINK gdraw_RenderTileEnd(GDrawStats *stats) +{ + // necessary to reset mask bits at end of tile + // (if we had them set) + disable_scissor(false); + + // reap once per frame even if there are no allocs + gdraw_res_reap(gdraw->texturecache, stats); + gdraw_res_reap(gdraw->vbufcache, stats); +} + +void gdraw_psp2_Begin(SceGxmContext *context, const SceGxmColorSurface *color, const SceGxmDepthStencilSurface *depth, gdraw_psp2_dynamic_buffer *dynamic_buf) +{ + U32 xmin, ymin, xmax, ymax; + + assert(gdraw->gxm == NULL); // may not nest Begin calls + + // need to wait for the buffer to become idle before we can use it! + gdraw_psp2_WaitForDynamicBufferIdle(dynamic_buf); + + gdraw->gxm = context; + gdraw->dyn_buf = dynamic_buf; + gdraw_arena_init(&gdraw->dynamic, dynamic_buf->start, dynamic_buf->size_in_bytes); + + memset(&gdraw->dynamic_stats, 0, sizeof(gdraw->dynamic_stats)); + + sceGxmColorSurfaceGetClip(color, &xmin, &ymin, &xmax, &ymax); + gdraw->screen_bounds.x0 = xmin; + gdraw->screen_bounds.y0 = ymin; + gdraw->screen_bounds.x1 = xmax + 1; + gdraw->screen_bounds.y1 = ymax + 1; + + // If we don't have a depth/stencil surface with the right format, + // Iggy rendering is not going to come out right. + if (!depth || + !sceGxmDepthStencilSurfaceIsEnabled(depth) || + sceGxmDepthStencilSurfaceGetFormat(depth) != SCE_GXM_DEPTH_STENCIL_FORMAT_DF32M_S8) { + + // Why this format? + // - We need the stencil buffer to support Flash masking operations. + // - We need the mask bit to perform pixel-accurate scissor testing. + // There's only one format that satisfies both requirements. + IggyGDrawSendWarning(NULL, "Iggy rendering will not work correctly unless a depth/stencil buffer in DF32M_S8 format is provided."); + } + + // For immediate contexts, we need to flush pending vertex transfers before + // every draw because we might hit a mid-scene flush. On a deferred + // context, we need not worry about this happening. + SceGxmContextType type; + SceGxmErrorCode err = sceGxmGetContextType(context, &type); + if (err == SCE_OK && type == SCE_GXM_CONTEXT_TYPE_DEFERRED) + gdraw->draw_transfer_flush_mask = 0; + else + gdraw->draw_transfer_flush_mask = GDRAW_TRANSFER_vertex; +} + +SceGxmNotification gdraw_psp2_End() +{ + GDrawStats gdraw_stats = {}; + SceGxmNotification notify; + + assert(gdraw->gxm != NULL); // please keep Begin / End pairs properly matched + + notify = scene_end_notification(); + gdraw->dyn_buf->sync = gdraw->scene_end_fence.value; + gdraw->dyn_buf->stats = gdraw->dynamic_stats; + + gdraw_arena_init(&gdraw->dynamic, NULL, 0); + gdraw->gxm = NULL; + gdraw->dyn_buf = NULL; + + // NOTE: the stats from these go nowhere. That's a bit unfortunate, but the + // GDrawStats model is that things can be accounted to something in the + // display tree, and that's simply not the case with scene-global things + // like this. With only one Iggy file, a sensible place would be to + // accumulate stats in the root node. But the user can render multiple Iggys + // in the same scene, and it's unclear what to do in that case. + handle_cache_tick(gdraw->texturecache, gdraw->scene_end_fence, &gdraw_stats); + handle_cache_tick(gdraw->vbufcache, gdraw->scene_end_fence, &gdraw_stats); + + // finally, unlock everything + gdraw_HandleCacheUnlockAll(gdraw->texturecache); + gdraw_HandleCacheUnlockAll(gdraw->vbufcache); + + return notify; +} + +#define MAX_DEPTH_VALUE (1 << 22) + +static void RADLINK gdraw_GetInfo(GDrawInfo *d) +{ + d->num_stencil_bits = 8; + d->max_id = MAX_DEPTH_VALUE-2; + // for floating point depth, just use mantissa, e.g. 16-20 bits + d->max_texture_size = MAX_TEXTURE2D_DIM; + d->buffer_format = GDRAW_BFORMAT_vbib; + d->shared_depth_stencil = 1; + d->always_mipmap = 0; + d->conditional_nonpow2 = 0; + d->has_rendertargets = 0; +} + +//////////////////////////////////////////////////////////////////////// +// +// Render targets +// + +static rrbool RADLINK gdraw_TextureDrawBufferBegin(gswf_recti *region, gdraw_texture_format format, U32 flags, void *owner, GDrawStats *stats) +{ + IggyGDrawSendWarning(NULL, "GDraw no rendertarget support on PSP2"); + return false; +} + +static GDrawTexture *RADLINK gdraw_TextureDrawBufferEnd(GDrawStats *stats) +{ + return NULL; +} + +//////////////////////////////////////////////////////////////////////// +// +// Clear stencil/depth buffers +// + +static void RADLINK gdraw_ClearStencilBits(U32 bits) +{ + GDrawStats stats = {}; + clear_whole_surf(false, true, NULL, &stats); +} + +static void RADLINK gdraw_ClearID(void) +{ + GDrawStats stats = {}; + clear_whole_surf(true, false, NULL, &stats); +} + +//////////////////////////////////////////////////////////////////////// +// +// Fragment programs and scissor mask +// + +static RADINLINE void set_fragment_program(SceGxmFragmentProgram *fp) +{ + if (gdraw->cur_fp != fp) { + gdraw->cur_fp = fp; + sceGxmSetFragmentProgram(gdraw->gxm, fp); + } +} + +static RADINLINE void set_vertex_program(SceGxmVertexProgram *vp) +{ + if (gdraw->cur_vp != vp) { + gdraw->cur_vp = vp; + sceGxmSetVertexProgram(gdraw->gxm, vp); + } +} + +static void draw_scissor_region(gswf_recti *r, SceGxmStencilFunc func) +{ + GDraw * RADRESTRICT gd = gdraw; + + // determine tile-aligned rect + gswf_recti tile_rect; + tile_rect.x0 = align_down(r->x0, SCE_GXM_TILE_SIZEX); + tile_rect.y0 = align_down(r->y0, SCE_GXM_TILE_SIZEY); + tile_rect.x1 = align_up(r->x1, SCE_GXM_TILE_SIZEX); + tile_rect.y1 = align_up(r->y1, SCE_GXM_TILE_SIZEY); + + // set up vertex positions + F32 *vpos = (F32 *)alloc_and_set_vertex_uniforms(gd->gxm, 0, 8 * sizeof(F32)); + if (!vpos) + return; + + vpos[0] = (F32)tile_rect.x0; + vpos[1] = (F32)r->x0; + vpos[2] = (F32)r->x1; + vpos[3] = (F32)tile_rect.x1; + vpos[4] = (F32)tile_rect.y0; + vpos[5] = (F32)r->y0; + vpos[6] = (F32)r->y1; + vpos[7] = (F32)tile_rect.y1; + + // set our region clip; note gxm bounds are max-inclusive, hence the -1. + sceGxmSetRegionClip(gd->gxm, SCE_GXM_REGION_CLIP_OUTSIDE, + tile_rect.x0, tile_rect.y0, tile_rect.x1 - 1, tile_rect.y1 - 1); + + // set up programs and state + set_vertex_program(gd->mask_vp); + set_fragment_program(gd->mask_update_fp); + + // draw + gdraw->z_stencil_key = ~0u; // invalidate z state -> force reset on next draw + sceGxmSetFrontStencilFunc(gd->gxm, func, SCE_GXM_STENCIL_OP_KEEP, SCE_GXM_STENCIL_OP_KEEP, SCE_GXM_STENCIL_OP_KEEP, 0, 0); + sceGxmSetViewportEnable(gd->gxm, SCE_GXM_VIEWPORT_DISABLED); + sceGxmDrawPrecomputed(gd->gxm, &gd->mask_draw); + sceGxmSetViewportEnable(gd->gxm, SCE_GXM_VIEWPORT_ENABLED); +} + +static void remove_scissor() +{ + // re-enable drawing in the exclusion region + draw_scissor_region(&gdraw->cur_scissor, SCE_GXM_STENCIL_FUNC_ALWAYS); +} + +static void materialize_scissor(int x0, int y0, int x1, int y1) +{ + GDraw * RADRESTRICT gd = gdraw; + + // did we have scissor set? + if (gd->scissor_state) { + // are we about to set the same scissor again? + if (gd->cur_scissor.x0 == x0 && gd->cur_scissor.y0 == y0 && + gd->cur_scissor.x1 == x1 && gd->cur_scissor.y1 == y1) + return; // nothing to do! + + remove_scissor(); + } + + // draw the mask: disable drawing outside scissor region + gd->cur_scissor.x0 = x0; + gd->cur_scissor.y0 = y0; + gd->cur_scissor.x1 = x1; + gd->cur_scissor.y1 = y1; + draw_scissor_region(&gdraw->cur_scissor, SCE_GXM_STENCIL_FUNC_NEVER); + gd->scissor_state = 1; +} + +//////////////////////////////////////////////////////////////////////// +// +// Set all the render state from GDrawRenderState +// + +// converts a depth id into a Z value +static inline F32 depth_from_id(S32 id) +{ + return (1.0f - 1.0f / MAX_DEPTH_VALUE) - id * (1.0f / MAX_DEPTH_VALUE); // = 1 - (id + 1) / MAX_DEPTH_VALUE +} + +static bool set_renderstate_full(const GDrawRenderState * RADRESTRICT r, GDrawStats *stats) +{ + static const int canonical_blend[ASSERT_COUNT(GDRAW_BLEND__count, 6)] = { + GDRAW_CBLEND_none, // GDRAW_BLEND_none + GDRAW_CBLEND_alpha, // GDRAW_BLEND_alpha + GDRAW_CBLEND_none, // GDRAW_BLEND_multiply - UNSUPPORTED on PSP2 (only occurs in layer blends which we don't allow) + GDRAW_CBLEND_add, // GDRAW_BLEND_add + + GDRAW_CBLEND_none, // GDRAW_BLEND_filter + GDRAW_CBLEND_none, // GDRAW_BLEND_special + }; + + GDraw * RADRESTRICT gd = gdraw; + SceGxmContext * RADRESTRICT gxm = gd->gxm; + + // we need to handle scissor first, since it might require us to draw things. + if (r->scissor) { + S32 xs = gd->tx0v; + S32 ys = gd->ty0v; + + // clip against viewport + S32 x0 = RR_MAX(r->scissor_rect.x0 - xs, gd->cview.x0); + S32 y0 = RR_MAX(r->scissor_rect.y0 - ys, gd->cview.y0); + S32 x1 = RR_MIN(r->scissor_rect.x1 - xs, gd->cview.x1); + S32 y1 = RR_MIN(r->scissor_rect.y1 - ys, gd->cview.y1); + + // in case our actual scissor is empty, bail. + if (x1 <= x0 || y1 <= y0) + return false; + + materialize_scissor(x0, y0, x1, y1); + } else if (r->scissor != gd->scissor_state) + disable_scissor(0); + + // allocate dynamic uniform bufs + void * dyn_uniform = alloc_dynamic(sizeof(VertexVars) + sizeof(PixelCommonVars), sizeof(U32)); + if (!dyn_uniform) + return false; + + VertexVars * RADRESTRICT vvars = (VertexVars *)dyn_uniform; + PixelCommonVars * RADRESTRICT pvars = (PixelCommonVars *)(vvars + 1); // right after VertexVars in dyn_uniform alloc + sceGxmSetVertexUniformBuffer(gxm, 0, vvars); + sceGxmSetFragmentUniformBuffer(gxm, 0, pvars); + + // vertex uniforms + F32 depth = depth_from_id(r->id); + if (!r->use_world_space) + { + gdraw_ObjectSpace(vvars->world[0], r->o2w, depth, 0.0f); + } + else + { + gdraw_WorldSpace(vvars->world[0], gdraw->world_to_pixel, depth, 0.0f); + } + + float32x4_t edge = vld1q_f32(r->edge_matrix); + float32x4_t s0_texgen = vld1q_f32(r->s0_texgen); // always copy, even when unused. + float32x4_t t0_texgen = vld1q_f32(r->t0_texgen); + float32x4_t viewproj = vld1q_f32(gd->projection); + + vst1q_f32(vvars->x_offs, edge); + vst1q_f32(vvars->texgen_s, s0_texgen); + vst1q_f32(vvars->texgen_t, t0_texgen); + vst1q_f32(vvars->viewproj, viewproj); + + // fragment uniforms + float32x4_t col_mul = vld1q_f32(r->color); + float32x4_t col_add = vdupq_n_f32(0.0f); + float32x4_t focal = vld1q_f32(r->focal_point); + + if (r->cxf_add) + col_add = vmulq_n_f32(vcvtq_f32_s32(vmovl_s16(vld1_s16(r->cxf_add))), 1.0f / 255.0f); + + vst1q_f32(pvars->color_mul, col_mul); + vst1q_f32(pvars->color_add, col_add); + vst1q_f32(pvars->focal, focal); + + // set the fragment program + int tex0mode = r->tex0_mode; + int cblend_mode = canonical_blend[r->blend_mode]; + if (r->stencil_set) + cblend_mode = GDRAW_CBLEND_nowrite; + + int additive_mode = 0; + if (r->cxf_add) + additive_mode = r->cxf_add[3] ? 2 : 1; + + set_fragment_program(gd->main_fp[tex0mode][additive_mode][cblend_mode]); + + // set textures + if (tex0mode != GDRAW_TEXTURE_none) { + if (!r->tex[0]) // this can happen if some allocs fail. just abort in that case. + return false; + + if (gd->active_tex[0] != r->tex[0]) { + gd->active_tex[0] = r->tex[0]; + set_gxm_texture(0, ((GDrawHandle *) r->tex[0])->handle.tex.gxm, r->wrap0, r->nearest0); + } + } + + // z/stencil mode changed? + U32 z_stencil_key = r->set_id | (r->test_id << 1) | (r->stencil_test << 16) | (r->stencil_set << 24); + + if (z_stencil_key != gd->z_stencil_key) { + gd->z_stencil_key = z_stencil_key; + sceGxmSetFrontDepthFunc(gxm, r->test_id ? SCE_GXM_DEPTH_FUNC_LESS : SCE_GXM_DEPTH_FUNC_ALWAYS); + sceGxmSetFrontDepthWriteEnable(gxm, r->set_id ? SCE_GXM_DEPTH_WRITE_ENABLED : SCE_GXM_DEPTH_WRITE_DISABLED); + sceGxmSetFrontStencilFunc(gxm, + r->stencil_test ? SCE_GXM_STENCIL_FUNC_EQUAL : SCE_GXM_STENCIL_FUNC_ALWAYS, + SCE_GXM_STENCIL_OP_KEEP, SCE_GXM_STENCIL_OP_KEEP, SCE_GXM_STENCIL_OP_REPLACE, + r->stencil_test, r->stencil_set); + } + + return true; +} + +static RADINLINE bool set_renderstate(const GDrawRenderState * RADRESTRICT r, GDrawStats *stats) +{ + if (!r->identical_state) + return set_renderstate_full(r, stats); + else + return true; +} + +//////////////////////////////////////////////////////////////////////// +// +// Draw triangles with a given renderstate +// + +static const U32 vfmt_stride_bytes[ASSERT_COUNT(GDRAW_vformat__basic_count, 3)] = { + 8, // GDRAW_vformat_v2 + 16, // GDRAW_vformat_v2aa + 16, // GDRAW_vformat_v2tc2 +}; + +#ifdef GDRAW_DEBUG +static GDrawHandle *check_resource(void *ptr) +{ + GDrawHandle *h = (GDrawHandle *)ptr; + + // This is our memory management invariant for tilers. + assert(h->state == GDRAW_HANDLE_STATE_locked || + h->state == GDRAW_HANDLE_STATE_pinned || + h->state == GDRAW_HANDLE_STATE_user_owned); + return h; +} +#else +#define check_resource(ptr) ((GDrawHandle *)(ptr)) +#endif + +static RADINLINE void fence_resources(void *r1, void *r2=NULL, void *r3=NULL) +{ + GDrawFence fence = get_next_fence(); + if (r1) check_resource(r1)->fence = fence; + if (r2) check_resource(r2)->fence = fence; + if (r3) check_resource(r3)->fence = fence; +} + +static RADINLINE void draw_ind_tris_u16(SceGxmContext *gxm, S32 vfmt, const void *verts, const void *inds, S32 num_inds) +{ + sceGxmSetVertexStream(gxm, 0, verts); + sceGxmDraw(gxm, SCE_GXM_PRIMITIVE_TRIANGLES, SCE_GXM_INDEX_FORMAT_U16, inds, num_inds); +} + +static void RADLINK gdraw_DrawIndexedTriangles(GDrawRenderState *r, GDrawPrimitive *p, GDrawVertexBuffer *buf, GDrawStats *stats) +{ + SceGxmContext *gxm = gdraw->gxm; + GDrawHandle *vb = (GDrawHandle *) buf; + S32 vfmt = p->vertex_format; + + // AP only round the coords for type 2 vertex format (text) + if( p->vertex_format == 2 ) + { + r->o2w->trans[0] = (int) r->o2w->trans[0]; + r->o2w->trans[1] = (int) r->o2w->trans[1]; + } + + assert(vfmt < GDRAW_vformat__basic_count); + U32 stride = vfmt_stride_bytes[vfmt]; + if (!set_renderstate(r, stats)) + return; + + set_vertex_program(gdraw->vp[vfmt]); + + // do we have transfers we need to flush before we draw? + if ((gdraw->outstanding_transfers & gdraw->draw_transfer_flush_mask) != 0) + gdraw_gpu_wait_for_transfer_completion(); + + if (vb) + draw_ind_tris_u16(gxm, vfmt, (U8 *)vb->handle.vbuf.verts + (UINTa)p->vertices, (U8 *)vb->handle.vbuf.inds + (UINTa)p->indices, p->num_indices); + else if (p->indices) { + U32 vbytes = p->num_vertices * stride; + U32 ibytes = p->num_indices * sizeof(U16); + U8 *buf = (U8 *)alloc_dynamic(vbytes + ibytes, sizeof(U32)); + if (!buf) + return; + + memcpy(buf, p->vertices, vbytes); + memcpy(buf + vbytes, p->indices, ibytes); + draw_ind_tris_u16(gxm, vfmt, buf, buf + vbytes, p->num_indices); + } else { // dynamic quads + assert(p->num_vertices % 4 == 0); + U32 num_bytes = (U32)p->num_vertices * stride; + + U8 *buf = (U8 *)alloc_dynamic(num_bytes, sizeof(U32)); + if (!buf) + return; + + memcpy(buf, p->vertices, num_bytes); + + S32 pos = 0; + while (pos < p->num_vertices) { + S32 vert_count = RR_MIN(p->num_vertices - pos, QUAD_IB_COUNT * 4); + draw_ind_tris_u16(gxm, vfmt, buf + pos*stride, gdraw->quad_ib, (vert_count >> 2) * 6); + pos += vert_count; + } + } + + fence_resources(vb, r->tex[0], r->tex[1]); + + stats->nonzero_flags |= GDRAW_STATS_batches; + stats->num_batches += 1; + stats->drawn_indices += p->num_indices; + stats->drawn_vertices += p->num_vertices; +} + +/////////////////////////////////////////////////////////////////////// +// +// Flash 8 filter effects +// + +static void do_screen_quad(gswf_recti *s, const F32 *tc, F32 z, GDrawStats *stats) +{ + static const F32 worldv[2][4] = { + { 1.0f, 0.0f, 0.0f, 0.0f }, + { 0.0f, 1.0f, 0.0f, 0.0f }, + }; + + set_vertex_program(gdraw->vp[GDRAW_vformat_v2tc2]); + + VertexVars *vvars = (VertexVars *)alloc_and_set_vertex_uniforms(gdraw->gxm, 0, sizeof(VertexVars)); + if (!vvars) + return; + + float32x4_t world0 = vld1q_f32(worldv[0]); + float32x4_t world1 = vld1q_f32(worldv[1]); + float32x4_t zero = vdupq_n_f32(0.0f); + float32x4_t viewproj = vld1q_f32(gdraw->projection); + world0 = vsetq_lane_f32(z, world0, 2); + vst1q_f32(vvars->world[0], world0); + vst1q_f32(vvars->world[1], world1); + vst1q_f32(vvars->x_offs, zero); + vst1q_f32(vvars->texgen_s, zero); + vst1q_f32(vvars->texgen_t, zero); + vst1q_f32(vvars->viewproj, viewproj); + + gswf_vertex_xyst * RADRESTRICT v = (gswf_vertex_xyst *)alloc_dynamic(4 * sizeof(gswf_vertex_xyst), 4); + if (!v) + return; + + F32 px0 = (F32) s->x0, py0 = (F32) s->y0, px1 = (F32) s->x1, py1 = (F32) s->y1; + v[0].x = px0; v[0].y = py0; v[0].s = tc[0]; v[0].t = tc[1]; + v[1].x = px1; v[1].y = py0; v[1].s = tc[2]; v[1].t = tc[1]; + v[2].x = px1; v[2].y = py1; v[2].s = tc[2]; v[2].t = tc[3]; + v[3].x = px0; v[3].y = py1; v[3].s = tc[0]; v[3].t = tc[3]; + + sceGxmSetVertexStream(gdraw->gxm, 0, v); + sceGxmDraw(gdraw->gxm, SCE_GXM_PRIMITIVE_TRIANGLES, SCE_GXM_INDEX_FORMAT_U16, gdraw->quad_ib, 6); +} + +static void RADLINK gdraw_FilterQuad(GDrawRenderState *r, S32 x0, S32 y0, S32 x1, S32 y1, GDrawStats *stats) +{ + F32 tc[4]; + gswf_recti s; + + // clip to tile boundaries + s.x0 = RR_MAX(x0, gdraw->tx0p); + s.y0 = RR_MAX(y0, gdraw->ty0p); + s.x1 = RR_MIN(x1, gdraw->tx0p + gdraw->tpw); + s.y1 = RR_MIN(y1, gdraw->ty0p + gdraw->tph); + if (s.x1 < s.x0 || s.y1 < s.y0) + return; + + // prepare for drawing + tc[0] = (s.x0 - gdraw->tx0p) / (F32) gdraw->screen_bounds.x1; + tc[1] = (s.y0 - gdraw->ty0p) / (F32) gdraw->screen_bounds.y1; + tc[2] = (s.x1 - gdraw->tx0p) / (F32) gdraw->screen_bounds.x1; + tc[3] = (s.y1 - gdraw->ty0p) / (F32) gdraw->screen_bounds.y1; + + // actual filter effects and special blends aren't supported on PSP2. + if (r->blend_mode == GDRAW_BLEND_filter || r->blend_mode == GDRAW_BLEND_special) { + IggyGDrawSendWarning(NULL, "GDraw no filter or special blend support on PSP2"); + // just don't do anything. + } else { + // just a plain quad. + if (!set_renderstate(r, stats)) + return; + + do_screen_quad(&s, tc, 0.0f, stats); + fence_resources(r->tex[0], r->tex[1]); + } +} + +//////////////////////////////////////////////////////////////////////// +// +// Shaders and state initialization +// + +#include "gdraw_psp2_shaders.inl" + +static bool gxm_check(SceGxmErrorCode err) +{ + if (err != SCE_OK) + IggyGDrawSendWarning(NULL, "GXM error"); + + return err == SCE_OK; +} + +static bool register_shader(SceGxmShaderPatcher *patcher, ShaderCode *shader) +{ + if (!shader->blob) + return SCE_OK; + + bool ok = gxm_check(sceGxmShaderPatcherRegisterProgram(patcher, (const SceGxmProgram *)shader->blob, &shader->id)); + shader->registered = ok; + return ok; +} + +static void unregister_shader(SceGxmShaderPatcher *patcher, ShaderCode *shader) +{ + if (shader->registered) { + sceGxmShaderPatcherUnregisterProgram(patcher, shader->id); + shader->registered = false; + } +} + +static bool register_and_create_vertex_prog(SceGxmVertexProgram **out_prog, SceGxmShaderPatcher *patcher, ShaderCode *shader, U32 attr_bytes) +{ + SceGxmVertexAttribute attr; + SceGxmVertexStream stream; + + if (!register_shader(patcher, shader)) + return NULL; + + *out_prog = NULL; + + if (attr_bytes) { + attr.streamIndex = 0; + attr.offset = 0; + attr.format = SCE_GXM_ATTRIBUTE_FORMAT_UNTYPED; + attr.componentCount = attr_bytes / sizeof(U32); + attr.regIndex = 0; + + stream.stride = attr_bytes; + stream.indexSource = SCE_GXM_INDEX_SOURCE_INDEX_16BIT; + + return gxm_check(sceGxmShaderPatcherCreateVertexProgram(patcher, shader->id, &attr, 1, &stream, 1, out_prog)); + } else + return gxm_check(sceGxmShaderPatcherCreateVertexProgram(patcher, shader->id, NULL, 0, NULL, 0, out_prog)); +} + +static void destroy_vertex_prog(SceGxmShaderPatcher *patcher, SceGxmVertexProgram *prog) +{ + if (prog) + sceGxmShaderPatcherReleaseVertexProgram(patcher, prog); +} + +static bool create_fragment_prog(SceGxmFragmentProgram **out_prog, SceGxmShaderPatcher *patcher, ShaderCode *shader, const SceGxmBlendInfo *blend, SceGxmOutputRegisterFormat out_fmt) +{ + *out_prog = NULL; + return gxm_check(sceGxmShaderPatcherCreateFragmentProgram(patcher, shader->id, out_fmt, SCE_GXM_MULTISAMPLE_NONE, blend, NULL, out_prog)); +} + +static void destroy_fragment_prog(SceGxmShaderPatcher *patcher, SceGxmFragmentProgram *prog) +{ + if (prog) + sceGxmShaderPatcherReleaseFragmentProgram(patcher, prog); +} + +static bool create_all_programs(SceGxmOutputRegisterFormat reg_format) +{ + SceGxmShaderPatcher *patcher = gdraw->patcher; + + // blend states + static const SceGxmBlendInfo blends[ASSERT_COUNT(GDRAW_CBLEND__count, 4)] = { + // GDRAW_CBLEND_none + { SCE_GXM_COLOR_MASK_ALL, SCE_GXM_BLEND_FUNC_ADD, SCE_GXM_BLEND_FUNC_ADD, + SCE_GXM_BLEND_FACTOR_ONE, SCE_GXM_BLEND_FACTOR_ZERO, + SCE_GXM_BLEND_FACTOR_ONE, SCE_GXM_BLEND_FACTOR_ZERO + }, + // GDRAW_CBLEND_alpha + { SCE_GXM_COLOR_MASK_ALL, SCE_GXM_BLEND_FUNC_ADD, SCE_GXM_BLEND_FUNC_ADD, + SCE_GXM_BLEND_FACTOR_ONE, SCE_GXM_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA, + SCE_GXM_BLEND_FACTOR_ONE, SCE_GXM_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA + }, + // GDRAW_CBLEND_add + { SCE_GXM_COLOR_MASK_ALL, SCE_GXM_BLEND_FUNC_ADD, SCE_GXM_BLEND_FUNC_ADD, + SCE_GXM_BLEND_FACTOR_ONE, SCE_GXM_BLEND_FACTOR_ONE, + SCE_GXM_BLEND_FACTOR_ONE, SCE_GXM_BLEND_FACTOR_ONE + }, + // GDRAW_CBLEND_nowrite + { SCE_GXM_COLOR_MASK_NONE, SCE_GXM_BLEND_FUNC_ADD, SCE_GXM_BLEND_FUNC_ADD, + SCE_GXM_BLEND_FACTOR_ONE, SCE_GXM_BLEND_FACTOR_ZERO, + SCE_GXM_BLEND_FACTOR_ONE, SCE_GXM_BLEND_FACTOR_ZERO + }, + }; + + // vertex shaders + for (int i=0; i < GDRAW_vformat__basic_count; i++) { + if (!register_and_create_vertex_prog(&gdraw->vp[i], patcher, vshader_vspsp2_arr + i, vfmt_stride_bytes[i])) + return false; + } + + if (!register_and_create_vertex_prog(&gdraw->mask_vp, patcher, vshader_vspsp2_mask_arr, 0)) + return false; + + // fragment shaders + for (int i=0; i < GDRAW_TEXTURE__count; i++) { + for (int j=0; j < 3; j++) { + ShaderCode *sh = pshader_basic_arr + i*3 + j; + if (!register_shader(patcher, sh)) + return false; + + for (int k=0; k < GDRAW_CBLEND__count; k++) + if (!create_fragment_prog(&gdraw->main_fp[i][j][k], patcher, sh, &blends[k], reg_format)) + return false; + } + } + + if (!register_shader(patcher, pshader_manual_clear_arr) || + !create_fragment_prog(&gdraw->clear_fp, patcher, pshader_manual_clear_arr, NULL, reg_format)) + return false; + + gdraw->mask_update_fp = NULL; + return gxm_check(sceGxmShaderPatcherCreateMaskUpdateFragmentProgram(patcher, &gdraw->mask_update_fp)); +} + +static void destroy_all_programs() +{ + SceGxmShaderPatcher *patcher = gdraw->patcher; + + // release all programs + for (int i=0; i < GDRAW_vformat__basic_count; i++) + destroy_vertex_prog(patcher, gdraw->vp[i]); + + destroy_vertex_prog(patcher, gdraw->mask_vp); + + for (int i=0; i < GDRAW_TEXTURE__count * 3 * GDRAW_CBLEND__count; i++) + destroy_fragment_prog(patcher, gdraw->main_fp[0][0][i]); + + destroy_fragment_prog(patcher, gdraw->clear_fp); + sceGxmShaderPatcherReleaseFragmentProgram(patcher, gdraw->mask_update_fp); + + // unregister shaders + for (int i=0; i < GDRAW_vformat__basic_count; i++) + unregister_shader(patcher, vshader_vspsp2_arr + i); + + for (int i=0; i < GDRAW_TEXTURE__count*3; i++) + unregister_shader(patcher, pshader_basic_arr + i); + unregister_shader(patcher, pshader_manual_clear_arr); +} + +typedef struct +{ + S32 num_handles; + S32 num_bytes; + void *ptr; +} GDrawResourceLimit; + +// Resource limits used by GDraw. Change these using SetResouceLimits! +static GDrawResourceLimit gdraw_limits[GDRAW_PSP2_RESOURCE__count]; + +static GDrawHandleCache *make_handle_cache(gdraw_psp2_resourcetype type, U32 align, rrbool use_twopool) +{ + S32 num_handles = gdraw_limits[type].num_handles; + S32 one_pool_bytes = gdraw_limits[type].num_bytes; + U32 cache_size = sizeof(GDrawHandleCache) + (num_handles - 1) * sizeof(GDrawHandle); + bool is_vertex = (type == GDRAW_PSP2_RESOURCE_vertexbuffer); + U32 header_size = num_handles * (is_vertex ? 0 : sizeof(SceGxmTexture)); + GDrawHandleCache *cache; + + if (use_twopool) + one_pool_bytes = align_down(one_pool_bytes / 2, align); + + if (one_pool_bytes < (S32)align) + return NULL; + + cache = (GDrawHandleCache *) IggyGDrawMalloc(cache_size + header_size); + if (cache) { + gdraw_HandleCacheInit(cache, num_handles, one_pool_bytes); + cache->is_vertex = is_vertex; + + // set up resource headers + void *header_start = (U8 *) cache + cache_size; + if (!is_vertex) { + SceGxmTexture *headers = (SceGxmTexture *) header_start; + for (S32 i=0; i < num_handles; i++) + cache->handle[i].handle.tex.gxm = &headers[i]; + } + + // set up allocators + cache->alloc = gfxalloc_create(gdraw_limits[type].ptr, one_pool_bytes, align, num_handles); + if (!cache->alloc) { + IggyGDrawFree(cache); + return NULL; + } + + if (use_twopool) { + cache->alloc_other = gfxalloc_create((U8 *)gdraw_limits[type].ptr + one_pool_bytes, one_pool_bytes, align, num_handles); + if (!cache->alloc_other) { + IggyGDrawFree(cache->alloc); + IggyGDrawFree(cache); + return NULL; + } + + // two dummy copies to make sure we have gpu read/write access + assert(align >= GPU_MEMCPY_ALIGN); + U8 *mem_begin = (U8 *)gdraw_limits[type].ptr; + U8 *mem_near_end = (U8 *)gdraw_limits[type].ptr + 2*one_pool_bytes - GPU_MEMCPY_ALIGN; + + // reads near begin, writes near end + gdraw_gpu_memcpy(cache, mem_near_end, mem_begin, GPU_MEMCPY_ALIGN); + // reads near end, writes near begin + gdraw_gpu_memcpy(cache, mem_begin, mem_near_end, GPU_MEMCPY_ALIGN); + gdraw_gpu_wait_for_transfer_completion(); + } + } + + return cache; +} + +static void free_handle_cache(GDrawHandleCache *c) +{ + if (c) { + if (c->alloc) IggyGDrawFree(c->alloc); + if (c->alloc_other) IggyGDrawFree(c->alloc_other); + IggyGDrawFree(c); + } +} + +void gdraw_psp2_InitDynamicBuffer(gdraw_psp2_dynamic_buffer *buf, void *ptr, U32 num_bytes) +{ + memset(buf, 0, sizeof(*buf)); + buf->start = ptr; + buf->size_in_bytes = num_bytes; +} + +void gdraw_psp2_WaitForDynamicBufferIdle(gdraw_psp2_dynamic_buffer *buf) +{ + GDrawFence fence; + fence.value = buf->sync; + wait_on_fence(fence); +} + +int gdraw_psp2_SetResourceMemory(gdraw_psp2_resourcetype type, S32 num_handles, void *ptr, S32 num_bytes) +{ + GDrawStats stats={0}; + + assert(type >= GDRAW_PSP2_RESOURCE_texture && type < GDRAW_PSP2_RESOURCE__count); + assert(num_handles >= 0); + assert(num_bytes >= 0); + + if (!num_handles) num_handles = 1; + + switch (type) { + case GDRAW_PSP2_RESOURCE_texture: + make_pool_aligned(&ptr, &num_bytes, GDRAW_PSP2_TEXTURE_ALIGNMENT); + break; + + case GDRAW_PSP2_RESOURCE_vertexbuffer: + make_pool_aligned(&ptr, &num_bytes, GDRAW_PSP2_VERTEXBUFFER_ALIGNMENT); + break; + + default: + break; + } + + gdraw_limits[type].num_handles = num_handles; + gdraw_limits[type].num_bytes = num_bytes; + gdraw_limits[type].ptr = ptr; + + // if no gdraw context created, there's nothing to worry about + if (!gdraw) + return 1; + + // make sure GPU is done first (assuming we're in a state where we can dispatch commands) + assert(!is_fence_pending(gdraw->scene_end_fence)); // you may not call this while GPU is still busy with Iggy command buffers! + + if (gdraw->texturecache) gdraw_res_reap(gdraw->texturecache, &stats); + if (gdraw->vbufcache) gdraw_res_reap(gdraw->vbufcache, &stats); + // in theory we can now check that the given cache is really empty at this point + + // resize the appropriate pool + switch (type) { + case GDRAW_PSP2_RESOURCE_texture: + free_handle_cache(gdraw->texturecache); + gdraw->texturecache = make_handle_cache(GDRAW_PSP2_RESOURCE_texture, GDRAW_PSP2_TEXTURE_ALIGNMENT, true); + return gdraw->texturecache != NULL; + + case GDRAW_PSP2_RESOURCE_vertexbuffer: + free_handle_cache(gdraw->vbufcache); + gdraw->vbufcache = make_handle_cache(GDRAW_PSP2_RESOURCE_vertexbuffer, GDRAW_PSP2_VERTEXBUFFER_ALIGNMENT, true); + return gdraw->vbufcache != NULL; + + default: + return 0; + } +} + +void gdraw_psp2_ResetAllResourceMemory() +{ + gdraw_psp2_SetResourceMemory(GDRAW_PSP2_RESOURCE_texture, 0, NULL, 0); + gdraw_psp2_SetResourceMemory(GDRAW_PSP2_RESOURCE_vertexbuffer, 0, NULL, 0); +} + +GDrawFunctions *gdraw_psp2_CreateContext(SceGxmShaderPatcher *shader_patcher, void *context_mem, volatile U32 *notification, SceGxmOutputRegisterFormat reg_format) +{ + // mask index buffer: + // + // 0-----------------------3 y0 + // | \5---------------6 / | y1 + // | | | | + // | | | | + // | 9---------------a | y2 + // | / \ | + // c-----------------------f y3 + // + // x0 x1 x2 x3 + static const U16 mask_ib_data[5*2] = { + // tri strip + 0,5, 3,6, 15,10, 12,9, 0,5, + }; + + gdraw = (GDraw *) IggyGDrawMalloc(sizeof(*gdraw)); + if (!gdraw) return NULL; + + memset(gdraw, 0, sizeof(*gdraw)); + + // context shared memory + gdraw_arena_init(&gdraw->context_arena, context_mem, GDRAW_PSP2_CONTEXT_MEM_SIZE); + + // notifications + *notification = 0; + gdraw->fence_label = notification; + gdraw->next_fence_index = 1; + gdraw->scene_end_fence.value = 0; + + // shader patcher + gdraw->patcher = shader_patcher; + + // set up memory for all resource types + for (int i=0; i < GDRAW_PSP2_RESOURCE__count; i++) + gdraw_psp2_SetResourceMemory((gdraw_psp2_resourcetype) i, gdraw_limits[i].num_handles, gdraw_limits[i].ptr, gdraw_limits[i].num_bytes); + + // shaders and state + gdraw->quad_ib = (U16 *)gdraw_arena_alloc(&gdraw->context_arena, QUAD_IB_COUNT * 6 * sizeof(U16), sizeof(U32)); + gdraw->mask_ib = (U16 *)gdraw_arena_alloc(&gdraw->context_arena, sizeof(mask_ib_data), sizeof(U32)); + + if (!gdraw->quad_ib || !gdraw->mask_ib || !create_all_programs(reg_format)) { + gdraw_psp2_DestroyContext(); + return NULL; + } + + // init quad index buffer + for (int i=0; i < QUAD_IB_COUNT; i++) { + U16 *out_ind = gdraw->quad_ib + i*6; + U16 base = (U16)(i * 4); + + out_ind[0] = base + 0; out_ind[1] = base + 1; out_ind[2] = base + 2; + out_ind[3] = base + 0; out_ind[4] = base + 2; out_ind[5] = base + 3; + } + + // mask draw (can only alloc this here since we need mask_vp) + gdraw->mask_draw_gpu = gdraw_arena_alloc(&gdraw->context_arena, sceGxmGetPrecomputedDrawSize(gdraw->mask_vp), SCE_GXM_PRECOMPUTED_ALIGNMENT); + if (!gdraw->mask_draw_gpu) { + gdraw_psp2_DestroyContext(); + return NULL; + } + + memcpy(gdraw->mask_ib, mask_ib_data, sizeof(mask_ib_data)); + sceGxmPrecomputedDrawInit(&gdraw->mask_draw, gdraw->mask_vp, gdraw->mask_draw_gpu); + sceGxmPrecomputedDrawSetParams(&gdraw->mask_draw, SCE_GXM_PRIMITIVE_TRIANGLE_STRIP, SCE_GXM_INDEX_FORMAT_U16, gdraw->mask_ib, 5*2); + + // API + gdraw_funcs.SetViewSizeAndWorldScale = gdraw_SetViewSizeAndWorldScale; + gdraw_funcs.GetInfo = gdraw_GetInfo; + + gdraw_funcs.DescribeTexture = gdraw_DescribeTexture; + gdraw_funcs.DescribeVertexBuffer = gdraw_DescribeVertexBuffer; + + gdraw_funcs.RenderingBegin = gdraw_RenderingBegin; + gdraw_funcs.RenderingEnd = gdraw_RenderingEnd; + gdraw_funcs.RenderTileBegin = gdraw_RenderTileBegin; + gdraw_funcs.RenderTileEnd = gdraw_RenderTileEnd; + + gdraw_funcs.TextureDrawBufferBegin = gdraw_TextureDrawBufferBegin; + gdraw_funcs.TextureDrawBufferEnd = gdraw_TextureDrawBufferEnd; + + gdraw_funcs.DrawIndexedTriangles = gdraw_DrawIndexedTriangles; + gdraw_funcs.FilterQuad = gdraw_FilterQuad; + + gdraw_funcs.SetAntialiasTexture = gdraw_SetAntialiasTexture; + + gdraw_funcs.ClearStencilBits = gdraw_ClearStencilBits; + gdraw_funcs.ClearID = gdraw_ClearID; + + gdraw_funcs.MakeTextureBegin = gdraw_MakeTextureBegin; + gdraw_funcs.MakeTextureMore = gdraw_MakeTextureMore; + gdraw_funcs.MakeTextureEnd = gdraw_MakeTextureEnd; + + gdraw_funcs.UpdateTextureBegin = gdraw_UpdateTextureBegin; + gdraw_funcs.UpdateTextureRect = gdraw_UpdateTextureRect; + gdraw_funcs.UpdateTextureEnd = gdraw_UpdateTextureEnd; + + gdraw_funcs.FreeTexture = gdraw_FreeTexture; + gdraw_funcs.TryToLockTexture = gdraw_TryToLockTexture; + + gdraw_funcs.MakeVertexBufferBegin = gdraw_MakeVertexBufferBegin; + gdraw_funcs.MakeVertexBufferMore = gdraw_MakeVertexBufferMore; + gdraw_funcs.MakeVertexBufferEnd = gdraw_MakeVertexBufferEnd; + gdraw_funcs.TryToLockVertexBuffer = gdraw_TryLockVertexBuffer; + gdraw_funcs.FreeVertexBuffer = gdraw_FreeVertexBuffer; + + gdraw_funcs.MakeTextureFromResource = (gdraw_make_texture_from_resource *) gdraw_psp2_MakeTextureFromResource; + gdraw_funcs.FreeTextureFromResource = gdraw_psp2_DestroyTextureFromResource; + + gdraw_funcs.UnlockHandles = gdraw_UnlockHandles; + gdraw_funcs.SetTextureUniqueID = gdraw_SetTextureUniqueID; + + return &gdraw_funcs; +} + +void gdraw_psp2_DestroyContext(void) +{ + if (gdraw) { + GDrawStats stats; + memset(&stats, 0, sizeof(stats)); + if (gdraw->texturecache) gdraw_res_flush(gdraw->texturecache, &stats); + if (gdraw->vbufcache) gdraw_res_flush(gdraw->vbufcache, &stats); + + // make sure the GPU is done first + assert(!is_fence_pending(gdraw->scene_end_fence)); + + free_handle_cache(gdraw->texturecache); + free_handle_cache(gdraw->vbufcache); + destroy_all_programs(); + IggyGDrawFree(gdraw); + gdraw = NULL; + } +} + +void RADLINK gdraw_psp2_BeginCustomDraw(IggyCustomDrawCallbackRegion *region, float matrix[16]) +{ + clear_renderstate(); + gdraw_GetObjectSpaceMatrix(matrix, region->o2w, gdraw->projection, 0.0f, 0); +} + +void RADLINK gdraw_psp2_CalculateCustomDraw_4J(IggyCustomDrawCallbackRegion * region, F32 mat[16]) +{ + gdraw_GetObjectSpaceMatrix(mat, region->o2w, gdraw->projection, 0.0f, 0); +} + +void RADLINK gdraw_psp2_EndCustomDraw(IggyCustomDrawCallbackRegion *region) +{ + set_common_renderstate(); +} + +GDrawTexture * RADLINK gdraw_psp2_MakeTextureFromResource(U8 *file_in_memory, S32 len, IggyFileTexturePSP2 *tex) +{ + SceGxmErrorCode (*init_func)(SceGxmTexture *texture, const void *data, SceGxmTextureFormat texFormat, uint32_t width, uint32_t height, uint32_t mipCount) = NULL; + + switch (tex->texture.type) { + case SCE_GXM_TEXTURE_SWIZZLED: init_func = sceGxmTextureInitSwizzled; break; + case SCE_GXM_TEXTURE_LINEAR: init_func = sceGxmTextureInitLinear; break; + case SCE_GXM_TEXTURE_TILED: init_func = sceGxmTextureInitTiled; break; + case SCE_GXM_TEXTURE_SWIZZLED_ARBITRARY: init_func = sceGxmTextureInitSwizzledArbitrary; break; + } + + if (!init_func) { + IggyGDrawSendWarning(NULL, "Unsupported texture type in MakeTextureFromResource"); + return NULL; + } + + SceGxmTexture gxm; + SceGxmErrorCode err = init_func(&gxm, file_in_memory + tex->file_offset, (SceGxmTextureFormat)tex->texture.format, tex->texture.width, tex->texture.height, tex->texture.mip_count); + if (err != SCE_OK) { + IggyGDrawSendWarning(NULL, "Texture init failed in MakeTextureFromResource (bad data?)"); + return NULL; + } + + return gdraw_psp2_WrappedTextureCreate(&gxm); +} + +extern void RADLINK gdraw_psp2_DestroyTextureFromResource(GDrawTexture *tex) +{ + gdraw_psp2_WrappedTextureDestroy(tex); +} + diff --git a/Minecraft.Client/PSVita/Iggy/gdraw/gdraw_psp2.h b/Minecraft.Client/PSVita/Iggy/gdraw/gdraw_psp2.h new file mode 100644 index 00000000..a606fbe3 --- /dev/null +++ b/Minecraft.Client/PSVita/Iggy/gdraw/gdraw_psp2.h @@ -0,0 +1,264 @@ +// gdraw_psp2.h - author: Fabian Giesen - copyright 2014 RAD Game Tools +// +// Interface for creating a PSP2 GDraw driver. + +#include "gdraw.h" + +#define IDOC +//idoc(parent,GDraw_psp2) + +// Size and alignment requirements of GDraw context memory. +#define GDRAW_PSP2_CONTEXT_MEM_SIZE (16*1024) + +// Alignment requirements for different resource types (in bytes) +#define GDRAW_PSP2_TEXTURE_ALIGNMENT 16 +#define GDRAW_PSP2_VERTEXBUFFER_ALIGNMENT 16 + +typedef enum gdraw_psp2_resourcetype +{ + GDRAW_PSP2_RESOURCE_texture, + GDRAW_PSP2_RESOURCE_vertexbuffer, + + GDRAW_PSP2_RESOURCE__count, +} gdraw_psp2_resourcetype; + +typedef struct +{ + U32 allocs_attempted; // number of allocations attempted from the staging buffer + U32 allocs_succeeded; // number of allocations that succeeded + U32 bytes_attempted; // number of bytes attempted to allocate + U32 bytes_succeeded; // number of bytes successfully allocated + U32 largest_bytes_attempted; // number of bytes in largest attempted alloc + U32 largest_bytes_succeeded; // number of bytes in lagrest successful alloc +} gdraw_psp2_dynamic_stats; + +typedef struct +{ + void *start; // pointer to the start of the buffer + U32 size_in_bytes; // size of the buffer in bytes + U64 sync; // used internally by GDraw for synchronization. + + gdraw_psp2_dynamic_stats stats; // stats on buffer usage - these are for your benefit! +} gdraw_psp2_dynamic_buffer; + +IDOC extern void gdraw_psp2_InitDynamicBuffer(gdraw_psp2_dynamic_buffer *buffer, void *ptr, U32 num_bytes); +/* Initializes a GDraw dynamic buffer struct. + + The "dynamic buffer" is where GDraw stores all transient data for a scene - dynamic + vertex and index data, uniform buffers and the like. We wrap them in a struct + so we can handle synchronization with the GPU. + + "ptr" should point to non-cached, GPU-mapped readable memory. "num_bytes" is the size of + the buffer in bytes. */ + +IDOC extern void gdraw_psp2_WaitForDynamicBufferIdle(gdraw_psp2_dynamic_buffer *buffer); +/* Waits until a GDraw dynamic buffer is idle, i.e. not being used by the + GPU anymore. You need to call this if you intend to free the allocated storage. */ + +IDOC extern int gdraw_psp2_SetResourceMemory(gdraw_psp2_resourcetype type, S32 num_handles, void *ptr, S32 num_bytes); +/* Sets up the resource pools that GDraw uses for its video memory management. + + It sets both the number of handles and the address and size of memory to use. + GDraw keeps track of allocations in each pool, and will free old resources in + a LRU manner to make space if one of the limits is about to be exceeded. It will + also automatically defragment memory if necessary to fulfill an allocation + request. + + "ptr" points to the address of the resource pool. This memory needs to be + mapped to the GPU and *writeable*. If it isn't, the GPU will crash during + either this function or CreateContext! + + Pass in NULL for "ptr" and zero "num_bytes" to free the memory allocated to + a specific pool. + + GDraw can run into cases where resource memory gets fragmented; we defragment + automatically in that case. However, to make this work, GDraw on PSP2 needs + resource pool memory equivalent to *twice* the largest working set in any + scene. So for example, if you use 10MB worth of textures, GDraw needs at least + a 20MB texture pool! On other platforms, we can avoid this extra cost by + draining the GPU pipeline in the middle of a frame in certain rare cases, but + doing so on PSP2 would mean not supporting deferred contexts. + + You need to set up all of the resource pools before you can start rendering. + If you modify this at runtime, you need to call IggyPlayerFlushAll on all + active Iggys (if any) since this call invalidates all resource handles they + currently hold. + + Resource pool memory has certain alignment requirements - see the #defines + above. If you pass in an unaligned pointer, GDraw will automatically clip off + some bytes at the front to make the buffer aligned - in other words, you get + somewhat less usable bytes, but it should work fine. + + If any Iggy draw calls are in flight, this call will block waiting for + those calls to finish (i.e. for the resource memory to become + unused). +*/ + +IDOC extern void gdraw_psp2_ResetAllResourceMemory(); +/* Frees all resource pools managed by GDraw. + + Use this as a quick way of freeing (nearly) all memory allocated by GDraw + without shutting it down completely. For example, you might want to use this + to quickly flush all memory allocated by GDraw when transitioning between the + main menu and the game proper. Like with SetResourceMemory, you need to call + IggyPlayerFlushAll on all currently active Iggy players if you do this - although + we recommend that you only use this function when there aren't any. */ + +IDOC extern GDrawFunctions * gdraw_psp2_CreateContext(SceGxmShaderPatcher *shader_patcher, void *context_mem, volatile U32 *notification, SceGxmOutputRegisterFormat reg_format); +/* Creates a GDraw context for rendering using GXM. You need to pass in a pointer to + the shader patcher to use, a pointer to "context memory" which holds a few persistent + resources shared by all Iggys (it needs to hold GDRAW_PSP2_CONTEXT_MEM_SIZE bytes + and must be mapped to be GPU readable), and a pointer to the notificaiton to use for + GDraw sync. + + "reg_format" specifies the output register format to specify when creating + GDraw's fragment shaders. This should match your color surface. Typical choices + are: + - SCE_GXM_OUTPUT_REGISTER_FORMAT_UCHAR4 (32-bit output register size in color surface) + - SCE_GXM_OUTPUT_REGISTER_FORMAT_HALF4 (64-bit output register size in color surface) + + There can only be one GDraw context active at any one time. The shader_patcher must + be valid for as long as a GDraw context is alive. + + If initialization fails for some reason (the main reason would be an out of memory condition), + NULL is returned. Otherwise, you can pass the return value to IggySetGDraw. */ + +IDOC extern void gdraw_psp2_DestroyContext(void); +/* Destroys the current GDraw context, if any. + + If any Iggy draw calls are in flight, this call will block waiting for + those calls to finish (i.e. for the resource memory to become + unused). +*/ + +IDOC extern void gdraw_psp2_Begin(SceGxmContext *context, const SceGxmColorSurface *color, const SceGxmDepthStencilSurface *depth, + gdraw_psp2_dynamic_buffer *dynamic_buffer); +/* This sets the SceGxmContext that GDraw writes its commands to. It also specifies + the dynamic buffer to use. Any GDraw / Iggy rendering calls outside a + Begin / End bracket are an error and will be treated as such. The GXM context + and dynamic buffer must be live during the entire Begin / End bracket. + + NOTE: If you are passing in a deferred context, see important notes below! + + GDraw uses the color and depth surfaces for parameter validation. Make sure to + pass in the same values you passed in to sceGxmBeginScene. Also, inside a given + scene, you may have only *one* $gdraw_psp2_Begin / $gdraw_psp2_End pair. + + GDraw maintains a persistent resource cache shared across all Iggys. Because of this, + it is *vital* that all command lists generated from GDraw be executed in the order + they were generated, or the resource pools might get corrupted. + + If the dynamic buffer is of insufficient size, GDraw will not be able to allocate dynamic + vertex data or upload new texture/vertex buffer data during some frames, resulting in + glitching! (When this happens, it will be reported as a warning, so make sure to install + a warning callback). + + You should use multiple dynamic buffers (at least double-buffer it); otherwise, + GDraw needs to stall every frame to wait for the GPU to process the previous one. + + GDraw starts no scenes of its own; you must call BeginScene before you issue + gdraw_psp2_Begin. + + If you are a using a deferred context: + -------------------------------------- + + It's allowed to pass in a deferred context as "context". You may perform Iggy + rendering on a separate thread. However, because there is only a single global + resource pool that is modified directly by GDraw, rendering is *not* thread-safe; + that is, you may do Iggy rendering on any thread, but only a single thread may + be inside a GDraw Begin / End bracket at any given time. + + Furthermore, if you use a deferred context, you must use (and execute!) the + resulting command list and end the containing scene *before* you call + $gdraw_psp2_Begin again. That is, usage must look like this: + + Main thread: | Other thread: + | gdraw_psp2_Begin(deferred_ctx, ...) + | + | gdraw_psp2_End(deferred_ctx, ...) + | ... + | sceGxmEndCommandList(deferred_ctx, &cmd_list) + | + sceGxmBeginScene(...) | + sceGxmExecuteCommandList(..., cmd_list) | + sceGxmEndScene() | + + The second thread may *not* start another $gdraw_psp2_Begin before the main thread + calls sceGxmEndScene(). + + This is inconvenient, but unfortunately required by our resource management: every + GDraw Begin / End Bracket may end up having to wait for the GPU to finish work done + during a previous bracket, and this only works if the corresponding jobs have been + submitted to the GPU by the point $gdraw_psp2_Begin is called! +*/ + +IDOC extern SceGxmNotification gdraw_psp2_End(); +/* This marks the end of GDraw rendering for a frame. It also triggers end-of-frame processing, + which is important for GDraw's internal resource management. GDraw will not touch the GXM context + or staging buffer after this call, so you are free to append other rendering commands after + this call returns. + + This function will also update the "stats" field in the dynamic buffer you passed + to "Begin". + + You are *required* to pass the returned SceGxmNotification as your "fragment notification" + when calling sceGxmEndScene. This is necessary to make GDraw's resource management work! */ + +IDOC extern void gdraw_psp2_SetTileOrigin(S32 x, S32 y); +/* This sets the x/y position of the output location of the top-left pixel of the current + tile. Iggy has support for manual splitting of rendering into multiple tiles; PSP2 is + already a tiled renderer that handles all this in hardware, so in practice + you will probably always pass (0,0) here. + + You should call this inside a gdraw_psp2_Begin / gdraw_psp2_End bracket, before + any Iggy / GDraw rendering takes place. */ + +IDOC extern void gdraw_psp2_ClearBeforeNextRender(const F32 clear_color_rgba[4]); +/* You often want to clear the render target before you start Iggy rendering. + + This is a convenience function, if you don't want to do the clear yourself. + Iggy always clears the depth/stencil buffers when it starts rendering; if you + call this function first, it will also clear the color surface to the + specified color during that initial clear. If this function is not called + before rendering, GDraw will leave the contents of the color surface alone. + + This function does not do any rendering; it just sets some internal state + that GDraw processes when it starts rendering. That state gets reset for every + call to IggyPlayerDraw or IggyPlayerDrawTile. */ + +IDOC extern void RADLINK gdraw_psp2_CalculateCustomDraw_4J(IggyCustomDrawCallbackRegion *region, float matrix[16]); +IDOC extern void RADLINK gdraw_psp2_BeginCustomDraw(IggyCustomDrawCallbackRegion *region, float matrix[16]); +/* Call at the beginning of Iggy custom draw callback to clear any odd render states GDraw has + set, and to get the current 2D object-to-world transformation. */ + +IDOC extern void RADLINK gdraw_psp2_EndCustomDraw(IggyCustomDrawCallbackRegion *region); +/* Call at the end of Iggy custom draw callback so GDraw can restore its render states. */ + +IDOC extern GDrawTexture *gdraw_psp2_WrappedTextureCreate(SceGxmTexture *tex); +/* Create a wrapped texture from a GXM texture. + A wrapped texture can be used to let Iggy draw using the contents of a texture + you create and manage on your own. For example, you might render to this texture, + or stream video into it. Wrapped textures take up a handle. They will never be + freed or otherwise modified by GDraw; nor will GDraw change any reference counts. + All this is up to the application. + GDraw makes a copy of the contents of the sceGxmTexture (the contents of the struct + that is, not the data it points to). If you later modify the fields of "tex", you + need to call $gdraw_psp2_WrappedTextureChange. + */ + +IDOC extern void gdraw_psp2_WrappedTextureChange(GDrawTexture *handle, SceGxmTexture *tex); +/* Switch an existing GDrawTexture * that represents a wrapped texture to use + a new underlying GXM texture. For example, you might internally double-buffer + a dynamically updated texture. As above, GDraw will leave this texture alone + and not touch any reference counts. */ + +IDOC extern void gdraw_psp2_WrappedTextureDestroy(GDrawTexture *handle); +/* Destroys the GDraw wrapper for a wrapped texture object. This will free up + a GDraw texture handle but not release the associated GXM texture; that is + up to you. */ + +IDOC extern GDrawTexture * RADLINK gdraw_psp2_MakeTextureFromResource(U8 *file_in_memory, S32 length, IggyFileTexturePSP2 *tex); +/* Sets up a texture loaded from a .psp2.iggytex file. */ + +extern void RADLINK gdraw_psp2_DestroyTextureFromResource(GDrawTexture *tex); + diff --git a/Minecraft.Client/PSVita/Iggy/gdraw/gdraw_psp2_shaders.inl b/Minecraft.Client/PSVita/Iggy/gdraw/gdraw_psp2_shaders.inl new file mode 100644 index 00000000..9e2870eb --- /dev/null +++ b/Minecraft.Client/PSVita/Iggy/gdraw/gdraw_psp2_shaders.inl @@ -0,0 +1,697 @@ +// This file was automatically generated by shadergen. Do not edit by hand! + +static unsigned char pshader_basic_0[340] = { + 0x47,0x58,0x50,0x00,0x01,0x05,0x10,0x03,0x51,0x01,0x00,0x00,0xb1,0xcf,0x41,0xdf, + 0x8a,0x6b,0xd3,0x79,0x05,0x08,0x18,0x00,0x01,0x00,0x00,0x00,0x10,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xe4,0x00,0x00,0x00,0x70,0x00,0x00,0x00, + 0x04,0x00,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x05,0x00,0x00,0x00, + 0x9c,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x8c,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x00,0x00,0x00,0x00,0x3d,0x03,0x00, + 0x00,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00, + 0x01,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x04,0x01,0x00,0x01,0x00,0x04,0x00,0x00,0x00, + 0x01,0xf9,0x00,0x00,0x01,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x30,0x00,0x00,0x00, + 0x40,0x80,0x24,0xa0,0x82,0x41,0x84,0x08,0x41,0x80,0x54,0xa0,0x8a,0x41,0xc0,0x08, + 0x00,0x00,0x00,0x00,0x40,0x01,0x04,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x07,0x44,0xfa,0x00,0x00,0x00,0x00,0x40,0x09,0x00,0xf8,0x02,0x80,0x99,0xff, + 0xbc,0x0d,0xc0,0x40,0x02,0x80,0xb9,0xaf,0xbc,0x0d,0x80,0x40,0x7c,0x0f,0x04,0x00, + 0x86,0x47,0xa4,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x00, + 0x94,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00, + 0x02,0x04,0x01,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x03, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x65,0x78,0x31, + 0x00,0x00,0x00,0x00, +}; + +static unsigned char pshader_basic_1[356] = { + 0x47,0x58,0x50,0x00,0x01,0x05,0x10,0x03,0x61,0x01,0x00,0x00,0x49,0x0b,0xba,0x2a, + 0x3e,0xd8,0x8d,0x62,0x01,0x08,0x18,0x00,0x01,0x00,0x00,0x00,0x10,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xf4,0x00,0x00,0x00,0x70,0x00,0x00,0x00, + 0x04,0x00,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x07,0x00,0x00,0x00, + 0x9c,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x8c,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x00,0x00,0x00,0x00,0x3d,0x03,0x00, + 0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x00,0x00,0x00, + 0x01,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xa4,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x04,0x01,0x00,0x01,0x00,0x04,0x00,0x00,0x00, + 0x01,0xf9,0x00,0x00,0x01,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x30,0x00,0x00,0x00, + 0x40,0x80,0x24,0xa0,0x82,0x41,0x84,0x08,0x41,0x80,0x54,0xa0,0x8a,0x41,0xc0,0x08, + 0x00,0x00,0x00,0x00,0x40,0x01,0x04,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x07,0x44,0xfa,0x00,0x00,0x00,0x00,0x40,0x09,0x00,0xf8,0x02,0x80,0x99,0xaf, + 0xbc,0x0d,0xc0,0x40,0x3c,0x00,0x04,0xcf,0x84,0x4f,0xa4,0x08,0x02,0x01,0x4d,0xcf, + 0x80,0x8b,0xb1,0x18,0x7c,0x5f,0x04,0x0f,0x84,0x33,0xa4,0x08,0x00,0xbc,0x19,0x20, + 0x7e,0x0d,0x81,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x00, + 0x94,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00, + 0x02,0x04,0x01,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x03, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x65,0x78,0x31, + 0x00,0x00,0x00,0x00, +}; + +static unsigned char pshader_basic_2[324] = { + 0x47,0x58,0x50,0x00,0x01,0x05,0x10,0x03,0x41,0x01,0x00,0x00,0x5c,0xcc,0x1b,0x49, + 0x32,0xab,0x31,0x63,0x05,0x08,0x18,0x00,0x01,0x00,0x00,0x00,0x10,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xd4,0x00,0x00,0x00,0x70,0x00,0x00,0x00, + 0x04,0x00,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x06,0x00,0x00,0x00, + 0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x74,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x00,0x00,0x00,0x00,0x3d,0x03,0x00, + 0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x00,0x00,0x00, + 0x01,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x04,0x01,0x00,0x01,0x00,0x04,0x00,0x00,0x00, + 0x01,0xf9,0x00,0x00,0x01,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x30,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x44,0xfa,0x00,0x00,0x00,0x00, + 0x40,0x09,0x00,0xf8,0x41,0x80,0x36,0x9f,0x88,0x1f,0x85,0x08,0x06,0x82,0xb9,0xff, + 0xbc,0x0d,0xc0,0x40,0x00,0x11,0x11,0xcf,0x80,0x87,0xb1,0x18,0x3c,0x8f,0x2d,0x00, + 0x86,0x47,0xc4,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x00, + 0x94,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00, + 0x02,0x04,0x01,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x03, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x65,0x78,0x31, + 0x00,0x00,0x00,0x00, +}; + +static unsigned char pshader_basic_3[384] = { + 0x47,0x58,0x50,0x00,0x01,0x05,0x10,0x03,0x7e,0x01,0x00,0x00,0xe7,0x9e,0xee,0x87, + 0xbb,0x31,0xff,0xe5,0x05,0x08,0x18,0x00,0x01,0x00,0x00,0x00,0x11,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x70,0x00,0x00,0x00, + 0x08,0x00,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x06,0x00,0x00,0x00, + 0xac,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x9c,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb4,0x00,0x00,0x00,0x00,0x3d,0x03,0x00, + 0x00,0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x00,0x00,0x00, + 0x01,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0xbc,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x04,0x02,0x00,0x02,0x00,0x04,0x00,0x00,0x00, + 0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x30,0x00,0x00,0x00, + 0x01,0xf9,0x00,0x00,0x01,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x30,0x00,0x00,0x00, + 0x40,0x80,0x24,0xa0,0x82,0x41,0x84,0x08,0x41,0x80,0x54,0xa0,0x8a,0x41,0xc0,0x08, + 0x00,0x00,0x00,0x00,0x40,0x01,0x04,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x07,0x44,0xfa,0x00,0x00,0x00,0x00,0x40,0x09,0x00,0xf8,0x06,0x82,0x99,0xaf, + 0xbc,0x0d,0xc0,0x40,0x3c,0x00,0x04,0x8f,0x84,0x4f,0xa4,0x08,0x02,0x80,0xb9,0xff, + 0xbc,0x0d,0x80,0x40,0x3d,0x0f,0x04,0x00,0x86,0x47,0xa4,0x10,0x00,0x00,0x00,0x00, + 0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x30,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x02,0x04,0x01,0x00,0x01,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x02,0x04,0x01,0x00,0x01,0x00,0x00,0x00, + 0x01,0x00,0x00,0x00,0x01,0x03,0x01,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x74,0x65,0x78,0x30,0x00,0x74,0x65,0x78,0x31,0x00,0x00,0x00, +}; + +static unsigned char pshader_basic_4[400] = { + 0x47,0x58,0x50,0x00,0x01,0x05,0x10,0x03,0x8e,0x01,0x00,0x00,0xbd,0xda,0xe1,0x5f, + 0x27,0xe6,0x61,0x9a,0x01,0x08,0x18,0x00,0x01,0x00,0x00,0x00,0x11,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x0c,0x01,0x00,0x00,0x70,0x00,0x00,0x00, + 0x08,0x00,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x00,0x00, + 0xac,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x9c,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc4,0x00,0x00,0x00,0x00,0x3d,0x03,0x00, + 0x00,0x00,0x00,0x00,0xb8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00, + 0x01,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0xcc,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x04,0x02,0x00,0x02,0x00,0x04,0x00,0x00,0x00, + 0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x30,0x00,0x00,0x00, + 0x01,0xf9,0x00,0x00,0x01,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x30,0x00,0x00,0x00, + 0x40,0x80,0x24,0xa0,0x82,0x41,0x84,0x08,0x41,0x80,0x54,0xa0,0x8a,0x41,0xc0,0x08, + 0x00,0x00,0x00,0x00,0x40,0x01,0x04,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x07,0x44,0xfa,0x00,0x00,0x00,0x00,0x40,0x09,0x00,0xf8,0x06,0x82,0x99,0xaf, + 0xbc,0x0d,0xc0,0x40,0x3c,0x00,0x04,0x8f,0x84,0x4f,0xa4,0x08,0x3c,0x00,0x04,0xcf, + 0x84,0x4f,0xa4,0x08,0x02,0x01,0x4d,0xcf,0x80,0x8b,0xb1,0x18,0x7c,0x5f,0x04,0x0f, + 0x84,0x33,0xa4,0x08,0x00,0xbc,0x19,0x20,0x7e,0x0d,0x81,0x40,0x00,0x00,0x00,0x00, + 0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x30,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x02,0x04,0x01,0x00,0x01,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x02,0x04,0x01,0x00,0x01,0x00,0x00,0x00, + 0x01,0x00,0x00,0x00,0x01,0x03,0x01,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x74,0x65,0x78,0x30,0x00,0x74,0x65,0x78,0x31,0x00,0x00,0x00, +}; + +static unsigned char pshader_basic_5[416] = { + 0x47,0x58,0x50,0x00,0x01,0x05,0x10,0x03,0x9e,0x01,0x00,0x00,0x6a,0xe8,0x8d,0x48, + 0xfa,0xd9,0xd7,0xda,0x07,0x08,0x18,0x00,0x01,0x00,0x00,0x00,0x11,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x1c,0x01,0x00,0x00,0x70,0x00,0x00,0x00, + 0x08,0x00,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x0d,0x00,0x00,0x00, + 0x94,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x84,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd4,0x00,0x00,0x00,0x00,0x3d,0x03,0x00, + 0x00,0x00,0x00,0x00,0xc8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xb8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x00,0x00,0x00, + 0x01,0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0xdc,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x04,0x02,0x00,0x02,0x00,0x04,0x00,0x00,0x00, + 0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x30,0x00,0x00,0x00, + 0x01,0xf9,0x00,0x00,0x01,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x30,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x44,0xfa,0x80,0x80,0x03,0x90, + 0x91,0xc2,0x09,0x48,0x04,0x00,0x00,0x00,0x40,0x00,0x00,0xfd,0x81,0x00,0x40,0x80, + 0x0a,0x00,0x80,0x30,0x02,0x00,0x04,0xa0,0x86,0x01,0xa4,0x08,0x42,0x00,0x44,0xa0, + 0x8a,0x00,0xc0,0x08,0x00,0x00,0x00,0x00,0x40,0x09,0x00,0xf8,0x02,0x80,0x99,0xff, + 0xbc,0x0d,0xc0,0x40,0x3c,0x00,0x04,0x8f,0x84,0x4f,0xa4,0x08,0xc1,0x80,0x76,0x9f, + 0x88,0x1f,0x85,0x08,0x06,0x82,0xd9,0xff,0xbc,0x0d,0xc0,0x40,0x3c,0x21,0x11,0x1f, + 0x80,0x87,0xb1,0x18,0x3c,0x8f,0x2d,0x00,0x86,0x47,0xc4,0x10,0x00,0x00,0x00,0x00, + 0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x30,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x02,0x04,0x01,0x00,0x01,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x02,0x04,0x01,0x00,0x01,0x00,0x00,0x00, + 0x01,0x00,0x00,0x00,0x01,0x03,0x01,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x74,0x65,0x78,0x30,0x00,0x74,0x65,0x78,0x31,0x00,0x00,0x00, +}; + +static unsigned char pshader_basic_6[376] = { + 0x47,0x58,0x50,0x00,0x01,0x05,0x10,0x03,0x76,0x01,0x00,0x00,0x48,0xfe,0x0b,0xe9, + 0x54,0x56,0xde,0x04,0x05,0x08,0x18,0x00,0x01,0x00,0x00,0x00,0x11,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0xf4,0x00,0x00,0x00,0x70,0x00,0x00,0x00, + 0x08,0x00,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x05,0x00,0x00,0x00, + 0xac,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x9c,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x00,0x00,0x00,0x00,0x3d,0x03,0x00, + 0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x00,0x00,0x00, + 0x01,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xb4,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x04,0x02,0x00,0x02,0x00,0x04,0x00,0x00,0x00, + 0x01,0xf1,0x00,0x00,0x01,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x30,0x00,0x00,0x00, + 0x00,0xf9,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x30,0x00,0x00,0x00, + 0x40,0x80,0x24,0xa0,0x82,0x41,0x84,0x08,0x41,0x80,0x54,0xa0,0x8a,0x41,0xc0,0x08, + 0x00,0x00,0x00,0x00,0x40,0x01,0x04,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x07,0x44,0xfa,0x00,0x00,0x00,0x00,0x40,0x09,0x00,0xf8,0x03,0x00,0x04,0xef, + 0x84,0x1f,0xa4,0x08,0x02,0x80,0xb9,0xaf,0xbc,0x0d,0x80,0x40,0x3d,0x0f,0x04,0x00, + 0x86,0x47,0xa4,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x00, + 0x94,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00, + 0x02,0x04,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x00,0x00,0x00, + 0x02,0x04,0x01,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x03,0x01,0x03, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x65,0x78,0x30, + 0x00,0x74,0x65,0x78,0x31,0x00,0x00,0x00, +}; + +static unsigned char pshader_basic_7[392] = { + 0x47,0x58,0x50,0x00,0x01,0x05,0x10,0x03,0x86,0x01,0x00,0x00,0x1f,0x4a,0xd5,0xc9, + 0x08,0xc3,0x7b,0x19,0x01,0x08,0x18,0x00,0x01,0x00,0x00,0x00,0x11,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x04,0x01,0x00,0x00,0x70,0x00,0x00,0x00, + 0x08,0x00,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x07,0x00,0x00,0x00, + 0xac,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x9c,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x00,0x00,0x00,0x00,0x3d,0x03,0x00, + 0x00,0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x00,0x00,0x00, + 0x01,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0xc4,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x04,0x02,0x00,0x02,0x00,0x04,0x00,0x00,0x00, + 0x01,0xf1,0x00,0x00,0x01,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x30,0x00,0x00,0x00, + 0x00,0xf9,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x30,0x00,0x00,0x00, + 0x40,0x80,0x24,0xa0,0x82,0x41,0x84,0x08,0x41,0x80,0x54,0xa0,0x8a,0x41,0xc0,0x08, + 0x00,0x00,0x00,0x00,0x40,0x01,0x04,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x07,0x44,0xfa,0x00,0x00,0x00,0x00,0x40,0x09,0x00,0xf8,0x03,0x00,0x04,0xef, + 0x84,0x1f,0xa4,0x08,0x3c,0x00,0x04,0x8f,0x84,0x4f,0xa4,0x08,0x02,0x01,0x4d,0xcf, + 0x80,0x8b,0xb1,0x18,0x7c,0x5f,0x04,0x0f,0x84,0x33,0xa4,0x08,0x00,0xbc,0x19,0x20, + 0x7e,0x0d,0x81,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x00, + 0x94,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00, + 0x02,0x04,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x00,0x00,0x00, + 0x02,0x04,0x01,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x03,0x01,0x03, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x65,0x78,0x30, + 0x00,0x74,0x65,0x78,0x31,0x00,0x00,0x00, +}; + +static unsigned char pshader_basic_8[368] = { + 0x47,0x58,0x50,0x00,0x01,0x05,0x10,0x03,0x6e,0x01,0x00,0x00,0x15,0x2c,0xa8,0x0d, + 0xfc,0x95,0x7c,0xda,0x05,0x08,0x18,0x00,0x01,0x00,0x00,0x00,0x11,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0xec,0x00,0x00,0x00,0x70,0x00,0x00,0x00, + 0x08,0x00,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x07,0x00,0x00,0x00, + 0x94,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x84,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa4,0x00,0x00,0x00,0x00,0x3d,0x03,0x00, + 0x00,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00, + 0x01,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0xac,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x04,0x02,0x00,0x02,0x00,0x04,0x00,0x00,0x00, + 0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x30,0x00,0x00,0x00, + 0x01,0xf9,0x00,0x00,0x01,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x30,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x44,0xfa,0x00,0x00,0x00,0x00, + 0x40,0x09,0x00,0xf8,0x02,0x80,0x99,0xff,0xbc,0x0d,0xc0,0x40,0x43,0x80,0x4d,0x8f, + 0x80,0x88,0xe1,0x18,0x41,0x0f,0x00,0x2f,0x00,0x1c,0x80,0x08,0xbc,0x10,0x04,0xcf, + 0x84,0x47,0xa4,0x08,0x3c,0x8f,0x2d,0x00,0x86,0x47,0xc4,0x10,0x00,0x00,0x00,0x00, + 0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x30,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x02,0x04,0x01,0x00,0x01,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x02,0x04,0x01,0x00,0x01,0x00,0x00,0x00, + 0x01,0x00,0x00,0x00,0x01,0x03,0x01,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x74,0x65,0x78,0x30,0x00,0x74,0x65,0x78,0x31,0x00,0x00,0x00, +}; + +static unsigned char pshader_basic_9[440] = { + 0x47,0x58,0x50,0x00,0x01,0x05,0x10,0x03,0xb6,0x01,0x00,0x00,0xb2,0x8c,0x0d,0xc0, + 0x79,0x78,0x36,0xe0,0x05,0x18,0x18,0x00,0x01,0x00,0x00,0x00,0x12,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x34,0x01,0x00,0x00,0x70,0x00,0x00,0x00, + 0x06,0x00,0x10,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x0c,0x00,0x00,0x00, + 0x9c,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x8c,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd4,0x00,0x00,0x00,0x00,0x3d,0x03,0x00, + 0x00,0x00,0x00,0x00,0xc8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00, + 0x04,0x00,0x00,0x00,0xb8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00, + 0x02,0x00,0x00,0x00,0xb8,0x00,0x00,0x00,0xf4,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x04,0x01,0x00,0x01,0x00,0x04,0x00,0x00,0x00, + 0x01,0x09,0x40,0x0e,0x01,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0x30,0x00,0x00,0x00, + 0x40,0x80,0x24,0xa0,0x82,0x41,0x84,0x08,0x41,0x80,0x54,0xa0,0x8a,0x41,0xc0,0x08, + 0x00,0x00,0x00,0x00,0x40,0x01,0x04,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x07,0x44,0xfa,0x00,0x00,0x00,0x00,0x40,0x09,0x00,0xf8,0x00,0x00,0xf0,0x83, + 0x20,0x0d,0x00,0x38,0x3c,0x42,0x3e,0x0f,0x80,0x88,0x01,0x18,0x01,0x3e,0x80,0x0f, + 0x00,0x02,0x00,0x30,0x03,0x3e,0x00,0x00,0x02,0x00,0x00,0x30,0x00,0x03,0x00,0xe0, + 0x04,0xc4,0x01,0xe0,0x00,0x00,0x00,0x00,0x00,0x08,0x20,0xf9,0x04,0x81,0x99,0xaf, + 0xbc,0x0d,0xc0,0x40,0x3c,0x00,0x04,0x0f,0x84,0x4f,0xa4,0x08,0x02,0x80,0xb9,0xff, + 0xbc,0x0d,0x80,0x40,0x3d,0x0f,0x04,0x00,0x86,0x47,0xa4,0x10,0x00,0x00,0x00,0x00, + 0x01,0x00,0x01,0x00,0x02,0x00,0x02,0x00,0x03,0x00,0x03,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x0c,0x00,0x13,0x00,0x00,0x00,0x0c,0x00,0x04,0x00,0x00,0x00,0x00,0x00, + 0x94,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00, + 0x02,0x04,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x00,0x00,0x00, + 0x02,0x04,0x01,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x03,0x01,0x03, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x65,0x78,0x30, + 0x00,0x74,0x65,0x78,0x31,0x00,0x00,0x00, +}; + +static unsigned char pshader_basic_10[456] = { + 0x47,0x58,0x50,0x00,0x01,0x05,0x10,0x03,0xc6,0x01,0x00,0x00,0x88,0xc8,0xca,0xdb, + 0xe6,0x2c,0x49,0x11,0x01,0x18,0x18,0x00,0x01,0x00,0x00,0x00,0x12,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x44,0x01,0x00,0x00,0x70,0x00,0x00,0x00, + 0x06,0x00,0x10,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x0e,0x00,0x00,0x00, + 0x9c,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x8c,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe4,0x00,0x00,0x00,0x00,0x3d,0x03,0x00, + 0x00,0x00,0x00,0x00,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00, + 0x04,0x00,0x00,0x00,0xc8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x00,0x00,0x00, + 0x02,0x00,0x00,0x00,0xc8,0x00,0x00,0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x04,0x01,0x00,0x01,0x00,0x04,0x00,0x00,0x00, + 0x01,0x09,0x40,0x0e,0x01,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0x30,0x00,0x00,0x00, + 0x40,0x80,0x24,0xa0,0x82,0x41,0x84,0x08,0x41,0x80,0x54,0xa0,0x8a,0x41,0xc0,0x08, + 0x00,0x00,0x00,0x00,0x40,0x01,0x04,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x07,0x44,0xfa,0x00,0x00,0x00,0x00,0x40,0x09,0x00,0xf8,0x00,0x00,0xf0,0x83, + 0x20,0x0d,0x00,0x38,0x3c,0x42,0x3e,0x0f,0x80,0x88,0x01,0x18,0x01,0x3e,0x80,0x0f, + 0x00,0x02,0x00,0x30,0x03,0x3e,0x00,0x00,0x02,0x00,0x00,0x30,0x00,0x03,0x00,0xe0, + 0x04,0xc4,0x01,0xe0,0x00,0x00,0x00,0x00,0x00,0x08,0x20,0xf9,0x04,0x81,0x99,0xaf, + 0xbc,0x0d,0xc0,0x40,0x3c,0x00,0x04,0x0f,0x84,0x4f,0xa4,0x08,0x3c,0x00,0x04,0xcf, + 0x84,0x4f,0xa4,0x08,0x02,0x01,0x4d,0xcf,0x80,0x8b,0xb1,0x18,0x7c,0x5f,0x04,0x0f, + 0x84,0x33,0xa4,0x08,0x00,0xbc,0x19,0x20,0x7e,0x0d,0x81,0x40,0x00,0x00,0x00,0x00, + 0x01,0x00,0x01,0x00,0x02,0x00,0x02,0x00,0x03,0x00,0x03,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x0c,0x00,0x13,0x00,0x00,0x00,0x0c,0x00,0x04,0x00,0x00,0x00,0x00,0x00, + 0x94,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00, + 0x02,0x04,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x00,0x00,0x00, + 0x02,0x04,0x01,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x03,0x01,0x03, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x65,0x78,0x30, + 0x00,0x74,0x65,0x78,0x31,0x00,0x00,0x00, +}; + +static unsigned char pshader_basic_11[480] = { + 0x47,0x58,0x50,0x00,0x01,0x05,0x10,0x03,0xde,0x01,0x00,0x00,0x47,0xd0,0x44,0x86, + 0xb9,0x20,0xfa,0x25,0x07,0x18,0x18,0x00,0x01,0x00,0x00,0x00,0x12,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x5c,0x01,0x00,0x00,0x70,0x00,0x00,0x00, + 0x06,0x00,0x10,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x14,0x00,0x00,0x00, + 0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x74,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x3d,0x03,0x00, + 0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x01,0x00,0x00, + 0x04,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x00,0x00,0x00, + 0x02,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x1c,0x01,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x04,0x01,0x00,0x01,0x00,0x04,0x00,0x00,0x00, + 0x01,0x09,0x40,0x0e,0x01,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0x30,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x44,0xfa,0x00,0x00,0x00,0x00, + 0x40,0x09,0x00,0xf8,0x00,0x00,0xf0,0x83,0x20,0x0d,0x00,0x38,0x3c,0x42,0x3e,0x0f, + 0x80,0x88,0x01,0x18,0x01,0x3e,0x80,0x0f,0x00,0x02,0x00,0x30,0x03,0x3e,0x00,0x00, + 0x02,0x00,0x10,0x30,0x00,0x03,0x00,0xe0,0x04,0xc4,0x01,0xe0,0x00,0x00,0x00,0x00, + 0x00,0x00,0x20,0xf9,0x80,0x80,0x03,0x10,0x91,0xc2,0x09,0x48,0x04,0x00,0x00,0x00, + 0x40,0x00,0x00,0xfd,0x81,0x00,0x00,0x00,0x0a,0x00,0x80,0x30,0x00,0x00,0x04,0x20, + 0x84,0x01,0xa4,0x08,0x40,0x00,0x44,0x20,0x88,0x00,0xc0,0x08,0x00,0x00,0x00,0x00, + 0x40,0x09,0x00,0xf8,0x02,0x80,0x99,0xff,0xbc,0x0d,0xc0,0x40,0x3c,0x00,0x04,0x0f, + 0x84,0x4f,0xa4,0x08,0x81,0x80,0x76,0x9f,0x88,0x1f,0x85,0x08,0x06,0x82,0xd9,0xff, + 0xbc,0x0d,0xc0,0x40,0x3c,0x21,0x11,0x1f,0x80,0x87,0xb1,0x18,0x3c,0x8f,0x2d,0x00, + 0x86,0x47,0xc4,0x10,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x02,0x00,0x02,0x00, + 0x03,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x00,0x13,0x00,0x00,0x00, + 0x0c,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x30,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x02,0x04,0x01,0x00,0x01,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x02,0x04,0x01,0x00,0x01,0x00,0x00,0x00, + 0x01,0x00,0x00,0x00,0x01,0x03,0x01,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x74,0x65,0x78,0x30,0x00,0x74,0x65,0x78,0x31,0x00,0x00,0x00, +}; + +static unsigned char pshader_basic_12[464] = { + 0x47,0x58,0x50,0x00,0x01,0x05,0x10,0x03,0xce,0x01,0x00,0x00,0x5e,0x9f,0x65,0x75, + 0x57,0x52,0xaa,0xe4,0x05,0x18,0x18,0x00,0x01,0x00,0x00,0x00,0x12,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x4c,0x01,0x00,0x00,0x70,0x00,0x00,0x00, + 0x06,0x00,0x10,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x0f,0x00,0x00,0x00, + 0x9c,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x8c,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xec,0x00,0x00,0x00,0x00,0x3d,0x03,0x00, + 0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00, + 0x04,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x00,0x00,0x00, + 0x02,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0x0c,0x01,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x04,0x01,0x00,0x01,0x00,0x04,0x00,0x00,0x00, + 0x01,0x09,0x40,0x0e,0x01,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0x30,0x00,0x00,0x00, + 0x40,0x80,0x24,0xa0,0x82,0x41,0x84,0x08,0x41,0x80,0x54,0xa0,0x8a,0x41,0xc0,0x08, + 0x00,0x00,0x00,0x00,0x40,0x01,0x04,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x07,0x44,0xfa,0x04,0x10,0x00,0xb0,0x82,0x08,0x00,0x08,0x00,0x00,0x00,0xaf, + 0x80,0x00,0x00,0x08,0x3c,0x00,0x14,0x80,0x06,0x01,0x00,0x00,0x00,0x81,0x28,0xe0, + 0x84,0x49,0x24,0x08,0x00,0x00,0x00,0x0f,0x80,0x28,0x00,0x00,0x01,0x3e,0x80,0x0f, + 0x00,0x0a,0x00,0x30,0x01,0x3e,0x80,0x0f,0x00,0x00,0x00,0x30,0x3c,0x01,0x10,0xc0, + 0xa6,0x01,0x00,0x00,0x00,0x03,0x00,0xe0,0x04,0xc4,0x01,0xe0,0x00,0x00,0x00,0x00, + 0x00,0x08,0x20,0xf9,0x04,0x81,0x99,0xaf,0xbc,0x0d,0xc0,0x40,0x3c,0x00,0x04,0x0f, + 0x84,0x4f,0xa4,0x08,0x02,0x80,0xb9,0xff,0xbc,0x0d,0x80,0x40,0x3d,0x0f,0x04,0x00, + 0x86,0x47,0xa4,0x10,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x02,0x00,0x02,0x00, + 0x03,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x00,0x13,0x00,0x00,0x00, + 0x0c,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x30,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x02,0x04,0x01,0x00,0x01,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x02,0x04,0x01,0x00,0x01,0x00,0x00,0x00, + 0x01,0x00,0x00,0x00,0x01,0x03,0x01,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x74,0x65,0x78,0x30,0x00,0x74,0x65,0x78,0x31,0x00,0x00,0x00, +}; + +static unsigned char pshader_basic_13[480] = { + 0x47,0x58,0x50,0x00,0x01,0x05,0x10,0x03,0xde,0x01,0x00,0x00,0x34,0xdb,0x2b,0x2d, + 0x0b,0xbf,0x65,0xd1,0x01,0x18,0x18,0x00,0x01,0x00,0x00,0x00,0x12,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x5c,0x01,0x00,0x00,0x70,0x00,0x00,0x00, + 0x06,0x00,0x10,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x11,0x00,0x00,0x00, + 0x9c,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x8c,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x3d,0x03,0x00, + 0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x01,0x00,0x00, + 0x04,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x00,0x00,0x00, + 0x02,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x1c,0x01,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x04,0x01,0x00,0x01,0x00,0x04,0x00,0x00,0x00, + 0x01,0x09,0x40,0x0e,0x01,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0x30,0x00,0x00,0x00, + 0x40,0x80,0x24,0xa0,0x82,0x41,0x84,0x08,0x41,0x80,0x54,0xa0,0x8a,0x41,0xc0,0x08, + 0x00,0x00,0x00,0x00,0x40,0x01,0x04,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x07,0x44,0xfa,0x04,0x10,0x00,0xb0,0x82,0x08,0x00,0x08,0x00,0x00,0x00,0xaf, + 0x80,0x00,0x00,0x08,0x3c,0x00,0x14,0x80,0x06,0x01,0x00,0x00,0x00,0x81,0x28,0xe0, + 0x84,0x49,0x24,0x08,0x00,0x00,0x00,0x0f,0x80,0x28,0x00,0x00,0x01,0x3e,0x80,0x0f, + 0x00,0x0a,0x00,0x30,0x01,0x3e,0x80,0x0f,0x00,0x00,0x00,0x30,0x3c,0x01,0x10,0xc0, + 0xa6,0x01,0x00,0x00,0x00,0x03,0x00,0xe0,0x04,0xc4,0x01,0xe0,0x00,0x00,0x00,0x00, + 0x00,0x08,0x20,0xf9,0x04,0x81,0x99,0xaf,0xbc,0x0d,0xc0,0x40,0x3c,0x00,0x04,0x0f, + 0x84,0x4f,0xa4,0x08,0x3c,0x00,0x04,0xcf,0x84,0x4f,0xa4,0x08,0x02,0x01,0x4d,0xcf, + 0x80,0x8b,0xb1,0x18,0x7c,0x5f,0x04,0x0f,0x84,0x33,0xa4,0x08,0x00,0xbc,0x19,0x20, + 0x7e,0x0d,0x81,0x40,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x02,0x00,0x02,0x00, + 0x03,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x00,0x13,0x00,0x00,0x00, + 0x0c,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x30,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x02,0x04,0x01,0x00,0x01,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x02,0x04,0x01,0x00,0x01,0x00,0x00,0x00, + 0x01,0x00,0x00,0x00,0x01,0x03,0x01,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x74,0x65,0x78,0x30,0x00,0x74,0x65,0x78,0x31,0x00,0x00,0x00, +}; + +static unsigned char pshader_basic_14[504] = { + 0x47,0x58,0x50,0x00,0x01,0x05,0x10,0x03,0xf6,0x01,0x00,0x00,0x7b,0x93,0xc6,0xae, + 0xff,0x91,0x70,0x86,0x07,0x18,0x18,0x00,0x01,0x00,0x00,0x00,0x12,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x74,0x01,0x00,0x00,0x70,0x00,0x00,0x00, + 0x06,0x00,0x10,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x17,0x00,0x00,0x00, + 0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x74,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x01,0x00,0x00,0x00,0x3d,0x03,0x00, + 0x00,0x00,0x00,0x00,0x08,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x01,0x00,0x00, + 0x04,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00, + 0x02,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x34,0x01,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x04,0x01,0x00,0x01,0x00,0x04,0x00,0x00,0x00, + 0x01,0x09,0x40,0x0e,0x01,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0x30,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x44,0xfa,0x04,0x10,0x00,0xb0, + 0x82,0x08,0x00,0x08,0x00,0x00,0x00,0xaf,0x80,0x00,0x00,0x08,0x3c,0x00,0x14,0x80, + 0x06,0x01,0x00,0x00,0x00,0x81,0x68,0xe0,0x86,0x49,0x24,0x08,0x41,0x10,0x00,0xaf, + 0x84,0x28,0x00,0x00,0x01,0x3e,0x80,0x0f,0x00,0x0a,0x00,0x30,0x01,0x3e,0x80,0x0f, + 0x00,0x00,0x00,0x30,0x3c,0x01,0x10,0xc0,0xa6,0x01,0x10,0x00,0x00,0x03,0x00,0xe0, + 0x04,0xc4,0x01,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xf9,0x80,0x80,0x03,0x10, + 0x91,0xc2,0x09,0x48,0x04,0x00,0x00,0x00,0x40,0x00,0x00,0xfd,0x81,0x00,0x00,0x00, + 0x0a,0x00,0x80,0x30,0x00,0x00,0x04,0x20,0x84,0x01,0xa4,0x08,0x40,0x00,0x44,0x20, + 0x88,0x00,0xc0,0x08,0x00,0x00,0x00,0x00,0x40,0x09,0x00,0xf8,0x02,0x80,0x99,0xff, + 0xbc,0x0d,0xc0,0x40,0x3c,0x00,0x04,0x0f,0x84,0x4f,0xa4,0x08,0x81,0x80,0x76,0x9f, + 0x88,0x1f,0x85,0x08,0x06,0x82,0xd9,0xff,0xbc,0x0d,0xc0,0x40,0x3c,0x21,0x11,0x1f, + 0x80,0x87,0xb1,0x18,0x3c,0x8f,0x2d,0x00,0x86,0x47,0xc4,0x10,0x00,0x00,0x00,0x00, + 0x01,0x00,0x01,0x00,0x02,0x00,0x02,0x00,0x03,0x00,0x03,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x0c,0x00,0x13,0x00,0x00,0x00,0x0c,0x00,0x04,0x00,0x00,0x00,0x00,0x00, + 0x94,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00, + 0x02,0x04,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x00,0x00,0x00, + 0x02,0x04,0x01,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x03,0x01,0x03, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x65,0x78,0x30, + 0x00,0x74,0x65,0x78,0x31,0x00,0x00,0x00, +}; + +static unsigned char pshader_basic_15[436] = { + 0x47,0x58,0x50,0x00,0x01,0x05,0x10,0x03,0xb2,0x01,0x00,0x00,0xa4,0x49,0x85,0x88, + 0x51,0xb7,0x36,0xb2,0x09,0x08,0x18,0x00,0x01,0x00,0x00,0x00,0x11,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x30,0x01,0x00,0x00,0x70,0x00,0x00,0x00, + 0x08,0x00,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0a,0x00,0x00,0x00, + 0xb0,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x9c,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x3d,0x03,0x00, + 0x01,0x00,0x00,0x00,0xcc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xc4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x00,0x00,0x00, + 0x02,0x00,0x00,0x00,0xb4,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x04,0x02,0x00,0x02,0x00,0x04,0x00,0x00,0x00, + 0x01,0xf1,0x00,0x00,0x01,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x30,0x00,0x00,0x00, + 0x00,0xf9,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x30,0x00,0x00,0x00, + 0x40,0x80,0x24,0xa0,0x82,0x41,0x84,0x08,0x41,0x80,0x54,0xa0,0x8a,0x41,0xc0,0x08, + 0x00,0x00,0x00,0x00,0x40,0x01,0x04,0xf8,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x01,0x44,0xfa,0x00,0x00,0x00,0x00,0x40,0x09,0x00,0xf8, + 0x03,0x00,0x04,0xef,0x84,0x1f,0xa4,0x08,0x00,0x81,0x11,0x80,0x82,0x81,0xe1,0x18, + 0x7c,0x00,0x44,0x80,0x8a,0xb1,0xc0,0x08,0x8c,0x80,0x03,0x90,0x15,0xc9,0x89,0x48, + 0x0c,0x06,0x00,0xf0,0x06,0x04,0x30,0xf9,0x00,0x00,0x00,0x00,0x40,0x01,0x04,0xf8, + 0x00,0x00,0x00,0x00,0x00,0x07,0x44,0xfa,0x02,0x80,0x19,0xa0,0x7e,0x0d,0x80,0x40, + 0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x00, + 0x13,0x00,0x00,0x00,0x0c,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x94,0x00,0x00,0x00, + 0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x02,0x04,0x01,0x00, + 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x02,0x04,0x01,0x00, + 0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x03,0x01,0x03,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x65,0x78,0x30,0x00,0x74,0x65,0x78, + 0x31,0x00,0x00,0x00, +}; + +static unsigned char pshader_basic_16[468] = { + 0x47,0x58,0x50,0x00,0x01,0x05,0x10,0x03,0xd2,0x01,0x00,0x00,0x4a,0xa5,0x50,0x5f, + 0x06,0x24,0xb9,0x90,0x09,0x08,0x18,0x00,0x01,0x00,0x00,0x00,0x11,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x50,0x01,0x00,0x00,0x70,0x00,0x00,0x00, + 0x08,0x00,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0e,0x00,0x00,0x00, + 0xb0,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x9c,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x3d,0x03,0x00, + 0x01,0x00,0x00,0x00,0xec,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xe4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x00,0x00,0x00, + 0x02,0x00,0x00,0x00,0xd4,0x00,0x00,0x00,0x10,0x01,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x04,0x02,0x00,0x02,0x00,0x04,0x00,0x00,0x00, + 0x01,0xf1,0x00,0x00,0x01,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x30,0x00,0x00,0x00, + 0x00,0xf9,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x30,0x00,0x00,0x00, + 0x40,0x80,0x24,0xa0,0x82,0x41,0x84,0x08,0x41,0x80,0x54,0xa0,0x8a,0x41,0xc0,0x08, + 0x00,0x00,0x00,0x00,0x40,0x01,0x04,0xf8,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x01,0x44,0xfa,0x00,0x00,0x00,0x00,0x40,0x09,0x00,0xf8, + 0x03,0x00,0x04,0xef,0x84,0x1f,0xa4,0x08,0x00,0x81,0x11,0x80,0x82,0x81,0xe1,0x18, + 0x7c,0x00,0x44,0x80,0x8a,0xb1,0xc0,0x08,0x8c,0x80,0x03,0x90,0x15,0xc9,0x89,0x48, + 0x0c,0x06,0x00,0xf0,0x06,0x04,0x30,0xf9,0x00,0x00,0x00,0x00,0x40,0x01,0x04,0xf8, + 0x00,0x00,0x00,0x00,0x00,0x07,0x44,0xfa,0x00,0x00,0x00,0x00,0x40,0x09,0x00,0xf8, + 0x02,0x80,0x99,0xaf,0xbc,0x0d,0xc0,0x40,0x02,0x01,0x4d,0xcf,0x80,0x8b,0xb1,0x18, + 0x7c,0x5f,0x04,0x0f,0x84,0x33,0xa4,0x08,0x00,0xbc,0x19,0x20,0x7e,0x0d,0x81,0x40, + 0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x00, + 0x13,0x00,0x00,0x00,0x0c,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x94,0x00,0x00,0x00, + 0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x02,0x04,0x01,0x00, + 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x02,0x04,0x01,0x00, + 0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x03,0x01,0x03,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x65,0x78,0x30,0x00,0x74,0x65,0x78, + 0x31,0x00,0x00,0x00, +}; + +static unsigned char pshader_basic_17[436] = { + 0x47,0x58,0x50,0x00,0x01,0x05,0x10,0x03,0xb2,0x01,0x00,0x00,0xcc,0xea,0x40,0x96, + 0xf9,0xf6,0xb3,0x74,0x09,0x08,0x18,0x00,0x01,0x00,0x00,0x00,0x11,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x30,0x01,0x00,0x00,0x70,0x00,0x00,0x00, + 0x08,0x00,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0d,0x00,0x00,0x00, + 0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x84,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x3d,0x03,0x00, + 0x01,0x00,0x00,0x00,0xcc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xc4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x00,0x00,0x00, + 0x02,0x00,0x00,0x00,0xb4,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x04,0x02,0x00,0x02,0x00,0x04,0x00,0x00,0x00, + 0x00,0xf1,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x30,0x00,0x00,0x00, + 0x01,0xf9,0x00,0x00,0x01,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x30,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x44,0xfa, + 0x43,0x80,0x24,0xe0,0x82,0x10,0x84,0x08,0x00,0x01,0x40,0xe0,0x0a,0x00,0x81,0x50, + 0x01,0x00,0x41,0xa0,0x02,0x11,0x80,0x08,0x80,0x10,0x04,0xf0,0x86,0x41,0xa4,0x08, + 0xc1,0x10,0x64,0xe0,0x82,0x41,0x84,0x08,0x8c,0x80,0x03,0x90,0x15,0xc9,0x89,0x48, + 0x0c,0x06,0x00,0xf0,0x06,0x04,0x30,0xf9,0x00,0x00,0x00,0x00,0x40,0x01,0x04,0xf8, + 0x00,0x00,0x00,0x00,0x00,0x07,0x44,0xfa,0x01,0x00,0x04,0xa0,0x86,0x11,0xa4,0x08, + 0x41,0x00,0x44,0xa0,0x8a,0x10,0xc0,0x08,0x02,0x80,0x19,0xa0,0x7e,0x0d,0x80,0x40, + 0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x00, + 0x13,0x00,0x00,0x00,0x0c,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x94,0x00,0x00,0x00, + 0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x02,0x04,0x01,0x00, + 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x02,0x04,0x01,0x00, + 0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x03,0x01,0x03,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x65,0x78,0x30,0x00,0x74,0x65,0x78, + 0x31,0x00,0x00,0x00, +}; + +static ShaderCode pshader_basic_arr[18] = { + { pshader_basic_0, { NULL } }, + { pshader_basic_1, { NULL } }, + { pshader_basic_2, { NULL } }, + { pshader_basic_3, { NULL } }, + { pshader_basic_4, { NULL } }, + { pshader_basic_5, { NULL } }, + { pshader_basic_6, { NULL } }, + { pshader_basic_7, { NULL } }, + { pshader_basic_8, { NULL } }, + { pshader_basic_9, { NULL } }, + { pshader_basic_10, { NULL } }, + { pshader_basic_11, { NULL } }, + { pshader_basic_12, { NULL } }, + { pshader_basic_13, { NULL } }, + { pshader_basic_14, { NULL } }, + { pshader_basic_15, { NULL } }, + { pshader_basic_16, { NULL } }, + { pshader_basic_17, { NULL } }, +}; + +static unsigned char pshader_manual_clear_0[220] = { + 0x47,0x58,0x50,0x00,0x01,0x05,0x10,0x03,0xdc,0x00,0x00,0x00,0xe1,0x66,0xdd,0xe7, + 0x28,0x0f,0xc4,0xfd,0x01,0x00,0x18,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xa4,0x00,0x00,0x00,0x70,0x00,0x00,0x00, + 0x02,0x00,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x00,0x00, + 0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x64,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x00,0x3d,0x03,0x00, + 0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00, + 0x01,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x44,0xfa,0x02,0x80,0x19,0xf0, + 0x7e,0x0d,0x80,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x00, + 0x94,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +}; + +static ShaderCode pshader_manual_clear_arr[1] = { + { pshader_manual_clear_0, { NULL } }, +}; + +static unsigned char vshader_vspsp2_0[360] = { + 0x47,0x58,0x50,0x00,0x01,0x05,0x10,0x03,0x66,0x01,0x00,0x00,0x7a,0x09,0xc6,0xf5, + 0xbc,0x09,0x6e,0xf4,0x00,0x00,0x19,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x18,0x01,0x00,0x00,0x70,0x00,0x00,0x00, + 0x02,0x00,0x18,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x0d,0x00,0x00,0x00, + 0x90,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x74,0x00,0x00,0x00,0x80,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x3d,0x03,0x00, + 0x00,0x00,0x00,0x00,0xc4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc4,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xb4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x00,0x00,0x00, + 0x01,0x00,0x00,0x00,0xa4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x08, + 0x09,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x14,0x91, + 0x8a,0x11,0xc1,0x08,0x00,0x00,0x00,0x00,0x40,0x01,0x04,0xf8,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x07,0x44,0xfa,0x00,0x01,0x04,0xc3,0x21,0x0d,0x80,0x38, + 0x02,0x80,0x99,0xff,0xbc,0x0d,0x80,0x40,0x00,0xc2,0x12,0x80,0x80,0x88,0x91,0x18, + 0x06,0x82,0x99,0xff,0xbc,0x0d,0x80,0x40,0x00,0xc2,0x12,0x80,0x00,0x81,0x91,0x18, + 0x8b,0x02,0x00,0xf0,0x81,0x99,0xa0,0x00,0x0e,0x86,0x99,0xff,0xbc,0x0d,0x80,0x40, + 0x00,0xc2,0x92,0x80,0x81,0x88,0x91,0x18,0x12,0x88,0x99,0xff,0xbc,0x0d,0x80,0x40, + 0x00,0xc2,0x92,0x80,0x01,0x81,0x91,0x18,0x80,0x00,0x0c,0x43,0x21,0x05,0x82,0x38, + 0x00,0x00,0x20,0xa0,0x00,0x50,0x27,0xfb,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00, + 0x20,0x00,0x00,0x00,0x30,0x01,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x76,0x64,0x61,0x74,0x61,0x00,0x00,0x00, +}; + +static unsigned char vshader_vspsp2_1[584] = { + 0x47,0x58,0x50,0x00,0x01,0x05,0x10,0x03,0x46,0x02,0x00,0x00,0x4e,0x78,0x52,0xa2, + 0xf0,0x4e,0xd4,0x64,0x04,0x00,0x19,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xf8,0x01,0x00,0x00,0x70,0x00,0x00,0x00, + 0x04,0x00,0x1e,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x1f,0x00,0x00,0x00, + 0xc8,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x74,0x00,0x00,0x00,0xb8,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x01,0x00,0x00,0x00,0x3d,0x03,0x00, + 0x02,0x00,0x00,0x00,0x8c,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xa4,0x01,0x00,0x00, + 0x00,0x00,0x00,0x00,0x8c,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x84,0x01,0x00,0x00, + 0x02,0x00,0x00,0x00,0x7c,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x08, + 0x09,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x40,0x09,0x00,0xf8,0x02,0x80,0x81,0xaf,0x9c,0x0d,0xc0,0x40,0x44,0x46,0xbe,0x83, + 0x82,0x88,0x81,0x18,0x80,0x00,0xf4,0x83,0x20,0x0d,0x80,0x38,0x44,0x46,0xbe,0x93, + 0x02,0x89,0x81,0x18,0x04,0x44,0x7e,0x83,0x82,0x90,0x80,0x18,0x01,0x0f,0x55,0x11, + 0x82,0x11,0x81,0x08,0x01,0x03,0x14,0x91,0x82,0x11,0x81,0x08,0x00,0x00,0x00,0x00, + 0x40,0x01,0x04,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x44,0xfa, + 0x00,0x01,0xc0,0xa0,0x85,0x09,0x81,0x40,0x01,0x01,0x40,0xa0,0x86,0x09,0x81,0x40, + 0x80,0x01,0x60,0xa0,0x86,0x09,0xc1,0x40,0x4c,0x00,0x44,0xbf,0x84,0x19,0xa4,0x08, + 0x3d,0x42,0x3e,0x1f,0x80,0x88,0x81,0x18,0x40,0x0f,0x00,0x03,0x20,0x0d,0x80,0x38, + 0x00,0x0f,0xf8,0x0f,0x00,0x0d,0x80,0x38,0x02,0x80,0x99,0xff,0xbc,0x0d,0xc0,0x40, + 0x00,0xc2,0x12,0x8f,0x80,0x88,0x91,0x18,0x06,0x82,0xb9,0xff,0xbc,0x0d,0xc0,0x40, + 0x00,0xc2,0x12,0x9f,0x00,0x89,0x91,0x18,0x40,0x01,0xf0,0xcc,0x40,0x0d,0x80,0x38, + 0x00,0xbf,0x03,0x10,0x81,0x82,0xc9,0x48,0x40,0x03,0x44,0xc0,0x86,0x09,0xa4,0x08, + 0x81,0x03,0x44,0xef,0x80,0x99,0x80,0x00,0x3d,0x42,0x7e,0x10,0x82,0x88,0x81,0x18, + 0xfd,0x08,0x1c,0x10,0x01,0x54,0x84,0x20,0x81,0x13,0x34,0x90,0x02,0x35,0xc0,0x28, + 0x81,0x00,0x20,0x80,0x02,0x0a,0x80,0x30,0x3c,0x10,0x40,0x4f,0x84,0x99,0x80,0x01, + 0x7c,0xef,0xf3,0x0f,0xa0,0x4d,0x80,0x38,0x8b,0xc2,0x03,0xff,0x80,0x99,0xa0,0x00, + 0x00,0x0f,0x00,0x03,0x21,0x05,0x80,0x38,0x00,0x0f,0x04,0x03,0x59,0x0d,0x80,0x38, + 0x0e,0x86,0x99,0xff,0xbc,0x0d,0x80,0x40,0x00,0xc2,0x92,0x80,0x81,0x88,0x91,0x18, + 0x12,0x88,0x99,0xff,0xbc,0x0d,0x80,0x40,0x00,0xc2,0x92,0x80,0x01,0x81,0x91,0x18, + 0xc4,0x00,0xd0,0x70,0x85,0x41,0xa4,0x08,0x00,0x00,0x20,0xa0,0x00,0x50,0x27,0xfb, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x01,0x00,0x00,0x00,0x00,0x00,0x80,0x3c, + 0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x13,0x00,0x00,0x00,0x18,0x00,0x02,0x00, + 0x20,0x00,0x00,0x00,0x30,0x01,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x76,0x64,0x61,0x74,0x61,0x00,0x00,0x00, +}; + +static unsigned char vshader_vspsp2_2[336] = { + 0x47,0x58,0x50,0x00,0x01,0x05,0x10,0x03,0x4e,0x01,0x00,0x00,0xa9,0x68,0x75,0x9f, + 0xa5,0xeb,0x06,0xda,0x00,0x00,0x19,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x70,0x00,0x00,0x00, + 0x04,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x00,0x00, + 0x90,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x74,0x00,0x00,0x00,0x80,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x00,0x00,0x00,0x00,0x3d,0x03,0x00, + 0x00,0x00,0x00,0x00,0xac,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x9c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x00,0x00,0x00, + 0x01,0x00,0x00,0x00,0x8c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x08, + 0x09,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x14,0x91, + 0x8a,0x11,0xc1,0x08,0x00,0x00,0x00,0x00,0x40,0x01,0x04,0xf8,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x07,0x44,0xfa,0x40,0x00,0x08,0x83,0x21,0x0d,0x80,0x38, + 0x02,0x80,0x99,0xff,0xbc,0x0d,0x80,0x40,0x00,0xc2,0x52,0x80,0x82,0x88,0x91,0x18, + 0x06,0x82,0x99,0xff,0xbc,0x0d,0x80,0x40,0x00,0xc2,0x52,0x80,0x02,0x81,0x91,0x18, + 0x00,0x01,0x04,0xc3,0x21,0x05,0x80,0x38,0x8b,0x12,0x00,0xf0,0x85,0x91,0xa0,0x00, + 0x80,0x00,0x0c,0x43,0x21,0x05,0x82,0x38,0x00,0x00,0x20,0xa0,0x00,0x50,0x27,0xfb, + 0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x20,0x00,0x00,0x00,0x30,0x01,0x00,0x00, + 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x00,0x00,0x00, + 0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x64,0x61,0x74,0x61,0x00,0x00,0x00, +}; + +static ShaderCode vshader_vspsp2_arr[3] = { + { vshader_vspsp2_0, { NULL } }, + { vshader_vspsp2_1, { NULL } }, + { vshader_vspsp2_2, { NULL } }, +}; + +static unsigned char vshader_vspsp2_mask_0[304] = { + 0x47,0x58,0x50,0x00,0x01,0x05,0x10,0x03,0x30,0x01,0x00,0x00,0x5d,0x89,0x60,0xf7, + 0x7b,0x8f,0xec,0x47,0x04,0x00,0x1b,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x70,0x00,0x00,0x00, + 0x01,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x0b,0x00,0x00,0x00, + 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x00,0x00,0x00,0x70,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0x00,0x3d,0x03,0x00, + 0x00,0x00,0x00,0x00,0xa4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa4,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x00,0x00,0x00, + 0x01,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x04, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x07,0x44,0xfa,0x02,0x00,0x00,0xa0,0x05,0x00,0x81,0x68, + 0x80,0x01,0x20,0x90,0x02,0x00,0xca,0x50,0x80,0x01,0x80,0xaf,0x00,0x00,0xc2,0x50, + 0x00,0x32,0xa0,0x2f,0x08,0x00,0xc3,0x50,0x00,0x3e,0x20,0x20,0x0a,0x00,0xc9,0x50, + 0x00,0x30,0x00,0x20,0x09,0x00,0x83,0x50,0x80,0x3e,0x20,0x20,0x09,0x00,0x81,0x50, + 0x40,0x80,0x24,0x50,0x81,0x41,0x86,0x08,0x01,0x80,0x56,0x90,0x81,0x11,0x83,0x08, + 0x00,0x00,0x20,0xa0,0x00,0x50,0x27,0xfb,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00, + 0x00,0x00,0x00,0x00,0x94,0x00,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +}; + +static ShaderCode vshader_vspsp2_mask_arr[1] = { + { vshader_vspsp2_mask_0, { NULL } }, +}; + diff --git a/Minecraft.Client/PSVita/Iggy/gdraw/gdraw_shared.inl b/Minecraft.Client/PSVita/Iggy/gdraw/gdraw_shared.inl new file mode 100644 index 00000000..4fae9c12 --- /dev/null +++ b/Minecraft.Client/PSVita/Iggy/gdraw/gdraw_shared.inl @@ -0,0 +1,2599 @@ +// gdraw_shared.inl - author: Sean Barrett - copyright 2010 RAD Game Tools +// +// This file implements some common code that can be shared across +// all the sample implementations of GDraw. + +#ifdef IGGY_DISABLE_GDRAW_ASSERT +#define assert(x) +#else +#include +#endif + +#ifndef GDRAW_MAYBE_UNUSED +#define GDRAW_MAYBE_UNUSED +#endif + +/////////////////////////////////////////////////////////////// +// +// GDrawHandleCache manages resource "handles" used by Iggy +// (i.e. these handles wrap the platform resource handles, +// and this file provides those wrappers and facilities for +// LRU tracking them). Moreover, for console platforms, we +// actually implement our own managed resource pools. +// +// This is the main state machine when GDRAW_MANAGE_MEM is defined: +// (which covers all console platforms) +// +// +------+ +--------+ | +// | Live |<------->| Locked | | +// +------+ +--------+ | +// / \ ^ | +// / \ \ | +// v v \ | +// +------+ +------+ +------+ | | +// | Dead |--->| Free |<---| User | | | +// +------+ +------+ +------+ | | +// ^ ^ ^ ^ | | +// \ / \ | | | +// \ / v | | | +// +--------+ +-------+ / | +// | Pinned |<--------| Alloc |/ | +// +--------+ +-------+ | +// +// "Free" handles are not in use and available for allocation. +// "Alloc" handles have been assigned by GDraw, but do not yet +// have a system resource backing them. Resources stay in +// this state until we know that for sure that we're going +// to be able to successfully complete creation, at which +// point the resource transitions to one of the regular states. +// "Live" handles correspond to resources that may be used +// for rendering. They are kept in LRU order. Old resources +// may be evicted to make space. +// "Locked" handles cover resources that are going to be used +// in the next draw command. Once a resource is marked locked, +// it may not be evicted until it's back to "Live". +// "Dead" handles describe resources that have been freed on the +// CPU side, but are still in use by the GPU. Their memory may +// only be reclaimed once the GPU is done with them, at which +// point they are moved to the "Free" list. Items on the "Dead" +// list appear ordered by the last time they were used by the +// GPU - "most stale" first. +// "Pinned" resources can be used in any draw call without getting +// locked first. They can never be LRU-freed, but their memory +// is still managed by GDraw. Currently this is only used for +// the Iggy font cache. +// "User" (user-owned) resources are exactly that. They act much like +// pinned resources, but their memory isn't managed by GDraw. +// When a user-owned resource is freed, we really need to free +// it immediately (instead of marking it as "dead"), which might +// necessitate stalling the CPU until the GPU is finished using +// that resource. Since we don't own the memory, delayed frees +// are not an option. +// +// Without GDRAW_MANAGE_MEM, there's no "Dead" resources, and all +// frees are performed immediately. + +typedef struct GDrawHandleCache GDrawHandleCache; +typedef struct GDrawHandle GDrawHandle; + +typedef struct +{ + U64 value; +} GDrawFence; + +typedef enum +{ + GDRAW_HANDLE_STATE_free = 0, + GDRAW_HANDLE_STATE_live, + GDRAW_HANDLE_STATE_locked, + GDRAW_HANDLE_STATE_dead, + GDRAW_HANDLE_STATE_pinned, + GDRAW_HANDLE_STATE_user_owned, + GDRAW_HANDLE_STATE_alloc, + GDRAW_HANDLE_STATE__count, + + // not an actual state! + GDRAW_HANDLE_STATE_sentinel = GDRAW_HANDLE_STATE__count, +} GDrawHandleState; + +struct GDrawHandle +{ + GDrawNativeHandle handle; // platform handle to a resource (variable size) + void * owner; // 4/8 // opaque handle used to allow freeing resources without calling back to owner + + GDrawHandleCache * cache; // 4/8 // which cache this handle came from + + GDrawHandle * next,*prev; // 8/16 // doubly-linked list + + #ifdef GDRAW_MANAGE_MEM + void * raw_ptr; // 4/8 // pointer to allocation - when you're managing memory manually + #ifdef GDRAW_CORRUPTION_CHECK + U32 cached_raw_value[4]; + rrbool has_check_value; + #endif + #endif + + GDrawFence fence; // 8 // (optional) platform fence for resource + // 4 + U32 bytes:28; // estimated storage cost to allow setting a loose limit + U32 state:4; // state the handle is in +}; + +// validate alignment to make sure structure will pack correctly +#ifdef __RAD64__ +RR_COMPILER_ASSERT((sizeof(GDrawHandle) & 7) == 0); +#else +RR_COMPILER_ASSERT((sizeof(GDrawHandle) & 3) == 0); +#endif + +struct GDrawHandleCache +{ + S32 bytes_free; + S32 total_bytes; + S32 max_handles; + U32 is_vertex : 1; // vertex buffers have different warning codes and generate discard callbacks + U32 is_thrashing : 1; + U32 did_defragment : 1; + // 30 unused bits + GDrawHandle state[GDRAW_HANDLE_STATE__count]; // sentinel nodes for all of the state lists + #ifdef GDRAW_MANAGE_MEM + struct gfx_allocator *alloc; + #endif + #ifdef GDRAW_MANAGE_MEM_TWOPOOL + struct gfx_allocator *alloc_other; + #endif + GDrawFence prev_frame_start, prev_frame_end; // fence value at start/end of previous frame, for thrashing detection + GDrawHandle handle[1]; // the rest of the handles must be stored right after this in the containing structure +}; + +#ifdef GDRAW_CORRUPTION_CHECK +// values for corruption checking +#define GDRAW_CORRUPTIONCHECK_renderbegin 0x10 +#define GDRAW_CORRUPTIONCHECK_renderend 0x20 +#define GDRAW_CORRUPTIONCHECK_nomoregdraw 0x30 +#define GDRAW_CORRUPTIONCHECK_maketexbegin 0x40 +#define GDRAW_CORRUPTIONCHECK_maketexend 0x50 + +#define GDRAW_CORRUPTIONCHECK_wrappedcreateend 0x60 +#define GDRAW_CORRUPTIONCHECK_wrappedcreatebegin 0x61 +#define GDRAW_CORRUPTIONCHECK_wrappeddestroyend 0x70 +#define GDRAW_CORRUPTIONCHECK_wrappeddestroybegin 0x71 + +#define GDRAW_CORRUPTIONCHECK_allochandle 0x80 +#define GDRAW_CORRUPTIONCHECK_allochandle_begin 0x81 +#define GDRAW_CORRUPTIONCHECK_allochandle_postreap 0x82 +#define GDRAW_CORRUPTIONCHECK_allochandle_postfree1 0x83 +#define GDRAW_CORRUPTIONCHECK_allochandle_postfree2 0x84 +#define GDRAW_CORRUPTIONCHECK_allochandle_postfree3 0x85 +#define GDRAW_CORRUPTIONCHECK_allochandle_postalloc1 0x86 +#define GDRAW_CORRUPTIONCHECK_allochandle_postalloc2 0x87 +#define GDRAW_CORRUPTIONCHECK_allochandle_postalloc3 0x88 +#define GDRAW_CORRUPTIONCHECK_allochandle_defrag 0x89 + +#define GDRAW_CORRUPTIONCHECK_freetex 0x90 + +static U32 *debug_raw_address(GDrawHandle *t, int choice) +{ + static int offset_table[4] = { 0x555555, 0xaaaaaa, 0x333333, 0x6e6e6e }; + U8 *base = (U8 *) t->raw_ptr; + int offset = offset_table[choice] & (t->bytes-1) & ~3; + return (U32 *) (base + offset); +} + +static void debug_check_overlap_one(GDrawHandle *t, U8 *ptr, S32 len) +{ + assert(len >= 0); + if (t->raw_ptr && t->raw_ptr != ptr) { + assert(t->raw_ptr < ptr || t->raw_ptr >= ptr+len); + } +} + +static void debug_check_overlap(GDrawHandleCache *c, U8 *ptr, S32 len) +{ + GDrawHandle *t = c->head; + while (t) { + debug_check_overlap_one(t, ptr, len); + t = t->next; + } + t = c->active; + while (t) { + debug_check_overlap_one(t, ptr, len); + t = t->next; + } +} + +static void debug_check_raw_values(GDrawHandleCache *c) +{ + GDrawHandle *t = c->head; + while (t) { + if (t->raw_ptr && t->has_check_value) { + int i; + for (i=0; i < 4; ++i) { + if (*debug_raw_address(t, i) != t->cached_raw_value[i]) { + //zlog("!Iggy texture corruption found\n"); + //zlog("t=%p, t->raw_ptr=%p\n", t, t->raw_ptr); + //zlog("Cached values: %08x %08x %08x %08x\n", t->cached_raw_value[0], t->cached_raw_value[1], t->cached_raw_value[2], t->cached_raw_value[3]); + //zlog("Current values: %08x %08x %08x %08x\n", *debug_raw_address(t,0), *debug_raw_address(t,1), *debug_raw_address(t,2), *debug_raw_address(t,3)); + assert(0); + } + } + #if 0 + GDrawHandle *s; + check_block_alloc(c->alloc, t->raw_ptr, 1); + s = c->head; + while (s != t) { + assert(s->raw_ptr != t->raw_ptr); + s = s->next; + } + s = c->active; + while (s != NULL) { + assert(s->raw_ptr != t->raw_ptr); + s = s->next; + } + #endif + } + t = t->next; + } + t = c->active; + while (t) { + if (t->raw_ptr && t->has_check_value) { + int i; + for (i=0; i < 4; ++i) { + if (*debug_raw_address(t, i) != t->cached_raw_value[i]) { + //zlog("!Iggy texture corruption found\n"); + //zlog("t=%p, t->raw_ptr=%p\n", t, t->raw_ptr); + //zlog("Cached values: %08x %08x %08x %08x\n", t->cached_raw_value[0], t->cached_raw_value[1], t->cached_raw_value[2], t->cached_raw_value[3]); + //zlog("Current values: %08x %08x %08x %08x\n", *debug_raw_address(t,0), *debug_raw_address(t,1), *debug_raw_address(t,2), *debug_raw_address(t,3)); + assert(0); + } + } + #if 0 + GDrawHandle *s; + check_block_alloc(c->alloc, t->raw_ptr, 1); + s = c->active; + while (s != t) { + assert(s->raw_ptr != t->raw_ptr); + s = s->next; + } + #endif + } + t = t->next; + } +} + +#ifndef GDRAW_CORRUPTION_MASK +#define GDRAW_CORRUPTION_MASK 0 +#endif +#define debug_check_raw_values_if(c,v) \ + if ((GDRAW_CORRUPTION_CHECK & ~GDRAW_CORRUPTION_MASK) == ((v) & ~GDRAW_CORRUPTION_MASK)) \ + debug_check_raw_values(c); \ + else + +static void debug_set_raw_value(GDrawHandle *t) +{ + if (t->raw_ptr) { + int i; + for (i=0; i < 4; ++i) + t->cached_raw_value[i] = *debug_raw_address(t, i); + t->has_check_value = true; + } +} + +static void debug_unset_raw_value(GDrawHandle *t) +{ + t->has_check_value = false; +} + +static void debug_check_value_is_unreferenced(GDrawHandleCache *c, void *ptr) +{ + GDrawHandle *t = c->head; + while (t) { + assert(t->raw_ptr != ptr); + t = t->next; + } + t = c->active; + while (t) { + assert(t->raw_ptr != ptr); + t = t->next; + } +} + +#else + +#define debug_check_overlap(c,p,len) +#define debug_set_raw_value(t) +#define debug_check_value_is_unreferenced(c,p) +#define debug_unset_raw_value(t) +#define debug_check_raw_values(c) +#define debug_check_raw_values_if(c,v) +#endif + +#ifdef SUPERDEBUG +static void check_lists(GDrawHandleCache *c) +{ + GDrawHandle *sentinel, *t; + U32 state; + + // for all lists, verify that they are consistent and + // properly linked + for (state = 0; state < GDRAW_HANDLE_STATE__count; state++) { + S32 count = 0; + sentinel = &c->state[state]; + + assert(!sentinel->cache); + assert(sentinel->state == GDRAW_HANDLE_STATE_sentinel); + for (t = sentinel->next; t != sentinel; t = t->next) { + count++; + assert(t->cache == c); + assert(t->state == state); + assert(t->prev->next == t); + assert(t->next->prev == t); + assert(count < 50000); + } + } + + // for dead list, additionally verify that it's in the right + // order (namely, sorted by ascending fence index) + sentinel = &c->state[GDRAW_HANDLE_STATE_dead]; + for (t = sentinel->next; t != sentinel; t = t->next) { + assert(t->prev == sentinel || t->fence.value >= t->prev->fence.value); + } +} + +#include + +static const char *gdraw_StateName(U32 state) +{ + switch (state) { + case GDRAW_HANDLE_STATE_free: return "free"; + case GDRAW_HANDLE_STATE_live: return "live"; + case GDRAW_HANDLE_STATE_locked: return "locked"; + case GDRAW_HANDLE_STATE_dead: return "dead"; + case GDRAW_HANDLE_STATE_pinned: return "pinned"; + case GDRAW_HANDLE_STATE_user_owned: return "user-owned"; + case GDRAW_HANDLE_STATE_alloc: return "alloc"; + case GDRAW_HANDLE_STATE_sentinel: return ""; + default: return "???"; + } +} + +#else +static RADINLINE void check_lists(GDrawHandleCache *c) +{ + RR_UNUSED_VARIABLE(c); +} +#endif + +static void gdraw_HandleTransitionInsertBefore(GDrawHandle *t, GDrawHandleState new_state, GDrawHandle *succ) +{ + check_lists(t->cache); + assert(t->state != GDRAW_HANDLE_STATE_sentinel); // sentinels should never get here! + assert(t->state != (U32) new_state); // code should never call "transition" if it's not transitioning! + // unlink from prev state + t->prev->next = t->next; + t->next->prev = t->prev; + // add to list for new state + t->next = succ; + t->prev = succ->prev; + t->prev->next = t; + t->next->prev = t; +#ifdef SUPERDEBUG + printf("GD %chandle %p %s->%s\n", t->cache->is_vertex ? 'v' : 't', t, gdraw_StateName(t->state), gdraw_StateName(new_state)); +#endif + t->state = new_state; + check_lists(t->cache); +} + +static RADINLINE void gdraw_HandleTransitionTo(GDrawHandle *t, GDrawHandleState new_state) +{ + gdraw_HandleTransitionInsertBefore(t, new_state, &t->cache->state[new_state]); +} + +#ifdef GDRAW_MANAGE_MEM_TWOPOOL +static rrbool gdraw_MigrateResource(GDrawHandle *t, GDrawStats *stats); +static void gdraw_res_free(GDrawHandle *t, GDrawStats *stats); +#endif + +static rrbool gdraw_HandleCacheLockStats(GDrawHandle *t, void *owner, GDrawStats *stats) +{ + RR_UNUSED_VARIABLE(stats); + + // if the GPU memory is owned by the user, then we never spontaneously + // free it, and we can always report true. moreover, Iggy doesn't bother + // keeping 'owner' consistent in this case, so we must check this before + // verifying t->owner. + if (t->state == GDRAW_HANDLE_STATE_user_owned) + return true; + + // if t->owner has changed, then Iggy is trying to lock an old version + // of this handle from before (the handle has already been recycled to + // point to a new resource) + if (t->owner != owner) + return false; + + // otherwise, it's a valid resource and we should lock it until the next + // unlock call + assert(t->state == GDRAW_HANDLE_STATE_live || t->state == GDRAW_HANDLE_STATE_locked || t->state == GDRAW_HANDLE_STATE_pinned); + if (t->state == GDRAW_HANDLE_STATE_live) { +#ifdef GDRAW_MANAGE_MEM_TWOPOOL + // if we defragmented this frame, we can't just make resources live; + // we need to migrate them to their new location. (which might fail + // if we don't have enough memory left in the new pool) + if (t->cache->did_defragment) { + if (!gdraw_MigrateResource(t, stats)) { + gdraw_res_free(t, stats); + return false; + } + } +#endif + gdraw_HandleTransitionTo(t, GDRAW_HANDLE_STATE_locked); + } + return true; +} + +static rrbool gdraw_HandleCacheLock(GDrawHandle *t, void *owner) +{ + return gdraw_HandleCacheLockStats(t, owner, NULL); +} + +static void gdraw_HandleCacheUnlock(GDrawHandle *t) +{ + assert(t->state == GDRAW_HANDLE_STATE_locked || t->state == GDRAW_HANDLE_STATE_pinned || t->state == GDRAW_HANDLE_STATE_user_owned); + if (t->state == GDRAW_HANDLE_STATE_locked) + gdraw_HandleTransitionTo(t, GDRAW_HANDLE_STATE_live); +} + +static void gdraw_HandleCacheUnlockAll(GDrawHandleCache *c) +{ + GDrawHandle *sentinel = &c->state[GDRAW_HANDLE_STATE_locked]; + while (sentinel->next != sentinel) + gdraw_HandleTransitionTo(sentinel->next, GDRAW_HANDLE_STATE_live); +} + +static void gdraw_HandleCacheInit(GDrawHandleCache *c, S32 num_handles, S32 bytes) +{ + S32 i; + assert(num_handles > 0); + c->max_handles = num_handles; + c->total_bytes = bytes; + c->bytes_free = c->total_bytes; + c->is_vertex = false; + c->is_thrashing = false; + c->did_defragment = false; + for (i=0; i < GDRAW_HANDLE_STATE__count; i++) { + c->state[i].owner = NULL; + c->state[i].cache = NULL; // should never follow cache link from sentinels! + c->state[i].next = c->state[i].prev = &c->state[i]; +#ifdef GDRAW_MANAGE_MEM + c->state[i].raw_ptr = NULL; +#endif + c->state[i].fence.value = 0; + c->state[i].bytes = 0; + c->state[i].state = GDRAW_HANDLE_STATE_sentinel; + } + for (i=0; i < num_handles; ++i) { + c->handle[i].cache = c; + c->handle[i].prev = (i == 0) ? &c->state[GDRAW_HANDLE_STATE_free] : &c->handle[i-1]; + c->handle[i].next = (i == num_handles - 1) ? &c->state[GDRAW_HANDLE_STATE_free] : &c->handle[i+1]; + c->handle[i].bytes = 0; + c->handle[i].state = GDRAW_HANDLE_STATE_free; +#ifdef GDRAW_MANAGE_MEM + c->handle[i].raw_ptr = NULL; +#endif + } + c->state[GDRAW_HANDLE_STATE_free].next = &c->handle[0]; + c->state[GDRAW_HANDLE_STATE_free].prev = &c->handle[num_handles - 1]; + c->prev_frame_start.value = 0; + c->prev_frame_end.value = 0; +#ifdef GDRAW_MANAGE_MEM + c->alloc = NULL; +#endif +#ifdef GDRAW_MANAGE_MEM_TWOPOOL + c->alloc_other = NULL; +#endif + check_lists(c); +} + +static GDrawHandle *gdraw_HandleCacheAllocateBegin(GDrawHandleCache *c) +{ + GDrawHandle *free_list = &c->state[GDRAW_HANDLE_STATE_free]; + GDrawHandle *t = NULL; + if (free_list->next != free_list) { + t = free_list->next; + gdraw_HandleTransitionTo(t, GDRAW_HANDLE_STATE_alloc); + t->bytes = 0; + t->owner = 0; +#ifdef GDRAW_MANAGE_MEM + t->raw_ptr = NULL; +#endif +#ifdef GDRAW_CORRUPTION_CHECK + t->has_check_value = false; +#endif + } + return t; +} + +static void gdraw_HandleCacheAllocateEnd(GDrawHandle *t, S32 bytes, void *owner, GDrawHandleState new_state) +{ + assert(t->cache); + assert(t->bytes == 0); + assert(t->owner == 0); + assert(t->state == GDRAW_HANDLE_STATE_alloc); + if (bytes == 0) + { + assert(new_state == GDRAW_HANDLE_STATE_user_owned); + } + else + { + assert(new_state == GDRAW_HANDLE_STATE_locked || new_state == GDRAW_HANDLE_STATE_pinned); + } + t->bytes = bytes; + t->owner = owner; + t->cache->bytes_free -= bytes; + + gdraw_HandleTransitionTo(t, new_state); +} + +static void gdraw_HandleCacheFree(GDrawHandle *t) +{ + GDrawHandleCache *c = t->cache; + assert(t->state != GDRAW_HANDLE_STATE_alloc && t->state != GDRAW_HANDLE_STATE_sentinel); + c->bytes_free += t->bytes; + t->bytes = 0; + t->owner = 0; +#ifdef GDRAW_MANAGE_MEM + t->raw_ptr = 0; +#endif +#ifdef GDRAW_CORRUPTION_CHECK + t->has_check_value = false; +#endif + gdraw_HandleTransitionTo(t, GDRAW_HANDLE_STATE_free); +} + +static void gdraw_HandleCacheAllocateFail(GDrawHandle *t) +{ + assert(t->state == GDRAW_HANDLE_STATE_alloc); + gdraw_HandleTransitionTo(t, GDRAW_HANDLE_STATE_free); +} + +static GDrawHandle *gdraw_HandleCacheGetLRU(GDrawHandleCache *c) +{ + // TransitionTo always inserts at the end, which means that the resources + // at the front of the LRU list are the oldest ones, since in-use resources + // will get appended on every transition from "locked" to "live". + GDrawHandle *sentinel = &c->state[GDRAW_HANDLE_STATE_live]; + return (sentinel->next != sentinel) ? sentinel->next : NULL; +} + +static void gdraw_HandleCacheTick(GDrawHandleCache *c, GDrawFence now) +{ + c->prev_frame_start = c->prev_frame_end; + c->prev_frame_end = now; + + // reset these flags every frame + c->is_thrashing = false; + c->did_defragment = false; +} + +#ifdef GDRAW_MANAGE_MEM + +static void gdraw_HandleCacheInsertDead(GDrawHandle *t) +{ + GDrawHandle *s, *sentinel; + + assert(t->state == GDRAW_HANDLE_STATE_live || t->state == GDRAW_HANDLE_STATE_locked || t->state == GDRAW_HANDLE_STATE_pinned); + + // figure out where t belongs in the dead list in "chronological order" + // do this by finding its (chronological) successor s + sentinel = &t->cache->state[GDRAW_HANDLE_STATE_dead]; + s = sentinel->next; + while (s != sentinel && s->fence.value <= t->fence.value) + s = s->next; + + // and then insert it there + gdraw_HandleTransitionInsertBefore(t, GDRAW_HANDLE_STATE_dead, s); +} + +#endif + +//////////////////////////////////////////////////////////////////////// +// +// Set transformation matrices +// + +// Our vertex shaders use this convention: +// world: our world matrices always look like this +// m00 m01 0 t0 +// m10 m11 0 t1 +// 0 0 0 d +// 0 0 0 1 +// +// we just store the first two rows and insert d +// in the first row, third column. our input position vectors are +// always (x,y,0,1) or (x,y,0,0), so we can still just use dp4 to +// compute final x/y. after that it's a single move to set the +// correct depth value. +// +// viewproj: our view-projection matrix is always just a 2D scale+translate, +// i.e. the matrix looks like this: +// +// p[0] 0 0 p[2] +// 0 p[1] 0 p[3] +// 0 0 1 0 +// 0 0 0 1 +// +// just store (p[0],p[1],p[2],p[3]) in a 4-component vector and the projection +// transform is a single multiply-add. +// +// The output is volatile since it's often in Write-Combined memory where we +// really don't want compiler reordering. + +static RADINLINE void gdraw_PixelSpace(volatile F32 * RADRESTRICT vvec) +{ + // 1:1 pixel mapping - just identity since our "view space" is pixels + vvec[0] = 1.0f; vvec[1] = 0.0f; vvec[2] = 0.0f; vvec[3] = 0.0f; + vvec[4] = 0.0f; vvec[5] = 1.0f; vvec[6] = 0.0f; vvec[7] = 0.0f; +} + +static RADINLINE void gdraw_WorldSpace(volatile F32 * RADRESTRICT vvec, F32 * RADRESTRICT world_to_pixel, F32 depth, F32 misc) +{ + // World->pixel space transform is just a scale + vvec[0] = world_to_pixel[0]; vvec[1] = 0.0f; vvec[2] = depth; vvec[3] = 0.0f; + vvec[4] = 0.0f; vvec[5] = world_to_pixel[1]; vvec[6] = misc; vvec[7] = 0.0f; +} + +static RADINLINE void gdraw_ObjectSpace(volatile F32 * RADRESTRICT vvec, gswf_matrix * RADRESTRICT xform, F32 depth, F32 misc) +{ + // Object->pixel transform is a 2D homogeneous matrix transform + F32 m00 = xform->m00; + F32 m01 = xform->m01; + F32 m10 = xform->m10; + F32 m11 = xform->m11; + F32 trans0 = xform->trans[0]; + F32 trans1 = xform->trans[1]; + + vvec[0] = m00; vvec[1] = m01; vvec[2] = depth; vvec[3] = trans0; + vvec[4] = m10; vvec[5] = m11; vvec[6] = misc; vvec[7] = trans1; +} + +static void gdraw_GetObjectSpaceMatrix(F32 * RADRESTRICT mat, gswf_matrix * RADRESTRICT xform, F32 * RADRESTRICT proj, F32 depth, int out_col_major) +{ + int row = out_col_major ? 1 : 4; + int col = out_col_major ? 4 : 1; + + F32 xs = proj[0]; + F32 ys = proj[1]; + + mat[0*row+0*col] = xform->m00 * xs; + mat[0*row+1*col] = xform->m01 * xs; + mat[0*row+2*col] = 0.0f; + mat[0*row+3*col] = xform->trans[0] * xs + proj[2]; + + mat[1*row+0*col] = xform->m10 * ys; + mat[1*row+1*col] = xform->m11 * ys; + mat[1*row+2*col] = 0.0f; + mat[1*row+3*col] = xform->trans[1] * ys + proj[3]; + + mat[2*row+0*col] = 0.0f; + mat[2*row+1*col] = 0.0f; + mat[2*row+2*col] = 0.0f; + mat[2*row+3*col] = depth; + + mat[3*row+0*col] = 0.0f; + mat[3*row+1*col] = 0.0f; + mat[3*row+2*col] = 0.0f; + mat[3*row+3*col] = 1.0f; +} + + +//////////////////////////////////////////////////////////////////////// +// +// Blurs +// +// symmetrically expand a rectangle by ex/ey pixels on both sides, then clamp to tile bounds +static void gdraw_ExpandRect(gswf_recti *out, gswf_recti const *in, S32 ex, S32 ey, S32 w, S32 h) +{ + out->x0 = RR_MAX(in->x0 - ex, 0); + out->y0 = RR_MAX(in->y0 - ey, 0); + out->x1 = RR_MIN(in->x1 + ex, w); + out->y1 = RR_MIN(in->y1 + ey, h); +} + +static void gdraw_ShiftRect(gswf_recti *out, gswf_recti const *in, S32 dx, S32 dy) +{ + out->x0 = in->x0 + dx; + out->y0 = in->y0 + dy; + out->x1 = in->x1 + dx; + out->y1 = in->y1 + dy; +} + +#define MAX_TAPS 9 // max # of bilinear samples in one 'convolution' step + +enum +{ + // basic shader family + VAR_tex0 = 0, + VAR_tex1, + VAR_cmul, + VAR_cadd, + VAR_focal, + + // filter family + VAR_filter_tex0 = 0, + VAR_filter_tex1, + VAR_filter_color, + VAR_filter_tc_off, + VAR_filter_tex2, + VAR_filter_clamp0, + VAR_filter_clamp1, + VAR_filter_color2, + MAX_VARS, + + // blur family + VAR_blur_tex0 = 0, + VAR_blur_tap, + VAR_blur_clampv, + + // color matrix family + VAR_colormatrix_tex0 = 0, + VAR_colormatrix_data, + + // ihud family + VAR_ihudv_worldview = 0, + VAR_ihudv_material, + VAR_ihudv_textmode, +}; + +typedef struct +{ + S32 w,h, frametex_width, frametex_height; + void (*BlurPass)(GDrawRenderState *r, int taps, float *data, gswf_recti *s, float *tc, float height_max, float *clampv, GDrawStats *gstats); +} GDrawBlurInfo; + +static GDrawTexture *gdraw_BlurPass(GDrawFunctions *g, GDrawBlurInfo *c, GDrawRenderState *r, int taps, float *data, gswf_recti *draw_bounds, gswf_recti *sample_bounds, GDrawStats *gstats) +{ + F32 tc[4]; + F32 clamp[4]; + F32 t=0; + F32 texel_scale_s = 1.0f / c->frametex_width; + F32 texel_scale_t = 1.0f / c->frametex_height; + S32 i; + for (i=0; i < taps; ++i) + t += data[4*i+2]; + assert(t >= 0.99f && t <= 1.01f); + + tc[0] = texel_scale_s * draw_bounds->x0; + tc[1] = texel_scale_t * draw_bounds->y0; + tc[2] = texel_scale_s * draw_bounds->x1; + tc[3] = texel_scale_t * draw_bounds->y1; + + // sample_bounds is (x0,y0) inclusive, (x1,y1) exclusive + // texel centers are offset by 0.5 from integer coordinates and we don't want to sample outside sample_bounds + clamp[0] = texel_scale_s * (sample_bounds->x0 + 0.5f); + clamp[1] = texel_scale_t * (sample_bounds->y0 + 0.5f); + clamp[2] = texel_scale_s * (sample_bounds->x1 - 0.5f); + clamp[3] = texel_scale_t * (sample_bounds->y1 - 0.5f); + + if (!g->TextureDrawBufferBegin(draw_bounds, GDRAW_TEXTURE_FORMAT_rgba32, GDRAW_TEXTUREDRAWBUFFER_FLAGS_needs_color | GDRAW_TEXTUREDRAWBUFFER_FLAGS_needs_alpha, 0, gstats)) + return r->tex[0]; + + c->BlurPass(r, taps, data, draw_bounds, tc, (F32) c->h / c->frametex_height, clamp, gstats); + return g->TextureDrawBufferEnd(gstats); +} + +static GDrawTexture *gdraw_BlurPassDownsample(GDrawFunctions *g, GDrawBlurInfo *c, GDrawRenderState *r, int taps, float *data, gswf_recti *draw_bounds, int axis, int divisor, int tex_w, int tex_h, gswf_recti *sample_bounds, GDrawStats *gstats) +{ + S32 i; + F32 t=0; + F32 tc[4]; + F32 clamp[4]; + F32 texel_scale_s = 1.0f / tex_w; + F32 texel_scale_t = 1.0f / tex_h; + gswf_recti z; + + for (i=0; i < taps; ++i) + t += data[4*i+2]; + assert(t >= 0.99f && t <= 1.01f); + + // following must be integer divides! + if (axis == 0) { + z.x0 = draw_bounds->x0 / divisor; + z.x1 = (draw_bounds->x1-1) / divisor + 1; + z.y0 = draw_bounds->y0; + z.y1 = draw_bounds->y1; + + tc[0] = ((z.x0 - 0.5f)*divisor+0.5f)*texel_scale_s; + tc[2] = ((z.x1 - 0.5f)*divisor+0.5f)*texel_scale_s; + tc[1] = z.y0*texel_scale_t; + tc[3] = z.y1*texel_scale_t; + } else { + z.x0 = draw_bounds->x0; + z.x1 = draw_bounds->x1; + z.y0 = draw_bounds->y0 / divisor; + z.y1 = (draw_bounds->y1-1) / divisor + 1; + + tc[0] = z.x0*texel_scale_s; + tc[2] = z.x1*texel_scale_s; + tc[1] = ((z.y0 - 0.5f)*divisor+0.5f)*texel_scale_t; + tc[3] = ((z.y1 - 0.5f)*divisor+0.5f)*texel_scale_t; + } + + if (!g->TextureDrawBufferBegin(&z, GDRAW_TEXTURE_FORMAT_rgba32, GDRAW_TEXTUREDRAWBUFFER_FLAGS_needs_color | GDRAW_TEXTUREDRAWBUFFER_FLAGS_needs_alpha, 0, gstats)) + return r->tex[0]; + + clamp[0] = texel_scale_s * (sample_bounds->x0 + 0.5f); + clamp[1] = texel_scale_t * (sample_bounds->y0 + 0.5f); + clamp[2] = texel_scale_s * (sample_bounds->x1 - 0.5f); + clamp[3] = texel_scale_t * (sample_bounds->y1 - 0.5f); + + assert(clamp[0] <= clamp[2]); + assert(clamp[1] <= clamp[3]); + + c->BlurPass(r, taps, data, &z, tc, (F32) c->h / c->frametex_height, clamp, gstats); + return g->TextureDrawBufferEnd(gstats); +} + +#define unmap(t,a,b) (((t)-(a))/(F32) ((b)-(a))) +#define linear_remap(t,a,b,c,d) ((c) + unmap(t,a,b)*((d)-(c))) + +static void gdraw_BlurAxis(S32 axis, GDrawFunctions *g, GDrawBlurInfo *c, GDrawRenderState *r, F32 blur_width, F32 texel, gswf_recti *draw_bounds, gswf_recti *sample_bounds, GDrawTexture *protect, GDrawStats *gstats) +{ + GDrawTexture *t; + F32 data[MAX_TAPS][4]; + S32 off_axis = 1-axis; + S32 w = ((S32) ceil((blur_width-1)/2))*2+1; // 1.2 => 3, 2.8 => 3, 3.2 => 5 + F32 edge_weight = 1 - (w - blur_width)/2; // 3 => 0 => 1; 1.2 => 1.8 => 0.9 => 0.1 + F32 inverse_weight = 1.0f / blur_width; + + w = ((w-1) >> 1) + 1; // 3 => 2, 5 => 3, 7 => 4 (number of texture samples) + + if (!r->tex[0]) + return; + + // horizontal filter + if (w > 1) { + if (w <= MAX_TAPS) { + // we have enough taps to just do it + // use 'w' taps + S32 i, expand; + + // just go through and place all the taps in the right place + + // if w is 2 (sample from -1,0,1) + // 0 => -0.5 + // 1 => 1 + + // if w is 3: + // 0 => -1.5 samples from -2,-1 + // 1 => 0.5 samples from 0,1 + // 2 => 2 samples from 2 + + // if w is 4: + // 0 => -2.5 samples from -3,-2 + // 1 => -0.5 samples from -1,0 + // 2 => 1.5 samples from 1,2 + // 3 => 3 samples from 3 + + for (i=0; i < w; ++i) { + // first texsample samples from -w+1 and -w+2, e.g. w=2 => -1,0,1 + data[i][axis] = (-w+1.5f + i*2)*texel; + data[i][off_axis] = 0; + data[i][2] = 2*inverse_weight; // 2 full-weight samples + data[i][3] = 0; + } + // now reweight the last one + data[i-1][axis] = (w-1)*texel; + data[i-1][2] = edge_weight*inverse_weight; + // now reweight the first one + // (ew*0 + 1*1)/(1+ew) = 1/(1+ew) + data[0][axis] = (-w + 1.0f + 1/(edge_weight+1)) * texel; + data[0][2] = (edge_weight+1)*inverse_weight; + + expand = w-1; + gdraw_ExpandRect(draw_bounds, draw_bounds, axis ? 0 : expand, axis ? expand : 0, c->w, c->h); + + t = gdraw_BlurPass(g, c, r, w, data[0], draw_bounds, sample_bounds, gstats); + if (r->tex[0] != protect && r->tex[0] != t) + g->FreeTexture(r->tex[0], 0, gstats); + r->tex[0] = t; + gdraw_ExpandRect(sample_bounds, draw_bounds, 1, 1, c->w, c->h); // for next pass + } else { + // @OPTIMIZE: for symmetrical blurs we can get a 2-wide blur in the *off* axis at the same + // time we get N-wide in the on axis, which could double our max width + S32 i, expand; + // @HACK: this is really a dumb way to do it, i kind of had a brain fart, you could get + // the exact same result by just doing the downsample the naive way and then the + // final sample uses texture samples spaced by a texel rather than spaced by two + // texels -- the current method is just as inefficient, it just puts the inefficiency + // in the way the downsampled texture is self-overlapping, so the downsampled texture + // is twice as larger as it should be. + + // we COULD be exact by generating a mipmap, then sampling some number of samples + // from the mipmap and some from the original, but that would require being polyphase. + // instead we just are approximate. the mipmap weights the edge pixels by one half + // and overlaps them by one sample, so then in phase two we sample N slightly-overlapping + // mipmap samples + // + // instead we do the following. + // divide the source data up into clusters that are K samples long. + // ...K0... ...K1... ...K2... ...K3... + // + // Suppose K[i] is the average of all the items in cluster i. + // + // We compute a downsampled texture where T[i] = K[i] + K[i+1]. + // + // Now, we sample N taps from adjacent elements of T, allowing the texture unit + // to bilerp. Suppose a given sample falls at coordinate i with sub-position p. + // Then tap #j will compute: + // T[i+j]*(1-p) + T[i+j+1]*p + // But tap #j+1 will compute: + // T[i+j+1]*(1-p) + T[i+j+2]*p + // so we end up computing: + // sum(T[i+j]) except for the end samples. + // + // So, how do we create these initial clusters? That's easy, we use K taps + // to sample 2K texels. + // + // What value of k do we use? Well, we're constrained to using MAX_TAPS + // on each pass. So at the high end, we're bounded by: + // K = MAX_TAPS + // S = MAX_TAPS (S is number of samples in second pass) + // S addresses S*2-1 texels of T, and each texel adds K more samples, + // so (ignoring the edges) we basically have w = K*S + + // if w == MAX_TAPS*MAX_TAPS, then k = MAX_TAPS + // if w == MAX_TAPS+1, then k = 2 + // + // suppose we have 3 taps, then we can sample 5 samples in one pass, so then our + // max coverage is 25 samples, or a filter width of 13. with 7 taps, we sample + // 13 samples in one pass, max coverage is 13*13 samples or (13*13-1)/2 width, + // which is ((2T-1)*(2T-1)-1)/2 or (4T^2 - 4T + 1 -1)/2 or 2T^2 - 2T or 2T*(T-1) + S32 w_mip = (S32) ceil(linear_remap(w, MAX_TAPS+1, MAX_TAPS*MAX_TAPS, 2, MAX_TAPS)); + S32 downsample = w_mip; + F32 sample_spacing = texel; + if (downsample < 2) downsample = 2; + if (w_mip > MAX_TAPS) { + // if w_mip > MAX_TAPS, then we ought to use more than one mipmap pass, but + // since that's a huge filter ( > 80 pixels) let's just try subsampling and + // see if it's good enough. + sample_spacing *= w_mip / MAX_TAPS; + w_mip = MAX_TAPS; + } else { + assert(w / downsample <= MAX_TAPS); + } + inverse_weight = 1.0f / (2*w_mip); + for (i=0; i < w_mip; ++i) { + data[i][axis] = (-w_mip+1 + i*2+0.5f)*sample_spacing; + data[i][off_axis] = 0; + data[i][2] = 2*inverse_weight; + data[i][3] = 0; + } + w = w*2 / w_mip; + + // @TODO: compute the correct bboxes for this size + // the downsampled texture samples from -w_mip+1 to w_mip + // the sample from within that samples w spots within that, + // or w/2 of those, but they're overlapping by 50%. + // so if a sample is a point i, it samples from the original + // from -w_mip+1 to w_mip + i*w_mip. + // So then the minimum is: -w_mip+1 + (w/2)*w_mip, and + // the maximum is w_mip + (w/2)*w_mip + expand = (((w+1)>>1)+1)*w_mip+1; + gdraw_ExpandRect(draw_bounds, draw_bounds, axis ? 0 : expand, axis ? expand : 0, c->w, c->h); + + t = gdraw_BlurPassDownsample(g, c, r, w_mip, data[0], draw_bounds, axis, downsample, c->frametex_width, c->frametex_height, sample_bounds, gstats); + if (r->tex[0] != protect && r->tex[0] != t) + g->FreeTexture(r->tex[0], 0, gstats); + r->tex[0] = t; + gdraw_ExpandRect(sample_bounds, draw_bounds, 1, 1, c->w, c->h); + if (!r->tex[0]) + return; + + // now do a regular blur pass sampling from that + // the raw texture now contains 'downsample' samples per texel + if (w > 2*MAX_TAPS) { + sample_spacing = texel * (w-1) / (2*MAX_TAPS-1); + w = 2*MAX_TAPS; + } else { + sample_spacing = texel; + } + //sample_spacing *= 1.0f/2; + assert(w >= 2 && w <= 2*MAX_TAPS); + + if (w & 1) { + // we just want to evenly weight even-spaced samples + inverse_weight = 1.0f / w; + + // just go through and place all the taps in the right place + + w = (w+1)>>1; + for (i=0; i < w; ++i) { + data[i][axis] = (-w+1.0f + 0.5f + i*2)*sample_spacing; + data[i][off_axis] = 0; + data[i][2] = 2*inverse_weight; // 2 full-weight samples + data[i][3] = 0; + } + + // fix up the last tap + + // the following test is always true, but we're testing it here + // explicitly so as to make VS2012's static analyzer not complain + if (i > 0) { + data[i-1][axis] = (-w+1.0f+(i-1)*2)*sample_spacing; + data[i-1][2] = inverse_weight; + } + } else { + // we just want to evenly weight even-spaced samples + inverse_weight = 1.0f / w; + + // just go through and place all the taps in the right place + w >>= 1; + for (i=0; i < w; ++i) { + data[i][axis] = (-w+1.0f + i*2)*sample_spacing; + data[i][off_axis] = 0; + data[i][2] = 2*inverse_weight; // 2 full-weight samples + data[i][3] = 0; + } + } + + t = gdraw_BlurPassDownsample(g, c, r, w, data[0], draw_bounds, axis, 1, + axis==0 ? c->frametex_width*downsample : c->frametex_width, + axis==1 ? c->frametex_height*downsample : c->frametex_height, sample_bounds, gstats); + if (r->tex[0] != protect && r->tex[0] != t) + g->FreeTexture(r->tex[0], 0, gstats); + r->tex[0] = t; + gdraw_ExpandRect(sample_bounds, draw_bounds, 1, 1, c->w, c->h); + } + } +} + +static void gdraw_Blur(GDrawFunctions *g, GDrawBlurInfo *c, GDrawRenderState *r, gswf_recti *draw_bounds, gswf_recti *sample_bounds, GDrawStats *gstats) +{ + S32 p; + GDrawTexture *protect = r->tex[0]; + gswf_recti sbounds; + + // compute texel offset size + F32 dx = 1.0f / c->frametex_width; + F32 dy = 1.0f / c->frametex_height; + + // blur = 1 => 1 tap + // blur = 1.2 => 3 taps (0.1, 1, 0.1) + // blur = 2.2 => 3 taps (0.6, 1, 0.6) + // blur = 2.8 => 3 taps (0.9, 1, 0.9) + // blur = 3 => 3 taps (1 , 1, 1 ) + // blur = 3.2 => 5 taps (0.1, 1, 1, 1, 0.1) + + //S32 w = ((S32) ceil((r->blur_x-1)/2))*2+1; // 1.2 => (1.2-1)/2 => 0.1 => 1.0 => 1 => 2 => 3 + //S32 h = ((S32) ceil((r->blur_y-1)/2))*2+1; // 3 => (3-1)/2 => 1.0 => 1 => 2 => 3 + + // gdraw puts 1 border pixel around everything when producing rendertargets and we use this + // so expand the input sample bounds accordingly + gdraw_ExpandRect(&sbounds, sample_bounds, 1, 1, c->w, c->h); + + for (p=0; p < r->blur_passes; ++p) { + #if 0 // @OPTIMIZE do the filter in one pass + if (w*h <= MAX_TAPS) { + } else + #endif + { + // do the filter separably + gdraw_BlurAxis(0,g,c,r,r->blur_x,dx, draw_bounds, &sbounds, protect, gstats); + gdraw_BlurAxis(1,g,c,r,r->blur_y,dy, draw_bounds, &sbounds, protect, gstats); + } + } +} + +#ifdef GDRAW_MANAGE_MEM + +static void make_pool_aligned(void **start, S32 *num_bytes, U32 alignment) +{ + UINTa addr_orig = (UINTa) *start; + UINTa addr_aligned = (addr_orig + alignment-1) & ~((UINTa) alignment - 1); + + if (addr_aligned != addr_orig) { + S32 diff = (S32) (addr_aligned - addr_orig); + if (*num_bytes < diff) { + *start = NULL; + *num_bytes = 0; + return; + } else { + *start = (void *)addr_aligned; + *num_bytes -= diff; + } + } +} + +// Very simple arena allocator +typedef struct +{ + U8 *begin; + U8 *current; + U8 *end; +} GDrawArena; + +static void gdraw_arena_init(GDrawArena *arena, void *start, U32 size) +{ + arena->begin = (U8 *)start; + arena->current = (U8 *)start; + arena->end = (U8 *)start + size; +} + +static GDRAW_MAYBE_UNUSED void gdraw_arena_reset(GDrawArena *arena) +{ + arena->current = arena->begin; +} + +static void *gdraw_arena_alloc(GDrawArena *arena, U32 size, U32 align) +{ + UINTa start_addr = ((UINTa)arena->current + align-1) & ~((UINTa) align - 1); + U8 *ptr = (U8 *)start_addr; + UINTa remaining = arena->end - arena->current; + UINTa total_size = (ptr - arena->current) + size; + if (remaining < total_size) // doesn't fit + return NULL; + + arena->current = ptr + size; + return ptr; +} + +// Allocator for graphics memory. +// Graphics memory is assumed to be write-combined and slow to read for the +// CPU, so we keep all heap management information separately in main memory. +// +// There's a constant management of about 1k (2k for 64bit) to create a heap, +// plus a per-block overhead. The maximum number of blocks the allocator can +// ever use is bounded by 2*max_allocs+1; since GDraw manages a limited +// amount of handles, max_allocs is a known value at heap creation time. +// +// The allocator uses a best-fit heuristic to minimize fragmentation. +// Currently, there are no size classes or other auxiliary data structures to +// speed up this process, since the number of free blocks at any point in time +// is assumed to be fairly low. +// +// The allocator maintains a number of invariants: +// - The free list and physical block list are proper double-linked lists. +// (i.e. block->next->prev == block->prev->next == block) +// - All allocated blocks are also kept in a hash table, indexed by their +// pointer (to allow free to locate the corresponding block_info quickly). +// There's a single-linked, NULL-terminated list of elements in each hash +// bucket. +// - The physical block list is ordered. It always contains all currently +// active blocks and spans the whole managed memory range. There are no +// gaps between blocks, and all blocks have nonzero size. +// - There are no two adjacent free blocks; if two such blocks would be created, +// they are coalesced immediately. +// - The maximum number of blocks that could ever be necessary is allocated +// on initialization. All block_infos not currently in use are kept in a +// single-linked, NULL-terminated list of unused blocks. Every block is either +// in the physical block list or the unused list, and the total number of +// blocks is constant. +// These invariants always hold before and after an allocation/free. + +#ifndef GFXALLOC_ASSERT +#define GFXALLOC_ASSERT(x) +#endif + +typedef struct gfx_block_info +{ + U8 *ptr; + gfx_block_info *prev, *next; // for free blocks this is the free list, for allocated blocks it's a (single-linked!) list of elements in the corresponding hash bucket + gfx_block_info *prev_phys, *next_phys; + U32 is_free : 1; + U32 is_unused : 1; + U32 size : 30; +} gfx_block_info; +// 24 bytes/block on 32bit, 48 bytes/block on 64bit. + +#define GFXALLOC_HASH_SIZE 256 + +typedef struct gfx_allocator +{ + U8 *mem_base; + U8 *mem_end; + U32 max_allocs; + U32 block_align; + U32 block_shift; + S32 actual_bytes_free; + +#ifdef GFXALLOC_CHECK + int num_blocks; + int num_unused; + int num_alloc; + int num_free; +#endif + + GDrawHandleCache *cache; + + gfx_block_info *unused_list; // next unused block_info (single-linked list) + gfx_block_info *hash[GFXALLOC_HASH_SIZE]; // allocated blocks + gfx_block_info blocks[1]; // first block is head of free list AND head of physical block list (sentinel) +} gfx_allocator; +// about 1k (32bit), 2k (64bit) with 256 hash buckets (the default). dominated by hash table. + +#ifdef GFXALLOC_CHECK +#define GFXALLOC_IF_CHECK(x) x +#else +#define GFXALLOC_IF_CHECK(x) +#endif + +static U32 gfxalloc_get_hash_code(gfx_allocator *alloc, void *ptr) +{ + U32 a = (U32) (((U8 *) ptr - alloc->mem_base) >> alloc->block_shift); + + // integer hash function by Bob Jenkins (http://burtleburtle.net/bob/hash/integer.html) + // I use this function because integer mults are slow on PPC and large literal constants + // take multiple instrs to set up on all RISC CPUs. + a -= (a<<6); + a ^= (a>>17); + a -= (a<<9); + a ^= (a<<4); + a -= (a<<3); + a ^= (a<<10); + a ^= (a>>15); + + return a & (GFXALLOC_HASH_SIZE - 1); +} + +#if defined(SUPERDEBUG) || defined(COMPLETE_DEBUG) +#include +#define MAX_REGIONS 8192 +typedef struct +{ + U32 begin,end; +} gfx_region; +static gfx_region region[MAX_REGIONS]; + +static int region_sort(const void *p, const void *q) +{ + U32 a = *(U32*)p; + U32 b = *(U32*)q; + if (a < b) return -1; + if (a > b) return 1; + return 0; +} + +static void gfxalloc_check1(gfx_allocator *alloc) +{ + assert(alloc->max_allocs*2+1 < MAX_REGIONS); + int i,n=0; + for (i=0; i < GFXALLOC_HASH_SIZE; ++i) { + gfx_block_info *b = alloc->hash[i]; + while (b) { + region[n].begin = (UINTa) b->ptr; + region[n].end = region[n].begin + b->size; + ++n; + b = b->next; + } + } + gfx_block_info *b = alloc->blocks[0].next; + while (b != &alloc->blocks[0]) { + region[n].begin = (UINTa) b->ptr; + region[n].end = region[n].begin + b->size; + ++n; + b = b->next; + } + qsort(region, n, sizeof(region[0]), region_sort); + for (i=0; i+1 < n; ++i) { + assert(region[i].end == region[i+1].begin); + } +} +#else +#define gfxalloc_check1(a) +#endif + +#ifdef COMPLETE_DEBUG +static void verify_against_blocks(int num_regions, void *vptr, S32 len) +{ + U32 *ptr = (U32 *) vptr; + // binary search for ptr amongst regions + S32 s=0,e=num_regions-1; + assert(len != 0); + while (s < e) { + S32 i = (s+e+1)>>1; + // invariant: b[s] <= ptr <= b[e] + if (region[i].begin <= (UINTa) ptr) + s = i; + else + e = i-1; + + // consider cases: + // s=0,e=1: i = 0, how do we get i to be 1? + } + // at this point, s >= e + assert(s < num_regions && region[s].begin == (UINTa) ptr && (UINTa) ptr+len <= region[s].end); +} + +static void debug_complete_check(gfx_allocator *alloc, void *ptr, S32 len, void *skip) +{ + GDrawHandleCache *c = alloc->cache; + assert(alloc->max_allocs*2+1 < MAX_REGIONS); + int i,n=0; + for (i=0; i < GFXALLOC_HASH_SIZE; ++i) { + gfx_block_info *b = alloc->hash[i]; + while (b) { + region[n].begin = (UINTa) b->ptr; + region[n].end = region[n].begin + b->size; + ++n; + b = b->next; + } + } + gfx_block_info *b = alloc->blocks[0].next; + while (b != &alloc->blocks[0]) { + region[n].begin = (UINTa) b->ptr; + region[n].end = region[n].begin + b->size; + ++n; + b = b->next; + } + for (i=0; i < n; ++i) + assert(region[i].end > region[i].begin); + qsort(region, n, sizeof(region[0]), region_sort); + for (i=0; i+1 < n; ++i) { + assert(region[i].end == region[i+1].begin); + } + + if (ptr) + verify_against_blocks(n, ptr, len); + + if (c) { + GDrawHandle *t = c->head; + while (t) { + if (t->raw_ptr && t->raw_ptr != skip) + verify_against_blocks(n, t->raw_ptr, t->bytes); + t = t->next; + } + t = c->active; + while (t) { + if (t->raw_ptr && t->raw_ptr != skip) + verify_against_blocks(n, t->raw_ptr, t->bytes); + t = t->next; + } + } +} +#else +#define debug_complete_check(a,p,len,s) +#endif + +#ifdef GFXALLOC_CHECK +static void gfxalloc_check2(gfx_allocator *alloc) +{ + int n=0; + gfx_block_info *b = alloc->unused_list; + while (b) { + ++n; + b = b->next; + } + GFXALLOC_ASSERT(n == alloc->num_unused); + b = alloc->blocks->next; + n = 0; + while (b != alloc->blocks) { + ++n; + b = b->next; + } + GFXALLOC_ASSERT(n == alloc->num_free); + GFXALLOC_ASSERT(alloc->num_blocks == alloc->num_unused + alloc->num_free + alloc->num_alloc); +} +#define gfxalloc_check(a) do { gfxalloc_check1(a); gfxalloc_check2(a); } while(0) +#else +#define gfxalloc_check2(a) +#define gfxalloc_check(a) +#endif + + + +static gfx_block_info *gfxalloc_pop_unused(gfx_allocator *alloc) +{ + GFXALLOC_ASSERT(alloc->unused_list != NULL); + GFXALLOC_ASSERT(alloc->unused_list->is_unused); + GFXALLOC_IF_CHECK(GFXALLOC_ASSERT(alloc->num_unused);) + + gfx_block_info *b = alloc->unused_list; + alloc->unused_list = b->next; + GFXALLOC_ASSERT(alloc->unused_list); + b->is_unused = 0; + GFXALLOC_IF_CHECK(--alloc->num_unused;) + return b; +} + +static void gfxalloc_push_unused(gfx_allocator *alloc, gfx_block_info *b) +{ + GFXALLOC_ASSERT(!b->is_unused); + b->is_unused = 1; + b->next = alloc->unused_list; + alloc->unused_list = b; + GFXALLOC_IF_CHECK(++alloc->num_unused); +} + +static void gfxalloc_add_free(gfx_allocator *alloc, gfx_block_info *b) +{ + gfx_block_info *head = alloc->blocks; + + b->is_free = 1; + b->next = head->next; + b->prev = head; + head->next->prev = b; + head->next = b; + GFXALLOC_IF_CHECK(++alloc->num_free;) +} + +static void gfxalloc_rem_free(gfx_allocator *alloc, gfx_block_info *b) +{ + RR_UNUSED_VARIABLE(alloc); + b->is_free = 0; + b->prev->next = b->next; + b->next->prev = b->prev; + GFXALLOC_IF_CHECK(--alloc->num_free;) +} + +static void gfxalloc_split_free(gfx_allocator *alloc, gfx_block_info *b, U32 pos) +{ + gfx_block_info *n = gfxalloc_pop_unused(alloc); + + GFXALLOC_ASSERT(b->is_free); + GFXALLOC_ASSERT(pos > 0 && pos < b->size); + + // set up new free block + n->ptr = b->ptr + pos; + n->prev_phys = b; + n->next_phys = b->next_phys; + n->next_phys->prev_phys = n; + n->size = b->size - pos; + assert(n->size != 0); + gfxalloc_add_free(alloc, n); + + // fix original block + b->next_phys = n; + b->size = pos; + assert(b->size != 0); + +debug_complete_check(alloc, n->ptr, n->size,0); +debug_complete_check(alloc, b->ptr, b->size,0); +} + +static gfx_allocator *gfxalloc_create(void *mem, U32 mem_size, U32 align, U32 max_allocs) +{ + gfx_allocator *a; + U32 i, max_blocks, size; + + if (!align || (align & (align - 1)) != 0) // align must be >0 and a power of 2 + return NULL; + + // for <= max_allocs live allocs, there's <= 2*max_allocs+1 blocks. worst case: + // [free][used][free] .... [free][used][free] + max_blocks = max_allocs * 2 + 1; + size = sizeof(gfx_allocator) + max_blocks * sizeof(gfx_block_info); + a = (gfx_allocator *) IggyGDrawMalloc(size); + if (!a) + return NULL; + + memset(a, 0, size); + + GFXALLOC_IF_CHECK(a->num_blocks = max_blocks;) + GFXALLOC_IF_CHECK(a->num_alloc = 0;) + GFXALLOC_IF_CHECK(a->num_free = 1;) + GFXALLOC_IF_CHECK(a->num_unused = max_blocks-1;) + + GFXALLOC_IF_CHECK(GFXALLOC_ASSERT(a->num_blocks == a->num_alloc + a->num_free + a->num_unused);) + GFXALLOC_IF_CHECK(GFXALLOC_ASSERT(a->num_free <= a->num_blocks+1);) + + a->actual_bytes_free = mem_size; + a->mem_base = (U8 *) mem; + a->mem_end = a->mem_base + mem_size; + a->max_allocs = max_allocs; + a->block_align = align; + a->block_shift = 0; + while ((1u << a->block_shift) < a->block_align) + a->block_shift++; + + // init sentinel block + a->blocks[0].prev = a->blocks[0].next = &a->blocks[1]; // point to free block + a->blocks[0].prev_phys = a->blocks[0].next_phys = &a->blocks[1]; // same + + // init first free block + a->blocks[1].ptr = a->mem_base; + a->blocks[1].prev = a->blocks[1].next = &a->blocks[0]; + a->blocks[1].prev_phys = a->blocks[1].next_phys = &a->blocks[0]; + a->blocks[1].is_free = 1; + a->blocks[1].size = mem_size; + + // init "unused" list + a->unused_list = a->blocks + 2; + for (i=2; i < max_blocks; i++) { + a->blocks[i].is_unused = 1; + a->blocks[i].next = a->blocks + (i + 1); + } + a->blocks[i].is_unused = 1; + + gfxalloc_check(a); + debug_complete_check(a, NULL, 0,0); + return a; +} + +static void *gfxalloc_alloc(gfx_allocator *alloc, U32 size_in_bytes) +{ + gfx_block_info *cur, *best = NULL; + U32 i, best_wasted = ~0u; + U32 size = size_in_bytes; +debug_complete_check(alloc, NULL, 0,0); +gfxalloc_check(alloc); + GFXALLOC_IF_CHECK(GFXALLOC_ASSERT(alloc->num_blocks == alloc->num_alloc + alloc->num_free + alloc->num_unused);) + GFXALLOC_IF_CHECK(GFXALLOC_ASSERT(alloc->num_free <= alloc->num_blocks+1);) + + + // round up to multiple of our block alignment + size = (size + alloc->block_align-1) & ~(alloc->block_align - 1); + assert(size >= size_in_bytes); + assert(size != 0); + + // find best fit among all free blocks. this is O(N)! + for (cur = alloc->blocks[0].next; cur != alloc->blocks; cur = cur->next) { + if (cur->size >= size) { + U32 wasted = cur->size - size; + if (wasted < best_wasted) { + best_wasted = wasted; + best = cur; + if (!wasted) break; // can't get better than perfect + } + } + } + + // return the best fit, if we found any suitable block + if (best) { +debug_check_overlap(alloc->cache, best->ptr, best->size); + // split off allocated part + if (size != best->size) + gfxalloc_split_free(alloc, best, size); +debug_complete_check(alloc, best->ptr, best->size,0); + + // remove from free list and add to allocated hash table + GFXALLOC_ASSERT(best->size == size); + gfxalloc_rem_free(alloc, best); + + i = gfxalloc_get_hash_code(alloc, best->ptr); + best->next = alloc->hash[i]; + alloc->hash[i] = best; + alloc->actual_bytes_free -= size; + GFXALLOC_ASSERT(alloc->actual_bytes_free >= 0); + + GFXALLOC_IF_CHECK(++alloc->num_alloc;) + GFXALLOC_IF_CHECK(GFXALLOC_ASSERT(alloc->num_blocks == alloc->num_alloc + alloc->num_free + alloc->num_unused);) + GFXALLOC_IF_CHECK(GFXALLOC_ASSERT(alloc->num_free <= alloc->num_blocks+1);) + +debug_complete_check(alloc, best->ptr, best->size,0); +gfxalloc_check(alloc); +debug_check_overlap(alloc->cache, best->ptr, best->size); + return best->ptr; + } else + return NULL; // not enough space! +} + +static void gfxalloc_free(gfx_allocator *alloc, void *ptr) +{ + GFXALLOC_IF_CHECK(GFXALLOC_ASSERT(alloc->num_blocks == alloc->num_alloc + alloc->num_free + alloc->num_unused);) + GFXALLOC_IF_CHECK(GFXALLOC_ASSERT(alloc->num_free <= alloc->num_blocks+1);) + + // find the block in the hash table + gfx_block_info *b, *t, **prevnext; + U32 i = gfxalloc_get_hash_code(alloc, ptr); + + prevnext = &alloc->hash[i]; + b = alloc->hash[i]; + + while (b) { + if (b->ptr == ptr) break; + prevnext = &b->next; + b = b->next; + } + + if (!b) { + GFXALLOC_ASSERT(0); // trying to free a non-allocated block + return; + } + +debug_complete_check(alloc, b->ptr, b->size, 0); + GFXALLOC_IF_CHECK(--alloc->num_alloc;) + + // remove it from the hash table + *prevnext = b->next; + + alloc->actual_bytes_free += b->size; + + // merge with previous block if it's free, else add it to free list + t = b->prev_phys; + if (t->is_free) { + t->size += b->size; + t->next_phys = b->next_phys; + t->next_phys->prev_phys = t; + gfxalloc_push_unused(alloc, b); + b = t; + } else + gfxalloc_add_free(alloc, b); + + // try to merge with next block + t = b->next_phys; + if (t->is_free) { + b->size += t->size; + b->next_phys = t->next_phys; + t->next_phys->prev_phys = b; + gfxalloc_rem_free(alloc, t); + gfxalloc_push_unused(alloc, t); + } +debug_complete_check(alloc, 0, 0, ptr); +gfxalloc_check(alloc); + GFXALLOC_IF_CHECK(GFXALLOC_ASSERT(alloc->num_blocks == alloc->num_alloc + alloc->num_free + alloc->num_unused);) + GFXALLOC_IF_CHECK(GFXALLOC_ASSERT(alloc->num_free <= alloc->num_blocks+1);) +} + +#ifdef GDRAW_MANAGE_MEM_TWOPOOL + +static rrbool gfxalloc_is_empty(gfx_allocator *alloc) +{ + gfx_block_info *first_free = alloc->blocks[0].next; + + // we want to check whether there's exactly one free block that + // covers the entire pool. + if (first_free == alloc->blocks) // 0 free blocks + return false; + + if (first_free->next != alloc->blocks) // >1 free block + return false; + + return first_free->ptr == alloc->mem_base && first_free->ptr + first_free->size == alloc->mem_end; +} + +static rrbool gfxalloc_mem_contains(gfx_allocator *alloc, void *ptr) +{ + return alloc->mem_base <= (U8*)ptr && (U8*)ptr < alloc->mem_end; +} + +#endif + +#ifdef GDRAW_DEBUG + +static void gfxalloc_dump(gfx_allocator *alloc) +{ + static const char *type[] = { + "allocated", + "free", + }; + + for (gfx_block_info *b = alloc->blocks[0].next_phys; b != alloc->blocks; b=b->next_phys) { + U8 *start = b->ptr; + U8 *end = b->ptr + b->size; + printf("%p-%p: %s (%d bytes)\n", start, end, type[b->is_free], b->size); + } +} + +#endif + +#endif + +#ifdef GDRAW_DEFRAGMENT + +#define GDRAW_DEFRAGMENT_may_overlap 1 // self-overlap for individual copies is OK + +// Defragmentation code for graphics memory. +// The platform implementation must provide a GPU memcpy function and handle all necessary +// synchronization. It must also adjust its resource descriptors to match the new addresses +// after defragmentation. + +static void gdraw_gpu_memcpy(GDrawHandleCache *c, void *dst, void *src, U32 num_bytes); + +static void gdraw_Defragment_memmove(GDrawHandleCache *c, U8 *dst, U8 *src, U32 num_bytes, U32 flags, GDrawStats *stats) +{ + if (dst == src) + return; + + assert(num_bytes != 0); + + stats->nonzero_flags |= GDRAW_STATS_defrag; + stats->defrag_objects += 1; + stats->defrag_bytes += num_bytes; + + if ((flags & GDRAW_DEFRAGMENT_may_overlap) || dst + num_bytes <= src || src + num_bytes <= dst) // no problematic overlap + gdraw_gpu_memcpy(c, dst, src, num_bytes); + else { + // need to copy in multiple chunks + U32 chunk_size, pos=0; + if (dst < src) + chunk_size = (U32) (src - dst); + else + chunk_size = (U32) (dst - src); + + while (pos < num_bytes) { + U32 amount = num_bytes - pos; + if (amount > chunk_size) amount = chunk_size; + gdraw_gpu_memcpy(c, dst + pos, src + pos, amount); + pos += amount; + } + } +} + +static rrbool gdraw_CanDefragment(GDrawHandleCache *c) +{ + // we can defragment (and extract some gain from it) if and only if there's more + // than one free block. since gfxalloc coalesces free blocks immediately and keeps + // them in a circular linked list, this is very easy to detect: just check if the + // "next" pointer of the first free block points to the sentinel. (this is only + // the case if there are 0 or 1 free blocks) + gfx_allocator *alloc = c->alloc; + return alloc->blocks[0].next->next != alloc->blocks; +} + +static void gdraw_DefragmentMain(GDrawHandleCache *c, U32 flags, GDrawStats *stats) +{ + gfx_allocator *alloc = c->alloc; + gfx_block_info *b, *n; + U8 *p; + S32 i; + + GFXALLOC_IF_CHECK(GFXALLOC_ASSERT(alloc->num_blocks == alloc->num_alloc + alloc->num_free + alloc->num_unused);) + GFXALLOC_IF_CHECK(GFXALLOC_ASSERT(alloc->num_free <= alloc->num_blocks+1);) + + // go over all allocated memory blocks and clear the "prev" pointer + // (unused for allocated blocks, we'll use it to store a back-pointer to the corresponding handle) + for (b = alloc->blocks[0].next_phys; b != alloc->blocks; b=b->next_phys) + if (!b->is_free) + b->prev = NULL; + + // go through all handles and store a pointer to the handle in the corresponding memory block + for (i=0; i < c->max_handles; i++) + if (c->handle[i].raw_ptr) { + assert(c->handle[i].bytes != 0); + for (b=alloc->hash[gfxalloc_get_hash_code(alloc, c->handle[i].raw_ptr)]; b; b=b->next) + if (b->ptr == c->handle[i].raw_ptr) { + void *block = &c->handle[i]; + b->prev = (gfx_block_info *) block; + break; + } + + GFXALLOC_ASSERT(b != NULL); // didn't find this block anywhere! + } + + // clear alloc hash table (we rebuild it during defrag) + memset(alloc->hash, 0, sizeof(alloc->hash)); + + // defragmentation proper: go over all blocks again, remove all free blocks from the physical + // block list and compact the remaining blocks together. + p = alloc->mem_base; + for (b = alloc->blocks[0].next_phys; b != alloc->blocks; b=n) { + n = b->next_phys; + + if (!b->is_free) { + U32 h; + + // move block if necessary + if (p != b->ptr) { + assert(b->size != 0); + gdraw_Defragment_memmove(c, p, b->ptr, b->size, flags, stats); + b->ptr = p; + assert(b->prev); + if (b->prev) + ((GDrawHandle *) b->prev)->raw_ptr = p; + } + + // re-insert into hash table + h = gfxalloc_get_hash_code(alloc, p); + b->next = alloc->hash[h]; + alloc->hash[h] = b; + + p += b->size; + } else { + // free block: remove it from the physical block list + b->prev_phys->next_phys = b->next_phys; + b->next_phys->prev_phys = b->prev_phys; + gfxalloc_rem_free(alloc, b); + gfxalloc_push_unused(alloc, b); + } + } + // the free list should be empty now + assert(alloc->blocks[0].next == &alloc->blocks[0]); + + // unless all memory is allocated, we now need to add a new block for the free space at the end + if (p != alloc->mem_end) { + b = gfxalloc_pop_unused(alloc); + + b->ptr = p; + b->prev_phys = alloc->blocks[0].prev_phys; + b->next_phys = &alloc->blocks[0]; + b->prev_phys->next_phys = b; + b->next_phys->prev_phys = b; + b->size = alloc->mem_end - p; + gfxalloc_add_free(alloc, b); + } + + GFXALLOC_IF_CHECK(GFXALLOC_ASSERT(alloc->num_blocks == alloc->num_alloc + alloc->num_free + alloc->num_unused);) + GFXALLOC_IF_CHECK(GFXALLOC_ASSERT(alloc->num_free <= alloc->num_blocks+1);) +} + +#endif + +#ifdef GDRAW_MANAGE_MEM_TWOPOOL + +// Defragmentation code for graphics memory, using two-pool strategy. +// +// The platform implementation must provide a GPU memcpy function and handle +// all necessary synchronization. It must also adjust its resource descriptors +// to match the new addresses after defragmentation. +// +// The high concept for two-pool is that we can't update the resource pools +// mid-frame; instead, while preparing for a frame, we need to produce a memory +// configuration that is suitable for rendering a whole frame at once (in +// contrast to our normal incremental strategy, where we can decide to +// defragment mid-frame if things are getting desperate). This is for tiled +// renderers. +// +// Two-pool works like this: +// - As the name suggests, each handle cache has two memory pools and corresponding backing +// allocators. The currently used allocator, "alloc", and a second allocator, "alloc_other". +// - Any resource used in a command buffer gets locked and *stays locked* until we're done +// preparing that command buffer (i.e. no unlocking after every draw as in the normal +// incremental memory management). +// - All allocations happen from "alloc", always. We mostly do our normal LRU cache freeing +// to make space when required. +// - We can still run out of space (no surprise) and get into a configuration where we have +// to defragment. This is the only tricky part, and where the second pool comes in. To +// defragment, we switch the roles of "alloc" and "alloc_other", and allocate new backing +// storage for all currently "locked" and "pinned" resources (i.e. everything we've used +// in the currently pending frame). +// - In general, we have the invariant that all resources we're using for batches we're +// working on must be in the "alloc" (fresh) pool, not in the "other" (stale) pool. +// Therefore, after a defragment/pool switch, any "live" resource (which means it's +// present in the stale pool) has to be copied to the "fresh" pool as it's getting +// locked to maintain this invariant. +// +// What this does is give us a guarantee that any given frame either only +// references resources in one pool (the common case), or does a defragment, in +// which case it looks like this: +// +// +------------------------------+ +// | | +// | | pool A is fresh (=alloc), pool B is stale (=alloc_other) +// | | all resources referenced in here are in pool A +// | | +// | | +// | | +// +------------------------------+ <-- defragment! pools flip roles here +// | | +// | | +// | | pool B is fresh (=alloc), pool A is stale (=alloc_other) +// | | all resources referenced in here are in pool B +// | | +// +------------------------------+ +// +// Now, at the end of the frame, we need to decide what to do with the +// resources that remain "live" (i.e. they're in the old pool but weren't +// referenced in the current frame so they didn't get copied). As of this +// writing, we simply free them, to maximize the amount of free memory in the +// new pool (and hopefully minimize the chance that we'll have to defragment +// again soon). It would also be possible to copy some of them though, assuming +// there's enough space. +// +// Freeing resources is an interesting case. When the CPU side of GDraw does a +// "free", we can't immediately reclaim the resource memory, since the GPU will +// generally still have outstanding commands that reference that resource. So +// our freed resources first enter the "Dead" state and only actually get freed +// once the GPU is done with them. What this means is that the list of +// resources in the "dead" state can end up holding references to both the +// fresh and the stale pool; the free implementation needs to be aware of this +// and return the memory to the right allocator. +// +// When we defragment, it's important to make sure that the pool we're flipping +// to is actually empty. What this means is that right before a defragment, we +// need to wait for all stale "dead" resources to actually become free. If the +// last defragment was several frames ago, this is fast - we haven't generated +// any new commands referencing the stale resources in several frames, so most +// likely they're all immediately free-able. By contrast, if we just +// defragmented last frame, this will be a slow operation since we need to wait +// for the GPU pipeline to drain - but if you're triggering defragments in +// several consecutive frames, you're thrashing the resource pools badly and +// are getting really bad performance anyway. + +static void gdraw_gpu_memcpy(GDrawHandleCache *c, void *dst, void *src, U32 num_bytes); +static void gdraw_gpu_wait_for_transfer_completion(); +static void gdraw_resource_moved(GDrawHandle *t); + +static rrbool gdraw_CanDefragment(GDrawHandleCache *c) +{ + // we can defragment (and extract some gain from it) if and only if there's more + // than one free block. since gfxalloc coalesces free blocks immediately and keeps + // them in a circular linked list, this is very easy to detect: just check if the + // "next" pointer of the first free block points to the sentinel. (this is only + // the case if there are 0 or 1 free blocks) + gfx_allocator *alloc = c->alloc; + if (!c->alloc_other) // if we don't have a second pool, we can't defrag at all. + return false; + return alloc->blocks[0].next->next != alloc->blocks; +} + +static rrbool gdraw_MigrateResource(GDrawHandle *t, GDrawStats *stats) +{ + GDrawHandleCache *c = t->cache; + void *ptr = NULL; + + assert(t->state == GDRAW_HANDLE_STATE_live || t->state == GDRAW_HANDLE_STATE_locked || t->state == GDRAW_HANDLE_STATE_pinned); + // anything we migrate should be in the "other" (old) pool + assert(gfxalloc_mem_contains(c->alloc_other, t->raw_ptr)); + + ptr = gfxalloc_alloc(c->alloc, t->bytes); + if (ptr) { + // update stats + stats->nonzero_flags |= GDRAW_STATS_defrag; + stats->defrag_objects += 1; + stats->defrag_bytes += t->bytes; + + // copy contents to new storage + gdraw_gpu_memcpy(c, ptr, t->raw_ptr, t->bytes); + + // free old storage + gfxalloc_free(c->alloc_other, t->raw_ptr); + + // adjust pointers to point to new location + t->raw_ptr = ptr; + gdraw_resource_moved(t); + + return true; + } else + return false; +} + +static rrbool gdraw_MigrateAllResources(GDrawHandle *sentinel, GDrawStats *stats) +{ + GDrawHandle *h; + for (h = sentinel->next; h != sentinel; h = h->next) { + if (!gdraw_MigrateResource(h, stats)) + return false; + } + return true; +} + +static rrbool gdraw_TwoPoolDefragmentMain(GDrawHandleCache *c, GDrawStats *stats) +{ + gfx_allocator *t; + + // swap allocators + t = c->alloc; + c->alloc = c->alloc_other; + c->alloc_other = t; + + // immediately migrate all currently pinned and locked resources + rrbool ok = true; + ok = ok && gdraw_MigrateAllResources(&c->state[GDRAW_HANDLE_STATE_pinned], stats); + ok = ok && gdraw_MigrateAllResources(&c->state[GDRAW_HANDLE_STATE_locked], stats); + + return ok; +} + +static rrbool gdraw_StateListIsEmpty(GDrawHandle *head) +{ + // a list is empty when the head sentinel is the only node + return head->next == head; +} + +static void gdraw_CheckAllPointersUpdated(GDrawHandle *head) +{ +#ifdef GDRAW_DEBUG + GDrawHandle *h; + for (h = head->next; h != head; h = h->next) { + assert(gfxalloc_mem_contains(h->cache->alloc, h->raw_ptr)); + } +#endif +} + +static void gdraw_PostDefragmentCleanup(GDrawHandleCache *c, GDrawStats *stats) +{ + // if we defragmented during this scene, this is the spot where + // we need to nuke all references to resources that weren't + // carried over into the new pool. + if (c->did_defragment) { + GDrawHandle *h; + + // alloc list should be empty at this point + assert(gdraw_StateListIsEmpty(&c->state[GDRAW_HANDLE_STATE_alloc])); + + // free all remaining live resources (these are the resources we didn't + // touch this frame, hence stale) + h = &c->state[GDRAW_HANDLE_STATE_live]; + while (!gdraw_StateListIsEmpty(h)) + gdraw_res_free(h->next, stats); + + // "live" is now empty, and we already checked that "alloc" was empty + // earlier. "dead" may hold objects on the old heap still (that were freed + // before we swapped allocators). "user owned" is not managed by us. + // that leaves "locked" and "pinned" resources, both of which better be + // only pointing into the new heap now! + gdraw_CheckAllPointersUpdated(&c->state[GDRAW_HANDLE_STATE_locked]); + gdraw_CheckAllPointersUpdated(&c->state[GDRAW_HANDLE_STATE_pinned]); + + gdraw_gpu_wait_for_transfer_completion(); + } +} + +#endif + +// Image processing code + +// Compute average of 4 RGBA8888 pixels passed as U32. +// Variables are named assuming the values are stored as big-endian, but all bytes +// are treated equally, so this code will work just fine on little-endian data. +static U32 gdraw_Avg4_rgba8888(U32 p0, U32 p1, U32 p2, U32 p3) +{ + U32 mask = 0x00ff00ff; + U32 bias = 0x00020002; + + U32 gasum = ((p0 >> 0) & mask) + ((p1 >> 0) & mask) + ((p2 >> 0) & mask) + ((p3 >> 0) & mask) + bias; + U32 rbsum = ((p0 >> 8) & mask) + ((p1 >> 8) & mask) + ((p2 >> 8) & mask) + ((p3 >> 8) & mask) + bias; + + return ((gasum >> 2) & mask) | ((rbsum << 6) & ~mask); +} + +// Compute average of 2 RGBA8888 pixels passed as U32 +static U32 gdraw_Avg2_rgba8888(U32 p0, U32 p1) +{ + return (p0 | p1) - (((p0 ^ p1) >> 1) & 0x7f7f7f7f); +} + +// 2:1 downsample in both horizontal and vertical direction, for one line. +// width is width of destination line. +static void gdraw_Downsample_2x2_line(U8 *dst, U8 *line0, U8 *line1, U32 width, U32 bpp) +{ + U32 x; + if (bpp == 4) { + U32 *in0 = (U32 *) line0; + U32 *in1 = (U32 *) line1; + U32 *out = (U32 *) dst; + for (x=0; x < width; x++, in0 += 2, in1 += 2) + *out++ = gdraw_Avg4_rgba8888(in0[0], in0[1], in1[0], in1[1]); + } else if (bpp == 1) { + for (x=0; x < width; x++, line0 += 2, line1 += 2) + *dst++ = (line0[0] + line0[1] + line1[0] + line1[1] + 2) / 4; + } else + RR_BREAK(); +} + +// 2:1 downsample in horizontal but not vertical direction. +static void gdraw_Downsample_2x1_line(U8 *dst, U8 *src, U32 width, U32 bpp) +{ + U32 x; + if (bpp == 4) { + U32 *in = (U32 *) src; + U32 *out = (U32 *) dst; + for (x=0; x < width; x++, in += 2) + *out++ = gdraw_Avg2_rgba8888(in[0], in[1]); + } else if (bpp == 1) { + for (x=0; x < width; x++, src += 2) + *dst++ = (src[0] + src[1] + 1) / 2; + } else + RR_BREAK(); +} + +// 2:1 downsample in vertical but not horizontal direction. +static void gdraw_Downsample_1x2(U8 *dst, S32 dstpitch, U8 *src, S32 srcpitch, U32 height, U32 bpp) +{ + U32 y; + if (bpp == 4) { + for (y=0; y < height; y++, dst += dstpitch, src += 2*srcpitch) + *((U32 *) dst) = gdraw_Avg2_rgba8888(*((U32 *) src), *((U32 *) (src + srcpitch))); + } else if (bpp == 1) { + for (y=0; y < height; y++, dst += dstpitch, src += 2*srcpitch) + *dst = (src[0] + src[srcpitch] + 1) / 2; + } else + RR_BREAK(); +} + +// 2:1 downsample (for mipmaps) +// dst: Pointer to destination buffer +// dstpitch: Pitch for destination buffer +// width: Width of *destination* image (i.e. downsampled version) +// height: Height of *destination* image (i.e. downsampled version) +// src: Pointer to source buffer +// srcpitch: Pitch of source buffer +// bpp: Bytes per pixel for image data +// +// can be used for in-place resizing if src==dst and dstpitch <= srcpitch! +static GDRAW_MAYBE_UNUSED void gdraw_Downsample(U8 *dst, S32 dstpitch, U32 width, U32 height, U8 *src, S32 srcpitch, U32 bpp) +{ + U32 y; + assert(bpp == 1 || bpp == 4); + + // @TODO gamma? + if (!height) // non-square texture, height was reduced to 1 in a previous step + gdraw_Downsample_2x1_line(dst, src, width, bpp); + else if (!width) // non-square texture, width was reduced to 1 in a previous step + gdraw_Downsample_1x2(dst, dstpitch, src, srcpitch, height, bpp); + else { + for (y=0; y < height; y++) { + gdraw_Downsample_2x2_line(dst, src, src + srcpitch, width, bpp); + dst += dstpitch; + src += 2*srcpitch; + } + } +} + +#ifndef GDRAW_NO_STREAMING_MIPGEN + +#define GDRAW_MAXMIPS 16 // maximum number of mipmaps supported. + +typedef struct GDrawMipmapContext { + U32 width; // width of the texture being mipmapped + U32 height; // height of the texture being mipmapped + U32 mipmaps; // number of mipmaps + U32 bpp; // bytes per pixel + + U32 partial_row; // bit N: is mipmap N currently storing a partial row? + U32 bheight; // height of the buffer at miplevel 0 + U8 *pixels[GDRAW_MAXMIPS]; + U32 pitch[GDRAW_MAXMIPS]; +} GDrawMipmapContext; + +static rrbool gdraw_MipmapBegin(GDrawMipmapContext *c, U32 width, U32 height, U32 mipmaps, U32 bpp, U8 *buffer, U32 buffer_size) +{ + U32 i; + U8 *p; + + if (mipmaps > GDRAW_MAXMIPS) + return false; + + c->width = width; + c->height = height; + c->mipmaps = mipmaps; + c->bpp = bpp; + c->partial_row = 0; + + // determine how many lines to buffer + // we try to use roughly 2/3rds of the buffer for the first miplevel (less than 3/4 since with our + // partial line buffers, we have extra buffer space for lower mip levels). + c->bheight = (2 * buffer_size) / (3 * width * bpp); + + // round down to next-smaller power of 2 (in case we need to swizzle; swizzling works on pow2-sized blocks) + while (c->bheight & (c->bheight-1)) // while not a power of 2... + c->bheight &= c->bheight - 1; // clear least significant bit set + + // then keep lowering the number of buffered lines until they fit (or we reach zero, i.e. it doesn't fit) + while (c->bheight) { + p = buffer; + for (i=0; i < c->mipmaps; i++) { + U32 mw = c->width >> i; + U32 bh = c->bheight >> i; + if (!mw) mw++; + if (!bh) mw *= 2, bh++; // need space for line of previous miplevel + + c->pixels[i] = p; + c->pitch[i] = mw * bpp; + p += c->pitch[i] * bh; + } + + // if it fits, we're done + if (p <= buffer + buffer_size) { + if (c->bheight > height) // buffer doesn't need to be larger than the image! + c->bheight = height; + return true; + } + + // need to try a smaller line buffer... + c->bheight >>= 1; + } + + // can't fit even one line into our buffer. ouch! + return false; +} + +// returns true if there was data generated for this miplevel, false otherwise. +static rrbool gdraw_MipmapAddLines(GDrawMipmapContext *c, U32 level) +{ + U32 bw,bh; + + assert(level > 0); // doesn't make sense to call this on level 0 + if (level == 0 || level >= c->mipmaps) + return false; // this level doesn't exist + + bw = c->width >> level; // buffer width at this level + bh = c->bheight >> level; // buffer height at this level + + if (bh) { // we can still do regular downsampling + gdraw_Downsample(c->pixels[level], c->pitch[level], bw, bh, c->pixels[level-1], c->pitch[level-1], c->bpp); + return true; + } else if (c->height >> level) { // need to buffer partial lines, but still doing vertical 2:1 downsampling + if ((c->partial_row ^= (1 << level)) & (1 << level)) { // no buffered partial row for this miplevel yet, make one + memcpy(c->pixels[level], c->pixels[level-1], bw * 2 * c->bpp); + return false; + } else { // have one buffered row, can generate output pixels + gdraw_Downsample_2x2_line(c->pixels[level], c->pixels[level], c->pixels[level-1], bw, c->bpp); + return true; + } + } else { // finish off with a chain of Nx1 miplevels + gdraw_Downsample_2x1_line(c->pixels[level], c->pixels[level-1], bw, c->bpp); + return true; + } +} + +#endif // GDRAW_NO_STREAMING_MIPGEN + +#ifdef GDRAW_CHECK_BLOCK +static void check_block_alloc(gfx_allocator *alloc, void *ptr, rrbool allocated) +{ + int i,n=0,m=0; + for (i=0; i < GFXALLOC_HASH_SIZE; ++i) { + gfx_block_info *b = alloc->hash[i]; + while (b) { + if (b->ptr == ptr) + ++n; + b = b->next; + } + } + gfx_block_info *b = alloc->blocks[0].next; + while (b != &alloc->blocks[0]) { + if (b->ptr == ptr) + ++m; + b = b->next; + } + if (allocated) + assert(n == 1 && m == 0); + else + assert(n == 0 && m == 1); +} +#else +#define check_block_alloc(a,p,f) +#endif + +#ifdef GDRAW_BUFFER_RING + +//////////////////////////////////////////////////////////////////////// +// +// Buffer ring +// + +// Implements a dynamic buffer backed by multiple physical buffers, with +// the usual append-only, DISCARD/NOOVERWRITE semantics. +// +// This can be used for dynamic vertex buffers, constant buffers, etc. +#define GDRAW_BUFRING_MAXSEGS 4 // max number of backing segments + +typedef struct gdraw_bufring_seg { + struct gdraw_bufring_seg *next; // next segment in ring + U8 *data; // pointer to the allocation + GDrawFence fence; // fence for this segment + U32 used; // number of bytes used +} gdraw_bufring_seg; + +typedef struct gdraw_bufring { + gdraw_bufring_seg *cur; // active ring segment + U32 seg_size; // size of one segment + U32 align; // alignment of segment allocations + gdraw_bufring_seg all_segs[GDRAW_BUFRING_MAXSEGS]; +} gdraw_bufring; + +// forwards +static GDrawFence put_fence(); +static void wait_on_fence(GDrawFence fence); + +static void gdraw_bufring_init(gdraw_bufring * RADRESTRICT ring, void *ptr, U32 size, U32 nsegs, U32 align) +{ + U32 i, seg_size; + + ring->seg_size = 0; + if (!ptr || nsegs < 1 || size < nsegs * align) // bail if no ring buffer memory or too small + return; + + if (nsegs > GDRAW_BUFRING_MAXSEGS) + nsegs = GDRAW_BUFRING_MAXSEGS; + + // align needs to be a positive power of two + assert(align >= 1 && (align & (align - 1)) == 0); + + // buffer really needs to be properly aligned + assert(((UINTa)ptr & (align - 1)) == 0); + + seg_size = (size / nsegs) & ~(align - 1); + for (i=0; i < nsegs; ++i) { + ring->all_segs[i].next = &ring->all_segs[(i + 1) % nsegs]; + ring->all_segs[i].data = (U8 *) ptr + i * seg_size; + ring->all_segs[i].fence.value = 0; + ring->all_segs[i].used = 0; + } + + ring->cur = ring->all_segs; + ring->seg_size = seg_size; + ring->align = align; +} + +static void gdraw_bufring_shutdown(gdraw_bufring * RADRESTRICT ring) +{ + ring->cur = NULL; + ring->seg_size = 0; +} + +static void *gdraw_bufring_alloc(gdraw_bufring * RADRESTRICT ring, U32 size, U32 align) +{ + U32 align_up; + gdraw_bufring_seg *seg; + + if (size > ring->seg_size) + return NULL; // nope, won't fit + + assert(align <= ring->align); + + // check if it fits in the active segment first + seg = ring->cur; + align_up = (seg->used + align - 1) & -align; + + if ((align_up + size) <= ring->seg_size) { + void *ptr = seg->data + align_up; + seg->used = align_up + size; + return ptr; + } + + // doesn't fit, we have to start a new ring segment. + seg->fence = put_fence(); + + // switch to the next segment, wait till GPU is done with it + seg = ring->cur = seg->next; + wait_on_fence(seg->fence); + + // allocate from the new segment. we assume that segment offsets + // satisfy the highest alignment requirements we ever ask for! + seg->used = size; + return seg->data; +} + +#endif + +//////////////////////////////////////////////////////////////////////// +// +// General resource manager +// + +#ifndef GDRAW_FENCE_FLUSH +#define GDRAW_FENCE_FLUSH() +#endif + +#ifdef GDRAW_MANAGE_MEM +// functions the platform must implement +#ifndef GDRAW_BUFFER_RING // avoid "redundant redeclaration" warning +static void wait_on_fence(GDrawFence fence); +#endif +static rrbool is_fence_pending(GDrawFence fence); +static void gdraw_defragment_cache(GDrawHandleCache *c, GDrawStats *stats); + +// functions we implement +static void gdraw_res_reap(GDrawHandleCache *c, GDrawStats *stats); +#endif + +// If GDRAW_MANAGE_MEM is not #defined, this needs to perform the +// actual free using whatever API we're targeting. +// +// If GDRAW_MANAGE_MEM is #defined, the shared code handles the +// memory management part, but you might still need to update +// your state caching. +static void api_free_resource(GDrawHandle *r); + +// Actually frees a resource and releases all allocated resources +static void gdraw_res_free(GDrawHandle *r, GDrawStats *stats) +{ + assert(r->state == GDRAW_HANDLE_STATE_live || r->state == GDRAW_HANDLE_STATE_locked || r->state == GDRAW_HANDLE_STATE_dead || + r->state == GDRAW_HANDLE_STATE_pinned || r->state == GDRAW_HANDLE_STATE_user_owned); + +#ifdef GDRAW_MANAGE_MEM + GDRAW_FENCE_FLUSH(); + + // make sure resource isn't in use before we actually free the memory + wait_on_fence(r->fence); + if (r->raw_ptr) { +#ifndef GDRAW_MANAGE_MEM_TWOPOOL + gfxalloc_free(r->cache->alloc, r->raw_ptr); +#else + GDrawHandleCache *c = r->cache; + if (gfxalloc_mem_contains(c->alloc, r->raw_ptr)) + gfxalloc_free(c->alloc, r->raw_ptr); + else { + assert(gfxalloc_mem_contains(c->alloc_other, r->raw_ptr)); + gfxalloc_free(c->alloc_other, r->raw_ptr); + } +#endif + } +#endif + + api_free_resource(r); + + stats->nonzero_flags |= GDRAW_STATS_frees; + stats->freed_objects += 1; + stats->freed_bytes += r->bytes; + + gdraw_HandleCacheFree(r); +} + +// Frees the LRU resource in the given cache. +static rrbool gdraw_res_free_lru(GDrawHandleCache *c, GDrawStats *stats) +{ + GDrawHandle *r = gdraw_HandleCacheGetLRU(c); + if (!r) return false; + + if (c->is_vertex && r->owner) // check for r->owner since it may already be killed (if player destroyed first) + IggyDiscardVertexBufferCallback(r->owner, r); + + // was it referenced since end of previous frame (=in this frame)? + // if some, we're thrashing; report it to the user, but only once per frame. + if (c->prev_frame_end.value < r->fence.value && !c->is_thrashing) { + IggyGDrawSendWarning(NULL, c->is_vertex ? "GDraw Thrashing vertex memory" : "GDraw Thrashing texture memory"); + c->is_thrashing = true; + } + + gdraw_res_free(r, stats); + return true; +} + +static void gdraw_res_flush(GDrawHandleCache *c, GDrawStats *stats) +{ + c->is_thrashing = true; // prevents warnings being generated from free_lru + gdraw_HandleCacheUnlockAll(c); + while (gdraw_res_free_lru(c, stats)) + ; +} + +static GDrawHandle *gdraw_res_alloc_outofmem(GDrawHandleCache *c, GDrawHandle *t, char const *failed_type) +{ + if (t) + gdraw_HandleCacheAllocateFail(t); + IggyGDrawSendWarning(NULL, c->is_vertex ? "GDraw Out of static vertex buffer %s" : "GDraw Out of texture %s", failed_type); + return NULL; +} + +#ifndef GDRAW_MANAGE_MEM + +static GDrawHandle *gdraw_res_alloc_begin(GDrawHandleCache *c, S32 size, GDrawStats *stats) +{ + GDrawHandle *t; + if (size > c->total_bytes) + gdraw_res_alloc_outofmem(c, NULL, "memory (single resource larger than entire pool)"); + else { + // given how much data we're going to allocate, throw out + // data until there's "room" (this basically lets us use + // managed memory and just bound our usage, without actually + // packing it and being exact) + while (c->bytes_free < size) { + if (!gdraw_res_free_lru(c, stats)) { + gdraw_res_alloc_outofmem(c, NULL, "memory"); + break; + } + } + } + + // now try to allocate a handle + t = gdraw_HandleCacheAllocateBegin(c); + if (!t) { + // it's possible we have no free handles, because all handles + // are in use without exceeding the max storage above--in that + // case, just free one texture to give us a free handle (ideally + // we'd trade off cost of regenerating) + if (gdraw_res_free_lru(c, stats)) { + t = gdraw_HandleCacheAllocateBegin(c); + if (t == NULL) { + gdraw_res_alloc_outofmem(c, NULL, "handles"); + } + } + } + return t; +} + +#else + +// Returns whether this resource holds pointers to one of the GDraw-managed +// pools. +static rrbool gdraw_res_is_managed(GDrawHandle *r) +{ + return r->state == GDRAW_HANDLE_STATE_live || + r->state == GDRAW_HANDLE_STATE_locked || + r->state == GDRAW_HANDLE_STATE_dead || + r->state == GDRAW_HANDLE_STATE_pinned; +} + +// "Reaps" dead resources. Even if the user requests that a +// resource be freed, it might still be in use in a pending +// command buffer. So we can't free the associated memory +// immediately; instead, we flag the resource as "dead" and +// periodically check whether we can actually free the +// pending memory of dead resources ("reap" them). +static void gdraw_res_reap(GDrawHandleCache *c, GDrawStats *stats) +{ + GDrawHandle *sentinel = &c->state[GDRAW_HANDLE_STATE_dead]; + GDrawHandle *t; + GDRAW_FENCE_FLUSH(); + + // reap all dead resources that aren't in use anymore + while ((t = sentinel->next) != sentinel && !is_fence_pending(t->fence)) + gdraw_res_free(t, stats); +} + +// "Kills" a resource. This means GDraw won't use it anymore +// (it's dead), but there might still be outstanding references +// to it in a pending command buffer, so we can't physically +// free the associated memory until that's all processed. +static void gdraw_res_kill(GDrawHandle *r, GDrawStats *stats) +{ + GDRAW_FENCE_FLUSH(); // dead list is sorted by fence index - make sure all fence values are current. + + r->owner = NULL; + gdraw_HandleCacheInsertDead(r); + gdraw_res_reap(r->cache, stats); +} + +static GDrawHandle *gdraw_res_alloc_begin(GDrawHandleCache *c, S32 size, GDrawStats *stats) +{ + GDrawHandle *t; + void *ptr = NULL; + + gdraw_res_reap(c, stats); // NB this also does GDRAW_FENCE_FLUSH(); + if (size > c->total_bytes) + return gdraw_res_alloc_outofmem(c, NULL, "memory (single resource larger than entire pool)"); + + // now try to allocate a handle + t = gdraw_HandleCacheAllocateBegin(c); + if (!t) { + // it's possible we have no free handles, because all handles + // are in use without exceeding the max storage above--in that + // case, just free one texture to give us a free handle (ideally + // we'd trade off cost of regenerating) + gdraw_res_free_lru(c, stats); + t = gdraw_HandleCacheAllocateBegin(c); + if (!t) + return gdraw_res_alloc_outofmem(c, NULL, "handles"); + } + + // try to allocate first + if (size) { + ptr = gfxalloc_alloc(c->alloc, size); + if (!ptr) { + // doesn't currently fit. try to free some allocations to get space to breathe. + S32 want_free = RR_MAX(size + (size / 2), GDRAW_MIN_FREE_AMOUNT); + if (want_free > c->total_bytes) + want_free = size; // okay, *really* big resource, just try to allocate its real size + + // always keep freeing textures until want_free bytes are free. + while (c->alloc->actual_bytes_free < want_free) { + if (!gdraw_res_free_lru(c, stats)) + return gdraw_res_alloc_outofmem(c, t, "memory"); + } + + // now, keep trying to allocate and free some more memory when it still doesn't fit + while (!(ptr = gfxalloc_alloc(c->alloc, size))) { + if (c->alloc->actual_bytes_free >= 3 * size || // if we should have enough free bytes to satisfy the request by now + (c->alloc->actual_bytes_free >= size && size * 2 >= c->total_bytes)) // or the resource is very big and the alloc doesn't fit + { + // before we actually consider defragmenting, we want to free all stale resources (not + // referenced in the previous 2 frames). and if that frees up enough memory so we don't have + // to defragment, all the better! + // also, never defragment twice in a frame, just assume we're thrashing when we get in that + // situation and free up as much as possible. + if (!c->did_defragment && + c->prev_frame_start.value <= c->handle->fence.value) { + + // defragment. + defrag: + if (gdraw_CanDefragment(c)) { // only try defrag if it has a chance of helping. + gdraw_defragment_cache(c, stats); + c->did_defragment = true; + } + ptr = gfxalloc_alloc(c->alloc, size); + if (!ptr) + return gdraw_res_alloc_outofmem(c, t, "memory (fragmentation)"); + break; + } + } + + // keep trying to free some more + if (!gdraw_res_free_lru(c, stats)) { + if (c->alloc->actual_bytes_free >= size) // nothing left to free but we should be good - defrag again, even if it's the second time in a frame + goto defrag; + + return gdraw_res_alloc_outofmem(c, t, "memory"); + } + } + } + } + + t->fence.value = 0; // hasn't been used yet + t->raw_ptr = ptr; + return t; +} + +#endif diff --git a/Minecraft.Client/PSVita/Iggy/include/gdraw.h b/Minecraft.Client/PSVita/Iggy/include/gdraw.h new file mode 100644 index 00000000..404a2642 --- /dev/null +++ b/Minecraft.Client/PSVita/Iggy/include/gdraw.h @@ -0,0 +1,726 @@ +// gdraw.h - author: Sean Barrett - copyright 2009 RAD Game Tools +// +// This is the graphics rendering abstraction that Iggy is implemented +// on top of. + +#ifndef __RAD_INCLUDE_GDRAW_H__ +#define __RAD_INCLUDE_GDRAW_H__ + +#include "rrcore.h" + +#define IDOC + +RADDEFSTART + +//idoc(parent,GDrawAPI_Buffers) + +#ifndef IGGY_GDRAW_SHARED_TYPEDEF + + #define IGGY_GDRAW_SHARED_TYPEDEF + typedef struct GDrawFunctions GDrawFunctions; + + typedef struct GDrawTexture GDrawTexture; + +#endif//IGGY_GDRAW_SHARED_TYPEDEF + + + +IDOC typedef struct GDrawVertexBuffer GDrawVertexBuffer; +/* An opaque handle to an internal GDraw vertex buffer. */ + +//idoc(parent,GDrawAPI_Base) + +IDOC typedef struct gswf_recti +{ + S32 x0,y0; // Minimum corner of the rectangle + S32 x1,y1; // Maximum corner of the rectangle +} gswf_recti; +/* A 2D rectangle with integer coordinates specifying its minimum and maximum corners. */ + +IDOC typedef struct gswf_rectf +{ + F32 x0,y0; // Minimum corner of the rectangle + F32 x1,y1; // Maximum corner of the rectangle +} gswf_rectf; +/* A 2D rectangle with floating-point coordinates specifying its minimum and maximum corners. */ + +IDOC typedef struct gswf_matrix +{ + union { + F32 m[2][2]; // 2x2 transform matrix + struct { + F32 m00; // Alternate name for m[0][0], for coding convenience + F32 m01; // Alternate name for m[0][1], for coding convenience + F32 m10; // Alternate name for m[1][0], for coding convenience + F32 m11; // Alternate name for m[1][1], for coding convenience + }; + }; + F32 trans[2]; // 2D translation vector (the affine component of the matrix) +} gswf_matrix; +/* A 2D transform matrix plus a translation offset. */ + +#define GDRAW_STATS_batches 1 +#define GDRAW_STATS_blits 2 +#define GDRAW_STATS_alloc_tex 4 +#define GDRAW_STATS_frees 8 +#define GDRAW_STATS_defrag 16 +#define GDRAW_STATS_rendtarg 32 +#define GDRAW_STATS_clears 64 +IDOC typedef struct GDrawStats +{ + S16 nonzero_flags; // which of the fields below are non-zero + + U16 num_batches; // number of batches, e.g. DrawPrim, DrawPrimUP + U16 num_blits; // number of blit operations (resolve, msaa resolve, blend readback) + U16 freed_objects; // number of cached objects freed + U16 defrag_objects; // number of cached objects defragmented + U16 alloc_tex; // number of textures/buffers allocated + U16 rendertarget_changes; // number of rendertarget changes + U16 num_clears; + //0 mod 8 + + U32 drawn_indices; // number of indices drawn (3 times number of triangles) + U32 drawn_vertices; // number of unique vertices referenced + U32 num_blit_pixels;// number of pixels in blit operations + U32 alloc_tex_bytes;// number of bytes in textures/buffers allocated + U32 freed_bytes; // number of bytes in freed cached objects + U32 defrag_bytes; // number of bytes in defragmented cached objects + U32 cleared_pixels; // number of pixels cleared by clear operation + U32 reserved; + //0 mod 8 +} GDrawStats; +/* A structure with statistics information to show in resource browser/Telemetry */ + +//////////////////////////////////////////////////////////// +// +// Queries +// +//idoc(parent,GDrawAPI_Queries) + +IDOC typedef enum gdraw_bformat +{ + GDRAW_BFORMAT_vbib, // Platform uses vertex and index buffers + GDRAW_BFORMAT_wii_dlist, // Platform uses Wii-style display lists + GDRAW_BFORMAT_vbib_single_format, // Platform uses vertex and index buffers, but doesn't support multiple vertex formats in a single VB + + GDRAW_BFORMAT__count, +} gdraw_bformat; +/* Specifies what data format GDraw expects in MakeVertexBuffer_* and DrawIndexedTriangles. + + Most supported platforms prefer Vertex and Index buffers so that's what we use, + but this format turns out to be somewhat awkward for Wii, so we use the native + graphics processor display list format on that platform. */ + +IDOC typedef struct GDrawInfo +{ + S32 num_stencil_bits; // number of (possibly emulated) stencil buffer bits + U32 max_id; // number of unique values that can be easily encoded in zbuffer + U32 max_texture_size; // edge length of largest square texture supported by hardware + U32 buffer_format; // one of $gdraw_bformat + rrbool shared_depth_stencil; // does 0'th framebuffer share depth & stencil with others? (on GL it can't?) + rrbool always_mipmap; // if GDraw can generate mipmaps nearly for free, then set this flag + rrbool conditional_nonpow2; // non-pow2 textures supported, but only using clamp and without mipmaps + rrbool has_rendertargets; // if true, then there is no rendertarget stack support + rrbool no_nonpow2; // non-pow2 textures aren't supported at all +} GDrawInfo; // must be a multiple of 8 +/* $GDrawInfo contains the information that Iggy needs to know about + what a GDraw implementation supports and what limits it places on + certain important values. */ + +IDOC typedef void RADLINK gdraw_get_info(GDrawInfo *d); +/* Iggy queries this at the beginning of rendering to get information + about the viewport and the device capabilities. */ + +//////////////////////////////////////////////////////////// +// +// Drawing State +// +//idoc(parent,GDrawAPI_DrawingState) + +IDOC typedef enum gdraw_blend +{ + GDRAW_BLEND_none, // Directly copy + GDRAW_BLEND_alpha, // Use the source alpha channel to modulate its contribution + GDRAW_BLEND_multiply, // Multiply colors componentwise + GDRAW_BLEND_add, // Add the source and destination together + + GDRAW_BLEND_filter, // Uses a secondary $gdraw_filter specification to determine how to blend + GDRAW_BLEND_special, // Uses a secondary $gdraw_blendspecial specification to determine how to blend + + GDRAW_BLEND__count, +} gdraw_blend; +/* Identifier indicating the type of blending operation to use when rendering.*/ + +IDOC typedef enum gdraw_blendspecial +{ + GDRAW_BLENDSPECIAL_layer, // s + GDRAW_BLENDSPECIAL_multiply, // s*d + GDRAW_BLENDSPECIAL_screen, // sa*da - (da-d)*(sa-s) + GDRAW_BLENDSPECIAL_lighten, // max(sa*d,s*da) + GDRAW_BLENDSPECIAL_darken, // min(sa*d,s*da) + GDRAW_BLENDSPECIAL_add, // min(d+s,1.0) + GDRAW_BLENDSPECIAL_subtract, // max(d-s,0.0) + GDRAW_BLENDSPECIAL_difference, // abs(sa*d-s*da) + GDRAW_BLENDSPECIAL_invert, // sa*(da-d) + GDRAW_BLENDSPECIAL_overlay, // d < da/2.0 ? (2.0*s*d) : (sa*da - 2.0*(da-d)*(sa-s)) + GDRAW_BLENDSPECIAL_hardlight, // s < sa/2.0 ? (2.0*s*d) : (sa*da - 2.0*(da-d)*(sa-s)) + + // these do extra-special math on the output alpha + GDRAW_BLENDSPECIAL_erase, // d*(1.0-sa) + GDRAW_BLENDSPECIAL_alpha_special, // d*sa + + GDRAW_BLENDSPECIAL__count, +} gdraw_blendspecial; +/* Specifies a type of "special" blend mode, which is defined as one + that has to read from the framebuffer to compute its effect. + + These modes are only used with a 1-to-1 textured quad containing + the exact output data in premultiplied alpha. They all need to + read from the framebuffer to compute their effect, so a GDraw + implementation will usually need a custom path to handle that. + Users will not warn in advance whether you're going to need this + operation, so implementations either need to always render to a + texture in case it happens, or copy the framebuffer to a texture + when it does. + + Note that $(gdraw_blendspecial::GDRAW_BLENDSPECIAL_erase) and + $(gdraw_blendspecial::GDRAW_BLENDSPECIAL_alpha_special) are unique + among $gdraw_blendspecial modes in that they may not actually need + to be implemented with the destination input as a texture if + the destination buffer doesn't have an alpha channel. */ + +// (@OPTIMIZE: the last filter in each chain could be combined with +// the final blend, although only worth doing if the final blend is +// ALPHA/ADD/MULTIPLY--it's usually ALPHA though so worth doing!) +IDOC typedef enum gdraw_filter +{ + GDRAW_FILTER_blur, // Blurs the source image + GDRAW_FILTER_colormatrix, // Transform RGB pixel values by a matrix + GDRAW_FILTER_bevel, // Bevels the source image + GDRAW_FILTER_dropshadow, // Adds a dropshadow underneath the source image + + GDRAW_FILTER__count, +} gdraw_filter; +/* Specifies a type of post-processing graphics filter. + + These modes are only used to implement filter effects, and will + always be blending from a temporary buffer to another temporary + buffer with no blending, so in general they should not require + any additional input. +*/ + +IDOC typedef enum gdraw_texture +{ + GDRAW_TEXTURE_none, // No texture applied + GDRAW_TEXTURE_normal, // Texture is bitmap or linear gradient + GDRAW_TEXTURE_alpha, // Texture is an alpha-only font bitmap + GDRAW_TEXTURE_radial, // Texture is a radial gradient + GDRAW_TEXTURE_focal_gradient, // Texture is a "focal" radial gradient + GDRAW_TEXTURE_alpha_test, // Texture is an alpha-only font bitmap, alpha test for alpha >= 0.5 + + GDRAW_TEXTURE__count, +} gdraw_texture; +/* Specifies how to apply a texture while rendering. */ + +IDOC typedef enum gdraw_wrap +{ + GDRAW_WRAP_clamp, // Texture coordinates clamped to edges + GDRAW_WRAP_repeat, // Texture repeats periodically + GDRAW_WRAP_mirror, // Repeat periodically, mirror on odd repetititions + GDRAW_WRAP_clamp_to_border, // only used internally by some GDraws + + GDRAW_WRAP__count, +} gdraw_wrap; +/* Specifies what to do with texture coordinates outside [0,1]. */ + +typedef struct GDrawRenderState +{ + S32 id; // Object "identifier" used for high-quality AA mode + U32 test_id:1; // Whether to test zbuffer == id + U32 set_id:1; // Whether to set zbuffer == id + U32 use_world_space:1; // Whether primitive is defined in object space or world space + U32 scissor:1; // Whether rendering will be clipped to $(GDrawRenderState::scissor_rect) + U32 identical_state:1; // Whether state is identical to the one used for the previous draw call + U32 unused:27; + //aligned 0 mod 8 + + U8 texgen0_enabled; // Whether to use texgen for tex0 + U8 tex0_mode; // One of $gdraw_texture + U8 wrap0; // One of $gdraw_wrap + U8 nearest0; // Whether to sample texture 0 nearest neighbor + + U8 blend_mode; // One of $gdraw_blend + U8 special_blend; // One of $gdraw_blendspecial (used only if $(GDrawRenderState::blend_mode) == $(gdraw_blend::GDRAW_BLEND_special) + U8 filter; // One of $gdraw_filter (used only if $(GDrawRenderState::blend_mode) == $(gdraw_blend::GDRAW_BLEND_filter) + U8 filter_mode; // Used to select the right compositing operation for the $(gdraw_filter::GDRAW_FILTER_bevel) and $(gdraw_filter::GDRAW_FILTER_dropshadow) modes + //aligned 0 mod 8 + U8 stencil_test; // Only draw if these stencil bits are "set" + U8 stencil_set; // "Set" these stencil bits (note that actual implementation initializes stencil to 1, and "set" makes them 0) + + U8 reserved[2]; // Currently unused (used to make padding to 4/8-byte boundary for following pointer explicit) + S32 blur_passes; // For filters that include blurring, this is the number of box filter passes to run + //align 0 mod 8 + + S16 *cxf_add; // Color transform addition (discourage additive alpha!) + + GDrawTexture *tex[3]; // One or more textures to apply -- need 3 for gradient dropshadow. + //0 mod 8 + F32 *edge_matrix; // Screen to object space matrix (for edge antialiasing) + gswf_matrix *o2w; // Object-to-world matrix + + // --- Everything below this point must be manually initialized + + //0 mod 8 + F32 color[4]; // Color of the object + + //0 mod 8 + gswf_recti scissor_rect; // The rectangle to which rendering will be clipped if $(GDrawRenderState::scissor) is set + //0 mod 8 + // --- Everything below this point might be uninitialized if it's not used for this particular render state + + F32 s0_texgen[4]; // "s" (x) row of texgen matrix + F32 t0_texgen[4]; // "t" (y) row of texgen matrix + //0 mod 8 + F32 focal_point[4]; // Data used for $(gdraw_texgen_mode::GDRAW_TEXTURE_focal_gradient) + //0 mod 8 + F32 blur_x,blur_y; // The size of the box filter, where '1' is the identity and 2 adds half a pixel on each side + //0 mod 8 + F32 shader_data[20]; // Various data that depends on filter (e.g. drop shadow direction, color) +} GDrawRenderState; +/* Encapsulation of the entire drawing state that affects a rendering command. */ + +IDOC typedef void RADLINK gdraw_set_view_size_and_world_scale(S32 w, S32 h, F32 x_world_to_pixel, F32 y_world_to_pixel); +/* Sets the size of the rendering viewport and the world to pixel scaling. + + Iggy calls this function with the full size that the viewport would + be if it were rendered untiled, even if it will eventually be + rendered as a collection of smaller tiles. + + The world scale is used to compensate non-square pixel aspect ratios + when rendering wide lines. Both scale factors are 1 unless Iggy is + running on a display with non-square pixels. */ + +typedef void RADLINK gdraw_set_3d_transform(F32 *mat); /* mat[3][4] */ + +IDOC typedef void RADLINK gdraw_render_tile_begin(S32 tx0, S32 ty0, S32 tx1, S32 ty1, S32 pad, GDrawStats *stats); +/* Begins rendering of a sub-region of the rendered image. */ + +IDOC typedef void RADLINK gdraw_render_tile_end(GDrawStats *stats); +/* Ends rendering of a sub-region of the rendered image. */ + +IDOC typedef void RADLINK gdraw_rendering_begin(void); +/* Begins rendering; takes control of the graphics API. */ + +IDOC typedef void RADLINK gdraw_rendering_end(void); +/* Ends rendering; gives up control of the graphics API. */ + + +//////////////////////////////////////////////////////////// +// +// Drawing +// +//idoc(parent,GDrawAPI_Drawing) + +IDOC typedef void RADLINK gdraw_clear_stencil_bits(U32 bits); +/* Clears the 'bits' parts of the stencil value in the entire framebuffer to the default value. */ + +IDOC typedef void RADLINK gdraw_clear_id(void); +/* Clears the 'id' buffer, which is typically the z-buffer but can also be the stencil buffer. */ + +IDOC typedef void RADLINK gdraw_filter_quad(GDrawRenderState *r, S32 x0, S32 y0, S32 x1, S32 y1, GDrawStats *stats); +/* Draws a special quad in viewport-relative pixel space. + + May be normal, may be displaced by filters, etc. and require multiple passes, + may apply special blending (and require extra resolves/rendertargets) + for filter/blend., + + The x0,y0,x1,y1 always describes the "input" box. */ + +IDOC typedef struct GDrawPrimitive +{ + F32 *vertices; // Pointer to an array of $gswf_vertex_xy, $gswf_vertex_xyst, or $gswf_vertex_xyoffs + U16 *indices; // Pointer to an array of 16-bit indices into $(GDrawPrimitive::vertices) + + S32 num_vertices; // Count of elements in $(GDrawPrimitive::vertices) + S32 num_indices; // Count of elements in $(GDrawPrimitive::indices) + + S32 vertex_format; // One of $gdraw_vformat, specifying the type of element in $(GDrawPrimitive::vertices) + + U32 uniform_count; + F32 *uniforms; + + U8 drawprim_mode; +} GDrawPrimitive; +/* Specifies the vertex and index data necessary to draw a batch of graphics primitives. */ + +IDOC typedef void RADLINK gdraw_draw_indexed_triangles(GDrawRenderState *r, GDrawPrimitive *prim, GDrawVertexBuffer *buf, GDrawStats *stats); +/* Draws a collection of indexed triangles, ignoring special filters or blend modes. + + If buf is NULL, then the pointers in 'prim' are machine pointers, and + you need to make a copy of the data (note currently all triangles + implementing strokes (wide lines) go this path). + + If buf is non-NULL, then use the appropriate vertex buffer, and the + pointers in prim are actually offsets from the beginning of the + vertex buffer -- i.e. offset = (char*) prim->whatever - (char*) NULL; + (note there are separate spaces for vertices and indices; e.g. the + first mesh in a given vertex buffer will normally have a 0 offset + for the vertices and a 0 offset for the indices) +*/ + +IDOC typedef void RADLINK gdraw_set_antialias_texture(S32 width, U8 *rgba); +/* Specifies the 1D texture data to be used for the antialiasing gradients. + + 'rgba' specifies the pixel values in rgba byte order. This will only be called + once during initialization. */ + +//////////////////////////////////////////////////////////// +// +// Texture and Vertex Buffers +// +//idoc(parent,GDrawAPI_Buffers) + +IDOC typedef enum gdraw_texture_format +{ + // Platform-independent formats + GDRAW_TEXTURE_FORMAT_rgba32, // 32bpp RGBA data in platform-preferred byte order (returned by $gdraw_make_texture_begin as $gdraw_texture_type) + GDRAW_TEXTURE_FORMAT_font, // Alpha-only data with at least 4 bits/pixel. Data is submitted as 8 bits/pixel, conversion (if necessary) done by GDraw. + + // First platform-specific format index (for reference) + GDRAW_TEXTURE_FORMAT__platform = 16, + + // In the future, we will support platform-specific formats and add them to this list. +} gdraw_texture_format; +/* Describes the format of a texture submitted to GDraw. */ + +IDOC typedef enum gdraw_texture_type +{ + GDRAW_TEXTURE_TYPE_rgba, // Raw 4-channel packed texels, in OpenGL-standard order + GDRAW_TEXTURE_TYPE_bgra, // Raw 4-channel packed texels, in Direct3D-standard order + GDRAW_TEXTURE_TYPE_argb, // Raw 4-channel packed texels, in Flash native order + + GDRAW_TEXTURE_TYPE__count, +} gdraw_texture_type; +/* Describes the channel layout of a RGBA texture submitted to GDraw. */ + +IDOC typedef struct GDraw_MakeTexture_ProcessingInfo +{ + U8 *texture_data; // Pointer to the texture image bits + S32 num_rows; // Number of rows to upload in the current chunk + S32 stride_in_bytes; // Distance between a given pixel and the first pixel in the next row + S32 texture_type; // One of $gdraw_texture_type + + U32 temp_buffer_bytes; // Size of temp buffer in bytes + U8 *temp_buffer; // Temp buffer for GDraw to work in (used during mipmap creation) + + void *p0,*p1,*p2,*p3,*p4,*p5,*p6,*p7; // Pointers for GDraw to store data across "passes" (never touched by Iggy) + U32 i0, i1, i2, i3, i4, i5, i6, i7; // Integers for GDraw to store data across "passes" (never touched by Iggy) +} GDraw_MakeTexture_ProcessingInfo; +/* $GDraw_MakeTexture_ProcessingInfo is used when building a texture. */ + +IDOC typedef struct GDraw_Texture_Description { + S32 width; // Width of the texture in pixels + S32 height; // Height of the texture in pixels + U32 size_in_bytes; // Size of the texture in bytes +} GDraw_Texture_Description; +/* $GDraw_Texture_Description contains information about a texture. */ + +IDOC typedef U32 gdraw_maketexture_flags; +#define GDRAW_MAKETEXTURE_FLAGS_mipmap 1 IDOC // Generates mip-maps for the texture +#define GDRAW_MAKETEXTURE_FLAGS_updatable 2 IDOC // Set if the texture might be updated subsequent to its initial submission +#define GDRAW_MAKETEXTURE_FLAGS_never_flush 4 IDOC // Set to request that the texture never be flushed from the GDraw cache + +/* Flags that control the submission and management of GDraw textures. */ + +IDOC typedef void RADLINK gdraw_set_texture_unique_id(GDrawTexture *tex, void *old_unique_id, void *new_unique_id); +/* Changes unique id of a texture, only used for TextureSubstitution */ + +IDOC typedef rrbool RADLINK gdraw_make_texture_begin(void *unique_id, + S32 width, S32 height, gdraw_texture_format format, gdraw_maketexture_flags flags, + GDraw_MakeTexture_ProcessingInfo *output_info, GDrawStats *stats); +/* Begins specifying a new texture. + + $:unique_id Unique value specified by Iggy that you can use to identify a reference to the same texture even if its handle has been discarded + $:return Error code if there was a problem, IGGY_RESULT_OK otherwise +*/ + +IDOC typedef rrbool RADLINK gdraw_make_texture_more(GDraw_MakeTexture_ProcessingInfo *info); +/* Continues specifying a new texture. + + $:info The same handle initially passed to $gdraw_make_texture_begin + $:return True if specification can continue, false if specification must be aborted +*/ + +IDOC typedef GDrawTexture * RADLINK gdraw_make_texture_end(GDraw_MakeTexture_ProcessingInfo *info, GDrawStats *stats); +/* Ends specification of a new texture. + + $:info The same handle initially passed to $gdraw_make_texture_begin + $:return Handle for the newly created texture, or NULL if an error occured +*/ + +IDOC typedef rrbool RADLINK gdraw_update_texture_begin(GDrawTexture *tex, void *unique_id, GDrawStats *stats); +/* Begins updating a previously submitted texture. + + $:unique_id Must be the same value initially passed to $gdraw_make_texture_begin + $:return True on success, false otherwise and the texture must be recreated +*/ + +IDOC typedef void RADLINK gdraw_update_texture_rect(GDrawTexture *tex, void *unique_id, S32 x, S32 y, S32 stride, S32 w, S32 h, U8 *data, gdraw_texture_format format); +/* Updates a rectangle in a previously submitted texture. + + $:format Must be the $gdraw_texture_format that was originally passed to $gdraw_make_texture_begin for this texture. +*/ + +IDOC typedef void RADLINK gdraw_update_texture_end(GDrawTexture *tex, void *unique_id, GDrawStats *stats); +/* Ends an update to a previously submitted texture. + + $:unique_id Must be the same value initially passed to $gdraw_make_texture_begin (and hence $gdraw_update_texture_begin) +*/ + +IDOC typedef void RADLINK gdraw_describe_texture(GDrawTexture *tex, GDraw_Texture_Description *desc); +/* Returns a texture description for a given GDraw texture. */ + +IDOC typedef GDrawTexture * RADLINK gdraw_make_texture_from_resource(U8 *resource_file, S32 file_len, void *texture); +/* Loads a texture from a resource file and returns a wrapped pointer. */ + +IDOC typedef void RADLINK gdraw_free_texture_from_resource(GDrawTexture *tex); +/* Frees a texture created with gdraw_make_texture_from_resource. */ + + +IDOC typedef struct gswf_vertex_xy +{ + F32 x,y; // Position of the vertex +} gswf_vertex_xy; +/* A 2D point with floating-point position. */ + +IDOC typedef struct gswf_vertex_xyoffs +{ + F32 x,y; // Position of the vertex + + S16 aa; // Stroke/aa texcoord + S16 dx, dy; // Vector offset from the position, used for anti-aliasing (signed 11.5 fixed point) + S16 unused; +} gswf_vertex_xyoffs; +/* A 2D point with floating-point position, additional integer parameter, and integer anti-aliasing offset vector. */ + +IDOC typedef struct gswf_vertex_xyst +{ + F32 x,y; // Position of the vertex + F32 s,t; // Explicit texture coordinates for rectangles +} gswf_vertex_xyst; +/* A 2D point with floating-point position and texture coordinates. */ + +typedef int gdraw_verify_size_xy [sizeof(gswf_vertex_xy ) == 8 ? 1 : -1]; +typedef int gdraw_verify_size_xyoffs[sizeof(gswf_vertex_xyoffs) == 16 ? 1 : -1]; +typedef int gdraw_verify_size_xyst [sizeof(gswf_vertex_xyst ) == 16 ? 1 : -1]; + +IDOC typedef enum gdraw_vformat +{ + GDRAW_vformat_v2, // Indicates vertices of type $gswf_vertex_xy (8 bytes per vertex) + GDRAW_vformat_v2aa, // Indicates vertices of type $gswf_vertex_xyoffs (16 bytes per vertex) + GDRAW_vformat_v2tc2, // Indicates vertices of type $gswf_vertex_xyst (16 bytes per vertex) + + GDRAW_vformat__basic_count, + GDRAW_vformat_ihud1 = GDRAW_vformat__basic_count, // primary format for ihud, currently v2tc2mat4 (20 bytes per vertex) + + GDRAW_vformat__count, + GDRAW_vformat_mixed, // Special value that denotes a VB containing data in multiple vertex formats. Never used when drawing! +} gdraw_vformat; +/* Identifies one of the vertex data types. */ + +IDOC typedef struct GDraw_MakeVertexBuffer_ProcessingInfo +{ + U8 *vertex_data; // location to write vertex data + U8 *index_data; // location to write index data + + S32 vertex_data_length; // size of buffer to write vertex data + S32 index_data_length; // size of buffer to write index data + + void *p0,*p1,*p2,*p3,*p4,*p5,*p6,*p7; // Pointers for GDraw to store data across "passes" (never touched by Iggy) + U32 i0, i1, i2, i3, i4, i5, i6, i7; // Integers for GDraw to store data across "passes" (never touched by Iggy) +} GDraw_MakeVertexBuffer_ProcessingInfo; +/* $GDraw_MakeVertexBuffer_ProcessingInfo is used when building a vertex buffer. */ + +IDOC typedef struct GDraw_VertexBuffer_Description { + S32 size_in_bytes; // Size of the vertex buffer in bytes +} GDraw_VertexBuffer_Description; +/* $GDraw_VertexBuffer_Description contains information about a vertex buffer. */ + +IDOC typedef rrbool RADLINK gdraw_make_vertex_buffer_begin(void *unique_id, gdraw_vformat vformat, S32 vdata_len_in_bytes, S32 idata_len_in_bytes, GDraw_MakeVertexBuffer_ProcessingInfo *info, GDrawStats *stats); +/* Begins specifying a new vertex buffer. + + $:unique_id Unique value that identifies this texture, across potentially multiple flushes and re-creations of its $GDrawTexture handle in GDraw + $:vformat One of $gdraw_vformat, denoting the format of the vertex data submitted + $:return false if there was a problem, true if ok +*/ + +IDOC typedef rrbool RADLINK gdraw_make_vertex_buffer_more(GDraw_MakeVertexBuffer_ProcessingInfo *info); +/* Continues specifying a new vertex buffer. + + $:info The same handle initially passed to $gdraw_make_vertex_buffer_begin + $:return True if specification can continue, false if specification must be aborted +*/ + +IDOC typedef GDrawVertexBuffer * RADLINK gdraw_make_vertex_buffer_end(GDraw_MakeVertexBuffer_ProcessingInfo *info, GDrawStats *stats); +/* Ends specification of a new vertex buffer. + + $:info The same handle initially passed to $gdraw_make_texture_begin + $:return Handle for the newly created vertex buffer +*/ + +IDOC typedef void RADLINK gdraw_describe_vertex_buffer(GDrawVertexBuffer *buffer, GDraw_VertexBuffer_Description *desc); +/* Returns a description for a given GDrawVertexBuffer */ + + +IDOC typedef rrbool RADLINK gdraw_try_to_lock_texture(GDrawTexture *tex, void *unique_id, GDrawStats *stats); +/* Tells GDraw that a $GDrawTexture is going to be referenced. + + $:unique_id Must be the same value initially passed to $gdraw_make_texture_begin +*/ + +IDOC typedef rrbool RADLINK gdraw_try_to_lock_vertex_buffer(GDrawVertexBuffer *vb, void *unique_id, GDrawStats *stats); +/* Tells GDraw that a $GDrawVertexBuffer is going to be referenced. + + $:unique_id Must be the same value initially passed to $gdraw_make_vertex_buffer_begin +*/ + +IDOC typedef void RADLINK gdraw_unlock_handles(GDrawStats *stats); +/* Indicates that the user of GDraw will not try to reference anything without locking it again. + + Note that although a call to $gdraw_unlock_handles indicates that + all $GDrawTexture and $GDrawVertexBuffer handles that have had a + "unique_id" specified will no longer be referenced by the user of + GDraw, it does not affect those $GDrawTexture handles that were + created by $gdraw_start_texture_draw_buffer with a unique_id of 0. +*/ + +IDOC typedef void RADLINK gdraw_free_vertex_buffer(GDrawVertexBuffer *vb, void *unique_id, GDrawStats *stats); +/* Free a vertex buffer and invalidate the handle + + $:unique_id Must be the same value initially passed to $gdraw_make_vertex_buffer_begin +*/ + +IDOC typedef void RADLINK gdraw_free_texture(GDrawTexture *t, void *unique_id, GDrawStats *stats); +/* Free a texture and invalidate the handle. + + $:unique_id Must be the same value initially passed to $gdraw_make_texture_begin, or 0 for a texture created by $gdraw_end_texture_draw_buffer +*/ + +//////////////////////////////////////////////////////////// +// +// Render targets +// +//idoc(parent,GDrawAPI_Targets) + +IDOC typedef U32 gdraw_texturedrawbuffer_flags; +#define GDRAW_TEXTUREDRAWBUFFER_FLAGS_needs_color 1 IDOC // Tells GDraw that you will need the color channel when rendering a texture +#define GDRAW_TEXTUREDRAWBUFFER_FLAGS_needs_alpha 2 IDOC // Tells GDraw that you will need the alpha channel when rendering a texture +#define GDRAW_TEXTUREDRAWBUFFER_FLAGS_needs_stencil 4 IDOC // Tells GDraw that you will need the stencil channel when rendering a texture +#define GDRAW_TEXTUREDRAWBUFFER_FLAGS_needs_id 8 IDOC // Tells GDraw that you will need the id channel when rendering a texture + +/* Flags that control rendering to a texture. */ + +IDOC typedef rrbool RADLINK gdraw_texture_draw_buffer_begin(gswf_recti *region, gdraw_texture_format format, gdraw_texturedrawbuffer_flags flags, void *unique_id, GDrawStats *stats); +/* Starts rendering all GDraw commands to a new texture. + + Creates a rendertarget with destination alpha, initializes to all 0s and prepares to render into it +*/ + + +IDOC typedef GDrawTexture * RADLINK gdraw_texture_draw_buffer_end(GDrawStats *stats); +/* Ends rendering GDraw commands to a texture, and returns the texture created. + + You can get the size of the resulting texture with $gdraw_query_texture_size. +*/ + +//////////////////////////////////////////////////////////// +// +// Masking +// +//idoc(parent,GDrawAPI_Masking) + +IDOC typedef void RADLINK gdraw_draw_mask_begin(gswf_recti *region, S32 mask_bit, GDrawStats *stats); +/* Start a masking operation on the given region for the specified mask bit. + + For most drivers, no special preparation is necessary to start masking, so this is a no-op. +*/ + +IDOC typedef void RADLINK gdraw_draw_mask_end(gswf_recti *region, S32 mask_bit, GDrawStats *stats); +/* End a masking operation on the given region for the specified mask bit. + + For most drivers, no special preparation is necessary to end masking, so this is a no-op. +*/ + +//////////////////////////////////////////////////////////// +// +// GDraw API Function table +// +//idoc(parent,GDrawAPI_Base) + +IDOC struct GDrawFunctions +{ + // queries + gdraw_get_info *GetInfo; + + // drawing state + gdraw_set_view_size_and_world_scale * SetViewSizeAndWorldScale; + gdraw_render_tile_begin * RenderTileBegin; + gdraw_render_tile_end * RenderTileEnd; + gdraw_set_antialias_texture * SetAntialiasTexture; + + // drawing + gdraw_clear_stencil_bits * ClearStencilBits; + gdraw_clear_id * ClearID; + gdraw_filter_quad * FilterQuad; + gdraw_draw_indexed_triangles * DrawIndexedTriangles; + gdraw_make_texture_begin * MakeTextureBegin; + gdraw_make_texture_more * MakeTextureMore; + gdraw_make_texture_end * MakeTextureEnd; + gdraw_make_vertex_buffer_begin * MakeVertexBufferBegin; + gdraw_make_vertex_buffer_more * MakeVertexBufferMore; + gdraw_make_vertex_buffer_end * MakeVertexBufferEnd; + gdraw_try_to_lock_texture * TryToLockTexture; + gdraw_try_to_lock_vertex_buffer * TryToLockVertexBuffer; + gdraw_unlock_handles * UnlockHandles; + gdraw_free_texture * FreeTexture; + gdraw_free_vertex_buffer * FreeVertexBuffer; + gdraw_update_texture_begin * UpdateTextureBegin; + gdraw_update_texture_rect * UpdateTextureRect; + gdraw_update_texture_end * UpdateTextureEnd; + + // rendertargets + gdraw_texture_draw_buffer_begin * TextureDrawBufferBegin; + gdraw_texture_draw_buffer_end * TextureDrawBufferEnd; + + gdraw_describe_texture * DescribeTexture; + gdraw_describe_vertex_buffer * DescribeVertexBuffer; + + // new functions are always added at the end, so these have no structure + gdraw_set_texture_unique_id * SetTextureUniqueID; + + gdraw_draw_mask_begin * DrawMaskBegin; + gdraw_draw_mask_end * DrawMaskEnd; + + gdraw_rendering_begin * RenderingBegin; + gdraw_rendering_end * RenderingEnd; + + gdraw_make_texture_from_resource * MakeTextureFromResource; + gdraw_free_texture_from_resource * FreeTextureFromResource; + + gdraw_set_3d_transform * Set3DTransform; +}; +/* The function interface called by Iggy to render graphics on all + platforms. + + So that Iggy can integrate with the widest possible variety of + rendering scenarios, all of its renderer-specific drawing calls + go through this table of function pointers. This allows you + to dynamically configure which of RAD's supplied drawing layers + you wish to use, or to integrate it directly into your own + renderer by implementing your own versions of the drawing + functions Iggy requires. +*/ + +RADDEFEND + +#endif diff --git a/Minecraft.Client/PSVita/Iggy/include/iggy.h b/Minecraft.Client/PSVita/Iggy/include/iggy.h new file mode 100644 index 00000000..56638a32 --- /dev/null +++ b/Minecraft.Client/PSVita/Iggy/include/iggy.h @@ -0,0 +1,1295 @@ +// Iggy -- Copyright 2008-2013 RAD Game Tools + +#ifndef __RAD_INCLUDE_IGGY_H__ +#define __RAD_INCLUDE_IGGY_H__ + +#include // size_t + +#define IggyVersion "1.2.30" +#define IggyFlashVersion "9,1,2,30" + +#include "rrcore.h" // base data types, macros + +RADDEFSTART + +#ifndef IGGY_GDRAW_SHARED_TYPEDEF + + #define IGGY_GDRAW_SHARED_TYPEDEF + + typedef struct GDrawFunctions GDrawFunctions; + typedef struct GDrawTexture GDrawTexture; + +#endif//IGGY_GDRAW_SHARED_TYPEDEF + +#define IDOCN // Used by documentation generation system + +//////////////////////////////////////////////////////////// +// +// Basic Operations +// + +typedef enum IggyResult +{ + IGGY_RESULT_SUCCESS = 0, + + IGGY_RESULT_Warning_None = 0, + + IGGY_RESULT_Warning_Misc = 100, + IGGY_RESULT_Warning_GDraw = 101, + IGGY_RESULT_Warning_ProgramFlow = 102, + IGGY_RESULT_Warning_Actionscript = 103, + IGGY_RESULT_Warning_Graphics = 104, + IGGY_RESULT_Warning_Font = 105, + IGGY_RESULT_Warning_Timeline = 106, + IGGY_RESULT_Warning_Library = 107, + IGGY_RESULT_Warning_ValuePath = 108, + IGGY_RESULT_Warning_Audio = 109, + + IGGY_RESULT_Warning_CannotSustainFrameRate = 201, // During a call to $IggyPlayerReadyToTick, Iggy detected that its rendering of a Flash file was not keeping up with the frame rate requested. + IGGY_RESULT_Warning_ThrewException = 202, + + IGGY_RESULT_Error_Threshhold = 400, + + IGGY_RESULT_Error_Misc = 400, // an uncategorized error + IGGY_RESULT_Error_GDraw = 401, // an error occured in GDraw + IGGY_RESULT_Error_ProgramFlow = 402, // an error occured with the user's program flow through the Iggy API (e.g. reentrancy issues) + IGGY_RESULT_Error_Actionscript = 403, // an error occurred in Actionscript processing + IGGY_RESULT_Error_Graphics = 404, + IGGY_RESULT_Error_Font = 405, + IGGY_RESULT_Error_Create = 406, + IGGY_RESULT_Error_Library = 407, + IGGY_RESULT_Error_ValuePath = 408, // an error occurred while processing a ValuePath + IGGY_RESULT_Error_Audio = 409, + + IGGY_RESULT_Error_Internal = 499, + + IGGY_RESULT_Error_InvalidIggy = 501, + IGGY_RESULT_Error_InvalidArgument = 502, + IGGY_RESULT_Error_InvalidEntity = 503, + IGGY_RESULT_Error_UndefinedEntity = 504, + + IGGY_RESULT_Error_OutOfMemory = 1001, // Iggy ran out of memory while processing the SWF. The Iggy player is now invalid and you cannot do anything further with it (except read AS3 variables). Should this happen, you'll want to $IggyPlayerDestroy and reopen the $Iggy. +} IggyResult; + +typedef enum IggyDatatype +{ + IGGY_DATATYPE__invalid_request, // Set only when there is an error + + IGGY_DATATYPE_undefined, // Undefined data type + IGGY_DATATYPE_null, // No data type + IGGY_DATATYPE_boolean, // Data of type rrbool + + IGGY_DATATYPE_number, // Data of type F64 + IGGY_DATATYPE_string_UTF8, // Data of type $IggyStringUTF8 + IGGY_DATATYPE_string_UTF16, // Data of type $IggyStringUTF16 + IGGY_DATATYPE_fastname, // Only used when calling functions (avoids a copy operation) + IGGY_DATATYPE_valuepath, // Only used when calling functions + IGGY_DATATYPE_valueref, // Only used when calling functions + + // the following datatypes can be queried, but cannot appear + // as function arguments + + IGGY_DATATYPE_array, // Data of type Array in AS3 (appears in datatype query, never as arguments) + IGGY_DATATYPE_object, // Data of type Object (or a subclass) in AS3 (appears in datatype query, never as arguments) + IGGY_DATATYPE_displayobj, // Data of type DisplayObject (or a subclass) in AS3 (only appears in callbacks) + + IGGY_DATATYPE_xml, // Data of type XML or XMLList in AS3 (appears in datatype query, never as arguments) + + // the following datatypes also exists, but you can't access any data + // from within them. we give you the exact type for e.g. debugging + IGGY_DATATYPE_namespace, // Data of type Namespace in AS3 (appears in datatype query, never as arguments) + IGGY_DATATYPE_qname, // Data of type QName in AS3 (appears in datatype query, never as arguments) + IGGY_DATATYPE_function, // Data of type Function in AS3 (appears in datatype query, never as arguments) + IGGY_DATATYPE_class, // Data of type Class in AS3 (appears in datatype query, never as arguments) +} IggyDatatype; +/* Describes an AS3 datatype visible through iggy interface. */ + +#ifdef __RADWIN__ +#include +IDOCN typedef wchar_t IggyUTF16; +#else +typedef unsigned short IggyUTF16; +#endif + +typedef struct IggyStringUTF16 +{ + IggyUTF16 *string; // Null-terminated, UTF16-encoded characters + S32 length; // Count of 16-bit characters in string, not including the null terminator +} IggyStringUTF16; + +typedef struct IggyStringUTF8 +{ + char *string; // Null-terminated, UTF8-encoded characters + S32 length; // Count of 8-bit bytes in string, not including the null terminator +} IggyStringUTF8; + +typedef UINTa IggyName; +typedef struct IggyValuePath IggyValuePath; +typedef void *IggyValueRef; +typedef UINTa IggyTempRef; + +typedef struct IggyDataValue +{ + S32 type; // an $IggyDatatype which determines which of the union members is valid. + #ifdef __RAD64__ + S32 padding; + #endif + IggyTempRef temp_ref; // An opaque temporary reference which you can efficiently turn into an $IggyValueRef; this is written by Iggy on callbacks but never read by Iggy + union { + IggyStringUTF16 string16; // A UTF16 string, valid if type = $(IggyDatatype::IGGY_DATATYPE_string_UTF16) + IggyStringUTF8 string8; // A UTF8 string, valid if type = $(IggyDatatype::IGGY_DATATYPE_string_UTF8) + F64 number; // A 64-bit floating point number (a double); valid if type = $(IggyDatatype::IGGY_DATATYPE_number) + rrbool boolval; // A boolean value, valid if type = $(IggyDatatype::IGGY_DATATYPE_boolean) + IggyName fastname; // A fast name, valid if type = $(IggyDatatype::IGGY_DATATYPE_fastname); this is only an "in" type; Iggy will never define these itself + void * userdata; // A userdata pointer from a DisplayObject, valid if type = $(IggyDatatype::IGGY_DATATYPE_displayobj) + IggyValuePath * valuepath;// A path to an object in the AS3 VM, valid if type = $(IggyDatatype::IGGY_DATATYPE_valuepath); this is only an "in" type--Iggy will never output this + IggyValueRef valueref; // An IggyValueRef, valid if type = $(IggyDatatype::IGGY_DATATYPE_valueref); this is only an "in" type--Iggy will never output this + }; +} IggyDataValue; + +typedef struct IggyExternalFunctionCallUTF16 +{ + IggyStringUTF16 function_name; // The name of the function + S32 num_arguments; // The number of arguments that must be passed to the function + S32 padding; + IggyDataValue arguments[1]; // The argument types, assumed to contain num_arguments elements +} IggyExternalFunctionCallUTF16; + +typedef struct IggyExternalFunctionCallUTF8 +{ + IggyStringUTF8 function_name; // The name of the function + S32 num_arguments; // The number of arguments that must be passed to the function + S32 padding; + IggyDataValue arguments[1]; // The argument types, assumed to contain num_arguments elements +} IggyExternalFunctionCallUTF8; + +typedef void * RADLINK Iggy_AllocateFunction(void *alloc_callback_user_data, size_t size_requested, size_t *size_returned); +typedef void RADLINK Iggy_DeallocateFunction(void *alloc_callback_user_data, void *ptr); + +typedef struct IggyAllocator +{ + void *user_callback_data; + Iggy_AllocateFunction *mem_alloc; + Iggy_DeallocateFunction *mem_free; + #ifndef __RAD64__ + void *struct_padding; // pad to 8-byte boundary + #endif +} IggyAllocator; + +RADEXPFUNC void RADEXPLINK IggyInit(IggyAllocator *allocator); +RADEXPFUNC void RADEXPLINK IggyShutdown(void); + +typedef enum IggyConfigureBoolName +{ + IGGY_CONFIGURE_BOOL_StartupExceptionsAreWarnings, // if true, ActionScript exceptions thrown during startup will not prevent Iggy from being created (default false) + IGGY_CONFIGURE_BOOL_IgnoreFlashVersion, + IGGY_CONFIGURE_BOOL_NeverDelayGotoProcessing, + IGGY_CONFIGURE_BOOL_SuppressAntialiasingOnAllBitmaps, + IGGY_CONFIGURE_BOOL_SuppressAntialiasingOn9SliceBitmaps, +} IggyConfigureBoolName; + +RADEXPFUNC void RADEXPLINK IggyConfigureBool(IggyConfigureBoolName prop, rrbool value); + +typedef enum +{ + IGGY_VERSION_1_0_21 = 1, // behavior from 1.0.21 and earlier + IGGY_VERSION_1_0_24 = 3, // behavior from 1.0.24 and earlier + IGGY_VERSION_1_1_1 = 5, // behavior from 1.1.1 and earlier + IGGY_VERSION_1_1_8 = 7, // behavior from 1.1.8 and earlier + IGGY_VERSION_1_2_28 = 9, // behavior from 1.2.28 and earlier + IGGY_VERSION_default=0x7fffffff, // default (current) Iggy behavior +} IggyVersionNumber; + +typedef enum +{ + IGGY_VERSIONED_BEHAVIOR_movieclip_gotoand=128, // This changes the behavior of AS3 gotoAndPlay and gotoAndStop. Valid values: IGGY_VERSION_1_0_21, IGGY_VERSION_default + IGGY_VERSIONED_BEHAVIOR_textfield_position=129, // This changes the behavior of textfield positioning as reported by AS3 getBounds/getRect and width/height. Values with different behavior: IGGY_VERSION_1_0_24, IGGY_VERSION_default. + IGGY_VERSIONED_BEHAVIOR_bitmap_smoothing=130, + IGGY_VERSIONED_BEHAVIOR_textfield_autoscroll=131, // This makes textfield autoscrolling behave specially: Valid values: IGGY_VERSION_1_1_8, IGGY_VERSION_default + IGGY_VERSIONED_BEHAVIOR_fast_text_effects=132, // This fixes the behavior of fast text effects to be in the correct direction; Valid values: IGGY_VERSION_1_2_28, IGGY_VERSION_default +} IggyVersionedBehaviorName; + +RADEXPFUNC void RADEXPLINK IggyConfigureVersionedBehavior(IggyVersionedBehaviorName prop, IggyVersionNumber value); + +typedef enum IggyTelemetryAmount +{ + IGGY_TELEMETRY_normal, // Normal amount for users debugging applications using Iggy + IGGY_TELEMETRY_internal, // Shows more internal details, useful when optimizing Iggy itself +} IggyTelemetryAmount; + +RADEXPFUNC void RADEXPLINK IggyUseTmLite(void * context, IggyTelemetryAmount amount); +RADEXPFUNC void RADEXPLINK IggyUseTelemetry(void * context, IggyTelemetryAmount amount); + +//////////////////////////////////////////////////////////// +// +// Translation +// + + +typedef struct +{ + IggyUTF16 *object_name; /* null-terminated Textfield.name value at the time the text is set */ + rrbool autosize; /* true if the autosize value is non-zero at the time the text is set */ + F32 width; /* the objectspace width of the textfield at the time the text is set */ + F32 height; /* the objectspace height of the textfield at the time the text is set */ + rrbool is_html_text; /* whether the provided text is going through Textfield.htmlText or Textfield.text */ +} IggyTextfieldInfo; + +typedef void RADLINK Iggy_TranslationFreeFunction(void *callback_data, void *data, S32 length); +typedef rrbool RADLINK Iggy_TranslateFunctionUTF16(void *callback_data, IggyStringUTF16 *src, IggyStringUTF16 *dest); +typedef rrbool RADLINK Iggy_TranslateFunctionUTF8(void *callback_data, IggyStringUTF8 *src, IggyStringUTF8 *dest); +typedef rrbool RADLINK Iggy_TextfieldTranslateFunctionUTF16(void *callback_data, IggyStringUTF16 *src, IggyStringUTF16 *dest, IggyTextfieldInfo *textfield); +typedef rrbool RADLINK Iggy_TextfieldTranslateFunctionUTF8(void *callback_data, IggyStringUTF8 *src, IggyStringUTF8 *dest, IggyTextfieldInfo *textfield); + +RADEXPFUNC void RADEXPLINK IggySetLoadtimeTranslationFunction(Iggy_TranslateFunctionUTF16 *func, void *callback_data, Iggy_TranslationFreeFunction *freefunc, void *free_callback_data); +RADEXPFUNC void RADEXPLINK IggySetLoadtimeTranslationFunctionUTF16(Iggy_TranslateFunctionUTF16 *func, void *callback_data, Iggy_TranslationFreeFunction *freefunc, void *free_callback_data); +RADEXPFUNC void RADEXPLINK IggySetLoadtimeTranslationFunctionUTF8(Iggy_TranslateFunctionUTF8 *func, void *callback_data, Iggy_TranslationFreeFunction *freefunc, void *free_callback_data); +RADEXPFUNC void RADEXPLINK IggySetRuntimeTranslationFunction(Iggy_TranslateFunctionUTF16 *func, void *callback_data, Iggy_TranslationFreeFunction *freefunc, void *free_callback_data); +RADEXPFUNC void RADEXPLINK IggySetRuntimeTranslationFunctionUTF16(Iggy_TranslateFunctionUTF16 *func, void *callback_data, Iggy_TranslationFreeFunction *freefunc, void *free_callback_data); +RADEXPFUNC void RADEXPLINK IggySetRuntimeTranslationFunctionUTF8(Iggy_TranslateFunctionUTF8 *func, void *callback_data, Iggy_TranslationFreeFunction *freefunc, void *free_callback_data); +RADEXPFUNC void RADEXPLINK IggySetTextfieldTranslationFunctionUTF16(Iggy_TextfieldTranslateFunctionUTF16 *func, void *callback_data, Iggy_TranslationFreeFunction *freefunc, void *free_callback_data); +RADEXPFUNC void RADEXPLINK IggySetTextfieldTranslationFunctionUTF8(Iggy_TextfieldTranslateFunctionUTF8 *func, void *callback_data, Iggy_TranslationFreeFunction *freefunc, void *free_callback_data); + +typedef enum +{ + IGGY_LANG_default, + IGGY_LANG_ja, + IGGY_LANG_ja_flash, // more strictly matches Flash +} IggyLanguageCode; + +RADEXPFUNC void RADEXPLINK IggySetLanguage(IggyLanguageCode lang); + +//////////////////////////////////////////////////////////// +// +// Playback +// + +typedef struct Iggy Iggy; +typedef S32 IggyLibrary; + +typedef void RADLINK Iggy_TraceFunctionUTF16(void *user_callback_data, Iggy *player, IggyUTF16 const *utf16_string, S32 length_in_16bit_chars); +typedef void RADLINK Iggy_TraceFunctionUTF8(void *user_callback_data, Iggy *player, char const *utf8_string, S32 length_in_bytes); +typedef void RADLINK Iggy_WarningFunction(void *user_callback_data, Iggy *player, IggyResult error_code, char const *error_message); + +typedef struct +{ + S32 total_storage_in_bytes; // the total memory to use for the AS3 heap and garbage collector + S32 stack_size_in_bytes; // size of the stack used for AS3 expression evaluation and function activation records + S32 young_heap_size_in_bytes; // size of the heap from which initial allocations are made + S32 old_heap_size_in_bytes; // this parameter is not supported yet + S32 remembered_set_size_in_bytes; // storage used to keep track of pointers from old heap to young heap + S32 greylist_size_in_bytes; // storage used to keep track of partially-garbage collected objects on the old heap + S32 rootstack_size_in_bytes; // size of the stack used for exposing temporaries to the garbage collector + S32 padding; +} IggyPlayerGCSizes; + +typedef struct +{ + IggyAllocator allocator; + IggyPlayerGCSizes gc; + char *filename; + char *user_name; + rrbool load_in_place; + rrbool did_load_in_place; +} IggyPlayerConfig; + +RADEXPFUNC Iggy * RADEXPLINK IggyPlayerCreateFromFileAndPlay( + char const * filename, + IggyPlayerConfig const*config); + +RADEXPFUNC Iggy * RADEXPLINK IggyPlayerCreateFromMemory( + void const * data, + U32 data_size_in_bytes, + IggyPlayerConfig *config); + +#define IGGY_INVALID_LIBRARY -1 + +RADEXPFUNC IggyLibrary RADEXPLINK IggyLibraryCreateFromMemory( + char const * url_utf8_null_terminated, + void const * data, + U32 data_size_in_bytes, + IggyPlayerConfig *config); + +RADEXPFUNC IggyLibrary RADEXPLINK IggyLibraryCreateFromMemoryUTF16( + IggyUTF16 const * url_utf16_null_terminated, + void const * data, + U32 data_size_in_bytes, + IggyPlayerConfig *config); + +RADEXPFUNC void RADEXPLINK IggyPlayerDestroy(Iggy *player); +RADEXPFUNC void RADEXPLINK IggyLibraryDestroy(IggyLibrary lib); +RADEXPFUNC void RADEXPLINK IggySetWarningCallback(Iggy_WarningFunction *error, void *user_callback_data); +RADEXPFUNC void RADEXPLINK IggySetTraceCallbackUTF8(Iggy_TraceFunctionUTF8 *trace_utf8, void *user_callback_data); +RADEXPFUNC void RADEXPLINK IggySetTraceCallbackUTF16(Iggy_TraceFunctionUTF16 *trace_utf16, void *user_callback_data); + +typedef struct IggyProperties +{ + S32 movie_width_in_pixels; // the width of the "document" specified in the SWF file + S32 movie_height_in_pixels; // the height of the "document" specified in the SWF file + + F32 movie_frame_rate_current_in_fps; // the current frame rate Iggy is trying to achieve for the file + F32 movie_frame_rate_from_file_in_fps; // the frame rate specified in the SWF file + + S32 frames_passed; // the number of times Tick() has been called + S32 swf_major_version_number; // the major SWF version number of the file, currently always 9 + + F64 time_passed_in_seconds; // the total time passed since starting the file + F64 seconds_since_last_tick; // the number of seconds that have ocurred + F64 seconds_per_drawn_frame; // 1/render fps, updated on $IggyPlayerDrawTilesStart +} IggyProperties; + +RADEXPFUNC IggyProperties * RADEXPLINK IggyPlayerProperties(Iggy *player); + +typedef enum +{ + IGGY_PAUSE_continue_audio, + IGGY_PAUSE_pause_audio, + IGGY_PAUSE_stop_audio +} IggyAudioPauseMode; + +RADEXPFUNC void * RADEXPLINK IggyPlayerGetUserdata(Iggy *player); +RADEXPFUNC void RADEXPLINK IggyPlayerSetUserdata(Iggy *player, void *userdata); + +RADEXPFUNC void RADEXPLINK IggyPlayerInitializeAndTickRS(Iggy *player); +RADEXPFUNC rrbool RADEXPLINK IggyPlayerReadyToTick(Iggy *player); +RADEXPFUNC void RADEXPLINK IggyPlayerTickRS(Iggy *player); +RADEXPFUNC void RADEXPLINK IggyPlayerPause(Iggy *player, IggyAudioPauseMode pause_audio); +RADEXPFUNC void RADEXPLINK IggyPlayerPlay(Iggy *player); +RADEXPFUNC void RADEXPLINK IggyPlayerSetFrameRate(Iggy *player, F32 frame_rate_in_fps); +RADEXPFUNC void RADEXPLINK IggyPlayerGotoFrameRS(Iggy *f, S32 frame, rrbool stop); + +#ifndef __RAD_HIGGYEXP_ +#define __RAD_HIGGYEXP_ +typedef void * HIGGYEXP; +/* An IggyExplorer context, it represents a connection to Iggy Explorer. */ +#endif + +#ifndef __RAD_HIGGYPERFMON_ +#define __RAD_HIGGYPERFMON_ +typedef void * HIGGYPERFMON; +/* An IggyPerfMon context */ +#endif + + +IDOCN typedef void RADLINK iggyexp_detach_callback(void *ptr); + +IDOCN typedef struct +{ + U64 tick_ticks; + U64 draw_ticks; +} IggyPerfmonStats; + +IDOCN typedef struct +{ + void (RADLINK *get_stats)(Iggy* swf, IggyPerfmonStats* pdest); + const char* (RADLINK *get_display_name)(Iggy* swf); +} IggyForPerfmonFunctions; + +// This is used by both Iggy Explorer and Perfmon +IDOCN typedef struct +{ + rrbool (RADLINK *connection_valid)(Iggy* swf, HIGGYEXP iggyexp); // Iggy queries this to check if Iggy Explorer is still connected + S32 (RADLINK *poll_command)(Iggy* swf, HIGGYEXP iggyexp, U8 **buffer); // stores command in *buffer, returns number of bytes + void (RADLINK *send_command)(Iggy* swf, HIGGYEXP iggyexp, U8 command, void *buffer, S32 len); // writes a command with a payload of buffer:len + S32 (RADLINK *get_storage)(Iggy* swf, HIGGYEXP iggyexp, U8 **buffer); // returns temporary storage Iggy can use for assembling commands + rrbool (RADLINK *attach)(Iggy* swf, HIGGYEXP iggyexp, iggyexp_detach_callback *cb, void *cbdata, IggyForPerfmonFunctions* pmf); // an Iggy file is trying to attach itself to this connection (one at a time) + rrbool (RADLINK *detach)(Iggy* swf, HIGGYEXP iggyexp); // the current Iggy file should be detached (generate callback) + void (RADLINK *draw_tile_hook)(Iggy* swf, HIGGYEXP iggyexp, GDrawFunctions* iggy_gdraw); // only used by perfmon +} IggyExpFunctions; + +RADEXPFUNC void RADEXPLINK IggyInstallPerfmon(void *perfmon_context); + +RADEXPFUNC void RADEXPLINK IggyUseExplorer(Iggy *swf, void *context); +IDOCN RADEXPFUNC void RADEXPLINK IggyPlayerSendFrameToExplorer(Iggy *f); + +//////////////////////////////////////////////////////////// +// +// Fonts +// + +typedef struct +{ + F32 ascent; + F32 descent; + F32 line_gap; + F32 average_glyph_width_for_tab_stops; // for embedded fonts, Iggy uses width of 'g' + F32 largest_glyph_bbox_y1; +} IggyFontMetrics; + +typedef struct +{ + F32 x0,y0, x1,y1; // bounding box + F32 advance; // distance to move origin after this character +} IggyGlyphMetrics; + +typedef enum { + IGGY_VERTEX_move = 1, + IGGY_VERTEX_line = 2, + IGGY_VERTEX_curve = 3, +} IggyShapeVertexType; + +typedef struct +{ + F32 x,y; // if IGGY_VERTEX_move, point to start a new loop; if IGGY_VERTEX_line/curve, endpoint of segment + F32 cx,cy; // if IGGY_VERTEX_curve, control point on segment; ignored otherwise + U8 type; // value from $IggyShapeVertexType + + S8 padding; // ignore + U16 f0; // set to 1 + U16 f1; // set to 0 + U16 line; // ignore +} IggyShapeVertex; + +typedef struct +{ + IggyShapeVertex * vertices; + S32 num_vertices; + void * user_context_for_free; // you can use this to store data to access on the corresponding free call +} IggyVectorShape; + +typedef struct +{ + U8 *pixels_one_per_byte; // pixels from the top left, 0 is transparent and 255 is opaque + S32 width_in_pixels; // this is the actual width of the bitmap data + S32 height_in_pixels; // this is the actual height of the bitmap data + S32 stride_in_bytes; // the distance from one row to the next + S32 oversample; // this is the amount of oversampling (0 or 1 = not oversample, 2 = 2x oversampled, 4 = 4x oversampled) + rrbool point_sample; // if true, the bitmap will be drawn with point sampling; if false, it will be drawn with bilinear + S32 top_left_x; // the offset of the top left corner from the character origin + S32 top_left_y; // the offset of the top left corner from the character origin + F32 pixel_scale_correct; // the pixel_scale at which this character should be displayed at width_in_pixels + F32 pixel_scale_min; // the smallest pixel_scale to allow using this character (scaled down) + F32 pixel_scale_max; // the largest pixels cale to allow using this character (scaled up) + void * user_context_for_free; // you can use this to store data to access on the corresponding free call +} IggyBitmapCharacter; + +typedef IggyFontMetrics * RADLINK IggyFontGetFontMetrics(void *user_context, IggyFontMetrics *metrics); + +#define IGGY_GLYPH_INVALID -1 +typedef S32 RADLINK IggyFontGetCodepointGlyph(void *user_context, U32 codepoint); +typedef IggyGlyphMetrics * RADLINK IggyFontGetGlyphMetrics(void *user_context, S32 glyph, IggyGlyphMetrics *metrics); +typedef rrbool RADLINK IggyFontIsGlyphEmpty(void *user_context, S32 glyph); +typedef F32 RADLINK IggyFontGetKerningForGlyphPair(void *user_context, S32 first_glyph, S32 second_glyph); + +typedef void RADLINK IggyVectorFontGetGlyphShape(void *user_context, S32 glyph, IggyVectorShape *shape); +typedef void RADLINK IggyVectorFontFreeGlyphShape(void *user_context, S32 glyph, IggyVectorShape *shape); + +typedef rrbool RADLINK IggyBitmapFontCanProvideBitmap(void *user_context, S32 glyph, F32 pixel_scale); +typedef rrbool RADLINK IggyBitmapFontGetGlyphBitmap(void *user_context, S32 glyph, F32 pixel_scale, IggyBitmapCharacter *bitmap); +typedef void RADLINK IggyBitmapFontFreeGlyphBitmap(void *user_context, S32 glyph, F32 pixel_scale, IggyBitmapCharacter *bitmap); + + +typedef struct +{ + IggyFontGetFontMetrics *get_font_metrics; + + IggyFontGetCodepointGlyph *get_glyph_for_codepoint; + IggyFontGetGlyphMetrics *get_glyph_metrics; + IggyFontIsGlyphEmpty *is_empty; + IggyFontGetKerningForGlyphPair *get_kerning; + + IggyVectorFontGetGlyphShape *get_shape; + IggyVectorFontFreeGlyphShape *free_shape; + + S32 num_glyphs; + + void *userdata; +} IggyVectorFontProvider; + +typedef struct +{ + IggyFontGetFontMetrics *get_font_metrics; + + IggyFontGetCodepointGlyph *get_glyph_for_codepoint; + IggyFontGetGlyphMetrics *get_glyph_metrics; + IggyFontIsGlyphEmpty *is_empty; + IggyFontGetKerningForGlyphPair *get_kerning; + + IggyBitmapFontCanProvideBitmap *can_bitmap; + IggyBitmapFontGetGlyphBitmap *get_bitmap; + IggyBitmapFontFreeGlyphBitmap *free_bitmap; + + S32 num_glyphs; + + void *userdata; +} IggyBitmapFontProvider; + +typedef struct +{ + IggyBitmapFontCanProvideBitmap *can_bitmap; + IggyBitmapFontGetGlyphBitmap *get_bitmap; + IggyBitmapFontFreeGlyphBitmap *free_bitmap; + void *userdata; +} IggyBitmapFontOverride; + +RADEXPFUNC void RADEXPLINK IggySetInstalledFontMaxCount(S32 num); +RADEXPFUNC void RADEXPLINK IggySetIndirectFontMaxCount(S32 num); + +#define IGGY_FONTFLAG_none 0 +#define IGGY_FONTFLAG_bold 1 +#define IGGY_FONTFLAG_italic 2 +#define IGGY_FONTFLAG_all (~0U) // indirection only + +#define IGGY_TTC_INDEX_none 0 + +RADEXPFUNC void RADEXPLINK IggyFontInstallTruetypeUTF8(const void *truetype_storage, S32 ttc_index, const char *fontname, S32 namelen_in_bytes, U32 fontflags); +RADEXPFUNC void RADEXPLINK IggyFontInstallTruetypeUTF16(const void *truetype_storage, S32 ttc_index, const U16 *fontname, S32 namelen_in_16bit_quantities, U32 fontflags); +RADEXPFUNC void RADEXPLINK IggyFontInstallTruetypeFallbackCodepointUTF8(const char *fontname, S32 len, U32 fontflags, S32 fallback_codepoint); +RADEXPFUNC void RADEXPLINK IggyFontInstallTruetypeFallbackCodepointUTF16(const U16 *fontname, S32 len, U32 fontflags, S32 fallback_codepoint); +RADEXPFUNC void RADEXPLINK IggyFontInstallVectorUTF8(const IggyVectorFontProvider *vfp, const char *fontname, S32 namelen_in_bytes, U32 fontflags); +RADEXPFUNC void RADEXPLINK IggyFontInstallVectorUTF16(const IggyVectorFontProvider *vfp, const U16 *fontname, S32 namelen_in_16bit_quantities, U32 fontflags); +RADEXPFUNC void RADEXPLINK IggyFontInstallBitmapUTF8(const IggyBitmapFontProvider *bmf, const char *fontname, S32 namelen_in_bytes, U32 fontflags); +RADEXPFUNC void RADEXPLINK IggyFontInstallBitmapUTF16(const IggyBitmapFontProvider *bmf, const U16 *fontname, S32 namelen_in_16bit_quantities, U32 fontflags); +RADEXPFUNC void RADEXPLINK IggyFontInstallBitmapOverrideUTF8(const IggyBitmapFontOverride *bmf, const char *fontname, S32 namelen_in_bytes, U32 fontflags); +RADEXPFUNC void RADEXPLINK IggyFontInstallBitmapOverrideUTF16(const IggyBitmapFontOverride *bmf, const U16 *fontname, S32 namelen_in_16bit_quantities, U32 fontflags); + +RADEXPFUNC void RADEXPLINK IggyFontRemoveUTF8(const char *fontname, S32 namelen_in_bytes, U32 fontflags); +RADEXPFUNC void RADEXPLINK IggyFontRemoveUTF16(const U16 *fontname, S32 namelen_in_16bit_quantities, U32 fontflags); + +RADEXPFUNC void RADEXPLINK IggyFontSetIndirectUTF8(const char *request_name, S32 request_namelen, U32 request_flags, const char *result_name, S32 result_namelen, U32 result_flags); +RADEXPFUNC void RADEXPLINK IggyFontSetIndirectUTF16(const U16 *request_name, S32 request_namelen, U32 request_flags, const U16 *result_name, S32 result_namelen, U32 result_flags); + +RADEXPFUNC void RADEXPLINK IggyFontSetFallbackFontUTF8(const char *fontname, S32 fontname_len, U32 fontflags); +RADEXPFUNC void RADEXPLINK IggyFontSetFallbackFontUTF16(const U16 *fontname, S32 fontname_len, U32 fontflags); + +//////////////////////////////////////////////////////////// +// +// Audio +// + +struct _RadSoundSystem; +IDOCN typedef S32 (*IGGYSND_OPEN_FUNC)(struct _RadSoundSystem* i_SoundSystem, U32 i_MinBufferSizeInMs, U32 i_Frequency, U32 i_ChannelCount, U32 i_MaxLockSize, U32 i_Flags); + +IDOCN RADEXPFUNC void RADEXPLINK IggyAudioSetDriver(IGGYSND_OPEN_FUNC driver_open, U32 flags); + +// These functions cause Iggy to use a specific audio API, most of which +// are only actually defined on one target platform. Probably, you'll just +// want to call IggyAudioUseDefault. + +IDOCN RADEXPFUNC void RADEXPLINK IggyAudioUseDirectSound(void); +IDOCN RADEXPFUNC void RADEXPLINK IggyAudioUseWaveOut(void); +IDOCN RADEXPFUNC void RADEXPLINK IggyAudioUseXAudio2(void); +IDOCN RADEXPFUNC void RADEXPLINK IggyAudioUseLibAudio(void); +IDOCN RADEXPFUNC void RADEXPLINK IggyAudioUseAX(void); +IDOCN RADEXPFUNC void RADEXPLINK IggyAudioUseCoreAudio(void); + +RADEXPFUNC void RADEXPLINK IggyAudioUseDefault(void); + +#ifndef __RAD_DEFINE_IGGYMP3__ +#define __RAD_DEFINE_IGGYMP3__ +IDOCN typedef struct IggyMP3Interface IggyMP3Interface; +IDOCN typedef rrbool IggyGetMP3Decoder(IggyMP3Interface *decoder); +#endif + +#ifdef __RADNT__ + RADEXPFUNC void RADEXPLINK IggyAudioInstallMP3Decoder(void); + RADEXPFUNC void RADEXPLINK IggySetDLLDirectory(char *path); + RADEXPFUNC void RADEXPLINK IggySetDLLDirectoryW(wchar_t *path); +#else + // this is overkill for non-DLL implementations, which could call into Iggy + // directly, but it means everything goes through the same indirection internally + IDOCN RADEXPFUNC IggyGetMP3Decoder* RADEXPLINK IggyAudioGetMP3Decoder(void); + IDOCN RADEXPFUNC void RADEXPLINK IggyAudioInstallMP3DecoderExplicit(IggyGetMP3Decoder *init); + + #define IggyAudioInstallMP3Decoder() \ + IggyAudioInstallMP3DecoderExplicit(IggyAudioGetMP3Decoder()) IDOCN +#endif + +RADEXPFUNC rrbool RADEXPLINK IggyAudioSetMaxBufferTime(S32 ms); +RADEXPFUNC void RADEXPLINK IggyAudioSetLatency(S32 ms); +RADEXPFUNC void RADEXPLINK IggyPlayerSetAudioVolume(Iggy *iggy, F32 attenuation); + +#define IGGY_AUDIODEVICE_default 0 +#define IGGY_AUDIODEVICE_primary 1 +#define IGGY_AUDIODEVICE_secondary 2 + +IDOCN RADEXPFUNC void RADEXPLINK IggyPlayerSetAudioDevice(Iggy *iggy, S32 device); + + +//////////////////////////////////////////////////////////// +// +// Rendering +// + +typedef struct IggyCustomDrawCallbackRegion +{ + IggyUTF16 *name; // the name of the DisplayObject being substituted + F32 x0, y0, x1, y1; // the bounding box of the original DisplayObject, in object space + F32 rgba_mul[4]; // any multiplicative color effect specified for the DisplayObject or its parents + F32 rgba_add[4]; // any additive color effect specified for the DisplayObject or its parents + S32 scissor_x0, scissor_y0, scissor_x1, scissor_y1; // optional scissor rect box + U8 scissor_enable; // if non-zero, clip to the scissor rect + U8 stencil_func_mask; // D3DRS_STENCILMASK or equivalent + U8 stencil_func_ref; // D3DRS_STENCILREF or equivalent + U8 stencil_write_mask; // if non-zero, D3DRS_STENCILWRITEMASK or equivalent + struct gswf_matrix *o2w; // Iggy object-to-world matrix (used internally) +} IggyCustomDrawCallbackRegion; + +typedef void RADLINK Iggy_CustomDrawCallback(void *user_callback_data, Iggy *player, IggyCustomDrawCallbackRegion *Region); +typedef GDrawTexture* RADLINK Iggy_TextureSubstitutionCreateCallback(void *user_callback_data, IggyUTF16 *texture_name, S32 *width, S32 *height, void **destroy_callback_data); +typedef void RADLINK Iggy_TextureSubstitutionDestroyCallback(void *user_callback_data, void *destroy_callback_data, GDrawTexture *handle); +typedef GDrawTexture* RADLINK Iggy_TextureSubstitutionCreateCallbackUTF8(void *user_callback_data, char *texture_name, S32 *width, S32 *height, void **destroy_callback_data); + +RADEXPFUNC void RADEXPLINK IggySetCustomDrawCallback(Iggy_CustomDrawCallback *custom_draw, void *user_callback_data); +RADEXPFUNC void RADEXPLINK IggySetTextureSubstitutionCallbacks(Iggy_TextureSubstitutionCreateCallback *texture_create, Iggy_TextureSubstitutionDestroyCallback *texture_destroy, void *user_callback_data); +RADEXPFUNC void RADEXPLINK IggySetTextureSubstitutionCallbacksUTF8(Iggy_TextureSubstitutionCreateCallbackUTF8 *texture_create, Iggy_TextureSubstitutionDestroyCallback *texture_destroy, void *user_callback_data); + +typedef enum { + IGGY_FLUSH_no_callback, // do not generate the $Iggy_TextureSubstitutionDestroyCallback + IGGY_FLUSH_destroy_callback, // do generate the $Iggy_TextureSubstitutionDestroyCallback +} IggyTextureSubstitutionFlushMode; + +RADEXPFUNC void RADEXPLINK IggyTextureSubstitutionFlush(GDrawTexture *handle, IggyTextureSubstitutionFlushMode do_destroy_callback); +RADEXPFUNC void RADEXPLINK IggyTextureSubstitutionFlushAll(IggyTextureSubstitutionFlushMode do_destroy_callback); + +RADEXPFUNC void RADEXPLINK IggySetGDraw(GDrawFunctions *gdraw); +RADEXPFUNC void RADEXPLINK IggyPlayerGetBackgroundColor(Iggy *player, F32 output_color[3]); + +typedef enum +{ + IGGY_ROTATION_0_degrees = 0, + IGGY_ROTATION_90_degrees_counterclockwise = 1, + IGGY_ROTATION_180_degrees = 2, + IGGY_ROTATION_90_degrees_clockwise = 3, +} Iggy90DegreeRotation; + +RADEXPFUNC void RADEXPLINK IggyPlayerSetDisplaySize(Iggy *f, S32 w, S32 h); +RADEXPFUNC void RADEXPLINK IggyPlayerSetPixelShape(Iggy *swf, F32 pixel_x, F32 pixel_y); +RADEXPFUNC void RADEXPLINK IggyPlayerSetStageRotation(Iggy *f, Iggy90DegreeRotation rot); +RADEXPFUNC void RADEXPLINK IggyPlayerDraw(Iggy *f); +RADEXPFUNC void RADEXPLINK IggyPlayerSetStageSize(Iggy *f, S32 w, S32 h); +RADEXPFUNC void RADEXPLINK IggyPlayerSetFaux3DStage(Iggy *f, F32 *top_left, F32 *top_right, F32 *bottom_left, F32 *bottom_right, F32 depth_scale); +RADEXPFUNC void RADEXPLINK IggyPlayerForceMipmaps(Iggy *f, rrbool force_mipmaps); + +RADEXPFUNC void RADEXPLINK IggyPlayerDrawTile(Iggy *f, S32 x0, S32 y0, S32 x1, S32 y1, S32 padding); +RADEXPFUNC void RADEXPLINK IggyPlayerDrawTilesStart(Iggy *f); +RADEXPFUNC void RADEXPLINK IggyPlayerDrawTilesEnd(Iggy *f); +RADEXPFUNC void RADEXPLINK IggyPlayerSetRootTransform(Iggy *f, F32 mat[4], F32 tx, F32 ty); +RADEXPFUNC void RADEXPLINK IggyPlayerFlushAll(Iggy *player); +RADEXPFUNC void RADEXPLINK IggyLibraryFlushAll(IggyLibrary h); +RADEXPFUNC void RADEXPLINK IggySetTextCursorPixelWidth(S32 width); +RADEXPFUNC void RADEXPLINK IggyForceBitmapSmoothing(rrbool force_on); +RADEXPFUNC void RADEXPLINK IggyFlushInstalledFonts(void); +RADEXPFUNC void RADEXPLINK IggyFastTextFilterEffects(rrbool enable); + +typedef enum IggyAntialiasing +{ + IGGY_ANTIALIASING_FontsOnly = 2, // Anti-aliasing of bitmapped fonts only + IGGY_ANTIALIASING_FontsAndLinesOnly = 4, // Anti-aliasing of fonts and lines, but nothing else + IGGY_ANTIALIASING_PrettyGood = 8, // High-quality anti-aliasing on everything, but no rendertargets required + IGGY_ANTIALIASING_Good = 10, // High-quality anti-aliasing on everything (on platforms where GDraw doesn't support rendertargets, such as the Wii, this behaves the same as PrettyGood) +} IggyAntialiasing; + +RADEXPFUNC void RADEXPLINK IggyPlayerSetAntialiasing(Iggy *f, IggyAntialiasing antialias_mode); + +RADEXPFUNC void RADEXPLINK IggyPlayerSetBitmapFontCaching( + Iggy *f, + S32 tex_w, + S32 tex_h, + S32 max_char_pix_width, + S32 max_char_pix_height); + +RADEXPFUNC void RADEXPLINK IggySetFontCachingCalculationBuffer( + S32 max_chars, + void *optional_temp_buffer, + S32 optional_temp_buffer_size_in_bytes); + +typedef struct IggyGeneric IggyGeneric; + +RADEXPFUNC IggyGeneric * RADEXPLINK IggyPlayerGetGeneric(Iggy *player); +RADEXPFUNC IggyGeneric * RADEXPLINK IggyLibraryGetGeneric(IggyLibrary lib); + +// each texture metadata block contains one of these, where +// texture_info is an array of per-format data +IDOCN typedef struct +{ + U16 num_textures; + U16 load_alignment_log2; + U32 texture_file_size; + void *texture_info; +} IggyTextureResourceMetadata; + +RADEXPFUNC void RADEXPLINK IggyGenericInstallResourceFile(IggyGeneric *g, void *data, S32 data_length, rrbool *can_free_now); +RADEXPFUNC IggyTextureResourceMetadata *RADEXPLINK IggyGenericGetTextureResourceMetadata(IggyGeneric *f); +RADEXPFUNC void RADEXPLINK IggyGenericSetTextureFromResource(IggyGeneric *f, U16 id, GDrawTexture *handle); + +// this is the encoding for the "raw" texture type, which doesn't +// depend on any platform headers +typedef enum +{ + IFT_FORMAT_rgba_8888, + IFT_FORMAT_rgba_4444_LE, + IFT_FORMAT_rgba_5551_LE, + IFT_FORMAT_la_88, + IFT_FORMAT_la_44, + IFT_FORMAT_i_8, + IFT_FORMAT_i_4, + IFT_FORMAT_l_8, + IFT_FORMAT_l_4, + IFT_FORMAT_DXT1, + IFT_FORMAT_DXT3, + IFT_FORMAT_DXT5, +} IggyFileTexture_Format; + +typedef struct +{ + U32 file_offset; + U8 format; + U8 mipmaps; + U16 w,h; + U16 swf_id; +} IggyFileTextureRaw; + +IDOCN typedef struct +{ + U32 file_offset; + U16 swf_id; + U16 padding; + struct { + U32 data[13]; + } texture; +} IggyFileTexture360; + +IDOCN typedef struct +{ + U32 file_offset; + U16 swf_id; + U8 format; + U8 padding; + struct { + U32 data[6]; + } texture; +} IggyFileTexturePS3; + +IDOCN typedef struct +{ + U32 file_offset1; + U32 file_offset2; + U16 swf_id; + U8 format; + U8 padding; + struct { + U32 data1[39]; + } texture; +} IggyFileTextureWiiu; + +IDOCN typedef struct +{ + U32 file_offset; + U16 swf_id; + U8 format; + U8 padding; + struct { + U32 data[8]; + } texture; +} IggyFileTexturePS4; + +IDOCN typedef struct +{ + U32 file_offset; + U16 swf_id; + U8 format; + U8 padding; + struct { + U32 format; + U32 type; + U16 width; + U16 height; + U8 mip_count; + U8 pad[3]; + } texture; +} IggyFileTexturePSP2; + +//////////////////////////////////////////////////////////// +// +// AS3 +// + +typedef rrbool RADLINK Iggy_AS3ExternalFunctionUTF8(void *user_callback_data, Iggy *player, IggyExternalFunctionCallUTF8 *call); +typedef rrbool RADLINK Iggy_AS3ExternalFunctionUTF16(void *user_callback_data, Iggy *player, IggyExternalFunctionCallUTF16 *call); + +RADEXPFUNC void RADEXPLINK IggySetAS3ExternalFunctionCallbackUTF8(Iggy_AS3ExternalFunctionUTF8 *as3_external_function_utf8, void *user_callback_data); +RADEXPFUNC void RADEXPLINK IggySetAS3ExternalFunctionCallbackUTF16(Iggy_AS3ExternalFunctionUTF16 *as3_external_function_utf16, void *user_callback_data); +RADEXPFUNC IggyName RADEXPLINK IggyPlayerCreateFastName(Iggy *f, IggyUTF16 const *name, S32 len); +RADEXPFUNC IggyName RADEXPLINK IggyPlayerCreateFastNameUTF8(Iggy *f, char const *name, S32 len); +RADEXPFUNC IggyResult RADEXPLINK IggyPlayerCallFunctionRS(Iggy *player, IggyDataValue *result, IggyName function, S32 numargs, IggyDataValue *args); +RADEXPFUNC IggyResult RADEXPLINK IggyPlayerCallMethodRS(Iggy *f, IggyDataValue *result, IggyValuePath *target, IggyName methodname, S32 numargs, IggyDataValue *args); +RADEXPFUNC void RADEXPLINK IggyPlayerGarbageCollect(Iggy *player, S32 strength); + +#define IGGY_GC_MINIMAL 0 +#define IGGY_GC_NORMAL 30 +#define IGGY_GC_MAXIMAL 100 + +typedef struct +{ + U32 young_heap_size; // the size of the young heap is the smaller of this number and the size the young heap was originally allocated when the Iggy was created + U32 base_old_amount; // the base number of words to process on each minor cycle, default 200 + F32 old_heap_fraction; // the fraction 0..1 (default 0.125) of the outstanding allocations from the last major GC cycle to traverse during one GC cycle + F32 new_allocation_multiplier; // a number from 1..infinity (default 2) which is the amount of the allocations in the last cycle to traverse + F32 sweep_multiplier; // a positive number (default 2) which weights the amount of data swept vs marked +} IggyGarbageCollectorControl; + +typedef enum +{ + IGGY_GC_EVENT_tenure, + IGGY_GC_EVENT_mark_increment, + IGGY_GC_EVENT_mark_roots, + IGGY_GC_EVENT_sweep_finalize, + IGGY_GC_EVENT_sweep_increment, + IGGY_GC_WARNING_greylist_overflow, // the grey list overflowed, increase the size of $(IggyPlayerGCSizes::greylist_size_in_bytes). + IGGY_GC_WARNING_remembered_overflow, // the remembered set overflowed, increase the size of $(IggyPlayerGCSizes::remembered_set_size_in_bytes). +} IggyGarbageCollectionEvent; + +typedef struct +{ + U64 event_time_in_microseconds; + U64 total_marked_bytes; // total bytes ever marked by the GC + U64 total_swept_bytes; // total bytes ever swept by the GC + U64 total_allocated_bytes; // total bytes ever allocated from the old heap + U64 total_gc_time_in_microseconds; // total time spent in GC while notify callback was active + + char *name; + + IggyGarbageCollectionEvent event; // the type of garbage collection event that was just performed + + U32 increment_processing_bytes; // the number of bytes that were processed in that event + + U32 last_slice_tenured_bytes; // the number of bytes that were tenured from young-to-old heap since the previous GC step + U32 last_slice_old_allocation_bytes; // the number of bytes that were tenured or were directly allocated from the old heap since the previous GC step + + U32 heap_used_bytes; // the number of bytes in use in the old heap (the young heap is empty) + U32 heap_size_bytes; // the number of bytes allocated for the old heap + + U32 onstage_display_objects; // the number of on-stage display objects (MovieClips, TextFields, Shapes, etc) visited during tenuring only + U32 offstage_display_objects; // the number of off-stage display objects visited during tenuring only +} IggyGarbageCollectionInfo; + +typedef void RADLINK Iggy_GarbageCollectionCallback(Iggy *player, IggyGarbageCollectionInfo *info); +RADEXPFUNC void RADEXPLINK IggyPlayerConfigureGCBehavior(Iggy *player, Iggy_GarbageCollectionCallback *notify_callack, IggyGarbageCollectorControl *control); +RADEXPFUNC void RADEXPLINK IggyPlayerQueryGCSizes(Iggy *player, IggyPlayerGCSizes *sizes); + +RADEXPFUNC rrbool RADEXPLINK IggyPlayerGetValid(Iggy *f); + +IDOCN struct IggyValuePath +{ + Iggy *f; + IggyValuePath *parent; + //align 0 mod 8 + IggyName name; + IggyValueRef ref; + //align 0 mod 8 + S32 index; + S32 type; + //align 0 mod 8 +}; + +typedef enum +{ + IGGY_ValueRef, + IGGY_ValueRef_Weak, +} IggyValueRefType; + +RADEXPFUNC rrbool RADEXPLINK IggyValueRefCheck(IggyValueRef ref); +RADEXPFUNC void RADEXPLINK IggyValueRefFree(Iggy *p, IggyValueRef ref); +RADEXPFUNC IggyValueRef RADEXPLINK IggyValueRefFromPath(IggyValuePath *var, IggyValueRefType reftype); +RADEXPFUNC rrbool RADEXPLINK IggyIsValueRefSameObjectAsTempRef(IggyValueRef value_ref, IggyTempRef temp_ref); +RADEXPFUNC rrbool RADEXPLINK IggyIsValueRefSameObjectAsValuePath(IggyValueRef value_ref, IggyValuePath *path, IggyName sub_name, char const *sub_name_utf8); +RADEXPFUNC void RADEXPLINK IggySetValueRefLimit(Iggy *f, S32 max_value_refs); +RADEXPFUNC S32 RADEXPLINK IggyDebugGetNumValueRef(Iggy *f); +RADEXPFUNC IggyValueRef RADEXPLINK IggyValueRefCreateArray(Iggy *f, S32 num_slots); +RADEXPFUNC IggyValueRef RADEXPLINK IggyValueRefCreateEmptyObject(Iggy *f); +RADEXPFUNC IggyValueRef RADEXPLINK IggyValueRefFromTempRef(Iggy *f, IggyTempRef temp_ref, IggyValueRefType reftype); + +RADEXPFUNC IggyValuePath * RADEXPLINK IggyPlayerRootPath(Iggy *f); +RADEXPFUNC IggyValuePath * RADEXPLINK IggyPlayerCallbackResultPath(Iggy *f); +RADEXPFUNC rrbool RADEXPLINK IggyValuePathMakeNameRef(IggyValuePath *result, IggyValuePath *parent, char const *text_utf8); +RADEXPFUNC void RADEXPLINK IggyValuePathFromRef(IggyValuePath *result, Iggy *iggy, IggyValueRef ref); + +RADEXPFUNC void RADEXPLINK IggyValuePathMakeNameRefFast(IggyValuePath *result, IggyValuePath *parent, IggyName name); +RADEXPFUNC void RADEXPLINK IggyValuePathMakeArrayRef(IggyValuePath *result, IggyValuePath *array_path, int array_index); + +RADEXPFUNC void RADEXPLINK IggyValuePathSetParent(IggyValuePath *result, IggyValuePath *new_parent); +RADEXPFUNC void RADEXPLINK IggyValuePathSetArrayIndex(IggyValuePath *result, int new_index); + +RADEXPFUNC void RADEXPLINK IggyValuePathSetName(IggyValuePath *result, IggyName name); +RADEXPFUNC IggyResult RADEXPLINK IggyValueGetTypeRS(IggyValuePath *var, IggyName sub_name, char const *sub_name_utf8, IggyDatatype *result); + +RADEXPFUNC IggyResult RADEXPLINK IggyValueGetF64RS(IggyValuePath *var, IggyName sub_name, char const *sub_name_utf8, F64 *result); +RADEXPFUNC IggyResult RADEXPLINK IggyValueGetF32RS(IggyValuePath *var, IggyName sub_name, char const *sub_name_utf8, F32 *result); +RADEXPFUNC IggyResult RADEXPLINK IggyValueGetS32RS(IggyValuePath *var, IggyName sub_name, char const *sub_name_utf8, S32 *result); +RADEXPFUNC IggyResult RADEXPLINK IggyValueGetU32RS(IggyValuePath *var, IggyName sub_name, char const *sub_name_utf8, U32 *result); +RADEXPFUNC IggyResult RADEXPLINK IggyValueGetStringUTF8RS(IggyValuePath *var, IggyName sub_name, char const *sub_name_utf8, S32 max_result_len, char *utf8_result, S32 *result_len); +RADEXPFUNC IggyResult RADEXPLINK IggyValueGetStringUTF16RS(IggyValuePath *var, IggyName sub_name, char const *sub_name_utf8, S32 max_result_len, IggyUTF16 *utf16_result, S32 *result_len); +RADEXPFUNC IggyResult RADEXPLINK IggyValueGetBooleanRS(IggyValuePath *var, IggyName sub_name, char const *sub_name_utf8, rrbool *result); +RADEXPFUNC IggyResult RADEXPLINK IggyValueGetArrayLengthRS(IggyValuePath *var, IggyName sub_name, char const *sub_name_utf8, S32 *result); + +RADEXPFUNC rrbool RADEXPLINK IggyValueSetF64RS(IggyValuePath *var, IggyName sub_name, char const *sub_name_utf8, F64 value); +RADEXPFUNC rrbool RADEXPLINK IggyValueSetF32RS(IggyValuePath *var, IggyName sub_name, char const *sub_name_utf8, F32 value); +RADEXPFUNC rrbool RADEXPLINK IggyValueSetS32RS(IggyValuePath *var, IggyName sub_name, char const *sub_name_utf8, S32 value); +RADEXPFUNC rrbool RADEXPLINK IggyValueSetU32RS(IggyValuePath *var, IggyName sub_name, char const *sub_name_utf8, U32 value); +RADEXPFUNC rrbool RADEXPLINK IggyValueSetStringUTF8RS(IggyValuePath *var, IggyName sub_name, char const *sub_name_utf8, char const *utf8_string, S32 stringlen); +RADEXPFUNC rrbool RADEXPLINK IggyValueSetStringUTF16RS(IggyValuePath *var, IggyName sub_name, char const *sub_name_utf8, IggyUTF16 const *utf16_string, S32 stringlen); +RADEXPFUNC rrbool RADEXPLINK IggyValueSetBooleanRS(IggyValuePath *var, IggyName sub_name, char const *sub_name_utf8, rrbool value); +RADEXPFUNC rrbool RADEXPLINK IggyValueSetValueRefRS(IggyValuePath *var, IggyName sub_name, char const *sub_name_utf8, IggyValueRef value_ref); + +RADEXPFUNC rrbool RADEXPLINK IggyValueSetUserDataRS(IggyValuePath *result, void const *userdata); +RADEXPFUNC IggyResult RADEXPLINK IggyValueGetUserDataRS(IggyValuePath *result, void **userdata); + + +//////////////////////////////////////////////////////////// +// +// Input Events +// + +typedef enum IggyEventType +{ + IGGY_EVENTTYPE_None, + IGGY_EVENTTYPE_MouseLeftDown, + IGGY_EVENTTYPE_MouseLeftUp, + IGGY_EVENTTYPE_MouseRightDown, + IGGY_EVENTTYPE_MouseRightUp, + IGGY_EVENTTYPE_MouseMiddleDown, + IGGY_EVENTTYPE_MouseMiddleUp, + IGGY_EVENTTYPE_MouseMove, + IGGY_EVENTTYPE_MouseWheel, + IGGY_EVENTTYPE_KeyUp, + IGGY_EVENTTYPE_KeyDown, + IGGY_EVENTTYPE_Char, + IGGY_EVENTTYPE_Activate, + IGGY_EVENTTYPE_Deactivate, + IGGY_EVENTTYPE_Resize, + IGGY_EVENTTYPE_MouseLeave, + IGGY_EVENTTYPE_FocusLost, +} IggyEventType; + +typedef enum IggyKeyloc +{ + IGGY_KEYLOC_Standard = 0, // For keys that have no variants + // TODO(casey): Shouldn't these work for ALT and CONTROL too? The code in D3DTEST looks like it only handles VK_SHIFT... + IGGY_KEYLOC_Left = 1, // Specifies the left-hand-side key for keys with left/right variants (such as $(IggyKeycode::IGGY_KEYCODE_SHIFT), $(IggyKeycode::IGGY_KEYCODE_ALTERNATE), etc.) */ + IGGY_KEYLOC_Right = 2, // Specifies the right-hand-side key for keys with left/right variants (such as $(IggyKeycode::IGGY_KEYCODE_SHIFT), $(IggyKeycode::IGGY_KEYCODE_ALTERNATE), etc.) */ + IGGY_KEYLOC_Numpad = 3, // TODO(casey): Is this ever used? +} IggyKeyloc; + +typedef enum IggyKeyevent +{ + IGGY_KEYEVENT_Up = IGGY_EVENTTYPE_KeyUp, + IGGY_KEYEVENT_Down = IGGY_EVENTTYPE_KeyDown, +} IggyKeyevent; + +typedef enum IggyMousebutton +{ + IGGY_MOUSEBUTTON_LeftDown = IGGY_EVENTTYPE_MouseLeftDown, + IGGY_MOUSEBUTTON_LeftUp = IGGY_EVENTTYPE_MouseLeftUp, + IGGY_MOUSEBUTTON_RightDown = IGGY_EVENTTYPE_MouseRightDown, + IGGY_MOUSEBUTTON_RightUp = IGGY_EVENTTYPE_MouseRightUp, + IGGY_MOUSEBUTTON_MiddleDown = IGGY_EVENTTYPE_MouseMiddleDown, + IGGY_MOUSEBUTTON_MiddleUp = IGGY_EVENTTYPE_MouseMiddleUp, +} IggyMousebutton; + +typedef enum IggyActivestate +{ + IGGY_ACTIVESTATE_Activated = IGGY_EVENTTYPE_Activate, + IGGY_ACTIVESTATE_Deactivated = IGGY_EVENTTYPE_Deactivate, +} IggyActivestate; + +typedef enum IggyKeycode +{ + IGGY_KEYCODE_A = 65, + IGGY_KEYCODE_B = 66, + IGGY_KEYCODE_C = 67, + IGGY_KEYCODE_D = 68, + IGGY_KEYCODE_E = 69, + IGGY_KEYCODE_F = 70, + IGGY_KEYCODE_G = 71, + IGGY_KEYCODE_H = 72, + IGGY_KEYCODE_I = 73, + IGGY_KEYCODE_J = 74, + IGGY_KEYCODE_K = 75, + IGGY_KEYCODE_L = 76, + IGGY_KEYCODE_M = 77, + IGGY_KEYCODE_N = 78, + IGGY_KEYCODE_O = 79, + IGGY_KEYCODE_P = 80, + IGGY_KEYCODE_Q = 81, + IGGY_KEYCODE_R = 82, + IGGY_KEYCODE_S = 83, + IGGY_KEYCODE_T = 84, + IGGY_KEYCODE_U = 85, + IGGY_KEYCODE_V = 86, + IGGY_KEYCODE_W = 87, + IGGY_KEYCODE_X = 88, + IGGY_KEYCODE_Y = 89, + IGGY_KEYCODE_Z = 90, + + IGGY_KEYCODE_0 = 48, + IGGY_KEYCODE_1 = 49, + IGGY_KEYCODE_2 = 50, + IGGY_KEYCODE_3 = 51, + IGGY_KEYCODE_4 = 52, + IGGY_KEYCODE_5 = 53, + IGGY_KEYCODE_6 = 54, + IGGY_KEYCODE_7 = 55, + IGGY_KEYCODE_8 = 56, + IGGY_KEYCODE_9 = 57, + + IGGY_KEYCODE_F1 = 112, + IGGY_KEYCODE_F2 = 113, + IGGY_KEYCODE_F3 = 114, + IGGY_KEYCODE_F4 = 115, + IGGY_KEYCODE_F5 = 116, + IGGY_KEYCODE_F6 = 117, + IGGY_KEYCODE_F7 = 118, + IGGY_KEYCODE_F8 = 119, + IGGY_KEYCODE_F9 = 120, + IGGY_KEYCODE_F10 = 121, + IGGY_KEYCODE_F11 = 122, + IGGY_KEYCODE_F12 = 123, + IGGY_KEYCODE_F13 = 124, + IGGY_KEYCODE_F14 = 125, + IGGY_KEYCODE_F15 = 126, + + IGGY_KEYCODE_COMMAND = 15, + IGGY_KEYCODE_SHIFT = 16, + IGGY_KEYCODE_CONTROL = 17, + IGGY_KEYCODE_ALTERNATE = 18, + + IGGY_KEYCODE_BACKQUOTE = 192, + IGGY_KEYCODE_BACKSLASH = 220, + IGGY_KEYCODE_BACKSPACE = 8, + IGGY_KEYCODE_CAPS_LOCK = 20, + IGGY_KEYCODE_COMMA = 188, + IGGY_KEYCODE_DELETE = 46, + IGGY_KEYCODE_DOWN = 40, + IGGY_KEYCODE_END = 35, + IGGY_KEYCODE_ENTER = 13, + IGGY_KEYCODE_EQUAL = 187, + IGGY_KEYCODE_ESCAPE = 27, + IGGY_KEYCODE_HOME = 36, + IGGY_KEYCODE_INSERT = 45, + IGGY_KEYCODE_LEFT = 37, + IGGY_KEYCODE_LEFTBRACKET = 219, + IGGY_KEYCODE_MINUS = 189, + IGGY_KEYCODE_NUMPAD = 21, + IGGY_KEYCODE_NUMPAD_0 = 96, + IGGY_KEYCODE_NUMPAD_1 = 97, + IGGY_KEYCODE_NUMPAD_2 = 98, + IGGY_KEYCODE_NUMPAD_3 = 99, + IGGY_KEYCODE_NUMPAD_4 = 100, + IGGY_KEYCODE_NUMPAD_5 = 101, + IGGY_KEYCODE_NUMPAD_6 = 102, + IGGY_KEYCODE_NUMPAD_7 = 103, + IGGY_KEYCODE_NUMPAD_8 = 104, + IGGY_KEYCODE_NUMPAD_9 = 105, + IGGY_KEYCODE_NUMPAD_ADD = 107, + IGGY_KEYCODE_NUMPAD_DECIMAL = 110, + IGGY_KEYCODE_NUMPAD_DIVIDE = 111, + IGGY_KEYCODE_NUMPAD_ENTER = 108, + IGGY_KEYCODE_NUMPAD_MULTIPLY = 106, + IGGY_KEYCODE_NUMPAD_SUBTRACT = 109, + IGGY_KEYCODE_PAGE_DOWN = 34, + IGGY_KEYCODE_PAGE_UP = 33, + IGGY_KEYCODE_PERIOD = 190, + IGGY_KEYCODE_QUOTE = 222, + IGGY_KEYCODE_RIGHT = 39, + IGGY_KEYCODE_RIGHTBRACKET = 221, + IGGY_KEYCODE_SEMICOLON = 186, + IGGY_KEYCODE_SLASH = 191, + IGGY_KEYCODE_SPACE = 32, + IGGY_KEYCODE_TAB = 9, + IGGY_KEYCODE_UP = 38, +} IggyKeycode; + +typedef enum IggyEventFlag +{ + IGGY_EVENTFLAG_PreventDispatchToObject = 0x1, + IGGY_EVENTFLAG_PreventFocusTabbing = 0x2, + IGGY_EVENTFLAG_PreventDefault = 0x4, + IGGY_EVENTFLAG_RanAtLeastOneHandler = 0x8, +} IggyEventFlag; + +typedef struct IggyEvent +{ + S32 type; // an $IggyEventType + U32 flags; + S32 x,y; // mouse position at time of event + S32 keycode,keyloc; // keyboard inputs +} IggyEvent; + +typedef enum IggyFocusChange +{ + IGGY_FOCUS_CHANGE_None, // The keyboard focus didn't change + IGGY_FOCUS_CHANGE_TookFocus, // The keyboard focus changed to something in this Iggy + IGGY_FOCUS_CHANGE_LostFocus, // The keyboard focus was lost from this Iggy +} IggyFocusChange; + +typedef struct IggyEventResult +{ + U32 new_flags; + S32 focus_change; // an $IggyFocusChange that indicates how the focus (may have) changed in response to the event + S32 focus_direction; // +} IggyEventResult; + +RADEXPFUNC void RADEXPLINK IggyMakeEventNone(IggyEvent *event); + +RADEXPFUNC void RADEXPLINK IggyMakeEventResize(IggyEvent *event); +RADEXPFUNC void RADEXPLINK IggyMakeEventActivate(IggyEvent *event, IggyActivestate event_type); +RADEXPFUNC void RADEXPLINK IggyMakeEventMouseLeave(IggyEvent *event); +RADEXPFUNC void RADEXPLINK IggyMakeEventMouseMove(IggyEvent *event, S32 x, S32 y); +RADEXPFUNC void RADEXPLINK IggyMakeEventMouseButton(IggyEvent *event, IggyMousebutton event_type); +RADEXPFUNC void RADEXPLINK IggyMakeEventMouseWheel(IggyEvent *event, S16 mousewheel_delta); +RADEXPFUNC void RADEXPLINK IggyMakeEventKey(IggyEvent *event, IggyKeyevent event_type, IggyKeycode keycode, IggyKeyloc keyloc); +RADEXPFUNC void RADEXPLINK IggyMakeEventChar(IggyEvent *event, S32 charcode); +RADEXPFUNC void RADEXPLINK IggyMakeEventFocusLost(IggyEvent *event); +RADEXPFUNC void RADEXPLINK IggyMakeEventFocusGained(IggyEvent *event, S32 focus_direction); +RADEXPFUNC rrbool RADEXPLINK IggyPlayerDispatchEventRS(Iggy *player, IggyEvent *event, IggyEventResult *result); +RADEXPFUNC void RADEXPLINK IggyPlayerSetShiftState(Iggy *f, rrbool shift, rrbool control, rrbool alt, rrbool command); +RADEXPFUNC void RADEXPLINK IggySetDoubleClickTime(S32 time_in_ms_from_first_down_to_second_up); +RADEXPFUNC void RADEXPLINK IggySetTextCursorFlash(U32 cycle_time_in_ms, U32 visible_time_in_ms); + +RADEXPFUNC rrbool RADEXPLINK IggyPlayerHasFocusedEditableTextfield(Iggy *f); +RADEXPFUNC rrbool RADEXPLINK IggyPlayerPasteUTF16(Iggy *f, U16 *string, S32 stringlen); +RADEXPFUNC rrbool RADEXPLINK IggyPlayerPasteUTF8(Iggy *f, char *string, S32 stringlen); +RADEXPFUNC rrbool RADEXPLINK IggyPlayerCut(Iggy *f); + +#define IGGY_PLAYER_COPY_no_focused_textfield -1 +#define IGGY_PLAYER_COPY_textfield_has_no_selection 0 +RADEXPFUNC S32 RADEXPLINK IggyPlayerCopyUTF16(Iggy *f, U16 *buffer, S32 bufferlen); +RADEXPFUNC S32 RADEXPLINK IggyPlayerCopyUTF8(Iggy *f, char *buffer, S32 bufferlen); + + +//////////////////////////////////////////////////////////// +// +// IME +// + +#ifdef __RADNT__ +#define IGGY_IME_SUPPORT +#endif + +RADEXPFUNC void RADEXPLINK IggyPlayerSetIMEFontUTF8(Iggy *f, const char *font_name_utf8, S32 namelen_in_bytes); +RADEXPFUNC void RADEXPLINK IggyPlayerSetIMEFontUTF16(Iggy *f, const IggyUTF16 *font_name_utf16, S32 namelen_in_2byte_words); + +#ifdef IGGY_IME_SUPPORT + +#define IGGY_IME_MAX_CANDIDATE_LENGTH 256 // matches def in ImeUi.cpp, so no overflow checks needed when copying out. + +IDOCN typedef enum { + IGGY_IME_COMPOSITION_STYLE_NONE, + IGGY_IME_COMPOSITION_STYLE_UNDERLINE_DOTTED, + IGGY_IME_COMPOSITION_STYLE_UNDERLINE_DOTTED_THICK, + IGGY_IME_COMPOSITION_STYLE_UNDERLINE_SOLID, + IGGY_IME_COMPOSITION_STYLE_UNDERLINE_SOLID_THICK, +} IggyIMECompositionDrawStyle; + +IDOCN typedef enum { + IGGY_IME_COMPOSITION_CLAUSE_NORMAL, + IGGY_IME_COMPOSITION_CLAUSE_START, +} IggyIMECompositionClauseState; + +IDOCN typedef struct +{ + IggyUTF16 str[IGGY_IME_MAX_CANDIDATE_LENGTH]; + IggyIMECompositionDrawStyle char_style[IGGY_IME_MAX_CANDIDATE_LENGTH]; + IggyIMECompositionClauseState clause_state[IGGY_IME_MAX_CANDIDATE_LENGTH]; + S32 cursor_pos; + rrbool display_block_cursor; + int candicate_clause_start_pos; + int candicate_clause_end_pos; // inclusive +} IggyIMECompostitionStringState; + +IDOCN RADEXPFUNC void RADEXPLINK IggyIMEWin32SetCompositionState(Iggy* f, IggyIMECompostitionStringState* s); + +IDOCN RADEXPFUNC void RADEXPLINK IggyIMEGetTextExtents(Iggy* f, U32* pdw, U32* pdh, const IggyUTF16* str, U32 text_height); +IDOCN RADEXPFUNC void RADEXPLINK IggyIMEDrawString(Iggy* f, S32 px, S32 py, const IggyUTF16* str, U32 text_height, const U8 rgba[4]); + +IDOCN RADEXPFUNC void RADEXPLINK IggyIMEWin32GetCandidatePosition(Iggy* f, F32* pdx, F32* pdy, F32* pdcomp_str_height); +IDOCN RADEXPFUNC void* RADEXPLINK IggyIMEGetFocusedTextfield(Iggy* f); +IDOCN RADEXPFUNC void RADEXPLINK IggyIMEDrawRect(S32 x0, S32 y0, S32 x1, S32 y1, const U8 rgb[3]); + +#endif + +//////////////////////////////////////////////////////////// +// +// Input focus handling +// + +typedef void *IggyFocusHandle; + +#define IGGY_FOCUS_NULL 0 + +typedef struct +{ + IggyFocusHandle object; // unique identifier of Iggy object + F32 x0, y0, x1, y1; // bounding box of displayed shape +} IggyFocusableObject; + +RADEXPFUNC rrbool RADEXPLINK IggyPlayerGetFocusableObjects(Iggy *f, IggyFocusHandle *current_focus, + IggyFocusableObject *objs, S32 max_obj, S32 *num_obj); +RADEXPFUNC void RADEXPLINK IggyPlayerSetFocusRS(Iggy *f, IggyFocusHandle object, int focus_key_char); + +//////////////////////////////////////////////////////////// +// +// GDraw helper functions accessors +// + +RADEXPFUNC void * RADEXPLINK IggyGDrawMalloc(SINTa size); +#define IggyGDrawMalloc(size) IggyGDrawMallocAnnotated(size, __FILE__, __LINE__) IDOCN +IDOCN RADEXPFUNC void * RADEXPLINK IggyGDrawMallocAnnotated(SINTa size, const char *file, int line); + +RADEXPFUNC void RADEXPLINK IggyGDrawFree(void *ptr); +RADEXPFUNC void RADEXPLINK IggyGDrawSendWarning(Iggy *f, char const *message, ...); +RADEXPFUNC void RADEXPLINK IggyWaitOnFence(void *id, U32 fence); +RADEXPFUNC void RADEXPLINK IggyDiscardVertexBufferCallback(void *owner, void *vertex_buffer); +RADEXPFUNC void RADEXPLINK IggyPlayerDebugEnableFilters(Iggy *f, rrbool enable); +RADEXPFUNC void RADEXPLINK IggyPlayerDebugSetTime(Iggy *f, F64 time); + +IDOCN RADEXPFUNC void RADEXPLINK IggyPlayerDebugBatchStartFrame(void); +IDOCN RADEXPFUNC void RADEXPLINK IggyPlayerDebugBatchInit(void); +IDOCN RADEXPFUNC void RADEXPLINK IggyPlayerDebugBatchMove(S32 dir); +IDOCN RADEXPFUNC void RADEXPLINK IggyPlayerDebugBatchSplit(void); +IDOCN RADEXPFUNC void RADEXPLINK IggyPlayerDebugBatchChooseEnd(S32 end); + +//////////////////////////////////////////////////////////// +// +// debugging +// + +IDOCN RADEXPFUNC void RADEXPLINK IggyPlayerDebugUpdateReadyToTickWithFakeRender(Iggy *f); +IDOCN RADEXPFUNC void RADEXPLINK IggyDebugBreakOnAS3Exception(void); + + +typedef struct +{ + S32 size; + char *source_file; + S32 source_line; + char *iggy_file; + char *info; +} IggyLeakResultData; + +typedef void RADLINK IggyLeakResultCallback(IggyLeakResultData *data); + +typedef struct +{ + char *subcategory; + S32 subcategory_stringlen; + + S32 static_allocation_count; // number of non-freeable allocations for this subcategory + S32 static_allocation_bytes; // bytes of non-freeable allocations for this subcategory + + S32 dynamic_allocation_count; // number of freeable allocations for this subcategory + S32 dynamic_allocation_bytes; // estimated bytes of freeable allocations for this subcategory +} IggyMemoryUseInfo; + +RADEXPFUNC rrbool RADEXPLINK IggyDebugGetMemoryUseInfo(Iggy *player, IggyLibrary lib, char const *category_string, S32 category_stringlen, S32 iteration, IggyMemoryUseInfo *data); +RADEXPFUNC void RADEXPLINK IggyDebugSetLeakResultCallback(IggyLeakResultCallback *leak_result_func); + +IDOCN RADEXPFUNC void RADEXPLINK iggy_sync_check_todisk(char *filename_or_null, U32 flags); +IDOCN RADEXPFUNC void RADEXPLINK iggy_sync_check_fromdisk(char *filename_or_null, U32 flags); +IDOCN RADEXPFUNC void RADEXPLINK iggy_sync_check_end(void); +#define IGGY_SYNCCHECK_readytotick 1U IDOCN + +RADDEFEND + +#endif diff --git a/Minecraft.Client/PSVita/Iggy/include/iggyexpruntime.h b/Minecraft.Client/PSVita/Iggy/include/iggyexpruntime.h new file mode 100644 index 00000000..1f1a90a1 --- /dev/null +++ b/Minecraft.Client/PSVita/Iggy/include/iggyexpruntime.h @@ -0,0 +1,49 @@ +#ifndef __RAD_INCLUDE_IGGYEXPRUNTIME_H__ +#define __RAD_INCLUDE_IGGYEXPRUNTIME_H__ + +#include "rrCore.h" + +#define IDOC + +RADDEFSTART + +#ifndef __RAD_HIGGYEXP_ +#define __RAD_HIGGYEXP_ +typedef void * HIGGYEXP; +#endif + +//idoc(parent,IggyExpRuntime_API) + +#define IGGYEXP_MIN_STORAGE 1024 IDOC +/* The minimum-sized block you must provide to $IggyExpCreate */ + +IDOC RADEXPFUNC HIGGYEXP RADEXPLINK IggyExpCreate(char *ip_address, S32 port, void *storage, S32 storage_size_in_bytes); +/* Opens a connection to $IggyExplorer and returns an $HIGGYEXP wrapping the connection. + + $:ip_address The address of the machine running Iggy Explorer (can be numeric with dots, or textual, including "localhost") + $:port The port number on which Iggy Explorer is listening for a network connection (the default is 9190) + $:storage A small block of storage that needed to store the $HIGGYEXP, must be at least $IGGYEXP_MIN_STORAGE + $:storage_size_in_bytes The size of the block pointer to by storage + +Returns a NULL HIGGYEXP if the IP address/hostname can't be resolved, or no Iggy Explorer +can be contacted at the specified address/port. Otherwise returns a non-NULL $HIGGYEXP +which you can pass to $IggyUseExplorer. */ + +IDOC RADEXPFUNC void RADEXPLINK IggyExpDestroy(HIGGYEXP p); +/* Closes and destroys a connection to $IggyExplorer */ + +IDOC RADEXPFUNC rrbool RADEXPLINK IggyExpCheckValidity(HIGGYEXP p); +/* Checks if the connection represented by an $HIGGYEXP is still valid, i.e. +still connected to $IggyExplorer. + +Returns true if the connection is still valid; returns false if it is not valid. + +This might happen if someone closes Iggy Explorer, Iggy Explorer crashes, or +the network fails. You can this to poll and detect these conditions and do +something in response, such as trying to open a new connection. + +An invalid $HIGGYEXP must still be shutdown with $IggyExpDestroy. */ + +RADDEFEND + +#endif//__RAD_INCLUDE_IGGYEXPRUNTIME_H__ \ No newline at end of file diff --git a/Minecraft.Client/PSVita/Iggy/include/iggyperfmon.h b/Minecraft.Client/PSVita/Iggy/include/iggyperfmon.h new file mode 100644 index 00000000..85b84b60 --- /dev/null +++ b/Minecraft.Client/PSVita/Iggy/include/iggyperfmon.h @@ -0,0 +1,89 @@ +// $$COPYRIGHT$$ + +#ifndef __RAD_INCLUDE_IGGYPERFMON_H__ +#define __RAD_INCLUDE_IGGYPERFMON_H__ + +#include "rrCore.h" + +#define IDOC + +RADDEFSTART + +#ifndef __RAD_HIGGYPERFMON_ +#define __RAD_HIGGYPERFMON_ +typedef void * HIGGYPERFMON; +#endif + +//idoc(parent,IggyPerfmon_API) + +typedef void * RADLINK iggyperfmon_malloc(void *handle, U32 size); +typedef void RADLINK iggyperfmon_free(void *handle, void *ptr); + +IDOC RADEXPFUNC HIGGYPERFMON RADEXPLINK IggyPerfmonCreate(iggyperfmon_malloc *perf_malloc, iggyperfmon_free *perf_free, void *callback_handle); +/* Creates an IggyPerfmon. + +You must supply allocator functions. The amount allocated depends on the complexity +of the Iggys being profiled. */ + +typedef struct Iggy Iggy; +typedef struct GDrawFunctions GDrawFunctions; + +IDOC typedef union { + U32 bits; + struct { + U32 dpad_up :1; + U32 dpad_down :1; + U32 dpad_left :1; + U32 dpad_right :1; + U32 button_up :1; // XBox Y, PS3 tri + U32 button_down :1; // XBox A, PS3 X + U32 button_left :1; // XBox X, PS3 square + U32 button_right :1; // XBox B, PS3 circle + U32 shoulder_left_hi :1; // LB/L1 + U32 shoulder_right_hi :1; // RB/R1 + U32 trigger_left_low :1; + U32 trigger_right_low :1; + } field; +} IggyPerfmonPad; + +#define IggyPerfmonPadFromXInputStatePointer(pad, xis) \ + (pad).bits = 0, \ + (pad).field.dpad_up = 0 != ((xis)->Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_UP), \ + (pad).field.dpad_down = 0 != ((xis)->Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_DOWN), \ + (pad).field.dpad_left = 0 != ((xis)->Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_LEFT), \ + (pad).field.dpad_right = 0 != ((xis)->Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_RIGHT), \ + (pad).field.button_up = 0 != ((xis)->Gamepad.wButtons & XINPUT_GAMEPAD_Y), \ + (pad).field.button_down = 0 != ((xis)->Gamepad.wButtons & XINPUT_GAMEPAD_A), \ + (pad).field.button_left = 0 != ((xis)->Gamepad.wButtons & XINPUT_GAMEPAD_X), \ + (pad).field.button_right = 0 != ((xis)->Gamepad.wButtons & XINPUT_GAMEPAD_B), \ + (pad).field.shoulder_left_hi = 0 != ((xis)->Gamepad.wButtons & XINPUT_GAMEPAD_LEFT_SHOULDER), \ + (pad).field.shoulder_right_hi = 0 != ((xis)->Gamepad.wButtons & XINPUT_GAMEPAD_RIGHT_SHOULDER), \ + (pad).field.trigger_left_low = 0 != ((xis)->Gamepad.bLeftTrigger >= XINPUT_GAMEPAD_TRIGGER_THRESHOLD), \ + (pad).field.trigger_right_low = 0 != ((xis)->Gamepad.bRightTrigger >= XINPUT_GAMEPAD_TRIGGER_THRESHOLD) + +// All positions in window coords +IDOC RADEXPFUNC void RADEXPLINK IggyPerfmonTickAndDraw(HIGGYPERFMON p, GDrawFunctions* gdraw_funcs, + const IggyPerfmonPad* pad, + int pm_tile_ul_x, int pm_tile_ul_y, int pm_tile_lr_x, int pm_tile_lr_y); +/* Draw and tick an IggyPerfmon. + +$:p A perfmon context previously created with IggyPerfmonCreate +$:gdraw_functions The same GDraw handle used for rendering Iggy +$:pad An abstracted gamepad state structure. iggyperfmon.h +includes an example that initializes the abstract gamepad from a 360 controller +as defined by XInput; this will work on both Windows and the Xbox 360. +$:pm_tile_ul_x The left coordinate of the rectangle where the perfmon display should be drawn +$:pm_tile_ul_y The top coordinate of the rectangle where the perfmon display should be drawn +$:pm_tile_lr_x The right coordinate of the rectangle where the perfmon display should be drawn +$:pm_tile_lr_y The bottom coordinate of the rectangle where the perfmon display should be drawn + +You should only call this function when you want Iggy Perfmon to be visible. +See $IggyPerfmon for more information. */ + +IDOC RADEXPFUNC void RADEXPLINK IggyPerfmonDestroy(HIGGYPERFMON p, GDrawFunctions* iggy_draw); +/* Closes and destroys an IggyPerfmon */ + + +RADDEFEND + +#endif//__RAD_INCLUDE_IGGYPERFMON_H__ \ No newline at end of file diff --git a/Minecraft.Client/PSVita/Iggy/include/iggyperfmon_psp2.h b/Minecraft.Client/PSVita/Iggy/include/iggyperfmon_psp2.h new file mode 100644 index 00000000..537d8b99 --- /dev/null +++ b/Minecraft.Client/PSVita/Iggy/include/iggyperfmon_psp2.h @@ -0,0 +1,40 @@ +#ifndef __RAD_INCLUDE_IGGYPERFMON_PSP2_H__ +#define __RAD_INCLUDE_IGGYPERFMON_PSP2_H__ + +// You still need to include regular iggyperfmon.h first. This is just for convenience. + +#define IggyPerfmonDPadWithShift(ctrldata, testfor) ((testfor) == ((ctrldata).buttons & ((testfor) | SCE_CTRL_L | SCE_CTRL_R))) + +// From SceCtrlData (built-in controller) +#define IggyPerfmonPadFromSceCtrlData(pad, ctrldata) \ + (pad).bits = 0, \ + (pad).field.dpad_up = IggyPerfmonDPadWithShift(ctrldata, SCE_CTRL_UP), \ + (pad).field.dpad_down = IggyPerfmonDPadWithShift(ctrldata, SCE_CTRL_DOWN), \ + (pad).field.dpad_left = IggyPerfmonDPadWithShift(ctrldata, SCE_CTRL_LEFT), \ + (pad).field.dpad_right = IggyPerfmonDPadWithShift(ctrldata, SCE_CTRL_RIGHT), \ + (pad).field.button_up = 0 != ((ctrldata).buttons & SCE_CTRL_TRIANGLE), \ + (pad).field.button_down = 0 != ((ctrldata).buttons & SCE_CTRL_CROSS), \ + (pad).field.button_left = 0 != ((ctrldata).buttons & SCE_CTRL_SQUARE), \ + (pad).field.button_right = 0 != ((ctrldata).buttons & SCE_CTRL_CIRCLE), \ + (pad).field.shoulder_left_hi = IggyPerfmonDPadWithShift(ctrldata, SCE_CTRL_LEFT|SCE_CTRL_L), \ + (pad).field.shoulder_right_hi = IggyPerfmonDPadWithShift(ctrldata, SCE_CTRL_RIGHT|SCE_CTRL_L),\ + (pad).field.trigger_left_low = IggyPerfmonDPadWithShift(ctrldata, SCE_CTRL_LEFT|SCE_CTRL_R), \ + (pad).field.trigger_right_low = IggyPerfmonDPadWithShift(ctrldata, SCE_CTRL_RIGHT|SCE_CTRL_R) + +// From SceCtrlData2 (wireless controller) +#define IggyPerfmonPadFromSceCtrlData2(pad, ctrldata) \ + (pad).bits = 0, \ + (pad).field.dpad_up = 0 != ((ctrldata).buttons & SCE_CTRL_UP), \ + (pad).field.dpad_down = 0 != ((ctrldata).buttons & SCE_CTRL_DOWN), \ + (pad).field.dpad_left = 0 != ((ctrldata).buttons & SCE_CTRL_LEFT), \ + (pad).field.dpad_right = 0 != ((ctrldata).buttons & SCE_CTRL_RIGHT), \ + (pad).field.button_up = 0 != ((ctrldata).buttons & SCE_CTRL_TRIANGLE), \ + (pad).field.button_down = 0 != ((ctrldata).buttons & SCE_CTRL_CROSS), \ + (pad).field.button_left = 0 != ((ctrldata).buttons & SCE_CTRL_SQUARE), \ + (pad).field.button_right = 0 != ((ctrldata).buttons & SCE_CTRL_CIRCLE), \ + (pad).field.shoulder_left_hi = 0 != ((ctrldata).buttons & SCE_CTRL_L1), \ + (pad).field.shoulder_right_hi = 0 != ((ctrldata).buttons & SCE_CTRL_R1), \ + (pad).field.trigger_left_low = 0 != ((ctrldata).buttons & SCE_CTRL_L2), \ + (pad).field.trigger_right_low = 0 != ((ctrldata).buttons & SCE_CTRL_R2) + +#endif//__RAD_INCLUDE_IGGYPERFMON_PSP2_H__ diff --git a/Minecraft.Client/PSVita/Iggy/include/rrCore.h b/Minecraft.Client/PSVita/Iggy/include/rrCore.h new file mode 100644 index 00000000..e88b5f8c --- /dev/null +++ b/Minecraft.Client/PSVita/Iggy/include/rrCore.h @@ -0,0 +1,2322 @@ +/// ======================================================================== +// (C) Copyright 1994- 2014 RAD Game Tools, Inc. Global types header file +// ======================================================================== + +#ifndef __RADRR_COREH__ +#define __RADRR_COREH__ +#define RADCOPYRIGHT "Copyright (C) 1994-2014, RAD Game Tools, Inc." + +// __RAD16__ means 16 bit code (Win16) +// __RAD32__ means 32 bit code (DOS, Win386, Win32s, Mac AND Win64) +// __RAD64__ means 64 bit code (x64) + +// Note oddness - __RAD32__ essentially means "at *least* 32-bit code". +// So, on 64-bit systems, both __RAD32__ and __RAD64__ will be defined. + +// __RADDOS__ means DOS code (16 or 32 bit) +// __RADWIN__ means Windows API (Win16, Win386, Win32s, Win64, Xbox, Xenon) +// __RADWINEXT__ means Windows 386 extender (Win386) +// __RADNT__ means Win32 or Win64 code +// __RADWINRTAPI__ means Windows RT API (Win 8, Win Phone, ARM, Durango) +// __RADMAC__ means Macintosh +// __RADCARBON__ means Carbon +// __RADMACH__ means MachO +// __RADXBOX__ means the XBox console +// __RADXENON__ means the Xenon console +// __RADDURANGO__ or __RADXBOXONE__ means Xbox One +// __RADNGC__ means the Nintendo GameCube +// __RADWII__ means the Nintendo Wii +// __RADWIIU__ means the Nintendo Wii U +// __RADNDS__ means the Nintendo DS +// __RADTWL__ means the Nintendo DSi (__RADNDS__ also defined) +// __RAD3DS__ means the Nintendo 3DS +// __RADPS2__ means the Sony PlayStation 2 +// __RADPSP__ means the Sony PlayStation Portable +// __RADPS3__ means the Sony PlayStation 3 +// __RADPS4__ means the Sony PlayStation 4 +// __RADANDROID__ means Android NDK +// __RADNACL__ means Native Client SDK +// __RADNTBUILDLINUX__ means building Linux on NT +// __RADLINUX__ means actually building on Linux (most likely with GCC) +// __RADPSP2__ means NGP +// __RADBSD__ means a BSD-style UNIX (OS X, FreeBSD, OpenBSD, NetBSD) +// __RADPOSIX__ means POSIX-compliant +// __RADQNX__ means QNX +// __RADIPHONE__ means iphone +// __RADIPHONESIM__ means iphone simulator + +// __RADX86__ means Intel x86 +// __RADMMX__ means Intel x86 MMX instructions are allowed +// __RADX64__ means Intel/AMD x64 (NOT IA64=Itanium) +// __RAD68K__ means 68K +// __RADPPC__ means PowerPC +// __RADMIPS__ means Mips (only R5900 right now) +// __RADARM__ mean ARM processors + +// __RADLITTLEENDIAN__ means processor is little-endian (x86) +// __RADBIGENDIAN__ means processor is big-endian (680x0, PPC) + +// __RADNOVARARGMACROS__ means #defines can't use ... + + #ifdef WINAPI_FAMILY + // If this is #defined, we might be in a Windows Store App. But + // VC++ by default #defines this to a symbolic name, not an integer + // value, and those names are defined in "winapifamily.h". So if + // WINAPI_FAMILY is #defined, #include the header so we can parse it. + #include + #define RAD_WINAPI_IS_APP (!WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)) + #else + #define RAD_WINAPI_IS_APP 0 + #endif + + #ifndef __RADRES__ + // Theoretically, this is to pad structs on platforms that don't support pragma pack or do it poorly. (PS3, PS2) + // In general it is assumed that your padding is set via pragma, so this is just a struct. + #define RADSTRUCT struct + + #ifdef __GNUC_MINOR__ + // make a combined GCC version for testing : + + #define __RAD_GCC_VERSION__ (__GNUC__ * 10000 \ + + __GNUC_MINOR__ * 100 \ + + __GNUC_PATCHLEVEL__) + + /* Test for GCC > 3.2.0 */ + // #if GCC_VERSION > 30200 + #endif + + #if defined(__RADX32__) + + #define __RADX86__ + #define __RADMMX__ + #define __RAD32__ + #define __RADLITTLEENDIAN__ + #define RADINLINE inline + #define RADRESTRICT __restrict + + // known platforms under the RAD generic build type + #if defined(_WIN32) || defined(_Windows) || defined(WIN32) || defined(__WINDOWS__) || defined(_WINDOWS) + #define __RADNT__ + #define __RADWIN__ + #elif (defined(__MWERKS__) && !defined(__INTEL__)) || defined(__MRC__) || defined(THINK_C) || defined(powerc) || defined(macintosh) || defined(__powerc) || defined(__APPLE__) || defined(__MACH__) + #define __RADMAC__ + #undef RADSTRUCT + #define RADSTRUCT struct __attribute__((__packed__)) + #elif defined(__linux__) + #define __RADLINUX__ + #undef RADSTRUCT + #define RADSTRUCT struct __attribute__((__packed__)) + #endif + +#elif defined(ANDROID) + #define __RADANDROID__ + #define __RAD32__ + #define __RADLITTLEENDIAN__ + #ifdef __i386__ + #define __RADX86__ + #else + #define __RADARM__ + #endif + #define RADINLINE inline + #define RADRESTRICT __restrict + #undef RADSTRUCT + #define RADSTRUCT struct __attribute__((__packed__)) + +#elif defined(__QNX__) + #define __RAD32__ + #define __RADQNX__ + +#ifdef __arm__ + #define __RADARM__ +#elif defined __i386__ + #define __RADX86__ +#else + #error Unknown processor +#endif + #define __RADLITTLEENDIAN__ + #define RADINLINE inline + #define RADRESTRICT __restrict + + #undef RADSTRUCT + #define RADSTRUCT struct __attribute__((__packed__)) +#elif defined(__linux__) && defined(__arm__) //This should pull in Raspberry Pi as well + + #define __RAD32__ + #define __RADLINUX__ + #define __RADARM__ + #define __RADLITTLEENDIAN__ + #define RADINLINE inline + #define RADRESTRICT __restrict + + #undef RADSTRUCT + #define RADSTRUCT struct __attribute__((__packed__)) + +#elif defined(__native_client__) + #define __RADNACL__ + #define __RAD32__ + #define __RADLITTLEENDIAN__ + #define __RADX86__ + #define RADINLINE inline + #define RADRESTRICT __restrict + + #undef RADSTRUCT + #define RADSTRUCT struct __attribute__((__packed__)) + + #elif defined(_DURANGO) || defined(_SEKRIT) || defined(_SEKRIT1) || defined(_XBOX_ONE) + + #define __RADDURANGO__ 1 + #define __RADXBOXONE__ 1 + #if !defined(__RADSEKRIT__) // keep sekrit around for a bit for compat + #define __RADSEKRIT__ 1 + #endif + + #define __RADWIN__ + #define __RAD32__ + #define __RAD64__ + #define __RADX64__ + #define __RADMMX__ + #define __RADX86__ + #define __RAD64REGS__ + #define __RADLITTLEENDIAN__ + #define RADINLINE __inline + #define RADRESTRICT __restrict + #define __RADWINRTAPI__ + + #elif defined(__ORBIS__) + + #define __RADPS4__ + #if !defined(__RADSEKRIT2__) // keep sekrit2 around for a bit for compat + #define __RADSEKRIT2__ 1 + #endif + #define __RAD32__ + #define __RAD64__ + #define __RADX64__ + #define __RADMMX__ + #define __RADX86__ + #define __RAD64REGS__ + #define __RADLITTLEENDIAN__ + #define RADINLINE inline + #define RADRESTRICT __restrict + + #undef RADSTRUCT + #define RADSTRUCT struct __attribute__((__packed__)) + + #elif defined(WINAPI_FAMILY) && RAD_WINAPI_IS_APP + + #define __RADWINRTAPI__ + #define __RADWIN__ + #define RADINLINE __inline + #define RADRESTRICT __restrict + + #if defined(_M_IX86) // WinRT on x86 + + #define __RAD32__ + #define __RADX86__ + #define __RADMMX__ + #define __RADLITTLEENDIAN__ + + #elif defined(_M_X64) // WinRT on x64 + #define __RAD32__ + #define __RAD64__ + #define __RADX86__ + #define __RADX64__ + #define __RADMMX__ + #define __RAD64REGS__ + #define __RADLITTLEENDIAN__ + + #elif defined(_M_ARM) // WinRT on ARM + + #define __RAD32__ + #define __RADARM__ + #define __RADLITTLEENDIAN__ + + #else + + #error Unrecognized WinRT platform! + + #endif + + #elif defined(_WIN64) + + #define __RADWIN__ + #define __RADNT__ + // See note at top for why both __RAD32__ and __RAD64__ are defined. + #define __RAD32__ + #define __RAD64__ + #define __RADX64__ + #define __RADMMX__ + #define __RADX86__ + #define __RAD64REGS__ + #define __RADLITTLEENDIAN__ + #define RADINLINE __inline + #define RADRESTRICT __restrict + + #elif defined(GENERIC_ARM) + + #define __RAD32__ + #define __RADARM__ + #define __RADLITTLEENDIAN__ + #define __RADFIXEDPOINT__ + #define RADINLINE inline + #if (defined(__GCC__) || defined(__GNUC__)) + #define RADRESTRICT __restrict + #else + #define RADRESTRICT // __restrict not supported on cw + #endif + #undef RADSTRUCT + #define RADSTRUCT struct __attribute__((__packed__)) + + #elif defined(CAFE) // has to be before HOLLYWOOD_REV since it also defines it + + #define __RADWIIU__ + #define __RAD32__ + #define __RADPPC__ + #define __RADBIGENDIAN__ + #define RADINLINE inline + #define RADRESTRICT __restrict + #undef RADSTRUCT + #define RADSTRUCT struct __attribute__((__packed__)) + + + #elif defined(HOLLYWOOD_REV) || defined(REVOLUTION) + + #define __RADWII__ + #define __RAD32__ + #define __RADPPC__ + #define __RADBIGENDIAN__ + #define RADINLINE inline + #define RADRESTRICT __restrict + + #elif defined(NN_PLATFORM_CTR) + + #define __RAD3DS__ + #define __RAD32__ + #define __RADARM__ + #define __RADLITTLEENDIAN__ + #define RADINLINE inline + #define RADRESTRICT + #undef RADSTRUCT + #define RADSTRUCT struct __attribute__((__packed__)) + + #elif defined(GEKKO) + + #define __RADNGC__ + #define __RAD32__ + #define __RADPPC__ + #define __RADBIGENDIAN__ + #define RADINLINE inline + #define RADRESTRICT // __restrict not supported on cw + + #elif defined(SDK_ARM9) || defined(SDK_TWL) || (defined(__arm) && defined(__MWERKS__)) + + #define __RADNDS__ + #define __RAD32__ + #define __RADARM__ + #define __RADLITTLEENDIAN__ + #define __RADFIXEDPOINT__ + #define RADINLINE inline + #if (defined(__GCC__) || defined(__GNUC__)) + #define RADRESTRICT __restrict + #else + #define RADRESTRICT // __restrict not supported on cw + #endif + + #if defined(SDK_TWL) + #define __RADTWL__ + #endif + + #elif defined(R5900) + + #define __RADPS2__ + #define __RAD32__ + #define __RADMIPS__ + #define __RADLITTLEENDIAN__ + #define RADINLINE inline + #define RADRESTRICT __restrict + #define __RAD64REGS__ + #define U128 u_long128 + + #if !defined(__MWERKS__) + #undef RADSTRUCT + #define RADSTRUCT struct __attribute__((__packed__)) + #endif + + #elif defined(__psp__) + + #define __RADPSP__ + #define __RAD32__ + #define __RADMIPS__ + #define __RADLITTLEENDIAN__ + #define RADINLINE inline + #define RADRESTRICT __restrict + + #undef RADSTRUCT + #define RADSTRUCT struct __attribute__((__packed__)) + + #elif defined(__psp2__) + + #undef RADSTRUCT + #define RADSTRUCT struct __attribute__((__packed__)) + + #define __RADPSP2__ + #define __RAD32__ + #define __RADARM__ + #define __RADLITTLEENDIAN__ + #define RADINLINE inline + #define RADRESTRICT __restrict + + // need packed attribute for struct with snc? + #elif defined(__CELLOS_LV2__) + + // CB change : 10-29-10 : RAD64REGS on PPU but NOT SPU + + #ifdef __SPU__ + #define __RADSPU__ + #define __RAD32__ + #define __RADCELL__ + #define __RADBIGENDIAN__ + #define RADINLINE inline + #define RADRESTRICT __restrict + #else + #define __RAD64REGS__ + #define __RADPS3__ + #define __RADPPC__ + #define __RAD32__ + #define __RADCELL__ + #define __RADBIGENDIAN__ + #define RADINLINE inline + #define RADRESTRICT __restrict + #define __RADALTIVEC__ + #endif + + #undef RADSTRUCT + #define RADSTRUCT struct __attribute__((__packed__)) + + #ifndef __LP32__ + #error "PS3 32bit ABI support only" + #endif + #elif (defined(__MWERKS__) && !defined(__INTEL__)) || defined(__MRC__) || defined(THINK_C) || defined(powerc) || defined(macintosh) || defined(__powerc) || defined(__APPLE__) || defined(__MACH__) + #ifdef __APPLE__ + #include "TargetConditionals.h" + #endif + + #if ((defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE) || (defined(TARGET_IPHONE_SIMULATOR) && TARGET_IPHONE_SIMULATOR)) + + // iPhone/iPad/iOS + #define __RADIPHONE__ + #define __RADMACAPI__ + + #define __RAD32__ + #if defined(__x86_64__) + #define __RAD64__ + #endif + + #define __RADLITTLEENDIAN__ + #define RADINLINE inline + #define RADRESTRICT __restrict + #define __RADMACH__ + + #undef RADSTRUCT + #define RADSTRUCT struct __attribute__((__packed__)) + + #if defined(TARGET_IPHONE_SIMULATOR) && TARGET_IPHONE_SIMULATOR + #if defined( __x86_64__) + #define __RADX64__ + #else + #define __RADX86__ + #endif + #define __RADIPHONESIM__ + #elif defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE + #define __RADARM__ + #endif + #else + + // An actual MacOSX machine + #define __RADMAC__ + #define __RADMACAPI__ + + #if defined(powerc) || defined(__powerc) || defined(__ppc__) + #define __RADPPC__ + #define __RADBIGENDIAN__ + #define __RADALTIVEC__ + #define RADRESTRICT + #elif defined(__i386__) + #define __RADX86__ + #define __RADMMX__ + #define __RADLITTLEENDIAN__ + #define RADRESTRICT __restrict + #elif defined(__x86_64__) + #define __RAD32__ + #define __RAD64__ + #define __RADX86__ + #define __RADX64__ + #define __RAD64REGS__ + #define __RADMMX__ + #define __RADLITTLEENDIAN__ + #define RADRESTRICT __restrict + #else + #define __RAD68K__ + #define __RADBIGENDIAN__ + #define __RADALTIVEC__ + #define RADRESTRICT + #endif + + #define __RAD32__ + + #if defined(__MWERKS__) + #if (defined(__cplusplus) || ! __option(only_std_keywords)) + #define RADINLINE inline + #endif + #ifdef __MACH__ + #define __RADMACH__ + #endif + #elif defined(__MRC__) + #if defined(__cplusplus) + #define RADINLINE inline + #endif + #elif defined(__GNUC__) || defined(__GNUG__) || defined(__MACH__) + #define RADINLINE inline + #define __RADMACH__ + + #undef RADRESTRICT /* could have been defined above... */ + #define RADRESTRICT __restrict + + #undef RADSTRUCT + #define RADSTRUCT struct __attribute__((__packed__)) + #endif + + #ifdef __RADX86__ + #ifndef __RADCARBON__ + #define __RADCARBON__ + #endif + #endif + + #ifdef TARGET_API_MAC_CARBON + #if TARGET_API_MAC_CARBON + #ifndef __RADCARBON__ + #define __RADCARBON__ + #endif + #endif + #endif + #endif + #elif defined(__linux__) + + #define __RADLINUX__ + #define __RADMMX__ + #define __RADLITTLEENDIAN__ + #define __RADX86__ + #ifdef __x86_64 + #define __RAD32__ + #define __RAD64__ + #define __RADX64__ + #define __RAD64REGS__ + #else + #define __RAD32__ + #endif + #define RADINLINE inline + #define RADRESTRICT __restrict + + #undef RADSTRUCT + #define RADSTRUCT struct __attribute__((__packed__)) + + #else + + #if _MSC_VER >= 1400 + #undef RADRESTRICT + #define RADRESTRICT __restrict + #else + #define RADRESTRICT + #define __RADNOVARARGMACROS__ + #endif + + #if defined(_XENON) || ( defined(_XBOX_VER) && (_XBOX_VER == 200) ) + // Remember that Xenon also defines _XBOX + #define __RADPPC__ + #define __RADBIGENDIAN__ + #define __RADALTIVEC__ + #else + #define __RADX86__ + #define __RADMMX__ + #define __RADLITTLEENDIAN__ + #endif + + #ifdef __MWERKS__ + #define _WIN32 + #endif + + #ifdef __DOS__ + #define __RADDOS__ + #define S64_DEFINED // turn off these types + #define U64_DEFINED + #define S64 double //should error + #define U64 double //should error + #define __RADNOVARARGMACROS__ + #endif + + #ifdef __386__ + #define __RAD32__ + #endif + + #ifdef _Windows //For Borland + #ifdef __WIN32__ + #define WIN32 + #else + #define __WINDOWS__ + #endif + #endif + + #ifdef _WINDOWS //For MS + #ifndef _WIN32 + #define __WINDOWS__ + #endif + #endif + + #ifdef _WIN32 + #if defined(_XENON) || ( defined(_XBOX_VER) && (_XBOX_VER == 200) ) + // Remember that Xenon also defines _XBOX + #define __RADXENON__ + #define __RAD64REGS__ + #elif defined(_XBOX) + #define __RADXBOX__ + #elif !defined(__RADWINRTAPI__) + #define __RADNT__ + #endif + #define __RADWIN__ + #define __RAD32__ + #else + #ifdef __NT__ + #if defined(_XENON) || (_XBOX_VER == 200) + // Remember that Xenon also defines _XBOX + #define __RADXENON__ + #define __RAD64REGS__ + #elif defined(_XBOX) + #define __RADXBOX__ + #else + #define __RADNT__ + #endif + #define __RADWIN__ + #define __RAD32__ + #else + #ifdef __WINDOWS_386__ + #define __RADWIN__ + #define __RADWINEXT__ + #define __RAD32__ + #define S64_DEFINED // turn off these types + #define U64_DEFINED + #define S64 double //should error + #define U64 double //should error + #else + #ifdef __WINDOWS__ + #define __RADWIN__ + #define __RAD16__ + #else + #ifdef WIN32 + #if defined(_XENON) || (_XBOX_VER == 200) + // Remember that Xenon also defines _XBOX + #define __RADXENON__ + #elif defined(_XBOX) + #define __RADXBOX__ + #else + #define __RADNT__ + #endif + #define __RADWIN__ + #define __RAD32__ + #endif + #endif + #endif + #endif + #endif + + #ifdef __WATCOMC__ + #define RADINLINE + #else + #define RADINLINE __inline + #endif + #endif + + #if defined __RADMAC__ || defined __RADIPHONE__ + #define __RADBSD__ + #endif + + #if defined __RADBSD__ || defined __RADLINUX__ + #define __RADPOSIX__ + #endif + + #if (!defined(__RADDOS__) && !defined(__RADWIN__) && !defined(__RADMAC__) && \ + !defined(__RADNGC__) && !defined(__RADNDS__) && !defined(__RADXBOX__) && \ + !defined(__RADXENON__) && !defined(__RADDURANGO__) && !defined(__RADPS4__) && !defined(__RADLINUX__) && !defined(__RADPS2__) && \ + !defined(__RADPSP__) && !defined(__RADPSP2__) && !defined(__RADPS3__) && !defined(__RADSPU__) && \ + !defined(__RADWII__) && !defined(__RADIPHONE__) && !defined(__RADX32__) && !defined(__RADARM__) && \ + !defined(__RADWIIU__) && !defined(__RADANDROID__) && !defined(__RADNACL__) && !defined (__RADQNX__) ) + #error "RAD.H did not detect your platform. Define DOS, WINDOWS, WIN32, macintosh, powerpc, or appropriate console." + #endif + + + #ifdef __RADFINAL__ + #define RADTODO(str) { char __str[0]=str; } + #else + #define RADTODO(str) + #endif + + #ifdef __RADX32__ + #if defined(_MSC_VER) + #define RADLINK __stdcall + #define RADEXPLINK __stdcall + #else + #define RADLINK __attribute__((stdcall)) + #define RADEXPLINK __attribute__((stdcall)) + #endif + #define RADEXPFUNC RADDEFFUNC + + #elif (defined(__RADNGC__) || defined(__RADWII__) || defined( __RADPS2__) || \ + defined(__RADPSP__) || defined(__RADPSP2__) || defined(__RADPS3__) || \ + defined(__RADSPU__) || defined(__RADNDS__) || defined(__RADIPHONE__) || \ + (defined(__RADARM__) && !defined(__RADWINRTAPI__)) || defined(__RADWIIU__) || defined(__RADPS4__) ) + + #define RADLINK + #define RADEXPLINK + #define RADEXPFUNC RADDEFFUNC + #define RADASMLINK + + #elif defined(__RADANDROID__) + #define RADLINK + #define RADEXPLINK + #define RADEXPFUNC RADDEFFUNC + #define RADASMLINK + #elif defined(__RADNACL__) + #define RADLINK + #define RADEXPLINK + #define RADEXPFUNC RADDEFFUNC + #define RADASMLINK + #elif defined(__RADLINUX__) || defined (__RADQNX__) + + #ifdef __RAD64__ + #define RADLINK + #define RADEXPLINK + #else + #define RADLINK __attribute__((cdecl)) + #define RADEXPLINK __attribute__((cdecl)) + #endif + + #define RADEXPFUNC RADDEFFUNC + #define RADASMLINK + + #elif defined(__RADMAC__) + + // this define is for CodeWarrior 11's stupid new libs (even though + // we don't use longlong's). + + #define __MSL_LONGLONG_SUPPORT__ + + #define RADLINK + #define RADEXPLINK + + #if defined(__CFM68K__) || defined(__MWERKS__) + #ifdef __RADINDLL__ + #define RADEXPFUNC RADDEFFUNC __declspec(export) + #else + #define RADEXPFUNC RADDEFFUNC __declspec(import) + #endif + #else + #if defined(__RADMACH__) && !defined(__MWERKS__) + #ifdef __RADINDLL__ + #define RADEXPFUNC RADDEFFUNC __attribute__((visibility("default"))) + #else + #define RADEXPFUNC RADDEFFUNC + #endif + #else + #define RADEXPFUNC RADDEFFUNC + #endif + #endif + #define RADASMLINK + + #else + + #ifdef __RADNT__ + #ifndef _WIN32 + #define _WIN32 + #endif + #ifndef WIN32 + #define WIN32 + #endif + #endif + + #ifdef __RADWIN__ + #ifdef __RAD32__ + + #ifdef __RADXBOX__ + + #define RADLINK __stdcall + #define RADEXPLINK __stdcall + #define RADEXPFUNC RADDEFFUNC + + #elif defined(__RADXENON__) || defined(__RADDURANGO__) + + #define RADLINK __stdcall + #define RADEXPLINK __stdcall + + #define RADEXPFUNC RADDEFFUNC + + #elif defined(__RADWINRTAPI__) + + #define RADLINK __stdcall + #define RADEXPLINK __stdcall + + #if ( defined(__RADINSTATICLIB__) || defined(__RADNOEXPORTS__ ) || ( defined(__RADNOEXEEXPORTS__) && ( !defined(__RADINDLL__) ) && ( !defined(__RADINSTATICLIB__) ) ) ) + #define RADEXPFUNC RADDEFFUNC + #else + #ifndef __RADINDLL__ + #define RADEXPFUNC RADDEFFUNC __declspec(dllimport) + #else + #define RADEXPFUNC RADDEFFUNC __declspec(dllexport) + #endif + #endif + + #elif defined(__RADNTBUILDLINUX__) + + #define RADLINK __cdecl + #define RADEXPLINK __cdecl + #define RADEXPFUNC RADDEFFUNC + + #else + #ifdef __RADNT__ + + #define RADLINK __stdcall + #define RADEXPLINK __stdcall + + #if ( defined(__RADINSTATICLIB__) || defined(__RADNOEXPORTS__ ) || ( defined(__RADNOEXEEXPORTS__) && ( !defined(__RADINDLL__) ) && ( !defined(__RADINSTATICLIB__) ) ) ) + #define RADEXPFUNC RADDEFFUNC + #else + #ifndef __RADINDLL__ + #define RADEXPFUNC RADDEFFUNC __declspec(dllimport) + #ifdef __BORLANDC__ + #if __BORLANDC__<=0x460 + #undef RADEXPFUNC + #define RADEXPFUNC RADDEFFUNC + #endif + #endif + #else + #define RADEXPFUNC RADDEFFUNC __declspec(dllexport) + #endif + #endif + #else + #define RADLINK __pascal + #define RADEXPLINK __far __pascal + #define RADEXPFUNC RADDEFFUNC + #endif + #endif + #else + #define RADLINK __pascal + #define RADEXPLINK __far __pascal __export + #define RADEXPFUNC RADDEFFUNC + #endif + #else + #define RADLINK __pascal + #define RADEXPLINK __pascal + #define RADEXPFUNC RADDEFFUNC + #endif + + #define RADASMLINK __cdecl + + #endif + + #if !defined(__RADXBOX__) && !defined(__RADXENON__) && !defined(__RADDURANGO__) && !defined(__RADXBOXONE__) + #ifdef __RADWIN__ + #ifndef _WINDOWS + #define _WINDOWS + #endif + #endif + #endif + + #ifdef __RADLITTLEENDIAN__ + #ifdef __RADBIGENDIAN__ + #error both endians !? + #endif + #endif + + #if !defined(__RADLITTLEENDIAN__) && !defined(__RADBIGENDIAN__) + #error neither endian! + #endif + + + //----------------------------------------------------------------- + + #ifndef RADDEFFUNC + + #ifdef __cplusplus + #define RADDEFFUNC extern "C" + #define RADDEFSTART extern "C" { + #define RADDEFEND } + #define RADDEFINEDATA extern "C" + #define RADDECLAREDATA extern "C" + #define RADDEFAULT( val ) =val + + #define RR_NAMESPACE rr + #define RR_NAMESPACE_START namespace RR_NAMESPACE { + #define RR_NAMESPACE_END }; + #define RR_NAMESPACE_USE using namespace RR_NAMESPACE; + + #else + #define RADDEFFUNC + #define RADDEFSTART + #define RADDEFEND + #define RADDEFINEDATA + #define RADDECLAREDATA extern + #define RADDEFAULT( val ) + + #define RR_NAMESPACE + #define RR_NAMESPACE_START + #define RR_NAMESPACE_END + #define RR_NAMESPACE_USE + + #endif + + #endif + + // probably s.b: RAD_DECLARE_ALIGNED(type, name, alignment) + #if (defined(__RADWII__) || defined(__RADWIIU__) || defined(__RADPSP__) || defined(__RADPSP2__) || \ + defined(__RADPS3__) || defined(__RADSPU__) || defined(__RADPS4__) || \ + defined(__RADLINUX__) || defined(__RADMAC__)) || defined(__RADNDS__) || defined(__RAD3DS__) || \ + defined(__RADIPHONE__) || defined(__RADANDROID__) || defined (__RADQNX__) + #define RAD_ALIGN(type,var,num) type __attribute__ ((aligned (num))) var + #elif (defined(__RADNGC__) || defined(__RADPS2__)) + #define RAD_ALIGN(type,var,num) __attribute__ ((aligned (num))) type var + #elif (defined(_MSC_VER) && (_MSC_VER >= 1300)) || defined(__RADWINRTAPI__) + #define RAD_ALIGN(type,var,num) type __declspec(align(num)) var + #else + // NOTE: / / is a guaranteed parse error in C/C++. + #define RAD_ALIGN(type,var,num) RAD_ALIGN_USED_BUT_NOT_DEFINED / / + #endif + + // WARNING : RAD_TLS should really only be used for debug/tools stuff + // it's not reliable because even if we are built as a lib, our lib can + // be put into a DLL and then it doesn't work + #if defined(__RADNT__) || defined(__RADXENON__) + #ifndef __RADINDLL__ + // note that you can't use this in windows DLLs + #define RAD_TLS(type,var) __declspec(thread) type var + #endif + #elif defined(__RADPS3__) || defined(__RADLINUX__) || defined(__RADMAC__) + // works on PS3/gcc I believe : + #define RAD_TLS(type,var) __thread type var + #else + // RAD_TLS not defined + #endif + + // Note that __RAD16__/__RAD32__/__RAD64__ refers to the size of a pointer. + // The size of integers is specified explicitly in the code, i.e. u32 or whatever. + + #define RAD_S8 signed char + #define RAD_U8 unsigned char + + #if defined(__RAD64__) + // Remember that __RAD32__ will also be defined! + #if defined(__RADX64__) + // x64 still has 32-bit ints! + #define RAD_U32 unsigned int + #define RAD_S32 signed int + // But pointers are 64 bits. + #if (_MSC_VER >= 1300 && defined(_Wp64) && _Wp64 ) + #define RAD_SINTa __w64 signed __int64 + #define RAD_UINTa __w64 unsigned __int64 + #else // non-vc.net compiler or /Wp64 turned off + #define RAD_UINTa unsigned long long + #define RAD_SINTa signed long long + #endif + #else + #error Unknown 64-bit processor (see radbase.h) + #endif + #elif defined(__RAD32__) + #define RAD_U32 unsigned int + #define RAD_S32 signed int + // Pointers are 32 bits. + + #if ( ( defined(_MSC_VER) && (_MSC_VER >= 1300 ) ) && ( defined(_Wp64) && ( _Wp64 ) ) ) + #define RAD_SINTa __w64 signed long + #define RAD_UINTa __w64 unsigned long + #else // non-vc.net compiler or /Wp64 turned off + #ifdef _Wp64 + #define RAD_SINTa signed long + #define RAD_UINTa unsigned long + #else + #define RAD_SINTa signed int + #define RAD_UINTa unsigned int + #endif + #endif + #else + #define RAD_U32 unsigned long + #define RAD_S32 signed long + // Pointers in 16-bit land are still 32 bits. + #define RAD_UINTa unsigned long + #define RAD_SINTa signed long + #endif + + #define RAD_F32 float + #if defined(__RADPS2__) || defined(__RADPSP__) + typedef RADSTRUCT RAD_F64 // do this so that we don't accidentally use doubles + { // while using the same space + RAD_U32 vals[ 2 ]; + } RAD_F64; + #define RAD_F64_OR_32 float // type is F64 if available, otherwise F32 + #else + #define RAD_F64 double + #define RAD_F64_OR_32 double // type is F64 if available, otherwise F32 + #endif + + #if (defined(__RADMAC__) || defined(__MRC__) || defined( __RADNGC__ ) || \ + defined(__RADLINUX__) || defined( __RADWII__ ) || defined(__RADWIIU__) || \ + defined(__RADNDS__) || defined(__RADPSP__) || defined(__RADPS3__) || defined(__RADPS4__) || \ + defined(__RADSPU__) || defined(__RADIPHONE__) || defined(__RADNACL__) || defined( __RADANDROID__) || defined( __RADQNX__ ) ) + #define RAD_U64 unsigned long long + #define RAD_S64 signed long long + #elif defined(__RADPS2__) + #define RAD_U64 unsigned long + #define RAD_S64 signed long + #elif defined(__RADARM__) + #define RAD_U64 unsigned long long + #define RAD_S64 signed long long + #elif defined(__RADX64__) || defined(__RAD32__) + #define RAD_U64 unsigned __int64 + #define RAD_S64 signed __int64 + #else + // 16-bit + typedef RADSTRUCT RAD_U64 // do this so that we don't accidentally use U64s + { // while using the same space + RAD_U32 vals[ 2 ]; + } RAD_U64; + typedef RADSTRUCT RAD_S64 // do this so that we don't accidentally use S64s + { // while using the same space + RAD_S32 vals[ 2 ]; + } RAD_S64; + #endif + + #if defined(__RAD32__) + #define PTR4 + #define RAD_U16 unsigned short + #define RAD_S16 signed short + #else + #define PTR4 __far + #define RAD_U16 unsigned int + #define RAD_S16 signed int + #endif + + //------------------------------------------------- + // RAD_PTRBITS and such defined here without using sizeof() + // so that they can be used in align() and other macros + + #ifdef __RAD64__ + + #define RAD_PTRBITS 64 + #define RAD_PTRBYTES 8 + #define RAD_TWOPTRBYTES 16 + + #else + + #define RAD_PTRBITS 32 + #define RAD_PTRBYTES 4 + #define RAD_TWOPTRBYTES 8 + + #endif + + + //------------------------------------------------- + // UINTr = int the size of a register + + #ifdef __RAD64REGS__ + + #define RAD_UINTr RAD_U64 + #define RAD_SINTr RAD_S64 + + #else + + #define RAD_UINTr RAD_U32 + #define RAD_SINTr RAD_S32 + + #endif + + //=========================================================================== + + /* + // CB : meh this is enough of a mess that it's probably best to just let each + #if defined(__RADX86__) && defined(_MSC_VER) && _MSC_VER >= 1300 + #define __RADX86INTRIN2003__ + #endif + */ + + // RADASSUME(expr) tells the compiler that expr is always true + // RADUNREACHABLE must never be reachable - even in event of error + // eg. it's okay for compiler to generate completely invalid code after RADUNREACHABLE + + #ifdef _MSC_VER + #define RADFORCEINLINE __forceinline + #if _MSC_VER >= 1300 + #define RADNOINLINE __declspec(noinline) + #else + #define RADNOINLINE + #endif + #define RADUNREACHABLE __assume(0) + #define RADASSUME(exp) __assume(exp) + #elif defined(__clang__) + #ifdef _DEBUG + #define RADFORCEINLINE inline + #else + #define RADFORCEINLINE inline __attribute((always_inline)) + #endif + #define RADNOINLINE __attribute__((noinline)) + + #define RADUNREACHABLE __builtin_unreachable() + + #if __has_builtin(__builtin_assume) + #define RADASSUME(exp) __builtin_assume(exp) + #else + #define RADASSUME(exp) RAD_STATEMENT_WRAPPER( if ( ! (exp) ) __builtin_unreachable(); ) + #endif + #elif (defined(__GCC__) || defined(__GNUC__)) || defined(ANDROID) + #ifdef _DEBUG + #define RADFORCEINLINE inline + #else + #define RADFORCEINLINE inline __attribute((always_inline)) + #endif + #define RADNOINLINE __attribute__((noinline)) + + #if __RAD_GCC_VERSION__ >= 40500 + #define RADUNREACHABLE __builtin_unreachable() + #define RADASSUME(exp) RAD_STATEMENT_WRAPPER( if ( ! (exp) ) __builtin_unreachable(); ) + #else + #define RADUNREACHABLE RAD_INFINITE_LOOP( RR_BREAK(); ) + #define RADASSUME(exp) + #endif + #elif defined(__CWCC__) + #define RADFORCEINLINE inline + #define RADNOINLINE __attribute__((never_inline)) + #define RADUNREACHABLE + #define RADASSUME(x) (void)0 + #else + // ? #define RADFORCEINLINE ? + #define RADFORCEINLINE inline + #define RADNOINLINE + #define RADASSUME(x) (void)0 + #endif + + //=========================================================================== + + // RAD_ALIGN_HINT tells the compiler how a given pointer is aligned + // it *must* be true, but the compiler may or may not use that information + // it is not for cases where the pointer is to an inherently aligned data type, + // it's when the compiler cannot tell the alignment but you have extra information. + // eg : + // U8 * ptr = rrMallocAligned(256,16); + // RAD_ALIGN_HINT(ptr,16,0); + + #ifdef __RADSPU__ + #define RAD_ALIGN_HINT(ptr,alignment,offset) __align_hint(ptr,alignment,offset); RR_ASSERT( ((UINTa)(ptr) & ((alignment)-1)) == (UINTa)(offset) ) + #else + #define RAD_ALIGN_HINT(ptr,alignment,offset) RADASSUME( ((UINTa)(ptr) & ((alignment)-1)) == (UINTa)(offset) ) + #endif + + //=========================================================================== + + // RAD_EXPECT is to tell the compiler the *likely* value of an expression + // different than RADASSUME in that expr might not have that value + // it's use for branch code layout and static branch prediction + // condition can technically be a variable but should usually be 0 or 1 + + #if (defined(__GCC__) || defined(__GNUC__)) || defined(__clang__) + + // __builtin_expect returns value of expr + #define RAD_EXPECT(expr,cond) __builtin_expect(expr,cond) + + #else + + #define RAD_EXPECT(expr,cond) (expr) + + #endif + + // helpers for doing an if ( ) with expect : + // if ( RAD_LIKELY(expr) ) { ... } + + #define RAD_LIKELY(expr) RAD_EXPECT(expr,1) + #define RAD_UNLIKELY(expr) RAD_EXPECT(expr,0) + + //=========================================================================== + + // __RADX86ASM__ means you can use __asm {} style inline assembly + #if defined(__RADX86__) && !defined(__RADX64__) && defined(_MSC_VER) + #define __RADX86ASM__ + #endif + + //------------------------------------------------- + // typedefs : + + #ifndef RADNOTYPEDEFS + + #ifndef S8_DEFINED + #define S8_DEFINED + typedef RAD_S8 S8; + #endif + + #ifndef U8_DEFINED + #define U8_DEFINED + typedef RAD_U8 U8; + #endif + + #ifndef S16_DEFINED + #define S16_DEFINED + typedef RAD_S16 S16; + #endif + + #ifndef U16_DEFINED + #define U16_DEFINED + typedef RAD_U16 U16; + #endif + + #ifndef S32_DEFINED + #define S32_DEFINED + typedef RAD_S32 S32; + #endif + + #ifndef U32_DEFINED + #define U32_DEFINED + typedef RAD_U32 U32; + #endif + + #ifndef S64_DEFINED + #define S64_DEFINED + typedef RAD_S64 S64; + #endif + + #ifndef U64_DEFINED + #define U64_DEFINED + typedef RAD_U64 U64; + #endif + + #ifndef F32_DEFINED + #define F32_DEFINED + typedef RAD_F32 F32; + #endif + + #ifndef F64_DEFINED + #define F64_DEFINED + typedef RAD_F64 F64; + #endif + + #ifndef F64_OR_32_DEFINED + #define F64_OR_32_DEFINED + typedef RAD_F64_OR_32 F64_OR_32; + #endif + + // UINTa and SINTa are the ints big enough for an address + + #ifndef SINTa_DEFINED + #define SINTa_DEFINED + typedef RAD_SINTa SINTa; + #endif + + #ifndef UINTa_DEFINED + #define UINTa_DEFINED + typedef RAD_UINTa UINTa; + #endif + + #ifndef UINTr_DEFINED + #define UINTr_DEFINED + typedef RAD_UINTr UINTr; + #endif + + #ifndef SINTr_DEFINED + #define SINTr_DEFINED + typedef RAD_SINTr SINTr; + #endif + + #elif !defined(RADNOTYPEDEFINES) + + #ifndef S8_DEFINED + #define S8_DEFINED + #define S8 RAD_S8 + #endif + + #ifndef U8_DEFINED + #define U8_DEFINED + #define U8 RAD_U8 + #endif + + #ifndef S16_DEFINED + #define S16_DEFINED + #define S16 RAD_S16 + #endif + + #ifndef U16_DEFINED + #define U16_DEFINED + #define U16 RAD_U16 + #endif + + #ifndef S32_DEFINED + #define S32_DEFINED + #define S32 RAD_S32 + #endif + + #ifndef U32_DEFINED + #define U32_DEFINED + #define U32 RAD_U32 + #endif + + #ifndef S64_DEFINED + #define S64_DEFINED + #define S64 RAD_S64 + #endif + + #ifndef U64_DEFINED + #define U64_DEFINED + #define U64 RAD_U64 + #endif + + #ifndef F32_DEFINED + #define F32_DEFINED + #define F32 RAD_F32 + #endif + + #ifndef F64_DEFINED + #define F64_DEFINED + #define F64 RAD_F64 + #endif + + #ifndef F64_OR_32_DEFINED + #define F64_OR_32_DEFINED + #define F64_OR_32 RAD_F64_OR_32 + #endif + + // UINTa and SINTa are the ints big enough for an address (pointer) + #ifndef SINTa_DEFINED + #define SINTa_DEFINED + #define SINTa RAD_SINTa + #endif + + #ifndef UINTa_DEFINED + #define UINTa_DEFINED + #define UINTa RAD_UINTa + #endif + + #ifndef UINTr_DEFINED + #define UINTr_DEFINED + #define UINTr RAD_UINTr + #endif + + #ifndef SINTr_DEFINED + #define SINTr_DEFINED + #define SINTr RAD_SINTr + #endif + + #endif + + /// Some error-checking. + #if defined(__RAD64__) && !defined(__RAD32__) + // See top of file for why this is. + #error __RAD64__ must not be defined without __RAD32__ (see radbase.h) + #endif + +#ifdef _MSC_VER + // microsoft compilers + + #if _MSC_VER >= 1400 + #define RAD_STATEMENT_START \ + do { + + #define RAD_STATEMENT_END_FALSE \ + __pragma(warning(push)) \ + __pragma(warning(disable:4127)) \ + } while(0) \ + __pragma(warning(pop)) + + #define RAD_STATEMENT_END_TRUE \ + __pragma(warning(push)) \ + __pragma(warning(disable:4127)) \ + } while(1) \ + __pragma(warning(pop)) + + #else + #define RAD_USE_STANDARD_LOOP_CONSTRUCT + #endif +#else + #define RAD_USE_STANDARD_LOOP_CONSTRUCT +#endif + +#ifdef RAD_USE_STANDARD_LOOP_CONSTRUCT + #define RAD_STATEMENT_START \ + do { + + #define RAD_STATEMENT_END_FALSE \ + } while ( (void)0,0 ) + + #define RAD_STATEMENT_END_TRUE \ + } while ( (void)1,1 ) + +#endif + +#define RAD_STATEMENT_WRAPPER( code ) \ + RAD_STATEMENT_START \ + code \ + RAD_STATEMENT_END_FALSE + +#define RAD_INFINITE_LOOP( code ) \ + RAD_STATEMENT_START \ + code \ + RAD_STATEMENT_END_TRUE + + +// Must be placed after variable declarations for code compiled as .c +#if defined(_MSC_VER) && _MSC_VER >= 1700 // in 2012 aka 11.0 and later +# define RR_UNUSED_VARIABLE(x) (void) x +#else +# define RR_UNUSED_VARIABLE(x) (void)(sizeof(x)) +#endif + +//----------------------------------------------- +// RR_UINT3264 is a U64 in 64-bit code and a U32 in 32-bit code +// eg. it's pointer sized and the same type as a U32/U64 of the same size +// +// @@ CB 05/21/2012 : I think RR_UINT3264 may be deprecated +// it was useful back when UINTa was /Wp64 +// but since we removed that maybe it's not anymore ? +// + +#ifdef __RAD64__ +#define RR_UINT3264 U64 +#else +#define RR_UINT3264 U32 +#endif + +//RR_COMPILER_ASSERT( sizeof(RR_UINT3264) == sizeof(UINTa) ); + +//-------------------------------------------------- + +// RR_LINESTRING is the current line number as a string +#define RR_STRINGIZE( L ) #L +#define RR_DO_MACRO( M, X ) M(X) +#define RR_STRINGIZE_DELAY( X ) RR_DO_MACRO( RR_STRINGIZE, X ) +#define RR_LINESTRING RR_STRINGIZE_DELAY( __LINE__ ) + +#define RR_CAT(X,Y) X ## Y + +// RR_STRING_JOIN joins strings in the preprocessor and works with LINESTRING +#define RR_STRING_JOIN(arg1, arg2) RR_STRING_JOIN_DELAY(arg1, arg2) +#define RR_STRING_JOIN_DELAY(arg1, arg2) RR_STRING_JOIN_IMMEDIATE(arg1, arg2) +#define RR_STRING_JOIN_IMMEDIATE(arg1, arg2) arg1 ## arg2 + +// RR_NUMBERNAME is a macro to make a name unique, so that you can use it to declare +// variable names and they won't conflict with each other +// using __LINE__ is broken in MSVC with /ZI , but __COUNTER__ is an MSVC extension that works + +#ifdef _MSC_VER + #define RR_NUMBERNAME(name) RR_STRING_JOIN(name,__COUNTER__) +#else + #define RR_NUMBERNAME(name) RR_STRING_JOIN(name,__LINE__) +#endif + +//-------------------------------------------------- +// current plan is to use "rrbool" with plain old "true" and "false" +// if true and false give us trouble we might have to go to rrtrue and rrfalse +// BTW there's a danger for evil bugs here !! If you're checking == true +// then the rrbool must be set to exactly "1" not just "not zero" !! + +#ifndef RADNOTYPEDEFS + #ifndef RRBOOL_DEFINED + #define RRBOOL_DEFINED + typedef S32 rrbool; + typedef S32 RRBOOL; + #endif +#elif !defined(RADNOTYPEDEFINES) + #ifndef RRBOOL_DEFINED + #define RRBOOL_DEFINED + #define rrbool S32 + #define RRBOOL S32 + #endif +#endif + +//-------------------------------------------------- +// Range macros + + #ifndef RR_MIN + #define RR_MIN(a,b) ( (a) < (b) ? (a) : (b) ) + #endif + + #ifndef RR_MAX + #define RR_MAX(a,b) ( (a) > (b) ? (a) : (b) ) + #endif + + #ifndef RR_ABS + #define RR_ABS(a) ( ((a) < 0) ? -(a) : (a) ) + #endif + + #ifndef RR_CLAMP + #define RR_CLAMP(val,lo,hi) RR_MAX( RR_MIN(val,hi), lo ) + #endif + +//-------------------------------------------------- +// Data layout macros + + #define RR_ARRAY_SIZE(array) ( sizeof(array)/sizeof(array[0]) ) + + // MEMBER_OFFSET tells you the offset of a member in a type + #ifdef __RAD3DS__ + #define RR_MEMBER_OFFSET(type,member) (unsigned int)(( (char *) &(((type *)0)->member) - (char *) 0 )) + #elif defined(__RADANDROID__) || defined(__RADPSP__) || defined(__RADPS3__) || defined(__RADSPU__) + // offsetof() gets mucked with by system headers on android, making things dependent on #include order. + #define RR_MEMBER_OFFSET(type,member) __builtin_offsetof(type, member) + #elif defined(__RADLINUX__) + #define RR_MEMBER_OFFSET(type,member) (offsetof(type, member)) + #else + #define RR_MEMBER_OFFSET(type,member) ( (size_t) (UINTa) &(((type *)0)->member) ) + #endif + + // MEMBER_SIZE tells you the size of a member in a type + #define RR_MEMBER_SIZE(type,member) ( sizeof( ((type *) 0)->member) ) + + // just to make gcc shut up about derefing null : + #define RR_MEMBER_OFFSET_PTR(type,member,ptr) ( (SINTa) &(((type *)(ptr))->member) - (SINTa)(ptr) ) + #define RR_MEMBER_SIZE_PTR(type,member,ptr) ( sizeof( ((type *) (ptr))->member) ) + + // MEMBER_TO_OWNER takes a pointer to a member and gives you back the base of the object + // you should then RR_ASSERT( &(ret->member) == ptr ); + #define RR_MEMBER_TO_OWNER(type,member,ptr) (type *)( ((char *)(ptr)) - RR_MEMBER_OFFSET_PTR(type,member,ptr) ) + +//-------------------------------------------------- +// Cache / prefetch macros : + +// RR_PREFETCH for various platforms : +// +// RR_PREFETCH_SEQUENTIAL : prefetch memory for reading in a sequential scan +// platforms that automatically prefetch sequential (eg. PC) should be a no-op here +// RR_PREFETCH_WRITE_INVALIDATE : prefetch memory for writing - contents of memory are undefined +// (may be a no-op, may be a normal prefetch, may zero memory) +// warning : RR_PREFETCH_WRITE_INVALIDATE may write memory so don't do it past the end of buffers + +#ifdef __RADX86__ + +#define RR_PREFETCH_SEQUENTIAL(ptr,offset) // nop +#define RR_PREFETCH_WRITE_INVALIDATE(ptr,offset) // nop + +#elif defined(__RADXENON__) + +#define RR_PREFETCH_SEQUENTIAL(ptr,offset) __dcbt((int)(offset),(void *)(ptr)) +#define RR_PREFETCH_WRITE_INVALIDATE(ptr,offset) __dcbz128((int)(offset),(void *)(ptr)) + +#elif defined(__RADPS3__) + +#define RR_PREFETCH_SEQUENTIAL(ptr,offset) __dcbt((char *)(ptr) + (int)(offset)) +#define RR_PREFETCH_WRITE_INVALIDATE(ptr,offset) __dcbz((char *)(ptr) + (int)(offset)) + +#elif defined(__RADSPU__) + +#define RR_PREFETCH_SEQUENTIAL(ptr,offset) // intentional NOP +#define RR_PREFETCH_WRITE_INVALIDATE(ptr,offset) // nop + +#elif defined(__RADWII__) || defined(__RADWIIU__) + +#define RR_PREFETCH_SEQUENTIAL(ptr,offset) // intentional NOP for now +#define RR_PREFETCH_WRITE_INVALIDATE(ptr,offset) // nop + +#elif defined(__RAD3DS__) + +#define RR_PREFETCH_SEQUENTIAL(ptr,offset) __pld((char *)(ptr) + (int)(offset)) +#define RR_PREFETCH_WRITE_INVALIDATE(ptr,offset) __pldw((char *)(ptr) + (int)(offset)) + +#else + +// other platform +#define RR_PREFETCH_SEQUENTIAL(ptr,offset) // need_prefetch // compile error +#define RR_PREFETCH_WRITE_INVALIDATE(ptr,offset) // need_writezero // error + +#endif + +//-------------------------------------------------- +// LIGHTWEIGHT ASSERTS without rrAssert.h + +RADDEFSTART + +// set up RR_BREAK : + + #ifdef __RADNGC__ + + #define RR_BREAK() asm(" .long 0x00000001") + #define RR_CACHE_LINE_SIZE xxx + + #elif defined(__RADWII__) + + #define RR_BREAK() __asm__ volatile("trap") + #define RR_CACHE_LINE_SIZE 32 + + #elif defined(__RADWIIU__) + + #define RR_BREAK() asm("trap") + #define RR_CACHE_LINE_SIZE 32 + + #elif defined(__RAD3DS__) + + #define RR_BREAK() *((int volatile*)0)=0 + #define RR_CACHE_LINE_SIZE 32 + + #elif defined(__RADNDS__) + + #define RR_BREAK() asm("BKPT 0") + #define RR_CACHE_LINE_SIZE xxx + + #elif defined(__RADPS2__) + + #define RR_BREAK() __asm__ volatile("break") + #define RR_CACHE_LINE_SIZE 64 + + #elif defined(__RADPSP__) + + #define RR_BREAK() __asm__("break 0") + #define RR_CACHE_LINE_SIZE 64 + + #elif defined(__RADPSP2__) + + #define RR_BREAK() { __asm__ volatile("bkpt 0x0000"); } + #define RR_CACHE_LINE_SIZE 32 + + #elif defined (__RADQNX__) + #define RR_BREAK() __builtin_trap() + #define RR_CACHE_LINE_SIZE 32 + #elif defined (__RADARM__) && defined (__RADLINUX__) + #define RR_BREAK() __builtin_trap() + #define RR_CACHE_LINE_SIZE 32 + #elif defined(__RADSPU__) + + #define RR_BREAK() __asm volatile ("stopd 0,1,1") + #define RR_CACHE_LINE_SIZE 128 + + #elif defined(__RADPS3__) + + // #ifdef snPause // in LibSN.h + // snPause + // __asm__ volatile ( "tw 31,1,1" ) + + #define RR_BREAK() __asm__ volatile ( "tw 31,1,1" ) + //#define RR_BREAK() __asm__ volatile("trap"); + + #define RR_CACHE_LINE_SIZE 128 + + #elif defined(__RADMAC__) + + #if defined(__GNUG__) || defined(__GNUC__) + #ifdef __RADX86__ + #define RR_BREAK() __asm__ volatile ( "int $3" ) + #else + #define RR_BREAK() __builtin_trap() + #endif + #else + #ifdef __RADMACH__ + void DebugStr(unsigned char const *); + #else + void pascal DebugStr(unsigned char const *); + #endif + #define RR_BREAK() DebugStr("\pRR_BREAK() was called") + #endif + + #define RR_CACHE_LINE_SIZE 64 + + #elif defined(__RADIPHONE__) + #define RR_BREAK() __builtin_trap() + #define RR_CACHE_LINE_SIZE 32 + #elif defined(__RADXENON__) + #define RR_BREAK() __debugbreak() + #define RR_CACHE_LINE_SIZE 128 + #elif defined(__RADANDROID__) + #define RR_BREAK() __builtin_trap() + #define RR_CACHE_LINE_SIZE 32 + #elif defined(__RADPS4__) + #define RR_BREAK() __builtin_trap() + #define RR_CACHE_LINE_SIZE 64 + #elif defined(__RADNACL__) + #define RR_BREAK() __builtin_trap() + #define RR_CACHE_LINE_SIZE 64 + #else + // x86 : + #define RR_CACHE_LINE_SIZE 64 + + #ifdef __RADLINUX__ + #define RR_BREAK() __asm__ volatile ( "int $3" ) + #elif defined(__WATCOMC__) + + void RR_BREAK( void ); + #pragma aux RR_BREAK = "int 0x3"; + + #elif defined(__RADWIN__) && defined(_MSC_VER) && _MSC_VER >= 1300 + + #define RR_BREAK __debugbreak + + #else + + #define RR_BREAK() RAD_STATEMENT_WRAPPER( __asm {int 3} ) + + #endif + + #endif + +// simple RR_ASSERT : + +// CB 5-27-10 : use RR_DO_ASSERTS to toggle asserts on and off : +#if (defined(_DEBUG) && !defined(NDEBUG)) || defined(ASSERT_IN_RELEASE) + #define RR_DO_ASSERTS +#endif + +/********* + +rrAsserts : + +RR_ASSERT(exp) - the normal assert thing, toggled with RR_DO_ASSERTS +RR_ASSERT_ALWAYS(exp) - assert that you want to test even in ALL builds (including final!) +RR_ASSERT_RELEASE(exp) - assert that you want to test even in release builds (not for final!) +RR_ASSERT_LITE(exp) - normal assert is not safe from threads or inside malloc; use this instead +RR_DURING_ASSERT(exp) - wrap operations that compute stuff for assert in here +RR_DO_ASSERTS - toggle tells you if asserts are enabled or not + +RR_BREAK() - generate a debug break - always ! +RR_ASSERT_BREAK() - RR_BREAK for asserts ; disable with RAD_NO_BREAK + +RR_ASSERT_FAILURE(str) - just break with a messsage; like assert with no condition +RR_ASSERT_FAILURE_ALWAYS(str) - RR_ASSERT_FAILURE in release builds too +RR_CANT_GET_HERE() - put in spots execution should never go +RR_COMPILER_ASSERT(exp) - checks constant conditions at compile time + +RADTODO - note to search for nonfinal stuff +RR_PRAGMA_MESSAGE - message dealy, use with #pragma in MSVC + +*************/ + +//----------------------------------------------------------- + + +#if defined(__GNUG__) || defined(__GNUC__) || (defined(_MSC_VER) && _MSC_VER > 1200) + #define RR_FUNCTION_NAME __FUNCTION__ +#else + #define RR_FUNCTION_NAME 0 + + // __func__ is in the C99 standard +#endif + +//----------------------------------------------------------- + +// rrDisplayAssertion might just log, or it might pop a message box, depending on settings +// rrDisplayAssertion returns whether you should break or not +typedef rrbool (RADLINK fp_rrDisplayAssertion)(int * Ignored, const char * fileName,const int line,const char * function,const char * message); + +extern fp_rrDisplayAssertion * g_fp_rrDisplayAssertion; + +// if I have func pointer, call it, else true ; true = do int 3 +#define rrDisplayAssertion(i,n,l,f,m) ( ( g_fp_rrDisplayAssertion ) ? (*g_fp_rrDisplayAssertion)(i,n,l,f,m) : 1 ) + +//----------------------------------------------------------- + +// RAD_NO_BREAK : option if you don't like your assert to break +// CB : RR_BREAK is *always* a break ; RR_ASSERT_BREAK is optional +#ifdef RAD_NO_BREAK +#define RR_ASSERT_BREAK() 0 +#else +#define RR_ASSERT_BREAK() RR_BREAK() +#endif + +// assert_always is on FINAL ! +#define RR_ASSERT_ALWAYS(exp) RAD_STATEMENT_WRAPPER( static int Ignored=0; if ( ! (exp) ) { if ( rrDisplayAssertion(&Ignored,__FILE__,__LINE__,RR_FUNCTION_NAME,#exp) ) RR_ASSERT_BREAK(); } ) + +// RR_ASSERT_FAILURE is like an assert without a condition - if you hit it, you're bad +#define RR_ASSERT_FAILURE_ALWAYS(str) RAD_STATEMENT_WRAPPER( static int Ignored=0; if ( rrDisplayAssertion(&Ignored,__FILE__,__LINE__,RR_FUNCTION_NAME,str) ) RR_ASSERT_BREAK(); ) + +#define RR_ASSERT_LITE_ALWAYS(exp) RAD_STATEMENT_WRAPPER( if ( ! (exp) ) { RR_ASSERT_BREAK(); } ) + +//----------------------------------- +#ifdef RR_DO_ASSERTS + +#define RR_ASSERT(exp) RR_ASSERT_ALWAYS(exp) +#define RR_ASSERT_LITE(exp) RR_ASSERT_LITE_ALWAYS(exp) +#define RR_ASSERT_NO_ASSUME(exp) RR_ASSERT_ALWAYS(exp) +// RR_DURING_ASSERT is to set up expressions or declare variables that are only used in asserts +#define RR_DURING_ASSERT(exp) exp + +#define RR_ASSERT_FAILURE(str) RR_ASSERT_FAILURE_ALWAYS(str) + +// RR_CANT_GET_HERE is for like defaults in switches that should never be hit +#define RR_CANT_GET_HERE() RAD_STATEMENT_WRAPPER( RR_ASSERT_FAILURE("can't get here"); RADUNREACHABLE; ) + + +#else // RR_DO_ASSERTS //----------------------------------- + +#define RR_ASSERT(exp) (void)0 +#define RR_ASSERT_LITE(exp) (void)0 +#define RR_ASSERT_NO_ASSUME(exp) (void)0 + +#define RR_DURING_ASSERT(exp) (void)0 + +#define RR_ASSERT_FAILURE(str) (void)0 + +#define RR_CANT_GET_HERE() RADUNREACHABLE + +#endif // RR_DO_ASSERTS //----------------------------------- + +//================================================================= + +// RR_ASSERT_RELEASE is on in release build, but not final + +#ifndef __RADFINAL__ + +#define RR_ASSERT_RELEASE(exp) RR_ASSERT_ALWAYS(exp) +#define RR_ASSERT_LITE_RELEASE(exp) RR_ASSERT_LITE_ALWAYS(exp) + +#else + +#define RR_ASSERT_RELEASE(exp) (void)0 +#define RR_ASSERT_LITE_RELEASE(exp) (void)0 + +#endif + +// BH: This never gets compiled away except for __RADFINAL__ +#define RR_ASSERT_ALWAYS_NO_SHIP RR_ASSERT_RELEASE + +#define rrAssert RR_ASSERT +#define rrassert RR_ASSERT + +#ifdef _MSC_VER + // without this, our assert errors... + #if _MSC_VER >= 1300 + #pragma warning( disable : 4127) // conditional expression is constant + #endif +#endif + +//--------------------------------------- +// Get/Put from memory in little or big endian : +// +// val = RR_GET32_BE(ptr) +// RR_PUT32_BE(ptr,val) +// +// available here : +// RR_[GET/PUT][16/32]_[BE/LE][_UNALIGNED][_OFFSET] +// +// if you don't specify _UNALIGNED , then ptr & offset shoud both be aligned to type size +// _OFFSET is in *bytes* ! + +// you can #define RR_GET_RESTRICT to make all RR_GETs be RESTRICT +// if you set nothing they are not + +#ifdef RR_GET_RESTRICT +#define RR_GET_PTR_POST RADRESTRICT +#endif +#ifndef RR_GET_PTR_POST +#define RR_GET_PTR_POST +#endif + +// native version of get/put is always trivial : + +#define RR_GET16_NATIVE(ptr) *((const U16 * RR_GET_PTR_POST)(ptr)) +#define RR_PUT16_NATIVE(ptr,val) *((U16 * RR_GET_PTR_POST)(ptr)) = (val) + +// offset is in bytes +#define RR_U16_PTR_OFFSET(ptr,offset) ((U16 * RR_GET_PTR_POST)((char *)(ptr) + (offset))) +#define RR_GET16_NATIVE_OFFSET(ptr,offset) *( RR_U16_PTR_OFFSET((ptr),offset) ) +#define RR_PUT16_NATIVE_OFFSET(ptr,val,offset) *( RR_U16_PTR_OFFSET((ptr),offset)) = (val) + +#define RR_GET32_NATIVE(ptr) *((const U32 * RR_GET_PTR_POST)(ptr)) +#define RR_PUT32_NATIVE(ptr,val) *((U32 * RR_GET_PTR_POST)(ptr)) = (val) + +// offset is in bytes +#define RR_U32_PTR_OFFSET(ptr,offset) ((U32 * RR_GET_PTR_POST)((char *)(ptr) + (offset))) +#define RR_GET32_NATIVE_OFFSET(ptr,offset) *( RR_U32_PTR_OFFSET((ptr),offset) ) +#define RR_PUT32_NATIVE_OFFSET(ptr,val,offset) *( RR_U32_PTR_OFFSET((ptr),offset)) = (val) + +#define RR_GET64_NATIVE(ptr) *((const U64 * RR_GET_PTR_POST)(ptr)) +#define RR_PUT64_NATIVE(ptr,val) *((U64 * RR_GET_PTR_POST)(ptr)) = (val) + +// offset is in bytes +#define RR_U64_PTR_OFFSET(ptr,offset) ((U64 * RR_GET_PTR_POST)((char *)(ptr) + (offset))) +#define RR_GET64_NATIVE_OFFSET(ptr,offset) *( RR_U64_PTR_OFFSET((ptr),offset) ) +#define RR_PUT64_NATIVE_OFFSET(ptr,val,offset) *( RR_U64_PTR_OFFSET((ptr),offset)) = (val) + +//--------------------------------------------------- + +#ifdef __RADLITTLEENDIAN__ + +#define RR_GET16_LE RR_GET16_NATIVE +#define RR_PUT16_LE RR_PUT16_NATIVE +#define RR_GET16_LE_OFFSET RR_GET16_NATIVE_OFFSET +#define RR_PUT16_LE_OFFSET RR_PUT16_NATIVE_OFFSET + +#define RR_GET32_LE RR_GET32_NATIVE +#define RR_PUT32_LE RR_PUT32_NATIVE +#define RR_GET32_LE_OFFSET RR_GET32_NATIVE_OFFSET +#define RR_PUT32_LE_OFFSET RR_PUT32_NATIVE_OFFSET + +#define RR_GET64_LE RR_GET64_NATIVE +#define RR_PUT64_LE RR_PUT64_NATIVE +#define RR_GET64_LE_OFFSET RR_GET64_NATIVE_OFFSET +#define RR_PUT64_LE_OFFSET RR_PUT64_NATIVE_OFFSET + +#else + +#define RR_GET16_BE RR_GET16_NATIVE +#define RR_PUT16_BE RR_PUT16_NATIVE +#define RR_GET16_BE_OFFSET RR_GET16_NATIVE_OFFSET +#define RR_PUT16_BE_OFFSET RR_PUT16_NATIVE_OFFSET + +#define RR_GET32_BE RR_GET32_NATIVE +#define RR_PUT32_BE RR_PUT32_NATIVE +#define RR_GET32_BE_OFFSET RR_GET32_NATIVE_OFFSET +#define RR_PUT32_BE_OFFSET RR_PUT32_NATIVE_OFFSET + +#define RR_GET64_BE RR_GET64_NATIVE +#define RR_PUT64_BE RR_PUT64_NATIVE +#define RR_GET64_BE_OFFSET RR_GET64_NATIVE_OFFSET +#define RR_PUT64_BE_OFFSET RR_PUT64_NATIVE_OFFSET + +#endif + +//------------------------- +// non-native Get/Put implementations go here : + +#if defined(__RADX86__) +// good implementation for X86 : + +#if (_MSC_VER >= 1300) + +unsigned short __cdecl _byteswap_ushort (unsigned short _Short); +unsigned long __cdecl _byteswap_ulong (unsigned long _Long); +#pragma intrinsic(_byteswap_ushort, _byteswap_ulong) + +#define RR_BSWAP16 _byteswap_ushort +#define RR_BSWAP32 _byteswap_ulong + +unsigned __int64 __cdecl _byteswap_uint64 (unsigned __int64 val); +#pragma intrinsic(_byteswap_uint64) +#define RR_BSWAP64 _byteswap_uint64 + +#elif defined(_MSC_VER) // VC6 + +RADFORCEINLINE unsigned long RR_BSWAP16 (unsigned long _Long) +{ + __asm { + mov eax, [_Long] + rol ax, 8 + mov [_Long], eax; + } + return _Long; +} + +RADFORCEINLINE unsigned long RR_BSWAP32 (unsigned long _Long) +{ + __asm { + mov eax, [_Long] + bswap eax + mov [_Long], eax + } + return _Long; +} + +RADFORCEINLINE unsigned __int64 RR_BSWAP64 (unsigned __int64 _Long) +{ + __asm { + mov eax, DWORD PTR _Long + mov edx, DWORD PTR _Long+4 + bswap eax + bswap edx + mov DWORD PTR _Long, edx + mov DWORD PTR _Long+4, eax + } + return _Long; +} + +#elif defined(__GNUC__) || defined(__clang__) + +// GCC has __builtin_bswap16, but Clang only seems to have added it recently. +// We use __builtin_bswap32/64 but 16 just uses the macro version. (No big +// deal if that turns into shifts anyway) +#define RR_BSWAP16(u16) ( (U16) ( ((u16) >> 8) | ((u16) << 8) ) ) +#define RR_BSWAP32 __builtin_bswap32 +#define RR_BSWAP64 __builtin_bswap64 + +#endif + +#define RR_GET16_BE(ptr) RR_BSWAP16(*((U16 *)(ptr))) +#define RR_PUT16_BE(ptr,val) *((U16 *)(ptr)) = (U16) RR_BSWAP16(val) +#define RR_GET16_BE_OFFSET(ptr,offset) RR_BSWAP16(*RR_U16_PTR_OFFSET(ptr,offset)) +#define RR_PUT16_BE_OFFSET(ptr,val,offset) *RR_U16_PTR_OFFSET(ptr,offset) = RR_BSWAP16(val) + +#define RR_GET32_BE(ptr) RR_BSWAP32(*((U32 *)(ptr))) +#define RR_PUT32_BE(ptr,val) *((U32 *)(ptr)) = RR_BSWAP32(val) +#define RR_GET32_BE_OFFSET(ptr,offset) RR_BSWAP32(*RR_U32_PTR_OFFSET(ptr,offset)) +#define RR_PUT32_BE_OFFSET(ptr,val,offset) *RR_U32_PTR_OFFSET(ptr,offset) = RR_BSWAP32(val) + +#define RR_GET64_BE(ptr) RR_BSWAP64(*((U64 *)(ptr))) +#define RR_PUT64_BE(ptr,val) *((U64 *)(ptr)) = RR_BSWAP64(val) +#define RR_GET64_BE_OFFSET(ptr,offset) RR_BSWAP64(*RR_U64_PTR_OFFSET(ptr,offset)) +#define RR_PUT64_BE_OFFSET(ptr,val,offset) *RR_U64_PTR_OFFSET(ptr,offset) = RR_BSWAP64(val) + +// end _MSC_VER + +#elif defined(__RADXENON__) // Xenon has built-in funcs for this + +unsigned short __loadshortbytereverse(int offset, const void *base); +unsigned long __loadwordbytereverse (int offset, const void *base); + +void __storeshortbytereverse(unsigned short val, int offset, void *base); +void __storewordbytereverse (unsigned int val, int offset, void *base); + +#define RR_GET16_LE(ptr) __loadshortbytereverse(0, ptr) +#define RR_PUT16_LE(ptr,val) __storeshortbytereverse((U16) (val), 0, ptr) + +#define RR_GET16_LE_OFFSET(ptr,offset) __loadshortbytereverse(offset, ptr) +#define RR_PUT16_LE_OFFSET(ptr,val,offset) __storeshortbytereverse((U16) (val), offset, ptr) + +#define RR_GET32_LE(ptr) __loadwordbytereverse(0, ptr) +#define RR_PUT32_LE(ptr,val) __storewordbytereverse((U32) (val), 0, ptr) + +#define RR_GET32_LE_OFFSET(ptr,offset) __loadwordbytereverse(offset, ptr) +#define RR_PUT32_LE_OFFSET(ptr,val,offset) __storewordbytereverse((U32) (val), offset, ptr) + +#define RR_GET64_LE(ptr) ( ((U64)RR_GET32_OFFSET_LE(ptr,4)<<32) | RR_GET32_LE(ptr) ) +#define RR_PUT64_LE(ptr,val) RR_PUT32_LE(ptr, (U32) (val)), RR_PUT32_OFFSET_LE(ptr, (U32) ((val)>>32),4) + +#elif defined(__RADPS3__) + +#include + +#define RR_GET16_LE(ptr) __lhbrx(ptr) +#define RR_PUT16_LE(ptr,val) __sthbrx(ptr, (U16) (val)) + +#define RR_GET16_LE_OFFSET(ptr,offset) __lhbrx(RR_U16_PTR_OFFSET(ptr, offset)) +#define RR_PUT16_LE_OFFSET(ptr,val,offset) __sthbrx(RR_U16_PTR_OFFSET(ptr, offset), (U16) (val)) + +#define RR_GET32_LE(ptr) __lwbrx(ptr) +#define RR_PUT32_LE(ptr,val) __stwbrx(ptr, (U32) (val)) + +#define RR_GET64_LE(ptr) __ldbrx(ptr) +#define RR_PUT64_LE(ptr,val) __stdbrx(ptr, (U32) (val)) + +#define RR_GET32_LE_OFFSET(ptr,offset) __lwbrx(RR_U32_PTR_OFFSET(ptr, offset)) +#define RR_PUT32_LE_OFFSET(ptr,val,offset) __stwbrx(RR_U32_PTR_OFFSET(ptr, offset), (U32) (val)) + +#elif defined(__RADWII__) + +#define RR_GET16_LE(ptr) __lhbrx(ptr, 0) +#define RR_PUT16_LE(ptr,val) __sthbrx((U16) (val), ptr, 0) + +#define RR_GET16_LE_OFFSET(ptr,offset) __lhbrx(ptr, offset) +#define RR_PUT16_LE_OFFSET(ptr,val,offset) __sthbrx((U16) (val), ptr, offset) + +#define RR_GET32_LE(ptr) __lwbrx(ptr, 0) +#define RR_PUT32_LE(ptr,val) __stwbrx((U32) (val), ptr, 0) + +#define RR_GET32_LE_OFFSET(ptr,offset) __lwbrx(ptr, offset) +#define RR_PUT32_LE_OFFSET(ptr,val,offset) __stwbrx((U32) (val), ptr, offset) + +#elif defined(__RAD3DS__) + +#define RR_GET16_BE(ptr) __rev16(*(U16 *) (ptr)) +#define RR_PUT16_BE(ptr,val) *(U16 *) (ptr) = __rev16(val) + +#define RR_GET16_BE_OFFSET(ptr,offset) __rev16(*RR_U16_PTR_OFFSET(ptr,offset)) +#define RR_PUT16_BE_OFFSET(ptr,offset,val) *RR_U16_PTR_OFFSET(ptr,offset) = __rev16(val) + +#define RR_GET32_BE(ptr) __rev(*(U32 *) (ptr)) +#define RR_PUT32_BE(ptr,val) *(U32 *) (ptr) = __rev(val) + +#define RR_GET32_BE_OFFSET(ptr,offset) __rev(*RR_U32_PTR_OFFSET(ptr,offset)) +#define RR_PUT32_BE_OFFSET(ptr,offset,val) *RR_U32_PTR_OFFSET(ptr,offset) = __rev(val) + +#elif defined(__RADIPHONE__) + +// iPhone does not seem to have intrinsics for this, so use generic fallback! + +// Bswap is just here for use of implementing get/put +// caller should use Get/Put , not bswap +#define RR_BSWAP16(u16) ( (U16) ( ((u16) >> 8) | ((u16) << 8) ) ) +#define RR_BSWAP32(u32) ( (U32) ( ((u32) >> 24) | (((u32)<<8) & 0x00FF0000) | (((u32)>>8) & 0x0000FF00) | ((u32) << 24) ) ) + +#define RR_GET16_BE(ptr) RR_BSWAP16(*((U16 *)(ptr))) +#define RR_PUT16_BE(ptr,val) *((U16 *)(ptr)) = RR_BSWAP16(val) + +#define RR_GET32_BE(ptr) RR_BSWAP32(*((U32 *)(ptr))) +#define RR_PUT32_BE(ptr,val) *((U32 *)(ptr)) = RR_BSWAP32(val) + +#elif defined(__RADWIIU__) + +#include + +#define RR_GET16_LE(ptr) (*(__bytereversed U16 *) (ptr)) +#define RR_PUT16_LE(ptr,val) *(__bytereversed U16 *) (ptr) = val + +#define RR_GET16_LE_OFFSET(ptr,offset) (*(__bytereversed U16 *)RR_U16_PTR_OFFSET(ptr,offset)) +#define RR_PUT16_LE_OFFSET(ptr,val,offset) *(__bytereversed U16 *)RR_U16_PTR_OFFSET(ptr,offset) = val + +#define RR_GET32_LE(ptr) (*(__bytereversed U32 *) (ptr)) +#define RR_PUT32_LE(ptr,val) *(__bytereversed U32 *) (ptr) = val + +#define RR_GET32_LE_OFFSET(ptr,offset) (*(__bytereversed U32 *)RR_U32_PTR_OFFSET(ptr,offset)) +#define RR_PUT32_LE_OFFSET(ptr,val,offset) *(__bytereversed U32 *)RR_U32_PTR_OFFSET(ptr,offset) = val + +#define RR_GET64_LE(ptr) (*(__bytereversed U64 *) (ptr)) +#define RR_PUT64_LE(ptr,val) *(__bytereversed U64 *) (ptr) = val + +#define RR_GET64_LE_OFFSET(ptr,offset) (*(__bytereversed U64 *)RR_U32_PTR_OFFSET(ptr,offset)) +#define RR_PUT64_LE_OFFSET(ptr,val,offset) *(__bytereversed U64 *)RR_U32_PTR_OFFSET(ptr,offset) = val + +#elif defined(__RADWINRTAPI__) && defined(__RADARM__) + +#include + +#define RR_BSWAP16(u16) _arm_rev16(u16) +#define RR_BSWAP32(u32) _arm_rev(u32) + +#define RR_GET16_BE(ptr) RR_BSWAP16(*((U16 *)(ptr))) +#define RR_PUT16_BE(ptr,val) *((U16 *)(ptr)) = RR_BSWAP16(val) + +#define RR_GET32_BE(ptr) RR_BSWAP32(*((U32 *)(ptr))) +#define RR_PUT32_BE(ptr,val) *((U32 *)(ptr)) = RR_BSWAP32(val) + +#elif defined(__RADPSP2__) + +// no rev16 exposed +#define RR_BSWAP16(u16) ( (U16) ( ((u16) >> 8) | ((u16) << 8) ) ) +#define RR_BSWAP32(u32) __builtin_rev(u32) + +#define RR_GET16_BE(ptr) RR_BSWAP16(*((U16 *)(ptr))) +#define RR_PUT16_BE(ptr,val) *((U16 *)(ptr)) = RR_BSWAP16(val) + +#define RR_GET32_BE(ptr) RR_BSWAP32(*((U32 *)(ptr))) +#define RR_PUT32_BE(ptr,val) *((U32 *)(ptr)) = RR_BSWAP32(val) + +#else // other platforms ? + +// fall back : + +// Bswap is just here for use of implementing get/put +// caller should use Get/Put , not bswap +#define RR_BSWAP16(u16) ( (U16) ( ((u16) >> 8) | ((u16) << 8) ) ) +#define RR_BSWAP32(u32) ( (U32) ( ((u32) >> 24) | (((u32)<<8) & 0x00FF0000) | (((u32)>>8) & 0x0000FF00) | ((u32) << 24) ) ) +#define RR_BSWAP64(u64) ( ((U64) RR_BSWAP32((U32) (u64)) << 32) | (U64) RR_BSWAP32((U32) ((u64) >> 32)) ) + +#ifdef __RADLITTLEENDIAN__ + +// comment out fallbacks so users will get errors +//#define RR_GET16_BE(ptr) RR_BSWAP16(*((U16 *)(ptr))) +//#define RR_PUT16_BE(ptr,val) *((U16 *)(ptr)) = RR_BSWAP16(val) +//#define RR_GET32_BE(ptr) RR_BSWAP32(*((U32 *)(ptr))) +//#define RR_PUT32_BE(ptr,val) *((U32 *)(ptr)) = RR_BSWAP32(val) + +#else + +// comment out fallbacks so users will get errors +//#define RR_GET16_LE(ptr) RR_BSWAP16(*((U16 *)(ptr))) +//#define RR_PUT16_LE(ptr,val) *((U16 *)(ptr)) = RR_BSWAP16(val) +//#define RR_GET32_LE(ptr) RR_BSWAP32(*((U32 *)(ptr))) +//#define RR_PUT32_LE(ptr,val) *((U32 *)(ptr)) = RR_BSWAP32(val) + +#endif + +#endif + +//=================================================================== +// @@ TEMP : Aliases for old names : remove me when possible : + +#define RR_GET32_OFFSET_LE RR_GET32_LE_OFFSET +#define RR_GET32_OFFSET_BE RR_GET32_BE_OFFSET +#define RR_PUT32_OFFSET_LE RR_PUT32_LE_OFFSET +#define RR_PUT32_OFFSET_BE RR_PUT32_BE_OFFSET +#define RR_GET16_OFFSET_LE RR_GET16_LE_OFFSET +#define RR_GET16_OFFSET_BE RR_GET16_BE_OFFSET +#define RR_PUT16_OFFSET_LE RR_PUT16_LE_OFFSET +#define RR_PUT16_OFFSET_BE RR_PUT16_BE_OFFSET + + +//=================================================================== +// UNALIGNED VERSIONS : + +#if defined(__RADX86__) || defined(__RADPPC__) // platforms where unaligned is fast : + +#define RR_GET32_BE_UNALIGNED(ptr) RR_GET32_BE(ptr) +#define RR_GET32_BE_UNALIGNED_OFFSET(ptr,offset) RR_GET32_BE_OFFSET(ptr,offset) +#define RR_GET16_BE_UNALIGNED(ptr) RR_GET16_BE(ptr) +#define RR_GET16_BE_UNALIGNED_OFFSET(ptr,offset) RR_GET16_BE_OFFSET(ptr,offset) + +#define RR_GET32_LE_UNALIGNED(ptr) RR_GET32_LE(ptr) +#define RR_GET32_LE_UNALIGNED_OFFSET(ptr,offset) RR_GET32_LE_OFFSET(ptr,offset) +#define RR_GET16_LE_UNALIGNED(ptr) RR_GET16_LE(ptr) +#define RR_GET16_LE_UNALIGNED_OFFSET(ptr,offset) RR_GET16_LE_OFFSET(ptr,offset) + +#elif defined(__RAD3DS__) + +// arm has a "__packed" qualifier to tell the compiler to do unaligned accesses +#define RR_U16_PTR_OFFSET_UNALIGNED(ptr,offset) ((__packed U16 * RR_GET_PTR_POST)((char *)(ptr) + (offset))) +#define RR_U32_PTR_OFFSET_UNALIGNED(ptr,offset) ((__packed U32 * RR_GET_PTR_POST)((char *)(ptr) + (offset))) + +#define RR_GET32_BE_UNALIGNED(ptr) __rev(*RR_U32_PTR_OFFSET_UNALIGNED(ptr,0)) +#define RR_GET32_BE_UNALIGNED_OFFSET(ptr,offset) __rev(*RR_U32_PTR_OFFSET_UNALIGNED(ptr,offset)) +#define RR_GET16_BE_UNALIGNED(ptr) __rev16(*RR_U16_PTR_OFFSET_UNALIGNED(ptr,0)) +#define RR_GET16_BE_UNALIGNED_OFFSET(ptr,offset) __rev16(*RR_U16_PTR_OFFSET_UNALIGNED(ptr,offset)) + +#define RR_GET32_LE_UNALIGNED(ptr) *RR_U32_PTR_OFFSET_UNALIGNED(ptr,0) +#define RR_GET32_LE_UNALIGNED_OFFSET(ptr,offset) *RR_U32_PTR_OFFSET_UNALIGNED(ptr,offset) +#define RR_GET16_LE_UNALIGNED(ptr) *RR_U16_PTR_OFFSET_UNALIGNED(ptr,0) +#define RR_GET16_LE_UNALIGNED_OFFSET(ptr,offset) *RR_U16_PTR_OFFSET_UNALIGNED(ptr,offset) + +#elif defined(__RADPSP2__) + +#define RR_U16_PTR_OFFSET_UNALIGNED(ptr,offset) ((U16 __unaligned * RR_GET_PTR_POST)((char *)(ptr) + (offset))) +#define RR_U32_PTR_OFFSET_UNALIGNED(ptr,offset) ((U32 __unaligned * RR_GET_PTR_POST)((char *)(ptr) + (offset))) + +#define RR_GET32_BE_UNALIGNED(ptr) RR_BSWAP32(*RR_U32_PTR_OFFSET_UNALIGNED(ptr,0)) +#define RR_GET32_BE_UNALIGNED_OFFSET(ptr,offset) RR_BSWAP32(*RR_U32_PTR_OFFSET_UNALIGNED(ptr,offset)) +#define RR_GET16_BE_UNALIGNED(ptr) RR_BSWAP16(*RR_U16_PTR_OFFSET_UNALIGNED(ptr,0)) +#define RR_GET16_BE_UNALIGNED_OFFSET(ptr,offset) RR_BSWAP16(*RR_U16_PTR_OFFSET_UNALIGNED(ptr,offset)) + +#define RR_GET32_LE_UNALIGNED(ptr) *RR_U32_PTR_OFFSET_UNALIGNED(ptr,0) +#define RR_GET32_LE_UNALIGNED_OFFSET(ptr,offset) *RR_U32_PTR_OFFSET_UNALIGNED(ptr,offset) +#define RR_GET16_LE_UNALIGNED(ptr) *RR_U16_PTR_OFFSET_UNALIGNED(ptr,0) +#define RR_GET16_LE_UNALIGNED_OFFSET(ptr,offset) *RR_U16_PTR_OFFSET_UNALIGNED(ptr,offset) + +#else +// Unaligned via bytes : + +#define RR_GET32_BE_UNALIGNED(ptr) ( \ + ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr)))[0] << 24 ) | \ + ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr)))[1] << 16 ) | \ + ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr)))[2] << 8 ) | \ + ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr)))[3] << 0 ) ) + +#define RR_GET32_BE_UNALIGNED_OFFSET(ptr,offset) ( \ + ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr))+(offset))[0] << 24 ) | \ + ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr))+(offset))[1] << 16 ) | \ + ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr))+(offset))[2] << 8 ) | \ + ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr))+(offset))[3] << 0 ) ) + +#define RR_GET16_BE_UNALIGNED(ptr) ( \ + ( (U16)(((const U8 * RR_GET_PTR_POST)(ptr)))[0] << 8 ) | \ + ( (U16)(((const U8 * RR_GET_PTR_POST)(ptr)))[1] << 0 ) ) + +#define RR_GET16_BE_UNALIGNED_OFFSET(ptr,offset) ( \ + ( (U16)(((const U8 * RR_GET_PTR_POST)(ptr))+(offset))[0] << 8 ) | \ + ( (U16)(((const U8 * RR_GET_PTR_POST)(ptr))+(offset))[1] << 0 ) ) + +#define RR_GET32_LE_UNALIGNED(ptr) ( \ + ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr)))[3] << 24 ) | \ + ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr)))[2] << 16 ) | \ + ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr)))[1] << 8 ) | \ + ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr)))[0] << 0 ) ) + +#define RR_GET32_LE_UNALIGNED_OFFSET(ptr,offset) ( \ + ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr))+(offset))[3] << 24 ) | \ + ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr))+(offset))[2] << 16 ) | \ + ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr))+(offset))[1] << 8 ) | \ + ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr))+(offset))[0] << 0 ) ) + +#define RR_GET16_LE_UNALIGNED(ptr) ( \ + ( (U16)(((const U8 * RR_GET_PTR_POST)(ptr)))[1] << 8 ) | \ + ( (U16)(((const U8 * RR_GET_PTR_POST)(ptr)))[0] << 0 ) ) + +#define RR_GET16_LE_UNALIGNED_OFFSET(ptr,offset) ( \ + ( (U16)(((const U8 * RR_GET_PTR_POST)(ptr))+(offset))[1] << 8 ) | \ + ( (U16)(((const U8 * RR_GET_PTR_POST)(ptr))+(offset))[0] << 0 ) ) + +#endif + +//=================================================================== +// RR_ROTL32 : 32-bit rotate +// + +#ifdef _MSC_VER + + unsigned long __cdecl _lrotl(unsigned long, int); + #pragma intrinsic(_lrotl) + + #define RR_ROTL32(x,k) _lrotl((unsigned long)(x),(int)(k)) + +#elif defined(__RADCELL__) || defined(__RADLINUX__) || defined(__RADWII__) || defined(__RADMACAPI__) || defined(__RADWIIU__) || defined(__RADPS4__) || defined(__RADPSP2__) + + // Compiler turns this into rotate correctly : + #define RR_ROTL32(u32,num) ( ( (u32) << (num) ) | ( (u32) >> (32 - (num))) ) + +#elif defined(__RAD3DS__) + + #define RR_ROTL32(u32,num) __ror(u32, (-(num))&31) + +#else + +// comment out fallbacks so users will get errors +// fallback implementation using shift and or : +//#define RR_ROTL32(u32,num) ( ( (u32) << (num) ) | ( (u32) >> (32 - (num))) ) + +#endif + + +//=================================================================== +// RR_ROTL64 : 64-bit rotate + +#if ( defined(_MSC_VER) && _MSC_VER >= 1300) + +unsigned __int64 __cdecl _rotl64(unsigned __int64 _Val, int _Shift); +#pragma intrinsic(_rotl64) + +#define RR_ROTL64(x,k) _rotl64((unsigned __int64)(x),(int)(k)) + +#elif defined(__RADCELL__) + +// PS3 GCC turns this into rotate correctly : +#define RR_ROTL64(u64,num) ( ( (u64) << (num) ) | ( (u64) >> (64 - (num))) ) + +#elif defined(__RADLINUX__) || defined(__RADMACAPI__) + +//APTODO: Just to compile linux. Should we be doing better than this? If not, combine with above. +#define RR_ROTL64(u64,num) ( ( (u64) << (num) ) | ( (u64) >> (64 - (num))) ) + +#else + +// comment out fallbacks so users will get errors +// fallback implementation using shift and or : +//#define RR_ROTL64(u64,num) ( ( (u64) << (num) ) | ( (u64) >> (64 - (num))) ) + +#endif + +//=================================================================== + +RADDEFEND + +//=================================================================== + +// RR_COMPILER_ASSERT +#if defined(__cplusplus) && !defined(RR_COMPILER_ASSERT) + #if defined(_MSC_VER) && (_MSC_VER >=1400) + + // better version of COMPILER_ASSERT using boost technique + template struct RR_COMPILER_ASSERT_FAILURE; + + template <> struct RR_COMPILER_ASSERT_FAILURE<1> { enum { value = 1 }; }; + + template struct rr_compiler_assert_test{}; + + // __LINE__ macro broken when -ZI is used see Q199057 + #define RR_COMPILER_ASSERT( B ) \ + typedef rr_compiler_assert_test<\ + sizeof(RR_COMPILER_ASSERT_FAILURE< (B) ? 1 : 0 >)\ + > rr_compiler_assert_typedef_ + + #endif +#endif + +#ifndef RR_COMPILER_ASSERT + // this happens at declaration time, so if it's inside a function in a C file, drop {} around it + #define RR_COMPILER_ASSERT(exp) typedef char RR_STRING_JOIN(_dummy_array, __LINE__) [ (exp) ? 1 : -1 ] +#endif + +//=================================================================== +// some error checks : + + RR_COMPILER_ASSERT( sizeof(RAD_UINTa) == sizeof( RR_STRING_JOIN(RAD_U,RAD_PTRBITS) ) ); + RR_COMPILER_ASSERT( sizeof(RAD_UINTa) == RAD_PTRBYTES ); + RR_COMPILER_ASSERT( RAD_TWOPTRBYTES == 2* RAD_PTRBYTES ); + +//=================================================================== + + #endif // __RADRES__ + +//include "testconstant.inl" // uncomment and include to test statement constants + +#endif // __RADRR_COREH__ + + diff --git a/Minecraft.Client/PSVita/Iggy/lib/libiggy_psp2.a b/Minecraft.Client/PSVita/Iggy/lib/libiggy_psp2.a new file mode 100644 index 00000000..c84c4eda Binary files /dev/null and b/Minecraft.Client/PSVita/Iggy/lib/libiggy_psp2.a differ diff --git a/Minecraft.Client/PSVita/Iggy/lib/libiggyperfmon_psp2.a b/Minecraft.Client/PSVita/Iggy/lib/libiggyperfmon_psp2.a new file mode 100644 index 00000000..9d217260 Binary files /dev/null and b/Minecraft.Client/PSVita/Iggy/lib/libiggyperfmon_psp2.a differ diff --git a/Minecraft.Client/PSVita/Leaderboards/PSVitaLeaderboardManager.cpp b/Minecraft.Client/PSVita/Leaderboards/PSVitaLeaderboardManager.cpp new file mode 100644 index 00000000..958999e4 --- /dev/null +++ b/Minecraft.Client/PSVita/Leaderboards/PSVitaLeaderboardManager.cpp @@ -0,0 +1,64 @@ +#include "stdafx.h" + +#include "PSVitaLeaderboardManager.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" + +#include + +#include + +LeaderboardManager *LeaderboardManager::m_instance = new PSVitaLeaderboardManager(); //Singleton instance of the LeaderboardManager + +PSVitaLeaderboardManager::PSVitaLeaderboardManager() : SonyLeaderboardManager() {} + +HRESULT PSVitaLeaderboardManager::initialiseScoreUtility() +{ + return sceNpScoreInit( SCE_KERNEL_DEFAULT_PRIORITY_USER, SCE_KERNEL_THREAD_CPU_AFFINITY_MASK_DEFAULT, NULL); +} + +bool PSVitaLeaderboardManager::scoreUtilityAlreadyInitialised(HRESULT hr) +{ + return hr == SCE_NP_COMMUNITY_ERROR_ALREADY_INITIALIZED; +} + +HRESULT PSVitaLeaderboardManager::createTitleContext(const SceNpId &npId) +{ + return sceNpScoreCreateTitleCtx(&s_npCommunicationId, &s_npCommunicationPassphrase, &npId); +} + +HRESULT PSVitaLeaderboardManager::destroyTitleContext(int titleContext) +{ + return sceNpScoreDestroyTitleCtx(titleContext); +} + +HRESULT PSVitaLeaderboardManager::createTransactionContext(int titleContext) +{ + return sceNpScoreCreateRequest(titleContext); +} + +HRESULT PSVitaLeaderboardManager::abortTransactionContext(int transactionContext) +{ + return sceNpScoreAbortRequest(transactionContext); +} + +HRESULT PSVitaLeaderboardManager::destroyTransactionContext(int transactionContext) +{ + return sceNpScoreDeleteRequest(transactionContext); +} + +HRESULT PSVitaLeaderboardManager::getFriendsList(sce::Toolkit::NP::Utilities::Future &friendsList) +{ + return sce::Toolkit::NP::Friends::Interface::getFriendslist(&friendsList, false); +} + +char *PSVitaLeaderboardManager::getComment(SceNpScoreComment *comment) +{ + 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 new file mode 100644 index 00000000..8101aa31 --- /dev/null +++ b/Minecraft.Client/PSVita/Leaderboards/PSVitaLeaderboardManager.h @@ -0,0 +1,34 @@ +#pragma once + +#include "Common\Leaderboards\SonyLeaderboardManager.h" +#include "Common\Leaderboards\LeaderboardManager.h" + +#include "Conf.h" + +#include + +class PSVitaLeaderboardManager : public SonyLeaderboardManager +{ +public: + PSVitaLeaderboardManager(); + +protected: + + virtual HRESULT initialiseScoreUtility(); + + virtual bool scoreUtilityAlreadyInitialised(HRESULT hr); + + virtual HRESULT createTitleContext(const SceNpId &npId); + + virtual HRESULT destroyTitleContext(int titleContext); + + virtual HRESULT createTransactionContext(int titleContext); + + virtual HRESULT abortTransactionContext(int transactionContext); + + virtual HRESULT destroyTransactionContext(int transactionContext); + + virtual HRESULT getFriendsList(sce::Toolkit::NP::Utilities::Future &friendsList); + + virtual char * getComment(SceNpScoreComment *comment); +}; diff --git a/Minecraft.Client/PSVita/Miles/include/mss.h b/Minecraft.Client/PSVita/Miles/include/mss.h new file mode 100644 index 00000000..531dcbc9 --- /dev/null +++ b/Minecraft.Client/PSVita/Miles/include/mss.h @@ -0,0 +1,8429 @@ +//############################################################################ +//## ## +//## Miles Sound System ## +//## ## +//############################################################################ +//## ## +//## Contact RAD Game Tools at 425-893-4300 for technical support. ## +//## ## +//############################################################################ + +#ifndef MSS_VERSION + +// also update versions below for the docs + +// for cdep and installs +#define MILESVERSION "9.3m" +// see below in docs section +#define MILESMAJORVERSION 9 +#define MILESMINORVERSION 3 +#define MILESSUBVERSION 11 +#define MILESBUILDVERSION 0 +#define MILESVERSIONDATE "20-Jun-14" +#define MILESCOPYRIGHT "Copyright (C) 1991-2014, RAD Game Tools, Inc." + +// source files use these defines +#define MSS_VERSION MILESVERSION +#define MSS_MAJOR_VERSION MILESMAJORVERSION +#define MSS_MINOR_VERSION MILESMINORVERSION +#define MSS_SUB_VERSION MILESSUBVERSION +#define MSS_BUILD_VERSION MILESBUILDVERSION + +#define MSS_VERSION_DATE MILESVERSIONDATE +#define MSS_COPYRIGHT MILESCOPYRIGHT + +#endif + +#if !defined(MSS_H) && !defined(__RADRES__) +#define MSS_H + +// doc system stuff +#ifndef EXPAPI +#define EXPAPI +#endif +#ifndef EXPTYPE +#define EXPTYPE +#endif +#ifndef EXPMACRO +#define EXPMACRO +#endif +#ifndef EXPCONST +#define EXPCONST +#endif +#ifndef EXPOUT +#define EXPOUT +#endif +#ifndef EXPTYPEBEGIN +#define EXPTYPEBEGIN +#endif +#ifndef EXPTYPEEND +#define EXPTYPEEND +#endif +#ifndef EXPGROUP +#define EXPGROUP(GroupName) +#endif +#ifndef DEFGROUP +#define DEFGROUP(GroupName, Info) +#endif + +// For docs +EXPGROUP(_NullGroup) +#define MilesVersion "9.3m" EXPMACRO +#define MilesMajorVersion 9 EXPMACRO +#define MilesMinorVersion 3 EXPMACRO +#define MilesBuildNumber 11 EXPMACRO +#define MilesCustomization 0 EXPMACRO +EXPGROUP(_RootGroup) + + +// IS_WINDOWS for Windows or Win32 +// IS_WIN64 for Win64 +// IS_WIN32 for Win32 +// IS_WIN32API for Windows, Xbox and Xenon +// IS_64REGS when CPU registers are 64-bit - Xenon, PS3, Win64 and PS2 +// IS_32 for at least 32-bit pointers +// IS_LE for little endian (PCs) +// IS_BE for big endian (Macs, x360, ps3) +// IS_X86 for Intel +// IS_MAC for Mac +// IS_MACHO for Macho Mac +// IS_PPC for PPC Mac +// IS_68K for 68K Mac +// IS_LINUX for Linux +// IS_XBOX for Xbox +// IS_XENON for Xbox 360 +// IS_PS2 for PS/2 +// IS_PS3 for PS/3 +// IS_SPU for PS3 SPU +// IS_WII for Wii + +#include "rrCore.h" + +//#define MILES_CHECK_OFFSETS +#ifdef MILES_CHECK_OFFSETS + #include +#endif + +#ifdef __RADNT__ +#define IS_WIN32 +#if defined(__RAD64__) +#define IS_WIN64 +#endif +#endif + +#if defined(__RADWIN__) && !defined(__RADXENON__) && !defined(__RADXBOX__) && !defined(__RADWINRTAPI__) +#define IS_WINDOWS +#endif + +#if defined(__RADWIN__) +#define IS_WIN32API +#endif + +#if defined(__RAD64__) && defined(__RADWIN__) +#define IS_WIN64 +#endif + +// 16-bit not supported anymore +#define IS_32 + +#ifdef __RADLITTLEENDIAN__ +#define IS_LE +#endif + +#ifdef __RADBIGENDIAN__ +#define IS_BE +#endif + +#ifdef __RADX86__ +#define IS_X86 +#endif + +#ifdef __RADMAC__ +#define IS_MAC +#endif + +#ifdef __RADPPC__ +#define IS_PPC +#endif + +#ifdef __RAD68K__ +#define IS_68K +#endif + +#ifdef __RADLINUX__ +#define IS_LINUX +#endif + +// +// MSS_STATIC_RIB is used to determine whether anything loaded +// through the RIB interface is loaded via RIB_load_application_providers +// or via a static declaration from the user (Register_RIB) +// mirror this in rib.h +// +#if defined(__RADANDROID__) || defined(__RADPSP__) || defined(__RADPSP2__) || \ + defined(__RADWII__) || defined(__RADWIIU__) || defined(__RAD3DS__) || defined(__RADIPHONE__) || \ + defined(__RADXENON__) || defined(__RADPS4__) || defined(__RADPS3__) || defined(__RADSPU__) || \ + defined(__RADDURANGO__) || defined(__RADWINRTAPI__) + #define MSS_STATIC_RIB + // WinRT is weird in that we statically pull in the RIBs, but we dynamically link Midi + #ifndef __RADWINRTAPI__ + #define MSS_STATIC_MIDI + #endif +#elif defined(__RADWIN__) || defined(__RADLINUX__) || defined(__RADMAC__) + // not static. +#else + #error "MSS needs to know whether it is being distributed as a static lib!" +#endif + +// Retain the old IS_STATIC define for example code +#ifdef MSS_STATIC_RIB + #define IS_STATIC +#endif + +#ifdef __RADXBOX__ +#define IS_XBOX +#endif + +#ifdef __RADXENON__ +#define IS_XENON +#endif + +#ifdef __RADWII__ +#define IS_WII +#endif + +#ifdef __RADWIIU__ +#define IS_WIIU +#endif + +#ifdef __RADPS2__ +#define IS_PS2 +#endif + +#ifdef __RADPS3__ +#define IS_PS3 +#ifndef HOST_SPU_PROCESS + #define HOST_SPU_PROCESS +#endif +#endif + +#ifdef __RADSPU__ +#define IS_PS3 +#define IS_SPU +#endif + +#ifdef __RADPSP__ +#define IS_PSP +#endif + +#ifdef __RADPSP2__ +#define IS_PSP2 +#endif + +#ifdef __RADDOS__ +#define IS_DOS +#endif + +#ifdef __RAD64REGS__ +#define IS_64REGS +#endif + +#ifdef __RADMACH__ +#define IS_MACHO +#endif + +#ifdef __RADIPHONE__ +#define IS_IPHONE +#endif + +#ifdef __RADIPHONESIM__ +#define IS_IPHONESIM +#endif + +#ifdef __RAD3DS__ +#define IS_3DS +#endif + +#define MSSRESTRICT RADRESTRICT + +#define MSS_STRUCT RADSTRUCT + +#define C8 char +typedef void VOIDFUNC(void); + + +#if (!defined(IS_LE) && !defined(IS_BE)) + #error MSS.H did not detect your platform. Define _WINDOWS, WIN32, WIN64, or macintosh. +#endif + +// +// Pipeline filters supported on following platforms +// + +#define MSS_FLT_SUPPORTED 1 +#define EXTRA_BUILD_BUFFERS 1 +#define FLT_A (MAX_SPEAKERS) + +#if defined(IS_WIN32API) + #define MSS_VFLT_SUPPORTED 1 +#endif + +#define MSS_REVERB_SUPPORTED 1 + +//================ + +EXPGROUP(Basic Types) +#define AILCALL EXPTAG(AILCALL) +/* + Internal calling convention that all external Miles functions use. + + Usually cdecl or stdcall on Windows. +*/ + +#define AILCALLBACK EXPTAG(AILCALLBACK docproto) +/* + Calling convention that user supplied callbacks from Miles use. + + Usually cdecl or stdcall on Windows. +*/ + +EXPGROUP(_RootGroup) +#undef AILCALL +#undef AILCALLBACK +//================ + +RADDEFSTART + +#define MSSFOURCC U32 +#ifdef IS_LE + #define MSSMAKEFOURCC(ch0, ch1, ch2, ch3) \ + ((U32)(U8)(ch0) | ((U32)(U8)(ch1) << 8) | \ + ((U32)(U8)(ch2) << 16) | ((U32)(U8)(ch3) << 24 )) +#else + + #define MSSMAKEFOURCC(ch0, ch1, ch2, ch3) \ + (((U32)(U8)(ch0) << 24) | ((U32)(U8)(ch1) << 16) | \ + ((U32)(U8)(ch2) << 8) | ((U32)(U8)(ch3) )) +#endif + +#define MSSmmioFOURCC(w,x,y,z) MSSMAKEFOURCC(w,x,y,z) + +#if defined(__RADWINRTAPI__) + + #define AILLIBCALLBACK RADLINK + #define AILCALL RADLINK + #define AILEXPORT RADEXPLINK + #define AILCALLBACK RADLINK + #define DXDEF RADEXPFUNC + #define DXDEC RADEXPFUNC + +#elif defined(IS_WINDOWS) + + typedef char CHAR; + typedef short SHORT; + typedef int BOOL; + typedef long LONG; + typedef CHAR *LPSTR, *PSTR; + + #ifdef IS_WIN64 + typedef unsigned __int64 ULONG_PTR, *PULONG_PTR; + #else + #ifdef _Wp64 + #if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300 + typedef __w64 unsigned long ULONG_PTR, *PULONG_PTR; + #else + typedef unsigned long ULONG_PTR, *PULONG_PTR; + #endif + #else + typedef unsigned long ULONG_PTR, *PULONG_PTR; + #endif + #endif + + typedef ULONG_PTR DWORD_PTR, *PDWORD_PTR; + typedef unsigned long DWORD; + typedef unsigned short WORD; + typedef unsigned int UINT; + typedef struct HWAVE__ *HWAVE; + typedef struct HWAVEIN__ *HWAVEIN; + typedef struct HWAVEOUT__ *HWAVEOUT; + typedef HWAVEIN *LPHWAVEIN; + typedef HWAVEOUT *LPHWAVEOUT; + + #ifndef WAVE_MAPPER + #define WAVE_MAPPER ((UINT)-1) + #endif + + typedef struct waveformat_tag *LPWAVEFORMAT; + + typedef struct HMIDIOUT__ *HMIDIOUT; + typedef HMIDIOUT *LPHMIDIOUT; + typedef struct HWND__ *HWND; + typedef struct HINSTANCE__ *HINSTANCE; + typedef HINSTANCE HMODULE; + typedef struct wavehdr_tag *LPWAVEHDR; + + #define MSS_MAIN_DEF __cdecl + + // + // If compiling MSS DLL, use __declspec(dllexport) for both + // declarations and definitions + // + + #ifdef IS_WIN32 + + #if !defined(FORNONWIN) && !defined(__RADNTBUILDLINUX__) + #define AILLIBCALLBACK __stdcall + #define AILCALL __stdcall + #define AILCALLBACK __stdcall + #define AILEXPORT __stdcall + #else + #define AILLIBCALLBACK __cdecl + #define AILCALL __cdecl + #define AILCALLBACK __cdecl + #define AILEXPORT __cdecl + #endif + + #ifdef __RADINDLL__ + #define DXDEC __declspec(dllexport) + #define DXDEF __declspec(dllexport) + #else + + #if defined( __BORLANDC__ ) || defined( MSS_SPU_PROCESS ) + #define DXDEC extern + #else + #define DXDEC __declspec(dllimport) + #endif + + #endif + + #ifdef IS_WIN64 + #define MSSDLLNAME "MSS64.DLL" + #define MSS_REDIST_DIR_NAME "redist64" + #else + #define MSSDLLNAME "MSS32.DLL" + #define MSS_REDIST_DIR_NAME "redist" + #endif + + #define MSS_DIR_SEP "\\" + #define MSS_DIR_UP ".." MSS_DIR_SEP + #define MSS_DIR_UP_TWO MSS_DIR_UP MSS_DIR_UP + + #endif + + typedef void * LPVOID; + typedef LPVOID AILLPDIRECTSOUND; + typedef LPVOID AILLPDIRECTSOUNDBUFFER; + +#elif defined( IS_MAC ) || defined(IS_IPHONE) || defined(IS_LINUX) + + #if defined(__RADARM__) || defined(__RADX64__) + #define AILLIBCALLBACK + #define AILCALL + #define AILEXPORT + #define AILCALLBACK + #elif defined(__RADX86__) + #define AILLIBCALLBACK __attribute__((cdecl)) + #define AILCALL __attribute__((cdecl)) + #define AILCALLBACK __attribute__((cdecl)) + #define AILEXPORT __attribute__((cdecl)) + #else + #error "No fn call decorators specified" + #endif + + #ifdef __RADINDLL__ + #define DXDEC __attribute__((visibility("default"))) + #define DXDEF __attribute__((visibility("default"))) + #else + #define DXDEC extern + #define DXDEF + #endif + + #ifdef __RADX64__ + #define MSS_REDIST_DIR_NAME "redist/x64" + #elif defined(IS_X86) + #define MSS_REDIST_DIR_NAME "redist/x86" + #elif defined(__RADARM__) + #define MSS_REDIST_DIR_NAME "" + #else + #error "No Redist Dir Specified" + #endif + + #define MSS_DIR_SEP "/" + #define MSS_DIR_UP ".." MSS_DIR_SEP + #define MSS_DIR_UP_TWO MSS_DIR_UP MSS_DIR_UP + + #define MSS_MAIN_DEF + +#elif defined(IS_XENON) + + #define AILLIBCALLBACK __stdcall + #define AILCALL __stdcall + #define AILEXPORT __stdcall + #define AILCALLBACK __stdcall + + #define DXDEC extern + #define DXDEF + + typedef void * AILLPDIRECTSOUND; + typedef void * AILLPDIRECTSOUNDBUFFER; + +#else + + #define AILLIBCALLBACK + #define AILCALL + #define AILEXPORT + #define AILCALLBACK + + #define DXDEC extern + #define DXDEF + +#endif + + +// +// Misc. constant definitions +// + +#define MAX_DRVRS 16 // Max. # of simultaneous drivers +#define MAX_TIMERS 16 // Max. # of simultaneous timers +#define MAX_NOTES 32 // Max # of notes "on" +#define FOR_NEST 4 // # of nested XMIDI FOR loops +#define NUM_CHANS 16 // # of possible MIDI channels +#define MAX_W_VOICES 16 // Max virtual wave synth voice cnt +#define MAX_W_ENTRIES 512 // 512 wave library entries max. +#ifdef IS_WIN32 +#define MAX_SPEAKERS 9 // Up to 9 hardware output channels supported on Win32 +#elif defined(IS_PS3) || defined(IS_WII) || defined(IS_WIIU) || defined(__RADWINRTAPI__) || defined(__RADSEKRIT2__) +#define MAX_SPEAKERS 8 // Up to 8 hardware output channels on PS3, PS2, Wii, WiiU +#elif defined(IS_PSP) || defined(IS_IPHONE) || defined(IS_3DS) || defined(IS_PSP2) || defined(__RADANDROID__) +#define MAX_SPEAKERS 2 // Up to 2 hardware output channels on PSP +#else +#define MAX_SPEAKERS 6 // Up to 6 hardware output channels supported on other platforms +#endif +#define MAX_RECEIVER_SPECS 32 // Up to 32 receiver point specifications + +#define MAX_BUSSES 4 // # of busses that can be active. +#define MILES_MAX_STATES 4 // # of state pushes allowed. + + +#define MIN_CHAN ( 1-1) // Min channel recognized (0-based) +#define MAX_CHAN (16-1) // Max channel recognized +#define MIN_LOCK_CHAN ( 1-1) // Min channel available for locking +#define MAX_LOCK_CHAN (16-1) // Max channel available for locking +#define PERCUSS_CHAN (10-1) // Percussion channel (no locking) + +#define AIL_MAX_FILE_HEADER_SIZE 8192 // AIL_set_named_sample_file() requires at least 8K + // of data or the entire file image, whichever is less, + // to determine sample format +#define DIG_F_16BITS_MASK 1 +#define DIG_F_STEREO_MASK 2 +#define DIG_F_ADPCM_MASK 4 +#define DIG_F_XBOX_ADPCM_MASK 8 +#define DIG_F_MULTICHANNEL_MASK 16 +#define DIG_F_OUTPUT_FILTER_IN_USE 32 + +#define DIG_F_MONO_8 0 // PCM data formats +#define DIG_F_MONO_16 (DIG_F_16BITS_MASK) +#define DIG_F_STEREO_8 (DIG_F_STEREO_MASK) +#define DIG_F_MULTICHANNEL_8 (DIG_F_MULTICHANNEL_MASK) // (not actually supported) +#define DIG_F_STEREO_16 (DIG_F_STEREO_MASK|DIG_F_16BITS_MASK) +#define DIG_F_MULTICHANNEL_16 (DIG_F_MULTICHANNEL_MASK|DIG_F_16BITS_MASK) +#define DIG_F_ADPCM_MONO_16 (DIG_F_ADPCM_MASK |DIG_F_16BITS_MASK) +#define DIG_F_ADPCM_STEREO_16 (DIG_F_ADPCM_MASK |DIG_F_16BITS_MASK|DIG_F_STEREO_MASK) +#define DIG_F_ADPCM_MULTICHANNEL_16 (DIG_F_ADPCM_MASK |DIG_F_16BITS_MASK|DIG_F_STEREO_MASK) +#define DIG_F_XBOX_ADPCM_MONO_16 (DIG_F_XBOX_ADPCM_MASK |DIG_F_16BITS_MASK) +#define DIG_F_XBOX_ADPCM_STEREO_16 (DIG_F_XBOX_ADPCM_MASK |DIG_F_16BITS_MASK|DIG_F_STEREO_MASK) +#define DIG_F_XBOX_ADPCM_MULTICHANNEL_16 (DIG_F_XBOX_ADPCM_MASK |DIG_F_16BITS_MASK|DIG_F_MULTICHANNEL_MASK) + +#define DIG_F_NOT_8_BITS (DIG_F_16BITS_MASK | DIG_F_ADPCM_MASK | DIG_F_XBOX_ADPCM_MASK | DIG_F_MULTICHANNEL_MASK) + +#define DIG_F_USING_ASI 16 + +#define DIG_PCM_POLARITY 0x0004 // PCM flags used by driver hardware +#define DIG_PCM_SPLIT 0x0008 +#define DIG_BUFFER_SERVICE 0x0010 +#define DIG_DUAL_DMA 0x0020 +#define DIG_RECORDING_SUPPORTED 0x8000 + +#ifndef WAVE_FORMAT_PCM + #define WAVE_FORMAT_PCM 1 +#endif +#ifndef WAVE_FORMAT_IMA_ADPCM + #define WAVE_FORMAT_IMA_ADPCM 0x0011 +#endif +#ifndef WAVE_FORMAT_XBOX_ADPCM + #define WAVE_FORMAT_XBOX_ADPCM 0x0069 +#endif +#ifndef WAVE_FORMAT_EXTENSIBLE + #define WAVE_FORMAT_EXTENSIBLE 0xFFFE +#endif + +typedef enum +{ + MSS_SPEAKER_MONO = 0, + MSS_SPEAKER_FRONT_LEFT = 0, // Speaker order indexes correspond to + MSS_SPEAKER_FRONT_RIGHT = 1, // bitmasks in PSDK's ksmedia.h + MSS_SPEAKER_FRONT_CENTER = 2, // Also see microsoft.com/whdc/device/audio/multichaud.mspx + MSS_SPEAKER_LOW_FREQUENCY = 3, + MSS_SPEAKER_BACK_LEFT = 4, + MSS_SPEAKER_BACK_RIGHT = 5, + MSS_SPEAKER_FRONT_LEFT_OF_CENTER = 6, + MSS_SPEAKER_FRONT_RIGHT_OF_CENTER = 7, + MSS_SPEAKER_BACK_CENTER = 8, + MSS_SPEAKER_SIDE_LEFT = 9, + MSS_SPEAKER_SIDE_RIGHT = 10, + MSS_SPEAKER_TOP_CENTER = 11, + MSS_SPEAKER_TOP_FRONT_LEFT = 12, + MSS_SPEAKER_TOP_FRONT_CENTER = 13, + MSS_SPEAKER_TOP_FRONT_RIGHT = 14, + MSS_SPEAKER_TOP_BACK_LEFT = 15, + MSS_SPEAKER_TOP_BACK_CENTER = 16, + MSS_SPEAKER_TOP_BACK_RIGHT = 17, + MSS_SPEAKER_MAX_INDEX = 17, + MSS_SPEAKER_FORCE_32 = 0x7fffffff +} MSS_SPEAKER; + +// +// Pass to AIL_midiOutOpen for NULL MIDI driver +// + +#define MIDI_NULL_DRIVER ((U32)(S32)-2) + + +// +// Non-specific XMIDI/MIDI controllers and event types +// + +#define SYSEX_BYTE 105 +#define PB_RANGE 106 +#define CHAN_MUTE 107 +#define CALLBACK_PFX 108 +#define SEQ_BRANCH 109 +#define CHAN_LOCK 110 +#define CHAN_PROTECT 111 +#define VOICE_PROTECT 112 +#define TIMBRE_PROTECT 113 +#define PATCH_BANK_SEL 114 +#define INDIRECT_C_PFX 115 +#define FOR_LOOP 116 +#define NEXT_LOOP 117 +#define CLEAR_BEAT_BAR 118 +#define CALLBACK_TRIG 119 +#define SEQ_INDEX 120 + +#define GM_BANK_MSB 0 +#define MODULATION 1 +#define DATA_MSB 6 +#define PART_VOLUME 7 +#define PANPOT 10 +#define EXPRESSION 11 +#define GM_BANK_LSB 32 +#define DATA_LSB 38 +#define SUSTAIN 64 +#define REVERB 91 +#define CHORUS 93 +#define RPN_LSB 100 +#define RPN_MSB 101 +#define RESET_ALL_CTRLS 121 +#define ALL_NOTES_OFF 123 + +#define EV_NOTE_OFF 0x80 +#define EV_NOTE_ON 0x90 +#define EV_POLY_PRESS 0xa0 +#define EV_CONTROL 0xb0 +#define EV_PROGRAM 0xc0 +#define EV_CHAN_PRESS 0xd0 +#define EV_PITCH 0xe0 +#define EV_SYSEX 0xf0 +#define EV_ESC 0xf7 +#define EV_META 0xff + +#define META_EOT 0x2f +#define META_TEMPO 0x51 +#define META_TIME_SIG 0x58 + +// +// SAMPLE.system_data[] usage +// + +#define VOC_BLK_PTR 1 // Pointer to current block +#define VOC_REP_BLK 2 // Pointer to beginning of repeat loop block +#define VOC_N_REPS 3 // # of iterations left in repeat loop +#define VOC_MARKER 4 // Marker to search for, or -1 if all +#define VOC_MARKER_FOUND 5 // Desired marker found if 1, else 0 +#define STR_HSTREAM 6 // Stream, if any, that owns the HSAMPLE +#define SSD_TEMP 7 // Temporary storage location for general use +#define EVT_HANDLE_MAGIC 1 // EventSystem handle.magic +#define EVT_HANDLE_INDEX 2 // EventSystem handle.index + +// +// Timer status values +// + +#define AILT_FREE 0 // Timer handle is free for allocation +#define AILT_STOPPED 1 // Timer is stopped +#define AILT_RUNNING 2 // Timer is running + +// +// SAMPLE.status flag values +// + +#define SMP_FREE 0x0001 // Sample is available for allocation + +#define SMP_DONE 0x0002 // Sample has finished playing, or has + // never been started + +#define SMP_PLAYING 0x0004 // Sample is playing + +#define SMP_STOPPED 0x0008 // Sample has been stopped + +#define SMP_PLAYINGBUTRELEASED 0x0010 // Sample is playing, but digital handle + // has been temporarily released + + + +// +// SEQUENCE.status flag values +// + +#define SEQ_FREE 0x0001 // Sequence is available for allocation + +#define SEQ_DONE 0x0002 // Sequence has finished playing, or has + // never been started + +#define SEQ_PLAYING 0x0004 // Sequence is playing + +#define SEQ_STOPPED 0x0008 // Sequence has been stopped + +#define SEQ_PLAYINGBUTRELEASED 0x0010 // Sequence is playing, but MIDI handle + // has been temporarily released + +#ifdef IS_WINDOWS + +// +// AIL_set_direct_buffer_control() command values +// + +#define AILDS_RELINQUISH 0 // App returns control of secondary buffer +#define AILDS_SEIZE 1 // App takes control of secondary buffer +#define AILDS_SEIZE_LOOP 2 // App wishes to loop the secondary buffer + +#endif + +#ifndef MSS_BASIC + +#ifndef FILE_ERRS + #define FILE_ERRS + + #define AIL_NO_ERROR 0 + #define AIL_IO_ERROR 1 + #define AIL_OUT_OF_MEMORY 2 + #define AIL_FILE_NOT_FOUND 3 + #define AIL_CANT_WRITE_FILE 4 + #define AIL_CANT_READ_FILE 5 + #define AIL_DISK_FULL 6 + #define AIL_NO_AVAIL_ASYNC 7 +#endif + +#define MIN_VAL 0 +#define NOM_VAL 1 +#define MAX_VAL 2 + + +EXPGROUP(Basic Types) +EXPTYPEBEGIN typedef SINTa HMSSENUM; +#define MSS_FIRST ((HMSSENUM)-1) +EXPTYPEEND +/* + specifies a type used to enumerate through a list of properties. + + $:MSS_FIRST use this value to start the enumeration process. + +The Miles enumeration functions all work similarly - you set a local variable of type HMSSENUM to MSS_FIRST and then call +the enumeration function until it returns 0. + +*/ + + + + +// +// Preference names and default values +// + +#define AIL_MM_PERIOD 0 +#define DEFAULT_AMP 1 // Default MM timer period = 5 msec. + +#define AIL_TIMERS 1 +#define DEFAULT_AT 16 // 16 allocatable HTIMER handles + +#define AIL_ENABLE_MMX_SUPPORT 2 // Enable MMX support if present +#define DEFAULT_AEMS YES // (may be changed at any time) + + +#define DIG_MIXER_CHANNELS 3 +#define DEFAULT_DMC 64 // 64 allocatable SAMPLE structures + +#define DIG_ENABLE_RESAMPLE_FILTER 4 // Enable resampling filter by +#define DEFAULT_DERF YES // default + +#define DIG_RESAMPLING_TOLERANCE 5 +#define DEFAULT_DRT 131 // Resampling triggered at +/- 0.2% + +// 1 ms per mix. The PS3 has frag count restrictions, so we use 5 ms. +#define DIG_DS_FRAGMENT_SIZE 6 +#ifdef __RADPS3__ +# define DEFAULT_DDFS 5 +#else +# define DEFAULT_DDFS 1 +#endif + +// We want ~256 ms of buffers. PS3 must be 8, 16, or 32. +#define DIG_DS_FRAGMENT_CNT 7 +#ifdef __RADPS3__ +# define DEFAULT_DDFC 32 +#else +# define DEFAULT_DDFC 256 +#endif + +// Mix ahead ~48 ms. PS3 is based off on 5 ms frag size above... +#define DIG_DS_MIX_FRAGMENT_CNT 8 +#ifdef __RADPS3__ +# define DEFAULT_DDMFC 8 +#else +# define DEFAULT_DDMFC 48 +#endif + +#define DIG_LEVEL_RAMP_SAMPLES 9 +#define DEFAULT_DLRS 32 // Ramp level changes over first 32 samples in each buffer to reduce zipper noise + + +#define DIG_MAX_PREDELAY_MS 10 +#define DEFAULT_MPDMS 500 // Max predelay reverb time in ms + +#define DIG_3D_MUTE_AT_MAX 11 +#define DEFAULT_D3MAM YES // on by default + +#define DIG_DS_USE_PRIMARY 12 +#define DEFAULT_DDUP NO // Mix into secondary DirectSound buffer by default + + +#define DIG_DS_DSBCAPS_CTRL3D 13 +#define DEFAULT_DDDC NO // Do not use DSBCAPS_CTRL3D by default + +#define DIG_DS_CREATION_HANDLER 14 +#define DEFAULT_DDCH 0 // Use DirectSoundCreate() by default + + +#define DIG_MAX_CHAIN_ELEMENT_SIZE 15 +#define DEFAULT_MCES 8192 // max of 8192 bytes/waveOut buffer + +#define DIG_MIN_CHAIN_ELEMENT_TIME 16 +#define DEFAULT_MCET 100 // 100 milliseconds buffers + + +#define DIG_USE_WAVEOUT 17 +#define DEFAULT_DUW NO // Use DirectSound by default + +#define DIG_OUTPUT_BUFFER_SIZE 18 +#define DEFAULT_DOBS 49152 // Windows: waveout 48K output buffer size + + +#define DIG_PREFERRED_WO_DEVICE 19 +#define DEFAULT_DPWOD ((UINTa)-1) // Preferred WaveOut device == WAVE_MAPPER + +#define DIG_PREFERRED_DS_DEVICE 20 +#define DEFAULT_DPDSD 0 // Preferred DirectSound device == default NULL GUID + + +#define MDI_SEQUENCES 21 +#define DEFAULT_MS 8 // 8 sequence handles/driver + +#define MDI_SERVICE_RATE 22 +#define DEFAULT_MSR 120 // XMIDI sequencer timing = 120 Hz + +#define MDI_DEFAULT_VOLUME 23 +#define DEFAULT_MDV 127 // Default sequence volume = 127 (0-127) + +#define MDI_QUANT_ADVANCE 24 +#define DEFAULT_MQA 1 // Beat/bar count +1 interval + +#define MDI_ALLOW_LOOP_BRANCHING 25 +#define DEFAULT_ALB NO // Branches cancel XMIDI FOR loops + +#define MDI_DEFAULT_BEND_RANGE 26 +#define DEFAULT_MDBR 2 // Default pitch-bend range = 2 + +#define MDI_DOUBLE_NOTE_OFF 27 +#define DEFAULT_MDNO NO // For stuck notes on SB daughterboards + +#define MDI_SYSEX_BUFFER_SIZE 28 +#define DEFAULT_MSBS 1536 // Default sysex buffer = 1536 bytes + + +#define DLS_VOICE_LIMIT 29 +#define DEFAULT_DVL 64 // 64 voices supported + +#define DLS_TIMEBASE 30 +#define DEFAULT_DTB 120 // 120 intervals/second by default + +#define DLS_BANK_SELECT_ALIAS 31 +#define DEFAULT_DBSA NO // Do not treat controller 114 as bank + +#define DLS_STREAM_BOOTSTRAP 32 // Don't submit first stream buffer +#define DEFAULT_DSB YES // until at least 2 available + +#define DLS_VOLUME_BOOST 33 +#define DEFAULT_DVB 0 // Boost final volume by 0 dB + +#define DLS_ENABLE_FILTERING 34 // Filtering = on by default +#define DEFAULT_DEF YES // (may be changed at any time) + + +#define DLS_GM_PASSTHROUGH 35 // Pass unrecognized traffic on to +#define DEFAULT_DGP YES // default GM driver layer + // (may be changed at any time) + +#define DLS_ADPCM_TO_ASI_THRESHOLD 36 // Size in samples to switch to ASI +#define DEFAULT_DATAT 32768 + +#ifdef __RAD3DS__ +# define AIL_3DS_USE_SYSTEM_CORE 32 // Defaults to 0 +#endif + +#define N_PREFS 40 // # of preference types + +#if defined(IS_WIN32API) || defined(IS_WII) + #pragma pack(push, 1) +#endif + +typedef struct Mwavehdr_tag { + C8 * lpData; + U32 dwBufferLength; + U32 dwBytesRecorded; + UINTa dwUser; + U32 dwFlags; + U32 dwLoops; + struct Mwavehdr_tag *lpNext; + UINTa reserved; +} MWAVEHDR; +typedef MSS_STRUCT Mwaveformat_tag { + U16 wFormatTag; + U16 nChannels; + U32 nSamplesPerSec; + U32 nAvgBytesPerSec; + U16 nBlockAlign; +} MWAVEFORMAT; +typedef MSS_STRUCT Mpcmwaveformat_tag { + MWAVEFORMAT wf; + U16 wBitsPerSample; +} MPCMWAVEFORMAT; +typedef MSS_STRUCT Mwaveformatex_tag { + U16 wFormatTag; + U16 nChannels; + U32 nSamplesPerSec; + U32 nAvgBytesPerSec; + U16 nBlockAlign; + U16 wBitsPerSample; + U16 cbSize; +} MWAVEFORMATEX; +typedef MSS_STRUCT Mwaveformatextensible_tag { + MWAVEFORMATEX Format; + union { + U16 wValidBitsPerSample; + U16 wSamplesPerBlock; + U16 wReserved; + } Samples; + U32 dwChannelMask; + U8 SubFormat[16]; +} MWAVEFORMATEXTENSIBLE; + +#if defined(IS_WIN32API) || defined(IS_WII) + #pragma pack(pop) +#endif + +// This will fail if structure packing isn't correct for the compiler we are running. +RR_COMPILER_ASSERT(sizeof(MWAVEFORMATEXTENSIBLE) == 40); + + +typedef struct _AILSOUNDINFO { + S32 format; + void const* data_ptr; + U32 data_len; + U32 rate; + S32 bits; + S32 channels; + U32 channel_mask; + U32 samples; + U32 block_size; + void const* initial_ptr; +} AILSOUNDINFO; + +// asis use these callbacks +typedef void * (AILCALL MSS_ALLOC_TYPE)( UINTa size, UINTa user, char const * filename, U32 line ); +typedef void (AILCALL MSS_FREE_TYPE)( void * ptr, UINTa user, char const * filename, U32 line ); + +// helper functions that just turn around and call AIL_mem_alloc_lock +DXDEC void * AILCALL MSS_alloc_info( UINTa size, UINTa user, char const * filename, U32 line ); +DXDEC void AILCALL MSS_free_info( void * ptr, UINTa user, char const * filename, U32 line ); + +#if defined(STANDALONEMIXRIB) && !defined(FORNONWIN) +#define MSS_CALLBACK_ALIGNED_NAME( name ) name##_fixup +#define MSS_DEC_CB_STACK_ALIGN( name ) DXDEC void AILCALL MSS_CALLBACK_ALIGNED_NAME(name)(void); +#else +#define MSS_CALLBACK_ALIGNED_NAME( name ) name +#define MSS_DEC_CB_STACK_ALIGN( name ) +#endif + +MSS_DEC_CB_STACK_ALIGN( MSS_alloc_info ) +MSS_DEC_CB_STACK_ALIGN( MSS_free_info) + + +#ifndef RIB_H // RIB.H contents included if RIB.H not already included + +#define RIB_H +#define ARY_CNT(x) (sizeof((x)) / sizeof((x)[0])) + +// ---------------------------------- +// RIB data types +// ---------------------------------- + +typedef S32 RIBRESULT; + +#define RIB_NOERR 0 // Success -- no error +#define RIB_NOT_ALL_AVAILABLE 1 // Some requested functions/attribs not available +#define RIB_NOT_FOUND 2 // Resource not found +#define RIB_OUT_OF_MEM 3 // Out of system RAM + +// +// Handle to interface provider +// + +typedef UINTa HPROVIDER; + +// +// Handle representing token used to obtain property data +// +// This needs to be large enough to store a function pointer +// + +typedef UINTa HPROPERTY; + +// +// Data types for RIB properties +// + +typedef enum +{ + RIB_NONE = 0, // No type + RIB_CUSTOM, // Used for pointers to application-specific structures + RIB_DEC, // Used for 32-bit integer values to be reported in decimal + RIB_HEX, // Used for 32-bit integer values to be reported in hex + RIB_FLOAT, // Used for 32-bit single-precision FP values + RIB_PERCENT, // Used for 32-bit single-precision FP values to be reported as percentages + RIB_BOOL, // Used for Boolean-constrained integer values to be reported as TRUE or FALSE + RIB_STRING, // Used for pointers to null-terminated ASCII strings + RIB_READONLY = 0x80000000 // Property is read-only +} +RIB_DATA_SUBTYPE; + +// +// RIB_ENTRY_TYPE structure, used to register an interface or request one +// + +typedef enum +{ + RIB_FUNCTION = 0, + RIB_PROPERTY, // Property: read-only or read-write data type + RIB_ENTRY_FORCE_32 = 0x7fffffff +} +RIB_ENTRY_TYPE; + +// +// RIB_INTERFACE_ENTRY, used to represent a function or data entry in an +// interface +// + +typedef struct +{ + RIB_ENTRY_TYPE type; // See list above + const C8 *entry_name; // Name of desired function or property + UINTa token; // Function pointer or property token + RIB_DATA_SUBTYPE subtype; // Property subtype +} +RIB_INTERFACE_ENTRY; + +// +// Standard RAD Interface Broker provider identification properties +// + +#define PROVIDER_NAME ((U32) (S32) (-100)) // RIB_STRING name of decoder +#define PROVIDER_VERSION ((U32) (S32) (-101)) // RIB_HEX BCD version number + +// +// Standard function to obtain provider properties (see PROVIDER_ defines +// above) +// +// Each provider of a searchable interface must export this function +// + +typedef S32 (AILCALL *PROVIDER_PROPERTY) (HPROPERTY index, + void * before_value, + void const * new_value, + void * after_value + ); + +// +// Macros to simplify interface registrations/requests for functions, +// and properties +// + +#define FN(entry_name) { RIB_FUNCTION, #entry_name, (UINTa) &(entry_name), RIB_NONE } +#define REG_FN(entry_name) { RIB_FUNCTION, #entry_name, (UINTa) &(entry_name), RIB_NONE } + +#define PR(entry_name,ID) { RIB_PROPERTY, (entry_name), (UINTa) &(ID), RIB_NONE } +#define REG_PR(entry_name,ID,subtype) { RIB_PROPERTY, (entry_name), (UINTa) (ID), subtype } + +#define RIB_register(x,y,z) RIB_register_interface ((HPROVIDER)(x), y, ARY_CNT(z), z) +#define RIB_unregister(x,y,z) RIB_unregister_interface((HPROVIDER)(ssx), y, ARY_CNT(z), z) +#define RIB_unregister_all(x) RIB_unregister_interface((HPROVIDER)(x), 0, 0, 0) +#define RIB_free_libraries() RIB_free_provider_library((HPROVIDER)(0)); +#define RIB_request(x,y,z) RIB_request_interface (x, y, ARY_CNT(z), z) + +// passed to RIB DLLs in Miles 9 and up (so RIBS don't have to link to MSS32.dll) +typedef HPROVIDER AILCALL RIB_ALLOC_PROVIDER_HANDLE_TYPE(long module); + +typedef RIBRESULT AILCALL RIB_REGISTER_INTERFACE_TYPE (HPROVIDER provider, + C8 const *interface_name, + S32 entry_count, + RIB_INTERFACE_ENTRY const *rlist); + +typedef RIBRESULT AILCALL RIB_UNREGISTER_INTERFACE_TYPE (HPROVIDER provider, + C8 const *interface_name, + S32 entry_count, + RIB_INTERFACE_ENTRY const *rlist); + +#define RIB_registerP(x,y,z) rib_reg ((HPROVIDER)(x), y, ARY_CNT(z), z) +#define RIB_unregister_allP(x) rib_unreg ((HPROVIDER)(x), 0, 0, 0) + + +// ---------------------------------- +// Standard RIB API prototypes +// ---------------------------------- + +DXDEC HPROVIDER AILCALL RIB_alloc_provider_handle (long module); +DXDEC void AILCALL RIB_free_provider_handle (HPROVIDER provider); + +DXDEC HPROVIDER AILCALL RIB_load_provider_library (C8 const *filename); +DXDEC void AILCALL RIB_free_provider_library (HPROVIDER provider); + +DXDEC RIBRESULT AILCALL RIB_register_interface (HPROVIDER provider, + C8 const *interface_name, + S32 entry_count, + RIB_INTERFACE_ENTRY const *rlist); + +DXDEC RIBRESULT AILCALL RIB_unregister_interface (HPROVIDER provider, + C8 const *interface_name, + S32 entry_count, + RIB_INTERFACE_ENTRY const *rlist); + +DXDEC RIBRESULT AILCALL RIB_request_interface (HPROVIDER provider, + C8 const *interface_name, + S32 entry_count, + RIB_INTERFACE_ENTRY *rlist); + +DXDEC RIBRESULT AILCALL RIB_request_interface_entry (HPROVIDER provider, + C8 const *interface_name, + RIB_ENTRY_TYPE entry_type, + C8 const *entry_name, + UINTa *token); + +DXDEC S32 AILCALL RIB_enumerate_interface (HPROVIDER provider, + C8 const *interface_name, + RIB_ENTRY_TYPE type, + HMSSENUM *next, + RIB_INTERFACE_ENTRY *dest); + +DXDEC S32 AILCALL RIB_enumerate_providers (C8 const *interface_name, + HMSSENUM *next, + HPROVIDER *dest); + +DXDEC C8 * AILCALL RIB_type_string (void const * data, + RIB_DATA_SUBTYPE subtype); + +DXDEC HPROVIDER AILCALL RIB_find_file_provider (C8 const *interface_name, + C8 const *property_name, + C8 const *file_suffix); + +DXDEC HPROVIDER AILCALL RIB_find_provider (C8 const *interface_name, + C8 const *property_name, + void const *property_value); + +// +// Static library definitions +// + +#ifdef MSS_STATIC_RIB + #define RIB_MAIN_NAME( name ) name##_RIB_Main + + DXDEC S32 AILCALL RIB_MAIN_NAME(SRS)( HPROVIDER provider_handle, U32 up_down, RIB_ALLOC_PROVIDER_HANDLE_TYPE * rib_alloc, RIB_REGISTER_INTERFACE_TYPE * rib_reg, RIB_UNREGISTER_INTERFACE_TYPE * rib_unreg ); + DXDEC S32 AILCALL RIB_MAIN_NAME(DTS)( HPROVIDER provider_handle, U32 up_down, RIB_ALLOC_PROVIDER_HANDLE_TYPE * rib_alloc, RIB_REGISTER_INTERFACE_TYPE * rib_reg, RIB_UNREGISTER_INTERFACE_TYPE * rib_unreg ); + DXDEC S32 AILCALL RIB_MAIN_NAME(DolbySurround)( HPROVIDER provider_handle, U32 up_down, RIB_ALLOC_PROVIDER_HANDLE_TYPE * rib_alloc, RIB_REGISTER_INTERFACE_TYPE * rib_reg, RIB_UNREGISTER_INTERFACE_TYPE * rib_unreg ); + DXDEC S32 AILCALL RIB_MAIN_NAME(MP3Dec)( HPROVIDER provider_handle, U32 up_down, RIB_ALLOC_PROVIDER_HANDLE_TYPE * rib_alloc, RIB_REGISTER_INTERFACE_TYPE * rib_reg, RIB_UNREGISTER_INTERFACE_TYPE * rib_unreg ); + DXDEC S32 AILCALL RIB_MAIN_NAME(OggDec)( HPROVIDER provider_handle, U32 up_down, RIB_ALLOC_PROVIDER_HANDLE_TYPE * rib_alloc, RIB_REGISTER_INTERFACE_TYPE * rib_reg, RIB_UNREGISTER_INTERFACE_TYPE * rib_unreg ); + DXDEC S32 AILCALL RIB_MAIN_NAME(BinkADec)( HPROVIDER provider_handle, U32 up_down, RIB_ALLOC_PROVIDER_HANDLE_TYPE * rib_alloc, RIB_REGISTER_INTERFACE_TYPE * rib_reg, RIB_UNREGISTER_INTERFACE_TYPE * rib_unreg ); + DXDEC S32 AILCALL RIB_MAIN_NAME(SpxDec)( HPROVIDER provider_handle, U32 up_down, RIB_ALLOC_PROVIDER_HANDLE_TYPE * rib_alloc, RIB_REGISTER_INTERFACE_TYPE * rib_reg, RIB_UNREGISTER_INTERFACE_TYPE * rib_unreg ); + DXDEC S32 AILCALL RIB_MAIN_NAME(SpxEnc)( HPROVIDER provider_handle, U32 up_down, RIB_ALLOC_PROVIDER_HANDLE_TYPE * rib_alloc, RIB_REGISTER_INTERFACE_TYPE * rib_reg, RIB_UNREGISTER_INTERFACE_TYPE * rib_unreg ); + DXDEC S32 AILCALL RIB_MAIN_NAME(Voice)( HPROVIDER provider_handle, U32 up_down, RIB_ALLOC_PROVIDER_HANDLE_TYPE * rib_alloc, RIB_REGISTER_INTERFACE_TYPE * rib_reg, RIB_UNREGISTER_INTERFACE_TYPE * rib_unreg ); + DXDEC S32 AILCALL RIB_MAIN_NAME(SpxVoice)( HPROVIDER provider_handle, U32 up_down, RIB_ALLOC_PROVIDER_HANDLE_TYPE * rib_alloc, RIB_REGISTER_INTERFACE_TYPE * rib_reg, RIB_UNREGISTER_INTERFACE_TYPE * rib_unreg ); + DXDEC S32 AILCALL RIB_MAIN_NAME(DSP)( HPROVIDER provider_handle, U32 up_down, RIB_ALLOC_PROVIDER_HANDLE_TYPE * rib_alloc, RIB_REGISTER_INTERFACE_TYPE * rib_reg, RIB_UNREGISTER_INTERFACE_TYPE * rib_unreg ); + +#ifdef IS_XENON + DXDEC S32 AILCALL RIB_MAIN_NAME(XMADec)( HPROVIDER provider_handle, U32 up_down, RIB_ALLOC_PROVIDER_HANDLE_TYPE * rib_alloc, RIB_REGISTER_INTERFACE_TYPE * rib_reg, RIB_UNREGISTER_INTERFACE_TYPE * rib_unreg ); +#endif + + #define Register_RIB(name) RIB_load_static_provider_library(RIB_MAIN_NAME(name),#name) + +#else // MSS_STATIC_RIB + #define RIB_MAIN_NAME( name ) RIB_Main + DXDEC S32 AILCALL RIB_Main( HPROVIDER provider_handle, U32 up_down, RIB_ALLOC_PROVIDER_HANDLE_TYPE * rib_alloc, RIB_REGISTER_INTERFACE_TYPE * rib_reg, RIB_UNREGISTER_INTERFACE_TYPE * rib_unreg ); +#endif // MSS_STATIC_RIB + +typedef S32 ( AILCALL * RIB_MAIN_FUNC) ( HPROVIDER provider_handle, U32 up_down, RIB_ALLOC_PROVIDER_HANDLE_TYPE * rib_alloc, RIB_REGISTER_INTERFACE_TYPE * rib_reg, RIB_UNREGISTER_INTERFACE_TYPE * rib_unreg ); + +DXDEC HPROVIDER AILCALL RIB_load_static_provider_library (RIB_MAIN_FUNC main, const char* description); + + +DXDEC HPROVIDER AILCALL RIB_find_files_provider (C8 const *interface_name, + C8 const *property_name_1, + C8 const *file_suffix_1, + C8 const *property_name_2, + C8 const *file_suffix_2); + +DXDEC HPROVIDER AILCALL RIB_find_file_dec_provider (C8 const *interface_name, + C8 const *property_name_1, + U32 decimal_property_value_1, + C8 const *property_name_2, + C8 const *file_suffix_2); + +DXDEC S32 AILCALL RIB_load_application_providers + (C8 const *filespec); + +DXDEC void AILCALL RIB_set_provider_user_data (HPROVIDER provider, + U32 index, + SINTa value); + +DXDEC SINTa AILCALL RIB_provider_user_data (HPROVIDER provider, + U32 index); + +DXDEC void AILCALL RIB_set_provider_system_data + (HPROVIDER provider, + U32 index, + SINTa value); + +DXDEC SINTa AILCALL RIB_provider_system_data (HPROVIDER provider, + U32 index); + +DXDEC C8 * AILCALL RIB_error (void); + +#endif // RIB_H + + +#ifndef MSS_ASI_VERSION // MSSASI.H contents included if MSSASI.H not already included + +#define AIL_ASI_VERSION 1 +#define AIL_ASI_REVISION 0 + +// +// Handle to stream being managed by ASI codec +// + +typedef SINTa HASISTREAM; + +// +// ASI result codes +// + +typedef S32 ASIRESULT; + +#define ASI_NOERR 0 // Success -- no error +#define ASI_NOT_ENABLED 1 // ASI not enabled +#define ASI_ALREADY_STARTED 2 // ASI already started +#define ASI_INVALID_PARAM 3 // Invalid parameters used +#define ASI_INTERNAL_ERR 4 // Internal error in ASI driver +#define ASI_OUT_OF_MEM 5 // Out of system RAM +#define ASI_ERR_NOT_IMPLEMENTED 6 // Feature not implemented +#define ASI_NOT_FOUND 7 // ASI supported device not found +#define ASI_NOT_INIT 8 // ASI not initialized +#define ASI_CLOSE_ERR 9 // ASI not closed correctly + +// ---------------------------------- +// Application-provided ASI callbacks +// ---------------------------------- + +// +// AILASIFETCHCB: Called by ASI to obtain data from stream source +// +// offset normally will be either 0 at the first call made by the codec +// or -1 to specify a continuous stream, except when ASI_stream_seek() +// is called to restart the stream codec at a new stream offset. In this +// case, the application must execute the seek operation on the ASI codec's +// behalf. +// +// In response to this callback, the application should read the requested +// data and copy it to the specified destination buffer, returning the number +// of bytes copied (which can be less than bytes_requested if the end of +// the stream is reached). +// + + +typedef S32 (AILCALLBACK * AILASIFETCHCB) (UINTa user, // User value passed to ASI_open_stream() + void *dest, // Location to which stream data should be copied by app + S32 bytes_requested, // # of bytes requested by ASI codec + S32 offset); // If not -1, application should seek to this point in stream + +//############################################################################ +//## ## +//## Interface "ASI codec" ## +//## ## +//############################################################################ + +// +// Initialize ASI stream codec +// +// No other ASI functions may be called outside an ASI_startup() / +// ASI_shutdown() pair, except for the standard RIB function +// PROVIDER_property() where appropriate. +// + +typedef ASIRESULT (AILCALL *ASI_STARTUP)(void); + +// +// Shut down ASI codec +// + +typedef ASIRESULT (AILCALL * ASI_SHUTDOWN)(void); + +// +// Return codec error message, or NULL if no errors have occurred since +// last call +// +// The ASI error text state is global to all streams +// + +typedef C8 * (AILCALL * ASI_ERROR)(void); + +//############################################################################ +//## ## +//## Interface "ASI stream" ## +//## ## +//############################################################################ + +// +// Open a stream, returning handle to stream +// + +typedef HASISTREAM (AILCALL *ASI_STREAM_OPEN) (MSS_ALLOC_TYPE * palloc, + MSS_FREE_TYPE * pfree, + UINTa user, // User value passed to fetch callback + AILASIFETCHCB fetch_CB, // Source data fetch handler + U32 total_size); // Total size for %-done calculations (0=unknown) + +// +// Translate data in stream, returning # of bytes actually decoded or encoded +// +// Any number of bytes may be requested. Requesting more data than is +// available in the codec's internal buffer will cause the AILASIFETCHCB +// handler to be called to fetch more data from the stream. +// + +typedef S32 (AILCALL *ASI_STREAM_PROCESS) (HASISTREAM stream, // Handle of stream + void *buffer, // Destination for processed data + S32 buffer_size); // # of bytes to return in buffer + +// +// Restart stream decoding process at new offset +// +// Relevant for decoders only +// +// Seek destination is given as offset in bytes from beginning of stream +// +// At next ASI_stream_process() call, decoder will seek to the closest possible +// point in the stream which occurs at or after the specified position +// +// This function has no effect for decoders which do not support random +// seeks on a given stream type +// +// Warning: some decoders may need to implement seeking by reparsing +// the entire stream up to the specified offset, through multiple calls +// to the data-fetch callback. This operation may be extremely +// time-consuming on large files or slow network connections. +// +// A stream_offset value of -1 may be used to inform the decoder that the +// application has changed the input stream offset on its own, e.g. for a +// double-buffering application where the ASI decoder is not accessing the +// stream directly. ASI decoders should respond to this by flushing all +// internal buffers and resynchronizing themselves to the data stream. +// + +typedef ASIRESULT (AILCALL *ASI_STREAM_SEEK) (HASISTREAM stream, + S32 stream_offset); + +// +// Retrieve or set a property value by index (returns 1 on success) +// + +typedef S32 (AILCALL *ASI_STREAM_PROPERTY) (HASISTREAM stream, + HPROPERTY property, + void * before_value, + void const * new_value, + void * after_value + ); + +// +// Close stream, freeing handle and all internally-allocated resources +// + +typedef ASIRESULT (AILCALL *ASI_STREAM_CLOSE) (HASISTREAM stream); + +#endif // MSS_ASI_VERSION + +//############################################################################ +//## ## +//## Interface "MSS mixer services" ## +//## ## +//############################################################################ + +// +// Operation flags used by mixer and filter modules +// + +#define M_DEST_STEREO 1 // Set to enable stereo mixer output +#define M_SRC_16 2 // Set to enable mixing of 16-bit samples +#define M_FILTER 4 // Set to enable filtering when resampling +#define M_SRC_STEREO 8 // Set to enable mixing of stereo input samples +#define M_RESAMPLE 16 // Set to enable playback ratios other than 65536 +#define M_VOL_SCALING 32 // Set to enable volume scalars other than 2048 +#define M_COPY16_NOVOL 64 + +#ifdef IS_32 + +// +// Initialize mixer +// +// No other mixer functions may be called outside a MIXER_startup() / +// MIXER_shutdown() pair, except for the standard RIB function +// PROVIDER_property() as appropriate. +// + +typedef void (AILCALL *MIXER_STARTUP)(void); + +// +// Shut down mixer +// + +typedef void (AILCALL *MIXER_SHUTDOWN)(void); + +// +// Flush mixer buffer +// + +typedef void (AILCALL *MIXER_FLUSH) (S32 *dest, + S32 len +#ifdef IS_X86 + ,U32 MMX_available +#endif + ); + +// +// Perform audio mixing operation +// + +typedef void (AILCALL *MIXER_MERGE) (void const * *src, + U32 *src_fract, + void const *src_end, + S32 * *dest, + void *dest_end, + S32 *left_val, + S32 *right_val, + S32 playback_ratio, + S32 scale_left, + S32 scale_right, + U32 operation +#ifdef IS_X86 + ,U32 MMX_available +#endif + ); + +// +// Translate mixer buffer contents to final output format +// +// "option" parameter is big_endian_output on Mac, MMX on x86, overwrite flag on PS2 +// + +typedef void (AILCALL *MIXER_COPY) (void const *src, + S32 src_len, + void *dest, + U32 operation +#if defined(IS_BE) || defined(IS_X86) + ,U32 option +#endif + ); + +#else + +// +// Initialize mixer +// +// No other mixer functions may be called outside a MIXER_startup() / +// MIXER_shutdown() pair, except for the standard RIB function +// PROVIDER_property() as appropriate. +// + +typedef void (AILCALL *MIXER_STARTUP)(void); + +// +// Shut down mixer +// + +typedef void (AILCALL *MIXER_SHUTDOWN)(void); + +// +// Flush mixer buffer +// + +typedef void (AILCALL *MIXER_FLUSH) (S32 *dest, + S32 len, + U32 MMX_available); + +// +// Perform audio mixing operation +// + +typedef void (AILCALL *MIXER_MERGE) (U32 src_sel, + U32 dest_sel, + U32 *src_fract, + U32 *src_offset, + U32 *dest_offset, + U32 src_end_offset, + U32 dest_end_offset, + S32 *left_val, + S32 *right_val, + S32 playback_ratio, + S32 scale_both, + U32 operation); + +// +// Translate mixer buffer contents to final output format +// + +typedef void (AILCALL *MIXER_COPY) (void const *src, + S32 src_len, + void *dest, + U32 operation, + U32 option); +#endif + + +typedef struct _MSS_BB // Used in both MC and conventional mono/stereo configurations +{ + S32 *buffer; // Build buffer + S32 bytes; // Size in bytes + S32 chans; // Always mono (1) or stereo (2) + + S32 speaker_offset; // Destination offset in interleaved PCM block for left channel +} MSS_BB; + +typedef struct _ADPCMDATATAG +{ + U32 blocksize; + U32 extrasamples; + U32 blockleft; + U32 step; + UINTa savesrc; + U32 sample; + UINTa destend; + UINTa srcend; + U32 samplesL; + U32 samplesR; + U16 moresamples[16]; +} ADPCMDATA; + +typedef void (AILCALL * MIXER_MC_COPY) ( MSS_BB * build, + S32 n_build_buffers, + void * lpWaveAddr, + S32 hw_format, +#ifdef IS_X86 + S32 use_MMX, +#endif + S32 samples_per_buffer, + S32 physical_channels_per_sample ); + + +typedef void (AILCALL * MIXER_ADPCM_DECODE ) ( void * dest, + void const * in, + S32 out_len, + S32 in_len, + S32 input_format, + ADPCMDATA *adpcm_data); + +// +// Type definitions +// + +struct _DIG_DRIVER; + +struct _MDI_DRIVER; + +typedef struct _DIG_DRIVER * HDIGDRIVER; // Handle to digital driver + +typedef struct _MDI_DRIVER * HMDIDRIVER; // Handle to XMIDI driver + +typedef struct _SAMPLE * HSAMPLE; // Handle to sample + +typedef struct _SEQUENCE * HSEQUENCE; // Handle to sequence + +typedef S32 HTIMER; // Handle to timer + + +// +// Function pointer types +// + +typedef void (AILCALLBACK* AILINCB) (void const *data, S32 len, UINTa user_data); + +typedef void (AILCALLBACK* AILTRACECB) (C8 *text, S32 nest_depth); + +typedef void (AILCALLBACK* AILTIMERCB) (UINTa user); + +typedef void (AILCALLBACK* AILSAMPLECB) (HSAMPLE sample); + +typedef void (AILCALLBACK* AILMIXERCB) (HDIGDRIVER dig); + +typedef F32 (AILCALLBACK* AILFALLOFFCB) (HSAMPLE sample, F32 distance, F32 rolloff_factor, F32 min_dist, F32 max_dist); + +typedef S32 (AILCALLBACK* AILEVENTCB) (HMDIDRIVER hmi,HSEQUENCE seq,S32 status,S32 data_1,S32 data_2); + +typedef S32 (AILCALLBACK* AILTIMBRECB) (HMDIDRIVER hmi,S32 bank,S32 patch); + +typedef S32 (AILCALLBACK* AILPREFIXCB) (HSEQUENCE seq,S32 log,S32 data); + +typedef void (AILCALLBACK* AILTRIGGERCB) (HSEQUENCE seq,S32 log,S32 data); + +typedef void (AILCALLBACK* AILBEATCB) (HMDIDRIVER hmi,HSEQUENCE seq,S32 beat,S32 measure); + +typedef void (AILCALLBACK* AILSEQUENCECB) (HSEQUENCE seq); + +typedef S32 (AILCALLBACK *SS_STREAM_CB) (HSAMPLE S, S16 *dest_mono_sample_buffer, S32 dest_buffer_size); + +// +// Handle to sample and driver being managed by pipeline filter +// + +typedef SINTa HSAMPLESTATE; +typedef SINTa HDRIVERSTATE; + +// +// Digital pipeline stages +// +// These are the points at which external modules may be installed into +// a given HSAMPLE or HDIGDRIVER's processing pipeline +// + +typedef enum +{ + SP_ASI_DECODER = 0, // Must be "ASI codec stream" provider + SP_FILTER, // Must be "MSS pipeline filter" provider + SP_FILTER_0 = SP_FILTER, // Must be "MSS pipeline filter" provider + SP_FILTER_1, // Must be "MSS pipeline filter" provider + SP_FILTER_2, // Must be "MSS pipeline filter" provider + SP_FILTER_3, // Must be "MSS pipeline filter" provider + SP_FILTER_4, // Must be "MSS pipeline filter" provider + SP_FILTER_5, // Must be "MSS pipeline filter" provider + SP_FILTER_6, // Must be "MSS pipeline filter" provider + SP_FILTER_7, // Must be "MSS pipeline filter" provider + SP_MERGE, // Must be "MSS mixer" provider + N_SAMPLE_STAGES, // Placeholder for end of list (= # of valid sample pipeline stages) + SP_OUTPUT = N_SAMPLE_STAGES, // Used to set/get prefs/attribs on a driver's output or matrix filter (if present) + SAMPLE_ALL_STAGES // Used to signify all pipeline stages, for shutdown +} +SAMPLESTAGE; + +#define N_SP_FILTER_STAGES 8 // SP_FILTER_0 ... SP_FILTER_7 + +typedef enum +{ + DP_FLUSH = 0, // Must be "MSS mixer" provider + DP_DEFAULT_FILTER, // Must be "MSS pipeline filter" provider (sets the default) + DP_DEFAULT_MERGE, // Must be "MSS mixer" provider (sets the default) + DP_COPY, // Must be "MSS mixer" provider + DP_MC_COPY, // Must be "MSS mixer" provider + DP_ADPCM_DECODE, // Must be "MSS mixer" provider + N_DIGDRV_STAGES, // Placeholder for end of list (= # of valid stages) + DIGDRV_ALL_STAGES // Used to signify all pipeline stages, for shutdown +} +DIGDRVSTAGE; + +typedef struct + { + ASI_STREAM_OPEN ASI_stream_open; + ASI_STREAM_PROCESS ASI_stream_process; + ASI_STREAM_SEEK ASI_stream_seek; + ASI_STREAM_CLOSE ASI_stream_close; + ASI_STREAM_PROPERTY ASI_stream_property; + + HPROPERTY INPUT_BIT_RATE; + HPROPERTY INPUT_SAMPLE_RATE; + HPROPERTY INPUT_BITS; + HPROPERTY INPUT_CHANNELS; + HPROPERTY OUTPUT_BIT_RATE; + HPROPERTY OUTPUT_SAMPLE_RATE; + HPROPERTY OUTPUT_BITS; + HPROPERTY OUTPUT_CHANNELS; + HPROPERTY OUTPUT_CHANNEL_MASK; + HPROPERTY OUTPUT_RESERVOIR; + HPROPERTY POSITION; + HPROPERTY PERCENT_DONE; + HPROPERTY MIN_INPUT_BLOCK_SIZE; + HPROPERTY RAW_RATE; + HPROPERTY RAW_BITS; + HPROPERTY RAW_CHANNELS; + HPROPERTY REQUESTED_RATE; + HPROPERTY REQUESTED_BITS; + HPROPERTY REQUESTED_CHANS; + HPROPERTY STREAM_SEEK_POS; + HPROPERTY DATA_START_OFFSET; + HPROPERTY DATA_LEN; + HPROPERTY EXACT_SEEK; + HPROPERTY EXACT_GETPOS; + HPROPERTY SEEK_LOOKUP; + HPROPERTY SET_LOOPING_SAMPLES; + HPROPERTY CLEAR_LOOP_META; + + HASISTREAM stream; + } +ASISTAGE; + +typedef struct + { + struct _FLTPROVIDER *provider; + HSAMPLESTATE sample_state[MAX_SPEAKERS]; + } +FLTSTAGE; + +typedef struct +{ + S32 active; // Pass-through if 0, active if 1 + HPROVIDER provider; + + union + { + ASISTAGE ASI; + MIXER_MERGE MSS_mixer_merge; + FLTSTAGE FLT; + } + TYPE; +} +SPINFO; + +typedef struct +{ + S32 active; // Pass-through if 0, active if 1 + HPROVIDER provider; + + union + { + MIXER_FLUSH MSS_mixer_flush; + MIXER_COPY MSS_mixer_copy; + MIXER_MC_COPY MSS_mixer_mc_copy; + MIXER_ADPCM_DECODE MSS_mixer_adpcm_decode; + } + TYPE; +} +DPINFO; + +// +// Other data types +// + +typedef enum +{ + WIN32_HWAVEOUT, // waveOut handle for HDIGDRIVER, if any + WIN32_HWAVEIN, // waveIn handle for HDIGINPUT, if any + WIN32_LPDS, // lpDirectSound pointer for HSAMPLE + WIN32_LPDSB, // lpDirectSoundBuffer pointer for HSAMPLE + WIN32_HWND, // HWND that will be used to open DirectSound driver + WIN32_POSITION_ERR, // Nonzero if DirectSound play cursor stops moving (e.g., headphones removed) + + PS3_AUDIO_PORT, // cellaudio port that Miles is using + PS3_AUDIO_ADDRESS, // address of cellaudio sound buffer + PS3_AUDIO_LENGTH, // length of cellaudio sound buffer + PS3_AUDIO_POSITION, // current playback position of cellaudio sound buffer + + PSP_SUBMIT_THREAD, // Handle to thread submitting chucks of audio to the hw + PSP_AUDIO_PORT, // Port # Miles is using, -1 for simple audio, >= 0 for libwave + + PSP2_SUBMIT_THREAD, // Handle to thread submitting chucks of audio to the hw + PSP2_AUDIO_PORT, // Port # Miles is using + + OAL_CONTEXT, // OpenAL Context + OAL_DEVICE, // OpenAL Device + + XB_LPDS, // lpDirectSound pointer for HSAMPLE + XB_LPDSB, // lpDirectSoundBuffer pointer for HSAMPLE + + XB360_LPXAB // IXAudioSourceVoice pointer for HDIGDRIVER +} +MSS_PLATFORM_PROPERTY; + + +typedef struct _AIL_INPUT_INFO // Input descriptor type +{ + AILINCB callback; // Callback function to receive incoming data + UINTa user_data; // this is a user defined value + U32 device_ID; // DS LPGUID or wave device ID + U32 hardware_format; // e.g., DIG_F_STEREO_16 + U32 hardware_rate; // e.g., 22050 + S32 buffer_size; // Maximum # of bytes to be passed to callback (-1 to use DIG_INPUT_LATENCY) +} AIL_INPUT_INFO; + +typedef struct _AILTIMER // Timer instance +{ + AILTIMERCB callback; + U64 next; + U64 delta; + UINTa user; + U32 status; +} AILTIMERSTR; + +#ifndef IS_WIN64 + + #define OFSblocksize 0 // these constants valid for 32-bit versions only! + #define OFSextrasamples 4 + #define OFSblockleft 8 + #define OFSstep 12 + #define OFSsavesrc 16 + #define OFSsample 20 + #define OFSdestend 24 + #define OFSsrcend 28 + #define OFSsamplesL 32 + #define OFSsamplesR 36 + #define OFSmoresamples 40 + +#endif + +typedef struct LOWPASS_INFO +{ + S32 X0, X1; + S32 Y0, Y1; + S32 A, B0, B1; + S32 flags; + S32 queuedA, queuedB; + F32 calculated_cut; + F32 cutoff; +} LOWPASS_INFO; + + +typedef union STAGE_BUFFER +{ + union STAGE_BUFFER * next; + U8 data[ 1 ]; +} STAGE_BUFFER; + +typedef struct _MSSVECTOR3D +{ + F32 x; + F32 y; + F32 z; +} MSSVECTOR3D; + +#define MILES_TANGENT_LINEAR 0 +#define MILES_TANGENT_CURVE 1 +#define MILES_TANGENT_STEP 2 +#define MILES_MAX_FALLOFF_GRAPH_POINTS 5 + +#define MILES_MAX_SEGMENT_COUNT 10 + +typedef struct _MSSGRAPHPOINT +{ + F32 X, Y, ITX, ITY, OTX, OTY; // Point & tangents. + S32 IType, OType; +} MSSGRAPHPOINT; + +typedef struct _S3DSTATE // Portion of HSAMPLE that deals with 3D positioning +{ + MSSVECTOR3D position; // 3D position + MSSVECTOR3D face; // 3D orientation + MSSVECTOR3D up; // 3D up-vector + MSSVECTOR3D velocity; // 3D velocity + + S32 doppler_valid; // TRUE if OK to apply Doppler shift + F32 doppler_shift; // Scalar for S->playback rate + + F32 inner_angle; // Cone attenuation parameters + F32 outer_angle; // (Angles divided by two and convered to rads for dot-product comparisons) + F32 outer_volume; + S32 cone_enabled; + + F32 max_dist; // Sample distances + F32 min_dist; + S32 dist_changed; // TRUE if min/max distances have changed and need to be sent to the hardware + + S32 auto_3D_atten; // TRUE if distance/cone attenuation should be applied to wet signal + F32 atten_3D; // Attenuation due to distance/cone effects, calculated by software 3D positioner + F32 rolloff; // per sample rolloff factor to use instead of global rolloff, if non zero. + + F32 exclusion_3D; // exclusion value computed by falloff graph. -1 if not affected. + F32 lowpass_3D; // low pass cutoff computed by falloff graph. -1 if not affected. + + F32 spread; + + HSAMPLE owner; // May be NULL if used for temporary/internal calculations + AILFALLOFFCB falloff_function; // User function for min/max distance calculations, if desired + + MSSVECTOR3D position_graph[MILES_MAX_SEGMENT_COUNT]; + S32 position_graph_count; + + MSSGRAPHPOINT volgraph[MILES_MAX_FALLOFF_GRAPH_POINTS]; + MSSGRAPHPOINT excgraph[MILES_MAX_FALLOFF_GRAPH_POINTS]; + MSSGRAPHPOINT lpgraph[MILES_MAX_FALLOFF_GRAPH_POINTS]; + MSSGRAPHPOINT spreadgraph[MILES_MAX_FALLOFF_GRAPH_POINTS]; + + U8 volgraphcnt; + U8 excgraphcnt; + U8 lpgraphcnt; + U8 spreadgraphcnt; + +} S3DSTATE; + +typedef struct _SMPBUF +{ + void const *start; // Sample buffer address (W) + U32 len; // Sample buffer size in bytes (W) + U32 pos; // Index to next byte (R/W) + U32 done; // Nonzero if buffer with len=0 sent by app + S32 reset_ASI; // Reset the ASI decoder at the end of the buffer + S32 reset_seek_pos; // New destination offset in stream source data, for ASI codecs that care +} SMPBUF; + +typedef struct _SAMPLE // Sample instance +{ + U32 tag; // HSAM + + HDIGDRIVER driver; // Driver for playback + + S32 index; // Numeric index of this sample + + SMPBUF buf[8]; // Source data buffers + + U32 src_fract; // Fractional part of source address + + U32 mix_delay; // ms until start mixing (decreased every buffer mix) + F32 max_output_mix_volume; // max_volume of any speaker at last mix + + U64 mix_bytes; // total number of bytes sent to the mixer for this sample. + + S32 group_id; // ID for grouped operations. + + // size of the next dynamic arrays + U32 chan_buf_alloced; + U32 chan_buf_used; + U8* chan_buf_ptr; + + // these are dynamic arrays sized as n_channels long (so 1 for mono, 2 stereo, 6 for 5.1) + S32 *left_val; + S32 *right_val; + S32 *last_decomp; + LOWPASS_INFO *lp; // low pass info + + + // these are dynamic arrays pointing to dynamic arrays, each of the sub arrays are n_channels long or [MAX_SPEAKERS][n_channels] + F32 **user_channel_levels; // Channel levels set by AIL_set_sample_channel_levels() [source_channels][driver->logical_channels] + S32 **cur_scale; // Calculated 11-bit volume scale factors for current/previous mixing interval + S32 **prev_scale; // (These are all indexed by build buffer*2, not speaker indexes!) + S32 **ramps_left; + + // these are dynamic arrays + F32 *auto_3D_channel_levels; // Channel levels set by 3D positioner (always 1.0 if not 3D-positioned) + F32 *speaker_levels; // one level per speaker (multiplied after user or 3D) + + S8 *speaker_enum_to_source_chan; // array[MSS_SPEAKER_xx] = -1 if not present, else channel # + // 99% of the time this is a 1:1 mapping and is zero. + + S32 lp_any_on; // are any of the low pass filters on? + S32 user_channels_need_deinterlace; // do any of the user channels require a stereo sample to be deinterlaced? + + S32 n_buffers; // # of buffers (default = 2) + S32 head; + S32 tail; + S32 starved; // Buffer stream has run out of data + S32 exhaust_ASI; // Are we prolonging the buffer lifetime until ASI output is exhausted? + + S32 loop_count; // # of cycles-1 (1=one-shot, 0=indefinite) + S32 loop_start; // Starting offset of loop block (0=SOF) + S32 loop_end; // End offset of loop block (-1=EOF) + S32 orig_loop_count; // Original loop properties specified by app, before any + S32 orig_loop_start; // alignment constraints + S32 orig_loop_end; + + S32 format; // DIG_F format (8/16 bits, mono/stereo/multichannel) + S32 n_channels; // # of channels (which can be >2 for multichannel formats) + U32 channel_mask; // Same as WAVEFORMATEXTENSIBLE.dwChannelMask + + S32 original_playback_rate; // Playback rate in hertz + F32 playback_rate_factor; // Fractional playback rate, normally 1.0 + + F32 save_volume; // Sample volume 0-1.0 + F32 save_pan; // Mono panpot/stereo balance (0=L ... 1.0=R) + + F32 left_volume; // Left/mono volume 0 to 1.0 + F32 right_volume; // Right volume 0 to 1.0 + F32 wet_level; // reverb level 0 to 1.0 + F32 dry_level; // non-reverb level 0 to 1.0 + F32 sys_level; // system control + + F32 extra_volume; // Volume scalar for ramping or otherwise. + F32 extra_wet; + F32 extra_lp; + F32 extra_rate; + + + U32 low_pass_changed; // bit mask for what channels changed. + + S32 bus; // Bus assignment for this sample. + S32 bus_comp_sends; // Which buses this bus routes compressor input to. + S32 bus_comp_installed; // Nonzero if we have a compressor installed. + U32 bus_comp_input; // The input to use for this bus's compressor, if we have one installed + S32 bus_override_wet; // If true, samples on this bus will use the bus's wet level instead of their own. + U32 bus_signal_strength; // The bus level. + S32 bus_enable_limiter; // If true, a basic limiter will be run on the samples prior to clamping to S16. + S32 bus_limiter_atten; // The attenuation that was applied on the last bus pass. + + S32 fade_to_stop; // # of samples to fade to stop over. ( currently fixed at the volramp count ) + + U64 mix_start_time; // arbitrary non-zero id for starting sounds synced. + + S16 pop_fade_total; + S16 pop_fade_time; + U8 pop_fade_stop; // nonzero we end the sample when it fades out. + + U8 state_level; // Level the sample was started at. +#ifdef IS_WIIU + S8 route_to_drc; +#endif + + F32 obstruction; + F32 occlusion; + F32 exclusion; + + S32 service_type; // 1 if single-buffered; 2 if streamed + + AILSAMPLECB SOB; // Start-of-block callback function + AILSAMPLECB EOB; // End-of-buffer callback function + AILSAMPLECB EOS; // End-of-sample callback function + + SINTa user_data [8]; // Miscellaneous user data + SINTa system_data[8]; // Miscellaneous system data + SINTa hl_marker_list; + + ADPCMDATA adpcm; + + S32 doeob; // Flags to trigger callbacks + S32 dosob; + S32 doeos; + + S32 vol_ramps; + S32 resamp_tolerance; + S32 enable_resamp_filter; + + // + // Sample pipeline stages + // + + SPINFO pipeline[N_SAMPLE_STAGES]; + S32 n_active_filters; // # of SP_FILTER_n stages active + + // + // 3D-related state for all platforms (including Xbox) + // + + S32 is_3D; // TRUE if channel levels are derived automatically from 3D positional state, FALSE if they're controlled manually + + S3DSTATE S3D; // Software version applies 3D positioning only if is_3D == TRUE, but output filters always use it + +#ifdef MSS_VFLT_SUPPORTED + void *voice; // Optional object used by output filter to store per-sample information such as DS3D buffers +#endif + + F32 leftb_volume; // Left/mono volume 0 to 1.0 (back) + F32 rightb_volume; // Right volume 0 to 1.0 (back) + F32 center_volume; // Center volume 0 to 1.0 + F32 low_volume; // Low volume 0 to 1.0 + F32 save_fb_pan; // Sample volume 0-1.0 + F32 save_center; // saved center level + F32 save_low; // saved sub level + +#if defined(HOST_SPU_PROCESS) || defined(MSS_SPU_PROCESS) + S32 spu_on; + U32 align[1]; +#endif + +#if defined(IS_WINDOWS) + + // + // DirectSound-specific data + // + + S32 service_interval; // Service sample every n ms + S32 service_tick; // Current service countdown value + S32 buffer_segment_size; // Buffer segment size to fill + + S32 prev_segment; // Previous segment # (0...n) + S32 prev_cursor; // Previous play cursor location + + S32 bytes_remaining; // # of bytes left to play (if not -1) + + S32 direct_control; // 1 if app controls buffer, 0 if MSS + +#endif +} SAMPLE; + +#ifdef MILES_CHECK_OFFSETS + RR_COMPILER_ASSERT((RR_MEMBER_OFFSET(SAMPLE, save_low) & 3) == 0); +#endif + +// +// used for AIL_process +// + +typedef struct _AILMIXINFO { + AILSOUNDINFO Info; + ADPCMDATA mss_adpcm; + U32 src_fract; + S32 left_val; + S32 right_val; +} AILMIXINFO; + + + +DXDEC U32 AILCALL AIL_get_timer_highest_delay (void); + +DXDEC void AILCALL AIL_serve(void); + +#ifdef IS_MAC + + typedef void * LPSTR; + + #define WHDR_DONE 0 + + typedef struct _WAVEIN + { + long temp; + } * HWAVEIN; + + typedef struct _WAVEHDR + { + S32 dwFlags; + S32 dwBytesRecorded; + S32 dwUser; + S32 temp; + void * lpData; + S32 dwBufferLength; + S32 longdwLoops; + S32 dwLoops; + void * lpNext; + U32 * reserved; + + } WAVEHDR, * LPWAVEHDR; + +#endif + +#define N_WAVEIN_BUFFERS 8 // Use a ring of 8 buffers by default + +typedef struct _DIG_INPUT_DRIVER *HDIGINPUT; // Handle to digital input driver + +#ifdef IS_MAC + + #define AIL_DIGITAL_INPUT_DEFAULT 0 + + typedef struct _DIG_INPUT_DRIVER // Handle to digital input driver + { + U32 tag; // HDIN + S32 input_enabled; // 1 if enabled, 0 if not + U32 incoming_buffer_size; + void * incoming_buffer[ 2 ]; + void* outgoing_buffer; + U32 which_buffer; + AIL_INPUT_INFO info; // Input device descriptor + AILMIXINFO incoming_info; + long device; +#ifdef IS_MAC + char InternalRecordingState[128]; // Hide this so we dont' have to #include OS stuff everywhere. +#endif + } DIG_INPUT_DRIVER; + +#else + +#define AIL_DIGITAL_INPUT_DEFAULT ((U32)WAVE_MAPPER) + +typedef struct _DIG_INPUT_DRIVER // Handle to digital input driver +{ + U32 tag; // HDIN + + HTIMER background_timer; // Background timer handle + + AIL_INPUT_INFO info; // Input device descriptor + + S32 input_enabled; // 1 if enabled, 0 if not + + UINTa callback_user; // Callback user value + + // + // Provider-independent data + // + + U32 DMA_size; // Size of each DMA sub-buffer in bytes + void *DMA[N_WAVEIN_BUFFERS]; // Simulated DMA buffers + + U32 silence; // Silence value for current format (0 or 128) + + S32 device_active; // 1 if buffers submittable, 0 if not + +#if defined(IS_WINDOWS) && !defined(__RADWINRTAPI__) + // + // waveOut-specific data + // + + HWAVEIN hWaveIn; // Handle to wave input device + volatile MWAVEHDR wavehdr[N_WAVEIN_BUFFERS]; // Handles to wave headers + +#endif +} DIG_INPUT_DRIVER; +#endif + + +typedef struct REVERB_CONSTANT_INFO +{ + F32* start0,* start1,* start2,* start3,* start4,* start5; + F32* end0,* end1,* end2,* end3,* end4,* end5; + F32 C0, C1, C2, C3, C4, C5; + F32 A; + F32 B0, B1; +} REVERB_CONSTANT_INFO; + +typedef struct REVERB_UPDATED_INFO +{ + F32 * address0, * address1, * address2, * address3, * address4, * address5; + F32 X0, X1, Y0, Y1; +} REVERB_UPDATED_INFO; + +typedef struct REVERB_INFO +{ + REVERB_UPDATED_INFO u; + REVERB_CONSTANT_INFO c; +} REVERB_INFO; + +typedef struct REVERB_SETTINGS +{ + S32 room_type; // Changes to this drive master_wet and duration/damping/predelay! + F32 master_wet; // Master reverb level 0-1.0 + F32 master_dry; // Master non-reverb level 0-1.0 + + REVERB_INFO ri; + + S32 *reverb_build_buffer; + S32 reverb_total_size; + S32 reverb_fragment_size; + S32 reverb_buffer_size; + S32 reverb_on; + U32 reverb_off_time_ms; + + U32 reverb_duration_ms; + + F32 reverb_decay_time_s; + F32 reverb_predelay_s; + F32 reverb_damping; + + S32 reverb_head; + S32 reverb_tail; +} REVERB_SETTINGS; + + +typedef struct _MSS_RECEIVER_LIST +{ + MSSVECTOR3D direction; // Normalized direction vector from listener + + S32 speaker_index[MAX_SPEAKERS]; // List of speakers affected by sounds in this direction + F32 speaker_level[MAX_SPEAKERS]; // Each speaker's degree of effect from this source + S32 n_speakers_affected; +} MSS_RECEIVER_LIST; + +typedef struct _D3DSTATE +{ + S32 mute_at_max; + + MSSVECTOR3D listen_position; + MSSVECTOR3D listen_face; + MSSVECTOR3D listen_up; + MSSVECTOR3D listen_cross; + MSSVECTOR3D listen_velocity; + + F32 rolloff_factor; + F32 doppler_factor; + F32 distance_factor; + F32 falloff_power; + + // + // Precalculated listener info + // + + S32 ambient_channels [MAX_SPEAKERS]; // E.g., LFE + S32 n_ambient_channels; + + S32 directional_channels[MAX_SPEAKERS+1]; // Channel index, or -1 if virtual + MSSVECTOR3D listener_to_speaker [MAX_SPEAKERS+1]; + S32 n_directional_channels; + + MSS_RECEIVER_LIST receiver_specifications[MAX_RECEIVER_SPECS]; // Constellation of receiver vectors + S32 n_receiver_specs; + + MSSVECTOR3D speaker_positions [MAX_SPEAKERS]; // Listener-relative speaker locations + + F32 speaker_wet_reverb_response [MAX_SPEAKERS]; // Reverb sensitivity of each speaker + F32 speaker_dry_reverb_response [MAX_SPEAKERS]; +} D3DSTATE; + +typedef enum +{ + MSS_MC_INVALID = 0, // Used for configuration-function errors + MSS_MC_MONO = 1, // For compatibility with S32 channel param + MSS_MC_STEREO = 2, + MSS_MC_USE_SYSTEM_CONFIG = 0x10, // Leave space between entries for new variations + MSS_MC_HEADPHONES = 0x20, // with similar quality levels/speaker counts + MSS_MC_DOLBY_SURROUND = 0x30, + MSS_MC_SRS_CIRCLE_SURROUND = 0x40, + MSS_MC_40_DTS = 0x48, + MSS_MC_40_DISCRETE = 0x50, + MSS_MC_51_DTS = 0x58, + MSS_MC_51_DISCRETE = 0x60, + MSS_MC_61_DISCRETE = 0x70, + MSS_MC_71_DISCRETE = 0x80, + MSS_MC_81_DISCRETE = 0x90, + MSS_MC_DIRECTSOUND3D = 0xA0, + MSS_MC_EAX2 = 0xC0, + MSS_MC_EAX3 = 0xD0, + MSS_MC_EAX4 = 0xE0, + MSS_MC_FORCE_32 = 0x7fffffff +} +MSS_MC_SPEC; + + +typedef struct _DIG_DRIVER // Handle to digital audio driver +{ + U32 tag; // HDIG + + HTIMER backgroundtimer; // Background timer handle + + U32 num_mixes; // incrementing number of mixes + + S32 mix_ms; // rough ms per mix + + + F32 master_volume; // Master sample volume 0-1.0 + + S32 DMA_rate; // Hardware sample rate + S32 hw_format; // DIG_F code in use + S32 n_active_samples; // # of samples being processed + + MSS_MC_SPEC channel_spec; // Original "channels" value passed to AIL_open_digital_driver() + + D3DSTATE D3D; // 3D listener parms for all platforms + + +#if defined(IS_PSP2) || defined(IS_PSP) || defined(IS_XENON) || defined(IS_IPHONE) || defined(IS_MAC) || defined(IS_LINUX) || defined(IS_3DS) || defined(IS_WIIU) || defined(__RADWINRTAPI__) || defined(__RADSEKRIT2__) || defined(__RADANDROID__) // generic dig platforms +#define IS_GENERICDIG + void* dig_ss; // Sound system ptr (embed in mss.h?) + void* dig_heap; // Sound system heap. +#endif + +#ifdef IS_XENON + void* x2_voiceptr; //! \todo get rid of this? Only expose dig_ss? +#endif + + S32 quiet; // # of consecutive quiet sample periods + S32 playing; // Playback active if non-zero + + S32 bytes_per_channel; // # of bytes per channel (always 1 or 2 for 8- or 16-bit hardware output) + S32 samples_per_buffer; // # of samples per build buffer / half-buffer + S32 physical_channels_per_sample; // # of channels per *physical* sample (1 or 2, or more in discrete MC mode) + S32 logical_channels_per_sample; // # of logical channels per sample (may differ from physical channel count in matrix formats) + +#ifdef IS_LINUX + S32 released; // has the sound manager been released? +#endif + + HSAMPLE samples; // Pointer to list of SAMPLEs + + U32 *sample_status; // SMP_ flags: _FREE, _DONE, _PLAYING, moved out of SAMPLEs for faster iteration + S32 n_samples; // # of SAMPLEs + + SINTa system_data[8]; // Miscellaneous system data + + HSAMPLE bus_samples[MAX_BUSSES]; // Sample handles the bus will route through. + S32 bus_active_count[MAX_BUSSES]; // Number of samples mixed on the bus last mix. + void* bus_ptrs[MAX_BUSSES]; // Buffers for each bus to mix in to. + + void* pushed_states[MILES_MAX_STATES]; + U8 state_index; + + // + // Build buffers + // + // In multichannel mode, source samples may be mixed into more than one + // build buffer + // + + MSS_BB build[MAX_SPEAKERS+EXTRA_BUILD_BUFFERS]; + S32 n_build_buffers; // # of build buffers actually used for output processing + + S32 hardware_buffer_size; // Size of each output buffer + + S32 enable_limiter; + S32 limiter_atten; // attenuation level from last hw copy. + + S32 scheduled_sample_count; // # of samples that are waiting to be started at an exact time. + + AILMIXERCB mixcb; // callback for each mix. + +#if defined(IS_WINDOWS) && !defined(__RADWINRTAPI__) + + // + // waveOut-specific interface data + // + + HWAVEOUT hWaveOut; // Wave output driver + + U32 reset_works; // TRUE if OK to do waveOutReset + U32 request_reset; // If nonzero, do waveOutReset ASAP + + LPWAVEHDR first; // Pointer to first WAVEHDR in chain + S32 n_buffers; // # of output WAVEHDRs in chain + + LPWAVEHDR volatile *return_list; // Circular list of returned WAVEHDRs + S32 volatile return_head; // Head of WAVEHDR list (insertion point) + S32 volatile return_tail; // Tail of WAVEHDR list (retrieval point) + + // + // DirectSound-specific interface data + // + + UINTa guid; // The guid id of the ds driver + AILLPDIRECTSOUND pDS; // DirectSound output driver (don't + // use with Smacker directly anymore!) + + U32 ds_priority; // priority opened with + + S32 emulated_ds; // is ds emulated or not? + AILLPDIRECTSOUNDBUFFER lppdsb; // primary buffer or null + + UINTa dsHwnd; // HWND used with DirectSound + + AILLPDIRECTSOUNDBUFFER * lpbufflist; // List of pointers to secondary buffers + HSAMPLE *samp_list; // HSAMPLE associated with each buffer + S32 *sec_format; // DIG_F_ format for secondary buffer + S32 max_buffs; // Max. allowable # of secondary buffers + + // + // Driver output configuration + // + // Note: # of "logical" (source) channels per sample = dig->channels_per_sample + // # of "physical" (DAC) channels per sample = dig->wformat.wf.nChannels + // + // These may be different if a matrix format (e.g., Dolby/SRS) + // is in use! + // + + MPCMWAVEFORMAT wformat; // format from waveout open + C8 wfextra[32]; // Extension to PCMWAVEFORMAT (e.g., WAVE_FORMAT_EXTENSIBLE) + + // + // Misc. data + // + + S32 released; // has the sound manager been released? + + HDIGDRIVER next; // Pointer to next HDIGDRIVER in use + + // + // Vars for waveOut emulation + // + + S32 DS_initialized; + + AILLPDIRECTSOUNDBUFFER DS_sec_buff; // Secondary buffer (or NULL if none) + AILLPDIRECTSOUNDBUFFER DS_out_buff; // Output buffer (may be sec or prim) + S32 DS_buffer_size; // Size of entire output buffer + + S32 DS_frag_cnt; // Total fragment count and size, and + S32 DS_frag_size; // last fragment occupied by play cursor + S32 DS_last_frag; + S32 DS_last_write; + S32 DS_last_timer; + S32 DS_skip_time; + + S32 DS_use_default_format; // 1 to force use of default DS primary buffer format + + U32 position_error; // last status from position report (can be used + // to watch for headset removal) + U32 last_ds_play; + U32 last_ds_write; + U32 last_ds_move; + +#endif + +#ifdef IS_X86 + S32 use_MMX; // Use MMX with this driver if TRUE +#endif + + U64 mix_total; + U64 last_polled; + U32 last_percent; + + void * MC_buffer; + // + // Digital driver pipeline filter stages + // + + DPINFO pipeline[N_DIGDRV_STAGES]; + +#ifdef MSS_VFLT_SUPPORTED + struct _FLTPROVIDER *voice_filter; + SS_STREAM_CB stream_callback; +#endif + + struct _FLTPROVIDER *matrix_filter; + + // + // Reverb + // If no busses are active, 0 is still used as the base reverb. + // + REVERB_SETTINGS reverb[MAX_BUSSES]; + +#ifdef IS_PS3 + HDIGDRIVER next; // Pointer to next HDIGDRIVER in use + + void * hw_buf; + U32 hw_datarate; + U32 hw_align; + U32 port; + S32 hw_buffer_size; + S32 snd_frag_cnt; + S32 snd_frag_size; + S32 snd_last_frag; + S32 snd_last_write; + S32 snd_skip_time; + U32 snd_last_play; + U32 snd_last_move; + S32 snd_last_timer; +#endif + +#ifdef IS_GENERICDIG + HDIGDRIVER next; +#endif + +#if defined(IS_WINDOWS) + S32 no_wom_done; // don't process WOM_DONEs on this driver + U32 wom_done_buffers; +#endif + +#if defined(HOST_SPU_PROCESS) || defined(MSS_SPU_PROCESS) + U32 spu_num; + S32 spu_on; + U64 spu_total; + U64 spu_last_polled; + U32 spu_last_percent; + #ifdef IS_PS3 + U32 align[ 2 ]; + #else + U32 align[ 1 ]; + #endif +#endif + + U64 adpcm_time; + U64 deinterlace_time; + U64 mix_time; + U64 rev_time; + U64 reformat_time; + U64 lowpass_time; + U64 filter_time; + U64 copy_time; + U64 sob_time; + U64 eob_time; + U64 eos_time; + U64 spu_wait_time; + U64 asi_times[4]; + + HSAMPLE adpcm_sam; + HSAMPLE deinterlace_sam; + HSAMPLE mix_sam; + HSAMPLE rev_sam; + HSAMPLE reformat_sam; + HSAMPLE lowpass_sam; + HSAMPLE filter_sam; + HSAMPLE asi_sams[4]; + + U32 adpcm_num; + U32 deinterlace_num; + U32 mix_num; + U32 rev_num; + U32 reformat_num; + U32 lowpass_num; + U32 filter_num; + U32 asi_nums[4]; + + + // these clauses have to be at the end of the structure!! +#ifdef IS_WII + HDIGDRIVER next; // Pointer to next HDIGDRIVER in use + + U32 hw_datarate; + S32 hw_buffer_size; + S32 each_buffer_size; + S32 snd_frag_cnt; + S32 snd_frag_size; + S32 snd_last_frag; + S32 snd_last_write; + S32 snd_skip_time; + U32 snd_last_play; + U32 snd_last_move; + S32 snd_last_timer; + + void * buffer[ 2 ]; + U32 physical[ 2 ]; + + #ifdef AX_OUTPUT_BUFFER_DOUBLE + AXVPB* voice[ 2 ]; + #endif + +#endif + +#ifdef XAUDIOFRAMESIZE_NATIVE + XAUDIOPACKET packet; +#endif + +} DIG_DRIVER; + +#ifdef MILES_CHECK_OFFSETS + RR_COMPILER_ASSERT((RR_MEMBER_OFFSET(DIG_DRIVER, filter_num) & 3) == 0); +#endif + +typedef struct // MIDI status log structure + { + S32 program [NUM_CHANS]; // Program Change + S32 pitch_l [NUM_CHANS]; // Pitch Bend LSB + S32 pitch_h [NUM_CHANS]; // Pitch Bend MSB + + S32 c_lock [NUM_CHANS]; // Channel Lock + S32 c_prot [NUM_CHANS]; // Channel Lock Protection + S32 c_mute [NUM_CHANS]; // Channel Mute + S32 c_v_prot [NUM_CHANS]; // Voice Protection + S32 bank [NUM_CHANS]; // Patch Bank Select + S32 gm_bank_l [NUM_CHANS]; // GM Bank Select + S32 gm_bank_m [NUM_CHANS]; // GM Bank Select + S32 indirect [NUM_CHANS]; // ICA indirect controller value + S32 callback [NUM_CHANS]; // Callback Trigger + + S32 mod [NUM_CHANS]; // Modulation + S32 vol [NUM_CHANS]; // Volume + S32 pan [NUM_CHANS]; // Panpot + S32 exp [NUM_CHANS]; // Expression + S32 sus [NUM_CHANS]; // Sustain + S32 reverb [NUM_CHANS]; // Reverb + S32 chorus [NUM_CHANS]; // Chorus + + S32 bend_range[NUM_CHANS]; // Bender Range (data MSB, RPN 0 assumed) + + S32 RPN_L [NUM_CHANS]; // RPN # LSB + S32 RPN_M [NUM_CHANS]; // RPN # MSB + } +CTRL_LOG; + +typedef struct _SEQUENCE // XMIDI sequence state table +{ + char tag[4]; // HSEQ + + HMDIDRIVER driver; // Driver for playback + + U32 status; // SEQ_ flagsstruct + + void const *TIMB; // XMIDI IFF chunk pointers + void const *RBRN; + void const *EVNT; + + U8 const *EVNT_ptr; // Current event pointer + + U8 *ICA; // Indirect Controller Array + + AILPREFIXCB prefix_callback; // XMIDI Callback Prefix handler + AILTRIGGERCB trigger_callback; // XMIDI Callback Trigger handler + AILBEATCB beat_callback; // XMIDI beat/bar change handler + AILSEQUENCECB EOS; // End-of-sequence callback function + + S32 loop_count; // 0=one-shot, -1=indefinite, ... + + S32 interval_count; // # of intervals until next event + S32 interval_num; // # of intervals since start + + S32 volume; // Sequence volume 0-127 + S32 volume_target; // Target sequence volume 0-127 + S32 volume_accum; // Accumulated volume period + S32 volume_period; // Period for volume stepping + + S32 tempo_percent; // Relative tempo percentage 0-100 + S32 tempo_target; // Target tempo 0-100 + S32 tempo_accum; // Accumulated tempo period + S32 tempo_period; // Period for tempo stepping + S32 tempo_error; // Error counter for tempo DDA + + S32 beat_count; // Sequence playback position + S32 measure_count; + + S32 time_numerator; // Sequence timing data + S32 time_fraction; + S32 beat_fraction; + S32 time_per_beat; + + U8 const *FOR_ptrs[FOR_NEST]; // Loop stack + S32 FOR_loop_count [FOR_NEST]; + + S32 chan_map [NUM_CHANS]; // Physical channel map for sequence + + CTRL_LOG shadow; // Controller values for sequence + + S32 note_count; // # of notes "on" + + S32 note_chan [MAX_NOTES]; // Channel for queued note (-1=free) + S32 note_num [MAX_NOTES]; // Note # for queued note + S32 note_time [MAX_NOTES]; // Remaining duration in intervals + + SINTa user_data [8]; // Miscellaneous user data + SINTa system_data[8]; // Miscellaneous system data + +} SEQUENCE; + +#if defined(IS_MAC) || defined(IS_LINUX) || defined(IS_XENON) || defined(IS_PS3) || defined(IS_WII) || defined(IS_PSP) || defined(IS_PSP2) || defined(__RADWINRTAPI__) || defined(__RADSEKRIT2__) || defined(__RADANDROID__) + +struct MIDIHDR; +struct MIDIOUT; +typedef struct MIDIOUT* HMIDIOUT; +typedef HMIDIOUT* LPHMIDIOUT; + +#endif + +typedef struct _MDI_DRIVER // Handle to XMIDI driver +{ + char tag[4]; // HMDI + + HTIMER timer; // XMIDI quantization timer + S32 interval_time; // XMIDI quantization timer interval in uS + + HSEQUENCE sequences; // Pointer to list of SEQUENCEs + S32 n_sequences; // # of SEQUENCEs + + S32 lock [NUM_CHANS]; // 1 if locked, 2 if protected, else 0 + HSEQUENCE locker[NUM_CHANS]; // HSEQUENCE which locked channel + HSEQUENCE owner [NUM_CHANS]; // HSEQUENCE which owned locked channel + HSEQUENCE user [NUM_CHANS]; // Last sequence to use channel + S32 state [NUM_CHANS]; // Lock state prior to being locked + + S32 notes [NUM_CHANS]; // # of active notes in channel + + AILEVENTCB event_trap; // MIDI event trap callback function + AILTIMBRECB timbre_trap; // Timbre request callback function + + S32 master_volume; // Master XMIDI note volume 0-127 + + SINTa system_data[8]; // Miscellaneous system data + +#if (defined(IS_WINDOWS) && !defined(__RADWINRTAPI__)) || defined(IS_MAC) || defined(IS_LINUX) + + S32 released; // has the hmidiout handle been released + U32 deviceid; // ID of the MIDI device + U8 *sysdata; // SysEx buffer + +#endif + +#if defined(IS_XENON) || defined(IS_WII) || defined(IS_PS3) || defined(IS_PSP) || defined(IS_3DS) || defined(IS_IPHONE) || defined(IS_PSP2) || defined(IS_WIIU) || defined(__RADWINRTAPI__) || defined(__RADSEKRIT2__) || defined(__RADANDROID__) + HMDIDRIVER next; // Pointer to next HMDIDRIVER in use +#endif + +#ifdef IS_LINUX + struct MIDIHDR *mhdr; // SysEx header + HMDIDRIVER next; // Pointer to next HMDIDRIVER in use + HMIDIOUT hMidiOut; // MIDI output driver +#endif + +#if defined(IS_WINDOWS) && !defined(__RADWINRTAPI__) + + struct midihdr_tag *mhdr; // SysEx header + + HMDIDRIVER next; // Pointer to next HMDIDRIVER in use + + HMIDIOUT hMidiOut; // MIDI output driver + +#else + + #if defined(IS_MAC) + struct MIDIHDR *mhdr; // SysEx header + HMDIDRIVER next; // Pointer to next HMDIDRIVER in use + HMIDIOUT hMidiOut; // MIDI output driver + #endif + +#endif + +} MDI_DRIVER; + +#if defined(IS_WIN32API) || defined(IS_WII) + #pragma pack(push, 1) +#endif + +typedef MSS_STRUCT // XMIDI TIMB IFF chunk + { + S8 name[4]; + + U8 msb; + U8 lsb; + U8 lsb2; + U8 lsb3; + + U16 n_entries; + + U16 timbre[1]; + } +TIMB_chunk; + +typedef MSS_STRUCT // XMIDI RBRN IFF entry + { + S16 bnum; + U32 offset; + } +RBRN_entry; + +#if defined(IS_WIN32API) || defined(IS_WII) + #pragma pack(pop) +#endif + +typedef struct // Wave library entry +{ + S32 bank; // XMIDI bank, MIDI patch for sample + S32 patch; + + S32 root_key; // Root MIDI note # for sample (or -1) + + U32 file_offset; // Offset of wave data from start-of-file + U32 size; // Size of wave sample in bytes + + S32 format; // DIG_F format (8/16 bits, mono/stereo) + S32 playback_rate; // Playback rate in hertz +} +WAVE_ENTRY; + +typedef struct // Virtual "wave synthesizer" descriptor +{ + HMDIDRIVER mdi; // MIDI driver for use with synthesizer + HDIGDRIVER dig; // Digital driver for use with synthesizer + + WAVE_ENTRY *library; // Pointer to wave library + + AILEVENTCB prev_event_fn; // Previous MIDI event trap function + AILTIMBRECB prev_timb_fn; // Previous timbre request trap function + + CTRL_LOG controls; // MIDI controller states + + WAVE_ENTRY *wave [NUM_CHANS];// Pointer to WAVE_ENTRY for each channel + + HSAMPLE S [MAX_W_VOICES]; // List of HSAMPLE voices + S32 n_voices; // Actual # of voices allocated to synth + + S32 chan [MAX_W_VOICES]; // MIDI channel for each voice, or -1 + S32 note [MAX_W_VOICES]; // MIDI note number for voice + S32 root [MAX_W_VOICES]; // MIDI root note for voice + S32 rate [MAX_W_VOICES]; // Playback rate for voice + S32 vel [MAX_W_VOICES]; // MIDI note velocity for voice + U32 time [MAX_W_VOICES]; // Timestamp for voice + + U32 event; // Event counter for LRU timestamps +} +WAVE_SYNTH; + +typedef WAVE_SYNTH * HWAVESYNTH;// Handle to virtual wave synthesizer + + +// +// DIG_DRIVER list +// + +extern HDIGDRIVER DIG_first; + +// +// MDI_DRIVER list +// + +extern HMDIDRIVER MDI_first; + +// +// Miscellaneous system services +// + +#define FILE_READ_WITH_SIZE ((void*)(SINTa)-1) + + +typedef void * (AILCALLBACK *AILMEMALLOCCB)(UINTa size); +typedef void (AILCALLBACK *AILMEMFREECB)(void *); + +#define AIL_mem_alloc_lock_trk(size) AIL_mem_alloc_lock_info( size, __FILE__, __LINE__ ) +#define AIL_file_read_trk(file,dest) AIL_file_read_info( file, dest, __FILE__, __LINE__ ) +#define AIL_file_size_trk(file) AIL_file_size_info( file, __FILE__, __LINE__ ) + +//#define MSS_NONTRACKED +#ifdef MSS_NONTRACKED + DXDEC void * AILCALL AIL_mem_alloc_lock(UINTa size); + DXDEC void * AILCALL AIL_file_read(char const * filename, void * dest ); + DXDEC S32 AILCALL AIL_file_size(char const * filename ); +#else + #define AIL_mem_alloc_lock(size) AIL_mem_alloc_lock_trk(size) + #define AIL_file_read(file,dest) AIL_file_read_trk(file,dest) + #define AIL_file_size(file) AIL_file_size_trk(file) +#endif + +DXDEC void * AILCALL AIL_mem_alloc_lock_info(UINTa size, char const * file, U32 line); +DXDEC void AILCALL AIL_mem_free_lock (void *ptr); + + +DXDEC S32 AILCALL AIL_file_error (void); + +DXDEC S32 AILCALL AIL_file_size_info(char const *filename, + char const * caller, + U32 line); + +DXDEC void * AILCALL AIL_file_read_info(char const *filename, + void *dest, + char const * caller, + U32 line); + +DXDEC S32 AILCALL AIL_file_write (char const *filename, + void const *buf, + U32 len); + +DXDEC S32 AILCALL AIL_WAV_file_write + (char const *filename, + void const *buf, + U32 len, + S32 rate, + S32 format); + +DXDEC S32 AILCALL AIL_file_append (char const *filename, + void const *buf, U32 len); + +DXDEC AILMEMALLOCCB AILCALL AIL_mem_use_malloc(AILMEMALLOCCB fn); +DXDEC AILMEMFREECB AILCALL AIL_mem_use_free (AILMEMFREECB fn); + + +#define MSSBreakPoint RR_BREAK + + +// +// Compiler-independent CRTL helper functions for PS2 +// Exported here for use in demo programs as well as MSS itself +// + +#if defined(IS_PSP) + + DXDEC F32 AILCALL AIL_sin(F32 x); + DXDEC F32 AILCALL AIL_cos(F32 x); + DXDEC F32 AILCALL AIL_tan( F32 x ); + DXDEC F32 AILCALL AIL_acos(F32 x); + DXDEC F32 AILCALL AIL_atan(F32 x); + DXDEC F32 AILCALL AIL_ceil( F32 x ); + DXDEC F32 AILCALL AIL_floor( F32 x ); + DXDEC F32 AILCALL AIL_fsqrt( F32 x ); + DXDEC F32 AILCALL AIL_fabs ( F32 x ); + DXDEC F32 AILCALL AIL_log10( F32 x ); + DXDEC F32 AILCALL AIL_log( F32 x ); + DXDEC F32 AILCALL AIL_pow( F32 x, F32 p ); + DXDEC F32 AILCALL AIL_frexpf( F32 x, S32 *pw2 ); + DXDEC F32 AILCALL AIL_ldexpf( F32 x, S32 pw2 ); + #define AIL_exp(x) AIL_pow(2.718281828F,(x)) + +#else + + #ifdef IS_WATCOM + #define AIL_pow powf + #define AIL_tan tanf + #else + #define AIL_tan tan + #define AIL_pow pow + #endif + + #define AIL_sin sin + #define AIL_cos cos + #define AIL_acos acos + #define AIL_atan atan + #define AIL_ceil ceil + #define AIL_floor floor + + #if defined(IS_PS3) && !defined(IS_SPU) + DXDEC F32 AILCALL AIL_fsqrt( F32 val ); + #else + #define AIL_fsqrt(arg) ((F32) sqrt(arg)) + #endif + + #define AIL_fabs fabs + #define AIL_log10 log10 + #define AIL_log log + #define AIL_frexpf(a1,a2) ((F32) frexp(a1,a2)) + #define AIL_ldexpf(a1,a2) ((F32) ldexp(a1,a2)) + #define AIL_exp exp + +#endif + +// +// High-level support services +// + +DXDEC S32 AILCALL AIL_startup (void); + +DXDEC SINTa AILCALL AIL_get_preference (U32 number); + +DXDEC void AILCALL AIL_shutdown (void); + +DXDEC SINTa AILCALL AIL_set_preference (U32 number, + SINTa value); + +DXDEC char *AILCALL AIL_last_error (void); + +DXDEC void AILCALL AIL_set_error (char const * error_msg); + +#ifdef IS_WIIU +DXDEC void AILCALL AIL_set_wiiu_file_client (void* ptr_to_fsclient, void* ptr_to_fscmdblock); +#endif + +#ifdef __RADIPHONE__ +// +// On iOS, audio session interruptions stop the audio queues, and we have to manually restart them. +// +// This should be called whenever you get an Interruption Ended msg via your Audio Session callback. +// +DXDEC void AILCALL AIL_ios_post_audio_session_interrupt_end(HDIGDRIVER dig); +#endif + +// +// Low-level support services +// + +#ifdef IS_X86 + +DXDEC U32 AILCALL AIL_MMX_available (void); + +#endif + +#define AIL_lock AIL_lock_mutex +#define AIL_unlock AIL_unlock_mutex + +DXDEC void AILCALL AIL_lock_mutex (void); +DXDEC void AILCALL AIL_unlock_mutex (void); + +#define AIL_delay AIL_sleep +DXDEC void AILCALL AIL_sleep (U32 ms); + +DXDEC AILTRACECB AILCALL AIL_configure_logging (char const * filename, + AILTRACECB cb, + S32 level); + + +// +// Process services +// + +DXDEC HTIMER AILCALL AIL_register_timer (AILTIMERCB fn); + +DXDEC UINTa AILCALL AIL_set_timer_user (HTIMER timer, + UINTa user); + +DXDEC void AILCALL AIL_set_timer_period (HTIMER timer, + U32 microseconds); + +DXDEC void AILCALL AIL_set_timer_frequency (HTIMER timer, + U32 hertz); + +DXDEC void AILCALL AIL_set_timer_divisor (HTIMER timer, + U32 PIT_divisor); + +DXDEC void AILCALL AIL_start_timer (HTIMER timer); +DXDEC void AILCALL AIL_start_all_timers (void); + +DXDEC void AILCALL AIL_stop_timer (HTIMER timer); +DXDEC void AILCALL AIL_stop_all_timers (void); + +DXDEC void AILCALL AIL_release_timer_handle (HTIMER timer); +DXDEC void AILCALL AIL_release_all_timers (void); + +DXDEC S32 AILCALL AIL_timer_thread_handle(void* o_handle); + +#ifdef IS_MAC + #if defined(__PROCESSES__) + DXDEC ProcessSerialNumber AIL_Process(void); + #endif +#endif + +// +// high-level digital services +// + +#define AIL_OPEN_DIGITAL_FORCE_PREFERENCE 1 +#define AIL_OPEN_DIGITAL_NEED_HW_3D 2 +#define AIL_OPEN_DIGITAL_NEED_FULL_3D 4 +#define AIL_OPEN_DIGITAL_NEED_LIGHT_3D 8 +#define AIL_OPEN_DIGITAL_NEED_HW_REVERB 16 +#define AIL_OPEN_DIGITAL_NEED_REVERB 32 +#define AIL_OPEN_DIGITAL_USE_IOP_CORE0 64 + +#define AIL_OPEN_DIGITAL_USE_SPU0 (1<<24) +#define AIL_OPEN_DIGITAL_USE_SPU1 (2<<24) +#define AIL_OPEN_DIGITAL_USE_SPU2 (3<<24) +#define AIL_OPEN_DIGITAL_USE_SPU3 (4<<24) +#define AIL_OPEN_DIGITAL_USE_SPU4 (5<<24) +#define AIL_OPEN_DIGITAL_USE_SPU5 (6<<24) +#define AIL_OPEN_DIGITAL_USE_SPU6 (7<<24) + +#define AIL_OPEN_DIGITAL_USE_SPU( num ) ( ( num + 1 ) << 24 ) + +#ifdef IS_GENERICDIG + + struct _RadSoundSystem; + typedef S32 (*RADSS_OPEN_FUNC)(struct _RadSoundSystem* i_SoundSystem, U32 i_MinBufferSizeInMs, U32 i_Frequency, U32 i_ChannelCount, U32 i_MaxLockSize, U32 i_Flags); + + DXDEC HDIGDRIVER AILCALL AIL_open_generic_digital_driver(U32 frequency, S32 bits, S32 channel, U32 flags, RADSS_OPEN_FUNC dig_open); + + #ifdef IS_WIN32 + DXDEC RADSS_OPEN_FUNC AILCALL RADSS_DSInstallDriver(UINTa, UINTa); + DXDEC RADSS_OPEN_FUNC AILCALL RADSS_WOInstallDriver(UINTa, UINTa); + + #define AIL_open_digital_driver(frequency, bits, channel, flags) \ + AIL_open_generic_digital_driver(frequency, bits, channel, flags, RADSS_DSInstallDriver(0, 0)) + + #elif defined(IS_3DS) + DXDEC RADSS_OPEN_FUNC AILCALL RADSS_3DSInstallDriver(UINTa, UINTa); + + #define AIL_open_digital_driver(frequency, bits, channel, flags) \ + AIL_open_generic_digital_driver(frequency, bits, channel, flags, RADSS_3DSInstallDriver(0, 0)) + + #elif defined(__RADANDROID__) + + DXDEC void AILCALL AIL_set_asset_manager(void* asset_manager); + + DXDEC RADSS_OPEN_FUNC AILCALL RADSS_SLESInstallDriver(UINTa, UINTa); + + #define AIL_open_digital_driver(frequency, bits, channel, flags) \ + AIL_open_generic_digital_driver(frequency, bits, channel, flags, RADSS_SLESInstallDriver(0, 0)) + + + #elif defined(IS_PSP2) + DXDEC RADSS_OPEN_FUNC AILCALL RADSS_PSP2InstallDriver(UINTa, UINTa); + + #define AIL_open_digital_driver(frequency, bits, channel, flags) \ + AIL_open_generic_digital_driver(frequency, bits, channel, flags, RADSS_PSP2InstallDriver(0, 0)) + + #elif defined(__RADSEKRIT2__) + DXDEC RADSS_OPEN_FUNC AILCALL RADSS_SonyInstallDriver(UINTa, UINTa); + + #define AIL_open_digital_driver(frequency, bits, channel, flags) \ + AIL_open_generic_digital_driver(frequency, bits, channel, flags, RADSS_SonyInstallDriver(0, 0)) + + #elif defined(IS_PSP) + DXDEC RADSS_OPEN_FUNC AILCALL RADSS_PSPInstallDriver(UINTa, UINTa); + + #define AIL_OPEN_DIGITAL_USE_SIMPLEAUDIO ~0U + + #define AIL_open_digital_driver(frequency, bits, channel, flags) \ + AIL_open_generic_digital_driver(frequency, bits, channel, flags, RADSS_PSPInstallDriver(0, 0)) + + #elif defined(IS_XENON) || defined(__RADWINRTAPI__) + DXDEC RADSS_OPEN_FUNC AILCALL RADSS_XAudio2InstallDriver(UINTa, UINTa); + + #define AIL_open_digital_driver(frequency, bits, channel, flags) \ + AIL_open_generic_digital_driver(frequency, bits, channel, flags, RADSS_XAudio2InstallDriver(0, 0)) + + #elif defined(IS_WIIU) + DXDEC RADSS_OPEN_FUNC AILCALL RADSS_AXInstallDriver(UINTa, UINTa); + + #define AIL_open_digital_driver(frequency, bits, channel, flags) \ + AIL_open_generic_digital_driver(frequency, bits, channel, flags, RADSS_AXInstallDriver(0, 0)) + + #elif defined(IS_MAC) || defined(IS_IPHONE) + DXDEC RADSS_OPEN_FUNC AILCALL RADSS_OalInstallDriver(UINTa, UINTa); + DXDEC RADSS_OPEN_FUNC AILCALL RADSS_CAInstallDriver(UINTa, UINTa); + + #define AIL_open_digital_driver(frequency, bits, channel, flags) \ + AIL_open_generic_digital_driver(frequency, bits, channel, flags, RADSS_CAInstallDriver(0, 0)) + + #elif defined(IS_LINUX) + DXDEC RADSS_OPEN_FUNC AILCALL RADSS_OalInstallDriver(UINTa, UINTa); + + #define AIL_open_digital_driver(frequency, bits, channel, flags) \ + AIL_open_generic_digital_driver(frequency, bits, channel, flags, RADSS_OalInstallDriver(0, 0)) + #endif +#else // IS_GENERICDIG + +DXDEC HDIGDRIVER AILCALL AIL_open_digital_driver( U32 frequency, + S32 bits, + S32 channel, + U32 flags ); + +#endif // not IS_GENERICDIG + +DXDEC void AILCALL AIL_close_digital_driver( HDIGDRIVER dig ); + +#ifdef IS_LINUX + +#define AIL_MSS_version(str,len) \ +{ \ + strncpy(str, MSS_VERSION, len); \ +} + +DXDEC S32 AILCALL AIL_digital_handle_release(HDIGDRIVER drvr); + +DXDEC S32 AILCALL AIL_digital_handle_reacquire + (HDIGDRIVER drvr); +#elif defined( IS_WINDOWS ) + +#define AIL_MSS_version(str,len) \ +{ \ + HINSTANCE l=LoadLibrary(MSSDLLNAME); \ + if ((UINTa)l<=32) \ + *(str)=0; \ + else { \ + LoadString(l,1,str,len); \ + FreeLibrary(l); \ + } \ +} + +DXDEC S32 AILCALL AIL_digital_handle_release(HDIGDRIVER drvr); + +DXDEC S32 AILCALL AIL_digital_handle_reacquire + (HDIGDRIVER drvr); + +#elif defined( IS_MAC ) + +#if defined(__RESOURCES__) + + typedef MSS_STRUCT MSS_VersionType_ + { + Str255 version_name; + } MSS_VersionType; + + #define AIL_MSS_version(str,len) \ + { \ + long _res = HOpenResFile(0,0,"\p" MSSDLLNAME,fsRdPerm); \ + if (_res==-1) \ + { \ + str[0]=0; \ + } \ + else \ + { \ + Handle _H; \ + short _Err; \ + long _cur= CurResFile(); \ + UseResFile(_res); \ + _H = GetResource('vers', 2); \ + _Err = ResError(); \ + if((_Err != noErr) || (_H==0)) \ + { \ + str[0]=0; \ + UseResFile(_cur); \ + CloseResFile(_res); \ + } \ + else \ + { \ + if (GetHandleSize(_H)==0) \ + { \ + str[0]=0; \ + UseResFile(_cur); \ + CloseResFile(_res); \ + } \ + else \ + { \ + MSS_VersionType * _vt = (MSS_VersionType*)*_H; \ + if ((U32)_vt->version_name[6]>4) \ + _vt->version_name[6]-=4; \ + else \ + _vt->version_name[6]=0; \ + if (((U32)len) <= ((U32)_vt->version_name[6])) \ + _vt->version_name[6] = (U8)len-1; \ + memcpy( str, _vt->version_name+11, _vt->version_name[6] ); \ + str[_vt->version_name[6]]=0; \ + UseResFile(_cur); \ + CloseResFile(_res); \ + } \ + ReleaseResource(_H); \ + } \ + } \ + } + + #endif + + DXDEC S32 AILCALL AIL_digital_handle_release(HDIGDRIVER drvr); + + DXDEC S32 AILCALL AIL_digital_handle_reacquire + (HDIGDRIVER drvr); + +#endif + +DXDEC void AILCALL AIL_debug_log (char const * ifmt, ...); + +DXDEC S32 AILCALL AIL_sprintf(char *dest, + char const *fmt, ...); + +DXDEC char* AILCALL AIL_set_redist_directory(char const*dir); + +DXDEC S32 AILCALL AIL_background_CPU_percent (void); + +DXDEC S32 AILCALL AIL_digital_CPU_percent (HDIGDRIVER dig); + +#ifdef HOST_SPU_PROCESS +DXDEC S32 AILCALL AIL_digital_SPU_percent (HDIGDRIVER dig); +#endif + +DXDEC S32 AILCALL AIL_digital_latency (HDIGDRIVER dig); + +DXDEC HSAMPLE AILCALL AIL_allocate_sample_handle + (HDIGDRIVER dig); + + +EXPGROUP(Digital Audio Services) + +#define MILES_PUSH_REVERB 1 +#define MILES_PUSH_VOLUME 2 +#define MILES_PUSH_3D 4 +#define MILES_PUSH_RESET 8 + +DXDEC EXPAPI void AILCALL AIL_push_system_state(HDIGDRIVER dig, U32 flags, S16 crossfade_ms); +/* + Pushes the current system state, allowing for a temporary "clean" driver to use, and then + revert from. + + $:dig The driver to push + $:flags Logical "or" of options controlling the extent of the push. See discussion. + $:crossfade_ms The number of milliseconds to fade the transition over. [0, 32767] + + By default (ie flags == 0), effectively nothing happens. Since the operation neither affects + any subsystems nor resets the playing samples, a push immediately followed by a pop should + have no audible effects. + + However, any samples started during the push will be stopped (via $AIL_end_fade_sample) when the system is popped. + Streams will return SMP_DONE via $AIL_stream_status. It is up to the client code to perform any cleanup required. + + The flags can alter the above behavior in the following ways: + + $* MILES_PUSH_RESET - This flag causes the system to revert to a "new" state when pushed. Without any + other flags this will only be apparent with samples - any playing samples will cease to be processed + (though they will still report SMP_PLAYING). When the system is popped, these samples will resume. + + $* MILES_PUSH_REVERB - When present, reverb state will be affected in addition to sample state. + If MILES_PUSH_RESET is present, the reverb will be cleared to zero on push. Otherwise, it will be retained, + and only affected when popped. + + $* MILES_PUSH_3D - When present, 3d listener state will be affected in addition to sample state. + If MILES_PUSH_RESET is present, the 3d listener state will be reverted to the same state as a new driver. Otherwise + it will be retained and only affected when popped. + + $* MILES_PUSH_VOLUME - When present, master volume will be affected in addition to sample state. + If MILES_PUSH_RESET is present, the master volume will be set to 1.0f, otherwise it will be retained and only + affected when popped. + + $- + + If you want more control over whether a sample will be affected by a push or a pop operation, + see $AIL_set_sample_level_mask. + +*/ + +DXDEC EXPAPI void AILCALL AIL_pop_system_state(HDIGDRIVER dig, S16 crossfade_ms); +/* + Pops the current system state and returns the system to the way it + was before the last push. + + $:dig The driver to pop. + $:crossfade_ms The number of milliseconds to crossfade the transition over - [0, 32767] + + See $AIL_push_system_state for documentation. +*/ + +DXDEC EXPAPI U8 AILCALL AIL_system_state_level(HDIGDRIVER dig); +/* + Returns the current level the system has been pushed to. + + $:dig The driver to inspect + $:return A value between 0 and MILES_MAX_STATES, representing the depth of the current system stack. +*/ + +DXDEC EXPAPI void AILCALL AIL_set_sample_level_mask(HSAMPLE S, U8 mask); +/* + Sets the system levels at which a sample will play. + + $:S The sample to set the mask for. + $:mask The bitmask of levels for which the sample will play. + + Under normal push/pop operations, a sample's mask is set when it is + started to the level the system is at. If the system is pushed + without a reset, then the mask is adjusted to include the new level. + When a system is popped, if the sample is going to continue playing, + the state mask is adjusted to remove the level the system is popping + from. + + If you have a sample playing on a higher system level that needs + to continue after a pop, you can adjust the sample's mask by using + this function in conjunction with $AIL_system_state_level and + $AIL_sample_level_mask: + + ${ + AIL_set_sample_level_mask(S, AIL_sample_level_mask(S) |= (1 << (AIL_system_state_level(dig) - 1))); + $} +*/ + +DXDEC EXPAPI U8 AILCALL AIL_sample_level_mask(HSAMPLE S); +/* + Return the mask used to determine if the sample will play at a given system level. + + $:S The sample to inspect. + $:return The level mask for the sample. + + See $AIL_set_sample_level_mask. +*/ + +DXDEC EXPAPI U64 AILCALL AIL_digital_mixed_samples(HDIGDRIVER dig); +/* + Returns the number of samples that have been mixed in to the hardware. + + Used for timing samples for start via $AIL_schedule_start_sample. +*/ + +#define AIL_digital_samples_per_second(dig) (dig->DMA_rate) + + +DXDEC EXPAPI void AILCALL AIL_enable_limiter(HDIGDRIVER dig, S32 on_off); +/* + Enables a basic limiter to prevent clipping. + + $:dig The driver to enable the limiter on. + $:on_off If non-zero, the limiter will be enabled, otherwise it will be disabled. + + By default limiters are off. Currently they are not configurable. They kick on around + -10 db, and with a 0db signal will attenuate by about -18 db. Limiters run prior to + the 16 bit clamp. + + See also $AIL_bus_enable_limiter. +*/ + +EXPGROUP(bus_section) + +DXDEC EXPAPI HSAMPLE AILCALL AIL_allocate_bus(HDIGDRIVER dig); +/* + Allocates a bus to mix samples to. + + $:dig The HDIGDRIVER to allocate the bus on. + $:return The HSAMPLE for the new bus. + + A bus allows you to treat a group of samples as one sample. With the bus sample you can + do almost all of the things you can do with a normal sample handle. The only exception + is you can't adjust the playback rate of the sample. + + Use $AIL_bus_sample_handle to get the HSAMPLE associated with a bus. + + Each call to AIL_allocate_bus adds a new bus, up to a total bus count of MAX_BUSSES. After + the first call, two busses exist - the main bus and the first aux bus. The HSAMPLE returned + is for the first aux bus (index 1) +*/ + +DXDEC EXPAPI void AILCALL AIL_bus_enable_limiter(HDIGDRIVER dig, S32 bus_index, S32 on_off); +/* + Enables a basic limiter to prevent clipping. + + $:dig The driver containing the bus to enable the limiter on. + $:bus_index The index of the bus to enable the limiter on. + $:on_off If non-zero, the limiter will be enabled, otherwise it will be disabled. + + By default limiters are off. Currently they are not configurable. They kick on around + -10 db, and with a 0db signal will attenuate by about -18 db. Limiters run prior to + the 16 bit clamp. + + See also $AIL_enable_limiter. +*/ + +DXDEC EXPAPI HSAMPLE AILCALL AIL_bus_sample_handle(HDIGDRIVER dig, S32 bus_index); +/* + Returns the HSAMPLE associated with a bus. + + $:dig The HDIGDRIVER the bus resides within. + $:bus_index The index of the bus to return the HSAMPLE for. + $:return The HSAMPLE for the bus index. + + If the bus has not been allocated, or no busses have been allocated, this returns 0. This + means that for the "Main Bus" - index 0 - it will still return zero if no additional busses + have been allocated. +*/ + +DXDEC EXPAPI void AILCALL AIL_set_sample_bus(HSAMPLE S, S32 bus_index); +/* + Assigns an HSAMPLE to a bus. + + $:S The HSAMPLE to assign. + $:bus_index The bus index to assign the sample to. + + If the given bus has not been allocated, this function has no effect. +*/ + +DXDEC EXPAPI S32 AILCALL AIL_sample_bus(HSAMPLE S); +/* + Returns the bus an HSAMPLE is assigned to. + + $:S The HSAMPLE to check. + $:return The index of the bus the sample is assigned. + + All samples by default are assigned to bus 0. +*/ + +DXDEC EXPAPI S32 AILCALL AIL_install_bus_compressor(HDIGDRIVER dig, S32 bus_index, SAMPLESTAGE filter_stage, S32 input_bus_index); +/* + Installs the Compressor filter on to a bus, using another bus as the input for + compression/limiting. + + $:dig The driver the busses exist on. + $:bus_index The index of the bus the compressor will affect. + $:filter_stage The SAMPLESTAGE the compressor will use on the bus HSAMPLE. + $:input_bus_index The bus index the compressor will use as input. + + This installs a side chain compressor in to a given bus. It acts exactly like + any other filter you would put on an HSAMPLE, except the input_bus_index bus pipe's + its signal strength to the filter, allowing it to attenuate the bus_index bus based + on another bus's contents. + + To control the compressor parameters, access the bus's HSAMPLE via $AIL_bus_sample_handle and + use $AIL_sample_stage_property exactly as you would any other filter. The filter's properties + are documented under $(Compressor Filter) +*/ + +DXDEC void AILCALL AIL_set_speaker_configuration + (HDIGDRIVER dig, + MSSVECTOR3D *array, + S32 n_channels, + F32 falloff_power); + +DXDEC MSSVECTOR3D * + AILCALL AIL_speaker_configuration + (HDIGDRIVER dig, + S32 *n_physical_channels, + S32 *n_logical_channels, + F32 *falloff_power, + MSS_MC_SPEC *channel_spec); + +DXDEC void AILCALL AIL_set_listener_relative_receiver_array + (HDIGDRIVER dig, + MSS_RECEIVER_LIST *array, + S32 n_receivers); + +DXDEC MSS_RECEIVER_LIST * + AILCALL AIL_listener_relative_receiver_array + (HDIGDRIVER dig, + S32 *n_receivers); +DXDEC void AILCALL AIL_set_speaker_reverb_levels + (HDIGDRIVER dig, + F32 *wet_array, + F32 *dry_array, + MSS_SPEAKER const *speaker_index_array, + S32 n_levels); + +DXDEC S32 AILCALL AIL_speaker_reverb_levels (HDIGDRIVER dig, + F32 * *wet_array, + F32 * *dry_array, + MSS_SPEAKER const * *speaker_index_array); + + +DXDEC +void AILCALL AIL_set_sample_speaker_scale_factors (HSAMPLE S, //) + MSS_SPEAKER const * dest_speaker_indexes, + F32 const * levels, + S32 n_levels ); +DXDEC +void AILCALL AIL_sample_speaker_scale_factors (HSAMPLE S, //) + MSS_SPEAKER const * dest_speaker_indexes, + F32 * levels, + S32 n_levels ); + +DXDEC +S32 AILEXPORT AIL_set_sample_is_3D (HSAMPLE S, //) + S32 onoff); + +//DXDEC F32 AILEXPORT AIL_calculate_sample_final_attenuation(HSAMPLE S); +/* + Returns the attenuation that a sample will have. + + $:S Sample to compute. +*/ + +DXDEC +S32 AILEXPORT AIL_calculate_3D_channel_levels (HDIGDRIVER dig, //) + F32 *channel_levels, + MSS_SPEAKER const * *speaker_array, + MSSVECTOR3D *src_pos, + MSSVECTOR3D *src_face, + MSSVECTOR3D *src_up, + F32 src_inner_angle, + F32 src_outer_angle, + F32 src_outer_volume, + F32 src_max_dist, + F32 src_min_dist, + MSSVECTOR3D *listen_pos, + MSSVECTOR3D *listen_face, + MSSVECTOR3D *listen_up, + F32 rolloff_factor, + MSSVECTOR3D *doppler_velocity, + F32 *doppler_shift); + + +DXDEC void AILCALL AIL_release_sample_handle (HSAMPLE S); + +DXDEC S32 AILCALL AIL_init_sample (HSAMPLE S, + S32 format); + +DXDEC S32 AILCALL AIL_set_sample_file (HSAMPLE S, + void const *file_image, + S32 block); + +DXDEC S32 AILCALL AIL_set_sample_info (HSAMPLE S, + AILSOUNDINFO const * info); + +DXDEC S32 AILCALL AIL_set_named_sample_file (HSAMPLE S, + C8 const *file_type_suffix, + void const *file_image, + U32 file_size, + S32 block); + +DXDEC HPROVIDER AILCALL AIL_set_sample_processor (HSAMPLE S, + SAMPLESTAGE pipeline_stage, + HPROVIDER provider); + +DXDEC HPROVIDER AILCALL AIL_set_digital_driver_processor + (HDIGDRIVER dig, + DIGDRVSTAGE pipeline_stage, + HPROVIDER provider); + +DXDEC HPROVIDER AILCALL AIL_sample_processor (HSAMPLE S, + SAMPLESTAGE pipeline_stage); + +DXDEC HPROVIDER AILCALL AIL_digital_driver_processor + (HDIGDRIVER dig, + DIGDRVSTAGE pipeline_stage); + +DXDEC void AILCALL AIL_set_sample_adpcm_block_size + (HSAMPLE S, + U32 blocksize); + +DXDEC void AILCALL AIL_set_sample_address (HSAMPLE S, + void const *start, + U32 len); + +DXDEC void AILCALL AIL_start_sample (HSAMPLE S); + +EXPGROUP(Digital Audio Services) + +DXDEC EXPAPI void AILCALL AIL_schedule_start_sample(HSAMPLE S, U64 mix_time_to_start); +/* + Marks the specified sample to begin at the exact time specified. + + $:S The sample to start + $:mix_time_to_start The time to start the sample, in samples. + + Once set, the sample will have $AIL_start_sample called automatically + when the mixer reaches the specified time. The sample's delay will + be automatically adjusted such that the sample starts mid-block. + + ${ + // Get the current time. + U64 mix_time = AIL_digital_mixed_samples(dig); + + // Schedule to start 1 second out + mix_time += AIL_digital_samples_per_second(dig); + AIL_schedule_start_sample(S, mix_time ); + $} +*/ + +DXDEC EXPAPI U64 AILCALL AIL_sample_schedule_time(HSAMPLE S); +/* + Returns the mix time the sample is scheduled to start at, or 0 if not scheduled. + + $:S The sample to query. +*/ + +DXDEC void AILCALL AIL_stop_sample (HSAMPLE S); + +DXDEC void AILCALL AIL_end_fade_sample (HSAMPLE S); + +DXDEC void AILCALL AIL_resume_sample (HSAMPLE S); + +DXDEC void AILCALL AIL_end_sample (HSAMPLE S); + +DXDEC EXPAPI void AILCALL AIL_set_sample_id(HSAMPLE S, S32 id); +/* + Set an ID on a sample for use in synchronized control. + + $:S The sample to alter + $:id The id to use. +*/ + +DXDEC EXPAPI S32 AILCALL AIL_sample_id(HSAMPLE S); +/* + Return the current ID for a sample. + + $:S Sample to access +*/ + +DXDEC EXPAPI void AILCALL AIL_start_sample_group(HDIGDRIVER dig, S32 start_id, S32 set_to_id); +/* + Start a group of samples at the same time. + + $:dig The driver the samples are allocated from. + $:start_id The ID to start + $:set_to_id The ID to set the samples to once they have started. + + This function atomically calls $AIL_start_sample on all the samples to ensure the samples start in sync. +*/ + +DXDEC EXPAPI void AILCALL AIL_stop_sample_group(HDIGDRIVER dig, S32 stop_id, S32 set_to_id); +/* + Stops a group of samples at the same time. + + $:dig The driver the samples are allocated from. + $:stop_id The ID to stop + $:set_to_id The ID to set the samples to once they have stopped. + + This function atomically calls $AIL_stop_sample on all the samples to ensure they stop at the same point. +*/ + +DXDEC EXPAPI void AILCALL AIL_resume_sample_group(HDIGDRIVER dig, S32 resume_id, S32 set_to_id); +/* + Resumes a group of samples at the same time. + + $:dig The driver the samples are allocated from. + $:resume_id The ID to resume + $:set_to_id The ID to set the samples to once they have resumed. + + This function atomically calls $AIL_resume_sample on all the samples to ensure the samples start in sync. +*/ + +DXDEC EXPAPI void AILCALL AIL_end_sample_group(HDIGDRIVER dig, S32 end_id); +/* + Ends a group of samples at the same time. + + $:dig The driver the samples are allocated from. + $:end_id The ID to end + + This function atomically calls $AIL_end_sample on all the samples. +*/ + +DXDEC void AILCALL AIL_set_sample_playback_rate + (HSAMPLE S, + S32 playback_rate); + +DXDEC void AILCALL AIL_set_sample_playback_rate_factor + (HSAMPLE S, + F32 playback_rate_factor); + +DXDEC void AILCALL AIL_set_sample_playback_delay + (HSAMPLE S, + S32 playback_delay); + +DXDEC void AILCALL AIL_set_sample_volume_pan (HSAMPLE S, + F32 volume, + F32 pan); + +DXDEC void AILCALL AIL_set_sample_volume_levels(HSAMPLE S, + F32 left_level, + F32 right_level); + +DXDEC void AILCALL AIL_set_sample_channel_levels (HSAMPLE S, + MSS_SPEAKER const *source_speaker_indexes, + MSS_SPEAKER const *dest_speaker_indexes, + F32 const *levels, + S32 n_levels); + +DXDEC void AILCALL AIL_set_sample_reverb_levels(HSAMPLE S, + F32 dry_level, + F32 wet_level); + +DXDEC void AILCALL AIL_set_sample_low_pass_cut_off(HSAMPLE S, + S32 /*-1 or MSS_SPEAKER*/ channel, + F32 cut_off); + +DXDEC void AILCALL AIL_set_sample_loop_count (HSAMPLE S, + S32 loop_count); + +DXDEC void AILCALL AIL_set_sample_loop_block (HSAMPLE S, + S32 loop_start_offset, + S32 loop_end_offset); + +DXDEC EXPAPI S32 AILCALL AIL_set_sample_loop_samples(HSAMPLE S, S32 loop_start_samples, S32 loop_end_samples); +/* + Defines the loop points on a sample in samples rather than bytes. + + $:S The sample to alter. + $:loop_start_samples The sample count in to the file to start the looping. + $:loop_end_samples The sample count in the file to end the looping. + $:return 1 if successful, 0 otherwise. Check $AIL_last_error for details. + + For uncompressed samples, this largely reverts to $AIL_set_sample_loop_block, since the mapping + is straightforward. For compressed formats (like bink audio or mp3), looping in sample space is + non trivial and must be handled on a format-by-format basis. For the moment, only Bink Audio + supports this functionality - all other ASI formats will return failure. + + If a loop's length is too short, it may be extended. +*/ + + +DXDEC S32 AILCALL AIL_sample_loop_block (HSAMPLE S, + S32 *loop_start_offset, + S32 *loop_end_offset); + +DXDEC U32 AILCALL AIL_sample_status (HSAMPLE S); + +DXDEC U32 AILCALL AIL_sample_mixed_ms (HSAMPLE S); + +DXDEC S32 AILCALL AIL_sample_playback_rate (HSAMPLE S); + +DXDEC F32 AILCALL AIL_sample_playback_rate_factor (HSAMPLE S); + +DXDEC S32 AILCALL AIL_sample_playback_delay (HSAMPLE S); + +DXDEC void AILCALL AIL_sample_volume_pan (HSAMPLE S, F32* volume, F32* pan); + +DXDEC S32 AILCALL AIL_sample_channel_count (HSAMPLE S, U32 *mask); + +DXDEC void AILCALL AIL_sample_channel_levels (HSAMPLE S, + MSS_SPEAKER const *source_speaker_indexes, + MSS_SPEAKER const *dest_speaker_indexes, + F32 *levels, + S32 n_levels); + +DXDEC void AILCALL AIL_sample_volume_levels (HSAMPLE S, + F32 *left_level, + F32 *right_level); + +DXDEC void AILCALL AIL_sample_reverb_levels (HSAMPLE S, + F32 *dry_level, + F32 *wet_level); + +DXDEC F32 AILCALL AIL_sample_output_levels (HSAMPLE S, + MSS_SPEAKER const *source_speaker_indexes, + MSS_SPEAKER const *dest_speaker_indexes, + F32 *levels, + S32 n_levels); + +DXDEC F32 AILCALL AIL_sample_low_pass_cut_off(HSAMPLE S, S32 /*-1 or MSS_SPEAKER*/ channel); + +DXDEC S32 AILCALL AIL_sample_loop_count (HSAMPLE S); + +DXDEC void AILCALL AIL_set_digital_master_volume_level + (HDIGDRIVER dig, + F32 master_volume); + +DXDEC F32 AILCALL AIL_digital_master_volume_level (HDIGDRIVER dig); + +DXDEC void AILCALL AIL_set_sample_51_volume_pan( HSAMPLE S, + F32 volume, + F32 pan, + F32 fb_pan, + F32 center_level, + F32 sub_level ); + +DXDEC void AILCALL AIL_sample_51_volume_pan ( HSAMPLE S, + F32* volume, + F32* pan, + F32* fb_pan, + F32* center_level, + F32* sub_level ); + +DXDEC void AILCALL AIL_set_sample_51_volume_levels( HSAMPLE S, + F32 f_left_level, + F32 f_right_level, + F32 b_left_level, + F32 b_right_level, + F32 center_level, + F32 sub_level ); + +DXDEC void AILCALL AIL_sample_51_volume_levels ( HSAMPLE S, + F32* f_left_level, + F32* f_right_level, + F32* b_left_level, + F32* b_right_level, + F32* center_level, + F32* sub_level ); +DXDEC void AILCALL AIL_set_digital_master_reverb + (HDIGDRIVER dig, + S32 bus_index, + F32 reverb_decay_time, + F32 reverb_predelay, + F32 reverb_damping); + +DXDEC void AILCALL AIL_digital_master_reverb + (HDIGDRIVER dig, + S32 bus_index, + F32* reverb_time, + F32* reverb_predelay, + F32* reverb_damping); + +DXDEC void AILCALL AIL_set_digital_master_reverb_levels + (HDIGDRIVER dig, + S32 bus_index, + F32 dry_level, + F32 wet_level); + +DXDEC void AILCALL AIL_digital_master_reverb_levels + (HDIGDRIVER dig, + S32 bus_index, + F32 * dry_level, + F32 * wet_level); + + +// +// low-level digital services +// + +DXDEC S32 AILCALL AIL_minimum_sample_buffer_size(HDIGDRIVER dig, + S32 playback_rate, + S32 format); + +DXDEC S32 AILCALL AIL_set_sample_buffer_count (HSAMPLE S, + S32 n_buffers); + +DXDEC S32 AILCALL AIL_sample_loaded_len (HSAMPLE S); + +DXDEC S32 AILCALL AIL_sample_buffer_count (HSAMPLE S); + +DXDEC S32 AILCALL AIL_sample_buffer_available (HSAMPLE S); + +DXDEC S32 AILCALL AIL_load_sample_buffer (HSAMPLE S, + S32 buff_num, + void const *buffer, + U32 len); + +DXDEC void AILCALL AIL_request_EOB_ASI_reset (HSAMPLE S, + U32 buff_num, + S32 new_stream_position); + +DXDEC S32 AILCALL AIL_sample_buffer_info (HSAMPLE S, //) + S32 buff_num, + U32 *pos, + U32 *len, + S32 *head, + S32 *tail); + +DXDEC U32 AILCALL AIL_sample_granularity (HSAMPLE S); + +DXDEC void AILCALL AIL_set_sample_position (HSAMPLE S, + U32 pos); + +DXDEC U32 AILCALL AIL_sample_position (HSAMPLE S); + +DXDEC AILSAMPLECB AILCALL AIL_register_SOB_callback + (HSAMPLE S, + AILSAMPLECB SOB); + +DXDEC AILSAMPLECB AILCALL AIL_register_EOB_callback + (HSAMPLE S, + AILSAMPLECB EOB); + +DXDEC AILSAMPLECB AILCALL AIL_register_EOS_callback + (HSAMPLE S, + AILSAMPLECB EOS); + +DXDEC AILMIXERCB AILCALL AIL_register_mix_callback(HDIGDRIVER dig, AILMIXERCB mixcb); + +DXDEC AILFALLOFFCB AILCALL AIL_register_falloff_function_callback + (HSAMPLE S, + AILFALLOFFCB falloff_cb); + +DXDEC void AILCALL AIL_set_sample_user_data (HSAMPLE S, + U32 index, + SINTa value); + +DXDEC SINTa AILCALL AIL_sample_user_data (HSAMPLE S, + U32 index); + +DXDEC S32 AILCALL AIL_active_sample_count (HDIGDRIVER dig); + +DXDEC void AILCALL AIL_digital_configuration (HDIGDRIVER dig, + S32 *rate, + S32 *format, + char *string); + +DXDEC S32 AILCALL AIL_platform_property (void *object, + MSS_PLATFORM_PROPERTY property, + void *before_value, + void const *new_value, + void *after_value); + + +DXDEC void AILCALL AIL_set_sample_ms_position (HSAMPLE S, //) + S32 milliseconds); + +DXDEC U32 AILCALL AIL_sample_ms_lookup (HSAMPLE S, //) + S32 milliseconds, + S32* actualms); + +DXDEC void AILCALL AIL_sample_ms_position (HSAMPLE S, //) + S32 * total_milliseconds, + S32 * current_milliseconds); + +// +// Digital input services +// + +#if defined(IS_WINDOWS) + #define MSS_HAS_INPUT 1 +#elif defined(IS_MAC) + #define MSS_HAS_INPUT 1 +#else + #define MSS_HAS_INPUT 0 +#endif + +#if MSS_HAS_INPUT + +DXDEC HDIGINPUT AILCALL AIL_open_input (AIL_INPUT_INFO *info); + +DXDEC void AILCALL AIL_close_input (HDIGINPUT dig); + +DXDEC AIL_INPUT_INFO * + AILCALL AIL_get_input_info (HDIGINPUT dig); + +DXDEC S32 AILCALL AIL_set_input_state (HDIGINPUT dig, + S32 enable); +#endif + + +// +// High-level XMIDI services +// + +DXDEC HMDIDRIVER AILCALL AIL_open_XMIDI_driver( U32 flags ); + +#define AIL_OPEN_XMIDI_NULL_DRIVER 1 + +DXDEC void AILCALL AIL_close_XMIDI_driver( HMDIDRIVER mdi ); + +#if defined(IS_MAC) || defined(IS_LINUX) + +DXDEC S32 AILCALL AIL_MIDI_handle_release + (HMDIDRIVER mdi); + +DXDEC S32 AILCALL AIL_MIDI_handle_reacquire + (HMDIDRIVER mdi); + +#elif defined( IS_WINDOWS ) + +DXDEC S32 AILCALL AIL_midiOutOpen(HMDIDRIVER *drvr, + LPHMIDIOUT *lphMidiOut, + S32 dwDeviceID); + +DXDEC void AILCALL AIL_midiOutClose (HMDIDRIVER mdi); + +DXDEC S32 AILCALL AIL_MIDI_handle_release + (HMDIDRIVER mdi); + +DXDEC S32 AILCALL AIL_MIDI_handle_reacquire + (HMDIDRIVER mdi); + +#endif + +DXDEC HSEQUENCE AILCALL AIL_allocate_sequence_handle + (HMDIDRIVER mdi); + +DXDEC void AILCALL AIL_release_sequence_handle + (HSEQUENCE S); + +DXDEC S32 AILCALL AIL_init_sequence (HSEQUENCE S, + void const *start, + S32 sequence_num); + +DXDEC void AILCALL AIL_start_sequence (HSEQUENCE S); + +DXDEC void AILCALL AIL_stop_sequence (HSEQUENCE S); + +DXDEC void AILCALL AIL_resume_sequence (HSEQUENCE S); + +DXDEC void AILCALL AIL_end_sequence (HSEQUENCE S); + +DXDEC void AILCALL AIL_set_sequence_tempo (HSEQUENCE S, + S32 tempo, + S32 milliseconds); + +DXDEC void AILCALL AIL_set_sequence_volume (HSEQUENCE S, + S32 volume, + S32 milliseconds); + +DXDEC void AILCALL AIL_set_sequence_loop_count + (HSEQUENCE S, + S32 loop_count); + +DXDEC U32 AILCALL AIL_sequence_status (HSEQUENCE S); + +DXDEC S32 AILCALL AIL_sequence_tempo (HSEQUENCE S); + +DXDEC S32 AILCALL AIL_sequence_volume (HSEQUENCE S); + +DXDEC S32 AILCALL AIL_sequence_loop_count (HSEQUENCE S); + +DXDEC void AILCALL AIL_set_XMIDI_master_volume + (HMDIDRIVER mdi, + S32 master_volume); + +DXDEC S32 AILCALL AIL_XMIDI_master_volume (HMDIDRIVER mdi); + + +// +// Low-level XMIDI services +// + +DXDEC S32 AILCALL AIL_active_sequence_count (HMDIDRIVER mdi); + +DXDEC S32 AILCALL AIL_controller_value (HSEQUENCE S, + S32 channel, + S32 controller_num); + +DXDEC S32 AILCALL AIL_channel_notes (HSEQUENCE S, + S32 channel); + +DXDEC void AILCALL AIL_sequence_position (HSEQUENCE S, + S32 *beat, + S32 *measure); + +DXDEC void AILCALL AIL_branch_index (HSEQUENCE S, + U32 marker); + +DXDEC AILPREFIXCB AILCALL AIL_register_prefix_callback + (HSEQUENCE S, + AILPREFIXCB callback); + +DXDEC AILTRIGGERCB AILCALL AIL_register_trigger_callback + (HSEQUENCE S, + AILTRIGGERCB callback); + +DXDEC AILSEQUENCECB AILCALL AIL_register_sequence_callback + (HSEQUENCE S, + AILSEQUENCECB callback); + +DXDEC AILBEATCB AILCALL AIL_register_beat_callback (HSEQUENCE S, + AILBEATCB callback); + +DXDEC AILEVENTCB AILCALL AIL_register_event_callback (HMDIDRIVER mdi, + AILEVENTCB callback); + +DXDEC AILTIMBRECB AILCALL AIL_register_timbre_callback + (HMDIDRIVER mdi, + AILTIMBRECB callback); + +DXDEC void AILCALL AIL_set_sequence_user_data (HSEQUENCE S, + U32 index, + SINTa value); + +DXDEC SINTa AILCALL AIL_sequence_user_data (HSEQUENCE S, + U32 index); + +DXDEC void AILCALL AIL_register_ICA_array (HSEQUENCE S, + U8 *array); + +DXDEC S32 AILCALL AIL_lock_channel (HMDIDRIVER mdi); + +DXDEC void AILCALL AIL_release_channel (HMDIDRIVER mdi, + S32 channel); + +DXDEC void AILCALL AIL_map_sequence_channel (HSEQUENCE S, + S32 seq_channel, + S32 new_channel); + +DXDEC S32 AILCALL AIL_true_sequence_channel (HSEQUENCE S, + S32 seq_channel); + +DXDEC void AILCALL AIL_send_channel_voice_message + (HMDIDRIVER mdi, + HSEQUENCE S, + S32 status, + S32 data_1, + S32 data_2); + +DXDEC void AILCALL AIL_send_sysex_message (HMDIDRIVER mdi, + void const *buffer); + +DXDEC HWAVESYNTH + AILCALL AIL_create_wave_synthesizer (HDIGDRIVER dig, + HMDIDRIVER mdi, + void const *wave_lib, + S32 polyphony); + +DXDEC void AILCALL AIL_destroy_wave_synthesizer (HWAVESYNTH W); + +DXDEC void AILCALL AIL_set_sequence_ms_position (HSEQUENCE S, //) + S32 milliseconds); + +DXDEC void AILCALL AIL_sequence_ms_position(HSEQUENCE S, //) + S32 *total_milliseconds, + S32 *current_milliseconds); + + + +// +// red book functions +// + +#ifdef IS_WINDOWS + +#pragma pack(push, 1) + +typedef MSS_STRUCT _REDBOOK { + U32 DeviceID; + U32 paused; + U32 pausedsec; + U32 lastendsec; +} REDBOOK; + +#pragma pack(pop) + +typedef MSS_STRUCT _REDBOOK* HREDBOOK; + +#define REDBOOK_ERROR 0 +#define REDBOOK_PLAYING 1 +#define REDBOOK_PAUSED 2 +#define REDBOOK_STOPPED 3 + + +DXDEC HREDBOOK AILCALL AIL_redbook_open(U32 which); + +DXDEC HREDBOOK AILCALL AIL_redbook_open_drive(S32 drive); + +DXDEC void AILCALL AIL_redbook_close(HREDBOOK hand); + +DXDEC void AILCALL AIL_redbook_eject(HREDBOOK hand); + +DXDEC void AILCALL AIL_redbook_retract(HREDBOOK hand); + +DXDEC U32 AILCALL AIL_redbook_status(HREDBOOK hand); + +DXDEC U32 AILCALL AIL_redbook_tracks(HREDBOOK hand); + +DXDEC U32 AILCALL AIL_redbook_track(HREDBOOK hand); + +DXDEC void AILCALL AIL_redbook_track_info(HREDBOOK hand,U32 tracknum, + U32* startmsec,U32* endmsec); + +DXDEC U32 AILCALL AIL_redbook_id(HREDBOOK hand); + +DXDEC U32 AILCALL AIL_redbook_position(HREDBOOK hand); + +DXDEC U32 AILCALL AIL_redbook_play(HREDBOOK hand,U32 startmsec, U32 endmsec); + +DXDEC U32 AILCALL AIL_redbook_stop(HREDBOOK hand); + +DXDEC U32 AILCALL AIL_redbook_pause(HREDBOOK hand); + +DXDEC U32 AILCALL AIL_redbook_resume(HREDBOOK hand); + +DXDEC F32 AILCALL AIL_redbook_volume_level(HREDBOOK hand); + +DXDEC F32 AILCALL AIL_redbook_set_volume_level(HREDBOOK hand, F32 volume); + +#endif + +DXDEC U32 AILCALL AIL_ms_count(void); +DXDEC U32 AILCALL AIL_us_count(void); +DXDEC U64 AILCALL AIL_ms_count64(void); +DXDEC U64 AILCALL AIL_us_count64(void); +DXDEC U64 AILCALL AIL_get_time(void); +DXDEC U64 AILCALL AIL_time_to_ms(U64 time); +DXDEC U64 AILCALL AIL_ms_to_time(U64 ms); + +DXDEC void AILCALL MilesUseTelemetry( void * context ); +DXDEC void AILCALL MilesUseTmLite( void* context ); + +// +// +// + +#define MSSIO_FLAGS_DONT_CLOSE_HANDLE 1 +#define MSSIO_FLAGS_QUERY_SIZE_ONLY 2 +#define MSSIO_FLAGS_DONT_USE_OFFSET 4 + +#define MSSIO_STATUS_COMPLETE 1 +#define MSSIO_STATUS_ERROR_FAILED_OPEN 0x1003 +#define MSSIO_STATUS_ERROR_FAILED_READ 0x1004 +#define MSSIO_STATUS_ERROR_SHUTDOWN 0x1005 +#define MSSIO_STATUS_ERROR_CANCELLED 0x1006 +#define MSSIO_STATUS_ERROR_MEMORY_ALLOC_FAIL 0x1007 +#define MSSIO_STATUS_ERROR_MASK 0x1000 + +// returns percent full (1.0 = 100%) +typedef F32 (AILCALLBACK *MilesAsyncStreamCallback)(void* i_User); + +struct MilesAsyncRead +{ + char FileName[256]; + U64 Offset; + S64 Count; + void* Buffer; + void* StreamUserData; + MilesAsyncStreamCallback StreamCB; + char const * caller; + U32 caller_line; + UINTa FileHandle; + S32 Flags; + S32 ReadAmt; // current read amt. + S32 AdditionalBuffer; + S32 volatile Status; // This is only valid after a call to MilesAsyncFileWait or MilesAsyncFileCancel has succeeded. + char Internal[48+128]; +}; + +DXDEC S32 AILCALL MilesAsyncFileRead(struct MilesAsyncRead* i_Request); +DXDEC S32 AILCALL MilesAsyncFileCancel(struct MilesAsyncRead* i_Request); // 1 if the request has completed, 0 otherwise. Use Wait if needed. +DXDEC S32 AILCALL MilesAsyncFileStatus(struct MilesAsyncRead* i_Request, U32 i_MS); // 1 if complete, 0 if timeout exceeded. +DXDEC S32 AILCALL MilesAsyncStartup(); +DXDEC S32 AILCALL MilesAsyncShutdown(); +DXDEC S32 AILCALL AIL_IO_thread_handle(void* o_Handle); +DXDEC void AILCALL MilesAsyncSetPaused(S32 i_IsPaused); + +typedef S32 (AILCALLBACK * MilesAsyncFileRead_callback)(struct MilesAsyncRead* i_Request); +typedef S32 (AILCALLBACK * MilesAsyncFileCancel_callback)(struct MilesAsyncRead* i_Request); // 1 if the request has completed, 0 otherwise. Use Wait if needed. +typedef S32 (AILCALLBACK * MilesAsyncFileStatus_callback)(struct MilesAsyncRead* i_Request, U32 i_MS); // 1 if complete, 0 if timeout exceeded. +typedef S32 (AILCALLBACK * MilesAsyncStartup_callback)(); +typedef S32 (AILCALLBACK * MilesAsyncShutdown_callback)(); +typedef void (AILCALLBACK * MilesAsyncSetPaused_callback)(S32 i_IsPaused); +typedef S32 (AILCALLBACK * AIL_IO_thread_handle_callback)(void* o_Handle); + +DXDEC void AILCALL AIL_set_async_callbacks( + MilesAsyncFileRead_callback read, + MilesAsyncFileCancel_callback cancel, + MilesAsyncFileStatus_callback status, + MilesAsyncStartup_callback startup, + MilesAsyncShutdown_callback shutdown, + MilesAsyncSetPaused_callback setpaused, + AIL_IO_thread_handle_callback threadhandle); + +// +// +// + +typedef struct _STREAM* HSTREAM; // Handle to stream + +typedef void (AILCALLBACK* AILSTREAMCB) (HSTREAM stream); + +#define MSS_STREAM_CHUNKS 8 + +typedef struct _STREAM +{ + S32 block_oriented; // 1 if this is an ADPCM or ASI-compressed stream + S32 using_ASI; // 1 if using ASI decoder to uncompress stream data + ASISTAGE *ASI; // handy pointer to our ASI coded + + HSAMPLE samp; // the sample handle + + UINTa fileh; // the open file handle + + U8* bufs[MSS_STREAM_CHUNKS]; // the data buffers + S32 reset_ASI[MSS_STREAM_CHUNKS]; // should we reset the ASI at the end of the buffer? + S32 reset_seek_pos[MSS_STREAM_CHUNKS]; // new stream position after reset + S32 bufstart[MSS_STREAM_CHUNKS]; // offset of where this buffer started + S32 loadedsizes[MSS_STREAM_CHUNKS]; // sizes of the data to be started + + struct MilesAsyncRead asyncs[MSS_STREAM_CHUNKS]; + S32 asyncs_loaded[MSS_STREAM_CHUNKS]; // 0=unloaded, 1=loading, 2=loaded, but not started + S32 next_read_offset; // offset to pass to the next read, so the seek occurs internally. -1 to not seek. + + S32 into_Miles_index; // index of buffer that we will async into next + S32 read_IO_index; // index of buffer to be loaded into Miles next + + S32 bufsize; // size of each buffer + + U32 datarate; // datarate in bytes per second + S32 filerate; // original datarate of the file + S32 filetype; // file format type + U32 filemask; // channel mask for stream file + S32 totallen; // total length of the sound data + + S32 substart; // subblock loop start + S32 sublen; // subblock loop len + + U32 blocksize; // ADPCM block size + + S32 loadedsome; // have we done any loads? + + U32 startpos; // point that the sound data begins + U32 async_pos; // position if the last async completed + + U32 loopsleft; // how many loops are left + + U32 error; // read error has occurred + + S32 preload; // preload the file into the first buffer + U32 preloadpos; // position to use in preload + U32 noback; // no background processing + S32 alldone; // alldone + S32 primeamount; // amount to load after a seek + S32 primeleft; // amount to read before starting + + S32 playcontrol; // control: 0=stopped, 1=started, |8=paused, |16=sample paused + + AILSTREAMCB callback; // end of stream callback + + SINTa user_data[8]; // Miscellaneous user data + void* next; // pointer to next stream + + S32 autostreaming; // are we autostreaming this stream + + F32 level; // io percent full + F32 last_level; // old io percent + F32 percent_mult; // factor to scale by + S32 stream_count; // unique number of the stream + + S32 docallback; // set when it time to poll for a callback + + S32 was_popped; // set to 1 if the stream needs to be freed due to a system push/pop - causes SMP_DONE to be stream_status +} MSTREAM_TYPE; + + +DXDEC HSTREAM AILCALL AIL_open_stream(HDIGDRIVER dig, char const * filename, S32 stream_mem); + +DXDEC void AILCALL AIL_close_stream(HSTREAM stream); + +DXDEC HSAMPLE AILCALL AIL_stream_sample_handle(HSTREAM stream); + +DXDEC S32 AILCALL AIL_service_stream(HSTREAM stream, S32 fillup); + +DXDEC void AILCALL AIL_start_stream(HSTREAM stream); + +DXDEC void AILCALL AIL_pause_stream(HSTREAM stream, S32 onoff); + +DXDEC S32 AILCALL AIL_stream_loop_count(HSTREAM stream); + +DXDEC void AILCALL AIL_set_stream_loop_count(HSTREAM stream, S32 count); + +DXDEC void AILCALL AIL_set_stream_loop_block (HSTREAM S, + S32 loop_start_offset, + S32 loop_end_offset); + +DXDEC S32 AILCALL AIL_stream_status(HSTREAM stream); + +DXDEC F32 AILCALL AIL_stream_filled_percent(HSTREAM stream); + +DXDEC void AILCALL AIL_set_stream_position(HSTREAM stream,S32 offset); + +DXDEC S32 AILCALL AIL_stream_position(HSTREAM stream); + +DXDEC void AILCALL AIL_stream_info(HSTREAM stream, S32* datarate, S32* sndtype, S32* length, S32* memory); + +DXDEC AILSTREAMCB AILCALL AIL_register_stream_callback(HSTREAM stream, AILSTREAMCB callback); + +DXDEC void AILCALL AIL_auto_service_stream(HSTREAM stream, S32 onoff); + +DXDEC void AILCALL AIL_set_stream_user_data (HSTREAM S, + U32 index, + SINTa value); + +DXDEC SINTa AILCALL AIL_stream_user_data (HSTREAM S, + U32 index); + +DXDEC void AILCALL AIL_set_stream_ms_position (HSTREAM S, + S32 milliseconds); + +DXDEC void AILCALL AIL_stream_ms_position (HSTREAM S, //) + S32 * total_milliseconds, + S32 * current_milliseconds); + +//! \todo MSS_FILE not needed anymore? +typedef char MSS_FILE; + +typedef U32 (AILCALLBACK*AIL_file_open_callback) (MSS_FILE const* Filename, + UINTa* FileHandle); + +typedef void (AILCALLBACK*AIL_file_close_callback) (UINTa FileHandle); + +#define AIL_FILE_SEEK_BEGIN 0 +#define AIL_FILE_SEEK_CURRENT 1 +#define AIL_FILE_SEEK_END 2 + +typedef S32 (AILCALLBACK*AIL_file_seek_callback) (UINTa FileHandle, + S32 Offset, + U32 Type); + +typedef U32 (AILCALLBACK*AIL_file_read_callback) (UINTa FileHandle, + void* Buffer, + U32 Bytes); + +DXDEC void AILCALL AIL_set_file_callbacks (AIL_file_open_callback opencb, + AIL_file_close_callback closecb, + AIL_file_seek_callback seekcb, + AIL_file_read_callback readcb); + +DXDEC void AILCALL AIL_file_callbacks(AIL_file_open_callback* opencb, + AIL_file_close_callback* closecb, + AIL_file_seek_callback* seekcb, + AIL_file_read_callback* readcb); + +#ifdef IS_32 + +typedef void* (AILCALLBACK *AIL_file_async_read_callback) (UINTa FileHandle, + void* Buffer, + U32 Bytes); + +typedef S32 (AILCALLBACK*AIL_file_async_status_callback) (void* async, + S32 wait, + U32* BytesRead); + +DXDEC void AILCALL AIL_set_file_async_callbacks (AIL_file_open_callback opencb, + AIL_file_close_callback closecb, + AIL_file_seek_callback seekcb, + AIL_file_async_read_callback areadcb, + AIL_file_async_status_callback statuscb); + +#endif + +// +// High-level DLS functions +// + +typedef struct _DLSFILEID { + SINTa id; + struct _DLSFILEID* next; +} DLSFILEID; + +typedef struct _DLSFILEID* HDLSFILEID; + +typedef struct _DLSDEVICE { + VOIDFUNC* pGetPref; + VOIDFUNC* pSetPref; + VOIDFUNC* pMSSOpen; + VOIDFUNC* pOpen; + VOIDFUNC* pClose; + VOIDFUNC* pLoadFile; + VOIDFUNC* pLoadMem; + VOIDFUNC* pUnloadFile; + VOIDFUNC* pUnloadAll; + VOIDFUNC* pGetInfo; + VOIDFUNC* pCompact; + VOIDFUNC* pSetAttr; + SINTa DLSHandle; + U32 format; + U32 buffer_size; + void* buffer[2]; + HSAMPLE sample; + HMDIDRIVER mdi; + HDIGDRIVER dig; + HDLSFILEID first; +#if defined(__RADNT__) + + #ifdef MSS_STATIC_RIB + #error "Bad defines - can't have a static rib on NT" + #endif + HMODULE lib; +#elif defined(MSS_STATIC_RIB) + char* DOSname; +#endif +} DLSDEVICE; + +typedef struct _DLSDEVICE* HDLSDEVICE; + +typedef struct _AILDLSINFO { + char Description[128]; + S32 MaxDLSMemory; + S32 CurrentDLSMemory; + S32 LargestSize; + S32 GMAvailable; + S32 GMBankSize; +} AILDLSINFO; + +#ifdef MSS_STATIC_RIB + +typedef struct _AILSTATICDLS { + char* description; + VOIDFUNC* pDLSOpen; + VOIDFUNC* pMSSOpen; + VOIDFUNC* pOpen; + VOIDFUNC* pClose; + VOIDFUNC* pLoadFile; + VOIDFUNC* pLoadMem; + VOIDFUNC* pUnloadFile; + VOIDFUNC* pUnloadAll; + VOIDFUNC* pGetInfo; + VOIDFUNC* pCompact; + VOIDFUNC* pSetAttr; +} AILSTATICDLS; + +#endif // MSS_STATIC_RIB + + +DXDEC HDLSDEVICE AILCALL AIL_DLS_open(HMDIDRIVER mdi, HDIGDRIVER dig, +#ifdef MSS_STATIC_RIB + AILSTATICDLS const * staticdls, +#elif defined(__RADNT__) + char const * libname, +#endif + U32 flags, U32 rate, S32 bits, S32 channels); + +// +// Parameters for the dwFlag used in DLSClose() and flags in AIL_DLS_close +// + +#define RETAIN_DLS_COLLECTION 0x00000001 +#define RETURN_TO_BOOTUP_STATE 0x00000002 +#define RETURN_TO_GM_ONLY_STATE 0x00000004 +#define DLS_COMPACT_MEMORY 0x00000008 + +DXDEC void AILCALL AIL_DLS_close(HDLSDEVICE dls, U32 flags); + +DXDEC HDLSFILEID AILCALL AIL_DLS_load_file(HDLSDEVICE dls, char const* filename, U32 flags); + +DXDEC HDLSFILEID AILCALL AIL_DLS_load_memory(HDLSDEVICE dls, void const* memfile, U32 flags); + +// +// other parameters for AIL_DLS_unload +// + +#define AIL_DLS_UNLOAD_MINE 0 +#define AIL_DLS_UNLOAD_ALL ((HDLSFILEID)(UINTa)(SINTa)-1) + +DXDEC void AILCALL AIL_DLS_unload(HDLSDEVICE dls, HDLSFILEID dlsid); + +DXDEC void AILCALL AIL_DLS_compact(HDLSDEVICE dls); + +DXDEC void AILCALL AIL_DLS_get_info(HDLSDEVICE dls, AILDLSINFO* info, S32* PercentCPU); + +DXDEC HSAMPLE AILCALL AIL_DLS_sample_handle(HDLSDEVICE dls); + + +// +// Quick-integration service functions and data types +// + +typedef struct +{ + U32 const *data; + S32 size; + S32 type; + void *handle; + S32 status; + void* next; + S32 speed; + F32 volume; + F32 extravol; + F32 dry; + F32 wet; + F32 cutoff; + HDLSFILEID dlsid; + void* dlsmem; + void* dlsmemunc; + S32 milliseconds; + S32 length; + SINTa userdata; +} +AUDIO_TYPE; + + +#define QSTAT_DONE 1 // Data has finished playing +#define QSTAT_LOADED 2 // Data has been loaded, but not yet played +#define QSTAT_PLAYING 3 // Data is currently playing + +typedef AUDIO_TYPE * HAUDIO; // Generic handle to any audio data type + +#define AIL_QUICK_USE_WAVEOUT 2 +#define AIL_QUICK_MIDI_AND_DLS 2 +#define AIL_QUICK_DLS_ONLY 3 +#define AIL_QUICK_MIDI_AND_VORTEX_DLS 4 +#define AIL_QUICK_MIDI_AND_SONICVIBES_DLS 5 + +DXDEC S32 AILCALL + AIL_quick_startup ( + S32 use_digital, + S32 use_MIDI, + U32 output_rate, + S32 output_bits, + S32 output_channels); + +DXDEC void AILCALL AIL_quick_shutdown (void); + +DXDEC void AILCALL AIL_quick_handles (HDIGDRIVER* pdig, + HMDIDRIVER* pmdi, + HDLSDEVICE* pdls ); + +DXDEC HAUDIO AILCALL AIL_quick_load (char const *filename); + +DXDEC HAUDIO AILCALL AIL_quick_load_mem (void const *mem, + U32 size); + +DXDEC HAUDIO AILCALL AIL_quick_load_named_mem (void const *mem, + char const *filename, + U32 size); + +DXDEC HAUDIO AILCALL AIL_quick_copy (HAUDIO audio); + +DXDEC void AILCALL AIL_quick_unload (HAUDIO audio); + +DXDEC S32 AILCALL AIL_quick_play (HAUDIO audio, + U32 loop_count); + +DXDEC void AILCALL AIL_quick_halt (HAUDIO audio); + +DXDEC S32 AILCALL AIL_quick_status (HAUDIO audio); + +DXDEC HAUDIO AILCALL AIL_quick_load_and_play (char const *filename, + U32 loop_count, + S32 wait_request); + +DXDEC void AILCALL AIL_quick_set_speed (HAUDIO audio, S32 speed); + +DXDEC void AILCALL AIL_quick_set_volume (HAUDIO audio, F32 volume, F32 extravol); + +DXDEC void AILCALL AIL_quick_set_reverb_levels (HAUDIO audio, + F32 dry_level, + F32 wet_level); + +DXDEC void AILCALL AIL_quick_set_low_pass_cut_off(HAUDIO S, + S32 channel, + F32 cut_off); + +DXDEC void AILCALL AIL_quick_set_ms_position(HAUDIO audio,S32 milliseconds); + +DXDEC S32 AILCALL AIL_quick_ms_position(HAUDIO audio); + +DXDEC S32 AILCALL AIL_quick_ms_length(HAUDIO audio); + + +#define AIL_QUICK_XMIDI_TYPE 1 +#define AIL_QUICK_DIGITAL_TYPE 2 +#define AIL_QUICK_DLS_XMIDI_TYPE 3 +#define AIL_QUICK_MPEG_DIGITAL_TYPE 4 +#define AIL_QUICK_OGG_VORBIS_TYPE 5 +#define AIL_QUICK_V12_VOICE_TYPE 6 +#define AIL_QUICK_V24_VOICE_TYPE 7 +#define AIL_QUICK_V29_VOICE_TYPE 8 +#define AIL_QUICK_OGG_SPEEX_TYPE 9 +#define AIL_QUICK_S8_VOICE_TYPE 10 +#define AIL_QUICK_S16_VOICE_TYPE 11 +#define AIL_QUICK_S32_VOICE_TYPE 12 +#define AIL_QUICK_BINKA_TYPE 13 + +DXDEC S32 AILCALL AIL_quick_type(HAUDIO audio); + +DXDEC S32 AILCALL AIL_WAV_info(void const* WAV_image, AILSOUNDINFO* info); + +DXDEC S32 AILCALL AIL_WAV_marker_count(void const *WAV_image); + +DXDEC S32 AILCALL AIL_WAV_marker_by_index(void const *WAV_image, S32 n, C8 const **name); + +DXDEC S32 AILCALL AIL_WAV_marker_by_name(void const *WAV_image, C8 *name); + +DXDEC S32 AILCALL AIL_size_processed_digital_audio( + U32 dest_rate, + U32 dest_format, + S32 num_srcs, + AILMIXINFO const * src); + +DXDEC S32 AILCALL AIL_process_digital_audio( + void *dest_buffer, + S32 dest_buffer_size, + U32 dest_rate, + U32 dest_format, + S32 num_srcs, + AILMIXINFO* src); + +#define AIL_LENGTHY_INIT 0 +#define AIL_LENGTHY_SET_PROPERTY 1 +#define AIL_LENGTHY_UPDATE 2 +#define AIL_LENGTHY_DONE 3 + +typedef S32 (AILCALLBACK* AILLENGTHYCB)(U32 state,UINTa user); + +typedef S32 (AILCALLBACK* AILCODECSETPROP)(char const* property,void const * value); + +DXDEC S32 AILCALL AIL_compress_ASI(AILSOUNDINFO const * info, //) + char const* filename_ext, + void** outdata, + U32* outsize, + AILLENGTHYCB callback); + +DXDEC S32 AILCALL AIL_decompress_ASI(void const* indata, //) + U32 insize, + char const* filename_ext, + void** wav, + U32* wavsize, + AILLENGTHYCB callback); + +DXDEC S32 AILCALL AIL_compress_ADPCM(AILSOUNDINFO const * info, + void** outdata, U32* outsize); + +DXDEC S32 AILCALL AIL_decompress_ADPCM(AILSOUNDINFO const * info, + void** outdata, U32* outsize); + +DXDEC S32 AILCALL AIL_compress_DLS(void const* dls, + char const* compression_extension, + void** mls, U32* mlssize, + AILLENGTHYCB callback); + +DXDEC S32 AILCALL AIL_merge_DLS_with_XMI(void const* xmi, void const* dls, + void** mss, U32* msssize); + +DXDEC S32 AILCALL AIL_extract_DLS( void const *source_image, //) + U32 source_size, + void * *XMI_output_data, + U32 *XMI_output_size, + void * *DLS_output_data, + U32 *DLS_output_size, + AILLENGTHYCB callback); + +#define AILFILTERDLS_USINGLIST 1 + +DXDEC S32 AILCALL AIL_filter_DLS_with_XMI(void const* xmi, void const* dls, + void** dlsout, U32* dlssize, + S32 flags, AILLENGTHYCB callback); + +#define AILMIDITOXMI_USINGLIST 1 +#define AILMIDITOXMI_TOLERANT 2 + +DXDEC S32 AILCALL AIL_MIDI_to_XMI (void const* MIDI, + U32 MIDI_size, + void* *XMIDI, + U32 * XMIDI_size, + S32 flags); + +#define AILDLSLIST_ARTICULATION 1 +#define AILDLSLIST_DUMP_WAVS 2 + +#if defined(IS_WIN32) || defined(IS_MAC) || defined(IS_LINUX) + +DXDEC S32 AILCALL AIL_list_DLS (void const* DLS, + char** lst, + U32 * lst_size, + S32 flags, + C8 * title); + +#define AILMIDILIST_ROLANDSYSEX 1 +#define AILMIDILIST_ROLANDUN 2 +#define AILMIDILIST_ROLANDAB 4 + +DXDEC S32 AILCALL AIL_list_MIDI (void const* MIDI, + U32 MIDI_size, + char** lst, + U32 * lst_size, + S32 flags); +#endif + +#define AILFILETYPE_UNKNOWN 0 +#define AILFILETYPE_PCM_WAV 1 +#define AILFILETYPE_ADPCM_WAV 2 +#define AILFILETYPE_OTHER_WAV 3 +#define AILFILETYPE_VOC 4 +#define AILFILETYPE_MIDI 5 +#define AILFILETYPE_XMIDI 6 +#define AILFILETYPE_XMIDI_DLS 7 +#define AILFILETYPE_XMIDI_MLS 8 +#define AILFILETYPE_DLS 9 +#define AILFILETYPE_MLS 10 +#define AILFILETYPE_MPEG_L1_AUDIO 11 +#define AILFILETYPE_MPEG_L2_AUDIO 12 +#define AILFILETYPE_MPEG_L3_AUDIO 13 +#define AILFILETYPE_OTHER_ASI_WAV 14 +#define AILFILETYPE_XBOX_ADPCM_WAV 15 +#define AILFILETYPE_OGG_VORBIS 16 +#define AILFILETYPE_V12_VOICE 17 +#define AILFILETYPE_V24_VOICE 18 +#define AILFILETYPE_V29_VOICE 19 +#define AILFILETYPE_OGG_SPEEX 20 +#define AILFILETYPE_S8_VOICE 21 +#define AILFILETYPE_S16_VOICE 22 +#define AILFILETYPE_S32_VOICE 23 +#define AILFILETYPE_BINKA 24 + +DXDEC S32 AILCALL AIL_file_type(void const* data, U32 size); + +DXDEC S32 AILCALL AIL_file_type_named(void const* data, char const* filename, U32 size); + +DXDEC S32 AILCALL AIL_find_DLS (void const* data, U32 size, + void** xmi, U32* xmisize, + void** dls, U32* dlssize); +typedef struct +{ + // + // File-level data accessible to app + // + // This is valid after AIL_inspect_MP3() is called (even if the file contains no valid frames) + // + + U8 *MP3_file_image; // Original MP3_file_image pointer passed to AIL_inspect_MP3() + S32 MP3_image_size; // Original MP3_image_size passed to AIL_inspect_MP3() + + U8 *ID3v2; // ID3v2 tag, if not NULL + S32 ID3v2_size; // Size of tag in bytes + + U8 *ID3v1; // ID3v1 tag, if not NULL (always 128 bytes long if present) + + U8 *start_MP3_data; // Pointer to start of data area in file (not necessarily first valid frame) + U8 *end_MP3_data; // Pointer to last valid byte in MP3 data area (before ID3v1 tag, if any) + + // + // Information about current frame being inspected, valid if AIL_enumerate_MP3_frames() returns + // TRUE + // + + S32 sample_rate; // Sample rate in Hz (normally constant across all frames in file) + S32 bit_rate; // Bits/second for current frame + S32 channels_per_sample; // 1 or 2 + S32 samples_per_frame; // Always 576 or 1152 samples in each MP3 frame, depending on rate + + S32 byte_offset; // Offset of frame from start_MP3_data (i.e., suitable for use as loop point) + S32 next_frame_expected; // Anticipated offset of next frame to be enumerated, if any + S32 average_frame_size; // Average source bytes per frame, determined solely by bit rate and sample rate + S32 data_size; // # of data-only bytes in this particular frame + S32 header_size; // 4 or 6 bytes, depending on CRC + S32 side_info_size; // Valid for layer 3 side info only + S32 ngr; // Always 2 for MPEG1, else 1 + S32 main_data_begin; // Always 0 in files with no bit reservoir + S32 hpos; // Current bit position in header/side buffer + + S32 MPEG1; // Data copied directly from frame header, see ISO docs for info... + S32 MPEG25; + S32 layer; + S32 protection_bit; + S32 bitrate_index; + S32 sampling_frequency; + S32 padding_bit; + S32 private_bit; + S32 mode; + S32 mode_extension; + S32 copyright; + S32 original; + S32 emphasis; + + // + // LAME/Xing info tag data + // + + S32 Xing_valid; + S32 Info_valid; + U32 header_flags; + S32 frame_count; + S32 byte_count; + S32 VBR_scale; + U8 TOC[100]; + S32 enc_delay; + S32 enc_padding; + + // + // Private (undocumented) data used during frame enumeration + // + + U8 *ptr; + S32 bytes_left; + + S32 check_valid; + S32 check_MPEG1; + S32 check_MPEG25; + S32 check_layer; + S32 check_protection_bit; + S32 check_sampling_frequency; + S32 check_mode; + S32 check_copyright; + S32 check_original; +} +MP3_INFO; + +DXDEC void AILCALL AIL_inspect_MP3 (MP3_INFO *inspection_state, + U8 *MP3_file_image, + S32 MP3_image_size); + +DXDEC S32 AILCALL AIL_enumerate_MP3_frames (MP3_INFO *inspection_state); + +typedef struct +{ + // + // File-level data accessible to app + // + // This is valid after AIL_inspect_Ogg() is called (even if the file contains no valid pages) + // + + U8 *Ogg_file_image; // Originally passed to AIL_inspect_Ogg() + S32 Ogg_image_size; // Originally passed to AIL_inspect_Ogg() + + U8 *start_Ogg_data; // Pointer to start of data area in file + U8 *end_Ogg_data; // Pointer to last valid byte in data area + + // Information lifted from the header after AIL_inspect_Ogg() is called. + S32 channel_count; + S32 sample_rate; + + // + // Information about current page being inspected, valid if AIL_enumerate_Ogg_pages() returns + // TRUE + // + + S32 page_num; // 32-bit page sequence number from OggS header at byte offset 16 + + S32 sample_count; // Total # of samples already generated by encoder at the time the current page was written + + S32 byte_offset; // Offset of page from start_Ogg_data (i.e., suitable for use as loop point) + S32 next_page_expected; // Anticipated offset of next page to be enumerated, if any + + // + // Private (undocumented) data used during page enumeration + // + + U8 *ptr; + S32 bytes_left; +} +OGG_INFO; + +DXDEC void AILCALL AIL_inspect_Ogg (OGG_INFO *inspection_state, + U8 *Ogg_file_image, + S32 Ogg_file_size); + +DXDEC S32 AILCALL AIL_enumerate_Ogg_pages (OGG_INFO *inspection_state); + +typedef struct +{ + const char* file_image; + S32 image_size; + + S32 channel_count; + S32 sample_rate; + + S32 total_samples; + S32 samples_per_frame; + + const char* current_frame; + + // output data - byte offset for current frame. + S32 byte_offset; +} BINKA_INFO; + +DXDEC U32 AILCALL AIL_inspect_BinkA(BINKA_INFO* state, char const* file_image, S32 file_size); +DXDEC S32 AILCALL AIL_enumerate_BinkA_frames(BINKA_INFO* state); + +// +// RAD room types - currently the same as EAX +// + +enum +{ + ENVIRONMENT_GENERIC, // factory default + ENVIRONMENT_PADDEDCELL, + ENVIRONMENT_ROOM, // standard environments + ENVIRONMENT_BATHROOM, + ENVIRONMENT_LIVINGROOM, + ENVIRONMENT_STONEROOM, + ENVIRONMENT_AUDITORIUM, + ENVIRONMENT_CONCERTHALL, + ENVIRONMENT_CAVE, + ENVIRONMENT_ARENA, + ENVIRONMENT_HANGAR, + ENVIRONMENT_CARPETEDHALLWAY, + ENVIRONMENT_HALLWAY, + ENVIRONMENT_STONECORRIDOR, + ENVIRONMENT_ALLEY, + ENVIRONMENT_FOREST, + ENVIRONMENT_CITY, + ENVIRONMENT_MOUNTAINS, + ENVIRONMENT_QUARRY, + ENVIRONMENT_PLAIN, + ENVIRONMENT_PARKINGLOT, + ENVIRONMENT_SEWERPIPE, + ENVIRONMENT_UNDERWATER, + ENVIRONMENT_DRUGGED, + ENVIRONMENT_DIZZY, + ENVIRONMENT_PSYCHOTIC, + + ENVIRONMENT_COUNT // total number of environments +}; + +// +// enumerated values for EAX +// + +#ifndef EAX_H_INCLUDED + +enum +{ + EAX_ENVIRONMENT_GENERIC, // factory default + EAX_ENVIRONMENT_PADDEDCELL, + EAX_ENVIRONMENT_ROOM, // standard environments + EAX_ENVIRONMENT_BATHROOM, + EAX_ENVIRONMENT_LIVINGROOM, + EAX_ENVIRONMENT_STONEROOM, + EAX_ENVIRONMENT_AUDITORIUM, + EAX_ENVIRONMENT_CONCERTHALL, + EAX_ENVIRONMENT_CAVE, + EAX_ENVIRONMENT_ARENA, + EAX_ENVIRONMENT_HANGAR, + EAX_ENVIRONMENT_CARPETEDHALLWAY, + EAX_ENVIRONMENT_HALLWAY, + EAX_ENVIRONMENT_STONECORRIDOR, + EAX_ENVIRONMENT_ALLEY, + EAX_ENVIRONMENT_FOREST, + EAX_ENVIRONMENT_CITY, + EAX_ENVIRONMENT_MOUNTAINS, + EAX_ENVIRONMENT_QUARRY, + EAX_ENVIRONMENT_PLAIN, + EAX_ENVIRONMENT_PARKINGLOT, + EAX_ENVIRONMENT_SEWERPIPE, + EAX_ENVIRONMENT_UNDERWATER, + EAX_ENVIRONMENT_DRUGGED, + EAX_ENVIRONMENT_DIZZY, + EAX_ENVIRONMENT_PSYCHOTIC, + + EAX_ENVIRONMENT_COUNT // total number of environments +}; + +#define EAX_REVERBMIX_USEDISTANCE (-1.0F) + +#endif + +#define MSS_BUFFER_HEAD (-1) + +// +// Auxiliary 2D interface calls +// + +DXDEC HDIGDRIVER AILCALL AIL_primary_digital_driver (HDIGDRIVER new_primary); + +// +// 3D-related calls +// + +DXDEC S32 AILCALL AIL_room_type (HDIGDRIVER dig, + S32 bus_index); + +DXDEC void AILCALL AIL_set_room_type (HDIGDRIVER dig, + S32 bus_index, + S32 room_type); + +DXDEC F32 AILCALL AIL_3D_rolloff_factor (HDIGDRIVER dig); + +DXDEC void AILCALL AIL_set_3D_rolloff_factor (HDIGDRIVER dig, + F32 factor); + +DXDEC F32 AILCALL AIL_3D_doppler_factor (HDIGDRIVER dig); + +DXDEC void AILCALL AIL_set_3D_doppler_factor (HDIGDRIVER dig, + F32 factor); + +DXDEC F32 AILCALL AIL_3D_distance_factor (HDIGDRIVER dig); + +DXDEC void AILCALL AIL_set_3D_distance_factor (HDIGDRIVER dig, + F32 factor); + +DXDEC void AILCALL AIL_set_sample_obstruction (HSAMPLE S, + F32 obstruction); + +DXDEC void AILCALL AIL_set_sample_occlusion (HSAMPLE S, + F32 occlusion); + +DXDEC void AILCALL AIL_set_sample_exclusion (HSAMPLE S, + F32 exclusion); + +DXDEC F32 AILCALL AIL_sample_obstruction (HSAMPLE S); + +DXDEC F32 AILCALL AIL_sample_occlusion (HSAMPLE S); + +DXDEC F32 AILCALL AIL_sample_exclusion (HSAMPLE S); + +EXPGROUP(3D Digital Audio Services) + +DXDEC EXPAPI void AILCALL AIL_set_sample_3D_volume_falloff(HSAMPLE S, MSSGRAPHPOINT* graph, S32 pointcount); +/* + Sets a sample's volume falloff graph. + + $:S Sample to affect + $:graph The array of points to use as the graph. + $:pointcount The number of points passed in. Must be less than or equal to MILES_MAX_FALLOFF_GRAPH_POINTS. Passing 0 removes the graph. + + This marks a sample as having a volume falloff graph. If a sample has a volume graph, it no + longer attenuates as per the default falloff function, and as such, its "minimum distance" no + longer has any effect. However, the "max distance" still clamps the sample to full attenuation. + + A graph with only one point is treated as a line, returning graph[0].Y always. + + Otherwise, the graph is evaluated as follows: + + + + The distance to the listener is evaluated. + + The two points with X values bounding "distance" are located. + + If the distance is past the last graph point, graph[pointcount-1].Y is returned. + + If either the output tangent type of the previous point, or the input tangent type of the next point are + MILES_TANGENT_STEP, previous->Y is returned. + + Otherwise, the segment is evaluated as a hermite curve. ITX and ITY are ignore if ITYpe is MILES_TANGENT_LINEAR, + and likewise OTX and OTY are ignored if OType is MILES_TANGENT_LINEAR. +*/ + +DXDEC EXPAPI void AILCALL AIL_set_sample_3D_lowpass_falloff(HSAMPLE S, MSSGRAPHPOINT* graph, S32 pointcount); +/* + Sets a sample's low pass cutoff falloff graph. + + $:S Sample to affect + $:graph The array of points to use as the graph. + $:pointcount The number of points passed in. Must be less than or equal to MILES_MAX_FALLOFF_GRAPH_POINTS. Passing 0 removes the graph. + + This marks a sample as having a low pass cutoff that varies as a function of distance to the listener. If + a sample has such a graph, $AIL_set_sample_low_pass_cut_off will be called constantly, and thus shouldn't be + called otherwise. + + The graph is evaluated the same as $AIL_set_sample_3D_volume_falloff. +*/ + +DXDEC EXPAPI void AILCALL AIL_set_sample_3D_exclusion_falloff(HSAMPLE S, MSSGRAPHPOINT* graph, S32 pointcount); +/* + Sets a sample's exclusion falloff graph. + + $:S Sample to affect + $:graph The array of points to use as the graph. + $:pointcount The number of points passed in. Must be less than or equal to MILES_MAX_FALLOFF_GRAPH_POINTS. Passing 0 removes the graph. + + This marks a sample as having an exclusion that varies as a function of distance to the listener. If + a sample has such a graph, auto_3D_wet_atten will be disabled to prevent double affects, as exclusion + affects reverb wet level. + + The graph is evaluated the same as $AIL_set_sample_3D_volume_falloff. +*/ + +DXDEC EXPAPI void AILCALL AIL_set_sample_3D_spread_falloff(HSAMPLE S, MSSGRAPHPOINT* graph, S32 pointcount); +/* + Sets a sample's spread falloff graph. + + $:S Sample to affect + $:graph The array of points to use as the graph. + $:pointcount The number of points passed in. Must be less than or equal to MILES_MAX_FALLOFF_GRAPH_POINTS. Passing 0 removes the graph. + + This marks a sample as having a spread that varies as a function of distance to the listener. See + $AIL_set_sample_3D_spread. + + The graph is evaluated the same as $AIL_set_sample_3D_volume_falloff. +*/ + +DXDEC EXPAPI void AILCALL AIL_set_sample_3D_position_segments(HSAMPLE S, MSSVECTOR3D* points, S32 point_count); +/* + Sets a sample's position as a series of line segments. + + $:S Sample to affect + $:points The 3D points representing the line segments. 0 reverts to classic point based positioning. All + segments are connected - N points represents N - 1 chained line segments. + $:point_count Size of points array. Minimum 2 (unless removing), max MILES_MAX_SEGMENT_COUNT + + This marks a sample as having a position that is not a single point. When 3D attenuation is computed, + the closest point to the listener is found by walking each segment. That position is then used in all + other computations (cones, falloffs, etc). Spatialization is done using all segments as a directional + source. + + If there is neither spread falloff nor volume falloff specified, spread will be automatically applied + when the listener is within min_distance to the closest point. See $AIL_set_sample_3D_spread_falloff + and $AIL_set_sample_3D_volume_falloff. + +*/ + +DXDEC EXPAPI void AILCALL AIL_set_sample_3D_spread(HSAMPLE S, F32 spread); +/* + Sets a sample's "spread" value. + + $:S Sample to affect. + $:spread The value to set the spread to. + + Spread is how much the directionality of a sample "spreads" to more speakers - emulating + the effect a sound has when it occupies more than a point source. For instance, a sound + point source that sits directly to the left of the listener would have a very strong left + speaker signal, and a fairly weak right speaker signal. Via spread, the signal would be + more even, causing the source to feel as though it is coming from an area, rather than + a point source. + + A spread of 1 will effectively negate any spatialization effects other than distance attenuation. +*/ + +DXDEC void AILCALL AIL_set_sample_3D_distances (HSAMPLE S, + F32 max_dist, + F32 min_dist, + S32 auto_3D_wet_atten); + + +DXDEC void AILCALL AIL_sample_3D_distances (HSAMPLE S, + F32 * max_dist, + F32 * min_dist, + S32 * auto_3D_wet_atten); + +DXDEC void AILCALL AIL_set_sample_3D_cone (HSAMPLE S, + F32 inner_angle, + F32 outer_angle, + F32 outer_volume_level); + +DXDEC void AILCALL AIL_sample_3D_cone (HSAMPLE S, + F32* inner_angle, + F32* outer_angle, + F32* outer_volume_level); + +DXDEC void AILCALL AIL_set_sample_3D_position (HSAMPLE obj, + F32 X, + F32 Y, + F32 Z); + +DXDEC void AILCALL AIL_set_sample_3D_velocity (HSAMPLE obj, + F32 dX_per_ms, + F32 dY_per_ms, + F32 dZ_per_ms, + F32 magnitude); + +DXDEC void AILCALL AIL_set_sample_3D_velocity_vector (HSAMPLE obj, + F32 dX_per_ms, + F32 dY_per_ms, + F32 dZ_per_ms); + +DXDEC void AILCALL AIL_set_sample_3D_orientation (HSAMPLE obj, + F32 X_face, + F32 Y_face, + F32 Z_face, + F32 X_up, + F32 Y_up, + F32 Z_up); + +DXDEC S32 AILCALL AIL_sample_3D_position (HSAMPLE obj, + F32 *X, + F32 *Y, + F32 *Z); + +DXDEC void AILCALL AIL_sample_3D_velocity (HSAMPLE obj, + F32 *dX_per_ms, + F32 *dY_per_ms, + F32 *dZ_per_ms); + +DXDEC void AILCALL AIL_sample_3D_orientation (HSAMPLE obj, + F32 *X_face, + F32 *Y_face, + F32 *Z_face, + F32 *X_up, + F32 *Y_up, + F32 *Z_up); + +DXDEC void AILCALL AIL_update_sample_3D_position (HSAMPLE obj, + F32 dt_milliseconds); + +DXDEC void AILCALL AIL_set_listener_3D_position (HDIGDRIVER dig, + F32 X, + F32 Y, + F32 Z); + +DXDEC void AILCALL AIL_set_listener_3D_velocity (HDIGDRIVER dig, + F32 dX_per_ms, + F32 dY_per_ms, + F32 dZ_per_ms, + F32 magnitude); + +DXDEC void AILCALL AIL_set_listener_3D_velocity_vector (HDIGDRIVER dig, + F32 dX_per_ms, + F32 dY_per_ms, + F32 dZ_per_ms); + +DXDEC void AILCALL AIL_set_listener_3D_orientation (HDIGDRIVER dig, + F32 X_face, + F32 Y_face, + F32 Z_face, + F32 X_up, + F32 Y_up, + F32 Z_up); + +DXDEC void AILCALL AIL_listener_3D_position (HDIGDRIVER dig, + F32 *X, + F32 *Y, + F32 *Z); + +DXDEC void AILCALL AIL_listener_3D_velocity (HDIGDRIVER dig, + F32 *dX_per_ms, + F32 *dY_per_ms, + F32 *dZ_per_ms); + +DXDEC void AILCALL AIL_listener_3D_orientation (HDIGDRIVER dig, + F32 *X_face, + F32 *Y_face, + F32 *Z_face, + F32 *X_up, + F32 *Y_up, + F32 *Z_up); + +DXDEC void AILCALL AIL_update_listener_3D_position (HDIGDRIVER dig, + F32 dt_milliseconds); + +#if defined( HOST_SPU_PROCESS ) + +DXDEC S32 AILCALL MilesStartAsyncThread( S32 thread_num, void const * param ); + +DXDEC S32 AILCALL MilesRequestStopAsyncThread( S32 thread_num ); + +DXDEC S32 AILCALL MilesWaitStopAsyncThread( S32 thread_num ); + +#endif + + +//----------------------------------------------------------------------------- +// +// MSS 8 Bank API +// +//----------------------------------------------------------------------------- + +EXPGROUP(Miles High Level Event System) + +// misc character maxes. +#define MSS_MAX_ASSET_NAME_BYTES 512 +#define MSS_MAX_PATH_BYTES 512 + +#ifdef DOCS_ONLY + +EXPTYPE typedef struct MSSSOUNDBANK {}; +/* + Internal structure. + + Use $HMSOUNDBANK instead. +*/ + +#endif + +EXPTYPE typedef struct SoundBank *HMSOUNDBANK; +/* + Describes a handle to an open sound bank. + + This handle typedef refers to an open soundbank which is usually obtained from the $AIL_add_soundbank function. +*/ + +EXPGROUP(highlevel_util) + +DXDEC EXPAPI HMSOUNDBANK AILCALL AIL_open_soundbank(char const *filename, char const* name); +/* + Open a sound bank. If you are using the event execution engine, use the add soundbank function + provided there. + + $:return 0 on fail, or a valid HMSOUNDBANK. + $:filename The filename of the soundbank to open. + + Opens a sound bank for use with the MSS8 high level functions. The sound bank must be + closed with $AIL_close_soundbank. Use $AIL_add_soundbank if the Miles Event system is used. +*/ + +DXDEC EXPAPI void AILCALL AIL_close_soundbank(HMSOUNDBANK bank); +/* + Close a soundbank previously opened with $AIL_open_soundbank. + + $:bank Soundbank to close. + + Close a soundbank previously opened with $AIL_open_soundbank. Presets/events loaded from + this soundbank are no longer valid. +*/ + +DXDEC EXPAPI char const * AILCALL AIL_get_soundbank_filename(HMSOUNDBANK bank); +/* + Return the filename used to open the given soundbank. + + $:bank Soundbank to query. + + $:return A pointer to the filename for the given soundbank, or 0 if bank is invalid. + + Returns a pointer to the filename for a soundbank. This pointer should not be deleted. +*/ + +DXDEC EXPAPI char const * AILCALL AIL_get_soundbank_name(HMSOUNDBANK bank); +/* + Return the name of the given soundbank. + + $:bank Soundbank to query. + + $:return A pointer to the name of the sound bank, or 0 if the bank is invalid. + + The name of the bank is the name used in asset names. This is distinct from the + file name of the bank. + + The return value should not be deleted. +*/ + +DXDEC EXPAPI S32 AILCALL AIL_get_soundbank_mem_usage(HMSOUNDBANK bank); +/* + Returns the amount of data used by the soundbank management structures. + + $:bank Soundbank to query. + $:return Total memory allocated. + + Returns the memory used via AIL_mem_alloc_lock during the creation of this structure. +*/ + +DXDEC EXPAPI S32 AILCALL AIL_enumerate_sound_presets(HMSOUNDBANK bank, HMSSENUM* next, char const* list, char const** name); +/* + Enumerate the sound presets stored in a soundbank. + + $:bank Containing soundbank. + $:next Enumeration token. Prior to first call, initialize to MSS_FIRST + $:list Optional filter. If specified, presets will only enumerate from the given preset sound preset list. + $:name The pointer to the currently enumerated preset name. This should not be deleted. + + $:return Returns 0 when enumeration is complete. + + Enumerates the sound presets available inside of a bank file. Example usage: + + ${ + HMSSENUM Token = MSS_FIRST; + const char* PresetName = 0; + while (AIL_enumerate_sound_presets(MyBank, &Token, 0, &PresetName)) + { + printf("Found a preset named %s!", PresetName); + + $AIL_apply_sound_preset(MySample, MyBank, PresetName); + } + $} + + Note that name should NOT be deleted by the caller - this points at memory owned by + Miles. +*/ + +DXDEC EXPAPI S32 AILCALL AIL_enumerate_environment_presets(HMSOUNDBANK bank, HMSSENUM* next, char const* list, char const** name); +/* + Enumerate the environment presets stored in a soundbank. + + $:bank Containing soundbank. + $:next Enumeration token. Prior to first call, initialize to MSS_FIRST + $:list Optional filter. If specified, presets will only enumerate from the given environment preset list. + $:name The pointer to the currently enumerated preset name. This should not be deleted. + $:return Returns 0 when enumeration is complete. + + Enumerates the environment presets available inside of a bank file. Example usage: + + ${ + HMSSENUM Token = MSS_FIRST; + const char* PresetName = 0; + while (AIL_enumerate_environment_presets(MyBank, &Token, 0, &PresetName)) + { + printf("Found a preset named %s!", PresetName); + + AIL_apply_environment_preset(MyDriver, MyBank, PresetName); + } + $} + + Note that name should NOT be deleted by the caller - this points at memory owned by + Miles. +*/ + + +DXDEC EXPAPI S32 AILCALL AIL_enumerate_sound_assets(HMSOUNDBANK bank, HMSSENUM* next, char const** name); +/* + Enumerate sounds stored in a soundbank. + + $:bank Containing soundbank. + $:next Enumeration token. Prior to first call, initialize to MSS_FIRST + $:name The pointer to the currently enumerated sound name. This should not be deleted. + $:return Returns 0 when enumeration is complete. + + Enumerates the sounds available inside of a bank file. Example usage: + + ${ + HMSSENUM Token = MSS_FIRST; + const char* SoundName = 0; + while (AIL_enumerate_sound_assets(MyBank, &Token, &SoundName)) + { + char filename[MSS_MAX_PATH_BYTES]; + AIL_sound_asset_filename(MyBank, SoundName, filename); + + printf("Found a sound named %s!", SoundName); + + S32* pData = (S32*)AIL_file_read(filename, FILE_READ_WITH_SIZE); + AIL_mem_free_lock(pData); + } + $} + + Note that name should NOT be deleted by the caller - this points at memory owned by + Miles. +*/ + +DXDEC EXPAPI S32 AILCALL AIL_enumerate_events(HMSOUNDBANK bank, HMSSENUM* next, char const * list, char const ** name); +/* + Enumerate the events stored in a soundbank. + + $:bank Soundbank to enumerate within. + $:next Enumeration token. Prior to first call, initialize to MSS_FIRST + $:list Optional filter. If specified, event will only enumerate from the given event list. + $:name The pointer to the currently enumerated preset name. This should not be deleted. + $:return Returns 0 when enumeration is complete. + + Enumerates the events available inside of a bank file. Example usage: + + ${ + HMSSENUM Token = MSS_FIRST; + const char* EventName = 0; + while (AIL_enumerate_events(MyBank, &Token, 0, &EventName)) + { + printf("Found an event named %s!", EventName); + + const U8* EventContents = 0; + AIL_get_event_contents(MyBank, EventName, &EventContents); + + AIL_enqueue_event(EventContents, 0, 0, 0, 0); + } + $} + + Note that name should NOT be deleted by the caller - this points at memory owned by + Miles. +*/ + +DXDEC EXPAPI void* AILCALL AIL_find_environment_preset(HMSOUNDBANK bank, char const *name); +/* + Returns the raw environment data associated with the given name. + + $:bank The bank to look within + $:name The name of the asset to search for, including bank name. + + $:return Raw environment data. This should not be deleted. + + This function is designed to be used with $AIL_apply_raw_environment_preset. +*/ + +DXDEC EXPAPI void* AILCALL AIL_find_sound_preset(HMSOUNDBANK bank, char const* name); +/* + Returns the raw preset data associated with the given name. + + $:bank The bank to look within + $:name The name of the asset to search for, including bank name. + + $:return Raw preset data. This should not be deleted. + + This function is designed to be used with $AIL_apply_raw_sound_preset. +*/ + +DXDEC EXPAPI S32 AILCALL AIL_apply_raw_sound_preset(HSAMPLE sample, void* preset); +/* + Applies the sound preset to the given sample. + + $:sample The sample to modify. + $:preset The raw preset data to apply, returned from $AIL_find_sound_preset + + Updates sample properties based on the desired settings specified in the given preset. +*/ + +DXDEC EXPAPI S32 AILCALL AIL_apply_sound_preset(HSAMPLE sample, HMSOUNDBANK bank, char const *name); +/* + Apply the sound preset to the given sample. + + $:sample The sample that will have its properties updated by the preset. + $:bank The sound bank containing the named preset. + $:name The name of the preset to apply. + $:return Returns 0 on fail - check for sample/bank validity, and that the preset is in the correct bank. + + This will alter the properties on a given sample, based on the given preset. +*/ + +DXDEC EXPAPI S32 AILCALL AIL_unapply_raw_sound_preset(HSAMPLE sample, void* preset); +/* + Returns the properties altered by the preset to their default state. + + $:sample The sample to update. + $:preset The raw preset data to unapply, returned from $AIL_find_sound_preset +*/ + +DXDEC EXPAPI S32 AILCALL AIL_unapply_sound_preset(HSAMPLE sample, HMSOUNDBANK bank, char const *name); +/* + Restore the properties affected by the given preset to defaults. + + $:sample The sample that will have its properties updated by the preset. + $:bank The sound bank containing the named preset. + $:name The name of the preset to apply. + $:return Returns 0 on fail - check for sample/bank validity, and that the preset is in the correct bank. + + Presets may or may not affect any given property. Only the properties affected by the specified + preset will have their values restored to default. +*/ + +typedef S32 (*MilesResolveFunc)(void* context, char const* exp, S32 explen, EXPOUT void* output, S32 isfloat); +/* + Callback type for resolving variable expressions to values. + + $:context Value passed to AIL_resolve_raw_*_preset(). + $:exp The string expression to resolve. + $:explen Length of exp. + $:output Pointer to the memory to receive the result value. + $:isfloat nonzero if the output needs to be a float. + + The function callback should convert variable expressions in to an output value of the + requested type. +*/ + +DXDEC EXPAPI S32 AILCALL AIL_resolve_raw_sound_preset(void* preset, void* context, MilesResolveFunc eval); +/* + Compute the value of properties for the current value of variables using the given lookup function. + + $:preset The raw preset as returns from $AIL_find_sound_preset. + $:context The context to pass in to the resolution function. + $:eval A function pointer to use for resolving expressions to values. + $:return 0 if the preset is invalid. + + This function converts variable expressions that were stored in the preset in to values + that can be used by the event system. The values are stored in the preset itself, all that + has to happen is this is called with a valid resolve function prior to calling + $AIL_apply_raw_sound_preset. +*/ + +DXDEC EXPAPI S32 AILCALL AIL_resolve_raw_environment_preset(void* env, MilesResolveFunc eval); +/* + Compute the value of properties for the current value of variables using the given lookup function. + + $:env The raw preset as returns from $AIL_find_environment_preset. + $:context The context to pass in to the resolution function. + $:eval A function pointer to use for resolving expressions to values. + $:return 0 if the preset is invalid. + + This function converts variable expressions that were stored in the environment in to values + that can be used by the event system. The values are stored in the environment itself, all that + has to happen is this is called with a valid resolve function prior to calling + $AIL_apply_raw_environment_preset. +*/ + + +DXDEC EXPAPI S32 AILCALL AIL_apply_raw_environment_preset(HDIGDRIVER dig, void* environment); +/* + Applies the environment to the given driver. + + $:dig The driver to modify. + $:environment The raw environment data to apply, returned from $AIL_find_environment_preset + + Updates driver properties based on the desired settings specified in the given environment. +*/ + +DXDEC EXPAPI S32 AILCALL AIL_apply_environment_preset(HDIGDRIVER dig, HMSOUNDBANK bank, char const *name); +/* + Apply the environment preset to the given driver. + + $:dig The driver that will have its properties updated by the preset. + $:bank The sound bank containing the named preset. + $:name The name of the preset to apply. + $:return Returns 0 on fail - check for sample/bank validity, and that the preset is in the correct bank. + + This will alter properties on a given driver, based on the given preset. +*/ + +DXDEC EXPAPI S32 AILCALL AIL_unapply_raw_environment_preset(HDIGDRIVER dig, void* environment); +/* + Returns the properties the environment affects to default state. + + $:dig The driver to modify. + $:environment The raw environment data to unapply, returned from $AIL_find_environment_preset +*/ + +DXDEC EXPAPI S32 AILCALL AIL_unapply_environment_preset(HDIGDRIVER dig, HMSOUNDBANK bank, char const *name); +/* + Restore the properties affected by the given preset to defaults. + + $:dig The driver that will have its properties updated by the preset. + $:bank The sound bank containing the named preset. + $:name The name of the preset to apply. + $:return Returns 0 on fail - check for sample/bank validity, and that the preset is in the correct bank. + + Presets may or may not affect any given property. Only the properties affected by the specified + preset will have its value restored to default. +*/ + +EXPTYPE typedef struct _MILESBANKSOUNDINFO +{ + // If this changes at all, compiled banks must be versioned... + S32 ChannelCount; + U32 ChannelMask; + S32 Rate; + S32 DataLen; + S32 SoundLimit; + S32 IsExternal; + U32 DurationMs; + S32 StreamBufferSize; + S32 IsAdpcm; + S32 AdpcmBlockSize; + F32 MixVolumeDAC; +} MILESBANKSOUNDINFO; +/* + Structure containing all metadata associated with a sound asset. + + $:ChannelCount The number of channels the sound assets contains. + $:ChannelMask The channel mask for the sound asset. + $:Rate The sample rate for the sound asset. + $:DataLen The byte count the asset requires if fully loaded. + $:SoundLimit The maximum number of instances of this sound that is allowed to play at once. + $:IsExternal Nonzero if the sound is stored external to the sound bank. See the eventexternal sample. + $:DurationMs The length of the sound asset, in milliseconds. + $:StreamBufferSize If the sound is played as a stream, this is the buffer to use for this sound. + $:IsAdpcm Nonzero if the asset is an adpcm sound, and needs to be initialized as such. + $:AdpcmBlockSize The adpcm block size if the asset is adpcm encoded. + $:MixVolumeDAC The attenuation to apply to all instances of this sound, as a DAC scalar. + + See $AIL_sound_asset_info. +*/ + + +DXDEC EXPAPI S32 AILCALL AIL_sound_asset_info(HMSOUNDBANK bank, char const* name, char* out_name, MILESBANKSOUNDINFO* out_info); +/* + Return the meta data associated with a sound assets in a sound bank. + + $:bank The soundbank containing the sound asset. + $:name The name of the sound asset to find. + $:out_name Optional - Pointer to a buffer that is filled with the sound filename to use for loading. + $:out_info Pointer to a $MILESBANKSOUNDINFO structure that is filled with meta data about the sound asset. + $:return Returns the byte size of the buffer required for out_name. + + This function must be called in order to resolve the sound asset name to + something that can be used by miles. To ensure safe buffer containment, call + once with out_name as null to get the size needed. + + For external deployment see the eventexternal example program. +*/ + +DXDEC EXPAPI SINTa AILCALL AIL_get_marker_list(HMSOUNDBANK bank, char const* sound_name); +/* + Return an opaque value representing the list of markers attached to a given sound name. + + $:bank The bank containing the sound asset. + $:sound_name The name of the sound asset. + + $:return on fail/nonexistent list, or a nonzero opaque value to be passed to $AIL_find_marker_in_list. + + Returns the marker list for a given sound asset. This value should just be passed directly to $AIL_find_marker_in_list + to retrieve the offset for a marker by name. +*/ + +DXDEC EXPAPI S32 AILCALL AIL_find_marker_in_list(SINTa marker_list, char const * marker_name, S32* is_samples); +/* + Returns the byte offset into a sample corresponding to the given marker name. + + $:marker_list The marker list returned from $AIL_get_marker_list. + $:marker_name The name of the marker to look up. + $:is_samples returns whether the marker is at a sample location instead of a byte location. + + $:return -1 if the marker was not found, or the byte offset of the marker. + + Looks up an offset to use in functions such as $AIL_set_sample_position. marker_list can be retrieved with + $AIL_get_marker_list. +*/ + +// ---------------------------- +// End MSS8 declarations +// ---------------------------- + +// +// Event routines +// +typedef struct _MEMDUMP* HMEMDUMP; +#define HMSSEVENTCONSTRUCT HMEMDUMP + +/*! + function + { + ExcludeOn = 1 + + Name = "AIL_create_event", "Creates an empty event to be filled with steps." + + ReturnType = "HMSSEVENTCONSTRUCT", "An empty event to be passed to the various step addition functions, or 0 if out of memory." + + Discussion = "Primarily designed for offline use, this function is the first step in + creating an event that can be consumed by the MilesEvent system. Usage is as follows: + + HMSSEVENTCONSTRUCT hEvent = AIL_create_event(); + + // misc add functions + AIL_add_start_sound_event_step(hEvent, ...); + AIL_add_control_sounds_event_step(hEvent, ...); + // etc + + char* pEvent = AIL_close_event(hEvent); + + // Do something with the event + + AIL_mem_free_lock(pEvent); + + Note that if immediately passed to AIL_enqueue_event(), the memory must remain valid until the following + $AIL_complete_event_queue_processing. + + Events are generally tailored to the MilesEvent system, even though there is nothing preventing you + from writing your own event system, or creation ui. + " + } +*/ +DXDEC HMSSEVENTCONSTRUCT AILCALL AIL_create_event(void); + +/*! + function + { + ExcludeOn = 1 + + Name = "AIL_close_event", "Returns a completed event, ready for enqueueing in to the MilesEvent system." + + In = "HMSSEVENTCONSTRUCT", "i_Event", "The event to complete." + + ReturnType = "char*", "An allocated event string that can be passed to AIL_next_event_step or enqueued in the + MilesEvent system via AIL_enqueue_event." + + Discussion = "The returned pointer must be deleted via AIL_mem_free_lock(). Note that if the MilesEvent system + is used, the event pointer must remain valid through the following $AIL_complete_event_queue_processing call." + + } +*/ +DXDEC U8* AILCALL AIL_close_event(HMSSEVENTCONSTRUCT i_Event); + +EXPTYPEBEGIN typedef S32 MILES_START_STEP_EVICTION_TYPE; +#define MILES_START_STEP_PRIORITY 0 +#define MILES_START_STEP_DISTANCE 1 +#define MILES_START_STEP_VOLUME 2 +#define MILES_START_STEP_OLDEST 3 +EXPTYPEEND +/* + Determines the behavior of a sound if it encounters a limit trying to play. + + $:MILES_START_STEP_PRIORITY Evict a sound less than our priority. + $:MILES_START_STEP_DISTANCE Evict the farthest sound from the listener. + $:MILES_START_STEP_VOLUME Evict the quietest sound after mixing, using the loudest channel as the qualifier. + $:MILES_START_STEP_OLDEST Evict the sound that has been playing the longest. + + See also $AIL_add_start_sound_event_step. +*/ + +EXPTYPEBEGIN typedef S32 MILES_START_STEP_SELECTION_TYPE; +#define MILES_START_STEP_RANDOM 0 +#define MILES_START_STEP_NO_REPEATS 1 +#define MILES_START_STEP_IN_ORDER 2 +#define MILES_START_STEP_RANDOM_ALL_BEFORE_REPEAT 3 +#define MILES_START_STEP_BLENDED 4 +#define MILES_START_STEP_SELECT_MASK 0x7 +#define MILES_START_STEP_SELECT_BITS 3 +EXPTYPEEND +/* + Determines the usage of the sound names list in the $AIL_add_start_sound_event_step. + + $:MILES_START_STEP_RANDOM Randomly select from the list, and allow the same + sound to play twice in a row. This is the only selection type that doesn't require + a state variable. + $:MILES_START_STEP_NO_REPEATS Randomly select from the list, but prevent the last sound from being the same. + $:MILES_START_STEP_IN_ORDER Play the list in order, looping. + $:MILES_START_STEP_RANDOM_ALL_BEFORE_REPEAT Randomly select from the list, but don't allow duplicates until all sounds have been played. + $:MILES_START_STEP_BLENDED Play *all* of the sounds, using the state variable as both the variable name to poll, + and the name of the blend function to look up. The blend should have been specified prior to execution of + this step in the runtime, see $AIL_add_setblend_event_step. + $:MILES_START_STEP_SELECT_MASK Expect a value from the game to determine which sound to play, added in to the other selection type. +*/ + +/*! + function + { + ExcludeOn = 1 + + Name = "AIL_add_start_sound_event_step", "Adds a step to a given event to start a sound with the given specifications." + + In = "HMSSEVENTCONSTRUCT", "i_Event", "The event to add the step to." + In = "const char*", "i_SoundNames", "The names and associated weights for the event step to choose from. + If there are multiple names listed, the sound will be chosen at random based on the given weights. This + string is of the form 'BankName1/SoundName1:Weight1:BankName2/SoundName2:Weight2:' etc. The string must always + terminate in a ':'. Weight must be between 0 and 200. To provide a null sound to randomly choose to not play anything, use + an empty string as an entry." + + In = "const char*", "i_PresetName", "[optional] The name of the preset, of the form 'PresetList/PresetName'" + In = "U8", "i_PresetIsDynamic", "Nonzero if the preset should poll the value of variables every frame, instead of only when applied." + In = "const char*", "i_EventName", "[optional] The name of the event to execute upon completion of the sound, of the form 'PresetList/PresetName'" + In = "const char*", "i_StartMarker", "[optional] The name of a marker to use as the loop start point." + In = "const char*", "i_EndMarker", "[optional] The name of a marker to use as the loop end point." + In = "const char*", "i_StateVar", "[optional] The name of a variable to use for storing state associated with this start sound step." + In = "char const*", "i_VarInit", "[optional] A list of variable names, mins, and maxes to use for randomizing the sound instance state." + In = "const char*", "i_Labels", "[optional] A comma delimited list of labels to assign to the sound." + In = "U32", "i_Streaming", "If nonzero, the sound will be set up and started as a stream." + In = "U8", "i_CanLoad", "If nonzero, the sound is allowed to hit the disk instead of only accessing cached sounds. If true, this might cause a hitch." + In = "U16", "i_Delay", "The minimum delay in ms to apply to the sound before start." + In = "U16", "i_DelayMax", "The maximum delay in ms to apply to the sound before start." + In = "U8", "i_Priority", "The priority to assign to the sound. If a sound encounters a limit based on its labels, it will evict any sound + with a priority strictly less than the given priority." + In = "U8", "i_LoopCount", "The loop count as per AIL_set_sample_loop_count." + In = "const char*", "i_StartOffset", "[optional] The name of the marker to use as the sound's initial offset." + In = "F32", "i_VolMin", "The min volume value to randomly select for initial volume for the sound. In LinLoud." + In = "F32", "i_VolMax", "The max volume value to randomly select for initial volume for the sound. In LinLoud." + In = "F32", "i_PitchMin", "The min pitch to randomly select from for initial playback. In sT." + In = "F32", "i_PitchMax", "The max pitch to randomly select from for initial playback. In sT." + In = "F32", "i_FadeInTime", "The time to fade the sound in over. Interpolation is linear in loudness." + In = "U8", "i_EvictionType", "The basis for deciding what sound will get kicked out if a limit is hit when trying to play this sound. See $MILES_START_STEP_EVICTION_TYPE." + In = "U8", "i_SelectType", "The method to use for selecting the sound to play from the sound name list. See $MILES_START_SOUND_SELECTION_TYPE." + + ReturnType = "S32", "Returns 1 on success." + + Discussion = "Adds an event that can start a sound. If the sound names list contains multiple entries, one will be selected + randomly based on the given weights and the selection type. Weights are effectively ratios for likelihood. A sound with 100 weight will be twice as likely + as a sound with 50 weight. Some times you may want to have an event that only *might* play a sound. To do this, add a empty sound name + with an associated weight. + " + } +*/ +DXDEC +S32 +AILCALL +AIL_add_start_sound_event_step( + HMSSEVENTCONSTRUCT i_Event, + const char* i_SoundNames, + const char* i_PresetName, + U8 i_PresetIsDynamic, + const char* i_EventName, + const char* i_StartMarker, const char* i_EndMarker, + char const* i_StateVar, char const* i_VarInit, + const char* i_Labels, U32 i_Streaming, U8 i_CanLoad, + U16 i_Delay, U16 i_DelayMax, U8 i_Priority, U8 i_LoopCount, + const char* i_StartOffset, + F32 i_VolMin, F32 i_VolMax, F32 i_PitchMin, F32 i_PitchMax, + F32 i_FadeInTime, + U8 i_EvictionType, + U8 i_SelectType + ); + +/*! + function + { + ExcludeOn = 1 + + Name = "AIL_add_cache_sounds_event_step", "Adds a step to an event to load a list of sounds in to memory for play." + + In = "HMSSEVENTCONSTRUCT", "i_Event", "The event to add on to." + In = "const char*", "bankName", "The bank filename containing all of the sounds." + In = "const char*", "i_Sounds", "A list of colon separated sounds to load from the bank file." + + ReturnType = "S32", "Returns 1 on success." + + Discussion = "In general events are not allowed to hit the disk in order to prevent unexpected hitching during + gameplay. In order to facilitate that, sounds need to be preloaded by this event. Each cache step can only + load sounds from a single bank file, so for multiple bank files, multiple steps will be needed. + + In order to release the data loaded by this event, AIL_add_uncache_sounds_event_step() needs to + be called with the same parameters. + + If you are using MilesEvent, the data is refcounted so the sound will not be freed until all + samples using it complete." + } +*/ +DXDEC +S32 +AILCALL +AIL_add_cache_sounds_event_step( + HMSSEVENTCONSTRUCT i_Event, const char* bankName, const char* i_Sounds); + + +/*! + function + { + ExcludeOn = 1 + + Name = "AIL_add_uncache_sounds_event_step", "Adds a step to an event to free a list of sounds previously loaded in to memory for play." + + In = "HMSSEVENTCONSTRUCT", "i_Event", "The event to add on to." + In = "const char*", "bankName", "The bank filename containing all of the sounds." + In = "const char*", "i_Sounds", "A list of colon separated sounds from the bank file to uncache." + + ReturnType = "S32", "Returns 1 on success." + + Discussion = "This event released sounds loaded via AIL_add_cache_sounds_event_step()" + } +*/ +DXDEC +S32 +AILCALL +AIL_add_uncache_sounds_event_step( + HMSSEVENTCONSTRUCT i_Event, const char* bankName, const char* i_Sounds); + + +EXPTYPEBEGIN typedef S32 MILES_CONTROL_STEP_TYPE; +#define MILES_CONTROL_STEP_STOP 3 +#define MILES_CONTROL_STEP_STOP_NO_EVENTS 4 +#define MILES_CONTROL_STEP_PASS 0 +#define MILES_CONTROL_STEP_PAUSE 1 +#define MILES_CONTROL_STEP_RESUME 2 +#define MILES_CONTROL_STEP_STOP_FADE 5 + +EXPTYPEEND +/* + Determines how the playhead is adjusted during a $AIL_add_control_sounds_event_step. + + $:MILES_CONTROL_STEP_STOP Stop the affected sounds. + $:MILES_CONTROL_STEP_PASS Do not change the playhead. + $:MILES_CONTROL_STEP_PAUSE Pause the affected sounds. + $:MILES_CONTROL_STEP_RESUME Resume the affected sounds. + $:MILES_CONTROL_STEP_STOP_NO_EVENTS Stop the affected sounds, and prevent their completion events from playing. + $:MILES_CONTROL_STEP_STOP_FADE Stop the sound after fading the sound out linearly in loudness. +*/ + +#define MILES_CONTROL_STEP_IGNORELOOP 255 + +/*! + function + { + ExcludeOn = 1 + + Name = "AIL_add_control_sounds_event_step", "Adds a step to an event to control sample playback by label." + + In = "HMSSEVENTCONSTRUCT", "i_Event", "The event to add on to." + In = "const char*", "i_Labels", "[optional] A comma seperated list of labels to control." + In = "const char*", "i_MarkerStart", "[optional] If exists, sets the loop start to the marker's offset." + In = "const char*", "i_MarkerEnd", "[optional] If exists, sets the loop end to the marker's offset." + In = "const char*", "i_Position", "[optional] If exists, sets the current playback position to the marker's offset." + In = "const char*", "i_PresetName", "[optional] The name of the preset to apply, of the form Bank/PresetList/PresetName." + In = "U8", "i_PresetApplyType", "If nonzero, the preset is applied dynamically(the variables are polled every frame)." + In = "U8", "i_LoopCount", "If the loop count is not to be affected, pass MILES_CONTROL_STEP_IGNORELOOP. Otherwise, the sample's loop count will be set to this value." + In = "U8", "i_Type", "The control type requested. See $MILES_CONTROL_STEP_TYPE." + + ReturnType = "S32", "Returns 1 on success." + + Discussion = "Controls playback of current instances. The sounds are matched either on name or label. If + i_Labels is null, all sounds will be controlled. + " + } +*/ +DXDEC +S32 +AILCALL +AIL_add_control_sounds_event_step( + HMSSEVENTCONSTRUCT i_Event, + const char* i_Labels, const char* i_MarkerStart, const char* i_MarkerEnd, const char* i_Position, + const char* i_PresetName, + U8 i_PresetApplyType, + F32 i_FadeOutTime, + U8 i_LoopCount, U8 i_Type); + + +/*! + function + { + ExcludeOn = 1 + + Name = "AIL_add_apply_environment_event_step", "Adds a step to an event to apply an environment preset." + + In = "HMSSEVENTCONSTRUCT", "i_Event", "The event to add on to." + In = "const char*", "i_EnvName", "The name of the environment preset to apply, of the form EnvList/EnvName." + In = "U8", "i_IsDynamic", "If nonzero, any variables in the environment are polled every frame." + + ReturnType = "S32", "Returns 1 on success." + + Discussion = "Applies the specified environment preset to the current HDIGDRIVER." + } +*/ +DXDEC S32 AILCALL AIL_add_apply_environment_event_step(HMSSEVENTCONSTRUCT i_Event, const char* i_EnvName, U8 i_IsDynamic); + +/*! + function + { + ExcludeOn = 1 + + Name = "AIL_add_comment_event_step", "Adds a step that represents a comment to the user of the editing tool." + + In = "HMSSEVENTCONSTRUCT", "i_Event", "The event to add on to." + In = "const char*", "i_Comment", "A string to display in the editing tool." + + ReturnType = "S32", "Returns 1 on success." + + Discussion = "This event is ignored in the runtime, and only exist for editing convenience." + } +*/ +DXDEC S32 AILCALL AIL_add_comment_event_step(HMSSEVENTCONSTRUCT i_Event, const char* i_Comment); + +EXPTYPEBEGIN typedef S32 MILES_RAMP_TYPE; +#define MILES_RAMPTYPE_VOLUME 0 +#define MILES_RAMPTYPE_WET 1 +#define MILES_RAMPTYPE_LOWPASS 2 +#define MILES_RAMPTYPE_RATE 3 +EXPTYPEEND +/* + The different values the ramps can affect. + + $:MILES_RAMPTYPE_VOLUME The ramp will adjust the sample's volume, and will interpolate in loudness level. Target is in dB. + $:MILES_RAMPTYPE_WET The ramp will affect the sample's reverb wet level, and will interpolate in loudness. Target is in dB. + $:MILES_RAMPTYPE_LOWPASS The ramp will affect the sample's low pass cutoff. Interpolation and target are in Hz. + $:MILES_RAMPTYPE_RATE The ramp will affect the sample's playback rate. Interpolation and target are in sT. +*/ + +EXPTYPEBEGIN typedef S32 MILES_INTERP_TYPE; +#define MILES_INTERP_LINEAR 0 +#define MILES_INTERP_EXP 1 +#define MILES_INTERP_SCURVE 2 +EXPTYPEEND +/* + The different ways the interpolation occurs for a ramp. + + $:MILES_INTERP_LINEAR The ramp will lerp between the current value and the target. + $:MILES_INTERP_EXP The ramp will move toward the target slowly at first, then faster as it closes on its total time. + $:MILES_INTERP_SCURVE The ramp will quickly move to about halfway, then slowly move, then move more quickly as it ends. +*/ + +DXDEC EXPAPI S32 AILCALL AIL_add_ramp_event_step( + HMSSEVENTCONSTRUCT i_Event, char const* i_Name, char const* i_Labels, + F32 i_Time, char const* i_Target, U8 i_Type, U8 i_ApplyToNew, U8 i_InterpolationType); +/* + Add an event step that updates or creates a new ramp in the runtime. + + $:i_Event The event to add the step to. + $:i_Name The name of the ramp. If this name already exists, the ramp will shift its target to the new value. + $:i_Labels The label query determining the sounds the ramp will affect. + $:i_Time The length the time in seconds the ramp will take to reach its target. + $:i_Target The target value, or a variable expression representing the target value. The target's type is + dependent on i_Type. + $:i_Type One of the $MILES_RAMP_TYPE values. + $:i_ApplyToNew If 1, the ramp will affect sounds that start after the ramp is created. If not, it will only affect sounds that + are playing when the ramp is created. This value can not be changed once the ramp has been created. + $:i_InterpolationType The method the ramp will affect the target values. One of $MILES_INTERP_TYPE values. + + Ramps are means of interpolating aspects of samples. They are removed from the system if they are targeted to + a value for their type that is a non-op - meaning 0 dB, 0 sT, or >24000 Hz. + + Ramps use the current value as the start point for the interpolation. They stay at the target point, + so you can use the same ramp name to adjust a sound's volume down, and later ramp it back up. +*/ + +DXDEC EXPAPI S32 AILCALL AIL_add_setblend_event_step(HMSSEVENTCONSTRUCT i_Event, + char const* i_Name, S32 i_SoundCount, F32 const* i_InMin, F32 const* i_InMax, + F32 const* i_OutMin, F32 const* i_OutMax, F32 const* i_MinP, F32 const* i_MaxP); +/* + Defines a named blend function to be referenced by a blended sound later. + + $:i_Event The event to add the step to. + $:i_Name The name of the blend. This is the name that will be + referenced by the state variable in start sound, as well as the variable name + to set by the game to update the blend for an instance. + $:i_SoundCount The number of sounds this blend will affect. Max 10. + $:i_InMin Array of length i_SoundCount representing the value of the blend variable the sound will start to fade in. + $:i_InMax Array of length i_SoundCount representing the value of the blend variable the sound will reach full volume. + $:i_OutMin Array of length i_SoundCount representing the value of the blend variable the sound will start to fade out. + $:i_OutMax Array of length i_SoundCount representing the value of the blend variable the sound will cease to be audible. + $:i_MinP Array of length i_SoundCount representing the pitch of the sound when it starts to fade in. + $:i_MaxP Array of length i_SoundCount representing the pitch of the sound when it has completed fading out. + + This step only sets up the lookup for when a blended sound is actually started. When a blended sound plays, every frame it + polls its state variable, then searches for a blend of the same name. If it finds both, then it uses its index in + the start sounds list to find its relevant values from the blended sound definition. + + Once it has the correct values, it uses them to affect the sample as stated in the parameter docs above. +*/ + +/*! + function + { + ExcludeOn = 1 + + Name = "AIL_add_sound_limit_event_step", "Adds a step that defines the maximum number of playing sounds per label." + + In = "HMSSEVENTCONSTRUCT", "i_Event", "The event to add on to." + In = "const char*", "i_SoundLimits", "A string of the form `"label count:anotherlabel count`"." + + ReturnType = "S32", "Returns 1 on success." + + Discussion = "Defines limits for instances of sounds on a per label basis. Sounds with multiple labels + must fit under the limits for all of their labels. By default sounds are not limited other than the + Miles max sample count." + } +*/ +DXDEC S32 AILCALL +AIL_add_sound_limit_event_step(HMSSEVENTCONSTRUCT i_Event, char const* i_LimitName, const char* i_SoundLimits); + +/*! + function + { + ExcludeOn = 1 + + Name = "AIL_add_persist_preset_event_step", "Adds a preset that applies to current sound instances, and continues to be applied to new sounds as they are started." + In = "HMSSEVENTCONSTRUCT", "i_Event", "The event to add on to." + In = "const char*", "i_PresetName", "The name of the preset, of the form PresetList/PresetName. See discussion." + In = "const char*", "i_PersistName", "The name of this persisted preset, for future removal." + In = "const char*", "i_Labels", "The labels to apply this preset to." + In = "U8", "i_IsDynamic", "If nonzero, the preset polls its variables every frame." + + ReturnType = "S32", "Returns 1 on success." + + Discussion = "Defines a preset by name that remains in the system, testing against all started sounds for label match. If a + match occurs, then the preset is applied to the new sound, before the preset specified in the startsound step itself. + + In order to remove a persisted preset, refer to it by name, but leave all other parameters null. + + Example: + + // Persist a preset for players. + AIL_add_persist_preset_event_step(hEvent, , `"Bank/PlayerEffects/Underwater`", `"Underwater`", `"player`"); + + // Remove the above preset. + AIL_add_persist_preset_event_step(hEvent, 0, `"Underwater`", 0);" + } +*/ +DXDEC S32 AILCALL +AIL_add_persist_preset_event_step(HMSSEVENTCONSTRUCT i_Event, const char* i_PresetName, const char* i_PersistName, + const char* i_Labels, U8 i_IsDynamic + ); + +DXDEC EXPAPI S32 AILCALL AIL_get_event_contents(HMSOUNDBANK bank, char const * name, U8 const** event); +/* + Return the event data for an event, by name. + + $:bank Soundbank containing the event. + $:name Name of the event to retrieve. + $:event Returns an output pointer to the event contents. Note that this string isn't null terminated, and + thus shouldn't be checked via strlen, etc. + $:return Returns 0 on fail. + + Normally, event contents are meant to be handled by the Miles high-level system via $AIL_enqueue_event, + rather than inspected directly. +*/ + +DXDEC EXPAPI S32 AILCALL AIL_add_clear_state_event_step(HMSSEVENTCONSTRUCT i_Event); +/* + Clears all persistent state in the runtime. + + $:i_Event The event to add the step to. + + This removes all state that can stick around after an event in done executing. Ramps, Blends, Persisted + Preset, etc. +*/ + +DXDEC EXPAPI S32 AILCALL AIL_add_exec_event_event_step(HMSSEVENTCONSTRUCT i_Event, char const* i_EventName); +/* + Adds a step to run another named event. + + $:i_Event The event to add the step to. + $:i_EventName The name of the event, of the form "Bank/Path/To/Event". + + When this step is encountered, the event is enqueued, so it will be executed the following frame (currently). It has the same parent + event mechanics as a completion event, so the QueuedId for a sound started by it will be for the event + that fired this step. +*/ + + +DXDEC EXPAPI S32 AILCALL AIL_add_enable_limit_event_step(HMSSEVENTCONSTRUCT i_Event, char const* i_LimitName); +/* + Adds a step to set the currently active limit. + + $:i_Event The event to add the step to. + $:i_EventName The name of the limit, as defined by a set_limits event. + +*/ + +DXDEC EXPAPI S32 AILCALL AIL_add_set_lfo_event_step(HMSSEVENTCONSTRUCT i_Event, char const* i_Name, char const* i_Base, char const* i_Amp, char const* i_Freq, S32 i_Invert, S32 i_Polarity, S32 i_Waveform, S32 i_DutyCycle, S32 i_IsLFO); +/* + Adds a step to define a variable that oscillates over time. + + $:i_Event The event to add the step to. + $:i_Name The nane of the variable to oscillate. + $:i_Base The value to oscillate around, or a variable name to use as the base. + $:i_Amp The maximum value to reach, or a variable name to use as the amplitude. + $:i_Freq The rate at which the oscillation occurs, or a variable name to use as the rate. Rate should not exceed game tick rate / 2. + $:i_Invert Whether the waveform should be inverted. + $:i_Polarity Bipolar (1) or Unipolar (0) - whether the waveform goes around the base or only above it. + $:i_Waveform Sine wave (0), Triangle (1), Saw (2), or Square(3) + $:i_DutyCycle Only valid for square, determines what percent of the wave is "on". (0-100) + $:i_IsLFO If zero, Base is the default value to assign the variable when the settings are applied, and the rest of the parameters are ignored. +*/ + +DXDEC EXPAPI S32 AILCALL AIL_add_move_var_event_step(HMSSEVENTCONSTRUCT i_Event, char const* i_Name, const F32 i_Times[2], const S32 i_InterpolationTypes[2], const F32 i_Values[3]); +/* + Adds a step to set and move a variable over time on a curve. + + $:i_Event The event to add the step to. + $:i_Name The variable to move. + $:i_Times The midpoint and final times for the curves + $:i_InterpolationTypes The curve type for the two curves - Curve In (0), Curve Out (1), S-Curve (2), Linear (3) + $:i_Values The initial, midpoint, and final values for the variable. + + The variable is locked to this curve over the timeperiod - no interpolation from a previous value is done. + + If an existing move var exists when the new one is added, the old one is replaced. +*/ + +enum EVENT_STEPTYPE +{ + EVENT_STEPTYPE_STARTSOUND = 1, + EVENT_STEPTYPE_CONTROLSOUNDS, + EVENT_STEPTYPE_APPLYENV, + EVENT_STEPTYPE_COMMENT, + EVENT_STEPTYPE_CACHESOUNDS, + EVENT_STEPTYPE_PURGESOUNDS, + EVENT_STEPTYPE_SETLIMITS, + EVENT_STEPTYPE_PERSIST, + EVENT_STEPTYPE_VERSION, + EVENT_STEPTYPE_RAMP, + EVENT_STEPTYPE_SETBLEND, + EVENT_STEPTYPE_CLEARSTATE, + EVENT_STEPTYPE_EXECEVENT, + EVENT_STEPTYPE_ENABLELIMIT, + EVENT_STEPTYPE_SETLFO, + EVENT_STEPTYPE_MOVEVAR +}; + +//! Represents an immutable string that is not null terminated, and shouldn't be deleted. +struct _MSSSTRINGC +{ + const char* str; + S32 len; +}; +typedef struct _MSSSTRINGC MSSSTRINGC; + + +/*! + Represents a single step that needs to be executed for an event. + + All of the members in the structures share the same definition as + their counterpart params in the functions that added them during + event construction. +*/ +struct EVENT_STEP_INFO +{ + //! type controls which struct in the union is accessed. + enum EVENT_STEPTYPE type; + union + { + struct + { + MSSSTRINGC soundname; + MSSSTRINGC presetname; + MSSSTRINGC eventname; + MSSSTRINGC labels; + MSSSTRINGC markerstart; + MSSSTRINGC markerend; + MSSSTRINGC startoffset; + MSSSTRINGC statevar; + MSSSTRINGC varinit; + U32 stream; + F32 volmin,volmax,pitchmin,pitchmax; + F32 fadeintime; + U16 delaymin; + U16 delaymax; + U8 canload; + U8 priority; + U8 loopcount; + U8 evictiontype; + U8 selecttype; + U8 presetisdynamic; + } start; + + struct + { + MSSSTRINGC labels; + MSSSTRINGC markerstart; + MSSSTRINGC markerend; + MSSSTRINGC position; + MSSSTRINGC presetname; + F32 fadeouttime; + U8 presetapplytype; + U8 loopcount; + U8 type; + } control; + + struct + { + MSSSTRINGC envname; + U8 isdynamic; + } env; + + struct + { + MSSSTRINGC comment; + } comment; + + struct + { + MSSSTRINGC lib; + const char** namelist; + S32 namecount; + } load; + + struct + { + MSSSTRINGC limits; + MSSSTRINGC name; + } limits; + + struct + { + MSSSTRINGC name; + MSSSTRINGC presetname; + MSSSTRINGC labels; + U8 isdynamic; + } persist; + + struct + { + MSSSTRINGC name; + MSSSTRINGC labels; + MSSSTRINGC target; + F32 time; + U8 type; + U8 apply_to_new; + U8 interpolate_type; + } ramp; + + struct + { + MSSSTRINGC name; + F32 inmin[10]; + F32 inmax[10]; + F32 outmin[10]; + F32 outmax[10]; + F32 minp[10]; + F32 maxp[10]; + U8 count; + } blend; + + struct + { + MSSSTRINGC eventname; + } exec; + + struct + { + MSSSTRINGC limitname; + } enablelimit; + + struct + { + MSSSTRINGC name; + MSSSTRINGC base; + MSSSTRINGC amplitude; + MSSSTRINGC freq; + S32 invert; + S32 polarity; + S32 waveform; + S32 dutycycle; + S32 islfo; + } setlfo; + + struct + { + MSSSTRINGC name; + F32 time[2]; + S32 interpolate_type[2]; + F32 value[3]; + } movevar; + }; +}; + +/*! + function + { + ExcludeOn = 1 + + Name = "AIL_next_event_step", "Retrieves the next step in the event buffer, parsing it in to a provided buffer." + + In = "const U8*", "i_EventString", "The event returned by $AIL_close_event, or a previous call to $AIL_next_event_step" + Out = "const EVENT_STEP_INFO*", "o_Step", "A pointer to the step struct will be stored here." + In = "void*", "i_Buffer", "A working buffer for the function to use for parsing." + In = "S32", "i_BufferSize", "The size in bytes of the working buffer." + + ReturnType = "U8 char*", "Returns 0 on fail or when the event string has been exhausted of steps. Otherwise, returns + the string location of the next event step in the buffer." + + Discussion = "This function parses the event string in to a struct for usage by the user. This function should only be + used by the MilesEvent system. It returns the pointer to the next step to be passed to this function to get the + next step. In this manner it can be used in a loop: + + // Create an event to stop all sounds. + HMSSEVENTCONSTRUCT hEvent = AIL_create_event(); + AIL_add_control_sound_event_step(hEvent, 0, 0, 0, 0, 0, 0, 255, 3); + char* pEvent = AIL_close_event(hEvent); + + char EventBuffer[4096]; + EVENT_STEP_INFO* pStep = 0; + char* pCurrentStep = pEvent; + + while (pCurrentStep) + { + pStep = 0; + pCurrentStep = AIL_next_event_step(pCurrentStep, &pStep, EventBuffer, 4096); + if (pStep == 0) + { + // Error, or an empty event. If $AIL_last_error is an empty string, then it was an empty event. + break; + } + + // Handle event step. + switch (pStep->type) + { + default: break; + } + } + + AIL_mem_free_lock(pEvent); + " + } +*/ +DXDEC const U8* AILCALL AIL_next_event_step(const U8* i_EventString, struct EVENT_STEP_INFO** o_Step, void* i_Buffer, S32 i_BufferSize); + + +// Old style names. +#define AIL_find_event MilesFindEvent +#define AIL_clear_event_queue MilesClearEventQueue +#define AIL_register_random MilesRegisterRand +#define AIL_enumerate_sound_instances MilesEnumerateSoundInstances +#define AIL_enumerate_preset_persists MilesEnumeratePresetPersists +#define AIL_enqueue_event MilesEnqueueEvent +#define AIL_enqueue_event_system MilesEnqueueEventContext +#define AIL_enqueue_event_by_name MilesEnqueueEventByName +#define AIL_begin_event_queue_processing MilesBeginEventQueueProcessing +#define AIL_complete_event_queue_processing MilesCompleteEventQueueProcessing +#define AIL_startup_event_system MilesStartupEventSystem +#define AIL_shutdown_event_system MilesShutdownEventSystem +#define AIL_add_soundbank MilesAddSoundBank +#define AIL_release_soundbank MilesReleaseSoundBank +#define AIL_set_sound_label_limits MilesSetSoundLabelLimits +#define AIL_text_dump_event_system MilesTextDumpEventSystem +#define AIL_event_system_state MilesGetEventSystemState +#define AIL_get_event_length MilesGetEventLength +#define AIL_stop_sound_instances MilesStopSoundInstances +#define AIL_pause_sound_instances MilesPauseSoundInstances +#define AIL_resume_sound_instances MilesResumeSoundInstances +#define AIL_start_sound_instance MilesStartSoundInstance +#define AIL_set_event_error_callback MilesSetEventErrorCallback +#define AIL_set_event_bank_functions MilesSetBankFunctions +#define AIL_get_event_bank_functions MilesGetBankFunctions + +#define AIL_set_variable_int MilesSetVarI +#define AIL_set_variable_float MilesSetVarF +#define AIL_variable_int MilesGetVarI +#define AIL_variable_float MilesGetVarF + +#define AIL_set_sound_start_offset MilesSetSoundStartOffset +#define AIL_requeue_failed_asyncs MilesRequeueAsyncs +#define AIL_add_event_system MilesAddEventSystem + +#define AIL_audition_local_host MilesAuditionLocalHost +#define AIL_audition_connect MilesAuditionConnect +#define AIL_audition_startup MilesAuditionStartup +#define AIL_audition_shutdown MilesAuditionShutdown +EXPGROUP(Miles High Level Event System) + +EXPTYPE typedef void* HEVENTSYSTEM; +/* + The type used to distinguish between running event systems. + + Only used if multiple event systems are running. See the eventmultiple example. +*/ + +DXDEC EXPAPI HEVENTSYSTEM AILCALL AIL_startup_event_system(HDIGDRIVER dig, S32 command_buf_len, EXPOUT char* memory_buf, S32 memory_len); +/* + Initializes the Miles Event system and associates it with an open digital driver. + + $:dig The digital sound driver that this event system should use. + $:command_buf_len An optional number of bytes to use for the command buffer. If you pass 0, a reasonable default will be used (currently 5K). + $:memory_buf An optional pointer to a memory buffer buffer that the event system will use for all event allocations. + Note that the sound data itself is not stored in this buffer - it is only for internal buffers, the command buffer, and instance data. + Use 0 to let Miles to allocate this buffer itself. + $:memory_len If memory_buf is non-null, then this parameter provides the length. If memory_buf is null, the Miles will + allocate this much memory for internal buffers. If both memory_buf and memory_len are null, the Miles will allocate reasonable default (currently 64K). + $:return Returns 0 on startup failure. + + This function starts up the Miles Event System, which is used to trigger events throughout your game. + You call it after $AIL_open_digital_driver. +*/ + +DXDEC EXPAPI HEVENTSYSTEM AILCALL AIL_add_event_system(HDIGDRIVER dig); +/* + Creates an additional event system attached to a different driver, in the event that you need to trigger events + tied to different sound devices. + + $:dig The digital sound driver to attach the new event system to. + $:return A handle to the event system to use in various high level functions. + + Both systems will access the same set of loaded soundbanks, and are updated when $AIL_begin_event_queue_processing is called. + + To enqueue events to the new system, use $AIL_enqueue_event_system. + + To iterate the sounds for the new system, pass the $HEVENTSYSTEM as the first parameter to $AIL_enumerate_sound_instances. + + To access or set global variables for the new system, pass the $HEVENTSYSTEM as the context in the variable access functions. + + See also the eventmultiple.cpp example program. +*/ + +DXDEC EXPAPI void AILCALL AIL_shutdown_event_system( void ); +/* + Shuts down the Miles event system. + + This function will closes everything in the event system - it ignores reference counts. It will free + all event memory, sound banks, and samples used by the system. +*/ + +DXDEC EXPAPI HMSOUNDBANK AILCALL AIL_add_soundbank(char const * filename, char const* name); +/* + Open and add a sound bank for use with the event system. + + $:filename Filename of the bank to load. + $:name The name of the soundbank to load - this is only used for auditioning. + $:return The handle to the newly loaded soundbank (zero on failure). + + This function opens the sound bank and makes it available to the event system. The filename + is the name on the media, and the name is the symbolic name you used in the Miles Sound Studio. + You might, for example, be using a soundbank with a platform extension, like: 'gamebank_ps3.msscmp', + and while using the name 'gamebank' for authoring and auditioning. + + Sound data is not loaded when this function is called - it is only loaded when the relevant Cache Sounds + is played, or a sound requiring it plays. + + This function will access the disc, so you will usually call it at level load time. + + If you are using the Auditioner, $AIL_audition_startup and $AIL_audition_connect must be called prior + to this function. +*/ + +DXDEC EXPAPI S32 AILCALL AIL_release_soundbank(HMSOUNDBANK bank); +/* + Releases a sound bank from the event system. + + $:bank The bank to close. + $:return Returns non-zero for success (zero on failure). + + This function closes a given soundbank. Any data references in the event system need to be removed beforehand - with + $AIL_enqueue_event_by_name usage this should only be pending sounds with completion events. + + Any other data references still existing (queued events, persisted presets, etc) will report errors when used, + but will not crash. + + Releasing a sound bank does not free any cached sounds loaded from the bank - any sounds from the bank should be freed + via a Purge Sounds event step. If this does not occur, the sound data will still be loaded, but the + sound metadata will be gone, so Start Sound events will not work. Purge Sounds will still work. + + This is different from Miles 8, which would maintain a reference count for all data. +*/ + +DXDEC U8 const * AILCALL AIL_find_event(HMSOUNDBANK bank,char const* event_name); +/* + (EXPAPI removed to prevent release in docs) + + Searches for an event by name in the event system. + + $:bank The soundbank to search within, or 0 to search all open banks (which is the normal case). + $:event_name The name of the event to find. This name should be of the form "soundbank/event_list/event_name". + $:return A pointer to the event contents (or 0, if the event isn't found). + + This function is normally used as the event parameter for $AIL_enqueue_event. It + searches one or all open soundbanks for a particular event name. + + This is deprecated. If you know the event name, you should use $AIL_enqueue_event_by_name, or $AIL_enqueue_event with + MILESEVENT_ENQUEUE_BY_NAME. + + Events that are not enqueued by name can not be tracked by the Auditioner. +*/ + +DXDEC EXPAPI U64 AILCALL AIL_enqueue_event_system(HEVENTSYSTEM system, U8 const * event, void* user_buffer, S32 user_buffer_len, S32 enqueue_flags, U64 apply_to_ID ); +/* + Enqueue an event to a specific system. Used only if you have multiple event systems running. + + $:system The event system to attach the event to. + $:return See $AIL_enqueue_event for return description. + + For full information on the parameters, see $AIL_enqueue_event. +*/ + +DXDEC EXPAPI U64 AILCALL AIL_enqueue_event_by_name(char const* name); +/* + Enqueue an event by name. + + $:name The full name of the event, eg "soundbank/path/to/event". + $:return See $AIL_enqueue_event for return description. + + This is the most basic way to enqueue an event. It enqueues an event by name, and as a result the event will be tracked by the auditioner. + + For when you need more control over the event, but still want it to be tracked by the auditioner, it is equivalent + to calling $AIL_enqueue_event_end_named($AIL_enqueue_event_start(), name) + + For introduction to the auditioning system, see $integrating_events. +*/ + +DXDEC EXPAPI S32 AILCALL AIL_enqueue_event_start(); +/* + Start assembling a packet to use for enqueuing an event. + + $:return A token used for passing to functions that add data to the event. + + This is used to pass more data to an event that will be executed. For instance, if + an event is going to spatialize a sound, but there's no need to move the sound over the course of + its lifetime, you can add positional data to the event via $AIL_enqueue_event_position. When a + sound is started it will use that for its initial position, and there is no need to do any + game object <-> event id tracking. + + ${ + // Start the enqueue. + S32 enqueue_token = AIL_enqueue_event_start(); + + // Tell all sounds started by the event to position at (100, 100, 100) + AIL_enqueue_event_position(&enqueue_token, 100, 100, 100); + + // Complete the token and enqueue the event to the command buffer. + AIL_enqueue_event_end_named(enqueue_token); + $} + + The enqueue process is still completely thread safe. No locks are used, however only 8 + enqueues can be "assembling" at the same time - if more than that occur, the $AIL_enqueue_event_start + will yield the thread until a slot is open. + + The ONLY time that should happen is if events enqueues are started but never ended: + + ${ + // Start the enqueue + S32 enqueue_token = AIL_enqueue_event_start(); + + // Try to get the game position + Vector3* position = GetPositionOfSomething(my_game_object); + if (position == 0) + return; // OOPS! enqueue_token was leaked here, never to be reclaimed. + + $} + + Each event has a limit to the amount of data that can be attached to it. Currently this + amount is 512 bytes - which should cover all use cases. If any enqueue functions return 0, + then this amount has been reached. The ErrorHandler will be called as well, with $AIL_last_error + reporting that the enqueue buffer was filled. +*/ + +DXDEC EXPAPI void AILCALL AIL_enqueue_event_cancel(S32 token); +/* + Clears a enqueue token without passing it to the command buffer + + $:token A token created with $AIL_enqueue_event_start. + + Used to handle the case where you decided to not actually enqueue the event you've assembled. + + In general it's better to handle anything that can fail before actually starting + to create the enqueue. +*/ + +DXDEC EXPAPI S32 AILCALL AIL_enqueue_event_position(S32* token, F32 x, F32 y, F32 z); +/* + Pass an initial position to an event to use for sound spatialization. + + $:token A token created with $AIL_enqueue_event_start. + $:return 0 if the enqueue buffer is full + + If the event queued starts a sound, the sound's position will be set to the given coordinates. + + Setting the position of a sample automatically enables 3D spatialization. +*/ + +DXDEC EXPAPI S32 AILCALL AIL_enqueue_event_velocity(S32* token, F32 vx, F32 vy, F32 vz, F32 mag); +/* + Pass an initial velocity to an event to use for sound spatialization. + + $:token A token created with $AIL_enqueue_event_start. + $:return 0 if the enqueue buffer is full + + If the event queued starts a sound, the sound's velocity will be set to the given vector. + + Setting the velocity of a sample does NOT automatically enable 3D spatialization. +*/ + +DXDEC EXPAPI S32 AILCALL AIL_enqueue_event_buffer(S32* token, void* user_buffer, S32 user_buffer_len, S32 user_buffer_is_ptr); +/* + Attaches a user buffer to the event. + + $:token A token created with $AIL_enqueue_event_start. + $:user_buffer Pointer to a user buffer to pass with the event. If user_buffer_is_ptr is 1, the pointer is copied + directly and user_buffer_len is ignored. + $:user_buffer_len The size of the user_buffer to attach to the event. + $:user_buffer_is_ptr If 1, the pointer is copied and user_buffer_len is ignored. + $:return 0 if the enqueue buffer is full + + User buffers are helpful for bridging the gap between game objects and sound objects. + + There are two use cases available in this function + + $* Pointer If user_buffer_is_ptr is 1, then the value passed to user_buffer is copied directly as the + user buffer contents, and then exposed during sound enumeration. This is equivalent in spirit to + the void* value that often accompanies callbacks. In this case, user_buffer_len is ignored, as + user_buffer is never dereferenced. + $* Buffer If user_buffer_is_ptr is 0, then user_buffer_len bytes are copied from user_buffer and + carried with the event. During sound enumeration this buffer is made available, and you never have to + worry about memory management. + $- + + Pointer- + ${ + struct useful_data + { + S32 game_stat; + S32 needed_info; + }; + + useful_data* data = (useful_data*)malloc(sizeof(useful_data)); + data->game_stat = 1; + data->needed_info = 2; + + // Pointer - the "data" pointer will be copied directly, so we can't free() "data" until after the sound + // completes and we're done using it in the enumeration loop. + S32 ptr_token = AIL_enqueue_event_start(); + AIL_enqueue_event_buffer(&ptr_token, data, 0, 1); + AIL_enqueue_event_end_named(ptr_token, "mybank/myevent"); + $} + + Buffer- + ${ + struct useful_data + { + S32 game_stat; + S32 needed_info; + }; + + useful_data data; + data.game_stat = 1; + data.needed_info = 2; + + // Buffer - the "data" structure will be copied internally, so we can free() the data - or just use + // a stack variable like this + S32 buf_token = AIL_enqueue_event_start(); + AIL_enqueue_event_buffer(&buf_token, &data, sizeof(data), 0); + AIL_enqueue_event_end_named(buf_token, "mybank/myevent"); + $} + + As noted in $AIL_enqueue_event_start(), there's only 512 bytes available to an enqueue, so that + places an upper limit on the amount of data you can pass along. If the data is huge, then you + should use user_buffer_is_ptr. +*/ + +DXDEC EXPAPI S32 AILCALL AIL_enqueue_event_variablef(S32* token, char const* name, F32 value); +/* + Attaches a variable's value to the event enqueue. + + $:token A token created with $AIL_enqueue_event_start + $:name The variable name to set. + $:value The value of the variable to set. + $:return 0 if the enqueue buffer is full + + When a sound starts, the given variable will be set to the given value prior to any possible + references being used by presets. +*/ + +DXDEC EXPAPI S32 AILCALL AIL_enqueue_event_filter(S32* token, U64 apply_to_ID); +/* + Limits the effects of the event to sounds started by the given ID. + + $:token A token created with $AIL_enqueue_event_start + $:apply_to_ID The ID to use for filtering. This can be either a sound or event ID. For an + event, it will apply to all sounds started by the event, and any events queued by that event. + $:return 0 if the enqueue buffer is full + + IDs are assigned to events and sounds - for events, it is returned via the $AIL_enqueue_event_end_named function + (or any other enqueue function). For sounds, you can access the assigned id during the enumeration process. +*/ + +DXDEC EXPAPI S32 AILCALL AIL_enqueue_event_context(S32* token, HEVENTSYSTEM system); +/* + Causes the event to run on a separate running event system. + + $:token A token created with $AIL_enqueue_event_start + $:system An event system $AIL_add_event_system + $:return 0 if the enqueue buffer is full + + If you are running multiple event systems, this is required to get events + to queue on the additional event systems. +*/ + +DXDEC EXPAPI S32 AILCALL AIL_enqueue_event_selection(S32* token, U32 selection); +/* + Passes in a selection value for start sound events to use for picking sounds. + + $:token A token created with $AIL_enqueue_event_start. + $:selection The value to use for selecting the sound to play. + $:return 0 if the enqueue buffer is full + + The selection index is used to programatically select a sound from the + loaded banks. The index passed in replaces any numeric value at the end + of the sound name existing in any start sound event step. For example, if + a start sound event plays "mybank/sound1", and the event is queued with + a selection, then the selection will replace the "1" with the number passed in: + + ${ + // Enqueue with a selection of 5 + S32 token = AIL_enqueue_event_start(); + AIL_enqueue_event_selection(&token, 50; + AIL_enqueue_event_end_named(token, "mybank/myevent"); + $} + + Assuming mybank/myevent starts sound "mybank/sound1", the sound + that will actually be played will be "mybank/sound5". If the sound does + not exist, it is treated the same as if any other sound was not found. + + The selection process replaces ALL trailing numbers with a representation + of the selection index using the same number of digits, meaning in the above + example, "mybank/sound123" would have become "mybank/sound005". +*/ + +DXDEC EXPAPI U64 AILCALL AIL_enqueue_event_end_named(S32 token, char const* event_name); +/* + Completes assembling the event and queues it to the command buffer to be run during next tick. + + $:token A token created with $AIL_enqueue_event_start. + $:event_name The name of the event to run. + $:return A unique ID for the event that can be used to identify sounds started by this event, + or for filtering future events to the sounds started by this event. + + This function takes all of the data accumulated via the various enqueue functions and assembles + it in to the command buffer to be run during the next $AIL_begin_event_queue_processing. + + As with all of the enqueue functions it is completely thread-safe. + + Upon completion of this function, the enqueue slot is release and available for another + $AIL_enqueue_event_start. +*/ + +DXDEC EXPAPI U64 AILCALL AIL_enqueue_event(U8 const * event_or_name, void* user_buffer, S32 user_buffer_len, S32 enqueue_flags, U64 apply_to_ID ); +/* + Enqueue an event to be processed by the next $AIL_begin_event_queue_processing function. + + $:event_or_name Pointer to the event contents to queue, or the name of the event to find and queue. + If an event, the contents must be valid until the next call to $AIL_begin_event_queue_processing. + If a name, the string is copied internally and does not have any lifetime requirements, and MILES_ENQUEUE_BY_NAME must be present in enqueue_flags. + $:user_buffer Pointer to a user buffer. Depending on $(AIL_enqueue_event::enqueue_flags), this pointer can be saved directly, or its contents copied into the sound instance. + This data is then accessible later, when enumerating the instances. + $:user_buffer_len Size of the buffer pointed to by user_buffer. + $:enqueue_flags Optional $MILESEVENTENQUEUEFLAGS logically OR'd together that control how to enqueue this event (default is 0). + $:apply_to_ID Optional value that is used for events that affect sound instances. Normally, + when Miles triggers one of these event steps, it matches the name and labels stored with the event step. However, if + you specify an apply_to_ID value, then event step will only run on sounds that matches this QueuedID,InstanceID,or EventID too. This is how you + execute events only specific sound instances. QueuedIDs are returned from each call $AIL_enqueue_event. + InstanceIDs and EventIDs are returned from $AIL_enumerate_sound_instances. + $:return On success, returns QueuedID value that is unique to this queued event for the rest of this + program run (you can use this ID to uniquely identify sounds triggered from this event). + + This function enqueues an event to be triggered - this is how you begin execution of an event. First, you + queue it, and then later (usually once a game frame), you call $AIL_begin_event_queue_processing to + execute an event. + + This function is very lightweight. It does nothing more than post the event and data to a + command buffer that gets executed via $AIL_begin_event_queue_processing. + + The user_buffer parameter can be used in different ways. If no flags are passed in, then + Miles will copy the data from user_buffer (user_buffer_len bytes long) and store the data with + the queued sound - you can then free the user_buffer data completely! This lets Miles keep track + of all your sound related memory directly and is the normal way to use the system (it is very + convenient once you get used to it). + + If you instead pass the MILESEVENT_ENQUEUE_BUFFER_PTR flag, then user_buffer pointer will + simply be associated with each sound that this event may start. In this case, user_buffer_len + is ignored. + + In both cases, when you later enumerate the sound instances, you can access your sound data + with the $(MILESEVENTSOUNDINFO::UserBuffer) field. + + You can call this function from any number threads - it's designed to be called from anywhere in your game. + + If you want events you queue to be captured by Miles Studio, then they have to be passed by name. This can be done + by either using the convenience function $AIL_enqueue_event_by_name, or by using the MILESEVENT_ENQUEUE_BY_NAME flag and + passing the name in event_or_name. For introduction to the auditioning system, see $integrating_events. +*/ + +EXPTYPEBEGIN typedef S32 MILESEVENTENQUEUEFLAGS; +#define MILESEVENT_ENQUEUE_BUFFER_PTR 0x1 +#define MILESEVENT_ENQUEUE_FREE_EVENT 0x2 +#define MILESEVENT_ENQUEUE_BY_NAME 0x4 +// 0x8 can't be used, internal. +EXPTYPEEND +/* + The available flags to pass in $AIL_enqueue_event or $AIL_enqueue_event_system. + + $:MILESEVENT_ENQUEUE_BUFFER_PTR The user_buffer parameter passed in should not be duplicated, and instead + should just tranparently pass the pointer on to the event, so that the $(MILESEVENTSOUNDINFO::UserBuffer) + during sound iteration is just the same pointer. user_buffer_len is ignored in this case. + + $:MILESEVENT_ENQUEUE_FREE_EVENT The ownership of the memory for the event is passed to the event system. If this + is present, once the event completes $AIL_mem_free_lock will be called on the raw pointer passed in to $AIL_enqueue_event or + $AIL_enqueue_event_system. This is rarely used. + + $:MILESEVENT_ENQUEUE_BY_NAME The event passed in is actually a string. The event system will then look for this event + in the loaded sound banks during queue processing. +*/ + + +DXDEC EXPAPI S32 AILCALL AIL_begin_event_queue_processing( void ); +/* + Begin execution of all of the enqueued events. + + $:return Return 0 on failure. The only failures are unrecoverable errors in the queued events + (out of memory, bank file not found, bad data, etc). You can get the specific error by + calling $AIL_last_error. + + This function executes all the events currently in the queue. This is where all major + processing takes place in the event system. + + Once you execute this functions, then sound instances will be in one of three states: + + $(MILESEVENTSOUNDSTATUS::MILESEVENT_SOUND_STATUS_PENDING)[MILESEVENT_SOUND_STATUS_PENDING] - these are new sound instances that were + created by events that had a "Start Sound Step". Note that these instances aren't audible yet, + so that you have a chance to modify game driven properties (like the 3D position) + on the sound before Miles begins to play it. + + $(MILESEVENTSOUNDSTATUS::MILESEVENT_SOUND_STATUS_PLAYING)[MILESEVENT_SOUND_STATUS_PLAYING] - these are sound instances that were previously + started and are continuing to play (you might update the 3D position for these, for example). + + $(MILESEVENTSOUNDSTATUS::MILESEVENT_SOUND_STATUS_COMPLETE)[MILESEVENT_SOUND_STATUS_COMPLETE] - these are sound instances that finished playing + since the last this frame (you might use this status to free any game related memory, for example). + + You will normally enumerate the active sound instances in-between calls to $AIL_begin_event_queue_processing + and $AIL_complete_event_queue_processing with $AIL_enumerate_sound_instances. + + $AIL_complete_event_queue_processing must be called after this function to commit + all the changes. + + Example usage: +${ + // enqueue an event + $AIL_enqueue_event( EventThatStartsSounds, game_data_ptr, 0, MILESEVENT_ENQUEUE_BUFFER_PTR, 0 ); + + // now process that event + $AIL_begin_event_queue_processing( ); + + // next, enumerate the pending and complete sounds for game processing + MILESEVENTSOUNDINFO Info; + + HMSSENUM SoundEnum = MSS_FIRST; + while ( $AIL_enumerate_sound_instances( &SoundEnum, MILESEVENT_SOUND_STATUS_PENDING | MILESEVENT_SOUND_STATUS_COMPLETE, 0, &Info ) ) + { + game_type * game_data = (game_type*) Info.UserBuffer; // returns the game_data pointer from the enqueue + + if ( Info.Status == MILESEVENT_SOUND_STATUS_PENDING ) + { + // setup initial state + AIL_set_sample_3D_position( Info.Sample, game_data->x, game_data->y, game_data->z ); + } + else if ( Info.Status == MILESEVENT_SOUND_STATUS_COMPLETE ) + { + // Free some state we have associated with the sound now that its done. + game_free( game_data ); + } + } + + $AIL_complete_event_queue_processing( ); + $} + + Note that if any event step drastically fails, the rest of the command queue is + skipped, and this function returns 0! For this reason, you shouldn't assume + that a start sound event will always result in a completed sound later. + + Therefore, you should allocate memory that you want associated with a sound instance + during the enumeration loop, rather than at enqueue time. Otherwise, you + need to detect that the sound didn't start and then free the memory (which can be complicated). +*/ + +// Returned by AIL_enumerate_sound_instances() +EXPTYPE typedef struct _MILESEVENTSOUNDINFO +{ + U64 QueuedID; + U64 InstanceID; + U64 EventID; + HSAMPLE Sample; + HSTREAM Stream; + void* UserBuffer; + S32 UserBufferLen; + S32 Status; + U32 Flags; + S32 UsedDelay; + F32 UsedVolume; + F32 UsedPitch; + char const* UsedSound; + S32 HasCompletionEvent; +} MILESEVENTSOUNDINFO; +/* + Sound instance data that is associated with each active sound instance. + + $:QueuedID A unique ID that identifies the queued event that started this sound. Returned from each call to $AIL_enqueue_event. + $:EventID A unique ID that identifies the actual event that started this sound. This is the same as QueuedID unless the sound + was started by a completion event or a event exec step. In that case, the QueuedID represents the ID returned from + $AIL_enqueue_event, and EventID represents the completion event. + $:InstanceID A unique ID that identified this specific sound instance (note that one QueuedID can trigger multiple InstanceIDs). + $:Sample The $HSAMPLE for this playing sound. + $:Stream The $HSTREAM for this playing sound (if it is being streamed, zero otherwise). + $:UserBuffer A pointer to the user data for this sound instance. + $:UserBufferLen The length in bytes of the user data (if known by Miles). + $:Status One of the $MILESEVENTSOUNDSTATUS status values. + $:Flags One or more of the $MILESEVENTSOUNDFLAG flags. + $:UsedDelay The value actually used as a result of the randomization of delay for this instance + $:UsedVolume The value actually used as a result of the randomization of pitch for this instance + $:UsedPitch The value actually used as a result of the randomization of volume for this instance + $:UsedSound The name of the sound used as a result of randomization. This pointer should NOT be deleted + and is only valid for the until the next call in to Miles. + $:HasCompletionEvent Nonzero if the sound will fire an event upon completion. + + This structure is returned by the $AIL_enumerate_sound_instances function. It + returns information about an active sound instance. +*/ + +DXDEC EXPAPI void AILCALL AIL_set_variable_int(UINTa context, char const* name, S32 value); +/* + Sets a named variable that the designer can reference in the tool. + + $:context The context the variable is set for. Can be either a $HEVENTSYSTEM + to set a global variable for a specific system, 0 to set a global variable + for the default system, or an $HMSSENUM from $AIL_enumerate_sound_instances. + $:name The name of the variable to set. + $:value The value of the variable to set. + + Variables are tracked per sound instance and globally, and when a variable is needed + by an event, it will check the relevant sound instance first, before falling back to + the global variable list: + + ${ + $HMSSENUM FirstSound = MSS_FIRST; + $MILESEVENTSOUNDINFO Info; + + // Grab the first sound, whatever it is. + $AIL_enumerate_sound_instances(0, &FirstSound, 0, 0, 0, &Info); + + // Set a variable on that sound. + $AIL_set_variable_int(FirstSound, "MyVar", 10); + + // Set a global variable by the same name. + $AIL_set_variable_int(0, "MyVar", 20); + + // A preset referencing "MyVar" for FirstSound will get 10. Any other sound will + // get 20. + $} + +*/ + +DXDEC EXPAPI void AILCALL AIL_set_variable_float(UINTa context, char const* name, F32 value); +/* + Sets a named variable that the designer can reference in the tool. + + $:context The context the variable is set for. Can be either a $HEVENTSYSTEM + to set a global variable for a specific system, 0 to set a global variable + for the default system, or an $HMSSENUM from $AIL_enumerate_sound_instances. + $:name The name of the variable to set. + $:value The value of the variable to set. + + Variables are tracked per sound instance and globally, and when a variable is needed + by an event, it will check the relevant sound instance first, before falling back to + the global variable list. + + ${ + $HMSSENUM FirstSound = MSS_FIRST; + $MILESEVENTSOUNDINFO Info; + + // Grab the first sound, whatever it is. + $AIL_enumerate_sound_instances(0, &FirstSound, 0, 0, 0, &Info); + + // Set a variable on that sound. + $AIL_set_variable_float(FirstSound, "MyVar", 10.0); + + // Set a global variable by the same name. + $AIL_set_variable_float(0, "MyVar", 20.0); + + // A preset referencing "MyVar" for FirstSound will get 10. Any other sound will + // get 20. + $} +*/ + +DXDEC EXPAPI S32 AILCALL AIL_variable_int(UINTa context, char const* name, S32* value); +/* + Retrieves a named variable. + + $:context The context to start the lookup at, same as $AIL_set_variable_int. + $:name The name to look up. + $:value Pointer to an int to store the value in. + $:return 1 if the variable was found, 0 otherwise. + + This function follows the same lookup pattern as the runtime - if the context is a + sound instance, it checks the instance before falling back to global variables. +*/ + +DXDEC EXPAPI S32 AILCALL AIL_variable_float(UINTa context, char const* name, F32* value); +/* + Retrieves a named variable. + + $:context The context to start the lookup at, same as $AIL_set_variable_float. + $:name The name to look up. + $:value Pointer to a float to store the value in. + $:return 1 if the variable was found, 0 otherwise. + + This function follows the same lookup pattern as the runtime - if the context is a + sound instance, it checks the instance before falling back to global variables. +*/ + +DXDEC EXPAPI void AILCALL AIL_requeue_failed_asyncs(); +/* + Requeues any failed asynchronous loads for sound sources. + + Use this function when a disc error causes a slew of failed caches. Any sound source that + has failed due to asynchronous load will get retried. +*/ + +DXDEC EXPAPI void AILCALL AIL_set_sound_start_offset(HMSSENUM sound, S32 offset, S32 isms); +/* + Specify the starting position for a pending sound. + + $:sound The enumeration from $AIL_enumerate_sound_instances representing the desired sound. + The sound must be in the pending state. + $:offset The offset to use for the starting position of the sound. + $:isms If nonzero, the offset is in milliseconds, otherwise bytes. + + Use this function instead of manipulating the sample position directly via low level Miles calls prior to + the sound starting. Generally you don't need to do this manually, since the sound designer should do + this, however if you need to restart a sound that stopped - for example a stream that went to error - + you will have to set the start position via code. + + However, since there can be a delay between the time the sound is first seen in the sound iteration and + the time it gets set to the data, start positions set via the low level miles calls can get lost, so + use this. + + See the eventstreamerror.cpp example program for usage. +*/ + +DXDEC EXPAPI S32 AILCALL AIL_enumerate_sound_instances(HEVENTSYSTEM system, HMSSENUM* next, S32 statuses, char const* label_query, U64 search_for_ID, EXPOUT MILESEVENTSOUNDINFO* info); +/* + Enumerated the active sound instances managed by the event system. + + $:next Enumeration token - initialize to MSS_FIRST before the first call. You can pass 0 here, if you just want the first instance that matches. + $:statuses Or-ed list of status values to enumerate. Use 0 for all status types. + $:label_query A query to match sound instance labels against. Use 0 to skip label matching. + $:search_for_ID Match only instances that have a QueuedID,InstanceID,or EventID that matches this value. Use 0 to skip ID matching. + $:info Returns the data for each sound instance. + $:return Returns 0 when enumeration is complete. + + Enumerates the sound instances. This will generally be used between + calls to $AIL_begin_event_queue_processing and $AIL_complete_event_queue_processing to + manage the sound instances. + + The label_query is a list of labels to match, separated by commas. By default, comma-separated + values only have to match at least one label. So, if you used "level1, wind", then all sound instances + that had either "level1" or "wind" would match. If you want to match all labels, + then use the + sign first (for example, "+level1, +wind" would only match sound instances that + had both "level1" and "wind"). You can also use the - sign before a label to not + match that label (so, "level1, -wind" would match all "level1" labeled sound instances that didn't have + a "wind" label). Finally, you can also use * and ? to match wildcard style labels (so, "gun*" + would match any sound instance with a label that starts with "gun"). + + Valid status flags are: + + $(MILESEVENTSOUNDSTATUS::MILESEVENT_SOUND_STATUS_PENDING)[MILESEVENT_SOUND_STATUS_PENDING] - these are new sound instances that were + created by events that had a "Start Sound Step". Note that these instances aren't audible yet, + so that you have a chance to modify game driven properties (like the 3D position) + on the sound before Miles begins to play it. + + $(MILESEVENTSOUNDSTATUS::MILESEVENT_SOUND_STATUS_PLAYING)[MILESEVENT_SOUND_STATUS_PLAYING] - these are sound instances that were previously + started and are continuing to play (you might update the 3D position for these, for example). + + $(MILESEVENTSOUNDSTATUS::MILESEVENT_SOUND_STATUS_COMPLETE)[MILESEVENT_SOUND_STATUS_COMPLETE] - these are sound instances that finished playing + since the last this frame (you might use this status to free any game related memory, for example). + + Example Usage: +${ + HMSSENUM SoundEnum = MSS_FIRST; + MILESEVENTSOUNDINFO Info; + + while ( $AIL_enumerate_sound_instances( &SoundEnum, 0, 0, &Info ) ) + { + if ( Info.Status != MILESEVENT_SOUND_STATUS_COMPLETE ) + { + game_SoundState* game_data= (game_SoundState*)( Info.UserBuffer ); + $AIL_set_sample_is_3D( Info.Sample, 1 ); + $AIL_set_sample_3D_position( Info.Sample, game_data->x, game_data->y, game_date->z ); + } + } + +$} +*/ + +EXPTYPEBEGIN typedef S32 MILESEVENTSOUNDSTATUS; +#define MILESEVENT_SOUND_STATUS_PENDING 0x1 +#define MILESEVENT_SOUND_STATUS_PLAYING 0x2 +#define MILESEVENT_SOUND_STATUS_COMPLETE 0x4 +EXPTYPEEND +/* + Specifies the status of a sound instance. + + $:MILESEVENT_SOUND_STATUS_PENDING New sound instances that were + created by events that had a "Start Sound Step". Note that these instances aren't audible yet, + so that you have a chance to modify game driven properties (like the 3D position) + on the sound before Miles begins to play it. + + $:MILESEVENT_SOUND_STATUS_PLAYING Sound instances that were previously + started and are continuing to play (you might update the 3D position for these, for example). + + $:MILESEVENT_SOUND_STATUS_COMPLETE Sound instances that finished playing + since the last this frame (you might use this status to free any game related memory, for example). + + These are the status values that each sound instance can have. Use $AIL_enumerate_sound_instances to retrieve them. +*/ + +EXPTYPEBEGIN typedef U32 MILESEVENTSOUNDFLAG; +#define MILESEVENT_SOUND_FLAG_MISSING_SOUND 0x1 +#define MILESEVENT_SOUND_FLAG_EVICTED 0x2 +#define MILESEVENT_SOUND_FLAG_WAITING_ASYNC 0x4 +#define MILESEVENT_SOUND_FLAG_PENDING_ASYNC 0x8 +#define MILESEVENT_SOUND_FLAG_FAILED_HITCH 0x10 +#define MILESEVENT_SOUND_FLAG_FAILED_ASYNC 0x20 +EXPTYPEEND +/* + Specifies the status of a sound instance. + + $:MILESEVENT_SOUND_FLAG_MISSING_SOUND The event system tried to look up the sound requested from a Start Sound event + and couldn't find anything in the loaded banks. + $:MILESEVENT_SOUND_FLAG_EVICTED The sound was evicted due to a sound instance limit being hit. Another sound was selected + as being higher priority, and this sound was stopped as a result. This can be the result of either a Label Sound Limit, + or a limit on the sound itself. + $:MILESEVENT_SOUND_FLAG_WAITING_ASYNC The sound is pending because the data for it is currently being loaded. + The sound will start when sufficient data has been loaded to hopefully avoid a skip. + $:MILESEVENT_SONUD_FLAG_PENDING_ASYNC The sound has started playing, but the data still isn't completely loaded, and it's possible + that the sound playback will catch up to the read position under poor I/O conditions. + $:MILESEVENT_SOUND_FLAG_FAILED_HITCH The sound meta data was found, but the sound was not in memory, and the Start Sound event + was marked as "Must Be Cached". To prevent this, either clear the flag in the event, which will cause a start delay as the + sound data is asynchronously loaded, or specify the sound in a Cache Sounds step prior to attempting to start it. + $:MILESEVENT_SOUND_FLAG_FAILED_ASYNC The sound tried to load and the asynchronous I/O operation failed - most likely either the media + was removed during load, or the file was not found. + + These are the flag values that each sound instance can have. Use $AIL_enumerate_sound_instances to retrieve them. Instances + may have more than one flag, logically 'or'ed together. +*/ + +DXDEC EXPAPI S32 AILCALL AIL_complete_event_queue_processing( void ); +/* + Completes the queue processing (which is started with $AIL_begin_event_queue_processing ). + + $:return Returns 0 on failure. + + This function must be called as a pair with $AIL_begin_event_queue_processing. + + In $AIL_begin_event_queue_processing, all the new sound instances are queued up, but they haven't + started playing yet. Old sound instances that have finished playing are still valid - they + haven't been freed yet. $AIL_complete_event_queue_processing actually starts the sound instances + and frees the completed ones - it's the 2nd half of the event processing. + + Usually you call $AIL_enumerate_sound_instances before this function to manage all the sound + instances. +*/ + +DXDEC EXPAPI U64 AILCALL AIL_stop_sound_instances(char const * label_query, U64 apply_to_ID); +/* + Allows the programmer to manually enqueue a stop sound event into the event system. + + $:label_query A query to match sound instance labels against. Use 0 to skip label matching. + $:apply_to_ID An optional value returned from a previous $AIL_enqueue_event or $AIL_enumerate_sound_instances that + tells Miles to stop only those instances who's QueuedID,InstanceID,or EventID matches this value. + $:return Returns a non-zero queue ID on success. + + Enqueues an event to stop all sounds matching the specified label query (see $AIL_enumerate_sound_instances + for a description of the label_query format). + + Usually the programmer should trigger a named event that the sound designed can fill out to stop the necessary sounds, + however, if a single sound (for example associated with an enemy that the player just killed) needs to be stopped, + this function accomplishes that, and is captured by the auditioner for replay. +*/ + +DXDEC EXPAPI U64 AILCALL AIL_pause_sound_instances(char const * label_query, U64 apply_to_ID); +/* + Allows the programmer to manually enqueue a pause sound event into the event system. + + $:label_query A query to match sound instance labels against. Use 0 to skip label matching. + $:apply_to_ID An optional value returned from a previous $AIL_enqueue_event or $AIL_enumerate_sound_instances that + tells Miles to pause only those instances who's QueuedID,InstanceID,or EventID matches this value. + $:return Returns a non-zero queue ID on success. + + Enqueues an event to pause all sounds matching the specified label query (see $AIL_enumerate_sound_instances + for a description of the label_query format). + + Usually the programmer should trigger a named event that the sound designed can fill out to pause the necessary sounds, + however, if a single sound (for example associated with an enemy that has been put in to stasis) needs to be paused, + this function accomplishes that, and is captured by the auditioner for replay. +*/ + +DXDEC EXPAPI U64 AILCALL AIL_resume_sound_instances(char const * label_query, U64 apply_to_ID); +/* + Allows the programmer to manually enqueue a resume sound event into the event system. + + $:label_query A query to match sound instance labels against. Use 0 to skip label matching. + $:apply_to_ID An optional value returned from a previous $AIL_enqueue_event or $AIL_enumerate_sound_instances that + tells Miles to resume only those instances who's QueuedID,InstanceID,or EventID matches this value. + $:return Returns a non-zero enqueue ID on success. + + Enqueues an event to resume all sounds matching the specified label query (see $AIL_enumerate_sound_instances + for a description of the label_query format). + + Usually the programmer should trigger a named event that the sound designed can fill out to resume the necessary sounds, + however, if a single sound (for example associated with an enemy that has been restored from stasis) needs to be resumed, + this function accomplishes that, and is captured by the auditioner for replay. +*/ + +DXDEC EXPAPI U64 AILCALL AIL_start_sound_instance(HMSOUNDBANK bank, char const * sound, U8 loop_count, + S32 should_stream, char const * labels, void* user_buffer, S32 user_buffer_len, S32 enqueue_flags ); +/* + Allows the programmer to manually enqueue a start sound event into the event system. + + $:bank The bank containing the sound to start. + $:sound The name of the sound file to start, including bank name, e.g. "BankName/SoundName" + $:loop_count The loop count to assign to the sound. 0 for infinite, 1 for play once, or just the number of times to loop. + $:stream Non-zero if the sound playback should stream off the disc. + $:labels An optional comma-delimited list of labels to assign to the sound playback. + $:user_buffer See the user_buffer description in $AIL_enqueue_event. + $:user_buffer_len See the user_buffer_len description in $AIL_enqueue_event. + $:enqueue_flags See the enqueue_flags description in $AIL_enqueue_event. + $:return Returns a non-zero EnqueueID on success. + + Enqueues an event to start the specified sound asset. + + Usually the programmer should trigger an event that the sound designer has specifically + create to start the appropriate sounds, but this function gives the programmer + manual control, if necessary. This function is not captured by the auditioner. +*/ + +DXDEC EXPAPI void AILCALL AIL_clear_event_queue( void ); +/* + Removes all pending events that you have enqueued. + + This function will clears the list of all events that you have previously enqueued. +*/ + + +DXDEC EXPAPI S32 AILCALL AIL_set_sound_label_limits(HEVENTSYSTEM system, char const* sound_limits); +/* + Sets the maximum number of sounds that matches a particular label. + + $:sound_limits A string that defines one or more limits on a label by label basis. The string should + be of the form "label1name label1count:label2name label2count". + $:return Returns 0 on failure (usually a bad limit string). + + Every time an event triggers a sound to be played, the sound limits are checked, and, if exceeded, a sound is dropped (based + on the settings in the event step). + + Usually event limits are set by a sound designer via an event, but this lets the programmer override the limits at runtime. + Note that this replaces those events, it does not supplement. +*/ + +DXDEC EXPAPI S32 AILCALL AIL_enumerate_preset_persists(HEVENTSYSTEM system, HMSSENUM* next, EXPOUT char const ** name); +/* + Enumerates the current persisted presets that active in the system. + + $:system The system to enumerate the persists for, or 0 to use the default system. + $:next Enumeration token - initialize to MSS_FIRST before the first call. + $:name Pointer to a char* that receives the name of the persist. NOTE + that this pointer can change frame to frame and should be immediately copied to a client-allocated + buffer if persistence is desired. + $:return Returns 0 when enumeration is complete. + + This function lets you enumerate all the persisting presets that are currently active in the system. It + is mostly a debugging aid. +*/ + +DXDEC EXPAPI char * AILCALL AIL_text_dump_event_system(void); +/* + Returns a big string describing the current state of the event system. + + $:return String description of current systems state. + + This function is a debugging aid - it can be used to show all of the active allocations, + active sounds, etc. + + You must delete the pointer returned from this function with $AIL_mem_free_lock. +*/ + +EXPTYPE typedef struct _MILESEVENTSTATE +{ + S32 CommandBufferSize; + S32 HeapSize; + S32 HeapRemaining; + S32 LoadedSoundCount; + S32 PlayingSoundCount; + S32 LoadedBankCount; + S32 PersistCount; + + S32 SoundBankManagementMemory; + S32 SoundDataMemory; +} MILESEVENTSTATE; +/* + returns the current state of the Miles Event System. + + $:CommandBufferSize The size of the command buffer in bytes. See also the $AIL_startup_event_system. + $:HeapSize The total size of memory used by the event system for management structures, and is allocated during startup. This does not include loaded file sizes. + $:HeapRemaining The number of bytes in HeapSize that is remaining. + $:LoadedSoundCount The number of sounds loaded and ready to play via cache event steps. + $:PlayingSoundCount The number of sounds currently playing via start sound event steps. + $:LoadedBankCount The number of sound banks loaded in the system via cache event steps, or AIL_add_soundbank. + $:PersistCount The number of presets persisted via the persist event step. + $:SoundBankManagementMemory The number of bytes used for the management of the loaded sound banks. + $:SoundDataMemory The number of bytes used in file sizes - remember this is not included in HeapSize. Streaming overhead is not included in this number, only fully loaded sounds. + + This structure returns debugging info about the event system. It is used with $AIL_event_system_state. +*/ + +EXPGROUP(Miles High Level Callbacks) + +EXPAPI typedef void AILCALLBACK MilesBankFreeAll( void ); +/* + callback to free all user managed bank memory. +*/ + +EXPAPI typedef void * AILCALLBACK MilesBankGetPreset( char const * name ); +/* + callback to retrieve a sound preset. +*/ + +EXPAPI typedef void * AILCALLBACK MilesBankGetEnvironment( char const * name ); +/* + callback to retrieve an environment preset. +*/ +EXPAPI typedef S32 AILCALLBACK MilesBankGetSound(char const* SoundAssetName, char* SoundFileName, MILESBANKSOUNDINFO* o_SoundInfo ); +/* + callback to return whether the sound asset is in the bank, and, if so, what the final data filename is. + + In order to externally deploy sound files, you will need to register your own GetSound callback. This is detailed in the + eventexternal example program. + + This returns the len of the buffer required for the output file name if SoundFileName is zero. +*/ + +EXPAPI typedef void * AILCALLBACK MilesBankGetEvent( char const * name ); +/* + callback to retrieve an event. +*/ + +EXPAPI typedef void * AILCALLBACK MilesBankGetMarkerList( char const * name ); +/* + callback to retrieve a sound marker list. +*/ + +EXPAPI typedef S32 AILCALLBACK MilesBankGetLoadedCount( void ); +/* + callback to retrieve the number of loaded sound banks. +*/ + +EXPAPI typedef S32 AILCALLBACK MilesBankGetMemUsage( void ); +/* + callback to retrieve the total memory in use. +*/ + +EXPAPI typedef char const * AILCALLBACK MilesBankGetLoadedName( S32 index ); +/* + callback to retrieve the file name of a sound index. +*/ + + +EXPTYPE typedef struct _MILESBANKFUNCTIONS +{ + MilesBankFreeAll * FreeAll; + MilesBankGetPreset * GetPreset; + MilesBankGetEnvironment * GetEnvironment; + MilesBankGetSound * GetSound; + MilesBankGetEvent * GetEvent; + MilesBankGetMarkerList * GetMarkerList; + MilesBankGetLoadedCount * GetLoadedCount; + MilesBankGetMemUsage * GetMemUsage; + MilesBankGetLoadedName * GetLoadedName; +} MILESBANKFUNCTIONS; +/* + specifies callbacks for each of the Miles event system. + + $:FreeAll Callback that tells you to free all user-side bank memory. + $:GetPreset Callback to retrieve a sound preset. + $:GetEnvironment Callback to retrieve an environment preset. + $:GetSound Callback to return the actual filename of a sound asset. + $:GetEvent Callback to retrieve a sound event. + $:GetMarkerList Callback to retrieve a sound marker list. + $:GetLoadedCount Callback to retrieve a count of loaded sound banks. + $:GetMemUsage Callback to retrieve the amount of memory in use. + $:GetLoadedName Callback to retrieve the filename for a sound asset index. + + This structure is used to provide overrides for all of the high-level loading + functionality. +*/ + +EXPGROUP(Miles High Level Event System) + +DXDEC EXPAPI void AILCALL AIL_set_event_sample_functions(HSAMPLE (*CreateSampleCallback)(char const* SoundName, char const* SoundFileName, HDIGDRIVER dig, void* UserBuffer, S32 UserBufferLen), void (*ReleaseSampleCallback)(HSAMPLE)); +/* + Allows you to manage sound data availability and sample handles. + + $:CreateSampleCallback Function that will be called when a sample handle is needed. + $:ReleaseSampleCallback Function that will be called when a sample is no longer needed. + + A created sample is required to have all data pointers necessary to play - e.g. + the event system needs to be able to just do a AIL_start_sample() on the returned + handle and have it work. + + In the callback, SoundName is the name of the asset in Miles Studio, and SoundFileName + is the value returned from Container_GetSound() (see also $AIL_set_event_bank_functions). + +*/ + +DXDEC EXPAPI void AILCALL AIL_set_event_bank_functions(MILESBANKFUNCTIONS const * Functions); +/* + Allows you to override the internal bank file resource management.. + + $:Functions A pointer to a structure containing all the callback functions. + + This function is used to completely override the high-level resource management system. + It's not for overriding the IO - it's when you need much higher-level of control. Primarily + targeted internally for the Auditioner to use, it also is used when deploying sound files + externally. +*/ + +DXDEC EXPAPI MILESBANKFUNCTIONS const* AILCALL AIL_get_event_bank_functions(); +/* + Returns the current functions used to retrieve and poll bank assets. +*/ + + +typedef S32 AILCALLBACK AuditionStatus(); +typedef S32 AILCALLBACK AuditionPump(); +typedef void* AILCALLBACK AuditionOpenBank(char const* i_FileName); +typedef S32 AILCALLBACK AuditionOpenComplete(void* i_Bank); +typedef void AILCALLBACK AuditionCloseBank(void* i_Bank); + +typedef void AILCALLBACK AuditionSuppress(S32 i_IsSuppressed); +typedef void AILCALLBACK AuditionFrameStart(); +typedef void AILCALLBACK AuditionFrameEnd(); +typedef void AILCALLBACK AuditionDefragStart(); +typedef void AILCALLBACK AuditionSetBlend(U64 i_EventId, char const* i_Name); +typedef void AILCALLBACK AuditionSetPersist(U64 i_EventId, char const* i_Name, char const* i_Preset); +typedef void AILCALLBACK AuditionEvent(char const* i_EventName, U64 i_EventId, U64 i_Filter, S32 i_Exists, void* i_InitBlock, S32 i_InitBlockLen); +typedef void AILCALLBACK AuditionSound(U64 i_EventId, U64 i_SoundId, char const* i_Sound, char const* i_Labels, float i_Volume, S32 i_Delay, float i_Pitch); +typedef void AILCALLBACK AuditionSoundComplete(U64 i_SoundId); +typedef void AILCALLBACK AuditionSoundPlaying(U64 i_SoundId); +typedef void AILCALLBACK AuditionSoundFlags(U64 i_SoundId, S32 i_Flags); +typedef void AILCALLBACK AuditionSoundLimited(U64 i_SoundId, char const* i_Label); +typedef void AILCALLBACK AuditionSoundEvicted(U64 i_SoundId, U64 i_ForSound, S32 i_Reason); +typedef void AILCALLBACK AuditionControl(U64 i_EventId, char const* i_Labels, U8 i_ControlType, U64 i_Filter); +typedef void AILCALLBACK AuditionSoundBus(U64 i_SoundId, U8 i_BusIndex); + +typedef void AILCALLBACK AuditionError(U64 i_Id, char const* i_Details); + +typedef void AILCALLBACK AuditionAsyncQueued(U64 i_RelevantId, S32 i_AsyncId, char const* i_Asset); +typedef void AILCALLBACK AuditionAsyncLoad(S32 i_AsyncId, S32 i_ExpectedData); +typedef void AILCALLBACK AuditionAsyncError(S32 i_AsyncId); +typedef void AILCALLBACK AuditionAsyncComplete(S32 i_AsyncId, S32 i_DataLoaded); +typedef void AILCALLBACK AuditionAsyncCancel(S32 i_AsyncId); +typedef void AILCALLBACK AuditionListenerPosition(float x, float y, float z); +typedef void AILCALLBACK AuditionSoundPosition(U64 i_Sound, float x, float y, float z); +typedef void AILCALLBACK AuditionSendCPU(HDIGDRIVER i_Driver); +typedef void AILCALLBACK AuditionUpdateDataCount(S32 i_CurrentDataLoaded); +typedef void AILCALLBACK AuditionSendCount(S32 i_Count); +typedef void AILCALLBACK AuditionHandleSystemLoad(S32 i_Avail, S32 i_Total); +typedef void AILCALLBACK AuditionVarState(char const* i_Var, U64 i_SoundId, S32 i_Int, void* i_4ByteValue); +typedef void AILCALLBACK AuditionRampState(char const* i_Ramp, U64 i_SoundId, S32 i_Type, float i_Current); +typedef void AILCALLBACK AuditionSoundState(U64 i_SoundId, float i_FinalVol, float i_3DVol, float i_BlendVol, float i_BlendPitch, float i_RampVol, float i_RampWet, float i_RampLp, float i_RampRate); + +typedef void AILCALLBACK AuditionClearState(); +typedef void AILCALLBACK AuditionCompletionEvent(U64 i_CompletionEventId, U64 i_ParentSoundId); +typedef void AILCALLBACK AuditionAddRamp(U64 i_ParentSoundId, S32 i_Type, char const* i_Name, char const* i_Query, U64 i_EventId); + +typedef struct _MILESAUDITIONFUNCTIONS +{ + AuditionStatus* Status; + AuditionPump* Pump; + AuditionOpenBank* OpenBank; + AuditionOpenComplete* OpenComplete; + AuditionCloseBank* CloseBank; + + AuditionSuppress* Suppress; + AuditionFrameStart* FrameStart; + AuditionFrameEnd* FrameEnd; + AuditionDefragStart* DefragStart; + AuditionSetBlend* SetBlend; + AuditionSetPersist* SetPersist; + AuditionEvent* Event; + AuditionSound* Sound; + AuditionSoundComplete* SoundComplete; + AuditionSoundPlaying* SoundPlaying; + AuditionSoundFlags* SoundFlags; + AuditionSoundLimited* SoundLimited; + AuditionSoundEvicted* SoundEvicted; + AuditionControl* Control; + AuditionSoundBus* SoundBus; + + AuditionError* Error; + + AuditionAsyncQueued* AsyncQueued; + AuditionAsyncLoad* AsyncLoad; + AuditionAsyncError* AsyncError; + AuditionAsyncComplete* AsyncComplete; + AuditionAsyncCancel* AsyncCancel; + AuditionListenerPosition* ListenerPosition; + AuditionSoundPosition* SoundPosition; + AuditionSendCPU* SendCPU; + AuditionSendCount* SendCount; + AuditionUpdateDataCount* UpdateDataCount; + AuditionHandleSystemLoad* HandleSystemLoad; + AuditionVarState* VarState; + AuditionRampState* RampState; + AuditionSoundState* SoundState; + + AuditionClearState* ClearState; + AuditionCompletionEvent* CompletionEvent; + AuditionAddRamp* AddRamp; +} MILESAUDITIONFUNCTIONS; + +DXDEC void AILCALL MilesEventSetAuditionFunctions(MILESAUDITIONFUNCTIONS const* i_Functions); + +// Auditioner lib functions. +EXPGROUP(auditioning) + +EXPTYPEBEGIN typedef S32 MILESAUDITIONCONNECTRESULT; +#define MILES_CONNECTED 0 +#define MILES_CONNECT_FAILED 1 +#define MILES_HOST_NOT_FOUND 2 +#define MILES_SERVER_ERROR 3 +EXPTYPEEND +/* + Return values for $AIL_audition_connect. + + $:MILES_CONNECTED The Auditioner connected and successfully executed the handshake. + $:MILES_CONNECT_FAILED The Auditioner couldn't connect - either the IP wasn't valid, or Miles Sound Studio wasn't accepting connections. + $:MILES_HOST_NOT_FOUND The given host name could not be resolved to an IP. + $:MILES_SERVER_ERROR We connected, but the server was either another app on the same port, or the server version was incorrect. +*/ + +DXDEC EXPAPI S32 AILCALL AIL_audition_connect(char const* i_Address); +/* + Connect to a currently running Miles Sound Studio. + + $:i_Address The IP or host name of the computer running Miles Sound Studio. Use $AIL_audition_local_host to connect to the same machine as the runtime. + $:return One of $MILESAUDITIONCONNECTRESULT + + The is a synchronous connection attempt to Miles Sound Studio - it will not return until it is happy with the connection + and the server, or a failure occurs. + + This must be called before any $AIL_add_soundbank calls. +*/ + +DXDEC EXPAPI char const* AILCALL AIL_audition_local_host(); +/* + Return the host name of the local machine. +*/ + +// Defines - must match values in studio/Common.h +EXPTYPEBEGIN typedef S32 MILESAUDITIONLANG; +#define MILES_LANG_ENGLISH 1 +#define MILES_LANG_FRENCH 2 +#define MILES_LANG_GERMAN 3 +#define MILES_LANG_SPANISH 4 +#define MILES_LANG_ITALIAN 5 +#define MILES_LANG_JAPANESE 6 +#define MILES_LANG_KOREAN 7 +#define MILES_LANG_CHINESE 8 +#define MILES_LANG_RUSSIAN 9 +EXPTYPEEND +/* + Values representing the various languages the high level tool allows. + + $:MILES_LANG_ENGLISH English + $:MILES_LANG_FRENCH French + $:MILES_LANG_GERMAN German + $:MILES_LANG_SPANISH Spanish + $:MILES_LANG_ITALIAN Italian + $:MILES_LANG_JAPANESE Japanese + $:MILES_LANG_KOREAN Korean + $:MILES_LANG_CHINESE Chinese + $:MILES_LANG_RUSSIAN Russian + + Values representing the various languages the high level tool allows. +*/ + +EXPTYPEBEGIN typedef S32 MILESAUDITIONPLAT; +#define MILES_PLAT_WIN 1 +#define MILES_PLAT_MAC 2 +#define MILES_PLAT_PS3 3 +#define MILES_PLAT_360 4 +#define MILES_PLAT_3DS 5 +#define MILES_PLAT_PSP 6 +#define MILES_PLAT_IPHONE 7 +#define MILES_PLAT_LINUX 8 +#define MILES_PLAT_WII 9 +#define MILES_PLAT_PSP2 10 +#define MILES_PLAT_WIIU 11 +#define MILES_PLAT_SEKRIT 12 +#define MILES_PLAT_SEKRIT2 13 +#define MILES_PLAT_WIN64 14 +#define MILES_PLAT_LINUX64 15 +#define MILES_PLAT_MAC64 16 +#define MILES_PLAT_WINRT32 17 +#define MILES_PLAT_WINRT64 18 +#define MILES_PLAT_WINPH32 19 +#define MILES_PLAT_ANDROID 20 + +EXPTYPEEND +/* + Values representing the various platforms the high level tool allows. + + $:MILES_PLAT_WIN Microsoft Win32/64 + $:MILES_PLAT_MAC Apple OSX + $:MILES_PLAT_PS3 Sony PS3 + $:MILES_PLAT_360 Microsoft XBox360 + $:MILES_PLAT_3DS Nintendo 3DS + $:MILES_PLAT_PSP Sony PSP + $:MILES_PLAT_IPHONE Apple iDevices + $:MILES_PLAT_LINUX Linux Flavors + $:MILES_PLAT_WII Nintendo Wii + $:MILES_PLAT_PSP2 Sony NGP + + Values representing the various platforms the high level tool allows. +*/ + +DXDEC EXPAPI S32 AILCALL AIL_audition_startup(S32 i_ProfileOnly, S32 i_Language, S32 i_Platform); +/* + Binds the Auditioner to the Miles Event Runtime. + + $:i_ProfileOnly Specify 0 to use assets from the connected Miles Sound Studio, and 1 to use assets from disc. + $:i_Language One of $MILESAUDITIONLANG, or zero to use Default assets. See comments below. + $:i_Platform One of $MILESAUDITIONPLAT, or zero to use the current platform. See comments below. + + The Auditioner can run in one of two modes - the first is standard mode, where all assets + are loaded from the server, and profiling data is sent back to the server. The second is + Profiling mode, where the assets are loaded exactly as they would be under normal execution, + but all of the profiling data is sent to the server. + + The $(AIL_audition_startup::i_Language) and the $(AIL_audition_startup::i_Platform) are used to determine what assets Miles Sound Studio sends + the Auditioner, and as a result are not used in Profiling Mode. Otherwise these are equivalent to + the options selected for compiling banks. + + This must be called before any $AIL_add_soundbank calls. +*/ + +DXDEC EXPAPI void AILCALL AIL_audition_shutdown(); +/* + Removes the Auditioner from the Miles Event Runtime. +*/ + +EXPGROUP(Miles High Level Event System) + +DXDEC EXPAPI void AILCALL AIL_event_system_state(HEVENTSYSTEM system, MILESEVENTSTATE* state); +/* + Returns an information structure about the current state of the Miles Event System. + + $:system The system to retrieve information for, or zero for the default system. + $:state A pointer to a structure to receive the state information. + + This function is a debugging aid - it returns information for the event system. +*/ + +DXDEC EXPAPI U32 AILCALL AIL_event_system_command_queue_remaining(); +/* + Returns the number of bytes remaining in the command buffer. + + This can be invalid for a number of reasons - first, if the + command buffer will need to wrap for the next queue, the effective + bytes remaining will be lower. Second, if an enqueue occurs on another + thread in the interim, the value will be outdated. +*/ + +DXDEC EXPAPI S32 AILCALL AIL_get_event_length(char const* i_EventName); +/* + Returns the length of the first sound referenced in the named event, in milliseconds. + + $:i_EventName The name of an event that starts a sound. + $:return The length in milliseconds, or 0 if there is an error, or the event has no sound references, or the sound was not found. + + This looks up the given event and searches for the first Start Sound event step, then + uses the first sound name in its list to look up the length. As such, if the start sound + step has multiple sounds, the rest will be ignored. +*/ + +// Callback for the error handler. +EXPAPI typedef void AILCALLBACK AILEVENTERRORCB(S64 i_RelevantId, char const* i_Resource); +/* + The function prototype to use for a callback that will be made when the event system + encounters an unrecoverable error. + + $:i_RelevantId The ID of the asset that encountered the error, as best known. EventID or SoundID. + $:i_Resource A string representing the name of the resource the error is in regards to, or 0 if unknown. + + The error description can be retrieved via $AIL_last_error. +*/ + + + +EXPAPI typedef S32 AILCALLBACK MSS_USER_RAND( void ); +/* + The function definition to use when defining your own random function. + + You can define a function with this prototype and pass it to $AIL_register_random + if you want to tie the Miles random calls in with your game's (for logging and such). +*/ + +DXDEC EXPAPI void AILCALL AIL_set_event_error_callback(AILEVENTERRORCB * i_ErrorCallback); +/* + Set the error handler for the event system. + + $:i_ErrorHandler The function to call when an error is encountered. + + Generally the event system handles errors gracefully - the only noticeable effect + is that a given sound won't play, or a preset doesn't get set. As a result, the errors + can sometimes be somewhat invisible. This function allows you to see what went wrong, + when it went wrong. + + The basic usage is to have the callback check $AIL_last_error() for the overall category of + failure. The parameter passed to the callback might provide some context, but it can and will + be zero on occasion. Generally it will represent the resource string that is being worked on when the error + occurred. + + Note that there are two out of memory errors - one is the event system ran out of memory - meaning + the value passed in to $AIL_startup_event_system was insufficient for the current load, and + the other is the memory used for sound data - allocated via $AIL_mem_alloc_lock - ran out. +*/ + + +DXDEC EXPAPI void AILCALL AIL_register_random(MSS_USER_RAND * rand_func); +/* + Sets the function that Miles will call to obtain a random number. + + Use this function to set your own random function that the Miles Event System will call when it needs a random number. + This lets you control the determinism of the event system. +*/ + + + + +#ifdef MSS_FLT_SUPPORTED + +// +// Filter result codes +// + +typedef SINTa FLTRESULT; + +#define FLT_NOERR 0 // Success -- no error +#define FLT_NOT_ENABLED 1 // FLT not enabled +#define FLT_ALREADY_STARTED 2 // FLT already started +#define FLT_INVALID_PARAM 3 // Invalid parameters used +#define FLT_INTERNAL_ERR 4 // Internal error in FLT driver +#define FLT_OUT_OF_MEM 5 // Out of system RAM +#define FLT_ERR_NOT_IMPLEMENTED 6 // Feature not implemented +#define FLT_NOT_FOUND 7 // FLT supported device not found +#define FLT_NOT_INIT 8 // FLT not initialized +#define FLT_CLOSE_ERR 9 // FLT not closed correctly + +//############################################################################ +//## ## +//## Interface "MSS pipeline filter" (some functions shared by ## +//## "MSS voice filter") ## +//## ## +//############################################################################ + +typedef FLTRESULT (AILCALL *FLT_STARTUP)(void); + +typedef FLTRESULT (AILCALL *FLT_SHUTDOWN)(void); + +typedef C8 * (AILCALL *FLT_ERROR)(void); + +typedef HDRIVERSTATE (AILCALL *FLT_OPEN_DRIVER) (MSS_ALLOC_TYPE * palloc, + MSS_FREE_TYPE * pfree, + UINTa user, + HDIGDRIVER dig, void * memory); + +typedef FLTRESULT (AILCALL *FLT_CLOSE_DRIVER) (HDRIVERSTATE state); + +typedef void (AILCALL *FLT_PREMIX_PROCESS) (HDRIVERSTATE driver); + +typedef S32 (AILCALL *FLT_POSTMIX_PROCESS) (HDRIVERSTATE driver, void *output_buffer); + +//############################################################################ +//## ## +//## Interface "Pipeline filter sample services" ## +//## ## +//############################################################################ + +typedef HSAMPLESTATE (AILCALL * FLTSMP_OPEN_SAMPLE) (HDRIVERSTATE driver, + HSAMPLE S, + void * memory); + +typedef FLTRESULT (AILCALL * FLTSMP_CLOSE_SAMPLE) (HSAMPLESTATE state); + +typedef void (AILCALL * FLTSMP_SAMPLE_PROCESS) (HSAMPLESTATE state, + void * source_buffer, + void * dest_buffer, // may be the same as src + S32 n_samples, + S32 is_stereo ); + +typedef S32 (AILCALL * FLTSMP_SAMPLE_PROPERTY) (HSAMPLESTATE state, + HPROPERTY property, + void* before_value, + void const* new_value, + void* after_value + ); + +//############################################################################ +//## ## +//## Interface "MSS output filter" ## +//## ## +//############################################################################ + +typedef S32 (AILCALL * VFLT_ASSIGN_SAMPLE_VOICE) (HDRIVERSTATE driver, + HSAMPLE S); + +typedef void (AILCALL * VFLT_RELEASE_SAMPLE_VOICE) (HDRIVERSTATE driver, + HSAMPLE S); + +typedef S32 (AILCALL * VFLT_START_SAMPLE_VOICE) (HDRIVERSTATE driver, + HSAMPLE S); + +//############################################################################ +//## ## +//## Interface "Voice filter driver services" ## +//## ## +//############################################################################ + +typedef S32 (AILCALL * VDRV_DRIVER_PROPERTY) (HDRIVERSTATE driver, + HPROPERTY property, + void* before_value, + void const* new_value, + void* after_value + ); + +typedef S32 (AILCALL * VDRV_FORCE_UPDATE) (HDRIVERSTATE driver); + +//############################################################################ +//## ## +//## Interface "Voice filter sample services" ## +//## ## +//############################################################################ + +typedef S32 (AILCALL * VSMP_SAMPLE_PROPERTY) (HSAMPLE S, + HPROPERTY property, + void* before_value, + void const* new_value, + void* after_value + ); + +// +// Pipeline filter calls +// + +DXDEC HPROVIDER AILCALL AIL_digital_output_filter (HDIGDRIVER dig); + +DXDEC S32 AILCALL AIL_enumerate_filters (HMSSENUM *next, + HPROVIDER *dest, + C8 * *name); +DXDEC HDRIVERSTATE + AILCALL AIL_open_filter (HPROVIDER lib, + HDIGDRIVER dig); + +DXDEC void AILCALL AIL_close_filter (HDRIVERSTATE filter); + +DXDEC S32 AILCALL AIL_find_filter (C8 const *name, + HPROVIDER *ret); + +DXDEC S32 AILCALL AIL_enumerate_filter_properties + (HPROVIDER lib, + HMSSENUM * next, + RIB_INTERFACE_ENTRY * dest); + +DXDEC S32 AILCALL AIL_filter_property (HPROVIDER lib, + C8 const* name, + void* before_value, + void const* new_value, + void* after_value + ); + +DXDEC S32 AILCALL AIL_enumerate_output_filter_driver_properties + (HPROVIDER lib, + HMSSENUM * next, + RIB_INTERFACE_ENTRY * dest); + +DXDEC S32 AILCALL AIL_output_filter_driver_property + (HDIGDRIVER dig, + C8 const * name, + void* before_value, + void const* new_value, + void* after_value + ); + +DXDEC S32 AILCALL AIL_enumerate_output_filter_sample_properties + (HPROVIDER lib, + HMSSENUM * next, + RIB_INTERFACE_ENTRY * dest); + +DXDEC S32 AILCALL AIL_enumerate_filter_sample_properties + (HPROVIDER lib, + HMSSENUM * next, + RIB_INTERFACE_ENTRY * dest); + +DXDEC S32 AILCALL AIL_enumerate_sample_stage_properties + (HSAMPLE S, + SAMPLESTAGE stage, + HMSSENUM * next, + RIB_INTERFACE_ENTRY * dest); + +DXDEC S32 AILCALL AIL_sample_stage_property + (HSAMPLE S, + SAMPLESTAGE stage, + C8 const * name, + S32 channel, + void* before_value, + void const* new_value, + void* after_value + ); + +#define AIL_filter_sample_property(S,name,beforev,newv,afterv) AIL_sample_stage_property((S),SP_FILTER_0,(name),-1,(beforev),(newv),(afterv)) + +typedef struct _FLTPROVIDER +{ + S32 provider_flags; + S32 driver_size; + S32 sample_size; + + PROVIDER_PROPERTY PROVIDER_property; + + FLT_STARTUP startup; + FLT_ERROR error; + FLT_SHUTDOWN shutdown; + FLT_OPEN_DRIVER open_driver; + FLT_CLOSE_DRIVER close_driver; + FLT_PREMIX_PROCESS premix_process; + FLT_POSTMIX_PROCESS postmix_process; + + FLTSMP_OPEN_SAMPLE open_sample; + FLTSMP_CLOSE_SAMPLE close_sample; + FLTSMP_SAMPLE_PROCESS sample_process; + FLTSMP_SAMPLE_PROPERTY sample_property; + + VFLT_ASSIGN_SAMPLE_VOICE assign_sample_voice; + VFLT_RELEASE_SAMPLE_VOICE release_sample_voice; + VFLT_START_SAMPLE_VOICE start_sample_voice; + + VDRV_DRIVER_PROPERTY driver_property; + VDRV_FORCE_UPDATE force_update; + + VSMP_SAMPLE_PROPERTY output_sample_property; + + HDIGDRIVER dig; + HPROVIDER provider; + HDRIVERSTATE driver_state; + + struct _FLTPROVIDER *next; +} FLTPROVIDER; + +// +// Values for "Flags" property exported by all MSS Pipeline Filter and MSS Output Filter +// providers +// + +#define FPROV_ON_SAMPLES 0x0001 // Pipeline filter that operates on input samples (and is enumerated by AIL_enumerate_filters) +#define FPROV_ON_POSTMIX 0x0002 // Pipeline filter that operates on the post mixed output (capture filter) +#define FPROV_MATRIX 0x0004 // This is a matrix output filter (e.g., SRS/Dolby) +#define FPROV_VOICE 0x0008 // This is a per-voice output filter (e.g., DirectSound 3D) +#define FPROV_3D 0x0010 // Output filter uses S3D substructure for positioning +#define FPROV_OCCLUSION 0x0020 // Output filter supports occlusion (doesn't need per-sample lowpass) +#define FPROV_EAX 0x0040 // Output filter supports EAX-compatible environmental reverb +#define FPROV_SIDECHAIN 0x0080 // Filter has an "Input" property on the 3rd index for side chaining. + +#define FPROV_SPU_MASK 0xff0000 // Mask here the SPU INDEX STARTS +#define FPROV_SPU_INDEX( val ) ( ( val >> 16 ) & 0xff ) +#define FPROV_MAKE_SPU_INDEX( val ) ( val << 16 ) + + + +#ifdef IS_WIN32 + +#define MSS_EAX_AUTO_GAIN 1 +#define MSS_EAX_AUTOWAH 2 +#define MSS_EAX_CHORUS 3 +#define MSS_EAX_DISTORTION 4 +#define MSS_EAX_ECHO 5 +#define MSS_EAX_EQUALIZER 6 +#define MSS_EAX_FLANGER 7 +#define MSS_EAX_FSHIFTER 8 +#define MSS_EAX_VMORPHER 9 +#define MSS_EAX_PSHIFTER 10 +#define MSS_EAX_RMODULATOR 11 +#define MSS_EAX_REVERB 12 + +typedef struct EAX_SAMPLE_SLOT_VOLUME +{ + S32 Slot; // 0, 1, 2, 3 + S32 Send; + S32 SendHF; + S32 Occlusion; + F32 OcclusionLFRatio; + F32 OcclusionRoomRatio; + F32 OcclusionDirectRatio; +} EAX_SAMPLE_SLOT_VOLUME; + +typedef struct EAX_SAMPLE_SLOT_VOLUMES +{ + U32 NumVolumes; // 0, 1, or 2 + EAX_SAMPLE_SLOT_VOLUME volumes[ 2 ]; +} EAX_SAMPLE_SLOT_VOLUMES; + +// Use this structure for EAX REVERB +typedef struct EAX_REVERB +{ + S32 Effect; // set to MSS_EAX_REVERB + S32 Volume; // -10000 to 0 + U32 Environment; // one of the ENVIRONMENT_ enums + F32 EnvironmentSize; // environment size in meters + F32 EnvironmentDiffusion; // environment diffusion + S32 Room; // room effect level (at mid frequencies) + S32 RoomHF; // relative room effect level at high frequencies + S32 RoomLF; // relative room effect level at low frequencies + F32 DecayTime; // reverberation decay time at mid frequencies + F32 DecayHFRatio; // high-frequency to mid-frequency decay time ratio + F32 DecayLFRatio; // low-frequency to mid-frequency decay time ratio + S32 Reflections; // early reflections level relative to room effect + F32 ReflectionsDelay; // initial reflection delay time + F32 ReflectionsPanX; // early reflections panning vector + F32 ReflectionsPanY; // early reflections panning vector + F32 ReflectionsPanZ; // early reflections panning vector + S32 Reverb; // late reverberation level relative to room effect + F32 ReverbDelay; // late reverberation delay time relative to initial reflection + F32 ReverbPanX; // late reverberation panning vector + F32 ReverbPanY; // late reverberation panning vector + F32 ReverbPanZ; // late reverberation panning vector + F32 EchoTime; // echo time + F32 EchoDepth; // echo depth + F32 ModulationTime; // modulation time + F32 ModulationDepth; // modulation depth + F32 AirAbsorptionHF; // change in level per meter at high frequencies + F32 HFReference; // reference high frequency + F32 LFReference; // reference low frequency + F32 RoomRolloffFactor; // like DS3D flRolloffFactor but for room effect + U32 Flags; // modifies the behavior of properties +} EAX_REVERB; + +// Use this structure for EAX AUTOGAIN +typedef struct EAX_AUTOGAIN +{ + S32 Effect; // set to MSS_EAX_AUTO_GAIN + S32 Volume; // -10000 to 0 + U32 OnOff; // Switch Compressor on or off (1 or 0) +} EAX_AUTOGAIN; + +// Use this structure for EAX AUTOWAH +typedef struct EAX_AUTOWAH +{ + S32 Effect; // set to MSS_EAX_AUTOWAH + S32 Volume; // -10000 to 0 + F32 AttackTime; // Attack time (seconds) + F32 ReleaseTime; // Release time (seconds) + S32 Resonance; // Resonance (mB) + S32 PeakLevel; // Peak level (mB) +} EAX_AUTOWAH; + +// Use this structure for EAX CHORUS +typedef struct EAX_CHORUS +{ + S32 Effect; // set to MSS_EAX_CHORUS + S32 Volume; // -10000 to 0 + U32 Waveform; // Waveform selector - 0 = sinusoid, 1 = triangle + S32 Phase; // Phase (Degrees) + F32 Rate; // Rate (Hz) + F32 Depth; // Depth (0 to 1) + F32 Feedback; // Feedback (-1 to 1) + F32 Delay; // Delay (seconds) +} EAX_CHORUS; + +// Use this structure for EAX DISTORTION +typedef struct EAX_DISTORTION +{ + S32 Effect; // set to MSS_EAX_DISTORTION + S32 Volume; // -10000 to 0 + F32 Edge; // Controls the shape of the distortion (0 to 1) + S32 Gain; // Controls the post distortion gain (mB) + F32 LowPassCutOff; // Controls the cut-off of the filter pre-distortion (Hz) + F32 EQCenter; // Controls the center frequency of the EQ post-distortion (Hz) + F32 EQBandwidth; // Controls the bandwidth of the EQ post-distortion (Hz) +} EAX_DISTORTION; + +// Use this structure for EAX ECHO +typedef struct EAX_ECHO +{ + S32 Effect; // set to MSS_EAX_ECHO + S32 Volume; // -10000 to 0 + F32 Delay; // Controls the initial delay time (seconds) + F32 LRDelay; // Controls the delay time between the first and second taps (seconds) + F32 Damping; // Controls a low-pass filter that dampens the echoes (0 to 1) + F32 Feedback; // Controls the duration of echo repetition (0 to 1) + F32 Spread; // Controls the left-right spread of the echoes +} EAX_ECHO; + +// Use this structure for EAXEQUALIZER_ALLPARAMETERS +typedef struct EAX_EQUALIZER +{ + S32 Effect; // set to MSS_EAX_EQUALIZER + S32 Volume; // -10000 to 0 + S32 LowGain; // (mB) + F32 LowCutOff; // (Hz) + S32 Mid1Gain; // (mB) + F32 Mid1Center; // (Hz) + F32 Mid1Width; // (octaves) + F32 Mid2Gain; // (mB) + F32 Mid2Center; // (Hz) + F32 Mid2Width; // (octaves) + S32 HighGain; // (mB) + F32 HighCutOff; // (Hz) +} EAX_EQUALIZER; + +// Use this structure for EAX FLANGER +typedef struct EAX_FLANGER +{ + S32 Effect; // set to MSS_EAX_FLANGER + S32 Volume; // -10000 to 0 + U32 Waveform; // Waveform selector - 0 = sinusoid, 1 = triangle + S32 Phase; // Phase (Degrees) + F32 Rate; // Rate (Hz) + F32 Depth; // Depth (0 to 1) + F32 Feedback; // Feedback (0 to 1) + F32 Delay; // Delay (seconds) +} EAX_FLANGER; + + +// Use this structure for EAX FREQUENCY SHIFTER +typedef struct EAX_FSHIFTER +{ + S32 Effect; // set to MSS_EAX_FSHIFTER + S32 Volume; // -10000 to 0 + F32 Frequency; // (Hz) + U32 LeftDirection; // direction - 0 = down, 1 = up, 2 = off + U32 RightDirection; // direction - 0 = down, 1 = up, 2 = off +} EAX_FSHIFTER; + +// Use this structure for EAX VOCAL MORPHER +typedef struct EAX_VMORPHER +{ + S32 Effect; // set to MSS_EAX_VMORPHER + S32 Volume; // -10000 to 0 + U32 PhonemeA; // phoneme: 0 to 29 - A E I O U AA AE AH AO EH ER IH IY UH UW B D G J K L M N P R S T V Z + S32 PhonemeACoarseTuning; // (semitones) + U32 PhonemeB; // phoneme: 0 to 29 - A E I O U AA AE AH AO EH ER IH IY UH UW B D G J K L M N P R S T V Z + S32 PhonemeBCoarseTuning; // (semitones) + U32 Waveform; // Waveform selector - 0 = sinusoid, 1 = triangle, 2 = sawtooth + F32 Rate; // (Hz) +} EAX_VMORPHER; + + +// Use this structure for EAX PITCH SHIFTER +typedef struct EAX_PSHIFTER +{ + S32 Effect; // set to MSS_EAX_PSHIFTER + S32 Volume; // -10000 to 0 + S32 CoarseTune; // Amount of pitch shift (semitones) + S32 FineTune; // Amount of pitch shift (cents) +} EAX_PSHIFTER; + +// Use this structure for EAX RING MODULATOR +typedef struct EAX_RMODULATOR +{ + S32 Effect; // set to MSS_EAX_RMODULATOR + S32 Volume; // -10000 to 0 + F32 Frequency; // Frequency of modulation (Hz) + F32 HighPassCutOff; // Cut-off frequency of high-pass filter (Hz) + U32 Waveform; // Waveform selector - 0 = sinusoid, 1 = triangle, 2 = sawtooth +} EAX_RMODULATOR; + +#endif + +#else // MSS_FLT_SUPPORTED + +typedef struct _FLTPROVIDER +{ + U32 junk; +} FLTPROVIDER; + +#endif // MSS_FLT_SUPPORTED + +#endif // MSS_BASIC + +RADDEFEND + +#endif // MSS_H diff --git a/Minecraft.Client/PSVita/Miles/include/rrCore.h b/Minecraft.Client/PSVita/Miles/include/rrCore.h new file mode 100644 index 00000000..e88b5f8c --- /dev/null +++ b/Minecraft.Client/PSVita/Miles/include/rrCore.h @@ -0,0 +1,2322 @@ +/// ======================================================================== +// (C) Copyright 1994- 2014 RAD Game Tools, Inc. Global types header file +// ======================================================================== + +#ifndef __RADRR_COREH__ +#define __RADRR_COREH__ +#define RADCOPYRIGHT "Copyright (C) 1994-2014, RAD Game Tools, Inc." + +// __RAD16__ means 16 bit code (Win16) +// __RAD32__ means 32 bit code (DOS, Win386, Win32s, Mac AND Win64) +// __RAD64__ means 64 bit code (x64) + +// Note oddness - __RAD32__ essentially means "at *least* 32-bit code". +// So, on 64-bit systems, both __RAD32__ and __RAD64__ will be defined. + +// __RADDOS__ means DOS code (16 or 32 bit) +// __RADWIN__ means Windows API (Win16, Win386, Win32s, Win64, Xbox, Xenon) +// __RADWINEXT__ means Windows 386 extender (Win386) +// __RADNT__ means Win32 or Win64 code +// __RADWINRTAPI__ means Windows RT API (Win 8, Win Phone, ARM, Durango) +// __RADMAC__ means Macintosh +// __RADCARBON__ means Carbon +// __RADMACH__ means MachO +// __RADXBOX__ means the XBox console +// __RADXENON__ means the Xenon console +// __RADDURANGO__ or __RADXBOXONE__ means Xbox One +// __RADNGC__ means the Nintendo GameCube +// __RADWII__ means the Nintendo Wii +// __RADWIIU__ means the Nintendo Wii U +// __RADNDS__ means the Nintendo DS +// __RADTWL__ means the Nintendo DSi (__RADNDS__ also defined) +// __RAD3DS__ means the Nintendo 3DS +// __RADPS2__ means the Sony PlayStation 2 +// __RADPSP__ means the Sony PlayStation Portable +// __RADPS3__ means the Sony PlayStation 3 +// __RADPS4__ means the Sony PlayStation 4 +// __RADANDROID__ means Android NDK +// __RADNACL__ means Native Client SDK +// __RADNTBUILDLINUX__ means building Linux on NT +// __RADLINUX__ means actually building on Linux (most likely with GCC) +// __RADPSP2__ means NGP +// __RADBSD__ means a BSD-style UNIX (OS X, FreeBSD, OpenBSD, NetBSD) +// __RADPOSIX__ means POSIX-compliant +// __RADQNX__ means QNX +// __RADIPHONE__ means iphone +// __RADIPHONESIM__ means iphone simulator + +// __RADX86__ means Intel x86 +// __RADMMX__ means Intel x86 MMX instructions are allowed +// __RADX64__ means Intel/AMD x64 (NOT IA64=Itanium) +// __RAD68K__ means 68K +// __RADPPC__ means PowerPC +// __RADMIPS__ means Mips (only R5900 right now) +// __RADARM__ mean ARM processors + +// __RADLITTLEENDIAN__ means processor is little-endian (x86) +// __RADBIGENDIAN__ means processor is big-endian (680x0, PPC) + +// __RADNOVARARGMACROS__ means #defines can't use ... + + #ifdef WINAPI_FAMILY + // If this is #defined, we might be in a Windows Store App. But + // VC++ by default #defines this to a symbolic name, not an integer + // value, and those names are defined in "winapifamily.h". So if + // WINAPI_FAMILY is #defined, #include the header so we can parse it. + #include + #define RAD_WINAPI_IS_APP (!WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)) + #else + #define RAD_WINAPI_IS_APP 0 + #endif + + #ifndef __RADRES__ + // Theoretically, this is to pad structs on platforms that don't support pragma pack or do it poorly. (PS3, PS2) + // In general it is assumed that your padding is set via pragma, so this is just a struct. + #define RADSTRUCT struct + + #ifdef __GNUC_MINOR__ + // make a combined GCC version for testing : + + #define __RAD_GCC_VERSION__ (__GNUC__ * 10000 \ + + __GNUC_MINOR__ * 100 \ + + __GNUC_PATCHLEVEL__) + + /* Test for GCC > 3.2.0 */ + // #if GCC_VERSION > 30200 + #endif + + #if defined(__RADX32__) + + #define __RADX86__ + #define __RADMMX__ + #define __RAD32__ + #define __RADLITTLEENDIAN__ + #define RADINLINE inline + #define RADRESTRICT __restrict + + // known platforms under the RAD generic build type + #if defined(_WIN32) || defined(_Windows) || defined(WIN32) || defined(__WINDOWS__) || defined(_WINDOWS) + #define __RADNT__ + #define __RADWIN__ + #elif (defined(__MWERKS__) && !defined(__INTEL__)) || defined(__MRC__) || defined(THINK_C) || defined(powerc) || defined(macintosh) || defined(__powerc) || defined(__APPLE__) || defined(__MACH__) + #define __RADMAC__ + #undef RADSTRUCT + #define RADSTRUCT struct __attribute__((__packed__)) + #elif defined(__linux__) + #define __RADLINUX__ + #undef RADSTRUCT + #define RADSTRUCT struct __attribute__((__packed__)) + #endif + +#elif defined(ANDROID) + #define __RADANDROID__ + #define __RAD32__ + #define __RADLITTLEENDIAN__ + #ifdef __i386__ + #define __RADX86__ + #else + #define __RADARM__ + #endif + #define RADINLINE inline + #define RADRESTRICT __restrict + #undef RADSTRUCT + #define RADSTRUCT struct __attribute__((__packed__)) + +#elif defined(__QNX__) + #define __RAD32__ + #define __RADQNX__ + +#ifdef __arm__ + #define __RADARM__ +#elif defined __i386__ + #define __RADX86__ +#else + #error Unknown processor +#endif + #define __RADLITTLEENDIAN__ + #define RADINLINE inline + #define RADRESTRICT __restrict + + #undef RADSTRUCT + #define RADSTRUCT struct __attribute__((__packed__)) +#elif defined(__linux__) && defined(__arm__) //This should pull in Raspberry Pi as well + + #define __RAD32__ + #define __RADLINUX__ + #define __RADARM__ + #define __RADLITTLEENDIAN__ + #define RADINLINE inline + #define RADRESTRICT __restrict + + #undef RADSTRUCT + #define RADSTRUCT struct __attribute__((__packed__)) + +#elif defined(__native_client__) + #define __RADNACL__ + #define __RAD32__ + #define __RADLITTLEENDIAN__ + #define __RADX86__ + #define RADINLINE inline + #define RADRESTRICT __restrict + + #undef RADSTRUCT + #define RADSTRUCT struct __attribute__((__packed__)) + + #elif defined(_DURANGO) || defined(_SEKRIT) || defined(_SEKRIT1) || defined(_XBOX_ONE) + + #define __RADDURANGO__ 1 + #define __RADXBOXONE__ 1 + #if !defined(__RADSEKRIT__) // keep sekrit around for a bit for compat + #define __RADSEKRIT__ 1 + #endif + + #define __RADWIN__ + #define __RAD32__ + #define __RAD64__ + #define __RADX64__ + #define __RADMMX__ + #define __RADX86__ + #define __RAD64REGS__ + #define __RADLITTLEENDIAN__ + #define RADINLINE __inline + #define RADRESTRICT __restrict + #define __RADWINRTAPI__ + + #elif defined(__ORBIS__) + + #define __RADPS4__ + #if !defined(__RADSEKRIT2__) // keep sekrit2 around for a bit for compat + #define __RADSEKRIT2__ 1 + #endif + #define __RAD32__ + #define __RAD64__ + #define __RADX64__ + #define __RADMMX__ + #define __RADX86__ + #define __RAD64REGS__ + #define __RADLITTLEENDIAN__ + #define RADINLINE inline + #define RADRESTRICT __restrict + + #undef RADSTRUCT + #define RADSTRUCT struct __attribute__((__packed__)) + + #elif defined(WINAPI_FAMILY) && RAD_WINAPI_IS_APP + + #define __RADWINRTAPI__ + #define __RADWIN__ + #define RADINLINE __inline + #define RADRESTRICT __restrict + + #if defined(_M_IX86) // WinRT on x86 + + #define __RAD32__ + #define __RADX86__ + #define __RADMMX__ + #define __RADLITTLEENDIAN__ + + #elif defined(_M_X64) // WinRT on x64 + #define __RAD32__ + #define __RAD64__ + #define __RADX86__ + #define __RADX64__ + #define __RADMMX__ + #define __RAD64REGS__ + #define __RADLITTLEENDIAN__ + + #elif defined(_M_ARM) // WinRT on ARM + + #define __RAD32__ + #define __RADARM__ + #define __RADLITTLEENDIAN__ + + #else + + #error Unrecognized WinRT platform! + + #endif + + #elif defined(_WIN64) + + #define __RADWIN__ + #define __RADNT__ + // See note at top for why both __RAD32__ and __RAD64__ are defined. + #define __RAD32__ + #define __RAD64__ + #define __RADX64__ + #define __RADMMX__ + #define __RADX86__ + #define __RAD64REGS__ + #define __RADLITTLEENDIAN__ + #define RADINLINE __inline + #define RADRESTRICT __restrict + + #elif defined(GENERIC_ARM) + + #define __RAD32__ + #define __RADARM__ + #define __RADLITTLEENDIAN__ + #define __RADFIXEDPOINT__ + #define RADINLINE inline + #if (defined(__GCC__) || defined(__GNUC__)) + #define RADRESTRICT __restrict + #else + #define RADRESTRICT // __restrict not supported on cw + #endif + #undef RADSTRUCT + #define RADSTRUCT struct __attribute__((__packed__)) + + #elif defined(CAFE) // has to be before HOLLYWOOD_REV since it also defines it + + #define __RADWIIU__ + #define __RAD32__ + #define __RADPPC__ + #define __RADBIGENDIAN__ + #define RADINLINE inline + #define RADRESTRICT __restrict + #undef RADSTRUCT + #define RADSTRUCT struct __attribute__((__packed__)) + + + #elif defined(HOLLYWOOD_REV) || defined(REVOLUTION) + + #define __RADWII__ + #define __RAD32__ + #define __RADPPC__ + #define __RADBIGENDIAN__ + #define RADINLINE inline + #define RADRESTRICT __restrict + + #elif defined(NN_PLATFORM_CTR) + + #define __RAD3DS__ + #define __RAD32__ + #define __RADARM__ + #define __RADLITTLEENDIAN__ + #define RADINLINE inline + #define RADRESTRICT + #undef RADSTRUCT + #define RADSTRUCT struct __attribute__((__packed__)) + + #elif defined(GEKKO) + + #define __RADNGC__ + #define __RAD32__ + #define __RADPPC__ + #define __RADBIGENDIAN__ + #define RADINLINE inline + #define RADRESTRICT // __restrict not supported on cw + + #elif defined(SDK_ARM9) || defined(SDK_TWL) || (defined(__arm) && defined(__MWERKS__)) + + #define __RADNDS__ + #define __RAD32__ + #define __RADARM__ + #define __RADLITTLEENDIAN__ + #define __RADFIXEDPOINT__ + #define RADINLINE inline + #if (defined(__GCC__) || defined(__GNUC__)) + #define RADRESTRICT __restrict + #else + #define RADRESTRICT // __restrict not supported on cw + #endif + + #if defined(SDK_TWL) + #define __RADTWL__ + #endif + + #elif defined(R5900) + + #define __RADPS2__ + #define __RAD32__ + #define __RADMIPS__ + #define __RADLITTLEENDIAN__ + #define RADINLINE inline + #define RADRESTRICT __restrict + #define __RAD64REGS__ + #define U128 u_long128 + + #if !defined(__MWERKS__) + #undef RADSTRUCT + #define RADSTRUCT struct __attribute__((__packed__)) + #endif + + #elif defined(__psp__) + + #define __RADPSP__ + #define __RAD32__ + #define __RADMIPS__ + #define __RADLITTLEENDIAN__ + #define RADINLINE inline + #define RADRESTRICT __restrict + + #undef RADSTRUCT + #define RADSTRUCT struct __attribute__((__packed__)) + + #elif defined(__psp2__) + + #undef RADSTRUCT + #define RADSTRUCT struct __attribute__((__packed__)) + + #define __RADPSP2__ + #define __RAD32__ + #define __RADARM__ + #define __RADLITTLEENDIAN__ + #define RADINLINE inline + #define RADRESTRICT __restrict + + // need packed attribute for struct with snc? + #elif defined(__CELLOS_LV2__) + + // CB change : 10-29-10 : RAD64REGS on PPU but NOT SPU + + #ifdef __SPU__ + #define __RADSPU__ + #define __RAD32__ + #define __RADCELL__ + #define __RADBIGENDIAN__ + #define RADINLINE inline + #define RADRESTRICT __restrict + #else + #define __RAD64REGS__ + #define __RADPS3__ + #define __RADPPC__ + #define __RAD32__ + #define __RADCELL__ + #define __RADBIGENDIAN__ + #define RADINLINE inline + #define RADRESTRICT __restrict + #define __RADALTIVEC__ + #endif + + #undef RADSTRUCT + #define RADSTRUCT struct __attribute__((__packed__)) + + #ifndef __LP32__ + #error "PS3 32bit ABI support only" + #endif + #elif (defined(__MWERKS__) && !defined(__INTEL__)) || defined(__MRC__) || defined(THINK_C) || defined(powerc) || defined(macintosh) || defined(__powerc) || defined(__APPLE__) || defined(__MACH__) + #ifdef __APPLE__ + #include "TargetConditionals.h" + #endif + + #if ((defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE) || (defined(TARGET_IPHONE_SIMULATOR) && TARGET_IPHONE_SIMULATOR)) + + // iPhone/iPad/iOS + #define __RADIPHONE__ + #define __RADMACAPI__ + + #define __RAD32__ + #if defined(__x86_64__) + #define __RAD64__ + #endif + + #define __RADLITTLEENDIAN__ + #define RADINLINE inline + #define RADRESTRICT __restrict + #define __RADMACH__ + + #undef RADSTRUCT + #define RADSTRUCT struct __attribute__((__packed__)) + + #if defined(TARGET_IPHONE_SIMULATOR) && TARGET_IPHONE_SIMULATOR + #if defined( __x86_64__) + #define __RADX64__ + #else + #define __RADX86__ + #endif + #define __RADIPHONESIM__ + #elif defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE + #define __RADARM__ + #endif + #else + + // An actual MacOSX machine + #define __RADMAC__ + #define __RADMACAPI__ + + #if defined(powerc) || defined(__powerc) || defined(__ppc__) + #define __RADPPC__ + #define __RADBIGENDIAN__ + #define __RADALTIVEC__ + #define RADRESTRICT + #elif defined(__i386__) + #define __RADX86__ + #define __RADMMX__ + #define __RADLITTLEENDIAN__ + #define RADRESTRICT __restrict + #elif defined(__x86_64__) + #define __RAD32__ + #define __RAD64__ + #define __RADX86__ + #define __RADX64__ + #define __RAD64REGS__ + #define __RADMMX__ + #define __RADLITTLEENDIAN__ + #define RADRESTRICT __restrict + #else + #define __RAD68K__ + #define __RADBIGENDIAN__ + #define __RADALTIVEC__ + #define RADRESTRICT + #endif + + #define __RAD32__ + + #if defined(__MWERKS__) + #if (defined(__cplusplus) || ! __option(only_std_keywords)) + #define RADINLINE inline + #endif + #ifdef __MACH__ + #define __RADMACH__ + #endif + #elif defined(__MRC__) + #if defined(__cplusplus) + #define RADINLINE inline + #endif + #elif defined(__GNUC__) || defined(__GNUG__) || defined(__MACH__) + #define RADINLINE inline + #define __RADMACH__ + + #undef RADRESTRICT /* could have been defined above... */ + #define RADRESTRICT __restrict + + #undef RADSTRUCT + #define RADSTRUCT struct __attribute__((__packed__)) + #endif + + #ifdef __RADX86__ + #ifndef __RADCARBON__ + #define __RADCARBON__ + #endif + #endif + + #ifdef TARGET_API_MAC_CARBON + #if TARGET_API_MAC_CARBON + #ifndef __RADCARBON__ + #define __RADCARBON__ + #endif + #endif + #endif + #endif + #elif defined(__linux__) + + #define __RADLINUX__ + #define __RADMMX__ + #define __RADLITTLEENDIAN__ + #define __RADX86__ + #ifdef __x86_64 + #define __RAD32__ + #define __RAD64__ + #define __RADX64__ + #define __RAD64REGS__ + #else + #define __RAD32__ + #endif + #define RADINLINE inline + #define RADRESTRICT __restrict + + #undef RADSTRUCT + #define RADSTRUCT struct __attribute__((__packed__)) + + #else + + #if _MSC_VER >= 1400 + #undef RADRESTRICT + #define RADRESTRICT __restrict + #else + #define RADRESTRICT + #define __RADNOVARARGMACROS__ + #endif + + #if defined(_XENON) || ( defined(_XBOX_VER) && (_XBOX_VER == 200) ) + // Remember that Xenon also defines _XBOX + #define __RADPPC__ + #define __RADBIGENDIAN__ + #define __RADALTIVEC__ + #else + #define __RADX86__ + #define __RADMMX__ + #define __RADLITTLEENDIAN__ + #endif + + #ifdef __MWERKS__ + #define _WIN32 + #endif + + #ifdef __DOS__ + #define __RADDOS__ + #define S64_DEFINED // turn off these types + #define U64_DEFINED + #define S64 double //should error + #define U64 double //should error + #define __RADNOVARARGMACROS__ + #endif + + #ifdef __386__ + #define __RAD32__ + #endif + + #ifdef _Windows //For Borland + #ifdef __WIN32__ + #define WIN32 + #else + #define __WINDOWS__ + #endif + #endif + + #ifdef _WINDOWS //For MS + #ifndef _WIN32 + #define __WINDOWS__ + #endif + #endif + + #ifdef _WIN32 + #if defined(_XENON) || ( defined(_XBOX_VER) && (_XBOX_VER == 200) ) + // Remember that Xenon also defines _XBOX + #define __RADXENON__ + #define __RAD64REGS__ + #elif defined(_XBOX) + #define __RADXBOX__ + #elif !defined(__RADWINRTAPI__) + #define __RADNT__ + #endif + #define __RADWIN__ + #define __RAD32__ + #else + #ifdef __NT__ + #if defined(_XENON) || (_XBOX_VER == 200) + // Remember that Xenon also defines _XBOX + #define __RADXENON__ + #define __RAD64REGS__ + #elif defined(_XBOX) + #define __RADXBOX__ + #else + #define __RADNT__ + #endif + #define __RADWIN__ + #define __RAD32__ + #else + #ifdef __WINDOWS_386__ + #define __RADWIN__ + #define __RADWINEXT__ + #define __RAD32__ + #define S64_DEFINED // turn off these types + #define U64_DEFINED + #define S64 double //should error + #define U64 double //should error + #else + #ifdef __WINDOWS__ + #define __RADWIN__ + #define __RAD16__ + #else + #ifdef WIN32 + #if defined(_XENON) || (_XBOX_VER == 200) + // Remember that Xenon also defines _XBOX + #define __RADXENON__ + #elif defined(_XBOX) + #define __RADXBOX__ + #else + #define __RADNT__ + #endif + #define __RADWIN__ + #define __RAD32__ + #endif + #endif + #endif + #endif + #endif + + #ifdef __WATCOMC__ + #define RADINLINE + #else + #define RADINLINE __inline + #endif + #endif + + #if defined __RADMAC__ || defined __RADIPHONE__ + #define __RADBSD__ + #endif + + #if defined __RADBSD__ || defined __RADLINUX__ + #define __RADPOSIX__ + #endif + + #if (!defined(__RADDOS__) && !defined(__RADWIN__) && !defined(__RADMAC__) && \ + !defined(__RADNGC__) && !defined(__RADNDS__) && !defined(__RADXBOX__) && \ + !defined(__RADXENON__) && !defined(__RADDURANGO__) && !defined(__RADPS4__) && !defined(__RADLINUX__) && !defined(__RADPS2__) && \ + !defined(__RADPSP__) && !defined(__RADPSP2__) && !defined(__RADPS3__) && !defined(__RADSPU__) && \ + !defined(__RADWII__) && !defined(__RADIPHONE__) && !defined(__RADX32__) && !defined(__RADARM__) && \ + !defined(__RADWIIU__) && !defined(__RADANDROID__) && !defined(__RADNACL__) && !defined (__RADQNX__) ) + #error "RAD.H did not detect your platform. Define DOS, WINDOWS, WIN32, macintosh, powerpc, or appropriate console." + #endif + + + #ifdef __RADFINAL__ + #define RADTODO(str) { char __str[0]=str; } + #else + #define RADTODO(str) + #endif + + #ifdef __RADX32__ + #if defined(_MSC_VER) + #define RADLINK __stdcall + #define RADEXPLINK __stdcall + #else + #define RADLINK __attribute__((stdcall)) + #define RADEXPLINK __attribute__((stdcall)) + #endif + #define RADEXPFUNC RADDEFFUNC + + #elif (defined(__RADNGC__) || defined(__RADWII__) || defined( __RADPS2__) || \ + defined(__RADPSP__) || defined(__RADPSP2__) || defined(__RADPS3__) || \ + defined(__RADSPU__) || defined(__RADNDS__) || defined(__RADIPHONE__) || \ + (defined(__RADARM__) && !defined(__RADWINRTAPI__)) || defined(__RADWIIU__) || defined(__RADPS4__) ) + + #define RADLINK + #define RADEXPLINK + #define RADEXPFUNC RADDEFFUNC + #define RADASMLINK + + #elif defined(__RADANDROID__) + #define RADLINK + #define RADEXPLINK + #define RADEXPFUNC RADDEFFUNC + #define RADASMLINK + #elif defined(__RADNACL__) + #define RADLINK + #define RADEXPLINK + #define RADEXPFUNC RADDEFFUNC + #define RADASMLINK + #elif defined(__RADLINUX__) || defined (__RADQNX__) + + #ifdef __RAD64__ + #define RADLINK + #define RADEXPLINK + #else + #define RADLINK __attribute__((cdecl)) + #define RADEXPLINK __attribute__((cdecl)) + #endif + + #define RADEXPFUNC RADDEFFUNC + #define RADASMLINK + + #elif defined(__RADMAC__) + + // this define is for CodeWarrior 11's stupid new libs (even though + // we don't use longlong's). + + #define __MSL_LONGLONG_SUPPORT__ + + #define RADLINK + #define RADEXPLINK + + #if defined(__CFM68K__) || defined(__MWERKS__) + #ifdef __RADINDLL__ + #define RADEXPFUNC RADDEFFUNC __declspec(export) + #else + #define RADEXPFUNC RADDEFFUNC __declspec(import) + #endif + #else + #if defined(__RADMACH__) && !defined(__MWERKS__) + #ifdef __RADINDLL__ + #define RADEXPFUNC RADDEFFUNC __attribute__((visibility("default"))) + #else + #define RADEXPFUNC RADDEFFUNC + #endif + #else + #define RADEXPFUNC RADDEFFUNC + #endif + #endif + #define RADASMLINK + + #else + + #ifdef __RADNT__ + #ifndef _WIN32 + #define _WIN32 + #endif + #ifndef WIN32 + #define WIN32 + #endif + #endif + + #ifdef __RADWIN__ + #ifdef __RAD32__ + + #ifdef __RADXBOX__ + + #define RADLINK __stdcall + #define RADEXPLINK __stdcall + #define RADEXPFUNC RADDEFFUNC + + #elif defined(__RADXENON__) || defined(__RADDURANGO__) + + #define RADLINK __stdcall + #define RADEXPLINK __stdcall + + #define RADEXPFUNC RADDEFFUNC + + #elif defined(__RADWINRTAPI__) + + #define RADLINK __stdcall + #define RADEXPLINK __stdcall + + #if ( defined(__RADINSTATICLIB__) || defined(__RADNOEXPORTS__ ) || ( defined(__RADNOEXEEXPORTS__) && ( !defined(__RADINDLL__) ) && ( !defined(__RADINSTATICLIB__) ) ) ) + #define RADEXPFUNC RADDEFFUNC + #else + #ifndef __RADINDLL__ + #define RADEXPFUNC RADDEFFUNC __declspec(dllimport) + #else + #define RADEXPFUNC RADDEFFUNC __declspec(dllexport) + #endif + #endif + + #elif defined(__RADNTBUILDLINUX__) + + #define RADLINK __cdecl + #define RADEXPLINK __cdecl + #define RADEXPFUNC RADDEFFUNC + + #else + #ifdef __RADNT__ + + #define RADLINK __stdcall + #define RADEXPLINK __stdcall + + #if ( defined(__RADINSTATICLIB__) || defined(__RADNOEXPORTS__ ) || ( defined(__RADNOEXEEXPORTS__) && ( !defined(__RADINDLL__) ) && ( !defined(__RADINSTATICLIB__) ) ) ) + #define RADEXPFUNC RADDEFFUNC + #else + #ifndef __RADINDLL__ + #define RADEXPFUNC RADDEFFUNC __declspec(dllimport) + #ifdef __BORLANDC__ + #if __BORLANDC__<=0x460 + #undef RADEXPFUNC + #define RADEXPFUNC RADDEFFUNC + #endif + #endif + #else + #define RADEXPFUNC RADDEFFUNC __declspec(dllexport) + #endif + #endif + #else + #define RADLINK __pascal + #define RADEXPLINK __far __pascal + #define RADEXPFUNC RADDEFFUNC + #endif + #endif + #else + #define RADLINK __pascal + #define RADEXPLINK __far __pascal __export + #define RADEXPFUNC RADDEFFUNC + #endif + #else + #define RADLINK __pascal + #define RADEXPLINK __pascal + #define RADEXPFUNC RADDEFFUNC + #endif + + #define RADASMLINK __cdecl + + #endif + + #if !defined(__RADXBOX__) && !defined(__RADXENON__) && !defined(__RADDURANGO__) && !defined(__RADXBOXONE__) + #ifdef __RADWIN__ + #ifndef _WINDOWS + #define _WINDOWS + #endif + #endif + #endif + + #ifdef __RADLITTLEENDIAN__ + #ifdef __RADBIGENDIAN__ + #error both endians !? + #endif + #endif + + #if !defined(__RADLITTLEENDIAN__) && !defined(__RADBIGENDIAN__) + #error neither endian! + #endif + + + //----------------------------------------------------------------- + + #ifndef RADDEFFUNC + + #ifdef __cplusplus + #define RADDEFFUNC extern "C" + #define RADDEFSTART extern "C" { + #define RADDEFEND } + #define RADDEFINEDATA extern "C" + #define RADDECLAREDATA extern "C" + #define RADDEFAULT( val ) =val + + #define RR_NAMESPACE rr + #define RR_NAMESPACE_START namespace RR_NAMESPACE { + #define RR_NAMESPACE_END }; + #define RR_NAMESPACE_USE using namespace RR_NAMESPACE; + + #else + #define RADDEFFUNC + #define RADDEFSTART + #define RADDEFEND + #define RADDEFINEDATA + #define RADDECLAREDATA extern + #define RADDEFAULT( val ) + + #define RR_NAMESPACE + #define RR_NAMESPACE_START + #define RR_NAMESPACE_END + #define RR_NAMESPACE_USE + + #endif + + #endif + + // probably s.b: RAD_DECLARE_ALIGNED(type, name, alignment) + #if (defined(__RADWII__) || defined(__RADWIIU__) || defined(__RADPSP__) || defined(__RADPSP2__) || \ + defined(__RADPS3__) || defined(__RADSPU__) || defined(__RADPS4__) || \ + defined(__RADLINUX__) || defined(__RADMAC__)) || defined(__RADNDS__) || defined(__RAD3DS__) || \ + defined(__RADIPHONE__) || defined(__RADANDROID__) || defined (__RADQNX__) + #define RAD_ALIGN(type,var,num) type __attribute__ ((aligned (num))) var + #elif (defined(__RADNGC__) || defined(__RADPS2__)) + #define RAD_ALIGN(type,var,num) __attribute__ ((aligned (num))) type var + #elif (defined(_MSC_VER) && (_MSC_VER >= 1300)) || defined(__RADWINRTAPI__) + #define RAD_ALIGN(type,var,num) type __declspec(align(num)) var + #else + // NOTE: / / is a guaranteed parse error in C/C++. + #define RAD_ALIGN(type,var,num) RAD_ALIGN_USED_BUT_NOT_DEFINED / / + #endif + + // WARNING : RAD_TLS should really only be used for debug/tools stuff + // it's not reliable because even if we are built as a lib, our lib can + // be put into a DLL and then it doesn't work + #if defined(__RADNT__) || defined(__RADXENON__) + #ifndef __RADINDLL__ + // note that you can't use this in windows DLLs + #define RAD_TLS(type,var) __declspec(thread) type var + #endif + #elif defined(__RADPS3__) || defined(__RADLINUX__) || defined(__RADMAC__) + // works on PS3/gcc I believe : + #define RAD_TLS(type,var) __thread type var + #else + // RAD_TLS not defined + #endif + + // Note that __RAD16__/__RAD32__/__RAD64__ refers to the size of a pointer. + // The size of integers is specified explicitly in the code, i.e. u32 or whatever. + + #define RAD_S8 signed char + #define RAD_U8 unsigned char + + #if defined(__RAD64__) + // Remember that __RAD32__ will also be defined! + #if defined(__RADX64__) + // x64 still has 32-bit ints! + #define RAD_U32 unsigned int + #define RAD_S32 signed int + // But pointers are 64 bits. + #if (_MSC_VER >= 1300 && defined(_Wp64) && _Wp64 ) + #define RAD_SINTa __w64 signed __int64 + #define RAD_UINTa __w64 unsigned __int64 + #else // non-vc.net compiler or /Wp64 turned off + #define RAD_UINTa unsigned long long + #define RAD_SINTa signed long long + #endif + #else + #error Unknown 64-bit processor (see radbase.h) + #endif + #elif defined(__RAD32__) + #define RAD_U32 unsigned int + #define RAD_S32 signed int + // Pointers are 32 bits. + + #if ( ( defined(_MSC_VER) && (_MSC_VER >= 1300 ) ) && ( defined(_Wp64) && ( _Wp64 ) ) ) + #define RAD_SINTa __w64 signed long + #define RAD_UINTa __w64 unsigned long + #else // non-vc.net compiler or /Wp64 turned off + #ifdef _Wp64 + #define RAD_SINTa signed long + #define RAD_UINTa unsigned long + #else + #define RAD_SINTa signed int + #define RAD_UINTa unsigned int + #endif + #endif + #else + #define RAD_U32 unsigned long + #define RAD_S32 signed long + // Pointers in 16-bit land are still 32 bits. + #define RAD_UINTa unsigned long + #define RAD_SINTa signed long + #endif + + #define RAD_F32 float + #if defined(__RADPS2__) || defined(__RADPSP__) + typedef RADSTRUCT RAD_F64 // do this so that we don't accidentally use doubles + { // while using the same space + RAD_U32 vals[ 2 ]; + } RAD_F64; + #define RAD_F64_OR_32 float // type is F64 if available, otherwise F32 + #else + #define RAD_F64 double + #define RAD_F64_OR_32 double // type is F64 if available, otherwise F32 + #endif + + #if (defined(__RADMAC__) || defined(__MRC__) || defined( __RADNGC__ ) || \ + defined(__RADLINUX__) || defined( __RADWII__ ) || defined(__RADWIIU__) || \ + defined(__RADNDS__) || defined(__RADPSP__) || defined(__RADPS3__) || defined(__RADPS4__) || \ + defined(__RADSPU__) || defined(__RADIPHONE__) || defined(__RADNACL__) || defined( __RADANDROID__) || defined( __RADQNX__ ) ) + #define RAD_U64 unsigned long long + #define RAD_S64 signed long long + #elif defined(__RADPS2__) + #define RAD_U64 unsigned long + #define RAD_S64 signed long + #elif defined(__RADARM__) + #define RAD_U64 unsigned long long + #define RAD_S64 signed long long + #elif defined(__RADX64__) || defined(__RAD32__) + #define RAD_U64 unsigned __int64 + #define RAD_S64 signed __int64 + #else + // 16-bit + typedef RADSTRUCT RAD_U64 // do this so that we don't accidentally use U64s + { // while using the same space + RAD_U32 vals[ 2 ]; + } RAD_U64; + typedef RADSTRUCT RAD_S64 // do this so that we don't accidentally use S64s + { // while using the same space + RAD_S32 vals[ 2 ]; + } RAD_S64; + #endif + + #if defined(__RAD32__) + #define PTR4 + #define RAD_U16 unsigned short + #define RAD_S16 signed short + #else + #define PTR4 __far + #define RAD_U16 unsigned int + #define RAD_S16 signed int + #endif + + //------------------------------------------------- + // RAD_PTRBITS and such defined here without using sizeof() + // so that they can be used in align() and other macros + + #ifdef __RAD64__ + + #define RAD_PTRBITS 64 + #define RAD_PTRBYTES 8 + #define RAD_TWOPTRBYTES 16 + + #else + + #define RAD_PTRBITS 32 + #define RAD_PTRBYTES 4 + #define RAD_TWOPTRBYTES 8 + + #endif + + + //------------------------------------------------- + // UINTr = int the size of a register + + #ifdef __RAD64REGS__ + + #define RAD_UINTr RAD_U64 + #define RAD_SINTr RAD_S64 + + #else + + #define RAD_UINTr RAD_U32 + #define RAD_SINTr RAD_S32 + + #endif + + //=========================================================================== + + /* + // CB : meh this is enough of a mess that it's probably best to just let each + #if defined(__RADX86__) && defined(_MSC_VER) && _MSC_VER >= 1300 + #define __RADX86INTRIN2003__ + #endif + */ + + // RADASSUME(expr) tells the compiler that expr is always true + // RADUNREACHABLE must never be reachable - even in event of error + // eg. it's okay for compiler to generate completely invalid code after RADUNREACHABLE + + #ifdef _MSC_VER + #define RADFORCEINLINE __forceinline + #if _MSC_VER >= 1300 + #define RADNOINLINE __declspec(noinline) + #else + #define RADNOINLINE + #endif + #define RADUNREACHABLE __assume(0) + #define RADASSUME(exp) __assume(exp) + #elif defined(__clang__) + #ifdef _DEBUG + #define RADFORCEINLINE inline + #else + #define RADFORCEINLINE inline __attribute((always_inline)) + #endif + #define RADNOINLINE __attribute__((noinline)) + + #define RADUNREACHABLE __builtin_unreachable() + + #if __has_builtin(__builtin_assume) + #define RADASSUME(exp) __builtin_assume(exp) + #else + #define RADASSUME(exp) RAD_STATEMENT_WRAPPER( if ( ! (exp) ) __builtin_unreachable(); ) + #endif + #elif (defined(__GCC__) || defined(__GNUC__)) || defined(ANDROID) + #ifdef _DEBUG + #define RADFORCEINLINE inline + #else + #define RADFORCEINLINE inline __attribute((always_inline)) + #endif + #define RADNOINLINE __attribute__((noinline)) + + #if __RAD_GCC_VERSION__ >= 40500 + #define RADUNREACHABLE __builtin_unreachable() + #define RADASSUME(exp) RAD_STATEMENT_WRAPPER( if ( ! (exp) ) __builtin_unreachable(); ) + #else + #define RADUNREACHABLE RAD_INFINITE_LOOP( RR_BREAK(); ) + #define RADASSUME(exp) + #endif + #elif defined(__CWCC__) + #define RADFORCEINLINE inline + #define RADNOINLINE __attribute__((never_inline)) + #define RADUNREACHABLE + #define RADASSUME(x) (void)0 + #else + // ? #define RADFORCEINLINE ? + #define RADFORCEINLINE inline + #define RADNOINLINE + #define RADASSUME(x) (void)0 + #endif + + //=========================================================================== + + // RAD_ALIGN_HINT tells the compiler how a given pointer is aligned + // it *must* be true, but the compiler may or may not use that information + // it is not for cases where the pointer is to an inherently aligned data type, + // it's when the compiler cannot tell the alignment but you have extra information. + // eg : + // U8 * ptr = rrMallocAligned(256,16); + // RAD_ALIGN_HINT(ptr,16,0); + + #ifdef __RADSPU__ + #define RAD_ALIGN_HINT(ptr,alignment,offset) __align_hint(ptr,alignment,offset); RR_ASSERT( ((UINTa)(ptr) & ((alignment)-1)) == (UINTa)(offset) ) + #else + #define RAD_ALIGN_HINT(ptr,alignment,offset) RADASSUME( ((UINTa)(ptr) & ((alignment)-1)) == (UINTa)(offset) ) + #endif + + //=========================================================================== + + // RAD_EXPECT is to tell the compiler the *likely* value of an expression + // different than RADASSUME in that expr might not have that value + // it's use for branch code layout and static branch prediction + // condition can technically be a variable but should usually be 0 or 1 + + #if (defined(__GCC__) || defined(__GNUC__)) || defined(__clang__) + + // __builtin_expect returns value of expr + #define RAD_EXPECT(expr,cond) __builtin_expect(expr,cond) + + #else + + #define RAD_EXPECT(expr,cond) (expr) + + #endif + + // helpers for doing an if ( ) with expect : + // if ( RAD_LIKELY(expr) ) { ... } + + #define RAD_LIKELY(expr) RAD_EXPECT(expr,1) + #define RAD_UNLIKELY(expr) RAD_EXPECT(expr,0) + + //=========================================================================== + + // __RADX86ASM__ means you can use __asm {} style inline assembly + #if defined(__RADX86__) && !defined(__RADX64__) && defined(_MSC_VER) + #define __RADX86ASM__ + #endif + + //------------------------------------------------- + // typedefs : + + #ifndef RADNOTYPEDEFS + + #ifndef S8_DEFINED + #define S8_DEFINED + typedef RAD_S8 S8; + #endif + + #ifndef U8_DEFINED + #define U8_DEFINED + typedef RAD_U8 U8; + #endif + + #ifndef S16_DEFINED + #define S16_DEFINED + typedef RAD_S16 S16; + #endif + + #ifndef U16_DEFINED + #define U16_DEFINED + typedef RAD_U16 U16; + #endif + + #ifndef S32_DEFINED + #define S32_DEFINED + typedef RAD_S32 S32; + #endif + + #ifndef U32_DEFINED + #define U32_DEFINED + typedef RAD_U32 U32; + #endif + + #ifndef S64_DEFINED + #define S64_DEFINED + typedef RAD_S64 S64; + #endif + + #ifndef U64_DEFINED + #define U64_DEFINED + typedef RAD_U64 U64; + #endif + + #ifndef F32_DEFINED + #define F32_DEFINED + typedef RAD_F32 F32; + #endif + + #ifndef F64_DEFINED + #define F64_DEFINED + typedef RAD_F64 F64; + #endif + + #ifndef F64_OR_32_DEFINED + #define F64_OR_32_DEFINED + typedef RAD_F64_OR_32 F64_OR_32; + #endif + + // UINTa and SINTa are the ints big enough for an address + + #ifndef SINTa_DEFINED + #define SINTa_DEFINED + typedef RAD_SINTa SINTa; + #endif + + #ifndef UINTa_DEFINED + #define UINTa_DEFINED + typedef RAD_UINTa UINTa; + #endif + + #ifndef UINTr_DEFINED + #define UINTr_DEFINED + typedef RAD_UINTr UINTr; + #endif + + #ifndef SINTr_DEFINED + #define SINTr_DEFINED + typedef RAD_SINTr SINTr; + #endif + + #elif !defined(RADNOTYPEDEFINES) + + #ifndef S8_DEFINED + #define S8_DEFINED + #define S8 RAD_S8 + #endif + + #ifndef U8_DEFINED + #define U8_DEFINED + #define U8 RAD_U8 + #endif + + #ifndef S16_DEFINED + #define S16_DEFINED + #define S16 RAD_S16 + #endif + + #ifndef U16_DEFINED + #define U16_DEFINED + #define U16 RAD_U16 + #endif + + #ifndef S32_DEFINED + #define S32_DEFINED + #define S32 RAD_S32 + #endif + + #ifndef U32_DEFINED + #define U32_DEFINED + #define U32 RAD_U32 + #endif + + #ifndef S64_DEFINED + #define S64_DEFINED + #define S64 RAD_S64 + #endif + + #ifndef U64_DEFINED + #define U64_DEFINED + #define U64 RAD_U64 + #endif + + #ifndef F32_DEFINED + #define F32_DEFINED + #define F32 RAD_F32 + #endif + + #ifndef F64_DEFINED + #define F64_DEFINED + #define F64 RAD_F64 + #endif + + #ifndef F64_OR_32_DEFINED + #define F64_OR_32_DEFINED + #define F64_OR_32 RAD_F64_OR_32 + #endif + + // UINTa and SINTa are the ints big enough for an address (pointer) + #ifndef SINTa_DEFINED + #define SINTa_DEFINED + #define SINTa RAD_SINTa + #endif + + #ifndef UINTa_DEFINED + #define UINTa_DEFINED + #define UINTa RAD_UINTa + #endif + + #ifndef UINTr_DEFINED + #define UINTr_DEFINED + #define UINTr RAD_UINTr + #endif + + #ifndef SINTr_DEFINED + #define SINTr_DEFINED + #define SINTr RAD_SINTr + #endif + + #endif + + /// Some error-checking. + #if defined(__RAD64__) && !defined(__RAD32__) + // See top of file for why this is. + #error __RAD64__ must not be defined without __RAD32__ (see radbase.h) + #endif + +#ifdef _MSC_VER + // microsoft compilers + + #if _MSC_VER >= 1400 + #define RAD_STATEMENT_START \ + do { + + #define RAD_STATEMENT_END_FALSE \ + __pragma(warning(push)) \ + __pragma(warning(disable:4127)) \ + } while(0) \ + __pragma(warning(pop)) + + #define RAD_STATEMENT_END_TRUE \ + __pragma(warning(push)) \ + __pragma(warning(disable:4127)) \ + } while(1) \ + __pragma(warning(pop)) + + #else + #define RAD_USE_STANDARD_LOOP_CONSTRUCT + #endif +#else + #define RAD_USE_STANDARD_LOOP_CONSTRUCT +#endif + +#ifdef RAD_USE_STANDARD_LOOP_CONSTRUCT + #define RAD_STATEMENT_START \ + do { + + #define RAD_STATEMENT_END_FALSE \ + } while ( (void)0,0 ) + + #define RAD_STATEMENT_END_TRUE \ + } while ( (void)1,1 ) + +#endif + +#define RAD_STATEMENT_WRAPPER( code ) \ + RAD_STATEMENT_START \ + code \ + RAD_STATEMENT_END_FALSE + +#define RAD_INFINITE_LOOP( code ) \ + RAD_STATEMENT_START \ + code \ + RAD_STATEMENT_END_TRUE + + +// Must be placed after variable declarations for code compiled as .c +#if defined(_MSC_VER) && _MSC_VER >= 1700 // in 2012 aka 11.0 and later +# define RR_UNUSED_VARIABLE(x) (void) x +#else +# define RR_UNUSED_VARIABLE(x) (void)(sizeof(x)) +#endif + +//----------------------------------------------- +// RR_UINT3264 is a U64 in 64-bit code and a U32 in 32-bit code +// eg. it's pointer sized and the same type as a U32/U64 of the same size +// +// @@ CB 05/21/2012 : I think RR_UINT3264 may be deprecated +// it was useful back when UINTa was /Wp64 +// but since we removed that maybe it's not anymore ? +// + +#ifdef __RAD64__ +#define RR_UINT3264 U64 +#else +#define RR_UINT3264 U32 +#endif + +//RR_COMPILER_ASSERT( sizeof(RR_UINT3264) == sizeof(UINTa) ); + +//-------------------------------------------------- + +// RR_LINESTRING is the current line number as a string +#define RR_STRINGIZE( L ) #L +#define RR_DO_MACRO( M, X ) M(X) +#define RR_STRINGIZE_DELAY( X ) RR_DO_MACRO( RR_STRINGIZE, X ) +#define RR_LINESTRING RR_STRINGIZE_DELAY( __LINE__ ) + +#define RR_CAT(X,Y) X ## Y + +// RR_STRING_JOIN joins strings in the preprocessor and works with LINESTRING +#define RR_STRING_JOIN(arg1, arg2) RR_STRING_JOIN_DELAY(arg1, arg2) +#define RR_STRING_JOIN_DELAY(arg1, arg2) RR_STRING_JOIN_IMMEDIATE(arg1, arg2) +#define RR_STRING_JOIN_IMMEDIATE(arg1, arg2) arg1 ## arg2 + +// RR_NUMBERNAME is a macro to make a name unique, so that you can use it to declare +// variable names and they won't conflict with each other +// using __LINE__ is broken in MSVC with /ZI , but __COUNTER__ is an MSVC extension that works + +#ifdef _MSC_VER + #define RR_NUMBERNAME(name) RR_STRING_JOIN(name,__COUNTER__) +#else + #define RR_NUMBERNAME(name) RR_STRING_JOIN(name,__LINE__) +#endif + +//-------------------------------------------------- +// current plan is to use "rrbool" with plain old "true" and "false" +// if true and false give us trouble we might have to go to rrtrue and rrfalse +// BTW there's a danger for evil bugs here !! If you're checking == true +// then the rrbool must be set to exactly "1" not just "not zero" !! + +#ifndef RADNOTYPEDEFS + #ifndef RRBOOL_DEFINED + #define RRBOOL_DEFINED + typedef S32 rrbool; + typedef S32 RRBOOL; + #endif +#elif !defined(RADNOTYPEDEFINES) + #ifndef RRBOOL_DEFINED + #define RRBOOL_DEFINED + #define rrbool S32 + #define RRBOOL S32 + #endif +#endif + +//-------------------------------------------------- +// Range macros + + #ifndef RR_MIN + #define RR_MIN(a,b) ( (a) < (b) ? (a) : (b) ) + #endif + + #ifndef RR_MAX + #define RR_MAX(a,b) ( (a) > (b) ? (a) : (b) ) + #endif + + #ifndef RR_ABS + #define RR_ABS(a) ( ((a) < 0) ? -(a) : (a) ) + #endif + + #ifndef RR_CLAMP + #define RR_CLAMP(val,lo,hi) RR_MAX( RR_MIN(val,hi), lo ) + #endif + +//-------------------------------------------------- +// Data layout macros + + #define RR_ARRAY_SIZE(array) ( sizeof(array)/sizeof(array[0]) ) + + // MEMBER_OFFSET tells you the offset of a member in a type + #ifdef __RAD3DS__ + #define RR_MEMBER_OFFSET(type,member) (unsigned int)(( (char *) &(((type *)0)->member) - (char *) 0 )) + #elif defined(__RADANDROID__) || defined(__RADPSP__) || defined(__RADPS3__) || defined(__RADSPU__) + // offsetof() gets mucked with by system headers on android, making things dependent on #include order. + #define RR_MEMBER_OFFSET(type,member) __builtin_offsetof(type, member) + #elif defined(__RADLINUX__) + #define RR_MEMBER_OFFSET(type,member) (offsetof(type, member)) + #else + #define RR_MEMBER_OFFSET(type,member) ( (size_t) (UINTa) &(((type *)0)->member) ) + #endif + + // MEMBER_SIZE tells you the size of a member in a type + #define RR_MEMBER_SIZE(type,member) ( sizeof( ((type *) 0)->member) ) + + // just to make gcc shut up about derefing null : + #define RR_MEMBER_OFFSET_PTR(type,member,ptr) ( (SINTa) &(((type *)(ptr))->member) - (SINTa)(ptr) ) + #define RR_MEMBER_SIZE_PTR(type,member,ptr) ( sizeof( ((type *) (ptr))->member) ) + + // MEMBER_TO_OWNER takes a pointer to a member and gives you back the base of the object + // you should then RR_ASSERT( &(ret->member) == ptr ); + #define RR_MEMBER_TO_OWNER(type,member,ptr) (type *)( ((char *)(ptr)) - RR_MEMBER_OFFSET_PTR(type,member,ptr) ) + +//-------------------------------------------------- +// Cache / prefetch macros : + +// RR_PREFETCH for various platforms : +// +// RR_PREFETCH_SEQUENTIAL : prefetch memory for reading in a sequential scan +// platforms that automatically prefetch sequential (eg. PC) should be a no-op here +// RR_PREFETCH_WRITE_INVALIDATE : prefetch memory for writing - contents of memory are undefined +// (may be a no-op, may be a normal prefetch, may zero memory) +// warning : RR_PREFETCH_WRITE_INVALIDATE may write memory so don't do it past the end of buffers + +#ifdef __RADX86__ + +#define RR_PREFETCH_SEQUENTIAL(ptr,offset) // nop +#define RR_PREFETCH_WRITE_INVALIDATE(ptr,offset) // nop + +#elif defined(__RADXENON__) + +#define RR_PREFETCH_SEQUENTIAL(ptr,offset) __dcbt((int)(offset),(void *)(ptr)) +#define RR_PREFETCH_WRITE_INVALIDATE(ptr,offset) __dcbz128((int)(offset),(void *)(ptr)) + +#elif defined(__RADPS3__) + +#define RR_PREFETCH_SEQUENTIAL(ptr,offset) __dcbt((char *)(ptr) + (int)(offset)) +#define RR_PREFETCH_WRITE_INVALIDATE(ptr,offset) __dcbz((char *)(ptr) + (int)(offset)) + +#elif defined(__RADSPU__) + +#define RR_PREFETCH_SEQUENTIAL(ptr,offset) // intentional NOP +#define RR_PREFETCH_WRITE_INVALIDATE(ptr,offset) // nop + +#elif defined(__RADWII__) || defined(__RADWIIU__) + +#define RR_PREFETCH_SEQUENTIAL(ptr,offset) // intentional NOP for now +#define RR_PREFETCH_WRITE_INVALIDATE(ptr,offset) // nop + +#elif defined(__RAD3DS__) + +#define RR_PREFETCH_SEQUENTIAL(ptr,offset) __pld((char *)(ptr) + (int)(offset)) +#define RR_PREFETCH_WRITE_INVALIDATE(ptr,offset) __pldw((char *)(ptr) + (int)(offset)) + +#else + +// other platform +#define RR_PREFETCH_SEQUENTIAL(ptr,offset) // need_prefetch // compile error +#define RR_PREFETCH_WRITE_INVALIDATE(ptr,offset) // need_writezero // error + +#endif + +//-------------------------------------------------- +// LIGHTWEIGHT ASSERTS without rrAssert.h + +RADDEFSTART + +// set up RR_BREAK : + + #ifdef __RADNGC__ + + #define RR_BREAK() asm(" .long 0x00000001") + #define RR_CACHE_LINE_SIZE xxx + + #elif defined(__RADWII__) + + #define RR_BREAK() __asm__ volatile("trap") + #define RR_CACHE_LINE_SIZE 32 + + #elif defined(__RADWIIU__) + + #define RR_BREAK() asm("trap") + #define RR_CACHE_LINE_SIZE 32 + + #elif defined(__RAD3DS__) + + #define RR_BREAK() *((int volatile*)0)=0 + #define RR_CACHE_LINE_SIZE 32 + + #elif defined(__RADNDS__) + + #define RR_BREAK() asm("BKPT 0") + #define RR_CACHE_LINE_SIZE xxx + + #elif defined(__RADPS2__) + + #define RR_BREAK() __asm__ volatile("break") + #define RR_CACHE_LINE_SIZE 64 + + #elif defined(__RADPSP__) + + #define RR_BREAK() __asm__("break 0") + #define RR_CACHE_LINE_SIZE 64 + + #elif defined(__RADPSP2__) + + #define RR_BREAK() { __asm__ volatile("bkpt 0x0000"); } + #define RR_CACHE_LINE_SIZE 32 + + #elif defined (__RADQNX__) + #define RR_BREAK() __builtin_trap() + #define RR_CACHE_LINE_SIZE 32 + #elif defined (__RADARM__) && defined (__RADLINUX__) + #define RR_BREAK() __builtin_trap() + #define RR_CACHE_LINE_SIZE 32 + #elif defined(__RADSPU__) + + #define RR_BREAK() __asm volatile ("stopd 0,1,1") + #define RR_CACHE_LINE_SIZE 128 + + #elif defined(__RADPS3__) + + // #ifdef snPause // in LibSN.h + // snPause + // __asm__ volatile ( "tw 31,1,1" ) + + #define RR_BREAK() __asm__ volatile ( "tw 31,1,1" ) + //#define RR_BREAK() __asm__ volatile("trap"); + + #define RR_CACHE_LINE_SIZE 128 + + #elif defined(__RADMAC__) + + #if defined(__GNUG__) || defined(__GNUC__) + #ifdef __RADX86__ + #define RR_BREAK() __asm__ volatile ( "int $3" ) + #else + #define RR_BREAK() __builtin_trap() + #endif + #else + #ifdef __RADMACH__ + void DebugStr(unsigned char const *); + #else + void pascal DebugStr(unsigned char const *); + #endif + #define RR_BREAK() DebugStr("\pRR_BREAK() was called") + #endif + + #define RR_CACHE_LINE_SIZE 64 + + #elif defined(__RADIPHONE__) + #define RR_BREAK() __builtin_trap() + #define RR_CACHE_LINE_SIZE 32 + #elif defined(__RADXENON__) + #define RR_BREAK() __debugbreak() + #define RR_CACHE_LINE_SIZE 128 + #elif defined(__RADANDROID__) + #define RR_BREAK() __builtin_trap() + #define RR_CACHE_LINE_SIZE 32 + #elif defined(__RADPS4__) + #define RR_BREAK() __builtin_trap() + #define RR_CACHE_LINE_SIZE 64 + #elif defined(__RADNACL__) + #define RR_BREAK() __builtin_trap() + #define RR_CACHE_LINE_SIZE 64 + #else + // x86 : + #define RR_CACHE_LINE_SIZE 64 + + #ifdef __RADLINUX__ + #define RR_BREAK() __asm__ volatile ( "int $3" ) + #elif defined(__WATCOMC__) + + void RR_BREAK( void ); + #pragma aux RR_BREAK = "int 0x3"; + + #elif defined(__RADWIN__) && defined(_MSC_VER) && _MSC_VER >= 1300 + + #define RR_BREAK __debugbreak + + #else + + #define RR_BREAK() RAD_STATEMENT_WRAPPER( __asm {int 3} ) + + #endif + + #endif + +// simple RR_ASSERT : + +// CB 5-27-10 : use RR_DO_ASSERTS to toggle asserts on and off : +#if (defined(_DEBUG) && !defined(NDEBUG)) || defined(ASSERT_IN_RELEASE) + #define RR_DO_ASSERTS +#endif + +/********* + +rrAsserts : + +RR_ASSERT(exp) - the normal assert thing, toggled with RR_DO_ASSERTS +RR_ASSERT_ALWAYS(exp) - assert that you want to test even in ALL builds (including final!) +RR_ASSERT_RELEASE(exp) - assert that you want to test even in release builds (not for final!) +RR_ASSERT_LITE(exp) - normal assert is not safe from threads or inside malloc; use this instead +RR_DURING_ASSERT(exp) - wrap operations that compute stuff for assert in here +RR_DO_ASSERTS - toggle tells you if asserts are enabled or not + +RR_BREAK() - generate a debug break - always ! +RR_ASSERT_BREAK() - RR_BREAK for asserts ; disable with RAD_NO_BREAK + +RR_ASSERT_FAILURE(str) - just break with a messsage; like assert with no condition +RR_ASSERT_FAILURE_ALWAYS(str) - RR_ASSERT_FAILURE in release builds too +RR_CANT_GET_HERE() - put in spots execution should never go +RR_COMPILER_ASSERT(exp) - checks constant conditions at compile time + +RADTODO - note to search for nonfinal stuff +RR_PRAGMA_MESSAGE - message dealy, use with #pragma in MSVC + +*************/ + +//----------------------------------------------------------- + + +#if defined(__GNUG__) || defined(__GNUC__) || (defined(_MSC_VER) && _MSC_VER > 1200) + #define RR_FUNCTION_NAME __FUNCTION__ +#else + #define RR_FUNCTION_NAME 0 + + // __func__ is in the C99 standard +#endif + +//----------------------------------------------------------- + +// rrDisplayAssertion might just log, or it might pop a message box, depending on settings +// rrDisplayAssertion returns whether you should break or not +typedef rrbool (RADLINK fp_rrDisplayAssertion)(int * Ignored, const char * fileName,const int line,const char * function,const char * message); + +extern fp_rrDisplayAssertion * g_fp_rrDisplayAssertion; + +// if I have func pointer, call it, else true ; true = do int 3 +#define rrDisplayAssertion(i,n,l,f,m) ( ( g_fp_rrDisplayAssertion ) ? (*g_fp_rrDisplayAssertion)(i,n,l,f,m) : 1 ) + +//----------------------------------------------------------- + +// RAD_NO_BREAK : option if you don't like your assert to break +// CB : RR_BREAK is *always* a break ; RR_ASSERT_BREAK is optional +#ifdef RAD_NO_BREAK +#define RR_ASSERT_BREAK() 0 +#else +#define RR_ASSERT_BREAK() RR_BREAK() +#endif + +// assert_always is on FINAL ! +#define RR_ASSERT_ALWAYS(exp) RAD_STATEMENT_WRAPPER( static int Ignored=0; if ( ! (exp) ) { if ( rrDisplayAssertion(&Ignored,__FILE__,__LINE__,RR_FUNCTION_NAME,#exp) ) RR_ASSERT_BREAK(); } ) + +// RR_ASSERT_FAILURE is like an assert without a condition - if you hit it, you're bad +#define RR_ASSERT_FAILURE_ALWAYS(str) RAD_STATEMENT_WRAPPER( static int Ignored=0; if ( rrDisplayAssertion(&Ignored,__FILE__,__LINE__,RR_FUNCTION_NAME,str) ) RR_ASSERT_BREAK(); ) + +#define RR_ASSERT_LITE_ALWAYS(exp) RAD_STATEMENT_WRAPPER( if ( ! (exp) ) { RR_ASSERT_BREAK(); } ) + +//----------------------------------- +#ifdef RR_DO_ASSERTS + +#define RR_ASSERT(exp) RR_ASSERT_ALWAYS(exp) +#define RR_ASSERT_LITE(exp) RR_ASSERT_LITE_ALWAYS(exp) +#define RR_ASSERT_NO_ASSUME(exp) RR_ASSERT_ALWAYS(exp) +// RR_DURING_ASSERT is to set up expressions or declare variables that are only used in asserts +#define RR_DURING_ASSERT(exp) exp + +#define RR_ASSERT_FAILURE(str) RR_ASSERT_FAILURE_ALWAYS(str) + +// RR_CANT_GET_HERE is for like defaults in switches that should never be hit +#define RR_CANT_GET_HERE() RAD_STATEMENT_WRAPPER( RR_ASSERT_FAILURE("can't get here"); RADUNREACHABLE; ) + + +#else // RR_DO_ASSERTS //----------------------------------- + +#define RR_ASSERT(exp) (void)0 +#define RR_ASSERT_LITE(exp) (void)0 +#define RR_ASSERT_NO_ASSUME(exp) (void)0 + +#define RR_DURING_ASSERT(exp) (void)0 + +#define RR_ASSERT_FAILURE(str) (void)0 + +#define RR_CANT_GET_HERE() RADUNREACHABLE + +#endif // RR_DO_ASSERTS //----------------------------------- + +//================================================================= + +// RR_ASSERT_RELEASE is on in release build, but not final + +#ifndef __RADFINAL__ + +#define RR_ASSERT_RELEASE(exp) RR_ASSERT_ALWAYS(exp) +#define RR_ASSERT_LITE_RELEASE(exp) RR_ASSERT_LITE_ALWAYS(exp) + +#else + +#define RR_ASSERT_RELEASE(exp) (void)0 +#define RR_ASSERT_LITE_RELEASE(exp) (void)0 + +#endif + +// BH: This never gets compiled away except for __RADFINAL__ +#define RR_ASSERT_ALWAYS_NO_SHIP RR_ASSERT_RELEASE + +#define rrAssert RR_ASSERT +#define rrassert RR_ASSERT + +#ifdef _MSC_VER + // without this, our assert errors... + #if _MSC_VER >= 1300 + #pragma warning( disable : 4127) // conditional expression is constant + #endif +#endif + +//--------------------------------------- +// Get/Put from memory in little or big endian : +// +// val = RR_GET32_BE(ptr) +// RR_PUT32_BE(ptr,val) +// +// available here : +// RR_[GET/PUT][16/32]_[BE/LE][_UNALIGNED][_OFFSET] +// +// if you don't specify _UNALIGNED , then ptr & offset shoud both be aligned to type size +// _OFFSET is in *bytes* ! + +// you can #define RR_GET_RESTRICT to make all RR_GETs be RESTRICT +// if you set nothing they are not + +#ifdef RR_GET_RESTRICT +#define RR_GET_PTR_POST RADRESTRICT +#endif +#ifndef RR_GET_PTR_POST +#define RR_GET_PTR_POST +#endif + +// native version of get/put is always trivial : + +#define RR_GET16_NATIVE(ptr) *((const U16 * RR_GET_PTR_POST)(ptr)) +#define RR_PUT16_NATIVE(ptr,val) *((U16 * RR_GET_PTR_POST)(ptr)) = (val) + +// offset is in bytes +#define RR_U16_PTR_OFFSET(ptr,offset) ((U16 * RR_GET_PTR_POST)((char *)(ptr) + (offset))) +#define RR_GET16_NATIVE_OFFSET(ptr,offset) *( RR_U16_PTR_OFFSET((ptr),offset) ) +#define RR_PUT16_NATIVE_OFFSET(ptr,val,offset) *( RR_U16_PTR_OFFSET((ptr),offset)) = (val) + +#define RR_GET32_NATIVE(ptr) *((const U32 * RR_GET_PTR_POST)(ptr)) +#define RR_PUT32_NATIVE(ptr,val) *((U32 * RR_GET_PTR_POST)(ptr)) = (val) + +// offset is in bytes +#define RR_U32_PTR_OFFSET(ptr,offset) ((U32 * RR_GET_PTR_POST)((char *)(ptr) + (offset))) +#define RR_GET32_NATIVE_OFFSET(ptr,offset) *( RR_U32_PTR_OFFSET((ptr),offset) ) +#define RR_PUT32_NATIVE_OFFSET(ptr,val,offset) *( RR_U32_PTR_OFFSET((ptr),offset)) = (val) + +#define RR_GET64_NATIVE(ptr) *((const U64 * RR_GET_PTR_POST)(ptr)) +#define RR_PUT64_NATIVE(ptr,val) *((U64 * RR_GET_PTR_POST)(ptr)) = (val) + +// offset is in bytes +#define RR_U64_PTR_OFFSET(ptr,offset) ((U64 * RR_GET_PTR_POST)((char *)(ptr) + (offset))) +#define RR_GET64_NATIVE_OFFSET(ptr,offset) *( RR_U64_PTR_OFFSET((ptr),offset) ) +#define RR_PUT64_NATIVE_OFFSET(ptr,val,offset) *( RR_U64_PTR_OFFSET((ptr),offset)) = (val) + +//--------------------------------------------------- + +#ifdef __RADLITTLEENDIAN__ + +#define RR_GET16_LE RR_GET16_NATIVE +#define RR_PUT16_LE RR_PUT16_NATIVE +#define RR_GET16_LE_OFFSET RR_GET16_NATIVE_OFFSET +#define RR_PUT16_LE_OFFSET RR_PUT16_NATIVE_OFFSET + +#define RR_GET32_LE RR_GET32_NATIVE +#define RR_PUT32_LE RR_PUT32_NATIVE +#define RR_GET32_LE_OFFSET RR_GET32_NATIVE_OFFSET +#define RR_PUT32_LE_OFFSET RR_PUT32_NATIVE_OFFSET + +#define RR_GET64_LE RR_GET64_NATIVE +#define RR_PUT64_LE RR_PUT64_NATIVE +#define RR_GET64_LE_OFFSET RR_GET64_NATIVE_OFFSET +#define RR_PUT64_LE_OFFSET RR_PUT64_NATIVE_OFFSET + +#else + +#define RR_GET16_BE RR_GET16_NATIVE +#define RR_PUT16_BE RR_PUT16_NATIVE +#define RR_GET16_BE_OFFSET RR_GET16_NATIVE_OFFSET +#define RR_PUT16_BE_OFFSET RR_PUT16_NATIVE_OFFSET + +#define RR_GET32_BE RR_GET32_NATIVE +#define RR_PUT32_BE RR_PUT32_NATIVE +#define RR_GET32_BE_OFFSET RR_GET32_NATIVE_OFFSET +#define RR_PUT32_BE_OFFSET RR_PUT32_NATIVE_OFFSET + +#define RR_GET64_BE RR_GET64_NATIVE +#define RR_PUT64_BE RR_PUT64_NATIVE +#define RR_GET64_BE_OFFSET RR_GET64_NATIVE_OFFSET +#define RR_PUT64_BE_OFFSET RR_PUT64_NATIVE_OFFSET + +#endif + +//------------------------- +// non-native Get/Put implementations go here : + +#if defined(__RADX86__) +// good implementation for X86 : + +#if (_MSC_VER >= 1300) + +unsigned short __cdecl _byteswap_ushort (unsigned short _Short); +unsigned long __cdecl _byteswap_ulong (unsigned long _Long); +#pragma intrinsic(_byteswap_ushort, _byteswap_ulong) + +#define RR_BSWAP16 _byteswap_ushort +#define RR_BSWAP32 _byteswap_ulong + +unsigned __int64 __cdecl _byteswap_uint64 (unsigned __int64 val); +#pragma intrinsic(_byteswap_uint64) +#define RR_BSWAP64 _byteswap_uint64 + +#elif defined(_MSC_VER) // VC6 + +RADFORCEINLINE unsigned long RR_BSWAP16 (unsigned long _Long) +{ + __asm { + mov eax, [_Long] + rol ax, 8 + mov [_Long], eax; + } + return _Long; +} + +RADFORCEINLINE unsigned long RR_BSWAP32 (unsigned long _Long) +{ + __asm { + mov eax, [_Long] + bswap eax + mov [_Long], eax + } + return _Long; +} + +RADFORCEINLINE unsigned __int64 RR_BSWAP64 (unsigned __int64 _Long) +{ + __asm { + mov eax, DWORD PTR _Long + mov edx, DWORD PTR _Long+4 + bswap eax + bswap edx + mov DWORD PTR _Long, edx + mov DWORD PTR _Long+4, eax + } + return _Long; +} + +#elif defined(__GNUC__) || defined(__clang__) + +// GCC has __builtin_bswap16, but Clang only seems to have added it recently. +// We use __builtin_bswap32/64 but 16 just uses the macro version. (No big +// deal if that turns into shifts anyway) +#define RR_BSWAP16(u16) ( (U16) ( ((u16) >> 8) | ((u16) << 8) ) ) +#define RR_BSWAP32 __builtin_bswap32 +#define RR_BSWAP64 __builtin_bswap64 + +#endif + +#define RR_GET16_BE(ptr) RR_BSWAP16(*((U16 *)(ptr))) +#define RR_PUT16_BE(ptr,val) *((U16 *)(ptr)) = (U16) RR_BSWAP16(val) +#define RR_GET16_BE_OFFSET(ptr,offset) RR_BSWAP16(*RR_U16_PTR_OFFSET(ptr,offset)) +#define RR_PUT16_BE_OFFSET(ptr,val,offset) *RR_U16_PTR_OFFSET(ptr,offset) = RR_BSWAP16(val) + +#define RR_GET32_BE(ptr) RR_BSWAP32(*((U32 *)(ptr))) +#define RR_PUT32_BE(ptr,val) *((U32 *)(ptr)) = RR_BSWAP32(val) +#define RR_GET32_BE_OFFSET(ptr,offset) RR_BSWAP32(*RR_U32_PTR_OFFSET(ptr,offset)) +#define RR_PUT32_BE_OFFSET(ptr,val,offset) *RR_U32_PTR_OFFSET(ptr,offset) = RR_BSWAP32(val) + +#define RR_GET64_BE(ptr) RR_BSWAP64(*((U64 *)(ptr))) +#define RR_PUT64_BE(ptr,val) *((U64 *)(ptr)) = RR_BSWAP64(val) +#define RR_GET64_BE_OFFSET(ptr,offset) RR_BSWAP64(*RR_U64_PTR_OFFSET(ptr,offset)) +#define RR_PUT64_BE_OFFSET(ptr,val,offset) *RR_U64_PTR_OFFSET(ptr,offset) = RR_BSWAP64(val) + +// end _MSC_VER + +#elif defined(__RADXENON__) // Xenon has built-in funcs for this + +unsigned short __loadshortbytereverse(int offset, const void *base); +unsigned long __loadwordbytereverse (int offset, const void *base); + +void __storeshortbytereverse(unsigned short val, int offset, void *base); +void __storewordbytereverse (unsigned int val, int offset, void *base); + +#define RR_GET16_LE(ptr) __loadshortbytereverse(0, ptr) +#define RR_PUT16_LE(ptr,val) __storeshortbytereverse((U16) (val), 0, ptr) + +#define RR_GET16_LE_OFFSET(ptr,offset) __loadshortbytereverse(offset, ptr) +#define RR_PUT16_LE_OFFSET(ptr,val,offset) __storeshortbytereverse((U16) (val), offset, ptr) + +#define RR_GET32_LE(ptr) __loadwordbytereverse(0, ptr) +#define RR_PUT32_LE(ptr,val) __storewordbytereverse((U32) (val), 0, ptr) + +#define RR_GET32_LE_OFFSET(ptr,offset) __loadwordbytereverse(offset, ptr) +#define RR_PUT32_LE_OFFSET(ptr,val,offset) __storewordbytereverse((U32) (val), offset, ptr) + +#define RR_GET64_LE(ptr) ( ((U64)RR_GET32_OFFSET_LE(ptr,4)<<32) | RR_GET32_LE(ptr) ) +#define RR_PUT64_LE(ptr,val) RR_PUT32_LE(ptr, (U32) (val)), RR_PUT32_OFFSET_LE(ptr, (U32) ((val)>>32),4) + +#elif defined(__RADPS3__) + +#include + +#define RR_GET16_LE(ptr) __lhbrx(ptr) +#define RR_PUT16_LE(ptr,val) __sthbrx(ptr, (U16) (val)) + +#define RR_GET16_LE_OFFSET(ptr,offset) __lhbrx(RR_U16_PTR_OFFSET(ptr, offset)) +#define RR_PUT16_LE_OFFSET(ptr,val,offset) __sthbrx(RR_U16_PTR_OFFSET(ptr, offset), (U16) (val)) + +#define RR_GET32_LE(ptr) __lwbrx(ptr) +#define RR_PUT32_LE(ptr,val) __stwbrx(ptr, (U32) (val)) + +#define RR_GET64_LE(ptr) __ldbrx(ptr) +#define RR_PUT64_LE(ptr,val) __stdbrx(ptr, (U32) (val)) + +#define RR_GET32_LE_OFFSET(ptr,offset) __lwbrx(RR_U32_PTR_OFFSET(ptr, offset)) +#define RR_PUT32_LE_OFFSET(ptr,val,offset) __stwbrx(RR_U32_PTR_OFFSET(ptr, offset), (U32) (val)) + +#elif defined(__RADWII__) + +#define RR_GET16_LE(ptr) __lhbrx(ptr, 0) +#define RR_PUT16_LE(ptr,val) __sthbrx((U16) (val), ptr, 0) + +#define RR_GET16_LE_OFFSET(ptr,offset) __lhbrx(ptr, offset) +#define RR_PUT16_LE_OFFSET(ptr,val,offset) __sthbrx((U16) (val), ptr, offset) + +#define RR_GET32_LE(ptr) __lwbrx(ptr, 0) +#define RR_PUT32_LE(ptr,val) __stwbrx((U32) (val), ptr, 0) + +#define RR_GET32_LE_OFFSET(ptr,offset) __lwbrx(ptr, offset) +#define RR_PUT32_LE_OFFSET(ptr,val,offset) __stwbrx((U32) (val), ptr, offset) + +#elif defined(__RAD3DS__) + +#define RR_GET16_BE(ptr) __rev16(*(U16 *) (ptr)) +#define RR_PUT16_BE(ptr,val) *(U16 *) (ptr) = __rev16(val) + +#define RR_GET16_BE_OFFSET(ptr,offset) __rev16(*RR_U16_PTR_OFFSET(ptr,offset)) +#define RR_PUT16_BE_OFFSET(ptr,offset,val) *RR_U16_PTR_OFFSET(ptr,offset) = __rev16(val) + +#define RR_GET32_BE(ptr) __rev(*(U32 *) (ptr)) +#define RR_PUT32_BE(ptr,val) *(U32 *) (ptr) = __rev(val) + +#define RR_GET32_BE_OFFSET(ptr,offset) __rev(*RR_U32_PTR_OFFSET(ptr,offset)) +#define RR_PUT32_BE_OFFSET(ptr,offset,val) *RR_U32_PTR_OFFSET(ptr,offset) = __rev(val) + +#elif defined(__RADIPHONE__) + +// iPhone does not seem to have intrinsics for this, so use generic fallback! + +// Bswap is just here for use of implementing get/put +// caller should use Get/Put , not bswap +#define RR_BSWAP16(u16) ( (U16) ( ((u16) >> 8) | ((u16) << 8) ) ) +#define RR_BSWAP32(u32) ( (U32) ( ((u32) >> 24) | (((u32)<<8) & 0x00FF0000) | (((u32)>>8) & 0x0000FF00) | ((u32) << 24) ) ) + +#define RR_GET16_BE(ptr) RR_BSWAP16(*((U16 *)(ptr))) +#define RR_PUT16_BE(ptr,val) *((U16 *)(ptr)) = RR_BSWAP16(val) + +#define RR_GET32_BE(ptr) RR_BSWAP32(*((U32 *)(ptr))) +#define RR_PUT32_BE(ptr,val) *((U32 *)(ptr)) = RR_BSWAP32(val) + +#elif defined(__RADWIIU__) + +#include + +#define RR_GET16_LE(ptr) (*(__bytereversed U16 *) (ptr)) +#define RR_PUT16_LE(ptr,val) *(__bytereversed U16 *) (ptr) = val + +#define RR_GET16_LE_OFFSET(ptr,offset) (*(__bytereversed U16 *)RR_U16_PTR_OFFSET(ptr,offset)) +#define RR_PUT16_LE_OFFSET(ptr,val,offset) *(__bytereversed U16 *)RR_U16_PTR_OFFSET(ptr,offset) = val + +#define RR_GET32_LE(ptr) (*(__bytereversed U32 *) (ptr)) +#define RR_PUT32_LE(ptr,val) *(__bytereversed U32 *) (ptr) = val + +#define RR_GET32_LE_OFFSET(ptr,offset) (*(__bytereversed U32 *)RR_U32_PTR_OFFSET(ptr,offset)) +#define RR_PUT32_LE_OFFSET(ptr,val,offset) *(__bytereversed U32 *)RR_U32_PTR_OFFSET(ptr,offset) = val + +#define RR_GET64_LE(ptr) (*(__bytereversed U64 *) (ptr)) +#define RR_PUT64_LE(ptr,val) *(__bytereversed U64 *) (ptr) = val + +#define RR_GET64_LE_OFFSET(ptr,offset) (*(__bytereversed U64 *)RR_U32_PTR_OFFSET(ptr,offset)) +#define RR_PUT64_LE_OFFSET(ptr,val,offset) *(__bytereversed U64 *)RR_U32_PTR_OFFSET(ptr,offset) = val + +#elif defined(__RADWINRTAPI__) && defined(__RADARM__) + +#include + +#define RR_BSWAP16(u16) _arm_rev16(u16) +#define RR_BSWAP32(u32) _arm_rev(u32) + +#define RR_GET16_BE(ptr) RR_BSWAP16(*((U16 *)(ptr))) +#define RR_PUT16_BE(ptr,val) *((U16 *)(ptr)) = RR_BSWAP16(val) + +#define RR_GET32_BE(ptr) RR_BSWAP32(*((U32 *)(ptr))) +#define RR_PUT32_BE(ptr,val) *((U32 *)(ptr)) = RR_BSWAP32(val) + +#elif defined(__RADPSP2__) + +// no rev16 exposed +#define RR_BSWAP16(u16) ( (U16) ( ((u16) >> 8) | ((u16) << 8) ) ) +#define RR_BSWAP32(u32) __builtin_rev(u32) + +#define RR_GET16_BE(ptr) RR_BSWAP16(*((U16 *)(ptr))) +#define RR_PUT16_BE(ptr,val) *((U16 *)(ptr)) = RR_BSWAP16(val) + +#define RR_GET32_BE(ptr) RR_BSWAP32(*((U32 *)(ptr))) +#define RR_PUT32_BE(ptr,val) *((U32 *)(ptr)) = RR_BSWAP32(val) + +#else // other platforms ? + +// fall back : + +// Bswap is just here for use of implementing get/put +// caller should use Get/Put , not bswap +#define RR_BSWAP16(u16) ( (U16) ( ((u16) >> 8) | ((u16) << 8) ) ) +#define RR_BSWAP32(u32) ( (U32) ( ((u32) >> 24) | (((u32)<<8) & 0x00FF0000) | (((u32)>>8) & 0x0000FF00) | ((u32) << 24) ) ) +#define RR_BSWAP64(u64) ( ((U64) RR_BSWAP32((U32) (u64)) << 32) | (U64) RR_BSWAP32((U32) ((u64) >> 32)) ) + +#ifdef __RADLITTLEENDIAN__ + +// comment out fallbacks so users will get errors +//#define RR_GET16_BE(ptr) RR_BSWAP16(*((U16 *)(ptr))) +//#define RR_PUT16_BE(ptr,val) *((U16 *)(ptr)) = RR_BSWAP16(val) +//#define RR_GET32_BE(ptr) RR_BSWAP32(*((U32 *)(ptr))) +//#define RR_PUT32_BE(ptr,val) *((U32 *)(ptr)) = RR_BSWAP32(val) + +#else + +// comment out fallbacks so users will get errors +//#define RR_GET16_LE(ptr) RR_BSWAP16(*((U16 *)(ptr))) +//#define RR_PUT16_LE(ptr,val) *((U16 *)(ptr)) = RR_BSWAP16(val) +//#define RR_GET32_LE(ptr) RR_BSWAP32(*((U32 *)(ptr))) +//#define RR_PUT32_LE(ptr,val) *((U32 *)(ptr)) = RR_BSWAP32(val) + +#endif + +#endif + +//=================================================================== +// @@ TEMP : Aliases for old names : remove me when possible : + +#define RR_GET32_OFFSET_LE RR_GET32_LE_OFFSET +#define RR_GET32_OFFSET_BE RR_GET32_BE_OFFSET +#define RR_PUT32_OFFSET_LE RR_PUT32_LE_OFFSET +#define RR_PUT32_OFFSET_BE RR_PUT32_BE_OFFSET +#define RR_GET16_OFFSET_LE RR_GET16_LE_OFFSET +#define RR_GET16_OFFSET_BE RR_GET16_BE_OFFSET +#define RR_PUT16_OFFSET_LE RR_PUT16_LE_OFFSET +#define RR_PUT16_OFFSET_BE RR_PUT16_BE_OFFSET + + +//=================================================================== +// UNALIGNED VERSIONS : + +#if defined(__RADX86__) || defined(__RADPPC__) // platforms where unaligned is fast : + +#define RR_GET32_BE_UNALIGNED(ptr) RR_GET32_BE(ptr) +#define RR_GET32_BE_UNALIGNED_OFFSET(ptr,offset) RR_GET32_BE_OFFSET(ptr,offset) +#define RR_GET16_BE_UNALIGNED(ptr) RR_GET16_BE(ptr) +#define RR_GET16_BE_UNALIGNED_OFFSET(ptr,offset) RR_GET16_BE_OFFSET(ptr,offset) + +#define RR_GET32_LE_UNALIGNED(ptr) RR_GET32_LE(ptr) +#define RR_GET32_LE_UNALIGNED_OFFSET(ptr,offset) RR_GET32_LE_OFFSET(ptr,offset) +#define RR_GET16_LE_UNALIGNED(ptr) RR_GET16_LE(ptr) +#define RR_GET16_LE_UNALIGNED_OFFSET(ptr,offset) RR_GET16_LE_OFFSET(ptr,offset) + +#elif defined(__RAD3DS__) + +// arm has a "__packed" qualifier to tell the compiler to do unaligned accesses +#define RR_U16_PTR_OFFSET_UNALIGNED(ptr,offset) ((__packed U16 * RR_GET_PTR_POST)((char *)(ptr) + (offset))) +#define RR_U32_PTR_OFFSET_UNALIGNED(ptr,offset) ((__packed U32 * RR_GET_PTR_POST)((char *)(ptr) + (offset))) + +#define RR_GET32_BE_UNALIGNED(ptr) __rev(*RR_U32_PTR_OFFSET_UNALIGNED(ptr,0)) +#define RR_GET32_BE_UNALIGNED_OFFSET(ptr,offset) __rev(*RR_U32_PTR_OFFSET_UNALIGNED(ptr,offset)) +#define RR_GET16_BE_UNALIGNED(ptr) __rev16(*RR_U16_PTR_OFFSET_UNALIGNED(ptr,0)) +#define RR_GET16_BE_UNALIGNED_OFFSET(ptr,offset) __rev16(*RR_U16_PTR_OFFSET_UNALIGNED(ptr,offset)) + +#define RR_GET32_LE_UNALIGNED(ptr) *RR_U32_PTR_OFFSET_UNALIGNED(ptr,0) +#define RR_GET32_LE_UNALIGNED_OFFSET(ptr,offset) *RR_U32_PTR_OFFSET_UNALIGNED(ptr,offset) +#define RR_GET16_LE_UNALIGNED(ptr) *RR_U16_PTR_OFFSET_UNALIGNED(ptr,0) +#define RR_GET16_LE_UNALIGNED_OFFSET(ptr,offset) *RR_U16_PTR_OFFSET_UNALIGNED(ptr,offset) + +#elif defined(__RADPSP2__) + +#define RR_U16_PTR_OFFSET_UNALIGNED(ptr,offset) ((U16 __unaligned * RR_GET_PTR_POST)((char *)(ptr) + (offset))) +#define RR_U32_PTR_OFFSET_UNALIGNED(ptr,offset) ((U32 __unaligned * RR_GET_PTR_POST)((char *)(ptr) + (offset))) + +#define RR_GET32_BE_UNALIGNED(ptr) RR_BSWAP32(*RR_U32_PTR_OFFSET_UNALIGNED(ptr,0)) +#define RR_GET32_BE_UNALIGNED_OFFSET(ptr,offset) RR_BSWAP32(*RR_U32_PTR_OFFSET_UNALIGNED(ptr,offset)) +#define RR_GET16_BE_UNALIGNED(ptr) RR_BSWAP16(*RR_U16_PTR_OFFSET_UNALIGNED(ptr,0)) +#define RR_GET16_BE_UNALIGNED_OFFSET(ptr,offset) RR_BSWAP16(*RR_U16_PTR_OFFSET_UNALIGNED(ptr,offset)) + +#define RR_GET32_LE_UNALIGNED(ptr) *RR_U32_PTR_OFFSET_UNALIGNED(ptr,0) +#define RR_GET32_LE_UNALIGNED_OFFSET(ptr,offset) *RR_U32_PTR_OFFSET_UNALIGNED(ptr,offset) +#define RR_GET16_LE_UNALIGNED(ptr) *RR_U16_PTR_OFFSET_UNALIGNED(ptr,0) +#define RR_GET16_LE_UNALIGNED_OFFSET(ptr,offset) *RR_U16_PTR_OFFSET_UNALIGNED(ptr,offset) + +#else +// Unaligned via bytes : + +#define RR_GET32_BE_UNALIGNED(ptr) ( \ + ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr)))[0] << 24 ) | \ + ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr)))[1] << 16 ) | \ + ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr)))[2] << 8 ) | \ + ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr)))[3] << 0 ) ) + +#define RR_GET32_BE_UNALIGNED_OFFSET(ptr,offset) ( \ + ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr))+(offset))[0] << 24 ) | \ + ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr))+(offset))[1] << 16 ) | \ + ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr))+(offset))[2] << 8 ) | \ + ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr))+(offset))[3] << 0 ) ) + +#define RR_GET16_BE_UNALIGNED(ptr) ( \ + ( (U16)(((const U8 * RR_GET_PTR_POST)(ptr)))[0] << 8 ) | \ + ( (U16)(((const U8 * RR_GET_PTR_POST)(ptr)))[1] << 0 ) ) + +#define RR_GET16_BE_UNALIGNED_OFFSET(ptr,offset) ( \ + ( (U16)(((const U8 * RR_GET_PTR_POST)(ptr))+(offset))[0] << 8 ) | \ + ( (U16)(((const U8 * RR_GET_PTR_POST)(ptr))+(offset))[1] << 0 ) ) + +#define RR_GET32_LE_UNALIGNED(ptr) ( \ + ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr)))[3] << 24 ) | \ + ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr)))[2] << 16 ) | \ + ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr)))[1] << 8 ) | \ + ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr)))[0] << 0 ) ) + +#define RR_GET32_LE_UNALIGNED_OFFSET(ptr,offset) ( \ + ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr))+(offset))[3] << 24 ) | \ + ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr))+(offset))[2] << 16 ) | \ + ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr))+(offset))[1] << 8 ) | \ + ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr))+(offset))[0] << 0 ) ) + +#define RR_GET16_LE_UNALIGNED(ptr) ( \ + ( (U16)(((const U8 * RR_GET_PTR_POST)(ptr)))[1] << 8 ) | \ + ( (U16)(((const U8 * RR_GET_PTR_POST)(ptr)))[0] << 0 ) ) + +#define RR_GET16_LE_UNALIGNED_OFFSET(ptr,offset) ( \ + ( (U16)(((const U8 * RR_GET_PTR_POST)(ptr))+(offset))[1] << 8 ) | \ + ( (U16)(((const U8 * RR_GET_PTR_POST)(ptr))+(offset))[0] << 0 ) ) + +#endif + +//=================================================================== +// RR_ROTL32 : 32-bit rotate +// + +#ifdef _MSC_VER + + unsigned long __cdecl _lrotl(unsigned long, int); + #pragma intrinsic(_lrotl) + + #define RR_ROTL32(x,k) _lrotl((unsigned long)(x),(int)(k)) + +#elif defined(__RADCELL__) || defined(__RADLINUX__) || defined(__RADWII__) || defined(__RADMACAPI__) || defined(__RADWIIU__) || defined(__RADPS4__) || defined(__RADPSP2__) + + // Compiler turns this into rotate correctly : + #define RR_ROTL32(u32,num) ( ( (u32) << (num) ) | ( (u32) >> (32 - (num))) ) + +#elif defined(__RAD3DS__) + + #define RR_ROTL32(u32,num) __ror(u32, (-(num))&31) + +#else + +// comment out fallbacks so users will get errors +// fallback implementation using shift and or : +//#define RR_ROTL32(u32,num) ( ( (u32) << (num) ) | ( (u32) >> (32 - (num))) ) + +#endif + + +//=================================================================== +// RR_ROTL64 : 64-bit rotate + +#if ( defined(_MSC_VER) && _MSC_VER >= 1300) + +unsigned __int64 __cdecl _rotl64(unsigned __int64 _Val, int _Shift); +#pragma intrinsic(_rotl64) + +#define RR_ROTL64(x,k) _rotl64((unsigned __int64)(x),(int)(k)) + +#elif defined(__RADCELL__) + +// PS3 GCC turns this into rotate correctly : +#define RR_ROTL64(u64,num) ( ( (u64) << (num) ) | ( (u64) >> (64 - (num))) ) + +#elif defined(__RADLINUX__) || defined(__RADMACAPI__) + +//APTODO: Just to compile linux. Should we be doing better than this? If not, combine with above. +#define RR_ROTL64(u64,num) ( ( (u64) << (num) ) | ( (u64) >> (64 - (num))) ) + +#else + +// comment out fallbacks so users will get errors +// fallback implementation using shift and or : +//#define RR_ROTL64(u64,num) ( ( (u64) << (num) ) | ( (u64) >> (64 - (num))) ) + +#endif + +//=================================================================== + +RADDEFEND + +//=================================================================== + +// RR_COMPILER_ASSERT +#if defined(__cplusplus) && !defined(RR_COMPILER_ASSERT) + #if defined(_MSC_VER) && (_MSC_VER >=1400) + + // better version of COMPILER_ASSERT using boost technique + template struct RR_COMPILER_ASSERT_FAILURE; + + template <> struct RR_COMPILER_ASSERT_FAILURE<1> { enum { value = 1 }; }; + + template struct rr_compiler_assert_test{}; + + // __LINE__ macro broken when -ZI is used see Q199057 + #define RR_COMPILER_ASSERT( B ) \ + typedef rr_compiler_assert_test<\ + sizeof(RR_COMPILER_ASSERT_FAILURE< (B) ? 1 : 0 >)\ + > rr_compiler_assert_typedef_ + + #endif +#endif + +#ifndef RR_COMPILER_ASSERT + // this happens at declaration time, so if it's inside a function in a C file, drop {} around it + #define RR_COMPILER_ASSERT(exp) typedef char RR_STRING_JOIN(_dummy_array, __LINE__) [ (exp) ? 1 : -1 ] +#endif + +//=================================================================== +// some error checks : + + RR_COMPILER_ASSERT( sizeof(RAD_UINTa) == sizeof( RR_STRING_JOIN(RAD_U,RAD_PTRBITS) ) ); + RR_COMPILER_ASSERT( sizeof(RAD_UINTa) == RAD_PTRBYTES ); + RR_COMPILER_ASSERT( RAD_TWOPTRBYTES == 2* RAD_PTRBYTES ); + +//=================================================================== + + #endif // __RADRES__ + +//include "testconstant.inl" // uncomment and include to test statement constants + +#endif // __RADRR_COREH__ + + diff --git a/Minecraft.Client/PSVita/Miles/lib/binkapsp2.a b/Minecraft.Client/PSVita/Miles/lib/binkapsp2.a new file mode 100644 index 00000000..2b988f83 Binary files /dev/null and b/Minecraft.Client/PSVita/Miles/lib/binkapsp2.a differ diff --git a/Minecraft.Client/PSVita/Miles/lib/fltpsp2.a b/Minecraft.Client/PSVita/Miles/lib/fltpsp2.a new file mode 100644 index 00000000..9083b9b8 Binary files /dev/null and b/Minecraft.Client/PSVita/Miles/lib/fltpsp2.a differ diff --git a/Minecraft.Client/PSVita/Miles/lib/msspsp2.a b/Minecraft.Client/PSVita/Miles/lib/msspsp2.a new file mode 100644 index 00000000..f196f862 Binary files /dev/null and b/Minecraft.Client/PSVita/Miles/lib/msspsp2.a differ diff --git a/Minecraft.Client/PSVita/Miles/lib/msspsp2midi.a b/Minecraft.Client/PSVita/Miles/lib/msspsp2midi.a new file mode 100644 index 00000000..cdaf1d53 Binary files /dev/null and b/Minecraft.Client/PSVita/Miles/lib/msspsp2midi.a differ diff --git a/Minecraft.Client/PSVita/Network/PSVita_NPToolkit.cpp b/Minecraft.Client/PSVita/Network/PSVita_NPToolkit.cpp new file mode 100644 index 00000000..1c5c45e3 --- /dev/null +++ b/Minecraft.Client/PSVita/Network/PSVita_NPToolkit.cpp @@ -0,0 +1,510 @@ +#include "stdafx.h" + +#include "PSVita_NPToolkit.h" +#include "PSVita/PSVitaExtras/Conf.h" +#include "PSVita/Network/SonyCommerce_Vita.h" + +// #define NP_TITLE_ID "CUSA00265_00" +// #define NP_TITLE_SECRET_HEX "c37e30fa1f7fd29e3534834d62781143ae29aa7b51d02320e7aa0b45116ad600e4d309e8431bc37977d98b8db480e721876e7d736e11fd906778c0033bbb6370903477b1dc1e65106afc62007a5feee3158844d721b88c3f4bff2e56417b6910cedfdec78b130d2e0dd35a35a9e2ae31d5889f9398c1d62b52a3630bb03faa5b" +// #define CLIENT_ID_FOR_SAMPLE "c8c483e7-f0b4-420b-877b-307fcb4c3cdc" + +//#define _USE_STANDARD_ALLOC + +// sce::Toolkit::NP::Utilities::Future< sce::Toolkit::NP::NpSessionInformation > PSVitaNPToolkit::sm_createJoinFuture; +// sce::Toolkit::NP::NpSessionInformation PSVitaNPToolkit::m_currentSessionInfo; +sce::Toolkit::NP::Utilities::Future PSVitaNPToolkit::m_messageData; + + +void PSVitaNPToolkit::presenceCallback( const sce::Toolkit::NP::Event& event ) +{ + switch(event.event) + { + case sce::Toolkit::NP::Event::presenceSet: + app.DebugPrintf("presenceSet Successfully\n"); + break; + case sce::Toolkit::NP::Event::presenceSetFailed: + app.DebugPrintf("presenceSetFailed event received = 0x%x\n", event.returnCode); + SQRNetworkManager_Vita::SetPresenceFailedCallback(); +// assert(0); + break; + default: + break; + } +} + +void PSVitaNPToolkit::profileCallback( const sce::Toolkit::NP::Event& event ) +{ + switch(event.event) + { + case sce::Toolkit::NP::Event::profileError: + app.DebugPrintf("User profile error: 0x%x\n", event.returnCode); + break; + default: + app.DebugPrintf("User profile event: %i\n", event.event); + break; + } +} + +void PSVitaNPToolkit::messagingCallback( const sce::Toolkit::NP::Event& event ) +{ + switch(event.event) + { + case sce::Toolkit::NP::Event::serviceError: + app.DebugPrintf("NP messagingCallback - serviceError: 0x%x\n", event.returnCode); + ProfileManager.SetSysUIShowing( false ); + break; + case sce::Toolkit::NP::Event::messageSent: + app.DebugPrintf("NP messagingCallback - messageSent: 0x%x\n", event.returnCode); + ProfileManager.SetSysUIShowing( false ); + break; + case sce::Toolkit::NP::Event::messageError: + app.DebugPrintf("NP messagingCallback - messageError: 0x%x\n", event.returnCode); + if(SQRNetworkManager_Vita::m_bSendingInviteMessage) // MGH - added to fix a sysUI lockup on startup - devtrack #5883 + ProfileManager.SetSysUIShowing( false ); + break; + case sce::Toolkit::NP::Event::messageDialogTerminated: + app.DebugPrintf("NP messagingCallback - messageDialogTerminated: 0x%x\n", event.returnCode); + ProfileManager.SetSysUIShowing( false ); + break; + case sce::Toolkit::NP::Event::messageRetrieved: + app.DebugPrintf("NP messagingCallback - messageRetrieved: 0x%x\n", event.returnCode); + if(m_messageData.hasResult()) + { + SQRNetworkManager_Vita::GetInviteDataAndProcess(m_messageData.get()); + } + else + { + app.DebugPrintf("messageRetrieved error 0x%08x\n", m_messageData.getError()); + } + break; + case sce::Toolkit::NP::Event::messageInGameDataReceived: + app.DebugPrintf("NP messagingCallback - messageInGameDataReceived: 0x%x\n", event.returnCode); + break; + case sce::Toolkit::NP::Event::messageInGameDataRetrievalDone: + app.DebugPrintf("NP messagingCallback - messageInGameDataRetrievalDone: 0x%x\n", event.returnCode); + break; + + default: + assert(0); + break; + } +} + +void PSVitaNPToolkit::coreCallback( const sce::Toolkit::NP::Event& event ) +{ + switch (event.event) + { + case sce::Toolkit::NP::Event::enetUp: ///< An event from the NetCtl service generated when a connection has been established. + app.DebugPrintf("Received core callback: Network Up \n"); + break; + case sce::Toolkit::NP::Event::enetDown: ///< An event from the NetCtl service generated when the connection layer has gone down. + app.DebugPrintf("Received core callback: Network down \n"); + 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"); + 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"); + ProfileManager.SetNetworkStatus(false, true); + break; + default: + app.DebugPrintf("Received core callback: event Num: %d \n", event.event); + break; + } +} + +void PSVitaNPToolkit::sceNpToolkitCallback( const sce::Toolkit::NP::Event& event) +{ + switch(event.service) + { + case sce::Toolkit::NP::ServiceType::core: + coreCallback(event); + break; +// case sce::Toolkit::NP::ServiceType::netInfo: +// Menu::NetInfo::sceNpToolkitCallback(event); +// break; +// case sce::Toolkit::NP::ServiceType::sessions: +// sessionsCallback(event); +// break; +// case sce::Toolkit::NP::ServiceType::tss: +// Menu::Tss::sceNpToolkitCallback(event); +// break; +// case sce::Toolkit::NP::ServiceType::ranking: +// Menu::Ranking::sceNpToolkitCallback(event); +// break; +// case sce::Toolkit::NP::ServiceType::tus: +// Menu::Tus::sceNpToolkitCallback(event); +// break; + case sce::Toolkit::NP::ServiceType::profile: + profileCallback(event); + break; + case sce::Toolkit::NP::ServiceType::messaging: + messagingCallback(event); +// case sce::Toolkit::NP::ServiceType::friends: +// Menu::Friends::sceNpToolkitCallback(event); +// break; +// case sce::Toolkit::NP::ServiceType::auth: +// Menu::Auth::sceNpToolkitCallback(event); +// break; + case sce::Toolkit::NP::ServiceType::trophy: +// ProfileManager.trophySystemCallback(event); + break; +// case sce::Toolkit::NP::ServiceType::messaging: +// messagingCallback(event); +// case sce::Toolkit::NP::ServiceType::inGameMessage: +// Menu::Messaging::sceNpToolkitCallback(event); +// break; + + case sce::Toolkit::NP::ServiceType::commerce: + SonyCommerce_Vita::commerce2Handler(event); + break; + case sce::Toolkit::NP::ServiceType::presence: + presenceCallback(event); + break; +// case sce::Toolkit::NP::ServiceType::wordFilter: +// Menu::WordFilter::sceNpToolkitCallback(event); +// break; +// case sce::Toolkit::NP::ServiceType::sns: +// Menu::Sns::sceNpToolkitCallback(event); +// break; + +// case sce::Toolkit::NP::ServiceType::gameCustomData: +// gameCustomDataCallback(event); + default: + break; + } +} + + +// +// void PSVitaNPToolkit::sessionsCallback( const sce::Toolkit::NP::Event& event) +// { +// switch(event.event) +// { +// case sce::Toolkit::NP::Event::npSessionCreateResult: ///< An event generated when the %Np session creation process has been completed. +// app.DebugPrintf("npSessionCreateResult"); +// if(sm_createJoinFuture.hasResult()) +// { +// app.DebugPrintf("Session Created Successfully\n"); +// m_currentSessionInfo = *sm_createJoinFuture.get(); +// } +// else +// { +// app.DebugPrintf("Session Creation Failed 0x%x\n",sm_createJoinFuture.getError()); +// } +// sm_createJoinFuture.reset(); +// break; +// case sce::Toolkit::NP::Event::npSessionJoinResult: ///< An event generated when the join %Np session process has been completed. +// app.DebugPrintf("npSessionJoinResult"); +// if(sm_createJoinFuture.hasResult()) +// { +// app.DebugPrintf("Session joined successfully\n"); +// m_currentSessionInfo = *sm_createJoinFuture.get(); +// } +// else +// { +// app.DebugPrintf("Session join Failed 0x%x\n",sm_createJoinFuture.getError()); +// } +// sm_createJoinFuture.reset(); +// break; +// case sce::Toolkit::NP::Event::npSessionError: ///< An event generated when there was error performing the current %Np session process. +// app.DebugPrintf("npSessionError"); +// break; +// case sce::Toolkit::NP::Event::npSessionLeaveResult: ///< An event generated when the user has left the current %Np session. +// app.DebugPrintf("npSessionLeaveResult"); +// break; +// case sce::Toolkit::NP::Event::npSessionModified: ///< An event generated when the %Np session has been modified. +// app.DebugPrintf("npSessionModified"); +// break; +// case sce::Toolkit::NP::Event::npSessionUpdateResult: ///< An event generated when the %Np session has been updated. +// app.DebugPrintf("npSessionUpdateResult"); +// break; +// case sce::Toolkit::NP::Event::npSessionGetInfoResult: ///< An event generated when the %Np session info has been retrieved. +// app.DebugPrintf("npSessionGetInfoResult"); +// break; +// case sce::Toolkit::NP::Event::npSessionGetInfoListResult: ///< An event generated when the %Np session info has been retrieved. +// app.DebugPrintf("npSessionGetInfoListResult"); +// break; +// case sce::Toolkit::NP::Event::npSessionGetSessionDataResult: ///< An event generated when the %Np session data has been retrieved. +// app.DebugPrintf("npSessionGetSessionDataResult"); +// break; +// case sce::Toolkit::NP::Event::npSessionSearchResult: ///< An event generated when the %Np session search request has been completed. +// app.DebugPrintf("npSessionSearchResult"); +// break; +// case sce::Toolkit::NP::Event::npSessionInviteNotification: ///< An event generated when the %Np session push notification is received. +// app.DebugPrintf("npSessionInviteNotification"); +// break; +// case sce::Toolkit::NP::Event::npSessionInviteGetInfoResult: ///< An event generated when the %Np session info has been retrieved. +// app.DebugPrintf("npSessionInviteGetInfoResult"); +// break; +// case sce::Toolkit::NP::Event::npSessionInviteGetInfoListResult: ///< An event generated when the %Np session info has been retrieved. +// app.DebugPrintf("npSessionInviteGetInfoListResult"); +// break; +// case sce::Toolkit::NP::Event::npSessionInviteGetDataResult: ///< An event generated when the %Np session data has been retrieved. +// app.DebugPrintf("npSessionInviteGetDataResult"); +// break; +// default: +// assert(0); +// break; +// } +// +// } + +void PSVitaNPToolkit::gameCustomDataCallback( const sce::Toolkit::NP::Event& event) +{ +// switch(event.event) +// { +// +// case sce::Toolkit::NP::Event::gameCustomDataItemListResult: +// app.DebugPrintf("gameCustomDataItemListResult"); +// break; +// case sce::Toolkit::NP::Event::gameCustomDataGameDataResult: +// app.DebugPrintf("gameCustomDataGameDataResult"); +// if(m_messageData.hasResult()) +// { +// SQRNetworkManager_Orbis::GetInviteDataAndProcess(m_messageData.get()); +// } +// else +// { +// app.DebugPrintf("gameCustomDataMessageResult error 0x%08x\n", m_messageData.getError()); +// } +// break; +// case sce::Toolkit::NP::Event::gameCustomDataMessageResult: +// app.DebugPrintf("gameCustomDataMessageResult"); +// break; +// case sce::Toolkit::NP::Event::gameCustomDataSetUseFlagResult: +// app.DebugPrintf("gameCustomDataSetUseFlagResult"); +// break; +// case sce::Toolkit::NP::Event::gameCustomDataGameThumbnailResult: +// app.DebugPrintf("gameCustomDataGameThumbnailResult"); +// break; +// case sce::Toolkit::NP::Event::messageError: +// app.DebugPrintf("messageError : 0x%08x\n", event.returnCode); +// assert(0); +// break; +// default: +// assert(0); +// break; +// } +} + +static uint8_t hexCharToUint(char ch) +{ + uint8_t val = 0; + + if ( isdigit(ch) ){ + val = (ch - '0'); + } + else if ( isupper(ch) ){ + val = (ch - 'A' + 10); + } + else{ + val = (ch - 'a' + 10); + } + + return val; +} + +void hexStrToBin( + const char *pHexStr, + uint8_t *pBinBuf, + size_t binBufSize + ) +{ + uint8_t val = 0; + int hexStrLen = strlen(pHexStr); + + int binOffset = 0; + for (int i = 0; i < hexStrLen; i++) { + val |= hexCharToUint(*(pHexStr + i)); + if (i % 2 == 0) { + val <<= 4; + } + else { + if (pBinBuf != NULL && binOffset < binBufSize) { + memcpy(pBinBuf + binOffset, &val, 1); + val = 0; + } + binOffset++; + } + } + + if (val != 0 && pBinBuf != NULL && binOffset < binBufSize) { + memcpy(pBinBuf + binOffset, &val, 1); + } + + return; +} + + +static void npStateCallback(SceNpServiceState state, int retCode, void *userdata) +{ + //CD - Updates the online status of player + switch(state) + { + case SCE_NP_SERVICE_STATE_SIGNED_OUT: + ProfileManager.SetNetworkStatus(false, false); + break; + case SCE_NP_SERVICE_STATE_SIGNED_IN: + ProfileManager.SetNetworkStatus(false, true); + break; + case SCE_NP_SERVICE_STATE_ONLINE: + 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; + } +} + +void PSVitaNPToolkit::init() +{ +// MenuApp menuApp; +// sce::Toolkit::NP::NpTitleId nptTitleId; +// nptTitleId.setTitleSecret(*SQRNetworkManager_Vita::GetSceNpTitleId(), *SQRNetworkManager_Vita::GetSceNpTitleSecret()); + sce::Toolkit::NP::CommunicationId commsIds(s_npCommunicationId, s_npCommunicationPassphrase, s_npCommunicationSignature); + sce::Toolkit::NP::Parameters params(sceNpToolkitCallback,commsIds); + params.m_title.setId(app.GetCommerceCategory()); + + + int ret = sce::Toolkit::NP::Interface::init(params); + if (ret != SCE_OK) + { + app.DebugPrintf("Failed to initialize NP Toolkit Library : 0x%x\n", ret); + assert(0); + } + + + ret = sce::Toolkit::NP::Interface::registerNpCommsId(commsIds, sce::Toolkit::NP::matching); + if (ret < 0) + { + app.DebugPrintf("Failed to register TSS Comms ID : 0x%x\n", ret); + assert(0); + } + +// extern void npStateCallback(SceNpServiceState state, int retCode, void *userdata); + + ret = sceNpRegisterServiceStateCallback(npStateCallback, NULL); + if (ret < 0) + { + app.DebugPrintf("sceNpRegisterServiceStateCallback() failed. ret = 0x%x\n", ret); + } + + + + +// // Register Client ID for Auth +// ret = sce::Toolkit::NP::Interface::registerClientId(CLIENT_ID_FOR_SAMPLE); +// if (ret < 0) +// { +// app.DebugPrintf("Failed to register Auth Client ID : 0x%x\n", ret); +// assert(0); +// } + +} + + + +// void PSVitaNPToolkit::createNPSession() +// { +// #define CURRENT_SESSION_ATTR_NUMS 5 +// #define SESSION_IMAGE_PATH "/app0/orbis/session_image.png" +// #define SESSION_STATUS "Minecraft online game (this text needs defined and localised)" +// #define SESSION_NAME "Minecraft(this text needs defined and localised)" +// +// static const int maxSlots = 8; +// +// SceUserServiceUserId userId = SCE_USER_SERVICE_USER_ID_INVALID; +// int ret = sceUserServiceGetInitialUser(&userId); +// if( ret < 0 ) +// { +// app.DebugPrintf("Couldn't retrieve user ID 0x%x ...\n",ret); +// } +// +// sce::Toolkit::NP::CreateNpSessionRequest createSessionRequest; +// memset(&createSessionRequest,0,sizeof(createSessionRequest)); +// strncpy(createSessionRequest.sessionName,SESSION_NAME,strlen(SESSION_NAME)); +// createSessionRequest.sessionTypeFlag = SCE_TOOLKIT_NP_CREATE_SESSION_TYPE_PUBLIC; +// createSessionRequest.maxSlots = maxSlots; +// strncpy(createSessionRequest.sessionImgPath,SESSION_IMAGE_PATH,strlen(SESSION_IMAGE_PATH)); +// strncpy(createSessionRequest.sessionStatus,SESSION_STATUS,strlen(SESSION_STATUS)); +// createSessionRequest.userInfo.userId = userId; +// char test[3] = {'R','K','B'}; +// createSessionRequest.sessionData= test; +// createSessionRequest.sessionDataSize = 3; +// ret = sce::Toolkit::NP::Sessions::Interface::create(&createSessionRequest,&sm_createJoinFuture); +// } +// +// +// void PSVitaNPToolkit::joinNPSession() +// { +// SceUserServiceUserId userId = SCE_USER_SERVICE_USER_ID_INVALID; +// int ret = sceUserServiceGetInitialUser(&userId); +// if( ret < 0 ) +// { +// app.DebugPrintf("Couldn't retrieve user ID 0x%x ...\n",ret); +// } +// +// sce::Toolkit::NP::JoinNpSessionRequest joinSessionRequest; +// memset(&joinSessionRequest,0,sizeof(joinSessionRequest)); +// // still to sort this out +// ORBIS_STUBBED; +// } +// +// void PSVitaNPToolkit::leaveNPSession() +// { +// +// } +// + + +void PSVitaNPToolkit::getMessageData(SceAppUtilAppEventParam* paramData) +{ + + if (SCE_APPUTIL_APPEVENT_TYPE_NP_INVITE_MESSAGE == paramData->type) + { + sce::Toolkit::NP::Messaging::Interface::retrieveMessageAttachment(paramData,&m_messageData); + } + else if (SCE_APPUTIL_APPEVENT_TYPE_NP_APP_DATA_MESSAGE == paramData->type) + { + sce::Toolkit::NP::Messaging::Interface::retrieveMessageAttachment(paramData,&m_messageData); + } + else if (SCE_APPUTIL_APPEVENT_TYPE_NP_BASIC_JOINABLE_PRESENCE == paramData->type) + { + SceAppUtilNpBasicJoinablePresenceParam joinParam = {0}; + int ret = sceAppUtilAppEventParseNpBasicJoinablePresence(paramData, &joinParam); + if (ret < 0) + { + app.DebugPrintf("sceAppUtilAppEventParseNpBasicJoinablePresence() failed: 0x%x\n", ret); + } + else + { + SQRNetworkManager_Vita::GetJoinablePresenceDataAndProcess(&joinParam); + } + + } + else + { + assert(0); + } + +} \ No newline at end of file diff --git a/Minecraft.Client/PSVita/Network/PSVita_NPToolkit.h b/Minecraft.Client/PSVita/Network/PSVita_NPToolkit.h new file mode 100644 index 00000000..064d837a --- /dev/null +++ b/Minecraft.Client/PSVita/Network/PSVita_NPToolkit.h @@ -0,0 +1,32 @@ +#pragma once + +#include +// #include + + +class PSVitaNPToolkit +{ +public: + static void init(); + static void sceNpToolkitCallback( const sce::Toolkit::NP::Event& event); + static void coreCallback( const sce::Toolkit::NP::Event& event); + static void presenceCallback( const sce::Toolkit::NP::Event& event); + static void profileCallback( const sce::Toolkit::NP::Event& event); + static void messagingCallback( const sce::Toolkit::NP::Event& event); + static void sessionsCallback( const sce::Toolkit::NP::Event& event); + static void gameCustomDataCallback( const sce::Toolkit::NP::Event& event); + +// static void createNPSession(); +// static void destroyNPSession(); +// static void joinNPSession(); +// static void leaveNPSession(); +// static SceNpSessionId* getNPSessionID() { return &m_currentSessionInfo.npSessionId; } + + static void getMessageData(SceAppUtilAppEventParam* paramData); +private: +// static sce::Toolkit::NP::Utilities::Future sm_createJoinFuture; +// static sce::Toolkit::NP::NpSessionInformation m_currentSessionInfo; + static sce::Toolkit::NP::Utilities::Future m_messageData; + +}; + diff --git a/Minecraft.Client/PSVita/Network/SQRNetworkManager_AdHoc_Vita.cpp b/Minecraft.Client/PSVita/Network/SQRNetworkManager_AdHoc_Vita.cpp new file mode 100644 index 00000000..9a95ee08 --- /dev/null +++ b/Minecraft.Client/PSVita/Network/SQRNetworkManager_AdHoc_Vita.cpp @@ -0,0 +1,3251 @@ +#include "stdafx.h" +#include "SQRNetworkManager_AdHoc_Vita.h" +#include "SonyVoiceChat_Vita.h" +#include "Common/Network/Sony/PlatformNetworkManagerSony.h" + +#include +#include +#include +#include +#include +#include +#include + +#include "PSVita\PSVitaExtras\Conf.h" +#include "Common\Network\Sony\SonyHttp.h" +#include "..\..\..\Minecraft.World\C4JThread.h" + + +#define MATCHING_PORT (1) +#define MATCHING_RXBUFLEN (2048) +#define HELLO_INTERVAL (1 * 1000 * 1000) + +#define KEEPALIVE_INTERVAL (1000 * 1000) +#define INIT_COUNT (10) // seconds before timeout +#define REXMT_INTERVAL (1000 * 1000) +#define MATCHING_EVENT_HANDLER_STACK_SIZE ((4 * 1024) + SCE_NET_ADHOC_MATCHING_POOLSIZE_DEFAULT) + +#define ADHOC_VPORT 4649 +class HelloSyncInfo +{ +public: + SQRNetworkManager::PresenceSyncInfo m_presenceSyncInfo; + GameSessionData m_gameSessionData; + SQRNetworkManager::RoomSyncData m_roomSyncData; +}; + + +static const bool sc_voiceChatEnabled = false; // don't think we'll need voice chat in ad-hoc, will need some work to get the mesh connections if we do. + + +bool g_bNetworkAdHocMode = false; + +int SQRNetworkManager_AdHoc_Vita::m_adhocStatus = false; + + +static unsigned char s_Matching2Pool[SCE_NET_ADHOC_MATCHING_POOLSIZE_DEFAULT]; + +int (* SQRNetworkManager_AdHoc_Vita::s_SignInCompleteCallbackFn)(void *pParam, bool bContinue, int pad) = NULL; +void * SQRNetworkManager_AdHoc_Vita::s_SignInCompleteParam = NULL; +sce::Toolkit::NP::PresenceDetails SQRNetworkManager_AdHoc_Vita::s_lastPresenceInfo; +int SQRNetworkManager_AdHoc_Vita::s_resendPresenceCountdown = 0; +bool SQRNetworkManager_AdHoc_Vita::s_presenceStatusDirty = false; +bool SQRNetworkManager_AdHoc_Vita::s_presenceDataDirty = false; +bool SQRNetworkManager_AdHoc_Vita::s_signInCompleteCallbackIfFailed = false; +HelloSyncInfo SQRNetworkManager_AdHoc_Vita::s_lastPresenceSyncInfo = { 0 }; +HelloSyncInfo SQRNetworkManager_AdHoc_Vita::c_presenceSyncInfoNULL = { 0 }; +//SceNpBasicAttachmentDataId SQRNetworkManager_AdHoc_Vita::s_lastInviteIdToRetry = SCE_NP_BASIC_INVALID_ATTACHMENT_DATA_ID; +long long SQRNetworkManager_AdHoc_Vita::s_roomStartTime = 0; +bool SQRNetworkManager_AdHoc_Vita::b_inviteRecvGUIRunning = false; +// HelloSyncInfo* SQRNetworkManager_AdHoc_Vita::m_gameBootInvite; +// HelloSyncInfo SQRNetworkManager_AdHoc_Vita::m_gameBootInvite_data; + +// static const int sc_UserEventHandle = 0; + +//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] = +{ + SNM_STATE_INITIALISING, // SNM_INT_STATE_UNINITIALISED + SNM_STATE_INITIALISING, // SNM_INT_STATE_SIGNING_IN + SNM_STATE_INITIALISING, // SNM_INT_STATE_STARTING_CONTEXT + SNM_STATE_INITIALISE_FAILED, // SNM_INT_STATE_INITIALISE_FAILED + SNM_STATE_IDLE, // SNM_INT_STATE_IDLE + SNM_STATE_IDLE, // SNM_INT_STATE_IDLE_RECREATING_MATCHING_CONTEXT + SNM_STATE_HOSTING, // SNM_INT_STATE_HOSTING_STARTING_MATCHING_CONTEXT + SNM_STATE_HOSTING, // SNM_INT_STATE_HOSTING_SEARCHING_FOR_SERVER + SNM_STATE_HOSTING, // SNM_INT_STATE_HOSTING_SERVER_SEARCH_SERVER_ERROR + SNM_STATE_HOSTING, // SNM_INT_STATE_HOSTING_SERVER_FOUND + SNM_STATE_HOSTING, // SNM_INT_STATE_HOSTING_SERVER_SEARCH_CREATING_CONTEXT + SNM_STATE_HOSTING, // SNM_INT_STATE_HOSTING_SERVER_SEARCH_FAILED + SNM_STATE_HOSTING, // SNM_INT_STATE_HOSTING_CREATE_ROOM_SEARCHING_FOR_WORLD + SNM_STATE_HOSTING, // SNM_INT_STATE_HOSTING_CREATE_ROOM_WORLD_FOUND + SNM_STATE_HOSTING, // SNM_INT_STATE_HOSTING_CREATE_ROOM_CREATING_ROOM + SNM_STATE_HOSTING, // SNM_INT_STATE_HOSTING_CREATE_ROOM_SUCCESS + SNM_STATE_HOSTING, // SNM_INT_STATE_HOSTING_CREATE_ROOM_FAILED + SNM_STATE_HOSTING, // SNM_INT_STATE_HOSTING_CREATE_ROOM_RESTART_MATCHING_CONTEXT + SNM_STATE_HOSTING, // SNM_INT_STATE_HOSTING_WAITING_TO_PLAY + SNM_STATE_JOINING, // SNM_INT_STATE_JOINING_STARTING_MATCHING_CONTEXT + SNM_STATE_JOINING, // SNM_INT_STATE_JOINING_SEARCHING_FOR_SERVER + SNM_STATE_JOINING, // SNM_INT_STATE_JOINING_SERVER_SEARCH_SERVER_ERROR + SNM_STATE_JOINING, // SNM_INT_STATE_JOINING_SERVER_FOUND + SNM_STATE_JOINING, // SNM_INT_STATE_JOINING_SERVER_SEARCH_CREATING_CONTEXT + SNM_STATE_JOINING, // SNM_INT_STATE_JOINING_SERVER_SEARCH_FAILED + SNM_STATE_JOINING, // SNM_INT_STATE_JOINING_JOIN_ROOM + SNM_STATE_JOINING, // SNM_INT_STATE_JOINING_JOIN_ROOM_FAILED + SNM_STATE_JOINING, // SNM_INT_STATE_JOINING_WAITING_FOR_LOCAL_PLAYERS + SNM_STATE_ENDING, // SNM_INT_STATE_SERVER_DELETING_CONTEXT + SNM_STATE_STARTING, // SNM_INT_STATE_STARTING + SNM_STATE_PLAYING, // SNM_INT_STATE_PLAYING + SNM_STATE_LEAVING, // SNM_INT_STATE_LEAVING + SNM_STATE_LEAVING, // SNM_INT_STATE_LEAVING_FAILED + SNM_STATE_ENDING, // SNM_INT_STATE_ENDING +}; + +SQRNetworkManager_AdHoc_Vita::SQRNetworkManager_AdHoc_Vita(ISQRNetworkManagerListener *listener) +{ + m_state = SNM_INT_STATE_UNINITIALISED; + m_stateExternal = SNM_STATE_INITIALISING; + m_nextIdleReasonIsFull = false; + m_friendSearchState = SNM_FRIEND_SEARCH_STATE_IDLE; + m_serverContextValid = false; + m_isHosting = false; + m_currentSmallId = 0; + memset( m_aRoomSlotPlayers, 0, sizeof(m_aRoomSlotPlayers) ); + m_listener = listener; + m_resendExternalRoomDataCountdown = 0; + m_matching2initialised = false; + m_matchingContextClientValid = false; + m_matchingContextServerValid = false; + m_soc = -1; +// m_inviteIndex = 0; +// m_doBootInviteCheck = true; + m_isInSession = false; + m_offlineGame = false; + m_offlineSQR = false; + m_aServerId = NULL; +// m_gameBootInvite = NULL; + m_adhocStatus = false; + m_bLinkDisconnected = false; + m_bIsInitialised=false; + + 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 + +// int ret = sceKernelCreateEqueue(&m_basicEventQueue, "SQRNetworkManager_AdHoc_Vita EQ"); +// assert(ret == SCE_OK); +// ret = sceKernelAddUserEvent(m_basicEventQueue, sc_UserEventHandle); +// assert(ret == SCE_OK); +// +// m_basicEventThread = new C4JThread(&BasicEventThreadProc,this,"Basic Event Handler"); +// m_basicEventThread->Run(); +} + +static std::string getIPAddressString(SceNetInAddr add) +{ + char str[32]; + unsigned char *vals = (unsigned char*)&add.s_addr; + sprintf(str, "%d.%d.%d.%d", (int)vals[0], (int)vals[1], (int)vals[2], (int)vals[3]); + return std::string(str); +} + + +// First stage of initialisation. This initialises a few things that don't require the user to be signed in, and then kicks of the network start dialog utility. +// Initialisation continues in InitialiseAfterOnline once this completes. +void SQRNetworkManager_AdHoc_Vita::Initialise() +{ +#define NP_IN_GAME_MESSAGE_POOL_SIZE ( 16 * 1024 ) + + int32_t ret = 0; +// int32_t libCtxId = 0; +// ret = sceNpInGameMessageInitialize(NP_IN_GAME_MESSAGE_POOL_SIZE, NULL); +// assert (ret >= 0); +// libCtxId = ret; + + assert( m_state == SNM_INT_STATE_UNINITIALISED ); + + + //Initialize libnetctl +// ret = sceNetCtlInit(); +// if( ( ret < 0 && ret != SCE_NET_CTL_ERROR_NOT_TERMINATED ) || ForceErrorPoint( SNM_FORCE_ERROR_NET_CTL_INIT ) ) +// { +// SetState(SNM_INT_STATE_INITIALISE_FAILED); +// return; +// } + m_hid=0; + ret = sceNetCtlAdhocRegisterCallback(NetCtlCallback,this,&m_hid); + assert(ret == SCE_OK); + + // Initialise RUDP + const int RUDP_POOL_SIZE = (500 * 1024); // TODO - find out what we need, this size is copied from library reference + uint8_t *rudp_pool = (uint8_t *)malloc(RUDP_POOL_SIZE); + ret = sceRudpInit(rudp_pool, RUDP_POOL_SIZE); + if( ( ret < 0 ) || ForceErrorPoint( SNM_FORCE_ERROR_RUDP_INIT ) ) + { + SetState(SNM_INT_STATE_INITIALISE_FAILED); + return; + } + + SetState(SNM_INT_STATE_SIGNING_IN); + + +// SonyHttp::init(); + +// SceNpCommunicationConfig npConf ; +// npConf.commId = &s_npCommunicationId; +// npConf.commPassphrase = &s_npCommunicationPassphrase; +// npConf.commSignature = &s_npCommunicationSignature; +// ret = sceNpInit(&npConf, NULL); +// if (ret < 0 && ret != SCE_NP_ERROR_ALREADY_INITIALIZED) +// { +// app.DebugPrintf("sceNpInit failed, ret=%x\n", ret); +// assert(0); +// } +// + ret = sceRudpEnableInternalIOThread(RUDP_THREAD_STACK_SIZE, SCE_KERNEL_DEFAULT_PRIORITY); + if(ret < 0) + { + app.DebugPrintf("sceRudpEnableInternalIOThread failed with error code 0x%08x\n", ret); + assert(0); + } + + /* initialize pspnet adhoc */ + ret = sceNetAdhocInit(); + if(ret < 0) + { + app.DebugPrintf("sceNetAdhocInit() failed. ret = 0x%x\n", ret); + //sceNetCtlTerm(); + //sceNetTerm(); + assert(0); + return; + } + + /* initialize pspnet adhoc ctrl */ + SceNetAdhocctlAdhocId adhocId; + memset(&adhocId, 0x00, sizeof(SceNetAdhocctlAdhocId)); + adhocId.type = SCE_NET_ADHOCCTL_ADHOCTYPE_RESERVED; + memcpy(&adhocId.data[0], s_npCommunicationId.data, SCE_NET_ADHOCCTL_ADHOCID_LEN); + ret = sceNetAdhocctlInit(&adhocId); + if(ret < 0) + { + app.DebugPrintf("sceNetAdhocctlInit() failed. ret = 0x%x\n", ret); + assert(0); + } + + OnlineCheck(); + // Already online? the callback won't catch this, so carry on initialising now + if(GetAdhocStatus()) + { + InitialiseAfterOnline(); + } +// if(sc_voiceChatEnabled) +// { +// SonyVoiceChat_Vita::init(); +// } + + m_bIsInitialised=true; +} + +bool SQRNetworkManager_AdHoc_Vita::IsInitialised() +{ + return m_bIsInitialised; +} + +void SQRNetworkManager_AdHoc_Vita::UnInitialise() +{ + int ret; + StopMatchingContext(); + // These can fail if we've not initialised after online + ret = sceNetAdhocMatchingTerm(); + ret = sceRudpEnd(); + ret = sceNpMatching2Term(); + /////////////////////////////////////////////////////// + + ret = sceNetCtlAdhocUnregisterCallback(m_hid); + + //sceNetCtlTerm(); + + ret = sceNetAdhocTerm(); + +// ret = sceNetTerm(); + ret = sceNetAdhocctlTerm(); + + SetState(SNM_INT_STATE_UNINITIALISED); + + m_bIsInitialised=false; +} + +void SQRNetworkManager_AdHoc_Vita::Terminate() +{ + // If playing, attempt to nicely leave the room before shutting down so that our friends won't still think this game is in progress + if( ( m_state == SNM_INT_STATE_HOSTING_CREATE_ROOM_SUCCESS ) || + ( m_state == SNM_INT_STATE_HOSTING_WAITING_TO_PLAY ) || + ( m_state == SNM_INT_STATE_JOINING_WAITING_FOR_LOCAL_PLAYERS ) || + ( m_state == SNM_INT_STATE_PLAYING ) ) + { + if( !m_offlineGame ) + { + LeaveRoom(true); + int count = 200; + do + { + Tick(); + Sleep(10); + count--; + } while( ( count > 0 ) && ( m_state != SNM_INT_STATE_IDLE ) ); + app.DebugPrintf(CMinecraftApp::USER_RR,"Attempted to leave room, %dms used\n",count * 10); + } + } + + int ret = sceRudpEnd(); + ret = sceNpMatching2Term(); + // Terminate event thread by sending it a non-zero value for data +// sceKernelTriggerUserEvent(m_basicEventQueue, sc_UserEventHandle, (void*)1); + + +// do +// { +// Sleep(10); +// } while( m_basicEventThread->isRunning() ); +} + + +SceNpMatching2RoomMemberId getRoomMemberID(SceNetInAddr* addr) +{ + + // adhoc IP address are of the format 169.254.***.*** + // the last 2 digits of the IP address should be unique, so we're using them as a room member ID value + return addr->s_addr >> 16; +} + +void SQRNetworkManager_AdHoc_Vita::StopMatchingContext() +{ + if(m_matchingContextServerValid || m_matchingContextClientValid) + { + int err = sceNetAdhocMatchingStop(m_matchingContext); + assert(err == SCE_OK); + err = sceNetAdhocMatchingDelete(m_matchingContext); + assert(err == SCE_OK); + m_matchingContextServerValid = false; + m_matchingContextClientValid = false; + m_matchingContext = -1; + } +} + + +bool SQRNetworkManager_AdHoc_Vita::CreateMatchingContext(bool bServer /*= false*/) +{ + int matchingMode; + if(bServer) + { + if(m_matchingContextServerValid) + { + SetState(SNM_INT_STATE_IDLE); + return true; + } + matchingMode = SCE_NET_ADHOC_MATCHING_MODE_PARENT; + } + else + { + if(m_matchingContextClientValid) + { + SetState(SNM_INT_STATE_IDLE); + return true; + } + matchingMode = SCE_NET_ADHOC_MATCHING_MODE_CHILD; + } + StopMatchingContext(); + + int ret = sceNetAdhocMatchingCreate(matchingMode, // create this as a client (child) context at first so we can search for other servers (parents) + MAX_ONLINE_PLAYER_COUNT, MATCHING_PORT, MATCHING_RXBUFLEN, + HELLO_INTERVAL, KEEPALIVE_INTERVAL, INIT_COUNT, + REXMT_INTERVAL, MatchingEventHandler); + + s_pAdhocVitaManager = this; + + if( ( ret < 0 ) || ForceErrorPoint( SNM_FORCE_ERROR_CREATE_MATCHING_CONTEXT ) ) + { + SetState(SNM_INT_STATE_INITIALISE_FAILED); + return false; + } + + bool bRet = RegisterCallbacks(); + if( ( !bRet ) || ForceErrorPoint( SNM_FORCE_ERROR_REGISTER_CALLBACKS ) ) + { + SetState(SNM_INT_STATE_INITIALISE_FAILED); + return false; + } + m_matchingContext = ret; + + + + // Free up any external data that we received from the previous search + for( int i = 0; i < m_aFriendSearchResults.size(); i++ ) + { + if(m_aFriendSearchResults[i].m_RoomExtDataReceived) + free(m_aFriendSearchResults[i].m_RoomExtDataReceived); + m_aFriendSearchResults[i].m_RoomExtDataReceived = NULL; + if(m_aFriendSearchResults[i].m_gameSessionData) + free(m_aFriendSearchResults[i].m_gameSessionData); + m_aFriendSearchResults[i].m_gameSessionData = NULL; + } + m_friendCount = 0; + m_aFriendSearchResults.clear(); + + + // Start the context + // Set time-out time to 10 seconds + ret = sceNetAdhocMatchingStart(m_matchingContext, + SCE_KERNEL_DEFAULT_PRIORITY_USER, MATCHING_EVENT_HANDLER_STACK_SIZE, + SCE_KERNEL_THREAD_CPU_AFFINITY_MASK_DEFAULT, + 0, NULL);//sizeof(g_myInfo.name), &g_myInfo.name); + + if( ( ret < 0 ) || ForceErrorPoint( SNM_FORCE_ERROR_CONTEXT_START_ASYNC ) ) + { + SetState(SNM_INT_STATE_INITIALISE_FAILED); + return false; + } + + + + if(bServer) + m_matchingContextServerValid = true; + else + m_matchingContextClientValid = true; + + HandleMatchingContextStart(); + + return true; + + +} + + + +// Second stage of initialisation, that requires NP Manager to be online & the player to be signed in. This kicks of the creation of a context +// for Np Matching 2. Initialisation is finally complete when we get a callback to ContextCallback. The SQRNetworkManager_AdHoc_Vita is then finally moved +// into SNM_INT_STATE_IDLE at this stage. +void SQRNetworkManager_AdHoc_Vita::InitialiseAfterOnline() +{ +// SceNpId npId; +// int option = 0; + + // We should only be doing this if we have come in from an initialisation stage (SQRNetworkManager_AdHoc_Vita::Initialise) or we've had a network disconnect and are coming in from an offline state. + // Don't do anything otherwise - this mainly to catch a bit of a corner case in the initialisation phase where potentially we could register for the callback that would call this with sceNpManagerRegisterCallback. + // and could then really quickly go online so that the there becomes two paths (via the callback or SQRNetworkManager_AdHoc_Vita::Initialise) by which this could be called + if( ( m_state != SNM_INT_STATE_SIGNING_IN ) && !(( m_state == SNM_INT_STATE_IDLE ) && m_offlineSQR) ) + { + // If we aren't going to continue on with this sign-in but are expecting a callback, then let the game know that we have completed the bit we are expecting to do. This + // will happen whilst in game, when we want to be able to sign into PSN, but don't expect the full matching stuff to get set up. + if( s_SignInCompleteCallbackFn ) + { + s_SignInCompleteCallbackFn(s_SignInCompleteParam,true,0); + s_SignInCompleteCallbackFn = NULL; + } + return; + } + + // Initialize matching2 with default settings + int ret = sceNetAdhocMatchingInit(SCE_NET_ADHOC_MATCHING_POOLSIZE_DEFAULT, s_Matching2Pool); + + if( ( ret < 0 ) || ForceErrorPoint( SNM_FORCE_ERROR_MATCHING2_INIT ) ) + { + SetState(SNM_INT_STATE_INITIALISE_FAILED); + return; + } + app.DebugPrintf("SQRNetworkManager::InitialiseAfterOnline - matching context is now valid\n"); + m_matching2initialised = true; + + bool bRet = RegisterCallbacks(); + if( ( !bRet ) || ForceErrorPoint( SNM_FORCE_ERROR_REGISTER_CALLBACKS ) ) + { + SetState(SNM_INT_STATE_INITIALISE_FAILED); + return; + } + + // State should be starting context until the callback that this has been created happens + SetState(SNM_INT_STATE_STARTING_CONTEXT); + if(CreateMatchingContext()) + { + return; + } + + SetState(SNM_INT_STATE_IDLE); +} + + +// 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 ) + { + app.DebugPrintf("sceNetCtlCheckCallback error[%d]",ret); + } + updateNetCheckDialog(); //CD - Added this to match the SQRNetworkManager_Vita class + RoomCreateTick(); + FriendSearchTick(); + 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 ); +// m_gameBootInvite = NULL; +// } + + ErrorHandlingTick(); + // If we ever fail to send the external room data, we start a countdown so that we attempt to resend. Not sure how likely it is that updating this will fail without the whole network being broken, + // but if in particular we don't update the flag to say that the session is joinable, then nobody is ever going to see this session. + if( m_resendExternalRoomDataCountdown ) + { + if( m_state == SNM_INT_STATE_PLAYING ) + { + m_resendExternalRoomDataCountdown--; + if( m_resendExternalRoomDataCountdown == 0 ) + { + UpdateExternalRoomData(); + } + } + else + { + m_resendExternalRoomDataCountdown = 0; + } + } + + // ProfileManager.SetNetworkStatus(GetOnlineStatus()); + + // Client only - do the final transition to a starting & playing state once we have fully joined the room, And told the game about all the local players so they are also all valid + if( m_state == SNM_INT_STATE_JOINING_WAITING_FOR_LOCAL_PLAYERS ) + { + if( m_localPlayerJoined == m_localPlayerCount ) + { + // Since we're now fully joined, we can update our presence info so that our friends could find us in this game. This data was set up + // at the point that we joined the game (either from search info, or an invitation). + UpdateRichPresenceCustomData(&s_lastPresenceSyncInfo, sizeof(HelloSyncInfo)); + SetState( SNM_INT_STATE_STARTING); + SetState( SNM_INT_STATE_PLAYING ); + } + } + + if( m_state == SNM_INT_STATE_SERVER_DELETING_CONTEXT ) + { + // make sure we've removed all the remote players and killed the udp connections before we bail out +// if(m_RudpCtxToPlayerMap.size() == 0) + ResetToIdle(); + } + + EnterCriticalSection(&m_csStateChangeQueue); + while(m_stateChangeQueue.size() > 0 ) + { + if( m_listener ) + { + m_listener->HandleStateChange(m_stateChangeQueue.front().m_oldState, m_stateChangeQueue.front().m_newState, m_stateChangeQueue.front().m_idleReasonIsSessionFull); + if( m_stateChangeQueue.front().m_newState == SNM_STATE_IDLE ) + { + m_isInSession = false; + } + } + m_stateExternal = m_stateChangeQueue.front().m_newState; + m_stateChangeQueue.pop(); + } + LeaveCriticalSection(&m_csStateChangeQueue); +} + +// Detect any states which reflect internal error states, do anything required, and transition away again +void SQRNetworkManager_AdHoc_Vita::ErrorHandlingTick() +{ + switch( m_state ) + { + case SNM_INT_STATE_INITIALISE_FAILED: + if( s_SignInCompleteCallbackFn ) + { + if( s_signInCompleteCallbackIfFailed ) + { + s_SignInCompleteCallbackFn(s_SignInCompleteParam,false,0); + } + s_SignInCompleteCallbackFn = NULL; + } + app.DebugPrintf("Network error: SNM_INT_STATE_INITIALISE_FAILED\n"); + if( m_isInSession && m_offlineSQR ) + { + // This is a fix for an issue where a player attempts (and fails) to sign in, whilst in an offline game. This was setting the state to idle, which in turn + // sets the game to Not be in a session anymore (but the game wasn't generally aware of, and so keeps playing). Howoever, the game's connections use + // their tick to determine whether to empty their queues or not and so no communications (even though they don't actually use this network manager for local connections) + // were happening. + SetState(SNM_INT_STATE_PLAYING); + } + else + { + m_offlineSQR = true; + SetState(SNM_INT_STATE_IDLE); + } + break; + case SNM_INT_STATE_HOSTING_SERVER_SEARCH_FAILED: + app.DebugPrintf("Network error: SNM_INT_STATE_HOSTING_SERVER_SEARCH_FAILED\n"); + ResetToIdle(); + break; + case SNM_INT_STATE_HOSTING_CREATE_ROOM_FAILED: + app.DebugPrintf("Network error: SNM_INT_STATE_HOSTING_CREATE_ROOM_FAILED\n"); + DeleteServerContext(); + break; + case SNM_INT_STATE_JOINING_SERVER_SEARCH_FAILED: + app.DebugPrintf("Network error: SNM_INT_STATE_JOINING_SERVER_SEARCH_FAILED\n"); + ResetToIdle(); + break; + case SNM_INT_STATE_JOINING_JOIN_ROOM_FAILED: + app.DebugPrintf("Network error: SNM_INT_STATE_JOINING_JOIN_ROOM_FAILED\n"); + DeleteServerContext(); + break; + case SNM_INT_STATE_LEAVING_FAILED: + app.DebugPrintf("Network error: SNM_INT_STATE_LEAVING_FAILED\n"); + DeleteServerContext(); + break; + } + +} + +// Start hosting a game, by creating a room & joining it. We explicity create a server context here (via GetServerContext) as Sony suggest that +// this means we have greater control of representing when players are actually "online". The creation of the room is carried out in a callback +// after that server context is made (ServerContextValidCallback_CreateRoom). +// hostIndex is the index of the user that is hosting the session, and localPlayerMask has bit 0 - 3 set to indicate the full set of local players joining the game. +// extData and extDataSize define the initial state of room data that is externally visible (eg by players searching for rooms, but not in it) +void SQRNetworkManager_AdHoc_Vita::CreateAndJoinRoom(int hostIndex, int localPlayerMask, void *extData, int extDataSize, bool offline) +{ + // hostIndex should always be in the mask + assert( ( ( 1 << hostIndex ) & localPlayerMask ) != 0 ); + + m_isHosting = true; + m_joinExtData = extData; + m_joinExtDataSize = extDataSize; + m_offlineGame = offline; + m_resendExternalRoomDataCountdown = 0; + m_isInSession= true; + + // Default value for room, which we can use for offlinae games + m_room = 0; + + // Initialise room data that will be synchronised. Slot 0 is always reserved for the host. We don't know the + // room member until the room is actually created so this will be set/updated at that point + memset( &m_roomSyncData, 0, sizeof(m_roomSyncData) ); + m_roomSyncData.setPlayerCount(1); + m_roomSyncData.players[0].m_smallId = m_currentSmallId++; + m_roomSyncData.players[0].m_localIdx = hostIndex; + + // Remove the host player that we've already added, then add any other local players specified in the mask + localPlayerMask &= ~( ( 1 << hostIndex ) & localPlayerMask ); + for( int i = 0; i < MAX_LOCAL_PLAYER_COUNT; i++ ) + { + if( localPlayerMask & ( 1 << i ) ) + { + m_roomSyncData.players[m_roomSyncData.getPlayerCount()].m_smallId = m_currentSmallId++; + m_roomSyncData.players[m_roomSyncData.getPlayerCount()].m_localIdx = i; + m_roomSyncData.setPlayerCount(m_roomSyncData.getPlayerCount()+1); + } + } + m_localPlayerCount = m_roomSyncData.getPlayerCount(); + + // For offline games, we can jump straight to the state that says we've just created the room (or would have, for an online game) + if( m_offlineGame ) + { + SetState(SNM_INT_STATE_HOSTING_CREATE_ROOM_SUCCESS); + } + else + { + SetState(SNM_INT_STATE_HOSTING_STARTING_MATCHING_CONTEXT); + // Kick off the sequence of events required for an online game, starting with getting the server context + if(CreateMatchingContext(true)) + { + m_isInSession = true; + SetState(SNM_INT_STATE_HOSTING_CREATE_ROOM_SUCCESS); + } + } +} + +// Updates the externally visible data that was associated with the room when it was created with CreateAndJoinRoom. +void SQRNetworkManager_AdHoc_Vita::UpdateExternalRoomData() +{ + // Update the hello message here + if( m_isHosting ) + { + HelloSyncInfo presenceInfo; + 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(); + } +} + +// Determine if the friend room manager is busy. If it isn't busy, then other operations (searching for a friend, reading the found friend's room lists) may safely be performed +bool SQRNetworkManager_AdHoc_Vita::FriendRoomManagerIsBusy() +{ + return (m_friendSearchState != SNM_FRIEND_SEARCH_STATE_IDLE); +} + +// Initiate a search for rooms that the signed in user's friends are in. This is an asynchronous operation, this function returns after it kicks off a search across all game servers +// for any of the player's friends. +bool SQRNetworkManager_AdHoc_Vita::FriendRoomManagerSearch() +{ + if( m_state != SNM_INT_STATE_IDLE ) return false; + + // Don't start another search if we're already searching... + if( m_friendSearchState != SNM_FRIEND_SEARCH_STATE_IDLE ) + { + return false; + } + + + m_friendSearchState = SNM_FRIEND_SEARCH_STATE_GETTING_FRIEND_COUNT; + + // Get friend list - doing this in another thread as it can lock up for a few seconds +// m_getFriendCountThread = new C4JThread(&GetFriendsThreadProc,this,"GetFriendsThreadProc"); +// m_getFriendCountThread->Run(); + + return true; +} + +bool SQRNetworkManager_AdHoc_Vita::FriendRoomManagerSearch2() +{ + m_friendSearchState = SNM_FRIEND_SEARCH_STATE_IDLE; +// if( m_friendCount == 0 ) +// { +// m_friendSearchState = SNM_FRIEND_SEARCH_STATE_IDLE; +// return false; +// } +// +// if( m_aFriendSearchResults.size() > 0 ) +// { +// // If we have some results, then we also want to make sure that we don't have any duplicate rooms here if more than one friend is playing in the same room. +// unordered_set uniqueRooms; +// for( unsigned int i = 0; i < m_aFriendSearchResults.size(); i++ ) +// { +// if(m_aFriendSearchResults[i].m_RoomFound) +// { +// uniqueRooms.insert( m_aFriendSearchResults[i].m_RoomId ); +// } +// } +// +// // Tidy the results up further based on this +// for( unsigned int i = 0; i < m_aFriendSearchResults.size(); ) +// { +// if( uniqueRooms.find(m_aFriendSearchResults[i].m_RoomId) == uniqueRooms.end() ) +// { +// free(m_aFriendSearchResults[i].m_RoomExtDataReceived); +// m_aFriendSearchResults[i] = m_aFriendSearchResults.back(); +// m_aFriendSearchResults.pop_back(); +// } +// else +// { +// uniqueRooms.erase(m_aFriendSearchResults[i].m_RoomId); +// i++; +// } +// } +// } +// m_friendSearchState = SNM_FRIEND_SEARCH_STATE_IDLE; + return true; +} + +void SQRNetworkManager_AdHoc_Vita::FriendSearchTick() +{ + // Move onto next state if we're done getting our friend count + if( m_friendSearchState == SNM_FRIEND_SEARCH_STATE_GETTING_FRIEND_COUNT ) + { +// if( !m_getFriendCountThread->isRunning() ) +// { +// m_friendSearchState = SNM_FRIEND_SEARCH_STATE_GETTING_FRIEND_INFO; +// delete m_getFriendCountThread; +// m_getFriendCountThread = NULL; + FriendRoomManagerSearch2(); +// } + } +} + +// The handler for basic events can't actually get the events themselves, this has to be done on another thread. Instead, we send a sys_event_t to a queue on This thread, +// which has a single data item used which we can use to determine whether to terminate this thread or get a basic event & handle that. +int SQRNetworkManager_AdHoc_Vita::BasicEventThreadProc( void *lpParameter ) +{ + PSVITA_STUBBED; + return 0; +// SQRNetworkManager_AdHoc_Vita *manager = (SQRNetworkManager_AdHoc_Vita *)lpParameter; +// +// int ret = SCE_OK; +// SceKernelEvent event; +// int outEv; +// +// do +// { +// ret = sceKernelWaitEqueue(manager->m_basicEventQueue, &event, 1, &outEv, NULL); +// +// // If the sys_event_t we've sent here from the handler has a non-zero data1 element, this is to signify that we should terminate the thread +// if( event.udata == 0 ) +// { +// // int iEvent; +// // SceNpUserInfo from; +// // uint8_t buffer[SCE_NP_BASIC_MAX_MESSAGE_SIZE]; +// // size_t bufferSize = SCE_NP_BASIC_MAX_MESSAGE_SIZE; +// // int ret = sceNpBasicGetEvent(&iEvent, &from, &buffer, &bufferSize); +// // if( ret == 0 ) +// // { +// // if( iEvent == SCE_NP_BASIC_EVENT_INCOMING_BOOTABLE_INVITATION ) +// // { +// // // 4J Stu - Don't do this here as it can be very disruptive to gameplay. Players can bring this up from LoadOrJoinMenu, PauseMenu and InGameInfoMenu +// // //sceNpBasicRecvMessageCustom(SCE_NP_BASIC_MESSAGE_MAIN_TYPE_INVITE, SCE_NP_BASIC_RECV_MESSAGE_OPTIONS_INCLUDE_BOOTABLE, SYS_MEMORY_CONTAINER_ID_INVALID); +// // } +// // if( iEvent == SCE_NP_BASIC_EVENT_RECV_INVITATION_RESULT ) +// // { +// // SceNpBasicExtendedAttachmentData *result = (SceNpBasicExtendedAttachmentData *)buffer; +// // if(result->userAction == SCE_NP_BASIC_MESSAGE_ACTION_ACCEPT ) +// // { +// // manager->GetInviteDataAndProcess(result->data.id); +// // } +// // } +// // app.DebugPrintf("Incoming basic event of type %d\n",iEvent); +// // } +// } +// +// } while(event.udata == 0 ); +// return 0; +} + +// int SQRNetworkManager_AdHoc_Vita::GetFriendsThreadProc( void* lpParameter ) +// { +// SQRNetworkManager_AdHoc_Vita *manager = (SQRNetworkManager_AdHoc_Vita *)lpParameter; +// +// int ret = 0; +// manager->m_aFriendSearchResults.clear(); +// manager->m_friendCount = 0; +// if(!ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad())) +// { +// app.DebugPrintf("getFriendslist failed, not signed into Live! \n"); +// return 0; +// } +// +// +// ret = sceNpBasicGetFriendListEntryCount(&manager->m_friendCount); +// if( ( ret < 0 ) || manager->ForceErrorPoint( SNM_FORCE_ERROR_GET_FRIEND_LIST_ENTRY_COUNT ) ) +// { +// // This is likely when friend list hasn't been received from the server yet - will be returning SCE_NP_BASIC_ERROR_BUSY in this case +// manager->m_friendCount = 0; +// } +// +// +// // There shouldn't ever be more than 100 friends returned but limit here just in case +// if( manager->m_friendCount > 100 ) manager->m_friendCount = 100; +// +// SceNpId* friendIDs = NULL; +// if(manager->m_friendCount > 0) +// { +// // grab all the friend IDs first +// friendIDs = new SceNpId[manager->m_friendCount]; +// SceSize numRecieved; +// ret = sceNpBasicGetFriendListEntries(0, friendIDs, manager->m_friendCount, &numRecieved); +// if (ret < 0) +// { +// app.DebugPrintf("sceNpBasicGetFriendListEntries() failed: ret = 0x%x\n", ret); +// manager->m_friendCount = 0; +// } +// else +// { +// assert(numRecieved == manager->m_friendCount); +// } +// } +// +// +// // It is possible that the size of the friend list might vary from what we just received, so only add in friends that we successfully get an entry for +// for( unsigned int i = 0; i < manager->m_friendCount; i++ ) +// { +// static SceNpBasicGamePresence presenceDetails; +// static SceNpBasicFriendContextState contextState; +// int ret = sceNpBasicGetFriendContextState(&friendIDs[i], &contextState); +// if (ret < 0) +// { +// app.DebugPrintf("sceNpBasicGetFriendContextState() failed: ret = 0x%x\n", ret); +// contextState = SCE_NP_BASIC_FRIEND_CONTEXT_STATE_UNKNOWN; +// } +// if(contextState == SCE_NP_BASIC_FRIEND_CONTEXT_STATE_IN_CONTEXT) // using the same SceNpCommunicationId, so playing Minecraft +// { +// ret = sceNpBasicGetGamePresenceOfFriend(&friendIDs[i], &presenceDetails); +// if( ( ret == 0 ) && ( !manager->ForceErrorPoint( SNM_FORCE_ERROR_GET_FRIEND_LIST_ENTRY ) ) ) +// { +// FriendSearchResult result; +// memcpy(&result.m_NpId, &friendIDs[i], sizeof(SceNpId)); +// result.m_RoomFound = false; +// +// // Only include the friend's game if its the same network id ( this also filters out generally Zeroed HelloSyncInfo, which we do when we aren't in an active game session) +// // if( presenceDetails.size == sizeof(HelloSyncInfo) ) +// { +// HelloSyncInfo *pso = (HelloSyncInfo *)presenceDetails.inGamePresence.data; +// if( pso->netVersion == MINECRAFT_NET_VERSION ) +// { +// if( !pso->inviteOnly ) +// { +// result.m_RoomFound = true; +// result.m_RoomId = pso->m_RoomId; +// result.m_ServerId = pso->m_ServerId; +// +// CPlatformNetworkManagerSony::MallocAndSetExtDataFromSQRPresenceInfo(&result.m_RoomExtDataReceived, pso); +// manager->m_aFriendSearchResults.push_back(result); +// } +// } +// } +// } +// } +// } +// +// if(friendIDs) +// delete friendIDs; +// return 0; +// } + +// Get count of rooms that friends are playing in. Only valid when FriendRoomManagerIsBusy() returns false +int SQRNetworkManager_AdHoc_Vita::FriendRoomManagerGetCount() +{ + assert( m_friendSearchState == SNM_FRIEND_SEARCH_STATE_IDLE ); + return m_aFriendSearchResults.size(); +} + +// Get details of a found session that a friend is playing in. 0 < idx < FriendRoomManagerGetCount(). Only valid when FriendRoomManagerIsBusy() returns false +void SQRNetworkManager_AdHoc_Vita::FriendRoomManagerGetRoomInfo(int idx, SQRNetworkManager_AdHoc_Vita::SessionSearchResult *searchResult) +{ + assert( idx < m_aFriendSearchResults.size() ); + assert( m_friendSearchState == SNM_FRIEND_SEARCH_STATE_IDLE ); + + searchResult->m_NpId = m_aFriendSearchResults[idx].m_NpId; + + ZeroMemory(&searchResult->m_sessionId, sizeof(SQRNetworkManager::SessionID)); + searchResult->m_sessionId.m_RoomId = m_aFriendSearchResults[idx].m_netAddr.s_addr; + //searchResult->m_sessionId.m_ServerId = m_aFriendSearchResults[idx].m_ServerId; + searchResult->m_netAddr = m_aFriendSearchResults[idx].m_netAddr; + searchResult->m_extData = m_aFriendSearchResults[idx].m_RoomExtDataReceived; +} + +// Get overall state of the network manager. +SQRNetworkManager_AdHoc_Vita::eSQRNetworkManagerState SQRNetworkManager_AdHoc_Vita::GetState() +{ + return m_stateExternal;; +} + +bool SQRNetworkManager_AdHoc_Vita::IsHost() +{ + return m_isHosting; +} + +bool SQRNetworkManager_AdHoc_Vita::IsReadyToPlayOrIdle() +{ + return (( m_state == SNM_INT_STATE_HOSTING_WAITING_TO_PLAY ) || ( m_state == SNM_INT_STATE_PLAYING ) || ( m_state == SNM_INT_STATE_IDLE ) ); +} + + +// Consider as "in session" from the moment that a game is created or joined, until the point where the game itself has been told via state change that we are now idle. The +// game code requires IsInSession to return true as soon as it has asked to do one of these things (even if the state P hasn't really caught up with this request yet), and +// it also requires that it is informed of the state changes leading up to not being in the session, before this should report false. +bool SQRNetworkManager_AdHoc_Vita::IsInSession() +{ + return m_isInSession; +} + +// Get count of players currently in the session +int SQRNetworkManager_AdHoc_Vita::GetPlayerCount() +{ + return m_roomSyncData.getPlayerCount(); +} + +// Get count of players who are in the session, but not local to this machine +int SQRNetworkManager_AdHoc_Vita::GetOnlinePlayerCount() +{ + int onlineCount = 0; + for( int i = 0; i < m_roomSyncData.getPlayerCount(); i++ ) + { + if( m_roomSyncData.players[i].m_roomMemberId != m_localMemberId ) + { + onlineCount++; + } + } + return onlineCount; +} + +SQRNetworkPlayer *SQRNetworkManager_AdHoc_Vita::GetPlayerByIndex(int idx) +{ + if( idx < MAX_ONLINE_PLAYER_COUNT ) + { + return GetPlayerIfReady(m_aRoomSlotPlayers[idx]); + } + else + { + return NULL; + } +} + +SQRNetworkPlayer *SQRNetworkManager_AdHoc_Vita::GetPlayerBySmallId(int idx) +{ + EnterCriticalSection(&m_csRoomSyncData); + for( int i = 0; i < m_roomSyncData.getPlayerCount(); i++ ) + { + if( m_roomSyncData.players[i].m_smallId == idx ) + { + SQRNetworkPlayer *player = GetPlayerIfReady(m_aRoomSlotPlayers[i]); + LeaveCriticalSection(&m_csRoomSyncData); + return player; + } + } + LeaveCriticalSection(&m_csRoomSyncData); + return NULL; +} + +SQRNetworkPlayer *SQRNetworkManager_AdHoc_Vita::GetLocalPlayerByUserIndex(int idx) +{ + EnterCriticalSection(&m_csRoomSyncData); + for( int i = 0; i < m_roomSyncData.getPlayerCount(); i++ ) + { + if( ( m_roomSyncData.players[i].m_roomMemberId == m_localMemberId ) && ( m_roomSyncData.players[i].m_localIdx == idx ) ) + { + SQRNetworkPlayer *player = GetPlayerIfReady(m_aRoomSlotPlayers[i]); + LeaveCriticalSection(&m_csRoomSyncData); + return player; + } + } + LeaveCriticalSection(&m_csRoomSyncData); + return NULL; +} + +SQRNetworkPlayer *SQRNetworkManager_AdHoc_Vita::GetHostPlayer() +{ + EnterCriticalSection(&m_csRoomSyncData); + SQRNetworkPlayer *player = GetPlayerIfReady(m_aRoomSlotPlayers[0]); + LeaveCriticalSection(&m_csRoomSyncData); + return player; +} + +SQRNetworkPlayer *SQRNetworkManager_AdHoc_Vita::GetPlayerIfReady(SQRNetworkPlayer *player) +{ + if( player == NULL ) return NULL; + + if( player->IsReady() ) return player; + + return NULL; +} + +// Update state internally +void SQRNetworkManager_AdHoc_Vita::SetState(SQRNetworkManager_AdHoc_Vita::eSQRNetworkManagerInternalState state) +{ + eSQRNetworkManagerState oldState = m_INTtoEXTStateMappings[m_state]; + eSQRNetworkManagerState newState = m_INTtoEXTStateMappings[state]; + bool setIdleReasonSessionFull = false; + if( ( state == SNM_INT_STATE_IDLE ) && m_nextIdleReasonIsFull ) + { + setIdleReasonSessionFull = true; + m_nextIdleReasonIsFull = false; + } + m_state = state; + // Queue any important (ie externally relevant) state changes - we will do a call back for these in our main tick. Don't do it directly here + // as we could be coming from any thread at this stage, with any stack size etc. and so we don't generally want to expect the game to be able to handle itself in such circumstances. + if( ( newState != oldState ) || setIdleReasonSessionFull ) + { + EnterCriticalSection(&m_csStateChangeQueue); + m_stateChangeQueue.push(StateChangeInfo(oldState,newState,setIdleReasonSessionFull)); + LeaveCriticalSection(&m_csStateChangeQueue); + } +} + +void SQRNetworkManager_AdHoc_Vita::ResetToIdle() +{ + app.DebugPrintf("------------------ResetToIdle--------------------\n"); + // If we're the client, remove any networked players properly ( this will destory their rupd context etc.) + if( !m_isHosting ) + { + RemoveNetworkPlayers((1 << MAX_LOCAL_PLAYER_COUNT)-1); + } + else + { + // we don't get signalling back from the matching libs to destroy connections, so we need to kill everything here + std::vector memberIDs; + for(int i = 0; i < m_roomSyncData.getPlayerCount(); i++ ) + { + memberIDs.push_back(m_aRoomSlotPlayers[i]->m_roomMemberId); + } + for(int i=0;im_extData, searchResult->m_sessionId.m_RoomId, searchResult->m_sessionId.m_ServerId); + return JoinRoom(searchResult->m_netAddr, localPlayerMask, NULL); +} + +bool SQRNetworkManager_AdHoc_Vita::JoinRoom(SceNpMatching2RoomId roomId, SceNpMatching2ServerId serverId, int localPlayerMask, const PresenceSyncInfo *presence) +{ + assert(0);// only here to match the parent class interface + return false; +} + + +// Join room with a specified roomId. This is used when joining from an invite, as well as by the previous method +bool SQRNetworkManager_AdHoc_Vita::JoinRoom(SceNetInAddr netAddr, int localPlayerMask, const HelloSyncInfo *presence) +{ + // The presence info will be directly passed in if we are joining from an invite, otherwise it has already been set up. This is synchronised out when we have fully joined the game. + if( presence ) + { + memcpy( &s_lastPresenceSyncInfo, presence, sizeof(HelloSyncInfo) ); + } + else + { + for(int i=0;im_type == playerType ) && ( (*it)->m_localPlayerIdx == localPlayerIdx ) ) + { + if( ( playerType != SQRNetworkPlayer::SNP_TYPE_REMOTE ) || ( (*it)->m_roomMemberId == memberId ) ) + { + SQRNetworkPlayer *player = *it; + m_vecTempPlayers.erase(it); + m_aRoomSlotPlayers[ slot ] = player; + return; + } + } + } + // Create the player - non-network players can be considered complete as soon as we create them as we aren't waiting on their network connections becoming complete, so can flag them as such and notify via callback + PlayerUID *pUID = NULL; + PlayerUID localUID; + if( ( playerType == SQRNetworkPlayer::SNP_TYPE_LOCAL ) || + m_isHosting && ( playerType == SQRNetworkPlayer::SNP_TYPE_HOST ) ) + { + // Local players can establish their UID at this point + ProfileManager.GetXUID(localPlayerIdx,&localUID,true); + pUID = &localUID; + } + SQRNetworkPlayer *player = new SQRNetworkPlayer(this, (SQRNetworkPlayer::eSQRNetworkPlayerType)playerType, m_isHosting, memberId, localPlayerIdx, 0, pUID ); + // For offline games, set name directly from gamertag as the PlayerUID will be full of zeroes. + if( m_offlineGame ) + { + player->SetName(ProfileManager.GetGamertag(localPlayerIdx)); + } + NonNetworkPlayerComplete( player, smallId); + m_aRoomSlotPlayers[ slot ] = player; + HandlePlayerJoined( player ); +} + +// For data sending on the local machine, used to send between host and localplayers on the host +void SQRNetworkManager_AdHoc_Vita::LocalDataSend(SQRNetworkPlayer *playerFrom, SQRNetworkPlayer *playerTo, const void *data, unsigned int dataSize) +{ + assert(m_isHosting); + if(m_listener) + { + m_listener->HandleDataReceived( playerFrom, playerTo, (unsigned char *)data, dataSize ); + } +} + +int SQRNetworkManager_AdHoc_Vita::GetSessionIndex(SQRNetworkPlayer *player) +{ + int roomSlotPlayerCount = m_roomSyncData.getPlayerCount(); + for( int i = 0; i < roomSlotPlayerCount; i++ ) + { + if( m_aRoomSlotPlayers[i] == player ) return i; + } + return 0; +} + +// Updates m_aRoomSlotPlayers, based on what is in m_roomSyncData. This needs to be updated when room members join & leave, and when any SQRNetworkPlayer is created externally that this should be mapping to +void SQRNetworkManager_AdHoc_Vita::MapRoomSlotPlayers(int roomSlotPlayerCount/*=-1*/) +{ + EnterCriticalSection(&m_csRoomSyncData); + + // If we pass an explicit roomSlotPlayerCount, it is because we are removing a player, and this is the count of slots that there were *before* the removal. + bool zeroLastSlot = false; + if( roomSlotPlayerCount == -1 ) + { + roomSlotPlayerCount = m_roomSyncData.getPlayerCount(); + } + else + { + zeroLastSlot = true; + } + + if( m_isHosting ) + { + for( int i = 0; i < roomSlotPlayerCount; i++ ) + { + if( m_aRoomSlotPlayers[i] ) + { + // On host, remote players are created and destroyed by the Rudp connections being established and removed, so don't go deleting them here. Other types are managed by this mapping. + // Note that m_vecTempPlayers is used as a pool of players to consider by FindOrCreateNonNetworkPlayer + if( m_aRoomSlotPlayers[i]->m_type != SQRNetworkPlayer::SNP_TYPE_REMOTE ) + { + m_vecTempPlayers.push_back(m_aRoomSlotPlayers[i]); + m_aRoomSlotPlayers[i] = NULL; + } + } + } + for( int i = 0; i < m_roomSyncData.getPlayerCount(); i++ ) + { + if( i == 0 ) + { + // Special case - slot 0 is always the host + FindOrCreateNonNetworkPlayer( i, SQRNetworkPlayer::SNP_TYPE_HOST, m_roomSyncData.players[i].m_roomMemberId, m_roomSyncData.players[i].m_localIdx, m_roomSyncData.players[i].m_smallId); + m_roomSyncData.players[i].m_UID = m_aRoomSlotPlayers[i]->GetUID(); // On host, UIDs flow from player data -> m_roomSyncData + } + else + { + if( m_roomSyncData.players[i].m_roomMemberId == m_localMemberId ) + { + FindOrCreateNonNetworkPlayer( i, SQRNetworkPlayer::SNP_TYPE_LOCAL, m_roomSyncData.players[i].m_roomMemberId, m_roomSyncData.players[i].m_localIdx, m_roomSyncData.players[i].m_smallId); + m_roomSyncData.players[i].m_UID = m_aRoomSlotPlayers[i]->GetUID(); // On host, UIDs flow from player data -> m_roomSyncData + } + else + { + m_aRoomSlotPlayers[i] = GetPlayerFromRoomMemberAndLocalIdx( m_roomSyncData.players[i].m_roomMemberId, m_roomSyncData.players[i].m_localIdx ); + // If we're the host, then we allocated the small id so can flag now if we've got a player to flag... + if( m_aRoomSlotPlayers[i] ) + { + NetworkPlayerSmallIdAllocated(m_aRoomSlotPlayers[i], m_roomSyncData.players[i].m_smallId); + } + } + } + } + + if( zeroLastSlot ) + { + if( roomSlotPlayerCount ) + { + m_aRoomSlotPlayers[ roomSlotPlayerCount - 1 ] = 0; + } + } + + // Also update the externally visible room data for the current slots + if (m_listener ) + { + m_listener->HandleResyncPlayerRequest(m_aRoomSlotPlayers); + } + } + else + { + for( int i = 0; i < m_roomSyncData.getPlayerCount(); i++ ) + { + if( m_aRoomSlotPlayers[i] ) + { + // On clients, local players are created and destroyed by the Rudp connections being established and removed, so don't go deleting them here. Other types are managed by this mapping. + // Note that m_vecTempPlayers is used as a pool of players to consider by FindOrCreateNonNetworkPlayer + if( m_aRoomSlotPlayers[i]->m_type != SQRNetworkPlayer::SNP_TYPE_LOCAL ) + { + m_vecTempPlayers.push_back(m_aRoomSlotPlayers[i]); + m_aRoomSlotPlayers[i] = NULL; + } + } + } + for( int i = 0; i < m_roomSyncData.getPlayerCount(); i++ ) + { + if( i == 0 ) + { + // Special case - slot 0 is always the host + FindOrCreateNonNetworkPlayer( i, SQRNetworkPlayer::SNP_TYPE_HOST, m_roomSyncData.players[i].m_roomMemberId, m_roomSyncData.players[i].m_localIdx, m_roomSyncData.players[i].m_smallId); + m_aRoomSlotPlayers[i]->SetUID(m_roomSyncData.players[i].m_UID); // On client, UIDs flow from m_roomSyncData->player data + } + else + { + if( m_roomSyncData.players[i].m_roomMemberId == m_localMemberId ) + { + // This player is local to this machine - don't bother setting UID from sync data, as it will already have been set accurately when we (locally) made this player + m_aRoomSlotPlayers[i] = GetPlayerFromRoomMemberAndLocalIdx( m_roomSyncData.players[i].m_roomMemberId, m_roomSyncData.players[i].m_localIdx ); + // If we've got the room sync data back from the server, then we've got our smallId. Set flag for this. + if( m_aRoomSlotPlayers[i] ) + { + NetworkPlayerSmallIdAllocated(m_aRoomSlotPlayers[i], m_roomSyncData.players[i].m_smallId); + } + } + else + { + FindOrCreateNonNetworkPlayer( i, SQRNetworkPlayer::SNP_TYPE_REMOTE, m_roomSyncData.players[i].m_roomMemberId, m_roomSyncData.players[i].m_localIdx, m_roomSyncData.players[i].m_smallId); + m_aRoomSlotPlayers[i]->SetUID(m_roomSyncData.players[i].m_UID); // On client, UIDs flow from m_roomSyncData->player data + } + } + } + } + // Clear up any non-network players that are no longer required - this would be a good point to notify of players leaving when we support that + // FindOrCreateNonNetworkPlayer will have pulled any players that we Do need out of m_vecTempPlayers, so the ones that are remaining are no longer in the game + for(AUTO_VAR(it, m_vecTempPlayers.begin()); it != m_vecTempPlayers.end(); it++ ) + { + if( m_listener ) + { + m_listener->HandlePlayerLeaving(*it); + } + delete (*it); + } + m_vecTempPlayers.clear(); + + LeaveCriticalSection(&m_csRoomSyncData); +} + +// On host, update the room sync data with UIDs that are in the players +void SQRNetworkManager_AdHoc_Vita::UpdateRoomSyncUIDsFromPlayers() +{ + EnterCriticalSection(&m_csRoomSyncData); + if( m_isHosting ) + { + for( int i = 0; i < m_roomSyncData.getPlayerCount(); i++ ) + { + if( m_aRoomSlotPlayers[i] ) + { + m_roomSyncData.players[i].m_UID = m_aRoomSlotPlayers[i]->GetUID(); + } + } + } + + LeaveCriticalSection(&m_csRoomSyncData); +} + +// On the client, move UIDs from the room sync data out to the players. +void SQRNetworkManager_AdHoc_Vita::UpdatePlayersFromRoomSyncUIDs() +{ + EnterCriticalSection(&m_csRoomSyncData); + for( int i = 0; i < m_roomSyncData.getPlayerCount(); i++ ) + { + if( m_aRoomSlotPlayers[i] ) + { + if( i == 0 ) + { + // Special case - slot 0 is always the host + m_aRoomSlotPlayers[i]->SetUID(m_roomSyncData.players[i].m_UID); + } + else + { + // Don't sync local players as we already set those up with their UID in the first place... + if( m_roomSyncData.players[i].m_roomMemberId != m_localMemberId ) + { + m_aRoomSlotPlayers[i]->SetUID(m_roomSyncData.players[i].m_UID); + } + } + } + } + LeaveCriticalSection(&m_csRoomSyncData); +} + +// Host only - add remote players to our internal storage of player slots, and synchronise this with other room members. +bool SQRNetworkManager_AdHoc_Vita::AddRemotePlayersAndSync( SceNpMatching2RoomMemberId memberId, int playerMask, bool *isFull/*==NULL*/ ) +{ + assert( m_isHosting ); + + EnterCriticalSection(&m_csRoomSyncData); + + // Establish whether we have enough room to add the players + int addCount = 0; + for( int i = 0; i < MAX_LOCAL_PLAYERS; i++ ) + { + if( playerMask & ( 1 << i ) ) + { + addCount++; + } + } + + if( ( m_roomSyncData.getPlayerCount() + addCount ) > MAX_ONLINE_PLAYER_COUNT ) + { + if( isFull ) + { + *isFull = true; + } + LeaveCriticalSection(&m_csRoomSyncData); + return false; + } + + // We want to keep all players from a particular machine together, so search through the room sync data to see if we can find + // any pre-existing players from this machine. + int firstIdx = -1; + for( int i = 0; i < m_roomSyncData.getPlayerCount(); i++ ) + { + if( m_roomSyncData.players[i].m_roomMemberId == memberId ) + { + firstIdx = i; + break; + } + } + + // We'll just be inserting at the end unless we've got a pre-existing player to insert after. Even then there might be no following + // players. + int insertIdx = m_roomSyncData.getPlayerCount(); + if( firstIdx > -1 ) + { + for( int i = firstIdx; i < m_roomSyncData.getPlayerCount(); i++ ) + { + if( m_roomSyncData.players[i].m_roomMemberId != memberId ) + { + insertIdx = i; + break; + } + } + } + + // Add all remote players determined from the player mask to our own slots of active players + for( int i = 0; i < MAX_LOCAL_PLAYER_COUNT; i++ ) + { + if( playerMask & ( 1 << i ) ) + { + // Shift any following players along... + for( int j = m_roomSyncData.getPlayerCount(); j > insertIdx; j-- ) + { + m_roomSyncData.players[j] = m_roomSyncData.players[j-1]; + } + PlayerSyncData *player = &m_roomSyncData.players[ insertIdx ]; + player->m_smallId = m_currentSmallId++; + player->m_roomMemberId = memberId; + player->m_localIdx = i; + m_roomSyncData.setPlayerCount(m_roomSyncData.getPlayerCount()+1); + insertIdx++; + } + } + + // Update mapping from the room slot players to SQRNetworkPlayer instances + MapRoomSlotPlayers(); + + // And then synchronise this out to all other machines + SyncRoomData(); + + LeaveCriticalSection(&m_csRoomSyncData); + + return true; +} + +// Host only - remove all remote players belonging to the supplied memberId, and in the supplied mask, and synchronise this with other room members +void SQRNetworkManager_AdHoc_Vita::RemoveRemotePlayersAndSync( SceNpMatching2RoomMemberId memberId, int mask ) +{ + assert( m_isHosting ); + EnterCriticalSection(&m_csRoomSyncData); + + // Remove any applicable players, keeping remaining players in order + for( int i = 0; i < m_roomSyncData.getPlayerCount(); ) + { + if( ( m_roomSyncData.players[ i ].m_roomMemberId == memberId ) && ( ( 1 << m_roomSyncData.players[ i ].m_localIdx ) & mask ) ) + { + SQRNetworkPlayer *player = GetPlayerFromRoomMemberAndLocalIdx( memberId, m_roomSyncData.players[ i ].m_localIdx ); + if( player ) + { + // Get Rudp context for this player, close that context down ( which will in turn close the socket if required) + int ctx = player->m_rudpCtx; + int err = sceRudpTerminate( ctx ); + assert(err == SCE_OK); + if( m_listener ) + { + m_listener->HandlePlayerLeaving(player); + } + // Delete the player itself and the mapping from context to player map as this context is no longer valid + delete player; + m_RudpCtxToPlayerMap.erase(ctx); + + removePlayerFromVoiceChat(player); + } + m_roomSyncData.setPlayerCount(m_roomSyncData.getPlayerCount()-1); + // Shuffled entries up into the space that we have just created + for( int j = i ; j < m_roomSyncData.getPlayerCount(); j++ ) + { + m_roomSyncData.players[j] = m_roomSyncData.players[j + 1]; + m_aRoomSlotPlayers[j] = m_aRoomSlotPlayers[j + 1]; + } + // Zero last element, that isn't part of the currently sized array anymore + memset(&m_roomSyncData.players[m_roomSyncData.getPlayerCount()],0,sizeof(PlayerSyncData)); + m_aRoomSlotPlayers[m_roomSyncData.getPlayerCount()] = NULL; + } + else + { + i++; + } + } + LeaveCriticalSection(&m_csRoomSyncData); + + // Update mapping from the room slot players to SQRNetworkPlayer instances + MapRoomSlotPlayers(); + + + // And then synchronise this out to all other machines + SyncRoomData(); + + // if(GetOnlinePlayerCount() == 0) + // SonyVoiceChat::shutdown(); +} + +// Client only - remove all network players matching the supplied mask +void SQRNetworkManager_AdHoc_Vita::RemoveNetworkPlayers( int mask ) +{ + assert( !m_isHosting ); + + for(AUTO_VAR(it, m_RudpCtxToPlayerMap.begin()); it != m_RudpCtxToPlayerMap.end(); ) + { + SQRNetworkPlayer *player = it->second; + if( (player->m_roomMemberId == m_localMemberId ) && ( ( 1 << player->m_localPlayerIdx ) & mask ) ) + { + // Get Rudp context for this player, close that context down ( which will in turn close the socket if required) + int ctx = it->first; + int err = sceRudpTerminate( ctx ); + assert(err == SCE_OK); + if( m_listener ) + { + m_listener->HandlePlayerLeaving(player); + } + // Delete any reference to this player from the player mappings + for( int i = 0; i < MAX_ONLINE_PLAYER_COUNT; i++ ) + { + if( m_aRoomSlotPlayers[i] == player ) + { + m_aRoomSlotPlayers[i] = NULL; + } + } + // And delete the reference from the ctx->player map + it = m_RudpCtxToPlayerMap.erase(it); + + removePlayerFromVoiceChat(player); + + // Delete the player itself and the mapping from context to player map as this context is no longer valid + delete player; + } + else + { + it++; + } + } + +} + +// Host only - update the memberId of the local players, and synchronise with other room members +void SQRNetworkManager_AdHoc_Vita::SetLocalPlayersAndSync() +{ + assert( m_isHosting ); + + // Update local IP address + UpdateLocalIPAddress(); + + m_localMemberId = getRoomMemberID(&m_localIPAddr); + if(IsHost()) + m_hostMemberId = m_localMemberId; + + + for( int i = 0; i < m_localPlayerCount; i++ ) + { + m_roomSyncData.players[i].m_roomMemberId = m_localMemberId; + } + + // Update mapping from the room slot players to SQRNetworkPlayer instances + MapRoomSlotPlayers(); + + // And then synchronise this out to all other machines + SyncRoomData(); + +} + +// Host only - sync the room data with other machines +void SQRNetworkManager_AdHoc_Vita::SyncRoomData() +{ + if( m_offlineGame ) return; + + UpdateRoomSyncUIDsFromPlayers(); + + // send the room data packet out to all the clients + for(AUTO_VAR(iter, m_RudpCtxToPlayerMap.begin()); iter != m_RudpCtxToPlayerMap.end(); ++iter) + { + int ctx = iter->first; + SQRNetworkPlayer* pPlayer = GetPlayerFromRudpCtx(ctx); + assert(pPlayer); + sendDataPacket(*GetIPAddrFromRudpCtx(ctx), e_dataTag_RoomSync, &m_roomSyncData, sizeof(m_roomSyncData)); + } +} + + + +void SQRNetworkManager_AdHoc_Vita::MatchingEventHandler(int id, int event, SceNetInAddr* peer, int optlen, void *opt) +{ + SQRNetworkManager_AdHoc_Vita* manager = s_pAdhocVitaManager; + + app.DebugPrintf("MatchingEventHandler_Server : ev : %d, ip addr : %s\n", event, getIPAddressString(*peer).c_str()); + int ret; + + switch (event) + { + case SCE_NET_ADHOC_MATCHING_EVENT_HELLO: + app.DebugPrintf("P2P SCE_NET_ADHOC_MATCHING_EVENT_HELLO Received!!\n"); + + if(manager->m_isHosting) + { + assert(0); // the host should never see the hello message + } + else if(optlen > 0) + { + if(optlen == sizeof(HelloSyncInfo)) + { + FriendSearchResult result; + // memcpy(&result.m_NpId, &friendIDs[i], sizeof(SceNpId)); + result.m_RoomFound = false; + + HelloSyncInfo *pso = (HelloSyncInfo *)opt; + if( pso->m_presenceSyncInfo.netVersion == MINECRAFT_NET_VERSION ) + { + if( !pso->m_presenceSyncInfo.inviteOnly ) + { + result.m_netAddr = *peer; + result.m_RoomFound = true; + memcpy(result.m_NpId.handle.data, pso->m_presenceSyncInfo.hostPlayerUID.getOnlineID(), SCE_NP_ONLINEID_MAX_LENGTH); + // result.m_RoomId = pso->m_RoomId; + // result.m_ServerId = pso->m_ServerId; + + 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; + for(int i=0; im_aFriendSearchResults.size(); i++) + { + if(manager->m_aFriendSearchResults[i].m_netAddr.s_addr == peer->s_addr) + { + currIndex = i; + if(memcmp(result.m_gameSessionData, manager->m_aFriendSearchResults[i].m_gameSessionData, sizeof(GameSessionData)) != 0) + 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; + } + } + if(currIndex>=0 && bChanged) + 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 + { + app.DebugPrintf("mismatching net version, expected %d, but got %d !!\n", MINECRAFT_NET_VERSION, pso->m_presenceSyncInfo.netVersion); + } + } + else + { + app.DebugPrintf("Wrong size for HelloSyncInfo, should be %d bytes, but was %d bytes!!\n", sizeof(HelloSyncInfo), optlen); + assert(0); + } + } + break; + + case SCE_NET_ADHOC_MATCHING_EVENT_REQUEST: // A join request was received + app.DebugPrintf("P2P SCE_NET_ADHOC_MATCHING_EVENT_REQUEST Received!!\n"); + if (optlen > 0 && opt != NULL) + { + ret = SCE_OK;// parentRequestAdd(opt); + if (ret != SCE_OK) + { + ret = sceNetAdhocMatchingCancelTarget(manager->m_matchingContext, peer); + if (ret < 0) + { + app.DebugPrintf("sceNetAdhocMatchingCancelTarget error :[%d] [%x]\n",ret,ret) ; + assert(0); + break; + } + } + } + // accept the join request + sceNetAdhocMatchingSelectTarget(manager->m_matchingContext, peer, sizeof(manager->m_roomSyncData), &manager->m_roomSyncData); + break; + + + case SCE_NET_ADHOC_MATCHING_EVENT_ACCEPT: // The join request was accepted + app.DebugPrintf("P2P SCE_NET_ADHOC_MATCHING_EVENT_ACCEPT Received!!\n"); + if( manager->m_isHosting == false ) + { + assert(opt && optlen == sizeof(m_roomSyncData)); + memcpy(&manager->m_roomSyncData, opt, sizeof(manager->m_roomSyncData)); + } + break; + + case SCE_NET_ADHOC_MATCHING_EVENT_ESTABLISHED: // A participation agreement was established + { + app.DebugPrintf("P2P SCE_NET_ADHOC_MATCHING_EVENT_ESTABLISHED Received!!\n"); + + + SceNetInAddr localAddr; + int ret = sceNetCtlAdhocGetInAddr(&localAddr); + assert(ret == SCE_OK); + manager->m_localMemberId = getRoomMemberID(&localAddr); + + if( manager->m_isHosting ) + { + manager->m_hostMemberId = manager->m_localMemberId; + + bool isFull = false; + bool success = manager->AddRemotePlayersAndSync( getRoomMemberID(peer), 1, &isFull ); + if( success ) + { + bool success2 = manager->CreateRudpConnections(*peer); + if(success2) + { + manager->SyncRoomData(); // have to syn the room data again now we have the peer in our list + break; + } + } + // Something has gone wrong adding these players to the room - kick out the player + assert(0); + } + else + { + // Local players can establish their UID at this point + PlayerUID localUID; + ProfileManager.GetXUID(0,&localUID,true); + localUID.setForAdhoc(); + + bool success = manager->CreateRudpConnections(*peer); + manager->SetState(SNM_INT_STATE_JOINING_WAITING_FOR_LOCAL_PLAYERS); + } + + // // If we've created a player, then we want to try and patch up any connections that we should have to it + // manager->MapRoomSlotPlayers(); + // + // SQRNetworkPlayer *player = manager->GetPlayerFromRudpCtx(peer->s_addr); + // if( player ) + // { + // // Flag connection stage as being completed for this player + // manager->NetworkPlayerConnectionComplete(player); + // } + } + + break; + + + 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: + 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 ) + { + app.DebugPrintf("sceNetAdhocMatchingCancelTarget error :[%d] [%x]\n",ret,ret) ; + } + // -> + // no break, carry on through to the BYE case -> + // -> + case SCE_NET_ADHOC_MATCHING_EVENT_BYE: // Target participating player has stopped matching + { + 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 ) + { + // Remove any players associated with this peer + manager->RemoveRemotePlayersAndSync( peerMemberId, 15 ); + } + else if(peerMemberId == manager->m_hostMemberId) + { + // Host has left the game... so its all over for this client too. Finish everything up now, including deleting the server context which belongs to this gaming session + // This also might be a response to a request to leave the game from our end too so don't need to do anything in that case + if( manager->m_state != SNM_INT_STATE_LEAVING ) + { + manager->DeleteServerContext(); + } + } + else + { + if(sc_voiceChatEnabled) + { + // we've lost connection to another client (voice only) so kill the voice connection + // no players left on the remote machine once we remove this one + SQRVoiceConnection* pVoice = SonyVoiceChat_Vita::getVoiceConnectionFromRoomMemberID(peerMemberId); + assert(pVoice); + if(pVoice) + SonyVoiceChat_Vita::disconnectRemoteConnection(pVoice); + } + } + } + + break; + + case SCE_NET_ADHOC_MATCHING_EVENT_DATA: + { + app.DebugPrintf("P2P SCE_NET_ADHOC_MATCHING_EVENT_DATA Received!!\n"); + + if (optlen <= 0 || opt == NULL) + { + assert(0); + break; + } + AdhocDataPacket* pPacket = (AdhocDataPacket*)opt; + unsigned int dataSize = optlen - 4; + + if(pPacket->m_tag == e_dataTag_RoomSync) + { + // room sync data, copy it over + EnterCriticalSection(&manager->m_csRoomSyncData); + assert(dataSize == sizeof(manager->m_roomSyncData)); + memcpy(&manager->m_roomSyncData, pPacket->m_pData, dataSize); + LeaveCriticalSection(&manager->m_csRoomSyncData); + manager->MapRoomSlotPlayers(); + } + else + { + assert(0); + } + } + break ; + + case SCE_NET_ADHOC_MATCHING_EVENT_DATA_ACK: + { + SQRNetworkPlayer *player = manager->GetPlayerFromRudpCtx(peer->s_addr); + // This event signifies that the previous packet has been sent, so we can try to send some more + if( player ) + { + player->SendMoreInternal(); + } + } + break; + + + default: + break; + } +} + + +// Tick the process of creating a room. +void SQRNetworkManager_AdHoc_Vita::RoomCreateTick() +{ + switch( m_state ) + { + case SNM_INT_STATE_HOSTING_CREATE_ROOM_SEARCHING_FOR_WORLD: + break; + case SNM_INT_STATE_HOSTING_CREATE_ROOM_WORLD_FOUND: + break; + case SNM_INT_STATE_HOSTING_CREATE_ROOM_CREATING_ROOM: + break; + case SNM_INT_STATE_HOSTING_CREATE_ROOM_SUCCESS: + SetState(SNM_INT_STATE_HOSTING_WAITING_TO_PLAY); + + // Now we know the local member id we can update our local players + SetLocalPlayersAndSync(); + break; + case SNM_INT_STATE_HOSTING_CREATE_ROOM_FAILED: + break; + default: + break; + } +} + +// For a player using the network to communicate, flag as having its connection complete. This wraps the player's own functionality, so that we can determine if this +// call is transitioning us from not ready to ready, and call a registered callback. +void SQRNetworkManager_AdHoc_Vita::NetworkPlayerConnectionComplete(SQRNetworkPlayer *player) +{ + EnterCriticalSection(&m_csPlayerState); + bool wasReady = player->IsReady(); + bool wasClientReady = player->HasConnectionAndSmallId(); + player->ConnectionComplete(); + bool isReady = player->IsReady(); + bool isClientReady = player->HasConnectionAndSmallId(); + if( !m_isHosting ) + { + // For clients, if we are ready (up the the point of having received our small id) then confirm to the host that this is the case, which makes us now fully ready at this end + if( ( !wasClientReady ) && ( isClientReady ) ) + { + player->ConfirmReady(); + isReady = true; + } + } + LeaveCriticalSection(&m_csPlayerState); + + if( ( !wasReady ) && ( isReady ) ) + { + HandlePlayerJoined( player ); + } +} + +// For a player using the network to communicate, set its small id, thereby flagging it as having one allocated +void SQRNetworkManager_AdHoc_Vita::NetworkPlayerSmallIdAllocated(SQRNetworkPlayer *player, unsigned char smallId) +{ + EnterCriticalSection(&m_csPlayerState); + bool wasReady = player->IsReady(); + bool wasClientReady = player->HasConnectionAndSmallId(); + player->SmallIdAllocated(smallId); + bool isReady = player->IsReady(); + bool isClientReady = player->HasConnectionAndSmallId(); + if( !m_isHosting ) + { + // For clients, if we are ready (up the the point of having received our small id) then confirm to the host that this is the case, which makes us now fully ready at this end + if( ( !wasClientReady ) && ( isClientReady ) ) + { + player->ConfirmReady(); + isReady = true; + } + } + LeaveCriticalSection(&m_csPlayerState); + + if( ( !wasReady ) && ( isReady ) ) + { + HandlePlayerJoined( player ); + } +} + +// On host, for a player using the network to communicate, confirm that its small id has now been received back +void SQRNetworkManager_AdHoc_Vita::NetworkPlayerInitialDataReceived(SQRNetworkPlayer *player, void *data) +{ + EnterCriticalSection(&m_csPlayerState); + SQRNetworkPlayer::InitSendData *ISD = (SQRNetworkPlayer::InitSendData *)data; + bool wasReady = player->IsReady(); + player->InitialDataReceived(ISD); + bool isReady = player->IsReady(); + LeaveCriticalSection(&m_csPlayerState); + // Sync room data back out as we've updated a player's UID here + SyncRoomData(); + + if( ( !wasReady ) && ( isReady ) ) + { + HandlePlayerJoined( player ); + } +} + +// For non-network players, flag that it is complete/ready, and assign its small id. We don't want to call any callbacks for these, as that can be explicitly done when local players are added. +// Also, we dynamically destroy & recreate local players quite a lot when remapping player slots which would create a lot of messages we don't want. +void SQRNetworkManager_AdHoc_Vita::NonNetworkPlayerComplete(SQRNetworkPlayer *player, unsigned char smallId) +{ + player->ConnectionComplete(); + player->SmallIdAllocated(smallId); +} + +void SQRNetworkManager_AdHoc_Vita::HandlePlayerJoined(SQRNetworkPlayer *player) +{ + if( m_listener ) + { + m_listener->HandlePlayerJoined( player ); + } + // On client, keep a count of how many local players we have told the game about. We can only transition to telling the game that we are playing once the room is set up And all the local players are valid to use. + if( !m_isHosting ) + { + if( player->IsLocal() ) + { + m_localPlayerJoined++; + } + } +} + +// Selects a random server from the current list, removes that server so it won't be searched for again, and then kick off an attempt to find out if that particular server is available. +bool SQRNetworkManager_AdHoc_Vita::SelectRandomServer() +{ + assert( (m_state == SNM_INT_STATE_HOSTING_SEARCHING_FOR_SERVER) || (m_state == SNM_INT_STATE_JOINING_SEARCHING_FOR_SERVER) ); + + if( m_serverCount == 0 ) + { + SetState((m_state == SNM_INT_STATE_HOSTING_SEARCHING_FOR_SERVER) ? SNM_INT_STATE_HOSTING_SERVER_SEARCH_FAILED : SNM_INT_STATE_JOINING_SERVER_SEARCH_FAILED); + app.DebugPrintf("SQRNetworkManager::SelectRandomServer - Server count is 0\n"); + return false; + } + + // not really selecting a random server, as we've already been allocated one, but calling this to match PS3 + int serverIdx; + serverIdx = 0; + m_serverCount--; + m_aServerId[serverIdx] = m_aServerId[m_serverCount]; + + // This server is available + SetState((m_state == SNM_INT_STATE_HOSTING_SEARCHING_FOR_SERVER) ? SNM_INT_STATE_HOSTING_SERVER_FOUND : SNM_INT_STATE_JOINING_SERVER_FOUND); + m_serverId = m_aServerId[serverIdx]; + + return true; +} + +// Delete the current server context. Should be called when finished with the current host or client game session. +void SQRNetworkManager_AdHoc_Vita::DeleteServerContext() +{ + // No server context on PS4, so we just set the state, and then we'll check all the UDP connections have shutdown before setting to idle + if(m_serverContextValid) + { + m_serverContextValid = false; + } + SetState(SNM_INT_STATE_SERVER_DELETING_CONTEXT); +} + +// Creates a set of Rudp connections by the "active open" method. This requires that both ends of the connection call cellRudpInitiate to fully create a connection. We +// create one connection per local play on any remote machine. +// +// peerMemberId is the room member Id of the remote end of the connection +// playersMemberId is the room member Id that the players belong to +// ie for the host (when matching incoming connections), these will be the same thing... and for the client, peerMemberId will be the host, whereas playersMemberId will be itself + + + + +bool SQRNetworkManager_AdHoc_Vita::CreateVoiceRudpConnections(SceNpMatching2RoomId roomId, SceNpMatching2RoomMemberId peerMemberId, int playerMask) +{ + PSVITA_STUBBED; + return true; +} + +bool SQRNetworkManager_AdHoc_Vita::CreateSocket() +{ + int ret; + // First get details of the UDPP2P connection that has been established + // int connStatus; + SceNetSockaddrIn sinp2pLocal;//, sinp2pPeer; + + // Local end first... + memset(&sinp2pLocal, 0, sizeof(sinp2pLocal)); + + // Update local IP address + UpdateLocalIPAddress(); + + sinp2pLocal.sin_len = sizeof(sinp2pLocal); + sinp2pLocal.sin_family = SCE_NET_AF_INET; + sinp2pLocal.sin_port = sceNetHtons(SCE_NP_PORT); + sinp2pLocal.sin_vport = sceNetHtons(ADHOC_VPORT) ; + sinp2pLocal.sin_addr = m_localIPAddr; + + // Create socket & bind + ret = sceNetSocket("rupdSocket", SCE_NET_AF_INET, SCE_NET_SOCK_DGRAM_P2P, 0); + assert(ret >= 0); + m_soc = ret; + int optval = 1; + ret = sceNetSetsockopt(m_soc, SCE_NET_SOL_SOCKET, SCE_NET_SO_USECRYPTO, &optval, sizeof(optval)); + if ( ( ret < 0 ) || ForceErrorPoint(SNM_FORCE_ERROR_SETSOCKOPT_0) ) return false; + ret = sceNetSetsockopt(m_soc, SCE_NET_SOL_SOCKET, SCE_NET_SO_USESIGNATURE, &optval, sizeof(optval)); + if ( ( ret < 0 ) || ForceErrorPoint(SNM_FORCE_ERROR_SETSOCKOPT_1) ) return false; + ret = sceNetSetsockopt(m_soc, SCE_NET_SOL_SOCKET, SCE_NET_SO_NBIO, &optval, sizeof(optval)); + if ( ( ret < 0 ) || ForceErrorPoint(SNM_FORCE_ERROR_SETSOCKOPT_2) ) return false; + + ret = sceNetBind(m_soc, &sinp2pLocal, sizeof(sinp2pLocal)); + if ( ( ret < 0 ) || ForceErrorPoint(SNM_FORCE_ERROR_SOCK_BIND) ) return false; + return true; + +} + + +bool SQRNetworkManager_AdHoc_Vita::CreateRudpConnections(SceNetInAddr peer) +{ + // First get details of the UDPP2P connection that has been established + SceNetSockaddrIn sinp2pPeer; + + // get the peer + memset(&sinp2pPeer, 0, sizeof(sinp2pPeer)); + sinp2pPeer.sin_len = sizeof(sinp2pPeer); + sinp2pPeer.sin_family = SCE_NET_AF_INET; + sinp2pPeer.sin_addr = peer; + sinp2pPeer.sin_port = sceNetHtons(SCE_NP_PORT); + + // Set vport + sinp2pPeer.sin_vport = sceNetHtons(ADHOC_VPORT); + + // Create socket & bind, if we don't already have one + if( m_soc == -1 ) + { + if(CreateSocket() == false) + return false; + } + + // Create an Rudp context for each local player that is required. These can be used as individual virtual connections between room members (ie consoles), which are multiplexed + // over the socket we have just made + + int rudpCtx; + + // Socket for the local network node created, now can create an Rupd context. + int ret = sceRudpCreateContext( RudpContextCallback, this, &rudpCtx ); + if ( ( ret < 0 ) || ForceErrorPoint(SNM_FORCE_ERROR_CREATE_RUDP_CONTEXT) ) return false; + if( m_isHosting ) + { + m_RudpCtxToPlayerMap[ rudpCtx ] = new SQRNetworkPlayer( this, SQRNetworkPlayer::SNP_TYPE_REMOTE, true, getRoomMemberID((&peer)), 0, rudpCtx, NULL ); + m_RudpCtxToIPAddrMap[ rudpCtx ] = peer; + } + else + { + // Local players can establish their UID at this point + PlayerUID localUID; + ProfileManager.GetXUID(0,&localUID,true); + localUID.setForAdhoc(); + + m_RudpCtxToPlayerMap[ rudpCtx ] = new SQRNetworkPlayer( this, SQRNetworkPlayer::SNP_TYPE_LOCAL, false, m_localMemberId, 0, rudpCtx, &localUID ); + m_RudpCtxToIPAddrMap[ rudpCtx ] = m_localIPAddr; +} + + // If we've created a player, then we want to try and patch up any connections that we should have to it + MapRoomSlotPlayers(); + + // TODO - set any non-default options for the context. By default, the context is set to have delivery critical and order critical both on + + // Bind the context to the socket we've just created, and initiate. The initiation needs to happen on both client & host sides of the connection to complete. + ret = sceRudpBind( rudpCtx, m_soc , 1 + 0, SCE_RUDP_MUXMODE_P2P ); + if ( ( ret < 0 ) || ForceErrorPoint(SNM_FORCE_ERROR_RUDP_BIND) ) return false; + if(ret < 0) + app.DebugPrintf(" sceRudpBind failed with error 0x%08x\n"); + + ret = sceRudpInitiate( rudpCtx, &sinp2pPeer, sizeof(sinp2pPeer), 0); + if(ret < 0) + app.DebugPrintf(" sceRudpInitiate failed with error 0x%08x\n"); + if ( ( ret < 0 ) || ForceErrorPoint(SNM_FORCE_ERROR_RUDP_INIT2) ) return false; + + return true; +} + + +SQRNetworkPlayer *SQRNetworkManager_AdHoc_Vita::GetPlayerFromRudpCtx(int rudpCtx) +{ + AUTO_VAR(it,m_RudpCtxToPlayerMap.find(rudpCtx)); + if( it != m_RudpCtxToPlayerMap.end() ) + { + return it->second; + } + return NULL; +} + + +SceNetInAddr* SQRNetworkManager_AdHoc_Vita::GetIPAddrFromRudpCtx(int rudpCtx) +{ + AUTO_VAR(it,m_RudpCtxToIPAddrMap.find(rudpCtx)); + if( it != m_RudpCtxToIPAddrMap.end() ) + { + return &it->second; + } + return NULL; +} + + + +SQRNetworkPlayer *SQRNetworkManager_AdHoc_Vita::GetPlayerFromRoomMemberAndLocalIdx(int roomMember, int localIdx) +{ + for(AUTO_VAR(it, m_RudpCtxToPlayerMap.begin()); it != m_RudpCtxToPlayerMap.end(); it++ ) + { + if( (it->second->m_roomMemberId == roomMember ) && ( it->second->m_localPlayerIdx == localIdx ) ) + { + return it->second; + } + } + return NULL; +} + + +// This is called as part of the general initialisation of the network manager, to register any callbacks that the sony libraries require. +// Returns true if all were registered successfully. +bool SQRNetworkManager_AdHoc_Vita::RegisterCallbacks() +{ + // Register RUDP event handler + int ret = sceRudpSetEventHandler(RudpEventCallback, this); + if (ret < 0) + { + app.DebugPrintf("SQRNetworkManager::RegisterCallbacks - cellRudpSetEventHandler failed with code 0x%08x\n", ret); + return false; + } + + // Register the context callback function +// ret = sceNpMatching2RegisterContextCallback(ContextCallback, this); +// if (ret < 0) +// { +// app.DebugPrintf("SQRNetworkManager::RegisterCallbacks - sceNpMatching2RegisterContextCallback failed with code 0x%08x\n", ret); +// return false; +// } +// +// // Register the default request callback & parameters +// SceNpMatching2RequestOptParam optParam; +// +// memset(&optParam, 0, sizeof(optParam)); +// optParam.cbFunc = DefaultRequestCallback; +// optParam.cbFuncArg = this; +// optParam.timeout = (30 * 1000 * 1000); +// optParam.appReqId = 0; +// +// ret = sceNpMatching2SetDefaultRequestOptParam(m_matchingContext, &optParam); +// if (ret < 0) +// { +// app.DebugPrintf("SQRNetworkManager::RegisterCallbacks - sceNpMatching2SetDefaultRequestOptParam failed with code 0x%08x\n", ret); +// return false; +// } +// +// // Register signalling callback +// ret = sceNpMatching2RegisterSignalingCallback(m_matchingContext, SignallingCallback, this); +// if (ret < 0) +// { +// return false; +// } +// +// // Register room event callback +// ret = sceNpMatching2RegisterRoomEventCallback(m_matchingContext, RoomEventCallback, this); +// if (ret < 0) +// { +// app.DebugPrintf("SQRNetworkManager::RegisterCallbacks - sceNpMatching2RegisterRoomEventCallback failed with code 0x%08x\n", ret); +// return false; +// } +// + return true; +} + +extern bool g_bBootedFromInvite; + + + +void SQRNetworkManager_AdHoc_Vita::HandleMatchingContextStart() +{ + // on the standard networking model this happens during a callback signalled from the context starting + // Some special cases to detect when this event is coming in, in case we had to start the matching context because there wasn't a valid context when we went to get a server context. These two + // responses here complete what should then happen to get the server context in each case (for hosting or joining a game) + if( m_state == SNM_INT_STATE_IDLE_RECREATING_MATCHING_CONTEXT ) + { + SetState( SNM_INT_STATE_IDLE ); + GetExtDataForRoom(0, NULL, NULL, NULL); + } + else if( m_state == SNM_INT_STATE_HOSTING_STARTING_MATCHING_CONTEXT ) + { + // no world matching stuff to setup here, we can just signal that we're ready + SetState(SNM_INT_STATE_HOSTING_WAITING_TO_PLAY); + // Now we know the local member id we can update our local players + SetLocalPlayersAndSync(); +// GetServerContext2(); + } + else if( m_state == SNM_INT_STATE_JOINING_STARTING_MATCHING_CONTEXT ) + { + SetState(SNM_INT_STATE_JOINING_SEARCHING_FOR_SERVER); + SelectRandomServer(); + } + else + { + // Normal handling of context starting, from standard initialisation procedure + assert( m_state == SNM_INT_STATE_STARTING_CONTEXT ); + m_offlineSQR = false; + SetState(SNM_INT_STATE_IDLE); + + if(s_SignInCompleteCallbackFn) + { + s_SignInCompleteCallbackFn(s_SignInCompleteParam, true, 0); + s_SignInCompleteCallbackFn = NULL; + } + } +} + + + + + +// Implementation of SceNpBasicEventHandler +int SQRNetworkManager_AdHoc_Vita::BasicEventCallback(int event, int retCode, uint32_t reqId, void *arg) +{ + PSVITA_STUBBED; + // SQRNetworkManager_AdHoc_Vita *manager = (SQRNetworkManager_AdHoc_Vita *)arg; + // // We aren't allowed to actually get the event directly from this callback, so send our own internal event to a thread dedicated to doing this + // sceKernelTriggerUserEvent(m_basicEventQueue, sc_UserEventHandle, NULL); + + return 0; +} + +// Implementation of SceNpManagerCallback +void SQRNetworkManager_AdHoc_Vita::OnlineCheck() +{ + int state; + int ret = sceNetCtlAdhocGetState(&state); + + + bool bConnected = (state == SCE_NET_CTL_STATE_IPOBTAINED); //ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad()); + bool oldAdhocStatus = GetAdhocStatus(); + UpdateAdhocStatus(bConnected); + if(oldAdhocStatus == false) + { + if(bConnected) + { + InitialiseAfterOnline(); + } + } +} + +// Implementation of CellSysutilCallback +void SQRNetworkManager_AdHoc_Vita::SysUtilCallback(uint64_t status, uint64_t param, void *userdata) +{ + // SQRNetworkManager_AdHoc_Vita *manager = (SQRNetworkManager_AdHoc_Vita *)userdata; + // struct CellNetCtlNetStartDialogResult netstart_result; + // int ret = 0; + // netstart_result.size = sizeof(netstart_result); + // switch(status) + // { + // case CELL_SYSUTIL_NET_CTL_NETSTART_FINISHED: + // ret = cellNetCtlNetStartDialogUnloadAsync(&netstart_result); + // if(ret < 0) + // { + // manager->SetState(SNM_INT_STATE_INITIALISE_FAILED); + // if( s_SignInCompleteCallbackFn ) + // { + // if( s_signInCompleteCallbackIfFailed ) + // { + // s_SignInCompleteCallbackFn(s_SignInCompleteParam,false,0); + // } + // s_SignInCompleteCallbackFn = NULL; + // } + // return; + // } + // + // if( netstart_result.result != 0 ) + // { + // // Failed, or user may have decided not to sign in - maybe need to differentiate here + // manager->SetState(SNM_INT_STATE_INITIALISE_FAILED); + // if( s_SignInCompleteCallbackFn ) + // { + // if( s_signInCompleteCallbackIfFailed ) + // { + // s_SignInCompleteCallbackFn(s_SignInCompleteParam,false,0); + // } + // s_SignInCompleteCallbackFn = NULL; + // } + // } + // + // break; + // case CELL_SYSUTIL_NET_CTL_NETSTART_UNLOADED: + // break; + // case CELL_SYSUTIL_NP_INVITATION_SELECTED: + // manager->GetInviteDataAndProcess(SCE_NP_BASIC_SELECTED_INVITATION_DATA); + // break; + // default: + // break; + // } +} + +//CD - Added this to match the SQRNetworkManager_Vita class +void SQRNetworkManager_AdHoc_Vita::updateNetCheckDialog() +{ + if(ProfileManager.IsSystemUIDisplayed()) + { + if( sceNetCheckDialogGetStatus() == SCE_COMMON_DIALOG_STATUS_FINISHED ) + { + //Check for errors + SceNetCheckDialogResult netCheckResult; + int ret = sceNetCheckDialogGetResult(&netCheckResult); + app.DebugPrintf("NetCheckDialogResult = 0x%x\n", netCheckResult.result); + ret = sceNetCheckDialogTerm(); + app.DebugPrintf("NetCheckDialogTerm ret = 0x%x\n", ret); + ProfileManager.SetSysUIShowing( false ); + + app.DebugPrintf("------------>>>>>>>> sceNetCheckDialog finished\n"); + + if( netCheckResult.result == SCE_COMMON_DIALOG_RESULT_OK ) + { + if( s_SignInCompleteCallbackFn ) + { + s_SignInCompleteCallbackFn(s_SignInCompleteParam,true,0); + s_SignInCompleteCallbackFn = NULL; + } + } + else + { + // SCE_COMMON_DIALOG_RESULT_USER_CANCELED + // SCE_COMMON_DIALOG_RESULT_ABORTED + + // Failed, or user may have decided not to sign in - maybe need to differentiate here + 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 ) + { + s_SignInCompleteCallbackFn(s_SignInCompleteParam,false,0); + } + s_SignInCompleteCallbackFn = NULL; + } + } + } + } +} + +// Implementation of CellRudpContextEventHandler. This is associate with an Rudp context every time one is created, and can be used to determine the status of each +// Rudp connection. We create one context/connection per local player on the non-hosting consoles. +void SQRNetworkManager_AdHoc_Vita::RudpContextCallback(int ctx_id, int event_id, int error_code, void *arg) +{ + SQRNetworkManager_AdHoc_Vita *manager = (SQRNetworkManager_AdHoc_Vita *)arg; + switch(event_id) + { + case SCE_RUDP_CONTEXT_EVENT_CLOSED: + { + SQRVoiceConnection* pVoice = NULL; + if(sc_voiceChatEnabled) + SonyVoiceChat_Vita::GetVoiceConnectionFromRudpCtx(ctx_id); + + if(pVoice) + { + pVoice->m_bConnected = false; + } + else + { + app.DebugPrintf(CMinecraftApp::USER_RR,"RUDP closed - event error 0x%x\n",error_code); + if( !manager->m_isHosting ) + { + if( manager->m_state == SNM_INT_STATE_JOINING_WAITING_FOR_LOCAL_PLAYERS ) + { + manager->LeaveRoom(true); + } + } + } + } + break; + case SCE_RUDP_CONTEXT_EVENT_ESTABLISHED: + { + SQRNetworkPlayer *player = manager->GetPlayerFromRudpCtx(ctx_id); + if( player ) + { + // Flag connection stage as being completed for this player + manager->NetworkPlayerConnectionComplete(player); + } + else + { + if(sc_voiceChatEnabled) + { + SonyVoiceChat_Vita::setConnected(ctx_id); + } + } + } + break; + case SCE_RUDP_CONTEXT_EVENT_ERROR: + break; + case SCE_RUDP_CONTEXT_EVENT_WRITABLE: + { + SQRNetworkPlayer *player = manager->GetPlayerFromRudpCtx(ctx_id); + // This event signifies that room has opened up in the write buffer, so attempt to send something + if( player ) + { + player->SendMoreInternal(); + } + else + { + if(sc_voiceChatEnabled) + { + SQRVoiceConnection* pVoice = SonyVoiceChat_Vita::GetVoiceConnectionFromRudpCtx(ctx_id); + assert(pVoice); + } + } + } + break; + case SCE_RUDP_CONTEXT_EVENT_READABLE: + if( manager->m_listener ) + { + SQRVoiceConnection* pVoice = NULL; + if(sc_voiceChatEnabled) + { + SonyVoiceChat_Vita::GetVoiceConnectionFromRudpCtx(ctx_id); + } + + if(pVoice) + { + pVoice->readRemoteData(); + } + else + { + 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 ) + { + SQRNetworkPlayer *playerFrom = manager->GetPlayerFromRudpCtx( ctx_id ); + if( playerFrom && !playerFrom->HasSmallIdConfirmed() ) + { + if( dataSize >= sizeof(SQRNetworkPlayer::InitSendData) ) + { + SQRNetworkPlayer::InitSendData ISD; + 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 + { + assert(false); + } + } + } + + if( dataSize > 0 ) + { + unsigned char *data = new unsigned char [ dataSize ]; + int bytesRead = playerIncomingData->ReadDataPacket( data, dataSize ); + if( bytesRead > 0 ) + { + SQRNetworkPlayer *playerFrom, *playerTo; + if( manager->m_isHosting ) + { + // Data always going from a remote player, to the host + playerFrom = manager->GetPlayerFromRudpCtx( ctx_id ); + playerTo = manager->m_aRoomSlotPlayers[0]; + } + else + { + // 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; + } + } + } + break; + case SCE_RUDP_CONTEXT_EVENT_FLUSHED: + break; + } +} + +int SQRNetworkManager_AdHoc_Vita::RudpEventCallback(int event_id, int soc, uint8_t const *data, size_t datalen, struct SceNetSockaddr const *addr, SceNetSocklen_t addrlen, void *arg) +{ + SQRNetworkManager_AdHoc_Vita *manager = (SQRNetworkManager_AdHoc_Vita *)arg; + if( event_id == SCE_RUDP_EVENT_SOCKET_RELEASED ) + { + assert( soc == manager->m_soc ); + sceNetSocketClose(soc); + manager->m_soc = -1; + } + return 0; +} + +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 + 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(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. +void SQRNetworkManager_AdHoc_Vita::ServerContextValid_CreateRoom() +{ + // First find a world + SetState(SNM_INT_STATE_HOSTING_CREATE_ROOM_SEARCHING_FOR_WORLD); + + SceNpMatching2GetWorldInfoListRequest reqParam; + + // Request parameters + memset(&reqParam, 0, sizeof(reqParam)); + reqParam.serverId = m_serverId; + + int ret = -1; + if( !ForceErrorPoint(SNM_FORCE_ERROR_GET_WORLD_INFO_LIST) ) + { + ret = sceNpMatching2GetWorldInfoList( m_matchingContext, &reqParam, NULL, &m_getWorldRequestId); + } + if (ret < 0) + { + SetState(SNM_INT_STATE_HOSTING_CREATE_ROOM_FAILED); + return; + } +} + +// Called when the context has been created, and we are intending to join a pre-existing room. +void SQRNetworkManager_AdHoc_Vita::ServerContextValid_JoinRoom() +{ + // assert( m_state == SNM_INT_STATE_JOINING_SERVER_SEARCH_CREATING_CONTEXT ); + + SetState(SNM_INT_STATE_JOINING_JOIN_ROOM); + + // Join the room, passing the local player mask as initial binary data so that the host knows what local players are here + SceNpMatching2JoinRoomRequest reqParam; + SceNpMatching2BinAttr binAttr; + memset(&reqParam, 0, sizeof(reqParam)); + memset(&binAttr, 0, sizeof(binAttr)); + binAttr.id = SCE_NP_MATCHING2_ROOMMEMBER_BIN_ATTR_INTERNAL_1_ID; + binAttr.ptr = &m_localPlayerJoinMask; + binAttr.size = sizeof(m_localPlayerJoinMask); + + reqParam.roomId = m_roomToJoin; + reqParam.roomMemberBinAttrInternalNum = 1; + reqParam.roomMemberBinAttrInternal = &binAttr; + + int ret = sceNpMatching2JoinRoom( m_matchingContext, &reqParam, NULL, &m_joinRoomRequestId ); + if ( (ret < 0) || ForceErrorPoint(SNM_FORCE_ERROR_JOIN_ROOM) ) + { + if( ret == SCE_NP_MATCHING2_SERVER_ERROR_NAT_TYPE_MISMATCH) + { + app.SetDisconnectReason( DisconnectPacket::eDisconnect_NATMismatch ); + } + SetState(SNM_INT_STATE_JOINING_JOIN_ROOM_FAILED); + } +} + +const SceNpCommunicationId* SQRNetworkManager_AdHoc_Vita::GetSceNpCommsId() +{ + return &s_npCommunicationId; +} + +const SceNpCommunicationSignature* SQRNetworkManager_AdHoc_Vita::GetSceNpCommsSig() +{ + return &s_npCommunicationSignature; +} + +const SceNpTitleId* SQRNetworkManager_AdHoc_Vita::GetSceNpTitleId() +{ + PSVITA_STUBBED; + return NULL; +// return &s_npTitleId; +} + +const SceNpTitleSecret* SQRNetworkManager_AdHoc_Vita::GetSceNpTitleSecret() +{ + PSVITA_STUBBED; + return NULL; +// return &s_npTitleSecret; +} + +int SQRNetworkManager_AdHoc_Vita::GetOldMask(SceNpMatching2RoomMemberId memberId) +{ + int oldMask = 0; + for( int i = 0; i < m_roomSyncData.getPlayerCount(); i++ ) + { + if( m_roomSyncData.players[i].m_roomMemberId == memberId ) + { + oldMask |= (1 << m_roomSyncData.players[i].m_localIdx); + } + } + return oldMask; +} + +int SQRNetworkManager_AdHoc_Vita::GetAddedMask(int newMask, int oldMask) +{ + return newMask & ~oldMask; +} + +int SQRNetworkManager_AdHoc_Vita::GetRemovedMask(int newMask, int oldMask) +{ + return oldMask & ~newMask; +} + + +void SQRNetworkManager_AdHoc_Vita::GetExtDataForRoom( SceNpMatching2RoomId roomId, void *extData, void (* FriendSessionUpdatedFn)(bool success, void *pParam), void *pParam ) +{ + + for(int i=0;i>>>>>>> sceNetCheckDialogInit : Adhoc 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; + } + } +} + + + +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; + + s_lastPresenceInfo.status = newPresenceInfo->status; +// s_lastPresenceInfo.userInfo = newPresenceInfo->userInfo; + s_lastPresenceInfo.presenceType = SCE_NP_BASIC_IN_GAME_PRESENCE_TYPE_DEFAULT; + + s_presenceStatusDirty = true; + SendLastPresenceInfo(); + + // 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; +} + +void SQRNetworkManager_AdHoc_Vita::UpdateRichPresenceCustomData(void *data, unsigned int dataBytes) +{ + if(m_isHosting == false) + return; + if(m_matchingContextServerValid) // if the wifi connection has dropped (say after the console has woken from sleep) this can be invalid + { + int err = sceNetAdhocMatchingSetHelloOpt(m_matchingContext, dataBytes, data); + assert(err == SCE_OK); + } + else + { + app.DebugPrintf("UpdateRichPresenceCustomData failed, m_matchingContextServerValid == false\n"); + } + +// C +// +// assert(dataBytes <= SCE_NP_BASIC_IN_GAME_PRESENCE_DATA_SIZE_MAX ); +// memcpy(s_lastPresenceInfo.data, data, dataBytes); +// s_lastPresenceInfo.size = dataBytes; +// +// s_presenceDataDirty = true; +// SendLastPresenceInfo(); +} + +void SQRNetworkManager_AdHoc_Vita::TickRichPresence() +{ + if( s_resendPresenceCountdown ) + { + s_resendPresenceCountdown--; + if( s_resendPresenceCountdown == 0 ) + { + SendLastPresenceInfo(); + } + } +} + +void SQRNetworkManager_AdHoc_Vita::SendLastPresenceInfo() +{ + // Don't attempt to send if we are already waiting to resend + if( s_resendPresenceCountdown ) return; + + // MGH - On Vita, change this to use SCE_NP_BASIC_IN_GAME_PRESENCE_TYPE_GAME_JOINING at some point + + // On PS4 we can't set the status and the data at the same time +// if( s_presenceDataDirty ) +// { +// s_presenceDataDirty = false; +// s_lastPresenceInfo.presenceType = SCE_TOOLKIT_NP_PRESENCE_DATA; +// } +// else if( s_presenceStatusDirty ) +// { +// s_presenceStatusDirty = false; +// s_lastPresenceInfo.presenceType = SCE_TOOLKIT_NP_PRESENCE_STATUS; +// } + + int err = 0; + // check if we're connected to the PSN first + if(ProfileManager.IsSignedInLive(0))//ProfileManager.getQuadrant(s_lastPresenceInfo.userInfo.userId))) + { + err = sce::Toolkit::NP::Presence::Interface::setPresence(&s_lastPresenceInfo); + } + + if( err != SCE_TOOLKIT_NP_SUCCESS ) + { + assert(0); // this should only happen for bad data + } +} + +void SQRNetworkManager_AdHoc_Vita::SetPresenceDataStartHostingGame() +{ + if( m_offlineGame ) + { + SQRNetworkManager_AdHoc_Vita::UpdateRichPresenceCustomData(&c_presenceSyncInfoNULL, sizeof(HelloSyncInfo) ); + } + else + { + HelloSyncInfo presenceInfo; + 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(); + } +} + +int SQRNetworkManager_AdHoc_Vita::GetJoiningReadyPercentage() +{ + if ( (m_state == SNM_INT_STATE_HOSTING_SEARCHING_FOR_SERVER) || (m_state == SNM_INT_STATE_JOINING_SEARCHING_FOR_SERVER) ) + { + int completed = ( m_totalServerCount - m_serverCount ) - 1; + int pc = ( completed * 100 ) / m_totalServerCount; + if( pc < 0 ) pc = 0; + if( pc > 100 ) pc = 100; + return pc; + } + else + { + return 100; + } +} + +void SQRNetworkManager_AdHoc_Vita::removePlayerFromVoiceChat( SQRNetworkPlayer* pPlayer ) +{ + if(!sc_voiceChatEnabled) + return; + + + if(pPlayer->IsLocal()) + { + SonyVoiceChat_Vita::disconnectLocalPlayer(pPlayer->GetLocalPlayerIndex()); + } + else + { + int numRemotePlayersLeft = 0; + for( int i = 0; i < MAX_ONLINE_PLAYER_COUNT; i++ ) + { + if( m_aRoomSlotPlayers[i] ) + { + if( m_aRoomSlotPlayers[i] != pPlayer ) + { + if(m_aRoomSlotPlayers[i]->m_roomMemberId == pPlayer->m_roomMemberId) + numRemotePlayersLeft++; + } + } + } + if(numRemotePlayersLeft == 0) + { + // no players left on the remote machine once we remove this one + SQRVoiceConnection* pVoice = SonyVoiceChat_Vita::getVoiceConnectionFromRoomMemberID(pPlayer->m_roomMemberId); + assert(pVoice); + if(pVoice) + SonyVoiceChat_Vita::disconnectRemoteConnection(pVoice); + } + } +} + +int SQRNetworkManager_AdHoc_Vita::sendDataPacket( SceNetInAddr addr, EAdhocDataTag tag, void* data, int dataSize ) +{ + static unsigned char s_dataBuffer[SCE_NET_ADHOC_MATCHING_MAXDATALEN]; + uint32_t* buf = (uint32_t*)s_dataBuffer; + buf[0] = tag; + memcpy(&buf[1], data, dataSize); + int ret = sceNetAdhocMatchingSendData(m_matchingContext, &addr, dataSize+4, s_dataBuffer); +// assert(ret == SCE_OK); + return ret; +} + +int SQRNetworkManager_AdHoc_Vita::sendDataPacket( SceNetInAddr addr, void* data, int dataSize ) +{ + int ret = sceNetAdhocMatchingSendData(m_matchingContext, &addr, dataSize, data); + // assert(ret == SCE_OK); + return ret; +} + +void SQRNetworkManager_AdHoc_Vita::startMatching() +{ + SetState(SNM_INT_STATE_STARTING_CONTEXT); + CreateMatchingContext(); +} + +SQRNetworkPlayer *SQRNetworkManager_AdHoc_Vita::GetPlayerByXuid(PlayerUID xuid) +{ + EnterCriticalSection(&m_csRoomSyncData); + for( int i = 0; i < m_roomSyncData.getPlayerCount(); i++ ) + { + if( m_roomSyncData.players[i].m_UID == xuid ) + { + SQRNetworkPlayer *player = GetPlayerIfReady(m_aRoomSlotPlayers[i]); + LeaveCriticalSection(&m_csRoomSyncData); + return player; + } + } + LeaveCriticalSection(&m_csRoomSyncData); + return NULL; +} + +void SQRNetworkManager_AdHoc_Vita::UpdateLocalIPAddress() +{ + SceNetInAddr localIPAddr; + int ret = sceNetCtlAdhocGetInAddr(&localIPAddr); + + // If we got the IP address, update our cached value + if (ret == SCE_OK) + { + m_localIPAddr = localIPAddr; + } +} + diff --git a/Minecraft.Client/PSVita/Network/SQRNetworkManager_AdHoc_Vita.h b/Minecraft.Client/PSVita/Network/SQRNetworkManager_AdHoc_Vita.h new file mode 100644 index 00000000..c1b2d266 --- /dev/null +++ b/Minecraft.Client/PSVita/Network/SQRNetworkManager_AdHoc_Vita.h @@ -0,0 +1,353 @@ +#pragma once +#include +#include +#include +#include + +#include + +#include + +#include "..\..\Common\Network\Sony\SQRNetworkManager.h" +// +class SQRNetworkPlayer; +class ISQRNetworkManagerListener; +class SonyVoiceChat_Vita; +class SQRVoiceConnection; +class C4JThread; + + +class HelloSyncInfo; + +enum EAdhocDataTag +{ + e_dataTag_Normal, + e_dataTag_RoomSync +}; + +class AdhocDataPacket +{ +public: + EAdhocDataTag m_tag; + uint32_t m_pData[1]; +}; + +// This is the lowest level manager for providing network functionality on Sony platforms. This manages various network activities including the players within a gaming session. +// The game shouldn't directly use this class, it is here to provide functionality required by PlatformNetworkManagerSony. + +class SQRNetworkManager_AdHoc_Vita : public SQRNetworkManager +{ + friend class SonyVoiceChat_Vita; + friend class SQRNetworkPlayer; + + static const eSQRNetworkManagerState m_INTtoEXTStateMappings[SNM_INT_STATE_COUNT]; + + + +public: + SQRNetworkManager_AdHoc_Vita(ISQRNetworkManagerListener *listener); + + // General + void Tick(); + void Initialise(); + bool IsInitialised(); + void UnInitialise(); + void Terminate(); + eSQRNetworkManagerState GetState(); + bool IsHost(); + bool IsReadyToPlayOrIdle(); + bool IsInSession(); + + // Session management + void CreateAndJoinRoom(int hostIndex, int localPlayerMask, void *extData, int extDataSize, bool offline); + void UpdateExternalRoomData(); + bool FriendRoomManagerIsBusy(); + bool FriendRoomManagerSearch(); + bool FriendRoomManagerSearch2(); + int FriendRoomManagerGetCount(); + void FriendRoomManagerGetRoomInfo(int idx, SessionSearchResult *searchResult); + bool JoinRoom(SessionSearchResult *searchResult, int localPlayerMask); + bool JoinRoom(SceNetInAddr netAddr, int localPlayerMask, const HelloSyncInfo *presence); + bool JoinRoom(SceNpMatching2RoomId roomId, SceNpMatching2ServerId serverId, int localPlayerMask, const PresenceSyncInfo *presence); + void StartGame(); + void LeaveRoom(bool bActuallyLeaveRoom); + void EndGame(); + bool SessionHasSpace(int spaceRequired); + bool AddLocalPlayerByUserIndex(int idx); + bool RemoveLocalPlayerByUserIndex(int idx); + void SendInviteGUI(); + static void RecvInviteGUI(); + void TickInviteGUI(); + + + + // void GetInviteDataAndProcess(SceNpBasicAttachmentDataId id); + static bool UpdateInviteData(HelloSyncInfo *invite); + void GetExtDataForRoom( SceNpMatching2RoomId roomId, void *extData, void (* FriendSessionUpdatedFn)(bool success, void *pParam), void *pParam ); + + // Player retrieval + int GetPlayerCount(); + int GetOnlinePlayerCount(); + SQRNetworkPlayer *GetPlayerByIndex(int idx); + SQRNetworkPlayer *GetPlayerBySmallId(int idx); + SQRNetworkPlayer *GetLocalPlayerByUserIndex(int idx); + SQRNetworkPlayer *GetPlayerByXuid(PlayerUID xuid); + SQRNetworkPlayer *GetHostPlayer(); + + void removePlayerFromVoiceChat(SQRNetworkPlayer* pPlayer); + // Communication parameter storage + static const SceNpCommunicationId* GetSceNpCommsId(); + static const SceNpCommunicationSignature* GetSceNpCommsSig(); + static const SceNpTitleId* GetSceNpTitleId(); + static const SceNpTitleSecret* GetSceNpTitleSecret(); + + 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); + +private: + void InitialiseAfterOnline(); + void ErrorHandlingTick(); + void UpdateAdhocStatus(int status) { m_adhocStatus = status; } + void UpdateLocalIPAddress(); + + ISQRNetworkManagerListener *m_listener; + SQRNetworkPlayer *GetPlayerIfReady(SQRNetworkPlayer *player); + + // Internal state + void SetState(eSQRNetworkManagerInternalState state); + void ResetToIdle(); + eSQRNetworkManagerInternalState m_state; + eSQRNetworkManagerState m_stateExternal; + 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; + int m_localPlayerJoined; // Client only, keep a count of how many local players we have confirmed as joined to the application + SceNpMatching2RoomId m_room; + unsigned char m_currentSmallId; + int m_soc; + bool m_offlineGame; + bool m_offlineSQR; + int m_resendExternalRoomDataCountdown; + bool m_matching2initialised; +// HelloSyncInfo m_inviteReceived[MAX_SIMULTANEOUS_INVITES]; +// int m_inviteIndex; +// static HelloSyncInfo *m_gameBootInvite; +// static HelloSyncInfo m_gameBootInvite_data; +// bool m_doBootInviteCheck; + bool m_isInSession; + // static SceNpBasicAttachmentDataId s_lastInviteIdToRetry; + static int m_adhocStatus; + bool m_bLinkDisconnected; + +private: + + CRITICAL_SECTION m_csRoomSyncData; + RoomSyncData m_roomSyncData; + void *m_joinExtData; + int m_joinExtDataSize; + + std::vector m_vecTempPlayers; + SQRNetworkPlayer *m_aRoomSlotPlayers[MAX_ONLINE_PLAYER_COUNT]; // Maps from the players in m_roomSyncData, to SQRNetworkPlayers + void FindOrCreateNonNetworkPlayer(int slot, int playerType, SceNpMatching2RoomMemberId memberId, int localPlayerIdx, int smallId); + + void MapRoomSlotPlayers(int roomSlotPlayerCount =-1); + void UpdateRoomSyncUIDsFromPlayers(); + void UpdatePlayersFromRoomSyncUIDs(); + void LocalDataSend(SQRNetworkPlayer *playerFrom, SQRNetworkPlayer *playerTo, const void *data, unsigned int dataSize); + int GetSessionIndex(SQRNetworkPlayer *player); + + bool AddRemotePlayersAndSync( SceNpMatching2RoomMemberId memberId, int playerMask, bool *isFull = NULL ); + void RemoveRemotePlayersAndSync( SceNpMatching2RoomMemberId memberId, int mask ); + void RemoveNetworkPlayers( int mask ); + void SetLocalPlayersAndSync(); + void SyncRoomData(); + SceNpMatching2RequestId m_setRoomDataRequestId; + SceNpMatching2RequestId m_setRoomIntDataRequestId; + SceNpMatching2RequestId m_roomExtDataRequestId; + + // Server context management + bool GetMatchingContext(eSQRNetworkManagerInternalState asyncState); + bool GetServerContext(); + bool GetServerContext_AdHoc(); + bool GetServerContext2(); + bool GetServerContext(SceNpMatching2ServerId serverId); + void DeleteServerContext(); + bool SelectRandomServer(); + void ServerContextTick(); + int m_totalServerCount; + int m_serverCount; + SceNpMatching2ServerId *m_aServerId; + SceNpMatching2ServerId m_serverId; + bool m_serverContextValid; + SceNpMatching2RequestId m_serverSearchRequestId; + SceNpMatching2RequestId m_serverContextRequestId; + + // Room creation management + SceNpMatching2RequestId m_getWorldRequestId; + SceNpMatching2RequestId m_createRoomRequestId; + SceNpMatching2WorldId m_worldId; + void RoomCreateTick(); + + // Room joining management + SceNpMatching2RoomId m_roomToJoin; + int m_localPlayerJoinMask; + SceNpMatching2RequestId m_joinRoomRequestId; + SceNpMatching2RequestId m_kickRequestId; + + // Room leaving management + SceNpMatching2RequestId m_leaveRoomRequestId; + + // Adding extra network players management + SceNpMatching2RequestId m_setRoomMemberInternalDataRequestId; + + // Player state management + void NetworkPlayerConnectionComplete(SQRNetworkPlayer *player); + void NetworkPlayerSmallIdAllocated(SQRNetworkPlayer *player, unsigned char smallId); + void NetworkPlayerInitialDataReceived(SQRNetworkPlayer *player,void *data); + void NonNetworkPlayerComplete(SQRNetworkPlayer *player, unsigned char smallId); + void HandlePlayerJoined(SQRNetworkPlayer *player); + CRITICAL_SECTION m_csPlayerState; + + // State and thread for managing basic event type messages + C4JThread *m_basicEventThread; +// SceKernelEqueue m_basicEventQueue; + static int BasicEventThreadProc( void *lpParameter); + + // State and storage for managing search for friends' games + eSQRNetworkManagerFriendSearchState m_friendSearchState; + SceNpMatching2ContextId m_matchingContext; + bool m_matchingContextServerValid; + bool m_matchingContextClientValid; + SceNpMatching2RequestId m_friendSearchRequestId; + unsigned int m_friendCount; +// C4JThread *m_getFriendCountThread; +// static int GetFriendsThreadProc( void* lpParameter ); + void FriendSearchTick(); + SceNpMatching2RequestId m_roomDataExternalListRequestId; + void (* m_FriendSessionUpdatedFn)(bool success, void *pParam); + void *m_pParamFriendSessionUpdated; + void *m_pExtDataToUpdate; + + // Results from searching for rooms that friends are playing in - 5 matched arrays to store their NpIds, rooms, servers, whether a room was found, and whether the external data had been received for the room. Also a count of how many elements are used in this array. + class FriendSearchResult + { + public: + SceNpId m_NpId; + SceNetInAddr m_netAddr; +// SceNpMatching2RoomId m_RoomId; +// SceNpMatching2ServerId m_ServerId; + bool m_RoomFound; + void *m_RoomExtDataReceived; + void* m_gameSessionData; + RoomSyncData m_roomSyncData; + }; + std::vector m_aFriendSearchResults; + bool m_bFriendsSearchChanged; + + // Rudp management and local players + std::unordered_map m_RudpCtxToPlayerMap; + std::unordered_map m_RudpCtxToIPAddrMap; + + std::unordered_map m_NetAddrToVoiceConnectionMap; + + bool CreateRudpConnections(SceNetInAddr peer); + bool CreateVoiceRudpConnections(SceNpMatching2RoomId roomId, SceNpMatching2RoomMemberId peerMemberId, int playerMask); + bool CreateSocket(); + SQRNetworkPlayer *GetPlayerFromRudpCtx(int rudpCtx); + SceNetInAddr* GetIPAddrFromRudpCtx(int rudpCtx); + SQRVoiceConnection* GetVoiceConnectionFromRudpCtx(int rudpCtx); + + SQRNetworkPlayer *GetPlayerFromRoomMemberAndLocalIdx(int roomMember, int localIdx); + SceNpMatching2RequestId m_roomMemberDataRequestId; + + // Callbacks (for matching) + bool RegisterCallbacks(); + void HandleMatchingContextStart(); + // #ifdef __PS3__ + // static void DefaultRequestCallback(SceNpMatching2ContextId id, SceNpMatching2RequestId reqId, SceNpMatching2Event event, SceNpMatching2EventKey eventKey, int errorCode, size_t dataSize, void *arg); + // static void RoomEventCallback(SceNpMatching2ContextId id, SceNpMatching2RoomId roomId, SceNpMatching2Event event, SceNpMatching2EventKey eventKey, int errorCode, size_t dataSize, void *arg); + // #else +// static void DefaultRequestCallback(SceNpMatching2ContextId id, SceNpMatching2RequestId reqId, SceNpMatching2Event event, int errorCode, const void *data, void *arg); +// static void RoomEventCallback(SceNpMatching2ContextId id, SceNpMatching2RoomId roomId, SceNpMatching2Event event, const void *data, void *arg); + // #endif +// static void SignallingCallback(SceNpMatching2ContextId ctxId, SceNpMatching2RoomId roomId, SceNpMatching2RoomMemberId peerMemberId, SceNpMatching2Event event, int error_code, void *arg); + + // Callback for NpBasic + static int BasicEventCallback(int event, int retCode, uint32_t reqId, void *arg); + + // Callback for NpManager + static void ManagerCallback(int event, int result, void *arg); + + // Callback for sys util + static void SysUtilCallback(uint64_t status, uint64_t param, void *userdata); + void updateNetCheckDialog(); // get the status of the dialog and run any callbacks needed [CD - Added to match SQRNetworkManager_Vita] + + // Callbacks for rudp + static void RudpContextCallback(int ctx_id, int event_id, int error_code, void *arg); + static int RudpEventCallback(int event_id, int soc, uint8_t const *data, size_t datalen, struct SceNetSockaddr const *addr, SceNetSocklen_t addrlen, void *arg); + + // Callback for netctl + static void NetCtlCallback(int eventType, void *arg); + + // Methods to be called when the server context has been created + void ServerContextValid_CreateRoom(); + void ServerContextValid_JoinRoom(); + + // Mask utilities + int GetOldMask(SceNpMatching2RoomMemberId memberId); + int GetAddedMask(int newMask, int oldMask); + int GetRemovedMask(int newMask, int oldMask); + +#ifndef _CONTENT_PACKAGE + static bool aForceError[SNM_FORCE_ERROR_COUNT]; +#endif + bool ForceErrorPoint(eSQRForceError err); + + + static void MatchingEventHandler(int id, int event, SceNetInAddr* peer, int optlen, void *opt); + + +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; + + static int SetRichPresence(const void *data); + void SetPresenceDataStartHostingGame(); + int GetJoiningReadyPercentage(); + + void startMatching(); +private: + void UpdateRichPresenceCustomData(void *data, unsigned int dataBytes); + static void TickRichPresence(); + static void SendLastPresenceInfo(); + void OnlineCheck(); + + bool CreateMatchingContext(bool bServer = false); + void StopMatchingContext(); + + + static sce::Toolkit::NP::PresenceDetails s_lastPresenceInfo; + static int s_resendPresenceCountdown; + static bool s_presenceStatusDirty; + static bool s_presenceDataDirty; + static HelloSyncInfo s_lastPresenceSyncInfo; + static HelloSyncInfo c_presenceSyncInfoNULL; + static bool b_inviteRecvGUIRunning; + // Debug + static long long s_roomStartTime; + + int m_hid; + bool m_bIsInitialised; + +}; + diff --git a/Minecraft.Client/PSVita/Network/SQRNetworkManager_Vita.cpp b/Minecraft.Client/PSVita/Network/SQRNetworkManager_Vita.cpp new file mode 100644 index 00000000..8182674a --- /dev/null +++ b/Minecraft.Client/PSVita/Network/SQRNetworkManager_Vita.cpp @@ -0,0 +1,4132 @@ +#include "stdafx.h" +#include "SQRNetworkManager_Vita.h" +#include "SonyVoiceChat_Vita.h" +#include "Common/Network/Sony/PlatformNetworkManagerSony.h" + +#include +#include +#include +#include +#include + +#include "PSVita\PSVitaExtras\Conf.h" +#include "Common\Network\Sony\SonyHttp.h" +#include "..\..\..\Minecraft.World\C4JThread.h" + +// image used for the invite gui, filesize must be smaller than SCE_NP_MESSAGE_DIALOG_MAX_INDEX_ICON_SIZE ( 64K ) +#define SESSION_IMAGE_PATH "app0:PSVita/session_image.png" + +int (* SQRNetworkManager_Vita::s_SignInCompleteCallbackFn)(void *pParam, bool bContinue, int pad) = NULL; +void * SQRNetworkManager_Vita::s_SignInCompleteParam = NULL; +sce::Toolkit::NP::PresenceDetails SQRNetworkManager_Vita::s_lastPresenceInfo; +int SQRNetworkManager_Vita::s_resendPresenceCountdown = 0; +bool SQRNetworkManager_Vita::s_presenceStatusDirty = false; +bool SQRNetworkManager_Vita::s_signInCompleteCallbackIfFailed = false; +SQRNetworkManager_Vita::PresenceSyncInfo SQRNetworkManager_Vita::s_lastPresenceSyncInfo = { 0 }; +SQRNetworkManager_Vita::PresenceSyncInfo SQRNetworkManager_Vita::c_presenceSyncInfoNULL = { 0 }; +//SceNpBasicAttachmentDataId SQRNetworkManager_Vita::s_lastInviteIdToRetry = SCE_NP_BASIC_INVALID_ATTACHMENT_DATA_ID; +long long SQRNetworkManager_Vita::s_roomStartTime = 0; +bool SQRNetworkManager_Vita::b_inviteRecvGUIRunning = false; +SQRNetworkManager_Vita::PresenceSyncInfo* SQRNetworkManager_Vita::m_gameBootInvite; +SQRNetworkManager_Vita::PresenceSyncInfo SQRNetworkManager_Vita::m_gameBootInvite_data; +bool SQRNetworkManager_Vita::m_bCallPSNSignInCallback=false; +bool SQRNetworkManager_Vita::m_bJoinablePresenceWaitingForOnline = false; +SceAppUtilNpBasicJoinablePresenceParam SQRNetworkManager_Vita::m_joinablePresenceParam; +bool SQRNetworkManager_Vita::m_bSendingInviteMessage; + +// static const int sc_UserEventHandle = 0; + +//unsigned int SQRNetworkManager_Vita::RoomSyncData::playerCount = 0; + +// This maps internal to extern states, and needs to match element-by-element the eSQRNetworkManagerInternalState enumerated type +const SQRNetworkManager_Vita::eSQRNetworkManagerState SQRNetworkManager_Vita::m_INTtoEXTStateMappings[SQRNetworkManager_Vita::SNM_INT_STATE_COUNT] = +{ + SNM_STATE_INITIALISING, // SNM_INT_STATE_UNINITIALISED + SNM_STATE_INITIALISING, // SNM_INT_STATE_SIGNING_IN + SNM_STATE_INITIALISING, // SNM_INT_STATE_STARTING_CONTEXT + SNM_STATE_INITIALISE_FAILED, // SNM_INT_STATE_INITIALISE_FAILED + SNM_STATE_IDLE, // SNM_INT_STATE_IDLE + SNM_STATE_IDLE, // SNM_INT_STATE_IDLE_RECREATING_MATCHING_CONTEXT + SNM_STATE_HOSTING, // SNM_INT_STATE_HOSTING_STARTING_MATCHING_CONTEXT + SNM_STATE_HOSTING, // SNM_INT_STATE_HOSTING_SEARCHING_FOR_SERVER + SNM_STATE_HOSTING, // SNM_INT_STATE_HOSTING_SERVER_SEARCH_SERVER_ERROR + SNM_STATE_HOSTING, // SNM_INT_STATE_HOSTING_SERVER_FOUND + SNM_STATE_HOSTING, // SNM_INT_STATE_HOSTING_SERVER_SEARCH_CREATING_CONTEXT + SNM_STATE_HOSTING, // SNM_INT_STATE_HOSTING_SERVER_SEARCH_FAILED + SNM_STATE_HOSTING, // SNM_INT_STATE_HOSTING_CREATE_ROOM_SEARCHING_FOR_WORLD + SNM_STATE_HOSTING, // SNM_INT_STATE_HOSTING_CREATE_ROOM_WORLD_FOUND + SNM_STATE_HOSTING, // SNM_INT_STATE_HOSTING_CREATE_ROOM_CREATING_ROOM + SNM_STATE_HOSTING, // SNM_INT_STATE_HOSTING_CREATE_ROOM_SUCCESS + SNM_STATE_HOSTING, // SNM_INT_STATE_HOSTING_CREATE_ROOM_FAILED + SNM_STATE_HOSTING, // SNM_INT_STATE_HOSTING_CREATE_ROOM_RESTART_MATCHING_CONTEXT + SNM_STATE_HOSTING, // SNM_INT_STATE_HOSTING_WAITING_TO_PLAY + SNM_STATE_JOINING, // SNM_INT_STATE_JOINING_STARTING_MATCHING_CONTEXT + SNM_STATE_JOINING, // SNM_INT_STATE_JOINING_SEARCHING_FOR_SERVER + SNM_STATE_JOINING, // SNM_INT_STATE_JOINING_SERVER_SEARCH_SERVER_ERROR + SNM_STATE_JOINING, // SNM_INT_STATE_JOINING_SERVER_FOUND + SNM_STATE_JOINING, // SNM_INT_STATE_JOINING_SERVER_SEARCH_CREATING_CONTEXT + SNM_STATE_JOINING, // SNM_INT_STATE_JOINING_SERVER_SEARCH_FAILED + SNM_STATE_JOINING, // SNM_INT_STATE_JOINING_JOIN_ROOM + SNM_STATE_JOINING, // SNM_INT_STATE_JOINING_JOIN_ROOM_FAILED + SNM_STATE_JOINING, // SNM_INT_STATE_JOINING_WAITING_FOR_LOCAL_PLAYERS + SNM_STATE_ENDING, // SNM_INT_STATE_SERVER_DELETING_CONTEXT + SNM_STATE_STARTING, // SNM_INT_STATE_STARTING + SNM_STATE_PLAYING, // SNM_INT_STATE_PLAYING + SNM_STATE_LEAVING, // SNM_INT_STATE_LEAVING + SNM_STATE_LEAVING, // SNM_INT_STATE_LEAVING_FAILED + SNM_STATE_ENDING, // SNM_INT_STATE_ENDING +}; + +SQRNetworkManager_Vita::SQRNetworkManager_Vita(ISQRNetworkManagerListener *listener) +{ + m_state = SNM_INT_STATE_UNINITIALISED; + m_stateExternal = SNM_STATE_INITIALISING; + m_nextIdleReasonIsFull = false; + m_friendSearchState = SNM_FRIEND_SEARCH_STATE_IDLE; + m_serverContextValid = false; + m_isHosting = false; + m_currentSmallId = 0; + memset( m_aRoomSlotPlayers, 0, sizeof(m_aRoomSlotPlayers) ); + m_listener = listener; + m_soc = -1; + m_resendExternalRoomDataCountdown = 0; + m_matching2initialised = false; + m_matchingContextValid = false; + m_inviteIndex = 0; + m_doBootInviteCheck = true; + m_bSendingInviteMessage = false; + m_isInSession = false; + m_offlineGame = false; + m_offlineSQR = false; + m_aServerId = NULL; + m_gameBootInvite = NULL; + m_onlineStatus = false; + m_bLinkDisconnected = false; + m_bShuttingDown = false; + + InitializeCriticalSection(&m_csRoomSyncData); + 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 + + // int ret = sceKernelCreateEqueue(&m_basicEventQueue, "SQRNetworkManager_Vita EQ"); + // assert(ret == SCE_OK); + // ret = sceKernelAddUserEvent(m_basicEventQueue, sc_UserEventHandle); + // assert(ret == SCE_OK); + // + // m_basicEventThread = new C4JThread(&BasicEventThreadProc,this,"Basic Event Handler"); + // m_basicEventThread->Run(); +} + +// First stage of initialisation. This initialises a few things that don't require the user to be signed in, and then kicks of the network start dialog utility. +// Initialisation continues in InitialiseAfterOnline once this completes. +void SQRNetworkManager_Vita::Initialise() +{ +#define NP_IN_GAME_MESSAGE_POOL_SIZE ( 16 * 1024 ) + m_bShuttingDown = false; + int32_t ret = 0; + // int32_t libCtxId = 0; + // ret = sceNpInGameMessageInitialize(NP_IN_GAME_MESSAGE_POOL_SIZE, NULL); + // assert (ret >= 0); + // libCtxId = ret; + + assert( m_state == SNM_INT_STATE_UNINITIALISED ); + + + //Initialize libnetctl - already done in SonyHttp_Vita::init + // app.DebugPrintf("sceNetCtlInit\n"); + // ret = sceNetCtlInit(); + // if( ( ret < 0 && ret != SCE_NET_CTL_ERROR_NOT_TERMINATED ) || ForceErrorPoint( SNM_FORCE_ERROR_NET_CTL_INIT ) ) + // { + // SetState(SNM_INT_STATE_INITIALISE_FAILED); + // return; + // } + + m_hid=0; + app.DebugPrintf("sceNetCtlInetRegisterCallback\n"); + ret = sceNetCtlInetRegisterCallback(&NetCtlCallback,this,&m_hid); + assert(ret == SCE_OK); + + // Initialise RUDP + const int RUDP_POOL_SIZE = (500 * 1024); // TODO - find out what we need, this size is copied from library reference + uint8_t *rudp_pool = (uint8_t *)malloc(RUDP_POOL_SIZE); + app.DebugPrintf("sceRudpInit\n"); + ret = sceRudpInit(rudp_pool, RUDP_POOL_SIZE); + if( ( ret < 0 ) || ForceErrorPoint( SNM_FORCE_ERROR_RUDP_INIT ) ) + { + SetState(SNM_INT_STATE_INITIALISE_FAILED); + return; + } + + SetState(SNM_INT_STATE_SIGNING_IN); + // AttemptPSNSignIn(NULL, NULL); + + // SonyHttp::init(); + + // SceNpCommunicationConfig npConf ; + // npConf.commId = &s_npCommunicationId; + // npConf.commPassphrase = &s_npCommunicationPassphrase; + // npConf.commSignature = &s_npCommunicationSignature; + // ret = sceNpInit(&npConf, NULL); + // if (ret < 0 && ret != SCE_NP_ERROR_ALREADY_INITIALIZED) + // { + // app.DebugPrintf("sceNpInit failed, ret=%x\n", ret); + // assert(0); + // } + + app.DebugPrintf("sceRudpEnableInternalIOThread\n"); + ret = sceRudpEnableInternalIOThread(RUDP_THREAD_STACK_SIZE, SCE_KERNEL_DEFAULT_PRIORITY); + if(ret < 0) + { + app.DebugPrintf("sceRudpEnableInternalIOThread failed with error code 0x%08x\n", ret); + assert(0); + } + // Already online? the callback won't catch this, so carry on initialising now + if(ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad())) + { + InitialiseAfterOnline(); + } + else + { + // On PS3 we'd be running the netstart dialog here, but we don't want to do that on Vita since we could be switching from ad-hoc mode + SetState(SNM_INT_STATE_INITIALISE_FAILED); + m_offlineSQR = true; + } + SonyVoiceChat_Vita::init(); + + m_bIsInitialised = true; +} + +bool SQRNetworkManager_Vita::IsInitialised() +{ + return m_bIsInitialised; +} +void SQRNetworkManager_Vita::UnInitialise() +{ + int ret; + // on changing to adhoc, we need to shutdown all PSN networking init + + // shutdown voice chat + SonyVoiceChat_Vita::shutdown(); + + app.DebugPrintf("sceNpMatching2ContextStop\n"); + int err = sceNpMatching2ContextStop(m_matchingContext); + + app.DebugPrintf("sceNpMatching2Term\n"); + sceNpMatching2DestroyContext(m_matchingContext); + + app.DebugPrintf("sceNpMatching2Term\n"); + ret = sceNpMatching2Term(); + + app.DebugPrintf("sceRudpEnd\n"); + ret = sceRudpEnd(); + + // shut down NP lib + app.DebugPrintf("sceNetCtlInetUnregisterCallback\n"); + ret = sceNetCtlInetUnregisterCallback(m_hid); + + //app.DebugPrintf("sceNetCtlTerm\n"); + //sceNetCtlTerm(); + + SetState(SNM_INT_STATE_UNINITIALISED); + m_bIsInitialised = false; + m_bShuttingDown = false; + +} + +void SQRNetworkManager_Vita::Terminate() +{ + // If playing, attempt to nicely leave the room before shutting down so that our friends won't still think this game is in progress + if( ( m_state == SNM_INT_STATE_HOSTING_CREATE_ROOM_SUCCESS ) || + ( m_state == SNM_INT_STATE_HOSTING_WAITING_TO_PLAY ) || + ( m_state == SNM_INT_STATE_JOINING_WAITING_FOR_LOCAL_PLAYERS ) || + ( m_state == SNM_INT_STATE_PLAYING ) ) + { + if( !m_offlineGame ) + { + LeaveRoom(true); + int count = 200; + do + { + Tick(); + Sleep(10); + count--; + } while( ( count > 0 ) && ( m_state != SNM_INT_STATE_IDLE ) ); + app.DebugPrintf(CMinecraftApp::USER_RR,"Attempted to leave room, %dms used\n",count * 10); + } + } + + app.DebugPrintf("sceRudpEnd\n"); + int ret = sceRudpEnd(); + app.DebugPrintf("sceNpMatching2Term\n"); + ret = sceNpMatching2Term(); + // Terminate event thread by sending it a non-zero value for data + // sceKernelTriggerUserEvent(m_basicEventQueue, sc_UserEventHandle, (void*)1); + + + // do + // { + // Sleep(10); + // } while( m_basicEventThread->isRunning() ); +} + +// Second stage of initialisation, that requires NP Manager to be online & the player to be signed in. This kicks of the creation of a context +// for Np Matching 2. Initialisation is finally complete when we get a callback to ContextCallback. The SQRNetworkManager_Vita is then finally moved +// 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; + + // We should only be doing this if we have come in from an initialisation stage (SQRNetworkManager_Vita::Initialise) or we've had a network disconnect and are coming in from an offline state. + // Don't do anything otherwise - this mainly to catch a bit of a corner case in the initialisation phase where potentially we could register for the callback that would call this with sceNpManagerRegisterCallback. + // and could then really quickly go online so that the there becomes two paths (via the callback or SQRNetworkManager_Vita::Initialise) by which this could be called + if( ( m_state != SNM_INT_STATE_SIGNING_IN ) && !(( m_state == SNM_INT_STATE_IDLE ) && m_offlineSQR) ) + { + // If we aren't going to continue on with this sign-in but are expecting a callback, then let the game know that we have completed the bit we are expecting to do. This + // will happen whilst in game, when we want to be able to sign into PSN, but don't expect the full matching stuff to get set up. + if( s_SignInCompleteCallbackFn ) + { + s_SignInCompleteCallbackFn(s_SignInCompleteParam,true,0); + s_SignInCompleteCallbackFn = NULL; + } + return; + } + + // Initialize matching2 with default settings + //int sceNetAdhocMatchingInit(SceSize poolsize,void *poolptr); + + app.DebugPrintf("sceNpMatching2Init\n"); + int ret = sceNpMatching2Init(0, 0, SCE_KERNEL_THREAD_CPU_AFFINITY_MASK_DEFAULT, 0); + + if( ( ret < 0 ) || ForceErrorPoint( SNM_FORCE_ERROR_MATCHING2_INIT ) ) + { + SetState(SNM_INT_STATE_INITIALISE_FAILED); + return; + } + app.DebugPrintf("SQRNetworkManager::InitialiseAfterOnline - matching context is now valid\n"); + m_matching2initialised = true; + + // Get NP ID of the signed-in user + SceNpId npID; + int primaryPad = ProfileManager.GetPrimaryPad(); + if(primaryPad >=0 && ProfileManager.IsSignedInLive(primaryPad)) + { + ProfileManager.GetSceNpId(primaryPad, &npID); + } + else + { + SetState(SNM_INT_STATE_INITIALISE_FAILED); + return; + } + + app.DebugPrintf("sceNpMatching2CreateContext\n"); + ret = sceNpMatching2CreateContext(&npID, GetSceNpCommsId(), &s_npCommunicationPassphrase, &m_matchingContext); + //ret = sceNpMatching2CreateContext(&npID, NULL, NULL, &m_matchingContext); + + if( ( ret < 0 ) || ForceErrorPoint( SNM_FORCE_ERROR_CREATE_MATCHING_CONTEXT ) ) + { + SetState(SNM_INT_STATE_INITIALISE_FAILED); + return; + } + m_matchingContextValid = true; + + bool bRet = RegisterCallbacks(); + if( ( !bRet ) || ForceErrorPoint( SNM_FORCE_ERROR_REGISTER_CALLBACKS ) ) + { + SetState(SNM_INT_STATE_INITIALISE_FAILED); + return; + } + + // State should be starting context until the callback that this has been created happens + SetState(SNM_INT_STATE_STARTING_CONTEXT); + + // Start the context + // Set time-out time to 10 seconds + app.DebugPrintf("sceNpMatching2ContextStart\n"); + ret = sceNpMatching2ContextStart(m_matchingContext, (10*1000*1000)); + + if( ( ret < 0 ) || ForceErrorPoint( SNM_FORCE_ERROR_CONTEXT_START_ASYNC ) ) + { + SetState(SNM_INT_STATE_INITIALISE_FAILED); + } +} + + +// 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(); + ServerContextTick(); + RoomCreateTick(); + FriendSearchTick(); + TickRichPresence(); + TickJoinablePresenceData(); + // TickInviteGUI(); // TODO + + if( ( m_gameBootInvite ) && ( s_safeToRespondToGameBootInvite ) ) + { + m_listener->HandleInviteReceived( ProfileManager.GetPrimaryPad(), m_gameBootInvite ); + m_gameBootInvite = NULL; + } + + ErrorHandlingTick(); + // If we ever fail to send the external room data, we start a countdown so that we attempt to resend. Not sure how likely it is that updating this will fail without the whole network being broken, + // but if in particular we don't update the flag to say that the session is joinable, then nobody is ever going to see this session. + if( m_resendExternalRoomDataCountdown ) + { + if( m_state == SNM_INT_STATE_PLAYING ) + { + m_resendExternalRoomDataCountdown--; + if( m_resendExternalRoomDataCountdown == 0 ) + { + UpdateExternalRoomData(); + } + } + else + { + m_resendExternalRoomDataCountdown = 0; + } + } + + // ProfileManager.SetNetworkStatus(GetOnlineStatus()); + + // Client only - do the final transition to a starting & playing state once we have fully joined the room, And told the game about all the local players so they are also all valid + if( m_state == SNM_INT_STATE_JOINING_WAITING_FOR_LOCAL_PLAYERS ) + { + if( m_localPlayerJoined == m_localPlayerCount ) + { + // Since we're now fully joined, we can update our presence info so that our friends could find us in this game. This data was set up + // at the point that we joined the game (either from search info, or an invitation). + UpdateRichPresenceCustomData(&s_lastPresenceSyncInfo, sizeof(PresenceSyncInfo)); + SetState( SNM_INT_STATE_STARTING); + SetState( SNM_INT_STATE_PLAYING ); + } + } + + if( m_state == SNM_INT_STATE_SERVER_DELETING_CONTEXT ) + { + // make sure we've removed all the remote players and killed the udp connections before we bail out + if(m_RudpCtxToPlayerMap.size() == 0) + ResetToIdle(); + } + + EnterCriticalSection(&m_csStateChangeQueue); + while(m_stateChangeQueue.size() > 0 ) + { + if( m_listener ) + { + m_listener->HandleStateChange(m_stateChangeQueue.front().m_oldState, m_stateChangeQueue.front().m_newState, m_stateChangeQueue.front().m_idleReasonIsSessionFull); + if( m_stateChangeQueue.front().m_newState == SNM_STATE_IDLE ) + { + m_isInSession = false; + } + } + m_stateExternal = m_stateChangeQueue.front().m_newState; + m_stateChangeQueue.pop(); + } + LeaveCriticalSection(&m_csStateChangeQueue); + + // 4J-PB - SQRNetworkManager_PS3::AttemptPSNSignIn was causing crashes in Iggy by calling LoadMovie from a callback, so call it frmo the tick instead + if(m_bCallPSNSignInCallback) + { + m_bCallPSNSignInCallback=false; + if( s_signInCompleteCallbackIfFailed ) + { + s_SignInCompleteCallbackFn(s_SignInCompleteParam,false,0); + s_SignInCompleteCallbackFn = NULL; + } + else if(s_SignInCompleteCallbackFn) + { + s_SignInCompleteCallbackFn(s_SignInCompleteParam, true, 0); + s_SignInCompleteCallbackFn = NULL; + } + } + +} + +// Detect any states which reflect internal error states, do anything required, and transition away again +void SQRNetworkManager_Vita::ErrorHandlingTick() +{ + switch( m_state ) + { + case SNM_INT_STATE_INITIALISE_FAILED: + if( s_SignInCompleteCallbackFn ) + { + if( s_signInCompleteCallbackIfFailed ) + { + s_SignInCompleteCallbackFn(s_SignInCompleteParam,false,0); + } + s_SignInCompleteCallbackFn = NULL; + } + app.DebugPrintf("Network error: SNM_INT_STATE_INITIALISE_FAILED\n"); + if( m_isInSession && m_offlineGame) // m_offlineSQR ) // MGH - changed this to m_offlineGame, as m_offlineSQR can be true when running an online game but the init has failed because the servers are down + { + // This is a fix for an issue where a player attempts (and fails) to sign in, whilst in an offline game. This was setting the state to idle, which in turn + // sets the game to Not be in a session anymore (but the game wasn't generally aware of, and so keeps playing). Howoever, the game's connections use + // their tick to determine whether to empty their queues or not and so no communications (even though they don't actually use this network manager for local connections) + // were happening. + SetState(SNM_INT_STATE_PLAYING); + } + else + { + m_offlineSQR = true; + SetState(SNM_INT_STATE_IDLE); + } + break; + case SNM_INT_STATE_HOSTING_SERVER_SEARCH_FAILED: + app.DebugPrintf("Network error: SNM_INT_STATE_HOSTING_SERVER_SEARCH_FAILED\n"); + ResetToIdle(); + break; + case SNM_INT_STATE_HOSTING_CREATE_ROOM_FAILED: + app.DebugPrintf("Network error: SNM_INT_STATE_HOSTING_CREATE_ROOM_FAILED\n"); + DeleteServerContext(); + break; + case SNM_INT_STATE_JOINING_SERVER_SEARCH_FAILED: + app.DebugPrintf("Network error: SNM_INT_STATE_JOINING_SERVER_SEARCH_FAILED\n"); + ResetToIdle(); + break; + case SNM_INT_STATE_JOINING_JOIN_ROOM_FAILED: + app.DebugPrintf("Network error: SNM_INT_STATE_JOINING_JOIN_ROOM_FAILED\n"); + DeleteServerContext(); + break; + case SNM_INT_STATE_LEAVING_FAILED: + app.DebugPrintf("Network error: SNM_INT_STATE_LEAVING_FAILED\n"); + DeleteServerContext(); + break; + } + +} + +// Start hosting a game, by creating a room & joining it. We explicity create a server context here (via GetServerContext) as Sony suggest that +// this means we have greater control of representing when players are actually "online". The creation of the room is carried out in a callback +// after that server context is made (ServerContextValidCallback_CreateRoom). +// hostIndex is the index of the user that is hosting the session, and localPlayerMask has bit 0 - 3 set to indicate the full set of local players joining the game. +// extData and extDataSize define the initial state of room data that is externally visible (eg by players searching for rooms, but not in it) +void SQRNetworkManager_Vita::CreateAndJoinRoom(int hostIndex, int localPlayerMask, void *extData, int extDataSize, bool offline) +{ + // hostIndex should always be in the mask + assert( ( ( 1 << hostIndex ) & localPlayerMask ) != 0 ); + + m_isHosting = true; + m_joinExtData = extData; + m_joinExtDataSize = extDataSize; + m_offlineGame = offline; + m_resendExternalRoomDataCountdown = 0; + m_isInSession= true; + + // Default value for room, which we can use for offlinae games + m_room = 0; + + // Initialise room data that will be synchronised. Slot 0 is always reserved for the host. We don't know the + // room member until the room is actually created so this will be set/updated at that point + memset( &m_roomSyncData, 0, sizeof(m_roomSyncData) ); + m_roomSyncData.setPlayerCount(1); + m_roomSyncData.players[0].m_smallId = m_currentSmallId++; + m_roomSyncData.players[0].m_localIdx = hostIndex; + + // Remove the host player that we've already added, then add any other local players specified in the mask + localPlayerMask &= ~( ( 1 << hostIndex ) & localPlayerMask ); + for( int i = 0; i < MAX_LOCAL_PLAYER_COUNT; i++ ) + { + if( localPlayerMask & ( 1 << i ) ) + { + m_roomSyncData.players[m_roomSyncData.getPlayerCount()].m_smallId = m_currentSmallId++; + m_roomSyncData.players[m_roomSyncData.getPlayerCount()].m_localIdx = i; + m_roomSyncData.setPlayerCount(m_roomSyncData.getPlayerCount()+1); + } + } + m_localPlayerCount = m_roomSyncData.getPlayerCount(); + + // For offline games, we can jump straight to the state that says we've just created the room (or would have, for an online game) + if( m_offlineGame ) + { + SetState(SNM_INT_STATE_HOSTING_CREATE_ROOM_SUCCESS); + } + else + { + // Kick off the sequence of events required for an online game, starting with getting the server context + m_isInSession = GetServerContext(); + } +} + +// Updates the externally visible data that was associated with the room when it was created with CreateAndJoinRoom. +void SQRNetworkManager_Vita::UpdateExternalRoomData() +{ + if( m_offlineGame ) return; + if( m_isHosting ) + { + SceNpMatching2SetRoomDataExternalRequest reqParam; + memset( &reqParam, 0, sizeof(reqParam) ); + reqParam.roomId = m_room; + SceNpMatching2BinAttr roomBinAttr; + memset(&roomBinAttr, 0, sizeof(roomBinAttr)); + roomBinAttr.id = SCE_NP_MATCHING2_ROOM_BIN_ATTR_EXTERNAL_1_ID; + roomBinAttr.ptr = m_joinExtData; + roomBinAttr.size = m_joinExtDataSize; + reqParam.roomBinAttrExternalNum = 1; + reqParam.roomBinAttrExternal = &roomBinAttr; + + app.DebugPrintf("sceNpMatching2SetRoomDataExternal\n"); + int ret = sceNpMatching2SetRoomDataExternal ( m_matchingContext, &reqParam, NULL, &m_setRoomDataRequestId ); + app.DebugPrintf(CMinecraftApp::USER_RR,"sceNpMatching2SetRoomDataExternal returns 0x%x, number of players %d\n",ret,((char *)m_joinExtData)[174]); + if( ( ret < 0 ) || ForceErrorPoint( SNM_FORCE_ERROR_SET_EXTERNAL_ROOM_DATA ) ) + { + // If we ever fail to send the external room data, we start a countdown so that we attempt to resend. Not sure how likely it is that updating this will fail without the whole network being broken, + // but if in particular we don't update the flag to say that the session is joinable, then nobody is ever going to see this session. + m_resendExternalRoomDataCountdown = 60; + } + } +} + +// Determine if the friend room manager is busy. If it isn't busy, then other operations (searching for a friend, reading the found friend's room lists) may safely be performed +bool SQRNetworkManager_Vita::FriendRoomManagerIsBusy() +{ + return (m_friendSearchState != SNM_FRIEND_SEARCH_STATE_IDLE); +} + +// Initiate a search for rooms that the signed in user's friends are in. This is an asynchronous operation, this function returns after it kicks off a search across all game servers +// for any of the player's friends. +bool SQRNetworkManager_Vita::FriendRoomManagerSearch() +{ + if( m_state != SNM_INT_STATE_IDLE ) return false; + + // Don't start another search if we're already searching... + if( m_friendSearchState != SNM_FRIEND_SEARCH_STATE_IDLE ) + { + return false; + } + + // Free up any external data that we received from the previous search + for( int i = 0; i < m_aFriendSearchResults.size(); i++ ) + { + if(m_aFriendSearchResults[i].m_RoomExtDataReceived) + free(m_aFriendSearchResults[i].m_RoomExtDataReceived); + m_aFriendSearchResults[i].m_RoomExtDataReceived = NULL; + } + + m_friendSearchState = SNM_FRIEND_SEARCH_STATE_GETTING_FRIEND_COUNT; + m_friendCount = 0; + m_aFriendSearchResults.clear(); + + // Get friend list - doing this in another thread as it can lock up for a few seconds + m_getFriendCountThread = new C4JThread(&GetFriendsThreadProc,this,"GetFriendsThreadProc"); + m_getFriendCountThread->Run(); + + return true; +} + +bool SQRNetworkManager_Vita::FriendRoomManagerSearch2() +{ + if( m_friendCount == 0 ) + { + m_friendSearchState = SNM_FRIEND_SEARCH_STATE_IDLE; + return false; + } + + if( m_aFriendSearchResults.size() > 0 ) + { + // If we have some results, then we also want to make sure that we don't have any duplicate rooms here if more than one friend is playing in the same room. + unordered_set uniqueRooms; + for( unsigned int i = 0; i < m_aFriendSearchResults.size(); i++ ) + { + if(m_aFriendSearchResults[i].m_RoomFound) + { + uniqueRooms.insert( m_aFriendSearchResults[i].m_RoomId ); + } + } + + // Tidy the results up further based on this + for( unsigned int i = 0; i < m_aFriendSearchResults.size(); ) + { + if( uniqueRooms.find(m_aFriendSearchResults[i].m_RoomId) == uniqueRooms.end() ) + { + free(m_aFriendSearchResults[i].m_RoomExtDataReceived); + m_aFriendSearchResults[i] = m_aFriendSearchResults.back(); + m_aFriendSearchResults.pop_back(); + } + else + { + uniqueRooms.erase(m_aFriendSearchResults[i].m_RoomId); + i++; + } + } + } + m_friendSearchState = SNM_FRIEND_SEARCH_STATE_IDLE; + return true; +} + +void SQRNetworkManager_Vita::FriendSearchTick() +{ + // Move onto next state if we're done getting our friend count + if( m_friendSearchState == SNM_FRIEND_SEARCH_STATE_GETTING_FRIEND_COUNT ) + { + if( !m_getFriendCountThread->isRunning() ) + { + m_friendSearchState = SNM_FRIEND_SEARCH_STATE_GETTING_FRIEND_INFO; + delete m_getFriendCountThread; + m_getFriendCountThread = NULL; + FriendRoomManagerSearch2(); + } + } +} + +// The handler for basic events can't actually get the events themselves, this has to be done on another thread. Instead, we send a sys_event_t to a queue on This thread, +// which has a single data item used which we can use to determine whether to terminate this thread or get a basic event & handle that. +int SQRNetworkManager_Vita::BasicEventThreadProc( void *lpParameter ) +{ + PSVITA_STUBBED; + return 0; + // SQRNetworkManager_Vita *manager = (SQRNetworkManager_Vita *)lpParameter; + // + // int ret = SCE_OK; + // SceKernelEvent event; + // int outEv; + // + // do + // { + // ret = sceKernelWaitEqueue(manager->m_basicEventQueue, &event, 1, &outEv, NULL); + // + // // If the sys_event_t we've sent here from the handler has a non-zero data1 element, this is to signify that we should terminate the thread + // if( event.udata == 0 ) + // { + // // int iEvent; + // // SceNpUserInfo from; + // // uint8_t buffer[SCE_NP_BASIC_MAX_MESSAGE_SIZE]; + // // size_t bufferSize = SCE_NP_BASIC_MAX_MESSAGE_SIZE; + // // int ret = sceNpBasicGetEvent(&iEvent, &from, &buffer, &bufferSize); + // // if( ret == 0 ) + // // { + // // if( iEvent == SCE_NP_BASIC_EVENT_INCOMING_BOOTABLE_INVITATION ) + // // { + // // // 4J Stu - Don't do this here as it can be very disruptive to gameplay. Players can bring this up from LoadOrJoinMenu, PauseMenu and InGameInfoMenu + // // //sceNpBasicRecvMessageCustom(SCE_NP_BASIC_MESSAGE_MAIN_TYPE_INVITE, SCE_NP_BASIC_RECV_MESSAGE_OPTIONS_INCLUDE_BOOTABLE, SYS_MEMORY_CONTAINER_ID_INVALID); + // // } + // // if( iEvent == SCE_NP_BASIC_EVENT_RECV_INVITATION_RESULT ) + // // { + // // SceNpBasicExtendedAttachmentData *result = (SceNpBasicExtendedAttachmentData *)buffer; + // // if(result->userAction == SCE_NP_BASIC_MESSAGE_ACTION_ACCEPT ) + // // { + // // manager->GetInviteDataAndProcess(result->data.id); + // // } + // // } + // // app.DebugPrintf("Incoming basic event of type %d\n",iEvent); + // // } + // } + // + // } while(event.udata == 0 ); + // return 0; +} + +int SQRNetworkManager_Vita::GetFriendsThreadProc( void* lpParameter ) +{ + SQRNetworkManager_Vita *manager = (SQRNetworkManager_Vita *)lpParameter; + + int ret = 0; + manager->m_aFriendSearchResults.clear(); + manager->m_friendCount = 0; + if(!ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad())) + { + app.DebugPrintf("getFriendslist failed, not signed into Live! \n"); + return 0; + } + + + ret = sceNpBasicGetFriendListEntryCount(&manager->m_friendCount); + if( ( ret < 0 ) || manager->ForceErrorPoint( SNM_FORCE_ERROR_GET_FRIEND_LIST_ENTRY_COUNT ) ) + { + // This is likely when friend list hasn't been received from the server yet - will be returning SCE_NP_BASIC_ERROR_BUSY in this case + manager->m_friendCount = 0; + } + + + // There shouldn't ever be more than 100 friends returned but limit here just in case + if( manager->m_friendCount > 100 ) manager->m_friendCount = 100; + + SceNpId* friendIDs = NULL; + if(manager->m_friendCount > 0) + { + // grab all the friend IDs first + friendIDs = new SceNpId[manager->m_friendCount]; + SceSize numRecieved; + ret = sceNpBasicGetFriendListEntries(0, friendIDs, manager->m_friendCount, &numRecieved); + if (ret < 0) + { + app.DebugPrintf("sceNpBasicGetFriendListEntries() failed: ret = 0x%x\n", ret); + manager->m_friendCount = 0; + } + else + { + assert(numRecieved == manager->m_friendCount); + } + } + + + // It is possible that the size of the friend list might vary from what we just received, so only add in friends that we successfully get an entry for + for( unsigned int i = 0; i < manager->m_friendCount; i++ ) + { + static SceNpBasicGamePresence presenceDetails; + static SceNpBasicFriendContextState contextState; + int ret = sceNpBasicGetFriendContextState(&friendIDs[i], &contextState); + if (ret < 0) + { + app.DebugPrintf("sceNpBasicGetFriendContextState() failed: ret = 0x%x\n", ret); + contextState = SCE_NP_BASIC_FRIEND_CONTEXT_STATE_UNKNOWN; + } + if(contextState == SCE_NP_BASIC_FRIEND_CONTEXT_STATE_IN_CONTEXT) // using the same SceNpCommunicationId, so playing Minecraft + { + ret = sceNpBasicGetGamePresenceOfFriend(&friendIDs[i], &presenceDetails); + if( ( ret == 0 ) && ( !manager->ForceErrorPoint( SNM_FORCE_ERROR_GET_FRIEND_LIST_ENTRY ) ) ) + { + FriendSearchResult result; + memcpy(&result.m_NpId, &friendIDs[i], sizeof(SceNpId)); + result.m_RoomFound = false; + + // Only include the friend's game if its the same network id ( this also filters out generally Zeroed PresenceSyncInfo, which we do when we aren't in an active game session) + // if( presenceDetails.size == sizeof(PresenceSyncInfo) ) + { + PresenceSyncInfo *pso = (PresenceSyncInfo *)presenceDetails.inGamePresence.data; + if( pso->netVersion == MINECRAFT_NET_VERSION ) + { + if( !pso->inviteOnly ) + { + result.m_RoomFound = true; + result.m_RoomId = pso->m_RoomId; + result.m_ServerId = pso->m_ServerId; + + CPlatformNetworkManagerSony::MallocAndSetExtDataFromSQRPresenceInfo(&result.m_RoomExtDataReceived, pso); + manager->m_aFriendSearchResults.push_back(result); + } + } + } + } + } + } + + if(friendIDs) + delete friendIDs; + return 0; +} + +// Get count of rooms that friends are playing in. Only valid when FriendRoomManagerIsBusy() returns false +int SQRNetworkManager_Vita::FriendRoomManagerGetCount() +{ + assert( m_friendSearchState == SNM_FRIEND_SEARCH_STATE_IDLE ); + return m_aFriendSearchResults.size(); +} + +// Get details of a found session that a friend is playing in. 0 < idx < FriendRoomManagerGetCount(). Only valid when FriendRoomManagerIsBusy() returns false +void SQRNetworkManager_Vita::FriendRoomManagerGetRoomInfo(int idx, SQRNetworkManager_Vita::SessionSearchResult *searchResult) +{ + assert( idx < m_aFriendSearchResults.size() ); + assert( m_friendSearchState == SNM_FRIEND_SEARCH_STATE_IDLE ); + + searchResult->m_NpId = m_aFriendSearchResults[idx].m_NpId; + searchResult->m_sessionId.m_RoomId = m_aFriendSearchResults[idx].m_RoomId; + searchResult->m_sessionId.m_ServerId = m_aFriendSearchResults[idx].m_ServerId; + searchResult->m_extData = m_aFriendSearchResults[idx].m_RoomExtDataReceived; +} + +// Get overall state of the network manager. +SQRNetworkManager_Vita::eSQRNetworkManagerState SQRNetworkManager_Vita::GetState() +{ + return m_stateExternal;; +} + +bool SQRNetworkManager_Vita::IsHost() +{ + return m_isHosting; +} + +bool SQRNetworkManager_Vita::IsReadyToPlayOrIdle() +{ + return (( m_state == SNM_INT_STATE_HOSTING_WAITING_TO_PLAY ) || ( m_state == SNM_INT_STATE_PLAYING ) || ( m_state == SNM_INT_STATE_IDLE ) ); +} + + +// Consider as "in session" from the moment that a game is created or joined, until the point where the game itself has been told via state change that we are now idle. The +// game code requires IsInSession to return true as soon as it has asked to do one of these things (even if the state system hasn't really caught up with this request yet), and +// it also requires that it is informed of the state changes leading up to not being in the session, before this should report false. +bool SQRNetworkManager_Vita::IsInSession() +{ + return m_isInSession; +} + +// Get count of players currently in the session +int SQRNetworkManager_Vita::GetPlayerCount() +{ + return m_roomSyncData.getPlayerCount(); +} + +// Get count of players who are in the session, but not local to this machine +int SQRNetworkManager_Vita::GetOnlinePlayerCount() +{ + int onlineCount = 0; + for( int i = 0; i < m_roomSyncData.getPlayerCount(); i++ ) + { + if( m_roomSyncData.players[i].m_roomMemberId != m_localMemberId ) + { + onlineCount++; + } + } + return onlineCount; +} + +SQRNetworkPlayer *SQRNetworkManager_Vita::GetPlayerByIndex(int idx) +{ + if( idx < MAX_ONLINE_PLAYER_COUNT ) + { + return GetPlayerIfReady(m_aRoomSlotPlayers[idx]); + } + else + { + return NULL; + } +} + +SQRNetworkPlayer *SQRNetworkManager_Vita::GetPlayerBySmallId(int idx) +{ + EnterCriticalSection(&m_csRoomSyncData); + for( int i = 0; i < m_roomSyncData.getPlayerCount(); i++ ) + { + if( m_roomSyncData.players[i].m_smallId == idx ) + { + SQRNetworkPlayer *player = GetPlayerIfReady(m_aRoomSlotPlayers[i]); + LeaveCriticalSection(&m_csRoomSyncData); + return player; + } + } + LeaveCriticalSection(&m_csRoomSyncData); + return NULL; +} + +SQRNetworkPlayer *SQRNetworkManager_Vita::GetLocalPlayerByUserIndex(int idx) +{ + EnterCriticalSection(&m_csRoomSyncData); + for( int i = 0; i < m_roomSyncData.getPlayerCount(); i++ ) + { + if( ( m_roomSyncData.players[i].m_roomMemberId == m_localMemberId ) && ( m_roomSyncData.players[i].m_localIdx == idx ) ) + { + SQRNetworkPlayer *player = GetPlayerIfReady(m_aRoomSlotPlayers[i]); + LeaveCriticalSection(&m_csRoomSyncData); + return player; + } + } + LeaveCriticalSection(&m_csRoomSyncData); + return NULL; +} + +SQRNetworkPlayer *SQRNetworkManager_Vita::GetHostPlayer() +{ + EnterCriticalSection(&m_csRoomSyncData); + SQRNetworkPlayer *player = GetPlayerIfReady(m_aRoomSlotPlayers[0]); + LeaveCriticalSection(&m_csRoomSyncData); + return player; +} + +SQRNetworkPlayer *SQRNetworkManager_Vita::GetPlayerIfReady(SQRNetworkPlayer *player) +{ + if( player == NULL ) return NULL; + + if( player->IsReady() ) return player; + + return NULL; +} + +// Update state internally + +#ifdef _DEBUG +static const char szNetState[35][60]= +{ + "SNM_INT_STATE_UNINITIALISED", + "SNM_INT_STATE_SIGNING_IN", + "SNM_INT_STATE_STARTING_CONTEXT", + "SNM_INT_STATE_INITIALISE_FAILED", + "SNM_INT_STATE_IDLE", + "SNM_INT_STATE_IDLE_RECREATING_MATCHING_CONTEXT", + "SNM_INT_STATE_HOSTING_STARTING_MATCHING_CONTEXT", + "SNM_INT_STATE_HOSTING_SEARCHING_FOR_SERVER", + "SNM_INT_STATE_HOSTING_SERVER_SEARCH_SERVER_ERROR", + "SNM_INT_STATE_HOSTING_SERVER_FOUND", + "SNM_INT_STATE_HOSTING_SERVER_SEARCH_CREATING_CONTEXT", + "SNM_INT_STATE_HOSTING_SERVER_SEARCH_FAILED", + "SNM_INT_STATE_HOSTING_CREATE_ROOM_SEARCHING_FOR_WORLD", + "SNM_INT_STATE_HOSTING_CREATE_ROOM_WORLD_FOUND", + "SNM_INT_STATE_HOSTING_CREATE_ROOM_CREATING_ROOM", + "SNM_INT_STATE_HOSTING_CREATE_ROOM_SUCCESS", + "SNM_INT_STATE_HOSTING_CREATE_ROOM_FAILED", + "SNM_INT_STATE_HOSTING_CREATE_ROOM_RESTART_MATCHING_CONTEXT", + "SNM_INT_STATE_HOSTING_WAITING_TO_PLAY", + "SNM_INT_STATE_JOINING_STARTING_MATCHING_CONTEXT", + "SNM_INT_STATE_JOINING_SEARCHING_FOR_SERVER", + "SNM_INT_STATE_JOINING_SERVER_SEARCH_SERVER_ERROR", + "SNM_INT_STATE_JOINING_SERVER_FOUND", + "SNM_INT_STATE_JOINING_SERVER_SEARCH_CREATING_CONTEXT", + "SNM_INT_STATE_JOINING_SERVER_SEARCH_FAILED", + "SNM_INT_STATE_JOINING_JOIN_ROOM", + "SNM_INT_STATE_JOINING_JOIN_ROOM_FAILED", + "SNM_INT_STATE_JOINING_WAITING_FOR_LOCAL_PLAYERS", + "SNM_INT_STATE_SERVER_DELETING_CONTEXT", + "SNM_INT_STATE_STARTING", + "SNM_INT_STATE_PLAYING", + "SNM_INT_STATE_LEAVING", + "SNM_INT_STATE_LEAVING_FAILED", + "SNM_INT_STATE_ENDING", + "SNM_INT_STATE_COUNT" +}; + +#endif +void SQRNetworkManager_Vita::SetState(SQRNetworkManager_Vita::eSQRNetworkManagerInternalState state) +{ +#ifdef _DEBUG + app.DebugPrintf("SQRNetworkManager_Vita::SetState [%s]\n",szNetState[state]); +#endif + + eSQRNetworkManagerState oldState = m_INTtoEXTStateMappings[m_state]; + eSQRNetworkManagerState newState = m_INTtoEXTStateMappings[state]; + bool setIdleReasonSessionFull = false; + if( ( state == SNM_INT_STATE_IDLE ) && m_nextIdleReasonIsFull ) + { + setIdleReasonSessionFull = true; + m_nextIdleReasonIsFull = false; + } + m_state = state; + // Queue any important (ie externally relevant) state changes - we will do a call back for these in our main tick. Don't do it directly here + // as we could be coming from any thread at this stage, with any stack size etc. and so we don't generally want to expect the game to be able to handle itself in such circumstances. + if( ( newState != oldState ) || setIdleReasonSessionFull ) + { + EnterCriticalSection(&m_csStateChangeQueue); + m_stateChangeQueue.push(StateChangeInfo(oldState,newState,setIdleReasonSessionFull)); + LeaveCriticalSection(&m_csStateChangeQueue); + } +} + +void SQRNetworkManager_Vita::ResetToIdle() +{ + app.DebugPrintf("------------------ResetToIdle--------------------\n"); + // If we're the client, remove any networked players properly ( this will destory their rupd context etc.) + if( !m_isHosting ) + { + RemoveNetworkPlayers((1 << MAX_LOCAL_PLAYER_COUNT)-1); + } + m_serverContextValid = false; + m_isHosting = false; + m_currentSmallId = 0; + EnterCriticalSection(&m_csRoomSyncData); + for(int i = 0; i < m_roomSyncData.getPlayerCount(); i++ ) + { + delete m_aRoomSlotPlayers[i]; + } + memset( m_aRoomSlotPlayers, 0, sizeof(m_aRoomSlotPlayers) ); + memset( &m_roomSyncData,0,sizeof(m_roomSyncData)); + LeaveCriticalSection(&m_csRoomSyncData); + SetState(SNM_INT_STATE_IDLE); + SonyVoiceChat_Vita::checkFinished(); +} + +// Join a room that was found with FriendRoomManagerSearch. 0 < idx < FriendRoomManagerGetCount(). Only valid when FriendRoomManagerIsBusy() returns false +bool SQRNetworkManager_Vita::JoinRoom(SQRNetworkManager_Vita::SessionSearchResult *searchResult, int localPlayerMask) +{ + // Set up the presence info we would like to synchronise out when we have fully joined the game + CPlatformNetworkManagerSony::SetSQRPresenceInfoFromExtData(&s_lastPresenceSyncInfo, searchResult->m_extData, searchResult->m_sessionId.m_RoomId, searchResult->m_sessionId.m_ServerId); + return JoinRoom(searchResult->m_sessionId.m_RoomId, searchResult->m_sessionId.m_ServerId, localPlayerMask, NULL); +} + +// Join room with a specified roomId. This is used when joining from an invite, as well as by the previous method +bool SQRNetworkManager_Vita::JoinRoom(SceNpMatching2RoomId roomId, SceNpMatching2ServerId serverId, int localPlayerMask, const SQRNetworkManager_Vita::PresenceSyncInfo *presence) +{ + // The presence info will be directly passed in if we are joining from an invite, otherwise it has already been set up. This is synchronised out when we have fully joined the game. + if( presence ) + { + memcpy( &s_lastPresenceSyncInfo, presence, sizeof(PresenceSyncInfo) ); + } + + m_isInSession = true; + + m_isHosting = false; + m_offlineGame = false; + m_roomToJoin = roomId; + m_localPlayerJoinMask = localPlayerMask; + m_localPlayerCount = 0; + m_localPlayerJoined = 0; + + for( int i = 0; i < MAX_LOCAL_PLAYER_COUNT; i++ ) + { + if( localPlayerMask & ( 1 << i ) ) m_localPlayerCount++; + } + + return GetServerContext( serverId ); +} + +void SQRNetworkManager_Vita::StartGame() +{ + assert( ( m_state == SNM_INT_STATE_HOSTING_WAITING_TO_PLAY ) || (( m_state == SNM_INT_STATE_IDLE ) && m_offlineSQR) ); + + SetState( SNM_INT_STATE_STARTING); + SetState( SNM_INT_STATE_PLAYING); +} + +void SQRNetworkManager_Vita::LeaveRoom(bool bActuallyLeaveRoom) +{ + if( m_offlineGame ) + { + if( m_state != SNM_INT_STATE_PLAYING ) return; + + SetState(SNM_INT_STATE_LEAVING); + SetState(SNM_INT_STATE_ENDING); + ResetToIdle(); + return; + } + + UpdateRichPresenceCustomData(& c_presenceSyncInfoNULL, sizeof(PresenceSyncInfo) ); + + // SonyVoiceChat::shutdown(); + + // Attempt to leave the room if we are in any of the states we could be in if we have successfully created it + if( bActuallyLeaveRoom ) + { + if( ( m_state == SNM_INT_STATE_HOSTING_CREATE_ROOM_SUCCESS ) || + ( m_state == SNM_INT_STATE_HOSTING_WAITING_TO_PLAY ) || + ( m_state == SNM_INT_STATE_JOINING_WAITING_FOR_LOCAL_PLAYERS ) || + ( m_state == SNM_INT_STATE_PLAYING ) ) + { + SceNpMatching2LeaveRoomRequest reqParam; + memset( &reqParam, 0, sizeof(reqParam) ); + reqParam.roomId = m_room; + + SetState(SNM_INT_STATE_LEAVING); + app.DebugPrintf("sceNpMatching2LeaveRoom\n"); + int ret = sceNpMatching2LeaveRoom( m_matchingContext, &reqParam, NULL, &m_leaveRoomRequestId ); + if( ( ret < 0 ) || ForceErrorPoint(SNM_FORCE_ERROR_LEAVE_ROOM) ) + { + SetState(SNM_INT_STATE_LEAVING_FAILED); + } + } + else if ( m_state == SNM_INT_STATE_HOSTING_CREATE_ROOM_CREATING_ROOM ) + { + // Haven't created the room yet, but will have created the server context so need to recover from that + DeleteServerContext(); + } + else + { + SetState(SNM_INT_STATE_IDLE); + } + } + else + { + // We have created a room but have now had some kind of connection error which means that we've been dropped out of the room and it has been destroyed, so + // no need to leave it again since it doesn't exist anymore. Still need to destroy server context which may be valid + DeleteServerContext(); + } +} + +void SQRNetworkManager_Vita::EndGame() +{ +} + +bool SQRNetworkManager_Vita::SessionHasSpace(int spaceRequired) +{ + return( ( m_roomSyncData.getPlayerCount() + spaceRequired ) <= MAX_ONLINE_PLAYER_COUNT ); +} + +bool SQRNetworkManager_Vita::AddLocalPlayerByUserIndex(int idx) +{ + if( m_isHosting ) + { + if( m_roomSyncData.getPlayerCount() == MAX_ONLINE_PLAYER_COUNT ) return false; + + // Host's players are always at the start of the sync data, so we just need to find the first entry that isn't us to determine what we want to insert before + int insertAtIdx = m_roomSyncData.getPlayerCount(); + for( int i = 0; i < m_roomSyncData.getPlayerCount(); i++ ) + { + if( m_roomSyncData.players[i].m_roomMemberId != m_localMemberId ) + { + insertAtIdx = i; + break; + } + else + { + // Don't add the same local index twice + if( m_roomSyncData.players[i].m_localIdx == idx ) + { + return false; + } + } + } + + // Make room for a new entry... + for( int i = m_roomSyncData.getPlayerCount(); i > insertAtIdx; i-- ) + { + m_roomSyncData.players[i] = m_roomSyncData.players[i-1]; + } + m_roomSyncData.players[insertAtIdx].m_localIdx = idx; + m_roomSyncData.players[insertAtIdx].m_roomMemberId = m_localMemberId; + m_roomSyncData.players[insertAtIdx].m_smallId = m_currentSmallId++; + + m_roomSyncData.setPlayerCount(m_roomSyncData.getPlayerCount()+1); + + // And do any adjusting necessary to the mappings from this room data, to the SQRNetworkPlayers. + // This will also create the required new SQRNetworkPlayer and do all the callbacks that requires etc. + MapRoomSlotPlayers(); + + // Sync this back out to our networked clients... + SyncRoomData(); + + // no connections being made because we're all on the host, so add this player to the existing connections + SonyVoiceChat_Vita::connectPlayerToAll(idx); + return true; + } + else + { + // Don't attempt to join if our client's view of the players indicates that there aren't any free slots + if( m_roomSyncData.getPlayerCount() == MAX_ONLINE_PLAYER_COUNT ) return false; + + // Add the requested player to the mask of local players currently in the game, and update this data - this + // will also then resync with the server which can respond appropriately + int mask = 1 << idx; + if( m_localPlayerJoinMask & mask ) return false; + + m_localPlayerJoinMask |= mask; + + SceNpMatching2SetRoomMemberDataInternalRequest reqParam; + SceNpMatching2BinAttr binAttr; + + memset(&reqParam, 0, sizeof(reqParam)); + memset(&binAttr, 0, sizeof(binAttr)); + + binAttr.id = SCE_NP_MATCHING2_ROOMMEMBER_BIN_ATTR_INTERNAL_1_ID; + binAttr.ptr = &m_localPlayerJoinMask; + binAttr.size = sizeof(m_localPlayerJoinMask); + + reqParam.roomId = m_room; + reqParam.memberId = m_localMemberId; + reqParam.roomMemberBinAttrInternalNum = 1; + reqParam.roomMemberBinAttrInternal = &binAttr; + + app.DebugPrintf("sceNpMatching2SetRoomMemberDataInternal\n"); + int ret = sceNpMatching2SetRoomMemberDataInternal( m_matchingContext, &reqParam, NULL, &m_setRoomMemberInternalDataRequestId ); + + if( ( ret < 0 ) || ForceErrorPoint(SNM_FORCE_ERROR_SET_ROOM_MEMBER_DATA_INTERNAL) ) + { + return false; + } + + // Create the client's end of the rudp connections... note that m_roomSyncData.players[0].m_roomMemberId is always be the host's room member id. + bool rudpOk = CreateRudpConnections(m_room, m_roomSyncData.players[0].m_roomMemberId, mask, m_localMemberId ); + + if( rudpOk ) + { + bool ret = CreateVoiceRudpConnections( m_room, m_roomSyncData.players[0].m_roomMemberId, mask); + assert(ret); + return true; + } + else + { + m_localPlayerJoinMask &= (~mask); + return false; + } + } +} + +bool SQRNetworkManager_Vita::RemoveLocalPlayerByUserIndex(int idx) +{ + if( m_isHosting ) + { + EnterCriticalSection(&m_csRoomSyncData); + + int roomSlotPlayerCount = m_roomSyncData.getPlayerCount(); + + for( int i = 0; i < m_roomSyncData.getPlayerCount(); i++ ) + { + if( ( m_roomSyncData.players[i].m_roomMemberId == m_localMemberId ) && + ( m_roomSyncData.players[i].m_localIdx == idx ) ) + { + // Shuffle all remaining entries up... + m_roomSyncData.setPlayerCount(m_roomSyncData.getPlayerCount()-1); + for( int j = i; j < m_roomSyncData.getPlayerCount(); j++ ) + { + m_roomSyncData.players[j] = m_roomSyncData.players[j+1]; + } + + // Zero last element that isn't part of the currently sized array anymore + memset(&m_roomSyncData.players[m_roomSyncData.getPlayerCount()],0,sizeof(PlayerSyncData)); + + // And do any adjusting necessary to the mappings from this room data, to the SQRNetworkPlayers. + // This will also delete the SQRNetworkPlayer and do all the callbacks that requires etc. + MapRoomSlotPlayers(roomSlotPlayerCount); + m_aRoomSlotPlayers[m_roomSyncData.getPlayerCount()] = NULL; + + // Sync this back out to our networked clients... + SyncRoomData(); + + SonyVoiceChat_Vita::disconnectLocalPlayer(idx); + + LeaveCriticalSection(&m_csRoomSyncData); + return true; + } + } + LeaveCriticalSection(&m_csRoomSyncData); + return false; + } + else + { + // Remove the requested player from the mask of local players currently in the game, and update this data - this + // will also then resync with the server which can respond appropriately + int mask = 1 << idx; + if( ( m_localPlayerJoinMask & mask ) == 0 ) return false; + + m_localPlayerJoinMask &= ~mask; + + SceNpMatching2SetRoomMemberDataInternalRequest reqParam; + SceNpMatching2BinAttr binAttr; + + memset(&reqParam, 0, sizeof(reqParam)); + memset(&binAttr, 0, sizeof(binAttr)); + + binAttr.id = SCE_NP_MATCHING2_ROOMMEMBER_BIN_ATTR_INTERNAL_1_ID; + binAttr.ptr = &m_localPlayerJoinMask; + binAttr.size = sizeof(m_localPlayerJoinMask); + + reqParam.roomId = m_room; + reqParam.memberId = m_localMemberId; + reqParam.roomMemberBinAttrInternalNum = 1; + reqParam.roomMemberBinAttrInternal = &binAttr; + + int ret = sceNpMatching2SetRoomMemberDataInternal( m_matchingContext, &reqParam, NULL, &m_setRoomMemberInternalDataRequestId ); + + if( ( ret < 0 ) || ForceErrorPoint(SNM_FORCE_ERROR_SET_ROOM_MEMBER_DATA_INTERNAL2) ) + { + return false; + } + + RemoveNetworkPlayers( mask ); + + return true; + } +} + + +extern uint8_t *mallocAndCreateUTF8ArrayFromString(int iID); + +// Bring up a Gui to send an invite so a player that the user can select. This invite will contain the room Id so that +void SQRNetworkManager_Vita::SendInviteGUI() +{ + if(ProfileManager.IsSystemUIDisplayed()) + { + app.DebugPrintf("SendInviteGUI failed, SysUI is already up \n"); + return; + } + + //Set invitation information - this is now exactly the same as the presence information that we synchronise out. + + // If we joined a game, we'll have already set s_lastPresenceSyncInfo up (whether we came in from an invite, or joining a game we discovered). If we were hosting, + // then we'll need to set this up now from the external dasta. + if( m_isHosting ) + { + CPlatformNetworkManagerSony::SetSQRPresenceInfoFromExtData(&s_lastPresenceSyncInfo, m_joinExtData, m_room, m_serverId); + } + + sce::Toolkit::NP::MessageData messData; + memset(&messData,0,sizeof(messData)); + + char *subject = (char*)mallocAndCreateUTF8ArrayFromString(IDS_INVITATION_SUBJECT_MAX_18_CHARS); + char *body = (char*)mallocAndCreateUTF8ArrayFromString(IDS_INVITATION_BODY); + messData.attachment = (SceChar8*)&s_lastPresenceSyncInfo;; + messData.attachmentSize = sizeof(PresenceSyncInfo); + messData.body.assign(body); + messData.iconPath.assign(SESSION_IMAGE_PATH); + messData.expireMinutes = 0; + + int ret = sce::Toolkit::NP::Messaging::Interface::sendMessage(&messData, SCE_TOOLKIT_NP_MESSAGE_TYPE_CUSTOM_DATA); + if(ret < SCE_TOOLKIT_NP_SUCCESS ) + { + app.DebugPrintf("Send Message failed 0x%x ...\n",ret); + assert(0); + return; + } + else + { + m_bSendingInviteMessage = true; + ProfileManager.SetSysUIShowing( true ); + } +} + + +void SQRNetworkManager_Vita::RecvInviteGUI() +{ + if(ProfileManager.IsSystemUIDisplayed()) + { + app.DebugPrintf("RecvInviteGUI failed, SysUI is already up \n"); + return; + } + + int ret = sce::Toolkit::NP::Messaging::Interface::displayReceivedMessages(SCE_TOOLKIT_NP_MESSAGE_TYPE_CUSTOM_DATA); + if(ret < SCE_TOOLKIT_NP_SUCCESS ) + { + app.DebugPrintf("displayReceivedMessages 0x%x ...\n",ret); + assert(0); + return; + } + else + { + ProfileManager.SetSysUIShowing( true ); + } + + + // int ret = sceGameCustomDataDialogInitialize(); + // if(ret != SCE_OK) + // { + // app.DebugPrintf("sceGameCustomDataDialogInitialize() failed. ret = 0x%x\n", ret); + // } + // else + // { + // + // SceGameCustomDataDialogParam dialogParam; + // SceGameCustomDataDialogDataParam dataParam; + // + // sceGameCustomDataDialogParamInit( &dialogParam ); + // memset( &dataParam, 0x00, sizeof( SceGameCustomDataDialogDataParam ) ); + // dialogParam.mode = SCE_GAME_CUSTOM_DATA_DIALOG_MODE_RECV; + // dialogParam.dataParam = &dataParam; + // dialogParam.userId = ProfileManager.getUserID(ProfileManager.GetPrimaryPad()); + // ret = sceGameCustomDataDialogOpen( &dialogParam ); + // + // if( SCE_OK != ret ) + // { + // app.DebugPrintf("sceGameCustomDataDialogOpen() failed. ret = 0x%x\n", ret); + // } + // else + // { + // b_inviteRecvGUIRunning = true; + // } + // } +} + + +void SQRNetworkManager_Vita::TickInviteGUI() +{ + PSVITA_STUBBED; + // if(b_inviteRecvGUIRunning) + // { + // SceCommonDialogStatus status = sceGameCustomDataDialogUpdateStatus(); + // + // if( SCE_COMMON_DIALOG_STATUS_FINISHED == status ) + // { + // SceGameCustomDataDialogOnlineIdList sentOnlineIdList; + // memset( &sentOnlineIdList, 0x0, sizeof(SceGameCustomDataDialogOnlineIdList)); + // SceGameCustomDataDialogResult dialogResult; + // memset( &dialogResult, 0x0, sizeof(SceGameCustomDataDialogResult) ); + // dialogResult.sentOnlineIds = &sentOnlineIdList; + // + // int32_t ret = sceGameCustomDataDialogGetResult( &dialogResult ); + // + // if( SCE_OK != ret ) + // { + // app.DebugPrintf( "***** sceGameCustomDataDialogGetResult error:0x%x\n", ret); + // } + // sceGameCustomDataDialogClose(); + // sceGameCustomDataDialogTerminate(); + // b_inviteRecvGUIRunning = false; + // } + // } +} + +// Get the data for an invite into a statically allocated array of invites, and pass a pointer of this back up to the game. Elements in the array are used in a circular fashion, to save any issues with handling freeing of this invite data as the +// qnet equivalent of this seems to just assume that the data persists forever. +void SQRNetworkManager_Vita::GetInviteDataAndProcess(sce::Toolkit::NP::MessageAttachment* pInvite) +{ + + app.DebugPrintf("GameCustomData attachment size : %d\n", pInvite->getAttachmentSize()); + if(pInvite->getAttachmentSize() == sizeof(m_gameBootInvite_data)) + { + memcpy(&m_gameBootInvite_data, pInvite->getAttachmentData(), sizeof(m_gameBootInvite_data)); + m_gameBootInvite = &m_gameBootInvite_data; + } +} + +void SQRNetworkManager_Vita::GetJoinablePresenceDataAndProcess(SceAppUtilNpBasicJoinablePresenceParam* pJoinablePresenceData) +{ + memcpy(&m_joinablePresenceParam, pJoinablePresenceData, sizeof(SceAppUtilNpBasicJoinablePresenceParam)); + if(s_safeToRespondToGameBootInvite && ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad())) + { + ProcessJoinablePresenceData(); + } + else + { + m_bJoinablePresenceWaitingForOnline = true; + } +} + +void SQRNetworkManager_Vita::ProcessJoinablePresenceData() +{ + static SceNpBasicGamePresence presenceDetails; + int ret = sceNpBasicGetGamePresenceOfFriend(&m_joinablePresenceParam.npId, &presenceDetails); + if( ret == 0 ) + { + PresenceSyncInfo *pso = (PresenceSyncInfo *)presenceDetails.inGamePresence.data; + memcpy(&m_gameBootInvite_data, pso, sizeof(m_gameBootInvite_data)); + m_gameBootInvite = &m_gameBootInvite_data; + } + m_bJoinablePresenceWaitingForOnline = false; +} + + + + +// This case happens when we were in the main menus when we got an invite, and weren't signed in... now can proceed with the normal flow of code for this situation +// The pair of methods MustSignInReturned_1 & PSNSignInReturned_1 handle this +int MustSignInReturnedPresenceInvite(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + if(result==C4JStorage::EMessage_ResultAccept) + { + SQRNetworkManager_Vita::AttemptPSNSignIn(&SQRNetworkManager_Vita::PSNSignInReturnedPresenceInvite, pParam,true); + } + return 0; +} + +int SQRNetworkManager_Vita::PSNSignInReturnedPresenceInvite(void* pParam, bool bContinue, int iPad) +{ + INVITE_INFO *inviteInfo = (INVITE_INFO *)pParam; + + // If the invite data isn't set up yet (indicated by it being all zeroes, easiest detected via the net version), then try and get it again... this can happen if we got + // the invite whilst signed out + + if( bContinue ) + { + m_bJoinablePresenceWaitingForOnline = true; + } + return 0; +} + + + +void SQRNetworkManager_Vita::TickJoinablePresenceData() +{ + if(s_safeToRespondToGameBootInvite && m_bJoinablePresenceWaitingForOnline) + { + if(ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad())) + ProcessJoinablePresenceData(); + else + { + m_bJoinablePresenceWaitingForOnline = false; // will be set to true again if we sign in succesfully + // 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.RequestAlertMessage( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad(), &MustSignInReturnedPresenceInvite, NULL); + } + + } + + } +} + +bool SQRNetworkManager_Vita::UpdateInviteData(SQRNetworkManager_Vita::PresenceSyncInfo *invite) +{ + PSVITA_STUBBED; + return false; + + // size_t dataSize = sizeof(SQRNetworkManager_Vita::PresenceSyncInfo); + // int ret = sceNpBasicRecvMessageAttachmentLoad(s_lastInviteIdToRetry, invite, &dataSize); + // return (ret == 0); +} + +// This method is a helper used in MapRoomSlotPlayers - tries to find a player that matches: +// (1) the playerType +// (2) if playerType is remote, memberId +// (3) localPlayerIdx +// The reason we don't care about memberid when the player isn't remote is that it doesn't matter (since we know the player is either on this machine, or it is the host and there's only one of those), +// and there's a period when starting up the host game where it doesn't accurately know the memberId for its own local players +void SQRNetworkManager_Vita::FindOrCreateNonNetworkPlayer(int slot, int playerType, SceNpMatching2RoomMemberId memberId, int localPlayerIdx, int smallId) +{ + for(AUTO_VAR(it, m_vecTempPlayers.begin()); it != m_vecTempPlayers.end(); it++ ) + { + if( ((*it)->m_type == playerType ) && ( (*it)->m_localPlayerIdx == localPlayerIdx ) ) + { + if( ( playerType != SQRNetworkPlayer::SNP_TYPE_REMOTE ) || ( (*it)->m_roomMemberId == memberId ) ) + { + SQRNetworkPlayer *player = *it; + m_vecTempPlayers.erase(it); + m_aRoomSlotPlayers[ slot ] = player; + return; + } + } + } + // Create the player - non-network players can be considered complete as soon as we create them as we aren't waiting on their network connections becoming complete, so can flag them as such and notify via callback + PlayerUID *pUID = NULL; + PlayerUID localUID; + if( ( playerType == SQRNetworkPlayer::SNP_TYPE_LOCAL ) || + m_isHosting && ( playerType == SQRNetworkPlayer::SNP_TYPE_HOST ) ) + { + // Local players can establish their UID at this point + ProfileManager.GetXUID(localPlayerIdx,&localUID,true); + pUID = &localUID; + } + SQRNetworkPlayer *player = new SQRNetworkPlayer(this, (SQRNetworkPlayer::eSQRNetworkPlayerType)playerType, m_isHosting, memberId, localPlayerIdx, 0, pUID ); + // For offline games, set name directly from gamertag as the PlayerUID will be full of zeroes. + if( m_offlineGame ) + { + player->SetName(ProfileManager.GetGamertag(localPlayerIdx)); + } + NonNetworkPlayerComplete( player, smallId); + m_aRoomSlotPlayers[ slot ] = player; + HandlePlayerJoined( player ); +} + +// For data sending on the local machine, used to send between host and localplayers on the host +void SQRNetworkManager_Vita::LocalDataSend(SQRNetworkPlayer *playerFrom, SQRNetworkPlayer *playerTo, const void *data, unsigned int dataSize) +{ + assert(m_isHosting); + if(m_listener) + { + m_listener->HandleDataReceived( playerFrom, playerTo, (unsigned char *)data, dataSize ); + } +} + +int SQRNetworkManager_Vita::GetSessionIndex(SQRNetworkPlayer *player) +{ + int roomSlotPlayerCount = m_roomSyncData.getPlayerCount(); + for( int i = 0; i < roomSlotPlayerCount; i++ ) + { + if( m_aRoomSlotPlayers[i] == player ) return i; + } + return 0; +} + +// Updates m_aRoomSlotPlayers, based on what is in m_roomSyncData. This needs to be updated when room members join & leave, and when any SQRNetworkPlayer is created externally that this should be mapping to +void SQRNetworkManager_Vita::MapRoomSlotPlayers(int roomSlotPlayerCount/*=-1*/) +{ + EnterCriticalSection(&m_csRoomSyncData); + + // If we pass an explicit roomSlotPlayerCount, it is because we are removing a player, and this is the count of slots that there were *before* the removal. + bool zeroLastSlot = false; + if( roomSlotPlayerCount == -1 ) + { + roomSlotPlayerCount = m_roomSyncData.getPlayerCount(); + } + else + { + zeroLastSlot = true; + } + + if( m_isHosting ) + { + for( int i = 0; i < roomSlotPlayerCount; i++ ) + { + if( m_aRoomSlotPlayers[i] ) + { + // On host, remote players are created and destroyed by the Rudp connections being established and removed, so don't go deleting them here. Other types are managed by this mapping. + // Note that m_vecTempPlayers is used as a pool of players to consider by FindOrCreateNonNetworkPlayer + if( m_aRoomSlotPlayers[i]->m_type != SQRNetworkPlayer::SNP_TYPE_REMOTE ) + { + m_vecTempPlayers.push_back(m_aRoomSlotPlayers[i]); + m_aRoomSlotPlayers[i] = NULL; + } + } + } + for( int i = 0; i < m_roomSyncData.getPlayerCount(); i++ ) + { + if( i == 0 ) + { + // Special case - slot 0 is always the host + FindOrCreateNonNetworkPlayer( i, SQRNetworkPlayer::SNP_TYPE_HOST, m_roomSyncData.players[i].m_roomMemberId, m_roomSyncData.players[i].m_localIdx, m_roomSyncData.players[i].m_smallId); + m_roomSyncData.players[i].m_UID = m_aRoomSlotPlayers[i]->GetUID(); // On host, UIDs flow from player data -> m_roomSyncData + } + else + { + if( m_roomSyncData.players[i].m_roomMemberId == m_localMemberId ) + { + FindOrCreateNonNetworkPlayer( i, SQRNetworkPlayer::SNP_TYPE_LOCAL, m_roomSyncData.players[i].m_roomMemberId, m_roomSyncData.players[i].m_localIdx, m_roomSyncData.players[i].m_smallId); + m_roomSyncData.players[i].m_UID = m_aRoomSlotPlayers[i]->GetUID(); // On host, UIDs flow from player data -> m_roomSyncData + } + else + { + m_aRoomSlotPlayers[i] = GetPlayerFromRoomMemberAndLocalIdx( m_roomSyncData.players[i].m_roomMemberId, m_roomSyncData.players[i].m_localIdx ); + // If we're the host, then we allocated the small id so can flag now if we've got a player to flag... + if( m_aRoomSlotPlayers[i] ) + { + NetworkPlayerSmallIdAllocated(m_aRoomSlotPlayers[i], m_roomSyncData.players[i].m_smallId); + } + } + } + } + + if( zeroLastSlot ) + { + if( roomSlotPlayerCount ) + { + m_aRoomSlotPlayers[ roomSlotPlayerCount - 1 ] = 0; + } + } + + // Also update the externally visible room data for the current slots + if (m_listener ) + { + m_listener->HandleResyncPlayerRequest(m_aRoomSlotPlayers); + } + } + else + { + for( int i = 0; i < m_roomSyncData.getPlayerCount(); i++ ) + { + if( m_aRoomSlotPlayers[i] ) + { + // On clients, local players are created and destroyed by the Rudp connections being established and removed, so don't go deleting them here. Other types are managed by this mapping. + // Note that m_vecTempPlayers is used as a pool of players to consider by FindOrCreateNonNetworkPlayer + if( m_aRoomSlotPlayers[i]->m_type != SQRNetworkPlayer::SNP_TYPE_LOCAL ) + { + m_vecTempPlayers.push_back(m_aRoomSlotPlayers[i]); + m_aRoomSlotPlayers[i] = NULL; + } + } + } + for( int i = 0; i < m_roomSyncData.getPlayerCount(); i++ ) + { + if( i == 0 ) + { + // Special case - slot 0 is always the host + FindOrCreateNonNetworkPlayer( i, SQRNetworkPlayer::SNP_TYPE_HOST, m_roomSyncData.players[i].m_roomMemberId, m_roomSyncData.players[i].m_localIdx, m_roomSyncData.players[i].m_smallId); + m_aRoomSlotPlayers[i]->SetUID(m_roomSyncData.players[i].m_UID); // On client, UIDs flow from m_roomSyncData->player data + } + else + { + if( m_roomSyncData.players[i].m_roomMemberId == m_localMemberId ) + { + // This player is local to this machine - don't bother setting UID from sync data, as it will already have been set accurately when we (locally) made this player + m_aRoomSlotPlayers[i] = GetPlayerFromRoomMemberAndLocalIdx( m_roomSyncData.players[i].m_roomMemberId, m_roomSyncData.players[i].m_localIdx ); + // If we've got the room sync data back from the server, then we've got our smallId. Set flag for this. + if( m_aRoomSlotPlayers[i] ) + { + NetworkPlayerSmallIdAllocated(m_aRoomSlotPlayers[i], m_roomSyncData.players[i].m_smallId); + } + } + else + { + FindOrCreateNonNetworkPlayer( i, SQRNetworkPlayer::SNP_TYPE_REMOTE, m_roomSyncData.players[i].m_roomMemberId, m_roomSyncData.players[i].m_localIdx, m_roomSyncData.players[i].m_smallId); + m_aRoomSlotPlayers[i]->SetUID(m_roomSyncData.players[i].m_UID); // On client, UIDs flow from m_roomSyncData->player data + } + } + } + } + // Clear up any non-network players that are no longer required - this would be a good point to notify of players leaving when we support that + // FindOrCreateNonNetworkPlayer will have pulled any players that we Do need out of m_vecTempPlayers, so the ones that are remaining are no longer in the game + for(AUTO_VAR(it, m_vecTempPlayers.begin()); it != m_vecTempPlayers.end(); it++ ) + { + if( m_listener ) + { + m_listener->HandlePlayerLeaving(*it); + } + delete (*it); + } + m_vecTempPlayers.clear(); + + LeaveCriticalSection(&m_csRoomSyncData); +} + +// On host, update the room sync data with UIDs that are in the players +void SQRNetworkManager_Vita::UpdateRoomSyncUIDsFromPlayers() +{ + EnterCriticalSection(&m_csRoomSyncData); + if( m_isHosting ) + { + for( int i = 0; i < m_roomSyncData.getPlayerCount(); i++ ) + { + if( m_aRoomSlotPlayers[i] ) + { + m_roomSyncData.players[i].m_UID = m_aRoomSlotPlayers[i]->GetUID(); + } + } + } + + LeaveCriticalSection(&m_csRoomSyncData); +} + +// On the client, move UIDs from the room sync data out to the players. +void SQRNetworkManager_Vita::UpdatePlayersFromRoomSyncUIDs() +{ + EnterCriticalSection(&m_csRoomSyncData); + for( int i = 0; i < m_roomSyncData.getPlayerCount(); i++ ) + { + if( m_aRoomSlotPlayers[i] ) + { + if( i == 0 ) + { + // Special case - slot 0 is always the host + m_aRoomSlotPlayers[i]->SetUID(m_roomSyncData.players[i].m_UID); + } + else + { + // Don't sync local players as we already set those up with their UID in the first place... + if( m_roomSyncData.players[i].m_roomMemberId != m_localMemberId ) + { + m_aRoomSlotPlayers[i]->SetUID(m_roomSyncData.players[i].m_UID); + } + } + } + } + LeaveCriticalSection(&m_csRoomSyncData); +} + +// Host only - add remote players to our internal storage of player slots, and synchronise this with other room members. +bool SQRNetworkManager_Vita::AddRemotePlayersAndSync( SceNpMatching2RoomMemberId memberId, int playerMask, bool *isFull/*==NULL*/ ) +{ + assert( m_isHosting ); + + EnterCriticalSection(&m_csRoomSyncData); + + // Establish whether we have enough room to add the players + int addCount = 0; + for( int i = 0; i < MAX_LOCAL_PLAYERS; i++ ) + { + if( playerMask & ( 1 << i ) ) + { + addCount++; + } + } + + if( ( m_roomSyncData.getPlayerCount() + addCount ) > MAX_ONLINE_PLAYER_COUNT ) + { + if( isFull ) + { + *isFull = true; + } + LeaveCriticalSection(&m_csRoomSyncData); + return false; + } + + // We want to keep all players from a particular machine together, so search through the room sync data to see if we can find + // any pre-existing players from this machine. + int firstIdx = -1; + for( int i = 0; i < m_roomSyncData.getPlayerCount(); i++ ) + { + if( m_roomSyncData.players[i].m_roomMemberId == memberId ) + { + firstIdx = i; + break; + } + } + + // We'll just be inserting at the end unless we've got a pre-existing player to insert after. Even then there might be no following + // players. + int insertIdx = m_roomSyncData.getPlayerCount(); + if( firstIdx > -1 ) + { + for( int i = firstIdx; i < m_roomSyncData.getPlayerCount(); i++ ) + { + if( m_roomSyncData.players[i].m_roomMemberId != memberId ) + { + insertIdx = i; + break; + } + } + } + + // Add all remote players determined from the player mask to our own slots of active players + for( int i = 0; i < MAX_LOCAL_PLAYER_COUNT; i++ ) + { + if( playerMask & ( 1 << i ) ) + { + // Shift any following players along... + for( int j = m_roomSyncData.getPlayerCount(); j > insertIdx; j-- ) + { + m_roomSyncData.players[j] = m_roomSyncData.players[j-1]; + } + PlayerSyncData *player = &m_roomSyncData.players[ insertIdx ]; + player->m_smallId = m_currentSmallId++; + player->m_roomMemberId = memberId; + player->m_localIdx = i; + m_roomSyncData.setPlayerCount(m_roomSyncData.getPlayerCount()+1); + insertIdx++; + } + } + + // Update mapping from the room slot players to SQRNetworkPlayer instances + MapRoomSlotPlayers(); + + // And then synchronise this out to all other machines + SyncRoomData(); + + LeaveCriticalSection(&m_csRoomSyncData); + + return true; +} + +// Host only - remove all remote players belonging to the supplied memberId, and in the supplied mask, and synchronise this with other room members +void SQRNetworkManager_Vita::RemoveRemotePlayersAndSync( SceNpMatching2RoomMemberId memberId, int mask ) +{ + assert( m_isHosting ); + EnterCriticalSection(&m_csRoomSyncData); + + // Remove any applicable players, keeping remaining players in order + for( int i = 0; i < m_roomSyncData.getPlayerCount(); ) + { + if( ( m_roomSyncData.players[ i ].m_roomMemberId == memberId ) && ( ( 1 << m_roomSyncData.players[ i ].m_localIdx ) & mask ) ) + { + SQRNetworkPlayer *player = GetPlayerFromRoomMemberAndLocalIdx( memberId, m_roomSyncData.players[ i ].m_localIdx ); + if( player ) + { + // Get Rudp context for this player, close that context down ( which will in turn close the socket if required) + int ctx = player->m_rudpCtx; + int err = sceRudpTerminate( ctx ); + assert(err == SCE_OK); + if( m_listener ) + { + m_listener->HandlePlayerLeaving(player); + } + // Delete the player itself and the mapping from context to player map as this context is no longer valid + delete player; + m_RudpCtxToPlayerMap.erase(ctx); + + removePlayerFromVoiceChat(player); + } + m_roomSyncData.setPlayerCount(m_roomSyncData.getPlayerCount()-1); + // Shuffled entries up into the space that we have just created + for( int j = i ; j < m_roomSyncData.getPlayerCount(); j++ ) + { + m_roomSyncData.players[j] = m_roomSyncData.players[j + 1]; + m_aRoomSlotPlayers[j] = m_aRoomSlotPlayers[j + 1]; + } + // Zero last element, that isn't part of the currently sized array anymore + memset(&m_roomSyncData.players[m_roomSyncData.getPlayerCount()],0,sizeof(PlayerSyncData)); + m_aRoomSlotPlayers[m_roomSyncData.getPlayerCount()] = NULL; + } + else + { + i++; + } + } + LeaveCriticalSection(&m_csRoomSyncData); + + // Update mapping from the room slot players to SQRNetworkPlayer instances + MapRoomSlotPlayers(); + + + // And then synchronise this out to all other machines + SyncRoomData(); + + // if(GetOnlinePlayerCount() == 0) + // SonyVoiceChat::shutdown(); +} + +// Client only - remove all network players matching the supplied mask +void SQRNetworkManager_Vita::RemoveNetworkPlayers( int mask ) +{ + assert( !m_isHosting ); + + for(AUTO_VAR(it, m_RudpCtxToPlayerMap.begin()); it != m_RudpCtxToPlayerMap.end(); ) + { + SQRNetworkPlayer *player = it->second; + if( (player->m_roomMemberId == m_localMemberId ) && ( ( 1 << player->m_localPlayerIdx ) & mask ) ) + { + // Get Rudp context for this player, close that context down ( which will in turn close the socket if required) + int ctx = it->first; + int err = sceRudpTerminate( ctx ); + assert(err == SCE_OK); + if( m_listener ) + { + m_listener->HandlePlayerLeaving(player); + } + // Delete any reference to this player from the player mappings + for( int i = 0; i < MAX_ONLINE_PLAYER_COUNT; i++ ) + { + if( m_aRoomSlotPlayers[i] == player ) + { + m_aRoomSlotPlayers[i] = NULL; + } + } + // And delete the reference from the ctx->player map + it = m_RudpCtxToPlayerMap.erase(it); + + removePlayerFromVoiceChat(player); + + // Delete the player itself and the mapping from context to player map as this context is no longer valid + delete player; + } + else + { + it++; + } + } + assert(m_RudpCtxToPlayerMap.size() == 0); +} + +// Host only - update the memberId of the local players, and synchronise with other room members +void SQRNetworkManager_Vita::SetLocalPlayersAndSync() +{ + assert( m_isHosting ); + for( int i = 0; i < m_localPlayerCount; i++ ) + { + m_roomSyncData.players[i].m_roomMemberId = m_localMemberId; + } + + // Update mapping from the room slot players to SQRNetworkPlayer instances + MapRoomSlotPlayers(); + + // And then synchronise this out to all other machines + SyncRoomData(); + +} + +// Host only - sync the room data with other machines +void SQRNetworkManager_Vita::SyncRoomData() +{ + if( m_offlineGame ) return; + + UpdateRoomSyncUIDsFromPlayers(); + + SceNpMatching2SetRoomDataInternalRequest reqParam; + memset( &reqParam, 0, sizeof(reqParam) ); + reqParam.roomId = m_room; + SceNpMatching2BinAttr roomBinAttr; + memset(&roomBinAttr, 0, sizeof(roomBinAttr)); + roomBinAttr.id = SCE_NP_MATCHING2_ROOM_BIN_ATTR_INTERNAL_1_ID; + roomBinAttr.ptr = &m_roomSyncData; + roomBinAttr.size = sizeof( m_roomSyncData ); + reqParam.roomBinAttrInternalNum = 1; + reqParam.roomBinAttrInternal = &roomBinAttr; + sceNpMatching2SetRoomDataInternal ( m_matchingContext, &reqParam, NULL, &m_setRoomDataRequestId ); +} + +// Check if the matching context is valid, and if not attempt to create one. If to do this requires starting an asynchronous process, then sets the internal state to the state passed in +// before doing this. +// Returns true on success. +bool SQRNetworkManager_Vita::GetMatchingContext(eSQRNetworkManagerInternalState asyncState) +{ + if( m_matchingContextValid ) return true; + + int ret = 0; + if( !m_matching2initialised) + { + app.DebugPrintf("sceNpMatching2Init\n"); + ret = sceNpMatching2Init(0, 0, SCE_KERNEL_THREAD_CPU_AFFINITY_MASK_DEFAULT, 0); + } + if( ret < 0 ) + { + app.DebugPrintf("SQRNetworkManager::GetMatchingContext - sceNpMatching2Init2 failed with code 0x%08x\n", ret); + return false; + } + m_matching2initialised = true; + + // Get NP ID of the signed-in user + SceNpId npId; + app.DebugPrintf("GetSceNpId\n"); + + /*ret = */ProfileManager.GetSceNpId(ProfileManager.GetPrimaryPad(), &npId); + + + // Create context + app.DebugPrintf("sceNpMatching2CreateContext\n"); + ret = sceNpMatching2CreateContext(&npId, &s_npCommunicationId, &s_npCommunicationPassphrase, &m_matchingContext/*, option*/); + //ret = sceNpMatching2CreateContext(&npId, NULL,NULL, &m_matchingContext/*, option*/); + if( ret < 0 ) + { + app.DebugPrintf("SQRNetworkManager::GetMatchingContext - sceNpMatching2CreateContext failed with code 0x%08x\n", ret); + return false; + } + if( ret < 0 ) return false; + + app.DebugPrintf("RegisterCallbacks\n"); + if( !RegisterCallbacks() ) + { + app.DebugPrintf("SQRNetworkManager::GetMatchingContext - RegisterCallbacks failed\n"); + return false; + } + + // Set internal state & kick off async process that will actually start the context. + SetState(asyncState); + app.DebugPrintf("sceNpMatching2ContextStart\n"); + ret = sceNpMatching2ContextStart(m_matchingContext, (10*1000*1000)); + if( ret < 0 ) + { + // Put state back so that the caller isn't expecting a callback from sceNpMatching2ContextStartAsync completing to happen + SetState(SNM_INT_STATE_IDLE); + app.DebugPrintf("SQRNetworkManager::GetMatchingContext - sceNpMatching2ContextStartAsync failed with code 0x%08x\n", ret); + return false; + } + + app.DebugPrintf("SQRNetworkManager::GetMatchingContext - matching context is now valid\n"); + m_matchingContextValid = true; + return true; +} + +// Starts the process of obtaining a server context. This is an asynchronous operation, at the end of which (if successful), we'll be creating +// a room. General procedure followed here is as suggested by Sony - we get a list of servers, then pick a random one, and see if it is available. +// If not we just cycle round trying other random ones until we either find an available one or fail. +bool SQRNetworkManager_Vita::GetServerContext() +{ + assert(m_state == SNM_INT_STATE_IDLE); + assert(m_serverContextValid == false); + + // Check that the matching context is valid & recreate if necessary + if( !GetMatchingContext(SNM_INT_STATE_HOSTING_STARTING_MATCHING_CONTEXT) ) return false; + // If this caused an async thing to be started up, then we've done as much as we can here - the rest of the code will happen when the async matching 2 context starting completes + // ( event SCE_NP_MATCHING2_CONTEXT_EVENT_Start is received ) + if( m_state == SNM_INT_STATE_HOSTING_STARTING_MATCHING_CONTEXT ) return true; + + return GetServerContext2(); +} + +// Code split out from previous method, so we can also call from creating matching context if required +bool SQRNetworkManager_Vita::GetServerContext2() +{ + + m_aServerId = (SceNpMatching2ServerId *)realloc( m_aServerId, sizeof(SceNpMatching2ServerId) * 1 ); + SceNpMatching2Server server; + app.DebugPrintf("sceNpMatching2GetServerLocal\n"); + int err = sceNpMatching2GetServerLocal(m_matchingContext, &server); + assert(server.status == SCE_NP_MATCHING2_SERVER_STATUS_AVAILABLE); + *m_aServerId = server.serverId; + if(err != SCE_OK) + { + m_serverCount = 0; + assert(0); + } + m_serverCount = 1; + + SetState(SNM_INT_STATE_HOSTING_SEARCHING_FOR_SERVER); + return SelectRandomServer(); +} + +// Overloaded method for (as before) obtaining a server context. This version is so that can also get a server context for a specific server rather than a random one, +// 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); + + // Check that the matching context is valid & recreate if necessary + if( !GetMatchingContext(SNM_INT_STATE_JOINING_STARTING_MATCHING_CONTEXT) ) + { + app.DebugPrintf("SQRNetworkManager::GetServerContext - Failed due to no matching context\n"); + return false; + } + + // 4J Stu - If this state is set, then we have successfully created a new context but it won't have started yet + // Therefore the sceNpMatching2GetServerIdListLocal call will fail. If we just skip this check everything should be good. + // if( m_state != SNM_INT_STATE_JOINING_STARTING_MATCHING_CONTEXT ) + // { + // // Get list of server IDs of servers allocated to the application. We don't actually need to do this, but it is as good a way as any to try a matching2 service and check that + // // the context *really* is valid. + // int serverCount = sceNpMatching2GetServerIdListLocal( m_matchingContext, NULL, 0 ); + // // If an error is returned here, we need to destroy and recerate our server - if this goes ok we should come back through this path again + // if( ( serverCount == SCE_NP_MATCHING2_ERROR_CONTEXT_UNAVAILABLE ) || // This error has been seen (occasionally) in a normal working environment + // ( serverCount == SCE_NP_MATCHING2_ERROR_CONTEXT_NOT_STARTED ) ) // Also checking for this as a means of simulating the previous error + // { + // sceNpMatching2DestroyContext(m_matchingContext); + // m_matchingContextValid = false; + // if( !GetMatchingContext(SNM_INT_STATE_JOINING_STARTING_MATCHING_CONTEXT) ) return false; + // } + // } + m_serverCount = 1; + m_totalServerCount = m_serverCount; + m_aServerId = (SceNpMatching2ServerId *)realloc(m_aServerId, sizeof(SceNpMatching2ServerId) * m_serverCount ); + m_aServerId[0] = serverId; + + // If one of the previous GetMatchingContext calls caused an async thing to be started up, then we've done as much as we can here - the rest of the code will happen when the async matching 2 context starting completes + // ( event SCE_NP_MATCHING2_CONTEXT_EVENT_Start is received ) + if( m_state == SNM_INT_STATE_JOINING_STARTING_MATCHING_CONTEXT ) return true; + + SetState(SNM_INT_STATE_JOINING_SEARCHING_FOR_SERVER); + return SelectRandomServer(); +} + +// Tick to update the search for a server which is available, for the creation of a server context. +void SQRNetworkManager_Vita::ServerContextTick() +{ + switch( m_state ) + { + case SNM_INT_STATE_HOSTING_SEARCHING_FOR_SERVER: + case SNM_INT_STATE_JOINING_SEARCHING_FOR_SERVER: + break; + case SNM_INT_STATE_HOSTING_SERVER_SEARCH_SERVER_ERROR: + case SNM_INT_STATE_JOINING_SERVER_SEARCH_SERVER_ERROR: + // Attempt to keep searching if a single server failed + SetState((m_state==SNM_INT_STATE_HOSTING_SERVER_SEARCH_SERVER_ERROR)?SNM_INT_STATE_HOSTING_SEARCHING_FOR_SERVER:SNM_INT_STATE_JOINING_SEARCHING_FOR_SERVER); + if(!SelectRandomServer()) + { + SetState((m_state==SNM_INT_STATE_HOSTING_SERVER_SEARCH_SERVER_ERROR)?SNM_INT_STATE_HOSTING_SERVER_SEARCH_FAILED:SNM_INT_STATE_JOINING_SERVER_SEARCH_FAILED); + } + break; + case SNM_INT_STATE_HOSTING_SERVER_FOUND: + m_serverContextValid = true; + ServerContextValid_CreateRoom(); + break; + + case SNM_INT_STATE_JOINING_SERVER_FOUND: + m_serverContextValid = true; + ServerContextValid_JoinRoom(); + break; + default: + break; + } +} + +// Tick the process of creating a room. +void SQRNetworkManager_Vita::RoomCreateTick() +{ + switch( m_state ) + { + case SNM_INT_STATE_HOSTING_CREATE_ROOM_SEARCHING_FOR_WORLD: + break; + case SNM_INT_STATE_HOSTING_CREATE_ROOM_WORLD_FOUND: + { + SceNpMatching2CreateJoinRoomRequest reqParam; + SceNpMatching2SignalingOptParam optSignalingParam; + SceNpMatching2BinAttr roomBinAttrExt; + SceNpMatching2BinAttr roomBinAttr; + memset(&reqParam, 0, sizeof(reqParam)); + memset(&optSignalingParam, 0, sizeof( optSignalingParam) ); + memset(&roomBinAttr, 0, sizeof(roomBinAttr)); + memset(&roomBinAttrExt, 0, sizeof(roomBinAttrExt)); + + reqParam.worldId = m_worldId; + reqParam.flagAttr = SCE_NP_MATCHING2_ROOM_FLAG_ATTR_NAT_TYPE_RESTRICTION; + reqParam.sigOptParam = &optSignalingParam; + reqParam.maxSlot = MAX_ONLINE_PLAYER_COUNT; + + reqParam.roomBinAttrInternalNum = 1; + reqParam.roomBinAttrInternal = &roomBinAttr; + reqParam.roomBinAttrExternalNum = 1; + reqParam.roomBinAttrExternal = &roomBinAttrExt; + + roomBinAttr.id = SCE_NP_MATCHING2_ROOM_BIN_ATTR_INTERNAL_1_ID; + roomBinAttr.ptr = &m_roomSyncData; + roomBinAttr.size = sizeof( m_roomSyncData ); + + roomBinAttrExt.id = SCE_NP_MATCHING2_ROOM_BIN_ATTR_EXTERNAL_1_ID; + roomBinAttrExt.ptr = m_joinExtData; + roomBinAttrExt.size = m_joinExtDataSize; + + optSignalingParam.type = SCE_NP_MATCHING2_SIGNALING_TYPE_MESH; + optSignalingParam.hubMemberId = 0; // Room owner is the hub of the star + SetState(SNM_INT_STATE_HOSTING_CREATE_ROOM_CREATING_ROOM); + app.DebugPrintf(CMinecraftApp::USER_RR,">> Creating room start\n"); + s_roomStartTime = System::currentTimeMillis(); + app.DebugPrintf("sceNpMatching2CreateJoinRoom\n"); + int ret = sceNpMatching2CreateJoinRoom( m_matchingContext, &reqParam, NULL, &m_createRoomRequestId ); + if ( ( ret < 0 ) || ForceErrorPoint(SNM_FORCE_ERROR_CREATE_JOIN_ROOM) ) + { + SetState(SNM_INT_STATE_HOSTING_CREATE_ROOM_FAILED); + } + } + break; + case SNM_INT_STATE_HOSTING_CREATE_ROOM_CREATING_ROOM: + break; + case SNM_INT_STATE_HOSTING_CREATE_ROOM_SUCCESS: + SetState(SNM_INT_STATE_HOSTING_WAITING_TO_PLAY); + + // Now we know the local member id we can update our local players + SetLocalPlayersAndSync(); + break; + case SNM_INT_STATE_HOSTING_CREATE_ROOM_FAILED: + break; + default: + break; + } +} + +// For a player using the network to communicate, flag as having its connection complete. This wraps the player's own functionality, so that we can determine if this +// call is transitioning us from not ready to ready, and call a registered callback. +void SQRNetworkManager_Vita::NetworkPlayerConnectionComplete(SQRNetworkPlayer *player) +{ + EnterCriticalSection(&m_csPlayerState); + bool wasReady = player->IsReady(); + bool wasClientReady = player->HasConnectionAndSmallId(); + player->ConnectionComplete(); + bool isReady = player->IsReady(); + bool isClientReady = player->HasConnectionAndSmallId(); + if( !m_isHosting ) + { + // For clients, if we are ready (up the the point of having received our small id) then confirm to the host that this is the case, which makes us now fully ready at this end + if( ( !wasClientReady ) && ( isClientReady ) ) + { + player->ConfirmReady(); + isReady = true; + } + } + LeaveCriticalSection(&m_csPlayerState); + + if( ( !wasReady ) && ( isReady ) ) + { + HandlePlayerJoined( player ); + } +} + +// For a player using the network to communicate, set its small id, thereby flagging it as having one allocated +void SQRNetworkManager_Vita::NetworkPlayerSmallIdAllocated(SQRNetworkPlayer *player, unsigned char smallId) +{ + EnterCriticalSection(&m_csPlayerState); + bool wasReady = player->IsReady(); + bool wasClientReady = player->HasConnectionAndSmallId(); + player->SmallIdAllocated(smallId); + bool isReady = player->IsReady(); + bool isClientReady = player->HasConnectionAndSmallId(); + if( !m_isHosting ) + { + // For clients, if we are ready (up the the point of having received our small id) then confirm to the host that this is the case, which makes us now fully ready at this end + if( ( !wasClientReady ) && ( isClientReady ) ) + { + player->ConfirmReady(); + isReady = true; + } + } + LeaveCriticalSection(&m_csPlayerState); + + if( ( !wasReady ) && ( isReady ) ) + { + HandlePlayerJoined( player ); + } +} + +// On host, for a player using the network to communicate, confirm that its small id has now been received back +void SQRNetworkManager_Vita::NetworkPlayerInitialDataReceived(SQRNetworkPlayer *player, void *data) +{ + EnterCriticalSection(&m_csPlayerState); + SQRNetworkPlayer::InitSendData *ISD = (SQRNetworkPlayer::InitSendData *)data; + bool wasReady = player->IsReady(); + player->InitialDataReceived(ISD); + bool isReady = player->IsReady(); + LeaveCriticalSection(&m_csPlayerState); + // Sync room data back out as we've updated a player's UID here + SyncRoomData(); + + if( ( !wasReady ) && ( isReady ) ) + { + HandlePlayerJoined( player ); + } +} + +// For non-network players, flag that it is complete/ready, and assign its small id. We don't want to call any callbacks for these, as that can be explicitly done when local players are added. +// Also, we dynamically destroy & recreate local players quite a lot when remapping player slots which would create a lot of messages we don't want. +void SQRNetworkManager_Vita::NonNetworkPlayerComplete(SQRNetworkPlayer *player, unsigned char smallId) +{ + player->ConnectionComplete(); + player->SmallIdAllocated(smallId); +} + +void SQRNetworkManager_Vita::HandlePlayerJoined(SQRNetworkPlayer *player) +{ + if( m_listener ) + { + m_listener->HandlePlayerJoined( player ); + } + // On client, keep a count of how many local players we have told the game about. We can only transition to telling the game that we are playing once the room is set up And all the local players are valid to use. + if( !m_isHosting ) + { + if( player->IsLocal() ) + { + m_localPlayerJoined++; + } + } +} + +// Selects a random server from the current list, removes that server so it won't be searched for again, and then kick off an attempt to find out if that particular server is available. +bool SQRNetworkManager_Vita::SelectRandomServer() +{ + app.DebugPrintf("SQRNetworkManager_Vita::SelectRandomServer\n"); + + assert( (m_state == SNM_INT_STATE_HOSTING_SEARCHING_FOR_SERVER) || (m_state == SNM_INT_STATE_JOINING_SEARCHING_FOR_SERVER) ); + + if( m_serverCount == 0 ) + { + SetState((m_state == SNM_INT_STATE_HOSTING_SEARCHING_FOR_SERVER) ? SNM_INT_STATE_HOSTING_SERVER_SEARCH_FAILED : SNM_INT_STATE_JOINING_SERVER_SEARCH_FAILED); + app.DebugPrintf("SQRNetworkManager::SelectRandomServer - Server count is 0\n"); + return false; + } + + // not really selecting a random server, as we've already been allocated one, but calling this to match PS3 + int serverIdx; + serverIdx = 0; + m_serverCount--; + m_aServerId[serverIdx] = m_aServerId[m_serverCount]; + + // This server is available + SetState((m_state == SNM_INT_STATE_HOSTING_SEARCHING_FOR_SERVER) ? SNM_INT_STATE_HOSTING_SERVER_FOUND : SNM_INT_STATE_JOINING_SERVER_FOUND); + m_serverId = m_aServerId[serverIdx]; + + return true; +} + +// Delete the current server context. Should be called when finished with the current host or client game session. +void SQRNetworkManager_Vita::DeleteServerContext() +{ + // No server context on PS4, so we just set the state, and then we'll check all the UDP connections have shutdown before setting to idle + if( m_serverContextValid ) + { + m_serverContextValid = false; + SetState(SNM_INT_STATE_SERVER_DELETING_CONTEXT); + } +} + +// Creates a set of Rudp connections by the "active open" method. This requires that both ends of the connection call cellRudpInitiate to fully create a connection. We +// create one connection per local play on any remote machine. +// +// peerMemberId is the room member Id of the remote end of the connection +// playersMemberId is the room member Id that the players belong to +// ie for the host (when matching incoming connections), these will be the same thing... and for the client, peerMemberId will be the host, whereas playersMemberId will be itself + + +static std::string getIPAddressString(SceNetInAddr add) +{ + char str[32]; + unsigned char *vals = (unsigned char*)&add.s_addr; + sprintf(str, "%d.%d.%d.%d", (int)vals[0], (int)vals[1], (int)vals[2], (int)vals[3]); + return std::string(str); +} + +bool SQRNetworkManager_Vita::CreateSocket() +{ + // First get details of the UDPP2P connection that has been established + // int connStatus; + SceNetSockaddrIn sinp2pLocal;//, sinp2pPeer; + SceNpMatching2SignalingNetInfo netInfo; + + // Local end first... + memset(&sinp2pLocal, 0, sizeof(sinp2pLocal)); + memset(&netInfo, 0 , sizeof(netInfo)); + netInfo.size = sizeof(netInfo); + int ret = sceNpMatching2SignalingGetLocalNetInfo(&netInfo); + if( ret < 0 ) return false; + sinp2pLocal.sin_len = sizeof(sinp2pLocal); + sinp2pLocal.sin_family = SCE_NET_AF_INET; + sinp2pLocal.sin_port = sceNetHtons(SCE_NP_PORT); + sinp2pLocal.sin_addr = netInfo.localAddr; + + + // Set vport for both ends of connection + sinp2pLocal.sin_vport = sceNetHtons(1); + + // Create socket & bind + ret = sceNetSocket("rupdSocket", SCE_NET_AF_INET, SCE_NET_SOCK_DGRAM_P2P, 0); + assert(ret >= 0); + m_soc = ret; + int optval = 1; + ret = sceNetSetsockopt(m_soc, SCE_NET_SOL_SOCKET, SCE_NET_SO_USECRYPTO, &optval, sizeof(optval)); + if ( ( ret < 0 ) || ForceErrorPoint(SNM_FORCE_ERROR_SETSOCKOPT_0) ) return false; + ret = sceNetSetsockopt(m_soc, SCE_NET_SOL_SOCKET, SCE_NET_SO_USESIGNATURE, &optval, sizeof(optval)); + if ( ( ret < 0 ) || ForceErrorPoint(SNM_FORCE_ERROR_SETSOCKOPT_1) ) return false; + ret = sceNetSetsockopt(m_soc, SCE_NET_SOL_SOCKET, SCE_NET_SO_NBIO, &optval, sizeof(optval)); + if ( ( ret < 0 ) || ForceErrorPoint(SNM_FORCE_ERROR_SETSOCKOPT_2) ) return false; + + ret = sceNetBind(m_soc, &sinp2pLocal, sizeof(sinp2pLocal)); + if ( ( ret < 0 ) || ForceErrorPoint(SNM_FORCE_ERROR_SOCK_BIND) ) return false; + return true; + +} + + +bool SQRNetworkManager_Vita::CreateVoiceRudpConnections(SceNpMatching2RoomId roomId, SceNpMatching2RoomMemberId peerMemberId, int playerMask) +{ + SceNetSockaddrIn sinp2pPeer; + SceNpMatching2SignalingNetInfo netInfo; + int connStatus; + + memset(&sinp2pPeer, 0, sizeof(sinp2pPeer)); + sinp2pPeer.sin_len = sizeof(sinp2pPeer); + sinp2pPeer.sin_family = SCE_NET_AF_INET; + int ret = sceNpMatching2SignalingGetConnectionStatus(m_matchingContext, roomId, peerMemberId, &connStatus, &sinp2pPeer.sin_addr, &sinp2pPeer.sin_port); + sinp2pPeer.sin_vport = sceNetHtons(1); + + + ret = 0; + // Create socket & bind, if we don't already have one + if( m_soc == -1 ) + { + if(CreateSocket() == false) + return false; + } + + // create this connection if we don't have it already + SQRVoiceConnection* pConnection = SonyVoiceChat_Vita::getVoiceConnectionFromRoomMemberID(peerMemberId); + if(pConnection == NULL) + { + + // Create an Rudp context for the voice connection, this will happen regardless of whether the peer is client or host + int rudpCtx; + ret = sceRudpCreateContext( RudpContextCallback, this, &rudpCtx ); + if(ret < 0){ app.DebugPrintf("sceRudpCreateContext failed : 0x%08x\n", ret); assert(0); } + if ( ( ret < 0 ) || ForceErrorPoint(SNM_FORCE_ERROR_CREATE_RUDP_CONTEXT) ) return false; + + // Bind the context to the socket we've just created, and initiate. The initiation needs to happen on both client & host sides of the connection to complete. + ret = sceRudpBind( rudpCtx, m_soc , 5, SCE_RUDP_MUXMODE_P2P ); + if(ret < 0){ app.DebugPrintf("sceRudpBind failed : 0x%08x\n", ret); assert(0); } + if ( ( ret < 0 ) || ForceErrorPoint(SNM_FORCE_ERROR_RUDP_BIND) ) return false; + + ret = sceRudpInitiate( rudpCtx, (SceNetSockaddr*)&sinp2pPeer, sizeof(sinp2pPeer), 0); + if(ret < 0){ app.DebugPrintf("sceRudpInitiate failed : 0x%08x\n", ret); assert(0); } + if ( ( ret < 0 ) || ForceErrorPoint(SNM_FORCE_ERROR_RUDP_INIT2) ) return false; + + app.DebugPrintf("-----------------------------\n"); + app.DebugPrintf("Voice rudp context created %d connected to %s\n", rudpCtx, getIPAddressString(sinp2pPeer.sin_addr).c_str()); + app.DebugPrintf("-----------------------------\n"); + + pConnection = SonyVoiceChat_Vita::addRemoteConnection(rudpCtx, peerMemberId); + } + + for( int i = 0; i < MAX_LOCAL_PLAYER_COUNT; i++ ) + { + bool bMaskVal = ( playerMask & ( 1 << i ) ); + + if(bMaskVal || GetLocalPlayerByUserIndex(i)) + SonyVoiceChat_Vita::connectPlayer(pConnection, i); + } + return true; +} + + + +bool SQRNetworkManager_Vita::CreateRudpConnections(SceNpMatching2RoomId roomId, SceNpMatching2RoomMemberId peerMemberId, int playerMask, SceNpMatching2RoomMemberId playersMemberId) +{ + // First get details of the UDPP2P connection that has been established + int connStatus; + SceNetSockaddrIn sinp2pPeer; + + // get the peer + memset(&sinp2pPeer, 0, sizeof(sinp2pPeer)); + sinp2pPeer.sin_len = sizeof(sinp2pPeer); + sinp2pPeer.sin_family = SCE_NET_AF_INET; + + int ret = sceNpMatching2SignalingGetConnectionStatus(m_matchingContext, roomId, peerMemberId, &connStatus, &sinp2pPeer.sin_addr, &sinp2pPeer.sin_port); + app.DebugPrintf(CMinecraftApp::USER_RR,"sceNpMatching2SignalingGetConnectionStatus returned 0x%x, connStatus %d peer add:%s peer port:0x%x\n",ret, connStatus,getIPAddressString(sinp2pPeer.sin_addr).c_str(),sinp2pPeer.sin_port); + + // Set vport + sinp2pPeer.sin_vport = sceNetHtons(1); + + // Create socket & bind, if we don't already have one + if( m_soc == -1 ) + { + if(CreateSocket() == false) + return false; + } + + // Create an Rudp context for each local player that is required. These can be used as individual virtual connections between room members (ie consoles), which are multiplexed + // over the socket we have just made + for( int i = 0; i < MAX_LOCAL_PLAYER_COUNT; i++ ) + { + if( ( playerMask & ( 1 << i ) ) == 0 ) continue; + + int rudpCtx; + + // Socket for the local network node created, now can create an Rupd context. + ret = sceRudpCreateContext( RudpContextCallback, this, &rudpCtx ); + if ( ( ret < 0 ) || ForceErrorPoint(SNM_FORCE_ERROR_CREATE_RUDP_CONTEXT) ) return false; + if( m_isHosting ) + { + m_RudpCtxToPlayerMap[ rudpCtx ] = new SQRNetworkPlayer( this, SQRNetworkPlayer::SNP_TYPE_REMOTE, true, playersMemberId, i, rudpCtx, NULL ); + } + else + { + // Local players can establish their UID at this point + PlayerUID localUID; + ProfileManager.GetXUID(i,&localUID,true); + + m_RudpCtxToPlayerMap[ rudpCtx ] = new SQRNetworkPlayer( this, SQRNetworkPlayer::SNP_TYPE_LOCAL, false, m_localMemberId, i, rudpCtx, &localUID ); + } + + // If we've created a player, then we want to try and patch up any connections that we should have to it + MapRoomSlotPlayers(); + + // TODO - set any non-default options for the context. By default, the context is set to have delivery critical and order critical both on + + // Bind the context to the socket we've just created, and initiate. The initiation needs to happen on both client & host sides of the connection to complete. + ret = sceRudpBind( rudpCtx, m_soc , 1 + i, SCE_RUDP_MUXMODE_P2P ); + if ( ( ret < 0 ) || ForceErrorPoint(SNM_FORCE_ERROR_RUDP_BIND) ) return false; + + ret = sceRudpInitiate( rudpCtx, &sinp2pPeer, sizeof(sinp2pPeer), 0); + if ( ( ret < 0 ) || ForceErrorPoint(SNM_FORCE_ERROR_RUDP_INIT2) ) return false; + } + return true; +} + + +SQRNetworkPlayer *SQRNetworkManager_Vita::GetPlayerFromRudpCtx(int rudpCtx) +{ + AUTO_VAR(it,m_RudpCtxToPlayerMap.find(rudpCtx)); + if( it != m_RudpCtxToPlayerMap.end() ) + { + return it->second; + } + return NULL; +} + + + +SQRNetworkPlayer *SQRNetworkManager_Vita::GetPlayerFromRoomMemberAndLocalIdx(int roomMember, int localIdx) +{ + for(AUTO_VAR(it, m_RudpCtxToPlayerMap.begin()); it != m_RudpCtxToPlayerMap.end(); it++ ) + { + if( (it->second->m_roomMemberId == roomMember ) && ( it->second->m_localPlayerIdx == localIdx ) ) + { + return it->second; + } + } + return NULL; +} + + +// This is called as part of the general initialisation of the network manager, to register any callbacks that the sony libraries require. +// Returns true if all were registered successfully. +bool SQRNetworkManager_Vita::RegisterCallbacks() +{ + // Register RUDP event handler + app.DebugPrintf("sceRudpSetEventHandler\n"); + int ret = sceRudpSetEventHandler(RudpEventCallback, this); + if (ret < 0) + { + app.DebugPrintf("SQRNetworkManager::RegisterCallbacks - cellRudpSetEventHandler failed with code 0x%08x\n", ret); + return false; + } + + // Register the context callback function + app.DebugPrintf("sceNpMatching2RegisterContextCallback\n"); + ret = sceNpMatching2RegisterContextCallback(ContextCallback, this); + if (ret < 0) + { + app.DebugPrintf("SQRNetworkManager::RegisterCallbacks - sceNpMatching2RegisterContextCallback failed with code 0x%08x\n", ret); + return false; + } + + // Register the default request callback & parameters + SceNpMatching2RequestOptParam optParam; + + memset(&optParam, 0, sizeof(optParam)); + optParam.cbFunc = DefaultRequestCallback; + optParam.cbFuncArg = this; + optParam.timeout = (30 * 1000 * 1000); + optParam.appReqId = 0; + + app.DebugPrintf("sceNpMatching2SetDefaultRequestOptParam\n"); + ret = sceNpMatching2SetDefaultRequestOptParam(m_matchingContext, &optParam); + if (ret < 0) + { + app.DebugPrintf("SQRNetworkManager::RegisterCallbacks - sceNpMatching2SetDefaultRequestOptParam failed with code 0x%08x\n", ret); + return false; + } + + // Register signalling callback + app.DebugPrintf("sceNpMatching2RegisterSignalingCallback\n"); + ret = sceNpMatching2RegisterSignalingCallback(m_matchingContext, SignallingCallback, this); + if (ret < 0) + { + return false; + } + + // Register room event callback + app.DebugPrintf("sceNpMatching2RegisterRoomEventCallback\n"); + ret = sceNpMatching2RegisterRoomEventCallback(m_matchingContext, RoomEventCallback, this); + if (ret < 0) + { + app.DebugPrintf("SQRNetworkManager::RegisterCallbacks - sceNpMatching2RegisterRoomEventCallback failed with code 0x%08x\n", ret); + return false; + } + + return true; +} + +extern bool g_bBootedFromInvite; + +// This is an implementation of SceNpMatching2ContextCallback. Used to determine whether the matching 2 context is valid or not. +void SQRNetworkManager_Vita::ContextCallback(SceNpMatching2ContextId id, SceNpMatching2Event event, SceNpMatching2EventCause eventCause, int errorCode, void *arg) +{ + if(CGameNetworkManager::usingAdhocMode()) // MGH - added to fix #5772 + return; + + + int ret; + SQRNetworkManager_Vita *manager = (SQRNetworkManager_Vita *)arg; + EnterCriticalSection(&manager->m_csMatching); + if (id != manager->m_matchingContext) + { + LeaveCriticalSection(&manager->m_csMatching); + return; + } + + switch( event ) + { + case SCE_NP_MATCHING2_CONTEXT_EVENT_STARTED: + app.DebugPrintf("SCE_NP_MATCHING2_CONTEXT_EVENT_STARTED\n"); + if(errorCode < 0) + { + if(manager->m_state == SNM_INT_STATE_IDLE_RECREATING_MATCHING_CONTEXT || + manager->m_state == SNM_INT_STATE_HOSTING_STARTING_MATCHING_CONTEXT || + manager->m_state == SNM_INT_STATE_JOINING_STARTING_MATCHING_CONTEXT) + { + // matching context failed to start (this can happen when you block the IP addresses of the matching servers on your router + // agent-0101.ww.sp-int.matching.playstation.net (198.107.157.191) + // static-resource.sp-int.community.playstation.net (203.105.77.140) + manager->SetState(SNM_INT_STATE_INITIALISE_FAILED); + break; + } + } + // Some special cases to detect when this event is coming in, in case we had to start the matching context because there wasn't a valid context when we went to get a server context. These two + // responses here complete what should then happen to get the server context in each case (for hosting or joining a game) + if( manager->m_state == SNM_INT_STATE_IDLE_RECREATING_MATCHING_CONTEXT ) + { + manager->SetState( SNM_INT_STATE_IDLE ); + manager->GetExtDataForRoom(0, NULL, NULL, NULL); + break; + } + + if( manager->m_state == SNM_INT_STATE_HOSTING_STARTING_MATCHING_CONTEXT ) + { + manager->GetServerContext2(); + break; + } + if( manager->m_state == SNM_INT_STATE_JOINING_STARTING_MATCHING_CONTEXT ) + { + manager->SetState(SNM_INT_STATE_JOINING_SEARCHING_FOR_SERVER); + manager->SelectRandomServer(); + break; + } + if ( manager->m_state == SNM_INT_STATE_HOSTING_CREATE_ROOM_RESTART_MATCHING_CONTEXT ) + { + manager->ServerContextValid_CreateRoom(); + break; + } + // Normal handling of context starting, from standard initialisation procedure + assert( manager->m_state == SNM_INT_STATE_STARTING_CONTEXT ); + if (errorCode < 0) + { + manager->SetState(SNM_INT_STATE_INITIALISE_FAILED); + } + else + { + manager->m_offlineSQR = false; + manager->SetState(SNM_INT_STATE_IDLE); + + // 4J-PB - SQRNetworkManager_PS3::AttemptPSNSignIn was causing crashes in Iggy by calling LoadMovie from a callback, so call it from the tick instead + m_bCallPSNSignInCallback=true; + // if(s_SignInCompleteCallbackFn) + // { + // s_SignInCompleteCallbackFn(s_SignInCompleteParam, true, 0); + // s_SignInCompleteCallbackFn = NULL; + // } + + + // Check to see if we were booted from an invite. Only do this once, the first time we have all our networking stuff set up on boot-up + if( manager->m_doBootInviteCheck ) + { + // ORBIS_STUBBED; + // unsigned int type, attributes; + // CellGameContentSize gameSize;` + // char dirName[CELL_GAME_DIRNAME_SIZE]; + // + // if( g_bBootedFromInvite ) + // { + // manager->GetInviteDataAndProcess(SCE_NP_BASIC_SELECTED_INVITATION_DATA); + // manager->m_doBootInviteCheck = false; + // } + } + } + break; + case SCE_NP_MATCHING2_CONTEXT_EVENT_STOPPED: + app.DebugPrintf("SCE_NP_MATCHING2_CONTEXT_EVENT_STOPPED\n"); + // Can happen when we stop the PSN to switch to adhoc mode + //assert(false); + if( manager->m_state == SNM_INT_STATE_HOSTING_CREATE_ROOM_RESTART_MATCHING_CONTEXT ) + { + sceNpMatching2DestroyContext(manager->m_matchingContext); + manager->m_matchingContextValid = false; + if(!manager->GetMatchingContext(SNM_INT_STATE_HOSTING_CREATE_ROOM_RESTART_MATCHING_CONTEXT)) + { + manager->m_offlineSQR = true; + manager->SetState(SNM_INT_STATE_INITIALISE_FAILED); + } + } + break; + case SCE_NP_MATCHING2_CONTEXT_EVENT_START_OVER: + + app.DebugPrintf("SCE_NP_MATCHING2_CONTEXT_EVENT_START_OVER\n"); + app.DebugPrintf("SCE_NP_MATCHING2_CONTEXT_EVENT_START_OVER\n"); + app.DebugPrintf("eventCause=%u, errorCode=0x%08x\n", eventCause, errorCode); + app.DebugPrintf("sceNpMatching2DestroyContext\n"); + sceNpMatching2DestroyContext(manager->m_matchingContext); + if(manager->m_state == SNM_INT_STATE_IDLE_RECREATING_MATCHING_CONTEXT) // MGH - added this to catch when the context start fails when getting GetExtDataForRoom + { + if(manager->m_FriendSessionUpdatedFn) + manager->m_FriendSessionUpdatedFn(false, manager->m_pParamFriendSessionUpdated); + } + manager->m_matchingContextValid = false; + manager->m_offlineSQR = true; + manager->SetState(SNM_INT_STATE_INITIALISE_FAILED); + break; + } + + LeaveCriticalSection(&manager->m_csMatching); +} + +// This is an implementation of SceNpMatching2RequestCallback. This callback is used by default for any matching 2 request functions. +void SQRNetworkManager_Vita::DefaultRequestCallback(SceNpMatching2ContextId id, SceNpMatching2RequestId reqId, SceNpMatching2Event event, int errorCode, const void *data, void *arg) +{ + SQRNetworkManager_Vita *manager = (SQRNetworkManager_Vita *)arg; + EnterCriticalSection(&manager->m_csMatching); + // int ret; + if( id != manager->m_matchingContext ) + { + LeaveCriticalSection(&manager->m_csMatching); + return; + } + + + switch( event ) + { + // This is the response to sceNpMatching2GetWorldInfoList, which is called as part of the process to create a room (which needs a world to be created in). We aren't anticipating + // using worlds in a meaningful way so just getting the first world we find on the server here, and then advancing the state so that the tick can get on with the rest of the process. + case SCE_NP_MATCHING2_REQUEST_EVENT_GET_WORLD_INFO_LIST: + { + app.DebugPrintf("SCE_NP_MATCHING2_REQUEST_EVENT_GET_WORLD_INFO_LIST\n"); + SceNpServiceState serviceState; + int retVal = sceNpGetServiceState(&serviceState); + assert(retVal == 0); + assert(serviceState == SCE_NP_SERVICE_STATE_ONLINE); + + if( errorCode == SCE_NP_MATCHING2_ERROR_NP_SIGNED_OUT ) + { + // If we've already signed out, then we should have detected this already elsewhere and so can silently ignore any errors coming in for pending requests here + break; + } + assert( manager->m_state == SNM_INT_STATE_HOSTING_CREATE_ROOM_SEARCHING_FOR_WORLD ); + if( errorCode == 0 ) + { + if( data != 0 ) + { + // Currently just using first world - this may well be all that we need anyway + SceNpMatching2GetWorldInfoListResponse *pWorldList = (SceNpMatching2GetWorldInfoListResponse *)data; + if( pWorldList->worldNum >= 1 ) + { + manager->m_worldId = pWorldList->world[0].worldId; + manager->SetState(SNM_INT_STATE_HOSTING_CREATE_ROOM_WORLD_FOUND); + break; + } + } + } + // We get this error when starting a new game after a disconnect occurred in a previous game with at least one remote player. Fix by stopping/starting the matching context. + // We stop the context here, which is picked up in the callback, and started again. Then the start event is picked up and reattempts the sceNpMatching2GetWorldInfoList. + if( errorCode == SCE_NET_ERROR_EAGAIN || errorCode == SCE_NET_ERROR_RESOLVER_ETIMEDOUT || errorCode == SCE_NET_CTL_ERROR_WIFI_DISABLED ) + { + sceNpMatching2ContextStop(manager->m_matchingContext); + manager->SetState(SNM_INT_STATE_HOSTING_CREATE_ROOM_RESTART_MATCHING_CONTEXT); + break; + } + app.DebugPrintf("SCE_NP_MATCHING2_REQUEST_EVENT_GET_WORLD_INFO_LIST failed, errorCode 0x%x, data %d\n", errorCode, data); + + manager->SetState(SNM_INT_STATE_HOSTING_CREATE_ROOM_FAILED); + } + break; + // This is the response to sceNpMatching2CreateJoinRoom, which if successful means that we are just about ready to move to an online state as host of a game. The final + // transition actually occurs in the create room tick, on detecting that the state has transitioned to SNM_INT_STATE_HOSTING_CREATE_ROOM_SUCCESS here. + case SCE_NP_MATCHING2_REQUEST_EVENT_CREATE_JOIN_ROOM: + app.DebugPrintf("SCE_NP_MATCHING2_REQUEST_EVENT_CREATE_JOIN_ROOM\n"); + if( errorCode == SCE_NP_MATCHING2_ERROR_NP_SIGNED_OUT ) + { + // If we've already signed out, then we should have detected this already elsewhere and so can silently ignore any errors coming in for pending requests here + break; + } + + if(ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad()) == false) + { + // MGH - added to catch a case where the user signed out of PSN, but this still called back with no error + break; + } + + app.DebugPrintf(CMinecraftApp::USER_RR,">> Creating room complete, time taken %d, error 0x%x\n",System::currentTimeMillis()-s_roomStartTime, errorCode); + assert( manager->m_state == SNM_INT_STATE_HOSTING_CREATE_ROOM_CREATING_ROOM ); + if( errorCode == 0 ) + { + if( data != 0 ) + { + SceNpMatching2CreateJoinRoomResponse *roomData = (SceNpMatching2CreateJoinRoomResponse *)data; + manager->m_localMemberId = roomData->roomDataInternal->memberList.me->memberId; + + manager->SetState(SNM_INT_STATE_HOSTING_CREATE_ROOM_SUCCESS); + manager->m_room = roomData->roomDataInternal->roomId; + break; + } + } + manager->SetState(SNM_INT_STATE_HOSTING_CREATE_ROOM_FAILED); + break; + // This is the response to sceNpMatching2JoinRoom, which is called as the final stage of the process started when calling the JoinRoom method. If this is successful, then + // the state can change to SNM_INT_STATE_JOINING_WAITING_FOR_LOCAL_PLAYERS. We can transition out of that state once we have told the application that all the local players + // have joined. + case SCE_NP_MATCHING2_REQUEST_EVENT_JOIN_ROOM: + app.DebugPrintf("SCE_NP_MATCHING2_REQUEST_EVENT_JOIN_ROOM\n"); + assert( manager->m_state == SNM_INT_STATE_JOINING_JOIN_ROOM); + if( errorCode == 0 ) + { + if( data != 0 ) + { + SceNpMatching2JoinRoomResponse *roomData = (SceNpMatching2JoinRoomResponse *)data; + + manager->m_localMemberId = roomData->roomDataInternal->memberList.me->memberId; + manager->m_room = roomData->roomDataInternal->roomId; + // SonyVoiceChat::init(manager); + // Copy over initial room sync data + for( int i = 0; i < roomData->roomDataInternal->roomBinAttrInternalNum; i++ ) + { + if( roomData->roomDataInternal->roomBinAttrInternal[i].data.id == SCE_NP_MATCHING2_ROOM_BIN_ATTR_INTERNAL_1_ID ) + { + assert( roomData->roomDataInternal->roomBinAttrInternal[i].data.size == sizeof( manager->m_roomSyncData ) ); + memcpy( &manager->m_roomSyncData, roomData->roomDataInternal[i].roomBinAttrInternal[0].data.ptr, sizeof( manager->m_roomSyncData ) ); + + // manager->UpdatePlayersFromRoomSyncUIDs(); + // Update mapping from the room slot players to SQRNetworkPlayer instances + manager->MapRoomSlotPlayers(); + break; + } + } + manager->SetState(SNM_INT_STATE_JOINING_WAITING_FOR_LOCAL_PLAYERS); + break; + } + } + 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 + // kick off the request for room member internal data so that we can determine what local players that remote machine is intending to bring into the game. At this point we can + // activate the host end of each of the Rupd connection that this machine requires. We can also update our player slot data (which gets syncronised back out to other room members) at this point. + case SCE_NP_MATCHING2_REQUEST_EVENT_GET_ROOM_MEMBER_DATA_INTERNAL: + app.DebugPrintf("SCE_NP_MATCHING2_REQUEST_EVENT_GET_ROOM_MEMBER_DATA_INTERNAL\n"); + if( manager->m_state == SNM_INT_STATE_INITIALISE_FAILED || + manager->m_state == SNM_INT_STATE_IDLE || + manager->m_state == SNM_INT_STATE_LEAVING || + manager->m_state == SNM_INT_STATE_ENDING ) + { + // MGH - I've caught this being triggered after join has already failed, and then UDP connections are created that aren't killed off + // so just break out here if we're not in the expected state + // fixes devtrack #5807 + app.DebugPrintf("SCE_NP_MATCHING2_REQUEST_EVENT_GET_ROOM_MEMBER_DATA_INTERNAL - manager->GetState() : %d\n", manager->GetState() ); + break; + } + if( errorCode == 0 ) + { + + if( data != 0 ) + { + SceNpMatching2GetRoomMemberDataInternalResponse *pRoomMemberData = (SceNpMatching2GetRoomMemberDataInternalResponse *)data; + assert( pRoomMemberData->roomMemberDataInternal->roomMemberBinAttrInternalNum == 1 ); + + if( manager->m_isHosting ) + { + int playerMask = *((int *)(pRoomMemberData->roomMemberDataInternal->roomMemberBinAttrInternal->data.ptr)); + + bool isFull = false; + bool success1 = manager->AddRemotePlayersAndSync( pRoomMemberData->roomMemberDataInternal->memberId, playerMask, &isFull ); + bool success2; + if( success1 ) + { + success2 = manager->CreateRudpConnections(manager->m_room, pRoomMemberData->roomMemberDataInternal->memberId, playerMask, pRoomMemberData->roomMemberDataInternal->memberId); + if( success2 ) + { + bool ret = manager->CreateVoiceRudpConnections( manager->m_room, pRoomMemberData->roomMemberDataInternal->memberId, 0); + assert(ret == true); + break; + } + } + // Something has gone wrong adding these players to the room - kick out the player + SceNpMatching2KickoutRoomMemberRequest reqParam; + // SceNpMatching2PresenceOptionData optParam; + memset(&reqParam,0,sizeof(reqParam)); + reqParam.roomId = manager->m_room; + reqParam.target = pRoomMemberData->roomMemberDataInternal->memberId; + // Set flag to indicate whether we were kicked for being out of room or not + reqParam.optData.data[0] = isFull ? 1 : 0; + reqParam.optData.len = 1; + int ret = sceNpMatching2KickoutRoomMember(manager->m_matchingContext, &reqParam, NULL, &manager->m_kickRequestId); + app.DebugPrintf(CMinecraftApp::USER_RR,"sceNpMatching2KickoutRoomMember returns error 0x%x\n",ret); + } + else + { + if(pRoomMemberData->roomMemberDataInternal->roomMemberBinAttrInternal->data.ptr == NULL) + { + // the host doesn't send out data, so this must be the host we're connecting to + + // If we are the client, then we locally know what Rupd connections we need (from m_localPlayerJoinMask) and can kick this off. + manager->m_hostMemberId = pRoomMemberData->roomMemberDataInternal->memberId; + bool ret = manager->CreateRudpConnections( manager->m_room, pRoomMemberData->roomMemberDataInternal->memberId, manager->m_localPlayerJoinMask, manager->m_localMemberId); + if( ret == false ) + { + manager->DeleteServerContext(); + } + else + { + bool ret = manager->CreateVoiceRudpConnections( manager->m_room, pRoomMemberData->roomMemberDataInternal->memberId, manager->m_localPlayerJoinMask); + assert(ret == true); + } + } + else + { + // client <-> client + bool ret = manager->CreateVoiceRudpConnections( manager->m_room, pRoomMemberData->roomMemberDataInternal->memberId, manager->m_localPlayerJoinMask); + assert(ret == true); + } + } + + } + } + break; + case SCE_NP_MATCHING2_REQUEST_EVENT_LEAVE_ROOM: + app.DebugPrintf("SCE_NP_MATCHING2_REQUEST_EVENT_LEAVE_ROOM\n"); + // This is the response to sceNpMatching2LeaveRoom - from the Sony docs, this doesn't ever fail so no need to do error checking here + // SonyVoiceChat::signalDisconnected(); + assert(manager->m_state == SNM_INT_STATE_LEAVING ); + manager->DeleteServerContext(); + break; + // This is the response to SceNpMatching2GetRoomDataExternalListRequest, which happens when we request the full details of a room we are interested in joining + case SCE_NP_MATCHING2_REQUEST_EVENT_GET_ROOM_DATA_EXTERNAL_LIST: + app.DebugPrintf("SCE_NP_MATCHING2_REQUEST_EVENT_GET_ROOM_DATA_EXTERNAL_LIST\n"); + if( errorCode == 0 ) + { + if( data != 0 ) + { + SceNpMatching2GetRoomDataExternalListResponse *pExternalData = (SceNpMatching2GetRoomDataExternalListResponse *)data; + SceNpMatching2RoomDataExternal *pRoomExtData = pExternalData->roomDataExternal; + if( pExternalData->roomDataExternalNum == 1 ) + { + if(pRoomExtData->roomBinAttrExternalNum == 1 ) + { + memcpy(manager->m_pExtDataToUpdate, pRoomExtData->roomBinAttrExternal[0].ptr,pRoomExtData->roomBinAttrExternal[0].size); + manager->m_FriendSessionUpdatedFn(true, manager->m_pParamFriendSessionUpdated); + } + else + { + manager->m_FriendSessionUpdatedFn(false, manager->m_pParamFriendSessionUpdated); + } + } + else + { + manager->m_FriendSessionUpdatedFn(false, manager->m_pParamFriendSessionUpdated); + } + } + else + { + manager->m_FriendSessionUpdatedFn(false, manager->m_pParamFriendSessionUpdated); + } + } + else + { + manager->m_FriendSessionUpdatedFn(false, manager->m_pParamFriendSessionUpdated); + } + break; + case SCE_NP_MATCHING2_REQUEST_EVENT_SET_ROOM_DATA_EXTERNAL: + app.DebugPrintf("SCE_NP_MATCHING2_REQUEST_EVENT_SET_ROOM_DATA_EXTERNAL\n"); + if( ( errorCode != 0 ) || manager->ForceErrorPoint(SNM_FORCE_ERROR_SET_ROOM_DATA_CALLBACK) ) + { + app.DebugPrintf(CMinecraftApp::USER_RR,"Error updating external data 0x%x (from SCE_NP_MATCHING2_REQUEST_EVENT_SetRoomDataExternal event in callback)\n",errorCode); + // If we ever fail to send the external room data, we start a countdown so that we attempt to resend. Not sure how likely it is that updating this will fail without the whole network being broken, + // but if in particular we don't update the flag to say that the session is joinable, then nobody is ever going to see this session. + manager->m_resendExternalRoomDataCountdown = 60; + } + break; + }; + + LeaveCriticalSection(&manager->m_csMatching); +} + +void SQRNetworkManager_Vita::RoomEventCallback(SceNpMatching2ContextId id, SceNpMatching2RoomId roomId, SceNpMatching2Event event, const void *data, void *arg) +{ + SQRNetworkManager_Vita *manager = (SQRNetworkManager_Vita *)arg; + + // bool gotEventData = false; + switch( event ) + { + case SCE_NP_MATCHING2_ROOM_EVENT_MEMBER_JOINED: + break; + case SCE_NP_MATCHING2_ROOM_EVENT_MEMBER_LEFT: + break; + case SCE_NP_MATCHING2_ROOM_EVENT_KICKEDOUT: + { + // SonyVoiceChat::signalRoomKickedOut(); + // We've been kicked out. This server has rejected our attempt to join, most likely because there wasn't enough space in the server to have us. There's a flag set + // so we can determine which thing has happened + // assert ( dataSize <= SCE_NP_MATCHING2_EVENT_DATA_MAX_SIZE_RoomUpdateInfo ); + // int ret = sceNpMatching2GetEventData( manager->m_matchingContext, eventKey, manager->cRoomDataUpdateInfo, SCE_NP_MATCHING2_EVENT_DATA_MAX_SIZE_RoomUpdateInfo); + // app.DebugPrintf(CMinecraftApp::USER_RR,"SCE_NP_MATCHING2_ROOM_EVENT_Kickedout, sceNpMatching2GetEventData returning 0x%x\n",ret); + + bool bIsFull = false; + if( ( data ) && !manager->ForceErrorPoint(SNM_FORCE_ERROR_UPDATED_ROOM_DATA) ) + { + // gotEventData = true; + SceNpMatching2RoomUpdateInfo *pUpdateInfo = (SceNpMatching2RoomUpdateInfo *)(data); + if( pUpdateInfo->optData.len == 1 ) + { + if( pUpdateInfo->optData.data[0] == 1 ) + { + bIsFull = true; + } + } + } + app.DebugPrintf(CMinecraftApp::USER_RR,"IsFull determined to be %d\n",bIsFull); + if( bIsFull ) + { + manager->m_nextIdleReasonIsFull = true; + } + manager->ResetToIdle(); + } + break; + case SCE_NP_MATCHING2_ROOM_EVENT_ROOM_DESTROYED: + // SonyVoiceChat::signalRoomDestroyed(); + + { + SceNpMatching2RoomUpdateInfo *pUpdateInfo = (SceNpMatching2RoomUpdateInfo *)data; + app.DebugPrintf("SCE_NP_MATCHING2_ROOM_EVENT_RoomDestroyed\n"); + if( pUpdateInfo ) + { + app.DebugPrintf("Further info: Error 0x%x, cause %d\n",pUpdateInfo->errorCode,pUpdateInfo->eventCause); + } + // If we're hosting, then handle this a bit like a disconnect, in that we will shift the game into an offline game - but don't need to actually leave the room + // since that has been destroyed and so isn't there to be left anymore. Don't do this if we are disconnected though, as we've already handled this. + if( ( manager->m_isHosting ) && !manager->m_bLinkDisconnected ) + { + // MGH - we're not receiving an SCE_NP_MATCHING2_SIGNALING_EVENT_DEAD after this so we have to remove all the remote players + while(manager->m_RudpCtxToPlayerMap.size()) + { + SQRNetworkPlayer* pRemotePlayer = manager->m_RudpCtxToPlayerMap.begin()->second; + manager->RemoveRemotePlayersAndSync( pRemotePlayer->m_roomMemberId, 15 ); + } + + // MGH - added a check for the PSN sign in state, we don't seem to get the signed out matching2 error here + bool bSignedInPSN = ProfileManager.IsSignedInPSN(ProfileManager.GetPrimaryPad()); + bool bSignedOutError = pUpdateInfo && (pUpdateInfo->eventCause==SCE_NP_MATCHING2_EVENT_CAUSE_NP_SIGNED_OUT); + + if(bSignedOutError || (bSignedInPSN == false) ) + { + manager->m_listener->HandleDisconnect(true,true); + } + else + { + manager->m_listener->HandleDisconnect(true); + } + } + } + break; + case SCE_NP_MATCHING2_ROOM_EVENT_ROOM_OWNER_CHANGED: + break; + case SCE_NP_MATCHING2_ROOM_EVENT_UPDATED_ROOM_DATA_INTERNAL: + // We are using the room internal data to synchronise the player data stored in m_roomSyncData from the host to clients. + // The host is the thing creating the internal room data, so it doesn't need to update itself. + if( !manager->m_isHosting ) + { + // assert ( dataSize <= SCE_NP_MATCHING2_EVENT_DATA_MAX_SIZE_RoomDataInternalUpdateInfo ); + // int ret = sceNpMatching2GetEventData( manager->m_matchingContext, eventKey, manager->cRoomDataInternal, SCE_NP_MATCHING2_EVENT_DATA_MAX_SIZE_RoomDataInternalUpdateInfo); + if( ( data) && !manager->ForceErrorPoint(SNM_FORCE_ERROR_UPDATED_ROOM_DATA) ) + { + // gotEventData = true; + SceNpMatching2RoomDataInternalUpdateInfo *pRoomData = (SceNpMatching2RoomDataInternalUpdateInfo *)(data); + for(int i = 0; i < pRoomData->newRoomBinAttrInternalNum; i++) + { + if( pRoomData->newRoomBinAttrInternal[i]->data.id == SCE_NP_MATCHING2_ROOM_BIN_ATTR_INTERNAL_1_ID ) + { + assert( pRoomData->newRoomBinAttrInternal[i]->data.size == sizeof( manager->m_roomSyncData ) ); + memcpy( &manager->m_roomSyncData, pRoomData->newRoomBinAttrInternal[i]->data.ptr, sizeof( manager->m_roomSyncData ) ); + + // manager->UpdatePlayersFromRoomSyncUIDs(); + // Update mapping from the room slot players to SQRNetworkPlayer instances + manager->MapRoomSlotPlayers(); +#if 0 + { + printf("New player sync data arrived\n"); + for(int i = 0; i < manager->m_roomSyncData.getPlayerCount(); i++ ) + { + printf("%d: small %d, machine %d, local %d\n",i, manager->m_roomSyncData.players[i].m_smallId, manager->m_roomSyncData.players[i].m_roomMemberId, manager->m_roomSyncData.players[i].m_localIdx); + } + } +#endif + break; + } + } + break; + } + // TODO - handle error here? What could we do? + } + + break; + case SCE_NP_MATCHING2_ROOM_EVENT_UPDATED_ROOM_MEMBER_DATA_INTERNAL: + if( /*( errorCode == 0 ) && */(!manager->ForceErrorPoint(SNM_FORCE_ERROR_UPDATED_ROOM_MEMBER_DATA_INTERNAL1) ) ) + { + // We'll get this sync'd round all the connected clients, but we only care about it on the host where we can use it to work out if any RUDP connections need to be made or released + if( manager->m_isHosting ) + { + // assert( dataSize <= SCE_NP_MATCHING2_EVENT_DATA_MAX_SIZE_RoomMemberDataInternalUpdateInfo ); + // int ret = sceNpMatching2GetEventData(manager->m_matchingContext, eventKey, (void *)(manager->cRoomMemberDataInternalUpdate), SCE_NP_MATCHING2_EVENT_DATA_MAX_SIZE_RoomMemberDataInternalUpdateInfo); + if( ( data ) && (!manager->ForceErrorPoint(SNM_FORCE_ERROR_UPDATED_ROOM_MEMBER_DATA_INTERNAL2) ) ) + { + // gotEventData = true; + SceNpMatching2RoomMemberDataInternalUpdateInfo *pRoomMemberData = (SceNpMatching2RoomMemberDataInternalUpdateInfo *)(data); + assert( pRoomMemberData->newRoomMemberBinAttrInternalNum == 1 ); + + int playerMask = *((int *)(pRoomMemberData->newRoomMemberBinAttrInternal[0]->data.ptr)); + int oldMask = manager->GetOldMask( pRoomMemberData->newRoomMemberDataInternal->memberId ); + int addedMask = manager->GetAddedMask(playerMask, oldMask ); + int removedMask = manager->GetRemovedMask(playerMask, oldMask ); + + if( addedMask != 0 ) + { + bool success = manager->AddRemotePlayersAndSync( pRoomMemberData->newRoomMemberDataInternal->memberId, addedMask ); + if( success ) + { + success = manager->CreateRudpConnections(manager->m_room, pRoomMemberData->newRoomMemberDataInternal->memberId, addedMask, pRoomMemberData->newRoomMemberDataInternal->memberId); + } + if( ( !success ) || (manager->ForceErrorPoint(SNM_FORCE_ERROR_UPDATED_ROOM_MEMBER_DATA_INTERNAL3) ) ) + { + // Failed for some reason - signal back to the client that this is the case, by updating its internal data back again, rather than have + // it wait for a timeout on its rudp connection initialisation. + SceNpMatching2SetRoomMemberDataInternalRequest reqParam; + SceNpMatching2BinAttr binAttr; + + memset(&reqParam, 0, sizeof(reqParam)); + memset(&binAttr, 0, sizeof(binAttr)); + + binAttr.id = SCE_NP_MATCHING2_ROOMMEMBER_BIN_ATTR_INTERNAL_1_ID; + binAttr.ptr = &oldMask; + binAttr.size = sizeof(oldMask); + + reqParam.roomId = manager->m_room; + reqParam.memberId = pRoomMemberData->newRoomMemberDataInternal->memberId; + reqParam.roomMemberBinAttrInternalNum = 1; + reqParam.roomMemberBinAttrInternal = &binAttr; + + int ret = sceNpMatching2SetRoomMemberDataInternal( manager->m_matchingContext, &reqParam, NULL, &manager->m_setRoomMemberInternalDataRequestId ); + } + else + { + success = manager->CreateVoiceRudpConnections( manager->m_room, pRoomMemberData->newRoomMemberDataInternal->memberId, 0); + assert(success); + } + + } + + if( removedMask != 0 ) + { + manager->RemoveRemotePlayersAndSync( pRoomMemberData->newRoomMemberDataInternal->memberId, removedMask ); + } + + break; + } + } + else + { + // If, as a client, we receive an updated room member data this could be for two reason. + // (1) Another client in the game has updated their own data as someone has joined/left the session + // (2) The server has set someone's data back, due to a failed attempt to join a game + // We're only interested in scenario (2), when the data that has been updated is our own, in which case we know to abandon creating rudp connections etc. for a new player + // assert( dataSize <= SCE_NP_MATCHING2_EVENT_DATA_MAX_SIZE_RoomMemberDataInternalUpdateInfo ); + // int ret = sceNpMatching2GetEventData(manager->m_matchingContext, eventKey, (void *)(manager->cRoomMemberDataInternalUpdate), SCE_NP_MATCHING2_EVENT_DATA_MAX_SIZE_RoomMemberDataInternalUpdateInfo); + if( ( data ) && (!manager->ForceErrorPoint(SNM_FORCE_ERROR_UPDATED_ROOM_MEMBER_DATA_INTERNAL4) ) ) + { + // gotEventData = true; + SceNpMatching2RoomMemberDataInternalUpdateInfo *pRoomMemberData = (SceNpMatching2RoomMemberDataInternalUpdateInfo *)(data); + assert( pRoomMemberData->newRoomMemberBinAttrInternalNum == 1 ); + if( pRoomMemberData->newRoomMemberDataInternal->memberId == manager->m_localMemberId ) + { + int playerMask = *((int *)(pRoomMemberData->newRoomMemberBinAttrInternal[0]->data.ptr)); + if( playerMask != manager->m_localPlayerJoinMask ) + { + int playersToRemove = manager->m_localPlayerJoinMask & (~playerMask); + manager->RemoveNetworkPlayers( playersToRemove ); + if( manager->m_listener ) + { + for( int i = 0; i < MAX_LOCAL_PLAYER_COUNT; i++ ) + { + if( playersToRemove & ( 1 << i ) ) + { + manager->m_listener->HandleAddLocalPlayerFailed(i); + break; + } + } + } + } + } + } + + } + } + break; + case SCE_NP_MATCHING2_ROOM_EVENT_UPDATED_SIGNALING_OPT_PARAM: + break; + }; + + // // If we didn't get the event data, then we need to clear it, or the system even queue will overflow + // if( !gotEventData ) + // { + // sceNpMatching2ClearEventData(manager->m_matchingContext, eventKey); + // } +} + +// This is an implementation of SceNpMatching2SignalingCallback. We configure our too automatically create a star network of connections with the host at the hub, and can respond here to +// the connections being set up to layer sockets and Rudp on top. +void SQRNetworkManager_Vita::SignallingCallback(SceNpMatching2ContextId ctxId, SceNpMatching2RoomId roomId, SceNpMatching2RoomMemberId peerMemberId, SceNpMatching2Event event, int error_code, void *arg) +{ + SQRNetworkManager_Vita *manager = (SQRNetworkManager_Vita *)arg; + + switch( event ) + { + case SCE_NP_MATCHING2_SIGNALING_EVENT_DEAD: + { + if( manager->m_isHosting ) + { + // Remove any players associated with this peer + manager->RemoveRemotePlayersAndSync( peerMemberId, 15 ); + } + else + { + SQRVoiceConnection* pVoice = SonyVoiceChat_Vita::getVoiceConnectionFromRoomMemberID(peerMemberId); + if(pVoice) + { + SonyVoiceChat_Vita::disconnectRemoteConnection(pVoice); + } + if(peerMemberId == manager->m_hostMemberId || pVoice == NULL) // MGH - added check for voice, as we sometime get here before m_hostMemberId has been filled in + { + // Host has left the game... so its all over for this client too. Finish everything up now, including deleting the server context which belongs to this gaming session + // This also might be a response to a request to leave the game from our end too so don't need to do anything in that case + if( manager->m_state != SNM_INT_STATE_LEAVING ) + { + manager->DeleteServerContext(); + manager->ResetToIdle(); + } + } + } + } + case SCE_NP_MATCHING2_SIGNALING_EVENT_ESTABLISHED: + { + + // MGH - changed this to always get the data now, as we need to know if the connecting peer is the host or not + // If we're the host, then we need to get the data associated with the connecting peer to know what connections we should be trying to match. So + // the actual creation of connections happens when the response for this request is processed. + + SceNpMatching2GetRoomMemberDataInternalRequest reqParam; + memset( &reqParam, 0, sizeof(reqParam)); + reqParam.roomId = roomId; + reqParam.memberId = peerMemberId; + SceNpMatching2AttributeId attrs[1] = {SCE_NP_MATCHING2_ROOMMEMBER_BIN_ATTR_INTERNAL_1_ID}; + reqParam.attrId = attrs; + reqParam.attrIdNum = 1; + + sceNpMatching2GetRoomMemberDataInternal( manager->m_matchingContext, &reqParam, NULL, &manager->m_roomMemberDataRequestId); + } + break; + } +} + + +// Implementation of SceNpBasicEventHandler +int SQRNetworkManager_Vita::BasicEventCallback(int event, int retCode, uint32_t reqId, void *arg) +{ + PSVITA_STUBBED; + // SQRNetworkManager_Vita *manager = (SQRNetworkManager_Vita *)arg; + // // We aren't allowed to actually get the event directly from this callback, so send our own internal event to a thread dedicated to doing this + // sceKernelTriggerUserEvent(m_basicEventQueue, sc_UserEventHandle, NULL); + + return 0; +} + +// 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) + { + if(bSignedIn) + { + SceNpServiceState serviceState; + int retVal = sceNpGetServiceState(&serviceState); + assert(retVal == 0); + assert(serviceState == SCE_NP_SERVICE_STATE_ONLINE); + InitialiseAfterOnline(); + } + } + else + { + if(bSignedIn == false) + m_listener->HandleDisconnect(false); + } + UpdateOnlineStatus(bSignedIn); +} + +// Implementation of CellSysutilCallback +void SQRNetworkManager_Vita::SysUtilCallback(uint64_t status, uint64_t param, void *userdata) +{ + // SQRNetworkManager_Vita *manager = (SQRNetworkManager_Vita *)userdata; + // struct CellNetCtlNetStartDialogResult netstart_result; + // int ret = 0; + // netstart_result.size = sizeof(netstart_result); + // switch(status) + // { + // case CELL_SYSUTIL_NET_CTL_NETSTART_FINISHED: + // ret = cellNetCtlNetStartDialogUnloadAsync(&netstart_result); + // if(ret < 0) + // { + // manager->SetState(SNM_INT_STATE_INITIALISE_FAILED); + // if( s_SignInCompleteCallbackFn ) + // { + // if( s_signInCompleteCallbackIfFailed ) + // { + // s_SignInCompleteCallbackFn(s_SignInCompleteParam,false,0); + // } + // s_SignInCompleteCallbackFn = NULL; + // } + // return; + // } + // + // if( netstart_result.result != 0 ) + // { + // // Failed, or user may have decided not to sign in - maybe need to differentiate here + // manager->SetState(SNM_INT_STATE_INITIALISE_FAILED); + // if( s_SignInCompleteCallbackFn ) + // { + // if( s_signInCompleteCallbackIfFailed ) + // { + // s_SignInCompleteCallbackFn(s_SignInCompleteParam,false,0); + // } + // s_SignInCompleteCallbackFn = NULL; + // } + // } + // + // break; + // case CELL_SYSUTIL_NET_CTL_NETSTART_UNLOADED: + // break; + // case CELL_SYSUTIL_NP_INVITATION_SELECTED: + // manager->GetInviteDataAndProcess(SCE_NP_BASIC_SELECTED_INVITATION_DATA); + // break; + // default: + // break; + // } +} + + +void SQRNetworkManager_Vita::updateNetCheckDialog() +{ + if(ProfileManager.IsSystemUIDisplayed()) + { + if( sceNetCheckDialogGetStatus() == SCE_COMMON_DIALOG_STATUS_FINISHED ) + { + //Check for errors + SceNetCheckDialogResult netCheckResult; + int ret = sceNetCheckDialogGetResult(&netCheckResult); + app.DebugPrintf("NetCheckDialogResult = 0x%x\n", netCheckResult.result); + 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( bConnectedOK ) + { + if( s_SignInCompleteCallbackFn ) + { + s_SignInCompleteCallbackFn(s_SignInCompleteParam,true,0); + s_SignInCompleteCallbackFn = NULL; + } + } + else + { + // SCE_COMMON_DIALOG_RESULT_USER_CANCELED + // 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_SignInCompleteCallbackFn ) + { + if( s_signInCompleteCallbackIfFailed ) + { + s_SignInCompleteCallbackFn(s_SignInCompleteParam,false,0); + } + s_SignInCompleteCallbackFn = NULL; + } + } + } + } +} + +// Implementation of CellRudpContextEventHandler. This is associate with an Rudp context every time one is created, and can be used to determine the status of each +// Rudp connection. We create one context/connection per local player on the non-hosting consoles. +void SQRNetworkManager_Vita::RudpContextCallback(int ctx_id, int event_id, int error_code, void *arg) +{ + SQRNetworkManager_Vita *manager = (SQRNetworkManager_Vita *)arg; + switch(event_id) + { + case SCE_RUDP_CONTEXT_EVENT_CLOSED: + { + SQRVoiceConnection* pVoice = SonyVoiceChat_Vita::GetVoiceConnectionFromRudpCtx(ctx_id); + if(pVoice) + { + pVoice->m_bConnected = false; + } + else + { + app.DebugPrintf(CMinecraftApp::USER_RR,"RUDP closed - event error 0x%x\n",error_code); + if( !manager->m_isHosting ) + { + if( manager->m_state == SNM_INT_STATE_JOINING_WAITING_FOR_LOCAL_PLAYERS ) + { + manager->LeaveRoom(true); + } + } + } + } + break; + case SCE_RUDP_CONTEXT_EVENT_ESTABLISHED: + { + SQRNetworkPlayer *player = manager->GetPlayerFromRudpCtx(ctx_id); + if( player ) + { + // Flag connection stage as being completed for this player + manager->NetworkPlayerConnectionComplete(player); + } + else + { + SonyVoiceChat_Vita::setConnected(ctx_id); + } + } + break; + case SCE_RUDP_CONTEXT_EVENT_ERROR: + break; + case SCE_RUDP_CONTEXT_EVENT_WRITABLE: + { + SQRNetworkPlayer *player = manager->GetPlayerFromRudpCtx(ctx_id); + // This event signifies that room has opened up in the write buffer, so attempt to send something + if( player ) + { + player->SendMoreInternal(); + } + else + { + SQRVoiceConnection* pVoice = SonyVoiceChat_Vita::GetVoiceConnectionFromRudpCtx(ctx_id); + assert(pVoice); + } + } + break; + case SCE_RUDP_CONTEXT_EVENT_READABLE: + if( manager->m_listener ) + { + SQRVoiceConnection* pVoice = SonyVoiceChat_Vita::GetVoiceConnectionFromRudpCtx(ctx_id); + if(pVoice) + { + pVoice->readRemoteData(); + } + else + { + 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 ) + { + SQRNetworkPlayer *playerFrom = manager->GetPlayerFromRudpCtx( ctx_id ); + if( playerFrom && !playerFrom->HasSmallIdConfirmed() ) + { + if( dataSize >= sizeof(SQRNetworkPlayer::InitSendData) ) + { + SQRNetworkPlayer::InitSendData ISD; + 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 + { + assert(false); + } + } + } + + if( dataSize > 0 ) + { + unsigned char *data = new unsigned char [ dataSize ]; + int bytesRead = playerIncomingData->ReadDataPacket( data, dataSize ); + if( bytesRead > 0 ) + { + SQRNetworkPlayer *playerFrom, *playerTo; + if( manager->m_isHosting ) + { + // Data always going from a remote player, to the host + playerFrom = manager->GetPlayerFromRudpCtx( ctx_id ); + playerTo = manager->m_aRoomSlotPlayers[0]; + } + else + { + // 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; + } + } + } + break; + case SCE_RUDP_CONTEXT_EVENT_FLUSHED: + break; + } +} + +// Implementation of CellRudpEventHandler +#ifdef __PS3__ +int SQRNetworkManager_Vita::RudpEventCallback(int event_id, int soc, uint8_t const *data, size_t datalen, struct sockaddr const *addr, socklen_t addrlen, void *arg) +#else +int SQRNetworkManager_Vita::RudpEventCallback(int event_id, int soc, uint8_t const *data, size_t datalen, struct SceNetSockaddr const *addr, SceNetSocklen_t addrlen, void *arg) +#endif +{ + SQRNetworkManager_Vita *manager = (SQRNetworkManager_Vita *)arg; + if( event_id == SCE_RUDP_EVENT_SOCKET_RELEASED ) + { + assert( soc == manager->m_soc ); + sceNetSocketClose(soc); + manager->m_soc = -1; + } + return 0; +} + +void SQRNetworkManager_Vita::NetCtlCallback(int eventType, void *arg) +{ + SQRNetworkManager_Vita *manager = (SQRNetworkManager_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 ) + { + manager->m_bLinkDisconnected = true; + manager->m_listener->HandleDisconnect(false); + } + else //if( event == CELL_NET_CTL_EVENT_ESTABLISH ) + { + manager->m_bLinkDisconnected = false; + } + +} + +// Called when the context has been created, and we are intending to create a room. +void SQRNetworkManager_Vita::ServerContextValid_CreateRoom() +{ + // First find a world + SetState(SNM_INT_STATE_HOSTING_CREATE_ROOM_SEARCHING_FOR_WORLD); + + SceNpMatching2GetWorldInfoListRequest reqParam; + + // Request parameters + memset(&reqParam, 0, sizeof(reqParam)); + reqParam.serverId = m_serverId; + + int ret = -1; + if( !ForceErrorPoint(SNM_FORCE_ERROR_GET_WORLD_INFO_LIST) ) + { + app.DebugPrintf("sceNpMatching2GetWorldInfoList\n"); + m_getWorldRequestId=0; + ret = sceNpMatching2GetWorldInfoList( m_matchingContext, &reqParam, NULL, &m_getWorldRequestId); + } + if (ret < 0) + { + SetState(SNM_INT_STATE_HOSTING_CREATE_ROOM_FAILED); + return; + } +} + +// Called when the context has been created, and we are intending to join a pre-existing room. +void SQRNetworkManager_Vita::ServerContextValid_JoinRoom() +{ + // assert( m_state == SNM_INT_STATE_JOINING_SERVER_SEARCH_CREATING_CONTEXT ); + + SetState(SNM_INT_STATE_JOINING_JOIN_ROOM); + + // Join the room, passing the local player mask as initial binary data so that the host knows what local players are here + SceNpMatching2JoinRoomRequest reqParam; + SceNpMatching2BinAttr binAttr; + memset(&reqParam, 0, sizeof(reqParam)); + memset(&binAttr, 0, sizeof(binAttr)); + binAttr.id = SCE_NP_MATCHING2_ROOMMEMBER_BIN_ATTR_INTERNAL_1_ID; + binAttr.ptr = &m_localPlayerJoinMask; + binAttr.size = sizeof(m_localPlayerJoinMask); + + reqParam.roomId = m_roomToJoin; + reqParam.roomMemberBinAttrInternalNum = 1; + reqParam.roomMemberBinAttrInternal = &binAttr; + + int ret = sceNpMatching2JoinRoom( m_matchingContext, &reqParam, NULL, &m_joinRoomRequestId ); + if ( (ret < 0) || ForceErrorPoint(SNM_FORCE_ERROR_JOIN_ROOM) ) + { + if( ret == SCE_NP_MATCHING2_SERVER_ERROR_NAT_TYPE_MISMATCH) + { + app.SetDisconnectReason( DisconnectPacket::eDisconnect_NATMismatch ); + } + SetState(SNM_INT_STATE_JOINING_JOIN_ROOM_FAILED); + } +} + +const SceNpCommunicationId* SQRNetworkManager_Vita::GetSceNpCommsId() +{ + return &s_npCommunicationId; +} + +const SceNpCommunicationSignature* SQRNetworkManager_Vita::GetSceNpCommsSig() +{ + return &s_npCommunicationSignature; +} + +const SceNpTitleId* SQRNetworkManager_Vita::GetSceNpTitleId() +{ + PSVITA_STUBBED; + return NULL; + // return &s_npTitleId; +} + +const SceNpTitleSecret* SQRNetworkManager_Vita::GetSceNpTitleSecret() +{ + PSVITA_STUBBED; + return NULL; + // return &s_npTitleSecret; +} + +int SQRNetworkManager_Vita::GetOldMask(SceNpMatching2RoomMemberId memberId) +{ + int oldMask = 0; + for( int i = 0; i < m_roomSyncData.getPlayerCount(); i++ ) + { + if( m_roomSyncData.players[i].m_roomMemberId == memberId ) + { + oldMask |= (1 << m_roomSyncData.players[i].m_localIdx); + } + } + return oldMask; +} + +int SQRNetworkManager_Vita::GetAddedMask(int newMask, int oldMask) +{ + return newMask & ~oldMask; +} + +int SQRNetworkManager_Vita::GetRemovedMask(int newMask, int oldMask) +{ + return oldMask & ~newMask; +} + + +void SQRNetworkManager_Vita::GetExtDataForRoom( SceNpMatching2RoomId roomId, void *extData, void (* FriendSessionUpdatedFn)(bool success, void *pParam), void *pParam ) +{ + static SceNpMatching2GetRoomDataExternalListRequest reqParam; + static SceNpMatching2RoomId aRoomId[1]; + static SceNpMatching2AttributeId attr[1]; + + // All parameters will be NULL if this is being called a second time, after creating a new matching context via one of the paths below (using GetMatchingContext). + // NULL parameters therefore basically represents an attempt to retry the last sceNpMatching2GetRoomDataExternalList + if( extData != NULL ) + { + aRoomId[0] = roomId; + attr[0] = SCE_NP_MATCHING2_ROOM_BIN_ATTR_EXTERNAL_1_ID; + + memset(&reqParam, 0, sizeof(reqParam)); + reqParam.roomId = aRoomId; + reqParam.roomIdNum = 1; + reqParam.attrIdNum = 1; + reqParam.attrId = attr; + + m_FriendSessionUpdatedFn = FriendSessionUpdatedFn; + m_pParamFriendSessionUpdated = pParam; + m_pExtDataToUpdate = extData; + } + + // Check there's a valid matching context and possibly recreate here + if( !GetMatchingContext(SNM_INT_STATE_IDLE_RECREATING_MATCHING_CONTEXT) ) + { + // No matching context, and failed to try and make one. We're really broken here. + m_FriendSessionUpdatedFn(false, m_pParamFriendSessionUpdated); + return; + } + + // Kicked off an asynchronous thing that will create a matching context, and then call this method back again (with NULL params) once done, so we can reattempt. Don't do anything more now. + if( m_state == SNM_INT_STATE_IDLE_RECREATING_MATCHING_CONTEXT ) + { + app.DebugPrintf("Having to recreate matching context, setting state to SNM_INT_STATE_IDLE_RECREATING_MATCHING_CONTEXT\n"); + return; + } + + int ret = sceNpMatching2GetRoomDataExternalList( m_matchingContext, &reqParam, NULL, &m_roomDataExternalListRequestId ); + + // If we hadn't properly detected that a matching context was unvailable, we might still get an error indicating that it is from the previous call. Handle similarly, but we need + // to destroy the context first. + if( ret == SCE_NP_MATCHING2_ERROR_CONTEXT_NOT_STARTED ) // Also checking for this as a means of simulating the previous error + { + sceNpMatching2DestroyContext(m_matchingContext); + m_matchingContextValid = false; + if( !GetMatchingContext(SNM_INT_STATE_IDLE_RECREATING_MATCHING_CONTEXT) ) + { + // No matching context, and failed to try and make one. We're really broken here. + m_FriendSessionUpdatedFn(false, m_pParamFriendSessionUpdated); + return; + }; + // Kicked off an asynchronous thing that will create a matching context, and then call this method back again (with NULL params) once done, so we can reattempt. Don't do anything more now. + if( m_state == SNM_INT_STATE_IDLE_RECREATING_MATCHING_CONTEXT ) + { + return; + } + } + + if( ret != 0 ) + { + m_FriendSessionUpdatedFn(false, m_pParamFriendSessionUpdated); + } +} + + +#ifdef _CONTENT_PACKAGE +bool SQRNetworkManager_Vita::ForceErrorPoint(eSQRForceError error) +{ + return false; +} +#else +bool SQRNetworkManager_Vita::aForceError[SNM_FORCE_ERROR_COUNT] = +{ + false, // SNM_FORCE_ERROR_NP2_INIT + false, // SNM_FORCE_ERROR_NET_INITIALIZE_NETWORK + false, // SNM_FORCE_ERROR_NET_CTL_INIT + false, // SNM_FORCE_ERROR_RUDP_INIT + false, // SNM_FORCE_ERROR_NET_START_DIALOG + false, // SNM_FORCE_ERROR_MATCHING2_INIT + false, // SNM_FORCE_ERROR_REGISTER_NP_CALLBACK + false, // SNM_FORCE_ERROR_GET_NPID + false, // SNM_FORCE_ERROR_CREATE_MATCHING_CONTEXT + false, // SNM_FORCE_ERROR_REGISTER_CALLBACKS + false, // SNM_FORCE_ERROR_CONTEXT_START_ASYNC + false, // SNM_FORCE_ERROR_SET_EXTERNAL_ROOM_DATA + false, // SNM_FORCE_ERROR_GET_FRIEND_LIST_ENTRY_COUNT + false, // SNM_FORCE_ERROR_GET_FRIEND_LIST_ENTRY + false, // SNM_FORCE_ERROR_GET_USER_INFO_LIST + false, // SNM_FORCE_ERROR_LEAVE_ROOM + false, // SNM_FORCE_ERROR_SET_ROOM_MEMBER_DATA_INTERNAL + false, // SNM_FORCE_ERROR_SET_ROOM_MEMBER_DATA_INTERNAL2 + false, // SNM_FORCE_ERROR_CREATE_SERVER_CONTEXT + false, // SNM_FORCE_ERROR_CREATE_JOIN_ROOM + false, // SNM_FORCE_ERROR_GET_SERVER_INFO + false, // SNM_FORCE_ERROR_DELETE_SERVER_CONTEXT + false, // SNM_FORCE_ERROR_SETSOCKOPT_0 + false, // SNM_FORCE_ERROR_SETSOCKOPT_1 + false, // SNM_FORCE_ERROR_SETSOCKOPT_2 + false, // SNM_FORCE_ERROR_SOCK_BIND + false, // SNM_FORCE_ERROR_CREATE_RUDP_CONTEXT + false, // SNM_FORCE_ERROR_RUDP_BIND + false, // SNM_FORCE_ERROR_RUDP_INIT2 + false, // SNM_FORCE_ERROR_GET_ROOM_EXTERNAL_DATA + false, // SNM_FORCE_ERROR_GET_SERVER_INFO_DATA + false, // SNM_FORCE_ERROR_GET_WORLD_INFO_DATA + false, // SNM_FORCE_ERROR_GET_CREATE_JOIN_ROOM_DATA + false, // SNM_FORCE_ERROR_GET_USER_INFO_LIST_DATA + false, // SNM_FORCE_ERROR_GET_JOIN_ROOM_DATA + false, // SNM_FORCE_ERROR_GET_ROOM_MEMBER_DATA_INTERNAL + false, // SNM_FORCE_ERROR_GET_ROOM_EXTERNAL_DATA2 + false, // SNM_FORCE_ERROR_CREATE_SERVER_CONTEXT_CALLBACK + false, // SNM_FORCE_ERROR_SET_ROOM_DATA_CALLBACK + false, // SNM_FORCE_ERROR_UPDATED_ROOM_DATA + false, // SNM_FORCE_ERROR_UPDATED_ROOM_MEMBER_DATA_INTERNAL1 + false, // SNM_FORCE_ERROR_UPDATED_ROOM_MEMBER_DATA_INTERNAL2 + false, // SNM_FORCE_ERROR_UPDATED_ROOM_MEMBER_DATA_INTERNAL3 + false, // SNM_FORCE_ERROR_UPDATED_ROOM_MEMBER_DATA_INTERNAL4 + false, // SNM_FORCE_ERROR_GET_WORLD_INFO_LIST + false, // SNM_FORCE_ERROR_JOIN_ROOM +}; + +bool SQRNetworkManager_Vita::ForceErrorPoint(eSQRForceError err) +{ + return aForceError[err]; +} +#endif + +void SQRNetworkManager_Vita::AttemptPSNSignIn(int (*SignInCompleteCallbackFn)(void *pParam, bool bContinue, int pad), void *pParam, bool callIfFailed/*=false*/) +{ + if(CGameNetworkManager::usingAdhocMode()) + { + SQRNetworkManager_AdHoc_Vita::AttemptPSNSignIn(SignInCompleteCallbackFn, pParam, callIfFailed); + return; + } + s_SignInCompleteCallbackFn = SignInCompleteCallbackFn; + s_signInCompleteCallbackIfFailed = callIfFailed; + s_SignInCompleteParam = pParam; + + SceNetCheckDialogParam param; + memset(¶m, 0x00, sizeof(param)); + sceNetCheckDialogParamInit(¶m); + 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 ) + { + //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_Vita::SetRichPresence(const void *data) +{ + const sce::Toolkit::NP::PresenceDetails *newPresenceInfo = (const sce::Toolkit::NP::PresenceDetails *)data; + + s_lastPresenceInfo.status = newPresenceInfo->status; + // s_lastPresenceInfo.userInfo = newPresenceInfo->userInfo; + s_lastPresenceInfo.presenceType = SCE_NP_BASIC_IN_GAME_PRESENCE_TYPE_DEFAULT; + + s_presenceStatusDirty = true; + 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; +} + +void SQRNetworkManager_Vita::UpdateRichPresenceCustomData(void *data, unsigned int dataBytes) +{ + assert(dataBytes <= SCE_NP_BASIC_IN_GAME_PRESENCE_DATA_SIZE_MAX ); + memcpy(s_lastPresenceInfo.data, data, dataBytes); + s_lastPresenceInfo.size = dataBytes; + + s_presenceStatusDirty = true; + 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() +{ + if( s_resendPresenceCountdown ) + { + s_resendPresenceCountdown--; + if( s_resendPresenceCountdown == 0 ) + { + SendLastPresenceInfo(); + } + } +} + +void SQRNetworkManager_Vita::SendLastPresenceInfo() +{ + // Don't attempt to send if we are already waiting to resend + if( s_resendPresenceCountdown ) return; + + // MGH - On Vita, change this to use SCE_NP_BASIC_IN_GAME_PRESENCE_TYPE_GAME_JOINING at some point + + // On PS4 we can't set the status and the data at the same time + if( s_presenceStatusDirty == false) + { + return; // nothing to be done. + } + + int err = 0; + // check if we're connected to the PSN first + if(ProfileManager.IsSignedInLive(0))//ProfileManager.getQuadrant(s_lastPresenceInfo.userInfo.userId))) + { + s_lastPresenceInfo.presenceType = SCE_NP_BASIC_IN_GAME_PRESENCE_TYPE_DEFAULT; + // MGH - if we have data being sent, that means we're in an online game, so let others join from our presence info on the XMB + if(s_lastPresenceInfo.size > 0 ) + { + // make sure it's not an invite only game + PresenceSyncInfo *pso = (PresenceSyncInfo *)s_lastPresenceInfo.data; + if(!pso->inviteOnly) + { + s_lastPresenceInfo.presenceType = SCE_NP_BASIC_IN_GAME_PRESENCE_TYPE_GAME_JOINING; + } + } + err = sce::Toolkit::NP::Presence::Interface::setPresence(&s_lastPresenceInfo); + } + + if( err != SCE_TOOLKIT_NP_SUCCESS ) + { + s_resendPresenceCountdown = (20 * 65); // Bit over a minute before attempting to resend, we should get a new token every minute + } + else + { + s_presenceStatusDirty = false; + } +} + +void SQRNetworkManager_Vita::SetPresenceFailedCallback() +{ + s_presenceStatusDirty = true; + s_resendPresenceCountdown = (20 * 65); // Bit over a minute before attempting to resend, we should get a new token every minute +} + +void SQRNetworkManager_Vita::SetPresenceDataStartHostingGame() +{ + if( m_offlineGame ) + { + SQRNetworkManager_Vita::UpdateRichPresenceCustomData(&c_presenceSyncInfoNULL, sizeof(SQRNetworkManager_Vita::PresenceSyncInfo) ); + } + else + { + SQRNetworkManager_Vita::PresenceSyncInfo presenceInfo; + CPlatformNetworkManagerSony::SetSQRPresenceInfoFromExtData( &presenceInfo, m_joinExtData, m_room, m_serverId ); + SQRNetworkManager_Vita::UpdateRichPresenceCustomData(&presenceInfo, sizeof(SQRNetworkManager_Vita::PresenceSyncInfo) ); + // OrbisNPToolkit::createNPSession(); + } +} + +int SQRNetworkManager_Vita::GetJoiningReadyPercentage() +{ + if ( (m_state == SNM_INT_STATE_HOSTING_SEARCHING_FOR_SERVER) || (m_state == SNM_INT_STATE_JOINING_SEARCHING_FOR_SERVER) ) + { + int completed = ( m_totalServerCount - m_serverCount ) - 1; + int pc = ( completed * 100 ) / m_totalServerCount; + if( pc < 0 ) pc = 0; + if( pc > 100 ) pc = 100; + return pc; + } + else + { + return 100; + } +} + +void SQRNetworkManager_Vita::removePlayerFromVoiceChat( SQRNetworkPlayer* pPlayer ) +{ + if(pPlayer->IsLocal()) + { + SonyVoiceChat_Vita::disconnectLocalPlayer(pPlayer->GetLocalPlayerIndex()); + } + else + { + int numRemotePlayersLeft = 0; + for( int i = 0; i < MAX_ONLINE_PLAYER_COUNT; i++ ) + { + if( m_aRoomSlotPlayers[i] ) + { + if( m_aRoomSlotPlayers[i] != pPlayer ) + { + if(m_aRoomSlotPlayers[i]->m_roomMemberId == pPlayer->m_roomMemberId) + numRemotePlayersLeft++; + } + } + } + if(numRemotePlayersLeft == 0) + { + // no players left on the remote machine once we remove this one + SQRVoiceConnection* pVoice = SonyVoiceChat_Vita::getVoiceConnectionFromRoomMemberID(pPlayer->m_roomMemberId); + if(pVoice) + SonyVoiceChat_Vita::disconnectRemoteConnection(pVoice); + } + } +} + + +SQRNetworkPlayer *SQRNetworkManager_Vita::GetPlayerByXuid(PlayerUID xuid) +{ + EnterCriticalSection(&m_csRoomSyncData); + for( int i = 0; i < m_roomSyncData.getPlayerCount(); i++ ) + { + if( m_roomSyncData.players[i].m_UID == xuid ) + { + SQRNetworkPlayer *player = GetPlayerIfReady(m_aRoomSlotPlayers[i]); + LeaveCriticalSection(&m_csRoomSyncData); + return player; + } + } + LeaveCriticalSection(&m_csRoomSyncData); + return NULL; +} + diff --git a/Minecraft.Client/PSVita/Network/SQRNetworkManager_Vita.h b/Minecraft.Client/PSVita/Network/SQRNetworkManager_Vita.h new file mode 100644 index 00000000..0fd0b414 --- /dev/null +++ b/Minecraft.Client/PSVita/Network/SQRNetworkManager_Vita.h @@ -0,0 +1,325 @@ +#pragma once +#include +#include +#include +#include + +#include + +#include + +#include "..\..\Common\Network\Sony\SQRNetworkManager.h" + +class SQRNetworkPlayer; +class ISQRNetworkManagerListener; +class SonyVoiceChat_Vita; +class SQRVoiceConnection; +class C4JThread; + +// This is the lowest level manager for providing network functionality on Sony platforms. This manages various network activities including the players within a gaming session. +// The game shouldn't directly use this class, it is here to provide functionality required by PlatformNetworkManagerSony. + +class SQRNetworkManager_Vita : public SQRNetworkManager +{ + friend class SonyVoiceChat_Vita; + friend class SQRNetworkPlayer; + + static const eSQRNetworkManagerState m_INTtoEXTStateMappings[SNM_INT_STATE_COUNT]; + +public: + SQRNetworkManager_Vita(ISQRNetworkManagerListener *listener); + + // General + void Tick(); + void Initialise(); + bool IsInitialised(); + void UnInitialise(); + void Terminate(); + eSQRNetworkManagerState GetState(); + bool IsHost(); + bool IsReadyToPlayOrIdle(); + bool IsInSession(); + + // Session management + void CreateAndJoinRoom(int hostIndex, int localPlayerMask, void *extData, int extDataSize, bool offline); + void UpdateExternalRoomData(); + bool FriendRoomManagerIsBusy(); + bool FriendRoomManagerSearch(); + bool FriendRoomManagerSearch2(); + int FriendRoomManagerGetCount(); + void FriendRoomManagerGetRoomInfo(int idx, SessionSearchResult *searchResult); + bool JoinRoom(SessionSearchResult *searchResult, int localPlayerMask); + bool JoinRoom(SceNpMatching2RoomId roomId, SceNpMatching2ServerId serverId, int localPlayerMask, const SQRNetworkManager_Vita::PresenceSyncInfo *presence); + void StartGame(); + void LeaveRoom(bool bActuallyLeaveRoom); + void EndGame(); + bool SessionHasSpace(int spaceRequired); + bool AddLocalPlayerByUserIndex(int idx); + bool RemoveLocalPlayerByUserIndex(int idx); + void SendInviteGUI(); + static void RecvInviteGUI(); + void TickInviteGUI(); + + + + // void GetInviteDataAndProcess(SceNpBasicAttachmentDataId id); + static bool UpdateInviteData(SQRNetworkManager_Vita::PresenceSyncInfo *invite); + void GetExtDataForRoom( SceNpMatching2RoomId roomId, void *extData, void (* FriendSessionUpdatedFn)(bool success, void *pParam), void *pParam ); + + // Player retrieval + int GetPlayerCount(); + int GetOnlinePlayerCount(); + SQRNetworkPlayer *GetPlayerByIndex(int idx); + SQRNetworkPlayer *GetPlayerBySmallId(int idx); + SQRNetworkPlayer *GetLocalPlayerByUserIndex(int idx); + SQRNetworkPlayer *GetPlayerByXuid(PlayerUID xuid); + SQRNetworkPlayer *GetHostPlayer(); + + void removePlayerFromVoiceChat(SQRNetworkPlayer* pPlayer); + // Communication parameter storage + static const SceNpCommunicationId* GetSceNpCommsId(); + static const SceNpCommunicationSignature* GetSceNpCommsSig(); + static const SceNpTitleId* GetSceNpTitleId(); + static const SceNpTitleSecret* GetSceNpTitleSecret(); + + static void GetInviteDataAndProcess(sce::Toolkit::NP::MessageAttachment* pInvite); + static void GetJoinablePresenceDataAndProcess(SceAppUtilNpBasicJoinablePresenceParam* pJoinablePresenceData); + static void ProcessJoinablePresenceData(); + static void TickJoinablePresenceData(); + + static int PSNSignInReturnedPresenceInvite(void* pParam, bool bContinue, int iPad); + + + static bool m_bJoinablePresenceWaitingForOnline; + static SceAppUtilNpBasicJoinablePresenceParam m_joinablePresenceParam; + static bool m_bSendingInviteMessage; + +private: + void InitialiseAfterOnline(); + void ErrorHandlingTick(); + void UpdateOnlineStatus(int status) { m_onlineStatus = status; } + int GetOnlineStatus() { return m_onlineStatus; } + + ISQRNetworkManagerListener *m_listener; + SQRNetworkPlayer *GetPlayerIfReady(SQRNetworkPlayer *player); + + // Internal state + void SetState(eSQRNetworkManagerInternalState state); + void ResetToIdle(); + eSQRNetworkManagerInternalState m_state; + eSQRNetworkManagerState m_stateExternal; + bool m_nextIdleReasonIsFull; + bool m_isHosting; + SceNpMatching2RoomMemberId m_localMemberId; + SceNpMatching2RoomMemberId m_hostMemberId; // if we're not the host + int m_localPlayerCount; + int m_localPlayerJoined; // Client only, keep a count of how many local players we have confirmed as joined to the application + SceNpMatching2RoomId m_room; + unsigned char m_currentSmallId; + int m_soc; + bool m_offlineGame; + bool m_offlineSQR; + int m_resendExternalRoomDataCountdown; + bool m_matching2initialised; + PresenceSyncInfo m_inviteReceived[MAX_SIMULTANEOUS_INVITES]; + int m_inviteIndex; + static PresenceSyncInfo *m_gameBootInvite; + static PresenceSyncInfo m_gameBootInvite_data; + bool m_doBootInviteCheck; + bool m_isInSession; + // static SceNpBasicAttachmentDataId s_lastInviteIdToRetry; + int m_onlineStatus; + bool m_bLinkDisconnected; + + +private: + + CRITICAL_SECTION m_csRoomSyncData; + RoomSyncData m_roomSyncData; + void *m_joinExtData; + int m_joinExtDataSize; + + std::vector m_vecTempPlayers; + SQRNetworkPlayer *m_aRoomSlotPlayers[MAX_ONLINE_PLAYER_COUNT]; // Maps from the players in m_roomSyncData, to SQRNetworkPlayers + void FindOrCreateNonNetworkPlayer(int slot, int playerType, SceNpMatching2RoomMemberId memberId, int localPlayerIdx, int smallId); + + void MapRoomSlotPlayers(int roomSlotPlayerCount =-1); + void UpdateRoomSyncUIDsFromPlayers(); + void UpdatePlayersFromRoomSyncUIDs(); + void LocalDataSend(SQRNetworkPlayer *playerFrom, SQRNetworkPlayer *playerTo, const void *data, unsigned int dataSize); + int GetSessionIndex(SQRNetworkPlayer *player); + + bool AddRemotePlayersAndSync( SceNpMatching2RoomMemberId memberId, int playerMask, bool *isFull = NULL ); + void RemoveRemotePlayersAndSync( SceNpMatching2RoomMemberId memberId, int mask ); + void RemoveNetworkPlayers( int mask ); + void SetLocalPlayersAndSync(); + void SyncRoomData(); + SceNpMatching2RequestId m_setRoomDataRequestId; + SceNpMatching2RequestId m_setRoomIntDataRequestId; + SceNpMatching2RequestId m_roomExtDataRequestId; + + // Server context management + bool GetMatchingContext(eSQRNetworkManagerInternalState asyncState); + bool GetServerContext(); + bool GetServerContext_AdHoc(); + bool GetServerContext2(); + bool GetServerContext(SceNpMatching2ServerId serverId); + void DeleteServerContext(); + bool SelectRandomServer(); + void ServerContextTick(); + int m_totalServerCount; + int m_serverCount; + SceNpMatching2ServerId *m_aServerId; + SceNpMatching2ServerId m_serverId; + bool m_serverContextValid; + SceNpMatching2RequestId m_serverSearchRequestId; + SceNpMatching2RequestId m_serverContextRequestId; + + // Room creation management + SceNpMatching2RequestId m_getWorldRequestId; + SceNpMatching2RequestId m_createRoomRequestId; + SceNpMatching2WorldId m_worldId; + void RoomCreateTick(); + + // Room joining management + SceNpMatching2RoomId m_roomToJoin; + int m_localPlayerJoinMask; + SceNpMatching2RequestId m_joinRoomRequestId; + SceNpMatching2RequestId m_kickRequestId; + + // Room leaving management + SceNpMatching2RequestId m_leaveRoomRequestId; + + // Adding extra network players management + SceNpMatching2RequestId m_setRoomMemberInternalDataRequestId; + + // Player state management + void NetworkPlayerConnectionComplete(SQRNetworkPlayer *player); + void NetworkPlayerSmallIdAllocated(SQRNetworkPlayer *player, unsigned char smallId); + void NetworkPlayerInitialDataReceived(SQRNetworkPlayer *player,void *data); + void NonNetworkPlayerComplete(SQRNetworkPlayer *player, unsigned char smallId); + void HandlePlayerJoined(SQRNetworkPlayer *player); + CRITICAL_SECTION m_csPlayerState; + + // State and thread for managing basic event type messages + C4JThread *m_basicEventThread; +// SceKernelEqueue m_basicEventQueue; + static int BasicEventThreadProc( void *lpParameter); + + // State and storage for managing search for friends' games + eSQRNetworkManagerFriendSearchState m_friendSearchState; + SceNpMatching2ContextId m_matchingContext; + bool m_matchingContextValid; + SceNpMatching2RequestId m_friendSearchRequestId; + unsigned int m_friendCount; + C4JThread *m_getFriendCountThread; + static int GetFriendsThreadProc( void* lpParameter ); + void FriendSearchTick(); + SceNpMatching2RequestId m_roomDataExternalListRequestId; + void (* m_FriendSessionUpdatedFn)(bool success, void *pParam); + void *m_pParamFriendSessionUpdated; + void *m_pExtDataToUpdate; + + // Results from searching for rooms that friends are playing in - 5 matched arrays to store their NpIds, rooms, servers, whether a room was found, and whether the external data had been received for the room. Also a count of how many elements are used in this array. + class FriendSearchResult + { + public: + SceNpId m_NpId; + SceNpMatching2RoomId m_RoomId; + SceNpMatching2ServerId m_ServerId; + bool m_RoomFound; + void *m_RoomExtDataReceived; + }; + std::vector m_aFriendSearchResults; + + // Rudp management and local players + std::unordered_map m_RudpCtxToPlayerMap; + + std::unordered_map m_NetAddrToVoiceConnectionMap; + + bool CreateRudpConnections(SceNpMatching2RoomId roomId, SceNpMatching2RoomMemberId peerMemberId, int playerMask, SceNpMatching2RoomMemberId playersPeerMemberId); + bool CreateVoiceRudpConnections(SceNpMatching2RoomId roomId, SceNpMatching2RoomMemberId peerMemberId, int playerMask); + bool CreateSocket(); + SQRNetworkPlayer *GetPlayerFromRudpCtx(int rudpCtx); + SQRVoiceConnection* GetVoiceConnectionFromRudpCtx(int rudpCtx); + + SQRNetworkPlayer *GetPlayerFromRoomMemberAndLocalIdx(int roomMember, int localIdx); + SceNpMatching2RequestId m_roomMemberDataRequestId; + + // Callbacks (for matching) + bool RegisterCallbacks(); + static void ContextCallback(SceNpMatching2ContextId id, SceNpMatching2Event event, SceNpMatching2EventCause eventCause, int errorCode, void *arg); + // #ifdef __PS3__ + // static void DefaultRequestCallback(SceNpMatching2ContextId id, SceNpMatching2RequestId reqId, SceNpMatching2Event event, SceNpMatching2EventKey eventKey, int errorCode, size_t dataSize, void *arg); + // static void RoomEventCallback(SceNpMatching2ContextId id, SceNpMatching2RoomId roomId, SceNpMatching2Event event, SceNpMatching2EventKey eventKey, int errorCode, size_t dataSize, void *arg); + // #else + static void DefaultRequestCallback(SceNpMatching2ContextId id, SceNpMatching2RequestId reqId, SceNpMatching2Event event, int errorCode, const void *data, void *arg); + static void RoomEventCallback(SceNpMatching2ContextId id, SceNpMatching2RoomId roomId, SceNpMatching2Event event, const void *data, void *arg); + // #endif + static void SignallingCallback(SceNpMatching2ContextId ctxId, SceNpMatching2RoomId roomId, SceNpMatching2RoomMemberId peerMemberId, SceNpMatching2Event event, int error_code, void *arg); + + // Callback for NpBasic + static int BasicEventCallback(int event, int retCode, uint32_t reqId, void *arg); + + // Callback for NpManager + static void ManagerCallback(int event, int result, void *arg); + + // Callback for sys util + static void SysUtilCallback(uint64_t status, uint64_t param, void *userdata); + void updateNetCheckDialog(); // get the status of the dialog and run any callbacks needed + + // Callbacks for rudp + static void RudpContextCallback(int ctx_id, int event_id, int error_code, void *arg); + static int RudpEventCallback(int event_id, int soc, uint8_t const *data, size_t datalen, struct SceNetSockaddr const *addr, SceNetSocklen_t addrlen, void *arg); + + // Callback for netctl + static void NetCtlCallback(int eventType, void *arg); + + // Methods to be called when the server context has been created + void ServerContextValid_CreateRoom(); + void ServerContextValid_JoinRoom(); + + // Mask utilities + int GetOldMask(SceNpMatching2RoomMemberId memberId); + int GetAddedMask(int newMask, int oldMask); + int GetRemovedMask(int newMask, int oldMask); + +#ifndef _CONTENT_PACKAGE + static bool aForceError[SNM_FORCE_ERROR_COUNT]; +#endif + bool ForceErrorPoint(eSQRForceError err); + +public: + static void AttemptPSNSignIn(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; + + static int SetRichPresence(const void *data); + void SetPresenceDataStartHostingGame(); + 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(); + static void SendLastPresenceInfo(); + void OnlineCheck(); + + static sce::Toolkit::NP::PresenceDetails s_lastPresenceInfo; + static int s_resendPresenceCountdown; + static bool s_presenceStatusDirty; + static PresenceSyncInfo s_lastPresenceSyncInfo; + static PresenceSyncInfo c_presenceSyncInfoNULL; + static bool b_inviteRecvGUIRunning; + // 4J-PB - so we can stop the crash when Iggy's LoadMovie is called from the ContextCallback + static bool m_bCallPSNSignInCallback; + // Debug + static long long s_roomStartTime; + + int m_hid; + bool m_bIsInitialised; + bool m_bShuttingDown; +}; + diff --git a/Minecraft.Client/PSVita/Network/SonyCommerce_Vita.cpp b/Minecraft.Client/PSVita/Network/SonyCommerce_Vita.cpp new file mode 100644 index 00000000..09852ccb --- /dev/null +++ b/Minecraft.Client/PSVita/Network/SonyCommerce_Vita.cpp @@ -0,0 +1,1544 @@ +#include "stdafx.h" + +#include "SonyCommerce_Vita.h" +#include "ShutdownManager.h" +#include +#include +#include + +bool SonyCommerce_Vita::m_bCommerceInitialised = false; +// SceNpCommerce2SessionInfo SonyCommerce_Vita::m_sessionInfo; +SonyCommerce_Vita::State SonyCommerce_Vita::m_state = e_state_noSession; +int SonyCommerce_Vita::m_errorCode = 0; +LPVOID SonyCommerce_Vita::m_callbackParam = NULL; + +void* SonyCommerce_Vita::m_receiveBuffer = NULL; +SonyCommerce_Vita::Event SonyCommerce_Vita::m_event; +std::queue SonyCommerce_Vita::m_messageQueue; +std::vector* SonyCommerce_Vita::m_pProductInfoList = NULL; +SonyCommerce_Vita::ProductInfoDetailed* SonyCommerce_Vita::m_pProductInfoDetailed = NULL; +SonyCommerce_Vita::ProductInfo* SonyCommerce_Vita::m_pProductInfo = NULL; + +SonyCommerce_Vita::CategoryInfo* SonyCommerce_Vita::m_pCategoryInfo = NULL; +const char* SonyCommerce_Vita::m_pProductID = NULL; +char* SonyCommerce_Vita::m_pCategoryID = NULL; +SonyCommerce_Vita::CheckoutInputParams SonyCommerce_Vita::m_checkoutInputParams; +SonyCommerce_Vita::DownloadListInputParams SonyCommerce_Vita::m_downloadInputParams; + +SonyCommerce_Vita::CallbackFunc SonyCommerce_Vita::m_callbackFunc = NULL; +// sys_memory_container_t SonyCommerce_Vita::m_memContainer = SYS_MEMORY_CONTAINER_ID_INVALID; +bool SonyCommerce_Vita::m_bUpgradingTrial = false; + +SonyCommerce_Vita::CallbackFunc SonyCommerce_Vita::m_trialUpgradeCallbackFunc; +LPVOID SonyCommerce_Vita::m_trialUpgradeCallbackParam; + +CRITICAL_SECTION SonyCommerce_Vita::m_queueLock; + +uint32_t SonyCommerce_Vita::m_contextId=0; ///< The npcommerce2 context ID +bool SonyCommerce_Vita::m_contextCreated=false; ///< npcommerce2 context ID created? +SonyCommerce_Vita::Phase SonyCommerce_Vita::m_currentPhase = e_phase_stopped; ///< Current commerce2 util +// char SonyCommerce_Vita::m_commercebuffer[SCE_NP_COMMERCE2_RECV_BUF_SIZE]; + +C4JThread* SonyCommerce_Vita::m_tickThread = NULL; +bool SonyCommerce_Vita::m_bLicenseChecked=false; // Check the trial/full license for the game +bool SonyCommerce_Vita::m_bLicenseInstalled=false; // set to true when the licence has been downloaded and installed (but maybe not checked yet) +bool SonyCommerce_Vita::m_bDownloadsPending=false; // set to true if there are any downloads happening in the background, so we check for them completing, and install when finished +bool SonyCommerce_Vita::m_bDownloadsReady=false; // set to true if there are any downloads ready to install +bool SonyCommerce_Vita::m_bInstallingContent=false; // set to true while new content is being installed, so we don't fire it mulitple times +int SonyCommerce_Vita::m_iClearDLCCountdown=0; // tick for a set number of frames before clearing the DLC, as sometimes it doesn't register as being installed in time +bool SonyCommerce_Vita::m_bPurchasabilityUpdated=false; // set to when any purchase flags change +SonyCommerce_Vita::Message SonyCommerce_Vita::m_lastMessage; + +sce::Toolkit::NP::Utilities::Future > g_productList; +sce::Toolkit::NP::Utilities::Future g_categoryInfo; +sce::Toolkit::NP::Utilities::Future g_detailedProductInfo; + +//sce::Toolkit::NP::Utilities::Future g_bgdlStatus; +static bool s_showingPSStoreIcon = false; + + +SonyCommerce_Vita::ProductInfoDetailed s_trialUpgradeProductInfoDetailed; +void SonyCommerce_Vita::Delete() +{ + m_pProductInfoList=NULL; + m_pProductInfoDetailed=NULL; + m_pProductInfo=NULL; + m_pCategoryInfo = NULL; + m_pProductID = NULL; + m_pCategoryID = NULL; +} + +void SonyCommerce_Vita::Init() +{ + assert(m_state == e_state_noSession); + if(!m_bCommerceInitialised) + { + m_bCommerceInitialised = true; + m_pCategoryID=(char *)malloc(sizeof(char) * 100); + InitializeCriticalSection(&m_queueLock); + m_bLicenseInstalled = false; + m_bDownloadsPending = false; + m_bDownloadsReady = false; + + } +} + + + +void SonyCommerce_Vita::CheckForTrialUpgradeKey_Callback(LPVOID param, bool bFullVersion) +{ + ProfileManager.SetFullVersion(bFullVersion); + if(ProfileManager.IsFullVersion()) + { + StorageManager.SetSaveDisabled(false); + ConsoleUIController::handleUnlockFullVersionCallback(); + // licence has been checked, so we're ok to install the trophies now + // ProfileManager.InitialiseTrophies( SQRNetworkManager_Vita::GetSceNpCommsId(), + // SQRNetworkManager_Vita::GetSceNpCommsSig()); + // + } + m_bLicenseChecked=true; + m_bLicenseInstalled = bFullVersion; +} + +bool SonyCommerce_Vita::LicenseChecked() +{ + return m_bLicenseChecked; +} + +void SonyCommerce_Vita::CheckForTrialUpgradeKey() +{ + StorageManager.CheckForTrialUpgradeKey(CheckForTrialUpgradeKey_Callback, NULL); +} + +int SonyCommerce_Vita::Shutdown() +{ + int ret=0; + if (m_contextCreated) + { + m_contextId = 0; + m_contextCreated = false; + } + + m_bCommerceInitialised = false; + delete m_pCategoryID; + DeleteCriticalSection(&m_queueLock); + + return ret; +} + +void SonyCommerce_Vita::InstallContentCallback(LPVOID lpParam,int err) +{ + m_iClearDLCCountdown = 30; + m_bInstallingContent = false; + if(m_bLicenseInstalled && !ProfileManager.IsFullVersion()) + app.GetCommerce()->CheckForTrialUpgradeKey(); +} + +void SonyCommerce_Vita::checkBackgroundDownloadStatus() +{ + if( m_bInstallingContent ) + return; + + Future status; + int ret = sce::Toolkit::NP::Commerce::Interface::getBgdlStatus(&status, false); + if(ret == SCE_OK) + { + bool bInstallContent = false; + // check for the license having been downloaded first + if(!m_bLicenseInstalled && status.get()->licenseReady) + { + m_bLicenseInstalled = true; + bInstallContent = true; + } + + // and now any additional content + m_bDownloadsReady = (status.get()->addcontNumReady > 0); + + if(m_bDownloadsReady) + bInstallContent = true; + // and if there are any downloads still pending, we'll call this function again + m_bDownloadsPending = (status.get()->addcontNumNotReady > 0); + + // install the content + if(bInstallContent) + { + InstallContent(InstallContentCallback, NULL); + } + } +} + +int SonyCommerce_Vita::TickLoop(void* lpParam) +{ + ShutdownManager::HasStarted(ShutdownManager::eCommerceThread); + while( (m_currentPhase != e_phase_stopped) && ShutdownManager::ShouldRun(ShutdownManager::eCommerceThread) ) + { + processEvent(); + processMessage(); + Sleep(16); // sleep for a frame + //((SonyCommerce_Vita*)app.GetCommerce())->Test(); + if(m_bDownloadsPending || m_bDownloadsReady) + { + checkBackgroundDownloadStatus(); + } + if(m_iClearDLCCountdown > 0) // tick for a set number of frames before clearing the DLC, as sometimes it doesn't register as being installed in time + { + m_iClearDLCCountdown--; + if(m_iClearDLCCountdown == 0) + { + app.ClearDLCInstalled(); + 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); + } + + } + } + ShutdownManager::HasFinished(ShutdownManager::eCommerceThread); + + return 0; +} + +void SonyCommerce_Vita::copyProductList(std::vector* pProductList, std::vector* pNPProductList) +{ + ProductInfo tempInfo; + std::vector tempProductVec; + // Reserve some space + int numProducts = pNPProductList->size(); + tempProductVec.reserve(numProducts); + for(int i=0;iat(i); + + // reset tempInfo + memset(&tempInfo, 0x0, sizeof(tempInfo)); + strncpy(tempInfo.productId, npInfo.productId, SCE_NP_COMMERCE2_PRODUCT_ID_LEN); + strncpy(tempInfo.productName, npInfo.productName, SCE_NP_COMMERCE2_PRODUCT_NAME_LEN); + strncpy(tempInfo.shortDescription, npInfo.shortDescription, SCE_NP_COMMERCE2_PRODUCT_SHORT_DESCRIPTION_LEN); + strcpy(tempInfo.longDescription,"Missing long description"); + strncpy(tempInfo.spName, npInfo.spName, SCE_NP_COMMERCE2_SP_NAME_LEN); + strncpy(tempInfo.imageUrl, npInfo.imageUrl, SCE_NP_COMMERCE2_URL_LEN); + tempInfo.releaseDate = npInfo.releaseDate; + tempInfo.purchasabilityFlag = npInfo.purchasabilityFlag; + m_bPurchasabilityUpdated = true; + // Take out the price. Nicely formatted + // but also keep the price as a value in case it's 0 - we need to show "free" for that + tempInfo.ui32Price = -1;// not available here + strncpy(tempInfo.price, npInfo.price, SCE_TOOLKIT_NP_SKU_PRICE_LEN); + tempProductVec.push_back(tempInfo); + } + pNPProductList->clear(); // clear the vector now we're done, this doesn't happen automatically for the next query + + // Set our result + *pProductList = tempProductVec; +} + +int SonyCommerce_Vita::getProductList(std::vector* productList, char *categoryId) +{ + int ret; + sce::Toolkit::NP::ProductListInputParams params; + int userId = ProfileManager.getUserID(ProfileManager.GetPrimaryPad()); + +// params.userInfo.userId = userId; + strcpy(params.categoryId, categoryId); + params.serviceLabel = 0; + app.DebugPrintf("Getting Product List ...\n"); + + ret = sce::Toolkit::NP::Commerce::Interface::getProductList(&g_productList, params, true); + + app.DebugPrintf(" ----||||---- sce::Toolkit::NP::Commerce::Interface::getProductList : \n \t categoryId %s\n", categoryId); + if (ret < 0) + { + app.DebugPrintf("CommerceInterface::getProductList() error. ret = 0x%x\n", ret); + return ret; + } + + if (g_productList.hasResult()) + { + // result has returned immediately (don't think this should happen, but was handled in the samples + copyProductList(productList, g_productList.get()); + m_event = e_event_commerceGotProductList; + } + return ret; +} + + + +void SonyCommerce_Vita::copyCategoryInfo(CategoryInfo *pInfo, sce::Toolkit::NP::CategoryInfo *pNPInfo) +{ + app.DebugPrintf("copyCategoryInfo %s\n", pNPInfo->current.categoryId); + strcpy(pInfo->current.categoryId, pNPInfo->current.categoryId); + strcpy(pInfo->current.categoryName, pNPInfo->current.categoryName); + strcpy(pInfo->current.categoryDescription, pNPInfo->current.categoryDescription); + strcpy(pInfo->current.imageUrl, pNPInfo->current.imageUrl); + pInfo->countOfProducts = pNPInfo->countOfProducts; + pInfo->countOfSubCategories = pNPInfo->countOfSubCategories; + if(pInfo->countOfSubCategories > 0) + { + std::list::iterator iter = pNPInfo->subCategories.begin(); + std::list::iterator iterEnd = pNPInfo->subCategories.end(); + + while(iter != iterEnd) + { + // For each sub category, obtain information + app.DebugPrintf("copyCategoryInfo subcat - %s\n", iter->categoryId); + + CategoryInfoSub tempSubCatInfo; + strcpy(tempSubCatInfo.categoryId, iter->categoryId); + strcpy(tempSubCatInfo.categoryName, iter->categoryName); + strcpy(tempSubCatInfo.categoryDescription, iter->categoryDescription); + strcpy(tempSubCatInfo.imageUrl, iter->imageUrl); + // Add to the list + pInfo->subCategories.push_back(tempSubCatInfo); + iter++; + } + } +} + +int SonyCommerce_Vita::getCategoryInfo(CategoryInfo *pInfo, char *categoryId) +{ + int ret; + sce::Toolkit::NP::CategoryInfoInputParams params; + int userId = ProfileManager.getUserID(ProfileManager.GetPrimaryPad()); + + params.userInfo.userId = userId; + strcpy(params.categoryId, "");//categoryId); + params.serviceLabel = 0; + + app.DebugPrintf("Getting Category Information...\n"); + + ret = sce::Toolkit::NP::Commerce::Interface::getCategoryInfo(&g_categoryInfo, params, true); + app.DebugPrintf(" ----||||---- sce::Toolkit::NP::Commerce::Interface::getCategoryInfo : \n \t userID %d\n \t categoryId %s\n", userId, categoryId); + if (ret < 0) + { + // error + app.DebugPrintf("Commerce::Interface::getCategoryInfo error: 0x%x\n", ret); + return ret; + } + else if (g_categoryInfo.hasResult()) + { + // result has returned immediately (don't think this should happen, but was handled in the samples + copyCategoryInfo(pInfo, g_categoryInfo.get()); + m_event = e_event_commerceGotCategoryInfo; + } + return ret; +} + +void SonyCommerce_Vita::copyDetailedProductInfo(ProductInfoDetailed *pInfo, sce::Toolkit::NP::ProductInfoDetailed* pNPInfo) +{ + // populate our temp struct + // pInfo->ratingDescriptors = npInfo.ratingSystemId; + strncpy(pInfo->productId, pNPInfo->productId, SCE_NP_COMMERCE2_PRODUCT_ID_LEN); + strncpy(pInfo->productName, pNPInfo->productName, SCE_NP_COMMERCE2_PRODUCT_NAME_LEN); + strncpy(pInfo->shortDescription, pNPInfo->shortDescription, SCE_NP_COMMERCE2_PRODUCT_SHORT_DESCRIPTION_LEN); + strncpy(pInfo->longDescription, pNPInfo->longDescription, SCE_NP_COMMERCE2_PRODUCT_LONG_DESCRIPTION_LEN); + strncpy(pInfo->legalDescription, pNPInfo->legalDescription, SCE_NP_COMMERCE2_PRODUCT_LEGAL_DESCRIPTION_LEN); + strncpy(pInfo->spName, pNPInfo->spName, SCE_NP_COMMERCE2_SP_NAME_LEN); + strncpy(pInfo->imageUrl, pNPInfo->imageUrl, SCE_NP_COMMERCE2_URL_LEN); + pInfo->releaseDate = pNPInfo->releaseDate; + strncpy(pInfo->ratingSystemId, pNPInfo->ratingSystemId, SCE_NP_COMMERCE2_RATING_SYSTEM_ID_LEN); + strncpy(pInfo->ratingImageUrl, pNPInfo->imageUrl, SCE_NP_COMMERCE2_URL_LEN); + strncpy(pInfo->skuId, pNPInfo->skuId, SCE_NP_COMMERCE2_SKU_ID_LEN); + pInfo->purchasabilityFlag = pNPInfo->purchasabilityFlag; + m_bPurchasabilityUpdated = true; + pInfo->ui32Price= pNPInfo->intPrice; + strncpy(pInfo->price, pNPInfo->price, SCE_TOOLKIT_NP_SKU_PRICE_LEN); + +} +int SonyCommerce_Vita::getDetailedProductInfo(ProductInfoDetailed *pInfo, const char *productId, char *categoryId) +{ + int ret; + sce::Toolkit::NP::DetailedProductInfoInputParams params; + int userId = ProfileManager.getUserID(ProfileManager.GetPrimaryPad()); + + //CD - userInfo no longer exists in DetailedProductInfoInputParams struct + //params.userInfo.userId = userId; + strcpy(params.categoryId, categoryId); + strcpy(params.productId, productId); + + + app.DebugPrintf("Getting Detailed Product Information ... \n"); + if(g_detailedProductInfo.get()) // MGH - clear the price out, in case something is hanging around from a previous call + { + g_detailedProductInfo.get()->intPrice = -1; + g_detailedProductInfo.get()->price[0] = 0; + } + ret = sce::Toolkit::NP::Commerce::Interface::getDetailedProductInfo(&g_detailedProductInfo, params, true); + app.DebugPrintf(" ----||||---- sce::Toolkit::NP::Commerce::Interface::getDetailedProductInfo : \n \t userID %d\n \t categoryId %s\n \t productId %s\n", userId, categoryId, productId); + + if (ret < 0) + { + app.DebugPrintf("CommerceInterface::getDetailedProductInfo() error. ret = 0x%x\n", ret); + return ret; + } + + if (g_detailedProductInfo.hasResult()) + { + // result has returned immediately (don't think this should happen, but was handled in the samples + copyDetailedProductInfo(pInfo, g_detailedProductInfo.get()); + m_event = e_event_commerceGotDetailedProductInfo; + } + return ret; +} + +void SonyCommerce_Vita::copyAddDetailedProductInfo(ProductInfo *pInfo, sce::Toolkit::NP::ProductInfoDetailed* pNPInfo) +{ + + // populate our temp struct + // pInfo->ratingDescriptors = npInfo.ratingSystemId; + // strncpy(pInfo->productId, npInfo.productId, SCE_NP_COMMERCE2_PRODUCT_ID_LEN); + // strncpy(pInfo->productName, npInfo.productName, SCE_NP_COMMERCE2_PRODUCT_NAME_LEN); + // strncpy(pInfo->shortDescription, npInfo.shortDescription, SCE_NP_COMMERCE2_PRODUCT_SHORT_DESCRIPTION_LEN); + strncpy(pInfo->longDescription, pNPInfo->longDescription, SCE_NP_COMMERCE2_PRODUCT_LONG_DESCRIPTION_LEN); + // strncpy(pInfo->legalDescription, npInfo.legalDescription, SCE_NP_COMMERCE2_PRODUCT_LEGAL_DESCRIPTION_LEN); + // strncpy(pInfo->spName, npInfo.spName, SCE_NP_COMMERCE2_SP_NAME_LEN); + // strncpy(pInfo->imageUrl, npInfo.imageUrl, SCE_NP_COMMERCE2_URL_LEN); + // pInfo->releaseDate = npInfo.releaseDate; + // strncpy(pInfo->ratingSystemId, npInfo.ratingSystemId, SCE_NP_COMMERCE2_RATING_SYSTEM_ID_LEN); + // strncpy(pInfo->ratingImageUrl, npInfo.imageUrl, SCE_NP_COMMERCE2_URL_LEN); + strncpy(pInfo->skuId, pNPInfo->skuId, SCE_NP_COMMERCE2_SKU_ID_LEN); + pInfo->purchasabilityFlag = pNPInfo->purchasabilityFlag; + m_bPurchasabilityUpdated = true; + pInfo->ui32Price= pNPInfo->intPrice; + strncpy(pInfo->price, pNPInfo->price, SCE_TOOLKIT_NP_SKU_PRICE_LEN); + + app.DebugPrintf(" ---- description - %s\n", pInfo->longDescription); + app.DebugPrintf(" ---- price - %d\n", pInfo->price); + app.DebugPrintf(" ---- hasPurchased %d\n", pInfo->purchasabilityFlag); + +} + +int SonyCommerce_Vita::addDetailedProductInfo(ProductInfo *pInfo, const char *productId, char *categoryId) +{ + int ret; + sce::Toolkit::NP::DetailedProductInfoInputParams params; + int userId = ProfileManager.getUserID(ProfileManager.GetPrimaryPad()); + + //CD - userInfo no longer exists in DetailedProductInfoInputParams struct + //params.userInfo.userId = userId; + strcpy(params.categoryId, categoryId); + strcpy(params.productId, productId); + + + app.DebugPrintf("Getting Detailed Product Information ... \n"); + if(g_detailedProductInfo.get()) // MGH - clear the price out, in case something is hanging around from a previous call + { + g_detailedProductInfo.get()->intPrice = -1; + g_detailedProductInfo.get()->price[0] = 0; + } + ret = sce::Toolkit::NP::Commerce::Interface::getDetailedProductInfo(&g_detailedProductInfo, params, true); + app.DebugPrintf(" ----||||---- sce::Toolkit::NP::Commerce::Interface::getDetailedProductInfo : \n \t userID %d\n \t categoryId %s\n \t productId %s\n", userId, categoryId, productId); + + if (ret < 0) + { + app.DebugPrintf("CommerceInterface::addDetailedProductInfo() error. ret = 0x%x\n", ret); + } + + if (g_detailedProductInfo.hasResult()) + { + // result has returned immediately (don't think this should happen, but was handled in the samples + copyAddDetailedProductInfo(pInfo, g_detailedProductInfo.get()); + m_event = e_event_commerceAddedDetailedProductInfo; + } + return ret; +} + + +int SonyCommerce_Vita::checkout(CheckoutInputParams ¶ms) +{ + int ret; + sce::Toolkit::NP::CheckoutInputParams npParams; + int userId = ProfileManager.getUserID(ProfileManager.GetPrimaryPad()); + + //CD - userInfo no longer exists in CheckoutInputParams struct + //npParams.userInfo.userId = userId; + npParams.serviceLabel = 0; + + std::list::iterator iter = params.skuIds.begin(); + std::list::iterator iterEnd = params.skuIds.end(); + while(iter != iterEnd) + { + npParams.skuIds.push_back((char*)*iter); // have to remove the const here, not sure why the libs pointers aren't const + iter++; + } + + app.DebugPrintf("Starting SonyCommerce_Vita::checkout...\n"); + ret = sce::Toolkit::NP::Commerce::Interface::checkout(npParams, false); + if (ret < 0) + { + app.DebugPrintf("checkout() error. ret = 0x%x\n", ret); + } + return ret; +} + + +int SonyCommerce_Vita::downloadList(DownloadListInputParams ¶ms) +{ + int ret; + sce::Toolkit::NP::DownloadListInputParams npParams; + int userId = ProfileManager.getUserID(ProfileManager.GetPrimaryPad()); + //CD - userInfo no longer exists in DownloadListInputParams struct + //npParams.userInfo.userId = userId; + npParams.serviceLabel = 0; + + std::list::iterator iter = params.skuIds.begin(); + std::list::iterator iterEnd = params.skuIds.end(); + while(iter != iterEnd) + { + npParams.skuIds.push_back((char*)*iter); // have to remove the const here, not sure why the libs pointers aren't const + iter++; + } + + app.DebugPrintf("Starting Store Download List...\n"); + ret = sce::Toolkit::NP::Commerce::Interface::displayDownloadList(npParams, true); + if (ret < 0) + { + app.DebugPrintf("Commerce::Interface::displayDownloadList error: 0x%x\n", ret); + } + return ret; +} + +int SonyCommerce_Vita::checkout_game(CheckoutInputParams ¶ms) +{ + + int ret; + sce::Toolkit::NP::CheckoutInputParams npParams; + npParams.serviceLabel = 0; + + std::list::iterator iter = params.skuIds.begin(); + std::list::iterator iterEnd = params.skuIds.end(); + while(iter != iterEnd) + { + npParams.skuIds.push_back((char*)*iter); // have to remove the const here, not sure why the libs pointers aren't const + iter++; + } + + app.DebugPrintf("Starting Checkout...\n"); + sce::Toolkit::NP::ProductBrowseParams Myparams; + + Myparams.serviceLabel = 0; + strncpy(Myparams.productId, app.GetUpgradeKey(), strlen(app.GetUpgradeKey())); + + ret = sce::Toolkit::NP::Commerce::Interface::productBrowse(Myparams, false); + + //ret = sce::Toolkit::NP::Commerce::Interface::checkout(npParams, false); + if (ret < 0) + { + app.DebugPrintf("Sample menu checkout() error. ret = 0x%x\n", ret); + } + + // we don't seem to get any of the productBrowse completion callbacks on Vita, so just force us into that state next + m_event = e_event_commerceProductBrowseFinished; + + return ret; +} + +int SonyCommerce_Vita::downloadList_game(DownloadListInputParams ¶ms) +{ + + int ret; + sce::Toolkit::NP::DownloadListInputParams npParams; + //memset(&npParams,0,sizeof(sce::Toolkit::NP::DownloadListInputParams)); + npParams.serviceLabel = 0; + npParams.skuIds.clear(); + + std::list::iterator iter = params.skuIds.begin(); + std::list::iterator iterEnd = params.skuIds.end(); + while(iter != iterEnd) + { + npParams.skuIds.push_back((char*)*iter); // have to remove the const here, not sure why the libs pointers aren't const + iter++; + } + + app.DebugPrintf("Starting Store Download List...\n"); + // ret = sce::Toolkit::NP::Commerce::Interface::displayDownloadList(npParams, true); + // if (ret < 0) + // { + // app.DebugPrintf("Commerce::Interface::displayDownloadList error: 0x%x\n", ret); + // } + + sce::Toolkit::NP::ProductBrowseParams Myparams; + + Myparams.serviceLabel = 0; + strncpy(Myparams.productId, "EP4433-PCSB00560_00-MINECRAFTVIT0452", strlen("EP4433-PCSB00560_00-MINECRAFTVIT0452")); + + ret = sce::Toolkit::NP::Commerce::Interface::productBrowse(Myparams, false); + if (ret < 0) + { + // Error handling + app.DebugPrintf("Commerce::Interface::displayDownloadList error: 0x%x\n", ret); + } + + + + // we don't seem to get any of the productBrowse completion callbacks on Vita, so just force us into that state next + m_event = e_event_commerceProductBrowseFinished; + + return ret; +} + +int SonyCommerce_Vita::installContent() +{ + int ret; + ret = sce::Toolkit::NP::Commerce::Interface::installContent(); + return ret; +} + + +void SonyCommerce_Vita::UpgradeTrialCallback2(LPVOID lpParam,int err) +{ + SonyCommerce* pCommerce = (SonyCommerce*)lpParam; + app.DebugPrintf(4,"SonyCommerce_UpgradeTrialCallback2 : err : 0x%08x\n", err); + pCommerce->CheckForTrialUpgradeKey(); + if(err != SCE_OK) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + C4JStorage::EMessageResult result = ui.RequestErrorMessage( IDS_PRO_UNLOCKGAME_TITLE, IDS_NO_DLCOFFERS, uiIDA,1,ProfileManager.GetPrimaryPad()); + } + m_trialUpgradeCallbackFunc(m_trialUpgradeCallbackParam, m_errorCode); +} + +void SonyCommerce_Vita::UpgradeTrialCallback1(LPVOID lpParam,int err) +{ + SonyCommerce* pCommerce = (SonyCommerce*)lpParam; + app.DebugPrintf(4,"SonyCommerce_UpgradeTrialCallback1 : err : 0x%08x\n", err); + if(err == SCE_OK) + { + char* skuID = s_trialUpgradeProductInfoDetailed.skuId; + if(s_trialUpgradeProductInfoDetailed.purchasabilityFlag == SCE_TOOLKIT_NP_COMMERCE_NOT_PURCHASED) + { + app.DebugPrintf(4,"UpgradeTrialCallback1 - Checkout\n"); + pCommerce->Checkout_Game(UpgradeTrialCallback2, pCommerce, skuID); + } + else + { + app.DebugPrintf(4,"UpgradeTrialCallback1 - DownloadAlreadyPurchased\n"); + pCommerce->DownloadAlreadyPurchased_Game(UpgradeTrialCallback2, pCommerce, skuID); + } + } + else + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + C4JStorage::EMessageResult result = ui.RequestErrorMessage( IDS_PRO_UNLOCKGAME_TITLE, IDS_NO_DLCOFFERS, uiIDA,1,ProfileManager.GetPrimaryPad()); + m_trialUpgradeCallbackFunc(m_trialUpgradeCallbackParam, m_errorCode); + } +} + + + +// global func, so we can call from the profile lib +void SonyCommerce_UpgradeTrial() +{ + // we're now calling the app function here, which manages pending requests + app.UpgradeTrial(); +} + +void SonyCommerce_Vita::UpgradeTrial(CallbackFunc cb, LPVOID lpParam) +{ + m_trialUpgradeCallbackFunc = cb; + m_trialUpgradeCallbackParam = lpParam; + + GetDetailedProductInfo(UpgradeTrialCallback1, this, &s_trialUpgradeProductInfoDetailed, app.GetUpgradeKey(), app.GetCommerceCategory()); +} + + +int SonyCommerce_Vita::createContext() +{ + // SceNpId npId; + // int ret = sceNpManagerGetNpId(&npId); + // if(ret < 0) + // { + // app.DebugPrintf(4,"createContext sceNpManagerGetNpId problem\n"); + // return ret; + // } + // + // if (m_contextCreated) { + // ret = sceNpCommerce2DestroyCtx(m_contextId); + // if (ret < 0) + // { + // app.DebugPrintf(4,"createContext sceNpCommerce2DestroyCtx problem\n"); + // return ret; + // } + // } + // + // // Create commerce2 context + // ret = sceNpCommerce2CreateCtx(SCE_NP_COMMERCE2_VERSION, &npId, commerce2Handler, NULL, &m_contextId); + // if (ret < 0) + // { + // app.DebugPrintf(4,"createContext sceNpCommerce2CreateCtx problem\n"); + // return ret; + // } + + m_contextCreated = true; + + return SCE_OK; +} + +int SonyCommerce_Vita::createSession() +{ + // this does nothing now, we only catch session expired errors now and recreate the session when needed. + int ret = 0; + EnterCriticalSection(&m_queueLock); + m_messageQueue.push(e_message_commerceEnd); + m_event = e_event_commerceSessionCreated; + LeaveCriticalSection(&m_queueLock); + + return ret; +} + +int SonyCommerce_Vita::recreateSession() +{ + int ret = 0; + ret = sce::Toolkit::NP::Commerce::Interface::createSession(); + app.DebugPrintf(" ----||||---- sce::Toolkit::NP::Commerce::Interface::createSession \n"); + + if (ret < 0) + { + return ret; + } + m_currentPhase = e_phase_creatingSessionPhase; + return ret; +} + + + +void SonyCommerce_Vita::commerce2Handler( const sce::Toolkit::NP::Event& event) +{ + // Event reply; + // reply.service = Toolkit::NP::commerce; + // + + // make sure we're initialised + Init(); + + app.DebugPrintf("commerce2Handler returnCode = 0x%08x\n", event.returnCode); + + + EnterCriticalSection(&m_queueLock); + + if(event.returnCode == SCE_NP_COMMERCE2_SERVER_ERROR_SESSION_EXPIRED) + { + // this will happen on the first commerce call, since there is no session, so we create and then queue the request again + m_messageQueue.push(e_message_commerceRecreateSession); + LeaveCriticalSection(&m_queueLock); + return; + } + + + switch (event.event) + { + case sce::Toolkit::NP::Event::UserEvent::commerceNoEntitlements: + app.DebugPrintf("commerce2Handler : commerceNoEntitlements\n"); + StorageManager.EntitlementsCallback(false); + break; + + case sce::Toolkit::NP::Event::UserEvent::commerceGotEntitlementList: + app.DebugPrintf("commerce2Handler : commerceGotEntitlementList\n"); + StorageManager.EntitlementsCallback(true); + break; + + case sce::Toolkit::NP::Event::UserEvent::commerceError: + { + m_messageQueue.push(e_message_commerceEnd); + m_errorCode = event.returnCode; + break; + } + case sce::Toolkit::NP::Event::UserEvent::commerceSessionCreated: + { + // the seesion has been recreated after an error, so queue the old request back up now we're running again + m_messageQueue.push(m_lastMessage); + m_event = e_event_commerceSessionRecreated; + break; + } + case sce::Toolkit::NP::Event::UserEvent::commerceSessionAborted: + { + m_messageQueue.push(e_message_commerceEnd); + m_event = e_event_commerceSessionAborted; + break; + } + case sce::Toolkit::NP::Event::UserEvent::commerceCheckoutStarted: + { + m_currentPhase = e_phase_checkoutPhase; + m_event = e_event_commerceCheckoutStarted; + break; + } + case sce::Toolkit::NP::Event::UserEvent::commerceGotCategoryInfo: + { + // int ret = sce::Toolkit::NP::Commerce::Interface::getBgdlStatus(&status, false); + // if(ret == SCE_OK) + // { + copyCategoryInfo(m_pCategoryInfo, g_categoryInfo.get()); + m_pCategoryInfo = NULL; + m_event = e_event_commerceGotCategoryInfo; + // } + + break; + } + + case sce::Toolkit::NP::Event::UserEvent::commerceGotProductList: + { + copyProductList(m_pProductInfoList, g_productList.get()); + m_pProductInfoDetailed = NULL; + m_event = e_event_commerceGotProductList; + break; + } + + case sce::Toolkit::NP::Event::UserEvent::commerceGotDetailedProductInfo: + { + if(m_pProductInfoDetailed) + { + copyDetailedProductInfo(m_pProductInfoDetailed, g_detailedProductInfo.get()); + m_pProductInfoDetailed = NULL; + } + else + { + copyAddDetailedProductInfo(m_pProductInfo, g_detailedProductInfo.get()); + m_pProductInfo = NULL; + } + m_event = e_event_commerceGotDetailedProductInfo; + break; + } + + + + // case SCE_NP_COMMERCE2_EVENT_DO_CHECKOUT_SUCCESS: + // { + // m_messageQueue.push(e_message_commerceEnd); + // m_event = e_event_commerceCheckoutSuccess; + // break; + // } + // case SCE_NP_COMMERCE2_EVENT_DO_CHECKOUT_BACK: + // { + // m_messageQueue.push(e_message_commerceEnd); + // m_event = e_event_commerceCheckoutAborted; + // break; + // } + case sce::Toolkit::NP::Event::UserEvent::commerceCheckoutFinished: + { + m_messageQueue.push(e_message_commerceEnd); // MGH - fixes an assert when switching to adhoc mode after this + m_event = e_event_commerceCheckoutFinished; + break; + } + case sce::Toolkit::NP::Event::UserEvent::commerceDownloadListStarted: + { + m_currentPhase = e_phase_downloadListPhase; + m_event = e_event_commerceDownloadListStarted; + break; + } + // case SCE_NP_COMMERCE2_EVENT_DO_DL_LIST_SUCCESS: + // { + // m_messageQueue.push(e_message_commerceEnd); + // m_event = e_event_commerceDownloadListSuccess; + // break; + // } + case sce::Toolkit::NP::Event::UserEvent::commerceDownloadListFinished: + { + m_event = e_event_commerceDownloadListFinished; + break; + } + + case sce::Toolkit::NP::Event::UserEvent::commerceProductBrowseStarted: + { + m_currentPhase = e_phase_productBrowsePhase; + m_event = e_event_commerceProductBrowseStarted; + break; + } + case sce::Toolkit::NP::Event::UserEvent::commerceProductBrowseSuccess: + { + m_messageQueue.push(e_message_commerceEnd); + m_event = e_event_commerceProductBrowseSuccess; + break; + } + case sce::Toolkit::NP::Event::UserEvent::commerceProductBrowseAborted: + { + m_messageQueue.push(e_message_commerceEnd); + m_event = e_event_commerceProductBrowseAborted; + break; + } + case sce::Toolkit::NP::Event::UserEvent::commerceProductBrowseFinished: + { + m_event = e_event_commerceProductBrowseFinished; + break; + } + + case sce::Toolkit::NP::Event::UserEvent::commerceInstallStarted: + { + m_event = e_event_commerceInstallContentStarted; + break; + } + case sce::Toolkit::NP::Event::UserEvent::commerceInstallFinished: + { + m_event = e_event_commerceInstallContentFinished; + break; + } + + + // case SCE_NP_COMMERCE2_EVENT_DO_PROD_BROWSE_OPENED: + // break; + // case SCE_NP_COMMERCE2_EVENT_DO_PRODUCT_CODE_STARTED: + // { + // m_currentPhase = e_phase_voucherRedeemPhase; + // m_event = e_event_commerceVoucherInputStarted; + // break; + // } + // case SCE_NP_COMMERCE2_EVENT_DO_PRODUCT_CODE_SUCCESS: + // { + // m_messageQueue.push(e_message_commerceEnd); + // m_event = e_event_commerceVoucherInputSuccess; + // break; + // } + // case SCE_NP_COMMERCE2_EVENT_DO_PRODUCT_CODE_BACK: + // { + // m_messageQueue.push(e_message_commerceEnd); + // m_event = e_event_commerceVoucherInputAborted; + // break; + // } + // case SCE_NP_COMMERCE2_EVENT_DO_PRODUCT_CODE_FINISHED: + // { + // m_event = e_event_commerceVoucherInputFinished; + // break; + // } + default: + break; + }; + + LeaveCriticalSection(&m_queueLock); +} + + + +void SonyCommerce_Vita::processMessage() +{ + EnterCriticalSection(&m_queueLock); + int ret; + if(m_messageQueue.empty()) + { + LeaveCriticalSection(&m_queueLock); + return; + } + Message msg = m_messageQueue.front(); + if(msg != e_message_commerceRecreateSession) + m_lastMessage = msg; + m_messageQueue.pop(); + + switch (msg) + { + + case e_message_commerceCreateSession: + ret = createSession(); + if (ret < 0) + { + m_event = e_event_commerceError; + m_errorCode = ret; + } + break; + + case e_message_commerceRecreateSession: + ret = recreateSession(); + if (ret < 0) + { + m_event = e_event_commerceError; + m_errorCode = ret; + } + break; + + case e_message_commerceGetCategoryInfo: + { + ret = getCategoryInfo(m_pCategoryInfo, m_pCategoryID); + if (ret < 0) + { + m_event = e_event_commerceError; + app.DebugPrintf(4,"ERROR - e_event_commerceGotCategoryInfo - %s\n",m_pCategoryID); + m_errorCode = ret; + } + break; + } + + case e_message_commerceGetProductList: + { + ret = getProductList(m_pProductInfoList, m_pCategoryID); + if (ret < 0) + { + m_event = e_event_commerceError; + } + break; + } + + case e_message_commerceGetDetailedProductInfo: + { + ret = getDetailedProductInfo(m_pProductInfoDetailed, m_pProductID, m_pCategoryID); + if (ret < 0) + { + m_event = e_event_commerceError; + m_errorCode = ret; + } + break; + } + case e_message_commerceAddDetailedProductInfo: + { + ret = addDetailedProductInfo(m_pProductInfo, m_pProductID, m_pCategoryID); + if (ret < 0) + { + m_event = e_event_commerceError; + m_errorCode = ret; + } + break; + } + + // + // case e_message_commerceStoreProductBrowse: + // { + // ret = productBrowse(*(ProductBrowseParams *)msg.inputArgs); + // if (ret < 0) { + // m_event = e_event_commerceError; + // m_errorCode = ret; + // } + // _TOOLKIT_NP_DEL (ProductBrowseParams *)msg.inputArgs; + // break; + // } + // + // case e_message_commerceUpgradeTrial: + // { + // ret = upgradeTrial(); + // if (ret < 0) { + // m_event = e_event_commerceError; + // m_errorCode = ret; + // } + // break; + // } + // + // case e_message_commerceRedeemVoucher: + // { + // ret = voucherCodeInput(*(VoucherInputParams *)msg.inputArgs); + // if (ret < 0) { + // m_event = e_event_commerceError; + // m_errorCode = ret; + // } + // _TOOLKIT_NP_DEL (VoucherInputParams *)msg.inputArgs; + // break; + // } + // + // case e_message_commerceGetEntitlementList: + // { + // Job > tmpJob(static_cast > *>(msg.output)); + // + // int state = 0; + // int ret = sceNpManagerGetStatus(&state); + // + // // We don't want to process this if we are offline + // if (ret < 0 || state != SCE_NP_MANAGER_STATUS_ONLINE) { + // m_event = e_event_commerceError; + // reply.returnCode = SCE_TOOLKIT_NP_OFFLINE; + // tmpJob.setError(SCE_TOOLKIT_NP_OFFLINE); + // } else { + // getEntitlementList(&tmpJob); + // } + // break; + // } + // + // case e_message_commerceConsumeEntitlement: + // { + // int state = 0; + // int ret = sceNpManagerGetStatus(&state); + // + // // We don't want to process this if we are offline + // if (ret < 0 || state != SCE_NP_MANAGER_STATUS_ONLINE) { + // m_event = e_event_commerceError; + // reply.returnCode = SCE_TOOLKIT_NP_OFFLINE; + // } else { + // + // ret = consumeEntitlement(*(EntitlementToConsume *)msg.inputArgs); + // if (ret < 0) { + // m_event = e_event_commerceError; + // m_errorCode = ret; + // } else { + // m_event = e_event_commerceConsumedEntitlement; + // } + // } + // _TOOLKIT_NP_DEL (EntitlementToConsume *)msg.inputArgs; + // + // break; + // } + // + case e_message_commerceCheckout: + { + ret = checkout(m_checkoutInputParams); + if (ret < 0) { + m_event = e_event_commerceError; + m_errorCode = ret; + } + break; + } + + case e_message_commerceDownloadList: + { + ret = downloadList(m_downloadInputParams); + if (ret < 0) { + m_event = e_event_commerceError; + m_errorCode = ret; + } + break; + } + + case e_message_commerceCheckout_Game: + { + ret = checkout_game(m_checkoutInputParams); + if (ret < 0) { + m_event = e_event_commerceError; + m_errorCode = ret; + } + break; + } + + case e_message_commerceDownloadList_Game: + { + ret = downloadList_game(m_downloadInputParams); + if (ret < 0) { + m_event = e_event_commerceError; + m_errorCode = ret; + } + break; + } + + case e_message_commerceInstallContent: + { + ret = installContent(); + if (ret < 0) { + m_event = e_event_commerceError; + m_errorCode = ret; + } + break; + } + + + case e_message_commerceEnd: + app.DebugPrintf("XXX - e_message_commerceEnd!\n"); + ret = commerceEnd(); + if (ret < 0) + { + m_event = e_event_commerceError; + m_errorCode = ret; + } + // 4J-PB - we don't seem to handle the error code here + else if(m_errorCode!=0) + { + m_event = e_event_commerceError; + } + break; + + default: + break; + } + + LeaveCriticalSection(&m_queueLock); +} + + +void SonyCommerce_Vita::processEvent() +{ + int ret = 0; + + switch (m_event) + { + case e_event_none: + break; + case e_event_commerceSessionRecreated: + app.DebugPrintf(4,"Commerce Session Created.\n"); + break; + case e_event_commerceSessionCreated: + app.DebugPrintf(4,"Commerce Session Created.\n"); + runCallback(); + break; + case e_event_commerceSessionAborted: + app.DebugPrintf(4,"Commerce Session aborted.\n"); + runCallback(); + break; + case e_event_commerceGotProductList: + app.DebugPrintf(4,"Got product list.\n"); + runCallback(); + break; + case e_event_commerceGotCategoryInfo: + app.DebugPrintf(4,"Got category info\n"); + runCallback(); + break; + case e_event_commerceGotDetailedProductInfo: + app.DebugPrintf(4,"Got detailed product info.\n"); + runCallback(); + break; + case e_event_commerceAddedDetailedProductInfo: + app.DebugPrintf(4,"Added detailed product info.\n"); + runCallback(); + break; + case e_event_commerceProductBrowseStarted: + break; + case e_event_commerceProductBrowseSuccess: + break; + case e_event_commerceProductBrowseAborted: + break; + case e_event_commerceProductBrowseFinished: + app.DebugPrintf(4,"e_event_commerceProductBrowseFinished succeeded: 0x%x\n", m_errorCode); + if(m_callbackFunc!=NULL) + { + runCallback(); + } + m_bDownloadsPending = true; + +// assert(0); + // ret = sys_memory_container_destroy(s_memContainer); + // if (ret < 0) { + // printf("Failed to destroy memory container"); + // } + // s_memContainer = SYS_MEMORY_CONTAINER_ID_INVALID; + break; + case e_event_commerceVoucherInputStarted: + break; + case e_event_commerceVoucherInputSuccess: + break; + case e_event_commerceVoucherInputAborted: + break; + case e_event_commerceVoucherInputFinished: + assert(0); + // ret = sys_memory_container_destroy(s_memContainer); + // if (ret < 0) { + // printf("Failed to destroy memory container"); + // } + // s_memContainer = SYS_MEMORY_CONTAINER_ID_INVALID; + break; + case e_event_commerceGotEntitlementList: + break; + case e_event_commerceConsumedEntitlement: + break; + case e_event_commerceCheckoutStarted: + app.DebugPrintf(4,"Checkout Started\n"); + ProfileManager.SetSysUIShowing(true); + break; + case e_event_commerceCheckoutSuccess: + app.DebugPrintf(4,"Checkout succeeded: 0x%x\n", m_errorCode); + // clear the DLC installed and check again + ProfileManager.SetSysUIShowing(false); + break; + case e_event_commerceCheckoutAborted: + app.DebugPrintf(4,"Checkout aborted: 0x%x\n", m_errorCode); + ProfileManager.SetSysUIShowing(false); + break; + case e_event_commerceCheckoutFinished: + app.DebugPrintf(4,"Checkout Finished: 0x%x\n", m_errorCode); + if (ret < 0) { + app.DebugPrintf(4,"Failed to destroy memory container"); + } + ProfileManager.SetSysUIShowing(false); + + // 4J-PB - if there's been an error - like dlc already purchased, the runcallback has already happened, and will crash this time + if(m_callbackFunc!=NULL) + { + // get the detailed product info again, to see if the purchase has happened or not + EnterCriticalSection(&m_queueLock); + m_messageQueue.push(e_message_commerceAddDetailedProductInfo); + LeaveCriticalSection(&m_queueLock); + +// runCallback(); + } + m_bDownloadsPending = true; + break; + case e_event_commerceDownloadListStarted: + app.DebugPrintf(4,"Download List Started\n"); + ProfileManager.SetSysUIShowing(true); + break; + case e_event_commerceDownloadListSuccess: + app.DebugPrintf(4,"Download succeeded: 0x%x\n", m_errorCode); + ProfileManager.SetSysUIShowing(false); + m_bDownloadsPending = true; + break; + case e_event_commerceDownloadListFinished: + app.DebugPrintf(4,"Download Finished: 0x%x\n", m_errorCode); + if (ret < 0) { + app.DebugPrintf(4,"Failed to destroy memory container"); + } + ProfileManager.SetSysUIShowing(false); + + // 4J-PB - if there's been an error - like dlc already purchased, the runcallback has already happened, and will crash this time + if(m_callbackFunc!=NULL) + { + runCallback(); + } + m_bDownloadsPending = true; + break; + + case e_event_commerceInstallContentStarted: + app.DebugPrintf(4,"Install content Started\n"); + ProfileManager.SetSysUIShowing(true); + break; + case e_event_commerceInstallContentFinished: + app.DebugPrintf(4,"Install content finished: 0x%x\n", m_errorCode); + ProfileManager.SetSysUIShowing(false); + runCallback(); + break; + + case e_event_commerceError: + app.DebugPrintf(4,"Commerce Error 0x%x\n", m_errorCode); + runCallback(); + break; + default: + break; + } + m_event = e_event_none; +} + + +int SonyCommerce_Vita::commerceEnd() +{ + int ret = 0; + + // if (m_currentPhase == e_phase_voucherRedeemPhase) + // ret = sceNpCommerce2DoProductCodeFinishAsync(m_contextId); + // else if (m_currentPhase == e_phase_productBrowsePhase) + // ret = sceNpCommerce2DoProductBrowseFinishAsync(m_contextId); + // else if (m_currentPhase == e_phase_creatingSessionPhase) + // ret = sceNpCommerce2CreateSessionFinish(m_contextId, &m_sessionInfo); + // else if (m_currentPhase == e_phase_checkoutPhase) + // ret = sceNpCommerce2DoCheckoutFinishAsync(m_contextId); + // else if (m_currentPhase == e_phase_downloadListPhase) + // ret = sceNpCommerce2DoDlListFinishAsync(m_contextId); + + m_currentPhase = e_phase_idle; + + return ret; +} + +void SonyCommerce_Vita::CreateSession( CallbackFunc cb, LPVOID lpParam ) +{ + // 4J-PB - reset any previous error code + // I had this happen when I was offline on Vita, and accepted the PSN sign-in + // the m_errorCode was picked up in the message queue after the commerce init call + if(m_errorCode!=0) + { + app.DebugPrintf("m_errorCode was set!\n"); + m_errorCode=0; + } + Init(); + EnterCriticalSection(&m_queueLock); + setCallback(cb,lpParam); + m_messageQueue.push(e_message_commerceCreateSession); +// m_messageQueue.push(e_message_commerceEnd); +// m_event = e_event_commerceSessionCreated; + + if(m_tickThread && (m_tickThread->isRunning() == false)) + { + delete m_tickThread; + m_tickThread = NULL; + } + if(m_tickThread == NULL) + m_tickThread = new C4JThread(TickLoop, NULL, "SonyCommerce_Vita tick"); + if(m_tickThread->isRunning() == false) + { + m_currentPhase = e_phase_idle; + m_tickThread->Run(); + } + LeaveCriticalSection(&m_queueLock); +} + +void SonyCommerce_Vita::CloseSession() +{ +// assert(m_currentPhase == e_phase_idle); + m_currentPhase = e_phase_stopped; + Shutdown(); +} + +void SonyCommerce_Vita::GetProductList( CallbackFunc cb, LPVOID lpParam, std::vector* productList, const char *categoryId) +{ + EnterCriticalSection(&m_queueLock); + setCallback(cb,lpParam); + m_pProductInfoList = productList; + strcpy(m_pCategoryID,categoryId); + m_messageQueue.push(e_message_commerceGetProductList); + LeaveCriticalSection(&m_queueLock); +} + +void SonyCommerce_Vita::GetDetailedProductInfo( CallbackFunc cb, LPVOID lpParam, ProductInfoDetailed* productInfo, const char *productId, const char *categoryId ) +{ + EnterCriticalSection(&m_queueLock); + setCallback(cb,lpParam); + m_pProductInfoDetailed = productInfo; + m_pProductID = productId; + strcpy(m_pCategoryID,categoryId); + m_messageQueue.push(e_message_commerceGetDetailedProductInfo); + LeaveCriticalSection(&m_queueLock); +} + +// 4J-PB - fill out the long description and the price for the product +void SonyCommerce_Vita::AddDetailedProductInfo( CallbackFunc cb, LPVOID lpParam, ProductInfo* productInfo, const char *productId, const char *categoryId ) +{ + EnterCriticalSection(&m_queueLock); + setCallback(cb,lpParam); + m_pProductInfo = productInfo; + m_pProductID = productId; + strcpy(m_pCategoryID,categoryId); + m_messageQueue.push(e_message_commerceAddDetailedProductInfo); + LeaveCriticalSection(&m_queueLock); +} +void SonyCommerce_Vita::GetCategoryInfo( CallbackFunc cb, LPVOID lpParam, CategoryInfo *info, const char *categoryId ) +{ + EnterCriticalSection(&m_queueLock); + setCallback(cb,lpParam); + m_pCategoryInfo = info; + strcpy(m_pCategoryID,categoryId); + m_messageQueue.push(e_message_commerceGetCategoryInfo); + LeaveCriticalSection(&m_queueLock); +} + +void SonyCommerce_Vita::Checkout( CallbackFunc cb, LPVOID lpParam, ProductInfo* productInfo ) +{ + EnterCriticalSection(&m_queueLock); + setCallback(cb,lpParam); + m_checkoutInputParams.skuIds.clear(); + m_checkoutInputParams.skuIds.push_back(productInfo->skuId); + + m_pProductInfo = productInfo; + m_pProductID = productInfo->productId; + + m_messageQueue.push(e_message_commerceCheckout); + LeaveCriticalSection(&m_queueLock); +} + +void SonyCommerce_Vita::Checkout( CallbackFunc cb, LPVOID lpParam, const char* skuID ) +{ + assert(0); +} + +void SonyCommerce_Vita::DownloadAlreadyPurchased( CallbackFunc cb, LPVOID lpParam, const char* skuID ) +{ + EnterCriticalSection(&m_queueLock); + setCallback(cb,lpParam); + m_downloadInputParams.skuIds.clear(); + m_downloadInputParams.skuIds.push_back(skuID); + m_messageQueue.push(e_message_commerceDownloadList); + LeaveCriticalSection(&m_queueLock); +} + +void SonyCommerce_Vita::Checkout_Game( CallbackFunc cb, LPVOID lpParam, const char* skuID ) +{ + EnterCriticalSection(&m_queueLock); + setCallback(cb,lpParam); + m_checkoutInputParams.skuIds.clear(); + m_checkoutInputParams.skuIds.push_back(skuID); + m_messageQueue.push(e_message_commerceCheckout_Game); + LeaveCriticalSection(&m_queueLock); +} +void SonyCommerce_Vita::DownloadAlreadyPurchased_Game( CallbackFunc cb, LPVOID lpParam, const char* skuID ) +{ + EnterCriticalSection(&m_queueLock); + setCallback(cb,lpParam); + m_downloadInputParams.skuIds.clear(); + m_downloadInputParams.skuIds.push_back(skuID); + m_messageQueue.push(e_message_commerceDownloadList_Game); + LeaveCriticalSection(&m_queueLock); +} + +void SonyCommerce_Vita::InstallContent( CallbackFunc cb, LPVOID lpParam ) +{ + if(m_callbackFunc == NULL && m_messageQueue.size() == 0) // wait till other processes have finished + { + EnterCriticalSection(&m_queueLock); + m_bInstallingContent = true; + setCallback(cb,lpParam); + m_messageQueue.push(e_message_commerceInstallContent); + LeaveCriticalSection(&m_queueLock); + } +} + +bool SonyCommerce_Vita::getPurchasabilityUpdated() +{ + bool retVal = m_bPurchasabilityUpdated; + m_bPurchasabilityUpdated = false; + return retVal; +} + +bool SonyCommerce_Vita::getDLCUpgradePending() +{ + if(m_bDownloadsPending || m_bInstallingContent || (m_iClearDLCCountdown > 0)) + return true; + 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; +bool g_bDoCommerceGetCategoryInfo = false; +bool g_bDoCommerceGetProductInfoDetailed = false; +bool g_bDoCommerceCheckout = false; +bool g_bDoCommerceCloseSession = false; +const char* g_category = "EP4433-CUSA00265_00"; +const char* g_skuID = "SKINPACK00000001-E001"; +std::vector g_productInfo; +SonyCommerce::CategoryInfo g_categoryInfo2; +SonyCommerce::ProductInfoDetailed g_productInfoDetailed; + +void testCallback(LPVOID lpParam, int error_code) +{ + app.DebugPrintf("Callback hit, error 0x%08x\n", error_code); +} + +void SonyCommerce_Vita::Test() +{ + int err = SCE_OK; + if(g_bDoCommerceCreateSession) + { + CreateSession(testCallback, this); + g_bDoCommerceCreateSession = false; + } + if(g_bDoCommerceGetProductList) + { + GetProductList(testCallback, this, &g_productInfo, g_category); + g_bDoCommerceGetProductList = false; + } + + if(g_bDoCommerceGetCategoryInfo) + { + GetCategoryInfo(testCallback, this, &g_categoryInfo2, g_category); + g_bDoCommerceGetCategoryInfo = false; + } + + if(g_bDoCommerceGetProductInfoDetailed) + { + GetDetailedProductInfo(testCallback, this, &g_productInfoDetailed, g_productInfo[0].productId, g_category); + g_bDoCommerceGetProductInfoDetailed = false; + } + + if(g_bDoCommerceCheckout) + { + //Checkout(testCallback, this, g_skuID);//g_productInfoDetailed.skuId); + Checkout(testCallback, this, g_productInfoDetailed.skuId); + g_bDoCommerceCheckout = false; + } + if(g_bDoCommerceCloseSession) + { + CloseSession(); + g_bDoCommerceCloseSession = false; + } + +} +*/ \ No newline at end of file diff --git a/Minecraft.Client/PSVita/Network/SonyCommerce_Vita.h b/Minecraft.Client/PSVita/Network/SonyCommerce_Vita.h new file mode 100644 index 00000000..6285832c --- /dev/null +++ b/Minecraft.Client/PSVita/Network/SonyCommerce_Vita.h @@ -0,0 +1,207 @@ +#pragma once + +#include "Common\Network\Sony\SonyCommerce.h" +#include +#include +#include + +class SonyCommerce_Vita : public SonyCommerce +{ + friend class PSVitaNPToolkit; + enum State + { + e_state_noSession, + e_state_creatingSession, + e_state_createSessionDone, + e_state_idle, + + + }; + /// This enum is used to verify the current utility that is running + enum Phase + { + e_phase_stopped = 0, + e_phase_idle, + e_phase_voucherRedeemPhase, + e_phase_productBrowsePhase, + e_phase_creatingSessionPhase, + e_phase_checkoutPhase, + e_phase_downloadListPhase + }; + + enum Message + { + e_message_commerceNone, + e_message_commerceCreateSession, ///< Create a commerce session + e_message_commerceRecreateSession, ///< Recreate a commerce session + e_message_commerceGetCategoryInfo, ///< Information about a category in the Store + e_message_commerceGetProductList, ///< Get a list of products available in the Store + e_message_commerceGetDetailedProductInfo, ///< Get a list of products available in the Store, with additional details + e_message_commerceAddDetailedProductInfo, ///< Add additional details to a ProdcutInfo already retrieved + e_message_commerceStoreProductBrowse, ///< Launches the Store to a specified product + e_message_commerceUpgradeTrial, ///< Upgrade a trial to full game + e_message_commerceRedeemVoucher, ///< Redeem a voucher code + e_message_commerceGetEntitlementList, ///< Get a list of entitlements associated with the current PSN user. + e_message_commerceConsumeEntitlement, ///< Consume an amount from a consumable entitlement. + e_message_commerceCheckout, ///< Launch the Store checkout + e_message_commerceDownloadList, ///< Launch the download list + e_message_commerceCheckout_Game, ///< Launch the Store checkout + e_message_commerceDownloadList_Game, ///< Launch the download list + e_message_commerceInstallContent, ///< Install content that's downloaded from the background download manager + e_message_commerceEnd ///< End commerce2 processing + }; + + enum Event + { + e_event_none, + e_event_commerceSessionCreated, ///< An event generated when a commerce session has successfully been created. + e_event_commerceSessionRecreated, ///< An event generated when a commerce session has successfully been recreated. + e_event_commerceSessionAborted, ///< An event generated when the creation of commerce session has been aborted. + e_event_commerceGotCategoryInfo, ///< An event generated when some category information has been retrieved from the store. + e_event_commerceGotProductList, ///< An event generated when a list of products that are available has been retrieved from the store. + e_event_commerceGotDetailedProductInfo, ///< An event generated when some detailed product information has been retrieved from the store. + e_event_commerceAddedDetailedProductInfo, ///< An event generated when some detailed product information has been retrieved from the store. + e_event_commerceProductBrowseStarted, ///< An event generated when product overlay has started. + e_event_commerceProductBrowseSuccess, ///< An event generated when a product browse was completed successfully, and the user purchased the product. + e_event_commerceProductBrowseAborted, ///< An event generated when a product browse was aborted by the user (the user pressed back). + e_event_commerceProductBrowseFinished, ///< An event generated when a product browse has finished and it is now safe to free memory. + e_event_commerceVoucherInputStarted, ///< An event generated when a voucher code input overlay was started. + e_event_commerceVoucherInputSuccess, ///< An event generated when a voucher code input completed successfully. + e_event_commerceVoucherInputAborted, ///< An event generated when a voucher code input was aborted by the user (user pressed back). + e_event_commerceVoucherInputFinished, ///< An event generated when a voucher code input has finished. It is now safe to free memory. + e_event_commerceGotEntitlementList, ///< An event generated when a the list of entitlements has been received for the current user. + e_event_commerceConsumedEntitlement, ///< An event generated when the has successfully consumed an entitlement. + e_event_commerceCheckoutStarted, ///< An event generated when a store checkout overlay has started. + e_event_commerceCheckoutSuccess, ///< An event generated when user has successfully purchased from the checkout. + e_event_commerceCheckoutAborted, ///< An event generated when the checkout was aborted by the user (user pressed back). + e_event_commerceCheckoutFinished, ///< An event generated when a store checkout overlay has finished. + e_event_commerceDownloadListStarted, ///< An event generated when a download list overlay has started. + e_event_commerceDownloadListSuccess, ///< An event generated when the user has ended the download list. + e_event_commerceDownloadListFinished, ///< An event generated when a download list overlay has finished. + e_event_commerceInstallContentStarted, + e_event_commerceInstallContentFinished, + e_event_commerceError ///< An event generated when a commerce error has occurred. + }; + + static bool m_bLicenseChecked; + static bool m_bCommerceInitialised; +// static SceNpCommerce2SessionInfo m_sessionInfo; + static State m_state; + static int m_errorCode; + static LPVOID m_callbackParam; + static Event m_event; + static Message m_message; + // static uint32_t m_requestID; + static void* m_receiveBuffer; + static std::vector *m_pProductInfoList; + static ProductInfoDetailed *m_pProductInfoDetailed; + static ProductInfo *m_pProductInfo; + static CategoryInfo* m_pCategoryInfo; + static char* m_pCategoryID; + static const char* m_pProductID; + static std::queue m_messageQueue; + static CallbackFunc m_callbackFunc; + static CheckoutInputParams m_checkoutInputParams; + static DownloadListInputParams m_downloadInputParams; +// static sys_memory_container_t m_memContainer; + static bool m_bUpgradingTrial; + static C4JThread* m_tickThread; + static CallbackFunc m_trialUpgradeCallbackFunc; + static LPVOID m_trialUpgradeCallbackParam; + static CRITICAL_SECTION m_queueLock; + static bool m_bLicenseInstalled; + static bool m_bDownloadsPending; + static bool m_bDownloadsReady; + static bool m_bInstallingContent; + static int m_iClearDLCCountdown; + static bool m_bPurchasabilityUpdated; + + static Message m_lastMessage; + static void runCallback() + { + assert(m_callbackFunc); + CallbackFunc func = m_callbackFunc; + m_callbackFunc = NULL; + if(func) + func(m_callbackParam, m_errorCode); + m_errorCode = SCE_OK; + } + static void setCallback(CallbackFunc cb,LPVOID lpParam) + { + assert(m_callbackFunc == NULL); + m_callbackFunc = cb; + m_callbackParam = lpParam; + } + + + static uint32_t m_contextId; ///< The npcommerce2 context ID + static bool m_contextCreated; ///< npcommerce2 context ID created? + static Phase m_currentPhase; ///< Current commerce2 util +// static char m_commercebuffer[SCE_NP_COMMERCE2_RECV_BUF_SIZE]; + + + + static void commerce2Handler( const sce::Toolkit::NP::Event& event); + static void processMessage(); + static void processEvent(); + + static int createContext(); + static int createSession(); + static int recreateSession(); + static void setError(int err) { m_errorCode = err; } + static int getCategoryInfo(CategoryInfo *info, char *categoryId); + static int getProductList(std::vector* productList, char *categoryId); + static int getDetailedProductInfo(ProductInfoDetailed *info, const char *productId, char *categoryId); + static int addDetailedProductInfo(ProductInfo *info, const char *productId, char *categoryId); + static int checkout(CheckoutInputParams ¶ms); + static int downloadList(DownloadListInputParams ¶ms); + static int checkout_game(CheckoutInputParams ¶ms); + static int downloadList_game(DownloadListInputParams ¶ms); + static int installContent(); + static void UpgradeTrialCallback1(LPVOID lpParam,int err); + static void UpgradeTrialCallback2(LPVOID lpParam,int err); + static void Delete(); + static void copyCategoryInfo(CategoryInfo *pInfo, sce::Toolkit::NP::CategoryInfo *pNPInfo); + static void copyProductList(std::vector* pProductList, std::vector* pNPProductList); + static void copyDetailedProductInfo(ProductInfoDetailed *pInfo, sce::Toolkit::NP::ProductInfoDetailed* pNPInfo); + static void copyAddDetailedProductInfo(ProductInfo *pInfo, sce::Toolkit::NP::ProductInfoDetailed* pNPInfo); + static void InstallContentCallback(LPVOID lpParam,int err); + + static int commerceEnd(); + // static int upgradeTrial(); + + static int TickLoop(void* lpParam); + //void Test(); + + static void Init(); + static int Shutdown(); + + static void CheckForTrialUpgradeKey_Callback(LPVOID param, bool bFullVersion); + +public: + static void checkBackgroundDownloadStatus(); + + virtual void CreateSession(CallbackFunc cb, LPVOID lpParam); + virtual void CloseSession(); + + virtual void GetCategoryInfo(CallbackFunc cb, LPVOID lpParam, CategoryInfo *info, const char *categoryId); + virtual void GetProductList(CallbackFunc cb, LPVOID lpParam, std::vector* productList, const char *categoryId); + virtual void GetDetailedProductInfo(CallbackFunc cb, LPVOID lpParam, ProductInfoDetailed* productInfoDetailed, const char *productId, const char *categoryId); + virtual void AddDetailedProductInfo( CallbackFunc cb, LPVOID lpParam, ProductInfo* productInfo, const char *productId, const char *categoryId ); + virtual void Checkout(CallbackFunc cb, LPVOID lpParam, const char* skuID); + virtual void Checkout(CallbackFunc cb, LPVOID lpParam, ProductInfo* productInfo); + virtual void DownloadAlreadyPurchased(CallbackFunc cb, LPVOID lpParam, const char* skuID); + virtual void Checkout_Game(CallbackFunc cb, LPVOID lpParam, const char* skuID); + virtual void DownloadAlreadyPurchased_Game(CallbackFunc cb, LPVOID lpParam, const char* skuID); + static void InstallContent(CallbackFunc cb, LPVOID lpParam); + virtual void UpgradeTrial(CallbackFunc cb, LPVOID lpParam); + virtual void CheckForTrialUpgradeKey(); + virtual bool LicenseChecked(); + + static bool getPurchasabilityUpdated(); + static bool getDLCUpgradePending(); + + virtual void ShowPsStoreIcon(); + virtual void HidePsStoreIcon(); + +}; diff --git a/Minecraft.Client/PSVita/Network/SonyHttp_Vita.cpp b/Minecraft.Client/PSVita/Network/SonyHttp_Vita.cpp new file mode 100644 index 00000000..9110edf5 --- /dev/null +++ b/Minecraft.Client/PSVita/Network/SonyHttp_Vita.cpp @@ -0,0 +1,271 @@ +#include "stdafx.h" +#include "SonyHttp_Vita.h" + +static const int sc_SSLHeapSize = (304 * 1024U); +static const int sc_HTTPHeapSize = (80 * 1024); +static const int sc_NetHeapSize = (16 * 1024); + +#define TEST_USER_AGENT "SimpleSample/1.00" + + +// int SonyHttp_Vita::libnetMemId = 0; +int SonyHttp_Vita::libsslCtxId = 0; +int SonyHttp_Vita::libhttpCtxId = 0; +bool SonyHttp_Vita:: bInitialised = false; + + + + + +bool SonyHttp_Vita::init() +{ +// int ret = sceNetPoolCreate("simple", sc_NetHeapSize, 0); +// assert(ret >= 0); +// libnetMemId = ret; + +// int ret = sceSslInit(sc_SSLHeapSize); +// assert(ret >= 0 || ret == SCE_SSL_ERROR_ALREADY_INITED); +// libsslCtxId = ret; +// +// ret = sceHttpInit(sc_HTTPHeapSize); +// assert(ret >= 0 || ret == SCE_HTTP_ERROR_ALREADY_INITED); +// libhttpCtxId = ret; + + bInitialised = true; + return true; +} + +void SonyHttp_Vita::shutdown() +{ + PSVITA_STUBBED; +// int ret = sceHttpTerm(libhttpCtxId); +// assert(ret == SCE_OK); +// +// ret = sceSslTerm(libsslCtxId); +// assert(ret == SCE_OK); +// +// /* libnet */ +// ret = sceNetPoolDestroy(libnetMemId); +// assert(ret == SCE_OK); + +} +void SonyHttp_Vita::printSslError(SceInt32 sslErr, SceUInt32 sslErrDetail) +{ + switch (sslErr) + { + case (SCE_HTTPS_ERROR_CERT): /* Verify error */ + /* Internal error at verifying certificate*/ + if (sslErrDetail & SCE_HTTPS_ERROR_SSL_INTERNAL){ + app.DebugPrintf("ssl verify error: unexpcted error\n"); + } + /* Error of server certificate or CA certificate */ + if (sslErrDetail & SCE_HTTPS_ERROR_SSL_INVALID_CERT){ + app.DebugPrintf("ssl verify error: invalid server cert or CA cert\n"); + } + /* Server hostname and server certificate are mismatched*/ + if (sslErrDetail & SCE_HTTPS_ERROR_SSL_CN_CHECK){ + app.DebugPrintf("ssl verify error: invalid server hostname\n"); + } + /* Server certificate or CA certificate is expired.*/ + if (sslErrDetail & SCE_HTTPS_ERROR_SSL_NOT_AFTER_CHECK){ + app.DebugPrintf("ssl verify error: server cert or CA cert had expired\n"); + } + /* Server certificate or CA certificate is before validated.*/ + if (sslErrDetail & SCE_HTTPS_ERROR_SSL_NOT_BEFORE_CHECK){ + app.DebugPrintf("ssl verify error: server cert or CA cert isn't validated yet.\n"); + } + /* Unknown CA error */ + if (sslErrDetail & SCE_HTTPS_ERROR_SSL_UNKNOWN_CA){ + app.DebugPrintf("ssl verify error: unknown CA\n"); + } + break; + case (SCE_HTTPS_ERROR_HANDSHAKE): /* fail to ssl-handshake */ + app.DebugPrintf("ssl error: handshake error\n"); + break; + case (SCE_HTTPS_ERROR_IO): /* Error of Socket IO */ + app.DebugPrintf("ssl error: io error\n"); + break; + case (SCE_HTTP_ERROR_OUT_OF_MEMORY): /* Out of memory*/ + app.DebugPrintf("ssl error: out of memory\n"); + break; + case (SCE_HTTPS_ERROR_INTERNAL): /* Unexpected Internal Error*/ + app.DebugPrintf("ssl error: unexpcted error\n"); + break; + default: + break; + } + return; +} + + +void SonyHttp_Vita::printSslCertInfo(SceSslCert *sslCert) +{ + SceInt32 ret; + const SceUChar8 *sboData; + SceSize sboLen, counter; + + ret = sceSslGetSerialNumber(sslCert, &sboData, &sboLen); + if (ret < 0){ + app.DebugPrintf ("sceSslGetSerialNumber() returns 0x%x\n", ret); + } else { + app.DebugPrintf("Serial number="); + for (counter = 0; counter < sboLen; counter++){ + app.DebugPrintf("%02X", sboData[counter]); + } + app.DebugPrintf("\n"); + } +} + + +bool SonyHttp_Vita::getDataFromURL( const char* szURL, void** ppOutData, int* pDataSize) +{ + if(!bInitialised) + return false; + return http_get(szURL, ppOutData, pDataSize); +} + + +int SonyHttp_Vita::sslCallback(SceUInt32 verifyErr, SceSslCert * const sslCert[], SceInt32 certNum, void *userArg) +{ + SceInt32 i; + (void)userArg; + + app.DebugPrintf("Ssl callback:\n"); + app.DebugPrintf("\tbase tmpl[%x]\n", (SceInt32)userArg); + + if (verifyErr != 0){ + printSslError((SceInt32)SCE_HTTPS_ERROR_CERT, verifyErr); + } + for (i = 0; i < certNum; i++){ + printSslCertInfo(sslCert[i]); + } + if (verifyErr == 0){ + return SCE_OK; + } else { + return -1; + } +} + +bool SonyHttp_Vita::http_get_close(bool bOK, SceInt32 tmplId, SceInt32 connId, SceInt32 reqId) +{ + SceInt32 ret; + if (reqId > 0) + { + ret = sceHttpDeleteRequest(reqId); + assert(ret >= 0); + } + if (connId > 0) + { + ret = sceHttpDeleteConnection(connId); + assert(ret >= 0); + } + if (tmplId > 0) + { + ret = sceHttpDeleteTemplate(tmplId); + assert(ret >= 0); + } + assert(bOK); + return bOK; +} + +bool SonyHttp_Vita::http_get(const char *targetUrl, void** ppOutData, int* pDataSize) +{ + SceInt32 ret, tmplId=0, connId=0, reqId=0, statusCode; + SceULong64 contentLength=0; + SceBool finFlag=SCE_FALSE; + SceUChar8* recvBuf; + + ret = sceHttpCreateTemplate(TEST_USER_AGENT, SCE_HTTP_VERSION_1_1, SCE_TRUE); + if (ret < 0) + { + app.DebugPrintf("sceHttpCreateTemplate() error: 0x%08X\n", ret); + return http_get_close(false, tmplId, connId, reqId); + } + tmplId = ret; + + /* Perform http_get without server verification */ + ret = sceHttpsDisableOption(SCE_HTTPS_FLAG_SERVER_VERIFY); + if (ret < 0) + { + app.DebugPrintf("sceHttpsDisableOption() error: 0x%08X\n", ret); + return http_get_close(false, tmplId, connId, reqId); + } + + /* Register SSL callback */ + ret = sceHttpsSetSslCallback(tmplId, sslCallback, (void*)&tmplId); + if (ret < 0) + { + app.DebugPrintf("sceHttpsSetSslCallback() error: 0x%08X\n", ret); + return http_get_close(false, tmplId, connId, reqId); + } + + ret = sceHttpCreateConnectionWithURL(tmplId, targetUrl, SCE_TRUE); + if (ret < 0) + { + app.DebugPrintf("sceHttpCreateConnectionWithURL() error: 0x%08X\n", ret); + return http_get_close(false, tmplId, connId, reqId); + } + connId = ret; + + ret = sceHttpCreateRequestWithURL(connId, SCE_HTTP_METHOD_GET, targetUrl, 0); + if (ret < 0) + { + app.DebugPrintf("sceHttpCreateRequestWithURL() error: 0x%08X\n", ret); + return http_get_close(false, tmplId, connId, reqId); + } + reqId = ret; + + ret = sceHttpSendRequest(reqId, NULL, 0); + if (ret < 0) + { + app.DebugPrintf("sceHttpSendRequest() error: 0x%08X\n", ret); + return http_get_close(false, tmplId, connId, reqId); + } + + ret = sceHttpGetStatusCode(reqId, &statusCode); + if (ret < 0) + { + app.DebugPrintf("sceHttpGetStatusCode() error: 0x%08X\n", ret); + return http_get_close(false, tmplId, connId, reqId); + } + app.DebugPrintf("response code = %d\n", statusCode); + + if(statusCode == 200) + { + ret = sceHttpGetResponseContentLength(reqId, &contentLength); + if(ret < 0) + { + app.DebugPrintf("sceHttpGetContentLength() error: 0x%08X\n", ret); + return http_get_close(false, tmplId, connId, reqId); + } + else + { + app.DebugPrintf("Content-Length = %lu\n", contentLength); + } + recvBuf = new SceUChar8[contentLength+1]; + int bufferLeft = contentLength+1; + SceUChar8* pCurrBuffPos = recvBuf; + int totalBytesRead = 0; + while(finFlag != SCE_TRUE) + { + ret = sceHttpReadData(reqId, pCurrBuffPos, bufferLeft); + if (ret < 0) + { + app.DebugPrintf("\n sceHttpReadData() failed 0x%08X\n", ret); + return http_get_close(false, tmplId, connId, reqId); + } + else if (ret == 0) + { + finFlag = SCE_TRUE; + } + app.DebugPrintf("\n sceHttpReadData() read %d bytes\n", ret); + pCurrBuffPos += ret; + totalBytesRead += ret; + bufferLeft -= ret; + } + } + + *ppOutData = recvBuf; + *pDataSize = contentLength; + return http_get_close(true, tmplId, connId, reqId); +} diff --git a/Minecraft.Client/PSVita/Network/SonyHttp_Vita.h b/Minecraft.Client/PSVita/Network/SonyHttp_Vita.h new file mode 100644 index 00000000..e4244b9e --- /dev/null +++ b/Minecraft.Client/PSVita/Network/SonyHttp_Vita.h @@ -0,0 +1,26 @@ +#pragma once + +#include + +class SonyHttp_Vita +{ + static int sslCallback(SceUInt32 verifyErr, SceSslCert * const sslCert[], SceInt32 certNum, void *userArg); + static bool http_get(const char *targetUrl, void** ppOutData, int* pDataSize); + static bool http_get_close(bool bOK, SceInt32 tmplId, SceInt32 connId, SceInt32 reqId); + + static void printSslError(SceInt32 sslErr, SceUInt32 sslErrDetail); + static void printSslCertInfo(SceSslCert *sslCert); + +// static int libnetMemId; + static int libsslCtxId; + static int libhttpCtxId; + + static bool bInitialised; + +public: + bool init(); + void shutdown(); + bool getDataFromURL(const char* szURL, void** ppOutData, int* pDataSize); + + static int getHTTPContextID() { return libhttpCtxId; } +}; \ No newline at end of file diff --git a/Minecraft.Client/PSVita/Network/SonyRemoteStorage_Vita.cpp b/Minecraft.Client/PSVita/Network/SonyRemoteStorage_Vita.cpp new file mode 100644 index 00000000..c103b32f --- /dev/null +++ b/Minecraft.Client/PSVita/Network/SonyRemoteStorage_Vita.cpp @@ -0,0 +1,374 @@ +#include "stdafx.h" + +#include "SonyRemoteStorage_Vita.h" +#include "SonyHttp_Vita.h" +#include +#include +#include +// #include +// #include +// #include +// #include +// #include +// #include +// #include +// #include +// #include +// #include + + + + +#define AUTH_SCOPE "psn:s2s" +#define CLIENT_ID "969e9d21-527c-4c22-b539-f8e479f690bc" +static SceRemoteStorageData s_getDataOutput; + + +void SonyRemoteStorage_Vita::staticInternalCallback(const SceRemoteStorageEvent event, int32_t retCode, void * userData) +{ + ((SonyRemoteStorage_Vita*)userData)->internalCallback(event, retCode); +} + +void SonyRemoteStorage_Vita::internalCallback(const SceRemoteStorageEvent event, int32_t retCode) +{ + m_lastErrorCode = retCode; + + switch(event) + { + case ERROR_OCCURRED: + app.DebugPrintf("An error occurred with retCode: 0x%x \n", retCode); + m_status = e_error; +// shutdown(); // removed, as the remote storage lib now tries to reconnect if an error has occurred + runCallback(); + m_bTransferStarted = false; + break; + + case GET_DATA_RESULT: + if(retCode >= 0) + { + app.DebugPrintf("Get Data success \n"); + m_status = e_getDataSucceeded; + } + else + { + app.DebugPrintf("An error occurred while Get Data was being processed. retCode: 0x%x \n", retCode); + m_status = e_error; + } + runCallback(); + m_bTransferStarted = false; + break; + + case GET_DATA_PROGRESS: + app.DebugPrintf("Get data progress: %i%%\n", retCode); + m_status = e_getDataInProgress; + m_dataProgress = retCode; + m_startTime = System::currentTimeMillis(); + break; + + case GET_STATUS_RESULT: + if(retCode >= 0) + { + app.DebugPrintf("Get Status success \n"); + app.DebugPrintf("Remaining Syncs for this user: %llu\n", outputGetStatus->remainingSyncs); + app.DebugPrintf("Number of files on the cloud: %d\n", outputGetStatus->numFiles); + for(int i = 0; i < outputGetStatus->numFiles; i++) + { + app.DebugPrintf("\n*** File %d information: ***\n", (i + 1)); + app.DebugPrintf("File name: %s \n", outputGetStatus->data[i].fileName); + app.DebugPrintf("File description: %s \n", outputGetStatus->data[i].fileDescription); + app.DebugPrintf("MD5 Checksum: %s \n", outputGetStatus->data[i].md5Checksum); + app.DebugPrintf("Size of the file: %u bytes \n", outputGetStatus->data[i].fileSize); + app.DebugPrintf("Timestamp: %s \n", outputGetStatus->data[i].timeStamp); + app.DebugPrintf("Visibility: \"%s\" \n", (outputGetStatus->data[i].visibility == 0)?"Private":((outputGetStatus->data[i].visibility == 1)?"Public read only":"Public read and write")); + } + m_status = e_getStatusSucceeded; + } + else + { + app.DebugPrintf("An error occurred while Get Status was being processed. retCode: 0x%x \n", retCode); + m_status = e_error; + } + runCallback(); + break; + + case PSN_SIGN_IN_REQUIRED: + app.DebugPrintf("User's PSN sign-in through web browser is required \n"); + m_status = e_signInRequired; + runCallback(); + break; + + case SET_DATA_RESULT: + if(retCode >= 0) + { + app.DebugPrintf("Set Data success \n"); + m_status = e_setDataSucceeded; + } + else + { + app.DebugPrintf("An error occurred while Set Data was being processed. retCode: 0x%x \n", retCode); + m_status = e_error; + } + runCallback(); + m_bTransferStarted = false; + break; + + case SET_DATA_PROGRESS: + app.DebugPrintf("Set data progress: %i%%\n", retCode); + m_status = e_setDataInProgress; + m_dataProgress = retCode; + m_startTime = System::currentTimeMillis(); + break; + + case USER_ACCOUNT_LINKED: + app.DebugPrintf("User's account has been linked with PSN \n"); + m_bInitialised = true; + m_status = e_accountLinked; + runCallback(); + break; + + case WEB_BROWSER_RESULT: + app.DebugPrintf("This function is not used on PS Vita, as the account will be linked, it is not needed to open a browser to link it \n"); + assert(0); + break; + + default: + app.DebugPrintf("This should never happen \n"); + assert(0); + break; + + } +} + +bool SonyRemoteStorage_Vita::init(CallbackFunc cb, LPVOID lpParam) +{ + int ret = 0; + int reqId = 0; + + m_callbackFunc = cb; + m_callbackParam = lpParam; + m_bTransferStarted = false; + m_bAborting = false; + + m_lastErrorCode = SCE_OK; + + + if(m_bInitialised) + { + internalCallback(USER_ACCOUNT_LINKED, 0); + return true; + } + + ret = sceNpAuthInit(); + if(ret < 0 && ret != SCE_NP_AUTH_ERROR_ALREADY_INITIALIZED) + { + app.DebugPrintf("sceNpAuthInit failed 0x%x\n", ret); + return false; + } + + ret = sceNpAuthCreateOAuthRequest(); + if (ret < 0) + { + app.DebugPrintf("Couldn't create auth request 0x%x\n", ret); + return false; + } + + reqId = ret; + + SceNpClientId clientId; + memset(&clientId, 0x0, sizeof(clientId)); + +// SceNpAuthorizationCode authCode; +// memset(&authCode, 0x0, sizeof(authCode)); + + SceNpAuthGetAuthorizationCodeParameter authParams; + memset(&authParams, 0x0, sizeof(authParams)); + + authParams.size = sizeof(authParams); + authParams.pScope = AUTH_SCOPE; + + memcpy(clientId.id, CLIENT_ID, strlen(CLIENT_ID)); + authParams.pClientId = &clientId; + + int issuerId = 0; +// ret = sceNpAuthGetAuthorizationCode(reqId, &authParams, &authCode, &issuerId); +// if (ret < 0) +// { +// app.DebugPrintf("Failed to get auth code 0x%x\n", ret); +// sceNpAuthDeleteOAuthRequest(reqId); +// return false; +// } + + ret = sceNpAuthDeleteOAuthRequest(reqId); + if (ret < 0) + { + app.DebugPrintf("Couldn't delete auth request 0x%x\n", ret); + return false; + } + + SceRemoteStorageInitParams params; + + params.callback = SonyRemoteStorage_Vita::staticInternalCallback; + params.userData = this; + params.thread.threadAffinity = SCE_KERNEL_THREAD_CPU_AFFINITY_MASK_DEFAULT; + params.thread.threadPriority = SCE_KERNEL_DEFAULT_PRIORITY_USER; +// memcpy(params.authCode, authCode.code, SCE_NP_AUTHORIZATION_CODE_MAX_LEN); + strcpy(params.clientId, CLIENT_ID); + params.timeout.connectMs = 30 * 1000; //30 seconds is the default + params.timeout.resolveMs = 30 * 1000; //30 seconds is the default + params.timeout.receiveMs = 120 * 1000; //120 seconds is the default + params.timeout.sendMs = 120 * 1000; //120 seconds is the default + params.pool.memPoolSize = 7 * 1024 * 1024; + if(m_memPoolBuffer == NULL) + m_memPoolBuffer = malloc(params.pool.memPoolSize); + params.pool.memPoolBuffer = m_memPoolBuffer; + + SceRemoteStorageAbortReqParams abortParams; + + ret = sceRemoteStorageInit(params); + if(ret >= 0) + { + abortParams.requestId = ret; + app.DebugPrintf("Session will be created \n"); + } + else if(ret == SCE_REMOTE_STORAGE_ERROR_ALREADY_INITIALISED) + { + app.DebugPrintf("Session already created \n"); + runCallback(); + } + else + { + app.DebugPrintf("Error creating session: 0x%x \n", ret); + return false; + } + return true; +} + + + +bool SonyRemoteStorage_Vita::getRemoteFileInfo(SceRemoteStorageStatus* pInfo, CallbackFunc cb, LPVOID lpParam) +{ + m_callbackFunc = cb; + m_callbackParam = lpParam; + outputGetStatus = pInfo; + + SceRemoteStorageStatusReqParams params; + reqId = sceRemoteStorageGetStatus(params, outputGetStatus); + m_status = e_getStatusInProgress; + + if(reqId >= 0) + { + app.DebugPrintf("Get Status request sent \n"); + return true; + } + else + { + app.DebugPrintf("Error sending Get Status request: 0x%x \n", reqId); + return false; + } +} + +void SonyRemoteStorage_Vita::abort() +{ + m_bAborting = true; + app.DebugPrintf("Aborting...\n"); + if(m_bTransferStarted) + { + app.DebugPrintf("transfer has started so we'll call sceRemoteStorageAbort...\n"); + + SceRemoteStorageAbortReqParams params; + params.requestId = reqId; + int ret = sceRemoteStorageAbort(params); + + if(ret >= 0) + { + app.DebugPrintf("Abort request done \n"); + } + else + { + app.DebugPrintf("Error in Abort request: 0x%x \n", ret); + } + } +} + + + +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; + + + SceRemoteStorageSetDataReqParams params; + params.visibility = PUBLIC_READ_WRITE; + strcpy(params.pathLocation, m_saveFilename); + sprintf(params.fileName, getRemoteSaveFilename()); + + GetDescriptionData(params.fileDescription); + + + if(m_bAborting) + { + runCallback(); + return false; + } + reqId = sceRemoteStorageSetData(params); + + app.DebugPrintf("\n*******************************\n"); + if(reqId >= 0) + { + app.DebugPrintf("Set Data request sent \n"); + m_bTransferStarted = true; + return true; + } + else + { + app.DebugPrintf("Error sending Set Data request: 0x%x \n", reqId); + return false; + } +} + + +bool SonyRemoteStorage_Vita::getData( const char* remotePath, const char* localPath, CallbackFunc cb, LPVOID lpParam ) +{ + m_callbackFunc = cb; + m_callbackParam = lpParam; + + SceRemoteStorageGetDataReqParams params; + sprintf(params.pathLocation, "savedata0:%s/GAMEDATA.bin", localPath); +// strcpy(params.pathLocation, localPath); + // strcpy(params.fileName, "/test/small.txt"); + strcpy(params.fileName, remotePath); + memset(¶ms.psVitaSaveDataSlot, 0, sizeof(params.psVitaSaveDataSlot)); + SceRemoteStorageData s_getDataOutput; + reqId = sceRemoteStorageGetData(params, &s_getDataOutput); + + app.DebugPrintf("\n*******************************\n"); + if(reqId >= 0) + { + app.DebugPrintf("Get Data request sent \n"); + m_bTransferStarted = true; + return true; + } + else + { + app.DebugPrintf("Error sending Get Data request: 0x%x \n", reqId); + return false; + } +} + +void SonyRemoteStorage_Vita::runCallback() +{ + assert(m_callbackFunc); + if(m_callbackFunc) + { + m_callbackFunc(m_callbackParam, m_status, m_lastErrorCode); + } + m_lastErrorCode = SCE_OK; +} diff --git a/Minecraft.Client/PSVita/Network/SonyRemoteStorage_Vita.h b/Minecraft.Client/PSVita/Network/SonyRemoteStorage_Vita.h new file mode 100644 index 00000000..13b37e3e --- /dev/null +++ b/Minecraft.Client/PSVita/Network/SonyRemoteStorage_Vita.h @@ -0,0 +1,42 @@ +#pragma once + + +#include "Common\Network\Sony\SonyRemoteStorage.h" + +class SonyRemoteStorage_Vita : public SonyRemoteStorage +{ +public: + + + virtual bool init(CallbackFunc cb, LPVOID lpParam); + + virtual bool getRemoteFileInfo(SceRemoteStorageStatus* pInfo, CallbackFunc cb, LPVOID lpParam); + virtual bool getData(const char* remotePath, const char* localPath, CallbackFunc cb, LPVOID lpParam); + + virtual void abort(); + virtual bool setDataInternal(); + +private: + int reqId; + void * psnTicket; + size_t psnTicketSize; + bool m_waitingForTicket; + bool initialized; + SceRemoteStorageStatus* outputGetStatus; + SceRemoteStorageData outputGetData; + + int32_t m_lastErrorCode; + int m_getDataProgress; + int m_setDataProgress; + char m_saveFilename[SCE_REMOTE_STORAGE_DATA_NAME_MAX_LEN]; + char m_remoteFilename[SCE_REMOTE_STORAGE_DATA_NAME_MAX_LEN]; + + + static void staticInternalCallback(const SceRemoteStorageEvent event, int32_t retCode, void * userData); + void internalCallback(const SceRemoteStorageEvent event, int32_t retCode); + + void runCallback(); + + +}; + diff --git a/Minecraft.Client/PSVita/Network/SonyVoiceChat_Vita.cpp b/Minecraft.Client/PSVita/Network/SonyVoiceChat_Vita.cpp new file mode 100644 index 00000000..842e6b8d --- /dev/null +++ b/Minecraft.Client/PSVita/Network/SonyVoiceChat_Vita.cpp @@ -0,0 +1,1092 @@ +#include "stdafx.h" +#include +#include +#include +#include +#include + +#include "SonyVoiceChat_Vita.h" + +std::vector SonyVoiceChat_Vita::m_remoteConnections; +bool SonyVoiceChat_Vita::m_bVoiceStarted = false; +int SonyVoiceChat_Vita::m_numLocalDevicesConnected = 0; +SQRLocalVoiceDevice SonyVoiceChat_Vita::m_localVoiceDevices[MAX_LOCAL_PLAYER_COUNT]; +uint32_t SonyVoiceChat_Vita::m_voiceOutPort; +bool SonyVoiceChat_Vita::m_forceSendPacket = false; // force a packet across the network, even if there's no data, so we can update flags +RingBuffer SonyVoiceChat_Vita::m_recordRingBuffer(sc_ringBufferSize); +VoicePacket::Flags SonyVoiceChat_Vita::m_localPlayerFlags[MAX_LOCAL_PLAYER_COUNT]; +bool SonyVoiceChat_Vita::m_bInitialised = false; +CRITICAL_SECTION SonyVoiceChat_Vita::m_csRemoteConnections; + +// sample related variables +SceVoiceStartParam startParam; +int32_t playSize = 0; + +static const int sc_thresholdValue = 100; + +static const bool sc_verbose = false; + +// #define _USE_PCM_AUDIO_ +//#define LOOPBACK_TEST + + + +int g_loadedPCMVoiceDataSizes[4]; +int g_loadedPCMVoiceDataPos[4]; +char* g_loadedPCMVoiceData[4]; + +static void CreatePort(uint32_t *portId, const SceVoicePortParam *pArg) +{ +// C4JThread::PushAffinityAllCores(); // PS4 only + + int err = sceVoiceCreatePort( portId, pArg ); + assert(err == SCE_OK); + assert(*portId != SCE_VOICE_INVALID_PORT_ID); +// C4JThread::PopAffinity(); // PS4 only +} + +static void DeletePort(uint32_t& port) +{ + int32_t result; + if (port != SCE_VOICE_INVALID_PORT_ID) + { + result = sceVoiceDeletePort( port ); + if (result != SCE_OK) + { + app.DebugPrintf("sceVoiceDeletePort failed %0x\n", result); + assert(0); + } + port = SCE_VOICE_INVALID_PORT_ID; + } +} + + +void LoadPCMVoiceData() +{ + for(int i=0;i<4;i++) + { + char filename[64]; + sprintf(filename, "voice%d.pcm", i+1); + HANDLE file = CreateFile(filename, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + DWORD dwHigh=0; + g_loadedPCMVoiceDataSizes[i] = GetFileSize(file,&dwHigh); + + if(g_loadedPCMVoiceDataSizes[i]!=0) + { + g_loadedPCMVoiceData[i] = new char[g_loadedPCMVoiceDataSizes[i]]; + DWORD bytesRead; + BOOL bSuccess = ReadFile(file, g_loadedPCMVoiceData[i], g_loadedPCMVoiceDataSizes[i], &bytesRead, NULL); + assert(bSuccess); + } + g_loadedPCMVoiceDataPos[i] = 0; + } +} + + +void SonyVoiceChat_Vita::init() +{ + int returnCode = SCE_OK; + + returnCode = sceSysmoduleLoadModule(SCE_SYSMODULE_VOICE); + if (returnCode < 0) + { + app.DebugPrintf("Error: sceSysmoduleLoadModule(SCE_SYSMODULE_VOICE), ret 0x%08x\n", returnCode); + assert(0); + } + + + SceVoiceInitParam params; + SceVoicePortParam portArgs; + memset( ¶ms, 0, sizeof(params) ); + params.appType = SCEVOICE_APPTYPE_GAME; + params.onEvent = 0; + returnCode = sceVoiceInit( ¶ms , SCEVOICE_VERSION_100); + if (returnCode < 0) + { + app.DebugPrintf("Error: sceVoiceInit(), ret 0x%08x\n", returnCode); + assert(0); + } + +#ifdef _USE_PCM_AUDIO_ + portArgs.portType = SCEVOICE_PORTTYPE_OUT_PCMAUDIO; + portArgs.bMute = false; + portArgs.threshold = 0; + portArgs.volume = 1.0f; + portArgs.pcmaudio.format.dataType = SCEVOICE_PCM_SHORT_LITTLE_ENDIAN; + portArgs.pcmaudio.format.sampleRate = SCE_VOICE_SAMPLINGRATE_16000; + portArgs.pcmaudio.bufSize = 4096; +#else + portArgs.portType = SCEVOICE_PORTTYPE_OUT_VOICE; + portArgs.bMute = false; + portArgs.threshold = 0; + portArgs.volume = 1.0f; + portArgs.voice.bitrate = VOICE_ENCODED_FORMAT; +#endif + CreatePort( &m_voiceOutPort, &portArgs ); + + start(); + m_bInitialised = true; +#ifdef LOOPBACK_TEST + // LoadPCMVoiceData(); + initLocalPlayer(0); + connectPorts(m_localVoiceDevices[0].m_microphonePort, m_localVoiceDevices[0].m_headsetPort); + // SQRVoiceConnection* pConnection = addRemoteConnection(0, 0); + // connectPlayer(pConnection, 0); +#endif + InitializeCriticalSection(&m_csRemoteConnections); +} + +void SonyVoiceChat_Vita::shutdown() +{ + m_bInitialised = false; + int32_t result; + + DeletePort( m_voiceOutPort); + result = sceVoiceStop(); + assert(result == SCE_OK); + result = sceVoiceEnd(); + assert(result == SCE_OK); + + m_bVoiceStarted=false; + sceKernelFreeMemBlock(startParam.container); + + int returnCode = sceSysmoduleUnloadModule(SCE_SYSMODULE_VOICE); + if (returnCode < 0) + { + app.DebugPrintf("Error: sceSysmoduleUnloadModule(SCE_SYSMODULE_VOICE), ret 0x%08x\n", returnCode); + assert(0); + } + + DeleteCriticalSection(&m_csRemoteConnections); +} + + +void SonyVoiceChat_Vita::start() +{ + if( m_bVoiceStarted == false) + { + startParam.container = sceKernelAllocMemBlock("SceUserVoiceEvent", SCE_KERNEL_MEMBLOCK_TYPE_USER_RWDATA, SCE_VOICE_MEMORY_CONTAINER_SIZE, SCE_NULL); + int err; + +// C4JThread::PushAffinityAllCores(); // PS4 only + err = sceVoiceStart(&startParam); + assert(err == SCE_OK); +// C4JThread::PopAffinity(); // PS4 only + + m_bVoiceStarted = true; + } +} + +void SonyVoiceChat_Vita::checkFinished() +{ + EnterCriticalSection(&m_csRemoteConnections); + + for(int i=0;im_bFlaggedForShutdown) + m_remoteConnections[i]->m_bFlaggedForShutdown = true; + } +// assert(m_numLocalDevicesConnected == 0); + + LeaveCriticalSection(&m_csRemoteConnections); +} + +void SonyVoiceChat_Vita::setEnabled( bool bEnabled ) +{ +} + + + +// Internal send function. This attempts to send as many elements in the queue as possible until the write function tells us that we can't send any more. This way, +// we are guaranteed that if there *is* anything more in the queue left to send, we'll get a CELL_RUDP_CONTEXT_EVENT_WRITABLE event when whatever we've managed to +// send here is complete, and can continue on. +void SQRVoiceConnection::SendMoreInternal() +{ + bool keepSending; + do + { + EnterCriticalSection(&m_csQueue); + keepSending = false; + if( m_sendQueue.size() > 0) + { + // Attempt to send the full data in the first element in our queue + unsigned char *data= m_sendQueue.front().current; + int dataSize = m_sendQueue.front().end - m_sendQueue.front().current; + int ret = sceRudpWrite( m_rudpCtx, data, dataSize, 0);//CELL_RUDP_MSG_LATENCY_CRITICAL ); + int wouldBlockFlag = SCE_RUDP_ERROR_WOULDBLOCK; + + if( ret == dataSize ) + { + // Fully sent, remove from queue - will loop in the while loop to see if there's anything else in the queue we could send + delete [] m_sendQueue.front().start; + m_sendQueue.pop(); + if( m_sendQueue.size() ) + { + keepSending = true; + } + } + else if( ( ret >= 0 ) || ( ret == wouldBlockFlag ) ) + { + + + // Things left to send - adjust this element in the queue + int remainingBytes; + if( ret >= 0 ) + { + // Only ret bytes sent so far + remainingBytes = dataSize - ret; + assert(remainingBytes > 0 ); + } + else + { + // Is CELL_RUDP_ERROR_WOULDBLOCK, nothing has yet been sent + remainingBytes = dataSize; + } + m_sendQueue.front().current = m_sendQueue.front().end - remainingBytes; + } + } + LeaveCriticalSection(&m_csQueue); + } while (keepSending); +} + +void SQRVoiceConnection::SendInternal(const void *data, unsigned int dataSize) +{ + EnterCriticalSection(&m_csQueue); + + QueuedSendBlock sendBlock; + + unsigned char *dataCurrent = (unsigned char *)data; + unsigned int dataRemaining = dataSize; + + while( dataRemaining ) + { + int dataSize = dataRemaining; + if( dataSize > SNP_MAX_PAYLOAD ) dataSize = SNP_MAX_PAYLOAD; + sendBlock.start = new unsigned char [dataSize]; + sendBlock.end = sendBlock.start + dataSize; + sendBlock.current = sendBlock.start; + memcpy( sendBlock.start, dataCurrent, dataSize); + m_sendQueue.push(sendBlock); + dataRemaining -= dataSize; + dataCurrent += dataSize; + } + +// app.DebugPrintf("voice sent %d bytes\n", dataSize); + + // Now try and send as much as we can + SendMoreInternal(); + + LeaveCriticalSection(&m_csQueue); +} + +void SQRVoiceConnection::readRemoteData() +{ + unsigned int dataSize = sceRudpGetSizeReadable(m_rudpCtx); + if( dataSize > 0 ) + { + VoicePacket packet; + unsigned int bytesRead = sceRudpRead( m_rudpCtx, &packet, dataSize, 0, NULL ); + unsigned int writeSize; + if( bytesRead > 0 ) + { +// app.DebugPrintf("voice received %d bytes\n", bytesRead); + writeSize = bytesRead; + if(packet.verifyData(bytesRead, 19)) + addPacket(packet); +// m_playRingBuffer.Write((char*)data, writeSize); + + } + } + +} + + + +SQRVoiceConnection::SQRVoiceConnection( int rudpCtx, SceNpMatching2RoomMemberId remoteRoomMemberId ) + : m_rudpCtx(rudpCtx) + , m_remoteRoomMemberId(remoteRoomMemberId) + , m_bConnected(false) + , m_headsetConnectionMask(0) + , m_playRingBuffer(sc_ringBufferSize) +{ + InitializeCriticalSection(&m_csQueue); + InitializeCriticalSection(&m_csPacketQueue); + + SceVoiceInitParam params; + SceVoicePortParam portArgs; +#ifdef _USE_PCM_AUDIO_ + portArgs.portType = SCEVOICE_PORTTYPE_IN_PCMAUDIO; + portArgs.bMute = false; + portArgs.threshold = 100; + portArgs.volume = 1.0f; + portArgs.pcmaudio.format.sampleRate= SCEVOICE_SAMPLINGRATE_16000; + portArgs.pcmaudio.format.dataType = SCEVOICE_PCM_SHORT_LITTLE_ENDIAN; + portArgs.pcmaudio.bufSize = 4096; +#else + portArgs.portType = SCEVOICE_PORTTYPE_IN_VOICE; + portArgs.bMute = false; + portArgs.threshold = sc_thresholdValue; // compensate network jitter + portArgs.volume = 1.0f; + portArgs.voice.bitrate = VOICE_ENCODED_FORMAT; +#endif + CreatePort( &m_voiceInPort, &portArgs ); + m_nextExpectedFrameIndex = 0; + m_bFlaggedForShutdown = false; +} + +SQRVoiceConnection::~SQRVoiceConnection() +{ + DeleteCriticalSection(&m_csQueue); + DeleteCriticalSection(&m_csPacketQueue); + sceRudpTerminate( m_rudpCtx ); + app.DebugPrintf("-----------------------------\n"); + app.DebugPrintf("Voice rudp context deleted %d\n", m_rudpCtx); + app.DebugPrintf("-----------------------------\n"); + + DeletePort(m_voiceInPort); + +} + +bool SQRVoiceConnection::getNextPacket( VoicePacket& packet ) +{ + EnterCriticalSection(&m_csPacketQueue); + bool retVal = false; + if(m_receivedVoicePackets.size() > 0) + { + retVal = true; + packet = m_receivedVoicePackets.front(); + m_receivedVoicePackets.pop(); + } + LeaveCriticalSection(&m_csPacketQueue); + return retVal; +} + +void SQRVoiceConnection::addPacket( VoicePacket& packet ) +{ + EnterCriticalSection(&m_csPacketQueue); + m_receivedVoicePackets.push(packet); + LeaveCriticalSection(&m_csPacketQueue); +} + +int g_frameNum = 0; +bool g_bRecording = false; + + +uint32_t frameSendIndex = 0; +uint32_t lastReadFrameCnt = 0; + + +void PrintAllOutputVoiceStates( std::vector& connections) +{ + for(int rIdx=0;rIdxm_voiceInPort, &portInfo ); + static SceVoicePortState lastPortState = SCEVOICE_PORTSTATE_IDLE; + if(portInfo.state != lastPortState) + { + lastPortState = portInfo.state; + switch(portInfo.state) + { + case SCEVOICE_PORTSTATE_IDLE: + app.DebugPrintf(" ----- SCE_VOICE_PORTSTATE_IDLE\n"); + break; + case SCEVOICE_PORTSTATE_BUFFERING: + app.DebugPrintf(" ----- SCE_VOICE_PORTSTATE_BUFFERING\n"); + break; + case SCEVOICE_PORTSTATE_RUNNING: + app.DebugPrintf(" ----- SCE_VOICE_PORTSTATE_RUNNING\n"); + break; + case SCEVOICE_PORTSTATE_READY: + app.DebugPrintf(" ----- SCE_VOICE_PORTSTATE_READY\n"); + break; + case SCEVOICE_PORTSTATE_NULL: + default: + app.DebugPrintf(" ----- SCE_VOICE_PORTSTATE_NULL\n"); + break; + } + } + } + +} + + +void SonyVoiceChat_Vita::sendPCMMicData() +{ + int32_t result; + uint32_t outputPortBytes; + VoicePacket packetToSend; + uint32_t readSize; + SceVoiceBasePortInfo portInfo; + memset( &portInfo, 0, sizeof(portInfo) ); + uint16_t frameGap = 0; + + DWORD tick = GetTickCount(); + static DWORD lastTick = 0; + int numFrames = ceilf((tick - lastTick)/16.0f); + lastTick = tick; + readSize = 512 * numFrames; + + if(g_loadedPCMVoiceDataPos[0] + readSize < g_loadedPCMVoiceDataSizes[0]) + { + for(int i=0;i (g_loadedPCMVoiceDataSizes[0] + 8192)) + g_loadedPCMVoiceDataPos[0] = 0; + + +} + +void SonyVoiceChat_Vita::sendAllVoiceData() +{ + int32_t result; + uint32_t outputPortBytes; + VoicePacket packetToSend; + uint32_t readSize; + SceVoiceBasePortInfo portInfo; + memset( &portInfo, 0, sizeof(portInfo) ); + uint16_t frameGap = 0; + + VoicePacket::Flags lastPlayerFlags[MAX_LOCAL_PLAYER_COUNT]; + + for(int i=0; isizeof(packetToSend.m_data))?sizeof(packetToSend.m_data):outputPortBytes; + if( outputPortBytes || flagsChanged || m_forceSendPacket) + { + frameSendIndex += lastReadFrameCnt; + if(outputPortBytes) + { + readSize = outputPortBytes; + result = sceVoiceReadFromOPort(m_voiceOutPort, packetToSend.m_data, &readSize ); + if (result != SCE_OK) + { + app.DebugPrintf("sceVoiceReadFromOPort failed %0x\n", result); + assert(0); + return; + } + lastReadFrameCnt = readSize/portInfo.frameSize; + assert(readSize%portInfo.frameSize == 0); + + packetToSend.m_numFrames = lastReadFrameCnt; + packetToSend.m_frameSendIndex = frameSendIndex; + packetToSend.setChecksum(readSize); + } + else + { + readSize = 0; + packetToSend.m_numFrames = 0; + packetToSend.m_frameSendIndex = frameSendIndex; + packetToSend.setChecksum(readSize); + + } + + + int packetSize = packetToSend.getPacketSize(readSize); + + EnterCriticalSection(&m_csRemoteConnections); + + // send this packet out to all our remote connections + for(int rIdx=0;rIdxm_bConnected) + m_remoteConnections[rIdx]->SendInternal(&packetToSend, packetSize); + } + + LeaveCriticalSection(&m_csRemoteConnections); + } + m_forceSendPacket = false; +} + +bool g_bPlaying = false; + +void SonyVoiceChat_Vita::playAllReceivedData() +{ + EnterCriticalSection(&m_csRemoteConnections); + // write all the incoming data from the network to each of the input voices + for(int rIdx=0;rIdxgetNextPacket(packet)) // MGH - changed to a while loop, so all the packets are sent to the voice port, and it can handle delayed packets due to the size of it's internal buffer + { + int frameGap; + if (pVoice->m_nextExpectedFrameIndex == packet.m_frameSendIndex) + { + // no voice frame drop, continuous frames + frameGap = 0; + if(sc_verbose) + app.DebugPrintf("index@%d gets expected frame\n",pVoice->m_nextExpectedFrameIndex); + pVoice->m_nextExpectedFrameIndex = packet.m_frameSendIndex + packet.m_numFrames; + } + else if (pVoice->m_nextExpectedFrameIndex < packet.m_frameSendIndex) + { + // has voice frame drop, dropped forwarding frames + frameGap = packet.m_frameSendIndex - pVoice->m_nextExpectedFrameIndex; + if(sc_verbose) + app.DebugPrintf("index@%d gets dropped forwarding frames %d\n",pVoice->m_nextExpectedFrameIndex, frameGap); + pVoice->m_nextExpectedFrameIndex = packet.m_frameSendIndex + packet.m_numFrames; + } + else if (pVoice->m_nextExpectedFrameIndex > packet.m_frameSendIndex) + { + // has voice frame drop, dropped preceding frames, no reset on pVoice->m_nextExpectedFrameIndex + frameGap = packet.m_frameSendIndex - pVoice->m_nextExpectedFrameIndex; + if(sc_verbose) + app.DebugPrintf("index@%d gets dropped forwarding frames %d\n", pVoice->m_nextExpectedFrameIndex, frameGap); + } + + SceVoiceBasePortInfo portInfo; + int result = sceVoiceGetPortInfo(pVoice->m_voiceInPort, &portInfo ); + if (result != SCE_OK) + { + if(sc_verbose) + app.DebugPrintf("sceVoiceGetPortInfo LoopbackVoiceInPort failed %x\n", result); + assert(0); + LeaveCriticalSection(&m_csRemoteConnections); + return; + } + uint32_t writeSize = packet.m_numFrames * portInfo.frameSize; + int inputPortBytes = portInfo.numByte; + inputPortBytes = (inputPortBytes>writeSize)?writeSize:inputPortBytes; + writeSize = inputPortBytes; + result = sceVoiceWriteToIPort(pVoice->m_voiceInPort, packet.m_data, &writeSize, frameGap); + if (result != SCE_OK) + { + if(sc_verbose) + app.DebugPrintf("sceVoiceWriteToIPort failed %0x\n", result); + assert(0); + LeaveCriticalSection(&m_csRemoteConnections); + return; + } + if (writeSize != inputPortBytes) + { + // libvoice internal voice in port buffer fulls + if(sc_verbose) + app.DebugPrintf("internal voice in port buffer fulls. \n"); + } + packet.m_numFrames = 0; + + // copy the flags + for(int flagIndex=0;flagIndexm_remotePlayerFlags[flagIndex] = packet.m_localPlayerFlags[flagIndex]; + } + } + LeaveCriticalSection(&m_csRemoteConnections); + +} + +void SonyVoiceChat_Vita::tick() +{ + if(m_bInitialised) + { +// DWORD tick = GetTickCount(); +// static DWORD lastTick = 0; +// app.DebugPrintf("Time since last voice tick : %d ms\n", tick - lastTick); +// lastTick = tick; + g_frameNum++; + sendAllVoiceData(); + playAllReceivedData(); + + EnterCriticalSection(&m_csRemoteConnections); + + for(int i=m_remoteConnections.size()-1;i>=0;i--) + { + if(m_remoteConnections[i]->m_bFlaggedForShutdown) + { + delete m_remoteConnections[i]; + m_remoteConnections.erase(m_remoteConnections.begin() + i); + } + } + + LeaveCriticalSection(&m_csRemoteConnections); + + } +} + + + +bool SonyVoiceChat_Vita::hasMicConnected(SQRNetworkPlayer* pNetPlayer) +{ + if(CGameNetworkManager::usingAdhocMode()) // no voice chat in adhoc + return false; + + if(pNetPlayer->IsLocal()) + { + return m_localPlayerFlags[pNetPlayer->GetLocalPlayerIndex()].m_bHasMicConnected; + } + else + { + EnterCriticalSection(&m_csRemoteConnections); + for(int i=0;im_remoteRoomMemberId == pNetPlayer->m_roomMemberId) + { + bool bMicConnected = pVoice->m_remotePlayerFlags[pNetPlayer->GetLocalPlayerIndex()].m_bHasMicConnected; + LeaveCriticalSection(&m_csRemoteConnections); + return bMicConnected; + } + } + LeaveCriticalSection(&m_csRemoteConnections); + } + // if we get here we've not found the player, panic!! + assert(0); + return false; +} + +void SonyVoiceChat_Vita::mute( bool bMute ) +{ +} + +void SonyVoiceChat_Vita::mutePlayer( const SceNpMatching2RoomMemberId member_id, bool bMute ) /*Turn chat audio from a specified player on or off */ +{ +} + +void SonyVoiceChat_Vita::muteLocalPlayer( bool bMute ) /*Turn microphone input on or off */ +{ +} + +bool SonyVoiceChat_Vita::isMuted() +{ + return false; +} + +bool SonyVoiceChat_Vita::isMutedPlayer( const PlayerUID& memberUID) +{ + return false; +} + +bool SonyVoiceChat_Vita::isMutedLocalPlayer() +{ + return false; +} + + +bool SonyVoiceChat_Vita::isTalking(SQRNetworkPlayer* pNetPlayer) +{ + if(CGameNetworkManager::usingAdhocMode()) // no voice chat in adhoc + return false; + + if(pNetPlayer->IsLocal()) + { + return m_localPlayerFlags[pNetPlayer->GetLocalPlayerIndex()].m_bTalking; + } + else + { + EnterCriticalSection(&m_csRemoteConnections); + for(int i=0;im_remoteRoomMemberId == pNetPlayer->m_roomMemberId) + { + bool bTalking = pVoice->m_remotePlayerFlags[pNetPlayer->GetLocalPlayerIndex()].m_bTalking; + LeaveCriticalSection(&m_csRemoteConnections); + return bTalking; + } + } + LeaveCriticalSection(&m_csRemoteConnections); + } + // if we get here we've not found the player, panic!! + assert(0); + return false; +} + + +void SQRLocalVoiceDevice::init(bool bChatRestricted) +{ + SceVoiceInitParam params; + SceVoicePortParam portArgs; + + int returnCode = 0; + m_bChatRestricted = bChatRestricted; + + portArgs.portType = SCEVOICE_PORTTYPE_IN_DEVICE; + portArgs.bMute = false; + portArgs.threshold = 0; + portArgs.volume = 1.0f; + portArgs.device.playerId = 0; +// portArgs.device.type = SCE_AUDIO_IN_TYPE_VOICE; +// portArgs.device.index = 0; + CreatePort( &m_microphonePort, &portArgs ); +// m_micAudioDevicePort = sceAudioInOpen(localUserID, +// SCE_AUDIO_IN_TYPE_VOICE, 0, +// SCE_AUDIO_IN_GRAIN_DEFAULT, +// SCE_AUDIO_IN_FREQ_DEFAULT, +// SCE_AUDIO_IN_PARAM_FORMAT_S16_MONO); +// assert(m_micAudioDevicePort >= 0); + + portArgs.portType = SCEVOICE_PORTTYPE_OUT_DEVICE; + portArgs.bMute = false; + portArgs.threshold = 0; + portArgs.volume = 1.0f; + portArgs.device.playerId = 0; +// portArgs.device.type = SCE_AUDIO_OUT_PORT_TYPE_VOICE; +// portArgs.device.index = 0; + CreatePort( &m_headsetPort, &portArgs ); + + m_bValid = true; + +} + + + +void SQRLocalVoiceDevice::shutdown() +{ + + assert(isValid()); + m_bValid = false; + DeletePort(m_microphonePort); + DeletePort(m_headsetPort); +// int err = sceAudioInClose(m_micAudioDevicePort); +// assert(err == SCE_OK); +// m_micAudioDevicePort = -1; +} + + + +SQRVoiceConnection* SonyVoiceChat_Vita::addRemoteConnection( int RudpCxt, SceNpMatching2RoomMemberId peerMemberId) +{ + EnterCriticalSection(&m_csRemoteConnections); + SQRVoiceConnection* pConn = new SQRVoiceConnection(RudpCxt, peerMemberId); + m_remoteConnections.push_back(pConn); + m_forceSendPacket = true; // new connection, so we'll force a packet through for the flags + LeaveCriticalSection(&m_csRemoteConnections); + + return pConn; +} + +void SonyVoiceChat_Vita::connectPorts(uint32_t inPort, uint32_t outPort) +{ + int returnCode = sceVoiceConnectIPortToOPort(inPort, outPort); + if (returnCode != SCE_OK ) + { + app.DebugPrintf("sceVoiceConnectIPortToOPort failed (0x%08x), inPort 0x%08x, outPort 0x%08x\n", returnCode, inPort, outPort); + assert(0); + } +} +void SonyVoiceChat_Vita::disconnectPorts(uint32_t inPort, uint32_t outPort) +{ + int returnCode = sceVoiceDisconnectIPortFromOPort(inPort, outPort); + if (returnCode != SCE_OK ) + { + app.DebugPrintf("sceVoiceDisconnectIPortFromOPort failed (0x%08x), inPort 0x%08x, outPort 0x%08x\n", returnCode, inPort, outPort); + assert(0); + } +} + + +void SonyVoiceChat_Vita::makeLocalConnections() +{ + // connect all mics to other devices headsets, for local chat + for(int i=0;iisValid()) + { + for(int j=0;jisValid()) + { + if(pConnectFrom->m_localConnections[j] == false) + { + if(pConnectTo->m_bChatRestricted == false && pConnectFrom->m_bChatRestricted == false) + { + connectPorts(pConnectFrom->m_microphonePort, pConnectTo->m_headsetPort); + pConnectFrom->m_localConnections[j] = true; + } + } + } + } + } + } +} + +void SonyVoiceChat_Vita::breakLocalConnections(int playerIdx) +{ + // break any connections with devices that are no longer valid + for(int i=0;im_localConnections[j] == true) + { + SQRLocalVoiceDevice* pConnectedTo = &m_localVoiceDevices[j]; + if(i==playerIdx || j==playerIdx) + { + if(pConnectedTo->m_bChatRestricted == false && pConnectedFrom->m_bChatRestricted == false) + { + disconnectPorts(pConnectedFrom->m_microphonePort, pConnectedTo->m_headsetPort); + pConnectedFrom->m_localConnections[j] = false; + } + } + } + } + } +} + + +void SonyVoiceChat_Vita::initLocalPlayer(int playerIndex) +{ + if(m_localVoiceDevices[playerIndex].isValid() == false) + { + bool chatRestricted = false; + ProfileManager.GetChatAndContentRestrictions(ProfileManager.GetPrimaryPad(),false,&chatRestricted,NULL,NULL); + + // create all device ports required + m_localVoiceDevices[playerIndex].init(chatRestricted); + m_numLocalDevicesConnected++; + if(m_localVoiceDevices[playerIndex].m_bChatRestricted == false) + { + connectPorts(m_localVoiceDevices[playerIndex].m_microphonePort, m_voiceOutPort); + } + m_forceSendPacket = true; // new local device, so we'll force a packet through for the flags + + } + makeLocalConnections(); +} + +void SonyVoiceChat_Vita::connectPlayer(SQRVoiceConnection* pConnection, int playerIndex) +{ + if((pConnection->m_headsetConnectionMask & (1 << playerIndex)) == 0) + { + initLocalPlayer(playerIndex); // added this as we can get a client->client connection coming in first, and the network player hasn't been created yet (so this hasn't been initialised) + if(m_localVoiceDevices[playerIndex].m_bChatRestricted == false) + { + connectPorts(pConnection->m_voiceInPort, m_localVoiceDevices[playerIndex].m_headsetPort); + } + pConnection->m_headsetConnectionMask |= (1 << playerIndex); + app.DebugPrintf("Connecting player %d to rudp context %d\n", playerIndex, pConnection->m_rudpCtx); + m_forceSendPacket = true; // new connection, so we'll force a packet through for the flags + } +} + +SQRVoiceConnection* SonyVoiceChat_Vita::GetVoiceConnectionFromRudpCtx( int RudpCtx ) +{ + for(int i=0;im_rudpCtx == RudpCtx) + return m_remoteConnections[i]; + } + return NULL; +} + +void SonyVoiceChat_Vita::connectPlayerToAll( int playerIndex ) +{ + EnterCriticalSection(&m_csRemoteConnections); + + for(int i=0;im_remoteRoomMemberId == roomMemberID) + { + return m_remoteConnections[i]; + } + } + + return NULL; +} + +void SonyVoiceChat_Vita::disconnectLocalPlayer( int localIdx ) +{ + if(m_localVoiceDevices[localIdx].isValid() == false) + return; + + EnterCriticalSection(&m_csRemoteConnections); + + if(m_localVoiceDevices[localIdx].m_bChatRestricted == false) + { + disconnectPorts(m_localVoiceDevices[localIdx].m_microphonePort, m_voiceOutPort); + + for(int i=0;im_voiceInPort, m_localVoiceDevices[localIdx].m_headsetPort); + m_remoteConnections[i]->m_headsetConnectionMask &= (~(1 << localIdx)); + app.DebugPrintf("disconnecting player %d from rudp context %d\n", localIdx, m_remoteConnections[i]->m_rudpCtx); + } + } + m_numLocalDevicesConnected--; + + if(m_numLocalDevicesConnected == 0) // no more local players, kill all the remote connections + { + for(int i=0;i=0); + if(voiceIdx>=0) + { + m_remoteConnections[voiceIdx]->m_bFlaggedForShutdown = true; + } + + LeaveCriticalSection(&m_csRemoteConnections); + +} + +void SonyVoiceChat_Vita::setConnected( int RudpCtx ) +{ + SQRVoiceConnection* pVoice = GetVoiceConnectionFromRudpCtx(RudpCtx); + if(pVoice) + { + pVoice->m_bConnected = true; + m_forceSendPacket = true; + } + else + { + assert(false); + } +} + + + + +RingBuffer::RingBuffer( int sizeBytes ) +{ + buffer = new char[sizeBytes]; + buf_size = sizeBytes; + buf_full = buf_free = 0; +} + + +int RingBuffer::Write( char* data, int len_ ) +{ + if (len_ <= 0) return len_; + unsigned int len = (unsigned int)len_; + unsigned int data_size = buf_size - (buf_free - buf_full); + if (len > data_size) + len = data_size; + data_size = buf_size - (buf_free % buf_size); + if (data_size > len) + data_size = len; + memcpy(buffer + (buf_free % buf_size), data, data_size); + if (data_size != len) + memcpy(buffer, data + data_size, len - data_size); + buf_free += len; + return len; +} + +int RingBuffer::Read( char* data, int max_bytes_ ) +{ + if (max_bytes_ <= 0) return max_bytes_; + unsigned int max_bytes = (unsigned int)max_bytes_; + unsigned int result = buf_free - buf_full; + if (result > max_bytes) + result = max_bytes; + unsigned int chunk = buf_size - (buf_full % buf_size); + if (chunk > result) + chunk = result; + memcpy(data, buffer + (buf_full % buf_size), chunk); + if (chunk != result) + memcpy(data + chunk, buffer, result - chunk); + buf_full += result; + return result; +} diff --git a/Minecraft.Client/PSVita/Network/SonyVoiceChat_Vita.h b/Minecraft.Client/PSVita/Network/SonyVoiceChat_Vita.h new file mode 100644 index 00000000..6ece603f --- /dev/null +++ b/Minecraft.Client/PSVita/Network/SonyVoiceChat_Vita.h @@ -0,0 +1,222 @@ +#pragma once + +#include +#include +#include +#include +#include "Common/Network/Sony/SQRNetworkPlayer.h" + +static const int sc_maxVoiceDataSize = 2048; + + +class VoicePacket +{ + static const int MAX_LOCAL_PLAYER_COUNT = 1; + +public: + struct Flags + { + bool m_bTalking : 1; + bool m_bHasMicConnected : 1; + }; + + Flags m_localPlayerFlags[MAX_LOCAL_PLAYER_COUNT]; + uint32_t m_frameSendIndex; + uint32_t m_numFrames; + uint32_t m_checkSum; + uint32_t m_playerIndexFlags; + char m_data[sc_maxVoiceDataSize]; + + static int getPacketSize(int dataSize) { return (uint64_t)&((VoicePacket*)0)->m_data[dataSize];} + void setChecksum(int dataSize) + { + m_checkSum = 0; + for(int i=0;i, +// the reader thread changes pointer +class RingBuffer +{ +public: + RingBuffer(int sizeBytes); + ~RingBuffer() { delete buffer; } + void Reset(void) { buf_full = buf_free = 0; } + unsigned int DataSize(void) { return (buf_free - buf_full); } + int Write(char* data, int len_); + int Read(char* data, int max_bytes_); + int getDataSize() { return buf_free - buf_full; } + void ResetByWriter(void) { buf_free = buf_full; } + void ResetByReader(void) { buf_full = buf_free; } + +private: + char* buffer; + unsigned int buf_size; + unsigned int buf_full; + unsigned int buf_free; +}; + + +static const int sc_ringBufferSize = 16384; + +class SQRLocalVoiceDevice +{ +public: + uint32_t m_headsetPort; + uint32_t m_microphonePort; +// int32_t m_micAudioDevicePort; + uint8_t m_localConnections[4]; // connection between this devices mic and other local player's headsets + bool m_bChatRestricted; + + bool m_bValid; + +public: + SQRLocalVoiceDevice() + : m_headsetPort(SCE_VOICE_INVALID_PORT_ID) + , m_microphonePort(SCE_VOICE_INVALID_PORT_ID) + , m_bValid(false) +// , m_micAudioDevicePort(-1) + { + for(int i=0;i<4;i++) + m_localConnections[i] = 0; + } + + void init(bool bChatRestricted); + + void shutdown(); + bool isValid() { return m_bValid; } +// void setBitRate() +// { +// int err = sceVoiceSetBitRate(uint32_t portId, +// SceVoiceBitRate bitrate +// ); +// } +}; + +#define VOICE_ENCODED_FORMAT SCEVOICE_BITRATE_7300 + + + +class SQRVoiceConnection +{ + static const int MAX_LOCAL_PLAYER_COUNT = 1; + + static const int SNP_MAX_PAYLOAD = 1346; // This is the default RUDP payload size - if we want to change this we'll need to use cellRudpSetOption to set something else & adjust segment size + class QueuedSendBlock + { + public: + unsigned char *start; + unsigned char *end; + unsigned char *current; + }; + + std::queue m_sendQueue; + CRITICAL_SECTION m_csQueue; + +public: + int m_rudpCtx; + bool m_bConnected; + uint32_t m_voiceInPort; // 1 input port per connection, incoming UDP packets are written to each of these, and then they're connected out to all headsets + int m_headsetConnectionMask; // 1 bit per player, if the headset connection has been made + RingBuffer m_playRingBuffer; + SceNpMatching2RoomMemberId m_remoteRoomMemberId; // Assigned by Matching2 lib, we can use to indicate which machine this player belongs to (note - 16 bits) + std::queue m_receivedVoicePackets; + CRITICAL_SECTION m_csPacketQueue; + VoicePacket::Flags m_remotePlayerFlags[MAX_LOCAL_PLAYER_COUNT]; + uint32_t m_nextExpectedFrameIndex; + bool m_bFlaggedForShutdown; + SQRVoiceConnection(int rudpCtx, SceNpMatching2RoomMemberId remoteRoomMemberId); + ~SQRVoiceConnection(); + + void SendInternal(const void *data, unsigned int dataSize); + void SendMoreInternal(); + void readRemoteData(); + bool getNextPacket(VoicePacket& packet); + void addPacket(VoicePacket& packet); + + +}; + +class SonyVoiceChat_Vita +{ +public: + + static void init(); + static void start(); + static void shutdown(); + static void tick(); + static void checkFinished(); + static void setEnabled(bool bEnabled); + static bool hasMicConnected(SQRNetworkPlayer* pNetPlayer); + static bool isTalking(SQRNetworkPlayer* pNetPlayer); + static void mute(bool bMute); //Turn chat audio on or off + static void mutePlayer(const SceNpMatching2RoomMemberId member_id, bool bMute); //Turn chat audio from a specified player on or off; + static void muteLocalPlayer(bool bMute); //Turn microphone input on or off; + + static bool isMuted(); + static bool isMutedPlayer(const PlayerUID& memberUID); + static bool isMutedLocalPlayer(); //Turn microphone input on or off; + + static void initLocalPlayer(int playerIndex); + + static SQRVoiceConnection* addRemoteConnection(int RudpCxt, SceNpMatching2RoomMemberId peerMemberId); + static void connectPlayer(SQRVoiceConnection* pConnection, int playerIndex); + static void connectPlayerToAll(int playerIndex); + static void disconnectLocalPlayer(int localIdx); + static void disconnectRemoteConnection( SQRVoiceConnection* pVoice ); + + static void VoiceEventCallback( SceVoiceEventData* pEvent ); + + static std::vector m_remoteConnections; + static void connectPorts(uint32_t inPort, uint32_t outPort); + static void disconnectPorts(uint32_t inPort, uint32_t outPort); + static void makeLocalConnections(); + static void breakLocalConnections(int playerIdx); + + static void sendAllVoiceData(); + static void playAllReceivedData(); + + static void sendPCMMicData(); + static SQRVoiceConnection* getVoiceConnectionFromRoomMemberID(SceNpMatching2RoomMemberId roomMemberID); + + static SQRVoiceConnection* GetVoiceConnectionFromRudpCtx(int RudpCtx); + static void setConnected(int RudpCtx); + +private: + + static const int MAX_LOCAL_PLAYER_COUNT = 1; + + static bool m_bVoiceStarted; + static int m_numLocalDevicesConnected; + static SQRLocalVoiceDevice m_localVoiceDevices[MAX_LOCAL_PLAYER_COUNT]; + + static uint32_t m_voiceOutPort; // single output port that all local devices are mixed to, and then sent out to all other remote machines + + static RingBuffer m_recordRingBuffer; + static RingBuffer m_playRingBuffer; + static VoicePacket::Flags m_localPlayerFlags[MAX_LOCAL_PLAYER_COUNT]; + static bool m_forceSendPacket; // force a packet across the network, even if there's no data, so we can update flags + static bool m_bInitialised; + static CRITICAL_SECTION m_csRemoteConnections; + + +}; \ No newline at end of file diff --git a/Minecraft.Client/PSVita/PSVitaExtras/Conf.h b/Minecraft.Client/PSVita/PSVitaExtras/Conf.h new file mode 100644 index 00000000..8e255b41 --- /dev/null +++ b/Minecraft.Client/PSVita/PSVitaExtras/Conf.h @@ -0,0 +1,84 @@ +/* SCE CONFIDENTIAL +* Copyright (C) 2014 Sony Computer Entertainment Inc. +* All Rights Reserved. +*/ + + +#ifndef __SCE_NP_CONF_H__ +#define __SCE_NP_CONF_H__ + +#include + +static const SceNpCommunicationId s_npCommunicationId = { + {'N', 'P', 'W', 'R', '0', '6', '8', '5', '9'}, + '\0', + 0, + 0 +}; + +/*** +SceNpCommunicationPassphrase + +8129251a703ff265e6d2b777bcf1854d3c6ea7f656626170131163c6e8edcb4110dd6247d40e1d8d06ebdbb610f8046c85332bc4de7946da49635459628a0d13243a6cda7ae3462a4d65d20cb2839b2e311dd7ff5006ec1379c37d3b49f137e2981050601ba4efa2ccc445c1cfc0fbd6b2f075f19490830cb995a6ad779de1d8 +***/ + +static const SceNpCommunicationPassphrase s_npCommunicationPassphrase = { + { + 0x81,0x29,0x25,0x1a,0x70,0x3f,0xf2,0x65, + 0xe6,0xd2,0xb7,0x77,0xbc,0xf1,0x85,0x4d, + 0x3c,0x6e,0xa7,0xf6,0x56,0x62,0x61,0x70, + 0x13,0x11,0x63,0xc6,0xe8,0xed,0xcb,0x41, + 0x10,0xdd,0x62,0x47,0xd4,0x0e,0x1d,0x8d, + 0x06,0xeb,0xdb,0xb6,0x10,0xf8,0x04,0x6c, + 0x85,0x33,0x2b,0xc4,0xde,0x79,0x46,0xda, + 0x49,0x63,0x54,0x59,0x62,0x8a,0x0d,0x13, + 0x24,0x3a,0x6c,0xda,0x7a,0xe3,0x46,0x2a, + 0x4d,0x65,0xd2,0x0c,0xb2,0x83,0x9b,0x2e, + 0x31,0x1d,0xd7,0xff,0x50,0x06,0xec,0x13, + 0x79,0xc3,0x7d,0x3b,0x49,0xf1,0x37,0xe2, + 0x98,0x10,0x50,0x60,0x1b,0xa4,0xef,0xa2, + 0xcc,0xc4,0x45,0xc1,0xcf,0xc0,0xfb,0xd6, + 0xb2,0xf0,0x75,0xf1,0x94,0x90,0x83,0x0c, + 0xb9,0x95,0xa6,0xad,0x77,0x9d,0xe1,0xd8 + } +}; + +/*** +SceNpCommunicationSignature + +b9dde13b01000000000000005c66a0cfc0c22c63dc050021c2e3537360ca40370ff68a60596b1fc84364cebe3459359579ca2ef8c151fc920ee4cf25eb4a926c572891b840eafa35ebfb5d67744b8f8bbd7cd53245ec12a639423a2eb520e8c381c5afa3095727c3ca1612351ed9921940b779dfbcf84b72b5978c5c07fadf11fe8f5a33c41405dea8d59673f1eedbda420cf48618c895c9d4271154d7c9e952 +***/ + +static const SceNpCommunicationSignature s_npCommunicationSignature = { + { + 0xb9,0xdd,0xe1,0x3b,0x01,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x5c,0x66,0xa0,0xcf, + 0xc0,0xc2,0x2c,0x63,0xdc,0x05,0x00,0x21, + 0xc2,0xe3,0x53,0x73,0x60,0xca,0x40,0x37, + 0x0f,0xf6,0x8a,0x60,0x59,0x6b,0x1f,0xc8, + 0x43,0x64,0xce,0xbe,0x34,0x59,0x35,0x95, + 0x79,0xca,0x2e,0xf8,0xc1,0x51,0xfc,0x92, + 0x0e,0xe4,0xcf,0x25,0xeb,0x4a,0x92,0x6c, + 0x57,0x28,0x91,0xb8,0x40,0xea,0xfa,0x35, + 0xeb,0xfb,0x5d,0x67,0x74,0x4b,0x8f,0x8b, + 0xbd,0x7c,0xd5,0x32,0x45,0xec,0x12,0xa6, + 0x39,0x42,0x3a,0x2e,0xb5,0x20,0xe8,0xc3, + 0x81,0xc5,0xaf,0xa3,0x09,0x57,0x27,0xc3, + 0xca,0x16,0x12,0x35,0x1e,0xd9,0x92,0x19, + 0x40,0xb7,0x79,0xdf,0xbc,0xf8,0x4b,0x72, + 0xb5,0x97,0x8c,0x5c,0x07,0xfa,0xdf,0x11, + 0xfe,0x8f,0x5a,0x33,0xc4,0x14,0x05,0xde, + 0xa8,0xd5,0x96,0x73,0xf1,0xee,0xdb,0xda, + 0x42,0x0c,0xf4,0x86,0x18,0xc8,0x95,0xc9, + 0xd4,0x27,0x11,0x54,0xd7,0xc9,0xe9,0x52 + } +}; + +static const SceNpCommunicationConfig s_npCommunicationConfig = +{ + &s_npCommunicationId, + &s_npCommunicationPassphrase, + &s_npCommunicationSignature +}; + +#endif /* __SCE_NP_CONF_H__ */ \ No newline at end of file diff --git a/Minecraft.Client/PSVita/PSVitaExtras/CustomMap.cpp b/Minecraft.Client/PSVita/PSVitaExtras/CustomMap.cpp new file mode 100644 index 00000000..1327a6d6 --- /dev/null +++ b/Minecraft.Client/PSVita/PSVitaExtras/CustomMap.cpp @@ -0,0 +1,132 @@ +#include "stdafx.h" +#include "CustomMap.h" + + +CustomMap::CustomMap() +{ + m_NodePool = NULL; + m_NodePoolSize = 0; + m_NodePoolIndex = 0; + + m_HashSize = 1024; + m_HashTable = (SCustomMapNode**) malloc(m_HashSize * sizeof(SCustomMapNode)); + + clear(); +} + +CustomMap::~CustomMap() +{ + for( int i = 0;i < m_NodePoolSize; i += 1 ) + { + free(m_NodePool[i]); + } + free(m_NodePool); + + free(m_HashTable); +} + +void CustomMap::clear() +{ + // reset the pool index + m_NodePoolIndex = 0; + + // clear the hash table + memset(m_HashTable, 0, m_HashSize * sizeof(SCustomMapNode)); +} + +SCustomMapNode* CustomMap::find(const ChunkPos &Key) +{ + unsigned int Hash = (Key.x & 0x00000001f) | (Key.z << 5); // hopefully this will produce a good hash for a 1024 entry table + unsigned int Index = Hash & (m_HashSize-1); + + SCustomMapNode* Node = m_HashTable[Index]; + while( Node && Node->Hash != Hash ) + { + Node = Node->Next; + } + + return Node; +} + +int CustomMap::end() +{ + return m_NodePoolIndex; +} + +SCustomMapNode* CustomMap::get(int index) +{ + return m_NodePool[index]; +} + +void CustomMap::insert(const ChunkPos &Key, bool Value) +{ + // see if this key already exists + SCustomMapNode* Node = find(Key); + + if( !Node ) + { + // do we have any space in the pool + if( m_NodePoolIndex >= m_NodePoolSize ) + { + resize(); + } + + // grab the next node from the pool + Node = m_NodePool[m_NodePoolIndex]; + m_NodePoolIndex++; + } + else + { + Node->second = Value; + return; + } + + // create the new node; + unsigned int Hash = (Key.x & 0x00000001f) | (Key.z << 5); // hopefully this will produce a good hash for a 1024 entry table + unsigned int Index = Hash & (m_HashSize-1); + Node->Hash = Hash; + Node->first = Key; + Node->second = Value; + Node->Next = NULL; + + // are any nodes in this hash index + if( !m_HashTable[Index] ) + { + m_HashTable[Index] = Node; + } + else + { + // loop to the last node in the hash list + SCustomMapNode* OldNode = m_HashTable[Index]; + while( OldNode->Next ) + { + OldNode = OldNode->Next; + } + + // link the old last node to the new one + OldNode->Next = Node; + } +} + +void CustomMap::resize() +{ + int OldPoolSize = m_NodePoolSize; + m_NodePoolSize += 512; + SCustomMapNode **NodePool; + if( m_NodePool ) + { + NodePool = (SCustomMapNode**) realloc(m_NodePool, m_NodePoolSize * sizeof(SCustomMapNode)); + } + else + { + NodePool = (SCustomMapNode**) malloc(m_NodePoolSize * sizeof(SCustomMapNode)); + } + + for( int i = 0;i < m_NodePoolSize - OldPoolSize;i += 1 ) + { + NodePool[i + OldPoolSize] = (SCustomMapNode*) malloc(sizeof(SCustomMapNode)); + } + + m_NodePool = NodePool; +} + diff --git a/Minecraft.Client/PSVita/PSVitaExtras/CustomMap.h b/Minecraft.Client/PSVita/PSVitaExtras/CustomMap.h new file mode 100644 index 00000000..005d7b6e --- /dev/null +++ b/Minecraft.Client/PSVita/PSVitaExtras/CustomMap.h @@ -0,0 +1,43 @@ +#ifndef CustomMap_H +#define CustomMap_H +// AP - This replaces the std::unordered_map used in MobSpawner.h +// The problem with the original system is that it calls malloc for every insert it does. Not only is that expensive in itself but it also +// clashes with any other mallocs on other threads (specifically the large amount of mallocing being done in Level.h for the std::unordered_set) +// causing huge stalls. +// This isn't really a univeral replacement for std::unordered_map and is quite specific to MobSpawner.h + +#include "../../../Minecraft.World/ChunkPos.h" + +typedef struct SCustomMapNode +{ + unsigned int Hash; + ChunkPos first; + bool second; + struct SCustomMapNode *Next; +} SCustomMapNode; + +class CustomMap +{ +private: + SCustomMapNode **m_NodePool; + int m_NodePoolSize; + int m_NodePoolIndex; + + int m_HashSize; + SCustomMapNode **m_HashTable; + +public: + CustomMap(); + ~CustomMap(); + + void clear(); + SCustomMapNode* find(const ChunkPos &Key); + int end(); + SCustomMapNode* get(int index); + void insert(const ChunkPos &Key, bool Value); + +private: + void resize(); +}; + +#endif // CustomMap_H \ No newline at end of file diff --git a/Minecraft.Client/PSVita/PSVitaExtras/CustomSet.cpp b/Minecraft.Client/PSVita/PSVitaExtras/CustomSet.cpp new file mode 100644 index 00000000..6538a236 --- /dev/null +++ b/Minecraft.Client/PSVita/PSVitaExtras/CustomSet.cpp @@ -0,0 +1,130 @@ +#include "stdafx.h" +#include "CustomSet.h" + + +CustomSet::CustomSet() +{ + m_NodePool = NULL; + m_NodePoolSize = 0; + m_NodePoolIndex = 0; + + m_HashSize = 1024; + m_HashTable = (SCustomSetNode**) malloc(m_HashSize * sizeof(SCustomSetNode)); + + clear(); +} + +CustomSet::~CustomSet() +{ + for( int i = 0;i < m_NodePoolSize; i += 1 ) + { + free(m_NodePool[i]); + } + free(m_NodePool); + + free(m_HashTable); +} + +void CustomSet::clear() +{ + // reset the pool index + m_NodePoolIndex = 0; + + // clear the hash table + memset(m_HashTable, 0, m_HashSize * sizeof(SCustomSetNode)); +} + +SCustomSetNode* CustomSet::find(const ChunkPos &Key) +{ + unsigned int Hash = (Key.x & 0x00000001f) | (Key.z << 5); // hopefully this will produce a good hash for a 1024 entry table + unsigned int Index = Hash & (m_HashSize-1); + + SCustomSetNode* Node = m_HashTable[Index]; + while( Node && Node->Hash != Hash ) + { + Node = Node->Next; + } + + return Node; +} + +int CustomSet::end() +{ + return m_NodePoolIndex; +} + +ChunkPos CustomSet::get(int index) +{ + return m_NodePool[index]->key; +} + +void CustomSet::insert(const ChunkPos &Key) +{ + // see if this key already exists + SCustomSetNode* Node = find(Key); + + if( !Node ) + { + // do we have any space in the pool + if( m_NodePoolIndex >= m_NodePoolSize ) + { + resize(); + } + + // grab the next node from the pool + Node = m_NodePool[m_NodePoolIndex]; + m_NodePoolIndex++; + } + else + { + return; + } + + // create the new node; + unsigned int Hash = (Key.x & 0x00000001f) | (Key.z << 5); // hopefully this will produce a good hash for a 1024 entry table + unsigned int Index = Hash & (m_HashSize-1); + Node->Hash = Hash; + Node->key = Key; + Node->Next = NULL; + + // are any nodes in this hash index + if( !m_HashTable[Index] ) + { + m_HashTable[Index] = Node; + } + else + { + // loop to the last node in the hash list + SCustomSetNode* OldNode = m_HashTable[Index]; + while( OldNode->Next ) + { + OldNode = OldNode->Next; + } + + // link the old last node to the new one + OldNode->Next = Node; + } +} + +void CustomSet::resize() +{ + int OldPoolSize = m_NodePoolSize; + m_NodePoolSize += 512; + SCustomSetNode **NodePool; + if( m_NodePool ) + { + NodePool = (SCustomSetNode**) realloc(m_NodePool, m_NodePoolSize * sizeof(SCustomSetNode)); + } + else + { + NodePool = (SCustomSetNode**) malloc(m_NodePoolSize * sizeof(SCustomSetNode)); + } + + for( int i = 0;i < m_NodePoolSize - OldPoolSize;i += 1 ) + { + NodePool[i + OldPoolSize] = (SCustomSetNode*) malloc(sizeof(SCustomSetNode)); + } + + m_NodePool = NodePool; +} + diff --git a/Minecraft.Client/PSVita/PSVitaExtras/CustomSet.h b/Minecraft.Client/PSVita/PSVitaExtras/CustomSet.h new file mode 100644 index 00000000..46f96276 --- /dev/null +++ b/Minecraft.Client/PSVita/PSVitaExtras/CustomSet.h @@ -0,0 +1,42 @@ +#ifndef CustomSet_H +#define CustomSet_H +// AP - This replaces the std::unordered_set used in Level.h +// The problem with the original system is that it calls malloc for every insert it does. Not only is that expensive in itself but it also +// clashes with any other mallocs on other threads (specifically the large amount of mallocing being done in MobSpawner for the std::unordered_map) +// causing huge stalls. +// This isn't really a univeral replacement for std::unordered_set and is quite specific to Level.h + +#include "../../../Minecraft.World/ChunkPos.h" + +typedef struct SCustomSetNode +{ + unsigned int Hash; + ChunkPos key; + struct SCustomSetNode *Next; +} SCustomSetNode; + +class CustomSet +{ +private: + SCustomSetNode **m_NodePool; + int m_NodePoolSize; + int m_NodePoolIndex; + + int m_HashSize; + SCustomSetNode **m_HashTable; + +public: + CustomSet(); + ~CustomSet(); + + void clear(); + SCustomSetNode* find(const ChunkPos &Key); + int end(); + ChunkPos get(int index); + void insert(const ChunkPos &Key); + +private: + void resize(); +}; + +#endif // CustomSet_H \ No newline at end of file diff --git a/Minecraft.Client/PSVita/PSVitaExtras/PSVitaMaths.h b/Minecraft.Client/PSVita/PSVitaExtras/PSVitaMaths.h new file mode 100644 index 00000000..fa6c3955 --- /dev/null +++ b/Minecraft.Client/PSVita/PSVitaExtras/PSVitaMaths.h @@ -0,0 +1,11 @@ +#pragma once +#include +using namespace sce::Vectormath::Simd::Aos; + +typedef Vector4 XMVECTOR; +typedef Matrix4 XMMATRIX; +typedef Vector4 XMFLOAT4; + +XMMATRIX XMMatrixMultiply(XMMATRIX a, XMMATRIX b); +XMVECTOR XMMatrixDeterminant(XMMATRIX a); +XMMATRIX XMMatrixInverse(Vector4 *a, XMMATRIX b); \ No newline at end of file diff --git a/Minecraft.Client/PSVita/PSVitaExtras/PSVitaStrings.cpp b/Minecraft.Client/PSVita/PSVitaExtras/PSVitaStrings.cpp new file mode 100644 index 00000000..ad9e423b --- /dev/null +++ b/Minecraft.Client/PSVita/PSVitaExtras/PSVitaStrings.cpp @@ -0,0 +1,51 @@ +#include "stdafx.h" +#include "PSVitaStrings.h" +#include + +uint8_t *mallocAndCreateUTF8ArrayFromString(int iID) +{ + LPCWSTR wchString=app.GetString(iID); + size_t src_len,dst_len; + int iLen=wcslen(wchString); + src_len=sizeof(WCHAR)*(iLen); + + SceCesUcsContext context; + int result = sceCesUcsContextInit( &context ); + + if( result != S_OK ) + { + app.DebugPrintf("sceCesUcsContextInit failed\n"); + return NULL; + } + + uint32_t utf16Len; + uint32_t utf8Len; + result = sceCesUtf16StrGetUtf8Len( &context, + (uint16_t *)wchString, + iLen, + &utf16Len, + &utf8Len + ); + + utf8Len += 1; + uint8_t *strUtf8=(uint8_t *)malloc(utf8Len); + memset(strUtf8,0,utf8Len); + + + result = sceCesUtf16StrToUtf8Str( + &context, + (uint16_t *)wchString, + iLen, + &utf16Len, + strUtf8, + utf8Len, + &utf8Len + ); + if( result != SCE_OK ) + { + app.DebugPrintf("sceCesUtf16StrToUtf8Str: conversion error : 0x%x\n", result); + return NULL; + } + + return strUtf8; +} \ No newline at end of file diff --git a/Minecraft.Client/PSVita/PSVitaExtras/PSVitaStrings.h b/Minecraft.Client/PSVita/PSVitaExtras/PSVitaStrings.h new file mode 100644 index 00000000..63b7d792 --- /dev/null +++ b/Minecraft.Client/PSVita/PSVitaExtras/PSVitaStrings.h @@ -0,0 +1,3 @@ +#pragma once + +uint8_t *mallocAndCreateUTF8ArrayFromString(int iID); diff --git a/Minecraft.Client/PSVita/PSVitaExtras/PSVitaStubs.h b/Minecraft.Client/PSVita/PSVitaExtras/PSVitaStubs.h new file mode 100644 index 00000000..180ebbbc --- /dev/null +++ b/Minecraft.Client/PSVita/PSVitaExtras/PSVitaStubs.h @@ -0,0 +1,468 @@ +#pragma once +//#include +#include + +// AP recreate Sony's assert macro +/*E Macros for halting of program execution. */ +#ifndef SCE_BREAK +/** Breaks program execution. If a debugger is attached, the user can resume execution immediately. */ +#define SCE_BREAK() _SCE_BREAK() +#endif /* #ifndef SCE_BREAK */ + +#ifndef _CONTENT_PACKAGE +#define _SCE_MACRO_BEGIN do { +#define _SCE_MACRO_END } while(0) +#define SCE_DBG_ASSERT(test) _SCE_MACRO_BEGIN { (void)sizeof((test)); } _SCE_MACRO_END +#else +#define SCE_DBG_ASSERT(test) +#endif + +//const char* getConsoleHomePath(); +char* getUsrDirPath(); + +void PSVitaInit(); + +DWORD TlsAlloc(VOID); +LPVOID TlsGetValue(DWORD dwTlsIndex); +BOOL TlsSetValue(DWORD dwTlsIndex, LPVOID lpTlsValue); + +typedef struct _RECT +{ + LONG left; + LONG top; + LONG right; + LONG bottom; +} RECT, *PRECT; + +typedef struct _TOUCHSCREENRECT +{ + SceInt16 left; + SceInt16 top; + SceInt16 right; + SceInt16 bottom; +} +TOUCHSCREENRECT, *PTOUCHSCREENRECT; + +typedef void ID3D11Device; +typedef void ID3D11DeviceContext; +typedef void IDXGISwapChain; +typedef RECT D3D11_RECT; +typedef void ID3D11Buffer; +typedef DWORD (*PTHREAD_START_ROUTINE)( LPVOID lpThreadParameter); +typedef PTHREAD_START_ROUTINE LPTHREAD_START_ROUTINE; + +typedef int errno_t; + +// typedef struct _RTL_CRITICAL_SECTION { +// // +// // The following field is used for blocking when there is contention for +// // the resource +// // +// +// union { +// ULONG_PTR RawEvent[4]; +// } Synchronization; +// +// // +// // The following three fields control entering and exiting the critical +// // section for the resource +// // +// +// LONG LockCount; +// LONG RecursionCount; +// HANDLE OwningThread; +// } RTL_CRITICAL_SECTION, *PRTL_CRITICAL_SECTION; + +class PSVitaCriticalSection +{ +public: + SceKernelLwMutexWork mutex; +}; + +class PSVitaCriticalRWSection +{ +public: + SceUID RWLock; +}; + +typedef PSVitaCriticalSection RTL_CRITICAL_SECTION; +typedef PSVitaCriticalSection* PRTL_CRITICAL_SECTION; + +typedef RTL_CRITICAL_SECTION CRITICAL_SECTION; +typedef PRTL_CRITICAL_SECTION PCRITICAL_SECTION; +typedef PRTL_CRITICAL_SECTION LPCRITICAL_SECTION; + +typedef PSVitaCriticalRWSection RTL_CRITICAL_RW_SECTION; +typedef PSVitaCriticalRWSection* PRTL_CRITICAL_RW_SECTION; + +typedef RTL_CRITICAL_RW_SECTION CRITICAL_RW_SECTION; +typedef PRTL_CRITICAL_RW_SECTION PCRITICAL_RW_SECTION; +typedef PRTL_CRITICAL_RW_SECTION LPCRITICAL_RW_SECTION; + +void EnterCriticalSection(CRITICAL_SECTION* _c); +void LeaveCriticalSection(CRITICAL_SECTION* _c); +void InitializeCriticalSection(CRITICAL_SECTION* _c); +void DeleteCriticalSection(CRITICAL_SECTION* _c); +HANDLE CreateEvent(void* lpEventAttributes, BOOL bManualReset, BOOL bInitialState, LPCSTR lpName); +VOID Sleep(DWORD dwMilliseconds); +BOOL SetThreadPriority(HANDLE hThread, int nPriority); +DWORD WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds); + +LONG InterlockedCompareExchangeRelease(LONG volatile *Destination, LONG Exchange,LONG Comperand ); + + +VOID InitializeCriticalSection(PCRITICAL_SECTION CriticalSection); +VOID InitializeCriticalSectionAndSpinCount(PCRITICAL_SECTION CriticalSection, ULONG SpinCount); +VOID DeleteCriticalSection(PCRITICAL_SECTION CriticalSection); +VOID EnterCriticalSection(PCRITICAL_SECTION CriticalSection); +VOID LeaveCriticalSection(PCRITICAL_SECTION CriticalSection); +ULONG TryEnterCriticalSection(PCRITICAL_SECTION CriticalSection); +DWORD WaitForMultipleObjects(DWORD nCount, CONST HANDLE *lpHandles,BOOL bWaitAll,DWORD dwMilliseconds); + +// AP - RW criticals added to allow simultaneous read but not R/W or W/W +VOID InitializeCriticalRWSection(PCRITICAL_RW_SECTION CriticalSection); +VOID DeleteCriticalRWSection(PCRITICAL_RW_SECTION CriticalSection); +VOID EnterCriticalRWSection(PCRITICAL_RW_SECTION CriticalSection, bool Write); +VOID LeaveCriticalRWSection(PCRITICAL_RW_SECTION CriticalSection, bool Write); + +LONG64 InterlockedCompareExchangeRelease64(LONG64 volatile *Destination, LONG64 Exchange, LONG64 Comperand); + +BOOL CloseHandle(HANDLE hObject); +BOOL SetEvent(HANDLE hEvent); + +HMODULE GetModuleHandle(LPCSTR lpModuleName); + +HANDLE CreateThread( void* lpThreadAttributes, DWORD dwStackSize, void* lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId ); +DWORD ResumeThread( HANDLE hThread ); +DWORD GetCurrentThreadId(VOID); +DWORD WaitForMultipleObjectsEx(DWORD nCount,CONST HANDLE *lpHandles,BOOL bWaitAll,DWORD dwMilliseconds,BOOL bAlertable ); +BOOL GetExitCodeThread(HANDLE hThread, LPDWORD lpExitCode); + + +// AP - all this virtual stuff has been added because Vita doesn't have a virtual memory system so we allocate 1MB real memory chunks instead +// and access memory reads and writes via VirtualCopyTo and VirtualCopyFrom which divides memcpys across multiple 1MB chunks if required +#define VIRTUAL_PAGE_SIZE (1024*1024) // out page size 1MB +#define VIRTUAL_OFFSET 1000000 // we use this just so we don't indicate 'out of memory' to ConsoleSaveFile by returning 0 +LPVOID VirtualAlloc(LPVOID lpAddress, SIZE_T dwSize, DWORD flAllocationType, DWORD flProtect); +BOOL VirtualFree(LPVOID lpAddress, SIZE_T dwSize, DWORD dwFreeType); +VOID VirtualCopyTo(LPVOID lpDestOffset, LPVOID lpSrc, SIZE_T dwSize); +VOID VirtualCopyFrom(LPVOID lpDest, LPVOID lpSrcOffset, SIZE_T dwSize); +VOID VirtualMove(LPVOID lpDestOffset, LPVOID lpSrcOffset, SIZE_T dwSize); +BOOL VirtualWriteFile(LPCSTR lpFileName, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped ); +VOID VirtualCompress(LPVOID lpDest,LPDWORD lpNewSize, LPVOID lpAddress, SIZE_T dwSize); +VOID VirtualDecompress(LPVOID buf, SIZE_T dwSize); +VOID VirtualMemset(LPVOID lpDestOffset, int val, SIZE_T dwSize); + + +DWORD GetFileSize( HANDLE hFile, LPDWORD lpFileSizeHigh ); +BOOL GetFileSizeEx(HANDLE hFile, PLARGE_INTEGER lpFileSize ); +BOOL WriteFileWithName(LPCSTR lpFileName, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped ); +BOOL WriteFile( HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped ); +BOOL ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped ); +#define INVALID_SET_FILE_POINTER false +BOOL SetFilePointer(HANDLE hFile, LONG lDistanceToMove, PLONG lpDistanceToMoveHigh, DWORD dwMoveMethod); +HANDLE CreateFileA(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile); +#define CreateFile CreateFileA +BOOL CreateDirectoryA(LPCSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes); +#define CreateDirectory CreateDirectoryA +BOOL DeleteFileA(LPCSTR lpFileName); +#define DeleteFile DeleteFileA +DWORD GetFileAttributesA(LPCSTR lpFileName); +#define GetFileAttributes GetFileAttributesA +BOOL MoveFileA(LPCSTR lpExistingFileName, LPCSTR lpNewFileName); +#define MoveFile MoveFileA + +#define MAX_PATH 260 + +void __debugbreak(); +VOID DebugBreak(VOID); + + +enum D3D11_BLEND +{ + D3D11_BLEND_ZERO = 1, + D3D11_BLEND_ONE = 2, + D3D11_BLEND_SRC_COLOR = 3, + D3D11_BLEND_INV_SRC_COLOR = 4, + D3D11_BLEND_SRC_ALPHA = 5, + D3D11_BLEND_INV_SRC_ALPHA = 6, + D3D11_BLEND_DEST_ALPHA = 7, + D3D11_BLEND_INV_DEST_ALPHA = 8, + D3D11_BLEND_DEST_COLOR = 9, + D3D11_BLEND_INV_DEST_COLOR = 10, + D3D11_BLEND_SRC_ALPHA_SAT = 11, + D3D11_BLEND_BLEND_FACTOR = 14, + D3D11_BLEND_INV_BLEND_FACTOR = 15, + D3D11_BLEND_SRC1_COLOR = 16, + D3D11_BLEND_INV_SRC1_COLOR = 17, + D3D11_BLEND_SRC1_ALPHA = 18, + D3D11_BLEND_INV_SRC1_ALPHA = 19 +}; + + +enum D3D11_COMPARISON_FUNC +{ + D3D11_COMPARISON_NEVER = 1, + D3D11_COMPARISON_LESS = 2, + D3D11_COMPARISON_EQUAL = 3, + D3D11_COMPARISON_LESS_EQUAL = 4, + D3D11_COMPARISON_GREATER = 5, + D3D11_COMPARISON_NOT_EQUAL = 6, + D3D11_COMPARISON_GREATER_EQUAL = 7, + D3D11_COMPARISON_ALWAYS = 8 +}; + + +typedef struct _SYSTEMTIME { + WORD wYear; + WORD wMonth; + WORD wDayOfWeek; + WORD wDay; + WORD wHour; + WORD wMinute; + WORD wSecond; + WORD wMilliseconds; +} SYSTEMTIME, *PSYSTEMTIME, *LPSYSTEMTIME; + +VOID GetSystemTime( LPSYSTEMTIME lpSystemTime); +BOOL FileTimeToSystemTime(CONST FILETIME *lpFileTime, LPSYSTEMTIME lpSystemTime); +BOOL SystemTimeToFileTime(CONST SYSTEMTIME *lpSystemTime, LPFILETIME lpFileTime); +VOID GetLocalTime(LPSYSTEMTIME lpSystemTime); + +typedef struct _MEMORYSTATUS { + DWORD dwLength; + DWORD dwMemoryLoad; + SIZE_T dwTotalPhys; + SIZE_T dwAvailPhys; + SIZE_T dwTotalPageFile; + SIZE_T dwAvailPageFile; + SIZE_T dwTotalVirtual; + SIZE_T dwAvailVirtual; +} MEMORYSTATUS, *LPMEMORYSTATUS; + + +#define WINAPI + +#define CREATE_SUSPENDED 0x00000004 + +#define THREAD_BASE_PRIORITY_LOWRT 15 // value that gets a thread to LowRealtime-1 +#define THREAD_BASE_PRIORITY_MAX 2 // maximum thread base priority boost +#define THREAD_BASE_PRIORITY_MIN -2 // minimum thread base priority boost +#define THREAD_BASE_PRIORITY_IDLE -15 // value that gets a thread to idle + +#define THREAD_PRIORITY_LOWEST THREAD_BASE_PRIORITY_MIN +#define THREAD_PRIORITY_BELOW_NORMAL (THREAD_PRIORITY_LOWEST+1) +#define THREAD_PRIORITY_NORMAL 0 +#define THREAD_PRIORITY_HIGHEST THREAD_BASE_PRIORITY_MAX +#define THREAD_PRIORITY_ABOVE_NORMAL (THREAD_PRIORITY_HIGHEST-1) +#define THREAD_PRIORITY_ERROR_RETURN (MAXLONG) + +#define THREAD_PRIORITY_TIME_CRITICAL THREAD_BASE_PRIORITY_LOWRT +#define THREAD_PRIORITY_IDLE THREAD_BASE_PRIORITY_IDLE + +#define WAIT_TIMEOUT 258L +#define STATUS_ABANDONED_WAIT_0 ((DWORD )0x00000080L) +#define WAIT_ABANDONED ((STATUS_ABANDONED_WAIT_0 ) + 0 ) + +#define MAXUINT_PTR (~((UINT_PTR)0)) +#define MAXINT_PTR ((INT_PTR)(MAXUINT_PTR >> 1)) +#define MININT_PTR (~MAXINT_PTR) + +#define MAXULONG_PTR (~((ULONG_PTR)0)) +#define MAXLONG_PTR ((LONG_PTR)(MAXULONG_PTR >> 1)) +#define MINLONG_PTR (~MAXLONG_PTR) + +#define MAXUHALF_PTR ((UHALF_PTR)~0) +#define MAXHALF_PTR ((HALF_PTR)(MAXUHALF_PTR >> 1)) +#define MINHALF_PTR (~MAXHALF_PTR) + +#define INVALID_HANDLE_VALUE ((HANDLE)0) +// +// Generic test for success on any status value (non-negative numbers +// indicate success). +// + +//#define HRESULT_SUCCEEDED(Status) ((HRESULT)(Status) >= 0) + +// +// and the inverse +// +#define _HRESULT_TYPEDEF_(_sc) _sc + +#define FAILED(Status) ((HRESULT)(Status)<0) +#define MAKE_HRESULT(sev,fac,code) \ + ((HRESULT) (((unsigned int)(sev)<<31) | ((unsigned int)(fac)<<16) | ((unsigned int)(code))) ) +#define MAKE_SCODE(sev,fac,code) \ + ((SCODE) (((unsigned int)(sev)<<31) | ((unsigned int)(fac)<<16) | ((unsigned int)(code))) ) +#define E_FAIL _HRESULT_TYPEDEF_(0x80004005L) +#define E_ABORT _HRESULT_TYPEDEF_(0x80004004L) +#define E_NOINTERFACE _HRESULT_TYPEDEF_(0x80004002L) + +#define GENERIC_READ (0x80000000L) +#define GENERIC_WRITE (0x40000000L) +#define GENERIC_EXECUTE (0x20000000L) +#define GENERIC_ALL (0x10000000L) + +#define FILE_SHARE_READ 0x00000001 +#define FILE_SHARE_WRITE 0x00000002 +#define FILE_SHARE_DELETE 0x00000004 +#define FILE_ATTRIBUTE_READONLY 0x00000001 +#define FILE_ATTRIBUTE_HIDDEN 0x00000002 +#define FILE_ATTRIBUTE_SYSTEM 0x00000004 +#define FILE_ATTRIBUTE_DIRECTORY 0x00000010 +#define FILE_ATTRIBUTE_ARCHIVE 0x00000020 +#define FILE_ATTRIBUTE_DEVICE 0x00000040 +#define FILE_ATTRIBUTE_NORMAL 0x00000080 +#define FILE_ATTRIBUTE_TEMPORARY 0x00000100 + +#define FILE_FLAG_WRITE_THROUGH 0x80000000 +#define FILE_FLAG_OVERLAPPED 0x40000000 +#define FILE_FLAG_NO_BUFFERING 0x20000000 +#define FILE_FLAG_RANDOM_ACCESS 0x10000000 +#define FILE_FLAG_SEQUENTIAL_SCAN 0x08000000 +#define FILE_FLAG_DELETE_ON_CLOSE 0x04000000 +#define FILE_FLAG_BACKUP_SEMANTICS 0x02000000 + +#define FILE_BEGIN 0 +#define FILE_CURRENT 1 +#define FILE_END 2 + +#define CREATE_NEW 1 +#define CREATE_ALWAYS 2 +#define OPEN_EXISTING 3 +#define OPEN_ALWAYS 4 +#define TRUNCATE_EXISTING 5 + +#define PAGE_NOACCESS 0x01 +#define PAGE_READONLY 0x02 +#define PAGE_READWRITE 0x04 +#define PAGE_WRITECOPY 0x08 +#define PAGE_EXECUTE 0x10 +#define PAGE_EXECUTE_READ 0x20 +#define PAGE_EXECUTE_READWRITE 0x40 +#define PAGE_EXECUTE_WRITECOPY 0x80 +#define PAGE_GUARD 0x100 +#define PAGE_NOCACHE 0x200 +#define PAGE_WRITECOMBINE 0x400 +#define PAGE_USER_READONLY 0x1000 +#define PAGE_USER_READWRITE 0x2000 +#define MEM_COMMIT 0x1000 +#define MEM_RESERVE 0x2000 +#define MEM_DECOMMIT 0x4000 +#define MEM_RELEASE 0x8000 +#define MEM_FREE 0x10000 +#define MEM_PRIVATE 0x20000 +#define MEM_RESET 0x80000 +#define MEM_TOP_DOWN 0x100000 +#define MEM_NOZERO 0x800000 +#define MEM_LARGE_PAGES 0x20000000 +#define MEM_HEAP 0x40000000 +#define MEM_16MB_PAGES 0x80000000 + +#define IGNORE 0 // Ignore signal +#define INFINITE 0xFFFFFFFF // Infinite timeout +#define WAIT_FAILED ((DWORD)0xFFFFFFFF) +#define STATUS_WAIT_0 ((DWORD )0x00000000L) +#define WAIT_OBJECT_0 ((STATUS_WAIT_0 ) + 0 ) +#define STATUS_PENDING ((DWORD )0x00000103L) +#define STILL_ACTIVE STATUS_PENDING + +DWORD GetLastError(VOID); +VOID GlobalMemoryStatus(LPMEMORYSTATUS lpBuffer); + +DWORD GetTickCount(); +BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency); +BOOL QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount); + + +#define ERROR_SUCCESS 0L +#define ERROR_IO_PENDING 997L // dderror +#define ERROR_CANCELLED 1223L +#define S_OK ((HRESULT)0x00000000L) +#define S_FALSE ((HRESULT)0x00000001L) + +#define RtlEqualMemory(Destination,Source,Length) (!memcmp((Destination),(Source),(Length))) +#define RtlMoveMemory(Destination,Source,Length) memmove((Destination),(Source),(Length)) +#define RtlCopyMemory(Destination,Source,Length) memcpy((Destination),(Source),(Length)) +#define RtlFillMemory(Destination,Length,Fill) memset((Destination),(Fill),(Length)) +#define RtlZeroMemory(Destination,Length) memset((Destination),0,(Length)) + +#define MoveMemory RtlMoveMemory +#define CopyMemory RtlCopyMemory +#define FillMemory RtlFillMemory +#define ZeroMemory RtlZeroMemory + +#define CDECL +#define APIENTRY + +#define VK_ESCAPE 0x1B +#define VK_RETURN 0x0D + +VOID OutputDebugStringW(LPCWSTR lpOutputString); +VOID OutputDebugString(LPCSTR lpOutputString); +VOID OutputDebugStringA(LPCSTR lpOutputString); + +errno_t _itoa_s(int _Value, char * _DstBuf, size_t _Size, int _Radix); +errno_t _i64toa_s(__int64 _Val, char * _DstBuf, size_t _Size, int _Radix); + +#define __declspec(a) +extern "C" int _wcsicmp (const wchar_t * dst, const wchar_t * src); + +size_t wcsnlen(const wchar_t *wcs, size_t maxsize); + +typedef struct _WIN32_FIND_DATAA { + DWORD dwFileAttributes; + FILETIME ftCreationTime; + FILETIME ftLastAccessTime; + FILETIME ftLastWriteTime; + DWORD nFileSizeHigh; + DWORD nFileSizeLow; + DWORD dwReserved0; + DWORD dwReserved1; + CHAR cFileName[ MAX_PATH ]; + CHAR cAlternateFileName[ 14 ]; +} WIN32_FIND_DATAA, *PWIN32_FIND_DATAA, *LPWIN32_FIND_DATAA; +typedef WIN32_FIND_DATAA WIN32_FIND_DATA; +typedef PWIN32_FIND_DATAA PWIN32_FIND_DATA; +typedef LPWIN32_FIND_DATAA LPWIN32_FIND_DATA; + +typedef struct _WIN32_FILE_ATTRIBUTE_DATA { + DWORD dwFileAttributes; + FILETIME ftCreationTime; + FILETIME ftLastAccessTime; + FILETIME ftLastWriteTime; + DWORD nFileSizeHigh; + DWORD nFileSizeLow; +} WIN32_FILE_ATTRIBUTE_DATA, *LPWIN32_FILE_ATTRIBUTE_DATA; + + +DWORD GetFileAttributesA(LPCSTR lpFileName); +#define GetFileAttributes GetFileAttributesA +typedef enum _GET_FILEEX_INFO_LEVELS { + GetFileExInfoStandard, + GetFileExMaxInfoLevel +} GET_FILEEX_INFO_LEVELS; + +BOOL GetFileAttributesExA(LPCSTR lpFileName,GET_FILEEX_INFO_LEVELS fInfoLevelId,LPVOID lpFileInformation); +#define GetFileAttributesEx GetFileAttributesExA + +BOOL DeleteFileA(LPCSTR lpFileName); +#define DeleteFile DeleteFileA + + +HANDLE FindFirstFileA(LPCSTR lpFileName, LPWIN32_FIND_DATA lpFindFileData); +#define FindFirstFile FindFirstFileA + +BOOL FindNextFileA(HANDLE hFindFile, LPWIN32_FIND_DATAA lpFindFileData); +#define FindNextFile FindNextFileA +#define FindClose(hFindFile) CloseHandle(hFindFile) + +#ifdef _CONTENT_PACKAGE +#define PSVITA_STUBBED { } +#else +#define PSVITA_STUBBED { static bool bSet = false; if(!bSet){printf("missing function on PSVita : %s\n Tell MarkH about this, then press f5 to continue.\n", __FUNCTION__); bSet = true; SCE_BREAK();} } +#endif + +DWORD XGetLanguage(); +DWORD XGetLocale(); +DWORD XEnableGuestSignin(BOOL fEnable); \ No newline at end of file diff --git a/Minecraft.Client/PSVita/PSVitaExtras/PSVitaTLSStorage.cpp b/Minecraft.Client/PSVita/PSVitaExtras/PSVitaTLSStorage.cpp new file mode 100644 index 00000000..0261f318 --- /dev/null +++ b/Minecraft.Client/PSVita/PSVitaExtras/PSVitaTLSStorage.cpp @@ -0,0 +1,237 @@ +#include "stdafx.h" +#include "PSVitaTLSStorage.h" + +#if 1 +static PSVitaTLSStorage Singleton; + +#define MAX_THREADS 64 + +typedef struct +{ + int ThreadID; + LPVOID Value; +} TLSInfo; + +typedef struct +{ + TLSInfo *Array; + int Size; +} TLSArray; + +static std::vector PSVitaTLSStorage_ActiveInfos; + +void PSVitaTLSStorage::Init() +{ +} + +PSVitaTLSStorage *PSVitaTLSStorage::Instance() +{ + return &Singleton; +} + +DWORD PSVitaTLSStorage::Alloc() +{ + TLSArray* Array = new TLSArray; + Array->Array = new TLSInfo[MAX_THREADS]; + Array->Size = 0; + for( int i = 0;i < MAX_THREADS;i += 1 ) + { + Array->Array[i].ThreadID = -1; + } + + // add to the active infos + PSVitaTLSStorage_ActiveInfos.push_back(Array); + return (DWORD) Array; +} + +BOOL PSVitaTLSStorage::Free(DWORD dwTlsIndex) +{ + // remove from the active infos + std::vector::iterator iter = std::find(PSVitaTLSStorage_ActiveInfos.begin(), PSVitaTLSStorage_ActiveInfos.end(), (TLSArray *) dwTlsIndex); + PSVitaTLSStorage_ActiveInfos.erase(iter); + + delete []((TLSInfo*)dwTlsIndex); + return 0; +} + +void PSVitaTLSStorage::RemoveThread(int threadID) +{ + // remove this thread from all the active Infos + std::vector::iterator iter = PSVitaTLSStorage_ActiveInfos.begin(); + for( ; iter != PSVitaTLSStorage_ActiveInfos.end(); ++iter ) + { + TLSArray* Array = ((TLSArray*)*iter); + + for( int i = 0;i < Array->Size;i += 1 ) + { + if( Array->Array[i].ThreadID == threadID ) + { + // shift all the other entries down + for( ;i < MAX_THREADS - 1;i += 1 ) + { + Array->Array[i].ThreadID = Array->Array[i+1].ThreadID; + Array->Array[i].Value = Array->Array[i+1].Value; + if( Array->Array[i].ThreadID != -1 ) + { + Array->Size = i + 1; + } + } + // mark the top one as unused + Array->Array[i].ThreadID = -1; + break; + } + } + } +} + +LPVOID PSVitaTLSStorage::GetValue(DWORD dwTlsIndex) +{ + if( !dwTlsIndex ) + { + return 0; + } + + TLSArray* Array = ((TLSArray*)dwTlsIndex); + SceUID threadID = sceKernelGetThreadId(); + for( int i = 0;i < Array->Size;i += 1 ) + { + if( Array->Array[i].ThreadID == threadID ) + { + return Array->Array[i].Value; + } + } + + //assert(0); + return 0; +} + +BOOL PSVitaTLSStorage::SetValue(DWORD dwTlsIndex, LPVOID lpTlsValue) +{ + if( !dwTlsIndex ) + { + return 0; + } + + TLSArray* Array = ((TLSArray*)dwTlsIndex); + SceUID threadID = sceKernelGetThreadId(); + for( int i = 0;i < Array->Size;i += 1 ) + { + if( Array->Array[i].ThreadID == threadID || Array->Array[i].ThreadID == -1 ) + { + Array->Array[i].ThreadID = threadID; + Array->Array[i].Value = lpTlsValue; + return 0; + } + } + if( Array->Size < MAX_THREADS ) + { + Array->Array[Array->Size].ThreadID = threadID; + Array->Array[Array->Size].Value = lpTlsValue; + Array->Size++; + return 0; + } + + assert(0); + return 0; +} +#else + + +PSVitaTLSStorage* m_pInstance = NULL; + +#define sc_maxSlots 64 +BOOL m_activeList[sc_maxSlots]; +//__thread void* m_values[64]; + +// AP - Oh my. It seems __thread doesn't like cpp files. I couldn't get it to be thread sensitive as it would always return a shared value. +// For now I've stuck m_values and accessor functions into user_malloc.c. Cheap cheap hack. +extern "C" +{ +void user_setValue( unsigned int _index, void* _val ); +void* user_getValue( unsigned int _index ); +} + + +void PSVitaTLSStorage::Init() +{ + for(int i=0;iInit(); + } + return m_pInstance; +} + + +DWORD PSVitaTLSStorage::Alloc() +{ + for(int i=0; i +#include +#include +#include +#include "PSVitaTLSStorage.h" + +#ifdef _CONTENT_PACKAGE +#define PSVITA_ASSERT_SCE_ERROR(errVal) {} +#else +#define PSVITA_ASSERT_SCE_ERROR(errVal) if(errVal != SCE_OK) { printf("----------------------\n %s failed with error %d [0x%08x]\n----------------------\n", __FUNCTION__, errVal, errVal); assert(0); } +#endif + +#define MAX_PATH_LENGTH 291 // TODO - check this is correct for our usage here + +static char driveRoot[MAX_PATH_LENGTH] = "app0:"; +static char dirName[MAX_PATH_LENGTH]; +static char contentInfoPath[MAX_PATH_LENGTH]; +static char usrdirPath[MAX_PATH_LENGTH] = "app0:"; +static char contentInfoPathBDPatch[MAX_PATH_LENGTH]; +static char usrdirPathBDPatch[MAX_PATH_LENGTH]; + +/*E The FIOS2 default maximum path is 1024, games can normally use a much smaller value. */ + +/*E Buffers for FIOS2 initialization. + * These are typical values that a game might use, but adjust them as needed. They are + * of type int64_t to avoid alignment issues. */ + +/* 64 ops: */ +int64_t g_OpStorage[SCE_FIOS_OP_STORAGE_SIZE(64, MAX_PATH_LENGTH) / sizeof(int64_t) + 1]; +/* 1024 chunks, 64KiB: */ +int64_t g_ChunkStorage[SCE_FIOS_CHUNK_STORAGE_SIZE(1024) / sizeof(int64_t) + 1]; +/* 16 file handles: */ +int64_t g_FHStorage[SCE_FIOS_FH_STORAGE_SIZE(16, MAX_PATH_LENGTH) / sizeof(int64_t) + 1]; +/* 4 directory handles: */ +int64_t g_DHStorage[SCE_FIOS_DH_STORAGE_SIZE(4, MAX_PATH_LENGTH) / sizeof(int64_t) + 1]; + +void PSVitaInit() +{ + SceFiosParams params = SCE_FIOS_PARAMS_INITIALIZER; + + /*E Provide required storage buffers. */ + params.opStorage.pPtr = g_OpStorage; + params.opStorage.length = sizeof(g_OpStorage); + params.chunkStorage.pPtr = g_ChunkStorage; + params.chunkStorage.length = sizeof(g_ChunkStorage); + params.fhStorage.pPtr = g_FHStorage; + params.fhStorage.length = sizeof(g_FHStorage); + params.dhStorage.pPtr = g_DHStorage; + params.dhStorage.length = sizeof(g_DHStorage); + + params.pathMax = MAX_PATH_LENGTH; + + params.pMemcpy = memcpy; + + int err = sceFiosInitialize(¶ms); + assert(err == SCE_FIOS_OK); +} +char* getConsoleHomePath() +{ + return contentInfoPath; +} + +char* getUsrDirRoot() +{ + return driveRoot; +} + +char* getUsrDirPath() +{ + return usrdirPath; +} + +char* getConsoleHomePathBDPatch() +{ + return contentInfoPathBDPatch; +} + +char* getUsrDirPathBDPatch() +{ + return usrdirPathBDPatch; +} + + +char* getDirName() +{ + return dirName; +} + +int _wcsicmp( const wchar_t * dst, const wchar_t * src ) +{ + wchar_t f,l; + + // validation section + // _VALIDATE_RETURN(dst != NULL, EINVAL, _NLSCMPERROR); + // _VALIDATE_RETURN(src != NULL, EINVAL, _NLSCMPERROR); + + do { + f = towlower(*dst); + l = towlower(*src); + dst++; + src++; + } while ( (f) && (f == l) ); + return (int)(f - l); +} + +size_t wcsnlen(const wchar_t *wcs, size_t maxsize) +{ + size_t n; + + // Note that we do not check if s == NULL, because we do not + // return errno_t... + + for (n = 0; n < maxsize && *wcs; n++, wcs++) + ; + + return n; +} + +VOID GetSystemTime( LPSYSTEMTIME lpSystemTime) +{ + SceDateTime dateTime; + int err = sceRtcGetCurrentClock(&dateTime, 0); + assert(err == SCE_OK); + + lpSystemTime->wYear = sceRtcGetYear(&dateTime); + lpSystemTime->wMonth = sceRtcGetMonth(&dateTime); + lpSystemTime->wDay = sceRtcGetDay(&dateTime); + lpSystemTime->wDayOfWeek = sceRtcGetDayOfWeek(lpSystemTime->wYear, lpSystemTime->wMonth, lpSystemTime->wDay); + lpSystemTime->wHour = sceRtcGetHour(&dateTime); + lpSystemTime->wMinute = sceRtcGetMinute(&dateTime); + lpSystemTime->wSecond = sceRtcGetSecond(&dateTime); + lpSystemTime->wMilliseconds = sceRtcGetMicrosecond(&dateTime)/1000; +} +BOOL FileTimeToSystemTime(CONST FILETIME *lpFileTime, LPSYSTEMTIME lpSystemTime) { PSVITA_STUBBED; return false; } +BOOL SystemTimeToFileTime(CONST SYSTEMTIME *lpSystemTime, LPFILETIME lpFileTime) +{ + SceUInt64 diffHundredNanos; + SceDateTime dateTime; + int err = sceRtcGetCurrentClock(&dateTime, 0); + sceRtcGetTime64_t(&dateTime, &diffHundredNanos); + diffHundredNanos *= 10; + + lpFileTime->dwHighDateTime = diffHundredNanos >> 32; + lpFileTime->dwLowDateTime = diffHundredNanos & 0xffffffff; + return true; +} + +VOID GetLocalTime(LPSYSTEMTIME lpSystemTime) +{ + SceDateTime dateTime; + int err = sceRtcGetCurrentClockLocalTime(&dateTime); + assert(err == SCE_OK); + + lpSystemTime->wYear = sceRtcGetYear(&dateTime); + lpSystemTime->wMonth = sceRtcGetMonth(&dateTime); + lpSystemTime->wDay = sceRtcGetDay(&dateTime); + lpSystemTime->wDayOfWeek = sceRtcGetDayOfWeek(lpSystemTime->wYear, lpSystemTime->wMonth, lpSystemTime->wDay); + lpSystemTime->wHour = sceRtcGetHour(&dateTime); + lpSystemTime->wMinute = sceRtcGetMinute(&dateTime); + lpSystemTime->wSecond = sceRtcGetSecond(&dateTime); + lpSystemTime->wMilliseconds = sceRtcGetMicrosecond(&dateTime)/1000; +} + +HANDLE CreateEvent(void* lpEventAttributes, BOOL bManualReset, BOOL bInitialState, LPCSTR lpName) { PSVITA_STUBBED; return NULL; } +VOID Sleep(DWORD dwMilliseconds) +{ + C4JThread::Sleep(dwMilliseconds); +} + +BOOL SetThreadPriority(HANDLE hThread, int nPriority) { PSVITA_STUBBED; return FALSE; } +DWORD WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds) { PSVITA_STUBBED; return false; } + +LONG InterlockedCompareExchangeRelease(LONG volatile *Destination, LONG Exchange,LONG Comperand ) +{ + return sceAtomicCompareAndSwap32((int32_t*)Destination, (int32_t)Comperand, (int32_t)Exchange); +} + +LONG64 InterlockedCompareExchangeRelease64(LONG64 volatile *Destination, LONG64 Exchange, LONG64 Comperand) +{ + return sceAtomicCompareAndSwap64((int64_t*)Destination, (int64_t)Comperand, (int64_t)Exchange); +} + + +VOID InitializeCriticalSection(PCRITICAL_SECTION CriticalSection) +{ + char name[1] = {0}; + + int err = sceKernelCreateLwMutex((SceKernelLwMutexWork *)(&CriticalSection->mutex), name, SCE_KERNEL_LW_MUTEX_ATTR_TH_PRIO | SCE_KERNEL_LW_MUTEX_ATTR_RECURSIVE, 0, NULL); + PSVITA_ASSERT_SCE_ERROR(err); +} + + +VOID InitializeCriticalSectionAndSpinCount(PCRITICAL_SECTION CriticalSection, ULONG SpinCount) +{ + // no spin count on PSVita + InitializeCriticalSection(CriticalSection); +} + +VOID DeleteCriticalSection(PCRITICAL_SECTION CriticalSection) +{ + int err = sceKernelDeleteLwMutex((SceKernelLwMutexWork *)(&CriticalSection->mutex)); + PSVITA_ASSERT_SCE_ERROR(err); +} + +extern CRITICAL_SECTION g_singleThreadCS; + +VOID EnterCriticalSection(PCRITICAL_SECTION CriticalSection) +{ + int err = sceKernelLockLwMutex ((SceKernelLwMutexWork *)(&CriticalSection->mutex), 1, NULL); + PSVITA_ASSERT_SCE_ERROR(err); +} + + +VOID LeaveCriticalSection(PCRITICAL_SECTION CriticalSection) +{ + int err = sceKernelUnlockLwMutex ((SceKernelLwMutexWork *)(&CriticalSection->mutex), 1); + PSVITA_ASSERT_SCE_ERROR(err); +} + +ULONG TryEnterCriticalSection(PCRITICAL_SECTION CriticalSection) +{ + int err = sceKernelTryLockLwMutex ((SceKernelLwMutexWork *)(&CriticalSection->mutex), 1); + if(err == SCE_OK) + return true; + return false; +} +DWORD WaitForMultipleObjects(DWORD nCount, CONST HANDLE *lpHandles,BOOL bWaitAll,DWORD dwMilliseconds) { PSVITA_STUBBED; return 0; } + + + +VOID InitializeCriticalRWSection(PCRITICAL_RW_SECTION CriticalSection) +{ + char name[1] = {0}; + + CriticalSection->RWLock = sceKernelCreateRWLock(name, SCE_KERNEL_RW_LOCK_ATTR_TH_PRIO | SCE_KERNEL_RW_LOCK_ATTR_RECURSIVE, NULL); +} + +VOID DeleteCriticalRWSection(PCRITICAL_RW_SECTION CriticalSection) +{ + int err = sceKernelDeleteRWLock(CriticalSection->RWLock); + PSVITA_ASSERT_SCE_ERROR(err); +} + +VOID EnterCriticalRWSection(PCRITICAL_RW_SECTION CriticalSection, bool Write) +{ + int err; + if( Write ) + { + err = sceKernelLockWriteRWLock(CriticalSection->RWLock, 0); + } + else + { + err = sceKernelLockReadRWLock(CriticalSection->RWLock, 0); + } + PSVITA_ASSERT_SCE_ERROR(err); +} + +VOID LeaveCriticalRWSection(PCRITICAL_RW_SECTION CriticalSection, bool Write) +{ + int err; + if( Write ) + { + err = sceKernelUnlockWriteRWLock(CriticalSection->RWLock); + } + else + { + err = sceKernelUnlockReadRWLock(CriticalSection->RWLock); + } + PSVITA_ASSERT_SCE_ERROR(err); +} + + + +BOOL CloseHandle(HANDLE hObject) +{ + sceFiosFHCloseSync(NULL,(SceFiosFH)((int32_t)hObject)); + return true; +} + +BOOL SetEvent(HANDLE hEvent) { PSVITA_STUBBED; return false; } + +HMODULE GetModuleHandle(LPCSTR lpModuleName) { PSVITA_STUBBED; return 0; } + +DWORD TlsAlloc(VOID) { return PSVitaTLSStorage::Instance()->Alloc(); } +BOOL TlsFree(DWORD dwTlsIndex) { return PSVitaTLSStorage::Instance()->Free(dwTlsIndex); } +LPVOID TlsGetValue(DWORD dwTlsIndex) { return PSVitaTLSStorage::Instance()->GetValue(dwTlsIndex); } +BOOL TlsSetValue(DWORD dwTlsIndex, LPVOID lpTlsValue) { return PSVitaTLSStorage::Instance()->SetValue(dwTlsIndex, lpTlsValue); } + +// AP - all this virtual stuff has been added because Vita doesn't have a virtual memory system so we allocate 1MB real memory chunks instead +// and access memory reads and writes via VirtualCopyTo and VirtualCopyFrom which divides memcpys across multiple 1MB chunks if required +static void* VirtualAllocs[1000]; // a list of 1MB allocations +static int VirtualNumAllocs = 0; // how many 1MB chunks have been allocated + +LPVOID VirtualAlloc(LPVOID lpAddress, SIZE_T dwSize, DWORD flAllocationType, DWORD flProtect) +{ + if( flAllocationType == MEM_COMMIT ) + { + // how many pages do we need + int NumPagesRequired = dwSize / VIRTUAL_PAGE_SIZE; + int BytesLeftOver = dwSize % VIRTUAL_PAGE_SIZE; + if( BytesLeftOver ) + { + NumPagesRequired += 1; + } + + // allocate pages until we reach the required number of pages + while( VirtualNumAllocs < NumPagesRequired ) + { + // allocate a new page + void* NewAlloc = malloc(VIRTUAL_PAGE_SIZE); + + // add it to the list + VirtualAllocs[VirtualNumAllocs] = NewAlloc; + VirtualNumAllocs += 1; + } + } + + return (void*) VIRTUAL_OFFSET; +} + +BOOL VirtualFree(LPVOID lpAddress, SIZE_T dwSize, DWORD dwFreeType) +{ + while( VirtualNumAllocs ) + { + // free and remove a page + VirtualNumAllocs -= 1; + free(VirtualAllocs[VirtualNumAllocs]); + } + + return TRUE; +} + + +// memset a section of the virtual chunks +VOID VirtualMemset(LPVOID lpDestOffset, int val, SIZE_T dwSize) +{ + int DestOffset = ((int)(lpDestOffset) - VIRTUAL_OFFSET); // convert the pointer back into a virtual offset + int StartPage = DestOffset / VIRTUAL_PAGE_SIZE; // which 1MB page do we start on + int EndPage = (DestOffset + dwSize) / VIRTUAL_PAGE_SIZE; // which 1MB page do we end on + int Offset = DestOffset % VIRTUAL_PAGE_SIZE; // what is the byte offset within the current 1MB page + if( StartPage == EndPage ) // early out if we're on the same page + { + uint8_t* Dest = (uint8_t*)VirtualAllocs[StartPage] + Offset; + memset(Dest, val, dwSize); + } + else + { + while( dwSize ) + { + // how many bytes do we copy in this chunk + int BytesToSet = dwSize; + if( StartPage != EndPage ) + { + BytesToSet = VIRTUAL_PAGE_SIZE - Offset; + } + + // get final point to real memory + uint8_t* Dest = (uint8_t*)VirtualAllocs[StartPage] + Offset; + + // copy the required bytes + memset(Dest, val, BytesToSet); + + // move to the next chunk + dwSize -= BytesToSet; + StartPage += 1; + Offset = 0; + } + } +} + + +// copy a block of memory to the virtual chunks +VOID VirtualCopyTo(LPVOID lpDestOffset, LPVOID lpSrc, SIZE_T dwSize) +{ + int DestOffset = ((int)(lpDestOffset) - VIRTUAL_OFFSET); // convert the pointer back into a virtual offset + int StartPage = DestOffset / VIRTUAL_PAGE_SIZE; // which 1MB page do we start on + int EndPage = (DestOffset + dwSize) / VIRTUAL_PAGE_SIZE; // which 1MB page do we end on + int Offset = DestOffset % VIRTUAL_PAGE_SIZE; // what is the byte offset within the current 1MB page + if( StartPage == EndPage ) // early out if we're on the same page + { + uint8_t* Dest = (uint8_t*)VirtualAllocs[StartPage] + Offset; + memcpy(Dest, lpSrc, dwSize); + } + else + { + uint8_t *Src = (uint8_t*) lpSrc; + while( dwSize ) + { + // how many bytes do we copy in this chunk + int BytesToCopy = dwSize; + if( StartPage != EndPage ) + { + BytesToCopy = VIRTUAL_PAGE_SIZE - Offset; + } + + // get final point to real memory + uint8_t* Dest = (uint8_t*)VirtualAllocs[StartPage] + Offset; + + // copy the required bytes + memcpy(Dest, Src, BytesToCopy); + + // move to the next chunk + dwSize -= BytesToCopy; + Src += BytesToCopy; + StartPage += 1; + Offset = 0; + } + } +} + +// copy a block of memory from the virtual chunks +VOID VirtualCopyFrom(LPVOID lpDest, LPVOID lpSrcOffset, SIZE_T dwSize) +{ + int SrcOffset = ((int)(lpSrcOffset) - VIRTUAL_OFFSET); // convert the pointer back into a virtual offset + int StartPage = SrcOffset / VIRTUAL_PAGE_SIZE; // which 1MB page do we start on + int EndPage = (SrcOffset + dwSize) / VIRTUAL_PAGE_SIZE; // which 1MB page do we end on + int Offset = SrcOffset % VIRTUAL_PAGE_SIZE; // what is the byte offset within the current 1MB page + if( StartPage == EndPage ) // early out if we're on the same page + { + uint8_t* Src = (uint8_t*)VirtualAllocs[StartPage] + Offset; + memcpy(lpDest, Src, dwSize); + } + else + { + uint8_t *Dest = (uint8_t*) lpDest; + while( dwSize ) + { + // how many bytes do we copy in this chunk + int BytesToCopy = dwSize; + if( StartPage != EndPage ) + { + BytesToCopy = VIRTUAL_PAGE_SIZE - Offset; + } + + // get final point to real memory + uint8_t* Src = (uint8_t*)VirtualAllocs[StartPage] + Offset; + + // copy the required bytes + memcpy(Dest, Src, BytesToCopy); + + // move to the next chunk + dwSize -= BytesToCopy; + Dest += BytesToCopy; + StartPage += 1; + Offset = 0; + } + } +} + +// copy a block of memory between the virtual chunks +VOID VirtualMove(LPVOID lpDestOffset, LPVOID lpSrcOffset, SIZE_T dwSize) +{ + int DestOffset = ((int)(lpDestOffset) - VIRTUAL_OFFSET); // convert the pointer back into a virtual offset + int DestChunkOffset = DestOffset % VIRTUAL_PAGE_SIZE; // what is the byte offset within the current 1MB page + int DestPage = DestOffset / VIRTUAL_PAGE_SIZE; // which 1MB page do we start on + + int SrcOffset = ((int)(lpSrcOffset) - VIRTUAL_OFFSET); // convert the pointer back into a virtual offset + int SrcChunkOffset = SrcOffset % VIRTUAL_PAGE_SIZE; // what is the byte offset within the current 1MB page + int SrcPage = SrcOffset / VIRTUAL_PAGE_SIZE; // which 1MB page do we start on + while( dwSize ) + { + // how many bytes do we copy in this chunk + int BytesToCopy = dwSize; + // does the dest straddle 2 chunks + if( DestChunkOffset + BytesToCopy > VIRTUAL_PAGE_SIZE ) + { + BytesToCopy = VIRTUAL_PAGE_SIZE - DestChunkOffset; + } + // does the src straddle 2 chunks + if( SrcChunkOffset + BytesToCopy > VIRTUAL_PAGE_SIZE ) + { + BytesToCopy = VIRTUAL_PAGE_SIZE - SrcChunkOffset; + } + + // get final point to real memory + uint8_t* Dest = (uint8_t*)VirtualAllocs[DestPage] + DestChunkOffset; + uint8_t* Src = (uint8_t*)VirtualAllocs[SrcPage] + SrcChunkOffset; + + // copy the required bytes + memcpy(Dest, Src, BytesToCopy); + + // move to the next chunk + DestChunkOffset += BytesToCopy; + if( DestChunkOffset >= VIRTUAL_PAGE_SIZE ) + { + DestChunkOffset = 0; + DestPage += 1; + } + SrcChunkOffset += BytesToCopy; + if( SrcChunkOffset >= VIRTUAL_PAGE_SIZE ) + { + SrcChunkOffset = 0; + SrcPage += 1; + } + + dwSize -= BytesToCopy; + } +} + +// write the chunks to a file given a handle +BOOL VirtualWriteFile(LPCSTR lpFileName, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped ) +{ + *lpNumberOfBytesWritten = 0; + int Page = 0; + while( nNumberOfBytesToWrite ) + { + int BytesToWrite = nNumberOfBytesToWrite; + if( BytesToWrite > VIRTUAL_PAGE_SIZE ) + { + BytesToWrite = VIRTUAL_PAGE_SIZE; + } + + void* Data = VirtualAllocs[Page]; + + DWORD numberOfBytesWritten=0; + WriteFileWithName(lpFileName, Data, BytesToWrite, &numberOfBytesWritten,NULL); + *lpNumberOfBytesWritten += numberOfBytesWritten; + + nNumberOfBytesToWrite -= BytesToWrite; + Page += 1; + } + + return true; +} + +// The data is mostly zlib compressed. Only blank areas are not so this will RLE just the zeros +// Yields about 2:1 compression +VOID VirtualCompress(LPVOID lpDest,LPDWORD lpNewSize, LPVOID lpAddress, SIZE_T dwSize) +{ + uint8_t *pDest = (uint8_t *) lpDest; + int Offset = 0; + int Page = 0; + int NewSize = 0; + int CountingZeros = 0; + uint8_t* Data = (uint8_t*) VirtualAllocs[Page]; + while( dwSize ) + { + // if this has a value just add it + if( Data[Offset] ) + { + // just store the value + if( pDest ) + { + pDest[NewSize] = Data[Offset]; + } + NewSize += 1; + CountingZeros = 0; + } + else + { + // is this the first zero (also we can only count to 255 zeros) + if( !CountingZeros || CountingZeros == 255 ) + { + CountingZeros = 0; + + // create space for the zero counter + if( pDest ) + { + pDest[NewSize] = 0; // this indicates a zero + pDest[NewSize + 1] = 0; // this is how many zeros we counted + } + NewSize += 2; + } + + if( pDest ) + { + pDest[NewSize - 1] += 1; // increment the number of zeros + } + + CountingZeros += 1; + } + + dwSize -= 1; + Offset += 1; + if( Offset == VIRTUAL_PAGE_SIZE ) + { + Offset = 0; + Page += 1; + Data = (uint8_t*) VirtualAllocs[Page]; + } + } + + *lpNewSize = NewSize; +} + +// The data in is mostly zlib compressed. Only blank areas are not so this will RLE just the zeros +VOID VirtualDecompress(LPVOID buf, SIZE_T dwSize) +{ + uint8_t *pSrc = (uint8_t *)buf; + int Offset = 0; + int Page = 0; + int Index = 0; + uint8_t* Data = (uint8_t*) VirtualAllocs[Page]; + while( Index != dwSize ) + { + // is this a normal value + if( pSrc[Index] ) + { + // just copy it across + Data[Offset] = pSrc[Index]; + Offset += 1; + if( Offset == VIRTUAL_PAGE_SIZE ) + { + Offset = 0; + Page += 1; + if( Page == VirtualNumAllocs ) + { + // allocate a new page + void* NewAlloc = malloc(VIRTUAL_PAGE_SIZE); + + // add it to the list + VirtualAllocs[VirtualNumAllocs] = NewAlloc; + VirtualNumAllocs += 1; + } + Data = (uint8_t*) VirtualAllocs[Page]; + } + } + else + { + // how many zeros do we have + Index += 1; + int Count = pSrc[Index]; + // to do : this should really be a sequence of memsets + for( int i = 0;i < Count;i += 1 ) + { + Data[Offset] = 0; + Offset += 1; + if( Offset == VIRTUAL_PAGE_SIZE ) + { + Offset = 0; + Page += 1; + if( Page == VirtualNumAllocs ) + { + // allocate a new page + void* NewAlloc = malloc(VIRTUAL_PAGE_SIZE); + + // add it to the list + VirtualAllocs[VirtualNumAllocs] = NewAlloc; + VirtualNumAllocs += 1; + } + Data = (uint8_t*) VirtualAllocs[Page]; + } + } + } + + Index += 1; + } +} + +DWORD GetFileSize( HANDLE hFile, LPDWORD lpFileSizeHigh ) +{ + SceFiosFH fh = (SceFiosFH)(hFile); + + // 4J Stu - sceFiosFHGetSize didn't seem to work...so doing this for now + //SceFiosSize FileSize; + //FileSize=sceFiosFHGetSize(fh); + SceFiosStat statData; + int err = sceFiosFHStatSync(NULL,fh,&statData); + SceFiosOffset FileSize = statData.fileSize; + + if(lpFileSizeHigh) + *lpFileSizeHigh= (DWORD)(FileSize>>32); + else + { + assert(FileSize>>32 == 0); + } + + return (DWORD)(FileSize&0xffffffff); +} +BOOL GetFileSizeEx(HANDLE hFile, PLARGE_INTEGER lpFileSize ) { PSVITA_STUBBED; return false; } + + +BOOL WriteFileWithName(LPCSTR lpFileName, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped ) +{ + char filePath[256]; + sprintf(filePath,"%s/%s",getUsrDirPath(), lpFileName ); + SceFiosSize bytesWritten = sceFiosFileWriteSync( NULL, filePath, lpBuffer, nNumberOfBytesToWrite, 0 ); + if(bytesWritten != nNumberOfBytesToWrite) + { + // error + app.DebugPrintf("WriteFile error %x%08x\n",bytesWritten); + return FALSE; + } + *lpNumberOfBytesWritten = (DWORD)bytesWritten; + return TRUE; +} + +BOOL WriteFile( HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped ) +{ + //CD - Use 'WriteFileWithName' instead + //CD - it won't write via handle, for some unknown reason... + PSVITA_STUBBED; + return FALSE; +} + +BOOL ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped ) +{ + SceFiosFH fh = (SceFiosFH)((int64_t)hFile); + // sceFiosFHReadSync - Non-negative values are the number of bytes read, 0 <= result <= length. Negative values are error codes. + SceFiosSize bytesRead = sceFiosFHReadSync(NULL, fh, lpBuffer, (SceFiosSize)nNumberOfBytesToRead); + if(bytesRead < 0) + { + // error + return FALSE; + } + else + { + *lpNumberOfBytesRead = (DWORD)bytesRead; + return TRUE; + } +} + +BOOL SetFilePointer(HANDLE hFile, LONG lDistanceToMove, PLONG lpDistanceToMoveHigh, DWORD dwMoveMethod) +{ + SceFiosFH fd = (SceFiosFH)((int64_t)hFile); + + uint64_t bitsToMove = (int64_t) lDistanceToMove; + SceFiosOffset pos = 0; + + if (lpDistanceToMoveHigh != NULL) + bitsToMove |= ((uint64_t) (*lpDistanceToMoveHigh)) << 32; + + SceFiosWhence whence = SCE_FIOS_SEEK_SET; + switch(dwMoveMethod) + { + case FILE_BEGIN: whence = SCE_FIOS_SEEK_SET; break; + case FILE_CURRENT: whence = SCE_FIOS_SEEK_CUR; break; + case FILE_END: whence = SCE_FIOS_SEEK_END; break; + }; + + pos = sceFiosFHSeek(fd, (int64_t) lDistanceToMove, whence); + + return (pos != -1); +} +void replaceBackslashes(char* szFilename) +{ + int len = strlen(szFilename); + for(int i=0;i 0) + { + strcpy(filePath, mountedPath.c_str()); + } + else if(strstr(lpFileName,":") != 0) // already fully qualified path + strcpy(filePath, lpFileName ); + else + sprintf(filePath,"%s/%s",getUsrDirPath(), lpFileName ); + // sprintf(filePath,"%s/%s", driveRoot, lpFileName ); + + //CD - Does the file need created? + if( dwDesiredAccess == GENERIC_WRITE ) + { + //CD - Create a blank file + int err = sceFiosFileWriteSync( NULL, filePath, NULL, 0, 0 ); + assert( err == SCE_FIOS_OK ); + } + +#ifndef _CONTENT_PACKAGE + printf("*** Opening %s\n",filePath); +#endif + + SceFiosFH fh; + int err = sceFiosFHOpenSync(NULL, &fh, filePath, NULL); + assert( err == SCE_FIOS_OK ); + + return (void*)fh; +} + +BOOL CreateDirectoryA(LPCSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes) +{ +#ifndef _CONTENT_PACKAGE + char filePath[256]; + sprintf(filePath,"%s/%s",usrdirPath, lpPathName ); + int ret = sceIoMkdir( filePath, SCE_STM_RWU ); + if( ret != SCE_OK ) + { + printf("*** CreateDirectory %s FAILED\n",filePath); + return false; + } + return true; +#endif + return false; +} + +BOOL DeleteFileA(LPCSTR lpFileName) { PSVITA_STUBBED; return false; } + +// BOOL XCloseHandle(HANDLE a) +// { +// cellFsClose(int(a)); +// } + +DWORD GetFileAttributesA(LPCSTR lpFileName) +{ + char filePath[256]; + std::string mountedPath = StorageManager.GetMountedPath(lpFileName); + if(mountedPath.length() > 0) + { + strcpy(filePath, mountedPath.c_str()); + } + else if(strstr(lpFileName,":") != 0) // colon in the filename, so it's fully qualified + strcpy(filePath, lpFileName); + else + sprintf(filePath,"%s/%s",getUsrDirPath(), lpFileName ); + + // sprintf(filePath,"%s/%s", driveRoot, lpFileName ); + + // check if the file exists first + SceFiosStat statData; + if(sceFiosStatSync(NULL, filePath, &statData) != SCE_FIOS_OK) + { + app.DebugPrintf("*** sceFiosStatSync Failed\n"); + return -1; + } + if(statData.statFlags & SCE_FIOS_STATUS_DIRECTORY ) + return FILE_ATTRIBUTE_DIRECTORY; + else + return FILE_ATTRIBUTE_NORMAL; +} + + +BOOL MoveFileA(LPCSTR lpExistingFileName, LPCSTR lpNewFileName) { PSVITA_STUBBED; return false; } + +void __debugbreak() { SCE_BREAK(); } +VOID DebugBreak(VOID) { SCE_BREAK(); } + + +DWORD GetLastError(VOID) { PSVITA_STUBBED; return 0; } +VOID GlobalMemoryStatus(LPMEMORYSTATUS lpBuffer) +{ + PSVITA_STUBBED; + /* malloc_managed_size stat; + int err = malloc_stats(&stat); + if(err != 0) + { + //printf("Failed to get mem stats\n"); + } + + lpBuffer->dwTotalPhys = stat.max_system_size; + lpBuffer->dwAvailPhys = stat.max_system_size - stat.current_system_size; + lpBuffer->dwAvailVirtual = stat.max_system_size - stat.current_inuse_size;*/ +} + +DWORD GetTickCount() +{ + // This function returns the current system time at this function is called. + // The system time is represented the time elapsed since the system starts up in microseconds. + + uint64_t sysTime = sceKernelGetProcessTimeWide(); + + return sysTime / 1000; +} + +// we should really use libperf for this kind of thing, but this will do for now. +BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency) +{ + // microseconds + lpFrequency->QuadPart = (1000 * 1000); + return false; +} +BOOL QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount) +{ + // microseconds + lpPerformanceCount->QuadPart = sceKernelGetProcessTimeWide(); + return true; +} + +#ifndef _FINAL_BUILD +VOID OutputDebugStringW(LPCWSTR lpOutputString) +{ + wprintf(lpOutputString); +} + +VOID OutputDebugString(LPCSTR lpOutputString) +{ + printf(lpOutputString); +} + +VOID OutputDebugStringA(LPCSTR lpOutputString) +{ + printf(lpOutputString); +} +#endif // _CONTENT_PACKAGE + +BOOL GetFileAttributesExA(LPCSTR lpFileName,GET_FILEEX_INFO_LEVELS fInfoLevelId,LPVOID lpFileInformation) +{ + WIN32_FILE_ATTRIBUTE_DATA *fileInfoBuffer = (WIN32_FILE_ATTRIBUTE_DATA*) lpFileInformation; + + char filePath[256]; + if(strstr(lpFileName,":") != 0) // colon in the filename, so it's fully qualified + strcpy(filePath, lpFileName); + else + sprintf(filePath,"%s/%s",getUsrDirPath(), lpFileName ); + // sprintf(filePath,"%s/%s", driveRoot, lpFileName ); + + // check if the file exists first + SceFiosStat statData; + if(sceFiosStatSync(NULL, filePath, &statData) != SCE_FIOS_OK) + { + app.DebugPrintf("*** sceFiosStatSync Failed\n"); + return false; + } + if(statData.statFlags & SCE_FIOS_STATUS_DIRECTORY ) + fileInfoBuffer->dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY; + else + fileInfoBuffer->dwFileAttributes = FILE_ATTRIBUTE_NORMAL; + + fileInfoBuffer->nFileSizeHigh = statData.fileSize >> 32; + fileInfoBuffer->nFileSizeLow = statData.fileSize; + + return true; +} + +HANDLE FindFirstFileA(LPCSTR lpFileName, LPWIN32_FIND_DATA lpFindFileData) +{ + PSVITA_STUBBED; + return 0; +} + +BOOL FindNextFileA(HANDLE hFindFile, LPWIN32_FIND_DATAA lpFindFileData) +{ + PSVITA_STUBBED; + return false; +} + +errno_t _itoa_s(int _Value, char * _DstBuf, size_t _Size, int _Radix) { if(_Radix==10) sprintf(_DstBuf,"%d",_Value); else if(_Radix==16) sprintf(_DstBuf,"%lx",_Value); else return -1; return 0; } +errno_t _i64toa_s(__int64 _Val, char * _DstBuf, size_t _Size, int _Radix) { if(_Radix==10) sprintf(_DstBuf,"%lld",_Val); else return -1; return 0; } + +int _wtoi(const wchar_t *_Str) +{ + return wcstol(_Str, NULL, 10); +} + +DWORD XGetLanguage() +{ + // check if we should override the system language or not + 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 : 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; + + case SCE_SYSTEM_PARAM_LANG_RUSSIAN : return XC_LANGUAGE_RUSSIAN; + case SCE_SYSTEM_PARAM_LANG_KOREAN : return XC_LANGUAGE_KOREAN; + case SCE_SYSTEM_PARAM_LANG_CHINESE_T : return XC_LANGUAGE_TCHINESE; + case SCE_SYSTEM_PARAM_LANG_PORTUGUESE_BR : return XC_LANGUAGE_PORTUGUESE; + case SCE_SYSTEM_PARAM_LANG_ENGLISH_GB : return XC_LANGUAGE_ENGLISH; + + case SCE_SYSTEM_PARAM_LANG_DUTCH : return XC_LANGUAGE_DUTCH; + case SCE_SYSTEM_PARAM_LANG_FINNISH : return XC_LANGUAGE_FINISH; + case SCE_SYSTEM_PARAM_LANG_SWEDISH : return XC_LANGUAGE_SWEDISH; + case SCE_SYSTEM_PARAM_LANG_DANISH : return XC_LANGUAGE_DANISH; + case SCE_SYSTEM_PARAM_LANG_NORWEGIAN : return XC_LANGUAGE_BNORWEGIAN; + case SCE_SYSTEM_PARAM_LANG_POLISH : return XC_LANGUAGE_POLISH; + case SCE_SYSTEM_PARAM_LANG_TURKISH : return XC_LANGUAGE_TURKISH; + + + case SCE_SYSTEM_PARAM_LANG_CHINESE_S : return XC_LANGUAGE_SCHINESE; + + default : return XC_LANGUAGE_ENGLISH; + } + +} +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) + { + case SCE_SYSTEM_PARAM_LANG_JAPANESE : return XC_LOCALE_JAPAN; + case SCE_SYSTEM_PARAM_LANG_ENGLISH_US : return XC_LOCALE_UNITED_STATES; + case SCE_SYSTEM_PARAM_LANG_FRENCH : return XC_LOCALE_FRANCE; + + case SCE_SYSTEM_PARAM_LANG_SPANISH : + if(app.IsAmericanSKU()) + { + return XC_LOCALE_LATIN_AMERICA; + } + else + { + return XC_LOCALE_SPAIN; + } + + case SCE_SYSTEM_PARAM_LANG_GERMAN : return XC_LOCALE_GERMANY; + case SCE_SYSTEM_PARAM_LANG_ITALIAN : return XC_LOCALE_ITALY; + case SCE_SYSTEM_PARAM_LANG_PORTUGUESE_PT : return XC_LOCALE_PORTUGAL; + + case SCE_SYSTEM_PARAM_LANG_RUSSIAN : return XC_LOCALE_RUSSIAN_FEDERATION; + case SCE_SYSTEM_PARAM_LANG_KOREAN : return XC_LOCALE_KOREA; + case SCE_SYSTEM_PARAM_LANG_CHINESE_T : return XC_LOCALE_CHINA; + case SCE_SYSTEM_PARAM_LANG_PORTUGUESE_BR : return XC_LOCALE_BRAZIL; + case SCE_SYSTEM_PARAM_LANG_ENGLISH_GB : return XC_LOCALE_GREAT_BRITAIN; + + case SCE_SYSTEM_PARAM_LANG_DUTCH : return XC_LOCALE_NETHERLANDS; + case SCE_SYSTEM_PARAM_LANG_FINNISH : return XC_LOCALE_FINLAND; + case SCE_SYSTEM_PARAM_LANG_SWEDISH : return XC_LOCALE_SWEDEN; + case SCE_SYSTEM_PARAM_LANG_DANISH : return XC_LOCALE_DENMARK; + case SCE_SYSTEM_PARAM_LANG_NORWEGIAN : return XC_LOCALE_NORWAY; + case SCE_SYSTEM_PARAM_LANG_POLISH : return XC_LOCALE_POLAND; + case SCE_SYSTEM_PARAM_LANG_TURKISH : return XC_LOCALE_TURKEY; + + + case SCE_SYSTEM_PARAM_LANG_CHINESE_S : return XC_LOCALE_CHINA; + default : return XC_LOCALE_UNITED_STATES; + } +} + +DWORD XEnableGuestSignin(BOOL fEnable) +{ + return 0; +} diff --git a/Minecraft.Client/PSVita/PSVitaExtras/ShutdownManager.cpp b/Minecraft.Client/PSVita/PSVitaExtras/ShutdownManager.cpp new file mode 100644 index 00000000..e7eca53f --- /dev/null +++ b/Minecraft.Client/PSVita/PSVitaExtras/ShutdownManager.cpp @@ -0,0 +1,204 @@ +#include "stdafx.h" +#include "ShutdownManager.h" +#include "..\..\Common\Leaderboards\LeaderboardManager.h" +#include "..\..\MinecraftServer.h" +#ifdef __PS3__ +#include "C4JSpursJob.h" + + +bool ShutdownManager::s_threadShouldRun[ShutdownManager::eThreadIdCount]; +int ShutdownManager::s_threadRunning[ShutdownManager::eThreadIdCount]; +CRITICAL_SECTION ShutdownManager::s_threadRunningCS; +C4JThread::EventArray *ShutdownManager::s_eventArray[eThreadIdCount]; +#endif + +// Initialises the shutdown manager - this needs to be called as soon as the game is started so it can respond as quickly as possible to shut down requests +void ShutdownManager::Initialise() +{ +#ifdef __PS3__ + cellSysutilRegisterCallback( 1, SysUtilCallback, NULL ); + for( int i = 0; i < eThreadIdCount; i++ ) + { + s_threadShouldRun[i] = true; + s_threadRunning[i] = 0; + s_eventArray[i] = NULL; + } + // Special case for storage manager, which we will manually set now to be considered as running - this will be unset by StorageManager.ExitRequest if required + s_threadRunning[eStorageManagerThreads] = true; + InitializeCriticalSection(&s_threadRunningCS); +#endif +} + +// Called in response to a system request to exit the game. This just requests that the main thread should stop, and then the main thread is responsible for calling MainThreadHandleShutdown which +// starts the rest of the shut down process, then waits until it is complete. +void ShutdownManager::StartShutdown() +{ +#ifdef __PS3__ + s_threadShouldRun[ eMainThread ] = false; +#endif +} + +// This should be called from the main thread after it has been requested to shut down (ShouldRun for main thread returns false), and before it returns control to the kernel. This is responsible for +// signalling to all other threads to stop, and wait until their completion before returning. +void ShutdownManager::MainThreadHandleShutdown() +{ +#ifdef __PS3__ + // Set flags for each thread which will be reset when they are complete + s_threadRunning[ eMainThread ] = false; + + // Second wave of things we would like to shut down (after main) + LeaderboardManager::Instance()->CancelOperation(); + RequestThreadToStop( eLeaderboardThread ); + RequestThreadToStop( eCommerceThread ); + RequestThreadToStop( ePostProcessThread ); + RequestThreadToStop( eRunUpdateThread ); + RequestThreadToStop( eRenderChunkUpdateThread ); + RequestThreadToStop( eConnectionReadThreads ); + RequestThreadToStop( eConnectionWriteThreads ); + RequestThreadToStop( eEventQueueThreads ); + app.DebugPrintf("Shutdown manager: waiting on first batch of threads requested to terminate...\n"); + WaitForSignalledToComplete(); + app.DebugPrintf("Shutdown manager: terminated.\n"); + + // Now shut down the server thread + MinecraftServer::HaltServer(); + RequestThreadToStop( eServerThread ); + app.DebugPrintf("Shutdown manager: waiting on server to terminate...\n"); + WaitForSignalledToComplete(); + app.DebugPrintf("Shutdown manager: terminated.\n"); + + //And shut down the storage manager + RequestThreadToStop( eStorageManagerThreads ); + StorageManager.ExitRequest(&StorageManagerCompleteFn); + app.DebugPrintf("Shutdown manager: waiting on storage manager to terminate...\n"); + WaitForSignalledToComplete(); + app.DebugPrintf("Shutdown manager: terminated.\n"); + + // Audio system shutdown + app.DebugPrintf("Shutdown manager: Audio shutdown.\n"); + AIL_shutdown(); + + // Trophy system shutdown + app.DebugPrintf("Shutdown manager: Trophy system shutdown.\n"); + ProfileManager.Terminate(); + + // Network manager shutdown + app.DebugPrintf("Shutdown manager: Network manager shutdown.\n"); + g_NetworkManager.Terminate(); + + // Finally shut down the spurs job queue - leaving until last so there should be nothing else dependent on this still running + app.DebugPrintf("Shutdown manager: SPURS shutdown.\n"); + C4JSpursJobQueue::getMainJobQueue().shutdown(); + app.DebugPrintf("Shutdown manager: Complete.\n"); +#endif +} + +void ShutdownManager::HasStarted(ShutdownManager::EThreadId threadId) +{ +#ifdef __PS3__ + EnterCriticalSection(&s_threadRunningCS); + s_threadRunning[threadId]++; + LeaveCriticalSection(&s_threadRunningCS); +#endif +} + +void ShutdownManager::HasStarted(ShutdownManager::EThreadId threadId, C4JThread::EventArray *eventArray) +{ +#ifdef __PS3__ + EnterCriticalSection(&s_threadRunningCS); + s_threadRunning[threadId]++; + LeaveCriticalSection(&s_threadRunningCS); + s_eventArray[threadId] = eventArray; +#endif +} + +bool ShutdownManager::ShouldRun(ShutdownManager::EThreadId threadId) +{ +#ifdef __PS3__ + return s_threadShouldRun[threadId]; +#else + return true; +#endif +} + +void ShutdownManager::HasFinished(ShutdownManager::EThreadId threadId) +{ +#ifdef __PS3__ + EnterCriticalSection(&s_threadRunningCS); + s_threadRunning[threadId]--; + LeaveCriticalSection(&s_threadRunningCS); +#endif +} + +#ifdef __PS3__ +void ShutdownManager::SysUtilCallback(uint64_t status, uint64_t param, void *userdata) +{ + Minecraft *minecraft = Minecraft::GetInstance(); + switch(status) + { + case CELL_SYSUTIL_REQUEST_EXITGAME: + app.DebugPrintf("CELL_SYSUTIL_REQUEST_EXITGAME\n"); + StartShutdown(); + break; + case CELL_SYSUTIL_SYSTEM_MENU_OPEN: + // Tell the game UI to stop processing + StorageManager.SetSystemUIDisplaying(true); + break; + case CELL_SYSUTIL_DRAWING_END: + StorageManager.SetSystemUIDisplaying(false); + break; + case CELL_SYSUTIL_DRAWING_BEGIN: + case CELL_SYSUTIL_SYSTEM_MENU_CLOSE: + break; + case CELL_SYSUTIL_BGMPLAYBACK_PLAY: + if( minecraft ) + { + minecraft->soundEngine->updateSystemMusicPlaying(true); + } + app.DebugPrintf("BGM playing\n"); + break; + case CELL_SYSUTIL_BGMPLAYBACK_STOP: + if( minecraft ) + { + minecraft->soundEngine->updateSystemMusicPlaying(false); + } + app.DebugPrintf("BGM stopped\n"); + break; + } +} +#endif + +#ifdef __PS3__ +void ShutdownManager::WaitForSignalledToComplete() +{ + bool allComplete; + do + { + cellSysutilCheckCallback(); + Sleep(10); + allComplete = true; + for( int i = 0; i < eThreadIdCount; i++ ) + { + if( !s_threadShouldRun[i] ) + { + if( s_threadRunning[i] != 0 ) allComplete = false; + } + } + } while( !allComplete); + +} + +void ShutdownManager::RequestThreadToStop(int i) +{ + s_threadShouldRun[i] = false; + if( s_eventArray[i] ) + { + s_eventArray[i]->Cancel(); + } +} + +void ShutdownManager::StorageManagerCompleteFn() +{ + HasFinished(eStorageManagerThreads); +} +#endif \ No newline at end of file diff --git a/Minecraft.Client/PSVita/PSVitaExtras/ShutdownManager.h b/Minecraft.Client/PSVita/PSVitaExtras/ShutdownManager.h new file mode 100644 index 00000000..82b94c40 --- /dev/null +++ b/Minecraft.Client/PSVita/PSVitaExtras/ShutdownManager.h @@ -0,0 +1,47 @@ +#pragma once + +class ShutdownManager +{ +public: + typedef enum + { + eMainThread, + + eLeaderboardThread, + eCommerceThread, + ePostProcessThread, + eRunUpdateThread, + eRenderChunkUpdateThread, + eServerThread, + eStorageManagerThreads, + eConnectionReadThreads, + eConnectionWriteThreads, + eEventQueueThreads, + + eThreadIdCount + } EThreadId; + + static void Initialise(); + static void StartShutdown(); + static void MainThreadHandleShutdown(); +#ifdef __PS3__ + static void SysUtilCallback(uint64_t status, uint64_t param, void *userdata); +#endif + + static void HasStarted(EThreadId threadId); + static void HasStarted(EThreadId threadId, C4JThread::EventArray *eventArray); + static bool ShouldRun(EThreadId threadId); + static void HasFinished(EThreadId threadId); + +private: +#ifdef __PS3__ + static bool s_threadShouldRun[eThreadIdCount]; + static int s_threadRunning[eThreadIdCount]; + static CRITICAL_SECTION s_threadRunningCS; + static C4JThread::EventArray *s_eventArray[eThreadIdCount]; + + static void RequestThreadToStop(int i); + static void WaitForSignalledToComplete(); + static void StorageManagerCompleteFn(); +#endif +}; diff --git a/Minecraft.Client/PSVita/PSVitaExtras/TLSStorage.cpp b/Minecraft.Client/PSVita/PSVitaExtras/TLSStorage.cpp new file mode 100644 index 00000000..31b6ecb1 --- /dev/null +++ b/Minecraft.Client/PSVita/PSVitaExtras/TLSStorage.cpp @@ -0,0 +1,72 @@ + + +#include "stdafx.h" + + + +TLSStoragePSVita* TLSStoragePSVita::m_pInstance = NULL; + +BOOL TLSStoragePSVita::m_activeList[sc_maxSlots]; +__thread LPVOID TLSStoragePSVita::m_values[sc_maxSlots]; + + + +TLSStoragePSVita::TLSStoragePSVita() +{ + for(int i=0;i +#include +#include +#else +#include +#include +#include +#endif + +#if ! LIBDIVIDE_HAS_STDINT_TYPES && ! LIBDIVIDE_VC +/* Visual C++ still doesn't ship with stdint.h (!) */ +#include +#define LIBDIVIDE_HAS_STDINT_TYPES 1 +#endif + +#if ! LIBDIVIDE_HAS_STDINT_TYPES +typedef __int32 int32_t; +typedef unsigned __int32 uint32_t; +typedef __int64 int64_t; +typedef unsigned __int64 uint64_t; +typedef __int8 int8_t; +typedef unsigned __int8 uint8_t; +#endif + +#if LIBDIVIDE_USE_SSE2 + #if LIBDIVIDE_VC + #include + #endif +#include +#endif + +#ifndef __has_builtin +#define __has_builtin(x) 0 // Compatibility with non-clang compilers. +#endif + +#ifdef __ICC +#define HAS_INT128_T 0 +#else +#define HAS_INT128_T __LP64__ +#endif + +#if defined(__x86_64__) || defined(_WIN64) || defined(_M_64) +#define LIBDIVIDE_IS_X86_64 1 +#endif + +#if defined(__i386__) +#define LIBDIVIDE_IS_i386 1 +#endif + +#if __GNUC__ || __clang__ +#define LIBDIVIDE_GCC_STYLE_ASM 1 +#endif + + +/* libdivide may use the pmuldq (vector signed 32x32->64 mult instruction) which is in SSE 4.1. However, signed multiplication can be emulated efficiently with unsigned multiplication, and SSE 4.1 is currently rare, so it is OK to not turn this on */ +#ifdef LIBDIVIDE_USE_SSE4_1 +#include +#endif + +#ifdef __cplusplus +/* We place libdivide within the libdivide namespace, and that goes in an anonymous namespace so that the functions are only visible to files that #include this header and don't get external linkage. At least that's the theory. */ +namespace { +namespace libdivide { +#endif + +/* Explanation of "more" field: bit 6 is whether to use shift path. If we are using the shift path, bit 7 is whether the divisor is negative in the signed case; in the unsigned case it is 0. Bits 0-4 is shift value (for shift path or mult path). In 32 bit case, bit 5 is always 0. We use bit 7 as the "negative divisor indicator" so that we can use sign extension to efficiently go to a full-width -1. + + +u32: [0-4] shift value + [5] ignored + [6] add indicator + [7] shift path + +s32: [0-4] shift value + [5] shift path + [6] add indicator + [7] indicates negative divisor + +u64: [0-5] shift value + [6] add indicator + [7] shift path + +s64: [0-5] shift value + [6] add indicator + [7] indicates negative divisor + magic number of 0 indicates shift path (we ran out of bits!) +*/ + +enum { + LIBDIVIDE_32_SHIFT_MASK = 0x1F, + LIBDIVIDE_64_SHIFT_MASK = 0x3F, + LIBDIVIDE_ADD_MARKER = 0x40, + LIBDIVIDE_U32_SHIFT_PATH = 0x80, + LIBDIVIDE_U64_SHIFT_PATH = 0x80, + LIBDIVIDE_S32_SHIFT_PATH = 0x20, + LIBDIVIDE_NEGATIVE_DIVISOR = 0x80 +}; + + +struct libdivide_u32_t { + uint32_t magic; + uint8_t more; +}; + +struct libdivide_s32_t { + int32_t magic; + uint8_t more; +}; + +struct libdivide_u64_t { + uint64_t magic; + uint8_t more; +}; + +struct libdivide_s64_t { + int64_t magic; + uint8_t more; +}; + + + +#ifndef LIBDIVIDE_API + #ifdef __cplusplus + /* In C++, we don't want our public functions to be static, because they are arguments to templates and static functions can't do that. They get internal linkage through virtue of the anonymous namespace. In C, they should be static. */ + #define LIBDIVIDE_API + #else + #define LIBDIVIDE_API static + #endif +#endif + + +LIBDIVIDE_API struct libdivide_s32_t libdivide_s32_gen(int32_t y); +LIBDIVIDE_API struct libdivide_u32_t libdivide_u32_gen(uint32_t y); +LIBDIVIDE_API struct libdivide_s64_t libdivide_s64_gen(int64_t y); +LIBDIVIDE_API struct libdivide_u64_t libdivide_u64_gen(uint64_t y); + +LIBDIVIDE_API int32_t libdivide_s32_do(int32_t numer, const struct libdivide_s32_t *denom); +LIBDIVIDE_API uint32_t libdivide_u32_do(uint32_t numer, const struct libdivide_u32_t *denom); +LIBDIVIDE_API int64_t libdivide_s64_do(int64_t numer, const struct libdivide_s64_t *denom); +LIBDIVIDE_API uint64_t libdivide_u64_do(uint64_t y, const struct libdivide_u64_t *denom); + +LIBDIVIDE_API int libdivide_u32_get_algorithm(const struct libdivide_u32_t *denom); +LIBDIVIDE_API uint32_t libdivide_u32_do_alg0(uint32_t numer, const struct libdivide_u32_t *denom); +LIBDIVIDE_API uint32_t libdivide_u32_do_alg1(uint32_t numer, const struct libdivide_u32_t *denom); +LIBDIVIDE_API uint32_t libdivide_u32_do_alg2(uint32_t numer, const struct libdivide_u32_t *denom); + +LIBDIVIDE_API int libdivide_u64_get_algorithm(const struct libdivide_u64_t *denom); +LIBDIVIDE_API uint64_t libdivide_u64_do_alg0(uint64_t numer, const struct libdivide_u64_t *denom); +LIBDIVIDE_API uint64_t libdivide_u64_do_alg1(uint64_t numer, const struct libdivide_u64_t *denom); +LIBDIVIDE_API uint64_t libdivide_u64_do_alg2(uint64_t numer, const struct libdivide_u64_t *denom); + +LIBDIVIDE_API int libdivide_s32_get_algorithm(const struct libdivide_s32_t *denom); +LIBDIVIDE_API int32_t libdivide_s32_do_alg0(int32_t numer, const struct libdivide_s32_t *denom); +LIBDIVIDE_API int32_t libdivide_s32_do_alg1(int32_t numer, const struct libdivide_s32_t *denom); +LIBDIVIDE_API int32_t libdivide_s32_do_alg2(int32_t numer, const struct libdivide_s32_t *denom); +LIBDIVIDE_API int32_t libdivide_s32_do_alg3(int32_t numer, const struct libdivide_s32_t *denom); +LIBDIVIDE_API int32_t libdivide_s32_do_alg4(int32_t numer, const struct libdivide_s32_t *denom); + +LIBDIVIDE_API int libdivide_s64_get_algorithm(const struct libdivide_s64_t *denom); +LIBDIVIDE_API int64_t libdivide_s64_do_alg0(int64_t numer, const struct libdivide_s64_t *denom); +LIBDIVIDE_API int64_t libdivide_s64_do_alg1(int64_t numer, const struct libdivide_s64_t *denom); +LIBDIVIDE_API int64_t libdivide_s64_do_alg2(int64_t numer, const struct libdivide_s64_t *denom); +LIBDIVIDE_API int64_t libdivide_s64_do_alg3(int64_t numer, const struct libdivide_s64_t *denom); +LIBDIVIDE_API int64_t libdivide_s64_do_alg4(int64_t numer, const struct libdivide_s64_t *denom); + +#if LIBDIVIDE_USE_SSE2 +LIBDIVIDE_API __m128i libdivide_u32_do_vector(__m128i numers, const struct libdivide_u32_t * denom); +LIBDIVIDE_API __m128i libdivide_s32_do_vector(__m128i numers, const struct libdivide_s32_t * denom); +LIBDIVIDE_API __m128i libdivide_u64_do_vector(__m128i numers, const struct libdivide_u64_t * denom); +LIBDIVIDE_API __m128i libdivide_s64_do_vector(__m128i numers, const struct libdivide_s64_t * denom); + +LIBDIVIDE_API __m128i libdivide_u32_do_vector_alg0(__m128i numers, const struct libdivide_u32_t * denom); +LIBDIVIDE_API __m128i libdivide_u32_do_vector_alg1(__m128i numers, const struct libdivide_u32_t * denom); +LIBDIVIDE_API __m128i libdivide_u32_do_vector_alg2(__m128i numers, const struct libdivide_u32_t * denom); + +LIBDIVIDE_API __m128i libdivide_s32_do_vector_alg0(__m128i numers, const struct libdivide_s32_t * denom); +LIBDIVIDE_API __m128i libdivide_s32_do_vector_alg1(__m128i numers, const struct libdivide_s32_t * denom); +LIBDIVIDE_API __m128i libdivide_s32_do_vector_alg2(__m128i numers, const struct libdivide_s32_t * denom); +LIBDIVIDE_API __m128i libdivide_s32_do_vector_alg3(__m128i numers, const struct libdivide_s32_t * denom); +LIBDIVIDE_API __m128i libdivide_s32_do_vector_alg4(__m128i numers, const struct libdivide_s32_t * denom); + +LIBDIVIDE_API __m128i libdivide_u64_do_vector_alg0(__m128i numers, const struct libdivide_u64_t * denom); +LIBDIVIDE_API __m128i libdivide_u64_do_vector_alg1(__m128i numers, const struct libdivide_u64_t * denom); +LIBDIVIDE_API __m128i libdivide_u64_do_vector_alg2(__m128i numers, const struct libdivide_u64_t * denom); + +LIBDIVIDE_API __m128i libdivide_s64_do_vector_alg0(__m128i numers, const struct libdivide_s64_t * denom); +LIBDIVIDE_API __m128i libdivide_s64_do_vector_alg1(__m128i numers, const struct libdivide_s64_t * denom); +LIBDIVIDE_API __m128i libdivide_s64_do_vector_alg2(__m128i numers, const struct libdivide_s64_t * denom); +LIBDIVIDE_API __m128i libdivide_s64_do_vector_alg3(__m128i numers, const struct libdivide_s64_t * denom); +LIBDIVIDE_API __m128i libdivide_s64_do_vector_alg4(__m128i numers, const struct libdivide_s64_t * denom); +#endif + + + +//////// Internal Utility Functions + +static inline uint32_t libdivide__mullhi_u32(uint32_t x, uint32_t y) { + uint64_t xl = x, yl = y; + uint64_t rl = xl * yl; + return (uint32_t)(rl >> 32); +} + +static uint64_t libdivide__mullhi_u64(uint64_t x, uint64_t y) { +#if HAS_INT128_T + __uint128_t xl = x, yl = y; + __uint128_t rl = xl * yl; + return (uint64_t)(rl >> 64); +#else + //full 128 bits are x0 * y0 + (x0 * y1 << 32) + (x1 * y0 << 32) + (x1 * y1 << 64) + const uint32_t mask = 0xFFFFFFFF; + const uint32_t x0 = (uint32_t)(x & mask), x1 = (uint32_t)(x >> 32); + const uint32_t y0 = (uint32_t)(y & mask), y1 = (uint32_t)(y >> 32); + const uint32_t x0y0_hi = libdivide__mullhi_u32(x0, y0); + const uint64_t x0y1 = x0 * (uint64_t)y1; + const uint64_t x1y0 = x1 * (uint64_t)y0; + const uint64_t x1y1 = x1 * (uint64_t)y1; + + uint64_t temp = x1y0 + x0y0_hi; + uint64_t temp_lo = temp & mask, temp_hi = temp >> 32; + return x1y1 + temp_hi + ((temp_lo + x0y1) >> 32); +#endif +} + +static inline int64_t libdivide__mullhi_s64(int64_t x, int64_t y) { +#if HAS_INT128_T + __int128_t xl = x, yl = y; + __int128_t rl = xl * yl; + return (int64_t)(rl >> 64); +#else + //full 128 bits are x0 * y0 + (x0 * y1 << 32) + (x1 * y0 << 32) + (x1 * y1 << 64) + const uint32_t mask = 0xFFFFFFFF; + const uint32_t x0 = (uint32_t)(x & mask), y0 = (uint32_t)(y & mask); + const int32_t x1 = (int32_t)(x >> 32), y1 = (int32_t)(y >> 32); + const uint32_t x0y0_hi = libdivide__mullhi_u32(x0, y0); + const int64_t t = x1*(int64_t)y0 + x0y0_hi; + const int64_t w1 = x0*(int64_t)y1 + (t & mask); + return x1*(int64_t)y1 + (t >> 32) + (w1 >> 32); +#endif +} + +#if LIBDIVIDE_USE_SSE2 + +static inline __m128i libdivide__u64_to_m128(uint64_t x) { +#if LIBDIVIDE_VC + //64 bit windows doesn't seem to have an implementation of any of these load intrinsics, and 32 bit Visual C++ crashes + _declspec(align(16)) uint64_t temp[2] = {x, x}; + return _mm_load_si128((const __m128i*)temp); +#elif defined(__ICC) + uint64_t __attribute__((aligned(16))) temp[2] = {x,x}; + return _mm_load_si128((const __m128i*)temp); +#elif __clang__ + // clang does not provide this intrinsic either + return (__m128i){x, x}; +#else + // everyone else gets it right + return _mm_set1_epi64x(x); +#endif +} + +static inline __m128i libdivide_get_FFFFFFFF00000000(void) { + //returns the same as _mm_set1_epi64(0xFFFFFFFF00000000ULL) without touching memory + __m128i result = _mm_set1_epi8(-1); //optimizes to pcmpeqd on OS X + return _mm_slli_epi64(result, 32); +} + +static inline __m128i libdivide_get_00000000FFFFFFFF(void) { + //returns the same as _mm_set1_epi64(0x00000000FFFFFFFFULL) without touching memory + __m128i result = _mm_set1_epi8(-1); //optimizes to pcmpeqd on OS X + result = _mm_srli_epi64(result, 32); + return result; +} + +static inline __m128i libdivide_get_0000FFFF(void) { + //returns the same as _mm_set1_epi32(0x0000FFFFULL) without touching memory + __m128i result; //we don't care what its contents are + result = _mm_cmpeq_epi8(result, result); //all 1s + result = _mm_srli_epi32(result, 16); + return result; +} + +static inline __m128i libdivide_s64_signbits(__m128i v) { + //we want to compute v >> 63, that is, _mm_srai_epi64(v, 63). But there is no 64 bit shift right arithmetic instruction in SSE2. So we have to fake it by first duplicating the high 32 bit values, and then using a 32 bit shift. Another option would be to use _mm_srli_epi64(v, 63) and then subtract that from 0, but that approach appears to be substantially slower for unknown reasons + __m128i hiBitsDuped = _mm_shuffle_epi32(v, _MM_SHUFFLE(3, 3, 1, 1)); + __m128i signBits = _mm_srai_epi32(hiBitsDuped, 31); + return signBits; +} + +/* Returns an __m128i whose low 32 bits are equal to amt and has zero elsewhere. */ +static inline __m128i libdivide_u32_to_m128i(uint32_t amt) { + return _mm_set_epi32(0, 0, 0, amt); +} + +static inline __m128i libdivide_s64_shift_right_vector(__m128i v, int amt) { + //implementation of _mm_sra_epi64. Here we have two 64 bit values which are shifted right to logically become (64 - amt) values, and are then sign extended from a (64 - amt) bit number. + const int b = 64 - amt; + __m128i m = libdivide__u64_to_m128(1ULL << (b - 1)); + __m128i x = _mm_srl_epi64(v, libdivide_u32_to_m128i(amt)); + __m128i result = _mm_sub_epi64(_mm_xor_si128(x, m), m); //result = x^m - m + return result; +} + +/* Here, b is assumed to contain one 32 bit value repeated four times. If it did not, the function would not work. */ +static inline __m128i libdivide__mullhi_u32_flat_vector(__m128i a, __m128i b) { + __m128i hi_product_0Z2Z = _mm_srli_epi64(_mm_mul_epu32(a, b), 32); + __m128i a1X3X = _mm_srli_epi64(a, 32); + __m128i hi_product_Z1Z3 = _mm_and_si128(_mm_mul_epu32(a1X3X, b), libdivide_get_FFFFFFFF00000000()); + return _mm_or_si128(hi_product_0Z2Z, hi_product_Z1Z3); // = hi_product_0123 +} + + +/* Here, y is assumed to contain one 64 bit value repeated twice. */ +static inline __m128i libdivide_mullhi_u64_flat_vector(__m128i x, __m128i y) { + //full 128 bits are x0 * y0 + (x0 * y1 << 32) + (x1 * y0 << 32) + (x1 * y1 << 64) + const __m128i mask = libdivide_get_00000000FFFFFFFF(); + const __m128i x0 = _mm_and_si128(x, mask), x1 = _mm_srli_epi64(x, 32); //x0 is low half of 2 64 bit values, x1 is high half in low slots + const __m128i y0 = _mm_and_si128(y, mask), y1 = _mm_srli_epi64(y, 32); + const __m128i x0y0_hi = _mm_srli_epi64(_mm_mul_epu32(x0, y0), 32); //x0 happens to have the low half of the two 64 bit values in 32 bit slots 0 and 2, so _mm_mul_epu32 computes their full product, and then we shift right by 32 to get just the high values + const __m128i x0y1 = _mm_mul_epu32(x0, y1); + const __m128i x1y0 = _mm_mul_epu32(x1, y0); + const __m128i x1y1 = _mm_mul_epu32(x1, y1); + + const __m128i temp = _mm_add_epi64(x1y0, x0y0_hi); + __m128i temp_lo = _mm_and_si128(temp, mask), temp_hi = _mm_srli_epi64(temp, 32); + temp_lo = _mm_srli_epi64(_mm_add_epi64(temp_lo, x0y1), 32); + temp_hi = _mm_add_epi64(x1y1, temp_hi); + + return _mm_add_epi64(temp_lo, temp_hi); +} + +/* y is one 64 bit value repeated twice */ +static inline __m128i libdivide_mullhi_s64_flat_vector(__m128i x, __m128i y) { + __m128i p = libdivide_mullhi_u64_flat_vector(x, y); + __m128i t1 = _mm_and_si128(libdivide_s64_signbits(x), y); + p = _mm_sub_epi64(p, t1); + __m128i t2 = _mm_and_si128(libdivide_s64_signbits(y), x); + p = _mm_sub_epi64(p, t2); + return p; +} + +#ifdef LIBDIVIDE_USE_SSE4_1 + +/* b is one 32 bit value repeated four times. */ +static inline __m128i libdivide_mullhi_s32_flat_vector(__m128i a, __m128i b) { + __m128i hi_product_0Z2Z = _mm_srli_epi64(_mm_mul_epi32(a, b), 32); + __m128i a1X3X = _mm_srli_epi64(a, 32); + __m128i hi_product_Z1Z3 = _mm_and_si128(_mm_mul_epi32(a1X3X, b), libdivide_get_FFFFFFFF00000000()); + return _mm_or_si128(hi_product_0Z2Z, hi_product_Z1Z3); // = hi_product_0123 +} + +#else + +/* SSE2 does not have a signed multiplication instruction, but we can convert unsigned to signed pretty efficiently. Again, b is just a 32 bit value repeated four times. */ +static inline __m128i libdivide_mullhi_s32_flat_vector(__m128i a, __m128i b) { + __m128i p = libdivide__mullhi_u32_flat_vector(a, b); + __m128i t1 = _mm_and_si128(_mm_srai_epi32(a, 31), b); //t1 = (a >> 31) & y, arithmetic shift + __m128i t2 = _mm_and_si128(_mm_srai_epi32(b, 31), a); + p = _mm_sub_epi32(p, t1); + p = _mm_sub_epi32(p, t2); + return p; +} +#endif +#endif + +static inline int32_t libdivide__count_trailing_zeros32(uint32_t val) { +#if __GNUC__ || __has_builtin(__builtin_ctz) + /* Fast way to count trailing zeros */ + return __builtin_ctz(val); +#else + /* Dorky way to count trailing zeros. Note that this hangs for val = 0! */ + int32_t result = 0; + val = (val ^ (val - 1)) >> 1; // Set v's trailing 0s to 1s and zero rest + while (val) { + val >>= 1; + result++; + } + return result; +#endif +} + +static inline int32_t libdivide__count_trailing_zeros64(uint64_t val) { +#if __LP64__ && (__GNUC__ || __has_builtin(__builtin_ctzll)) + /* Fast way to count trailing zeros. Note that we disable this in 32 bit because gcc does something horrible - it calls through to a dynamically bound function. */ + return __builtin_ctzll(val); +#else + /* Pretty good way to count trailing zeros. Note that this hangs for val = 0! */ + uint32_t lo = val & 0xFFFFFFFF; + if (lo != 0) return libdivide__count_trailing_zeros32(lo); + return 32 + libdivide__count_trailing_zeros32((uint32_t)(val >> 32)); +#endif +} + +static inline int32_t libdivide__count_leading_zeros32(uint32_t val) { +#if __GNUC__ || __has_builtin(__builtin_clzll) + /* Fast way to count leading zeros */ + return __builtin_clz(val); +#else + /* Dorky way to count leading zeros. Note that this hangs for val = 0! */ + int32_t result = 0; + while (! (val & (1U << 31))) { + val <<= 1; + result++; + } + return result; +#endif +} + +static inline int32_t libdivide__count_leading_zeros64(uint64_t val) { +#if __GNUC__ || __has_builtin(__builtin_clzll) + /* Fast way to count leading zeros */ + return __builtin_clzll(val); +#else + /* Dorky way to count leading zeros. Note that this hangs for val = 0! */ + int32_t result = 0; + while (! (val & (1ULL << 63))) { + val <<= 1; + result++; + } + return result; +#endif +} + +//libdivide_64_div_32_to_32: divides a 64 bit uint {u1, u0} by a 32 bit uint {v}. The result must fit in 32 bits. Returns the quotient directly and the remainder in *r +#if (LIBDIVIDE_IS_i386 || LIBDIVIDE_IS_X86_64) && LIBDIVIDE_GCC_STYLE_ASM +static uint32_t libdivide_64_div_32_to_32(uint32_t u1, uint32_t u0, uint32_t v, uint32_t *r) { + uint32_t result; + __asm__("divl %[v]" + : "=a"(result), "=d"(*r) + : [v] "r"(v), "a"(u0), "d"(u1) + ); + return result; +} +#else +static uint32_t libdivide_64_div_32_to_32(uint32_t u1, uint32_t u0, uint32_t v, uint32_t *r) { + uint64_t n = (((uint64_t)u1) << 32) | u0; + uint32_t result = (uint32_t)(n / v); + *r = (uint32_t)(n - result * (uint64_t)v); + return result; +} +#endif + +#if LIBDIVIDE_IS_X86_64 && LIBDIVIDE_GCC_STYLE_ASM +static uint64_t libdivide_128_div_64_to_64(uint64_t u1, uint64_t u0, uint64_t v, uint64_t *r) { + //u0 -> rax + //u1 -> rdx + //divq + uint64_t result; + __asm__("divq %[v]" + : "=a"(result), "=d"(*r) + : [v] "r"(v), "a"(u0), "d"(u1) + ); + return result; + +} +#else + +/* Code taken from Hacker's Delight, http://www.hackersdelight.org/HDcode/divlu.c . License permits inclusion here per http://www.hackersdelight.org/permissions.htm + */ +static uint64_t libdivide_128_div_64_to_64(uint64_t u1, uint64_t u0, uint64_t v, uint64_t *r) { + const uint64_t b = (1ULL << 32); // Number base (16 bits). + uint64_t un1, un0, // Norm. dividend LSD's. + vn1, vn0, // Norm. divisor digits. + q1, q0, // Quotient digits. + un64, un21, un10,// Dividend digit pairs. + rhat; // A remainder. + int s; // Shift amount for norm. + + if (u1 >= v) { // If overflow, set rem. + if (r != NULL) // to an impossible value, + *r = (uint64_t)(-1); // and return the largest + return (uint64_t)(-1);} // possible quotient. + + /* count leading zeros */ + s = libdivide__count_leading_zeros64(v); // 0 <= s <= 63. + + v = v << s; // Normalize divisor. + vn1 = v >> 32; // Break divisor up into + vn0 = v & 0xFFFFFFFF; // two 32-bit digits. + + un64 = (u1 << s) | ((u0 >> (64 - s)) & (-s >> 31)); + un10 = u0 << s; // Shift dividend left. + + un1 = un10 >> 32; // Break right half of + un0 = un10 & 0xFFFFFFFF; // dividend into two digits. + + q1 = un64/vn1; // Compute the first + rhat = un64 - q1*vn1; // quotient digit, q1. +again1: + if (q1 >= b || q1*vn0 > b*rhat + un1) { + q1 = q1 - 1; + rhat = rhat + vn1; + if (rhat < b) goto again1;} + + un21 = un64*b + un1 - q1*v; // Multiply and subtract. + + q0 = un21/vn1; // Compute the second + rhat = un21 - q0*vn1; // quotient digit, q0. +again2: + if (q0 >= b || q0*vn0 > b*rhat + un0) { + q0 = q0 - 1; + rhat = rhat + vn1; + if (rhat < b) goto again2;} + + if (r != NULL) // If remainder is wanted, + *r = (un21*b + un0 - q0*v) >> s; // return it. + return q1*b + q0; +} +#endif + +#if LIBDIVIDE_ASSERTIONS_ON +#define LIBDIVIDE_ASSERT(x) do { if (! (x)) { fprintf(stderr, "Assertion failure on line %ld: %s\n", (long)__LINE__, #x); exit(-1); } } while (0) +#else +#define LIBDIVIDE_ASSERT(x) +#endif + +#ifndef LIBDIVIDE_HEADER_ONLY + +////////// UINT32 + +struct libdivide_u32_t libdivide_u32_gen(uint32_t d) { + struct libdivide_u32_t result; + if ((d & (d - 1)) == 0) { + result.magic = 0; + result.more = libdivide__count_trailing_zeros32(d) | LIBDIVIDE_U32_SHIFT_PATH; + } + else { + const uint32_t floor_log_2_d = 31 - libdivide__count_leading_zeros32(d); + + uint8_t more; + uint32_t rem, proposed_m; + proposed_m = libdivide_64_div_32_to_32(1U << floor_log_2_d, 0, d, &rem); + + LIBDIVIDE_ASSERT(rem > 0 && rem < d); + const uint32_t e = d - rem; + + /* This power works if e < 2**floor_log_2_d. */ + if (e < (1U << floor_log_2_d)) { + /* This power works */ + more = floor_log_2_d; + } + else { + /* We have to use the general 33-bit algorithm. We need to compute (2**power) / d. However, we already have (2**(power-1))/d and its remainder. By doubling both, and then correcting the remainder, we can compute the larger division. */ + proposed_m += proposed_m; //don't care about overflow here - in fact, we expect it + const uint32_t twice_rem = rem + rem; + if (twice_rem >= d || twice_rem < rem) proposed_m += 1; + more = floor_log_2_d | LIBDIVIDE_ADD_MARKER; + } + result.magic = 1 + proposed_m; + result.more = more; + //result.more's shift should in general be ceil_log_2_d. But if we used the smaller power, we subtract one from the shift because we're using the smaller power. If we're using the larger power, we subtract one from the shift because it's taken care of by the add indicator. So floor_log_2_d happens to be correct in both cases. + + } + return result; +} + +uint32_t libdivide_u32_do(uint32_t numer, const struct libdivide_u32_t *denom) { + uint8_t more = denom->more; + if (more & LIBDIVIDE_U32_SHIFT_PATH) { + return numer >> (more & LIBDIVIDE_32_SHIFT_MASK); + } + else { + uint32_t q = libdivide__mullhi_u32(denom->magic, numer); + if (more & LIBDIVIDE_ADD_MARKER) { + uint32_t t = ((numer - q) >> 1) + q; + return t >> (more & LIBDIVIDE_32_SHIFT_MASK); + } + else { + return q >> more; //all upper bits are 0 - don't need to mask them off + } + } +} + + +int libdivide_u32_get_algorithm(const struct libdivide_u32_t *denom) { + uint8_t more = denom->more; + if (more & LIBDIVIDE_U32_SHIFT_PATH) return 0; + else if (! (more & LIBDIVIDE_ADD_MARKER)) return 1; + else return 2; +} + +uint32_t libdivide_u32_do_alg0(uint32_t numer, const struct libdivide_u32_t *denom) { + return numer >> (denom->more & LIBDIVIDE_32_SHIFT_MASK); +} + +uint32_t libdivide_u32_do_alg1(uint32_t numer, const struct libdivide_u32_t *denom) { + uint32_t q = libdivide__mullhi_u32(denom->magic, numer); + return q >> denom->more; +} + +uint32_t libdivide_u32_do_alg2(uint32_t numer, const struct libdivide_u32_t *denom) { + // denom->add != 0 + uint32_t q = libdivide__mullhi_u32(denom->magic, numer); + uint32_t t = ((numer - q) >> 1) + q; + return t >> (denom->more & LIBDIVIDE_32_SHIFT_MASK); +} + + + + +#if LIBDIVIDE_USE_SSE2 +__m128i libdivide_u32_do_vector(__m128i numers, const struct libdivide_u32_t *denom) { + uint8_t more = denom->more; + if (more & LIBDIVIDE_U32_SHIFT_PATH) { + return _mm_srl_epi32(numers, libdivide_u32_to_m128i(more & LIBDIVIDE_32_SHIFT_MASK)); + } + else { + __m128i q = libdivide__mullhi_u32_flat_vector(numers, _mm_set1_epi32(denom->magic)); + if (more & LIBDIVIDE_ADD_MARKER) { + //uint32_t t = ((numer - q) >> 1) + q; + //return t >> denom->shift; + __m128i t = _mm_add_epi32(_mm_srli_epi32(_mm_sub_epi32(numers, q), 1), q); + return _mm_srl_epi32(t, libdivide_u32_to_m128i(more & LIBDIVIDE_32_SHIFT_MASK)); + + } + else { + //q >> denom->shift + return _mm_srl_epi32(q, libdivide_u32_to_m128i(more)); + } + } +} + +__m128i libdivide_u32_do_vector_alg0(__m128i numers, const struct libdivide_u32_t *denom) { + return _mm_srl_epi32(numers, libdivide_u32_to_m128i(denom->more & LIBDIVIDE_32_SHIFT_MASK)); +} + +__m128i libdivide_u32_do_vector_alg1(__m128i numers, const struct libdivide_u32_t *denom) { + __m128i q = libdivide__mullhi_u32_flat_vector(numers, _mm_set1_epi32(denom->magic)); + return _mm_srl_epi32(q, libdivide_u32_to_m128i(denom->more)); +} + +__m128i libdivide_u32_do_vector_alg2(__m128i numers, const struct libdivide_u32_t *denom) { + __m128i q = libdivide__mullhi_u32_flat_vector(numers, _mm_set1_epi32(denom->magic)); + __m128i t = _mm_add_epi32(_mm_srli_epi32(_mm_sub_epi32(numers, q), 1), q); + return _mm_srl_epi32(t, libdivide_u32_to_m128i(denom->more & LIBDIVIDE_32_SHIFT_MASK)); +} + +#endif + +/////////// UINT64 + +struct libdivide_u64_t libdivide_u64_gen(uint64_t d) { + struct libdivide_u64_t result; + if ((d & (d - 1)) == 0) { + result.more = libdivide__count_trailing_zeros64(d) | LIBDIVIDE_U64_SHIFT_PATH; + result.magic = 0; + } + else { + const uint32_t floor_log_2_d = 63 - libdivide__count_leading_zeros64(d); + + uint64_t proposed_m, rem; + uint8_t more; + proposed_m = libdivide_128_div_64_to_64(1ULL << floor_log_2_d, 0, d, &rem); //== (1 << (64 + floor_log_2_d)) / d + + LIBDIVIDE_ASSERT(rem > 0 && rem < d); + const uint64_t e = d - rem; + + /* This power works if e < 2**floor_log_2_d. */ + if (e < (1ULL << floor_log_2_d)) { + /* This power works */ + more = floor_log_2_d; + } + else { + /* We have to use the general 65-bit algorithm. We need to compute (2**power) / d. However, we already have (2**(power-1))/d and its remainder. By doubling both, and then correcting the remainder, we can compute the larger division. */ + proposed_m += proposed_m; //don't care about overflow here - in fact, we expect it + const uint64_t twice_rem = rem + rem; + if (twice_rem >= d || twice_rem < rem) proposed_m += 1; + more = floor_log_2_d | LIBDIVIDE_ADD_MARKER; + } + result.magic = 1 + proposed_m; + result.more = more; + //result.more's shift should in general be ceil_log_2_d. But if we used the smaller power, we subtract one from the shift because we're using the smaller power. If we're using the larger power, we subtract one from the shift because it's taken care of by the add indicator. So floor_log_2_d happens to be correct in both cases, which is why we do it outside of the if statement. + } + return result; +} + +uint64_t libdivide_u64_do(uint64_t numer, const struct libdivide_u64_t *denom) { + uint8_t more = denom->more; + if (more & LIBDIVIDE_U64_SHIFT_PATH) { + return numer >> (more & LIBDIVIDE_64_SHIFT_MASK); + } + else { + uint64_t q = libdivide__mullhi_u64(denom->magic, numer); + if (more & LIBDIVIDE_ADD_MARKER) { + uint64_t t = ((numer - q) >> 1) + q; + return t >> (more & LIBDIVIDE_64_SHIFT_MASK); + } + else { + return q >> more; //all upper bits are 0 - don't need to mask them off + } + } +} + + +int libdivide_u64_get_algorithm(const struct libdivide_u64_t *denom) { + uint8_t more = denom->more; + if (more & LIBDIVIDE_U64_SHIFT_PATH) return 0; + else if (! (more & LIBDIVIDE_ADD_MARKER)) return 1; + else return 2; +} + +uint64_t libdivide_u64_do_alg0(uint64_t numer, const struct libdivide_u64_t *denom) { + return numer >> (denom->more & LIBDIVIDE_64_SHIFT_MASK); +} + +uint64_t libdivide_u64_do_alg1(uint64_t numer, const struct libdivide_u64_t *denom) { + uint64_t q = libdivide__mullhi_u64(denom->magic, numer); + return q >> denom->more; +} + +uint64_t libdivide_u64_do_alg2(uint64_t numer, const struct libdivide_u64_t *denom) { + uint64_t q = libdivide__mullhi_u64(denom->magic, numer); + uint64_t t = ((numer - q) >> 1) + q; + return t >> (denom->more & LIBDIVIDE_64_SHIFT_MASK); +} + +#if LIBDIVIDE_USE_SSE2 +__m128i libdivide_u64_do_vector(__m128i numers, const struct libdivide_u64_t * denom) { + uint8_t more = denom->more; + if (more & LIBDIVIDE_U64_SHIFT_PATH) { + return _mm_srl_epi64(numers, libdivide_u32_to_m128i(more & LIBDIVIDE_64_SHIFT_MASK)); + } + else { + __m128i q = libdivide_mullhi_u64_flat_vector(numers, libdivide__u64_to_m128(denom->magic)); + if (more & LIBDIVIDE_ADD_MARKER) { + //uint32_t t = ((numer - q) >> 1) + q; + //return t >> denom->shift; + __m128i t = _mm_add_epi64(_mm_srli_epi64(_mm_sub_epi64(numers, q), 1), q); + return _mm_srl_epi64(t, libdivide_u32_to_m128i(more & LIBDIVIDE_64_SHIFT_MASK)); + } + else { + //q >> denom->shift + return _mm_srl_epi64(q, libdivide_u32_to_m128i(more)); + } + } +} + +__m128i libdivide_u64_do_vector_alg0(__m128i numers, const struct libdivide_u64_t *denom) { + return _mm_srl_epi64(numers, libdivide_u32_to_m128i(denom->more & LIBDIVIDE_64_SHIFT_MASK)); +} + +__m128i libdivide_u64_do_vector_alg1(__m128i numers, const struct libdivide_u64_t *denom) { + __m128i q = libdivide_mullhi_u64_flat_vector(numers, libdivide__u64_to_m128(denom->magic)); + return _mm_srl_epi64(q, libdivide_u32_to_m128i(denom->more)); +} + +__m128i libdivide_u64_do_vector_alg2(__m128i numers, const struct libdivide_u64_t *denom) { + __m128i q = libdivide_mullhi_u64_flat_vector(numers, libdivide__u64_to_m128(denom->magic)); + __m128i t = _mm_add_epi64(_mm_srli_epi64(_mm_sub_epi64(numers, q), 1), q); + return _mm_srl_epi64(t, libdivide_u32_to_m128i(denom->more & LIBDIVIDE_64_SHIFT_MASK)); +} + + +#endif + +/////////// SINT32 + + +static inline int32_t libdivide__mullhi_s32(int32_t x, int32_t y) { + int64_t xl = x, yl = y; + int64_t rl = xl * yl; + return (int32_t)(rl >> 32); //needs to be arithmetic shift +} + +struct libdivide_s32_t libdivide_s32_gen(int32_t d) { + struct libdivide_s32_t result; + + /* If d is a power of 2, or negative a power of 2, we have to use a shift. This is especially important because the magic algorithm fails for -1. To check if d is a power of 2 or its inverse, it suffices to check whether its absolute value has exactly one bit set. This works even for INT_MIN, because abs(INT_MIN) == INT_MIN, and INT_MIN has one bit set and is a power of 2. */ + uint32_t absD = (uint32_t)(d < 0 ? -d : d); //gcc optimizes this to the fast abs trick + if ((absD & (absD - 1)) == 0) { //check if exactly one bit is set, don't care if absD is 0 since that's divide by zero + result.magic = 0; + result.more = libdivide__count_trailing_zeros32(absD) | (d < 0 ? LIBDIVIDE_NEGATIVE_DIVISOR : 0) | LIBDIVIDE_S32_SHIFT_PATH; + } + else { + const uint32_t floor_log_2_d = 31 - libdivide__count_leading_zeros32(absD); + LIBDIVIDE_ASSERT(floor_log_2_d >= 1); + + uint8_t more; + //the dividend here is 2**(floor_log_2_d + 31), so the low 32 bit word is 0 and the high word is floor_log_2_d - 1 + uint32_t rem, proposed_m; + proposed_m = libdivide_64_div_32_to_32(1U << (floor_log_2_d - 1), 0, absD, &rem); + const uint32_t e = absD - rem; + + /* We are going to start with a power of floor_log_2_d - 1. This works if works if e < 2**floor_log_2_d. */ + if (e < (1U << floor_log_2_d)) { + /* This power works */ + more = floor_log_2_d - 1; + } + else { + /* We need to go one higher. This should not make proposed_m overflow, but it will make it negative when interpreted as an int32_t. */ + proposed_m += proposed_m; + const uint32_t twice_rem = rem + rem; + if (twice_rem >= absD || twice_rem < rem) proposed_m += 1; + more = floor_log_2_d | LIBDIVIDE_ADD_MARKER | (d < 0 ? LIBDIVIDE_NEGATIVE_DIVISOR : 0); //use the general algorithm + } + proposed_m += 1; + result.magic = (d < 0 ? -(int32_t)proposed_m : (int32_t)proposed_m); + result.more = more; + + } + return result; +} + +int32_t libdivide_s32_do(int32_t numer, const struct libdivide_s32_t *denom) { + uint8_t more = denom->more; + if (more & LIBDIVIDE_S32_SHIFT_PATH) { + uint8_t shifter = more & LIBDIVIDE_32_SHIFT_MASK; + int32_t q = numer + ((numer >> 31) & ((1 << shifter) - 1)); + q = q >> shifter; + int32_t shiftMask = (int8_t)more >> 7; //must be arithmetic shift and then sign-extend + q = (q ^ shiftMask) - shiftMask; + return q; + } + else { + int32_t q = libdivide__mullhi_s32(denom->magic, numer); + if (more & LIBDIVIDE_ADD_MARKER) { + int32_t sign = (int8_t)more >> 7; //must be arithmetic shift and then sign extend + q += ((numer ^ sign) - sign); + } + q >>= more & LIBDIVIDE_32_SHIFT_MASK; + q += (q < 0); + return q; + } +} + +int libdivide_s32_get_algorithm(const struct libdivide_s32_t *denom) { + uint8_t more = denom->more; + int positiveDivisor = ! (more & LIBDIVIDE_NEGATIVE_DIVISOR); + if (more & LIBDIVIDE_S32_SHIFT_PATH) return (positiveDivisor ? 0 : 1); + else if (more & LIBDIVIDE_ADD_MARKER) return (positiveDivisor ? 2 : 3); + else return 4; +} + +int32_t libdivide_s32_do_alg0(int32_t numer, const struct libdivide_s32_t *denom) { + uint8_t shifter = denom->more & LIBDIVIDE_32_SHIFT_MASK; + int32_t q = numer + ((numer >> 31) & ((1 << shifter) - 1)); + return q >> shifter; +} + +int32_t libdivide_s32_do_alg1(int32_t numer, const struct libdivide_s32_t *denom) { + uint8_t shifter = denom->more & LIBDIVIDE_32_SHIFT_MASK; + int32_t q = numer + ((numer >> 31) & ((1 << shifter) - 1)); + return - (q >> shifter); +} + +int32_t libdivide_s32_do_alg2(int32_t numer, const struct libdivide_s32_t *denom) { + int32_t q = libdivide__mullhi_s32(denom->magic, numer); + q += numer; + q >>= denom->more & LIBDIVIDE_32_SHIFT_MASK; + q += (q < 0); + return q; +} + +int32_t libdivide_s32_do_alg3(int32_t numer, const struct libdivide_s32_t *denom) { + int32_t q = libdivide__mullhi_s32(denom->magic, numer); + q -= numer; + q >>= denom->more & LIBDIVIDE_32_SHIFT_MASK; + q += (q < 0); + return q; +} + +int32_t libdivide_s32_do_alg4(int32_t numer, const struct libdivide_s32_t *denom) { + int32_t q = libdivide__mullhi_s32(denom->magic, numer); + q >>= denom->more & LIBDIVIDE_32_SHIFT_MASK; + q += (q < 0); + return q; +} + +#if LIBDIVIDE_USE_SSE2 +__m128i libdivide_s32_do_vector(__m128i numers, const struct libdivide_s32_t * denom) { + uint8_t more = denom->more; + if (more & LIBDIVIDE_S32_SHIFT_PATH) { + uint32_t shifter = more & LIBDIVIDE_32_SHIFT_MASK; + __m128i roundToZeroTweak = _mm_set1_epi32((1 << shifter) - 1); //could use _mm_srli_epi32 with an all -1 register + __m128i q = _mm_add_epi32(numers, _mm_and_si128(_mm_srai_epi32(numers, 31), roundToZeroTweak)); //q = numer + ((numer >> 31) & roundToZeroTweak); + q = _mm_sra_epi32(q, libdivide_u32_to_m128i(shifter)); // q = q >> shifter + __m128i shiftMask = _mm_set1_epi32((int32_t)((int8_t)more >> 7)); //set all bits of shift mask = to the sign bit of more + q = _mm_sub_epi32(_mm_xor_si128(q, shiftMask), shiftMask); //q = (q ^ shiftMask) - shiftMask; + return q; + } + else { + __m128i q = libdivide_mullhi_s32_flat_vector(numers, _mm_set1_epi32(denom->magic)); + if (more & LIBDIVIDE_ADD_MARKER) { + __m128i sign = _mm_set1_epi32((int32_t)(int8_t)more >> 7); //must be arithmetic shift + q = _mm_add_epi32(q, _mm_sub_epi32(_mm_xor_si128(numers, sign), sign)); // q += ((numer ^ sign) - sign); + } + q = _mm_sra_epi32(q, libdivide_u32_to_m128i(more & LIBDIVIDE_32_SHIFT_MASK)); //q >>= shift + q = _mm_add_epi32(q, _mm_srli_epi32(q, 31)); // q += (q < 0) + return q; + } +} + +__m128i libdivide_s32_do_vector_alg0(__m128i numers, const struct libdivide_s32_t *denom) { + uint8_t shifter = denom->more & LIBDIVIDE_32_SHIFT_MASK; + __m128i roundToZeroTweak = _mm_set1_epi32((1 << shifter) - 1); + __m128i q = _mm_add_epi32(numers, _mm_and_si128(_mm_srai_epi32(numers, 31), roundToZeroTweak)); + return _mm_sra_epi32(q, libdivide_u32_to_m128i(shifter)); +} + +__m128i libdivide_s32_do_vector_alg1(__m128i numers, const struct libdivide_s32_t *denom) { + uint8_t shifter = denom->more & LIBDIVIDE_32_SHIFT_MASK; + __m128i roundToZeroTweak = _mm_set1_epi32((1 << shifter) - 1); + __m128i q = _mm_add_epi32(numers, _mm_and_si128(_mm_srai_epi32(numers, 31), roundToZeroTweak)); + return _mm_sub_epi32(_mm_setzero_si128(), _mm_sra_epi32(q, libdivide_u32_to_m128i(shifter))); +} + +__m128i libdivide_s32_do_vector_alg2(__m128i numers, const struct libdivide_s32_t *denom) { + __m128i q = libdivide_mullhi_s32_flat_vector(numers, _mm_set1_epi32(denom->magic)); + q = _mm_add_epi32(q, numers); + q = _mm_sra_epi32(q, libdivide_u32_to_m128i(denom->more & LIBDIVIDE_32_SHIFT_MASK)); + q = _mm_add_epi32(q, _mm_srli_epi32(q, 31)); + return q; +} + +__m128i libdivide_s32_do_vector_alg3(__m128i numers, const struct libdivide_s32_t *denom) { + __m128i q = libdivide_mullhi_s32_flat_vector(numers, _mm_set1_epi32(denom->magic)); + q = _mm_sub_epi32(q, numers); + q = _mm_sra_epi32(q, libdivide_u32_to_m128i(denom->more & LIBDIVIDE_32_SHIFT_MASK)); + q = _mm_add_epi32(q, _mm_srli_epi32(q, 31)); + return q; +} + +__m128i libdivide_s32_do_vector_alg4(__m128i numers, const struct libdivide_s32_t *denom) { + __m128i q = libdivide_mullhi_s32_flat_vector(numers, _mm_set1_epi32(denom->magic)); + q = _mm_sra_epi32(q, libdivide_u32_to_m128i(denom->more)); //q >>= shift + q = _mm_add_epi32(q, _mm_srli_epi32(q, 31)); // q += (q < 0) + return q; +} +#endif + +///////////// SINT64 + + +struct libdivide_s64_t libdivide_s64_gen(int64_t d) { + struct libdivide_s64_t result; + + /* If d is a power of 2, or negative a power of 2, we have to use a shift. This is especially important because the magic algorithm fails for -1. To check if d is a power of 2 or its inverse, it suffices to check whether its absolute value has exactly one bit set. This works even for INT_MIN, because abs(INT_MIN) == INT_MIN, and INT_MIN has one bit set and is a power of 2. */ + const uint64_t absD = (uint64_t)(d < 0 ? -d : d); //gcc optimizes this to the fast abs trick + if ((absD & (absD - 1)) == 0) { //check if exactly one bit is set, don't care if absD is 0 since that's divide by zero + result.more = libdivide__count_trailing_zeros64(absD) | (d < 0 ? LIBDIVIDE_NEGATIVE_DIVISOR : 0); + result.magic = 0; + } + else { + const uint32_t floor_log_2_d = 63 - libdivide__count_leading_zeros64(absD); + + //the dividend here is 2**(floor_log_2_d + 63), so the low 64 bit word is 0 and the high word is floor_log_2_d - 1 + uint8_t more; + uint64_t rem, proposed_m; + proposed_m = libdivide_128_div_64_to_64(1ULL << (floor_log_2_d - 1), 0, absD, &rem); + const uint64_t e = absD - rem; + + /* We are going to start with a power of floor_log_2_d - 1. This works if works if e < 2**floor_log_2_d. */ + if (e < (1ULL << floor_log_2_d)) { + /* This power works */ + more = floor_log_2_d - 1; + } + else { + /* We need to go one higher. This should not make proposed_m overflow, but it will make it negative when interpreted as an int32_t. */ + proposed_m += proposed_m; + const uint64_t twice_rem = rem + rem; + if (twice_rem >= absD || twice_rem < rem) proposed_m += 1; + more = floor_log_2_d | LIBDIVIDE_ADD_MARKER | (d < 0 ? LIBDIVIDE_NEGATIVE_DIVISOR : 0); + } + proposed_m += 1; + result.more = more; + result.magic = (d < 0 ? -(int64_t)proposed_m : (int64_t)proposed_m); + } + return result; +} + +int64_t libdivide_s64_do(int64_t numer, const struct libdivide_s64_t *denom) { + uint8_t more = denom->more; + int64_t magic = denom->magic; + if (magic == 0) { //shift path + uint32_t shifter = more & LIBDIVIDE_64_SHIFT_MASK; + int64_t q = numer + ((numer >> 63) & ((1LL << shifter) - 1)); + q = q >> shifter; + int64_t shiftMask = (int8_t)more >> 7; //must be arithmetic shift and then sign-extend + q = (q ^ shiftMask) - shiftMask; + return q; + } + else { + int64_t q = libdivide__mullhi_s64(magic, numer); + if (more & LIBDIVIDE_ADD_MARKER) { + int64_t sign = (int8_t)more >> 7; //must be arithmetic shift and then sign extend + q += ((numer ^ sign) - sign); + } + q >>= more & LIBDIVIDE_64_SHIFT_MASK; + q += (q < 0); + return q; + } +} + + +int libdivide_s64_get_algorithm(const struct libdivide_s64_t *denom) { + uint8_t more = denom->more; + int positiveDivisor = ! (more & LIBDIVIDE_NEGATIVE_DIVISOR); + if (denom->magic == 0) return (positiveDivisor ? 0 : 1); //shift path + else if (more & LIBDIVIDE_ADD_MARKER) return (positiveDivisor ? 2 : 3); + else return 4; +} + +int64_t libdivide_s64_do_alg0(int64_t numer, const struct libdivide_s64_t *denom) { + uint32_t shifter = denom->more & LIBDIVIDE_64_SHIFT_MASK; + int64_t q = numer + ((numer >> 63) & ((1LL << shifter) - 1)); + return q >> shifter; +} + +int64_t libdivide_s64_do_alg1(int64_t numer, const struct libdivide_s64_t *denom) { + //denom->shifter != -1 && demo->shiftMask != 0 + uint32_t shifter = denom->more & LIBDIVIDE_64_SHIFT_MASK; + int64_t q = numer + ((numer >> 63) & ((1LL << shifter) - 1)); + return - (q >> shifter); +} + +int64_t libdivide_s64_do_alg2(int64_t numer, const struct libdivide_s64_t *denom) { + int64_t q = libdivide__mullhi_s64(denom->magic, numer); + q += numer; + q >>= denom->more & LIBDIVIDE_64_SHIFT_MASK; + q += (q < 0); + return q; +} + +int64_t libdivide_s64_do_alg3(int64_t numer, const struct libdivide_s64_t *denom) { + int64_t q = libdivide__mullhi_s64(denom->magic, numer); + q -= numer; + q >>= denom->more & LIBDIVIDE_64_SHIFT_MASK; + q += (q < 0); + return q; +} + +int64_t libdivide_s64_do_alg4(int64_t numer, const struct libdivide_s64_t *denom) { + int64_t q = libdivide__mullhi_s64(denom->magic, numer); + q >>= denom->more; + q += (q < 0); + return q; +} + + +#if LIBDIVIDE_USE_SSE2 +__m128i libdivide_s64_do_vector(__m128i numers, const struct libdivide_s64_t * denom) { + uint8_t more = denom->more; + int64_t magic = denom->magic; + if (magic == 0) { //shift path + uint32_t shifter = more & LIBDIVIDE_64_SHIFT_MASK; + __m128i roundToZeroTweak = libdivide__u64_to_m128((1LL << shifter) - 1); + __m128i q = _mm_add_epi64(numers, _mm_and_si128(libdivide_s64_signbits(numers), roundToZeroTweak)); //q = numer + ((numer >> 63) & roundToZeroTweak); + q = libdivide_s64_shift_right_vector(q, shifter); // q = q >> shifter + __m128i shiftMask = _mm_set1_epi32((int32_t)((int8_t)more >> 7)); + q = _mm_sub_epi64(_mm_xor_si128(q, shiftMask), shiftMask); //q = (q ^ shiftMask) - shiftMask; + return q; + } + else { + __m128i q = libdivide_mullhi_s64_flat_vector(numers, libdivide__u64_to_m128(magic)); + if (more & LIBDIVIDE_ADD_MARKER) { + __m128i sign = _mm_set1_epi32((int32_t)((int8_t)more >> 7)); //must be arithmetic shift + q = _mm_add_epi64(q, _mm_sub_epi64(_mm_xor_si128(numers, sign), sign)); // q += ((numer ^ sign) - sign); + } + q = libdivide_s64_shift_right_vector(q, more & LIBDIVIDE_64_SHIFT_MASK); //q >>= denom->mult_path.shift + q = _mm_add_epi64(q, _mm_srli_epi64(q, 63)); // q += (q < 0) + return q; + } +} + +__m128i libdivide_s64_do_vector_alg0(__m128i numers, const struct libdivide_s64_t *denom) { + uint32_t shifter = denom->more & LIBDIVIDE_64_SHIFT_MASK; + __m128i roundToZeroTweak = libdivide__u64_to_m128((1LL << shifter) - 1); + __m128i q = _mm_add_epi64(numers, _mm_and_si128(libdivide_s64_signbits(numers), roundToZeroTweak)); + q = libdivide_s64_shift_right_vector(q, shifter); + return q; +} + +__m128i libdivide_s64_do_vector_alg1(__m128i numers, const struct libdivide_s64_t *denom) { + uint32_t shifter = denom->more & LIBDIVIDE_64_SHIFT_MASK; + __m128i roundToZeroTweak = libdivide__u64_to_m128((1LL << shifter) - 1); + __m128i q = _mm_add_epi64(numers, _mm_and_si128(libdivide_s64_signbits(numers), roundToZeroTweak)); + q = libdivide_s64_shift_right_vector(q, shifter); + return _mm_sub_epi64(_mm_setzero_si128(), q); +} + +__m128i libdivide_s64_do_vector_alg2(__m128i numers, const struct libdivide_s64_t *denom) { + __m128i q = libdivide_mullhi_s64_flat_vector(numers, libdivide__u64_to_m128(denom->magic)); + q = _mm_add_epi64(q, numers); + q = libdivide_s64_shift_right_vector(q, denom->more & LIBDIVIDE_64_SHIFT_MASK); + q = _mm_add_epi64(q, _mm_srli_epi64(q, 63)); // q += (q < 0) + return q; +} + +__m128i libdivide_s64_do_vector_alg3(__m128i numers, const struct libdivide_s64_t *denom) { + __m128i q = libdivide_mullhi_s64_flat_vector(numers, libdivide__u64_to_m128(denom->magic)); + q = _mm_sub_epi64(q, numers); + q = libdivide_s64_shift_right_vector(q, denom->more & LIBDIVIDE_64_SHIFT_MASK); + q = _mm_add_epi64(q, _mm_srli_epi64(q, 63)); // q += (q < 0) + return q; +} + +__m128i libdivide_s64_do_vector_alg4(__m128i numers, const struct libdivide_s64_t *denom) { + __m128i q = libdivide_mullhi_s64_flat_vector(numers, libdivide__u64_to_m128(denom->magic)); + q = libdivide_s64_shift_right_vector(q, denom->more); + q = _mm_add_epi64(q, _mm_srli_epi64(q, 63)); + return q; +} + +#endif + +/////////// C++ stuff + +#ifdef __cplusplus + +/* The C++ template design here is a total mess. This needs to be fixed by someone better at templates than I. The current design is: + +- The base is a template divider_base that takes the integer type, the libdivide struct, a generating function, a get algorithm function, a do function, and either a do vector function or a dummy int. +- The base has storage for the libdivide struct. This is the only storage (so the C++ class should be no larger than the libdivide struct). + +- Above that, there's divider_mid. This is an empty struct by default, but it is specialized against our four int types. divider_mid contains a template struct algo, that contains a typedef for a specialization of divider_base. struct algo is specialized to take an "algorithm number," where -1 means to use the general algorithm. + +- Publicly we have class divider, which inherits from divider_mid::algo. This also take an algorithm number, which defaults to -1 (the general algorithm). +- divider has a operator / which allows you to use a divider as the divisor in a quotient expression. + +*/ + +namespace libdivide_internal { + +#if LIBDIVIDE_USE_SSE2 +#define MAYBE_VECTOR(x) x +#define MAYBE_VECTOR_PARAM __m128i vector_func(__m128i, const DenomType *) +#else +#define MAYBE_VECTOR(x) 0 +#define MAYBE_VECTOR_PARAM int vector_func +#endif + + /* Some bogus unswitch functions for unsigned types so the same (presumably templated) code can work for both signed and unsigned. */ + uint32_t crash_u32(uint32_t, const libdivide_u32_t *) { abort(); return *(uint32_t *)NULL; } + uint64_t crash_u64(uint64_t, const libdivide_u64_t *) { abort(); return *(uint64_t *)NULL; } +#if LIBDIVIDE_USE_SSE2 + __m128i crash_u32_vector(__m128i, const libdivide_u32_t *) { abort(); return *(__m128i *)NULL; } + __m128i crash_u64_vector(__m128i, const libdivide_u64_t *) { abort(); return *(__m128i *)NULL; } +#endif + + template + class divider_base { + public: + DenomType denom; + divider_base(IntType d) : denom(gen_func(d)) { } + divider_base(const DenomType & d) : denom(d) { } + + IntType perform_divide(IntType val) const { return do_func(val, &denom); } +#if LIBDIVIDE_USE_SSE2 + __m128i perform_divide_vector(__m128i val) const { return vector_func(val, &denom); } +#endif + + int get_algorithm() const { return get_algo(&denom); } + }; + + + template struct divider_mid { }; + + template<> struct divider_mid { + typedef uint32_t IntType; + typedef struct libdivide_u32_t DenomType; + template struct denom { + typedef divider_base divider; + }; + + template struct algo { }; + template struct algo<-1, J> { typedef denom::divider divider; }; + template struct algo<0, J> { typedef denom::divider divider; }; + template struct algo<1, J> { typedef denom::divider divider; }; + template struct algo<2, J> { typedef denom::divider divider; }; + + /* Define two more bogus ones so that the same (templated, presumably) code can handle both signed and unsigned */ + template struct algo<3, J> { typedef denom::divider divider; }; + template struct algo<4, J> { typedef denom::divider divider; }; + + }; + + template<> struct divider_mid { + typedef int32_t IntType; + typedef struct libdivide_s32_t DenomType; + template struct denom { + typedef divider_base divider; + }; + + + template struct algo { }; + template struct algo<-1, J> { typedef denom::divider divider; }; + template struct algo<0, J> { typedef denom::divider divider; }; + template struct algo<1, J> { typedef denom::divider divider; }; + template struct algo<2, J> { typedef denom::divider divider; }; + template struct algo<3, J> { typedef denom::divider divider; }; + template struct algo<4, J> { typedef denom::divider divider; }; + + }; + + template<> struct divider_mid { + typedef uint64_t IntType; + typedef struct libdivide_u64_t DenomType; + template struct denom { + typedef divider_base divider; + }; + + template struct algo { }; + template struct algo<-1, J> { typedef denom::divider divider; }; + template struct algo<0, J> { typedef denom::divider divider; }; + template struct algo<1, J> { typedef denom::divider divider; }; + template struct algo<2, J> { typedef denom::divider divider; }; + + /* Define two more bogus ones so that the same (templated, presumably) code can handle both signed and unsigned */ + template struct algo<3, J> { typedef denom::divider divider; }; + template struct algo<4, J> { typedef denom::divider divider; }; + + + }; + + template<> struct divider_mid { + typedef int64_t IntType; + typedef struct libdivide_s64_t DenomType; + template struct denom { + typedef divider_base divider; + }; + + template struct algo { }; + template struct algo<-1, J> { typedef denom::divider divider; }; + template struct algo<0, J> { typedef denom::divider divider; }; + template struct algo<1, J> { typedef denom::divider divider; }; + template struct algo<2, J> { typedef denom::divider divider; }; + template struct algo<3, J> { typedef denom::divider divider; }; + template struct algo<4, J> { typedef denom::divider divider; }; + }; + +} + +template +class divider +{ + private: + typename libdivide_internal::divider_mid::template algo::divider sub; + template friend divider unswitch(const divider & d); + divider(const typename libdivide_internal::divider_mid::DenomType & denom) : sub(denom) { } + + public: + + /* Ordinary constructor, that takes the divisor as a parameter. */ + divider(T n) : sub(n) { } + + /* Default constructor, that divides by 1 */ + divider() : sub(1) { } + + /* Divides the parameter by the divisor, returning the quotient */ + T perform_divide(T val) const { return sub.perform_divide(val); } + +#if LIBDIVIDE_USE_SSE2 + /* Treats the vector as either two or four packed values (depending on the size), and divides each of them by the divisor, returning the packed quotients. */ + __m128i perform_divide_vector(__m128i val) const { return sub.perform_divide_vector(val); } +#endif + + /* Returns the index of algorithm, for use in the unswitch function */ + int get_algorithm() const { return sub.get_algorithm(); } // returns the algorithm for unswitching + + /* operator== */ + bool operator==(const divider & him) const { return sub.denom.magic == him.sub.denom.magic && sub.denom.more == him.sub.denom.more; } + + bool operator!=(const divider & him) const { return ! (*this == him); } +}; + +/* Returns a divider specialized for the given algorithm. */ +template +divider unswitch(const divider & d) { return divider(d.sub.denom); } + +/* Overload of the / operator for scalar division. */ +template +int_type operator/(int_type numer, const divider & denom) { + return denom.perform_divide(numer); +} + +#if LIBDIVIDE_USE_SSE2 +/* Overload of the / operator for vector division. */ +template +__m128i operator/(__m128i numer, const divider & denom) { + return denom.perform_divide_vector(numer); +} +#endif + + +#endif //__cplusplus + +#endif //LIBDIVIDE_HEADER_ONLY +#ifdef __cplusplus +} //close namespace libdivide +} //close anonymous namespace +#endif diff --git a/Minecraft.Client/PSVita/PSVitaExtras/user_malloc.c b/Minecraft.Client/PSVita/PSVitaExtras/user_malloc.c new file mode 100644 index 00000000..7036728f --- /dev/null +++ b/Minecraft.Client/PSVita/PSVitaExtras/user_malloc.c @@ -0,0 +1,390 @@ +/* SCE CONFIDENTIAL + PlayStation(R)Vita Programmer Tool Runtime Library Release 03.000.061 + * Copyright (C) 2012 Sony Computer Entertainment Inc. + * All Rights Reserved. + */ + +// AP - this is a modified version of the basic sony memory overide functions. +// It was found from profiling that threads were stalling far too much waiting for their turn to malloc/free +// This manager will keep memory bound to a thread once allocated so it can be reused by the same thread later. +// It's only interested in chunks up to 1036 bytes in size, anything greater is not retained +// Todo : I may need to put in a memory flusher if I find threads holding onto memory too much. + +#include +#include +#include +//#include +#include +#define HEAP_SIZE (164 * 1024 * 1024) +#define HEAP_ERROR1 1 +#define HEAP_ERROR2 2 +#define HEAP_ERROR3 3 + +static SceUID s_heapUid; +static mspace s_mspace; + +void user_malloc_init(void); +void user_malloc_finalize(void); +void *user_malloc(size_t size); +void user_free(void *ptr); +void *user_calloc(size_t nelem, size_t size); +void *user_realloc(void *ptr, size_t size); +void *user_memalign(size_t boundary, size_t size); +void *user_reallocalign(void *ptr, size_t size, size_t boundary); +int user_malloc_stats(struct malloc_managed_size *mmsize); +int user_malloc_stats_fast(struct malloc_managed_size *mmsize); +size_t user_malloc_usable_size(void *ptr); + +// this is our basic node for managing stacks +typedef struct Block +{ + void* Memory; + struct Block *Next; +} Block; + +#define MaxRetainedBytes 1036 +#define Malloc_BlocksMemorySize 1024 +typedef struct +{ + Block **Malloc_MemoryPool; // this is an array of available memory allocations up to 1036 bytes in size + Block *Malloc_Blocks; // this is a stack of available block nodes used to store memory chunks + Block *Malloc_BlocksMemory[Malloc_BlocksMemorySize]; // this is a pool of block nodes allocated in large chunks (256 blocks at a time) + int Malloc_BlocksAlloced; // this shows how many block node chunks have been allocated in Malloc_BlocksMemory +} SThreadStorage; + +__thread SThreadStorage *Malloc_ThreadStorage = NULL; + +/**E Replace _malloc_init function. */ +/**J _malloc_init 関数と置き換わる */ +void user_malloc_init(void) +{ + int res; + void *base = NULL; + + /**E Allocate a memory block from the kernel */ + /**J カーネルからメモリブロックを確保する */ + s_heapUid = sceKernelAllocMemBlock("UserAllocator", SCE_KERNEL_MEMBLOCK_TYPE_USER_RWDATA, HEAP_SIZE, SCE_NULL); + if (s_heapUid < SCE_OK) { + /**E Error handling */ + /**J エラー処理 */ + sceLibcSetHeapInitError(HEAP_ERROR1); + } else { + /**E Obtain the address of the allocated memory block */ + /**J 確保したメモリブロックのアドレスを取得する */ + res = sceKernelGetMemBlockBase(s_heapUid, &base); + if (res < SCE_OK) { + /**E Error handling */ + /**J エラー処理 */ + sceLibcSetHeapInitError(HEAP_ERROR2); + } else { + /**E Generate mspace */ + /**J mspace を生成する */ + s_mspace = mspace_create(base, HEAP_SIZE); + if (s_mspace == NULL) { + /**E Error handling */ + /**J エラー処理 */ + sceLibcSetHeapInitError(HEAP_ERROR3); + } + } + } +} + +/**E Replace _malloc_finalize function. */ +/**J _malloc_finalize 関数と置き換わる */ +void user_malloc_finalize(void) +{ + int res; + + if (s_mspace != NULL) { + /**E Free mspace */ + /**J mspace を解放する */ + res = mspace_destroy(s_mspace); + if (res != 0) { + /**E Error handling */ + /**J エラー処理 */ + __breakpoint(0); + } + s_mspace = NULL; + } + + if (SCE_OK <= s_heapUid) { + /**E Free the memory block */ + /**J メモリブロックを解放する */ +#if 0 + res = sceKernelFreeMemBlock(s_heapUid); + if (res < SCE_OK) { + /**E Error handling */ + /**J エラー処理 */ + __breakpoint(0); + } +#endif + } +} + +// before a thread can use the memory system it should register itself +void user_registerthread() +{ + Malloc_ThreadStorage = mspace_malloc(s_mspace, sizeof(SThreadStorage)); + Malloc_ThreadStorage->Malloc_Blocks = NULL; + Malloc_ThreadStorage->Malloc_BlocksAlloced = 0; + Malloc_ThreadStorage->Malloc_MemoryPool = NULL; +} + +// before a thread is destroyed make sure we free any space it might be holding on to +void user_removethread() +{ + SThreadStorage *psStorage = Malloc_ThreadStorage; + if( psStorage ) + { + if( psStorage->Malloc_MemoryPool ) + { + for( int j = 0;j < 1037;j += 1 ) + { + Block *OldBlock = psStorage->Malloc_MemoryPool[j]; + while( OldBlock ) + { + mspace_free(s_mspace, OldBlock->Memory); + OldBlock = OldBlock->Next; + } + } + + mspace_free(s_mspace, psStorage->Malloc_MemoryPool); + } + + for( int j = 0;j < psStorage->Malloc_BlocksAlloced;j += 1 ) + { + free(psStorage->Malloc_BlocksMemory[j]); + } + + mspace_free(s_mspace, psStorage); + Malloc_ThreadStorage = NULL; + } +} + +/**E Replace malloc function. */ +/**J malloc 関数と置き換わる */ +void *user_malloc(size_t size) +{ + void *p = NULL; + + SThreadStorage *psStorage = Malloc_ThreadStorage; + if( psStorage ) + { + // is this the first time we've malloced + if( psStorage->Malloc_MemoryPool == NULL ) + { + // create an array of pointers to Block nodes, one pointer for each memory bytes size up to 1036 + psStorage->Malloc_MemoryPool = mspace_malloc(s_mspace, (MaxRetainedBytes+1) * 4); + for( int i = 0;i < (MaxRetainedBytes+1);i += 1 ) + { + psStorage->Malloc_MemoryPool[i] = NULL; + } + } + + // are we interested in retaining this size of memory (less 4 bytes to store the associated thread ID) + if( size < (MaxRetainedBytes-4) ) + { + // add on space for the thread ID + size += 4; + + // round to the nearest malloc boundary. This is what happens internally in the malloc library + if( size <= 12 ) + size = 12; + else + size = ((size - 12) & 0xfffffff0) + 16 + 12; + + // do we have any memory of this size retained + if( psStorage->Malloc_MemoryPool[size] ) + { + // pop it from the retained pool + Block * OldBlock = psStorage->Malloc_MemoryPool[size]; + psStorage->Malloc_MemoryPool[size] = OldBlock->Next; + + p = OldBlock->Memory; + + // push the block storage onto the stack + OldBlock->Next = psStorage->Malloc_Blocks; + psStorage->Malloc_Blocks = OldBlock; + } + else + { + // create some new memory + p = mspace_malloc(s_mspace, size); + + // store the thread ID in the last 4 bytes + unsigned int threadID = sceKernelGetThreadId(); + unsigned int *ThreadAddr = (unsigned int *) ((unsigned char*) p + (size - 4)); + ThreadAddr[0] = threadID; + } + } + else + { + p = mspace_malloc(s_mspace, size); + } + } + else + { + p = mspace_malloc(s_mspace, size); + } + +// SCE_DBG_LOG_TRACE("Called malloc(%u)", size); + return p; +} + +/**E Replace free function. */ +/**J free 関数と置き換わる */ +void user_free(void *ptr) +{ + if( !ptr || !s_mspace ) + { + return; + } + + SThreadStorage *psStorage = Malloc_ThreadStorage; + if( psStorage ) + { + // calc the size of this chunk rounding to a valid size + unsigned int size = ((unsigned int*)ptr)[-1] - 7; + unsigned int RoundedSize = (size & 0xfffffff0) + 12; + + if( RoundedSize < (MaxRetainedBytes+1) ) + { + // grab the thread ID from the last 4 bytes + unsigned int *ThreadAddr = (unsigned int *) ((unsigned char*) ptr + (RoundedSize - 4)); + + // did this thread create this memory + if( sceKernelGetThreadId() != ThreadAddr[0] ) + { + // don't worry about retaining memory allocated from a different thread. too much mucking about + mspace_free(s_mspace, ptr); + return; + } + + // we need a block node to retain the memory on our stack. do we have any block nodes available + if( psStorage->Malloc_Blocks == NULL ) + { + if( psStorage->Malloc_BlocksAlloced == Malloc_BlocksMemorySize ) + { + // Max blocks allocated + // The worst case for this running out is when the player has explored a large amount of the map in a single session and then quits. All the allocations + // are suddenly freed up so we need lots of space to store them. + printf("oh nos, max blocks allocated. increase Malloc_BlocksMemorySize"); + assert(0); + } + + // allocate some more block space in a large chunk + int chunkSize = 256; + psStorage->Malloc_BlocksMemory[psStorage->Malloc_BlocksAlloced] = mspace_malloc(s_mspace, chunkSize * sizeof(Block)); + + // push all the new blocks onto the pool + for(int i = 0;i < chunkSize;i += 1 ) + { + Block *NewBlock = &psStorage->Malloc_BlocksMemory[psStorage->Malloc_BlocksAlloced][i]; + NewBlock->Next = psStorage->Malloc_Blocks; + psStorage->Malloc_Blocks = NewBlock; + } + + psStorage->Malloc_BlocksAlloced++; + } + + // pop a block node off the stack + Block *NewBlock = psStorage->Malloc_Blocks; + psStorage->Malloc_Blocks = NewBlock->Next; + + // set up the block data and retain it to the correct slot. We can now reuse this memory on the next malloc + NewBlock->Memory = ptr; + NewBlock->Next = psStorage->Malloc_MemoryPool[RoundedSize]; + psStorage->Malloc_MemoryPool[RoundedSize] = NewBlock; + } + else + { + mspace_free(s_mspace, ptr); + } + } + else + { + mspace_free(s_mspace, ptr); + } +} + +/**E Replace calloc function. */ +/**J calloc 関数と置き換わる */ +void *user_calloc(size_t nelem, size_t size) +{ +// SCE_DBG_LOG_TRACE("Called calloc(%u, %u)", nelem, size); + return mspace_calloc(s_mspace, nelem, size); +} + +/**E Replace realloc function. */ +/**J realloc 関数と置き換わる */ +void *user_realloc(void *ptr, size_t size) +{ + void* p = NULL; + + if( Malloc_ThreadStorage ) + { + // make sure we use malloc/memcpy/free instead of realloc + p = user_malloc(size); + + unsigned int OldSize; + unsigned int OldRoundedSize; + if( ptr ) + { + // calc the size of this chunk rounding to a valid size + OldSize = ((unsigned int*)ptr)[-1] - 7; + OldRoundedSize = (OldSize & 0xfffffff0) + 12; + memcpy(p, ptr, OldRoundedSize); + user_free(ptr); + } + } + else + { + p = mspace_realloc(s_mspace, ptr, size); + } + + return p; + +// SCE_DBG_LOG_TRACE("Called realloc(%p, %u)", ptr, size); +// return mspace_realloc(s_mspace, ptr, size); +} + +/**E Replace memalign function. */ +/**J memalign 関数と置き換わる */ +void *user_memalign(size_t boundary, size_t size) +{ +// SCE_DBG_LOG_TRACE("Called memalign(%u, %u)", boundary, size); + return mspace_memalign(s_mspace, boundary, size); +} + +/**E Replace reallocalign function. */ +/**J reallocalign 関数と置き換わる */ +void *user_reallocalign(void *ptr, size_t size, size_t boundary) +{ +// SCE_DBG_LOG_TRACE("Called reallocalign(%p, %u, %u)", ptr, size, boundary); + return mspace_reallocalign(s_mspace, ptr, size, boundary); +} + +/**E Replace malloc_stats function. */ +/**J malloc_stats 関数と置き換わる */ +int user_malloc_stats(struct malloc_managed_size *mmsize) +{ +// SCE_DBG_LOG_TRACE("Called malloc_stats"); + return mspace_malloc_stats(s_mspace, mmsize); +} + +/**E Replace malloc_stats_fast function. */ +/**J malloc_stata_fast 関数と置き換わる */ +int user_malloc_stats_fast(struct malloc_managed_size *mmsize) +{ +// SCE_DBG_LOG_TRACE("Called malloc_stats_fast"); + return mspace_malloc_stats_fast(s_mspace, mmsize); +} + +/**E Replace malloc_usable_size function. */ +/**J malloc_usable_size 関数と置き換わる */ +size_t user_malloc_usable_size(void *ptr) +{ +// SCE_DBG_LOG_TRACE("Called malloc_usable_size"); + return mspace_malloc_usable_size(ptr); +} + diff --git a/Minecraft.Client/PSVita/PSVitaExtras/user_malloc_for_tls.c b/Minecraft.Client/PSVita/PSVitaExtras/user_malloc_for_tls.c new file mode 100644 index 00000000..531bbd60 --- /dev/null +++ b/Minecraft.Client/PSVita/PSVitaExtras/user_malloc_for_tls.c @@ -0,0 +1,103 @@ +/* SCE CONFIDENTIAL + PlayStation(R)Vita Programmer Tool Runtime Library Release 03.000.061 + * Copyright (C) 2012 Sony Computer Entertainment Inc. + * All Rights Reserved. + */ + +#include +#include +#include +//#include + +#define HEAP_SIZE (1024 * 1024) +#define HEAP_ERROR1 1 +#define HEAP_ERROR2 2 +#define HEAP_ERROR3 3 + +static SceUID s_heapUid; +static mspace s_mspace; + +void user_malloc_for_tls_init(void); +void user_malloc_for_tls_finalize(void); +void *user_malloc_for_tls(size_t size); +void user_free_for_tls(void *ptr); + +/**E Replace _malloc_for_tls_init function. */ +/**J _malloc_for_tls_init 関数と置き換わる */ +void user_malloc_for_tls_init(void) +{ + int res; + void *base = NULL; + + /**E Allocate a memory block from the kernel */ + /**J カーネルからメモリブロックを確保する */ + s_heapUid = sceKernelAllocMemBlock("UserAllocatorForTLS", SCE_KERNEL_MEMBLOCK_TYPE_USER_RWDATA, HEAP_SIZE, SCE_NULL); + if (s_heapUid < SCE_OK) { + /**E Error handling */ + /**J エラー処理 */ + sceLibcSetHeapInitError(HEAP_ERROR1); + } else { + /**E Obtain the address of the allocated memory block */ + /**J 確保したメモリブロックのアドレスを取得する */ + res = sceKernelGetMemBlockBase(s_heapUid, &base); + if (res < SCE_OK) { + /**E Error handling */ + /**J エラー処理 */ + sceLibcSetHeapInitError(HEAP_ERROR2); + } else { + /**E Generate mspace */ + /**J mspace を生成する */ + s_mspace = mspace_create(base, HEAP_SIZE); + if (s_mspace == NULL) { + /**E Error handling */ + /**J エラー処理 */ + sceLibcSetHeapInitError(HEAP_ERROR3); + } + } + } +} + +/**E Replace _malloc_for_tls_finalize function. */ +/**J _malloc_for_tls_finalize 関数と置き換わる */ +void user_malloc_for_tls_finalize(void) +{ + int res; + + if (s_mspace != NULL) { + /**E Free mspace */ + /**J mspace を解放する */ + res = mspace_destroy(s_mspace); + if (res != 0) { + /**E Error handling */ + /**J エラー処理 */ + __breakpoint(0); + } + } + + if (SCE_OK <= s_heapUid) { + /**E Free the memory block */ + /**J メモリブロックを解放する */ + res = sceKernelFreeMemBlock(s_heapUid); + if (res < SCE_OK) { + /**E Error handling */ + /**J エラー処理 */ + __breakpoint(0); + } + } +} + +/**E Replace _malloc_for_tls function. */ +/**J _malloc_for_tls 関数と置き換わる */ +void *user_malloc_for_tls(size_t size) +{ +// SCE_DBG_LOG_TRACE("Called malloc_for_tls(%u)", size); + return mspace_malloc(s_mspace, size); +} + +/**E Replace _free_for_tls function. */ +/**J _free_for_tls 関数と置き換わる */ +void user_free_for_tls(void *ptr) +{ +// SCE_DBG_LOG_TRACE("Called free_for_tls(%p)", ptr); + mspace_free(s_mspace, ptr); +} diff --git a/Minecraft.Client/PSVita/PSVitaExtras/user_new.cpp b/Minecraft.Client/PSVita/PSVitaExtras/user_new.cpp new file mode 100644 index 00000000..1f71f6d2 --- /dev/null +++ b/Minecraft.Client/PSVita/PSVitaExtras/user_new.cpp @@ -0,0 +1,131 @@ +/* SCE CONFIDENTIAL + PlayStation(R)Vita Programmer Tool Runtime Library Release 03.000.061 + * Copyright (C) 2012 Sony Computer Entertainment Inc. + * All Rights Reserved. + */ + +#include +#include +//#include + +void *user_new(std::size_t size) throw(std::bad_alloc); +void *user_new(std::size_t size, const std::nothrow_t& x) throw(); +void *user_new_array(std::size_t size) throw(std::bad_alloc); +void *user_new_array(std::size_t size, const std::nothrow_t& x) throw(); +void user_delete(void *ptr) throw(); +void user_delete(void *ptr, const std::nothrow_t& x) throw(); +void user_delete_array(void *ptr) throw(); +void user_delete_array(void *ptr, const std::nothrow_t& x) throw(); + +/**E Replace operator new. */ +/**J operator new と置き換わる */ +void *user_new(std::size_t size) throw(std::bad_alloc) +{ + void *ptr; + +// SCE_DBG_LOG_TRACE("Called operator new(%u)", size); + + if (size == 0) + size = 1; + + while ((ptr = (void *)std::malloc(size)) == NULL) { + /**E Obtain new_handler */ + /**J new_handler を取得する */ + std::new_handler handler = std::_get_new_handler(); + + /**E When new_handler is a NULL pointer, bad_alloc is send. If not, new_handler is called. */ + /**J new_handler が NULL ポインタの場合、bad_alloc を送出する、そうでない場合、new_handler を呼び出す */ + if (!handler) + throw std::bad_alloc(); + else + (*handler)(); + } + return ptr; +} + +/**E Replace operator new(std::nothrow). */ +/**J operator(std::nothrow) と置き換わる */ +void *user_new(std::size_t size, const std::nothrow_t& x) throw() +{ + void *ptr; + + (void)x; + +// SCE_DBG_LOG_TRACE("Called operator new(nothrow)(%u)", size); + + if (size == 0) + size = 1; + + while ((ptr = (void *)std::malloc(size)) == NULL) { + /**E Obtain new_handler */ + /**J new_handler を取得する */ + std::new_handler handler = std::_get_new_handler(); + + /**E When new_handler is a NULL pointer, NULL is returned. */ + /**J new_handler が NULL ポインタの場合、NULL を返す */ + if (!handler) + return NULL; + + /**E Call new_handler. If new_handler sends bad_alloc, NULL is returned. */ + /**J new_handler を呼び出す、new_handler が bad_alloc を送出した場合、NULL を返す */ + try { + (*handler)(); + } catch (std::bad_alloc) { + return NULL; + } + } + return ptr; +} + +/**E Replace operator new[]. */ +/**J operator new[] と置き換わる */ +void *user_new_array(std::size_t size) throw(std::bad_alloc) +{ +// SCE_DBG_LOG_TRACE("Called operator new[](%u)", size); + return user_new(size); +} + +/**E Replace operator new[](std::nothrow). */ +/**J operator new[](std::nothrow) と置き換わる */ +void *user_new_array(std::size_t size, const std::nothrow_t& x) throw() +{ +// SCE_DBG_LOG_TRACE("Called operator new(nothrow)[](%u)", size); + return user_new(size, x); +} + +/**E Replace operator delete. */ +/**J operator delete と置き換わる */ +void user_delete(void *ptr) throw() +{ +// SCE_DBG_LOG_TRACE("Called operator delete(%p)", ptr); + /**E In the case of the NULL pointer, no action will be taken. */ + /**J NULL ポインタの場合、何も行わない */ + if (ptr != NULL) + std::free(ptr); +} + +/**E Replace operator delete(std::nothrow). */ +/**J operator delete(std::nothrow) と置き換わる */ +void user_delete(void *ptr, const std::nothrow_t& x) throw() +{ + (void)x; + +// SCE_DBG_LOG_TRACE("Called operator delete(nothrow)(%p)", ptr); + user_delete(ptr); +} + +/**E Replace operator delete[]. */ +/**J operator delete[] と置き換わる */ +void user_delete_array(void *ptr) throw() +{ +// SCE_DBG_LOG_TRACE("Called operator delete[](%p)", ptr); + user_delete(ptr); +} + +/**E Replace operator delete[](std::nothrow). */ +/**J operator delete[](std::nothrow) と置き換わる */ +void user_delete_array(void *ptr, const std::nothrow_t& x) throw() +{ +// SCE_DBG_LOG_TRACE("Called operator delete(nothrow)[](%p)", ptr); + user_delete(ptr, x); +} diff --git a/Minecraft.Client/PSVita/PSVitaExtras/zconf.h b/Minecraft.Client/PSVita/PSVitaExtras/zconf.h new file mode 100644 index 00000000..48405ca0 --- /dev/null +++ b/Minecraft.Client/PSVita/PSVitaExtras/zconf.h @@ -0,0 +1,511 @@ +/* zconf.h -- configuration of the zlib compression library + * Copyright (C) 1995-2013 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#ifndef ZCONF_H +#define ZCONF_H + +/* + * If you *really* need a unique prefix for all types and library functions, + * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. + * Even better than compiling with -DZ_PREFIX would be to use configure to set + * this permanently in zconf.h using "./configure --zprefix". + */ +#ifdef Z_PREFIX /* may be set to #if 1 by ./configure */ +# define Z_PREFIX_SET + +/* all linked symbols */ +# define _dist_code z__dist_code +# define _length_code z__length_code +# define _tr_align z__tr_align +# define _tr_flush_bits z__tr_flush_bits +# define _tr_flush_block z__tr_flush_block +# define _tr_init z__tr_init +# define _tr_stored_block z__tr_stored_block +# define _tr_tally z__tr_tally +# define adler32 z_adler32 +# define adler32_combine z_adler32_combine +# define adler32_combine64 z_adler32_combine64 +# ifndef Z_SOLO +# define compress z_compress +# define compress2 z_compress2 +# define compressBound z_compressBound +# endif +# define crc32 z_crc32 +# define crc32_combine z_crc32_combine +# define crc32_combine64 z_crc32_combine64 +# define deflate z_deflate +# define deflateBound z_deflateBound +# define deflateCopy z_deflateCopy +# define deflateEnd z_deflateEnd +# define deflateInit2_ z_deflateInit2_ +# define deflateInit_ z_deflateInit_ +# define deflateParams z_deflateParams +# define deflatePending z_deflatePending +# define deflatePrime z_deflatePrime +# define deflateReset z_deflateReset +# define deflateResetKeep z_deflateResetKeep +# define deflateSetDictionary z_deflateSetDictionary +# define deflateSetHeader z_deflateSetHeader +# define deflateTune z_deflateTune +# define deflate_copyright z_deflate_copyright +# define get_crc_table z_get_crc_table +# ifndef Z_SOLO +# define gz_error z_gz_error +# define gz_intmax z_gz_intmax +# define gz_strwinerror z_gz_strwinerror +# define gzbuffer z_gzbuffer +# define gzclearerr z_gzclearerr +# define gzclose z_gzclose +# define gzclose_r z_gzclose_r +# define gzclose_w z_gzclose_w +# define gzdirect z_gzdirect +# define gzdopen z_gzdopen +# define gzeof z_gzeof +# define gzerror z_gzerror +# define gzflush z_gzflush +# define gzgetc z_gzgetc +# define gzgetc_ z_gzgetc_ +# define gzgets z_gzgets +# define gzoffset z_gzoffset +# define gzoffset64 z_gzoffset64 +# define gzopen z_gzopen +# define gzopen64 z_gzopen64 +# ifdef _WIN32 +# define gzopen_w z_gzopen_w +# endif +# define gzprintf z_gzprintf +# define gzvprintf z_gzvprintf +# define gzputc z_gzputc +# define gzputs z_gzputs +# define gzread z_gzread +# define gzrewind z_gzrewind +# define gzseek z_gzseek +# define gzseek64 z_gzseek64 +# define gzsetparams z_gzsetparams +# define gztell z_gztell +# define gztell64 z_gztell64 +# define gzungetc z_gzungetc +# define gzwrite z_gzwrite +# endif +# define inflate z_inflate +# define inflateBack z_inflateBack +# define inflateBackEnd z_inflateBackEnd +# define inflateBackInit_ z_inflateBackInit_ +# define inflateCopy z_inflateCopy +# define inflateEnd z_inflateEnd +# define inflateGetHeader z_inflateGetHeader +# define inflateInit2_ z_inflateInit2_ +# define inflateInit_ z_inflateInit_ +# define inflateMark z_inflateMark +# define inflatePrime z_inflatePrime +# define inflateReset z_inflateReset +# define inflateReset2 z_inflateReset2 +# define inflateSetDictionary z_inflateSetDictionary +# define inflateGetDictionary z_inflateGetDictionary +# define inflateSync z_inflateSync +# define inflateSyncPoint z_inflateSyncPoint +# define inflateUndermine z_inflateUndermine +# define inflateResetKeep z_inflateResetKeep +# define inflate_copyright z_inflate_copyright +# define inflate_fast z_inflate_fast +# define inflate_table z_inflate_table +# ifndef Z_SOLO +# define uncompress z_uncompress +# endif +# define zError z_zError +# ifndef Z_SOLO +# define zcalloc z_zcalloc +# define zcfree z_zcfree +# endif +# define zlibCompileFlags z_zlibCompileFlags +# define zlibVersion z_zlibVersion + +/* all zlib typedefs in zlib.h and zconf.h */ +# define Byte z_Byte +# define Bytef z_Bytef +# define alloc_func z_alloc_func +# define charf z_charf +# define free_func z_free_func +# ifndef Z_SOLO +# define gzFile z_gzFile +# endif +# define gz_header z_gz_header +# define gz_headerp z_gz_headerp +# define in_func z_in_func +# define intf z_intf +# define out_func z_out_func +# define uInt z_uInt +# define uIntf z_uIntf +# define uLong z_uLong +# define uLongf z_uLongf +# define voidp z_voidp +# define voidpc z_voidpc +# define voidpf z_voidpf + +/* all zlib structs in zlib.h and zconf.h */ +# define gz_header_s z_gz_header_s +# define internal_state z_internal_state + +#endif + +#if defined(__MSDOS__) && !defined(MSDOS) +# define MSDOS +#endif +#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) +# define OS2 +#endif +#if defined(_WINDOWS) && !defined(WINDOWS) +# define WINDOWS +#endif +#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__) +# ifndef WIN32 +# define WIN32 +# endif +#endif +#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) +# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) +# ifndef SYS16BIT +# define SYS16BIT +# endif +# endif +#endif + +/* + * Compile with -DMAXSEG_64K if the alloc function cannot allocate more + * than 64k bytes at a time (needed on systems with 16-bit int). + */ +#ifdef SYS16BIT +# define MAXSEG_64K +#endif +#ifdef MSDOS +# define UNALIGNED_OK +#endif + +#ifdef __STDC_VERSION__ +# ifndef STDC +# define STDC +# endif +# if __STDC_VERSION__ >= 199901L +# ifndef STDC99 +# define STDC99 +# endif +# endif +#endif +#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) +# define STDC +#endif +#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) +# define STDC +#endif +#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) +# define STDC +#endif +#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) +# define STDC +#endif + +#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ +# define STDC +#endif + +#ifndef STDC +# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ +# define const /* note: need a more gentle solution here */ +# endif +#endif + +#if defined(ZLIB_CONST) && !defined(z_const) +# define z_const const +#else +# define z_const +#endif + +/* Some Mac compilers merge all .h files incorrectly: */ +#if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__) +# define NO_DUMMY_DECL +#endif + +/* Maximum value for memLevel in deflateInit2 */ +#ifndef MAX_MEM_LEVEL +# ifdef MAXSEG_64K +# define MAX_MEM_LEVEL 8 +# else +# define MAX_MEM_LEVEL 9 +# endif +#endif + +/* Maximum value for windowBits in deflateInit2 and inflateInit2. + * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files + * created by gzip. (Files created by minigzip can still be extracted by + * gzip.) + */ +#ifndef MAX_WBITS +# define MAX_WBITS 15 /* 32K LZ77 window */ +#endif + +/* The memory requirements for deflate are (in bytes): + (1 << (windowBits+2)) + (1 << (memLevel+9)) + that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) + plus a few kilobytes for small objects. For example, if you want to reduce + the default memory requirements from 256K to 128K, compile with + make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" + Of course this will generally degrade compression (there's no free lunch). + + The memory requirements for inflate are (in bytes) 1 << windowBits + that is, 32K for windowBits=15 (default value) plus a few kilobytes + for small objects. +*/ + + /* Type declarations */ + +#ifndef OF /* function prototypes */ +# ifdef STDC +# define OF(args) args +# else +# define OF(args) () +# endif +#endif + +#ifndef Z_ARG /* function prototypes for stdarg */ +# if defined(STDC) || defined(Z_HAVE_STDARG_H) +# define Z_ARG(args) args +# else +# define Z_ARG(args) () +# endif +#endif + +/* The following definitions for FAR are needed only for MSDOS mixed + * model programming (small or medium model with some far allocations). + * This was tested only with MSC; for other MSDOS compilers you may have + * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, + * just define FAR to be empty. + */ +#ifdef SYS16BIT +# if defined(M_I86SM) || defined(M_I86MM) + /* MSC small or medium model */ +# define SMALL_MEDIUM +# ifdef _MSC_VER +# define FAR _far +# else +# define FAR far +# endif +# endif +# if (defined(__SMALL__) || defined(__MEDIUM__)) + /* Turbo C small or medium model */ +# define SMALL_MEDIUM +# ifdef __BORLANDC__ +# define FAR _far +# else +# define FAR far +# endif +# endif +#endif + +#if defined(WINDOWS) || defined(WIN32) + /* If building or using zlib as a DLL, define ZLIB_DLL. + * This is not mandatory, but it offers a little performance increase. + */ +# ifdef ZLIB_DLL +# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) +# ifdef ZLIB_INTERNAL +# define ZEXTERN extern __declspec(dllexport) +# else +# define ZEXTERN extern __declspec(dllimport) +# endif +# endif +# endif /* ZLIB_DLL */ + /* If building or using zlib with the WINAPI/WINAPIV calling convention, + * define ZLIB_WINAPI. + * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. + */ +# ifdef ZLIB_WINAPI +# ifdef FAR +# undef FAR +# endif +# include + /* No need for _export, use ZLIB.DEF instead. */ + /* For complete Windows compatibility, use WINAPI, not __stdcall. */ +# define ZEXPORT WINAPI +# ifdef WIN32 +# define ZEXPORTVA WINAPIV +# else +# define ZEXPORTVA FAR CDECL +# endif +# endif +#endif + +#if defined (__BEOS__) +# ifdef ZLIB_DLL +# ifdef ZLIB_INTERNAL +# define ZEXPORT __declspec(dllexport) +# define ZEXPORTVA __declspec(dllexport) +# else +# define ZEXPORT __declspec(dllimport) +# define ZEXPORTVA __declspec(dllimport) +# endif +# endif +#endif + +#ifndef ZEXTERN +# define ZEXTERN extern +#endif +#ifndef ZEXPORT +# define ZEXPORT +#endif +#ifndef ZEXPORTVA +# define ZEXPORTVA +#endif + +#ifndef FAR +# define FAR +#endif + +#if !defined(__MACTYPES__) +typedef unsigned char Byte; /* 8 bits */ +#endif +typedef unsigned int uInt; /* 16 bits or more */ +typedef unsigned long uLong; /* 32 bits or more */ + +#ifdef SMALL_MEDIUM + /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ +# define Bytef Byte FAR +#else + typedef Byte FAR Bytef; +#endif +typedef char FAR charf; +typedef int FAR intf; +typedef uInt FAR uIntf; +typedef uLong FAR uLongf; + +#ifdef STDC + typedef void const *voidpc; + typedef void FAR *voidpf; + typedef void *voidp; +#else + typedef Byte const *voidpc; + typedef Byte FAR *voidpf; + typedef Byte *voidp; +#endif + +#if !defined(Z_U4) && !defined(Z_SOLO) && defined(STDC) +# include +# if (UINT_MAX == 0xffffffffUL) +# define Z_U4 unsigned +# elif (ULONG_MAX == 0xffffffffUL) +# define Z_U4 unsigned long +# elif (USHRT_MAX == 0xffffffffUL) +# define Z_U4 unsigned short +# endif +#endif + +#ifdef Z_U4 + typedef Z_U4 z_crc_t; +#else + typedef unsigned long z_crc_t; +#endif + +#ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */ +# define Z_HAVE_UNISTD_H +#endif + +#ifdef HAVE_STDARG_H /* may be set to #if 1 by ./configure */ +# define Z_HAVE_STDARG_H +#endif + +#ifdef STDC +# ifndef Z_SOLO +//# include /* for off_t */ +# endif +#endif + +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +# ifndef Z_SOLO +# include /* for va_list */ +# endif +#endif + +#ifdef _WIN32 +# ifndef Z_SOLO +# include /* for wchar_t */ +# endif +#endif + +/* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and + * "#define _LARGEFILE64_SOURCE 1" as requesting 64-bit operations, (even + * though the former does not conform to the LFS document), but considering + * both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as + * equivalently requesting no 64-bit operations + */ +#if defined(_LARGEFILE64_SOURCE) && -_LARGEFILE64_SOURCE - -1 == 1 +# undef _LARGEFILE64_SOURCE +#endif + +#if defined(__WATCOMC__) && !defined(Z_HAVE_UNISTD_H) +# define Z_HAVE_UNISTD_H +#endif +#ifndef Z_SOLO +# if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE) +# include /* for SEEK_*, off_t, and _LFS64_LARGEFILE */ +# ifdef VMS +# include /* for off_t */ +# endif +# ifndef z_off_t +# define z_off_t off_t +# endif +# endif +#endif + +#if defined(_LFS64_LARGEFILE) && _LFS64_LARGEFILE-0 +# define Z_LFS64 +#endif + +#if defined(_LARGEFILE64_SOURCE) && defined(Z_LFS64) +# define Z_LARGE64 +#endif + +#if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS-0 == 64 && defined(Z_LFS64) +# define Z_WANT64 +#endif + +#if !defined(SEEK_SET) && !defined(Z_SOLO) +# define SEEK_SET 0 /* Seek from beginning of file. */ +# define SEEK_CUR 1 /* Seek from current position. */ +# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ +#endif + +#ifndef z_off_t +# define z_off_t long +#endif + +#if !defined(_WIN32) && defined(Z_LARGE64) +# define z_off64_t off64_t +#else +# if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO) +# define z_off64_t __int64 +# else +# define z_off64_t z_off_t +# endif +#endif + +/* MVS linker does not support external names larger than 8 bytes */ +#if defined(__MVS__) + #pragma map(deflateInit_,"DEIN") + #pragma map(deflateInit2_,"DEIN2") + #pragma map(deflateEnd,"DEEND") + #pragma map(deflateBound,"DEBND") + #pragma map(inflateInit_,"ININ") + #pragma map(inflateInit2_,"ININ2") + #pragma map(inflateEnd,"INEND") + #pragma map(inflateSync,"INSY") + #pragma map(inflateSetDictionary,"INSEDI") + #pragma map(compressBound,"CMBND") + #pragma map(inflate_table,"INTABL") + #pragma map(inflate_fast,"INFA") + #pragma map(inflate_copyright,"INCOPY") +#endif + +#endif /* ZCONF_H */ diff --git a/Minecraft.Client/PSVita/PSVitaExtras/zlib.h b/Minecraft.Client/PSVita/PSVitaExtras/zlib.h new file mode 100644 index 00000000..3e0c7672 --- /dev/null +++ b/Minecraft.Client/PSVita/PSVitaExtras/zlib.h @@ -0,0 +1,1768 @@ +/* zlib.h -- interface of the 'zlib' general purpose compression library + version 1.2.8, April 28th, 2013 + + Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu + + + The data format used by the zlib library is described by RFCs (Request for + Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950 + (zlib format), rfc1951 (deflate format) and rfc1952 (gzip format). +*/ + +#ifndef ZLIB_H +#define ZLIB_H + +#include "zconf.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define ZLIB_VERSION "1.2.8" +#define ZLIB_VERNUM 0x1280 +#define ZLIB_VER_MAJOR 1 +#define ZLIB_VER_MINOR 2 +#define ZLIB_VER_REVISION 8 +#define ZLIB_VER_SUBREVISION 0 + +/* + The 'zlib' compression library provides in-memory compression and + decompression functions, including integrity checks of the uncompressed data. + This version of the library supports only one compression method (deflation) + but other algorithms will be added later and will have the same stream + interface. + + Compression can be done in a single step if the buffers are large enough, + or can be done by repeated calls of the compression function. In the latter + case, the application must provide more input and/or consume the output + (providing more output space) before each call. + + The compressed data format used by default by the in-memory functions is + the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped + around a deflate stream, which is itself documented in RFC 1951. + + The library also supports reading and writing files in gzip (.gz) format + with an interface similar to that of stdio using the functions that start + with "gz". The gzip format is different from the zlib format. gzip is a + gzip wrapper, documented in RFC 1952, wrapped around a deflate stream. + + This library can optionally read and write gzip streams in memory as well. + + The zlib format was designed to be compact and fast for use in memory + and on communications channels. The gzip format was designed for single- + file compression on file systems, has a larger header than zlib to maintain + directory information, and uses a different, slower check method than zlib. + + The library does not install any signal handler. The decoder checks + the consistency of the compressed data, so the library should never crash + even in case of corrupted input. +*/ + +typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); +typedef void (*free_func) OF((voidpf opaque, voidpf address)); + +struct internal_state; + +typedef struct z_stream_s { + z_const Bytef *next_in; /* next input byte */ + uInt avail_in; /* number of bytes available at next_in */ + uLong total_in; /* total number of input bytes read so far */ + + Bytef *next_out; /* next output byte should be put there */ + uInt avail_out; /* remaining free space at next_out */ + uLong total_out; /* total number of bytes output so far */ + + z_const char *msg; /* last error message, NULL if no error */ + struct internal_state FAR *state; /* not visible by applications */ + + alloc_func zalloc; /* used to allocate the internal state */ + free_func zfree; /* used to free the internal state */ + voidpf opaque; /* private data object passed to zalloc and zfree */ + + int data_type; /* best guess about the data type: binary or text */ + uLong adler; /* adler32 value of the uncompressed data */ + uLong reserved; /* reserved for future use */ +} z_stream; + +typedef z_stream FAR *z_streamp; + +/* + gzip header information passed to and from zlib routines. See RFC 1952 + for more details on the meanings of these fields. +*/ +typedef struct gz_header_s { + int text; /* true if compressed data believed to be text */ + uLong time; /* modification time */ + int xflags; /* extra flags (not used when writing a gzip file) */ + int os; /* operating system */ + Bytef *extra; /* pointer to extra field or Z_NULL if none */ + uInt extra_len; /* extra field length (valid if extra != Z_NULL) */ + uInt extra_max; /* space at extra (only when reading header) */ + Bytef *name; /* pointer to zero-terminated file name or Z_NULL */ + uInt name_max; /* space at name (only when reading header) */ + Bytef *comment; /* pointer to zero-terminated comment or Z_NULL */ + uInt comm_max; /* space at comment (only when reading header) */ + int hcrc; /* true if there was or will be a header crc */ + int done; /* true when done reading gzip header (not used + when writing a gzip file) */ +} gz_header; + +typedef gz_header FAR *gz_headerp; + +/* + The application must update next_in and avail_in when avail_in has dropped + to zero. It must update next_out and avail_out when avail_out has dropped + to zero. The application must initialize zalloc, zfree and opaque before + calling the init function. All other fields are set by the compression + library and must not be updated by the application. + + The opaque value provided by the application will be passed as the first + parameter for calls of zalloc and zfree. This can be useful for custom + memory management. The compression library attaches no meaning to the + opaque value. + + zalloc must return Z_NULL if there is not enough memory for the object. + If zlib is used in a multi-threaded application, zalloc and zfree must be + thread safe. + + On 16-bit systems, the functions zalloc and zfree must be able to allocate + exactly 65536 bytes, but will not be required to allocate more than this if + the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, pointers + returned by zalloc for objects of exactly 65536 bytes *must* have their + offset normalized to zero. The default allocation function provided by this + library ensures this (see zutil.c). To reduce memory requirements and avoid + any allocation of 64K objects, at the expense of compression ratio, compile + the library with -DMAX_WBITS=14 (see zconf.h). + + The fields total_in and total_out can be used for statistics or progress + reports. After compression, total_in holds the total size of the + uncompressed data and may be saved for use in the decompressor (particularly + if the decompressor wants to decompress everything in a single step). +*/ + + /* constants */ + +#define Z_NO_FLUSH 0 +#define Z_PARTIAL_FLUSH 1 +#define Z_SYNC_FLUSH 2 +#define Z_FULL_FLUSH 3 +#define Z_FINISH 4 +#define Z_BLOCK 5 +#define Z_TREES 6 +/* Allowed flush values; see deflate() and inflate() below for details */ + +#define Z_OK 0 +#define Z_STREAM_END 1 +#define Z_NEED_DICT 2 +#define Z_ERRNO (-1) +#define Z_STREAM_ERROR (-2) +#define Z_DATA_ERROR (-3) +#define Z_MEM_ERROR (-4) +#define Z_BUF_ERROR (-5) +#define Z_VERSION_ERROR (-6) +/* Return codes for the compression/decompression functions. Negative values + * are errors, positive values are used for special but normal events. + */ + +#define Z_NO_COMPRESSION 0 +#define Z_BEST_SPEED 1 +#define Z_BEST_COMPRESSION 9 +#define Z_DEFAULT_COMPRESSION (-1) +/* compression levels */ + +#define Z_FILTERED 1 +#define Z_HUFFMAN_ONLY 2 +#define Z_RLE 3 +#define Z_FIXED 4 +#define Z_DEFAULT_STRATEGY 0 +/* compression strategy; see deflateInit2() below for details */ + +#define Z_BINARY 0 +#define Z_TEXT 1 +#define Z_ASCII Z_TEXT /* for compatibility with 1.2.2 and earlier */ +#define Z_UNKNOWN 2 +/* Possible values of the data_type field (though see inflate()) */ + +#define Z_DEFLATED 8 +/* The deflate compression method (the only one supported in this version) */ + +#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ + +#define zlib_version zlibVersion() +/* for compatibility with versions < 1.0.2 */ + + + /* basic functions */ + +ZEXTERN const char * ZEXPORT zlibVersion OF((void)); +/* The application can compare zlibVersion and ZLIB_VERSION for consistency. + If the first character differs, the library code actually used is not + compatible with the zlib.h header file used by the application. This check + is automatically made by deflateInit and inflateInit. + */ + +/* +ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); + + Initializes the internal stream state for compression. The fields + zalloc, zfree and opaque must be initialized before by the caller. If + zalloc and zfree are set to Z_NULL, deflateInit updates them to use default + allocation functions. + + The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: + 1 gives best speed, 9 gives best compression, 0 gives no compression at all + (the input data is simply copied a block at a time). Z_DEFAULT_COMPRESSION + requests a default compromise between speed and compression (currently + equivalent to level 6). + + deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if level is not a valid compression level, or + Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible + with the version assumed by the caller (ZLIB_VERSION). msg is set to null + if there is no error message. deflateInit does not perform any compression: + this will be done by deflate(). +*/ + + +ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); +/* + deflate compresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may introduce + some output latency (reading input without producing any output) except when + forced to flush. + + The detailed semantics are as follows. deflate performs one or both of the + following actions: + + - Compress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in and avail_in are updated and + processing will resume at this point for the next call of deflate(). + + - Provide more output starting at next_out and update next_out and avail_out + accordingly. This action is forced if the parameter flush is non zero. + Forcing flush frequently degrades the compression ratio, so this parameter + should be set only when necessary (in interactive applications). Some + output may be provided even if flush is not set. + + Before the call of deflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming more + output, and updating avail_in or avail_out accordingly; avail_out should + never be zero before the call. The application can consume the compressed + output when it wants, for example when the output buffer is full (avail_out + == 0), or after each call of deflate(). If deflate returns Z_OK and with + zero avail_out, it must be called again after making room in the output + buffer because there might be more output pending. + + Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to + decide how much data to accumulate before producing output, in order to + maximize compression. + + If the parameter flush is set to Z_SYNC_FLUSH, all pending output is + flushed to the output buffer and the output is aligned on a byte boundary, so + that the decompressor can get all input data available so far. (In + particular avail_in is zero after the call if enough output space has been + provided before the call.) Flushing may degrade compression for some + compression algorithms and so it should be used only when necessary. This + completes the current deflate block and follows it with an empty stored block + that is three bits plus filler bits to the next byte, followed by four bytes + (00 00 ff ff). + + If flush is set to Z_PARTIAL_FLUSH, all pending output is flushed to the + output buffer, but the output is not aligned to a byte boundary. All of the + input data so far will be available to the decompressor, as for Z_SYNC_FLUSH. + This completes the current deflate block and follows it with an empty fixed + codes block that is 10 bits long. This assures that enough bytes are output + in order for the decompressor to finish the block before the empty fixed code + block. + + If flush is set to Z_BLOCK, a deflate block is completed and emitted, as + for Z_SYNC_FLUSH, but the output is not aligned on a byte boundary, and up to + seven bits of the current block are held to be written as the next byte after + the next deflate block is completed. In this case, the decompressor may not + be provided enough bits at this point in order to complete decompression of + the data provided so far to the compressor. It may need to wait for the next + block to be emitted. This is for advanced applications that need to control + the emission of deflate blocks. + + If flush is set to Z_FULL_FLUSH, all output is flushed as with + Z_SYNC_FLUSH, and the compression state is reset so that decompression can + restart from this point if previous compressed data has been damaged or if + random access is desired. Using Z_FULL_FLUSH too often can seriously degrade + compression. + + If deflate returns with avail_out == 0, this function must be called again + with the same value of the flush parameter and more output space (updated + avail_out), until the flush is complete (deflate returns with non-zero + avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that + avail_out is greater than six to avoid repeated flush markers due to + avail_out == 0 on return. + + If the parameter flush is set to Z_FINISH, pending input is processed, + pending output is flushed and deflate returns with Z_STREAM_END if there was + enough output space; if deflate returns with Z_OK, this function must be + called again with Z_FINISH and more output space (updated avail_out) but no + more input data, until it returns with Z_STREAM_END or an error. After + deflate has returned Z_STREAM_END, the only possible operations on the stream + are deflateReset or deflateEnd. + + Z_FINISH can be used immediately after deflateInit if all the compression + is to be done in a single step. In this case, avail_out must be at least the + value returned by deflateBound (see below). Then deflate is guaranteed to + return Z_STREAM_END. If not enough output space is provided, deflate will + not return Z_STREAM_END, and it must be called again as described above. + + deflate() sets strm->adler to the adler32 checksum of all input read + so far (that is, total_in bytes). + + deflate() may update strm->data_type if it can make a good guess about + the input data type (Z_BINARY or Z_TEXT). In doubt, the data is considered + binary. This field is only for information purposes and does not affect the + compression algorithm in any manner. + + deflate() returns Z_OK if some progress has been made (more input + processed or more output produced), Z_STREAM_END if all input has been + consumed and all output has been produced (only when flush is set to + Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example + if next_in or next_out was Z_NULL), Z_BUF_ERROR if no progress is possible + (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not + fatal, and deflate() can be called again with more input and more output + space to continue compressing. +*/ + + +ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any pending + output. + + deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the + stream state was inconsistent, Z_DATA_ERROR if the stream was freed + prematurely (some input or output was discarded). In the error case, msg + may be set but then points to a static string (which must not be + deallocated). +*/ + + +/* +ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); + + Initializes the internal stream state for decompression. The fields + next_in, avail_in, zalloc, zfree and opaque must be initialized before by + the caller. If next_in is not Z_NULL and avail_in is large enough (the + exact value depends on the compression method), inflateInit determines the + compression method from the zlib header and allocates all data structures + accordingly; otherwise the allocation will be deferred to the first call of + inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to + use default allocation functions. + + inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_VERSION_ERROR if the zlib library version is incompatible with the + version assumed by the caller, or Z_STREAM_ERROR if the parameters are + invalid, such as a null pointer to the structure. msg is set to null if + there is no error message. inflateInit does not perform any decompression + apart from possibly reading the zlib header if present: actual decompression + will be done by inflate(). (So next_in and avail_in may be modified, but + next_out and avail_out are unused and unchanged.) The current implementation + of inflateInit() does not process any header information -- that is deferred + until inflate() is called. +*/ + + +ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); +/* + inflate decompresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may introduce + some output latency (reading input without producing any output) except when + forced to flush. + + The detailed semantics are as follows. inflate performs one or both of the + following actions: + + - Decompress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in is updated and processing will + resume at this point for the next call of inflate(). + + - Provide more output starting at next_out and update next_out and avail_out + accordingly. inflate() provides as much output as possible, until there is + no more input data or no more space in the output buffer (see below about + the flush parameter). + + Before the call of inflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming more + output, and updating the next_* and avail_* values accordingly. The + application can consume the uncompressed output when it wants, for example + when the output buffer is full (avail_out == 0), or after each call of + inflate(). If inflate returns Z_OK and with zero avail_out, it must be + called again after making room in the output buffer because there might be + more output pending. + + The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, Z_FINISH, + Z_BLOCK, or Z_TREES. Z_SYNC_FLUSH requests that inflate() flush as much + output as possible to the output buffer. Z_BLOCK requests that inflate() + stop if and when it gets to the next deflate block boundary. When decoding + the zlib or gzip format, this will cause inflate() to return immediately + after the header and before the first block. When doing a raw inflate, + inflate() will go ahead and process the first block, and will return when it + gets to the end of that block, or when it runs out of data. + + The Z_BLOCK option assists in appending to or combining deflate streams. + Also to assist in this, on return inflate() will set strm->data_type to the + number of unused bits in the last byte taken from strm->next_in, plus 64 if + inflate() is currently decoding the last block in the deflate stream, plus + 128 if inflate() returned immediately after decoding an end-of-block code or + decoding the complete header up to just before the first byte of the deflate + stream. The end-of-block will not be indicated until all of the uncompressed + data from that block has been written to strm->next_out. The number of + unused bits may in general be greater than seven, except when bit 7 of + data_type is set, in which case the number of unused bits will be less than + eight. data_type is set as noted here every time inflate() returns for all + flush options, and so can be used to determine the amount of currently + consumed input in bits. + + The Z_TREES option behaves as Z_BLOCK does, but it also returns when the + end of each deflate block header is reached, before any actual data in that + block is decoded. This allows the caller to determine the length of the + deflate block header for later use in random access within a deflate block. + 256 is added to the value of strm->data_type when inflate() returns + immediately after reaching the end of the deflate block header. + + inflate() should normally be called until it returns Z_STREAM_END or an + error. However if all decompression is to be performed in a single step (a + single call of inflate), the parameter flush should be set to Z_FINISH. In + this case all pending input is processed and all pending output is flushed; + avail_out must be large enough to hold all of the uncompressed data for the + operation to complete. (The size of the uncompressed data may have been + saved by the compressor for this purpose.) The use of Z_FINISH is not + required to perform an inflation in one step. However it may be used to + inform inflate that a faster approach can be used for the single inflate() + call. Z_FINISH also informs inflate to not maintain a sliding window if the + stream completes, which reduces inflate's memory footprint. If the stream + does not complete, either because not all of the stream is provided or not + enough output space is provided, then a sliding window will be allocated and + inflate() can be called again to continue the operation as if Z_NO_FLUSH had + been used. + + In this implementation, inflate() always flushes as much output as + possible to the output buffer, and always uses the faster approach on the + first call. So the effects of the flush parameter in this implementation are + on the return value of inflate() as noted below, when inflate() returns early + when Z_BLOCK or Z_TREES is used, and when inflate() avoids the allocation of + memory for a sliding window when Z_FINISH is used. + + If a preset dictionary is needed after this call (see inflateSetDictionary + below), inflate sets strm->adler to the Adler-32 checksum of the dictionary + chosen by the compressor and returns Z_NEED_DICT; otherwise it sets + strm->adler to the Adler-32 checksum of all output produced so far (that is, + total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described + below. At the end of the stream, inflate() checks that its computed adler32 + checksum is equal to that saved by the compressor and returns Z_STREAM_END + only if the checksum is correct. + + inflate() can decompress and check either zlib-wrapped or gzip-wrapped + deflate data. The header type is detected automatically, if requested when + initializing with inflateInit2(). Any information contained in the gzip + header is not retained, so applications that need that information should + instead use raw inflate, see inflateInit2() below, or inflateBack() and + perform their own processing of the gzip header and trailer. When processing + gzip-wrapped deflate data, strm->adler32 is set to the CRC-32 of the output + producted so far. The CRC-32 is checked against the gzip trailer. + + inflate() returns Z_OK if some progress has been made (more input processed + or more output produced), Z_STREAM_END if the end of the compressed data has + been reached and all uncompressed output has been produced, Z_NEED_DICT if a + preset dictionary is needed at this point, Z_DATA_ERROR if the input data was + corrupted (input stream not conforming to the zlib format or incorrect check + value), Z_STREAM_ERROR if the stream structure was inconsistent (for example + next_in or next_out was Z_NULL), Z_MEM_ERROR if there was not enough memory, + Z_BUF_ERROR if no progress is possible or if there was not enough room in the + output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and + inflate() can be called again with more input and more output space to + continue decompressing. If Z_DATA_ERROR is returned, the application may + then call inflateSync() to look for a good compression block if a partial + recovery of the data is desired. +*/ + + +ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any pending + output. + + inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state + was inconsistent. In the error case, msg may be set but then points to a + static string (which must not be deallocated). +*/ + + + /* Advanced functions */ + +/* + The following functions are needed only in some special applications. +*/ + +/* +ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, + int level, + int method, + int windowBits, + int memLevel, + int strategy)); + + This is another version of deflateInit with more compression options. The + fields next_in, zalloc, zfree and opaque must be initialized before by the + caller. + + The method parameter is the compression method. It must be Z_DEFLATED in + this version of the library. + + The windowBits parameter is the base two logarithm of the window size + (the size of the history buffer). It should be in the range 8..15 for this + version of the library. Larger values of this parameter result in better + compression at the expense of memory usage. The default value is 15 if + deflateInit is used instead. + + windowBits can also be -8..-15 for raw deflate. In this case, -windowBits + determines the window size. deflate() will then generate raw deflate data + with no zlib header or trailer, and will not compute an adler32 check value. + + windowBits can also be greater than 15 for optional gzip encoding. Add + 16 to windowBits to write a simple gzip header and trailer around the + compressed data instead of a zlib wrapper. The gzip header will have no + file name, no extra data, no comment, no modification time (set to zero), no + header crc, and the operating system will be set to 255 (unknown). If a + gzip stream is being written, strm->adler is a crc32 instead of an adler32. + + The memLevel parameter specifies how much memory should be allocated + for the internal compression state. memLevel=1 uses minimum memory but is + slow and reduces compression ratio; memLevel=9 uses maximum memory for + optimal speed. The default value is 8. See zconf.h for total memory usage + as a function of windowBits and memLevel. + + The strategy parameter is used to tune the compression algorithm. Use the + value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a + filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no + string match), or Z_RLE to limit match distances to one (run-length + encoding). Filtered data consists mostly of small values with a somewhat + random distribution. In this case, the compression algorithm is tuned to + compress them better. The effect of Z_FILTERED is to force more Huffman + coding and less string matching; it is somewhat intermediate between + Z_DEFAULT_STRATEGY and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as + fast as Z_HUFFMAN_ONLY, but give better compression for PNG image data. The + strategy parameter only affects the compression ratio but not the + correctness of the compressed output even if it is not set appropriately. + Z_FIXED prevents the use of dynamic Huffman codes, allowing for a simpler + decoder for special applications. + + deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if any parameter is invalid (such as an invalid + method), or Z_VERSION_ERROR if the zlib library version (zlib_version) is + incompatible with the version assumed by the caller (ZLIB_VERSION). msg is + set to null if there is no error message. deflateInit2 does not perform any + compression: this will be done by deflate(). +*/ + +ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, + const Bytef *dictionary, + uInt dictLength)); +/* + Initializes the compression dictionary from the given byte sequence + without producing any compressed output. When using the zlib format, this + function must be called immediately after deflateInit, deflateInit2 or + deflateReset, and before any call of deflate. When doing raw deflate, this + function must be called either before any call of deflate, or immediately + after the completion of a deflate block, i.e. after all input has been + consumed and all output has been delivered when using any of the flush + options Z_BLOCK, Z_PARTIAL_FLUSH, Z_SYNC_FLUSH, or Z_FULL_FLUSH. The + compressor and decompressor must use exactly the same dictionary (see + inflateSetDictionary). + + The dictionary should consist of strings (byte sequences) that are likely + to be encountered later in the data to be compressed, with the most commonly + used strings preferably put towards the end of the dictionary. Using a + dictionary is most useful when the data to be compressed is short and can be + predicted with good accuracy; the data can then be compressed better than + with the default empty dictionary. + + Depending on the size of the compression data structures selected by + deflateInit or deflateInit2, a part of the dictionary may in effect be + discarded, for example if the dictionary is larger than the window size + provided in deflateInit or deflateInit2. Thus the strings most likely to be + useful should be put at the end of the dictionary, not at the front. In + addition, the current implementation of deflate will use at most the window + size minus 262 bytes of the provided dictionary. + + Upon return of this function, strm->adler is set to the adler32 value + of the dictionary; the decompressor may later use this value to determine + which dictionary has been used by the compressor. (The adler32 value + applies to the whole dictionary even if only a subset of the dictionary is + actually used by the compressor.) If a raw deflate was requested, then the + adler32 value is not computed and strm->adler is not set. + + deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a + parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is + inconsistent (for example if deflate has already been called for this stream + or if not at a block boundary for raw deflate). deflateSetDictionary does + not perform any compression: this will be done by deflate(). +*/ + +ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, + z_streamp source)); +/* + Sets the destination stream as a complete copy of the source stream. + + This function can be useful when several compression strategies will be + tried, for example when there are several ways of pre-processing the input + data with a filter. The streams that will be discarded should then be freed + by calling deflateEnd. Note that deflateCopy duplicates the internal + compression state which can be quite large, so this strategy is slow and can + consume lots of memory. + + deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being Z_NULL). msg is left unchanged in both source and + destination. +*/ + +ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); +/* + This function is equivalent to deflateEnd followed by deflateInit, + but does not free and reallocate all the internal compression state. The + stream will keep the same compression level and any other attributes that + may have been set by deflateInit2. + + deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being Z_NULL). +*/ + +ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, + int level, + int strategy)); +/* + Dynamically update the compression level and compression strategy. The + interpretation of level and strategy is as in deflateInit2. This can be + used to switch between compression and straight copy of the input data, or + to switch to a different kind of input data requiring a different strategy. + If the compression level is changed, the input available so far is + compressed with the old level (and may be flushed); the new level will take + effect only at the next call of deflate(). + + Before the call of deflateParams, the stream state must be set as for + a call of deflate(), since the currently available input may have to be + compressed and flushed. In particular, strm->avail_out must be non-zero. + + deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source + stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR if + strm->avail_out was zero. +*/ + +ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm, + int good_length, + int max_lazy, + int nice_length, + int max_chain)); +/* + Fine tune deflate's internal compression parameters. This should only be + used by someone who understands the algorithm used by zlib's deflate for + searching for the best matching string, and even then only by the most + fanatic optimizer trying to squeeze out the last compressed bit for their + specific input data. Read the deflate.c source code for the meaning of the + max_lazy, good_length, nice_length, and max_chain parameters. + + deflateTune() can be called after deflateInit() or deflateInit2(), and + returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream. + */ + +ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, + uLong sourceLen)); +/* + deflateBound() returns an upper bound on the compressed size after + deflation of sourceLen bytes. It must be called after deflateInit() or + deflateInit2(), and after deflateSetHeader(), if used. This would be used + to allocate an output buffer for deflation in a single pass, and so would be + called before deflate(). If that first deflate() call is provided the + sourceLen input bytes, an output buffer allocated to the size returned by + deflateBound(), and the flush value Z_FINISH, then deflate() is guaranteed + to return Z_STREAM_END. Note that it is possible for the compressed size to + be larger than the value returned by deflateBound() if flush options other + than Z_FINISH or Z_NO_FLUSH are used. +*/ + +ZEXTERN int ZEXPORT deflatePending OF((z_streamp strm, + unsigned *pending, + int *bits)); +/* + deflatePending() returns the number of bytes and bits of output that have + been generated, but not yet provided in the available output. The bytes not + provided would be due to the available output space having being consumed. + The number of bits of output not provided are between 0 and 7, where they + await more bits to join them in order to fill out a full byte. If pending + or bits are Z_NULL, then those values are not set. + + deflatePending returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. + */ + +ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, + int bits, + int value)); +/* + deflatePrime() inserts bits in the deflate output stream. The intent + is that this function is used to start off the deflate output with the bits + leftover from a previous deflate stream when appending to it. As such, this + function can only be used for raw deflate, and must be used before the first + deflate() call after a deflateInit2() or deflateReset(). bits must be less + than or equal to 16, and that many of the least significant bits of value + will be inserted in the output. + + deflatePrime returns Z_OK if success, Z_BUF_ERROR if there was not enough + room in the internal buffer to insert the bits, or Z_STREAM_ERROR if the + source stream state was inconsistent. +*/ + +ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, + gz_headerp head)); +/* + deflateSetHeader() provides gzip header information for when a gzip + stream is requested by deflateInit2(). deflateSetHeader() may be called + after deflateInit2() or deflateReset() and before the first call of + deflate(). The text, time, os, extra field, name, and comment information + in the provided gz_header structure are written to the gzip header (xflag is + ignored -- the extra flags are set according to the compression level). The + caller must assure that, if not Z_NULL, name and comment are terminated with + a zero byte, and that if extra is not Z_NULL, that extra_len bytes are + available there. If hcrc is true, a gzip header crc is included. Note that + the current versions of the command-line version of gzip (up through version + 1.3.x) do not support header crc's, and will report that it is a "multi-part + gzip file" and give up. + + If deflateSetHeader is not used, the default gzip header has text false, + the time set to zero, and os set to 255, with no extra, name, or comment + fields. The gzip header is returned to the default state by deflateReset(). + + deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +/* +ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, + int windowBits)); + + This is another version of inflateInit with an extra parameter. The + fields next_in, avail_in, zalloc, zfree and opaque must be initialized + before by the caller. + + The windowBits parameter is the base two logarithm of the maximum window + size (the size of the history buffer). It should be in the range 8..15 for + this version of the library. The default value is 15 if inflateInit is used + instead. windowBits must be greater than or equal to the windowBits value + provided to deflateInit2() while compressing, or it must be equal to 15 if + deflateInit2() was not used. If a compressed stream with a larger window + size is given as input, inflate() will return with the error code + Z_DATA_ERROR instead of trying to allocate a larger window. + + windowBits can also be zero to request that inflate use the window size in + the zlib header of the compressed stream. + + windowBits can also be -8..-15 for raw inflate. In this case, -windowBits + determines the window size. inflate() will then process raw deflate data, + not looking for a zlib or gzip header, not generating a check value, and not + looking for any check values for comparison at the end of the stream. This + is for use with other formats that use the deflate compressed data format + such as zip. Those formats provide their own check values. If a custom + format is developed using the raw deflate format for compressed data, it is + recommended that a check value such as an adler32 or a crc32 be applied to + the uncompressed data as is done in the zlib, gzip, and zip formats. For + most applications, the zlib format should be used as is. Note that comments + above on the use in deflateInit2() applies to the magnitude of windowBits. + + windowBits can also be greater than 15 for optional gzip decoding. Add + 32 to windowBits to enable zlib and gzip decoding with automatic header + detection, or add 16 to decode only the gzip format (the zlib format will + return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is a + crc32 instead of an adler32. + + inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_VERSION_ERROR if the zlib library version is incompatible with the + version assumed by the caller, or Z_STREAM_ERROR if the parameters are + invalid, such as a null pointer to the structure. msg is set to null if + there is no error message. inflateInit2 does not perform any decompression + apart from possibly reading the zlib header if present: actual decompression + will be done by inflate(). (So next_in and avail_in may be modified, but + next_out and avail_out are unused and unchanged.) The current implementation + of inflateInit2() does not process any header information -- that is + deferred until inflate() is called. +*/ + +ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, + const Bytef *dictionary, + uInt dictLength)); +/* + Initializes the decompression dictionary from the given uncompressed byte + sequence. This function must be called immediately after a call of inflate, + if that call returned Z_NEED_DICT. The dictionary chosen by the compressor + can be determined from the adler32 value returned by that call of inflate. + The compressor and decompressor must use exactly the same dictionary (see + deflateSetDictionary). For raw inflate, this function can be called at any + time to set the dictionary. If the provided dictionary is smaller than the + window and there is already data in the window, then the provided dictionary + will amend what's there. The application must insure that the dictionary + that was used for compression is provided. + + inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a + parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is + inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the + expected one (incorrect adler32 value). inflateSetDictionary does not + perform any decompression: this will be done by subsequent calls of + inflate(). +*/ + +ZEXTERN int ZEXPORT inflateGetDictionary OF((z_streamp strm, + Bytef *dictionary, + uInt *dictLength)); +/* + Returns the sliding dictionary being maintained by inflate. dictLength is + set to the number of bytes in the dictionary, and that many bytes are copied + to dictionary. dictionary must have enough space, where 32768 bytes is + always enough. If inflateGetDictionary() is called with dictionary equal to + Z_NULL, then only the dictionary length is returned, and nothing is copied. + Similary, if dictLength is Z_NULL, then it is not set. + + inflateGetDictionary returns Z_OK on success, or Z_STREAM_ERROR if the + stream state is inconsistent. +*/ + +ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); +/* + Skips invalid compressed data until a possible full flush point (see above + for the description of deflate with Z_FULL_FLUSH) can be found, or until all + available input is skipped. No output is provided. + + inflateSync searches for a 00 00 FF FF pattern in the compressed data. + All full flush points have this pattern, but not all occurrences of this + pattern are full flush points. + + inflateSync returns Z_OK if a possible full flush point has been found, + Z_BUF_ERROR if no more input was provided, Z_DATA_ERROR if no flush point + has been found, or Z_STREAM_ERROR if the stream structure was inconsistent. + In the success case, the application may save the current current value of + total_in which indicates where valid compressed data was found. In the + error case, the application may repeatedly call inflateSync, providing more + input each time, until success or end of the input data. +*/ + +ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, + z_streamp source)); +/* + Sets the destination stream as a complete copy of the source stream. + + This function can be useful when randomly accessing a large stream. The + first pass through the stream can periodically record the inflate state, + allowing restarting inflate at those points when randomly accessing the + stream. + + inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being Z_NULL). msg is left unchanged in both source and + destination. +*/ + +ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); +/* + This function is equivalent to inflateEnd followed by inflateInit, + but does not free and reallocate all the internal decompression state. The + stream will keep attributes that may have been set by inflateInit2. + + inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being Z_NULL). +*/ + +ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm, + int windowBits)); +/* + This function is the same as inflateReset, but it also permits changing + the wrap and window size requests. The windowBits parameter is interpreted + the same as it is for inflateInit2. + + inflateReset2 returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being Z_NULL), or if + the windowBits parameter is invalid. +*/ + +ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, + int bits, + int value)); +/* + This function inserts bits in the inflate input stream. The intent is + that this function is used to start inflating at a bit position in the + middle of a byte. The provided bits will be used before any bytes are used + from next_in. This function should only be used with raw inflate, and + should be used before the first inflate() call after inflateInit2() or + inflateReset(). bits must be less than or equal to 16, and that many of the + least significant bits of value will be inserted in the input. + + If bits is negative, then the input stream bit buffer is emptied. Then + inflatePrime() can be called again to put bits in the buffer. This is used + to clear out bits leftover after feeding inflate a block description prior + to feeding inflate codes. + + inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +ZEXTERN long ZEXPORT inflateMark OF((z_streamp strm)); +/* + This function returns two values, one in the lower 16 bits of the return + value, and the other in the remaining upper bits, obtained by shifting the + return value down 16 bits. If the upper value is -1 and the lower value is + zero, then inflate() is currently decoding information outside of a block. + If the upper value is -1 and the lower value is non-zero, then inflate is in + the middle of a stored block, with the lower value equaling the number of + bytes from the input remaining to copy. If the upper value is not -1, then + it is the number of bits back from the current bit position in the input of + the code (literal or length/distance pair) currently being processed. In + that case the lower value is the number of bytes already emitted for that + code. + + A code is being processed if inflate is waiting for more input to complete + decoding of the code, or if it has completed decoding but is waiting for + more output space to write the literal or match data. + + inflateMark() is used to mark locations in the input data for random + access, which may be at bit positions, and to note those cases where the + output of a code may span boundaries of random access blocks. The current + location in the input stream can be determined from avail_in and data_type + as noted in the description for the Z_BLOCK flush parameter for inflate. + + inflateMark returns the value noted above or -1 << 16 if the provided + source stream state was inconsistent. +*/ + +ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, + gz_headerp head)); +/* + inflateGetHeader() requests that gzip header information be stored in the + provided gz_header structure. inflateGetHeader() may be called after + inflateInit2() or inflateReset(), and before the first call of inflate(). + As inflate() processes the gzip stream, head->done is zero until the header + is completed, at which time head->done is set to one. If a zlib stream is + being decoded, then head->done is set to -1 to indicate that there will be + no gzip header information forthcoming. Note that Z_BLOCK or Z_TREES can be + used to force inflate() to return immediately after header processing is + complete and before any actual data is decompressed. + + The text, time, xflags, and os fields are filled in with the gzip header + contents. hcrc is set to true if there is a header CRC. (The header CRC + was valid if done is set to one.) If extra is not Z_NULL, then extra_max + contains the maximum number of bytes to write to extra. Once done is true, + extra_len contains the actual extra field length, and extra contains the + extra field, or that field truncated if extra_max is less than extra_len. + If name is not Z_NULL, then up to name_max characters are written there, + terminated with a zero unless the length is greater than name_max. If + comment is not Z_NULL, then up to comm_max characters are written there, + terminated with a zero unless the length is greater than comm_max. When any + of extra, name, or comment are not Z_NULL and the respective field is not + present in the header, then that field is set to Z_NULL to signal its + absence. This allows the use of deflateSetHeader() with the returned + structure to duplicate the header. However if those fields are set to + allocated memory, then the application will need to save those pointers + elsewhere so that they can be eventually freed. + + If inflateGetHeader is not used, then the header information is simply + discarded. The header is always checked for validity, including the header + CRC if present. inflateReset() will reset the process to discard the header + information. The application would need to call inflateGetHeader() again to + retrieve the header from the next gzip stream. + + inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +/* +ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits, + unsigned char FAR *window)); + + Initialize the internal stream state for decompression using inflateBack() + calls. The fields zalloc, zfree and opaque in strm must be initialized + before the call. If zalloc and zfree are Z_NULL, then the default library- + derived memory allocation routines are used. windowBits is the base two + logarithm of the window size, in the range 8..15. window is a caller + supplied buffer of that size. Except for special applications where it is + assured that deflate was used with small window sizes, windowBits must be 15 + and a 32K byte window must be supplied to be able to decompress general + deflate streams. + + See inflateBack() for the usage of these routines. + + inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of + the parameters are invalid, Z_MEM_ERROR if the internal state could not be + allocated, or Z_VERSION_ERROR if the version of the library does not match + the version of the header file. +*/ + +typedef unsigned (*in_func) OF((void FAR *, + z_const unsigned char FAR * FAR *)); +typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned)); + +ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, + in_func in, void FAR *in_desc, + out_func out, void FAR *out_desc)); +/* + inflateBack() does a raw inflate with a single call using a call-back + interface for input and output. This is potentially more efficient than + inflate() for file i/o applications, in that it avoids copying between the + output and the sliding window by simply making the window itself the output + buffer. inflate() can be faster on modern CPUs when used with large + buffers. inflateBack() trusts the application to not change the output + buffer passed by the output function, at least until inflateBack() returns. + + inflateBackInit() must be called first to allocate the internal state + and to initialize the state with the user-provided window buffer. + inflateBack() may then be used multiple times to inflate a complete, raw + deflate stream with each call. inflateBackEnd() is then called to free the + allocated state. + + A raw deflate stream is one with no zlib or gzip header or trailer. + This routine would normally be used in a utility that reads zip or gzip + files and writes out uncompressed files. The utility would decode the + header and process the trailer on its own, hence this routine expects only + the raw deflate stream to decompress. This is different from the normal + behavior of inflate(), which expects either a zlib or gzip header and + trailer around the deflate stream. + + inflateBack() uses two subroutines supplied by the caller that are then + called by inflateBack() for input and output. inflateBack() calls those + routines until it reads a complete deflate stream and writes out all of the + uncompressed data, or until it encounters an error. The function's + parameters and return types are defined above in the in_func and out_func + typedefs. inflateBack() will call in(in_desc, &buf) which should return the + number of bytes of provided input, and a pointer to that input in buf. If + there is no input available, in() must return zero--buf is ignored in that + case--and inflateBack() will return a buffer error. inflateBack() will call + out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. out() + should return zero on success, or non-zero on failure. If out() returns + non-zero, inflateBack() will return with an error. Neither in() nor out() + are permitted to change the contents of the window provided to + inflateBackInit(), which is also the buffer that out() uses to write from. + The length written by out() will be at most the window size. Any non-zero + amount of input may be provided by in(). + + For convenience, inflateBack() can be provided input on the first call by + setting strm->next_in and strm->avail_in. If that input is exhausted, then + in() will be called. Therefore strm->next_in must be initialized before + calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called + immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in + must also be initialized, and then if strm->avail_in is not zero, input will + initially be taken from strm->next_in[0 .. strm->avail_in - 1]. + + The in_desc and out_desc parameters of inflateBack() is passed as the + first parameter of in() and out() respectively when they are called. These + descriptors can be optionally used to pass any information that the caller- + supplied in() and out() functions need to do their job. + + On return, inflateBack() will set strm->next_in and strm->avail_in to + pass back any unused input that was provided by the last in() call. The + return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR + if in() or out() returned an error, Z_DATA_ERROR if there was a format error + in the deflate stream (in which case strm->msg is set to indicate the nature + of the error), or Z_STREAM_ERROR if the stream was not properly initialized. + In the case of Z_BUF_ERROR, an input or output error can be distinguished + using strm->next_in which will be Z_NULL only if in() returned an error. If + strm->next_in is not Z_NULL, then the Z_BUF_ERROR was due to out() returning + non-zero. (in() will always be called before out(), so strm->next_in is + assured to be defined if out() returns non-zero.) Note that inflateBack() + cannot return Z_OK. +*/ + +ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm)); +/* + All memory allocated by inflateBackInit() is freed. + + inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream + state was inconsistent. +*/ + +ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); +/* Return flags indicating compile-time options. + + Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other: + 1.0: size of uInt + 3.2: size of uLong + 5.4: size of voidpf (pointer) + 7.6: size of z_off_t + + Compiler, assembler, and debug options: + 8: DEBUG + 9: ASMV or ASMINF -- use ASM code + 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention + 11: 0 (reserved) + + One-time table building (smaller code, but not thread-safe if true): + 12: BUILDFIXED -- build static block decoding tables when needed + 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed + 14,15: 0 (reserved) + + Library content (indicates missing functionality): + 16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking + deflate code when not needed) + 17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect + and decode gzip streams (to avoid linking crc code) + 18-19: 0 (reserved) + + Operation variations (changes in library functionality): + 20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate + 21: FASTEST -- deflate algorithm with only one, lowest compression level + 22,23: 0 (reserved) + + The sprintf variant used by gzprintf (zero is best): + 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format + 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure! + 26: 0 = returns value, 1 = void -- 1 means inferred string length returned + + Remainder: + 27-31: 0 (reserved) + */ + +#ifndef Z_SOLO + + /* utility functions */ + +/* + The following utility functions are implemented on top of the basic + stream-oriented functions. To simplify the interface, some default options + are assumed (compression level and memory usage, standard memory allocation + functions). The source code of these utility functions can be modified if + you need special options. +*/ + +ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen)); +/* + Compresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total size + of the destination buffer, which must be at least the value returned by + compressBound(sourceLen). Upon exit, destLen is the actual size of the + compressed buffer. + + compress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer. +*/ + +ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen, + int level)); +/* + Compresses the source buffer into the destination buffer. The level + parameter has the same meaning as in deflateInit. sourceLen is the byte + length of the source buffer. Upon entry, destLen is the total size of the + destination buffer, which must be at least the value returned by + compressBound(sourceLen). Upon exit, destLen is the actual size of the + compressed buffer. + + compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_BUF_ERROR if there was not enough room in the output buffer, + Z_STREAM_ERROR if the level parameter is invalid. +*/ + +ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen)); +/* + compressBound() returns an upper bound on the compressed size after + compress() or compress2() on sourceLen bytes. It would be used before a + compress() or compress2() call to allocate the destination buffer. +*/ + +ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen)); +/* + Decompresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total size + of the destination buffer, which must be large enough to hold the entire + uncompressed data. (The size of the uncompressed data must have been saved + previously by the compressor and transmitted to the decompressor by some + mechanism outside the scope of this compression library.) Upon exit, destLen + is the actual size of the uncompressed buffer. + + uncompress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. In + the case where there is not enough room, uncompress() will fill the output + buffer with the uncompressed data up to that point. +*/ + + /* gzip file access functions */ + +/* + This library supports reading and writing files in gzip (.gz) format with + an interface similar to that of stdio, using the functions that start with + "gz". The gzip format is different from the zlib format. gzip is a gzip + wrapper, documented in RFC 1952, wrapped around a deflate stream. +*/ + +typedef struct gzFile_s *gzFile; /* semi-opaque gzip file descriptor */ + +/* +ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); + + Opens a gzip (.gz) file for reading or writing. The mode parameter is as + in fopen ("rb" or "wb") but can also include a compression level ("wb9") or + a strategy: 'f' for filtered data as in "wb6f", 'h' for Huffman-only + compression as in "wb1h", 'R' for run-length encoding as in "wb1R", or 'F' + for fixed code compression as in "wb9F". (See the description of + deflateInit2 for more information about the strategy parameter.) 'T' will + request transparent writing or appending with no compression and not using + the gzip format. + + "a" can be used instead of "w" to request that the gzip stream that will + be written be appended to the file. "+" will result in an error, since + reading and writing to the same gzip file is not supported. The addition of + "x" when writing will create the file exclusively, which fails if the file + already exists. On systems that support it, the addition of "e" when + reading or writing will set the flag to close the file on an execve() call. + + These functions, as well as gzip, will read and decode a sequence of gzip + streams in a file. The append function of gzopen() can be used to create + such a file. (Also see gzflush() for another way to do this.) When + appending, gzopen does not test whether the file begins with a gzip stream, + nor does it look for the end of the gzip streams to begin appending. gzopen + will simply append a gzip stream to the existing file. + + gzopen can be used to read a file which is not in gzip format; in this + case gzread will directly read from the file without decompression. When + reading, this will be detected automatically by looking for the magic two- + byte gzip header. + + gzopen returns NULL if the file could not be opened, if there was + insufficient memory to allocate the gzFile state, or if an invalid mode was + specified (an 'r', 'w', or 'a' was not provided, or '+' was provided). + errno can be checked to determine if the reason gzopen failed was that the + file could not be opened. +*/ + +ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); +/* + gzdopen associates a gzFile with the file descriptor fd. File descriptors + are obtained from calls like open, dup, creat, pipe or fileno (if the file + has been previously opened with fopen). The mode parameter is as in gzopen. + + The next call of gzclose on the returned gzFile will also close the file + descriptor fd, just like fclose(fdopen(fd, mode)) closes the file descriptor + fd. If you want to keep fd open, use fd = dup(fd_keep); gz = gzdopen(fd, + mode);. The duplicated descriptor should be saved to avoid a leak, since + gzdopen does not close fd if it fails. If you are using fileno() to get the + file descriptor from a FILE *, then you will have to use dup() to avoid + double-close()ing the file descriptor. Both gzclose() and fclose() will + close the associated file descriptor, so they need to have different file + descriptors. + + gzdopen returns NULL if there was insufficient memory to allocate the + gzFile state, if an invalid mode was specified (an 'r', 'w', or 'a' was not + provided, or '+' was provided), or if fd is -1. The file descriptor is not + used until the next gz* read, write, seek, or close operation, so gzdopen + will not detect if fd is invalid (unless fd is -1). +*/ + +ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size)); +/* + Set the internal buffer size used by this library's functions. The + default buffer size is 8192 bytes. This function must be called after + gzopen() or gzdopen(), and before any other calls that read or write the + file. The buffer memory allocation is always deferred to the first read or + write. Two buffers are allocated, either both of the specified size when + writing, or one of the specified size and the other twice that size when + reading. A larger buffer size of, for example, 64K or 128K bytes will + noticeably increase the speed of decompression (reading). + + The new buffer size also affects the maximum length for gzprintf(). + + gzbuffer() returns 0 on success, or -1 on failure, such as being called + too late. +*/ + +ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); +/* + Dynamically update the compression level or strategy. See the description + of deflateInit2 for the meaning of these parameters. + + gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not + opened for writing. +*/ + +ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); +/* + Reads the given number of uncompressed bytes from the compressed file. If + the input file is not in gzip format, gzread copies the given number of + bytes into the buffer directly from the file. + + After reaching the end of a gzip stream in the input, gzread will continue + to read, looking for another gzip stream. Any number of gzip streams may be + concatenated in the input file, and will all be decompressed by gzread(). + If something other than a gzip stream is encountered after a gzip stream, + that remaining trailing garbage is ignored (and no error is returned). + + gzread can be used to read a gzip file that is being concurrently written. + Upon reaching the end of the input, gzread will return with the available + data. If the error code returned by gzerror is Z_OK or Z_BUF_ERROR, then + gzclearerr can be used to clear the end of file indicator in order to permit + gzread to be tried again. Z_OK indicates that a gzip stream was completed + on the last gzread. Z_BUF_ERROR indicates that the input file ended in the + middle of a gzip stream. Note that gzread does not return -1 in the event + of an incomplete gzip stream. This error is deferred until gzclose(), which + will return Z_BUF_ERROR if the last gzread ended in the middle of a gzip + stream. Alternatively, gzerror can be used before gzclose to detect this + case. + + gzread returns the number of uncompressed bytes actually read, less than + len for end of file, or -1 for error. +*/ + +ZEXTERN int ZEXPORT gzwrite OF((gzFile file, + voidpc buf, unsigned len)); +/* + Writes the given number of uncompressed bytes into the compressed file. + gzwrite returns the number of uncompressed bytes written or 0 in case of + error. +*/ + +ZEXTERN int ZEXPORTVA gzprintf Z_ARG((gzFile file, const char *format, ...)); +/* + Converts, formats, and writes the arguments to the compressed file under + control of the format string, as in fprintf. gzprintf returns the number of + uncompressed bytes actually written, or 0 in case of error. The number of + uncompressed bytes written is limited to 8191, or one less than the buffer + size given to gzbuffer(). The caller should assure that this limit is not + exceeded. If it is exceeded, then gzprintf() will return an error (0) with + nothing written. In this case, there may also be a buffer overflow with + unpredictable consequences, which is possible only if zlib was compiled with + the insecure functions sprintf() or vsprintf() because the secure snprintf() + or vsnprintf() functions were not available. This can be determined using + zlibCompileFlags(). +*/ + +ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); +/* + Writes the given null-terminated string to the compressed file, excluding + the terminating null character. + + gzputs returns the number of characters written, or -1 in case of error. +*/ + +ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); +/* + Reads bytes from the compressed file until len-1 characters are read, or a + newline character is read and transferred to buf, or an end-of-file + condition is encountered. If any characters are read or if len == 1, the + string is terminated with a null character. If no characters are read due + to an end-of-file or len < 1, then the buffer is left untouched. + + gzgets returns buf which is a null-terminated string, or it returns NULL + for end-of-file or in case of error. If there was an error, the contents at + buf are indeterminate. +*/ + +ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); +/* + Writes c, converted to an unsigned char, into the compressed file. gzputc + returns the value that was written, or -1 in case of error. +*/ + +ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); +/* + Reads one byte from the compressed file. gzgetc returns this byte or -1 + in case of end of file or error. This is implemented as a macro for speed. + As such, it does not do all of the checking the other functions do. I.e. + it does not check to see if file is NULL, nor whether the structure file + points to has been clobbered or not. +*/ + +ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); +/* + Push one character back onto the stream to be read as the first character + on the next read. At least one character of push-back is allowed. + gzungetc() returns the character pushed, or -1 on failure. gzungetc() will + fail if c is -1, and may fail if a character has been pushed but not read + yet. If gzungetc is used immediately after gzopen or gzdopen, at least the + output buffer size of pushed characters is allowed. (See gzbuffer above.) + The pushed character will be discarded if the stream is repositioned with + gzseek() or gzrewind(). +*/ + +ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); +/* + Flushes all pending output into the compressed file. The parameter flush + is as in the deflate() function. The return value is the zlib error number + (see function gzerror below). gzflush is only permitted when writing. + + If the flush parameter is Z_FINISH, the remaining data is written and the + gzip stream is completed in the output. If gzwrite() is called again, a new + gzip stream will be started in the output. gzread() is able to read such + concatented gzip streams. + + gzflush should be called only when strictly necessary because it will + degrade compression if called too often. +*/ + +/* +ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, + z_off_t offset, int whence)); + + Sets the starting position for the next gzread or gzwrite on the given + compressed file. The offset represents a number of bytes in the + uncompressed data stream. The whence parameter is defined as in lseek(2); + the value SEEK_END is not supported. + + If the file is opened for reading, this function is emulated but can be + extremely slow. If the file is opened for writing, only forward seeks are + supported; gzseek then compresses a sequence of zeroes up to the new + starting position. + + gzseek returns the resulting offset location as measured in bytes from + the beginning of the uncompressed stream, or -1 in case of error, in + particular if the file is opened for writing and the new starting position + would be before the current position. +*/ + +ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); +/* + Rewinds the given file. This function is supported only for reading. + + gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) +*/ + +/* +ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); + + Returns the starting position for the next gzread or gzwrite on the given + compressed file. This position represents a number of bytes in the + uncompressed data stream, and is zero when starting, even if appending or + reading a gzip stream from the middle of a file using gzdopen(). + + gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) +*/ + +/* +ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile file)); + + Returns the current offset in the file being read or written. This offset + includes the count of bytes that precede the gzip stream, for example when + appending or when using gzdopen() for reading. When reading, the offset + does not include as yet unused buffered input. This information can be used + for a progress indicator. On error, gzoffset() returns -1. +*/ + +ZEXTERN int ZEXPORT gzeof OF((gzFile file)); +/* + Returns true (1) if the end-of-file indicator has been set while reading, + false (0) otherwise. Note that the end-of-file indicator is set only if the + read tried to go past the end of the input, but came up short. Therefore, + just like feof(), gzeof() may return false even if there is no more data to + read, in the event that the last read request was for the exact number of + bytes remaining in the input file. This will happen if the input file size + is an exact multiple of the buffer size. + + If gzeof() returns true, then the read functions will return no more data, + unless the end-of-file indicator is reset by gzclearerr() and the input file + has grown since the previous end of file was detected. +*/ + +ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); +/* + Returns true (1) if file is being copied directly while reading, or false + (0) if file is a gzip stream being decompressed. + + If the input file is empty, gzdirect() will return true, since the input + does not contain a gzip stream. + + If gzdirect() is used immediately after gzopen() or gzdopen() it will + cause buffers to be allocated to allow reading the file to determine if it + is a gzip file. Therefore if gzbuffer() is used, it should be called before + gzdirect(). + + When writing, gzdirect() returns true (1) if transparent writing was + requested ("wT" for the gzopen() mode), or false (0) otherwise. (Note: + gzdirect() is not needed when writing. Transparent writing must be + explicitly requested, so the application already knows the answer. When + linking statically, using gzdirect() will include all of the zlib code for + gzip file reading and decompression, which may not be desired.) +*/ + +ZEXTERN int ZEXPORT gzclose OF((gzFile file)); +/* + Flushes all pending output if necessary, closes the compressed file and + deallocates the (de)compression state. Note that once file is closed, you + cannot call gzerror with file, since its structures have been deallocated. + gzclose must not be called more than once on the same file, just as free + must not be called more than once on the same allocation. + + gzclose will return Z_STREAM_ERROR if file is not valid, Z_ERRNO on a + file operation error, Z_MEM_ERROR if out of memory, Z_BUF_ERROR if the + last read ended in the middle of a gzip stream, or Z_OK on success. +*/ + +ZEXTERN int ZEXPORT gzclose_r OF((gzFile file)); +ZEXTERN int ZEXPORT gzclose_w OF((gzFile file)); +/* + Same as gzclose(), but gzclose_r() is only for use when reading, and + gzclose_w() is only for use when writing or appending. The advantage to + using these instead of gzclose() is that they avoid linking in zlib + compression or decompression code that is not used when only reading or only + writing respectively. If gzclose() is used, then both compression and + decompression code will be included the application when linking to a static + zlib library. +*/ + +ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); +/* + Returns the error message for the last error which occurred on the given + compressed file. errnum is set to zlib error number. If an error occurred + in the file system and not in the compression library, errnum is set to + Z_ERRNO and the application may consult errno to get the exact error code. + + The application must not modify the returned string. Future calls to + this function may invalidate the previously returned string. If file is + closed, then the string previously returned by gzerror will no longer be + available. + + gzerror() should be used to distinguish errors from end-of-file for those + functions above that do not distinguish those cases in their return values. +*/ + +ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); +/* + Clears the error and end-of-file flags for file. This is analogous to the + clearerr() function in stdio. This is useful for continuing to read a gzip + file that is being written concurrently. +*/ + +#endif /* !Z_SOLO */ + + /* checksum functions */ + +/* + These functions are not related to compression but are exported + anyway because they might be useful in applications using the compression + library. +*/ + +ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); +/* + Update a running Adler-32 checksum with the bytes buf[0..len-1] and + return the updated checksum. If buf is Z_NULL, this function returns the + required initial value for the checksum. + + An Adler-32 checksum is almost as reliable as a CRC32 but can be computed + much faster. + + Usage example: + + uLong adler = adler32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + adler = adler32(adler, buffer, length); + } + if (adler != original_adler) error(); +*/ + +/* +ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, + z_off_t len2)); + + Combine two Adler-32 checksums into one. For two sequences of bytes, seq1 + and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for + each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of + seq1 and seq2 concatenated, requiring only adler1, adler2, and len2. Note + that the z_off_t type (like off_t) is a signed integer. If len2 is + negative, the result has no meaning or utility. +*/ + +ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); +/* + Update a running CRC-32 with the bytes buf[0..len-1] and return the + updated CRC-32. If buf is Z_NULL, this function returns the required + initial value for the crc. Pre- and post-conditioning (one's complement) is + performed within this function so it shouldn't be done by the application. + + Usage example: + + uLong crc = crc32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + crc = crc32(crc, buffer, length); + } + if (crc != original_crc) error(); +*/ + +/* +ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2)); + + Combine two CRC-32 check values into one. For two sequences of bytes, + seq1 and seq2 with lengths len1 and len2, CRC-32 check values were + calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32 + check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and + len2. +*/ + + + /* various hacks, don't look :) */ + +/* deflateInit and inflateInit are macros to allow checking the zlib version + * and the compiler's view of z_stream: + */ +ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method, + int windowBits, int memLevel, + int strategy, const char *version, + int stream_size)); +ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, + unsigned char FAR *window, + const char *version, + int stream_size)); +#define deflateInit(strm, level) \ + deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream)) +#define inflateInit(strm) \ + inflateInit_((strm), ZLIB_VERSION, (int)sizeof(z_stream)) +#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ + deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ + (strategy), ZLIB_VERSION, (int)sizeof(z_stream)) +#define inflateInit2(strm, windowBits) \ + inflateInit2_((strm), (windowBits), ZLIB_VERSION, \ + (int)sizeof(z_stream)) +#define inflateBackInit(strm, windowBits, window) \ + inflateBackInit_((strm), (windowBits), (window), \ + ZLIB_VERSION, (int)sizeof(z_stream)) + +#ifndef Z_SOLO + +/* gzgetc() macro and its supporting function and exposed data structure. Note + * that the real internal state is much larger than the exposed structure. + * This abbreviated structure exposes just enough for the gzgetc() macro. The + * user should not mess with these exposed elements, since their names or + * behavior could change in the future, perhaps even capriciously. They can + * only be used by the gzgetc() macro. You have been warned. + */ +struct gzFile_s { + unsigned have; + unsigned char *next; + z_off64_t pos; +}; +ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ +#ifdef Z_PREFIX_SET +# undef z_gzgetc +# define z_gzgetc(g) \ + ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : gzgetc(g)) +#else +# define gzgetc(g) \ + ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : gzgetc(g)) +#endif + +/* provide 64-bit offset functions if _LARGEFILE64_SOURCE defined, and/or + * change the regular functions to 64 bits if _FILE_OFFSET_BITS is 64 (if + * both are true, the application gets the *64 functions, and the regular + * functions are changed to 64 bits) -- in case these are set on systems + * without large file support, _LFS64_LARGEFILE must also be true + */ +#ifdef Z_LARGE64 + ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); + ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); + ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); + ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); + ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off64_t)); + ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off64_t)); +#endif + +#if !defined(ZLIB_INTERNAL) && defined(Z_WANT64) +# ifdef Z_PREFIX_SET +# define z_gzopen z_gzopen64 +# define z_gzseek z_gzseek64 +# define z_gztell z_gztell64 +# define z_gzoffset z_gzoffset64 +# define z_adler32_combine z_adler32_combine64 +# define z_crc32_combine z_crc32_combine64 +# else +# define gzopen gzopen64 +# define gzseek gzseek64 +# define gztell gztell64 +# define gzoffset gzoffset64 +# define adler32_combine adler32_combine64 +# define crc32_combine crc32_combine64 +# endif +# ifndef Z_LARGE64 + ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); + ZEXTERN z_off_t ZEXPORT gzseek64 OF((gzFile, z_off_t, int)); + ZEXTERN z_off_t ZEXPORT gztell64 OF((gzFile)); + ZEXTERN z_off_t ZEXPORT gzoffset64 OF((gzFile)); + ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); +# endif +#else + ZEXTERN gzFile ZEXPORT gzopen OF((const char *, const char *)); + ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile, z_off_t, int)); + ZEXTERN z_off_t ZEXPORT gztell OF((gzFile)); + ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile)); + ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); +#endif + +#else /* Z_SOLO */ + + ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); + +#endif /* !Z_SOLO */ + +/* hack for buggy compilers */ +#if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL) + struct internal_state {int dummy;}; +#endif + +/* undocumented functions */ +ZEXTERN const char * ZEXPORT zError OF((int)); +ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp)); +ZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table OF((void)); +ZEXTERN int ZEXPORT inflateUndermine OF((z_streamp, int)); +ZEXTERN int ZEXPORT inflateResetKeep OF((z_streamp)); +ZEXTERN int ZEXPORT deflateResetKeep OF((z_streamp)); +#if defined(_WIN32) && !defined(Z_SOLO) +ZEXTERN gzFile ZEXPORT gzopen_w OF((const wchar_t *path, + const char *mode)); +#endif +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +# ifndef Z_SOLO +ZEXTERN int ZEXPORTVA gzvprintf Z_ARG((gzFile file, + const char *format, + va_list va)); +# endif +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* ZLIB_H */ diff --git a/Minecraft.Client/PSVita/PSVitaProductCodes.bin b/Minecraft.Client/PSVita/PSVitaProductCodes.bin new file mode 100644 index 00000000..ca305219 Binary files /dev/null and b/Minecraft.Client/PSVita/PSVitaProductCodes.bin differ diff --git a/Minecraft.Client/PSVita/PSVita_App.cpp b/Minecraft.Client/PSVita/PSVita_App.cpp new file mode 100644 index 00000000..48aa25c4 --- /dev/null +++ b/Minecraft.Client/PSVita/PSVita_App.cpp @@ -0,0 +1,1705 @@ + +#include "stdafx.h" +#include "..\Common\Consoles_App.h" +#include "..\User.h" +#include "..\..\Minecraft.Client\Minecraft.h" +#include "..\..\Minecraft.Client\MinecraftServer.h" +#include "..\..\Minecraft.Client\PlayerList.h" +#include "..\..\Minecraft.Client\ServerPlayer.h" +#include "..\..\Minecraft.World\Level.h" +#include "..\..\Minecraft.World\LevelSettings.h" +#include "..\..\Minecraft.World\BiomeSource.h" +#include "..\..\Minecraft.World\LevelType.h" +#include "..\..\Minecraft.World\StringHelpers.h" +#include "PSVita\Network\SonyRemoteStorage_Vita.h" +#include "PSVita\Network\SonyCommerce_Vita.h" +#include "..\..\Common\Network\Sony\SonyRemoteStorage.h" +#include "PSVita/Network/PSVita_NPToolkit.h" +#include +#include +#include "Common\UI\UI.h" +#include "PSVita\PSVitaExtras\PSVitaStrings.h" + +#define VITA_COMMERCE_ENABLED +CConsoleMinecraftApp app; + +CConsoleMinecraftApp::CConsoleMinecraftApp() : CMinecraftApp() +{ + memset(&m_ThumbnailBuffer,0,sizeof(ImageFileBuffer)); + memset(&m_SaveImageBuffer,0,sizeof(ImageFileBuffer)); + memset(&ProductCodes,0,sizeof(PRODUCTCODES)); + + m_bVoiceChatAndUGCRestricted=false; + m_bDisplayFullVersionPurchase=false; + + m_ProductListA=NULL; + + m_pRemoteStorage = new SonyRemoteStorage_Vita; + + m_bSaveIncompleteDialogRunning = false; + m_bSaveDataDeleteDialogState = eSaveDataDeleteState_idle; + + m_pSaveToDelete = NULL; + m_pCheckoutProductInfo = NULL; +} + +void CConsoleMinecraftApp::SetRichPresenceContext(int iPad, int contextId) +{ + ProfileManager.SetRichPresenceContextValue(iPad,CONTEXT_GAME_STATE,contextId); +} + +char *CConsoleMinecraftApp::GetProductCode() +{ + return ProductCodes.chProductCode; +} +char *CConsoleMinecraftApp::GetSaveFolderPrefix() +{ + return ProductCodes.chSaveFolderPrefix; +} +char *CConsoleMinecraftApp::GetCommerceCategory() +{ + return ProductCodes.chCommerceCategory; +} +char *CConsoleMinecraftApp::GetTexturePacksCategoryID() +{ + return NULL; // ProductCodes.chTexturePackID; +} +char *CConsoleMinecraftApp::GetUpgradeKey() +{ + return ProductCodes.chUpgradeKey; +} +EProductSKU CConsoleMinecraftApp::GetProductSKU() +{ + return ProductCodes.eProductSKU; +} +bool CConsoleMinecraftApp::IsJapaneseSKU() +{ + return ProductCodes.eProductSKU == e_sku_SCEJ; + +} +bool CConsoleMinecraftApp::IsEuropeanSKU() +{ + return ProductCodes.eProductSKU == e_sku_SCEE; + +} +bool CConsoleMinecraftApp::IsAmericanSKU() +{ + return ProductCodes.eProductSKU == e_sku_SCEA; + +} +// char *CConsoleMinecraftApp::GetSKUPostfix() +// { +// return ProductCodes.chSkuPostfix; +// } + +SONYDLC *CConsoleMinecraftApp::GetSONYDLCInfo(char *pchTitle) +{ + wstring wstrTemp=convStringToWstring(pchTitle); + + AUTO_VAR(it, m_SONYDLCMap.find(wstrTemp)); + if(it == m_SONYDLCMap.end()) + { + app.DebugPrintf("Couldn't find DLC info for %s\n", pchTitle); + assert(0); + return NULL; + } + return it->second; + + /*wstring wstrTemp=convStringToWstring(pchTitle); + SONYDLC *pTemp=m_SONYDLCMap.at(wstrTemp); + + 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() +{ + char chDLCTitle[64]; + + // 4J-PB - Read the file containing the product codes. This will be different for the SCEE/SCEA/SCEJ builds + HANDLE file = CreateFile("PSVita/PSVitaProductCodes.bin", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + if( file == INVALID_HANDLE_VALUE ) + { + DWORD error = GetLastError(); + app.DebugPrintf("Failed to open ProductCodes.bin with error code %d (%x)\n", error, error); + return FALSE; + } + + DWORD dwHigh=0; + DWORD dwFileSize = GetFileSize(file,&dwHigh); + + if(dwFileSize!=0) + { + DWORD bytesRead; + + WRAPPED_READFILE(file,ProductCodes.chProductCode,PRODUCT_CODE_SIZE,&bytesRead,NULL); + WRAPPED_READFILE(file,ProductCodes.chSaveFolderPrefix,SAVEFOLDERPREFIX_SIZE,&bytesRead,NULL); + //WRAPPED_READFILE(file,ProductCodes.chDiscSaveFolderPrefix,SAVEFOLDERPREFIX_SIZE,&bytesRead,NULL); + WRAPPED_READFILE(file,ProductCodes.chCommerceCategory,COMMERCE_CATEGORY_SIZE,&bytesRead,NULL); + //WRAPPED_READFILE(file,ProductCodes.chTexturePackID,SCE_NP_COMMERCE2_CATEGORY_ID_LEN,&bytesRead,NULL); // TODO + WRAPPED_READFILE(file,ProductCodes.chUpgradeKey,UPGRADE_KEY_SIZE,&bytesRead,NULL); + //WRAPPED_READFILE(file,ProductCodes.chSkuPostfix,SKU_POSTFIX_SIZE,&bytesRead,NULL); + + app.DebugPrintf("ProductCodes.chProductCode %s\n",ProductCodes.chProductCode); + app.DebugPrintf("ProductCodes.chSaveFolderPrefix %s\n",ProductCodes.chSaveFolderPrefix); + //app.DebugPrintf("ProductCodes.chDiscSaveFolderPrefix %s\n",ProductCodes.chDiscSaveFolderPrefix); + app.DebugPrintf("ProductCodes.chCommerceCategory %s\n",ProductCodes.chCommerceCategory); + //app.DebugPrintf("ProductCodes.chTexturePackID %s\n",ProductCodes.chTexturePackID); + app.DebugPrintf("ProductCodes.chUpgradeKey %s\n",ProductCodes.chUpgradeKey); + //app.DebugPrintf("ProductCodes.chSkuPostfix %s\n",ProductCodes.chSkuPostfix); + + // DLC + unsigned int uiDLC; + WRAPPED_READFILE(file,&uiDLC,sizeof(int),&bytesRead,NULL); + + for(unsigned int i=0;ichDLCKeyname,sizeof(char)*uiVal,&bytesRead,NULL); + + WRAPPED_READFILE(file,&uiVal,sizeof(int),&bytesRead,NULL); + WRAPPED_READFILE(file,chDLCTitle,sizeof(char)*uiVal,&bytesRead,NULL); + app.DebugPrintf("DLC title %s\n",chDLCTitle); + + WRAPPED_READFILE(file,&pDLCInfo->eDLCType,sizeof(int),&bytesRead,NULL); + WRAPPED_READFILE(file,&pDLCInfo->iFirstSkin,sizeof(int),&bytesRead,NULL); + WRAPPED_READFILE(file,&pDLCInfo->iConfig,sizeof(int),&bytesRead,NULL); + + // push this into a vector + + wstring wstrTemp=convStringToWstring(chDLCTitle); + m_SONYDLCMap[wstrTemp]=pDLCInfo; + } + CloseHandle(file); + } + + if(strcmp(ProductCodes.chProductCode, "PCSB00560") == 0) + ProductCodes.eProductSKU = e_sku_SCEE; + else if(strcmp(ProductCodes.chProductCode, "PCSE00491") == 0) + ProductCodes.eProductSKU = e_sku_SCEA; + else if(strcmp(ProductCodes.chProductCode, "PCSG00302") == 0) + ProductCodes.eProductSKU = e_sku_SCEJ; + else + { + // unknown product ID + assert(0); + } + + return TRUE; +} + +void CConsoleMinecraftApp::StoreLaunchData() +{ +} +void CConsoleMinecraftApp::ExitGame() +{ +} +void CConsoleMinecraftApp::FatalLoadError() +{ + assert(0); +} + +void CConsoleMinecraftApp::CaptureSaveThumbnail() +{ + RenderManager.CaptureThumbnail(&m_ThumbnailBuffer); +} +void CConsoleMinecraftApp::GetSaveThumbnail(PBYTE *ppbThumbnailData,DWORD *pdwThumbnailSize,PBYTE *ppbDataImage,DWORD *pdwSizeImage) +{ + // on a save caused by a create world, the thumbnail capture won't have happened + if(m_ThumbnailBuffer.Allocated()) + { + if( ppbThumbnailData ) + { + *ppbThumbnailData= new BYTE [m_ThumbnailBuffer.GetBufferSize()]; + *pdwThumbnailSize=m_ThumbnailBuffer.GetBufferSize(); + memcpy(*ppbThumbnailData,m_ThumbnailBuffer.GetBufferPointer(),*pdwThumbnailSize); + } + m_ThumbnailBuffer.Release(); + } + else + { + if( ppbThumbnailData ) + { + // use the default image + StorageManager.GetDefaultSaveThumbnail(ppbThumbnailData,pdwThumbnailSize); + } + } + + if(m_SaveImageBuffer.Allocated()) + { + if( ppbDataImage ) + { + *ppbDataImage= new BYTE [m_SaveImageBuffer.GetBufferSize()]; + *pdwSizeImage=m_SaveImageBuffer.GetBufferSize(); + memcpy(*ppbDataImage,m_SaveImageBuffer.GetBufferPointer(),*pdwSizeImage); + } + m_SaveImageBuffer.Release(); + } + else + { + if( ppbDataImage ) + { + // use the default image + StorageManager.GetDefaultSaveImage(ppbDataImage,pdwSizeImage); + } + } +} + +void CConsoleMinecraftApp::ReleaseSaveThumbnail() +{ + +} + +void CConsoleMinecraftApp::GetScreenshot(int iPad,PBYTE *pbData,DWORD *pdwSize) +{ + +} + +int CConsoleMinecraftApp::GetLocalTMSFileIndex(WCHAR *wchTMSFile,bool bFilenameIncludesExtension,eFileExtensionType eEXT) +{ + return -1; +} + + +int CConsoleMinecraftApp::LoadLocalTMSFile(WCHAR *wchTMSFile) +{ + return -1; +} + +int CConsoleMinecraftApp::LoadLocalTMSFile(WCHAR *wchTMSFile, eFileExtensionType eExt) +{ + return -1; +} + +void CConsoleMinecraftApp::FreeLocalTMSFiles(eTMSFileType eType) +{ + +} + +void CConsoleMinecraftApp::TemporaryCreateGameStart() +{ + ////////////////////////////////////////////////////////////////////////////////////////////// From CScene_Main::OnInit + + app.setLevelGenerationOptions(NULL); + + // From CScene_Main::RunPlayGame + Minecraft *pMinecraft=Minecraft::GetInstance(); + app.ReleaseSaveThumbnail(); + ProfileManager.SetLockedProfile(0); + pMinecraft->user->name = L"Vita"; + app.ApplyGameSettingsChanged(0); + + ////////////////////////////////////////////////////////////////////////////////////////////// From CScene_MultiGameJoinLoad::OnInit + MinecraftServer::resetFlags(); + + // From CScene_MultiGameJoinLoad::OnNotifyPressEx + app.SetTutorialMode( false ); + app.SetCorruptSaveDeleted(false); + + ////////////////////////////////////////////////////////////////////////////////////////////// From CScene_MultiGameCreate::CreateGame + + app.ClearTerrainFeaturePosition(); + wstring wWorldName = L"TestWorld"; + + bool isFlat = false; + __int64 seedValue = 0;//BiomeSource::findSeed(isFlat?LevelType::lvl_flat:LevelType::lvl_normal); // 4J - was (new Random())->nextLong() - now trying to actually find a seed to suit our requirements + + NetworkGameInitData *param = new NetworkGameInitData(); + param->seed = seedValue; + param->saveData = NULL; + + g_NetworkManager.HostGame(0,false,true,MINECRAFT_NET_MAX_PLAYERS,0); + + app.SetGameHostOption(eGameHostOption_Difficulty,0); + app.SetGameHostOption(eGameHostOption_FriendsOfFriends,0); + app.SetGameHostOption(eGameHostOption_Gamertags,1); + app.SetGameHostOption(eGameHostOption_BedrockFog,1); + + app.SetGameHostOption(eGameHostOption_GameType,GameType::CREATIVE->getId()); + app.SetGameHostOption(eGameHostOption_LevelType, 0 ); + app.SetGameHostOption(eGameHostOption_Structures, 1 ); + app.SetGameHostOption(eGameHostOption_BonusChest, 0 ); + + app.SetGameHostOption(eGameHostOption_PvP, 1); + app.SetGameHostOption(eGameHostOption_TrustPlayers, 1 ); + app.SetGameHostOption(eGameHostOption_FireSpreads, 1 ); + app.SetGameHostOption(eGameHostOption_TNT, 1 ); + app.SetGameHostOption(eGameHostOption_HostCanFly, 1); + app.SetGameHostOption(eGameHostOption_HostCanChangeHunger, 1); + app.SetGameHostOption(eGameHostOption_HostCanBeInvisible, 1 ); + + app.SetGameHostOption(eGameHostOption_MobGriefing, 1 ); + app.SetGameHostOption(eGameHostOption_KeepInventory, 0 ); + app.SetGameHostOption(eGameHostOption_DoMobSpawning, 1 ); + app.SetGameHostOption(eGameHostOption_DoMobLoot, 1 ); + app.SetGameHostOption(eGameHostOption_DoTileDrops, 1 ); + app.SetGameHostOption(eGameHostOption_NaturalRegeneration, 1 ); + app.SetGameHostOption(eGameHostOption_DoDaylightCycle, 1 ); + + param->settings = app.GetGameHostOption( eGameHostOption_All ); + + g_NetworkManager.FakeLocalPlayerJoined(); + + LoadingInputParams *loadingParams = new LoadingInputParams(); + loadingParams->func = &CGameNetworkManager::RunNetworkGameThreadProc; + loadingParams->lpParam = (LPVOID)param; + + // Reset the autosave time + app.SetAutosaveTimerTime(); + + C4JThread* thread = new C4JThread(loadingParams->func, loadingParams->lpParam, "RunNetworkGame"); + thread->Run(); +} + + +// COMMERCE / DLC + +void CConsoleMinecraftApp::CommerceInit() +{ + m_bCommerceCategoriesRetrieved=false; + m_bCommerceProductListRetrieved=false; + m_bCommerceInitialised=false; + m_bProductListAdditionalDetailsRetrieved=false; +#ifdef VITA_COMMERCE_ENABLED + m_pCommerce= new SonyCommerce_Vita; +#endif + m_eCommerce_State=eCommerce_State_Offline; // can only init when we have a PSN user + m_ProductListRetrievedC=0; + m_ProductListAdditionalDetailsC=0; + m_ProductListCategoriesC=0; + m_iCurrentCategory=0; + m_iCurrentProduct=0; + memset(m_pchSkuID,0,48); +} + +void CConsoleMinecraftApp::CommerceTick() +{ +#ifdef VITA_COMMERCE_ENABLED + // only tick this if the primary user is signed in to the PSN + if(ProfileManager.IsSignedInLive(0)) + { + switch(m_eCommerce_State) + { + case eCommerce_State_Offline: + m_eCommerce_State=eCommerce_State_Init; + break; + case eCommerce_State_Init: + m_eCommerce_State=eCommerce_State_Init_Pending; + m_pCommerce->CreateSession(&CConsoleMinecraftApp::CommerceInitCallback, this); + break; + case eCommerce_State_GetCategories: + m_eCommerce_State=eCommerce_State_GetCategories_Pending; + // get all categories for this product + m_pCommerce->GetCategoryInfo(&CConsoleMinecraftApp::CommerceGetCategoriesCallback, this, &m_CategoryInfo,app.GetCommerceCategory()); + + break; + case eCommerce_State_GetProductList: + { + m_eCommerce_State=eCommerce_State_GetProductList_Pending; + SonyCommerce::CategoryInfo *pCategories=app.GetCategoryInfo(); + std::list::iterator iter = pCategories->subCategories.begin(); + + for(int i=0;iGetProductList(&CConsoleMinecraftApp::CommerceGetProductListCallback, this, &m_ProductListA[m_ProductListRetrievedC],category.categoryId); + } + + break; + case eCommerce_State_AddProductInfoDetailed: + { + m_eCommerce_State=eCommerce_State_AddProductInfoDetailed_Pending; + + // for each of the products in the categories, get the detailed info. We really only need the long description and price info. + SonyCommerce::CategoryInfo *pCategories=app.GetCategoryInfo(); + std::list::iterator iter = pCategories->subCategories.begin(); + for(int i=0;i*pvProductList=&m_ProductListA[m_iCurrentCategory]; + + // 4J-PB - there may be no products in the category + if(pvProductList->size()==0) + { + CConsoleMinecraftApp::CommerceAddDetailedProductInfoCallback(this,0); + } + else + { + assert(pvProductList->size() > m_iCurrentProduct); + SonyCommerce::ProductInfo *pProductInfo=&(pvProductList->at(m_iCurrentProduct)); + m_pCommerce->AddDetailedProductInfo(&CConsoleMinecraftApp::CommerceAddDetailedProductInfoCallback, this, pProductInfo,pProductInfo->productId,category.categoryId); + } + } + break; + case eCommerce_State_Checkout: + m_pCommerce->CreateSession(&CConsoleMinecraftApp::CheckoutSessionStartedCallback, this); + m_eCommerce_State=eCommerce_State_Checkout_WaitingForSession; + break; + case eCommerce_State_Checkout_SessionStarted: + m_eCommerce_State=eCommerce_State_Checkout_Pending; + ((SonyCommerce_Vita*)m_pCommerce)->Checkout(&CConsoleMinecraftApp::CommerceCheckoutCallback, this,m_pCheckoutProductInfo); + break; + + case eCommerce_State_RegisterDLC: + { + m_eCommerce_State=eCommerce_State_Online; + // register the DLC info + SonyCommerce::CategoryInfo *pCategories=app.GetCategoryInfo(); + std::list::iterator iter = pCategories->subCategories.begin(); + for(int i=0;i*pvProductList=&m_ProductListA[i]; + for(int j=0;jsize();j++) + { + SonyCommerce::ProductInfo *pProductInfo=&(pvProductList->at(j)); + // just want the final 16 characters of the product id + RegisterDLCData(&pProductInfo->productId[20],0,pProductInfo->imageUrl); + } + iter++; + } + } + break; + + case eCommerce_State_DownloadAlreadyPurchased: + m_pCommerce->CreateSession(&CConsoleMinecraftApp::DownloadAlreadyPurchasedSessionStartedCallback, this); + m_eCommerce_State=eCommerce_State_DownloadAlreadyPurchased_WaitingForSession; + break; + case eCommerce_State_DownloadAlreadyPurchased_SessionStarted: + m_eCommerce_State=eCommerce_State_DownloadAlreadyPurchased_Pending; + m_pCommerce->DownloadAlreadyPurchased(&CConsoleMinecraftApp::CommerceCheckoutCallback, this,m_pchSkuID); + break; + + + case eCommerce_State_UpgradeTrial: + m_pCommerce->CreateSession(&CConsoleMinecraftApp::UpgradeTrialSessionStartedCallback, this); + m_eCommerce_State=eCommerce_State_UpgradeTrial_WaitingForSession; + break; + case eCommerce_State_UpgradeTrial_SessionStarted: + m_pCommerce->UpgradeTrial(&CConsoleMinecraftApp::CommerceCheckoutCallback, this); + m_eCommerce_State=eCommerce_State_UpgradeTrial_Pending; + break; + } + + // 4J-PB - bit of a hack to display the full version purchase after signing in during a trial trophy popup + if(m_bDisplayFullVersionPurchase && ((m_eCommerce_State==eCommerce_State_Online) || (m_eCommerce_State==eCommerce_State_Error))) + { + m_bDisplayFullVersionPurchase=false; + ProfileManager.DisplayFullVersionPurchase(false,ProfileManager.GetPrimaryPad(),eSen_UpsellID_Full_Version_Of_Game); + } + } + else + { + // was the primary player signed in and is now signed out? + if(m_eCommerce_State!=eCommerce_State_Offline) + { + m_eCommerce_State=eCommerce_State_Offline; + + // clear out all the product info + ClearCommerceDetails(); + + m_pCommerce->CloseSession(); + } + } +#endif // VITA_COMMERCE_ENABLED +} + +bool CConsoleMinecraftApp::GetCommerceCategoriesRetrieved() +{ + return m_bCommerceCategoriesRetrieved; +} + +bool CConsoleMinecraftApp::GetCommerceProductListRetrieved() +{ + return m_bCommerceProductListRetrieved; +} + +bool CConsoleMinecraftApp::GetCommerceProductListInfoRetrieved() +{ + return m_bProductListAdditionalDetailsRetrieved; +} + +#ifdef VITA_COMMERCE_ENABLED +SonyCommerce::CategoryInfo *CConsoleMinecraftApp::GetCategoryInfo() +{ + if(m_bCommerceCategoriesRetrieved==false) + { + return NULL; + } + + return &m_CategoryInfo; +} +#endif + +void CConsoleMinecraftApp::ClearCommerceDetails() +{ +#ifdef VITA_COMMERCE_ENABLED + for(int i=0;i* pProductList=&m_ProductListA[i]; + pProductList->clear(); + } + + if(m_ProductListA!=NULL) + { + delete [] m_ProductListA; + m_ProductListA=NULL; + } + + m_ProductListRetrievedC=0; + m_ProductListAdditionalDetailsC=0; + m_ProductListCategoriesC=0; + m_iCurrentCategory=0; + m_iCurrentProduct=0; + m_bCommerceCategoriesRetrieved=false; + m_bCommerceInitialised=false; + m_bCommerceProductListRetrieved=false; + m_bProductListAdditionalDetailsRetrieved=false; + + m_CategoryInfo.subCategories.clear(); +#endif // #ifdef VITA_COMMERCE_ENABLED + +} + + +void CConsoleMinecraftApp::GetDLCSkuIDFromProductList(char * pchDLCProductID, char *pchSkuID) +{ +#ifdef VITA_COMMERCE_ENABLED + + // find the DLC + for(int i=0;i* pProductList=&m_ProductListA[i]; + AUTO_VAR(itEnd, pProductList->end()); + + for (AUTO_VAR(it, pProductList->begin()); it != itEnd; it++) + { + SonyCommerce::ProductInfo Info=*it; + if(strcmp(pchDLCProductID,Info.productId)==0) + { + memcpy(pchSkuID,Info.skuId,SCE_NP_COMMERCE2_SKU_ID_LEN); + return; + } + } + } + } + return; +#endif // #ifdef VITA_COMMERCE_ENABLED + +} + +void CConsoleMinecraftApp::Checkout(char *pchSkuID) +{ + SonyCommerce::ProductInfo* productInfo = NULL; + + for(int i=0;i* pProductList=&m_ProductListA[i]; + AUTO_VAR(itEnd, pProductList->end()); + + for (AUTO_VAR(it, pProductList->begin()); it != itEnd; it++) + { + SonyCommerce::ProductInfo Info=*it; + if(strcmp(pchSkuID,Info.skuId)==0) + { + productInfo = &(*it); + break; + } + } + } + } + + if(productInfo) + { + if(m_eCommerce_State==eCommerce_State_Online) + { + strcpy(m_pchSkuID,productInfo->skuId); + m_pCheckoutProductInfo = productInfo; + m_eCommerce_State=eCommerce_State_Checkout; + } + } + else + { + assert(0); + } +} + +void CConsoleMinecraftApp::DownloadAlreadyPurchased(char *pchSkuID) +{ + if(m_eCommerce_State==eCommerce_State_Online) + { + strcpy(m_pchSkuID,pchSkuID); + m_eCommerce_State=eCommerce_State_DownloadAlreadyPurchased; + } +} + +bool CConsoleMinecraftApp::UpgradeTrial() +{ + if(m_eCommerce_State==eCommerce_State_Online) + { + m_eCommerce_State=eCommerce_State_UpgradeTrial; + return true; + } + else if(m_eCommerce_State==eCommerce_State_Error) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + C4JStorage::EMessageResult result = ui.RequestErrorMessage( IDS_PRO_UNLOCKGAME_TITLE, IDS_NO_DLCOFFERS, uiIDA,1,ProfileManager.GetPrimaryPad()); + return true; + } + else + { + // commerce is busy + return false; + } +} + +#ifdef VITA_COMMERCE_ENABLED +std::vector* CConsoleMinecraftApp::GetProductList(int iIndex) +{ + if((m_bCommerceProductListRetrieved==false) || (m_bProductListAdditionalDetailsRetrieved==false) ) + { + return NULL; + } + + return &m_ProductListA[iIndex]; +} +#endif // #ifdef VITA_COMMERCE_ENABLED + +bool CConsoleMinecraftApp::DLCAlreadyPurchased(char *pchTitle) +{ +#ifdef VITA_COMMERCE_ENABLED + // find the DLC + for(int i=0;i* pProductList=&m_ProductListA[i]; + AUTO_VAR(itEnd, pProductList->end()); + + for (AUTO_VAR(it, pProductList->begin()); it != itEnd; it++) + { + SonyCommerce::ProductInfo Info=*it; + if(strcmp(pchTitle,Info.skuId)==0) + { + if(Info.purchasabilityFlag==SCE_TOOLKIT_NP_COMMERCE_NOT_PURCHASED) + { + return false; + } + else + { + return true; + } + } + } + } + } +#endif //#ifdef VITA_COMMERCE_ENABLED + return false; +} + + + +//////////////////// +// Commerce callbacks +///////////////////// +void CConsoleMinecraftApp::CommerceInitCallback(LPVOID lpParam,int err) +{ + CConsoleMinecraftApp *pClass=(CConsoleMinecraftApp *)lpParam; + + if(err==0) + { + pClass->m_eCommerce_State=eCommerce_State_GetCategories; + } + else + { + pClass->m_eCommerce_State=eCommerce_State_Error; + pClass->m_ProductListCategoriesC=0; + pClass->m_bCommerceCategoriesRetrieved=true; + } +} + + +void CConsoleMinecraftApp::CommerceGetCategoriesCallback(LPVOID lpParam,int err) +{ +#ifdef VITA_COMMERCE_ENABLED + CConsoleMinecraftApp *pClass=(CConsoleMinecraftApp *)lpParam; + + if(err==0) + { + pClass->m_ProductListCategoriesC=pClass->m_CategoryInfo.countOfSubCategories; + // allocate the memory for the product info for each categories + if(pClass->m_CategoryInfo.countOfSubCategories>0) + { + pClass->m_ProductListA = (std::vector *) new std::vector [pClass->m_CategoryInfo.countOfSubCategories]; + pClass->m_eCommerce_State=eCommerce_State_GetProductList; + } + else + { + pClass->m_eCommerce_State=eCommerce_State_Online; + } + } + else + { + pClass->m_ProductListCategoriesC=0; + pClass->m_eCommerce_State=eCommerce_State_Error; + } + + pClass->m_bCommerceCategoriesRetrieved=true; +#endif // #ifdef VITA_COMMERCE_ENABLED + +} + +void CConsoleMinecraftApp::CommerceGetProductListCallback(LPVOID lpParam,int err) +{ + CConsoleMinecraftApp *pClass=(CConsoleMinecraftApp *)lpParam; + + if(err==0) + { + pClass->m_ProductListRetrievedC++; + // if we have more info to get, keep going with the next call + if(pClass->m_ProductListRetrievedC==pClass->m_CategoryInfo.countOfSubCategories) + { + // we're done, so now retrieve the additional product details for each product + pClass->m_eCommerce_State=eCommerce_State_AddProductInfoDetailed; + pClass->m_bCommerceProductListRetrieved=true; + } + else + { + pClass->m_eCommerce_State=eCommerce_State_GetProductList; + } + } + else + { + pClass->m_eCommerce_State=eCommerce_State_Error; + pClass->m_bCommerceProductListRetrieved=true; + } +} + +// void CConsoleMinecraftApp::CommerceGetDetailedProductInfoCallback(LPVOID lpParam,int err) +// { +// CConsoleMinecraftApp *pScene=(CConsoleMinecraftApp *)lpParam; +// +// if(err==0) +// { +// pScene->m_eCommerce_State=eCommerce_State_Idle; +// //pScene->m_bCommerceProductListRetrieved=true; +// } +// //printf("Callback hit, error 0x%08x\n", err); +// +// } + +void CConsoleMinecraftApp::CommerceAddDetailedProductInfoCallback(LPVOID lpParam,int err) +{ +#ifdef VITA_COMMERCE_ENABLED + CConsoleMinecraftApp *pClass=(CConsoleMinecraftApp *)lpParam; + + if(err==0) + { + // increment the current product counter. When this gets to the end of the products, move to the next category + pClass->m_iCurrentProduct++; + + std::vector*pvProductList=&pClass->m_ProductListA[pClass->m_iCurrentCategory]; + + // if there are no more products in this category, move to the next category (there may be no products in the category) + if(pClass->m_iCurrentProduct>=pvProductList->size()) + { + // MGH - change this to a while loop so we can skip empty categories. + do + { + pClass->m_iCurrentCategory++; + }while(pClass->m_ProductListA[pClass->m_iCurrentCategory].size() == 0 && pClass->m_iCurrentCategorym_ProductListCategoriesC); + + pClass->m_iCurrentProduct=0; + if(pClass->m_iCurrentCategory==pClass->m_ProductListCategoriesC) + { + // there are no more categories, so we're done + pClass->m_eCommerce_State=eCommerce_State_RegisterDLC; + pClass->m_bProductListAdditionalDetailsRetrieved=true; + } + else + { + // continue with the next category + pClass->m_eCommerce_State=eCommerce_State_AddProductInfoDetailed; + } + } + else + { + // continue with the next product + pClass->m_eCommerce_State=eCommerce_State_AddProductInfoDetailed; + } + } + else + { + pClass->m_eCommerce_State=eCommerce_State_Error; + pClass->m_bProductListAdditionalDetailsRetrieved=true; + pClass->m_iCurrentProduct=0; + pClass->m_iCurrentCategory=0; + } + +#endif //#ifdef VITA_COMMERCE_ENABLED + +} + +void CConsoleMinecraftApp::CommerceCheckoutCallback(LPVOID lpParam,int err) +{ + CConsoleMinecraftApp *pClass=(CConsoleMinecraftApp *)lpParam; + + if(err==0) + { + } + pClass->m_eCommerce_State=eCommerce_State_Online; +} + +void CConsoleMinecraftApp::CheckoutSessionStartedCallback(LPVOID lpParam,int err) +{ + CConsoleMinecraftApp *pClass=(CConsoleMinecraftApp *)lpParam; + if(err==0) + pClass->m_eCommerce_State=eCommerce_State_Checkout_SessionStarted; + else + pClass->m_eCommerce_State=eCommerce_State_Error; +} + +void CConsoleMinecraftApp::DownloadAlreadyPurchasedSessionStartedCallback(LPVOID lpParam,int err) +{ + CConsoleMinecraftApp *pClass=(CConsoleMinecraftApp *)lpParam; + if(err==0) + pClass->m_eCommerce_State=eCommerce_State_DownloadAlreadyPurchased_SessionStarted; + else + pClass->m_eCommerce_State=eCommerce_State_Error; +} + +void CConsoleMinecraftApp::UpgradeTrialSessionStartedCallback(LPVOID lpParam,int err) +{ + CConsoleMinecraftApp *pClass=(CConsoleMinecraftApp *)lpParam; + if(err==0) + pClass->m_eCommerce_State=eCommerce_State_UpgradeTrial_SessionStarted; + else + pClass->m_eCommerce_State=eCommerce_State_Error; +} + + +bool CConsoleMinecraftApp::GetTrialFromName(char *pchDLCName) +{ + if(pchDLCName[0]=='T') + { + return true; + } + + return false; +} + +eDLCContentType CConsoleMinecraftApp::GetDLCTypeFromName(char *pchDLCName) +{ + char chDLCType[3]; + + chDLCType[0]=pchDLCName[1]; + chDLCType[1]=pchDLCName[2]; + chDLCType[2]=0; + + app.DebugPrintf(6,"DLC - %s\n",pchDLCName); + + if(strcmp(chDLCType,"SP")==0) + { + return e_DLC_SkinPack; + } + else if(strcmp(chDLCType,"GP")==0) + { + return e_DLC_Gamerpics; + } + else if(strcmp(chDLCType,"TH")==0) + { + return e_DLC_Themes; + } + else if(strcmp(chDLCType,"AV")==0) + { + return e_DLC_AvatarItems; + } + else if(strcmp(chDLCType,"MP")==0) + { + return e_DLC_MashupPacks; + } + else if(strcmp(chDLCType,"TP")==0) + { + return e_DLC_TexturePacks; + } + else + { + return e_DLC_NotDefined; + } +} + +int CConsoleMinecraftApp::GetiConfigFromName(char *pchName) +{ + char pchiConfig[5]; + int iStrlen=strlen(pchName); + // last four character of DLC product name are the iConfig value + pchiConfig[0]=pchName[iStrlen-4]; + pchiConfig[1]=pchName[iStrlen-3]; + pchiConfig[2]=pchName[iStrlen-2]; + pchiConfig[3]=pchName[iStrlen-1]; + pchiConfig[4]=0; + + return atoi(pchiConfig); +} + +int CConsoleMinecraftApp::GetiFirstSkinFromName(char *pchName) +{ + char pchiFirstSkin[5]; + int iStrlen=strlen(pchName); + // last four character of DLC product name are the iConfig value + // four before that are the first skin id + pchiFirstSkin[0]=pchName[iStrlen-8]; + pchiFirstSkin[1]=pchName[iStrlen-7]; + pchiFirstSkin[2]=pchName[iStrlen-6]; + pchiFirstSkin[3]=pchName[iStrlen-5]; + pchiFirstSkin[4]=0; + + return atoi(pchiFirstSkin); +} + +// void CConsoleMinecraftApp::SetVoiceChatAndUGCRestricted(bool bRestricted) +//{ +// m_bVoiceChatAndUGCRestricted=bRestricted; +//} + +// bool CConsoleMinecraftApp::GetVoiceChatAndUGCRestricted(void) +//{ +// return m_bVoiceChatAndUGCRestricted; +//} + + +int CConsoleMinecraftApp::GetCommerceState() +{ + return m_eCommerce_State; +} + +// bool g_bCalledJoin = false; +void CConsoleMinecraftApp::AppEventTick() +{ + int res = SCE_OK; + SceAppMgrAppState appStatus; + res = sceAppMgrGetAppState(&appStatus); + +// if(!g_bCalledJoin) +// { +// SceAppUtilNpBasicJoinablePresenceParam joinParam = {0}; +// strcpy(joinParam.npId.handle.data, "Mark4J"); +// SQRNetworkManager_Vita::GetJoinablePresenceDataAndProcess(&joinParam); +// } + if(res == SCE_OK) + { + if (appStatus.appEventNum > 0) + { + SceAppUtilAppEventParam eventParam; + memset(&eventParam, 0, sizeof(SceAppUtilAppEventParam)); + res = sceAppUtilReceiveAppEvent(&eventParam); + if (res == SCE_OK) + { + if (SCE_APPUTIL_APPEVENT_TYPE_NP_APP_DATA_MESSAGE == eventParam.type) + { + PSVitaNPToolkit::getMessageData(&eventParam); + // Messaging::Interface::retrieveMessageAttachment(&eventParam,&s_attachment); + } + else if(SCE_APPUTIL_APPEVENT_TYPE_NP_BASIC_JOINABLE_PRESENCE == eventParam.type) + { + PSVitaNPToolkit::getMessageData(&eventParam); + } + else + { + app.DebugPrintf("unknown app event : 0x%08x\n", eventParam.type); + assert(0); + } + } + } + + if (appStatus.systemEventNum > 0) + { + SceAppMgrSystemEvent systemEvent; + memset(&systemEvent, 0, sizeof(SceAppMgrSystemEvent)); + res = sceAppMgrReceiveSystemEvent( &systemEvent ); + if (res == SCE_OK) + { + switch(systemEvent.systemEvent) + { + case SCE_APPMGR_SYSTEMEVENT_ON_STORE_PURCHASE: + SonyCommerce_Vita::checkBackgroundDownloadStatus(); + break; + case SCE_APPMGR_SYSTEMEVENT_ON_RESUME: + app.DebugPrintf("SCE_APPMGR_SYSTEMEVENT_ON_RESUME event received\n"); + break; + + case SCE_APPMGR_SYSTEMEVENT_ON_NP_MESSAGE_ARRIVED: + app.DebugPrintf("SCE_APPMGR_SYSTEMEVENT_ON_NP_MESSAGE_ARRIVED event received\n"); + break; + case SCE_APPMGR_SYSTEMEVENT_ON_STORE_REDEMPTION: + app.DebugPrintf("SCE_APPMGR_SYSTEMEVENT_ON_STORE_REDEMPTION event received\n"); + break; + default: + app.DebugPrintf("unknown sys event : 0x%08x\n", systemEvent.systemEvent); + assert(0); + break; + } + } + } + } +} + + +bool CConsoleMinecraftApp::CheckForEmptyStore(int iPad) +{ + SonyCommerce::CategoryInfo *pCategories=app.GetCategoryInfo(); + + bool bEmptyStore=true; + if(pCategories!=NULL) + { + if(pCategories->countOfProducts>0) + { + bEmptyStore=false; + } + else + { + for(int i=0;icountOfSubCategories;i++) + { + std::vector*pvProductInfo=app.GetProductList(i); + if(pvProductInfo->size()>0) + { + bEmptyStore=false; + break; + } + } + } + } + + if(bEmptyStore) + { + ProfileManager.ShowSystemMessage( SCE_MSG_DIALOG_SYSMSG_TYPE_TRC_EMPTY_STORE, iPad ); + } + + return bEmptyStore; +} + + +void printSaveState() +{ +#ifndef _CONTENT_PACKAGE + string strState; + switch (StorageManager.GetSaveState()) + { + case C4JStorage::ESaveGame_Idle: strState = "ESaveGame_Idle"; break; + case C4JStorage::ESaveGame_Save: strState = "ESaveGame_Save"; break; + case C4JStorage::ESaveGame_SaveCompleteSuccess: strState = "ESaveGame_SaveCompleteSuccess"; break; + case C4JStorage::ESaveGame_SaveCompleteFail: strState = "ESaveGame_SaveCompleteFail"; break; + case C4JStorage::ESaveGame_SaveIncomplete: strState = "ESaveGame_SaveIncomplete"; break; + case C4JStorage::ESaveGame_SaveIncomplete_WaitingOnResponse: strState = "ESaveGame_SaveIncomplete_WaitingOnResponse"; break; + case C4JStorage::ESaveGame_Load: strState = "ESaveGame_Load"; break; + case C4JStorage::ESaveGame_LoadCompleteSuccess: strState = "ESaveGame_LoadCompleteSuccess"; break; + case C4JStorage::ESaveGame_LoadCompleteFail: strState = "ESaveGame_LoadCompleteFail"; break; + case C4JStorage::ESaveGame_Delete: strState = "ESaveGame_Delete"; break; + case C4JStorage::ESaveGame_DeleteSuccess: strState = "ESaveGame_DeleteSuccess"; break; + case C4JStorage::ESaveGame_DeleteFail: strState = "ESaveGame_DeleteFail"; break; + case C4JStorage::ESaveGame_Rename: strState = "ESaveGame_Rename"; break; + case C4JStorage::ESaveGame_RenameSuccess: strState = "ESaveGame_RenameSuccess"; break; + case C4JStorage::ESaveGame_RenameFail: strState = "ESaveGame_RenameFail"; break; + case C4JStorage::ESaveGame_GetSaveThumbnail: strState = "ESaveGame_GetSaveThumbnail"; break; + case C4JStorage::ESaveGame_GetSaveInfo: strState = "ESaveGame_GetSaveInfo"; break; + case C4JStorage::ESaveGame_SaveCache: strState = "ESaveGame_SaveCache"; break; + case C4JStorage::ESaveGame_ReconstructCache: strState = "ESaveGame_ReconstructCache"; break; + } + + app.DebugPrintf("[printSaveState] GetSaveState == %s.\n", strState.c_str()); +#endif +} + + +void CConsoleMinecraftApp::SaveDataTick() +{ + //CD - We must check the savedata for odd failures that require messages + //CD - This is based on the Orbis and Durango code and solves TRC issue + + //Are there any errors? + //SaveData? + + if (m_bSaveIncompleteDialogRunning) + { + updateSaveIncompleteDialog(); + return; + } + + if (sceSaveDataDialogGetStatus() != SCE_COMMON_DIALOG_STATUS_NONE) + { + updateSaveDataDeleteDialog(); + } + + switch (m_bSaveDataDeleteDialogState) + { + case eSaveDataDeleteState_idle: + return; + + case eSaveDataDeleteState_waitingForUser: + case eSaveDataDeleteState_userConfirmation: + case eSaveDataDeleteState_deleting: + return; + + case eSaveDataDeleteState_abort: + case eSaveDataDeleteState_continue: + { + C4JStorage::ESaveGameState eGameState = StorageManager.GetSaveState(); + printSaveState(); + + if (eGameState == C4JStorage::ESaveGame_SaveIncomplete_WaitingOnResponse) + { + if (m_bSaveDataDeleteDialogState == eSaveDataDeleteState_abort) + { + app.DebugPrintf("[SaveDataTick] eSaveDataDeleteState_abort.\n"); + StorageManager.CancelIncompleteOperation(); + } + else if (m_bSaveDataDeleteDialogState == eSaveDataDeleteState_continue) + { + app.DebugPrintf("[SaveDataTick] eSaveDataDeleteState_continue.\n"); + StorageManager.ContinueIncompleteOperation(); + } + } + else if (eGameState == C4JStorage::ESaveGame_Idle) + { + app.DebugPrintf("[SaveDataTick] Storage Manager is idle, SaveDataDialog reverting to idle state too.\n"); + } + + m_bSaveDataDeleteDialogState = eSaveDataDeleteState_idle; + } + return; + } + + +#if 0 + C4JStorage::ESaveIncompleteType errorType = StorageManager.GetSaveError(); + if (errorType == C4JStorage::ESaveIncomplete_None) errorType = StorageManager.GetOptionsSaveError(); + + if (errorType == C4JStorage::ESaveIncomplete_OutOfQuota) + { + initSaveDataDeleteDialog(); + } + else if (errorType == C4JStorage::ESaveIncomplete_OutOfLocalStorage) + { + //initSaveIncompleteDialog(1); + } + else if (errorType != C4JStorage::ESaveIncomplete_None) + { + app.DebugPrintf("[SaveDataTick] Unknown save error from StorageManager.\n"); + } + + + //TRC - Quota Failure + if( errorType == C4JStorage::ESaveIncomplete_OutOfQuota ) + { + 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()); + if( res != C4JStorage::EMessage_Busy ) + { + //Clear the error now it's been dealt with + StorageManager.ClearSaveError(); + StorageManager.ClearOptionsSaveError(); + } + } +#endif +} + +void CConsoleMinecraftApp::Callback_SaveGameIncomplete(void *pParam, C4JStorage::ESaveIncompleteType saveIncompleteType, int blocksRequired) +{ + app.DebugPrintf( + "[Callback_SaveGameIncomplete] saveIncompleteType=%i, blocksRequired=%i,\n", + saveIncompleteType, blocksRequired + ); + + if (saveIncompleteType == C4JStorage::ESaveIncomplete_OutOfQuota || saveIncompleteType == C4JStorage::ESaveIncomplete_OutOfLocalStorage) + { + 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 && !UIScene_LoadOrJoinMenu::isSaveTransferRunning()) // MGH - we won't try to save again during a save tranfer + { + int blocksRequired = (int)pParam; + if(blocksRequired > 0) + { + app.initSaveIncompleteDialog(blocksRequired); + } + else + { + app.initSaveDataDeleteDialog(); + } + } + else + { + StorageManager.CancelIncompleteOperation(); + StorageManager.ClearSaveError(); + StorageManager.ClearOptionsSaveError(); + } + + return 0; +} + +int CConsoleMinecraftApp::cbConfirmDeleteMessageBox(void *pParam, int iPad, const C4JStorage::EMessageResult result) +{ + CConsoleMinecraftApp *pClass = (CConsoleMinecraftApp*) pParam; + + if (pClass != NULL && pClass->m_pSaveToDelete != NULL) + { + if (result == C4JStorage::EMessage_ResultDecline) + { + pClass->m_bSaveDataDeleteDialogState = eSaveDataDeleteState_deleting; + C4JStorage::ESaveGameState eDeleteStatus = StorageManager.DeleteSaveData(pClass->m_pSaveToDelete, cbSaveDataDeleted, pClass); + } + else + { + pClass->initSaveDataDeleteDialog(); + } + } + else + { + pClass->initSaveDataDeleteDialog(); + + // 4J-JEV: This could leave the storage library in a waiting for user state. + //pClass->m_bSaveDataDeleteDialogState = eSaveDataDeleteState_idle; + } + return 0; +} + +void CConsoleMinecraftApp::initSaveIncompleteDialog(int spaceNeeded) +{ + SceSaveDataDialogParam param; + sceSaveDataDialogParamInit(¶m); + + SceSaveDataDialogSystemMessageParam sysParam; + ZeroMemory(&sysParam,sizeof(SceSaveDataDialogSystemMessageParam)); + param.sysMsgParam = &sysParam; + + param.mode = SCE_SAVEDATA_DIALOG_MODE_SYSTEM_MSG; + param.dispType = SCE_SAVEDATA_DIALOG_TYPE_SAVE; + + param.sysMsgParam->sysMsgType = SCE_SAVEDATA_DIALOG_SYSMSG_TYPE_NOSPACE_CONTINUABLE; + param.sysMsgParam->value = (SceInt32) spaceNeeded; + + SceInt32 ret = sceSaveDataDialogInit(¶m); + if (ret == SCE_OK) + { + m_bSaveIncompleteDialogRunning = true; + InputManager.SetMenuDisplayed(0,true); + ProfileManager.SetSysUIShowing(true); + ui.SetSysUIShowing(true); + } + else + { + app.DebugPrintf("[SaveDataIncompleteDialog] ERROR: INITIALISING DIALOG, sceSaveDataDialogInit() (0x%x).\n", ret); + } + +} + +void CConsoleMinecraftApp::updateSaveIncompleteDialog() +{ + SceCommonDialogStatus dialogStatus = sceSaveDataDialogGetStatus(); + if (dialogStatus == SCE_COMMON_DIALOG_STATUS_RUNNING) + { + SceCommonDialogStatus dialogSubStatus = sceSaveDataDialogGetSubStatus(); + + if (dialogSubStatus == SCE_COMMON_DIALOG_STATUS_RUNNING) + { + // Wait for user. + } + else if (dialogSubStatus == SCE_COMMON_DIALOG_STATUS_FINISHED) + { + SceSaveDataDialogFinishParam finishParam; + ZeroMemory(&finishParam, sizeof(SceSaveDataDialogFinishParam)); + finishParam.flag = SCE_SAVEDATA_DIALOG_FINISH_FLAG_DEFAULT; + + SceInt32 ret = sceSaveDataDialogFinish(&finishParam); + if (ret != SCE_OK) + { + app.DebugPrintf("[SaveDataIncompleteDialog] ERROR: UPDATING DIALOG, sceSaveDataDialogFinish() (0x%x).\n", ret); + } + } + } + else if (dialogStatus == SCE_COMMON_DIALOG_STATUS_FINISHED) + { + SceInt32 ret = sceSaveDataDialogTerm(); + if (ret == SCE_OK) + { + finishSaveIncompleteDialog(); + } + else + { + app.DebugPrintf("[SaveDataIncompleteDialog] ERROR: TERMINATING DIALOG, sceSaveDataDialogTerm() (0x%x).\n", ret); + } + } +} + +void CConsoleMinecraftApp::finishSaveIncompleteDialog() +{ + m_bSaveIncompleteDialogRunning = false; + InputManager.SetMenuDisplayed(0,false); + ProfileManager.SetSysUIShowing(false); + ui.SetSysUIShowing(false); + + StorageManager.ClearSaveError(); + StorageManager.ClearOptionsSaveError(); + + initSaveDataDeleteDialog(); +} + +void CConsoleMinecraftApp::initSaveDataDeleteDialog() +{ + SceSaveDataDialogParam param; + getSaveDataDeleteDialogParam( ¶m ); + + SceInt32 ret = sceSaveDataDialogInit(¶m); + if (ret == SCE_OK) + { + app.DebugPrintf("[SaveDataDeleteDialog] Successfully initialised SaveDataDelete dialog.\n"); + + m_bSaveDataDeleteDialogState = eSaveDataDeleteState_waitingForUser; + + InputManager.SetMenuDisplayed(0,true); + ProfileManager.SetSysUIShowing(true); + ui.SetSysUIShowing(true); + + // Start getting saves data to use when deleting. + if (StorageManager.ReturnSavesInfo() == NULL) + { + C4JStorage::ESaveGameState eSGIStatus + = StorageManager.GetSavesInfo( + ProfileManager.GetPrimaryPad(), + NULL, + this, + "save" + ); + } + + // Dim background because sony doesn't do that. + ui.showComponent(0, eUIComponent_MenuBackground, eUILayer_Tooltips, eUIGroup_Fullscreen, true); + + StorageManager.SetSaveDisabled(true); + EnterSaveNotificationSection(); + } + else + { + app.DebugPrintf("[SaveDataDeleteDialog] ERROR: INITIALISING DIALOG, sceSaveDataDialogInit() (0x%x).\n", ret); + } + + releaseSaveDataDeleteDialogParam( ¶m ); +} + +void CConsoleMinecraftApp::updateSaveDataDeleteDialog() +{ + SceCommonDialogStatus dialogStatus = sceSaveDataDialogGetStatus(); + if (dialogStatus == SCE_COMMON_DIALOG_STATUS_RUNNING) + { + SceCommonDialogStatus dialogSubStatus = sceSaveDataDialogGetSubStatus(); + + if (dialogSubStatus == SCE_COMMON_DIALOG_STATUS_RUNNING) + { + // Wait for user. + } + else if (dialogSubStatus == SCE_COMMON_DIALOG_STATUS_FINISHED) + { + SceSaveDataDialogResult dialogResult; + ZeroMemory(&dialogResult, sizeof(SceSaveDataDialogResult)); + + SceInt32 ret = sceSaveDataDialogGetResult(&dialogResult); + if (ret == SCE_OK) + { + bool finishDialog = false; + + if ( dialogResult.result == SCE_COMMON_DIALOG_RESULT_USER_CANCELED + || dialogResult.result == SCE_COMMON_DIALOG_RESULT_ABORTED ) + { + app.DebugPrintf("[SaveDataDeleteDialog] CANCELED OR ABORTED!\n"); + + // 4J-JEV: Check to ensure that finishedDeletingSaves is called only once. + if (m_bSaveDataDeleteDialogState == eSaveDataDeleteState_waitingForUser) + { + finishedDeletingSaves(false); + } + + finishDialog = true; + } + + if ( dialogResult.result == SCE_COMMON_DIALOG_RESULT_OK ) + { + SceAppUtilSaveDataSlotParam slotParam; + ret = sceAppUtilSaveDataSlotGetParam( dialogResult.slotId, &slotParam, NULL ); + + if (ret == SCE_OK) + { + int saveindex = -1; + PSAVE_INFO pSaveInfo = NULL; + PSAVE_DETAILS pSaveDetails = StorageManager.ReturnSavesInfo(); + + if (pSaveDetails != NULL) + { + app.DebugPrintf("[SaveDataDeleteDialog] Searching for save files:\n"); + + for (unsigned int i = 0; i < pSaveDetails->iSaveC; i++) + { + app.DebugPrintf("\t- '%s'\n", pSaveDetails->SaveInfoA[i].UTF8SaveFilename); + + void *buf1, *buf2; + buf1 = &(pSaveDetails->SaveInfoA[i].UTF8SaveFilename); + buf2 = &slotParam.title; + + if ( 0 == memcmp(buf1, buf2, MAX_SAVEFILENAME_LENGTH) ) + { + pSaveInfo = &pSaveDetails->SaveInfoA[i]; + saveindex = i; + break; + } + } + } + else + { + app.DebugPrintf("[SaveDataDeleteDialog] ERROR: PERFORMING DELETE OPERATION, pSavesDetails is null.\n"); + } + + if (pSaveInfo != NULL) + { + app.DebugPrintf( + "[SaveDataDeleteDialog] User wishes to delete slot_%d:\n\t" + "4jsaveindex=%d, filename='%s', title='%s', subtitle='%s', size=%dKiB.\n", + dialogResult.slotId, + saveindex, + pSaveInfo->UTF8SaveFilename, + slotParam.title, + slotParam.subTitle, + slotParam.sizeKiB + ); + + UINT uiIDA[] = + { + IDS_CONFIRM_CANCEL, + IDS_CONFIRM_OK + }; + + ui.RequestErrorMessage( + IDS_TOOLTIPS_DELETESAVE, IDS_TEXT_DELETE_SAVE, + uiIDA, 2, + 0, + &cbConfirmDeleteMessageBox, this + ); + + m_bSaveDataDeleteDialogState = eSaveDataDeleteState_userConfirmation; + + m_pSaveToDelete = pSaveInfo; + } + else + { + app.DebugPrintf( + "[SaveDataDeleteDialog] ERROR: PERFORMING DELETE OPERATION, cannot find file in our saves list:\n" + "\t slotId=%i, title=%s, subtitle=%s,\n", + dialogResult.slotId, slotParam.title, slotParam.subTitle + ); + } + + finishDialog = true; + } + else + { + app.DebugPrintf("[SaveDataDeleteDialog] ERROR: UPDATING DIALOG, sceAppUtilSaveDataGetParam() (0x%x).\n", ret); + } + } + + if (finishDialog) + { + SceSaveDataDialogFinishParam finishParam; + ZeroMemory(&finishParam, sizeof(SceSaveDataDialogFinishParam)); + finishParam.flag = SCE_SAVEDATA_DIALOG_FINISH_FLAG_DEFAULT; + + sceSaveDataDialogFinish(&finishParam); + if (ret == SCE_OK) app.DebugPrintf("[SaveDataDeleteDialog] Successfully finished saveDataDialog.\n"); + else app.DebugPrintf("[SaveDataDeleteDialog] ERROR: UPDATING DIALOG, sceSaveDataDialogFinish() (0x%x).\n", ret); + } + + } + else + { + app.DebugPrintf("[SaveDataDeleteDialog] ERROR: UPDATING DIALOG, sceSaveDataDialogGetResult() (0x%x).\n", ret); + } + } + } + else if (dialogStatus == SCE_COMMON_DIALOG_STATUS_FINISHED) + { + SceInt32 ret = sceSaveDataDialogTerm(); + if (ret == SCE_OK) + { + finishSaveDataDeleteDialog(); + } + else + { + app.DebugPrintf("[SaveDataDeleteDialog] ERROR: TERMINATING DIALOG, sceSaveDataDialogTerm() (0x%x).\n", ret); + } + } +} + +void CConsoleMinecraftApp::finishSaveDataDeleteDialog() +{ + ProfileManager.SetSysUIShowing(false); + InputManager.SetMenuDisplayed(0,false); + ui.SetSysUIShowing(false); + ui.removeComponent(eUIComponent_MenuBackground, eUILayer_Tooltips, eUIGroup_Fullscreen); +} + +void CConsoleMinecraftApp::getSaveDataDeleteDialogParam(SceSaveDataDialogParam *baseParam) +{ + sceSaveDataDialogParamInit(baseParam); + + static SceSaveDataDialogListParam listParam; + ZeroMemory(&listParam, sizeof(SceSaveDataDialogListParam)); + + { + vector slots; + for (unsigned int i = 2; i < SCE_APPUTIL_SAVEDATA_SLOT_MAX; i++) + { + SceAppUtilSaveDataSlotParam slotParam; + int ret = sceAppUtilSaveDataSlotGetParam( i, &slotParam, NULL ); + + if (ret == SCE_OK) + { + SceAppUtilSaveDataSlot slot; + ZeroMemory( &slot, sizeof(SceAppUtilSaveDataSlot) ); + + slot.id = i; + slot.status = slotParam.status; + slot.userParam = 0; + + slots.push_back( slot ); + } + } + + SceAppUtilSaveDataSlot *pSavesList = new SceAppUtilSaveDataSlot[slots.size()]; + + int slotIndex = 0; + + vector::iterator itr; + for (itr = slots.begin(); itr != slots.end(); itr++) + { + pSavesList[slotIndex] = *itr; + slotIndex++; + } + + listParam.slotListSize = slots.size(); + listParam.slotList = pSavesList; + } + + if (listParam.slotListSize > 0) listParam.focusPos = SCE_SAVEDATA_DIALOG_FOCUS_POS_LISTHEAD; + else listParam.focusPos = SCE_SAVEDATA_DIALOG_FOCUS_POS_EMPTYHEAD; + + // static SceCommonDialogColor s_bgColor, s_dColor; + // s_bgColor.r = s_dColor.r = 50; + // s_bgColor.g = s_dColor.g = 50; + // s_bgColor.b = s_dColor.b = 50; + // s_bgColor.a = s_dColor.a = 125; + // baseParam->commonParam.bgColor = &s_bgColor; + // baseParam->commonParam.dimmerColor = &s_dColor; + + + static uint8_t *strPtr = NULL; + if (strPtr != NULL) delete strPtr; + strPtr = mallocAndCreateUTF8ArrayFromString( IDS_TOOLTIPS_DELETESAVE ); + + listParam.listTitle = (const SceChar8 *) strPtr; + listParam.itemStyle = SCE_SAVEDATA_DIALOG_LIST_ITEM_STYLE_TITLE_SUBTITLE_DATE; + + baseParam->mode = SCE_SAVEDATA_DIALOG_MODE_LIST; + baseParam->dispType = SCE_SAVEDATA_DIALOG_TYPE_DELETE; + baseParam->listParam = &listParam; + + baseParam->flag = SCE_SAVEDATA_DIALOG_ENV_FLAG_DEFAULT; +} + +void CConsoleMinecraftApp::releaseSaveDataDeleteDialogParam(SceSaveDataDialogParam *baseParam) +{ + //delete baseParam->listParam; + //delete baseParam->commonParam.dimmerColor; + //delete baseParam->commonParam.bgColor; + //delete baseParam->listParam.listTitle; +} + +int CConsoleMinecraftApp::cbSaveDataDeleted( void *pParam, const bool success ) +{ + app.DebugPrintf("[SaveDataDeleteDialog] cbSaveDataDeleted(%s)\n", (success?"success":"fail")); + + CConsoleMinecraftApp *pApp = (CConsoleMinecraftApp*) pParam; + if ( pApp->m_bSaveDataDeleteDialogState == eSaveDataDeleteState_deleting ) + { + /* SceSaveDataDialogParam param; + pApp->getSaveDataDeleteDialogParam( ¶m ); + + SceInt32 ret = sceSaveDataDialogContinue(¶m); + if (ret != SCE_OK) app.DebugPrintf("[SaveDataDeleteDialog] ERROR: UPDATING DIALOG, sceSaveDataDialogContinue() (0x%x).\n", ret); + + pApp->m_bSaveDataDeleteDialogState = eSaveDataDeleteState_waitingForUser; + pApp->releaseSaveDataDeleteDialogParam( ¶m ); */ + + pApp->finishedDeletingSaves(true); + } + + return 0; +} + +void CConsoleMinecraftApp::finishedDeletingSaves(bool bContinue) +{ + app.DebugPrintf( "[finishedDeletingSaves] %s.\n", (bContinue?"Continuing":"Aborting") ); + + StorageManager.SetSaveDisabled(false); + LeaveSaveNotificationSection(); + + StorageManager.ClearSaveError(); + StorageManager.ClearOptionsSaveError(); + + + if (bContinue) m_bSaveDataDeleteDialogState = eSaveDataDeleteState_continue; + else m_bSaveDataDeleteDialogState = eSaveDataDeleteState_abort; +} \ No newline at end of file diff --git a/Minecraft.Client/PSVita/PSVita_App.h b/Minecraft.Client/PSVita/PSVita_App.h new file mode 100644 index 00000000..209fb91a --- /dev/null +++ b/Minecraft.Client/PSVita/PSVita_App.h @@ -0,0 +1,243 @@ +#pragma once + +class C4JStringTable; +//#include + +#include "..\..\Common\Network\Sony\SonyCommerce.h" +#include "..\..\Common\Network\Sony\SonyRemoteStorage.h" + +#define PRODUCT_CODE_SIZE 9 +#define SAVEFOLDERPREFIX_SIZE 10 +#define COMMERCE_CATEGORY_SIZE 19 +#define UPGRADE_KEY_SIZE 59 +#define SKU_POSTFIX_SIZE 4 + +enum EProductSKU +{ + e_sku_SCEE, + e_sku_SCEA, + e_sku_SCEJ +}; + +typedef struct +{ + char chProductCode[PRODUCT_CODE_SIZE+1]; + char chSaveFolderPrefix[SAVEFOLDERPREFIX_SIZE+1]; + char chDiscSaveFolderPrefix[SAVEFOLDERPREFIX_SIZE+1]; + char chCommerceCategory[COMMERCE_CATEGORY_SIZE+1]; +// char chTexturePackID[SCE_TOOLKIT_NP_COMMERCE_CATEGORY_ID_LEN+1]; + char chUpgradeKey[UPGRADE_KEY_SIZE+1]; + char chSkuPostfix[SKU_POSTFIX_SIZE+1]; + EProductSKU eProductSKU; +} +PRODUCTCODES; + +//class SonyRemoteStorage; + +// MGH - moved these to the storage lib, as we need this data when parsing the DLC folders +// enum e_SONYDLCType +// { +// eSONYDLCType_SkinPack=0, +// eSONYDLCType_TexturePack, +// eSONYDLCType_MashUpPack, +// eSONYDLCType_All +// }; +// +// typedef struct +// { +// char chDLCKeyname[16]; +// //char chDLCTitle[64]; +// e_SONYDLCType eDLCType; +// int iFirstSkin; +// int iConfig; // used for texture pack data files +// } +// SONYDLC; +// + +struct SceSaveDataDialogParam; + +class CConsoleMinecraftApp : public CMinecraftApp +{ + ImageFileBuffer m_ThumbnailBuffer; + ImageFileBuffer m_SaveImageBuffer; +public: + CConsoleMinecraftApp(); + + virtual void SetRichPresenceContext(int iPad, int contextId); + + virtual void StoreLaunchData(); + virtual void ExitGame(); + virtual void FatalLoadError(); + + virtual void CaptureSaveThumbnail(); + virtual void GetSaveThumbnail(PBYTE*,DWORD*) {}; // NOT USED + virtual void GetSaveThumbnail(PBYTE *ppbThumbnailData,DWORD *pdwThumbnailSize,PBYTE *ppbDataImage,DWORD *pdwSizeImage); + virtual void ReleaseSaveThumbnail(); + virtual void GetScreenshot(int iPad,PBYTE *pbData,DWORD *pdwSize); + + virtual int LoadLocalTMSFile(WCHAR *wchTMSFile); + virtual int LoadLocalTMSFile(WCHAR *wchTMSFile, eFileExtensionType eExt); + virtual void FreeLocalTMSFiles(eTMSFileType eType); + virtual int GetLocalTMSFileIndex(WCHAR *wchTMSFile,bool bFilenameIncludesExtension,eFileExtensionType eEXT=eFileExtensionType_PNG); + + // BANNED LEVEL LIST + virtual void ReadBannedList(int iPad, eTMSAction action=(eTMSAction)0, bool bCallback=false) {} + + C4JStringTable *GetStringTable() { return NULL;} + + // original code + virtual void TemporaryCreateGameStart(); + + + + + BOOL ReadProductCodes(); + char *GetProductCode(); + char *GetSaveFolderPrefix(); + char *GetCommerceCategory(); + char *GetTexturePacksCategoryID(); + char *GetUpgradeKey(); + EProductSKU GetProductSKU(); + bool IsJapaneseSKU(); + bool IsEuropeanSKU(); + bool IsAmericanSKU(); + //char *GetSKUPostfix(); + SONYDLC *GetSONYDLCInfo(char *pchTitle); + SONYDLC *GetSONYDLCInfo(int iTexturePackID); + + int GetiFirstSkinFromName(char *pchName); + int GetiConfigFromName(char *pchName); + eDLCContentType GetDLCTypeFromName(char *pchDLCName); + bool GetTrialFromName(char *pchDLCName); + + // PS3 COMMERCE + enum eUI_DLC_State + { + eCommerce_State_Offline, + eCommerce_State_Online, + eCommerce_State_Error, + eCommerce_State_Init, + eCommerce_State_Init_Pending, + eCommerce_State_GetCategories, + eCommerce_State_GetCategories_Pending, + eCommerce_State_GetProductList, + eCommerce_State_GetProductList_Pending, + eCommerce_State_AddProductInfoDetailed, + eCommerce_State_AddProductInfoDetailed_Pending, + eCommerce_State_RegisterDLC, + eCommerce_State_Checkout, + eCommerce_State_Checkout_WaitingForSession, + eCommerce_State_Checkout_SessionStarted, + eCommerce_State_Checkout_Pending, + eCommerce_State_DownloadAlreadyPurchased, + eCommerce_State_DownloadAlreadyPurchased_WaitingForSession, + eCommerce_State_DownloadAlreadyPurchased_SessionStarted, + eCommerce_State_DownloadAlreadyPurchased_Pending, + eCommerce_State_UpgradeTrial, + eCommerce_State_UpgradeTrial_WaitingForSession, + eCommerce_State_UpgradeTrial_SessionStarted, + eCommerce_State_UpgradeTrial_Pending, + }; + + void AppEventTick(); + + bool CheckForEmptyStore(int iPad); + + void CommerceInit(); + void CommerceTick(); + bool GetCommerceCategoriesRetrieved(); + bool GetCommerceProductListRetrieved(); + bool GetCommerceProductListInfoRetrieved(); + int GetCommerceState(); + SonyCommerce* GetCommerce() { return m_pCommerce; } + SonyCommerce::CategoryInfo *GetCategoryInfo(); + std::vector* GetProductList(int iIndex); // default to fail if the additional details are not retrieved + SonyCommerce::ProductInfoDetailed *GetProductInfoDetailed(); + void ClearCommerceDetails(); // wipe out details on a PSN sign out + void Checkout(char *pchSkuID); + void DownloadAlreadyPurchased(char *pchSkuID); + bool UpgradeTrial(); + bool DLCAlreadyPurchased(char *pchTitle); + char *GetSkuIDFromProductList(); + void GetDLCSkuIDFromProductList(char *,char *); + unordered_map* GetSonyDLCMap() { return &m_SONYDLCMap; } + static void CommerceInitCallback(LPVOID lpParam,int err); + static void CommerceGetCategoriesCallback(LPVOID lpParam,int err); + static void CommerceGetProductListCallback(LPVOID lpParam,int err); + // static void CommerceGetDetailedProductInfoCallback(LPVOID lpParam,int err); + static void CommerceAddDetailedProductInfoCallback(LPVOID lpParam,int err); + static void CommerceCheckoutCallback(LPVOID lpParam,int err); + + static void CheckoutSessionStartedCallback(LPVOID lpParam,int err); + static void DownloadAlreadyPurchasedSessionStartedCallback(LPVOID lpParam,int err); + static void UpgradeTrialSessionStartedCallback(LPVOID lpParam,int err); + + SonyRemoteStorage* getRemoteStorage() { return m_pRemoteStorage; } + + void SaveDataTick(); + static void Callback_SaveGameIncomplete(void *pParam, C4JStorage::ESaveIncompleteType saveIncompleteType, int blocksRequired); + static int NoSaveSpaceReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int cbConfirmDeleteMessageBox(void *pParam,int iPad,const C4JStorage::EMessageResult); + +private: + bool m_bSaveIncompleteDialogRunning; + + void initSaveIncompleteDialog(int spaceNeeded); + void updateSaveIncompleteDialog(); + void finishSaveIncompleteDialog(); + + enum ESaveDataDeleteDialogState + { + eSaveDataDeleteState_idle, + eSaveDataDeleteState_waitingForUser, + eSaveDataDeleteState_userConfirmation, + eSaveDataDeleteState_deleting, + + eSaveDataDeleteState_continue, + eSaveDataDeleteState_abort, + + } m_bSaveDataDeleteDialogState; + + void initSaveDataDeleteDialog(); + void updateSaveDataDeleteDialog(); + void finishSaveDataDeleteDialog(); + + void getSaveDataDeleteDialogParam(SceSaveDataDialogParam *baseParam); + void releaseSaveDataDeleteDialogParam(SceSaveDataDialogParam *baseParam); + + static int cbSaveDataDeleted(LPVOID pParam, const bool); + + PSAVE_INFO m_pSaveToDelete; + + void finishedDeletingSaves(bool bContinue); + + bool m_bCommerceCategoriesRetrieved; + bool m_bCommerceInitialised; + bool m_bCommerceProductListRetrieved; + bool m_bProductListAdditionalDetailsRetrieved; + char m_pchSkuID[SCE_NP_COMMERCE2_SKU_ID_LEN]; + + int m_eCommerce_State; + int m_ProductListRetrievedC; + int m_ProductListAdditionalDetailsC; + int m_ProductListCategoriesC; + int m_iCurrentCategory; + int m_iCurrentProduct; + + SonyCommerce *m_pCommerce; + SonyCommerce::CategoryInfo m_CategoryInfo; + std::vector* m_ProductListA; + SonyCommerce::ProductInfo* m_pCheckoutProductInfo; + // SonyCommerce::ProductInfoDetailed m_ProductInfoDetailed; + + PRODUCTCODES ProductCodes; + unordered_map m_SONYDLCMap; + + + bool m_bVoiceChatAndUGCRestricted; + SonyRemoteStorage* m_pRemoteStorage; + +}; + +extern CConsoleMinecraftApp app; + diff --git a/Minecraft.Client/PSVita/PSVita_Minecraft.cpp b/Minecraft.Client/PSVita/PSVita_Minecraft.cpp new file mode 100644 index 00000000..a82adf00 --- /dev/null +++ b/Minecraft.Client/PSVita/PSVita_Minecraft.cpp @@ -0,0 +1,1083 @@ +// Minecraft.cpp : Defines the entry point for the application. +// + +#include "stdafx.h" + +#include "Leaderboards\PSVitaLeaderboardManager.h" +#include "PSVita\PSVitaExtras\ShutdownManager.h" + +//#define HEAPINSPECTOR_PS3 1 +// when defining HEAPINSPECTOR_PS3, add this line to the linker settings +// --wrap malloc --wrap free --wrap memalign --wrap calloc --wrap realloc --wrap reallocalign --wrap _malloc_init + +#if HEAPINSPECTOR_PS3 +#include "HeapInspector\Server\HeapInspectorServer.h" +#include "HeapInspector\Server\PS3\HeapHooks.hpp" +#endif + +//#define DISABLE_MILES_SOUND + +#include "PSVita_App.h" +#include "PSVitaExtras\PSVitaStrings.h" +#include "GameConfig\Minecraft.spa.h" +#include "..\MinecraftServer.h" +#include "..\LocalPlayer.h" +#include "..\..\Minecraft.World\ItemInstance.h" +#include "..\..\Minecraft.World\MapItem.h" +#include "..\..\Minecraft.World\Recipes.h" +#include "..\..\Minecraft.World\Recipy.h" +#include "..\..\Minecraft.World\Language.h" +#include "..\..\Minecraft.World\StringHelpers.h" +#include "..\..\Minecraft.World\AABB.h" +#include "..\..\Minecraft.World\Vec3.h" +#include "..\..\Minecraft.World\Level.h" +#include "..\..\Minecraft.World\net.minecraft.world.level.tile.h" + +#include "..\ClientConnection.h" +#include "..\User.h" +#include "..\..\Minecraft.World\Socket.h" +#include "..\..\Minecraft.World\ThreadName.h" +#include "..\..\Minecraft.Client\StatsCounter.h" +#include "..\ConnectScreen.h" +//#include "Social\SocialManager.h" +//#include "Leaderboards\LeaderboardManager.h" +//#include "XUI\XUI_Scene_Container.h" +//#include "NetworkManager.h" +#include "..\..\Minecraft.Client\Tesselator.h" +#include "..\Common\Console_Awards_enum.h" +#include "..\..\Minecraft.Client\Options.h" +#include "Sentient\SentientManager.h" +#include "..\..\Minecraft.World\IntCache.h" +#include "..\Textures.h" +//#include "Resource.h" +#include "..\..\Minecraft.World\compression.h" +#include "..\..\Minecraft.World\OldChunkStorage.h" +//#include "PS3\PS3Extras\EdgeZLib.h" +#include "..\..\Minecraft.World\C4JThread.h" +#include "Common\Network\Sony\SQRNetworkManager.h" +#include "Common\UI\IUIScene_PauseMenu.h" +#include "Conf.h" +#include "PSVita/Network/PSVita_NPToolkit.h" +#include "PSVita\Network\SonyVoiceChat_Vita.h" +#include "..\..\Minecraft.World\FireworksRecipe.h" + +#include +#include +#include +#include + +#define THEME_NAME "584111F70AAAAAAA" +#define THEME_FILESIZE 2797568 + +/* Encrypted ID for protected data file (*) You must edit these binaries!! */ +/*char secureFileId[CELL_SAVEDATA_SECUREFILEID_SIZE] = +{ +0xEE, 0xA9, 0x37, 0xCC, +0x5B, 0xD4, 0xD9, 0x0D, +0x55, 0xED, 0x25, 0x31, +0xFA, 0x33, 0xBD, 0xC4 +};*/ + + +#define FIFTY_ONE_MB (1000000*51) // Maximum TCR space required for a save is 52MB (checking for this on a selected device) + +//#define PROFILE_VERSION 3 // new version for the interim bug fix 166 TU +#define NUM_PROFILE_VALUES 5 +#define NUM_PROFILE_SETTINGS 4 +DWORD dwProfileSettingsA[NUM_PROFILE_VALUES]= +{ +#ifdef _XBOX + XPROFILE_OPTION_CONTROLLER_VIBRATION, + XPROFILE_GAMER_YAXIS_INVERSION, + XPROFILE_GAMER_CONTROL_SENSITIVITY, + XPROFILE_GAMER_ACTION_MOVEMENT_CONTROL, + XPROFILE_TITLE_SPECIFIC1, +#else + 0,0,0,0,0 +#endif +}; + +// functions for storing and converting rich presence strings from wchar to utf8 +uint8_t * AddRichPresenceString(int iID); +void FreeRichPresenceStrings(); + +#if HEAPINSPECTOR_PS3 + +std::vector GetHeapInfo() +{ + std::vector result = HeapInspectorServer::GetDefaultHeapInfo(); + HeapInspectorServer::HeapInfo localHeapInfo; + localHeapInfo.m_Description = "VRAM"; + localHeapInfo.m_Range.m_Min = 0xc0000000; + localHeapInfo.m_Range.m_Max = localHeapInfo.m_Range.m_Min + (249*1024*1024); + result.push_back(localHeapInfo); + return result; +} + +extern "C" void* __real__malloc_init(size_t a_Boundary, size_t a_Size); +extern "C" void* __wrap__malloc_init(size_t a_Boundary, size_t a_Size) +{ + void* result = __real__malloc_init(a_Boundary, a_Size); + HeapInspectorServer::Initialise(GetHeapInfo(), 3000, HeapInspectorServer::WaitForConnection_Enabled); + return result; +} + +#endif // HEAPINSPECTOR_PS3 + +//------------------------------------------------------------------------------------- +// Time Since fAppTime is a float, we need to keep the quadword app time +// as a LARGE_INTEGER so that we don't lose precision after running +// for a long time. +//------------------------------------------------------------------------------------- + +BOOL g_bWidescreen = TRUE; +//int g_numberOfSpeakersForMiles = 2; // number of speakers to pass to Miles, this is setup from init_audio_hardware + +void DefineActions(void) +{ + // The app needs to define the actions required, and the possible mappings for these + + ///////////////////////////////////// + // VITA + ///////////////////////////////////// + + // Split into Menu actions, and in-game actions + if(InputManager.IsCircleCrossSwapped()) + { + InputManager.SetGameJoypadMaps(MAP_STYLE_0,ACTION_MENU_A, _PSV_JOY_BUTTON_O); + InputManager.SetGameJoypadMaps(MAP_STYLE_0,ACTION_MENU_OK, _PSV_JOY_BUTTON_O); + InputManager.SetGameJoypadMaps(MAP_STYLE_0,ACTION_MENU_B, _PSV_JOY_BUTTON_X); + InputManager.SetGameJoypadMaps(MAP_STYLE_0,ACTION_MENU_CANCEL, _PSV_JOY_BUTTON_X); + } + else + { + InputManager.SetGameJoypadMaps(MAP_STYLE_0,ACTION_MENU_A, _PSV_JOY_BUTTON_X); + InputManager.SetGameJoypadMaps(MAP_STYLE_0,ACTION_MENU_OK, _PSV_JOY_BUTTON_X); + InputManager.SetGameJoypadMaps(MAP_STYLE_0,ACTION_MENU_B, _PSV_JOY_BUTTON_O); + InputManager.SetGameJoypadMaps(MAP_STYLE_0,ACTION_MENU_CANCEL, _PSV_JOY_BUTTON_O); + } + + InputManager.SetGameJoypadMaps(MAP_STYLE_0,ACTION_MENU_X, _PSV_JOY_BUTTON_SQUARE); + InputManager.SetGameJoypadMaps(MAP_STYLE_0,ACTION_MENU_Y, _PSV_JOY_BUTTON_TRIANGLE); + InputManager.SetGameJoypadMaps(MAP_STYLE_0,ACTION_MENU_UP, _PSV_JOY_BUTTON_DPAD_UP | _360_JOY_BUTTON_LSTICK_UP); + InputManager.SetGameJoypadMaps(MAP_STYLE_0,ACTION_MENU_DOWN, _PSV_JOY_BUTTON_DPAD_DOWN | _360_JOY_BUTTON_LSTICK_DOWN); + 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_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); + + InputManager.SetGameJoypadMaps(MAP_STYLE_0,ACTION_MENU_STICK_PRESS, _PSV_JOY_BUTTON_DPAD_UP); + InputManager.SetGameJoypadMaps(MAP_STYLE_0,ACTION_MENU_OTHER_STICK_PRESS, _360_JOY_BUTTON_RTHUMB); + InputManager.SetGameJoypadMaps(MAP_STYLE_0,ACTION_MENU_OTHER_STICK_UP, _360_JOY_BUTTON_RSTICK_UP); + InputManager.SetGameJoypadMaps(MAP_STYLE_0,ACTION_MENU_OTHER_STICK_DOWN, _360_JOY_BUTTON_RSTICK_DOWN); + InputManager.SetGameJoypadMaps(MAP_STYLE_0,ACTION_MENU_OTHER_STICK_LEFT, _360_JOY_BUTTON_RSTICK_LEFT); + InputManager.SetGameJoypadMaps(MAP_STYLE_0,ACTION_MENU_OTHER_STICK_RIGHT, _360_JOY_BUTTON_RSTICK_RIGHT); + + InputManager.SetGameJoypadMaps(MAP_STYLE_0,MINECRAFT_ACTION_JUMP, _PSV_JOY_BUTTON_X); + InputManager.SetGameJoypadMaps(MAP_STYLE_0,MINECRAFT_ACTION_FORWARD, _360_JOY_BUTTON_LSTICK_UP); + InputManager.SetGameJoypadMaps(MAP_STYLE_0,MINECRAFT_ACTION_BACKWARD, _360_JOY_BUTTON_LSTICK_DOWN); + InputManager.SetGameJoypadMaps(MAP_STYLE_0,MINECRAFT_ACTION_LEFT, _360_JOY_BUTTON_LSTICK_LEFT); + InputManager.SetGameJoypadMaps(MAP_STYLE_0,MINECRAFT_ACTION_RIGHT, _360_JOY_BUTTON_LSTICK_RIGHT); + InputManager.SetGameJoypadMaps(MAP_STYLE_0,MINECRAFT_ACTION_LOOK_LEFT, _360_JOY_BUTTON_RSTICK_LEFT); + InputManager.SetGameJoypadMaps(MAP_STYLE_0,MINECRAFT_ACTION_LOOK_RIGHT, _360_JOY_BUTTON_RSTICK_RIGHT); + InputManager.SetGameJoypadMaps(MAP_STYLE_0,MINECRAFT_ACTION_LOOK_UP, _360_JOY_BUTTON_RSTICK_UP); + InputManager.SetGameJoypadMaps(MAP_STYLE_0,MINECRAFT_ACTION_LOOK_DOWN, _360_JOY_BUTTON_RSTICK_DOWN); + + InputManager.SetGameJoypadMaps(MAP_STYLE_0,MINECRAFT_ACTION_USE, _PSV_JOY_BUTTON_L1); + InputManager.SetGameJoypadMaps(MAP_STYLE_0,MINECRAFT_ACTION_ACTION, _PSV_JOY_BUTTON_R1); + InputManager.SetGameJoypadMaps(MAP_STYLE_0,MINECRAFT_ACTION_RIGHT_SCROLL, _PSV_JOY_BUTTON_DPAD_RIGHT); + InputManager.SetGameJoypadMaps(MAP_STYLE_0,MINECRAFT_ACTION_LEFT_SCROLL, _PSV_JOY_BUTTON_DPAD_LEFT); + InputManager.SetGameJoypadMaps(MAP_STYLE_0,MINECRAFT_ACTION_INVENTORY, _PSV_JOY_BUTTON_TRIANGLE); + InputManager.SetGameJoypadMaps(MAP_STYLE_0,MINECRAFT_ACTION_PAUSEMENU, _360_JOY_BUTTON_START); + InputManager.SetGameJoypadMaps(MAP_STYLE_0,MINECRAFT_ACTION_DROP, _PSV_JOY_BUTTON_O); + InputManager.SetGameJoypadMaps(MAP_STYLE_0,MINECRAFT_ACTION_SNEAK_TOGGLE, _PSV_JOY_BUTTON_DPAD_DOWN); + InputManager.SetGameJoypadMaps(MAP_STYLE_0,MINECRAFT_ACTION_CRAFTING, _PSV_JOY_BUTTON_SQUARE); + InputManager.SetGameJoypadMaps(MAP_STYLE_0,MINECRAFT_ACTION_RENDER_THIRD_PERSON, _PSV_JOY_BUTTON_DPAD_UP); + InputManager.SetGameJoypadMaps(MAP_STYLE_0,MINECRAFT_ACTION_GAME_INFO, _360_JOY_BUTTON_BACK); + + InputManager.SetGameJoypadMaps(MAP_STYLE_0,MINECRAFT_ACTION_DPAD_LEFT, _PSV_JOY_BUTTON_DPAD_LEFT); + InputManager.SetGameJoypadMaps(MAP_STYLE_0,MINECRAFT_ACTION_DPAD_RIGHT, _PSV_JOY_BUTTON_DPAD_RIGHT); + InputManager.SetGameJoypadMaps(MAP_STYLE_0,MINECRAFT_ACTION_DPAD_UP, _PSV_JOY_BUTTON_DPAD_UP); + InputManager.SetGameJoypadMaps(MAP_STYLE_0,MINECRAFT_ACTION_DPAD_DOWN, _PSV_JOY_BUTTON_DPAD_DOWN); + ///////////////////////////////////// + // VITA TV (Dualshock 3/4 mapping) + ///////////////////////////////////// + + // Note: this is mapping 0 from the PS3 version + + // Split into Menu actions, and in-game actions + if(InputManager.IsCircleCrossSwapped() ) + { + InputManager.SetGameJoypadMaps(MAP_STYLE_1,ACTION_MENU_A, _360_JOY_BUTTON_B); + InputManager.SetGameJoypadMaps(MAP_STYLE_1,ACTION_MENU_OK, _360_JOY_BUTTON_B); + InputManager.SetGameJoypadMaps(MAP_STYLE_1,ACTION_MENU_B, _360_JOY_BUTTON_A); + InputManager.SetGameJoypadMaps(MAP_STYLE_1,ACTION_MENU_CANCEL, _360_JOY_BUTTON_A); + } + else + { + InputManager.SetGameJoypadMaps(MAP_STYLE_1,ACTION_MENU_A, _360_JOY_BUTTON_A); + InputManager.SetGameJoypadMaps(MAP_STYLE_1,ACTION_MENU_OK, _360_JOY_BUTTON_A); + InputManager.SetGameJoypadMaps(MAP_STYLE_1,ACTION_MENU_B, _360_JOY_BUTTON_B); + InputManager.SetGameJoypadMaps(MAP_STYLE_1,ACTION_MENU_CANCEL, _360_JOY_BUTTON_B); + } + + InputManager.SetGameJoypadMaps(MAP_STYLE_1,ACTION_MENU_X, _360_JOY_BUTTON_X); + InputManager.SetGameJoypadMaps(MAP_STYLE_1,ACTION_MENU_Y, _360_JOY_BUTTON_Y); + InputManager.SetGameJoypadMaps(MAP_STYLE_1,ACTION_MENU_UP, _360_JOY_BUTTON_DPAD_UP | _360_JOY_BUTTON_LSTICK_UP); + InputManager.SetGameJoypadMaps(MAP_STYLE_1,ACTION_MENU_DOWN, _360_JOY_BUTTON_DPAD_DOWN | _360_JOY_BUTTON_LSTICK_DOWN); + InputManager.SetGameJoypadMaps(MAP_STYLE_1,ACTION_MENU_LEFT, _360_JOY_BUTTON_DPAD_LEFT | _360_JOY_BUTTON_LSTICK_LEFT); + InputManager.SetGameJoypadMaps(MAP_STYLE_1,ACTION_MENU_RIGHT, _360_JOY_BUTTON_DPAD_RIGHT | _360_JOY_BUTTON_LSTICK_RIGHT); + InputManager.SetGameJoypadMaps(MAP_STYLE_1,ACTION_MENU_PAGEUP, _360_JOY_BUTTON_LT); + InputManager.SetGameJoypadMaps(MAP_STYLE_1,ACTION_MENU_PAGEDOWN, _360_JOY_BUTTON_RT); + InputManager.SetGameJoypadMaps(MAP_STYLE_1,ACTION_MENU_RIGHT_SCROLL, _360_JOY_BUTTON_RB); + InputManager.SetGameJoypadMaps(MAP_STYLE_1,ACTION_MENU_LEFT_SCROLL, _360_JOY_BUTTON_LB); + InputManager.SetGameJoypadMaps(MAP_STYLE_1,ACTION_MENU_PAUSEMENU, _360_JOY_BUTTON_START); + + InputManager.SetGameJoypadMaps(MAP_STYLE_1,ACTION_MENU_STICK_PRESS, _360_JOY_BUTTON_LTHUMB); + InputManager.SetGameJoypadMaps(MAP_STYLE_1,ACTION_MENU_OTHER_STICK_PRESS, _360_JOY_BUTTON_RTHUMB); + InputManager.SetGameJoypadMaps(MAP_STYLE_1,ACTION_MENU_OTHER_STICK_UP, _360_JOY_BUTTON_RSTICK_UP); + InputManager.SetGameJoypadMaps(MAP_STYLE_1,ACTION_MENU_OTHER_STICK_DOWN, _360_JOY_BUTTON_RSTICK_DOWN); + InputManager.SetGameJoypadMaps(MAP_STYLE_1,ACTION_MENU_OTHER_STICK_LEFT, _360_JOY_BUTTON_RSTICK_LEFT); + InputManager.SetGameJoypadMaps(MAP_STYLE_1,ACTION_MENU_OTHER_STICK_RIGHT, _360_JOY_BUTTON_RSTICK_RIGHT); + + InputManager.SetGameJoypadMaps(MAP_STYLE_1,MINECRAFT_ACTION_JUMP, _360_JOY_BUTTON_A); + InputManager.SetGameJoypadMaps(MAP_STYLE_1,MINECRAFT_ACTION_FORWARD, _360_JOY_BUTTON_LSTICK_UP); + InputManager.SetGameJoypadMaps(MAP_STYLE_1,MINECRAFT_ACTION_BACKWARD, _360_JOY_BUTTON_LSTICK_DOWN); + InputManager.SetGameJoypadMaps(MAP_STYLE_1,MINECRAFT_ACTION_LEFT, _360_JOY_BUTTON_LSTICK_LEFT); + InputManager.SetGameJoypadMaps(MAP_STYLE_1,MINECRAFT_ACTION_RIGHT, _360_JOY_BUTTON_LSTICK_RIGHT); + InputManager.SetGameJoypadMaps(MAP_STYLE_1,MINECRAFT_ACTION_LOOK_LEFT, _360_JOY_BUTTON_RSTICK_LEFT); + InputManager.SetGameJoypadMaps(MAP_STYLE_1,MINECRAFT_ACTION_LOOK_RIGHT, _360_JOY_BUTTON_RSTICK_RIGHT); + InputManager.SetGameJoypadMaps(MAP_STYLE_1,MINECRAFT_ACTION_LOOK_UP, _360_JOY_BUTTON_RSTICK_UP); + InputManager.SetGameJoypadMaps(MAP_STYLE_1,MINECRAFT_ACTION_LOOK_DOWN, _360_JOY_BUTTON_RSTICK_DOWN); + + InputManager.SetGameJoypadMaps(MAP_STYLE_1,MINECRAFT_ACTION_USE, _360_JOY_BUTTON_LT); + InputManager.SetGameJoypadMaps(MAP_STYLE_1,MINECRAFT_ACTION_ACTION, _360_JOY_BUTTON_RT); + InputManager.SetGameJoypadMaps(MAP_STYLE_1,MINECRAFT_ACTION_RIGHT_SCROLL, _360_JOY_BUTTON_RB); + InputManager.SetGameJoypadMaps(MAP_STYLE_1,MINECRAFT_ACTION_LEFT_SCROLL, _360_JOY_BUTTON_LB); + InputManager.SetGameJoypadMaps(MAP_STYLE_1,MINECRAFT_ACTION_INVENTORY, _360_JOY_BUTTON_Y); + InputManager.SetGameJoypadMaps(MAP_STYLE_1,MINECRAFT_ACTION_PAUSEMENU, _360_JOY_BUTTON_START); + InputManager.SetGameJoypadMaps(MAP_STYLE_1,MINECRAFT_ACTION_DROP, _360_JOY_BUTTON_B); + InputManager.SetGameJoypadMaps(MAP_STYLE_1,MINECRAFT_ACTION_SNEAK_TOGGLE, _360_JOY_BUTTON_RTHUMB); + InputManager.SetGameJoypadMaps(MAP_STYLE_1,MINECRAFT_ACTION_CRAFTING, _360_JOY_BUTTON_X); + InputManager.SetGameJoypadMaps(MAP_STYLE_1,MINECRAFT_ACTION_RENDER_THIRD_PERSON, _360_JOY_BUTTON_LTHUMB); + InputManager.SetGameJoypadMaps(MAP_STYLE_1,MINECRAFT_ACTION_GAME_INFO, _360_JOY_BUTTON_BACK); + + InputManager.SetGameJoypadMaps(MAP_STYLE_1,MINECRAFT_ACTION_DPAD_LEFT, _360_JOY_BUTTON_DPAD_LEFT); + InputManager.SetGameJoypadMaps(MAP_STYLE_1,MINECRAFT_ACTION_DPAD_RIGHT, _360_JOY_BUTTON_DPAD_RIGHT); + InputManager.SetGameJoypadMaps(MAP_STYLE_1,MINECRAFT_ACTION_DPAD_UP, _360_JOY_BUTTON_DPAD_UP); + InputManager.SetGameJoypadMaps(MAP_STYLE_1,MINECRAFT_ACTION_DPAD_DOWN, _360_JOY_BUTTON_DPAD_DOWN); +} + + +//#define MEMORY_TRACKING + +#ifdef MEMORY_TRACKING +void ResetMem(); +void DumpMem(); +void MemPixStuff(); +#else +void MemSect(int sect) +{ +} +#endif + + +void debugSaveGameDirect() +{ + + C4JThread* thread = new C4JThread(&IUIScene_PauseMenu::SaveWorldThreadProc, NULL, "debugSaveGameDirect"); + thread->Run(); + thread->WaitForCompletion(1000); +} + +int simpleMessageBoxCallback( UINT uiTitle, UINT uiText, + UINT *uiOptionA, UINT uiOptionC, DWORD dwPad, + int(*Func) (LPVOID,int,const C4JStorage::EMessageResult), + LPVOID lpParam ) +{ + ui.RequestErrorMessage( uiTitle, uiText, uiOptionA, uiOptionC, dwPad, Func, lpParam); + + return 0; +} + +void RegisterAwardsWithProfileManager() +{ + // register the awards + ProfileManager.RegisterAward(eAward_TakingInventory, ACHIEVEMENT_01, eAwardType_Achievement); + ProfileManager.RegisterAward(eAward_GettingWood, ACHIEVEMENT_02, eAwardType_Achievement); + ProfileManager.RegisterAward(eAward_Benchmarking, ACHIEVEMENT_03, eAwardType_Achievement); + ProfileManager.RegisterAward(eAward_TimeToMine, ACHIEVEMENT_04, eAwardType_Achievement); + ProfileManager.RegisterAward(eAward_HotTopic, ACHIEVEMENT_05, eAwardType_Achievement); + ProfileManager.RegisterAward(eAward_AquireHardware, ACHIEVEMENT_06, eAwardType_Achievement); + ProfileManager.RegisterAward(eAward_TimeToFarm, ACHIEVEMENT_07, eAwardType_Achievement); + ProfileManager.RegisterAward(eAward_BakeBread, ACHIEVEMENT_08, eAwardType_Achievement); + ProfileManager.RegisterAward(eAward_TheLie, ACHIEVEMENT_09, eAwardType_Achievement); + ProfileManager.RegisterAward(eAward_GettingAnUpgrade, ACHIEVEMENT_10, eAwardType_Achievement); + ProfileManager.RegisterAward(eAward_DeliciousFish, ACHIEVEMENT_11, eAwardType_Achievement); + ProfileManager.RegisterAward(eAward_OnARail, ACHIEVEMENT_12, eAwardType_Achievement); + ProfileManager.RegisterAward(eAward_TimeToStrike, ACHIEVEMENT_13, eAwardType_Achievement); + ProfileManager.RegisterAward(eAward_MonsterHunter, ACHIEVEMENT_14, eAwardType_Achievement); + ProfileManager.RegisterAward(eAward_CowTipper, ACHIEVEMENT_15, eAwardType_Achievement); + ProfileManager.RegisterAward(eAward_WhenPigsFly, ACHIEVEMENT_16, eAwardType_Achievement); + ProfileManager.RegisterAward(eAward_LeaderOfThePack, ACHIEVEMENT_17, eAwardType_Achievement); + ProfileManager.RegisterAward(eAward_MOARTools, ACHIEVEMENT_18, eAwardType_Achievement); + ProfileManager.RegisterAward(eAward_DispenseWithThis, ACHIEVEMENT_19, eAwardType_Achievement); + ProfileManager.RegisterAward(eAward_InToTheNether, ACHIEVEMENT_20, eAwardType_Achievement); + + ProfileManager.RegisterAward(eAward_snipeSkeleton, ACHIEVEMENT_21, eAwardType_Achievement); // 'Sniper Duel' + ProfileManager.RegisterAward(eAward_diamonds, ACHIEVEMENT_22, eAwardType_Achievement); // 'DIAMONDS!' + ProfileManager.RegisterAward(eAward_ghast, ACHIEVEMENT_23, eAwardType_Achievement); // 'Return To Sender' + ProfileManager.RegisterAward(eAward_blazeRod, ACHIEVEMENT_24, eAwardType_Achievement); // 'Into Fire' + ProfileManager.RegisterAward(eAward_potion, ACHIEVEMENT_25, eAwardType_Achievement); // 'Local Brewery' + ProfileManager.RegisterAward(eAward_theEnd, ACHIEVEMENT_26, eAwardType_Achievement); // 'The End?' + ProfileManager.RegisterAward(eAward_winGame, ACHIEVEMENT_27, eAwardType_Achievement); // 'The End.' + ProfileManager.RegisterAward(eAward_enchantments, ACHIEVEMENT_28, eAwardType_Achievement); // 'Enchanter' + +#ifdef _EXTENDED_ACHIEVEMENTS + ProfileManager.RegisterAward(eAward_overkill, ACHIEVEMENT_29, eAwardType_Achievement); + ProfileManager.RegisterAward(eAward_bookcase, ACHIEVEMENT_30, eAwardType_Achievement); + ProfileManager.RegisterAward(eAward_adventuringTime, ACHIEVEMENT_31, eAwardType_Achievement); + ProfileManager.RegisterAward(eAward_repopulation, ACHIEVEMENT_32, eAwardType_Achievement); + ProfileManager.RegisterAward(eAward_diamondsToYou, ACHIEVEMENT_33, eAwardType_Achievement); + ProfileManager.RegisterAward(eAward_eatPorkChop, ACHIEVEMENT_34, eAwardType_Achievement); + ProfileManager.RegisterAward(eAward_play100Days, ACHIEVEMENT_35, eAwardType_Achievement); + ProfileManager.RegisterAward(eAward_arrowKillCreeper, ACHIEVEMENT_36, eAwardType_Achievement); + ProfileManager.RegisterAward(eAward_theHaggler, ACHIEVEMENT_37, eAwardType_Achievement); + ProfileManager.RegisterAward(eAward_potPlanter, ACHIEVEMENT_38, eAwardType_Achievement); + ProfileManager.RegisterAward(eAward_itsASign, ACHIEVEMENT_39, eAwardType_Achievement); + ProfileManager.RegisterAward(eAward_ironBelly, ACHIEVEMENT_40, eAwardType_Achievement); + ProfileManager.RegisterAward(eAward_haveAShearfulDay, ACHIEVEMENT_41, eAwardType_Achievement); + ProfileManager.RegisterAward(eAward_rainbowCollection, ACHIEVEMENT_42, eAwardType_Achievement); + ProfileManager.RegisterAward(eAward_stayinFrosty, ACHIEVEMENT_43, eAwardType_Achievement); + ProfileManager.RegisterAward(eAward_chestfulOfCobblestone, ACHIEVEMENT_44, eAwardType_Achievement); + ProfileManager.RegisterAward(eAward_renewableEnergy, ACHIEVEMENT_45, eAwardType_Achievement); + ProfileManager.RegisterAward(eAward_musicToMyEars, ACHIEVEMENT_46, eAwardType_Achievement); + ProfileManager.RegisterAward(eAward_bodyGuard, ACHIEVEMENT_47, eAwardType_Achievement); + ProfileManager.RegisterAward(eAward_ironMan, ACHIEVEMENT_48, eAwardType_Achievement); + ProfileManager.RegisterAward(eAward_zombieDoctor, ACHIEVEMENT_49, eAwardType_Achievement); + ProfileManager.RegisterAward(eAward_lionTamer, ACHIEVEMENT_50, eAwardType_Achievement); +#endif + +#if 0 + ProfileManager.RegisterAward(eAward_mine100Blocks, GAMER_PICTURE_GAMERPIC1, eAwardType_GamerPic,false,app.GetStringTable(),IDS_AWARD_TITLE,IDS_AWARD_GAMERPIC1,IDS_CONFIRM_OK); + ProfileManager.RegisterAward(eAward_kill10Creepers, GAMER_PICTURE_GAMERPIC2, eAwardType_GamerPic,false,app.GetStringTable(),IDS_AWARD_TITLE,IDS_AWARD_GAMERPIC2,IDS_CONFIRM_OK); + + ProfileManager.RegisterAward(eAward_eatPorkChop, AVATARASSETAWARD_PORKCHOP_TSHIRT, eAwardType_AvatarItem,false,app.GetStringTable(),IDS_AWARD_TITLE,IDS_AWARD_AVATAR1,IDS_CONFIRM_OK); + ProfileManager.RegisterAward(eAward_play100Days, AVATARASSETAWARD_WATCH, eAwardType_AvatarItem,false,app.GetStringTable(),IDS_AWARD_TITLE,IDS_AWARD_AVATAR2,IDS_CONFIRM_OK); + ProfileManager.RegisterAward(eAward_arrowKillCreeper, AVATARASSETAWARD_CAP, eAwardType_AvatarItem,false,app.GetStringTable(),IDS_AWARD_TITLE,IDS_AWARD_AVATAR3,IDS_CONFIRM_OK); + + ProfileManager.RegisterAward(eAward_socialPost, 0, eAwardType_Theme,false,app.GetStringTable(),IDS_AWARD_TITLE,IDS_AWARD_THEME,IDS_CONFIRM_OK,THEME_NAME,THEME_FILESIZE); +#endif + // Rich Presence init - number of presences, number of contexts + //printf("Rich presence strings are hard coded on PS3 for now, must change this!\n"); + ProfileManager.RichPresenceInit(4,1); + + //Chris TODO + ProfileManager.SetRichPresenceSettingFn(SQRNetworkManager_Vita::SetRichPresence); + char *pchRichPresenceString; + + pchRichPresenceString=(char *)AddRichPresenceString(IDS_RICHPRESENCE_GAMESTATE); + ProfileManager.RichPresenceRegisterContext(CONTEXT_GAME_STATE, pchRichPresenceString); + pchRichPresenceString=(char *)AddRichPresenceString(IDS_RICHPRESENCE_IDLE); + ProfileManager.RichPresenceRegisterPresenceString(CONTEXT_PRESENCE_IDLE, pchRichPresenceString); + pchRichPresenceString=(char *)AddRichPresenceString(IDS_RICHPRESENCE_MENUS); + ProfileManager.RichPresenceRegisterPresenceString(CONTEXT_PRESENCE_MENUS, pchRichPresenceString); + pchRichPresenceString=(char *)AddRichPresenceString(IDS_RICHPRESENCE_MULTIPLAYER); + ProfileManager.RichPresenceRegisterPresenceString(CONTEXT_PRESENCE_MULTIPLAYER, pchRichPresenceString); + pchRichPresenceString=(char *)AddRichPresenceString(IDS_RICHPRESENCE_MULTIPLAYEROFFLINE); + ProfileManager.RichPresenceRegisterPresenceString(CONTEXT_PRESENCE_MULTIPLAYEROFFLINE, pchRichPresenceString); + pchRichPresenceString=(char *)AddRichPresenceString(IDS_RICHPRESENCE_MULTIPLAYER_1P); + ProfileManager.RichPresenceRegisterPresenceString(CONTEXT_PRESENCE_MULTIPLAYER_1P, pchRichPresenceString); + pchRichPresenceString=(char *)AddRichPresenceString(IDS_RICHPRESENCE_MULTIPLAYER_1POFFLINE); + ProfileManager.RichPresenceRegisterPresenceString(CONTEXT_PRESENCE_MULTIPLAYER_1POFFLINE, pchRichPresenceString); + + pchRichPresenceString=(char *)AddRichPresenceString(IDS_RICHPRESENCESTATE_BLANK); + ProfileManager.RichPresenceRegisterContextString(CONTEXT_GAME_STATE, CONTEXT_GAME_STATE_BLANK, pchRichPresenceString); + pchRichPresenceString=(char *)AddRichPresenceString(IDS_RICHPRESENCESTATE_RIDING_PIG); + ProfileManager.RichPresenceRegisterContextString(CONTEXT_GAME_STATE, CONTEXT_GAME_STATE_RIDING_PIG, pchRichPresenceString); + pchRichPresenceString=(char *)AddRichPresenceString(IDS_RICHPRESENCESTATE_RIDING_MINECART); + ProfileManager.RichPresenceRegisterContextString(CONTEXT_GAME_STATE, CONTEXT_GAME_STATE_RIDING_MINECART, pchRichPresenceString); + pchRichPresenceString=(char *)AddRichPresenceString(IDS_RICHPRESENCESTATE_BOATING); + ProfileManager.RichPresenceRegisterContextString(CONTEXT_GAME_STATE, CONTEXT_GAME_STATE_BOATING, pchRichPresenceString); + pchRichPresenceString=(char *)AddRichPresenceString(IDS_RICHPRESENCESTATE_FISHING); + ProfileManager.RichPresenceRegisterContextString(CONTEXT_GAME_STATE, CONTEXT_GAME_STATE_FISHING, pchRichPresenceString); + pchRichPresenceString=(char *)AddRichPresenceString(IDS_RICHPRESENCESTATE_CRAFTING); + ProfileManager.RichPresenceRegisterContextString(CONTEXT_GAME_STATE, CONTEXT_GAME_STATE_CRAFTING, pchRichPresenceString); + pchRichPresenceString=(char *)AddRichPresenceString(IDS_RICHPRESENCESTATE_FORGING); + ProfileManager.RichPresenceRegisterContextString(CONTEXT_GAME_STATE, CONTEXT_GAME_STATE_FORGING, pchRichPresenceString); + pchRichPresenceString=(char *)AddRichPresenceString(IDS_RICHPRESENCESTATE_NETHER); + ProfileManager.RichPresenceRegisterContextString(CONTEXT_GAME_STATE, CONTEXT_GAME_STATE_NETHER, pchRichPresenceString); + pchRichPresenceString=(char *)AddRichPresenceString(IDS_RICHPRESENCESTATE_CD); + ProfileManager.RichPresenceRegisterContextString(CONTEXT_GAME_STATE, CONTEXT_GAME_STATE_CD, pchRichPresenceString); + pchRichPresenceString=(char *)AddRichPresenceString(IDS_RICHPRESENCESTATE_MAP); + ProfileManager.RichPresenceRegisterContextString(CONTEXT_GAME_STATE, CONTEXT_GAME_STATE_MAP, pchRichPresenceString); + + pchRichPresenceString=(char *)AddRichPresenceString(IDS_RICHPRESENCESTATE_ENCHANTING); + ProfileManager.RichPresenceRegisterContextString(CONTEXT_GAME_STATE, CONTEXT_GAME_STATE_ENCHANTING, pchRichPresenceString); + pchRichPresenceString=(char *)AddRichPresenceString(IDS_RICHPRESENCESTATE_BREWING); + ProfileManager.RichPresenceRegisterContextString(CONTEXT_GAME_STATE, CONTEXT_GAME_STATE_BREWING, pchRichPresenceString); + pchRichPresenceString=(char *)AddRichPresenceString(IDS_RICHPRESENCESTATE_ANVIL); + ProfileManager.RichPresenceRegisterContextString(CONTEXT_GAME_STATE, CONTEXT_GAME_STATE_ANVIL, pchRichPresenceString); + pchRichPresenceString=(char *)AddRichPresenceString(IDS_RICHPRESENCESTATE_TRADING); + ProfileManager.RichPresenceRegisterContextString(CONTEXT_GAME_STATE, CONTEXT_GAME_STATE_TRADING, pchRichPresenceString); + +} + + + +void LoadSysModule(uint16_t module, const char* moduleName) +{ + int ret = sceSysmoduleLoadModule(module); + if(ret != SCE_OK) + { +#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); + } +} + +#define LOAD_PSVITA_MODULE(m) LoadSysModule(m, #m) + + +int LoadSysModules() +{ + // LOAD_PSVITA_MODULE(SCE_SYSMODULE_PERF); + LOAD_PSVITA_MODULE(SCE_SYSMODULE_ULT); + LOAD_PSVITA_MODULE(SCE_SYSMODULE_RUDP); + LOAD_PSVITA_MODULE(SCE_SYSMODULE_NP_MATCHING2); + LOAD_PSVITA_MODULE(SCE_SYSMODULE_NET); + LOAD_PSVITA_MODULE(SCE_SYSMODULE_PSPNET_ADHOC); + LOAD_PSVITA_MODULE(SCE_SYSMODULE_NET_ADHOC_MATCHING); + LOAD_PSVITA_MODULE(SCE_SYSMODULE_HTTP); + LOAD_PSVITA_MODULE(SCE_SYSMODULE_HTTPS); + LOAD_PSVITA_MODULE(SCE_SYSMODULE_NP_COMMERCE2); + LOAD_PSVITA_MODULE(SCE_SYSMODULE_NP_SCORE_RANKING); + + return 0; +} + + +int main() +{ + //int* a = new int(5); + + PSVitaInit(); + + ShutdownManager::Initialise(); + + SceKernelFreeMemorySizeInfo mem_info; + mem_info.size = sizeof(SceKernelFreeMemorySizeInfo); + int Err = sceKernelGetFreeMemorySize(&mem_info); + +#ifndef _CONTENT_PACKAGE + printf("------------------------------------------------------\n"); + printf("------------------------------------------------------\n"); + // printf("total_user_memory : %.02f\n", mem_info.total_user_memory / (1024.0f*1024.0f)); + printf("available_user_memory : %.02f\n", mem_info.sizeMain / (1024.0f*1024.0f)); + printf("available_video_memory : %.02f\n", mem_info.sizeCdram / (1024.0f*1024.0f)); + printf("------------------------------------------------------\n"); + printf("------------------------------------------------------\n"); +#endif + + // + // initialize the Vita + // + + int ihddFreeSizeKB=LoadSysModules(); + + /* Set the parameters to be passed to initialization function sceAppUtilInit() */ + SceAppUtilInitParam initParam; + SceAppUtilBootParam bootParam; + memset(&initParam, 0, sizeof(SceAppUtilInitParam)); + memset(&bootParam, 0, sizeof(SceAppUtilBootParam)); + + /* Initialize the library */ + SceInt32 ret = sceAppUtilInit( &initParam, &bootParam ); + + + + static bool bTrialTimerDisplayed=true; + + // 4J-JEV: Moved this here in case some archived files are compressed. + // Compression::CreateNewThreadStorage(); + + app.loadMediaArchive(); + RenderManager.Initialise(); + + // Read the file containing the product codes + if(app.ReadProductCodes()==FALSE) + { + // can't continue + app.FatalLoadError(); + } + + app.InitTime(); + PSVitaNPToolkit::init(); + + // initialise the storage manager with a default save display name, a Minimum save size, and a callback for displaying the saving message + StorageManager.Init( 0, L"savegame.dat", "savePackName", FIFTY_ONE_MB, &CConsoleMinecraftApp::DisplaySavingMessage, (LPVOID)&app, NULL); + StorageManager.SetDLCProductCode(app.GetProductCode()); + StorageManager.SetProductUpgradeKey(app.GetUpgradeKey()); + ProfileManager.SetServiceID(app.GetCommerceCategory()); + + bool bCircleCrossSwapped = false; + switch(app.GetProductSKU()) + { + case e_sku_SCEE: + // 4J-PB - need to be online to do this check, so let's stick with the 7+, and move this + /*if(StorageManager.GetBootTypeDisc()) + {*/ + // set Europe age, then hone down specific countries + ProfileManager.SetMinimumAge(7,0); // PEGI 7+ + ProfileManager.SetGermanyMinimumAge(6); // USK 6+ + ProfileManager.SetAustraliaMinimumAge(8); // PG rating has no age, but for some reason the testers are saying it's 8 + ProfileManager.SetRussiaMinimumAge(6); + ProfileManager.SetKoreaMinimumAge(0); + ProfileManager.SetJapanMinimumAge(0); + /*} + else + { + // PEGI 7+ + ProfileManager.SetMinimumAge(7,0); + }*/ + break; + case e_sku_SCEA: + // ESRB EVERYONE 10+ + ProfileManager.SetMinimumAge(10,1); + break; + case e_sku_SCEJ: + // CERO A + ProfileManager.SetMinimumAge(0,2); + bCircleCrossSwapped = true; + break; + } + + InputManager.SetCircleCrossSwapped(bCircleCrossSwapped); + + app.loadStringTable(); + + // Vita + //g_iScreenWidth = 720; + //g_iScreenHeight = 408; + + // Vita native + //g_iScreenWidth = 960; + //g_iScreenHeight = 544; + ui.init(720, 408); + + //////////////// + // Initialise // + //////////////// + + // Set the number of possible joypad layouts that the user can switch between, and the number of actions + InputManager.Initialise(1,3,MINECRAFT_ACTION_MAX, ACTION_MAX_MENU); + + // Set the default joypad action mappings for Minecraft + DefineActions(); + InputManager.SetJoypadMapVal(0,0); + InputManager.SetKeyRepeatRate(0.3f,0.2f); + + //Minimum age must be set prior to profile init + + ProfileManager.Initialise( + s_npCommunicationConfig, + app.GetCommerceCategory(),// s_serviceId, + PROFILE_VERSION_CURRENT, + NUM_PROFILE_VALUES, + NUM_PROFILE_SETTINGS, + dwProfileSettingsA, + app.GAME_DEFINED_PROFILE_DATA_BYTES*XUSER_MAX_COUNT, + &app.uiGameDefinedDataChangedBitmask); + + + // register the awards + RegisterAwardsWithProfileManager(); + + // register the get string function with the profile lib, so it can be called within the lib + ProfileManager.SetGetStringFunc(&CConsoleMinecraftApp::GetString); + ProfileManager.SetPlayerListTitleID(IDS_PLAYER_LIST_TITLE); + + // defaults + StorageManager.ResetSaveData(); + StorageManager.SetSaveTitle(L"Default Save"); + StorageManager.SetGameSaveFolderTitle((WCHAR *)app.GetString(IDS_GAMENAME)); + StorageManager.SetSaveCacheFolderTitle((WCHAR *)app.GetString(IDS_SAVECACHEFILE)); + StorageManager.SetOptionsFolderTitle((WCHAR *)app.GetString(IDS_OPTIONSFILE)); + StorageManager.SetGameSaveFolderPrefix(app.GetSaveFolderPrefix()); + StorageManager.SetMaxSaves(99); + + byteArray baOptionsIcon = app.getArchiveFile(L"DefaultOptionsImage320x176.png"); + byteArray baSaveThumbnail = app.getArchiveFile(L"DefaultSaveThumbnail64x64.png"); + byteArray baSaveImage = app.getArchiveFile(L"DefaultSaveImage320x176.png"); + + StorageManager.InitialiseProfileData(PROFILE_VERSION_CURRENT, + NUM_PROFILE_VALUES, + NUM_PROFILE_SETTINGS, + dwProfileSettingsA, + app.GAME_DEFINED_PROFILE_DATA_BYTES*XUSER_MAX_COUNT, + &app.uiGameDefinedDataChangedBitmask); + + StorageManager.SetDefaultImages((PBYTE)baOptionsIcon.data, baOptionsIcon.length,(PBYTE)baSaveImage.data, baSaveImage.length,(PBYTE)baSaveThumbnail.data, baSaveThumbnail.length); + + if(baOptionsIcon.data!=NULL){ delete [] baOptionsIcon.data; } + if(baSaveThumbnail.data!=NULL){ delete [] baSaveThumbnail.data; } + if(baSaveImage.data!=NULL){ delete [] baSaveImage.data; } + + StorageManager.SetIncompleteSaveCallback(CConsoleMinecraftApp::Callback_SaveGameIncomplete, (LPVOID)&app); + +#if 0 + // Set up the global title storage path + StorageManager.StoreTMSPathName(); +#endif + + // set a function to be called when there's a sign in change, so we can exit a level if the primary player signs out + ProfileManager.SetSignInChangeCallback(&CConsoleMinecraftApp::SignInChangeCallback,(LPVOID)&app); +#if 0 + // set a function to be called when the ethernet is disconnected, so we can back out if required + ProfileManager.SetNotificationsCallback(&CConsoleMinecraftApp::NotificationsCallback,(LPVOID)&app); +#endif + + // Set a callback for the default player options to be set - when there is no profile data for the player + StorageManager.SetDefaultOptionsCallback(&CConsoleMinecraftApp::DefaultOptionsCallback,(LPVOID)&app); + StorageManager.SetOptionsDataCallback(&CConsoleMinecraftApp::OptionsDataCallback,(LPVOID)&app); + + // Set a callback to deal with old profile versions needing updated to new versions + StorageManager.SetOldProfileVersionCallback(&CConsoleMinecraftApp::OldProfileVersionCallback,(LPVOID)&app); + +#if 0 + // Set a callback for when there is a read error on profile data + //StorageManager.SetProfileReadErrorCallback(&CConsoleMinecraftApp::ProfileReadErrorCallback,(LPVOID)&app); +#endif + + StorageManager.SetDLCInfoMap(app.GetSonyDLCMap()); + app.CommerceInit(); // MGH - moved this here so GetCommerce isn't NULL + + // 4J-PB - Kick of the check for trial or full version - requires ui to be initialised + app.GetCommerce()->CheckForTrialUpgradeKey(); + + + + // debug switch to trial version + //ProfileManager.SetDebugFullOverride(false); + + //ProfileManager.AddDLC(2); + StorageManager.SetDLCPackageRoot("DLCDrive"); +#if 0 + StorageManager.RegisterMarketplaceCountsCallback(&CConsoleMinecraftApp::MarketplaceCountsCallback,(LPVOID)&app); + // Kinect ! + + if(XNuiGetHardwareStatus()!=0) + { + // If the Kinect Sensor is not physically connected, this function returns 0. + NuiInitialize(NUI_INITIALIZE_FLAG_USES_HIGH_QUALITY_COLOR | NUI_INITIALIZE_FLAG_USES_DEPTH | + NUI_INITIALIZE_FLAG_EXTRAPOLATE_FLOOR_PLANE | NUI_INITIALIZE_FLAG_USES_FITNESS | NUI_INITIALIZE_FLAG_NUI_GUIDE_DISABLED | NUI_INITIALIZE_FLAG_SUPPRESS_AUTOMATIC_UI,NUI_INITIALIZE_DEFAULT_HARDWARE_THREAD ); + } + + // Sentient ! + hr = SentientManager.Init(); + +#endif + // Initialise TLS for tesselator, for this main thread + Tesselator::CreateNewThreadStorage(1024*1024); + // Initialise TLS for AABB and Vec3 pools, for this main thread + AABB::CreateNewThreadStorage(); + Vec3::CreateNewThreadStorage(); + IntCache::CreateNewThreadStorage(); + Compression::CreateNewThreadStorage(); + OldChunkStorage::CreateNewThreadStorage(); + Level::enableLightingCache(); + Tile::CreateNewThreadStorage(); + FireworksRecipe::CreateNewThreadStorage(); + + Minecraft::main(); + Minecraft *pMinecraft=Minecraft::GetInstance(); + + //#if 0 + //bool bDisplayPauseMenu=false; + + // set the default gamma level + float fVal=50.0f*327.68f; + RenderManager.UpdateGamma((unsigned short)fVal); + + // load any skins + //app.AddSkinsToMemoryTextureFiles(); + + // set the achievement text for a trial achievement, now we have the string table loaded + //Chris TODO + //ProfileManager.SetTrialTextStringTable(app.GetStringTable(),IDS_CONFIRM_OK, IDS_CONFIRM_CANCEL); + ProfileManager.SetTrialAwardText(eAwardType_Achievement,IDS_UNLOCK_TITLE,IDS_UNLOCK_ACHIEVEMENT_TEXT); + //ProfileManager.SetTrialAwardText(eAwardType_GamerPic,IDS_UNLOCK_TITLE,IDS_UNLOCK_GAMERPIC_TEXT); + //ProfileManager.SetTrialAwardText(eAwardType_AvatarItem,IDS_UNLOCK_TITLE,IDS_UNLOCK_AVATAR_TEXT); + ProfileManager.SetTrialAwardText(eAwardType_Theme,IDS_UNLOCK_TITLE,IDS_UNLOCK_THEME_TEXT); + ProfileManager.SetUpsellCallback(&app.UpsellReturnedCallback,&app); + + // Set up a debug character press sequence +#ifndef _FINAL_BUILD + app.SetDebugSequence("LRLRYYY"); +#endif + + // Initialise the social networking manager. + //Chris TODO + //CSocialManager::Instance()->Initialise(); + + // Update the base scene quick selects now that the minecraft class exists + //CXuiSceneBase::UpdateScreenSettings(0); + //#endif + app.InitialiseTips(); +#if 0 + + DWORD initData=0; + +#ifndef _FINAL_BUILD +#ifndef _DEBUG +#pragma message(__LOC__"Need to define the _FINAL_BUILD before submission") +#endif +#endif + + // Set the default sound levels + pMinecraft->options->set(Options::Option::MUSIC,1.0f); + pMinecraft->options->set(Options::Option::SOUND,1.0f); + + app.NavigateToScene(XUSER_INDEX_ANY,eUIScene_Intro,&initData); +#endif + + // wait for the trophy init to complete - nonblocking semaphore + while(( !ProfileManager.AreTrophiesInstalled() ) && ShutdownManager::ShouldRun(ShutdownManager::eMainThread)) + { + RenderManager.StartFrame(); + ProfileManager.Tick(); + RenderManager.Tick(); + RenderManager.Present(); + } + + // QNet needs to be setup after profile manager, as we do not want its Notify listener to handle + // XN_SYS_SIGNINCHANGED notifications. This does mean that we need to have a callback in the + // ProfileManager for XN_LIVE_INVITE_ACCEPTED for QNet. + g_NetworkManager.Initialise(); + g_NetworkManager.SetLocalGame(true); + + // Set the default sound levels + pMinecraft->options->set(Options::Option::MUSIC,1.0f); + pMinecraft->options->set(Options::Option::SOUND,1.0f); + + app.InitGameSettings(); + // read the options here for controller 0 - this won't actually be actioned until a storagemanager tick later + StorageManager.ReadFromProfile(0); + + //app.TemporaryCreateGameStart(); + + //Sleep(10000); +#if 0 + // Intro loop ? + while(app.IntroRunning()) + { + ProfileManager.Tick(); + // Tick XUI + app.RunFrame(); + + // 4J : WESTY : Added to ensure we always have clear background for intro. + RenderManager.SetClearColour(D3DCOLOR_RGBA(0,0,0,255)); + RenderManager.Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + // Render XUI + hr = app.Render(); + + // Present the frame. + RenderManager.Present(); + + // Update XUI Timers + hr = XuiTimersRun(); + } +#endif + while( true ) + { + SonyVoiceChat_Vita::tick(); + + RenderManager.StartFrame(); +#if 0 + if(pMinecraft->soundEngine->isStreamingWavebankReady() && + !pMinecraft->soundEngine->isPlayingStreamingGameMusic() && + !pMinecraft->soundEngine->isPlayingStreamingCDMusic() ) + { + // play some music in the menus + pMinecraft->soundEngine->playStreaming(L"", 0, 0, 0, 0, 0, false); + } +#endif + + // static bool bPlay=false; + // if(bPlay) + // { + // bPlay=false; + // app.audio.PlaySound(); + // } + + app.UpdateTime(); + PIXBeginNamedEvent(0,"Input manager tick"); + InputManager.Tick(); + PIXEndNamedEvent(); + PIXBeginNamedEvent(0,"Profile manager tick"); + ProfileManager.Tick(); + PIXEndNamedEvent(); + PIXBeginNamedEvent(0,"Storage manager tick"); + StorageManager.Tick(); + PIXEndNamedEvent(); + PIXBeginNamedEvent(0,"Render manager tick"); + RenderManager.Tick(); + PIXEndNamedEvent(); + + // Tick the social networking manager. + PIXBeginNamedEvent(0,"Social network manager tick"); + // CSocialManager::Instance()->Tick(); + PIXEndNamedEvent(); + + // Tick sentient. + PIXBeginNamedEvent(0,"Sentient tick"); + MemSect(37); + // SentientManager.Tick(); + MemSect(0); + PIXEndNamedEvent(); + + PIXBeginNamedEvent(0,"Network manager do work #1"); + g_NetworkManager.DoWork(); + PIXEndNamedEvent(); + + LeaderboardManager::Instance()->Tick(); + // Render game graphics. + if(app.GetGameStarted()) + { + pMinecraft->run_middle(); + app.SetAppPaused( g_NetworkManager.IsLocalGame() && g_NetworkManager.GetPlayerCount() == 1 && ui.IsPauseMenuDisplayed(ProfileManager.GetPrimaryPad()) ); + } + else + { + MemSect(28); + pMinecraft->soundEngine->tick(NULL, 0.0f); + MemSect(0); + pMinecraft->textures->tick(true,false); + IntCache::Reset(); + if( app.GetReallyChangingSessionType() ) + { + pMinecraft->tickAllConnections(); // Added to stop timing out when we are waiting after converting to an offline game + } + } + + pMinecraft->soundEngine->playMusicTick(); + +#ifdef MEMORY_TRACKING + static bool bResetMemTrack = false; + static bool bDumpMemTrack = false; + + + MemPixStuff(); + + if( bResetMemTrack ) + { + ResetMem(); + MEMORYSTATUS memStat; + GlobalMemoryStatus(&memStat); + printf("RESETMEM: Avail. phys %d\n",memStat.dwAvailPhys/(1024*1024)); + bResetMemTrack = false; + } + + if( bDumpMemTrack ) + { + DumpMem(); + bDumpMemTrack = false; + MEMORYSTATUS memStat; + GlobalMemoryStatus(&memStat); + printf("DUMPMEM: Avail. phys %d\n",memStat.dwAvailPhys/(1024*1024)); + printf("Renderer used: %d\n",RenderManager.CBuffSize(-1)); + } +#endif +#if 0 + static bool bDumpTextureUsage = false; + if( bDumpTextureUsage ) + { + RenderManager.TextureGetStats(); + bDumpTextureUsage = false; + } +#endif + ui.tick(); + ui.render(); +#if 0 + app.HandleButtonPresses(); + + // store the minecraft renderstates, and re-set them after the xui render + GetRenderAndSamplerStates(pDevice,RenderStateA,SamplerStateA); + + // Tick XUI + PIXBeginNamedEvent(0,"Xui running"); + app.RunFrame(); + PIXEndNamedEvent(); + + // Render XUI + + PIXBeginNamedEvent(0,"XUI render"); + MemSect(7); + hr = app.Render(); + MemSect(0); + GetRenderAndSamplerStates(pDevice,RenderStateA2,SamplerStateA2); + PIXEndNamedEvent(); + + for(int i=0;i<8;i++) + { + if(RenderStateA2[i]!=RenderStateA[i]) + { + //printf("Reseting RenderStateA[%d] after a XUI render\n",i); + pDevice->SetRenderState(RenderStateModes[i],RenderStateA[i]); + } + } + for(int i=0;i<5;i++) + { + if(SamplerStateA2[i]!=SamplerStateA[i]) + { + //printf("Reseting SamplerStateA[%d] after a XUI render\n",i); + pDevice->SetSamplerState(0,SamplerStateModes[i],SamplerStateA[i]); + } + } + + RenderManager.Set_matrixDirty(); +#endif + // Present the frame. + RenderManager.Present(); + + ui.CheckMenuDisplayed(); + + PIXBeginNamedEvent(0,"Profile load check"); + // has the game defined profile data been changed (by a profile load) + if(app.uiGameDefinedDataChangedBitmask!=0) + { + void *pData; + for(int i=0;istats[ i ]->clear(); + pMinecraft->stats[i]->parse(pData); + } + } + + //Check to see if we can post to social networks. + //CD - Removing this until support exists + //CSocialManager::Instance()->RefreshPostingCapability(); + + // clear the flag + app.uiGameDefinedDataChangedBitmask=0; + + // Check if any profile write are needed + app.CheckGameSettingsChanged(); + } + PIXEndNamedEvent(); + app.TickDLCOffersRetrieved(); + app.TickTMSPPFilesRetrieved(); + + PIXBeginNamedEvent(0,"Network manager do work #2"); + g_NetworkManager.DoWork(); + PIXEndNamedEvent(); +#if 0 + PIXBeginNamedEvent(0,"Misc extra xui"); + // Update XUI Timers + hr = XuiTimersRun(); + +#endif // #if 0 + // Any threading type things to deal with from the xui side? + app.HandleXuiActions(); + +#if 0 + PIXEndNamedEvent(); +#endif + + // 4J-PB - Update the trial timer display if we are in the trial version + if(!ProfileManager.IsFullVersion()) + { + // display the trial timer + if(app.GetGameStarted()) + { + // 4J-PB - if the game is paused, add the elapsed time to the trial timer count so it doesn't tick down + if(app.IsAppPaused()) + { + app.UpdateTrialPausedTimer(); + } + ui.UpdateTrialTimer(ProfileManager.GetPrimaryPad()); + } + } + else + { + // need to turn off the trial timer if it was on , and we've unlocked the full version + if(bTrialTimerDisplayed) + { + ui.ShowTrialTimer(false); + bTrialTimerDisplayed=false; + } + } + + // PS4 DLC + app.CommerceTick(); + app.AppEventTick(); + + app.SaveDataTick(); + + // Fix for #7318 - Title crashes after short soak in the leaderboards menu + // A memory leak was caused because the icon renderer kept creating new Vec3's because the pool wasn't reset + Vec3::resetPool(); + + // sceRazorCpuSync(); +#if 0 //ndef _CONTENT_PACKAGE + if( InputManager.ButtonDown(0, MINECRAFT_ACTION_DPAD_LEFT) ) + { + malloc_managed_size mmsize; + malloc_stats(&mmsize); + app.DebugPrintf("Free mem = %d\n", (mmsize.current_system_size - mmsize.current_inuse_size) / (1024*1024)); + } +#endif + } + + ShutdownManager::MainThreadHandleShutdown(); +} + +vector vRichPresenceStrings; +uint8_t * AddRichPresenceString(int iID) +{ + uint8_t *strUtf8 = mallocAndCreateUTF8ArrayFromString(iID); + if( strUtf8 != NULL ) + { + vRichPresenceStrings.push_back(strUtf8); + } + return strUtf8; +} + +void FreeRichPresenceStrings() +{ + uint8_t *strUtf8; + for(int i=0;imat); +} + +CustomDrawData *ConsoleUIController::setupCustomDraw(UIScene *scene, IggyCustomDrawCallbackRegion *region) +{ + CustomDrawData *customDrawRegion = new CustomDrawData(); + customDrawRegion->x0 = region->x0; + customDrawRegion->x1 = region->x1; + customDrawRegion->y0 = region->y0; + customDrawRegion->y1 = region->y1; + + // get the correct object-to-world matrix from GDraw, and set the render state to a normal state + gdraw_psp2_BeginCustomDraw(region, customDrawRegion->mat); + + setupCustomDrawGameStateAndMatrices(scene, customDrawRegion); + + return customDrawRegion; +} + +CustomDrawData *ConsoleUIController::calculateCustomDraw(IggyCustomDrawCallbackRegion *region) +{ + CustomDrawData *customDrawRegion = new CustomDrawData(); + customDrawRegion->x0 = region->x0; + customDrawRegion->x1 = region->x1; + customDrawRegion->y0 = region->y0; + customDrawRegion->y1 = region->y1; + + gdraw_psp2_CalculateCustomDraw_4J(region, customDrawRegion->mat); + + return customDrawRegion; +} + +void ConsoleUIController::endCustomDraw(IggyCustomDrawCallbackRegion *region) +{ + endCustomDrawGameStateAndMatrices(); + + gdraw_psp2_EndCustomDraw(region); +} + +void ConsoleUIController::setTileOrigin(S32 xPos, S32 yPos) +{ + gdraw_psp2_SetTileOrigin(xPos, yPos); +} + +GDrawTexture *ConsoleUIController::getSubstitutionTexture(int textureId) +{ + /* Create a wrapped texture from a shader resource view. + A wrapped texture can be used to let Iggy draw using the contents of a texture + you create and manage on your own. For example, you might render to this texture, + or stream video into it. Wrapped textures take up a handle. They will never be + freed or otherwise modified by GDraw; nor will GDraw change any reference counts. + All this is up to the application. */ + + SceGxmTexture *tex = RenderManager.TextureGetTexture(textureId); + GDrawTexture *gdrawTex = gdraw_psp2_WrappedTextureCreate(tex); + return gdrawTex; +} + +void ConsoleUIController::destroySubstitutionTexture(void *destroyCallBackData, GDrawTexture *handle) +{ + /* Destroys the GDraw wrapper for a wrapped texture object. This will free up + a GDraw texture handle but not release the associated D3D texture; that is + up to you. */ + gdraw_psp2_WrappedTextureDestroy(handle); +} + +void ConsoleUIController::shutdown() +{ +#ifdef _ENABLEIGGY + /* Destroy the GDraw context. This frees all resources, shaders etc. + allocated by GDraw. Note this is only safe to call after all + active Iggy player have been destroyed! */ + gdraw_psp2_DestroyContext(); +#endif +} + + +void ConsoleUIController::handleUnlockFullVersionCallback() +{ + for(unsigned int i = 0; i < eUIGroup_COUNT; ++i) + { + ui.m_groups[i]->handleUnlockFullVersion(); + } +} + diff --git a/Minecraft.Client/PSVita/PSVita_UIController.h b/Minecraft.Client/PSVita/PSVita_UIController.h new file mode 100644 index 00000000..0d1e934f --- /dev/null +++ b/Minecraft.Client/PSVita/PSVita_UIController.h @@ -0,0 +1,31 @@ +#pragma once + +#include "..\Common\UI\UIController.h" + +class ConsoleUIController : public UIController +{ +private: + gdraw_psp2_dynamic_buffer *m_dynamicBuffer; + int m_currentBackBuffer; +public: + void init(S32 w, S32 h); + + void render(); + + void shutdown(); + void beginIggyCustomDraw4J(IggyCustomDrawCallbackRegion *region, CustomDrawData *customDrawRegion); + virtual CustomDrawData *setupCustomDraw(UIScene *scene, IggyCustomDrawCallbackRegion *region); + virtual CustomDrawData *calculateCustomDraw(IggyCustomDrawCallbackRegion *region); + virtual void endCustomDraw(IggyCustomDrawCallbackRegion *region); + +protected: + virtual void setTileOrigin(S32 xPos, S32 yPos); + +public: + GDrawTexture *getSubstitutionTexture(int textureId); + void destroySubstitutionTexture(void *destroyCallBackData, GDrawTexture *handle); + + static void handleUnlockFullVersionCallback(); +}; + +extern ConsoleUIController ui; \ No newline at end of file diff --git a/Minecraft.Client/PSVita/Sentient/DynamicConfigurations.h b/Minecraft.Client/PSVita/Sentient/DynamicConfigurations.h new file mode 100644 index 00000000..61b206eb --- /dev/null +++ b/Minecraft.Client/PSVita/Sentient/DynamicConfigurations.h @@ -0,0 +1,68 @@ +#pragma once + +// 4J Stu - This file defines the id's for the dynamic configurations that we are currently using +// as well as the format of the data in them + +/*********************** +* +* TRIAL TIMER +* +************************/ + +#define DYNAMIC_CONFIG_TRIAL_ID 0 +#define DYNAMIC_CONFIG_TRIAL_VERSION 1 +#define DYNAMIC_CONFIG_DEFAULT_TRIAL_TIME 2400 //40 mins 1200 // 20 mins //300; // 5 minutes + +class MinecraftDynamicConfigurations +{ +private: + enum EDynamic_Configs + { + eDynamic_Config_Trial, + + eDynamic_Config_Max, + }; + + /*********************** + * + * TRIAL TIMER + * + ************************/ + + // 4J Stu - The first 4 bytes define a version number, that defines the structure of the data + // After reading those bytes into a DWORD, the remainder of the data should be the size of the + // relevant struct and can be cast to the struct + struct _dynamic_config_trial_data_version1 + { + // The time in seconds that the player can play the trial for + DWORD trialTimeSeconds; + + _dynamic_config_trial_data_version1() { trialTimeSeconds = DYNAMIC_CONFIG_DEFAULT_TRIAL_TIME; } + }; + + typedef _dynamic_config_trial_data_version1 Dynamic_Config_Trial_Data; + + // Stored configurations + static Dynamic_Config_Trial_Data trialData; + + static bool s_bFirstUpdateStarted; + static bool s_bUpdatedConfigs[eDynamic_Config_Max]; + static EDynamic_Configs s_eCurrentConfig; + static size_t s_currentConfigSize; + + static size_t s_dataWrittenSize; + static byte *s_dataWritten; + +public: + static void Tick(); + + static DWORD GetTrialTime(); + +private: + static void UpdateAllConfigurations(); + static void UpdateNextConfiguration(); + static void UpdateConfiguration(EDynamic_Configs id); + + static void GetSizeCompletedCallback(HRESULT taskResult, void *userCallbackData); + static void GetDataCompletedCallback(HRESULT taskResult, void *userCallbackData); +}; \ No newline at end of file diff --git a/Minecraft.Client/PSVita/Sentient/MinecraftTelemetry.h b/Minecraft.Client/PSVita/Sentient/MinecraftTelemetry.h new file mode 100644 index 00000000..26ef1092 --- /dev/null +++ b/Minecraft.Client/PSVita/Sentient/MinecraftTelemetry.h @@ -0,0 +1,3 @@ +#include "SentientTelemetryCommon.h" +#include "TelemetryEnum.h" +#include "SentientStats.h" \ No newline at end of file diff --git a/Minecraft.Client/PSVita/Sentient/SentientManager.h b/Minecraft.Client/PSVita/Sentient/SentientManager.h new file mode 100644 index 00000000..d5397249 --- /dev/null +++ b/Minecraft.Client/PSVita/Sentient/SentientManager.h @@ -0,0 +1,83 @@ +#pragma once +#include "MinecraftTelemetry.h" + +class CSentientManager +{ +public: + enum ETelemetryEvent + { + eTelemetry_PlayerSessionStart, + eTelemetry_PlayerSessionExit, + eTelemetry_HeartBeat, + eTelemetry_LevelStart, + eTelemetry_LevelExit, + eTelemetry_LevelSaveOrCheckpoint, + eTelemetry_PauseOrInactive, + eTelemetry_UnpauseOrActive, + eTelemetry_MenuShown, + eTelemetry_AchievementUnlocked, + eTelemetry_MediaShareUpload, + eTelemetry_UpsellPresented, + eTelemetry_UpsellResponded, + eTelemetry_PlayerDiedOrFailed, + eTelemetry_EnemyKilledOrOvercome, + }; + + HRESULT Init(); + HRESULT Tick(); + + HRESULT Flush(); + + BOOL RecordPlayerSessionStart(DWORD dwUserId); + BOOL RecordPlayerSessionExit(DWORD dwUserId, int exitStatus); + BOOL RecordHeartBeat(DWORD dwUserId); + BOOL RecordLevelStart(DWORD dwUserId, ESen_FriendOrMatch friendsOrMatch, ESen_CompeteOrCoop competeOrCoop, int difficulty, DWORD numberOfLocalPlayers, DWORD numberOfOnlinePlayers); + BOOL RecordLevelExit(DWORD dwUserId, ESen_LevelExitStatus levelExitStatus); + BOOL RecordLevelSaveOrCheckpoint(DWORD dwUserId, INT saveOrCheckPointID, INT saveSizeInBytes); + BOOL RecordLevelResume(DWORD dwUserId, ESen_FriendOrMatch friendsOrMatch, ESen_CompeteOrCoop competeOrCoop, int difficulty, DWORD numberOfLocalPlayers, DWORD numberOfOnlinePlayers, INT saveOrCheckPointID); + BOOL RecordPauseOrInactive(DWORD dwUserId); + BOOL RecordUnpauseOrActive(DWORD dwUserId); + BOOL RecordMenuShown(DWORD dwUserId, INT menuID, INT optionalMenuSubID); + BOOL RecordAchievementUnlocked(DWORD dwUserId, INT achievementID, INT achievementGamerscore); + BOOL RecordMediaShareUpload(DWORD dwUserId, ESen_MediaDestination mediaDestination, ESen_MediaType mediaType); + BOOL RecordUpsellPresented(DWORD dwUserId, ESen_UpsellID upsellId, INT marketplaceOfferID); + BOOL RecordUpsellResponded(DWORD dwUserId, ESen_UpsellID upsellId, INT marketplaceOfferID, ESen_UpsellOutcome upsellOutcome); + BOOL RecordPlayerDiedOrFailed(DWORD dwUserId, INT lowResMapX, INT lowResMapY, INT lowResMapZ, INT mapID, INT playerWeaponID, INT enemyWeaponID, ETelemetryChallenges enemyTypeID); + BOOL RecordEnemyKilledOrOvercome(DWORD dwUserId, INT lowResMapX, INT lowResMapY, INT lowResMapZ, INT mapID, INT playerWeaponID, INT enemyWeaponID, ETelemetryChallenges enemyTypeID); + + BOOL RecordSkinChanged(DWORD dwUserId, DWORD dwSkinId); + BOOL RecordBanLevel(DWORD dwUserId); + BOOL RecordUnBanLevel(DWORD dwUserId); + + INT GetMultiplayerInstanceID(); + INT GenerateMultiplayerInstanceId(); + void SetMultiplayerInstanceId(INT value); + +private: + float m_initialiseTime; + float m_lastHeartbeat; + bool m_bFirstFlush; + + float m_fLevelStartTime[XUSER_MAX_COUNT]; + + INT m_multiplayerInstanceID; + DWORD m_levelInstanceID; + + // Helper functions to get the various common settings + INT GetSecondsSinceInitialize(); + INT GetMode(DWORD dwUserId); + INT GetSubMode(DWORD dwUserId); + INT GetLevelId(DWORD dwUserId); + INT GetSubLevelId(DWORD dwUserId); + INT GetTitleBuildId(); + INT GetLevelInstanceID(); + INT GetSingleOrMultiplayer(); + INT GetDifficultyLevel(INT diff); + INT GetLicense(); + INT GetDefaultGameControls(); + INT GetAudioSettings(DWORD dwUserId); + INT GetLevelExitProgressStat1(); + INT GetLevelExitProgressStat2(); +}; + +extern CSentientManager SentientManager; \ No newline at end of file diff --git a/Minecraft.Client/PSVita/Sentient/SentientStats.h b/Minecraft.Client/PSVita/Sentient/SentientStats.h new file mode 100644 index 00000000..7115e25d --- /dev/null +++ b/Minecraft.Client/PSVita/Sentient/SentientStats.h @@ -0,0 +1,88 @@ +/************************************************************************/ +/* THIS FILE WAS AUTOMATICALLY GENERATED */ +/* PLEASE DO NOT MODIFY */ +/************************************************************************/ +// Generated from Version: 20, on (6/19/2012 9:21:23 AM) + +#pragma once + +/************************************************************************/ +/* STATS */ +/************************************************************************/ + +// PlayerSessionStart +// Player signed in or joined +BOOL SenStatPlayerSessionStart ( DWORD dwUserID, INT SecondsSinceInitialize, INT ModeID, INT OptionalSubModeID, INT LevelID, INT OptionalSubLevelID, INT TitleBuildID, INT SkeletonDistanceInInches, INT EnrollmentType, INT NumberOfSkeletonsInView ); + +// PlayerSessionExit +// Player signed out or left +BOOL SenStatPlayerSessionExit ( DWORD dwUserID, INT SecondsSinceInitialize, INT ModeID, INT OptionalSubModeID, INT LevelID, INT OptionalSubLevelID ); + +// HeartBeat +// Sent every 60 seconds by title +BOOL SenStatHeartBeat ( DWORD dwUserID, INT SecondsSinceInitialize ); + +// LevelStart +// Level started +BOOL SenStatLevelStart ( DWORD dwUserID, INT SecondsSinceInitialize, INT ModeID, INT OptionalSubModeID, INT LevelID, INT OptionalSubLevelID, INT LevelInstanceID, INT MultiplayerInstanceID, INT SingleOrMultiplayer, INT FriendsOrMatch, INT CompeteOrCoop, INT DifficultyLevel, INT NumberOfLocalPlayers, INT NumberOfOnlinePlayers, INT License, INT DefaultGameControls, INT AudioSettings, INT SkeletonDistanceInInches, INT NumberOfSkeletonsInView ); + +// LevelExit +// Level exited +BOOL SenStatLevelExit ( DWORD dwUserID, INT SecondsSinceInitialize, INT ModeID, INT OptionalSubModeID, INT LevelID, INT OptionalSubLevelID, INT LevelInstanceID, INT MultiplayerInstanceID, INT LevelExitStatus, INT LevelExitProgressStat1, INT LevelExitProgressStat2, INT LevelDurationInSeconds ); + +// LevelSaveOrCheckpoint +// Level saved explicitly or implicitly +BOOL SenStatLevelSaveOrCheckpoint ( DWORD dwUserID, INT SecondsSinceInitialize, INT ModeID, INT OptionalSubModeID, INT LevelID, INT OptionalSubLevelID, INT LevelInstanceID, INT MultiplayerInstanceID, INT LevelExitProgressStat1, INT LevelExitProgressStat2, INT LevelDurationInSeconds, INT SaveOrCheckPointID ); + +// LevelResume +// Level resumed from a save or restarted at a checkpoint +BOOL SenStatLevelResume ( DWORD dwUserID, INT SecondsSinceInitialize, INT ModeID, INT OptionalSubModeID, INT LevelID, INT OptionalSubLevelID, INT LevelInstanceID, INT MultiplayerInstanceID, INT SingleOrMultiplayer, INT FriendsOrMatch, INT CompeteOrCoop, INT DifficultyLevel, INT NumberOfLocalPlayers, INT NumberOfOnlinePlayers, INT License, INT DefaultGameControls, INT SaveOrCheckPointID, INT AudioSettings, INT SkeletonDistanceInInches, INT NumberOfSkeletonsInView ); + +// PauseOrInactive +// Player paused game or has become inactive, level and mode are for what the player is leaving +BOOL SenStatPauseOrInactive ( DWORD dwUserID, INT SecondsSinceInitialize, INT ModeID, INT OptionalSubModeID, INT LevelID, INT OptionalSubLevelID, INT LevelInstanceID, INT MultiplayerInstanceID ); + +// UnpauseOrActive +// Player unpaused game or has become active, level and mode are for what the player is entering into +BOOL SenStatUnpauseOrActive ( DWORD dwUserID, INT SecondsSinceInitialize, INT ModeID, INT OptionalSubModeID, INT LevelID, INT OptionalSubLevelID, INT LevelInstanceID, INT MultiplayerInstanceID ); + +// MenuShown +// A menu screen or major menu area has been shown +BOOL SenStatMenuShown ( DWORD dwUserID, INT SecondsSinceInitialize, INT ModeID, INT OptionalSubModeID, INT LevelID, INT OptionalSubLevelID, INT MenuID, INT OptionalMenuSubID, INT LevelInstanceID, INT MultiplayerInstanceID ); + +// AchievementUnlocked +// An achievement was unlocked +BOOL SenStatAchievementUnlocked ( DWORD dwUserID, INT SecondsSinceInitialize, INT ModeID, INT OptionalSubModeID, INT LevelID, INT OptionalSubLevelID, INT LevelInstanceID, INT MultiplayerInstanceID, INT AchievementID, INT AchievementGamerscore ); + +// MediaShareUpload +// The user uploaded something to Kinect Share +BOOL SenStatMediaShareUpload ( DWORD dwUserID, INT SecondsSinceInitialize, INT ModeID, INT OptionalSubModeID, INT LevelID, INT OptionalSubLevelID, INT LevelInstanceID, INT MultiplayerInstanceID, INT MediaDestination, INT MediaType ); + +// UpsellPresented +// The user is shown an upsell to purchase something +BOOL SenStatUpsellPresented ( DWORD dwUserID, INT SecondsSinceInitialize, INT ModeID, INT OptionalSubModeID, INT LevelID, INT OptionalSubLevelID, INT LevelInstanceID, INT MultiplayerInstanceID, INT UpsellID, INT MarketplaceOfferID ); + +// UpsellResponded +// The user responded to the upsell +BOOL SenStatUpsellResponded ( DWORD dwUserID, INT SecondsSinceInitialize, INT ModeID, INT OptionalSubModeID, INT LevelID, INT OptionalSubLevelID, INT LevelInstanceID, INT MultiplayerInstanceID, INT UpsellID, INT MarketplaceOfferID, INT UpsellOutcome ); + +// PlayerDiedOrFailed +// The player died or failed a challenge - can be used for many types of failure +BOOL SenStatPlayerDiedOrFailed ( DWORD dwUserID, INT ModeID, INT OptionalSubModeID, INT LevelID, INT OptionalSubLevelID, INT LevelInstanceID, INT MultiplayerInstanceID, INT LowResMapX, INT LowResMapY, INT LowResMapZ, INT MapID, INT PlayerWeaponID, INT EnemyWeaponID, INT EnemyTypeID, INT SecondsSinceInitialize, INT CopyOfSecondsSinceInitialize ); + +// EnemyKilledOrOvercome +// The player killed an enemy or overcame or solved a major challenge +BOOL SenStatEnemyKilledOrOvercome ( DWORD dwUserID, INT ModeID, INT OptionalSubModeID, INT LevelID, INT OptionalSubLevelID, INT LevelInstanceID, INT MultiplayerInstanceID, INT LowResMapX, INT LowResMapY, INT LowResMapZ, INT MapID, INT PlayerWeaponID, INT EnemyWeaponID, INT EnemyTypeID, INT SecondsSinceInitialize, INT CopyOfSecondsSinceInitialize ); + +// SkinChanged +// The player has changed their skin, level and mode are for what the player is currently in +BOOL SenStatSkinChanged ( DWORD dwUserID, INT SecondsSinceInitialize, INT ModeID, INT OptionalSubModeID, INT LevelID, INT OptionalSubLevelID, INT LevelInstanceID, INT MultiplayerInstanceID, INT SkinID ); + +// BanLevel +// The player has banned a level, level and mode are for what the player is currently in and banning +BOOL SenStatBanLevel ( DWORD dwUserID, INT SecondsSinceInitialize, INT ModeID, INT OptionalSubModeID, INT LevelID, INT OptionalSubLevelID, INT LevelInstanceID, INT MultiplayerInstanceID ); + +// UnBanLevel +// The player has ubbanned a level, level and mode are for what the player is currently in and unbanning +BOOL SenStatUnBanLevel ( DWORD dwUserID, INT SecondsSinceInitialize, INT ModeID, INT OptionalSubModeID, INT LevelID, INT OptionalSubLevelID, INT LevelInstanceID, INT MultiplayerInstanceID ); + diff --git a/Minecraft.Client/PSVita/Sentient/SentientTelemetryCommon.h b/Minecraft.Client/PSVita/Sentient/SentientTelemetryCommon.h new file mode 100644 index 00000000..0b9c0e87 --- /dev/null +++ b/Minecraft.Client/PSVita/Sentient/SentientTelemetryCommon.h @@ -0,0 +1,190 @@ +#pragma once +// 4J Stu - Enums as defined by the common Sentient telemetry format + +//################################## +// DO NOT CHANGE ANY OF THESE VALUES +//################################## + + +/************************************* + AudioSettings + ************************************* + Are players changing default audio settings? + */ +enum ESen_AudioSettings +{ + eSen_AudioSettings_Undefined = 0, + eSen_AudioSettings_Off = 1, + eSen_AudioSettings_On_Default = 2, + eSen_AudioSettings_On_CustomSetting = 3, +}; + +/************************************* + CompeteOrCoop + ************************************* + Indicates whether players are playing a cooperative mode or a competitive mode. + */ +enum ESen_CompeteOrCoop +{ + eSen_CompeteOrCoop_Undefined = 0, + eSen_CompeteOrCoop_Cooperative = 1, + eSen_CompeteOrCoop_Competitive = 2, + eSen_CompeteOrCoop_Coop_and_Competitive = 3, +}; + +/************************************* + DefaultGameControls + ************************************* + This is intended to capture whether players played using default control scheme or customized the control scheme. + */ +enum ESen_DefaultGameControls +{ + eSen_DefaultGameControls_Undefined = 0, + eSen_DefaultGameControls_Default_controls = 1, + eSen_DefaultGameControls_Custom_controls = 2, +}; + +/************************************* + DifficultyLevel + ************************************* + An in-game setting that differentiates the challenge imposed on the user. Normalized to a standard 5-point scale. + */ +enum ESen_DifficultyLevel +{ + eSen_DifficultyLevel_Undefined = 0, + eSen_DifficultyLevel_Easiest = 1, + eSen_DifficultyLevel_Easier = 2, + eSen_DifficultyLevel_Normal = 3, + eSen_DifficultyLevel_Harder = 4, + eSen_DifficultyLevel_Hardest = 5, +}; + +/************************************* + GameInputType + ************************************* + Used to determine the different modes of input used in the game. For gamepad/keyboard/mouse usage, it is not necessary to call this for every single input. + Also, if polling is used, calling this event occasionally may also work. + */ +enum ESen_GameInputType +{ + eSen_GameInputType_Undefined = 0, + eSen_GameInputType_Xbox_Controller = 1, + eSen_GameInputType_Gesture = 2, + eSen_GameInputType_Voice = 3, + eSen_GameInputType_Voice_and_Gesture_Together = 4, + eSen_GameInputType_Touch = 5, + eSen_GameInputType_Keyboard = 6, + eSen_GameInputType_Mouse = 7, +}; + +/************************************* + LevelExitStatus + ************************************* + Indicates whether the player successfully completed the level. Critical for understanding the difficulty of a game with checkpoints or saves. + */ +enum ESen_LevelExitStatus +{ + eSen_LevelExitStatus_Undefined = 0, + eSen_LevelExitStatus_Exited = 1, + eSen_LevelExitStatus_Succeeded = 2, + eSen_LevelExitStatus_Failed = 3, +}; + +/************************************* + License + ************************************* + Differentiates trial/demo from full purchased titles + */ +enum ESen_License +{ + eSen_License_Undefined = 0, + eSen_License_Trial_or_Demo = 1, + eSen_License_Full_Purchased_Title = 2, +}; + +/************************************* + MediaDestination + ************************************* + Tracks where media is uploaded to (like facebook) + */ +enum ESen_MediaDestination +{ + ESen_MediaDestination_Undefined = 0, + ESen_MediaDestination_Kinect_Share = 1, + ESen_MediaDestination_Facebook = 2, + ESen_MediaDestination_YouTube = 3, + ESen_MediaDestination_Other = 4 +}; + +/************************************* + MediaType + ************************************* + Used to capture the type of media players are uploading to KinectShare + */ +enum ESen_MediaType +{ + eSen_MediaType_Undefined = 0, + eSen_MediaType_Picture = 1, + eSen_MediaType_Video = 2, + eSen_MediaType_Other_UGC = 3, +}; + +/************************************* + SingleOrMultiplayer + ************************************* + Indicates whether the game is being played in single or multiplayer mode and whether multiplayer is being played locally or over live. + */ +enum ESen_SingleOrMultiplayer +{ + eSen_SingleOrMultiplayer_Undefined = 0, + eSen_SingleOrMultiplayer_Single_Player = 1, + eSen_SingleOrMultiplayer_Multiplayer_Local = 2, + eSen_SingleOrMultiplayer_Multiplayer_Live = 3, + eSen_SingleOrMultiplayer_Multiplayer_Both_Local_and_Live = 4, +}; + +/************************************* + FriendOrMatch + ************************************* + Are players playing with friends or were they matched? + */ +enum ESen_FriendOrMatch +{ + eSen_FriendOrMatch_Undefined = 0, // (use if a single player game) + eSen_FriendOrMatch_Playing_With_Invited_Friends = 1, + eSen_FriendOrMatch_Playing_With_Match_Made_Opponents = 2, + eSen_FriendOrMatch_Playing_With_Both_Friends_And_Matched_Opponents = 3, + eSen_FriendOrMatch_Joined_Through_An_Xbox_Live_Party = 4, + eSen_FriendOrMatch_Joined_Through_An_In_Game_Party = 5, +}; + +/************************************* + UpsellID + ************************************* + Which upsell has been presented? + */ +enum ESen_UpsellID +{ + eSen_UpsellID_Undefined = 0, + eSen_UpsellID_Full_Version_Of_Game = 1, + + // Added TU3 + eSet_UpsellID_Skin_DLC = 2, + eSet_UpsellID_Texture_DLC = 3, + + //2-max= Up to game +}; + +/************************************* + UpsellOutcome + ************************************* + What was the outcome of the upsell? + */ +enum ESen_UpsellOutcome +{ + eSen_UpsellOutcome_Undefined = 0, + eSen_UpsellOutcome_Accepted = 1, + eSen_UpsellOutcome_Declined = 2, + eSen_UpsellOutcome_Went_To_Guide = 3, + eSen_UpsellOutcome_Other = 4, +}; diff --git a/Minecraft.Client/PSVita/Sentient/TelemetryEnum.h b/Minecraft.Client/PSVita/Sentient/TelemetryEnum.h new file mode 100644 index 00000000..3c120f13 --- /dev/null +++ b/Minecraft.Client/PSVita/Sentient/TelemetryEnum.h @@ -0,0 +1,238 @@ +#pragma once + +/* +AchievementGamerscore Value in gamerscore of the achievement +AchievementID ID of achievement unlocked +EnemyTypeID What type of enemy or challenge was the player facing? To prevent data-loss by overflowing the buffer, we recommend enemy type. +EnemyWeaponID What weapon the enemy is holding or what counter/AI the enemy is taking to overcome a challenge +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. +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 +LowResMapY Player position normalized to 0-255 +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. +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 +OptionalSubLevelID Used when a title has more heirarchy required. OptionalSubLevel ID = 0 means undefined or unknown. +OptionalSubModeID Used when a title has more heirarchy required. OptionalSubMode ID = 0 means undefined or unknown. +PlayerLevelUpProgressStat1 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. +PlayerLevelUpProgressStat2 Refers to a performance metric for your player when they level or rank up. This is entirely up to you and will help us understand how well the player performed, or how far the player has progressed. +PlayerWeaponID What weapon the player is holding or what approach/tact the player is taking to overcome a challenge +PlayspaceFeedbackWarningDirection identifies which side of the playspace players are getting too close to that results in the playspace feedback +SaveOrCheckpointID It is important that you also generate and save a unique SaveOrCheckpointID that can be read and reported when the player resumes from this save file or checkpoint. These IDs should be completely unique across the players experience, even if they play the same level multiple times. These IDs are critical to allowing us to re-stitch a players experience in your title and provide an accurate measure of time in level. +SecondsSinceInitialize Number of seconds elapsed since Sentient initialize. +SecondsSinceInitializeMax Number of seconds elapsed since Sentient initialize. +SecondsSinceInitializeMin Number of seconds elapsed since Sentient initialize. +SkeletonDistanceInInches Identifies the distance of the skeleton from the Kinect sensor +TitleBuildID Build version of the title, used to track changes in development as well as patches/title updates +*/ + +/* +ModeID +An in-game setting that significantly differentiates the play style of the game. +(This should be captured as an integer and correspond to mode specific to the game.) +Teams will have to provide the game mappings that correspond to the integers. +The intent is to allow teams to capture data on the highest level categories of gameplay in their game. +For example, a game mode could be the name of the specific mini game (eg: golf vs darts) or a specific multiplayer mode (eg: hoard vs beast.) ModeID = 0 means undefined or unknown. +*/ +enum ETelem_ModeId +{ + eTelem_ModeId_Undefined = 0, + eTelem_ModeId_Survival, + eTelem_ModeId_Creative, // Unused in current game version +}; + +/* +OptionalSubModeID +Used when a title has more heirarchy required. +OptionalSubMode ID = 0 means undefined or unknown. +*/ +enum ETelem_SubModeId +{ + eTelem_SubModeId_Undefined = 0, + eTelem_SubModeId_Normal, + eTelem_SubModeId_Tutorial, +}; + +/* +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. +*/ +enum ETelem_LevelId +{ + eTelem_LevelId_Undefined = 0, + eTelem_LevelId_PlayerGeneratedLevel = 1, + // 4J Stu - We currently do not have any specific levels (other than the tutorial which is tracked as a mode) so this is unused at the moment +}; + +/* +OptionalSubLevelID +Used when a title has more heirarchy required. OptionalSubLevel ID = 0 means undefined or unknown. +*/ +enum ETelem_SubLevelId +{ + eTelem_SubLevelId_Undefined = 0, + eTelem_SubLevelId_Overworld, + eTelem_SubLevelId_Nether, + eTelem_SubLevelId_End, +}; + +/* +MenuID +Describes the specific menu seen. MenuID = 0 means undefined or unknown. +*/ +// 4J Stu - FOR REFERENCE ONLY - Should map 1:1 with the CConsoleMinecraftApp:EUIScene enum +// Values that are commented out here are not currently reported +enum ETelem_MenuId +{ + //eTelemMenuId_PartnernetPassword = 0, + //eTelemMenuId_Intro = 1, + //eTelemMenuId_SaveMessage = 2, + //eTelemMenuId_Main = 3, + //eTelemMenuId_FullscreenProgress = 4, + eTelemMenuId_Pause = 5, + //eTelemMenuId_CraftingPanel_2x2 = 6, + //eTelemMenuId_CraftingPanel_3x3 = 7, + //eTelemMenuId_Furnace = 8, + //eTelemMenuId_Container = 9, + //eTelemMenuId_Largecontainer_small = 10,// for splitscreen + //eTelemMenuId_Inventory = 11, + //eTelemMenuId_Trap = 12, + //eTelemMenuId_Debug = 13, + //eTelemMenuId_DebugTips = 14, + //eTelemMenuId_HelpAndOptions = 15, + eTelemMenuId_HowToPlay = 16, + //eTelemMenuId_HowToPlayMenu = 17, + //eTelemMenuId_Controls = 18, + //eTelemMenuId_Settings_Menu = 19, + //eTelemMenuId_Settings_All = 20, + //eTelemMenuId_Leaderboards = 21, + //eTelemMenuId_Credits = 22, + //eTelemMenuId_Death = 23, + //eTelemMenuId_TutorialPopup = 24, + eTelemMenuId_MultiGameCreate = 25, + //eTelemMenuId_MultiGameJoinLoad = 26, + eTelemMenuId_MultiGameInfo = 27, + //eTelemMenuId_SignEntry = 28, + //eTelemMenuId_InGameInfo = 29, + //eTelemMenuId_ConnectingProgress = 30, + eTelemMenuId_DLCOffers = 31, + eTelemMenuId_SocialPost = 32, + //eTelemMenuId_TrialExitUpsell = 33, + eTelemMenuId_LoadSettings = 34, + //eTelemMenuId_Chat = 35, + //eTelemMenuId_Reinstall = 36, +}; + +/* +OptionalSubMenuID +Used when a title has more heirarchy required. OptionalSubMenuID = 0 means undefined or unknown. +*/ +enum ETelemetry_HowToPlay_SubMenuId +{ + eTelemetryHowToPlay_Basics = 0, + eTelemetryHowToPlay_HUD, + eTelemetryHowToPlay_Inventory, + eTelemetryHowToPlay_Chest, + eTelemetryHowToPlay_LargeChest, + eTelemetryHowToPlay_InventoryCrafting, + eTelemetryHowToPlay_CraftTable, + eTelemetryHowToPlay_Furnace, + eTelemetryHowToPlay_Dispenser, + eTelemetryHowToPlay_NetherPortal, +}; + +/* +EnemyTypeID What type of enemy or challenge was the player facing? +To prevent data-loss by overflowing the buffer, we recommend enemy type. +*/ +enum ETelemetryChallenges +{ + eTelemetryChallenges_Unknown = 0, + + eTelemetryTutorial_TrialStart, + eTelemetryTutorial_Halfway, + eTelemetryTutorial_Complete, + + eTelemetryTutorial_Inventory, + eTelemetryTutorial_Crafting, + eTelemetryTutorial_Furnace, + eTelemetryTutorial_Fishing, + eTelemetryTutorial_Minecart, + eTelemetryTutorial_Boat, + eTelemetryTutorial_Bed, + + eTelemetryTutorial_Redstone_And_Pistons, + eTelemetryTutorial_Portal, + eTelemetryTutorial_FoodBar, + eTelemetryTutorial_CreativeMode, + eTelemetryTutorial_BrewingMenu, + + eTelemetryInGame_Ride_Minecart, + eTelemetryInGame_Ride_Boat, + eTelemetryInGame_Ride_Pig, + eTelemetryInGame_UseBed, + + eTelemetryTutorial_CreativeInventory, // Added TU5 + + eTelemetryTutorial_EnchantingMenu, + eTelemetryTutorial_Brewing, + eTelemetryTutorial_Enchanting, + eTelemetryTutorial_Farming, + + eTelemetryPlayerDeathSource_Fall, + eTelemetryPlayerDeathSource_Lava, + eTelemetryPlayerDeathSource_Fire, + eTelemetryPlayerDeathSource_Water, + eTelemetryPlayerDeathSource_Suffocate, + eTelemetryPlayerDeathSource_OutOfWorld, + eTelemetryPlayerDeathSource_Cactus, + + eTelemetryPlayerDeathSource_Player_Weapon, + eTelemetryPlayerDeathSource_Player_Arrow, + + eTelemetryPlayerDeathSource_Explosion_Tnt, + eTelemetryPlayerDeathSource_Explosion_Creeper, + + eTelemetryPlayerDeathSource_Wolf, + eTelemetryPlayerDeathSource_Zombie, + eTelemetryPlayerDeathSource_Skeleton, + eTelemetryPlayerDeathSource_Spider, + eTelemetryPlayerDeathSource_Slime, + eTelemetryPlayerDeathSource_Ghast, + eTelemetryPlayerDeathSource_ZombiePigman, + + eTelemetryTutorial_Breeding, + eTelemetryTutorial_Golem, + + eTelemetryTutorial_Anvil, // Added TU14 + eTelemetryTutorial_AnvilMenu, + eTelemetryTutorial_Trading, + 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/Social/SocialManager.h b/Minecraft.Client/PSVita/Social/SocialManager.h new file mode 100644 index 00000000..0b6f2b2d --- /dev/null +++ b/Minecraft.Client/PSVita/Social/SocialManager.h @@ -0,0 +1,137 @@ +// +// Class to handle and manage integration with social networks. +// 4J Studios Ltd, 2011. +// Andy West +// + +#ifndef _SOCIAL_MANAGER_H +#define _SOCIAL_MANAGER_H + +#include + +#define MAX_SOCIALPOST_CAPTION 60 +#define MAX_SOCIALPOST_DESC 100 + +// XDK only provides for facebook so far. Others may follow!? +enum ESocialNetwork +{ + eFacebook = 0, + eNumSocialNetworks +}; + + +// Class follows singleton design pattern. +class CSocialManager +{ +private: + // Default constructor, copy constructor and assignment operator are all private. + CSocialManager(); + CSocialManager( const CSocialManager& ); + CSocialManager& operator= ( const CSocialManager& ); + + // Static private instance. + static CSocialManager* m_pInstance; + + // Bitset of title posting capability flags ( XSOCIAL_CAPABILITY_POSTIMAGE, XSOCIAL_CAPABILITY_POSTLINK ). + DWORD m_dwSocialPostingCapability; + + // Index of user who made current active request. + DWORD m_dwCurrRequestUser; + + // WESTY : Not sure if we even need to get social access key! +/* + // Size of the social network access key text buffer. + DWORD m_dwAccessKeyTextSize; + + // Pointer to the social network access key text buffer. + LPWSTR m_pAccessKeyText; + */ + + // The various states of the manager. + enum EState + { + eStateUnitialised = 0, + eStateReady, + eStateGetPostingCapability, + eStatePostingImage, + eStatePostingLink, + }; + + + // Current state that manager is in. + EState m_eCurrState; + + // For xsocial asyncronous operations. + XOVERLAPPED m_Overlapped; + DWORD m_dwOverlappedResultCode; + + // Social post preview image struct. + XSOCIAL_PREVIEWIMAGE m_PostPreviewImage; + +#ifdef _XBOX + // Social post image params. + XSOCIAL_IMAGEPOSTPARAMS m_PostImageParams; + + // Social post link params. + XSOCIAL_LINKPOSTPARAMS m_PostLinkParams; +#endif + + // Image details for posting an image to social network. + unsigned char* m_pMainImageBuffer; + DWORD m_dwMainImageBufferSize; + + void DestroyMainPostImage(); + void DestroyPreviewPostImage(); + + // WESTY : Not sure if we even need to get social access key! +/* + bool GetSocialNetworkAccessKey( ESocialNetwork eSocialNetwork, DWORD dwUserIndex, bool bUsingKinect, DWORD dwUserTrackingIndex, bool bShowNetworkSignin ); +*/ + +public: + // Retrieve singleton instance. + static CSocialManager* Instance(); + + // To be called once during game init. + void Initialise(); + + // Tick the social manager. Only does anything in async mode, polls for results of async actions. + void Tick(); + + // May need to be called if something changes (i.e. player signs in to live ). + bool RefreshPostingCapability(); + + // Returns true if any social newtork posting is allowed by us, false if not (if false, game must not display any social network UI). + bool IsTitleAllowedToPostAnything(); + + // Returns true if we are allowed to post images to social networks. + bool IsTitleAllowedToPostImages(); + + // Returns true if we are allowed to post links to social networks. + bool IsTitleAllowedToPostLinks(); + + // Returns false if any of the live signed in users have disabled XPRIVILEGE_SOCIAL_NETWORK_SHARING + bool AreAllUsersAllowedToPostImages(); + + // Post a test link to social network. + bool PostLinkToSocialNetwork( ESocialNetwork eSocialNetwork, DWORD dwUserIndex, bool bUsingKinect ); + + // Post a test image to social network. + bool PostImageToSocialNetwork( ESocialNetwork eSocialNetwork, DWORD dwUserIndex, bool bUsingKinect ); + + void SetSocialPostText(LPCWSTR Title, LPCWSTR Caption, LPCWSTR Desc); + + // WESTY : Not sure if we even need to get social access key! +/* + // We do not currently know what this is used for. We may not even need it? + bool ObtainSocialNetworkAccessKey( ESocialNetwork eSocialNetwork, DWORD dwUserIndex, bool bUsingKinect ); + */ + +private: + WCHAR m_wchTitleA[MAX_SOCIALPOST_CAPTION+1]; + WCHAR m_wchCaptionA[MAX_SOCIALPOST_CAPTION+1]; + WCHAR m_wchDescA[MAX_SOCIALPOST_DESC+1]; + +}; + +#endif //_SOCIAL_MANAGER_H diff --git a/Minecraft.Client/PSVita/Sound/Minecraft.msscmp b/Minecraft.Client/PSVita/Sound/Minecraft.msscmp new file mode 100644 index 00000000..0d0df508 Binary files /dev/null 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/XML/ATGXmlParser.h b/Minecraft.Client/PSVita/XML/ATGXmlParser.h new file mode 100644 index 00000000..75142e3e --- /dev/null +++ b/Minecraft.Client/PSVita/XML/ATGXmlParser.h @@ -0,0 +1,156 @@ +// 4J-PB - +// The ATG Framework is a common set of C++ class libraries that is used by the samples in the XDK, and was developed by the Advanced Technology Group (ATG). +// The ATG Framework offers a clean and consistent format for the samples. These classes define functions used by all the samples. +// The ATG Framework together with the samples demonstrates best practices and innovative techniques for Xbox 360. There are many useful sections of code in the samples. +// You are encouraged to incorporate this code into your titles. + +//------------------------------------------------------------------------------------- +// AtgXmlParser.h +// +// XMLParser and SAX interface declaration +// +// Xbox Advanced Technology Group +// Copyright (C) Microsoft Corporation. All rights reserved. +//------------------------------------------------------------------------------------- + +#pragma once +#ifndef ATGXMLPARSER_H +#define ATGXMLPARSER_H + +namespace ATG +{ + +//----------------------------------------------------------------------------- +// error returns from XMLParse +//----------------------------------------------------------------------------- +#define _ATGFAC 0x61B +#define E_COULD_NOT_OPEN_FILE MAKE_HRESULT(1, _ATGFAC, 0x0001 ) +#define E_INVALID_XML_SYNTAX MAKE_HRESULT(1, _ATGFAC, 0x0002 ) + + +CONST UINT XML_MAX_ATTRIBUTES_PER_ELEMENT = 32; +CONST UINT XML_MAX_NAME_LENGTH = 128; +CONST UINT XML_READ_BUFFER_SIZE = 2048; +CONST UINT XML_WRITE_BUFFER_SIZE = 2048; + +// No tag can be longer than XML_WRITE_BUFFER_SIZE - an error will be returned if +// it is + +//------------------------------------------------------------------------------------- +struct XMLAttribute +{ + WCHAR* strName; + UINT NameLen; + WCHAR* strValue; + UINT ValueLen; +}; + +//------------------------------------------------------------------------------------- +class ISAXCallback +{ +friend class XMLParser; +public: + ISAXCallback() {}; + virtual ~ISAXCallback() {}; + + virtual HRESULT StartDocument() = 0; + virtual HRESULT EndDocument() = 0; + + virtual HRESULT ElementBegin( CONST WCHAR* strName, UINT NameLen, + CONST XMLAttribute *pAttributes, UINT NumAttributes ) = 0; + virtual HRESULT ElementContent( CONST WCHAR *strData, UINT DataLen, BOOL More ) = 0; + virtual HRESULT ElementEnd( CONST WCHAR *strName, UINT NameLen ) = 0; + + virtual HRESULT CDATABegin( ) = 0; + virtual HRESULT CDATAData( CONST WCHAR *strCDATA, UINT CDATALen, BOOL bMore ) = 0; + virtual HRESULT CDATAEnd( ) = 0; + + virtual VOID Error( HRESULT hError, CONST CHAR *strMessage ) = 0; + + virtual VOID SetParseProgress( DWORD dwProgress ) { } + + const CHAR* GetFilename() { return m_strFilename; } + UINT GetLineNumber() { return m_LineNum; } + UINT GetLinePosition() { return m_LinePos; } + +private: + CONST CHAR *m_strFilename; + UINT m_LineNum; + UINT m_LinePos; +}; + + +//------------------------------------------------------------------------------------- +class XMLParser +{ +public: + XMLParser(); + ~XMLParser(); + + // Register an interface inheiriting from ISAXCallback + VOID RegisterSAXCallbackInterface( ISAXCallback *pISAXCallback ); + + // Get the registered interface + ISAXCallback* GetSAXCallbackInterface(); + + // ParseXMLFile returns one of the following: + // E_COULD_NOT_OPEN_FILE - couldn't open the file + // E_INVALID_XML_SYNTAX - bad XML syntax according to this parser + // E_NOINTERFACE - RegisterSAXCallbackInterface not called + // E_ABORT - callback returned a fail code + // S_OK - file parsed and completed + + HRESULT ParseXMLFile( CONST CHAR *strFilename ); + + // Parses from a buffer- if you pass a WCHAR buffer (and cast it), it will + // correctly detect it and use unicode instead. Return codes are the + // same as for ParseXMLFile + + HRESULT ParseXMLBuffer( CONST CHAR* strBuffer, UINT uBufferSize ); + +private: + HRESULT MainParseLoop(); + + HRESULT AdvanceCharacter( BOOL bOkToFail = FALSE ); + VOID SkipNextAdvance(); + + HRESULT ConsumeSpace(); + HRESULT ConvertEscape(); + HRESULT AdvanceElement(); + HRESULT AdvanceName(); + HRESULT AdvanceAttrVal(); + HRESULT AdvanceCDATA(); + HRESULT AdvanceComment(); + + VOID FillBuffer(); + +#ifdef _Printf_format_string_ // VC++ 2008 and later support this annotation + VOID Error( HRESULT hRet, _In_z_ _Printf_format_string_ CONST CHAR* strFormat, ... ); +#else + VOID Error( HRESULT hRet, CONST CHAR* strFormat, ... ); +#endif + + ISAXCallback* m_pISAXCallback; + + HANDLE m_hFile; + CONST CHAR* m_pInXMLBuffer; + UINT m_uInXMLBufferCharsLeft; + DWORD m_dwCharsTotal; + DWORD m_dwCharsConsumed; + + BYTE m_pReadBuf[ XML_READ_BUFFER_SIZE + 2 ]; // room for a trailing NULL + WCHAR m_pWriteBuf[ XML_WRITE_BUFFER_SIZE ]; + + BYTE* m_pReadPtr; + WCHAR* m_pWritePtr; // write pointer within m_pBuf + + BOOL m_bUnicode; // TRUE = 16-bits, FALSE = 8-bits + BOOL m_bReverseBytes; // TRUE = reverse bytes, FALSE = don't reverse + + BOOL m_bSkipNextAdvance; + WCHAR m_Ch; // Current character being parsed +}; + +} // namespace ATG + +#endif diff --git a/Minecraft.Client/PSVita/app/Japanese/Minecraft_BOXART_VITA_240.png b/Minecraft.Client/PSVita/app/Japanese/Minecraft_BOXART_VITA_240.png new file mode 100644 index 00000000..809a5a3f Binary files /dev/null and b/Minecraft.Client/PSVita/app/Japanese/Minecraft_BOXART_VITA_240.png differ diff --git a/Minecraft.Client/PSVita/app/Japanese/icon.png b/Minecraft.Client/PSVita/app/Japanese/icon.png new file mode 100644 index 00000000..4549602b Binary files /dev/null and b/Minecraft.Client/PSVita/app/Japanese/icon.png differ diff --git a/Minecraft.Client/PSVita/app/Japanese/pic0.png b/Minecraft.Client/PSVita/app/Japanese/pic0.png new file mode 100644 index 00000000..35aba919 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Japanese/pic0.png differ diff --git a/Minecraft.Client/PSVita/app/Japanese/startup.png b/Minecraft.Client/PSVita/app/Japanese/startup.png new file mode 100644 index 00000000..ee0057e7 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Japanese/startup.png differ diff --git a/Minecraft.Client/PSVita/app/Minecraft.Client.gp4p b/Minecraft.Client/PSVita/app/Minecraft.Client.gp4p new file mode 100644 index 00000000..c3d6de10 --- /dev/null +++ b/Minecraft.Client/PSVita/app/Minecraft.Client.gp4p @@ -0,0 +1,748 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Minecraft.Client/PSVita/app/Minecraft.Client_SCEA.gp4p b/Minecraft.Client/PSVita/app/Minecraft.Client_SCEA.gp4p new file mode 100644 index 00000000..dbd12180 --- /dev/null +++ b/Minecraft.Client/PSVita/app/Minecraft.Client_SCEA.gp4p @@ -0,0 +1,581 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Minecraft.Client/PSVita/app/Minecraft.Client_SCEE.gp4p b/Minecraft.Client/PSVita/app/Minecraft.Client_SCEE.gp4p new file mode 100644 index 00000000..8906010e --- /dev/null +++ b/Minecraft.Client/PSVita/app/Minecraft.Client_SCEE.gp4p @@ -0,0 +1,825 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Minecraft.Client/PSVita/app/Minecraft.Client_SCEJ.gp4p b/Minecraft.Client/PSVita/app/Minecraft.Client_SCEJ.gp4p new file mode 100644 index 00000000..a9a2f489 --- /dev/null +++ b/Minecraft.Client/PSVita/app/Minecraft.Client_SCEJ.gp4p @@ -0,0 +1,536 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Minecraft.Client/PSVita/app/Region/SCEA/manual/001.png b/Minecraft.Client/PSVita/app/Region/SCEA/manual/001.png new file mode 100644 index 00000000..ecf6ea7c Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEA/manual/001.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEA/manual/002.png b/Minecraft.Client/PSVita/app/Region/SCEA/manual/002.png new file mode 100644 index 00000000..4533db74 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEA/manual/002.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEA/manual/003.png b/Minecraft.Client/PSVita/app/Region/SCEA/manual/003.png new file mode 100644 index 00000000..04770f26 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEA/manual/003.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEA/manual/004.png b/Minecraft.Client/PSVita/app/Region/SCEA/manual/004.png new file mode 100644 index 00000000..4c8dc57a Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEA/manual/004.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEA/manual/005.png b/Minecraft.Client/PSVita/app/Region/SCEA/manual/005.png new file mode 100644 index 00000000..d4a704c0 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEA/manual/005.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEA/manual/006.png b/Minecraft.Client/PSVita/app/Region/SCEA/manual/006.png new file mode 100644 index 00000000..b18b0a30 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEA/manual/006.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEA/manual/007.png b/Minecraft.Client/PSVita/app/Region/SCEA/manual/007.png new file mode 100644 index 00000000..a924ade3 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEA/manual/007.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEA/manual/01/001.png b/Minecraft.Client/PSVita/app/Region/SCEA/manual/01/001.png new file mode 100644 index 00000000..ecf6ea7c Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEA/manual/01/001.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEA/manual/01/002.png b/Minecraft.Client/PSVita/app/Region/SCEA/manual/01/002.png new file mode 100644 index 00000000..4533db74 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEA/manual/01/002.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEA/manual/01/003.png b/Minecraft.Client/PSVita/app/Region/SCEA/manual/01/003.png new file mode 100644 index 00000000..04770f26 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEA/manual/01/003.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEA/manual/01/004.png b/Minecraft.Client/PSVita/app/Region/SCEA/manual/01/004.png new file mode 100644 index 00000000..4c8dc57a Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEA/manual/01/004.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEA/manual/01/005.png b/Minecraft.Client/PSVita/app/Region/SCEA/manual/01/005.png new file mode 100644 index 00000000..d4a704c0 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEA/manual/01/005.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEA/manual/01/006.png b/Minecraft.Client/PSVita/app/Region/SCEA/manual/01/006.png new file mode 100644 index 00000000..b18b0a30 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEA/manual/01/006.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEA/manual/01/007.png b/Minecraft.Client/PSVita/app/Region/SCEA/manual/01/007.png new file mode 100644 index 00000000..a924ade3 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEA/manual/01/007.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEA/manual/02/001.png b/Minecraft.Client/PSVita/app/Region/SCEA/manual/02/001.png new file mode 100644 index 00000000..f6a65daa Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEA/manual/02/001.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEA/manual/02/002.png b/Minecraft.Client/PSVita/app/Region/SCEA/manual/02/002.png new file mode 100644 index 00000000..e7de0fdc Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEA/manual/02/002.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEA/manual/02/003.png b/Minecraft.Client/PSVita/app/Region/SCEA/manual/02/003.png new file mode 100644 index 00000000..d25e008b Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEA/manual/02/003.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEA/manual/02/004.png b/Minecraft.Client/PSVita/app/Region/SCEA/manual/02/004.png new file mode 100644 index 00000000..bacb1b0b Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEA/manual/02/004.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEA/manual/02/005.png b/Minecraft.Client/PSVita/app/Region/SCEA/manual/02/005.png new file mode 100644 index 00000000..6aefeba2 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEA/manual/02/005.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEA/manual/02/006.png b/Minecraft.Client/PSVita/app/Region/SCEA/manual/02/006.png new file mode 100644 index 00000000..c2278339 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEA/manual/02/006.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEA/manual/02/007.png b/Minecraft.Client/PSVita/app/Region/SCEA/manual/02/007.png new file mode 100644 index 00000000..b4a97131 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEA/manual/02/007.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEA/manual/03/001.png b/Minecraft.Client/PSVita/app/Region/SCEA/manual/03/001.png new file mode 100644 index 00000000..74e95ff8 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEA/manual/03/001.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEA/manual/03/002.png b/Minecraft.Client/PSVita/app/Region/SCEA/manual/03/002.png new file mode 100644 index 00000000..16825208 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEA/manual/03/002.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEA/manual/03/003.png b/Minecraft.Client/PSVita/app/Region/SCEA/manual/03/003.png new file mode 100644 index 00000000..71d99164 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEA/manual/03/003.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEA/manual/03/004.png b/Minecraft.Client/PSVita/app/Region/SCEA/manual/03/004.png new file mode 100644 index 00000000..73b8b7bd Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEA/manual/03/004.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEA/manual/03/005.png b/Minecraft.Client/PSVita/app/Region/SCEA/manual/03/005.png new file mode 100644 index 00000000..1f056484 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEA/manual/03/005.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEA/manual/03/006.png b/Minecraft.Client/PSVita/app/Region/SCEA/manual/03/006.png new file mode 100644 index 00000000..f665d590 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEA/manual/03/006.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEA/manual/03/007.png b/Minecraft.Client/PSVita/app/Region/SCEA/manual/03/007.png new file mode 100644 index 00000000..3d56a5e8 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEA/manual/03/007.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEA/manual/17/001.png b/Minecraft.Client/PSVita/app/Region/SCEA/manual/17/001.png new file mode 100644 index 00000000..aa95d624 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEA/manual/17/001.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEA/manual/17/002.png b/Minecraft.Client/PSVita/app/Region/SCEA/manual/17/002.png new file mode 100644 index 00000000..2f1edd36 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEA/manual/17/002.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEA/manual/17/003.png b/Minecraft.Client/PSVita/app/Region/SCEA/manual/17/003.png new file mode 100644 index 00000000..10520afe Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEA/manual/17/003.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEA/manual/17/004.png b/Minecraft.Client/PSVita/app/Region/SCEA/manual/17/004.png new file mode 100644 index 00000000..a4094f1f Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEA/manual/17/004.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEA/manual/17/005.png b/Minecraft.Client/PSVita/app/Region/SCEA/manual/17/005.png new file mode 100644 index 00000000..945ae740 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEA/manual/17/005.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEA/manual/17/006.png b/Minecraft.Client/PSVita/app/Region/SCEA/manual/17/006.png new file mode 100644 index 00000000..37c2da6b Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEA/manual/17/006.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEA/manual/17/007.png b/Minecraft.Client/PSVita/app/Region/SCEA/manual/17/007.png new file mode 100644 index 00000000..93347204 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEA/manual/17/007.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEA/param.sfo b/Minecraft.Client/PSVita/app/Region/SCEA/param.sfo new file mode 100644 index 00000000..ad95a296 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEA/param.sfo differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEA/template-trial.xml b/Minecraft.Client/PSVita/app/Region/SCEA/template-trial.xml new file mode 100644 index 00000000..740cee9d --- /dev/null +++ b/Minecraft.Client/PSVita/app/Region/SCEA/template-trial.xml @@ -0,0 +1,314 @@ + + + + + bg0.png + + + + startup.png + + + + + da + + KØB HELE SPILLET + + item_1.png + psts:browse?product=UP4433-PCSE00491_00-MINECRAFTVIT0000 + + + en + + BUY FULL GAME + + item_1.png + psts:browse?product=UP4433-PCSE00491_00-MINECRAFTVIT0000 + + + en-gb + + BUY FULL GAME + + item_1.png + psts:browse?product=UP4433-PCSE00491_00-MINECRAFTVIT0000 + + + de + + VOLLVERSION KAUFEN + + item_1.png + psts:browse?product=UP4433-PCSE00491_00-MINECRAFTVIT0000 + + + el + + ΑΓΟΡΑΣΤΕ ΤΟ ΠΛΗΡΕΣ ΠΑΙΧΝΙΔΙ + + item_1.png + psts:browse?product=UP4433-PCSE00491_00-MINECRAFTVIT0000 + + + es + + COMPRAR JUEGO COMPLETO + + item_1.png + psts:browse?product=UP4433-PCSE00491_00-MINECRAFTVIT0000 + + + fi + + OSTA KOKO PELI + + item_1.png + psts:browse?product=UP4433-PCSE00491_00-MINECRAFTVIT0000 + + + fr + + ACHETER LE JEU COMPLET + + item_1.png + psts:browse?product=UP4433-PCSE00491_00-MINECRAFTVIT0000 + + + it + + ACQUISTA IL GIOCO COMPLETO + + item_1.png + psts:browse?product=UP4433-PCSE00491_00-MINECRAFTVIT0000 + + + ja + + 完全版を購入する + + item_1.png + psts:browse?product=UP4433-PCSE00491_00-MINECRAFTVIT0000 + + + ko + + 정식 버전 게임 구매 + + item_1.png + psts:browse?product=UP4433-PCSE00491_00-MINECRAFTVIT0000 + + + nl + + VOLLEDIGE GAME KOPEN + + item_1.png + psts:browse?product=UP4433-PCSE00491_00-MINECRAFTVIT0000 + + + no + + KJØP FULLVERSJONEN + + item_1.png + psts:browse?product=UP4433-PCSE00491_00-MINECRAFTVIT0000 + + + pl + + KUP PEŁNĄ WERSJĘ + + item_1.png + psts:browse?product=UP4433-PCSE00491_00-MINECRAFTVIT0000 + + + pt-br + + COMPRAR JOGO COMPLETO + + item_1.png + psts:browse?product=UP4433-PCSE00491_00-MINECRAFTVIT0000 + + + pt + + COMPRAR JOGO COMPLETO + + item_1.png + psts:browse?product=UP4433-PCSE00491_00-MINECRAFTVIT0000 + + + ru + + КУПИТЬ ПОЛНУЮ ВЕРСИЮ ИГРЫ + + item_1.png + psts:browse?product=UP4433-PCSE00491_00-MINECRAFTVIT0000 + + + sv + + KÖP HELA SPELET + + item_1.png + psts:browse?product=UP4433-PCSE00491_00-MINECRAFTVIT0000 + + + tr + + TAM OYUNU SATIN AL + + item_1.png + psts:browse?product=UP4433-PCSE00491_00-MINECRAFTVIT0000 + + + zh + + BUY FULL GAME + + item_1.png + psts:browse?product=UP4433-PCSE00491_00-MINECRAFTVIT0000 + + + ch + + 購買完整版遊戲 + + item_1.png + psts:browse?product=UP4433-PCSE00491_00-MINECRAFTVIT0000 + + + + + + da + + PRØVEVERSION + + + + en + + TRIAL VERSION + + + + en-gb + + TRIAL VERSION + + + + de + + TESTVERSION + + + + el + + ΔΟΚΙΜΑΣΤΙΚΗ ΕΚΔΟΣΗ + + + + es + + VERSIÓN DE PRUEBA + + + + fi + + KOEVERSIO + + + + fr + + VERSION D'ESSAI + + + + it + + VERSIONE DI PROVA + + + + ja + + 体験版 + + + + ko + + 평가판 + + + + nl + + TESTVERSIE + + + + no + + PRØVEVERSJON + + + + pl + + WERSJA PRÓBNA + + + + pt-br + + VERSÃO DE AVALIAÇÃO + + + + pt + + VERSÃO DE AVALIAÇÃO + + + + ru + + ПРОБНАЯ ВЕРСИЯ + + + + sv + + DEMOVERSION + + + + tr + + DENEME SÜRÜMÜ + + + + zh + + TRIAL VERSION + + + + ch + + 試玩版 + + + + + + + diff --git a/Minecraft.Client/PSVita/app/Region/SCEA/template.xml b/Minecraft.Client/PSVita/app/Region/SCEA/template.xml new file mode 100644 index 00000000..b0aae257 --- /dev/null +++ b/Minecraft.Client/PSVita/app/Region/SCEA/template.xml @@ -0,0 +1,356 @@ + + + + + bg0.png + + + + startup.png + + + + + da + + OVERFLADEPAKKER + + item_1.png + psts:browse?category=UP4433-PCSE00491_00-SKINPACKS + + + en + + SKIN PACKS + + item_1.png + psts:browse?category=UP4433-PCSE00491_00-SKINPACKS + + + en-gb + + SKIN PACKS + + item_1.png + psts:browse?category=UP4433-PCSE00491_00-SKINPACKS + + + de + + DESIGN-PAKETE + + item_1.png + psts:browse?category=UP4433-PCSE00491_00-SKINPACKS + + + el + + ΠΑΚΕΤΑ ΕΜΦΑΝΙΣΕΩΝ + + item_1.png + psts:browse?category=UP4433-PCSE00491_00-SKINPACKS + + + es + + PACKS DE ASPECTOS + + item_1.png + psts:browse?category=UP4433-PCSE00491_00-SKINPACKS + + + fi + + ULKOASUPAKETIT + + item_1.png + psts:browse?category=UP4433-PCSE00491_00-SKINPACKS + + + fr + + PACKS DE SKINS + + item_1.png + psts:browse?category=UP4433-PCSE00491_00-SKINPACKS + + + it + + PACCHETTI SKIN + + item_1.png + psts:browse?category=UP4433-PCSE00491_00-SKINPACKS + + + ja + + スキン パック + + item_1.png + psts:browse?category=UP4433-PCSE00491_00-SKINPACKS + + + ko + + 캐릭터 팩 + + item_1.png + psts:browse?category=UP4433-PCSE00491_00-SKINPACKS + + + nl + + SKINPAKKETTEN + + item_1.png + psts:browse?category=UP4433-PCSE00491_00-SKINPACKS + + + no + + SKALLPAKKER + + item_1.png + psts:browse?category=UP4433-PCSE00491_00-SKINPACKS + + + pl + + PAKIETY SKÓREK + + item_1.png + psts:browse?category=UP4433-PCSE00491_00-SKINPACKS + + + pt-br + + PACOTES DE CAPAS + + item_1.png + psts:browse?category=UP4433-PCSE00491_00-SKINPACKS + + + pt + + PACKS DE SKINS + + item_1.png + psts:browse?category=UP4433-PCSE00491_00-SKINPACKS + + + ru + + НАБОРЫ СКИНОВ + + item_1.png + psts:browse?category=UP4433-PCSE00491_00-SKINPACKS + + + sv + + UTSEENDEPAKET + + item_1.png + psts:browse?category=UP4433-PCSE00491_00-SKINPACKS + + + tr + + GÖRÜNÜM PAKETLERİ + + item_1.png + psts:browse?category=UP4433-PCSE00491_00-SKINPACKS + + + zh + + SKIN PACKS + + item_1.png + psts:browse?category=UP4433-PCSE00491_00-SKINPACKS + + + ch + + 外觀套件 + + item_1.png + psts:browse?category=UP4433-PCSE00491_00-SKINPACKS + + + + + + da + + TEKSTURPAKKER + + item_2.png + psts:browse?category=UP4433-PCSE00491_00-TEXTUREPACKS + + + en + + TEXTURE PACKS + + item_2.png + psts:browse?category=UP4433-PCSE00491_00-TEXTUREPACKS + + + en-gb + + TEXTURE PACKS + + item_2.png + psts:browse?category=UP4433-PCSE00491_00-TEXTUREPACKS + + + de + + TEXTURPAKETE + + item_2.png + psts:browse?category=UP4433-PCSE00491_00-TEXTUREPACKS + + + el + + ΠΑΚΕΤΑ ΓΡΑΦΙΚΩΝ + + item_2.png + psts:browse?category=UP4433-PCSE00491_00-TEXTUREPACKS + + + es + + PACKS DE TEXTURAS + + item_2.png + psts:browse?category=UP4433-PCSE00491_00-TEXTUREPACKS + + + fi + + TEKSTUURIPAKETIT + + item_2.png + psts:browse?category=UP4433-PCSE00491_00-TEXTUREPACKS + + + fr + + PACKS DE TEXTURES + + item_2.png + psts:browse?category=UP4433-PCSE00491_00-TEXTUREPACKS + + + it + + PACCHETTI TEXTURE + + item_2.png + psts:browse?category=UP4433-PCSE00491_00-TEXTUREPACKS + + + ja + + テクスチャ パック + + item_2.png + psts:browse?category=UP4433-PCSE00491_00-TEXTUREPACKS + + + ko + + 텍스처 팩 + + item_2.png + psts:browse?category=UP4433-PCSE00491_00-TEXTUREPACKS + + + nl + + TEXTUREPAKKETTEN + + item_2.png + psts:browse?category=UP4433-PCSE00491_00-TEXTUREPACKS + + + no + + TEKSTURPAKKER + + item_2.png + psts:browse?category=UP4433-PCSE00491_00-TEXTUREPACKS + + + pl + + PAKIETY TEKSTUR + + item_2.png + psts:browse?category=UP4433-PCSE00491_00-TEXTUREPACKS + + + pt-br + + PACOTES DE TEXTURAS + + item_2.png + psts:browse?category=UP4433-PCSE00491_00-TEXTUREPACKS + + + pt + + PACKS DE TEXTURAS + + item_2.png + psts:browse?category=UP4433-PCSE00491_00-TEXTUREPACKS + + + ru + + НАБОРЫ ТЕКСТУР + + item_2.png + psts:browse?category=UP4433-PCSE00491_00-TEXTUREPACKS + + + sv + + TEXTURPAKET + + item_2.png + psts:browse?category=UP4433-PCSE00491_00-TEXTUREPACKS + + + tr + + KAPLAMA PAKETLERİ + + item_2.png + psts:browse?category=UP4433-PCSE00491_00-TEXTUREPACKS + + + zh + + TEXTURE PACKS + + item_2.png + psts:browse?category=UP4433-PCSE00491_00-TEXTUREPACKS + + + ch + + 材質套件 + + item_2.png + psts:browse?category=UP4433-PCSE00491_00-TEXTUREPACKS + + + + + + diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/001.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/001.png new file mode 100644 index 00000000..4b72497b Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/001.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/002.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/002.png new file mode 100644 index 00000000..2b34a1c9 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/002.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/003.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/003.png new file mode 100644 index 00000000..c5da6f8b Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/003.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/004.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/004.png new file mode 100644 index 00000000..21299980 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/004.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/005.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/005.png new file mode 100644 index 00000000..c756dcf4 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/005.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/006.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/006.png new file mode 100644 index 00000000..7a8fdf6e Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/006.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/007.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/007.png new file mode 100644 index 00000000..4bd7e760 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/007.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/008.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/008.png new file mode 100644 index 00000000..cfe7572c Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/008.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/009.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/009.png new file mode 100644 index 00000000..74844a5a Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/009.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/010.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/010.png new file mode 100644 index 00000000..984dc4f2 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/010.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/011.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/011.png new file mode 100644 index 00000000..b17f213f Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/011.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/012.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/012.png new file mode 100644 index 00000000..9b19e958 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/012.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/013.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/013.png new file mode 100644 index 00000000..3ee9cbf4 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/013.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/014.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/014.png new file mode 100644 index 00000000..bbcbe8db Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/014.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/02/001.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/02/001.png new file mode 100644 index 00000000..734734a8 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/02/001.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/02/002.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/02/002.png new file mode 100644 index 00000000..a1c8403a Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/02/002.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/02/003.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/02/003.png new file mode 100644 index 00000000..0d7215cd Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/02/003.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/02/004.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/02/004.png new file mode 100644 index 00000000..4db7658d Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/02/004.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/02/005.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/02/005.png new file mode 100644 index 00000000..00b7fa78 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/02/005.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/02/006.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/02/006.png new file mode 100644 index 00000000..e3d90e63 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/02/006.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/02/007.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/02/007.png new file mode 100644 index 00000000..08403824 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/02/007.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/02/008.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/02/008.png new file mode 100644 index 00000000..b0d9cae3 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/02/008.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/02/009.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/02/009.png new file mode 100644 index 00000000..efc9d8a9 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/02/009.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/02/010.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/02/010.png new file mode 100644 index 00000000..4590a703 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/02/010.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/02/011.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/02/011.png new file mode 100644 index 00000000..09df824f Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/02/011.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/02/012.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/02/012.png new file mode 100644 index 00000000..b8f3488a Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/02/012.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/02/013.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/02/013.png new file mode 100644 index 00000000..e5a786d2 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/02/013.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/03/001.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/03/001.png new file mode 100644 index 00000000..999e2f5b Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/03/001.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/03/002.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/03/002.png new file mode 100644 index 00000000..9935432a Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/03/002.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/03/003.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/03/003.png new file mode 100644 index 00000000..ff1bfebb Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/03/003.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/03/004.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/03/004.png new file mode 100644 index 00000000..4bc86b66 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/03/004.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/03/005.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/03/005.png new file mode 100644 index 00000000..c7fe104a Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/03/005.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/03/006.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/03/006.png new file mode 100644 index 00000000..d2f975ec Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/03/006.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/03/007.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/03/007.png new file mode 100644 index 00000000..2a22cf60 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/03/007.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/03/008.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/03/008.png new file mode 100644 index 00000000..8a61a3ed Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/03/008.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/03/009.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/03/009.png new file mode 100644 index 00000000..c8332772 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/03/009.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/03/010.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/03/010.png new file mode 100644 index 00000000..1e9c870e Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/03/010.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/03/011.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/03/011.png new file mode 100644 index 00000000..75d5b1d3 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/03/011.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/03/012.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/03/012.png new file mode 100644 index 00000000..6d138877 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/03/012.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/03/013.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/03/013.png new file mode 100644 index 00000000..c2623e56 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/03/013.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/04/001.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/04/001.png new file mode 100644 index 00000000..9a64cdde Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/04/001.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/04/002.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/04/002.png new file mode 100644 index 00000000..0163d9a7 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/04/002.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/04/003.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/04/003.png new file mode 100644 index 00000000..afc0b124 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/04/003.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/04/004.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/04/004.png new file mode 100644 index 00000000..c1a35497 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/04/004.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/04/005.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/04/005.png new file mode 100644 index 00000000..db1f46de Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/04/005.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/04/006.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/04/006.png new file mode 100644 index 00000000..7a507ed1 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/04/006.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/04/007.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/04/007.png new file mode 100644 index 00000000..9d5a72bf Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/04/007.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/04/008.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/04/008.png new file mode 100644 index 00000000..f3dace22 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/04/008.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/04/009.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/04/009.png new file mode 100644 index 00000000..2b6f7158 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/04/009.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/04/010.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/04/010.png new file mode 100644 index 00000000..e073d0cd Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/04/010.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/04/011.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/04/011.png new file mode 100644 index 00000000..ba875221 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/04/011.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/04/012.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/04/012.png new file mode 100644 index 00000000..ce934b88 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/04/012.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/04/013.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/04/013.png new file mode 100644 index 00000000..b24ca504 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/04/013.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/05/001.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/05/001.png new file mode 100644 index 00000000..91d80b24 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/05/001.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/05/002.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/05/002.png new file mode 100644 index 00000000..f9b6d64f Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/05/002.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/05/003.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/05/003.png new file mode 100644 index 00000000..5f54d0ee Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/05/003.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/05/004.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/05/004.png new file mode 100644 index 00000000..3358a0e0 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/05/004.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/05/005.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/05/005.png new file mode 100644 index 00000000..37058993 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/05/005.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/05/006.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/05/006.png new file mode 100644 index 00000000..aa7b8b7d Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/05/006.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/05/007.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/05/007.png new file mode 100644 index 00000000..acc94581 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/05/007.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/05/008.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/05/008.png new file mode 100644 index 00000000..794444c0 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/05/008.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/05/009.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/05/009.png new file mode 100644 index 00000000..2d865080 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/05/009.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/05/010.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/05/010.png new file mode 100644 index 00000000..56ee663a Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/05/010.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/05/011.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/05/011.png new file mode 100644 index 00000000..c0d081f8 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/05/011.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/05/012.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/05/012.png new file mode 100644 index 00000000..bbabdd50 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/05/012.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/05/013.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/05/013.png new file mode 100644 index 00000000..21daccf2 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/05/013.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/06/001.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/06/001.png new file mode 100644 index 00000000..630059f2 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/06/001.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/06/002.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/06/002.png new file mode 100644 index 00000000..20b95c45 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/06/002.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/06/003.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/06/003.png new file mode 100644 index 00000000..cb065952 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/06/003.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/06/004.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/06/004.png new file mode 100644 index 00000000..c2754737 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/06/004.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/06/005.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/06/005.png new file mode 100644 index 00000000..70d15e8c Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/06/005.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/06/006.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/06/006.png new file mode 100644 index 00000000..d8dc0918 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/06/006.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/06/007.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/06/007.png new file mode 100644 index 00000000..7634b187 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/06/007.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/06/008.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/06/008.png new file mode 100644 index 00000000..c2b5810f Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/06/008.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/06/009.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/06/009.png new file mode 100644 index 00000000..f8f619bc Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/06/009.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/06/010.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/06/010.png new file mode 100644 index 00000000..17a86648 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/06/010.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/06/011.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/06/011.png new file mode 100644 index 00000000..0593cd67 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/06/011.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/06/012.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/06/012.png new file mode 100644 index 00000000..e98e4a03 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/06/012.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/06/013.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/06/013.png new file mode 100644 index 00000000..fd7b8a0d Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/06/013.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/07/001.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/07/001.png new file mode 100644 index 00000000..aa6343cc Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/07/001.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/07/002.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/07/002.png new file mode 100644 index 00000000..e880ead3 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/07/002.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/07/003.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/07/003.png new file mode 100644 index 00000000..2a24d16c Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/07/003.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/07/004.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/07/004.png new file mode 100644 index 00000000..fe8aa4b6 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/07/004.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/07/005.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/07/005.png new file mode 100644 index 00000000..7198e114 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/07/005.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/07/006.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/07/006.png new file mode 100644 index 00000000..fb3974f0 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/07/006.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/07/007.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/07/007.png new file mode 100644 index 00000000..20329af4 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/07/007.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/07/008.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/07/008.png new file mode 100644 index 00000000..d000cf48 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/07/008.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/07/009.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/07/009.png new file mode 100644 index 00000000..3147d504 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/07/009.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/07/010.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/07/010.png new file mode 100644 index 00000000..e90ff839 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/07/010.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/07/011.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/07/011.png new file mode 100644 index 00000000..4d3e2d99 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/07/011.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/07/012.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/07/012.png new file mode 100644 index 00000000..71f79678 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/07/012.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/07/013.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/07/013.png new file mode 100644 index 00000000..5e0fcd6b Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/07/013.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/08/001.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/08/001.png new file mode 100644 index 00000000..d982da69 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/08/001.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/08/002.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/08/002.png new file mode 100644 index 00000000..40ee402a Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/08/002.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/08/003.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/08/003.png new file mode 100644 index 00000000..9e6a0e4d Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/08/003.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/08/004.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/08/004.png new file mode 100644 index 00000000..2785cea4 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/08/004.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/08/005.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/08/005.png new file mode 100644 index 00000000..d7c1bbb0 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/08/005.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/08/006.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/08/006.png new file mode 100644 index 00000000..9384de8f Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/08/006.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/08/007.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/08/007.png new file mode 100644 index 00000000..2c2faacc Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/08/007.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/08/008.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/08/008.png new file mode 100644 index 00000000..725657b3 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/08/008.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/08/009.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/08/009.png new file mode 100644 index 00000000..99f85d86 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/08/009.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/08/010.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/08/010.png new file mode 100644 index 00000000..ebbe2444 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/08/010.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/08/011.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/08/011.png new file mode 100644 index 00000000..6964dee4 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/08/011.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/08/012.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/08/012.png new file mode 100644 index 00000000..50dc5088 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/08/012.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/08/013.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/08/013.png new file mode 100644 index 00000000..785ce2c4 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/08/013.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/12/001.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/12/001.png new file mode 100644 index 00000000..372518f4 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/12/001.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/12/002.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/12/002.png new file mode 100644 index 00000000..65f2737e Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/12/002.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/12/003.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/12/003.png new file mode 100644 index 00000000..eecf7c5b Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/12/003.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/12/004.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/12/004.png new file mode 100644 index 00000000..42a634de Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/12/004.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/12/005.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/12/005.png new file mode 100644 index 00000000..194e2735 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/12/005.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/12/006.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/12/006.png new file mode 100644 index 00000000..4cd8b087 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/12/006.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/12/007.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/12/007.png new file mode 100644 index 00000000..37b5f3da Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/12/007.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/12/008.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/12/008.png new file mode 100644 index 00000000..f2e2f638 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/12/008.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/12/009.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/12/009.png new file mode 100644 index 00000000..fa70a159 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/12/009.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/12/010.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/12/010.png new file mode 100644 index 00000000..919f9b95 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/12/010.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/12/011.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/12/011.png new file mode 100644 index 00000000..1602f5e6 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/12/011.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/12/012.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/12/012.png new file mode 100644 index 00000000..92f829d6 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/12/012.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/12/013.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/12/013.png new file mode 100644 index 00000000..6b33c0d8 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/12/013.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/13/001.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/13/001.png new file mode 100644 index 00000000..7fc30f2c Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/13/001.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/13/002.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/13/002.png new file mode 100644 index 00000000..4859ce75 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/13/002.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/13/003.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/13/003.png new file mode 100644 index 00000000..11bafac3 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/13/003.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/13/004.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/13/004.png new file mode 100644 index 00000000..b241f887 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/13/004.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/13/005.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/13/005.png new file mode 100644 index 00000000..f4fcaa04 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/13/005.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/13/006.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/13/006.png new file mode 100644 index 00000000..d7f042a8 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/13/006.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/13/007.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/13/007.png new file mode 100644 index 00000000..a1fe4a5e Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/13/007.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/13/008.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/13/008.png new file mode 100644 index 00000000..2600e44e Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/13/008.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/13/009.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/13/009.png new file mode 100644 index 00000000..7fe7324d Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/13/009.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/13/010.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/13/010.png new file mode 100644 index 00000000..f5845958 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/13/010.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/13/011.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/13/011.png new file mode 100644 index 00000000..1df1d86b Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/13/011.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/13/012.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/13/012.png new file mode 100644 index 00000000..2247d9c3 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/13/012.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/13/013.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/13/013.png new file mode 100644 index 00000000..2ba3d363 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/13/013.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/14/001.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/14/001.png new file mode 100644 index 00000000..f7c9dec4 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/14/001.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/14/002.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/14/002.png new file mode 100644 index 00000000..8045f721 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/14/002.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/14/003.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/14/003.png new file mode 100644 index 00000000..4763ecce Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/14/003.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/14/004.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/14/004.png new file mode 100644 index 00000000..63875253 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/14/004.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/14/005.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/14/005.png new file mode 100644 index 00000000..2d76ab34 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/14/005.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/14/006.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/14/006.png new file mode 100644 index 00000000..fba4c289 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/14/006.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/14/007.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/14/007.png new file mode 100644 index 00000000..00cb1e51 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/14/007.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/14/008.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/14/008.png new file mode 100644 index 00000000..f2bc5d8e Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/14/008.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/14/009.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/14/009.png new file mode 100644 index 00000000..ed6d6939 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/14/009.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/14/010.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/14/010.png new file mode 100644 index 00000000..53a61299 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/14/010.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/14/011.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/14/011.png new file mode 100644 index 00000000..ac09d7ea Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/14/011.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/14/012.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/14/012.png new file mode 100644 index 00000000..d6adcfc1 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/14/012.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/14/013.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/14/013.png new file mode 100644 index 00000000..ecf2f613 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/14/013.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/15/001.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/15/001.png new file mode 100644 index 00000000..9a27ce86 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/15/001.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/15/002.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/15/002.png new file mode 100644 index 00000000..d669bfdd Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/15/002.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/15/003.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/15/003.png new file mode 100644 index 00000000..f25a5402 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/15/003.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/15/004.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/15/004.png new file mode 100644 index 00000000..211629db Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/15/004.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/15/005.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/15/005.png new file mode 100644 index 00000000..57ec2da1 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/15/005.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/15/006.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/15/006.png new file mode 100644 index 00000000..e5647d19 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/15/006.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/15/007.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/15/007.png new file mode 100644 index 00000000..fc1ad392 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/15/007.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/15/008.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/15/008.png new file mode 100644 index 00000000..f8a182e6 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/15/008.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/15/009.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/15/009.png new file mode 100644 index 00000000..0b7ffd4e Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/15/009.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/15/010.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/15/010.png new file mode 100644 index 00000000..29e384e3 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/15/010.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/15/011.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/15/011.png new file mode 100644 index 00000000..1635d371 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/15/011.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/15/012.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/15/012.png new file mode 100644 index 00000000..51f756d7 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/15/012.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/15/013.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/15/013.png new file mode 100644 index 00000000..c29914ee Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/15/013.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/16/001.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/16/001.png new file mode 100644 index 00000000..bea00ab6 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/16/001.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/16/002.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/16/002.png new file mode 100644 index 00000000..1382f827 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/16/002.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/16/003.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/16/003.png new file mode 100644 index 00000000..8ac8a78b Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/16/003.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/16/004.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/16/004.png new file mode 100644 index 00000000..eabdeb83 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/16/004.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/16/005.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/16/005.png new file mode 100644 index 00000000..63c4ea3d Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/16/005.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/16/006.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/16/006.png new file mode 100644 index 00000000..4725e901 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/16/006.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/16/007.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/16/007.png new file mode 100644 index 00000000..f8424bf2 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/16/007.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/16/008.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/16/008.png new file mode 100644 index 00000000..8afcbc5f Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/16/008.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/16/009.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/16/009.png new file mode 100644 index 00000000..d2173eca Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/16/009.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/16/010.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/16/010.png new file mode 100644 index 00000000..6cb2adc2 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/16/010.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/16/011.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/16/011.png new file mode 100644 index 00000000..fc24897c Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/16/011.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/16/012.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/16/012.png new file mode 100644 index 00000000..24f6817a Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/16/012.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/16/013.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/16/013.png new file mode 100644 index 00000000..4544c162 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/16/013.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/001.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/001.png new file mode 100644 index 00000000..4b72497b Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/001.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/002.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/002.png new file mode 100644 index 00000000..2b34a1c9 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/002.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/003.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/003.png new file mode 100644 index 00000000..c5da6f8b Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/003.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/004.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/004.png new file mode 100644 index 00000000..21299980 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/004.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/005.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/005.png new file mode 100644 index 00000000..c756dcf4 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/005.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/006.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/006.png new file mode 100644 index 00000000..7a8fdf6e Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/006.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/007.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/007.png new file mode 100644 index 00000000..4bd7e760 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/007.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/008.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/008.png new file mode 100644 index 00000000..cfe7572c Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/008.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/009.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/009.png new file mode 100644 index 00000000..74844a5a Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/009.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/010.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/010.png new file mode 100644 index 00000000..984dc4f2 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/010.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/011.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/011.png new file mode 100644 index 00000000..b17f213f Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/011.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/012.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/012.png new file mode 100644 index 00000000..9b19e958 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/012.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/013.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/013.png new file mode 100644 index 00000000..3ee9cbf4 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/013.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/014.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/014.png new file mode 100644 index 00000000..bbcbe8db Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/014.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/015.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/015.png new file mode 100644 index 00000000..9736bd9b Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/015.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/016.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/016.png new file mode 100644 index 00000000..323c5de1 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/016.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/017.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/017.png new file mode 100644 index 00000000..a234fd86 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/017.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/018.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/018.png new file mode 100644 index 00000000..961c3a48 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/018.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/019.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/019.png new file mode 100644 index 00000000..8471b143 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/019.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/020.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/020.png new file mode 100644 index 00000000..5bf4c6de Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/020.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/021.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/021.png new file mode 100644 index 00000000..68bbecb3 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/021.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/022.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/022.png new file mode 100644 index 00000000..49815e7e Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/022.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/023.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/023.png new file mode 100644 index 00000000..ad582b3b Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/023.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/024.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/024.png new file mode 100644 index 00000000..7f3302a7 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/024.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/025.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/025.png new file mode 100644 index 00000000..14428b6a Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/025.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/026.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/026.png new file mode 100644 index 00000000..f4a99ccb Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/026.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/027.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/027.png new file mode 100644 index 00000000..14a1f2e2 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/027.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/028.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/028.png new file mode 100644 index 00000000..7db9fd22 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/028.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/029.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/029.png new file mode 100644 index 00000000..ebb647fe Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/029.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/030.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/030.png new file mode 100644 index 00000000..be74cc8a Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/030.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/031.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/031.png new file mode 100644 index 00000000..addbf405 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/031.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/032.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/032.png new file mode 100644 index 00000000..8fc684a3 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/032.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/033.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/033.png new file mode 100644 index 00000000..190745d2 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/033.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/034.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/034.png new file mode 100644 index 00000000..4e295bef Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/034.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/035.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/035.png new file mode 100644 index 00000000..999b9200 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/035.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/036.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/036.png new file mode 100644 index 00000000..7599a097 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/036.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/037.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/037.png new file mode 100644 index 00000000..9f1a1324 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/037.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/038.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/038.png new file mode 100644 index 00000000..48d49ec6 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/038.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/039.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/039.png new file mode 100644 index 00000000..57e72117 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/039.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/040.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/040.png new file mode 100644 index 00000000..f03b4004 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/040.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/041.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/041.png new file mode 100644 index 00000000..acf54086 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/041.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/042.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/042.png new file mode 100644 index 00000000..4f73f3ae Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/042.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/043.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/043.png new file mode 100644 index 00000000..d536f3cc Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/043.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/044.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/044.png new file mode 100644 index 00000000..866cbe50 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/044.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/045.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/045.png new file mode 100644 index 00000000..2a857610 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/045.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/046.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/046.png new file mode 100644 index 00000000..e2eccb7c Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/046.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/047.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/047.png new file mode 100644 index 00000000..c09013d6 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/047.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/048.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/048.png new file mode 100644 index 00000000..99c306f0 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/048.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/049.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/049.png new file mode 100644 index 00000000..8d6b6e0c Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/049.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/050.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/050.png new file mode 100644 index 00000000..79f647c5 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/050.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/051.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/051.png new file mode 100644 index 00000000..b67c129c Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/051.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/052.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/052.png new file mode 100644 index 00000000..6c870a40 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/052.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/053.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/053.png new file mode 100644 index 00000000..bd3ddeee Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/053.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/054.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/054.png new file mode 100644 index 00000000..5c2958fc Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/054.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/055.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/055.png new file mode 100644 index 00000000..e0dab1f3 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/055.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/056.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/056.png new file mode 100644 index 00000000..d016fdbc Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/056.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/057.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/057.png new file mode 100644 index 00000000..a520294e Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/057.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/058.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/058.png new file mode 100644 index 00000000..ceb2729e Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/058.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/059.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/059.png new file mode 100644 index 00000000..66dd2138 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/059.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/060.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/060.png new file mode 100644 index 00000000..53860e15 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/060.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/061.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/061.png new file mode 100644 index 00000000..1cba58e7 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/061.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/062.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/062.png new file mode 100644 index 00000000..1f2eb820 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/062.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/063.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/063.png new file mode 100644 index 00000000..ef922f57 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/063.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/064.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/064.png new file mode 100644 index 00000000..ad87727b Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/064.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/065.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/065.png new file mode 100644 index 00000000..4cabd111 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/065.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/066.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/066.png new file mode 100644 index 00000000..1ab7f81e Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/066.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/067.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/067.png new file mode 100644 index 00000000..c64cb921 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/067.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/068.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/068.png new file mode 100644 index 00000000..888f1a42 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/068.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/069.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/069.png new file mode 100644 index 00000000..b0eef491 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/069.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/070.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/070.png new file mode 100644 index 00000000..04df7d05 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/070.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/071.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/071.png new file mode 100644 index 00000000..c32b209d Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/071.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/072.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/072.png new file mode 100644 index 00000000..d839e7d1 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/072.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/073.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/073.png new file mode 100644 index 00000000..272b18eb Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/073.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/074.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/074.png new file mode 100644 index 00000000..e73a3182 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/074.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/075.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/075.png new file mode 100644 index 00000000..fd8766f6 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/075.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/076.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/076.png new file mode 100644 index 00000000..1e757de9 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/076.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/077.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/077.png new file mode 100644 index 00000000..65652e5f Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/077.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/078.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/078.png new file mode 100644 index 00000000..7e2a66bc Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/078.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/079.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/079.png new file mode 100644 index 00000000..8669e679 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/079.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/080.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/080.png new file mode 100644 index 00000000..ea58dd0d Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/080.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/081.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/081.png new file mode 100644 index 00000000..9f02d034 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/081.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/082.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/082.png new file mode 100644 index 00000000..a111b104 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/082.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/083.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/083.png new file mode 100644 index 00000000..298fff8a Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/083.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/084.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/084.png new file mode 100644 index 00000000..5fd95864 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/084.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/085.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/085.png new file mode 100644 index 00000000..adfe4743 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/085.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/086.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/086.png new file mode 100644 index 00000000..7f0f7aad Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/086.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/087.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/087.png new file mode 100644 index 00000000..07955f9a Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/087.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/088.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/088.png new file mode 100644 index 00000000..3bd5b57b Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/088.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/089.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/089.png new file mode 100644 index 00000000..155e6bfc Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/089.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/090.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/090.png new file mode 100644 index 00000000..77fb3a71 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/090.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/091.png b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/091.png new file mode 100644 index 00000000..58df6c13 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/manual/18/091.png differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/param.sfo b/Minecraft.Client/PSVita/app/Region/SCEE/param.sfo new file mode 100644 index 00000000..b1ffcbab Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEE/param.sfo differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/template-trial.xml b/Minecraft.Client/PSVita/app/Region/SCEE/template-trial.xml new file mode 100644 index 00000000..798ec829 --- /dev/null +++ b/Minecraft.Client/PSVita/app/Region/SCEE/template-trial.xml @@ -0,0 +1,314 @@ + + + + + bg0.png + + + + startup.png + + + + + da + + KØB HELE SPILLET + + item_1.png + psts:browse?product=EP4433-PCSB00560_00-MINECRAFTVIT0000 + + + en + + BUY FULL GAME + + item_1.png + psts:browse?product=EP4433-PCSB00560_00-MINECRAFTVIT0000 + + + en-gb + + BUY FULL GAME + + item_1.png + psts:browse?product=EP4433-PCSB00560_00-MINECRAFTVIT0000 + + + de + + VOLLVERSION KAUFEN + + item_1.png + psts:browse?product=EP4433-PCSB00560_00-MINECRAFTVIT0000 + + + el + + ΑΓΟΡΑΣΤΕ ΤΟ ΠΛΗΡΕΣ ΠΑΙΧΝΙΔΙ + + item_1.png + psts:browse?product=EP4433-PCSB00560_00-MINECRAFTVIT0000 + + + es + + COMPRAR JUEGO COMPLETO + + item_1.png + psts:browse?product=EP4433-PCSB00560_00-MINECRAFTVIT0000 + + + fi + + OSTA KOKO PELI + + item_1.png + psts:browse?product=EP4433-PCSB00560_00-MINECRAFTVIT0000 + + + fr + + ACHETER LE JEU COMPLET + + item_1.png + psts:browse?product=EP4433-PCSB00560_00-MINECRAFTVIT0000 + + + it + + ACQUISTA IL GIOCO COMPLETO + + item_1.png + psts:browse?product=EP4433-PCSB00560_00-MINECRAFTVIT0000 + + + ja + + 完全版を購入する + + item_1.png + psts:browse?product=EP4433-PCSB00560_00-MINECRAFTVIT0000 + + + ko + + 정식 버전 게임 구매 + + item_1.png + psts:browse?product=EP4433-PCSB00560_00-MINECRAFTVIT0000 + + + nl + + VOLLEDIGE GAME KOPEN + + item_1.png + psts:browse?product=EP4433-PCSB00560_00-MINECRAFTVIT0000 + + + no + + KJØP FULLVERSJONEN + + item_1.png + psts:browse?product=EP4433-PCSB00560_00-MINECRAFTVIT0000 + + + pl + + KUP PEŁNĄ WERSJĘ + + item_1.png + psts:browse?product=EP4433-PCSB00560_00-MINECRAFTVIT0000 + + + pt-br + + COMPRAR JOGO COMPLETO + + item_1.png + psts:browse?product=EP4433-PCSB00560_00-MINECRAFTVIT0000 + + + pt + + COMPRAR JOGO COMPLETO + + item_1.png + psts:browse?product=EP4433-PCSB00560_00-MINECRAFTVIT0000 + + + ru + + КУПИТЬ ПОЛНУЮ ВЕРСИЮ ИГРЫ + + item_1.png + psts:browse?product=EP4433-PCSB00560_00-MINECRAFTVIT0000 + + + sv + + KÖP HELA SPELET + + item_1.png + psts:browse?product=EP4433-PCSB00560_00-MINECRAFTVIT0000 + + + tr + + TAM OYUNU SATIN AL + + item_1.png + psts:browse?product=EP4433-PCSB00560_00-MINECRAFTVIT0000 + + + zh + + BUY FULL GAME + + item_1.png + psts:browse?product=EP4433-PCSB00560_00-MINECRAFTVIT0000 + + + ch + + 購買完整版遊戲 + + item_1.png + psts:browse?product=EP4433-PCSB00560_00-MINECRAFTVIT0000 + + + + + + da + + PRØVEVERSION + + + + en + + TRIAL VERSION + + + + en-gb + + TRIAL VERSION + + + + de + + TESTVERSION + + + + el + + ΔΟΚΙΜΑΣΤΙΚΗ ΕΚΔΟΣΗ + + + + es + + VERSIÓN DE PRUEBA + + + + fi + + KOEVERSIO + + + + fr + + VERSION D'ESSAI + + + + it + + VERSIONE DI PROVA + + + + ja + + 体験版 + + + + ko + + 평가판 + + + + nl + + TESTVERSIE + + + + no + + PRØVEVERSJON + + + + pl + + WERSJA PRÓBNA + + + + pt-br + + VERSÃO DE AVALIAÇÃO + + + + pt + + VERSÃO DE AVALIAÇÃO + + + + ru + + ПРОБНАЯ ВЕРСИЯ + + + + sv + + DEMOVERSION + + + + tr + + DENEME SÜRÜMÜ + + + + zh + + TRIAL VERSION + + + + ch + + 試玩版 + + + + + + + diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/template.xml b/Minecraft.Client/PSVita/app/Region/SCEE/template.xml new file mode 100644 index 00000000..6cc56b06 --- /dev/null +++ b/Minecraft.Client/PSVita/app/Region/SCEE/template.xml @@ -0,0 +1,356 @@ + + + + + bg0.png + + + + startup.png + + + + + da + + OVERFLADEPAKKER + + item_1.png + psts:browse?category=EP4433-PCSB00560_00-SKINPACKS + + + en + + SKIN PACKS + + item_1.png + psts:browse?category=EP4433-PCSB00560_00-SKINPACKS + + + en-gb + + SKIN PACKS + + item_1.png + psts:browse?category=EP4433-PCSB00560_00-SKINPACKS + + + de + + DESIGN-PAKETE + + item_1.png + psts:browse?category=EP4433-PCSB00560_00-SKINPACKS + + + el + + ΠΑΚΕΤΑ ΕΜΦΑΝΙΣΕΩΝ + + item_1.png + psts:browse?category=EP4433-PCSB00560_00-SKINPACKS + + + es + + PACKS DE ASPECTOS + + item_1.png + psts:browse?category=EP4433-PCSB00560_00-SKINPACKS + + + fi + + ULKOASUPAKETIT + + item_1.png + psts:browse?category=EP4433-PCSB00560_00-SKINPACKS + + + fr + + PACKS DE SKINS + + item_1.png + psts:browse?category=EP4433-PCSB00560_00-SKINPACKS + + + it + + PACCHETTI SKIN + + item_1.png + psts:browse?category=EP4433-PCSB00560_00-SKINPACKS + + + ja + + スキン パック + + item_1.png + psts:browse?category=EP4433-PCSB00560_00-SKINPACKS + + + ko + + 캐릭터 팩 + + item_1.png + psts:browse?category=EP4433-PCSB00560_00-SKINPACKS + + + nl + + SKINPAKKETTEN + + item_1.png + psts:browse?category=EP4433-PCSB00560_00-SKINPACKS + + + no + + SKALLPAKKER + + item_1.png + psts:browse?category=EP4433-PCSB00560_00-SKINPACKS + + + pl + + PAKIETY SKÓREK + + item_1.png + psts:browse?category=EP4433-PCSB00560_00-SKINPACKS + + + pt-br + + PACOTES DE CAPAS + + item_1.png + psts:browse?category=EP4433-PCSB00560_00-SKINPACKS + + + pt + + PACKS DE SKINS + + item_1.png + psts:browse?category=EP4433-PCSB00560_00-SKINPACKS + + + ru + + НАБОРЫ СКИНОВ + + item_1.png + psts:browse?category=EP4433-PCSB00560_00-SKINPACKS + + + sv + + UTSEENDEPAKET + + item_1.png + psts:browse?category=EP4433-PCSB00560_00-SKINPACKS + + + tr + + GÖRÜNÜM PAKETLERİ + + item_1.png + psts:browse?category=EP4433-PCSB00560_00-SKINPACKS + + + zh + + SKIN PACKS + + item_1.png + psts:browse?category=EP4433-PCSB00560_00-SKINPACKS + + + ch + + 外觀套件 + + item_1.png + psts:browse?category=EP4433-PCSB00560_00-SKINPACKS + + + + + + da + + TEKSTURPAKKER + + item_2.png + psts:browse?category=EP4433-PCSB00560_00-TEXTUREPACKS + + + en + + TEXTURE PACKS + + item_2.png + psts:browse?category=EP4433-PCSB00560_00-TEXTUREPACKS + + + en-gb + + TEXTURE PACKS + + item_2.png + psts:browse?category=EP4433-PCSB00560_00-TEXTUREPACKS + + + de + + TEXTURPAKETE + + item_2.png + psts:browse?category=EP4433-PCSB00560_00-TEXTUREPACKS + + + el + + ΠΑΚΕΤΑ ΓΡΑΦΙΚΩΝ + + item_2.png + psts:browse?category=EP4433-PCSB00560_00-TEXTUREPACKS + + + es + + PACKS DE TEXTURAS + + item_2.png + psts:browse?category=EP4433-PCSB00560_00-TEXTUREPACKS + + + fi + + TEKSTUURIPAKETIT + + item_2.png + psts:browse?category=EP4433-PCSB00560_00-TEXTUREPACKS + + + fr + + PACKS DE TEXTURES + + item_2.png + psts:browse?category=EP4433-PCSB00560_00-TEXTUREPACKS + + + it + + PACCHETTI TEXTURE + + item_2.png + psts:browse?category=EP4433-PCSB00560_00-TEXTUREPACKS + + + ja + + テクスチャ パック + + item_2.png + psts:browse?category=EP4433-PCSB00560_00-TEXTUREPACKS + + + ko + + 텍스처 팩 + + item_2.png + psts:browse?category=EP4433-PCSB00560_00-TEXTUREPACKS + + + nl + + TEXTUREPAKKETTEN + + item_2.png + psts:browse?category=EP4433-PCSB00560_00-TEXTUREPACKS + + + no + + TEKSTURPAKKER + + item_2.png + psts:browse?category=EP4433-PCSB00560_00-TEXTUREPACKS + + + pl + + PAKIETY TEKSTUR + + item_2.png + psts:browse?category=EP4433-PCSB00560_00-TEXTUREPACKS + + + pt-br + + PACOTES DE TEXTURAS + + item_2.png + psts:browse?category=EP4433-PCSB00560_00-TEXTUREPACKS + + + pt + + PACKS DE TEXTURAS + + item_2.png + psts:browse?category=EP4433-PCSB00560_00-TEXTUREPACKS + + + ru + + НАБОРЫ ТЕКСТУР + + item_2.png + psts:browse?category=EP4433-PCSB00560_00-TEXTUREPACKS + + + sv + + TEXTURPAKET + + item_2.png + psts:browse?category=EP4433-PCSB00560_00-TEXTUREPACKS + + + tr + + KAPLAMA PAKETLERİ + + item_2.png + psts:browse?category=EP4433-PCSB00560_00-TEXTUREPACKS + + + zh + + TEXTURE PACKS + + item_2.png + psts:browse?category=EP4433-PCSB00560_00-TEXTUREPACKS + + + ch + + 材質套件 + + item_2.png + psts:browse?category=EP4433-PCSB00560_00-TEXTUREPACKS + + + + + + diff --git a/Minecraft.Client/PSVita/app/Region/SCEJ/param.sfo b/Minecraft.Client/PSVita/app/Region/SCEJ/param.sfo new file mode 100644 index 00000000..7a457568 Binary files /dev/null and b/Minecraft.Client/PSVita/app/Region/SCEJ/param.sfo differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEJ/template-trial.xml b/Minecraft.Client/PSVita/app/Region/SCEJ/template-trial.xml new file mode 100644 index 00000000..dc0f8039 --- /dev/null +++ b/Minecraft.Client/PSVita/app/Region/SCEJ/template-trial.xml @@ -0,0 +1,314 @@ + + + + + bg0.png + + + + startup.png + + + + + da + + KØB HELE SPILLET + + item_1.png + psts:browse?product=JP0127-PCSG00302_00-MINECRAFTVIT0000 + + + en + + BUY FULL GAME + + item_1.png + psts:browse?product=JP0127-PCSG00302_00-MINECRAFTVIT0000 + + + en-gb + + BUY FULL GAME + + item_1.png + psts:browse?product=JP0127-PCSG00302_00-MINECRAFTVIT0000 + + + de + + VOLLVERSION KAUFEN + + item_1.png + psts:browse?product=JP0127-PCSG00302_00-MINECRAFTVIT0000 + + + el + + ΑΓΟΡΑΣΤΕ ΤΟ ΠΛΗΡΕΣ ΠΑΙΧΝΙΔΙ + + item_1.png + psts:browse?product=JP0127-PCSG00302_00-MINECRAFTVIT0000 + + + es + + COMPRAR JUEGO COMPLETO + + item_1.png + psts:browse?product=JP0127-PCSG00302_00-MINECRAFTVIT0000 + + + fi + + OSTA KOKO PELI + + item_1.png + psts:browse?product=JP0127-PCSG00302_00-MINECRAFTVIT0000 + + + fr + + ACHETER LE JEU COMPLET + + item_1.png + psts:browse?product=JP0127-PCSG00302_00-MINECRAFTVIT0000 + + + it + + ACQUISTA IL GIOCO COMPLETO + + item_1.png + psts:browse?product=JP0127-PCSG00302_00-MINECRAFTVIT0000 + + + ja + + 完全版を購入する + + item_1.png + psts:browse?product=JP0127-PCSG00302_00-MINECRAFTVIT0000 + + + ko + + 정식 버전 게임 구매 + + item_1.png + psts:browse?product=JP0127-PCSG00302_00-MINECRAFTVIT0000 + + + nl + + VOLLEDIGE GAME KOPEN + + item_1.png + psts:browse?product=JP0127-PCSG00302_00-MINECRAFTVIT0000 + + + no + + KJØP FULLVERSJONEN + + item_1.png + psts:browse?product=JP0127-PCSG00302_00-MINECRAFTVIT0000 + + + pl + + KUP PEŁNĄ WERSJĘ + + item_1.png + psts:browse?product=JP0127-PCSG00302_00-MINECRAFTVIT0000 + + + pt-br + + COMPRAR JOGO COMPLETO + + item_1.png + psts:browse?product=JP0127-PCSG00302_00-MINECRAFTVIT0000 + + + pt + + COMPRAR JOGO COMPLETO + + item_1.png + psts:browse?product=JP0127-PCSG00302_00-MINECRAFTVIT0000 + + + ru + + КУПИТЬ ПОЛНУЮ ВЕРСИЮ ИГРЫ + + item_1.png + psts:browse?product=JP0127-PCSG00302_00-MINECRAFTVIT0000 + + + sv + + KÖP HELA SPELET + + item_1.png + psts:browse?product=JP0127-PCSG00302_00-MINECRAFTVIT0000 + + + tr + + TAM OYUNU SATIN AL + + item_1.png + psts:browse?product=JP0127-PCSG00302_00-MINECRAFTVIT0000 + + + zh + + BUY FULL GAME + + item_1.png + psts:browse?product=JP0127-PCSG00302_00-MINECRAFTVIT0000 + + + ch + + 購買完整版遊戲 + + item_1.png + psts:browse?product=JP0127-PCSG00302_00-MINECRAFTVIT0000 + + + + + + da + + PRØVEVERSION + + + + en + + TRIAL VERSION + + + + en-gb + + TRIAL VERSION + + + + de + + TESTVERSION + + + + el + + ΔΟΚΙΜΑΣΤΙΚΗ ΕΚΔΟΣΗ + + + + es + + VERSIÓN DE PRUEBA + + + + fi + + KOEVERSIO + + + + fr + + VERSION D'ESSAI + + + + it + + VERSIONE DI PROVA + + + + ja + + 体験版 + + + + ko + + 평가판 + + + + nl + + TESTVERSIE + + + + no + + PRØVEVERSJON + + + + pl + + WERSJA PRÓBNA + + + + pt-br + + VERSÃO DE AVALIAÇÃO + + + + pt + + VERSÃO DE AVALIAÇÃO + + + + ru + + ПРОБНАЯ ВЕРСИЯ + + + + sv + + DEMOVERSION + + + + tr + + DENEME SÜRÜMÜ + + + + zh + + TRIAL VERSION + + + + ch + + 試玩版 + + + + + + + diff --git a/Minecraft.Client/PSVita/app/Region/SCEJ/template.xml b/Minecraft.Client/PSVita/app/Region/SCEJ/template.xml new file mode 100644 index 00000000..7338c2c3 --- /dev/null +++ b/Minecraft.Client/PSVita/app/Region/SCEJ/template.xml @@ -0,0 +1,356 @@ + + + + + bg0.png + + + + startup.png + + + + + da + + OVERFLADEPAKKER + + item_1.png + psts:browse?category=JP0127-PCSG00302_00-SKINPACKS + + + en + + SKIN PACKS + + item_1.png + psts:browse?category=JP0127-PCSG00302_00-SKINPACKS + + + en-gb + + SKIN PACKS + + item_1.png + psts:browse?category=JP0127-PCSG00302_00-SKINPACKS + + + de + + DESIGN-PAKETE + + item_1.png + psts:browse?category=JP0127-PCSG00302_00-SKINPACKS + + + el + + ΠΑΚΕΤΑ ΕΜΦΑΝΙΣΕΩΝ + + item_1.png + psts:browse?category=JP0127-PCSG00302_00-SKINPACKS + + + es + + PACKS DE ASPECTOS + + item_1.png + psts:browse?category=JP0127-PCSG00302_00-SKINPACKS + + + fi + + ULKOASUPAKETIT + + item_1.png + psts:browse?category=JP0127-PCSG00302_00-SKINPACKS + + + fr + + PACKS DE SKINS + + item_1.png + psts:browse?category=JP0127-PCSG00302_00-SKINPACKS + + + it + + PACCHETTI SKIN + + item_1.png + psts:browse?category=JP0127-PCSG00302_00-SKINPACKS + + + ja + + スキン パック + + item_1.png + psts:browse?category=JP0127-PCSG00302_00-SKINPACKS + + + ko + + 캐릭터 팩 + + item_1.png + psts:browse?category=JP0127-PCSG00302_00-SKINPACKS + + + nl + + SKINPAKKETTEN + + item_1.png + psts:browse?category=JP0127-PCSG00302_00-SKINPACKS + + + no + + SKALLPAKKER + + item_1.png + psts:browse?category=JP0127-PCSG00302_00-SKINPACKS + + + pl + + PAKIETY SKÓREK + + item_1.png + psts:browse?category=JP0127-PCSG00302_00-SKINPACKS + + + pt-br + + PACOTES DE CAPAS + + item_1.png + psts:browse?category=JP0127-PCSG00302_00-SKINPACKS + + + pt + + PACKS DE SKINS + + item_1.png + psts:browse?category=JP0127-PCSG00302_00-SKINPACKS + + + ru + + НАБОРЫ СКИНОВ + + item_1.png + psts:browse?category=JP0127-PCSG00302_00-SKINPACKS + + + sv + + UTSEENDEPAKET + + item_1.png + psts:browse?category=JP0127-PCSG00302_00-SKINPACKS + + + tr + + GÖRÜNÜM PAKETLERİ + + item_1.png + psts:browse?category=JP0127-PCSG00302_00-SKINPACKS + + + zh + + SKIN PACKS + + item_1.png + psts:browse?category=JP0127-PCSG00302_00-SKINPACKS + + + ch + + 外觀套件 + + item_1.png + psts:browse?category=JP0127-PCSG00302_00-SKINPACKS + + + + + + da + + TEKSTURPAKKER + + item_2.png + psts:browse?category=JP0127-PCSG00302_00-TEXTUREPACKS + + + en + + TEXTURE PACKS + + item_2.png + psts:browse?category=JP0127-PCSG00302_00-TEXTUREPACKS + + + en-gb + + TEXTURE PACKS + + item_2.png + psts:browse?category=JP0127-PCSG00302_00-TEXTUREPACKS + + + de + + TEXTURPAKETE + + item_2.png + psts:browse?category=JP0127-PCSG00302_00-TEXTUREPACKS + + + el + + ΠΑΚΕΤΑ ΓΡΑΦΙΚΩΝ + + item_2.png + psts:browse?category=JP0127-PCSG00302_00-TEXTUREPACKS + + + es + + PACKS DE TEXTURAS + + item_2.png + psts:browse?category=JP0127-PCSG00302_00-TEXTUREPACKS + + + fi + + TEKSTUURIPAKETIT + + item_2.png + psts:browse?category=JP0127-PCSG00302_00-TEXTUREPACKS + + + fr + + PACKS DE TEXTURES + + item_2.png + psts:browse?category=JP0127-PCSG00302_00-TEXTUREPACKS + + + it + + PACCHETTI TEXTURE + + item_2.png + psts:browse?category=JP0127-PCSG00302_00-TEXTUREPACKS + + + ja + + テクスチャ パック + + item_2.png + psts:browse?category=JP0127-PCSG00302_00-TEXTUREPACKS + + + ko + + 텍스처 팩 + + item_2.png + psts:browse?category=JP0127-PCSG00302_00-TEXTUREPACKS + + + nl + + TEXTUREPAKKETTEN + + item_2.png + psts:browse?category=JP0127-PCSG00302_00-TEXTUREPACKS + + + no + + TEKSTURPAKKER + + item_2.png + psts:browse?category=JP0127-PCSG00302_00-TEXTUREPACKS + + + pl + + PAKIETY TEKSTUR + + item_2.png + psts:browse?category=JP0127-PCSG00302_00-TEXTUREPACKS + + + pt-br + + PACOTES DE TEXTURAS + + item_2.png + psts:browse?category=JP0127-PCSG00302_00-TEXTUREPACKS + + + pt + + PACKS DE TEXTURAS + + item_2.png + psts:browse?category=JP0127-PCSG00302_00-TEXTUREPACKS + + + ru + + НАБОРЫ ТЕКСТУР + + item_2.png + psts:browse?category=JP0127-PCSG00302_00-TEXTUREPACKS + + + sv + + TEXTURPAKET + + item_2.png + psts:browse?category=JP0127-PCSG00302_00-TEXTUREPACKS + + + tr + + KAPLAMA PAKETLERİ + + item_2.png + psts:browse?category=JP0127-PCSG00302_00-TEXTUREPACKS + + + zh + + TEXTURE PACKS + + item_2.png + psts:browse?category=JP0127-PCSG00302_00-TEXTUREPACKS + + + ch + + 材質套件 + + item_2.png + psts:browse?category=JP0127-PCSG00302_00-TEXTUREPACKS + + + + + + diff --git a/Minecraft.Client/PSVita/app/icon.png b/Minecraft.Client/PSVita/app/icon.png new file mode 100644 index 00000000..16a56e1c Binary files /dev/null and b/Minecraft.Client/PSVita/app/icon.png differ diff --git a/Minecraft.Client/PSVita/app/sce_sys/icon0.png b/Minecraft.Client/PSVita/app/sce_sys/icon0.png new file mode 100644 index 00000000..fcf1e1d9 Binary files /dev/null and b/Minecraft.Client/PSVita/app/sce_sys/icon0.png differ diff --git a/Minecraft.Client/PSVita/app/sce_sys/livearea/contents/bg0.png b/Minecraft.Client/PSVita/app/sce_sys/livearea/contents/bg0.png new file mode 100644 index 00000000..9841e43d Binary files /dev/null and b/Minecraft.Client/PSVita/app/sce_sys/livearea/contents/bg0.png differ diff --git a/Minecraft.Client/PSVita/app/sce_sys/livearea/contents/item_1.png b/Minecraft.Client/PSVita/app/sce_sys/livearea/contents/item_1.png new file mode 100644 index 00000000..f4986aa6 Binary files /dev/null and b/Minecraft.Client/PSVita/app/sce_sys/livearea/contents/item_1.png differ diff --git a/Minecraft.Client/PSVita/app/sce_sys/livearea/contents/startup.png b/Minecraft.Client/PSVita/app/sce_sys/livearea/contents/startup.png new file mode 100644 index 00000000..a80576ee Binary files /dev/null and b/Minecraft.Client/PSVita/app/sce_sys/livearea/contents/startup.png differ diff --git a/Minecraft.Client/PSVita/app/sce_sys/param.sfo b/Minecraft.Client/PSVita/app/sce_sys/param.sfo new file mode 100644 index 00000000..3f0a4e7d Binary files /dev/null and b/Minecraft.Client/PSVita/app/sce_sys/param.sfo differ diff --git a/Minecraft.Client/PSVita/app/sce_sys/pic0.png b/Minecraft.Client/PSVita/app/sce_sys/pic0.png new file mode 100644 index 00000000..5e817ba6 Binary files /dev/null and b/Minecraft.Client/PSVita/app/sce_sys/pic0.png differ diff --git a/Minecraft.Client/PSVita/app/sce_sys/retail/livearea/contents/bg0.png b/Minecraft.Client/PSVita/app/sce_sys/retail/livearea/contents/bg0.png new file mode 100644 index 00000000..a23282f3 Binary files /dev/null and b/Minecraft.Client/PSVita/app/sce_sys/retail/livearea/contents/bg0.png differ diff --git a/Minecraft.Client/PSVita/app/sce_sys/retail/livearea/contents/item_1.png b/Minecraft.Client/PSVita/app/sce_sys/retail/livearea/contents/item_1.png new file mode 100644 index 00000000..d1a4c0f2 Binary files /dev/null and b/Minecraft.Client/PSVita/app/sce_sys/retail/livearea/contents/item_1.png differ diff --git a/Minecraft.Client/PSVita/app/sce_sys/retail/livearea/contents/item_2.png b/Minecraft.Client/PSVita/app/sce_sys/retail/livearea/contents/item_2.png new file mode 100644 index 00000000..85181d0b Binary files /dev/null and b/Minecraft.Client/PSVita/app/sce_sys/retail/livearea/contents/item_2.png differ diff --git a/Minecraft.Client/PSVita/app/sce_sys/retail/livearea/contents/startup.png b/Minecraft.Client/PSVita/app/sce_sys/retail/livearea/contents/startup.png new file mode 100644 index 00000000..a80576ee Binary files /dev/null and b/Minecraft.Client/PSVita/app/sce_sys/retail/livearea/contents/startup.png differ diff --git a/Minecraft.Client/PSVita/configuration.psp2path b/Minecraft.Client/PSVita/configuration.psp2path new file mode 100644 index 00000000..39c1923f --- /dev/null +++ b/Minecraft.Client/PSVita/configuration.psp2path @@ -0,0 +1,40 @@ +version=1 +app0= +savedata0=launch:savedata +addcont0= +otherApps= +otherAppsPatches= +otherAppsSavedata= +otherAppsContents= +overlay1type=SCE_FIOS_OVERLAY_TYPE_TRANSLUCENT +overlay1order=64 +overlay1src=launch:sce_module +overlay1dst=app0:sce_module +overlay2type= +overlay2order= +overlay2src= +overlay2dst= +overlay3type= +overlay3order= +overlay3src= +overlay3dst= +overlay4type= +overlay4order= +overlay4src= +overlay4dst= +overlay5type= +overlay5order= +overlay5src= +overlay5dst= +overlay6type= +overlay6order= +overlay6src= +overlay6dst= +overlay7type= +overlay7order= +overlay7src= +overlay7dst= +overlay8type= +overlay8order= +overlay8src= +overlay8dst= diff --git a/Minecraft.Client/PSVita/session_image.png b/Minecraft.Client/PSVita/session_image.png new file mode 100644 index 00000000..fcf1e1d9 Binary files /dev/null and b/Minecraft.Client/PSVita/session_image.png differ diff --git a/Minecraft.Client/PSVitaMedia/Media/DLCOffersMenuVita.swf b/Minecraft.Client/PSVitaMedia/Media/DLCOffersMenuVita.swf new file mode 100644 index 00000000..9dfa6d89 Binary files /dev/null and b/Minecraft.Client/PSVitaMedia/Media/DLCOffersMenuVita.swf differ diff --git a/Minecraft.Client/PSVitaMedia/Media/DefaultOptionsImage228x128.png b/Minecraft.Client/PSVitaMedia/Media/DefaultOptionsImage228x128.png new file mode 100644 index 00000000..6a26d479 Binary files /dev/null and b/Minecraft.Client/PSVitaMedia/Media/DefaultOptionsImage228x128.png differ diff --git a/Minecraft.Client/PSVitaMedia/Media/DefaultOptionsImage320x176.png b/Minecraft.Client/PSVitaMedia/Media/DefaultOptionsImage320x176.png new file mode 100644 index 00000000..ffc58e38 Binary files /dev/null and b/Minecraft.Client/PSVitaMedia/Media/DefaultOptionsImage320x176.png differ diff --git a/Minecraft.Client/PSVitaMedia/Media/DefaultSaveImage228x128.png b/Minecraft.Client/PSVitaMedia/Media/DefaultSaveImage228x128.png new file mode 100644 index 00000000..78f8b1c3 Binary files /dev/null and b/Minecraft.Client/PSVitaMedia/Media/DefaultSaveImage228x128.png differ diff --git a/Minecraft.Client/PSVitaMedia/Media/DefaultSaveImage320x176.png b/Minecraft.Client/PSVitaMedia/Media/DefaultSaveImage320x176.png new file mode 100644 index 00000000..d76098cf Binary files /dev/null and b/Minecraft.Client/PSVitaMedia/Media/DefaultSaveImage320x176.png differ diff --git a/Minecraft.Client/PSVitaMedia/Media/DefaultSaveThumbnail64x64.png b/Minecraft.Client/PSVitaMedia/Media/DefaultSaveThumbnail64x64.png new file mode 100644 index 00000000..ac6b3b2c Binary files /dev/null and b/Minecraft.Client/PSVitaMedia/Media/DefaultSaveThumbnail64x64.png differ diff --git a/Minecraft.Client/PSVitaMedia/Media/languages.loc b/Minecraft.Client/PSVitaMedia/Media/languages.loc new file mode 100644 index 00000000..9d950e01 Binary files /dev/null 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 new file mode 100644 index 00000000..ef819833 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/Media/media.txt @@ -0,0 +1,6 @@ +languages.loc +skinVita.swf +DLCOffersMenuVita.swf +DefaultOptionsImage320x176.png +DefaultSaveImage320x176.png +DefaultSaveThumbnail64x64.png \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/Media/skinVita.swf b/Minecraft.Client/PSVitaMedia/Media/skinVita.swf new file mode 100644 index 00000000..7389d17a Binary files /dev/null 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/4J_stringsGeneric.xml b/Minecraft.Client/PSVitaMedia/loc/4J_stringsGeneric.xml new file mode 100644 index 00000000..8c75e1d3 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/4J_stringsGeneric.xml @@ -0,0 +1,114 @@ + + + + OK + + + + Back + + + + Cancel + + + + Yes + + + + No + + + + Corrupt Save + + + + Your save data appears to be corrupt. Create a new save and overwrite the corrupt one? + + + + No Free Space + + + + Select again + + + + Play without saving + + + + Create a new save + + + + Overwrite save? + + + + No - don't overwrite + + + + Overwrite and save + + + + Save failed + + + + Continue without saving + + + + Loading failed + + + + Name the save + + + + Enter a name for your savegame + + + + Are you sure you want to exit the game? + + + + Signed out + + + + Continue playing + + + + Continue playing offline + + + + Guest Player + + + + Guest players cannot access the "PSN". + + + + Saving… + + + + Saving content. Please don't turn off your system. + + + + Unlock Full Game + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/4J_stringsPlatformSpecific.xml b/Minecraft.Client/PSVitaMedia/loc/4J_stringsPlatformSpecific.xml new file mode 100644 index 00000000..6cd4b7df --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/4J_stringsPlatformSpecific.xml @@ -0,0 +1,76 @@ + + + Your system storage doesn't have enough free space to create a game save. + + + + You have been returned to the title screen because you have signed out of the "PSN" + + + + The match has ended because you have signed out of the "PSN" + + + + + Currently not signed in. + + + + + This game has some features which require being signed in to the "PSN", but you are currently offline. + + + + Ad Hoc Network offline. + + + + This game has some features which require an Ad Hoc network connection, but you are currently offline. + + + + This feature requires being signed in to the "PSN". + + + + + Connect to "PSN" + + + + Connect to Ad Hoc Network + + + + Trophy Problem + + + + There was a problem accessing your Sony Entertainment Network account. Your trophy could not be awarded at this time. + + + + Sony Entertainment Network account problem + + + + Saving of settings to your Sony Entertainment Network account has failed. + + + + This is the Minecraft: PlayStation®3 Edition trial game. If you had the full game, you would just have earned a trophy! +Unlock the full game to experience the joy of Minecraft: PlayStation®3 Edition and to play with your friends across the globe through the "PSN". +Would you like to unlock the full game? + + + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/AdditionalStrings.xml b/Minecraft.Client/PSVitaMedia/loc/AdditionalStrings.xml new file mode 100644 index 00000000..9834da86 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/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/PSVitaMedia/loc/EULA.xml b/Minecraft.Client/PSVitaMedia/loc/EULA.xml new file mode 100644 index 00000000..42a075b4 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/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/PSVitaMedia/loc/da-DA/4J_stringsGeneric.xml b/Minecraft.Client/PSVitaMedia/loc/da-DA/4J_stringsGeneric.xml new file mode 100644 index 00000000..a0c1801e --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/da-DA/4J_stringsGeneric.xml @@ -0,0 +1,87 @@ + + + + OK + + + Tilbage + + + Annullér + + + Ja + + + Nej + + + Ødelagte gemte data + + + Dine gemte data er ødelagte. Vil du oprette et nyt gemt spil og overskrive de ødelagte data? + + + Ingen ledig plads + + + Vælg igen + + + Spil uden at gemme + + + Opret et nyt gemt spil + + + Overskriv gemte data? + + + Nej, lad være med at overskrive + + + Overskriv og gem + + + Kunne ikke gemme + + + Fortsæt uden at gemme + + + Kunne ikke indlæse + + + Navngiv det gemte spil + + + Indtast et navn til dit gemte spil + + + Er du sikker på, at du vil afslutte spillet? + + + Logget ud + + + Fortsæt med at spille + + + Fortsæt med at spille offline + + + Gæstespiller + + + Gæstespillere kan ikke få adgang til "PSN". + + + Gemmer ... + + + Gemmer indhold. Du må ikke slukke for dit system. + + + Oplås det fulde spil + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/da-DA/4J_stringsPlatformSpecific.xml b/Minecraft.Client/PSVitaMedia/loc/da-DA/4J_stringsPlatformSpecific.xml new file mode 100644 index 00000000..bda7b453 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/da-DA/4J_stringsPlatformSpecific.xml @@ -0,0 +1,50 @@ + + + + Det lykkedes ikke at gemme indstillingerne til din Sony Entertainment Network-konto. + + + Sony Entertainment Network-kontoproblem + + + 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 new file mode 100644 index 00000000..a877ed86 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/da-DA/AdditionalStrings.xml @@ -0,0 +1,96 @@ + + + + Vis alle mash-up-verdener + + + Skjul + + + Minecraft: PlayStation®3 Edition + + + Indstillinger + + + Gem cache + + + Der opstod en netværksfejl. + + + Netværksfejl + + + Der opstod en netværksfejl. Afslutter til hovedmenuen. + + + Onlinetjenesten er deaktiveret for din Sony Entertainment Network-konto på grund af chatbegrænsninger. + + + Onlinetjenesten er deaktiveret for din Sony Entertainment Network-konto på grund af indstillingerne for forældrekontrol. + + + Onlinetjeneste + + + Du er blevet logget ud af "PSN". Onlinefunktionerne i spillet vil være utilgængelige, indtil du logger ind på "PSN" igen. + + + Du er blevet logget ud af "PSN". Onlinefunktionerne i spillet vil være utilgængelige, indtil du logger ind på "PSN" igen. Afslutter til hovedmenuen. + + + Vælg bruger for spiller %d (eller annullér for at spille som gæst) + + + Gratis + + + 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. + + + Trophies er slået fra + + + Trophies bliver slået fra, fordi det gemte spil tilhører en anden spiller. + + + Kritisk fejl: Trophies kunne ikke indlæses. Afslut venligst spillet. + + + Invitationer + + + Ødelagt fil + + + Controlleren mistede forbindelsen + + + Din controller mistede forbindelsen. Tilslut venligst controller igen. + + + 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. + + + Invitation + + + Kom og spil Minecraft: PlayStation®Vita Edition! + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/da-DA/EULA.xml b/Minecraft.Client/PSVitaMedia/loc/da-DA/EULA.xml new file mode 100644 index 00000000..3e1018f1 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/da-DA/EULA.xml @@ -0,0 +1,99 @@ + + + + Minecraft: PlayStation®Vita Edition – BETINGELSER FOR BRUG + Disse betingelser udstikker reglerne for brug af Minecraft: PlayStation®Vita Edition ("Minecraft"). For at beskytte Minecraft og medlemmerne af vores fællesskab har vi brug for disse betingelser for at udstikke nogle regler for download og brug af Minecraft. Vi bryder os lige så lidt om regler, som I sikkert gør, så vi har forsøgt at gøre dem så korte som mulige. Men vær opmærksom på, at hvis du køber, downloader, bruger eller spiller Minecraft, indvilger du i at overholde disse betingelser ("Betingelser"). +Inden vi kommer i gang, er der en ting, vi vil understrege ekstra tydeligt. Minecraft er et spil, der handler om at bygge og ødelægge ting. Hvis du spiller med andre (multiplayer), kan du bygge sammen med dem, eller du kan ødelægge det, de har bygget – og de kan gøre det samme mod dig. Så lad være med at spille med nogen, hvis ikke de opfører sig, som du ønsker det. Og nogle gange gør folk bare noget, de ikke burde. Vi bryder os ikke om det, men der er ikke meget, vi kan gøre for at forhindre det, udover at bede alle om at opføre sig pænt. Vi stoler på, at du og andre som dig i fællesskabet vil fortælle os, hvis nogen opfører sig upassende, eller hvis du mener, at nogen overtræder reglerne eller disse betingelser eller misbruger Minecraft. Vi har et klagesystem til formålet, som I endelig skal bruge, og så vil vi gøre det nødvendige for at tage os af sagen. + Hvis du vil klage eller gøre os opmærksomme på et problem, kan du sende en e-mail til os på support@mojang.com. Giv os så mange oplysninger som muligt, fx brugerens navn og en beskrivelse af problemet. + Og nu tilbage til betingelserne. + DEN VIGTIGSTE REGEL + Den vigtigste regel er, at du ikke må distribuere noget, vi har lavet. Når vi siger "distribuere noget, vi har lavet", mener vi, at du ikke må "forære kopier af Minecraft væk, anvende det til kommerciel brug, forsøge at tjene penge på det eller lade andre få adgang til Minecraft og dets dele på en måde, der er uretfærdig eller urimelig". Så den vigtigste regel er, at medmindre vi giver dig udtrykkelig tilladelse til det, som det angives i vores retningslinjer for mærke og aktiver, må du ikke: + • give kopier af Minecraft til andre. + • anvende noget af det, vi har lavet, til kommerciel brug. + • forsøge at tjene penge på noget, vi har lavet. + • lade andre få adgang til noget, vi har lavet, på en måde, der er uretfærdig eller urimelig. + ... og bare så det er helt klart, så omfatter det, vi har lavet, klient- eller serversoftware fra Minecraft (men begrænser sig ikke hertil). Det gælder også modificerede versioner af spillet, dele af det eller noget andet, vi har lavet. + Men derudover er vi ret afslappede i forhold til, hvad du ellers foretager dig – og vi opfordrer dig på det kraftigste til at lave seje ting med spillet (se nedenfor) – så længe du ikke overtræder vores regler. + BRUG AF MINECRAFT + • Du har købt Minecraft, så derfor kan du selv bruge det på dit PlayStation®Vita-system. + • Nedenfor giver vi dig også nogle begrænsede rettigheder til at gøre andre ting, men vi bliver nødt til at trække stregen et sted, for at visse personer ikke misbruger dem. Hvis du har lyst til at lave noget i forbindelse med det, vi har lavet, takker vi ydmygt, men vi beder dig om at sikre dig, at din kreation ikke kan blive opfattet som et officielt produkt, og at den overholder disse betingelser og ikke anvender noget af det, vi har lavet, til kommerciel brug. + • Tilladelsen, vi giver dig til at bruge og spille Minecraft, kan blive trukket tilbage, hvis du overtræder betingelserne. + • Når du køber Minecraft, giver vi dig tilladelse til at installere Minecraft på dit eget PlayStation®Vita-system og bruge samt spille det på dit eget PlayStation®Vita-system, som det angives i disse betingelser. Denne tilladelse gives til dig personligt, og du må derfor ikke videredistribuere Minecraft (eller nogen del af det) til andre (medmindre du har fået direkte tilladelse af os). + • Inden for rimelighedens grænser må du gøre lige, hvad du vil med billeder og videoer fra Minecraft. "Inden for rimelighedens grænser" betyder, at du ikke må bruge dem til kommerciel brug eller anvende dem til formål, der er urimelige, eller som direkte påvirker vores rettigheder. Du må heller ikke stjæle grafiske ressourcer fra spillet og dele dem, det er bare ikke sjovt. + • Tommelfingerreglen er, at du ikke må gøre kommerciel brug af noget, vi har lavet, medmindre vi har givet udtrykkelig tilladelse til det enten i henhold til vores retningslinjer for vores mærke og aktiver eller i disse betingelser. Og hvis loven tillader det, såsom i henhold til love for "rimelig brug" og "rimelig anvendelse", så er det også i orden – men kun i det omfang loven tillader det. + EJERSKAB AF MINECRAFT OG ANDRE TING + • Selvom vi giver dig tilladelse til at spille Minecraft, er vi stadig ejerne af spillet. Vi ejer også vores mærker og andet indhold i Minecraft, der er skabt med vores software, teksturer, aktiver, redskaber, infrastruktur og en masse andre smarte (og knap så smarte) ting, som vi ejer. Alle vores rettigheder til de ting holdes i hævd og forbeholdes, men du kan bruge dem i henhold til disse betingelser. + • Det betyder ikke, at vi mener, at vi ejer alle de seje ting, som du skaber i Minecraft – du skal bare acceptere, at vi ejer alle dele af Minecraft og Minecraft som produkt og tjeneste samt de ting, der nævnes i den forudgående sætning – og vi ejer også ophavsretten og andre såkaldte intellektuelle rettigheder ("IPR"), der forbindes med disse ting og navne og mærker, der forbindes med Minecraft. + • Du skal selvfølgelig lave dine helt egne ting og bruge dem i Minecraft. Vi ejer ikke det originale materiale, du har lavet, og vi påberåber os heller ikke ejerskab af noget, som ikke tilhører os. Vi ejer dog de ting, der er direkte kopier (eller indirekte kopier) eller afledt af vores ejendele og skabninger (som angivet ovenfor) – men hvis du har skabt dine helt egne ting, tilhører de ikke os. Lad os give dig et eksempel: + – en helt almindelig klods. Den ejer vi. + – en gotisk katedral med en rutsjebane i midten. Den ejer vi ikke. + • Så når du betaler for brugen af Minecraft, køber du kun en tilladelse til at bruge Minecraft-produktet i overensstemmelse med disse betingelser. De eneste tilladelser, du får i forbindelse med Minecraft, er de tilladelser, der nævnes i disse betingelser. + INDHOLD + • Hvis du gør indhold tilgængeligt i eller via Minecraft, skal du give os tilladelse til at bruge, kopiere, modificere og tilpasse indholdet. Den tilladelse skal være uigenkaldelig og ubegrænset. Du skal også tillade, at andre personer må bruge dit indhold, og du skal give tilladelse til, at andre må tilgå det (fx medspillere i multiplayer). + • Tænk dig venligst godt om, inden du gør indholdet tilgængeligt, for herefter kan andre offentliggøre og anvende det på en måde, som du måske ikke bryder dig om. + • Hvis du vil gøre indhold tilgængeligt i eller via Minecraft, må det ikke være anstødeligt eller ulovligt. Det skal være ærligt, og det skal være noget, du selv har skabt. Noget af det, du ikke må gøre tilgængeligt i Minecraft er: Indlæg, der indeholder racistisk eller homofobisk sprogbrug; indlæg, der mobber eller troller; indlæg, der kan skade vores eller andres omdømme; indlæg, der indeholder pornografisk indhold, reklamer eller andres kreationer eller billeder; eller indlæg, der foregiver at være skrevet af en moderator, eller som forsøger at narre eller udnytte andre. + • Alt indhold, du gør tilgængeligt i Minecraft, skal være skabt af dig. Du må ikke gøre indhold tilgængeligt i Minecraft, som krænker andres ophavsrettigheder. Hvis du deler indhold i Minecraft, og vi modtager indsigelser eller henvendelser med trusler om retsforfølgelse fra nogen, der mener, at indholdet krænker vedkommendes rettigheder, kan vi holde dig ansvarlig, og det kan betyde, at du skal betale erstatning til os for eventuel skade som følge heraf. Derfor er det meget vigtigt, at du kun gør indhold tilgængeligt, som du selv har skabt, og at du ikke har skabt det med andres indhold. + • Pas på, hvem du spiller med. Det er svært både for dig og os at vide, om det, som andre siger, er sandt, eller om de er dem, de udgiver sig for at være. Du bør aldrig dele dine personlige oplysninger i Minecraft. + Hvis du vil gøre indhold ("Dit indhold") tilgængeligt i Minecraft, skal det følge nedenstående retningslinjer: + – Indholdet skal overholde alle Sony Computer Entertainments regler, inklusive ToSUA, der er brugsbetingelserne og brugeraftalen for "PSN" samt andre retningslinjer, du skal acceptere for at bruge dit PlayStation®Vita-system og "PSN"; + – Indholdet må ikke være anstødeligt for andre spillere. + – Indholdet må ikke være ulovligt. + – Indholdet skal være ærligt og ikke kunne vildlede, narre eller udnytte nogen eller udgive sig for at være andre. + – Indholdet må ikke krænke ophavsrettigheder eller andres rettigheder. + – Indholdet må ikke være racistisk, kønsdiskriminerende eller homofobisk. + – Indholdet må ikke mobbe eller trolle. + – Indholdet må ikke skade andres omdømme. + – Indholdet må ikke være af pornografisk karakter. + – Indholdet må ikke indeholde reklamer. + – Du må ikke gøre andres indhold tilgængeligt i Minecraft, som krænker andres ophavsrettigheder. + • Du er ansvarlig for alt indhold, som du stiller til rådighed i Minecraft. + • Når du gør dit indhold tilgængeligt, tilkendegiver du over for os, at du har ret til at gøre dette i henhold til disse betingelser, og at vi må håndhæve de rettigheder, du har givet os i henhold til disse betingelser. + • Hvis vi modtager indsigelser eller henvendelser med trusler om retsforfølgelse på grund af indhold, du har gjort tilgængeligt i Minecraft, eller som gøres tilgængeligt af andre via Minecraft, kan vi fjerne det, og du kan blive holdt ansvarlig og afkrævet erstatning for eventuel skade som følge heraf. Din adgang til visse dele af Minecraft kan også blive fjernet eller suspenderet. + BRUGERINDHOLD + Følgende udstikker betingelser for dit indhold og indhold, der gøres tilgængeligt af andre, og som herefter omtales som "Brugerindhold". Minecraft er en underholdningstjeneste, og i forbindelse med dette er vi (og vores licenshavere (som Sony Computer Entertainment)) medvirkende i udsendelse, distribuering, opbevaring og indsamling af brugerindhold uden kontrol, udvælgelse eller ændring af indholdet. Det betyder, at vi ikke kontrollerer brugerindholdet, og derfor ved vi heller ikke, hvad der udgives og videregives af dig og andre spillere. Vi har lavet disse regler i vores betingelser, som du og andre skal overholde, men vi kan ikke holde øje med alt, der sker. + Derfor bedes du bemærke: + • Holdningerne, der udtrykkes i brugerindholdet, tilhører udelukkende skaberen eller skaberne og deles ikke af os eller nogen i forbindelse med os, medmindre vi udtrykkeligt tilkendegiver det. + • Vi er ikke ansvarlige (og giver ingen garanti for samt fralægger os det fulde ansvar) for brugerindholdet, inklusive kommentarer, holdninger eller bemærkninger, der udtrykkes heri. + • Når du spiller Minecraft anerkender du, at vi ikke har noget ansvar for at kontrollere brugerindhold, og at alt brugerindhold stilles til rådighed under den betingelse, at vi ikke behøver udøve nogen kontrol eller regulering af det. + MEN vi (eller vores licenshavere som Sony Computer Entertainment) kan fjerne, afvise eller suspendere adgang til alt brugerindhold og fjerne eller suspendere dine muligheder for at udgive, dele eller tilgå brugerindhold – inklusive fjerne eller suspendere adgang til Minecraft eller "PSN", hvis vi finder det passende som følge af, at du har overtrådt disse betingelser eller som følge af en klage. Vi vil også handle resolut i forbindelse med at fjerne eller deaktivere adgang til brugerindhold, hvis og når vi har kendskab til, at det finder ulovligheder sted. + OPGRADERINGER + • Vi kan gøre opgraderinger og opdateringer tilgængelige fra tid til anden, men vi behøver ikke gøre det. Vi er heller ikke forpligtede til at yde fortsat support eller vedligeholdelse af noget spil. Vi håber selvfølgelig på at kunne fortsætte med at udgive nye opdateringer til Minecraft, men vi kan ikke garantere, at vi gør det. + VORES ANSVAR + • Når du modtager et eksemplar af Minecraft, leveres det til dig, "som det er". Opdateringer og opgraderinger leveres også, "som de er". Det betyder, at vi ikke afgiver nogen løfter i forbindelse med standarden for eller kvaliteten af Minecraft, eller garantier for at Minecraft vil fungere uden afbrydelse eller fejl, og vi er ikke ansvarlige for eventuelle tab som følge heraf. Vi lover kun at levere Minecraft og tjenesterne med rimelig kompetence og omhu. Lovgivningen i de fleste lande siger, at vi ikke kan fraskrive os ansvar for dødsfald eller personskader som følge af forsømmelighed fra vores side. Så hvis din computer pludselig rejser sig og stikker dig ned som følge af noget, vi har gjort galt, skal vi selvfølgelig nok tage ansvaret for det. + VI ER IKKE ANSVARLIGE FOR: + • DIN ELLER ANDRES BRUG ELLER MISBRUG AF MINECRAFT. + • INDHOLD SOM DU STILLER TIL RÅDIGHED I MINECRAFT. + • DINE OVERTRÆDELSER AF BETINGELSERNE. + • ANDRES OVERTRÆDELSER AF BETINGELSERNE. + OPSIGELSE + • Såfremt vi ønsker det, kan vi opsige din brugsret til Minecraft, hvis du overtræder disse betingelser. Du kan også opsige dem ved at afinstallere Minecraft fra dit PlayStation®Vita-system. Afsnittene om "Ejerskab af Minecraft", "Vores ansvar" og "Generelle bemærkninger" vil stadig være gældende efter opsigelsen. + GENERELLE BEMÆRKNINGER + • Disse betingelser er underlagt de juridiske rettigheder, du måtte have. Intet i disse betingelser begrænser dine rettigheder i et omfang, så det ikke kan undtages som følge af gældende lovgivning, og de skal heller ikke udelukke eller begrænse vores ansvar i forbindelse med dødsfald eller personskade, der opstår som følge af forsømmelighed eller misvisende påstande fra vores side. + • Vi kan ændre disse betingelser fra tid til anden, men disse ændringer vil kun være gældende i det omfang, at de er relevante. Hvis du eksempelvis kun spiller Minecraft i singleplayer og ikke bruger opdateringerne, som vi stiller til rådighed, så er den gamle EULA stadig gældende. Men hvis du anvender opdateringer eller bruger dele af Minecraft, der er afhængige af vores fortsatte onlinetjenester, så vil den nye EULA være gældende. I dette tilfælde kan eller behøver vi muligvis ikke fortælle dig om ændringerne, for at de træder i kraft, så sørg for at vende tilbage hertil med jævne mellemrum for at holde dig orienteret om eventuelle ændringer af betingelserne. Det er ikke for at være urimelige – men nogle gange bliver lovene ændret, eller nogen gør noget, der påvirker andre Minecraft-spillere, og derfor skal vi kunne putte låg på det. + • Hvis du henvender dig til os med forslag til Minecraft eller andre af vores spil, giver du os forslaget gratis. Det betyder, at vi må bruge dit forslag, som vi vil, uden at behøve at betale dig for det. Hvis du tror, at du har forslag, som vi ville være villige til at betale dig for, skal du gøre os opmærksomme på, at du forventer betaling, inden du fortæller os om dit forslag. + • Udover disse betingelser har vi også nogle retningslinjer for mærker og aktiver, som du kan læse online. + • Hvis du overtræder disse regler, vil vi (eller Sony Computer Entertainment) muligvis forhindre dig i at spille Minecraft. Hvis ikke du er villig til eller ikke kan acceptere disse regler, skal du ikke købe, downloade, bruge eller spille Minecraft. + Hvis du finder et eller andet juridisk smuthul, der ikke er nævnt på denne side, beder vi dig om at lade være med at udnytte det. Spørg os hellere, hvis du er i tvivl om noget. Kort sagt, hvis du opfører dig ordentligt, gør vi det samme. + Vi er: + Mojang AB + Maria Skolgata 83, + SE-11853 + Stockholm + Sverige + Virksomhedsnummer: 556819-2388 + + + + + Alt indhold, der købes i en butik i spillet, er købt fra Sony Network Entertainment Europe Limited ("SNEE") og underlagt Sony Entertainment Networks brugsbetingelser og brugeraftale, der kan læses på PlayStation®Store. Læs venligst oplysningerne om brugsrettigheder for hvert køb, da de kan variere fra genstand til genstand. Medmindre andet angives, er indholdet i spillets butik underlagt samme aldersbegrænsninger som resten af spillet. + + + + + Køb og brug af genstande er underlagt Sony Entertainment Networks brugsbetingelser og brugeraftale. Onlinetjenesten er underlicenseret til dig fra Sony Computer Entertainment America. + + + + Husk: Brug af denne software er underlagt betingelser for Betingelser for brug, der kan læses på eu.playstation.com/legal. + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/da-DA/stringsDynafont.xml b/Minecraft.Client/PSVitaMedia/loc/da-DA/stringsDynafont.xml new file mode 100644 index 00000000..dca31ec2 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/da-DA/stringsDynafont.xml @@ -0,0 +1,7 @@ + + + + DynaFont developed by DynaComware. + + + \ 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 new file mode 100644 index 00000000..88ade111 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/da-DA/stringsGeneric.xml @@ -0,0 +1,7000 @@ + + + + Skifter til offlinespil + + + Vent venligst, mens værten gemmer spillet + + + Rejser til Mørket + + + Gemmer spillere + + + Tilslutter til vært + + + Downloader terræn + + + Forlader Mørket + + + 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. + + + 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. + + + Indlæser bane + + + Afslutter ... + + + Bygger terræn + + + Simulerer verdenen et kort stykke tid + + + Rang + + + Forbereder at gemme banen + + + Forbereder dele ... + + + Starter server + + + Forlader Afgrunden + + + Gendanner + + + Skaber bane + + + Opretter fremkaldelsesområde + + + Indlæser fremkaldelsesområde + + + Rejser til Afgrunden + + + Redskaber og våben + + + Lysstyrke + + + Spilfølsomhed + + + Skærmfølsomhed + + + Sværhedsgrad + + + Musik + + + Lyd + + + Fredfyldt + + + 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. + + + Let + + + Normal + + + Svær + + + Logget ud + + + Rustning + + + Mekanismer + + + Transport + + + Våben + + + Mad + + + Strukturer + + + Dekorationer + + + Brygning + + + Redskaber, våben og rustninger + + + Materialer + + + Byggeblokke + + + Rødsten og transport + + + 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 + + + Omdøb din verden + + + Indtast et nyt navn til din verden + + + Spiltype: Overlevelse + + + Oprettet i Overlevelse + + + Omdøb gemte spil + + + Gemmer automatisk om %d ... + + + Til + + + Oprettet i Kreativ + + + Vis skyer + + + Hvad vil du gøre med det gemte spil? + + + Display-størrelse (delt skærm) + + + Ingrediens + + + Brændsel + + + Automat + + + Kiste + + + Fortryl + + + Ovn + + + Der er ikke nogen tilbud på indhold, der kan hentes, af denne type i øjeblikket. + + + Er du sikker på, at du vil slette det gemte spil? + + + Afventer godkendelse + + + Censureret + + + %s har sluttet sig til spillet. + + + %s har forladt spillet. + + + %s blev smidt ud af spillet. + + + Bryggestativ + + + Indtast tekst til skilt + + + Indtast tekst til dit skilt + + + Indtast en titel + + + Prøveversionen er udløbet + + + Spillet er fyldt + + + Kunne ikke logge ind, fordi der ikke er flere ledige pladser + + + Indtast en titel til dit opslag + + + Indtast en beskrivelse til dit opslag + + + Lager + + + Ingredienser + + + Indtast overskrift + + + Indtast en overskrift til dit opslag + + + Indtast beskrivelse + + + Spiller nu: + + + 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 + + + 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? + + + Interval for automatisk gemte spil: FRA + + + Skærmgennemsigtighed + + + Gør forberedelser til at gemme banen automatisk + + + Display-størrelse + + + 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. + + + Favoritoverflade + + + Spil tilhørende %s + + + Ukendt spilvært + + + Gæst logget ud + + + Gendan indstillinger + + + Er du sikker på, at du vil gendanne dine indstillinger til deres standardværdier? + + + Indlæsningsfejl + + + Alle gæstespillere er blevet logget ud, fordi en gæst forlod spillet. + + + Kunne ikke oprette spil + + + Autovalg + + + Ingen pakker: Standardskins + + + 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 + + + Drik + + + + 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 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. + + + + 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 udvinde rødstensstøv fra rødstensmalm ved hjælp af en jernhakke, diamanthakke eller en guldhakke. Den kan levere strøm til op til 15 blokke, og strømmen kan bevæge sig inden for en afstand af en blok op eller ned. + {*ICON*}331{*/ICON*} + + + + + Du kan bruge rødstensgentagere for at forlænge strømmens rækkevidde, eller du kan placere en forsinker i kredsløbet. + {*ICON*}356{*/ICON*} + + + + + 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*} + + + + + 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 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å. + + + + + Du spiller nu Kreativ. + + + + + {*B*} + Tryk på {*CONTROLLER_VK_A*} for at få mere at vide om Kreativ.{*B*} + Tryk på {*CONTROLLER_VK_B*} hvis du allerede kender til Kreativ. + + + + + 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. + + + + 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. + + + + {*B*} + Tryk på {*CONTROLLER_VK_A*} for at få mere at vide om avl.{*B*} + Tryk på {*CONTROLLER_VK_B*}, hvis du allerede kender til avl. + + + Du skal fodre dyrene for at gøre dem elskovssyge, så de kan få unger. + + + 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*} + + + + {*B*} + Tryk på {*CONTROLLER_VK_A*} for at få mere at vide om golemmer.{*B*} + Tryk på {*CONTROLLER_VK_B*} hvis du allerede kender til golemmer. + + + + Golemmer bliver skabt ved at placere et græskar oven på en stak blokke. + + + Snegolemmer skal laves af to sneblokke oven på hinanden med et græskar på toppen. Snegolemmer kaster snebolde efter deres skabers 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. + + + + 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. + + + + + 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. + + + + + 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. + + + + {*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*}. + + + + + Brug din ildmodstandseliksir på dig selv. + + + + + 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. + + + + + 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. + + + + Tillykke, du har gennemført introduktionen. Tiden går nu normalt i spillet, og det varer ikke længe, før det bliver nat, og monstrene kommer frem! Byg dit tilflugtssted færdigt! + + + + {*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. + + + {*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. + + + + {*B*} + Tryk på {*CONTROLLER_VK_A*} for at få mere at vide om madbjælken og mad.{*B*} + Tryk på {*CONTROLLER_VK_B*} hvis du allerede kender til madbjælken og mad. + + + + Vælg + + + Anvend + + + 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. + + + + Tag + + + Næste + + + Forrige + + + Smid spiller ud + + + Send venneanmodning + + + Side ned + + + Side op + + + Farve + + + Helbred + + + Sid + + + Følg + + + Udvind + + + Fodr + + + Tæm + + + Skift filter + + + Placér alt + + + Placér en + + + Smid + + + Tag alt + + + Tag halvdelen + + + Placér + + + Smid alt + + + Ryd hurtigt valg + + + Hvad er det? + + + Del på Facebook + + + Smid en + + + Byt + + + Flyt hurtigt + + + Overfladepakker + + + Rød mosaikrude + + + Grøn mosaikrude + + + Brun mosaikrude + + + Hvidt mosaikglas + + + Mosaikglasrude + + + Sort mosaikrude + + + Blå mosaikrude + + + Grå mosaikrude + + + Lyserød mosaikrude + + + Limefarvet mosaikrude + + + Lilla mosaikrude + + + Cyanfarvet mosaikrude + + + Lysegrå mosaikrude + + + Orange mosaikglas + + + Blåt mosaikglas + + + Lilla mosaikglas + + + Cyanfarvet mosaikglas + + + Rødt mosaikglas + + + Grønt mosaikglas + + + Brunt mosaikglas + + + Lysegråt mosaikglas + + + Gult mosaikglas + + + Lyseblåt mosaikglas + + + Magentafarvet mosaikglas + + + Gråt mosaikglas + + + Lyserødt mosaikglas + + + Limefarvet mosaikglas + + + Gul mosaikrude + + + Lysegrå + + + Grå + + + Lyserød + + + Blå + + + Lilla + + + Cyanfarvet + + + Limefarvet + + + Orange + + + Hvid + + + Tilpasset + + + Gul + + + Lyseblå + + + Magentafarvet + + + Brun + + + Hvid mosaikrude + + + Lille bold + + + Stor bold + + + Lyseblå mosaikrude + + + Magentafarvet mosaikrude + + + Orange mosaikrude + + + Stjerneformet + + + Sort + + + Rød + + + Grøn + + + Snigerformet + + + Brag + + + Ukendt form + + + Sort mosaikglas + + + Hesteudrustning af jern + + + 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 + + + + 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*} +{*C3*}Hvem er vi? En gang blev vi kaldt bjergets ånd. Fader sol, moder måne. Forfædrenes ånder, dyrenes ånder. Flaskeånder. Spøgelser. Denne grønne mand. Dernæst guder og dæmoner. Engle. Poltergejster. Rumvæsner, fremmede. Leptoner, kvarker. Ordene forandrer sig. Vi forandrer os ikke.{*EF*}{*B*}{*B*} +{*C2*}Vi er universet. Vi er alt det, som du tror ikke er dig. Du kigger på os nu gennem din hud og dine øjne. Hvorfor rører universet ved din hud og kaster lys på dig? For at se dig, spiller. For at lære dig at kende. Og for at give sig selv til kende. Jeg vil fortælle dig en historie.{*EF*}{*B*}{*B*} +{*C2*}Der var engang en spiller.{*EF*}{*B*}{*B*} +{*C3*}Du var den spiller, {*PLAYER*}.{*EF*}{*B*}{*B*} +{*C2*}Engang i mellem betragtede den sig selv som et menneske placeret på den tynde overflade af en snurrende kugle fyldt med rødglødende stenmasser. Kuglen af rødglødende sten kredsede omkring en gigantisk klump af gas og ild, der var 330.000 gange større end den selv. De var så langt fra hinanden, at det tog lyset otte minutter at tilbagelægge afstanden mellem dem. Lyset var information fra en stjerne, og det kunne forbrænde din hud på 150.000.000 kilometers afstand.{*EF*}{*B*}{*B*} +{*C2*}Nogle gange drømte spilleren, at den var en minearbejder på overfladen af en verden, der var flad og uendelig. Solen var en hvid firkant. Dagene var korte. Der var meget, der skulle gøres, og døden en midlertidig ulejlighed.{*EF*}{*B*}{*B*} +{*C3*}Nogle gange drømte spilleren, at den var fortabt i en historie.{*EF*}{*B*}{*B*} +{*C2*}Nogle gange drømte spilleren, at den var noget andet et helt andet sted. Nogle gange var drømmene foruroligende. Nogle gange var de smukke. Nogle gange vågnede spilleren fra en drøm op i en anden for derefter at vågne i en tredje.{*EF*}{*B*}{*B*} +{*C3*}Nogle gange drømte spilleren, at den så ord på skærmen.{*EF*}{*B*}{*B*} +{*C2*}Lad os gå tilbage.{*EF*}{*B*}{*B*} +{*C2*}Spillerens atomer blev spredt i græsset, i floderne, i luften og i jorden. En kvinde samlede atomerne sammen. Hun drak, spiste og indhalerede dem og samlede spilleren i sin krop.{*EF*}{*B*}{*B*} +{*C2*}Og spilleren vågnede i den lange drøm fra det mørke varme i moderens krop.{*EF*}{*B*}{*B*} +{*C2*}Og spilleren var en ny fortælling, der aldrig var blevet fortalt før, skrevet med DNA'ens bogstaver. Og spilleren var et nyt program, der aldrig var blevet afviklet før, skabt af en kildekode, der var en milliard år gammel. Og spilleren var et nyt menneske, der aldrig havde levet før, skabt udelukkende af mælk og kærlighed.{*EF*}{*B*}{*B*} +{*C3*}Du er spilleren. Historien. Programmet. Mennesket. Skabt af mælk og kærlighed.{*EF*}{*B*}{*B*} +{*C2*}Lad os gå endnu længere tilbage.{*EF*}{*B*}{*B*} +{*C2*}De syv milliarder af milliarder atomer i spillerens krop blev skabt i hjertet af en stjerne længe inden spillet. Spilleren er dermed også information fra en stjerne. Og spilleren bevæger sig gennem en historie, der er en skov af informationer, som er blevet plantet af en mand ved navn Julian, i en flad uendelig verden, skabt af en anden mand ved navn Markus, som eksisterer i en lille privat verden, der er skabt af spilleren, som lever i et univers skabt af ...{*EF*}{*B*}{*B*} +{*C3*}Stille. Nogle gange skabte spilleren en lille privat verden, der var blød, varm og enkel. Andre gange var den hård, kold og kompliceret. Nogle gange byggede den en model af universet i sit hoved. Stumper af energi, der bevæger sig igennem det uendelige rum. Nogle gange kaldte den stumperne for "elektroner" og "protoner".{*EF*}{*B*}{*B*} + + + + +{*C2*}Andre gange kaldte den dem for "planeter" og "stjerner".{*EF*}{*B*}{*B*} +{*C2*}Nogle gange troede den, at den var i et univers, der var lavet af energi, der bestod af stadierne tændt og slukket. Nuller og ettaller. Linjer af programkode. Nogle gange troede den, at den spillede et spil. Andre gange troede den, at den læste ordene på en skærm.{*EF*}{*B*}{*B*} +{*C3*}Du er spilleren, der læseren ordene ... {*EF*}{*B*}{*B*} +{*C2*}Stille ... Nogle gange læste spilleren linjer med programkode på en skærm. Afkodede dem, så de blev til ord. Afkodede ord, så de gav mening. Afkodede meningen, så den blev til følelser, teorier og idéer. Spilleren begyndte at trække vejret hurtigere og dybere og opdagede, at den var i live. Den var i live, og de tusinde dødsfald havde ikke været virkelige. Spilleren var i live{*EF*}{*B*}{*B*} +{*C3*}Dig. Dig. Du er i live.{*EF*}{*B*}{*B*} +{*C2*}og nogle gange troede spilleren, at universet havde talt til den gennem solskinnet, der brød gennem træernes kroner om sommeren{*EF*}{*B*}{*B*} +{*C3*}og nogle gange troede spilleren, at universet havde talt til den gennem lyset, der faldt fra den frostklare nattehimmel om vinteren, hvor lysglimtet i spillerens øjenkrog måske kunne være fra en stjerne, der var en million gange større end solen, og som havde forkullet alle planeterne omkring sig for at være synlig i dette korte øjeblik for spilleren, der var på vej hjem på den anden side af universet, og som pludselig kunne lugte mad uden for en velkendt dør, inden drømmen begyndte igen{*EF*}{*B*}{*B*} +{*C2*}og nogle gange troede spilleren, at universet havde talt til den gennem nuller og ettaller, gennem verdenens elektricitet, gennem de rullende ord på skærmen for enden af drømmen{*EF*}{*B*}{*B*} +{*C3*}og universet sagde, jeg elsker dig{*EF*}{*B*}{*B*} +{*C2*}og universet sagde, at du havde spillet godt{*EF*}{*B*}{*B*} +{*C3*}og universet sagde, at alt du behøver findes i dig{*EF*}{*B*}{*B*} +{*C2*}og universet sagde, at du er stærkere, end du tror{*EF*}{*B*}{*B*} +{*C3*}og universet sagde, at du er sollyset{*EF*}{*B*}{*B*} +{*C2*}og universet sagde, at du er natten{*EF*}{*B*}{*B*} +{*C3*}og universet sagde, at mørket, du bekæmper, findes i dig{*EF*}{*B*}{*B*} +{*C2*}og universet sagde, at lyset, du søger, findes i dig{*EF*}{*B*}{*B*} +{*C3*}og universet sagde, at du ikke er alene{*EF*}{*B*}{*B*} +{*C2*}og universet sagde, at du ikke er adskilt fra alt andet omkring dig{*EF*}{*B*}{*B*} +{*C3*}og universet sagde, at du er universet, der smager på sig selv, taler til sig selv, læser sin egen programkode{*EF*}{*B*}{*B*} +{*C2*}og universet sagde, jeg elsker dig, fordi du er kærlighed.{*EF*}{*B*}{*B*} +{*C3*}Og spillet var slut, og spilleren vågnede op fra drømmen. Og spilleren begyndte en ny drøm. Og spilleren drømte igen og drømte bedre. Og spilleren var universet. Og spilleren var kærlighed.{*EF*}{*B*}{*B*} +{*C3*}Du er spilleren.{*EF*}{*B*}{*B*} +{*C2*}Vågn op.{*EF*} + + + + 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 + + + Lad være med at nulstille Afgrunden + + + 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! + + + Verdensindstillinger + + + Kan bygge og udvinde materialer + + + Kan bruge døre og kontakter + + + Opret strukturer + + + Helt flad verden + + + Bonuskiste + + + Kan åbne beholdere + + + Smid spiller ud + + + Kan flyve + + + 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 + + + Signallys + + + {*T3*}SÅDAN SPILLER DU: SIGNALLYS{*ETW*}{*B*}{*B*} +Aktive signallys udsender en lysstråle op i luften og giver ekstra kræfter til spillere i nærheden.{*B*} +De fremstilles af glas, obsidian og afgrundsstjerner, som du kan få ved at bekæmpe Visneren.{*B*}{*B*} +Signallys skal placeres, så de står i sollys om dagen. Signallys skal placeres på pyramider af jern, guld, smaragd eller diamant.{*B*} +Materialet, som signallyset placeres på, påvirker ikke signallysets virkning.{*B*}{*B*} +I signallysmenuen kan du vælge en primær virkning for dit signallys. Jo flere lag din pyramide har, jo flere virkninger vil du kunne vælge imellem.{*B*} +Et signallys på en pyramide med mindst fire lag giver også muligheden for enten den sekundære virkning regenerering eller en stærkere primær virkning.{*B*}{*B*} +Du skal ofre en smaragd, diamant, guld- eller jernbarre i betalingsfeltet for at indstille virkningen af dit signallys.{*B*} +Signallyset vil udsende sin virkning for evigt, når denne er på plads.{*B*} + + + + Fyrværkeri + + + Sprog + + + Heste + + + {*T3*}SÅDAN SPILLER DU: HESTE{*ETW*}{*B*}{*B*} +Heste og æsler findes hovedsagligt på åbne sletter. Muldyr er afkom af et æsel og en hest, men de er selv sterile.{*B*} +Du kan ride på alle voksne heste, æsler og muldyr. Kun heste kan bære rustning, og kun muldyr og æsler kan udstyres med sadeltasker, du kan transportere ting i. +Heste, æsler og muldyr skal tæmmes, før du kan bruge dem. Du tæmmer en hest ved at forsøge at ride på den og at holde dig på den, mens den forsøger at kaste dig af.{*B*} +Når der dukker hjerter op rundt om en hest, er den tam, og så vil den ikke længere prøve at kaste dig af. Du skal udstyre hesten med en sadel for at kunne styre den.{*B*}{*B*} +Sadler kan købes af landsbyboere, fanges, når du fisker, eller findes i kister rundt omkring i verden.{*B*} +Du kan give tamme æsler og muldyr sadeltasker ved at fastgøre en kiste. Du kan åbne sadeltaskerne, mens du rider eller sniger.{*B*}{*B*} +Heste og æsler (men ikke muldyr) kan avles ligesom andre dyr med guldæbler eller guldgulerødder.{*B*} +Føl vokser med tiden op og bliver til voksne heste, men det går hurtigere, hvis du fodrer dem med hvede eller hø.{*B*} + + + {*T3*}SÅDAN SPILLER DU: FYRVÆRKERI{*ETW*}{*B*}{*B*} +Fyrværkeri er dekorative genstande, som kan affyres med håndkraft eller fra automater. Du laver dem af papir og krudt, og du kan vælge også at bruge fyrværkeristjerner.{*B*} +Fyrværkeristjerners farver, falmen, facon, størrelse og effekter (såsom spor og funklen) kan tilpasses med yderligere ingredienser, når du laver dem.{*B*}{*B*} +Du laver fyrværkeri ved at placere krudt og papir i det 3x3-fremstillingsgitter, der vises over din oppakning.{*B*} +Du kan også placere flere fyrværkeristjerner i fremstillingsgitteret for at føje dem til fyrværkeriet.{*B*} +Hvis du fylder flere felter i fremstillingsgitteret med krudt, når fyrværkeristjernerne højere op, før de eksploderer.{*B*}{*B*} +Så kan du tage fyrværkeriet ud af produktionspladsen.{*B*}{*B*} +Fyrværkeristjerner kan laves ved at placere krudt og farve i fremstillingsgitteret.{*B*} +- Farven bestemmer farven på fyrværkeristjernens eksplosion.{*B*} +- Formen på fyrværkeristjernen bestemmes ved enten at tilføje en ildladning, en guldklump eller et hoved fra et væsen.{*B*} +- Du kan tilføje et spor eller en funklen ved at bruge diamanter eller glødestenstøv.{*B*}{*B*} +Når du har lavet en fyrværkeristjerne, kan du vælge dens falmefarve ved at lave den med farve. + + + + {*T3*}SÅDAN SPILLER DU: DROPPERE{*ETW*}{*B*}{*B*} +Når droppere får et rødstenssignal, spytter de en enkelt, tilfældig ting, som de indeholder, ud på jorden. Brug {*CONTROLLER_ACTION_USE*} til at åbne dropperen, så kan du fylde den med ting fra din oppakning.{*B*} +Hvis dropperen vender mod en kiste eller en anden type beholder, bliver genstanden puttet i den i stedet for. Lange kæder af droppere kan bruges til at transportere genstande langt. Hvis det skal virke, skal de skiftevis tændes og slukkes. + + + + Når du bruger det, bliver det til et kort over den del af verden, du er i, og så bliver det udfyldt, mens du udforsker. + + + Efterlades af Wither, anvendes til at lave signallys. + + + Springere + + + {*T3*}SÅDAN SPILLER DU: Springere{*ETW*}{*B*}{*B*} +Springere bruges til at tilføje eller fjerne ting fra containere og til automatisk at samle ting op, der bliver kastet ind i dem.{*B*} +De kan påvirke bryggerstande, kister, automater, droppere, minevogne med kister, minevogne med springere samt andre springere.{*B*}{*B*} +Springere bliver ved med at suge ting ud af en passende beholder, der er placeret over dem. De forsøger også at placere de opbevarede genstande i en destinationsbeholder.{*B*} +Hvis en springer er drevet af rødsten, bliver den inaktiv og holder op med både at suge genstande ind og at spytte dem ud.{*B*}{*B*} +En springer peger i den retning, den prøver at aflevere tingene i. Hvis du vil have en springertil at pege på en bestemt blok, skal du placere springere mod den blok, mens du sniger.{*B*} + + + + Droppere + + + BRUGES IKKE + + + Øjeblikkelig energi + + + Øjeblikkelig skade + + + Hoppeboost + + + Minetræthed + + + Styrke + + + Svaghed + + + Kvalme + + + BRUGES IKKE + + + BRUGES IKKE + + + BRUGES IKKE + + + Regenerering + + + Modstand + + + Finder seed til verdensgeneratoren + + + 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. + + + En type skinner, der kan aktivere eller deaktivere minevogne med springere og udløse minevogne med TNT. + + + 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. + + + Kulørte blokke, du kan lave ved at farve hærdet ler. + + + 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 + + + Sult + + + af langsomhed + + + af hurtighed + + + Usynlighed + + + Vandvejrtrækning + + + Nattesyn + + + Blindhed + + + af skade + + + af energi + + + af kvalme + + + af regenerering + + + af sløvhed + + + af hast + + + af svaghed + + + af styrke + + + Ildmodstand + + + Mætning + + + af modstand + + + af spring + + + Wither + + + Helbredsbonus + + + Absorbering + + + + + + II + + + 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 + + + Banal + + + Uinteressant + + + Flot + + + Hjertelig + + + Charmerende + + + Elegant + + + Fancy + + + Mousserende + + + 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 + + + Fordriv + + + Skarphed + + + Reducerer energi med tiden for spillere, dyr og monstre, som eliksiren bruges på. + + + Angrebsskade + + + Tilbageslag + + + Leddyrenes banemand + + + Fart + + + Zombieforstærkninger + + + Hestehopstyrke + + + Ved brug: + + + Modstandskraft mod at blive slået tilbage + + + Væsners forfølgelsesradius + + + Maksimalt helbred + + + Silkeberøring + + + Effektivitet + + + Vandtilpasset + + + Held + + + Plyndring + + + Ubrydelig + + + Beskyttelse mod ild + + + Beskyttelse + + + Ildaspekt + + + Fjerfald + + + Respiration + + + Beskyttelse mod projektiler + + + Beskyttelse mod eksplosioner + + + IV + + + V + + + VI + + + Slag + + + VII + + + III + + + Flamme + + + Kraft + + + Uendelighed + + + II + + + I + + + Aktiveres, når noget passerer gennem en forbundet snubletråd. + + + Aktiverer en forbundet snubletrådskrog, når noget passerer gennem den. + + + En kompakt måde at opbevare smaragder på. + + + Ligner en almindelig kiste, men alle genstande, der placeres i en mørkekiste, er tilgængelige i alle spillerens mørkekister selv i andre dimension. + + + IX + + + VIII + + + Indeholder smaragder, der kan udvindes med en hakke af jern eller kraftigere materiale. + + + 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. + + + 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*}. Indtagelse kan forgifte dig. + + + Bruges til at styre en sadlet gris med, når du ridder på den. + + + Gendanner 3 {*ICON_SHANK_01*}. Fremstillet ved at tilberede en kartoffel i en ovn. + + + Gendanner 3 {*ICON_SHANK_01*}. Fremstillet af en gulerod og guldklumper. + + + Bruges med en ambolt for at fortrylle våben, redskaber og rustninger. + + + Laves ved at smelte afgrundskvartsmalm. Kan laves til en blok af afgrundskvarts. + + + Kartoffel + + + Bagt kartoffel + + + Gulerod + + + Laves af uld. Bruges som en dekoration. + + + Smaragd + + + Blomsterkrukke + + + Græskartærte + + + Fortryllet bog + + + Giftig kartoffel + + + Guldgulerod + + + Gulerod på en fiskestang + + + Snubletrådskrog + + + Snubletråd + + + Afgrundskvarts + + + Smaragdmalm + + + Mørkekiste + + + Mosbeklædt mur af brosten + + + Blok af smaragd + + + Mur af brosten + + + Kartofler + + + Blomsterkrukke + + + Gulerødder + + + Lettere beskadiget ambolt + + + Ambolt + + + Ambolt + + + Blok af kvarts + + + Svært beskadiget ambolt + + + Afgrundskvartsmalm + + + Trappe af kvarts + + + Tilhugget blok af kvarts + + + Søjle af kvarts + + + Rødt tæppe + + + Tæppe + + + Sort tæppe + + + Blåt tæppe + + + Grønt tæppe + + + Brunt tæppe + + + Lilla tæppe + + + Cyanfarvet tæppe + + + Lysegrå tæppe + + + Gråt tæppe + + + Limegrønt tæppe + + + Lyserødt tæppe + + + Lyseblåt tæppe + + + Gult tæppe + + + Magentafarvet tæppe + + + Orange tæppe + + + Hvidt tæppe + + + Tilhugget 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. + + + {*PLAYER*} teleporterede dig hen til vedkommendes position + + + Teleporterede {*PLAYER*} til {*DESTINATION*} + + + Torne + + + {*PLAYER*} teleporterede dig + + + Skaber dagslys på mørke steder selv under vand. + + + Flise af kvarts + + + Gør spillere, dyr og monstre usynlige, som eliksiren bruges på. + + + Reparér og navngiv + + + For dyr + + + Omkostninger for fortryllelse: %d + + + Du har: + + + Omdøb + + + {*VILLAGER_TYPE*} tilbyder %s + + + Påkrævet for handel + + + Handel + + + 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. + + + + + {*B*} + Tryk på {*CONTROLLER_VK_A*} for at få mere at vide om amboltskærmen.{*B*} + Tryk på {*CONTROLLER_VK_B*}, hvis du allerede kender til amboltskærmen. + + + + + 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. + + + + + 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. + + + + + 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. + + + + + Når du fjerner den reparerede genstand, bliver begge ingredienser brugt af ambolten, og dit erfaringsniveau bliver fratrukket omkostningerne for arbejdet. + + + + + Det er muligt at omdøbe genstanden ved at redigere navnet i tekstboksen. + + + + + {*B*} + Tryk på {*CONTROLLER_VK_A*} for at få mere at vide om ambolten.{*B*} + Tryk på {*CONTROLLER_VK_B*}, hvis du allerede kender til ambolten. + + + + + 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. + + + + + Du kan finde fortryllede bøger i kister i fangekældre, eller du kan fortrylle en normal bog på et fortryllelsesbord. + + + + + 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. + + + + + Reparationsomkostningerne bliver afgjort af arbejdets karakter, genstandens værdi, antallet af fortryllelser samt antallet af forbedringer, der er foretaget tidligere. + + + + + Det koster erfaringsniveauer at bruge ambolten, og der er en risiko for, at du beskadiger ambolten. + + + + + I kisten i dette område finder du en beskadiget hakke, råmaterialer, en erfaringseliksir og fortryllelsesbøger, som du kan eksperimentere med. + + + + + Når du omdøber en genstand, ændres navnet for alle spillere, og omkostningerne for tidligere arbejde reduceres. + + + + + {*B*} + Tryk på {*CONTROLLER_VK_A*} for at få mere at vide om handelsskærmen.{*B*} + Tryk på {*CONTROLLER_VK_B*}, hvis du allerede kender til handelsskærmen. + + + + + Dette er handelsskærmen, der viser, hvilke handler du kan gøre med en landsbyboer. + + + + + Hvis du mangler de nødvendige genstande, vil handlerne være utilgængelige og vist med rød tekst. + + + + + Alle handler, som landsbyboeren vil gå med til i øjeblikket, bliver vist øverst på skærmen. + + + + + I de to felter til venstre kan du se det samlede antal af genstande, der skal bruges for at gennemføre handlen. + + + + + 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. + + + + {*B*} + Tryk på {*CONTROLLER_VK_A*} for at få mere at vide om handel.{*B*} + Tryk på {*CONTROLLER_VK_B*}, hvis du allerede kender til handel. + + + + + 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. + + + + + Handler, der udføres ofte, bliver muligvis fjernet midlertidigt, men landsbyboeren vil altid gå med til mindst en handel. + + + + + Tag noget papir fra kisten, og forsøg at handle med landsbyboeren her. + + + + + I dette område er der to mørkekister. + + + + + {*B*} + Tryk på {*CONTROLLER_VK_A*} for at få mere at vide om mørkekister.{*B*} + Tryk på {*CONTROLLER_VK_B*}, hvis du allerede kender til mørkekister. + + + + + Alle mørkekister i en verden er forbundne selv på tværs af dimensioner. Når du placerer genstande i mørkekister, kan du finde dem i andre mørkekister. + + + + + Men indholdet i mørkekisterne er forskellige for hver spiller. + + + + + Spillerne kan dermed placere genstande i en hvilken som helst mørkekiste og hente dem igen fra andre mørkekister i verdenen. Du kan selv prøve det nu ved at placere genstande i en af mørkekisterne. + + + + Gendanner 2 {*ICON_SHANK_01*}, gendanner energi i 30 sekunder og giver ildmodstand og skademodstand i fem minutter. Fremstilles af et æble og guldblokke. + + + Kan teleportere + + + Teleportér + + + Teleportér til spiller + + + Teleportér til mig + + + Kan slå udmattelse fra + + + Kan blive usynlig + + + Nu kan du slå usynlighed til + + + Nu kan du ikke længere slå usynlighed til + + + Nu kan du slå flyveevne til + + + Nu kan du ikke længere slå flyveevne til + + + Nu kan du slå udmattelse fra + + + Nu kan du ikke længere slå flyveevne til + + + Nu kan du teleportere + + + Du kan ikke længere teleportere + + + {*T3*}SÅDAN SPILLER DU: Ambolte{*ETW*}{*B*}{*B*} +Med ambolten kan du reparere, fortrylle eller omdøbe genstande for erfaringspoint.{*B*} +Du kan omdøbe alle genstande, men du kan kun reparere genstande med holdbarhed eller påføre fortryllelser fra fortryllede bøger.{*B*} +Du kan reparere en genstand ved at placere den i et af inputfelterne til venstre sammen med enten råmaterialer af samme slags som genstanden, fx jernbarrer til et jernsværd, eller ved at kombinere den med en anden genstand af samme type.{*B*} +Det er mere effektivt at kombinere genstande på en ambolt, og hvis nogle af genstandene var fortryllede, vil fortryllelserne muligvis blive overført til det endelige resultat.{*B*} +Du kan fortrylle genstande med fortryllede bøger ved at kombinere dem på en ambolt, hvis bogens fortryllelse er passende. Du kan finde fortryllede bøger i kister i fangekældre eller ved at fortrylle normale bøger på fortryllelsesbordet.{*B*} +Der er en risiko for, at ambolten bliver beskadiget, hver gang du bruger den, og hvis den bliver tilstrækkelig slidt, går den i stykker.{*B*} + + + {*T3*}SÅDAN SPILLER DU: HANDEL{*ETW*}{*B*}{*B*} +Det er muligt at handle med genstande med landsbyboere. Alle landsbyboere har en profession. De kan være landmænd, slagtere, smede, bibliotekarer eller præster, og det påvirker den type genstande, de vil handle med.{*B*} +Du kan se en oversigt over alle handler, som en landsbyboer tilbyder, i handelsmenuen. En landsbyboer kan ændre sit varesortiment, når en spiller har handlet med vedkommende, og visse varer kan blive midlertidigt utilgængelige, hvis de handles for ofte.{*B*} +Når du handler, køber eller sælger du som regel et bestemt antal genstande for smaragder.{*B*} +Hvis ikke du har det nødvendige antal til en handel, bliver genstande vist med rødt.{*B*} + + + + {*T3*}SÅDAN SPILLER DU: MØRKEKISTE {*ETW*}{*B*}{*B*} +Alle mørkekister i verdenen er forbundet. Når du placerer genstande i mørkekister, kan du finde dem i de andre. Men indholdet i mørkekisterne er forskellige for hver spiller. Spillerne kan dermed placere genstande i en hvilken som helst mørkekiste og hente dem igen fra andre mørkekister i verdenen. + + + + Landmand + + + Bibliotekar + + + Præst + + + Smed + + + Slagter + + + Landsbyboere bor i landsbyer og vil sælge genstande til spilleren afhængigt af deres profession. + + + Stor kiste + + + + Du kan også lave fortryllede bøger på et fortryllelsesbord og dernæst bruge dem på en ambolt for at fortrylle en genstand. + + + + + Snubletrådskroge sender en konstant strøm gennem et kredsløb, så længe der er noget, der aktiverer tråden mellem dem. + + + + + Når en ulv først er tæmmet, vil den altid have sit halsbånd på. Du kan ændre farven på halsbåndet ved at farve det. + + + + Du kan dyrke gulerødder og kartofler ved at plante gulerødder eller kartofler, og du kan høste dem, når grøntsagerne er synlige over jorden. + + + + Spillerne kan sadle grise for at ride på dem. Du kan styre dem ved hjælp af en gulerod på en fiskestang. + + + + + Du kan bevæge minevognen langsomt fremad med {*CONTROLLER_ACTION_MOVE*}. Dermed bliver det lettere at få minevognen i bevægelse og op på en skinne med strøm i. + + + + Du kan ikke deltage i dette spil, da spil på delt skærm kun understøttes i høj opløsning. Sign out all other players if you wish to join. + + + Kurér + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/da-DA/stringsLeaderboards.xml b/Minecraft.Client/PSVitaMedia/loc/da-DA/stringsLeaderboards.xml new file mode 100644 index 00000000..2ca8e024 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/da-DA/stringsLeaderboards.xml @@ -0,0 +1,48 @@ + + + + Drab – Let + + + Drab – Normal + + + Drab – Svær + + + Blokke udvundet – Fredfyldt + + + Blokke udvundet – Let + + + Blokke udvundet – Normal + + + Blokke udvundet – Svær + + + Landbrug – Fredfyldt + + + Landbrug – Let + + + Landbrug – Normal + + + Landbrug – Svær + + + Rejsedistance – Fredfyldt + + + Rejsedistance – Let + + + Rejsedistance – Normal + + + Rejsedistance – Svær + + \ 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 new file mode 100644 index 00000000..b8b9f306 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/da-DA/stringsPlatformSpecific.xml @@ -0,0 +1,243 @@ + + + + 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. + + + 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. + + + PlayStation®Vita-system + + + 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 + + + Skift netværkstilstand + + + 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*} +I spiltypen Kreativ kan du overføre alle genstande i spillet til dit lager, uden at du behøver udvinde eller fremstille dem først. +Genstandene forsvinder ikke fra dit lager, når de bliver placeret eller anvendt i verdenen, så du kan fokusere på at bygge frem for at samle ressourcer.{*B*} +Hvis du skaber, indlæser eller gemmer en verden i Kreativ, er trophies og ranglister slået fra, også selvom den indlæses i Overlevelse.{*B*} +Du kan flyve i Kreativ ved at trykke to gange hurtigt på {*CONTROLLER_ACTION_JUMP*}. Gentag handlingen for at holde op med at flyve. Skub {*CONTROLLER_ACTION_MOVE*} frem to gange hurtigt for at flyve hurtigere. +Når du flyver, kan du holde {*CONTROLLER_ACTION_JUMP*} nede for at bevæge dig op og {*CONTROLLER_ACTION_SNEAK*} nede for at bevæge dig nedad, ellers kan du også trykke på {*CONTROLLER_ACTION_DPAD_UP*} for at bevæge dig op, {*CONTROLLER_ACTION_DPAD_DOWN*} for at bevæge dig ned, {*CONTROLLER_ACTION_DPAD_LEFT*} for at bevæge dig til venstre og {*CONTROLLER_ACTION_DPAD_RIGHT*} for at bevæge dig til højre. + + + 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" + + + 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? + + + "BRUGES IKKE" + + + 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. + + + 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". +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? + + + 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/da-DA/stringsRichPresence.xml b/Minecraft.Client/PSVitaMedia/loc/da-DA/stringsRichPresence.xml new file mode 100644 index 00000000..a52f28cf --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/da-DA/stringsRichPresence.xml @@ -0,0 +1,66 @@ + + + + {GAME_STATE} + + + Ledig + + + I menuerne + + + Spiller multiplayer – {GAME_STATE} + + + Spiller multiplayer offline – {GAME_STATE} + + + Spiller alene – {GAME_STATE} + + + Offline alene – {GAME_STATE} + + + Nyder udsigten! + + + Ridder på en gris + + + Kører i en minevogn + + + I en båd + + + Fisker + + + Fremstiller + + + Smeder + + + I Afgrunden + + + Lytter til en plade + + + Kigger på et kort + + + Fortryllelse + + + Brygger en eliksir + + + Arbejder ved ambolten + + + Møder naboerne + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/de-DE/4J_stringsGeneric.xml b/Minecraft.Client/PSVitaMedia/loc/de-DE/4J_stringsGeneric.xml new file mode 100644 index 00000000..de26a852 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/de-DE/4J_stringsGeneric.xml @@ -0,0 +1,87 @@ + + + + O. K. + + + Zurück + + + Abbrechen + + + Ja + + + Nein + + + Beschädigte Speicherdaten + + + Deine Speicherdaten sind beschädigt. Beschädigte Speicherdaten überschreiben und neue erstellen? + + + Kein freier Speicherplatz + + + Erneut auswählen + + + Ohne Speichern spielen + + + Neue Speicherdaten erstellen + + + Speicherdaten überschreiben? + + + Nein, nicht überschreiben + + + Überschreiben und speichern + + + Fehler beim Speichern + + + Ohne Speichern fortsetzen + + + Fehler beim Laden + + + Speicherdaten benennen + + + Gib einen Namen für deine Speicherdaten ein. + + + Bist du sicher, dass du das Spiel verlassen möchtest? + + + Abgemeldet + + + Weiterspielen + + + Offline weiterspielen + + + Gastspieler + + + Gastspieler können sich nicht mit "PSN" verbinden. + + + Speichern ... + + + Inhalt wird gespeichert. Bitte System nicht ausschalten. + + + Vollständiges Spiel freischalten + + \ 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 new file mode 100644 index 00000000..982086c4 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/de-DE/4J_stringsPlatformSpecific.xml @@ -0,0 +1,50 @@ + + + + Speichern der Einstellungen des Sony Entertainment Network-Kontos fehlgeschlagen. + + + Problem mit Sony Entertainment Network-Konto + + + 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 new file mode 100644 index 00000000..0c324e42 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/de-DE/AdditionalStrings.xml @@ -0,0 +1,96 @@ + + + + Alle Mash-up-Welten anzeigen + + + Ausblenden + + + Minecraft: PlayStation®3 Edition + + + Optionen + + + Cache speichern + + + Ein Netzwerkfehler ist aufgetreten. + + + Netzwerkfehler + + + Ein Netzwerkfehler ist aufgetreten. Zurück zum Hauptmenü. + + + Online-Dienste sind aufgrund von Chat-Beschränkungen deines Sony Entertainment Network-Kontos deaktiviert. + + + Online-Dienste sind aufgrund von Kindersicherungseinstellungen deines Sony Entertainment Network-Kontos deaktiviert. + + + Online-Dienste + + + Du wurdest vom "PSN" abgemeldet. Die Online-Funktionen des Spiels stehen nicht zur Verfügung, bis du dich wieder bei "PSN" angemeldet hast. + + + Du wurdest vom "PSN" abgemeldet. Die Online-Funktionen des Spiels stehen nicht zur Verfügung, bis du dich wieder bei "PSN" angemeldet hast. Zurück zum Hauptmenü. + + + Benutzer als Spieler %d auswählen (oder abbrechen, um als Gast zu spielen). + + + Kostenlos + + + 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. + + + Trophäen deaktiviert + + + Trophäen werden deaktiviert, da diese Speicherdatei einem anderen Benutzer gehört. + + + Schwerer Fehler: Initialisierung der Trophäen gescheitert. Bitte verlasse das Spiel. + + + Spieleinladungen + + + Fehlerhafte Datei + + + Verbindung zum Controller getrennt + + + Die Verbindung zu deinem Controller wurde getrennt. Bitte schließe den Controller an. + + + 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. + + + Einladung + + + Komm doch vorbei und spiel eine Runde Minecraft: PlayStation®Vita Edition! + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/de-DE/EULA.xml b/Minecraft.Client/PSVitaMedia/loc/de-DE/EULA.xml new file mode 100644 index 00000000..7f1adb31 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/de-DE/EULA.xml @@ -0,0 +1,96 @@ + + + + Minecraft: PlayStation®Vita Edition – NUTZUNGSBEDINGUNGEN + Diese Bedingungen legen ein paar Regeln für die Verwendung von Minecraft: PlayStation®Vita Edition („Minecraft“) fest. Zum Schutz von Minecraft und den Mitgliedern unserer Community benötigen wir diese Bedingungen, um Regeln für das Herunterladen und die Verwendung von Minecraft aufzustellen. Wir mögen Regeln etwa genauso gern wie du, also versuchen wir, es so kurz wie möglich zu gestalten. Wenn du Minecraft kaufst, herunterlädst, benutzt oder spielst, akzeptierst du, dich an diese Bedingungen („die Bedingungen“) zu halten. + Bevor wir loslegen, möchten wir eine Sache unbedingt klarstellen. Minecraft ist ein Spiel, das es den Spielern ermöglicht, Dinge zu bauen und zu zerstören. Wenn du mit anderen Spielern spielst (Multiplayer-Modus), kannst du mit ihnen zusammen bauen oder das zerstören, was sie bereits gebaut haben – und sie können dasselbe auch mit dir machen. Spiele also nicht mit Spielern, deren Verhalten nicht deinen Vorstellungen entspricht. Manchmal tun Spieler auch Sachen, die sie lieber lassen sollten. Uns gefällt das nicht, aber es gibt nicht viel, was wir dagegen tun können, außer alle darum zu bitten, sich angemessen zu verhalten. Wir verlassen uns darauf, dass du und andere Mitglieder der Community uns wissen lassen, wenn das Verhalten eines Spielers unpassend ist. Wenn das der Fall ist und/oder du der Meinung bist, dass jemand die Regeln oder diese Bedingungen bricht oder Minecraft unsachmäßig gebraucht, lass es uns wissen. Dafür haben wir ein System zum Melden von Problemen, also mach bitte davon Gebrauch und wir werden unser Bestes geben, deinen Hinweisen nachzugehen. + Um uns auf ein Problem aufmerksam zu machen oder es zu melden, schreibe uns bitte eine E-Mail an support@mojang.com und gib uns so viele Informationen wie möglich, wie zum Beispiel Benutzerdaten und eine Beschreibung der Ereignisse. + Und jetzt zurück zu den Bedingungen: + EINE HAUPTREGEL + Die eine Hauptregel ist, dass du nicht das weitergeben darfst, was wir erstellt haben. Damit meinen wir das „Weitergeben von Kopien von Minecraft, den kommerziellen Gebrauch, den Versuch, Geld damit zu machen, und anderen Leuten auf unfaire oder unangemessene Weise Zugriff auf Minecraft und Teile davon zu ermöglichen“. Dementsprechend besteht die Hauptregel (sofern keine spezielle Einwilligung von uns vorliegt – wie zum Beispiel in unseren Richtlinien zur Verwendung von Waren- und Markenzeichen, „Brand and Asset Usage Guidelines“) darin, dass du Folgendes nicht tun darfst: + • Kopien von Minecraft an andere weitergeben; + • Kommerzielle Nutzung von durch uns erstellten Inhalten; + • Der Versuch, mit von uns erstellten Inhalten Geld zu machen; + • anderen auf unfaire oder unangemessene Weise Zugriff auf von uns erstellte Inhalte zu verschaffen. + ... Und um es glasklar auszudrücken: „Von uns erstellte Inhalte“ umfassen, beschränken sich aber nicht auf die Client- oder Server-Software von Minecraft . Dazu gehören auch veränderte Versionen eines Spiels, eines Teils davon oder irgendetwas anderes, was wir erstellt haben. + Ansonsten haben wir eine sehr entspannte Einstellung zu allem, was du tust – wir wollen dich sogar dazu ermutigen, richtig coole Sachen zu machen (siehe unten). Lass einfach nur die Dinge sein, von denen wir sagen, dass du sie nicht tun darfst. + BENUTZUNG VON MINECRAFT + • Du hast Minecraft gekauft, also kannst du es auch selbst auf deinem PlayStation®Vita-System benutzen. + • Weiter unten gewähren wir dir begrenzte Rechte, auch andere Dinge zu tun, aber irgendwo müssen wir auch Grenzen setzen, da andernfalls manche Leute einfach zu weit gehen. Wenn du etwas erstellen möchtest, das sich auf unsere Arbeit bezieht, nehmen wir das bescheiden an, aber stelle bitte sicher, dass deine Arbeit nicht als offizieller Inhalt ausgelegt werden kann und dass sie diesen Bedingungen entspricht. Vor allem darfst du keinen kommerziellen Gebrauch von etwas machen, das wir erstellt haben. + • Die Erlaubnis, die wir dir zum Spielen und Nutzen von Minecraft erteilen, kann dir entzogen werden, wenn du gegen diese Nutzungsbedingungen verstößt. + • Wenn du Minecraft kaufst, erteilen wir dir die Erlaubnis, Minecraft gemäß dieser Nutzungsbedingungen auf deinem eigenen PlayStation®Vita-System zu installieren, zu nutzen und zu spielen. Diese Erlaubnis gilt für dich persönlich – das bedeutet, dass es dir nicht gestattet ist, Minecraft (oder einen Teil davon) an andere Personen weiterzugeben (außer natürlich, wir erlauben es ausdrücklich). + • Im angemessenen Rahmen kannst du mit Bildschirmfotos und Videos von Minecraft tun, was immer du möchtest. „Im angemessenen Rahmen“ bedeutet, dass du keinerlei kommerziellen Nutzen aus ihnen ziehen oder Dinge tun darfst, die unfair sind oder unsere Rechte negativ beeinträchtigen. Klaue außerdem nicht einfach Artwork-Quellen und reiche sie herum, denn das ist höchst uncool. + • Im Wesentlichen gilt die einfache Regel, keinen kommerziellen Gebrauch von irgendetwas zu machen, das wir erstellt haben, es sei denn, wir haben es entweder in unseren Richtlinien zur Verwendung von Waren- und Markenzeichen („Brand and Asset Usage Guidelines“) oder in diesen Nutzungsbedingungen ausdrücklich erlaubt. Sollte es per Gesetz ausdrücklich erlaubt sein, zum Beispiel unter einer Vorschrift zum „angebrachten Nutzen“ oder „angemessenen Geschäftsgebaren“, dann ist das auch okay – aber nur in dem Rahmen, in dem es das Gesetz vorsieht. + EIGENTUM VON MINECRAFT UND ANDERES + • Auch wenn wir dir erlauben, Minecraft zu spielen, sind wir trotzdem die Eigentümer. Wir sind auch die Eigentümer unserer Schutzmarken und aller Inhalte, die in Minecraft enthalten sind. Dazu gehören unsere Software, Texturen, Aktivposten, Werkzeuge, Infrastruktur und ein Haufen anderes cleveres (und nicht so cleveres) Zeug, das unser Eigentum ist. Alle unsere Rechte an diesem Zeug sind erklärt und uns vorbehalten, aber du kannst das Zeug gemäß diesen Bedingungen benutzen. + • Das bedeutet nicht, dass uns auch das coole Zeug gehört, das du bei deiner Benutzung von Minecraft erstellst – du musst nur damit einverstanden sein, dass uns jeder Teil von Minecraft und Minecraft als Produkt und Dienst sowie das Zeug, das wir im vorherigen Satz schon erwähnt haben, gehören. Uns gehören außerdem das Urheberrecht und alle anderen sogenannten Rechte am geistigen Eigentum ("IPRs"), die mit diesen Sachen zusammenhängen, sowie die Namen und Schutzmarken, die mit Minecraft in Verbindung stehen. + • Natürlich kannst du in Minecraft auch dein ganz eigenes Zeug erstellen. Die Sachen, die du selbst kreierst, gehören uns nicht und wir werden auch kein Eigentum an etwas beanspruchen, das uns nicht zusteht. Allerdings beanspruchen wir das Eigentumsrecht an Kopien (oder wesentlichen Kopien) oder an von unserem Eigentum und unseren Kreationen abgeleiteten Arbeiten (siehe oben). Aber wenn du ganz neue Dinge erschaffst, dann gehören sie nicht uns. Das bedeutet zum Beispiel: + - Ein einzelner Block – der gehört uns. + - Eine gotische Kathedrale mit einer Achterbahn darin – die gehört uns nicht. + • Wenn du also für die Nutzung von Minecraft bezahlst, kaufst du nur eine Erlaubnis, das Produkt Minecraft entsprechend dieser Nutzungsbedingungen zu verwenden. Alle Rechte, die du im Zusammenhang mit Minecraft hast, sind in diesen Nutzungsbedingungen erklärt. + INHALT + • In Bezug auf alle Inhalte, die du bei oder über Minecraft verfügbar machst, musst du uns die Erlaubnis erteilen, diese Inhalte zu nutzen, zu kopieren, zu modifizieren und anzupassen. Diese Erlaubnis muss unwiderruflich und uneingeschränkt sein. Außerdem musst du es uns gestatten, andere Personen deine Inhalte nutzen lassen, und du musst diesen weiteren Personen, denen du Zugang zu den Inhalten gewährst (zum Beispiel denjenigen, mit denen du Multiplayer-Spiele spielst), die Nutzung deiner Inhalte erlauben. + • Bitte überlege es dir gut, deine Inhalte zur Verfügung zu stellen. Sie können öffentlich zugänglich gemacht und von anderen Spielern auf eine Art und Weise genutzt werden, die dir unter Umständen nicht gefällt. + • Wenn du etwas bei oder über Minecraft zur Verfügung stellst, darf es nicht beleidigend gegenüber Personen oder illegal sein, es muss aufrichtig und dein eigenes Werk sein. Zu den Dingen, die du durch die Verwendung von Minecraft nicht verfügbar machen darfst, gehören: Beiträge rassistischer oder homophober Natur; Mobbing- oder Troll-Beiträge; Beiträge, die unseren oder den Ruf einer anderen Person schädigen könnten; Beiträge, die pornografische Inhalte, Werbung oder das Werk oder Bild eines anderen beinhalten; Beiträge, die den Anschein erwecken, von einem Moderator zu stammen, oder mit denen Personen betrogen oder ausgenutzt werden können. + • Jegliche Inhalte, die du über Minecraft zur Verfügung stellt, müssen von dir erstellt sein. Du darfst mithilfe von Minecraft keine Inhalte verfügbar machen, die die Rechte von anderen beeinträchtigen. Wenn du Inhalte über Minecraft veröffentlichst und wir von jemandem angefochten, bedroht oder verklagt werden, weil diese Inhalte die Rechte dieser Person verletzen, können wir dich dafür zur Verantwortung ziehen. Das bedeutet, dass du uns unter Umständen jeglichen Schaden erstatten musst, der uns deswegen entstanden ist. Aus diesem Grund ist es sehr wichtig, dass du nur diejenigen Inhalte verfügbar machst, die du selbst erstellt hast, und keine Inhalte, die von anderen erstellt wurden. + • Bitte achte darauf, mit wem du spielst. Sowohl für dich als auch für uns ist es schwer einschätzbar, ob die Aussagen anderer Leute wahr sind oder ob sie überhaupt diejenigen sind, für die sie sich ausgeben. Außerdem solltest du über Minecraft keinerlei persönliche Daten preisgeben. + Wenn du während der Nutzung von Minecraft Inhalte („deine Inhalte“) verfügbar machen möchtest, müssen die folgenden Bedingungen erfüllt sein: + - Sie müssen mit den Regeln von Sony Computer Entertainment, einschließlich der Nutzungsbedingungen und Endbenutzer-Lizenzvereinbarung von "PSN", übereinstimmen sowie mit allen anderen Richtlinien, denen du für die Nutzung deines PlayStation®Vita-Systems und des "PSN" zustimmst. + - Sie dürfen anderen gegenüber nicht beleidigend sein. + - Sie dürfen nicht illegal oder unrechtmäßig sein. + - Sie müssen aufrichtig und nicht irreführend sein und dürfen andere nicht täuschen, ausnutzen oder vorgeben, jemand anderer zu sein. + - Sie dürfen die Urheberrechte oder weitere Rechte anderer nicht verletzen. + - Sie dürfen nicht rassistischer, sexistischer oder homophober Natur sein. + - Sie dürfen keine Mobbing- oder Troll-Beiträge sein. + - Sie dürfen unseren oder den Ruf einer anderen Person nicht schädigen. + - Sie dürfen keine Pornografie enthalten. + - Sie dürfen keine Werbung enthalten. + - Du darfst bei oder über Minecraft keine Inhalte veröffentlichen, die die Rechte eines anderen verletzen. + • Du bist für alle deine Inhalte verantwortlich, die von dir mit der Nutzung von Minecraft verfügbar gemacht werden. + • Indem du deine Inhalte verfügbar machst, garantierst du und teilst du uns mit, dass du gemäß diesen Nutzungsbedingungen die volle Berechtigung dazu hast, und du sicherst uns die unter diesen Nutzungsbedingungen festgelegten Rechte zu. + • Wenn wir von einer Person angefochten, bedroht oder verklagt werden aufgrund jeglicher Inhalte, die du über die Nutzung von Minecraft verfügbar machst oder die von jemandem bei oder über Minecraft zur Verfügung gestellt werden, können diese Inhalte entfernt werden. Darüber hinaus können wir dich dafür zur Verantwortung ziehen und du musst unter Umständen für jeglichen Schaden aufkommen, der uns daraus entsteht. Außerdem kann dein Zugang zu bestimmten Teilen von Minecraft gesperrt oder für eine bestimmte Zeit ausgesetzt werden. + BENUTZERINHALTE + Nachfolgend werden einige Bedingungen aufgestellt in Bezug auf deine Inhalte und solche Inhalte, die von anderen verfügbar gemacht werden, im Folgenden „Benutzerinhalte“ genannt. Minecraft ist ein Unterhaltungsdienst. Daraus folgt, dass wir und unsere Lizenznehmer (zum Beispiel Sony Computer Entertainment) an der Übertragung, Verbreitung, Speicherung und Abfrage von Benutzerhinhalten ohne Überprüfung, Auswahl oder Veränderung des Inhalts beteiligt sind. Das bedeutet, dass wir die Benutzerinhalte nicht überprüfen und deswegen nicht wissen, was von dir oder anderen Leuten in Umlauf gebracht wird. Wir stellen die Regeln in diesen Nutzungsbedingungen auf, damit du und alle anderen sich daran halten müssen, aber wir können nicht alles sehen, was passiert. + Also nimm bitte die folgenden Hinweise zur Kenntnis: + • Die Ansichten, die in den Benutzerinhalten vertreten werden, sind die Ansichten der einzelnen Autoren oder Urheber und entsprechen nicht unseren Ansichten, außer wir weisen ausdrücklich darauf hin. + • Wir sind nicht verantwortlich für (und geben keine diesbezüglichen Garantien oder Erklärungen ab und schließen die Haftung aus für) sämtliche Benutzerinhalte, einschließlich jeglicher Kommentare, Ansichten oder Anmerkungen, die darin ausgedrückt werden. + • Mit der Verwendung von Minecraft erkennst du an, dass wir keinerlei Verantwortung für eine Überprüfung der Benutzerinhalte innehaben und dass alle Benutzerinhalte auf der Grundlage zur Verfügung gestellt werden, dass eine Überprüfung von unserer Seite aus nicht erforderlich ist und wir keine Kontrolle oder Beurteilung über die Inhalte ausüben. + DENNOCH können wir (oder unsere Lizenznehmer, wie zum Beispiel Sony Computer Entertainment) jegliche Benutzerinhalte entfernen, zurückweisen oder sperren sowie deine Möglichkeit entfernen oder aussetzen, Benutzerinhalte zu veröffentlichen, verfügbar zu machen oder auf sie zuzugreifen. Das schließt auch ein, dass wir deinen Zugang zu Minecraft oder "PSN" sperren oder aussetzen können, wenn wir dies für angemessen halten, beispielsweise weil du diese Nutzungsbedingungen verletzt hast oder wir eine Beschwerde erhalten haben. Außerdem werden wir die Benutzerinhalte zeitnah entfernen oder den Zugang dazu aufheben, wenn wir tatsächlich bestätigen können, dass sie gesetzeswidrig sind. + VERBESSERUNGEN + • Wir können von Zeit zu Zeit Aktualisierungen und Verbesserungen umsetzen, aber wir sind dazu nicht verpflichtet. Darüber hinaus sind wir nicht zur Bereitstellung weiterer Unterstützung oder Wartung für ein Spiel verpflichtet. Natürlich hoffen wir, in Zukunft weitere Aktualisierungen für Minecraft zu veröffentlichen, aber wir können nicht gewährleisten, dass das passieren wird. + UNSERE HAFTUNG + • Das Exemplar von Minecraft, das du erwirbst, wird „im Istzustand“ zur Verfügung gestellt. Aktualisierungen und Verbesserungen werden ebenfalls „im Istzustand“ zur Verfügung gestellt. Das bedeutet, dass wir weder einen bestimmten Standard oder eine bestimmte Qualität von Minecraft noch eine ununterbrochene und fehlerfreie Funktion von Minecraft garantieren können. Auch können wir nicht versprechen, für daraus resultierende Verluste oder Schäden einzutreten. Wir versprechen nur, Minecraft und dazugehörige Dienste mit angemessenem Können und Sorgfalt zur Verfügung zu stellen. Das Gesetz in den meisten Ländern sieht es vor, dass wir die Haftung für von uns fahrlässig verursachte Todesfälle oder Körperverletzungen nicht ausschließen können. Also wenn dein Computer aufsteht und dich ersticht, weil wir etwas falsch gemacht haben, dann nehmen wir das auf unsere Kappe. + WIR HAFTEN NICHT FÜR: + • JEGLICHEN GEBRAUCH ODER MISSBRAUCH VON MINECRAFT DURCH DICH ODER EINE ANDERE PERSON; + • JEGLICHE INHALTE, DIE DU ÜBER DEINE VERWENDUNG VON MINECRAFT VERFÜGBAR MACHST; + • JEGLICHE ZUWIDERHANDLUNGEN GEGEN DIESE NUTZUNGSBEDINGUNGEN DURCH DICH; + • ZUWIDERHANDLUNGEN GEGEN JEGLICHE NUTZUNGSBEDINGUNGEN DURCH EINE ANDERE PERSON. + BEENDIGUNG + • Wir können dein Recht auf die Nutzung von Minecraft beenden, wenn du diesen Nutzungsbedingungen zuwiderhandelst. Du kannst es ebenso jederzeit beenden, indem du Minecraft von deinem PlayStation®Vita-System deinstallierst. In jedem Fall bleiben die Paragrafen bezüglich „Eigentum von Minecraft“, „Unsere Haftung“ und „Allgemeines“ auch nach Beendigung des Verhältnisses weiterhin gültig. + ALLGEMEINES + • Diese Nutzungsbedingungen unterliegen deinen gesetzlichen Rechten. Kein Abschnitt dieser Nutzungsbedingungen wird irgendwelche Rechte beschneiden, die nicht vom Gesetz begrenzt oder ausgeschlossen sind. Des Weiteren schließen sie unsere Haftung für von uns fahrlässig verschuldete Todesfälle oder Körperverletzungen oder betrügerische Angaben nicht aus oder beschränken diese. + • Gelegentlich nehmen wir Veränderungen an diesen Nutzungsbedingungen vor. Diese Veränderungen sind nur effektiv, solange sie rechtlich anwendbar sind. Wenn du beispielsweise Minecraft nur im Einzelspieler-Modus verwendest und keine von uns zur Verfügung gestellten Aktualisierungen installierst, dann gilt die alte Endbenutzer-Lizenzvereinbarung. Wenn du die Aktualisierungen allerdings verwendest oder Teile von Minecraft nutzt, die auf unserem fortlaufenden Angebot von Online-Diensten basieren, dann gilt die neue Endbenutzer-Lizenzvereinbarung. In diesem Fall können wir dich eventuell nicht über Änderungen informieren bzw. sind nicht dazu verpflichtet, dich zu informieren, damit die Änderungen wirksam werden. Also solltest du von Zeit zu Zeit hier vorbeischauen, damit du über Änderungen an diesen Nutzungsbedingungen Bescheid weißt. Wir wollen nicht unfair sein, was das angeht – aber manchmal treten bestimmte Gesetzesänderungen auf oder irgendjemand tut etwas, das andere Minecraft-Spieler ebenfalls betrifft, und wir müssen das Ganze endgültig regeln. + • Wenn du uns einen Vorschlag für Minecraft oder ein anderes unserer Spiele machst, dann erhalten wir diesen Vorschlag kostenlos. Das bedeutet, dass wir deinen Vorschlag so nutzen können, wie wir wollen, und wir dich dafür nicht bezahlen müssen. Wenn du der Meinung bist, dass du einen Vorschlag hast, für den wir dich eventuell bezahlen wollen würden, musst du uns darüber in Kenntnis setzen, dass du bezahlt werden möchtest, bevor du deinen Vorschlag einreichst. + • Zusätzlich zu diesen Nutzungsbedingungen haben wir weiterhin Richtlinien zur Verwendung von Waren- und Markenzeichen („Brand and Asset Usage Guidelines“) aufgestellt, die du online findest. + • Wenn du gegen diese Regeln verstößt, können wir (oder Sony Computer Entertainment) dich daran hindern, Minecraft weiterhin zu nutzen. Wenn du diesen Regeln nicht zustimmen willst oder kannst, dann darfst du Minecraft nicht kaufen, herunterladen, nutzen oder spielen. + Wenn es irgendeine rechtliche Frage gibt, die an dieser Stelle nicht beantwortet wurde, dann frag uns vorher, bevor du etwas tust. Als Grundregel gilt: Wenn du nichts Dummes oder Albernes machst, tun wir es auch nicht. + Wir sind: + Mojang AB + Maria Skolgata 83, + SE-11853 + Stockholm + Schweden + Firmennummer: 556819-2388 + + + + Alle Inhalte, die in einem Ingame-Store gekauft werden, werden von Sony Network Entertainment Europe Limited („SNEE“) erworben und unterliegen den Nutzungsbedingungen und der Endbenutzer-Lizenzvereinbarung von Sony Entertainment Network, die im PlayStation®Store einzusehen sind. Bitte sieh dir die Nutzungsrechte für jeden Kauf an, da sie von Fall zu Fall unterschiedlich sein können. Soweit nicht anders angegeben, unterliegen alle Inhalte in einem Ingame-Store denselben Altersbeschränkungen wie das Spiel selbst. + + + + Der Erwerb und die Nutzung von Gegenständen unterliegen den Nutzungsbedingungen und der Endbenutzer-Lizenzvereinbarung von Sony Entertainment Network. Dieser Online-Dienst wurde dir mit einer Unterlizenz von Sony Computer Entertainment America zur Verfügung gestellt. + + + Hinweis: Der Gebrauch dieser Software unterliegt den Software-Nutzungsbedingungen unter eu.playstation.com/legal. + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/de-DE/stringsDynafont.xml b/Minecraft.Client/PSVitaMedia/loc/de-DE/stringsDynafont.xml new file mode 100644 index 00000000..dca31ec2 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/de-DE/stringsDynafont.xml @@ -0,0 +1,7 @@ + + + + DynaFont developed by DynaComware. + + + \ 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 new file mode 100644 index 00000000..28d59838 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/de-DE/stringsGeneric.xml @@ -0,0 +1,6755 @@ + + + + Wechsel in den Offline-Modus. + + + Warte bitte, bis der Host das Spiel gespeichert hat. + + + Das ENDE betreten + + + Spieler speichern + + + Mit dem Host verbinden + + + Gelände herunterladen + + + Das ENDE verlassen + + + 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. + + + 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. + + + Level laden + + + Wird finalisiert ... + + + Gelände bauen + + + Welt simulieren + + + Rang + + + Vorbereiten fürs Speichern des Levels + + + Teile werden vorbereitet ... + + + Server initialisieren + + + Nether verlassen + + + Erneut erscheinen + + + Level generieren + + + Startbereich generieren + + + Startbereich laden + + + Nether betreten + + + Werkzeuge und Waffen + + + Gamma + + + Spielempfindlichkeit + + + Menüempfindlichkeit + + + Schwierigkeit + + + Musik + + + Sound + + + Friedlich + + + 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. + + + Leicht + + + Normal + + + Schwierig + + + Abgemeldet + + + Rüstung + + + Mechanismen + + + Transport + + + Waffen + + + Nahrung + + + Strukturen + + + Dekorationen + + + Brauen + + + Werkzeuge, Waffen und Rüstungen + + + Materialien + + + Blöcke bauen + + + Redstone und Transport + + + Verschiedenes + + + Einträge: + + + 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! + + + 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 + + + Neue Welt erschaffen + + + Gib einen Namen für deine Welt ein. + + + Gib den Seed fürs Erstellen deiner Welt ein + + + Gespeicherte Welt laden + + + Tutorial spielen + + + Tutorial + + + Benenne deine Welt + + + Speicherdatei beschädigt + + + 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*} +Mit einem Ofen kannst du Gegenstände durch Erhitzen verändern. Zum Beispiel kannst du im Ofen aus Eisenerz Eisenbarren herstellen.{*B*}{*B*} +Platzier den Ofen in der Welt und drück{*CONTROLLER_ACTION_USE*}, um ihn zu verwenden.{*B*}{*B*} +Du musst unten in den Ofen etwas Brennstoff legen und oben in den Ofen den Gegenstand, den du erhitzen möchtest. Der Ofen wird dann angeheizt und beginnt zu arbeiten.{*B*}{*B*} +Wenn deine Gegenstände erhitzt sind, kannst du sie aus dem Ausgangsbereich in dein Inventar verschieben.{*B*}{*B*} +Wenn du den Cursor über eine Zutat oder einen Brennstoff für den Ofen bewegst, informiert eine Quickinfo dich über die Möglichkeit zum Aktivieren des schnellen Bewegens des Gegenstands in den Ofen. + + + {*T3*}SO WIRD GESPIELT: DISPENSER{*ETW*}{*B*}{*B*} +Ein Dispenser wird verwendet, um Gegenstände zu verschießen. Du musst einen Schalter wie zum Beispiel einen Hebel neben den Dispenser platzieren, um diesen auszulösen.{*B*}{*B*} +Um den Dispenser mit Gegenständen zu befüllen, drück{*CONTROLLER_ACTION_USE*}, und beweg dann die zu verschießenden Gegenstände aus deinem Inventar in den Dispenser.{*B*}{*B*} +Wenn du jetzt den Schalter betätigst, wird der Dispenser einen Gegenstand verschießen. + + + {*T3*}SO WIRD GESPIELT: BRAUEN{*ETW*}{*B*}{*B*} +Zum Brauen von Tränken brauchst du einen Braustand, den du an der Werkbank herstellen kannst. Jeder Trank beginnt mit einer Flasche Wasser, die man erhält, indem man eine Glasflasche mit Wasser aus einem Kessel oder einer Wasserquelle füllt. {*B*} +Ein Braustand hat drei Plätze für Flaschen, du kannst also drei Tränke auf einmal herstellen. Eine Zutat reicht für alle drei Flaschen aus, du solltest also immer drei Tränke auf einmal brauchen, um deine Rohstoffe optimal auszunutzen. {*B*} +Wenn du eine Trankzutat in das obere Feld des Braustandes legst, wird nach kurzer Zeit ein Grundtrank gebraut. Dieser hat noch keinen Effekt, aber du kannst aus diesem Grundtrank und einer weiteren Zutat einen Trank mit einem Effekt brauen. {*B*} +Wenn du diesen Trank hast, kannst du ihm noch eine dritte Zutat hinzufügen, damit der Effekt länger anhält (durch Redstone-Staub), stärker wirkt (durch Glowstone-Staub) oder zu einem schädlichen Trank wird (durch ein Fermentiertes Spinnenauge). {*B*} +Du kannst jedem Trank auch Schießpulver hinzufügen, wodurch er zu einem Wurftrank wird. Wenn du ihn wirfst, wird der Effekt des Tranks auf das Gebiet angewendet, in dem der Trank landet. {*B*} + +Die Grundzutaten für Tränke sind:{*B*}{*B*} +* {*T2*}Netherwarze{*ETW*}{*B*} +* {*T2*}Spinnenauge{*ETW*}{*B*} +* {*T2*}Zucker{*ETW*}{*B*} +* {*T2*}Ghastträne{*ETW*}{*B*} +* {*T2*}Lohenstaub{*ETW*}{*B*} +* {*T2*}Magmacreme{*ETW*}{*B*} +* {*T2*}Funkelnde Melone{*ETW*}{*B*} +* {*T2*}Redstone-Staub{*ETW*}{*B*} +* {*T2*}Glowstone-Staub{*ETW*}{*B*} +* {*T2*}Fermentiertes Spinnenauge{*ETW*}{*B*}{*B*} + +Du wirst selbst mit Kombinationen von Zutaten experimentieren müssen, um alle verschiedenen Tränke zu finden, die du brauen kannst. + + + {*T3*}SO WIRD GESPIELT: GROSSE TRUHE{*ETW*}{*B*}{*B*} +Wenn du zwei Truhen nebeneinander stellst, werden sie zu einer großen Truhe zusammengefügt. In ihr kannst du noch mehr Gegenstände lagern.{*B*}{*B*} +Sie funktioniert genauso wie eine normale Truhe. + + + {*T3*}SO WIRD GESPIELT: CRAFTING{*ETW*}{*B*}{*B*} +Auf der Crafting-Oberfläche kannst du Gegenstände aus deinem Inventar kombinieren, um neue Arten von Gegenständen zu erschaffen. Öffne die Crafting-Oberfläche mit{*CONTROLLER_ACTION_CRAFTING*}.{*B*}{*B*} +Wechsle mit{*CONTROLLER_VK_LB*} und{*CONTROLLER_VK_RB*} zwischen den Reitern am oberen Rand, um die Art des Gegenstands auszuwählen, den du herstellen möchtest. Wähl dann mit{*CONTROLLER_MENU_NAVIGATE*}den Gegenstand aus, den du herstellen möchtest.{*B*}{*B*} +Der Crafting-Bereich zeigt dir die Gegenstände, die du brauchst, um den neuen Gegenstand herzustellen. Drück{*CONTROLLER_VK_A*}, um den Gegenstand herzustellen und ihn in deinem Inventar abzulegen. + + + {*T3*}SO WIRD GESPIELT: WERKBANK{*ETW*}{*B*}{*B*} +Mit einer Werkbank kannst du größere Gegenstände herstellen.{*B*}{*B*} +Platzier die Werkbank in der Welt und drück{*CONTROLLER_ACTION_USE*}, um sie zu verwenden.{*B*}{*B*} +Crafting auf der Werkbank funktioniert genauso wie einfaches Crafting, allerdings bietet sie mehr Platz und dadurch eine größere Auswahl an Gegenständen, die du herstellen kannst. + + + {*T3*}SO WIRD GESPIELT: VERZAUBERN{*ETW*}{*B*}{*B*} +Mithilfe der Erfahrungspunkte, die du erhältst, wenn ein NPC stirbt oder wenn du bestimmte Blöcke abbaust oder im Ofen einschmilzt, kannst du einige Werkzeuge, Waffen, Rüstungen und Bücher verzaubern. {*B*} +Wenn ein Schwert, ein Bogen, eine Axt, eine Spitzhacke, eine Schaufel, eine Rüstung oder ein Buch in das Feld unter dem Buch in den Zaubertisch gelegt werden, zeigen die drei Schaltflächen rechts des Feldes ein paar Zauber und ihre Kosten in Erfahrungsleveln an. {*B*} +Wenn du für einen der Zauber nicht genug Erfahrungslevel hast, werden seine Kosten in Rot angezeigt, sonst in Grün. {*B*}{*B*} +Die tatsächlich angewendete Verzauberung wird zufällig und basierend auf den Kosten aus den angezeigten Verzauberungen ausgewählt. {*B*}{*B*} +Wenn der Zaubertisch von Bücherregalen umgeben ist (bis hin zu maximal 15 Bücherregalen), wobei zwischen Zaubertisch und Bücherregal ein Block Abstand sein muss, werden die Verzauberungen verstärkt und man kann sehen, wie arkane Schriftzeichen aus dem Buch auf dem Zaubertisch herausfliegen. {*B*}{*B*} +Alle Zutaten für einen Zaubertisch kann man in den Dörfern einer Welt finden oder indem man die Welt abbaut und bewirtschaftet. {*B*}{*B*} +Mit Zauberbüchern kannst du am Amboss Verzauberungen auf Gegenstände anwenden. So kannst du besser kontrollieren, welche Verzauberungen du bei deinen Gegenständen anwenden möchtest.{*B*} + + + {*T3*}SO WIRD GESPIELT: LEVEL SPERREN{*ETW*}{*B*}{*B*} +Wenn du in einem Level, den du spielst, anstößige Inhalte findest, kannst du den Level deiner Liste der gesperrten Level hinzufügen. +Ruf dafür das Pause-Menü auf, und drück dann{*CONTROLLER_VK_RB*}, um die QuickInfo zum Sperren eines Levels aufzurufen. +Wenn du in Zukunft versuchst, diesem Level beizutreten, wirst du darüber benachrichtigt, dass dieser Level sich auf deiner Liste der gesperrten Level befindet, und du erhältst die Wahl, den Level von der Liste zu entfernen und ihn zu betreten oder abzubrechen. + + + {*T3*}SO WIRD GESPIELT: HOST- UND SPIELEROPTIONEN{*ETW*}{*B*}{*B*} + +{*T1*}Spieloptionen{*ETW*}{*B*} +Beim Laden oder Erstellen einer Welt kannst du mit der Schaltfläche „Weitere Optionen“ ein Menü aufrufen, mit dem du mehr Kontrolle über dein Spiel hast.{*B*}{*B*} + +{*T2*}Spieler gegen Spieler{*ETW*}{*B*} +Bei Aktivierung können Spieler anderen Spielern Schaden zufügen. Diese Option betrifft nur den Überlebensmodus.{*B*}{*B*} + +{*T2*}Spielern vertrauen{*ETW*}{*B*} +Ist diese Option deaktiviert, sind Spieler, die dem Spiel beitreten, in ihren Handlungen eingeschränkt. Folgende Handlungen sind nicht möglich: Vorkommen abbauen, Gegenstände verwenden, Blöcke platzieren, Türen, Schalter und Container verwenden, Spieler angreifen, Tiere angreifen. Über das Spielmenü kannst du die Privilegien für einen speziellen Spieler ändern.{*B*}{*B*} + +{*T2*}Feuer breitet sich aus{*ETW*}{*B*} +Aktiviert, dass Feuer auf brennbare Blöcke in der Nähe übergreifen kann. Diese Option kann ebenfalls über das Spielmenü geändert werden.{*B*}{*B*} + +{*T2*}TNT explodiert{*ETW*}{*B*} +Aktiviert, dass TNT nach dem Zünden explodiert. Diese Option kann ebenfalls über das Spielmenü geändert werden.{*B*}{*B*} + +{*T2*}Hostprivilegien{*ETW*}{*B*} +Aktiviert, dass der Host das Fliegen nutzen, Erschöpfung deaktivieren und sich selbst im Spielmenü unsichtbar machen kann. {*DISABLES_ACHIEVEMENTS*}{*B*}{*B*} + + {*T2*}Tageslichtzyklus{*ETW*}{*B*} +Bei Deaktivierung verändert sich die Tageszeit nicht.{*B*}{*B*} + + {*T2*}Inventar behalten{*ETW*}{*B*} +Ist dies aktiviert, behalten Spieler nach dem Tod ihr Inventar.{*B*}{*B*} + + {*T2*}NPC-Erzeugung{*ETW*}{*B*} +Bei Deaktivierung erscheinen keine NPCs auf natürliche Art.{*B*}{*B*} + + {*T2*}NPC-Griefing{*ETW*}{*B*} +Verhindert bei Deaktivierung, dass Monster und Tiere Blöcke verändern (beispielsweise zerstören Creeper-Explosionen keine Blöcke und Schafe entfernen kein Gras) oder Gegenstände aufnehmen.{*B*}{*B*} + + {*T2*}NPC-Beute{*ETW*}{*B*} +Bei Deaktivierung lassen Monster und Tiere keine Beute fallen (beispielsweise werfen Creeper kein Schießpulver ab).{*B*}{*B*} + + {*T2*}Blockabwurf{*ETW*}{*B*} +Bei Deaktivierung lassen Blöcke keine Gegenstände fallen, wenn sie zerstört werden (beispielsweise bringen Steinblöcke keine Pflastersteine hervor).{*B*}{*B*} + + {*T2*}Natürliche Regeneration{*ETW*}{*B*} +Bei Deaktivierung regenerieren Spieler Gesundheit nicht auf natürliche Art.{*B*}{*B*} + +{*T1*}Optionen für das Erstellen der Welt{*ETW*}{*B*} +Beim Erstellen einer neuen Welt gibt es einige zusätzliche Optionen.{*B*}{*B*} + +{*T2*}Strukturen erzeugen{*ETW*}{*B*} +Aktiviert, dass Strukturen wie Dörfer und Festungen in der Welt erstellt werden.{*B*}{*B*} + +{*T2*}Superflache Welt{*ETW*}{*B*} +Aktiviert, dass eine völlig flache Welt in der Oberwelt und im Nether erschaffen wird.{*B*}{*B*} + +{*T2*}Bonustruhe{*ETW*}{*B*} +Aktiviert, dass eine Truhe mit nützlichen Gegenständen in der Nähe des Startpunkts des Spielers erstellt wird.{*B*}{*B*} + +{*T2*}Nether zurücksetzen{*ETW*}{*B*} +Ist diese Option aktiviert, wird der Nether neu generiert. Dies ist nützlich, wenn du einen älteren Spielstand hast, in dem es keine Netherfestungen gab. {*B*}{*B*} + +{*T1*}Optionen im Spiel{*ETW*}{*B*} +Während des Spielens hast du Zugriff auf eine Reihe von Optionen, indem du mit {*BACK_BUTTON*} das Spielmenü aufrufst.{*B*}{*B*} + +{*T2*}Hostoptionen{*ETW*}{*B*} +Der Host-Spieler und alle anderen, als Moderatoren eingesetzten Spieler haben Zugriff auf das Menü „Hostoptionen“. In diesem Menü können „Feuer breitet sich aus“ und „TNT explodiert“ aktiviert und deaktiviert werden.{*B*}{*B*} + +{*T1*}Spieleroptionen{*ETW*}{*B*} +Um die Privilegien für einen Spieler zu bearbeiten, wählst du den Namen des Spielers aus und rufst mit{*CONTROLLER_VK_A*} deren Privilegien-Menü auf, wo du die folgenden Optionen benutzen kannst.{*B*}{*B*} + +{*T2*}Kann bauen und abbauen{*ETW*}{*B*} +Diese Option ist nur verfügbar, wenn „Spielern vertrauen“ ausgeschaltet ist. Ist diese Option aktiviert, kann der Spieler wie gewöhnlich mit der Welt interagieren. Ist diese Option deaktiviert, kann der Spieler weder Blöcke platzieren oder zerstören noch mit vielen Gegenständen und Blöcken interagieren.{*B*}{*B*} + +{*T2*}Kann Türen und Schalter verwenden{*ETW*}{*B*} +Diese Option ist nur verfügbar, wenn „Spielern vertrauen“ ausgeschaltet ist. Ist diese Option deaktiviert, kann der Spieler keine Türen und Schalter verwenden.{*B*}{*B*} + +{*T2*}Kann Container öffnen{*ETW*}{*B*} +Diese Option ist nur verfügbar, wenn „Spielern vertrauen“ ausgeschaltet ist. Ist diese Option deaktiviert, kann der Spieler keine Container wie etwa Truhen öffnen.{*B*}{*B*} + +{*T2*}Kann Spieler angreifen{*ETW*}{*B*} +Diese Option ist nur verfügbar, wenn „Spielern vertrauen“ ausgeschaltet ist. Ist diese Option deaktiviert, kann der Spieler anderen Spielern keinen Schaden zufügen.{*B*}{*B*} + +{*T2*}Kann Tiere angreifen{*ETW*}{*B*} +Diese Option ist nur verfügbar, wenn „Spielern vertrauen“ ausgeschaltet ist. Ist diese Option deaktiviert, kann der Spieler Tieren keinen Schaden zufügen.{*B*}{*B*} + +{*T2*}Moderator{*ETW*}{*B*} +Ist diese Option aktiviert, kann der Spieler Privilegien für andere Spieler (den Host ausgenommen) ändern, wenn „Spielern vertrauen“ ausgeschaltet ist. Der Spieler kann andere Spieler ausschließen und „Feuer breitet sich aus“ sowie „TNT explodiert“ an- und ausschalten.{*B*}{*B*} + +{*T2*}Spieler ausschließen{*ETW*}{*B*} +{*KICK_PLAYER_DESCRIPTION*}{*B*}{*B*} + +{*T1*}Optionen für Host-Spieler{*ETW*}{*B*} +Wenn „Hostprivilegien“ aktiviert ist, kann der Host-Spieler einige seiner eigenen Privilegien bearbeiten. Zur Bearbeitung der Privilegien eines Spielers wählst du den Spielernamen aus und rufst mit{*CONTROLLER_VK_A*} das Privilegien-Menü für Spieler auf, wo du die folgenden Optionen nutzen kannst.{*B*}{*B*} + +{*T2*}Kann fliegen{*ETW*}{*B*} +Ist diese Option aktiviert, kann der Spieler fliegen. Diese Option ist nur für den Überlebensmodus relevant, da das Fliegen im Kreativmodus für alle Spieler aktiviert ist.{*B*}{*B*} + +{*T2*}Erschöpfung deaktivieren{*ETW*}{*B*} +Diese Option betrifft nur den Überlebensmodus. Aktiviert, dass körperliche Aktivitäten (Laufen/Sprinten/Springen etc.) sich nicht auf die Hungerleiste auswirken. Verletzt der Spieler sich allerdings, verringert sich die Hungerleiste langsam während des Heilungsvorgangs.{*B*}{*B*} + +{*T2*}Unsichtbar{*ETW*}{*B*} +Ist diese Option aktiviert, kann der Spieler von anderen Spielern nicht gesehen werden und ist unverwundbar.{*B*}{*B*} + +{*T2*}Kann Teleportieren{*ETW*}{*B*} +Dies ermöglicht es dem Spieler, andere Spieler oder sich selbst zu anderen Spielern in der Welt zu bewegen. + + + Nächste Seite + + + {*T3*}SO WIRD GESPIELT: TIERHALTUNG{*ETW*}{*B*}{*B*} +Wenn du deine Tiere an einer Stelle halten willst, solltest du einen eingezäunten Bereich von mindestens 20x20 Blöcke anlegen und deine Tiere dort unterbringen. Dann sind sie das nächste Mal auch noch da, wenn du sie besuchen willst. + + + {*T3*}SO WIRD GESPIELT: TIERZUCHT{*ETW*}{*B*}{*B*} +Die Tiere in Minecraft können sich vermehren und werden Babyversionen von sich selbst in die Welt setzen!{*B*} +Damit Tiere sich paaren, musst du sie mit dem richtigen Futter füttern, um sie in den „Liebesmodus“ zu versetzen.{*B*} +Füttere eine Kuh, eine Pilzkuh oder ein Schaf mit Weizen, ein Schwein mit Karotten, ein Huhn mit Weizensamen oder Netherwarzen, einen Wolf mit beliebigem Fleisch und schon ziehen sie los und suchen in der Nähe nach einem anderen Tier derselben Gattung, das auch im Liebesmodus ist.{*B*} +Wenn sich zwei Tiere derselben Gattung begegnen und beide im Liebesmodus sind, küssen sie sich für ein paar Sekunden und dann erscheint ein Babytier. Das Babytier folgt seinen Eltern für eine Weile, bevor es zu einem ausgewachsenen Tier heranwächst.{*B*} +Nachdem ein Tier im Liebesmodus war, dauert es fünf Minuten, bis das Tier den Liebesmodus erneut annehmen kann.{*B*} +Du kannst in einer Welt eine bestimmte maximale Anzahl an Tieren haben; es kann also sein, dass Tiere sich nicht vermehren, wenn du schon viele hast. + + + {*T3*}SO WIRD GESPIELT: NETHERPORTAL{*ETW*}{*B*}{*B*} +Mithilfe eines Netherportals kannst du zwischen der oberirdischen Welt und der Netherwelt hin und her reisen. Die Netherwelt kannst du zum schnellen Reisen in der Oberwelt nutzen – wenn du im Nether eine Entfernung von einem Block reist, entspricht das einer Reise von drei Blöcken in der oberirdischen Welt. Wenn du also ein Portal in die Netherwelt baust und sie darüber verlässt, wirst du dich dreimal so weit von deinem Startpunkt entfernt befinden.{*B*}{*B*} +Du brauchst mindestens 10 Blöcke Obsidian, um ein Portal zu bauen. Das Portal muss 5 Blöcke hoch, 4 Blöcke breit und 1 Block tief sein. Wenn der Rahmen des Portals gebaut ist, muss der Inhalt des Rahmens angezündet werden, um das Portal zu aktivieren. Dies kannst du mit dem Feuerzeug oder einer Feuerkugel tun.{*B*}{*B*} +Beispiele für Portale sind im Bild rechts dargestellt. + + + {*T3*}SO WIRD GESPIELT: TRUHE{*ETW*}{*B*}{*B*} +Wenn du eine Truhe erschaffen hast, kannst du sie in der Welt platzieren und dann mit{*CONTROLLER_ACTION_USE*} verwenden, um Gegenstände aus deinem Inventar hineinzulegen.{*B*}{*B*} +Verwende den Cursor, um Gegenstände zwischen deinem Inventar und der Truhe zu verschieben.{*B*}{*B*} +Du kannst Gegenstände in der Truhe lagern, um sie später wieder deinem Inventar hinzuzufügen. + + + Warst du auf der MineCon? + + + Niemand bei Mojang hat je das Gesicht von Junkboy gesehen. + + + Wusstest du schon, dass es ein Minecraft Wiki gibt? + + + Bitte schau nicht direkt auf die Bugs. + + + Creeper wurden aus einem Programmierfehler geboren. + + + Ist es ein Huhn oder eine Ente? + + + Mojangs neues Büro ist cool! + + + {*T3*}SO WIRD GESPIELT: GRUNDLAGEN{*ETW*}{*B*}{*B*} +Minecraft ist ein Spiel, bei dem du Blöcke platzierst, um alles zu bauen, was du dir vorstellen kannst. Nachts treiben sich Monster herum, du solltest dir eine Zuflucht bauen, bevor sie herauskommen.{*B*}{*B*} +Mit{*CONTROLLER_ACTION_LOOK*} kannst du dich umsehen.{*B*}{*B*} +Mit{*CONTROLLER_ACTION_MOVE*} kannst du dich bewegen.{*B*}{*B*} +Drück{*CONTROLLER_ACTION_JUMP*}, um zu springen.{*B*}{*B*} +Drück{*CONTROLLER_ACTION_MOVE*} zweimal schnell nacheinander nach vorn, um zu sprinten. Solange du{*CONTROLLER_ACTION_MOVE*} nach vorn gedrückt hältst, sprintest du weiter, bis dir die Sprintzeit ausgeht oder deine Hungerleiste weniger als{*ICON_SHANK_03*} anzeigt.{*B*} +Halte{*CONTROLLER_ACTION_ACTION*} gedrückt, um mit deiner Hand oder dem, was du darin hältst, zu graben oder zu hacken. Möglicherweise musst du dir ein Werkzeug bauen, um manche Blöcke abbauen zu können.{*B*}{*B*} +Wenn du einen Gegenstand in der Hand hältst, kannst du ihn mit{*CONTROLLER_ACTION_USE*} verwenden. Drück{*CONTROLLER_ACTION_DROP*}, um ihn abzulegen. + + + {*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 + + + Handel + + + Amboss + + + 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*} +Um das Endportal zu aktivieren, musst du eine Enderperle in einen Endportalrahmen einsetzen, in dem keine ist.{*B*} +Wenn das Portal aktiv ist, kannst du hindurch in Das Ende springen.{*B*}{*B*} +Im Ende begegnest du dem Enderdrachen, einem bösen, mächtigen Feind, und vielen Enderleuten; bereite dich also gut auf den Kampf vor, bevor du dich aufmachst!{*B*}{*B*} +Der Enderdrache heilt sich mithilfe von Enderkristallen, die auf acht Obsidianstacheln ruhen; du musst diese zuallererst einzeln zerstören.{*B*} +Die ersten paar davon erreichst du mit Pfeilen, doch die späteren werden durch einen Eisengitterkäfig geschützt, und du musst dich zu ihnen hochbauen.{*B*}{*B*} +Dabei greift dich der Enderdrache aus der Luft mit Endersäurekugeln an!{*B*} +Nähere dich dem Eierpodest inmitten der Stacheln; der Enderdrache fliegt herab und greift dich an, und du kannst ihm nun einigen Schaden zufügen!{*B*} +Nimm dich vor dem Säureatem in Acht und ziele auf die Augen des Enderdrachens, um wirkungsvolle Treffer zu landen. Bring, wenn du kannst, Freunde mit in Das Ende, die dir im Kampf beistehen!{*B*}{*B*} +Sobald du Das Ende besuchst, sehen deine Freunde die Lage des Endportals in den Festungen auf ihren Karten; sie können dir also leicht zu Hilfe kommen. + + + {*ETB*}Willkommen zurück! Vielleicht hast du es gar nicht bemerkt, aber dein Minecraft wurde gerade aktualisiert.{*B*}{*B*} +Es gibt jede Menge neue Funktionen für dich und deine Freunde. Hier stellen wir dir nur ein paar Highlights vor. Lies sie dir durch und dann zieh los und hab Spaß!{*B*}{*B*} +{*T1*}Neue Gegenstände{*ETB*} – gebrannter Lehm, gefärbter Lehm, Kohleblock, Heuballen, Aktivierungsschiene, Redstoneblock, Tageslichtsensor, Spender, Trichter, Lore mit Trichter, Lore mit TNT, Redstone-Komparator, beschwerte Druckplatte, Leuchtfeuer, Fallentruhe, Feuerwerksrakete, Feuerwerksstern, Netherstern, Leine, Pferderüstung, Namensschild, Pferde-Eintrittsei.{*B*}{*B*} +{*T1*}Neue NPCs{*ETB*} – Wither, Witherskelette, Hexen, Fledermäuse, Pferde, Esel und Maultiere.{*B*}{*B*} +{*T1*}Neue Features{*ETB*} – Pferd zähmen und reiten, Feuerwerk herstellen und eine Show abziehen, Tiere und Monster mit einem Namensschild versehen, mehr fortgeschrittene Redstone-Schaltkreise erstellen und neue Hostoptionen, um zu bestimmen, was Gäste in deiner Welt tun können!{*B*}{*B*} +{*T1*}Neue Tutorial-Welt{*ETB*} – Hier erfährst du, wie die alten und neuen Features in der Tutorial-Welt funktionieren. Versuche, alle geheimen Schallplatten, die in der Welt versteckt sind, zu finden!{*B*}{*B*} + + + 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. + + + 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. + + + Wird verwendet, um Erd- und Grasblöcke umzugraben und sie damit fürs Bepflanzen vorzubereiten. + + + Holztüren werden geöffnet, indem du sie verwendest, dagegen schlägst oder mittels Redstone. + + + 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. + + + Verleiht dem Spieler beim Tragen 2 Rüstungspunkte. + + + Verleiht dem Spieler beim Tragen 5 Rüstungspunkte. + + + Wird zum Bau platzsparender Treppen verwendet. + + + Wird verwendet, um Pilzsuppe aufzubewahren. Wenn die Suppe aufgegessen ist, behältst du die Schüssel. + + + Wird zum Aufbewahren und zum Transport von Wasser, Lava und Milch verwendet. + + + Wird zum Aufbewahren und zum Transport von Wasser verwendet. + + + 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. + + + Zeigt die Position der Sonne und des Mondes an. + + + Zeigt auf deinen Startpunkt. + + + Erzeugt ein Abbild einer Gegend, bei deren Erforschung du sie in der Hand hattest. Nützlich, um den Weg zu finden. + + + 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. + + + 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. + + + 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 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 zur Herstellung von Fackeln, Pfeilen, Schildern, Leitern, Zäunen und als Griff für Werkzeuge und Waffen verwendet. + + + 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. + + + 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. + + + Eisenaxt + + + Redstone-Lampe + + + Dschungelholztreppe + + + Birkenholztreppe + + + Derzeitige Steuerung + + + Schädel + + + Kakao + + + Fichtenholztreppe + + + Drachenei + + + Endstein + + + Endportalrahmen + + + Sandsteintreppe + + + Hohes Gras + + + Strauch + + + Layout + + + Crafting + + + Verwenden + + + Aktion + + + Schleichen/Runterfliegen + + + Schleichen + + + Ablegen + + + Gegenstand wechseln + + + Pause + + + Schauen + + + Bewegen/Sprinten + + + Inventar + + + Springen/Hochfliegen + + + Springen + + + Endportal + + + Kürbispflanze + + + Melone + + + Glasscheibe + + + Zauntor + + + Ranken + + + Melonenpflanze + + + Eisengitter + + + Rissige Steinziegel + + + Bemooste Steinziegel + + + 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 + + + Fichte + + + Birke + + + Fichtenholz + + + Birkenholz + + + Dschungelholz + + + Wolle + + + Rosa Wolle + + + Graue Wolle + + + Hellgraue Wolle + + + Hellblaue Wolle + + + Gelbe Wolle + + + Hellgrüne Wolle + + + Cyanfarbene Wolle + + + Grüne Wolle + + + Rote Wolle + + + Schwarze Wolle + + + Lila Wolle + + + Blaue Wolle + + + Braune Wolle + + + Fackel (Kohle) + + + Glowstone + + + Seelensand + + + Netherrack + + + Lapislazuliblock + + + Lapislazulierz + + + Portal + + + Kürbislaterne + + + Zuckerrohr + + + Lehm + + + Kaktus + + + Kürbis + + + Zaun + + + Jukebox + + + Ein kompakter Lapislazulispeicher. + + + Falltür + + + Verschlossene Truhe + + + Diode + + + Haftender Kolben + + + Kolben + + + Wolle (beliebige Farbe) + + + Toter Strauch + + + Kuchen + + + Notenblock + + + Dispenser + + + Hohes Gras + + + Netz + + + Bett + + + Eis + + + Werkbank + + + Ein kompakter Diamantspeicher. + + + Diamantblock + + + Ofen + + + Ackerland + + + Getreide + + + Diamanterz + + + Monster-Spawner + + + Feuer + + + Fackel (Holzkohle) + + + Redstone-Staub + + + Truhe + + + Eichenholztreppe + + + Schild + + + Redstone-Erz + + + Eisentür + + + Druckplatte + + + Schnee + + + Taste + + + Redstone-Fackel + + + Hebel + + + Schiene + + + Leiter + + + Holztür + + + Steintreppe + + + Detektor-Schiene + + + Booster-Schiene + + + Du hast genügend Pflastersteine gesammelt, um einen Ofen zu bauen. Verwende deine Werkbank, um einen herzustellen. + + + Angel + + + Uhr + + + Glowstone-Staub + + + Lore mit Ofen + + + Ei + + + Kompass + + + Roher Fisch + + + 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{*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. + + + + + Beweg den Cursor mit{*CONTROLLER_MENU_NAVIGATE*}. Drück{*CONTROLLER_VK_A*}, um einen Gegenstand unter dem Cursor aufzunehmen. + Falls es dort mehr als einen Gegenstand gibt, werden alle aufgenommen. Du kannst auch{*CONTROLLER_VK_X*} drücken, um nur die Hälfte von ihnen aufzunehmen. + + + + Du hast den ersten Teil des Tutorials abgeschlossen. + + + 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, bewege den Cursor über den Gegenstand und drücke {*CONTROLLER_ACTION_MENU_PAGEDOWN*}. + + + + + Dies ist die Crafting-Oberfläche. Hier kannst du gesammelte Gegenstände kombinieren, um neue Gegenstände herzustellen. + + + + 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*}. + + + + {*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 eine Beschreibung des Gegenstands anzuzeigen. + + + {*B*} + Drück zum Fortfahren{*CONTROLLER_VK_A*}.{*B*} + Drück{*CONTROLLER_VK_B*}, wenn du bereits weißt, wie man craftet. + + + 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. + + + + {*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. + + + 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. + + + Drück jetzt{*CONTROLLER_VK_B*}, um das Inventar zu verlassen. + + + 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. + + + + + 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. + + + + + 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. + + + + Wasser + + + Glasflasche + + + Wasserflasche + + + Spinnenauge + + + Goldklumpen + + + Netherwarze + + + {*prefix*}{*splash*}Trank {*postfix*} + + + Ferment. Spinnenauge + + + Kessel + + + Enderauge + + + Funkelnde Melone + + + Lohenstaub + + + Magmacreme + + + Braustand + + + Ghastträne + + + Kürbissamen + + + Melonensamen + + + Rohes Hühnchen + + + Schallplatte - „11“ + + + Schallplatte - „where are we now“ + + + Schere + + + Gebratenes Hühnchen + + + Enderperle + + + Melonenscheibe + + + Lohenrute + + + Rohes Rindfleisch + + + Steak + + + Verrottetes Fleisch + + + Erfahrungsfläschchen + + + Eichenholzbretter + + + Fichtenholzbretter + + + Birkenholzbretter + + + Grasblock + + + Erde + + + Pflasterstein + + + Dschungelholzbretter + + + Birkensetzling + + + Dschungelbaumsetzling + + + Bedrock + + + Setzling + + + Eichensetzling + + + Fichtensetzling + + + Stein + + + Gegenstandsrahmen + + + {*CREATURE*} erzeugen + + + Netherziegel + + + Feuerkugel + + + Feuerkugel (Holzkohle) + + + Feuerkugel (Kohle) + + + Schädel + + + Kopf + + + Kopf von %s + + + Creeper-Kopf + + + Skelettschädel + + + Dörrskelettschädel + + + Zombiekopf + + + Eine komplexe Art der Kohlelagerung. Kann als Brennstoff in einem Ofen verwendet werden. + + + Gift + + + Hunger + + + der Langsamkeit + + + der Geschwindigkeit + + + Unsichtbarkeit + + + Wasseratmung + + + Nachtsicht + + + Blindheit + + + des Schadens + + + der Heilung + + + der Verwirrtheit + + + der Regeneration + + + der Langsamkeit + + + der Grabeile + + + der Schwäche + + + der Stärke + + + Feuerwiderstand + + + Sättigung + + + des Widerstands + + + der Sprungverstärkung + + + Austrockung + + + Gesundheitsverstärkung + + + Absorption + + + + + + II + + + 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- + + + Mondäner + + + Uninteressanter + + + Schneidiger + + + Belebender + + + Charmanter + + + Eleganter + + + Aparter + + + Prickelnder + + + 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 + + + Bann + + + Schärfe + + + Verringert mit der Zeit die Gesundheit von betroffenen Spielern, Tieren und Monstern. + + + Angriffsschaden + + + Rückstoß + + + Nemesis der Gliederfüßer + + + Geschwindigkeit + + + Zombie-Verstärkungen + + + Pferdesprungstärke + + + Bei Anwendung: + + + Rückstoßwiderstand + + + NPC-Verfolgungsreichweite + + + Max. Gesundheit + + + Behutsamkeit + + + Effizienz + + + Wasseraffinität + + + Glück + + + Plünderung + + + Haltbarkeit + + + Feuerschutz + + + Schutz + + + Verbrennung + + + Federfall + + + Atmung + + + Schusssicher + + + Explosionsschutz + + + IV + + + V + + + VI + + + Schlag + + + VII + + + III + + + Feuer + + + Stärke + + + Unendlichkeit + + + II + + + I + + + Wird aktiviert, wenn sich ein Objekt durch einen angeschlossenen Stolperdraht bewegt. + + + Aktiviert einen angeschlossenen Stolperdrahthaken, wenn sich ein Objekt hindurchbewegt. + + + Ein kompakter Smaragdspeicher. + + + Ähnlich wie eine Truhe, nur stehen Gegenstände, die du in eine Endertruhe legst, in jeder deiner Endertruhen zur Verfügung, sogar in anderen Dimensionen. + + + IX + + + VIII + + + Muss mit mindestens einer Eisenspitzhacke abgebaut werden, um Smaragde zu erhalten. + + + 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. + + + 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*}. Der Verzehr kann dich vergiften. + + + Wird dazu verwendet, ein gesatteltes Schwein beim Reiten zu lenken. + + + Regeneriert 3{*ICON_SHANK_01*}. Entsteht, wenn man eine Kartoffel im Ofen brät. + + + Regeneriert 3{*ICON_SHANK_01*}. Aus einer Karotte und Goldklumpen hergestellt. + + + Wird mit einem Amboss verwendet, um Waffen, Werkzeuge und Rüstungen zu verzaubern. + + + Entsteht beim Abbau von Netherquarzerz. Kann zu einem Quarzblock verarbeitet werden. + + + Kartoffel + + + Ofenkartoffel + + + Karotte + + + Aus Wolle hergestellt. Wird als Dekoration verwendet. + + + Smaragd + + + Blumentopf + + + Kürbiskuchen + + + Zauberbuch + + + Giftige Kartoffel + + + Goldene Karotte + + + Karottenrute + + + Stolperdrahthaken + + + Stolperdraht + + + Netherquarz + + + Smaragderz + + + Endertruhe + + + Bemooste Pflastersteinmauer + + + Smaragdblock + + + Pflastersteinmauer + + + Kartoffeln + + + Blumentopf + + + Karotten + + + Leicht beschädigter Amboss + + + Amboss + + + Amboss + + + Quarzblock + + + Stark beschädigter Amboss + + + Netherquarzerz + + + Quarzstufen + + + Gemeißelter Quarzblock + + + Quarzsäule + + + Roter Teppich + + + Teppich + + + Schwarzer Teppich + + + Blauer Teppich + + + Grüner Teppich + + + Brauner Teppich + + + Lilafarbener Teppich + + + Cyanfarbener Teppich + + + Hellgrauer Teppich + + + Grauer Teppich + + + Hellgrüner Teppich + + + Rosafarbener Teppich + + + Hellblauer Teppich + + + Gelber Teppich + + + Pinker Teppich + + + Orangener Teppich + + + Weißer Teppich + + + Gemeißelter Sandstein + + + {*PLAYER*} starb beim Angriff auf {*SOURCE*}. + + + Glatter Sandstein + + + {*PLAYER*} wurde von einem fallenden Amboss zerquetscht. + + + {*PLAYER*} wurde von einem fallenden Block zerquetscht. + + + {*PLAYER*} hat dich an seine/ihre Position teleportiert. + + + {*PLAYER*} wurde zu {*DESTINATION*} teleportiert. + + + Dornen + + + {*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 + + + Zu teuer! + + + Verzauberungskosten: %d + + + Du hast: + + + Umbenennen + + + {*VILLAGER_TYPE*} bietet %s + + + Für Handel erfdl. Gegenst. + + + Handel + + + 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. + + + + + {*B*} + Drück{*CONTROLLER_VK_A*}, wenn du mehr über die Amboss-Oberfläche erfahren möchtest.{*B*} + Drück{*CONTROLLER_VK_B*}, wenn du schon alles über die Amboss-Oberfläche weißt. + + + + + Alternativ kann ein zweiter, identischer Gegenstand in den zweiten Platz gelegt werden, um die beiden Gegenstände zu kombinieren. + + + + + 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. + + + + + 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. + + + + + Beim Aufnehmen des reparierten Gegenstands werden beide Gegenstände verbraucht, die der Amboss verwendet hat, und dein Erfahrungslevel um den angegebenen Wert verringert. + + + + + Der Gegenstand lässt sich umbenennen, indem man den Namen bearbeitet, der im Textfeld angezeigt wird. + + + + + {*B*} + Drück{*CONTROLLER_VK_A*}, wenn du mehr über den Amboss erfahren möchtest.{*B*} + Drück{*CONTROLLER_VK_B*}, wenn du schon alles über den Amboss weißt. + + + + + 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. + + + + + Mit einem Amboss können Waffen und Werkzeuge repariert werden, um ihre Haltbarkeit wiederherzustellen. Du kannst sie auch umbenennen oder mit Zauberbüchern verzaubern. + + + + + Die Art der Arbeit, der Wert des Gegenstands, die Zahl der Verzauberungen und die Anzahl vorheriger Arbeitsgänge haben alle Einfluss auf die Reparaturkosten. + + + + + Die Benutzung des Ambosses kostet Erfahrungslevel, und bei jeder Benutzung kann der Amboss unter Umständen beschädigt werden. + + + + + In der Truhe in diesem Gebiet findest du beschädigte Spitzhacken, Rohmaterialien, Erfahrungsfläschchen und Zauberbücher zum Experimentieren. + + + + Beim Umbenennen ändert sich der Name eines Gegenstands für alle Spieler und die Kosten vorheriger Arbeitsgänge werden dauerhaft verringert. + + + + {*B*} + Drück{*CONTROLLER_VK_A*}, wenn du mehr über die Handels-Oberfläche erfahren möchtest. {*B*} + Drück{*CONTROLLER_VK_B*}, wenn du schon alles über die Handels-Oberfläche weißt. + + + + + Dies ist die Handels-Oberfläche. Sie zeigt mögliche Geschäfte mit Dorfbewohnern an. + + + + + Geschäfte werden rot angezeigt und stehen nicht zur Verfügung, wenn du die erforderlichen Gegenstände nicht besitzt. + + + + + Alle Geschäfte, die ein Dorfbewohner im Moment anbietet, werden am oberen Rand angezeigt. + + + + + 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. + + + + + Drück{*CONTROLLER_VK_A*}, um die Gegenstände, die der Dorfbewohner haben möchte, gegen den angebotenen Gegenstand einzutauschen. + + + + + Du kannst Gegenstände aus deinem Inventar mit Dorfbewohnern handeln. + + + + {*B*} + Drück{*CONTROLLER_VK_A*}, wenn du mehr über den Handel erfahren möchtest. {*B*} + Drück{*CONTROLLER_VK_B*}, wenn du schon alles über den Handel weißt. + + + + + 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. + + + + + Geschäfte, die oft in Anspruch genommen werden, werden vielleicht vorübergehend entfernt, aber derselbe Dorfbewohner bietet immer mindestens ein Geschäft an. + + + + + Nimm doch einmal etwas Papier aus der Truhe und handle mit dem Dorfbewohner hier. + + + + In diesem Gebiet gibt es zwei Endertruhen. + + + + {*B*} + Drück{*CONTROLLER_VK_A*}, wenn du mehr über Endertruhen erfahren möchtest. {*B*} + Drück{*CONTROLLER_VK_B*}, wenn du schon alles über Endertruhen weißt. + + + + + Alle Endertruhen in einer Welt sind miteinander verbunden, sogar über Dimensionen hinweg. Gegenstände, die du in eine Endertruhe legst, stehen in jeder anderen Endertruhe zur Verfügung. + + + + + Der Inhalt der Endertruhen ist aber für jeden Spieler anders. + + + + + Du kannst also Gegenstände in einer Endertruhe aufbewahren und sie aus anderen Endertruhen an anderen Orten in der Welt wieder herausholen. Du kannst das jetzt ausprobieren, indem du Gegenstände in eine der beiden Endertruhen legst. + + + + Regeneriert 2{*ICON_SHANK_01*}, regeneriert 30 Sekunden lang Gesundheit, gewährt Feuerwiderstand und 5 Minuten Widerstand gegen Schaden. Hergestellt aus einem Apfel und Goldblöcken. + + + Kann Teleportieren + + + Teleportieren + + + Zu Spieler teleportieren + + + Zu mir teleportieren + + + Kann Erschöpfung deaktivieren + + + Kann unsichtbar werden + + + Du kannst jetzt Unsichtbarkeit aktivieren. + + + Du kannst Unsichtbarkeit nicht mehr aktivieren. + + + Du kannst das Fliegen jetzt aktivieren. + + + Du kannst das Fliegen nicht mehr aktivieren. + + + Du kannst Erschöpfung jetzt aktivieren. + + + Du kannst Erschöpfung nicht mehr aktivieren. + + + Du kannst jetzt teleportieren. + + + Du kannst nicht mehr teleportieren. + + + {*T3*}SO WIRD GESPIELT: AMBOSS{*ETW*}{*B*}{*B*} +Erfahrungslevel können eingesetzt werden, um mit dem Amboss Gegenstände zu reparieren, zu verzaubern oder umzubenennen.{*B*} +Alle Gegenstände lassen sich umbenennen, aber nur Gegenstände mit einer Haltbarkeit können repariert oder mit Verzauberungen aus Zauberbüchern belegt werden.{*B*} +Um einen Gegenstand zu reparieren, musst du ihn in einen der Eingabeplätze links legen, entweder zusammen mit passenden Rohmaterialien (für ein Eisenschwert etwa Eisenbarren) oder mit einem anderen Gegenstand desselben Typs.{*B*} +Gegenstände lassen sich mit einem Amboss effizienter kombinieren. Wenn außerdem einer der Gegenstände verzaubert war, kann das fertige Produkt mit Verzauberungen des einen oder des anderen Ausgangsgegenstands belegt sein.{*B*} +Zauberbücher können Gegenstände mit Verzauberungen belegen, indem man sie auf einem Amboss kombiniert, sofern die Verzauberung des Buches geeignet ist. Zauberbücher können in Truhen in Dungeons gefunden oder durch Verzaubern am Zaubertisch aus normalen Büchern hergestellt werden.{*B*} +Bei jeder Benutzung des Ambosses besteht die Gefahr, dass er beschädigt wird. Wenn er zu viel eingesteckt hat, wird er zerstört.{*B*} + + + {*T3*}SO WIRD GESPIELT: HANDEL{*ETW*}{*B*}{*B*} +Mit Dorfbewohnern können Gegenstände gehandelt werden. Alle Dorfbewohner haben einen Beruf. Sie können Farmer, Metzger, Hufschmiede, Bibliothekare oder Priester sein. Der Beruf beeinflusst, welche Arten von Gegenständen sie handeln.{*B*} +Eine Liste aller Geschäfte, die ein Dorfbewohner anbietet, findest du im Handelsmenü. Ein Dorfbewohner kann seine Angebote modifizieren oder neue hinzufügen, wenn ein Spieler mit ihm handelt. Ein Geschäft kann auch vorübergehend deaktiviert werden, wenn es zu oft getätigt wird.{*B*} +Bei Geschäften geht es üblicherweise darum, Gegenstände gegen Smaragde zu kaufen oder zu verkaufen.{*B*} +Wenn du für ein Geschäft nicht die erforderlichen Gegenstände hast, werden sie in Rot angezeigt.{*B*} + + + + {*T3*}SO WIRD GESPIELT: ENDERTRUHE {*ETW*}{*B*}{*B*} +Alle Endertruhen in einer Welt sind miteinander verbunden. Gegenstände, die in eine Endertruhe gelegt werden, sind in jeder anderen verfügbar. Allerdings ist der Inhalt der Endertruhen für jeden Spieler anders. So können Spieler Gegenstände in einer Endertruhe aufbewahren und sie aus Endertruhen an anderen Orten in der Welt wieder herausholen. + + + Farmer + + + Bibliothekar + + + Priester + + + Hufschmied + + + Metzger + + + In den Dörfern bieten die Dorfbewohner dir Gegenstände zum Kauf an, je nach ihrem Beruf. + + + Große Truhe + + + + Du kannst auch Zauberbücher auf dem Zaubertisch herstellen. Später kannst du auf dem Amboss Gegenstände mit der Verzauberung des jeweiligen Buches belegen. + + + + + Stolperdrahthaken versorgen auch einen Schaltkreis konstant mit Energie, solange etwas den Draht zwischen ihnen berührt. + + + + + Gezähmte Wölfe haben immer ein Halsband um. Dessen Farbe ist durch Färben veränderbar. + + + + Karotten und Kartoffeln werden angebaut, indem du Karotten oder Kartoffeln pflanzt. Wenn das Gemüse über der Erde zu sehen ist, sind sie erntereif. + + + + Schweine kannst du außerdem satteln und reiten. Zum Lenken lockst du sie mit einer Karottenrute. + + + + Mit {*CONTROLLER_ACTION_MOVE*} kannst du deine Lore langsam bewegen, falls das nötig ist. Das hilft dabei, die Lore in Bewegung zu setzen, indem du sie auf eine Booster-Schiene bringst. + + + Du kannst diesem Spiel nicht beitreten, weil ein geteilter Bildschirm nur im HD-Modus möglich ist. Melde alle anderen Spieler ab, wenn du beitreten möchtest. + + + Heilmittel + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/de-DE/stringsLeaderboards.xml b/Minecraft.Client/PSVitaMedia/loc/de-DE/stringsLeaderboards.xml new file mode 100644 index 00000000..e309b88d --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/de-DE/stringsLeaderboards.xml @@ -0,0 +1,48 @@ + + + + Tötungen (leicht) + + + Tötungen (normal) + + + Tötungen (schwierig) + + + Blöcke abbauen (friedlich) + + + Blöcke abbauen (leicht) + + + Blöcke abbauen (normal) + + + Blöcke abbauen (schwierig) + + + Landwirtschaft (friedlich) + + + Landwirtschaft (leicht) + + + Landwirtschaft (normal) + + + Landwirtschaft (schwierig) + + + Reisen (friedlich) + + + Reisen (leicht) + + + Reisen (normal) + + + Reisen (schwierig) + + \ 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 new file mode 100644 index 00000000..b89c81a1 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/de-DE/stringsPlatformSpecific.xml @@ -0,0 +1,244 @@ + + + + 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 + + + NOT USED + + + {*T3*}SO WIRD GESPIELT: KREATIVMODUS{*ETW*}{*B*}{*B*} +Die Oberfläche des Kreativmodus erlaubt es dir, alle Gegenstände im Spiel in dein Inventar zu verschieben, ohne dass du sie vorher abbauen oder herstellen musst. +Die Gegenstände werden nicht aus deinem Inventar entfernt, wenn du sie in der Welt platzierst oder sie verbrauchst. Dadurch kannst du dich ganz aufs Bauen konzentrieren, anstatt auf das Sammeln von Ressourcen. {*B*} +Wenn du eine Welt im Kreativmodus erstellst, lädst oder speicherst, sind Trophäen und Ranglisten-Aktualisierungen in dieser Welt deaktiviert, selbst wenn du die Welt später im Überlebensmodus lädst.{*B*} +Um im Kreativmodus zu fliegen, drücke zweimal schnell{*CONTROLLER_ACTION_JUMP*}. Um das Fliegen zu beenden, wiederhole die Aktion. Um schneller zu fliegen, drücke beim Fliegen{*CONTROLLER_ACTION_MOVE*} zweimal schnell nach vorn.{*B*} +Im Flugmodus halte{*CONTROLLER_ACTION_JUMP*} gedrückt, um dich nach oben zu bewegen, und{*CONTROLLER_ACTION_SNEAK*}, um dich nach unten zu bewegen. Oder verwende{*CONTROLLER_ACTION_DPAD_UP*}, um dich nach oben zu bewegen, {*CONTROLLER_ACTION_DPAD_DOWN*}, um dich nach unten zu bewegen, {*CONTROLLER_ACTION_DPAD_LEFT*}, um dich nach links zu bewegen, und {*CONTROLLER_ACTION_DPAD_RIGHT*}, um dich nach rechts zu bewegen. + + + 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" + + + 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? + + + "NOT USED" + + + 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ü. + + + 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. +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? + + + 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/de-DE/stringsRichPresence.xml b/Minecraft.Client/PSVitaMedia/loc/de-DE/stringsRichPresence.xml new file mode 100644 index 00000000..82a086e0 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/de-DE/stringsRichPresence.xml @@ -0,0 +1,66 @@ + + + + {GAME_STATE} + + + Inaktiv + + + In den Menüs + + + Spielt Multiplayer - {GAME_STATE} + + + Multiplayer offline – {GAME_STATE} + + + Spielt alleine{GAME_STATE} + + + Alleine offline – {GAME_STATE} + + + Genießt die Aussicht! + + + Reitet ein Schwein + + + Fährt eine Lore + + + In einem Boot + + + Angelt + + + Stellt etwas her + + + Schmiedet + + + In den Nether + + + Hört eine Platte an + + + Studiert eine Karte + + + Verzaubert + + + Braut einen Trank + + + Arbeitet am Amboss + + + Trifft die Nachbarn + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/el-EL/4J_stringsGeneric.xml b/Minecraft.Client/PSVitaMedia/loc/el-EL/4J_stringsGeneric.xml new file mode 100644 index 00000000..f502fb31 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/el-EL/4J_stringsGeneric.xml @@ -0,0 +1,87 @@ + + + + OK + + + Πίσω + + + Ακύρωση + + + Ναι + + + Όχι + + + Κατεστραμμένη Αποθήκευση + + + Τα αποθηκευμένα δεδομένα σας φαίνονται κατεστραμμένα. Δημιουργία νέας αποθήκευσης και αντικατάσταση της κατεστραμμένης; + + + Δεν Υπάρχει Ελεύθερος Χώρος + + + Επιλογή ξανά + + + Παιχνίδι χωρίς αποθήκευση + + + Δημιουργία νέας αποθήκευσης + + + Αντικατάσταση αποθήκευσης; + + + Όχι, να μην αντικατασταθεί + + + Αντικατάσταση και αποθήκευση + + + Η αποθήκευση απέτυχε + + + Συνέχεια χωρίς αποθήκευση + + + Η φόρτωση απέτυχε + + + Δώστε όνομα στην αποθήκευση + + + Καταχωρίστε ένα όνομα για την αποθήκευση παιχνιδιού + + + Είστε βέβαιοι ότι θέλετε να βγείτε από το παιχνίδι; + + + Αποσυνδέθηκε + + + Συνέχεια παιχνιδιού + + + Συνέχεια παιχνιδιού εκτός σύνδεσης + + + Παίκτης με Ιδιότητα Επισκέπτη + + + Οι παίκτες με ιδιότητα επισκέπτη δεν μπορούν να αποκτήσουν πρόσβαση στο "PSN". + + + Αποθήκευση... + + + Αποθήκευση περιεχομένου. Μην απενεργοποιήσετε το σύστημά σας. + + + Ξεκλείδωμα Πλήρους Παιχνιδιού + + \ 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 new file mode 100644 index 00000000..6621ccc9 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/el-EL/4J_stringsPlatformSpecific.xml @@ -0,0 +1,53 @@ + + + + Η αποθήκευση των ρυθμίσεων στο λογαριασμό σας στο 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 new file mode 100644 index 00000000..0f9faed2 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/el-EL/AdditionalStrings.xml @@ -0,0 +1,96 @@ + + + + Προβολή όλων των Συνδυαστικών Κόσμων + + + Απόκρυψη + + + Minecraft: PlayStation®3 Edition + + + Επιλογές + + + Αποθήκευση Κρυφής Μνήμης + + + Παρουσιάστηκε σφάλμα δικτύου. + + + Σφάλμα Δικτύου + + + Παρουσιάστηκε σφάλμα δικτύου. Έξοδος στο Κύριο Μενού. + + + Η Διαδικτυακή υπηρεσία απενεργοποιήθηκε στο Sony Entertainment Network λογαριασμό σας, λόγω περιορισμών συζήτησης. + + + Η Διαδικτυακή υπηρεσία απενεργοποιήθηκε στο Sony Entertainment Network λογαριασμό σας, λόγω ρυθμίσεων γονικού ελέγχου. + + + Διαδικτυακή Υπηρεσία + + + Έχετε αποσυνδεθεί από το "PSN". Οι διαδικτυακές λειτουργίες του παιχνιδιού δεν θα είναι διαθέσιμες, έως ότου συνδεθείτε ξανά στο "PSN". + + + Έχετε αποσυνδεθεί από το "PSN". Οι διαδικτυακές λειτουργίες του παιχνιδιού δεν θα είναι διαθέσιμες, έως ότου συνδεθείτε ξανά στο "PSN". Έξοδος στο Κύριο Μενού. + + + Επιλέξτε χρήστη για τον παίκτη %d (ή ακύρωση, για παιχνίδι με ιδιότητα επισκέπτη) + + + Δωρεάν + + + Το αρχείο Επιλογών είναι κατεστραμμένο και πρέπει να διαγραφεί. + + + Διαγραφή αρχείου επιλογών. + + + Επανάληψη φόρτωσης αρχείου επιλογών. + + + Το αρχείο Αποθήκευσης της Κρυφής Μνήμης είναι κατεστραμμένο και πρέπει να διαγραφεί. + + + Απενεργοποίηση Τροπαίων + + + Τα Τρόπαια θα απενεργοποιηθούν, επειδή αυτή η αποθήκευση ανήκει σε άλλο χρήστη. + + + Κρίσιμο σφάλμα: Η ενεργοποίηση των Τροπαίων απέτυχε. Βγείτε από το παιχνίδι. + + + Προβολή Προσκλήσεων + + + Κατεστραμμένο Αρχείο + + + Αποσύνδεση Χειριστηρίου + + + Το χειριστήριό σας αποσυνδέθηκε. Συνδέστε ξανά το χειριστήριο. + + + Η Διαδικτυακή υπηρεσία απενεργοποιήθηκε στο Sony Entertainment Network λογαριασμό σας, λόγω ρυθμίσεων γονικού ελέγχου για έναν από τους τοπικούς σας παίκτες. + + + Οι online λειτουργίες είναι απενεργοποιημένες, επειδή υπάρχει διαθέσιμη ενημέρωση παιχνιδιού. + + + Δεν υπάρχουν προσφορές για διαθέσιμο περιεχόμενο με δυνατότητα λήψης αυτήν τη στιγμή. + + + Πρόσκληση + + + Ελάτε να παίξετε ένα παιχνίδι του Minecraft: PlayStation®Vita Edition! + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/el-EL/EULA.xml b/Minecraft.Client/PSVitaMedia/loc/el-EL/EULA.xml new file mode 100644 index 00000000..bbe0410a --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/el-EL/EULA.xml @@ -0,0 +1,99 @@ + + + + Minecraft: PlayStation®Vita Edition - ΟΡΟΙ ΧΡΗΣΗΣ + Οι παρόντες όροι καθορίζουν ορισμένους κανόνες για τη χρήση του Minecraft: PlayStation®Vita Edition («Minecraft»). Προκειμένου να προστατεύσουμε το Minecraft και τα μέλη της κοινότητάς μας, χρησιμοποιούμε αυτούς τους όρους για να θέσουμε ορισμένους κανόνες που αφορούν τη λήψη και τη χρήση του Minecraft. Απεχθανόμαστε τους κανόνες όσο κι εσείς, επομένως προσπαθήσαμε να τους περιορίσουμε στο ελάχιστο δυνατόν. Ωστόσο, η αγορά, η λήψη και η χρήση του Minecraft συνεπάγεται ότι αποδέχεστε τους παρόντες όρους («Όροι»). + Πριν συνεχίσουμε, θα θέλαμε να αποσαφηνίσουμε ένα πολύ σημαντικό στοιχείο: Το Minecraft είναι ένα παιχνίδι που επιτρέπει στους παίκτες να χτίζουν και να γκρεμίζουν πράγματα. Αν παίζετε με άλλα άτομα (λειτουργία για πολλούς παίκτες) μπορείτε να χτίσετε παρέα ή να γκρεμίσετε αυτά που έχτισαν εκείνοι - και το ίδιο μπορούν να κάνουν και εκείνοι σε εσάς. Επομένως, μην παίζετε με άλλα άτομα αν δεν συμπεριφέρονται όπως θα θέλατε. Επίσης, ορισμένες φορές, τα άτομα κάνουν πράγματα που δεν θα έπρεπε να κάνουν. Δεν μας αρέσει αυτό, αλλά δεν μπορούμε να κάνουμε και πολλά για να το σταματήσουμε, παρά μόνο να ζητήσουμε από όλους εσάς να συμπεριφέρεστε κόσμια. Βασιζόμαστε σε εσάς και σε άλλα μέλη της κοινότητας για να μας ενημερώσετε αν κάποιος δεν συμπεριφέρεται σωστά. Σε αυτήν την περίπτωση και εάν πιστεύετε ότι κάποιος παραβιάζει τους κανόνες ή τους παρόντες Όρους ή χρησιμοποιεί το Minecraft με ανάρμοστο τρόπο, θα θέλαμε να μας ενημερώσετε. Διαθέτουμε ένα σύστημα επισήμανσης/αναφοράς ανάρμοστης συμπεριφοράς, το οποίο μπορείτε να χρησιμοποιήσετε για να μας ενημερώσετε και να μας δώσετε τη δυνατότητα να αντιμετωπίσουμε το πρόβλημα. + Για να επισημάνετε ή να αναφέρετε τυχόν προβλήματα, στείλτε μας ένα email στη διεύθυνση support@mojang.com και αναφέρετέ μας όσες περισσότερες πληροφορίες μπορείτε όσον αφορά τα στοιχεία του χρήστη και το τι έχει συμβεί. + Και τώρα, ας επιστρέψουμε στους Όρους: + ΕΝΑΣ ΒΑΣΙΚΟΣ ΚΑΝΟΝΑΣ + Ο ένας και μοναδικός κανόνας είναι ότι δεν πρέπει να διανέμετε τίποτε από όσα έχουμε δημιουργήσει. Λέγοντας «διανέμετε τίποτε από όσα έχουμε δημιουργήσει», εννοούμε «να δωρίζετε αντίγραφα του Minecraft, να χρησιμοποιείτε το παιχνίδι για εμπορικούς σκοπούς, να προσπαθείτε να κερδίσετε χρήματα από αυτό ή να επιτρέπετε σε άλλα άτομα να αποκτούν πρόσβαση στο Minecraft και στα επιμέρους τμήματά του με οποιονδήποτε αθέμιτο ή μη εύλογο τρόπο». Επομένως, ο ένας και μοναδικός κανόνας είναι ότι (εκτός εάν συμφωνήσουμε ρητά διαφορετικά - όπως για παράδειγμα ισχύει στις Οδηγίες μας σχετικά με τη χρήση της επωνυμίας και των περιουσιακών στοιχείων), δεν πρέπει: + • να δίνετε αντίγραφα Minecraft σε κανέναν άλλον· + • να χρησιμοποιείτε τις δημιουργίες μας για εμπορικούς σκοπούς· + • να προσπαθείτε να κερδίσετε χρήματα από τις δημιουργίες μας· ή + • να επιτρέπετε την πρόσβαση στις δημιουργίες μας σε άλλα άτομα και με αθέμιτο και μη εύλογο τρόπο. + ...και για να μην υπάρχουν αμφιβολίες σχετικά με το τι περιλαμβάνει ο όρος «οι δημιουργίες μας», αναφέρουμε ενδεικτικά το πρόγραμμα πελάτη ή το λογισμικό διακομιστή για το Minecraft. Περιλαμβάνει επίσης τροποποιημένες εκδόσεις ενός Παιχνιδιού, μέρους αυτού ή κάθε άλλου δημιουργήματός μας. + Κατά τα άλλα, δεν έχουμε κανέναν άλλο περιορισμό για το τι μπορείτε να κάνετε - για την ακρίβεια, σας παροτρύνουμε να κάνετε φανταστικά πράγματα (θα δείτε στη συνέχεια) - αρκεί να μην κάνετε αυτά που σας λέμε ότι απαγορεύονται. + ΧΡΗΣΗ ΤΟΥ MINECRAFT + • Αγοράσατε το Minecraft, επομένως μπορείτε να το χρησιμοποιήσετε οι ίδιοι στο σύστημα PlayStation®Vita σας. + • Παρακάτω σας παρέχουμε περιορισμένα δικαιώματα για να κάνετε και άλλα πράγματα, ωστόσο θα πρέπει να οριοθετήσουμε τις ελευθερίες σας, ειδάλλως μπορεί να παρεκτραπείτε. Αν θέλετε να κάνετε κάτι που σχετίζεται με τις δημιουργίες μας, θα ήταν μεγάλη μας τιμή. Ωστόσο, βεβαιωθείτε ότι οι ενέργειές σας δεν ερμηνεύονται ως επίσημες ενέργειες και ότι συμμορφώνονται με τους παρόντες Όρους. Πρωτίστως δε, μην χρησιμοποιήσετε τις δημιουργίες μας για εμπορικούς σκοπούς. + • Η άδεια που σας παραχωρούμε για να παίξετε το Minecraft μπορεί να ανακληθεί, αν παραβείτε τους εν λόγω Όρους. + • Όταν αγοράζετε το Minecraft, σας παρέχουμε την άδεια να εγκαταστήσετε το Minecraft στο σύστημα PlayStation®Vita σας, όπου μπορείτε να χρησιμοποιήσετε και να παίξετε το παιχνίδι σύμφωνα με τα όσα προβλέπουν οι παρόντες Όροι. Η άδεια αυτή αφορά εσάς προσωπικά, επομένως δεν επιτρέπεται να διανείμετε το Minecraft (ή επιμέρους τμήματά του) σε κανέναν άλλον (εκτός, φυσικά, αν σας το επιτρέψουμε εμείς ρητά). + • Εντός ευλόγου πλαισίου, έχετε το δικαίωμα να κάνετε ό,τι θέλετε με τα στιγμιότυπα οθόνης και τα βίντεο του Minecraft. Λέγοντας «εντός ευλόγου πλαισίου» εννοούμε ότι δεν μπορείτε να τα χρησιμοποιήσετε για εμπορικούς σκοπούς ή με άλλον αθέμιτο τρόπο, ο οποίος θίγει τα δικαιώματά μας. Επίσης, μην αντιγράφετε και διανέμετε τα καλλιτεχνικά στοιχεία. Δεν είναι σωστό. + • Κατά βάση, ο απλός κανόνας είναι να μην χρησιμοποιείτε για εμπορικούς σκοπούς καμία από τις δημιουργίες μας εκτός εάν συμφωνήσουμε ρητά σε αυτό, είτε μέσω των οδηγιών μας για τη χρήση της επωνυμίας και των περιουσιακών στοιχείων είτε βάσει των παρόντων Όρων. Α, και εφόσον το επιτρέπει ρητά ο νόμος, όπως για παράδειγμα σε κάποιο άρθρο σχετικά με τη «δίκαιη χρήση» ή τη «δίκαιη μεταχείριση», τότε μπορείτε να το κάνετε - αλλά μόνο στο βαθμό που το επιτρέπει ο νόμος. + ΙΔΙΟΚΤΗΣΙΑ ΤΟΥ MINECRAFT ΚΑΙ ΑΛΛΑ ΣΤΟΙΧΕΙΑ + • Παρόλο που σας έχουμε παραχωρήσει άδεια να παίξετε το Minecraft, εξακολουθούμε να είμαστε οι ιδιοκτήτες του. Είμαστε επίσης ιδιοκτήτες των επωνυμιών μας και των περιεχομένων του Minecraft, το οποίο απαρτίζεται από το λογισμικό, τις υφές, τα περιουσιακά στοιχεία, τα εργαλεία και τις υποδομές μας, καθώς από μια πληθώρα έξυπνων (και άλλων, όχι τόσο έξυπνων) στοιχείων που μας ανήκουν. Διατηρούμε και υποστηρίζουμε όλα τα δικαιώματά μας επί αυτών των στοιχείων, τα οποία όμως μπορείτε να χρησιμοποιήσετε βάσει των παρόντων Όρων. + • Αυτό δεν σημαίνει ότι έχουμε στην κατοχή μας όλα τα υπέροχα πράγματα που δημιουργείτε μέσω του Minecraft - απλώς θα πρέπει να αποδεχθείτε ότι είμαστε οι ιδιοκτήτες κάθε επιμέρους τμήματος του Minecraft και του Minecraft συνολικά ως προϊόντος και υπηρεσίας και όλων αυτών που αναφέρονται στην προηγούμενη πρόταση και ότι κατέχουμε τα δικαιώματα πνευματικής ιδιοκτησίας και άλλα παρόμοια δικαιώματα («IPR») που σχετίζονται με αυτά και με τα ονόματα και τις επωνυμίες που αφορούν στο Minecraft. + • Φυσικά, εσείς θα δημιουργήσετε δικά σας πράγματα χρησιμοποιώντας το Minecraft. Δεν είμαστε κύριοι των πρωτότυπων έργων που δημιουργείτε και δεν ισχυριζόμαστε την ιδιοκτησία κανενός έργου που δεν είναι δική μας δημιουργία. Ωστόσο, στην ιδιοκτησία μας περιέρχονται αντίγραφα (ή ουσιώδη αντίγραφα) ή παράγωγα της ιδιοκτησίας και των δημιουργιών μας (περιγράφονται παραπάνω) - αν όμως εσείς δημιουργήσετε κάτι πρωτότυπο, τότε αυτό δεν είναι δικό μας. Για παράδειγμα: + - ένα τούβλο - αυτό είναι δικό μας + - ένας γοτθικός καθεδρικός με έναν οδοστρωτήρα να τον διασχίζει - αυτό δεν είναι δικό μας. + • Επομένως, όταν πληρώνετε για τη χρήση του Minecraft, αγοράζετε μόνο την άδεια χρήστης του προϊόντος Minecraft, σύμφωνα με τους παρόντες Όρους. Οι μόνες άδειες που διαθέτετε σε σχέση με το Minecraft είναι οι άδειες που αναγράφονται στους παρόντες Όρους. + ΠΕΡΙΕΧΟΜΕΝΑ + • Αν αναρτήσετε οποιοδήποτε περιεχόμενο στο Minecraft ή μέσω του Minecraft, θα πρέπει να μας παραχωρήσετε άδεια χρήσης, αντιγραφής, τροποποίησης και προσαρμογής του εν λόγω περιεχομένου. Η άδεια πρέπει να είναι αμετάκλητη και να μην υπόκειται σε περιορισμούς. Θα πρέπει επίσης να μας επιτρέψετε να παραχωρήσουμε την άδεια χρήσης του περιεχομένου σας σε άλλους χρήστες και επίσης να επιτρέπετε την πρόσβαση σε αυτό και τη χρήση του σε άλλα άτομα (όπως π.χ. τα άτομα με τα οποία παίζετε στη λειτουργία για πολλούς παίκτες). + • Σκεφτείτε προσεκτικά αν θα αναρτήσετε το περιεχόμενό σας, επειδή μπορεί να δημοσιευτεί και να χρησιμοποιηθεί από άτομα με τρόπο που δεν σας βρίσκει σύμφωνο. + • Αν θέλετε να αναρτήσετε περιεχόμενο στο Minecraft ή μέσω αυτού, δεν πρέπει να είναι προσβλητικό για άτομα ή παράνομο. Πρέπει να είναι γνήσιο και να αποτελεί δικό σας δημιούργημα. Οι τύποι περιεχομένου που δεν μπορείτε να αναρτήσετε στο Minecraft περιλαμβάνουν: αναρτήσεις που περιέχουν ρατσιστικό ή ομοφοβικό περιεχόμενο· αναρτήσεις που περιέχουν εκφοβιστικό ή ερειστικό περιεχόμενο· αναρτήσεις που μπορεί να θίξουν την υπόληψή μας ή την υπόληψη άλλων ατόμων· αναρτήσεις που περιέχουν πορνογραφικό ή διαφημιστικό περιεχόμενο ή τη δημιουργία ή την εικόνα κάποιου άλλου ατόμου· ή αναρτήσεις που αναπαριστούν κάποιον τρίτο ή έχουν ως σκοπό να εξαπατήσουν ή να εκμεταλλευτούν άλλα άτομα. + • Επίσης, κάθε περιεχόμενο που αναρτάτε στο Minecraft πρέπει να είναι δικό σας δημιούργημα. Δεν πρέπει να αναρτάτε μέσω του Minecraft περιεχόμενο που θίγει τα δικαιώματα άλλων ατόμων. Αν λάβουμε οποιαδήποτε απειλή, αγωγή ή αμφισβήτηση από κάποιο τρίτο πρόσωπο λόγω του περιεχομένου που αναρτήσατε στο Minecraft, επειδή το εν λόγω περιεχόμενο προσβάλλει τα δικαιώματά του, ενδεχομένως να σας θεωρήσουμε υπεύθυνο και να σας ζητήσουμε αποζημίωση για οποιαδήποτε ζημία που υποστήκαμε εξαιτίας του. Συνεπώς, είναι πολύ σημαντικό να αναρτάτε μόνο περιεχόμενο που έχετε δημιουργήσει εσείς και όχι κάποιος άλλος. + • Να είστε πολύ προσεκτικοί όταν επιλέγετε συμπαίκτες. Είναι δύσκολο, τόσο για εσάς όσο και για εμάς να γνωρίζουμε με βεβαιότητα αν τα λεγόμενα ή η ταυτότητα κάποιου ατόμου είναι πραγματικά. Δεν θα πρέπει να δίνετε πληροφορίες για τον εαυτό σας μέσω του Minecraft. + Αν σκοπεύετε να αναρτήσετε περιεχόμενο («Το περιεχόμενό σας») μέσω του Minecraft, θα πρέπει να ισχύουν τα εξής: + - το περιεχόμενο θα πρέπει να συμμορφώνεται με όλους τους κανόνες της Sony Computer Entertainment, συμπεριλαμβανομένων των ToSUA, δηλαδή των Όρων Χρήσης και της Συμφωνίας Άδειας Χρήσης του "PSN", και άλλων οδηγιών τις οποίες θα πρέπει να αποδεχθείτε προκειμένου να χρησιμοποιήσετε το σύστημα PlayStation®Vita σας και το "PSN"· + - δεν θα πρέπει να είναι προσβλητικό για άλλα άτομα· + - δεν θα πρέπει να είναι παράνομο·ή παραβατικό· + - θα πρέπει να είναι γνήσιο και να μην παραπλανά, εξαπατά ή εκμεταλλεύεται οποιονδήποτε, ούτε να αναπαριστά άλλα άτομα· + - δεν θα πρέπει να παραβιάζει τα δικαιώματα πνευματικής ιδιοκτησίας ή άλλα δικαιώματα τρίτων προσώπων· + - δεν θα πρέπει να είναι ρατσιστικό, σεξιστικό ή ομοφοβικό· + - δεν θα πρέπει να είναι εκφοβιστικό ή ερειστικό· + - δεν θα πρέπει να θίγει την υπόληψή μας ή την υπόληψη άλλων ατόμων· + - δεν θα πρέπει να περιλαμβάνει πορνογραφικό υλικό· + - δεν θα πρέπει να περιλαμβάνει διαφημιστικό υλικό· + - Δεν πρέπει να αναρτάτε μέσω του Minecraft περιεχόμενο που θίγει τα δικαιώματα άλλων ατόμων. + • Είστε υπεύθυνοι για το σύνολο του Περιεχομένου σας, το οποίο αναρτάτε εσείς μέσω του Minecraft. + • Αναρτώντας το Περιεχόμενό σας, εγγυάστε και μας δηλώνετε ότι έχετε κάθε δικαίωμα να το πράξετε δυνάμει των παρόντων Όρων και ότι εμείς δυνάμεθα να ασκήσουμε τα δικαιώματα που μας παραχωρήσατε βάσει των παρόντων Όρων. + • Αν λάβουμε οποιαδήποτε απειλή, αγωγή ή αμφισβήτηση από κάποιο τρίτο πρόσωπο λόγω του περιεχομένου που αναρτήσατε μέσω του Minecraft ή το οποίο αναρτήθηκε από οποιονδήποτε στο Minecraft ή μέσω αυτού, έχουμε το δικαίωμα να το καταργήσουμε και ενδεχομένως να θεωρηθείτε υπεύθυνοι και να σας ζητήσουμε αποζημίωση για οποιαδήποτε ζημία υποστήκαμε εξαιτίας του. Επίσης, η πρόσβασή σας σε ορισμένα στοιχεία του Minecraft μπορεί να καταργηθεί ή να ανασταλεί. + ΠΕΡΙΕΧΟΜΕΝΟ ΧΡΗΣΤΗ + Στην ενότητα αυτή παρατίθενται ορισμένοι όροι που αφορούν το Περιεχόμενό Σας και το περιεχόμενο που αναρτούν τρίτα πρόσωπα. Οι δύο αυτοί τύποι περιεχομένου αναφέρονται συνοπτικά ως «Περιεχόμενο Χρήστη». Το Minecraft είναι μια υπηρεσία ψυχαγωγίας και ως συνέπεια αυτού εμείς (και οι δικαιοδόχοι μας, όπως είναι η Sony Computer Entertainment) συμμετέχουμε στη μετάδοση, διανομή, αποθήκευση και ανάκτηση του Περιεχομένου Χρήστη χωρίς έλεγχο, διαλογή ή τροποποίησή του. Αυτό σημαίνει ότι δεν ελέγχουμε το Περιεχόμενο Χρήστη και επομένως δεν γνωρίζουμε τι κοινοποιείτε σε τρίτους. Οι κανόνες που αναφέρονται στους Όρους έχουν ως στόχο να εξασφαλίσουν τη συμμόρφωσή σας, ωστόσο δεν είμαστε σε θέση να γνωρίζουμε όλα όσα συμβαίνουν. + Επομένως, θα πρέπει να έχετε υπόψη τα εξής: + • οι απόψεις που εκφράζονται σε οποιοδήποτε Περιεχόμενο χρήστη εκφράζουν τις προσωπικές απόψεις του συγγραφέα ή του δημιουργού και όχι τις δικές μας ή οποιουδήποτε ατόμου σχετίζεται με εμάς, εκτός εάν ορίζεται διαφορετικά από εμάς· + • δεν φέρουμε ευθύνη για το Περιεχόμενο χρήστη (επίσης, δεν παρέχουμε καμία εγγύηση ή δήλωση σε σχέση με αυτό και αποποιούμαστε κάθε ευθύνη σχετικά με αυτό), συμπεριλαμβανομένων τυχόν σχολίων ή παρατηρήσεων που περιλαμβάνονται σε αυτό· + • χρησιμοποιώντας το Minecraft αναγνωρίζετε ότι δεν φέρουμε καμία ευθύνη να ελέγξουμε οποιοδήποτε Περιεχόμενο χρήστη και ότι κάθε Περιεχόμενο χρήστη αναρτάται χωρίς δική μας υποχρέωση και ευθύνη να το ελέγξουμε και να το κρίνουμε. + ΩΣΤΟΣΟ τόσο εμείς όσο και οι δικαιοδόχοι μας, όπως είναι η Sony Computer Entertainment μπορούμε να καταργήσουμε, απορρίψουμε ή αναστείλουμε την πρόσβαση σε Περιεχόμενο Χρήστη και να καταργήσουμε ή αναστείλουμε τη δυνατότητα ανάρτησης, διάθεσης ή πρόσβασης από εσάς σε Περιεχόμενο Χρήστη - συμπεριλαμβανομένης της κατάργησης ή της αναστολής πρόσβασης στο Minecraft ή το "PSN", αν θεωρήσουμε πρέπον να το πράξουμε, επειδή, π.χ. παραβιάσατε τους παρόντες Όρους ή επειδή λάβαμε μια καταγγελία για εσάς. Επίσης, θα ενεργήσουμε άμεσα για να καταργήσουμε ή να απενεργοποιήσουμε την πρόσβαση σε Περιεχόμενο Χρήστη εάν και όταν λάβουμε εμπεριστατωμένη πληροφόρηση ότι είναι παράνομο. + ΑΝΑΒΑΘΜΙΣΕΙΣ + • Περιστασιακά, ενδεχομένως να προβαίνουμε σε αναβαθμίσεις και ενημερώσεις, χωρίς όμως αυτό να είναι απαραίτητο. Επίσης, δεν υποχρεούμεθα να παρέχουμε συνεχή υποστήριξη ή συντήρηση για κανένα παιχνίδι. Φυσικά, ελπίζουμε να συνεχίσουμε να εκδίδουμε νέες ενημερώσεις για το Minecraft, απλώς δεν μπορούμε να σας εγγυηθούμε για αυτό. + Η ΕΥΘΥΝΗ ΜΑΣ + • Όταν λαμβάνετε ένα αντίγραφο του Minecraft, αυτό σας παρέχεται «ως έχει». Οι ενημερώσεις και οι αναβαθμίσεις επίσης παρέχονται «ως έχουν». Αυτό σημαίνει ότι δεν μπορούμε να σας εγγυηθούμε για την τυπική ή ποιοτική λειτουργία του Minecraft, ούτε ότι η λειτουργία του Minecraft θα είναι αδιάλειπτη και χωρίς προβλήματα, ούτε αναλαμβάνουμε την ευθύνη για τυχόν απώλεια ή ζημία που μπορεί να προκαλέσει η ενδεχόμενη προβληματική λειτουργία. Η μόνη υπόσχεση που σας δίνουμε είναι ότι το Minecraft και τυχόν συναφείς υπηρεσίες θα παρέχονται με την εύλογη επιδεξιότητα και φροντίδα. Στις περισσότερες χώρες, ο νόμος ορίζει ότι δεν μπορούμε να αποποιηθούμε την ευθύνη για τον θάνατο ή τραυματισμό κάποιου προσώπου, τα οποία οφείλονται σε δική μας αμέλεια, επομένως αν ο υπολογιστής σας θυμώσει και σας μαχαιρώσει για κάτι που κάναμε λάθος, τότε θα υποστούμε εμείς τις συνέπειες. + ΔΕΝ ΦΕΡΟΥΜΕ ΕΥΘΥΝΗ ΓΙΑ ΤΑ ΕΞΗΣ: + • ΧΡΗΣΗ Ή ΚΑΤΑΧΡΗΣΗ ΤΟΥ MINECRAFT ΑΠΟ ΕΣΑΣ Ή ΑΛΛΑ ΠΡΟΣΩΠΑ· + • ΤΥΧΟΝ ΠΕΡΙΕΧΟΜΕΝΟ ΠΟΥ ΑΝΑΡΤΗΣΑΤΕ ΜΕΣΩ ΤΟΥ MINECRAFT· + • ΤΥΧΟΝ ΠΑΡΑΒΙΑΣΗ ΤΩΝ ΠΑΡΟΝΤΩΝ ΟΡΩΝ ΑΠΟ ΕΣΑΣ· + • ΤΥΧΟΝ ΠΑΡΑΒΙΑΣΗ ΤΩΝ ΠΑΡΟΝΤΩΝ ΟΡΩΝ ΑΠΟ ΤΡΙΤΟΥΣ. + ΛΥΣΗ + • Αν θέλουμε, μπορούμε να καταργήσουμε το δικαίωμά σας να χρησιμοποιείτε το Minecraft, σε περίπτωση παραβίασης των παρόντων Όρων. Το ίδιο μπορείτε να κάνετε και εσείς, ανά πάσα στιγμή. Το μόνο που πρέπει να κάνετε είναι να απεγκαταστήσετε το Minecraft από το σύστημα PlayStation®Vita σας. Σε κάθε περίπτωση, τα άρθρα σχετικά με την «Ιδιοκτησία του Minecraft», «Η Ευθύνη Μας» και «Γενικές Διατάξεις» θα συνεχίσουν να ισχύουν ακόμα και μετά τη λύση της σύμβασης. + ΓΕΝΙΚΕΣ ΔΙΑΤΑΞΕΙΣ + • Οι παρόντες Όροι υπόκεινται σε κάθε νομικό δικαίωμα που έχετε. Κανένα στοιχείο στους παρόντες Όρους δεν περιορίζει οποιοδήποτε από τα δικαιώματά σας το οποίο δεν δύναται να εξαιρεθεί βάσει του νόμου ούτε εξαιρεί ή περιορίζει την ευθύνη μας σε περίπτωση θανάτου ή προσωπικού τραυματισμού που προκύπτει από δική μας αμέλεια ή δόλια εκπροσώπηση. + • Μπορούμε επίσης να αλλάζουμε περιστασιακά τους παρόντες Όρους, ωστόσο οι εν λόγω αλλαγές θα ισχύουν μόνο στο βαθμό που εφαρμόζονται νομίμως. Για παράδειγμα, αν χρησιμοποιείτε το Minecraft μόνο στη λειτουργία για έναν παίκτη και δεν χρησιμοποιείτε τις ενημερώσεις που αναρτούμε, τότε ισχύει η παλαιά Άδεια Χρήσης Τελικού Χρήστη (EULA), αλλά αν χρησιμοποιείτε τις ενημερώσεις ή μέρη του Minecraft που βασίζονται στην παροχή συνεχών διαδικτυακών υπηρεσιών, τότε ισχύει η νέα EULA. Σε αυτήν την περίπτωση ενδεχομένως να μην είμαστε σε θέση / να μην χρειάζεται να σας ενημερώσουμε για τις αλλαγές, προκειμένου αυτές να τεθούν σε εφαρμογή, επομένως θα πρέπει να ελέγχετε περιστασιακά για νέες ενημερώσεις και για τυχόν αλλαγές στους παρόντες Όρους. Δεν θέλουμε να αδικήσουμε κανέναν, ωστόσο μερικές φορές η νομοθεσία αλλάζει ή κάποιος κάνει κάτι που επηρεάζει και άλλους χρήστες του Minecraft και το οποίο πρέπει να σταματήσουμε. + • Αν μας στείλετε κάποια πρόταση σχετικά με το Minecraft ή κάποιο άλλο από τα παιχνίδια μας, η πρόταση αυτή παρέχεται δωρεάν. Αυτό σημαίνει ότι μπορούμε να τη χρησιμοποιήσουμε με όποιον τρόπο θέλουμε, χωρίς να σας αποζημιώσουμε για αυτήν. Αν πιστεύετε ότι έχετε κάποια πρόταση την οποία όμως δεν θέλετε να μας παράσχετε δωρεάν, θα πρέπει να μας ενημερώσετε για αυτό πριν μας την παραθέσετε. + • Πέραν των παρόντων Όρων, στο διαδίκτυο θα βρείτε επίσης και ορισμένες Οδηγίες σχετικά με τη χρήση της επωνυμίας και των περιουσιακών στοιχείων. + • Αν παραβείτε τους εν λόγω κανόνες, τόσο εμείς όσο και η Sony Computer Entertainment έχουμε το δικαίωμα να διακόψουμε τη χρήση του Minecraft από εσάς. Αν δεν θέλετε ή δεν μπορείτε να αποδεχθείτε τους κανόνες αυτούς, τότε δεν πρέπει να αγοράσετε, λάβετε από το διαδίκτυο ή παίξετε το Minecraft. + Αν έχετε αμφιβολίες για κάποιο νομικό ζήτημα το οποίο δεν αναλύεται στην παρούσα σελίδα, μην αποδεχθείτε τους Όρους και ζητήστε περαιτέρω διευκρινίσεις από εμάς. Στην ουσία, θα θέλαμε να δείξετε ωριμότητα κατά τη χρήση του παιχνιδιού, ώστε να μπορέσουμε και εμείς να αντεπεξέλθουμε με την ίδια ωριμότητα στα αιτήματά σας. + Ποιοι είμαστε: + Mojang AB + Maria Skolgata 83, + SE-11853 + Στοκχόλμη + Σουηδία + Αριθμός οργανισμού: 556819-2388 + + + + + Κάθε περιεχόμενο που αγοράζεται από κατάστημα εντός του παιχνιδιού θα αγοράζεται από την Sony Network Entertainment Europe Limited («SNEE») και θα υπόκειται στους Όρους Χρήσης και την Άδεια Χρήσης της Sony Entertainment Network Terms που διατίθενται στο PlayStation®Store. Ελέγξτε τα δικαιώματα χρήσης για κάθε αγορά, καθώς μπορεί να διαφέρουν ανάλογα με το εκάστοτε είδος. Εκτός εάν εμφανίζεται διαφορετικά, το περιεχόμενο που διατίθεται σε κάθε κατάστημα εντός του παιχνιδιού έχει τον ίδιο ηλικιακό χαρακτηρισμό με το παιχνίδι. + + + + + Η αγορά και χρήση ειδών υπόκεινται στους Όρους Χρήσης και την Άδεια Χρήσης του Network. Η παρούσα διαδικτυακή υπηρεσία έχει παραχωρηθεί σε εσάς από την Sony Computer Entertainment Αμερικής. + + + + Υπενθύμιση: Η χρήση αυτού του λογισμικού υπόκειται στους Όρους χρήσης λογισμικού που θα βρείτε στη διεύθυνση eu.playstation.com/legal. + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/el-EL/stringsDynafont.xml b/Minecraft.Client/PSVitaMedia/loc/el-EL/stringsDynafont.xml new file mode 100644 index 00000000..dca31ec2 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/el-EL/stringsDynafont.xml @@ -0,0 +1,7 @@ + + + + DynaFont developed by DynaComware. + + + \ 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 new file mode 100644 index 00000000..61ff1ac7 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/el-EL/stringsGeneric.xml @@ -0,0 +1,6966 @@ + + + + Μετάβαση στο παιχνίδι εκτός διαδικτύου + + + Περιμένετε έως ότου ο οικοδεσπότης αποθηκεύσει το παιχνίδι + + + Είσοδος στο END + + + Αποθήκευση παικτών + + + Σύνδεση με τον οικοδεσπότη + + + Λήψη πεδίου + + + Έξοδος από το END + + + Το κρεβάτι στο σπίτι σας έλειπε ή κάτι εμπόδιζε την πρόσβαση σε αυτό + + + Δεν μπορείτε να ξεκουραστείτε αυτή τη στιγμή, τριγυρίζουν τέρατα + + + Κοιμάστε σε κρεβάτι. Για να μεταβείτε στο ξημέρωμα, όλοι οι παίκτες πρέπει να κοιμηθούν σε κρεβάτι την ίδια στιγμή. + + + Αυτό το κρεβάτι είναι κατειλημμένο + + + Μόνο τη νύχτα μπορείτε να κοιμηθείτε + + + Ο/Η %s κοιμάται σε κρεβάτι. Για να μεταβείτε στο ξημέρωμα, όλοι οι παίκτες πρέπει να κοιμηθούν σε κρεβάτι την ίδια στιγμή. + + + Φόρτωση επιπέδου + + + Ολοκλήρωση... + + + Κατασκευή Πεδίου + + + Προσομοίωση κόσμου για λίγο + + + Κατάταξη + + + Προετοιμασία Αποθήκευσης Επιπέδου + + + Προετοιμασία Κομματιών... + + + Προετοιμασία διακομιστή + + + Έξοδος από το Nether + + + Επαναγένεση + + + Δημιουργία επιπέδου + + + Δημιουργία περιοχής γέννησης + + + Φόρτωση περιοχής spawn + + + Είσοδος στο Nether + + + Εργαλεία και Όπλα + + + Γάμμα + + + Ευαισθησία Παιχνιδιού + + + Ευαισθησία Περιβάλλοντος Χρήστη + + + Δυσκολία + + + Μουσική + + + Ήχος + + + Γαλήνιο + + + Σε αυτή τη λειτουργία, ο παίκτης ανακτά την υγεία του με την πάροδο του χρόνου και δεν υπάρχουν εχθροί στο περιβάλλον. + + + Σε αυτή τη λειτουργία, εχθροί εμφανίζονται στο περιβάλλον, αλλά προκαλούν μικρότερες βλάβες στον παίκτη σε σχέση με τη λειτουργία Κανονικό. + + + Σε αυτή τη λειτουργία, εχθροί εμφανίζονται στο περιβάλλον και προκαλούν τυπικές βλάβες στον παίκτη. + + + Εύκολο + + + Κανονικό + + + Δύσκολο + + + Αποσυνδέθηκε + + + Πανοπλία + + + Μηχανισμοί + + + Μεταφορά + + + Όπλα + + + Τροφή + + + Οικοδομήματα + + + Διακοσμητικά + + + Παρασκευή Φίλτρου + + + Εργαλεία, Όπλα και Πανοπλία + + + Υλικά + + + Κύβοι για Κατασκευές + + + Κοκκινόπετρα και Μεταφορά + + + Διάφορα + + + Συμμετοχές: + + + Χωρίς αποθήκευση + + + Είστε σίγουροι ότι θέλετε να βγείτε στο βασικό μενού; Τυχόν μη αποθηκευμένη πρόοδος θα χαθεί. + + + Είστε σίγουροι ότι θέλετε να βγείτε στο βασικό μενού; Η πρόοδός σας θα χαθεί! + + + Αυτά τα δεδομένα αποθήκευσης είναι κατεστραμμένα ή έχουν υποστεί βλάβη. Θα θέλατε να τα διαγράψετε; + + + Είστε σίγουροι ότι θέλετε να βγείτε στο βασικό μενού και να αποσυνδέσετε όλους τους παίκτες από το παιχνίδι; Τυχόν μη αποθηκευμένη πρόοδος θα χαθεί. + + + Με αποθήκευση + + + Δημιουργία Νέου Κόσμου + + + Εισαγάγετε ένα όνομα για τον κόσμο σας + + + Βάλτε τον seed για τη γενιά του κόσμου σας + + + Φόρτωση Αποθηκευμένου Κόσμου + + + Αρχή Εκπαιδευτικού Μαθήματος + + + Εκπαιδευτικό Μάθημα + + + Ονομασία του Κόσμου σας + + + Βλάβη Δεδομένων Αποθήκευσης + + + OK + + + Ακύρωση + + + Minecraft Store + + + Περιστροφή + + + Απόκρυψη + + + Απαλοιφή Όλων των Υποδοχών + + + Είστε σίγουροι ότι θέλετε να εγκαταλείψετε το τρέχον παιχνίδι σας και να συμμετάσχετε στο νέο; Τυχόν μη αποθηκευμένη πρόοδος θα χαθεί. + + + Είστε σίγουροι ότι θέλετε να αντικαταστήσετε τυχόν προηγούμενα αποθηκευμένα δεδομένα αυτού του κόσμου με την τρέχουσα εκδοχή αυτού του κόσμου; + + + Είστε σίγουροι ότι θέλετε να βγείτε από το παιχνίδι χωρίς να το αποθηκεύσετε; Θα χάσετε όλη την πρόοδο που έχετε σημειώσει σε αυτόν τον κόσμο! + + + Έναρξη Παιχνιδιού + + + Έξοδος + + + Αποθήκευση + + + Έξοδος Χωρίς Αποθήκευση + + + START για να παίξετε + + + Ζήτω – κερδίσατε μια εικόνα παίκτη "PSN" του Steve από το Minecraft! + + + Ζήτω – κερδίσατε μια εικόνα παίκτη "PSN" ενός Creeper! + + + Ξεκλείδωμα Πλήρους Παιχνιδιού + + + Δεν μπορείτε να συμμετάσχετε σε αυτό το παιχνίδι, γιατί ο παίκτης στο παιχνίδι του οποίου προσπαθείτε να συμμετάσχετε παίζει νεότερη έκδοση του παιχνιδιού. + + + Νέος Κόσμος + + + Το Βραβείο Ξεκλειδώθηκε! + + + Παίζετε τη δοκιμαστική έκδοση του παιχνιδιού, αλλά θα χρειαστείτε το πλήρες παιχνίδι για να μπορέσετε να αποθηκεύσετε την πρόοδό σας. +Θέλετε να ξεκλειδώσετε τώρα το πλήρες παιχνίδι; + + + Φίλοι + + + Η Βαθμολογία μου + + + Συνολική + + + Παρακαλώ περιμένετε + + + Δεν βρέθηκαν αποτελέσματα + + + Φίλτρο: + + + Δεν μπορείτε να συμμετάσχετε σε αυτό το παιχνίδι, γιατί ο παίκτης στο παιχνίδι του οποίου προσπαθείτε να συμμετάσχετε παίζει παλαιότερη έκδοση του παιχνιδιού. + + + Η σύνδεση χάθηκε + + + Η σύνδεση με τον διακομιστή χάθηκε. Μετάβαση στο βασικό μενού. + + + Αποσύνδεση από τον διακομιστή + + + Έξοδος από το παιχνίδι + + + Προέκυψε σφάλμα. Μετάβαση στο βασικό μενού. + + + Η σύνδεση απέτυχε + + + Αποβληθήκατε από το παιχνίδι + + + Ο οικοδεσπότης έχει βγει από το παιχνίδι. + + + Δεν μπορείτε να συμμετάσχετε σε αυτό το παιχνίδι, γιατί δεν είστε φίλος με κανέναν από τους συμμετέχοντες. + + + Δεν μπορείτε να συμμετάσχετε σε αυτό το παιχνίδι, γιατί ο οικοδεσπότης σας έχει αποβάλει από το παιχνίδι στο παρελθόν. + + + Αποβληθήκατε από το παιχνίδι γιατί πετούσατε + + + Η προσπάθεια σύνδεσης είχε υπερβολικά μεγάλη διάρκεια + + + Ο διακομιστής είναι πλήρης + + + Σε αυτή τη λειτουργία, εχθροί εμφανίζονται στο περιβάλλον και προκαλούν σοβαρές βλάβες στον παίκτη. Προσέξτε τα Creepers, γιατί δύσκολα θα «ξεχάσουν» την εκρηκτική επίθεση, ακόμα και αφού απομακρυνθείτε! + + + Θέματα + + + Πακέτα Skin + + + Να επιτρέπονται οι φίλοι φίλων + + + Αποβολή παίκτη + + + Είστε σίγουροι ότι θέλετε να αποβάλετε αυτόν τον παίκτη από το παιχνίδι; Δεν θα μπορέσει να συμμετάσχει ξανά έως ότου κάνετε επανεκκίνηση του κόσμου. + + + Πακέτα Εικόνων Παικτών + + + Δεν μπορείτε να συμμετάσχετε σε αυτό το παιχνίδι, γιατί η πρόσβαση σε αυτό επιτρέπεται σε παίκτες που είναι φίλοι του οικοδεσπότη. + + + Κατεστραμμένο Περιεχόμενο με Δυνατότητα Λήψης + + + Αυτό το περιεχόμενο με δυνατότητα λήψης είναι κατεστραμμένο και δεν είναι δυνατή η χρήση του. Πρέπει να το διαγράψετε και να το επανεγκαταστήσετε από το μενού του Minecraft Store. + + + Μέρος του περιεχομένου με δυνατότητα λήψης που διαθέτετε είναι κατεστραμμένο και δεν είναι δυνατή η χρήση του. Πρέπει να το διαγράψετε και να το επανεγκαταστήσετε από το μενού του Minecraft Store. + + + Δεν Μπορείτε να Συμμετάσχετε στο Παιχνίδι + + + Επιλεγμένο + + + Επιλεγμένη skin: + + + Απόκτηση Πλήρους Έκδοσης + + + Ξεκλείδωμα Πακέτου με Υφές + + + Για να χρησιμοποιήσετε αυτό το πακέτο με υφές στον κόσμο σας, πρέπει να το ξεκλειδώσετε. +Θέλετε να το ξεκλειδώσετε τώρα; + + + Δοκιμαστικό Πακέτο με Υφές + + + Seed + + + Ξεκλείδωμα Πακέτου Skin + + + Για να χρησιμοποιήσετε την εμφάνιση που έχετε επιλέξει, πρέπει να ξεκλειδώσετε αυτό το πακέτο skin. +Θέλετε να ξεκλειδώσετε το πακέτο skin τώρα; + + + Χρησιμοποιείτε μια δοκιμαστική έκδοση του πακέτου με υφές. Δεν θα μπορέσετε να αποθηκεύσετε αυτόν τον κόσμο αν δεν ξεκλειδώσετε την πλήρη έκδοση. +Θέλετε να ξεκλειδώσετε την πλήρη έκδοση του πακέτου με υφές; + + + Λήψη Πλήρους Έκδοσης + + + Αυτός ο κόσμος χρησιμοποιεί ένα μικτό πακέτο ή ένα πακέτο με υφές που δεν διαθέτετε! +Θέλετε να εγκαταστήσετε το μικτό πακέτο ή το πακέτο με υφές τώρα; + + + Απόκτηση Δοκιμαστικής Έκδοσης + + + Το Πακέτο με Υφές δεν Βρίσκεται Εδώ + + + Ξεκλείδωμα Πλήρους Έκδοσης + + + Λήψη Δοκιμαστικής Έκδοσης + + + Η λειτουργία παιχνιδιού έχει αλλάξει + + + Όταν είναι ενεργοποιημένο, μόνο παίκτες που έχουν προσκληθεί θα μπορούν να συμμετάσχουν. + + + Όταν είναι ενεργοποιημένο, φίλοι όσων βρίσκονται στη Λίστα Φίλων σας θα μπορούν να συμμετάσχουν στο παιχνίδι. + + + Όταν είναι ενεργοποιημένο, οι παίκτες θα μπορούν να προκαλέσουν βλάβες σε άλλους παίκτες. Επηρεάζει μόνο τη λειτουργία Επιβίωση. + + + Κανονικό + + + Εντελώς Επίπεδο + + + Όταν είναι ενεργοποιημένο, το παιχνίδι θα είναι διαδικτυακό. + + + Όταν είναι απενεργοποιημένο, οι παίκτες που συμμετέχουν στο παιχνίδι δεν μπορούν να κάνουν κατασκευές ή εξόρυξη έως ότου λάβουν άδεια. + + + Όταν είναι ενεργοποιημένο, οικοδομήματα όπως Χωριά και Οχυρά θα δημιουργηθούν στον κόσμο. + + + Όταν είναι ενεργοποιημένο, θα δημιουργηθεί ένας εντελώς επίπεδος κόσμος στο Overworld και στο Nether. + + + Όταν είναι ενεργοποιημένο, θα δημιουργηθεί ένα σεντούκι που θα περιέχει ορισμένα χρήσιμα αντικείμενα κοντά στο σημείο που θα κάνει spawn ο παίκτης. + + + Όταν είναι ενεργοποιημένο, η φωτιά μπορεί να επεκταθεί σε κοντινούς εύφλεκτους κύβους. + + + Όταν είναι ενεργοποιημένο, το ΤΝΤ θα ανατιναχθεί όταν πυροδοτηθεί. + + + Όταν είναι ενεργοποιημένο, ο κόσμος Nether θα αναδημιουργηθεί. Αυτό είναι χρήσιμο εάν έχετε αποθηκεύσει παλαιότερο παιχνίδι όταν δεν υπήρχαν Κάστρα Nether. + + + Ανενεργό + + + Λειτουργία Παιχνιδιού: Δημιουργία + + + Επιβίωση + + + Δημιουργία + + + Μετονομασία του Κόσμου σας + + + Εισαγάγετε το νέο όνομα για τον κόσμο σας + + + Λειτουργία Παιχνιδιού: Επιβίωση + + + Δημιουργήθηκε στην «Επιβίωση» + + + Μετονομασία Αποθήκευσης + + + Αυτόματη Αποθήκευση σε %d... + + + Ενεργό + + + Δημιουργήθηκε στη «Δημιουργία» + + + Αναπαράσταση Σύννεφων + + + Τι θέλετε να κάνετε με αυτό το αποθηκευμένο παιχνίδι; + + + Μέγεθος HUD (Διαχωρισμός Οθόνης) + + + Συστατικό + + + Καύσιμο + + + Διανομέας + + + Σεντούκι + + + Μαγεία + + + Φούρνος + + + Δεν υπάρχουν προσφορές για περιεχόμενο με δυνατότητα λήψης αυτού του τύπου για τον συγκεκριμένο τίτλο αυτή τη στιγμή. + + + Είστε σίγουροι ότι θέλετε να διαγράψετε αυτό το αποθηκευμένο παιχνίδι; + + + Αναμονή έγκρισης + + + Λογοκριμένο + + + Ο/Η %s συμμετέχει στο παιχνίδι. + + + Ο/Η %s εγκατέλειψε το παιχνίδι. + + + Ο/Η %s αποβλήθηκε από το παιχνίδι. + + + Βάση Παρασκευής Φίλτρων + + + Εισαγωγή Κειμένου Πινακίδας + + + Εισαγάγετε ένα κείμενο για την πινακίδα σας + + + Εισαγωγή Τίτλου + + + Χρονικό Όριο Δοκιμαστικής Έκδοσης + + + Το παιχνίδι είναι πλήρες + + + Δεν ολοκληρώθηκε η συμμετοχή στο παιχνίδι, καθώς δεν υπάρχουν άλλες διαθέσιμες θέσεις + + + Εισαγάγετε έναν τίτλο για τη δημοσίευσή σας + + + Εισαγάγετε μια περιγραφή για τη δημοσίευσή σας + + + Απόθεμα + + + Συστατικά + + + Εισαγωγή Λεζάντας + + + Εισαγάγετε μια λεζάντα για τη δημοσίευσή σας + + + Εισαγωγή Περιγραφής + + + Παίζει τώρα: + + + + Είστε σίγουροι ότι θέλετε να προσθέσετε αυτό το επίπεδο στη λίστα σας με αποκλεισμένα επίπεδα; +Εάν επιλέξετε OK θα βγείτε και από το παιχνίδι. + + + Αφαίρεση από τη Λίστα Αποκλεισμένων + + + Διάστημα Αυτόματης Αποθήκευσης + + + Αποκλεισμένο Επίπεδο + + + Το παιχνίδι στο οποίο θα συμμετάσχετε βρίσκεται στη λίστα σας με αποκλεισμένα επίπεδα. +Εάν επιλέξετε να συμμετάσχετε στο παιχνίδι, το επίπεδο θα αφαιρεθεί από τη λίστα σας με αποκλεισμένα επίπεδα. + + + Αποκλεισμός Αυτού του Επιπέδου; + + + Διάστημα Αυτόματης Αποθήκευσης: ΑΠΕΝΕΡΓΟΠΟΙΗΜΕΝΟ + + + Αδιαφάνεια Περιβάλλοντος Χρήστη + + + Προετοιμασία Αυτόματης Αποθήκευσης Επιπέδου + + + Μέγεθος HUD + + + Λεπτά + + + Δεν Μπορείτε να την Τοποθετήσετε Εδώ! + + + Η τοποθέτηση λάβας κοντά στο σημείο spawn επιπέδου δεν επιτρέπεται, λόγω πιθανότητας άμεσου θανάτου των παικτών που κάνουν spawn. + + + Αγαπημένα Skin + + + Παιχνίδι του/της %s + + + Παιχνίδι άγνωστου οικοδεσπότη + + + Ο προσκεκλημένος παίκτης αποσυνδέθηκε + + + Επαναφορά + + + Είστε σίγουροι ότι θέλετε να επαναφέρετε τις ρυθμίσεις σας στις προεπιλεγμένες τιμές; + + + Σφάλμα Φόρτωσης + + + Ένας προσκεκλημένος παίκτης αποσυνδέθηκε, προκαλώντας την απομάκρυνση όλων των προσκεκλημένων παικτών από το παιχνίδι. + + + Αποτυχία δημιουργίας παιχνιδιού + + + Αυτόματη Επιλογή + + + Προεπιλεγμένα Skin + + + Σύνδεση + + + Δεν έχετε συνδεθεί. Για να παίξετε αυτό το παιχνίδι, θα πρέπει να συνδεθείτε. Θέλετε να συνδεθείτε τώρα; + + + Δεν επιτρέπεται το παιχνίδι για πολλούς παίκτες + + + Ποτό + + + + Σε αυτήν την περιοχή, έχει στηθεί μια φάρμα. Οι γεωργικές ασχολίες σάς δίνουν τη δυνατότητα να δημιουργείτε ανανεώσιμες πηγές τροφών και άλλα αντικείμενα. + + + + + {*B*}
 Πατήστε{*CONTROLLER_VK_A*} για να μάθετε περισσότερα σχετικά με τις γεωργικές ασχολίες.{*B*}
 Πατήστε{*CONTROLLER_VK_B*}, εάν είστε ήδη εξοικειωμένοι με τις γεωργικές ασχολίες. + + + + Το Σιτάρι, οι Κολοκύθες και τα Καρπούζια καλλιεργούνται φυτεύοντας σπόρους. Η συλλογή των σπόρων σιταριού γίνεται κόβοντας Ψηλό Γρασίδι ή θερίζοντας σιτάρι, ενώ οι Σπόροι Κολοκύθας και Καρπουζιού δημιουργούνται από Κολοκύθες και Καρπούζια αντίστοιχα. + + + Πατήστε{*CONTROLLER_ACTION_CRAFTING*} για να ανοίξετε το περιβάλλον χρήστη αποθέματος δημιουργίας. + + + Για να συνεχίσετε, πρέπει να φτάσετε στην αντίθετη πλευρά αυτής της τρύπας. + + + Έχετε ολοκληρώσει τον εκπαιδευτικό οδηγό για τη λειτουργία Δημιουργίας. + + + Πριν από τη φύτευση των σπόρων, θα πρέπει να μετατραπούν οι κύβοι χώματος σε Αγρόκτημα με τη βοήθεια ενός Σκαλιστηριού. Μια κοντινή πηγή νερού θα συμβάλλει στο καλό πότισμα του Αγροκτήματος και τη γρήγορη ανάπτυξη της σοδειάς, όπως επίσης και η διασφάλιση φωτός για την περιοχή. + + + Οι Κάκτοι πρέπει να φυτεύονται στην Άμμο και μεγαλώνοντας το ύψος του μπορεί να φτάσει έως και τρεις κύβους. Όπως συμβαίνει με τα Ζαχαροκάλαμα, εάν καταστρέψετε τον χαμηλότερο κύβο, θα μπορείτε να συλλέξετε τους κύβους από επάνω του.{*ICON*}81{*/ICON*} + + + Τα Μανιτάρια πρέπει να φυτεύονται σε περιοχή με λίγο φως. Εξαπλώνονται στις κοντινές, φτωχά φωτισμένες περιοχές.{*ICON*}39{*/ICON*} + + + Η Πάστα Οστών μπορεί να χρησιμοποιηθεί για την πλήρη ανάπτυξη των σοδειών ή για την καλλιέργεια Μανιταριών ώστε να γίνουν Τεράστια Μανιτάρια.{*ICON*}351:15{*/ICON*} + + + Το Σιτάρι περνάει από αρκετά στάδια κατά την ανάπτυξή του και είναι έτοιμο για συγκομιδή όταν είναι πιο σκούρο.{*ICON*}59:7{*/ICON*} + + + Για τις Κολοκύθες και τα Καρπούζια, θα πρέπει να υπάρχει ένας κύβος δίπλα από το σημείο που φυτέψατε το σπόρο για να μπορέσει να μεγαλώσει το φρούτο, όταν μεγαλώσει το κοτσάνι. + + + Τα Ζαχαροκάλαμα πρέπει να φυτεύονται σε κύβους Γρασιδιού, Χώματος ή Άμμου που βρίσκονται ακριβώς δίπλα σε κύβους νερού. Εάν κόψετε έναν κύβο Ζαχαροκάλαμου, θα πέσουν όλοι οι κύβοι που βρίσκονται από επάνω του.{*ICON*}83{*/ICON*} + + + Όταν βρίσκεστε σε λειτουργία Δημιουργίας, έχετε απεριόριστο αριθμό διαθέσιμων αντικειμένων και κύβους, μπορείτε να καταστρέφετε κύβους με ένα κλικ χωρίς εργαλεία, είστε άτρωτοι και μπορείτε να πετάτε. + + + + Στο σεντούκι αυτής της περιοχής, υπάρχουν ορισμένα εξαρτήματα για τη δημιουργία κυκλωμάτων με έμβολα. Δοκιμάστε να χρησιμοποιήσετε ή να ολοκληρώσετε τα κυκλώματα σε αυτήν την περιοχή ή να δημιουργήσετε τα δικά σας. Υπάρχουν περισσότερα παραδείγματα εκτός της περιοχής εκπαίδευσης. + + + + + Σε αυτήν την περιοχή, υπάρχει μια Πύλη για τον κόσμο του Nether! + + + + + {*B*}
 Πατήστε{*CONTROLLER_VK_A*} για να μάθετε περισσότερα σχετικά με τις Πύλες και το Nether.{*B*}
 Πατήστε{*CONTROLLER_VK_B*}, εάν είστε ήδη εξοικειωμένοι με τις Πύλες και το Nether. + + + + + Μπορείτε να συλλέγετε σκόνη Κοκκινόπετρας εξορύσσοντας κομμάτια κοκκινόπετρας με τη βοήθεια μιας Σιδερένιας, Αδαμάντινης ή Χρυσής αξίνας. Μπορείτε να τη χρησιμοποιείτε για την τροφοδοσία έως 15 κύβων και μπορεί να μετακινηθεί ένας κύβος προς τα επάνω ή προς τα κάτω σε ύψος. + {*ICON*}331{*/ICON*} + + + + + Οι αναμεταδότες Κοκκινόπετρας μπορούν να χρησιμοποιηθούν για την επέκταση της απόστασης στην οποία μεταδίδεται το ρεύμα ή για τη δημιουργία καθυστέρησης σε ένα κύκλωμα. + {*ICON*}356{*/ICON*} + + + + + Όταν τροφοδοτείται ένα Έμβολο, εκτείνεται σπρώχνοντας έως 12 κύβους. Όταν μαζεύονται, τα Έμβολα με Κόλλα μπορούν να τραβήξουν μαζί τους έναν κύβο από τα περισσότερα διαθέσιμα είδη. + {*ICON*}33{*/ICON*} + + + + + Οι Πύλες δημιουργούνται τοποθετώντας κύβους Οψιανού σε ένα πλαίσιο πλάτους τεσσάρων κύβων και ύψους πέντε κύβων. Οι γωνιακοί κύβοι δεν είναι υποχρεωτικοί. + + + + + Ο κόσμος του Nether μπορεί να χρησιμοποιηθεί για να ταξιδεύετε γρήγορα στον Overworld - εάν διανύσετε απόσταση ενός κύβου στο Nether, αυτό ισοδυναμεί με 3 κύβους στον Overworld. + + + + + Τώρα βρίσκεστε στη λειτουργία Δημιουργίας. + + + + + {*B*}
 Πατήστε{*CONTROLLER_VK_A*} για να μάθετε περισσότερα σχετικά με τη λειτουργία Δημιουργίας.{*B*}
 Πατήστε{*CONTROLLER_VK_B*}, εάν είστε ήδη εξοικειωμένοι με τη λειτουργία Δημιουργίας. + + + + + Για να ενεργοποιήσετε μια Πύλη για το Nether, βάλτε φωτιά στους κύβους Οψιανού μέσα στο πλαίσιο χρησιμοποιώντας έναν Πυρόλιθο και Χάλυβα. Οι Πύλες μπορούν να απενεργοποιηθούν εάν χαλάσει το πλαίσιο, εάν προκύψει κάποια έκρηξη σε κοντινό μέρος ή περάσει κάποιο υγρό από μέσα τους. + + + + + Για να χρησιμοποιήσετε μια Πύλη για το Nether, μπείτε μέσα της. Η οθόνη σας θα γίνει μωβ και θα ακουστεί ένας ήχος. Μετά από μερικά δευτερόλεπτα, θα μεταφερθείτε σε μια άλλη διάσταση. + + + + + Το Nether είναι ένα μέρος γεμάτο κινδύνους και πολλή λάβα, αλλά μπορεί να σας φανεί χρήσιμο να συλλέξετε το Netherrack, το οποίο αν το ανάψετε μπορεί να καίει για πάντα, καθώς και για τη Λαμψόπετρας, που παράγει φως. + + + + Έχετε ολοκληρώσει τον εκπαιδευτικό οδηγό για τις γεωργικές ασχολίες. + + + Κάποια εργαλεία είναι προτιμότερα για ορισμένα υλικά. Χρησιμοποιείτε ένα τσεκούρι για να κόψετε κορμούς δέντρων. + + + Κάποια εργαλεία είναι προτιμότερα για ορισμένα υλικά. Χρησιμοποιείτε μια αξίνα για να εξορύσσετε πέτρες και μεταλλεύματα. Μπορεί να χρειαστεί να φτιάξετε την αξίνα από καλύτερα υλικά για να εξάγετε πόρους από ορισμένους κύβους. + + + Ορισμένα εργαλεία είναι καλύτερα για επίθεση κατά των εχθρών. Συνιστάται η χρήση σπαθιού για τις επιθέσεις σας. + + + Τα Σιδερένια Γκόλεμ επίσης εμφανίζονται φυσικά για να προστατεύουν χωριά και σε περίπτωση που επιτεθείτε στους χωρικούς, θα αντεπιτεθούν. + + + Δεν μπορείτε να φύγετε από αυτήν την περιοχή μέχρι να ολοκληρώσετε τον εκπαιδευτικό οδηγό. + + + Κάποια εργαλεία είναι προτιμότερα για ορισμένα υλικά. Χρησιμοποιείτε ένα φτυάρι για να εξορύσσετε μαλακά υλικά, όπως χώμα και άμμο. + + + Συμβουλή: Πατήστε παρατεταμένα {*CONTROLLER_ACTION_ACTION*}για να εξορύξετε και να κόψετε χρησιμοποιώντας το χέρι σας ή οτιδήποτε κρατάτε. Μπορεί να χρειαστεί να κατασκευάσετε ένα εργαλείο για την εξόρυξη ορισμένων κύβων... + + + Στο σεντούκι δίπλα στο ποτάμι, υπάρχει μια βάρκα. Για να χρησιμοποιήσετε τη βάρκα, τοποθετήστε το δείκτη επάνω της και πατήστε{*CONTROLLER_ACTION_USE*}. Χρησιμοποιήστε{*CONTROLLER_ACTION_USE*} με το δείκτη επάνω στη βάρκα για να ανεβείτε επάνω. + + + Στο σεντούκι δίπλα στη λίμνη, υπάρχει ένα καλάμι ψαρέματος. Πάρτε το καλάμι από το σεντούκι και επιλέξτε το ως το τρέχον αντικείμενο στο χέρι σας για να το χρησιμοποιήσετε. + + + Αυτός ο πιο προηγμένος μηχανισμός εμβόλου δημιουργεί μια αυτοεπισκευαζόμενη γέφυρα! Πατήστε το κουμπί για να ενεργοποιηθεί και έπειτα παρακολουθήστε πώς αλληλεπιδρούν τα εξαρτήματα για να μάθετε περισσότερα. + + + Το εργαλείο που χρησιμοποιείτε έχει καταστραφεί. Κάθε φορά που χρησιμοποιείτε ένα εργαλείο, αυτό καταστρέφεται σιγά σιγά και στο τέλος διαλύεται. Η χρωματιστή μπάρα κάτω από το αντικείμενο στο απόθεμά σας δείχνει την τρέχουσα κατάσταση ζημιάς. + + + Πατήστε παρατεταμένα{*CONTROLLER_ACTION_JUMP*} για να κολυμπήσετε προς τα επάνω. + + + Σε αυτήν την περιοχή, υπάρχει ένα βαγόνι ορυχείου σε μια πλατφόρμα. Για να μπείτε στο βαγόνι, τοποθετήστε το δείκτη επάνω του και πατήστε{*CONTROLLER_ACTION_USE*}. Χρησιμοποιήστε{*CONTROLLER_ACTION_USE*} στο κουμπί για να μετακινήσετε το βαγόνι. + + + Τα Σιδερένια Γκόλεμ δημιουργούνται με τέσσερις Σιδερένιους Κύβους στο προβαλλόμενο μοτίβο, με μια κολοκύθα επάνω στον μεσαίο κύβο. Τα Σιδερένια Γκόλεμ επιτίθενται στους εχθρούς σας. + + + Δώστε Σιτάρι στις αγελάδες, τα mooshroom ή τα πρόβατα, Καρότα στα γουρούνια, Σπόρους Σιταριού ή Φυτά Nether στις κότες ή οποιοδήποτε είδος κρέατος στους λύκους και θα αρχίσουν να αναζητούν κάποιο άλλο ζώο ίδιου είδους που να υπάρχει κοντά τους το οποίο βρίσκεται επίσης σε Λειτουργία Αγάπης. + + + Όταν συναντιούνται δύο ζώα ίδιου είδους και βρίσκονται και τα δύο σε "Λειτουργία Αγάπης", θα φιληθούν για λίγα δευτερόλεπτα και στη συνέχεια θα εμφανιστεί το μωρό τους. Το μικρό ζωάκι θα ακολουθεί τους γονείς του για λίγο μέχρι να μεγαλώσει και να γίνει και το ίδιο μεγάλο ζώο. + + + Αφού βρεθεί σε Λειτουργία Αγάπης, το ζώο δεν θα μπορεί να εισέλθει ξανά σε αυτή την κατάσταση για περίπου πέντε λεπτά. + + + + Σε αυτήν την περιοχή, είναι συγκεντρωμένα ζώα. Μπορείτε να εκθρέψετε ζώα με σκοπό να αναπαραχθούν. + + + + + {*B*}
 Πατήστε{*CONTROLLER_VK_A*} για να μάθετε περισσότερα σχετικά με τα ζώα και τη ζωική αναπαραγωγή.{*B*}
 Πατήστε{*CONTROLLER_VK_B*}, εάν είστε ήδη εξοικειωμένοι με τα ζώα και τη ζωική αναπαραγωγή. + + + + Για να αναπαραχθούν τα ζώα, θα πρέπει να τα ταΐζετε με την κατάλληλη τροφή για να ενεργοποιηθεί η "Λειτουργία Αγάπης". + + + Ορισμένα ζώα θα σας ακολουθήσουν, εάν έχετε την αγαπημένη τους τροφή στο χέρι σας. Αυτό κάνει εύκολη τη συγκέντρωση των ζώων σε ένα μέρος για να αναπαραχθούν.{*ICON*}296{*/ICON*} + + + + {*B*}
 Πατήστε{*CONTROLLER_VK_A*} για να μάθετε περισσότερα σχετικά με τα Γκόλεμ.{*B*}
 Πατήστε{*CONTROLLER_VK_B*}, εάν είστε ήδη εξοικειωμένοι με τα Γκόλεμ. + + + + Τα Γκόλεμ δημιουργούνται με την τοποθέτηση μιας κολοκύθας επάνω σε μια στοίβα κύβων. + + + Τα Γκόλεμ του Χιονιού δημιουργούνται με δύο Κύβους Χιονιού, ο ένας επάνω στον άλλο, με μια κολοκύθα στην κορυφή. Τα Γκόλεμ του Χιονιού πετάνε χιονόμπαλες στους εχθρούς σας. + + + + Μπορείτε να εξημερώσετε τους άγριους λύκους δίνοντάς τους κόκαλα. Μόλις εξημερωθούν, εμφανίζονται Καρδιές Αγάπης τριγύρω τους. Οι εξημερωμένοι λύκοι ακολουθούν τον παίκτη και τον υπερασπίζονται, εάν δεν τους έχει δοθεί εντολή να κάτσουν κάτω. + + + + Έχετε ολοκληρώσει τον εκπαιδευτικό οδηγό για τα ζώα και την αναπαραγωγή τους. + + + + Σε αυτήν την περιοχή, υπάρχουν ορισμένες κολοκύθες και κύβοι για να δημιουργήσετε ένα Γκόλεμ του Χιονιού και ένα Σιδερένιο Γκόλεμ. + + + + + Η θέση και η κατεύθυνση στην οποία τοποθετείτε μια πηγή τροφοδοσίας μπορεί να αλλάξει τον τρόπο που επηρεάζει τους γύρω κύβους. Για παράδειγμα, μπορεί να σβηστεί ένας πυρσός Κοκκινόπετρας δίπλα σε έναν κύβο, εάν ο κύβος τροφοδοτείται από κάποια άλλη πηγή. + + + + + Εάν αδειάσει ένα καζάνι, μπορείτε να το γεμίσετε ξανά με έναν Κουβά Νερό. + + + + + Χρησιμοποιήστε τη Βάση Παρασκευής για να δημιουργήσετε ένα Φίλτρο Πυραντίστασης. Θα χρειαστείτε ένα Μπουκάλι Νερού, Φυτό Nether και Κρέμα Μάγματος. + + + + + Κρατώντας ένα φίλτρο στο χέρι σας, πατήστε παρατεταμένα{*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*}, εάν γνωρίζετε ήδη πώς να χρησιμοποιείτε τη βάση παρασκευής φίλτρων. + + + + + Με την προσθήκη Ζυμωμένου Ματιού Αράχνης, χαλάει η σύσταση του φίλτρου, το οποίο μπορεί να γίνει φίλτρο με αντίθετες ιδιότητες, ενώ με την προσθήκη Πυρίτιδας, το φίλτρο γίνεται Φίλτρο Εκτόξευσης, το οποίο μπορεί να πεταχθεί για να εφαρμοστούν οι ιδιότητές του σε μια κοντινή περιοχή. + + + + + Δημιουργήστε ένα Φίλτρο Πυραντίστασης προσθέτοντας πρώτα το Φυτό 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 + + + Ανάφλεξη + + + Πρόσκληση Φίλων + + + Αποδοχή + + + Ψαλίδι + + + Περιήγηση + + + Επανεγκατάσταση + + + Επιλογές Αποθήκευσης + + + Εκτέλεση Εντολής + + + Εγκατάσταση Πλήρους Έκδοσης + + + Εγκατάσταση Δοκιμαστικής Έκδοσης + + + Εγκατάσταση + + + Εξαγωγή + + + Ανανέωση Λίστας Διαδικτυακών Παιχνιδιών + + + Ομαδικά Παιχνίδια + + + Όλα τα Παιχνίδια + + + Έξοδος + + + Ακύρωση + + + Ακύρωση Συμμετοχής + + + Αλλαγή Ομάδας + + + Κατασκευή + + + Δημιουργία + + + Λήψη/Τοποθέτηση + + + Προβολή Αποθέματος + + + Προβολή Περιγραφής + + + Προβολή Συστατικών + + + Πίσω + + + Υπενθύμιση: + + + + + + Έχουν προστεθεί νέες λειτουργίες στο παιχνίδι στην πιο πρόσφατη έκδοσή του, όπως ενδεικτικά νέες περιοχές στον κόσμο του εκπαιδευτικού οδηγού. + + + Δεν έχετε όλα τα συστατικά που απαιτούνται για να φτιάξετε αυτό το αντικείμενο. Το πλαίσιο κάτω αριστερά δείχνει τα συστατικά που απαιτούνται για να το φτιάξετε. + + + + Συγχαρητήρια! Ολοκληρώσατε τον εκπαιδευτικό οδηγό. Ο χρόνος στο παιχνίδι τώρα κυλάει κανονικά και δεν έχετε πολλή ώρα μέχρι να νυχτώσει και να βγουν έξω τα τέρατα! Ολοκληρώστε το καταφύγιό σας! + + + + {*EXIT_PICTURE*} Όταν είστε έτοιμοι για περισσότερες εξερευνήσεις, υπάρχει μια σκάλα σε αυτήν την περιοχή κοντά στο καταφύγιο του Μεταλλωρύχου που οδηγεί σε ένα μικρό κάστρο. + + + {*B*}Πατήστε{*CONTROLLER_VK_A*} για να παίξετε κανονικά τον εκπαιδευτικού οδηγού.{*B*}
 Πατήστε{*CONTROLLER_VK_B*} για να παραλείψετε τον κύριο εκπαιδευτικό οδηγό. + + + + {*B*}
 Πατήστε{*CONTROLLER_VK_A*} για να μάθετε περισσότερα σχετικά με την μπάρα φαγητού και την κατανάλωση τροφών.{*B*}
 Πατήστε{*CONTROLLER_VK_B*}, εάν είστε ήδη εξοικειωμένοι με την μπάρα φαγητού και την κατανάλωση τροφών. + + + + Επιλογή + + + Χρήση + + + Σε αυτήν την περιοχή, θα βρείτε περιοχές που έχουν διαμορφωθεί για να εξοικειωθείτε με το ψάρεμα, τις βάρκες, τα έμβολα και την κοκκινόπετρα. + + + Έξω από αυτήν την περιοχή, θα βρείτε παραδείγματα κτισμάτων, γεωργικών ασχολιών, βαγονιών ορυχείου και πλατφορμών, ειδών μαγέματος, παρασκευής φίλτρων, ανταλλαγών, σιδηρουργικής και πολλών άλλων! + + + + Η μπάρα φαγητού έχει εξαντληθεί σε σημείο που δεν θα μπορέσετε να αναρρώσετε. + + + + Λήψη + + + Επόμενο + + + Προηγούμενο + + + Αποβολή Παίκτη + + + Αποστολή Αιτήματος Φιλίας + + + Κύλιση Σελίδας προς τα Κάτω + + + Κύλιση Σελίδας προς τα Επάνω + + + Βαφή + + + Επούλωση + + + Κάθισμα + + + Ακολούθησέ με + + + Εξόρυξη + + + Τάισμα + + + Εξημέρωση + + + Αλλαγή Φίλτρου + + + Τοποθέτηση Όλων + + + Τοποθέτηση Ενός Στοιχείου + + + Ξεσκαρτάρισμα + + + Λήψη Όλων + + + Λήψη Μισών + + + Τοποθέτηση + + + Ξεσκαρτάρισμα Όλων + + + Απαλοιφή Επιλογής + + + Τι Είναι Αυτό; + + + Κοινοποίηση στο Facebook + + + Ξεσκαρτάρισμα Ενός Στοιχείου + + + Εναλλαγή + + + Γρήγορη Κίνηση + + + Πακέτα Skin + + + Κόκκινο Βαμμένο Γυάλινο Τζάμι + + + Πράσινο Βαμμένο Γυάλινο Τζάμι + + + Καφέ Βαμμένο Γυάλινο Τζάμι + + + Λευκό Βαμμένο Γυαλί + + + Βαμμένο Γυάλινο Τζάμι + + + Μαύρο Βαμμένο Γυάλινο Τζάμι + + + Μπλε Βαμμένο Γυάλινο Τζάμι + + + Γκρι Βαμμένο Γυάλινο Τζάμι + + + Ροζ Βαμμένο Γυάλινο Τζάμι + + + Ανοιχτό Πράσινο Βαμμένο Γυάλινο Τζάμι + + + Μωβ Βαμμένο Γυάλινο Τζάμι + + + Γαλανό Βαμμένο Γυάλινο Τζάμι + + + Ανοιχτό γκρι Βαμμένο Γυάλινο Τζάμι + + + Πορτοκαλί Βαμμένο Γυαλί + + + Μπλε Βαμμένο Γυαλί + + + Μοβ Βαμμένο Γυαλί + + + Γαλανό Βαμμένο Γυαλί + + + Κόκκινο Βαμμένο Γυαλί + + + Πράσινο Βαμμένο Γυαλί + + + Καφέ Βαμμένο Γυαλί + + + Ανοιχτό Γκρι Βαμμένο Γυαλί + + + Κίτρινο Βαμμένο Γυαλί + + + Ανοιχτό Μπλε Βαμμένο Γυαλί + + + Φούξια Βαμμένο Γυαλί + + + Γκρι Βαμμένο Γυαλί + + + Ροζ Βαμμένο Γυαλί + + + Ανοιχτό Πράσινο Βαμμένο Γυαλί + + + Κίτρινο Βαμμένο Γυάλινο Τζάμι + + + Ανοιχτό Γκρι + + + Γκρι + + + Ροζ + + + Μπλε + + + Μωβ + + + Γαλανό + + + Ανοιχτό Πράσινο + + + Πορτοκαλί + + + Λευκό + + + Προσαρμοσμένο + + + Κίτρινο + + + Ανοιχτό Μπλε + + + Φούξια + + + Καφέ + + + Λευκό Βαμμένο Γυάλινο Τζάμι + + + Μικρή Μπάλα + + + Μεγάλη Μπάλα + + + Ανοιχτό Μπλε Βαμμένο Γυάλινο Τζάμι + + + Φούξια Βαμμένο Γυάλινο Τζάμι + + + Πορτοκαλί Βαμμένο Γυάλινο Τζάμι + + + Σε σχήμα αστεριού + + + Μαύρο + + + Κόκκινο + + + Πράσινο + + + Σε σχήμα Creeper + + + Έκρηξη + + + Άγνωστο σχήμα + + + Μαύρο Βαμμένο Γυαλί + + + Σιδερένια Πανοπλία Αλόγου + + + Χρυσή Πανοπλία Αλόγου + + + Διαμαντένια Πανοπλία Αλόγου + + + Συσκευή σύγκρισης Κοκκινόπετρας + + + Βαγόνι ορυχείου με 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*} + + + Καβαλίκεμα + + + Για να καθοδηγήσει ένα άλογο, ο παίκτης πρέπει να εξοπλίσει το άλογο με Σέλα. Τις Σέλες μπορείτε να τις αγοράσετε από χωρικούς ή να τις βρείτε μέσα σε Σεντούκια κρυμμένα στον κόσμο. + + + + Τα ήμερα Γαϊδούρια και Μουλάρια μπορούν να αποκτήσουν σακίδια σέλας, προσαρτώντας ένα Σεντούκι. Μπορείτε να έχετε πρόσβαση σε αυτά τα σακίδια σέλας ενώ ιππεύετε ή χρησιμοποιείτε αθόρυβη κίνηση. + + + + Μπορείτε να εκθρέψετε Άλογα και Γαϊδούρια (όχι όμως Μουλάρια) όπως τα υπόλοιπα ζώα, χρησιμοποιώντας Χρυσά Μήλα ή Χρυσά Καρότα. Με την πάροδο του χρόνου, τα Πουλάρια θα γίνουν ενήλικα άλογα, μολονότι αν τα ταΐζετε Σιτάρι ή Σανό η διαδικασία θα επισπευσθεί. + + + Για να χρησιμοποιήσετε τα Άλογα, τα Γαϊδούρια και τα Μουλάρια, πρέπει πρώτα να τα δαμάσετε. Για να δαμάσετε ένα άλογο, πρέπει να προσπαθήσετε να το ιππεύσετε και να καταφέρετε να μείνετε πάνω του, όσο αυτό προσπαθεί να ρίξει τον αναβάτη. + + + Όταν γύρω από το άλογο εμφανιστούν Καρδιές Αγάπης, το άλογο είναι ήμερο και δεν θα αποπειραθεί ξανά να ρίξει κάτω τον παίκτη. + + + 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*} +{*C3*}Ποιοι είμαστε; Κάποτε μας αποκαλούσαν το πνεύμα του βουνού. Πατέρα Ήλιο, Μητέρα Σελήνη. Αρχαία πνεύματα, πνεύματα ζώων. Τζίνι. Φαντάσματα. Πράσινο άνθρωπο. Στη συνέχεια, θεούς, δαίμονες. Αγγέλους. Πόλτεργκαϊστ. Εξωγήινους. Λεπτόνια, κουάρκ. Οι λέξεις αλλάζουν. Εμείς όχι.{*EF*}{*B*}{*B*} +{*C2*}Είμαστε το σύμπαν. Είμαστε όλα όσα νομίζεις ότι δεν είσαι εσύ. Τώρα μας βλέπεις, μέσ' από το δέρμα και τα μάτια σου. Και γιατί αγγίζει το σύμπαν το δέρμα σου και σου ρίχνει φως; Για να σε δει, ον. Για να σε γνωρίσει. Και για να το γνωρίσεις. θα σου πω μια ιστορία.{*EF*}{*B*}{*B*} +{*C2*}Μια φορά κι έναν καιρό, ήταν ένας ον.{*EF*}{*B*}{*B*} +{*C3*}Αυτό το παιχνιδιάρικο ήσουν εσύ, {*PLAYER*}.{*EF*}{*B*}{*B*} +{*C2*}Μερικές φορές αισθανόταν ότι η φύση του ήταν ανθρώπινη, καθώς στεκόταν στον λεπτό φλοιό μιας περιστρεφόμενης σφαίρας από λιωμένη πέτρα. Η σφαίρα από λιωμένη πέτρα περιστρεφόταν γύρω από μια σφαίρα φλεγόμενων αερίων που ήταν τριακόσιες τριάντα χιλιάδες φορές μεγαλύτερη. Ήταν τόσο μακριά η μία από την άλλη, που το φως χρειαζόταν οκτώ λεπτά για να διανύσει την απόσταση. Το φως ήταν πληροφορία από ένα άστρο και μπορούσε να κάψει το δέρμα σου ακόμα και από απόσταση εκατόν πενήντα εκατομμυρίων χιλιομέτρων.{*EF*}{*B*}{*B*} +{*C2*}Μερικές φορές το ον ονειρευόταν ότι ήταν εργάτης σε ορυχεία, στην επιφάνεια ενός κόσμου επίπεδου και ατελείωτου. Ο ήλιος ήταν ένα λευκό τετράγωνο. Οι ημέρες ήταν μικρές. Οι δουλειές πολλές. Και ο θάνατος μια προσωρινή αναστάτωση.{*EF*}{*B*}{*B*} +{*C3*}Μερικές φορές το ον ένιωθε χαμένο σε μια ιστορία.{*EF*}{*B*}{*B*} +{*C2*}Μερικές φορές ονειρευόταν ότι ήταν κάτι άλλο, σε άλλα μέρη. Μερικές φορές αυτά τα όνειρα ήταν ενοχλητικά. Μερικές φορές πολύ όμορφα όντως. Μερικές φορές το ον περνούσε από το ένα όνειρο στο επόμενο και μετά ξυπνούσε για να περάσει σε ένα τρίτο.{*EF*}{*B*}{*B*} +{*C3*}Μερικές φορές το ον ονειρευόταν ότι έβλεπε λέξεις σε μια οθόνη.{*EF*}{*B*}{*B*} +{*C2*}Πάμε πίσω.{*EF*}{*B*}{*B*} +{*C2*}Τα άτομα του όντος ήταν σκορπισμένα στο γρασίδι, στους ποταμούς, στον αέρα, στο έδαφος. Μια γυναίκα συγκέντρωσε τα άτομα. Τα ήπιε, τα έφαγε, τα εισέπνευσε. Και η γυναίκα σχημάτισε πάλι το ον, μέσα στο σώμα της.{*EF*}{*B*}{*B*} +{*C2*}Και το ον ξύπνησε, από τον ζεστό, σκοτεινό κόσμο του μητρικού σώματος, μέσα στο μακρύ όνειρο.{*EF*}{*B*}{*B*} +{*C2*}Και το ον ήταν μια ολοκαίνουργια ιστορία, που δεν είχε ξαναειπωθεί, γραμμένη με τους χαρακτήρες του DNA. Και το ον ήταν ένα ολοκαίνουργιο πρόγραμμα, που δεν είχε ξανατρέξει, δημιουργημένο από έναν πηγαίο κώδικα δισεκατομμυρίων ετών. Και το ον ήταν ένας καινούργιος άνθρωπος, που δεν είχε ξαναζήσει, φτιαγμένος μόνο με γάλα κι αγάπη.{*EF*}{*B*}{*B*} +{*C3*}Εσύ είσαι το ον. Η ιστορία. Το πρόγραμμα. Ο άνθρωπος. Που είναι φτιαγμένος μόνο με γάλα κι αγάπη.{*EF*}{*B*}{*B*} +{*C2*}Ας πάμε ακόμα πιο πίσω.{*EF*}{*B*}{*B*} +{*C2*}Τα επτά δισεκατομμύρια δισεκατομμυρίων άτομα του όντος είχαν δημιουργηθεί πολύ πριν από αυτό το παιχνίδι, στον πυρήνα ενός άστρου. Έτσι, και το ον είναι μια πληροφορία από ένα άστρο. Και το ον προχωρά σε μια ιστορία που είναι ένα δάσος από πληροφορίες, τις οποίες έχει τοποθετήσει ένας άνδρας που τον λένε Julian, σε έναν επίπεδο, ατελείωτο κόσμο που έχει δημιουργήσει έναν άνδρας που τον λένε Markus, ο οποίος υπάρχει σε έναν μικρό, ιδιωτικό κόσμο που έχει δημιουργήσει το ον, ο οποίος κατοικεί σε ένα σύμπαν που έχει δημιουργήσει...{*EF*}{*B*}{*B*} +{*C3*}Σιωπή. Μερικές φορές το παιχνιδιάρικο ον δημιουργούσε ένα μικρό, ιδιωτικό κόσμο που ήταν μαλακός και ζεστός και απλός. Μερικές φορές σκληρός, ψυχρός και μπερδεμένος. Μερικές φορές κατασκεύαζε ένα μοντέλο του σύμπαντος στο κεφάλι του: ψήγματα ενέργειας, που κινούνται σε απέραντους κενούς χώρους. Μερικές φορές αποκαλούσε αυτά τα ψήγματα «ηλεκτρόνια» και «πρωτόνια».{*EF*}{*B*}{*B*} + + + + +{*C2*}Μερικές φορές τα αποκαλούσε «πλανήτες» και «άστρα».{*EF*}{*B*}{*B*} +{*C2*}Μερικές φορές πίστευε ότι βρισκόταν σε ένα σύμπαν φτιαγμένο από ενέργεια που αποτελούνταν από στιγμές εκτός και εντός λειτουργίας, από μηδενικά και μονάδες, από γραμμές κώδικα. Μερικές φορές πίστευε ότι παίζει ένα παιχνίδι. Μερικές φορές πίστευε ότι διαβάζει λέξεις σε μια οθόνη.{*EF*}{*B*}{*B*} +{*C3*}Εσύ είσαι αυτός το ον, που διαβάζει λέξεις...{*EF*}{*B*}{*B*} +{*C2*}Σιωπή... Μερικές φορές το ον διάβαζε γραμμές κώδικα σε μια οθόνη. Τις αποκωδικοποιούσε σε λέξεις, και τις λέξεις σε νοήματα, και τα νοήματα σε αισθήματα, συναισθήματα, θεωρίες, ιδέες, και το ον άρχιζε να αναπνέει πιο γρήγορα και πιο βαθιά και συνειδητοποιούσε ότι ήταν ζωντανό, ήταν ζωντανό, οι χιλιάδες θάνατοι δεν ήταν πραγματικοί, το ον ήταν ζωντανός{*EF*}{*B*}{*B*} +{*C3*}Εσύ. Εσύ. Είσαι ζωντανό.{*EF*}{*B*}{*B*} +{*C2*}και μερικές φορές το ον πίστευε ότι το σύμπαν του μιλούσε μέσ' από τις ηλιαχτίδες που διαπερνούσαν το φύλλωμα των καλοκαιρινών δέντρων{*EF*}{*B*}{*B*} +{*C3*}και μερικές φορές το ον πίστευε ότι το σύμπαν του μιλούσε μέσ' από το φως που έπεφτε από τον δροσερό νυχτερινό ουρανό του χειμώνα, όταν μια δέσμη φωτός στην άκρη του ματιού του όντος μπορεί να ήταν ένα άστρο εκατομμύρια φορές μεγαλύτερο από τον ήλιο, που ζέσταινε τους πλανήτες του μέχρι να γίνουν πλάσμα προκειμένου να το δει έστω για μια στιγμή το ον, που πήγαινε σπίτι του στην άλλη άκρη του σύμπαντος, την ώρα που ξάφνου γαργαλούσε τη μύτη του η μυρωδιά του φαγητού, όταν πλησίαζε στη γνώριμη πόρτα, έτοιμο να ονειρευτεί ξανά{*EF*}{*B*}{*B*} +{*C2*}και μερικές φορές το ον πίστευε ότι το σύμπαν του μιλούσε μέσ' από τα μηδενικά και τις μονάδες, μέσ' από την ηλεκτρική ενέργεια του κόσμου, μέσ' από τις λέξεις της οθόνης στο τέλος ενός ονείρου{*EF*}{*B*}{*B*} +{*C3*}και το σύμπαν έλεγε «σ' αγαπώ»{*EF*}{*B*}{*B*} +{*C2*}και το σύμπαν έλεγε «έπαιξες καλά το παιχνίδι»{*EF*}{*B*}{*B*} +{*C3*}και το σύμπαν έλεγε «όλα όσα χρειάζεσαι βρίσκονται μέσα σου»{*EF*}{*B*}{*B*} +{*C2*}και το σύμπαν έλεγε «είσαι πιο δυνατό απ' όσο νομίζεις»{*EF*}{*B*}{*B*} +{*C3*}και το σύμπαν έλεγε «είσαι το φως της μέρας»{*EF*}{*B*}{*B*} +{*C2*}και το σύμπαν έλεγε «είσαι η νύχτα»{*EF*}{*B*}{*B*} +{*C3*}και το σύμπαν έλεγε «το σκοτάδι που πολεμάς βρίσκεται μέσα σου»{*EF*}{*B*}{*B*} +{*C2*}και το σύμπαν έλεγε «το φως που αναζητάς βρίσκεται μέσα σου»{*EF*}{*B*}{*B*} +{*C3*}και το σύμπαν έλεγε «δεν είσαι μόνο»{*EF*}{*B*}{*B*} +{*C2*}και το σύμπαν έλεγε «δεν είσαι χωρισμένο από τα υπόλοιπα πράγματα»{*EF*}{*B*}{*B*} +{*C3*}και το σύμπαν έλεγε «είσαι το σύμπαν που γεύεται τον εαυτό του, που μιλά στον εαυτό του, που διαβάζει τον δικό του κώδικα»{*EF*}{*B*}{*B*} +{*C2*}και το σύμπαν έλεγε «σε αγαπώ γιατί είσαι η αγάπη».{*EF*}{*B*}{*B*} +{*C3*}Και το παιχνίδι τελείωσε και το ον ξύπνησε από το όνειρο. Και το ον ξεκίνησε ένα νέο όνειρο. Και το ον ονειρεύτηκε ξανά, ένα καλύτερο όνειρο. Και το ον ήταν το σύμπαν. Και το ον ήταν η αγάπη.{*EF*}{*B*}{*B*} +{*C3*}Εσύ είσαι το παιχνιδιάρικο ον.{*EF*}{*B*}{*B*} +{*C2*}Ξύπνα.{*EF*} + + + + Επαναφορά του Nether + + + Ο/Η %s μπήκε στο End + + + Ο/Η %s βγήκε από το End + + + +{*C3*}Βλέπω το ον που μου είπες.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*};{*EF*}{*B*}{*B*} +{*C3*}Ναι. Προσοχή. Έχει φτάσει πλέον σε ανώτερο επίπεδο. Μπορεί να διαβάσει τις σκέψεις μας.{*EF*}{*B*}{*B*} +{*C2*}Δεν έχει σημασία. Πιστεύει ότι είμαστε μέρος του παιχνιδιού.{*EF*}{*B*}{*B*} +{*C3*}Μου αρέσει αυτό το παιχνιδιάρικο ον. Έπαιξε καλά. Δεν το έβαλε κάτω.{*EF*}{*B*}{*B*} +{*C2*}Διαβάζει τις σκέψεις μας σαν να είναι λέξεις σε οθόνη.{*EF*}{*B*}{*B*} +{*C3*}Επιλέγει να φαντάζεται πολλά πράγματα με αυτόν τον τρόπο, όταν είναι βαθιά βυθισμένο στο όνειρο ενός παιχνιδιού.{*EF*}{*B*}{*B*} +{*C2*}Οι κόσμοι είναι απίθανα περιβάλλοντα χρήστη. Πολύ ευέλικτα. Και λιγότερο τρομακτικά από την πραγματικότητα εκτός οθόνης.{*EF*}{*B*}{*B*} +{*C3*}Άκουγαν φωνές. Προτού τα παιχνιδιάρικα όντα καταφέρουν να διαβάσουν. Τον παλιό καιρό, όταν όσοι δεν έπαιζαν, αποκαλούσαν τα παιχνιδιάρικα όντα μάγισσες και μάγους. Και αυτά τα όντα ονειρεύονταν ότι πετούσαν στον ουρανό, πάνω σε σκουπόξυλα που κινούσαν δαίμονες.{*EF*}{*B*}{*B*} +{*C2*}Τι ονειρεύτηκε αυτό το ον;{*EF*}{*B*}{*B*} +{*C3*}Αυτό το ον ονειρεύτηκε ηλιαχτίδες και δέντρα. Από φωτιά και νερό. Ονειρεύτηκε ότι δημιούργησε. Και ονειρεύτηκε ότι κατέστρεψε. Ονειρεύτηκε ότι κυνήγησε και κυνηγήθηκε. Ονειρεύτηκε ένα καταφύγιο.{*EF*}{*B*}{*B*} +{*C2*}Αχά, το αυθεντικό περιβάλλον χρήστη. Υπάρχει εδώ και ένα εκατομμύριο χρόνια, και λειτουργεί ακόμα. Όμως, ποιο πραγματικό οικοδόμημα δημιούργησε αυτό το ον, στην πραγματικότητα εκτός οθόνης;{*EF*}{*B*}{*B*} +{*C3*}Συνεργάστηκε με εκατομμύρια άλλους για να σμιλέψει έναν πραγματικό κόσμο σε μια πτυχή του {*EF*}{*NOISE*}{*C3*} και δημιούργησε ένα {*EF*}{*NOISE*}{*C3*} για {*EF*}{*NOISE*}{*C3*}, στο {*EF*}{*NOISE*}{*C3*}.{*EF*}{*B*}{*B*} +{*C2*}Δεν μπορεί να διαβάσει αυτή τη σκέψη.{*EF*}{*B*}{*B*} +{*C3*}Όχι. Δεν έχει φτάσει ακόμα στο υψηλότερο επίπεδο. Αυτό πρέπει να το πετύχει στο μακρύ όνειρο της ζωής, και όχι στο σύντομο όνειρο ενός παιχνιδιού.{*EF*}{*B*}{*B*} +{*C2*}Ξέρει ότι το αγαπάμε; Ότι το σύμπαν έχει καλή καρδιά;{*EF*}{*B*}{*B*} +{*C3*}Μερικές φορές, μέσα στο θόρυβο της σκέψης του, ακούει το σύμπαν, ναι.{*EF*}{*B*}{*B*} +{*C2*}Υπάρχουν, όμως, στιγμές που είναι θλιμμένο, στο μακρύ όνειρο. Δημιουργεί κόσμους χωρίς καλοκαίρια και τρέμει κάτω από έναν σκοτεινό ήλιο και θεωρεί ότι οι θλιβερές δημιουργίες του είναι η πραγματικότητα.{*EF*}{*B*}{*B*} +{*C3*}Το να το απαλλάξουμε από τη θλίψη θα το οδηγούσε στην καταστροφή. Η θλίψη είναι μέρος της προσωπικής του αποστολής. Δεν μπορούμε να επέμβουμε.{*EF*}{*B*}{*B*} +{*C2*}Μερικές φορές είναι τόσο βυθισμένα στα όνειρά τους που θέλω να τους πω ότι δημιουργούν πραγματικούς κόσμους στην πραγματικότητα. Μερικές φορές θέλω να τους πω πόσο σημαντικά είναι για το σύμπαν. Μερικές φορές, όταν δεν έχουν έρθει σε πραγματική επαφή για κάποιο διάστημα, θέλω να τους βοηθήσω να ξεστομίσουν τη λέξη που φοβούνται.{*EF*}{*B*}{*B*} +{*C3*}Διαβάζει τις σκέψεις μας.{*EF*}{*B*}{*B*} +{*C2*}Μερικές φορές δεν με νοιάζει. Μερικές φορές θα ήθελα να τους πω ότι ο κόσμος που νομίζουν ότι είναι η πραγματικότητα δεν είναι παρά {*EF*}{*NOISE*}{*C2*} και {*EF*}{*NOISE*}{*C2*}, θέλω αν τους πω ότι είναι {*EF*}{*NOISE*}{*C2*} στο {*EF*}{*NOISE*}{*C2*}. Βλέπουν τόσο περιορισμένο μέρος της πραγματικότητας, στο μακρύ τους όνειρο.{*EF*}{*B*}{*B*} +{*C3*}Και παρόλ' αυτά παίζουν το παιχνίδι.{*EF*}{*B*}{*B*} +{*C2*}Θα ήταν τόσο εύκολο να τους το πούμε...{*EF*}{*B*}{*B*} +{*C3*}Πολύ δυνατό για αυτό το όνειρο. Αν τους πούμε πώς να ζήσουν, θα τους αποτρέψουμε από το να ζήσουν.{*EF*}{*B*}{*B*} +{*C2*}Δεν θα πω στο ον πώς να ζήσει.{*EF*}{*B*}{*B*} +{*C3*}Το ον γίνεται όλο και πιο ανυπόμονο.{*EF*}{*B*}{*B*} +{*C2*}Θα του διηγηθώ μια ιστορία.{*EF*}{*B*}{*B*} +{*C3*}Δεν θα του πω όμως την αλήθεια.{*EF*}{*B*}{*B*} +{*C2*}Όχι. Πες μια ιστορία που περιέχει την αλήθεια σε ένα ασφαλές πλαίσιο, σε ένα κλουβί από λέξεις. Όχι τη γυμνή αλήθεια που μπορεί να κάψει τους πάντες και τα πάντα.{*EF*}{*B*}{*B*} +{*C3*}Δώσ' του πάλι σώμα.{*EF*}{*B*}{*B*} +{*C2*}Ναι. Ον...{*EF*}{*B*}{*B*} +{*C3*}Πες το όνομά του.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}. Εξπέρ παιχνιδιών.{*EF*}{*B*}{*B*} +{*C3*}Ωραία.{*EF*}{*B*}{*B*} + + + + Είστε σίγουροι ότι θέλετε να επαναφέρετε το Nether στην προεπιλεγμένη του κατάσταση σε αυτό το αποθηκευμένο παιχνίδι; Θα χάσετε όλα όσα έχετε κατασκευάσει στο The Nether! + + + Δεν είναι δυνατή η χρήση του Αβγού Spawn αυτή τη στιγμή. Έχετε φτάσει τον μέγιστο αριθμό Γουρουνιών, Προβάτων, Αγελάδων, Γατών και Αλόγων. + + + Δεν είναι δυνατή η χρήση του Αβγού Spawn αυτή τη στιγμή. Έχετε φτάσει τον μέγιστο αριθμό Mooshroom. + + + Δεν είναι δυνατή η χρήση του Αβγού Spawn αυτή τη στιγμή. Έχετε φτάσει τον μέγιστο αριθμό Λύκων για έναν κόσμο. + + + Επαναφορά του Nether + + + Να μην γίνει επαναφορά του Nether + + + Δεν είναι δυνατό το κούρεμα αυτού του Mooshroom αυτή τη στιγμή. Έχετε φτάσει τον μέγιστο αριθμό Γουρουνιών, Προβάτων, Αγελάδων, Γατών και Αλόγων. + + + Πεθάνατε! + + + Επιλογές Κόσμου + + + Δυνατότητα Κατασκευών και Εξόρυξης + + + Δυνατότητα Χρήσης Πορτών, Διακοπτών + + + Δημιουργία Οικοδομημάτων + + + Εντελώς Επίπεδος Κόσμος + + + Σεντούκι Μπόνους + + + Δυνατότητα Ανοίγματος Δοχείων + + + Αποβολή Παίκτη + + + Δυνατότητα Πτήσης + + + Απενεργοποίηση Εξάντλησης + + + Δυνατότητα Επίθεσης σε Παίκτες + + + Δυνατότητα Επίθεσης σε Ζώα + + + Επόπτης + + + Προνόμια Οικοδεσπότη + + + Πώς να Παίξετε + + + Πλήκτρα Ελέγχου + + + Ρυθμίσεις + + + Επαναγένεση + + + Προσφορές Περιεχομένου Λήψης + + + Αλλαγή Skin + + + Συντελεστές + + + + Ανατίναξη TNT + + + Παίκτης εναντίον Παίκτη + + + Εμπιστοσύνη προς Παίκτες + + + Επανεγκατάσταση Περιεχομένου + + + Ρυθμίσεις Εντοπισμού Σφαλμάτων + + + Εξάπλωση Φωτιάς + + + Δράκος του End + + + Ο/Η {*PLAYER*} σκοτώθηκε από ανάσα Δράκου του End + + + Ο/Η {*PLAYER*} σφαγιάστηκε από {*SOURCE*} + + + Ο/Η {*PLAYER*} σφαγιάστηκε από τον/την {*SOURCE*} + + + Ο/Η {*PLAYER*} πέθανε + + + Ο/Η {*PLAYER*} ανατινάχτηκε + + + Ο/Η {*PLAYER*} σκοτώθηκε από μαγικά + + + Ο/Η {*PLAYER*} πυροβολήθηκε από {*SOURCE*} + + + Ομίχλη Καθαρού Βράχου + + + Προβολή HUD + + + Προβολή Χεριού + + + Ο/Η {*PLAYER*} δέχθηκε χτύπημα με φλεγόμενη σφαίρα από {*SOURCE*} + + + Ο/Η {*PLAYER*} γρονθοκοπήθηκε από {*SOURCE*} + + + Ο/Η {*PLAYER*} σκοτώθηκε από {*SOURCE*} με μαγεία + + + Ο/Η {*PLAYER*} έπεσε έξω από τον κόσμο + + + Πακέτα με Υφές + + + Μικτά Πακέτα + + + Ο/Η {*PLAYER*} τυλίχτηκε στις φλόγες + + + Θέματα + + + Εικόνες Παικτών + + + Άβαταρ + + + Ο/Η {*PLAYER*} κάηκε + + + Ο/Η {*PLAYER*} πέθανε από πείνα + + + Ο/Η {*PLAYER*} πέθανε από τα πολλά τσιμπήματα + + + Ο/Η {*PLAYER*} έπεσε στο έδαφος μεγαλοπρεπώς + + + Ο/Η {*PLAYER*} προσπάθησε να κολυμπήσει σε λάβα + + + Ο/Η {*PLAYER*} πέθανε από ασφυξία μέσα σε τοίχο + + + Ο/Η {*PLAYER*} πνίγηκε + + + Μηνύματα Θανάτου + + + Δεν είστε πλέον επόπτης + + + Μπορείτε πλέον να πετάξετε + + + Δεν μπορείτε πλέον να πετάξετε + + + Δεν μπορείτε πλέον να επιτίθεστε σε ζώα + + + Μπορείτε πλέον να επιτίθεστε σε ζώα + + + Είστε πλέον επόπτης + + + Δεν θα εξαντλείστε πια + + + Είστε πλέον άτρωτος + + + Δεν είστε πλέον άτρωτος + + + %d MSP + + + Στο εξής θα εξαντλείστε + + + Είστε πλέον αόρατος + + + Δεν είστε πλέον αόρατος + + + Μπορείτε πλέον να επιτίθεστε σε παίκτες + + + Μπορείτε πλέον να κάνετε εξόρυξη και χρήση αντικειμένων + + + Δεν μπορείτε πλέον να τοποθετήσετε κύβους + + + Μπορείτε πλέον να τοποθετήσετε κύβους + + + Κινούμενος Χαρακτήρας + + + Μετατροπή σε Κινούμενο Χαρακτήρα + + + Δεν μπορείτε πλέον να κάνετε εξόρυξη ή χρήση αντικειμένων + + + Μπορείτε πλέον να χρησιμοποιήσετε πόρτες και διακόπτες + + + Δεν μπορείτε πλέον να επιτίθεστε σε mob + + + Μπορείτε πλέον να επιτίθεστε σε mob + + + Δεν μπορείτε πλέον να επιτίθεστε σε παίκτες + + + Δεν μπορείτε πλέον να χρησιμοποιήσετε πόρτες και διακόπτες + + + Μπορείτε πλέον να χρησιμοποιήσετε δοχεία (π.χ. σεντούκια) + + + Δεν μπορείτε πλέον να χρησιμοποιήσετε δοχεία (π.χ. σεντούκια) + + + Αόρατο + + + Φάροι + + + {*T3*}ΤΡΟΠΟΣ ΠΑΙΧΝΙΔΙΟΥ : ΦΑΡΟΙ{*ETW*}{*B*}{*B*} +Οι ενεργοί Φάροι εκπέμπουν μια έντονη δέσμη φωτός στον ουρανό και παρέχουν δυνάμεις σε κοντινούς παίκτες.{*B*} +Κατασκευάζονται με Γυαλί, Οψιανό και Αστέρια του Nether, τα οποία μπορείτε να αποκτήσετε νικώντας το Wither.{*B*}{*B*} +Οι Φάροι πρέπει να τοποθετούνται με τρόπο που να είναι στο φως του ήλιου κατά τη διάρκεια της ημέρας. Οι Φάροι πρέπει να τοποθετούνται σε Πυραμίδες από Σίδηρο, Χρυσό, Σμαράγδια ή Διαμάντια.{*B*} +Το υλικό πάνω στο οποίο τοποθετείται ο Φάρος δεν έχει καμία επίδραση στη δύναμη του Φάρου.{*B*}{*B*} +Στο μενού Φάρου μπορείτε να επιλέξετε μία κύρια δύναμη για το Φάρο σας. Όσο περισσότερες βαθμίδες έχει η πυραμίδα σας, τόσο περισσότερες θα είναι οι επιλογές δυνάμεων.{*B*} +Ένας φάρος σε μια πυραμίδα με τουλάχιστον τέσσερις βαθμίδες δίνει επίσης την επιλογή της δευτερεύουσας δύναμης Αναδημιουργία ή μιας πιο ισχυρής κύριας δύναμης.{*B*}{*B*} +Για να ορίσετε τις δυνάμεις του Φάρου σας, πρέπει να θυσιάσετε μια Ράβδο από Σμαράγδια, Χρυσό ή Σίδηρο στην υποδοχή πληρωμής.{*B*} +Αφού τις ορίσετε, οι δυνάμεις θα εκπέμπονται από το Φάρο επ' αόριστον.{*B*} + + + Πυροτεχνήματα + + + Γλώσσες + + + Άλογα + + + {*T3*}ΤΡΟΠΟΣ ΠΑΙΧΝΙΔΙΟΥ : ΑΛΟΓΑ{*ETW*}{*B*}{*B*} +Τα Άλογα και τα Γαϊδούρια βρίσκονται κυρίως σε ανοικτές πεδιάδες. Τα Μουλάρια προκύπτουν από τη διασταύρωση Γαϊδουριών και Αλόγων, αλλά είναι στείρα.{*B*} +Μπορείτε να ιππεύσετε όλα τα ενήλικα Άλογα, Γαϊδούρια και Μουλάρια. Ωστόσο, μόνο τα Άλογα μπορούν να έχουν πανοπλία και μόνο τα Μουλάρια και τα Γαϊδούρια μπορούν να εξοπλίζονται με σακίδια σέλας για τη μεταφορά αντικειμένων.{*B*}{*B*} +Για να χρησιμοποιήσετε τα Άλογα, τα Γαϊδούρια και τα Μουλάρια, πρέπει πρώτα να τα δαμάσετε. Για να δαμάσετε ένα άλογο, πρέπει να προσπαθήσετε να το ιππεύσετε και να καταφέρετε να μείνετε πάνω του, όσο αυτό προσπαθεί να ρίξει τον αναβάτη.{*B*} +Όταν γύρω από το άλογο εμφανιστούν Καρδιές Αγάπης, το άλογο είναι ήμερο και δεν θα προσπαθήσει ξανά να ρίξει κάτω τον παίκτη. Για να καθοδηγήσει ένα άλογο, ο παίκτης πρέπει να εξοπλίσει το άλογο με Σέλα.{*B*}{*B*} +Τις Σέλες μπορείτε να τις αγοράσετε από χωρικούς ή να τις βρείτε μέσα σε Σεντούκια κρυμμένα στον κόσμο.{*B*} +Τα ήμερα Γαϊδούρια και Μουλάρια μπορούν να αποκτήσουν σακίδια σέλας προσαρτώντας ένα Σεντούκι. Μπορείτε να έχετε πρόσβαση σε αυτά τα σακίδια σέλας ενώ ιππεύετε ή χρησιμοποιείτε αθόρυβη κίνηση.{*B*}{*B*} +Μπορείτε να εκθρέψετε Άλογα και Γαϊδούρια (όχι όμως Μουλάρια) όπως τα υπόλοιπα ζώα, χρησιμοποιώντας Χρυσά Μήλα ή Χρυσά Καρότα.{*B*} +ε την πάροδο του χρόνου, τα Πουλάρια θα γίνουν ενήλικα άλογα. Αν τα ταΐζετε Σιτάρι ή Σανό θα μεγαλώσουν γρηγορότερα.{*B*} + + + + {*T3*}HOW TO PLAY : FIREWORKS{*ETW*}{*B*}{*B*} +Τα Πυροτεχνήματα είναι διακοσμητικά αντικείμενα που εκτοξεύονται με το χέρι ή με χρήση Διανομέων. Κατασκευάζονται από Χαρτί, Μπαρούτι και, προαιρετικά, μερικά Πυροτεχνήματα Αστέρια.{*B*} +Μπορείτε να προσαρμόσετε τα χρώματα, το σβήσιμο, το σχήμα, το μέγεθος και τα εφέ (όπως για παράδειγμα τα ίχνη και τη λάμψη) των Πυροτεχνημάτων Αστεριών, χρησιμοποιώντας πρόσθετα υλικά κατά τη διάρκεια της κατασκευής.{*B*}{*B*} +Για να φτιάξετε ένα Πυροτέχνημα, τοποθετήστε Μπαρούτι και Χαρτί στο πλαίσιο κατασκευής διαστάσεων 3x3 που φαίνεται πάνω από το απόθεμά σας.{*B*} +Προαιρετικά, μπορείτε να τοποθετήσετε στο πλαίσιο κατασκευής διάφορα Πυροτεχνήματα Αστέρια και να τα προσθέσετε στο Πυροτέχνημα.{*B*} +Όσο περισσότερες υποδοχές του πλαισίου κατασκευής γεμίσετε με Μπαρούτι, τόσο ψηλότερα θα σκάσουν όλα τα Πυροτεχνήματα Αστέρια.{*B*}{*B*} +Στη συνέχεια μπορείτε να πάρετε το έτοιμο Πυροτέχνημα από την υποδοχή εξόδου.{*B*}{*B*} +Μπορείτε να φτιάξετε Πυροτεχνήματα Αστέρια τοποθετώντας Μπαρούτι και Βαφή στο πλαίσιο εργασίας.{*B*} +- Η Βαφή θα καθορίσει το χρώμα της έκρηξης του Πυροτεχνήματος Αστεριού.{*B*} +- Το σχήμα του Πυροτεχνήματος Αστεριού καθορίζεται με την προσθήκη Μπάλας Φωτιάς, Ψήγματος Χρυσού, Φτερού ή Κεφαλιού.{*B*} +- Μπορείτε να προσθέσετε ίχνη και λάμψη χρησιμοποιώντας Διαμάντια ή Σκόνη λαμψόπετρας.{*B*}{*B*} +Μετά την κατασκευή ενός Πυροτεχνήματος Αστεριού, μπορείτε να καθορίσετε το χρώμα σβησίματός του χρησιμοποιώντας Βαφή. + + + + {*T3*}ΤΡΟΠΟΣ ΠΑΙΧΝΙΔΙΟΥ : ΕΚΤΟΞΕΥΤΕΣ{*ETW*}{*B*}{*B*} +Όταν τροφοδοτούνται από Κοκκινόπετρα, οι Εκτοξευτές ρίχνουν στο έδαφος ένα μεμονωμένο τυχαίο αντικείμενο που περιέχουν. Ανοίξτε τον Εκτοξευτή με {*CONTROLLER_ACTION_USE*} και γεμίστε τον με αντικείμενα από το απόθεμά σας..{*B*} +Όταν ο Εκτοξευτής είναι στραμμένος προς ένα Σεντούκι ή άλλο είδος Δοχείου, το αντικείμενο δεν θα πέσει στο έδαφος αλλά θα μεταφερθεί εκεί. Μπορείτε να δημιουργήσετε μεγάλες διατάξεις Εκτοξευτών για τη μεταφορά αντικειμένων σε απόσταση. Για να λειτουργήσει αυτού του είδους η διάταξη, οι Εκτοξευτές πρέπει να ανάβουν και να σβήνουν εναλλάξ. + + + + Όταν χρησιμοποιείται, γίνεται χάρτης του μέρους του κόσμου όπου βρίσκεστε, και γεμίζει όσο εξερευνάτε. + + + Έπεσε από τους Wither, χρησιμοποιείται στην κατασκευή Φάρων + + + Χοάνες + + + {*T3*}ΤΡΟΠΟΣ ΠΑΙΧΝΙΔΙΟΥ : ΧΟΑΝΕΣ{*ETW*}{*B*}{*B*} +Οι Χοάνες χρησιμοποιούνται για την εισαγωγή ή την αφαίρεση αντικειμένων από δοχεία και για την αυτόματη συλλογή αντικειμένων που έχουν ριχτεί σε αυτά.{*B*} +Μπορούν να επηρεάσουν Βάσεις Παρασκευής, Σεντούκια, Διανομείς, Εκτοξευτές, Βαγόνια Ορυχείου με Σεντούκια, Βαγόνια Ορυχείου με Χοάνη, καθώς και άλλες Χοάνες.{*B*}{*B*} +Οι Χοάνες θα επιχειρούν συνεχώς να ρουφήξουν αντικείμενα από ένα κατάλληλο δοχείο που έχει τοποθετηθεί επάνω τους. Επίσης, θα επιχειρούν να εισαγάγουν αποθηκευμένα αντικείμενα σε ένα δοχείο εξόδου.{*B*} +Εάν μια Χοάνη τροφοδοτείται από Κοκκινόπετρα, θα καταστεί ανενεργή και θα σταματήσει τόσο να ρουφάει όσο και να εισαγάγει αντικείμενα.{*B*}{*B*} +Η Χοάνη δείχνει προς την κατεύθυνση που προσπαθεί να εξαγάγει αντικείμενα. Προκειμένου μια Χοάνη να δείχνει προς έναν συγκεκριμένο κύβο, τοποθετείστε τη Χοάνη απέναντι από αυτόν τον κύβο, ενώ κινείστε αθόρυβα.{*B*} + + + Εκτοξευτές + + + NOT USED + + + Άμεση Υγεία + + + Άμεση Βλάβη + + + Ώθηση Άλματος + + + Κούραση Λόγω Εξόρυξης + + + Δύναμη + + + Αδυναμία + + + Ναυτία + + + NOT USED + + + NOT USED + + + NOT USED + + + Αναδημιουργία + + + Αντοχή + + + Εύρεση Σπόρου για το Δημιουργό Κόσμων. + + + Όταν είναι ενεργοποιημένο, δημιουργεί πολύχρωμες εκρήξεις. Το χρώμα, το εφέ, το σχήμα και το σβήσιμο καθορίζονται από το Πυροτέχνημα-Αστέρι που χρησιμοποιείται κατά τη δημιουργία του Πυροτεχνήματος. + + + Ένας τύπος ραγών που μπορεί να ενεργοποιήσει ή να απενεργοποιήσει Βαγόνια Ορυχείου με Χοάνη και να πυροδοτήσει Βαγόνια Ορυχείου με 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 + + + Κρανίο Σκελετού + + + Κρανίο Μαύρου Σκελετού + + + Κεφάλι Ζόμπι + + + Ένας τρόπος αποθήκευσης Κάρβουνου που δεν πιάνει χώρο. Μπορεί να χρησιμοποιηθεί ως καύσιμο σε έναν Κλίβανο. + + + Δηλητήριο + + + Πείνα + + + Βραδύτητας + + + Γρηγοράδας + + + Αορατότητα + + + Αναπνοή στο Νερό + + + Νυχτερινή Όραση + + + Τυφλότητα + + + Πρόκλησης Βλάβης + + + Επούλωσης + + + Ναυτίας + + + Αναδημιουργίας + + + Ανίας + + + Βιασύνης + + + Αδυναμίας + + + Δύναμης + + + Πυραντοχή + + + Κορεσμός + + + Αντοχής + + + Άλματος + + + Wither + + + Ώθηση Υγείας + + + Απορρόφηση + + + + + + II + + + III + + + Αορατότητας + + + IV + + + Αναπνοής στο Νερό + + + Πυραντοχής + + + Νυχτερινής Όρασης + + + Δηλητηρίου + + + Πείνας + + + της Απορρόφησης + + + του Κορεσμού + + + της Ώθησης Υγείας + + + Τυφλότητας + + + της Αποσύνθεσης + + + Ακατέργαστο + + + Αραιό + + + Διάχυτο + + + Διαφανές + + + Γαλακτερό + + + Δυσάρεστο + + + Βουτυρένιο + + + Κρεμώδες + + + Κακοφτιαγμένο + + + Μονότονο + + + Ογκώδες + + + Ήπιο + + + Πιτσιλιστό + + + Κοινότοπο + + + Ανιαρό + + + Τολμηρό + + + Τονωτικό + + + Γοητευτικό + + + Εκλεπτυσμένο + + + Φανταχτερό + + + Λαμπερό + + + Δύσοσμο + + + Τραχύ + + + Άοσμο + + + Ισχυρό + + + Απαίσιο + + + Γλυκόπιοτο + + + Διυλισμένο + + + Παχύ + + + Κομψό + + + Αποκαθιστά σταδιακά την υγεία των παικτών, των ζώων και των τεράτων στα οποία επιδρά. + + + Χειροτερεύει αμέσως την υγεία των παικτών, των ζώων και των τεράτων στα οποία επιδρά. + + + Οι παίκτες, τα ζώα και τα τέρατα στα οποία επιδρά, αποκτούν ανοσία στις βλάβες από φωτιά, λάβα και από τις επιθέσεις παραταγμένων Blaze. + + + Δεν προκαλεί καμία επίδραση. Μπορείτε να το χρησιμοποιήσετε για να δημιουργήσετε φίλτρα σε μια βάση παρασκευής φίλτρων, προσθέτοντας περισσότερα συστατικά. + + + Στυφό + + + Επιβραδύνει την κίνηση των παικτών, των ζώων και των τεράτων στα οποία επιδρά. Επίσης, μειώνει την ταχύτητα σπριντ, το μήκος άλματος και το οπτικό πεδίο των παικτών. + + + Επιταχύνει την κίνηση των παικτών, των ζώων και των τεράτων στα οποία επιδρά. Επίσης, αυξάνει την ταχύτητα σπριντ, το μήκος άλματος και το οπτικό πεδίο των παικτών. + + + Αυξάνει τις βλάβες από την επίθεση σε παίκτες και τέρατα στα οποία επιδρά. + + + Βελτιώνει αμέσως την υγεία των παικτών, των ζώων και των τεράτων στα οποία επιδρά. + + + Μειώνει τις βλάβες από την επίθεση σε παίκτες και τέρατα στα οποία επιδρά. + + + Χρησιμοποιείται ως βάση για όλα τα φίλτρα. Χρησιμοποιήστε το σε μια βάση παρασκευής φίλτρων. + + + Αηδιαστικό + + + Βρομερό + + + Πλήγμα + + + Οξύτητα + + + Χειροτερεύει σταδιακά την υγεία των παικτών, των ζώων και των τεράτων στα οποία επιδρά. + + + Ζημιά Επίθεσης + + + Χτύπημα προς τα Πίσω + + + Εξολόθρευση των Αρθρόποδων + + + Ταχύτητα + + + Ενισχύσεις Ζόμπι + + + Δύναμη Άλματος Αλόγου + + + Όταν εφαρμόζεται: + + + Αντοχή στο Χτύπημα προς τα Πίσω + + + Εύρος παρακολούθησης mob + + + Μέγιστη Υγεία + + + Μεταξένιο Άγγιγμα + + + Αποδοτικότητα + + + Ένα με το Νερό + + + Τύχη + + + Λεηλασία + + + Άθραυστο + + + Προστασία από Φωτιά + + + Προστασία + + + Πυρανάλωμα + + + Ανάλαφρη Πτώση + + + Αναπνοή + + + Προστασία από Βλήματα + + + Προστασία από Έκρηξη + + + IV + + + V + + + VI + + + Γροθιά + + + VII + + + III + + + Φλόγα + + + Ισχύς + + + Άπειρο + + + II + + + I + + + Ενεργοποιείται όταν μια οντότητα περάσει μέσα από ένα συνδεδεμένο Σύρμα Παγίδευσης. + + + Ενεργοποιεί έναν συνδεδεμένο Γατζο Σύρματος όταν μια οντότητα περάσει από μέσα. + + + Συμπαγής τρόπος για την αποθήκευση Σμαραγδιών. + + + Μοιάζει με Σεντούκι, με τη διαφορά ότι τα αντικείμενα που τοποθετούνται σε ένα Σεντούκι του End είναι διαθέσιμα σε κάθε Σεντούκι του End που έχει ο παίκτης, ακόμη και σε διαφορετικές διαστάσεις. + + + IX + + + VIII + + + Μπορεί να εξορυχτεί με Σιδερένια ή και καλύτερη Αξίνα για τη συλλογή Σμαραγδιών. + + + X + + + Αποκαθιστά 2{*ICON_SHANK_01*} και μπορείτε να κατασκευάσετε με αυτό ένα χρυσό καρότο. Μπορεί να φυτευτεί σε αγρόκτημα. + + + Χρησιμοποιείται ως διακοσμητικό. Σε αυτό μπορείτε να φυτέψετε Λουλούδια, Βλαστάρια, Κάκτους και Μανιτάρια. + + + Τοίχος φτιαγμένος από Πέτρα Επίστρωσης. + + + Αποκαθιστά 0,5{*ICON_SHANK_01*}. Μπορεί να ψηθεί σε φούρνο ή να φυτευτεί σε αγρόκτημα. + + + Λιώνει σε φούρνο για να παράγει Χαλαζία του Nether. + + + Μπορεί να χρησιμοποιηθεί για την επισκευή όπλων, εργαλείων και πανοπλίας. + + + Μπορεί να χρησιμοποιηθεί σε συναλλαγές με χωρικούς. + + + Χρησιμοποιείται ως διακοσμητικό. + + + Αποκαθιστά 4{*ICON_SHANK_01*}. + + + Αποκαθιστά 1{*ICON_SHANK_01*}. Αν το φάτε, υπάρχει πιθανότητα να σας δηλητηριάσει. + + + Χρησιμοποιείται για να ελέγχει ένα σελωμένο γουρούνι όταν το ιππεύετε. + + + Αποκαθιστά 3{*ICON_SHANK_01*}. Δημιουργείται από το ψήσιμο μιας πατάτας σε φούρνο. + + + Αποκαθιστά 3{*ICON_SHANK_01*}. Κατασκευάζεται από ένα καρότο και ψήγματα χρυσού. + + + Χρησιμοποιείται με ένα Αμόνι για να μαγεύετε όπλα, εργαλεία ή πανοπλίες. + + + Δημιουργείται από την εξόρυξη του Μεταλλεύματος Χαλαζία του Nether. Μπορεί να χρησιμοποιηθεί στην κατασκευή ενός Κύβου Χαλαζία. + + + Πατάτα + + + Ψητή Πατάτα + + + Καρότο + + + Κατασκευάζεται από Μαλλί. Χρησιμοποιείται ως διακοσμητικό. + + + Σμαράγδι + + + Γλάστρα + + + Κολοκυθόπιτα + + + Μαγεμένο Βιβλίο + + + Δηλητηριώδης Πατάτα + + + Χρυσό Καρότο + + + Καρότο σε Ραβδί + + + Γάτζος Σύρματος + + + Σύρμα Παγίδευσης + + + Χαλαζίας του Nether + + + Μετάλλευμα Σμαραγδιών + + + Σεντούκι του End + + + Πέτρινο Τοίχος με Βρυά + + + Κύβος Σμαραγδιών + + + Πέτρινο Τοίχος + + + Πατάτες + + + Γλάστρα + + + Καρότα + + + Λίγο Χαλασμένο Αμόνι + + + Αμόνι + + + Αμόνι + + + Κύβος Χαλαζία + + + Πολύ Χαλασμένο Αμόνι + + + Μετάλλευμα Χαλαζία του Nether + + + Σκάλα Χαλαζία + + + Σμιλεμένος Χαλαζίας + + + Στήλη Κύβου Χαλαζία + + + Κόκκινο Χαλί + + + Χαλί + + + Μαύρο Χαλί + + + Μπλε Χαλί + + + Πράσινο Χαλί + + + Καφέ Χαλί + + + Μοβ Χαλί + + + Κυανό Χαλί + + + Ανοιχτό Γκρι Χαλί + + + Γκρι Χαλί + + + Ανοιχτό Πράσινο Χαλί + + + Ροζ Χαλί + + + Γαλάζιο Χαλί + + + Κίτρινο Χαλί + + + Φούξια Χαλί + + + Πορτοκαλί Χαλί + + + Λευκό Χαλί + + + Σμιλεμένος Αμμόλιθος + + + Ο/Η {*PLAYER*} σκοτώθηκε προσπαθώντας να χτυπήσει τον/την {*SOURCE*} + + + Στιλπνός Αμμόλιθος + + + Ο/Η {*PLAYER*} συνθλίφτηκε κάτω από ένα Αμόνι. + + + Ο/Η {*PLAYER*} συνθλίφθηκε κάτω από έναν κύβο. + + + Ο/Η {*PLAYER*} σας τηλεμετέφερε στη θέση του/της + + + Ο/Η {*PLAYER*} τηλεμεταφέρθηκε στον/στην {*DESTINATION*} + + + Αγκάθια + + + Ο/Η {*PLAYER*} τηλεμεταφέρθηκε σε εσάς + + + Φωτίζει τις σκοτεινές περιοχές σαν το φως της μέρας, ακόμη και κάτω από το νερό. + + + Πλάκα Χαλαζία + + + Κάνει αόρατους τους παίκτες, τα ζώα και τα τέρατα στα οποία επιδρά. + + + Επισκευή και Όνομα + + + Πολύ Ακριβό! + + + Κόστος Μαγικού: %d + + + Έχετε: + + + Μετονομασία + + + Ο/Η {*VILLAGER_TYPE*} προσφέρει %s + + + Απαιτούμενα Αντικείμενα + + + Ανταλλαγή + + + Επισκευή + + + + Αυτό είναι το περιβάλλον χρήστη Αμόνι, το οποίο μπορείτε να χρησιμοποιείτε για να μετονομάζετε, να επισκευάζετε και να εφαρμόζετε μαγικά σε όπλα, πανοπλίες ή εργαλεία, πληρώνοντας σε Επίπεδα Εμπειρίας. + + + + Βαφή κολάρου + + + + Για να αρχίσετε να εργάζεστε σε ένα αντικείμενο, τοποθετήστε το στην πρώτη υποδοχή εισερχομένων. + + + + + {*B*} + Πατήστε{*CONTROLLER_VK_A*} για να μάθετε περισσότερα σχετικά με το περιβάλλον χρήστη Αμόνι.{*B*} + Πατήστε{*CONTROLLER_VK_B*} εάν ήδη γνωρίζετε το περιβάλλον χρήστη Αμόνι. + + + + + Εναλλακτικά, μπορείτε να τοποθετήσετε ένα δεύτερο, πανομοιότυπο αντικείμενο στη δεύτερη υποδοχή, για να συνδυάσετε τα δυο αντικείμενα. + + + + + Όταν τοποθετήσετε τη σωστή πρώτη ύλη στη δεύτερη υποδοχή εισόδου (π.χ. Ράβδους Σιδήρου για ένα κατεστραμμένο Σιδερένιο Σπαθί), η προτεινόμενη επισκευή θα εμφανιστεί στην υποδοχή εξόδου. + + + + + Το κόστος της εργασίας σε Επίπεδα Εμπειρίας εμφανίζεται κάτω από την έξοδο. Αν δεν έχετε αρκετά Επίπεδα Εμπειρίας, η επισκευή δεν μπορεί να ολοκληρωθεί. + + + + + Για να μαγέψετε αντικείμενα στο Αμόνι, βάλτε ένα Μαγεμένο Βιβλίο στη δεύτερη υποδοχή εισόδου. + + + + + Η συλλογή του επιδιορθωμένου αντικειμένου θα καταναλώσει και τα δυο αντικείμενα που χρησιμοποιήθηκαν στο Αμόνι και θα μειώσει τα Επίπεδα Εμπειρίας σας κατά το αναγραφόμενο ποσό. + + + + + Μπορείτε να μετονομάσετε το αντικείμενο, αλλάζοντας το όνομα που εμφανίζεται στο πλαίσιο κειμένου. + + + + + {*B*} + Πατήστε το{*CONTROLLER_VK_A*}, για να μάθετε περισσότερα σχετικά με το Αμόνι.{*B*} + Πατήστε το{*CONTROLLER_VK_B*} αν γνωρίζετε ήδη σχετικά με το Αμόνι. + + + + + Σε αυτήν την περιοχή υπάρχει ένα Αμόνι και ένα Σεντούκι που περιέχει εργαλεία και όπλα που μπορείτε να επεξεργαστείτε. + + + + + Τα Μαγεμένα Βιβλία μπορούν να βρεθούν σε Σεντούκια μέσα σε μπουντρούμια ή να μετατραπούν από κανονικά Βιβλία σε Μαγεμένα Βιβλία, στο Τραπέζι Μαγέματος. + + + + + Χρησιμοποιώντας ένα Αμόνι, μπορείτε να επισκευάσετε τα όπλα και τα εργαλεία, ώστε να αποκαταστήσετε την αντοχή τους, να τα μετονομάσετε ή να τα μαγέψετε με Μαγεμένα Βιβλία. + + + + + Το κόστος της επισκευής θα εξαρτηθεί από τον τύπο της εργασίας, την αξία του αντικειμένου, από το πόσα μάγια έχει πάνω του το αντικείμενο, καθώς και από τις προηγούμενες επεξεργασίες. + + + + + Η χρήση του Αμονιού κοστίζει Επίπεδα Εμπειρίας και με κάθε χρήση υπάρχει πιθανότητα το Αμόνι να πάθει ζημιά. + + + + + Στο Σεντούκι αυτής της περιοχής θα βρείτε κατεστραμμένες Αξίνες, πρώτες ύλες, Μποτίλιες Μαγείας και Μαγεμένα Βιβλία, για να πειραματιστείτε. + + + + + Η μετονομασία ενός αντικειμένου αλλάζει το όνομα με το οποίο αυτό εμφανίζεται σε όλους τους παίκτες και μειώνει μόνιμα το κόστος της προηγούμενης επεξεργασίας. + + + + + {*B*} + Πατήστε το{*CONTROLLER_VK_A*}, για να μάθετε περισσότερα σχετικά με το περιβάλλον χρήστη ανταλλαγής.{*B*} + Πατήστε το{*CONTROLLER_VK_B*} αν γνωρίζετε ήδη σχετικά με το περιβάλλον χρήστη ανταλλαγής. + + + + + Αυτό είναι το περιβάλλον χρήστη ανταλλαγής, όπου εμφανίζονται οι ανταλλαγές που μπορούν να γίνουν με έναν χωρικό. + + + + + Αν δεν έχετε τα απαιτούμενα αντικείμενα, οι ανταλλαγές θα εμφανίζονται κόκκινες και θα είναι μη διαθέσιμες. + + + + + Όλες οι ανταλλαγές που θέλει προς το παρόν να κάνει ο χωρικός εμφανίζονται στην κορυφή. + + + + + Στα δυο κουτιά στην αριστερή πλευρά μπορείτε να δείτε το συνολικό αριθμό των αντικειμένων που απαιτούνται για την ανταλλαγή. + + + + + Η ποσότητα και ο τύπος των αντικειμένων που δίνετε στον χωρικό εμφανίζεται στα δυο πλαίσια στην αριστερή πλευρά. + + + + + Σε αυτήν την περιοχή υπάρχει ένας χωρικός και ένα Σεντούκι που περιέχει Χαρτί, για να αγοράσετε αντικείμενα. + + + + + Πατήστε το{*CONTROLLER_VK_A*}, για να ανταλλάξετε τα αντικείμενα που ζητά ο χωρικός με το αντικείμενο που προσφέρει. + + + + + Οι παίκτες μπορούν να ανταλλάξουν αντικείμενα από το απόθεμά τους με τους χωρικούς. + + + + + {*B*} + Πατήστε το{*CONTROLLER_VK_A*} , για να μάθετε περισσότερα σχετικά με την ανταλλαγή.{*B*} + Πατήστε το{*CONTROLLER_VK_B*} αν γνωρίζετε ήδη σχετικά με την ανταλλαγή. + + + + + Τα αντικείμενα που διαθέτει για ανταλλαγή ένας χωρικός θα αυξάνονται ή θα ενημερώνονται τυχαία, με την πραγματοποίηση μιας ποικιλίας ανταλλαγών. + + + + + Οι ανταλλαγές που μπορεί να προσφέρει ένας χωρικός εξαρτώνται από το επάγγελμά του. + + + + + Ανταλλαγές που έχουν χρησιμοποιηθεί συχνά μπορεί να καταργηθούν προσωρινά, ωστόσο ο χωρικός πάντοτε θα προσφέρει τουλάχιστον μια ανταλλαγή. + + + + + Πάρτε λίγο Χαρτί από το Σεντούκι και δοκιμάστε να κάνετε ανταλλαγή με αυτόν εδώ το χωρικό. + + + + + Σε αυτήν την περιοχή υπάρχουν δυο Σεντούκια Ender. + + + + + {*B*} + Πατήστε το{*CONTROLLER_VK_A*}, για να μάθετε περισσότερα σχετικά με τα Σεντούκια Ender.{*B*} + Πατήστε το{*CONTROLLER_VK_B*} αν γνωρίζετε ήδη σχετικά με τα Σεντούκια Ender. + + + + + Όλα τα Σεντούκια Ender που βρίσκονται σε έναν κόσμο συνδέονται, ακόμα και μεταξύ διαστάσεων. Τα αντικείμενα που τοποθετούνται σε ένα Σεντούκι Ender είναι προσβάσιμα σε οποιοδήποτε άλλο Σεντούκι Ender. + + + + + Ωστόσο, τα περιεχόμενα των Σεντουκιών Ender είναι διαφορετικά για κάθε παίκτη. + + + + + Αυτό επιτρέπει στους παίκτες να αποθηκεύουν αντικείμενα σε οποιοδήποτε Σεντούκι Ender και να τα ανακτούν από άλλα Σεντούκια Ender, σε διαφορετικά μέρη του κόσμου. Μπορείτε να δοκιμάσετε αμέσως αυτήν τη δυνατότητα, τοποθετώντας αντικείμενα σε οποιοδήποτε Σεντούκι Ender. + + + + Αποκαθιστά 2{*ICON_SHANK_01*}, αναγεννά την υγεία για 30 δευτερόλεπτα και δίνει αντίσταση στη φωτιά και στη ζημιά για 5 λεπτά. Κατασκευάζεται από ένα μήλο και μπλοκ χρυσού. + + + Δυνατότητα Τηλεμεταφοράς + + + Τηλεμεταφορά + + + Τηλεμεταφορά στον Παίκτη + + + Τηλεμεταφορά σε Εμένα + + + Δυνατότητα Απενεργ. της Εξάντλησης + + + Δυνατότητα Αόρατου + + + Μπορείτε πλέον να ενεργοποιήσετε την αορατότητα + + + Δεν μπορείτε πλέον να ενεργοποιήσετε την αορατότητα + + + Μπορείτε πλέον να ενεργοποιήσετε την πτήση + + + Δεν μπορείτε πλέον να ενεργοποιήσετε την πτήση + + + Μπορείτε πλέον να απενεργοποιήσετε την εξάντληση + + + Δεν μπορείτε πλέον να απενεργοποιήσετε την εξάντληση + + + Μπορείτε πλέον να τηλεμεταφερθείτε + + + Δεν μπορείτε πλέον να τηλεμεταφερθείτε + + + {*T3*}ΤΡΟΠΟΣ ΠΑΙΧΝΙΔΙΟΥ : ΑΜΟΝΙ{*ETW*}{*B*}{*B*} +Μπορείτε να χρησιμοποιήσετε τα Επίπεδα Εμπειρίας για να επισκευάσετε, να μαγέψετε ή να μετονομάσετε αντικείμενα με το Αμόνι.{*B*} +Όλα τα αντικείμενα μπορούν να μετονομαστούν, αν και μόνο αντικείμενα που διαθέτουν αντοχή μπορούν να επισκευαστούν ή να μαγευτούν από Μαγεμένα Βιβλία.{*B*} +Για να επισκευάσετε ένα αντικείμενο, τοποθετήστε το σε μία από τις υποδοχές εισόδου στα αριστερά, μαζί με μερικές από τις πρώτες ύλες του αντικειμένου, όπως Ράβδους Σιδήρου για το Σιδερένιο Σπαθί ή σε συνδυασμό με ένα ακόμη αντικείμενο του ίδιου τύπου.{*B*} +Ο συνδυασμός αντικειμένων είναι πιο αποτελεσματικός όταν γίνεται με ένα Αμόνι και, επιπλέον, αν κάποιο από τα αντικείμενα ήταν μαγεμένο, το τελικό προϊόν μπορεί να έχει δεχτεί μάγια από οποιαδήποτε από τα αντικείμενα εισόδου.{*B*} +Τα Μαγεμένα Βιβλία μπορούν να μαγέψουν αντικείμενα συνδυάζοντάς τα σε ένα Αμόνι, αν τα μάγια του Βιβλίου είναι κατάλληλα. Τα Μαγεμένα Βιβλία μπορούν να βρεθούν σε Σεντούκια μέσα σε μπουντρούμια ή να μετατραπούν από κανονικά Βιβλία σε Μαγεμένα βιβλία, στο Τραπέζι Μαγέματος.{*B*} +Με κάθε χρήση, υπάρχει πιθανότητα το Αμόνι να παθαίνει ζημιά και μετά από αρκετή ταλαιπωρία θα καταστραφεί.{*B*} + + + + {*T3*}ΤΡΟΠΟΣ ΠΑΙΧΝΙΔΙΟΥ : ΑΝΤΑΛΛΑΓΗ{*ETW*}{*B*}{*B*} +Μπορείτε να ανταλλάξετε αντικείμενα με τους χωρικούς. Κάθε χωρικός έχει το επάγγελμά του: μπορεί να είναι Αγρότης, Χασάπης, Σιδεράς, Βιβλιοθηκάριος ή Ιερέας. Αυτό επηρεάζει τον τύπο αντικειμένων που μπορεί να ανταλλάξει μαζί σας.{*B*} +Στο μενού ανταλλαγής μπορείτε να βρείτε μια λίστα με όλα τα αντικείμενα που προσφέρει ένας χωρικός. Ένας χωρικός μπορεί να τροποποιήσει ή να αυξήσει τα αντικείμενα που ανταλλάσσει όποτε ο παίκτης κάνει ανταλλαγή μαζί του, ωστόσο μια ανταλλαγή μπορεί να απενεργοποιηθεί προσωρινά, αν χρησιμοποιείται υπερβολικά συχνά.{*B*} +Οι ανταλλαγές συχνά περιλαμβάνουν την αγορά ή πώληση ορισμένων αντικειμένων με αντάλλαγμα σμαράγδια.{*B*} +Αν δεν έχετε τα αντικείμενα που απαιτούνται για μια ανταλλαγή, αυτά εμφανίζονται κόκκινα.{*B*} + + + + {*T3*}ΤΡΟΠΟΣ ΠΑΙΧΝΙΔΙΟΥ : ΣΕΝΤΟΥΚΙ ENDER {*ETW*}{*B*}{*B*} +Όλα τα Σεντούκια Ender ενός κόσμου συνδέονται μεταξύ τους. Τα αντικείμενα που τοποθετούνται σε ένα Σεντούκι Ender είναι προσβάσιμα σε οποιοδήποτε άλλο Σεντούκι. Ωστόσο, τα περιεχόμενα των Σεντουκιών Ender είναι διαφορετικά για κάθε παίκτη. Αυτό επιτρέπει στους παίκτες να αποθηκεύουν αντικείμενα σε οποιοδήποτε Σεντούκι Ender και να τα ανακτούν από άλλα Σεντούκια Ender, σε διαφορετικά μέρη του κόσμου. + + + + Αγρότης + + + Βιβλιοθηκάριος + + + Ιερέας + + + Σιδεράς + + + Χασάπης + + + Οι χωρικοί βρίσκονται στα χωριά και θα προσφέρουν στον παίκτη αντικείμενα προς πώληση, ανάλογα με το επάγγελμά τους. + + + Μεγάλο Σεντούκι + + + + Μπορείτε επίσης να δημιουργήσετε Μαγεμένα Βιβλία στο Τραπέζι Μαγέματος. Μπορείτε να τα χρησιμοποιήσετε αργότερα στο Αμόνι, για να μεταδώσετε τα μάγια τους σε ένα αντικείμενο. + + + + + Οι Γάτζοι Σύρματος παρέχουν συνεχώς ρεύμα σε ένα κύκλωμα, όταν κάτι ενεργοποιήσει το νήμα που βρίσκεται τεντωμένο μεταξύ τους. + + + + + Αφού εξημερωθεί, ένας λύκος θα φορά πάντα το περιλαίμιό του. Μπορείτε να αλλάξετε το χρώμα του περιλαίμιου βάφοντάς το. + + + + Τα Καρότα και οι Πατάτες καλλιεργούνται φυτεύοντας Καρότα και Πατάτες και είναι έτοιμα για συγκομιδή όταν το λαχανικό ξεπροβάλει από το έδαφος. + + + + Επιπλέον, οι παίκτες μπορούν να σελώσουν και να καβαλικέψουν τα γουρούνια. Μπορούν να ελεγχθούν δελεάζοντάς τα με ένα Καρότο σε Ραβδί. + + + + + Αν χρειάζεται, μπορείτε να κινήσετε αργά το βαγόνι ορυχείου σας χρησιμοποιώντας το{*CONTROLLER_ACTION_MOVE*}. Έτσι μπορείτε ευκολότερα να βάλετε μπρος το βαγόνι ορυχείου, τοποθετώντας το πάνω σε μια ράγα που έχει ρεύμα. + + + + Δεν μπορείτε να συμμετάσχετε σε αυτό το παιχνίδι, επειδή η διαχωρισμένη οθόνη υποστηρίζεται μόνο σε λειτουργία Υψηλής Ευκρίνειας. Αποσυνδέστε όλους τους υπόλοιπους παίκτες, αν θέλετε να συμμετάσχετε. + + + Θεραπεία + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/el-EL/stringsLeaderboards.xml b/Minecraft.Client/PSVitaMedia/loc/el-EL/stringsLeaderboards.xml new file mode 100644 index 00000000..264aff8d --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/el-EL/stringsLeaderboards.xml @@ -0,0 +1,48 @@ + + + + Φόνοι Εύκολο + + + Φόνοι Κανονικό + + + Φόνοι Δύσκολο + + + Εξόρυξη Κύβων Γαλήνιο + + + Εξόρυξη Κύβων Εύκολο + + + Εξόρυξη Κύβων Κανονικό + + + Εξόρυξη Κύβων Δύσκολο + + + Καλλιέργεια Γαλήνιο + + + Καλλιέργεια Εύκολο + + + Καλλιέργεια Κανονικό + + + Καλλιέργεια Δύσκολο + + + Ταξίδι Γαλήνιο + + + Ταξίδι Εύκολο + + + Ταξίδι Κανονικό + + + Ταξίδι Δύσκολο + + \ 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 new file mode 100644 index 00000000..0ed041b3 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/el-EL/stringsPlatformSpecific.xml @@ -0,0 +1,246 @@ + + + + Θέλετε να συνδεθείτε στο "PSN"; + + + Για τους παίκτες που δεν βρίσκονται στο ίδιο σύστημα PlayStation®Vita με τον οικοδεσπότη, εάν ορίσετε αυτή την επιλογή θα αποβάλλετε τον παίκτη από το παιχνίδι και τυχόν άλλους παίκτες στο σύστημα PlayStation®Vita του. Αυτός ο παίκτης δεν θα μπορεί να συμμετέχει μέχρι να ξεκινήσει ξανά το παιχνίδι. + + + SELECT + + + Αυτή η επιλογή απενεργοποιεί τα τρόπαια και τις ενημερώσεις πίνακα κατάταξης για αυτόν τον κόσμο κατά τη διάρκεια του παιχνιδιού, καθώς και σε περίπτωση επαναφόρτωσης του παιχνιδιού που έχει αποθηκευτεί με αυτήν τη λειτουργία ενεργοποιημένη. + + + σύστημα PlayStation®Vita + + + Επιλέξτε μια σύνδεση Ad Hoc για να συνδεθείτε με άλλα κοντινά συστήματα PlayStation®Vita ή με το "PSN" για να συνδεθείτε με φίλους από όλο τον κόσμο. + + + Δίκτυο Ad Hoc + + + Αλλαγή Λειτουργίας δικτύου + + + Επιλογή Λειτουργίας δικτύου + + + Διαδικτυακά 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*} +Το περιβάλλον χρήστη της λειτουργίας δημιουργίας δίνει τη δυνατότητα μεταφοράς οποιουδήποτε αντικειμένου του παιχνιδιού στο απόθεμα του παίκτη, χωρίς να χρειάζεται κατασκευή ή εξόρυξη του αντικειμένου. +Τα αντικείμενα δεν καταργούνται από το απόθεμα του παίκτη όταν τοποθετούνται ή χρησιμοποιούνται στον κόσμο και αυτό επιτρέπει στον παίκτη να επικεντρωθεί στο χτίσιμο και όχι στη συλλογή πόρων.{*B*} +Αν δημιουργήσετε, φορτώσετε ή αποθηκεύσετε έναν κόσμο στη Λειτουργία Δημιουργίας, τα τρόπαια και οι ενημερώσεις πίνακα κατάταξης θα είναι απενεργοποιημένα σε αυτόν τον κόσμο, ακόμα και αν έπειτα φορτωθεί στη Λειτουργία Επιβίωσης.{*B*} +Για να πετάξετε όταν βρίσκεστε στη Λειτουργία Δημιουργίας, πατήστε το{*CONTROLLER_ACTION_JUMP*} δύο φορές γρήγορα. Για να εγκαταλείψετε την πτήση, επαναλάβετε την ενέργεια. Για να πετάξετε γρηγορότερα, πιέστε γρήγορα και διαδοχικά το{*CONTROLLER_ACTION_MOVE*} προς τα εμπρός δύο φορές ενώ πετάτε. +Όταν βρίσκεστε σε λειτουργία πτήσης, μπορείτε να κρατήσετε πατημένο το{*CONTROLLER_ACTION_JUMP*} για κίνηση προς τα πάνω και το{*CONTROLLER_ACTION_SNEAK*} για κίνηση προς τα κάτω ή να χρησιμοποιήσετε το{*CONTROLLER_ACTION_DPAD_UP*} για κίνηση προς τα πάνω, το{*CONTROLLER_ACTION_DPAD_DOWN*} για κίνηση προς τα κάτω, +το{*CONTROLLER_ACTION_DPAD_LEFT*} για κίνηση προς τα αριστερά και το{*CONTROLLER_ACTION_DPAD_RIGHT*} για κίνηση προς τα δεξιά. + + + Για να μπορέσετε να πετάξετε, πατήστε το{*CONTROLLER_ACTION_JUMP*} δυο φορές γρήγορα. Για να εγκαταλείψετε την πτήση, επαναλάβετε την ενέργεια. Για να πετάξετε γρηγορότερα, πιέστε γρήγορα και διαδοχικά το{*CONTROLLER_ACTION_MOVE*} προς τα εμπρός δύο φορές ενώ πετάτε. +Όταν βρίσκεστε σε λειτουργία πτήσης, μπορείτε να κρατήσετε πατημένο το{*CONTROLLER_ACTION_JUMP*} για κίνηση προς τα πάνω και το{*CONTROLLER_ACTION_SNEAK*} για κίνηση προς τα κάτω ή να χρησιμοποιήσετε τα κατευθυντικά πλήκτρα για να κινηθείτε προς τα πάνω, κάτω, αριστερά ή δεξιά. + + + «ΔΕΝ ΧΡΗΣΙΜΟΠΟΙΕΤΑΙ» + + + Αν δημιουργήσετε, φορτώσετε ή αποθηκεύσετε έναν κόσμο στη Λειτουργία Δημιουργίας, τα τρόπαια και οι ενημερώσεις πίνακα κατάταξης θα είναι απενεργοποιημένα σε αυτόν τον κόσμο, ακόμα και αν έπειτα φορτωθεί στη Λειτουργία Επιβίωσης. Είστε βέβαιοι ότι θέλετε να συνεχίσετε; + + + Αυτός ο κόσμος αποθηκεύτηκε προηγουμένως στη Λειτουργία Δημιουργίας και τα τρόπαια και οι ενημερώσεις πίνακα κατάταξης θα είναι απενεργοποιημένα σε αυτόν. Είστε βέβαιοι ότι θέλετε να συνεχίσετε; + + + «ΔΕΝ ΧΡΗΣΙΜΟΠΟΙΕΤΑΙ» + + + Πρόσκληση Φίλων + + + Το 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" χάθηκε. Έξοδος στο κύριο μενού. + + + Η σύνδεση με το "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". +Θέλετε να ξεκλειδώσετε το πλήρες παιχνίδι; + + + Αυτό είναι το δοκιμαστικό παιχνίδι του Minecraft: PlayStation®Vita Edition. Για να μπορέσετε να αποδεχτείτε αυτήν την πρόσκληση, χρειάζεστε το πλήρες παιχνίδι. +Θέλετε να ξεκλειδώσετε το πλήρες παιχνίδι; + + + Το αποθηκευμένο αρχείο στην περιοχή μεταφοράς αποθηκευμένων παιχνιδιών διαθέτει αριθμό έκδοσης που δεν υποστηρίζεται ακόμα από το Minecraft: PlayStation®Vita Edition. + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/el-EL/stringsRichPresence.xml b/Minecraft.Client/PSVitaMedia/loc/el-EL/stringsRichPresence.xml new file mode 100644 index 00000000..f03b52a6 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/el-EL/stringsRichPresence.xml @@ -0,0 +1,66 @@ + + + + {GAME_STATE} + + + Σε αδράνεια + + + Στα μενού + + + Παίζοντας Παιχνίδι για Πολλούς Παίκτες - {GAME_STATE} + + + Εκτός Σύνδεσης Παιχνιδιού για Πολλούς Παίκτες - {GAME_STATE} + + + Παίζοντας Μόνος - {GAME_STATE} + + + Εκτός Σύνδεσης Μόνος - {GAME_STATE} + + + Απολαμβάνοντας τη θέα! + + + Καβάλα σε ένα γουρουνάκι + + + Καβάλα σε ένα βαγόνι ορυχείου + + + Σε ένα σκάφος + + + Ψάρεμα + + + Κατασκευή + + + Σφυρηλάτηση + + + Στο Nether + + + Ακρόαση δίσκου + + + Μελέτη χάρτη + + + Μαγεία + + + Παρασκευή φίλτρου + + + Χρήση του Αμονιού + + + Γνωριμία με τους γείτονες + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/es-ES/4J_stringsGeneric.xml b/Minecraft.Client/PSVitaMedia/loc/es-ES/4J_stringsGeneric.xml new file mode 100644 index 00000000..1c323a97 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/es-ES/4J_stringsGeneric.xml @@ -0,0 +1,87 @@ + + + + Aceptar + + + Atrás + + + Cancelar + + + + + + No + + + Archivo dañado + + + Parece que tus datos guardados están dañados. ¿Crear un nuevo archivo guardado y sobrescribir el archivo dañado? + + + Sin espacio libre + + + Volver a seleccionar + + + Jugar sin guardar + + + Crear nuevo archivo guardado + + + ¿Sobrescribir archivo guardado? + + + No, no sobrescribir. + + + Sobrescribir y guardar. + + + Error al guardar + + + Continuar sin guardar + + + Error al cargar + + + Poner nombre al archivo guardado + + + Escribe un nombre para tu archivo guardado. + + + ¿Seguro que quieres salir de la partida? + + + Sesión cerrada + + + Seguir jugando + + + Seguir jugando sin conexión + + + Jugador invitado + + + Los jugadores invitados no pueden acceder a "PSN". + + + Guardando… + + + Guardando contenido. No apagues el sistema. + + + Juego completo + + \ 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 new file mode 100644 index 00000000..29e24102 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/es-ES/4J_stringsPlatformSpecific.xml @@ -0,0 +1,50 @@ + + + + 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 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 new file mode 100644 index 00000000..e05b351f --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/es-ES/AdditionalStrings.xml @@ -0,0 +1,96 @@ + + + + Mostrar todos los mundos mezclados + + + Ocultar + + + Minecraft: PlayStation®3 Edition + + + Opciones + + + Guardar caché + + + Ha ocurrido un error de red. + + + Error de red + + + Se ha producido un error de red. Saliendo al menú principal. + + + Debido a restricciones de chat, se ha desactivado la función online de tu cuenta Sony Entertainment Network. + + + Debido a ajustes de control paterno, se ha desactivado el servicio online de tu cuenta Sony Entertainment Network. + + + Servicio online + + + Se ha cerrado tu sesión de "PSN". Las opciones online del juego no estarán disponibles hasta que vuelvas a iniciar sesión en "PSN". + + + Se ha cerrado tu sesión de "PSN". Las opciones online del juego no estarán disponibles hasta que vuelvas a iniciar sesión en "PSN". Saliendo al menú principal. + + + Elige usuario para jugador %d (o cancela el jugar como invitado) + + + Gratis + + + 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. + + + Trofeos desactivados + + + Los trofeos se desactivarán porque este progreso guardado pertenece a otro usuario. + + + Error crítico: no se han podido inicializar los trofeos. Por favor, sal del juego. + + + Invitaciones + + + Archivo dañado + + + Mando desconectado + + + El mando está desconectado. Por favor, vuelve a conectarlo. + + + 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. + + + Invitación + + + ¡Ven a jugar una partida de Minecraft: PlayStation®Vita Edition! + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/es-ES/EULA.xml b/Minecraft.Client/PSVitaMedia/loc/es-ES/EULA.xml new file mode 100644 index 00000000..808e19bc --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/es-ES/EULA.xml @@ -0,0 +1,96 @@ + + + + Minecraft: PlayStation®Vita Edition - CONDICIONES DE USO + Estas condiciones enumeran algunas normas para el uso de Minecraft: PlayStation®Vita Edition ("Minecraft"). Con el fin de proteger Minecraft y a los miembros de nuestra comunidad, necesitamos estas condiciones para establecer reglas sobre la descarga y el uso de Minecraft. Nos gustan las normas tan poco como a ti, así que hemos procurado que este documento sea lo más breve posible, pero si compras, descargas, usas o juegas a Minecraft, aceptas ceñirte a estas condiciones ("Condiciones"). + Antes de empezar, hay una cosa que queremos dejar muy clara. Minecraft es un juego que permite a los jugadores construir y destruir cosas. Si juegas con otras personas (multijugador), puedes construir con ellos o destruir lo que han construido, y ellos pueden hacer lo mismo contigo. Así pues, no juegues con otras personas si no se comportan como tú quieres. Además, a veces la gente hace cosas que no debería hacer. No nos gusta, pero no podemos hacer gran cosa para impedirlo, excepto pedirle a todo el mundo que se porte correctamente. Confiamos en ti y en el resto de la comunidad para que nos informéis si alguien no se comporta como es debido. Si se da el caso, o crees que alguien está quebrantando las reglas o estas Condiciones o está usando Minecraft de un modo inapropiado, por favor, avísanos. Tenemos un sistema de avisos para eso, así que utilízalo y haremos lo que sea necesario para solucionar el problema. + Para informar de cualquier problema, envíanos un email a support@mojang.com y danos toda la información que puedas, como los datos del usuario y los detalles de lo sucedido. + Ahora volvamos a las Condiciones: + UNA REGLA IMPORTANTE + La regla más importante es que no debes distribuir nada que hayamos hecho nosotros. Con "distribuir nada que hayamos hecho nosotros" queremos decir "regalar copias de Minecraft, usarlo con fines comerciales, ganar dinero con él o dar acceso a otras personas a Minecraft y sus partes de una forma injusta o no razonable". Así pues, la regla principal es que (a menos que lo aceptemos específicamente, como en Brand and Asset Usage Guidelines, nuestras guías de uso de marca y activos) no debes: + • dar copias de Minecraft a nadie; + • usar con fines comerciales nada de lo que hemos hecho; + • intentar ganar dinero con nada de lo que hemos hecho; o + • dar acceso a otras personas a nada de lo que hemos hecho de una forma injusta o no razonable. + Para que quede meridianamente claro, lo que hemos hecho incluye, aunque no se limita a, el cliente y el software de servidor de Minecraft. También incluye las versiones modificadas del juego, partes de él o cualquier otra cosa que hayamos hecho nosotros. + Por lo demás, puedes hacer lo que quieras - de hecho, te animamos a que hagas cosas interesantes (ver abajo) - pero no hagas lo que te decimos que no puedes hacer. + USAR MINECRAFT + • Has comprado Minecraft. Ahora puedes usarlo personalmente en tu sistema PlayStation®Vita. + • Más abajo también te damos derechos limitados a hacer otras cosas, pero tenemos que trazar una línea en algún sitio o la gente puede ir demasiado lejos. Si quieres hacer algo relacionado con algo que hemos hecho nosotros, es un honor, pero asegúrate de que no se pueda interpretar como algo oficial, de que cumpla estas Condiciones, y sobre todo no uses con fines comerciales nada que hayamos hecho nosotros. + • El permiso que te damos para usar y jugar a Minecraft puede ser revocado si incumples estas Condiciones. + • Al comprar Minecraft, te damos permiso para instalar Minecraft en tu sistema PlayStation®Vita y usarlo y jugarlo en ese sistema PlayStation®Vita según se indica en estas Condiciones. Este permiso es personal para ti, así que no puedes distribuir Minecraft (ni ninguna parte de él) a ninguna otra persona (excepto si te lo permitimos de forma expresa). + • Eres libre para hacer lo que quieras con imágenes y vídeos de Minecraft, dentro de lo razonable. Con "dentro de lo razonable" queremos decir que no puedes hacer un uso comercial de ellos ni hacer cosas injustas o que afecten negativamente a nuestros derechos. Tampoco copies elementos gráficos para distribuirlos por ahí, eso no tiene gracia. + • En esencia, la norma básica es no hacer uso comercial de nada que hayamos hecho nosotros, a menos que lo aceptemos específicamente, en nuestras guías de uso de marca y activos o en estas Condiciones. Ah, y si las leyes lo permiten expresamente, como en una doctrina de "uso legítimo", también está bien, pero solo hasta los límites que indique la ley. + PROPIEDAD DE MINECRAFT Y OTRAS COSAS + • Aunque te damos permiso para jugar a Minecraft, seguimos siendo sus propietarios. También somos propietarios de nuestras marcas y de todo el contenido de Minecraft, que está compuesto por nuestro software, texturas, activos, herramientas, infraestructura y otro montón de cosas ingeniosas (y no tan ingeniosas) de las que somos propietarios. Todos nuestros derechos sobre esas cosas están confirmados y reservados, pero puedes usarlas siguiendo estas Condiciones. + • Eso no significa que seamos propietarios de las cosas que crees usando Minecraft: solo tienes que aceptar que somos propietarios de cada parte de Minecraft y de Minecraft como producto y servicio y esas cosas mencionadas en la frase anterior, y también somos propietarios del copyright y demás derechos de propiedad intelectual asociados a esas cosas y los nombres y marcas asociados a Minecraft. + • Lógicamente, vas a crear tus propias cosas al usar Minecraft. No somos propietarios del material original que crees y no reclamamos ningún derecho de propiedad sobre cosas que no nos correspondan. No obstante, seremos propietarios de las cosas que sean copias (o copias sustanciales) o derivados de nuestra propiedad y nuestras creaciones (antes expuestas), pero si creas cosas originales no serán nuestras. Por ejemplo: + - un solo bloque – eso es nuestro; + - una catedral gótica atravesada por una montaña rusa – eso no es nuestro. + • Por tanto, cuando pagas por el uso de Minecraft, solo compras un permiso para usar el producto Minecraft según estas Condiciones. Los únicos permisos que tienes en relación con Minecraft son los permisos expuestos en estas Condiciones. + CONTENIDO + • Si pones contenido a disposición del público en o a través de Minecraft, debes darnos permiso para usar, copiar, modificar y adaptar ese contenido. Este permiso ha de ser irrevocable y sin restricciones. También debes dejar que permitamos a otras personas usar tu contenido y debes permitir utilizarlo a las otras personas a quienes hayas concedido acceso a él (por ejemplo, las personas con quienes juegues partidas multijugador). + • Piénsalo detenidamente antes de poner cualquier contenido a disposición general, porque puede hacerse público y otras personas podrían utilizarlo de un modo que no te guste. + • Si vas a poner algo a disposición general en o a través de Minecraft, no debe ser ofensivo o ilegal, debe ser honrado y debe ser de tu propia creación. Los tipos de cosas que no debes poner a disposición general usando Minecraft incluyen: publicaciones que incluyan términos racistas u homófobos; publicaciones que supongan acoso o maltrato; publicaciones que puedan dañar nuestra reputación o la de terceros; publicaciones que incluyan pornografía, publicidad o creaciones o imágenes de otras personas; o publicaciones que suplanten a un moderador o intenten engañar o explotar a la gente. + • Todo el contenido que pongas a disposición general en Minecraft también debe ser de tu creación. No debes poner ningún contenido a disposición general, usando Minecraft, que infrinja los derechos de nadie. Si publicas contenido en Minecraft y alguien nos denuncia, amenaza o demanda porque el contenido infringe los derechos de esa persona, podemos considerarte responsable, y eso significa que tendrías que pagarnos por los daños que suframos como resultado. Por tanto, es muy importante que solo pongas a disposición general contenidos que hayas creado tú y que no lo hagas con contenidos creados por otros. + • Ten cuidado con quién juegas. Es difícil tanto para ti como para nosotros saber con seguridad si lo que la gente dice es verdad, o incluso si son quienes dicen ser. También deberías evitar dar información sobre ti mismo a través de Minecraft. + Si vas a poner contenidos ("tus contenidos") a disposición general usando Minecraft, estos deben: + - cumplir todas las normas de Sony Computer Entertainment, incluyendo el Acuerdo de usuario y los Términos de servicio de “PSN”, y cualesquiera otras normas que debas aceptar para usar tu sistema PlayStation®Vita y "PSN"; + - no ser ofensivas para otras personas; + - no ser ilegales; + - ser honradas y no confundir, engañar o explotar a otras personas, ni suplantarlas; + - no infringir copyrights u otros derechos de terceros; + - no ser racistas, sexistas u homófobos; + - no suponer acoso o maltrato; + - no dañar nuestra reputación o la de terceros; + - no incluir pornografía; + - no incluir publicidad. + - No debes poner ningún contenido a disposición general usando Minecraft que infrinja los derechos de nadie. + • Eres responsable de todo el contenido que pongas a disposición general usando Minecraft. + • Al poner tu contenido a disposición general, afirmas y nos comunicas que tienes derecho a hacerlo según estas Condiciones y que podemos ejercer los derechos que nos has concedido según estas Condiciones. + • Si alguien nos denuncia, amenaza o demanda por contenidos que pongas a disposición general usando Minecraft o que haya sido puesto a disposición general por alguien en o a través de Minecraft, dicho contenido puede ser eliminado, puedes ser considerado responsable y puede que tengas que compensarnos por los daños que suframos como resultado. Tu acceso a ciertos aspectos de Minecraft también podría anularse o suspenderse. + CONTENIDOS DE USUARIOS + Aquí se establecen algunas condiciones relativas a tu contenido y al contenido puesto a disposición general por otras personas, lo que denominaremos sencillamente "contenidos de usuarios". Minecraft es un servicio de entretenimiento, y por tanto nosotros y los titulares de nuestra licencia (como Sony Computer Entertainment) participamos en la transmisión, distribución, almacenamiento y recuperación de contenidos de usuarios sin revisión, selección o alteración del contenido. Esto significa que no revisamos los contenidos de usuarios y por tanto no sabemos qué ponéis en circulación tú u otras personas. Incluimos estas normas en las Condiciones para que tú y otras personas tengáis que cumplirlas, pero no podemos saber todo lo que sucede. + Por tanto, ten en cuenta: + • las opiniones expresadas en contenidos de usuarios son las opiniones de sus autores o creadores individuales, no las nuestras o las de nadie conectado con nosotros, a menos que especifiquemos lo contrario; + • no somos responsables de (y no ofrecemos garantías ni representación en relación con y rechazamos toda responsabilidad por) todos los contenidos de usuarios, incluidos comentarios, opiniones o afirmaciones expresados en ellos; + • al usar Minecraft, aceptas que no tenemos la responsabilidad de revisar el contenido de ningún contenido de usuario y que todos los contenidos de usuarios se ponen a disposición general teniendo en cuenta que no se nos exige ejercer ni ejercemos ningún control o juicio sobre ellos. + NO OBSTANTE, nosotros (o los titulares de nuestra licencia, como Sony Computer Entertainment) podemos anular, rechazar o suspender el acceso a cualquier contenido de usuario y anular o suspender tu capacidad para publicar, poner a disposición general o acceder a contenidos de usuarios, incluyendo la anulación o suspensión del acceso a Minecraft o "PSN" si lo consideramos apropiado, porque hayas quebrantado estas Condiciones o hayamos recibido una queja. También actuaremos de forma expeditiva para anular o desactivar el acceso a contenidos de usuarios cuando tengamos conocimiento real de su ilegalidad. + ACTUALIZACIONES + • Puede que pongamos a vuestra disposición mejoras o actualizaciones de vez en cuando, pero no tenemos que hacerlo. Tampoco tenemos la obligación de ofrecer soporte o mantenimiento continuos de ningún juego. Por supuesto, esperamos seguir lanzando nuevas actualizaciones de Minecraft, pero no podemos garantizar que lo haremos. + NUESTRA RESPONSABILIDAD + • Cuando compras un ejemplar de Minecraft, te lo proporcionamos "tal cual". Las mejoras y actualizaciones también se proporcionan "tal cual". Esto significa que no hacemos ninguna promesa sobre el estándar o la calidad de Minecraft ni prometemos que no sufrirá interrupciones, que esté libre de errores o por cualquier pérdida o daño que pueda causar. Solo prometemos ofrecer Minecraft y demás servicios con habilidad y atención razonables. En la mayoría de los países, las leyes dicen que no podemos rechazar responsabilidades por muertes o daños personales causados por nuestra negligencia, así que si tu ordenador se levanta y te apuñala debido a algo que hayamos hecho mal, aceptaremos nuestras culpas. + NO SOMOS RESPONSABLES POR: + • CUALQUIER USO DEBIDO O INDEBIDO DE MINECRAFT POR TU PARTE O POR PARTE DE OTRAS PERSONAS; + • CUALQUIER CONTENIDO PUESTO A DIPOSICIÓN GENERAL POR TI USANDO MINECRAFT; + • CUALQUIER INCUMPLIMIENTO DE ESTAS CONDICIONES POR TU PARTE; + • CUALQUIER INCUMPLIMIENTO DE CUALQUIER CONDICIÓN POR PARTE DE OTRAS PERSONAS. + CANCELACIÓN + • Si queremos, podemos cancelar tu derecho a usar Minecraft si incumples estas Condiciones. Tú también puedes cancelarlo en cualquier momento: solo tienes que desinstalar Minecraft de tu sistema PlayStation®Vita. En cualquier caso, los párrafos sobre "Propiedad de Minecraft", "Nuestra responsabilidad" y "Términos generales" seguirán aplicándose incluso después de la cancelación. + TÉRMINOS GENERALES + • Estas Condiciones están sujetas a los derechos legales que puedas poseer. Ninguna de estas Condiciones limita ninguno de tus derechos que no pueda excluirse legalmente, ni excluye o limita nuestra responsabilidad por muertes o daños personales resultados de nuestra negligencia, ni representaciones ilícitas. + • También podemos cambiar estas Condiciones de vez en cuando, pero esos cambios solo se harán efectivos hasta el punto que permita la ley. Por ejemplo, si solo usas Minecraft en el modo para un jugador y no usas las actualizaciones que ponemos a tu disposición, entonces se aplican las Condiciones antiguas, pero si usas las actualizaciones o usas partes de Minecraft que dependen de nuestro suministro continuado de servicios online, entonces se aplican las Condiciones nuevas. En ese caso, puede que no podamos / tengamos que comunicarte los cambios para que estos tengan efecto, así que deberías volver aquí de vez en cuando para ser consciente de los cambios en estas Condiciones. No vamos a ser injustos con este tema, pero a veces las leyes cambian o alguien hace algo que afecta a otros usuarios de Minecraft y tenemos que ponerle solución. + • Si nos haces una sugerencia sobre Minecraft o cualquiera de nuestros juegos, esa sugerencia se hace de forma gratuita. Esto significa que podemos usar tu sugerencia del modo que queramos y no tenemos que pagarte por ella. Si crees que tienes una sugerencia por la que estaríamos dispuestos a pagar, debes decirnos que esperas un pago antes de hacernos la sugerencia. + • Además de estas Condiciones, también tenemos unas guías de uso de marca y activos que puedes encontrar online. + • Si incumples estas normas, nosotros (o Sony Computer Entertainment) podemos impedir que uses Minecraft. Si no quieres o no puedes aceptar estas normas, no debes comprar, descargar, usar ni jugar a Minecraft. + Si tienes alguna duda legal que no esté respondida en esta página, no lo hagas y pregúntanos. Básicamente, no hagas tonterías y nosotros tampoco las haremos. + Somos: + Mojang AB + Maria Skolgata 83, + SE-11853 + Estocolmo + Suecia + Número de organización: 556819-2388 + + + + + Todo el contenido adquirido en la tienda del juego se comprará a Sony Network Entertainment Europe Limited ("SNEE") y estará sujeto al Acuerdo de usuario y los Términos de servicio de Sony Entertainment Network disponibles en PlayStation®Store. Por favor, revisa los derechos de uso de cada adquisición, pues pueden variar en cada artículo. A menos que se indique lo contrario, el contenido disponible en cualquier tienda de un juego tiene la misma clasificación por edades que el propio juego. + + + La adquisición y el uso de artículos están sujetos al Acuerdo de usuario y los Términos de servicio de "PSN". Este servicio online te ha sido ofrecido bajo licencia por Sony Computer Entertainment America. + + + Recuerda: el uso de este software está sujeto a los Términos de uso del Software recogidos en eu.playstation.com/legal. + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/es-ES/stringsDynafont.xml b/Minecraft.Client/PSVitaMedia/loc/es-ES/stringsDynafont.xml new file mode 100644 index 00000000..dca31ec2 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/es-ES/stringsDynafont.xml @@ -0,0 +1,7 @@ + + + + DynaFont developed by DynaComware. + + + \ 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 new file mode 100644 index 00000000..67c081f9 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/es-ES/stringsGeneric.xml @@ -0,0 +1,6765 @@ + + + + Cambiando a juego sin conexión + + + Espera mientras el anfitrión guarda la partida. + + + Entrando en El Fin + + + Guardando jugadores + + + Conectando al anfitrión + + + Descargando terreno + + + Saliendo de El Fin + + + ¡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. + + + 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. + + + Cargando nivel + + + Finalizando... + + + Construyendo terreno + + + Simulando mundo durante un instante + + + Rango + + + Preparando para guardar nivel + + + Preparando fragmentos... + + + Inicializando servidor + + + Saliendo del mundo inferior + + + Regenerando + + + Generando nivel + + + Generando zona de generación + + + Cargando zona de generación + + + Entrando en el mundo inferior + + + Herramientas y armas + + + Gamma + + + Sensibilidad del juego + + + Sensibilidad interfaz + + + Dificultad + + + Música + + + Sonido + + + Pacífico + + + 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. + + + Fácil + + + Normal + + + Difícil + + + Sesión cerrada + + + Armadura + + + Mecanismos + + + Transporte + + + Armas + + + Comida + + + Estructuras + + + Decoraciones + + + Pociones + + + Herramientas, armas y armadura + + + Materiales + + + Bloques de construcción + + + Piedra rojiza y transporte + + + Varios + + + Entradas: + + + 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! + + + 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 + + + Crear nuevo mundo + + + Escribe un nombre para tu mundo. + + + Introduce la semilla para la generación del mundo. + + + Cargar mundo guardado + + + Jugar tutorial + + + Tutorial + + + Dar nombre al mundo + + + Archivo dañado + + + Aceptar + + + Cancelar + + + Tienda de Minecraft + + + Rotar + + + Esconderse + + + Vaciar todos los espacios + + + ¿Seguro que quieres salir de la partida actual y unirte a la nueva? Se perderán todo el progreso no guardado. + + + ¿Seguro que quieres sobrescribir los archivos de guardado anteriores de este mundo por su versión actual? + + + ¿Seguro que quieres salir sin guardar? ¡Perderás todo el progreso en este mundo! + + + Comenzar a jugar + + + Salir de la partida + + + Guardar partida + + + Salir sin guardar + + + Pulsa START para unirte. + + + ¡Hurra! ¡Has obtenido una imagen de jugador de Steve, de Minecraft! + + + ¡Hurra! ¡Has obtenido una imagen de jugador de un creeper! + + + Desbloquear juego completo + + + No puedes unirte a esta partida porque el jugador al que quieres unirte usa una versión más reciente del juego. + + + Nuevo mundo + + + ¡Premio desbloqueado! + + + Estás jugando la versión de prueba, pero necesitarás el juego completo para guardar tu partida. +¿Quieres desbloquear el juego completo? + + + Amigos + + + Mi puntuación + + + Total + + + Espera... + + + Sin resultados + + + Filtro: + + + No puedes unirte a esta partida porque el jugador al que quieres unirte usa una versión más antigua del juego. + + + Conexión perdida + + + Se ha perdido la conexión con el servidor. Saliendo al menú principal. + + + Desconectado por el servidor + + + Saliendo de la partida + + + Se ha producido un error. Saliendo al menú principal. + + + Error de conexión + + + Has sido expulsado de la partida. + + + El anfitrión ha salido de la partida. + + + No puedes unirte a esta partida porque no tienes ningún amigo en ella. + + + No puedes unirte a esta partida porque el anfitrión te ha expulsado anteriormente. + + + Has sido expulsado de la partida por volar. + + + El intento de conexión ha tardado demasiado. + + + El servidor está lleno. + + + En este modo, el entorno genera enemigos que infligirán al jugador una cantidad de daño elevada. ¡Ten cuidado también con los creepers, ya que probablemente no cancelarán su ataque explosivo cuando te alejes de ellos! + + + Temas + + + Packs de aspectos + + + Permitir amigos de amigos + + + Expulsar jugador + + + ¿Seguro que quieres expulsar a este jugador de la partida? No podrá volver a unirse hasta que reinicies el mundo. + + + Packs de imágenes de jugador + + + No puedes unirte a esta partida porque está limitada a jugadores que son amigos del anfitrión. + + + Contenido descargable dañado + + + El contenido descargable está dañado y no se puede utilizar. Debes eliminarlo y volver a instalarlo en el menú Tienda de Minecraft. + + + Hay contenido descargable dañado y no se puede utilizar. Debes eliminarlo y volver a instalarlo en el menú Tienda de Minecraft. + + + No te puedes unir a la partida + + + Seleccionado + + + Aspecto seleccionado: + + + Conseguir versión completa + + + Desbloquear pack de textura + + + Desbloquea este pack de textura para usarlo en tu mundo. +¿Te gustaría desbloquearlo ahora? + + + Pack de textura de prueba + + + Semilla + + + Desbloquear pack de aspecto + + + Para usar el aspecto que has seleccionado tienes que desbloquear este pack de aspecto. +¿Quieres desbloquear este pack de aspecto ahora? + + + Estás usando una versión de prueba del pack de textura. No podrás guardar este mundo a menos que desbloquees la versión completa. +¿Te gustaría desbloquear la versión completa de este pack de textura? + + + Descargar versión completa + + + ¡Este mundo usa un pack de textura o de popurrí que no tienes! +¿Quieres instalar el pack de textura o de popurrí ahora? + + + Conseguir versión de prueba + + + Pack de textura no disponible + + + Desbloquear versión completa + + + Descargar versión de prueba + + + Se ha cambiado el modo de juego. + + + Si está habilitado, solo los jugadores invitados pueden unirse. + + + Si está habilitado, los amigos de la gente en tu lista de amigos pueden unirse. + + + Si está habilitado, los jugadores pueden causar daño a otros jugadores. Solo afecta al modo Supervivencia. + + + Normal + + + Superplano + + + Si está habilitado, la partida será online. + + + Si está deshabilitado, los jugadores que se unan a la partida no podrán construir ni extraer sin autorización. + + + Si está habilitado, se generarán estructuras como aldeas y fortalezas en el mundo. + + + Si está habilitado, se generará un mundo completamente plano en el mundo superior y en el inferior. + + + Si está habilitado, se creará un cofre con objetos útiles cerca del punto de generación del jugador. + + + Si está habilitado, el fuego se puede propagar a los bloques inflamables cercanos. + + + Si está habilitado, la dinamita explota cuando se activa. + + + Si está habilitado, el mundo inferior se regenerará. Es útil si tienes una partida guardada antigua donde no está presente la fortaleza del mundo inferior. + + + No + + + Modo de juego: Creativo + + + Supervivencia + + + Creativo + + + Cambiar nombre del mundo + + + Escribe un nuevo nombre para tu mundo. + + + Modo de juego: Supervivencia + + + Creado en modo Supervivencia + + + Renombrar partida guardada + + + Autoguardando en %d... + + + + + + Creado en modo Creativo + + + Generar nubes + + + ¿Qué quieres hacer con esta partida guardada? + + + Tamaño panel (pant. divid.) + + + Ingrediente + + + Combustible + + + Dispensador + + + Cofre + + + Encantar + + + Horno + + + No hay ofertas de contenido descargable de este tipo disponibles para este título en este momento. + + + ¿Seguro que quieres borrar esta partida guardada? + + + Esperando aprobación + + + Censurado + + + %s se ha unido a la partida. + + + %s ha abandonado la partida. + + + Han expulsado a %s de la partida. + + + Soporte para pociones + + + Introducir texto del cartel + + + Introduce una línea de texto para tu cartel. + + + Introducir título + + + Fin de la prueba + + + Partida llena + + + No te has podido unir a la partida y no quedan más espacios. + + + Introduce un título para tu publicación. + + + Introduce una descripción para tu publicación. + + + Inventario + + + Ingredientes + + + Introducir subtítulo + + + Introduce un subtítulo para tu publicación. + + + Introducir descripción + + + Sonando: + + + ¿Seguro que quieres añadir este nivel a la lista de niveles bloqueados? +Selecciona ACEPTAR para salir de la partida. + + + Eliminar de la lista de bloqueados + + + Autoguardado cada + + + Nivel bloqueado + + + La partida a la que te estás uniendo está en la lista de niveles bloqueados. +Si decides unirte a esta partida, el nivel se eliminará de tu lista de niveles bloqueados. + + + ¿Bloquear este nivel? + + + Autoguardado: NO + + + Opacidad de interfaz + + + Preparando autoguardado del nivel + + + Tamaño del panel de datos + + + min. + + + ¡No se puede colocar aquí! + + + No se puede colocar lava cerca del punto de generación del nivel porque puede matar al instante a los jugadores que se regeneran. + + + Aspectos favoritos + + + Partida de %s + + + Partida de anfitrión desconocido + + + Un invitado ha cerrado la sesión + + + Restablecer configuración + + + ¿Seguro que quieres restablecer la configuración a los valores predeterminados? + + + Error al cargar + + + Un jugador invitado ha cerrado la sesión, lo que ha provocado que todos los invitados queden excluidos de la partida. + + + Imposible crear la partida + + + Selección automática + + + Sin pack: aspectos por defecto + + + Iniciar sesión + + + No has iniciado sesión. Para jugar tienes que iniciar sesión. ¿Quieres hacerlo ahora? + + + Multijugador no admitido + + + Beber + + + En esta área se ha colocado una granja. Cultivar en la granja te permite crear una fuente renovable de comida y otros objetos. + + + {*B*} + Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre los cultivos.{*B*} + Pulsa{*CONTROLLER_VK_B*}si ya sabes cómo funcionan los cultivos. + + + El trigo, las calabazas y los melones se cultivan a partir de semillas. Las semillas de trigo se obtienen al romper hierba alta o al cosechar trigo, y las semillas de calabaza y melón se consiguen a partir de calabazas y melones respectivamente. + + + Pulsa{*CONTROLLER_ACTION_CRAFTING*} para abrir la interfaz del inventario creativo. + + + Para continuar, cruza al otro lado de este agujero. + + + Has completado el tutorial del modo Creativo. + + + Antes de plantar semillas, debes convertir los bloques de tierra en tierra de cultivo por medio de una azada. Una fuente cercana de agua te ayudará a mantener la tierra de cultivo hidratada y hará que los cultivos crezcan más rápido, además de mantener la zona iluminada. + + + Los cactus deben plantarse en arena y crecerán hasta tres bloques de alto. Al igual que con la caña de azúcar, si se destruye el bloque más bajo podrás recoger los bloques que estén sobre él.{*ICON*}81{*/ICON*} + + + Los champiñones deben plantarse en una zona con luz tenue y se propagarán a los bloques de luz tenue cercanos.{*ICON*}39{*/ICON*} + + + El polvo de hueso se puede usar para germinar cultivos hasta su estado de mayor crecimiento o cultivar champiñones hasta que se vuelvan gigantes.{*ICON*}351:15{*/ICON*} + + + El trigo pasa por distintas fases durante su crecimiento. Cuando aparece más oscuro es que está listo para la cosecha.{*ICON*}59:7{*/ICON*} + + + Las calabazas y los melones también necesitan un bloque cerca de donde hayas plantado la semilla para que el fruto crezca cuando el tallo se haya desarrollado por completo. + + + La caña de azúcar debe plantarse en un bloque de hierba, tierra o arena que esté junto a un bloque de agua. Al cortar un bloque de caña de azúcar, todos los bloques que estén sobre él caerán.{*ICON*}83{*/ICON*} + + + En el modo Creativo posees un número infinito de todos los objetos y bloques disponibles, puedes destruir bloques con un clic y sin herramientas, eres invulnerable y puedes volar. + + + En el cofre de esta área encontrarás componentes para fabricar circuitos con pistones. Prueba a usar o completar los circuitos de esta área o coloca los tuyos propios. Fuera del área de tutorial encontrarás más ejemplos. + + + ¡En esta área hay un portal al mundo inferior! + + + {*B*} + Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre los portales y el mundo inferior.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo funcionan los portales y el mundo inferior. + + + El polvo de piedra rojiza se consigue al extraer mineral de piedra rojiza con un pico hecho de hierro, diamante u oro. Puedes usarlo para suministrar energía a un máximo de 15 bloques, y se puede desplazar hacia arriba o hacia abajo un bloque de altura. + {*ICON*}331{*/ICON*} + + + Los repetidores de piedra rojiza se usan para ampliar la distancia a la que se puede transportar la energía o para colocar un retardo en un circuito. + {*ICON*}356{*/ICON*} + + + Al recibir energía, los pistones se extienden y empujan hasta 12 bloques. Cuando se repliegan, los pistones adhesivos pueden tirar de bloques de casi cualquier tipo. + {*ICON*}33{*/ICON*} + + + Los portales se crean colocando obsidiana en una estructura de cuatro bloques de ancho y cinco de alto. No se necesitan bloques de esquina. + + + El mundo inferior sirve para desplazarte con rapidez por el mundo superior. Una distancia de un bloque en el mundo inferior equivale a desplazarte tres bloques en el mundo superior. + + + Ahora estás en el modo Creativo. + + + {*B*} + Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre el modo Creativo.{*B*} + Pulsa{*CONTROLLER_VK_B*}si ya sabes cómo funciona el modo Creativo. + + + Para activar el portal inferior, prende fuego a los bloques de obsidiana del interior de la estructura con un chisquero de pedernal. Los portales se pueden desactivar si se rompe la estructura, si se produce una explosión cerca o si fluye un líquido a través de ellos. + + + Para usar un portal inferior, colócate en su interior. La pantalla se pondrá púrpura y se reproducirá un sonido. Al cabo de unos segundos, te transportarás a otra dimensión. + + + El mundo inferior es un lugar peligroso, repleto de lava, pero puede ser útil para recoger bloques inferiores, que arden para siempre una vez que se encienden, y piedra brillante, que genera luz. + + + Has completado el tutorial de los cultivos. + + + Cada herramienta funciona mejor con distintos materiales. Deberías usar un hacha para cortar troncos de árboles. + + + Cada herramienta funciona mejor con distintos materiales. Deberías usar un pico para extraer piedra y mineral. Quizá debas fabricar tu pico con mejores materiales para obtener recursos de algunos bloques. + + + Hay herramientas que son mejores para atacar a determinados enemigos. Plantéate usar una espada para atacar. + + + Los gólems de hierro aparecen en las aldeas para protegerlas, y te atacarán si atacas a los aldeanos. + + + No puedes salir de esta área hasta que completes el tutorial. + + + Cada herramienta funciona mejor con distintos materiales. Deberías usar una pala para extraer materiales blandos, como tierra y arena. + + + Consejo: mantén pulsado {*CONTROLLER_ACTION_ACTION*}para extraer y cortar a mano o con el objeto que sostengas. Quizá tengas que crear una herramienta para extraer algunos bloques... + + + En el cofre que está junto al río hay un barco. Para usarlo, apunta al agua con el cursor y pulsa{*CONTROLLER_ACTION_USE*}. Usa{*CONTROLLER_ACTION_USE*} mientras apuntas al barco para subir a él. + + + En el cofre que está junto al estanque hay una caña de pescar. Coge la caña del cofre y selecciónala para llevarla en la mano y usarla. + + + ¡Este mecanismo de pistones más avanzado crea un puente autorreparable! Pulsa el botón para activarlo e investiga la forma en que los componentes interaccionan para averiguar su funcionamiento. + + + La herramienta que usas está dañada. Cada vez que utilizas una herramienta, se desgasta y, con el tiempo, acabará rompiéndose. La barra de colores de debajo del objeto en el inventario muestra el estado de daños actual. + + + Mantén pulsado{*CONTROLLER_ACTION_JUMP*} para nadar. + + + En esta área hay una vagoneta en una vía. Para subir a una vagoneta, apunta con el cursor hacia ella y pulsa{*CONTROLLER_ACTION_USE*}. Usa{*CONTROLLER_ACTION_USE*} sobre el botón para que la vagoneta se mueva. + + + Los gólems de hierro se crean con cuatro bloques de hierro colocados como muestra el modelo y con una calabaza encima del bloque central. Estos gólems atacan a tus enemigos. + + + Si alimentas con trigo a las vacas, champiñacas u ovejas, con zanahorias a los cerdos, con semillas de trigo o verrugas del mundo inferior a las gallinas, o con cualquier tipo de carne a los lobos, estos animales empezarán a buscar a otros animales de la misma especie que también estén en el modo Amor. + + + Cuando dos animales de la misma especie se encuentran, y ambos están en el modo Amor, se besarán durante unos segundos y luego aparecerá una cría. La cría seguirá a sus padres durante un tiempo antes de convertirse en un animal adulto. + + + Después de estar en el modo Amor, los animales no podrán volver a él durante cinco minutos como mínimo. + + + En esta área se han guardado animales en corrales. Puedes hacer que los animales se reproduzcan para crear crías de sí mismos. + + + +{*B*} + Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre reproducción de animales.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya sabes sobre reproducción de animales. + + + Para que los animales se reproduzcan, tendrás que alimentarlos con la comida adecuada para que entren en el "modo Amor". + + + Algunos animales te seguirán si tienes su comida en la mano. Así te será más fácil agrupar animales para hacer que se reproduzcan.{*ICON*}296{*/ICON*} + + + {*B*} + Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre los gólems.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo funcionan los gólems. + + + Los gólems se crean colocando una calabaza encima de un montón de bloques. + + + Los gólems de nieve se crean con dos bloques de nieve, uno sobre el otro, y encima una calabaza. Estos gólems lanzan bolas de nieve a tus enemigos. + + + + Los lobos salvajes pueden domesticarse dándoles huesos. Una vez domesticados, aparecerán corazones a su alrededor. Los lobos domesticados siguen al jugador y lo defienden si no se les ha ordenado sentarse. + + + + Has completado el tutorial Reproducción de animales. + + + En esta zona hay algunas calabazas y bloques para crear un gólem de nieve y otro de hierro. + + + La posición y dirección en que colocas la fuente de energía puede cambiar la forma en que afecta a los bloques que la rodean. Por ejemplo, una antorcha de piedra rojiza en un lado de un bloque se puede desactivar si el bloque recibe energía de otra fuente. + + + Si un caldero se vacía, puedes rellenarlo con un cubo de agua. + + + Usa el soporte para pociones para crear una poción de resistencia al fuego. Necesitarás una botella de agua, verruga del mundo inferior y crema de magma. + + + Toma una poción en la mano y mantén pulsado{*CONTROLLER_ACTION_USE*} para usarla. Si es una poción normal, bébela y te aplicarás el efecto a ti mismo; si es una poción de salpicadura, la lanzarás y aplicarás el efecto a las criaturas que estén cerca en el momento del impacto. + Las pociones de salpicadura se crean añadiendo pólvora a las pociones normales. + + + {*B*} + Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre la elaboración y las pociones.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo elaborar pociones. + + + El primer paso para elaborar una poción es crear una botella de agua. Toma una botella de agua del cofre. + + + Puedes llenar una botella de agua con un caldero que tenga agua o con un bloque de agua. Ahora, para llenar la botella de agua, apunta a una fuente de agua y pulsa{*CONTROLLER_ACTION_USE*}. + + + Usa una poción de resistencia al fuego contigo mismo. + + + Para encantar un objeto, primero colócalo en el espacio de encantamiento. Las armas, las armaduras y algunas herramientas se pueden encantar para añadirles efectos especiales, como resistencia mejorada al daño o aumento del número de objetos que se generan al extraer un bloque. + + + Cuando se coloca un objeto en el espacio de encantamiento, los botones de la parte derecha cambian y muestran una selección de encantamientos aleatorios. + + + El número del botón representa el coste en niveles de experiencia que cuesta aplicar ese encantamiento al objeto. Si tu nivel es insuficiente, el botón no estará activo. + + + Ahora eres resistente al fuego y a la lava, así que comprueba si puedes acceder a lugares a los que antes no podías. + + + Esta es la interfaz de encantamiento, que puedes usar para aplicar encantamientos a armas, armaduras y a algunas herramientas. + + + {*B*} + Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre la interfaz de encantamientos.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo utilizar la interfaz de encantamientos. + + + En esta zona hay un soporte para pociones, un caldero y un cofre lleno de objetos para elaborar pociones. + + + El carbón se puede usar como combustible y convertirse en una antorcha con un palo. + + + Si colocas arena en el espacio de ingredientes podrás crear cristal. Crea bloques de cristal para usarlos a modo de ventana en el refugio. + + + Esta es la interfaz de elaboración de pociones. Se puede usar para crear pociones con efectos diversos. + + + Muchos objetos de madera se pueden usar como combustible, pero no todos arden la misma cantidad de tiempo. También descubrirás otros objetos en el mundo que funcionan como combustible. + + + Después de fundir los objetos puedes trasladarlos de la zona de producción a tu inventario. Experimenta con distintos ingredientes para comprobar lo que puedes crear. + + + Si usas la madera como ingrediente podrás crear carbón. Coloca combustible en el horno y la madera en el espacio de ingredientes. Puede que el horno tarde un tiempo en crear el carbón, así que puedes aprovechar para hacer alguna otra cosa y volver más tarde a comprobar el progreso. + + + {*B*} + Pulsa{*CONTROLLER_VK_A*} para continuar.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo usar el soporte para pociones. + + + Si añades ojo de araña fermentado, la poción se corromperá y podría convertirse en otra con el efecto contrario, y si añades pólvora, la convertirás en una poción de salpicadura, que se puede lanzar para aplicar su efecto sobre un área cercana. + + + Para crear una poción de resistencia al fuego, primero añade una verruga del mundo inferior a una botella de agua y luego añade crema de magma. + + + Pulsa{*CONTROLLER_VK_B*} ahora para salir de la interfaz de elaboración de pociones. + + + Para elaborar pociones, coloca un ingrediente en la parte superior y una botella de agua o una poción en los espacios inferiores (se pueden elaborar hasta 3 a la vez). Cuando se introduce una combinación válida, comienza la elaboración y, al cabo de poco tiempo, se creará una poción. + + + Todas las pociones se empiezan con una botella de agua. La mayoría de pociones se crean usando primero una verruga del mundo inferior para crear una poción rara, y requieren como mínimo un ingrediente más para obtener la poción final. + + + Una vez que tengas una poción, podrás modificar sus efectos. Si añades polvo de piedra rojiza, aumentas la duración del efecto, y si añades polvo de piedra brillante, su efecto será más potente. + + + Selecciona un encantamiento y pulsa{*CONTROLLER_VK_A*} para encantar el objeto. Se reducirá el nivel de experiencia en función del coste del encantamiento. + + + Pulsa{*CONTROLLER_ACTION_USE*} para lanzar la caña y empezar a pescar. Pulsa{*CONTROLLER_ACTION_USE*} de nuevo para recoger el sedal. + {*FishingRodIcon*} + + + Si esperas a que el corcho se hunda por debajo de la superficie del agua antes de recoger, podrás pescar un pez. Los peces se pueden comer crudos o cocinados en un horno para recuperar la salud. + {*FishIcon*} + + + Al igual que muchas otras herramientas, la caña tiene distintos usos, los cuales no se limitan a pescar peces. Puedes experimentar con ella e investigar qué se puede pescar o activar... + {*FishingRodIcon*} + + + Los barcos te permiten viajar más deprisa por el agua. Usa{*CONTROLLER_ACTION_MOVE*} y{*CONTROLLER_ACTION_LOOK*} para dirigirlo. + {*BoatIcon*} + + + Ahora usas una caña de pescar. Pulsa{*CONTROLLER_ACTION_USE*} para utilizarla.{*FishingRodIcon*} + + + {*B*} + Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre la pesca.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo pescar. + + + Esto es una cama. Pulsa{*CONTROLLER_ACTION_USE*} y apunta hacia ella de noche para dormir y despertar por la mañana.{*ICON*}355{*/ICON*} + + + En esta área hallarás circuitos sencillos de pistones y piedra rojiza, así como un cofre con más objetos para ampliar estos circuitos. + + + {*B*} + Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre los circuitos de piedra rojiza y de pistones.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo funcionan los circuitos de piedra rojiza y de pistones. + + + Las palancas, los botones, las placas de presión y las antorchas de piedra rojiza suministran energía a los circuitos, bien acoplándolos directamente al objeto que quieres activar o bien conectándolos con polvo de piedra rojiza. + + + {*B*} + Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre las camas.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo funcionan las camas. + + + Las camas deben colocarse en un lugar seguro y bien iluminado para que los monstruos no te despierten en mitad de la noche. Si mueres después de haber usado una cama, te regenerarás en ella. + {*ICON*}355{*/ICON*} + + + Si hay más jugadores en tu partida, todos deberán estar metidos en la cama al mismo tiempo para poder dormir. + {*ICON*}355{*/ICON*} + + + {*B*} + Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre los barcos.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo funcionan los barcos. + + + Con una mesa de encantamiento podrás añadir efectos especiales, como aumentar el número de objetos que se obtienen al extraer un bloque o mejorar la resistencia al daño de armas, armaduras y algunas herramientas. + + + Coloca estanterías alrededor de la mesa de encantamiento para aumentar su poder y acceder a encantamientos de nivel superior. + + + Encantar objetos cuesta niveles de experiencia, que se aumentan acumulando orbes de experiencia. Estos orbes se generan al matar monstruos y animales, extraer mineral, criar nuevos animales, pescar y fundir o cocinar algunos objetos en un horno. + + + Aunque los encantamientos son aleatorios, algunos de los mejores solo están disponibles cuando tienes el nivel de experiencia adecuado y muchas estanterías alrededor de la mesa de encantamiento para aumentar su poder. + + + En esta zona hay una mesa de encantamiento y otros objetos que te ayudarán a entenderlos y aprender sobre ellos. + + + {*B*} + Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre los encantamientos.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo utilizar los encantamientos. + + + También puedes aumentar tus niveles de experiencia con una botella de encantamiento que, cuando se lanza, crea orbes de experiencia donde cae. Después podrás recoger esos orbes. + + + Las vagonetas van sobre raíles. También puedes crear una vagoneta propulsada con un horno y una vagoneta con un cofre en ella. + {*RailIcon*} + + + También puedes crear raíles propulsados, que absorben energía de las antorchas y circuitos de piedra rojiza para acelerar las vagonetas. Se pueden conectar a interruptores, palancas y placas de presión para crear sistemas complejos. + {*PoweredRailIcon*} + + + Ahora navegas en un barco. Para salir de él, apúntalo con el puntero y pulsa{*CONTROLLER_ACTION_USE*}.{*BoatIcon*} + + + En los cofres de esta zona encontrarás objetos encantados, botellas de encantamientos y objetos que aún están sin encantar para que experimentes con ellos en la mesa de encantamiento. + + + Ahora vas subido en una vagoneta. Para salir de ella, apunta a ella con el cursor y pulsa{*CONTROLLER_ACTION_USE*}.{*MinecartIcon*} + + + {*B*} + Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre las vagonetas.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo funcionan las vagonetas. + + + Si desplazas el puntero por fuera del borde de la interfaz con un objeto en él, podrás soltar ese objeto. + + + Leer + + + Colgar + + + Arrojar + + + Abrir + + + Cambiar tono + + + Detonar + + + Plantar + + + Desbloquear juego completo + + + Borrar partida guardada + + + Borrar + + + Labrar + + + Cosechar + + + Continuar + + + Nadar hacia arriba + + + Golpear + + + Ordeñar + + + Recoger + + + Vaciar + + + Silla de montar + + + Colocar + + + Comer + + + Montar + + + Navegar + + + Cultivar + + + Dormir + + + Despertar + + + Rep. + + + Opciones + + + Mover armadura + + + Mover arma + + + Equipar + + + Mover ingrediente + + + Mover combustible + + + Mover herramienta + + + Disparar + + + Retroceder página + + + Avanzar página + + + Modo Amor + + + Soltar + + + Privilegios + + + Bloquear + + + Creativo + + + Bloquear nivel + + + Seleccionar aspecto + + + Prender fuego + + + Invitar a amigos + + + Aceptar + + + Esquilar + + + Desplazar + + + Reinstalar + + + Op. de guardado + + + Ejecutar comando + + + Instalar versión completa + + + Instalar versión de prueba + + + Instalar + + + Expulsar + + + Actualizar partidas online + + + Partidas en grupo + + + Todas las partidas + + + Salir + + + Cancelar + + + No unirse + + + Cambiar grupo + + + Creación + + + Crear + + + Coger/Colocar + + + Mostrar inventario + + + Mostrar descripción + + + Mostrar ingredientes + + + Atrás + + + Recordatorio: + + + + + + Se han añadido nuevas funciones en la última versión del juego, como áreas nuevas en el tutorial. + + + No tienes todos los ingredientes necesarios para crear este objeto. El cuadro de la parte inferior izquierda muestra los ingredientes necesarios para crearlo. + + + ¡Enhorabuena! Has completado el tutorial. El tiempo del juego transcurre ahora a velocidad normal, ¡y no falta mucho para la noche y para que salgan los monstruos! ¡Acaba el refugio! + + + {*EXIT_PICTURE*} Cuando estés listo para seguir explorando, hay una escalera en esta zona, cerca del refugio del minero, que conduce a un pequeño castillo. + + + {*B*}Pulsa{*CONTROLLER_VK_A*} para jugar el tutorial de forma normal.{*B*} + Pulsa{*CONTROLLER_VK_B*} para omitir el tutorial principal. + + + {*B*} + Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre la barra de comida y cómo comer.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo funciona la barra de comida y cómo comer. + + + Seleccionar + + + Usar + + + En esta área encontrarás otras áreas configuradas para que aprendas el funcionamiento de la pesca, los barcos y la piedra rojiza. + + + Fuera de esta área encontrarás ejemplos de edificios, cultivos, vagonetas y vías, encantamientos, pociones, comercio, herrería y mucho más. + + + La barra de comida se ha agotado hasta un nivel a partir del cual ya no te puedes curar. + + + Coger + + + Siguiente + + + Anterior + + + Expulsar jugador + + + Enviar solicitud de amistad + + + Avanzar página + + + Retroceder página + + + Teñir + + + Curar + + + Sentarse + + + Sígueme + + + Extraer + + + Alimentar + + + Domar + + + Cambiar filtro + + + Colocar todo + + + Colocar uno + + + Soltar + + + Coger todo + + + Coger la mitad + + + Colocar + + + Soltar todo + + + Borrar selección rápida + + + ¿Qué es esto? + + + Compartir en Facebook + + + Soltar uno + + + Cambiar + + + Movimiento rápido + + + Packs de aspecto + + + Panel de cristal tintado rojo + + + Panel de cristal tintado verde + + + Panel de cristal tintado marrón + + + Cristal tintado blanco + + + Panel de cristal tintado + + + Panel de cristal tintado negro + + + Panel de cristal tintado azul + + + Panel de cristal tintado gris + + + Panel de cristal tintado rosa + + + Panel de cristal tintado lima + + + Panel de cristal tintado morado + + + Panel de cristal tintado cian + + + Panel de cristal tintado gris claro + + + Cristal tintado naranja + + + Cristal tintado azul + + + Cristal tintado morado + + + Cristal tintado cian + + + Cristal tintado rojo + + + Cristal tintado verde + + + Cristal tintado marrón + + + Cristal tintado gris claro + + + Cristal tintado amarillo + + + Cristal tintado azul claro + + + Cristal tintado magenta + + + Cristal tintado gris + + + Cristal tintado rosa + + + Cristal tintado lima + + + Panel de cristal tintado amarillo + + + Gris claro + + + Gris + + + Rosa + + + Azul + + + Morado + + + Cian + + + Lima + + + Naranja + + + Blanco + + + Personalizado + + + Amarillo + + + Azul claro + + + Magenta + + + Marrón + + + Panel de cristal tintado blanco + + + Bola pequeña + + + Bola grande + + + Panel de cristal tintado azul claro + + + Panel de cristal tintado magenta + + + Panel de cristal tintado naranja + + + Forma de estrella + + + Negro + + + Rojo + + + Verde + + + Forma de creeper + + + Explosión + + + Forma desconocida + + + Cristal tintado negro + + + Armadura de caballo de hierro + + + Armadura de caballo de oro + + + Armadura de caballo de diamante + + + Comparador de piedra rojiza + + + Vagoneta con dinamita + + + Vagoneta con tolva + + + Correa + + + Baliza + + + Cofre con trampa + + + Placa de presión con peso (ligera) + + + Placa identificativa + + + Tablones de madera (cualquier tipo) + + + Bloque de comandos + + + Estrella de fuegos artificiales + + + Estos animales pueden domesticarse y usarse como montura. Se les puede acoplar un cofre. + + + Mula + + + Nace cuando crían un caballo y un burro. Estos animales pueden domesticarse, usarse como montura y transportar cofres. + + + Caballo + + + Estos animales pueden domesticarse y usarse como montura. + + + Burro + + + Caballo zombi + + + Mapa vacío + + + Estrella del mundo inferior + + + Cohete de fuegos artificiales + + + Caballo esqueleto + + + Wither + + + Se crean con cráneos de Wither y arena de alma. Disparan cráneos explosivos. + + + Placa de presión con peso (pesada) + + + Arcilla teñida gris claro + + + Arcilla teñida gris + + + Arcilla teñida rosa + + + Arcilla teñida azul + + + Arcilla teñida morada + + + Arcilla teñida cian + + + Arcilla teñida lima + + + Arcilla teñida naranja + + + Arcilla teñida blanca + + + Cristal tintado + + + Arcilla teñida amarilla + + + Arcilla teñida azul claro + + + Arcilla teñida magenta + + + Arcilla teñida marrón + + + Tolva + + + Raíl activador + + + Soltador + + + Comparador de piedra rojiza + + + Sensor de luz diurna + + + Bloque de piedra rojiza + + + Arcilla teñida + + + Arcilla teñida negra + + + Arcilla teñida roja + + + Arcilla teñida verde + + + Bala de heno + + + Arcilla endurecida + + + Bloque de carbón + + + Fundido a + + + Cuando está desactivado, impide que monstruos y animales cambien los bloques (por ejemplo, las explosiones de los creepers no destruyen los bloques y las ovejas no eliminan la hierba) o recojan objetos. + + + Cuando se activa, los jugadores conservarán su inventario al morir. + + + Cuando se desactiva, las criaturas no se generarán de forma natural. + + + Modo de juego: Aventura + + + Aventura + + + Introduce una semilla para volver a generar el mismo terreno. Déjalo vacío para generar un mundo aleatorio. + + + Cuando se desactiva, los monstruos y animales no sueltan botín (por ejemplo, los creepers no sueltan pólvora). + + + {*PLAYER*} se ha caído de una escalera + + + {*PLAYER*} se ha caído de unas enredaderas + + + {*PLAYER*} se ha caído del agua + + + Cuando se desactiva, los bloques no sueltan objetos al ser destruidos (por ejemplo, los bloques de piedra no sueltan guijarros). + + + Cuando se desactiva, los jugadores no regeneran salud de forma natural. + + + Cuando se desactiva, la hora del día no cambia. + + + Vagoneta + + + Atar + + + Liberar + + + Acoplar + + + Desmontar + + + Acoplar cofre + + + Lanzar + + + Nombrar + + + Baliza + + + Poder principal + + + Poder secundario + + + Caballo + + + Soltador + + + Tolva + + + {*PLAYER*} se ha caído de un sitio alto + + + El huevo generador no está disponible en estos momentos. Se ha alcanzado la cantidad máxima de murciélagos en un mundo. + + + Este animal no puede entrar en el modo Amor. Se ha alcanzado la cantidad máxima de crías de caballos. + + + Opciones de juego + + + {*PLAYER*} ha recibido una bola de fuego de {*SOURCE*} usando {*ITEM*} + + + {*PLAYER*} ha recibido un golpe de {*SOURCE*} usando {*ITEM*} + + + {*PLAYER*} ha muerto a manos de {*SOURCE*} usando {*ITEM*} + + + Desventaja de criaturas + + + Objetos de bloques + + + Regeneración natural + + + Ciclo de luz + + + Conservar inventario + + + Generación de criaturas + + + Botín de criaturas + + + {*PLAYER*} ha recibido un disparo de {*SOURCE*} usando {*ITEM*} + + + {*PLAYER*} ha caído demasiado lejos y ha sido destruido por {*SOURCE*} + + + {*PLAYER*} ha caído demasiado lejos y ha sido destruido por {*SOURCE*} usando {*ITEM*} + + + {*PLAYER*} se ha metido en el fuego mientras luchaba con {*SOURCE*} + + + {*PLAYER*} se ha visto condenado a caer por {*SOURCE*} + + + {*PLAYER*} se ha visto condenado a caer por {*SOURCE*} + + + {*PLAYER*} se ha visto condenado a caer por {*SOURCE*} usando {*ITEM*} + + + {*PLAYER*} se ha achicharrado mientras luchaba con {*SOURCE*} + + + {*PLAYER*} ha volado por los aires a manos de {*SOURCE*} + + + {*PLAYER*} se ha marchitado + + + {*PLAYER*} ha muerto a manos de {*SOURCE*} usando {*ITEM*} + + + {*PLAYER*} ha intentado nadar en la lava para escapar de {*SOURCE*} + + + {*PLAYER*} se ha ahogado mientras intentaba escapar de {*SOURCE*} + + + {*PLAYER*} ha pisado un cactus mientras intentaba escapar de {*SOURCE*} + + + Montura + + + +Para guiar a un caballo, hay que equiparlo con una silla, que se puede comprar a los aldeanos o encontrarse en cofres ocultos por el mundo. + + + + + Los burros y mulas domesticados pueden equiparse con alforjas agachándose y acoplándoles un cofre. Luego, se puede acceder a estas alforjas mientras se monta o en sigilo. + + + + Los caballos y burros (pero no las mulas) pueden criarse como los demás animales, usando manzanas de oro o zanahorias de oro. Los potros se convierten en caballos adultos con el tiempo, aunque alimentarlos con trigo o heno acelera el proceso. + + + + Los caballos, burros y mulas deben domesticarse antes de poder utilizarlos. Un caballo se domestica intentando montar en él, mientras este intenta sacudirse al jinete. + + + + +Una vez domesticado, aparecerán corazones a su alrededor y dejará de intentar librarse del jugador. + + + + Intenta montar este caballo. Usa {*CONTROLLER_ACTION_USE*} sin objetos ni herramientas en la mano para montarlo. + + + + Aquí puedes intentar domesticar caballos y burros, y también hay sillas, armadura para caballos y otros objetos útiles para los caballos en los cofres cercanos. + + + + Una baliza sobre una pirámide de al menos 4 niveles ofrece la opción del poder secundario de regeneración o de un poder principal más fuerte. + + + Para determinar los poderes de tu baliza, debes sacrificar una esmeralda, un diamante o un lingote de oro o hierro en el espacio de pago. Una vez determinados, los poderes emanarán de la baliza indefinidamente. + + + Sobre esta pirámide hay una baliza inactiva. + + + Esta es la interfaz de balizas, que puedes usar para elegir los poderes que concederá tu baliza. + + + {*B*}Pulsa{*CONTROLLER_VK_A*} para continuar. + {*B*}Pulsa{*CONTROLLER_VK_B*} si ya estás familiarizado con la interfaz de balizas. + + + En el menú de baliza puedes seleccionar un poder principal para tu baliza. Cuantos más niveles tenga la pirámide, más poderes habrá para elegir. + + + Todos los caballos, burros y mulas adultos pueden montarse. Sin embargo, solo los caballos pueden llevar armadura, y solo las mulas y los burros pueden equiparse con alforjas para transportar objetos. + + + Esta es la interfaz del inventario del caballo. + + + {*B*}Pulsa{*CONTROLLER_VK_A*} para continuar. +{*B*}Pulsa{*CONTROLLER_VK_B*} si ya sabes utilizar el inventario del caballo. + + + +El inventario del caballo te permite transferir o equipar con objetos a tu caballo, burro o mula. + + + + Parpadeo + + + Estela + + + Duración del vuelo: + + + + Ensilla tu caballo colocando una silla en el espacio para sillas. Puedes equipar con armadura a tu caballo colocando una armadura de caballo en el espacio para armaduras. + + + + Has encontrado una mula. + + + {*B*}Pulsa{*CONTROLLER_VK_A*} para saber más sobre caballos, burros y mulas. +{*B*}Pulsa{*CONTROLLER_VK_B*} si ya estás familiarizado con caballos, burros y mulas. + + + Los caballos y burros se encuentran sobre todo en las llanuras. Las mulas son el producto del cruce entre burro y caballo, pero son estériles. + + + +También puedes transferir objetos entre tu inventario y las alforjas acopladas a burros y mulas en este menú. + + + + Has encontrado un caballo. + + + Has encontrado un burro. + + + {*B*}Pulsa{*CONTROLLER_VK_A*} para saber más sobre las balizas. +{*B*}Pulsa{*CONTROLLER_VK_B*} si ya estás familiarizado con las balizas. + + + Las estrellas de fuegos artificiales pueden crearse colocando pólvora y tinte en la cuadrícula. + + + El tinte determinará el color de la explosión de la estrella de fuegos artificiales. + + + + La forma de la estrella de fuegos artificiales se establece añadiendo una descarga de fuego, una pepita de oro, una pluma o una cabeza de enemigo. + + + También puedes colocar varias estrellas de fuegos artificiales en la cuadrícula para añadirlas a los fuegos artificiales. + + + Llenar más espacios en la cuadrícula con pólvora aumentará la altura a la que harán explosión las estrellas de fuegos artificiales. + + + Luego puedes coger los fuegos artificiales terminados en el espacio de salida. + + + + Puede añadirse una estela o un parpadeo usando diamantes o polvo de piedra brillante. + + + Los fuegos artificiales son objetos decorativos que pueden lanzarse a mano o desde dispensadores. Se fabrican usando papel, pólvora y, de forma optativa, un número de estrellas de fuegos artificiales. + + + + Los colores, cambios de color, formas, tamaños y efectos (como estelas y parpadeos) de las estrellas de fuegos artificiales pueden personalizarse añadiendo ingredientes adicionales durante la creación. + + + Prueba a crear fuegos artificiales en la mesa de trabajo usando distintos objetos de los cofres. + + + + Después de crear una estrella de fuegos artificiales, puedes determinar su cambio de color combinándola con tinte. + + + Dentro de estos cofres hay diversos objetos utilizados en la creación de ¡FUEGOS ARTIFICIALES! + + + {*B*}Pulsa{*CONTROLLER_VK_A*} para saber más sobre los fuegos artificiales. +{*B*}Pulsa{*CONTROLLER_VK_B*} si ya estás familiarizado con los fuegos artificiales. + + + Para crear fuegos artificiales, coloca pólvora y papel en la cuadrícula de creación de 3 x 3 que aparece sobre tu inventario. + + + Esta sala contiene tolvas + + + {*B*}Pulsa{*CONTROLLER_VK_A*} para saber más sobre las tolvas. +{*B*}Pulsa{*CONTROLLER_VK_B*} si ya estás familiarizado con las tolvas. + + + Las tolvas se utilizan para introducir o sacar objetos de contenedores y para recoger automáticamente los objetos lanzados a su interior. + + + Las balizas activas proyectan un brillante rayo de luz hacia el cielo y otorgan poderes a los jugadores cercanos. Se crean con cristal, obsidiana y estrellas del mundo inferior, que pueden obtenerse derrotando al Wither. + + + Las balizas deben situarse de forma que les dé el sol durante el día. Deben colocarse sobre pirámides de hierro, oro, esmeralda o diamante. No obstante, el tipo de material no afecta al poder de la baliza. + + + +Intenta usar la baliza para determinar los poderes que otorga. Puedes usar los lingotes de hierro para el pago necesario. + + + + Pueden afectar a soportes para pociones, cofres, dispensadores, soltadores, vagonetas con cofres, vagonetas con tolvas y también a otras tolvas. + + + En esta sala hay varias distribuciones de tolvas para que las veas y experimentes con ellas. + + + Esta es la interfaz de fuegos artificiales, que puedes usar para crear fuegos artificiales y estrellas de fuegos artificiales. + + + {*B*}Pulsa{*CONTROLLER_VK_A*} para continuar. +{*B*}Pulsa{*CONTROLLER_VK_B*} si ya sabes usar la interfaz de fuegos artificiales. + + + Una tolva intentará de forma continua absorber los objetos de un contenedor adecuado situado sobre ella. También intentará introducir los objetos almacenados en un contenedor de salida. + + + + No obstante, si una tolva recibe energía de piedra rojiza, se vuelve inactiva y deja de absorber e introducir objetos. + + + + + Una tolva apunta en la dirección en la que intenta dar salida a los objetos. Para hacer que una tolva apunte hacia un bloque concreto, coloca la tolva contra ese bloque estando en sigilo. + + + + Estos enemigos pueden encontrarse en los pantanos y te atacan lanzando pociones. Sueltan pociones cuando mueren. + + + Se ha alcanzado el límite de cuadros y marcos en un mundo. + + + No puedes generar enemigos en el modo Pacífico. + + + Este animal no puede entrar en el modo Amor. Se ha alcanzado la cantidad máxima de cría de cerdos, ovejas, vacas, gatos y caballos. + + + El huevo generador no está disponible en estos momentos. Se ha alcanzado la cantidad máxima de calamares. + + + El huevo generador no está disponible en estos momentos. Se ha alcanzado la cantidad máxima de enemigos. + + + El huevo generador no está disponible en estos momentos. Se ha alcanzado la cantidad máxima de aldeanos. + + + Este animal no puede entrar en modo Amor. Se ha alcanzado el límite de cría de lobos. + + + Se ha alcanzado el límite de cabezas de enemigos en un mundo. + + + Invertir vista + + + Zurdo + + + Este animal no puede entrar en modo Amor. Se ha alcanzado el límite de cría de gallinas. + + + Este animal no puede entrar en modo Amor. Se ha alcanzado el límite de cría de champiñacas. + + + Se ha alcanzado la cantidad máxima de barcos en un mundo. + + + El huevo generador no está disponible en estos momentos. Se ha alcanzado la cantidad máxima de gallinas. + + + {*C2*}Ahora, respira. Vuelve a respirar. Siente el aire en los pulmones. Permite que tus extremidades regresen. Sí, mueve los dedos. Vuelve a tener un cuerpo sometido a la gravedad, en el aire. Vuelve a generarte en el sueño largo. Ahí estás. Todo tu cuerpo vuelve a tocar el universo, como si fuerais cosas distintas. Como si fuerais cosas distintas.{*EF*}{*B*}{*B*} +{*C3*}¿Quiénes somos? Otrora nos llamaron los espíritus de la montaña. Padre sol, madre luna. Espíritus ancestrales, espíritus animales. Genios. Fantasmas. Los hombrecillos verdes. Después, dioses, demonios. Ángeles. Fenómenos paranormales. Alienígenas, extraterrestres. Leptones, quarks. Las palabras cambian. Nosotros no.{*EF*}{*B*}{*B*} +{*C2*}Somos el universo. Somos todo lo que piensas que no eres tú. Nos estás mirando a través de tu piel y tus ojos. ¿Y por qué toca el universo tu piel y te ilumina? Para verte, jugador. Para conocerte. Y para que nos conozcas. Te contaré una historia.{*EF*}{*B*}{*B*} +{*C2*}Érase una vez un jugador.{*EF*}{*B*}{*B*} +{*C3*}El jugador eras tú, {*PLAYER*}.{*EF*}{*B*}{*B*} +{*C2*}A veces, el jugador se consideraba un ser humano, en la fina corteza de una esfera de roca derretida. La esfera de roca derretida giraba alrededor de una esfera de gas ardiente que era trescientas treinta mil veces mayor que ella. Estaban tan separadas que la luz tardaba ocho minutos en llegar de una a otra. La luz era información de una estrella y podía quemar la piel a cincuenta millones de kilómetros de distancia.{*EF*}{*B*}{*B*} +{*C2*}A veces, el jugador soñaba que era un minero, sobre la superficie de un mundo plano e infinito. El sol era un cuadrado blanco. Los días eran cortos; había mucho que hacer y la muerte no era más que un inconveniente temporal.{*EF*}{*B*}{*B*} +{*C3*}A veces, el jugador soñaba que estaba perdido en una historia.{*EF*}{*B*}{*B*} +{*C2*}A veces, el jugador soñaba que era otras cosas, en otros lugares. A veces, esos sueños eran perturbadores. A veces, realmente bellos. A veces, el jugador se despertaba de un sueño en otro, y después de ese en un tercero.{*EF*}{*B*}{*B*} +{*C3*}A veces, el jugador soñaba que veía palabras en una pantalla.{*EF*}{*B*}{*B*} +{*C2*}Retrocedamos.{*EF*}{*B*}{*B*} +{*C2*}Los átomos del jugador estaban esparcidos en la hierba, en los ríos, en el aire, en la tierra. Una mujer recogió los átomos, bebió y comió y respiró; y la mujer ensambló al jugador en su cuerpo.{*EF*}{*B*}{*B*} +{*C2*}Y el jugador despertó del mundo oscuro y cálido del cuerpo de su madre en el sueño largo.{*EF*}{*B*}{*B*} +{*C2*}Y el jugador fue una nueva historia, nunca antes contada, escrita con ADN. Y el jugador era un nuevo programa, que nunca se había ejecutado, generado por un código fuente con un billón de años. Y el jugador era un nuevo ser humano, que nunca había vivido antes, hecho tan solo de leche y amor.{*EF*}{*B*}{*B*} +{*C3*}Tú eres el jugador. La historia. El programa. El humano. Hecho tan solo de leche y amor.{*EF*}{*B*}{*B*} +{*C2*}Retrocedamos más.{*EF*}{*B*}{*B*} +{*C2*}Los siete trillones de trillones de trillones de átomos del jugador se crearon, mucho antes de este juego, en el corazón de una estrella. Así que el jugador también es información de una estrella. Y el jugador se mueve a través de una historia que es un bosque de información colocada por un tipo llamado Julian, en un mundo infinito y plano creado por un hombre llamado Markus que existe en un mundo pequeño y privado creado por el jugador que habita un universo creado por...{*EF*}{*B*}{*B*} +{*C3*}Sssh. A veces, el jugador creaba un mundo pequeño y privado que era suave, cálido y sencillo. A veces, frío, duro y complicado. A veces, creaba un modelo del universo en su cabeza; motas de energía moviéndose a través de vastos espacios vacíos. A veces llamaba a esas motas "electrones" y "protones".{*EF*}{*B*}{*B*} + + + {*C2*}A veces, las llamaba "planetas" y "estrellas".{*EF*}{*B*}{*B*} +{*C2*}A veces, creía que estaba en un universo hecho de energía que estaba compuesto de encendidos y apagados, de ceros y unos, de líneas de código. A veces, creía que jugaba a un juego. A veces, creía que leía palabras en una pantalla.{*EF*}{*B*}{*B*} +{*C3*}Tú eres el jugador, que lee palabras...{*EF*}{*B*}{*B*} +{*C2*}Sssh... A veces, el jugador leía líneas de código en una pantalla. Las decodificaba en palabras, decodificaba las palabras en significados; decodificaba los significados en sentimientos, teorías, ideas... y el jugador comenzó a respirar cada vez más deprisa y más profundamente cuando se dio cuenta de que estaba vivo, estaba vivo, esas miles de muertes no habían sido reales, el jugador estaba vivo.{*EF*}{*B*}{*B*} +{*C3*}Tú. Tú. Tú estás vivo.{*EF*}{*B*}{*B*} +{*C2*}Y, a veces, el jugador creía que el universo le había hablado a través de la luz del sol del verano que se colaba entre las hojas al viento.{*EF*}{*B*}{*B*} +{*C3*}Y, a veces, el jugador creía que el universo le había hablado a través de la luz que llegaba del frío cielo nocturno del invierno, donde una mota de luz en el rabillo del ojo del jugador podría ser una estrella un millón de veces más grande que el sol, quemando sus planetas, convirtiéndolos en plasma, para que el jugador pudiera verla un instante desde el otro extremo del universo mientras volvía a casa, mientras olía comida de pronto, casi en su puerta, a punto de volver a soñar.{*EF*}{*B*}{*B*} +{*C2*}Y, a veces, el jugador creía que el universo le había hablado a través de los ceros y los unos, a través de la electricidad del mundo, a través de las palabras deslizándose por una pantalla al final de un sueño.{*EF*}{*B*}{*B*} +{*C3*}Y el universo le decía te quiero.{*EF*}{*B*}{*B*} +{*C2*}Y el universo le decía has jugado bien.{*EF*}{*B*}{*B*} +{*C3*}Y el universo le decía cuanto necesitas está en tu interior.{*EF*}{*B*}{*B*} +{*C2*}Y el universo le decía eres más fuerte de lo que crees.{*EF*}{*B*}{*B*} +{*C3*}Y el universo le decía eres la luz del día.{*EF*}{*B*}{*B*} +{*C2*}Y el universo le decía eres la noche.{*EF*}{*B*}{*B*} +{*C3*}Y el universo le decía tu lucha está en tu interior.{*EF*}{*B*}{*B*} +{*C2*}Y el universo le decía la luz que buscas está en tu interior.{*EF*}{*B*}{*B*} +{*C3*}Y el universo le decía no estás solo.{*EF*}{*B*}{*B*} +{*C2*}Y el universo le decía no estás separado del resto de las cosas.{*EF*}{*B*}{*B*} +{*C3*}Y el universo le decía eres el universo probándose a sí mismo, hablando consigo mismo, leyendo su propio código.{*EF*}{*B*}{*B*} +{*C2*}Y el universo le decía te quiero porque eres amor.{*EF*}{*B*}{*B*} +{*C3*}Y el juego había acabado y el jugador se despertó del sueño. Y el jugador comenzó un nuevo sueño. Y el jugador volvió a soñar, soñó mejor. Y el jugador era el universo. Y el jugador era amor.{*EF*}{*B*}{*B*} +{*C3*}Tú eres el jugador.{*EF*}{*B*}{*B*} +{*C2*}Despierta.{*EF*} + + + Restablecer mundo inferior + + + %s ha entrado en El Fin. + + + %s ha salido de El Fin. + + + {*C3*}Veo a ese jugador al que te referías.{*EF*}{*B*}{*B*} +{*C2*}¿{*PLAYER*}?{*EF*}{*B*}{*B*} +{*C3*}Sí. Cuidado. Ha alcanzado un nivel superior. Puede leer nuestros pensamientos.{*EF*}{*B*}{*B*} +{*C2*}No importa. Cree que somos parte del juego.{*EF*}{*B*}{*B*} +{*C3*}Me gusta. Ha jugado bien. No se ha rendido.{*EF*}{*B*}{*B*} +{*C2*}Lee nuestros pensamientos como si fueran textos en una pantalla.{*EF*}{*B*}{*B*} +{*C3*}Así le gusta imaginar muchas cosas, cuando está en lo más profundo del sueño del juego.{*EF*}{*B*}{*B*} +{*C2*}Las palabras son una interfaz maravillosa. Muy flexibles. Y asustan menos que contemplar la realidad que se oculta detrás de la pantalla.{*EF*}{*B*}{*B*} +{*C3*}Antes oían voces. Antes de que los jugadores pudieran leer. En aquellos tiempos en los que los que no jugaban llamaban a los jugadores hechiceros y brujas. Y en los que los jugadores soñaban que volaban sobre palos impulsados por demonios.{*EF*}{*B*}{*B*} +{*C2*}¿Qué soñaba este jugador?{*EF*}{*B*}{*B*} +{*C3*}Soñaba la luz del sol y los árboles. Fuego y agua. Soñaba que creaba. Y soñaba que destruía. Soñaba que cazaba y que le daban caza. Soñaba un refugio.{*EF*}{*B*}{*B*} +{*C2*}Ja, la interfaz original. Tiene un millón de años y sigue funcionando. Pero ¿qué estructura verdadera ha creado en la realidad tras la pantalla?{*EF*}{*B*}{*B*} +{*C3*}Colaboró con muchos más para esculpir un mundo real en un pliego de {*EF*}{*NOISE*}{*C3*} y creó un {*EF*}{*NOISE*}{*C3*} para {*EF*}{*NOISE*}{*C3*} en {*EF*}{*NOISE*}{*C3*}.{*EF*}{*B*}{*B*} +{*C2*}Pero eso no lo puede leer.{*EF*}{*B*}{*B*} +{*C3*}No. Todavía no ha alcanzado el nivel superior. Debe conseguirlo en el largo sueño de la vida, no el corto sueño de un juego.{*EF*}{*B*}{*B*} +{*C2*}¿Sabe que lo queremos? ¿Que el universo es amable?{*EF*}{*B*}{*B*} +{*C3*}A veces, entre el ruido de sus pensamientos, escucha al universo, sí.{*EF*}{*B*}{*B*} +{*C2*}Pero, a veces, está triste en el sueño largo. Crea mundos que no tienen verano y tiembla bajo un sol negro, y confunde su creación triste con la realidad.{*EF*}{*B*}{*B*} +{*C3*}Quitarle la pena lo destruiría. La pena es parte de su propia misión. No podemos interferir.{*EF*}{*B*}{*B*} +{*C2*}A veces, cuando están en un sueño muy profundo, quiero decírselo, decirles que están construyendo mundos de verdad en la realidad. A veces, quiero decirles que son importantes para el universo. A veces, cuando no han creado una conexión real en mucho tiempo, quiero ayudarles a decir la palabra que temen.{*EF*}{*B*}{*B*} +{*C3*}Lee nuestros pensamientos.{*EF*}{*B*}{*B*} +{*C2*}A veces, no me importa. A veces, quiero decirles que este mundo que toman por real tan solo es {*EF*}{*NOISE*}{*C2*} y {*EF*}{*NOISE*}{*C2*}, quiero decirles que son {*EF*}{*NOISE*}{*C2*} en {*EF*}{*NOISE*}{*C2*}. Ven tan poco de la realidad en su sueño largo.{*EF*}{*B*}{*B*} +{*C3*}Pero siguen jugando.{*EF*}{*B*}{*B*} +{*C2*}Y sería tan fácil decírselo...{*EF*}{*B*}{*B*} +{*C3*}Demasiado fuerte para este sueño. Decirles cómo vivir es impedir que vivan.{*EF*}{*B*}{*B*} +{*C2*}Nunca diré a un jugador cómo vivir.{*EF*}{*B*}{*B*} +{*C3*}Se está inquietando.{*EF*}{*B*}{*B*} +{*C2*}Le contaré una historia.{*EF*}{*B*}{*B*} +{*C3*}Pero no la verdad.{*EF*}{*B*}{*B*} +{*C2*}No. Una historia que contenga la verdad de forma segura, en una jaula de palabras. No la verdad desnuda que puede quemar a cualquier distancia.{*EF*}{*B*}{*B*} +{*C3*}Dale un cuerpo, otra vez.{*EF*}{*B*}{*B*} +{*C2*}Sí. Jugador...{*EF*}{*B*}{*B*} +{*C3*}Utiliza su nombre.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}. Jugador de juegos.{*EF*}{*B*}{*B*} +{*C3*}Bien.{*EF*}{*B*}{*B*} + + + ¿Seguro que quieres restablecer el mundo inferior de este archivo guardado a sus valores predeterminados? Perderás todo lo que has construido en el mundo inferior. + + + El huevo generador no está disponible en estos momentos. Se ha alcanzado la cantidad máxima de cerdos, ovejas, vacas, gatos y caballos. + + + El huevo generador no está disponible en estos momentos. Se ha alcanzado la cantidad máxima de champiñacas. + + + El huevo generador no está disponible en estos momentos. Se ha alcanzado la cantidad máxima de lobos. + + + Restablecer mundo inferior + + + No restablecer mundo inferior + + + No se puede trasquilar esta champiñaca en este momento. Límite de cerdos, ovejas, vacas, gatos y caballos alcanzado. + + + ¡Has muerto! + + + Opciones de mundo + + + Puede construir y extraer + + + Puede usar puertas e interruptores + + + Generar estructuras + + + Mundo superplano + + + Cofre de bonificación + + + Puede abrir contenedores + + + Expulsar jugador + + + Puede volar + + + Desactivar agotamiento + + + Puede atacar a jugadores + + + Puede atacar a animales + + + Moderador + + + Privilegios de anfitrión + + + Cómo se juega + + + Controles + + + Configuración + + + Regenerar + + + Ofertas de contenido descargable + + + Cambiar aspecto + + + Créditos + + + La dinamita explota + + + Jugador contra jugador + + + Confiar en jugadores + + + Volver a instalar contenido + + + Ajustes de depuración + + + El fuego se propaga + + + Dragón finalizador + + + {*PLAYER*} murió a causa del aliento del dragón finalizador. + + + {*SOURCE*} asesinó a {*PLAYER*}. + + + {*SOURCE*} asesinó a {*PLAYER*}. + + + {*PLAYER*} murió. + + + {*PLAYER*} explotó. + + + {*PLAYER*} murió a causa de la magia. + + + {*SOURCE*} disparó a {*PLAYER*}. + + + Niebla de lecho de roca + + + Mostrar panel de datos + + + Mostrar mano + + + {*SOURCE*} quemó con bolas de fuego a {*PLAYER*}. + + + {*SOURCE*} apaleó a {*PLAYER*}. + + + {*PLAYER*} ha muerto a manos de {*SOURCE*} usando magia. + + + {*PLAYER*} se cayó del mundo. + + + Packs de textura + + + Packs de popurrí + + + {*PLAYER*} ardió. + + + Temas + + + Imágenes de jugador + + + Objetos de avatar + + + {*PLAYER*} se quemó hasta morir. + + + {*PLAYER*} se murió de hambre. + + + {*PLAYER*} se pinchó hasta morir. + + + {*PLAYER*} se golpeó demasiado fuerte contra el suelo. + + + {*PLAYER*} intentó nadar en la lava. + + + {*PLAYER*} se asfixió en un muro. + + + {*PLAYER*} se ahogó. + + + Mensajes de muerte + + + Ya no eres moderador. + + + Ahora puedes volar. + + + Ya no puedes volar. + + + Ya no puedes atacar a animales. + + + Ahora puedes atacar a animales. + + + Ahora eres moderador. + + + Ya no te cansarás. + + + Ahora eres invulnerable. + + + Ya no eres invulnerable. + + + %d MSP + + + Ahora te cansarás. + + + Ahora eres invisible. + + + Ya no eres invisible. + + + Ahora puedes atacar a jugadores. + + + Ahora puedes extraer y usar objetos. + + + Ya no puedes colocar bloques. + + + Ahora puedes colocar bloques. + + + Personaje animado + + + Animación de aspecto pers. + + + Ya no puedes extraer ni usar objetos. + + + Ahora puedes usar puertas e interruptores. + + + Ya no puedes atacar a enemigos. + + + Ahora puedes atacar a enemigos. + + + Ya no puedes atacar a jugadores. + + + Ya no puedes usar puertas ni interruptores. + + + Ahora puedes usar contenedores (p. ej. cofres). + + + Ya no puedes usar contenedores (p. ej. cofres). + + + Invisible + + + Balizas + + + {*T3*}CÓMO SE JUEGA: BALIZAS{*ETW*}{*B*}{*B*} +Las balizas activas proyectan un brillante rayo de luz hacia el cielo y otorgan poderes a los jugadores cercanos.{*B*} +Se crean con cristal, obsidiana y estrellas del mundo inferior, que pueden obtenerse derrotando al Wither.{*B*}{*B*} +Las balizas deben situarse de forma que les dé el sol durante el día. Deben colocarse sobre pirámides de hierro, oro, esmeralda o diamante.{*B*} +El material sobre el que se coloca la baliza no afecta a su poder.{*B*}{*B*} +En el menú de baliza puedes seleccionar un poder principal para tu baliza. Cuantos más niveles tenga la pirámide, más poderes habrá para elegir.{*B*} +Una baliza sobre una pirámide de al menos cuatro niveles también ofrece la opción del poder secundario de regeneración o de un poder principal más fuerte.{*B*}{*B*} +Para determinar los poderes de tu baliza, debes sacrificar una esmeralda, un diamante o un lingote de oro o hierro en el espacio de pago.{*B*} +Una vez determinados, los poderes emanarán de la baliza indefinidamente.{*B*} + + + Fuegos artificiales + + + Idiomas + + + Caballos + + + {*T3*}CÓMO SE JUEGA: CABALLOS{*ETW*}{*B*}{*B*} +Los caballos y burros se encuentran sobre todo en las llanuras. Las mulas son el producto del cruce entre burro y caballo, pero son estériles.{*B*} +Todos los caballos, burros y mulas adultos pueden montarse. Sin embargo, solo los caballos pueden llevar armadura, y solo las mulas y los burros pueden equiparse con alforjas para transportar objetos.{*B*}{*B*} +Los caballos, burros y mulas deben domesticarse antes de poder utilizarlos. Un caballo se domestica intentando montar en él, y manteniéndose a lomos del caballo mientras este intenta sacudirse al jinete.{*B*} +Cuando aparezcan corazones alrededor del caballo, ya estará domesticado y dejará de intentar quitarse de encima al jugador. Para guiar al caballo, el jugador debe equiparlo con una silla.{*B*}{*B*} +Las sillas pueden comprarse a los aldeanos o encontrarse en cofres ocultos por el mundo.{*B*} +Los burros y mulas domesticados pueden equiparse con alforjas agachándose y acoplándoles un cofre. Luego, se puede acceder a estas alforjas mientras se monta o agachándose.{*B*}{*B*} +Los caballos y burros (pero no las mulas) pueden criarse como otros animales, usando manzanas de oro o zanahorias de oro.{*B*} +Los potros se convierten en caballos adultos con el tiempo, aunque alimentarlos con trigo o heno acelera el proceso.{*B*} + + + + {*T3*}CÓMO SE JUEGA: FUEGOS ARTIFICIALES{*ETW*}{*B*}{*B*} +Los fuegos artificiales son objetos decorativos que pueden lanzarse a mano o desde dispensadores. Se fabrican usando papel, pólvora y, de forma optativa, un número de estrellas de fuegos artificiales.{*B*} +Los colores, cambios de color, formas, tamaños y efectos (como estelas y parpadeos) de las estrellas de fuegos artificiales pueden personalizarse añadiendo ingredientes adicionales durante la creación.{*B*}{*B*} +Para crear fuegos artificiales, coloca pólvora y papel en la cuadrícula de creación de 3 x 3 que aparece sobre tu inventario.{*B*} +También puedes colocar varias estrellas de fuegos artificiales en la cuadrícula para añadirlas a los fuegos artificiales.{*B*} +Llenar más espacios en la cuadrícula con pólvora aumentará la altura a la que harán explosión las estrellas de fuegos artificiales.{*B*}{*B*} +Luego puedes coger los fuegos artificiales terminados en el espacio de salida.{*B*}{*B*} +Las estrellas de fuegos artificiales pueden crearse colocando pólvora y tinte en la cuadrícula.{*B*} +- El tinte determinará el color de la explosión de la estrella de fuegos artificiales.{*B*} +- La forma de la estrella de fuegos artificiales se establece añadiendo una descarga de fuego, una pepita de oro, una pluma o una cabeza de enemigo.{*B*} +- Puede añadirse una estela o un parpadeo usando diamantes o polvo de piedra brillante.{*B*}{*B*} +Después de crear una estrella de fuegos artificiales, puedes determinar su cambio de color combinándola con tinte. + + + {*T3*}CÓMO SE JUEGA: SOLTADORES{*ETW*}{*B*}{*B*} +Cuando reciben energía de piedra rojiza, los soltadores dejan caer al suelo un único objeto aleatorio de su interior. Usa {*CONTROLLER_ACTION_USE*} para abrir el soltador y poder cargarlo de objetos de tu inventario.{*B*} +Si el soltador mira hacia un cofre o un contenedor de otro tipo, el objeto se introducirá en él. Se pueden construir largas cadenas de soltadores para transportar objetos a larga distancia. Para que esto funcione, deben activarse y desactivarse alternativamente. + + + Cuando se utiliza, se convierte en un mapa de la parte del mundo en la que te encuentras, y se rellena según exploras. + + + Las suelta el Wither, y se utilizan para crear balizas. + + + Tolvas + + + {*T3*}CÓMO SE JUEGA: TOLVAS{*ETW*}{*B*}{*B*} +Las tolvas se utilizan para introducir o sacar objetos de contenedores, y para recoger automáticamente los objetos lanzados a su interior.{*B*} +Pueden afectar a soportes para pociones, cofres, dispensadores, soltadores, vagonetas con cofres, vagonetas con tolvas, y también a otras tolvas.{*B*}{*B*} +Una tolva intentará de forma continua absorber los objetos de un contenedor adecuado situado sobre ella. También intentará introducir los objetos almacenados en un contenedor de salida.{*B*} +Si una tolva recibe energía de piedra rojiza, se vuelve inactiva y deja de absorber e introducir objetos.{*B*}{*B*} +Una tolva apunta en la dirección en la que intenta dar salida a los objetos. Para hacer que una tolva apunte hacia un bloque concreto, coloca la tolva contra ese bloque estando en sigilo.{*B*} + + + Soltadores + + + SIN USAR + + + Salud instantánea + + + Daño instantáneo + + + Impulso en salto + + + Cansancio de extracción + + + Fuerza + + + Debilidad + + + Náuseas + + + SIN USAR + + + SIN USAR + + + SIN USAR + + + Regeneración + + + Resistencia + + + Buscando semillas para el generador de mundos. + + + Cuando se activan, crean explosiones coloridas. El color, el efecto, la forma y el cambio de color están determinados por la estrella de fuegos artificiales utilizada al crear los fuegos artificiales. + + + Un tipo de raíl que puede activar o desactivar las vagonetas con tolvas y activar las vagonetas con dinamita. + + + Se utiliza para contener y soltar objetos, o para introducir objetos en otro contenedor, cuando recibe una carga de piedra rojiza. + + + Bloques de colores creados tiñendo arcilla endurecida. + + + Proporciona una carga de piedra rojiza. La carga será más fuerte si hay más objetos sobre la placa. Requiere más peso que la placa ligera. + + + Se utiliza como fuente de energía de piedra rojiza. Puede utilizarse para volver a crear piedra rojiza. + + + Se utiliza para recoger objetos o para transferir objetos hacia o desde contenedores. + + + Puede darse a caballos, burros o mulas para sanar hasta 10 corazones. Acelera el crecimiento de los potros. + + + Murciélago + + + Estas criaturas voladoras se encuentran en cavernas y otros grandes espacios cerrados. + + + Bruja + + + Se crea fundiendo arcilla en un horno. + + + Se crea con cristal y un tinte. + + + Se crea con cristal tintado + + + Proporciona una carga de piedra rojiza. La carga será más fuerte si hay más objetos sobre la placa. + + + Es un bloque que lanza una señal de piedra rojiza según la luz del sol (o la falta de luz). + + + Es un tipo especial de vagoneta que funciona de un modo parecido a una tolva. Recogerá los objetos que haya sobre las vías y de los contenedores que haya sobre ella. + + + Un tipo especial de armadura que pueden equipar los caballos. Proporciona 5 de armadura. + + + Se utiliza para determinar el color, efecto y forma de unos fuegos artificiales. + + + Se utiliza en los circuitos de piedra rojiza para mantener, comparar o restar fuerza de la señal, o para medir ciertos estados de bloques. + + + Es un tipo de vagoneta que se comporta como un bloque de dinamita móvil. + + + Un tipo especial de armadura que pueden equipar los caballos. Proporciona 7 de armadura. + + + Se utiliza para ejecutar comandos. + + + Proyecta un rayo de luz hacia el cielo y puede proporcionar efectos de estado a los jugadores cercanos. + + + Almacena bloques y objetos en su interior. Coloca dos cofres uno al lado del otro para crear un cofre más grande con doble capacidad. El cofre con trampa también crea una carga de piedra rojiza al abrirse. + + + Un tipo especial de armadura que pueden equipar los caballos. Proporciona 11 de armadura. + + + Se utiliza para atar a criaturas al jugador o a postes. + + + Se utiliza para poner nombre a las criaturas del mundo. + + + Rapidez + + + Juego completo + + + Reanudar partida + + + Guardar partida + + + Jugar partida + + + Marcadores + + + Ayuda y opciones + + + Dificultad: + + + JcJ: + + + Confiar en jugadores: + + + Dinamita: + + + Tipo de partida: + + + Estructuras: + + + Tipo de nivel: + + + No se encontraron partidas + + + Solo por invitación + + + Más opciones + + + Cargar + + + Opciones de anfitrión + + + Jugadores/Invitar + + + Partida online + + + Nuevo mundo + + + Jugadores + + + Unirse a partida + + + Iniciar partida + + + Nombre del mundo + + + Semilla para el generador de mundos + + + Dejar vacío para semilla aleatoria + + + El fuego se propaga: + + + Editar mensaje de cartel: + + + Rellena la información que irá junto a tu captura. + + + Subtítulo + + + Ayuda sobre el juego + + + Pantalla dividida vert. para 2 j. + + + Listo + + + Captura de pantalla del juego + + + Sin efectos + + + Celeridad + + + Lentitud + + + Editar mensaje de cartel: + + + ¡Con la interfaz de usuario, los iconos y la textura clásica de Minecraft! + + + Mostrar todos los mundos mezclados + + + Consejos + + + Volver a instalar objeto de avatar 1 + + + Volver a instalar objeto de avatar 2 + + + Volver a instalar objeto de avatar 3 + + + Volver a instalar tema + + + Volver a instalar imagen de jugador 1 + + + Volver a instalar imagen de jugador 2 + + + Opciones + + + Interfaz de usuario + + + Valores predeterminados + + + Oscilación de vista + + + Sonido + + + Control + + + Gráficos + + + Se usa para elaborar pociones. La sueltan los espectros cuando mueren. + + + La sueltan los porqueros zombis cuando mueren. Estos se encuentran en el mundo inferior. Se usa como ingrediente para elaborar pociones. + + + Se usan para preparar pociones. Crecen de forma natural en las fortalezas del mundo inferior. También se pueden plantar en arena de alma. + + + Cuando pasas sobre él, te resbalas. Se convierte en agua cuando se destruye si está sobre otro bloque. Se derrite si está cerca de una fuente de luz o cuando se coloca en el mundo inferior. + + + Se puede usar como elemento decorativo. + + + Se usa para elaborar pociones y para localizar fortalezas. La sueltan las llamas, que se suelen encontrar en las fortalezas del mundo inferior o cerca. + + + Puede tener diversos efectos, dependiendo de con qué se use. + + + Se usa para elaborar pociones o se combina con otros objetos para crear el ojo finalizador o la crema de magma. + + + Se usa para elaborar pociones. + + + Se usa para crear pociones y pociones de salpicadura. + + + Se puede llenar con agua y se usa como ingrediente base para crear una poción en el soporte para pociones. + + + Es una comida venenosa y un ingrediente para pociones. Aparece cuando el jugador mata una araña o una araña de las cuevas. + + + Se usa para elaborar pociones, principalmente con efecto negativo. + + + Una vez colocada, va creciendo con el paso del tiempo. Se puede recoger con cizallas. Puede usarse como una escalera para trepar por ella. + + + Es como una puerta, pero se usa principalmente con vallas. + + + Se puede crear a partir de rodajas de melón. + + + Bloques transparentes que se pueden usar como alternativa a los bloques de cristal. + + + Cuando se activa, se extiende un pistón y empuja los bloques. Cuando se repliega, tira hacia atrás del bloque que está en contacto con la parte extendida del pistón. + + + Se crea con bloques de piedra y se encuentra normalmente en fortalezas. + + + Se usa como barrera, igual que las vallas. + + + Se puede plantar para cultivar calabazas. + + + Se puede emplear en la construcción y en la decoración. + + + Ralentiza el movimiento cuando pasas sobre ella. Se puede destruir con unas cizallas para obtener cuerda. + + + Genera un pez plateado cuando se destruye o, a veces, cuando está cerca de otro pez plateado al que estén atacando. + + + Se puede plantar para cultivar melones. + + + La suelta el finalizador cuando muere. Cuando se lanza, el jugador se teletransporta a la posición donde cae la perla finalizadora y pierde parte de la salud. + + + Un bloque de tierra con hierba encima. Se recoge con una pala y se puede usar para construir. + + + Se puede llenar de agua de lluvia o con un cubo y usar para llenar de agua las botellas de cristal. + + + Se usan para crear escaleras largas. Si colocas dos losas, una sobre otra, crearás un bloque de losa doble de tamaño normal. + + + Se crea al fundir un bloque inferior en un horno. Se puede convertir en bloques de ladrillo del mundo inferior. + + + Al recibir energía, emite luz. + + + Es similar a una vitrina y muestra el objeto o el bloque que contiene. + + + Al lanzarse, puede generar una criatura del tipo indicado. + + + Se usan para crear escaleras largas. Si colocas dos losas, una sobre otra, crearás un bloque de losa doble de tamaño normal. + + + Puede cultivarse en la granja para cosechar granos de cacao. + + + Vaca + + + Suelta cuero cuando muere. Se puede ordeñar con un cubo. + + + Oveja + + + Las cabezas de enemigos pueden colocarse como decoración o llevarse como una máscara en el espacio del casco. + + + Calamar + + + Suelta bolsas de tinta cuando muere. + + + Útil para prender fuego a las cosas o para provocar incendios indiscriminados cuando se dispara con el dispensador. + + + Flota en el agua y se puede caminar sobre él. + + + Se usa para construir fortalezas del mundo inferior. Es inmune a las bolas de fuego del espectro. + + + Se usa en las fortalezas del mundo inferior. + + + Cuando se lanza, indica la dirección a un portal final. Si se colocan doce de ellos en estructuras de portal final, se activará el portal final. + + + Se usa para elaborar pociones. + + + Son similares a los bloques de hierba pero fantásticos para cultivar champiñones. + + + Se encuentra en las fortalezas del mundo inferior y suelta verrugas del mundo inferior cuando se rompe. + + + Un tipo de bloque que se encuentra en El Fin. Tiene una resistencia contra explosiones elevada, así que es útil para utilizar en la construcción. + + + Este bloque se crea al derrotar al dragón en El Fin. + + + Cuando se lanza, suelta orbes de experiencia que aumentan tus puntos de experiencia cuando se recogen. + + + Permite encantar espadas, picos, hachas, palas, arcos y armaduras utilizando puntos de experiencia. + + + Se puede activar con doce ojos finalizadores y permite al jugador viajar a la dimensión El Fin. + + + Se usa para crear un portal final. + + + Cuando se activa (por medio de un botón, una palanca, una placa de presión, una antorcha de piedra rojiza o piedra rojiza con cualquiera de ellos), se extiende un pistón y empuja los bloques. + + + Se cuece con arcilla en un horno. + + + Se cuece y se convierte en ladrillo en un horno. + + + Cuando se rompe suelta bolas de arcilla que se pueden cocer y convertir en ladrillos en un horno. + + + Se corta con un hacha y se puede convertir en tablones o usar como combustible. + + + Se crea en el horno al fundir arena. Se puede usar en la construcción, pero si intentas extraerlo, se romperá. + + + Se extrae de la piedra con un pico. Se puede usar para construir un horno o herramientas de madera. + + + Una forma compacta de almacenar bolas de nieve. + + + Junto con un cuenco se puede convertir en estofado. + + + Solo se puede extraer con un pico de diamante. Se produce al combinar agua con lava inmóvil y se usa para construir portales. + + + Genera monstruos en el mundo. + + + Se puede excavar con una pala para crear bolas de nieve. + + + A veces produce semillas de trigo cuando se rompe. + + + Se puede convertir en tinte. + + + Se recoge con una pala. A veces produce pedernal cuando se excava. Le afecta la gravedad si no hay ningún otro bloque por debajo. + + + Se puede extraer con un pico para obtener hulla. + + + Se puede extraer con un pico de piedra o un objeto mejor para obtener lapislázuli. + + + Se puede extraer con un pico de hierro o un objeto mejor para obtener diamantes. + + + Se usa como elemento decorativo. + + + Se puede extraer con un pico de hierro o un objeto mejor y después fundir en un horno para producir lingotes de oro. + + + Se puede extraer con un pico de piedra o un objeto mejor y después fundir en un horno para producir lingotes de hierro. + + + Se puede extraer con un pico de hierro o un objeto mejor para obtener polvo de piedra rojiza. + + + No se puede romper. + + + Prende fuego a cualquier cosa que toque. Se puede recoger en un cubo. + + + Se recoge con una pala. Se puede fundir y convertir en cristal en el horno. Le afecta la gravedad si no hay ningún otro bloque por debajo. + + + Se puede extraer con un pico para obtener guijarros. + + + Se recoge con una pala. Se puede emplear en la construcción. + + + Se puede plantar y con el tiempo se convierte en un árbol. + + + Se coloca en el suelo para transportar una descarga eléctrica. Si se elabora con una poción, aumentará la duración del efecto. + + + Se obtiene al matar una vaca y se puede convertir en armadura o para hacer libros. + + + Se obtiene al matar un limo o como ingrediente para elaborar pociones o hacer pistones adhesivos. + + + Las gallinas lo ponen al azar y se puede convertir en alimentos. + + + Se obtiene al excavar gravilla y se puede usar para crear un chisquero de pedernal. + + + Si se usa con un cerdo te permite montarlo. Luego puedes manejar al cerdo con una zanahoria con palo. + + + Se obtiene al excavar nieve y se puede arrojar. + + + Se obtiene al extraer una piedra brillante y se puede convertir en bloques de piedra brillante otra vez o para elaborar una poción para aumentar la potencia del efecto. + + + Si se rompen, a veces sueltan un brote que se puede plantar para que crezca un árbol. + + + Se encuentra en mazmorras y se puede emplear en la construcción y en la decoración. + + + Se usan para obtener lana de las ovejas y cosechar bloques de hoja. + + + Se obtiene al matar un esqueleto. Se puede convertir en polvo de hueso. Se puede dar de comer a un lobo para domarlo. + + + Se obtiene al hacer que un esqueleto mate a un creeper. Se puede reproducir en un tocadiscos. + + + Apaga el fuego y ayuda a que crezcan las cosechas. Se puede recoger en un cubo. + + + Se recoge de los cultivos y se puede usar para crear alimentos. + + + Se pueden usar para crear azúcar. + + + Se puede llevar como casco o convertir en antorcha para crear una calabaza iluminada. También es el ingrediente principal del pastel de calabaza. + + + Si se le prende fuego, arderá para siempre. + + + Cuando están completamente maduras, las cosechas se pueden recoger para obtener trigo. + + + Terreno que se ha preparado para plantar semillas. + + + Se pueden cocinar en un horno para crear tinte verde. + + + Ralentiza el movimiento de cualquier cosa que camina sobre ella. + + + Se consigue al matar una gallina y se puede convertir en una flecha. + + + Se consigue al matar un creeper y se puede convertir en dinamita o como ingrediente para elaborar pociones. + + + Se puede plantar en una granja para que crezcan cultivos. ¡Asegúrate de que hay luz suficiente para que prosperen! + + + Si te colocas en el portal podrás trasladarte del mundo superior al inferior y viceversa. + + + Se usa como combustible en un horno o se puede convertir en una antorcha. + + + Se consigue al matar una araña y se puede convertir en un arco o en una caña de pescar, o colocarlo en el suelo para crear cuerda de trampa. + + + Suelta lana cuando se esquila (si aún no ha sido esquilada). Se puede teñir para que su lana sea de diferente color. + + + Business Development + + + Portfolio Director + + + Product Manager + + + Development Team + + + Release Management + + + Director, XBLA Publishing + + + Marketing + + + Asia Localization Team + + + User Research Team + + + MGS Central Teams + + + Community Manager + + + Europe Localization Team + + + Redmond Localization Team + + + Design Team + + + Director of Fun + + + Music and Sounds + + + Programming + + + Chief Architect + + + Art Developer + + + Game Crafter + + + Art + + + Producer + + + Test Lead + + + Lead Tester + + + QA + + + Executive Producer + + + Lead Producer + + + Milestone Acceptance Tester + + + Pala de hierro + + + Pala de diamante + + + Pala de oro + + + Espada de oro + + + Pala de madera + + + Pala de piedra + + + Pico de madera + + + Pico de oro + + + Hacha de madera + + + Hacha de piedra + + + Pico de piedra + + + Pico de hierro + + + Pico de diamante + + + Espada de diamante + + + SDET + + + Project STE + + + Additional STE + + + Special Thanks + + + Test Manager + + + Senior Test Lead + + + Test Associates + + + Espada de madera + + + Espada de piedra + + + Espada de hierro + + + Jon Kågström + + + Tobias Möllstam + + + Risë Lugo + + + Developer + + + Te dispara bolas de fuego que explotan al entrar en contacto. + + + Limo + + + Escupe limos más pequeños cuando recibe daños. + + + Porquero zombi + + + En principio es manso, pero si atacas a uno, atacará en grupo. + + + Espectro + + + Finalizador + + + Araña de las cuevas + + + Tiene una picadura venenosa. + + + Champiñaca + + + Te ataca si lo miras. También puede mover bloques de sitio. + + + Pez plateado + + + Atrae a los peces plateados ocultos cercanos al atacarlo. Se oculta en bloques de piedra. + + + Te ataca cuando está cerca. + + + Suelta chuletas de cerdo cuando muere. Se puede montar con una silla. + + + Lobo + + + Es dócil hasta que lo atacan, ya que devolverá el ataque. Se puede domar con huesos para que te siga a todas partes y ataque a cualquier cosa que te ataque a ti. + + + Gallina + + + Suelta plumas cuando muere y pone huevos al azar. + + + Cerdo + + + Creeper + + + Araña + + + Te ataca cuando está cerca. Puede trepar por muros. Suelta cuerda cuando muere. + + + Zombi + + + ¡Explota si te acercas demasiado! + + + Esqueleto + + + Te dispara flechas. Suelta flechas y huesos cuando muere. + + + Crea estofado de champiñón si se usa en un cuenco. Suelta champiñones y se convierte en una vaca normal cuando se esquila. + + + Original Design and Code by + + + Project Manager/Producer + + + Rest of Mojang Office + + + Concept Artist + + + Number Crunching and Statistics + + + Bully Coordinator + + + Lead Game Programmer Minecraft PC + + + Customer Support + + + Office DJ + + + Designer/Programmer Minecraft - Pocket Edition + + + Ninja Coder + + + CEO + + + White Collar Worker + + + Explosives Animator + + + Un dragón negro y grande que se encuentra en El Fin. + + + Llama + + + Son enemigos que se encuentran en el mundo inferior, principalmente dentro de sus fortalezas. Sueltan varas de llama cuando mueren. + + + Gólem de nieve + + + Se crea con bloques de nieve y una calabaza. Lanza bolas de nieve a los enemigos de su creador. + + + Dragón finalizador + + + Cubo de magma + + + Se encuentra en junglas. Puede domarse dándole de comer pescado crudo. Tienes que dejar que se te acerque, aunque ten cuidado: un movimiento repentino lo espantará. + + + Gólem de hierro + + + Aparece en aldeas para protegerlas y puede crearse usando bloques de hierro y calabazas. + + + Se encuentran en el mundo inferior. Son parecidos a los limos y se fragmentan en versiones más pequeñas cuando mueren. + + + Aldeano + + + Ocelote + + + Permite crear encantamientos más potentes si se coloca cerca de una mesa de encantamientos. + + + {*T3*}CÓMO SE JUEGA: HORNO{*ETW*}{*B*}{*B*} +En el horno puedes transformar objetos con fuego. Por ejemplo, puedes convertir mineral de hierro en lingotes de hierro.{*B*}{*B*} +Coloca el horno en el mundo y pulsa{*CONTROLLER_ACTION_USE*} para usarlo.{*B*}{*B*} +En la parte inferior del horno debes colocar combustible, y el objeto que quieres fundir, en la parte superior. El horno se encenderá y empezará a funcionar.{*B*}{*B*} +Después de fundir los objetos puedes trasladarlos de la zona de producción a tu inventario.{*B*}{*B*} +Si el objeto sobre el que estás es un ingrediente o combustible para el horno, aparecerán mensajes de función para activar un movimiento rápido y enviarlo al horno. + + + {*T3*}CÓMO SE JUEGA: DISPENSADOR{*ETW*}{*B*}{*B*} +El dispensador se usa para arrojar objetos. Para ello tendrás que colocar un interruptor (una palanca, por ejemplo) junto al dispensador para accionarlo.{*B*}{*B*} +Para llenar el dispensador con objetos, pulsa{*CONTROLLER_ACTION_USE*} y mueve los objetos que quieres arrojar desde tu inventario al dispensador.{*B*}{*B*} +A partir de ese momento, cuando uses el interruptor, el dispensador arrojará un objeto. + + + {*T3*}CÓMO SE JUEGA: ELABORACIÓN DE POCIONES{*ETW*}{*B*}{*B*} +Para elaborar pociones se necesita un soporte para pociones, que se puede construir en la mesa de trabajo. Todas las pociones se empiezan con una botella de agua, que se obtiene al llenar una botella de cristal con agua de un caldero o una fuente.{*B*} +Los soportes para pociones tienen tres espacios para botellas, de modo que puedes preparar tres pociones a la vez. Se puede usar un ingrediente en las tres botellas, así que procura elaborar siempre las pociones de tres en tres para aprovechar mejor tus recursos.{*B*} +Si colocas un ingrediente de poción en la posición superior del soporte para pociones, tras un breve periodo de tiempo obtendrás una poción básica. Esto no tiene ningún efecto por sí mismo, pero si añades otro ingrediente a esta poción básica, obtendrás una poción con un efecto.{*B*} +Cuando obtengas esa poción, podrás añadir un tercer ingrediente para que el efecto sea más duradero (usando polvo de piedra rojiza), más intenso (con polvo de piedra brillante) o convertirlo en una poción perjudicial (con un ojo de araña fermentado).{*B*} +También puedes añadir pólvora a cualquier poción para convertirla en una poción de salpicadura, que después podrás arrojar. Si lanzas una poción de salpicadura, su efecto se aplicará sobre toda la zona donde caiga.{*B*} + +Los ingredientes originales de las pociones son:{*B*}{*B*} +* {*T2*}Verruga del mundo inferior{*ETW*}{*B*} +* {*T2*}Ojo de araña{*ETW*}{*B*} +* {*T2*}Azúcar{*ETW*}{*B*} +* {*T2*}Lágrima de espectro{*ETW*}{*B*} +* {*T2*}Polvo de llama{*ETW*}{*B*} +* {*T2*}Crema de magma{*ETW*}{*B*} +* {*T2*}Melón resplandeciente{*ETW*}{*B*} +* {*T2*}Polvo de piedra rojiza{*ETW*}{*B*} +* {*T2*}Polvo de piedra brillante{*ETW*}{*B*} +* {*T2*}Ojo de araña fermentado{*ETW*}{*B*}{*B*} + +Tendrás que experimentar y combinar ingredientes para averiguar cuántas pociones diferentes puedes crear. + + + {*T3*}CÓMO SE JUEGA: COFRE GRANDE{*ETW*}{*B*}{*B*} +Si se colocan dos cofres normales, uno junto a otro, se combinarán para formar un cofre grande.{*B*}{*B*} +Se usa como si fuera un cofre normal. + + + {*T3*}CÓMO SE JUEGA: CREACIÓN{*ETW*}{*B*}{*B*} +En la interfaz de creación puedes combinar objetos del inventario para crear nuevos tipos de objetos. Usa{*CONTROLLER_ACTION_CRAFTING*} para abrir la interfaz de creación.{*B*}{*B*} +Desplázate por las pestañas de la parte superior con {*CONTROLLER_VK_LB*} y {*CONTROLLER_VK_RB*} para seleccionar el tipo de objeto que quieres crear; a continuación, usa{*CONTROLLER_MENU_NAVIGATE*} para seleccionar el objeto y crearlo.{*B*}{*B*} +La zona de creación indica los objetos que se necesitan para crear el nuevo objeto. Pulsa{*CONTROLLER_VK_A*} para crear el objeto y colocarlo en tu inventario. + + + {*T3*}CÓMO SE JUEGA: MESA DE TRABAJO{*ETW*}{*B*}{*B*} +Con una mesa de trabajo puedes crear objetos más grandes.{*B*}{*B*} +Coloca la mesa en el mundo y pulsa{*CONTROLLER_ACTION_USE*} para usarla.{*B*}{*B*} +La creación en una mesa se realiza igual que la creación normal, pero dispones de un área de creación mayor y una selección de objetos para crear más amplia. + + + {*T3*}CÓMO SE JUEGA: ENCANTAMIENTOS{*ETW*}{*B*}{*B*} +Los puntos de experiencia que se recogen cuando muere un enemigo, o cuando se extraen o se funden determinados bloques en un horno, se pueden usar para encantar herramientas, armas, armaduras y libros.{*B*} +Cuando la espada, el arco, el hacha, el pico, la pala, la armadura o el libro se colocan en el espacio que está debajo del libro en la mesa de encantamiento, los tres botones de la parte derecha del espacio mostrarán algunos encantamientos y sus niveles de experiencia correspondientes.{*B*} +Si no tienes suficientes niveles de experiencia para usarlos, el coste aparecerá en rojo; de lo contrario, aparecerá en verde.{*B*}{*B*} +El encantamiento que se aplica se selecciona aleatoriamente en función del coste que aparece.{*B*}{*B*} +Si la mesa de encantamiento está rodeada de estanterías (hasta un máximo de 15), con un espacio de un bloque entre la estantería y la mesa de encantamiento, la intensidad de los encantamientos aumentará y aparecerán glifos arcanos en el libro de la mesa de encantamientos.{*B*}{*B*} +Todos los ingredientes para la mesa de encantamientos se pueden encontrar en las aldeas de un mundo o al extraer mineral y cultivar en él.{*B*}{*B*} +Los libros encantados se usan en el yunque para aplicar encantamientos a los objetos. Esto proporciona un control mayor sobre los encantamientos que quieras hacer a tus objetos.{*B*} + + + {*T3*}CÓMO SE JUEGA: BLOQUEAR NIVELES{*ETW*}{*B*}{*B*} +Si detectas contenido ofensivo en algún nivel, puedes añadirlo a la lista de niveles bloqueados. +Si quieres hacerlo, accede al menú de pausa y pulsa {*CONTROLLER_VK_RB*} para seleccionar el mensaje de función Bloquear nivel. +Si en un momento posterior quieres unirte a este nivel, recibirás una notificación de que se encuentra en la lista de niveles bloqueados y tendrás la opción de eliminarlo de la lista y seguir con él o dejarlo bloqueado. + + + {*T3*}CÓMO SE JUEGA: OPCIONES DE ANFITRIÓN Y DE JUGADOR{*ETW*}{*B*}{*B*} + + {*T1*}Opciones de partida{*ETW*}{*B*} + Al cargar o crear un mundo, pulsa el botón "Más opciones" para entrar en un menú donde podrás tener más control sobre tu partida.{*B*}{*B*} + + {*T2*}Jugador contra jugador{*ETW*}{*B*} + Si está habilitado, los jugadores pueden causar daño a otros jugadores. Esta opción solo afecta al modo Supervivencia.{*B*}{*B*} + + {*T2*}Confiar en jugadores{*ETW*}{*B*} + Si está deshabilitado, los jugadores que se unen a la partida tienen restringidas sus acciones. No pueden extraer ni usar objetos, colocar bloques, usar puertas ni interruptores, usar contenedores, atacar a jugadores o atacar a animales. Las opciones de un jugador determinado se pueden cambiar en el menú del juego.{*B*}{*B*} + + {*T2*}El fuego se propaga{*ETW*}{*B*} + Si está habilitado, el fuego se puede propagar a los bloques inflamables cercanos. Esta opción también se puede cambiar dentro del juego.{*B*}{*B*} + + {*T2*}La dinamita explota{*ETW*}{*B*} + Si está habilitado, la dinamita explota cuando se detona. Esta opción también se puede cambiar dentro del juego.{*B*}{*B*} + + {*T2*}Privilegios de anfitrión{*ETW*}{*B*} + Si está habilitado, el anfitrión puede activar su habilidad para volar, deshabilitar el agotamiento y hacerse invisible desde el menú del juego. {*DISABLES_ACHIEVEMENTS*}.{*B*}{*B*} + + {*T2*}Ciclo de luz{*ETW*}{*B*} +Cuando se desactiva, la hora del día no cambia.{*B*}{*B*} + +{*T2*}Conservar inventario{*ETW*}{*B*} +Cuando se activa, los jugadores conservarán su inventario al morir.{*B*}{*B*} + +{*T2*}Generación de criaturas{*ETW*}{*B*} +Cuando se desactiva, las criaturas no se generarán de forma natural.{*B*}{*B*} + +{*T2*}Desventaja de criaturas{*ETW*}{*B*} +Cuando está desactivado, impide que monstruos y animales cambien los bloques (por ejemplo, las explosiones de los creepers no destruyen los bloques y las ovejas no eliminan la hierba) o recojan objetos.{*B*}{*B*} + +{*T2*}Botín de criaturas{*ETW*}{*B*} +Cuando se desactiva, los monstruos y animales no sueltan botín (por ejemplo, los creepers no sueltan pólvora).{*B*}{*B*} + +{*T2*}Objetos de bloques{*ETW*}{*B*} +Cuando se desactiva, los bloques no sueltan objetos al ser destruidos (por ejemplo, los bloques de piedra no sueltan guijarros).{*B*}{*B*} + +{*T2*}Regeneración natural{*ETW*}{*B*} +Cuando se desactiva, los jugadores no regeneran salud de forma natural.{*B*}{*B*} + +{*T1*}Opciones de generación del mundo{*ETW*}{*B*} + Cuando se crea un mundo existen opciones adicionales.{*B*}{*B*} + + {*T2*}Generar estructuras{*ETW*}{*B*} + Si está habilitado, se generarán estructuras como aldeas y fortalezas en el mundo.{*B*}{*B*} + + {*T2*}Mundo superplano{*ETW*}{*B*} + Si está habilitado, se generará un mundo completamente plano en el mundo superior y en el mundo inferior.{*B*}{*B*} + + {*T2*}Cofre de bonificación{*ETW*}{*B*} + Si está habilitado, se creará un cofre con objetos útiles cerca del punto de generación del jugador.{*B*}{*B*} + + {*T2*}Restablecer mundo inferior{*ETW*}{*B*} + Si está habilitado, el mundo inferior se regenerará. Es útil si tienes una partida guardada antigua donde no está presente la fortaleza del mundo inferior.{*B*}{*B*} + + {*T1*}Opciones de partida{*ETW*}{*B*} + Dentro del juego se pueden acceder a varias opciones pulsando {*BACK_BUTTON*} para mostrar el menú del juego.{*B*}{*B*} + + {*T2*}Opciones de anfitrión{*ETW*}{*B*} + El anfitrión y cualquier jugador designado como moderador pueden acceder al menú "Opciones de anfitrión". En este menú se puede habilitar y deshabilitar la propagación del fuego y la explosión de dinamita.{*B*}{*B*} + + {*T1*}Opciones de jugador{*ETW*}{*B*} + Para modificar los privilegios de un jugador, selecciona su nombre y pulsa{*CONTROLLER_VK_A*} para mostrar el menú de privilegios, donde podrás usar las siguientes opciones.{*B*}{*B*} + + {*T2*}Puede construir y extraer{*ETW*}{*B*} + Esta opción solo está disponible cuando "Confiar en jugadores" está deshabilitado. Cuando esta opción está habilitada, el jugador puede interactuar con el mundo de forma normal. Cuando está deshabilitada, el jugador no puede colocar ni destruir bloques, ni interactuar con muchos objetos y bloques.{*B*}{*B*} + + {*T2*}Puede usar puertas e interruptores{*ETW*}{*B*} + Esta opción solo está disponible cuando "Confiar en jugadores" está deshabilitado. Cuando esta opción está deshabilitada, el jugador no puede usar puertas ni interruptores.{*B*}{*B*} + + {*T2*}Puede abrir contenedores{*ETW*}{*B*} + Esta opción solo está disponible cuando "Confiar en jugadores" está deshabilitado. Cuando esta opción está deshabilitada, el jugador no puede abrir contenedores, como por ejemplo cofres.{*B*}{*B*} + + {*T2*}Puede atacar a jugadores{*ETW*}{*B*} + Esta opción solo está disponible cuando "Confiar en jugadores" está deshabilitado. Cuando esta opción está deshabilitada, el jugador no puede causar daños a otros jugadores.{*B*}{*B*} + + {*T2*}Puede atacar a animales{*ETW*}{*B*} + Esta opción solo está disponible cuando "Confiar en jugadores" está deshabilitado. Cuando esta opción está deshabilitada, el jugador no puede causar daños a los animales.{*B*}{*B*} + + {*T2*}Moderador{*ETW*}{*B*} + Cuando esta opción está habilitada, el jugador puede cambiar los privilegios de otros jugadores (excepto los del anfitrión) si "Confiar en jugadores" está deshabilitado, expulsar jugadores y activar y desactivar "El fuego se propaga" y "La dinamita explota".{*B*}{*B*} + + {*T2*}Expulsar jugador{*ETW*}{*B*} +{*KICK_PLAYER_DESCRIPTION*}{*B*}{*B*} + + {*T1*}Opciones de anfitrión{*ETW*}{*B*} + Si "Privilegios de anfitrión" está habilitado, el anfitrión podrá modificar algunos privilegios para sí mismo. Para modificar los privilegios de un jugador, selecciona su nombre y pulsa{*CONTROLLER_VK_A*} para mostrar el menú de privilegios, donde podrás usar las siguientes opciones.{*B*}{*B*} + + {*T2*}Puede volar{*ETW*}{*B*} + Cuando esta opción está habilitada, el jugador puede volar. Solo es relevante en el modo Supervivencia, ya que el vuelo está habilitado para todos los jugadores en el modo Creativo.{*B*}{*B*} + + {*T2*}Desactivar agotamiento{*ETW*}{*B*} + Esta opción solo afecta al modo Supervivencia. Si se habilita, las actividades físicas (caminar/correr/saltar, etc.) no disminuyen la barra de comida. Sin embargo, si el jugador resulta herido, la barra de comida disminuye lentamente mientras el jugador se cura.{*B*}{*B*} + + {*T2*}Invisible{*ETW*}{*B*} + Cuando esta opción está habilitada, el jugador es invisible para otros jugadores y es invulnerable.{*B*}{*B*} + + {*T2*}Puede teletransportarse{*ETW*}{*B*} + Permite al jugador mover a otros jugadores, a sí mismo o hasta otros jugadores del mundo. + + + Página siguiente + + + {*T3*}CÓMO SE JUEGA: CUIDAR ANIMALES{*ETW*}{*B*}{*B*} +Si quieres mantener a tus animales en un único lugar, construye una zona vallada de menos de 20x20 bloques y mete dentro a tus animales. Así te asegurarás de que estén allí cuando vuelvas. + + + {*T3*}CÓMO SE JUEGA: REPRODUCCIÓN DE ANIMALES{*ETW*}{*B*}{*B*} +¡Los animales de Minecraft pueden reproducirse y tener crías que son sus réplicas exactas!{*B*} +Para que los animales se reproduzcan, tendrás que alimentarlos con la comida adecuada para que entren en el modo Amor.{*B*} +Si alimentas con trigo a las vacas, con champiñacas a las ovejas, con zanahorias a los cerdos, con semillas de trigo o verrugas del mundo inferior a las gallinas, o con cualquier tipo de carne a los lobos, estos animales empezarán a buscar a otros animales de la misma especie que también estén en el modo Amor.{*B*} +Cuando se encuentren dos animales en modo Amor de la misma especie, se besarán durante unos segundos y aparecerá una cría. La cría seguirá a sus padres durante un tiempo antes de crecer y convertirse en adulta.{*B*} +Después de estar en el modo Amor, los animales no podrán volver a él durante cinco minutos como mínimo.{*B*} +Existe un límite para la cantidad de animales que puedes tener en un mundo, por lo que es posible que tus animales no tengan más crías cuando ya haya muchos. + + + {*T3*}CÓMO SE JUEGA: PORTAL INFERIOR{*ETW*}{*B*}{*B*} +El portal inferior permite al jugador viajar entre el mundo superior y el mundo inferior. El mundo inferior sirve para viajar a toda velocidad por el mundo superior, ya que un bloque de distancia en el mundo inferior equivale a tres bloques en el mundo superior. Así, cuando construyas un portal en el mundo inferior y salgas por él, estarás tres veces más lejos del punto de entrada.{*B*}{*B*} +Se necesita un mínimo de diez bloques de obsidiana para construir el portal, y el portal debe tener cinco bloques de alto, cuatro de ancho y uno de profundidad. Una vez construida la estructura del portal, tendrás que prender fuego al espacio interior para activarlo. Para ello, usa los objetos "chisquero de pedernal" o "descarga de fuego".{*B*}{*B*} +En la imagen de la derecha dispones de ejemplos de construcción de un portal. + + + {*T3*}CÓMO SE JUEGA: COFRE{*ETW*}{*B*}{*B*} +Cuando creas un cofre, puedes colocarlo en el mundo y usarlo con{*CONTROLLER_ACTION_USE*} para almacenar objetos de tu inventario.{*B*}{*B*} +Usa el puntero para mover objetos del inventario al cofre y viceversa.{*B*}{*B*} +Los objetos del cofre se almacenan para que puedas volver a colocarlos en el inventario más adelante. + + + ¿Estuviste en la Minecon? + + + Nadie de Mojang ha visto jamás la cara a junkboy. + + + ¿Sabías que hay una wiki de Minecraft? + + + No mires directamente a los bichos. + + + Los creepers surgieron de un fallo de código. + + + ¿Es una gallina o es un pato? + + + ¡El nuevo despacho de Mojang mola! + + + {*T3*}CÓMO SE JUEGA: FUNDAMENTOS{*ETW*}{*B*}{*B*} +Minecraft es un juego que consiste en colocar bloques para construir cualquier cosa que puedas imaginar. De noche salen los monstruos, así que procura construir un refugio antes de que eso suceda.{*B*}{*B*} +Usa{*CONTROLLER_ACTION_LOOK*} para mirar a tu alrededor.{*B*}{*B*} +Usa{*CONTROLLER_ACTION_MOVE*} para moverte.{*B*}{*B*} +Pulsa{*CONTROLLER_ACTION_JUMP*} para saltar.{*B*}{*B*} +Pulsa{*CONTROLLER_ACTION_MOVE*} dos veces hacia delante en sucesión rápida para correr. Mientras mantienes pulsado {*CONTROLLER_ACTION_MOVE*} hacia delante, el personaje seguirá corriendo a menos que se agote el tiempo de carrera o la barra de comida tenga menos de {*ICON_SHANK_03*}.{*B*}{*B*} +Mantén pulsado{*CONTROLLER_ACTION_ACTION*} para extraer y cortar con la mano o con cualquier objeto que sostengas. Quizá necesites crear una herramienta para extraer algunos bloques.{*B*}{*B*} +Si tienes un objeto en la mano, usa{*CONTROLLER_ACTION_USE*} para utilizar ese objeto o pulsa{*CONTROLLER_ACTION_DROP*} para soltarlo. + + + {*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 + + + 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 final activo. Encontrarás el portal final en una fortaleza, en lo más profundo del mundo superior.{*B*} +Para activar el portal final, debes colocar un ojo finalizador en la estructura de un portal final que no tenga uno.{*B*} +Una vez que el portal esté activo, introdúcete en él para ir a El Fin.{*B*}{*B*} +En El Fin te encontrarás con el dragón finalizador, un feroz y poderoso enemigo, además de muchos finalizadores, por lo que tendrás que estar preparado para la batalla antes de ir allí.{*B*}{*B*} +En lo alto de ocho pilares obsidianos verás cristales finalizadores que el dragón finalizador usa para curarse, así que lo primero que deberás hacer será destruirlos todos.{*B*} +Podrás alcanzar los primeros con flechas, pero los últimos están en una jaula con barrotes de hierro. Tendrás que ascender para llegar a ellos.{*B*}{*B*} +Mientras lo haces, el dragón finalizador volará hacia ti y te atacará escupiendo bolas de ácido finalizador.{*B*} +Si te acercas al pedestal del huevo en el centro de los pilares, el dragón finalizador descenderá y te atacará. ¡Tienes que aprovechar ese momento para hacerle daño!{*B*} +Esquiva su aliento de ácido y apunta a los ojos del dragón finalizador para hacerle el máximo daño posible. ¡Si puedes, tráete amigos a El Fin para que te echen una mano en la batalla!{*B*}{*B*} +En cuanto hayas llegado a El Fin, tus amigos podrán ver la ubicación del portal final dentro de la fortaleza en sus mapas, para que puedan unirse a ti fácilmente. + + + {*ETB*}¡Hola de nuevo! Quizá no te hayas dado cuenta, pero hemos actualizado Minecraft.{*B*}{*B*} +Hay un montón de novedades con las que lo pasarás en grande con tus amigos. A continuación te detallamos las más destacadas:{*B*}{*B*} +{*T1*}Nuevos objetos{*ETB*}: arcilla endurecida, arcilla teñida, bloque de carbón, bala de heno, raíl activador, bloque de piedra rojiza, sensor de luz diurna, soltador, tolva, vagoneta con tolva, vagoneta con dinamita, comparador de piedra rojiza, placa de presión con peso, baliza, cofre con trampa, cohete de fuegos artificiales, estrella de fuegos artificiales, estrella del mundo inferior, correa, armadura de caballo, placa identificativa, huevo generador de caballos.{*B*}{*B*} +{*T1*}Nuevas criaturas{*ETB*}: Wither, esqueletos de Wither, brujas, murciélagos, caballos, burros y mulas.{*B*}{*B*} +{*T1*}Nuevas características{*ETB*}: domestica y monta caballos, crea fuegos artificiales y monta un espectáculo, nombra a animales y monstruos con placas identificativas, crea circuitos de piedra rojiza más avanzados, ¡y hay nuevas opciones de anfitrión para controlar lo que pueden hacer los invitados en tu mundo!{*B*}{*B*} +{*T1*}Nuevo tutorial{*ETB*}: aprende a usar las opciones antiguas y nuevas en el tutorial. ¡Intenta encontrar todos los discos escondidos en el mundo!{*B*}{*B*} + + + 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 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 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 pulsar. + + + Da una descarga eléctrica constante o puede usarse de receptor/transmisor si se conecta al lateral de un bloque. +También puede usarse de iluminación de nivel bajo. + + + 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. + + + 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*}. + + + 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 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 lima. + + + Se usa como tinte para crear lana gris. + + + 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 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 de libros o encantarse 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 por los raíles. + + + Se mueve por raíles 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 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. + + + 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 la lleva puesta, el usuario recibe 6 de armadura. + + + Las puertas de hierro solo se pueden abrir con piedra rojiza, botones o interruptores. + + + Cuando lo lleva puesto, el usuario recibe 1 de armadura. + + + Cuando la lleva puesta, 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 las lleva puestas, el usuario recibe 2 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 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 cuenco después de comer el estofado. + + + Se usa para contener y transportar agua, lava y 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 objeto chisquero 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 1 bloque de alto para otros bloques. + + + Se usa para ascender en vertical. + + + 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. + + + Hacha de hierro + + + Lámpara de piedra rojiza + + + Escaleras de la jungla + + + Escaleras de abedul + + + Controles actuales + + + Calavera + + + Cacao + + + Escaleras de abeto + + + Huevo de dragón + + + Piedra final + + + Estructura de portal final + + + Escaleras de arenisca + + + Helecho + + + Arbusto + + + Configuración + + + Creación + + + Usar + + + Acción + + + Sigilo/Volar hacia abajo + + + Sigilo + + + Soltar + + + Cambiar objeto + + + Pausar + + + Mirar + + + Mover/Correr + + + Inventario + + + Saltar/Volar hacia arriba + + + Saltar + + + Portal final + + + Tallo de calabaza + + + Melón + + + Panel de cristal + + + Puerta de valla + + + Enredaderas + + + Tallo de melón + + + Barras de hierro + + + Ladrillos de piedra agrietada + + + Ladrillos de piedra musgosa + + + 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 + + + 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 lima + + + Lana cian + + + Lana verde + + + Lana roja + + + Lana negra + + + Lana púrpura + + + Lana azul + + + Lana marrón + + + Antorcha (hulla) + + + Piedra brillante + + + Arena de alma + + + 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. + + + 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 + + + Raíl + + + Escalera + + + Puerta de madera + + + Escaleras de piedra + + + Raíl detector + + + Raíl propulsado + + + Ya has recogido 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 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. + + + 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*} +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_ACTION_MENU_PAGEDOWN*} . + + + + Esta es la interfaz de creación. En esta interfaz puedes combinar los objetos que has recogido para crear objetos nuevos. + + + + 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. + + + 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*}. + + + + + 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. + + + + 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 + + + Botella de cristal + + + Botella de agua + + + Ojo de araña + + + Pepita de oro + + + Verruga del mundo inferior + + + Poción{*splash*}{*prefix*}{*postfix*} + + + Ojo de araña ferment. + + + Caldero + + + Ojo finalizador + + + 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" + + + Cizallas + + + Pollo cocinado + + + Perla finalizadora + + + Rodaja de melón + + + Vara de llama + + + Ternera cruda + + + Filete + + + Carne podrida + + + Botella de encanto + + + 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 mundo inferior + + + Descarga de fuego + + + Desc. fuego (carbón) + + + Desc. de fuego (hulla) + + + Calavera + + + Cabeza + + + Cabeza de %s + + + Cabeza de creeper + + + Calavera de esqueleto + + + Calavera de esqueleto atrofiado + + + Cabeza de zombi + + + Una forma compacta de almacenar carbón. Se puede usar como combustible en un horno. + + + Veneno + + + Hambre + + + de lentitud + + + de celeridad + + + Invisibilidad + + + Respiración acuática + + + Visión nocturna + + + Ceguera + + + de daño + + + de curación + + + de náuseas + + + de regeneración + + + de torpeza + + + de rapidez + + + de debilidad + + + de fortaleza + + + Resistente al fuego + + + Saturación + + + de resistencia + + + de salto + + + Wither + + + Aumento de salud + + + Absorción + + + + + + II + + + 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 + + + Mundana + + + Aburrida + + + Enérgica + + + Cordial + + + Encantadora + + + Elegante + + + Sofisticada + + + Resplandeciente + + + 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 + + + Aporrear + + + Agudeza + + + Reduce la salud de los jugadores, animales y monstruos afectados con el paso del tiempo. + + + Daño de ataque + + + Derribar + + + Maldición de los artrópodos + + + Velocidad + + + Refuerzos zombi + + + Fuerza de salto del caballo + + + Cuando se aplica: + + + Resistencia a derribar + + + Alcance de seguimiento de criaturas + + + Salud máxima + + + Toque sedoso + + + Eficacia + + + Afinidad acuática + + + Fortuna + + + Saqueo + + + Irrompible + + + Protección contra el fuego + + + Protección + + + Aspecto ígneo + + + Caída de pluma + + + Respiración + + + Protección contra proyectiles + + + Protección contra explosiones + + + IV + + + V + + + VI + + + Puñetazo + + + VII + + + III + + + Llama + + + Poder + + + Infinidad + + + II + + + I + + + Se activa cuando una entidad pasa por una cuerda de trampa activada. + + + Activa un garfio de cuerda de trampa conectado cuando una entidad pasa por ella. + + + Una forma compacta de almacenar esmeraldas. + + + Similar a un cofre, pero los objetos introducidos en un cofre finalizador están disponibles en todos los cofres finalizadores del jugador, incluso en distintas dimensiones. + + + IX + + + VIII + + + Se puede perforar con un pico de hierro o un objeto mejor para extraer esmeraldas. + + + 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. + + + 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*}. + + + Restaura 1{*ICON_SHANK_01*}. Puede envenenarte si lo ingieres. + + + Se usa para controlar un cerdo ensillado al montarlo. + + + Restablece 3{*ICON_SHANK_01*}. Se crea cocinando una patata en un horno. + + + Restablece 3{*ICON_SHANK_01*}. Se crea con una zanahoria y pepitas de oro. + + + Se usa con un yunque para encantar armas, herramientas o armaduras. + + + Se crea perforando mineral de cuarzo del mundo inferior. Puede transformarse en un bloque de cuarzo. + + + Patata + + + Patata asada + + + Zanahoria + + + Creado con lana. Se utiliza como decoración. + + + Esmeralda + + + Maceta + + + Pastel de calabaza + + + Libro encantado + + + Patata venenosa + + + Zanahoria de oro + + + Zanahoria con palo + + + Garfio de cuerda trampa + + + Cuerda de trampa + + + Cuarzo del mundo inferior + + + Mineral de esmeralda + + + Cofre finalizador + + + Pared guijarros y musgo + + + Bloque de esmeralda + + + Pared de guijarros + + + Patatas + + + Maceta + + + Zanahorias + + + Yunque ligeramente dañado + + + Yunque + + + Yunque + + + Bloque de cuarzo + + + Yunque muy dañado + + + Mineral de cuarzo del mundo inferior + + + Escaleras de cuarzo + + + Bloque de cuarzo tallado + + + Bloque de cuarzo de pilar + + + Alfombra roja + + + Alfombra + + + Alfombra negra + + + Alfombra azul + + + Alfombra verde + + + Alfombra marrón + + + Alfombra morada + + + Alfombra turquesa + + + Alfombra gris claro + + + Alfombra gris + + + Alfombra lima + + + Alfombra rosa + + + Alfombra azul claro + + + Alfombra amarilla + + + Alfombra magenta + + + Alfombra naranja + + + Alfombra blanca + + + Arenisca tallada + + + {*PLAYER*} ha muerto intentando dañar a {*SOURCE*} + + + Arenisca suave + + + {*PLAYER*} ha sido aplastado por un yunque. + + + {*PLAYER*} ha sido aplastado por un bloque. + + + {*PLAYER*} te ha teletransportado a su posición + + + Se ha teletransportado a {*PLAYER*} hasta {*DESTINATION*} + + + Espinas + + + {*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 + + + ¡Demasiado caro! + + + Coste del encantamiento: %d + + + Tienes: + + + Renombrar + + + {*VILLAGER_TYPE*} ofrece %s + + + Necesitas para el comercio + + + Comercio + + + 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. + + + + + {*B*} + Pulsa{*CONTROLLER_VK_A*} para saber más sobre la interfaz del yunque.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya conoces la interfaz del yunque. + + + + + También se puede colocar un segundo objeto idéntico en el segundo espacio para combinar los dos objetos. + + + + + 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. + + + + + 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. + + + + + Coger el objeto reparado consumirá los dos objetos utilizados por el yunque y reducirá tu nivel de experiencia en la cantidad indicada. + + + + + Es posible renombrar un objeto modificando el nombre que aparece en la ventana de texto. + + + + + {*B*} + Pulsa{*CONTROLLER_VK_A*} para saber más sobre el yunque.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya conoces el yunque. + + + + + En esta área hay un yunque y un cofre que contiene herramientas y armas con las que trabajar. + + + + + Puedes encontrar libros encantados en los cofres de las mazmorras, o encantar libros normales en la mesa de encantamiento. + + + + + Usando un yunque, puedes reparar armas y herramientas para restaurar su durabilidad, renombrarlas o encantarlas con libros encantados. + + + + + 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. + + + + + Usar el yunque cuesta niveles de experiencia y cada uso puede dañar el yunque. + + + + + En el cofre de esta área encontrarás picos dañados, materias primas, botellas de encantamiento y libros encantados para experimentar. + + + + + Renombrar un objeto cambia el nombre que aparece para todos los jugadores y reduce de forma permanente el coste de trabajo anterior. + + + + + {*B*} + Pulsa{*CONTROLLER_VK_A*} para saber más sobre la interfaz de comercio.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya conoces la interfaz de comercio. + + + + + Esta es la interfaz de comercio, que muestra los intercambios que puedes realizar con un aldeano. + + + + + Los intercambios aparecen en rojo y no están disponibles si no tienes los objetos necesarios. + + + + + Todos los intercambios que el aldeano está dispuesto a hacer en este momento aparecen en la parte superior. + + + + + Puedes ver el número total de objetos necesarios para el intercambio en las dos ventanas de la izquierda. + + + + + 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. + + + + + {*B*} + Pulsa{*CONTROLLER_VK_A*} para saber más sobre el comercio.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya conoces el comercio. + + + + + Realizar una mezcla de intercambios aumentará o actualizará aleatoriamente los intercambios disponibles del aldeano. + + + + + Los intercambios que puede ofrecer un aldeano dependen de su profesión. + + + + + Los intercambios usados con frecuencia pueden desaparecer temporalmente, pero el aldeano siempre ofrecerá al menos un intercambio. + + + + + Coge papel del cofre y prueba a comerciar con el aldeano. + + + + + En esta área hay dos cofres finalizadores. + + + + + {*B*} + Pulsa{*CONTROLLER_VK_A*} para saber más sobre los cofres finalizadores.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya conoces los cofres finalizadores. + + + + + Todos los cofres finalizadores de un mundo están conectados, incluso entre dimensiones. Los objetos que contiene un cofre finalizador son accesibles desde cualquier otro cofre finalizador. + + + + + No obstante, el contenido de los cofres finalizadores es distinto para cada jugador. + + + + + Esto permite a los jugadores guardar objetos en cualquier cofre finalizador y recuperarlo en otros cofres finalizadores en distintas ubicaciones del mundo. Puedes hacer la prueba ahora colocando objetos en uno de los cofres finalizadores. + + + + Restablece 2{*ICON_SHANK_01*}, regenera salud durante 30 segundos y otorga resistencia al fuego y resistencia al daño durante 5 minutos. Se crea a partir de una manzana y bloques de oro. + + + Puede teletransportarse + + + Teletransporte + + + Teletransportarme al jugador + + + Teletransportar aquí + + + Puede desactivar el agotamiento + + + Puede volverse invisible + + + Ahora puedes activar la invisibilidad + + + Ya no puedes activar la invisibilidad + + + Ahora puedes activar el vuelo + + + Ya no puedes activar el vuelo + + + Ahora puedes desactivar el agotamiento + + + Ya no puedes desactivar el agotamiento + + + Ahora puedes teletransportarte + + + Ya no puedes teletransportarte + + + {*T3*}CÓMO JUGAR: YUNQUE{*ETW*}{*B*}{*B*} +Puedes usar niveles de experiencia para reparar, encantar o renombrar objetos con el yunque.{*B*} +Todos los objetos se pueden renombrar, aunque solo los objetos con durabilidad pueden repararse o encantarse con libros encantados.{*B*} +Puedes reparar un objeto colocándolo en uno de los espacios de entrada de la izquierda, junto con materias primas del objeto, como lingotes de hierro para una espada de hierro, o combinarlo con otro objeto del mismo tipo.{*B*} +Combinar objetos es más eficiente cuando se hace con un yunque, y además, si alguno de los objetos estaba encantado, el producto final puede tener encantamientos de alguno de los ingredientes.{*B*} +Los libros encantados pueden aplicar encantamientos a los objetos combinándolos en un yunque si el encantamiento del libro es adecuado. Puedes encontrar libros encantados en los cofres de las mazmorras, o encantar libros normales en la mesa de encantamiento.{*B*} +Es posible que el yunque sufra daños con cada uso, y cuando esté demasiado deteriorado se destruirá.{*B*} + + + {*T3*}CÓMO JUGAR: COMERCIO{*ETW*}{*B*}{*B*} +Es posible intercambiar objetos con los aldeanos. Cada aldeano tiene una profesión: pueden ser granjeros, carniceros, herreros, bibliotecarios o sacerdotes, y esto afecta al tipo de objetos que pueden intercambiar.{*B*} +Puedes encontrar una lista de los intercambios que ofrece un aldeano en el menú de comercio. Un aldeano puede modificar o aumentar sus intercambios cada vez que un jugador comercia con él, aunque un intercambio puede no estar disponible temporalmente si se usa con demasiada frecuencia.{*B*} +Los intercambios suelen consistir en comprar o vender un número de objetos a cambio de esmeraldas.{*B*} +Si no tienes los objetos necesarios para un intercambio, los objetos aparecen en rojo.{*B*} + + + + {*T3*}CÓMO JUGAR: COFRE FINALIZADOR {*ETW*}{*B*}{*B*} +Todos los cofres finalizadores de un mundo están conectados. Los objetos que contiene un cofre finalizador son accesibles desde cualquier otro. No obstante, el contenido de los cofres finalizadores es distinto para cada jugador. Esto permite a los jugadores guardar objetos en cualquier cofre finalizador y recuperarlo en otros cofres finalizadores en distintas ubicaciones del mundo. + + + + Granjero + + + Bibliotecario + + + Sacerdote + + + Herrero + + + Carnicero + + + Disponibles en las aldeas, los aldeanos pueden vender objetos al jugador según sus profesiones. + + + Cofre grande + + + + También puedes crear libros encantados en la mesa de encantamiento y usarlos luego en el yunque para aplicar su encantamiento a un objeto. + + + + + Los garfios de cuerdas de trampa también suministran energía constante a un circuito mientras haya algo activando el hilo que los une. + + + + + Una vez domesticado, un lobo siempre llevará puesto su collar. El color del collar puede cambiarse tiñéndolo. + + + + Las zanahorias y patatas se cultivan plantando zanahorias o patatas, y están listas para la cosecha cuando la verdura sobresalga del suelo. + + + + Además, los cerdos pueden ensillarse y ser montados por los jugadores. Se controlan tentándolos con una zanahoria con palo. + + + + Si lo necesitas, puedes mover la vagoneta lentamente con {*CONTROLLER_ACTION_MOVE*}. Así podrás arrancar la vagoneta subiéndola a un raíl propulsado. + + + No puedes unirte a esta partida, ya que solo se admite pantalla partida en el modo de alta definición. Si deseas unirte, cierra la sesión de los demás jugadores. + + + Curar + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/es-ES/stringsLeaderboards.xml b/Minecraft.Client/PSVitaMedia/loc/es-ES/stringsLeaderboards.xml new file mode 100644 index 00000000..86687154 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/es-ES/stringsLeaderboards.xml @@ -0,0 +1,48 @@ + + + + Muertes fácil + + + Muertes normal + + + Muertes difícil + + + Extracción bloques pacífica + + + Extracción de bloques fácil + + + Extracción de bloques normal + + + Extracción de bloques difícil + + + Cultivo pacífico + + + Cultivo fácil + + + Cultivo normal + + + Cultivo difícil + + + Desplazamiento pacífico + + + Desplazamiento fácil + + + Desplazamiento normal + + + Desplazamiento difícil + + \ 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 new file mode 100644 index 00000000..b735d372 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/es-ES/stringsPlatformSpecific.xml @@ -0,0 +1,245 @@ + + + + ¿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 + + + NOT USED + + + {*T3*}CÓMO SE JUEGA: MODO CREATIVO{*ETW*}{*B*}{*B*} +La interfaz del modo Creativo permite mover cualquier objeto del juego al inventario sin tener que extraerlo o crearlo. +Los objetos del inventario del jugador no se eliminan cuando se colocan o se usan en el mundo, lo que permite centrarse en la construcción más que en la recolección de recursos.{*B*} +Si creas, cargas o guardas un mundo en el modo Creativo, ese mundo tendrá los trofeos y las actualizaciones del marcador deshabilitados, aunque después lo cargues en el modo Supervivencia.{*B*} +Para volar en el modo Creativo, pulsa{*CONTROLLER_ACTION_JUMP*} dos veces con rapidez. Para dejar de volar, repite la acción. Para volar más rápido, pulsa{*CONTROLLER_ACTION_MOVE*} dos veces en una sucesión rápida mientras vuelas. +En modo de vuelo, puedes mantener pulsado{*CONTROLLER_ACTION_JUMP*} para subir y{*CONTROLLER_ACTION_SNEAK*} para bajar, o usar{*CONTROLLER_ACTION_DPAD_UP*} para subir y{*CONTROLLER_ACTION_DPAD_DOWN*} para bajar, +{*CONTROLLER_ACTION_DPAD_LEFT*} para ir a la izquierda y{*CONTROLLER_ACTION_DPAD_RIGHT*} para ir a la derecha. + + + 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" + + + 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? + + + "NOT USED" + + + 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. + + + 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". +¿Te gustaría desbloquear el juego completo? + + + Esta es la versión de prueba de Minecraft: PlayStation®Vita Edition. Necesitas el juego completo para aceptar esta invitación. +¿Te gustaría desbloquear el juego completo? + + + La partida guardada de la zona de guardado tiene un número de versión que Minecraft: PlayStation®Vita Edition no admite todavía. + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/es-ES/stringsRichPresence.xml b/Minecraft.Client/PSVitaMedia/loc/es-ES/stringsRichPresence.xml new file mode 100644 index 00000000..f5394183 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/es-ES/stringsRichPresence.xml @@ -0,0 +1,66 @@ + + + + {GAME_STATE} + + + Inactivo + + + En los menús + + + En multijugador - {GAME_STATE} + + + Multijugador offline - {GAME_STATE} + + + Jugando solo - {GAME_STATE} + + + Solo offline\ - {GAME_STATE} + + + ¡Gozando de las vistas! + + + Sobre un cerdo + + + Sobre una vagoneta + + + En barco + + + Pescando + + + Fabricando + + + Forjando + + + En el mundo inferior + + + Escuchando un disco + + + Mirando un mapa + + + Encantamientos + + + Crear poción + + + Forjando en la fragua + + + Conociendo a los vecinos + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/fi-FI/4J_stringsGeneric.xml b/Minecraft.Client/PSVitaMedia/loc/fi-FI/4J_stringsGeneric.xml new file mode 100644 index 00000000..ee1731fd --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/fi-FI/4J_stringsGeneric.xml @@ -0,0 +1,87 @@ + + + + OK + + + Palaa + + + Peru + + + Kyllä + + + Ei + + + Vioittunut tallenne + + + Tallennustietosi vaikuttaa vioittuneen. Luodaanko uusi tallenne ja korvataan vioittunut? + + + Ei tilaa + + + Valitse uudestaan + + + Pelaa tallentamatta + + + Luo uusi tallenne + + + Korvataanko tallenne? + + + Ei – älä korvaa + + + Korvaa ja tallenna + + + Tallennus epäonnistui + + + Jatka tallentamatta + + + Lataus epäonnistui + + + Nimeä tallenne + + + Anna nimi pelitallenteellesi + + + Haluatko varmasti poistua pelistä? + + + Kirjautunut ulos + + + Jatka pelaamista + + + Jatka pelaamista paikallisesti + + + Vieraileva pelaaja + + + Vierailevat pelaajat eivät voi käyttää "PSN"-verkkoa. + + + Tallennetaan... + + + Sisältöä tallennetaan. Älä sammuta järjestelmää. + + + Avaa koko peli + + \ 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 new file mode 100644 index 00000000..8defd8bd --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/fi-FI/4J_stringsPlatformSpecific.xml @@ -0,0 +1,50 @@ + + + + Asetusten tallentaminen Sony Entertainment Network -tilillesi epäonnistui. + + + Sony Entertainment Network -tilin ongelma + + + 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 new file mode 100644 index 00000000..5fd34e24 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/fi-FI/AdditionalStrings.xml @@ -0,0 +1,96 @@ + + + + Näytä kaikki yhdistelmämaailmat + + + Piilota + + + Minecraft: PlayStation®3 Edition + + + Asetukset + + + Tallennusvälimuisti + + + Tapahtui verkkovirhe. + + + Verkkovirhe + + + Tapahtui verkkovirhe. Poistutaan päävalikkoon. + + + Verkkopalvelu on poistettu käytöstä sinun Sony Entertainment Network -tililläsi keskustelurajoitusten takia. + + + Verkkopalvelu on poistettu käytöstä sinun Sony Entertainment Network -tililläsi lapsilukkoasetusten takia. + + + Verkkopalvelu + + + Sinut on kirjattu ulos "PSN"-verkosta. Pelin verkkotoiminnot eivät ole käytettävissä, kunnes kirjaudut uudestaan "PSN"-verkkoon. + + + Sinut on kirjattu ulos "PSN"-verkosta. Pelin verkkotoiminnot eivät ole käytettävissä, kunnes kirjaudut uudestaan "PSN"-verkkoon. Poistutaan päävalikkoon. + + + Valitse käyttäjä pelaajalle %d (tai peru vieraana pelaaminen) + + + Ilmainen + + + Asetustiedostosi on vioittunut ja se pitää poistaa. + + + Poista asetustiedosto. + + + Yritä ladata asetustiedosto uudelleen. + + + Tallennusvälimuistitiedostosi on vioittunut ja se pitää poistaa. + + + Trophyt poistettu käytöstä + + + Trophyt otetaan pois käytöstä, koska tämä tallenne kuuluu toiselle käyttäjälle. + + + Vakava virhe: Trophyjen käyttöönotto epäonnistui. Ole hyvä ja poistu pelistä. + + + Pelikutsut + + + Vioittunut tiedosto + + + Ohjain kytketty irti + + + Ohjaimesi on kytketty irti. Kytke ohjain uudelleen. + + + 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. + + + Kutsu + + + Tule pelaamaan Minecraft: PlayStation®Vita Edition -peliä! + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/fi-FI/EULA.xml b/Minecraft.Client/PSVitaMedia/loc/fi-FI/EULA.xml new file mode 100644 index 00000000..020a1748 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/fi-FI/EULA.xml @@ -0,0 +1,97 @@ + + + + Minecraft: PlayStation®Vita Edition – KÄYTTÖEHDOT + Näissä ehdoissa kerrotaan muutamia Minecraft: PlayStation®Vita Edition ("Minecraft") -pelin pelaamista koskevia sääntöjä. Meidän on asetettava näiden ehtojen avulla joitain Minecraftin lataamista ja käyttämistä koskevia sääntöjä suojellaksemme Minecraftia ja yhteisömme jäseniä. Emme pidä säännöistä sen enempää kuin sinäkään, joten olemme pyrkineet pitämään tämän mahdollisimman lyhyenä, mutta jos ostat, lataat, käytät tai pelaat Minecraftia, suostut samalla noudattamaan näitä ehtoja ("Ehdot"). + Ennen kuin aloitamme, tahdomme tehdä yhden asian erittäin selväksi. Minecraft on peli, jossa pelaaja saa rakentaa ja rikkoa asioita. Jos pelaat toisten kanssa (moninpeli), voitte rakentaa yhdessä tai voit rikkoa heidän rakennelmansa – ja he voivat tehdä samoin sinulle. Älä siis pelaa ihmisten kanssa, jotka eivät käyttäydy niin kuin toivoisit. Joskus ihmiset myös tekevät asioita, joita ei saisi. Me emme pidä siitä, mutta emme voi tehdä sen estämiseksi juuri muuta kuin pyytää, että kaikki käyttäytyisivät ihmisiksi. Luotamme siihen, että sinä ja muut kaltaisesi yhteisön jäsenet kertovat meille, jos joku ei osaa käyttäytyä kunnolla ja/tai jos epäilette, että joku rikkoo sääntöjä tai näitä Ehtoja, tai väärinkäyttää Minecraftia. Meillä on ilmoitus-/raportointijärjestelmä siihen tarkoitukseen, joten käyttäkää sitä, niin teemme sitten sen, mikä on tarpeen. + Kun haluat ilmoittaa tai raportoida meille ongelmasta, lähetä sähköpostia osoitteeseen support@mojang.com ja kerro meille mahdollisimman paljon tietoa, kuten käyttäjän tiedot ja kuvaus tapahtuneesta. + Sitten takaisin Ehtoihin: + YKSI PÄÄSÄÄNTÖ + Pääsääntö on, että et saa jakaa mitään meidän tekemäämme. "Meidän tekemämme jakamisella" tarkoitamme "Minecraft-pelin kopioiden antamista pois, Minecraftin kaupallista käyttöä, yritystä ansaita sillä, tai antamista muiden ihmisten käyttää sitä tai sen osia tavalla, joka on epäreilua tai kohtuutonta". Pääsääntö on siis, että (ellemme erityisesti anna siihen lupaa – kuten ohjeissa "Brand and Asset Usage Guidelines") et saa: + • antaa Minecraft-pelin kopioita kenellekään muulle; + • käyttää kaupallisesti mitään, mitä me olemme tehneet; + • yrittää ansaita rahaa millään, mitä me olemme tehneet; tai + • antaa muiden ihmisten käyttää epäreilusti tai kohtuuttomasti mitään, mitä me olemme tehneet. + ...jotta tekisimme asian täysin selväksi, siihen mitä me olemme tehneet luetaan mukaan mm. Minecraftin asiakas- ja palvelinohjelmisto. Lisäksi siihen kuuluvat Minecraftin muokatut versiot, sen osat, ja kaikki muu, mitä olemme tehneet. + Muuten suhtaudumme varsin rennosti siihen, mitä sinä teet – itse asiassa me rohkaisemmekin sinua tekemään siistejä juttuja (katso alta) – kunhan et vain tee kieltämiämme asioita. + MINECRAFTIN KÄYTTÄMINEN + • Sinä olet ostanut Minecraftin, joten saat käyttää sitä itse omalla PlayStation®Vita-järjestelmälläsi. + • Alla annamme sinulle myös rajoitetut oikeudet tehdä muita asioita, mutta raja on vedettävä johonkin tai muuten ihmiset menevät liian pitkälle. Jos haluat tehdä jotain, mikä liittyy johonkin mitä me olemme tehneet, se on meille kunnia. Varmista vain, että sitä ei voi tulkita viralliseksi ja että se noudattaa näitä Ehtoja, eikä ennen kaikkea käytä kaupalliseen tarkoitukseen mitään meidän tekemäämme. + • Sinulle antamamme lupa käyttää ja pelata Minecraftia voidaan perua, jos rikot näitä Ehtoja. + • Kun ostat Minecraftin, me annamme sinulle luvan asentaa Minecraftin PlayStation®Vita-järjestelmällesi ja käyttää ja pelata sitä sillä PlayStation®Vita-järjestelmällä näissä Ehdoissa kuvatulla tavalla. Tämä lupa on henkilökohtainen, joten et saa antaa Minecraftia (tai mitään sen osaa) kenellekään muulle (ellet saa meiltä siihen nimenomaista lupaa). + • Järjen rajoissa olet vapaa tekemään mitä haluat Minecraftista ottamillasi näyttökuvilla ja videoilla. "Järjen rajoissa" tarkoittaa, että et saa käyttää niitä kaupallisesti tai tehdä asioita, jotka ovat epäreiluja tai rikkovat oikeuksiamme. Äläkä viitsi vain kopioida Minecraft-taidetta ja jaella sitä ympäriinsä, se ei ole kivaa. + • Pääasiassa nyrkkisääntö on, että älä käytä kaupallisesti mitään meidän tekemäämme, ellemme anna siihen nimenomaista lupaa joko ohjeissa nimeltä "Brand and Asset Usage Guidelines" tai näissä Ehdoissa. Ai niin, ja jos laissa nimenomaisesti sallitaan esimerkiksi "kohtuullinen käyttö" tai "kohtuullinen kauppa", niin se on hyväksyttävää – mutta vain lain sallimassa laajuudessa. + MINECRAFTIN OMISTAJUUS JA MUITA ASIOITA + • Vaikka annammekin sinulle luvan pelata Minecraftia, me olemme edelleen sen omistajia. Lisäksi me omistamme brändimme ja kaiken Minecraftin sisällön, joka koostuu meidän ohjelmistostamme, tekstuureistamme, pääomastamme, työkaluistamme, infrastruktuuristamme ja isosta läjästä muita nokkelia (ja vähemmän nokkelia) juttuja, joita me omistamme. Kaikki oikeutemme niihin ovat suojattuja ja pidätämme oikeudet itsellämme, mutta saat käyttää peliä näiden Ehtojen puitteissa. + • Se ei tarkoita sitä, että me omistaisimme ne siistit jutut, joita sinä luot Minecraftin avulla – sinun täytyy vain hyväksyä, että me omistamme jokaisen osan Minecraftista sekä Minecraftin tuotteena ja palveluna, sekä edellisessä kappaleessa mainitut asiat – ja että omistamme lisäksi tekijänoikeudet ja muut niihin liittyvät niin kutsutut immateriaalioikeudet ("IO:t") sekä Minecraftiin liittyvät nimet ja brändit. + • Sinä tietenkin teet omia juttujasi Minecraftissa ja sitä käyttämällä. Me emme omista itse tekemiäsi asioita emmekä vaadi saada omistaa mitään, mitä meidän ei kuulukaan. Me kuitenkin omistamme asiat, jotka ovat kopioita (tai olennaisilta osiltaan kopioita) tai johdoksia meidän omaisuudestamme ja luomuksistamme (kerrottu yllä) – mutta jos luot omia luomuksiasi, ne eivät ole meidän. Joten esimerkkinä: + - yksittäinen palikka – me omistamme sen; + - goottityyliin rakennettu katedraali, jonka läpi kulkee vuoristorata – me emme omista sitä. + • Niinpä silloin, kun maksat Minecraftin käytöstä, ostat vain luvan käyttää Minecraft-tuotetta näiden Ehtojen mukaisesti. Sinulla ei ole muuta oikeutta Minecraftiin kuin mitä näissä Ehdoissa on lueteltu. + SISÄLTÖ + • Jos teet jonkin sisällön saataville Minecraftissa tai sen kautta, sinun on annettava meille lupa käyttää, kopioida, muuttaa ja muokata sitä. Tämän luvan on oltava peruuttamaton ja rajoittamaton. Sinun on lisäksi suostuttava siihen, että annamme muiden ihmisten käyttää sisältöäsi, sekä antaa ihmisten, jotka päästät käsiksi sisältöösi (kuten ne, joiden kanssa pelaat moninpelejä) myös käyttää sitä. + • Mieti tarkkaan ennen kuin teet minkään sisällön saataville, koska siitä voidaan tehdä julkinen ja muut saattavat käyttää sitä tavalla, josta et pidä. + • Jos aiot tehdä jotain saataville Minecraftissa tai sen kautta, se ei saa olla loukkaava tai laiton, vaan sen täytyy olla rehellinen ja oma luomuksesi. Muun muassa tällaisia asioita et saa tehdä saataville Minecraftia käyttäen: julkaisuja, jotka sisältävät rasistisia tai homovastaisia ilmaisuja; julkaisuja jotka ovat kiusaamista tai trollaamista; julkaisuja jotka saattavat vahingoittaa meidän tai toisen henkilön mainetta; julkaisuja jotka sisältävät pornoa, mainontaa tai jonkun muun luomuksen tai kuvan; sekä julkaisut joissa esiinnytään moderaattorina tai yritetään huijata tai käyttää hyväksi toisia. + • Sisällön jonka teet saataville Minecraftissa, on myös oltava oma luomuksesi. Et saa tehdä saataville Minecraftia käyttäen mitään sisältöä, joka rikkoo jonkun toisen oikeuksia. Jos julkaiset sisältöä Minecraftissa ja joku syyttää tai uhkailee meitä tai haastaa meidät oikeuteen sen vuoksi, että sisältö loukkaa hänen oikeuksiaan, pidämme sinua siitä vastuullisena. Tällöin saatat joutua maksamaan korvauksia vahingoista, joita sen johdosta joudumme kärsimään. Siksi onkin todella tärkeää, että teet saataville vain itse luomaasi sisältöä etkä kenenkään muun luomaa. + • Ole varovainen pelatessasi muiden kanssa. Sekä sinun että meidän on vaikea tietää, puhuvatko ihmiset totta, tai ovatko he edes keitä väittävät olevansa. Älä paljasta Minecraftissa tietoja itsestäsi. + Jos aiot tehdä sisältöä ("Oma sisältösi") saataville Minecraftissa: + - sen pitää noudattaa kaikkia Sony Computer Entertainment -yhtiön sääntöjä mukaan lukien "PSN"-verkon "Palveluehdot" ja "Käyttösopimus", sekä kaikki muut ohjeet, joita sinun täytyy noudattaa käyttääksesi PlayStation®Vita-järjestelmää ja "PSN"-verkkoa; + - se ei saa olla loukkaavaa; + - se ei saa olla lainvastaista; + - sen on oltava rehellistä eikä se saa olla harhaanjohtavaa, eikä sen avulla saa huijata ketään tai käyttää ketään hyväksi tai esiintyä toisena henkilönä; + - se ei saa loukata kenenkään tekijänoikeuksia tai muita oikeuksia; + - se ei saa olla rasistinen, seksistinen tai homofobinen; + - sillä ei saa kiusata ketään tai trollata; + - se ei saa vahingoittaa meidän tai muiden mainetta; + - se ei saa sisältää pornografiaa; + - se ei saa sisältää mainontaa. + - et saa tehdä saataville Minecraftia käyttäen mitään sisältöä, joka rikkoo jonkun toisen oikeuksia. + • Olet vastuussa kaikesta Omasta sisällöstäsi, jonka teet saataville Minecraftia käyttäen. + • Tekemällä Oman sisältösi saataville vakuutat meille, että sinulla on täysi oikeus tehdä niin näitä Ehtoja noudattaen ja että me saamme hyödyntää oikeuksia, jotka olet meille näiden Ehtojen mukaisesti luovuttanut. + • Jos joku syyttää tai uhkaa meitä, tai haastaa meidät oikeuteen johtuen sisällöstä, jonka teet saataville Minecraftilla tai joku muu tekee saataville Minecraftissa tai sen kautta, sisältö voidaan poistaa ja sinua voidaan pitää vastuullisena, jolloin saatat joutua korvaamaan meille kärsimämme vahingot. Lisäksi käyttöoikeutesi joihinkin Minecraftin osiin voidaan poistaa tai perua määräajaksi. + KÄYTTÄJÄSISÄLTÖ + Jäljempänä kerrotaan muutamia ehtoja, jotka koskevat sekä Omaa sisältöäsi että sisältöä, jonka muut ovat tehneet saataville. Näistä käytetään yhteisnimitystä "Käyttäjäsisältö". Minecraft on viihdepalvelu ja tukeaksemme sitä me (sekä lisenssinhaltijamme, kuten Sony Computer Entertainment) osallistumme Käyttäjäsisällön lähettämiseen, jakeluun, tallentamiseen ja hakemiseen ilman, että sisältöä tarkastellaan, valitaan tai muutetaan. Se tarkoittaa, että me emme tarkista Käyttäjäsisältöä emmekä siksi tiedä, mitä sinä tai muut jaatte. Olemme laatineet säännöt näihin Ehtoihin, joita sinun ja muiden tulee noudattaa, mutta emme voi tarkkailla kaikkea, mitä tapahtuu. + Huomaa siis, että: + • Käyttäjäsisällöissä ilmaistut näkemykset ovat niiden yksittäisten laatijoiden tai luojien omia eivätkä meidän tai kenenkään meihin sidoksissa olevan tahon, ellemme erityisesti toisin mainitse; + • me emme ole vastuussa mistään Käyttäjäsisällöstä (emmekä anna siitä mitään takuita tai edusta sitä mitenkään) mukaan lukien kaikki siinä ilmaistut kommentit, näkemykset tai huomiot; + • ostamalla Minecraftin vakuutat ymmärtäväsi, että meillä ei ole velvoitetta tarkistaa minkään Käyttäjäsisällön sisältöä ja että kaikki Käyttäjäsisältö on tehty saataville sillä periaatteella, että meidän ei tarvitse valvoa tai säädellä sitä millään tavoin emmekä niin myös tee. + SIITÄ HUOLIMATTA me (tai lisenssinhaltijamme, kuten Sony Computer Entertainment) saatamme poistaa, hylätä tai estää pääsyn määräajaksi mihin tahansa Käyttäjäsisältöön ja poistaa tai estää määräajaksi mahdollisuutesi julkaista tai tehdä saataville Käyttäjäsisältöä tai päästä siihen käsiksi – mukaan lukien pääsyn poistaminen pysyvästi tai määräajaksi Minecraftiin tai "PSN"-verkkoon, jos se on meistä perusteltua esimerkiksi siksi, että olet rikkonut näitä Ehtoja tai olemme vastaanottaneet valituksen. Lisäksi toimimme nopeasti, jos saamme selville, että Käyttäjäsisältö on lainvastainen ja poistamme tai estämme pääsyn sille. + PÄIVITYKSET + • Saatamme ajoittain tuoda saataville parannuksia ja päivityksiä, mutta meidän ei ole pakko tehdä niin. Meillä ei myöskään ole velvoitetta tarjota jatkuvaa tukea tai ylläpitoa millekään pelille. Toivomme tietenkin jatkavamme uusien päivitysten julkaisemista Minecraftiin, emme vain voi luvata takuuvarmasti tekevämme niin. + VASTUUMME + • Kun saat oman Minecraft-pelisi, se toimitetaan ”sellaisena kuin se on”. Myös parannukset ja päivitykset toimitetaan ”sellaisina kuin ne ovat”. Se tarkoittaa, että emme takaa Minecraftin tai sen parannusten ja päivitysten täyttävän mitään normeja tai laatuvaatimuksia tai että Minecraft voitaisiin tarjota keskeytyksettä ja virheettömänä, emmekä ole vastuussa mistään menetyksistä tai vahingoista, joita ne saattavat aiheuttaa. Lupaamme ainoastaan tarjota Minecraftin ja kaikki palvelut kohtuullisen taitavasti ja huolellisesti. Useimpien maiden lain mukaan emme voi luopua vastuusta kuoleman tai henkilökohtaisen vammautumisen tapauksessa, jos se aiheutuu omasta piittaamattomuudestamme. Jos siis tietokoneesi tarttuu puukkoon ja iskee sillä sinua, koska me olemme jotenkin mokanneet, niin meitä voi syyttää siitä. + ME EMME OLE VASTUUSSA: + • JOS SINÄ TAI JOKU MUU KÄYTTÄÄ VÄÄRIN MINECRAFTIA; + • MISTÄÄN SISÄLLÖSTÄ JONKA OLET TEHNYT SAATAVILLE MINECRAFTIA KÄYTTÄEN; + • JOS JOTENKIN RIKOT NÄITÄ EHTOJA; + • JOS JOKU MUU RIKKOO JOTENKIN NÄITÄ EHTOJA. + SOPIMUKSEN PURKAMINEN + • Voimme halutessamme perua oikeutesi käyttää Minecraftia, jos rikot näitä Ehtoja. Sinäkin voit purkaa Käyttösopimuksen milloin tahansa, sinun ei tarvitse kuin poistaa Minecraftin asennus PlayStation®Vita-järjestelmästäsi. Joka tapauksessa kohdat "Minecraftin omistajuus", "Vastuumme" ja "Yleistä" pysyvät voimassa vielä Käyttösopimuksen purkamisen jälkeenkin. + YLEISTÄ + • Nämä Ehdot ovat kaikkien laillisten oikeuksiesi alaisia. Mikään näissä Ehdoissa ei rajoita mitään oikeuksiasi, joita ei saa poissulkea lain puitteissa. Emme myöskään voi poissulkea vastuutamme kuoleman tai henkilökohtaisen vammautumisen tapauksessa, jos se johtuu piittaamattomuudestamme tai vilpillisestä väitteestämme. + • Voimme myös toisinaan muuttaa näitä Ehtoja, mutta muutokset vaikuttavat ainoastaan niitä koskevan lain rajoissa. Jos esimerkiksi käytät Minecraftia vain yksinpelitilassa etkä käytä saataville tekemiämme päivityksiä, niin silloin nojataan vanhaan loppukäyttäjän käyttöoikeussopimukseen, mutta jos käytät päivityksiä tai Minecraftin osia, jotka riippuvat tarjoamistamme jatkuvista verkkopalveluista, niin silloin nojataan uuteen loppukäyttäjän käyttöoikeussopimukseen. Siinä tapauksessa emme ehkä voi eikä meidän tarvitse kertoa sinulle muutoksista, ja ne tulevat voimaan siitä huolimatta, joten käy täällä silloin tällöin, jotta olet tietoinen näihin Ehtoihin mahdollisesti tehdyistä muutoksista. Emme kuitenkaan aio toimia tässä epäreilusti – mutta joskus laki muuttuu tai joku tekee jotain, mikä vaikuttaa muihin Minecraftin käyttäjiin ja siksi meidän pitää ottaa sekin huomioon. + • Jos esität meille Minecraftia tai jotain muuta peliämme koskevan ehdotuksen, teet sen ilmaiseksi. Se tarkoittaa, että voimme käyttää ehdotustasi miten vain haluamme eikä meidän tarvitse maksaa sinulle siitä hyvästä. Jos uskot, että sinulla olisi ehdotus, josta saattaisimme maksaa sinulle, sinun on kerrottava odottavasi saavasi maksun ennen kuin kerrot ehdotuksesi. + • Näiden Ehtojen lisäksi meillä on ohjeita nimeltän "Brand and Asset Usage Guidelines", jotka voi lukea verkosta. + • Jos rikot näitä sääntöjä me (tai Sony Computer Entertainment) saattaa estää sinua käyttämästä Minecraftia. Jos et halua tai voi suostua noudattamaan näitä sääntöjä, niin älä osta, lataa, käytä tai pelaa Minecraftia. + Jos mietit jonkin teon laillisuutta, ja vastausta siihen ei löydy tältä sivulta, älä tee sitä vaan kysy meiltä. Periaatteessa: älä toimi naurettavasti, niin mekään emme. + Me olemme: + Mojang AB + Maria Skolgata 83, + SE-11853 + Stockholm + Sverige + Yritystunnus: 556819-2388 + + + + + Mikä tahansa pelinsisäisestä kaupasta ostettu sisältö ostetaan Sony Network Entertainment Europe Limited ("SNEE") -yhtiöltä ja se on Sony Entertainment Network -palvelun palveluehtojen ja käyttäjäsopimuksen alainen. Ne voi lukea PlayStation®Store -kaupasta. Tarkista käyttöoikeudet jokaisen ostotapahtuman yhteydessä, koska ne voivat vaihdella tuotekohtaisesti. Ellei muutoin mainita, kaiken pelinsisäisessä kaupassa myytävän sisällön ikärajoitus on sama kuin itse pelillä. + + + + Tuotteiden ostaminen ja käyttäminen on verkon palveluehtojen ja käyttösopimuksen alaista. Tämän verkkopalvelun on sinulle tuottanut alilisenssillä Sony Computer Entertainment America. + + + Muista: Tämän ohjelmiston käyttäminen osoitteessa eu.playstation.com/legal ilmoitettujen ohjelmiston käyttöehtojen alaista. + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/fi-FI/stringsDynafont.xml b/Minecraft.Client/PSVitaMedia/loc/fi-FI/stringsDynafont.xml new file mode 100644 index 00000000..dca31ec2 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/fi-FI/stringsDynafont.xml @@ -0,0 +1,7 @@ + + + + DynaFont developed by DynaComware. + + + \ 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 new file mode 100644 index 00000000..fb0f8f65 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/fi-FI/stringsGeneric.xml @@ -0,0 +1,6760 @@ + + + + Vaihdetaan paikalliseen peliin + + + Odota kun istunnon järjestäjä tallentaa pelin + + + Siirrytään Ääreen + + + Tallennetaan pelaajia + + + Yhdistetään istunnon järjestäjään + + + Ladataan maastoa + + + Poistutaan Äärestä + + + 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. + + + 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. + + + Ladataan kenttää + + + Viimeistellään... + + + Rakennetaan maastoa + + + Simuloidaan hieman maailmaa + + + Sija + + + Valmistaudutaan tallentamaan kenttä + + + Valmistellaan osioita... + + + Otetaan palvelin käyttöön + + + Poistutaan Hornasta + + + Synnytään uudelleen + + + Luodaan kenttää + + + Luodaan syntyalue + + + Ladataan syntyalue + + + Siirrytään Hornaan + + + Työkalut ja aseet + + + Gamma + + + Pelin herkkyys + + + Käyttöliittymän herkkyys + + + Vaikeustaso + + + Musiikki + + + Ääni + + + Rauhallinen + + + 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. + + + Helppo + + + Tavallinen + + + Vaikea + + + Kirjautunut ulos + + + Panssari + + + Mekanismit + + + Kulkuneuvot + + + Aseet + + + Ruoka + + + Rakennukset + + + Koristeet + + + Keittäminen + + + Työkalut, aseet ja panssarit + + + Materiaalit + + + Rakennuspalikat + + + Punakivi ja kulkuneuvot + + + Sekalaiset + + + Sijoitukset: + + + Poistu tallentamatta + + + Haluatko varmasti poistua päävalikkoon? Kaikki tallentamaton edistyminen menetetään. + + + Haluatko varmasti poistua päävalikkoon? Edistymisesi menetetään! + + + 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 + + + Luo uusi maailma + + + Anna nimi maailmallesi + + + Syötä siemen maailmasi luomiseksi + + + 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 + + + Arkku + + + Lumoa + + + Uuni + + + Tämän tyyppistä ladattavaa sisältöä ei ole juuri nyt saatavilla tälle pelille. + + + Haluatko varmasti poistaa tämän pelitallenteen? + + + Odottaa hyväksyntää + + + Sensuroitu + + + %s on liittynyt peliin. + + + %s on poistunut pelistä. + + + %s potkaistiin pelistä. + + + Keittoteline + + + Kirjoita kyltin teksti + + + Kirjoita teksti kylttiisi + + + Kirjoita otsikko + + + Koepeli on päättynyt + + + Peli on täynnä + + + Ei voitu liittyä peliin, koska tilaa ei ole + + + Kirjoita viestisi otsikko + + + Kirjoita viestisi kuvaus + + + Tavaraluettelo + + + Raaka-aineet + + + Kirjoita kuvateksti + + + Kirjoita viestisi kuvateksti + + + Kirjoita kuvaus + + + Tällä hetkellä soi: + + + 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 + + + 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ä? + + + Automaattitallennuksen väli: POIS + + + Käyttöliittymän läpinäkymättömyys + + + Valmistaudutaan kentän automaattitallennukseen + + + HUD-näytön koko + + + 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. + + + Suosikkiulkoasut + + + Pelaajan %s peli + + + Tuntemattoman istunnon järjestäjän peli + + + Vieras on kirjautunut ulos + + + Nollaa asetukset + + + Haluatko varmasti nollata asetuksesi niiden oletusarvoihin? + + + Latausvirhe + + + Vieraileva pelaaja on kirjautunut ulos, minkä johdosta kaikki vierailevat pelaajat poistettiin pelistä. + + + Pelin luominen ei onnistunut + + + Automaattisesti valittu + + + Ei pakettia: oletusulkoasut + + + Kirjaudu + + + Et ole kirjautunut. Sinun pitää olla kirjautunut pelataksesi tätä peliä. Haluatko kirjautua nyt? + + + Moninpeli ei ole sallittu + + + Juo + + + + 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. + + + 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ä. + + + + + Kun haluat käyttää portaalia Hornaan, seiso sen sisällä. Näyttö muuttuu violetiksi ja kuulet äänen. Muutaman sekunnin kuluttua siirryt toiseen ulottuvuuteen. + + + + 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ä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". + + + 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*} + + + + {*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. + + + 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. + + + + 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ä. + + + + 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. + + + {*B*} + Opettele lisää keittämisestä ja juomista painamalla{*CONTROLLER_VK_A*}.{*B*} + Jos tiedät jo tarpeeksi keittämisestä ja juomista, paina{*CONTROLLER_VK_B*}. + + + + Ensimmäinen vaihe juoman keittämisessä on vesipullon valmistaminen. Ota arkusta lasipullo. + + + + Voit täyttää lasipullon padasta, jossa on vettä, tai vesipalikasta. Täytä nyt lasipullo osoittamalla vesilähdettä ja painamalla{*CONTROLLER_ACTION_USE*}. + + + + 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. + + + + Nyt kun kestät tulta ja laavaa, huomaat että pääset paikkoihin, joihin et aiemmin pystynyt menemään. + + + + Tämä on lumousvalikko, jolla voit lisätä lumouksia aseisiin, panssareihin ja joihinkin työkaluihin. + + + {*B*} + Opettele lisää lumousvalikon käyttämistä{*CONTROLLER_VK_A*}.{*B*} + Jos osaat jo käyttää lumousvalikkoa, paina{*CONTROLLER_VK_B*}. + + + + Tältä alueelta löytyvät keittoteline, pata sekä arkku täynnä keittämiseen tarvittavia esineitä. + + + + 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. + + + + 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. + + + + 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*} + + + + Veneellä pääset kulkemaan vedessä nopeammin. Voit ohjata sitä painamalla{*CONTROLLER_ACTION_MOVE*} ja{*CONTROLLER_ACTION_LOOK*}. + {*BoatIcon*} + + + + + Käytät nyt onkivapaa. Voit kalastaa sillä painamalla{*CONTROLLER_ACTION_USE*}.{*FishingRodIcon*} + + + + {*B*} + Opettele lisää kalastamisesta{*CONTROLLER_VK_A*}.{*B*} + Jos tiedät jo tarpeeksi kalastamisesta, paina{*CONTROLLER_VK_B*}. + + + + 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ä. + + + + {*B*} + Opettele lisää sängyistä painamalla{*CONTROLLER_VK_A*}.{*B*} + Jos tiedät jo tarpeeksi sängyistä, paina{*CONTROLLER_VK_B*}. + + + + Sänky kannattaa asettaa turvalliseen ja hyvin valaistuun paikkaan niin, että hirviöt eivät herätä sinua keskellä yötä. Jos olet käyttänyt sänkyä, heräät siinä kuoltuasi. + {*ICON*}355{*/ICON*} + + + + Jos pelissäsi on muita pelaajia ja haluatte nukkua, kaikkien on oltava sängyssä samaan aikaan. + {*ICON*}355{*/ICON*} + + + + {*B*} + Opettele lisää veneistä{*CONTROLLER_VK_A*}.{*B*} + Jos tiedät jo tarpeeksi veneistä, 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. + + + + 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. + + + + 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*}. + + + + Kokemuspisteitä saa myös lumouspullolla, joka luo kokemuskuulia laskeutumispaikkaansa, kun sen heittää. Luodut kuulat voi sitten kerätä talteen. + + + + 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*} + + + + 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*}. + + + 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. + + + Onneksi olkoon, olet suorittanut opetuspelin. Pelissä aika kulkee nyt normaalisti, eikä mene pitkään ennen kuin tulee yö ja hirviöt saapuvat! Tee suojapaikkasi valmiiksi! + + + {*EXIT_PICTURE*} Kun olet valmis tutkimaan kauempana olevia paikkoja, tällä alueella kaivosmiehen mökin lähistöllä on ovi, joka johtaa pieneen linnaan. + + + + {*B*}Pelaa opetuspeli läpi normaalisti painamalla{*CONTROLLER_VK_A*}.{*B*} + Ohita pääopetuspeli painamalla{*CONTROLLER_VK_B*}. + + + + {*B*} + Opettele lisää ruokapalkista ja ruuan syömisestä painamalla{*CONTROLLER_VK_A*}.{*B*} + Jos tiedät jo tarpeeksi ruokapalkista ja ruuan syömisestä, paina{*CONTROLLER_VK_B*}. + + + Valitse + + + Käytä + + + 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. + + + Ota + + + Seuraava + + + Edellinen + + + Potkaise pelaaja + + + Lähetä kaveripyyntö + + + Selaa alas + + + Selaa ylös + + + Värjää + + + Paranna + + + Istu + + + Seuraa minua + + + Louhi + + + Syötä + + + Kesytä + + + Vaihda suodin + + + Aseta kaikki + + + Aseta yksi + + + Tiputa + + + Ota kaikki + + + Ota puolet + + + Aseta + + + Tiputa kaikki + + + Tyhjennä pikavalinta + + + Mikä tämä on? + + + Jaa Facebookissa + + + Tiputa yksi + + + Vaihda + + + Pikasiirrä + + + Ulkoasupaketit + + + Punaiseksi värjätty lasilevy + + + Vihreäksi värjätty lasilevy + + + Ruskeaksi värjätty lasilevy + + + Valkoiseksi värjätty lasi + + + Värjätty lasilevy + + + Mustaksi värjätty lasilevy + + + Siniseksi värjätty lasilevy + + + Harmaaksi värjätty lasilevy + + + Pinkiksi värjätty lasilevy + + + Limenvihreäksi värjätty lasilevy + + + Violetiksi värjätty lasilevy + + + Sinivihreäksi värjätty lasilevy + + + Vaaleanharmaaksi värjätty lasilevy + + + Oranssiksi värjätty lasi + + + Siniseksi värjätty lasi + + + Violetiksi värjätty lasi + + + Sinivihreäksi värjätty lasi + + + Punaiseksi värjätty lasi + + + Vihreäksi värjätty lasi + + + Ruskeaksi värjätty lasi + + + Vaaleanharmaaksi värjätty lasi + + + Keltaiseksi värjätty lasi + + + Vaaleansiniseksi värjätty lasi + + + Magentaksi värjätty lasi + + + Harmaaksi värjätty lasi + + + Pinkiksi värjätty lasi + + + Limen vihreäksi värjätty lasi + + + Keltaiseksi värjätty lasilevy + + + Vaaleanharmaa + + + Harmaa + + + Pinkki + + + Sininen + + + Violetti + + + Sinivihreä + + + Limenvihreä + + + Oranssi + + + Valkoinen + + + Muokattu + + + Keltainen + + + Vaaleansininen + + + Magenta + + + Ruskea + + + Valkoiseksi värjätty lasilevy + + + Pieni pallo + + + Iso pallo + + + Vaaleansiniseksi värjätty lasilevy + + + Magentaksi värjätty lasilevy + + + Oranssiksi värjätty lasilevy + + + Tähdenmuotoinen + + + Musta + + + Punainen + + + Vihreä + + + Lurkinmuotoinen + + + Räjähdys + + + Tuntematon muoto + + + Mustaksi värjätty lasi + + + Hevosen rautapanssari + + + 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 + + + +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. + + + +{*C2*}Vedäpä henkeä. Vielä uudestaan. Tunne ilma keuhkoissasi. Anna raajojesi palata. Niin, liikuta sormiasi. Omaksu taas keho, joka on painovoiman alainen, ilmassa. Synny uudelleen pitkään uneen. Siinähän sinä oletkin. Kehosi koskettaa taas universumia joka kohdasta, kuin olisitte erillisiä. Kuin mekin olisimme erillisiä.{*EF*}{*B*}{*B*} +{*C3*}Keitä me olemme? Joskus meitä kutsuttiin vuorenhengeksi. Isä auringoksi, äiti kuuksi. Muinaisiksi hengiksi, eläinhengiksi. Jinneiksi. Aaveiksi. Vihreäksi mieheksi. Sitten jumaliksi, demoneiksi. Enkeleiksi. Räyhähengiksi. Muukalaisiksi, maan ulkopuolisiksi. Leptoneiksi, kvarkeiksi. Sanat muuttuvat. Me emme muutu.{*EF*}{*B*}{*B*} +{*C2*}Me olemme universumi. Me olemme kaikkea, minkä luulet olevan jotain muuta kuin sinä itse. Katsot meitä nyt, ihollasi ja silmilläsi. Ja miksi universumi sitten koskettaa ihoasi ja loistaa valoa yllesi? Jotta se näkisi sinut, pelaaja. Oppiakseen tuntemaan sinut. Ja tullakseen tunnetuksi. Minä kerron sinulle tarinan.{*EF*}{*B*}{*B*} +{*C2*}Olipa kerran pelaaja.{*EF*}{*B*}{*B*} +{*C3*}Se palaaja olit sinä, {*PLAYER*}.{*EF*}{*B*}{*B*} +{*C2*}Joskus hän piti itseään ihmisenä, joka eli sulan kivipallon ohuella ulkokuorella. Tuo sulan kiven täyttämä pallo kiersi loistavana palavaa kaasupalloa, joka oli sitä kolmekymmentätuhatta kertaa suurempi. Ne olivat niin kaukana toisistaan, että valolta kesti kahdeksan minuuttia kulkea tuo matka. Valo oli tietoa tähdestä, ja se pystyi kärventämään ihosi 150 miljoonan kilometrin päästä.{*EF*}{*B*}{*B*} +{*C2*}Joskus pelaaja uneksi olevansa kaivostyöläinen maanpinnalla, joka oli tasainen ja loputon. Aurinko oli valkoinen neliö. Päivät olivat lyhyitä ja tekemistä oli paljon – ja kuolema oli vain väliaikainen pikku haitta.{*EF*}{*B*}{*B*} +{*C3*}Joskus pelaaja uneksi joutuneensa eksyksiin tarinaan.{*EF*}{*B*}{*B*} +{*C2*}Joskus pelaaja uneksi olevansa jotain muuta, jossain muualla. Joskus unet olivat häiritseviä. Joskus taas hyvin kauniita. Joskus pelaaja heräsi yhdestä unesta toiseen, ja siitä edelleen kolmanteen.{*EF*}{*B*}{*B*} +{*C3*}Joskus pelaaja uneksi katselevansa sanoja näytöllä.{*EF*}{*B*}{*B*} +{*C2*}Palataan takaisin.{*EF*}{*B*}{*B*} +{*C2*}Pelaajan atomit olivat hajallaan ruohikolla, joissa, ilmassa, maassa. Nainen keräsi atomit; hän joi ja söi ja hengitti; ja nainen kokosi pelaajan kehoonsa.{*EF*}{*B*}{*B*} +{*C2*}Niinpä pelaaja heräsi äitinsä kehon lämpimästä ja pimeästä maailmasta pitkään uneen.{*EF*}{*B*}{*B*} +{*C2*}Ja pelaaja oli uusi tarina, jota ei koskaan ennen ollut kerrottu, kirjoitettu DNA:n kirjaimin. Ja pelaaja oli uusi ohjelma, jota ei ollut koskaan käynnistetty, jonka pohjana oli miljardeja vuosia vanha lähdekoodi. Ja pelaaja oli uusi ihminen, joka ei ollut koskaan ennen ollut elossa, valmistettu pelkästä maidosta ja rakkaudesta.{*EF*}{*B*}{*B*} +{*C3*}Sinä olet pelaaja. Tarina. Ohjelma. Ihminen. Valmistettu pelkästä maidosta ja rakkaudesta.{*EF*}{*B*}{*B*} +{*C2*}Palataan vielä taaksepäin.{*EF*}{*B*}{*B*} +{*C2*}Seitsemän miljardia miljardia miljardia atomia pelaajan kehossa luotiin kauan ennen tätä peliä, tähden sydämessä. Joten myös pelaaja on tietoa tähdestä. Ja pelaaja liikkuu tarinassa, joka on Julian-nimisen miehen istuttama tietometsä, Markus-nimisen miehen luomassa loputtomassa ja tasaisessa maailmassa, joka sijaitsee pienessä yksityisessä maailmassa, jonka loi pelaaja, joka asuu universumissa, jonka loi...{*EF*}{*B*}{*B*} +{*C3*}Hys. Joskus pelaaja loi pienen yksityisen maailman, joka oli pehmeä, lämmin ja yksinkertainen. Joskus se taas oli kova, kylmä ja monimutkainen. Joskus hän rakensi universumin mallin päässään; energiahiukkasia, jotka liikkuivat valtavan tyhjyyden halki. Joskus hän kutsui noita hiukkasia "elektroneiksi" ja "protoneiksi".{*EF*}{*B*}{*B*} + + + +{*C2*}Joskus hän kutsui niitä "planeetoiksi" ja "tähdiksi".{*EF*}{*B*}{*B*} +{*C2*}Joskus hän uskoi olevansa universumissa joka koostui päälle/pois-energiasta; nollista ja ykkösistä; koodiriveistä. Joskus hän uskoi pelaavansa peliä. Joskus hän uskoi lukevansa sanoja näytöltä.{*EF*}{*B*}{*B*} +{*C3*}Sinä olet pelaaja, lukemassa sanoja...{*EF*}{*B*}{*B*} +{*C2*}Hys... Joskus pelaaja luki koodirivejä näytöltä. Muunsi ne sanoiksi; muunsi sanat tarkoitukseksi; muunsi tarkoituksen tunteiksi, teorioiksi, ideoiksi. Ja pelaaja alkoi hengittää nopeammin ja syvemmin ja tajusi olevansa elossa. Elossa – ne tuhannet kuolemat eivät olleet totta, pelaaja oli elossa.{*EF*}{*B*}{*B*} +{*C3*}Sinä. Sinä. Sinä olet elossa.{*EF*}{*B*}{*B*} +{*C2*}Ja joskus pelaaja kuvitteli universumin puhuneen hänelle auringonvalolla, joka paistoi kesäisten puiden havisevien lehtien lomasta.{*EF*}{*B*}{*B*} +{*C3*}Ja joskus pelaaja uskoi universumin puhuneen hänelle valolla, joka tuikki kirpeältä talviselta yötaivaalta. Silloin valonhäive pelaajan silmäkulmassa olisi saattanut olla miljoona kertaa aurinkoa suurempi tähti, joka oli kiehauttanut planeettansa plasmaksi ollakseen vain hetken näkyvissä pelaajalle. Pelaajalle joka oli kävelemässä kotiinsa universumin kaukaisella laidalla haistaen yllättäen ruuan, miltei jo tutulla ovella, pian taas uneksimassa.{*EF*}{*B*}{*B*} +{*C2*}Ja joskus pelaaja uskoi universumin puhuneen hänelle nollilla ja ykkösillä, maailman sähköisyydellä, näytöllä vierivillä sanoilla unen lopussa.{*EF*}{*B*}{*B*} +{*C3*}Ja universumi sanoi: "Minä rakastan sinua."{*EF*}{*B*}{*B*} +{*C2*}Ja universumi sanoi: "Olet pelannut peliä hyvin."{*EF*}{*B*}{*B*} +{*C3*}Ja universumi sanoi: "Kaiken tarvitsemasi löydät sisältäsi."{*EF*}{*B*}{*B*} +{*C2*}Ja universumi sanoi: "Olet vahvempi kuin aavistat."{*EF*}{*B*}{*B*} +{*C3*}Ja universumi sanoi: "Sinä olet päivänvalo."{*EF*}{*B*}{*B*} +{*C2*}Ja universumi sanoi: "Sinä olet yö."{*EF*}{*B*}{*B*} +{*C3*}Ja universumi sanoi: "Pimeys, jota vastustat, on sisälläsi."{*EF*}{*B*}{*B*} +{*C2*}Ja universumi sanoi: "Valo, jota etsit, on sisälläsi."{*EF*}{*B*}{*B*} +{*C3*}Ja universumi sanoi: "Sinä et ole yksin."{*EF*}{*B*}{*B*} +{*C2*}Ja universumi sanoi: "Sinä et ole erossa kaikesta muusta."{*EF*}{*B*}{*B*} +{*C3*}Ja universumi sanoi: "Sinä olet universumi, joka maistaa itseään, puhuu itselleen, lukee omaa koodiaan."{*EF*}{*B*}{*B*} +{*C2*}Ja universumi sanoi: "Minä rakastan sinua, koska olet rakkaus."{*EF*}{*B*}{*B*} +{*C3*}Ja niin peli päättyi ja pelaaja heräsi unestaan. Ja pelaaja alkoi nähdä uutta unta. Ja pelaaja uneksi jälleen, uneksi paremmin. Ja pelaaja oli universumi. Ja pelaaja oli rakkaus.{*EF*}{*B*}{*B*} +{*C3*}Sinä olet pelaaja.{*EF*}{*B*}{*B*} +{*C2*}Herää.{*EF*} + + + 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 + + + Älä nollaa Hornaa + + + Tätä sienilehmää ei voi keritä tällä hetkellä. Sikojen, lampaiden, lehmien, kissojen ja hevosten enimmäismäärä on saavutettu. + + + Kuolit! + + + Maailman asetukset + + + Saa rakentaa ja louhia + + + Saa käyttää ovia ja kytkimiä + + + Luo rakennelmia + + + Täysin tasainen maailma + + + Bonusarkku + + + Saa avata säilytysastioita + + + Potkaise pelaaja + + + Saa lentää + + + 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 + + + Majakat + + + {*T3*}PELIOHJE: MAJAKAT{*ETW*}{*B*}{*B*} +Aktiiviset majakat heijastavat kirkkaan valonsäteen taivaalle ja antavat voimia läheisille pelaajille.{*B*} +Ne valmistetaan lasista, laavakivestä ja hornatähdistä, joita saa kukistamalla näivettäjän.{*B*}{*B*} +Majakat on asetettava paikkaan, missä ne ovat auringonvalossa päiväaikaan. Majakat on asetettava rautaisen, kultaisen, smaragdisen tai timanttisen pyramidin päälle.{*B*} +Materiaali, jolle majakka asetetaan, ei vaikuta majakan tehoon.{*B*}{*B*} +Majakkavalikosta voi valita majakalle yhden ensisijaisen voiman. Mitä enemmän pyramidilla on tasoja, sitä suurempi voimavalikoima on.{*B*} +Majakka pyramidilla, jolla on vähintään neljä tasoa, antaa lisäksi valita toissijaiseksi voimaksi paranemisen tai voimakkaamman ensisijaisen voiman.{*B*}{*B*} +Jotta voisit asettaa majakkasi voimat, sinun on uhrattava yksi smaragdi, timantti, kultaharkko tai rautaharkko maksupaikkaan.{*B*} +Kun voimat on asetettu, ne säteilevät majakasta loputtomasti.{*B*} + + + + Ilotulitteet + + + Kielet + + + Hevoset + + + {*T3*}PELIOHJE: HEVOSET{*ETW*}{*B*}{*B*} +Hevosia ja aaseja löytyy pääasiassa avoimilta tasangoilta. Muulit ovat aasien ja hevosten jälkeläisiä, jotka eivät itse voi lisääntyä.{*B*} +Kaikilla täysikasvuisilla hevosilla, aaseilla ja muuleilla voi ratsastaa. Vain hevosia voi kuitenkin panssaroida, ja vain muuleille ja aaseille voi laittaa satulalaukut tavaroiden kuljettamista varten.{*B*}{*B*} +Hevoset, aasit ja muulit täytyy kesyttää, ennen kuin niitä voi käyttää. Hevosen saa kesytettyä yrittämällä ratsastaa sillä ja pysymällä sen selässä, kun se yrittää pudottaa ratsastajan.{*B*} +Kun hevosen ympärille ilmestyy rakkaussydämiä, se on kesy eikä yritä enää heittää pelaajaa selästään. Jotta hevosta voi ohjata, pelaajan täytyy laittaa sille satula.{*B*}{*B*} +Satuloita voi ostaa kyläläisiltä tai löytää maailmaan kätketyistä arkuista.{*B*} +Kesyille aaseille ja muuleille voi antaa satulalaukut kiinnittämällä arkun. Näitä satulalaukkuja voi sitten käyttää ratsastettaessa tai hiipiessä.{*B*}{*B*} +Hevoset ja aasit (mutta ei muuleja) saa lisääntymään muiden eläinten tavoin käyttämällä kultaisia omenoita tai kultaisia porkkanoita.{*B*} +Varsoista kasvaa ajan mittaan täysikasvuisia hevosia, joskin kasvamista voi nopeuttaa syöttämällä niille vehnää tai heinää.{*B*} + + + + {*T3*}PELIOHJE: ILOTULITTEET{*ETW*}{*B*}{*B*} +Ilotulitteet ovat koriste-esineitä, jotka voi laukaista kädestä tai jakelulaitteella. Ne valmistetaan paperista, ruudista ja valinnaisesti erilaisista ilotulitetähdistä.{*B*} +Ilotuliteähtien värejä, hiipumista, muotoa, kokoa ja vaikutuksia (kuten vana ja tuikkiminen) voi muokata käyttämällä valmistuksessa ylimääräisiä ainesosia.{*B*}{*B*} +Kun haluat valmistaa ilotulitteen, aseta ruuti ja paperi 3x3-kokoiseen valmistusruudukkoon, joka näkyy tavaraluettelosi yläpuolella.{*B*} +Vaihtoehtoisesti voit lisätä ilotulitteeseen useita ilotulitetähtiä asettamalla ne valmistusruudukkoon.{*B*} +Jos täytät useampia paikkoja valmistusruudukosta ruudilla, se kasvattaa korkeutta, jossa kaikki ilotulitetähdet räjähtävät.{*B*}{*B*} +Sitten voit ottaa valmiin ilotulitteen tuottopaikkaan.{*B*}{*B*} +Ilotulitetähtiä valmistetaan asettamalla ruutia ja väriainetta valmistusruudukkoon.{*B*} +- Väriaine määrittää ilotulitetähden räjähdyksen värin.{*B*} +- Ilotulitetähden muoto määritetään lisäämällä joko tulilataus, kultahippu, höyhen tai olennonpää.{*B*} +- Vana tai tuikkiminen voidaan lisätä timanteilla tai hehkukivipölyllä.{*B*}{*B*} +Kun ilotulitetähti on valmis, voit asettaa sen hiipumisvärin käyttämällä väriainetta. + + + {*T3*}PELIOHJE: PUDOTTAJAT{*ETW*}{*B*}{*B*} +Kun pudottajalle annetaan virtaa punakivellä, se pudottaa maahan satunnaisen sisältämänsä esineen. Avaa pudottaja painamalla {*CONTROLLER_ACTION_USE*}, niin voit ladata pudottajaan esineitä tavaraluettelostasi.{*B*} +Jos pudottaja on suunnattu arkkua tai toisentyyppistä säilöä päin, esine sijoitetaan sen sisään. On mahdollista rakentaa pudottajista pitkä ketju esineiden kuljettamiseksi matkan päähän. Jotta tämä onnistuu, niille pitää vuoroin antaa virtaa ja katkaista se. + + + Muuttuu käytettäessä kartaksi siitä osasta maailmaa, jolla sillä hetkellä olet, ja täydentyy tutkiessasi. + + + Putoaa näivettäjältä. Käytetään majakan valmistamiseen. + + + Hyppijät + + + {*T3*}PELIOHJE: HYPPIJÄT{*ETW*}{*B*}{*B*} +Hyppijöitä käytetään siirtämään tavaroita säilöihin tai niistä pois, sekä poimimaan automaattisesti niihin heitettyjä tavaroita.{*B*} +Ne voivat vaikuttaa keittotelineisiin, arkkuihin, jakelulaitteisiin, pudottajiin, kaivoskärryihin joissa on arkku, kaivoskärryihin joissa on hyppijä sekä muihin hyppijöihin.{*B*}{*B*} +Hyppijät yrittävät jatkuvasti imeä ulos tavaroita sopivista säilöistä, jotka on asetettu niiden ylle. Ne myös yrittävät asettaa sisältämiään tavaroita asetussäilöön.{*B*} +Jos hyppijä saa virtaa punakivestä, se sammuu ja lakkaa imemästä ja asettamasta tavaroita.{*B*}{*B*} +Hyppijä osoittaa suuntaan, johon se yrittää asettaa tavaroita. Jos haluat suunnata hyppijän kohti tiettyä palikkaa, aseta se palikkaa vasten hiipiessäsi.{*B*} + + + + Pudottajat + + + EI KÄYTÖSSÄ + + + välitön elinvoima + + + välitön vahinko + + + tehostettu hyppy + + + louhintauupumus + + + voima + + + heikkous + + + pahoinvointi + + + EI KÄYTÖSSÄ + + + EI KÄYTÖSSÄ + + + EI KÄYTÖSSÄ + + + paraneminen + + + kesto + + + Etsitään siementä maailmageneraattoria varten + + + 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. + + + Kiskot jotka voivat ottaa käyttöön ja poistaa käytöstä kaivoskärryjä, joissa on hyppijä, sekä aktivoida kaivoskärryjä, joissa on dynamiittia. + + + Käytetään varastoimaan ja tiputtamaan tavaroita, tai työntämään tavaroita toiseen säilöön, kun se saa punakivilatauksen. + + + Värikkäitä palikoita, joita valmistetaan värjäämällä kovetettua savea. + + + 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 + + + nälkä + + + : hitaus + + + : nopeus + + + näkymättömyys + + + vesihengitys + + + yönäkö + + + sokeus + + + : vahingonteko + + + : parantaminen + + + : pahoinvointi + + + : paraneminen + + + : Ikävyys + + + : kiire + + + : heikkous + + + : voima + + + tulen kesto + + + Kylläisyys + + + : kesto + + + : hyppy + + + Näivettäjä + + + Elinvoimatehoste + + + Imukyky + + + + + + II + + + 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ä + + + tavallinen + + + tylsä + + + upea + + + harras + + + lumoava + + + elegantti + + + hieno + + + helmeilevä + + + 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 + + + Isku + + + Terävyys + + + Vähentää pelaajien, eläinten ja hirviöiden elinvoimaa ajan kuluessa. + + + Hyökkäysvahinko + + + Tönäisy + + + Niveljalkaisten surma + + + Nopeus + + + Zombivahvistukset + + + Hevosen hyppyvoima + + + Käytettäessä: + + + Tönäisyn vastustus + + + Olentojen seurauskantama + + + Maksimielinvoima + + + Silkkikosketus + + + Tehokkuus + + + Vesimieltymys + + + Onni + + + Saaliin kerääminen + + + Särkymätön + + + Tulisuojaus + + + Suojaus + + + Liekehtivä + + + Alas leijuminen + + + Hengitys + + + Ammussuoja + + + Räjähdyssuoja + + + IV + + + V + + + VI + + + Lyönti + + + VII + + + III + + + Liekki + + + Voima + + + Loputtomuus + + + II + + + I + + + Aktivoituu, kun olento kulkee tähän yhdistetyn ansalangan päältä. + + + Aktivoi tähän yhdistetyn ansakoukun, kun olento kulkee sen päältä. + + + Kätevä tapa varastoida smaragdeja. + + + Samantapainen kuin arkku, paitsi että äärenarkkuun asetetut tavarat ovat saatavilla pelaajan jokaisessa muussakin äärenarkussa, jopa eri ulottuvuuksissa. + + + IX + + + VIII + + + Voidaan louhia rautaisella tai sitä paremmalla hakulla smaragdien keräämiseksi. + + + X + + + Palauttaa 2{*ICON_SHANK_01*}, ja siitä voi valmistaa kultaisen porkkanan. Voidaan istuttaa viljelysmaahan. + + + Käytetään koristeena. Siihen voi istuttaa kukkia, taimia, kaktuksia tai sieniä. + + + Mukulakivistä tehty seinä. + + + Palauttaa 0,5{*ICON_SHANK_01*}, tai sen voi paistaa uunissa. Voidaan istuttaa viljelysmaahan. + + + 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*}. Tämän syöminen saattaa myrkyttää sinut. + + + Käytetään satuloidun sian ohjaamiseen ratsastettaessa. + + + Palauttaa 3{*ICON_SHANK_01*}. Valmistetaan paistamalla peruna uunissa. + + + Palauttaa 3{*ICON_SHANK_01*}. Valmistetaan porkkanasta ja kultahipuista. + + + Käytetään alasimen kanssa aseiden, työkalujen tai panssarin lumoamiseen. + + + Valmistetaan louhimalla hornakvartsimalmia. Siitä voi valmistaa kvartsipalikan. + + + Peruna + + + Paistettu peruna + + + Porkkana + + + Valmistetaan villasta. Käytetään koristeena. + + + Smaragdi + + + Kukkaruukku + + + Kurpitsapiirakka + + + Lumottu kirja + + + Myrkyllinen peruna + + + Kultainen porkkana + + + Porkkanakeppi + + + Ansakoukku + + + Ansalanka + + + Hornakvartsi + + + Smaragdimalmi + + + Äärenarkku + + + Sammaleinen mukulakiviseinä + + + Smaragdipalikka + + + Mukulakiviseinä + + + Perunat + + + Kukkaruukku + + + Porkkanat + + + Hieman vahingoittunut alasin + + + Alasin + + + Alasin + + + Kvartsipalikka + + + Pahasti vahingoittunut alasin + + + Hornakvartsimalmi + + + Kvartsiportaat + + + Veistetty kvartsipalikka + + + Kvarsipalikkapylväs + + + Punainen matto + + + Matto + + + Musta matto + + + Sininen matto + + + Vihreä matto + + + Ruskea matto + + + Lila matto + + + Sinivihreä matto + + + Vaaleanharmaa matto + + + Harmaa matto + + + Limenvihreä matto + + + Vaaleanpunainen matto + + + Vaaleansininen matto + + + Keltainen matto + + + Purppura matto + + + Oranssi matto + + + Valkoinen matto + + + Veistetty hiekkakivi + + + {*PLAYER*} kuoli yrittäessään satuttaa kohdetta {*SOURCE*}. + + + Sileä hiekkakivi + + + {*PLAYER*} liiskautui putoavan alasimen alle. + + + {*PLAYER*} liiskautui putoavan palikan alle. + + + {*PLAYER*} teleporttasi sinut luokseen. + + + Teleporttasi pelaajan {*PLAYER*} sijaintiin {*DESTINATION*}. + + + Okaat + + + {*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 + + + Liian kallis! + + + Lumoamisen hinta: %d + + + Sinulla on: + + + Nimeä uudelleen + + + {*VILLAGER_TYPE*} tarjoaa: %s + + + Tarvitset kaupantekoon: + + + Myy + + + 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*}. + + + 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. + + + 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. + + + 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ä. + + + + + {*B*} + Opettele lisää alasimesta{*CONTROLLER_VK_A*} .{*B*} + Jos osaat jo käyttää alasinta, paina{*CONTROLLER_VK_B*}. + + + 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ä. + + + 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. + + + 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. + + + Esineen uudelleen nimeäminen muuttaa kaikille pelaajille näkyvää nimeä ja pienentää pysyvästi aiemmin tehdyn työn hintaa. + + + + {*B*} + Opettele lisää kaupankäyntivalikon käyttämistä painamalla{*CONTROLLER_VK_A*} .{*B*} + Jos osaat jo käyttää kaupankäyntivalikkoa, paina{*CONTROLLER_VK_B*}. + + + 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ä. + + + 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. + + + 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*}. + + + Sekalaisten kauppojen tekeminen lisää tai päivittää sattumanvaraisesti kyläläisen ehdottamia vaihtokauppoja. + + + Kyläläisen tarjoamat vaihtokaupat riippuvat hänen ammatistaan. + + + Usein tehdyt vaihtokaupat saattavat poistua valikoimasta väliaikaisesti, mutta kyläläinen tarjoaa aina vähintään yhtä vaihtokauppaa. + + + Ota arkusta paperia ja kokeile kaupata sitä täällä olevalle kyläläiselle. + + + Tällä alueella on kaksi äärenarkkua. + + + + {*B*} + Opettele lisää äärenarkuista{*CONTROLLER_VK_A*}.{*B*} + Jos tiedät jo tarpeeksi äärenarkuista, paina{*CONTROLLER_VK_B*}. + + + Kaikki maailman äärenarkut ovat yhteydessä toisiinsa, jopa eri ulottuvuuksien välillä. Äärenarkkuun asetetut esineet ovat saatavilla missä tahansa toisessa äärenarkussa. + + + Äärenarkun sisällöt ovat kuitenkin erilaiset jokaiselle pelaajalle. + + + Näin pelaajat voivat tallettaa esineitä mihin tahansa äärenarkkuun ja hakea ne toisista äärenarkuista eri puolilta maailmaa. Voit kokeilla tätä nyt asettamalla esineitä kumpaan tahansa äärenarkkuun. + + + Palauttaa 2{*ICON_SHANK_01*}. Parantaa elinvoimaa 30 sekunnin ajan ja antaa tulenkeston ja vahingonkeston 5 minuutiksi. Valmistetaan omenasta ja kultapalikoista. + + + Saa teleportata + + + Teleporttaa + + + Teleporttaa pelaajan luo + + + Teleporttaa luokseni + + + Saa ottaa väsymisen pois käytöstä + + + Saa tulla näkymättömäksi + + + Nyt voit ottaa käyttöön näkymättömyyden + + + Et voi enää ottaa käyttöön näkymättömyyttä + + + Nyt voit ottaa käyttöön lentämisen + + + Et voi enää ottaa käyttöön lentämistä + + + Nyt voit ottaa väsymisen pois käytöstä + + + Et voi enää ottaa väsymistä pois käytöstä + + + Nyt voit teleportata + + + Et voi enää teleportata + + + {*T3*}PELIOHJE: ALASIMET{*ETW*}{*B*}{*B*} +Alasimella voi korjata, lumota tai nimetä uudelleen esineitä kokemuspisteitä hyödyntämällä.{*B*} +Kaikki esineet voi nimetä uudelleen, mutta vain esineitä jotka ovat kestäviä, voi korjata tai lumota lumotuilla kirjoilla.{*B*} +Esineen voi korjata asettamalla sen vasemmalla olevaan ruutuun yhdessä joko esineen jonkin raaka-aineen (kuten rautaharkon rautamiekkaa varten) tai toisen samantyyppisen esineen kanssa.{*B*} +Esineiden yhdistäminen on tehokkaampaa alasimella tehtynä. Jos lisäksi jompikumpi esineistä on lumottu, lopputuote saattaa sisältää lumouksia kummasta tahansa syötetystä esineestä.{*B*} +Esineen voi lumota yhdistämällä alasimella lumotun kirjan ja esineen, jos vain kirjan lumous on sopiva. Lumottuja kirjoja löytyy luolien arkuista, tai niitä voi valmistaa lumoamalla tavallisia kirjoja lumouspöydällä.{*B*} +Alasin saattaa vahingoittua jokaisen käyttökerran jälkeen ja se tuhoutuu lopulta saatuaan tarpeeksi iskuja.{*B*} + + + {*T3*}PELIOHJE: KAUPANKÄYNTI{*ETW*}{*B*}{*B*} +Kyläläisten kanssa voi käydä kauppaa. Jokaisella kyläläisellä on ammatti; he voivat olla maanviljelijöitä, teurastajia, seppiä, kirjastonhoitajia tai vaikka pappeja. Tämä vaikuttaa siihen, minkä tyyppisistä esineistä he käyvät kauppaa.{*B*} +Näet luettelon kaikista kyläläisen tarjoamista vaihtokaupoista kaupankäyntivalikosta. Kyläläinen saattaa muokata tai lisätä saatavilla olevia vaihtokauppoja aina, kun pelaaja käy hänen kanssaan kauppaa. Tietty vaihtokauppa saattaa olla väliaikaisesti pois käytöstä, jos se suoritetaan liian useasti.{*B*} +Kaupankäynti sisältää tavallisesti esineiden ostamista tai myymistä smaragdeja vastaan.{*B*} +Jos sinulla ei ole vaihtokauppaan vaadittavia esineitä, esineet näkyvät punaisina.{*B*} + + + {*T3*}PELIOHJE: ÄÄRENARKKU {*ETW*}{*B*}{*B*} +Maailman kaikki äärenarkut ovat yhteydessä toisiinsa. Yhteen äärenarkkuun asetetut esineet ovat saatavilla missä tahansa toisessakin äärenarkussa. Äärenarkun sisällöt ovat kuitenkin erilaiset jokaiselle pelaajalle. Näin pelaajat voivat tallettaa esineitä mihin tahansa äärenarkkuun ja hakea ne toisista äärenarkuista eri puolilta maailmaa. + + + + Maanviljelijä + + + Kirjastonhoitaja + + + Pappi + + + Seppä + + + Teurastaja + + + Kylistä löytyvät kyläläiset tarjoutuvat myymään pelaajalle erilaisia esineitä ammatistaan riippuen. + + + Suuri arkku + + + Voit myös luoda lumouspöydällä lumottuja kirjoja, joiden lumouksen pystyy siirtämään alasimella esineeseen. + + + Ansakoukut tuottavat myös jatkuvaa virtaa virtapiiriin, kun jokin laukaisee niiden välisen siiman. + + + Kesytetyllä sudella on aina kaulapanta. Pannan värin voi muuttaa värjäämällä sen. + + + Porkkanoita ja perunoita viljellään istuttamalla porkkanoita ja perunoita. Sadon voi korjata, kun juureksen lehdet ovat kasvaneet näkyville. + + + Sian voi myös satuloida, jolloin pelaaja pystyy ratsastamaan sillä. Niitä voi ohjata porkkanakepillä houkuttelemalla. + + + Mikäli tarpeellista, voit liikkua hitaasti kaivoskärrylläsi painamalla {*CONTROLLER_ACTION_MOVE*}. Niin on helpompi saada kaivoskärry sähköraiteen päälle. + + + + Et voi liittyä tähän peliin, koska jaettu näyttö toimii vain teräväpiirtotilassa. Kirjaa ulos kaikki muut pelaajat, jos haluat liittyä. + + + Paranna + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/fi-FI/stringsLeaderboards.xml b/Minecraft.Client/PSVitaMedia/loc/fi-FI/stringsLeaderboards.xml new file mode 100644 index 00000000..b2a0991a --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/fi-FI/stringsLeaderboards.xml @@ -0,0 +1,48 @@ + + + + Tapot – Helppo + + + Tapot – Tavallinen + + + Tapot – Vaikea + + + Palikoiden louhinta – Rauhallinen + + + Palikoiden louhinta – Helppo + + + Palikoiden louhinta – Tavallinen + + + Palikoiden louhinta – Vaikea + + + Maanviljely – Rauhallinen + + + Maanviljely – Helppo + + + Maanviljely – Tavallinen + + + Maanviljely – Vaikea + + + Matkustaminen – Rauhallinen + + + Matkustaminen – Helppo + + + Matkustaminen – Tavallinen + + + Matkustaminen – Vaikea + + \ 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 new file mode 100644 index 00000000..b4ff1de5 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/fi-FI/stringsPlatformSpecific.xml @@ -0,0 +1,244 @@ + + + + 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. + + + 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ä. + + + PlayStation®Vita-järjestelmä + + + 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 + + + Vaihda verkkotilaa + + + 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*} +Luovan tilan käyttöliittymässä pelaaja voi siirtää tavaraluetteloonsa pelin minkä tahansa esineen ilman että sitä täytyy louhia tai valmistaa. +Esineitä pelaajan tavaraluettelossa ei poisteta kun ne asetetaan tai käytetään maailmassa, jolloin pelaaja voi keskittyä rakentamiseen resurssien keräämisen sijasta.{*B*} +Jos luot, lataat tai tallennat maailman Luovassa tilassa, siinä maailmassa trophyt ja tulostilastopäivitykset on poistettu käytöstä, vaikka se ladattaisiin myöhemmin Selviytymistilassa.{*B*} +Kun haluat lentää Luovassa tilassa, paina{*CONTROLLER_ACTION_JUMP*} nopeasti kaksi kertaa. Kun haluat lopettaa lentämisen, tee sama uudestaan. Jos haluat lentää nopeammin, paina lentäessäsi{*CONTROLLER_ACTION_MOVE*} eteenpäin kaksi kertaa nopeasti. +Kun olet lentotilassa, voit pitää{*CONTROLLER_ACTION_JUMP*} painettuna noustaksesi ylemmäs ja{*CONTROLLER_ACTION_SNEAK*} painettuna laskeutuaksesi alemmas, tai liikkua ylös painamalla{*CONTROLLER_ACTION_DPAD_UP*}, laskeutua painamalla{*CONTROLLER_ACTION_DPAD_DOWN*}, +lentää vasemmalle painamalla{*CONTROLLER_ACTION_DPAD_LEFT*}, ja lentää oikealle painamalla{*CONTROLLER_ACTION_DPAD_RIGHT*}. + + + 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Ä" + + + 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? + + + "EI KÄYTÖSSÄ" + + + 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. + + + 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. +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? + + + 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/fi-FI/stringsRichPresence.xml b/Minecraft.Client/PSVitaMedia/loc/fi-FI/stringsRichPresence.xml new file mode 100644 index 00000000..92592031 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/fi-FI/stringsRichPresence.xml @@ -0,0 +1,66 @@ + + + + {GAME_STATE} + + + Toimeton + + + Valikoissa + + + Pelaamassa moninpeliä – {GAME_STATE} + + + Paikallisessa moninpelissä – {GAME_STATE} + + + Pelaa itsekseen – {GAME_STATE} + + + Paikallisessa pelissä itsekseen – {GAME_STATE} + + + Nauttii näkymistä! + + + Ratsastaa sialla + + + Ajaa kaivoskärryllä + + + Veneessä + + + Kalastaa + + + Valmistaa + + + Takoo + + + Hornassa + + + Kuuntelee levyä + + + Katselee karttaa + + + Lumoaminen + + + Juoman keittäminen + + + Työskentely alasimella + + + Naapurien tapaaminen + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/fr-FR/4J_stringsGeneric.xml b/Minecraft.Client/PSVitaMedia/loc/fr-FR/4J_stringsGeneric.xml new file mode 100644 index 00000000..dd76dbb1 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/fr-FR/4J_stringsGeneric.xml @@ -0,0 +1,87 @@ + + + + OK + + + Retour + + + Annuler + + + Oui + + + Non + + + Sauvegarde endommagée + + + Vos données de sauvegarde semblent endommagées. Créer une nouvelle sauvegarde et écraser le fichier endommagé ? + + + Espace libre insuffisant + + + Resélectionner + + + Jouer sans sauvegarder + + + Créer une sauvegarde + + + Écraser la sauvegarde ? + + + Non, ne pas écraser + + + Écraser et sauvegarder + + + Échec de la sauvegarde + + + Continuer sans sauvegarder + + + Échec du chargement + + + Nommer la sauvegarde + + + Saisir un nom pour la sauvegarde + + + Voulez-vous vraiment quitter le jeu ? + + + Déconnexion + + + Continuer à jouer + + + Continuer à jouer hors ligne + + + Joueur invité + + + Les joueurs invités ne peuvent accéder à "PSN". + + + Sauvegarde... + + + Enregistrement en cours. N'éteignez pas votre système. + + + Déverrouiller le jeu complet + + \ 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 new file mode 100644 index 00000000..201ad2bf --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/fr-FR/4J_stringsPlatformSpecific.xml @@ -0,0 +1,50 @@ + + + + La sauvegarde des paramètres sur votre compte Sony Entertainment Network a échoué. + + + Problème de compte Sony Entertainment Network + + + 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 new file mode 100644 index 00000000..e1e1d572 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/fr-FR/AdditionalStrings.xml @@ -0,0 +1,96 @@ + + + + Afficher tous les mondes mash-up + + + Masquer + + + Minecraft: PlayStation®3 Edition + + + Options + + + Sauv. cache + + + Une erreur réseau est survenue. + + + Erreur réseau + + + Une erreur réseau est survenue. Retour au menu principal. + + + Les restrictions de chat ont désactivé le service en ligne pour votre compte Sony Entertainment Network. + + + Les paramètres de contrôle parental ont désactivé le service en ligne pour votre compte Sony Entertainment Network. + + + Service en ligne + + + Vous avez été déconnecté de "PSN". Reconnectez-vous pour utiliser les fonctionnalités en ligne. + + + Vous avez été déconnecté de "PSN". Reconnectez-vous pour utiliser les fonctionnalités en ligne. Retour au menu principal. + + + Choisir utilisateur pour joueur %d (ou annuler pour jouer en tant qu'invité) + + + Gratuit + + + 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é. + + + Trophées désactivés + + + Trophées désactivés : cette sauvegarde appartient à un autre utilisateur. + + + Erreur fatale : échec de l'initialisation des trophées. Veuillez quitter le jeu. + + + Invitations + + + Fichier corrompu + + + Manette déconnectée + + + Votre manette a été déconnectée. Veuillez la reconnecter. + + + 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. + + + Invitation + + + Venez jouer à Minecraft: PlayStation®Vita Edition ! + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/fr-FR/EULA.xml b/Minecraft.Client/PSVitaMedia/loc/fr-FR/EULA.xml new file mode 100644 index 00000000..0b3afd50 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/fr-FR/EULA.xml @@ -0,0 +1,98 @@ + + + + Minecraft: PlayStation®Vita Edition - CONDITIONS D'UTILISATION + Ces Conditions établissent quelques règles d'utilisation pour Minecraft: PlayStation®Vita Edition ("Minecraft"). Afin de protéger Minecraft et les membres de notre communauté, nous avons besoin que ces conditions posent quelques règles à propos du téléchargement et de l'utilisation de Minecraft. Nous n'aimons pas plus les règles que vous, alors nous nous sommes efforcés de rester aussi brefs que possible, mais si vous achetez, téléchargez, utilisez ou jouez à Minecraft, vous acceptez de respecter ces conditions ("Conditions"). + Avant de poursuivre, il y a un point que nous tenons à bien préciser. Minecraft est un jeu qui permet aux joueurs de construire et de détruire des choses. Si vous jouez avec d'autres gens (multijoueur), vous pouvez construire avec eux, ou détruire ce qu'ils ont construit. Ils peuvent faire la même chose en ce qui vous concerne. Alors ne jouez pas avec d'autres gens s'ils ne se comportent pas comme vous le souhaiteriez. Il arrive aussi que les gens fassent des choses qu'ils ne devraient pas faire. Cela ne nous plaît pas, mais nous ne pouvons pas y faire grand-chose, à part demander à tout le monde de se comporter correctement. Nous comptons sur vous et les autres membres de la communauté pour nous prévenir si quelqu'un ne se comporte pas correctement. Si c'est le cas et/ou si vous pensez que quelqu'un enfreint les règles ou ces Conditions ou utilise Minecraft de manière inappropriée, merci de nous le dire. Nous avons un système de signalement prévu à cet effet, alors utilisez-le et nous ferons le nécessaire pour régler le problème. + Pour signaler un problème, envoyez-nous un e-mail à l'adresse support@mojang.com en donnant autant d'informations que possible, notamment sur l'utilisateur et sur ce qui s'est passé. + Bien, revenons aux Conditions : + UNE RÈGLE ESSENTIELLE + La règle essentielle est que vous ne devez pas distribuer quoi que ce soit que nous ayons créé. Par "distribuer quoi que ce soit que nous ayons créé", nous entendons "donner des copies de Minecraft, en faire un usage commercial, essayer d'en tirer de l'argent, ou laisser d'autres personnes accéder à Minecraft et ses éléments de façon abusive ou déraisonnable". Donc, la règle essentielle est que vous ne devez pas (à moins que nous ayons donné notre accord, par exemple dans nos "Brand and Assets Usage Guidelines") : + • donner des copies de Minecraft à qui que ce soit ; + • utiliser quoi que ce soit que nous ayons créé dans un but commercial ; + • essayer de tirer de l'argent de quoi que ce soit que nous ayons créé ; ou + • permettre à d'autres gens d'accéder à quoi que ce soit que nous ayons créé de façon abusive ou déraisonnable. + ... et pour que ce soit parfaitement clair, ce que nous avons créé comprend, mais sans s'y limiter, le client ou le logiciel serveur de Minecraft. Cela comprend également les versions modifiées du Jeu, ses éléments et tout ce que nous avons créé d'autre. + À part ça, vous pouvez faire ce que vous voulez. En fait, nous vous encourageons vraiment à vous faire plaisir (voir ci-dessous), mais ne faites pas ce qu'on vous a interdit, c'est tout. + UTILISATION DE MINECRAFT + • Vous avez acheté Minecraft pour pouvoir l'utiliser personnellement sur votre système. + • Ci-dessous, nous vous donnons également d'autres droits limités, mais nous devons bien placer une limite sinon les gens iront trop loin. Si vous souhaitez faire quelque chose en rapport avec quoi que ce soit que nous ayons créé, nous sommes flattés, mais assurez-vous que cela ne puisse pas être interprété comme quelque chose d'officiel et que cela reste dans le cadre de ces Conditions, et surtout, ne vous servez pas de quoi que ce soit que nous ayons créé dans un but commercial. + • La permission que nous vous donnons d'utiliser et jouer à Minecraft peut être révoquée si vous enfreignez ces Conditions. + • Quand vous achetez Minecraft, nous vous donnons la permission de l'installer sur votre propre système PlayStation®Vita et de l'utiliser et d'y jouer sur ce système PlayStation®Vita comme indiqué dans les présentes Conditions. Cette permission vous est accordée à titre personnelle, alors vous n'avez pas l'autorisation de distribuer Minecraft (ou tout élément de celui-ci) à qui que ce soit (sauf permission expresse de notre part, bien sûr). + • Dans les limites du raisonnable, vous êtes libre de faire ce que vous voulez avec des captures d'écran ou des vidéos de Minecraft. Par "dans les limites du raisonnable", nous voulons dire que vous ne pouvez pas les utiliser dans un but commercial, ni en faire un usage abusif ou qui aurait un effet négatif sur nos droits. De plus, ne plagiez pas de contenu artistique pour le faire circuler, ce n'est pas drôle. + • Pour simplifier, la règle essentielle est de ne pas se servir de quoi que ce soit que nous ayons fait dans un but commercial, sauf avec un accord explicite de notre part, que ce soit dans nos "Brand and Assets Usage Guidelines" ou dans les présentes Conditions. Oh, et si la loi le permet de façon explicite, dans le cadre de l'"utilisation équitable" par exemple, alors pas de problème, mais seulement dans la mesure autorisée par la loi. + PROPRIÉTÉ DE MINECRAFT ET AUTRES + • Même si nous vous donnons la permission de jouer à Minecraft, nous en restons propriétaires. Nous sommes aussi propriétaires de nos marques et de tout contenu compris dans Minecraft, c'est-à-dire notre logiciel, nos textures, nos éléments, nos outils, notre infrastructures et tout un tas d'autres choses brillantes (ou moins brillantes) qui nous appartiennent. Tous nos droits sur ces éléments sont revendiqués et réservés, mais vous pouvez les utiliser conformément à ces Conditions. + • Cela ne veut pas dire que nous sommes propriétaires de ce que vous créez en utilisant Minecraft. Il vous suffit d'accepter que nous possédions chaque élément de Minecraft, et Minecraft en tant que produit et service, et ce qui était mentionné au point précédent ; et nous détenons aussi le droit d'auteur et les autres droits de propriété intellectuelle associés à ces éléments et aux noms et marques liés à Minecraft. + • Vous, bien sûr, vous allez réaliser vos propres créations dans et à l'aide de Minecraft. Nous ne possédons pas vos créations originales et nous ne revendiquons aucune propriété sur quoi que ce soit qui ne nous revient pas. Cependant, nous posséderons des choses qui sont des copies (ou des copies en grande partie) ou des dérivés de nos propriétés et créations (voir ci-dessus), mais si vous créez des œuvres originales, elles ne nous appartiennent pas. Prenons un exemple : + - un bloc : c'est à nous ; + - une cathédrale gothique avec des montagnes russes qui passent au travers : ce n'est pas à nous. + • Donc, quand vous payez pour utiliser Minecraft, vous n'achetez que la permission d'utiliser le produit Minecraft conformément à ces Conditions. Les seules permissions dont vous disposez en ce qui concerne Minecraft sont celles dont il est question dans ces Conditions. + CONTENU + • Si vous publiez du contenu sur ou par le biais de Minecraft, vous devez nous donner la permission d'utiliser, copier, modifier et adapter ce contenu. Cette permission doit être irrévocable et illimitée. Vous devez aussi nous laisser permettre à d'autres gens d'utiliser votre contenu et vous devez laisser les autres gens à qui vous permettez d'y accéder (comme les participants de vos parties multijoueur) l'utiliser. + • Merci de bien réfléchir avant de publier du contenu, puisqu'il pourra être rendu public et utilisé par d'autres gens d'une façon que vous pouvez ne pas apprécier. + • Si vous voulez publier quelque chose sur ou par le biais de Minecraft, ce ne doit pas être offensant ni illégal, ce doit être honnête, et ce doit être votre propre création. Le genre de choses que vous ne devez pas publier à l'aide de Minecraft comprend : les publications comprenant un langage raciste ou homophobe ; les publications considérées comme harcèlement ou trolling ; les publications pouvant nuire à notre réputation ou à celle d'autrui ; les publications comprenant de la pornographie, de la publicité ou une création ou image appartenant à autrui ; ou les publications usurpant l'identité d'un modérateur ou essayant de piéger ou d'exploiter les gens. + • Tout contenu que vous publiez sur Minecraft doit également être votre création. Vous ne devez publier aucun contenu à l'aide de Minecraft qui enfreindrait les droits de quelqu'un d'autre. Si vous publiez du contenu sur Minecraft et que nous recevons des réclamations, menaces ou poursuites parce que ce contenu enfreint les droits d'une autre personne, nous pouvons vous en tenir responsable. Cela signifie que vous pouvez avoir à nous rembourser pour tous les dommages que nous subirions en conséquence. Il est donc très important que vous ne publiiez que du contenu que vous avez créé et que vous vous absteniez en ce qui concerne le contenu créé par les autres. + • Faites attention aux personnes avec qui vous jouez. Il est difficile pour vous comme pour nous de savoir avec certitude si ce que les gens disent est vrai, ou même si les gens sont vraiment qui ils prétendent être. Vous ne devriez donner aucune information sur vous par le biais de Minecraft. + Si vous comptez publier du contenu ("votre Contenu") à l'aide de Minecraft, il doit : + - respecter toutes les règles de Sony Computer Entertainment, y compris les Conditions d'Utilisation de "PSN" et toutes les autres directives que vous devez accepter afin d'utiliser votre système PlayStation®Vita et "PSN" ; + - ne pas être offensant ; + - ne pas être illégal ou illicite ; + - être honnête et ne pas induire en erreur, piéger ou exploiter qui que ce soit, ni usurper l'identité d'autrui ; + - ne pas enfreindre les droits d'auteur ou autres de qui que ce soit ; + - ne pas être raciste, sexiste ou homophobe ; + - ne pas constituer du harcèlement ou du trolling ; + - ne pas nuire à notre réputation ni à celle de quelqu'un d'autre ; + - ne pas comprendre de pornographie ; + - ne pas comprendre de publicité. + - Vous ne devez publier aucun contenu à l'aide de Minecraft qui enfreindrait les droits de quelqu'un d'autre. + • Vous êtes responsable de tout votre Contenu que vous publiez à l'aide de Minecraft. + • En publiant votre Contenu, vous déclarez et garantissez que vous en avez le droit conformément aux présentes Conditions et que nous avons le droit d'exercer les droits que vous nous avez accordés par les présentes Conditions. + • Si nous recevons des réclamations ou des menaces ou que nous sommes poursuivis à cause de contenu que vous avez publié à l'aide de Minecraft ou qui a été publié par qui que ce soit sur ou par le biais de Minecraft, ce contenu peut être supprimé, vous pouvez être tenu pour responsable et vous pouvez devoir nous rembourser tout dommage que nous aurions subi en conséquence. Votre accès à certains aspects de Minecraft peut également être annulé ou suspendu. + CONTENU UTILISATEUR + Ce qui suit établit quelques règles concernant à la fois votre Contenu et le contenu publié par d'autres (regroupés sous le terme "Contenu Utilisateur"). Minecraft est un service de divertissement, et de ce fait nous (et nos détenteurs de licence comme Sony Computer Entertainment) participons à la transmission, la distribution, le stockage et la récupération de Contenu Utilisateur sans examen, sélection ou altération du contenu. Cela signifie que nous n'examinons pas le Contenu Utilisateur et donc, nous ne savons pas ce que vous et les autres faites circuler. Nous avons établi des règles dans les présentes Conditions pour que vous et les autres utilisateurs vous y conformiez, mais nous ne pouvons pas être au courant de tout ce qui se passe. + Veuillez donc noter que : + • les opinions exprimées dans le Contenu Utilisateur sont celles de leurs auteurs ou créateurs et non les nôtres ou celles de quiconque en rapport avec nous, sauf précision contraire de notre part ; + • nous ne sommes pas responsables de (et ne faisons aucune déclaration ou garantie concernant, et rejetons toute responsabilité pour) tout le Contenu Utilisateur, y compris tous les commentaires, opinions ou remarques qui y sont exprimées ; + • en utilisant Minecraft, vous reconnaissez que nous n'avons aucune responsabilité d'examen du Contenu Utilisateur et que tout le Contenu Utilisateur est publié en partant du principe que nous n'avons pas à le contrôler ni le juger, et que de fait, nous ne le contrôlons et ne le jugeons pas. + CEPENDANT nous (ou nos détenteurs de licence comme Sony Computer Entertainment) pouvons supprimer, rejeter ou suspendre l'accès à tout Contenu Utilisateur et vous retirer ou suspendre l'autorisation de publier, soumettre ou accéder au Contenu Utilisateur, ce qui peut comprendre la suppression ou suspension de l'accès à Minecraft ou à "PSN" si nous estimons cette mesure adéquate, par exemple parce que vous avez enfreint ces Conditions ou que nous avons reçu une plainte. Nous prendrons également des mesures expéditives pour supprimer ou désactiver l'accès au Contenu Utilisateur si et quand nous apprenons qu'il est illicite. + MISES À NIVEAU + • Nous pouvons publier des mises à niveau et mises à jour de temps à autre, mais ce n'est pas une obligation. Nous n'avons pas non plus l'obligation de fournir une assistance ou une maintenance continue pour nos jeux. Bien sûr, nous espérons continuer à sortir de nouvelles mises à jour pour Minecraft, mais nous ne pouvons pas garantir que ce sera le cas. + NOS RESPONSABILITÉS + • Quand vous obtenez un exemplaire de Minecraft, nous le fournissons "tel quel". Les mises à jour et mises à niveau sont également fournies "telles quelles". Cela signifie que nous ne vous faisons aucune promesse en ce qui concerne le niveau de qualité de Minecraft ou du fait qu'il sera ininterrompu ou ne comportera aucune erreur, ni en ce qui concerne toute perte ou dommage qui pourraient en résulter. Nous promettons seulement de fournir Minecraft et les services liés avec un savoir-faire et un soin raisonnables. Les lois de la plupart des pays disent que nous ne pouvons pas nous désister de nos responsabilités en cas de décès ou de blessure provoqués par notre négligence, donc, si votre ordinateur se lève et vous poignarde à cause d'une erreur de notre part, nous en acceptons la responsabilité. + NOUS NE SOMMES PAS RESPONSABLES DE : + • TOUTE UTILISATION OU MAUVAISE UTILISATION DE MINECRAFT PAR VOUS OU TOUTE AUTRE PERSONNE ; + • TOUT CONTENU QUE VOUS PUBLIEZ À L'AIDE DE MINECRAFT ; + • TOUTE INFRACTION À CES CONDITIONS DE VOTRE PART ; + • TOUTE INFRACTION À DES CONDITIONS PAR QUI QUE CE SOIT. + RÉSILIATION + • Si nous le souhaitons, nous pouvons résilier votre droit d'utiliser Minecraft si vous enfreignez ces Conditions. Vous pouvez également le résilier à tout moment. Il vous suffit de désinstaller Minecraft de votre système PlayStation®Vita. Dans tous les cas, les paragraphes "Propriété de Minecraft", "Nos responsabilités" et "Généralités" continueront à s'appliquer même après résiliation. + GÉNÉRALITÉS + • Ces Conditions sont soumises à tous les droits légaux dont vous disposez. Aucun élément de ces Conditions ne saurait limiter vos droits qui ne sont pas exclus par la loi, pas plus qu'ils n'excluent ou ne limitent notre responsabilité en cas de décès ou de blessure provoqués par notre négligence ou toute déclaration frauduleuse. + • Nous pouvons également modifier ces Conditions de temps à autre, mais ces changements ne s'appliqueront que dans la mesure où la loi le permet. Par exemple, si vous n'utilisez Minecraft qu'en mode solo et n'utilisez pas les mises à jour que nous publions, alors l'ancien CLUF s'applique, mais si vous utilisez les mises à jour ou les fonctionnalités de Minecraft qui s'appuient sur le fait que nous fournissons des services en ligne en continu, alors le nouveau CLUF s'appliquera. Dans ce cas, nous ne pourrons peut-être pas/n'aurons pas besoin de vous prévenir des changements pour qu'ils s'appliquent, alors vous devriez revenir ici de temps en temps pour vous tenir au courant des modifications éventuelles de ces Conditions. Nous n'allons pas être déloyaux à ce propos, mais parfois la loi change ou quelqu'un fait quelque chose qui affecte les autres utilisateurs de Minecraft, et il faut bien qu'on prenne des mesures. + • Si vous nous proposez une suggestion à propos de Minecraft ou d'un autre de nos jeux, cette suggestion est à titre gracieux. Cela signifie que nous pouvons nous servir de votre suggestion de toutes les façons que nous voulons, et nous n'avons pas à vous payer pour ça. Si vous pensez que nous serions prêts à payer pour votre suggestion, vous devez nous dire que vous attendez une rétribution avant de nous confier votre suggestion. + • En plus de ces Conditions, vous trouverez en ligne nos Brand and Assets Usage Guidelines. + • Si vous enfreignez ces règles nous (ou Sony Computer Entertainment) pouvons vous interdire d'utiliser Minecraft. Si vous ne voulez pas ou ne pouvez pas accepter ces règles, vous ne devez pas acheter, télécharger, utiliser ou jouer à Minecraft. + S'il y a un aspect légal qui vous préoccupe et dont il n'est pas fait mention sur cette page, posez-nous la question avant d'agir. En fait, ne soyez pas ridicule et nous ne le serons pas non plus. + Nous sommes : + Mojang AB + Maria Skolgata 83, + SE-11853 + Stockholm + Suède + Numéro d'organisation : 556819-2388 + + + + Tout contenu acheté dans une boutique en jeu le sera auprès de Sony Network Entertainment Europe Limited ("SNEE") et sera soumis aux Conditions d'utilisation de Sony Entertainment Network, disponibles sur PlayStation®Store. Veuillez consulter les droits d'utilisation pour chaque achat car ils peuvent être différents d'un article à l'autre. Sauf mention contraire, le contenu disponible dans une boutique en jeu a la même catégorie d'âge que le jeu. + + + + L'achat et l'utilisation d'articles sont soumis aux Conditions d'utilisation de "PSN". Ce service en ligne vous est concédé en sous-licence par Sony Computer Entertainment America. + + + + + Rappel : l'utilisation de ce logiciel est soumise aux conditions d'utilisation du logiciel accessibles sur la page http://fr.playstation.com/legal/. + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/fr-FR/stringsDynafont.xml b/Minecraft.Client/PSVitaMedia/loc/fr-FR/stringsDynafont.xml new file mode 100644 index 00000000..dca31ec2 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/fr-FR/stringsDynafont.xml @@ -0,0 +1,7 @@ + + + + DynaFont developed by DynaComware. + + + \ 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 new file mode 100644 index 00000000..4eb28f8a --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/fr-FR/stringsGeneric.xml @@ -0,0 +1,6668 @@ + + + + Passage en mode hors ligne + + + Veuillez patienter pendant que l'hôte sauvegarde la partie + + + Entrée dans l'ENDER + + + Sauvegarde des joueurs + + + Connexion à l'hôte + + + Téléchargement du terrain + + + Sortie de l'ENDER + + + 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. + + + 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. + + + Chargement du niveau + + + Finalisation... + + + Aménagement du terrain + + + Brève simulation du monde + + + Rang + + + Sauvegarde du niveau en préparation + + + Préparation des tronçons... + + + Initialisation du serveur + + + Sortie du Nether + + + Réapparition + + + Génération du niveau + + + Génération de la zone d'apparition + + + Chargement de la zone d'apparition + + + Entrée dans le Nether + + + Outils et armes + + + Gamma + + + Sensibilité jeu + + + Sensibilité interface + + + Difficulté + + + Musique + + + Son + + + Pacifique + + + 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. + + + Facile + + + Normal + + + Difficile + + + Déconnexion + + + Armures + + + Mécanismes + + + Transports + + + Armes + + + Nourriture + + + Structures + + + Décorations + + + Alchimie + + + Outils, armes et armures + + + Matériaux + + + Construction de blocs + + + Redstone et transport + + + Divers + + + Entrées : + + + 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 ! + + + 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 + + + Créer un monde + + + Saisir le nom de votre monde + + + Saisir une graine pour la génération de votre monde + + + Charger monde sauvegardé + + + Lancer le didacticiel + + + Didacticiel + + + Nommer votre monde + + + Sauv. endommagée + + + OK + + + Annuler + + + Magasin Minecraft + + + Faire pivoter + + + Masquer + + + Vider tous les emplacements + + + Voulez-vous vraiment quitter la partie en cours et rejoindre la nouvelle ? Toute progression non sauvegardée sera perdue. + + + Voulez-vous vraiment supprimer toute sauvegarde préalable pour ce monde et la remplacer par la version actuelle de ce monde ? + + + Voulez-vous vraiment quitter sans sauvegarder ? Vous perdrez toute progression dans ce monde ! + + + Commencer la partie + + + Quitter le jeu + + + Sauvegarder la partie + + + Quitter sans sauvegarder + + + START pour rejoindre + + + Hourra, vous avez reçu une image de joueur représentant Steve de Minecraft ! + + + Hourra, vous avez reçu une image de joueur représentant un creeper ! + + + Déverrouiller le jeu complet + + + Vous ne pouvez pas rejoindre cette partie car le joueur avec qui vous essayez de jouer utilise une version supérieure du jeu. + + + Nouveau monde + + + Récompense déverrouillée ! + + + Vous jouez à la version d'évaluation. Vous devrez vous procurer le jeu complet pour sauvegarder votre partie. +Déverrouiller le jeu complet ? + + + Amis + + + Mon score + + + Général + + + Veuillez patienter + + + Aucun résultat + + + Filtre : + + + Vous ne pouvez pas rejoindre cette partie car le joueur avec qui vous essayez de jouer utilise une version antérieure du jeu. + + + Connexion perdue + + + La connexion au serveur a été interrompue. Retour au menu principal. + + + Déconnexion par le serveur + + + Quitter la partie + + + Une erreur s'est produite. Retour au menu principal. + + + Échec de la connexion + + + Vous avez été exclu de la partie + + + L'hôte a quitté la partie. + + + Vous ne pouvez pas rejoindre cette partie, car vous n'êtes l'ami d'aucun des joueurs présents. + + + Vous ne pouvez pas rejoindre cette partie car l'hôte vous en a déjà exclu. + + + Vous avez été exclu de la partie. Motif : vol. + + + Expiration du délai de connexion + + + Le serveur est au complet. + + + Dans ce mode, des ennemis apparaissent dans l'environnement et infligent des dégâts considérables. Méfiez-vous des creepers : même si vous prenez vos distances, ils ne renonceront pas à vous attaquer ! + + + Thèmes + + + Packs de skins + + + Autoriser les amis d'amis + + + Exclure joueur + + + Voulez-vous vraiment exclure ce joueur de la partie ? Il ne pourra plus rejoindre la partie jusqu'au redémarrage du monde. + + + Packs d'images de joueur + + + Vous ne pouvez pas rejoindre cette partie : elle est réservée aux seuls amis de l'hôte. + + + Contenu téléchargeable corrompu + + + Ce contenu téléchargeable est endommagé et inutilisable. Supprimez-le puis réinstallez-le depuis le menu Magasin Minecraft. + + + Votre contenu téléchargeable est partiellement endommagé et inutilisable. Supprimez-le puis réinstallez-le depuis le menu Magasin Minecraft. + + + Impossible de rejoindre la partie + + + Sélectionnée + + + Skin sélectionnée : + + + Obtenir la version complète + + + Débloquer le pack de textures + + + Pour utiliser ce pack de textures dans votre monde, vous devez le débloquer. +Le débloquer maintenant ? + + + Pack de textures d'essai + + + Graine + + + Déverrouiller pack de skins + + + Pour utiliser la skin que vous avez sélectionnée, vous devez d'abord déverrouiller le pack correspondant. +Déverrouiller ce pack de skins ? + + + Vous utilisez une version d'essai du pack de textures. Vous ne pourrez pas sauvegarder ce monde si vous ne déverrouillez pas la version complète. +Déverrouiller la version complète du pack de textures ? + + + Télécharger la version complète + + + Ce monde utilise un pack mash-up ou de textures que vous ne possédez pas. +Voulez-vous installer le pack mash-up ou le pack de textures maintenant ? + + + Obtenir la version d'essai + + + Pack de textures introuvable + + + Déverrouiller la version complète + + + Télécharger la version d'essai + + + Votre mode de jeu a été modifié + + + Lorsque cette option est activée, seuls les joueurs invités peuvent participer. + + + Lorsque cette option est activée, les amis des personnes présentes sur votre liste d'amis peuvent rejoindre la partie. + + + Lorsque cette option est activée, les joueurs peuvent infliger des dégâts aux autres joueurs. Ne s'applique qu'au mode Survie. + + + Normal + + + Superplat + + + Lorsque cette option est activée, la partie est un jeu en ligne. + + + Lorsque cette option est désactivée, les joueurs qui rejoignent la partie ne peuvent ni construire ni miner sans autorisation. + + + Lorsque cette option est activée, les structures comme les villages et les forts apparaîtront dans le monde. + + + Lorsque cette option est activée, un monde complètement plat apparaîtra à la Surface et dans le Nether. + + + Lorsque cette option est activée, un coffre renfermant des objets utiles sera créé à proximité du point d'apparition du joueur. + + + Lorsque cette option est activée, le feu peut se propager aux blocs voisins inflammables. + + + Lorsque cette option est activée, le TNT peut exploser lorsqu'il est activé. + + + Si vous l'activez, le Nether sera régénéré. Très utile si vous avez une ancienne sauvegarde où les forteresses du Nether ne sont pas présentes. + + + Non + + + Mode de jeu : Créatif + + + Survie + + + Créatif + + + Renommer votre monde + + + Saisir le nouveau nom de votre monde + + + Mode de jeu : Survie + + + Créé en mode Survie + + + Renommer sauvegarde + + + Sauvegarde auto. dans %d... + + + Oui + + + Créé en mode Créatif + + + Afficher les nuages + + + Que voulez-vous faire de cette sauvegarde ? + + + Taille interface (écran part.) + + + Ingrédient + + + Combustible + + + Distributeur + + + Coffre + + + Enchantement + + + Four + + + Aucun contenu téléchargeable de ce type n'est actuellement disponible pour ce jeu. + + + Voulez-vous vraiment supprimer cette sauvegarde ? + + + Attente d'accord + + + Censuré + + + %s a rejoint la partie. + + + %s a quitté la partie. + + + %s s'est fait exclure de la partie. + + + Alambic + + + Saisir un message sur le panneau + + + Saisir une ligne de texte à inscrire sur votre panneau + + + Saisir un titre + + + Expiration de la version d'évaluation + + + Partie au complet + + + Impossible de rejoindre la partie : aucune place vacante + + + Saisir le titre de votre message + + + Saisir la description de votre message + + + Inventaire + + + Ingrédients + + + Saisir un sous-titre + + + Saisir le sous-titre de votre message + + + Saisir une description + + + En cours de lecture : + + + Voulez-vous vraiment ajouter ce niveau à votre liste de niveaux exclus ? +Si vous sélectionnez OK, vous quitterez cette partie. + + + Retirer de la liste d'exclusion + + + Sauvegarde auto + + + Niveau exclu + + + La partie que vous tentez de rejoindre figure dans votre liste de niveaux exclus. +Si vous choisissez de rejoindre cette partie, le niveau sera retiré de votre liste de niveaux exclus. + + + Exclure ce niveau ? + + + Sauvegarde auto : NON + + + Opacité interface + + + Préparation de sauvegarde auto du niveau + + + Taille interface + + + min + + + Placement impossible à cet endroit ! + + + Pour éviter la mort instantanée dès l'apparition des joueurs, il n'est pas autorisé de placer de la lave aussi près du point d'apparition du niveau. + + + Skins préférées + + + Jeu de %s + + + Partie d'un hôte inconnu + + + Invité déconnecté + + + Réinitialiser paramètres + + + Voulez-vous vraiment rétablir les paramètres par défaut ? + + + Échec du chargement + + + Un joueur invité s'est déconnecté : tous les joueurs invités ont été exclus de la partie. + + + Impossible de créer la partie + + + Sélection auto + + + Non pack : skins stand. + + + Se connecter + + + Vous n'êtes pas connecté. Pour jouer, vous devez d'abord vous connecter. Vous connecter ? + + + Multijoueur non autorisé + + + Boire + + + Une ferme a été aménagée dans cette zone. La culture vous permet de créer une source renouvelable de nourriture et d'autres objets. + + + {*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur la culture.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si vous n'avez plus rien à apprendre sur la question. + + + Le blé, les citrouilles et les pastèques sont créés à partir de graines. Exploitez des herbes hautes ou moissonnez du blé pour recueillir des graines de blé. Les graines de citrouille et de pastèque s'obtiennent respectivement sur les citrouilles et les pastèques. + + + Appuyez sur{*CONTROLLER_ACTION_CRAFTING*} pour ouvrir l'interface d'inventaire du mode Créatif. + + + Rejoignez l'autre extrémité de ce trou pour continuer. + + + Vous êtes arrivé à la fin du didacticiel du mode Créatif. + + + Avant de planter les graines, les blocs de terre doivent être transformés en terre labourée à l'aide d'une houe. Une source d'eau voisine permettra d'irriguer la terre labourée. Les cultures pousseront d'autant plus vite si elles sont abondamment irriguées et exposées à la lumière. + + + Les cactus doivent être plantés dans le sable et pousseront jusqu'à atteindre trois blocs de hauteur. Tout comme pour le sucre de canne, détruire le bloc inférieur vous permettra de récolter les blocs qui lui sont superposés.{*ICON*}81{*/ICON*} + + + Les champignons doivent être plantés dans des zones faiblement éclairées et se propageront aux blocs adjacents peu exposés à la lumière.{*ICON*}39{*/ICON*} + + + Vous pouvez utiliser de la poudre d'os pour accélérer l'arrivée à maturité de vos cultures ou pour transformer vos champignons en champignons géants.{*ICON*}351:15{*/ICON*} + + + Le blé passe par plusieurs stades de croissance. Il est prêt pour la moisson lorsque son aspect s'assombrit.{*ICON*}59:7{*/ICON*} + + + Les citrouilles et les pastèques nécessitent de laisser vacant un bloc adjacent pour accueillir le fruit une fois le plant arrivé à maturité. + + + La canne à sucre doit être plantée dans un bloc d'herbe, de terre ou de sable adjacent à un bloc d'eau. Détruire un bloc de canne à sucre vous permet de récolter tous les blocs qui lui sont superposés.{*ICON*}83{*/ICON*} + + + En mode Créatif, vous disposez d'un nombre infini d'objets et de blocs, vous pouvez détruire des blocs d'un seul clic sans utiliser d'outil, vous êtes invulnérable et vous pouvez voler. + + + Le coffre de cette zone renferme les composants nécessaires à la fabrication de circuits avec pistons. Essayez d'utiliser ou de développer les circuits de cette zone, ou bien d'assembler votre propre circuit. Vous trouverez d'autres exemples de ces circuits en dehors de la zone didacticielle. + + + Un portail vers le Nether se trouve dans cette zone ! + + + {*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur les portails et le Nether.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si vous savez déjà tout ce qu'il y a à savoir sur les portails et le Nether. + + + Pour obtenir de la poudre de redstone, creusez du minerai de redstone avec une pioche en fer, en diamant ou en or. Elle permet de conduire le courant sur une longueur maximale de 15 blocs et sur une hauteur d'1 bloc. + {*ICON*}331{*/ICON*} + + + Les répéteurs de redstone permettent de prolonger la distance de conduction du courant ou de retarder les signaux de redstone. + {*ICON*}356{*/ICON*} + + + Une fois alimenté, le piston s'allonge et pousse jusqu'à 12 blocs. Lorsqu'il se rétracte, le piston collant tire avec lui un bloc (tous types de blocs, ou presque). + {*ICON*}33{*/ICON*} + + + 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*} +Un four vous permet de fondre des objets pour les modifier. Par exemple, vous pouvez y déposer du minerai de fer pour fondre des lingots de fer.{*B*}{*B*} +Placez le four dans votre environnement et appuyez sur{*CONTROLLER_ACTION_USE*} pour l'utiliser.{*B*}{*B*} +Vous devrez alimenter le four en plaçant du combustible en bas et déposer l'objet à fondre en haut. Le four s'actionnera alors.{*B*}{*B*} +Une fois les objets fondus, vous pouvez les déplacer depuis la zone de production jusqu'à votre inventaire.{*B*}{*B*} +Si l'objet pointé est un ingrédient ou du combustible pour le four, une infobulle s'affichera pour transférer l'objet dans le four. + + + {*T3*}COMMENT JOUER : DISTRIBUTEUR{*ETW*}{*B*}{*B*} +Un distributeur sert à... distribuer des objets. Pour l'actionner, vous devrez placer un interrupteur ou un levier à proximité.{*B*}{*B*} +Pour remplir d'objets le distributeur, appuyez sur{*CONTROLLER_ACTION_USE*}, puis placez-y les articles de votre inventaire que vous souhaitez distribuer.{*B*}{*B*} +Le distributeur crachera un objet dès que vous actionnerez l'interrupteur associé. + + + {*T3*}COMMENT JOUER : ALCHIMIE{*ETW*}{*B*}{*B*} +La concoction de potions nécessite un alambic, à construire sur un établi. Toutes les potions ont pour base une fiole d'eau, qu'on obtient en remplissant une fiole avec de l'eau tirée d'un chaudron ou d'une source d'eau.{*B*} +Un alambic peut accueillir jusqu'à trois fioles ; vous pouvez donc distiller jusqu'à trois potions à la fois. Un même ingrédient peut servir aux trois fioles. Pensez à toujours distiller trois potions à la fois pour optimiser vos ressources.{*B*} +En plaçant un ingrédient de potion dans l'emplacement du haut de l'alambic, vous obtiendrez une potion de base au bout de quelques instants. Celle-ci n'a aucun effet, mais si vous distillez un autre ingrédient avec cette fiole de base, vous produirez une potion avec un principe actif.{*B*} +Ajoutez alors un troisième ingrédient pour allonger la durée d'effet de la potion (poudre de redstone), renforcer son intensité (poudre de glowstone) ou bien en faire une potion offensive (oeil d'araignée fermenté).{*B*} +Vous pouvez aussi y incorporer de la poudre à canon pour en faire une potion volatile à lancer. Une fois lancées, les potions volatiles appliquent leurs effets à la zone d'impact.{*B*} + +Les matières premières pour les potions sont :{*B*}{*B*} +* {*T2*}Verrue du Nether{*ETW*}{*B*} +* {*T2*}Oeil d'araignée{*ETW*}{*B*} +* {*T2*}Sucre{*ETW*}{*B*} +* {*T2*}Larme de Ghast{*ETW*}{*B*} +* {*T2*}Poudre de feu{*ETW*}{*B*} +* {*T2*}Crème de magma{*ETW*}{*B*} +* {*T2*}Pastèque scintillante{*ETW*}{*B*} +* {*T2*}Poudre de redstone{*ETW*}{*B*} +* {*T2*}Poudre de glowstone{*ETW*}{*B*} +* {*T2*}Oeil d'araignée fermenté{*ETW*}{*B*}{*B*} + +Vous devrez essayer diverses combinaisons d'ingrédients pour découvrir toutes les recettes de potions à concocter. + + + {*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*} +Les points d'expérience obtenus à la mort d'un monstre, ou lorsque certains blocs sont minés ou fondus dans un four, peuvent servir à enchanter des outils, des armes, des armures et des livres.{*B*} +Lorsqu'une épée, une hache, une pioche, une pelle, une armure ou un livre est placé dans l'emplacement situé sous le livre de la table d'enchantement, les trois boutons à sa droite affichent certains enchantements ainsi que leur coût en niveaux d'expérience.{*B*} +Si vous n'avez pas assez de niveaux d'expérience pour utiliser certains d'entre eux, le coût apparaîtra en rouge ; sinon, en vert.{*B*}{*B*} +L'enchantement appliqué par défaut est choisi aléatoirement d'après le coût affiché.{*B*}{*B*} +Si la table d'enchantement est entourée de bibliothèques (jusqu'à 15) avec un intervalle d'un bloc entre la table et la bibliothèque, la puissance des enchantements sera renforcée et des glyphes arcaniques apparaîtront, projetés par le livre sur la table d'enchantement.{*B*}{*B*} +Tous les ingrédients nécessaires à une table d'enchantement peuvent se trouver dans les villages, ou bien en minant et en cultivant.{*B*}{*B*} +Les livres enchantés s'utilisent avec l'enclume pour appliquer des enchantements à des objets. Vous avez ainsi plus de contrôle sur les enchantements obtenus.{*B*} + + + {*T3*}COMMENT JOUER : EXCLUSION DE NIVEAUX{*ETW*}{*B*}{*B*} +Si vous découvrez du contenu inapproprié dans un niveau auquel vous jouez, vous pouvez choisir de l'ajouter à votre liste de niveaux exclus. +Pour ce faire, affichez le menu Pause puis appuyez sur{*CONTROLLER_VK_RB*} pour sélectionner l'option d'exclusion de niveaux. +Si vous tentez de rejoindre ce niveau à l'avenir, un message vous indiquera qu'il figure dans votre liste de niveaux exclus. Vous pourrez alors décider de le supprimer de la liste et d'y accéder ou bien d'annuler. + + + {*T3*}COMMENT JOUER : OPTIONS DU JOUEUR ET DE L'HÔTE{*ETW*}{*B*}{*B*} + +{*T1*}Options du joueur{*ETW*}{*B*} +Lorsque vous chargez ou créez un monde, appuyez sur le bouton "Plus d'options" pour accéder à un menu où figurent d'autres paramètres de configuration de la partie.{*B*}{*B*} + + {*T2*}Joueur contre joueur{*ETW*}{*B*} +Lorsque cette option est activée, les joueurs peuvent infliger des dégâts aux autres joueurs. Ne s'applique qu'au mode Survie.{*B*}{*B*} + + {*T2*}Joueurs de confiance{*ETW*}{*B*} + Lorsque cette option est désactivée, les joueurs sont limités dans leurs activités. Ils ne peuvent pas miner ou utiliser des objets, placer des blocs ou des interrupteurs, utiliser des conteneurs, attaquer des joueurs ou des animaux. Vous pouvez modifier les options applicables à un joueur donné depuis le menu de jeu.{*B*}{*B*} + + {*T2*}Propagation du feu{*ETW*}{*B*} + Lorsque cette option est activée, le feu peut se propager aux blocs voisins inflammables. Vous pouvez aussi modifier cette option depuis le menu de jeu.{*B*}{*B*} + + {*T2*}Explosion de TNT{*ETW*}{*B*} + Lorsque cette option est activée, le TNT peut exploser. Vous pouvez aussi modifier cette option dans le jeu.{*B*}{*B*} + + {*T2*}Privilèges d'hôte{*ETW*}{*B*} + Lorsque cette option est activée, l'hôte peut activer/désactiver sa capacité à voler, désactiver la fatigue et se rendre invisible depuis le menu de jeu. {*DISABLES_ACHIEVEMENTS*}{*B*}{*B*} + +{*T1*}Options de création de monde{*ETW*}{*B*} +Lorsque vous créez un monde, vous disposez d'options supplémentaires.{*B*}{*B*} + + {*T2*}Génération de structures{*ETW*}{*B*} + Lorsque cette option est activée, les structures comme les villages et les forts apparaîtront dans le monde.{*B*}{*B*} + + {*T2*}Monde superplat{*ETW*}{*B*} + Lorsque cette option est activée, un monde complètement plat apparaîtra à la Surface et dans le Nether.{*B*}{*B*} + + {*T2*}Coffre bonus{*ETW*}{*B*} + Lorsque cette option est activée, un coffre renfermant des objets utiles sera créé à proximité du point d'apparition du joueur.{*B*}{*B*} + + {*T2*}Réinitialiser le Nether{*ETW*}{*B*} + Si vous l'activez, le Nether sera régénéré. Très utile si vous avez une ancienne sauvegarde où les forteresses du Nether ne sont pas présentes.{*B*}{*B*} + + {*T1*}Options de jeu{*ETW*}{*B*} + Appuyez sur la {*BACK_BUTTON*} pour afficher le menu de jeu et accéder à diverses options.{*B*}{*B*} + + {*T2*}Options de l'hôte{*ETW*}{*B*} + Le joueur hôte et les joueurs au statut de modérateur peuvent accéder au menu "Options de l'hôte". Depuis ce menu, ils peuvent activer/désactiver la propagation du feu et l'explosion de TNT.{*B*}{*B*} + +{*T1*}Options du joueur{*ETW*}{*B*} +Pour modifier les privilèges d'un joueur, sélectionnez son nom et appuyez sur{*CONTROLLER_VK_A*} pour afficher le menu des privilèges et paramétrer les options suivantes.{*B*}{*B*} + + {*T2*}Construction et minage possibles{*ETW*}{*B*} + Uniquement disponible si l'option "Joueurs de confiance" est désactivée. Lorsque cette option est activée, le joueur peut interagir normalement avec le monde. Sinon, il ne pourra ni placer ni détruire des blocs, ni même interagir avec de nombreux objets et blocs.{*B*}{*B*} + + {*T2*}Utilisation de portes et leviers possible{*ETW*}{*B*} + Uniquement disponible quand l'option "Joueurs de confiance" est désactivée. Quand cette option est désactivée, le joueur ne pourra pas utiliser les portes ou les interrupteurs.{*B*}{*B*} + + {*T2*}Ouverture de conteneurs possible{*ETW*}{*B*} + Uniquement disponible quand l'option "Joueurs de confiance" est désactivée. Quand cette option est désactivée, le joueur ne pourra pas ouvrir les conteneurs, tels que les coffres.{*B*}{*B*} + + {*T2*}Attaque des joueurs possible{*ETW*}{*B*} + Uniquement disponible si l'option "Joueurs de confiance" est désactivée. Cette option désactivée, le joueur ne pourra pas infliger de dégâts aux autres joueurs.{*B*}{*B*} + + {*T2*}Attaque des animaux possible{*ETW*}{*B*} + Uniquement disponible quand l'option "Joueurs de confiance" est désactivée. Quand cette option est désactivée, le joueur ne pourra pas infliger de dégâts aux animaux.{*B*}{*B*} + + {*T2*}Modérateur{*ETW*}{*B*} + Lorsque cette option est activée, le joueur peut modifier les privilèges des autres joueurs (à l'exception de l'hôte). Si l'option "Joueurs de confiance" est désactivée, il peut exclure des joueurs et activer ou désactiver la propagation du feu et l'explosion de TNT.{*B*}{*B*} + + {*T2*}Exclure joueur{*ETW*}{*B*} + {*KICK_PLAYER_DESCRIPTION*}{*B*}{*B*} + +{*T1*}Options du joueur hôte{*ETW*}{*B*} +Si l'option "Privilèges d'hôte" est activée, le joueur hôte peut modifier certains de ses propres privilèges. Pour modifier les privilèges d'un joueur, sélectionnez son nom et appuyez sur{*CONTROLLER_VK_A*} pour afficher le menu des privilèges et paramétrer les options suivantes.{*B*}{*B*} + + {*T2*}Vol possible{*ETW*}{*B*} + Lorsque cette option est activée, le joueur peut voler. Cette option ne sert qu'en mode Survie, puisque tous les joueurs peuvent voler en mode Créatif.{*B*}{*B*} + + {*T2*}Fatigue désactivée{*ETW*}{*B*} + Cette option ne s'applique qu'au mode Survie. Lorsque cette option est activée, les activités physiques (marcher, courir, sauter, etc.) n'épuisent pas la jauge de nourriture. En revanche, si le joueur est blessé, sa jauge de nourriture se videra progressivement tandis qu'il se remet de ses blessures.{*B*}{*B*} + + {*T2*}Invisible{*ETW*}{*B*} + Lorsque cette option est activée, le joueur est dissimulé au regard des autres joueurs et est invulnérable.{*B*}{*B*} + + {*T2*}Peut téléporter{*ETW*}{*B*} + Cette option permet au joueur de se téléporter ou de téléporter d'autres joueurs partout dans le monde. + + + 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 + + + Commerce + + + Enclume + + + 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*} +Pour activer le portail de l'Ender, vous devrez placer un oeil d'Ender dans n'importe quel cadre de portail de l'Ender qui n'en contient pas.{*B*} +Quand le portail est actif, sautez dedans pour vous rendre dans l'Ender.{*B*}{*B*} +Dans l'Ender, vous rencontrerez le dragon de l'Ender, un ennemi féroce et puissant, et de nombreux Enderman. Vous devrez donc être préparé au combat avant de vous y rendre !{*B*}{*B*} +Vous découvrirez qu'il existe des cristaux d'Ender à l'extrémité de huit pics d'obsidienne que le dragon utilise pour se soigner. La première étape est donc de détruire chacun d'entre eux.{*B*} +Les premiers peuvent être atteints par des flèches, mais les derniers sont protégés par une cage d'acier : vous devrez monter jusqu'à eux à l'aide de blocs.{*B*}{*B*} +Ce faisant, le dragon de l'Ender vous attaquera en volant vers vous et en crachant des boules d'acide de l'Ender !{*B*} +Si vous vous approchez du podium de l'oeuf au centre des pics, le dragon volera vers vous pour vous attaquer, ce qui vous donnera une bonne occasion de le blesser !{*B*} +Évitez son souffle acide et visez ses yeux pour de meilleurs résultats. Si possible, demandez à des amis de vous suivre dans l'Ender pour vous aider dans votre combat !{*B*}{*B*} +Une fois que vous serez dans l'Ender, vos amis pourront voir l'emplacement du portail de l'Ender dans le fort sur leurs cartes, et ils pourront facilement vous rejoindre. + + + {*ETB*}Bienvenue ! Comme vous l'avez peut-être déjà remarqué, votre Minecraft vient d'être gratifié d'une nouvelle mise à jour.{*B*}{*B*} +Vos amis et vous pouvez découvrir de nombreuses nouvelles fonctionnalités. Jetez un oeil à l'aperçu qui suit et allez jouer !{*B*}{*B*} +{*T1*}Nouveaux objets{*ETB*} - Argile cuite, argile teinte, bloc de charbon, botte de foin, rail déclencheur, bloc de redstone, capteur de lumière, Dropper, entonnoir, chariot de mine avec entonnoir, chariot de mine avec TNT, comparateur de redstone, plaque de pression pondérée, balise, coffre piégé, fusée de feu d'artifice, étoile de feu d'artifice, étoile du Nether, laisse, armure pour cheval, étiquette, oeuf d'apparition de cheval.{*B*}{*B*} + {*T1*}Nouvelles entités{*ETB*} - Withers, Withers squelettes, sorcières, chauve-souris, chevaux, ânes et mules.{*B*}{*B*} +{*T1*}Nouvelles fonctionnalités{*ETB*} - Apprivoisez un cheval et montez-le, fabriquez des feux d'artifice pour un spectacle unique, donnez un nom aux animaux et aux monstres avec une étiquette, créez des circuits en redstone plus complexes que jamais, et profitez de nouvelles options d'hôte pour mieux contrôler ce que peuvent faire les joueurs invités dans votre monde !{*B*}{*B*} +{*T1*}Nouveau monde didacticiel{*ETB*} - Apprenez à utiliser ces nouvelles fonctionnalités (et les anciennes !) dans le monde didacticiel. Essayez de retrouver tous les disques secrets qui y sont cachés !{*B*}{*B*} + + + 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 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 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é. + + + 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 dans les circuits de redstone comme répéteur, retardateur et/ou diode. + + + 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 à 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. + + + Restitue 2,5{*ICON_SHANK_01*}. S'obtient en cuisant un poisson cru dans un four. + + + Restitue 1{*ICON_SHANK_01*}. + + + Restitue 1{*ICON_SHANK_01*}. + + + Restitue 3{*ICON_SHANK_01*}. + + + Sert de munitions pour les arcs. + + + Restitue 2,5{*ICON_SHANK_01*}. + + + Restitue 1{*ICON_SHANK_01*}. Peut s'utiliser jusqu'à 6 fois. + + + Restitue 1{*ICON_SHANK_01*} 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. + + + Confère au porteur une armure de 3. + + + 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. + + + Un lingot étincelant qui sert à la confection d'outils. Créé en fondant du minerai dans le four. + + + Permet de transformer les lingots, gemmes ou colorants en blocs aménageables. Peut servir de bloc de construction précieux ou d'entrepôt compact pour le minerai. + + + Sert à infliger une décharge électrique au joueur, animal ou monstre qui marche dessus. Les plaques de détection en bois se déclenchent également si vous laissez tomber un objet dessus. + + + 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 à contenir du ragoût de champignons. Vous conservez le bol une fois le ragoût avalé. + + + Sert à contenir et transporter eau, lave et lait. + + + Sert à contenir et transporter de l'eau. + + + 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. + + + Affiche la position du soleil et de la lune. + + + Indique la position de votre point de départ. + + + Tenue en main, la carte crée l'image d'une zone explorée. Peut servir à la détermination d'un itinéraire. + + + 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. + + + À 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. + + + 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 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 à la confection des torches, flèches, panneaux, échelles, barrières, ainsi que des poignées d'armes et manches d'outils. + + + 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. + + + 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. + + + Hache en fer + + + Lampe de redstone + + + Escalier en bois tropical + + + Escalier en bouleau + + + Commandes actuelles + + + Crâne + + + Cacao + + + Escalier en sapin + + + Oeuf de Dragon + + + Pierre blanche + + + Cadre de portail de l'Ender + + + Escalier en grès + + + Fougère + + + Arbuste + + + Config. + + + Artisanat + + + Utiliser + + + Action + + + Se faufiler/Voler Bas + + + Se faufiler + + + Lâcher + + + Changer d'objet + + + Pause + + + Regarder + + + Se déplacer/Courir + + + Inventaire + + + Sauter/Voler Haut + + + Sauter + + + Portail de l'Ender + + + Queue de citrouille + + + Pastèque + + + Vitre + + + Portillon + + + Lierre + + + Queue de pastèque + + + Barreaux de fer + + + Pierres craquelées + + + Pierres taillées moussues + + + Briques de pierre + + + Champignon + + + Champignon + + + Blocs de pierre taillée + + + Escalier en briques + + + Verrue du Nether + + + Escalier en Nether + + + Barrière en Nether + + + Chaudron + + + Alambic + + + Table d'enchantement + + + Brique du Nether + + + Pierre taillée de poisson d'argent + + + Pierre de poisson d'argent + + + Escalier (brique pierre) + + + Nénuphar + + + Mycélium + + + Brique en pierre de poisson d'argent + + + Changer mode caméra + + + 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. + + + À 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. + + + 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. + + + Le bois que vous avez recueilli peut être taillé en planches. Ouvrez l'interface d'artisanat pour en fabriquer.{*PlanksIcon*} + + + 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*} + + + 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. + + + Appuyez sur{*CONTROLLER_ACTION_CRAFTING*} pour ouvrir l'interface d'artisanat. + + + 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. + + + Utilisez{*CONTROLLER_ACTION_MOVE*} pour vous déplacer. + + + Utilisez{*CONTROLLER_ACTION_LOOK*} pour regarder vers le haut, vers le bas et autour de vous. + + + 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. + + + 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. + + + Appuyez sur{*CONTROLLER_ACTION_JUMP*} pour sauter. + + + 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*} + + + É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. + + + Ouvrir le conteneur + + + 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*} + + + Utilisez votre pioche pour miner des blocs de pierre. Une fois minés, les blocs de pierre produiront de la pierre taillée. Récupérez 8 blocs de pierre taillée et vous pourrez construire un four. Vous risquez d'avoir à déblayer la terre avant de pouvoir attaquer la pierre. Justement, la pelle est faite pour ça !{*StoneIcon*} + + + Vous 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. + + + Un refuge de mineur se trouve à proximité : finissez de l'aménager pour passer la nuit à l'abri. + + + 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*} + + + 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. + + + Utilisez{*CONTROLLER_ACTION_LEFT_SCROLL*} et{*CONTROLLER_ACTION_RIGHT_SCROLL*} pour sélectionner un autre objet à manier. + + + 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*} + + + 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*} + + + Pointez le réticule sur l'établi et appuyez sur{*CONTROLLER_ACTION_USE*} pour l'ouvrir. + + + 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 + + + Sapin + + + Bouleau + + + Bois d'épicéa + + + Bois de bouleau + + + Bois tropical + + + Laine + + + Laine rose + + + Laine grise + + + Laine gris clair + + + Laine bleu ciel + + + Laine jaune + + + Laine vert clair + + + Laine bleu cyan + + + Laine verte + + + Laine rouge + + + Laine noire + + + Laine violette + + + Laine bleue + + + Laine marron + + + Torche (charbon) + + + Glowstone + + + Sable des âmes + + + 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. + + + Trappe + + + Coffre verrouillé + + + Diode + + + Piston collant + + + Piston + + + Laine (toutes couleurs) + + + Arbuste mort + + + Gâteau + + + Bloc musical + + + Distributeur + + + Herbes hautes + + + Toile + + + Lit + + + Glace + + + Établi + + + Une façon plus compacte de stocker les diamants. + + + Bloc de diamant + + + Four + + + Terre labourée + + + Cultures + + + Minerai de diamant + + + Générateur de monstres + + + Feu + + + Torche (char. de bois) + + + Poudre de redstone + + + Coffre + + + Escalier en chêne + + + Panneau + + + Minerai de redstone + + + Porte en fer + + + Plaque de détection + + + Neige + + + Touche + + + Torche de redstone + + + Levier + + + Rail + + + Échelle + + + Porte en bois + + + Escalier en pierre + + + Rail de détection + + + 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. + + + Canne à pêche + + + Montre + + + Poudre glowstone + + + Chariot de mine avec four + + + Oeuf + + + Boussole + + + Poisson cru + + + Pétale de rose + + + Vert de cactus + + + Fèves de cacao + + + Poisson cuit + + + Poudre de colorant + + + Poche d'encre + + + Chariot avec coffre + + + Boule de neige + + + Bateau + + + Cuir + + + Chariot de mine + + + Selle + + + Redstone + + + Seau de lait + + + Papier + + + Livre + + + Boule de slime + + + Brique + + + Argile + + + Canne à sucre + + + Lapis-lazuli + + + Carte + + + Disque vinyle "13" + + + Disque vinyle "cat" + + + Lit + + + Répéteur de redstone + + + Cookie + + + 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. + + + 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*} + + + Gravier + + + 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. + + + {*B*} + Appuyez sur{*CONTROLLER_VK_X*} pour à nouveau afficher l'inventaire. + + + {*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour continuer.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si vous savez déjà utiliser l'inventaire. + + + 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 le didacticiel.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si vous pensez pouvoir vous en passer. + + + Si vous déplacez le pointeur à l'extérieur de l'interface alors qu'un objet lui est annexé, vous jetterez l'objet. + + + 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. + + + 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é. + + + Vous avez terminé la première partie du didacticiel. + + + 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 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. + + + Utilisez{*CONTROLLER_ACTION_USE*} pour placer le four dans l'environnement, puis ouvrez-le. + + + 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*} + + + Utilisez{*CONTROLLER_ACTION_USE*} pour placer la porte et{*CONTROLLER_ACTION_USE*} pour l'ouvrir et la fermer. + + + 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*} + + + 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*}. + + + +Vous êtes dans l'interface d'artisanat. Cette interface vous permet de combiner les ressources récoltées pour confectionner de nouveaux objets. + + + Appuyez sur{*CONTROLLER_VK_B*} pour quitter l'inventaire du mode Créatif. + + + 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_X*} pour afficher les ingrédients nécessaires à la confection de l'objet sélectionné. + + + {*B*} + Appuyez sur{*CONTROLLER_VK_X*} pour afficher la description de l'objet. + + + {*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour continuer.{*B*} + Appuyez sur {*CONTROLLER_VK_B*}si vous savez déjà utiliser l'interface d'artisanat. + + + 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. + + + {*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. + + + L'inventaire du mode Créatif, où figurent les objets utilisables, ainsi que tous les objets à sélectionner. + + + Appuyez sur{*CONTROLLER_VK_B*} pour quitter l'inventaire. + + + Si vous déplacez le curseur à l'extérieur de l'interface alors qu'un objet lui est annexé, vous jetterez l'objet. Pour supprimer tous les objets de la barre de sélection rapide, appuyez sur{*CONTROLLER_VK_X*}. + + + +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. + + + 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. + + + Eau + + + Fiole + + + Fiole d'eau + + + Oeil d'araignée + + + Pépite d'or + + + Verrue du Nether + + + Potion{*splash*}{*prefix*}{*postfix*} + + + Oeil d'araignée fermenté + + + Chaudron + + + Oeil d'Ender + + + Pastèque scintillante + + + Poudre de feu + + + Crème de magma + + + Alambic + + + Larme de Ghast + + + Graines de citrouille + + + Graines de pastèque + + + Poulet cru + + + Disque vinyle "11" + + + Disque vinyle "where are we now" + + + Cisailles + + + Poulet cuit + + + Ender Pearl + + + Tranche de pastèque + + + Bâton de feu + + + Boeuf cru + + + Steak + + + Chair putréfiée + + + Fiole d'expérience + + + Planches en chêne + + + Planches en sapin + + + Planches en bouleau + + + Bloc d'herbe + + + Terre + + + Pierre taillée + + + Planches (bois tropical) + + + Pousse de bouleau + + + Pousse d'arbre tropical + + + Adminium + + + Pousse d'arbre + + + Pousse de chêne + + + Pousse d'épicéa + + + Pierre + + + Cadre + + + Fait apparaître {*CREATURE*} + + + Brique du Nether + + + Boule de feu + + + Boule de feu (ch. bois) + + + Boule de feu charbon + + + Crâne + + + Crâne + + + Crâne de %s + + + Crâne de creeper + + + Crâne de squelette + + + Crâne de wither squelette + + + Tête de zombie + + + Une façon plus compacte de stocker le charbon. Peut être utilisé comme combustible dans un four. + + + Poison + + + Faim + + + de lenteur + + + de rapidité + + + Invisibilité + + + Respiration aquatique + + + Vision nocturne + + + Cécité + + + de dégâts + + + de santé + + + de nausée + + + de régénération + + + de lassitude + + + de hâte + + + de faiblesse + + + de force + + + Résistance au feu + + + Saturation + + + de résistance + + + de saut + + + Wither + + + Santé + + + Absorption + + + + + + II + + + 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. + + + banale + + + triviale + + + fringante + + + cordiale + + + de charme + + + élégante + + + fantasque + + + mousseuse + + + 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 + + + Châtiment + + + Tranchant + + + Réduit progressivement la santé des joueurs, animaux et monstres affectés. + + + Dégâts d'attaque + + + Recul + + + Fléau des arthropodes + + + Vitesse + + + Renforts de zombies + + + Puissance de saut cheval + + + Une fois utilisée : + + + Résistance au recul + + + Distance de suivi des créatures + + + Santé max + + + Délicatesse + + + Efficacité + + + Aisance aquatique + + + Fortune + + + Butin + + + Solidité + + + Protection contre le feu + + + Protection + + + Aura de Feu + + + Chute amortie + + + Respiration + + + Protection contre les projectiles + + + Protection contre les explosions + + + IV + + + V + + + VI + + + Repoussoir + + + VII + + + III + + + Flamme + + + Puissance + + + Infinité + + + II + + + I + + + S'active lorsqu'une entité passe sur un fil de détente lui étant relié. + + + Active un crochet lui étant relié lorsqu'une entité le traverse. + + + Une façon plus compacte de stocker les émeraudes. + + + Le coffre de l'Ender fonctionne comme un coffre classique, mais les objets y étant placés sont accessibles depuis tous les coffres de l'Ender, quelle que soit la dimension. + + + IX + + + VIII + + + Peut être miné avec une pioche en fer ou supérieure pour obtenir des émeraudes. + + + X + + + Restitue 2{*ICON_SHANK_01*} et permet de confectionner une carotte en or. Peut être plantée dans une terre labourée. + + + Un objet de décoration. Vous pouvez y planter des fleurs, des pousses d'arbre, des cactus et des champignons. + + + Un mur fait en pierre. + + + Restitue 0,5{*ICON_SHANK_01*} ou peut être cuite dans un four. Peut être plantée dans une terre labourée. + + + Produit du quartz du Nether lorsqu'on le fond dans un four. + + + 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*}. La manger pourrait vous empoisonner. + + + Permet de diriger un cochon équipé d'une selle lorsque vous le chevauchez. + + + Restitue 3{*ICON_SHANK_01*}. S'obtient en cuisant une patate dans un four. + + + Restitue 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. + + + 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. + + + Émeraude + + + Pot de fleurs + + + Tarte à la citrouille + + + Livre enchanté + + + Patate empoisonnée + + + Carotte en or + + + Carotte et bâton + + + Crochet + + + Fil de détente + + + Quartz du Nether + + + Minerai d'émeraude + + + Coffre de l'Ender + + + Mur en pierre moussue + + + Bloc d'émeraude + + + Mur en pierre + + + Patates + + + Pot de fleurs + + + Carottes + + + Enclume légèrement usée + + + Enclume + + + Enclume + + + Bloc de quartz + + + Enclume très abîmée + + + Minerai de quartz du Nether + + + Escalier en quartz + + + Bloc de quartz taillé + + + Pilier en quartz + + + Tapis rouge + + + Tapis + + + Tapis noir + + + Tapis bleu + + + Tapis vert + + + Tapis marron + + + Tapis violet + + + Tapis bleu cyan + + + Tapis gris clair + + + Tapis gris + + + Tapis vert clair + + + Tapis rose + + + Tapis bleu ciel + + + Tapis jaune + + + Tapis magenta + + + Tapis orange + + + Tapis blanc + + + Grès taillé + + + {*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 + + + {*PLAYER*} vous a téléporté(e) à ses coordonnées + + + Téléportation de {*PLAYER*} à {*DESTINATION*} + + + Épines + + + {*PLAYER*} vous a téléporté(e) + + + Les zones sombres apparaissent comme en plein jour, même sous l'eau. + + + Dalle de quartz + + + Les joueurs, animaux et monstres affectés deviennent invisibles. + + + Réparer et nommer + + + Trop cher ! + + + Coût de l'enchantement : %d + + + Vous avez : + + + Renommer + + + {*VILLAGER_TYPE*} propose : %s + + + Requis pour l'échange + + + Échanger + + + 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*} + Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur l'interface de l'enclume.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si vous savez déjà utiliser l'interface de l'enclume. + + + + 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. + + + 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. + + + 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. + + + Il est possible de renommer l'objet en modifiant son nom dans la barre de texte. + + + + {*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur l'enclume.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si vous savez déjà utiliser l'enclume. + + + + 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. + + + 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. + + + 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 ! + + + Lorsque vous renommez un objet, tous les joueurs pourront voir son nouveau nom et le coût de ses réparations diminue. + + + + {*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur l'interface de commerce.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si vous connaissez déjà l'interface de commerce. + + + + 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. + + + 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. + + + 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*} + Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur le commerce.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si vous savez déjà tout sur le commerce. + + + + 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. + + + Abusez trop d'un échange, et il sera temporairement désactivé, mais le villageois proposera toujours au moins une offre. + + + Prenez du papier dans le coffre et essayez de commercer avec ce villageois. + + + Vous trouverez dans cette zone deux coffres de l'Ender. + + + + {*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur les coffres de l'Ender.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si vous savez déjà utiliser les coffres de l'Ender. + + + + Tous les coffres de l'Ender sont liés, quelle que soit la dimension où ils se trouvent. Placez un objet dans un coffre de l'Ender, et vous le retrouverez dans tous les autres. + + + Cependant, le contenu d'un coffre de l'Ender est propre à chaque joueur. + + + Les joueurs peuvent ainsi stocker des objets dans n'importe quel coffre de l'Ender, et les récupérer dans d'autres coffres de l'Ender, quelle que soit leur position dans le monde. Allez-y, essayez : placez des objets dans l'un des coffres de l'Ender. + + + Restitue 2{*ICON_SHANK_01*}, régénère votre santé pendant 30 secondes, et vous rend résistant au feu et aux dégâts pendant 5 minutes. Se fabrique avec une pomme et des blocs d'or. + + + Peut téléporter + + + Téléporter + + + Téléporter sur un joueur + + + Téléporter sur moi + + + Peut désactiver la fatigue + + + Peut devenir invisible + + + Vous pouvez activer l'invisibilité + + + Vous ne pouvez plus activer l'invisibilité + + + Vous pouvez activer le vol + + + Vous ne pouvez plus activer le vol + + + Vous pouvez désactiver la fatigue + + + Vous ne pouvez plus désactiver la fatigue + + + Vous pouvez téléporter + + + Vous ne pouvez plus téléporter + + + {*T3*}COMMENT JOUER : ENCLUMES{*ETW*}{*B*}{*B*} +Vous pouvez utiliser vos niveaux d'expérience pour réparer, enchanter ou renommer des objets à l'aide d'une enclume.{*B*} +N'importe quel objet peut être renommé, mais seuls les objets dont la durabilité est limitée peuvent être réparés ou enchantés à l'aide d'un livre enchanté.{*B*} +Pour réparer un objet, faites-le glisser au premier emplacement sur la gauche, puis placez à sa droite le matériau requis (des lingots de fer pour une épée en fer, par exemple), ou combinez-le avec un objet du même type.{*B*} +Combiner deux objets est plus efficace avec une enclume, et si l'un ou plus des objets est enchanté, le produit fini pourra parfois conserver certains enchantements.{*B*} +Vous pouvez utiliser des livres enchantés pour enchanter des objets à l'aide de l'enclume, à condition que l'enchantement soit compatible avec le type de l'objet ; pour ce faire, combinez l'objet et le livre sur l'enclume. Vous obtiendrez des livres enchantés dans les coffres des donjons ou en les enchantant vous-même à une table d'enchantement.{*B*} +L'enclume s'abîme avec le temps et les utilisations, et finit par se briser.{*B*} + + + + {*T3*}COMMENT JOUER : COMMERCE{*ETW*}{*B*}{*B*} +Vous pouvez faire du commerce avec les villageois. Chaque villageois a une profession propre, qu'il soit fermier, boucher, forgeron, bibliothécaire ou prêtre, et cette profession influe directement sur le type d'objets qu'il est susceptible de proposer.{*B*} +Vous trouverez une liste de tous les objets proposés par un villageois dans le menu d'échange. Un villageois pourra modifier les échanges qu'il propose ou en ajouter de nouveaux lorsque vous commercez avec lui, mais il pourra également désactiver temporairement un échange si vous en abusez.{*B*} +Ces échanges impliquent le plus souvent des émeraudes.{*B*} +Si vous n'avez pas l'objet requis pour un échange, il apparaîtra en rouge.{*B*} + + + {*T3*}COMMENT JOUER : COFFRE DE L'ENDER {*ETW*}{*B*}{*B*} +Tous les coffres de l'Ender d'un même monde sont liés. Placez un objet dans un coffre de l'Ender, et vous le retrouverez dans tous les autres. Notez bien cependant que le contenu d'un coffre de l'Ender est propre à chaque joueur. Ainsi, les joueurs peuvent stocker des objets dans n'importe quel coffre de l'Ender, et les récupérer dans d'autres coffres de l'Ender, quelle que soit leur position dans le monde. + + + Fermier + + + Bibliothécaire + + + Prêtre + + + Forgeron + + + Boucher + + + Les villageois, qui, comme leur nom l'indique, peuplent les villages, se proposent de vendre des objets aux joueurs en fonction de leur profession. + + + Grand coffre + + + Vous pouvez également créer des livres enchantés à l'aide de la table d'enchantement, puis appliquer ultérieurement leur enchantement à un objet en utilisant l'enclume. + + + Les crochets fournissent également une énergie constante à un circuit tant que le fil de détente qui les relie est activé. + + + Une fois apprivoisé, un loup garde toujours son collier. Vous pouvez modifier la couleur de ce collier en utilisant de la teinture. + + + Vous pouvez cultiver des carottes et des patates en les plantant. Le légume est prêt à être récolté lorsqu'il devient visible juste au-dessus de la terre. + + + Vous pouvez également équiper les cochons d'une selle pour les chevaucher. Pour les diriger, appâtez-les en accrochant une carotte au bout d'un bâton. + + + Si besoin, vous pouvez déplacer lentement votre chariot de mine avec{*CONTROLLER_ACTION_MOVE*}. Vous pourrez ainsi le pousser jusqu'à un rail de propulsion. + + + Impossible de rejoindre cette partie : le mode en écran partagé n'est disponible qu'en haute définition. Déconnectez tous les autres joueurs pour rejoindre. + + + Soigner + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/fr-FR/stringsLeaderboards.xml b/Minecraft.Client/PSVitaMedia/loc/fr-FR/stringsLeaderboards.xml new file mode 100644 index 00000000..56571412 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/fr-FR/stringsLeaderboards.xml @@ -0,0 +1,48 @@ + + + + Victimes (Facile) + + + Victimes (Normal) + + + Victimes (Difficile) + + + Minage de blocs (Paisible) + + + Minage de blocs (Facile) + + + Minage de blocs (Normal) + + + Minage de blocs (Difficile) + + + Ferme (Paisible) + + + Ferme (Facile) + + + Ferme (Normal) + + + Ferme (Difficile) + + + Distance (Paisible) + + + Distance (Facile) + + + Distance (Normal) + + + Distance (Difficile) + + \ 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 new file mode 100644 index 00000000..879c3442 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/fr-FR/stringsPlatformSpecific.xml @@ -0,0 +1,243 @@ + + + + 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 + + + NOT USED + + + {*T3*}COMMENT JOUER : MODE CRÉATIF{*ETW*}{*B*}{*B*} +L'interface du mode Créatif permet de déplacer dans l'inventaire du joueur n'importe quel objet du jeu sans devoir l'extraire ou le fabriquer. {*B*} +Les objets figurant dans l'inventaire du joueur ne sont pas supprimés lorsqu'ils sont placés ou utilisés dans l'environnement du jeu, ce qui permet au joueur de tout miser sur la construction sans se soucier de collecter des ressources.{*B*} +Si vous créez, chargez ou sauvegardez un monde en mode Créatif, les mises à jour des trophées et des classements seront désactivées pour ce monde, même s'il est chargé en mode Survie.{*B*} +Pour voler en mode Créatif, appuyez deux fois rapidement sur{*CONTROLLER_ACTION_JUMP*}. Pour ne plus voler, répétez l'opération. Pour voler plus vite, orientez rapidement{*CONTROLLER_ACTION_MOVE*} deux fois vers l'avant en cours de vol. En mode Vol, maintenez{*CONTROLLER_ACTION_JUMP*} pour monter et{*CONTROLLER_ACTION_SNEAK*} pour descendre, ou bien utilisez{*CONTROLLER_ACTION_DPAD_UP*} pour monter,{*CONTROLLER_ACTION_DPAD_DOWN*} pour descendre,{*CONTROLLER_ACTION_DPAD_LEFT*} pour virer à gauche et{*CONTROLLER_ACTION_DPAD_RIGHT*} pour virer à droite. + + + 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" + + + 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 ? + + + "NOT USED" + + + 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. + + + 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". +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 ? + + + 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/fr-FR/stringsRichPresence.xml b/Minecraft.Client/PSVitaMedia/loc/fr-FR/stringsRichPresence.xml new file mode 100644 index 00000000..c35ee91a --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/fr-FR/stringsRichPresence.xml @@ -0,0 +1,67 @@ + + + + {GAME_STATE} + + + Inactif + + + Dans les menus + + + Joue en Multijoueur - {GAME_STATE} + + + Multijoueur hors ligne - {GAME_STATE} + + + + Joue seul - {GAME_STATE} + + + Solo hors ligne - {GAME_STATE} + + + Profite de la vue ! + + + Sur un cochon + + + Dans un chariot + + + En bateau + + + À la pêche + + + Fabrique + + + Au fourneau + + + Dans le Nether + + + Écoute un disque + + + Regarde une carte + + + Enchante + + + Distille une potion + + + Utilise l'enclume + + + Rencontre ses voisins + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/it-IT/4J_stringsGeneric.xml b/Minecraft.Client/PSVitaMedia/loc/it-IT/4J_stringsGeneric.xml new file mode 100644 index 00000000..c441b96b --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/it-IT/4J_stringsGeneric.xml @@ -0,0 +1,87 @@ + + + + OK + + + Indietro + + + Annulla + + + + + + No + + + Salvataggio danneggiato + + + I dati salvati sono danneggiati. Vuoi creare un nuovo salvataggio, sovrascrivendo quello danneggiato? + + + Spazio libero insufficiente + + + Seleziona di nuovo + + + Gioca senza salvare + + + Crea un nuovo salvataggio + + + Sovrascrivere? + + + No, non sovrascrivere + + + Sovrascrivi e salva + + + Salvataggio non riuscito + + + Continua senza salvare + + + Caricamento non riuscito + + + Nomina il salvataggio + + + Inserisci un nome per il salvataggio + + + Vuoi davvero uscire dal gioco? + + + Uscito + + + Continua a giocare + + + Continua a giocare offline + + + Giocatore ospite + + + I giocatori ospite non possono accedere a "PSN". + + + Salvataggio... + + + Salvataggio del contenuto. Non spegnere il sistema. + + + Sblocca gioco completo + + \ 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 new file mode 100644 index 00000000..8ded317a --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/it-IT/4J_stringsPlatformSpecific.xml @@ -0,0 +1,50 @@ + + + + Salvataggio delle impostazioni sull'account Sony Entertainment Network non riuscito. + + + Problema account Sony Entertainment Network + + + 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 new file mode 100644 index 00000000..fef4874a --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/it-IT/AdditionalStrings.xml @@ -0,0 +1,97 @@ + + + + Mostra tutti i mondi Mash-up + + + Nascondi + + + Minecraft: PlayStation®3 Edition + + + Opzioni + + + Salva la cache + + + Si è verificato un errore di rete. + + + Errore di rete + + + Si è verificato un errore di rete. Ritorno al menu principale. + + + I servizi online sono disattivati nel tuo account Sony Entertainment Network a causa delle limitazioni sulla chat. + + + I servizi online sono disattivati nel tuo account Sony Entertainment Network a causa delle limitazioni sui contenuti. + + + Servizi online + + + Sei stato disconnesso da "PSN". Le funzionalità online non saranno disponibili finché non ti connetterai nuovamente a "PSN". + + + Sei stato disconnesso da "PSN". Le funzionalità online non saranno disponibili finché non ti connetterai nuovamente a "PSN". Ritorno al menu principale. + + + Scegli l'utente per il giocatore %d (o annulla per giocare come ospite) + + + Libero + + + 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. + + + Trofei disattivati + + + I trofei verranno disattivati poiché questo salvataggio appartiene a un altro utente. + + + Errore fatale: inizializzazione del trofeo fallita. Uscire dal gioco. + + + Inviti + + + File danneggiato + + + Controller scollegato + + + Il tuo controller è stato scollegato. Ricollegalo. + + + 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. + + + Invito + + + Venite a giocare una partita a Minecraft: PlayStation®Vita Edition! + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/it-IT/EULA.xml b/Minecraft.Client/PSVitaMedia/loc/it-IT/EULA.xml new file mode 100644 index 00000000..0cab6075 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/it-IT/EULA.xml @@ -0,0 +1,95 @@ + + + + Minecraft: PlayStation®Vita Edition - CONDIZIONI D'USO + Queste condizioni d'uso stabiliscono alcune regole per l'uso di Minecraft: PlayStation®Vita Edition ("Minecraft"). Allo scopo di proteggere Minecraft e i membri della nostra community, abbiamo bisogno di queste condizioni d'uso per stabilire alcune regole per il download e l'uso di Minecraft. A noi non piacciono le regole più di quanto piacciano a te, quindi abbiamo cercato di essere i più brevi possibile; ma se compri, scarichi, usi o giochi a Minecraft, accetti di rispettare queste condizioni d'uso ("Condizioni"). + Prima di cominciare, c'è una cosa che vogliamo chiarire bene. Minecraft è un gioco che permette di costruire e distruggere cose. Se giochi insieme ad altre persone (multiplayer) puoi costruire insieme a loro oppure distruggere ciò che loro hanno costruito; e loro possono fare lo stesso con te. Quindi, non giocare con altre persone se non si comportano come vorresti. Inoltre, a volte le persone fanno cose che non dovrebbero fare. A noi questo non piace, ma non c'è molto che possiamo fare per impedirglielo, a parte chiedere a tutti di comportarsi bene. Confidiamo che tu e gli altri membri della community ci comunichiate se qualcuno non si comporta correttamente; se pensi che qualcuno stia infrangendo le presenti Condizioni e/o usando Minecraft in modo improprio, ti preghiamo di dircelo. A questo scopo esiste un sistema di segnalazione che vi preghiamo di usare; noi faremo quanto necessario per risolvere il problema. + Per segnalare qualsiasi problema invia una email all'indirizzo support@mojang.com, dandoci tutte le informazioni possibili quali i dati dell'utente e cosa è successo. + E ora torniamo alle Condizioni: + UNA REGOLA FONDAMENTALE + La regola fondamentale è che non puoi distribuire ciò che noi abbiamo creato. Per "distribuire ciò che noi abbiamo creato" si intende "regalare copie di Minecraft, farne un uso commerciale, cercare di ricavarne un guadagno, o consentire l'accesso a Minecraft o parti di esso ad altre persone in modalità non corrette o non ragionevoli". Quindi la regola è che (a meno che non esista una nostra approvazione specifica, come da nostre "Linee guida sull'uso del marchio e dei materiali"[Brand and Asset Usage Guidelines]) non puoi: + • cedere copie di Minecraft a nessun altro; + • fare un uso commerciale di qualsiasi cosa abbiamo prodotto; + • cercare di ricavare un guadagno da qualsiasi cosa abbiamo prodotto; oppure + • consentire l'accesso a qualsiasi cosa abbiamo prodotto ad altre persone in modalità non corrette o non ragionevoli. + ...e per essere assolutamente chiari, ciò che abbiamo prodotto comprende, ma non si limita a, il software server e client di Minecraft. Inoltre include versioni modificate del gioco, di parti di esso o qualsiasi altra cosa abbiamo prodotto. + A parte questo, siamo abbastanza rilassati su ciò che puoi fare; in effetti, ti incoraggiamo assolutamente a fare cose bellissime (vedi sotto). Soltanto, non fare le cose che ti diciamo espressamente che non puoi fare. + USO DI MINECRAFT + • Hai acquistato Minecraft quindi puoi usarlo, personalmente, sul tuo sistema PlayStation®Vita. + • Di seguito ti assegniamo diritti limitati per fare altre cose, ma dobbiamo mettere un limite altrimenti la gente si spingerebbe troppo oltre. Se desideri fare qualcosa di relativo a ciò che abbiamo creato noi ne saremo onorati, ma per favore fai in modo che non possa essere interpretato come qualcosa di ufficiale, che rispetti le presenti Condizioni e soprattutto non fare uso commerciale di qualsiasi cosa abbiamo prodotto noi. + • Il permesso che ti accordiamo di usare Minecraft può essere revocato se non rispetti le presenti Condizioni. + • Quando acquisti Minecraft, hai il permesso di installarlo sul tuo sistema PlayStation®Vita, e usarlo su tale sistema PlayStation®Vita come stabilito nelle presenti Condizioni. Questo permesso è personale, quindi non sei autorizzato a distribuire Minecraft (o parti di esso) a nessun altro (tranne che quando esplicitamente autorizzato da noi, naturalmente). + Entro limiti ragionevoli, sei libero di fare qualsiasi cosa con gli screenshot e i video di Minecraft. Per "limiti ragionevoli" intendiamo che non puoi farne uso commerciale o fare cose scorrette, o che ledano i nostri diritti. Inoltre, non estrarre elementi grafici per distribuirli in giro, non è carino. + • Essenzialmente, la regola di base è non fare un uso commerciale di qualsiasi cosa abbiamo prodotto se non espressamente autorizzato da noi, nelle nostre “Linee guida per l'uso del marchio” (Brand and Asset Usage Guidelines) e dei materiali o nelle presenti Condizioni. Ah, e se la legge lo consente espressamente, in base alla dottrina "fair use" o "fair dealing", allora è ok, ma solo entro i limiti di legge. + PROPRIETA' DI MINECRAFT E DI ALTRE COSE + • Sebbene ti diamo il permesso di giocare a Minecraft, esso resta comunque di nostra proprietà. Inoltre siamo i proprietari dei nostri marchi e di tutto ciò che è contenuto in Minecraft, che è composto da software, texture, materiali, strumenti, infrastrutture e un sacco di altra bella (o meno bella) roba che possediamo. Tutti i nostri diritti su questa roba sono rivendicabili e riservati, ma tu puoi usarla in base a queste Condizioni. + • Ciò non significa che noi possediamo le cose bellissime che tu crei con Minecraft; devi semplicemente accettare il fatto che noi possediamo ogni parte di Minecraft, Minecraft in quanto prodotto e servizio, e le cose menzionate nel paragrafo precedente; inoltre possediamo il copyright e altri cosiddetti diritti di proprietà intellettuale ("IPRs") associati a queste cose, i nomi e i marchi associati a Minecraft. + • Naturalmente, tu creerai le tue cose grazie a Minecraft. Noi non possediamo le tue creazioni originali e non avanziamo nessun diritto di proprietà su cose che non ci appartengono. Ma saranno di nostra proprietà le cose che sono copie (o copie di fatto) o derivative delle nostre proprietà e creazioni (come delineato sopra); se crei cose originali, quelle non saranno nostre. Ad esempio: + - un singolo blocco: quello è nostro; + - una cattedrale gotica con le montagne russe che ci corrono dentro: quella non è nostra. + • Quindi, pagando per l'uso di Minecraft, stai comprando semplicemente il permesso di usare il prodotto Minecraft in accordo con le presenti Condizioni. Gli unici permessi che hai relativamente a Minecraft sono i permessi descritti in queste condizioni. + CONTENUTO + • Se rendi disponibile qualsiasi contenuto su o mediante Minecraft, devi darci il permesso di usare, copiare, modificare e adattare tale contenuto. Questo permesso deve essere irrevocabile e senza restrizioni. Inoltre devi permetterci di lasciar usare il tuo contenuto ad altre persone e devi permettere alle altre persone di accedervi (ad esempio quelle con le quali giochi in multiplayer). + • Rifletti bene prima di rendere disponibile qualsiasi tipo di contenuto, poiché esso potrebbe essere reso pubblico e usato da altre persone in modi che non approvi. + • Se rendi qualcosa disponibile su o mediante Minecraft, questo non deve essere offensivo o illegale, deve essere onesto e deve essere di tua personale creazione. Le cose che non devi rendere disponibili attraverso Minecraft comprendono pubblicazioni che: usino linguaggio razzista o omofobico; siano caratterizzate da elementi di bullismo o trolling; possano danneggiare la nostra o altrui reputazione; includano pornografia, pubblicità o creazioni e immagini altrui; nelle quali ti spacci per un moderatore; tentino di truffare o sfruttare le persone. + • Qualsiasi contenuto tu renda disponibile su Minecraft deve essere di tua creazione. Non puoi rendere disponibile tramite Minecraft nessun contenuto che leda i diritti di altri. Se pubblichi contenuti su Minecraft e noi veniamo minacciati o denunciati da qualcuno poiché tali contenuti ledono i diritti di quelle persone, ti riterremo responsabile e ciò significa che tu dovrai rimborsare qualsiasi danno ne derivi di conseguenza. Quindi è molto importante che tu renda disponibili solo contenuti creati da te, e non da qualcun altro. + • Fai attenzione a quelli con cui giochi. È difficile, sia per te che per noi, sapere se quello che le persone dicono è vero, o persino se sono chi dicono di essere. Inoltre non dovresti fornire informazioni personali attraverso Minecraft. + Se rendi dei contenuti ("i tuoi contenuti") disponibili mediante Minecraft, essi devono: + - rispettare tutte le regole di Sony Computer Entertainment, che comprendono le ToSUA, ovvero le Condizioni d'uso e il Contratto di licenza di "PSN", e tutte le regole alle quali devi aderire per poter usare il tuo sistema PlayStation®Vita e "PSN". + - non essere offensivi verso le persone; + - non essere illegali; + - essere onesti e non trarre in inganno, truffare o sfruttare nessuno, né spacciarsi per altri; + - non infrangere i copyright o altri diritti di nessuno; + - non essere razzisti, sessisti o omofobici; + - non essere caratterizzati da bullismo o trolling; + - non danneggiare la nostra reputazione né quella di nessun altro; + - non contenere pornografia; + - non contenere pubblicità. + - Non puoi rendere disponibile tramite Minecraft nessun contenuto che leda i diritti di altri. + • Sei responsabile di tutti i tuoi contenuti resi disponibili tramite Minecraft. + • Rendendo disponibili i tuoi contenuti garantisci che sei autorizzato a farlo in base alle presenti Condizioni, e che noi siamo autorizzati a esercitare i diritti che ci hai concesso in base alle presenti Condizioni. + Se veniamo minacciati o denunciati da qualcuno a causa dei contenuti che hai reso disponibili tramite Minecraft o che qualcuno ha reso disponibili su o tramite Minecraft, essi possono essere rimossi e ti riterremo responsabile; ciò significa che tu dovrai rimborsare qualsiasi danno ne derivi di conseguenza. Anche il tuo accesso a determinati aspetti di Minecraft può essere sospeso o revocato. + CONTENUTI DEGLI UTENTI + Quanto segue stabilisce delle regole che riguardano sia i tuoi contenuti che i contenuti resi disponibili da altri, che vengono d'ora in poi definiti come "contenuti degli utenti". Minecraft è un servizio di intrattenimento e in quanto tale noi e i nostri licenziatari (come Sony Computer Entertainment) siamo coinvolti nella trasmissione, distribuzione, archiviazione e recupero dei contenuti degli utenti senza obbligo di revisione, selezione, o alterazione dei contenuti stessi. Ciò significa che noi non valutiamo i contenuti degli utenti e di conseguenza non conosciamo ciò che viene fatto circolare da te o da altre persone. Abbiamo stabilito queste regole nelle Condizioni in modo che tu e altri siate tenuti a rispettarle, ma noi non possiamo sapere tutto ciò che succede. + Di conseguenza, si dichiara che: + • le idee espresse nei contenuti degli utenti sono le idee dei singoli autori o creatori, non nostre né di nessuno collegato a noi ove non diversamente specificato; + • non siamo responsabili di (e non garantiamo per, non rappresentiamo e decliniamo ogni responsabilità per) nessun contenuto degli utenti, inclusi commenti, idee e osservazioni in essi contenuti. + • usando Minecraft riconosci che non abbiamo nessuna responsabilità di revisione dei contenuti degli utenti, e che tutti i contenuti degli utenti vengono resi disponibili in base all'accordo che non siamo tenuti e non esercitiamo alcun controllo né giudizio su di essi. + CIONONOSTANTE, noi (o i nostri licenziatari come Sony Computer Entertainment) rimuoviamo, possiamo rifiutare o sospendere l'accesso a qualsivoglia contenuto degli utenti, sospendere o revocare il tuo accesso a Minecraft o a "PSN", ove lo riteniamo appropriato, ad esempio perché non hai rispettato le presenti Condizioni o perché abbiamo ricevuto un reclamo. Procederemo inoltre a sospendere o revocare l'accesso ai contenuti degli utenti se e quando veniamo a conoscenza della loro illegalità. + AGGIORNAMENTI + • Di tanto in tanto potremmo apportare aggiornamenti e miglioramenti, ma non siamo tenuti a farlo. Inoltre non siamo obbligati a fornire assistenza o manutenzione a nessun gioco. Naturalmente, speriamo di poter continuare a pubblicare nuovi aggiornamenti per Minecraft, soltanto non siamo in grado di garantirvi che potremo farlo. + LE NOSTRE RESPONSABILITA' + • Quando ti viene fornita una copia di Minecraft, essa viene fornita 'così com'è'. Anche aggiornamenti e miglioramenti vengono forniti 'così come sono'. Questo significa che non facciamo nessuna promessa sullo standard di qualità di Minecraft, né sul fatto che Minecraft funzionerà ininterrottamente o sia privo di errori, né per qualsiasi tipo di perdita o danno che ne potrebbero derivare. Ci impegniamo soltanto a fornire Minecraft e i relativi servizi con ogni ragionevole cura e competenza. Le leggi di molti paesi stabiliscono che non possiamo limitare la nostra responsabilità civile in caso di morte o danni personali causati da nostra negligenza, quindi se il tuo computer si alza e ti accoltella a causa di qualcosa che abbiamo fatto male, ce ne prenderemo la responsabilità. + NON POSSIAMO ESSERE CONSIDERATI RESPONSABILI PER: + • L'USO O L'ABUSO DI MINECRAFT DA PARTE TUA O DI ALTRE PERSONE; + • CONTENUTI RESI DISPONIBILI DA TE TRAMITE MINECRAFT; + • VIOLAZIONI DELLE PRESENTI CONDIZIONI DA PARTE TUA; + • VIOLAZIONI DI QUALSIASI CONDIZIONE DA PARTE DI ALTRE PERSONE. + TERMINAZIONE + • Se lo desideriamo, possiamo terminare il tuo diritto all'uso di Minecraft nel caso non vengano rispettate queste Condizioni. Anche tu puoi terminare in qualsiasi momento; tutto ciò che devi fare è disinstallare Minecraft dal tuo sistema PlayStation®Vita. In ogni caso i paragrafi riguardanti la "Proprietà di Minecraft", "Le nostre responsabilità" e le "Note generali" continuano ad essere applicabili anche dopo la terminazione. + NOTE GENERALI + • Queste condizioni sono soggette a tutti i diritti legali di cui godi. Nulla in queste Condizioni limiterà qualsiasi vostro diritto, che non può essere escluso ai sensi della legge né può escludere o limitare la nostra responsabilità per morte o lesioni personali derivanti dalla nostra negligenza, né alcuna dichiarazione fraudolenta. + • Abbiamo il diritto di modificare queste Condizioni di volta in volta, ma questi cambiamenti saranno effettivi nella misura in cui si possono applicare giuridicamente. Ad esempio, se giochi a Minecraft solo in modalità per giocatore singolo e non usi gli aggiornamenti che rendiamo disponibili, resta valido il vecchio contratto di licenza; ma se usi gli aggiornamenti o parti di Minecraft che si basano sulla fornitura di servizi online, allora si applica il nuovo contratto. In questo caso potremmo non essere in grado di / non dovremmo informarti dei cambiamenti affinché essi abbiano effetto, quindi dev'essere tua cura tornare qui di tanto in tanto per sapere se ci sono stati cambiamenti a queste Condizioni. Non abbiamo intenzione di essere scorretti riguardo a questo; ma a volte le leggi cambiano, o qualcuno fa qualcosa che danneggia gli altri utenti di Minecraft, e quindi siamo costretti a metterci una pezza. + • Se proponi dei suggerimenti per Minecraft o per un altro dei nostri giochi, questi suggerimenti vengono fatti a titolo gratuito. Ciò significa che possiamo usare i tuoi suggerimenti a nostro piacimento e non dobbiamo pagarti per questo. Se pensi di avere un suggerimento per il quale potremmo essere disposti a pagare, devi informarci che ti aspetti un pagamento prima di darci il suggerimento. + • In aggiunta a queste Condizioni abbiamo anche delle "Linee guida sull'uso del marchio e dei materiali" (Brand and Asset Usage Guidelines) disponibili online. + • Se infrangi queste regole, noi (o Sony Computer Entertainment) possiamo impedirti l'uso di Minecraft. Se non vuoi o non puoi accettare queste regole, allora non devi acquistare, scaricare, usare o giocare a Minecraft. + Se ci sono questioni legali per le quali desideri risposta e che non trovano risposta in questa pagina, non fare nulla prima di averci consultato. Fondamentalmente: non essere assurdo, e non lo saremo nemmeno noi. + Noi siamo: + Mojang AB + Maria Skolgata 83, + SE-11853 + Stockholm + Sweden + Numero di organizzazione: 556819-2388 + + + + Qualsiasi contenuto acquistato in qualsiasi negozio in-game sarà acquistato da Sony Network Entertainment Europe Limited ("SNEE") ed è soggetto alle Condizioni di servizio e all'Accordo di licenza di Sony Entertainment Network, disponibile su PlayStation®Store. Consulta i diritti d'uso di ciascun acquisto, poiché potrebbero essere diversi a seconda dell'articolo. Ove non diversamente specificato, i contenuti disponibili in qualsiasi negozio in-game hanno la stessa classificazione d'età del gioco stesso. + + + L'acquisto e l'uso degli articoli è soggetto alle Condizioni di servizio e all'Accordo di licenza del Network. Questo servizio online ti è stato ceduto in sub licenza da Sony Computer Entertainment America. + + + Ricorda: l'utilizzo di questo software è soggetto ai termini d'uso consultabili all'indirizzo eu.playstation.com/legal. + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/it-IT/stringsDynafont.xml b/Minecraft.Client/PSVitaMedia/loc/it-IT/stringsDynafont.xml new file mode 100644 index 00000000..dca31ec2 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/it-IT/stringsDynafont.xml @@ -0,0 +1,7 @@ + + + + DynaFont developed by DynaComware. + + + \ 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 new file mode 100644 index 00000000..2983895d --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/it-IT/stringsGeneric.xml @@ -0,0 +1,6823 @@ + + + + Passaggio a gioco offline + + + Attendi mentre l'host salva il gioco + + + Ingresso nel LIMITE + + + Salvataggio giocatori + + + Connessione all'host + + + Download terreno + + + Uscita dal LIMITE + + + 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. + + + 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. + + + Caricamento livello + + + Finalizzazione... + + + Creazione terreno + + + Simulazione mondo + + + Posiz. + + + Preparazione al salvataggio livello + + + Preparazione blocchi... + + + Inizializzazione server + + + Uscita dal Sottomondo + + + Rigenerazione + + + Generazione livello + + + Creazione area di generazione + + + Caricamento area di generazione + + + Ingresso nel Sottomondo + + + Attrezzi e armi + + + Gamma + + + Sensibilità gioco + + + Sensibilità interfaccia + + + Difficoltà + + + Musica + + + Effetti + + + Relax + + + 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. + + + Facile + + + Normale + + + Difficile + + + Disconnesso + + + Armature + + + Meccanismi + + + Trasporto + + + Armi + + + Cibo + + + Strutture + + + Decorazioni + + + Distillazione + + + Attrezzi, armi e armature + + + Materiali + + + Blocchi da costruzione + + + Pietra rossa e trasporti + + + Varie + + + Totale: + + + 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! + + + 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 + + + Crea nuovo mondo + + + Immetti un nome per il tuo mondo + + + Pianta il seme per la generazione del tuo mondo + + + Carica mondo salvato + + + Avvia tutorial + + + Tutorial + + + Nomina il tuo mondo + + + Salvataggio dannegg. + + + OK + + + Annulla + + + Negozio di Minecraft + + + Ruota + + + Nascondi + + + Libera tutti gli slot + + + Vuoi davvero uscire dalla partita attuale e accedere a quella nuova? Tutti i progressi non salvati andranno persi. + + + Vuoi davvero sovrascrivere qualsiasi salvataggio precedente di questo mondo con la versione del mondo corrente? + + + Vuoi davvero uscire senza salvare? Perderai tutti i progressi in questo mondo! + + + Avvia gioco + + + Esci dal gioco + + + Salva gioco + + + Esci senza salvare + + + Premi START per accedere + + + Evviva, hai ottenuto un'immagine del giocatore con Steve di Minecraft! + + + Evviva, hai ottenuto un'immagine del giocatore con un creeper! + + + Sblocca gioco completo + + + Non puoi partecipare alla partita perché il giocatore a cui vuoi unirti a una versione più nuova del gioco. + + + Nuovo mondo + + + Premio sbloccato! + + + Stai giocando con la versione di prova, ma serve la versione completa per salvare i progressi. +Vuoi sbloccare il gioco completo ora? + + + Amici + + + Punt. personale + + + Generale + + + Attendi + + + Nessun risultato + + + Filtro: + + + Non puoi partecipare alla partita perché il giocatore a cui vuoi unirti ha una versione più vecchia del gioco. + + + Connessione persa + + + Connessione al server persa. Tornerai al menu principale. + + + Disconnesso dal server + + + Uscita dal gioco + + + Si è verificato un errore. Tornerai al menu principale. + + + Connessione non riuscita + + + Sei stato espulso dalla partita + + + L'host è uscito dal gioco. + + + Non puoi accedere a questa partita perché non hai amici tra i partecipanti. + + + Non puoi accedere a questa partita perché sei stato espulso dall'host in precedenza. + + + Sei stato espulso dalla partita per volo. + + + Timeout del tentativo di connessione + + + Server pieno + + + In questa modalità, nell'ambiente vengono generati nemici che infliggono gravi danni al giocatore. Fai attenzione anche ai creeper: è improbabile che annullino il loro attacco esplosivo quando ti allontani! + + + Temi + + + Pacchetti Skin + + + Accetta amici di amici + + + Espelli giocatore + + + Sei sicuro di voler espellere questo giocatore dalla partita? Non potrà accedere finché non riavvii il mondo. + + + Pacchetti Immagini del giocatore + + + Non puoi unirti a questa partita. L'host ha limitato l'accesso ai propri amici. + + + Contenuto scaricabile danneggiato + + + Questo contenuto scaricabile è danneggiato e non può essere usato. Cancellalo e installalo nuovamente dal menu del Negozio di Minecraft. + + + Parte del contenuto scaricabile è danneggiato e non può essere usato. Cancella il contenuto e installalo nuovamente dal menu del Negozio di Minecraft. + + + Impossibile accedere alla partita + + + Selezionato + + + Skin selezionata: + + + Ottieni la versione completa + + + Sblocca pacchetto texture + + + Per usare questo pacchetto texture nel tuo mondo, devi prima sbloccarlo. +Vuoi sbloccarlo ora? + + + Versione di prova pacchetto texture + + + Seme + + + Sblocca pacchetto Skin + + + Per usare la skin che hai selezionato, devi sbloccare questo pacchetto Skin. +Vuoi sbloccare il pacchetto Skin ora? + + + Stai usando una versione di prova del pacchetto texture. Non potrai salvare questo mondo, a meno che non sblocchi la versione completa. +Vuoi sbloccare la versione completa del pacchetto texture? + + + Scarica versione completa + + + Questo mondo usa un pacchetto texture o mash-up che non hai! +Vuoi installare uno dei due pacchetti ora? + + + Ottieni la versione di prova + + + Nessun pacchetto texture + + + Sblocca versione completa + + + Scarica versione di prova + + + La modalità di gioco è cambiata + + + Se attivato, i giocatori potranno unirsi solo su invito. + + + Se attivato, gli amici delle persone nell'elenco di amici potranno unirsi alla partita. + + + Se l'opzione è abilitata, è possibile infliggere danni agli altri giocatori. Efficace solo in modalità Sopravvivenza. + + + Normale + + + Superpiatto + + + Se attivato, il gioco sarà un gioco online. + + + Se l'opzione è disabilitata, i giocatori che si uniscono alla partita non possono costruire o scavare fino a quando non vengono autorizzati. + + + Se l'opzione è abilitata, nel mondo si genereranno strutture come Villaggi e Fortezze. + + + Se l'opzione è abilitata, verrà generato un mondo completamente piatto tanto nel Sopramondo che nel Sottomondo. + + + Se l'opzione è abilitata, vicino al punto di generazione del giocatore apparirà una cassa contenente alcuni oggetti utili. + + + Se l'opzione è abilitata, il fuoco può propagarsi ai blocchi infiammabili vicini. + + + Se l'opzione è abilitata, il TNT esplode quando viene attivato. + + + Quando è attivato, il Sottomondo viene rigenerato. È molto utile nel caso tu abbia un vecchio salvataggio nel quale non sono presenti Fortezze del Sottomondo. + + + No + + + Modalità: Creativa + + + Sopravvivenza + + + Creativa + + + Rinomina il mondo + + + Inserisci il nuovo nome del tuo mondo + + + Modalità: Sopravvivenza + + + In modalità Sopravvivenza + + + Rinomina salvataggio + + + Autosalvataggio tra %d... + + + + + + In modalità Creativa + + + Renderizza nuvole + + + Cosa vuoi fare con questo salvataggio? + + + Dimen. interfaccia (schermo div.) + + + Ingrediente + + + Combustibile + + + Dispenser + + + Cassa + + + Incantesimo + + + Fornace + + + Nessuna offerta di contenuto scaricabile disponibile per questo titolo al momento. + + + Vuoi davvero eliminare questo salvataggio? + + + Da approvare + + + Censurato + + + %s si unisce alla partita. + + + %s ha abbandonato la partita. + + + %s è stato espulso dal gioco. + + + Banco di distillazione + + + Inserisci testo cartello + + + Inserisci il testo per il cartello + + + Inserisci titolo + + + Timeout prova + + + Partita al completo + + + Impossibile accedere: nessuno spazio rimasto + + + Inserisci un titolo per il tuo messaggio + + + Inserisci una descrizione per il tuo messaggio + + + Inventario + + + Ingredienti + + + Inserisci didascalia + + + Inserisci una didascalia per il tuo messaggio + + + Inserisci descrizione + + + In ascolto: + + + Vuoi davvero aggiungere questo livello all'elenco dei livelli esclusi? +Selezionando OK, uscirai da questa partita. + + + Rimuovi da elenco esclusi + + + Autosalvataggio + + + Livello escluso + + + Il gioco a cui stai cercando di accedere è nell'elenco dei livelli esclusi. +Se scegli di entrarvi comunque, il livello verrà rimosso dall'elenco dei livelli esclusi. + + + Escludere questo livello? + + + Intervallo autosalvataggio: NO + + + Opacità interfaccia + + + Preparazione salvataggio livello + + + Dimensioni dell'interfaccia + + + Min + + + Impossibile collocare qui! + + + Non è consentito collocare la lava accanto al punto di generazione del livello: i giocatori appena generati potrebbero morire immediatamente. + + + Skin preferite + + + Partita di %s + + + Partita con host sconosciuto + + + Ospite disconnesso + + + Resetta impostazioni + + + Vuoi davvero ripristinare le impostazioni predefinite? + + + Errore caricamento + + + Un giocatore ospite si è disconnesso, rimuovendo tutti i giocatori ospite dal gioco. + + + Creazione di partita non riuscita + + + Selezionato automaticamente + + + No pacchetto: skin predef. + + + Accedi + + + Non hai effettuato l'accesso. Per partecipare a questo gioco, devi prima accedere. Vuoi accedere ora? + + + Multiplayer non consentito + + + Bevi + + + In quest'area è stata allestita una fattoria. Coltivare la terra ti permette di avere una fonte rinnovabile di cibo e altri oggetti. + + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sulla coltivazione.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già come funziona. + + + Grano, Zucche e Angurie crescono a partire dai semi. I Semi di grano si ottengono tagliando l'Erba alta o raccogliendo Grano maturo, mentre quelli di Zucca e di Melone si ricavano dai rispettivi ortaggi. + + + Premi{*CONTROLLER_ACTION_CRAFTING*} per aprire l'interfaccia dell'inventario in modalità Creativa. + + + Raggiungi l'altra estremità di questo fosso per continuare. + + + Hai completato il tutorial della modalità Creativa. + + + Prima di poter procedere alla semina, devi lavorare i blocchi di terra con la Zappa per trasformarli in Zolle. Con una fonte d'aqua nei pressi (che tenga le zolle umide), e illuminando l'area, i raccolti cresceranno più rapidamente. + + + I Cactus si piantano nella sabbia e crescono fino a raggiungere un'altezza di tre blocchi. Come per la Canna da zucchero, distruggere il blocco inferiore ti permetterà di raccogliere anche i blocchi che lo sovrastano.{*ICON*}81{*/ICON*} + + + I Funghi vanno piantati in un'area scarsamente illuminata. Crescendo, si allargano verso i blocchi vicini, purché siano anch'essi in penombra.{*ICON*}39{*/ICON*} + + + La Farina d'ossa può essere usata per portare a maturità i raccolti o per trasformare i Funghi in Funghi giganti.{*ICON*}351:15{*/ICON*} + + + Il Grano attraversa vari stadi prima di giungere a maturazione. È pronto ad essere raccolto quando ha assunto una tinta più scura.{*ICON*}59:7{*/ICON*} + + + Zucche e Angurie richiedono un blocco libero accanto a quello in cui sono stati piantati i semi in modo che il frutto abbia spazio per crescere una volta che il picciolo è giunto a maturazione. + + + La Canna da zucchero deve essere piantata su un blocco di erba, terra o sabbia attiguo a un blocco d'acqua. Tagliare un blocco di Canna da zucchero fa cadere anche tutti i blocchi che lo sovrastano.{*ICON*}83{*/ICON*} + + + In modalità Creativa avrai a disposizione una quantità infinita di oggetti e blocchi, potrai distruggere blocchi con un clic, senza usare alcun attrezzo, sarai invulnerabile e potrai volare. + + + Nel forziere in quest'area ci sono dei componenti per creare dei circuiti con i pistoni. Prova a usare o completare i circuiti in quest'area, oppure creane uno personalizzato. Troverai altri esempi al di fuori dell'area del tutorial. + + + In quest'area c'è un Portale per il Sottomondo! + + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sui Portali e sul Sottomondo.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già come funzionano i Portali e il Sottomondo. + + + + La polvere di pietrarossa si ottiene estraendo il minerale di pietrarossa con una piccozza di ferro, diamante o oro. Puoi usarla per migliorare fino a 15 blocchi e può salire o scendere di un blocco in altezza. + {*ICON*}331{*/ICON*} + + + + + I ripetitori a pietrarossa si usano per alimentare a distanza o per inserire un ritardo in un circuito. + {*ICON*}356{*/ICON*} + + + + + Quando è alimentato, un pistone si estende, spingendo fino a 12 blocchi. Quando si ritira, un pistone appiccicoso può tirare un blocco di quasi tutti i tipi. + {*ICON*}33{*/ICON*} + + + + I Portali si creano posizionando blocchi di ossidiana in una struttura larga quattro blocchi e alta cinque. I blocchi d'angolo non sono necessari. + + + Si può usare il Sottomondo per viaggiare velocemente nel Sopramondo: una distanza di un blocco nel Sottomondo equivale a 3 blocchi nel Sopramondo. + + + Ora sei in modalità Creativa. + + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sulla modalità Creativa.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già come funziona la modalità Creativa. + + + Per attivare un Sottoportale, dai fuoco ai blocchi di ossidiana dentro la struttura, usando acciarino e pietra focaia. I Portali possono essere disattivati se la struttura si rompe, se c'è un'esplosione nelle vicinanze o se del liquido vi scorre dentro. + + + Per usare un Sottoportale, mettiti in piedi all'interno. Lo schermo diventerà viola e sentirai un suono. Dopo qualche secondo sarai trasportato in un'altra dimensione. + + + Il Sottomondo può essere pericoloso e pieno di lava, ma può essere utile per raccogliere Sottogriglia, che una volta accesa brucia all'infinito, e Pietra brillante, che produce luce. + + + Hai completato il tutorial sulla coltivazione. + + + Attrezzi diversi sono indicati per materiali diversi. Usa l'ascia per abbattere gli alberi. + + + Attrezzi diversi sono indicati per materiali diversi. Usa la piccozza per scavare pietra e minerali. Per ottenere risorse da alcuni blocchi, potrebbe rendersi necessario costruire piccozze con materiali migliori. + + + Alcuni attrezzi sono perfetti per attaccare i nemici. La spada è uno di questi. + + + I golem di ferro compaiono per aiutare i villaggi e ti attaccheranno se proverai ad attaccare un abitante. + + + Non puoi abbandonare l'area finché non avrai completato il tutorial. + + + Attrezzi diversi sono indicati per materiali diversi. Usa la pala per scavare materiali cedevoli come terra e sabbia. + + + Suggerimento: tieni premuto {*CONTROLLER_ACTION_ACTION*}per scavare e abbattere alberi usando la mano o un oggetto. Potresti dover creare un attrezzo per scavare alcuni blocchi... + + + Nella cassa accanto al fiume c'è una barca. Per usarla, punta il cursore verso l'acqua e premi{*CONTROLLER_ACTION_USE*}. Usa{*CONTROLLER_ACTION_USE*} mentre punti verso la barca per salirci. + + + Nella cassa accanto al laghetto c'è una canna da pesca. Prendi la canna da pesca dalla cassa e selezionala come oggetto in mano per usarla. + + + Questo pistone con un meccanismo più avanzato crea un ponte auto-riparante! Premi il pulsante per attivarlo, poi scopri in che modo i componenti interagiscono tra loro per saperne di più. + + + L'attrezzo che stai usando si è danneggiato. Ogni volta che usi un attrezzo, esso si danneggia e, alla fine, si rompe. La barra colorata sotto l'oggetto nell'inventario mostra lo stato corrente. + + + Tieni premuto{*CONTROLLER_ACTION_JUMP*} per nuotare verso l'alto. + + + In quest'area c'è un carrello da miniera sui binari. Per salirci, punta il cursore verso i binari e premi{*CONTROLLER_ACTION_USE*}. Usa{*CONTROLLER_ACTION_USE*} sul pulsante per far muovere il carrello. + + + I golem di ferro si creano con quattro blocchi di ferro, come mostrato, con una zucca sopra il blocco centrale. I golem di ferro attaccano i tuoi nemici. + + + Dai grano a una mucca, muccafungo o pecora, carote ai maiali, chicchi di grano o verruche del Sottomondo a una gallina, o qualsiasi tipo di carne a un lupo, e cominceranno a cercare nei dintorni un altro animale della stessa specie che sia a sua volta in modalità Amore. + + + Quando l'avrà trovato, i due si scambieranno effusioni per qualche secondo e poi apparirà un cucciolo. Il piccolo seguirà i genitori per un certo periodo di tempo prima di diventare adulto. + + + Devono passare circa cinque minuti prima che un animale possa entrare nuovamente in modalità Amore. + + + In quest'area troverai alcuni animali rinchiusi in un recinto. Se li fai riprodurre, gli animali metteranno al mondo delle versioni in miniatura di se stessi. + + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sulla riproduzione.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già come funziona. + + + Per far riprodurre un animale, devi prima farlo entrare in "modalità Amore" nutrendolo con l'alimento adatto. + + + Alcuni animali ti seguiranno quando hai in mano il loro cibo. In questo modo ti sarà più semplice raggrupparli per farli riprodurre.{*ICON*}296{*/ICON*} + + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sui golem.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già tutto sui golem. + + + I golem si creano sistemando una zucca in cima a una pila di blocchi. + + + I golem di neve si creano con due blocchi di neve, uno sull'altro, con in cima una zucca. I golem di neve scagliano palle di neve contro i nemici. + + + + I lupi selvatici possono essere addomesticati dando loro delle ossa. Una volta addomesticati, appariranno dei cuori intorno ad essi. I lupi addomesticati seguiranno il giocatore e lo difenderanno, se non è stato loro ordinato di restare seduti. + + + + Hai completato il tutorial sulla riproduzione. + + + In questa area ci sono zucche e blocchi per creare un golem di neve e uno di ferro. + + + Posizione e direzione delle fonti di alimentazione modificano il loro effetto sui blocchi circostanti. Per esempio, una torcia a pietre rosse sul lato di un blocco può essere spenta se il blocco è alimentato da un'altra fonte. + + + Se il Calderone si svuota, puoi riempirlo con un Secchio d'acqua. + + + Usa il Banco di distillazione per creare una Pozione di Resistenza al fuoco. Ti serviranno una Bottiglia d'acqua, una Verruca del Sottomondo e Crema di magma. + + + + Prendi una pozione e tieni premuto{*CONTROLLER_ACTION_USE*} per usarla. Le pozioni normali vengono ingerite e producono i propri effetti sul giocatore stesso; le pozioni Area, invece, vengono lanciate e il loro effetto si applica alle creature che si trovano nella zona dell'impatto. + È possibile creare delle pozioni bomba aggiungendo polvere da sparo a una pozione normale. + + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sulla distillazione di pozioni.{*B*} + Premi{*CONTROLLER_VK_B*} se non hai bisogno di spiegazioni al riguardo. + + + Prima di poter distillare una pozione, devi creare una Bottiglia d'acqua. Prendi una Bottiglia di vetro dalla cassa. + + + Puoi riempire una Bottiglia di vetro attingendo acqua da un Calderone che ne contenga o da un blocco d'acqua. Riempi la tua bottiglia posizionando il cursore su una fonte d'acqua e premendo{*CONTROLLER_ACTION_USE*}. + + + Usa la Pozione di Resistenza al fuoco su te stesso. + + + Per applicare un incantesimo a un oggetto, posizionalo nello slot di incantamento. È possibile incantare armi, armature e alcuni attrezzi per dotarli di proprietà speciali, come una maggiore resistenza ai danni o la capacità di raccogliere più oggetti quando si scava un blocco. + + + Quando un oggetto viene posizionato nello slot di incantamento, i pulsanti a destra mostreranno una selezione casuale di incantesimi. + + + La cifra sul pulsante indica il costo in punti Esperienza dell'incantesimo. Se non hai un livello di Esperienza sufficiente, il pulsante non sarà selezionabile. + + + Ora che sei resistente al fuoco e alla lava, approfittane per raggiungere dei luoghi che prima ti risultavano inaccessibili. + + + Questa è l'interfaccia degli incantesimi. Puoi usarla per incantare armi, armature e alcuni attrezzi. + + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sull'interfaccia per gli incantesimi.{*B*} + Premi{*CONTROLLER_VK_B*} se non hai bisogno di spiegazioni al riguardo. + + + In quest'area troverai un Banco di distillazione, un Calderone e una cassa pieni di oggetti da utilizzare per la preparazione di pozioni. + + + L'antracite può essere usata come combustibile o combinata con un bastone per creare una torcia. + + + Inserisci la sabbia nello slot ingrediente per produrre del vetro. Crea dei blocchi di vetro da usare come finestre nel tuo rifugio. + + + Questa è l'interfaccia di distillazione. Puoi usarla per creare pozioni di vario tipo. + + + Puoi usare molti oggetti di legno come combustibile, ma ciascuno brucia per un tempo diverso. Puoi anche scoprire altri oggetti nel mondo da usare come combustibile. + + + Gli oggetti nell'area di produzione possono essere trasferiti nell'inventario. Sperimenta con diversi ingredienti e vedi cosa riesci a creare. + + + Usando il legno come ingrediente, puoi produrre l'antracite. Inserisci del combustibile nella fornace e del legno nello slot ingrediente. La fornace può richiedere tempo per creare l'antracite, quindi sentiti libero di fare altro e di tornare in seguito a controllare l'avanzamento. + + + {*B*} + Premi{*CONTROLLER_VK_A*} per continuare.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già come si usa il Banco di distillazione. + + + L'Occhio di ragno fermentato inquina la pozione e può farle acquisire effetti diametralmente opposti, mentre la Polvere da sparo la trasforma in una Bomba pozione che, una volta lanciata, diffonderà il suo effetto nella zona colpita. + + + Crea una Pozione di Resistenza al fuoco aggiungendo prima una Verruca del Sottomondo a una Bottiglia d'acqua e completando poi la pozione con della Crema di magma. + + + Ora premi{*CONTROLLER_VK_B*} per uscire dall'interfaccia di distillazione. + + + Per distillare una pozione, posiziona un ingrediente nello slot superiore e una pozione o una Bottiglia d'acqua negli slot inferiori. Puoi preparare fino a tre pozioni contemporaneamente. Una volta inserita una combinazione di ingredienti corretta, il processo di distillazione si avvierà e, dopo un breve periodo di tempo, potrai ritirare la tua pozione. + + + Il punto di partenza di tutte le pozioni è una Bottiglia d'acqua. Quasi tutte le pozioni vengono preparate utilizzando prima una Verruca del Sottomondo per creare una Maldestra pozione e aggiungendo poi almeno un altro ingrediente per ottenere il prodotto finale. + + + È possibile modificare gli effetti di una pozione aggiungendo altri ingredienti. La Polvere di pietra rossa, ad esempio, rende più duraturi gli effetti della pozione, mentre la Polvere di pietra brillante li rende più potenti. + + + Seleziona un incantesimo e premi{*CONTROLLER_VK_A*} per applicarlo all'oggetto. Il costo dell'incantesimo verrà detratto dai tuoi punti Esperienza. + + + Premi{*CONTROLLER_ACTION_USE*} per lanciare la lenza e iniziare a pescare. Premi di nuovo{*CONTROLLER_ACTION_USE*} per tirare la lenza. + {*FishingRodIcon*} + + + Se aspetti che il galleggiante affondi sotto la superficie dell'acqua prima di tirare, potresti prendere un pesce. Il pesce si può mangiare crudo o cucinato nella fornace per reintegrare la salute. + {*FishIcon*} + + + Come nel caso di molti altri attrezzi, la canna da pesca ha un numero di utilizzi prestabilito, non limitato alla pesca. Sperimenta e scopri cos'altro puoi prendere o attivare... + {*FishingRodIcon*} + + + La barca consente di viaggiare velocemente sull'acqua. Per virare, usa{*CONTROLLER_ACTION_MOVE*} e{*CONTROLLER_ACTION_LOOK*}. + {*BoatIcon*} + + + Ora stai utilizzando la canna da pesca. Premi{*CONTROLLER_ACTION_USE*} per usarla.{*FishingRodIcon*} + + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sulla pesca.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già come funziona la pesca. + + + Questo è un letto. Premi{*CONTROLLER_ACTION_USE*} mentre punti verso di esso di notte per dormire e risvegliarti il mattino successivo.{*ICON*}355{*/ICON*} + + + In quest'area ci sono dei semplici circuiti con pietre rosse e pistoni, oltre a un forziere contenente altri oggetti per ampliare i circuiti. + + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sui circuiti con pietre rosse e pistoni.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già come funzionano. + + + Leve, pulsanti, piastre a pressione e torce a pietre rosse alimentano i circuiti collegandoli direttamente all'oggetto da attivare o connettendoli con la polvere di pietra rossa. + + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sul letto.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già come funziona il letto. + + + Il letto dovrebbe trovarsi in un punto sicuro e ben illuminato, in modo che i mostri non ti sveglino nel cuore della notte. Una volta usato un letto, se dovessi morire, tornerai in quel punto. + {*ICON*}355{*/ICON*} + + + Se ci sono altri giocatori nel gioco, per dormire devono essere tutti a letto nello stesso momento. + {*ICON*}355{*/ICON*} + + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sulla barca.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già come funziona la barca. + + + Utilizzando un Tavolo per incantesimi è possibile incantare armi, armature e alcuni attrezzi per dotarli di proprietà speciali, come una maggiore resistenza ai danni o la capacità di raccogliere più oggetti quando si scava un blocco. + + + Posizionare degli scaffali intorno al Tavolo per incantesimi ne aumenta la potenza e consente di accedere agli incantesimi di livello più alto. + + + Gli incantesimi richiedono un certo livello di Esperienza; puoi far salire di livello la tua Esperienza raccogliendo le sfere di Esperienza che vengono abbandonate da mostri e animali uccisi, estraendo metalli, facendo riprodurre animali, pescando e fondendo/cuocendo alcuni oggetti in una fornace. + + + Gli incantesimi sono casuali, ma alcuni dei più potenti sono disponibili solo quando hai un livello elevato di Esperienza e intorno al Tavolo per incantesimi ci sono molti scaffali che ne aumentano la potenza. + + + In quest'area troverai un Tavolo per incantesimi e alcuni altri oggetti che potrai utilizzare per familiarizzarti con questa nuova funzionalità. + + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sugli incantesimi.{*B*} + Premi{*CONTROLLER_VK_B*} se non hai bisogno di spiegazioni al riguardo. + + + Puoi guadagnare Esperienza anche usando una Bottiglia magica. Quando viene lanciata, la Bottiglia magica rilascia attorno a sé Sfere di Esperienza che possono essere raccolte. + + + Il carrello da miniera viaggia sui binari. Puoi creare un carrello potenziato usando una fornace e un carrello da miniera contenente una cassa. + {*RailIcon*} + + + Puoi anche creare binari potenziati, che traggono energia dai circuiti e dalle torce di pietre rosse per far accelerare il carrello. Potrai quindi collegarli a interruttori, leve e piastre a pressione per realizzare sistemi complessi. + {*PoweredRailIcon*} + + + Ora navighi su una barca. Per scendere, punta il cursore verso la barca e premi{*CONTROLLER_ACTION_USE*}.{*BoatIcon*} + + + Le casse che troverai in quest'area contengono oggetti già incantati, Bottiglie magiche e alcuni oggetti da incantare per acquisire dimestichezza con il Tavolo per incantesimi. + + + Ora viaggi in un carrello da miniera. Per smontare, punta il cursore verso il carrello e premi{*CONTROLLER_ACTION_USE*}.{*MinecartIcon*} + + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sul carrello da miniera.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già come funziona il carrello da miniera. + + + Se sposti il puntatore fuori dall'interfaccia mentre trasporti un oggetto, puoi posarlo. + + + Leggi + + + Appendi + + + Lancia + + + Apri + + + Cambia tonalità + + + Fai esplodere + + + Pianta + + + Sblocca gioco completo + + + Elimina salvataggio + + + Elimina + + + Ara + + + Mieti + + + Continua + + + Nuota su + + + Colpisci + + + Mungi + + + Raccogli + + + Svuota + + + Sella + + + Colloca + + + Mangia + + + Cavalca + + + Naviga + + + Coltiva + + + Dormi + + + Svegliati + + + Suona + + + Opzioni + + + Sposta armatura + + + Sposta arma + + + Equipaggia + + + Sposta ingrediente + + + Sposta combustibile + + + Sposta attrezzo + + + Tendi + + + Pagina su + + + Pagina giù + + + Modalità Amore + + + Rilascia + + + Privilegi + + + Parata + + + Creativa + + + Escludi livello + + + Seleziona skin + + + Accendi + + + Invita amici + + + Accetta + + + Tosa + + + Naviga + + + Reinstalla + + + Opzioni dati + + + Esegui comando + + + Installa versione completa + + + Installa versione di prova + + + Installa + + + Espelli + + + Aggiorna elenco partite + + + Giochi Party + + + Tutti i giochi + + + Esci + + + Annulla + + + Annulla accesso + + + Cambia gruppo + + + Crafting + + + Crea + + + Prendi/Colloca + + + Mostra inventario + + + Mostra descrizione + + + Mostra ingredienti + + + Indietro + + + Promemoria: + + + + + + Nell'ultima versione del gioco, sono state aggiunte nuove funzionalità, tra cui nuove aree nel mondo tutorial. + + + Non hai tutti gli ingredienti necessari per creare questo oggetto. La casella in basso a sinistra mostra gli ingredienti necessari. + + + Congratulazioni, hai completato il tutorial. Il tempo nel gioco scorre normalmente, e tra poco sarà notte e i mostri usciranno allo scoperto! Completa il rifugio! + + + {*EXIT_PICTURE*} Quando sarai pronto a proseguire l'esplorazione, vicino al rifugio del minatore troverai una scala che conduce a un piccolo castello. + + + {*B*}Premi{*CONTROLLER_VK_A*} per giocare normalmente il tutorial.{*B*} + Premi{*CONTROLLER_VK_B*} per saltare il tutorial principale. + + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sulla barra del cibo e sull'alimentazione.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già come funzionano la barra del cibo e l'alimentazione. + + + Seleziona + + + Usa + + + In quest'area, troverai delle zone che ti aiuteranno a scoprire la pesca, le barche, i pistoni e le pietre rosse. + + + Fuori da quest'area, troverai esempi di edifici, coltivazioni, carrelli da miniera e binari, oltre a incantesimi e pozioni da distillare! + + + La tua barra del cibo è scesa a un livello troppo basso e non potrai più recuperare energia. + + + Prendi + + + Avanti + + + Indietro + + + Espelli giocatore + + + Invia richiesta amico + + + Pagina giù + + + Pagina su + + + Tingi + + + Cura + + + Siediti + + + Seguimi + + + Scava + + + Nutri + + + Addomestica + + + Cambia filtro + + + Colloca tutti + + + Colloca uno + + + Posa + + + Prendi tutto + + + Prendi metà + + + Colloca + + + Posa tutti + + + Elimina scelta rapida + + + Cos'è? + + + Condividi su Facebook + + + Posa uno + + + Scambia + + + Spost. veloce + + + Pacchetti di skin + + + Lastra di vetro dipinto rossa + + + Lastra di vetro dipinto verde + + + Lastra di vetro dipinto marrone + + + Vetro dipinto bianco + + + Lastra di vetro dipinto + + + Lastra di vetro dipinto nera + + + Lastra di vetro dipinto blu + + + Lastra di vetro dipinto grigia + + + Lastra di vetro dipinto rosa + + + Lastra di vetro dipinto verde chiaro + + + Lastra di vetro dipinto viola + + + Lastra di vetro dipinto azzurra + + + Lastra di vetro dipinto grigia chiara + + + Vetro dipinto arancione + + + Vetro dipinto blu + + + Vetro dipinto viola + + + Vetro dipinto azzurro + + + Vetro dipinto rosso + + + Vetro dipinto verde + + + Vetro dipinto marrone + + + Vetro dipinto grigio chiaro + + + Vetro dipinto giallo + + + Vetro dipinto blu chiaro + + + Vetro dipinto magenta + + + Vetro dipinto grigio + + + Vetro dipinto rosa + + + Vetro dipinto verde chiaro + + + Lastra di vetro dipinto gialla + + + Grigio chiaro + + + Grigio + + + Rosa + + + Blu + + + Viola + + + Azzurro + + + Verde chiaro + + + Arancione + + + Bianco + + + Personalizzato + + + Giallo + + + Blu chiaro + + + Magenta + + + Marrone + + + Lastra di vetro dipinto bianca + + + Palla piccola + + + Palla grande + + + Lastra di vetro dipinto blu chiaro + + + Lastra di vetro dipinto magenta + + + Lastra di vetro dipinto arancione + + + Stella + + + Nero + + + Rosso + + + Verde + + + Creeper + + + Fiammata + + + Forma sconosciuta + + + Vetro dipinto nero + + + Armatura di ferro da cavallo + + + Armatura d'oro da cavallo + + + Armatura di diamante da cavallo + + + Comparatore di pietra rossa + + + Carrello da miniera con TNT + + + Carrello da miniera con hopper + + + Piombo + + + Raggio + + + Cassa intrappolata + + + Piastra a pressione pesata (leggera) + + + Targhetta del nome + + + Assi di legno (ogni tipo) + + + Blocco di comando + + + Stella per fuochi artificiali + + + Questi animali possono essere addomesticati e in seguito montati. Possono essere dotati di una cassa. + + + Mulo + + + Nato dall'accoppiamento di un cavallo e un asino. Questi animali possono essere addomesticati e in seguito montati, indossare armature e trasportare casse. + + + Cavallo + + + Questi animali possono essere addomesticati e in seguito montati. + + + Asino + + + Cavallo zombie + + + Mappa vuota + + + Stella del Sottomondo + + + Razzo per fuochi artificiali + + + Cavallo scheletro + + + Avvizzito + + + Vengono creati usando teschi avvizziti e sabbie mobili. Quando esplodono lanciano teschi. + + + Piastra a pressione pesata (pesante) + + + Argilla dipinta grigia chiara + + + Argilla dipinta grigia + + + Argilla dipinta rosa + + + Argilla dipinta blu + + + Argilla dipinta viola + + + Argilla dipinta azzurra + + + Argilla dipinta verde chiara + + + Argilla dipinta arancione + + + Argilla dipinta bianca + + + Vetro dipinto + + + Argilla dipinta gialla + + + Argilla dipinta blu chiara + + + Argilla dipinta magenta + + + Argilla dipinta marrone + + + Hopper + + + Binario attivatore + + + Dropper + + + Comparatore di pietra rossa + + + Sensore luce solare + + + Blocco di pietra rossa + + + Argilla dipinta + + + Argilla dipinta nera + + + Argilla dipinta rossa + + + Argilla dipinta verde + + + Balla di fieno + + + Argilla indurita + + + Blocco di carbone + + + Dissolvenza + + + Quando è disattivato, impedisce a mostri e animali di modificare i blocchi (ad esempio, le esplosioni dei creeper non distruggono blocchi e le pecore non rimuovono l'erba) e di raccogliere oggetti. + + + Quando è attivato, i giocatori conservano il loro inventario quando muoiono. + + + Quando è disattivato, i nemici non si rigenerano naturalmente. + + + Modalità: Avventura + + + Avventura + + + Inserisci un seme per generare di nuovo lo stesso terreno. Lascia vuoto per generare un mondo casuale. + + + Quando è attivato, mostri e animali non rilasciano oggetti (ad esempio, i creeper non rilasciano polvere da sparo). + + + {*PLAYER*} è caduto da una scala + + + {*PLAYER*} è caduto da un vitigno + + + {*PLAYER*} è caduto fuori dall'acqua + + + Quando è disattivato, i blocchi non rilasciano oggetti quando vengono distrutti (ad esempio, i blocchi di pietra non rilasciano ciottoli). + + + Quando è disattivato, i giocatori non rigenerano naturalmente la salute. + + + Quando è disattivato, l'ora del giorno non cambia. + + + Carrello da miniera + + + Guinzaglio + + + Rilascia + + + Attacca + + + Smonta + + + Cassa attaccata + + + Lancia + + + Nome + + + Raggio + + + Potenza primaria + + + Potenza secondaria + + + Cavallo + + + Dropper + + + Hopper + + + {*PLAYER*} è caduto da un luogo alto + + + Impossibile usare l'uovo rigenerazione al momento. È stato raggiunto il numero massimo di pipistrelli nel mondo. + + + Questo animale non può entrare in "modalità Amore". Hai raggiunto il numero massimo di riproduzione di cavalli. + + + Opzioni di gioco + + + {*PLAYER*} è stato colpito con una palla di fuoco da {*SOURCE*} con {*ITEM*} + + + {*PLAYER*} è stato pestato a morte da {*SOURCE*} con {*ITEM*} + + + {*PLAYER*} è stato ucciso da {*SOURCE*} con {*ITEM*} + + + Scorrettezza nemici + + + Posa tessere + + + Rigenerazione naturale + + + Ciclo solare + + + Mantieni inventario + + + Rigenerazione nemici + + + Bottino nemici + + + {*PLAYER*} è stato colpito da un proiettile di {*SOURCE*} con {*ITEM*} + + + {*PLAYER*} è caduto troppo lontano ed è stato finito da {*SOURCE*} + + + {*PLAYER*} è caduto troppo lontano ed è stato finito da {*SOURCE*} con {*ITEM*} + + + {*PLAYER*} è entrato nel fuoco combattendo {*SOURCE*} + + + {*PLAYER*} è stato fatto cadere da {*SOURCE*} + + + {*PLAYER*} è stato fatto cadere da {*SOURCE*} + + + {*PLAYER*} è stato fatto cadere da {*SOURCE*} usando {*ITEM*} + + + {*PLAYER*} è stato cotto a puntino mentre combatteva {*SOURCE*} + + + {*PLAYER*} è stato fatto esplodere da {*SOURCE*} + + + {*PLAYER*} si è avvizzito + + + {*PLAYER*} è stato ucciso da {*SOURCE*} con {*ITEM*} + + + {*PLAYER*} ha tentato di nuotare nella lava per sfuggire a{*SOURCE*} + + + {*PLAYER*} è affogato mentre tentava di sfuggire a {*SOURCE*} + + + {*PLAYER*} si è scontrato con un cactus mentre tentava di sfuggire a {*SOURCE*} + + + Monta + + + + Per poter governare un cavallo, questo dev'essere munito di sella, che si può acquistare dagli abitanti o trovare nelle casse in giro per il mondo. + + + + + Gli asini e i muli addomesticati possono essere dotati di sacche attaccando una cassa. Tali sacche possono essere usati mentre si cavalca o chinandosi. + + + + + Cavalli e asini (ma non i muli) possono essere allevati come gli altri animali usando mela d'oro o carote d'oro. I puledri diventano col tempo cavalli adulti, me nutrendoli di grano o fieno la loro crescita accelera. + + + + + Cavalli, asini e muli devono essere addomesticati prima di essere usati. Un cavallo si addomestica tentando di cavalcarlo, e resistendo ai suoi tentativi di disarcionamento. + + + + + Una volta addomesticati, appariranno dei cuori intorno ad essi e non tenteranno più di disarcionare il cavaliere. + + + + + Prova a cavalcare un cavallo. Usa {*CONTROLLER_ACTION_USE*} senza oggetti né attrezzi in mano per montare. + + + + + Qui puoi provare ad addomesticare cavalli e asini, e là ci sono selle, armature per cavalli e altri utili oggetti per cavalli nelle casse qui in giro. + + + + + Un raggio con una piramide di almeno 4 livelli offre una opzione supplementare: potere secondario di Rigenerazione o potenziamento del potere primario. + + + + + Per impostare i poteri del tuo Raggio devi sacrificare uno smeraldo, un diamante, un lingotto d'oro o di ferro nello slot del pagamento. Una volta impostati, i poteri continueranno a essere emanati indefinitamente. + + + + In cima a questa piramide c'è un Raggio non attivo. + + + + Questa è l'interfaccia del Raggio, che puoi usare per scegliere i poteri forniti dal Raggio stesso. + + + + + {*B*}Premi{*CONTROLLER_VK_A*} per continuare. + {*B*}Premi{*CONTROLLER_VK_B*} se sai già come si usa l'interfaccia del Raggio. + + + + + Nel menu del Raggio puoi scegliere un potere primario per il tuo Raggio. Più livelli ha la tua piramide, più poteri hai tra cui scegliere. + + + + + Tutti i cavalli, asini e muli possono essere cavalcati. Ma solo i cavalli possono essere dotati di armatura, e solo asini e muli possono essere dotati di sacche per trasportare oggetti. + + + + + Questa è l'interfaccia inventario del cavallo. + + + + + {*B*}Premi{*CONTROLLER_VK_A*} per continuare. + {*B*}Premi{*CONTROLLER_VK_B*} se sai già come si usa l'inventario del cavallo. + + + + + L'inventario del cavallo ti permette di trasferire o equipaggiare oggetti sul tuo cavallo, asino o mulo. + + + + Scintillio + + + Scia + + + Durata in volo: + + + + Sella il cavallo mettendo una sella nell'apposito slot. Ai cavalli puoi mettere un'armatura mettendola nello slot dell'armatura. + + + + Hai trovato un mulo. + + + + {*B*}Premi{*CONTROLLER_VK_A*} per saperne di più su cavalli, asini e muli. + {*B*}Premi{*CONTROLLER_VK_B*} se sai già tutto su cavalli, asini e muli. + + + + + Cavalli e asini si trovano soprattutto nelle pianure. I muli possono essere allevati accoppiando cavalli e asini, ma sono sterili. + + + + + Puoi anche trasferire oggetti tra il tuo inventario e le sacche degli asini e dei muli in questo menu. + + + + Hai trovato un cavallo. + + + Hai trovato un asino. + + + + {*B*}Premi{*CONTROLLER_VK_A*} per saperne di più sui Raggi. + {*B*}Premi{*CONTROLLER_VK_B*} se sai già tutto sui Raggi. + + + + + Le Stelle di Fuochi artificiali si creano mettendo Polvere da sparo e Tintura nella griglia di creazione. + + + + + La tintura determina il colore dell'esplosione della Stella per fuochi artificiali. + + + + + La forma della stella si imposta aggiungendo una Scarica di fuoco, una Pepita d'oro, una piuma o una testa. + + + + + Puoi anche mettere diverse Stelle per Fuochi artificiali nella griglia di creazione, per aggiungerli al nuovo Fuoco artificiale. + + + + + Riempiendo più slot nella griglia di creazione con Polvere da sparo aumenterai l'altezza alla quale le Stelle esploderanno. + + + + + Ora puoi prendere il Fuoco artificiale dallo slot di uscita, quando desideri crearlo. + + + + + Si può aggiungere una scia di scintille usando Diamante e Polvere di pietre brillanti. + + + + + I Fuochi artificiali sono oggetti decorativi che possono essere lanciati a mano o mediante un Dispense. Sono creati usando Pepe, Polvere da sparo e un numero a scelta di Stelle per Fuochi artificiali + + + + Il colore, la dissolvenza, la forma, la dimensione e gli effetti (come scie e scintille) delle Stelle per fuochi artificiali possono essere personalizzati aggiungendo ingredienti durante la creazione. + + + + + Prova a creare un Fuoco artificiale al tavolo di creazione usando una serie di ingredienti nelle casse. + + + + + Dopo aver creato una Stella per fuochi artificiali, puoi impostare il colore della dissolvenza della Stella con la tintura. + + + + + Nelle ceste ci sono diversi oggetti usati nella creazione di FUOCHI ARTIFICIALI! + + + + + {*B*}Premi{*CONTROLLER_VK_A*} per saperne di più sui fuochi artificiali. + {*B*}Premi{*CONTROLLER_VK_B*} se sai già tutto sui fuochi artificiali. + + + + + Per creare un Fuoco artificiale metti Polvere da sparo e Carta nella griglia di creazione 3x3 in alto nel tuo inventario. + + + + Questa stanza contiene hopper + + + + {*B*}Premi{*CONTROLLER_VK_A*} per saperne di più sugli hopper. + {*B*}Premi{*CONTROLLER_VK_B*} se sai già tutto sugli hopper. + + + + + Gli hopper servono per mettere o togliere oggetti dai contenitori, e per raccogliere automaticamente oggetti lanciati dentro di essi. + + + + + I Raggi attivi proiettano un raggio luminoso nel cielo e donano poteri ai giocatori vicini. Essi sono creati mediante vetro, ossidiana e stelle del Sottomondo, ottenibili sconfiggendo gli Avvizziti. + + + + + I Raggi devono essere piazzati in modo da essere esposti al sole durante il giorno. Devono essere posizionati su piramidi di ferro, oro, smeraldo o diamante. Ma la scelta del materiale non ha effetto sulla potenza del raggio. + + + + + Prova a usare il Raggio per impostare i poteri, puoi usare i lingotti di ferro forniti come pagamento. + + + + + Funzionano con banchi di distillazione, casse, dispenser, dropper, carrelli da miniera con casse, carrelli da miniera con hopper e con altri hopper. + + + + + In questa stanza ci sono diverse soluzioni di hopper con cui sperimentare. + + + + + Questa è l'interfaccia dei Fuochi artificiali, che puoi usare per creare Fuochi artificiali e Stelle di Fuochi artificiali. + + + + + {*B*}Premi{*CONTROLLER_VK_A*} per continuare. + {*B*}Premi{*CONTROLLER_VK_B*} se sai già come si usa l'interfaccia dei Fuochi artificiali. + + + + + Gli hopper tentano continuamente di estrarre oggetti dai contenitori compatibili posti sopra di essi. Inoltre tentano di inserire gli oggetti immagazzinati nei contenitori di uscita. + + + + + Ma se un hopper è alimentato da pietra rossa, diventerà inattivo e smetterà di risucchiare e inserire gemme. + + + + + Un hopper punta nella direzione in cui tenta di far uscire oggetti. Per farlo puntare a un blocco particolare, piazzalo contro questo blocco mentre sei in furtività. + + + + Questi nemici si trovano nelle paludi e ti attaccano lanciando pozioni. Quando muoiono rilasciano pozioni. + + + Hai raggiunto il limite per i Telai di dipinti/oggetti di un mondo. + + + Non puoi generare nemici in modalità Relax. + + + Questo animale non può entrare in "modalità Amore". Hai raggiunto il numero massimo di maiali, pecore, mucche, gatti e cavalli. + + + Impossibile usare l'uovo generazione al momento. Hai raggiunto il numero massimo di calamari. + + + Impossibile usare l'uovo rigenerazione al momento. È stato raggiunto il numero massimo di nemici nel mondo. + + + Impossibile usare l'uovo rigenerazione al momento. È stato raggiunto il numero massimo di villici nel mondo. + + + Questo animale non può entrare in "modalità Amore". Hai raggiunto il numero massimo di riproduzione di lupi. + + + Hai raggiunto il numero massimo di teste di Mob in un mondo. + + + Inverti + + + Mancino + + + Questo animale non può entrare in "modalità Amore". Hai raggiunto il numero massimo di riproduzione di galline. + + + Questo animale non può entrare in "modalità Amore". Hai raggiunto il numero massimo di riproduzione di muccafunghi. + + + È stato raggiunto il numero massimo di navi per mondo. + + + Impossibile usare l'uovo generazione al momento. Hai raggiunto il numero massimo di galline. + + + {*C2*}Ora respira profondamente. Respira ancora. Senti l'aria nei polmoni. I tuoi arti stanno tornando. Sì, muovi le dita... Hai di nuovo un corpo, nell'aria, soggetto alla forza di gravità. Rigenerati nel lungo sogno. Eccoti. Il tuo corpo tocca ancora una volta l'universo, in tutti i suoi punti, come se foste cose separate. Come se noi fossimo entità separate.{*EF*}{*B*}{*B*} +{*C3*}Chi siamo? Un tempo eravamo chiamati gli spiriti della montagna. Padre Sole, Madre Luna. Spiriti ancestrali... Spiriti animali... Jinn, fantasmi. Poi l'uomo verde. E ancora dei, demoni, angeli... Spiriti, alieni, extraterrestri... Infine leptoni, quark... Le parole cambiano. Noi non cambiamo.{*EF*}{*B*}{*B*} +{*C2*}Noi siamo l'universo. Siamo tutto ciò che credi non sia te. Ora ci stai guardando, attraverso la tua pelle e i tuoi occhi. Perché l'universo sfiora la tua pelle e ti inonda di luce? Per guardarti, giocatore. Per conoscersi e per farsi conoscere. Voglio raccontarti una storia.{*EF*}{*B*}{*B*} +{*C2*}Un tempo c'era un giocatore...{*EF*}{*B*}{*B*} +{*C3*}Quel giocatore eri tu, {*PLAYER*}.{*EF*}{*B*}{*B*} +{*C2*}A volte il giocatore pensava di essere una creatura umana sulla sottile crosta di un globo rotante fatto di roccia fusa. Il globo di roccia fusa girava intorno a una sfera di gas fiammeggianti che era trecentotrentamila volte più grande di esso. La sfera era talmente distante dal globo che la luce impiegava otto minuti per viaggiare dall'una all'altro. La luce era informazione che veniva da una stella, e poteva bruciarti la pelle da una distanza di centocinquanta milioni di chilometri.{*EF*}{*B*}{*B*} +{*C2*}A volte il giocatore sognava di essere un minatore sulla superficie di un mondo piatto e infinito. Il sole era un quadrato bianco. I giorni erano brevi. C'era sempre molto da fare, e la morte non era altro che un inconveniente temporaneo.{*EF*}{*B*}{*B*} +{*C3*}A volte il giocatore credeva di essere parte di una storia.{*EF*}{*B*}{*B*} +{*C2*}A volte il giocatore sognava di essere altre cose in luoghi diversi. Alcuni di quei sogni erano sgradevoli, altri meravigliosi. Capitava anche che il giocatore si svegliasse da un sogno e si ritrovasse in un altro, per poi destarsi anche da quello e scoprirsi in un terzo sogno.{*EF*}{*B*}{*B*} +{*C3*}A volte il giocatore sognava di guardare delle parole su uno schermo.{*EF*}{*B*}{*B*} +{*C2*}Torniamo indietro.{*EF*}{*B*}{*B*} +{*C2*}Gli atomi del giocatore erano sparsi nell'erba, nei fiumi, nell'aria, nel suolo. Una donna raccolse gli atomi; li bevve, li mangiò, li respirò. La donna ricostruì il giocatore nel proprio corpo.{*EF*}{*B*}{*B*} +{*C2*}Il giocatore si svegliò dal caldo, buio mondo del corpo di sua madre e si ritrovò nel lungo sogno.{*EF*}{*B*}{*B*} +{*C2*}Il giocatore era una nuova storia, mai narrata prima, scritta con lettere di DNA. E il giocatore era un nuovo programma, mai eseguito prima, generato da un codice sorgente vecchio di miliardi di anni. E il giocatore era un nuovo essere umano, che non aveva mai vissuto prima, fatto solo di latte e amore.{*EF*}{*B*}{*B*} +{*C3*}Tu sei il giocatore. La storia. Il programma. L'essere umano. Sei fatto solo di latte e amore.{*EF*}{*B*}{*B*} +{*C2*}Torniamo ancora più indietro.{*EF*}{*B*}{*B*} +{*C2*}I sette miliardi di miliardi di miliardi di atomi che compongono il corpo del giocatore furono creati molto tempo prima di questo gioco, nel cuore di una stella. Quindi, anche il giocatore è informazione che proviene da una stella. Il giocatore si muove in una storia, che è una foresta di informazioni seminata da un uomo di nome Julian su un mondo piatto e infinito creato da un altro uomo chiamato Markus, che esiste nel piccolo mondo personale creato dal giocatore, che vive in un universo creato da...{*EF*}{*B*}{*B*} +{*C3*}Silenzio... A volte il giocatore creava il suo piccolo mondo personale, e lo faceva caldo, tenero, semplice. Altre volte lo faceva duro, freddo e complesso. A volte creava un modello dell'universo che aveva in mente, punti di energia che si muovono attraverso ampi spazi vuoti. A volte chiamava questi punti "elettroni" e "protoni".{*EF*}{*B*}{*B*} + + + {*C2*}A volte li chiamava "pianeti" e "stelle".{*EF*}{*B*}{*B*} +{*C2*}A volte credeva di esistere in un universo fatto di energia composta da serie di on e di off, di zero e di uno, di linee di codice. A volte credeva di giocare a un gioco. A volte credeva di leggere parole su uno schermo.{*EF*}{*B*}{*B*} +{*C3*}Tu sei il giocatore che legge le parole...{*EF*}{*B*}{*B*} +{*C2*}Silenzio... A volte il giocatore leggeva linee di codice su uno schermo, le scomponeva in parole e da esse ricavava un significato, che diventava sensazioni, emozioni, teorie e idee. Il giocatore iniziò a respirare più velocemente, più profondamente... Si era reso conto di essere vivo. Era vivo. Le migliaia di morti attraverso le quali era passato non erano reali. Il giocatore era vivo{*EF*}{*B*}{*B*} +{*C3*}Tu... Tu... sei... vivo.{*EF*}{*B*}{*B*} +{*C2*}E a volte il giocatore credeva che l'universo gli avesse parlato mediante i raggi di sole che filtravano tra le foglie ondeggianti sugli alberi d'estate...{*EF*}{*B*}{*B*} +{*C3*}E a volte il giocatore pensava che l'universo gli avesse parlato tramite la luce che cadeva dal limpido cielo delle notti invernali, quando un puntino luminoso nell'angolo del suo occhio poteva essere una stella milioni di volte più grande del sole, che trasformava i suoi pianeti in plasma incandescente per essere visibile per un solo istante al giocatore, che tornava a casa, dall'altro lato dell'universo, e sentiva il profumo dei cibi sulla porta a lui familiare, poco prima di rimettersi a sognare.{*EF*}{*B*}{*B*} +{*C2*}E a volte il giocatore credeva che l'universo gli avesse parlato con serie di zero e di uno, attraverso l'elettricità del mondo, con le parole che comparivano su uno schermo alla fine di un sogno.{*EF*}{*B*}{*B*} +{*C3*}L'universo gli diceva "ti amo"...{*EF*}{*B*}{*B*} +{*C2*}E l'universo gli diceva "hai giocato bene"...{*EF*}{*B*}{*B*} +{*C3*}E l'universo gli diceva "tutto ciò di cui hai bisogno è dentro di te"...{*EF*}{*B*}{*B*} +{*C2*}E l'universo gli diceva "sei più forte di quanto tu creda"...{*EF*}{*B*}{*B*} +{*C3*}E l'universo gli diceva "sei la luce del giorno"...{*EF*}{*B*}{*B*} +{*C2*}E l'universo gli diceva "tu sei la notte"...{*EF*}{*B*}{*B*} +{*C3*}E l'universo gli diceva "l'oscurità che combatti è dentro di te"...{*EF*}{*B*}{*B*} +{*C2*}E l'universo gli diceva "la luce che cerchi è dentro di te"...{*EF*}{*B*}{*B*} +{*C3*}E l'universo gli diceva "non sei solo"...{*EF*}{*B*}{*B*} +{*C2*}E l'universo gli diceva "tu non sei separato da tutte le altre cose"...{*EF*}{*B*}{*B*} +{*C3*}E l'universo gli diceva "tu sei l'universo che assapora sé stesso, che parla a sé stesso, che legge il proprio codice"...{*EF*}{*B*}{*B*} +{*C2*}E l'universo gli diceva "ti amo perché tu sei amore"...{*EF*}{*B*}{*B*} +{*C3*}E il gioco terminò, e il giocatore si svegliò dal sogno. Il giocatore iniziò un nuovo sogno, migliore del precedente. Il giocatore era l'universo. Il giocatore era amore.{*EF*}{*B*}{*B*} +{*C3*}Tu sei il giocatore.{*EF*}{*B*}{*B*} +{*C2*}Svegliati.{*EF*} + + + Resetta Sottomondo + + + %s si trova ora nel Limite + + + %s ha lasciato il Limite + + + {*C3*}Ho capito a quale giocatore ti riferisci.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}?{*EF*}{*B*}{*B*} +{*C3*}Sì. Fai attenzione. Ha raggiunto un livello superiore. Può leggere le nostre menti.{*EF*}{*B*}{*B*} +{*C2*}Non importa. Crede che siamo parte del gioco.{*EF*}{*B*}{*B*} +{*C3*}Mi piace, questo giocatore. Ha giocato bene. Non si è arreso.{*EF*}{*B*}{*B*} +{*C2*}Sta leggendo i nostri pensieri come se fossero parole su uno schermo.{*EF*}{*B*}{*B*} +{*C3*}È così che riesce a immaginare molte cose, quando è immerso nel sogno di un gioco.{*EF*}{*B*}{*B*} +{*C2*}Le parole sono un'interfaccia meravigliosa, estremamente flessibile e molto meno spaventosa del guardare la realtà oltre lo schermo.{*EF*}{*B*}{*B*} +{*C3*}Prima erano soliti ascoltare voci. Prima i giocatori erano in grado di leggere. Un tempo, chi non giocava chiamava i giocatori "streghe" e "stregoni", e i giocatori sognavano di volare su bastoni alimentati dall'energia dei demoni.{*EF*}{*B*}{*B*} +{*C2*}Cosa sognava questo giocatore?{*EF*}{*B*}{*B*} +{*C3*}Sognava la luce del sole, gli alberi... Sognava l'acqua e il fuoco... Sognava di creare, e sognava di distruggere... Sognava di cacciare e di essere preda... Sognava un riparo.{*EF*}{*B*}{*B*} +{*C2*}Ah, l'interfaccia originale... È vecchia di un milione di anni, ma ancora funziona. Ma quale vera struttura ha creato questo giocatore, nella realtà oltre lo schermo?{*EF*}{*B*}{*B*} +{*C3*}Ha funzionato, con oltre un milione di altri individui, per scolpire un vero mondo in una piega di {*EF*}{*NOISE*}{*C3*}, e ha creato {*EF*}{*NOISE*}{*C3*} per {*EF*}{*NOISE*}{*C3*}, in {*EF*}{*NOISE*}{*C3*}.{*EF*}{*B*}{*B*} +{*C2*}Non può leggere quel pensiero.{*EF*}{*B*}{*B*} +{*C3*}No. Non ha ancora raggiunto il livello più alto. Deve arrivarci nel lungo sogno della vita, non nella brevità di un gioco.{*EF*}{*B*}{*B*} +{*C2*}Sa che lo amiamo? Che l'universo è buono?{*EF*}{*B*}{*B*} +{*C3*}A volte, attraverso il rumore dei suoi pensieri, egli ascolta l'universo, sì.{*EF*}{*B*}{*B*} +{*C2*}Capita, però, che nel lungo sogno sia triste. Crea mondi senza estate, trema sotto un sole nero, e crede che la sua triste creazione sia la realtà.{*EF*}{*B*}{*B*} +{*C3*}Se lo guarissimo dal dolore lo distruggeremmo. Il dolore è parte del suo compito personale. Noi non possiamo interferire.{*EF*}{*B*}{*B*} +{*C2*}A volte, quando sognano profondamente, vorrei dire loro che in realtà stanno costruendo dei veri mondi. Vorrei svelare l'importanza che essi hanno per l'universo. E quando non hanno effettuato un vero collegamento per molto tempo, vorrei aiutarli a pronunciare la parola che temono.{*EF*}{*B*}{*B*} +{*C3*}Legge i nostri pensieri.{*EF*}{*B*}{*B*} +{*C2*}Non me ne importa. Certe volte vorrei dire loro che questo mondo che ritengono reale è solo {*EF*}{*NOISE*}{*C2*} e {*EF*}{*NOISE*}{*C2*}. Mi piacerebbe dire loro che sono {*EF*}{*NOISE*}{*C2*} nel {*EF*}{*NOISE*}{*C2*}. Vedono una parte minuscola della realtà, nel loro lungo sogno...{*EF*}{*B*}{*B*} +{*C3*}Eppure, essi continuano a giocare.{*EF*}{*B*}{*B*} +{*C2*}Sarebbe così facile dire tutto...{*EF*}{*B*}{*B*} +{*C3*}La rivelazione sarebbe troppo forte per questo sogno. Dire come vivere impedirebbe loro di vivere.{*EF*}{*B*}{*B*} +{*C2*}Non dirò al giocatore come vivere.{*EF*}{*B*}{*B*} +{*C3*}Il giocatore si sta inquietando.{*EF*}{*B*}{*B*} +{*C2*}Narrerò una storia al giocatore.{*EF*}{*B*}{*B*} +{*C3*}Ma non racconterò la verità.{*EF*}{*B*}{*B*} +{*C2*}No. Sarà una storia che conterrà la verità in modo sicuro, protetta da una gabbia di parole. Non dirò la cruda verità che può bruciare a qualsiasi distanza.{*EF*}{*B*}{*B*} +{*C3*}Dagli di nuovo un corpo.{*EF*}{*B*}{*B*} +{*C2*}Sì. Giocatore...{*EF*}{*B*}{*B*} +{*C3*}Usa il suo nome.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}. Giocatore.{*EF*}{*B*}{*B*} +{*C3*}Bene.{*EF*}{*B*}{*B*} + + + Ripristinare le impostazioni iniziali del Sottomondo in questo salvataggio? Tutto ciò che hai creato nel Sottomondo andrà perso! + + + Impossibile usare l'uovo generazione al momento. Hai raggiunto il numero massimo di maiali, pecore, mucche, gatti e cavalli. + + + Impossibile usare l'uovo generazione al momento. Hai raggiunto il numero massimo di muccafunghi. + + + Impossibile usare l'uovo generazione al momento. Hai raggiunto il numero massimo di lupi. + + + Resetta il Sottomondo + + + Non resettare il Sottomondo + + + Impossibile tosare il muccafungo al momento. Hai raggiunto il numero massimo di maiali, pecore, mucche, gatti e cavalli. + + + Sei morto! + + + Opzioni mondo + + + Può costruire e scavare + + + Può usare porte e interruttori + + + Genera strutture + + + Mondo superpiatto + + + Cassa bonus + + + Può aprire contenitori + + + Espelli giocatore + + + Può volare + + + Disabilita stanchezza + + + Può attaccare i giocatori + + + Può attaccare gli animali + + + Moderatore + + + Privilegi dell'host + + + Come giocare + + + Comandi + + + Impostazioni + + + Rigenerati + + + Offerte contenuto scaricabile + + + Cambia skin + + + Riconoscimenti + + + Esplosione TNT + + + Giocatore vs Giocatore + + + Autorizza giocatori + + + Reinstalla contenuto + + + Impostazioni debug + + + Diffusione incendio + + + Drago di Ender + + + Un Drago di Ender ha ucciso {*PLAYER*} con il suo alito + + + {*PLAYER*} è stato ucciso da {*SOURCE*} + + + {*PLAYER*} è stato ucciso da {*SOURCE*} + + + {*PLAYER*} è morto + + + {*PLAYER*} è saltato in aria + + + {*PLAYER*} è stato ucciso dalla magia + + + {*PLAYER*} è stato colpito da un proiettile di {*SOURCE*} + + + Nebbia substrato roccioso + + + Mostra interfaccia + + + Mostra mano + + + {*PLAYER*} è stato colpito con una palla di fuoco da {*SOURCE*} + + + {*PLAYER*} è stato pestato a morte da {*SOURCE*} + + + {*PLAYER*} è stato ucciso da {*SOURCE*} con la magia + + + {*PLAYER*} è caduto fuori dal mondo + + + Pacchetti Texture + + + Pacchetti Mash-Up + + + {*PLAYER*} ha preso fuoco + + + Temi + + + Immagini del giocatore + + + Oggetti avatar + + + {*PLAYER*} è bruciato vivo + + + {*PLAYER*} è morto di fame + + + {*PLAYER*} è morto in seguito a una puntura + + + {*PLAYER*} si è schiantato al suolo + + + {*PLAYER*} ha cercato di nuotare nella lava + + + {*PLAYER*} è soffocato dentro un muro + + + {*PLAYER*} è affogato + + + Messaggi di morte + + + Non sei più un moderatore + + + Ora puoi volare + + + Non puoi più volare + + + Non puoi più attaccare gli animali + + + Ora puoi attaccare gli animali + + + Ora sei un moderatore + + + Non sentirai più la stanchezza + + + Ora sei invulnerabile + + + Non sei più invulnerabile + + + %d MSP + + + Ora sentirai la stanchezza + + + Ora sei invisibile + + + Non sei più invisibile + + + Ora puoi attaccare i giocatori + + + Ora puoi scavare e usare oggetti + + + Non puoi più posizionare blocchi + + + Ora puoi posizionare blocchi + + + Personaggio animato + + + Animaz. skin personalizzata  + + + Non puoi più scavare né usare oggetti + + + Ora puoi usare porte e interruttori + + + Non puoi più attaccare i nemici + + + Ora puoi attaccare i nemici + + + Non puoi più attaccare i giocatori + + + Non puoi più usare porte e interruttori + + + Ora puoi usare contenitori (es. casse) + + + Non puoi più usare contenitori (es. casse) + + + Invisibile + + + Raggi + + + {*T3*}COME SI GIOCA: RAGGI{*ETW*}{*B*}{*B*} +I Raggi attivi proiettano un raggio luminoso nel cielo e donano poteri ai giocatori vicini.{*B*} +Essi sono creati mediante vetro, ossidiana e stelle del Sottomondo, ottenibili sconfiggendo gli Avvizziti.{*B*}{*B*} +I Raggi devono essere piazzati in modo da essere esposti al sole durante il giorno. Devono essere posizionati su piramidi di ferro, oro, smeraldo o diamante.{*B*} +La scelta del materiale non ha effetto sulla potenza del raggio.{*B*}{*B*} +Nel menu del Raggio puoi scegliere un potere primario per il tuo Raggio. Più livelli ha la tua piramide, più poteri hai tra cui scegliere.{*B*} +Un raggio con una piramide di almeno 4 livelli offre una opzione supplementare: potere secondario di Rigenerazione o potenziamento del potere primario.{*B*}{*B*} +Per impostare i poteri del tuo Raggio devi sacrificare uno smeraldo, un diamante, un lingotto d'oro o di ferro nello slot del pagamento.{*B*} +Una volta impostati, i poteri continueranno a essere emanati indefinitamente.{*B*} + + + + Fuochi artificiali + + + Lingue + + + Cavalli + + + {*T3*}COME SI GIOCA: CAVALLI{*ETW*}{*B*}{*B*} +Cavalli e asini si trovano soprattutto nelle pianure. I muli possono essere allevati accoppiando cavalli e asini, ma sono sterili.{*B*} +Tutti i cavalli, asini e muli possono essere cavalcati. Ma solo i cavalli possono essere dotati di armatura, e solo asini e muli possono essere dotati di sacche per trasportare oggetti.{*B*}{*B*} +Cavalli, asini e muli devono essere addomesticati prima di essere usati. Un cavallo si addomestica tentando di cavalcarlo, e resistendo ai suoi tentativi di disarcionamento.{*B*} +Una volta addomesticati, appariranno dei cuori intorno ad essi e non tenteranno più di disarcionare il cavaliere. Per poter governare un cavallo, questo dev'essere munito di sella.{*B*}{*B*} +Una sella che si può acquistare dagli abitanti o trovare nelle casse in giro per il mondo.{*B*} +Gli asini e i muli addomesticati possono essere dotati di sacche chinandosi e attaccando una cassa. Tali sacche possono essere usate mentre si cavalca o chinandosi.{*B*}{*B*} +Cavalli e asini (ma non i muli) possono essere allevati come gli altri animali usando mele d'oro o carote d'oro.{*B*} +I puledri diventano col tempo cavalli adulti, me nutrendoli di grano o fieno la loro crescita accelera.{*B*} + + + + {*T3*}COME SI GIOCA: FUOCHI ARTIFICIALI{*ETW*}{*B*}{*B*} +I Fuochi artificiali sono oggetti decorativi che possono essere lanciati a mano o mediante un Dispense. Sono creati usando Pepe, Polvere da sparo e un numero a scelta di Stelle per Fuochi artificiali{*B*} +Il colore, la dissolvenza, la forma, la dimensione e gli effetti (come scie e scintille) delle Stelle per fuochi artificiali possono essere personalizzati aggiungendo ingredienti durante la creazione.{*B*}{*B*} +Per creare un Fuoco artificiale metti Polvere da sparo e Carta nella griglia di creazione 3x3 in alto nel tuo inventario.{*B*} +Puoi anche mettere diverse Stelle per Fuochi artificiali nella griglia di creazione, per aggiungerli al nuovo Fuoco artificiale.{*B*} +Riempiendo più slot nella griglia di creazione con Polvere da sparo aumenterai l'altezza alla quale le Stelle esploderanno.{*B*}{*B*} +FNe Stelle di Fuochi artificiali si creano mettendo Polvere da sparo e Tintura nella griglia di creazione.{*B*} +- La tintura determina il colore dell'esplosione.{*B*} +- La forma della stella si imposta aggiungendo una Scarica di fuoco, una Pepita d'oro, una piuma o una testa.{*B*} +- Si può aggiungere una scia di scintille usando Diamante e Polvere di pietre brillanti.{*B*}{*B*} +Dopo aver creato una Stella per fuochi artificiali, puoi impostare il colore della dissolvenza della Stella con la tintura. + + + + {*T3*}COME SI GIOCA: DROPPER{*ETW*}{*B*}{*B*} +Quando viene alimentato dalla pietra rossa, il Dropper fa scendere un oggetto a caso tra quelli che contiene. Usa {*CONTROLLER_ACTION_USE*} per aprire il Dropper così da poterlo caricare con oggetti del tuo inventario.{*B*} +Se il Dropper è direzionato verso una Cassa o un altro contenitore, l'oggetto verrà introdotto in esso. Si possono costruire lunghe catene di Dropper per trasportare oggetti a distanza. per fare ciò essi devono essere accesi e spenti alternativamente. + + + + Quando viene usato, diventa una mappa della parte di mondo in cui ti trovi, che viene scoperta mano a mano che esplori. + + + Rilasciato da Avvizzito, usato per creare Raggi. + + + Hopper + + + {*T3*}COME SI GIOCA: HOPPER{*ETW*}{*B*}{*B*} +Gli hopper servono per mettere o togliere oggetti dai contenitori, e per raccogliere automaticamente oggetti lanciati dentro di essi.{*B*} +Funzionano con banchi di distillazione, casse, dispenser, dropper, carrelli da miniera con casse, carrelli da miniera con hopper e con altri hopper.{*B*}{*B*} +Gli hopper tentano continuamente di estrarre oggetti dai contenitori compatibili posti sopra di essi. Inoltre tentano di inserire gli oggetti immagazzinati nei contenitori di uscita.{*B*} +Se un hopper è alimentato da pietra rossa, diventerà inattivo e smetterà di risucchiare e inserire gemme.{*B*}{*B*} +Un hopper punta nella direzione in cui tenta di far uscire oggetti. Per farlo puntare a un blocco particolare, piazzalo contro questo blocco mentre sei in furtività.{*B*} + + + + Dropper + + + NON USATA + + + Guarigione istantanea + + + Danno istantaneo + + + Salto potenziato + + + Fatica del minatore + + + Forza + + + Debolezza + + + Nausea + + + NON USATA + + + NON USATA + + + NON USATA + + + Rigenerazione + + + Resistenza + + + Ricerca di un Seme per il Generatore di mondi. + + + Quando è attivato, crea esplosioni colorate. Il colore, l'effetto, la forma e la dissolvenza sono determinati dalla Stella dei Fuochi Artificiali usata quando vengono creati i Fuochi Artificiali. + + + Un tipo di binario che può attivare o disattivare carrelli da miniera con hopper e innescare carrelli da miniera con TNT. + + + Si usa per conservare e distribuire oggetti, o mettere oggetti in un altro contenitore, quando riceve una carica di pietra rossa. + + + Blocchi colorati realizzati tingendo argilla indurita. + + + Fornisce una carica di pietra rossa. La carica sarà maggiore se ci sono più oggetti sul piatto. Richiede più peso di una piastra leggera. + + + Usato come fonte di energia per la pietra rossa. Può essere ritrasformato in pietra rossa. + + + Serve a catturare oggetti o a trasferirli da e verso i contenitori. + + + Cibo per cavalli, asini e muli che cura fino a 10 cuori. Accelera la crescita dei puledri. + + + Pipistrello + + + Queste creature volanti si trovano nelle caverne e in altri grandi spazi chiusi. + + + Strega + + + Risultato della cottura dell'argilla in una fornace. + + + Creata a partire da vetro e vernice. + + + Creata a partire da vetro dipinto + + + Fornisce una carica di pietra rossa. La carica sarà maggiore se ci sono più oggetti sul piatto. + + + È un blocco che emette un segnale di pietra rossa basato sulla luce del sole (o sulla mancanza della stessa). + + + È un tipo speciale di carrello da miniera che funziona come un hopper. Raccoglie oggetti dai binari e dai contenitori soprastanti. + + + Un tipo speciale di armatura che può essere indossata da un cavallo. Fornisce 5 Armatura. + + + Usati per determinare il colore, l'effetto e la forma di un fuoco artificiale. + + + Usato nei circuiti di pietra rossa per mantenere, comparare o sottrarre forza al segnale, o misurare gli stati di certi blocchi. + + + È un tipo di carrello da miniera che agisce come un blocco di TNT semovente. + + + Un tipo speciale di armatura che può essere indossata da un cavallo. Fornisce 7 Armatura. + + + Serve per eseguire comandi. + + + Proietta un raggio di luce nel cielo e può causare effetti di stato ai giocatori vicini. + + + Vi si possono conservare blocchi e oggetti. Colloca due casse una accanto all'altra per creare una cassa grande dalla capacità doppia. La cassa intrappolata inoltre crea una pietra rossa quando viene aperta. + + + Un tipo speciale di armatura che può essere indossata da un cavallo. Fornisce 11 Armatura. + + + Usato per legare nemici al giocatore o pali di recinzione. + + + Serve a dare nomi ai nemici. + + + Fretta + + + Sblocca gioco completo + + + Riprendi gioco + + + Salva gioco + + + Gioca + + + Classifiche + + + Guida e opzioni + + + Difficoltà: + + + PvP: + + + Autorizza giocatori: + + + TNT: + + + Tipo di gioco: + + + Strutture: + + + Tipo di livello: + + + Nessuna partita trovata + + + Solo invito + + + Altre opzioni + + + Carica + + + Opzioni host + + + Giocatori/Invito + + + Partita online + + + Nuovo mondo + + + Giocatori + + + Unisciti alla partita + + + Avvia gioco + + + Nome mondo + + + Seme per generatore mondo + + + Lascia vuoto per seme casuale + + + Diffusione incendio: + + + Modifica messaggio cartello: + + + Inserisci i dettagli del tuo screenshot + + + Didascalia + + + Aiuti contestuali del gioco + + + 2 gioc. schermo diviso verticale + + + Fatto + + + Screenshot del gioco + + + Nessun effetto + + + Velocità + + + Lentezza + + + Modifica messaggio cartello: + + + Texture, icone e interfaccia classiche di Minecraft! + + + Mostra tutti i mondi Mash-up + + + Aiuti + + + Reinstalla oggetto avatar 1 + + + Reinstalla oggetto avatar 2 + + + Reinstalla oggetto avatar 3 + + + Reinstalla tema + + + Reinstalla immagine del giocatore 1 + + + Reinstalla immagine del giocatore 2 + + + Opzioni + + + Interfaccia utente + + + Ripristina predefinite + + + Vedi bobbing + + + Audio + + + Comando + + + Grafica + + + Si usa come ingrediente di pozioni. Viene deposta dai Ghast quando muoiono. + + + Viene deposta dagli Uomini-maiale zombie quando muoiono. Gli Uomini-maiale zombie si trovano nel Sottomondo. Si usa come ingrediente per pozioni. + + + Si usa come ingrediente di pozioni. Cresce spontaneamente nelle Fortezze del Sottomondo. Si può piantare anche nelle Sabbie mobili. + + + Superficie scivolosa. Si trasforma in acqua se si trova sopra un altro blocco quando questo viene distrutto. Si scioglie se è vicino a una fonte di luce o se viene messo nel Sottomondo. + + + Si può usare come decorazione. + + + Si usa come ingrediente di pozioni e per individuare Fortezze. Viene abbandonata dalle Vampe che si trovano nei pressi delle Fortezze del Sottomondo o al loro interno. + + + Può avere effetti diversi a seconda dell'oggetto su cui viene usata. + + + Si usa come ingrediente di pozioni o insieme ad altri oggetti per creare l'Occhio di Ender o la Crema di magma. + + + Si usa come ingrediente di pozioni. + + + Si usa per produrre pozioni e pozioni bomba. + + + Può essere riempita d'acqua e usata come ingrediente di base per preparare pozioni nel Banco di distillazione. + + + Cibo velenoso e ingrediente per pozioni tossiche. Viene deposto dai Ragni o Ragni delle grotte uccisi dal giocatore. + + + Si usa come ingrediente di pozioni, soprattutto nelle pozioni con effetti negativi. + + + Una volta posizionato, cresce nel corso del tempo. Si può raccogliere usando le forbici. Ci si può salire come su una scala. + + + Simile a una porta, ma usato principalmente nelle recinzioni. + + + Può essere creata usando Fette di anguria. + + + Blocchi trasparenti che possono essere usati come alternativa ai blocchi di vetro. + + + Quando è alimentato (attraverso un pulsante, una leva, una piastra a pressione, una torcia pietra rossa o pietra rossa con uno qualsiasi di questi), se possibile il pistone si estende e spinge i blocchi. Quando si ritrae, tira anche il blocco a contatto con la parte estesa del pistone. + + + Creato utilizzando blocchi di pietra. Si trova comunemente nelle fortezze. + + + Si usa come barriera, analogamente alle recinzioni. + + + Si possono piantare per far crescere delle zucche. + + + Si può usare per costruire e decorare. + + + Attraversarla rallenta i movimenti. Può essere distrutta con le forbici per raccogliere corda. + + + Genera un Pesciolino d'argento quando viene distrutto. Può anche generare un Pesciolino d'argento se nelle vicinanze c'è un altro Pesciolino d'argento sotto attacco. + + + Si possono piantare per far crescere delle angurie. + + + Viene deposta dagli Enderman quando muoiono. Lanciando la Perla di Ender, il giocatore verrà teletrasportato nel punto in cui essa atterra, ma perderà un po' di salute. + + + Un blocco di terra coperto d'erba. Si ottiene con la pala. Si può usare per la costruzione. + + + Può essere riempito d'acqua con la pioggia o usando un secchio e quindi utilizzato per riempire Bottiglie di vetro. + + + Si usa per creare scale lunghe. Due lastre una sopra l'altra creano un blocco doppio di dimensioni normali. + + + Creato dalla fusione della Sottogriglia nella fornace. Può generare blocchi di mattoni del Sottomondo. + + + Se alimentate, emettono una luce. + + + Simile a un espositore, mostra l'oggetto o il blocco messo al suo interno. + + + Quando è lanciato può generare una creatura del tipo indicato. + + + Si usa per creare scale lunghe. Due lastre una sopra l'altra creano un blocco doppio di dimensioni normali. + + + Può essere coltivato per raccogliere Semi di cacao. + + + Mucca + + + Rilascia pelle quando viene uccisa. Si può anche mungere usando un secchio. + + + Pecora + + + Le teste di Mob si possono collocare come decorazioni o indossare come maschere nello slot per l'elmo. + + + Calamaro + + + Rilascia sacche di inchiostro quando viene ucciso. + + + Utile per appiccare il fuoco alle cose, o per scatenare incendi quando viene lanciata da un dispenser. + + + Galleggia e può essere usata per guadare un corso d'acqua. + + + Si usa per costruire Fortezze del Sottomondo. È immune alle palle di fuoco lanciate dai Ghast. + + + Si usa nelle Fortezze del Sottomondo. + + + Quando viene lanciato, l'Occhio di Ender mostra la posizione di un Portale del Limite. Dodici Occhi inseriti nel Telaio di un portale del Limite attivano il Portale stesso. + + + Si usa come ingrediente di pozioni. + + + Simili ai blocchi Erba, questi blocchi sono ideali come terreno di coltura per i funghi. + + + Si trova nelle Fortezze del Sottomondo. Quando viene distrutto, rilascia una Verruca del Sottomondo. + + + Un tipo di blocco che si trova nel Limite. Estremamente resistente alle esplosioni, è molto utile per costruire. + + + Questo blocco si crea dopo aver sconfitto il Drago nel Limite. + + + Quando viene lanciata, lascia cadere delle sfere Esperienza; raccogliendole, il giocatore può aumentare i propri punti Esperienza. + + + Permette al giocatore di incantare spade, piccozze, asce, pale, archi e armature usando i punti Esperienza guadagnati. + + + Si attiva usando dodici Occhi di Ender e permette di raggiungere la dimensione Limite. + + + Si usa per costruire un Portale del Limite. + + + Quando è alimentato (attraverso un pulsante, una leva, una piastra a pressione, una torcia pietra rossa o pietra rossa con uno qualsiasi di questi), se possibile il pistone si estende e spinge i blocchi. + + + Risultato della cottura dell'argilla in una fornace. + + + Si inserisce nella fornace per creare mattoni. + + + Quando viene rotta, rilascia delle sfere di argilla che possono essere cotte in una fornace per creare dei mattoni. + + + Si abbatte con l'ascia e si può tagliare in assi o usare come combustibile. + + + Si crea nella fornace fondendo la sabbia. Si può usare per la costruzione, ma si rompe se cerchi di prenderlo. + + + Si estrae dalla pietra usando la piccozza. Si può usare per costruire una fornace o attrezzi di pietra. + + + Per conservare le palle di neve in poco spazio. + + + Si usa con la ciotola per fare la zuppa. + + + Si scava solo con una piccozza di diamante. Nasce dall'incontro tra acqua e lava e si usa per creare portali. + + + Genera mostri nel mondo. + + + Si può scavare con una pala per creare palle di neve. + + + Può produrre semi di grano quando viene tagliato/a. + + + Si usa per creare tinture. + + + Si ottiene con la pala. A volte produce la selce. Subisce la gravità se sotto non ci sono altri blocchi. + + + Si scava con una piccozza per ottenere carbone. + + + Si scava con una piccozza di pietra o migliore per ottenere lapislazzuli. + + + Si scava con una piccozza di ferro o migliore per ottenere diamanti. + + + Si usa come decorazione. + + + Si scava con una piccozza di ferro o migliore, poi si fonde nella fornace per produrre lingotti d'oro. + + + Si scava con una piccozza di pietra o migliore, poi si fonde nella fornace per produrre lingotti di ferro. + + + Si scava con una piccozza di ferro o migliore per ottenere polvere di pietra rossa. + + + Non si rompe. + + + Dà fuoco a qualsiasi cosa tocca. Si può raccogliere in un secchio. + + + Si ottiene con la pala. Si fonde in vetro usando la fornace. Subisce la gravità se sotto non ci sono altri blocchi. + + + Si scava con una piccozza per ottenere ciottoli. + + + Si ottiene con la pala. Si può usare per la costruzione. + + + Si può piantare per far crescere un albero. + + + Si posa a terra per condurre elettricità. Quando viene incluso in una pozione aumenta la durata dell'effetto. + + + Si ottiene uccidendo una mucca e si usa per creare un'armatura o per fare libri. + + + Si ottiene uccidendo uno slime e si usa come ingrediente per pozioni o per fare pistoni appiccicosi. + + + Viene deposto casualmente dalle galline e si può usare per creare cibi. + + + Si ottiene scavando nella ghiaia e si può usare per creare acciarino e pietra focaia. + + + Si usa su un maiale per poterlo cavalcare. Il maiale può poi essere controllato usando una carota su un bastone. + + + Si ottiene scavando nella neve e si può lanciare. + + + Si ottiene estraendo la pietra luce e si può usare per creare blocchi di pietra luce o mettendolo nelle pozione per aumentare la potenza dell'effetto. + + + Quando si rompono, a volte fanno cadere un arbusto che può essere trapiantato per far crescere un albero. + + + Si trova nei sotterranei. Si può usare per costruire e decorare. + + + Si usa per ottenere lana dalle pecore e ottenere blocchi foglia. + + + Si ottiene uccidendo uno scheletro. Si usa per produrre farina d'ossa. Può essere dato in pasto a un lupo per ammansirlo. + + + Si ottiene facendo uccidere un creeper da uno scheletro. Si può suonare in un jukebox. + + + Spegne il fuoco e favorisce la crescita delle colture. Si può raccogliere in un secchio. + + + Si ottiene dalle colture e si può usare per creare cibo. + + + Si può usare per produrre zucchero. + + + Si può indossare come elmo o unire a una torcia per creare una zucca di Halloween. Inoltre è l'ingrediente principale della torta di zucca. + + + Una volta accesa, brucia per sempre. + + + Le colture si possono mietere per ottenere grano. + + + Terreno pronto per piantare semi. + + + Si può cuocere in fornace per produrre tintura verde. + + + Rallenta il movimento di qualsiasi cosa ci passi sopra. + + + Si ottiene uccidendo una gallina e si usa per creare una freccia. + + + Si ottiene uccidendo un creeper e si usa per creare del TNT o come ingrediente per le pozioni. + + + Si possono piantare e coltivare su una zolla. Assicurati che vi sia luce a sufficienza per far crescere i semi! + + + Entra nel portale per spostarti tra il Sopramondo e il Sottomondo. + + + Si usa come combustibile per la fornace o per creare una torcia. + + + Si ottiene uccidendo un ragno e si usa per creare un arco o una canna da pesca, o messo a terra per creare un gancio allarme. + + + Rilascia lana quando viene tosata (se non è già stata tosata). Si può creare lana di vari colori usando le tinture. + + + Business Development + + + Portfolio Director + + + Product Manager + + + Development Team + + + Release Management + + + Director, XBLA Publishing + + + Marketing + + + Asia Localization Team + + + User Research Team + + + MGS Central Teams + + + Community Manager + + + Europe Localization Team + + + Redmond Localization Team + + + Design Team + + + Director of Fun + + + Music and Sounds + + + Programming + + + Chief Architect + + + Art Developer + + + Game Crafter + + + Art + + + Producer + + + Test Lead + + + Lead Tester + + + QA + + + Executive Producer + + + Lead Producer + + + Milestone Acceptance Tester + + + Pala di ferro + + + Pala di diamante + + + Pala d'oro + + + Spada d'oro + + + Pala di legno + + + Pala di pietra + + + Piccozza di legno + + + Piccozza d'oro + + + Ascia di legno + + + Ascia di pietra + + + Piccozza di pietra + + + Piccozza di ferro + + + Piccozza di diamante + + + Spada di diamante + + + SDET + + + Project STE + + + Additional STE + + + Special Thanks + + + Test Manager + + + Senior Test Lead + + + Test Associates + + + Spada di legno + + + Spada di pietra + + + Spada di ferro + + + Jon Kågström + + + Tobias Möllstam + + + Risë Lugo + + + Developer + + + Ti lancia sfere di fuoco che esplodono al contatto. + + + Slime + + + Se danneggiato, si divide in slime più piccoli. + + + Uomo-maiale zombie + + + Inizialmente docile, ma se ne colpisci uno verrai attaccato da un gruppo. + + + Ghast + + + Enderman + + + Ragno delle grotte + + + Il suo morso è velenoso. + + + Muccafungo + + + Ti attacca se lo guardi. Può anche spostare blocchi. + + + Pesciolino d'argento + + + Quando viene attaccato, attira tutti i Pesciolini d'argento nascosti nei dintorni. Si nasconde nei blocchi di pietra. + + + Ti attacca quando ti avvicini. + + + Rilascia costolette quando viene ucciso. Si può cavalcare usando una sella. + + + Lupo + + + Docile finché non viene attaccato, nel qual caso reagisce. Si può domare usando le ossa, che lo convincono a seguirti e ad attaccare i tuoi nemici. + + + Gallina + + + Rilascia piume quando viene uccisa, inoltre a volte depone le uova. + + + Maiale + + + Creeper + + + Ragno + + + Ti attacca quando ti avvicini. Può arrampicarsi sui muri. Rilascia un pungiglione quando viene ucciso. + + + Zombie + + + Esplode se ti avvicini troppo! + + + Scheletro + + + Ti scocca contro delle frecce. Rilascia delle frecce quando viene ucciso. + + + Si usa con una Ciotola per preparare la Zuppa di funghi. Deposita funghi e diventa una mucca normale quando viene tosata. + + + Original Design and Code by + + + Project Manager/Producer + + + Rest of Mojang Office + + + Concept Artist + + + Number Crunching and Statistics + + + Bully Coordinator + + + Capo programmatore Minecraft PC + + + Customer Support + + + Office DJ + + + Designer/Programmer Minecraft - Pocket Edition + + + Ninja Coder + + + CEO + + + White Collar Worker + + + Explosives Animator + + + Grosso drago nero che si trova nel Limite. + + + Vampe + + + Nemici che si trovano nel Sottomondo, soprattutto all'interno delle Fortezze. Quando vengono uccisi, depositano Bacchette di Vampe. + + + Golem di neve + + + Il Golem di neve può essere creato assemblando blocchi di neve e una zucca. Lancia palle di neve contro i nemici del suo creatore. + + + Drago di Ender + + + Cubo di magma + + + Possono essere trovati nelle giungle. Sono addomesticabili se sfamati con pesce crudo, ma aspetta che sia lui ad avvicinarsi a te, perché un movimento brusco lo metterebbe in fuga. + + + Golem di ferro + + + Appare nei villaggi per proteggerli, può essere creato usando blocchi di ferro e zucche. + + + Si trovano nel Sottomondo. Simili a Slime, si dividono in esemplari più piccoli quando vengono uccisi. + + + Abitante del villaggio + + + Ocelot + + + Permette la creazione di incantesimi più potenti quando viene piazzato intorno al Tavolo per incantesimi. + + + {*T3*}COME GIOCARE: FORNACE{*ETW*}{*B*}{*B*} +La fornace ti consente di modificare oggetti cuocendoli. Per esempio, nella fornace puoi trasformare il minerale di ferro in lingotti di ferro.{*B*}{*B*} +Colloca la fornace nel mondo e premi{*CONTROLLER_ACTION_USE*} per usarla.{*B*}{*B*} +Dovrai inserire del combustibile nella parte inferiore della fornace e l'oggetto da modificare nella parte superiore. A quel punto, la fornace si attiverà.{*B*}{*B*} +Una volta fusi i tuoi oggetti, puoi spostarli dall'area di produzione all'inventario.{*B*}{*B*} +Se il puntatore è posizionato su ingredienti o combustibili per la fornace, degli aiuti contestuali ti consentiranno di spostarli rapidamente nella fornace. + + + {*T3*}COME GIOCARE: DISPENSER{*ETW*}{*B*}{*B*} +Il dispenser serve per far uscire gli oggetti. Per attivare il dispenser, dovrai collocarvi accanto un interruttore, per esempio una leva.{*B*}{*B*} +Per riempire il dispenser di oggetti, premi{*CONTROLLER_ACTION_USE*}, quindi sposta gli oggetti desiderati dall'inventario al dispenser.{*B*}{*B*} +Ora, quando userai l'interruttore, il dispenser farà uscire un oggetto. + + + {*T3*}COME GIOCARE: DISTILLAZIONE{*ETW*}{*B*}{*B*} +Per distillare pozioni occorre munirsi di un Banco di distillazione, costruendolo presso un tavolo da lavoro. L'ingrediente principale di tutte le pozioni è una bottiglia d'acqua, che si ottiene riempiendo una Bottiglia di vetro con acqua attinta da un Calderone o da un'altra fonte.{*B*} +Il Banco di distillazione ha tre slot e permette di realizzare tre pozioni contemporaneamente. Dal momento che uno stesso ingrediente può essere usato in tutte e tre le bottiglie, è consigliabile produrre sempre tre pozioni insieme, in modo da ottimizzare l'uso delle risorse.{*B*} +Inserendo un ingrediente nella posizione più alta del Banco di distillazione si otterrà, dopo un breve periodo di tempo, una pozione di base. La pozione così ottenuta non ha alcun effetto; per renderla efficace, bisognerà distillare un secondo ingrediente.{*B*} +L'aggiunta di un terzo ingrediente può rendere l'effetto della pozione più durevole (se si usa Polvere di pietra rossa) o più intenso (se si usa Polvere di pietra brillante), o rendere nociva la pozione (se si usa un Occhio di ragno fermentato).{*B*} +Aggiungendo della polvere da sparo, si può trasformare una qualsiasi pozione in una Bomba pozione che, una volta lanciata, diffonderà il suo effetto nell'area colpita.{*B*} + +Gli ingredienti utilizzabili nelle pozioni sono:{*B*}{*B*} +* {*T2*}Verruca del Sottomondo{*ETW*}{*B*} +* {*T2*}Occhio di ragno{*ETW*}{*B*} +* {*T2*}Zucchero{*ETW*}{*B*} +* {*T2*}Lacrima di Ghast{*ETW*}{*B*} +* {*T2*}Polvere di Vampe{*ETW*}{*B*} +* {*T2*}Crema di magma{*ETW*}{*B*} +* {*T2*}Anguria scintillante{*ETW*}{*B*} +* {*T2*}Polvere di pietra rossa{*ETW*}{*B*} +* {*T2*}Polvere di pietra brillante{*ETW*}{*B*} +* {*T2*}Occhio di ragno fermentato{*ETW*}{*B*}{*B*} + +Le combinazioni possibili sono numerose, e ognuna produce una pozione con un effetto diverso. + + + {*T3*}COME GIOCARE: CASSA GRANDE{*ETW*}{*B*}{*B*} +Due casse collocate una accanto all'altra si combinano per formare una cassa grande in grado di contenere più oggetti.{*B*}{*B*} +Puoi usarla come la cassa normale. + + + {*T3*}COME GIOCARE: CRAFTING{*ETW*}{*B*}{*B*} +Nell'interfaccia Crafting, puoi combinare oggetti dell'inventario per creare nuovi tipi di oggetti. Usa{*CONTROLLER_ACTION_CRAFTING*} per aprire l'interfaccia Crafting.{*B*}{*B*} +Scorri le schede in alto usando{*CONTROLLER_VK_LB*} e{*CONTROLLER_VK_RB*} per selezionare il tipo di oggetto, poi usa{*CONTROLLER_MENU_NAVIGATE*} per selezionare l'oggetto da creare.{*B*}{*B*} +L'area crafting mostra gli ingredienti richiesti per creare il nuovo oggetto. Premi{*CONTROLLER_VK_A*} per creare l'oggetto e inserirlo nell'inventario. + + + {*T3*}COME GIOCARE: TAVOLO DA LAVORO{*ETW*}{*B*}{*B*} +Puoi creare oggetti più grandi usando il tavolo da lavoro.{*B*}{*B*} +Colloca il tavolo nel mondo e premi{*CONTROLLER_ACTION_USE*} per usarlo.{*B*}{*B*} +La creazione al tavolo funziona come il crafting di base, ma hai a disposizione un'area più ampia e una più vasta selezione di oggetti da creare. + + + {*T3*}COME GIOCARE: INCANTESIMI{*ETW*}{*B*}{*B*} +I punti Esperienza guadagnati uccidendo i nemici, oppure scavando o fondendo in una fornace determinati tipi di blocchi, possono essere usati per incantare attrezzi, armi, armature e libri.{*B*} +Posizionando una Spada, un Arco, un'Ascia, una Piccozza, una Pala, un'Armatura o un Libro nello slot sotto il libro nel Tavolo per incantesimi, sui tre pulsanti a destra verranno visualizzati alcuni incantesimi e il livello di Esperienza che richiedono.{*B*} +Se hai abbastanza Esperienza per acquistare un incantesimo, la cifra apparirà in verde; in caso contrario, apparirà in rosso.{*B*}{*B*} +L'incantesimo verrà selezionato casualmente tra tutti gli incantesimi di costo uguale.{*B*}{*B*} +Se il Tavolo per incantesimi è circondato da Scaffali (fino a un massimo di 15), con uno spazio pari a un blocco tra lo Scaffale e il Tavolo, la potenza degli incantesimi aumenterà e dal libro posto sul Tavolo per incantesimi scaturiranno dei simboli arcani.{*B*}{*B*} +Tutti gli ingredienti per un Tavolo per incantesimi possono essere trovati nei villaggi o ottenuti scavando e coltivando.{*B*}{*B*} +I Libri incantati vengono usati sull'incudine per applicare incantesimi agli oggetti. Ciò ti dà più controllo su quali incantesimi applicare ai tuoi oggetti.{*B*} + + + {*T3*}COME GIOCARE: ESCLUSIONE DI LIVELLI{*ETW*}{*B*}{*B*} +Se trovi dei contenuti offensivi all'interno di un livello che stai giocando, puoi scegliere di aggiungere questo livello all'elenco dei livelli esclusi. +Per farlo, visualizza il menu di pausa, quindi premi{*CONTROLLER_VK_RB*} per selezionare lo strumento Escludi livello. +Quando tenterai di accedere a questo livello in futuro, verrà visualizzata una notifica per segnalarti che quel livello fa parte dell'elenco dei livelli esclusi e potrai scegliere se annullare l'operazione o rimuovere il livello dall'elenco e accedervi. + + + {*T3*}COME GIOCARE: OPZIONI DELL'HOST E DEL GIOCATORE{*ETW*}{*B*}{*B*} + +{*T1*}Opzioni di gioco{*ETW*}{*B*} +Quando carichi o crei un mondo, se premi il pulsante "Altre opzioni" accederai a un menu che ti consente di avere maggior controllo sul gioco.{*B*}{*B*} + + {*T2*}Giocatore vs Giocatore{*ETW*}{*B*} + Se l'opzione è attivata, è possibile infliggere danni agli altri giocatori. Quest'opzione ha effetto esclusivamente nella modalità Sopravvivenza.{*B*}{*B*} + + {*T2*}Autorizza giocatori{*ETW*}{*B*} + Se l'opzione non è attivata, i giocatori che si uniscono alla partita non potranno svolgere determinate azioni, come scavare o usare oggetti, posizionare blocchi, utilizzare porte, interruttori e contenitori, attaccare gli altri giocatori o gli animali. È possibile modificare le opzioni dei singoli giocatori accedendo al menu di gioco.{*B*}{*B*} + + {*T2*}Diffusione incendio{*ETW*}{*B*} + Se l'opzione è attivata, il fuoco può propagarsi ai blocchi infiammabili vicini. Quest'opzione può essere modificata anche durante il gioco.{*B*}{*B*} + + {*T2*}Esplosione TNT{*ETW*}{*B*} + Se l'opzione è attivata, il TNT esplode quando viene fatto detonare. Quest'opzione può essere modificata anche durante il gioco.{*B*}{*B*} + + {*T2*}Privilegi dell'host{*ETW*}{*B*} + Se l'opzione è abilitata, l'host, tramite il menu di gioco, può attivare o disattivare la possibilità di volare, disabilitare la stanchezza e rendersi invisibile. {*DISABLES_ACHIEVEMENTS*}{*B*}{*B*} + +{*T2*}Ciclo solare{*ETW*}{*B*} + Se disattivato, l'ora del giorno non cambia.{*B*}{*B*} + + {*T2*}Mantieni inventario{*ETW*}{*B*} + Quando è attivato, i giocatori conservano il loro inventario quando muoiono.{*B*}{*B*} + + {*T2*}Rigenerazione nemici{*ETW*}{*B*} + Quando è disattivato, i nemici non si rigenerano naturalmente.{*B*}{*B*} + + {*T2*}Scorrettezza nemici{*ETW*}{*B*} + Quando è disattivato, impedisce a mostri e animali di modificare i blocchi (ad esempio, le esplosioni dei creeper non distruggono blocchi e le pecore non rimuovono l'erba) e di raccogliere oggetti.{*B*}{*B*} + + {*T2*}Bottino nemici{*ETW*}{*B*} + Quando è attivato, mostri e animali non rilasciano oggetti (ad esempio, i creeper non rilasciano polvere da sparo).{*B*}{*B*} + + {*T2*}Posa tessere{*ETW*}{*B*} + Quando è disattivato, i blocchi non rilasciano oggetti quando vengono distrutti (ad esempio, i blocchi di pietra non rilasciano ciottoli).{*B*}{*B*} + + {*T1*}Opzioni di generazione del mondo{*ETW*}{*B*} +Quando crei un nuovo mondo, sono disponibili alcune opzioni aggiuntive.{*B*}{*B*} + + {*T2*}Genera strutture{*ETW*}{*B*} + Se l'opzione è abilitata, nel mondo saranno generate strutture come Villaggi e Fortezze.{*B*}{*B*} + + {*T2*}Mondo superpiatto{*ETW*}{*B*} + Se l'opzione è attivata, verrà generato un mondo completamente piatto, sia nel Sopramondo sia nel Sottomondo.{*B*}{*B*} + + {*T2*}Cassa bonus{*ETW*}{*B*} + Se l'opzione è attivata, vicino al punto di generazione del giocatore apparirà una cassa contenente alcuni oggetti utili.{*B*}{*B*} + + {*T2*}Ripristina sottomondo{*ETW*}{*B*} + Se l'opzione è attivata, il Sottomondo viene rigenerato. Utile se hai un vecchio salvataggio nel quale le fortezze del Sottomondo non erano presenti.{*B*}{*B*} + +{*T1*}Opzioni di gioco{*ETW*}{*B*} +Durante la partita, premi {*BACK_BUTTON*} per aprire il menu di gioco, dove potrai accedere a diverse opzioni.{*B*}{*B*} + + {*T2*}Opzioni dell'host{*ETW*}{*B*} + L'host e tutti i giocatori identificati come moderatori possono accedere al menu "Opzioni host" e abilitare o disabilitare le opzioni "Diffusione incendio" ed "Esplosione TNT".{*B*}{*B*} + +{*T1*}Opzioni del giocatore{*ETW*}{*B*} +Per modificare i privilegi di un giocatore, seleziona il suo nome e premi{*CONTROLLER_VK_A*} per accedere al menu dei privilegi del giocatore, dove potrai agire sulle seguenti opzioni.{*B*}{*B*} + + {*T2*}Può costruire e scavare{*ETW*}{*B*} +Quest'opzione è disponibile solo se "Autorizza giocatori" è disattivata. Quando l'opzione è attivata, il giocatore può interagire con il mondo normalmente. Se, invece, l'opzione è disattivata, il giocatore non può posizionare né distruggere blocchi e non potrà interagire con oggetti e blocchi di vario tipo. {*B*}{*B*} + + {*T2*}Può usare porte e interruttori{*ETW*}{*B*} +Quest'opzione è disponibile solo se "Autorizza giocatori" è disattivata. Se disattivata, il giocatore non sarà in grado di usare né le porte né gli interruttori. {*B*}{*B*} + + {*T2*}Può aprire contenitori{*ETW*}{*B*} +Quest'opzione è disponibile solo se "Autorizza giocatori" è disattivata. Se disattivata, il giocatore non sarà in grado di aprire i contenitori, come le casse. {*B*}{*B*} + + {*T2*}Può attaccare i giocatori{*ETW*}{*B*} +Quest'opzione è disponibile solo se "Autorizza giocatori" è disattivata. Se disattivata, impedisce al giocatore di causare danni agli altri utenti. {*B*}{*B*} + + {*T2*}Può attaccare animali{*ETW*}{*B*} +Quest'opzione è disponibile solo se "Autorizza giocatori" è disattivata. Se disattivata, il giocatore non sarà in grado di infliggere danni agli animali. {*B*}{*B*} + + {*T2*}Moderatore{*ETW*}{*B*} + Se quest'opzione è attivata, il giocatore potrà modificare i privilegi degli altri utenti, fatta eccezione per l'host, a patto che "Autorizza giocatori" sia disabilitata. Inoltre, il giocatore potrà espellere gli altri utenti e modificare le opzioni relative alla diffusione degli incendi e all'esplosione del TNT.{*B*}{*B*} + + {*T2*}Espelli giocatore{*ETW*}{*B*} + {*KICK_PLAYER_DESCRIPTION*}{*B*}{*B*} + + +{*T1*}Opzioni del giocatore host{*ETW*}{*B*} +Se l'opzione "Privilegi dell'host" è attivata, l'host può modificare da solo alcuni privilegi. Per modificare i privilegi di un giocatore, seleziona il suo nome e premi {*CONTROLLER_VK_A*} per aprire il menu dei privilegi del giocatore e accedere alle seguenti opzioni.{*B*}{*B*} + + {*T2*}Può volare{*ETW*}{*B*} + Se l'opzione è attivata, il giocatore è in grado di volare. L'opzione ha effetto esclusivamente sulla modalità Sopravvivenza, perché in modalità Creativa, tutti i giocatori possono volare.{*B*}{*B*} + + {*T2*}Disabilita stanchezza{*ETW*}{*B*} + L'opzione ha effetto esclusivamente sulla modalità Sopravvivenza. Se attivata, le attività fisiche (camminare, correre, saltare e altre ancora) non fanno scendere la barra del cibo. Tuttavia, se il giocatore viene ferito, la barra del cibo diminuirà lentamente man mano che il giocatore guarisce.{*B*}{*B*} + + {*T2*}Invisibile{*ETW*}{*B*} + Se l'opzione è abilitata, il giocatore è invulnerabile e gli altri utenti non possono vederlo.{*B*}{*B*} + + {*T2*}Può teletrasportarsi{*ETW*}{*B*} + Permette al giocatore di muovere se stesso o altri giocatori presso altri giocatori nel mondo. + + + Pagina successiva + + + {*T3*}COME GIOCARE: ALLEVARE GLI ANIMALI{*ETW*}{*B*}{*B*} +Se vuoi che gli animali rimangano nel solito posto, crea una zona recintata non più grande di 20x20 blocchi e sistema gli animali là dentro. In questo modo sarai sicuro di ritrovarli dove li hai lasciati. + + + {*T3*}COME GIOCARE: RIPRODUZIONE{*ETW*}{*B*}{*B*} +Gli animali di Minecraft possono riprodursi e dar vita a versioni in miniatura di se stessi!{*B*} +Per far riprodurre un animale, devi prima farlo entrare in "modalità Amore" nutrendolo con l'alimento adatto.{*B*} +Dai Grano a una mucca, muccafungo, o pecora, Carote a un maiale, Semi di grano o Verruche del Sottomondo a una gallina, o qualsiasi tipo di carne a un lupo, e cominceranno a cercare nei dintorni un altro animale della stessa specie che sia a sua volta in modalità Amore.{*B*} +Quando l'avrà trovato, i due si scambieranno effusioni per qualche secondo e poi apparirà un cucciolo. Il piccolo seguirà i genitori per un certo periodo di tempo prima di diventare adulto.{*B*} +Devono passare circa cinque minuti prima che un animale possa entrare nuovamente in modalità Amore.{*B*} +C'è un limite al numero di animali che si può avere in un mondo, e questo potrebbe essere il motivo per cui non si riproducono. + + + {*T3*}COME GIOCARE: SOTTOPORTALE{*ETW*}{*B*}{*B*} +Il Sottoportale consente al giocatore di spostarsi tra il Sopramondo e il Sottomondo. Il Sottomondo serve per viaggiare velocemente nel Sopramondo: una distanza di un blocco nel Sottomondo equivale a 3 blocchi nel Sopramondo, quindi quando costruisci un portale nel Sottomondo e lo usi per uscire, ti troverai a una distanza triplicata rispetto al punto di entrata.{*B*}{*B*} +La costruzione del portale richiede un minimo di 10 blocchi di ossidiana. Il portale deve essere alto 5 blocchi, largo 4 e profondo 1. Una volta costruita la struttura del portale, lo spazio interno dev'essere incendiato per attivarlo. Per farlo, usa pietra focaia e acciarino oppure l'oggetto Scarica di fuoco.{*B*}{*B*} +L'immagine a destra mostra alcuni esempi di costruzione di un portale. + + + {*T3*}COME GIOCARE: CASSA{*ETW*}{*B*}{*B*} +Una volta creata una cassa, puoi collocarla nel mondo e usarla con{*CONTROLLER_ACTION_USE*} per conservare gli oggetti dell'inventario.{*B*}{*B*} +Usa il puntatore per spostare oggetti dall'inventario alla cassa e viceversa.{*B*}{*B*} +Gli oggetti nella cassa resteranno a tua disposizione e potrai riportarli nell'inventario in seguito. + + + Hai partecipato alla Minecon? + + + Nessuno alla Mojang ha mai visto la faccia di junkboy. + + + Sapevi che c'è anche una Wiki di Minecraft? + + + Non guardare direttamente i bug. + + + I creeper sono il risultato di un bug di codifica. + + + È una gallina o un'anatra? + + + Il nuovo ufficio di Mojang è fico! + + + {*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 + + + Commercio + + + Incudine + + + 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*} +Per attivare il portale è necessario disporre l'Occhio di Ender in un qualunque Telaio di un portale del Limite vuoto.{*B*} +Una volta attivo, puoi attraversare il portale per raggiungere il Limite.{*B*}{*B*} +Nel Limite incontrerai il Drago di Ender, nemico forte e fiero, oltre agli Enderman, sarà quindi necessario prepararsi a dovere prima di intraprendere il viaggio!{*B*}{*B*} +Scoprirai che ci sono i Cristalli di Ender sulle punte di ossidiana che il Drago di Ender usa per rigenerarsi, il primo passo sarà quindi distruggerli uno per uno.{*B*} +Puoi colpire i primi con le frecce, gli altri invece sono protetti da una gabbia di metallo, dovrai quindi avvicinarti.{*B*}{*B*} +Nel frattempo il Drago di Ender ti attaccherà in volo e ti lancerà palle di acido!{*B*} +Se ti avvicini all'uovo al centro delle punte, il Drago di Ender scenderà in picchiata per affrontarti e sarà quello il momento giusto per la tua controffensiva!{*B*} +Evita l'acido, mira agli occhi del Drago. Porta degli amici con te, se possibile, per affrontare insieme la battaglia e vincerla!{*B*}{*B*} +Una volta giunti nel Limite, i tuoi amici potranno vedere l'ubicazione del Portale all’interno della fortezza sulla loro mappa, e raggiungerti facilmente. + + + {*ETB*}Bentornato! Forse non lo sai, ma Minecraft è appena stato aggiornato.{*B*}{*B*} +Ci sono tante nuove funzionalità per te e i tuoi amici, ecco un assaggio. Dai un'occhiata e preparati a divertirti!{*B*}{*B*} +{*T1*}Nuovi oggetti{*ETB*} - Argilla indurita, Argilla dipinta, Blocco di carbone, Binario attivatore, Blocco di pietra rossa, Sensore luce solare, Dropper, Hopper, Carrello da miniera con hopper, Carrello da miniera con TNT, Comparatore di pietra rossa, Piastra a pressione pesata, Raggio, Cassa intrappolata, Razzo per fuochi artificiali, Stella per fuochi artificiali, Stella del Sottomondo, Guinzaglio, Armatura da cavallo, Targhetta del nome, Uovo di generazione cavalli.{*B*}{*B*} +{*T1*}Nuovi Mob{*ETB*} - Wither, Scheletri avvizziti, streghe, pipistrelli, cavalli, asini e muli.{*B*}{*B*} +{*T1*}Nuove funzioni{*ETB*} - Addomestica e cavalca un cavallo, crea fuochi artificiali, dai un nome ad animali e mostri con una Targhetta del nome, crea circuiti di pietra rossa più avanzati e nuove opzioni per permettere all'host di controllare cosa possono fare gli ospiti del suo mondo!{*B*}{*B*} +{*T1*}Nuovo mondo tutorial{*ETB*} – Impara a usare le funzioni vecchie e nuove nel mondo Tutorial. Vediamo se riesci a trovare tutti i cd musicali segreti nel mondo Tutorial!{*B*}{*B*} + + + 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. + + + 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 nel ricettario di torte, come ingrediente per fare pozioni. + + + Accendila o spegnila per generare una scarica elettrica. Rimane accesa o spenta finché non la premi di nuovo. + + + Invia costantemente una scarica elettrica e si può usare anche come ricevitore/trasmettitore se collegata a un lato del blocco. +È anche una debole fonte di illuminazione. + + + 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. + + + Si usano per guidare i carrelli da miniera. + + + Accesi, fanno accelerare i carrelli da miniera che ci passano sopra. Spenti, fanno fermare i carrelli da miniera. + + + Funzionano come la piastra a pressione (inviano un segnale pietra rossa mentre sono in funzione) ma sono attivabili solo dal carrello da miniera. + + + 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 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 verde lime. + + + Si usa come tintura per creare lana grigia. + + + Usata come tintura per la lana grigio chiaro. +(Nota: si può anche preparare con tintura grigia e farina d'ossa, avendone quattro per sacca di inchiostro, invece di tre.) + + + Si usa come tintura per creare lana magenta. + + + Fa più luce della torcia. Scioglie ghiaccio e neve e si può usare anche sott'acqua. + + + Si usa per creare libri e mappe. + + + Si usa per creare una libreria o viene incantato per fare Libri incantati. + + + Si usa come tintura per creare lana blu. + + + Suona dischi. + + + Utilizzabile per creare attrezzi, armi o armature molto robusti. + + + Si usa come tintura per creare lana arancione. + + + 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 per trasportare merci sui binari. + + + Si muove sui binari e spinge altri carrelli da miniera se ci metti del carbone. + + + Si usa per spostarsi sull'acqua più velocemente che a nuoto. + + + Si usa come tintura per creare lana verde. + + + 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 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. + + + Consente attacchi a distanza con le frecce. + + + 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 5 se indossato. + + + Dà all'utilizzatore Armatura 2 se indossato. + + + Dà all'utilizzatore Armatura 2 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. + + + Dà all'utilizzatore Armatura 8 se indossato. + + + Dà all'utilizzatore Armatura 6 se indossato. + + + Dà all'utilizzatore Armatura 3 se indossato. + + + Dà all'utilizzatore Armatura 6 se indossato. + + + Le porte di ferro si aprono solo con pietra rossa, pulsanti o interruttori. + + + Dà all'utilizzatore Armatura 1 se indossato. + + + Dà all'utilizzatore Armatura 3 se indossato. + + + 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. + + + Dà all'utilizzatore Armatura 2 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 1 se indossato. + + + Dà all'utilizzatore Armatura 2 se indossato. + + + Dà all'utilizzatore Armatura 5 se indossato. + + + Si usa per le scale compatte. + + + 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. + + + 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. + + + Si usa per contenere e trasportare lava. + + + 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. + + + 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. + + + Si attiva usandola, colpendola o con una pietra rossa. Funziona come una porta normale, ma è un blocco di 1x1 appiattito sul terreno. + + + 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 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 usa per creare torce, frecce, cartelli, scale a pioli, recinzioni e come maniglia per attrezzi e armi. + + + 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 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. + + + Ascia di ferro + + + Lampada di pietra rossa + + + Scala di legno (giungla) + + + Scale di legno di betulla + + + Comandi attuali + + + Teschio + + + Cacao + + + Scale di legno di abete + + + Uovo di drago + + + Pietra del Limite + + + Telaio per Portale del Limite + + + Scala di arenaria + + + Felce + + + Arbusto + + + Layout + + + Crafting + + + Usa + + + Azione + + + Muoviti furtivamente/Vola giù + + + Furtività + + + Posa + + + Scorri oggetti in mano + + + Pausa + + + Guarda + + + Muoviti/Scatta + + + Inventario + + + Salta/Vola su + + + Salta + + + Portale del Limite + + + Picciolo di zucca + + + Anguria + + + 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 + + + Abete + + + Betulla + + + Legno di abete + + + Legno di betulla + + + Legno della giungla + + + Lana + + + Lana rosa + + + Lana grigia + + + Lana grigio chiaro + + + Lana azzurra + + + Lana gialla + + + Lana verde lime + + + Lana turchese + + + Lana verde + + + Lana rossa + + + Lana nera + + + Lana viola + + + Lana blu + + + Lana marrone + + + Torcia (carbone) + + + Pietra brillante + + + Sabbie mobili + + + 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. + + + Botola + + + Cassa chiusa + + + Diodo + + + Pistone appiccicoso + + + Pistone + + + Lana (qualsiasi colore) + + + Cespuglio secco + + + Torta + + + Blocco nota + + + Dispenser + + + Erba alta + + + Ragnatela + + + Letto + + + Ghiaccio + + + Tavolo da lavoro + + + Un modo per immagazzinare diamanti in modo compatto. + + + Blocco di diamante + + + Fornace + + + Zolla + + + Coltura + + + Minerale di diamante + + + Generatore di mostri + + + Fuoco + + + Torcia (antracite) + + + Polvere di pietra rossa + + + Cassa + + + Scala di legno di quercia + + + Cartello + + + Minerale pietra rossa + + + Porta di ferro + + + Piastra a pressione + + + Neve + + + Tasti + + + Torcia pietra rossa + + + Leva + + + Binari + + + Scala a pioli + + + Porta di legno + + + Scala di pietra + + + Binari rilevatori + + + Binari potenziati + + + Hai abbastanza ciottoli per costruire una fornace. Usa il tavolo da lavoro. + + + Canna da pesca + + + Orologio + + + Polvere di pietra brillante + + + Carrello con fornace + + + Uovo + + + Bussola + + + 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.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già come si usa la fornace. + + + 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. + + + 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. + + + 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_ACTION_MENU_PAGEDOWN*} . + + + Questa è l'interfaccia di Crafting (lavoro), che ti consente di combinare gli oggetti raccolti per crearne di nuovi. + + + 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. + + + + + Usa{*CONTROLLER_MENU_NAVIGATE*} per muovere il puntatore. + Quando sei nell'elenco degli oggetti, usa{*CONTROLLER_VK_A*} per selezionare l'oggetto sotto il puntatore e{*CONTROLLER_VK_Y*} per prenderne la quantità massima. + + + + Acqua + + + Bottiglia di vetro + + + Bottiglia d'acqua + + + Occhio di ragno + + + Pepita d'oro + + + Verruca del Sottomondo + + + Pozione{*splash*}{*prefix*}{*postfix*} + + + Occhio ragno fermen. + + + Calderone + + + Occhio di Ender + + + Anguria scintillante + + + Polvere di Vampe + + + Crema di magma + + + Banco di distillazione + + + Lacrima di Ghast + + + Semi di zucca + + + Semi di anguria + + + Pollo crudo + + + Disco - "11" + + + Disco - "dove siamo adesso" + + + Tosatrice + + + Pollo cotto + + + Perla di Ender + + + Fetta di anguria + + + Bacchetta di Vampe + + + Manzo crudo + + + Bistecca + + + Carne guasta + + + Bottiglia magica + + + Assi di legno di quercia + + + Assi di legno di abete + + + Assi di legno di betulla + + + Blocco d'erba + + + Terra + + + Ciottolo + + + Assi di legno (giungla) + + + Arbusto di betulla + + + Arbusto della giungla + + + Substrato roccioso + + + Arbusto + + + Arbusto di quercia + + + Arbusto di abete + + + Pietra + + + Cornice oggetto + + + Genera {*CREATURE*} + + + Mattone del Sottomondo + + + Scarica di fuoco + + + Scaric. fuoco brace + + + Scaric. fuoco carbone + + + Teschio + + + Testa + + + Testa di %s + + + Testa di Creeper + + + Teschio di scheletro + + + Teschio di scheletro avvizzito + + + Testa di zombie + + + Un modo efficiente per immagazzinare carbone. Può essere usato come combustibile in una fornace. + + + Veleno + + + Fame + + + della Lentezza + + + della Velocità + + + Invisibilità + + + Apnea + + + Visione notturna + + + Cecità + + + del Danno + + + della Guarigione + + + della Nausea + + + della Rigenerazione + + + dell'Opacità + + + della Fretta + + + della Debolezza + + + della Forza + + + Resistenza al fuoco + + + Saturazione + + + della Resistenza + + + del Salto + + + Avvizzito + + + Potenziamento salute + + + Assorbimento + + + + + + II + + + 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 + + + Prosaica + + + Banale + + + Prestante + + + Cordiale + + + Affascinante + + + Elegante + + + Elaborata + + + Frizzante + + + 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 + + + Percossa + + + Acutezza + + + Riduce progressivamente la salute di giocatori, animali e mostri affetti. + + + Danno da attacco + + + Atterramento + + + Flagello degli Artropodi + + + Velocità + + + Rinforzi zombie + + + Potenza di salto del cavallo + + + Quando applicato: + + + Resistenza all'atterramento + + + Gittata di inseguimento dei nemici + + + Salute max + + + Tocco di Seta + + + Efficienza + + + Affinità con l'acqua + + + Fortuna + + + Saccheggio + + + Durezza + + + Protezione dal Fuoco + + + Protezione + + + Aspetto di Fuoco + + + Caduta della Piuma + + + Respirazione + + + Protezione dai proiettili + + + Protezione dalle esplosioni + + + IV + + + V + + + VI + + + Pugno + + + VII + + + III + + + Fiamma + + + Potenza + + + Infinito + + + II + + + I + + + Si attiva quando un'entità passa attraverso un allarme collegato. + + + Attiva un gancio di allarme quando un'entità ci passa attraverso. + + + Un modo per compattare smeraldi. + + + Simile a una cassa, eccetto per il fatto che un oggetto piazzato in una cassa dell'Ender è disponibile in tutte le casse dell'Ender del giocatore, anche in differenti dimensioni. + + + IX + + + VIII + + + Può essere scavato con una piccozza di ferro o migliore per produrre smeraldi. + + + 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. + + + 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 usa per controllare un maiale sellato quando lo si cavalca. + + + 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. + + + 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. + + + Smeraldo + + + Vaso di fiori + + + Torta di zucca + + + Libro incantato + + + Patata velenosa + + + Carota d'oro + + + Carota su bastone + + + Gancio dell'allarme + + + Allarme + + + Quarzo del Sottomondo + + + Minerale di smeraldo + + + Cassa dell'Ender + + + Muro di ciottoli e muschio + + + Blocco di smeraldo + + + Muro di ciottoli + + + Patate + + + Vaso di fiori + + + Carote + + + Incudine leggermente danneggiata + + + Incudine + + + Incudine + + + Blocco di quarzo + + + Incudine gravemente danneggiata + + + Minerale di quarzo del Sottomondo + + + Scale di quarzo + + + Blocco di quarzo cesellato + + + Blocco di quarzo a pilastro + + + Moquette rossa + + + Moquette + + + Moquette nera + + + Moquette blu + + + Moquette verde + + + Moquette marrone + + + Moquette viola + + + Moquette azzurra + + + Moquette grigia chiara + + + Moquette grigia + + + Moquette verde lime + + + Moquette rosa + + + Moquette blu chiara + + + Moquette gialla + + + Moquette magenta + + + Moquette arancione + + + Moquette bianca + + + Arenaria cesellata + + + {*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*} ti ha teletrasportato alla sua posizione + + + {*PLAYER*} teletrasportato da {*DESTINATION*} + + + Spine + + + {*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 + + + Troppo costoso! + + + Costo incantesimo: %d + + + Possiedi: + + + Rinomina + + + {*VILLAGER_TYPE*} offre %s + + + Richiesti per lo scambio + + + Scambia + + + 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. + + + + + In alternativa, nel secondo slot di ingresso può essere posizionato un secondo oggetto identico, per combinarli tra loro. + + + + + 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. + + + + + 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. + + + + + Per incantare oggetti sull'incudine, piazza un Libro incantato nel secondo slot di ingresso. + + + + + Raccogliendo l'oggetto riparato, i due oggetti utilizzati dall'incudine verranno consumati e il tuo livello di esperienza verrà ridotto della quantità indicata. + + + + + È possibile rinominare l'oggetto modificandone il nome mostrato nella casella di testo. + + + + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sull'incudine.{*B*} + Premi{*CONTROLLER_VK_B*} se non hai bisogno di spiegazioni al riguardo. + + + + + In quest'area c'è un'incudine e una cassa contenente strumenti e armi su cui lavorare. + + + + + 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. + + + + +Usando un'incudine, le armi e gli strumenti possono essere riparati per ripristinare la loro durata, rinominati o incantati mediante i libri incantati. + + + + + 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. + + + + + Usare l'incudine costa livelli di esperienza, e ogni uso ha una chance di danneggiare l'incudine. + + + + + Nella cassa in quest'area troverai piccozze danneggiate, materiali grezzi, bottiglie magiche e libri incantati con cui fare esperimenti. + + + + + Rinominare un oggetto ne cambia il nome visualizzato per tutti i giocatori, e riduce permanentemente il costo del lavoro precedente. + + + + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sull'interfaccia di scambio.{*B*} + Premi{*CONTROLLER_VK_B*} se non hai bisogno di spiegazioni al riguardo. + + + + + Questa è l'interfaccia di scambio, che mostra gli scambi che possono essere effettuati con gli abitanti. + + + + + Gli scambi appaiono in rosso e non sono disponibili se non possiedi gli oggetti necessari. + + + + + Tutti gli scambi che l'abitante è interessato a effettuare al momento sono visualizzati in alto. + + + + + Nelle due caselle a sinistra puoi vedere il numero totale di oggetti necessari per lo scambio. + + + + + 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. + + + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sugli scambi.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già tutto sugli scambi. + + + + + Effettuando un mix di scambi, gli scambi offerti dall'abitante verranno aggiornati o aumentati in modo casuale. + + + + + Gli scambi che un abitante desidera fare dipendono dalla sua professione. + + + + + Gli scambi effettuati frequentemente potrebbero essere temporaneamente rimossi, ma l'abitante offrirà sempre almeno uno scambio. + + + + + Prendi della carta dalla cassa e prova a commerciare con l'abitante qui presente. + + + + + In quest'area ci sono due casse dell'Ender. + + + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sulle casse dell'Ender.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già come funzionano. + + + + + Tutte le casse dell'Ender di un mondo sono collegate, anche tra diverse dimensioni. Gli oggetti posti in una cassa dell'Ender sono accessibili da tutte le altre casse dell'Ender. + + + + + Però, i contenuti delle casse dell'Ender sono diversi per ciascun giocatore. + + + + + Ciò permette ai giocatori di immagazzinare oggetti in una qualsiasi cassa dell'Ender, e riprenderli da altre casse dell'Ender in diversi luoghi del mondo. Puoi fare la prova ora, mettendo oggetti in una delle due casse dell'Ender. + + + + Reintegra 2{*ICON_SHANK_01*}, rigenera salute per 30 secondi e offre resistenza a fuoco e danni per 5 minuti. Composto da una mela e blocchi d'oro. + + + Può teletrasportarsi + + + Teletrasporto + + + Teletrasporto presso il giocatore + + + Teletrasporto presso di me + + + Può disattivare la stanchezza + + + Può diventare invisibile + + + Ora puoi attivare l'invisibilità + + + Non puoi più attivare l'invisibilità + + + Ora puoi attivare il volo + + + Non puoi più attivare il volo + + + Ora puoi disattivare la stanchezza + + + Non puoi più disattivare la stanchezza + + + Ora puoi teletrasportarti + + + Non puoi più teletrasportarti + + + {*T3*}COME SI GIOCA: INCUDINE{*ETW*}{*B*}{*B*} +I livelli di esperienza possono essere usati per riparare, incantare o rinominare oggetti mediante l'incudine.{*B*} +Tutti gli oggetti possono essere rinominati, ma solo quelli dotati di una durabilità possono essere riparati o incantati mediante libri incantati.{*B*} +Un oggetto può essere riparato posizionandolo in uno degli slot di ingresso a sinistra, insieme a un materiale grezzo dello stesso tipo, come ad esempio lingotti di ferro per una spada di ferro, o combinati con un altro oggetto dello stesso tipo.{*B*} +Combinare oggetti è più efficiente se effettuato mediante un'incudine; inoltre, se uno o entrambi gli oggetti sono incantati, il prodotto finale può ereditare l'incantesimo di uno dei due.{*B*} +I libri incantati possono applicare incantesimi agli oggetti combinandoli insieme con un'incudine, se l'incantesimo del libro è adatto. I libri incantati si trovano nelle casse all'interno di sotterranei, o possono essere incantati a partire da libri normali presso un Tavolo per incantesimi.{*B*} +C'è la possibilità che un'incudine venga danneggiata ad ogni uso, e dopo un certo numero di danni si distrugge.{*B*} + + + {*T3*}COME SI GIOCA: COMMERCIO{*ETW*}{*B*}{*B*} +È possibile scambiare oggetti con gli abitanti di un villaggio. Ciascun abitante ha una professione: coltivatore, macellaio, fabbro, bibliotecario o prete; ciò influenza il tipo di oggetti scambiati.{*B*} +Puoi trovare un elenco di tutti gli scambi offerti da un abitante nel menu di scambio. Un abitante potrebbe modificare o aumentare i suoi scambi ogni volta che un giocatore commercia con lui, e alcuni scambi potrebbero essere temporaneamente disattivati se vengono usati troppo di frequente.{*B*} +Di solito gli scambi consistono nel comprare un certo numero di oggetti in cambio di smeraldi.{*B*} +Se non hai gli oggetti necessari per uno scambio, gli oggetti appaiono in rosso.{*B*} + + + + {*T3*}COME SI GIOCA: CASSA DELL'ENDER{*ETW*}{*B*}{*B*} +Tutte le casse dell'Ender di un mondo sono collegate. Gli oggetti posti in una cassa dell'Ender sono accessibili da tutte le altre. Però, i contenuti delle casse dell'Ender sono diversi per ciascun giocatore. Ciò permette ai giocatori di immagazzinare oggetti in una qualsiasi cassa dell'Ender, e riprenderli da altre casse dell'Ender in diversi luoghi del mondo. + + + + Coltivatore + + + Bibliotecario + + + Prete + + + Fabbro + + + Macellaio + + + Gli abitanti del villaggio offrono scambi di oggetti al giocatore in base alla loro professione. + + + Cassa grande + + + + Inoltre puoi creare libri incantati al Tavolo per incantesimi, che possono essere usati più tardi con l'incudine per applicare incantesimi a un oggetto. + + + + + I ganci per allarmi forniscono inoltre energia costante a un circuito, mentre qualcosa attiva il filo che li unisce. + + + + + Dopo essere stato addomesticato, un lupo indossa sempre il suo collare. Puoi cambiare il colore del collare tingendolo. + + + + Carote e patate vengono coltivate piantandole, e sono pronte per il raccolto quando diventano visibili sulla superficie del terreno. + + + + Inoltre, i maiali possono essere sellati e cavalcati dai giocatori. Essi vengono controllati mediante un'esca composta da una carota su un bastone. + + + + Se necessario puoi lentamente muovere il carrello da miniera con {*CONTROLLER_ACTION_MOVE*}. Ciò aiuta il carrello ad avviarsi su un binario potenziato. + + + + Non puoi partecipare a questa partita poiché lo schermo diviso è supportato solo in alta definizione. Fai uscire tutti gli altri giocatori se vuoi entrare. + + + Cura + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/it-IT/stringsLeaderboards.xml b/Minecraft.Client/PSVitaMedia/loc/it-IT/stringsLeaderboards.xml new file mode 100644 index 00000000..fd134184 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/it-IT/stringsLeaderboards.xml @@ -0,0 +1,48 @@ + + + + Uccisioni in Facile + + + Uccisioni in Normale + + + Uccisioni in Difficile + + + Blocchi scavati in Relax + + + Blocchi scavati in Facile + + + Blocchi scavati in Normale + + + Blocchi scavati in Difficile + + + Allevamento in Relax + + + Allevamento in Facile + + + Allevamento in Normale + + + Allevamento in Difficile + + + Viaggio in Relax + + + Viaggio in Facile + + + Viaggio in Normale + + + Viaggio in Difficile + + \ 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 new file mode 100644 index 00000000..712cb312 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/it-IT/stringsPlatformSpecific.xml @@ -0,0 +1,246 @@ + + + + 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 + + + NOT USED + + + {*T3*}COME GIOCARE: MODALITÀ CREATIVA{*ETW*}{*B*}{*B*} +L'interfaccia della modalità Creativa consente al giocatore di spostare nel proprio inventario qualsiasi oggetto senza doverlo estrarre o creare. +Gli oggetti presenti nell'inventario non saranno rimossi quando vengono posizionati o usati nel mondo; in questo modo, il giocatore non dovrà preoccuparsi di raccogliere risorse e potrà concentrarsi sulla costruzione.{*B*} +Se crei, carichi o salvi un mondo in modalità Creativa, i trofei e gli aggiornamenti di classifica saranno disabilitati e lo resteranno anche se quel mondo verrà successivamente caricato in modalità Sopravvivenza.{*B*} +Per volare mentre sei in modalità Creativa, premi rapidamente {*CONTROLLER_ACTION_JUMP*} due volte. Ripeti l'azione per interrompere il volo. Per volare più rapidamente, sposta in avanti{*CONTROLLER_ACTION_MOVE*} due volte in rapida successione mentre stai volando. +Durante il volo, puoi tenere premuto{*CONTROLLER_ACTION_JUMP*} per salire e{*CONTROLLER_ACTION_SNEAK*} per scendere, oppure usare{*CONTROLLER_ACTION_DPAD_UP*} per salire e {*CONTROLLER_ACTION_DPAD_DOWN*} per scendere. +Per andare a sinistra premi {*CONTROLLER_ACTION_DPAD_LEFT*} o per andare a destra {*CONTROLLER_ACTION_DPAD_RIGHT*}. + + + 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" + + + 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? + + + "NOT USED" + + + 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. + + + 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". +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? + + + 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/it-IT/stringsRichPresence.xml b/Minecraft.Client/PSVitaMedia/loc/it-IT/stringsRichPresence.xml new file mode 100644 index 00000000..07266031 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/it-IT/stringsRichPresence.xml @@ -0,0 +1,66 @@ + + + + {GAME_STATE} + + + Inattivo + + + Sta navigando tra i menu + + + In Multiplayer - {GAME_STATE} + + + In Multiplayer offline - {GAME_STATE} + + + In singolo - {GAME_STATE} + + + In singolo offline - {GAME_STATE} + + + Si gode il panorama! + + + Cavalca un maiale + + + Guida un carrello da miniera + + + In barca + + + A pesca + + + Fabbrica + + + Sta forgiando + + + Nel Sottomondo + + + Ascolta un disco + + + Guarda una mappa + + + Sta incantando + + + Sta creando una pozione + + + Sta lavorando all'incudine + + + Sta incontrando i vicini + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/ja-JP/4J_stringsGeneric.xml b/Minecraft.Client/PSVitaMedia/loc/ja-JP/4J_stringsGeneric.xml new file mode 100644 index 00000000..b71ccc00 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/ja-JP/4J_stringsGeneric.xml @@ -0,0 +1,87 @@ + + + + OK + + + 戻る + + + キャンセル + + + はい + + + いいえ + + + 破損したセーブデータ + + + セーブデータが破損しています。新しいセーブデータを作成し、破損したデータを上書きしますか? + + + 空き容量が不足しています + + + 別のデータ保存機器を選択 + + + セーブなしでプレイ + + + 新しいセーブデータを作成 + + + セーブデータを上書きしますか? + + + 上書きしない + + + 上書きしてセーブ + + + セーブに失敗 + + + セーブなしでプレイ + + + ロードに失敗 + + + セーブデータの名前を入力 + + + セーブデータの名前を入力してください + + + 本当にゲームを終了してもよろしいですか? + + + サインアウト + + + プレイを続ける + + + サインインせずにプレイを続ける + + + ゲストアカウント + + + ゲストアカウントは"PSN"にアクセスできません。 + + + 保存中... + + + 保存しています。本体の電源を切らないでください + + + 完全版を購入 + + \ 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 new file mode 100644 index 00000000..f0a1dc1d --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/ja-JP/4J_stringsPlatformSpecific.xml @@ -0,0 +1,51 @@ + + + + Sony Entertainment Network アカウントの設定を保存できませんでした + + + Sony Entertainment Network アカウントのエラー + + + Sony Entertainment Network のアカウントに正常にアクセスできませんでした。現在はトロフィーを獲得できません + + + これは 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 new file mode 100644 index 00000000..4722047e --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/ja-JP/AdditionalStrings.xml @@ -0,0 +1,96 @@ + + + + マッシュアップの世界をすべて表示 + + + 隠す + + + Minecraft: "PlayStation 3" Edition + + + オプション + + + キャッシュを保存 + + + ネットワークのエラーが発生しました + + + ネットワークのエラー + + + ネットワークのエラーが発生しました。メイン メニューに戻ります + + + チャット制限のため、あなたのSony Entertainment Networkアカウントのオンラインサービスが無効になっています + + + サブアカウントの利用制限のため、あなたのSony Entertainment Networkアカウントのオンラインサービスが無効になっています + + + オンラインサービス + + + "PSN" からサインアウトしました。ゲームのオンライン機能は、再び "PSN" にサインインするまで使用できません + + + "PSN" からサインアウトしました。ゲームのオンライン機能は、再び "PSN" にサインインするまで使用できません。メイン メニューに戻ります + + + プレイヤー%dのユーザーを選択(またはキャンセルしてゲストとしてプレイ) + + + 無料 + + + オプションファイルが破損しているため、削除する必要があります + + + オプションファイルを削除 + + + オプションファイルのロードを再試行 + + + 保存したキャッシュファイルが破損しているため、削除する必要があります + + + トロフィーが無効です + + + 他のユーザーのセーブデータです。トロフィーは無効となります + + + 致命的なエラー: トロフィーの初期化に失敗しました。ゲームを終了してください + + + 招待者 + + + 破損したファイル + + + コントローラーが未接続 + + + コントローラーが接続されていません。コントローラーを再接続してください + + + サブアカウントの利用制限を受けているプレイヤーがいるため、Sony Entertainment Networkアカウントのオンラインサービスが無効になっています。 + + + ゲームのアップデートが利用可能なため、オンライン機能が無効になっています。 + + + 現在、このタイトルでダウンロードできるコンテンツはありません + + + 招待 + + + さあ、今すぐ 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 new file mode 100644 index 00000000..a874ab89 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/ja-JP/EULA.xml @@ -0,0 +1,96 @@ + + + + Minecraft: "PlayStation Vita" Edition - 利用規約 + 本規約は、Minecraft: "PlayStation Vita" Edition (以下「Minecraft」といいます)における利用条件を定めるものです。Minecraftのダウンロードと利用のルールを定めた本規約は、Minecraftとその利用者を守るために必要なものです。 + 本題に入る前に、はっきりさせておきたいことがひとつあります。Minecraftは、プレイヤーがものを作ったり壊したりできるゲームです。他のユーザーと一緒にプレイする(マルチプレイ)場合には、仲間と一緒にものを作ったり、仲間が作ったものを壊したりでき、仲間にも同じことをされます。ですから、好ましくない行動をとる人とは一緒にプレイしないでください。時には、すべきでないことをする人たちもいます。好ましいことではありませんが、皆さんに適切な行動をとるようお願いする以外に、当社にできることは多くありません。当社では、違反行為の把握を利用者の皆さんの報告に頼っています。不当な行動をとる人物がいた場合、または誰かが規則や規約に違反していたりMinecraftを不当利用していると思われる場合には、ぜひ当社にお知らせください。当社ではそのための違反報告システムを用意しています。ご報告いただければ、必要な対応を講じます。 + 問題を報告するには、support@mojang.comに電子メールでそのユーザーの情報や経緯をできるだけ詳しくお知らせください。 + では利用規約に戻ります。 + 一大原則 + 一大原則は、当社のあらゆる制作物を配布してはならないということです。「当社のあらゆる制作物の配布」とは、「Minecraftのコピーの譲渡、商用利用、金銭の授受、Minecraftおよびその一部を不当な方法で第三者に使わせること」を意味します。つまり、(当社が「ブランドおよび資産の利用に関するガイドライン(Brand and Asset Usage Guidelines)」などで特に認めていない限り)次の行為は禁じられています。 + • Minecraftのコピーの第三者への譲渡 + • 当社のあらゆる制作物の商用利用 + • 当社のあらゆる制作物から利益を上げようとすること + • Minecraftおよびその一部を不当な方法で第三者に使わせること + ...また当社の制作物には、Minecraftのクライアントまたはサーバーソフトウェアが含まれますが、それに限定されません。ゲームの修正版や一部、当社の一切の制作物が含まれます。 + 当社では、上記の他にはユーザーの行動に厳しい制限を設けていません。実際、楽しい行為を推奨しています(下記参照)。ただし、上記の禁止事項だけは行わないでください。 + MINECRAFTの利用 + • Minecraftを購入したユーザーは、ユーザー本人がユーザー本人の"PlayStation Vita"本体でMinecraftを利用することができます。 + • その他の行為についても以下のとおり限定的な権利を付与しますが、ユーザーの行きすぎた行為を防ぐために限度を設けています。当社ではユーザーが当社の制作物に関連したものを制作することを光栄に思いますが、公式なものと解釈されないよう留意し、本規約を順守してください。当社の一切の制作物を決して商用利用しないでください。 + • ユーザーが本規約に違反した場合、当社が付与したMinecraftの利用許諾を取り消すことができます。 + • Minecraftを購入したユーザーは、本規約に準じてMinecraftを自身の"PlayStation Vita"本体にインストールし、自身の"PlayStation Vita"本体でプレイすることを許可されます。この許可は購入したユーザーにのみ適用され、ユーザーはMinecraft(またはその一部)を(当社に別段の許可を得ている場合を除き)第三者に配布することはできません。 + • Minecraftのスクリーンショットと動画は、良識の範囲内において自由に取り扱うことができます。「良識の範囲内」とは、いかなる商用利用もしないこと、不当な行為や当社の権利を侵害する行為をしないことを意味します。また、アート資源をただ流用して配り回るのはやめましょう。不愉快な行為です。 + • 基本的にはルールはシンプルです。当社の「ブランドおよび資産の利用に関するガイドライン (Brand and Asset Usage Guidelines)」または本規約において当社の別段の同意がない限り、当社のいかなる作成物も商用利用しないでください。公正使用または公正取引の原理のもと法律で明示的に許されている行為は、問題ありません。ただし法律で許されている範囲に限ります。 + MINECRAFTその他の所有 + • 当社はユーザーにMinecraftの利用許諾を与えますが、Minecraftの所有者は当社です。当社はまた、当社のブランドおよびMinecraftに含まれる一切の内容物の所有者でもあります。これには、当社が所有する当社のソフトウェア、テクスチャー、資産、ツール、インフラ、およびすべての便利な(そしてそれほど便利でない)備品が含まれます。これらのものに対する当社の権利は主張され留保されていますが、ユーザーは本規約に基づいてそれらを使用することができます。 + • 上記は、ユーザーがMinecraftを使って制作した素晴らしいものの所有者が当社であることを意味するものではありません。ユーザーはMinecraftのすべての部分、製品およびサービスとしてのMinecraft、前出の文で記された事項について、当社が所有者であることを認める必要があります。当社はさらに上記の関連物およびMinecraftに関連する商品名とブランドに関する著作権および知的所有権も有しています。 + • ユーザーはこれからMinecraft内でMinecraftを使って、自分のものを作っていきます。当社はユーザが新たに創作したものを所有せず、所有権を主張すべきではないものに対していかなる所有権も主張しません。当社の資産および創作物のコピー(または実質的なコピー)または派生物は当社の所有となりますが(上記に概述)、ユーザーが新たに創作したものは当社の所有物ではありません。例えば、 + - ブロック1個 – 当社が所有します + - ジェットコースターが通り抜けるゴシック教会 – 当社は所有しません + • したがって、ユーザーはMinecraftの使用料を支払うことで、本規約に準じてMinecraft製品を使用する許可を購入したにすぎません。Minecraftに関連してユーザーが有する許諾は、本規約に定められている許諾に限ります。 + コンテンツ + • ユーザーがMinecraft上でまたはMinecraftを通してコンテンツを公開した場合、ユーザーはそのコンテンツを使用、コピー、修正、改変する許可を当社に付与しなければなりません。この許可は、取り消したり無拘束にすることはできません。ユーザーはまた、他のユーザーが自身のコンテンツを使用することを当社に対して許可しなければならず、他のユーザーに使用させなければなりません(マルチプレイで一緒にプレイしている人など)。 + •いかなるコンテンツも公開する前に慎重に考えてください。人目に触れ、本意でない形で他の人に使われる可能性があるからです。 + • Minecraft上でまたはMinecraftを通して公開するコンテンツは、人を不快にさせたり違法であってはなりません。公正で、独自の創作物でなくてはなりません。以下に類するものは、Minecraftを使って公開してはなりません。人種や同性愛者に対する差別的な言葉を含む投稿、いじめや冷やかしの投稿、当社や第三者の評判を毀損しかねない投稿、ポルノ、広告、第三者の創作物や肖像を含む投稿、管理人になりすましたり、人をだましたり不当に利用しようとする投稿。 + • ユーザーがMinecraft上で公開するすべてのコンテンツは、自身の創作物でなくてはなりません。第三者の権利を侵害するいかなるコンテンツも、Minecraftを使って公開してはなりません。ユーザーがMinecraft上で投稿したコンテンツについて、第三者の権利を侵害したことにより当社が第三者から意義を申し立てられたり、脅迫を受けたり、訴えられたりした場合には、そのユーザーの責任と見なします。つまり、ユーザーは当社より当社が被った損害の賠償を課される場合があります。したがって、ユーザーは自身で創作したものだけを公開し、他人が創作したコンテンツを公開しないことが非常に重要です。 + • 一緒にプレイする相手についても注意してください。他のプレイヤーが真実を述べているのかどうかを、ユーザーや当社が把握することは困難です。プロフィールが真実であるのかさえ分かりません。Minecraftを通して自身の個人情報を教えることも避けてください。 + ユーザーがMinecraftを使って作るコンテンツ(以下「自身のコンテンツ」といいます)は、以下のとおりでなくてはなりません。 + - "PlayStation Vita"本体と"PSN"を利用するためには、"PSN"利用規約(ToSUA)を含む、Sony Entertainment Networkのすべてのガイドラインに同意しなければなりません。 + - 他者に不快を与えない + - 違法または非合法ではない + - 公正で、人を欺いたりだましたり不当に利用したりせず、他人になりすましていない + - いかなる人の著作権やその他の権利を侵害していない + - 特定の人種や性別、同性愛者に差別的でない + - いじめや冷やかしをしていない + - 当社や第三者の評判を毀損しない + - ポルノを含まない + - 広告を含まない + - Minecraftを利用して、他人の権利を侵害するいかなるコンテンツも制作してはいけません。 + • ユーザーはMinecraftを利用して公開した自身のコンテンツすべてに責任を有します。 + • ユーザーは自身のコンテンツを公開することによって、ユーザーが本規約のもと公開する権限を完全に有すること、本規約のもと当社に付与された権利を行使する権限を当社が有することを保証し宣言していることになります。 + • ユーザーがMinecraftを利用して公開したコンテンツや第三者によってMinecraft上あるいはMinecraftを通して公開されたコンテンツによって、当社が第三者から意義を申し立てられたり、脅迫を受けたり、訴えられたりした場合、それを削除し、そのユーザーの責任と見なし、当社が被った損害の賠償を課すことができます。ユーザーは、Minecraftの特定の部分を利用する権利を剥奪されたり停止されたりする場合があります。 + ユーザーコンテンツ + 以下は、自身のコンテンツおよび第三者によって公開されたコンテンツ(以下「ユーザーコンテンツ」といいます)に関して一定の条件を定めるものです。Minecraftは娯楽サービスであり、それに伴い当社(およびSony Computer Entertainmentなどの当社のライセンシー)は、コンテンツの確認、選別、変更をすることなくユーザーコンテンツの伝送、配布、保管および取り出しに関わります。つまり、当社はユーザーコンテンツを確認せず、ユーザーによって何が配布されているのかを把握しないということを意味します。当社は本規約をもってユーザーが準拠すべきルールを定めていますが、すべての状況を把握することはできません。 + ですから次のことに留意してください。 + • いかなるユーザーコンテンツに示されている意見も、それぞれの著者または創作者の意見であり、当社が明示していない限り当社または当社関係者の見解ではありません。 + • 当社はすべてのユーザーコンテンツとそこに示されているすべての意見、見解、所見に対し責任を有しません(また保証や抗議を行わず、全責任を否認します)。 + • ユーザーはMinecraftを使用することで、当社がいかなるユーザーコンテンツも確認する責任を有さないこと、当社に管理や判断を行う義務はなく、行わないという原則のもとユーザーコンテンツが公開されることを承認したものとします。 + しかしながらユーザーによる本規約の違反や苦情などによりそうすることが適切であると判断した場合には、当社(またはSony Computer Entertainmentなどの当社のライセンシー)はいずれのユーザーコンテンツも削除、却下、停止することができ、ユーザーがユーザーコンテンツを投稿、公開、使用する能力を剥奪または停止することができます。上記には、Minecraftまたは"PSN"へのアクセスの禁止または停止も含まれます。また当社がユーザーコンテンツが違法であることを把握した際には迅速に対応し、当該コンテンツを削除または使用不可能にします。 + アップグレード + • 当社が今後アップグレードおよびアップデートを作成する可能性はありますが、その義務は負いません。当社は、いかなるゲームに対しても継続的なサポートやメンテナンスを提供する義務も負いません。当社としては当然Minecraftの更新を続けていくことを望んでいますが、それを保証することはできません。 + 当社の責任 + • Minecraftのコピーは、購入したユーザーに「現状のまま」提供されます。アップデートとアップグレードも「現状のまま」提供されます。これは、当社がMinecraftの規格や品質について一切の保証をせず、Minecraftの作動が中断されないことや作動の完全性、生じた損害を保証しないことを意味します。当社が保証するのは、妥当な技能と配慮をもってMinecraftとすべてのサービスを提供することのみです。多くの国の法律で、当社の怠慢によって生じた死亡事故や人身傷害の責任を免れることができないと定められています。したがって当社の不適切な行為によって、お客様がご使用中のコンピューターに刺された場合には責任を負わせていただきます。 + 当社は以下の事項の責任を負いません + • ユーザーまたは第三者によるMINECRAFTの利用および誤用 + • ユーザーがMINECRAFTを使用して公開したすべてのコンテンツ + • ユーザーによる本規約の違反 + • 第三者による本規約の違反 + 停止 + • ユーザーが本規約に違反した場合、当社はユーザーに付与したMinecraftの使用権を停止することができます。ユーザーも"PlayStation Vita"本体からMinecraftをアンインストールするだけで、いつでも停止することができます。いかなる場合も「Minecraftの所有」、「当社の責任」、「一般条項」に関する段落は、停止後も適用されます。 + 一般条項 + • これらの規約にはユーザーの法的権利が適応されます。本規約は、ユーザーの権利を制限するものではなく、当社の過失や不正表示による死亡事故や人身傷害の責任を除外したり制限するものでもありません。 + • 当社はこれらの規約内容を変更することがありますが、その変更は法律が適用される範囲内のものです。たとえば、お客様がシングルプレイモードでMinecraftをご利用で、当社がご提供するアップデートを使わない場合、既存のエンドユーザーライセンス契約(EULA)が適応されます。しかしアップデートを使用したり、当社がご提供するオンラインサービスに依存するMinecraftのコンテンツを使用する場合、新しいエンドユーザーライセンス契約(EULA)が適応されます。このような場合、当社からお客様に変更をお伝えすることができない場合がありますし、当社にはこれらの変更をお客様にお伝えする義務もありません。ですから、時々このページに戻り規約内容の変更をご確認いただきますようお願いいたします。当社は不公平な提案は嫌いです。しかし時々法律が変わるのはしかたがないことです。さらにMinecraftのユーザーに影響を与えるような行動を取る人がいるのも事実であり、規則を定めるしかないのです。 + • 当社がお客様から、Minecraftや当社のそのほかのゲームに関して提案を受けた場合、無償で利用することができるものとさせていただきます。お客様からのご提案は、当社が自由に無償で利用できるものとご理解ください。アイデア料をご希望の場合は、ご提案内容を当社に提示する前にその旨をお伝えください。 + • これらに加え、「ブランドおよび資産の利用に関するガイドライン (Brand and Asset Usage Guidelines)」をオンラインで提供しています。 + • これらの規定が守られない場合、当社(またはSony Computer Entertainment)は、ユーザーによるMinecraftの使用を阻止することができます。これらの規定を守りたくない、または守れないユーザーはMinecraftを購入、ダウンロード、使用、またはプレイしないでください。 + このページに書かれていない法律上の疑問がある場合、行動は起こさず、まずは私たちにご相談ください。常識的な行動を心がけていただければ、私たちも無茶は言いません。 + 連絡先: + Mojang AB + Maria Skolgata 83, + SE-11853 + Stockholm + Sweden + 企業コード: 556819-238 + + + + インゲームストア内のすべてのコンテンツは、Sony Network Entertainment Europe Limited ("SNEE")から購入することとなり、Sony Entertainment Networkの利用規約と条件の対象となります。利用規約と条件は"PlayStation Store"にてご提供しています。各アイテムによって内容が違う場合がありますので、ご購入前に使用権情報をご確認ください。特に記述がないかぎり、インゲームストア内のコンテンツの対象年齢は、ゲームと同じものとします。 + + + アイテムの使用と購入は利用規約と条件の対象となります。ユーザーに対し、このオンラインサービスの使用を許諾しているのはSony Computer Entertainment Americaです。 + + + + 注意: 本ソフトウエアの使用は、eu.playstation.com/legal に記載のソフトウエア利用規約 (Software Usage Terms) に準じます + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/ja-JP/stringsDynafont.xml b/Minecraft.Client/PSVitaMedia/loc/ja-JP/stringsDynafont.xml new file mode 100644 index 00000000..dc136623 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/ja-JP/stringsDynafont.xml @@ -0,0 +1,7 @@ + + + + DynaFontは、DynaComwareの登録商標です。 + + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/ja-JP/stringsGeneric.xml b/Minecraft.Client/PSVitaMedia/loc/ja-JP/stringsGeneric.xml new file mode 100644 index 00000000..87a07dd3 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/ja-JP/stringsGeneric.xml @@ -0,0 +1,6652 @@ + + + + オフライン ゲームに切り替える + + + ホストがゲームをセーブしています。しばらくお待ちください + + + 果ての世界に入る + + + プレイヤーをセーブ中 + + + ホストサーバーに接続中 + + + 地形をダウンロード中 + + + 果ての世界を出る + + + 最後に使用したベッドがなくなっているか、アクセスできません + + + モンスターが近くにいる時に休むのは危険です + + + あなたは寝ています。朝まで時間をスキップするには、すべてのプレイヤーが寝ている必要があります + + + このベッドは使用中です + + + 夜の間しか眠ることはできません + + + %s は寝ています。朝まで時間をスキップするには、すべてのプレイヤーが寝ている必要があります + + + レベルを読み込み中 + + + 最終処理中... + + + 地形を構築中 + + + 世界のシミュレート中 + + + ランク + + + セーブレベル + + + 詳細を設定中... + + + サーバーを初期化中 + + + 暗黒界を出る + + + 復活中 + + + レベルを生成中 + + + 復活地点を作成中 + + + 復活地点を読み込み中 + + + 暗黒界に入る + + + 道具と武器 + + + ガンマ + + + ゲームでの感度 + + + メニューでの感度 + + + 難易度 + + + BGM + + + 効果音 + + + ピース + + + プレイヤーの HP は自動で回復し、敵もいません + + + 敵は出現しますが、ノーマル モードほど攻撃力が高くありません + + + 敵が出現し、その攻撃力は普通です + + + イージー + + + ノーマル + + + ハード + + + サインアウト + + + 防具 + + + 機械 + + + 乗り物 + + + 武器 + + + 食べ物 + + + 建物 + + + 飾り + + + 調合 + + + 道具、武器、防具 + + + 材料 + + + 建設用ブロック + + + レッドストーンと乗り物 + + + その他 + + + 登録数: + + + セーブせずに終了 + + + 本当にメイン メニューに戻ってもよろしいですか? セーブしていない途中経過は失われてしまいます + + + 本当にメイン メニューに戻ってもよろしいですか? ここまでの途中経過は失われてしまいます + + + このセーブ データは破損しています。削除しますか? + + + 現在のゲームを終了し、すべてのプレイヤーとの接続を切断してメイン メニューに戻ってもよろしいですか? セーブしていない途中経過は失われてしまいます + + + セーブして終了 + + + 新しい世界 + + + 新しい世界の名前を入力してください + + + 世界生成のシードを入力してください + + + セーブした世界をロードする + + + チュートリアルをプレイ + + + チュートリアル + + + 新しい世界に名前をつける + + + セーブ データの破損 + + + OK + + + キャンセル + + + Minecraft ストア + + + 回転する + + + 隠す + + + すべての枠を空にする + + + 本当に現在プレイしているゲームを終了して、新しいゲームに参加してもよろしいですか? セーブしていない途中経過は失われてしまいます + + + 以前のこの世界のセーブ データを、現在のデータで上書きしてもよろしいですか? + + + 本当にセーブせずメイン メニューに戻ってもよろしいですか? この世界での途中経過は失われてしまいます + + + ゲームを始める + + + ゲームを終了 + + + ゲームをセーブ + + + セーブせずに終了 + + + START を押してゲームに参加 + + + おめでとうございます! Minecraft の Steve のゲーマー アイコンを獲得しました! + + + おめでとうございます! クリーパーのゲーマー アイコンを獲得しました! + + + 完全版を購入 + + + 相手のプレイヤーのゲームのバージョンが新しいため、ゲームに参加できません + + + 新しい世界 + + + アワードをアンロックしました! + + + 今はお試し版をプレイ中です。データをセーブするためには完全版を購入いただく必要があります +今すぐ完全版を購入しますか? + + + フレンド + + + マイスコア + + + 通算 + + + お待ちください + + + 結果なし + + + フィルター: + + + 相手のプレイヤーのゲームのバージョンが古いため、ゲームに参加できません + + + 接続が切断されました + + + サーバーとの接続が切断されました。メイン メニューに戻ります + + + サーバーにより切断されました + + + ゲームを終了 + + + エラーが起こりました。メイン メニューに戻ります + + + 接続に失敗しました + + + ゲームから追放されました + + + ホストがゲームを終了しました + + + この世界でプレイ中のフレンドがいないため、この世界には入れません + + + 以前にホストにより追放されているため、この世界には入れません + + + 空を飛んだため、ゲームから追放されました + + + 接続に時間がかかりすぎています + + + サーバーが満員です + + + 敵が出現し、その攻撃力がアップします。また、一瞬近づいただけでもクリーパーが爆発するようになるので注意しましょう + + + テーマ + + + スキン パック + + + フレンドのフレンドを許可 + + + プレイヤーを追放 + + + このプレイヤーをゲームから追放しますか? 追放されたプレイヤーは、この世界を再スタートするまで世界に入れなくなります + + + ゲーマー アイコン パック + + + この世界への参加は、ホスト プレイヤーのフレンドのみに制限されています + + + 破損したダウンロード コンテンツ + + + このダウンロード コンテンツは破損しているため使用できません。破損しているコンテンツを削除し、[Minecraft ストア] から再インストールしてください + + + 破損して使用できないダウンロード コンテンツがあります。破損しているコンテンツを削除し、[Minecraft ストア] から再インストールしてください + + + 世界に入れません + + + 選択中 + + + 選択したスキン: + + + 完全版を購入 + + + テクスチャ パックのロック解除 + + + このテクスチャ パックを世界で使用するには、これをロック解除してください。 +今すぐテクスチャ パックをロック解除しますか? + + + テクスチャ パック試用版 + + + シード + + + スキン パックのロック解除 + + + 選択したスキンを使用するには、スキン パックをロック解除してください。 +今すぐスキン パックをロック解除しますか? + + + 現在お使いのテクスチャ パックは試用版です。完全版を利用しない場合、この世界はセーブできません。 +テクスチャ パックの完全版を購入しますか? + + + 完全版をダウンロード + + + この世界は、持っていないテクスチャ パック、またはマッシュアップ パックが使用されています。 +今すぐこのテクスチャ パック、またはマッシュアップ パックをインストールしますか? + + + 試用版を購入 + + + テクスチャ パックを持っていません + + + 完全版を購入 + + + 試用版をダウンロード + + + ゲームモードを変更しました + + + 有効にすると、招待されたプレイヤーしか参加できません + + + 有効にすると、フレンド リストのフレンドのみゲームに参加できます + + + 有効にすると、プレイヤーが他のプレイヤーにダメージを与えられるようになります。(サバイバル モードのみ) + + + ノーマル + + + スーパーフラット + + + 有効にすると、オンラインのゲームになります + + + 無効にすると、このゲームに参加したプレイヤーは許可をもらわないかぎり建設や採掘ができません + + + 有効にすると、村や要塞などの建物が世界に生成されるようになります + + + 有効にすると、地上界および暗黒界に、まったく平らな世界を生成します + + + 有効にすると、プレイヤーの復活地点の近くに便利なアイテムの入ったチェストが出現します + + + 有効にすると、火は近くの可燃性ブロックに燃え広がります + + + 有効にすると、TNT 火薬を起爆すると爆発します + + + 有効にすると暗黒界を再生成します。暗黒砦が存在しないセーブ データがある場合に便利です + + + オフ + + + ゲームモード: クリエイティブ + + + サバイバル + + + クリエイティブ + + + 世界の名前を変更する + + + 世界の新しい名前を入力してください + + + ゲームモード: サバイバル + + + サバイバル モードで作成 + + + セーブデータの名前を変更する + + + %d 秒後にオートセーブを開始します... + + + オン + + + クリエイティブ モードで作成 + + + 雲を表示する + + + このセーブデータに対する操作を選んでください + + + 画面表示サイズ (画面分割) + + + 材料 + + + 燃料 + + + 分配装置 + + + チェスト + + + エンチャント + + + かまど + + + 現在、このタイプのダウンロードできるコンテンツはありません + + + 本当にこのセーブデータを削除してもよろしいですか? + + + 承認待ち + + + 検閲済み + + + %s が世界にやってきました + + + %s が世界を去りました + + + %s が追放されました + + + 調合台 + + + 看板の文字を入力 + + + 看板の文字を入力してください + + + タイトルを入力 + + + お試し版タイムアウト + + + 完全版 + + + 既に満員のため、ゲームに参加できませんでした + + + 投稿のタイトルを入力してください + + + 投稿の説明を入力してください + + + 持ち物 + + + 材料 + + + キャプションを入力 + + + 投稿のキャプションを入力してください + + + 説明を入力 + + + プレイ中: + + + この世界をアクセス禁止リストに登録しますか? +OK を選択すると、この世界でのプレイを終了します + + + アクセス禁止を解除 + + + オートセーブの間隔 + + + アクセスが禁止されています + + + アクセス禁止リストに登録されている世界に参加しようとしています。 +このまま参加すると、この世界はアクセス禁止リストから外されます + + + アクセス禁止にしますか? + + + オートセーブの間隔: オフ + + + インターフェースの不透明度 + + + オートセーブを実行します + + + 画面表示サイズ + + + + + + ここには置けません + + + 復活したプレイヤーにダメージを与える可能性があるため、復活地点の近くに溶岩を置くことはできません + + + お気に入りのスキン + + + %s のゲーム + + + ななしのホストのゲーム + + + ゲストがサインアウトしました + + + 設定を元に戻す + + + 本当に設定を最初の状態に戻してもよろしいですか? + + + ロード エラー + + + ゲスト プレイヤーの 1 人がサインアウトしたため、すべてのゲスト プレイヤーがゲームから取り除かれました + + + ゲームを作成できません + + + 自動選択されました + + + デフォルト スキン + + + サインイン + + + サインインしていません。このゲームをプレイするにはサインインが必要です。今すぐサインインしますか? + + + マルチプレイが制限されています + + + 飲む + + + このエリアには、畑があります。畑では、食べ物などの繰り返し生産できる資源を作り出すことができます + + + {*B*} + 農作業の説明を続ける: {*CONTROLLER_VK_A*}{*B*} + 農作業の説明を飛ばす: {*CONTROLLER_VK_B*} + + + 小麦、カボチャ、スイカは、種から育てます。小麦の種は、背の高い草を切ったり、小麦を栽培することで手に入れることができます。カボチャの種やスイカの種は、それぞれ、カボチャやスイカから入手します + + + クリエイティブ モードの持ち物を開くには {*CONTROLLER_ACTION_CRAFTING*} を押してください + + + 続けるには穴の反対側へ移動してください + + + クリエイティブ モードのチュートリアルを完了しました + + + 種をまく前に、くわをつかって土のブロックを耕地に変える必要があります。近くに水源や光源があり、十分な水と光が供給されていると作物が早く成長します + + + サボテンは砂に植える必要があり、成長すると 3 ブロックの高さになります。サトウキビと同様、下のブロックを収穫すると、上にあるブロックもすべて収穫できます。{*ICON*}81{*/ICON*} + + + きのこは薄暗いエリアに植えましょう。隣接する薄暗いブロックに広がっていきます。{*ICON*}39{*/ICON*} + + + 骨粉は作物を最大まで成長させたり、きのこを巨大なきのこに成長させることができます。{*ICON*}351:15{*/ICON*} + + + 小麦は何段階かに変化しながら成長していき、色が濃くなると収穫できるようになります。{*ICON*}59:7{*/ICON*} + + + カボチャとスイカの場合は、茎が太くなってきたら、種をまいた場所の隣に実ができるためのブロックが必要になります + + + サトウキビは、水ブロックと隣接する、草、土、砂のブロックに植える必要があります。また、サトウキビのブロックは中ほどを収穫すると、上にあるブロックもすべて収穫されます。{*ICON*}83{*/ICON*} + + + クリエイティブ モードではほとんどのアイテムやブロックが無限に使えます。また、道具がなくても 1 回クリックするだけでブロックが破壊できるほか、攻撃されてもダメージを受けなくなり、飛行も可能です + + + このエリアには、ピストン付きの回路を作るためのアイテムを入れたチェストがあります。すでにある回路を改造したり、1 から回路を作成したりしてみてください。チュートリアル エリアの外には、さらに多くの見本があります + + + このエリアには、暗黒界へのポータルが存在します! + + + {*B*} + ポータルと暗黒界の説明を続ける: {*CONTROLLER_VK_A*}{*B*} + ポータルと暗黒界の説明を飛ばす: {*CONTROLLER_VK_B*} + + + レッドストーンの粉は、鉄、ダイヤモンド、金のツルハシでレッドストーン鉱石を掘ると手に入ります。レッドストーンの粉を使って電気を伝えることができます。ただし、伝えられるのは距離にして 15 ブロック分、上下には 1 ブロック分までとなります + {*ICON*}331{*/ICON*} + + + レッドストーン反復装置で電気の届く距離を伸ばしたり、回路を遅延させたりすることができます + {*ICON*}356{*/ICON*} + + + ピストンは電気が送られると伸びて、最大 12 個のブロックを押します。吸着ピストンであれば、戻るときに大半の種類のブロックを 1 つ引き寄せることができます + {*ICON*}33{*/ICON*} + + + ポータルは、黒曜石のブロックで横 4 ブロック、縦 5 ブロックの枠を作成することで完成します。角のブロックは必要ありません。 + + + 暗黒界をうまく利用して地上界を高速移動することができます。暗黒界での 1 ブロックの距離は、地上界での 3 ブロックに相当します + + + クリエイティブ モードになりました + + + {*B*} + クリエイティブ モードの説明を続ける: {*CONTROLLER_VK_A*}{*B*} + クリエイティブ モードの説明を飛ばす: {*CONTROLLER_VK_B*} + + + ポータルを起動するには、火打ち石と打ち金で、フレーム内の黒曜石に火をつけましょう。枠が壊れたり、近くで爆発が起きたり、液体を流したりすると、ポータルは停止します + + + ポータルを使用するには、ポータルの中に立ちましょう。画面が紫色に変わり、音がし始め、しばらくすると、別世界へテレポートできます + + + 暗黒界はあちこちで溶岩が噴き出す危険な場所ですが、暗黒石や光石を手に入れるには最適な場所です。暗黒石は火をつけると、消えることなく燃え続け、光石は、光を発生させます + + + 農作業のチュートリアルを完了しました + + + 材料ごとに適した道具があります。木の幹を切り出す場合は斧を使うのがよいでしょう + + + 材料ごとに適した道具があります。石や鉱石を掘り出す場合はツルハシを使うのがよいでしょう。特定の種類のブロックを掘るためには、さらに優れた材料を使ってツルハシを作る必要があるかもしれません + + + 特定の道具は敵を攻撃するのに向いています。剣を使うと良いでしょう + + + アイアン ゴーレムは村に自然に現れて村人を守ることもあります。村人を攻撃すると、このアイアン ゴーレムが反撃します + + + チュートリアルを終えるまで、このエリアから出ることはできません + + + 材料ごとに適した道具があります。土や砂などの柔らかいものを掘る場合はシャベルを使うのがよいでしょう + + + ヒント: 手や、手に持っているアイテムを使って、掘ったり切ったりするには、{*CONTROLLER_ACTION_ACTION*} を押し続けます。道具を作らないと、掘れないブロックもあります + + + 川のそばにあるチェストの中に、ボートが入っています。ボートを使うには、ポインターを水に合わせて {*CONTROLLER_ACTION_USE*} を押します。ボートに乗るにはポインターをボートに合わせて {*CONTROLLER_ACTION_USE*} を押しましょう + + + 池のそばにあるチェストの中に、釣り竿が入っています。使うには、チェストから釣り竿を出してから、手に持って使うアイテムに選んでください + + + このピストン装置は、自動建設される橋です。ボタンを押して、装置の動きを調べてみましょう + + + 道具は使っていると、少しずつ壊れていきます。使うたびに少しずつ損傷していき、最後は完全に壊れます。アイテムの下にあるゲージで、現在の状態が分かります + + + 上に向かって泳ぐには {*CONTROLLER_ACTION_JUMP*} を押し続けます + + + このエリアではレールの上をトロッコが走っています。トロッコに乗るには、ポインターをトロッコに合わせて {*CONTROLLER_ACTION_USE*} を押します。トロッコを動かすには、ボタンにポインターを合わせて {*CONTROLLER_ACTION_USE*} を押しましょう + + + アイアン ゴーレムは、鉄のブロック 4 つを T 字に並べ、中央にカボチャをのせて完成します。作った人の敵を攻撃します + + + 牛、ムーシュルーム、羊には小麦を、豚にはニンジンを、ニワトリには小麦の種または暗黒茸、オオカミには肉を与えましょう。すると、近くにいる求愛モードの仲間を探し始めます + + + ともに求愛モードの同種の動物が出会うと、少しの間キスをして、動物の赤ちゃんが誕生します。赤ちゃんは、成長するまでは、両親の後ろをついて回ります + + + 一度求愛モードになった動物は、5 分間は再び求愛モードになることはありません + + + このエリアでは動物が飼育されています。動物を飼育して子供を増やすことができます + + + {*B*} + 動物の繁殖の説明を続ける: {*CONTROLLER_VK_A*}{*B*} + 動物の繁殖の説明を飛ばす: {*CONTROLLER_VK_B*} + + + 動物を繁殖させるには、動物にあった餌を与えて、動物たちを「求愛モード」にしてやる必要があります + + + 手にえさを持っていると、あなたの後ろをついてくる動物もいます。この習性を利用すれば、簡単に動物を一か所に集めことができるでしょう。{*ICON*}296{*/ICON*} + + + {*B*} + ゴーレムの説明を続ける{*CONTROLLER_VK_A*}{*B*} + ゴーレムの説明を飛ばす{*CONTROLLER_VK_B*} + + + ゴーレムは、重ねたブロックの一番上にカボチャをおいて完成します + + + スノー ゴーレムは、雪ブロックを 2 つ重ね、その上にカボチャをのせて完成します。作った人の敵に、雪玉を投げます + + + 野生のオオカミは、骨を与えることで手なずけることができます。オオカミを手なずけると周りにハートマークが現れます。手なずけたオオカミは、座らせていないときはプレイヤーにつき従い守ってくれます + + + 動物の繁殖のチュートリアルを完了しました + + + このエリアには、スノー ゴーレムやアイアン ゴーレムを作るためのカボチャやブロックがあります + + + 電気の源を配置する位置や向きで、周囲のブロックへの効果が変わります。たとえば、ブロックに設置されたレッドストーンのたいまつは、そのブロックに電気が送られると消えます + + + 大釜が空になったら、水バケツを使って水を溜めてください + + + 調合台を使って耐火ポーションを作りましょう。水のビン、暗黒茸とマグマクリームを用意してください + + + ポーションを使うには、ポーション手に持って {*CONTROLLER_ACTION_USE*} を押します。普通のポーションは飲んだ本人に効果を発揮します。スプラッシュポーションの場合は、投げて落ちた所の周囲にいるクリーチャーに効果を発揮します + スプラッシュポーションは普通のポーションに火薬を混ぜ合わせると作れます + + + {*B*} + 調合とポーションの説明を続ける: {*CONTROLLER_VK_A*}{*B*} + 調合とポーションの説明を飛ばす: {*CONTROLLER_VK_B*} + + + 調合では、最初に水のビンを作ります。チェストからガラスビンを出しましょう + + + 水の入った大釜か水のブロックからガラスビンに水を移します。水源にポインターを合わせてから {*CONTROLLER_ACTION_USE*} を押してガラスビンに水を詰めてください + + + 耐火ポーションを自分に使ってみましょう + + + アイテムをエンチャントするには、まずアイテムをエンチャントの枠に入れてください。武器や防具、一部の道具にエンチャントすることで、ダメージ耐性を上げたり、採掘量を増やしたりなどの特別なボーナスを付加できます + + + エンチャントの枠にアイテムを入れると、右側のボタンにランダムなエンチャントが表示されます + + + ボタンに表示される数値はそのエンチャントを行うのに必要な経験値を表します。経験値が足りない場合、使えないボタンは無効になります + + + 火と溶岩に対する耐性が上がりました。これまで行けなかった場所にも行けるので試してみましょう + + + これがエンチャントの画面です。武器や防具、一部の道具にエンチャントすることで、特別なボーナスを付加できます + + + {*B*} + エンチャント画面の説明を続ける: {*CONTROLLER_VK_A*}{*B*} + エンチャント画面の説明を飛ばす: {*CONTROLLER_VK_B*} + + + ここには調合台、大釜と調合に必要なアイテムが詰まったチェストがあります. + + + 木炭は燃料として使えます。棒と組み合わせると、たいまつになります + + + 材料を入れる所に砂を入れると、ガラスを作ることができます。小屋の窓用にガラスを作ってみましょう + + + これが調合の画面です。さまざまな効果を発揮するポーションを作ることができます + + + 木でできているアイテムの多くが燃料として使えますが、種類によって燃える時間が異なります。さらに木以外にも燃料として使えるアイテムがあります + + + アイテムの加工が終わると、その完成したアイテムを持ち物へ移動できます。様々な材料を使って、何が出来上がるのかいろいろ実験してみましょう + + + 木を材料に使うと、木炭が出来上がります。かまどに燃料を入れ、材料を入れる所に木を入れてください。木炭が出来上がるには少し時間がかるので、その間は他のことをしながら、時々進み具合を確かめに戻って来ましょう + + + {*B*} + 調合台の説明を続ける: {*CONTROLLER_VK_A*}{*B*} + 調合台の説明を飛ばす: {*CONTROLLER_VK_B*} + + + 発酵したクモの目を加えると、ポーションが腐敗して効果が反転します。また、火薬を加えるとポーションがスプラッシュポーションになり、投げると落ちた場所の周囲に効果を発揮するようになります + + + まず暗黒茸を水のビンに加え、それからマグマクリームを足すことで耐火のポーションを作りましょう + + + 調合画面を閉じるには {*CONTROLLER_VK_B*} を押します + + + 調合を行うには、上の枠に材料を入れ、下の枠にポーションまたは水のビンを入れます (一度に 3 つまで調合可能)。正しい組み合わせの材料が置かれると調合が始まり、少し待てばポーションの出来上がりです + + + ポーションの調合にはまず水のビンが必要です。また、ほとんどのポーションは暗黒茸から不完全なポーションを作るところから始め、完成させるには少なくともあと 1 種類の材料を必要とします + + + ポーションを作ったら、その効果を変えることができます。レッドストーンの粉を加えると効果の持続時間が延長され、光石の粉を加えると効果がより強くなります + + + エンチャントを行うには、エンチャントを選んで {*CONTROLLER_VK_A*} を押してください。エンチャントのコストに応じて経験値レベルが下がります + + + 釣りを始めるには {*CONTROLLER_ACTION_USE*} を押します。リールを巻き上げるときも {*CONTROLLER_ACTION_USE*} を押してください + {*FishingRodIcon*} + + + 水の表面にある浮きが沈むまで待ってから、釣り糸を巻き上げて魚を釣り上げます。魚は生でも食べられますし、かまどで調理することもできます。食べると HP が回復します + {*FishIcon*} + + + 釣り竿は 様々な道具と組み合わせることができますが、その用途は比較的限られています。しかし魚を釣る以外のこともできます。釣り竿を使って他に何が釣れるのか、どんなことができるのか、いろいろ試してみましょう + {*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*} を押してください。 + + + 選択 + + + 使う + + + このエリアで、釣り竿、ボート、ピストン、レッドストーンなどの使い方を練習しましょう + + + このエリアの外では、建物、畑、トロッコ、エンチャント、調合、取引、鍛冶などがあなたを待っています! + + + 空腹ゲージが減りすぎて、HP が回復できません。 + + + 取る + + + 次へ + + + 前へ + + + プレイヤーを追放 + + + フレンド登録の依頼を送る + + + 次へ + + + 前へ + + + 染める + + + 回復する + + + おすわり + + + ついてこい + + + 掘る + + + えさを与える + + + 手なずける + + + フィルターを変更 + + + すべて置く + + + 1 つ置く + + + 落とす + + + すべて取る + + + 半分取る + + + 置く + + + すべて落とす + + + クイック選択バーを空にする + + + これは何? + + + Facebook に公開 + + + 1 つ落とす + + + 入れ替え + + + クイック移動 + + + スキン パック + + + 赤のステンドグラスの板 + + + 緑のステンドグラスの板 + + + 茶色のステンドグラスの板 + + + 白のステンドグラス + + + ステンドグラスの板 + + + 黒のステンドグラスの板 + + + 青のステンドグラスの板 + + + 灰色のステンドグラスの板 + + + ピンクのステンドグラスの板 + + + 黄緑のステンドグラスの板 + + + 紫のステンドグラスの板 + + + 水色のステンドグラスの板 + + + 薄灰色のステンドグラスの板 + + + オレンジのステンドグラス + + + 青のステンドグラス + + + 紫のステンドグラス + + + 水色のステンドグラス + + + 赤のステンドグラス + + + 緑のステンドグラス + + + 茶色のステンドグラス + + + 薄灰色のステンドグラス + + + 黄色のステンドグラス + + + 空色のステンドグラス + + + 赤紫のステンドグラス + + + 灰色のステンドグラス + + + ピンクのステンドグラス + + + 黄緑のステンドグラス + + + 黄色のステンドグラスの板 + + + 薄灰色 + + + 灰色 + + + ピンク + + + + + + + + + 水色 + + + 黄緑 + + + オレンジ + + + + + + カスタム + + + 黄色 + + + 空色 + + + 赤紫 + + + 茶色 + + + 白のステンドグラスの板 + + + 球体 (小) + + + 球体 (大) + + + 空色のステンドグラスの板 + + + 赤紫のステンドグラスの板 + + + オレンジのステンドグラスの板 + + + 星形 + + + + + + + + + + + + クリーパーの形 + + + 破裂 + + + 未知の形 + + + 黒のステンドグラス + + + 鉄の馬鎧 + + + 金の馬鎧 + + + ダイヤモンドの馬鎧 + + + レッドストーン比較装置 + + + 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*} +{*C3*}僕らは誰だろう? 山の精霊と呼ばれたこともあった。父なる太陽、母なる月、祖先の魂、獣の性、異教のソウル、幽霊、宇宙人、神、悪魔、天使、ポルターガイスト、エイリアン、地球外生命体、レプトン、クォーク。言葉は変わる。僕らは変わらない{*EF*}{*B*}{*B*} +{*C2*}僕らは宇宙。君が君ではないと思うものすべて。君が今その肌と目を通して見ているもの。宇宙は君にふれ、君に光を投げかける。君の姿を見るためだよ、プレイヤー。君を知り、君に知ってもらうために。さあ、話を始めよう{*EF*}{*B*}{*B*} +{*C2*}昔むかしあるところに、ひとりのプレイヤーがいました{*EF*}{*B*}{*B*} +{*C3*}プレイヤーとは君、{*PLAYER*}だ{*EF*}{*B*}{*B*} +{*C2*}自転する溶けた岩の薄い地表に立ったプレイヤーは、ある時自分自身を人間だと考えました。溶けた岩で出来たボールは、それより 33 万倍も大きい燃えるガスのかたまりの周りを回っていました。2 つのかたまりの間は、光の速さで 8 分もかかるほど離れていました。光は星からの情報で 1,500 万キロメートル離れたプレイヤーの肌を焦がすことさえできました{*EF*}{*B*}{*B*} +{*C2*}平らで果てしない世界の上で、プレイヤーはある時鉱山で働く夢を見ました。太陽は白く四角でした。明るい時間は短すぎ、やるべきことは多すぎました。死は束の間の厄介ごとでした{*EF*}{*B*}{*B*} +{*C3*}またある時は、プレイヤーは物語の中で自分自身を見失う夢を見ました{*EF*}{*B*}{*B*} +{*C2*}そしてまたある時は、プレイヤーは別の場所で、別のものになる夢を見ました。夢は時に不快で、時にとても美しくもありました。プレイヤーはひとつの夢から目覚め、別の夢に入り込み、また覚めては他の夢を見ました{*EF*}{*B*}{*B*} +{*C3*}そして、ある夢の中でプレイヤーは画面上に文字を見ました{*EF*}{*B*}{*B*} +{*C2*}少し戻ろうか{*EF*}{*B*}{*B*} +{*C2*}プレイヤーの原子は草原に、川に、大地に散らばりました。ある女の人がばらまかれた原子を集め、食べ、飲み、吸い込み、体の中でプレイヤーを組み立てました{*EF*}{*B*}{*B*} +{*C2*}温かく暗い母の胎内から目覚めたプレイヤーは、長い夢に入っていきました{*EF*}{*B*}{*B*} +{*C2*}プレイヤーは DNA に記された、語られたことのない新しい物語でした。十億年前に書かれたソースコードに生成された、実行されたことのない新しいプログラムでした。乳と愛によってのみ造られた、かつて存在しなかった新しい人間でした{*EF*}{*B*}{*B*} +{*C3*}君はプレイヤー。物語。プログラム。乳と愛によってのみ造られた人間{*EF*}{*B*}{*B*} +{*C2*}もっとさかのぼろう{*EF*}{*B*}{*B*} +{*C2*}このゲームよりずっとずっと先に 70 億の 10 億倍のさらに 10 億倍の原子によって、プレイヤーの体は星の中心で作られました。ですから、プレイヤーも星からの情報なのです。プレイヤーはジュリアンという人が植えた情報の森の物語を進みマルクスという人が作った平らで果てしない世界を渡ります。物語はプレイヤーが密かに作り上げた小さな世界の中に存在し、そのプレイヤーが住む宇宙を作ったのは...{*EF*}{*B*}{*B*} +{*C3*}それは秘密だ。時にプレイヤーは、柔らかく、暖かく、優しい世界をこっそり作りました。ある世界は厳しく、凍てつき、複雑でもありました。プレイヤーは宇宙の模型を空想することもありました。小さなエネルギーのかたまりが何もない広大な空間を飛び交います。このかたまりは「電子」や「陽子」と呼ばれるものでした{*EF*}{*B*}{*B*} + + + {*C2*}中には「惑星」や「恒星」と呼ばれるものもありました{*EF*}{*B*}{*B*} +{*C2*}プレイヤーは「オフ」と「オン」、「0」と「1」、プログラムで作られた世界の中にいると信じていたこともありました。また、ゲームで遊んでいると思い込んでいたこともありました。そして、画面上の文字を読んでいる、と思っていたこともありました{*EF*}{*B*}{*B*} +{*C3*}その文字を読んでいるのが君、プレイヤー...{*EF*}{*B*}{*B*} +{*C2*}黙って。プレイヤーは画面に映し出されたコードを読むこともありました。コードを言葉に分解し、言葉から意味をくみ取り、意味から感情を、思いを、理論を、考えを引き出しました。呼吸が深く速くなり、そうしてプレイヤーは気がついたのです。自分が生きていることに。今まで経験した幾千もの死は現実ではなかったことに{*EF*}{*B*}{*B*} +{*C3*}それが君。君だ。君は生きているんだ{*EF*}{*B*}{*B*} +{*C2*}時折、夏の木漏れ日から宇宙の語りかける声を聞いたと感じることもありました{*EF*}{*B*}{*B*} +{*C3*}時折、宇宙の声は、冷たく澄んだ冬の夜空の輝きから聞こえると感じたこともありました。視界の端にかすかに見えたのは、太陽より百万倍も大きな星の光だったのかもしれません。燃えた星のプラズマが、ほんの一瞬だけプレイヤーの目に映ったのです。プレイヤーは宇宙のはるか遠くで、家に向かって歩いている途中に突然おいしそうな匂いを感じ、慣れ親しんだ家のドアに今にもたどり着きそうなところでした。そしてプレイヤーはまた夢を見るのです{*EF*}{*B*}{*B*} +{*C2*}時折、宇宙は「0」と「1」を通して、世界の電気を介して語りかけてくるのだと感じたこともありました。夢の終わりには、宇宙は画面上を流れていく言葉で話しかけていました{*EF*}{*B*}{*B*} +{*C3*}宇宙は言いました。「愛している」{*EF*}{*B*}{*B*} +{*C2*}「辛抱強く遊んでくれてありがとう」{*EF*}{*B*}{*B*} +{*C3*}「君が必要とする物は、すべて自分の中にある」{*EF*}{*B*}{*B*} +{*C2*}「君は自分が思うより強いのだ」{*EF*}{*B*}{*B*} +{*C3*}「君は日差しだ」{*EF*}{*B*}{*B*} +{*C2*}「君は闇夜だ」{*EF*}{*B*}{*B*} +{*C3*}「君が闘っている暗闇は自分の内側に他ならない」{*EF*}{*B*}{*B*} +{*C2*}「君が求める光は自分の内側に存在する」{*EF*}{*B*}{*B*} +{*C3*}「君はひとりではない」{*EF*}{*B*}{*B*} +{*C2*}「君はすべてから切り離された存在ではない」{*EF*}{*B*}{*B*} +{*C3*}「君自身が宇宙だ。君は自分を試し、自分に語りかけ、自分を見つめている」{*EF*}{*B*}{*B*} +{*C2*}「そして僕が君を愛するのは、君自身が愛であるからだ」{*EF*}{*B*}{*B*} +{*C3*}ゲームは終わり、プレイヤーは夢から目覚め、また新しい夢が始まります。次にプレイヤーが見る夢はもっと素晴らしいものでしょう。プレイヤーは宇宙であり、愛でした{*EF*}{*B*}{*B*} +{*C3*}さあ、プレイヤー{*EF*}{*B*}{*B*} +{*C2*}目を覚まして{*EF*} + + + + 暗黒界をリセットする + + + %s は果ての世界に入りました + + + %s は果ての世界から出ました + + + {*C3*}この人が、例のプレイヤーか{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}のこと?{*EF*}{*B*}{*B*} +{*C3*}そう。気をつけろよ、もうずいぶんレベルが上がったみたいだ。僕らの考えは読まれているんだから{*EF*}{*B*}{*B*} +{*C2*}別にいいよ。僕らはゲームの一部だと思われてるんだろうし{*EF*}{*B*}{*B*} +{*C3*}僕はこのプレイヤー嫌いじゃないな。あきらめないで、たくさん遊んだじゃないか{*EF*}{*B*}{*B*} +{*C2*}僕らの思考が画面上の文字みたいに読まれてるね{*EF*}{*B*}{*B*} +{*C3*}ゲームという夢にのめり込んでいる時、プレイヤーは言葉を使っていろいろな物事を想像するらしい{*EF*}{*B*}{*B*} +{*C2*}言葉はとても柔軟で素晴らしいインターフェイスだね。その上、画面の外の現実を直視するより全然怖くない{*EF*}{*B*}{*B*} +{*C3*}文字で読めるようになる前には声を使ってたんだぞ。ゲームをしない人がゲームをする人たちを魔法使いとか賢者とか呼んで、悪魔の杖に乗って空を飛ぶ夢を見ていた頃の話だ{*EF*}{*B*}{*B*} +{*C2*}このプレイヤーは何の夢を見たんだろう?{*EF*}{*B*}{*B*} +{*C3*}陽の光と木の夢。それに火と水。夢を見ては、作る。夢を見ては、壊す。夢を見ては、狩る。時々狩られたりしたけど。あとは安全な場所の夢だ{*EF*}{*B*}{*B*} +{*C2*}ふーん、元祖インターフェイスか。100 万年も昔の物なのにまだちゃんと動く。でもプレイヤーは、画面の外の現実で、本当はどんなものを作ったんだろう?{*EF*}{*B*}{*B*} +{*C3*}それは、{*EF*}{*NOISE*}{*C3*} の檻の中で真実の世界を彫り上げるために、100 万の人と一緒に {*EF*}{*NOISE*}{*C3*} を作ったんだ。目的は {*EF*}{*NOISE*}{*C3*} だ。{*EF*}{*NOISE*}{*C3*} の中のことに過ぎないのに{*EF*}{*B*}{*B*} +{*C2*}これはプレイヤーには読めないね{*EF*}{*B*}{*B*} +{*C3*}そう、まだ最高レベルまで到達していないから。ゲームの中の短い夢じゃなくて、人生の長い夢を叶えなくてはいけない{*EF*}{*B*}{*B*} +{*C2*}プレイヤーは僕らの好意を知っているの? 宇宙は寛容だってことを?{*EF*}{*B*}{*B*} +{*C3*}おそらく。プレイヤーは宇宙の思いのノイズを聞いている{*EF*}{*B*}{*B*} +{*C2*}でもプレイヤーの長い夢の中には、時に悲しいこともある。夏が訪れず、黒い太陽の下で凍え、自分が作った悲しさを現実と思ってしまうことがある{*EF*}{*B*}{*B*} +{*C3*}だがその悲しさを外から癒すと、プレイヤーは壊れてしまう。悲しみはプレイヤー自身が乗り越えるもののひとつで、外から干渉できることではない{*EF*}{*B*}{*B*} +{*C2*}プレイヤーがあまりに夢に浸っていると、時々教えたくなるんだ。プレイヤーは現実に本当の世界を作り上げていることを。その存在が宇宙にとって大切であることを。もし本当の絆を持てない時は、恐くて口に出せないでいる言葉を言う手助けをしたくなる{*EF*}{*B*}{*B*} +{*C3*}おい、プレイヤーに読まれているぞ{*EF*}{*B*}{*B*} +{*C2*}プレイヤーのことなんかどうでもいい時もあるけど、教えてあげたい時もある。現実だと思っている世界は本当はただの {*EF*}{*NOISE*}{*C2*} で、しかも {*EF*}{*NOISE*}{*C2*} だけだってこと。プレイヤーは {*EF*}{*NOISE*}{*C2*} の中では {*EF*}{*NOISE*}{*C2*} なんだ。長い夢の中で知る現実はほんの一部でしかない{*EF*}{*B*}{*B*} +{*C3*}それでもプレイヤーはゲームを遊ぶんだ{*EF*}{*B*}{*B*} +{*C2*}だけど、真実を教えることは簡単じゃないか...{*EF*}{*B*}{*B*} +{*C3*}この夢の中では厳しすぎる。生きる方法を教えることは、生きる道を閉ざすことと同じだ{*EF*}{*B*}{*B*} +{*C2*}だから僕は生き方を教えない{*EF*}{*B*}{*B*} +{*C3*}プレイヤーは落ち着かなくなってきてるな{*EF*}{*B*}{*B*} +{*C2*}なら、ある物語を教えようよ{*EF*}{*B*}{*B*} +{*C3*}ただの物語で真実ではない{*EF*}{*B*}{*B*} +{*C2*}そう。辺りを焼き払ってしまうようなむき出しの真実ではなく、言葉の檻の中に真実を優しく隠した物語{*EF*}{*B*}{*B*} +{*C3*}もう一度プレイヤーに体を与えよう{*EF*}{*B*}{*B*} +{*C2*}さあ、プレイヤー...{*EF*}{*B*}{*B*} +{*C3*}君の名前をもう一度聞かせてほしい{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}。ゲームのプレイヤーだよ{*EF*}{*B*}{*B*} +{*C3*}では始めようか{*EF*}{*B*}{*B*} + + + 本当にこのセーブ データの暗黒界を最初の状態にリセットしてもよろしいですか? 暗黒界に建設したものはすべて失われます + + + 現在、スポーン エッグを使用できません。 豚、羊、牛、ネコ、馬の数が最大数に達しました + + + 現在、スポーン エッグを使用できません。 ムーシュルームの数が最大数に達しました + + + 現在、スポーン エッグを使用できません。 世界のオオカミの数が最大数に達しました + + + 暗黒界をリセットする + + + 暗黒界をリセットしない + + + 現在、ムーシュルームは毛刈りできません。豚、羊、牛、ネコ、馬の数が最大数に達しました。 + + + ゲームオーバー! + + + 世界のオプション + + + 建設と採掘の許可 + + + ドアとスイッチを使用可能 + + + 建物を生成する + + + スーパーフラット + + + ボーナス チェスト + + + 入れ物を使用可能 + + + プレイヤーを追放 + + + 飛行可能 + + + 疲労無効 + + + プレイヤーを攻撃可能 + + + 動物を攻撃可能 + + + ホストオプション変更可能 + + + ホスト特権 + + + 遊び方 + + + 操作方法 + + + 設定 + + + 復活 + + + 利用可能ダウンロード コンテンツ + + + スキンを変更 + + + クレジット + + + TNT の爆発 + + + PvP + + + 高度な操作を許可 + + + コンテンツを再インストール + + + デバッグ設定 + + + 火の延焼 + + + エンダードラゴン + + + {*PLAYER*}はエンダードラゴンのブレスで力尽きた + + + {*PLAYER*} は {*SOURCE*} に倒された + + + {*PLAYER*} は {*SOURCE*} に倒された + + + {*PLAYER*} は力尽きた + + + {*PLAYER*} は爆発した + + + {*PLAYER*} は魔法により力尽きた + + + {*PLAYER*} は {*SOURCE*} に撃たれて力尽きた + + + 岩盤の霧 + + + HUD の表示 + + + プレイヤーの手の表示 + + + {*PLAYER*} は {*SOURCE*} に火だるまにされた + + + {*PLAYER*} は {*SOURCE*} に叩き潰された + + + {*PLAYER*} は魔法によって {*SOURCE*} に倒された + + + {*PLAYER*} は世界の外へ落ちた + + + テクスチャ パック + + + マッシュアップ パック + + + {*PLAYER*} は火の中で力尽きた + + + テーマ + + + ゲーマーアイコン + + + アバター アイテム + + + {*PLAYER*} は火によって力尽きた + + + {*PLAYER*} は飢えて力尽きた + + + {*PLAYER*} は刺されて力尽きた + + + {*PLAYER*} は落下の衝撃で力尽きた + + + {*PLAYER*} は溶岩に飲み込まれた + + + {*PLAYER*} は壁に飲み込まれた + + + {*PLAYER*} は溺れて力尽きた + + + ゲームオーバー メッセージ + + + ホストオプションを変更できなくなりました + + + 飛行できるようになりました + + + 飛行できなくなりました + + + 動物を攻撃できなくなりました + + + 動物を攻撃できるようになりました + + + ホストオプションを変更できるようになりました + + + 疲労無効になりました + + + 攻撃されてもダメージを受けなくなりました + + + 攻撃されるとダメージを受けます + + + %d MSP + + + 疲労無効ではなくなりました + + + 不可視になりました + + + 不可視ではなくなりました + + + プレイヤーを攻撃できるようになりました + + + 採掘やアイテムの使用ができるようになりました + + + ブロックを設置できなくなりました + + + ブロックを設置できるようになりました + + + キャラクターを動かす + + + カスタム スキン アニメーション + + + 採掘やアイテムの使用ができなくなりました + + + ドアとスイッチを使用できるようになりました + + + 生き物を攻撃できなくなりました + + + 生き物を攻撃できるようになりました + + + プレイヤーを攻撃できなくなりました + + + ドアとスイッチを使用できなくなりました + + + チェストなどの入れ物を使用できるようになりました + + + チェストなどの入れ物を使用できなくなりました + + + 不可視 + + + ビーコン + + + {*T3*}遊び方: ビーコン{*ETW*}{*B*}{*B*} +有効化されたビーコンは空に向かって明るい光を発し、近くのプレイヤーにパワーを与えます。{*B*} +材料はガラス、黒曜石、暗黒星。暗黒星はウィザーを倒すと手に入ります。{*B*}{*B*} +ビーコンは、昼間日が当たる所に設置する必要があります。鉄、金、エメラルド、ダイヤモンドのピラミッドにはビーコンの設置が必要です。{*B*} +ビーコンのパワーは、設置する素材の影響を受けません。{*B*}{*B*} +ビーコン メニューでは、ビーコンの第 1 パワーを 1 つ選ぶことができます。ピラミッドの段が多いほど、パワーの選択肢が増えます。{*B*} +4 段以上のピラミッドでは、第 2 パワーの再生能力か、より強力な第 1 パワーが選択肢に加わります。{*B*}{*B*} +ビーコンにパワーを設定するには、支払いの枠にエメラルド、ダイヤモンド、金の延べ棒、鉄の延べ棒のいずれかを 1 つ置く必要があります。{*B*} +ビーコンは、一度設定したら無限にパワーを発揮します{*B*} + + + 花火 + + + 言語 + + + + + + {*T3*}遊び方: 馬{*ETW*}{*B*}{*B*} +馬とロバは主に広い平原に生息します。ラバはロバと馬をかけ合わせて生まれますが、自身に繁殖能力はありません。{*B*} +おとなの馬、ロバ、ラバには、すべて乗ることができます。ただし、防具を装備できるのは馬のみ、鞍袋をつけてアイテムを運べるのはラバとロバのみです。{*B*}{*B*} +馬、ロバ、ラバは、使う前に手なずける必要があります。馬は、振り落とされずに乗り続けることで手なずけられます。{*B*} +手なずけると周りにハートマークが現れ、プレイヤーを振り落とさなくなります。馬を操るには、馬に鞍をつける必要があります。{*B*}{*B*} +鞍は村で買ったり、ゲームの世界に隠されたチェストで見つけたりできます。{*B*} +手なずけたロバとラバは、チェストを取りつけることで鞍袋が与えられます。鞍袋には、乗っている間やしのび足の時に触ることができます。{*B*}{*B*} +馬とロバ (ラバは除く) は、ほかの動物と同じように金のリンゴや金のニンジンで繁殖させることができます。{*B*} +子どもたちはいずれおとなの馬に成長しますが、小麦か干し草を与えると成長が速まります{*B*} + + + {*T3*}遊び方: 花火{*ETW*}{*B*}{*B*} +花火は、手または分配装置から発射できる装飾用のアイテムです。紙、火薬、様々な花火の星 (オプション) で作られます。{*B*} +花火の星の色、変化、形、大きさ、効果 (尾やきらめきなど) は、作る時に追加の材料を入れることでカスタマイズできます。{*B*}{*B*} +花火を作るには、持ち物の上に表示される 3x3 の材料の枠に火薬と紙を入れます。{*B*} +材料の枠に複数の花火の星を入れて、花火に加えることができます (オプション)。{*B*} +火薬を多くの枠に入れるほど、花火の星が爆発する高さが上がります。{*B*}{*B*} +出来上がった花火は、右の枠から取り出せます。{*B*}{*B*} +花火の星は、材料の枠に火薬と染料を入れて作ります。{*B*} + - 花火の星が爆発する際の色は、染料で決まります。{*B*} + - 花火の星の形は、発火剤、金の塊、羽根、モブ ヘッドのうちのどれかを加えることで決まります。{*B*} + - 尾やきらめきを加えるには、ダイヤモンドか光石の粉を使います。{*B*}{*B*} +出来上がった花火の星に染料を加えると、色の変化をつけられます + + + + {*T3*}遊び方: ドロッパー{*ETW*}{*B*}{*B*} +ドロッパーはレッドストーンから動力を受けると、中に入っているアイテムを 1 つランダムに落とします。{*CONTROLLER_ACTION_USE*} でドロッパーを開けて、持ち物からアイテムを移せます。{*B*} +ドロッパーがチェストやその他の入れ物の隣にあると、落とすはずのアイテムをその中に移します。ドロッパーを何台も繋いで、アイテムを遠くに運ぶ輸送機関を作ることができます。ただし作動させるには、動力のオンとオフを繰り返す必要があります + + + 使うと、現在地の地図になる。探検するにつれて空白が埋まっていく + + + ウィザーが落とす。ビーコンを作るのに使う + + + ホッパー + + + {*T3*}遊び方: ホッパー{*ETW*}{*B*}{*B*} +ホッパーは入れ物にアイテムを出し入れしたり、投げ入れられたアイテムを自動的に拾い上げるのに使います。{*B*} +調合台、チェスト、発射装置、ドロッパー、チェストつきトロッコ、ホッパーつきトロッコ、ほかのホッパーに作用します。{*B*}{*B*} +ホッパーは上にある入れ物から、絶えずアイテムを吸い取ろうとします。また、保管しているアイテムを出力側の入れ物に転送しようとします。{*B*} +レッドストーンから電気が送られると動作しなくなり、アイテムの吸い取りと転送を停止します。{*B*}{*B*} +ホッパーは、アイテムを出す方向に向きます。特定のブロックに向かせるには、しのび足をしながらブロックをホッパーに接触させます{*B*} + + + + ドロッパー + + + NOT USED + + + 回復 + + + ダメージ + + + 跳躍 + + + 疲労 + + + + + + 弱体化 + + + 目まい + + + NOT USED + + + 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のヘッド + + + クリーパー ヘッド + + + ガイコツ スカル + + + ウィザー ガイコツ スカル + + + ゾンビ ヘッド + + + 石炭を省スペースに保管できる。かまどの燃料として使う + + + + + + 空腹 + + + 鈍化の + + + スピードの + + + 不可視 + + + 水中呼吸 + + + 暗視 + + + 盲目 + + + ダメージの + + + 回復の + + + 目まいの + + + 再生の + + + 疲労の + + + 勤勉の + + + 弱体化の + + + 力の + + + 耐火 + + + 飽和 + + + 耐性の + + + 跳躍の + + + ウィザー + + + HP ブースト + + + 吸収 + + + + + + II + + + III + + + 不可視の + + + IV + + + 水中呼吸の + + + 耐火の + + + 暗視の + + + 毒の + + + 空腹の + + + 吸収の + + + 飽和の + + + HP ブーストの + + + 盲目の + + + 腐敗の + + + 素朴な + + + 薄い + + + 拡散した + + + クリアな + + + ミルキーな + + + 不完全な + + + バター風味の + + + なめらかな + + + 無様な + + + 気の抜けた + + + かさばる + + + 無個性な + + + (スプラッシュ) + + + 陳腐な + + + 退屈な + + + 粋な + + + 真心の + + + チャーミングな + + + エレガントな + + + ファンシーな + + + きらめく + + + 悪臭の + + + 刺激のある + + + 無臭の + + + 強力な + + + よどんだ + + + 上品な + + + 洗練された + + + 濃厚な + + + 小粋な + + + プレイヤー、動物、モンスターの HP を時間とともに回復させます + + + プレイヤー、動物、モンスターの HP を瞬時に減少させます + + + プレイヤー、動物、モンスターが、火、溶岩、ブレイズの攻撃からダメージを受けなくなります + + + 単体では効果がありませんが、調合台で使用することができ、材料を追加するとポーションができます。 + + + えぐい + + + プレイヤー、動物、モンスターの移動スピードを低下させ、プレイヤーの走るスピード、ジャンプ距離、視界を低下させます + + + プレイヤー、動物、モンスターの移動スピードを上昇させ、プレイヤーの走るスピード、ジャンプ距離、視界を向上させます + + + プレイヤーやモンスターの攻撃ダメージを上昇させます + + + プレイヤー、動物、モンスターの HP を瞬時に回復させます + + + プレイヤーやモンスターの攻撃ダメージを低下させます + + + すべてのポーションの基礎に使用します。調合台で使用すると、ポーションができます。 + + + キモい + + + 臭い + + + 聖なる力 + + + 鋭さ + + + プレイヤー、動物、モンスターの HP を時間とともに減少させます + + + 攻撃ダメージ + + + ノックバック + + + 虫殺し + + + スピード + + + ゾンビ補強 + + + 馬の跳躍力 + + + 効果: + + + ノックバック耐性 + + + モブ追跡範囲 + + + HP 最大 + + + 技能 + + + 効率 + + + 水中作業 + + + 幸運 + + + アイテムボーナス + + + 耐久力 + + + 防火 + + + 防護 + + + 火属性 + + + 落下軽減 + + + 水中呼吸 + + + 間接攻撃耐性 + + + 爆発耐性 + + + IV + + + V + + + VI + + + 衝撃 + + + VII + + + III + + + 火炎 + + + パワー + + + 無限 + + + II + + + I + + + 何かがトリップワイヤーに引っかかると作動する + + + 何かが引っかかると、接続しているトリップワイヤーフックが始動する + + + エメラルドを省スペースに保管できる + + + チェストのようなもの。ただし中に入れたアイテムは、別の次元にあるものも含めて、そのプレイヤーのすべてのエンダーチェストで使うことができる + + + IX + + + VIII + + + 鉄のツルハシ以上で掘れる。エメラルドが採れる + + + X + + + 2{*ICON_SHANK_01*} 回復する。金のニンジンの材料になる。農地に植えられる + + + 装飾として使われる。花、苗木、サボテン、きのこを植えられる + + + 丸石でできた壁 + + + 0.5{*ICON_SHANK_01*} 回復する。かまどで調理することも可能。農地に植えられる + + + かまどで精錬すると暗黒石英になる + + + 武器、道具、防具を修理するのに使われる + + + 村人と取引できる + + + 装飾として使われる + + + 4{*ICON_SHANK_01*} 回復する + + + 1{*ICON_SHANK_01*} 回復する。かまどで調理することも可能。農地に植えられる。食べると毒にあたる可能性がある + + + 鞍をつけた豚に乗って、操縦するのに使われる + + + 3{*ICON_SHANK_01*} 回復する。かまどでじゃがいもを調理するとできる + + + 3{*ICON_SHANK_01*} 回復する。ニンジンと金の塊から作られる + + + 武器、道具、防具を金床でエンチャントするのに使われる + + + 暗黒石英の鉱石を掘ると手に入る。石英ブロックの材料になる + + + ジャガイモ + + + 焼いたジャガイモ + + + ニンジン + + + ウールから作る。装飾として使われる + + + エメラルド + + + 植木鉢 + + + カボチャのパイ + + + エンチャントの本 + + + 毒ジャガイモ + + + 金のニンジン + + + 串刺しのニンジン + + + トリップワイヤーフック + + + トリップワイヤー + + + 暗黒石英 + + + エメラルドの鉱石 + + + エンダーチェスト + + + 苔の生えた丸石の壁 + + + エメラルドのブロック + + + 丸石の壁 + + + ジャガイモ + + + 植木鉢 + + + ニンジン + + + 少し損傷した金床 + + + 金床 + + + 金床 + + + 石英ブロック + + + かなり損傷した金床 + + + 暗黒石英の鉱石 + + + 石英の階段 + + + 模様入り石英ブロック + + + 石英ブロックの柱 + + + 赤のじゅうたん + + + じゅうたん + + + 黒のじゅうたん + + + 青のじゅうたん + + + 緑のじゅうたん + + + 茶色のじゅうたん + + + 紫のじゅうたん + + + 水色のじゅうたん + + + 薄灰色のじゅうたん + + + 灰色のじゅうたん + + + 黄緑のじゅうたん + + + ピンクのじゅうたん + + + 空色のじゅうたん + + + 黄色のじゅうたん + + + 赤紫のじゅうたん + + + オレンジのじゅうたん + + + 白のじゅうたん + + + 模様入り砂岩 + + + {*PLAYER*} は {*SOURCE*} を襲おうとして倒された + + + なめらかな砂岩 + + + {*PLAYER*} は落下した金床に押し潰された + + + {*PLAYER*} は落下したブロックに押し潰された + + + {*PLAYER*} があなたを自分のところにテレポートした + + + {*PLAYER*} を {*DESTINATION*} のところにテレポートした + + + イバラ + + + {*PLAYER*} があなたのところにテレポートした + + + 暗い場所(水中を含む)を昼間のように明るくします + + + 石英の厚板 + + + プレイヤー、動物、モンスターの姿を見えなくします + + + 修理と命名 + + + 高すぎます! + + + エンチャントの費用: %d + + + 手持ちのアイテム: + + + 名前変更 + + + {*VILLAGER_TYPE*} が %s を提供 + + + 取引に必要なアイテム + + + 取引する + + + 修理する + + + これが金床の画面です。経験値レベルと引き換えに、武器、防具、道具の名前変更、修理、エンチャントを実行できます + + + 首輪を染める + + + 対象となるアイテムを一番左の枠に入れます + + + {*B*} + 金床画面の説明を続ける: {*CONTROLLER_VK_A*}{*B*} + 金床画面の説明を飛ばす: {*CONTROLLER_VK_B*} + + + また、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*} を押して、村人が提示したアイテムと要求されたアイテムを交換します + + + プレイヤーは持ち物のアイテムを村人と取引できます + + + {*B*} + 取引の説明を続ける: {*CONTROLLER_VK_A*}{*B*} + 取引の説明を飛ばす: {*CONTROLLER_VK_B*} + + + さまざまな取引を行うことで、村人の提示する取引がランダムに追加・変更されます + + + 村人が提示する取引は、村人の職業によって異なります + + + 頻繁に行った取引は一時的に停止されることがありますが、村人が提示する取引は常に 1 つ以上あります + + + チェストから紙を取って、ここで村人と取引してみましょう + + + このエリアには、エンダーチェストが 2 つあります + + + {*B*} + エンダーチェストの説明を続ける: {*CONTROLLER_VK_A*}{*B*} + エンダーチェストの説明を飛ばす: {*CONTROLLER_VK_B*} + + + ゲームの世界にあるエンダーチェストはすべて、次元をまたいで繋がっています。エンダーチェストに入れたアイテムは、ほかのどのエンダーチェストからでも使えます + + + ただし、エンダーチェストの中味はプレイヤーごとに異なります + + + つまり、どのエンダーチェストにアイテムを入れても、別の場所にあるエンダーチェストから取り出すことができます。アイテムをエンダーチェストに入れて試してみましょう + + + 2{*ICON_SHANK_01*} 回復する。HP が 30 秒間回復し、耐火性とダメージ耐性が 5 分間得られる。リンゴと金のブロックから作られる + + + テレポート + + + テレポートする + + + プレイヤーのところにテレポート + + + 自分のところにテレポート + + + 疲労無効 + + + 不可視 + + + 不可視化できるようになりました + + + 不可視化できなくなりました + + + 飛行できるようになりました + + + 飛行できなくなりました + + + 疲労を無効にできるようになりました + + + 疲労を無効にできなくなりました + + + テレポートできるようになりました + + + テレポートできなくなりました + + + {*T3*}使い方: 金床{*ETW*}{*B*}{*B*} +経験値レベルを使って、金床でアイテムの修理、エンチャント、名称変更を行うことができます。{*B*} +名前の変更はすべてのアイテムに対して行えますが、修理とエンチャントの本からエンチャントを実行できるのは、耐久性のあるアイテムに限られます。{*B*} +修理を行うには修理したいアイテムを左の枠に置き、原料(鉄の剣なら鉄の延べ棒)か同じアイテムを添えます。{*B*} +アイテム同士の修理は、金床を使ったほうが効率よく行えます。また、一方のアイテムがエンチャントされていれば、完成品でもエンチャントが保持されます。{*B*} +金床では、エンチャントの本を使って該当するアイテムをエンチャントできます。エンチャントの本は、ダンジョンのチェストの中にあります。エンチャントテーブルでエンチャントして普通の本から作ることもできます。{*B*} +金床は使うたびに損傷し、酷使すると壊れることもあります{*B*} + + + {*T3*}遊び方: 取引{*ETW*}{*B*}{*B*} +アイテムを村人と取引できます。村人にはそれぞれ職業があります。職業には農民、肉屋、鍛冶屋、司書、司祭があり、取引できるアイテムは職業によって異なります。{*B*} +取引メニューに、村人と取引できるアイテムの一覧表があります。取引できる品物は取引のたびに変更されたり追加されたりしますが、頻繁に使いすぎると一時的に取引できなくなることがあります。{*B*} +取引では通常、エメラルドを使ってアイテムを売り買いします。{*B*} +取引に必要なアイテムを持っていない場合、そのアイテムは赤で表示されます{*B*} + + + {*T3*}使い方: エンダーチェスト{*ETW*}{*B*}{*B*} +ゲームの世界にあるエンダーチェストはすべて繋がっています。エンダーチェストに入れたアイテムは、ほかのどのエンダーチェストでも使えます。ただしエンダーチェストの中味はプレイヤーごとに異なります。したがって、アイテムをエンダーチェストに入れれば、別の場所のエンダーチェストから取り出せるというわけです + + + 農民 + + + 司書 + + + 司祭 + + + 鍛冶屋 + + + 肉屋 + + + 村にいる。職業に応じて、プレイヤーに売るアイテムを提示する + + + チェスト (大) + + + エンチャントの本は、エンチャントテーブルでも作ることができます。作った本は、のちに金床でアイテムをエンチャントする際に使えます + + + また、トリップワイヤーフックは何かが引っかかって作動している間、回路に電気を供給します + + + 手なずけたオオカミは、常に首輪をつけています。首輪の色は染めて変えられます + + + ニンジンやジャガイモは畑に植えることで育てられます。土の上に見えてきたら収穫できます + + + また、豚には鞍をつけて乗ることができます。串刺しのニンジンで気を引いて操ります + + + {*CONTROLLER_ACTION_MOVE*} を使って、必要に応じてトロッコをゆっくり動かすことができます。トロッコを加速レールに乗せるときに便利です + + + 高解像度モードでは分割画面しかサポートされていないため、ゲームに参加できません。参加したい場合は、ほかのすべてのプレイヤーをサインアウトしてください + + + 治す + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/ja-JP/stringsLeaderboards.xml b/Minecraft.Client/PSVitaMedia/loc/ja-JP/stringsLeaderboards.xml new file mode 100644 index 00000000..2abff333 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/ja-JP/stringsLeaderboards.xml @@ -0,0 +1,48 @@ + + + + 打倒「イージー」 + + + 打倒「ノーマル」 + + + 打倒「ハード」 + + + 採掘ブロック「ピース」 + + + 採掘ブロック「イージー」 + + + 採掘ブロック「ノーマル」 + + + 採掘ブロック「ハード」 + + + 飼育「ピース」 + + + 飼育「イージー」 + + + 飼育「ノーマル」 + + + 飼育「ハード」 + + + 移動「ピース」 + + + 移動「イージー」 + + + 移動「ノーマル」 + + + 移動「ハード」 + + \ 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 new file mode 100644 index 00000000..c8fc1d94 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/ja-JP/stringsPlatformSpecific.xml @@ -0,0 +1,245 @@ + + + + "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 + + + NOT USED + + + {*T3*}遊び方: クリエイティブ モード{*ETW*}{*B*}{*B*} +クリエイティブ モード画面では採掘や工作をしなくても、ゲーム内のあらゆるアイテムを持ち物に加えられます。 +プレイヤーの持ち物内にあるアイテムは、世界に置いたり使ったりしても持ち物から消えないため、材料集めの面倒がなく建設そのものに集中できます。{*B*} +クリエイティブ モードで作成、ロード、セーブした世界は、後でサバイバル モードでロードしたとしても、トロフィーやランキング更新の対象にはなりません。{*B*} +クリエイティブ モードで飛行するには、{*CONTROLLER_ACTION_JUMP*} をすばやく 2 回押します。飛行をやめるには、同じ操作をもう一度行います。より速く飛ぶには、飛行中に {*CONTROLLER_ACTION_MOVE*} を前方向にすばやく 2 回倒します。 +飛行モードでは、{*CONTROLLER_ACTION_JUMP*} 長押しで上昇、{*CONTROLLER_ACTION_SNEAK*} 長押しで下降できます。または、{*CONTROLLER_ACTION_DPAD_UP*} で上昇、 {*CONTROLLER_ACTION_DPAD_DOWN*} で下降、{*CONTROLLER_ACTION_DPAD_LEFT*} で左に、{*CONTROLLER_ACTION_DPAD_RIGHT*} で右に飛べます + + + {*CONTROLLER_ACTION_JUMP*} をすばやく 2 回押すと飛行できます。飛行をやめるには、同じ操作をもう一度行います。より速く飛ぶには、飛行中に {*CONTROLLER_ACTION_MOVE*} を前方向にすばやく 2 回倒します。 +飛行モードでは、{*CONTROLLER_ACTION_JUMP*} 長押しで上昇、{*CONTROLLER_ACTION_SNEAK*} 長押しで下降できます。または、方向キーで上下左右に飛びましょう + + + ゲーマー カードを見る + + + クリエイティブ モードで作成、ロード、セーブした世界は、後でサバイバル モードでロードしたとしても、トロフィーやランキング更新の対象にはなりません。実行してよろしいですか? + + + この世界はクリエイティブ モードでセーブされています。トロフィーやランキング更新の対象にはなりません。実行してよろしいですか? + + + ゲーマー プロフィールを見る + + + フレンドを招待 + + + minecraftforum には、"PlayStation Vita" Edition専用セクションがあります + + + ゲームの最新情報は Twitter の @4JStudios と @Kappische でゲット! + + + NOT USED + + + "PlayStation Vita"本体のタッチスクリーンでメニューを操作できます + + + エンダーマンの目を見てはいけません! + + + {*T3*}遊び方: マルチプレイヤー{*ETW*}{*B*}{*B*} +"PlayStation Vita"本体のMinecraftは、初期設定でマルチプレイヤー ゲームになっています。{*B*}{*B*} +あなたがオンラインゲームを開始または参加すると、フレンドリスト内のフレンドにそのことが通知されます (ホストとしてゲームを開始するときに [招待者のみ] を選択した場合を除きます)。フレンドが参加するとフレンドのフレンドリスト内のフレンドにも通知されます (オプションで [フレンドのフレンドを許可] を選択している場合)。{*B*} +ゲーム中にSELECTボタンを押すと、参加中のプレイヤーのリストを開いて、プレイヤーを追放できます + + + {*T3*}遊び方: スクリーンショットの公開{*ETW*}{*B*}{*B*} +ポーズ メニューで {*CONTROLLER_VK_Y*} を押してスクリーンショットを撮影し、Facebook で公開することができます。投稿の前に、撮影したスクリーンショットの縮小版が表示され、投稿に添えるメッセージを編集できます。{*B*}{*B*} +スクリーンショット撮影に適したカメラ モードも用意されています。キャラクターの正面からのショットを撮影して公開するには、{*CONTROLLER_ACTION_CAMERA*} を何度か押して正面からのカメラに切り替え、{*CONTROLLER_VK_Y*} を押します。{*B*}{*B*} +スクリーンショットにオンライン ID は表示されません + + + 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" との接続が切断されました。メイン メニューに戻ります + + + "PSN" との接続が切断されました + + + この世界はクリエイティブ モードでセーブされています。トロフィーやランキング更新の対象にはなりません。 + + + ホスト特権を有効にして作成、ロード、セーブした世界は、後でオプションをオフにしてロードしたとしても、トロフィーやランキング更新の対象にはなりません。実行してよろしいですか? + + + これはMinecraft: "PlayStation Vita" Editionのお試し版です。完全版であれば、今すぐ獲得できるトロフィーがあります! +完全版を購入して、"PSN" を通じて世界中のフレンドと一緒に遊べるMinecraft: "PlayStation Vita" Editionの楽しさを体験してください。 +完全版を購入しますか? + + + ゲスト プレイヤーでは完全版を購入することはできません。Sony Entertainment Network のアカウントでサインインしてください + + + オンラインID + + + これは Minecraft: "PlayStation Vita" Editionのお試し版です。完全版であれば、今すぐ獲得できるテーマがあります! +完全版を購入して、"PSN" を通じて世界中のフレンドと一緒に遊べる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/ja-JP/stringsRichPresence.xml b/Minecraft.Client/PSVitaMedia/loc/ja-JP/stringsRichPresence.xml new file mode 100644 index 00000000..54493931 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/ja-JP/stringsRichPresence.xml @@ -0,0 +1,66 @@ + + + + {GAME_STATE} + + + 待機中 + + + メニュー内 + + + マルチプレイ - {GAME_STATE} + + + オフラインのマルチプレイヤー - {GAME_STATE} + + + 1 人プレイ - {GAME_STATE} + + + オフラインの 1 人プレイヤー - {GAME_STATE} + + + 景色を楽しみ中! + + + 豚に乗っている + + + トロッコに乗っている + + + ボートに乗っている + + + 釣りをしている + + + 工作中 + + + 鍛造中 + + + 暗黒界へ + + + ディスクを聞いている + + + 地図を見ている + + + エンチャント中 + + + ポーション調合中 + + + 金床で作業中 + + + 隣人と面会中 + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/ko-KR/4J_stringsGeneric.xml b/Minecraft.Client/PSVitaMedia/loc/ko-KR/4J_stringsGeneric.xml new file mode 100644 index 00000000..bfb1f8f9 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/ko-KR/4J_stringsGeneric.xml @@ -0,0 +1,87 @@ + + + + 확인 + + + 뒤로 + + + 취소 + + + + + + 아니요 + + + 저장 데이터 손상 + + + 저장 데이터가 손상되었습니다. 새로 저장한 다음 기존 데이터를 덮어쓰시겠습니까? + + + 여유 공간 부족 + + + 다시 선택 + + + 저장하지 않고 플레이 + + + 새 저장 데이터 생성 + + + 덮어쓰시겠습니까? + + + 아니요, 덮어쓰지 않습니다. + + + 덮어쓰고 저장합니다. + + + 저장 실패 + + + 저장하지 않고 계속하기 + + + 불러오기 실패 + + + 저장 데이터 이름 입력 + + + 저장 데이터 이름을 입력하십시오. + + + 게임을 종료하시겠습니까? + + + 로그아웃 + + + 계속 플레이 + + + 오프라인으로 계속하기 + + + 손님 플레이어 + + + 손님 플레이어는 "PSN"에 접근할 수 없습니다. + + + 저장하는 중… + + + 콘텐츠를 저장하고 있습니다. 본체를 끄지 마십시오. + + + 정식 버전 게임 구매 + + \ 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 new file mode 100644 index 00000000..701eff29 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/ko-KR/4J_stringsPlatformSpecific.xml @@ -0,0 +1,50 @@ + + + + Sony Entertainment Network 계정에 설정을 저장하지 못했습니다. + + + Sony Entertainment Network 계정 문제 + + + 플레이어의 Sony Entertainment Network 계정에 접속하는 중에 문제가 발생했습니다. 트로피가 지급되지 않습니다. + + + 이 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 new file mode 100644 index 00000000..0af3254f --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/ko-KR/AdditionalStrings.xml @@ -0,0 +1,96 @@ + + + + 매시업 세상 모두 보이기 + + + 숨기기 + + + Minecraft: "PlayStation 3" Edition + + + 옵션 + + + 캐시 저장 + + + 네트워크 에러가 발생했습니다. + + + 네트워크 에러 + + + 네트워크 에러가 발생했습니다. 주 메뉴로 돌아갑니다. + + + 대화 제한 때문에 Sony Entertainment Network 계정의 온라인 기능이 비활성화됐습니다. + + + Sony Entertainment Network 계정의 자녀보호 기능 때문에 온라인 서비스가 비활성화 되었습니다. + + + 온라인 서비스 + + + "PSN"에서 로그아웃됐습니다. 이 게임의 온라인 기능은 "PSN"에 로그인해야 이용할 수 있습니다. + + + "PSN"에서 로그아웃됐습니다. 이 게임의 온라인 기능은 "PSN"에 로그인해야 이용할 수 있습니다. 주 메뉴로 돌아갑니다. + + + %d 플레이어를 위한 유저 선택(손님으로 플레이하려면 취소하십시오) + + + 무료 + + + 옵션 파일이 손상되어서 삭제해야 합니다. + + + 옵션 파일을 삭제하십시오. + + + 옵션 파일을 다시 불러오십시오. + + + 저장 캐시 파일이 손상되어서 삭제해야 합니다. + + + 트로피 비활성화 + + + 다른 유저의 저장 데이터이기 때문에 트로피가 비활성화됩니다. + + + 치명적 오류: 트로피 초기화에 실패하였습니다. 게임을 종료해 주십시오. + + + 게임 초대 보기 + + + 손상된 파일 + + + 컨트롤러 연결 끊어짐 + + + 컨트롤러 연결이 끊어졌습니다. 컨트롤러를 다시 연결해 주십시오. + + + 어느 한 로컬 플레이어의 자녀보호 기능 때문에 플레이어의 Sony Entertainment Network 계정의 온라인 서비스가 비활성화 되었습니다. + + + 게임 업데이트가 있어서 온라인 기능을 사용할 수 없습니다. + + + 현재 이 게임에서 구매할 수 있는 다운로드 콘텐츠가 없습니다. + + + 초대 + + + 지금 바로 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 new file mode 100644 index 00000000..2afbd75b --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/ko-KR/EULA.xml @@ -0,0 +1,98 @@ + + + + Minecraft: "PlayStation Vita" Edition - 이용약관 + 본 약관에서는 Minecraft: "PlayStation Vita" Edition ("Minecraft")을 사용하는 데 필요한 규정을 명시합니다. 본 약관은 Minecraft와 우리 커뮤니티 회원을 보호하기 위해 Minecraft 다운로드 및 사용에 대한 규정을 명시하는 데 필요합니다. 우리도 여러분과 같이 규정을 좋아하지 않으니 최대한 간략하게 하겠습니다만 Minecraft를 다운로드하거나 사용한다면 본 약관(“약관”)에 동의한다는 뜻임을 명심하시기 바랍니다. + 시작하기 전에 확실하게 할 사항이 있습니다. Minecraft는 플레이어가 물체를 만들거나 부수는 게임입니다. 다른 사람들과 함께 게임을 하는 경우(멀티 플레이) 함께 물체를 만들거나 다른 사람들이 만들고 있던 물체를 부술 수도 있습니다. 상대방도 여러분의 물체를 부술 수 있습니다. 그러니 여러분이 원하는 대로 행동하지 않는 사람들과는 함께 플레이하지 마십시오. 또한, 하면 안 되는 행동을 하는 사람들도 있습니다. 우리도 이런 행동을 좋아하지 않지만 모든 플레이어에게 적절하게 행동해달라고 요청하는 것 외에는 할 수 있는 일이 별로 없습니다. Minecraft를 사용하는 데 있어서 적절하게 행동하지 않거나 규정 또는 본 약관을 위반 또는 부적절하게 사용하는 사람이 있다면 커뮤니티의 여러분 같은 분들의 도움이 필요합니다. 문제 제기/보고 시스템이 있으니 필요한 경우 사용해 주시면 우리가 처리하도록 하겠습니다. +어떤 문제를 제기하거나 보고하려면 유저의 상세 정보와 무슨 일이 있었는지 등 최대한 자세한 내용을 support@mojang.com으로 이메일로 보내주시기 바랍니다. + 이제 약관을 설명하겠습니다: + 가장 주요한 규정 + 가장 주요한 규정은 우리가 만든 어떤 것도 배포하면 안 된다는 것입니다. “우리가 만든 어떤 것도 배포하면 안 된다”는 건 “Minecraft 복사본을 누구에게 준다거나 상업적으로 사용하거나 돈을 벌려고 한다거나 부당하게 또는 불합리하게 다른 사람이 Minecraft 또는 그 일부를 사용할 수 있도록 하면 안 된다”는 뜻입니다. 다시 말해서 여러분이 지켜야 할 가장 주요한 규정은(브랜드 및 자산 이용 지침서(Brand and Asset Usage Guidelines)과 같은 데서 명확하게 동의하지 않는 한) 다음 사항을 하면 안 된다는 것입니다: + • Minecraft 복사본을 다른 사람에게 주는 행위; + • 우리가 만든 어떤 것이든 상업적으로 사용하는 행위; + • 우리가 만든 어떤 것이든 돈을 벌려고 하는 행위; 또는 + • 부당하게 또는 불합리하게 다른 사람이 우리가 만든 어떤 것이든 사용할 수 있도록 하는 행위. + ...우리가 만든 어떤 것에는 Minecraft의 고객 또는 서버 소프트웨어가 포함되지만 이에 한정되지는 않습니다. 또한, 게임의 수정된 버전, 게임의 일부 또는 우리가 만든 모든 것이 포함된다는 것을 확실히 명시하는 바입니다. + 그밖에는 여러분이 뭘 하든지 괜찮습니다. 여러분이 여러 가지 멋진 시도를 많이 하셨으면 합니다(아래 내용 참조). 단, 하면 안 된다고 명시한 사항만 지켜주시면 됩니다. + MINECRAFT 사용 + • 여러분은 Minecraft를 여러분의 "PlayStation Vita" 본체에서 본인이 직접 사용하기 위해 구매하셨습니다. + • 여러분이 기타 할 수 있는 사항에 대한 제한된 권리가 아래 명시되어 있습니다. 이는 제한된 권리가 없다면 도를 지나칠 수 있기 때문입니다. 우리가 만든 어떤 것으로든 여러분이 관련된 것을 만들고 싶다면 얼마든지 겸허하게 받아들이겠습니다. 하지만 이는 공식적으로 해석될 수 없으며 본 약관에 따르는 것이 아니라는 점을 확실히 하십시오. 무엇보다도 우리가 만든 어떤 것도 상업적 용도로 사용하지 마십시오. + • 본 약관을 위반 시 Minecraft를 사용 및 플레이하는 데 대한 허가가 폐지될 수 있습니다. + • 여러분이 Minecraft를 구매할 때 Minecraft를 본인의 "PlayStation Vita" 본체에 설치하고 본 약관에 명시되어 있는 대로 본인의 "PlayStation Vita" 본체에서 사용하고 플레이할 수 있도록 허가합니다. 이 허가는 구매자 개인에게 부여되는 것으로 여러분은 Minecraft(또는 그 일부)를 다른 누구에게도 배포할 수 없습니다. 물론 우리가 명확하게 허가하는 경우는 예외입니다. + • 합리적인 범위 내에서 Minecraft의 스크린샷 및 비디오를 원하는 대로 사용하실 수 있습니다. “합리적인 범위”란 상업적 용도로 사용하거나 부당하거나 우리의 권리에 불리하게 영향을 미치는 행위를 하지 않는다는 뜻입니다. 또한, 예술 자원을 복사해서 돌리는 것도 즐거운 일이 아니니 하지 마십시오. + • 기본적으로 간단한 규정은 브랜드 및 자산 이용 지침(Brand and Asset Usage Guidelines) 또는 본 약관에서 명확한 사전 동의가 없는 한 우리가 만든 어떤 것도 상업적 용도로 사용할 수 없다는 것입니다. “공정 사용” 또는 “공정 거래” 정책 등 법에서 명확히 허용하는 경우 법에서 허용하는 범위 내에서 사용할 수 있습니다. + MINECRAFT 및 기타 사항의 소유권 + • 여러분께 Minecraft를 플레이할 수 있는 허가를 부여한다 해도 소유권은 우리에게 있습니다. 또한 우리는 우리 소프트웨어, 텍스처, 자산, 도구, 기반 시설 및 그 밖의 우리가 소유한 똑똑한(그리고 그다지 똑똑하지 않은) 사항 등으로 구성된 우리 브랜드와 Minecraft에 포함된 모든 콘텐츠의 소유자입니다. 이 모든 사항에 대한 권리는 우리가 발휘하고 보유하고 있지만 여러분은 본 약관에 따라 사용할 수 있습니다. + • 그렇다고 여러분이 Minecraft를 사용해 만든 멋진 것들이 우리의 소유라는 뜻은 아닙니다. 여러분은 Minecraft의 각 부분과 제품, 서비스 및 앞에서 언급한 대로 Minecraft가 우리의 소유라는 것을 명심하셔야 합니다. 또한 우리는 이 모든 것과 관련된 소위 지적 자산 권리(“IPRs”) 및 Minecraft와 관련된 이름과 브랜드를 소유합니다. + • 여러분은 물론 Minecraft에서 또 Minecraft를 사용해서 뭔가를 만들 것입니다. 우리는 여러분이 만든 오리지널 창작물에 대한 소유권이 없으며 우리가 주장하면 안 되는 것에 소유권을 발휘하지 않습니다. 하지만 위에 서술된 우리 소유물 또는 창작물의 복사품(또는 실체적 복사품) 또는 파생물에 대한 소유권을 갖습니다. 단, 여러분이 만든 오리지널 창작물은 우리 소유가 아닙니다. 예: + - 단일 블록 – 우리의 소유입니다; + - 롤러코스터가 통과하는 고딕 성당 – 우리의 소유가 아닙니다. + • 그러므로 여러분이 Minecraft 사용에 대해 지불하는 것은 본 약관에 따라 Minecraft를 사용하는 데 대한 허가를 구매하는 것입니다. Minecraft에 관해 여러분에게 부여된 허가는 본 약관에 명시되어 있는 내용에 제한됩니다. + 콘텐츠 + • 여러분이 Minecraft에서 또는 Minecraft를 통해 사용할 수 있도록 만든 콘텐츠에 대해서는 우리가 그 콘텐츠를 사용, 복사, 수정, 조정할 수 있도록 허가해 주셔야 합니다. 이 허가는 변경할 수 없고 제한이 없어야 합니다. 또한 다른 사람들이 여러분의 콘텐츠를 사용할 수 있도록 허가할 권리를 우리에게 부여해야 하며, 여러분이 접근할 수 있도록 허용한 다른 사람들이(예: 여러분이 멀티 플레이 게임을 함께한 사람) 사용할 수 있도록 해야 합니다. + • 어떤 콘텐츠를 사용 가능하도록 하기 전에 콘텐츠가 누구에게나 공개될 수 있으며 여러분이 원치 않은 방법으로 사용될 수 있으니 주의 깊게 생각하십시오. + • 여러분이 Minecraft에서 또는 Minecraft를 통해 뭔가를 사용 가능하게 할 경우 부적절하거나 불법적인 내용이 있으면 안 되며 정직하고 여러분이 직접 만든 창작물이어야 합니다. Minecraft를 통해 사용 가능하게 하면 안 되는 것에는 다음이 포함됩니다: 인종 차별 또는 동성애 차별 언어가 포함된 게시물, 다른 사람을 괴롭히거나 부추기는 게시물, 우리의 평판 또는 다른 사람의 평판에 해가 될 수 있는 게시물, 음란물이 포함된 게시물, 광고 또는 다른 사람의 창조물 또는 이미지, 또는 운영 스태프를 사칭하거나 사람들을 속이거나 부당하게 이용하는 게시물. + • 여러분이 Minecraft에서 사용 가능하게 하는 콘텐츠는 모두 여러분의 창작물이어야 합니다. Minecraft를 사용해 다른 사람의 권리를 침해하는 콘텐츠를 사용 가능하게 하면 안 됩니다. 여러분이 Minecraft에서 콘텐츠를 게시했을 때 그 콘텐츠가 누군가의 권리를 침해했기 때문에 누가 우리에게 이의를 제기하거나 협박하거나 고소하는 경우, 우리는 여러분에게 이에 대한 책임을 지울 수 있으며 이는 이에 따른 손해에 대해 여러분이 보상을 해야 할 수도 있다는 뜻입니다. 그러므로 매우 중요한 건 여러분이 직접 만든 콘텐츠만 사용 가능하게 하고 다른 사람이 만든 콘텐츠는 절대 사용 가능하게 하면 안 된다는 점입니다. + • 여러분이 함께 플레이하는 사람에 대해 주의하십시오. 사람들이 하는 말이나 자신의 신분에 대해 말하는 게 사실인지 확인하는 건 여러분이나 우리에게 모두 어려운 일입니다. 또한 Minecraft를 통해 여러분에 대한 정보를 주면 안 됩니다. + 여러분이 Minecraft를 통해 콘텐츠(“본인의 콘텐츠”)를 사용 가능하게 하려면 다음 사항을 따라야 합니다: + - 여러분의 "PlayStation Vita" 본체 및 "PSN"을 사용하기 위해 동의해야 하는 "PSN" 이용약관 및 기타 지침서인 ToSUA를 포함한 모든 Sony Computer Entertainment의 규칙 준수; + - 사람들에게 불쾌한 내용이 포함되면 안 됩니다; + - 불법적 내용 또는 합법적이지 않은 내용이 포함되면 안 됩니다; + - 정직해야 하며 오해를 불러일으키거나 다른 사람을 속이거나 부당하게 이용하거나 다른 사람을 사칭하면 안 됩니다; + - 다른 사람의 저작권 또는 다른 권리를 침해하면 안 됩니다; + - 인종 또는 동성애자를 차별하면 안 됩니다; + - 다른 사람을 괴롭히거나 부추기면 안 됩니다; + - 우리의 평판 또는 다른 사람의 평판에 해를 끼치면 안 됩니다; + - 음란물을 포함하면 안 됩니다; + - 광고를 포함하면 안 됩니다. + - Minecraft를 통해 다른 사람의 권리를 침해하는 콘텐츠를 사용 가능하게 하면 안 됩니다. + • 여러분이 Minecraft를 통해 사용 가능하게 한 본인의 모든 콘텐츠에 대한 책임은 여러분에게 있습니다. + • 여러분이 본인의 콘텐츠를 사용 가능하게 하면 여러분은 이를 인정하고 본 약관에 따라 그럴 자격이 있다는 것과 본 약관에 따라 우리가 권리를 행사할 수 있도록 승인한다는 의미입니다. + • 여러분이 Minecraft를 통해 사용 가능하게 하거나 누군가에 의해 Minecraft에서 또는 Minecraft를 통해 사용 가능하게 된 콘텐츠 때문에 누군가 우리에게 이의를 제기하거나 협박하거나 고소하는 경우 여러분이 이에 대한 책임을 져야 하며 이에 따른 손해에 대해 보상해야 할 수 있습니다. Minecraft 어떤 부분에 대한 여러분의 접근 권한은 삭제되거나 중단될 수 있습니다. + 유저 콘텐츠 + 다음은 여러분 및 다른 사람이 사용 가능하게 한 “유저 콘텐츠”에 관한 내용입니다. Minecraft는 엔터테인먼트 서비스이며 이에 부수적으로 우리(또 Sony Computer Entertainment와 같은 우리 라이선스 소지자)는 검토, 선택 또는 콘텐츠의 개조 없이 유저 콘텐츠를 전달, 배포, 저장 및 검색하는 일에 관련되어 있습니다. 이는 우리가 유저 콘텐츠를 검토하지 않기 때문에 여러분 또는 다른 사람들에 의해 어떤 콘텐츠가 돌고 있는지 모른다는 뜻입니다. 본 규정을 약관에 포함시킨 것은 여러분과 다른 사람들이 규정을 준수해야하지만 우리가 모든 상황을 인지하고있지 않기 때문입니다. + 그러니 다음 사항을 명심하십시오: + • 모든 유저 콘텐츠에서 표현된 견해는 개인 저자 또는 창작자의 견해이며 별도로 명시하지 않는 한 우리 또는 우리와 관련된 사람의 견해가 아닙니다; + • 우리에겐 모든 유저 콘텐츠와 그에 대한 코멘트, 견해 또는 발언에 대한 책임이 없으며 모든 유저 콘텐츠에 관련해 어떠한 사항도 인정하거나 진술하지 않고 모든 책임을 부인합니다; + • 여러분은 Minecraft를 사용함으로써 우리에게 유저 콘텐츠를 모두 검토해야 할 책임이 없다는 점과 모든 유저 콘텐츠는 우리에게 어떠한 제어나 판단도 필요로 하지 않는다는 전제하에 사용 가능하게 된다는 점을 인정하는 것입니다. + 하지만 우리(또는 Sony Computer Entertainment와 같은 우리 라이선스 소지자)는 어떤 유저 콘텐츠에 대한 접근 권한을 삭제, 거부 또는 중단할 수 있으며 여러분이 유저 콘텐츠를 게시 또는 사용 가능하게 하거나 접근할 수 있는 권한을 삭제하거나 중단할 수 있습니다. 여러분이 본 약관을 위반하거나 불평이 접수되는 등 우리에게 적절하다고 생각되는 경우 Minecraft 또는 "PSN"으로의 접근에 대한 권한을 삭제 또는 중단할 수 있습니다. 또한 유저 콘텐츠가 합법적이지 않다는 게 확인되는 경우 유저 콘텐츠에 대한 접근 권한을 즉시 삭제하거나 비활성화하게 됩니다. + 업그레이드 + • 우리는 때때로 사용 가능한 업그레이드 및 업데이트를 할 수 있지만 꼭 해야 하는 건 아닙니다. 또한 우리에겐 어떤 게임에 대해서도 지속적인 지원이나 보수를 제공할 의무가 없습니다. 물론 Minecraft의 새 업데이트를 계속해서 출시하고 싶지만 보장할 수는 없습니다. + 우리의 책임 + • 여러분이 Minecraft를 구매하실 때 우리는 ‘현재 그대로’ 제공합니다. 업데이트와 업그레이드 또한 ‘현재 그대로’ 제공됩니다. 이는 Minecraft의 기준이나 품질, Minecraft가 게임 도중 중단되거나 오류가 없다는 사실, 또는 이로 인한 손실이나 손상에 대해 그 어떤 약속도 여러분께 할 수 없다는 것을 의미합니다. 대부분 국가의 법률상, 컴퓨터가 갑자기 일어나 당신을 찔러 상해를 입거나 죽게되어도 우리는 어떠한 책임이 없다는 점을 알리는 바입니다. + 우리는 다음 사항에 대해 책임이 없습니다: + • 여러분 또는 다른 사람에 의한 MINECRAFT의 사용 또는 오용; + • 여러분이 MINECRAFT를 통해 사용 가능하게 한 모든 콘텐츠; + • 본 약관을 여러분이 위반하는 경우; + • 다른 사람이 약관을 위반하는 경우. + 종료 + • 여러분이 약관을 위반하면 우리가 원하는 경우 여러분이 Minecraft를 사용할 수 있는 권한을 종료할 수 있습니다. 여러분도 언제든지 종료할 수 있습니다. 여러분의 "PlayStation Vita" 본체에서 Minecraft를 삭제하기만 하면 됩니다. 이러한 경우 "Minecraft의 소유권", "우리의 책임" 및 "일반 사항"에 대한 단락은 종료 후에도 계속해서 적용됩니다. + 일반 사항 + • 본 약관은 여러분의 모든 법적 권리를 따릅니다. 본 약관의 어떠한 내용도 법률상 배제될 수 없는 여러분의 권리를 제한하지 않으며 우리의 과실 또는 어떠한 부정한 표현으로 인한 사망 또는 개인 상해에 대한 우리의 책임이 배제되거나 제한되지 않습니다. + • 또한 우리는 때때로 본 약관을 변경할 수 있습니다. 하지만 변경 사항은 법적으로 적용될 수 있는 범위 내에서만 효력을 발휘합니다. 예를 들어 여러분이 Minecraft를 싱글 플레이 모드로만 사용하고 우리가 제공하는 업데이트를 사용하지 않는다면 예전의 EULA가 적용되지만 업데이트 또는 우리가 지속적으로 제공하는 온라인 서비스에 따른 Minecraft의 일부를 사용할 경우 새로운 EULA가 적용됩니다. 이러한 경우 우리는 변경 사항이 효력을 발휘하는 데 대해 여러분께 알려드릴 수 없거나 알려드릴 필요가 없을 수 있습니다. 그러니 때때로 본 약관의 변경 사항을 확인하시기 바랍니다. 공평하지 않은 처사는 원치 않지만 가끔 법률이 변경되거나 누군가가 Minecraft의 다른 유저에게 영향을 끼치는 행동을 할 수 있으므로 단속할 필요가 있습니다. + • 여러분이 Minecraft나 우리 다른 게임에 대해 의견을 제안하신다면 그에 대한 보상은 없습니다. 이는 우리가 여러분의 제안을 원하는 대로 사용할 수 있으며 여러분께 이에 대한 보상을 지급할 필요가 없다는 뜻입니다. 우리가 보상을 지급할 만한 제안이라고 생각하신다면 제안을 하기 전에 보상에 대해 말씀하셔야 합니다. + • 본 약관 외에도 여러분이 온라인에서 확인할 수 있는 브랜드 및 자산 이용 지침서(Brand and Asset Usage Guidelines)가 있습니다. + • 여러분이 본 규정을 위반할 경우 우리(또는 Sony Computer Entertainment)는 여러분의 Minecraft 사용을 중단할 수 있습니다. 본 규정에 동의하지 않는다면 Minecraft를 구매, 다운로드, 사용 또는 플레이하지 마십시오. + 본 페이지에 없는 법 관련 사항에 대해 궁금한 점이 있다면 어떠한 행동도 취하지 말고 우리에게 문의하십시오. 기본적으로 여러분이 터무니없는 행위를 하지 않는다면 우리도 그러할 것입니다. + 우리의 정보: + Mojang AB + Maria Skolgata 83, + SE-11853 + Stockholm + Sweden + 기업 번호: 556819-2388 + + + + + 게임 내 상점에서 구매하는 콘텐츠는 모두 Sony Network Entertainment Europe Limited("SNEE")를 통해 구매하게 되며 "PlayStation Store"의 Sony Entertainment Network 이용약관에 따릅니다. 아이템마다 이용 권리가 다를 수 있으니 구매할 때마다 확인하십시오. 따로 표시되어 있지 않은 경우 게임 내 상점에서 구매할 수 있는 콘텐츠는 게임과 연령 제한이 같습니다. + + + + + 아이템의 구매 및 이용은 네트워크 이용약관에 따릅니다. 본 온라인 서비스는 Sony Computer Entertainment America에 의해 2차 라이선스가 제공되었습니다. + + + 유의할 점: 본 소프트웨어의 사용은 eu.playstation.com/legal의 소프트웨어 사용 약관에 따릅니다. + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/ko-KR/stringsDynafont.xml b/Minecraft.Client/PSVitaMedia/loc/ko-KR/stringsDynafont.xml new file mode 100644 index 00000000..dca31ec2 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/ko-KR/stringsDynafont.xml @@ -0,0 +1,7 @@ + + + + DynaFont developed by DynaComware. + + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/ko-KR/stringsGeneric.xml b/Minecraft.Client/PSVitaMedia/loc/ko-KR/stringsGeneric.xml new file mode 100644 index 00000000..24a5dfd0 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/ko-KR/stringsGeneric.xml @@ -0,0 +1,6836 @@ + + + + 오프라인 게임으로 전환하는 중 + + + 호스트가 게임을 저장하는 동안 기다리십시오. + + + Ender에 들어가기 + + + 플레이어 저장 중 + + + 호스트에 연결 중 + + + 지형 다운로드 중 + + + Ender에서 나가기 + + + 침대가 사라졌거나 장애물이 막고 있습니다. + + + 휴식을 취할 때가 아닙니다. 근처에 괴물이 있습니다. + + + 침대에서 자고 있습니다. 시간을 새벽으로 건너뛰려면 모든 플레이어가 잠들어야 합니다. + + + 이 침대는 주인이 있습니다. + + + 잠은 밤에만 잘 수 있습니다. + + + %s님이 침대에서 자고 있습니다. 시간을 새벽으로 건너뛰려면 모든 플레이어가 잠들어야 합니다. + + + 레벨 불러오는 중 + + + 마무리 중… + + + 지형 구축 중 + + + 월드 시뮬레이션 중 + + + 순위 + + + 레벨 저장 준비 중 + + + 이것저것 준비 중… + + + 서버 시동 중 + + + 지상 진입 중 + + + 재생성 중 + + + 레벨 생성 중 + + + 출현 지역 생성 중 + + + 출현 지역 불러오는 중 + + + 지하 진입 중 + + + 도구 및 무기 + + + 감마 + + + 게임 감도 + + + 인터페이스 감도 + + + 난이도 + + + 음악 + + + 사운드 + + + 낙원 + + + 이 모드에서는 플레이어의 체력이 시간에 따라 자동으로 회복되며 적이 등장하지 않습니다. + + + 이 모드에서는 적이 나타나지만 보통 난이도보다 공격력이 약합니다. + + + 이 모드에서는 적이 나타나며, 플레이어에게 일반 수준의 피해를 입힙니다. + + + 쉬움 + + + 보통 + + + 어려움 + + + 로그아웃 + + + 방어구 + + + 기계장치 + + + 이동수단 + + + 무기 + + + 식량 + + + 구조물 + + + 장식물 + + + 양조 + + + 도구, 무기 및 방어구 + + + 재료 + + + 블록 짓기 + + + 레드스톤 및 운송 + + + 기타 + + + 명단: + + + 저장하지 않고 나가기 + + + 주 메뉴로 나가시겠습니까? 저장하지 않은 진행 상황은 사라집니다. + + + 주 메뉴로 나가시겠습니까? 게임 진행 내용을 잃게 됩니다! + + + 저장 데이터가 손상되었습니다. 삭제하시겠습니까? + + + 게임에 참가한 모든 플레이어의 연결을 끊고, 주 메뉴로 나가시겠습니까? 저장하지 않은 진행 상황은 사라집니다. + + + 저장하고 나가기 + + + 새 월드 만들기 + + + 월드 이름을 입력하십시오. + + + 월드 생성 시드를 입력하십시오. + + + 저장된 월드 불러오기 + + + 튜토리얼 진행 + + + 튜토리얼 + + + 월드 이름 지정 + + + 손상된 저장 데이터 + + + 확인 + + + 취소 + + + 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*} +화로에서는 아이템에 열을 가해서 다른 아이템으로 바꿀 수 있습니다. 예를 들어 철광석을 화로에서 가열하면 철 주괴가 만들어집니다.{*B*}{*B*} +화로를 설치하고 {*CONTROLLER_ACTION_USE*}를 눌러 사용하십시오.{*B*}{*B*} +화로 아래쪽에는 연료나 땔감을 넣고 위쪽에는 가열할 아이템을 넣어야 합니다. 그러면 화로에 불이 켜지고 작업이 시작됩니다.{*B*}{*B*} +아이템 가열이 끝나면 결과물 슬롯에서 소지품으로 옮길 수 있습니다.{*B*}{*B*} +화로에 넣을 수 있는 재료나 연료 아이템에 포인터를 올려놓으면 해당 아이템을 화로로 빨리 옮길 수 있는 툴팁이 표시됩니다. + + + {*T3*}플레이 방법: 디스펜서{*ETW*}{*B*}{*B*} +디스펜서는 아이템을 쏘아 보내는 데 사용됩니다. 디스펜서를 작동하려면 레버와 같은 스위치를 장착해야 합니다.{*B*}{*B*} +디스펜서에 아이템을 넣으려면 {*CONTROLLER_ACTION_USE*}를 누른 다음, 쏘아 보낼 아이템을 소지품에서 꺼내 디스펜서에 넣으십시오.{*B*}{*B*} +이제 스위치를 조작하면 디스펜서가 아이템을 쏘아 보냅니다. + + + {*T3*}플레이 방법: 양조{*ETW*}{*B*}{*B*} +양조 기술로 물약을 만들기 위해서는 양조대가 필요하며, 양조대는 작업대에서 만들 수 있습니다. 모든 물약을 만들 때는 물 한 병이 필요합니다. 가마솥이나 다른 수원에서 유리병에 물을 채우십시오. {*B*} +양조대 하나에는 병을 넣을 수 있는 슬롯이 세 개 있으므로, 한 번에 물약을 세 병까지 양조할 수 있습니다. 재료 한 개를 병 세 개에 모두 넣을 수 있으므로, 자원을 최대한 아끼려면 물약 세 병을 동시에 양조하십시오.{*B*} +물약 재료를 양조대 위에 넣으면 잠시 후 기본 물약이 완성됩니다. 기본 물약은 그 자체로는 아무런 효과가 없으나 다른 재료를 넣어 양조하면 효과가 있는 물약이 됩니다.{*B*} +효과가 있는 물약을 만든 뒤 세 번째 재료를 넣으면 효과 지속 시간이 길어지거나(레드스톤 가루 사용), 효과가 더 강해지거나(발광석 가루 사용), 해로운 효과로 바꿀 수(발효 거미 눈 사용) 있습니다.{*B*} +물약에 화약을 넣으면 던질 수 있는 폭발 물약으로 바꿀 수 있습니다. 폭발 물약을 던지면 물약병이 떨어진 지점 주변에서 해당 물약의 효과가 발생합니다.{*B*} + +물약 재료는 다음과 같습니다.{*B*}{*B*} +* {*T2*}지하 사마귀{*ETW*}{*B*} +* {*T2*}거미 눈{*ETW*}{*B*} +* {*T2*}설탕{*ETW*}{*B*} +* {*T2*}Ghast의 눈물{*ETW*}{*B*} +* {*T2*}Blaze 가루{*ETW*}{*B*} +* {*T2*}마그마 크림{*ETW*}{*B*} +* {*T2*}빛나는 수박{*ETW*}{*B*} +* {*T2*}레드스톤 가루{*ETW*}{*B*} +* {*T2*}발광석 가루{*ETW*}{*B*} +* {*T2*}발효 거미 눈{*ETW*}{*B*}{*B*} + +재료의 조합에 따라 물약의 효과가 달라지니 여러 조합을 시험해 보십시오. + + + {*T3*}플레이 방법: 대형 상자{*ETW*}{*B*}{*B*} +상자 두 개를 나란히 붙이면 대형 상자가 만들어집니다. 이 상자에는 아이템을 더 많이 넣을 수 있습니다.{*B*}{*B*} +사용 방법은 일반 상자와 같습니다. + + + {*T3*}플레이 방법: 제작{*ETW*}{*B*}{*B*} +제작 인터페이스에서는 소지품에 있는 아이템을 조합해서 새로운 아이템을 만들 수 있습니다. {*CONTROLLER_ACTION_CRAFTING*}를 눌러 제작 인터페이스를 여십시오.{*B*}{*B*} +{*CONTROLLER_VK_LB*}와 {*CONTROLLER_VK_RB*}로 화면 위쪽의 탭에서 제작할 아이템 종류를 선택한 다음 {*CONTROLLER_MENU_NAVIGATE*}로 제작할 아이템을 고르십시오.{*B*}{*B*} +제작 영역에는 새 아이템을 만드는 데 필요한 재료 아이템이 표시됩니다. {*CONTROLLER_VK_A*} 버튼을 누르면 아이템을 만들어 소지품에 넣게 됩니다. + + + {*T3*}플레이 방법: 작업대{*ETW*}{*B*}{*B*} +더 큰 아이템을 만들 때는 작업대를 사용합니다.{*B*}{*B*} +작업대를 설치하고 {*CONTROLLER_ACTION_USE*}를 눌러 사용하십시오.{*B*}{*B*} +작업대에서 아이템을 만드는 방법은 기본 제작과 같지만, 제작 공간이 더 넓고 선택할 수 있는 아이템이 더 많아집니다. + + + {*T3*}플레이 방법: 효과부여{*ETW*}{*B*}{*B*} +괴물 및 동물을 처치하거나, 특정 블록을 채굴하거나 녹여서 얻을 수 있는 경험치로 도구, 무기, 방어구 및 책에 효과를 부여할 수 있습니다.{*B*} +검, 활, 도끼, 곡괭이, 삽, 방어구 또는 책을 효과부여대에 놓인 책 아래에 있는 슬롯에 넣으면 슬롯 오른쪽에 각각 경험치 비용이 쓰인 버튼 세 개가 나타납니다.{*B*} +효과부여에 필요한 경험치가 모자란 항목은 빨간색으로 나타나며, 그렇지 않다면 초록색으로 나타납니다.{*B*}{*B*} +실제 효과부여는 표시된 비용에 기반을 두고 무작위로 적용됩니다.{*B*}{*B*} +효과부여대가 한 블록 간격을 두고 책장에 둘러싸여 있으면(최대 책장 15개까지) 효과부여 레벨이 상승하며, 효과부여대에 놓인 책에 신비한 문양이 나타납니다.{*B*}{*B*} +효과부여대를 만들 때 쓰이는 모든 재료는 월드 안의 마을에서 찾거나 월드 안에서 채굴 및 경작을 통해 얻을 수 있습니다.{*B*}{*B*} +효과가 부여된 책은 모루에서 아이템에 효과를 부여하는 데 사용됩니다. 아이템에 부여할 효과를 더욱 효과적으로 제어할 수 있습니다.{*B*} + + + {*T3*}플레이 방법: 레벨 차단{*ETW*}{*B*}{*B*} +플레이 중인 레벨에 부적절한 내용이 포함되어 있다고 생각되면 해당 레벨을 차단 레벨 목록에 추가할 수 있습니다. +레벨을 차단하려면 일시 중지 메뉴를 불러온 뒤 {*CONTROLLER_VK_RB*}를 눌러 레벨 차단 툴팁을 선택하십시오. +다음에 해당 레벨을 선택하여 게임에 참가하려고 하면 차단 레벨 목록에 있는 레벨이라는 주의사항이 표시됩니다. 해당 레벨을 리스트에서 제거한 다음 참가할지, 아니면 나갈지를 선택할 수 있습니다. + + + {*T3*}플레이 방법: 호스트 및 플레이어 옵션{*ETW*}{*B*}{*B*} + +{*T1*}게임 옵션{*ETW*}{*B*} +월드를 불러오거나 새로 만들 때 "추가 옵션" 버튼을 누르면 게임의 세부 사항을 조정할 수 있는 메뉴가 열립니다.{*B*}{*B*} + + {*T2*}플레이어 대 플레이어{*ETW*}{*B*} + 이 옵션을 켜면 플레이어가 다른 플레이어를 공격할 수 있습니다. 생존 모드에만 적용됩니다.{*B*}{*B*} + + {*T2*}플레이어 신뢰{*ETW*}{*B*} + 이 옵션을 끄면 게임에 참여하는 플레이어의 행동이 제한됩니다. 채굴, 아이템 사용, 블록 놓기, 문과 스위치 사용, 보관함 사용, 플레이어나 동물 공격을 할 수 없습니다. 게임 메뉴에서 특정 플레이어의 행동 권한에 관한 이러한 옵션을 변경할 수 있습니다.{*B*}{*B*} + + {*T2*}불 확산{*ETW*}{*B*} + 이 옵션을 켜면 불이 근처 가연성 블록으로 퍼집니다. 나중에 게임에서 설정을 바꿀 수도 있습니다.{*B*}{*B*} + + {*T2*}TNT 폭발{*ETW*}{*B*} + 이 옵션을 켜면 TNT를 점화했을 때 폭발합니다. 나중에 게임에서 설정을 바꿀 수도 있습니다.{*B*}{*B*} + + {*T2*}호스트 특권{*ETW*}{*B*} + 이 옵션을 켜면 호스트는 게임 메뉴에서 플레이어에게 비행 능력을 주거나, 지치지 않게 하거나, 투명하게 만들 수 있습니다. {*DISABLES_ACHIEVEMENTS*}{*B*}{*B*} + + {*T2*}일광 주기{*ETW*}{*B*} + 이 옵션을 끄면 시간이 바뀌지 않습니다.{*B*}{*B*} + + {*T2*}소지품 지키기{*ETW*}{*B*} + 이 옵션을 켜면 플레이어가 죽을 때 소지품을 지킬 수 있습니다.{*B*}{*B*} + + {*T2*}괴물 및 동물 생성{*ETW*}{*B*} + 이 옵션을 끄면 괴물 및 동물이 자연적으로 생성되지 않습니다.{*B*}{*B*} + + {*T2*}괴물과 동물의 난동{*ETW*}{*B*} + 이 옵션을 끄면 괴물과 동물이 블록을 바꾸거나 아이템을 집어 들 수 없게 됩니다. 예를 들어 Creeper의 폭발이 블록을 파괴하지 못하고 양이 잡초를 제거할 수 없습니다.{*B*}{*B*} + + {*T2*}괴물 및 동물 전리품{*ETW*}{*B*} + 이 옵션을 끄면 괴물과 동물들이 전리품을 떨어뜨리지 않습니다. 예를 들어 Creeper는 화약을 떨어뜨리지 않습니다.{*B*}{*B*} + + {*T2*}블록 드롭{*ETW*}{*B*} + 이 옵션을 끄면 블록이 파괴돼도 아이템을 떨어뜨리지 않습니다. 예를 들어 돌 블록이 조약돌을 떨어뜨리지 않습니다.{*B*}{*B*} + + {*T2*}자연 재생{*ETW*}{*B*} + 이 옵션을 끄면 플레이어의 건강이 자연적으로 회복되지 않습니다.{*B*}{*B*} + +{*T1*}월드 생성 옵션{*ETW*}{*B*} +새 월드를 생성할 때 선택할 수 있는 추가 옵션입니다.{*B*}{*B*} + + {*T2*}건물 생성{*ETW*}{*B*} + 이 옵션을 켜면 마을이나 요새 등의 건물이 월드에 생성됩니다.{*B*}{*B*} + + {*T2*}완전평면 월드{*ETW*}{*B*} + 이 옵션을 켜면 지상과 지하에 완전히 평평한 세계가 생성됩니다.{*B*}{*B*} + + {*T2*}보너스 상자{*ETW*}{*B*} + 이 옵션을 켜면 쓸모있는 아이템이 든 상자가 플레이어 생성 지점 근처에 나타납니다.{*B*}{*B*} + + {*T2*}지하 초기화{*ETW*}{*B*} + 이 옵션을 켜면 지하 세계가 재생성됩니다. 지하 요새 없이 저장한 게임에서 유용합니다.{*B*}{*B*} + + {*T1*}게임 메뉴 옵션{*ETW*}{*B*} + 게임 플레이 중에 {*BACK_BUTTON*} 버튼을 눌러서 게임 메뉴로 이동한 다음 사용할 수 있는 옵션입니다.{*B*}{*B*} + + {*T2*}호스트 옵션{*ETW*}{*B*} + 호스트 플레이어나 관리자로 설정된 플레이어는 "호스트 옵션" 메뉴에 들어갈 수 있습니다. 이 메뉴에서 불 확산과 TNT 폭발을 켜거나 끌 수 있습니다.{*B*}{*B*} + +{*T1*}플레이어 옵션{*ETW*}{*B*} +플레이어의 행동 권한을 변경하려면 플레이어 이름을 선택하고 {*CONTROLLER_VK_A*} 버튼을 눌러 플레이어 특권 메뉴에서 다음 옵션을 조정하십시오.{*B*}{*B*} + + {*T2*}건설 및 채광 가능{*ETW*}{*B*} + 이 옵션은 "플레이어 신뢰"를 껐을 때만 사용할 수 있습니다. 이 옵션을 켜면 플레이어는 월드에서 일반적인 행동을 모두 할 수 있습니다. 이 옵션을 끄면 플레이어는 블록을 놓거나 파괴하지 못합니다.{*B*}{*B*} + + {*T2*}문과 스위치 사용 가능{*ETW*}{*B*} + 이 옵션은 "플레이어 신뢰"를 껐을 때만 사용할 수 있습니다. 이 옵션을 끄면 플레이어는 문과 스위치를 사용할 수 없습니다.{*B*}{*B*} + + {*T2*}보관함을 열 수 있음{*ETW*}{*B*} + 이 옵션은 "플레이어 신뢰"를 껐을 때만 사용할 수 있습니다. 이 옵션을 끄면 플레이어는 상자와 같은 보관함을 열 수 없습니다.{*B*}{*B*} + + {*T2*}플레이어 공격 가능{*ETW*}{*B*} + 이 옵션은 "플레이어 신뢰"를 껐을 때만 사용할 수 있습니다. 이 옵션을 끄면 플레이어는 다른 플레이어에게 피해를 줄 수 없습니다.{*B*}{*B*} + + {*T2*}동물 공격 가능{*ETW*}{*B*} + 이 옵션은 "플레이어 신뢰"를 껐을 때만 사용할 수 있습니다. 이 옵션을 끄면 플레이어는 동물에게 피해를 줄 수 없습니다.{*B*}{*B*} + + {*T2*}관리자{*ETW*}{*B*} + 이 옵션을 켜면 플레이어는 다른 플레이어의 특권을 변경할 수 있습니다(호스트 제외). "플레이어 신뢰"를 끄면 플레이어를 추방하거나 불 확산과 TNT 폭발을 켜거나 끌 수 있습니다.{*B*}{*B*} + + {*T2*}플레이어 추방{*ETW*}{*B*} + {*KICK_PLAYER_DESCRIPTION*}{*B*}{*B*} + +{*T1*}호스트 플레이어 옵션{*ETW*}{*B*} +"호스트 특권" 옵션을 켠 상태에서 호스트 플레이어는 플레이어 특권을 변경할 수 있습니다. 플레이어 특권을 변경하려면 플레이어 이름을 선택하고 {*CONTROLLER_VK_A*} 버튼을 눌러 플레이어 특권 메뉴에서 다음 옵션을 조정하십시오.{*B*}{*B*} + + {*T2*}비행 가능{*ETW*}{*B*} + 이 옵션을 켜면 플레이어는 날 수 있습니다. 이 옵션은 생존 모드에서만 적용됩니다(창작 모드에서는 모든 플레이어가 비행 가능).{*B*}{*B*} + + {*T2*}지치지 않음{*ETW*}{*B*} + 이 옵션은 생존 모드에서만 적용됩니다. 이 옵션을 켜면 걷기/달리기/점프 등의 행동을 해도 음식 막대가 줄어들지 않습니다. 하지만 플레이어가 상처를 입으면 회복되는 동안 음식 막대가 서서히 줄어듭니다.{*B*}{*B*} + + {*T2*}투명화{*ETW*}{*B*} + 이 옵션을 켜면 플레이어는 다른 플레이어의 눈에 보이지 않게 되며 무적 상태가 됩니다.{*B*}{*B*} + + {*T2*}순간 이동 가능{*ETW*}{*B*} + 월드 안에서 플레이어가 다른 플레이어나 자기 자신을 다른 플레이어에게 순간 이동하게 할 수 있습니다. + + + 다음 페이지 + + + {*T3*}플레이 방법: 동물 농장{*ETW*}{*B*}{*B*} +동물을 한 장소에 두고 싶으면 20x20 블록보다 작은 면적에 울타리를 짓고 그 안에 동물을 두십시오. 이렇게 하면 다른 일을 하다가 돌아와도 동물이 그 자리에 있을 겁니다. + + + {*T3*}플레이 방법: 동물 교배{*ETW*}{*B*}{*B*} +Minecraft에서는 동물을 교배해 새끼 동물을 얻을 수 있습니다!{*B*} +동물을 교배시키려면 각 동물에 적합한 먹이를 먹여 '사랑 모드'로 만들어야 합니다.{*B*} +소, Mooshroom, 양에게는 밀을, 돼지에게는 당근을 먹이고 닭에게는 밀 씨앗이나 지하 사마귀를 먹이십시오. 늑대에겐 모든 종류의 고기를 먹일 수 있습니다. 적합한 먹이를 먹은 동물은 근처에 같은 종류의 사랑 모드 상태인 동물이 있는지 찾아다니게 됩니다.{*B*} +사랑 모드 상태이며 종류가 같은 동물이 두 마리 만나게 되면 서로 입을 맞추게 되고, 잠시 후 새끼 동물이 태어납니다. 새끼 동물은 다 자라기 전까지 부모 동물을 따라다니게 됩니다.{*B*} +사랑 모드가 끝난 동물은 5분간 다시 사랑 모드 상태가 될 수 없습니다.{*B*} +월드에 생성될 수 있는 동물의 숫자가 제한되어 있으므로 동물이 많을 때 교배할 수 없을 수도 있습니다. + + + {*T3*}플레이 방법: 지하 차원문{*ETW*}{*B*}{*B*} +지하 차원문은 플레이어가 지상 월드와 지하 월드를 오갈 때 사용하는 관문입니다. 지하 월드의 1블록 거리는 지상 월드의 3블록 거리와 같으므로, 지하 월드에서는 지상 월드에서보다 더 빨리 이동할 수 있습니다. +따라서 지하에 차원문을 세우고 그곳을 통과하면 3배 먼 거리로 나가게 됩니다.{*B*}{*B*} +차원문을 세우려면 흑요석 블록이 10개 이상 필요하며, 5블록 높이에 4블록 너비, 1블록 깊이로 만들어야 합니다. 차원문 외형이 만들어지면 안쪽 공간에 불을 붙여야 차원문을 작동할 수 있습니다. 불은 부싯돌과 부시 또는 불쏘시개를 사용하여 붙입니다.{*B*}{*B*} +차원문 세우기의 예시는 오른쪽 그림에 표시되어 있습니다. + + + {*T3*}플레이 방법: 상자{*ETW*}{*B*}{*B*} +상자를 만들고 나면 상자를 월드에 놓고 {*CONTROLLER_ACTION_USE*}를 눌러 소지품에 있는 아이템을 보관할 수 있습니다.{*B*}{*B*} +아이템을 소지품 또는 상자로 옮기려면 포인터를 사용하십시오.{*B*}{*B*} +상자 안에 넣어둔 아이템은 나중에 소지품에 다시 넣을 수 있습니다. + + + Minecon에 간 적 있나요? + + + Mojang 직원 중 junkboy의 얼굴을 본 사람은 없습니다. + + + Minecraft 위키가 있다는 걸 아십니까? + + + 버그가 보이더라도 신경 쓰지 마세요. + + + Creeper는 코딩 버그에서 태어났습니다. + + + 닭입니까, 오리입니까? + + + Mojang의 새 사무실은 아주 멋집니다! + + + {*T3*}플레이 방법: 기본{*ETW*}{*B*}{*B*} +Minecraft는 블록을 배치하여 무엇이든 상상한 대로 만들 수 있는 게임입니다. 밤에는 괴물이 출몰하므로, 그에 대비하여 피신처를 준비해둬야 합니다.{*B*}{*B*} +{*CONTROLLER_ACTION_LOOK*}로 주위를 둘러봅니다.{*B*}{*B*} +{*CONTROLLER_ACTION_MOVE*}으로 주변을 이동합니다.{*B*}{*B*} +{*CONTROLLER_ACTION_JUMP*}를 누르면 점프합니다.{*B*}{*B*} +{*CONTROLLER_ACTION_MOVE*}을 앞으로 빠르게 두 번 누르면 질주합니다. {*CONTROLLER_ACTION_MOVE*}을 계속 누르고 있으면 질주 시간이 다 되거나 음식 막대가 {*ICON_SHANK_03*} 이하가 될 때까지 계속 질주합니다.{*B*}{*B*} +{*CONTROLLER_ACTION_ACTION*}를 누르고 있으면 손이나 도구를 사용해 채굴하거나 벌목합니다. 특정 블록을 채굴하려면 도구를 만들어야 할 수 있습니다.{*B*}{*B*} +손에 아이템을 들고 있다면 {*CONTROLLER_ACTION_USE*}를 눌러 사용하거나 {*CONTROLLER_ACTION_DROP*}를 눌러 버릴 수 있습니다. + + + {*T3*}플레이 방법: HUD{*ETW*}{*B*}{*B*} +HUD는 체력이나 산소(물속에 있을 때), 배고픔 레벨(배고픔을 해결하려면 음식을 먹어야 함), 방어력(방어구를 입고 있을 때) 등의 정보를 보여줍니다. + 체력을 잃어도 음식 바에 {*ICON_SHANK_01*}가 9 이상 있다면 체력이 자동으로 회복됩니다. 음식을 먹으면 음식 바가 차오릅니다.{*B*} +또한 이곳의 경험치 막대는 숫자로 경험치가 표시되며 막대는 경험치를 올리는 데 필요한 경험치 점수를 보여줍니다. +경험치 점수는 괴물이나 동물을 처치하면 나오는 구체를 모으거나, 특정 블록을 채굴하거나, 동물을 교배하거나 낚시를 하거나 화로에서 광석을 녹이면 얻을 수 있습니다.{*B*}{*B*} +또한 사용할 수 있는 아이템도 표시됩니다. {*CONTROLLER_ACTION_LEFT_SCROLL*}과 {*CONTROLLER_ACTION_RIGHT_SCROLL*}로 손에 든 아이템을 바꿀 수 있습니다. + + + {*T3*}플레이 방법: 소지품{*ETW*}{*B*}{*B*} +{*CONTROLLER_ACTION_INVENTORY*}을 이용해 소지품을 볼 수 있습니다.{*B*}{*B*} +이 화면에는 손에 들고 쓸 수 있는 아이템과 가지고 다닐 수 있는 아이템이 모두 표시됩니다. 방어력 또한 이 화면에서 확인할 수 있습니다.{*B*}{*B*} +{*CONTROLLER_MENU_NAVIGATE*}로 포인터를 움직일 수 있습니다. {*CONTROLLER_VK_A*} 버튼을 누르면 포인터로 가리킨 아이템을 집습니다. 수량이 2개 이상일 때는 아이템을 전부 집으며, {*CONTROLLER_VK_X*} 버튼을 누르면 반만 집을 수 있습니다.{*B*}{*B*} +포인터를 사용해서 아이템을 소지품의 다른 공간으로 옮긴 다음 {*CONTROLLER_VK_A*} 버튼을 누르면 해당 위치에 놓습니다. 포인터로 집은 아이템이 여러 개일 때 {*CONTROLLER_VK_A*} 버튼을 누르면 모두 내려놓고 {*CONTROLLER_VK_X*} 버튼을 누르면 하나만 놓습니다.{*B*}{*B*} +방어구 아이템에 포인터를 올려놓으면 해당 아이템을 방어구 슬롯으로 빨리 옮길 수 있는 툴팁이 표시됩니다.{*B*}{*B*} +가죽 방어구를 염색해 색깔을 바꿀 수 있습니다. 소지품 메뉴에서 포인터로 염색을 잡은 후 염색하고 싶은 물건에 포인터를 놓고 {*CONTROLLER_VK_X*} 버튼을 누르십시오. + + + Minecon 2013이 미국 플로리다 주 올랜도 시에서 개최됩니다! + + + .party()는 최고였습니다! + + + 뜬소문은 모두 거짓이라고 생각하는 것이 진실이라고 생각하는 것보다 좋습니다! + + + 이전 페이지 + + + 교환 + + + 모루 + + + Ender + + + 레벨 차단 + + + 창작 모드 + + + 호스트 및 플레이어 옵션 + + + {*T3*}플레이 방법: Ender{*ETW*}{*B*}{*B*} +Ender는 Ender 차원문을 통해 갈 수 있는 게임의 다른 차원입니다. Ender 차원문은 지상의 깊은 지하에 있는 요새에서 찾을 수 있습니다.{*B*} +Ender 차원문을 열려면 Ender의 눈이 없는 Ender 관문 외형에 Ender의 눈을 올려놓으십시오.{*B*} +차원문이 열리면 Ender로 들어가십시오.{*B*}{*B*} +Ender에서 수많은 Enderman과 흉포하고 강력한 Ender 드래곤을 만나게 되니 전투에 대비해야 합니다!{*B*}{*B*} +이곳에는 8개의 흑요석 기둥 위에 Ender 드래곤이 치유하는 데 사용하는 Ender 수정이 있으니, 전투가 시작되면 가장 먼저 이것을 파괴해야 합니다.{*B*} +일부는 화살 사정거리 내에 있지만 일부는 철제 우리가 보호하고 있으니 올라가야 합니다.{*B*}{*B*} +Ender 드래곤이 Ender 산성구를 쏘며 공격하니 주의하십시오!{*B*} +기둥의 중앙에 있는 알 받침대에 접근하면 Ender 드래곤이 내려와 강력한 공격을 합니다!{*B*} +산성구를 피하며 Ender 드래곤의 눈을 공격하면 효과가 좋습니다. 친구와 함께 Ender에서 전투를 벌이십시오!{*B*}{*B*} +Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 Ender 차원문의 위치를 볼 수 있으니, 쉽게 참여할 수 있습니다. + + + {*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*} + + + 스크린샷 공유 + + + 상자 + + + 제작 + + + 화로 + + + 기본 + + + 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를 공격하지 않습니다. + + + 돌로 된 블록이나 광석을 채굴할 때 쓰입니다. + + + 케이크 제조법에 사용되며 물약을 양조하는 재료로 사용됩니다. + + + 켜거나 끌 때 전기를 보냅니다. 다시 조작하기 전까지 켜지거나 꺼진 상태로 있습니다. + + + 주기적으로 전기를 보내거나, 블록 옆에 연결하면 송/수신기 역할을 합니다. +약한 조명으로 사용할 수도 있습니다. + + + {*ICON_SHANK_01*}를 2만큼 회복하며 황금 사과를 만드는 데 사용합니다. + + + {*ICON_SHANK_01*}를 2만큼 회복하며 4초 동안 체력이 회복됩니다. 사과와 금덩이로 만듭니다. + + + 그대로 먹으면 {*ICON_SHANK_01*}를 2만큼 회복하지만 병에 걸릴 수 있습니다. + + + 레드스톤 회로에서 중계장치, 지연장치 또는 다이오드 역할을 합니다. + + + 광물 수레가 가는 길에 사용됩니다. + + + 동력을 공급하면 그 위를 지나가는 광물 수레의 속도를 올려줍니다. 동력이 끊기면 광물 수레를 멈춰 세웁니다. + + + 압력판처럼 사용되지만 광물 수레로만 작동시킬 수 있습니다. 동력이 공급되면 레드스톤 신호를 보냅니다. + + + 누르면 전기를 보냅니다. 버튼을 떼면 1초 정도 작동하다가 닫힙니다. + + + 레드스톤으로 전기를 공급하면 아이템을 넣어 무작위 순서로 발사할 수 있습니다. + + + 작동시키면 음을 연주합니다. 때리면 음의 높낮이가 바뀝니다. 다른 블록 위에 올려놓으면 연주 음의 종류가 변경됩니다. + + + {*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만큼 회복합니다. 화로에서 소 날고기를 조리해서 만듭니다. + + + 레일을 따라서 플레이어나 동물, 괴물을 이동시킵니다. + + + 양털을 밝은 파란색으로 염색합니다. + + + 양털을 청록색으로 염색합니다. + + + 양털을 보라색으로 염색합니다. + + + 양털을 라임색으로 염색합니다. + + + 양털을 회색으로 염색합니다. + + + 양털을 밝은 회색으로 염색합니다. +(참고: 밝은 회색 염료는 회색 염료와 뼛가루를 섞어도 만들 수 있습니다. 이 방법을 쓰면 먹물 주머니 하나로 회색 염료를 3개가 아니라 4개 만들 수 있습니다.) + + + 양털을 자주색으로 염색합니다. + + + 횃불보다 더 밝은 빛을 만들어냅니다. 얼음이나 눈을 녹이며, 물속에서 사용이 가능합니다. + + + 책과 지도의 재료입니다. + + + 책장을 만들거나 효과가 부여된 책에 효과를 부여하는 데 사용됩니다. + + + 양털을 파란색으로 염색합니다. + + + 음악 디스크를 재생합니다. + + + 매우 강력한 도구나 무기, 방어구를 만드는 데 사용합니다. + + + 양털을 주황색으로 염색합니다. + + + 양에게서 얻어냅니다. 염료로 색을 바꿀 수 있습니다. + + + 건설 재료로 쓰입니다. 염료로 색을 바꿀 수 있지만, 양털은 양에게서 쉽게 얻을 수 있으므로 권장하지는 않습니다. + + + 양털을 검은색으로 염색합니다. + + + 레일을 따라서 물건을 이동시킵니다. + + + 석탄을 안에 넣으면 레일을 따라 움직이며 다른 광물 수레를 밀어줍니다. + + + 헤엄치는 것보다 물에서 빨리 이동할 수 있습니다. + + + 양털을 초록색으로 염색합니다. + + + 양털을 빨간색으로 염색합니다. + + + 작물이나 나무, 긴 잡초, 거대 버섯, 꽃을 즉시 성장시킵니다. 염료 재료로도 사용합니다. + + + 양털을 분홍색으로 염색합니다. + + + 양털을 갈색으로 염색하는 데, 쿠키의 재료로도 사용되며 코코아 콩을 재배하는 데 사용됩니다. + + + 양털을 은색으로 염색합니다. + + + 양털을 노란색으로 염색합니다. + + + 화살과 함께 사용하여 원거리 공격을 합니다. + + + 착용 시 5의 방어력을 얻습니다. + + + 착용 시 3의 방어력을 얻습니다. + + + 착용 시 1의 방어력을 얻습니다. + + + 착용 시 5의 방어력을 얻습니다. + + + 착용 시 2의 방어력을 얻습니다. + + + 착용 시 2의 방어력을 얻습니다. + + + 착용 시 3의 방어력을 얻습니다. + + + 빛나는 주괴입니다. 주괴로 도구를 만들면 주괴와 재질이 같은 도구가 제작됩니다. 화로에서 광석을 녹여 만듭니다. + + + 주괴, 보석, 염료를 설치 가능한 블록으로 만들 수 있게 해줍니다. 값비싼 건설용 블록으로 쓰거나 광물을 간편하게 보관하는 데 사용됩니다. + + + 플레이어나 동물 또는 괴물이 밟으면 전기를 보냅니다. 나무 압력판은 위쪽에 물체를 떨어뜨려도 작동합니다. + + + 착용 시 8의 방어력을 얻습니다. + + + 착용 시 6의 방어력을 얻습니다. + + + 착용 시 3의 방어력을 얻습니다. + + + 착용 시 6의 방어력을 얻습니다. + + + 철문은 레드스톤, 버튼 또는 스위치로만 열 수 있습니다. + + + 착용 시 1의 방어력을 얻습니다. + + + 착용 시 3의 방어력을 얻습니다. + + + 나무로 된 블록을 손을 사용할 때보다 더 빨리 잘라냅니다. + + + 흙과 잡초 블록을 갈아엎어서 작물을 기를 수 있게 만듭니다. + + + 나무문은 사용하거나 때려서 또는 레드스톤으로 열 수 있습니다. + + + 착용 시 2의 방어력을 얻습니다. + + + 착용 시 4의 방어력을 얻습니다. + + + 착용 시 1의 방어력을 얻습니다. + + + 착용 시 2의 방어력을 얻습니다. + + + 착용 시 1의 방어력을 얻습니다. + + + 착용 시 2의 방어력을 얻습니다. + + + 착용 시 5의 방어력을 얻습니다. + + + 작은 계단을 만드는 데 사용됩니다. + + + 버섯죽을 담아두는 데 사용합니다. 죽을 먹어도 그릇은 남습니다. + + + 물이나 용암, 우유를 담아두거나 운반하는 데 쓰입니다. + + + 물을 저장하고 옮기는 데 사용합니다. + + + 자신이나 다른 플레이어가 입력한 텍스트를 표시합니다. + + + 횃불보다 더 밝은 빛을 만들어냅니다. 얼음이나 눈을 녹이며, 물속에서 사용이 가능합니다. + + + 폭발을 일으킵니다. 설치한 다음, 부싯돌과 부시를 사용하거나 전기를 이용해 폭파할 수 있습니다. + + + 용암을 저장하고 옮기는 데 사용합니다. + + + 태양과 달의 위치를 표시합니다. + + + 시작 지점을 표시합니다. + + + 지도를 들고 있을 동안 탐험한 지역의 이미지를 만들어냅니다. 길을 찾는 데 사용할 수 있습니다. + + + 우유를 저장하고 옮기는 데 사용합니다. + + + 불꽃을 일으키고, TNT를 폭파하고, 차원문을 여는 데 사용합니다. + + + 물고기를 잡을 수 있습니다. + + + 사용하거나 때리거나 레드스톤을 이용해 작동시킵니다. 작동 방식은 일반 문과 같지만 개별적 블록으로 간주되며, 땅과 수평인 형태로 열립니다. + + + 건설 재료로 쓰거나 다양한 물건의 재료로 사용됩니다. 어떤 형태의 나무로부터 만들어질 수 있습니다. + + + 건설 재료로 사용됩니다. 일반 모래와 달리 중력의 영향을 받지 않습니다. + + + 건설 재료로 사용됩니다. + + + 긴 계단을 만드는 데 쓰입니다. 발판 2개를 쌓으면 보통 크기의 2단 계단 블록이 만들어집니다. + + + 긴 계단을 만드는 데 사용됩니다. 각 계단의 꼭대기에 있는 두 개의 발판은 보통 크기의 발판 블록을 만들어냅니다. + + + 빛을 만드는 데 사용합니다. 눈과 얼음도 녹일 수 있습니다. + + + 횃불, 화살, 표지판, 사다리, 울타리를 만들거나 무기 또는 도구의 손잡이로 사용됩니다. + + + 블록과 아이템을 넣어 보관합니다. 상자 2개를 나란히 놓으면 용량이 2배 큰 상자가 만들어집니다. + + + 뛰어넘을 수 없는 방어벽으로 사용됩니다. 플레이어나 동물, 괴물에 대해서는 1.5배 높이의 블록으로 간주되지만 다른 블록에 대해서는 높이가 같은 것으로 간주됩니다. + + + 수직 경사를 오를 때 사용합니다. + + + 밤에 모든 플레이어가 침대에 들면 시간을 앞당겨서 아침으로 만들며, 플레이어 생성 지점을 바꿉니다. +침대 제작에 사용된 양털의 색과 상관없이, 침대의 색상은 모두 같습니다. + + + 일반적인 제작보다 더 다양한 아이템을 선택해 제작할 수 있게 해줍니다. + + + 광석을 녹이고 숯과 유리를 만들며, 생선과 돼지고기를 요리하는 데 사용합니다. + + + 철제 도끼 + + + 레드스톤 램프 + + + 정글 나무 계단 + + + 자작나무 계단 + + + 현재 컨트롤 + + + 두개골 + + + 코코아 + + + 전나무 계단 + + + 용의 알 + + + Ender 돌 + + + Ender 차원문 외형 + + + 사암 계단 + + + 양치식물 + + + 관목 + + + 배치 + + + 제작 + + + 사용 + + + 행동 + + + 살금살금 걷기/아래로 비행 + + + 살금살금 걷기 + + + 버리기 + + + 아이템 교체 + + + 일시 중지 + + + 보기 + + + 이동/질주 + + + 소지품 + + + 점프/위로 비행 + + + 점프 + + + 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 + + + 벽돌 + + + 횃불 + + + 흑요석 + + + 이끼 낀 돌 + + + 지하 벽돌 발판 + + + 참나무 발판 + + + 돌 벽돌 발판 + + + 벽돌 발판 + + + 정글 나무 발판 + + + 자작나무 발판 + + + 전나무 발판 + + + 자주색 양털 + + + 자작나무 나뭇잎 + + + 전나무 나뭇잎 + + + 참나무 나뭇잎 + + + 유리 + + + 스펀지 + + + 정글 잎사귀 + + + 나뭇잎 + + + 참나무 + + + 전나무 + + + 자작나무 + + + 전나무 목재 + + + 자작나무 목재 + + + 정글 나무 + + + 양털 + + + 분홍색 양털 + + + 회색 양털 + + + 밝은 회색 양털 + + + 밝은 파란색 양털 + + + 노란색 양털 + + + 라임색 양털 + + + 청록색 양털 + + + 초록색 양털 + + + 빨간색 양털 + + + 검은색 양털 + + + 보라색 양털 + + + 파란색 양털 + + + 갈색 양털 + + + 횃불(석탄) + + + 발광석 + + + 영혼 모래 + + + 지하 바위 + + + 청금석 블록 + + + 청금석 광석 + + + 차원문 + + + 호박등 + + + 사탕수수 + + + 찰흙 + + + 선인장 + + + 호박 + + + 울타리 + + + 주크박스 + + + 청금석을 저장하는 간편한 방법입니다. + + + 들창 + + + 잠긴 상자 + + + 다이오드 + + + 끈끈이 피스톤 + + + 피스톤 + + + 양털(모든 색상) + + + 마른 덤불 + + + 케이크 + + + 소리 블록 + + + 디스펜서 + + + 긴 잡초 + + + 거미줄 + + + 침대 + + + 얼음 + + + 작업대 + + + 다이아몬드를 저장하는 간편한 방법입니다. + + + 다이아몬드 블록 + + + 화로 + + + 농지 + + + 작물 + + + 다이아몬드 광석 + + + 괴물 출입문 + + + + + + 횃불(숯) + + + 레드스톤 가루 + + + 상자 + + + 참나무 계단 + + + 표지판 + + + 레드스톤 광석 + + + 철문 + + + 압력판 + + + + + + 버튼 + + + 레드스톤 횃불 + + + 손잡이 + + + 레일 + + + 사다리 + + + 나무문 + + + 돌 계단 + + + 탐지 레일 + + + 동력 레일 + + + 화로를 만들 수 있을 만큼 조약돌을 모았습니다. 작업대에서 화로를 만드십시오. + + + 낚싯대 + + + 시계 + + + 발광석 가루 + + + 화로가 달린 광물 수레 + + + 달걀 + + + 나침반 + + + 날생선 + + + 붉은 장미 염료 + + + 초록 선인장 염료 + + + 코코아 열매 + + + 요리한 생선 + + + 염료 가루 + + + 먹물 주머니 + + + 상자가 담긴 광물 수레 + + + 눈덩이 + + + + + + 가죽 + + + 광물 수레 + + + 안장 + + + 레드스톤 + + + 우유 양동이 + + + 종이 + + + + + + 슬라임 볼 + + + 벽돌 + + + 찰흙 + + + 사탕수수 + + + 청금석 + + + 지도 + + + 음악 디스크 - "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*} 버튼을 누르면 하나만 놓습니다. + + + + + {*CONTROLLER_MENU_NAVIGATE*}로 포인터를 움직일 수 있습니다. {*CONTROLLER_VK_A*} 버튼을 누르면 포인터로 가리킨 아이템을 집습니다. + 수량이 2개 이상일 때는 아이템을 전부 집으며, {*CONTROLLER_VK_X*} 버튼을 누르면 반만 집을 수 있습니다. + + + + 튜토리얼 1장을 마쳤습니다. + + + 화로를 사용해서 유리를 만드십시오. 유리가 만들어지는 시간 동안, 피신처를 만들 재료를 더 구해보면 어떨까요? + + + 화로를 사용해서 숯을 만드십시오. 숯이 만들어지는 시간 동안, 피신처를 만들 재료를 더 구해보면 어떨까요? + + + {*CONTROLLER_ACTION_USE*}를 눌러 화로를 설치한 다음 화로를 여십시오. + + + 밤에는 매우 어두워지므로, 피신처 안에서 잘 볼 수 있도록 조명이 있어야 합니다. 제작 인터페이스에서 막대와 숯을 이용해 횃불을 만드십시오.{*TorchIcon*} + + + {*CONTROLLER_ACTION_USE*}를 눌러 문을 설치하십시오. {*CONTROLLER_ACTION_USE*}로 나무문을 열거나 닫아 월드로 출입할 수 있습니다. + + + 좋은 피신처를 만들려면, 출입할 때마다 벽을 허물고 다시 쌓을 필요가 없도록 문을 달아야 합니다. 나무문을 만들어 보십시오.{*WoodenDoorIcon*} + + + 아이템 정보를 더 보려면 포인터로 아이템을 가리킨 다음 {*CONTROLLER_ACTION_MENU_PAGEDOWN*}를 누르십시오. + + + + + 이것은 제작 인터페이스입니다. 여기서 아이템을 조합하여 새 아이템을 만들 수 있습니다. + + + + 창작 모드 소지품을 닫으려면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. + + + + 아이템 정보를 더 보려면 포인터로 아이템을 가리킨 다음 {*CONTROLLER_ACTION_MENU_PAGEDOWN*}를 누르십시오. + + + + {*B*} + 현재 아이템을 만드는 데 필요한 재료를 보려면 {*CONTROLLER_VK_X*} 버튼을 누르십시오. + + + {*B*} + 아이템 설명을 보려면 {*CONTROLLER_VK_X*} 버튼을 누르십시오. + + + {*B*} + 계속하려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오.{*B*} + 제작 방법을 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. + + + + 상단의 그룹 유형 탭을 {*CONTROLLER_VK_LB*}와 {*CONTROLLER_VK_RB*}로 스크롤하여 획득하고 싶은 아이템의 그룹 유형을 선택하십시오. + + + + {*B*} + 계속하려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오.{*B*} + 창작 모드 소지품 사용법을 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. + + + 이것은 창작 소지품입니다. 이 화면에는 손에 들고 쓸 수 있는 아이템 외에도 선택할 수 있는 모든 아이템이 함께 표시됩니다. + + + 소지품을 닫으려면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. + + + + 아이템이 걸린 포인터를 인터페이스 밖으로 옮기면 아이템을 월드에 떨어뜨릴 수 있습니다. 빠른 선택 막대에 있는 아이템을 모두 선택 취소하려면 {*CONTROLLER_VK_X*} 버튼을 누르십시오. + + + + + 포인터는 자동으로 사용 줄에서 칸 단위로 움직입니다. {*CONTROLLER_VK_A*} 버튼으로 아이템을 놓을 수 있습니다. 아이템을 놓으면 포인터가 아이템 목록으로 돌아가고 다른 아이템을 선택할 수 있습니다. + + + + + {*CONTROLLER_MENU_NAVIGATE*}로 포인터를 움직일 수 있습니다. + 아이템 목록에서 {*CONTROLLER_VK_A*} 버튼을 누르면 포인터로 가리킨 아이템을 집습니다. {*CONTROLLER_VK_Y*} 버튼을 누르면 해당 아이템을 전부 집을 수 있습니다. + + + + + + + 유리병 + + + 물병 + + + 거미 눈 + + + 금덩이 + + + 지하 사마귀 + + + {*splash*}{*prefix*}물약 {*postfix*} + + + 발효 거미 눈 + + + 가마솥 + + + Ender의 눈 + + + 빛나는 수박 + + + Blaze 가루 + + + 마그마 크림 + + + 양조대 + + + Ghast의 눈물 + + + 호박씨 + + + 수박씨 + + + 닭 날고기 + + + 음악 디스크 - "11" + + + 음악 디스크 - "where are we now" + + + 가위 + + + 구운 닭고기 + + + Ender 진주 + + + 수박 조각 + + + Blaze 막대 + + + 소 날고기 + + + 스테이크 + + + 썩은 살점 + + + 경험치 병 + + + 참나무 목재 판자 + + + 전나무 목재 판자 + + + 자작나무 목재 판자 + + + 잡초 블록 + + + + + + 조약돌 + + + 정글 나무 판자 + + + 자작나무 묘목 + + + 정글 묘목 + + + 기반암 + + + 묘목 + + + 참나무 묘목 + + + 전나무 묘목 + + + + + + 아이템 외형 + + + {*CREATURE*} 생성 + + + 지하 벽돌 + + + 불쏘시개 + + + 불쏘시개 (숯) + + + 불쏘시개 (석탄) + + + 두개골 + + + 머리 + + + %s의 머리 + + + Creeper 머리 + + + 해골 두개골 + + + 말라비틀어진 해골 두개골 + + + 좀비 머리 + + + 석탄을 저장하는 간편한 방법입니다. 화로에서 연료로 사용할 수 있습니다. + + + + + + 배고픔 + + + - 속도 저하 + + + - 신속 + + + 투명화 + + + 수중 호흡 + + + 야간 시야 + + + 맹목 + + + - 피해 + + + - 회복 + + + - 혼란 + + + - 재생 + + + - 둔함 + + + - 채굴 속도 향상 + + + - 피해 약화 + + + - 피해 강화 + + + 화염 저항 + + + 포화 + + + - 저항 + + + - 도약 + + + 위더 + + + 체력 강화 + + + 흡수 + + + + + + II + + + III + + + - 투명화 + + + IV + + + - 수중 호흡 + + + - 화염 저항 + + + - 야간 시야 + + + - 독 + + + - 배고픔 + + + - 흡수 + + + - 포화 + + + - 체력 강화 + + + - 맹목 + + + - 쇠퇴 + + + 소박한 + + + 묽은 + + + 뿌연 + + + 맑은 + + + 우유빛 + + + 이상한 + + + 느끼한 + + + 부드러운 + + + 엉터리 + + + 김이 빠진 + + + 투박한 + + + 단조로운 + + + 폭발 + + + 일반적인 + + + 시시한 + + + 근사한 + + + 따스한 + + + 화려한 + + + 우아한 + + + 고급스러운 + + + 거품이 이는 + + + 고약한 + + + 거칠거칠한 + + + 냄새 없는 + + + 강력한 + + + 냄새나는 + + + 미끈미끈한 + + + 정제된 + + + 짙은 + + + 찰랑대는 + + + 효과 대상 플레이어, 동물 및 괴물의 체력이 서서히 회복합니다. + + + 효과 대상 플레이어, 동물 및 괴물의 체력이 즉시 감소합니다. + + + 효과 대상 플레이어, 동물 및 괴물이 불, 용암 및 Blaze의 원거리 공격에 피해를 받지 않게 됩니다. + + + 그 자체로는 효과가 없습니다. 양조대에서 다른 재료를 추가로 넣어 효과를 추가할 수 있습니다. + + + 매캐한 + + + 효과 대상 플레이어, 동물 및 괴물의 이동 속도가 느려집니다. 플레이어의 질주 속도가 느려지며 점프 거리와 시야 거리가 줄어듭니다. + + + 효과 대상 플레이어, 동물 및 괴물의 이동 속도가 빨라집니다. 플레이어의 질주 속도가 빨라지며 점프 거리와 시야 거리가 늘어납니다. + + + 효과 대상 플레이어 및 괴물의 공격력이 증가합니다. + + + 효과 대상 플레이어, 동물 및 괴물의 체력이 즉시 증가합니다. + + + 효과 대상 플레이어 및 괴물의 공격력이 감소합니다. + + + 모든 물약의 기본이 됩니다. 양조대에서 사용하여 물약을 만들 수 있습니다. + + + 역겨운 + + + 지독한 + + + 강타 + + + 예리 + + + 효과 대상 플레이어, 동물 및 괴물의 체력이 서서히 감소합니다. + + + 공격 손상 + + + 타격 반동 + + + 절지동물 격파 + + + 속도 + + + 좀비 보강 + + + 말 점프력 + + + 적용할 경우: + + + 타격 반동 방어력 + + + 괴물 및 동물 추적 범위 + + + 체력 최대치 + + + 채굴 정확성 + + + 효율성 + + + 수분 친화력 + + + 희귀품 채굴 + + + 전리품 획득 + + + 견고 + + + 화염 방어 + + + 방어 + + + 화염 + + + 낙하 방어 + + + 호흡 + + + 발사체 방어 + + + 폭발 방어 + + + IV + + + V + + + VI + + + 강타 + + + VII + + + III + + + 화염 + + + 강화 + + + 무한 + + + II + + + I + + + 어떤 개체가 연결된 철사 덫을 통과할 때 활성화됩니다. + + + 어떤 개체가 통과할 때 연결된 철사 덫의 고리를 활성화합니다. + + + 에메랄드를 저장하는 간편한 방법입니다. + + + 상자와 비슷하지만 다른 차원에서도 플레이어의 모든 Ender 상자에서 사용할 수 있습니다. + + + IX + + + VIII + + + 철제 곡괭이 이상으로 채굴하면 에메랄드를 얻습니다. + + + X + + + {*ICON_SHANK_01*}를 2만큼 회복하며 황금 당근을 만드는 데 사용합니다. 농지에 심을 수 있습니다. + + + 장식으로 사용할 수 있습니다. 이 안에 꽃, 묘목, 선인장과 버섯을 심을 수 있습니다. + + + 조약돌로 만들어진 벽입니다. + + + 그대로 먹어서 {*ICON_SHANK_01*}를 0.5만큼 회복하거나 화로에서 조리할 수 있습니다. 농지에 심을 수 있습니다. + + + 화로에서 녹여 지하 석영을 만들 수 있습니다. + + + 무기, 도구, 방어구를 수리하기 위해 사용할 수 있습니다. + + + 마을 사람들과 교환할 수 있습니다. + + + 장식으로 사용됩니다. + + + {*ICON_SHANK_01*}를 4만큼 회복합니다. + + + 그대로 먹으면 {*ICON_SHANK_01*}를 1만큼 회복하지만 병에 걸릴 수 있습니다. + + + 안장 얹은 돼지를 탈 때 돼지를 제어하기 위해 사용합니다. + + + {*ICON_SHANK_01*}를 3만큼 회복합니다. 화로에서 감자를 조리해서 만듭니다. + + + {*ICON_SHANK_01*}를 3만큼 회복합니다. 당근과 금덩이로 만듭니다. + + + 모루로 무기, 도구, 방어구에 효과를 부여할 때 사용합니다. + + + 지하 석영 광석을 녹여 만듭니다. 석영 블록을 만들 수 있습니다. + + + 감자 + + + 구운 감자 + + + 당근 + + + 양털로 만듭니다. 장식으로 사용됩니다. + + + 에메랄드 + + + 화분 + + + 호박 파이 + + + 효과가 부여된 책 + + + 독성이 있는 감자 + + + 황금 당근 + + + 당근 꼬치 + + + 철사 덫 고리 + + + 철사 덫 + + + 지하 석영 + + + 에메랄드 광석 + + + Ender 상자 + + + 이끼 낀 조약돌 벽 + + + 에메랄드 블록 + + + 조약돌 벽 + + + 감자 + + + 화분 + + + 당근 + + + 약간 손상된 모루 + + + 모루 + + + 모루 + + + 석영 블록 + + + 매우 손상된 모루 + + + 지하 석영 광석 + + + 석영 계단 + + + 깎아놓은 석영 블록 + + + 기둥 석영 블록 + + + 빨간색 카펫 + + + 카펫 + + + 검은색 카펫 + + + 파란색 카펫 + + + 초록색 카펫 + + + 갈색 카펫 + + + 보라색 카펫 + + + 청록색 카펫 + + + 밝은 회색 카펫 + + + 회색 카펫 + + + 라임색 카펫 + + + 분홍색 카펫 + + + 밝은 파란색 카펫 + + + 노란색 카펫 + + + 자주색 카펫 + + + 주황색 카펫 + + + 흰색 카펫 + + + 깎아놓은 사암 + + + {*PLAYER*}이(가) {*SOURCE*}에게 상처를 주려다 죽었습니다. + + + 부드러운 사암 + + + {*PLAYER*}이(가) 떨어지는 모루에 깔렸습니다. + + + {*PLAYER*}이(가) 떨어지는 블록에 깔렸습니다. + + + {*PLAYER*}이(가) 그들의 위치로 당신을 순간 이동시켰습니다 + + + {*PLAYER*}을(를) {*DESTINATION*}에게로 순간 이동시켰습니다 + + + 가시 + + + {*PLAYER*}이(가) 당신 위치로 순간 이동시켰습니다 + + + 물속 같이 어두운 지역을 밝게 해줍니다. + + + 석영 발판 + + + 플레이어, 동물 및 괴물이 안 보이게 합니다. + + + 수리 및 이름 붙이기 + + + 너무 비쌉니다! + + + 효과부여 비용: %d + + + 현재 소유: + + + 이름 바꾸기 + + + {*VILLAGER_TYPE*}이(가) %s을(를) 제안합니다 + + + 교환에 필요한 아이템 + + + 교환 + + + 수리 + + + + 이것은 모루 인터페이스입니다. 경험치를 지불하고 무기, 방어구 또는 도구의 이름을 바꾸고 수리하고 효과를 부여할 수 있습니다. + + + + 목걸이 염색 + + + + 작업할 아이템을 첫 번째 입력 슬롯에 넣으십시오. + + + + + {*B*} + 모루 인터페이스에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오.{*B*} + 모루 인터페이스에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. + + + + + 아니면 동일한 두 번째 아이템을 두 번째 슬롯에 넣어 두 아이템을 조합할 수 있습니다. + + + + + 두 번째 입력 슬롯에 제대로 된 원자재를 넣으면(예: 손상된 철제 검을 위한 철 주괴), 수리된 제안 형태가 출력 슬롯에 나타납니다. + + + + + 작업에 필요한 경험치의 숫자는 출력 아래에 표시됩니다. 경험치가 부족하면 수리를 완료할 수 없습니다. + + + + + 모루에서 아이템에 효과를 부여하려면 두 번째 입력 슬롯에 효과가 부여된 책을 넣습니다. + + + + + 수리된 아이템을 집어들면 모루에서 사용한 두 가지 아이템이 모두 소비되며 정해진 만큼의 경험치가 줄어듭니다. + + + + + 텍스트 상자에 표시되는 이름을 수정해 아이템의 이름을 바꿀 수 있습니다. + + + + + {*B*} + 모루에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오.{*B*} + 모루에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. + + + + + 이 구역에는 모루와 작업할 도구 및 무기가 들어있는 상자가 있습니다. + + + + + 던전 안에 있는 상자에서 효과가 부여된 책을 찾거나 효과부여대에서 일반 책에 효과를 부여할 수도 있습니다. + + + + + 모루를 사용해 무기와 도구를 수리하면 내구성을 회복할 수 있으며, 효과가 부여된 책으로 이름을 바꾸고 효과를 부여할 수도 있습니다. + + + + + 작업 유형, 아이템 가치, 효과부여 횟수, 이전 작업 횟수 등에 따라 수리 비용이 달라집니다. + + + + + 모루를 사용하면 경험치가 줄어들며, 사용할 때마다 모루가 손상될 가능성이 있습니다. + + + + + 이 구역의 상자에는 손상된 곡괭이, 원자재, 경험치 병과 실험에 필요한 효과가 부여된 책이 있습니다. + + + + + 아이템의 이름을 바꾸면 모든 플레이어에게 표시되는 이름도 변경되며 이전 작업 비용이 영구적으로 감소됩니다. + + + + + {*B*} + 교환 인터페이스에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오.{*B*} + 교환 인터페이스에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. + + + + + 이것은 마을 사람과 교환한 내용이 표시되는 교환 인터페이스입니다. + + + + + 필요한 아이템이 없는 경우 교환은 빨간색으로 표시되며 사용할 수 없습니다. + + + + + 마을 사람이 교환하고자 하는 모든 내용이 상단에 표시됩니다. + + + + + 왼쪽에 있는 두 상자에서 교환에 필요한 아이템의 총 숫자를 볼 수 있습니다. + + + + + 마을 사람에게 주는 아이템의 양과 유형은 왼쪽의 두 상자에 표시됩니다. + + + + + 이 구역에는 마을 사람과 아이템을 구매할 수 있는 종이가 들어있는 상자가 있습니다. + + + + + 마을 사람이 제안하는 아이템을 교환하려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오. + + + + + 플레이어는 소지품에서 아이템을 꺼내 마을 사람과 교환할 수 있습니다. + + + + + {*B*} + 교환에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오.{*B*} + 교환에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. + + + + + 조합된 교환을 하는 경우 마을 사람이 이용할 수 있는 교환이 무작위로 추가되거나 업데이트됩니다. + + + + + 마을 사람은 자신의 직업에 따라 교환을 제안하는 경우가 많습니다. + + + + + 특정 교환이 빈번하게 이루어지는 경우, 일시적으로 이 교환이 제거될 수 있습니다. 하지만 마을 사람은 항상 적어도 한 가지 이상의 교환을 제안합니다. + + + + + 상자에서 종이를 꺼내 여기 있는 마을 사람과 교환을 시도해 보세요. + + + + + 이 구역에는 두 개의 Ender 상자가 있습니다. + + + + + {*B*} + Ender 상자에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오.{*B*} + Ender 상자에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. + + + + + 월드의 Ender 상자는 차원이 달라도 모두 연결되어 있습니다. Ender 상자에 넣은 아이템은 모든 Ender 상자에서 사용할 수 있습니다. + + + + + 하지만 Ender 상자의 내용물은 플레이어마다 다릅니다. + + + + + 플레이어가 아이템을 어떤 Ender 상자에 저장하든 다른 월드의 Ender 상자에서도 사용할 수 있는 것입니다. 지금 아무 Ender 상자에나 아이템을 넣고 시도해 보십시오. + + + + {*ICON_SHANK_01*}를 2만큼 회복하며 30초 동안 건강이 회복되고 5분 동안 화염 저항과 방어력이 부여됩니다. 사과와 황금 블록으로 만듭니다. + + + 순간 이동할 수 있습니다 + + + 순간 이동 + + + 플레이어에게 순간 이동 + + + 나에게 순간 이동 + + + 지치지 않게 할 수 있습니다 + + + 투명해질 수 있습니다 + + + 투명화할 수 있습니다 + + + 투명화할 수 없습니다 + + + 날 수 있습니다 + + + 날 수 없습니다 + + + 지치지 않습니다 + + + 지치게 됩니다 + + + 순간 이동할 수 있습니다 + + + 순간 이동할 수 없습니다 + + + {*T3*}플레이 방법: 모루{*ETW*}{*B*}{*B*} +경험치 레벨은 모루로 아이템을 수리하고 효과를 부여하거나 이름을 바꾸는 데 사용할 수 있습니다.{*B*} +모든 아이템의 이름을 바꿀 수 있습니다. 단, 수리나 효과가 부여된 책으로 효과를 부여하는 것은 내구성이 있는 아이템만 가능합니다.{*B*} +왼쪽에 있는 입력 슬롯에 아이템과 함께 철제 검의 철 주괴 같은 아이템의 원자재나 같은 유형의 또 다른 아이템을 넣어 수리할 수 있습니다.{*B*} +모루로 아이템을 조합하는 게 더 효율적입니다. 또한, 어느 한쪽의 아이템에 효과가 부여된 경우 입력에 따라 효과가 부여된 완성 제품이 나올 수도 있습니다.{*B*} +책의 효과부여가 적합한 경우 효과가 부여된 책은 모루에서 아이템에 효과를 부여할 수 있습니다. 던전에 있는 상자에서 효과가 부여된 책을 찾거나 효과부여대에서 일반 책에 효과를 부여할 수도 있습니다.{*B*} +사용할 때마다 모루에 손상이 갈 수도 있으며 여러 번 사용하면 파괴될 수 있습니다.{*B*} + + + {*T3*}플레이 방법: 교환{*ETW*}{*B*}{*B*} +마을 사람과 아이템을 교환할 수 있습니다. 마을 사람들은 모두 농부, 백정, 대장장이, 사서 또는 사제와 같은 직업이 있으며 직업에 따라 그들이 교환하려는 아이템이 달라질 수 있습니다.{*B*} +마을 사람이 제안하는 교환 목록은 모두 교환 메뉴에서 확인할 수 있습니다. 마을 사람은 플레이어가 교환할 때마다 교환품을 수정하거나 추가할 수 있습니다. 단, 너무 자주 이루어지는 교환은 일시적으로 사용할 수 없게 될 수 있습니다.{*B*} +보통 에메랄드를 획득하기 위해 다양한 아이템을 사고파는 교환이 많습니다.{*B*} +교환에 필요한 아이템이 없는 경우 아이템은 빨간색으로 표시됩니다.{*B*} + + + + {*T3*}플레이 방법: Ender 상자{*ETW*}{*B*}{*B*} +월드의 모든 Ender 상자는 연결되어 있습니다. Ender 상자에 넣은 아이템은 모든 Ender 상자에서 사용할 수 있습니다. 하지만 Ender 상자의 내용물은 플레이어마다 다릅니다. 플레이어가 아이템을 어떤 Ender 상자에 저장하든 다른 월드의 Ender 상자에서도 사용할 수 있는 것입니다. + + + + 농부 + + + 사서 + + + 사제 + + + 대장장이 + + + 백정 + + + 마을에 있는 마을 사람들은 자신의 직업에 따라 플레이어에게 아이템을 판매를 제안합니다. + + + 대형 상자 + + + + 효과부여대에서 효과가 부여된 책을 만들 수도 있습니다. 이 책은 후에 모루에서 아이템에 효과를 부여하는 데 사용할 수 있습니다. + + + + + 철사 덫 고리는 무언가가 고리 사이에 있는 끈을 당길 때 회로에 일정한 동력을 제공하기도 합니다. + + + + + 길이 든 늑대는 항상 목걸이를 착용합니다. 목걸이의 색상은 염색에 따라 바뀔 수 있습니다. + + + + 당근과 감자를 심어 재배할 수 있으며, 채소가 땅 위에 보이면 추수할 준비가 된 것입니다. + + + + 플레이어는 또 안장을 얹고 돼지를 탈 수 있습니다. 당근 꼬치로 돼지를 유혹해 제어할 수 있습니다. + + + + + 필요한 경우 {*CONTROLLER_ACTION_MOVE*} 을 이용해 광물 수레를 천천히 이동할 수 있습니다. 광물 수레를 동력 레일에 올려 움직일 수 있게 됩니다. + + + + 분활 화면은 고화질(HD) 모드에서만 지원되기 때문에 이 게임에 참가할 수 없습니다. 참여하고자 하는 모든 다른 플레이어가 로그아웃해야 합니다. + + + 치유 + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/ko-KR/stringsLeaderboards.xml b/Minecraft.Client/PSVitaMedia/loc/ko-KR/stringsLeaderboards.xml new file mode 100644 index 00000000..121cbbff --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/ko-KR/stringsLeaderboards.xml @@ -0,0 +1,48 @@ + + + + 처치 (쉬움) + + + 처치 (보통) + + + 처치 (어려움) + + + 블록 채굴 (낙원) + + + 블록 채굴 (쉬움) + + + 블록 채굴 (보통) + + + 블록 채굴 (어려움) + + + 농장 (낙원) + + + 농장 (쉬움) + + + 농장 (보통) + + + 농장 (어려움) + + + 이동 (낙원) + + + 이동 (쉬움) + + + 이동 (보통) + + + 이동 (어려움) + + \ 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 new file mode 100644 index 00000000..ba778ac5 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/ko-KR/stringsPlatformSpecific.xml @@ -0,0 +1,247 @@ + + + + "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 + + + NOT USED + + + {*T3*}플레이 방법 : 창작 모드{*ETW*}{*B*}{*B*} +창작 모드 인터페이스를 사용하면 게임 내의 모든 아이템을 채굴하거나 제작할 필요 없이 플레이어의 소지품으로 가져갈 수 있습니다. +플레이어의 소지품 안에 있는 아이템은 놓거나 사용해도 없어지지 않습니다. 이 모드에서는 자원을 모으기보다 건설에 집중할 수 있습니다.{*B*} +창작 모드에서 월드를 생성, 저장하거나 불러오면 해당 월드에서는 트로피를 획득할 수 없으며 순위표에 기록되지 않습니다. 이후 해당 월드를 생존 모드에서 불러와도 마찬가지입니다.{*B*} +창작 모드에서 {*CONTROLLER_ACTION_JUMP*}를 빨리 두 번 누르면 날 수 있습니다. 비행을 종료하려면 똑같은 동작을 반복하십시오. 더 빨리 날려면 {*CONTROLLER_ACTION_MOVE*}을 앞으로 빨리 두 번 누르십시오. +비행 모드에서 {*CONTROLLER_ACTION_JUMP*}를 길게 누르면 위로 올라가고 {*CONTROLLER_ACTION_SNEAK*}를 길게 누르면 아래로 내려갑니다. 또는 {*CONTROLLER_ACTION_DPAD_UP*} 를 누르면 위로 올라가고 {*CONTROLLER_ACTION_DPAD_DOWN*}를 누르면 아래로 내려갑니다. +{*CONTROLLER_ACTION_DPAD_LEFT*}를 누르면 왼쪽으로 이동하고 {*CONTROLLER_ACTION_DPAD_RIGHT*}를 누르면 오른쪽으로 이동합니다. + + + {*CONTROLLER_ACTION_JUMP*}를 앞으로 빨리 두 번 누르면 날 수 있습니다. 비행을 종료하려면 똑같은 동작을 반복하십시오. 더 빨리 날려면 {*CONTROLLER_ACTION_MOVE*}을 앞으로 빨리 두 번 누르십시오. +비행 모드에서 {*CONTROLLER_ACTION_JUMP*}를 길게 누르면 위로 올라가고{*CONTROLLER_ACTION_SNEAK*}을 길게 누르면 아래로 내려갑니다. 또는 방향키를 사용해서 상하좌우로 움직일 수도 있습니다. + + + 게이머 카드 보기 + + + + 창작 모드에서 월드를 생성, 저장하거나 불러오면 해당 월드에서는 트로피를 획득할 수 없으며 순위표에 기록되지 않습니다. 이후 해당 월드를 생존 모드에서 불러와도 마찬가지입니다. 계속하시겠습니까? + + + 이전에 창작 모드에서 저장된 월드입니다. 트로피를 획득할 수 없으며 순위표에 기록되지 않습니다. 계속하시겠습니까? + + + 게이머 프로필 확인 + + + 친구 초대 + + + 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" 연결이 끊어졌습니다. 주 메뉴로 돌아갑니다. + + + "PSN"과의 연결이 끊어졌습니다. + + + 이전에 창작 모드에서 저장된 월드입니다. 트로피를 획득할 수 없으며 순위표에 기록되지 않습니다. + + + 호스트 권한을 켜고 월드를 생성, 저장하거나 불러오면 해당 월드에서는 트로피를 획득할 수 없으며 순위표에 기록되지 않습니다. 이후 해당 옵션을 꺼도 마찬가지입니다. 계속하시겠습니까? + + + 이 Minecraft: "PlayStation Vita" Edition은 평가판입니다. 정식 버전 게임에서는 트로피를 획득할 수 있습니다. +정식 버전 게임을 구매하면 Minecraft: "PlayStation Vita" Edition의 모든 기능을 이용하고 "PSN"을 통해 전 세계의 친구들과 함께 게임을 즐길 수 있습니다. +정식 버전 게임을 구매하시겠습니까? + + + 손님 플레이어는 정식 버전을 구매할 수 없습니다. Sony Entertainment Network 계정으로 로그인하십시오. + + + 온라인 ID + + + 이 "PlayStation Vita" Edition은 평가판입니다. 정식 버전 게임에서는 테마를 받을 수 있습니다! +정식 버전 게임을 구매하면 Minecraft: "PlayStation Vita" Edition의 모든 기능을 이용하고 "PSN"을 통해 전 세계의 친구들과 함께 즐길 수 있습니다. +정식 버전 게임을 구매하시겠습니까? + + + 이 게임은 Minecraft: "PlayStation Vita" Edition 평가판입니다. 초대를 수락하려면 정식 버전 게임이 필요합니다. +정식 버전 게임을 구매하시겠습니까? + + + 저장 전송 영역에 있는 저장 데이터는 Minecraft: PlayStation(R)Vita Edition에서 아직 지원하지 않는 버전 번호를 가지고 있습니다. + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/ko-KR/stringsRichPresence.xml b/Minecraft.Client/PSVitaMedia/loc/ko-KR/stringsRichPresence.xml new file mode 100644 index 00000000..5d7eaa7a --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/ko-KR/stringsRichPresence.xml @@ -0,0 +1,66 @@ + + + + {GAME_STATE} + + + 유휴 + + + 메뉴 안 + + + 멀티 플레이 게임 중 - {GAME_STATE} + + + 멀티 플레이 게임 오프라인 - {GAME_STATE} + + + 혼자 게임 플레이 중 - {GAME_STATE} + + + 혼자 게임 오프라인 - {GAME_STATE} + + + 전망 즐기는 중! + + + 돼지 타는 중 + + + 광물 수레 타는 중 + + + 배 안 + + + 낚시 중 + + + 제작 중 + + + 대장일 중 + + + 지하로 + + + 디스크 듣는 중 + + + 지도 보는 중 + + + 효과부여 중 + + + 물약 양조 중 + + + 모루 작업 중 + + + 이웃 만나는 중 + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/la-LAS/4J_stringsGeneric.xml b/Minecraft.Client/PSVitaMedia/loc/la-LAS/4J_stringsGeneric.xml new file mode 100644 index 00000000..9afc2964 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/la-LAS/4J_stringsGeneric.xml @@ -0,0 +1,87 @@ + + + + Aceptar + + + Atrás + + + Cancelar + + + + + + No + + + Archivo dañado + + + Parece que tus datos guardados están dañados. ¿Quieres crear una nueva partida y sobrescribir el archivo dañado? + + + Sin espacio libre + + + Volver a seleccionar + + + Jugar sin guardar + + + Crear nuevo archivo guardado + + + ¿Sobrescribir archivo guardado? + + + No, no sobrescribir + + + Sobrescribir y guardar + + + Error al guardar + + + Continuar sin guardar + + + Error al cargar + + + Poner nombre al archivo guardado + + + Escribe un nombre para tu archivo guardado. + + + ¿Seguro que quieres salir de la partida? + + + Sesión cerrada + + + Seguir jugando + + + Seguir jugando sin conexión + + + Jugador invitado + + + Los jugadores invitados no pueden acceder a "PSN". + + + Guardando... + + + Guardando contenido. No apagues el aparato. + + + Desbloquear juego completo + + \ 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 new file mode 100644 index 00000000..6fae7d58 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/la-LAS/4J_stringsPlatformSpecific.xml @@ -0,0 +1,52 @@ + + + + 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 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 new file mode 100644 index 00000000..21f25de1 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/la-LAS/AdditionalStrings.xml @@ -0,0 +1,96 @@ + + + + Mostrar todos los mundos de popurrí + + + Ocultar + + + Minecraft: PlayStation®3 Edition + + + Opciones + + + Guardar caché + + + Se produjo un error de red. + + + Error de red + + + Se produjo un error de red. Saliendo al menú principal. + + + Debido a restricciones de chat, se desactivó la función online de tu cuenta Sony Entertainment Network. + + + Debido a la configuración del control paterno, se desactivó la función online de tu cuenta Sony Entertainment Network. + + + Servicio online + + + Se cerró tu sesión de "PSN". Las funciones online del juego no estarán disponibles hasta que inicies sesión en "PSN". + + + Se cerró tu sesión de "PSN". Las funciones online del juego no estarán disponibles hasta que inicies sesión en "PSN". Saliendo al menú principal. + + + Elige usuario para el jugador %d (o cancela para jugar como invitado). + + + Gratis + + + 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. + + + Trofeos desactivados + + + Los trofeos se desactivarán porque este progreso guardado pertenece a otro usuario. + + + Error crítico: no se pudieron inicializar los trofeos. Por favor, sal del juego. + + + Invitaciones + + + Archivo dañado + + + Control desconectado + + + El control está desconectado. Por favor, vuelve a conectarlo. + + + 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. + + + Invitación + + + ¡Ven a jugar una partida de Minecraft: PlayStation®Vita Edition! + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/la-LAS/EULA.xml b/Minecraft.Client/PSVitaMedia/loc/la-LAS/EULA.xml new file mode 100644 index 00000000..69219b2a --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/la-LAS/EULA.xml @@ -0,0 +1,99 @@ + + + + Minecraft: PlayStation®Vita Edition - CONDICIONES DE USO +Estas condiciones enumeran algunas normas para el uso de Minecraft: PlayStation®Vita Edition ("Minecraft"). Con el fin de proteger Minecraft y a los miembros de nuestra comunidad, necesitamos estas condiciones para establecer reglas sobre la descarga y el uso de Minecraft. Nos gustan las normas tanto como a ti, así que hemos procurado que este documento sea lo más breve posible, pero si compras, descargas, usas o juegas a Minecraft, aceptas respetar estas condiciones ("Condiciones"). + Antes de empezar, hay una cosa que queremos dejar muy clara. Minecraft es un juego que permite a los jugadores construir y destruir cosas. Si juegas con otras personas (multijugador), puedes construir con ellos o destruir lo que han construido, y ellos pueden hacer lo mismo contigo. Así pues, no juegues con otras personas si no se comportan como tú quieres. Además, a veces la gente hace cosas que no debería hacer. No nos gusta, pero no podemos hacer gran cosa para impedirlo, excepto pedirle a todo el mundo que se porte correctamente. Confiamos en ti y en el resto de la comunidad para que nos digan si alguien no se comporta como es debido. Si se da el caso, o crees que alguien está quebrantando las reglas o estas Condiciones o está usando Minecraft de un modo inapropiado, por favor, avísanos. Tenemos un sistema de avisos para eso, así que utilízalo y haremos lo que sea necesario para solucionar el problema. + Para informar de cualquier problema, envíanos un correo electrónico a support@mojang.com y danos toda la información que puedas, como los datos del usuario y los detalles de lo sucedido. + Ahora volvamos a las Condiciones: + UNA REGLA IMPORTANTE + La regla más importante es que no debes distribuir nada que hayamos hecho nosotros. Con "distribuir nada que hayamos hecho nosotros" queremos decir "regalar copias de Minecraft, usarlo con fines comerciales, ganar dinero con él o dar acceso a otras personas a Minecraft y sus partes de una forma injusta o no razonable". Así pues, la regla principal es que (a menos que lo aceptemos específicamente, como en Brand and Asset Usage Guidelines, nuestras guías de uso de marca y activos) no debes: + • dar copias de Minecraft a nadie; + • usar con fines comerciales nada de lo que hemos hecho; + • intentar ganar dinero con nada de lo que hemos hecho; o + • dar acceso a otras personas a nada de lo que hemos hecho de una forma injusta o no razonable. + Para que quede súper claro, lo que hemos hecho incluye, aunque no se limita a, el cliente y el software del servidor de Minecraft. También incluye las versiones modificadas del juego, partes de él o cualquier otra cosa que hayamos hecho nosotros. + Por lo demás, puedes hacer lo que quieras - de hecho, te animamos a que hagas cosas interesantes (ver abajo) - pero no hagas lo que te decimos que no puedes hacer. + USO DE MINECRAFT +• Compraste Minecraft para poder usarlo, tú personalmente, en tu aparato PlayStation®Vita. + • Más abajo también te damos derechos limitados a hacer otras cosas, pero tenemos que trazar una línea en algún lado o la gente puede ir demasiado lejos. Si quieres hacer algo relacionado con algo que hemos hecho nosotros, es un honor, pero asegúrate de que no se pueda interpretar como algo oficial, de que cumpla estas Condiciones, y sobre todo no uses con fines comerciales nada que hayamos hecho nosotros. + • El permiso que te damos para usar y jugar a Minecraft puede ser revocado si incumples estas Condiciones. +• Al comprar Minecraft, te damos permiso para instalar Minecraft en tu aparato PlayStation®Vita y usarlo y jugarlo en ese aparato PlayStation®Vita según se indica en estas Condiciones. Este permiso es personal para ti, así que no puedes distribuir Minecraft (o ninguna parte de él) a ninguna otra persona (excepto si te lo permitimos de forma expresa). + • Eres libre para hacer lo que quieras con imágenes y videos de Minecraft, dentro de lo razonable. Con "dentro de lo razonable" queremos decir que no puedes hacer un uso comercial de ellos ni hacer cosas injustas o que afecten negativamente a nuestros derechos. Tampoco copies elementos gráficos para distribuirlos por ahí, eso no es divertido. + • En esencia, la norma básica es no hacer uso comercial de nada que hayamos hecho nosotros, a menos que lo aceptemos específicamente, en nuestras guías de uso de marca y activos o en estas Condiciones. Ah, y si las leyes lo permiten expresamente, como en una doctrina de "uso legítimo", también está bien, pero solo hasta los límites que indique la ley. + PROPIEDAD DE MINECRAFT Y OTRAS COSAS + • Aunque te damos permiso para jugar a Minecraft, seguimos siendo sus propietarios. También somos propietarios de nuestras marcas y de todo el contenido de Minecraft, que está compuesto por nuestro software, texturas, activos, herramientas, infraestructura y otro montón de cosas ingeniosas (y no tan ingeniosas) de las que somos propietarios. Todos nuestros derechos sobre esas cosas están confirmados y reservados, pero puedes usarlas siguiendo estas Condiciones. + • Eso no significa que seamos propietarios de las cosas que crees usando Minecraft: solo tienes que aceptar que somos propietarios de cada parte de Minecraft y de Minecraft como producto y servicio y esas cosas mencionadas en la frase anterior, y también somos propietarios del copyright y demás derechos de propiedad intelectual asociados a esas cosas y los nombres y marcas asociados a Minecraft. + • Lógicamente, vas a crear tus propias cosas al usar Minecraft. No somos propietarios del material original que crees y no reclamamos ningún derecho de propiedad sobre cosas que no nos correspondan. No obstante, seremos propietarios de las cosas que sean copias (o copias sustanciales) o derivados de nuestra propiedad y nuestras creaciones (antes expuestas), pero si creas cosas originales no serán nuestras. Por ejemplo: + - un solo bloque – eso es nuestro; + - una catedral gótica atravesada por una montaña rusa – eso no es nuestro. + • Por lo tanto, cuando pagas por el uso de Minecraft, solo compras un permiso para usar el producto Minecraft según estas Condiciones. Los únicos permisos que tienes en relación con Minecraft son los permisos expuestos en estas Condiciones. + CONTENIDO + • Si pones contenido a disposición del público en o a través de Minecraft, debes darnos permiso para usar, copiar, modificar y adaptar ese contenido. Este permiso debe ser irrevocable y sin restricciones. También debes dejar que permitamos a otras personas usar tu contenido y debes permitir utilizarlo a las otras personas a quienes hayas concedido acceso a él (por ejemplo, las personas con quienes juegues partidas multijugador). + • Piénsalo detenidamente antes de poner cualquier contenido a disposición general, porque puede hacerse público y otras personas podrían utilizarlo de un modo que no te guste. + • Si vas a poner algo a disposición general en o a través de Minecraft, no debe ser ofensivo o ilegal, debe ser honrado y debe ser de tu propia creación. Los tipos de cosas que no debes poner a disposición general usando Minecraft incluyen: publicaciones que incluyan términos racistas u homófobos; publicaciones que supongan acoso o maltrato; publicaciones que puedan dañar nuestra reputación o la de terceros; publicaciones que incluyan pornografía, publicidad o creaciones o imágenes de otras personas; o publicaciones que suplanten a un moderador o intenten engañar o explotar a la gente. + • Todo el contenido que pongas a disposición general en Minecraft también debe ser de tu creación. No debes poner ningún contenido a disposición general, usando Minecraft, que infrinja los derechos de nadie. Si publicas contenido en Minecraft y alguien nos denuncia, amenaza o demanda porque el contenido infringe los derechos de esa persona, podemos considerarte responsable, y eso significa que tendrías que pagarnos por los daños que suframos como resultado. Por lo tanto, es muy importante que solo pongas a disposición general contenidos que hayas creado tú y que no lo hagas con contenidos creados por otros. + • Ten cuidado con quién juegas. Es difícil tanto para ti como para nosotros saber con seguridad si lo que la gente dice es verdad, o incluso si son quienes dicen ser. También deberías evitar dar información sobre ti mismo a través de Minecraft. + Si vas a poner contenidos ("tus contenidos") a disposición general usando Minecraft, estos deben: +- cumplir todas las normas de Sony Computer Entertainment, incluyendo el Acuerdo de usuario y los Términos de servicio de "PSN", y cualesquiera otras normas que debas aceptar para usar tu aparato PlayStation®Vita y "PSN"; + - no ser ofensivos para otras personas; + - no ser ilegales; + - ser honrados y no confundir, engañar o explotar a otras personas, ni suplantarlas; + - no infringir copyrights u otros derechos de terceros; + - no ser racistas, sexistas u homófobos; + - no suponer acoso o maltrato; + - no dañar nuestra reputación o la de terceros; + - no incluir pornografía; + - no incluir publicidad. + - No debes poner ningún contenido a disposición general usando Minecraft que infrinja los derechos de nadie. + • Eres responsable de todo el contenido que pongas a disposición general usando Minecraft. + • Al poner tu contenido a disposición general, afirmas y nos comunicas que tienes derecho a hacerlo según estas Condiciones y que podemos ejercer los derechos que nos concediste según estas Condiciones. + • Si alguien nos denuncia, amenaza o demanda por un contenido que pongas a disposición general usando Minecraft o que haya sido puesto a disposición general por alguien en o a través de Minecraft, dicho contenido puede ser eliminado, puedes ser considerado responsable y puede que tengas que compensarnos por los daños que suframos como resultado. Tu acceso a ciertos aspectos de Minecraft también podría anularse o suspenderse. + CONTENIDOS DE USUARIOS + Aquí se establecen algunas condiciones relativas a tu contenido y al contenido puesto a disposición general por otras personas, lo que denominaremos sencillamente "contenidos de usuarios". Minecraft es un servicio de entretenimiento, y por lo tanto nosotros y los titulares de nuestra licencia (como Sony Computer Entertainment) participamos en la transmisión, distribución, almacenamiento y recuperación de contenidos de usuarios sin revisión, selección o alteración del contenido. Esto significa que no revisamos los contenidos de usuarios y por lo tanto no sabemos qué ponen en circulación tú u otras personas. Incluimos estas normas en las Condiciones para que tú y otras personas las cumplan, pero no podemos saber todo lo que sucede. + Por lo tanto, toma en cuenta: + • las opiniones expresadas en contenidos de usuarios son las opiniones de sus autores o creadores individuales, no las nuestras o las de nadie relacionado con nosotros, a menos que especifiquemos lo contrario; + • no somos responsables de (y no ofrecemos garantías ni representación en relación con y rechazamos toda responsabilidad por) todos los contenidos de usuarios, incluidos comentarios, opiniones o afirmaciones expresados en ellos; + • al usar Minecraft, aceptas que no tenemos la responsabilidad de revisar el contenido de ningún contenido de usuario y que todos los contenidos de usuarios se ponen a disposición general teniendo en cuenta que no se nos exige ejercer ni ejercemos ningún control o juicio sobre ellos. + NO OBSTANTE, nosotros (o los titulares de nuestra licencia, como Sony Computer Entertainment) podemos anular, rechazar o suspender el acceso a cualquier contenido de usuario y anular o suspender tu capacidad para publicar, poner a disposición general o acceder a contenidos de usuarios, incluyendo la anulación o suspensión del acceso a Minecraft o a "PSN" si lo consideramos apropiado, porque hayas quebrantado estas Condiciones o hayamos recibido una queja. También actuaremos de forma expeditiva para anular o desactivar el acceso a contenidos de usuarios si y cuando tengamos conocimiento real de su ilegalidad. + ACTUALIZACIONES + • Puede que pongamos a tu disposición mejoras o actualizaciones de vez en cuando, pero no tenemos que hacerlo. Tampoco tenemos la obligación de ofrecer soporte o mantenimiento continuos de ningún juego. Por supuesto, esperamos seguir lanzando nuevas actualizaciones de Minecraft, pero no podemos garantizar que lo haremos. + NUESTRA RESPONSABILIDAD + • Cuando compras un ejemplar de Minecraft, te lo proporcionamos "tal cual". Las mejoras y actualizaciones también se proporcionan "tal cual". Esto significa que no hacemos ninguna promesa sobre el estándar o la calidad de Minecraft ni prometemos que no sufrirá interrupciones, que esté libre de errores o por cualquier pérdida o daño que pueda causar. Solo prometemos ofrecer Minecraft y demás servicios con habilidad y atención razonables. En la mayoría de los países, las leyes dicen que no podemos rechazar responsabilidades por muertes o daños personales causados por nuestra negligencia, así que si tu computadora se levanta y te apuñala debido a algo que hayamos hecho mal, aceptaremos nuestras culpas. + NO SOMOS RESPONSABLES POR: + • CUALQUIER USO DEBIDO O INDEBIDO DE MINECRAFT POR TU PARTE O POR PARTE DE OTRAS PERSONAS; + • CUALQUIER CONTENIDO PUESTO A DISPOSICIÓN GENERAL POR TI USANDO MINECRAFT; + • CUALQUIER INCUMPLIMIENTO DE ESTAS CONDICIONES POR TU PARTE; + • CUALQUIER INCUMPLIMIENTO DE CUALQUIER CONDICIÓN POR PARTE DE OTRAS PERSONAS. + CANCELACIÓN +• Si queremos, podemos cancelar tu derecho a usar Minecraft si incumples estas Condiciones. Tú también puedes cancelarlo en cualquier momento: solo tienes que desinstalar Minecraft de tu aparato PlayStation®Vita. En cualquier caso, los párrafos sobre "Propiedad de Minecraft", "Nuestra responsabilidad" y "Términos generales" seguirán aplicándose incluso después de la cancelación. + TÉRMINOS GENERALES + • Estas Condiciones están sujetas a los derechos legales que puedas poseer. Ninguna de estas Condiciones limita ninguno de tus derechos que no pueda excluirse legalmente, ni excluye o limita nuestra responsabilidad por muertes o daños personales resultados de nuestra negligencia, ni representaciones ilícitas. + • También podemos cambiar estas Condiciones de vez en cuando, pero esos cambios solo se harán efectivos hasta el punto que permita la ley. Por ejemplo, si solo usas Minecraft en el modo para un jugador y no usas las actualizaciones que ponemos a tu disposición, entonces se aplican las Condiciones antiguas, pero si usas las actualizaciones o usas partes de Minecraft que dependen de nuestro suministro continuado de servicios online, entonces se aplican las Condiciones nuevas. En ese caso, puede que no podamos / tengamos que comunicarte los cambios para que estos tengan efecto, así que deberías volver aquí de vez en cuando para ser consciente de los cambios en estas Condiciones. No vamos a ser injustos con este tema, pero a veces las leyes cambian o alguien hace algo que afecta a otros usuarios de Minecraft y tenemos que ponerle solución. + • Si nos haces una sugerencia sobre Minecraft o cualquiera de nuestros juegos, esa sugerencia se hace de forma gratuita. Esto significa que podemos usar tu sugerencia del modo que queramos y no tenemos que pagarte por ella. Si crees que tienes una sugerencia por la que estaríamos dispuestos a pagar, debes decirnos que esperas un pago antes de hacernos la sugerencia. + • Además de estas Condiciones, también tenemos unas guías de uso de marca y activos que puedes encontrar online. + • Si incumples estas normas, nosotros (o Sony Computer Entertainment) podemos impedir que uses Minecraft. Si no quieres o no puedes aceptar estas normas, no debes comprar, descargar, usar ni jugar a Minecraft. + Si tienes alguna duda legal que no esté respondida en esta página, no lo hagas y pregúntanos. Básicamente, no hagas tonterías y nosotros tampoco las haremos. + Somos: + Mojang AB + Maria Skolgata 83, + SE-11853 + Estocolmo + Suecia + Número de organización: 556819-2388 + + + + + Todo el contenido adquirido en la tienda del juego se comprará a Sony Network Entertainment Europe Limited ("SNEE") y estará sujeto al Acuerdo de usuario y los Términos de servicio de Sony Entertainment Network disponibles en PlayStation®Store. Por favor, revisa los derechos de uso de cada adquisición, pues pueden variar en cada artículo. A menos que se indique lo contrario, el contenido disponible en cualquier tienda de un juego tiene la misma clasificación por edades que el propio juego. + + + + + La adquisición y el uso de artículos están sujetos al Acuerdo de usuario y los Términos de servicio de "PSN". Este servicio online te ha sido ofrecido bajo licencia por Sony Computer Entertainment America. + + + + Recuerda: el uso de este software está sometido a los Términos de uso del Software recogidos en eu.playstation.com/legal. + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/la-LAS/stringsDynafont.xml b/Minecraft.Client/PSVitaMedia/loc/la-LAS/stringsDynafont.xml new file mode 100644 index 00000000..dca31ec2 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/la-LAS/stringsDynafont.xml @@ -0,0 +1,7 @@ + + + + DynaFont developed by DynaComware. + + + \ 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 new file mode 100644 index 00000000..d684468c --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/la-LAS/stringsGeneric.xml @@ -0,0 +1,7067 @@ + + + + Cambiando a juego sin conexión + + + Espera mientras el anfitrión guarda la partida. + + + Entrando en El Fin + + + Guardando jugadores + + + Conectando al anfitrión + + + Descargando terreno + + + Saliendo de El Fin + + + ¡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. + + + 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. + + + Cargando nivel + + + Finalizando... + + + Construyendo terreno + + + Simulando mundo durante un instante + + + Rango + + + Preparando para guardar nivel + + + Preparando fragmentos... + + + Inicializando servidor + + + Saliendo del Inframundo + + + Regenerando + + + Generando nivel + + + Preparando zona de generación + + + Cargando zona de generación + + + Entrando en el Inframundo + + + Herramientas y armas + + + Gamma + + + Sensibilidad del juego + + + Sensibilidad de la interfaz + + + Dificultad + + + Música + + + Sonido + + + Pacífico + + + 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. + + + Fácil + + + Normal + + + Difícil + + + Sesión cerrada + + + Armadura + + + Mecanismos + + + Transporte + + + Armas + + + Comida + + + Estructuras + + + Decoraciones + + + Elaboración de pociones + + + Herramientas, armas y armadura + + + Materiales + + + Bloques de construcción + + + Piedra rojiza y transporte + + + Varios + + + Entradas: + + + 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! + + + 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 + + + Crear nuevo mundo + + + Escribe un nombre para tu mundo. + + + Introduce la semilla para la generación del mundo. + + + Cargar mundo guardado + + + Jugar tutorial + + + Tutorial + + + Dar nombre al mundo + + + Archivo dañado + + + Aceptar + + + Cancelar + + + Tienda de Minecraft + + + Rotar + + + Ocultar + + + Vaciar todos los espacios + + + ¿Seguro que quieres salir de la partida actual y unirte a la nueva? Se perderá todo el progreso no guardado. + + + ¿Seguro que quieres sobrescribir los archivos de guardado anteriores de este mundo por su versión actual? + + + ¿Seguro que quieres salir sin guardar? ¡Perderás todo el progreso en este mundo! + + + Iniciar partida + + + Salir de la partida + + + Guardar partida + + + Salir sin guardar + + + Oprime START para unirte. + + + ¡Hurra! ¡Recibiste una imagen de jugador de Steve, de Minecraft! + + + ¡Hurra! ¡Recibiste una imagen de jugador de un creeper! + + + Desbloquear juego completo + + + No puedes unirte a esta partida porque el jugador al que quieres unirte usa una versión más reciente del juego. + + + Nuevo mundo + + + ¡Premio desbloqueado! + + + Estás jugando la versión de prueba, pero necesitarás el juego completo para guardar tu partida. +¿Quieres desbloquear el juego completo? + + + Amigos + + + Mi puntuación + + + Total + + + Espera... + + + Sin resultados + + + Filtro: + + + No puedes unirte a esta partida porque el jugador al que quieres unirte usa una versión más antigua del juego. + + + Conexión perdida + + + Se perdió la conexión con el servidor. Saliendo al menú principal. + + + Desconectado por el servidor + + + Saliendo de la partida + + + Se produjo un error. Saliendo al menú principal. + + + Error de conexión + + + Te expulsaron de la partida. + + + El anfitrión abandonó la partida. + + + No puedes unirte a esta partida porque no tienes ningún amigo en ella. + + + No puedes unirte a esta partida porque el anfitrión te ha expulsado anteriormente. + + + Te expulsaron de la partida por volar. + + + El intento de conexión tomó demasiado tiempo. + + + El servidor está lleno. + + + En este modo, el entorno genera enemigos que infligirán al jugador una cantidad de daño elevada. ¡Ten cuidado también con los creepers, ya que probablemente no cancelarán su ataque explosivo cuando te alejes de ellos! + + + Temas + + + Skin Packs + + + Permitir amigos de amigos + + + Expulsar jugador + + + ¿Seguro que quieres expulsar a este jugador de la partida? No podrá volver a unirse hasta que reinicies el mundo. + + + Packs de imágenes de jugador + + + No puedes unirte a esta partida porque está limitada a jugadores que son amigos del anfitrión. + + + Contenido descargable dañado + + + El contenido descargable está dañado y no se puede utilizar. Debes eliminarlo y volver a instalarlo desde el menú de la Tienda de Minecraft. + + + Hay contenido descargable dañado y no se puede utilizar. Debes eliminarlo y volver a instalarlo desde el menú de la Tienda de Minecraft. + + + No puedes unirte a la partida + + + Seleccionado + + + Aspecto seleccionado: + + + Conseguir versión completa + + + Desbloquear pack de textura + + + Desbloquea este pack de textura para usarlo en tu mundo. +¿Te gustaría desbloquearlo ahora? + + + Versión de prueba del pack de textura + + + Semilla + + + Desbloquear skin pack + + + Para usar la apariencia que seleccionaste tienes que desbloquear este skin pack. +¿Quieres desbloquear este skin pack ahora? + + + Estás usando una versión de prueba del pack de textura. No podrás guardar este mundo a menos que desbloquees la versión completa. +¿Te gustaría desbloquear la versión completa de este pack de textura? + + + Descargar versión completa + + + ¡Este mundo usa un pack de textura o de popurrí que no tienes! +¿Quieres instalar el pack de textura o de popurrí ahora? + + + Conseguir versión de prueba + + + Pack de textura no disponible + + + Desbloquear versión completa + + + Descargar versión de prueba + + + Se cambió el modo de juego. + + + Si está habilitado, solo los jugadores invitados pueden unirse. + + + Si está habilitado, los amigos de la gente en tu lista de amigos pueden unirse. + + + Si está habilitado, los jugadores pueden causar daño a otros jugadores. Solo afecta al modo Supervivencia. + + + Normal + + + Superplano + + + Si está habilitado, la partida será online. + + + Si está deshabilitado, los jugadores que se unan a la partida no podrán construir ni extraer sin autorización. + + + Si está habilitado, se generarán estructuras como aldeas y fortalezas en el mundo. + + + Si está habilitado, se generará un mundo completamente plano en el mundo superior y en el Inframundo. + + + Si está habilitado, se creará un cofre con objetos útiles cerca del punto de reaparición del jugador. + + + Si está habilitado, el fuego se puede propagar a los bloques inflamables cercanos. + + + Si está habilitado, la dinamita explota cuando se activa. + + + Si está habilitado, el Inframundo se regenerará. Es útil si tienes una partida guardada antigua donde no está presente la fortaleza del Inframundo. + + + No + + + Modo de juego: Creativo + + + Supervivencia + + + Creativo + + + Cambiar nombre del mundo + + + Escribe un nuevo nombre para tu mundo. + + + Modo de juego: Supervivencia + + + Creado en modo Supervivencia + + + Renombrar partida guardada + + + Autoguardando en %d... + + + + + + Creado en modo Creativo + + + Generar nubes + + + ¿Qué quieres hacer con esta partida guardada? + + + Tamaño panel (pantalla dividida) + + + Ingrediente + + + Combustible + + + Dispensador + + + Cofre + + + Encantamiento + + + Horno + + + No hay ofertas de contenido descargable de este tipo disponibles para este título en este momento. + + + ¿Seguro que quieres borrar esta partida guardada? + + + Esperando aprobación + + + Censurado + + + %s se unió a la partida. + + + %s abandonó la partida. + + + Expulsaron a %s de la partida. + + + Soporte para pociones + + + Introducir texto del cartel + + + Introduce una línea de texto para tu cartel. + + + Introducir título + + + Fin de la versión de prueba + + + Partida llena + + + No pudiste unirte a la partida y ya no quedan más espacios. + + + Introduce un título para tu publicación. + + + Introduce una descripción para tu publicación. + + + Inventario + + + Ingredientes + + + Introducir descripción + + + Introduce una descripción para tu publicación. + + + Introducir descripción + + + En reproducción: + + + ¿Seguro que quieres añadir este nivel a la lista de niveles bloqueados? +Selecciona ACEPTAR para salir de la partida. + + + Eliminar de la lista de bloqueados + + + Autoguardado cada + + + Nivel bloqueado + + + La partida a la que te estás uniendo está en la lista de niveles bloqueados. +Si decides unirte a esta partida, el nivel se eliminará de tu lista de niveles bloqueados. + + + ¿Bloquear este nivel? + + + Autoguardado: NO + + + Opacidad de la interfaz + + + Preparando autoguardado del nivel + + + Tamaño del panel de datos + + + minutos + + + ¡No se puede colocar aquí! + + + No se puede colocar lava cerca del punto de reaparición del nivel porque puede matar al instante a los jugadores que se regeneran. + + + Apariencias favoritas + + + Partida de %s + + + Partida de anfitrión desconocido + + + Un invitado cerró la sesión + + + Restablecer ajustes + + + ¿Seguro que quieres restablecer los ajustes a los valores predeterminados? + + + Error al cargar + + + Un jugador invitado cerró la sesión, lo que provocó que todos los invitados fueran excluidos de la partida. + + + Imposible crear la partida + + + Selección automática + + + Sin pack: apariencias regulares + + + Iniciar sesión + + + No has iniciado sesión. Para jugar tienes que iniciar sesión. ¿Quieres hacerlo ahora? + + + Multijugador no admitido + + + Beber + + + + En esta área se colocó una granja. Cultivar en la granja te permite crear una fuente renovable de comida y otros objetos. + + + + + {*B*} + Oprime{*CONTROLLER_VK_A*} para obtener más información sobre los cultivos.{*B*} + Oprime{*CONTROLLER_VK_B*}si ya sabes cómo funcionan los cultivos. + + + + El trigo, las calabazas y los melones se cultivan a partir de semillas. Las semillas de trigo se obtienen al romper hierba alta o al cosechar trigo, y las semillas de calabaza y melón se consiguen a partir de calabazas y melones respectivamente. + + + Oprime{*CONTROLLER_ACTION_CRAFTING*} para abrir la interfaz del inventario creativo. + + + Para continuar, cruza al otro lado de este agujero. + + + Completaste el tutorial del modo Creativo. + + + Antes de plantar semillas, debes convertir los bloques de tierra en tierra de cultivo por medio de un azadón. Una fuente cercana de agua te ayudará a mantener la tierra de cultivo hidratada y hará que los cultivos crezcan más rápido, además de mantener la zona iluminada. + + + Los cactus deben plantarse en arena y crecerán hasta tres bloques de alto. Al igual que con la caña de azúcar, si se destruye el bloque más bajo podrás recoger los bloques que estén sobre él.{*ICON*}81{*/ICON*} + + + Los champiñones deben plantarse en una zona con luz tenue y se propagarán a los bloques de luz tenue cercanos.{*ICON*}39{*/ICON*} + + + El polvo de hueso se puede usar para germinar cultivos hasta su estado de mayor crecimiento o cultivar champiñones hasta que se vuelvan gigantes.{*ICON*}351:15{*/ICON*} + + + El trigo pasa por distintas fases durante su crecimiento. Cuando parece más oscuro es que está listo para la cosecha.{*ICON*}59:7{*/ICON*} + + + Las calabazas y los melones también necesitan un bloque cerca de donde hayas plantado la semilla para que el fruto crezca cuando el tallo se haya desarrollado por completo. + + + La caña de azúcar debe plantarse en un bloque de hierba, tierra o arena que esté junto a un bloque de agua. Al cortar un bloque de caña de azúcar, todos los bloques que estén sobre él caerán.{*ICON*}83{*/ICON*} + + + En el modo Creativo posees un número infinito de todos los objetos y bloques disponibles, puedes destruir bloques con un clic y sin herramientas, eres invulnerable y puedes volar. + + + + En el cofre de esta área encontrarás componentes para fabricar circuitos con pistones. Prueba a usar o completar los circuitos de esta área o coloca los tuyos propios. Fuera del área de tutorial encontrarás más ejemplos. + + + + + ¡En esta área hay un portal del Inframundo! + + + + + {*B*} + Oprime{*CONTROLLER_VK_A*} para obtener más información sobre los portales y el Inframundo.{*B*} + Oprime{*CONTROLLER_VK_B*} si ya sabes cómo funcionan los portales y el Inframundo. + + + + + El polvo de piedra rojiza se consigue al extraer mineral de piedra rojiza con un pico hecho de hierro, diamante u oro. Puedes usarlo para suministrar energía a un máximo de 15 bloques, y se puede desplazar hacia arriba o hacia abajo a un bloque de altura. + {*ICON*}331{*/ICON*} + + + + + Los repetidores de piedra rojiza se usan para ampliar la distancia a la que se puede transportar la energía o para colocar un retardo en un circuito. + {*ICON*}356{*/ICON*} + + + + + Al recibir energía, los pistones se extienden y empujan hasta 12 bloques. Cuando se repliegan, los pistones adhesivos pueden tirar de bloques de casi cualquier tipo. + {*ICON*}33{*/ICON*} + + + + + Los portales se crean colocando obsidiana en una estructura de cuatro bloques de ancho y cinco de alto. No se necesitan bloques de esquina. + + + + + El Inframundo sirve para desplazarte con rapidez por el mundo superior. Una distancia de un bloque en el Inframundo equivale a desplazarte tres bloques en el mundo superior. + + + + + Ahora estás en el modo Creativo. + + + + + {*B*} + Oprime{*CONTROLLER_VK_A*} para obtener más información sobre el modo Creativo.{*B*} + Oprime{*CONTROLLER_VK_B*}si ya sabes cómo funciona el modo Creativo. + + + + + Para activar el portal del Inframundo, prende fuego a los bloques de obsidiana del interior de la estructura con un encendedor de pedernal. Los portales se pueden desactivar si se rompe la estructura, si se produce una explosión cerca o si fluye un líquido a través de ellos. + + + + + Para usar un portal del Inframundo, colócate en su interior. La pantalla se pondrá púrpura y se reproducirá un sonido. Al cabo de unos segundos, te transportarás a otra dimensión. + + + + + El Inframundo es un lugar peligroso, repleto de lava, pero puede ser útil para recoger bloques del Inframundo, que arden para siempre una vez que se encienden, y piedra brillante, que genera luz. + + + + Completaste el tutorial de los cultivos. + + + Cada herramienta funciona mejor con distintos materiales. Deberías usar un hacha para cortar troncos de árboles. + + + Cada herramienta funciona mejor con distintos materiales. Deberías usar un pico para extraer piedra y mineral. Quizá debas fabricar tu pico con mejores materiales para obtener recursos de algunos bloques. + + + Hay herramientas que son mejores para atacar a determinados enemigos. Plantéate usar una espada para atacar. + + + Los golems de hierro aparecen en las aldeas para protegerlas y te atacarán si atacas a los aldeanos. + + + No puedes salir de esta área hasta que completes el tutorial. + + + Cada herramienta funciona mejor con distintos materiales. Deberías usar una pala para extraer materiales blandos, como tierra y arena. + + + Consejo: mantén oprimido {*CONTROLLER_ACTION_ACTION*}para extraer y cortar a mano o con el objeto que sostengas. Quizá tengas que crear una herramienta para extraer algunos bloques... + + + En el cofre que está junto al río hay un bote. Para usarlo, apunta al agua con el cursor y oprime{*CONTROLLER_ACTION_USE*}. Usa{*CONTROLLER_ACTION_USE*} mientras apuntas al bote para subir a él. + + + En el cofre que está junto al estanque hay una caña de pescar. Toma la caña del cofre y selecciónala para llevarla en la mano y usarla. + + + ¡Este mecanismo de pistones más avanzado crea un puente autorreparable! Oprime el botón para activarlo e investiga la forma en que los componentes interaccionan para averiguar su funcionamiento. + + + La herramienta que usas está dañada. Cada vez que utilizas una herramienta, se desgasta y, con el tiempo, acabará rompiéndose. La barra de colores ubicada debajo del objeto en el inventario muestra el estado de daños actual. + + + Mantén oprimido{*CONTROLLER_ACTION_JUMP*} para nadar. + + + En esta área hay una vagoneta en una vía. Para subir a una vagoneta, apunta con el cursor hacia ella y oprime{*CONTROLLER_ACTION_USE*}. Usa{*CONTROLLER_ACTION_USE*} sobre el botón para que la vagoneta se mueva. + + + Los golems de hierro se crean con cuatro bloques de hierro colocados como muestra el modelo y con una calabaza encima del bloque central. Estos golems atacan a tus enemigos. + + + Si alimentas con trigo a las vacas, champivacas u ovejas; con zanahorias a los cerdos; con semillas de trigo o verrugas del Inframundo a las gallinas, o con cualquier tipo de carne a los lobos, estos animales empezarán a buscar a otros animales de la misma especie que también estén en el modo Amor. + + + Cuando dos animales de la misma especie se encuentran, y ambos están en el modo Amor, se besarán durante unos segundos y luego aparecerá una cría. La cría seguirá a sus padres durante un tiempo antes de convertirse en un animal adulto. + + + Después de estar en el modo Amor, los animales no podrán volver a él durante cinco minutos como mínimo. + + + + En esta área se guardaron animales en corrales. Puedes hacer que los animales se reproduzcan para obtener crías idénticas a ellos. + + + + + {*B*} + Oprime{*CONTROLLER_VK_A*} para obtener más información sobre reproducción de animales y cría.{*B*} + Oprime{*CONTROLLER_VK_B*} si ya sabes acerca de reproducción de animales y cría. + + + + Para que los animales se reproduzcan, tendrás que alimentarlos con la comida adecuada para que entren en el modo Amor. + + + Algunos animales te seguirán si tienes su comida en la mano. Así te será más fácil agrupar animales para hacer que se reproduzcan.{*ICON*}296{*/ICON*} + + + + {*B*} + Oprime{*CONTROLLER_VK_A*} para obtener más información sobre los golems.{*B*} + Oprime{*CONTROLLER_VK_B*} si ya sabes cómo funcionan los golems. + + + + Los golems se crean colocando una calabaza encima de un montón de bloques. + + + Los golems de nieve se crean con dos bloques de nieve, uno sobre el otro, y encima una calabaza. Estos golems lanzan bolas de nieve a tus enemigos. + + + + Puedes domesticar a los lobos salvajes con huesos. Una vez domesticados, aparecerán corazones sobre ellos. Los lobos domesticados seguirán al jugador y lo defenderán a menos les ordenen sentarse. + + + + Completaste el tutorial de reproducción de animales y cría. + + + + En esta zona hay algunas calabazas y bloques para crear un golem de nieve y otro de hierro. + + + + + La posición y dirección en que colocas la fuente de energía puede cambiar la forma en que afecta a los bloques que la rodean. Por ejemplo, una antorcha de piedra rojiza en un lado de un bloque se puede desactivar si el bloque recibe energía de otra fuente. + + + + + Si un caldero se vacía, puedes rellenarlo con un cubo de agua. + + + + + Usa el soporte para pociones para crear una poción de resistencia al fuego. Necesitarás una botella de agua, una verruga del Inframundo y crema de magma. + + + + + 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. + + + + + 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*} + Oprime{*CONTROLLER_VK_A*} para obtener más información sobre la interfaz de encantamientos.{*B*} + Oprime{*CONTROLLER_VK_B*} si ya sabes cómo utilizar la interfaz de encantamientos. + + + + + En esta zona hay un soporte para pociones, un caldero y un cofre lleno de objetos para elaborar pociones. + + + + + El carbón se puede usar como combustible y convertirse en una antorcha con un palo. + + + + + Si colocas arena en el espacio de ingredientes podrás crear cristal. Crea bloques de cristal para usarlos a modo de ventana en el refugio. + + + + + Esta es la interfaz de elaboración de pociones. Se puede usar para crear pociones con efectos diversos. + + + + + Muchos objetos de madera se pueden usar como combustible, pero no todos arden la misma cantidad de tiempo. También descubrirás otros objetos en el mundo que funcionan como combustible. + + + + + Después de fundir los objetos puedes trasladarlos de la zona de producción a tu inventario. Experimenta con distintos ingredientes para comprobar lo que puedes crear. + + + + + Si usas la madera como ingrediente podrás crear carbón. Coloca combustible en el horno y la madera en el espacio de ingredientes. Puede que el horno tarde un tiempo en crear el carbón, así que puedes aprovechar para hacer alguna otra cosa y volver más tarde a comprobar el progreso. + + + + {*B*} + Oprime{*CONTROLLER_VK_A*} para continuar.{*B*} + Oprime{*CONTROLLER_VK_B*} si ya sabes cómo usar el soporte para pociones. + + + + + Si añades ojo de araña fermentado, la poción se corromperá y podría convertirse en otra con el efecto contrario, y si añades pólvora, la convertirás en una poción de salpicadura, que se puede lanzar para aplicar su efecto sobre un área cercana. + + + + + Para crear una poción de resistencia al fuego, primero añade una verruga del Inframundo a una botella de agua y luego añade crema de magma. + + + + + Oprime{*CONTROLLER_VK_B*} ahora para salir de la interfaz de elaboración de pociones. + + + + + Para elaborar pociones, coloca un ingrediente en la parte superior y una botella de agua o una poción en los espacios inferiores (se pueden elaborar hasta 3 a la vez). Cuando se introduce una combinación válida, comienza la elaboración y, al cabo de poco tiempo, se creará una poción. + + + + + Todas las pociones se empiezan con una botella de agua. La mayoría de pociones se crean usando primero una verruga del Inframundo para crear una poción rara, y requieren como mínimo un ingrediente más para obtener la poción final. + + + + + Una vez que tengas una poción, podrás modificar sus efectos. Si añades polvo de piedra rojiza, aumentas la duración del efecto, y si añades polvo de piedra brillante, su efecto será más potente. + + + + + Selecciona un encantamiento y oprime{*CONTROLLER_VK_A*} para encantar el objeto. Se reducirá el nivel de experiencia en función del costo del encantamiento. + + + + + Oprime{*CONTROLLER_ACTION_USE*} para lanzar la caña y empezar a pescar. +Oprime{*CONTROLLER_ACTION_USE*} de nuevo para recoger el sedal. + {*FishingRodIcon*} + + + + + Si esperas a que el corcho se hunda por debajo de la superficie del agua antes de recoger, podrás pescar un pez. Los peces se pueden comer crudos o cocinados en un horno para recuperar la salud. + {*FishIcon*} + + + + + Al igual que muchas otras herramientas, la caña tiene distintos usos, los cuales no se limitan a pescar peces. Puedes experimentar con ella e investigar qué se puede pescar o activar... + {*FishingRodIcon*} + + + + + Los botes te permiten viajar más deprisa por el agua. Usa{*CONTROLLER_ACTION_MOVE*} y{*CONTROLLER_ACTION_LOOK*} para dirigirlo. + {*BoatIcon*} + + + + + Ahora usas una caña de pescar. Oprime{*CONTROLLER_ACTION_USE*} para utilizarla.{*FishingRodIcon*} + + + + + {*B*} + Oprime{*CONTROLLER_VK_A*} para obtener más información sobre la pesca.{*B*} + Oprime{*CONTROLLER_VK_B*} si ya sabes cómo pescar. + + + + + Esto es una cama. Oprime{*CONTROLLER_ACTION_USE*} y apunta hacia ella de noche para dormir y despertar por la mañana.{*ICON*}355{*/ICON*} + + + + + En esta área hallarás circuitos sencillos de pistones y piedra rojiza, así como un cofre con más objetos para ampliar estos circuitos. + + + + + {*B*} + Oprime{*CONTROLLER_VK_A*} para obtener más información sobre los circuitos de piedra rojiza y de pistones.{*B*} + Oprime{*CONTROLLER_VK_B*} si ya sabes cómo funcionan los circuitos de piedra rojiza y de pistones. + + + + + 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*} + Oprime{*CONTROLLER_VK_A*} para obtener más información sobre las camas.{*B*} + Oprime{*CONTROLLER_VK_B*} si ya sabes cómo funcionan las camas. + + + + + 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 en cama al mismo tiempo para poder dormir. + {*ICON*}355{*/ICON*} + + + + + {*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. + + + + + 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. + + + + + 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. + + + + + 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 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*} + + + + + 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. + + + + 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. + + + + ¡Felicidades! Completaste el tutorial. El tiempo del juego transcurre ahora a velocidad normal, ¡y no falta mucho para la noche y para que salgan los monstruos! ¡Acaba el refugio! + + + + {*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*}Oprime{*CONTROLLER_VK_A*} para jugar el tutorial de forma normal.{*B*} + Oprime{*CONTROLLER_VK_B*} para omitir el tutorial principal. + + + + {*B*} + Oprime{*CONTROLLER_VK_A*} para obtener más información sobre la barra de comida y cómo comer.{*B*} + Oprime{*CONTROLLER_VK_B*} si ya sabes cómo funciona la barra de comida y cómo comer. + + + + Seleccionar + + + Usar + + + 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. + + + + Tomar + + + 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 + + + Tomar todo + + + Tomar la mitad + + + Colocar + + + Soltar todo + + + Borrar selección rápida + + + ¿Qué es esto? + + + Compartir en Facebook + + + Soltar uno + + + Cambiar + + + Movimiento rápido + + + Skin Packs + + + Panel de vitral rojo + + + Panel de vitral verde + + + Panel de vitral café + + + Vitral blanco + + + Panel de vitral + + + Panel de vitral negro + + + Panel de vitral azul + + + Panel de vitral gris + + + Panel de vitral rosa + + + Panel de vitral lima + + + Panel de vitral púrpura + + + Panel de vitral cian + + + Panel de vitral gris claro + + + Vitral naranja + + + Vitral azul + + + Vitral púrpura + + + Vitral cian + + + Vitral rojo + + + Vitral verde + + + Vitral café + + + Vitral gris claro + + + Vitral amarillo + + + Vitral azul claro + + + Vitral magenta + + + Vitral gris + + + Vitral rosa + + + Vitral lima + + + Panel de vitral amarillo + + + Gris claro + + + Gris + + + Rosa + + + Azul + + + Púrpura + + + Cian + + + Lima + + + Naranja + + + Blanco + + + Personalizado + + + Amarillo + + + Azul claro + + + Magenta + + + Café + + + Panel de vitral blanco + + + Bola pequeña + + + Bola grande + + + Panel de vitral azul claro + + + Panel de vitral magenta + + + Panel de vitral naranja + + + Forma de estrella + + + Negro + + + Rojo + + + Verde + + + Forma de creeper + + + Explosión + + + Forma desconocida + + + Vitral negro + + + Barda de hierro + + + 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 + + + + 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. + + + +{*C2*}Ahora, respira. Vuelve a respirar. Siente el aire en los pulmones. Permite que tus extremidades regresen. Sí, mueve los dedos. Vuelve a tener un cuerpo sometido a la gravedad, en el aire. Vuelve a generarte en el sueño largo. Ahí estás. Todo tu cuerpo vuelve a tocar el universo, como si fueran cosas distintas. Como si fuéramos cosas distintas.{*EF*}{*B*}{*B*} +{*C3*}¿Quiénes somos? Nos llamaban los espíritus de la montaña. Padre Sol, madre Luna. Espíritus ancestrales, espíritus animales. Genios. Fantasmas. Los hombrecitos verdes. Después dioses, demonios. Ángeles. Fenómenos paranormales. Alienígenas, extraterrestres. Leptones, quarks. Las palabras cambian. Nosotros no.{*EF*}{*B*}{*B*} +{*C2*}Somos el universo. Somos todo lo que piensas que no eres tú. Nos estás mirando a través de tu piel y tus ojos. ¿Y por qué toca el universo tu piel y te ilumina? Para verte, jugador. Para conocerte. Y para que nos conozcas. Te contaré una historia.{*EF*}{*B*}{*B*} +{*C2*}Érase una vez un jugador.{*EF*}{*B*}{*B*} +{*C3*}El jugador eras tú, {*PLAYER*}.{*EF*}{*B*}{*B*} +{*C2*}A veces, el jugador se consideraba un ser humano, en la fina corteza de una esfera de roca derretida. La esfera de roca derretida giraba alrededor de una esfera de gas ardiente que era trescientas treinta mil veces mayor que ella. Estaban tan separadas que la luz tardaba ocho minutos en llegar de una a otra. La luz era información de una estrella y podía quemar la piel a cincuenta millones de kilómetros de distancia.{*EF*}{*B*}{*B*} +{*C2*}A veces, el jugador soñaba que era un minero, sobre la superficie de un mundo plano e infinito. El sol era un cuadrado blanco. Los días eran cortos; había mucho que hacer y la muerte no era más que un inconveniente temporal.{*EF*}{*B*}{*B*} +{*C3*}A veces, el jugador soñaba que estaba perdido en una historia.{*EF*}{*B*}{*B*} +{*C2*}A veces, el jugador soñaba que era otras cosas, en otros lugares. A veces, esos sueños eran perturbadores. A veces, realmente bellos. A veces, el jugador se despertaba de un sueño en otro, y después de ese en un tercero.{*EF*}{*B*}{*B*} +{*C3*}A veces, el jugador soñaba que veía palabras en una pantalla.{*EF*}{*B*}{*B*} +{*C2*}Retrocedamos.{*EF*}{*B*}{*B*} +{*C2*}Los átomos del jugador estaban esparcidos en la hierba, en los ríos, en el aire, en la tierra. Una mujer recogió los átomos, bebió, comió y respiró; y la mujer ensambló al jugador en su cuerpo.{*EF*}{*B*}{*B*} +{*C2*}Y el jugador despertó del mundo oscuro y cálido del cuerpo de su madre en el sueño largo.{*EF*}{*B*}{*B*} +{*C2*}Y el jugador fue una nueva historia, nunca antes contada, escrita con ADN. Y el jugador era un nuevo programa, que nunca se había ejecutado, generado por un código fuente con un billón de años. Y el jugador era un nuevo ser humano, que nunca había vivido antes, hecho tan solo de leche y amor.{*EF*}{*B*}{*B*} +{*C3*}Tú eres el jugador. La historia. El programa. El humano. Hecho tan solo de leche y amor.{*EF*}{*B*}{*B*} +{*C2*}Retrocedamos más.{*EF*}{*B*}{*B*} +{*C2*}Los siete billones de billones de billones de átomos del jugador se crearon, mucho antes de este juego, en el corazón de una estrella. Así que el jugador también es información de una estrella. Y el jugador se mueve a través de una historia que es un bosque de información colocada por un tipo llamado Julian, en un mundo infinito y plano creado por un hombre llamado Markus que existe en un mundo pequeño y privado creado por el jugador que habita un universo creado por...{*EF*}{*B*}{*B*} +{*C3*}Shhh. A veces, el jugador creaba un mundo pequeño y privado que era suave, cálido y sencillo. A veces, frío, duro y complicado. A veces, creaba un modelo del universo en su cabeza; motas de energía moviéndose a través de vastos espacios vacíos. A veces llamaba a esas motas "electrones" y "protones".{*EF*}{*B*}{*B*} + + + + +{*C2*}A veces, las llamaba "planetas" y "estrellas".{*EF*}{*B*}{*B*} +{*C2*}A veces, creía que estaba en un universo hecho de energía que estaba compuesto de encendidos y apagados, de ceros y unos, de líneas de código. A veces, creía que jugaba a un juego. A veces, creía que leía palabras en una pantalla.{*EF*}{*B*}{*B*} +{*C3*}Tú eres el jugador, que lee palabras...{*EF*}{*B*}{*B*} +{*C2*}Shhh... A veces, el jugador leía líneas de código en una pantalla. Las decodificaba en palabras, decodificaba las palabras en significados; decodificaba los significados en sentimientos, teorías, ideas... y el jugador comenzó a respirar cada vez más deprisa y más profundamente cuando se dio cuenta de que estaba vivo, estaba vivo, esas miles de muertes no habían sido reales, el jugador estaba vivo.{*EF*}{*B*}{*B*} +{*C3*}Tú. Tú. Tú estás vivo.{*EF*}{*B*}{*B*} +{*C2*}Y, a veces, el jugador creía que el universo le había hablado a través de la luz del sol del verano que se colaba entre las hojas al viento.{*EF*}{*B*}{*B*} +{*C3*}Y, a veces, el jugador creía que el universo le había hablado a través de la luz que llegaba del frío cielo nocturno del invierno, donde una mota de luz en el rabillo del ojo del jugador podía ser una estrella un millón de veces más grande que el sol, quemando sus planetas, convirtiéndolos en plasma, para que el jugador pudiera verla un instante desde el otro extremo del universo mientras volvía a su casa, mientras olía comida de pronto, casi en su puerta, a punto de volver a soñar.{*EF*}{*B*}{*B*} +{*C2*}Y, a veces, el jugador creía que el universo le había hablado a través de los ceros y los unos, a través de la electricidad del mundo, a través de las palabras deslizándose por una pantalla al final de un sueño.{*EF*}{*B*}{*B*} +{*C3*}Y el universo le decía "te quiero".{*EF*}{*B*}{*B*} +{*C2*}Y el universo le decía "jugaste bien".{*EF*}{*B*}{*B*} +{*C3*}Y el universo le decía "lo que necesitas está en tu interior".{*EF*}{*B*}{*B*} +{*C2*}Y el universo le decía "eres más fuerte de lo que crees".{*EF*}{*B*}{*B*} +{*C3*}Y el universo le decía "eres la luz del día".{*EF*}{*B*}{*B*} +{*C2*}Y el universo le decía "eres la noche".{*EF*}{*B*}{*B*} +{*C3*}Y el universo le decía "tu lucha está en tu interior".{*EF*}{*B*}{*B*} +{*C2*}Y el universo le decía "la luz que buscas está en tu interior".{*EF*}{*B*}{*B*} +{*C3*}Y el universo le decía "no estás solo".{*EF*}{*B*}{*B*} +{*C2*}Y el universo le decía "no estás separado del resto de las cosas".{*EF*}{*B*}{*B*} +{*C3*}Y el universo le decía "eres el universo probándose a sí mismo, hablando consigo mismo, leyendo su propio código".{*EF*}{*B*}{*B*} +{*C2*}Y el universo le decía "te quiero porque eres amor".{*EF*}{*B*}{*B*} +{*C3*}Y el juego había acabado y el jugador se despertó del sueño. Y el jugador comenzó un nuevo sueño. Y el jugador volvió a soñar y soñó mejor. Y el jugador era el universo. Y el jugador era amor.{*EF*}{*B*}{*B*} +{*C3*}Tú eres el jugador.{*EF*}{*B*}{*B*} +{*C2*}Despierta.{*EF*} + + + + 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 + + + No restablecer Inframundo + + + No se puede esquilar esta champivaca en este momento. Se alcanzó la cantidad máxima de cerdos, ovejas, vacas, gatos y caballos. + + + ¡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 + + + 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 + + + Balizas + + + {*T3*}CÓMO SE JUEGA: BALIZAS{*ETW*}{*B*}{*B*} +Las balizas activas proyectan un rayo de luz hacia el cielo y conceden poderes a los jugadores cercanos.{*B*} +Se crean con cristal, obsidiana y estrellas del Inframundo, que se obtienen derrotando a los Wither.{*B*}{*B*} +Se deben colocar las balizas de forma que reciban la luz del sol durante el día. Se deben colocar en pirámides de hierro, oro o diamante.{*B*} +El material sobre el que se coloca la baliza no afecta a su poder.{*B*}{*B*} +Puedes seleccionar un poder principal para tu baliza en el menú de la baliza. Cuantos más niveles tenga tu pirámide, más poderes tendrás para elegir.{*B*} +Una baliza en una pirámide que tenga al menos cuatro niveles ofrece la opción del poder secundario Regeneración o de un poder principal más potente.{*B*}{*B*} +Para elegir los poderes de tu baliza debes sacrificar un lingote de hierro u oro, una esmeralda o un diamante en el espacio de pago.{*B*} +Una vez elegidos, los poderes emanarán de la baliza indefinidamente.{*B*} + + + + Fuegos artificiales + + + Idiomas + + + Caballos + + + {*T3*}CÓMO SE JUEGA: CABALLOS{*ETW*}{*B*}{*B*} +Los caballos y los burros suelen encontrarse en llanuras despejadas. Las mulas son las crías de un burro y un caballo, pero no son fértiles.{*B*} +Se pueden montar todos los caballos, burros y mulas adultos. Sin embargo, solo se puede poner armadura a los caballos y solo se puede equipar con alforjas para transportar objetos a las mulas y los burros.{*B*}{*B*} +Se debe domar a los caballos, los burros y las mulas antes de usarlos. Los caballos se doman intentando montarlos y logrando mantenerse sobre ellos cuando intenten tirar al jinete.{*B*} +Cuando aparezcan corazones sobre un caballo significará que está domado y ya no intentará tirar al jinete. Para dirigir a un caballo, el jugador debe equiparlo con una silla de montar.{*B*}{*B*} +Se pueden comprar sillas de montar a los aldeanos o encontrar en el interior de cofres ocultos por el mundo.{*B*} +Se pueden dar alforjas a los burros y las mulas domados acoplando un cofre. Se puede acceder a estas alforjas mientras se monta al animal o con sigilo.{*B*}{*B*} +Se pueden criar caballos y burros (pero no mulas) igual que a los demás animales, con manzanas de oro o zanahorias de oro.{*B*} +Con el tiempo, los potros crecerán hasta convertirse en caballos adultos, pero el proceso se acelerará si se alimentan con trigo o paja.{*B*} + + + + {*T3*}CÓMO SE JUEGA: FUEGOS ARTIFICIALES{*ETW*}{*B*}{*B*} +Los fuegos artificiales son objetos decorativos que puedes lanzar con la mano o mediante dispensadores. Se fabrican con papel, pólvora y, opcionalmente, unas cuantas estrellas de fuegos artificiales.{*B*} +Añade ingredientes adicionales durante la fabricación para personalizar el color, fundido, forma, tamaño y efectos (como parpadeos y rastros) de las estrellas de fuegos artificiales.{*B*}{*B*} +Para fabricar fuegos artificiales, coloca la pólvora y el papel en la cuadrícula de creación 3x3 ubicada en la parte superior del inventario.{*B*} +Si lo deseas, puedes colocar varias estrellas de fuegos artificiales a la cuadrícula de fabricación para añadirlas a los fuegos artificiales.{*B*} +Si rellenas más espacios en la cuadrícula de fabricación con pólvora, aumentará la altura desde la que estallarán las estrellas de fuegos artificiales.{*B*}{*B*} +Finalmente, puedes sacar los fuegos artificiales fabricados en el espacio de producción.{*B*}{*B*} +Las estrellas de fuegos artificiales pueden fabricarse colocando pólvora y tinte en la cuadrícula de fabricación.{*B*} +- El tinte establecerá el color de la explosión de la estrella de fuegos artificiales.{*B*} +- La forma de la estrella de fuegos artificiales se determina al añadir una descarga de fuego, pepita de oro, pluma o cabeza de enemigo.{*B*} +- Puedes añadir un rastro o parpadeo con diamantes o polvo de piedra brillante.{*B*}{*B*} +Una vez fabricada la estrella de fuegos artificiales, puedes establecer el color del fundido al fabricarla con tinte. + + + + {*T3*}CÓMO SE JUEGA: SOLTADORES{*ETW*}{*B*}{*B*} +Los soltadores, cuando se activan con una piedra rojiza, arrojarán al suelo un único objeto al azar que contengan. Usa {*CONTROLLER_ACTION_USE*} para abrir el soltador. Luego, podrás cargar el soltador con objetos de tu inventario.{*B*} +Si el soltador está colocado frente a un cofre u otro tipo de contenedor, el objeto aparecerá ahí en su lugar. Es posible construir largas cadenas de soltadores para transportar objetos a una distancia, pero para eso, deberán ser activados y desactivados alternativamente. + + + + Al usarse, se convierte en un mapa con la ubicación del mundo en la que te encuentras. Va rellenándose a medida que exploras. + + + Lo sueltan los Wither, se usan para crear balizas. + + + Tolvas + + + {*T3*}CÓMO SE JUEGA: TOLVAS{*ETW*}{*B*}{*B*} +Las tolvas se utilizan para insertar o quitar objetos de contenedores y para recoger automáticamente los objetos que se arrojen dentro de ellas.{*B*} +Afectan a soportes para pociones, cofres, dispensadores, soltadores, vagonetas con cofres, vagonetas con tolvas, así como a otras tolvas.{*B*}{*B*} +Las tolvas intentarán absorber objetos continuamente del contenedor adecuado que se coloque sobre ellas. También intentarán insertar los objetos almacenados en un contenedor de salida.{*B*} +Sin embargo, si una tolva dispone de energía de piedra rojiza se volverá inactiva y dejará de absorber e insertar objetos.{*B*}{*B*} +Las tolvas apuntan en la dirección hacia la que querrán arrojar los objetos. Para que una tolva apunte a un bloque concreto, colócala mirando al bloque con sigilo.{*B*} + + + + Soltadores + + + NO SE USA + + + Salud instantánea + + + Daño instantáneo + + + Impulso en salto + + + Cansancio de extracción + + + Fuerza + + + Debilidad + + + Náuseas + + + NO SE USA + + + NO SE USA + + + NO SE USA + + + Regeneración + + + Resistencia + + + Buscar semillas para el generador de mundos + + + 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. + + + Un tipo de vía que puede habilitar o inhabilitar las vagonetas con tolvas y activar las vagonetas con dinamita. + + + Sirve para contener y soltar objetos o para meter objetos en otro contenedor cuando recibe una descarga de piedra rojiza. + + + Bloques coloridos que se crean tiñendo arcilla endurecida. + + + 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 + + + Hambre + + + de lentitud + + + de celeridad + + + Invisibilidad + + + Respiración acuática + + + Visión nocturna + + + Ceguera + + + de daño + + + de curación + + + de náuseas + + + de regeneración + + + de torpeza + + + de rapidez + + + de debilidad + + + de fortaleza + + + Resistente al fuego + + + Saturación + + + de resistencia + + + de salto + + + Poción + + + Refuerzo de salud + + + Absorción + + + + + + II + + + 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 + + + mundana + + + aburrida + + + enérgica + + + cordial + + + encantadora + + + elegante + + + sofisticada + + + resplandeciente + + + 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 + + + Aporrear + + + Agudeza + + + Reduce la salud de los jugadores, animales y monstruos afectados con el paso del tiempo. + + + Daño del ataque + + + Derribar + + + Maldición de los Artrópodos + + + Velocidad + + + Refuerzos zombi + + + Potencia de salto de caballo + + + Al aplicarse: + + + Resistencia al derribo + + + Alcance de seguimiento de enemigos + + + Salud máxima + + + Toque sedoso + + + Eficacia + + + Afinidad acuática + + + Fortuna + + + Saqueo + + + Irrompible + + + Protección contra el fuego + + + Protección + + + Apariencia ígnea + + + Caída de pluma + + + Respiración + + + Protección contra proyectiles + + + Protección contra explosiones + + + IV + + + V + + + VI + + + Puñetazo + + + VII + + + III + + + Flama + + + Poder + + + Infinidad + + + II + + + I + + + Se activa cuando una entidad pasa a través de un cable trampa conectado. + + + Activa un gancho de cable trampa conectado si una entidad pasa a través de él. + + + Una forma compacta de almacenar esmeraldas. + + + Parecido a un cofre, pero los objetos colocados dentro de un cofre de Ender están disponibles en todos los cofres de Ender del jugador, incluso en dimensiones diferentes. + + + IX + + + VIII + + + Se puede extraer con un pico de hierro o un objeto mejor para obtener esmeraldas. + + + 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. + + + 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*}. Si la comes, puedes envenenarte. + + + Se usa para controlar a un cerdo ensillado cuando se cabalga sobre él. + + + Restablece 3{*ICON_SHANK_01*}. Se crea cocinando una papa en un horno. + + + Restablece 3{*ICON_SHANK_01*}. Se fabrica con una zanahoria y pepitas de oro. + + + Se usa con un yunque para encantar armas, herramientas o armaduras. + + + Se fabrica extrayendo mineral de cuarzo del Inframundo. Se puede convertir en un bloque de cuarzo. + + + Papa + + + Papa cocida + + + Zanahoria + + + Se fabrica con lana. Se usa como un elemento decorativo. + + + Esmeralda + + + Maceta + + + Tarta de calabaza + + + Libro encantado + + + Papa venenosa + + + Zanahoria de oro + + + Palo con zanahoria + + + Gancho de cable trampa + + + Cable trampa + + + Cuarzo del Inframundo + + + Mineral de esmeralda + + + Cofre de Ender + + + Muro de guijarros musgoso + + + Bloque de esmeralda + + + Muro de guijarros + + + Papas + + + Maceta + + + Zanahorias + + + Yunque algo dañado + + + Yunque + + + Yunque + + + Bloque de cuarzo + + + Yunque muy dañado + + + Mineral de cuarzo del Inframundo + + + Escaleras de cuarzo + + + B. de cuarzo cincelado + + + B. de columna de cuarzo + + + Alfombra roja + + + Alfombra + + + Alfombra negra + + + Alfombra azul + + + Alfombra verde + + + Alfombra marrón + + + Alfombra púrpura + + + Alfombra cian + + + Alfombra gris claro + + + Alfombra gris + + + Alfombra limón + + + Alfombra rosa + + + Alfombra azul claro + + + Alfombra amarilla + + + Alfombra magenta + + + Alfombra naranja + + + Alfombra blanca + + + Arenisca cincelada + + + {*PLAYER*} murió intentando dañar a {*SOURCE*}. + + + Arenisca suave + + + {*PLAYER*} fue aplastado por un yunque. + + + {*PLAYER*} fue aplastado por un bloque. + + + {*PLAYER*} te teletransportó a su posición. + + + {*PLAYER*} teletransportado hasta {*DESTINATION*}. + + + Espinas + + + {*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 + + + ¡Demasiado caro! + + + Costo del encantamiento: %d + + + Tienes: + + + Renombrar + + + {*VILLAGER_TYPE*} ofrece %s + + + Necesarios para cambiar + + + Cambiar + + + 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. + + + + + {*B*} + Oprime{*CONTROLLER_VK_A*} para obtener más información sobre la interfaz del yunque.{*B*} + Oprime{*CONTROLLER_VK_B*} si ya sabes utilizar la interfaz del yunque. + + + + + También puedes colocar un segundo objeto idéntico en el segundo espacio para combinarlos. + + + + + 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. + + + + + 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. + + + + + 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. + + + + + Se puede renombrar el objeto modificando el nombre que se muestra en el recuadro de texto. + + + + + {*B*} + Oprime{*CONTROLLER_VK_A*} para obtener más información sobre el yunque.{*B*} + Oprime{*CONTROLLER_VK_B*} si ya sabes cómo utilizar el yunque. + + + + + En esta zona hay un yunque y un cofre que contiene herramientas y armas con las que puedes trabajar. + + + + + Los libros encantados se encuentran en los cofres de los subterráneos, o se consiguen encantando libros normales en una mesa de encantamiento. + + + + + Con un yunque se pueden reparar las armas y herramientas para aumentar su duración, renombrar o encantar con libros encantados. + + + + + 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. + + + + + Usar un yunque cuesta niveles de experiencia y existe la posibilidad de dañar el yunque. + + + + + En el cofre de esta zona encontrarás picos dañados, materias primas, botellas de encantamiento y libros encantados para experimentar. + + + + + Al renombrar un objeto se cambia el nombre que se muestra a todos los jugadores y reduce permanentemente el costo del trabajo previo. + + + + + {*B*} + Oprime{*CONTROLLER_VK_A*} para obtener más información sobre la interfaz de comercio.{*B*} + Oprime{*CONTROLLER_VK_B*} si ya sabes cómo utilizar la interfaz de comercio. + + + + + Esta es la interfaz de comercio, que muestra los cambios que se pueden hacer con un aldeano. + + + + + Los cambios aparecerán en rojo y no estarán disponibles si no tienes los objetos necesarios. + + + + + Arriba se muestran todos los cambios que este aldeano está dispuesto a hacer por el momento. + + + + + Puedes ver la cantidad total de objetos necesarios para el cambio en los dos recuadros de la izquierda. + + + + + 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. + + + + + {*B*} + Oprime{*CONTROLLER_VK_A*} para obtener más información sobre el comercio.{*B*} + Oprime{*CONTROLLER_VK_B*} si ya sabes cómo funciona el comercio. + + + + + Si realizas una serie de cambios, se añadirán cambios al azar o se actualizarán los cambios disponibles de un aldeano. + + + + + Los cambios que un aldeano puede ofrecer dependen de su profesión. + + + + + Es posible que se eliminen temporalmente los cambios que se hayan realizado con frecuencia, pero el aldeano siempre ofrecerá un mínimo de un cambio. + + + + + Toma un poco de papel del cofre y prueba a comerciar con el aldeano que hay aquí. + + + + + En esta zona hay dos cofres de Ender. + + + + + {*B*} + Oprime{*CONTROLLER_VK_A*} para obtener más información sobre los cofres de Ender.{*B*} + Oprime{*CONTROLLER_VK_B*} si ya sabes cómo utilizar los cofres de Ender. + + + + Todos los cofres de Ender de un mundo están conectados, incluso a través de las dimensiones. Los objetos colocados en un cofre de Ender serán accesibles desde cualquier otro cofre de Ender. + + + + + Sin embargo, los contenidos de los cofres de Ender serán diferentes para cada jugador. + + + + + Esto permite a los jugadores almacenar objetos en cualquier cofre de Ender y recuperarlos en otro cofre de Ender de cualquier lugar del mundo. Puedes probarlo ahora colocando objetos en uno de los cofres de Ender. + + + + Restablece 2{*ICON_SHANK_01*}, regenera la salud durante 30 segundos y concede resistencia al fuego y resistencia al daño durante 5 minutos. Se fabrica con una manzana y bloques de oro. + + + Puede teletransportar + + + Teletransportar + + + Teletransportar hacia jugador + + + Teletransportar hacia mí + + + Puede deshabilitar el agotamiento + + + Puede hacerse invisible + + + Ya puedes habilitar la invisibilidad. + + + Ya no puedes habilitar la invisibilidad. + + + Ya puedes habilitar el vuelo. + + + Ya no puedes habilitar el vuelo. + + + Ya puedes deshabilitar el agotamiento. + + + Ya no puedes deshabilitar el agotamiento. + + + Ya puedes teletransportar. + + + Ya no puedes teletransportar. + + + {*T3*}CÓMO SE JUEGA: YUNQUE{*ETW*}{*B*}{*B*} +Se pueden usar niveles de experiencia para reparar, encantar o renombrar objetos con el yunque.{*B*} +Se pueden renombrar todos los objetos, pero solo se puede reparar o aplicar encantamientos de libros encantados a los objetos con duración.{*B*} +Se puede reparar cualquier objeto colocándolo en uno de los dos espacios de introducción de la izquierda, junto a algunas materias primas del objeto, como lingotes de hierro para una espada de hierro, o combinar con otro objeto del mismo tipo.{*B*} +La combinación de objetos es más eficaz cuando se realiza con un yunque, y además, si alguno de los objetos estaba encantado, el producto final puede tener encantamientos de cualquiera de los objetos introducidos.{*B*} +Los libros encantados pueden aplicar encantamientos a los objetos combinándolos con el yunque, siempre que el encantamiento del libro sea apropiado. Los libros encantados se encuentran en los cofres de los subterráneos, o se consiguen encantando libros normales en una mesa de encantamiento.{*B*} +Existe una posibilidad de que el yunque resulte dañado después de cada uso, y cuando sufra suficiente daño, se destruirá.{*B*} + + + {*T3*}CÓMO SE JUEGA: COMERCIO{*ETW*}{*B*}{*B*} +Es posible cambiar objetos con aldeanos. Cada aldeano tiene una profesión; pueden ser granjeros, carniceros, herreros, bibliotecarios o sacerdotes, y eso afecta al tipo de objetos que pueden cambiar.{*B*} +En el menú de comercio puedes ver una lista de todos los cambios que ofrece un aldeano. Un aldeano puede modificar o añadir más cambios siempre que un jugador comercie con él, aunque un cambio podría desaparecer temporalmente si se realiza con demasiada frecuencia.{*B*} +Los cambios suelen suponer la compra o venta de varios objetos por esmeraldas.{*B*} +Si no tienes los objetos necesarios para un cambio, los objetos se mostrarán en rojo.{*B*} + + + + {*T3*}CÓMO SE JUEGA: COFRE DE ENDER{*ETW*}{*B*}{*B*} +Todos los cofres de Ender de un mundo están conectados. Los objetos colocados en un cofre de Ender serán accesibles desde cualquier otro. Sin embargo, los contenidos de los cofres de Ender serán diferentes para cada jugador. Esto permite a los jugadores almacenar objetos en cualquier cofre de Ender y recuperarlos en otro cofre de Ender de cualquier lugar del mundo. + + + Granjero + + + Bibliotecario + + + Sacerdote + + + Herrero + + + Carnicero + + + Los aldeanos de los pueblos ofrecerán ventas de objetos al jugador en función de su profesión. + + + Cofre grande + + + + También puedes crear libros encantados en la mesa de encantamiento, que luego podrás usar con el yunque para aplicar su encantamiento a un objeto. + + + + + Los ganchos de cable trampa también proporcionarán energía constante a un circuito cuando algo active el cable que los une. + + + + + Una vez domesticado, un lobo siempre llevará puesto su collar. Teñirlo es la única forma de cambiar su color. + + + + Las zanahorias y las papas se cultivan plantando zanahorias y papas, y estarán listas para ser cosechadas cuando el vegetal sea visible por encima de la tierra. + + + + Además, se puede ensillar a los cerdos para que los jugadores cabalguen sobre ellos. Se los controla tentándolos con un palo con zanahoria. + + + + + Si es necesario, puedes mover tu vagoneta lentamente con {*CONTROLLER_ACTION_MOVE*}. Te servirá para activar la vagoneta llevándola a unos rieles propulsores. + + + + No puedes unirte a esta partida porque solo se puede jugar en pantalla dividida en el modo de alta definición. Si quieres unirte, cierra la sesión de todos los demás jugadores. + + + Curar + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/la-LAS/stringsLeaderboards.xml b/Minecraft.Client/PSVitaMedia/loc/la-LAS/stringsLeaderboards.xml new file mode 100644 index 00000000..c3d6b047 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/la-LAS/stringsLeaderboards.xml @@ -0,0 +1,48 @@ + + + + Muertes fácil + + + Muertes normal + + + Muertes difícil + + + Extracción de bloques pacífica + + + Extracción de bloques fácil + + + Extracción de bloques normal + + + Extracción de bloques difícil + + + Cultivo pacífico + + + Cultivo fácil + + + Cultivo normal + + + Cultivo difícil + + + Desplazamiento pacífico + + + Desplazamiento fácil + + + Desplazamiento normal + + + Desplazamiento difícil + + \ 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 new file mode 100644 index 00000000..940a3819 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/la-LAS/stringsPlatformSpecific.xml @@ -0,0 +1,245 @@ + + + + ¿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. + + + 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. + + + Aparato PlayStation®Vita + + + 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 + + + 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 í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*} +La interfaz del modo Creativo permite mover cualquier objeto del juego al inventario sin tener que extraerlo o crearlo. +Los objetos del inventario del jugador no se eliminan cuando se colocan o se usan en el mundo, lo que permite centrarse en la construcción más que en la recolección de recursos.{*B*} +Si creas, cargas o guardas un mundo en el modo Creativo, ese mundo tendrá los trofeos y las actualizaciones de los marcadores deshabilitados, aunque después lo cargues en el modo Supervivencia.{*B*} +Para volar en el modo Creativo, oprime{*CONTROLLER_ACTION_JUMP*} dos veces con rapidez. Para dejar de volar, repite la acción. Para volar más rápido, oprime{*CONTROLLER_ACTION_MOVE*} dos veces en una sucesión rápida mientras vuelas. +En modo de vuelo, puedes mantener oprimido{*CONTROLLER_ACTION_JUMP*} para subir y{*CONTROLLER_ACTION_SNEAK*} para bajar, o usar{*CONTROLLER_ACTION_DPAD_UP*} para subir y {*CONTROLLER_ACTION_DPAD_DOWN*} para bajar, +{*CONTROLLER_ACTION_DPAD_LEFT*} para ir a la izquierda y {*CONTROLLER_ACTION_DPAD_RIGHT*} para ir a la derecha. + + + 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" + + + 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? + + + "NO SE USA" + + + 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. + + + 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". +¿Te gustaría desbloquear el juego completo? + + + Esta es la versión de prueba de Minecraft: PlayStation®Vita Edition. Necesitas la versión completa para aceptar esta invitación. +¿Quieres desbloquear la versión completa del juego? + + + El archivo de guardado de la zona de transferencia pertenece a una versión no compatible con Minecraft: PlayStation®Vita Edition. + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/la-LAS/stringsRichPresence.xml b/Minecraft.Client/PSVitaMedia/loc/la-LAS/stringsRichPresence.xml new file mode 100644 index 00000000..95273b17 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/la-LAS/stringsRichPresence.xml @@ -0,0 +1,66 @@ + + + + {GAME_STATE} + + + Inactivo + + + En los menús + + + En multijugador - {GAME_STATE} + + + Multijugador sin conexión - {GAME_STATE} + + + Jugando solo - {GAME_STATE} + + + Solo sin conexión\ - {GAME_STATE} + + + ¡Disfrutando de la vista! + + + Sobre un cerdo + + + Sobre una vagoneta + + + En un barco + + + Pescando + + + Fabricando + + + Forjando + + + En el Inframundo + + + Escuchando un disco + + + Mirando un mapa + + + Encantando + + + Elaborando poción + + + Trabajando en el yunque + + + Conociendo a los vecinos + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/nl-NL/4J_stringsGeneric.xml b/Minecraft.Client/PSVitaMedia/loc/nl-NL/4J_stringsGeneric.xml new file mode 100644 index 00000000..012bfdd0 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/nl-NL/4J_stringsGeneric.xml @@ -0,0 +1,87 @@ + + + + OK + + + Terug + + + Annuleren + + + Ja + + + Nee + + + Beschadigd opslagbestand + + + Je opslagbestand lijkt beschadigd. Wil je een nieuw opslagbestand maken en het beschadigde overschrijven? + + + Geen vrije ruimte + + + Opnieuw selecteren + + + Spelen zonder opslaan + + + Nieuw opslagbestand maken + + + Opslagbestand overschrijven? + + + Nee, niet overschrijven + + + Overschrijven en opslaan + + + Opslaan mislukt + + + Doorgaan zonder opslaan + + + Laden mislukt + + + Naam geven aan opslagbestand + + + Geef je opslagbestand een naam + + + Weet je zeker dat je de game wilt afsluiten? + + + Afgemeld + + + Verderspelen + + + Offline verderspelen + + + Gastspeler + + + Gastspelers hebben geen toegang tot "PSN". + + + Opslaan... + + + Content wordt opgeslagen. Schakel het systeem niet uit. + + + Volledige game kopen + + \ 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 new file mode 100644 index 00000000..ed76f17a --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/nl-NL/4J_stringsPlatformSpecific.xml @@ -0,0 +1,50 @@ + + + + De instellingen kunnen niet worden opgeslagen naar je Sony Entertainment Network-account. + + + Probleem met 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 new file mode 100644 index 00000000..46525504 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/nl-NL/AdditionalStrings.xml @@ -0,0 +1,96 @@ + + + + Alle combinatiewerelden weergeven + + + Verbergen + + + Minecraft: PlayStation®3 Edition + + + Opties + + + Tijdelijk opslagbestand + + + Netwerkfout opgetreden. + + + Netwerkfout + + + Er heeft zich een netwerkfout voorgedaan. Terug naar het hoofdmenu. + + + Je mag niet online spelen wegens chatbeperkingen van je Sony Entertainment Network-account. + + + Je mag niet online spelen met je Sony Entertainment Network-account door de instellingen voor ouderlijk toezicht. + + + Online service + + + Je bent afgemeld bij "PSN". De online functies zijn pas beschikbaar als je weer bent aangemeld bij "PSN". + + + Je bent afgemeld bij "PSN". De online functies zijn pas beschikbaar als je weer bent aangemeld bij "PSN". Terug naar het hoofdmenu. + + + Kies een gebruiker voor speler %d (of annuleer om als gast te spelen) + + + Gratis + + + Je optiebestand is beschadigd en moet worden verwijderd. + + + Optiesbestand verwijderen. + + + Optiesbestand opnieuw laden. + + + Je tijdelijke opslagbestand is beschadigd en moet worden verwijderd. + + + Trofeeën uitgeschakeld + + + Trofeeën worden uitgeschakeld omdat dit een opslagbestand van een andere gebruiker is. + + + Fatale fout: Initialisatie trofeeën mislukt. Sluit de game af. + + + Uitnodigingen + + + Beschadigd bestand + + + Geen controller + + + De verbinding met de controller is verbroken. Sluit je controller opnieuw aan. + + + 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. + + + Uitnodiging + + + Kom je Minecraft: PlayStation®Vita Edition met me spelen? + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/nl-NL/EULA.xml b/Minecraft.Client/PSVitaMedia/loc/nl-NL/EULA.xml new file mode 100644 index 00000000..906e9c21 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/nl-NL/EULA.xml @@ -0,0 +1,99 @@ + + + + Minecraft: PlayStation®Vita Edition - GEBRUIKSVOORWAARDEN + In deze Voorwaarden zijn regels voor het gebruik van Minecraft: PlayStation®Vita Edition ("Minecraft") vastgelegd. Om Minecraft en de leden van onze community te beschermen, hebben we deze voorwaarden nodig, waarin regels zijn beschreven voor het downloaden en gebruiken van Minecraft. Wij houden net zo min van regels als jij, dus we hebben geprobeerd het zo kort mogelijk te houden, maar als je Minecraft koopt, downloadt, gebruikt of speelt, verklaar je je aan deze voorwaarden ("Voorwaarden") te zullen houden. + Voordat we beginnen, is er één ding dat we heel duidelijk willen maken. Minecraft is een game waarin spelers dingen kunnen bouwen en afbreken. Als je met andere mensen speelt (multiplayer), kun je met hen mee bouwen of afbreken wat zij hebben gebouwd. En zij kunnen hetzelfde doen bij jou. Speel dus niet met anderen als die zich niet zo gedragen als jij wilt. Soms doen mensen ook dingen die ze niet zouden moeten doen. Dat vinden we niet fijn, maar we kunnen er weinig aan doen, behalve iedereen vragen zich netjes te gedragen. Wij vertrouwen erop dat jij en andere leden van de community ons waarschuwen als iemand zich niet netjes gedraagt. Als dat het geval is en/of als je denkt dat iemand de regels of deze Voorwaarden overtreedt of Minecraft op een onacceptabele manier gebruikt, geef dat dan alsjeblieft aan ons door. We hebben daar een signaleringssysteem voor, dus gebruik dat alsjeblieft. Daarna zullen we de noodzakelijke maatregelen nemen. + Om problemen te signaleren of te melden, kun je ons mailen op support@mojang.com. Geef daarbij zo veel mogelijk informatie, zoals de gegevens van de gebruiker en wat er is gebeurd. + Goed, terug naar de Voorwaarden: + ÉÉN HOOFDREGEL + De hoofdregel is dat je niets mag verspreiden wat wij hebben gemaakt. Met "verspreiden wat wij hebben gemaakt" bedoelen we "kopieën van Minecraft weggeven of commercieel gebruikmaken van Minecraft of onderdelen daarvan, proberen er geld aan te verdienen of andere mensen er toegang toe geven op een manier die oneerlijk of onredelijk is". De hoofdregel verbiedt dus de volgende dingen (tenzij wij er expliciet toestemming voor hebben gegeven, bijvoorbeeld in onze Gebruiksrichtlijnen Naam, Merk en Eigendommen): + • kopieën van Minecraft aan iemand anders geven; + • commercieel gebruikmaken van iets wat wij hebben gemaakt; + • proberen geld te verdienen aan iets wat wij hebben gemaakt; of + • andere mensen toegang geven tot iets wat wij hebben gemaakt op een manier die oneerlijk of onredelijk is. + ... en nog even voor alle duidelijkheid: wat wij hebben gemaakt omvat, maar is niet beperkt tot, de client- of serversoftware voor Minecraft. Het omvat ook aangepaste versies van een game, delen ervan en alle andere dingen die wij hebben gemaakt. + Verder doen we niet zo moeilijk over wat je doet. We moedigen je juist aan coole dingen te doen (zie hieronder), maar doe gewoon niet de dingen waarvan wij zeggen dat je ze niet mag doen. + MINECRAFT GEBRUIKEN + • Je hebt Minecraft gekocht zodat je het zelf kunt gebruiken, op je eigen PlayStation®Vita-systeem. + • Verderop geven we je ook beperkte rechten om andere dingen te doen, maar we moeten ergens een grens trekken, anders gaan mensen te ver. Als je iets wilt maken dat verband houdt met iets wat wij hebben gemaakt, voelen we ons vereerd, maar zorg er wel voor dat het niet voor iets officieels kan worden aanzien, dat het voldoet aan deze Voorwaarden en vooral dat je niet commercieel gebruikmaakt van iets wat wij hebben gemaakt. + • De toestemming die we jou geven om Minecraft te gebruiken en te spelen kan worden ingetrokken als je deze Voorwaarden overtreedt. + • Als je Minecraft koopt, geven we je toestemming om Minecraft op je eigen PlayStation®Vita-systeem te installeren en het op dat PlayStation®Vita-systeem te gebruiken en te spelen zoals in deze Voorwaarden is beschreven. Deze toestemming is voor jou persoonlijk, dus je mag Minecraft (of een deel daarvan) niet aan iemand anders doorgeven (behalve natuurlijk als wij je daar uitdrukkelijk toestemming voor hebben gegeven). + • Binnen redelijke grenzen ben je vrij om te doen wat je wilt met screenshots en video's van Minecraft. Met "binnen redelijke grenzen" bedoelen we dat je er geen commercieel gebruik van mag maken en dat je niets mag doen wat oneerlijk is of een nadelig effect heeft op onze rechten. Je mag ook geen artwork rippen en verspreiden. Daar houden we niet van. + • De regel is eigenlijk simpel: maak geen commercieel gebruik van iets wat wij hebben gemaakt, tenzij wij daar expliciet toestemming voor hebben gegeven in onze Gebruiksrichtlijnen Naam, Merk en Eigendommen of in deze Voorwaarden. O, en als de wet het uitdrukkelijk toestaat, bijvoorbeeld in het kader van beginselen van "eerlijk gebruik" of "eerlijke behandeling", dan is het ook goed, maar alleen voor zover de wet het toestaat. + EIGENDOM VAN MINECRAFT EN ANDERE DINGEN + • Hoewel we je toestemming geven om Minecraft te spelen, blijft de game wel ons eigendom. Wij zijn ook eigenaars van onze merken en alle content van Minecraft, die bestaat uit onze software, texturen, assets, tools, infrastructuur en een heleboel andere slimme (en minder slimme) dingen die ons eigendom zijn. Al onze rechten op die dingen zijn uitdrukkelijk voorbehouden, maar je kunt ze gebruiken in overeenstemming met deze Voorwaarden. + • Dat betekent niet dat we eigenaars zijn van de coole dingen die jij maakt met Minecraft. Je moet alleen accepteren dat wij de eigenaars zijn van elk onderdeel van Minecraft en van Minecraft als product en dienst en van de zaken die we in het vorige punt hebben genoemd. We bezitten ook het auteursrecht en de andere zogenoemde intellectuele eigendomsrechten ("IER's") die verbonden zijn aan die dingen en de namen en merken die verband houden met Minecraft. + • Jij gaat natuurlijk je eigen dingen maken in en met Minecraft. Wij zijn niet de eigenaars van de originele dingen die jij maakt en we willen niet het eigendom opeisen van dingen waar we geen recht op hebben. We zijn echter wel eigenaars van dingen die kopieën (of grotendeels kopieën) of afgeleiden zijn van onze eigendommen en creaties (zie boven), maar als jij originele dingen bouwt, zijn die niet van ons. Een voorbeeld: + - één enkel blok – dat is ons eigendom; + - een gotische kathedraal waar een achtbaan doorheen loopt – dat is niet ons eigendom. + • Dus als je betaalt voor het gebruik van Minecraft, koop je alleen een toestemming om het product Minecraft te gebruiken in overeenstemming met deze Voorwaarden. De enige toestemmingen die je hebt in verband met Minecraft zijn de toestemmingen die zijn beschreven in deze Voorwaarden. + CONTENT + • Als je content beschikbaar stelt in of via Minecraft, moet je ons toestemming geven die content te gebruiken, te kopiëren, te bewerken en aan te passen. Deze toestemming moet onherroepelijk en onbeperkt zijn. Je moet ons ook toestaan andere mensen toestemming te geven jouw content te gebruiken en je moet de andere mensen die jij er toegang toe geeft (bijvoorbeeld degenen met wie je multiplayer-games speelt) toestaan de content te gebruiken. + • Denk goed na voordat je content beschikbaar stelt, want deze kan openbaar worden gemaakt en door andere mensen worden gebruikt op een manier die jou niet bevalt. + • Als je iets beschikbaar gaat stellen in of via Minecraft, mag dat niet aanstootgevend of illegaal zijn, moet het eerlijk zijn en moet je het zelf gemaakt hebben. De volgende zaken mogen niet via Minecraft beschikbaar worden gesteld: berichten die racistische of homofobe uitlatingen bevatten; berichten die bedoeld zijn om te pesten of mensen belachelijk te maken; berichten die onze reputatie of die van iemand anders kunnen schaden; berichten die porno, reclame of creaties of afbeeldingen van iemand anders bevatten; of berichten die een moderator imiteren of proberen mensen te misleiden of te exploiteren. + • Alle content die je beschikbaar stelt op Minecraft moet door jou zelf gecreëerd zijn. Je mag geen content beschikbaar stellen via Minecraft die de rechten van iemand anders schendt. Als jij content plaatst op Minecraft en wij door iemand worden aangesproken, gesommeerd of aangeklaagd omdat de content de rechten van die persoon schendt, kunnen we jou aansprakelijk stellen en dat betekent dat het zou kunnen dat je ons de schade die wij lijden moet vergoeden. Het is dus heel belangrijk dat je alleen content beschikbaar stelt die je zelf hebt gemaakt en nooit content die iemand anders heeft gemaakt. + • Pas goed op met wie je speelt. Het is zowel voor jou als voor ons moeilijk om zeker te weten of mensen de waarheid spreken en of ze wel echt zijn wie ze zeggen dat ze zijn. Verstrek daarom nooit informatie over jezelf via Minecraft. + Als je content ("Jouw Content") beschikbaar stelt via Minecraft, moet die: + - voldoen aan alle regels van Sony Computer Entertainment, waaronder de Servicevoorwaarden en Gebruikersovereenkomst van "PSN" en eventuele andere richtlijnen waarmee je akkoord moet gaan om je PlayStation®Vita-systeem en "PSN" te mogen gebruiken + - niet aanstootgevend zijn; + - niet illegaal of onwettig zijn; + - eerlijk zijn, niemand misleiden, bedriegen of exploiteren en geen andere mensen imiteren; + - geen auteursrechten of andere rechten van andere personen schenden; + - niet racistisch, seksistisch of homofoob zijn; + - niemand pesten of belachelijk maken; + - onze reputatie of die van anderen niet schaden; + - geen pornografie bevatten; + - geen reclame bevatten. + - Je mag geen content beschikbaar stellen via Minecraft die de rechten van iemand anders schendt. + • Jij bent verantwoordelijk voor al Jouw Content die je beschikbaar stelt door middel van Minecraft. + • Door Jouw Content beschikbaar te stellen, garandeer je en verklaar je dat je daartoe volledig gerechtigd bent op grond van deze Voorwaarden en dat wij beschikken over de rechten die je ons op grond van deze Voorwaarden hebt verleend. + • Als wij door iemand worden aangesproken, gesommeerd of gedagvaard vanwege content die jij beschikbaar hebt gesteld met behulp van Minecraft of die door iemand beschikbaar wordt gesteld in of via Minecraft, kan deze content worden verwijderd, kun jij aansprakelijk worden gesteld en moet je ons mogelijk alle schade die we als gevolg hiervan hebben geleden vergoeden. Bovendien kan je toegang tot bepaalde aspecten van Minecraft worden ingetrokken of opgeschort. + GEBRUIKERSCONTENT + Hieronder beschrijven we een aantal voorwaarden met betrekking tot Jouw Content en content die beschikbaar wordt gesteld door anderen, die wordt aangeduid als "Gebruikerscontent". Minecraft is een entertainmentservice en daarnaast zijn wij (en onze licentiehouders, zoals Sony Computer Entertainment) betrokken bij het overdragen, distribueren, opslaan en ophalen van Gebruikerscontent, zonder controle, selectie of aanpassing van de content. Dat houdt in dat we de Gebruikerscontent niet controleren en dat we dus niet weten wat er door jou en andere mensen in omloop wordt gebracht. We hebben deze regels in de Voorwaarden waaraan jij en andere mensen zich moeten houden, maar we kunnen niet alles in de gaten houden. + Denk er dus aan dat: + • de meningen die worden geuit in Gebruikerscontent de meningen van de individuele auteurs of makers zijn en niet die van ons of iemand die aan ons verbonden is, tenzij anders aangegeven door ons; + • wij niet verantwoordelijk zijn voor (en geen garantie of verklaring geven en alle aansprakelijkheid afwijzen met betrekking tot) alle Gebruikerscontent, inclusief eventuele commentaren, meningen of opmerkingen daarin; + • je door Minecraft te gebruiken, erkent dat wij niet de verantwoordelijkheid hebben om de inhoud van Gebruikerscontent te controleren en dat alle Gebruikerscontent beschikbaar wordt gesteld met het uitgangspunt dat wij hier geen controle over uitoefenen en geen oordeel over geven en dat we hiertoe ook niet verplicht zijn. + MAAR wij (of onze licentiehouders, zoals Sony Computer Entertainment) kunnen Gebruikerscontent verwijderen of weigeren of de toegang tot Gebruikerscontent opschorten en jouw recht om content te plaatsen, beschikbaar te stellen of te bekijken intrekken of opschorten. We kunnen zelfs je toegang tot Minecraft of "PSN" intrekken of opschorten als we dat passend vinden, bijvoorbeeld als je deze Voorwaarden hebt overtreden of als we een klacht hebben ontvangen. We zullen Gebruikerscontent ook snel verwijderen of de toegang ertoe blokkeren als we vaststellen dat de content onwettig is. + UPGRADES + • We kunnen van tijd tot tijd upgrades en updates beschikbaar stellen, maar dat hoeft niet. We zijn ook niet verplicht ondersteuning of onderhoud voor een bepaalde game te blijven bieden. We hopen natuurlijk nieuwe updates voor Minecraft te blijven uitbrengen, maar dat kunnen we niet garanderen. + ONZE AANSPRAKELIJKHEID + • Als je een exemplaar van Minecraft krijgt, leveren we dat 'zoals het is'. Updates en upgrades worden ook geleverd zoals ze zijn. Dat betekent dat we geen beloften doen met betrekking tot de standaard of de kwaliteit van Minecraft, dat we niet garanderen dat Minecraft ononderbroken en foutloos zal functioneren en dat we niet aansprakelijk zijn voor eventuele verliezen of schades die uit het gebruik voortvloeien. We beloven alleen dat we Minecraft en eventuele services met redelijke kennis en zorg zullen leveren. In de meeste landen bepaalt de wet dat we de verantwoordelijkheid voor overlijden of persoonlijk letsel als gevolg van onze nalatigheid niet mogen uitsluiten, dus als je computer plotseling opstaat en je neersteekt omdat wij iets verkeerd hebben gedaan, dan nemen wij de schuld op ons. + WE ZIJN NIET AANSPRAKELIJK VOOR: + • ENIG GEBRUIK OF MISBRUIK VAN MINECRAFT DOOR JOU OF IEMAND ANDERS; + • ENIGE CONTENT DIE JIJ BESCHIKBAAR STELT VIA MINECRAFT; + • ENIGE SCHENDING VAN DEZE VOORWAARDEN DOOR JOU; + • ENIGE SCHENDING VAN ENIGE VOORWAARDEN DOOR ENIG PERSOON. + BEËINDIGING + • Als we dat willen, kunnen we jouw recht om Minecraft te gebruiken beëindigen als je deze Voorwaarden overtreedt. Jij kunt het gebruik ook op elk gewenst moment beëindigen. Daarvoor hoef je alleen Minecraft te verwijderen van je PlayStation®Vita-systeem. In alle gevallen blijven de artikelen "Eigendom van Minecraft", "Onze aansprakelijkheid" en "Algemene zaken" ook na beëindiging van toepassing. + ALGEMENE ZAKEN + • Deze Voorwaarden zijn gebonden aan jouw wettelijke rechten. Niets in deze Voorwaarden beperkt enige rechten die jij hebt die volgens de wet niet mogen worden uitgesloten. Deze Voorwaarden kunnen onze aansprakelijkheid voor overlijden of persoonlijk letsel als gevolg van onze nalatigheid of frauduleuze voorstelling ook niet uitsluiten of beperken. + • We kunnen deze Voorwaarden van tijd tot tijd wijzigen, maar die wijzigingen worden alleen van kracht voor zover ze wettelijk van toepassing kunnen zijn. Als je Minecraft bijvoorbeeld gebruikt als singleplayer en geen gebruik maakt van de updates die we beschikbaar stellen, dan blijft de oude EULA van toepassing, maar als je de updates wel gebruikt of delen van Minecraft gebruikt die afhankelijk zijn van onze voortdurende levering van online services, dan geldt de nieuwe EULA. In dat geval is het voor ons misschien niet mogelijk of verplicht om je te informeren over veranderingen voor ze van kracht worden, dus kijk hier van tijd tot tijd om op de hoogte te blijven van veranderingen in deze Voorwaarden. We zullen daar niet oneerlijk in zijn, maar soms verandert de wet of doet er iemand iets wat van invloed is op andere gebruikers van Minecraft en dan moeten we ingrijpen. + • Als je ons een suggestie voor Minecraft of een van onze andere games stuurt, is die suggestie gratis. Dat betekent dat we je suggestie mogen gebruiken zoals we willen en jou daar niet voor hoeven te betalen. Als je denkt dat je een suggestie hebt waarvoor we willen betalen, moet je melden dat je ervoor betaald wilt worden voordat je ons de suggestie vertelt. + • Naast deze Voorwaarden hebben we ook Gebruiksrichtlijnen Naam, Merk en Eigendommen, die je online kunt vinden. + • Als je deze regels overtreedt, kunnen wij (of Sony Computer Entertainment) bepalen dat je Minecraft niet meer mag gebruiken. Als je niet met deze regels akkoord wilt of kunt gaan, moet je Minecraft niet kopen, downloaden, gebruiken of spelen. + Als je een juridische vraag hebt die niet in op deze pagina wordt beantwoord, stel hem dan eerst aan ons voordat je iets doet. Als jij niks geks doet, zullen wij dat ook niet doen. + Wij zijn: + Mojang AB + Maria Skolgata 83, + SE-11853 + Stockholm + Zweden + Organisatienummer: 556819-2388 + + + + + Alle content die wordt gekocht in een winkel in de game, wordt gekocht van Sony Network Entertainment Europe Limited ("SNEE") en is gebonden aan de Servicevoorwaarden en Gebruikersovereenkomst van Sony Entertainment Network, die beschikbaar is bij PlayStation®Store. Controleer de gebruiksrechten voor elke aankoop, want die kunnen per item verschillen. Tenzij anders aangegeven heeft content die je in een winkel in de game koopt dezelfde leeftijdsclassificatie als de game. + + + + + Op de aanschaf en het gebruik van items zijn de Servicevoorwaarden en Gebruikersovereenkomst van Sony Entertainment Network van toepassing. Deze online service wordt je in sublicentie aangeboden door Sony Computer Entertainment America. + + + + Let op: Het gebruik van deze software is onderhevig aan de gebruiksvoorwaarden voor software op eu.playstation.com/legal. + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/nl-NL/stringsDynafont.xml b/Minecraft.Client/PSVitaMedia/loc/nl-NL/stringsDynafont.xml new file mode 100644 index 00000000..dca31ec2 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/nl-NL/stringsDynafont.xml @@ -0,0 +1,7 @@ + + + + DynaFont developed by DynaComware. + + + \ 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 new file mode 100644 index 00000000..5074010f --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/nl-NL/stringsGeneric.xml @@ -0,0 +1,6982 @@ + + + + Naar offline game + + + Wacht tot de host de game heeft opgeslagen + + + Naar het Einde + + + Spelers opslaan + + + Verbinden met host + + + Terrein downloaden + + + Het Einde verlaten + + + 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. + + + 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. + + + Wereld laden + + + Afwerken... + + + Terrein aanleggen + + + De wereld simuleren + + + Positie + + + Opslaan wereld voorbereiden + + + Segmenten samenstellen... + + + Server activeren + + + De Onderwereld verlaten + + + Terugkeren + + + Wereld genereren + + + Terugkeerlocatie genereren + + + Terugkeerlocatie laden + + + Naar de Onderwereld + + + Gereedschap en wapens + + + Gamma + + + Gevoeligheid game + + + Gevoeligheid interface + + + Moeilijkheid + + + Muziek + + + Geluid + + + Vredig + + + 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. + + + Makkelijk + + + Normaal + + + Moeilijk + + + Afgemeld + + + Pantser + + + Mechanismen + + + Vervoer + + + Wapens + + + Voedsel + + + Bouwmaterialen + + + Decoraties + + + Brouwen + + + Gereedschap, wapens en pantser + + + Materialen + + + Bouwblokken + + + Roodsteen en transport + + + Diversen + + + Aantal: + + + 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. + + + 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 + + + Nieuwe wereld maken + + + Geef je wereld een naam + + + Voer de basis van je wereld in + + + Opgeslagen wereld laden + + + Speluitleg spelen + + + Speluitleg + + + Naam van je wereld + + + Beschadigd opslagbestand + + + OK + + + Annuleren + + + Minecraft Store + + + Draaien + + + Verbergen + + + Alle vakjes leegmaken + + + Weet je zeker dat je de huidige game wilt verlaten om mee te doen met de nieuwe game? Niet opgeslagen voortgang gaat dan verloren. + + + 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 + + + Game afsluiten + + + Game opslaan + + + Afsluiten zonder opslaan + + + Druk START om mee te doen + + + Hoera! Je hebt een gamersafbeelding van Steve uit Minecraft verdiend! + + + Hoera! Je hebt een gamerafbeelding van een Creeper verdiend! + + + Volledige game kopen + + + 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! + + + Je speelt de testversie en je kunt de game alleen opslaan in de volledige game. +Wil je nu de volledige versie kopen? + + + Vrienden + + + Mijn score + + + Algemeen + + + Even geduld + + + Geen resultaten + + + Filter: + + + Je kunt niet meedoen met deze game omdat de andere speler een oudere versie van de game heeft. + + + Verbinding verbroken + + + Verbinding met de server is verbroken. Terug naar het hoofdmenu. + + + Verbinding verbroken door de server + + + De game wordt afgesloten + + + Er is een fout opgetreden. Terug naar het hoofdmenu. + + + Verbinding mislukt + + + Je bent uit de game verwijderd + + + 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 bent uit de game verwijderd omdat je vloog + + + Verbinding maken duurde te lang + + + De server is vol + + + 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! + + + Thema's + + + Skinpakketten + + + Vrienden van vrienden toestaan + + + 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 + + + Je kunt niet meedoen met deze game omdat alleen vrienden van de host mogen meedoen. + + + 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 kunt niet meedoen + + + Geselecteerd + + + Geselecteerde skin: + + + Volledige versie downloaden + + + Texturepakket ontgrendelen + + + Om dit texturepakket te kunnen gebruiken voor je wereld, moet je het ontgrendelen. +Wil je het nu ontgrendelen? + + + Testversie texturepakket + + + Basis + + + Skinpakket ontgrendelen + + + Om de geselecteerde skin te kunnen gebruiken, moet je dit skinpakket ontgrendelen. +Wil je dit skinpakket nu ontgrendelen? + + + 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? + + + Volledige versie downloaden + + + Deze wereld gebruikt een combinatiepakket of texturepakket dat je niet hebt! +Wil je het combinatiepakket of texturepakket nu installeren? + + + Testversie downloaden + + + Texturepakket niet aanwezig + + + Volledige versie ontgrendelen + + + Testversie downloaden + + + Je speltype is veranderd + + + 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. + + + Normaal + + + Supervlak + + + Als deze optie is ingeschakeld zal het een online spel worden. + + + Als deze optie is uitgeschakeld, mogen andere spelers pas na toestemming bouwen of uitgraven. + + + 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. + + + 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. + + + Uit + + + Speltype: Creatief + + + Survival + + + Creatief + + + Je wereld hernoemen + + + Voer de nieuwe naam in voor je wereld + + + Speltype: Survival + + + Gemaakt in het speltype Survival + + + Opslagbestand hernoemen + + + Automatisch opslaan over %d... + + + Aan + + + Gemaakt in het speltype Creatief + + + Wolken renderen + + + Wat wil je doen met dit opslagbestand? + + + Formaat Scherminfo (gedeeld scherm) + + + Ingrediënt + + + Brandstof + + + Automaat + + + Kist + + + Betoveren + + + Oven + + + Er is op dit moment geen downloadbare content van dit type beschikbaar voor deze titel. + + + Weet je zeker dat je dit opslagbestand wilt verwijderen? + + + Wachten op goedkeuring + + + Gecensureerd + + + %s doet mee met de game. + + + %s heeft de game verlaten. + + + %s is verwijderd uit de game. + + + Brouwrek + + + Tekst invoeren op bord + + + Voer een tekstregel in voor je bord + + + Titel invoeren + + + Testversie verlopen + + + Game vol + + + Aansluiten bij de game is mislukt omdat er geen ruimte meer is + + + Voer een titel in voor je bericht + + + Voer een beschrijving in voor je bericht + + + Inventaris + + + Ingrediënten + + + Bijschrift toevoegen + + + Voer een bijschrift in voor je bericht + + + Beschrijving invoeren + + + Huidig nummer: + + + 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 + + + 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? + + + Interval automatisch opslaan: UIT + + + Doorzichtigheid interface + + + Automatisch opslaan wereld voorbereiden + + + Formaat Scherminfo + + + min. + + + Dit kan hier niet geplaatst worden! + + + Je mag geen lava in de buurt van een terugkeerlocatie plaatsen, omdat verschijnende spelers anders direct doodgaan. + + + Favoriete skins + + + Game van %s + + + Game van onbekende host + + + Gast afgemeld + + + Standaardinstellingen herstellen + + + Weet je zeker dat je de standaardinstellingen wilt herstellen? + + + Fout tijdens het laden + + + Een gastspeler heeft zich afgemeld, waardoor alle gastspelers uit de game zijn verwijderd. + + + Game maken mislukt + + + Automatisch geselecteerd + + + Geen pakket: Standaardskins + + + Aanmelden + + + Je bent niet aangemeld. Om deze game te kunnen spelen, moet je zijn aangemeld. Wil je je nu aanmelden? + + + Multiplayer niet toegestaan + + + Drinken + + + + 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. + + + 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. + + + + 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 portaal naar de Onderwereld! + + + + + {*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*} + + + + Je kunt roodsteenversterkers gebruiken om meer blokken van stroom te voorzien of om een circuit te vertragen. + {*ICON*}356{*/ICON*} + + + + + 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*} + + + + + 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 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. + + + + + 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. + + + + + 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. + + + + + 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. + + + + + 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. + + + + 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. + + + 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*} + + + + {*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. + + + + 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. + + + + + 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. + + + + + Als een ketel leeg raakt, kun je 'm bijvullen met een emmer water. + + + + + Gebruik het brouwrek om een drankje voor vuurbestendigheid te maken. Je hebt een fles water, Onderwereld-wrat en magmacrème nodig. + + + + + 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. + + + + + Nu je bestand bent tegen vuur en lava, zou je eens moeten kijken of je naar plekken kunt waar je eerst niet kon komen. + + + + + Dit is de betover-interface, waar je betoveringen kunt toevoegen aan wapens, pantser en bepaalde gereedschappen. + + + + {*B*} + Druk op{*CONTROLLER_VK_A*} voor meer informatie over de betover-interface.{*B*} + Druk op{*CONTROLLER_VK_B*} als je al genoeg weet over de betover-interface. + + + + + In dit gebied staat een brouwrek, een ketel en een kist met brouwvoorwerpen. + + + + + 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. + + + + + 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. + + + + + Druk op{*CONTROLLER_ACTION_USE*} om de hengel uit te werpen. Druk opnieuw op{*CONTROLLER_ACTION_USE*} om de lijn binnen te halen. + {*FishingRodIcon*} + + + + + Als de dobber onder het wateroppervlak verdwijnt, kun je de lijn binnenhalen om een vis te vangen. Je kunt een vis rauw eten of bereiden in een oven om je gezondheid aan te vullen. + {*FishIcon*} + + + + + 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. + + + + + {*B*} + Druk op{*CONTROLLER_VK_A*} voor meer informatie over bedden.{*B*} + Druk op{*CONTROLLER_VK_B*} als je al genoeg weet over bedden. + + + + + Plaats een bed in een veilige en goed verlichte plek, zodat je niet midden in de nacht wordt gestoord door monsters. Als je eenmaal een bed hebt gebruikt, keer je terug vanuit dat bed als je doodgaat. + {*ICON*}355{*/ICON*} + + + + + Als er andere spelers met je meedoen, kun je alleen gaan slapen als iedereen op hetzelfde moment in een bed gaat liggen. + {*ICON*}355{*/ICON*} + + + + + {*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 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. + + + + + 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. + + + + + 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. + + + + + 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*} + + + + + 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. + + + + 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. + + + + Gefeliciteerd, je hebt de speluitleg voltooid. De tijd in de game verloopt nu normaal. Het duurt niet lang meer totdat het nacht wordt en de monsters tevoorschijn komen! Maak dus snel je schuilplaats af! + + + + {*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. + + + {*B*}Druk op{*CONTROLLER_VK_A*} om de speluitleg te spelen.{*B*} + Druk op{*CONTROLLER_VK_B*} om de speluitleg over te slaan. + + + + {*B*} + Druk op{*CONTROLLER_VK_A*} voor meer informatie over de voedselbalk en eten.{*B*} + Druk op{*CONTROLLER_VK_B*} als je al genoeg weet over de voedselbalk en eten. + + + + Selecteren + + + Gebruiken + + + 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. + + + + Pakken + + + Volgende + + + Vorige + + + Speler verwijderen + + + Vriendverzoek versturen + + + Pagina omlaag + + + Pagina omhoog + + + Verven + + + Genezen + + + Zitten + + + Volg mij + + + Uitgraven + + + Voeden + + + Temmen + + + Ander filter + + + Alles plaatsen + + + Eén plaatsen + + + Laten vallen + + + Alles pakken + + + De helft pakken + + + Plaatsen + + + Alles laten vallen + + + Werkbalk leegmaken + + + Wat is dit? + + + Delen op Facebook + + + Eén laten vallen + + + Verwisselen + + + Snel plaatsen + + + Skinpakketten + + + Rood raam + + + Groen raam + + + Bruin raam + + + Wit glas + + + Gekleurd raam + + + Zwart raam + + + Blauw raam + + + Grijs raam + + + Roze raam + + + Lichtgroen raam + + + Paars raam + + + Cyaanblauw raam + + + Lichtgrijs raam + + + Oranje glas + + + Blauw glas + + + Paars glas + + + Cyaanblauw glas + + + Rood glas + + + Groen glas + + + Bruin glas + + + Lichtgrijs glas + + + Geel glas + + + Lichtblauw glas + + + Magenta glas + + + Grijs glas + + + Roze glas + + + Lichtgroen glas + + + Geel raam + + + Lichtgrijs + + + Grijs + + + Roze + + + Blauw + + + Paars + + + Cyaankleurig + + + Lichtgroen + + + Oranje + + + Wit + + + Aangepast + + + Geel + + + Lichtblauw + + + Magenta + + + Bruin + + + Wit raam + + + Kleine bal + + + Grote bal + + + Lichtblauw raam + + + Magenta raam + + + Oranje raam + + + Stervormig + + + Zwart + + + Rood + + + Groen + + + Creeper-vormig + + + Ontploffing + + + Onbekende vorm + + + Zwart glas + + + IJzeren paardenharnas + + + 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 + + + +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. + + + +{*C2*}Haal even diep adem. En nog eens. Voel de zuurstof in je longen. Voel je ledematen weer. Ja, beweeg je vingers. Je hebt weer een lichaam, op vaste grond en in de lucht. Keer terug naar de lange droom. Goed zo. Je lichaam raakt het universum weer aan, alsof jullie losstaan van elkaar. Alsof wij losstaan van elkaar.{*EF*}{*B*}{*B*} +{*C3*}Wie wij zijn? Ooit noemde men ons de geest van de berg. Vader zon, moeder maan. Oeroude geesten, dierlijke geesten. Jinn. Geesten. De groene mens. Toen goden, demonen. Engelen. Klopgeesten. Aliens, buitenaardse wezens. Leptonen, quarks. De woorden veranderen. Maar wij niet.{*EF*}{*B*}{*B*} +{*C2*}Wij zijn het universum. Wij zijn alles waarvan je denkt dat buiten jou staat. Je kijkt nu naar ons, met je huid en je ogen. En waarom raakt het universum je huid aan en schijnt het je bij? Om jou te kunnen zien, speler. Om je te leren kennen. En om ons bekend te maken. Ik zal je een verhaal vertellen.{*EF*}{*B*}{*B*} +{*C2*}Er was eens een speler, een wezen.{*EF*}{*B*}{*B*} +{*C3*}Dat wezen was jij, {*PLAYER*}.{*EF*}{*B*}{*B*} +{*C2*}Soms dacht het wezen dat het een mens was, op de dunne korst van een ronddraaiende bol van gesmolten steen. De bol van gesmolten steen draaide rond een bol van brandend gas die 330.000 keer zo groot was. Ze lagen zo ver van elkaar af, dat licht er acht minuten over deed om van de ene bol de andere te bereiken. Het licht was informatie van een ster die je huid kon verbranden op 150 miljoen kilometer afstand.{*EF*}{*B*}{*B*} +{*C2*}Soms droomde het wezen dat het een mijnwerker was, op een vlakke en oneindige wereld. De zon was een wit vierkant. De dagen waren kort, want er was veel te doen. En doodgaan was niet meer dan een tijdelijk ongemak.{*EF*}{*B*}{*B*} +{*C3*}In zijn dromen verdwaalde het wezen soms in een verhaal.{*EF*}{*B*}{*B*} +{*C2*}In zijn dromen was het wezen soms iets anders, ergens anders. Soms waren deze dromen verontrustend. Soms waren ze ook heel mooi. Soms ging de droom van het wezen over in een andere droom, en daarna weer in een andere.{*EF*}{*B*}{*B*} +{*C3*}Soms droomde het wezen dat het naar woorden keek op een scherm.{*EF*}{*B*}{*B*} +{*C2*}Kom, we gaan terug.{*EF*}{*B*}{*B*} +{*C2*}De atomen van de speler lagen overal: op het gras, in de rivieren, in de lucht en op de grond. Een vrouw verzamelde de atomen. Ze dronk ervan, at ze en ademde ze in. En in het lichaam van de vrouw werd de speler, het wezen, gevormd.{*EF*}{*B*}{*B*} +{*C2*}En het wezen kwam vanuit het warme, donkere lichaam van zijn moeder terecht in een lange droom.{*EF*}{*B*}{*B*} +{*C2*}En het wezen was een nieuw verhaal dat nog nooit was verteld, geschreven in letters van dna. En het wezen was een nieuw programma dat nog nooit was gestart, gegenereerd door een broncode die een miljard jaar oud was. En het wezen was een nieuwe mens die nog nooit had geleefd, gemaakt van alleen wat melk en liefde.{*EF*}{*B*}{*B*} +{*C3*}Jij bent dat wezen. Jij bent die speler. Het verhaal. Het programma. De mens. Gemaakt van alleen wat melk en liefde.{*EF*}{*B*}{*B*} +{*C2*}We gaan nog verder terug.{*EF*}{*B*}{*B*} +{*C2*}De zeven miljard miljard miljard atomen in het lichaam van het wezen ontstonden in de kern van een ster, lang voordat dit spel bestond. Het wezen is dus ook informatie van een ster. En het wezen doorloopt het verhaal, in een bos vol informatie dat is aangeplant door ene Julian, op een vlakke en oneindige wereld die is gecreëerd door ene Markus in de eigen kleine wereld van het wezen, dat leeft in een universum dat is gemaakt door...{*EF*}{*B*}{*B*} +{*C3*}Ssst... Soms maakte het wezen een eigen kleine wereld die zacht en warm en eenvoudig was. En die soms hard en koud en complex was. Soms bouwde het wezen een model van het universum in zijn hoofd - energiedeeltjes die zich verplaatsten door uitgestrekte lege ruimten. Soms noemde het deze deeltjes 'elektronen' en 'protonen'.{*EF*}{*B*}{*B*} + + + +{*C2*}Soms noemde het wezen ze 'planeten' en 'sterren'.{*EF*}{*B*}{*B*} +{*C2*}Soms dacht het dat het in een universum leefde dat bestond uit energie die aan en uit kon. Nullen en enen. Regels code. Soms dacht het wezen dat het een spel speelde. Soms dacht het dat het woorden op een scherm las.{*EF*}{*B*}{*B*} +{*C3*}Jij bent het wezen, de speler, jij leest de woorden...{*EF*}{*B*}{*B*} +{*C2*}Ssst... Soms las het wezen regels code op een scherm. Daar maakte het woorden van, en aan die woorden gaf het een betekenis, en die betekenis vertaalde het naar gevoelens, emoties, theorieën en ideeën - en het wezen ging sneller en dieper ademen en realiseerde zich dat het leefde, dat die duizend doden niet echt waren - de speler leefde.{*EF*}{*B*}{*B*} +{*C3*}Jij. Jij. Jij leeft.{*EF*}{*B*}{*B*} +{*C2*}en soms dacht het wezen dat het universum met hem sprak via het zonlicht dat op hem viel door de ruisende bladeren van loofbomen{*EF*}{*B*}{*B*} +{*C3*}en soms dacht het wezen dat het universum met hem sprak via het licht dat uit de hemel viel tijdens heldere winternachten, waarbij een lichtvlekje in de hoek van het oog van het wezen misschien wel een ster was die een miljoen keer zo groot was als de zon en die zijn planeten omsmolt tot plasma zodat hij voor even zichtbaar was voor het wezen dat aan de andere kant van het universum naar huis wandelde en plotseling voedsel rook, dicht bij de vertrouwde deur, klaar om weer te gaan dromen{*EF*}{*B*}{*B*} +{*C2*}en soms dacht het wezen dat het universum met hem sprak via de nullen en enen, via de elektriciteit in de wereld, via de voorbij rollende woorden op een scherm aan het einde van een droom.{*EF*}{*B*}{*B*} +{*C3*}En het universum zei: 'Ik hou van je'{*EF*}{*B*}{*B*} +{*C2*}en het universum zei dat je het spel goed had gespeeld{*EF*}{*B*}{*B*} +{*C3*}en het universum zei dat alles wat je nodig hebt in jezelf zit{*EF*}{*B*}{*B*} +{*C2*}en het universum zei dat je sterker bent dan je weet{*EF*}{*B*}{*B*} +{*C3*}en het universum zei dat jij het daglicht bent{*EF*}{*B*}{*B*} +{*C2*}en het universum zei dat jij de nacht bent{*EF*}{*B*}{*B*} +{*C3*}en het universum zei dat de duisternis waartegen je vecht in jezelf zit{*EF*}{*B*}{*B*} +{*C2*}en het universum zei dat het licht dat je zoekt in jezelf zit{*EF*}{*B*}{*B*} +{*C3*}en het universum zei dat je niet alleen bent{*EF*}{*B*}{*B*} +{*C2*}en het universum zei dat je bent verbonden met alle andere dingen{*EF*}{*B*}{*B*} +{*C3*}en het universum zei dat je het universum bent dat van zichzelf proeft, met zichzelf praat en zijn eigen code leest{*EF*}{*B*}{*B*} +{*C2*}en het universum zei: 'Ik hou van je, omdat jij de liefde bent'{*EF*}{*B*}{*B*} +{*C3*}En het spel was voorbij en de speler ontwaakte uit de droom. En de speler ging opnieuw dromen. En de speler droomde opnieuw en droomde beter. En de speler was het universum. En de speler was de liefde.{*EF*}{*B*}{*B*} +{*C3*}Jij bent de speler.{*EF*}{*B*}{*B*} +{*C2*}Ontwaak.{*EF*} + + + 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 + + + Onderwereld niet resetten + + + Je kunt deze zwamkoe nu niet scheren. Je hebt al het maximale aantal varkens, schapen, koeien, katten en paarden. + + + Je bent dood! + + + Wereldopties + + + Kan bouwen en uitgraven + + + Kan deuren en schakelaars gebruiken + + + Bouwwerken genereren + + + Supervlakke wereld + + + Bonuskist + + + Kan containers openen + + + Speler verwijderen + + + Kan vliegen + + + 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 + + + Bakens + + + {*T3*}INSTRUCTIES: BAKENS{*ETW*}{*B*}{*B*} +Actieve bakens projecteren een felle lichtstraal in de lucht en geven krachten aan spelers in de buurt.{*B*} +Je maakt ze van glas, obsidiaan en Onderwereld-sterren, die je krijgt door de Wither te verslaan.{*B*}{*B*} +Je moet de bakens zo plaatsen dat ze overdag in het zonlicht staan. Plaats de bakens op piramiden van ijzer, goud, smaragd of diamant.{*B*} +Het materiaal waarop het baken wordt geplaatst, heeft geen effect op de kracht van het baken.{*B*}{*B*} +In het menu van het baken kun je een primaire kracht kiezen voor je baken. Het aantal krachten waaruit je kunt kiezen, is afhankelijk van het aantal verdiepingen van je piramide.{*B*} +Als je een baken op een piramide met minimaal vier verdiepingen zet, kun je ook de secundaire kracht Regeneratie kiezen of een sterkere primaire kracht gebruiken.{*B*}{*B*} +Om de krachten van je baken in te stellen, moet je één smaragd, diamant, goud of ijzerstaaf in het betalingsvakje plaatsen.{*B*} +Daarna worden de krachten constant door het baken afgegeven.{*B*} + + + Vuurwerk + + + Talen + + + Paarden + + + {*T3*}INSTRUCTIES: PAARDEN{*ETW*}{*B*}{*B*} +Je vindt paarden en ezels vooral in open vlakten en op savannen. Muilezels zijn een kruising tussen een ezel en een paard en zijn onvruchtbaar.{*B*} +Je kunt rijden op alle volwassen paarden, ezels en muilezels. Alleen paarden kunnen worden bepantserd en alleen muilezels en ezels kunnen zadeltassen dragen voor het vervoeren van voorwerpen.{*B*}{*B*} +Paarden, ezels en muilezels moeten worden getemd voordat je ze kunt gebruiken. Je temt ze door op ze te klimmen en te blijven zitten als ze proberen om je van hun rug te gooien.{*B*} +Als er hartjes om hen heen verschijnen, zijn ze getemd. Ze zullen dan niet langer proberen je van hun rug te gooien. Om de dieren te besturen, moet je ze uitrusten met een zadel.{*B*}{*B*} +Je kunt zadels kopen van dorpelingen of vinden in verborgen kisten.{*B*} +Je kunt tamme ezels en muilezels zadeltassen geven door er kisten aan te bevestigen. Je kunt deze zadeltassen openen tijdens het rijden of door te sluipen.{*B*}{*B*} +Paarden en ezels (maar niet muilezels) kunnen net als andere dieren worden gefokt met gouden appels of gouden wortels.{*B*} +Veulens groeien na verloop van tijd op tot volwassen paarden. Dit gaat sneller als je ze tarwe of hooi voert.{*B*} + + + {*T3*}INSTRUCTIES: VUURWERK{*ETW*}{*B*}{*B*} +Vuurwerk is een decoratief voorwerp dat je vanuit de hand of een automaat kunt lanceren. Je produceert het met papier, buskruit en eventueel een aantal vuurwerk-sterren.{*B*} +Kleuren, uitdoving, vorm, grootte en effecten (zoals sporen en fonkelingen) van vuurwerk-sterren kun je tijdens de productie aanpassen door er extra ingrediënten aan toe te voegen.{*B*}{*B*} +Om vuurwerk te produceren, plaats je buskruit en papier in het productieraster van 3x3 boven je inventaris.{*B*} +Eventueel kun je meerdere vuurwerk-sterren in het productieraster toevoegen aan je vuurwerk.{*B*} +Hoe meer vakjes je in het productieraster vult met buskruit, des te hoger zullen de vuurwerk-sterren exploderen.{*B*}{*B*} +Je kunt het geproduceerde vuurwerk uit het resultaatvakje halen.{*B*}{*B*} +Je produceert vuurwerk-sterren door buskruit en kleurstof in het productieraster te plaatsen.{*B*} + - De kleurstof bepaalt de kleur van de exploderende vuurwerk-ster.{*B*} + - Je bepaalt de vorm van de vuurwerk-ster door er een vuurbal, goudklomp, veer of mobhoofd aan toe te voegen.{*B*} + - Je kunt een spoor of een fonkeling toevoegen door diamanten of gloeisteenstof te gebruiken.{*B*}{*B*} +Nadat je een vuurwerk-ster hebt geproduceerd, kun je de uitdovingskleur bepalen door er kleurstof aan toe te voegen. + + + {*T3*}INSTRUCTIES: DROPPERS{*ETW*}{*B*}{*B*} +Als ze worden aangedreven door roodsteen laten droppers een willekeurig voorwerp op de grond vallen. Gebruik {*CONTROLLER_ACTION_USE*} om de dropper te openen, waarna je hem kunt vullen met voorwerpen uit je inventaris.{*B*} +Als de dropper op een kist of een andere container is gericht, wordt het voorwerp daarin geplaatst. Je kunt een groot aantal droppers aan elkaar bevestigen om voorwerpen over een afstand te transporteren. Hiervoor moeten ze afwisselend worden in- en uitgeschakeld. + + + Als je dit gebruikt, wordt het een kaart van het deel van de wereld waarin je je bevindt. Naarmate je meer van de omgeving ontdekt, wordt er meer van de kaart onthuld. + + + Wordt achtergelaten door de Wither, wordt gebruikt voor het produceren van bakens. + + + Hoppers + + + {*T3*}INSTRUCTIES: HOPPERS{*ETW*}{*B*}{*B*} +Hoppers worden gebruikt om voorwerpen in en uit containers te transporteren en om voorwerpen die er naartoe worden gegooid automatisch op te vangen.{*B*} +Ze kunnen worden gebruikt met brouwrekken, kisten, automaten, droppers, mijnwagens met kisten, mijnwagens met hoppers en andere hoppers.{*B*}{*B*} +Hoppers zuigen voortdurend voorwerpen uit een geschikte container die erboven is geplaatst. Ze proberen ook in de hopper opgeslagen voorwerpen in een andere container te plaatsen.{*B*} +Als een hopper wordt aangedreven door roodsteen, wordt hij inactief en zal hij niet langer voorwerpen opzuigen of plaatsen.{*B*}{*B*} +Een hopper wijst in de richting waarin het voorwerpen probeert te transporteren. Om een hopper op een bepaald blok te laten richten, plaats je de hopper al sluipend tegen het gewenste blok.{*B*} + + + Droppers + + + NIET GEBRUIKT + + + Directe genezing + + + Directe verwonding + + + Sprongkracht + + + Trager graven + + + Kracht + + + Verzwakking + + + Misselijkheid + + + NIET GEBRUIKT + + + NIET GEBRUIKT + + + NIET GEBRUIKT + + + Regeneratie + + + Weerstand + + + Basis voor nieuwe wereld zoeken + + + 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. + + + Een soort rails die mijnwagens met hoppers kunnen activeren en deactiveren, en mijnwagens met TNT kunnen detoneren. + + + Wordt gebruikt om voorwerpen te bewaren of te laten vallen, of om voorwerpen in een andere container te duwen als ze een roodsteenlading krijgen. + + + Kleurrijke blokken die worden geproduceerd door geharde klei te kleuren. + + + 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 + + + Honger + + + voor vertraging + + + voor versnelling + + + Onzichtbaarheid + + + Onder water ademen + + + Nachtzicht + + + Blindheid + + + voor verwonding + + + voor genezing + + + voor misselijkheid + + + voor regeneratie + + + voor trager graven + + + voor sneller graven + + + voor verzwakking + + + voor kracht + + + Vuurbestendigheid + + + Verzadiging + + + voor weerstand + + + voor sprongkracht + + + Wither + + + Gezondheidsboost + + + Absorptie + + + + + + II + + + 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 + + + Gewoon + + + Oninteressant + + + Zwierig + + + Hartelijk + + + Betoverend + + + Elegant + + + Luxe + + + Sprankelend + + + 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 + + + Dreun + + + Scherpte + + + Verlaagt geleidelijk de gezondheid van spelers, dieren en monsters. + + + Aanvalsschade + + + Impact + + + Verdelging van geleedpotigen + + + Snelheid + + + Zombie-versterkingen + + + Sprongkracht paard + + + Indien gebruikt: + + + Weerstand tegen impact + + + Volgbereik mobs + + + Max. gezondheid + + + Magische vingers + + + Efficiëntie + + + Waterrat + + + Geluk + + + Plundering + + + Duurzaamheid + + + Vuurbestendigheid + + + Bescherming + + + Vuurbron + + + Zachte val + + + Ademhaling + + + Bescherming tegen projectielen + + + Explosiebescherming + + + IV + + + V + + + VI + + + Impact + + + VII + + + III + + + Brandende pijlen + + + Kracht + + + Onuitputtelijke pijlen + + + II + + + I + + + Wordt geactiveerd als iets of iemand een verbonden struikeldraad passeert. + + + Activeert een verbonden struikeldraadschakelaar als iets of iemand de draad raakt. + + + Een compacte manier om smaragden op te slaan. + + + Vergelijkbaar met een kist. Voorwerpen die worden geplaatst in een Einder-kist zijn echter beschikbaar in al je Einder-kisten, zelfs in andere dimensies. + + + IX + + + VIII + + + Kan worden uitgegraven met een ijzeren houweel of beter gereedschap om smaragden te verkrijgen. + + + 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. + + + 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*}. Het kan je wel vergiftigen. + + + Dit gebruik je om een opgezadeld varken te besturen als je op zijn rug zit. + + + Herstelt 3{*ICON_SHANK_01*}. Wordt gemaakt door een aardappel te bereiden in een oven. + + + Herstelt 3{*ICON_SHANK_01*}. Wordt gemaakt van een wortel en goudklompen. + + + Te gebruiken op een aambeeld om wapens, gereedschap en pantsers te betoveren. + + + Wordt gemaakt door het uitgraven van Onderwereld-kwartserts. Hiervan kun je een kwartsblok maken. + + + Aardappel + + + Gebakken aardappel + + + Wortel + + + Wordt gemaakt van wol. Wordt gebruikt als decoratie. + + + Smaragd + + + Bloempot + + + Pompoentaart + + + Betoverd boek + + + Giftige aardappel + + + Gouden wortel + + + Wortel aan een stok + + + Struikeldraadschakelaar + + + Struikeldraad + + + Onderwereld-kwarts + + + Smaragderts + + + Einder-kist + + + Mossige keienmuur + + + Smaragdblok + + + Keienmuur + + + Aardappelen + + + Bloempot + + + Wortels + + + Licht beschadigd aambeeld + + + Aambeeld + + + Aambeeld + + + Kwartsblok + + + Zwaar beschadigd aambeeld + + + Onderwereld-kwartserts + + + Trap van kwarts + + + Gebeiteld kwartsblok + + + Kwartspilaar + + + Rood tapijt + + + Tapijt + + + Zwart tapijt + + + Blauw tapijt + + + Groen tapijt + + + Bruin tapijt + + + Paars tapijt + + + Cyaankleurig tapijt + + + Lichtgrijs tapijt + + + Grijs tapijt + + + Lichtgroen tapijt + + + Roze tapijt + + + Lichtblauw tapijt + + + Geel tapijt + + + Magenta tapijt + + + Oranje tapijt + + + Wit tapijt + + + Gebeitelde 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. + + + {*PLAYER*} teleporteerde je naar dezelfde locatie + + + Teleporteerde {*PLAYER*} naar {*DESTINATION*} + + + Doornen + + + {*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 + + + Te duur! + + + Kosten betovering: %d + + + Je hebt: + + + Hernoemen + + + {*VILLAGER_TYPE*} verkoopt %s + + + Nodig voor handel + + + Handelen + + + 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. + + + + + {*B*} + Druk op{*CONTROLLER_VK_A*} voor meer informatie over de aambeeld-interface.{*B*} + Druk op{*CONTROLLER_VK_B*} als je al genoeg weet over de aambeeld-interface. + + + + + Je kunt ook een identiek voorwerp in het tweede vakje plaatsen om de twee voorwerpen met elkaar te combineren. + + + + + 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 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. + + + + + Door het oppakken van het gerepareerde voorwerp verbruik je de beide basisvoorwerpen en wordt het aangegeven aantal ervaringsniveaus van je totaal afgetrokken. + + + + + Je kunt het voorwerp hernoemen door de naam in het tekstvak te bewerken. + + + + + {*B*} + Druk op{*CONTROLLER_VK_A*} voor meer informatie over het aambeeld.{*B*} + Druk op{*CONTROLLER_VK_B*} als je al genoeg weet over het aambeeld. + + + + + 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. + + + + + Experimenteer met de beschadigde houwelen, grondstoffen, priesterflessen en betoverde boeken die je vindt in de kist in dit gebied. + + + + + Door het hernoemen van voorwerpen verander je de weergegeven naam voor alle spelers en verlaag je de kosten voor eerdere bewerkingen permanent. + + + + + {*B*} + Druk op{*CONTROLLER_VK_A*} voor meer informatie over de handel-interface.{*B*} + Druk op{*CONTROLLER_VK_B*} als je al genoeg weet over de handel-interface. + + + + + Dit is de handel-interface met de voorwerpen die je kunt verhandelen met een dorpeling. + + + + + 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 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. + + + + + Je kunt voorwerpen uit je inventaris verhandelen met dorpelingen. + + + + + {*B*} + Druk op{*CONTROLLER_VK_A*} voor meer informatie over handel.{*B*} + Druk op{*CONTROLLER_VK_B*} als je al genoeg weet over handel. + + + + + Door verschillende transacties uit te voeren, wordt het aanbod van de dorpeling willekeurig uitgebreid of bijgewerkt. + + + + + De transacties die dorpelingen voorstellen, zijn meestal afhankelijk van hun beroep. + + + + + Voorwerpen die vaak zijn verhandeld worden mogelijk tijdelijk verwijderd, maar een dorpeling heeft altijd minimaal één voorwerp in de aanbieding. + + + + + Haal wat papier uit de kist en probeer te handelen met de dorpeling. + + + + + In dit gebied vind je twee Einder-kisten. + + + + + {*B*} + Druk op{*CONTROLLER_VK_A*} voor meer informatie over Einder-kisten.{*B*} + Druk op{*CONTROLLER_VK_B*} als je al genoeg weet over Einder-kisten. + + + + + Alle Einder-kisten in een wereld zijn met elkaar verbonden, ook al bevinden ze zich in verschillende dimensies. Voorwerpen die je in de ene Einder-kist plaatst, zijn dus ook beschikbaar in andere Einder-kisten. + + + + De inhoud van elke Einder-kist is echter voor elke speler anders. + + + + Je kunt dus voorwerpen in een willekeurige Einder-kist bewaren, om ze vervolgens elders in de wereld uit een andere Einder-kist te halen. Probeer het maar eens door wat voorwerpen in een Einder-kist te plaatsen. + + + + Herstelt 2{*ICON_SHANK_01*}, herstelt 30 seconden lang je gezondheid en maakt je 5 minuten lang vuurbestendig. Wordt gemaakt van een appel en goudblokken. + + + Kan teleporteren + + + Teleporteren + + + Teleporteren naar speler + + + Teleporteren naar mij + + + Kan uitputting uitschakelen + + + Kan onzichtbaar worden + + + Je kunt nu onzichtbaarheid inschakelen + + + Je kunt niet langer onzichtbaarheid inschakelen + + + Je kunt nu vliegen inschakelen + + + Je kunt niet langer vliegen inschakelen + + + Je kunt nu uitputting uitschakelen + + + Je kunt niet langer uitputting uitschakelen + + + Je kunt nu teleporteren + + + Je kunt niet langer teleporteren + + + {*T3*}INSTRUCTIES: AAMBEELD{*ETW*}{*B*}{*B*} +Je kunt ervaringsniveaus gebruiken om voorwerpen op het aambeeld te repareren, betoveren of hernoemen.{*B*} +Je kunt alle voorwerpen hernoemen, maar je kunt alleen duurzame voorwerpen repareren of betoveren met betoverde boeken.{*B*} +Je kunt een voorwerp repareren door het in een van de invoervakjes aan de linkerkant te plaatsen, samen met bijbehorende grondstoffen (zoals ijzerstaven voor een ijzeren zwaard) of met een ander voorwerp uit dezelfde groep.{*B*} +Het combineren van voorwerpen is efficiënter met een aambeeld. Als een van de voorwerpen is betoverd, kan het eindproduct de betovering van een van de voorwerpen krijgen.{*B*} +Een betoverd boek kan een voorwerp betoveren op een aambeeld, als de betovering van het boek daar geschikt voor is. Je vindt betoverde boeken in kisten in kerkers, maar je kunt ook gewone boeken betoveren op de tovertafel.{*B*} +Het aambeeld kan bij elk gebruik beschadigd raken en zal uiteindelijk worden vernietigd.{*B*} + + + {*T3*}INSTRUCTIES: HANDELEN{*ETW*}{*B*}{*B*}Je kunt handel drijven met dorpelingen. Alle dorpelingen hebben een beroep (landbouwer, slager, smid, bibliothecaris of priester). Het beroep is van invloed op de voorwerpen die ze kunnen verhandelen.{*B*}In het handelsmenu zie je alle transacties die de dorpeling voorstelt. Tijdens het handelen kan de dorpeling het aanbod aanpassen of uitbreiden. Ook is het mogelijk dat een bepaald voorwerp tijdelijk niet beschikbaar is omdat het te vaak is verhandeld.{*B*}Normaal gesproken handel je door een aantal voorwerpen te kopen of verkopen voor smaragden.{*B*}Voorwerpen die zijn vereist voor een transactie worden in rood weergegeven als je deze niet hebt.{*B*} + + + {*T3*}INSTRUCTIES: EINDER-KIST {*ETW*}{*B*}{*B*} +Alle Einder-kisten in een wereld zijn met elkaar verbonden. Voorwerpen die je in de ene Einder-kist plaatst, zijn dus ook beschikbaar in de andere. De inhoud van elke Einder-kist is echter voor elke speler anders. Je kunt dus voorwerpen in een willekeurige Einder-kist bewaren, om ze vervolgens elders in de wereld uit een andere Einder-kist te halen. + + + + Landbouwer + + + Bibliothecaris + + + Priester + + + Smid + + + Slager + + + Dorpelingen verkopen in de dorpen bepaalde voorwerpen, afhankelijk van hun beroep. + + + Grote kist + + + + Je kunt ook betoverde boeken maken op de tovertafel, om ze later op het aambeeld te gebruiken voor het betoveren van voorwerpen. + + + + + Struikeldraadschakelaars leveren ook constante energie aan een circuit als de draad die ertussen is gespannen wordt geraakt. + + + + + Een getemde wolf heeft altijd een halsband om. Je kunt de halsband een andere kleur geven met verf. + + + + Je verbouwt wortels en aardappelen door ze te planten. Als ze boven de grond zichtbaar zijn, kun je ze oogsten. + + + + Ook kun je varkens opzadelen en vervolgens berijden. Je bestuurt ze door een wortel aan een stok voor hun snuit te houden. + + + + + Zo nodig kun je je mijnwagen langzaam verplaatsen met {*CONTROLLER_ACTION_MOVE*}. Op die manier kun je de mijnwagen op een aangedreven rail plaatsen, waardoor hij wordt gestart. + + + + Je kunt niet meedoen met deze game, omdat een gedeeld scherm alleen werkt in High Definition. Als je wilt meedoen, moet je eerst alle andere spelers afmelden. + + + Genezen + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/nl-NL/stringsLeaderboards.xml b/Minecraft.Client/PSVitaMedia/loc/nl-NL/stringsLeaderboards.xml new file mode 100644 index 00000000..57ac12a6 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/nl-NL/stringsLeaderboards.xml @@ -0,0 +1,48 @@ + + + + Kills Makkelijk + + + Kills Normaal + + + Kills Moeilijk + + + Uitgraven blokken Vredig + + + Uitgraven blokken Makkelijk + + + Uitgraven blokken Normaal + + + Uitgraven blokken Moeilijk + + + Landbouw Vredig + + + Landbouw Makkelijk + + + Landbouw Normaal + + + Landbouw Moeilijk + + + Afgelegde afstand Vredig + + + Afgelegde afstand Makkelijk + + + Afgelegde afstand Normaal + + + Afgelegde afstand Moeilijk + + \ 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 new file mode 100644 index 00000000..40a79366 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/nl-NL/stringsPlatformSpecific.xml @@ -0,0 +1,245 @@ + + + + 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. + + + 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. + + + PlayStation®Vita-systeem + + + 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 + + + Netwerkmodus wijzigen + + + 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*} +In het speltype Creatief kun je elk voorwerp in de game vanuit de interface naar je inventaris verplaatsen. Je hoeft de voorwerpen dus niet eerst uit te graven of te produceren. +Bovendien worden voorwerpen niet uit de inventaris verwijderd als je ze plaatst of gebruikt. Daardoor kun je je helemaal op het bouwen richten.{*B*} +In werelden die worden gemaakt, geladen of opgeslagen in het speltype Creatief zijn geen trofeeën en klassementen beschikbaar, zelfs niet als de wereld daarna als Survival-game wordt geladen.{*B*} +Druk twee keer kort op{*CONTROLLER_ACTION_JUMP*} om te vliegen in het speltype Creatief. Doe hetzelfde om te stoppen met vliegen. Om sneller te vliegen, duw je{*CONTROLLER_ACTION_MOVE*} twee keer kort naar voren. +Terwijl je vliegt hou je{*CONTROLLER_ACTION_JUMP*} ingedrukt om te stijgen en{*CONTROLLER_ACTION_SNEAK*} om te dalen. Je kunt ook stijgen met{*CONTROLLER_ACTION_DPAD_UP*}, dalen met{*CONTROLLER_ACTION_DPAD_DOWN*}, +naar links gaan met{*CONTROLLER_ACTION_DPAD_LEFT*} en naar rechts gaan met{*CONTROLLER_ACTION_DPAD_RIGHT*}. + + + 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" + + + 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? + + + "NIET GEBRUIKT" + + + 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. + + + 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". +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? + + + 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/nl-NL/stringsRichPresence.xml b/Minecraft.Client/PSVitaMedia/loc/nl-NL/stringsRichPresence.xml new file mode 100644 index 00000000..2f7b7dea --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/nl-NL/stringsRichPresence.xml @@ -0,0 +1,66 @@ + + + + {GAME_STATE} + + + Inactief + + + In de menu's + + + Speelt multiplayer - {GAME_STATE} + + + Offline multiplayer - {GAME_STATE} + + + Speelt alleen - {GAME_STATE} + + + Offline alleen - {GAME_STATE} + + + Geniet van het uitzicht! + + + Rijdt op een varken + + + Rijdt in een mijnwagen + + + In een boot + + + Aan het vissen + + + Aan het produceren + + + Aan het creëren + + + In de Onderwereld + + + Luistert naar een muziekplaat + + + Kijkt op een kaart + + + Aan het betoveren + + + Brouwt een drankje + + + Werkt aan het aambeeld + + + Ontmoet de buren + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/no-NO/4J_stringsGeneric.xml b/Minecraft.Client/PSVitaMedia/loc/no-NO/4J_stringsGeneric.xml new file mode 100644 index 00000000..9347194d --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/no-NO/4J_stringsGeneric.xml @@ -0,0 +1,87 @@ + + + + OK + + + Tilbake + + + Avbryt + + + Ja + + + Nei + + + Ødelagt lagring + + + Lagringen ser ut il å være ødelagt. Lage en ny lagring og overskrive den ødelagte? + + + Ikke nok ledig plass + + + Velg på nytt + + + Spill uten å lagre + + + Lag en ny lagring + + + Overskrive lagring? + + + Nei, ikke overskriv + + + Overskriv og lagre + + + Feil under lagring + + + Fortsett uten å lagre + + + Feil under innlasting + + + Gi navn til lagring + + + Gi et navn til det lagrede spillet ditt. + + + Er du sikker på at du vil avslutte spillet? + + + Logget ut + + + Fortsett å spille + + + Fortsett å spille offline + + + Gjestespiller + + + Gjestespillere har ikke tilgang til "PSN". + + + Lagrer ... + + + Lagrer innhold. Ikke slå av systemet. + + + Lås opp fullversjon + + \ 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 new file mode 100644 index 00000000..bdcb9eee --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/no-NO/4J_stringsPlatformSpecific.xml @@ -0,0 +1,50 @@ + + + + Det oppsto en feil under lagring av innstillingene på Sony Entertainment Network-kontoen din. + + + Problem med Sony Entertainment Network-konto + + + 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 new file mode 100644 index 00000000..208a348a --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/no-NO/AdditionalStrings.xml @@ -0,0 +1,96 @@ + + + + Vis alle flettede verdener + + + Skjul + + + Minecraft: PlayStation®3 Edition + + + Alternativer + + + Hurtigbuffer + + + Det har oppstått en nettverksfeil. + + + Nettverksfeil + + + Det har oppstått en nettverksfeil. Går tilbake til hovedmenyen. + + + Onlinetjenester er deaktivert på Sony Entertainment Network-kontoen din på grunn av chatbegrensninger. + + + Onlinetjenester er deaktivert på Sony Entertainment Network-kontoen din på grunn av foreldrekontrollbegrensninger. + + + Onlinetjeneste + + + Du er logget ut av "PSN". Onlinefunksjoner i spillet vil ikke være tilgjengelige før du logger inn på "PSN" igjen. + + + Du er logget ut av "PSN". Onlinefunksjoner i spillet vil ikke være tilgjengelige før du logger inn på "PSN" igjen. Går tilbake til hovedmenyen. + + + Velg bruker for spiller %d (eller avbryt for å spille som gjest) + + + Gratis + + + 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. + + + Trofeer deaktivert + + + Trofeer vil være deaktivert fordi denne lagringen tilhører en annen bruker. + + + Uopprettelig feil: Troféinitialisering mislyktes. Vennligst avslutt spillet. + + + Invitasjoner + + + Ødelagt fil + + + Kontroller frakoblet + + + Din kontroller har blitt frakoblet. Vennligst koble til kontroller igjen. + + + 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. + + + Invitasjon + + + Bli med å spille Minecraft: PlayStation®Vita Edition! + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/no-NO/EULA.xml b/Minecraft.Client/PSVitaMedia/loc/no-NO/EULA.xml new file mode 100644 index 00000000..c513afca --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/no-NO/EULA.xml @@ -0,0 +1,99 @@ + + + + Minecraft: PlayStation®Vita Edition – VILKÅR FOR BRUK + Disse vilkårene definerer noen regler for bruk av Minecraft: PlayStation®Vita Edition ("Minecraft"). For å beskytte Minecraft og medlemmene av samfunnet vårt, trenger vi disse reglene for nedlasting og bruk av Minecraft. Vi er like lite glad i regler som det du er, så vi har prøvd å være så kortfattet som mulig, men hvis du kjøper, laster ned, bruker eller spiller Minecraft, aksepterer du å overholde disse vilkårene ("Vilkårene"). + Før vi setter i gang, er det én ting vi vil klargjøre én gang for alle. Minecraft er et spill hvor man kan bygge og ødelegge ting. Hvis du spiller sammen med andre (flerspiller), kan du bygge sammen med dem, eller du kan ødelegge det de har bygget – og de kan gjøre det samme med eller mot deg. Så ikke spill sammen med folk som ikke opptrer seg slik du vil. Folk gjør i blant ting de ikke burde gjøre. Dette er ikke noe vi liker, men det er heller ikke stort vi kan få gjort med det annet enn å be alle om å oppføre seg skikkelig. Vi stoler på at du og de andre i samfunnet sier i fra til oss hvis det er noen som oppfører seg dårlig. Hvis du mener noen bryter disse reglene eller Vilkårene eller bruker Minecraft feil, vil vi gjerne at du sier i fra til oss. Vi har et flaggings-/rapporteringssystem som du kan bruke til dette, og så tar vi oss av problemet på den nødvendige måten. + Hvis du har noe du vil flagge eller rapportere, kan du sende oss en e-post på support@mojang.com og gi oss så mye info du kan om brukeren og det aktuelle forholdet. + Så tilbake til Vilkårene: + ÉN VIKTIG REGEL + Den aller viktigste regelen er at du aldri må distribuere noe vi har laget. Og med "distribuere noe vi har laget" mener vi egentlig "gi bort kopier av Minecraft, ervervsmessig utnytte, prøve å tjene penger på eller gi andre folk tilgang til Minecraft og dets deler på en måte som er urettmessig eller urimelig". Så den ene viktige regelen er at du (med mindre vi har gitt uttrykkelig tillatelse til det – som f.eks. i våre retningslinjer for bruk av varemerker og aktiva) ikke må: + • gi kopier av Minecraft til noen andre + • ervervsmessig utnytte noe vi har laget + • prøve å tjene penger på noe vi har laget + • gi andre folk tilgang til noe vi har laget, på en måte som er urettmessig eller urimelig + Og bare for å være krystallklare: Det vi har laget, inkluderer, men er ikke begrenset til klient- og serverprogramvaren til Minecraft. Det inkluderer også modifiserte versjoner av spillet, deler av det og alt annet vi har laget. + For øvrig har vi et ganske avslappet forhold til hva du gjør – faktisk så oppfordrer vi deg til å gjøre kule ting (se under) – bare ikke gjør de tingene vi sier at du ikke skal. + BRUKE MINECRAFT + • Du har kjøpt Minecraft slik at du selv kan bruke det på PlayStation®Vita-systemet ditt. + • Under gir vi deg også begrensede rettigheter til å gjøre andre ting, men vi må sette en grense et sted, ellers vil folk gå for langt. Hvis du vil lage noe basert på noe vi har laget, blir vi beæret, men sørg for at det ikke kan tolkes som noe offisielt og at det samsvarer med disse Vilkårene. Og, fremfor alt, ikke ervervsmessig utnytt noe vi har laget. + • Tillatelsen vi gir deg til å bruke og spille Minecraft, kan inndras hvis du bryter disse Vilkårene. + • Når du kjøper Minecraft, gir vi deg tillatelse til å installere Minecraft på PlayStation®Vita-systemet ditt og spille det på dette PlayStation®Vita-systemet slik det er angitt i disse Vilkårene. Denne tillatelsen gjelder for deg personlig, så du har ikke tillatelse til å distribuere Minecraft (eller noen del av det) til andre (med mindre vi har gitt uttrykkelig tillatelse til det, selvsagt). + • Innenfor rimelighetens grenser står du fritt til å gjøre hva du vil med skjermbilder og videoer av Minecraft. Med "rimelighetens grenser" mener vi at du ikke kan utnytte dem ervervsmessig eller gjøre ting som er urettmessig eller i strid med våre rettigheter. Og ikke driv og rapp kunstressurser og del dem rundt, det er ikke noe kult. + • I bunn og grunn er regelen at du ikke ervervsmessig kan utnytte noe vi har laget med mindre du har fått uttrykkelig tillatelse til det av oss, enten i våre retningslinjer for bruk av varemerker og aktiva eller i disse Vilkårene. Og hvis loven tillater det i klartekst, i forskrifter om "rimelig bruk" eller "rimelig opptreden", er det også greit – men bare i den utstrekning loven tillater det. + EIERSKAP AV MINECRAFT OG ANDRE TING + • Selv om vi gir deg tillatelse til å spille Minecraft, er det fremdeles vi som eier det. Vi eier også varemerkene og alt innhold i Minecraft, inkludert programvaren, teksturer, aktiva, verktøy, infrastruktur og en masse andre lure (og ikke fullt så lure) ting vi eier. Alle våre rettigheter i dette er bekreftet og reservert, men du kan bruke dem i henhold til disse Vikårene. + • Det betyr ikke at vi eier alt det kule du lager i Minecraft – du må bare akseptere at vi eier hver enkelt av delene i Minecraft og Minecraft som et produkt og en tjeneste – og alt det vi nevnte i forrige setning – og vi har også copyright og opphavsrett ("IPR") på disse tingene og på navnene og varemerkene knyttet til Minecraft. + • Du kommer selvsagt til å lage dine egne ting når du bruker Minecraft. Vi eier ikke de originale sakene du lager, og vi påberoper oss ikke eierskap over noe vi ikke skal. Vi har imidlertid eierskap over ting som er kopier (eller i vesentlighet kopier) eller avledninger av vår eiendom og våre produkter (angitt over), men hvis du lager originale ting, er ikke de våre. Vi kan ta et eksempel: + – en enkeltblokk – den eier vi + – en gotisk katedral som det går en berg-og-dal-bane gjennom – den eier vi ikke + • Så når du betaler for å bruke Minecraft, kjøper du bare en tillatelse til å bruke Minecraft-produktet i henhold til disse Vilkårene. Den eneste tillatelsen du har i tilknytning til Minecraft, er tillatelsene som er angitt i disse Vilkårene. + INNHOLD + • Hvis du gjør innhold tilgjengelig på eller via Minecraft, gir du oss tillatelse til å bruke, kopiere, modifisere og tilpasse dette innholdet. Denne tillatelsen er ugjenkallelig og ubegrenset. Du må også la oss tillate andre personer å bruke innholdet, og du må la de andre som du gir tilgang til det (som f.eks. de du spiller flerspiller sammen med), få bruke det. + • Tenk deg godt om før du gjør innhold tilgjengelig, ettersom det kan offentliggjøres og brukes av andre på en måte du ikke liker. + • Hvis du skal gjøre noe tilgjengelig på eller via Minecraft, må det ikke være ulovlig eller støtende, det må være ærlig, og det må være ditt eget verk. Noe av det du ikke må gjøre tilgjengelig ved hjelp av Minecraft, er: innlegg med rasistisk eller homofobisk språk, innlegg med mobbing eller trolling, innlegg som kan skade vårt eller andres rykte, innlegg som inneholder pornografi, reklame eller andres verk eller bilder, samt innlegg som gir seg ut for å være fra en moderator eller prøve å lure eller utnytte folk. + • Alt innhold du gjør tilgjengelig på Minecraft, må i tillegg være ditt eget verk. Du må ikke via Minecraft tilgjengeliggjøre innhold som utgjør et brudd på andres rettigheter. Hvis du poster innhold på Minecraft, og vi blir utfordret, truet eller saksøkt av noen på grunn av brudd på vedkommendes rettigheter, kan vi holde deg ansvarlig, hvilket innebærer at du kan måtte betale oss tilbake for eventuelle skader vi lider som følge av dette. Det er derfor svært viktig at du kun tilgjengeliggjør innhold som du har laget selv. + • Vær oppmerksom på hvem du spiller med. Det er vanskelig for både deg og oss å vite sikkert om folk snakker sant, eller om de er dem de utgir seg for å være. Du bør heller ikke gi ut informasjon om deg selv via Minecraft. + Hvis du skal tilgjengeliggjøre innhold ("Ditt innhold") via Minecraft, må innholdet: + – være i henhold til alle Sony Computer Entertainments regler, inklusiv ToSUA, som er tjenestevilkårene og brukeravtalen for "PSN", samt eventuelle andre retningslinjer du må akseptere for å kunne bruke PlayStation®Vita-systemet og "PSN"; + – ikke være støtende for folk + – ikke være ulovlig + – være ærlig og ikke villede, lure eller utnytte andre eller gi deg ut for å være andre + – ikke utgjøre et brudd på andres opphavsrett eller rettigheter + – ikke være rasistisk, kjønnsdiskriminerende eller homofobisk + – ikke inkludere mobbing eller trolling + – ikke skade vårt eller andres rykte + – ikke inneholde pornografi + – ikke inneholde reklame + Du må ikke via Minecraft tilgjengeliggjøre innhold som utgjør et brudd på andres rettigheter. + • Du er ansvarlig for alt innhold du gjør tilgjengelig via Minecraft. + • Ved å gjøre innholdet tilgjengelig garanterer du at du har full rett til det i henhold til disse Vilkårene, og du anerkjenner at vi har rett til å utøve rettighetene du har gitt oss under disse Vilkårene. + • Dersom vi blir utfordret, truet eller saksøkt av noen på grunn av innhold du har gjort tilgjengelig via Minecraft eller gjøres tilgjengelig av noen på eller via Minecraft, kan det bli fjernet, og du kan bli holdt ansvarlig, hvilket innebærer at du kan måtte betale oss tilbake for eventuelle skader vi lider som følge av dette. I tillegg kan din tilgang til visse deler av Minecraft bli fjernet eller avbrutt. + BRUKERINNHOLD + I det følgende opptegnes noen vilkår for både Ditt innhold og innhold som gjøres tilgjengelig av andre, og som simpelthen omtales som "Brukerinnhold". Minecraft er en underholdningstjeneste og i tilknytning til dette er vi (og våre lisenshavere, som Sony Computer Entertainment) involvert i overføring, distribusjon, lagring og innhenting av Brukerinnhold uten at dette innholdet undersøkes, velges ut eller redigeres. Ettersom vi ikke går igjennom Brukerinnholdet, vet vi ikke hva som sendes rundt av deg eller andre. Vi har disse reglene i Vilkårene for at du og andre skal følge dem, men vi kan ikke vite alt som foregår. + Merk derfor følgende: + • Synspunktene som uttrykkes i Brukerinnhold, tilhører den enkelte forfatter og ikke oss eller noen tilknyttet oss med mindre annet er spesifisert. + • Vi er ikke ansvarlige for (og gir ingen garanti eller representasjon i tilknytning til og fraskriver oss alt ansvar for) alt Brukerinnhold, inklusiv kommentarer, synspunkter eller bemerkninger i det. + • Ved å bruke Minecraft anerkjenner du at vi ikke har noe ansvar for å gå gjennom Brukerinnhold og at alt Brukerinnhold gjøres tilgjengelig med det utgangspunkt at vi ikke trenger å gå gjennom det eller verken kontrollere eller bedømme det. + LIKEFULLT kan vi (eller våre lisenshavere, som Sony Computer Entertainment) fjerne, avvise eller nekte tilgang til ethvert Brukerinnhold og nekte deg å poste, tilgjengeliggjøre eller få tilgang til Brukerinnhold – inklusiv å fjerne eller nekte deg tilgang til Minecraft eller "PSN" hvis vi anser at det er hensiktsmessig, for eksempel hvis du har brutt disse Vilkårene eller vi får inn en klage. Vi vil også raskt fjerne eller deaktivere tilgang til Brukerinnhold hvis og når vi har faktisk kjennskap til at det er ulovlig. + OPPGRADERINGER + • Fra tid til annen kan det hende vi tilgjengeliggjør oppgraderinger og oppdateringer, men dette er ikke noe vi er forpliktet til. Vi er heller ikke forpliktet til å sørge for kontinuerlig støtte for eller vedlikehold av noen spill. Vi håper selvsagt å fortsatt kunne gi ut nye oppdateringer til Minecraft, men vi kan ikke garantere det. + VÅRT ANSVAR + • Når du får en kopi av Minecraft, tilbyr vi det "slik det er". Oppdateringer og oppgraderinger tilbys også "slik de er". Dette betyr at vi ikke gir deg noen løfter vedrørende standarden eller kvaliteten på Minecraft eller garanterer at Minecraft vil fungere uavbrutt eller feilfritt, og vi er ikke ansvarlig for eventuelle tap det kan forårsake. Vi lover kun at vi har laget Minecraft og de tilknyttede tjenestene med rimelig ferdighet og omhu. Loven i de fleste land sier at vi ikke kan fraskrive oss ansvaret for dødsfall eller personskader som følge av uaktsomhet fra vår side, så hvis datamaskinen din reiser seg og stikker deg ned på grunn av en feil vi har gjort, tar vi det på vår kappe. + VI ER IKKE ANSVARLIGE FOR: + • DIN ELLER ANDRES BRUK ELLER MISBRUK AV MINECRAFT + • INNHOLD SOM GJØRES TILGJENGELIG AV DEG UNDER BRUK AV MINECRAFT + • BRUDD PÅ DISSE VILKÅRENE AV DEG + • BRUDD PÅ NOEN VILKÅR AV ANDRE PERSONER + OPPHEVELSE + • Hvis vi vil, kan vi oppheve din rett til å bruke Minecraft dersom du ikke overholder disse Vilkårene. Du kan også oppheve den, når som helst – det er bare å avinstallere Minecraft fra PlayStation®Vita-systemet ditt. Uansett vil paragrafene om "Eierskap av Minecraft", "Vårt ansvar" og "Generelt" fortsette å gjelde selv etter opphevelsen. + GENERELT + • Disse Vilkårene er underlagt eventuelle juridiske rettigheter du måtte ha. Ingenting i disse Vilkårene vil begrense noen av dine rettigheter som i henhold til loven ikke kan ekskluderes, og de skal heller ikke ekskludere eller begrense vårt ansvar for dødsfall eller personskader som følge av uaktsomhet eller uredelighet fra vår side. + • Det kan hende vi gjør endringer i disse Vilkårene fra tid til annen, men disse endringene vil kun være gjeldende i den grad de er juridisk gyldige. Dersom du for eksempel bare bruker Minecraft i enkeltspillermodus og ikke bruker oppdateringene eller de delene av Minecraft som krever våre kontinuerlige onlinetjenester, vil den gamle EULA gjelde, men hvis du bruker oppdateringene eller de delene av Minecraft som krever våre kontinuerlige onlinetjenester, vil den nye EULA gjelde. I så fall vil vi kanskje ikke (være i stand til å) underrette deg om endringene før de trer i kraft, så du bør undersøke Vilkårene fra tid til annen slik at du er oppdatert om eventuelle endringer. Vi er ikke urettferdige i dette henseende, men i blant kommer det lovendringer eller noen gjør noe som påvirker andre brukere av Minecraft, og som vi må håndtere. + • Dersom du henvender deg til oss med forslag til Minecraft eller et av våre andre spill, gir du oss dette forslaget gratis. Det betyr at vi kan benytte oss av forslaget på den måten vi måtte ønske, uten å måtte betale deg for det. Hvis du tror du har et forslag som vi er villige til å betale for, må du si i fra at du forventer betaling før du gir oss forslaget. + • I tillegg til disse Vilkårene har vi også noen retningslinjer for bruk av varemerker og aktiva som du kan finne på nettet. + • Dersom du bryter disse reglene, kan vi (eller Sony Computer Entertainment) hindre deg i å bruke Minecraft. Om du ikke vil eller kan godta disse reglene, må du ikke kjøpe, laste ned, bruke eller spille Minecraft. + Dersom du har spørsmål av juridisk art som ikke er dekket på denne siden, må du spørre oss om det. Så lenge du ikke gjør noe tåpelig, gjør ikke vi det heller. + Vi er: + Mojang AB + Maria Skolgata 83, + SE-11853 + Stockholm + Sverige + Organisasjonsnummer: 556819-2388 + + + + + Alt innhold som kjøpes i butikker i spillet, kjøper du av Sony Network Entertainment Europe Limited ("SNEE") og er underlagt Sony Entertainment Network tjenestevilkår og brukeravtale som du finner på PlayStation®Store. Vennligst undersøk brukerrettighetene for hvert enkelt kjøp, ettersom disse kan variere fra vare til vare. Dersom ikke annet er angitt, har innhold som kjøpes i butikker i spillet, samme aldersgrense som selve spillet. + + + + + Kjøp og bruk av varene er underlagt Networks tjenestevilkår og brukeravtale. Denne onlinetjenesten underlisensieres til deg av Sony Computer Entertainment America. + + + + Husk: Bruk av denne programvaren er underlagt bruksvilkårene for programvare på eu.playstation.com/legal. + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/no-NO/stringsDynafont.xml b/Minecraft.Client/PSVitaMedia/loc/no-NO/stringsDynafont.xml new file mode 100644 index 00000000..dca31ec2 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/no-NO/stringsDynafont.xml @@ -0,0 +1,7 @@ + + + + DynaFont developed by DynaComware. + + + \ 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 new file mode 100644 index 00000000..58e63f05 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/no-NO/stringsGeneric.xml @@ -0,0 +1,6935 @@ + + + + Bytter til offlinespill + + + Vent litt mens verten lagrer spillet + + + Entrer Slutten + + + Lagrer spillere + + + Kobler til vert + + + Laster ned terreng + + + Forlater Slutten + + + 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. + + + 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. + + + Laster inn nivå + + + Fullfører ... + + + Bygger terreng + + + Simulerer verdenen litt + + + Rang + + + Forbereder lagring av nivå + + + Forbereder segmenter ... + + + Initialiserer server + + + Forlater underverdenen + + + Gjenoppstår + + + Genererer nivå + + + Genererer startpunkt + + + Laster inn startpunkt + + + Går ned i underverdenen + + + Verktøy og våpen + + + Gamma + + + Spillfølsomhet + + + Grensesnittfølsomhet + + + Vanskelighetsgrad + + + Musikk + + + Lyd + + + Fredelig + + + 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. + + + Lett + + + Normal + + + Vanskelig + + + Logget ut + + + Rustning + + + Mekanismer + + + Transport + + + Våpen + + + Mat + + + Byggverk + + + Dekorasjoner + + + Brygging + + + Verktøy, våpen og rustning + + + Materialer + + + Byggeblokker + + + Rødstein og transport + + + Diverse + + + Oppføringer: + + + 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. + + + 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 + + + Opprett ny verden + + + Skriv inn et navn på verdenen din. + + + Angi seeden for verdensgenerering + + + Last inn lagret verden + + + Spill opplæring + + + Opplæring + + + Gi verdenen navn + + + Skadet lagring + + + OK + + + Avbryt + + + Minecraft-butikken + + + Roter + + + Gjem deg + + + Tøm alle felter + + + 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. + + + 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 + + + Avslutt spill + + + Lagre spill + + + Avslutte uten å lagre + + + Trykk på START for å bli med i spill + + + 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 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! + + + Du spiller prøveversjonen, og du må ha fullversjonen for å kunne lagre spillet. +Vil du låse opp fullversjonen av spillet nå? + + + Venner + + + Min poengsum + + + Totalt + + + Vent litt + + + Ingen resultater + + + Filter: + + + Du kan ikke bli med i dette spillet fordi spilleren du prøver å slutte deg til, har en eldre versjon av spillet. + + + Forbindelse brutt. + + + Forbindelsen til serveren er brutt. Går tilbake til hovedmenyen. + + + Koblet fra serveren. + + + Avslutter spillet + + + Det har oppstått en feil. Går tilbake til hovedmenyen. + + + Tilkobling mislyktes. + + + Du ble sparket ut av spillet. + + + 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 ble sparket ut av spillet for å ha flydd. + + + Tilkoblingen tok for lang tid. + + + Serveren er full. + + + 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! + + + Temaer + + + Skallpakker + + + Tillat venner av venner + + + Spark ut spiller + + + Er du sikker på at du vil sparke ut denne spilleren fra spillet? Vedkommende vil ikke kunne bli med igjen før du starter verdenen på nytt. + + + Spillerbildepakker + + + Du kan ikke bli med i dette spillet fordi det er begrenset til spillere som er venn med verten. + + + 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. + + + Kan ikke bli med i spill + + + Valgt + + + Valgt skall: + + + Last ned fullversjon + + + 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 + + + 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å? + + + 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? + + + 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 + + + Teksturpakke finnes ikke + + + Lås opp fullversjon + + + Last ned prøveversjon + + + Spillmodusen er endret. + + + 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. + + + Normal + + + Superflat + + + Når dette er aktivert, blir spillet et onlinespill. + + + 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, 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. + + + 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. + + + Av + + + Spillmodus: Kreativ + + + Overlevelse + + + Kreativ + + + Gi nytt navn til verden + + + Skriv inn det nye navnet på verdenen din. + + + Spillmodus: Overlevelse + + + Laget i overlevelsesmodus + + + Endre navn på lagring + + + Automatisk lagring om %d ... + + + + + + Laget i kreativ modus + + + Vis skyer + + + Hva vil du gjøre med denne lagringen? + + + HUD-størrelse (delt skjerm) + + + Ingrediens + + + Brensel + + + Dispenser + + + Kiste + + + Fortrylle + + + Smelteovn + + + Det er for øyeblikket ingen tilbud på nedlastbart innhold av denne typen til dette spillet. + + + Er du sikker på at du vil slette denne lagringen? + + + Venter på godkjenning + + + Sensurert + + + %s har blitt med i spillet. + + + %s har forlatt spillet. + + + %s ble sparket ut fra spillet. + + + Bryggeapparat + + + Skriv inn skilttekst + + + Skriv inn tekst som skal vises på skiltet ditt. + + + Skriv inn tittel + + + Prøveperioden er over + + + Spillet er fullt + + + Kunne ikke bli med i spillet fordi det ikke var flere plasser igjen. + + + Skriv inn en tittel på innlegget ditt. + + + Skriv inn en beskrivelse for innlegget ditt. + + + Inventar + + + Ingredienser + + + Skriv inn bildetekst + + + Skriv inn en bildetekst for innlegget ditt. + + + Skriv inn beskrivelse + + + Spiller nå: + + + 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 + + + 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? + + + Intervall for automatisk lagring: AV + + + Gjennomsiktighet for grensesnitt + + + Gjør klart til automatisk lagring av nivå + + + HUD-størrelse + + + 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. + + + Favorittskall + + + %s sitt spill + + + Ukjent vertsspill + + + Gjest logget ut + + + Tilbakestill innstillinger + + + Er du sikker på at du vil tilbakestille innstillingene til standardverdiene? + + + Innlastingsfeil + + + En gjestespiller har logget ut, slik at alle gjestespillere er fjernet fra spillet. + + + Kunne ikke opprette spill + + + Automatisk valgt + + + Ingen pakke: Standardskall + + + Logg inn + + + Du er ikke logget inn, noe du må være for å kunne spille. Vil du logge inn nå? + + + Flerspiller ikke tillatt + + + Drikk + + + + 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 mer informasjon om gårdsdrift.{*B*} + Trykk på {*CONTROLLER_VK_B*} hvis du allerede kan det som er å kunne om gårdsdrift. + + + + 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. + + + 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. + + + 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. + + + + 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. + + + + + Rødsteinstøv samles ved å utvinne fra rødsteinmalm med en jern-, diamant- eller gullhakke. Støvet kan brukes til å transportere kraft i opptil 15 blokker, og det kan bevege seg én blokkhøyde opp eller ned. + {*ICON*}331{*/ICON*} + + + + + Rødsteinrepeatere kan brukes til å øke avstanden kraften kan transporteres, eller til å legge inn en forsinkelse i en krets. + {*ICON*}356{*/ICON*} + + + + + 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*} + + + + + Portaler lages ved å plassere obsidianblokker i en ramme som er fire blokker bred og fem blokker høy. Hjørneblokker trengs ikke. + + + + + Underverdenen kan også brukes til å hurtigreise i oververdenen – én blokk i underverdenen tilsvarer tre i oververdenen. + + + + + Du er nå i kreativ modus. + + + + {*B*} + Trykk på {*CONTROLLER_VK_A*} for mer informasjon om kreativ modus.{*B*} + Trykk på {*CONTROLLER_VK_B*} hvis du allerede kan det som er å kunne om kreativ modus. + + + + + 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. + + + + 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. + + + + {*B*} + Trykk på {*CONTROLLER_VK_A*} for å få mer informasjon om dyreavl.{*B*} + Trykk på {*CONTROLLER_VK_B*} hvis du allerede kan det som er å kunne om dyreavl. + + + + For å avle frem dyr må du fôre dem riktig slik at de går inn i en "elskovsmodus". + + + 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. + + + + Du har nå fullført opplæringen for dyreavl. + + + + I dette området er det noen gresskar og blokker som kan brukes til å lage en snøgolem eller jerngolem. + + + + + 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. + + + + + 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. + + + + {*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*}. + + + + + Bruk en eliksir med ildmotstand på deg selv. + + + + + 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. + + + + + 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. + + + + + Her er det et bryggeapparat, en gryte og en kiste full av bryggegjenstander. + + + + + 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. + + + + + 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. + + + + Gratulerer, du har nå fullført opplæringen. Tiden i spillet går nå som normalt, og det er ikke lenge til det er natt og monstrene kommer ut! Gjør ferdig tilfluktsstedet ditt! + + + + {*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. + + + {*B*}Trykk på {*CONTROLLER_VK_A*} for å spille gjennom opplæringen som vanlig.{*B*} + Trykk på {*CONTROLLER_VK_B*} for å hoppe over hovedopplæringen. + + + {*B*} + Trykk på {*CONTROLLER_VK_A*} for mer informasjon om matlinjen og spising.{*B*} + Trykk på {*CONTROLLER_VK_B*} hvis du allerede kan det som er å kunne om matlinjen og spising. + + + + Velg + + + Bruk + + + 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. + + + + Ta + + + Neste + + + Forrige + + + Spark ut spiller + + + Send venneforespørsel + + + En side ned + + + En side opp + + + Farg + + + Helbred + + + Sitt + + + Følg meg + + + Utvinn + + + Fôr + + + Tem + + + Endre filter + + + Plasser alle + + + Plasser én + + + Slipp + + + Ta alle + + + Ta halvparten + + + Plasser + + + Slipp alle + + + Fjern hurtigvalg + + + Hva er dette? + + + Del på Facebook + + + Slipp én + + + Bytt + + + Hurtigflytting + + + Skallpakker + + + Rødfarget glassrute + + + Grønnfarget glassrute + + + Brunfarget glassrute + + + Hvitfarget glass + + + Farget glassrute + + + Sortfarget glassrute + + + Blåfarget glassrute + + + Gråfarget glassrute + + + Rosafarget glassrute + + + Limefarget glassrute + + + Lillafarget glassrute + + + Cyanfarget glassrute + + + Lysegråfarget glassrute + + + Oransjefarget glass + + + Blåfarget glass + + + Lillafarget glass + + + Cyanfarget glass + + + Rødfarget glass + + + Grønnfarget glass + + + Brunfarget glass + + + Lysegråfarget glass + + + Gulfarget glass + + + Lysblåfarget glass + + + Magentafarget glass + + + Gråfarget glass + + + Rosafarget glass + + + Limefarget glass + + + Gulfarget glassrute + + + Lysegrå + + + Grå + + + Rosa + + + Blå + + + Lilla + + + Cyan + + + Lime + + + Oransje + + + Hvit + + + Tilpasset + + + Gul + + + Lyseblå + + + Magenta + + + Brun + + + Hvitfarget glassrute + + + Liten ball + + + Stor ball + + + Lyseblåfarget glassrute + + + Magentafarget glassrute + + + Oransjefarget glassrute + + + Stjerneformet + + + Sort + + + Rød + + + Grønn + + + Smygerformet + + + Sprengning + + + Ukjent form + + + Sortfarget glass + + + Hesterustning av jern + + + 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. + + + +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*} +{*C3*}Hvem er vi? En gang i tiden ble vi kalt åndene fra fjellet. Fader sol og moder måne. Nedarvede ånder, dyreånder. Djinn. Gjenferd. Den grønne mannen. Så guder, demoner, engler, poltergeister. Utenomjordiske, kosmiske. Leptoner, kvarker. Ordene endrer seg, men det gjør ikke vi.{*EF*}{*B*}{*B*} +{*C2*}Vi er universet. Vi er alt du tror du ikke er. Du ser på oss nå, gjennom huden og gjennom øynene. Og hvorfor berører universet huden din og kaster lys på deg? For å se deg, spilleren. For å bli kjent med deg, og gjøre seg kjent. Jeg skal fortelle deg en historie.{*EF*}{*B*}{*B*} +{*C2*}Det var en gang en spiller.{*EF*}{*B*}{*B*} +{*C3*}Og den spilleren var deg, {*PLAYER*}.{*EF*}{*B*}{*B*} +{*C2*}Noen ganger så den på seg selv som et menneske, på den tynne skorpen av en snurrende klode av smeltet stein. Denne kloden av smeltet stein dreide rundt en kule av brennende gass som var 330 000 ganger mer massiv. De var så langt fra hverandre at det tok åtte minutter for lyset å nå frem. Lyset var informasjon fra en stjerne, og den kunne svi huden din fra 150 millioner kilometers avstand.{*EF*}{*B*}{*B*} +{*C2*}Noen ganger drømte spilleren at den var en gruvearbeider, i en verden som var flat og uendelig. Solen var en hvit firkant, og dagene var korte. Det var mye å gjøre, og døden var en midlertidig ubeleilighet.{*EF*}{*B*}{*B*} +{*C3*}Noen ganger drømte spilleren at den var fortapt i historien.{*EF*}{*B*}{*B*} +{*C2*}Noen ganger drømte spilleren at den var andre ting, på andre steder. Noen ganger var disse drømmene foruroligende, andre ganger vakre. Noen ganger våknet spilleren fra én drøm og forsvant inn i en annen, og deretter videre inn i en tredje.{*EF*}{*B*}{*B*} +{*C3*}Noen ganger drømte spilleren at den så på ord på en skjerm.{*EF*}{*B*}{*B*} +{*C2*}La oss gå litt tilbake i tid.{*EF*}{*B*}{*B*} +{*C2*}Spillerens atomer var spredt i gresset, i elvene, i luften og i jorden. En kvinne samlet disse atomene, hun drakk, åt og inhalerte dem, og så satte kvinnen spilleren sammen – i sin egen kropp.{*EF*}{*B*}{*B*} +{*C2*}Og spilleren våknet, fra den varme, mørke verdenen i sin mors kropp, og gikk inn i den lange drømmen.{*EF*}{*B*}{*B*} +{*C2*}Og spilleren var en ny historie, som aldri var blitt fortalt før, skrevet i DNA-ets bokstaver. Og spilleren var et nytt program, som aldri var blitt kjørt før, generert av en kildekode som var en milliard år gammel. Og spilleren var et nytt menneske, som aldri hadde levd før, laget utelukkende av melk og kjærlighet.{*EF*}{*B*}{*B*} +{*C3*}Du er spilleren, historien, programmet, og mennesket. Laget utelukkende av melk og kjærlighet.{*EF*}{*B*}{*B*} +{*C2*}La oss gå lenger tilbake i tid.{*EF*}{*B*}{*B*} +{*C2*}De syv milliarder milliarder milliarder atomene i spillerens kropp ble skapt i hjertet av en stjerne, lenge før dette spillet. Så også spilleren er informasjon fra en stjerne. Og spilleren beveger seg gjennom en historie, som er en skog av informasjon plantet av en mann kalt Julian, i en flat, uendelig verden skapt av en mann kalt Markus, som eksisterer i en liten, privat verden skapt av spilleren, som bor i et univers skapt av ...{*EF*}{*B*}{*B*} +{*C3*}Hysj nå. Noen ganger skapte spilleren en liten, privat verden som var myk og varm og enkel. Andre ganger var den hard og kald og komplisert. I blant bygget spilleren en modell av universet i hodet, flekker av energi som beveget seg frem gjennom store, tomme rom. I blant kalte den disse flekkene for "elektroner" og "protoner".{*EF*}{*B*}{*B*} + + + + +{*C2*}Noen ganger kalte den dem "planeter" og "stjerner".{*EF*}{*B*}{*B*} +{*C2*}Noen ganger trodde den at den var i et univers laget av positiv og negativ energi, laget av nuller og enere og kodelinjer. Noen ganger trodde den at den spilte et spill. Og noen ganger trodde den at den leste ord på en skjerm.{*EF*}{*B*}{*B*} +{*C3*}Du er spilleren – som leser ordene ...{*EF*}{*B*}{*B*} +{*C2*}Hysj nå ... Noen ganger leste spilleren kodelinjer på en skjerm. Dechiffrerte dem til ord, dechiffrerte ord til betydning, dechiffrerte betydning til følelser, teorier og ideer, og da begynte spilleren å puste fortere og dypere og innså at den levde. Spilleren levde, og de tusenvis av dødsfallene hadde ikke vært ekte. Spilleren levde.{*EF*}{*B*}{*B*} +{*C3*}Du. Du. Du lever.{*EF*}{*B*}{*B*} +{*C2*}Og noen ganger trodde spilleren at universet hadde snakket til den via sollyset som kom gjennom bladene på sommertrærne.{*EF*}{*B*}{*B*} +{*C3*}Og noen ganger trodde spilleren at universet hadde snakket til den via lyset fra en klar vinternatthimmel, der en lysflekk i øyekroken kan være en stjerne en million ganger mer massiv enn solen, som koker sine planeter til plasma for å kunne synes et øyeblikk for spilleren, som var på vei hjem på den andre siden av universet og plutselig kjente duften av mat, nesten fremme ved døren, slik at den kunne drømme igjen.{*EF*}{*B*}{*B*} +{*C2*}Og noen ganger trodde spilleren at universet hadde snakket til den via nuller og enere, via elektrisiteten i verden, via ordene som ruller over en skjerm på slutten av en drøm.{*EF*}{*B*}{*B*} +{*C3*}Og universet sa "jeg elsker deg".{*EF*}{*B*}{*B*} +{*C2*}Og universet sa "du har spilt godt".{*EF*}{*B*}{*B*} +{*C3*}Og universet sa "alt du trenger, har du i deg".{*EF*}{*B*}{*B*} +{*C2*}Og universet sa "du er sterkere enn du tror".{*EF*}{*B*}{*B*} +{*C3*}Og universet sa "du er dagslyset".{*EF*}{*B*}{*B*} +{*C2*}Og universet sa "du er natten".{*EF*}{*B*}{*B*} +{*C3*}Og universet sa "mørket du kjemper mot, er i deg".{*EF*}{*B*}{*B*} +{*C2*}Og universet sa "lyset du søker, er i deg".{*EF*}{*B*}{*B*} +{*C3*}Og universet sa "du er ikke alene".{*EF*}{*B*}{*B*} +{*C2*}Og universet sa "du er ikke adskilt fra alle andre ting".{*EF*}{*B*}{*B*} +{*C3*}Og universet sa "du er universet som smaker på seg selv, snakker med seg selv og leser sin egen kode".{*EF*}{*B*}{*B*} +{*C2*}Og universet sa "jeg elsker deg fordi du er kjærligheten".{*EF*}{*B*}{*B*} +{*C3*}Så var spillet over, og spilleren våknet fra drømmen. Og spilleren begynte en ny drøm. Og spilleren drømte igjen, drømte bedre. Og spilleren var universet. Og spilleren var kjærligheten.{*EF*}{*B*}{*B*} +{*C3*}Du er spilleren.{*EF*}{*B*}{*B*} +{*C2*}Våkn opp.{*EF*} + + + + 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 + + + Ikke tilbakestill underverdenen + + + Kan ikke klippe denne soppkua. Det maksimale antallet griser, sauer, kuer, katter og hester er nådd. + + + Du døde! + + + Verdensinnstillinger + + + Kan bygge og utvinne + + + Kan bruke dører og brytere + + + Generer byggverk + + + Superflat verden + + + Bonuskiste + + + Kan åpne beholdere + + + Spark ut spiller + + + Kan fly + + + 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 + + + Lyssignaler + + + {*T3*}SLIK SPILLER DU: LYSSIGNALER{*ETW*}{*B*}{*B*} +Aktive lyssignaler sender en sterk lysstråle mot himmelen og gir krefter til spillere i nærheten.{*B*} +De utformes med glass, obsidian og underverdenstjerner, som du kan skaffe deg ved å beseire Wither.{*B*}{*B*} +Lyssignaler må plasseres slik at de er i sollys om dagen. De må plasseres på pyramider av jern, gull, smaragd eller diamant.{*B*} +Men materialet som lyssignalet plasseres på, har ingen innvirkning på lyssignalets styrke.{*B*}{*B*} +I lyssignalmenyen kan du velge én hovedkraft for lyssignalet ditt. Desto flere nivå pyramiden din har, jo flere krefter får du å velge mellom.{*B*} +Et lyssignal på en pyramide med minst fire nivåer gir deg også enten den sekundære kraften Regenerasjon eller en sterkere hovedkraft.{*B*}{*B*} +For å angi kreftene til lyssignalet må du ofre en smaragd, diamant, gullbarre eller jernbarre i betalingsplassen.{*B*} +Når kreftene er angitt, vil de for alltid stråle ut av lyssignalet.{*B*} + + + Fyrverkeri + + + Språk + + + Hester + + + {*T3*}SLIK SPILLER DU: HESTER{*ETW*}{*B*}{*B*} +Hester og esler finner du hovedsakelig på åpne sletter. Et muldyr er avkommet til et esel og en hest, men er selv ikke fruktbar.{*B*} +Alle voksne hester, esler og muldyr kan ris, men bare hester kan pansres, og bare muldyr og esler kan utstyres med saltasker for frakt av gjenstander.{*B*}{*B*} +Hester, esler og muldyr må temmes før de kan brukes. For å temme en hest må spilleren forsøke å ri på den, og klare å holde seg på hesten mens den prøver å kaste ham av.{*B*} +Når det dukker opp kjærlighetshjerter rundt hesten, er den tam, og den vil ikke lenger forsøke å kaste spilleren av. For å styre en hest må spilleren utstyre den med sal.{*B*}{*B*} +Saler kan kjøpes fra landsbyboere eller finnes i kister som er skjult i verdenen.{*B*} +For å utstyre tamme esler og muldyr med saltasker kan du bøye deg ned og feste en kiste. Disse saltaskene får du så tilgang til mens du rir eller bøyer deg ned.{*B*}{*B*} +Hester og esler (men ikke muldyr) kan avles som andre dyr med gullepler eller gullrøtter.{*B*} +Føll vokser og blir med tiden voksne hester, og du kan øke hastigheten på dette ved å gi dem hvete eller høy.{*B*} + + + {*T3*}SLIK SPILLER DU: FYRVERKERI{*ETW*}{*B*}{*B*} +Fyrverkeri er dekorative gjenstander som skytes opp med hendene eller fra dispensere. Fyrverkeri utformes med papir, krutt og om ønskelig ulike fyrverkeristjerner.{*B*} +Fyrverkeristjernenes farger, uttoning, form, størrelse og effekter (slik som spor og funkling) kan tilpasses ved å bruke tilleggsingredienser under utformingen.{*B*}{*B*} +For å utforme fyrverkeri plasserer du krutt og papir i 3x3-utformingsnettet som vises over inventaret ditt.{*B*} +Hvis du ønsker, kan du plassere flere fyrverkeristjerner i utformingsnettet for å legge dem til fyrverkeriet.{*B*} +Fyller du flere plasser i utformingsnettet med krutt, øker høyden som alle fyrverkeristjernene eksploderer i.{*B*}{*B*} +Du kan deretter ta det ferdige fyrverkeriet ut av utgangsfeltet.{*B*}{*B*} +Fyrverkeristjerner utformes ved å plassere krutt og fargestoff i utformingsnettet.{*B*} +– Fargestoffet bestemmer fargen fyrverkeristjernen får når den eksploderer.{*B*} +– Formen på fyrverkeristjernen angis ved å legge til enten en ildladning, gullklump, fjær eller vesenhode.{*B*} +– Spor eller funkling kan legges til ved å bruke diamanter eller glødesteinstøv.{*B*}{*B*} +Når en fyrverkeristjerne er ferdig utformet, kan du angi fyrverkeristjernens uttoningsfarge ved å utforme den med fargestoff. + + + + {*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. + + + 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. + + + Slippes av Wither, brukes til å utforme lyssignaler. + + + Trakter + + + {*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*} + + + Droppere + + + + + + Øyeblikkelig helse + + + Øyeblikkelig skade + + + Hoppstyrke + + + Utmattethet + + + Styrke + + + Svakhet + + + Kvalme + + + + + + + + + + + + Regenerasjon + + + Motstand + + + Finner seed for verdensgenerator + + + Når dette er aktivert, skapes det fargerike eksplosjoner. Fargen, effekten, formen og toningen avgjøres av fyrverkeristjernen som brukes når fyrverket skapes. + + + En type skinne som kan aktivere eller deaktivere gruvevogner med trakt og utløse gruvevogner med TNT. + + + Brukes til å holde og slippe gjenstander, eller dytte gjenstander inn i en annen beholder når den gis en rødsteinladning. + + + Fargerike blokker som utformes ved å farge herdet leire + + + 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 + + + Sult + + + for treghet + + + for hurtighet + + + Usynlighet + + + Pusting i vann + + + Nattsyn + + + Blindhet + + + for skade + + + for helbredelse + + + for kvalme + + + for regenerasjon + + + for utmattethet + + + for hastverk + + + for svakhet + + + for styrke + + + Ildmotstand + + + Metning + + + for motstand + + + for hopping + + + Wither + + + Helseboost + + + Absorbering + + + + + + II + + + 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 + + + Verdslig + + + Uinteressant + + + Flott + + + Saftig + + + Sjarmerende + + + Elegant + + + Fornem + + + Sprudlende + + + 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 + + + Utdrivelse + + + Skarphet + + + Reduserer helsen til berørte spillere, dyr og monstre over tid. + + + Angrepsskade + + + Tilbakeslag + + + Leddyrets skrekk + + + Hastighet + + + Zombie-forsterkninger + + + Hestens hoppestyrke + + + Når dette brukes: + + + Tilbakeslagmotstand + + + Vesenrekkevidde + + + Maksimal helse + + + Silkeberøring + + + Effektivitet + + + Vannmann + + + Hell + + + Plyndring + + + Uknuselig + + + Brannbeskyttelse + + + Beskyttelse + + + Ild + + + Fjærfall + + + Respirasjon + + + Prosjektilbeskyttelse + + + Eksplosjonsbeskyttelse + + + IV + + + V + + + VI + + + Tilbakeslag + + + VII + + + III + + + Flamme + + + Kraft + + + Uendelig + + + II + + + I + + + Aktiveres når noen går gjennom en tilkoblet snubletråd. + + + Aktiverer en tilkoblet snubletrådkrok når noen passerer gjennom. + + + En kompakt måte å lagre smaragder på. + + + Likner på en vanlig kiste, bortsett fra at ting som plasseres i en enderkiste er tilgjengelig i alle spillerens enderkister, selv i forskjellige dimensjoner. + + + IX + + + VIII + + + Kan utvinnes med en hakke eller bedre for å skaffe smaragder. + + + 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. + + + 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*}. Å spise dette kan gi deg matforgiftning. + + + Brukes til å kontrollere en gris med sal når du rir på den. + + + Gir deg 3 {*ICON_SHANK_01*}. Lages ved å tilberede en potet i en smelteovn. + + + Gir deg 3 {*ICON_SHANK_01*}. Lages av en gulrot og gullklumper. + + + Brukes med en ambolt for å fortrylle våpen, verktøy eller rustninger. + + + Laget ved å utvinne underkvartsmalm. Kan brukes til å lage en kvartsblokk. + + + Potet + + + Bakt potet + + + Gulrot + + + Laget av ull. Brukes som dekorasjon. + + + Smaragd + + + Blomsterpotte + + + Gresskarpai + + + Fortryllet bok + + + Giftig potet + + + Gullgulrot + + + Gulrot på pinne + + + Snubletrådkrok + + + Snubletråd + + + Underkvarts + + + Smaragdmalm + + + Enderkiste + + + Brosteinmur med mose + + + Smaragdblokk + + + Brosteinmur + + + Poteter + + + Blomsterpotte + + + Gulrøtter + + + Litt skadet ambolt + + + Ambolt + + + Ambolt + + + Kvartsblokk + + + Meget skadet ambolt + + + Underkvartsmalm + + + Kvartstrapp + + + Meislet kvartsblokk + + + Søyle av underkvarts + + + Rødt teppe + + + Teppe + + + Svart teppe + + + Blått teppe + + + Grønt teppe + + + Brunt teppe + + + Lilla teppe + + + Cyanfarget teppe + + + Lysegrått teppe + + + Grått teppe + + + Limefarget teppe + + + Rosa teppe + + + Lyseblått teppe + + + Gult teppe + + + Magentafarget teppe + + + Oransje teppe + + + Hvitt teppe + + + Meislet 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. + + + {*PLAYER*} teleporterte deg til sin posisjon + + + Teleporterte {*PLAYER*} til {*DESTINATION*} + + + Torner + + + {*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 + + + For dyrt! + + + Fortryllingskostnad: %d + + + Du har: + + + Gi nytt navn + + + {*VILLAGER_TYPE*} tilbyr %s + + + Påkrevd for handel + + + Bytt + + + 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. + + + + + {*B*} + Trykk på {*CONTROLLER_VK_A*} for å få vite mer om amboltgrensesnittet.{*B*} + Trykk på {*CONTROLLER_VK_B*} hvis du allerede vet hvordan du bruker amboltgrensesnittet. + + + + + Alternativt kan du plassere en identisk gjenstand i det andre feltet for å kombinere de to gjenstandene. + + + + + Når de riktige råmaterialene plasseres på det andre inngangsfeltet (for eksempel jernbarrer for et skadd jernsverd), vises foreslått reparasjon i utgangsfeltet. + + + + + 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. + + + + + Når du plukker opp den reparerte gjenstanden, bruker du opp begge gjenstandene som brukes av ambolten og reduserer erfaringsnivået med gitt antall. + + + + + Det er mulig å gi nytt navn til en gjenstand ved å redigere navnet som vises i tekstboksen. + + + + + {*B*} + Trykk på {*CONTROLLER_VK_A*} for å få vite mer om ambolten.{*B*} + Trykk på {*CONTROLLER_VK_B*} hvis du allerede vet hvordan du bruker ambolten. + + + + + I dette området er det en ambolt og en kiste som inneholder verktøy og våpen du kan jobbe med. + + + + + Fortryllede bøker finner du i kister i huler. Det kan også være vanlige bøker som er fortryllet på fortryllelsesbordet. + + + + + 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. + + + + + 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. + + + + + Det koster erfaringsnivåer å bruke ambolten, og hver gang du bruker den, kan den bli skadet. + + + + + I kisten i dette området finner du skadde hakker, råmaterialer, flasker med fortryllelse, og fortryllede bøker å eksperimentere med. + + + + + Når du gir noe nytt navn, endrer du navnet for alle spillere og reduserer arbeidskostnaden på permanent basis. + + + + + {*B*} + Trykk på {*CONTROLLER_VK_A*} for å få vite mer om handelsgrensesnittet.{*B*} + Trykk på {*CONTROLLER_VK_B*} hvis du allerede vet hvordan du bruker handelsgrensesnittet. + + + + + Dette er handelsgrensesnittet som viser handel du kan utføre med en landsbyboer. + + + + + Handelsalternativer vises i rødt og er utilgjengelige hvis ikke du har gjenstandene som kreves. + + + + + All handel landsbyboeren er villig til å gjøre for øyeblikket vises øverst. + + + + + Du kan se totalt antall som kreves for handelen i de to boksene til venstre. + + + + + 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. + + + + + {*B*} + Trykk på {*CONTROLLER_VK_A*} for å få vite mer om handel.{*B*} + Trykk på {*CONTROLLER_VK_B*} hvis du allerede kan det du trenger om handel. + + + + + Når du har en blanding av yrker, vil de tilgjengelige byttene med landsbyboeren oppdateres. + + + + + Byttene en landsbyboer tilbyr avhenger av landsbyboerens yrke. + + + + + Bytter som er brukt ofte kan fjernes midlertidig, men landsbyboeren tilbyr alltid minst et bytte. + + + + + Ta litt papir fra kisten og prøv å bytte til deg noe fra landsbyboeren her. + + + + + I dette området er det to enderkister. + + + + + {*B*} + Trykk på {*CONTROLLER_VK_A*} for å få vite mer om enderkister.{*B*} + Trykk på {*CONTROLLER_VK_B*} hvis du allerede kan det du trenger om enderkister. + + + + + Alle enderkister i en verden er koblet sammen, selv på tvers av dimensjonene. Ting som plasseres i en enderkiste, er tilgjengelige i alle andre enderkister. + + + + + Men innholdet i enderkistene er forskjellig fra spiller til spiller. + + + + + På denne måten kan spillerne lagre ting i en hvilken som helst enderkiste og hente det ut igjen i en annen enderkiste et annet sted i verden. Du kan prøve dette nå ved å plassere ting i en enderkiste. + + + + Gir deg 2 {*ICON_SHANK_01*}, regenererer helse i 30 sekunder og gir beskyttelse mot ild og skade i fem minutter. Lages av et eple og gullblokker. + + + Kan teleportere + + + Teleporter + + + Teleporter til spiller + + + Teleporter til meg + + + Kan deaktivere utmattelse + + + Kan bli usynlig + + + Du kan nå aktivere usynlighet + + + Du kan ikke lenger aktivere usynlighet + + + Du kan nå aktivere flyging + + + Du kan ikke lenger aktivere flyging + + + Du kan nå deaktivere utmattelse + + + Du kan ikke lenger deaktivere utmattelse + + + Du kan nå teleportere + + + Du kan ikke lenger teleportere + + + {*T3*}SLIK SPILLER DU: AMBOLT{*ETW*}{*B*}{*B*} +Erfaringsnivåer kan brukes til å reparere, fortrylle eller gi ting nytt navn med ambolten.{*B*} +Alt kan gis nytt navn, men bare ting med holdbarhet kan repareres eller blir fortryllet med fortryllede bøker.{*B*} +En gjenstand kan repareres ved å plassere den i et av inngangsfeltene til venstre, sammen med enten råmaterialer, som jernbarrer til et jernsverd, eller kombineres med en annen gjenstand av samme type.{*B*} +Kombinasjon av gjenstander er mer effektivt når det gjøres med en ambolt, og i tillegg, hvis noen av gjenstandene er fortryllet, kan det hende at sluttproduktet også har fortryllelser.{*B*} +Fortryllede bøker kan fortrylle gjenstander ved å kombinere dem på en ambolt, hvis bokens fortryllelse passer. Fortryllede bøker finner du i kister i huler. Det kan også være vanlige bøker som har blitt fortryllet på fortryllelsesbordet.{*B*} +Det er en viss sjanse for at ambolten blir skadet når du bruker den, og når den har blitt brukt lenge nok, går den i stykker.{*B*} + + + {*T3*}SLIK SPILLER DU: HANDEL{*ETW*}{*B*}{*B*} +Det er mulig å bytte gjenstander med landsbyboerne. Landsbyboerne har spesielle yrker. De kan være bønder, slaktere, smeder, bibliotekarer eller prester, og dette påvirker hva slags gjenstander de normalt bytter.{*B*} +Du kan finne en liste over alt de forskjellige landsbyboerne vil bytte bort i handelsmenyen. En landsbyboer kan modifisere eller legge til nye bytter når en spiller er i en byttehandel, men noen bytter kan bli midlertidig deaktivert hvis de brukes for ofte.{*B*} +Bytter dreier seg som oftest om å kjøpe eller selge gjenstander for smaragder.{*B*} +Hvis ikke du har noen av gjenstandene som kreves for et bytte, vises gjenstandene i rødt.{*B*} + + + + {*T3*}SLIK SPILLER DU: ENDERKISTER{*ETW*}{*B*}{*B*} +Alle enderkister i en verden henger sammen. Ting som plasseres i en enderkiste, er tilgjengelige i alle andre enderkister. Men innholdet i enderkistene er forskjellig fra spiller til spiller. På denne måten kan spillerne lagre ting i en hvilken som helst enderkiste og hente det ut igjen i en annen enderkiste et annet sted i verden. + + + + Bonde + + + Bibliotekar + + + Prest + + + Smed + + + Slakter + + + Landsbyboerne finner du som oftest i landsbyer, og de selger ting basert på yrket sitt. + + + Stor kiste + + + + Du kan også lage fortryllede bøker på fortryllelsesbordet, som kan brukes senere ved ambolten, hvis du vil bruke fortryllelsen på en gjenstand. + + + + + Snubletrådkroker gir også konstant energi til en krets mens noe aktiverer tråden mellom dem. + + + + + Når en ulv er temmet, har den alltid på seg halsbånd. Fargen på halsbåndet kan endres ved å farge det. + + + + Gulrøtter og poteter dyrkes ved å plante gulrøtter og poteter. De kan høstes når veksten er synlig over bakken. + + + + Griser kan settes sal på og ris på av spillerne. De kontrolleres ved å friste dem med en gulrot på pinne. + + + + + Ved behov kan du få gruvevognen til å gå sakte med {*CONTROLLER_ACTION_MOVE*}. Dette gjør at du kan få gruvevognen i gang på en kraftskinne. + + + + Du kan ikke bli med i dette spillet ettersom delt skjerm kun støttes i HD-modus. Logg ut med alle andre spillere hvis du vil bli med. + + + Kurer + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/no-NO/stringsLeaderboards.xml b/Minecraft.Client/PSVitaMedia/loc/no-NO/stringsLeaderboards.xml new file mode 100644 index 00000000..0c8b26f5 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/no-NO/stringsLeaderboards.xml @@ -0,0 +1,48 @@ + + + + Drap: Lett + + + Drap: Normal + + + Drap: Vanskelig + + + Utvinning: Fredelig + + + Utvinning: Lett + + + Utvinning: Normal + + + Utvinning: Vanskelig + + + Gårdsdrift: Fredelig + + + Gårdsdrift: Lett + + + Gårdsdrift: Normal + + + Gårdsdrift: Vanskelig + + + Reisedistanse: Fredelig + + + Reisedistanse: Lett + + + Reisedistanse: Normal + + + Reisedistanse: Vanskelig + + \ 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 new file mode 100644 index 00000000..60f30f4a --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/no-NO/stringsPlatformSpecific.xml @@ -0,0 +1,247 @@ + + + + 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. + + + 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å. + + + PlayStation®Vita-system + + + 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 + + + Endre nettverksmodus + + + 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*} +I kreativ modus kan alle gjenstander i spillet flyttes over til inventaret ditt uten at du trenger å utvinne eller utforme dem. +Gjenstandene i inventaret ditt vil heller ikke forsvinne når de plasseres eller brukes i verdenen, og dette gjør at du kan fokusere på å bygge i stedet for å samle ressurser.{*B*} +Hvis du oppretter, laster inn eller lagrer en verden i kreativ modus, vil trofeer og poengtavleoppdateringer være deaktivert for denne verdenen, selv om den deretter lastes inn i overlevelsesmodus.{*B*} +Hvis du vil fly når du er i kreativ modus, trykker du raskt to ganger på {*CONTROLLER_ACTION_JUMP*}. Gjør det samme for å slutte å fly. Hvis du vil fly fortere, trykker du på {*CONTROLLER_ACTION_MOVE*} raskt to ganger fremover mens du flyr. +I flymodus kan du holde inne {*CONTROLLER_ACTION_JUMP*} for å bevege deg opp og +{*CONTROLLER_ACTION_SNEAK*} for å bevege deg ned, eller du kan bruke {*CONTROLLER_ACTION_DPAD_UP*} for å bevege deg opp, {*CONTROLLER_ACTION_DPAD_DOWN*} for å bevege deg ned, +{*CONTROLLER_ACTION_DPAD_LEFT*} for å bevege deg til venstre og {*CONTROLLER_ACTION_DPAD_RIGHT*} for å bevege deg til høyre. + + + 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" + + + 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? + + + "IKKE I BRUK" + + + 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. + + + 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". +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? + + + 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/no-NO/stringsRichPresence.xml b/Minecraft.Client/PSVitaMedia/loc/no-NO/stringsRichPresence.xml new file mode 100644 index 00000000..9e07da83 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/no-NO/stringsRichPresence.xml @@ -0,0 +1,66 @@ + + + + {GAME_STATE} + + + Venter + + + I en meny + + + Spiller flerspiller – {GAME_STATE} + + + Spiller flerspiller offline – {GAME_STATE} + + + Spiller alene – {GAME_STATE} + + + Spiller alene offline – {GAME_STATE} + + + Nyter utsikten! + + + Rir på en gris + + + Sitter i en gruvevogn + + + Er i en båt + + + Fisker + + + Utformer + + + Smir + + + I underverdenen + + + Hører på en plate + + + Ser på et kart + + + Fortryllelse + + + Brygger en eliksir + + + Jobber ved ambolten + + + Møter naboene + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/pl-PL/4J_stringsGeneric.xml b/Minecraft.Client/PSVitaMedia/loc/pl-PL/4J_stringsGeneric.xml new file mode 100644 index 00000000..c613e4e8 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/pl-PL/4J_stringsGeneric.xml @@ -0,0 +1,87 @@ + + + + OK + + + Cofn. + + + Anuluj + + + Tak + + + Nie + + + Uszkodzony zapis + + + Ten zapis wygląda na uszkodzony. Nadpisać go i stworzyć nowy zapis? + + + Brak wolnego miejsca + + + Wybierz ponownie + + + Graj bez zapisywania + + + Stwórz nowy zapis + + + Nadpisać zapis? + + + Nie nadpisuj + + + Nadpisz + + + Zapis nieudany + + + Kontynuuj bez zapisywania + + + Wczytywanie nieudane + + + Nazwij zapis + + + Podaj nazwę zapisu + + + Czy na pewno chcesz wyjść z gry? + + + Wypisano się + + + Kontynuuj grę + + + Kontynuuj grę lokalnie + + + Gość + + + Goście nie mają dostępu do sieci "PSN". + + + Zapisywanie... + + + Zapisywanie zawartości. Nie wyłączaj systemu. + + + Pełna wersja + + \ 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 new file mode 100644 index 00000000..c97b95db --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/pl-PL/4J_stringsPlatformSpecific.xml @@ -0,0 +1,50 @@ + + + + Nie udało się zapisać ustawień na koncie Sony Entertainment Network. + + + Problem z kontem 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 new file mode 100644 index 00000000..1e739a7c --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/pl-PL/AdditionalStrings.xml @@ -0,0 +1,96 @@ + + + + Pokaż wszystkie światy tematyczne + + + Ukryj + + + Minecraft: Edycja PlayStation®3 + + + Opcje + + + Zapisz w pamięci podręcznej + + + Wystąpił błąd sieci. + + + Błąd sieci + + + Wystąpił błąd sieci. Powrót do głównego menu. + + + Ze względu na ograniczenia czatu usługa sieciowa została wyłączona na twoim koncie Sony Entertainment Network. + + + Ze względu na kontrolę rodzicielską usługa sieciowa została wyłączona na twoim koncie Sony Entertainment Network. + + + Usługa sieciowa + + + Nastąpiło wypisanie z sieci "PSN". Funkcje sieciowe gry nie będą dostępne, dopóki nie wpiszesz się do sieci "PSN". + + + Nastąpiło wypisanie z sieci "PSN". Funkcje sieciowe gry nie będą dostępne, dopóki nie wpiszesz się do sieci "PSN". Powrót do głównego menu. + + + Wybierz użytkownika dla gracza %d (lub anuluj, aby grać jako gość) + + + Darmowe + + + 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. + + + Trofea wyłączone + + + Trofea zostaną wyłączone, ponieważ ten zapis należy do innego użytkownika. + + + Błąd: nie udało się wczytać trofeów. Wyjdź z gry. + + + Zaprosz. + + + Uszkodzony plik + + + Kontroler odłączony + + + Twój kontroler został odłączony. Podłącz go ponownie. + + + 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. + + + Zaproszenie + + + Dołącz do mnie w Minecraft: edycja PlayStation®Vita! + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/pl-PL/EULA.xml b/Minecraft.Client/PSVitaMedia/loc/pl-PL/EULA.xml new file mode 100644 index 00000000..224d3165 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/pl-PL/EULA.xml @@ -0,0 +1,97 @@ + + + + Minecraft: edycja PlayStation®Vita – WARUNIKI UŻYTKOWANIA + Te warunki zawierają zasady użytkowania Minecraft: edycja PlayStation®Vita („Minecraft”). Aby chronić Minecraft i członków naszej społeczności, są one potrzebne do ustalenia pewnych zasad dotyczących pobierania i użytkowania Minecraft. Podobnie jak wy nie lubimy zasad, więc postaramy się, aby nie były zbyt długie, lecz jeżeli kupisz, pobierzesz użytkujesz lub grasz w Minecraft, wyrażasz zgodę na przestrzeganie tych warunków („Warunki”). + Zanim przejdziemy do właściwej treści, musimy wyjaśnić sobie jedną rzecz. Minecraft to gra, w której gracze mogą budować rzeczy i niszczyć je. Jeżeli gracie z innymi ludźmi (tryb wieloosobowy), możecie budować razem z nimi lub niszczyć rzeczy wybudowane przez nich – a oni mogą zrobić to samo wam. Nie grajcie z innymi, jeżeli nie zachowują się tak, jak tego chcecie. Czasami ludzie robią coś, czego nie powinni. Nie podoba nam się to, ale niewiele możemy na to poradzić, poza prośbami o przyzwoite zachowanie. Liczymy na Was, tak jak na innych członków społeczności – informujcie nas, jeśli ktoś nie zachowuje się tak, jak powinien. Jeżeli dojdzie do takiej sytuacji i/lub uważacie, że ktoś narusza Warunki lub używa Minecraft niezgodnie z przeznaczeniem, dajcie nam znać. Stworzyliśmy do tego system oznaczania/raportowania. Używajcie go, a my podejmiemy odpowiednie kroki. + Aby zgłosić problem, wyślij wiadomość na adres support@mojang.com i podaj jak najwięcej informacji, w tym nazwę użytkownika i opis sytuacji. + Wracając do Warunków: + NAJWAŻNIEJSZA ZASADA + Najważniejszą zasadą jest zakaz dystrybucji naszej twórczości. Przez „dystrybucję naszej twórczości” rozumiemy „rozdawanie kopii gry Minecraft, wykorzystywanie ich w celach komercyjnych, próby zarobienia na nich lub umożliwienie niepowołanym osobom dostępu do gry Minecraft lub jej fragmentów w sposób niesprawiedliwy lub nierozsądny”. Zgodnie z najważniejszą zasadą (chyba że wyrazimy na to zgodę – jak jest to opisane w Zasadach używania produktu i jego elementów) nie możecie: + • przekazywać kopii Minecraft innym osobom, + • wykorzystywać naszej twórczości w celach komercyjnych, + • próbować zarobić na naszej twórczości lub, + • udostępniać niepowołanym osobom naszej twórczości w sposób niesprawiedliwy lub nierozsądny. + …I żeby wszystko było jasne, nasza twórczość obejmuje (ale nie ogranicza się) klienta oraz oprogramowanie serwerowe do gry Minecraft. Wliczają się w to także zmodyfikowane wersje Gry, jej elementy oraz wszystko, co stworzyliśmy. + Poza tym nie mamy większych problemów z tym, co robicie – prawdę powiedziawszy, zachęcamy was do tworzenia fajnych rzeczy (spójrzcie poniżej). Tylko nie róbcie rzeczy, których Wam zabraniamy. + KORZYSTANIE Z MINECRAFT + • Po zakupie gry Minecraft możecie z niej korzystać na swoim systemie PlayStation®Vita. + • Poniżej zapoznacie się ze swoimi uprawnieniami. Musieliśmy jednak także wprowadzić pewne ograniczenia, aby gracze nie zaczęli przesadzać. Jeżeli chcecie zrobić coś związanego z naszą twórczością – bardzo nam to schlebia, ale pamiętajcie, że nie może to być interpretowane jako oficjalny produkt. Musi to być także zgodne z niniejszymi Warunkami. Przede wszystkim nie wykorzystujcie naszej twórczości w celach komercyjnych. + • Zgoda na korzystanie i grę w Minecraft może zostać cofnięta, jeżeli Warunki zostaną złamane. + • Kupując grę Minecraft, otrzymujecie pozwolenie na zainstalowanie jej na waszym systemie PlayStation®Vita oraz korzystanie z niej i granie na tym systemie PlayStation®Vita, jak zostało to opisane w niniejszych Warunkach. Zgoda dotyczy tylko Was, więc nie możecie przekazać Minecrafta (lub jego elementów) innej osobie (chyba że wyrazimy na to zgodę). + • Ze zdjęciami i filmami z Minecraft możecie robić, co chcecie (w granicach zdrowego rozsądku). Rozumiemy przez to nieużywanie ich w celach komercyjnych lub w sposób, który może nam zaszkodzić. Nie wykradajcie materiałów graficznych i nie rozprowadzajcie ich jako własnych. + • Podsumowując, nie wykorzystujcie żadnej zawartości stworzonej przez nas w celach komercyjnych, chyba że wyrazimy na to zgodę w Zasadach używania produktu i jego elementów lub poniższych Warunkach. Jeżeli prawo zezwala na ich wykorzystywanie, chociażby poprzez zasadę dozwolonego użytku lub transakcji legalnych, to także jest to w porządku – ale tylko w zakresie określonym przez prawo. + WŁASNOŚĆ GRY MINECRAFT I INNYCH RZECZY + • Mimo że udzielamy zgody na granie w Minecraft, wciąż pozostajemy jego właścicielami. Jesteśmy także właścicielami naszych marek oraz wszelkiej zawartości w grze Minecraft, na którą składa się oprogramowanie, tekstury, elementy, narzędzia, infrastruktura oraz wiele innych sprytnych (i nie do końca) rzeczy, które są naszą własnością. Wszystkie prawa do tych rzeczy są zastrzeżone, ale możecie ich używać zgodnie z niniejszymi Warunkami. + • Nie oznacza to, że jesteśmy właścicielami tych fajnych rzeczy, które stworzycie w Minecrafcie – musicie tylko zaakceptować, że jesteśmy właścicielami wszystkich elementów gry oraz jej samej, jako produktu i usługi, oraz wszystkich rzeczy wymienionych powyżej. Jesteśmy także właścicielami praw autorskich oraz innych tak zwanych praw własności intelektualnej („PWI”) związanych z tymi rzeczami oraz nazwami i markami związanymi z Minecraftem. + • Oczywiście sami będziecie tworzyć własne rzeczy w i za pomocą Minecrafta. Nie jesteśmy właścicielami stworzonych przez was rzeczy i nie będziemy rościć sobie praw do tego, co nam nie przysługuje. Zachowujemy jednak prawo własności kopii (lub niepełnych kopii) lub opracowań naszych dóbr i twórczości (wskazanych powyżej) – lecz jeżeli stworzycie zupełnie nową zawartość, nie jest ona nasza. A więc, przykładowo: + – pojedynczy blok – nasza własność + – gotycka katedra z kolejką górską przebiegającą przez jej środek – nie nasza własność. + • Dlatego gdy zapłacicie za korzystanie z Minecrafta, kupujecie wyłącznie używanie go jako produktu, zgodnie z Warunkami. Jedyne zezwolenia, jakie otrzymujecie w związku z Minecraft, to zezwolenia określone w niniejszych Warunkach. + ZAWARTOŚĆ + • Jeżeli stworzycie w Minecrafcie jakąś zawartość, musicie dać nam zgodę na jej wykorzystywanie, kopiowanie, modyfikowanie i adaptowanie. Zgoda ta musi być nieodwołalna i nieograniczona. Musicie również wyrazić zgodę na umożliwienie innym osobom korzystania ze stworzonej przez was zawartości oraz pozwolić z niej korzystać osobom, którym ją udostępniliście (na przykład tym, z którymi gracie w trybie wieloosobowym). + • Dobrze przemyślcie kwestię udostępniania zawartości, gdyż może ona zostać upubliczniona i wykorzystywana w niezamierzony przez Was sposób. + • Jeżeli chcecie udostępnić coś przez Minecrafta, nie może być to obraźliwe dla innych lub nielegalne. Musi być to wasze własne dzieło. Do rzeczy, których nie należy tworzyć poprzez Minecrafta, zaliczają się: posty zawierające rasistowskie lub homofobiczne komentarze, komunikaty, które mają na celu gnębienie innych graczy, mogące podważyć reputację naszą lub innej osoby, pornograficzne, reklamujące lub będące własnością kogoś innego lub takie, w których podszywacie się pod moderatorów, aby oszukać innych graczy. + • Wszelka zawartość, którą udostępnicie w Minecrafcie, musi być stworzona przez Was. Nie może ona naruszać praw innych stron. Jeżeli w wyniku udostępnienia przez Was zawartości otrzymamy przez nią groźby lub zostaniemy pozwani, ponieważ narusza ona czyjeś prawa, możemy pociągnąć Was do odpowiedzialności, co oznacza, że będziecie musieli pokryć wszelkie poniesione przez nas szkody. Dlatego niezwykle ważne jest, abyście udostępniali wyłącznie zawartość, która została stworzona przez Was, a nie przez kogoś innego. + • Uważajcie, z kim gracie. Trudno jest stwierdzić, czy to, co ludzie mówią, jest prawdą, lub czy naprawdę są tymi, za kogo się podają. Nie powinniście także podawać żadnych prywatnych informacji o sobie. + Jeżeli chcecie udostępniać zawartość („Waszą zawartość”) w Minecrafcie: + – musicie zgodzić się na wszystkie zasady ustalone przez Sony Computer Entertainment, wliczając w to Warunki użytkowania oraz Umowę użytkownika końcowego sieci "PSN", a także wszelkie inne zasady dotyczące użytkowania systemu PlayStation®Vita i sieci "PSN", + – nie możecie obrażać innych ludzi, + – nie możecie działać niezgodnie z prawem, + – musicie działać uczciwie i nie oszukiwać, nie nabierać i nie wykorzystywać innych osób lub podszywać się pod innych, + – nie możecie naruszać praw autorskich oraz innych, + – nie możecie wygłaszać rasistowskich, seksistowskich lub homofobicznych komentarzy, + – nie możecie gnębić i trollować innych, + – nie możecie szkodzić reputacji innych lub naszej, + – nie możecie zamieszczać treści pornograficznych, + – nie możecie zamieszczać reklam, + – stworzona za pośrednictwem Minecrafta zawartość nie może naruszać praw innych stron. + • Jesteście odpowiedzialni za Waszą zawartość, którą stworzycie w Minecrafcie. + • Udostępniając Waszą zawartość potwierdzacie, że jest to zgodne z niniejszymi Warunkami, i że możemy korzystać z praw opisanych w niniejszych Warunkach. + Jeżeli otrzymamy groźby lub zostaniemy pozwani za zawartość opublikowaną przez was, ponieważ narusza ona czyjeś prawa, zostanie ona usunięta, a my możemy pociągnąć was do odpowiedzialności, co oznacza, że będziecie musieli pokryć wszelkie poniesione przez nas szkody. Wasz dostęp do pewnych funkcji Minecrafta może zostać zablokowany lub zawieszony. + ZAWARTOŚĆ UŻYTKOWNIKÓW + Poniższa treść określa warunki dotyczące Waszej zawartości oraz zawartości udostępnionej przez innych, określanej jako „Zawartość użytkowników”. Minecraft jest usługą rozrywkową. W związku z tym my – i nasi licencjobiorcy (jak Sony Computer Entertainment) – jesteśmy zaangażowani w przesyłanie, dystrybucję, przechowywanie i odzyskiwanie Zawartości użytkowników bez jej przeglądu, selekcji lub wprowadzania zmian. Oznacza to, że nie przeglądamy Zawartości użytkowników, więc nie wiemy, co jest udostępniane przez Was i innych graczy. W Warunkach opisaliśmy zasady, których musicie przestrzegać, jednak nie jesteśmy w stanie przewidzieć wszystkich możliwych sytuacji. + Pamiętajcie, że: + • poglądy prezentowane w Zawartości użytkowników są poglądami indywidualnych autorów lub twórców, a nie naszymi czy osób związanych z nami, chyba że stwierdzimy inaczej, + • nie ponosimy odpowiedzialności za (ani nie składamy oświadczeń lub zapewnień w odniesieniu do) wszelką Zawartość użytkowników, wliczając w to komentarze, poglądy i uwagi w niej zawarte, + • korzystając z Minecrafta akceptujecie, że nie jesteśmy odpowiedzialni za przegląd Zawartości użytkowników. Cała Zawartość użytkowników jest udostępniona z uwzględnieniem faktu, że nie musimy mieć i nie mamy nad nią żadnej kontroli. + JEDNAKŻE my (lub nasi licencjobiorcy, jak Sony Computer Entertainment) możemy zablokować, odrzucić lub zawiesić dostęp do wszelkiej Zawartości użytkowników i zablokować lub zawiesić waszą zdolność do umieszczania, udostępniania lub korzystania z Zawartości użytkowników – wliczając w to zablokowanie dostępu do gry Minecraft lub sieci "PSN", jeżeli uznamy, że mamy ku temu podstawy, jak w przypadku naruszenia niniejszych Warunków lub otrzymania skargi. Będziemy również działać szybko w celu zablokowania lub uniemożliwienia dostępu do Zawartości użytkowników, jeśli i kiedy mamy wiedzę, że jest niezgodna z prawem. + ULEPSZENIA + • Co jakiś czas możemy wprowadzać ulepszenia i aktualizacje, ale nie musimy tego robić. Nie jesteśmy także zobowiązani do zapewniania stałego wsparcia lub prowadzenia prac konserwacyjnych związanych z grą. Oczywiście chcemy wprowadzać aktualizacje, ale nie możemy zagwarantować, że się pojawią. + NASZA ODPOWIEDZIALNOŚĆ + • Gdy kupisz kopię gry Minecraft, dostarczymy ją w stanie „jak jest”. Ulepszenia i aktualizacje także będą dostarczane w takiej formie. Oznacza to, że nie ponosimy odpowiedzialności za jakość Minecrafta, ani nie gwarantujemy nieprzerwanego i wolnego od błędów działania. Nie odpowiadamy także za ewentualne straty lub uszkodzenia. Zobowiązujemy się tylko dostarczyć Minecrafta i świadczyć wszelkie usługi z należytą starannością. Prawo w większości krajów twierdzi, że nie możemy zrzec się odpowiedzialności za śmierć lub uszkodzenia ciała spowodowane naszym zaniedbaniem, więc jeżeli Wasz komputer ożyje i zadźga Was nożem przez nasz błąd, to będziemy musieli za to odpowiedzieć. + NIE PONOSIMY ODPOWIEDZIALNOŚCI ZA: + • WSZELKIE UŻYCIE LUB NIEWŁAŚCIWE UŻYCIE MINECRAFTA PRZEZ WAS LUB INNE OSOBY, + • WSZELKĄ ZAWARTOŚĆ UDOSTĘPNIONĄ PRZEZ WAS W GRZE MINECRAFT, + • WSZELKIE NARUSZENIE PRZEZ WAS NINIEJSZYCH WARUNKÓW, + • WSZELKIE NARUSZENIE NINIEJSZYCH WARUNKÓW PRZEZ INNE OSOBY. + UNIEWAŻNIENIE + • Możemy cofnąć Wam prawo do korzystania z Minecrafta, jeżeli naruszycie niniejsze Warunki. Sami także możecie je unieważnić w dowolnym momencie – wystarczy, że usuniecie Minecrafta ze swojego systemu PlayStation®Vita. Tak czy inaczej, paragrafy „Własność gry Minecraft”, „Nasza odpowiedzialność” i „Kwestie ogólne” będą obowiązywały po unieważnieniu. + KWESTIE OGÓLNE + • Niniejsze Warunki mają wartość podrzędną wobec wszelkich praw, jakie możecie posiadać. Nic w niniejszych Warunkach nie ogranicza żadnych praw, które nie mogą zostać wyłączone zgodnie z prawem, ani nie wyłączają lub nie ograniczają naszej odpowiedzialności za śmierć lub obrażenia ciała, wynikające z naszych zaniedbań. + • Co jakiś czas możemy również zmienić niniejsze Warunki, ale zmiany te będą obowiązywać tylko w zakresie ich zgodnego z prawem zastosowania. Na przykład, jeśli używacie Minecrafta tylko w trybie dla pojedynczego gracza i nie korzystacie z żadnych aktualizacji przez nas udostępnianych, wtedy będzie obowiązywać Was stara wersja Umowy. Jeśli jednak będziecie korzystać z tych aktualizacji lub wykorzystywać części Minecrafta, które polegają na dostarczaniu przez nas usług sieciowych, obowiązywać będzie nowa wersja Umowy. W tym przypadku możemy nie być w stanie/nie musieć informować was o zmianach, aby zaczęły one obowiązywać, więc zaglądajcie tu od czasu do czasu, aby mieć wiedzę na temat wszelkich zmian w treści Warunków. Nie chcemy być niesprawiedliwi, ale czasami prawo się zmienia, albo ktoś robi coś, co wpływa na innych użytkowników Minecrafta, i musimy coś z tym zrobić. + • Jeżeli zasugerujecie nam coś w związku z Minecraftem lub inną z naszych gier, sugestia ta jest nieodpłatna. Oznacza to, że możemy ją wykorzystać w dowolny sposób i nie musimy wam za nią płacić. Jeżeli uważacie, że powinniśmy zapłacić wam za sugestię, musicie dać nam znać, że spodziewacie się zapłaty, zanim ją zgłosicie. + • Poza niniejszymi Warunkami istnieją także Zasady korzystania z produktu i jego elementów, które można znaleźć w sieci. + • Jeżeli złamiecie te zasady, możemy (lub Sony Computer Entertainment) zablokować wam dostęp do Minecrafta. Jeśli nie chcecie lub nie możecie przyjąć tych zasad, nie powinniście kupować, pobierać, korzystać lub grać w Minecrafta. + Jeśli macie jakiekolwiek wątpliwości natury prawnej związane z grą, wstrzymajcie się z podejmowaniem działań i skontaktujcie się z nami. Podsumowując, nie zachowujcie się nierozsądnie, to i my nie będziemy. + O nas: + Mojang AB + Maria Skolgata 83, + SE-11853 + Sztokholm + Szwecja + Numer firmy: 556819-2388 + + + + + Wszelka zawartość kupiona przez sklep w grze, jest nabywana od Sony Network Entertainment Europe Limited („SNEE”) i podlega Warunkom użytkowania oraz Umowie użytkownika końcowego sieci Sony Entertainment Network, której treść można znaleźć w sklepie PlayStation®Store. Sprawdzajcie zasady użytkowania w przypadku każdego zakupu, ponieważ mogą one się różnić. Jeśli nie stwierdzono inaczej, zawartość dostępna w sklepie w grze ma takie same ograniczenie wiekowe, jak sama gra. + + + + Zakup i wykorzystywanie elementów podlegają Warunkom użytkowania i Umowie użytkownika końcowego sieci. Usługa sieciowa jest udostępniana przez Sony Computer Entertainment America. + + + Pamiętaj: Korzystanie z tego oprogramowania podlega warunkom użytkowania, które znajdziesz pod adresem: eu.playstation.com/legal. + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/pl-PL/stringsDynafont.xml b/Minecraft.Client/PSVitaMedia/loc/pl-PL/stringsDynafont.xml new file mode 100644 index 00000000..dca31ec2 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/pl-PL/stringsDynafont.xml @@ -0,0 +1,7 @@ + + + + DynaFont developed by DynaComware. + + + \ 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 new file mode 100644 index 00000000..4472cf4e --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/pl-PL/stringsGeneric.xml @@ -0,0 +1,6893 @@ + + + + Przełączanie do gry offline + + + Czekaj, aż host zapisze grę + + + Wkraczasz do Kresu + + + Zapisywanie graczy + + + Łączenie z hostem + + + Pobieranie terenu + + + Opuszczasz Kres + + + 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. + + + 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. + + + Wczytywanie poziomu + + + Finalizowanie... + + + Budowanie terenu + + + Symulacja świata + + + Poz. + + + Przygotowywanie do zapisania poziomu + + + Przygotowywanie kawałków składowych... + + + Przygotowywanie serwera + + + Opuszczasz Otchłań + + + Odradzanie + + + Generowanie poziomu + + + Tworzenie obszaru odrodzenia + + + Wczytywanie obszaru odrodzenia + + + Wkraczasz do Otchłani + + + Narzędzia i broń + + + Gamma + + + Czułość gry + + + Czułość interfejsu + + + Poziom trudności + + + Muzyka + + + Dźwięk + + + Spokojny + + + 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. + + + Niski + + + Normalny + + + Wysoki + + + Wypisano się + + + Pancerz + + + Mechanizmy + + + Transport + + + Broń + + + Jedzenie + + + Konstrukcje + + + Dekoracje + + + Warzenie + + + Narzędzia, broń i pancerz + + + Materiały + + + Bloki do budowy + + + Czerwony kamień i transport + + + Inne + + + Wpisy: + + + 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! + + + 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 + + + Stwórz nowy świat + + + Podaj nazwę swojego świata + + + Podaj numer ziarna do generowania świata + + + Wczytaj zapisany świat + + + Rozegraj samouczek + + + Samouczek + + + Nazwij swój świat + + + Uszkodzony zapis gry + + + OK + + + Anuluj + + + Sklep Minecraft + + + Obróć + + + Ukryj + + + Wyczyść wszystkie miejsca + + + Czy na pewno chcesz opuścić tę grę i dołączyć do innej? Niezapisany postęp zostanie utracony. + + + 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ę + + + Wyjdź z gry + + + Zapisz grę + + + Wyjdź bez zapisywania + + + Wciśnij START, aby grać + + + Hura – udało ci się odblokować obrazek Steve'a z Minecrafta! + + + Hura – udało ci się odblokować obrazek czyhacza! + + + Odblokuj pełną wersję gry + + + Nie możesz dołączyć do tej gry, ponieważ host używa nowszej wersji gry. + + + Nowy świat + + + Odblokowano nagrodę! + + + Grasz teraz w wersję próbną. Do zapisu stanu gry potrzebna jest pełna wersja. +Czy chcesz odblokować pełną wersję gry? + + + Znajomi + + + Mój wynik + + + Ogólne + + + Czekaj + + + Brak wyników + + + Filtr: + + + Nie możesz dołączyć do tej gry, ponieważ host używa starszej wersji gry. + + + Utracono połączenie + + + Utracono połączenie z serwerem. Powrót do głównego menu. + + + Utracono połączenie z serwerem + + + Opuszczanie gry + + + Wystąpił błąd. Powrót do głównego menu. + + + Połączenie nieudane + + + Wyrzucono cię z gry + + + 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ł. + + + Wyrzucono cię z gry za latanie + + + Próba połączenia trwała zbyt długo + + + Serwer jest pełny + + + 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! + + + Motywy + + + Pakiety skórek + + + Znajomi znajomych mogą dołączać + + + 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 + + + Nie możesz dołączyć do tej gry, ponieważ została ona ograniczona tylko do znajomych hosta. + + + 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. + + + Nie można dołączyć do gry + + + Wybrano + + + Wybrana skórka: + + + Pobierz pełną wersję + + + Odblokuj pakiet tekstur + + + Aby korzystać z wybranego pakietu tekstur, musisz go odblokować. +Odblokować go teraz? + + + Próbny pakiet tekstur + + + Ziarno + + + Odblokuj pakiet skórek + + + Aby korzystać z wybranej skórki, musisz odblokować pakiet skórek. +Odblokować go teraz? + + + 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? + + + 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ę + + + Brak pakietu tekstur + + + Odblokuj pełną wersję + + + Pobierz próbną wersję + + + Tryb gry został zmieniony + + + 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. + + + Normalny + + + Superpłaski + + + Po włączeniu gra będzie grą sieciową. + + + 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 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. + + + 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. + + + Wył. + + + Tryb gry: Tworzenie + + + Przetrwanie + + + Tworzenie + + + Zmień nazwę świata + + + Podaj nową nazwę swojego świata + + + Tryb gry: Przetrwanie + + + Stworzone w trybie przetrwania + + + Zmień nazwę zapisu gry + + + Autozapis za %d... + + + Wł. + + + Stworzone w trybie tworzenia + + + Renderuj chmury + + + Co chcesz zrobić z tym zapisem gry? + + + Rozmiar interfejsu (podzielony ekran) + + + Składnik + + + Opał + + + Dozownik + + + Skrzynia + + + Zaklinanie + + + Piec + + + Aktualnie nie ma dostępnej zawartości do pobrania tego typu dla tej gry. + + + Czy na pewno chcesz usunąć ten zapis gry? + + + Oczekiwanie na akceptację + + + Ocenzurowano + + + Gracz %s dołącza do gry. + + + Gracz %s opuszcza grę. + + + Gracz %s zostaje wyrzucony z gry. + + + Stacja alchemiczna + + + Wpisz tekst na znaku + + + Wpisz tekst na swoim znaku + + + Wpisz nazwę + + + Koniec wersji próbnej + + + Wybrana gra jest pełna + + + Nie udało się dołączyć do gry, brak wolnych miejsc + + + Wpisz nazwę swojego postu + + + Wpisz opis swojego postu + + + Ekwipunek + + + Składniki + + + Wpisz nagłówek + + + Wpisz nagłówek swojego postu + + + Wpisz opis + + + Teraz gra: + + + 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 + + + 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? + + + Odstęp czasowy automatycznego zapisu: WYŁ. + + + Przezroczystość interfejsu + + + Przygotowywanie do automatycznego zapisania poziomu + + + Rozmiar interfejsu + + + 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. + + + Ulubione skórki + + + Gra gracza %s + + + Gra nieznanego hosta + + + Gość się wypisał + + + Resetuj ustawienia + + + Czy na pewno chcesz zresetować ustawienia do wartości standardowych? + + + Błąd wczytywania + + + Jeden z gości się wypisał, co oznacza, że pozostali goście zostaną usunięci z gry. + + + Nie udało się stworzyć gry + + + Automatyczny wybór + + + Brak pakietu: standard. skórki + + + Wpisz się + + + Nie jesteś wpisany. Aby zagrać, musisz się wpisać. Chcesz się wpisać teraz? + + + Tryb wieloosobowy niedostępny + + + Wypij + + + + 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. + + + 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ć. + + + + 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. + + + + Jeżeli kociołek zrobi się pusty, możesz go napełnić wodą z wiadra. + + + + Skorzystaj ze stacji alchemicznej, aby stworzyć miksturę odporności na ogień. Będzie ci potrzebna butelka z wodą, narośl z Otchłani oraz magmowy krem. + + + + 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. + + + + Teraz, gdy ogień i lawa nie są dla ciebie groźne, możesz dostać się do wcześniej niedostępnych miejsc. + + + + Oto interfejs zaklinania, który służy do dodawania zaklęć do broni, elementów pancerza i niektórych narzędzi. + + + {*B*} + Wciśnij{*CONTROLLER_VK_A*}, aby dowiedzieć się więcej na temat interfejsu zaklinania.{*B*} + Wciśnij{*CONTROLLER_VK_B*}, jeżeli masz już wiedzę na ten temat. + + + + W tym miejscu znajduje się stacja alchemiczna, kociołek i skrzynia wypełniona składnikami do warzenia mikstur. + + + + 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. + + + + 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. + + + + Wciśnij{*CONTROLLER_ACTION_USE*}, aby zacząć łowić. Wciśnij{*CONTROLLER_ACTION_USE*} ponownie, aby ściągnąć żyłkę. + {*FishingRodIcon*} + + + + Jeżeli zaczekasz, aż spławik zanurzy się pod powierzchnię wody zanim ściągniesz żyłkę, może udać ci się złapać rybę. Rybę można zjeść na surowo lub usmażyć w piecu. Odnawia ona zdrowie. + {*FishIcon*} + + + + 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. + + + + {*B*} + Wciśnij{*CONTROLLER_VK_A*}, aby dowiedzieć się więcej o łóżkach.{*B*} + Wciśnij{*CONTROLLER_VK_B*}, jeżeli masz już wiedzę na ten temat. + + + + Łóżko powinno zostać umieszczone w bezpiecznym, dobrze oświetlonym miejscu, aby potwory nie obudziły cię w środku nocy. Jeżeli zginiesz po użyciu łóżka, odrodzisz się przy nim. + {*ICON*}355{*/ICON*} + + + + 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*} + + + + {*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. + + + + 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. + + + + 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. + + + + 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ć. + + + + 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*} + + + + 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. + + + 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. + + + + Gratulacje, udało ci się ukończyć samouczek. Czas w grze upływa teraz normalnie, ale nie zostało ci dużo czasu do zapadnięcia nocy – wtedy pojawiają się potwory! Wykończ swoje schronienie! + + + {*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. + + + {*B*}Wciśnij{*CONTROLLER_VK_A*}, aby rozegrać samouczek normalnie.{*B*} + Wciśnij{*CONTROLLER_VK_B*}, aby pominąć samouczek. + + + + {*B*} + Wciśnij{*CONTROLLER_VK_A*}, aby dowiedzieć się więcej na temat wskaźnika najedzenia i żywności.{*B*} + Wciśnij{*CONTROLLER_VK_B*}, jeżeli masz już wiedzę na ten temat. + + + Wyb. + + + Użyj + + + 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ć. + + + Weź + + + Dalej + + + Wstecz + + + Wyrzuć gracza + + + Wyślij zaproszenie do znajomych + + + Strona w dół + + + Strona w górę + + + Farbuj + + + Ulecz + + + Usiądź + + + Chodź za mną + + + Wydobywaj + + + Nakarm + + + Oswój + + + Zmień filtr + + + Odłóż wszystko + + + Odłóż jedno + + + Upuść + + + Weź wszystko + + + Weź połowę + + + Odłóż + + + Upuść wszystko + + + Wyczyść szybki wybór + + + Co to jest? + + + Udostępnij na Facebooku + + + Upuść jedno + + + Zamień + + + Szybkie przeniesienie + + + Pakiety skórek + + + Zabarwiona szyba – czerwona + + + Zabarwiona szyba – zielona + + + Zabarwiona szyba – brązowa + + + Zabarwione szkło – białe + + + Zabarwiona szyba + + + Zabarwiona szyba – czarna + + + Zabarwiona szyba – niebieska + + + Zabarwiona szyba – szara + + + Zabarwiona szyba – różowa + + + Zabarwiona szyba – limonkowa + + + Zabarwiona szyba – fioletowa + + + Zabarwiona szyba – błękitna + + + Zabarwiona szyba – jasnoszara + + + Zabarwione szkło – pomarańczowe + + + Zabarwione szkło – niebieskie + + + Zabarwione szkło – fioletowe + + + Zabarwione szkło – błękitne + + + Zabarwione szkło – czerwone + + + Zabarwione szkło – zielone + + + Zabarwione szkło – brązowe + + + Zabarwione szkło – jasnoszare + + + Zabarwione szkło – żółte + + + Zabarwione szkło – jasnoniebieskie + + + Zabarwione szkło – wrzosowe + + + Zabarwione szkło – szare + + + Zabarwione szkło – różowe + + + Zabarwione szkło – limonkowe + + + Zabarwiona szyba – żółta + + + Jasnoszary + + + Szary + + + Różowy + + + Niebieski + + + Fioletowy + + + Błękitny + + + Limonkowy + + + Pomarańczowy + + + Biały + + + Spersonalizowany + + + Żółty + + + Jasnoniebieski + + + Wrzosowy + + + Brązowy + + + Zabarwiona szyba – biała + + + Mała kula + + + Duża kula + + + Zabarwiona szyba – jasnoniebieska + + + Zabarwiona szyba – wrzosowa + + + Zabarwiona szyba – pomarańczowa + + + Gwiazda + + + Czarny + + + Czerwony + + + Zielony + + + Czyhacz + + + Rozproszenie + + + Nieznany kształt + + + Zabarwione szkło – czarne + + + Żelazna zbroja dla konia + + + 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ź + + + + 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. + + + +{*C2*}Weź głęboki oddech. Teraz kolejny. Nabierz powietrza w płuca. Odzyskaj władzę w kończynach. Tak, poruszaj palcami. Ponownie otrzymaj ciało wystawione na działanie grawitacji i powietrza. Odrodź się w tym długim śnie. Oto jesteś. Twoje ciało znów styka się ze wszechświatem w każdym punkcie, jakbyście byli osobnymi bytami. Jakbyśmy my byli osobnymi bytami.{*EF*}{*B*}{*B*} +{*C3*}Kim jesteśmy? Niegdyś nazywano nas duchem góry. Ojciec-słońce, matka-księżyc. Duchy przodków, duchy zwierząt. Dżiny. Duchy. Zieloni ludzie. Potem bogowie, demony. Anioły. Złośliwe duchy. Obcy, istoty pozaziemskie. Leptony, kwarki. Światy się zmieniają. My nie.{*EF*}{*B*}{*B*} +{*C2*}Jesteśmy wszechświatem. Jesteśmy wszystkim, co uważasz, że nie jest tobą. Patrzysz na nas teraz swoim ciałem i oczami. A czemu wszechświat dotyka twojego ciała i oświetla cię? Żeby cię zobaczyć, graczu. Żeby cię poznać. I dać się poznać. Opowiem ci historię.{*EF*}{*B*}{*B*} +{*C2*}Dawno, dawno temu, żył pewien gracz.{*EF*}{*B*}{*B*} +{*C3*}Tym graczem byłeś ty, {*PLAYER*}.{*EF*}{*B*}{*B*} +{*C2*}Czasami gracz uważał się za człowieka, który żył na wirującej kuli z roztopionej skały. Kula wirowała wokół kuli płonącego gazu, która była 330 000 razy większa. Znajdowały się od siebie tak daleko, że światło potrzebowało 8 minut, aby pokonać ten dystans. Światło było informacją przesyłaną od gwiazdy i mogło poparzyć twoją skórę z odległości 150 milionów kilometrów.{*EF*}{*B*}{*B*} +{*C2*}Czasami gracz śnił, że był górnikiem, żyjącym na płaskim i nieskończonym świecie. Słońce było białym kwadratem. Dni były krótkie. Było tyle do zrobienia, a śmierć jawiła się tylko jako drobna niedogodność.{*EF*}{*B*}{*B*} +{*C3*}Czasami gracz śnił, że zagubił się w historii.{*EF*}{*B*}{*B*} +{*C2*}Czasami śnił, że był kimś innym, w zupełnie innym miejscu. Czasami sny były niepokojące, innym razem piękne. Bywało, że gracz budził się z jednego snu i zapadał w następny, a potem w kolejny.{*EF*}{*B*}{*B*} +{*C3*}Czasami śniło mu się, że ogląda słowa na ekranie.{*EF*}{*B*}{*B*} +{*C2*}Cofnijmy się trochę.{*EF*}{*B*}{*B*} +{*C2*}Atomy, z których składał się gracz, były rozrzucone wszędzie – w trawie, w wodzie, w powietrzu i ziemi. Kobieta zebrała te atomy – piła, jadła, wdychała – a następnie stworzyła gracza w swoim ciele.{*EF*}{*B*}{*B*} +{*C2*}Gracz przebudził się z ciepłego i mrocznego ciała swojej matki, wprost do długiego snu.{*EF*}{*B*}{*B*} +{*C2*}Stał się nową historią, nigdy wcześniej nieopowiedzianą, zapisaną literami DNA. Był nowym programem, nigdy wcześniej nieuruchamianym, napisanym za pomocą kodu źródłowego, mającego miliardy lat. Był nowym człowiekiem, który nie żył nigdy wcześniej, stworzonym wyłącznie z mleka i miłości.{*EF*}{*B*}{*B*} +{*C3*}Ty jesteś tym graczem. Historią. Programem. Człowiekiem. Stworzonym wyłącznie z mleka i miłości.{*EF*}{*B*}{*B*} +{*C2*}Cofnijmy się jeszcze dalej.{*EF*}{*B*}{*B*} +{*C2*}Siedem miliardów miliardów miliardów atomów, z których składa się ciało gracza, powstało w sercu gwiazdy na długo przed tą grą. Więc także gracz jest informacją od gwiazdy. Gracz przeżywa historię, która jest lasem informacji zasianym przez człowieka imieniem Julian, na płaskim, nieskończonym świecie, stworzonym przez człowieka imieniem Markus, który istnieje w małym, prywatnym świecie stworzonym przez gracza, który zamieszkuje wszechświat, stworzony przez...{*EF*}{*B*}{*B*} +{*C3*}Ciiii. Czasami gracz tworzył mały, prywatny świat, przytulny, ciepły i prosty. Czasami bywał twardy, zimny i skomplikowany. Czasami tworzył w myślach model wszechświata, przez który przemieszczały się drobinki energii. Czasami nazywał te drobinki elektronami i protonami.{*EF*}{*B*}{*B*} + + + +{*C2*}Czasami nazywał je planetami i gwiazdami.{*EF*}{*B*}{*B*} +{*C2*}Czasami wierzył, że znajdował się we wszechświecie stworzonym z energii, która powstała z zer i jedynek, linii kodu. Czasami wierzył, że grał w grę. Czasami, że czyta słowa na ekranie.{*EF*}{*B*}{*B*} +{*C3*}Jesteś graczem czytającym słowa...{*EF*}{*B*}{*B*} +{*C2*}Ciiii... Czasami gracz czytał linie kodu na ekranie. Deszyfrował z nich słowa. Deszyfrował słowa w znaczenia. Deszyfrował znaczenia w uczucia, emocje, teorie, pomysły. Zaczynał wtedy oddychać szybciej i głębiej, i zdał sobie sprawę, że żyje. Żyje, a te tysiące śmierci nie były prawdziwe. Gracz żył{*EF*}{*B*}{*B*} +{*C3*}Ty. Ty. Ty jesteś żywy.{*EF*}{*B*}{*B*} +{*C2*}i czasami wierzył, że wszechświat do niego przemawiał poprzez promienie słońca świecące przez liście{*EF*}{*B*}{*B*} +{*C3*}i czasami wierzył, że wszechświat do niego przemawia poprzez światło, które spadło z nocnego, zimowego nieba, gdzie błysk światła widziany kątem oka mógł być olbrzymią gwiazdą, która spalała pobliskie planety na plazmę, aby chociaż na chwilę pokazać się graczowi wracającemu do domu po drugiej stronie wszechświata, czującemu zapach jedzenia i wkrótce zapadającemu w kolejny sen{*EF*}{*B*}{*B*} +{*C2*}i czasami wierzył, że wszechświat do niego przemawia poprzez zera i jedynki, całą energię elektryczną świata, przez przesuwające się po ekranie słowa, które pokazują się na końcu snu{*EF*}{*B*}{*B*} +{*C3*}i wszechświat powiedział, że cię kocha{*EF*}{*B*}{*B*} +{*C2*}i wszechświat powiedział, że dobrze grałeś{*EF*}{*B*}{*B*} +{*C3*}i wszechświat powiedział, że wszystko niezbędne jest w tobie{*EF*}{*B*}{*B*} +{*C2*}i wszechświat powiedział, że jesteś silniejszy niż ci się wydaje{*EF*}{*B*}{*B*} +{*C3*}i wszechświat powiedział, że jesteś dniem{*EF*}{*B*}{*B*} +{*C2*}i wszechświat powiedział, że jesteś nocą{*EF*}{*B*}{*B*} +{*C3*}i wszechświat powiedział, że ciemność, z którą walczysz, jest w tobie{*EF*}{*B*}{*B*} +{*C2*}i wszechświat powiedział, że światłość, której szukasz, jest w tobie{*EF*}{*B*}{*B*} +{*C3*}i wszechświat powiedział, że nie jesteś sam{*EF*}{*B*}{*B*} +{*C2*}i wszechświat powiedział, że nie jesteś oddzielony od innych rzeczy{*EF*}{*B*}{*B*} +{*C3*}i wszechświat powiedział, że jesteś wszechświatem, który sam się sprawdza, rozmawia ze sobą i czyta własny kod{*EF*}{*B*}{*B*} +{*C2*}i wszechświat powiedział, że cię kocha, ponieważ jesteś miłością.{*EF*}{*B*}{*B*} +{*C3*}Gra dobiegła końca, a gracz przebudził się ze snu. I zaczął kolejny sen. I śnił ponownie, śnił lepiej. I gracz był wszechświatem. I był miłością.{*EF*}{*B*}{*B*} +{*C3*}Ty jesteś graczem.{*EF*}{*B*}{*B*} +{*C2*}Przebudź się.{*EF*} + + + 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ń + + + Nie resetuj Otchłani + + + Nie możesz teraz ostrzyc tej grzybowej krowy. Osiągnięto maksymalną liczbę świń, owiec, krów, kotów i koni. + + + Nie żyjesz! + + + Opcje świata + + + Może budować i wydobywać + + + Może korzystać z drzwi i przełączników + + + Generowanie budynków + + + Superpłaski świat + + + Dodatkowa skrzynia + + + Może otwierać pojemniki + + + Wyrzuć gracza + + + Może latać + + + 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ść + + + Znaczniki + + + {*T3*}INSTRUKCJA: ZNACZNIKI{*ETW*}{*B*}{*B*} +Aktywne znaczniki wyświetlają promień światła w kierunku nieba i dają pobliskim graczom różne efekty.{*B*} +Wytwarza się je ze szkła, obsydianu i gwiazd z Otchłani, które można zdobyć, pokonując Uschniętego.{*B*}{*B*} +Znaczniki należy umieścić tak, aby w ciągu dnia świeciło na nie słońce. Muszą być umieszczona na szczycie piramid z żelaza, złota, szmaragdów lub diamentów.{*B*} +Materiał, na jakim ustawiony jest znacznik, nie ma wpływu na jego siłę.{*B*}{*B*} +W menu znaczników możesz wybrać jedną główną moc dla znacznika. Im więcej poziomów ma piramida, tym więcej mocy będziesz mieć do wyboru.{*B*} +Znacznik na piramidzie z co najmniej czterema poziomami będzie miał dostępną drugorzędną moc regeneracji lub możliwość wzmocnienia mocy głównej.{*B*}{*B*} +Aby wybrać moc dla znacznika, musisz poświęcić szmaragd, diament, sztabkę złota lub sztabkę żelaza.{*B*} +Po wybraniu, moc będzie emanować ze znacznika stale.{*B*} + + + + Fajerwerki + + + Języki + + + Konie + + + {*T3*}INSTRUKCJA: KONIE{*ETW*}{*B*}{*B*} +Konie i osły można spotkać na równinach. Muły są potomstwem osłów i koni, ale same są bezpłodne.{*B*} +Na wszystkich dorosłych koniach, osłach i mułach można jeździć. Tylko konie mogą być ubrane w zbroje, a tylko muły i osły mogą być wyposażone w torby przy siodle, służące do transportowania przedmiotów.{*B*}{*B*} +Konie, osły i muły muszą być oswojone, aby można było z nich korzystać. Konia oswaja się, dosiadając go i próbując się utrzymać, gdy ten próbuje cię zrzucić.{*B*} +Gdy pojawią się przy nim serduszka, będzie oswojony i już nie spróbuje cię zrzucić. Aby kierować koniem, trzeba założyć mu siodło.{*B*}{*B*} +Siodła można kupić od osadników lub znaleźć w ukrytych skrzyniach.{*B*} +Oswojonym osłom i mułom można założyć torby, przyczepiając do nich skrzynie. Dostęp do toreb można uzyskać podczas jazdy albo skradania się.{*B*}{*B*} +Konie i osły (ale nie muły) mogą być rozmnażane jak inne zwierzęta, za pomocą złotych jabłek i marchewek.{*B*} +Źrebaki z czasem wyrosną na dorosłe konie, ale karmienie ich pszenicą lub sianem przyspieszy ten proces.{*B*} + + + + {*T3*}INSTRUKCJA: FAJERWERKI{*ETW*}{*B*}{*B*} +Fajerwerki to przedmioty dekoracyjne, które można wystrzelić ręcznie lub z dozowników. Wytwarza się je z papieru, prochu strzelniczego i ewentualnie kilku gwiazd pirotechnicznych.{*B*} +Kolory, zasięg lotu, kształt, rozmiar i efekty (takie jak smuga czy iskrzenie) gwiazd pirotechnicznych można spersonalizować, dodając inne składniki.{*B*}{*B*} +Aby wytworzyć fajerwerk, umieść proch strzelniczy i papier w siatce wytwarzania o wymiarach 3x3, widocznej nad twoim ekwipunkiem.{*B*} +Możesz również wstawić do siatki kilka gwiazd pirotechnicznych, aby dodać je do fajerwerku.{*B*} +Wypełniając więcej pól siatki prochem strzelniczym, zwiększysz wysokość, na której wybuchną gwiazdy pirotechniczne.{*B*}{*B*} +Gotowy fajerwerk możesz następnie zabrać z odpowiedniego pola.{*B*}{*B*} +Gwiazdy pirotechniczne można wytwarzać, umieszczając w siatce proch strzelniczy i barwnik.{*B*} +– Barwnik określi kolor gwiazdy w momencie eksplozji.{*B*} +– Kształt gwiazdy można określić, dodając ognisty ładunek, samorodek złota, pióro lub głowę istoty.{*B*} +– Efekt smugi lub iskrzenia można dodać, używając diamentów lub jasnopyłu.{*B*}{*B*} +Po wytworzeniu gwiazdy pirotechnicznej możesz ustalić jej kolor w czasie zanikania, łącząc ją z barwnikiem. + + + + {*T3*}INSTRUKCJA: PODAJNIKI{*ETW*}{*B*}{*B*} +Podajniki zasilane przez czerwony kamień upuszczą na ziemię jeden losowy przedmiot. Użyj {*CONTROLLER_ACTION_USE*}, aby otworzyć podajnik, a następnie załadować do niego przedmioty z ekwipunku.{*B*} +Jeśli podajnik jest skierowany w stronę skrzyni lub innego pojemnika, przedmiot zostanie umieszczony w tym pojemniku. Można zbudować długie łańcuchy podajników, aby transportować przedmioty na duże odległości – wówczas muszą być zasilane na zmianę. + + + + Po użyciu zamienia się w mapę części świata, w której jesteś, i wypełnia się w miarę zwiedzania. + + + Do zdobycia po zabiciu Uschniętego, używana do tworzenia znaczników. + + + Leje + + + {*T3*}INSTRUKCJA: LEJE{*ETW*}{*B*}{*B*} +Leje służą do umieszczania lub usuwania przedmiotów z pojemników i automatycznego podnoszenia wrzucanych do nich przedmiotów.{*B*} +Mogą wpływać na stacje alchemiczne, skrzynie, dozowniki, podajniki, wagoniki ze skrzyniami, wagoniki z lejami oraz inne leje.{*B*}{*B*} +Leje będą stale próbowały wyciągać przedmioty z odpowiednich pojemników nad nimi. Będą także próbowały umieścić przechowywane przedmioty w docelowym pojemniku.{*B*} +Jeżeli lej zostanie zasilony czerwonym kamieniem, wyłączy się i przestanie wciągać i umieszczać przedmioty.{*B*}{*B*} +Lej jest skierowany w stronę, w którą próbuje przekazywać przedmioty. Aby lej był skierowany w kierunku konkretnego bloku, umieść go przy bloku podczas skradania.{*B*} + + + + Podajniki + + + NOT USED + + + Natychmiastowe zdrowie + + + Natychmiastowe obrażenia + + + Wzmocnienie skoku + + + Powolne wydobywanie + + + Siła + + + Osłabienie + + + Mdłości + + + NOT USED + + + NOT USED + + + NOT USED + + + Regeneracja + + + Odporność + + + Szukanie ziarna do generowania świata + + + Po użyciu wywołuje kolorową eksplozję. Kolor, efekt, kształt i zasięg lotu zależą od gwiazdy pirotechnicznej użytej do wytworzenia fajerwerku. + + + Rodzaj toru, który może włączać i wyłączać wagoniki z lejami i aktywować wagoniki z trotylem. + + + Przechowuje i upuszcza przedmioty lub przekłada je do innego pojemnika, gdy otrzyma zasilanie z czerwonego kamienia. + + + Kolorowe bloki powstałe na skutek farbowania utwardzonej gliny. + + + 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 + + + Głód + + + spowolnienia + + + szybkości + + + Niewidzialność + + + Oddychanie pod wodą + + + Widzenie w ciemności + + + Oślepienie + + + ranienia + + + leczenia + + + mdłości + + + regeneracji + + + znudzenia + + + przyspieszenia + + + osłabienia + + + siły + + + Odporność na ogień + + + Nasycenie + + + odporności + + + skoku + + + Uschnięty + + + Wzmocnienie zdrowia + + + Absorpcja + + + + + + II + + + 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 + + + Zwyczajna + + + Nudna + + + Fantazyjna + + + Nasycona + + + Urocza + + + Elegancka + + + Wymyślna + + + Gazowana + + + 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 + + + Porażenie + + + Ostrość + + + Stopniowo obniża zdrowie graczy, zwierząt i potworów. + + + Obrażenia od ataku + + + Odrzucenie + + + Zguba stawonogów + + + Szybkość + + + Wsparcie zombie + + + Siła skoku konia + + + Po użyciu: + + + Odporność na odrzucenie + + + Zasięg podążania istot + + + Maksymalne zdrowie + + + Delikatny dotyk + + + Wydajność + + + Podwodna wydajność + + + Szczęście + + + Grabież + + + Niezniszczalność + + + Ochrona przed ogniem + + + Ochrona + + + Aspekt ognia + + + Powolne opadanie + + + Oddychanie + + + Ochrona przed pociskami + + + Ochrona przed wybuchami + + + IV + + + V + + + VI + + + Uderzenie + + + VII + + + III + + + Płomień + + + Moc + + + Nieskończoność + + + II + + + I + + + Aktywuje się, gdy istota przejdzie przez podłączoną linkę. + + + Aktywuje podłączony haczyk na linkę, gdy istota przez nią przejdzie. + + + Sprawny sposób przechowywania szmaragdów. + + + Działa jak zwykła skrzynia, ale umieszczone w skrzyni Kresu przedmioty są dostępne we wszystkich innych skrzyniach Kresu gracza, nawet w innych wymiarach. + + + IX + + + VIII + + + Może być wydobyta za pomocą żelaznego lub lepszego kilofa, aby zdobyć szmaragdy. + + + 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. + + + 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*}. Może ci zaszkodzić. + + + Służy do kierowania świnią podczas jazdy. + + + Odnawia 3{*ICON_SHANK_01*}. Powstaje po usmażeniu ziemniaka w piecu. + + + Odnawia 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. + + + 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. + + + Szmaragd + + + Doniczka + + + Ciasto dyniowe + + + Zaklęta księga + + + Trujący ziemniak + + + Złota marchewka + + + Marchewka na kiju + + + Haczyk na linkę + + + Linka + + + Kwarc z Otchłani + + + Ruda szmaragdu + + + Skrzynia Kresu + + + Murek z kamienia brukowego z mchem + + + Blok szmaragdu + + + Murek z kamienia brukowego + + + Ziemniaki + + + Doniczka + + + Marchewki + + + Lekko uszkodzone kowadło + + + Kowadło + + + Kowadło + + + Blok kwarcu + + + Mocno uszkodzone kowadło + + + Ruda kwarcu z Otchłani + + + Schody z kwarcu + + + Rzeźbiony blok kwarcu + + + Filarowy blok kwarcu + + + Czerwony dywan + + + Dywan + + + Czarny dywan + + + Niebieski dywan + + + Zielony dywan + + + Brązowy dywan + + + Fioletowy dywan + + + Błękitny dywan + + + Jasnoszary dywan + + + Szary dywan + + + Limonkowy dywan + + + Różowy dywan + + + Jasnoniebieski dywan + + + Żółty dywan + + + Wrzosowy dywan + + + Pomarańczowy dywan + + + Biały dywan + + + Rzeźbiony 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. + + + Gracz {*PLAYER*} przeniósł cię w miejsce swojego pobytu. + + + Przeniesiono gracza {*PLAYER*} w miejsce: {*DESTINATION*}. + + + Ciernie + + + 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 + + + Za drogo! + + + Koszt zaklęcia: %d + + + Masz: + + + Zmień nazwę + + + {*VILLAGER_TYPE*} oferuje: %s + + + Wymagane rzeczy do handlu: + + + Handel + + + 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. + + + + {*B*} + Wciśnij{*CONTROLLER_VK_A*}, aby dowiedzieć się więcej na temat interfejsu kowadła.{*B*} + Wciśnij{*CONTROLLER_VK_B*}, jeżeli masz już wiedzę na ten temat. + + + + Można też umieścić identyczny przedmiot w drugim miejscu, aby połączyć przedmioty. + + + + Gdy odpowiedni materiał zostanie umieszczony w drugim miejscu (np. sztabki żelaza, aby naprawić uszkodzony żelazny miecz), wynik naprawy pojawi się w ostatnim miejscu. + + + + Liczba niezbędnych poziomów doświadczenia zostanie wyświetlona poniżej. Jeżeli nie masz wystarczającej liczby poziomów, naprawa nie będzie możliwa. + + + + Aby zakląć przedmiot za pomocą kowadła, umieść zaklętą księgę w drugim miejscu. + + + + Podniesienie naprawionego przedmiotu zużyje oba przedmioty i obniży twój poziom doświadczenia o podaną liczbę. + + + + Można zmienić nazwę przedmiotu, wpisując ją w widocznym polu. + + + + {*B*} + 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. + + + + 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. + + + + 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. + + + + 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ć. + + + + Zmiana nazwy dotyczy wszystkich graczy i na stałe obniża koszt związany z wcześniejszymi pracami. + + + + {*B*} + 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. + + + + 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. + + + + 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. + + + + 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. + + + + {*B*} + Wciśnij{*CONTROLLER_VK_A*}, aby dowiedzieć się więcej o handlu.{*B*} + Wciśnij{*CONTROLLER_VK_B*}, jeżeli masz już wiedzę na ten temat. + + + + Dokonanie różnych wymian powiększy lub zaktualizuje listę oferowanych przez osadnika przedmiotów. + + + + Przedmioty oferowane przez osadnika zależą od jego profesji. + + + + Przedmioty, które były często wymieniane, mogą zostać tymczasowo usunięte, ale osadnik będzie zawsze miał co najmniej jeden przedmiot w ofercie. + + + + Weź papier ze skrzyni i spróbuj pohandlować z osadnikiem. + + + + W tym obszarze znajdziesz dwie skrzynie Kresu. + + + + {*B*} + Wciśnij{*CONTROLLER_VK_A*}, aby dowiedzieć się więcej o skrzyniach Kresu.{*B*} + Wciśnij{*CONTROLLER_VK_B*}, jeżeli masz już wiedzę na ten temat. + + + + Wszystkie skrzynie Kresu są ze sobą połączone, nawet jeżeli znajdują się w innych wymiarach. Przedmioty umieszczone w skrzyni Kresu są dostępne w każdej innej. + + + + Jednak zawartość skrzyń Kresu jest unikalna dla każdego gracza. + + + + Umożliwia to graczom przechowanie przedmiotów w dowolnej skrzyni Kresu i odzyskanie ich w zupełnie innej. Możesz przetestować to teraz, umieszczając przedmioty w jednej ze skrzyń Kresu. + + + Odnawia 2{*ICON_SHANK_01*}, regeneruje zdrowie przez 30 sekund i daje odporność na ogień i obrażenia przez 5 minut. Powstaje z połączenia jabłka i bloków złota. + + + Może się teleportować + + + Teleport + + + Teleportuj do gracza + + + Teleportuj do mnie + + + Może wyłączyć zmęczenie + + + Może stać się niewidzialny + + + Możesz włączyć niewidzialność. + + + Nie możesz włączyć niewidzialności. + + + Możesz włączyć latanie. + + + Nie możesz włączyć latania. + + + Możesz wyłączyć zmęczenie. + + + Nie możesz wyłączyć zmęczenia. + + + Możesz się teleportować. + + + Nie możesz się teleportować. + + + {*T3*}INSTRUKCJA : KOWADŁO{*ETW*}{*B*}{*B*} +Poziomy doświadczenia mogą być używane do naprawy, zaklinania i zmieniania nazw przedmiotów na kowadle.{*B*} +Wszystkie przedmioty mogą mieć zmienioną nazwę, ale tylko przedmioty, które mają wytrzymałość, mogą być naprawione lub zaklęte z pomocą zaklętej księgi.{*B*} +Przedmiot może być naprawiony przez umieszczenie go w jednym z miejsc po lewej stronie, razem z odpowiednim materiałem (np. sztabka żelaza do żelaznego miecza) lub połączenie go z innym przedmiotem tego samego typu.{*B*} +Łączenie przedmiotów jest znacznie bardziej wydajne dzięki kowadłu, a jeżeli jeden z przedmiotów jest zaklęty, przedmiot powstały w wyniku połączenia także może posiadać zaklęcia.{*B*} +Zaklęte księgi mogą zakląć przedmioty, gdy zostaną użyte na kowadle, jeżeli księga będzie odpowiednia dla przedmiotu. Zaklęte księgi można znaleźć w skrzyniach, w lochach, lub stworzyć ze zwykłych książek przy użyciu magicznego stołu.{*B*} +Każde użycie kowadła zwiększa szansę na jego uszkodzenie. Po pewnym czasie zostanie ono całkowicie zniszczone.{*B*} + + + {*T3*}INSTRUKCJA : HANDEL{*ETW*}{*B*}{*B*} +Z osadnikami można wymieniać się przedmiotami. Każdy osadnik ma profesję. Mogą być farmerami, rzeźnikami, kowalami, bibliotekarzami lub kapłanami. Od tego zależy, jakie przedmioty będą mieć na wymianę.{*B*} +W menu handlu znajdziesz listę wszystkich przedmiotów, jakie mogą oferować osadnicy. Osadnik może zmienić lub powiększyć listę oferowanych przedmiotów za każdym razem, gdy gracz zechce z nim handlować. Handel może zostać tymczasowo zablokowany, jeżeli gracz będzie chciał zbyt często korzystać z tej funkcji.{*B*} +Handel na ogół polega na kupnie bądź sprzedaży przedmiotów za szmaragdy.{*B*} +Jeżeli nie masz niezbędnych do wymiany przedmiotów, oferta będzie wyświetlona na czerwono.{*B*} + + + {*T3*}INSTRUKCJA : SKRZYNIA KRESU {*ETW*}{*B*}{*B*} +Wszystkie skrzynie Kresu na świecie są połączone. Przedmioty umieszczone w skrzyni Kresu są dostępne w każdej innej. Jednak zawartość skrzyń Kresu jest unikalna dla każdego gracza. Umożliwia to graczom przechowanie przedmiotów w dowolnej skrzyni Kresu i odzyskanie ich w zupełnie innej. + + + + Farmer + + + Bibliotekarz + + + Kapłan + + + Kowal + + + Rzeźnik + + + Zamieszkują wioski. Posiadają przedmioty do handlu, zależnie od swojej profesji. + + + Wielka skrzynia + + + + Zaklęte księgi można tworzyć przy użyciu magicznego stołu, a następnie używać ich podczas korzystania z kowadła, aby nałożyć ich zaklęcia na przedmiot. + + + + Haczyki na linkę dostarczają stałego zasilania do obwodu, jeżeli coś aktywuje podłączoną do nich linkę. + + + + Po oswojeniu wilk zawsze będzie nosił obrożę. Można zmienić jej kolor dzięki barwnikom. + + + Marchewki i ziemniaki można uprawiać, sadząc je w ziemi. Będą gotowe do zbiorów, gdy warzywo będzie widoczne nad ziemią. + + + + Świnie można siodłać i jeździć na nich. Sterowanie odbywa się za pomocą marchewki na kiju. + + + + Jeżeli to konieczne, możesz powoli przesuwać wagonik, używając {*CONTROLLER_ACTION_MOVE*}. Dzięki temu można przesunąć wagonik na zasilany tor. + + + Nie możesz dołączyć do tej gry, ponieważ tryb podzielonego ekranu działa tylko w trybie HD. Wypisz pozostałych graczy, jeżeli chcesz dołączyć. + + + Ulecz + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/pl-PL/stringsLeaderboards.xml b/Minecraft.Client/PSVitaMedia/loc/pl-PL/stringsLeaderboards.xml new file mode 100644 index 00000000..0fbbee8a --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/pl-PL/stringsLeaderboards.xml @@ -0,0 +1,48 @@ + + + + Zabicia – niski + + + Zabicia – normalny + + + Zabicia – wysoki + + + Wydobyte bloki – spokojny + + + Wydobyte bloki – niski + + + Wydobyte bloki – normalny + + + Wydobyte bloki – wysoki + + + Zbiory – spokojny + + + Zbiory – niski + + + Zbiory – normalny + + + Zbiory – wysoki + + + Przebyty dystans – spokojny + + + Przebyty dystans – niski + + + Przebyty dystans – normalny + + + Przebyty dystans – wysoki + + \ 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 new file mode 100644 index 00000000..3b00adc6 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/pl-PL/stringsPlatformSpecific.xml @@ -0,0 +1,245 @@ + + + + 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 + + + NOT USED + + + {*T3*}INSTRUKCJA : TRYB TWORZENIA{*ETW*}{*B*}{*B*} +Interfejs trybu tworzenia umożliwia stworzenie dowolnego przedmiotu w ekwipunku gracza, bez potrzeby wydobywania bądź tworzenia danego przedmiotu. +Przedmioty z ekwipunku gracza nie będą znikać, gdy zostaną użyte lub umieszczone w świecie. Dzięki temu gracz może się skupić na budowaniu, a nie na zbieraniu surowców.{*B*} +Jeżeli stworzysz, wczytasz lub zapiszesz świat w trybie tworzenia, trofea oraz aktualizacje rankingów zostaną w nim zablokowane, nawet jeżeli zostanie wczytany w trybie przetrwania.{*B*} +Aby latać w trybie tworzenia, szybko dwukrotnie wciśnij{*CONTROLLER_ACTION_JUMP*}. Aby przestać latać, powtórz czynność. Aby latać szybciej, szybko wychyl{*CONTROLLER_ACTION_MOVE*} dwa razy podczas lotu. +Gdy latasz, przytrzymaj{*CONTROLLER_ACTION_JUMP*}, aby poruszać się w górę, lub {*CONTROLLER_ACTION_SNEAK*}, aby poruszać się w dół. Można też użyć {*CONTROLLER_ACTION_DPAD_UP*}, aby poruszać się w górę, {*CONTROLLER_ACTION_DPAD_DOWN*}, aby poruszać sie w dół, +{*CONTROLLER_ACTION_DPAD_LEFT*}, aby poruszać się w lewo i {*CONTROLLER_ACTION_DPAD_RIGHT*}, aby poruszać się w prawo. + + + 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" + + + 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ć? + + + "NOT USED" + + + 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. + + + 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". +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? + + + 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/pl-PL/stringsRichPresence.xml b/Minecraft.Client/PSVitaMedia/loc/pl-PL/stringsRichPresence.xml new file mode 100644 index 00000000..30c8ea77 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/pl-PL/stringsRichPresence.xml @@ -0,0 +1,66 @@ + + + + {GAME_STATE} + + + Stoi bezczynnie + + + W menu + + + Gra w sieciowym trybie wieloosobowym – {GAME_STATE} + + + Gra w lokalnym trybie wieloosobowym – {GAME_STATE} + + + Gra sam – {GAME_STATE} + + + Gra sam lokalnie – {GAME_STATE} + + + Podziwia widoki! + + + Jedzie na świni + + + Jedzie w wagoniku + + + Płynie łódką + + + Łowi ryby + + + Wytwarza + + + Wykuwa + + + Wędruje w Otchłani + + + Słucha płyty + + + Patrzy na mapę + + + Zaklinanie + + + Warzenie mikstury + + + Praca na kowadle + + + Spotkania z sąsiadami + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/pt-BR/4J_stringsGeneric.xml b/Minecraft.Client/PSVitaMedia/loc/pt-BR/4J_stringsGeneric.xml new file mode 100644 index 00000000..fd88f3d6 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/pt-BR/4J_stringsGeneric.xml @@ -0,0 +1,87 @@ + + + + OK + + + Voltar + + + Cancelar + + + Sim + + + Não + + + Salvamento corrompido + + + Seus dados de salvamento parecem estar corrompidos. Criar novo salvamento e substituir o corrompido? + + + Sem Espaço Livre + + + Selecionar novamente + + + Jogar sem salvar + + + Criar novo salvamento + + + Substituir salvamento? + + + Não substituir + + + Substituir e salvar + + + Falha ao salvar + + + Continuar sem salvar + + + Falha ao carregar + + + Nomeie o salvamento + + + Digite um nome para salvar o jogo + + + Tem certeza de que deseja sair do jogo? + + + Sessão finalizada + + + Continuar jogando + + + Continuar jogando offline + + + Jogador Convidado + + + Jogadores convidados não podem acessar a "PSN". + + + Salvando… + + + Salvando conteúdo. Não desligue o sistema PlayStation®Vita. + + + Desbloquear jogo completo + + \ 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 new file mode 100644 index 00000000..f5a2037d --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/pt-BR/4J_stringsPlatformSpecific.xml @@ -0,0 +1,52 @@ + + + + Falha ao salvar configurações na conta da Sony Entertainment Network. + + + Problema 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 new file mode 100644 index 00000000..5cac9090 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/pt-BR/AdditionalStrings.xml @@ -0,0 +1,96 @@ + + + + Exibir todos os Mundos de Combinações + + + Ocultar + + + Minecraft: PlayStation®3 Edition + + + Opções + + + Salvar cache + + + Ocorreu um erro com a rede. + + + Erro com a rede + + + Ocorreu um erro com a rede. Voltando ao Menu principal. + + + O serviço online está desativado em sua conta da Sony Entertainment Network devido a restrições de bate-papo. + + + O serviço online está desativado em sua conta da Sony Entertainment Network devido à configuração do controle parental. + + + Serviço online + + + Sua sessão na "PSN" foi finalizada. Os recursos online do jogo não estarão disponíveis até você iniciar a sessão "PSN". + + + Sua sessão na "PSN" foi finalizada. Os recursos online do jogo não estarão disponíveis até você iniciar a sessão "PSN". Voltando ao Menu principal. + + + Selecione o usuário para o jogador %d (ou cancele para jogar como convidado) + + + Gratuito + + + 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. + + + Troféus desativados + + + Os Troféus serão desativados, pois este salvamento pertence a outro usuário. + + + Erro crítico: falha na inicialização de troféus. Saia do jogo. + + + Convites + + + Arquivo corrompido + + + Controle desconectado + + + Seu controle foi desconectado. Reconecte o controle. + + + 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. + + + Convite + + + Venha jogar uma partida de Minecraft: PlayStation®Vita Edition! + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/pt-BR/EULA.xml b/Minecraft.Client/PSVitaMedia/loc/pt-BR/EULA.xml new file mode 100644 index 00000000..e2c722cd --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/pt-BR/EULA.xml @@ -0,0 +1,98 @@ + + + + Minecraft: PlayStation®Vita Edition - TERMOS DE USO + Estes termos definem algumas regras para o uso de Minecraft: PlayStation®Vita Edition ("Minecraft"). A fim de proteger o Minecraft e os membros de nossa comunidade, precisamos destes termos para definir algumas regras sobre o download e uso do Minecraft. Nós não gostamos de regras mais do que você, então tentamos manter este texto o mais curto possível, mas se você comprar, fizer download, usar ou jogar Minecraft, você está concordando com estes termos ("Termos"). + Antes de continuarmos, há algo que gostaríamos de deixar bem claro. Minecraft é um jogo que permite aos jogadores construírem e quebrarem coisas. Se você jogar com outras pessoas (multijogador), você poderá construir com elas ou poderá quebrar o que elas construíram, e elas poderão fazer o mesmo com você. Portanto, não jogue com outras pessoas se elas não se comportarem como você quer que elas o façam. Além disso, às vezes as pessoas fazem coisas que não deveriam. Nós não gostamos disso, mas não há muito que possamos fazer para impedi-las, exceto pedir que todos se comportem adequadamente. Contamos com você e com outros como você na comunidade para nos avisar se alguém não está se comportando adequadamente e, se esse for o caso, e/ou você achar que alguém está violando as regras ou os presentes termos ou usando o Minecraft de forma indevida, envie-nos seus comentários. Temos um sistema de sinalização/comunicado para isso, então o utilize e tomaremos as medidas necessárias para lidar com isso. + Para sinalizar ou relatar problemas, envie um email para support@mojang.com e forneça o máximo de informações possível, como os detalhes do usuário e o que aconteceu. + Agora, vamos voltar aos termos: + UMA REGRA PRINCIPAL + A regra principal é que você não deve distribuir qualquer coisa que nós fizemos. Por "distribuir qualquer coisa que nós fizemos" entenda-se "fazer cópias de Minecraft, fazer uso comercial do jogo, tentar ganhar dinheiro a partir do mesmo ou deixar que outras pessoas tenham acesso a Minecraft e suas partes de forma injusta ou inaceitável". Portanto, a única regra principal é que, a menos que concordemos especificamente, como em nossas Diretrizes de utilização de marca e ativos (Brand and Asset Usage Guidelines), você não deve: + • fornecer cópias de Minecraft para qualquer outra pessoa; + • fazer uso comercial de qualquer coisa que nós fizemos; + • tentar ganhar dinheiro com qualquer coisa que nós fizemos, ou + • deixar que outras pessoas tenham acesso, de forma injusta ou inaceitável, a qualquer coisa que nós fizemos. + ...E para sermos completamente claros, o "que nós fizemos" inclui, mas não de forma limitada, o cliente ou o software do servidor para Minecraft. Também estão incluídas as versões modificadas de um jogo, parte dele ou qualquer outra coisa que tenhamos feito. + Por outro lado, nós somos muito flexíveis com relação ao que você faz. Na verdade, nós estimulamos que você faça coisas legais (veja abaixo), mas não faça aquilo que dizemos que você não pode fazer. + UTILIZAÇÃO DO MINECRAFT + • Você comprou o Minecraft e, por essa razão, pode usá-lo em seu sistema PlayStation®Vita. + • A seguir, também damos a você direitos limitados para fazer outras coisas, mas temos que definir um limite de alguma forma, ou então as pessoas irão longe demais. Se você quiser fazer algo relacionado a qualquer coisa que nós fizemos, ficamos honrados, mas certifique-se de que isso não poderá ser interpretado como algo oficial e observe se isso está em conformidade com os presentes Termos e, acima de tudo, não faça uso comercial de qualquer coisa que nós fizemos. + • A permissão dada a você para utilizar e jogar Minecraft pode ser revogada se você quebrar os presentes termos. + • Quando você compra Minecraft, damos a permissão para a instalação de Minecraft em seu sistema PlayStation®Vita, assim como para o uso e jogo em seu sistema PlayStation®Vita, conforme estabelecido nos presentes termos. Esta permissão é pessoal para você, então você não possui permissão para distribuir Minecraft (ou qualquer parte dele) a qualquer outra pessoa (exceto se expressamente permitido por nós, claro). + • Dentro de certos limites, você está livre para fazer o que quiser com capturas de tela e vídeos de Minecraft. Por "dentro de certos limites" queremos dizer que você não pode fazer uso comercial deles ou fazer algo injusto ou que afete negativamente nossos direitos. Além disso, não extraia recursos de arte e compartilhe-os. Isso não tem graça. + • Essencialmente, a regra simples é não fazer uso comercial de qualquer coisa que tenhamos feito, a menos que isso seja especificamente acordado por nós, seja em nossas Diretrizes de utilização de marca e ativos (Brand and Asset Usage Guidelines) ou sob os presentes Termos. Ah, e se a lei permitir de maneira expressa, como sob a doutrina de "uso justo" ou "negócio justo", então tudo bem, mas apenas para os limites expressos pela lei. + PROPRIEDADE DO MINECRAFT E OUTRAS COISAS + • Apesar de darmos a você a permissão para jogar Minecraft, ainda somos proprietários dele. Somos também os proprietários de nossas marcas e qualquer conteúdo de Minecraft, que é composto por nosso software, texturas, recursos, ferramentas, infraestrutura e toda a variedade de coisas espertas (e não tão espertas) que possuímos. Todos nossos direitos sobre essas coisas são expressos e reservados, mas você pode usá-las sujeito aos presentes Termos. + • Isso não significa que nós somos proprietários das coisas legais que você cria usando o Minecraft. Você só deve aceitar que nós possuímos cada parte de Minecraft e Minecraft como um produto e serviço e essas coisas mencionadas na frase anterior, e também somos proprietários dos direitos de autor e de outros direitos chamados de propriedade intelectual ("IPRs") associados a essas coisas e os nomes e marcas associados ao Minecraft. + • É claro que você fará seu próprio conteúdo usando o Minecraft. Nós não somos proprietários do conteúdo criado por você e nós não reivindicamos a propriedade de qualquer coisa que não devemos reivindicar. No entanto, possuiremos coisas que são cópias (ou cópias substanciais) ou derivados de nossa propriedade e de nossas criações (como descrito acima), mas se você criar coisas originais, elas não serão nossas. Assim, como um exemplo: + - Um único bloco é de nossa propriedade; + - Uma catedral gótica com uma montanha-russa passando por dentro dela: isso nós não possuímos. + • Por isso, quando você paga pelo uso de Minecraft, você está comprando apenas uma permissão para utilizar o produto Minecraft de acordo com os presentes termos. As únicas permissões que você tem em relação a Minecraft são as permissões previstas nos presentes termos. + CONTEÚDO + • Se você produzir conteúdo disponível no ou através do Minecraft, você deve nos dar permissão para usar, copiar, modificar e adaptar esse conteúdo. Esta permissão deve ser irrevogável e irrestrita. Você também deve permitir que outras pessoas usem seu conteúdo e deve permitir que as outras pessoas que você deixou acessá-lo (como as pessoas com quem você joga partidas multijogador) o usem. + • Tenha cuidado antes de disponibilizar conteúdos, pois eles podem ser tornar públicos e podem ser usados por outras pessoas de uma forma que você talvez não goste. + • Se você for disponibilizar algo no Minecraft ou através do mesmo, este conteúdo não deve ser ilegal ou ofensivo a pessoas, deve ser honesto e deve ser sua própria criação. Os tipos de coisas que você não deve disponibilizar usando o Minecraft incluem: mensagens que incluam linguagem racista ou homofóbica; mensagens de bullying ou com brincadeiras de mau gosto; mensagens que possam danificar nossa reputação ou a de outra pessoa; mensagens que incluam pornografia, publicidade ou a criação ou imagem de outra pessoa; ou mensagens representando um moderador ou tentando enganar ou explorar pessoas. + • Qualquer conteúdo que você disponibilizar no Minecraft também deve ser de sua criação. Você não deve disponibilizar conteúdo, usando o Minecraft, que infrinja os direitos de qualquer outra pessoa. Se você postar conteúdo em Minecraft e nós formos contestados, ameaçados ou processados por alguém porque o conteúdo viola os direitos daquela pessoa, podemos responsabilizar você, e isso significa que você poderá ter que nos pagar por danos que venhamos a sofrer como resultado. Por isso, é muito importante que você disponibilize apenas conteúdo criado por você e não disponibilize conteúdo criado por outra pessoa. + • Tenha cuidado com quem você brinca. É difícil para você ou para nós termos certeza de que o que as pessoas dizem é verdade, ou mesmo se as pessoas são realmente quem dizem ser. Você também não deve fornecer informações sobre si mesmo através do Minecraft. + Se você disponibilizará conteúdo ("seu conteúdo") usando o Minecraft, ele deverá: + - cumprir com todas as regras da Sony Computer Entertainment, incluindo os Termos de serviço e Contrato do usuário da "PSN" e quaisquer outras diretrizes que você tiver que aceitar a fim de usar seu sistema PlayStation®Vita e a "PSN"; + - Não ser ofensivo com as pessoas; + - Não agir de forma ilegal ou ilícita; + - Ser honesto e não iludir, enganar ou explorar ninguém, nem se passar por outros; + - Não infringir direitos autorais de ninguém ou outros direitos; + - Não ser racista, sexista ou homofóbico; + - Não promover bullying ou brincadeiras de mau gosto; + - Não prejudicar nossa reputação ou a de outra pessoa; + - Não incluir pornografia; + - Não incluir publicidade. + - Você não deve disponibilizar conteúdo, usando o Minecraft, que infrinja os direitos de qualquer outra pessoa. + • Você é responsável por todo o conteúdo que disponibilizar usando Minecraft. + • Ao disponibilizar seu conteúdo, você garante e afirma que possui todos os direitos de fazê-lo em concordância com os presentes termos e que nós podemos exercer os direitos que você nos concedeu sob os presentes termos. + • Se formos contestados, ameaçados ou processados por alguém devido a qualquer conteúdo disponibilizado por você com o uso do Minecraft ou disponibilizado por qualquer pessoa no Minecraft ou por meio dele, ele poderá ser removido e você poderá ser responsabilizado e poderá ter que nos compensar por danos que venhamos a sofrer como resultado. Seu acesso a certos aspectos do Minecraft pode ser revogado ou suspenso também. + CONTEÚDO DO USUÁRIO + A seção seguinte define alguns termos relativos a seu conteúdo e ao conteúdo disponibilizado por outros que são referidos simplesmente como "Conteúdo do usuário". Minecraft é um serviço de entretenimento e, auxiliar a isto, nós (e nossos licenciados, como a Sony Computer Entertainment) estamos envolvidos na transmissão, distribuição, armazenamento e recuperação de Conteúdo do usuário, sem revisão, seleção ou alteração do conteúdo. O que isto significa é que nós não revisamos o conteúdo do usuário e, por essa razão, não saberemos o que está sendo divulgado por você ou por outras pessoas. Temos essas regras nos presentes Termos de modo que você e outras pessoas devem cumpri-las, mas não podemos saber tudo o que acontece. + Dessa forma, observe que: + • Os pontos de vista expressos em qualquer Conteúdo do usuário são os pontos de vista dos autores ou criadores individuais e não são os nossos ou os de qualquer um ligado a nós, a menos que especifiquemos o contrário; + • Não somos responsáveis por (e não oferecemos garantias ou representações em relação ao ou assumimos obrigações por) todo o Conteúdo do usuário, incluindo comentários, opiniões ou observações expressos no mesmo; + • Ao usar o Minecraft você reconhece que não temos responsabilidade de revisar o conteúdo de qualquer Conteúdo do usuário e que todo o conteúdo do usuário é disponibilizado de uma forma em que não somos obrigados a fazer ou exercer qualquer controle ou julgamento sobre ele. + No entanto, nós (ou nossos licenciados, como a Sony Computer Entertainment) podemos remover, rejeitar ou suspender o acesso a qualquer Conteúdo do usuário e remover ou suspender sua capacidade de publicar, disponibilizar ou acessar o Conteúdo do usuário, incluindo a remoção ou suspensão do acesso ao Minecraft ou à "PSN" se considerarmos que é adequado fazê-lo, devido a, por exemplo, você ter violado os presentes termos ou termos recebido uma reclamação. Também agiremos com diligência para remover ou revogar o acesso a Conteúdo do usuário se e quando tivermos conhecimento real de que o mesmo seja ilegal. + APRIMORAMENTOS + • Podemos disponibilizar aprimoramentos e atualizações ao longo do tempo, mas não precisamos fazê-lo. Nós também não somos obrigados a fornecer suporte contínuo ou realizar manutenção de qualquer jogo. É claro que esperamos continuar lançando novas versões de Minecraft. Nós simplesmente não podemos garantir que vamos fazê-lo. + NOSSA RESPONSABILIDADE + • Quando você obtém uma cópia de Minecraft, nós a fornecemos "como está". Atualizações e aprimoramentos também são fornecidos "como está". Isso significa que não estamos fazendo promessas a você com relação ao padrão ou à qualidade de Minecraft, ou que Minecraft será ininterrupto ou livre de erros ou qualquer perda ou dano que eles causarem. Nós apenas prometemos oferecer Minecraft e quaisquer serviços com habilidade e atenção aceitável. A lei na maioria dos países diz que não podemos renunciar à responsabilidade por morte ou danos pessoais causados por nossa negligência. Por isso, se seu computador se levantar e apunhalar você devido a algo que fizemos de errado, então assumiremos a culpa sobre isso. + NÓS NÃO SOMOS RESPONSÁVEIS POR: + • QUALQUER USO OU MAU USO DE MINECRAFT POR VOCÊ OU POR QUALQUER OUTRA PESSOA; + • QUALQUER CONTEÚDO DISPONIBILIZADO POR VOCÊ AO USAR MINECRAFT; + • QUALQUER VIOLAÇÃO DOS PRESENTES TERMOS POR VOCÊ; + • QUALQUER VIOLAÇÃO DE QUAISQUER TERMOS POR QUALQUER OUTRA PESSOA. + RESCISÃO + • Se quisermos, podemos rescindir seu direito de uso do Minecraft se você violar os presentes termos. Você pode encerrá-lo também, a qualquer momento. Tudo o que você precisa fazer é desinstalar Minecraft de seu sistema PlayStation®Vita. Independentemente do caso, os parágrafos sobre "Propriedade do Minecraft", "Nossa responsabilidade" e "Coisas em geral" continuarão em vigência mesmo após a rescisão. + COISAS EM GERAL + • Os presentes Termos estão sujeitos a quaisquer direitos legais que você possa ter. Nada nos presentes termos limitará qualquer um de seus direitos que não puder ser excluído sob a lei nem deverá excluir ou limitar nossa responsabilidade por morte ou danos pessoais resultantes de negligência nossa, nem qualquer representação fraudulenta. + • Também podemos alterar os presentes Termos de tempos em tempos, mas tais mudanças só serão eficazes na medida em que possam ser aplicadas de forma legal. Por exemplo, se você usar Minecraft apenas no modo de um jogador e não usar as atualizações que disponibilizamos, então o antigo Contrato de licença do usuário final se aplica, mas se você usar as atualizações ou usar partes do Minecraft que dependam de nossa prestação de serviços online em curso, então o novo Contrato de licença do usuário final será aplicado. Nesse caso, talvez não possamos/não precisemos informar sobre as mudanças para que elas tenham efeito, então você precisará conferir esta seção de tempos em tempos para ficar ciente de quaisquer alterações aos presentes termos. No entanto, não seremos injustos quanto a isso, mas, às vezes, a lei muda ou alguém faz algo que afeta outros usuários do Minecraft e, portanto, precisamos colocar um limite nisso. + • Se nos apresentar uma sugestão para Minecraft ou qualquer um de nossos jogos, essa sugestão é feita de forma gratuita. Isso significa que poderemos usar sua sugestão da forma como preferirmos e não teremos que pagar por isso. Se você acredita que tem uma sugestão pela qual estaríamos dispostos a pagar, você deve afirmar que espera ser pago antes de nos informar sua sugestão. + • Além dos presentes termos, temos também algumas Diretrizes de utilização de marca e ativos (Brand and Asset Usage Guidelines) que você pode encontrar online. + • Se você violar essas regras, nós (ou a Sony Computer Entertainment) podemos impedi-lo de usar o Minecraft. Se você não deseja ou não pode concordar com estas regras, então você não deve comprar, fazer download, usar ou jogar Minecraft. + Se há algo legal sobre o qual você está se perguntando e que não foi respondido nesta página, não faça e pergunte-nos sobre isso. Basicamente, não seja ridículo e nós não seremos. + Estamos em: + Mojang AB + Maria Skolgata 83, + SE-11853 + Estocolmo + Suécia + Número da empresa: 556819-2388 + + + + + Qualquer conteúdo comprado na loja do jogo será comprado da Sony Network Entertainment Europe Limited ("SNEE") e estará sujeito aos Termos de serviço e Contrato do usuário da Sony Entertainment Network, que está disponível na PlayStation®Store. Verifique os direitos de uso para cada compra, pois eles podem variar de item para item. A menos que haja indicação contrária, o conteúdo disponível em qualquer loja do jogo tem a mesma classificação etária do jogo. + + + A compra e o uso de itens estão sujeitos aos Termos de serviço e Contrato do usuário da Sony Entertainment Network. Este serviço online foi sublicensiado a você pela Sony Computer Entertainment America. + + + + + Lembre-se: o uso desse software está sujeito aos Termos de Uso de Software em eu.playstation.com/legal. + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/pt-BR/stringsDynafont.xml b/Minecraft.Client/PSVitaMedia/loc/pt-BR/stringsDynafont.xml new file mode 100644 index 00000000..dca31ec2 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/pt-BR/stringsDynafont.xml @@ -0,0 +1,7 @@ + + + + DynaFont developed by DynaComware. + + + \ 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 new file mode 100644 index 00000000..8af8fb69 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/pt-BR/stringsGeneric.xml @@ -0,0 +1,7056 @@ + + + + Alternando para jogo offline + + + Aguarde enquanto o host salva o jogo + + + Entrando no FINAL + + + Salvando jogadores + + + Conectando ao host + + + Baixando terreno + + + Saindo do FINAL + + + 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. + + + 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. + + + Carregando nível + + + Finalizando... + + + Construindo terreno + + + Simulando o mundo um pouquinho + + + Classif. + + + Preparando para salvar nível + + + Preparando partes... + + + Inicializando o servidor + + + Saindo do Submundo + + + Renascendo + + + Criando nível + + + Produzindo área de criação + + + Carregando área de criação + + + Entrando no Submundo + + + Ferramentas e Armas + + + Gama + + + Sensibilidade do Jogo + + + Sensib. Interface + + + Dificuldade + + + Música + + + Som + + + Pacífico + + + 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. + + + Fácil + + + Normal + + + Difícil + + + Sessão finalizada + + + Armadura + + + Mecanismos + + + Transporte + + + Armas + + + Alimentos + + + Estruturas + + + Decorações + + + Poções + + + Ferramentas, Armas e Armaduras + + + Materiais + + + Blocos de Construção + + + Redstone e Transporte + + + Diversos + + + Entradas: + + + 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! + + + 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 + + + Criar novo mundo + + + Digite um nome para o mundo + + + Insira a semente para a criação do seu mundo + + + Carregar mundo salvo + + + Jogar tutorial + + + Tutorial + + + Nomear mundo + + + Jogo danificado + + + OK + + + Cancelar + + + Loja Minecraft + + + Girar + + + Ocultar + + + Limpar Todos os Espaços + + + Tem certeza de que deseja sair do jogo atual e entrar no novo jogo? O progresso não salvo será perdido. + + + 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 + + + Sair do Jogo + + + Salvar Jogo + + + Sair sem salvar + + + Pressione START p/ entrar + + + 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ê 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! + + + 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? + + + Amigos + + + Minha pontuação + + + Geral + + + Aguarde + + + Sem resultados + + + Filtro: + + + Você não pode entrar neste jogo, pois o jogador com o qual está tentando jogar está executando uma versão anterior do jogo. + + + Conexão perdida + + + A conexão com o servidor foi perdida. Saindo para o menu principal. + + + Desconectado pelo servidor + + + Saindo do jogo + + + Erro. Saindo para o menu principal. + + + Falha na conexão + + + Você foi expulso do jogo + + + 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ê foi expulso do jogo por voar + + + A tentativa de conexão demorou muito + + + O servidor está cheio + + + 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! + + + Temas + + + Pacotes de capas + + + Permite os amigos dos amigos + + + 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 + + + Você não pode entrar neste jogo porque ele foi limitado aos jogadores que são amigos do host. + + + 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. + + + Não é possível entrar no jogo + + + Selecionado + + + Capa selecionada: + + + Obter versão completa + + + 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 + + + Semente + + + Desbloquear pacote de capas + + + Para usar a capa selecionada, você precisa desbloquear este pacote de capas. +Deseja desbloquear o pacote de capas agora? + + + 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? + + + 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 + + + Pacote de textura não disponível + + + Desbloquear a versão completa + + + Fazer download da versão de avaliação + + + Seu modo de jogo foi alterado + + + 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. + + + Normal + + + Superplano + + + Quando habilitado, o jogo será um jogo online. + + + Quando desabilitado, os jogadores que entrarem no jogo não poderão construir nem minerar sem autorização. + + + 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. + + + 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. + + + Desativado + + + Modo de jogo: Criativo + + + Sobrevivência + + + Criativo + + + Renomeie seu mundo + + + Digite o novo nome para seu mundo + + + Modo de jogo: Sobrevivência + + + Criado em Sobrevivência + + + Renomear salvamento + + + Salvando automaticamente em %d... + + + Ativado + + + Criado em Criativo + + + Renderizar Nuvens + + + O que deseja fazer com este jogo salvo? + + + Tamanho do HUD (tela dividida) + + + Ingrediente + + + Combustível + + + Distribuidor + + + Baú + + + Feitiço + + + Fornalha + + + Não há ofertas de conteúdo oferecido para download desse tipo disponíveis para este título no momento. + + + Tem certeza de que deseja excluir este jogo salvo? + + + A confirmar + + + Censurado + + + %s entrou no jogo. + + + %s saiu do jogo. + + + %s foi expulso do jogo. + + + Barraca de Poções + + + Digitar texto da placa + + + Digite uma linha de texto para sua placa + + + Digitar título + + + Tempo limite de avaliação + + + Versão completa + + + Falha ao entrar no jogo, pois não há espaços restantes + + + Digite um título para sua postagem + + + Digite uma descrição para sua postagem + + + Inventário + + + Ingredientes + + + Digitar legenda + + + Digite uma legenda para sua postagem + + + Digitar descrição + + + Tocando agora: + + + 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. + + + 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? + + + Intervalo Salv. Autom.: DESL. + + + Opacidade da interface + + + Preparando salvamento automático do nível + + + Tamanho do HUD + + + 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. + + + Capas favoritas + + + Jogo de %s + + + Jogo com host desconhecido + + + Convidado saiu + + + Redefinir Configurações + + + Tem certeza de que deseja redefinir suas configurações para os valores padrão? + + + Erro de carregamento + + + Um jogador convidado saiu, fazendo todos os jogadores convidados serem removidos do jogo. + + + Falha ao criar jogo + + + Seleção automática + + + Nenhum pacote: Capas padrão + + + Entrar + + + Você não está conectado. Para jogar este jogo, você deve estar conectado. Deseja conectar agora? + + + Multijogador não é permitido + + + Beber + + + + 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. + + + 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. + + + + No baú desta área há alguns componentes para fabricar circuitos com pistões. Tente usar ou completar os circuitos desta área ou formar você mesmo. Há mais exemplos fora da área do tutorial. + + + + + Nesta área há um Portal para o Submundo! + + + + + {*B*} + Pressione{*CONTROLLER_VK_A*} para saber mais sobre Portais e o Submundo.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber como funcionam os Portais e o Submundo. + + + + + O pó de redstone é obtido pela extração de minério de redstone com uma picareta de ferro, diamante ou ouro. Você pode usá-lo para transmitir energia para até 15 blocos e ele pode viajar um bloco acima ou abaixo na altura. + {*ICON*}331{*/ICON*} + + + + + Repetidores de redstone podem ser usados para ampliar a distância que a energia é transportada ou colocar um atraso no circuito. + {*ICON*}356{*/ICON*} + + + + + Quando acionado, um pistão se estenderá, empurrando até 12 blocos. Quando retraídos, os Pistões aderentes podem puxar um bloco da maioria dos tipos. + {*ICON*}33{*/ICON*} + + + + + 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 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. + + + + + Para ativar um Portal do Submundo, incendeie os blocos de Obsidiana dentro da estrutura com Sílex e Aço. Os Portais podem ser desativados se a estrutura estiver quebrada, se ocorrer uma explosão próxima ou se algum líquido fluir através deles. + + + + + Para usar um Portal do Submundo, fique de pé dentro dele. Sua tela ficará roxa e um som será tocado. Depois de alguns segundos, você será transportado para outra dimensão. + + + + + O Submundo pode ser um lugar perigoso, cheio de lava, mas pode ser útil para coletar Pedra Inflamável, que queima para sempre quando acesa, e Glowstone, que produz luz. + + + + Agora você completou o tutorial da fazenda. + + + 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. + + + 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. + + + + 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". + + + 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*} + + + + {*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. + + + + 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. + + + + + 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. + + + + + Se o caldeirão ficar vazio, você pode enchê-lo com um Balde de Água. + + + + + Use a barraca de poções para criar uma Poção de Resistência ao Fogo. Você precisará de uma Garrafa de Água, Verruga do Submundo e Creme de Magma. + + + + +Com a poção na mão, segure{*CONTROLLER_ACTION_USE*} para usá-la. Se for uma poção normal, você pode bebê-la e aplicar o efeito em si mesmo, e se for uma Poção Tchibum, você pode atirá-la e aplicar o efeito nas criaturas próximas de onde ela acertar. +As poções tchibum podem ser criadas adicionando pólvora a poções normais. + + + + {*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. + + + + + Agora que você está resistente ao fogo e à lava, veja se há lugares em que você consegue chegar que não conseguia antes. + + + + + Esta é a interface de feitiços, que você pode usar para adicionar feitiços a armas, à armadura e a algumas ferramentas. + + + + {*B*} + Pressione{*CONTROLLER_VK_A*} para saber mais sobre a interface de feitiços.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber usar a interface de feitiços. + + + + + Nesta área há uma Barraca de Poções, um Caldeirão e um baú cheio de itens para fazer poções. + + + + + 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. + + + + + 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. + + + + + Pressione{*CONTROLLER_ACTION_USE*} para jogar a linha e começar a pescar. Pressione{*CONTROLLER_ACTION_USE*} novamente para puxar a linha de pesca. + {*FishingRodIcon*} + + + + + Se esperar a boia afundar antes de puxar a linha, você poderá pegar um peixe. Os peixes podem ser comidos crus ou cozidos na fornalha para restaurar a energia. + {*FishIcon*} + + + + + Como outras ferramentas, a vara de pescar tem um número determinado de utilidades. Mas elas não se limitam a pegar peixes. Experimente para ver o que mais pode ser pego ou ativado com ela... + {*FishingRodIcon*} + + + + + 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. + + + + + {*B*} + Pressione{*CONTROLLER_VK_A*} para saber mais sobre as camas.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber usar as camas. + + + + + A cama deve ser colocada em um lugar seguro e bem iluminado para que os monstros não o acordem no meio da noite. Depois de usar uma cama, se você morrer renascerá nela. + {*ICON*}355{*/ICON*} + + + + + Se houver outros jogadores no jogo, todos deverão estar em uma cama ao mesmo tempo para poderem dormir. + {*ICON*}355{*/ICON*} + + + + + {*B*} + Pressione{*CONTROLLER_VK_A*} para saber mais sobre os barcos.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber usar os barcos. + + + + + 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. + + + + + 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. + + + + + 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. + + + + + 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*} + + + + + 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. + + + + 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. + + + + Parabéns, você concluiu o tutorial. O tempo no jogo agora passará no ritmo normal e não falta muito para a noite, quando os monstros aparecem! Termine seu abrigo! + + + + {*EXIT_PICTURE*} Quando estiver pronto para explorar mais, há uma escadaria nesta área perto do abrigo do mineiro que leva a um pequeno castelo. + + + {*B*}Pressione{*CONTROLLER_VK_A*} para jogar no tutorial normalmente.{*B*} + Pressione{*CONTROLLER_VK_B*} para pular o tutorial principal. + + + + {*B*} + Pressione{*CONTROLLER_VK_A*} para saber mais sobre a barra de alimentos e como comer.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber usar a barra de alimentos e como comer. + + + + Selecionar + + + Usar + + + 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. + + + + Pegar + + + Próximo + + + Anterior + + + Expulsar + + + Enviar Pedido de Amizade + + + Página Abaixo + + + Página Acima + + + Tingir + + + Curar + + + Sentar + + + Seguir-me + + + Extrair + + + Alimentar + + + Domar + + + Alterar Filtro + + + Colocar tudo + + + Colocar um + + + Soltar + + + Pegar tudo + + + Pegar metade + + + Colocar + + + Soltar tudo + + + Limpar Seleção Rápida + + + O que é isto? + + + Compartilhar no Facebook + + + Soltar um + + + Trocar + + + Mover rápido + + + Pacotes de capas + + + Painel de Cristal Tingido de Vermelho + + + Painel de Cristal Tingido de Verde + + + Painel de Cristal Tingido de Marrom + + + Cristal Tingido de Branco + + + Painel de Cristal Tingido + + + Painel de Cristal Tingido de Preto + + + Painel de Cristal Tingido de Azul + + + Painel de Cristal Tingido de Cinza + + + Painel de Cristal Tingido de Rosa + + + Painel de Cristal Tingido de Verde-limão + + + Painel de Cristal Tingido de Roxo + + + Painel de Cristal Tingido de Cíano + + + Painel de Cristal Tingido de Cinza-claro + + + Cristal Tingido de Laranja + + + Cristal Tingido de Azul + + + Cristal Tingido de Roxo + + + Cristal Tingido de Cíano + + + Cristal Tingido de Vermelho + + + Cristal Tingido de Verde + + + Cristal Tingido de Marrom + + + Cristal Tingido de Cinza-claro + + + Cristal Tingido de Amarelo + + + Cristal Tingido de Azul-claro + + + Cristal Tingido de Magenta + + + Cristal Tingido de Cinza + + + Cristal Tingido de Rosa + + + Cristal Tingido de Verde-limão + + + Painel de Cristal Tingido de Amarelo + + + Cinza-claro + + + Cinza + + + Rosa + + + Azul + + + Roxo + + + Cíano + + + Verde-limão + + + Laranja + + + Branco + + + Personalizado + + + Amarelo + + + Azul-claro + + + Magenta + + + Marrom + + + Painel de Cristal Tingido de Branco + + + Bola pequena + + + Bola grande + + + Painel de Cristal Tingido de Azul-claro + + + Painel de Cristal Tingido de Magenta + + + Painel de Cristal Tingido de Laranja + + + Formato de estrela + + + Preto + + + Vermelho + + + Verde + + + Formato de Creeper + + + Explosão + + + Formato desconhecido + + + Cristal Tingido de Preto + + + Armadura de Ferro de Cavalo + + + Armadura de Ouro de Cavalo + + + 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*} +{*C3*}Quem somos nós? Já fomos chamados de espírito da montanha. Pai sol, mãe lua. Espíritos ancestrais, espíritos animais. Jinn. Fantasmas. O homem verde. Depois deuses e demônios. Anjos. Poltergeists. Alienígenas, extraterrestres. Léptons, quarks. As palavras mudam. Nós não.{*EF*}{*B*}{*B*} +{*C2*}Somos o universo. Somos tudo o que não é você. Você está olhando para nós agora, pela pele e por seus olhos. E por que o universo toca sua pele e lança luz sobre você? Para vê-lo, jogador. Para conhecê-lo. E para ser conhecido. Quero lhe contar uma história.{*EF*}{*B*}{*B*} +{*C2*}Era uma vez um jogador.{*EF*}{*B*}{*B*} +{*C3*}Esse jogador era você, {*PLAYER*}.{*EF*}{*B*}{*B*} +{*C2*}Às vezes se julgava humano, na crosta fina de um globo girando de rocha pastosa. A bola de rocha pastosa circundava uma bola de gás flamejante 330 mil vezes mais compacta que ela. Estavam tão longe que a luz levava oito minutos para cruzar a distância. A luz era informação de uma estrela e podia queimar sua pela a 150 milhões de quilômetros de distância.{*EF*}{*B*}{*B*} +{*C2*}Às vezes o jogador sonhava que era um mineiro, na superfície de um mundo plano e infinito. O sol era um quadrado branco. Os dias eram curtos; havia muito a fazer; e a morte era uma inconveniência temporária.{*EF*}{*B*}{*B*} +{*C3*}Às vezes o jogador sonhava que estava perdido em uma história.{*EF*}{*B*}{*B*} +{*C2*}Às vezes sonhava que era outras coisas, em outros lugares. Às vezes esses sonhos eram perturbadores. Outras eram bem bonitos. Às vezes o jogador acordava de um sonho em outro, depois acordava desse em um terceiro.{*EF*}{*B*}{*B*} +{*C3*}Às vezes o jogador sonhava que via palavras em uma tela.{*EF*}{*B*}{*B*} +{*C2*}Vamos voltar.{*EF*}{*B*}{*B*} +{*C2*}Os átomos do jogador estavam espalhados na grama, nos rios, no ar, no chão. Uma mulher recolheu os átomos; ela bebeu, comeu e inalou; e a mulher montou o jogador no próprio corpo.{*EF*}{*B*}{*B*} +{*C2*}E o jogador despertou do mundo quente e escuro do corpo de sua mãe para o longo sonho.{*EF*}{*B*}{*B*} +{*C2*}E o jogador estava em uma nova história, nunca antes contada, escrita nas letras do DNA. E o jogador era um novo programa, nunca antes executado, gerado por um código-fonte de um bilhão de anos. E o jogador era um novo ser humano, que nunca viveu antes, feito de nada além de leite e amor.{*EF*}{*B*}{*B*} +{*C3*}Você é o jogador. A história. O programa. O ser humano. Feito de nada além de leite e amor.{*EF*}{*B*}{*B*} +{*C2*}Vamos retroceder um pouco mais.{*EF*}{*B*}{*B*} +{*C2*}Os sete bilhões, bilhões e bilhões de átomos do corpo do jogador foram criados, muito antes deste jogo, no coração de uma estrela. Então, o jogador também é informação de uma estrela. E o jogador move-se por uma história, que é uma floresta de informações plantadas por um homem chamado Julian, em um mundo plano e infinito criado por um homem chamado Markus, que existe dentre de um pequeno mundo particular criado pelo jogador, que habita um universo criado por...{*EF*}{*B*}{*B*} +{*C3*}Silêncio. Às vezes o jogador criava um mundo pequeno e particular que era tranquilo, quente e simples. Outras difícil, frio e complicado. Às vezes criava um modelo do universo em sua cabeça; sinais de energia movendo-se por vastos espaços vazios. Às vezes chamava esses sinais de "elétrons" e "prótons".{*EF*}{*B*}{*B*} + + + {*C2*}Às vezes os chamavam de "planetas" e "estrelas".{*EF*}{*B*}{*B*} +{*C2*}Às vezes acreditava estar em um universo feito de energia composta de coisas ocasionais; zeros e uns; linhas de código. Outras vezes achava que estava participando de um jogo. Às vezes acreditava estar lendo palavras em uma tela.{*EF*}{*B*}{*B*} +{*C3*}Você é o jogador, lendo palavras...{*EF*}{*B*}{*B*} +{*C2*}Silêncio... Às vezes o jogador lê linhas do código em uma tela. Decodificadas em palavras; palavras decodificadas em significado; significado decodificado em sentimentos, emoções, teorias, ideias, e o jogador começou a respirar mais rápido e mais profundo e percebeu que estava vivo, era um ser vivo, aquelas milhares de mortes não eram reais, o jogador estava vivo.{*EF*}{*B*}{*B*} +{*C3*}Você. Você. Você está vivo.{*EF*}{*B*}{*B*} +{*C2*}E às vezes o jogador acreditava que o universo falara com ele através da luz do sol que atravessava as folhas das árvores do verão{*EF*}{*B*}{*B*} +{*C3*}e outras acreditava que o universo falara com ele através da luz que atravessava o céu claro da noite de inverno, onde um sinal de luz no canto do olho do jogador pode ser uma estrela um milhão de vezes maior que o sol, mergulhando seus planetas em plasma para ser vista, por um momento, pelo jogador, indo para casa no lado distante do universo, repentinamente sentindo o cheiro de comida, quase na porta familiar, prestes a sonhar novamente{*EF*}{*B*}{*B*} +{*C2*}e às vezes o jogador acreditava que o universo falara com ele através dos zeros e uns, da eletricidade do mundo, nas palavras rolando em uma tela no final de um sonho{*EF*}{*B*}{*B*} +{*C3*}e o universo disse eu amo você{*EF*}{*B*}{*B*} +{*C2*}e o universo disse que você jogou bem{*EF*}{*B*}{*B*} +{*C3*}e o universo disse que tudo o que precisa está dentro de você{*EF*}{*B*}{*B*} +{*C2*}e o universo disse que você é mais forte do que pensa{*EF*}{*B*}{*B*} +{*C3*}e o universo disse que você é a luz do dia{*EF*}{*B*}{*B*} +{*C2*}e o universo disse que você é a noite{*EF*}{*B*}{*B*} +{*C3*}e o universo disse que a escuridão contra a qual luta está dentro de você{*EF*}{*B*}{*B*} +{*C2*}e o universo disse que a luz que busca está dentro de você{*EF*}{*B*}{*B*} +{*C3*}e o universo disse que você não está sozinho{*EF*}{*B*}{*B*} +{*C2*}e o universo disse que você não está separado das demais coisas{*EF*}{*B*}{*B*} +{*C3*}e o universo disse que você é o universo se provando, conversando consigo mesmo, lendo seu próprio código{*EF*}{*B*}{*B*} +{*C2*}e o universo disse eu amo você porque você é amor.{*EF*}{*B*}{*B*} +{*C3*}E o jogo acabou e o jogador acordou do sonho. E o jogador começou um novo sonho. E o jogador sonhou novamente e sonhou melhor. E o jogador era o universo. E o jogador era amor.{*EF*}{*B*}{*B*} +{*C3*}Você é o jogador.{*EF*}{*B*}{*B*} +{*C2*}Acorde.{*EF*} + + + Reiniciar Submundo + + + %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 + + + Não redefinir Submundo + + + 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! + + + Opções de Mundo + + + Pode Construir e Minerar + + + Pode Usar Portas e Acionadores + + + Gerar Estruturas + + + Mundo Superplano + + + Baú de Bônus + + + Pode Abrir Recipientes + + + Expulsar + + + Pode Voar + + + 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 + + + Sinalizadores + + + {*T3*}COMO JOGAR: SINALIZADORES{*ETW*}{*B*}{*B*} +Sinalizadores ativos projetam um raio brilhante de luz no céu e concedem poderes aos jogadores próximos.{*B*} +Eles são fabricados com Cristal, Obsidiana e Estrelas do Submundo, que podem ser obtidas ao derrotar o Wither.{*B*}{*B*} +Os Sinalizadores devem ser posicionados ao sol durante o dia. Sinalizadores devem ser posicionados em Pirâmides de Ferro, Ouro, Esmeralda ou Diamante.{*B*} +O material no qual o Sinalizador é posicionado não exerce efeito sobre o poder do Sinalizador.{*B*}{*B*} +No menu do Sinalizador você pode selecionar um poder principal para ele. Quanto mais fileiras tiver sua pirâmide, mais poderes você terá para escolher.{*B*} +Um Sinalizador numa pirâmide com pelo menos quatro fileiras também oferece a opção de Regeneração como poder secundário ou um poder principal mais forte.{*B*}{*B*} +Para configurar os poderes do seu Sinalizador você deve sacrificar uma Barra de Esmeralda, Diamante, Ouro ou Ferro no espaço de pagamento.{*B*} +Assim que estiverem configurados, os poderes vão emanar do Sinalizador indefinidamente.{*B*} + + + + Fogos de Artifício + + + Idiomas + + + Cavalos + + + {*T3*}COMO JOGAR: CAVALOS{*ETW*}{*B*}{*B*} +Cavalos e Burros são em geral encontrados em planícies abertas. Mulas são a prole infértil de um Burro e um Cavalo.{*B*} +Todos os Cavalos, Burros e Mulas adultos podem ser cavalgados. No entanto, apenas Cavalos podem receber armaduras e apenas as Mulas e os Burros podem ser equipados com alforjes para transportar itens.{*B*}{*B*} +Cavalos, Burros e Mulas devem ser domados antes de serem usados. Um cavalo é domado quando você tenta cavalgá-lo e consegue ficar montado enquanto ele tenta derrubar você.{*B*} +Quando Corações de Amor aparecem ao redor do cavalo, significa que ele está domado e não vai mais tentar derrubar o jogador. Para guiar um cavalo, o jogador deve equipá-lo com uma Sela.{*B*}{*B*} +As Selas podem ser compradas de aldeões ou encontradas dentro de Baús escondidos pelo mundo.{*B*} +Burros e Mulas domados podem receber alforjes ao conectar um Baú a eles. Esses alforjes podem ser acessados durante a cavalgada ou se esgueirando.{*B*}{*B*} +Cavalos e Burros (mas não Mulas) podem dar cria como outros animais, usando Maçãs de Ouro ou Cenouras Douradas.{*B*} +Potros crescem e viram cavalos adultos com o tempo, e alimentá-los com Trigo ou Feno acelera esse processo.{*B*} + + + + {*T3*}COMO JOGAR: FOGOS DE ARTIFÍCIO{*ETW*}{*B*}{*B*} +Fogos de Artifício são itens decorativos que podem ser lançados manualmente ou por Distribuidores. Eles são fabricados usando Papel, Pólvora e uma variedade opcional de Estrelas de Fogo de Artifício.{*B*} +As cores, o desaparecimento, a forma, o tamanho e os efeitos (como rastros e brilho) das Estrelas de Fogo de Artifício podem ser personalizados com a adição de ingredientes adicionais durante a fabricação.{*B*}{*B*} +Para fabricar um Fogo de Artifício, coloque Pólvora e Papel na grade de fabricação 3x3 que é exibida sobre seu inventário.{*B*} +Outra opção é colocar várias Estrelas de Fogo de Artifício na grade de fabricação e adicioná-las ao Fogo de Artifício.{*B*} +O preenchimento de mais espaços da grade de fabricação com Pólvora aumentará a altura na qual as Estrelas de Fogo de Artifício explodirão.{*B*}{*B*} +Com isso, você pode remover o Fogo de Artifício do espaço de saída.{*B*}{*B*} +Estrelas de Fogo de Artifício podem ser fabricadas colocando-se Pólvora e Corante na grade de fabricação.{*B*} + - O Corante definirá a cor da explosão da Estrela de Fogo de Artifício.{*B*} + - A forma da Estrela de Fogo de Artifício é definida com a adição de Carga de Fogo, Pepita de Ouro, Pena ou Cabeça de Multidão.{*B*} + - É possível adicionar um rastro ou um brilho usando Diamantes ou Pó de Glowstone.{*B*}{*B*} +Após fabricar uma Estrela de Fogo de Artifício, você pode definir a cor de desaparecimento da Estrela de Fogo de Artifício fabricando-a com Corante. + + + + {*T3*}COMO JOGAR: LIBERADORES{*ETW*}{*B*}{*B*} +Quando acionados por Redstone, os Liberadores soltarão no chão um item aleatório que esteja dentro deles. Use {*CONTROLLER_ACTION_USE*} para abrir o Liberador e carregá-lo com itens de seu inventário.{*B*} +Se o Liberador estiver voltado para um Baú ou para outro tipo de recipiente, o item será colocado nesse recipiente. Longos encadeamentos de Liberadores podem ser construídos para transportar itens por grandes distâncias, mas, para que isso funcione, eles precisam estar alternadamente ligados e desligados. + + + + Ao ser usado, ele se torna um mapa da parte do mundo onde você está, sendo preenchido conforme você explora. + + + É derrubada pelo Wither e usado na fabricação de Faróis. + + + Funis + + + {*T3*}COMO JOGAR: FUNIS{*ETW*}{*B*}{*B*} +Funis são usados para inserir ou remover itens de recipientes e para pegar automaticamente os itens jogados neles.{*B*} +Eles podem afetar Barracas de Poções, Baús, Distribuidores, Liberadores, Carrinhos com Baús, Carrinhos com Funis, bem como outros Funis.{*B*}{*B*} +Os Funis tentam sugar itens continuamente de um recipiente apropriado posicionado acima deles. Eles também vão tentar inserir itens armazenados dentro um recipiente externo.{*B*} +Se um Funil for acionado por Redstone ele vai ficar inativo e vai parar de sugar e inserir itens.{*B*}{*B*} +Um Funil aponta para a direção que tentar emitir itens. Para apontar um Funil para um bloco em particular, posicione-o contra o bloco quando estiver se esgueirando.{*B*} + + + + Liberadores + + + NÃO USADO + + + Saúde Imediata + + + Dano Imediato + + + Salto Turbinado + + + Fadiga do Minerador + + + Força + + + Fraqueza + + + Náuseas + + + NÃO USADO + + + NÃO USADO + + + NÃO USADO + + + Regeneração + + + Resistência + + + Procurando Semente para Criação de Mundo + + + 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. + + + Um tipo de trilho que pode ativar ou desativar os Carrinhos de Minas com Funil e ativar os Carrinhos de Minas com TNT. + + + Usado para pegar e soltar itens, ou inserir itens em outros recipientes, quando recebe uma carga de Redstone. + + + Blocos coloridos fabricados usando argila endurecida tingida. + + + Fornece uma carga de Redstone. A carga será mais forte se houver mais itens na chapa. Requer mais peso do que a chapa leve. + + + Usado como uma fonte de energia de Redstone. Pode voltar a se tornar Redstone. + + + Usado para pegar itens ou transferi-los para dentro e fora de recipientes. + + + Pode virar alimento de Cavalos, Burros ou Mulas para curá-los com até 10 Corações. Acelera o crescimento de potros. + + + Morcego + + + Essas criaturas voadoras são encontradas em cavernas e outros espaços grandes e recônditos. + + + Bruxa + + + Criada pela fusão de Argila em uma fornalha. + + + Fabricado com cristal e corante. + + + Fabricado com Cristal Tingido + + + Fornece uma carga de Redstone. A carga será mais forte se houver mais itens na chapa. + + + É um bloco que emite um sinal de Redstone baseado na luz solar (ou falta de luz solar). + + + É um tipo especial de Carrinho de minas que funciona quase igual ao Funil. Ele coleta itens deixados em trilhos e de recipientes. + + + Um tipo especial de Armadura que pode ser equipado em um cavalo. Oferece 5 de Armadura. + + + Usada para determinar as cores, efeitos e formatos de um Fogo de Artifício. + + + Usado em circuitos de Redstone para manter, comparar ou subtrair a intensidade do sinal, ou para medir certos estados de bloco. + + + É um tipo de carrinho de minas que atua como um bloco de TNT. + + + Um tipo especial de Armadura que pode ser equipado em um cavalo. Oferece 7 de Armadura. + + + Usado para executar comandos. + + + Projeta um raio de luz no céu e pode fornecer Efeitos de Status a jogadores próximos. + + + Armazena blocos e itens no interior. Coloque dois baús lado a lado para criar um baú maior com o dobro da capacidade. O baú confinado cria uma carga de Redstone ao ser aberto. + + + Um tipo especial de Armadura que pode ser equipado em um cavalo. Oferece 11 de Armadura. + + + Usado para laçar multidões ao jogador ou em postes de Cerca. + + + Usado para nomear as multidões no mundo. + + + Pressa + + + Desbloquear jogo completo + + + Continuar Jogo + + + Salvar Jogo + + + Jogar + + + Placares de Líderes + + + Ajuda e Opções + + + Dificuldade: + + + JxJ: + + + Confiar Jogadores: + + + TNT: + + + Tipo de Jogo: + + + Estruturas: + + + Tipo de Nível: + + + Nenhum Jogo Encontrado + + + Só convidados + + + Mais Opções + + + Carregar + + + Opções do Host + + + Jogadores/Convidar + + + Jogo online + + + Novo mundo + + + Jogadores + + + Entrar no Jogo + + + Iniciar jogo + + + Nome do Mundo + + + Semente para Criação de Mundo + + + Deixar em branco para semente aleatória + + + Fogo Espalha: + + + Editar mensagem da placa: + + + Preencha os detalhes que acompanharão sua captura de tela + + + Legenda + + + Dicas: Ferramentas do Jogo + + + Dividir Tela para 2 Jogadores + + + Concluído + + + Captura de tela do jogo + + + Sem efeitos + + + Rapidez + + + Lentidão + + + Editar mensagem da placa: + + + Texturas, ícones e interface do usuário clássicos do Minecraft! + + + Exibir todos os Mundos de Combinações + + + Dicas + + + Reinstalar Item de Avatar 1 + + + Reinstalar Item de Avatar 2 + + + Reinstalar Item de Avatar 3 + + + Reinstalar Tema + + + Reinstalar Imagem do Jogador 1 + + + Reinstalar Imagem do Jogador 2 + + + Opções + + + Interface do Usuário + + + Restaurar Padrões + + + Exibição de oscilação + + + Áudio + + + Controle + + + Gráficos + + + Usada para fazer poções. É derrubada pelos Ghasts, quando eles morrem. + + + É derrubada pelos Homens-Porco Zumbis quando eles morrem. Os Homens-Porco Zumbis podem ser encontrados no Submundo. Usada como ingrediente para fazer poções. + + + Usada para fazer poções. Pode ser encontrada naturalmente nas Fortalezas do Submundo. Também pode ser plantada na Areia Movediça. + + + É escorregadio. Transforma-se em água se estiver sobre outro bloco quando destruído. Derrete se estiver muito próximo de uma fonte de luz ou se colocado no Submundo. + + + Pode ser usado como decoração. + + + Usada para fazer poções e para localizar Fortalezas. É derrubada pelas Chamas que ficam dentro ou perto das Fortalezas do Submundo. + + + Quando usada, pode ter vários efeitos, dependendo de onde for utilizada. + + + Usado para fazer poções ou fabricado com outros itens para fazer o Olho de Ender ou o Creme de Magma. + + + Usado para fazer poções. + + + Usada para fazer Poções e Poções de Lançamento. + + + Pode ser enchida com água e usada como o ingrediente inicial de uma poção na Barraca de Poções. + + + Este é um alimento venenoso e item de poção. É derrubado quando uma Aranha ou Aranha de Caverna é morta por um jogador. + + + Usado para fazer poções, especialmente para criar poções com efeito negativo. + + + Cresce ao longo do tempo quando colocada. Pode ser coletada usando tosquiadeiras. Pode ser escalada como uma escada. + + + Semelhante a uma porta, mas usado principalmente com cercas. + + + Pode ser fabricado com Fatias de Melão. + + + Blocos transparentes que podem ser usados no lugar dos blocos de vidro. + + + Quando acionado (com um botão, alavanca, placa de pressão, tocha de redstone ou redstone), um pistão estende-se, podendo empurrar blocos. Quando se retrai, puxa o bloco de volta. + + + Feitos com pedra, geralmente encontrados em Fortalezas. + + + Usadas como barreiras semelhantes às cercas. + + + Podem ser plantadas para cultivar abóboras. + + + Pode ser usada para construção e decoração. + + + Deixa o movimento mais lento quando atravessada. Pode ser destruída usando tosquiadeiras para coletar fios. + + + Cria uma Traça quando destruída. Também pode criar Traças se estiver perto de outra Traça que esteja sendo atacada. + + + Podem ser plantadas para cultivar melões. + + + Derrubada pelo Enderman quando ele morre. Quando atirada, o jogador será teleportado até a posição em que a Pérola do Ender cair e perderá um pouco de energia. + + + Um bloco de terra com grama crescendo sobre ela. Coletado usando uma pá. Pode ser usado para construção. + + + Pode ser cheio com água da chuva ou usando um balde de água e pode ser usado para encher Garrafas de Vidro com água. + + + Usado para fazer escadas longas. Dois degraus colocados um sobre o outro criam um bloco de degrau duplo de tamanho normal. + + + Criado pela fusão de Pedra Inflamável em uma fornalha. Pode ser transformado em Blocos do Submundo. + + + Quando carregada, ela emite luz. + + + É semelhante a uma vitrine e exibirá o item ou bloco colocado nele. + + + Quando lançado pode gerar uma criatura do tipo indicado. + + + Usado para fazer escadas longas. Dois degraus colocados um sobre o outro criam um bloco de degrau duplo de tamanho normal. + + + Pode ser cultivado para coletar grãos de cacau. + + + Vaca + + + Solta couro quando morta. Pode ser ordenhada com um balde. + + + Ovelha + + + As Cabeças de multidão podem ser colocadas como decoração, ou usadas como máscara na abertura do capacete. + + + Lula + + + Solta sacos de tinta quando morta. + + + Útil para pôr fogo nas coisas, ou para começar incêndios quando disparada de um Distribuidor. + + + Flutua na água e permite andar em cima. + + + Usado para construir Fortalezas do Submundo. É imune às bolas de fogo do Ghast. + + + Usada em Fortalezas do Submundo. + + + Quando atirado, mostrará a direção para um Portal Final. Quando doze deles forem colocados nas estruturas do Portal Final, o Portal Final será ativado. + + + Usado para fazer poções. + + + Similar aos Blocos de Grama, mas muito bom para cultivar cogumelos. + + + Encontrado em Fortalezas do Submundo; derruba Verrugas do Submundo quando quebrado. + + + Um tipo de bloco encontrado no Final. Ele tem resistência muito alta a explosões, portanto, é bem útil para construções. + + + Este bloco é criado ao derrotar o Dragão no Final. + + + Quando atirada, derruba Esferas de Experiência que aumentam seus pontos de experiência quando coletadas. + + + Desta forma os jogadores podem enfeitiçar Espadas, Picaretas, Machados, Pás, Arcos e Armadura, usando os Pontos de Experiência do jogador. + + + Isto pode ser ativado usando doze Olhos de Ender, e o jogador poderá viajar até a dimensão Final. + + + Usado para formar um Portal Final. + + + Quando acionado (usando um botão, alavanca, placa de pressão, tocha de redstone ou redstone com algum destes), um pistão estende-se, se possível, e empurra blocos. + + + Argila cozida na fornalha. + + + Pode ser cozida na fornalha para fazer tijolos. + + + Quando quebrada, derruba bolas de argila que podem ser cozidas para fazer tijolos na fornalha. + + + Cortada com um machado. Pode ser usada para fabricar tábuas ou como combustível. + + + Criado na fornalha ao fundir areia. Pode ser usado para construção, mas quebrará se tentar extraí-lo. + + + Extraído de pedra usando uma picareta. Pode ser usado para construir uma fornalha ou ferramentas de pedra. + + + Um modo compacto de armazenar bolas de neve. + + + Pode ser combinado com uma vasilha para fabricar sopa. + + + Só pode ser extraída com uma picareta de diamante. É produzida pelo encontro de água e lava parada e é usada para construir um portal. + + + Gera monstros no mundo. + + + Pode ser cavada com uma pá para criar bolas de neve. + + + Pode produzir sementes de trigo quando quebrada. + + + Pode ser usada para fabricar corante. + + + Coletado com uma pá. Pode produzir sílex quando cavado. Sofrerá ação da gravidade se não houver outra peça sob ele. + + + Pode ser extraído com uma picareta para coletar carvão. + + + Pode ser extraído com uma picareta de pedra ou de material melhor para coletar lápis-azul. + + + Pode ser extraído com uma picareta de ferro ou de material melhor para coletar diamantes. + + + Usada como decoração. + + + Pode ser extraído com uma picareta de ferro ou de material melhor e depois fundido na fornalha para produzir barras de ouro. + + + Pode ser extraído com uma picareta de pedra ou de material melhor e depois fundido na fornalha para produzir barras de ferro. + + + Pode ser extraído com uma picareta de ferro ou de material melhor para coletar pó de redstone. + + + Não pode ser quebrada. + + + Ateia fogo em qualquer coisa que a toca. Pode ser coletada em um balde. + + + Coletada com uma pá. Pode ser fundida em vidro usando a fornalha. Sofrerá ação da gravidade se não houver outra peça sob ela. + + + Pode ser extraída com uma picareta para coletar pedregulhos. + + + Coletada com uma pá. Pode ser usada para construção. + + + Pode ser plantada e quando crescer será uma árvore. + + + É colocado no chão para transportar uma carga elétrica. Quando usado com uma poção, ele aumentará a duração de seu efeito. + + + É coletado ao matar uma vaca e pode ser usado para fabricar uma armadura ou para fazer Livros. + + + Coletado ao matar um Slime e usado como ingrediente para fazer poções ou para fabricar Pistões Aderentes. + + + As galinhas soltam aleatoriamente e pode ser usado para fabricar alimentos. + + + Coletado ao cavar cascalho e pode ser usado para fabricar sílex e aço. + + + Quando usada em um porco, permite que você monte nele. O porco pode ser controlado usando uma Cenoura no Palito. + + + Coletada ao cavar neve e pode ser atirada. + + + É coletado ao extrair Glowstone e pode ser usado para fabricar blocos de Glowstone novamente ou usado para fazer poções que aumentam a potência desse efeito. + + + Quando quebrada, às vezes derruba uma muda que pode ser replantada para se tornar uma árvore. + + + Encontrada em calabouços, pode ser usada para construção e decoração. + + + Usada para obter lã da ovelha e colher blocos de folhas. + + + Coletado ao matar um esqueleto. Pode ser usado para fabricar farelo de osso. Você pode alimentar um lobo com isto para domá-lo. + + + Coletado ao fazer um esqueleto matar um creeper. Pode ser tocado em uma jukebox. + + + Apaga o fogo e ajuda as plantações a crescerem. Pode ser coletada em um balde. + + + Coletado nas colheitas e pode ser usado para fabricar alimentos. + + + Pode ser usada para fabricar açúcar. + + + Pode ser usada como capacete ou combinada com uma tocha para fabricar uma lanterna de abóbora. Também é o ingrediente principal da Torta de Abóbora. + + + Queima para sempre se for acesa. + + + Quando alcançarem a fase de pleno crescimento, as colheitas poderão ser coletadas para obter trigo. + + + Solo que foi preparado para o plantio de sementes. + + + Pode ser cozido em uma fornalha para fabricar corante verde. + + + Torna mais lento o movimento de quem anda sobre ela. + + + Coletada ao matar uma galinha e pode ser usada para fabricar uma flecha. + + + Coletado ao matar um Creeper, pode fabricar TNT ou ser usado como ingrediente para fazer poções. + + + Pode ser plantada no campo para colheita. Verifique se há luz suficiente para as sementes crescerem! + + + Pare no portal para atravessar entre a Superfície e o Submundo. + + + Usado como combustível na fornalha ou para fabricar uma tocha. + + + Coletado ao matar uma aranha, pode fabricar um Arco ou uma Vara de Pescar, ou pode ser colocado no chão para criar um Detonador. + + + Solta lã quando tosquiada (se já não tiver sido tosquiada). Pode ser tingida para produzir lã de cores diferentes. + + + Business Development + + + Portfolio Director + + + Product Manager + + + Development Team + + + Release Management + + + Director, XBLA Publishing + + + Marketing + + + Asia Localization Team + + + User Research Team + + + MGS Central Teams + + + Community Manager + + + Europe Localization Team + + + Redmond Localization Team + + + Design Team + + + Director of Fun + + + Music and Sounds + + + Programming + + + Chief Architect + + + Art Developer + + + Game Crafter + + + Art + + + Producer + + + Test Lead + + + Lead Tester + + + QA + + + Executive Producer + + + Lead Producer + + + Milestone Acceptance Tester + + + Pá de Ferro + + + Pá de Diamante + + + Pá de Ouro + + + Espada de Ouro + + + Pá de Madeira + + + Pá de Pedra + + + Picareta de Madeira + + + Picareta de Ouro + + + Machado de Madeira + + + Machado de Pedra + + + Picareta de Pedra + + + Picareta de Ferro + + + Picareta de Diamante + + + Espada de Diamante + + + SDET + + + Project STE + + + Additional STE + + + Special Thanks + + + Test Manager + + + Senior Test Lead + + + Test Associates + + + Espada de Madeira + + + Espada de Pedra + + + Espada de Ferro + + + Jon Kågström + + + Tobias Möllstam + + + Risë Lugo + + + Developer + + + Atira bolas de fogo em você, que explodem ao contato. + + + Slime + + + Divide-se em slimes menores quando atingido. + + + Homem-porco zumbi + + + Inicialmente dócil, mas ataca em grupos se você ataca um deles. + + + Ghast + + + Enderman + + + Aranha de Caverna + + + Tem uma mordida venenosa. + + + Vacogumelo + + + Atacará se você olhar para ele. Também pode mover blocos. + + + Traça + + + Atrai as Traças próximas quando atacada. Esconde-se em blocos de pedra. + + + Ataca quando você chega perto. + + + Solta costeletas quando morto. Pode ser montado usando uma sela. + + + Lobo + + + Dócil até ser atacado, quando atacará de volta. Pode ser domado usando ossos, o que faz o lobo segui-lo e atacar qualquer coisa que ataque você. + + + Galinha + + + Solta penas quando morta e põe ovos aleatoriamente. + + + Porco + + + Creeper + + + Aranha + + + Ataca quando você chega perto. Escala paredes. Solta fio quando morta. + + + Zumbi + + + Explode se você chegar muito perto! + + + Esqueleto + + + Dispara flechas em você. Deixa cair flechas quando morto. + + + Faz sopa de cogumelo quando usada com uma vasilha. Derruba cogumelos e torna-se uma vaca normal depois de tosquiada. + + + Original Design and Code by + + + Project Manager/Producer + + + Rest of Mojang Office + + + Concept Artist + + + Number Crunching and Statistics + + + Bully Coordinator + + + Lead Game Programmer Minecraft PC + + + Customer Support + + + Office DJ + + + Designer/Programmer Minecraft - Pocket Edition + + + Ninja Coder + + + CEO + + + White Collar Worker + + + Explosives Animator + + + Este é um grande dragão negro encontrado no Final. + + + Chama + + + Estes são inimigos encontrados no Submundo, geralmente dentro das Fortalezas do Submundo. Derrubam Varas de Chamas quando são mortos. + + + Golem de Neve + + + O Golem de Neve pode ser criado pelos jogadores usando blocos de neve e uma abóbora. Ele atira bolas de neve nos inimigos dos seus criadores. + + + Dragão Ender + + + Cubo de Magma + + + Estes podem ser encontrados nas florestas. Eles podem ser domesticados, alimentando-os com Peixe Cru. Mas você deve deixar o Ocelote se aproximar, pois quaisquer movimentos bruscos podem assustá-lo e fazê-lo fugir. + + + Golem de Ferro + + + Aparece em vilas para protegê-las e podem ser criados usando blocos de ferro e abóboras. + + + Eles são encontrados no Submundo. Similares aos Slimes, dividem-se em versões menores quando são mortos. + + + Aldeão + + + Ocelote + + + Permite a criação de feitiços mais poderosos quando colocada perto da Mesa de Feitiços. + + + {*T3*}COMO JOGAR: FORNALHA{*ETW*}{*B*}{*B*} +Com a fornalha você pode alterar os itens queimando-os. Por exemplo, você pode transformar minério de ferro em barras de ferro na fornalha.{*B*}{*B*} +Coloque a fornalha no mundo e pressione{*CONTROLLER_ACTION_USE*} para usá-la.{*B*}{*B*} +Você deve colocar combustível sob a fornalha e o item a ser queimado na parte superior. A fornalha acenderá e começará a funcionar.{*B*}{*B*} +Quando os itens estiverem queimados, você poderá movê-los da área de saída para seu inventário.{*B*}{*B*} +Se o item que você estiver examinando for um ingrediente ou combustível para a fornalha, aparecerão dicas de ferramenta para permitir a movimentação rápida para a fornalha. + + + + {*T3*}COMO JOGAR: DISTRIBUIDOR{*ETW*}{*B*}{*B*} +O distribuidor é usado para projetar itens. Você deve colocar um acionador, como uma alavanca, ao lado do distribuidor para acioná-lo.{*B*}{*B*} +Para encher o distribuidor com itens, pressione{*CONTROLLER_ACTION_USE*} e mova os itens desejados do inventário para ele.{*B*}{*B*} +Então, quando usar o acionador, o distribuidor projetará um item. + + + + {*T3*}COMO JOGAR: POÇÕES{*ETW*}{*B*}{*B*} +A criação de poções exige uma Barraca de Poções, que pode ser construída em uma bancada. Toda poção começa com uma garrafa de água, que é feita enchendo uma Garrafa de Vidro com água de um Caldeirão, ou de uma fonte de água.{*B*} +A Barraca de Poções tem três espaços para garrafas, para fazer três poções ao mesmo tempo. Um ingrediente pode ser usado em todas as três garrafas, então sempre faça três poções ao mesmo tempo para aproveitar melhor seus recursos.{*B*} +Ao colocar um ingrediente de poção na posição superior da Barraca de Poções, você terá uma poção básica depois de algum tempo. Ela não tem nenhum efeito por si só, mas se você colocar outro ingrediente com esta poção básica, terá uma poção com efeito.{*B*} +Depois que você tiver esta poção, pode adicionar um terceiro ingrediente para fazer o efeito durar mais tempo (usando pó de Redstone), para ser mais intenso (usando Pó de Glowstone) ou para ser uma poção maligna (usando o Olho de Aranha Fermentado).{*B*} +Você também pode adicionar pólvora a qualquer poção para transformá-la em uma Poção de Lançamento, que pode ser atirada. Ao ser atirada, a Poção de Lançamento aplicará o efeito da poção sobre toda a área em que cair.{*B*} + +Os ingredientes de origem das poções são :{*B*}{*B*} +* {*T2*}Verruga do Submundo{*ETW*}{*B*} +* {*T2*}Olho de Aranha{*ETW*}{*B*} +* {*T2*}Açúcar{*ETW*}{*B*} +* {*T2*}Lágrima de Ghast{*ETW*}{*B*} +* {*T2*}Pó de Chamas{*ETW*}{*B*} +* {*T2*}Creme de Magma{*ETW*}{*B*} +* {*T2*}Melão Cintilante{*ETW*}{*B*} +* {*T2*}Pó de Redstone{*ETW*}{*B*} +* {*T2*}Pó de Glowstone{*ETW*}{*B*} +* {*T2*}Olho de Aranha Fermentado{*ETW*}{*B*}{*B*} + +Você deve experimentar todas as combinações de ingredientes para descobrir todas as poções que pode fazer. + + + + {*T3*}COMO JOGAR: BAÚ GRANDE{*ETW*}{*B*}{*B*} +Dois baús colocados lado a lado serão combinados para formar um Baú Grande. Ele pode guardar ainda mais itens.{*B*}{*B*} +É usado da mesma maneira que um baú normal. + + + + {*T3*}COMO JOGAR: FABRICAÇÃO{*ETW*}{*B*}{*B*} +Na interface de fabricação, você pode combinar itens do seu inventário para criar novos tipos de itens. Use{*CONTROLLER_ACTION_CRAFTING*} para abrir a interface de fabricação.{*B*}{*B*} +Role pelas guias na parte superior usando{*CONTROLLER_VK_LB*} e{*CONTROLLER_VK_RB*} para selecionar o tipo de item que deseja criar e, em seguida, use {*CONTROLLER_MENU_NAVIGATE*}para selecionar o item a ser criado.{*B*}{*B*} +A área de fabricação mostra os itens necessários para criar o novo item. Pressione{*CONTROLLER_VK_A*} para fabricar o item e colocá-lo no inventário. + + + + {*T3*}COMO JOGAR: BANCADA{*ETW*}{*B*}{*B*} +Você pode criar itens maiores usando uma bancada.{*B*}{*B*} +Coloque a bancada no mundo e pressione{*CONTROLLER_ACTION_USE*} para usá-la.{*B*}{*B*} +A fabricação de itens na bancada funciona da mesma maneira que a fabricação básica, mas você terá uma área maior para trabalhar e uma variedade maior de itens para criar. + + + + {*T3*}COMO JOGAR: FEITIÇOS{*ETW*}{*B*}{*B*} +Os Pontos de Experiência recolhidos quando um habitante morre ou quando certos blocos são extraídos ou fundidos numa fornalha podem ser usados para enfeitiçar algumas ferramentas, armas, armaduras e livros.{*B*} +Quando são colocados Espada, Arco, Machado, Picareta, Pá, Armadura ou Livro no espaço por baixo do livro na Mesa de Feitiços, os três botões à direita do espaço apresentam alguns feitiços e os respectivos custos em Níveis de Experiência.{*B*} +Se você não tiver Níveis de Experiência suficientes para usar, o custo aparecerá em vermelho, caso contrário, verde.{*B*}{*B*} +O feitiço aplicado é selecionado aleatoriamente com base no custo apresentado.{*B*}{*B*} +Se a Mesa de Feitiços estiver rodeada de Estantes (até um máximo de 15 Estantes), com um bloco de intervalo entre a Estante e a Mesa de Feitiços, o poder dos feitiços irá aumentar e serão vistos glifos misteriosos saindo do livro na Mesa de Feitiços.{*B*}{*B*} +Todos os ingredientes para uma mesa de feitiços podem ser encontrados nas aldeias, ou ser extraídos das minas ou cultivados no mundo.{*B*}{*B*} +Livros Encantados são usados na Bigorna para aplicar feitiços nos itens. Isso lhe dá mais controle sobre quais feitiços você quer nos seus itens.{*B*} + + + {*T3*}COMO JOGAR: BANINDO NÍVEIS{*ETW*}{*B*}{*B*} +Se você encontrar conteúdo ofensivo em um nível em que estiver jogando, poderá optar por adicioná-lo à sua lista de Níveis Banidos. +Para isso, abra o menu Pausar e pressione {*CONTROLLER_VK_RB*}para selecionar a dica de ferramenta de Banir Nível. +Se você tentar entrar nesse nível no futuro, será notificado de que ele está em sua lista de Níveis Banidos e poderá removê-lo da lista e continuar no nível ou sair. + + + + {*T3*}COMO JOGAR: OPÇÕES DE HOST E JOGADOR{*ETW*}{*B*}{*B*} + + {*T1*}Opções de Jogo{*ETW*}{*B*} + Ao carregar ou criar um mundo, você pode pressionar o botão "Mais Opções" para entrar em um menu que permita maior controle sobre o jogo.{*B*}{*B*} + + {*T2*}Jogador x Jogador{*ETW*}{*B*} + Quando habilitado, os jogadores podem causar danos a outros jogadores. Esta opção afeta somente o modo Sobrevivência.{*B*}{*B*} + + {*T2*}Confiar nos Jogadores{*ETW*}{*B*} + Quando desabilitado, os jogadores que entram no jogo têm restrições quanto ao que podem fazer. Eles não podem minerar nem usar itens, colocar blocos, usar portas e interruptores, usar recipientes nem atacar jogadores ou animais. Você pode alterar essas opções de um jogador específico usando o menu do jogo.{*B*}{*B*} + + {*T2*}Fogo Espalha{*ETW*}{*B*} + Quando habilitado, o fogo poderá se espalhar até blocos inflamáveis próximos. Esta opção também pode ser mudada de dentro do jogo.{*B*}{*B*} + + {*T2*}TNT Explode{*ETW*}{*B*} + Quando habilitado, a TNT explodirá quando detonada. Esta opção também pode ser mudada de dentro do jogo.{*B*}{*B*} + + {*T2*}Privilégios do Host{*ETW*}{*B*} + Quando ativado, o host pode alternar o voo, desativar a exaustão e ficar invisível pelo menu do jogo. {*DISABLES_ACHIEVEMENTS*}{*B*}{*B*} + + {*T2*}Ciclo da Luz do Dia{*ETW*}{*B*} + Ao ser desativado, a hora do dia não muda.{*B*}{*B*} + + {*T2*}Manter inventário{*ETW*}{*B*} + Quando ativado, os jogadores mantêm seu inventário depois de morrer.{*B*}{*B*} + + {*T2*}Criação de multidão{*ETW*}{*B*} + Ao ser desativado, as multidões não são criadas naturalmente.{*B*}{*B*} + + {*T2*}Vandalismo de multidão{*ETW*}{*B*} + Ao ser desativado, impede que monstros e animais alterem blocos (por exemplo, explosões de Creeper não destroem blocos e Ovelhas não removem Grama) ou peguem itens.{*B*}{*B*} + + {*T2*}Pilhagem de multidão{*ETW*}{*B*} + Ao ser desativado, monstros e animais não derrubam itens (por exemplo, Creepers não derrubam pólvora).{*B*}{*B*} + + {*T2*}Bloco derruba itens{*ETW*}{*B*} + Ao ser desativado, os blocos não derrubam itens quando são destruídos (por exemplo, blocos de Pedra não derrubam Pedregulho).{*B*}{*B*} + + {*T2*}Regeneração Natural{*ETW*}{*B*} + Ao ser desativado, os jogadores não regeneram a energia naturalmente.{*B*}{*B*} + +{*T1*}Opções de Geração de Mundo{*ETW*}{*B*} +Ao criar um novo mundo, há algumas opções adicionais.{*B*}{*B*} + + {*T2*}Gerar Estruturas{*ETW*}{*B*} + Quando habilitado, estruturas como Vilas e Fortalezas serão geradas no mundo.{*B*}{*B*} + + {*T2*}Mundo Superplano{*ETW*}{*B*} + Quando habilitado, um mundo completamente plano será gerado na Superfície e no Submundo.{*B*}{*B*} + + {*T2*}Baú de Bônus{*ETW*}{*B*} + Quando habilitado, um baú contendo alguns itens úteis será criado perto do ponto de criação do jogador.{*B*}{*B*} + + {*T2*}Reiniciar Submundo{*ETW*}{*B*} + Quando ativado, o Submundo é recriado. É útil quando se tem um jogo salvo mais antigo em que as Fortalezas do Submundo não estavam presentes.{*B*}{*B*} + + {*T1*}Opções no Jogo{*ETW*}{*B*} + Durante o jogo, várias opções podem ser acessadas pressionando o botão {*BACK_BUTTON*} para abrir o menu do jogo.{*B*}{*B*} + + {*T2*}Opções do Host{*ETW*}{*B*} + O jogador host e os jogadores definidos como moderadores podem acessar o menu "Opção do Host". Neste menu, eles podem ativar e desativar as opções Fogo Espalha e TNT Explode.{*B*}{*B*} + + {*T1*}Opções do Jogador{*ETW*}{*B*} + Para modificar os privilégios de um jogador, selecione o nome dele e pressione {*CONTROLLER_VK_A*} para abrir o menu privilégios do jogador, onde você poderá usar as opções a seguir.{*B*}{*B*} + + {*T2*}Pode Construir e Minerar{*ETW*}{*B*} + Esta opção só está disponível quando "Confiar nos Jogadores" está desativada. Quando esta opção está habilitada, o jogador pode interagir com o mundo normalmente. Quando está desativada, o jogador não pode colocar nem destruir blocos, nem interagir com muitos itens e blocos.{*B*}{*B*} + + {*T2*}Pode utilizar portas e interruptores{*ETW*}{*B*} + Esta opção só está disponível quando "Confiar nos Jogadores" está desativada. Quando esta opção estiver desabilitada, o jogador não poderá utilizar portas e interruptores.{*B*}{*B*} + + {*T2*}Pode abrir recipientes{*ETW*}{*B*} + Esta opção só está disponível quando "Confiar nos Jogadores" está desativada. Quando esta opção estiver desabilitada, o jogador não poderá abrir recipientes, tais como baús.{*B*}{*B*} + + {*T2*}Pode Atacar Jogadores{*ETW*}{*B*} + Esta opção só está disponível quando "Confiar nos Jogadores" está desativada. Quando esta opção estiver desabilitada o jogador não poderá causar danos a outros jogadores.{*B*}{*B*} + + {*T2*}Pode Atacar Animais{*ETW*}{*B*} + Esta opção só está disponível quando "Confiar nos Jogadores" está desativada. Quando esta opção estiver desabilitada, o jogador não poderá causar nenhum dano em animais.{*B*}{*B*} + + {*T2*}Moderador{*ETW*}{*B*} + Quando esta opção está ativada, o jogador pode alterar privilégios para outros jogadores (exceto o host) se a opção "Confiar nos Jogadores" estiver desativada, expulsar jogadores, além de poder ativar e desativar as opções Fogo Espalha e TNT Explode.{*B*}{*B*} + + {*T2*}Expulsar Jogador{*ETW*}{*B*} + {*KICK_PLAYER_DESCRIPTION*}{*B*}{*B*} + + {*T1*}Opções do Jogador Host{*ETW*}{*B*} + Se "Privilégios do Host" estiver habilitado, o jogador host poderá modificar alguns privilégios para si mesmo. Para modificar os privilégios de um jogador, selecione o nome dele e pressione {*CONTROLLER_VK_A*} para abrir o menu privilégios do jogador, onde você poderá usar as opções a seguir.{*B*}{*B*} + + {*T2*}Pode Voar{*ETW*}{*B*} + Quando esta opção está habilitada, o jogador pode voar. Esta opção só afeta o modo de Sobrevivência, pois todos os jogadores podem voar no modo Criativo.{*B*}{*B*} + + {*T2*}Desativar Exaustão{*ETW*}{*B*} + Esta opção só afeta o modo de Sobrevivência. Quando habilitado, as atividades físicas (voar/correr/pular etc.) não diminuem a barra de alimentos. Entretanto, se o jogador estiver ferido, a barra de alimentos diminuirá lentamente enquanto ele estiver se curando.{*B*}{*B*} + + {*T2*}Invisível{*ETW*}{*B*} + Quando esta opção está habilitada, o jogador não está visível para outros jogadores e é invulnerável.{*B*}{*B*} + + {*T2*}Pode Teleportar{*ETW*}{*B*} + Isso permite ao jogador mover jogadores ou ele mesmo até o local de outros jogadores no mundo. + + + + Próxima Página + + + {*T3*}COMO JOGAR: CRIAÇÃO DE ANIMAIS{*ETW*}{*B*}{*B*} +Para manter seus animais em um só lugar, construa uma área cercada de menos de 20x20 blocos e coloque seus animais nela. Isso fará com que ainda estejam lá quando você voltar para vê-los. + + + + {*T3*}COMO JOGAR: REPRODUÇÃO DE ANIMAIS{*ETW*}{*B*}{*B*} +Os animais do Minecraft podem se reproduzir e produzir seus próprios filhotes!{*B*} +Para que os animais se reproduzam, você deve dar a comida certa a eles para que entrem no "Modo do Amor".{*B*} +Dê Trigo para uma vaca, vacogumelo ou ovelha, dê Cenouras para um porco, dê Sementes de Trigo ou Verruga do Submundo a uma galinha ou dê qualquer tipo de carne a um lobo e eles começarão a procurar outro animal da mesma espécie que também esteja no Modo do Amor.{*B*} +Quando dois animais da mesma espécie se encontrarem e ambos estiverem no Modo do Amor, eles se beijarão por alguns segundos e um filhote aparecerá. O filhote seguirá seus pais durante algum tempo, até crescer e se transformar em um animal adulto.{*B*} +Depois de ficar no Modo do Amor, o animal não poderá entrar nele de novo por cinco minutos.{*B*} +Há um limite para o número de animais que é possível ter em um mundo. Portanto, os animais não se reproduzirão quando você já tiver muitos. + + + {*T3*}COMO JOGAR: PORTAL DO SUBMUNDO{*ETW*}{*B*}{*B*} +Um Portal do Submundo permite que o jogador viaje entre a Superfície e o Submundo. O Submundo pode ser usado para o deslocamento rápido na Superfície. Viajar a uma distância de um bloco no Submundo equivale a se deslocar por 3 blocos na Superfície. Portanto, ao construir um portal no Submundo e sair por ele, você estará 3 vezes mais longe de seu ponto de entrada.{*B*}{*B*} +São necessários no mínimo 10 blocos de Obsidiana para construir o portal, que deve ter 5 blocos de altura, 4 blocos de largura e 1 bloco de espessura. Quando a estrutura do portal estiver pronta, o espaço interno deverá ser queimado para ativá-lo. Isso pode ser feito usando o item Sílex e Aço ou o item Carga de Fogo.{*B*}{*B*} +Exemplos de construção de portais são mostrados na figura à direita. + + + + {*T3*}COMO JOGAR: BAÚ{*ETW*}{*B*}{*B*} +Depois de criar um baú, poderá colocá-lo no mundo e usá-lo com{*CONTROLLER_ACTION_USE*} para guardar itens do seu inventário.{*B*}{*B*} +Use o ponteiro para mover itens entre o inventário e o baú.{*B*}{*B*} +Os itens no baú ficarão guardados lá para você até devolvê-los ao inventário mais tarde. + + + + Você estava na Minecon? + + + Ninguém da Mojang já viu o rosto do Junkboy. + + + Você sabia que existe um Wiki do Minecraft? + + + Não olhe diretamente para os bugs. + + + Os Creepers nasceram de um bug de código. + + + Isso é uma galinha ou um pato? + + + O novo escritório da Mojang é maneiro! + + + {*T3*}COMO JOGAR: NOÇÕES BÁSICAS{*ETW*}{*B*}{*B*} +Minecraft é um jogo que consiste em colocar blocos para construir qualquer coisa que imaginar. À noite os monstros aparecem; então, construa um abrigo antes que isso aconteça.{*B*}{*B*} +Use{*CONTROLLER_ACTION_LOOK*} para olhar à sua volta.{*B*}{*B*} +Use{*CONTROLLER_ACTION_MOVE*} para se mover.{*B*}{*B*} +Pressione {*CONTROLLER_ACTION_JUMP*}para pular.{*B*}{*B*} +Pressione {*CONTROLLER_ACTION_MOVE*}duas vezes para frente rapidamente para correr. Enquanto mantiver {*CONTROLLER_ACTION_MOVE*}pressionado para a frente, o personagem continuará correndo, a não ser que o tempo de corrida acabe ou que a Barra de Alimentos tenha menos de {*ICON_SHANK_03*}.{*B*}{*B*} +Segure {*CONTROLLER_ACTION_ACTION*} para extrair e cortar usando a mão ou o que estiver segurando. Talvez seja necessário fabricar uma ferramenta para extrair alguns blocos.{*B*}{*B*} +Se estiver segurando um item na mão, use{*CONTROLLER_ACTION_USE*} para utilizá-lo ou pressione {*CONTROLLER_ACTION_DROP*}para soltá-lo. + + + {*T3*}COMO JOGAR: HUD{*ETW*}{*B*}{*B*} +O HUD mostra informações sobre seu status; sua energia, o oxigênio restante quando está debaixo d'água, seu nível de fome (é preciso comer para reabastecer) e sua armadura, se estiver usando uma. Se você perder energia, mas tiver uma barra de alimentos com 9 ou mais {*ICON_SHANK_01*}, sua energia será reabastecida automaticamente. Comer preenche sua barra de alimentos.{*B*} +A Barra de Experiência também é mostrada aqui, com um valor numérico que mostra seu Nível de Experiência e a barra que indica quantos Pontos de Experiência são necessários para aumentar seu Nível de Experiência. Você ganha Pontos de Experiência coletando as Esferas de Experiência liberadas por multidões quando elas morrem, ao minerar alguns tipos de blocos, ao criar animais, pescar e fundir minérios na fornalha.{*B*}{*B*} +Também mostra os itens disponíveis para uso. Use {*CONTROLLER_ACTION_LEFT_SCROLL*}e {*CONTROLLER_ACTION_RIGHT_SCROLL*}para trocar o item em sua mão. + + + {*T3*}COMO JOGAR: INVENTÁRIO{*ETW*}{*B*}{*B*} +Use {*CONTROLLER_ACTION_INVENTORY*}para ver seu inventário.{*B*}{*B*} +Essa tela mostra os itens disponíveis para uso em sua mão e todos os outros itens que está carregando. Sua armadura também é mostrada aqui.{*B*}{*B*} +Use{*CONTROLLER_MENU_NAVIGATE*}para mover o ponteiro. Use {*CONTROLLER_VK_A*}para pegar um item sob o ponteiro. Se houver mais de um item aqui, ele pegará todos ou você pode usar {*CONTROLLER_VK_X*}para pegar apenas metade deles.{*B*}{*B*} +Mova o item com o ponteiro sobre outro espaço no inventário e coloque-o lá usando{*CONTROLLER_VK_A*}. Se tiver vários itens no ponteiro, use{*CONTROLLER_VK_A*} para colocar todos ou{*CONTROLLER_VK_X*} para colocar apenas um.{*B*}{*B*} +Se o item sobre o qual você estiver for uma armadura, aparecerá uma dica de ferramenta para permitir a movimentação rápida para o espaço da armadura à direita no inventário.{*B*}{*B*} +É possível mudar a cor da sua Armadura de Couro tingindo-a. Você pode fazer isso no inventário ao segurar o corante no seu ponteiro e, em seguida, pressionar{*CONTROLLER_VK_X*} enquanto o ponteiro estiver sobre a peça que você deseja tingir. + + + A Minecon 2013 foi em Orlando, na Flórida, EUA! + + + .party() estava excelente! + + + Considere os rumores sempre falsos, em vez de considerá-los verdadeiros! + + + Página Anterior + + + Comércio + + + Bigorna + + + Final + + + Banindo Níveis + + + Modo Criativo + + + Opções de Host e Jogador + + + {*T3*}COMO JOGAR: FINAL{*ETW*}{*B*}{*B*} +O Final é outra dimensão no jogo que se alcança através de um Portal Final ativo. O Portal Final pode ser encontrado em uma Fortaleza, nas profundezas da Superfície.{*B*} +Para ativar o Portal Final, você terá de colocar um Olho de Ender em qualquer Estrutura do Portal Final que não tenha um.{*B*} +Quando o portal estiver ativo, pule nele para ir para o Final.{*B*}{*B*} +No Final você encontrará o Dragão Ender, um inimigo violento e poderoso, além de muitos Endermen. Então, prepare-se muito bem para a batalha antes de ir para lá!{*B*}{*B*} +Você encontrará Cristais de Ender sobre oito estacas de Obsidiana que o Dragão Ender usa para se curar. +Portanto, a primeira etapa da batalha é destruir cada uma delas.{*B*} +É possível alcançar as primeiras com flechas, mas as últimas estão protegidas por uma gaiola com Cerca de Ferro e você terá de chegar até elas.{*B*}{*B*} +Enquanto estiver fazendo isso, o Dragão Ender estará atacando você, voando em você e cuspindo bolas de ácido Ender.{*B*} +Se você se aproximar do Pódio do Ovo no centro das estacas, o Dragão Ender voará para baixo e o atacará e é nesse momento que você pode realmente causar algum dano a ele!{*B*} +Evite o sopro ácido e mire nos olhos do Dragão Ender para obter os melhores resultados. Se possível, traga alguns amigos para o Final para ajudá-lo na batalha.{*B*}{*B*} +Quando você estiver no Final, seus amigos poderão ver a localização do Portal Final dentro da Fortaleza nos respectivos mapas. +Portanto, poderão facilmente se juntar a você. + + + + {*ETB*}Bem-vindo de volta! Talvez você não tenha percebido, mas seu Minecraft foi atualizado.{*B*}{*B*} +Há muitos recursos novos para você e seus amigos experimentarem. Aqui estão apenas alguns destaques. Dê uma lida e vá se divertir!{*B*}{*B*} +{*T1*}Novos itens{*ETB*} - Argila Endurecida, Argila Tingida, Bloco de Carvão, Fardo de Feno, Trilho Ativador, Bloco de Redstone, Sensor de Luz do Dia, Liberador, Funil, Carrinho de Minas com Funil, Carrinho de minas com TNT, Comparador de Redstone, Chapa de Pressão Medida, Sinalizador, Baú Confinado, Foguete de Fogo de Artifício, Estrela de Fogo de Artifício, Estrela do Submundo, Laço, Armadura de Cavalo, Crachá, Ovo de Criação de Cavalo{*B*}{*B*} +{*T1*}Novas multidões{*ETB*} - Wither, Esqueletos Murchos, Bruxas, Morcegos, Cavalos, Burros e Mulas{*B*}{*B*} +{*T1*}Novos recursos{*ETB*} - Dome e monte em um cavalo, fabrique fogos de artifício e crie um show, dê nomes a animais e monstros com um Crachá, crie circuitos mais avançados de Redstone e novas Opções do Host para ajudar a controlar o que os convidados do seu mundo podem fazer!{*B*}{*B*} +{*T1*}Novo Tutorial do Mundo{*ETB*} – Aprenda a usar os antigos e os novos recursos no Tutorial do Mundo. Tente encontrar todos os Discos de Música escondidos no mundo!{*B*}{*B*} + + + + Causa mais danos que à mão. + + + Usada para cavar terra, grama, areia, cascalho e neve mais rápido que à mão. As pás são necessárias para cavar bolas de neve. + + + Correr + + + Novidades + + + {*T3*}Mudanças e acréscimos{*ETW*}{*B*}{*B*} +- Novos itens - Argila Endurecida, Argila Tingida, Bloco de Carvão, Fardo de Feno, Trilho Ativador, Bloco de Redstone, Sensor de Luz do Dia, Liberador, Funil, Carrinho de Minas com Funil, Carrinho de minas com TNT, Comparador de Redstone, Chapa de Pressão Medida, Sinalizador, Baú Confinado, Foguete de Fogo de Artifício, Estrela de Fogo de Artifício, Estrela do Submundo, Laço, Armadura de Cavalo, Crachá, Ovo de Criação de Cavalo{*B*} +- Novas multidões - Wither, Esqueletos Murchos, Bruxas, Morcegos, Cavalos, Burros e Mulas{*B*} +- Novos recursos para geração de terrenos - Cabanas de Bruxas.{*B*} +- Nova interface do Sinalizador.{*B*} +- Nova interface do Cavalo.{*B*} +- Nova interface do Funil.{*B*} +- Novos Fogos de Artifício - A interface de Fogos de Artifício pode ser acessada pela Bancada quando você possui ingredientes para fabricar uma Estrela de Fogo de Artifício ou um Foguete de Fogo de Artifício.{*B*} +- Novo "Modo Aventura" - Você só pode quebrar blocos com as ferramentas corretas.{*B*} +- Muitos sons novos.{*B*} +- Multidões, itens e projéteis agora podem passar por portais.{*B*} +- Repetidores agora podem ser travados acionando sua laterais com outro Repetidor.{*B*} +- Zumbis e esqueletos agora podem ser gerados com armas e armaduras diferentes.{*B*} +- Novas mensagens de morte.{*B*} +- Use crachás para dar nomes às multidões e renomeie recipientes para alterar o título quando o menu for aberto.{*B*} +- O farelo de osso não faz mais tudo crescer ao tamanho completo instantaneamente. Em vez disso, ele faz crescer aleatoriamente em estágios.{*B*} +- Um sinal de Redstone descrevendo o conteúdo de Baús, Barracas de Poções, Distribuidores e Jukeboxes pode ser detectado ao posicionar um Comparador de Redstone diretamente contra eles.{*B*} +- É possível virar Distribuidores para qualquer direção.{*B*} +- Comer uma Maçã de Ouro dá ao jogador "absorção" extra de energia por um curto período de tempo.{*B*} +- Quanto mais tempo você permanecer em uma área, mais difíceis serão os monstros que nascem naquela área.{*B*} + + + + Compartilhando Capturas de Tela + + + Baús + + + Fabricação + + + Fornalha + + + Noções Básicas + + + HUD + + + Inventário + + + Distribuidor + + + Feitiços + + + Portal do Submundo + + + Multijogador + + + Criação de Animais + + + Reprodução de Animais + + + Poções + + + deadmau5 curte o Minecraft! + + + Os homens-porco não o atacarão, a menos que você os ataque. + + + Você pode alterar seu ponto de criação no jogo e avançar até o nascer do sol dormindo em uma cama. + + + Devolva aquelas bolas de fogo para o Ghast! + + + Faça algumas tochas para iluminar áreas à noite. Os monstros evitam as áreas ao redor das tochas. + + + Chegue mais rapidamente aos destinos com um carrinho de minas e trilhos! + + + Plante algumas mudas e elas crescerão e se tornarão árvores. + + + Ao construir um portal, você poderá viajar para outra dimensão: o Submundo. + + + Cavar diretamente para baixo ou para cima não é uma boa ideia. + + + O farelo de osso (fabricado com ossos de Esqueleto) pode ser usado como fertilizante e faz as coisas crescerem imediatamente! + + + Os creepers explodirão se chegarem perto de você! + + + Pressione{*CONTROLLER_VK_B*} para soltar o item que está em sua mão! + + + Use a ferramenta certa para o trabalho! + + + Se não encontrar carvão para suas tochas, faça carvão vegetal com árvores em uma fornalha. + + + Comer costeletas de porco cozidas dá mais energia que comê-las cruas. + + + Se você definir a dificuldade do jogo para Pacífico, sua energia regenerará automaticamente e nenhum monstro sairá à noite! + + + Dê um osso a um lobo para torná-lo amigável. Depois, poderá fazê-lo sentar ou seguir você. + + + Você pode soltar itens que estão no Inventário movendo o cursor para fora do menu e pressionando{*CONTROLLER_VK_A*} + + + O novo conteúdo oferecido para download está disponível! Acesse o conteúdo pelo botão Loja Minecraft no Menu Principal. + + + Você sabia que pode mudar a aparência do seu personagem com um Pacote de capas da Loja Minecraft? Selecione o botão Loja Minecraft no Menu Principal para ver o que está disponível. + + + Altere as configurações de gama para deixar o jogo mais claro ou mais escuro. + + + Ao dormir em uma cama à noite, o tempo passará rapidamente no jogo até o nascer do sol, mas todos os jogadores em um jogo multijogador devem estar na cama ao mesmo tempo. + + + Use uma enxada para preparar áreas do solo para plantar. + + + As aranhas não o atacarão durante o dia, a menos que você as ataque. + + + Escavar solo ou areia com uma pá é mais rápido do que com a mão! + + + Pegue as costeletas dos porcos, cozinhe as costeletas e as coma para recuperar energia. + + + Extraia couro das vacas e use-o para fazer armaduras. + + + Se tiver um balde vazio, poderá enchê-lo com leite de uma vaca, com água ou lava! + + + A obsidiana é criada quando a água encontra um bloco de origem de lava. + + + Agora há cercas empilháveis no jogo! + + + Alguns animais seguirão você se tiver trigo na mão. + + + Se um animal não puder se mover mais de 20 blocos em qualquer direção, ele não se desintegrará. + + + Lobos mansos mostram a saúde pela posição da cauda. Dê carne a eles para curá-los. + + + Cozinhe o cacto na fornalha para fazer o corante verde. + + + Leia a seção Novidades nos menus Como jogar para ver as últimas atualizações no jogo. + + + Música de C418! + + + Quem é Notch? + + + Mojang tem mais prêmios que ajudantes! + + + Algumas celebridades jogam Minecraft! + + + Notch tem mais de um milhão de seguidores no twitter! + + + Nem todas as pessoas na Suécia têm cabelos loiros. Alguns, como Jens de Mojang, são ruivos! + + + No futuro haverá uma atualização deste jogo! + + + Se colocar dois baús lado a lado você terá um baú grande. + + + Tome cuidado ao construir estruturas feitas de lã ao ar livre, pois relâmpagos de tempestades podem incendiar a lã. + + + Um único balde de lava pode ser usado em uma fornalha para fundir 100 blocos. + + + O instrumento tocado por um bloco de nota depende do material abaixo dele. + + + A lava poderá demorar alguns minutos para desaparecer COMPLETAMENTE quando o bloco de origem for removido. + + + O pedregulho é resistente às bolas de fogo do Ghast, o que o torna útil para proteger portais. + + + Blocos que podem ser usados como fonte de luz derretem neve e gelo. Eles incluem tochas, glowstone e lanternas de abóbora. + + + Zumbis e esqueletos poderão sobreviver à luz do dia se estiverem na água. + + + As galinhas põem ovos a cada 5 ou 10 minutos. + + + A obsidiana só pode ser extraída com uma picareta de diamante. + + + Os Creepers são a fonte de pólvora mais fácil de se obter. + + + Se você atacar um lobo, todos os lobos da vizinhança ficarão hostis e o atacarão. Isso também acontece com os homens-porco zumbis. + + + Os lobos não podem entrar no Submundo. + + + Os lobos não atacam os Creepers. + + + Necessária para extrair blocos relacionados a pedra e minério. + + + Usado na receita de bolo, como ingrediente para fazer poções. + + + Usada para enviar uma carga elétrica ao ser ligada ou desligada. Fica na posição ligada ou desligada até ser apertada novamente. + + + Envia constantemente uma carga elétrica ou pode ser usada como receptor/transmissor quando conectada à lateral de um bloco. Também pode ser usada para pouca iluminação. + + + Restaura 2{*ICON_SHANK_01*} e pode ser usada para fabricar uma maçã dourada. + + + Restaura 2{*ICON_SHANK_01*} e regenera a energia por 4 segundos. Criada com uma Maçã e Pepitas de Ouro. + + + Restaura 2{*ICON_SHANK_01*}. Comê-la pode envenenar você. + + + Usado em circuitos de Redstone como repetidor, retardador e/ou diodo. + + + Usado para guiar carrinhos de minas. + + + Quando ativado, acelera os carrinhos de minas que passam sobre ele. Quando desativado, faz os carrinhos pararem nele. + + + Funciona como uma chapa de pressão (envia um sinal Redstone quando ativado), mas só pode ser ativado por um carrinho de minas. + + + Usado para enviar uma carga elétrica ao ser pressionado. Continua ativado por cerca de um segundo antes de desligar novamente. + + + Usado para guardar e projetar itens em ordem aleatória quando recebe uma carga de Redstone. + + + Reproduz uma nota quando acionado. Acerte-o para alterar o tom da nota. Se for colocado sobre blocos diferentes, alterará o tipo de instrumento. + + + Restaura 2,5{*ICON_SHANK_01*}. Criado ao cozinhar peixe cru na fornalha. + + + Restaura 1{*ICON_SHANK_01*}. + + + Restaura 1{*ICON_SHANK_01*}. + + + Restaura 3{*ICON_SHANK_01*}. + + + Usada como munição para arcos. + + + Restaura 2,5{*ICON_SHANK_01*}. + + + Restaura 1{*ICON_SHANK_01*}. Pode ser usado 6 vezes. + + + Restaura 1{*ICON_SHANK_01*}, ou pode ser cozida na fornalha. Comê-la pode envenenar você. + + + Restaura 1,5{*ICON_SHANK_01*}, ou pode ser cozida na fornalha. + + + Restaura 4{*ICON_SHANK_01*}. Criado ao cozinhar uma costeleta de porco crua na fornalha. + + + Restaura 1{*ICON_SHANK_01*}, ou pode ser cozida na fornalha. Pode ser dado para o Ocelote comer, para torná-lo amigável. + + + Restaura 3{*ICON_SHANK_01*}. Criado ao cozinhar frango cru na fornalha. + + + Restaura 1,5{*ICON_SHANK_01*}, ou pode ser cozida na fornalha. + + + Restaura 4{*ICON_SHANK_01*}. Criado ao cozinhar carne crua na fornalha. + + + Usado para transportar você, um animal ou um monstro sobre trilhos. + + + Usado como corante para criar lã azul-clara. + + + Usado como corante para criar lã ciano. + + + Usado como corante para criar lã roxa. + + + Usado como corante para criar lã verde-lima. + + + Usado como corante para criar lã cinza. + + + Usado como corante para criar lã cinzenta. (Observação: este corante também pode ser criado combinando corante cinza com farelo de osso, permitindo criar 4 corantes cinzentos com cada saco de tinta, em vez de três.) + + + Usado como corante para criar lã magenta. + + + Usada para iluminar mais que tochas. Derrete neve/gelo e pode ser usada embaixo d'água. + + + Usado para criar livros e mapas. + + + Pode ser usado para criar Estantes ou enfeitiçado para fazer Livros Encantados. + + + Usado como corante para criar lã azul. + + + Toca discos de música. + + + Usado para criar ferramentas, armas ou armaduras muito fortes. + + + Usado como corante para criar lã laranja. + + + Coletada das ovelhas, pode ser tingida com corantes. + + + Usada como material de construção e pode ser tingida com corantes. Esta receita não é recomendada porque a lã pode ser obtida facilmente das ovelhas. + + + Usado como corante para criar lã preta. + + + Usado para transportar mercadorias sobre trilhos. + + + Andará sobre trilhos e poderá empurrar outros carrinhos de minas, se for colocado carvão nele. + + + Usado para viajar pela água mais rapidamente do que nadando. + + + Usado como corante para criar lã verde. + + + Usada como corante para criar lã vermelha. + + + Usado para fazer brotar instantaneamente colheitas, árvores, grama alta, cogumelos enormes e flores. Pode ser usado em receitas de corantes. + + + Usado como corante para criar lã rosa. + + + Usado como corante para criar lã marrom, como ingrediente para biscoitos ou para criar cápsulas de cacau. + + + Usado como corante para criar lã prateada. + + + Usado como corante para criar lã amarela. + + + Permite ataques à distância usando flechas. + + + Dá ao usuário 5 de Armadura quando usado. + + + Dá ao usuário 3 de Armadura quando usado. + + + Dá ao usuário 1 de Armadura quando usado. + + + Dá ao usuário 5 de Armadura quando usado. + + + Dá ao usuário 2 de Armadura quando usado. + + + Dá ao usuário 2 de Armadura quando usado. + + + Dá ao usuário 3 de Armadura quando usado. + + + Uma barra brilhante que pode ser usada para fabricar ferramentas desse material. Criada ao fundir minério na fornalha. + + + Permite fabricar barras, pedras preciosas ou corantes em blocos posicionáveis. Pode ser usado como um bloco caro de construção ou para armazenamento compacto do minério. + + + Usada para enviar carga elétrica quando pisada por um jogador, animal ou monstro. As chapas de pressão de madeira também podem ser ativadas deixando algo cair sobre elas. + + + Dá ao usuário 8 de Armadura quando usado. + + + Dá ao usuário 6 de Armadura quando usado. + + + Dá ao usuário 3 de Armadura quando usado. + + + Dá ao usuário 6 de Armadura quando usado. + + + Portas de ferro só podem ser abertas com Redstone, botões ou acionadores. + + + Dá ao usuário 1 de Armadura quando usado. + + + Dá ao usuário 3 de Armadura quando usado. + + + Usado para cortar blocos relacionados à madeira mais rápido que à mão. + + + Usada para trabalhar blocos de terra e grama para preparar para plantação. + + + Portas de madeira são ativadas quando usadas, atingidas ou com Redstone. + + + Dá ao usuário 2 de Armadura quando usado. + + + Dá ao usuário 4 de Armadura quando usado. + + + Dá ao usuário 1 de Armadura quando usado. + + + Dá ao usuário 2 de Armadura quando usado. + + + Dá ao usuário 1 de Armadura quando usado. + + + Dá ao usuário 2 de Armadura quando usado. + + + Dá ao usuário 5 de Armadura quando usado. + + + Usada para obter escadas compactas. + + + Usada para guardar sopa de cogumelo. Você fica com a vasilha depois de comer a sopa. + + + Usado para guardar e transportar água, lava e leite. + + + Usado para armazenar e transportar água. + + + Mostra o texto digitado por você ou por outros jogadores. + + + Usado para iluminar mais que tochas. Derrete neve/gelo e pode ser usado embaixo d'água. + + + Usado para causar explosões. Ativado após a colocação com ignição por Sílex e Aço ou com carga elétrica. + + + Usado para armazenar e transportar lava. + + + Mostra as posições do sol e da lua. + + + Aponta para seu ponto inicial. + + + Cria uma imagem da área explorada enquanto você o segura. Pode ser usado para encontrar caminhos. + + + Usado para armazenar e transportar leite. + + + Usado para criar fogo, detonar TNT e abrir um portal depois de construído. + + + Usada para pegar peixes. + + + Ativados quando usados, atingidos ou com Redstone. Funcionam como portas normais, mas são blocos de um por um e são colocados diretamente no chão. + + + Usada como material de construção; pode ser usada para fabricar muitas coisas. Pode ser fabricada com qualquer tipo de madeira. + + + Usado como material de construção. Não sofre ação da gravidade como a areia normal. + + + Usado como material de construção. + + + Usado para fazer escadas longas. Dois degraus colocados um sobre o outro criam um bloco de degrau duplo de tamanho normal. + + + Usado para fazer escadas longas. Dois degraus colocados um sobre o outro criam um bloco de degrau duplo de tamanho normal. + + + Usada para iluminar. As tochas também derretem neve e gelo. + + + Usada para fabricar tochas, flechas, placas, escadas de mão, cercas e como cabos de ferramentas e armas. + + + Armazena blocos e itens no interior. Coloque dois baús lado a lado para criar um baú maior com o dobro da capacidade. + + + Usada como barreira que não pode ser pulada. Conta como 1,5 bloco de altura para jogadores, animais e monstros, mas como 1 bloco de altura para outros blocos. + + + Usada para escalar verticalmente. + + + Usada para adiantar o tempo de um ponto da noite até a manhã, estando todos os jogadores no mundo nela, e mudar o ponto de criação do jogador. Suas cores são sempre as mesmas, independentemente da cor da lã. + + + Permite fabricar maior variedade de itens que a fabricação normal. + + + Permite fundir minério, fazer carvão e vidro e cozinhar peixe e costeletas de porco. + + + Machado de Ferro + + + Lâmpada de Redstone + + + Escada: madeira de floresta + + + Escada de Bétula + + + Controles Atuais + + + Caveira + + + Cacau + + + Escada de Abeto + + + Ovo de Dragão + + + Pedra Final + + + Estrutura do Portal Final + + + Escada de Arenito + + + Samambaia + + + Arbusto + + + Estilo + + + Fabricação + + + Usar + + + Ação + + + Esgueirar-se/Voar Abaixo + + + Esgueirar-se + + + Soltar + + + Rodízio de Itens + + + Pausar + + + Olhar + + + Mover/Correr + + + Inventário + + + Pular/Voar Acima + + + Pular + + + Portal Final + + + Broto de Abóbora + + + Melão + + + Painel de Vidro + + + Portão de Cerca + + + Vinhas + + + Broto de Melão + + + Barras de Ferro + + + Blocos de Pedra Rachada + + + Blocos de Pedra com Musgo + + + Blocos de Pedra + + + Cogumelo + + + Cogumelo + + + Tijolos de pedra cinzentos + + + Escadas de Blocos + + + Verruga do Submundo + + + Escadas: Blocos Submundo + + + Cerca: Blocos Submundo + + + Caldeirão + + + Barraca de Poções + + + Bancada de Feitiços + + + Bloco do Submundo + + + Pedregulho de Traça + + + Pedra Traça + + + Escadas: Blocos de Pedra + + + Vitória-Régia + + + Micélio + + + Bloco de pedra de Traça + + + Alterar Modo Câmera + + + Se você perder energia, mas tiver uma barra de alimentos com 9 ou mais {*ICON_SHANK_01*}, sua energia será preenchida automaticamente. Comer preenche sua barra de alimentos. + + + Conforme você se move, extrai ou ataca, sua barra de alimentos vai esvaziando {*ICON_SHANK_01*}. Correr e correr pulando consomem muito mais alimento que caminhar e correr normalmente. + + + Conforme você coleta e fabrica itens, seu inventário vai enchendo.{*B*} + Pressione{*CONTROLLER_ACTION_INVENTORY*} para abrir o inventário. + + + A madeira que você coletou pode ser usada para fabricar tábuas. Abra a interface de fabricação para fabricá-las.{*PlanksIcon*} + + + Sua barra de alimentos está baixa e você perdeu energia. Coma o bife do seu inventário para preencher sua barra de alimentos e começar a cura.{*ICON*}364{*/ICON*} + + + Com um item de comida na mão, mantenha pressionado {*CONTROLLER_ACTION_USE*}para comer e preencher sua barra de alimentos. Você não poderá comer se sua barra de alimentos estiver cheia. + + + Pressione{*CONTROLLER_ACTION_CRAFTING*} para abrir a interface de fabricação. + + + Para correr, pressione {*CONTROLLER_ACTION_MOVE*}para frente rapidamente duas vezes. Enquanto segurar {*CONTROLLER_ACTION_MOVE*}, o personagem continuará correndo, a não ser que o tempo de corrida ou o alimento acabem. + + + Use{*CONTROLLER_ACTION_MOVE*} para se mover. + + + Use{*CONTROLLER_ACTION_LOOK*} para olhar para cima, para baixo e ao redor. + + + Segure {*CONTROLLER_ACTION_ACTION*} para cortar 4 blocos de madeira (troncos de árvore).{*B*}Quando um bloco quebra, você pode pegá-lo ficando perto do item flutuante exibido, fazendo-o aparecer em seu inventário. + + + Segure {*CONTROLLER_ACTION_ACTION*} para extrair e cortar usando a mão ou o que estiver segurando. Talvez seja necessário fabricar uma ferramenta para extrair alguns blocos... + + + Pressione{*CONTROLLER_ACTION_JUMP*} para pular. + + + Muitas tarefas de fabricação envolvem diversas etapas. Agora que você tem algumas tábuas, pode fabricar mais itens. Crie uma bancada.{*CraftingTableIcon*} + + + +A noite pode cair rapidamente e é perigoso ficar lá fora sem estar preparado. Você pode fabricar armaduras e armas, mas é melhor ter um abrigo seguro. + + + + Abrir o recipiente + + + A picareta ajuda a cavar blocos duros, como pedra e minério, mais rapidamente. Quando coletar mais materiais poderá fabricar ferramentas mais rápidas e duráveis e poderá extrair materiais mais duros. Crie uma picareta de madeira.{*WoodenPickaxeIcon*} + + + Use a picareta para extrair alguns blocos de pedra. Blocos de pedra produzem pedregulho quando extraídos. Se coletar 8 blocos de pedregulho poderá construir uma fornalha. Talvez seja necessário cavar a terra para chegar à pedra. Então, use a pá para isso.{*StoneIcon*} + + + +Você precisará coletar os recursos para concluir o abrigo. As paredes e o teto podem ser feitos com peças de qualquer tipo, mas você precisará criar uma porta, algumas janelas e iluminação. + + + + +Aqui perto há um abrigo abandonado de mineiro que você pode concluir para passar a noite em segurança. + + + + O machado ajuda a cortar madeira e blocos de madeira mais rapidamente. Quando coletar mais materiais poderá fabricar ferramentas mais rápidas e duráveis. Crie um machado de madeira.{*WoodenHatchetIcon*} + + + Use{*CONTROLLER_ACTION_USE*} para usar itens, interagir com objetos e colocar alguns itens. Os itens colocados podem ser coletados novamente se extraídos com a ferramenta correta. + + + Use {*CONTROLLER_ACTION_LEFT_SCROLL*}e {*CONTROLLER_ACTION_RIGHT_SCROLL*}para alterar o item que está segurando. + + + Para coletar blocos mais rapidamente, você pode construir ferramentas próprias para o trabalho. Algumas ferramentas têm cabo feito de varetas. Fabrique algumas varetas agora.{*SticksIcon*} + + + A pá ajuda a cavar blocos macios, como terra e neve, mais rapidamente. Quando coletar mais materiais poderá fabricar ferramentas mais rápidas e duráveis. Crie uma pá de madeira.{*WoodenShovelIcon*} + + + Aponte o cursor para a bancada e pressione{*CONTROLLER_ACTION_USE*} para abri-la. + + + Com a bancada selecionada, aponte o cursor para o local desejado e use{*CONTROLLER_ACTION_USE*} para colocar a bancada. + + + Minecraft é um jogo onde você coloca blocos para construir qualquer coisa que imaginar. +À noite os monstros aparecem. Então, construa um abrigo antes que isso aconteça. + + + + + + + + + + + + + + + + + + + + + + + + Estilo 1 + + + Movimento (Ao Voar) + + + Jogadores/Convidar + + + + + + Estilo 3 + + + Estilo 2 + + + + + + + + + + + + + + + {*B*}Pressione{*CONTROLLER_VK_A*} para iniciar o tutorial.{*B*} + Pressione{*CONTROLLER_VK_B*} se achar que está pronto para jogar sozinho. + + + {*B*}Pressione{*CONTROLLER_VK_A*} para continuar. + + + + + + + + + + + + + + + + + + + + + + + + + + + Bloco Traça + + + Degrau de Pedra + + + Um modo compacto de armazenar Ferro. + + + Bloco de Ferro + + + Degrau de Carvalho + + + Degrau de Arenito + + + Degrau de Pedra + + + Um modo compacto de armazenar Ouro. + + + Flor + + + Lã Branca + + + Lã Laranja + + + Bloco de Ouro + + + Cogumelo + + + Rosa + + + Degrau de Pedregulho + + + Estante de Livros + + + TNT + + + Tijolos + + + Tocha + + + Obsidiana + + + Pedra de Musgo + + + Degrau: Bloco Submundo + + + Degrau de Carvalho + + + Degrau Bloc.Pedra + + + Degrau de Tijolo + + + Chapa madeira florestal + + + Degrau de Bétula + + + Degrau de Abeto + + + Lã Magenta + + + Folhas de Bétula + + + Folhas de Abeto + + + Folhas de Carvalho + + + Vidro + + + Esponja + + + Folhas de floresta + + + Folhas + + + Carvalho + + + Abeto + + + Bétula + + + Madeira de Abeto + + + Madeira de Bétula + + + Madeira de floresta + + + + + + Lã Rosa + + + Lã Cinza + + + Lã Cinzenta + + + Lã Azul-clara + + + Lã Amarela + + + Lã Verde-lima + + + Lã Ciano + + + Lã Verde + + + Lã Vermelha + + + Lã Preta + + + Lã Roxa + + + Lã Azul + + + Lã Marrom + + + Tocha (Carvão) + + + Glowstone + + + Areia Movediça + + + Pedra Inflamável + + + Bloco Lápis-azul + + + Minério de Lápis-azul + + + Portal + + + Lanterna de Abóbora + + + Cana-de-açúcar + + + Argila + + + Cacto + + + Abóbora + + + Cerca + + + Jukebox + + + Um modo compacto de armazenar Lápis-azul. + + + Alçapão + + + Baú Trancado + + + Diodo + + + Pistão Aderente + + + Pistão + + + Lã (qualquer cor) + + + Arbusto Seco + + + Bolo + + + Bloco de Nota + + + Distribuidor + + + Grama Alta + + + Teia + + + Cama + + + Gelo + + + Bancada + + + Um modo compacto de armazenar Diamantes. + + + Bloco de Diamante + + + Fornalha + + + Campo + + + Colheitas + + + Minério de Diamante + + + Criador de Monstros + + + Fogo + + + Tocha (Carvão Vegetal) + + + Pó de Redstone + + + Baú + + + Escada de Carvalho + + + Placa + + + Minério de Redstone + + + Porta de Ferro + + + Chapa de Pressão + + + Neve + + + Botão + + + Tocha de Redstone + + + Alavanca + + + Trilho + + + Escada de Mão + + + Porta de Madeira + + + Escadas de Pedra + + + Trilho Detector + + + Trilho com Propulsão + + + Você coletou pedregulho suficiente para construir uma fornalha. Use a bancada para criar uma. + + + Vara de Pescar + + + Relógio + + + Pó de Glowstone + + + Carrinho com Fornalha + + + Ovo + + + Bússola + + + Peixe Cru + + + Rosa Vermelha + + + Verde Cacto + + + Grãos de Cacau + + + Peixe Cozido + + + Corante em Pó + + + Saco de Tinta + + + Carrinho com Baú + + + Bola de Neve + + + Barco + + + Couro + + + Carrinho de Minas + + + Sela + + + Redstone + + + Balde de Leite + + + Papel + + + Livro + + + Slimeball + + + Tijolo + + + Argila + + + Cana-de-açúcar + + + Lápis-azul + + + Mapa + + + Disco - "13" + + + Disco de Música - "cat" + + + Cama + + + Repetidor de Redstone + + + Biscoito + + + Disco de Música - "blocks" + + + Disco de Música - "mellohi" + + + Disco de Música - "stal" + + + Disco de Música - "strad" + + + Disco de Música - "chirp" + + + Disco de Música - "far" + + + Disco de Música - "mall" + + + Bolo + + + Corante Cinza + + + Corante Rosa + + + Corante Verde-lima + + + Corante Roxo + + + Corante Ciano + + + Corante Cinzento + + + Amarelo-narciso + + + Farelo de Osso + + + Osso + + + Açúcar + + + Corante Azul-claro + + + Corante Magenta + + + Corante Laranja + + + Placa + + + Túnica de Couro + + + Peitoral de Ferro + + + Peitoral de Diamante + + + Capacete de Ferro + + + Capacete de Diamante + + + Capacete de Ouro + + + Peitoral de Ouro + + + Perneiras de Ouro + + + Botas de Couro + + + Botas de Ferro + + + Calças de Couro + + + Perneiras de Ferro + + + Perneiras de Diamante + + + Chapéu de Couro + + + Enxada de Pedra + + + Enxada de Ferro + + + Enxada de Diamante + + + Machado de Diamante + + + Machado de Ouro + + + Enxada de Madeira + + + Enxada de Ouro + + + Peitoral de Malha + + + Perneiras de Malha + + + Botas de Malha + + + Porta de Madeira + + + Porta de Ferro + + + Capacete de Malha + + + Botas de Diamante + + + Pena + + + Pólvora + + + Sementes de Trigo + + + Vasilha + + + Sopa de Cogumelo + + + Fio + + + Trigo + + + Costeleta de Porco Cozida + + + Pintura + + + Maçã de Ouro + + + Pão + + + Sílex + + + Costeleta de Porco Crua + + + Vareta + + + Balde + + + Balde de Água + + + Balde de Lava + + + Botas de Ouro + + + Barra de Ferro + + + Barra de Ouro + + + Sílex e Aço + + + Carvão + + + Carvão Vegetal + + + Diamante + + + Maçã + + + Arco + + + Flecha + + + Disco de Música - "ward" + + + + Pressione{*CONTROLLER_VK_LB*} e{*CONTROLLER_VK_RB*} para alterar para o tipo de grupo de itens que deseja fabricar. Selecione o grupo de estruturas.{*StructuresIcon*} + + + + + Pressione{*CONTROLLER_VK_LB*} e{*CONTROLLER_VK_RB*} para alterar para o tipo de grupo de itens que deseja fabricar. Selecione o grupo de ferramentas.{*ToolsIcon*} + + + + + Você já construiu uma bancada e agora deve colocá-la no mundo para poder construir uma variedade maior de itens.{*B*} + Pressione{*CONTROLLER_VK_B*} agora para sair da interface de fabricação. + + + + + Com as ferramentas que construiu, você está pronto para começar bem e poderá coletar diversos materiais com mais eficiência.{*B*} + Pressione{*CONTROLLER_VK_B*} agora para sair da interface de fabricação. + + + + + Muitas tarefas de fabricação envolvem diversas etapas. Agora que você tem algumas tábuas, pode fabricar mais itens. Use{*CONTROLLER_MENU_NAVIGATE*} para alterar para o item que deseja fabricar. Selecione a bancada.{*CraftingTableIcon*} + + + + + Use{*CONTROLLER_MENU_NAVIGATE*} para alterar para o item que deseja fabricar. Alguns itens têm várias versões, dependendo dos materiais usados. Selecione a pá de madeira.{*WoodenShovelIcon*} + + + + A madeira que você coletou pode ser usada para fabricar tábuas. Selecione o ícone de tábuas e pressione{*CONTROLLER_VK_A*} para criá-las.{*PlanksIcon*} + + + + Você pode fabricar uma seleção maior de itens usando uma bancada. A fabricação na bancada funciona da mesma maneira que a fabricação básica, mas você terá uma área maior de fabricação e uma variedade maior de itens para fabricar. + + + + +A área de fabricação mostra os itens necessários para fabricar o novo item. Pressione{*CONTROLLER_VK_A*} para fabricar o item e colocá-lo no inventário. + + + + +Role pelas guias de Tipo de Grupo na parte superior usando{*CONTROLLER_VK_LB*} e{*CONTROLLER_VK_RB*} para selecionar o tipo de grupo do item que deseja fabricar. Em seguida, use{*CONTROLLER_MENU_NAVIGATE*} para selecionar o item a ser fabricado. + + + + + A lista dos ingredientes necessários para fabricar o item é exibida. + + + + + A descrição do item selecionado é exibida. Com a descrição você pode ter uma ideia de como o item pode ser usado. + + + + + A parte inferior direita da interface de fabricação mostra seu inventário. Essa área também pode mostrar a descrição do item selecionado e os ingredientes necessários para fabricá-lo. + + + + + Alguns itens não podem ser criados usando a bancada, mas precisam da fornalha. Fabrique a fornalha agora.{*FurnaceIcon*} + + + + Cascalho + + + Minério de Ouro + + + Minério de Ferro + + + Lava + + + Areia + + + Arenito + + + Minério de Carvão + + + {*B*} + Pressione{*CONTROLLER_VK_A*} para continuar.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber usar a fornalha. + + + + + Esta é a interface da fornalha. Com ela você pode alterar os itens queimando-os. Por exemplo, nela você pode transformar minério de ferro em barras de ferro. + + + + + Coloque no mundo a fornalha que fabricou. É bom colocá-la dentro do seu abrigo.{*B*} + Pressione{*CONTROLLER_VK_B*} agora para sair da interface de fabricação. + + + + Madeira + + + Madeira de Carvalho + + + + Você precisa colocar um pouco de combustível na abertura inferior da fornalha e o item a ser transformado na abertura superior. A fornalha acenderá e começará a funcionar, colocando o resultado na abertura à direita. + + + + {*B*} + Pressione{*CONTROLLER_VK_X*} para mostrar novamente o inventário. + + + + {*B*} + Pressione{*CONTROLLER_VK_A*} para continuar.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber usar o inventário. + + + + Este é seu inventário. Ele mostra os itens disponíveis para uso em sua mão e todos os outros itens que está carregando. Sua armadura também é mostrada aqui. + + + + + {*B*} + Pressione{*CONTROLLER_VK_A*} para continuar o tutorial.{*B*} + Pressione{*CONTROLLER_VK_B*} se achar que está pronto para jogar sozinho. + + + + +Se você mover o ponteiro para fora da borda da interface com um item nele, poderá derrubar o item. + + + + +Mova este item com o ponteiro sobre outro espaço no inventário e coloque-o usando{*CONTROLLER_VK_A*}. Com vários itens no ponteiro, use{*CONTROLLER_VK_A*} para colocar todos ou{*CONTROLLER_VK_X*} para colocar apenas um. + + + + +Use{*CONTROLLER_MENU_NAVIGATE*} para mover o ponteiro. Use{*CONTROLLER_VK_A*} para pegar um item sob o ponteiro. Se houver mais de um item aqui, esta ação pegará todos; você também pode usar{*CONTROLLER_VK_X*} para pegar apenas metade deles. + + + + + Você concluiu a primeira parte do tutorial. + + + + Use a fornalha para criar vidro. Enquanto espera ficar pronto, que tal coletar mais materiais para terminar o abrigo? + + + Use a fornalha para criar carvão vegetal. Enquanto espera ficar pronto, que tal coletar mais materiais para terminar o abrigo? + + + Use{*CONTROLLER_ACTION_USE*} para colocar a fornalha no mundo e abra-a. + + + À noite pode ficar bem escuro. Então, é bom ter alguma iluminação no interior do abrigo para poder enxergar. Fabrique uma tocha agora com varetas e carvão vegetal, usando a interface de fabricação.{*TorchIcon*} + + + Use{*CONTROLLER_ACTION_USE*} para colocar a porta. Você pode usar{*CONTROLLER_ACTION_USE*} para abrir e fechar a porta de madeira no mundo. + + + Um bom abrigo precisa de porta para você poder entrar e sair sem precisar extrair e repor as paredes. Fabrique uma porta de madeira agora.{*WoodenDoorIcon*} + + + + Para obter mais informações sobre um item, passe o ponteiro do mouse sobre ele e pressione{*CONTROLLER_ACTION_MENU_PAGEDOWN*} . + + + + +Esta é a interface de fabricação. Esta interface de fabricação lhe permite combinar os itens coletados para fazer novos itens. + + + + +Pressione{*CONTROLLER_VK_B*} agora para sair do inventário do modo criativo. + + + + + Para obter mais informações sobre um item, passe o ponteiro do mouse sobre ele e pressione{*CONTROLLER_ACTION_MENU_PAGEDOWN*} . + + + + {*B*} + Pressione{*CONTROLLER_VK_X*} para mostrar os ingredientes necessários para fazer o item atual. + + + + {*B*} + Pressione{*CONTROLLER_VK_X*} para mostrar a descrição do item. + + + + {*B*} + Pressione{*CONTROLLER_VK_A*} para continuar.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber fabricar. + + + + +Role pelas guias de Tipo de Grupo na parte superior usando{*CONTROLLER_VK_LB*} e{*CONTROLLER_VK_RB*} para selecionar o tipo de grupo do item que deseja pegar. + + + + {*B*} + Pressione{*CONTROLLER_VK_A*} para continuar.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber usar o inventário do modo criativo. + + + + + Este é o inventário do modo criativo. Ele mostra os itens disponíveis para usar na sua mão e todos os outros itens que pode escolher. + + + + + Pressione{*CONTROLLER_VK_B*} agora para sair do inventário. + + + + +Se você mover o ponteiro para fora da borda da interface com um item nele, poderá derrubar o item no mundo. Para limpar todos os itens da barra de seleção rápida, pressione{*CONTROLLER_VK_X*}. + + + + +O ponteiro será movido automaticamente para um espaço na linha de uso. Você pode colocá-lo usando{*CONTROLLER_VK_A*}. Depois de colocar o item, o ponteiro retornará à lista de itens, onde você poderá selecionar outro item. + + + + +Use{*CONTROLLER_MENU_NAVIGATE*} para mover o ponteiro. +Quando estiver na lista de itens, use{*CONTROLLER_VK_A*} para pegar o item sob o ponteiro e use{*CONTROLLER_VK_Y*} para pegar a pilha toda do item. + + + + Água + + + Garrafa de Vidro + + + Garrafa de Água + + + Olho de Aranha + + + Pepita de Ouro + + + Verruga do Submundo + + + {*prefix*}Poção {*postfix*} {*splash*} + + + Olho Aranha Ferm. + + + Caldeirão + + + Olho de Ender + + + Melão Cintilante + + + Pó de Chamas + + + Creme de Magma + + + Barraca de Poções + + + Lágrima de Ghast + + + Sementes de Abóbora + + + Sementes de Melão + + + Frango Cru + + + Disco - "11" + + + Disco de Música - "where are we now" + + + Tosquiadeira + + + Frango Cozido + + + Pérola do Ender + + + Fatia de Melão + + + Vara de Chamas + + + Carne Crua + + + Bife + + + Carne Podre + + + Garrafa de Feitiços + + + Tábuas de Carvalho + + + Tábuas de Abeto + + + Tábuas de Bétula + + + Bloco de Grama + + + Terra + + + Pedregulho + + + Tábuas da Selva + + + Muda de Bétula + + + Broto de árvore da floresta + + + Pedra Indestrutível + + + Muda + + + Muda de Carvalho + + + Muda de Abeto + + + Pedra + + + Quadro de Item + + + Criar {*CREATURE*} + + + Bloco do Submundo + + + Carga de Fogo + + + Carga Fogo: Carv. Veg. + + + Carga Fogo: Carvão + + + Caveira + + + Cabeça + + + Cabeça de %s + + + Cabeça de creeper + + + Caveira do esqueleto + + + Caveira do esqueleto murcho + + + Cabeça de zumbi + + + Um modo compacto de armazenar Carvão. Pode ser usado como combustível na Fornalha. + + + Veneno + + + Fome + + + de Lentidão + + + de Rapidez + + + Invisibilidade + + + Respirar na Água + + + Visão Noturna + + + Cegueira + + + de Dano + + + de Cura + + + de Náuseas + + + de Regeneração + + + de Lentidão + + + de Pressa + + + de Fraqueza + + + de Força + + + Resistência ao Fogo + + + Saturação + + + de Resistência + + + de Salto + + + Wither + + + Impulso de Energia + + + Absorção + + + + + + II + + + 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 + + + Mundana + + + Desinteressante + + + Ousada + + + Cordial + + + Charmosa + + + Elegante + + + Chique + + + Cintilante + + + 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 + + + Atacar + + + Nitidez + + + Reduz a saúde dos jogadores, animais e monstros afetados com o tempo. + + + Dano de Ataque + + + Coice + + + Veneno de Artrópodes + + + Rapidez + + + Reforços zumbis + + + Força do Salto do Cavalo + + + Ao ser aplicado: + + + Resistência a Coice + + + Alcance de perseguição da multidão + + + Energia máxima + + + Toque de Seda + + + Eficiência + + + Afinidade com a Água + + + Sorte + + + Pilhagem + + + Inquebrável + + + Proteção contra Fogo + + + Proteção + + + Aspecto de Fogo + + + Queda de Pena + + + Respiração + + + Proteção contra Projétil + + + Proteção contra Explosão + + + IV + + + V + + + VI + + + Soco + + + VII + + + III + + + Chama + + + Poder + + + Infinito + + + II + + + I + + + É ativado quando uma entidade passa por um Detonador conectado. + + + Ativa um Gancho de Detonação conectado quando uma entidade passa por ele. + + + Um modo compacto de armazenar Esmeraldas. + + + Semelhante a um Baú, exceto que os itens colocados em um Baú de Ender estão disponíveis em todos os Baús de Ender do jogador, mesmo em dimensões diferentes. + + + IX + + + VIII + + + Pode ser extraído com uma picareta de Ferro ou de material melhor para coletar Esmeraldas. + + + 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. + + + 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*}. Comê-la pode envenenar você. + + + Usada para controlar um porco selado ao andar nele. + + + Restaura 3{*ICON_SHANK_01*}. Criada ao cozinhar uma batata na fornalha. + + + Restaura 3{*ICON_SHANK_01*}. Fabricada com uma Cenoura e Pepitas de Ouro. + + + Usado com uma Bigorna para enfeitiçar armas, ferramentas ou armaduras. + + + Criado ao extrair Minério de Quartzo do Submundo. Pode ser fabricado em um Bloco de Quartzo. + + + Batata + + + Batata Assada + + + Cenoura + + + Fabricado a partir de Lã. Usado como decoração. + + + Esmeralda + + + Vaso de Flor + + + Torta de Abóbora + + + Livro Encantado + + + Batata Envenenada + + + Cenoura Dourada + + + Cenoura no Palito + + + Gancho de Detonação + + + Detonador + + + Quartzo do Submundo + + + Minério de Esmeralda + + + Baú de Ender + + + Parede com Musgo + + + Bloco de Esmeralda + + + Parede de Pedregulho + + + Batatas + + + Vaso de Flor + + + Cenouras + + + Bigorna um Pouco Danificada + + + Bigorna + + + Bigorna + + + Bloco de Quartzo + + + Bigorna Muito Danificada + + + Minério de Quartzo do Submundo + + + Escada de Quartzo + + + Bloco Esculpido de Quartzo + + + Bloco de Pilar de Quartzo + + + Carpete Vermelho + + + Carpete + + + Carpete Preto + + + Carpete Azul + + + Carpete Verde + + + Carpete Marrom + + + Carpete Roxo + + + Carpete Ciano + + + Carpete Cinzento + + + Carpete Cinza + + + Carpete Verde-lima + + + Carpete Rosa + + + Carpete Azul-claro + + + Carpete Amarelo + + + Carpete Magenta + + + Carpete Laranja + + + Carpete Branco + + + Arenito Esculpido + + + {*PLAYER*} foi morto tentando machucar {*SOURCE*} + + + Arenito Suave + + + {*PLAYER*} foi esmagado por uma Bigorna. + + + {*PLAYER*} foi esmagado por um bloco. + + + {*PLAYER*} teleportou você até a posição dele + + + {*PLAYER*} teleportado até {*DESTINATION*} + + + Espinhos + + + {*PLAYER*} se teleportou até você + + + Faz as áreas escuras aparecerem como se estivessem à luz do dia, mesmo embaixo d'água. + + + Degrau de Quartzo + + + Torna jogadores, animais e monstros invisíveis. + + + Consertar e Dar nome + + + Caro Demais! + + + Custo do Feitiço: %d + + + Você tem: + + + Renomear + + + {*VILLAGER_TYPE*} oferece %s + + + Itens para o comércio + + + Comércio + + + 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. + + + + + {*B*} + Pressione{*CONTROLLER_VK_A*} para saber mais sobre a interface da Bigorna.{*B*} + Pressione{*CONTROLLER_VK_B*} se já conhecer a interface da Bigorna. + + + + + Outra opção é colocar um segundo item idêntico no segundo espaço para combinar os dois itens. + + + + + 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. + + + + + 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. + + + + + 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. + + + + + É possível renomear o item editando o nome mostrado na caixa de texto. + + + + + {*B*} + Pressione{*CONTROLLER_VK_A*} para saber mais sobre a Bigorna.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber sobre a Bigorna. + + + + + Nesta área há uma Bigorna e um Baú contendo ferramentas e armas para serem trabalhadas. + + + + + 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. + + + + + 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. + + + + + 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. + + + + + A renomeação de um item muda o nome exibido para todos os jogadores e reduz de modo permanente o custo do trabalho anterior. + + + + + {*B*} + Pressione{*CONTROLLER_VK_A*} para saber mais sobre a interface de comércio.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber sobre a interface de comércio. + + + + + Esta é a interface de comércio que mostra as trocas que podem ser feitas com um aldeão. + + + + + As trocas comerciais aparecerão em vermelho e não estarão disponíveis se você não tiver os itens necessários. + + + + + Todas as trocas comerciais que o aldeão estiver disposto a fazer no momento serão exibidas na parte superior. + + + + + Você pode ver o número total dos itens necessários para a troca nas duas caixas à esquerda. + + + + + 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. + + + + + {*B*} + Pressione{*CONTROLLER_VK_A*} para saber mais sobre o comércio.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber sobre o comércio. + + + + + 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. + + + + + As trocas comerciais que foram realizadas com frequência podem ser removidas temporariamente, mas o aldeão sempre oferecerá pelo menos uma troca. + + + + + Pegue Papel do Baú e tente trocar com o aldeão aqui. + + + + + Nesta área há dois Baús de Ender. + + + + + {*B*} + Pressione{*CONTROLLER_VK_A*} para saber mais sobre Baús de Ender.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber sobre Baús de Ender. + + + + + Todos os Baús de Ender em um mundo estão associados, mesmo em dimensões diferentes. Os itens colocados em um Baú de Ender podem ser acessados em qualquer outro Baú de Ender. + + + + + Porém, o conteúdo dos Baús de Ender é diferente para cada jogador. + + + + + Com isso, os jogadores podem armazenar itens em qualquer Baú de Ender e recuperá-los em outros Baús de Ender em posições diferentes no mundo. Você pode tentar isso agora colocando itens em qualquer Baú de Ender. + + + + Restaura 2{*ICON_SHANK_01*}, regenera a energia por 30 segundos e concede resistência contra fogo e contra danos por 5 minutos. Fabricada com uma Maçã e Blocos de Ouro. + + + Pode Teleportar + + + Teleportar + + + Teleportar até o jogador + + + Teletransportar até mim + + + Pode Desabilitar Exaustão + + + Pode Se Tornar Invisível + + + Agora você pode habilitar a invisibilidade + + + Você não pode mais habilitar a invisibilidade + + + Agora você pode habilitar o voo + + + Você não pode mais habilitar o voo + + + Agora você pode desabilitar a exaustão + + + Você não pode mais desabilitar a exaustão + + + Agora você pode se teleportar + + + Você não pode mais se teleportar + + + {*T3*}COMO JOGAR: BIGORNA{*ETW*}{*B*}{*B*} +Níveis de experiência podem ser usados para consertar, enfeitiçar ou renomear itens com a Bigorna.{*B*} +Todos os itens podem ser renomeados, embora apenas itens com durabilidade possam ser consertados ou enfeitiçados com a aplicação de Livros Encantados neles.{*B*} +Um item pode ser consertado colocando-o em um dos espaços de entrada à esquerda, junto com algumas matérias-primas do item, como Barras de Ferro para uma Espada de Ferro, ou combinado com outro item do mesmo tipo.{*B*} +A combinação de itens é mais eficiente quando feita com uma Bigorna. Além disso, se algum item estiver enfeitiçado, o produto final pode ter feitiços de uma das entradas.{*B*} +Os Livros Encantados podem aplicar feitiços aos itens combinando-os em uma Bigorna se o feitiço do Livro for adequado. 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.{*B*} +A Bigorna pode ser danificada após cada uso, e será destruída depois de sofrer muitos danos.{*B*} + + + {*T3*}COMO JOGAR: COMÉRCIO{*ETW*}{*B*}{*B*} +É possível comercializar itens com os aldeões. Cada aldeão tem uma profissão. Eles podem ser Fazendeiros, Açougueiros, Ferreiros, Bibliotecários ou Padres, o que afeta o tipo de item que podem comercializar.{*B*} +Você pode encontrar uma lista de todas as trocas que o aldeão está oferecendo no menu de comércio. Um aldeão pode modificar ou adicionar suas trocas comerciais sempre que um jogador negociar com ele, embora uma troca possa ser desativada temporariamente se realizada com muita frequência.{*B*} +As trocas geralmente envolvem a compra e a venda de uma série de itens por esmeraldas.{*B*} +Se você não tiver os itens necessários para uma troca, os itens serão exibidos em vermelho.{*B*} + + + + {*T3*}COMO JOGAR: BAÚ DE ENDER {*ETW*}{*B*}{*B*} +Todos os Baús de Ender em um mundo estão associados. Os itens colocados em um Baú de Ender podem ser acessados em qualquer outro. Porém, o conteúdo dos Baús de Ender é diferente para cada jogador. Com isso, os jogadores podem armazenar itens em qualquer Baú de Ender e recuperá-los em outros Baús de Ender em posições diferentes no mundo. + + + + Fazendeiro + + + Bibliotecário + + + Padre + + + Ferreiro + + + Açougueiro + + + Encontrados em aldeias, os aldeões se oferecerão para vender itens para o jogador, dependendo de sua profissão. + + + Baú Grande + + + + Você também pode criar Livros Encantados na Mesa de Feitiços, que podem ser usados mais tarde na Bigorna para aplicar seu feitiço a um item. + + + + + Os Ganchos de Detonação também oferecerão poder constante a um circuito enquanto algo estiver acionando o fio entre eles. + + + + + Depois de domado, um lobo sempre terá uma coleira. A cor da coleira pode ser mudada com tinta. + + + + Cenouras e Batatas são cultivadas pela plantação de Cenouras e Batatas e estarão prontas para colheita quando o vegetal estiver visível acima do solo. + + + + Além disso, os porcos podem ser selados e montados pelos jogadores. Eles são controlados atraindo-os com uma Cenoura no Palito. + + + + + Se necessário, você pode mover seu carrinho de minas usando {*CONTROLLER_ACTION_MOVE*}. Isso ajuda a dar partida no carrinho de minas ao colocá-lo num trilho com propulsão. + + + + Você não pode entrar neste jogo, pois a tela dividida só é compatível com o modo de Alta Definição. Faça com que todos os jogadores saiam se quiser entrar. + + + Curar + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/pt-BR/stringsLeaderboards.xml b/Minecraft.Client/PSVitaMedia/loc/pt-BR/stringsLeaderboards.xml new file mode 100644 index 00000000..35f5c4e1 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/pt-BR/stringsLeaderboards.xml @@ -0,0 +1,48 @@ + + + + Eliminações: fácil + + + Eliminações: normal + + + Eliminações: difícil + + + Blocos de Mineração: pacífico + + + Blocos de Mineração: fácil + + + Blocos de Mineração: normal + + + Blocos de Mineração: difícil + + + Cultivo: pacífico + + + Cultivo: fácil + + + Cultivo: normal + + + Cultivo: difícil + + + Deslocamento: pacífico + + + Deslocamento: fácil + + + Deslocamento: normal + + + Deslocamento: difícil + + \ 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 new file mode 100644 index 00000000..eb38115c --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/pt-BR/stringsPlatformSpecific.xml @@ -0,0 +1,245 @@ + + + + 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 + + + NOT USED + + + {*T3*}COMO JOGAR: MODO CRIATIVO{*ETW*}{*B*}{*B*} +A interface do modo criativo permite que qualquer item do jogo seja movido para o inventário do jogador sem precisar minerar ou fabricar aquele item. +Os itens no inventário do jogador não serão removidos quando forem colocados ou usados no mundo, e desta forma o jogador pode se concentrar na construção, em vez de coletar recursos.{*B*} +Se você criar, carregar ou salvar um mundo no Modo Criativo, as atualizações de troféus e de placar de líderes estarão desabilitadas nesse mundo, mesmo que ele seja carregado depois no Modo Sobrevivência.{*B*} +Para voar quando estiver no Modo Criativo, pressione{*CONTROLLER_ACTION_JUMP*} duas vezes rapidamente. Para parar de voar, repita a ação. Para voar mais rápido, pressione{*CONTROLLER_ACTION_MOVE*} para a frente duas vezes rapidamente ao voar. +No modo de voo, você pode manter pressionado{*CONTROLLER_ACTION_JUMP*} para se mover para cima e{*CONTROLLER_ACTION_SNEAK*} para se mover para baixo ou usar{*CONTROLLER_ACTION_DPAD_UP*} para se mover para cima,{*CONTROLLER_ACTION_DPAD_DOWN*} para se mover para baixo,{*CONTROLLER_ACTION_DPAD_LEFT*} para se mover para a esquerda e{*CONTROLLER_ACTION_DPAD_RIGHT*} para se mover para a direita. + + + 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. + + + "NÃO USADO" + + + 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? + + + "NÃO USADO" + + + 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. + + + 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". +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? + + + 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-BR/stringsRichPresence.xml b/Minecraft.Client/PSVitaMedia/loc/pt-BR/stringsRichPresence.xml new file mode 100644 index 00000000..c1990a33 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/pt-BR/stringsRichPresence.xml @@ -0,0 +1,66 @@ + + + + {GAME_STATE} + + + Ocioso + + + Nos menus + + + Jogando Multiplayer - {GAME_STATE} + + + Multiplayer offline\n{GAME_STATE} + + + Jogando sozinho - {GAME_STATE} + + + Sozinho offline - {GAME_STATE} + + + Aproveitando a vista! + + + Montando em um porco + + + Montando em um carrinho + + + Em um barco + + + Pescando + + + Fabricando + + + Forjando + + + No Submundo + + + Escutando um disco + + + Olhando um mapa + + + Enfeitiçando + + + Preparando uma poção + + + Trabalhando na bigorna + + + Conhecendo os vizinhos + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/pt-PT/4J_stringsGeneric.xml b/Minecraft.Client/PSVitaMedia/loc/pt-PT/4J_stringsGeneric.xml new file mode 100644 index 00000000..b2a3b826 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/pt-PT/4J_stringsGeneric.xml @@ -0,0 +1,87 @@ + + + + OK + + + Anterior + + + Cancelar + + + Sim + + + Não + + + Gravação Corrompida + + + Os teus dados de gravação parecem estar corrompidos. Queres gravar novamente e substituir os dados corrompidos? + + + Sem Espaço Livre + + + Selecionar novamente + + + Jogar sem gravar + + + Criar uma gravação nova + + + Substituir a gravação? + + + Não, não substituir + + + Substituir e gravar + + + Falha ao gravar + + + Continuar sem gravar + + + Falha ao carregar + + + Nome da gravação + + + Introduz um nome para a gravação + + + Tens a certeza de que queres sair do jogo? + + + Sessão terminada + + + Continuar a jogar + + + Continuar a jogar offline + + + Jogador Convidado + + + Jogadores convidados não podem aceder a "PSN". + + + A gravar… + + + A gravar conteúdo. Por favor, não desligues o sistema. + + + Jogo Completo + + \ 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 new file mode 100644 index 00000000..09aeda3c --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/pt-PT/4J_stringsPlatformSpecific.xml @@ -0,0 +1,52 @@ + + + + Falha ao guardar as definições para a tua conta Sony Entertainment Network. + + + Problema com a 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 new file mode 100644 index 00000000..2e00b090 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/pt-PT/AdditionalStrings.xml @@ -0,0 +1,96 @@ + + + + Mostrar todos os Mundos de Mistura + + + Esconder + + + Minecraft: PlayStation®3 Edition + + + Opções + + + Cache de Gravação + + + Ocorreu um erro de rede. + + + Erro de Rede + + + Ocorreu um erro de rede. A sair para o Menu Principal. + + + O serviço online está desativado na tua conta Sony Entertainment Network devido a restrições de conversação. + + + O serviço online está desativado na tua conta Sony Entertainment Network devido às definições de controlo parental. + + + Serviço Online + + + A tua sessão "PSN" foi encerrada. As funcionalidades online do jogo não estarão disponíveis até que voltes a iniciar sessão na "PSN". + + + A tua sessão "PSN" foi encerrada. As funcionalidades online do jogo não estarão disponíveis até que voltes a iniciar sessão na "PSN". A sair para o Menu Principal. + + + Escolhe o utilizador para o jogador %d (ou cancela para jogar como convidado) + + + Grátis + + + 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. + + + Troféus Desativados + + + Os troféus vão ser desativados porque esta gravação pertence a outro utilizador. + + + Erro fatal: Inicialização dos troféus falhou. Por favor, sai do jogo. + + + Convites + + + Ficheiro Corrompido + + + Comando Desligado + + + O teu comando foi desligado. Por favor, volta a ligá-lo. + + + 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. + + + Convite + + + Por favor, vem jogar um jogo de Minecraft: PlayStation®Vita Edition! + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/pt-PT/EULA.xml b/Minecraft.Client/PSVitaMedia/loc/pt-PT/EULA.xml new file mode 100644 index 00000000..88458149 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/pt-PT/EULA.xml @@ -0,0 +1,96 @@ + + + + Minecraft: PlayStation®Vita Edition – TERMOS DE UTILIZAÇÃO + Estes Termos definem algumas regras para a utilização do Minecraft: PlayStation®Vita Edition ("Minecraft"). Com o intuito de proteger o Minecraft e os membros da nossa comunidade, precisamos destes termos para definir regras sobre a transferência e utilização do Minecraft. Gostamos tanto de regras como tu, por isso tentámos que fossem o mais breves possível, mas se comprares, transferires, utilizares ou jogares Minecraft, estás a concordar com estes termos ("Termos"). + Antes de irmos ao assunto, há uma coisa que queremos deixar bem clara. O Minecraft é um jogo que permite aos jogadores construir e partir coisas. Se jogares com outras pessoas (multijogador) podes construir com elas ou podes partir o que elas construíram – e elas podem fazer o mesmo contigo. Como tal, não jogues com outras pessoas, se elas não se comportarem da forma que pretendes. Além disso, por vezes as pessoas fazem coisas que não deveriam fazer. Não gostamos disso, mas não há muito que possamos fazer, exceto pedir que todos se comportem de forma correta. Dependemos de ti, e de outros como tu na comunidade, para nos comunicarem quando alguém não está a ter um comportamento adequado e/ou, se for esse o caso, está a quebrar as regras destes Termos ou a usar o Minecraft de forma inadequada. Temos um sistema de assinalar / notificar para esse fim, como tal, usa-o e nós faremos o que for necessário para resolver o assunto. + Para assinalares ou notificares quaisquer questões, por favor envia-nos um email para support@mojang.com e dá-nos toda a informação que puderes, tal como os detalhes do utilizador e o que aconteceu. + Agora vamos voltar aos Termos: + A REGRA PRINCIPAL + A regra principal é que não deves distribuir nada do que foi feito por nós. Por "distribuir nada do que foi feito por nós" entende-se "dar cópias do Minecraft, fazer uma utilização comercial do Minecraft, tentar ganhar dinheiro com o Minecraft ou permitir que outras pessoas tenham acesso ao Minecraft e suas partes de forma injusta ou pouco razoável". Assim, a regra principal é que (a não ser que concordemos especificamente, como nas nossas Linhas Orientadoras de Utilização de Marca e Bens) não deves: + • dar cópias do Minecraft a ninguém; + • fazer utilização comercial de qualquer coisa feita por nós; + • tentar ganhar dinheiro a partir de qualquer coisa feita por nós ou + • permitir que outras pessoas tenham acesso a algo feito por nós de forma que seja injusta ou pouco razoável. + ...e para que fique muito claro, as coisas feitas por nós incluem, mas não se limitam a, o software de cliente ou de servidor para o Minecraft. Também inclui versões modificadas de um Jogo, parte dele ou qualquer outra coisa feita por nós. + De outra forma, somos muito descontraídos quanto ao que fazes – na verdade, encorajamos a que faças coisas fixes (ver em baixo) – mas não faças coisas que dizemos que não podes fazer. + USAR O MINECRAFT + • Compraste o Minecraft e podes usá-lo, pessoalmente, no teu sistema PlayStation®Vita. + • Em baixo, também te concedemos direitos limitados para fazer outras coisas, mas temos de estabelecer um limite, ou as pessoas irão longe demais. Se desejas fazer alguma coisa relacionada com algo que tenhamos feito, ficamos honrados, mas certifica-te de que não pode ser interpretado como sendo oficial e que está de acordo com estes Termos e, acima de tudo, não faças uma utilização comercial de nada que tenha sido feito por nós. + • A permissão que te damos para usar e jogar Minecraft pode ser revogada se violares estes Termos. + • Quando compras o Minecraft, damos-te a nossa permissão para instalares o Minecraft no teu sistema PlayStation®Vita, usá-lo e jogá-lo nesse sistema PlayStation®Vita, tal como especificado nestes Termos. Esta permissão é pessoal e, como tal, não tens autorização para distribuir o Minecraft (ou qualquer parte do jogo) a mais ninguém (exceto se tal for por nós permitido, é claro). + • Dentro de limites razoáveis, és livre para fazeres o que quiseres com imagens e vídeos do Minecraft. Por "limites razoáveis" entende-se que não podes usar as imagens ou vídeos de forma comercial ou fazer coisas que sejam injustas ou afetem adversamente os nossos direitos. Além disso, não comeces a ripar conteúdos e a espalhá-los por aí, é mesmo má onda. + • Essencialmente, a regra é não fazer uso comercial de nada que tenhamos feito, a não ser que especificamente autorizado por nós, quer pelas nossas Linhas Orientadoras de Utilização de Marca e Bens ou por estes Termos. Se a lei também autorizar expressamente, sob doutrina de “uso justo”, então também não tem problema – mas apenas na medida expressa na lei. + PROPRIEDADE DO MINECRAFT E OUTRAS COISAS + • Apesar de te darmos permissão para jogar Minecraft, continuamos a ser os seus proprietários. Também somos proprietários das nossas marcas e de qualquer conteúdo que seja parte integrante do Minecraft, composto pelo nosso software, texturas, bens, ferramentas, infraestrutura e uma carrada de outras coisas inteligentes (e não tão inteligentes) que possuímos. Todos os nossos direitos sobre essas coisas estão reivindicados e reservados, mas podes usá-las, desde que sujeito a estes Termos. + • Isso não significa que somos os proprietários das coisas fixes que tu crias com o Minecraft. Só tens de aceitar que somos os proprietários de cada parte do Minecraft, do Minecraft como produto e serviço e das coisas mencionadas no ponto anterior; e também somos proprietários dos direitos de autor e outros direitos de propriedade intelectual associados a essas coisas e aos nomes e marcas associados ao Minecraft. + • Claro que vais fazer coisas tuas usando o Minecraft. Não somos proprietários das coisas originais que crias e não reclamamos qualquer propriedade sobre nada que não nos pertença. No entanto, seremos os proprietários de cópias (ou cópias substanciais) ou derivados de propriedades e criações nossas (descritas em cima); mas se criares coisas originais, não são nossas. Assim, como por exemplo: + - um bloco simples – somos proprietários disso; + - uma Catedral Gótica com uma montanha-russa a atravessá-la – não somos proprietários disso. + • Portanto, quando pagas pelo uso do Minecraft, estás apenas a comprar uma permissão para usar o produto Minecraft de acordo com estes Termos. As únicas permissões que tens, relativamente ao Minecraft, são as permissões definidas nestes Termos. + CONTEÚDO + • Se disponibilizares algum conteúdo no Minecraft ou através dele, tens de nos dar permissão para usar, copiar, modificar ou adaptar esse conteúdo. Esta permissão tem de ser irrevogável e sem restrições. Também tens de deixar que nós demos permissão a outras pessoas para usarem o teu conteúdo e tens de permitir que outras pessoas a quem permites o acesso (tais como as pessoas com quem jogas jogos em multijogador) o usem. + • Por favor, pensa cuidadosamente antes de disponibilizares qualquer conteúdo, porque pode ser tornado público e usado por outras pessoas de forma que podes não gostar. + • Se vais disponibilizar uma coisa no Minecraft ou através dele, não pode ser ofensiva para as pessoas ou ilegal, tem de ser honesta e tem de ser uma criação tua. Os tipos de coisas que não podes disponibilizar através do Minecraft incluem: publicações que incluem linguagem racista ou homofóbica; publicações que são intimidatórias ou abusadoras; publicações que podem danificar a nossa reputação ou a de outra pessoa; publicações que incluem pornografia, publicidade ou a criação ou imagem de outra pessoa; ou publicações que se fazem passar por um moderador ou que tentam enganar ou explorar pessoas. + • Qualquer conteúdo que disponibilizes no Minecraft também tem de ser uma criação tua. Não podes disponibilizar qualquer conteúdo, utilizando o Minecraft, que infrinja os direitos de terceiros. Se publicares conteúdos no Minecraft e formos contestados, ameaçados ou processados por alguém, porque o conteúdo infringe os direitos dessa pessoa, podemos vir a responsabilizar-te e isso significa que podes ter de nos indemnizar por quaisquer danos que venhamos a sofrer como resultado disso. Portanto, é muito importante que só disponibilizes conteúdos que tenhas criado e que não o faças com conteúdos de terceiros. + • Por favor, tem cuidado com quem jogas. É difícil para nós ter a certeza se o que as pessoas dizem é verdade ou até mesmo se essas pessoas são quem dizem ser. Também não deves entregar informações pessoais através do Minecraft. + Se vais criar conteúdo ("O Teu Conteúdo") e disponibilizá-lo através do Minecraft, este: + - tem de obedecer a todas as regras da Sony Computer Entertainment, incluindo os TdSAU, que são os Termos de Serviço e Acordo de Utilizador da "PSN" e quaisquer outras regras que tenhas de aceitar de modo a utilizar o teu sistema PlayStation®Vita e a "PSN"; + - não pode ser ofensivo para as pessoas; + - não pode ser ilegal ou ilícito; + - tem de ser honesto e não induzir em erro, enganar ou abusar de outras pessoas nem fazer-se passar por outros; + - não pode infringir copyright ou quaisquer outros direitos alheios; + - não pode ser racista, sexista ou homofóbico; + - não pode ser trocista ou ameaçador; + - não pode danificar a nossa reputação ou de qualquer outra pessoa; + - não pode incluir pornografia; + - não pode incluir publicidade. + - não podes disponibilizar qualquer conteúdo através do Minecraft que infrinja os direitos de terceiros. + • És responsável por todo o Conteúdo que disponibilizas através do Minecraft. + • Ao disponibilizares o Teu Conteúdo afirmas e garantes que tens o direito para o fazer ao abrigo destes Termos e que temos o direito de exercer os direitos que nos concedeste ao abrigo destes Termos. + • Se formos alvos de alguma intimação, ameaça ou processo legal por parte de terceiros devido a algum conteúdo que tenhas disponibilizado através do Minecraft, ou que seja disponibilizado por alguém no, ou através do, Minecraft, este poderá ser removido e poderás ser considerado responsável e ter de compensar-nos por quaisquer danos que possamos sofrer como resultado. O teu acesso a certos aspetos do Minecraft também poderá ser removido ou suspenso. + CONTEÚDO CRIADO PELOS UTILIZADORES + Os seguintes termos dizem respeito ao Teu Conteúdo e o conteúdo disponibilizado por outros, referido apenas como "Conteúdo Criado Pelos Utilizadores". O Minecraft é um serviço de entretenimento e como tal nós (e os titulares das nossas licenças, como a Sony Computer Entertainment) estamos envolvidos na transmissão, distribuição, armazenamento e recuperação de Conteúdo Criado Pelos Utilizadores sem avaliação, seleção ou alteração do conteúdo. Isto significa que não avaliamos o Conteúdo Criado Pelos Utilizadores e como tal não saberemos o que está a ser circulado por ti ou por outras pessoas. Estas regras fazem parte dos Termos para que tu e as outras pessoas sigam esta conduta, mas não conseguimos saber tudo o que se passa. + Por isso, toma em atenção que: + • as opiniões expressas em qualquer Conteúdo Criado Pelos Utilizadores pertencem aos autores ou criadores individuais e não a nós ou a alguém ligado a nós, a menos que o contrário seja indicado; + • não somos responsáveis (e não oferecemos qualquer garantia ou representação em relação aos mesmos e declinamos qualquer responsabilidade) pelo Conteúdo Criado Pelos Utilizadores, incluindo comentários, opiniões ou observações expressas no mesmo; + • ao usares o Minecraft reconheces que não temos qualquer responsabilidade de avaliar o conteúdo de qualquer Conteúdo Criado Pelos Utilizadores e que todo o Conteúdo Criado Pelos Utilizadores é disponibilizado tendo em conta que não exercemos qualquer controlo ou julgamento sobre o mesmo, nem é essa a nossa obrigação. +CONTUDO, nós (e os detentores das nossas licenças, como a Sony Computer Entertainment) podemos remover, rejeitar ou suspender o acesso a qualquer Conteúdo Criado Pelos Utilizadores e remover ou suspender a tua capacidade de publicar ou disponibilizar Conteúdo Criado Pelos Utilizadores - incluindo a remoção ou suspensão do acesso ao Minecraft ou à "PSN" se o considerarmos apropriado, caso tenhas transgredido estes Termos ou no caso de recebermos uma queixa. Vamos também agir de forma expedita para remover ou desativar o acesso a Conteúdo Criado Pelos Utilizadores se, e quando, chegar ao nosso conhecimento de que é ilícito. + MODIFICAÇÕES + • Poderemos fazer modificações e atualizações de tempos a tempos, mas não é nossa obrigação. Também não somos obrigados a fornecer apoio ou manutenção contínuos a qualquer jogo. É óbvio que esperamos continuar a lançar novas atualizações para o Minecraft, mas não podemos garantir que o façamos. + A NOSSA RESPONSABILIDADE + • Quando recebes um exemplar do Minecraft, nós fornecemo-lo 'tal como é'. As atualizações e as modificações também são fornecidas 'tal como são'. Isto significa que não fazemos quaisquer promessas acerca do nível ou qualidade do Minecraft, ou que o Minecraft continue a ser fornecido de forma ininterrupta ou livre de erros, ou sobre qualquer perda ou danos que estes possam causar. Apenas prometemos fornecer o Minecraft e quaisquer serviços com um nível de habilidade e solicitude razoável. A lei na maior parte dos países diz que não podemos rejeitar responsabilidades por morte ou danos pessoais causados devido à nossa negligência, por isso se o teu computador se levantar e te der uma facada devido a algo de errado que tenhamos feito, então a culpa é nossa. + NÃO SOMOS RESPONSÁVEIS POR: + • QUALQUER UTILIZAÇÃO LÍCITA OU ILÍCITA DO MINECRAFT POR TUA PARTE OU POR PARTE DE QUALQUER OUTRA PESSOA; + • QUALQUER CONTEÚDO QUE DISPONIBILIZES ATRAVÉS DO MINECRAFT; + • QUALQUER TRANSGRESSÃO A ESTES TERMOS POR TUA PARTE; + • QUALQUER TRANSGRESSÃO A ESTES TERMOS POR PARTE DE QUALQUER OUTRA PESSOA. + CANCELAMENTO + • Se quisermos, podemos cancelar o teu direito de utilização do Minecraft em caso de transgressão destes Termos. Tu também podes cancelar a utilização do Minecraft a qualquer altura, basta desinstalá-lo do teu sistema PlayStation®Vita. De qualquer forma, os parágrafos acerca de "Propriedade do Minecraft", "A Nossa Responsabilidade" e "Aspetos Gerais" continuarão em vigor mesmo após o cancelamento. + ASPETOS GERAIS + • Estes Termos estão sujeitos a quaisquer direitos legais que possas ter e não irão limitar nenhum dos teus direitos, que não possam ser excluídos aos olhos da lei, nem excluir ou limitar a nossa responsabilidade em caso de morte ou danos pessoais resultantes da nossa negligência ou qualquer representação fraudulenta. + • Poderemos também modificar estes Termos periodicamente, mas essas modificações apenas serão aplicáveis dentro dos limites da lei. Por exemplo, se apenas usares o Minecraft no modo para jogador individual e não usares as atualizações que disponibilizamos, então aplica-se o antigo Acordo de Utilização, mas se utilizares as atualizações ou partes do Minecraft que dependam dos nossos serviços online contínuos, então o novo Acordo de Utilização será aplicado. Nesse caso, talvez não possamos (ou necessitamos) informar-te acerca das modificações para que estas entrem em efeito, por isso consulta esta página regularmente para estares ciente de quaisquer modificações a estes Termos. Não vamos ser injustos, mas por vezes a lei muda ou alguém faz alguma coisa que afeta os outros utilizadores do Minecraft e como tal temos de nos precaver. + • Se nos apresentares alguma sugestão para o Minecraft ou qualquer outro dos nossos jogos, essa sugestão será providenciada de forma gratuita. Isto significa que podemos usar a tua sugestão da forma que quisermos e não teremos de te pagar pela sua utilização. Se pensas ter uma sugestão que julgas digna de pagamento da nossa parte, tens de nos dizer que contas receber uma contrapartida antes de nos enviares a sugestão. + • Para além destes Termos, também poderás encontrar online algumas Linhas Orientadoras de Utilização de Marca e Bens. + • Se transgredires estas regras, nós (ou a Sony Computer Entertainment) poderemos impedir-te de utilizar o Minecraft. Se não queres ou não podes concordar com estas regras, não compres, transfiras, uses ou jogues o Minecraft. + Se tens dúvidas sobre algum ponto legal que não esteja exposto nesta página, envia-nos uma pergunta antes de fazeres alguma coisa que não deverias. Basicamente, não sejas ridículo e nós também não seremos. + Nós somos: + Mojang AB + Maria Skolgata 83, + SE-11853 + Estocolmo + Suécia + Número da organização: 556819-2388 + + + + Qualquer conteúdo comprado na loja do jogo será comprado à Sony Network Entertainment Europe Limited ("SNEE") e está sujeito aos Termos de Serviço e Acordo de Utilizador da Sony Entertainment Network, disponíveis na PlayStation®Store. Por favor, verifica estes direitos para cada compra, pois podem diferir de item para item. A não ser que seja divulgado algo em contrário, os conteúdos disponíveis em qualquer loja do jogo têm a mesma classificação etária do jogo. + + + A compra e utiilização de itens estão sujeitos a Termos de Serviço de Rede e Acordo de Utilizador. Este serviço online é sublicenciado para ti pela Sony Computer Entertainment America. + + + + Nota: A utilização deste software está sujeita aos Termos de utilização de software presentes em eu.playstation.com/legal. + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/pt-PT/stringsDynafont.xml b/Minecraft.Client/PSVitaMedia/loc/pt-PT/stringsDynafont.xml new file mode 100644 index 00000000..dca31ec2 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/pt-PT/stringsDynafont.xml @@ -0,0 +1,7 @@ + + + + DynaFont developed by DynaComware. + + + \ 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 new file mode 100644 index 00000000..19403637 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/pt-PT/stringsGeneric.xml @@ -0,0 +1,6857 @@ + + + + A mudar para jogo offline + + + Aguarda enquanto o anfitrião grava o jogo + + + Entrar em O FIM + + + A gravar jogadores + + + A ligar ao anfitrião + + + A transferir terreno + + + Sair de O FIM + + + 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. + + + 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 carregar nível + + + A Finalizar... + + + A Construir Terreno + + + A simular o mundo + + + Lugar + + + A Preparar para Gravar Nível + + + A Preparar Blocos... + + + A iniciar o servidor + + + A Sair do Submundo + + + A iniciar novamente + + + A gerar nível + + + A gerar área de regeneração + + + A carregar área de regeneração + + + A Entrar no Submundo + + + Ferramentas e Armas + + + Gama + + + Precisão do Jogo + + + Precisão da Interface + + + Dificuldade + + + Música + + + Som + + + Calmo + + + 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. + + + Fácil + + + Normal + + + Difícil + + + Sessão terminada + + + Armadura + + + Mecanismos + + + Transporte + + + Armas + + + Alimentos + + + Estruturas + + + Decorações + + + Preparação + + + Ferramentas, Armas e Armadura + + + Materiais + + + Blocos de Construção + + + Redstone e Transporte + + + Vários + + + Entradas: + + + 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! + + + 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 + + + Criar Mundo Novo + + + Introduz um nome para o teu mundo + + + Deposita a semente para a criação do teu mundo + + + Carregar Mundo Gravado + + + Jogar Tutorial + + + Tutorial + + + Nomeia o Teu Mundo + + + Gravação Danificada + + + 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*} +A Fornalha permite-te alterar os objetos através do fogo. Por exemplo, podes transformar minério de ferro em lingotes de ferro, na fornalha.{*B*}{*B*} +Coloca a fornalha no mundo e prime{*CONTROLLER_ACTION_USE*} para usá-la.{*B*}{*B*} +Tens de colocar o combustível na parte de baixo da fornalha e o objeto que queres alterar por cima. O fogo é ateado e a fornalha acende-se.{*B*}{*B*} +Depois de alterados os objetos, podes movê-los da área de saída para o inventário.{*B*}{*B*} +Se o objeto sobre o qual se encontra o ponteiro for um ingrediente ou combustível para a fornalha, surgirão dicas que te permitem mover o objeto para a fornalha com um movimento rápido. + + + {*T3*}INSTRUÇÕES DE JOGO: DISTRIBUIDOR{*ETW*}{*B*}{*B*} +O Distribuidor é utilizado para disparar objetos. Terás de colocar um interruptor, como por exemplo uma alavanca, junto ao distribuidor, para ativá-lo.{*B*}{*B*} +Para encheres o distribuidor com objetos prime{*CONTROLLER_ACTION_USE*}, depois move os objetos que queres distribuir do inventário para o distribuidor.{*B*}{*B*} +Quando usares o interruptor, o distribuidor irá disparar um objeto. + + + {*T3*}INSTRUÇÕES DE JOGO: PREPARAÇÃO DE POÇÕES{*ETW*}{*B*}{*B*} +Para prepares poções precisas de um Posto de Poções, que pode ser construído numa mesa de criação. Todas as poções começam com uma garrafa de água, que é criada enchendo uma Garrafa de Vidro com água de um Caldeirão ou de uma fonte de água.{*B*} +O Posto de Poções tem três espaços para garrafas, por isso, podes preparar três poções ao mesmo tempo. Um ingrediente pode ser usado nas três garrafas, por isso, prepara sempre três poções em simultâneo, para aproveitares melhor os teus recursos.{*B*} +Se colocares um ingrediente na posição superior do Posto de Poções, passado pouco tempo terás criado uma poção base. Isto, por si só, não tem qualquer efeito, mas se colocares outro ingrediente nesta poção de base, irás obter uma poção com um efeito.{*B*} +Depois de teres esta poção, podes adicionar um terceiro ingrediente para que o efeito dure mais tempo (com Pó de Redstone), seja mais intenso (com Pó de Glowstone) ou se transforme numa poção negativa (com um Olho de Aranha Fermentado).{*B*} +Também podes adicionar pólvora a qualquer poção para a transformares numa Poção Explosiva, que pode ser atirada. Ao atirares uma Poção Explosiva, o seu efeito será aplicado em toda a área onde aterrar.{*B*} + +Os ingredientes para as poções são:{*B*}{*B*} +* {*T2*}Verruga do Submundo{*ETW*}{*B*} +* {*T2*}Olho de Aranha{*ETW*}{*B*} +* {*T2*}Açúcar{*ETW*}{*B*} +* {*T2*}Lágrima de Ghast{*ETW*}{*B*} +* {*T2*}Pó de Blaze{*ETW*}{*B*} +* {*T2*}Creme de Magma{*ETW*}{*B*} +* {*T2*}Melão Brilhante{*ETW*}{*B*} +* {*T2*}Pó de Redstone{*ETW*}{*B*} +* {*T2*}Pó de Glowstone{*ETW*}{*B*} +* {*T2*}Olho de Aranha Fermentado{*ETW*}{*B*}{*B*} + +Experimenta várias combinações de ingredientes para descobrires as diferentes poções que podes preparar. + + + {*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*} +Os Pontos de Experiência recolhidos quando um habitante morre, ou quando certos blocos são extraídos ou fundidos numa fornalha, podem ser usados para enfeitiçar algumas ferramentas, armas, armaduras e livros.{*B*} +Quando é colocada uma Espada, Arco, Machado, Picareta, Pá, Armadura ou Livro no espaço por baixo do livro na Mesa de Feitiços, os três botões à direita do espaço apresentam alguns feitiços e os respetivos custos em Níveis de Experiência.{*B*} +Se não tiveres Níveis de Experiência suficientes para usar alguns destes, o custo surgirá a vermelho, caso contrário, surgirá a verde.{*B*}{*B*} +O feitiço aplicado é selecionado aleatoriamente com base no custo apresentado.{*B*}{*B*} +Se a Mesa de Feitiços estiver rodeada de Estantes (até um máximo de 15 Estantes), com um bloco de intervalo entre a Estante e a Mesa de Feitiços, o poder dos feitiços irá aumentar e irás ver glifos misteriosos a sair do livro na Mesa de Feitiços.{*B*}{*B*} +Todos os ingredientes para uma Mesa de Feitiços podem ser encontrados nas aldeias, ser extraídos nas minas ou cultivados no mundo. {*B*}{*B*} +Os Livros Enfeitiçados são usados na Bigorna para aplicar feitiços aos objetos. Assim tens mais controlo sobre os feitiços que pretendes aplicar aos teus objetos.{*B*} + + + {*T3*}INSTRUÇÕES DE JOGO: EXCLUIR NÍVEIS{*ETW*}{*B*}{*B*} +Se encontrares conteúdo ofensivo num nível, podes adicioná-lo à lista de Níveis Excluídos. +Para tal, abre o menu Pausa e prime {*CONTROLLER_VK_RB*} para selecionar a dica de Excluir Nível. +Se tentares juntar-te a este nível no futuro, serás notificado de que este nível se encontra na tua lista de Níveis Excluídos e ser-te-á dada a opção de removê-lo da lista e prosseguir para o nível, ou retroceder. + + + {*T3*}INSTRUÇÕES DE JOGO: OPÇÕES DE ANFITRIÃO E JOGADOR{*ETW*}{*B*}{*B*} + +{*T1*}Opções de jogo{*ETW*}{*B*} +Ao carregar ou criar um mundo, prime o botão "Mais Opções" para abrir um menu que te dá mais controlo sobre o teu jogo.{*B*}{*B*} + +{*T2*}Jogador vs. Jogador{*ETW*}{*B*} +Quando ativada, os jogadores podem causar danos aos outros jogadores. Esta opção afeta apenas o modo Sobrevivência.{*B*}{*B*} + +{*T2*}Confiar Jogadores{*ETW*}{*B*} +Quando desativada, os jogadores que se juntaram ao jogo ficam limitados na sua ação. Não podem obter ou usar objetos, colocar blocos, usar portas e interruptores, usar contentores, nem atacar jogadores ou animais. Podes alterar estas opções para um determinado jogador, utilizando o menu do jogo.{*B*}{*B*} + +{*T2*}Propagação de Fogo{*ETW*}{*B*} +Quando ativada, o fogo pode propagar-se para os blocos inflamáveis mais próximos. Esta opção pode ser alterada dentro do jogo.{*B*}{*B*} + +{*T2*}Explosões de TNT{*ETW*}{*B*} +Quando ativada, o TNT explode quando é detonado. Esta opção pode ser alterada dentro do jogo.{*B*}{*B*} + +{*T2*}Privilégios de Anfitrião{*ETW*}{*B*} +Quando ativada, o anfitrião pode ativar a sua capacidade de voar, desativar a exaustão e tornar-se invisível a partir do menu do jogo. {*DISABLES_ACHIEVEMENTS*}{*B*}{*B*}{*B*} + +{*T2*}Ciclo de Luz do Dia{*ETW*}{*B*} +Quando desativada, a hora do dia não muda.{*B*}{*B*} + +{*T2*} Manter Inventário{*ETW*}{*B*} +Quando ativada, os jogadores mantêm o seu inventário, depois de morrerem.{*B*}{*B*} + +{*T2*} Regeneração de Habitantes{*ETW*}{*B*} +Quando desativada, os habitantes deixam de ser regenerados naturalmente.{*B*}{*B*} + +{*T2*} Habitantes Contidos{*ETW*}{*B*} +Quando ativada, evita que os monstros e animais alterem blocos (por exemplo, as explosões de Creepers não destroem blocos e as Ovelhas não retiram Erva) ou apanhem itens.{*B*}{*B*} + +{*T2*} Saque de Habitantes{*ETW*}{*B*} +Quando desativada, os monstros e animais não largam o saque (por exemplo, os Creepers não largam pólvora).{*B*}{*B*} + +{*T2*} Espólio de Blocos{*ETW*}{*B*} +Quando desativada, os blocos não largam objetos quando são destruídos (por exemplo, os blocos de Pedra não largam Pedra Arredondada).{*B*}{*B*} + +{*T2*}Regeneração Natural{*ETW*}{*B*} +Quando desativada, os jogadores não regeneram saúde naturalmente.{*B*}{*B*} + +{*T1*}Opções de Criação de Mundos{*ETW*}{*B*} +Ao criar um novo mundo, existem opções adicionais.{*B*}{*B*} + +{*T2*}Criar Estruturas{*ETW*}{*B*} +Quando ativada, são geradas Aldeias e Fortalezas no mundo.{*B*}{*B*} + +{*T2*}Mundo Superplano{*ETW*}{*B*} +Quando ativada, é gerado um mundo completamente plano no Mundo Superior e no Submundo.{*B*}{*B*} + +{*T2*}Baú de Bónus{*ETW*}{*B*} +Quando ativada, é criado um baú com objetos úteis junto ao ponto de regeneração do jogador.{*B*}{*B*} + +{*T2*}Repor Submundo{*ETW*}{*B*} +Quando esta opção é ativada, o Submundo será regenerado. Esta opção é útil, quando tens uma gravação antiga onde não estava presente uma Fortaleza do Submundo.{*B*}{*B*} + +{*T1*}Opções de Jogo{*ETW*}{*B*} +Durante o jogo, é possível aceder a várias opções pressionando {*BACK_BUTTON*} para abrir o menu de jogo.{*B*}{*B*} + +{*T2*}Opções de Anfitrião{*ETW*}{*B*} +O anfitrião, e os jogadores definidos como moderadores, podem aceder ao menu "Opções de Anfitrião". Neste menu, podem ativar e desativar a propagação de fogos e as explosões de TNT.{*B*}{*B*}{*B*} + +{*T1*}Opções de Jogador{*ETW*}{*B*} +Para modificar os privilégios de um jogador, seleciona o seu nome e prime{*CONTROLLER_VK_A*} para abrir o menu dos privilégios do jogador, onde podes usar as seguintes opções:{*B*}{*B*} + +{*T2*}Pode Construir e Escavar{*ETW*}{*B*} +Esta opção só está disponível quando "Confiar nos Jogadores" está desativada. Quando esta opção está ativada, o jogador pode interagir normalmente com o mundo. Quando está desativada, o jogador não poderá colocar ou destruir blocos nem interagir com muitos objetos e blocos.{*B*}{*B*} + +{*T2*}Pode Usar Portas e Interruptores{*ETW*}{*B*} +Esta opção só está disponível quando "Confiar nos Jogadores" está desativada. Quando esta opção está desativada, o jogador não poderá usar portas nem interruptores.{*B*}{*B*} + +{*T2*}Pode Abrir Contentores{*ETW*}{*B*} +Esta opção só está disponível quando "Confiar nos Jogadores" está desativada. Quando esta opção está desativada, o jogador não poderá abrir contentores nem baús.{*B*}{*B*} + +{*T2*}Pode Atacar Jogadores{*ETW*}{*B*} +Esta opção só está disponível quando "Confiar nos Jogadores" está desativada. Quando esta opção está desativada, o jogador não pode causar danos aos outros jogadores.{*B*}{*B*} + +{*T2*}Pode Atacar Animais{*ETW*}{*B*} +Esta opção só está disponível quando "Confiar nos Jogadores" está desativada. Quando esta opção está desativada, o jogador não poderá causar danos a animais.{*B*}{*B*} + +{*T2*}Moderador{*ETW*}{*B*} +Quando esta opção está ativada, o jogador pode alterar os privilégios dos outros jogadores (exceto o anfitrião) se "Confiar nos Jogadores" estiver desativada, expulsar jogadores e ativar ou desativar a propagação de fogo e as explosões de TNT.{*B*}{*B*} + +{*T2*}Expulsar Jogador{*ETW*}{*B*} +{*KICK_PLAYER_DESCRIPTION*}{*B*}{*B*} + +{*T1*}Opções de Jogador Anfitrião{*ETW*}{*B*} +Se "Privilégios de Anfitrião" estiver ativada, o jogador anfitrião pode modificar alguns dos seus privilégios. Para modificar os privilégios de um jogador, seleciona o nome e prime{*CONTROLLER_VK_A*} para abrir o menu de privilégios do jogador, onde podes usar as seguintes opções.{*B*}{*B*} + +{*T2*}Pode Voar{*ETW*}{*B*} +Quando esta opção está ativada, o jogador pode voar. Esta opção só é relevante no modo Sobrevivência, uma vez que todos os jogadores podem voar no modo Criativo.{*B*}{*B*} + +{*T2*}Desativar Exaustão{*ETW*}{*B*} +Esta opção afeta apenas o modo Sobrevivência. Quando ativada, as atividades físicas (caminhar/correr/saltar, etc.) não diminuem a barra de comida. No entanto, se o jogador for ferido, a barra de comida irá diminuir lentamente enquanto o jogador estiver a recuperar.{*B*}{*B*} + +{*T2*}Invisível{*ETW*}{*B*} +Quando esta opção está ativada, o jogador não pode ser visto pelos outros jogadores e é invulnerável.{*B*}{*B*} + +{*T2*}Pode Teletransportar{*ETW*}{*B*} +Esta opção permite ao jogador mover jogadores, ou mover-se a si próprio, para perto de outros jogadores, num mundo. + + + 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 + + + Trocas + + + Bigorna + + + 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 o tenha.{*B*} +Assim que o portal estiver ativo, salta para ele e entra em O Fim.{*B*}{*B*} +Em O Fim, irás encontrar o Ender Dragon, um feroz e poderoso inimigo, bem como muitos Enderman, pelo que tens de estar bem preparado para combater, antes de lá entrares!{*B*}{*B*} +Descobrirás que existem Cristais Ender em cima de oito picos Obsidianos que o Ender Dragon usa para se curar, por isso, o primeiro passo na batalha é destruir cada um deles.{*B*} +Os primeiros podem ser alcançados com flechas, mas os últimos estão protegidos por uma jaula com Vedação de Ferro e precisarás de construir para os alcançares.{*B*}{*B*} +Enquanto o fizeres, o Ender Dragon irá atacar-te voando na tua direção e cuspindo bolas de ácido Ender!{*B*} +Se te aproximares do Pódio de Ovos, no centro dos picos, o Ender Dragon vai fazer um voo picado e atacar-te, e é nesse momento que o poderás ferir com gravidade!{*B*} +Evita o bafo ácido e aponta para os olhos do Ender Dragon, para obteres os melhores resultados. Se possível, leva alguns amigos contigo para O Fim, para te ajudarem na batalha!{*B*}{*B*} +Assim que estiveres em O Fim, os teus amigos poderão ver nos seus mapas a localização do Portal do Fim na Fortaleza, para se poderem juntar a ti com facilidade. + + + {*ETB*}Bem-vindo de volta! Podes não ter reparado, mas o teu Minecraft acabou de ser atualizado.{*B*}{*B*} +Há muitas novas funcionalidades para jogares com os teus amigos. Aqui ficam apenas alguns destaques. Lê e depois vai divertir-te!{*B*}{*B*} +{*T1*}Novos Itens{*ETB*} - Barro Endurecido, Barro Pintado, Bloco de Carvão, Fardo de Palha, Carril Ativador, Bloco de Redstone, Sensor de Luz do Dia, Largador, Funil, Vagoneta com Funil, Vagoneta com TNT, Comparador de Redstone, Placa de Pressão de Pesagem, Sinalizador, Baú Armadilhado, Foguete de Fogo de Artifício, Estrela de Fogo de Artifício, Estrela do Submundo, Trela, Armadura de Cavalo, Etiqueta com Nome, Ovo de Geração de Cavalo.{*B*}{*B*} + {*T1*}Novos Habitantes{*ETB*} – Wither, Esqueletos Atrofiados, Bruxas, Morcegos, Cavalos, Burros e Mulas.{*B*}{*B*} +{*T1*}Novas Funcionalidades{*ETB*} – Doma e monta um cavalo, cria fogos de artifício e monta um espetáculo, atribui nomes aos animais e monstros com uma Etiqueta com Nome, cria circuitos de Redstone mais avançados e novas Opções de Anfitrião para ajudar a controlar o que podem fazer os convidados no teu mundo!{*B*}{*B*} +{*T1*}Novo Mundo Tutorial{*ETB*} – Aprende a usar as funcionalidades novas e antigas no Mundo Tutorial. Vê se consegues encontrar todos os Discos de Música secretos dentro do mundo!{*B*}{*B*} + + + + Provoca mais danos do que com a mão. + + + 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 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. + + + 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 em circuitos de Redstone como repetidor, retardador e/ou díodo. + + + 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. + + + 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. + + + Restitui 2,5{*ICON_SHANK_01*}. Cria-se cozinhando peixe cru numa fornalha. + + + Restitui 1{*ICON_SHANK_01*}. + + + Restitui 1{*ICON_SHANK_01*}. + + + Restitui 3{*ICON_SHANK_01*}. + + + Utilizadas como munições para os arcos. + + + Restitui 2,5{*ICON_SHANK_01*}. + + + Restitui 1{*ICON_SHANK_01*}. Podes usar até 6 vezes. + + + 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. + + + Dá ao utilizador 3 de Armadura quando em uso. + + + 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. + + + Um lingote brilhante que pode ser usado para criar ferramentas feitas com este material. É criado ao derreteres minério numa fornalha. + + + Permite transformar lingotes, pedras preciosas e tintas em blocos colocáveis. Pode ser usado como bloco de construção caro ou arrumação compacta de minério. + + + Utilizada para enviar uma descarga elétrica quando é pisada por um jogador, um animal ou um monstro. As Placas de Pressão de Madeira 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. + + + Utilizada para guardar guisado de cogumelos. Ficas com a tigela, depois de comeres o guisado. + + + Utilizado para guardar e transportar água, lava e leite. + + + Utilizado para guardar e transportar água. + + + 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. + + + Mostra as posições do Sol e da Lua. + + + Aponta para o ponto inicial. + + + Quando seguras no mapa, poderás ver a imagem de uma área explorada. Pode ser utilizado para descobrir caminhos. + + + Utilizado para guardar e transportar leite. + + + Utilizado para criar fogo, detonar TNT e abrir um portal, depois da sua construção. + + + Utilizada para apanhar peixe. + + + 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. + + + 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 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 para criar tochas, setas, sinais, escadotes e cercas e também como pegas para ferramentas e armas. + + + 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. + + + 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. + + + Machado de Ferro + + + Candeeiro de Redstone + + + Escadas da Selva + + + Escadas de Bétula + + + Controlos Atuais + + + Caveira + + + Cacau + + + Escadas de Abeto + + + Ovo de Dragão + + + Pedra do Fim + + + Estrutura de Portal do Fim + + + Escadas de Grés + + + Feto + + + Arbusto + + + Esquema + + + Criar + + + Usar + + + Ação + + + Rastejar/Voar Para Baixo + + + Rastejar + + + Largar + + + Mudar o Objeto Agarrado + + + Pausa + + + Olhar + + + Mover/Sprint + + + Inventário + + + Saltar/Voar Para Cima + + + Saltar + + + Portal do Fim + + + Caule de Abóbora + + + Melão + + + Painel de Vidro + + + Portão de Vedação + + + Trepadeiras + + + Caule de Melão + + + Barras de Ferro + + + Tijolos de Pedra Rachada + + + Tijolos de Pedra com Musgo + + + 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 + + + Abeto + + + Bétula + + + Madeira de Abeto + + + Madeira de Bétula + + + Madeira da Selva + + + + + + Lã Cor-de-rosa + + + Lã Cinzenta + + + Lã Cinzenta Clara + + + Lã Azul Clara + + + Lã Amarela + + + Lã Verde-lima + + + Lã Ciano + + + Lã Verde + + + Lã Vermelha + + + Lã Preta + + + Lã Roxa + + + Lã Azul + + + Lã Castanha + + + Tocha (Carvão) + + + Glowstone + + + Areia Movediça + + + 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. + + + Alçapão + + + Baú Fechado + + + Díodo + + + Pistão Pegajoso + + + Pistão + + + Lã (qualquer cor) + + + Arbusto Morto + + + Bolo + + + Bloco de Notas + + + Distribuidor + + + Erva Alta + + + Teia + + + Cama + + + Gelo + + + Mesa de Criação + + + Uma forma compacta de armazenar Diamantes. + + + Bloco de Diamante + + + Fornalha + + + Terreno de Cultivo + + + Plantações + + + Minério de Diamante + + + Gerador de Monstros + + + Fogo + + + Tocha (Carvão Vegetal) + + + Pó de Redstone + + + Baú + + + Escadas de Carvalho + + + Sinal + + + Minério de Redstone + + + Porta de Ferro + + + Placa de Pressão + + + Neve + + + Botão + + + Tocha Redstone + + + Alavanca + + + Carril + + + Escadote + + + Porta de Madeira + + + Escadas de Pedra + + + Carril Detetor + + + Carril Eletrificado + + + Recolheste pedras arredondadas suficientes para construir uma fornalha. Utiliza a tua mesa de criação para criares uma. + + + Cana de Pesca + + + Relógio + + + Pó de Glowstone + + + Vagoneta com Fornalha + + + Ovo + + + 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. + + + + 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. + + + + 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. + + + + + Move o objeto com o ponteiro sobre outro espaço no inventário e coloca-o nesse espaço utilizando{*CONTROLLER_VK_A*}. + Caso tenhas selecionado vários objetos com o ponteiro, usa{*CONTROLLER_VK_A*} para os colocares todos ou{*CONTROLLER_VK_X*} para colocares apenas um. + + + + + 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. + + + + + Concluíste a primeira parte do tutorial. + + + + Usa a fornalha para criar vidro. Enquanto esperas que acabe, porque não recolhes mais materiais para acabar o abrigo? + + + Usa a fornalha para criar carvão vegetal. Enquanto esperas que acabe, porque não recolhes mais materiais para acabar o abrigo? + + + Usa{*CONTROLLER_ACTION_USE*} para colocares a fornalha no mundo e, em seguida, abre-a. + + + À 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*} + + + 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*}. + + + + + Este é o interface de criação. Permite-te combinar os objetos que recolheste para criares novos objetos. + + + + + Prime{*CONTROLLER_VK_B*} agora para saíres do inventário do modo criativo. + + + + 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 a descrição do objeto. + + + {*B*} + Prime{*CONTROLLER_VK_A*} para continuar.{*B*} + Prime{*CONTROLLER_VK_B*} se já sabes criar. + + + + 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. + + + + {*B*} + Prime{*CONTROLLER_VK_A*} para continuar.{*B*} + Prime{*CONTROLLER_VK_B*} se já sabes utilizar o inventário do modo criativo. + + + 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. + + + Prime{*CONTROLLER_VK_B*} agora para saíres do inventário. + + + + 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*}. + + + + + 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{*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. + + + + Água + + + Garrafa de Vidro + + + Garrafa de Água + + + Olho de Aranha + + + Pepita de Ouro + + + Verruga do Submundo + + + Poção{*splash*}{*prefix*}{*postfix*} + + + Olho Aranha Ferm. + + + Caldeirão + + + Olho de Ender + + + Melão Brilhante + + + Pó de Blaze + + + Creme de Magma + + + Posto de Poções + + + Lágrima de Ghast + + + Sementes de Abóbora + + + Sementes de Melão + + + Galinha Crua + + + Disco de Música - "11" + + + Disco de Música - "where are we now" + + + Tesoura + + + Galinha Cozinhada + + + Pérola de Ender + + + Fatia de Melão + + + Varinha de Blaze + + + Bife Cru + + + Bife + + + Carne Podre + + + Garrafa Mágica + + + Tábuas de Carvalho + + + Tábuas de Abeto + + + Tábuas de Bétula + + + Bloco de Erva + + + Terra + + + Pedra Arredondada + + + Tábuas da Selva + + + Bétula Jovem + + + Rebentos de Árvores da Selva + + + Rocha + + + Rebento + + + Carvalho Jovem + + + Abeto Jovem + + + Pedra + + + Moldura de Item + + + Gerar {*CREATURE*} + + + Tijolo de Submundo + + + Carga de Fogo + + + Carga Fogo Carv. Veg. + + + Carga Fogo (Carvão) + + + Caveira + + + Cabeça + + + Cabeça de %s + + + Cabeça de Creeper + + + Caveira de Esqueleto + + + Caveira de Esqueleto Atrofiado + + + Cabeça de Morto-vivo + + + Uma forma compacta de armazenar Carvão. Pode ser usado como combustível numa Fornalha. + + + Veneno + + + Fome + + + de Lentidão + + + de Velocidade + + + Invisibilidade + + + Inalação de Água + + + Visão Noturna + + + Cegueira + + + de Danos + + + de Saúde + + + de Náusea + + + de Regeneração + + + de Sonolência + + + de Rapidez + + + de Fraqueza + + + de Força + + + Resistência ao Fogo + + + Saturação + + + de Resistência + + + de Salto + + + Wither + + + Impulso de Saúde + + + Absorção + + + + + + II + + + 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 + + + Mundano + + + Desinteressante + + + Enérgica + + + Cordial + + + Charmosa + + + Elegante + + + Pomposa + + + Brilhante + + + 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 + + + Golpear + + + Precisão + + + Reduz a saúde dos jogadores, animais e monstros afetados, ao longo do tempo. + + + Danos de Ataque + + + Coice + + + Veneno de Artrópodes + + + Velocidade + + + Reforços de Mortos-vivos + + + Força de Salto do Cavalo + + + Quando Aplicável: + + + Resistência de Coice + + + Alcance de Habitante Seguidor + + + Máximo de Saúde + + + Toque de Seda + + + Eficiência + + + Afinidade Aquática + + + Sorte + + + Saque + + + Inquebrável + + + Proteção contra Fogo + + + Proteção + + + Aspeto do Fogo + + + Queda de Penas + + + Respiração + + + Proteção contra Projéteis + + + Proteção contra Explosões + + + IV + + + V + + + VI + + + Soco + + + VII + + + III + + + Chama + + + Poder + + + Infinidade + + + II + + + I + + + É ativado quando uma entidade passa através de uma Armadilha com Fio ligada. + + + Ativa um Gancho para Armadilha de Fio quando uma entidade passa através dele. + + + Uma forma compacta de armazenar Esmeraldas. + + + Semelhante a um Baú, mas com uma diferença: os objetos colocados num Baú de Ender estão disponíveis em todos os Baús de Ender do jogador, mesmo em dimensões diferentes. + + + IX + + + VIII + + + Pode ser escavado com uma picareta de ferro ou melhor para recolher Esmeraldas. + + + 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. + + + 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*}. Se comeres isto podes ficar envenenado. + + + Usada para controlar um porco com sela, quando o montas. + + + Restitui 3{*ICON_SHANK_01*}. Cria-se cozinhando uma batata numa fornalha. + + + Restitui 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. + + + 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. + + + Esmeralda + + + Vaso de Flores + + + Tarte de Abóbora + + + Livro Enfeitiçado + + + Batata Venenosa + + + Cenoura Dourada + + + Cenoura num Pau + + + Gancho (Armadilha de Fio) + + + Armadilha de Fio + + + Quartzo do Submundo + + + Minério de Esmeralda + + + Baú de Ender + + + Parede de Pedra com Musgo + + + Bloco de Esmeralda + + + Parede de Pedra + + + Batatas + + + Vaso de Flores + + + Cenouras + + + Bigorna Ligeiramente Danificada + + + Bigorna + + + Bigorna + + + Bloco de Quartzo + + + Bigorna Muito Danificada + + + Minério de Quartzo do Submundo + + + Escadas de Quartzo + + + Bloco de Quartzo Burilado + + + Pilar de Bloco de Quartzo + + + Tapete Vermelho + + + Tapete + + + Tapete Preto + + + Tapete Azul + + + Tapete Verde + + + Tapete Castanho + + + Tapete Roxo + + + Tapete Ciano + + + Tapete Cinzento Claro + + + Tapete Cinzento + + + Tapete Verde-Lima + + + Tapete Cor-de-Rosa + + + Tapete Azul Claro + + + Tapete Amarelo + + + Tapete Magenta + + + Tapete Cor-de-Laranja + + + Tapete Branco + + + Arenito Burilado + + + {*PLAYER*} morreu ao tentar magoar {*SOURCE*} + + + Arenito Macio + + + {*PLAYER*} foi esmagado por uma Bigorna em queda. + + + {*PLAYER*} foi esmagado por um bloco em queda. + + + {*PLAYER*} teletransportou-te para a sua posição + + + Efetuado teletransporte de {*PLAYER*} para {*DESTINATION*} + + + Espinhos + + + {*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 + + + Demasiado Caro! + + + Custo de Feitiço: %d + + + Tens: + + + Renomear + + + {*VILLAGER_TYPE*} oferece %s + + + Necessitas para a troca: + + + Trocar + + + 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. + + + + + {*B*} + Prime{*CONTROLLER_VK_A*} para aprenderes mais sobre o interface da Bigorna.{*B*} + Prime{*CONTROLLER_VK_B*} se já souberes tudo sobre o interface da Bigorna. + + + + + Em alternativa, podes colocar um segundo objeto idêntico no segundo espaço para combinar os dois objetos. + + + + + 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. + + + + + 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. + + + + + 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. + + + + + É possível renomeares um objeto ao editares o nome que é mostrado na caixa de texto. + + + + + {*B*} + Prime{*CONTROLLER_VK_A*} para aprenderes mais sobre a Bigorna.{*B*} + Prime{*CONTROLLER_VK_B*} se já souberes tudo sobre a Bigorna. + + + + + Nesta área existe uma Bigorna e um Baú, que contêm ferramentas e armas que podem ser trabalhadas. + + + + + 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. + + + + + Utilizando uma Bigorna, podes reparar armas e ferramentas para restaurar a sua durabilidade, alterar o nome ou enfeitiçá-las com Livros Enfeitiçados. + + + + + 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. + + + + + Usar a Bigorna tem um custo de Níveis de Experiência e a cada utilização existe a possibilidade de danificar a Bigorna. + + + + + 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. + + + + + Renomear um objeto altera o nome exibido a todos os jogadores e reduz permanentemente o custo de trabalho prévio. + + + + + {*B*} + Prime{*CONTROLLER_VK_A*} para aprenderes mais sobre o interface de trocas.{*B*} + Prime{*CONTROLLER_VK_B*} se já souberes tudo sobre o interface de trocas. + + + + + Este é o interface de trocas, que exibe as trocas que podem ser feitas com um aldeão. + + + + + As trocas vão surgir a vermelho e não ficarão disponíveis, se não tiveres os objetos necessários. + + + + + Todas as trocas que o aldeão está disposto a fazer, neste momento, são exibidas ao longo do topo. + + + + + Podes ver o número total de objetos necessários à troca nas duas caixas à esquerda. + + + + + 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. + + + + + {*B*} + Prime{*CONTROLLER_VK_A*} para aprenderes mais sobre trocas.{*B*} + Prime{*CONTROLLER_VK_B*} se já souberes tudo sobre trocas. + + + + + Ao executares trocas variadas, as trocas disponíveis do aldeão vão alterar-se aleatoriamente ou serão atualizadas. + + + + + As trocas que um aldeão tem tendência a oferecer dependem da sua profissão. + + + + + As trocas que foram usadas frequentemente podem ser removidas temporariamente, mas o aldeão terá sempre, pelo menos, uma troca para oferecer. + + + + + Tira algum Papel do Baú e tenta trocá-lo com este aldeão. + + + + + Nesta área, existem dois Baús de Ender. + + + + + {*B*} + Prime{*CONTROLLER_VK_A*} para aprenderes mais sobre Baús de Ender.{*B*} + Prime{*CONTROLLER_VK_B*} se já souberes tudo sobre Baús de Ender. + + + + + Todos os Baús de Ender de um mundo estão ligados, mesmo através de dimensões. Os objetos colocados num Baú de Ender estão acessíveis em qualquer outro Baú de Ender. + + + + + No entanto, os conteúdos dos Baús de Ender são diferentes para cada jogador. + + + + + Isto permite aos jogadores armazenar objetos em qualquer Baú de Ender e recuperá-los noutros Baús de Ender em diferentes posições do mundo. Podes fazer isto agora, ao colocares objetos em qualquer um dos Baús de Ender. + + + + Restitui 2{*ICON_SHANK_01*}, regenera saúde por 30 segundos e concede resistência ao fogo e aos danos durante 5 minutos. Feito de uma maçã e pepitas de ouro. + + + Pode Teletransportar + + + Teletransportar + + + Teletransportar para Jogador + + + Teletransportar para Mim + + + Pode Desativar Exaustão + + + Pode Ficar Invisível + + + Agora podes ativar a invisibilidade + + + Já não podes ativar a invisibilidade + + + Agora podes ativar o voo + + + Já não podes ativar o voo + + + Agora podes desativar a exaustão + + + Já não podes desativar a exaustão + + + Agora podes teletransportar + + + Já não podes teletransportar + + + {*T3*}INSTRUÇÕES DE JOGO: BIGORNA{*ETW*}{*B*}{*B*} +Os Níveis de Experiência, juntamente com a Bigorna, podem ser usados para reparar, enfeitiçar ou renomear objetos.{*B*} +Todos os objetos podem ser renomeados, apesar de apenas os objetos com durabilidade poderem ser reparados ou serem afetados por feitiços de Livros Enfeitiçados.{*B*} +Um objeto pode ser reparado ao ser colocado num dos espaços de entrada à esquerda, juntamente com algumas matérias-primas do objeto, como Lingotes de Ferro para uma Espada de Ferro, ou combinado com outro objeto do mesmo tipo.{*B*} +Combinar objetos é mais eficiente quando é feito com uma Bigorna e, além disso, se algum dos objetos estava enfeitiçado, o produto final pode conter feitiços de qualquer uma das entradas.{*B*} +Os Livros Enfeitiçados podem aplicar feitiços a objetos, ao combiná-los numa Bigorna, se o feitiço do Livro for adequado. Os Livros Enfeitiçados podem ser encontrados em Baús nas masmorras, ou enfeitiçados a partir de Livros normais na Mesa de Feitiços.{*B*} +Há a possibilidade de a Bigorna ser danificada em cada utilização e, depois de muito desgaste, será destruída.{*B*} + + + {*T3*}INSTRUÇÕES DE JOGO: TROCAS{*ETW*}{*B*}{*B*} +É possível fazer trocas de objetos com os aldeões. Cada aldeão tem uma profissão; podem ser Agricultores, Talhantes, Ferreiros, Bibliotecários ou Padres e a profissão afeta o tipo de objetos que eles podem trocar.{*B*} +Podes encontrar uma lista de todas as trocas que um aldeão está a oferecer no menu de trocas. Um aldeão pode modificar ou adicionar objetos às suas trocas sempre que um jogador faz trocas com ele, apesar de uma troca poder ficar temporariamente desativada, se for usada com muita frequência.{*B*} +As trocas costumam envolver entregar ou receber vários objetos por esmeraldas.{*B*} +Se não tens os objetos necessários para uma troca, os objetos são mostrados a vermelho.{*B*} + + + + {*T3*}INSTRUÇÕES DE JOGO: BAÚ DE ENDER {*ETW*}{*B*}{*B*} +Todos os Baús de Ender num mundo estão ligados. Os objetos colocados num Baú de Ender podem ser acedidos por qualquer um dos outros baús. No entanto, os conteúdos dos Baús de Ender são diferentes para cada jogador. Isto permite aos jogadores armazenar objetos em qualquer Baú de Ender e recuperá-los noutros Baús de Ender em diferentes posições do mundo. + + + + Agricultor + + + Bibliotecário + + + Padre + + + Ferreiro + + + Talhante + + + Encontrados em aldeias, os aldeãos vão oferecer ao jogador objetos para trocar, consoante a sua profissão. + + + Baú Grande + + + + Também podes criar Livros Enfeitiçados na Mesa de Feitiços, que depois podem ser usados na Bigorna para aplicar o seu feitiço a um objeto. + + + + + Os Ganchos para Armadilha de Fio também fornecem energia constante a um circuito, enquanto alguma coisa estiver a ativar o fio entre eles. + + + + + Uma vez domesticado, um lobo irá ter sempre a sua coleira. A cor da coleira pode ser alterada com tinta. + + + + As Cenouras e as Batatas são cultivadas ao plantares Cenouras e Batatas, e estão prontas a serem colhidas quando o vegetal é visível acima do chão. + + + + Além disso, os porcos podem ser selados e depois montados pelos jogadores. São controlados ao serem aliciados com uma Cenoura num Pau. + + + + + Se necessário, podes mover a tua vagoneta lentamente utilizando {*CONTROLLER_ACTION_MOVE*}. Isto ajuda a vagoneta a arrancar, ao levares a vagoneta para um carril eletrificado. + + + + Não podes juntar-te a este jogo, porque o ecrã dividido só é suportado em modo de alta Definição. Retira todos os outros jogadores, se quiseres juntar-te. + + + Curar + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/pt-PT/stringsLeaderboards.xml b/Minecraft.Client/PSVitaMedia/loc/pt-PT/stringsLeaderboards.xml new file mode 100644 index 00000000..1a1f0972 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/pt-PT/stringsLeaderboards.xml @@ -0,0 +1,48 @@ + + + + Mortes (Fácil) + + + Mortes (Normal) + + + Mortes (Difícil) + + + Blocos Escavados (Calmo) + + + Blocos Escavados (Fácil) + + + Blocos Escavados (Normal) + + + Blocos Escavados (Difícil) + + + Quintas (Calmo) + + + Quintas (Fácil) + + + Quintas (Normal) + + + Quintas (Difícil) + + + Distância (Calmo) + + + Distância (Fácil) + + + Distância (Normal) + + + Distância (Difícil) + + \ 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 new file mode 100644 index 00000000..8b5532c3 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/pt-PT/stringsPlatformSpecific.xml @@ -0,0 +1,244 @@ + + + + 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 + + + NOT USED + + + {*T3*}INSTRUÇÕES DE JOGO: MODO CRIATIVO{*ETW*}{*B*}{*B*} +A interface do modo criativo permite que qualquer objeto no jogo seja movido para o inventário do jogador sem ser necessário escavar ou criar o objeto. +Os objetos no inventário do jogador não serão removidos quando são colocados ou utilizados no mundo, o que permite ao jogador concentrar-se na construção em vez da recolha de recursos.{*B*} +Se criares, carregares ou gravares um mundo no Modo Criativo, as atualizações de troféus e tabelas de liderança serão desativadas nesse mundo, mesmo que seja carregado depois no Modo Sobrevivência.{*B*}{*B*} +Para voar no Modo Criativo, prime rapidamente {*CONTROLLER_ACTION_JUMP*} duas vezes. Para parar de voar, repete a ação. Para voares mais rápido, prime rapidamente {*CONTROLLER_ACTION_MOVE*} para a frente duas vezes, enquanto estiveres a voar.{*B*} +No modo de voo, podes manter premido {*CONTROLLER_ACTION_JUMP*} para subires e {*CONTROLLER_ACTION_SNEAK*} para desceres, ou utilizar {*CONTROLLER_ACTION_DPAD_UP*} para subires, {*CONTROLLER_ACTION_DPAD_DOWN*} para desceres, {*CONTROLLER_ACTION_DPAD_LEFT*} para ires para a esquerda e {*CONTROLLER_ACTION_DPAD_RIGHT*} para ires para a direita. + + + 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" + + + 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? + + + "NOT USED" + + + 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. + + + 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". +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? + + + 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/pt-PT/stringsRichPresence.xml b/Minecraft.Client/PSVitaMedia/loc/pt-PT/stringsRichPresence.xml new file mode 100644 index 00000000..c4800a22 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/pt-PT/stringsRichPresence.xml @@ -0,0 +1,66 @@ + + + + {GAME_STATE} + + + Parado + + + Nos menus + + + A Jogar Multijogador - {GAME_STATE} + + + Multijogador Offline - {GAME_STATE} + + + A Jogar Sozinho - {GAME_STATE} + + + Sozinho Offline - {GAME_STATE} + + + A apreciar a paisagem! + + + A montar um porco + + + A conduzir uma vagoneta + + + Num barco + + + A pescar + + + A criar + + + A forjar + + + No Submundo + + + A ouvir um disco + + + A consultar um mapa + + + Enfeitiçar + + + Fazer uma poção + + + Trabalhar com a bigorna + + + Conhecer os vizinhos + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/ru-RU/4J_stringsGeneric.xml b/Minecraft.Client/PSVitaMedia/loc/ru-RU/4J_stringsGeneric.xml new file mode 100644 index 00000000..92b2fef0 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/ru-RU/4J_stringsGeneric.xml @@ -0,0 +1,87 @@ + + + + ОК + + + Назад + + + Отмена + + + Да + + + Нет + + + Сохранение повреждено + + + Данные повреждены. Записать новое сохранение поверх поврежденного? + + + Нет свободного места + + + Выбрать снова + + + Играть без сохранения + + + Создать новое сохранение + + + Переписать сохранение? + + + Нет, не переписывать + + + Переписать и сохранить + + + Не удалось сохранить + + + Продолжить без сохранения + + + Не удалось загрузить + + + Назвать сохранение + + + Введите название сохраненной игры + + + Выйти из игры? + + + Вы вышли + + + Продолжить игру + + + Продолжить игру вне сети + + + Игрок Гость + + + У игроков-гостей нет доступа к "PSN". + + + Сохранение... + + + Идет сохранение материалов. Не выключайте систему. + + + Получить доступ к полной версии + + \ 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 new file mode 100644 index 00000000..38fe00e2 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/ru-RU/4J_stringsPlatformSpecific.xml @@ -0,0 +1,52 @@ + + + + Не удалось сохранить настройки учетной записи 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 new file mode 100644 index 00000000..bf0fd5db --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/ru-RU/AdditionalStrings.xml @@ -0,0 +1,96 @@ + + + + Показать все смешанные миры + + + Скрыть + + + Minecraft: PlayStation®3 Edition + + + Настройки + + + Кэш сохранений + + + Произошла сетевая ошибка. + + + Сетевая ошибка + + + Произошла сетевая ошибка. Сейчас вы вернетесь в главное меню. + + + Сетевые возможности вашей учетной записи Sony Entertainment Network отключены в силу ограничений чата. + + + Сетевые возможности вашей учетной записи Sony Entertainment Network отключены в соответствии с настройками родительского контроля. + + + Сетевые возможности + + + Вы вышли из "PSN". Сетевые возможности игры будут недоступны до тех пор, пока вы не войдете в "PSN". + + + Вы вышли из "PSN". Сетевые возможности игры будут недоступны до тех пор, пока вы не войдете в "PSN". Сейчас вы вернетесь в главное меню. + + + Выберите пользователя для игрока %d (или нажмите "Отмена", чтобы играть как гость) + + + Бесплатно + + + Файл настроек поврежден, необходимо удалить его. + + + Удалить файл настроек. + + + Повторить попытку загрузки файла настроек. + + + Кэш сохранений поврежден, необходимо удалить его. + + + Призы отключены + + + Призы отключены, потому что данное сохранение принадлежит другому пользователю. + + + Фатальная ошибка: не удалось инициализировать призы. Пожалуйста, выйдите из игры. + + + Приглашения + + + Поврежденный файл + + + Контроллер отсоединен + + + Контроллер был отсоединен. Пожалуйста, присоедините контроллер заново. + + + Сетевые возможности для вашей учетной записи Sony Entertainment Network отключены в соответствии с настройками родительского контроля одного из локальных игроков. + + + Сетевые функции отключены, поскольку доступно обновление игры. + + + В данный момент для этой игры нет загружаемого контента. + + + Приглашение + + + Пожалуйста, зайдите и поиграйте немного в Minecraft: PlayStation®Vita Edition! + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/ru-RU/EULA.xml b/Minecraft.Client/PSVitaMedia/loc/ru-RU/EULA.xml new file mode 100644 index 00000000..a8b1fac0 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/ru-RU/EULA.xml @@ -0,0 +1,97 @@ + + + + Minecraft: PlayStation®Vita Edition - УСЛОВИЯ ИСПОЛЬЗОВАНИЯ + Эти Условия определяют некоторые правила использования игры Minecraft: PlayStation®Vita Edition (далее Minecraft). Чтобы защитить Minecraft и членов нашего сообщества, мы вынуждены ввести ряд правил загрузки и использования игры Minecraft. Правила нам нравятся не больше вашего, поэтому мы попытались сделать их как можно короче, но покупая, загружая, используя игру Minecraft или играя в нее, вы соглашаетесь с этими условиями (далее "Условия"). + Прежде чем начать, мы хотим как следует прояснить одну вещь. Minecraft - игра, позволяющая игрокам строить и ломать. Если вы играете с другими людьми (в многопользовательской игре), вы можете строить вместе с ними или ломать их постройки. То же они могут делать с вами. Так что не играйте с другими, если вам не нравится, как они себя ведут. Кроме того, иногда люди делают то, чего делать не следует. Нам это не нравится, но у нас мало способов с этим бороться: мы можем разве что попросить всех вести себя подобающим образом. Мы надеемся, что вы и другие такие же игроки сообщества сообщите нам, если кто-то ведет себя не так, как полагается, и нарушает (или вам кажется, что нарушает) эти Условия или использует игру Minecraft недолжным образом. Пожалуйста, ставьте нас в известность, для этого у нас есть система оповещений и сообщений. Пожалуйста, используйте ее, и мы сделаем все необходимое, чтобы разобраться с вашими обращениями. + Чтобы сообщить о любых проблемах, пожалуйста, напишите нам на электронный адрес support@mojang.com и сообщите как можно больше сведений, включая подробности о пользователе и описание произошедшего. + Теперь вернемся к Условиям: + ОДНО ВАЖНЕЙШЕЕ ПРАВИЛО + Важнейшее правило состоит в том, что вы не должны распространять ничего из того, что мы создали. "Не распространять ничего из того, что мы создали", значит "не передавать копии игры Minecraft, не использовать ее в коммерческих целях, не пытаться на ней заработать и не давать другим доступ к игре Minecraft или ее частям нечестным или неблагоразумным образом". Таким образом, одно важнейшее правило гласит, что вы (если только мы специально не оговорили обратное, например, в наших "Инструкциях по использованию товарного знака и материалов" (Brand and Asset Usage Guidelines)) не должны: + • передавать копии игры Minecraft никому другому; + • использовать в коммерческих целях любые созданные нами материалы; + • пытаться заработать на чем-либо, что мы создали; или + • давать другим людям доступ к каким-либо нашим творениям нечестным или неразумным образом. + ...и, чтобы избежать недоразумений, созданное нами включает (но не ограничивается) клиентское и серверное программное обеспечение для игры Minecraft. Сюда же относятся модифицированные версии Игры, ее части и части всего остального, созданного нами. + Во всех остальных случаях мы совершенно не возражаем против того, что вы делаете. Более того, мы всячески призываем вас делать самые разные клевые штуки (см. ниже), только не делайте того, что, как мы сказали, вы делать не должны. + ИСПОЛЬЗОВАНИЕ ИГРЫ MINECRAFT + • Вы купили игру Minecraft, значит, вы можете использовать ее на вашей системе PlayStation®Vita. + • Ниже мы даем вам ограниченные права на другие вещи, но необходимо определить какие-то границы, иначе некоторые зайдут слишком далеко. Если вы хотите сделать что-то, относящееся к тому, что мы создали, мы склоняемся перед вами, но, пожалуйста, убедитесь, что ваше творение нельзя будет принять за официальное и что оно соотносится с данными Условиями и, прежде всего, не использует в коммерческих целях что-либо, созданное нами. + • Разрешение использовать игру Minecraft и играть в нее может быть отозвано, если вы нарушите эти Условия. + • Когда вы покупаете Minecraft, мы даем вам разрешение установить игру Minecraft на вашу систему PlayStation®Vita и использовать или играть в эту игру на данной системе, как это определено данными Условиями. Разрешение дается лично вам, так что вы не можете передавать игру Minecraft (или какую-либо ее часть) кому бы то ни было (за исключением тех случаев, когда мы явно это разрешим). + • Со скриншотами и видео Minecraft вы можете делать что угодно в пределах разумного. Под "в пределах разумного" мы имеем в виду, что их использование в коммерческих целях недопустимо, как и любые другие действия, которые затронут наши права несправедливо или неблагоприятно. Кроме того, нельзя так просто взять и извлечь арт-ресурсы и распространять их, это не шутки. + • Суть этого простого правила заключается в том, что нельзя использовать в коммерческих целях ничего из созданного нами, если только мы сами явно на это не согласились и если это не оговорено в инструкциях по использованию товарного знака и материалов или в данных Условиях. Кстати, если это явно разрешено законом, например, в рамках доктрины "добросовестного использования" или "добросовестной сделки", мы тоже не возражаем - но только в пределах закона. + ПРАВА СОБСТВЕННОСТИ НА ИГРУ MINECRAFT И ПРОЧЕЕ + • Мы даем вам разрешение играть в Minecraft, однако владельцами этой игры остаемся мы. Кроме того, нам принадлежат наши товарные знаки и все материалы, содержащиеся в Minecraft, то есть, программное обеспечение, текстуры, средства, инструменты, инфраструктура и все остальные умные (и не очень) штуки, которыми мы владеем. Все наши права на это заявлены и защищены, но вы можете пользоваться всем в рамках этих Условий. + • Это не означает, что все клевые штуки, которые вы делаете с помощью Minecraft, принадлежат нам. Просто примите тот факт, что мы владеем всеми частями игры Minecraft и игрой Minecraft как продуктом и услугой, а также всем упомянутым в предыдущем пункте. Кроме того, нам принадлежат авторские права и прочие так называемые права на интеллектуальную собственность, связанные с ними, а также с именами и товарными знаками, связанными с Minecraft. + • Вы, разумеется, будете создавать собственные материалы в игре Minecraft и с ее помощью. Нам не принадлежат оригинальные вещи, созданные вами, и мы не заявляем права собственности на то, на что не должны. Тем не менее, нам будет принадлежать все то, что является копией (или в значительной части копией) или производным от нашей собственности и наших творений (подробнее об этом выше), если же вы создаете нечто оригинальное, то оно нам не принадлежит. Так, например: + - отдельный блок - это наше; + - готический собор с американскими горками внутри - это не наше. + • Таким образом, когда вы платите за использование игры Minecraft, вы покупаете только разрешение использовать продукт Minecraft в соответствии с этими Условиями. Все права, которые у вас есть в связи с Minecraft, это права, определенные этими Условиями. + КОНТЕНТ + • Делая какой-либо контент доступным в игре Minecraft или посредством этой игры, вы должны разрешить нам использовать, копировать, модифицировать и адаптировать его. Разрешение должно быть безотзывным и неограниченным. Кроме того, вы должны позволить нам дать возможность использовать ваш контент другим людям. Вы также должны позволить использовать этот контент другим людям, которым вы дали к нему доступ (например, вашим партнерам по многопользовательской игре). + • Пожалуйста, выкладывайте контент осторожно, потому что он может быть опубликован, а затем использован другими людьми не так, как вам бы хотелось. + • Материалы, которые вы собираетесь сделать доступными в игре Minecraft или посредством этой игры, не должны быть оскорбительными или незаконными, они должны быть честными, и это должно быть ваше собственное творение. В число вещей, которые нельзя делать доступными с помощью Minecraft, входят: публикации, содержащие расистские или гомофобные высказывания; публикации, которые травят собеседников или угрожают им; публикации, которые могут нанести урон репутации другого человека; публикации, содержащие порнографию, рекламу или произведения и изображения, вам не принадлежащие; а также публикации, в которых вы выдаете себя за модератора или пытаетесь обмануть других людей или воспользоваться ими. + • Любой контент, который вы делаете доступным в Minecraft, должен быть создан вами. Вы не должны публиковать при помощи Minecraft материалы, нарушающие права кого бы то ни было. Если вы опубликуете в Minecraft материалы, а мы получим требование, угрозу или судебный иск из-за того, что данный контент нарушает чьи-либо права, мы можем возложить всю ответственность на вас, что означает, что вам придется возместить весь ущерб, который мы понесем в результате случившегося. Поэтому действительно очень важно выкладывать контент, созданный лично вами, и не публиковать материалы, созданные кем-либо еще. + • Пожалуйста, будьте внимательны, обращайте внимание на то, с кем вы играете. Нам, как и вам, сложно убедиться, что человек говорит правду или что он действительно тот, за кого себя выдает. Кроме того, не стоит давать информацию о себе через Minecraft. + Если вы собираетесь сделать контент ("Ваш контент") доступным с помощью Minecraft, он должен: + - соответствовать всем правилам Sony Computer Entertainment, включая "Условия обслуживания и пользовательское соглашение", в число которых входят "Условия обслуживания" и "Пользовательское соглашение" "PSN", а также любые другие правила, с которыми вы должны были согласиться, чтобы использовать систему PlayStation®Vita и "PSN"; + - не оскорблять других людей; + - не быть незаконным или недопустимым; + - быть честным и не вводить других людей в заблуждение, не обманывать их, не пользоваться ими, также вы не должны выдавать себя за других; + - не нарушать чужие авторские или иные права; + - не допускать проявлений расизма, сексизма или гомофобии; + - не травить других и не угрожать им; + - не наносить урона нашей репутации или репутации других лиц; + - не содержать порнографию; + - не содержать рекламу. + • Вы не должны делать доступным с помощью Minecraft контент, нарушающий чьи-либо права. + • Вы несете ответственность за весь Ваш контент, сделанный доступным с помощью Minecraft. + • Делая Ваш контент доступным, вы гарантируете и ставите нас в известность, что вы имеете на это полное право в соответствии с данными Условиями и что мы можем использовать права, которые вы передали нам в соответствии с данными Условиями. + • Если мы получим обращение, угрозы или судебный иск от кого-либо из-за контента, который вы сделали доступным с помощью Minecraft или кто-то сделал доступным в игре Minecraft или посредством этой игры, эти материалы могут быть удалены, мы можем возложить всю ответственность на вас и вам придется возместить нам все понесенные в результате этого убытки. Кроме того, вы можете лишиться доступа к некоторым аспектам игры Minecraft временно или навсегда. + ПОЛЬЗОВАТЕЛЬСКИЙ КОНТЕНТ + Следующие пункты определяют некоторые границы как Вашего контента, так и контента, сделанного другими, который ниже будет называться "Пользовательский контент". Minecraft - это развлекательная услуга, и мы (и наши лицензиаты (среди которых Sony Computer Entertainment)) участвуем в передаче, распространении, хранении и восстановлении Пользовательского контента, не просматривая, не отбирая и не изменяя данных. Это означает, что мы не просматриваем Пользовательский контент и не знаем, что распространяете вы или кто-либо другой. Мы описали наши правила в данных Условиях, чтобы вы и остальные люди их соблюдали, однако мы не можем знать обо всем, что происходит. + Поэтому, пожалуйста, имейте в виду: + • мнение, выраженное в Пользовательском контенте, является мнением его авторов или создателей; оно не отражает наше собственное мнение или мнение кого-либо, имеющего к нам отношение, если только мы не указали обратное; + • мы не несем ответственности за весь Пользовательский контент, включая любые комментарии, мнения или замечания, выраженные в нем (а также не даем гарантий и снимаем с себя обязательства в отношении него и не являемся его представителями); + • используя Minecraft, вы признаете, что мы не обязаны предварительно просматривать материалы Пользовательского контента и что весь Пользовательский контент становится доступным согласно принципу, что мы не должны заниматься его контролем или оценкой и не занимаемся этим. + ОДНАКО мы (или наши лицензиаты, среди которых Sony Computer Entertainment) можем удалять, отказывать в размещении любого Пользовательского контента, лишать доступа к нему, а также лишать вас возможности публиковать, делать доступным или получать доступ к Пользовательскому контенту временно или навсегда - вплоть до временного или постоянного лишения доступа к игре Minecraft или к "PSN", если мы сочтем такие меры соответствующими, в случае если вы, например, нарушили данные Условия или мы получили жалобу. Кроме того, мы будем без промедления удалять Пользовательский контент или отключать к нему доступ, получив достоверные сведения о том, что он нарушает закон. + УЛУЧШЕНИЯ + • Время от времени мы можем выпускать улучшения и обновления, однако мы не обязаны этого делать. Кроме того, мы не должны обеспечивать непрерывную поддержку или техническое обслуживание любой игры. Конечно, мы надеемся, что продолжим выпускать обновления для Minecraft, мы просто не можем этого гарантировать. + НАШИ ОБЯЗАТЕЛЬСТВА + • Когда вы получаете копию игры Minecraft, мы предоставляем ее "как есть". Улучшения и обновления также предоставляются "как есть". Это означает, что мы не даем вам никаких обещаний относительно стандартов или качества игры Minecraft, относительно того, что игра Minecraft будет непрерывной, в ней не будет содержаться ошибок, а также относительно любых потерь и повреждений, которые они могут вызвать. Мы обещаем только предоставить игру Minecraft и любые другие услуги с разумным умением и вниманием. Законы большинства государств гласят, что мы не можем отказаться от обязательств в случае смерти или травмы, произошедшей по причине нашей халатности, так что, если ваш компьютер взлетит и ударит вас, потому что мы что-то не так сделали, то мы попали. + МЫ НЕ НЕСЕМ ОТВЕТСТВЕННОСТИ ЗА: + • ЛЮБОЕ ИСПОЛЬЗОВАНИЕ ИЛИ НЕПРАВИЛЬНОЕ ИСПОЛЬЗОВАНИЕ ИГРЫ MINECRAFT ВАМИ ИЛИ КЕМ-ЛИБО ЕЩЕ; + • ЛЮБОЙ КОНТЕНТ, КОТОРЫЙ ВЫ СДЕЛАЛИ ДОСТУПНЫМ С ПОМОЩЬЮ ИГРЫ MINECRAFT; + • ЛЮБОЕ НАРУШЕНИЕ ВАМИ ЭТИХ ПРАВИЛ; + • ЛЮБОЕ НАРУШЕНИЕ ЭТИХ ПРАВИЛ ЛЮБЫМ ДРУГИМ ЧЕЛОВЕКОМ. + ОКОНЧАНИЕ ИСПОЛЬЗОВАНИЯ + • Мы можем по собственному усмотрению лишить вас права на использование игры Minecraft, если вы нарушите данные Условия. Вы также можете прервать использование в любой момент. Для этого просто удалите игру Minecraft с вашей системы PlayStation®Vita. В любом случае разделы "Права собственности на игру Minecraft ", "Наши обязательства" и "Общее" продолжат действовать даже после окончания использования игры. + ОБЩЕЕ + • Эти Условия ограничиваются всеми вашими правами, которыми вы обладаете по закону. Ни одно из этих условий не может ограничивать ваши права, которых вы по закону не можете быть лишены. Помимо этого, они не исключают и не ограничивают нашу ответственность в случае смерти или травмы, произошедшей по причине нашей халатности или умышленного введения в заблуждение. + • Кроме того, время от времени мы можем изменять данные Условия, однако изменения будут действовать только в пределах, пока они могут применяться законным образом. Например, если вы используете только одиночный режим Minecraft и не устанавливаете обновления, которые мы выпускаем, то действует старое "Лицензионное соглашение с конечным пользователем". Если же вы используете обновления или части игры Minecraft, которые зависят от наших сетевых услуг, то будет действовать новое "Лицензионное соглашение с конечным пользователем". В этом случае мы, вероятно, не сможем / не должны сообщать вам об изменениях, чтобы они вступили в силу, так что вы должны заглядывать сюда время от времени, чтобы проверить, не внесено ли в Условия каких-нибудь изменений. Мы не собираемся с этим мухлевать, однако законы иногда меняются или кто-то делает нечто такое, что сказывается на остальных пользователях игры Minecraft, и мы вынуждены с этим бороться. + • Если вы хотите внести предложение относительно Minecraft или других наших игр, это делается бесплатно. То есть, мы можем воспользоваться вашим предложением как угодно, и мы не обязаны вам за него платить. Если вы думаете, что за ваше предложение мы захотим раскошелиться, предупредите, что вы ждете платы, до того, как расскажете о своем предложении. + • Кроме данных Условий у нас есть ряд инструкций по использованию товарного знака и материалов (Brand and Asset Usage Guidelines), их можно найти в сети. + • Если вы нарушите эти правила, мы (или компания Sony Computer Entertainment) можем прервать ваше пользование игрой Minecraft. Если вы не хотите или не можете согласиться с этими правилами, не покупайте, не загружайте, не используйте игру Minecraft и не играйте в нее. + Если у вас остались юридические вопросы, ответы на которые вы здесь не нашли, не держите их в себе - спросите нас. В целом же - не творите глупостей, и мы не будем. + Мы: + Mojang AB + Мария Скулгата, 83 + SE-11853 + Стокгольм + Швеция + Номер организации: 556819-2388 + + + + + Любой контент, купленный во внутриигровом магазине, будет приобретен у компании Sony Network Entertainment Europe Limited ("SNEE"), и на него будут распространяться Условия обслуживания и лицензионное соглашение Sony Entertainment Network, которые можно найти в магазине PlayStation®Store. Пожалуйста, проверяйте правила использования при каждой покупке, так как они могут отличаться в зависимости от приобретаемого контента. Если не указано иное, возрастной рейтинг контента, доступного в любом внутриигровом магазине, такой же, как и у самой игры. + + + + Покупка и использование предметов регулируются Условиями обслуживания и лицензионным соглашением Sony Entertainment Network. Сублицензия на эту сетевую услугу предоставлена вам компанией Sony Computer Entertainment America. + + + Помните: использование данного программного обеспечения регламентируется Условиями использования Программ, опубликованными по адресу eu.playstation.com/legal. + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/ru-RU/stringsDynafont.xml b/Minecraft.Client/PSVitaMedia/loc/ru-RU/stringsDynafont.xml new file mode 100644 index 00000000..dca31ec2 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/ru-RU/stringsDynafont.xml @@ -0,0 +1,7 @@ + + + + DynaFont developed by DynaComware. + + + \ 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 new file mode 100644 index 00000000..69dd11dd --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/ru-RU/stringsGeneric.xml @@ -0,0 +1,7050 @@ + + + + Переключение на игру вне сети + + + Подождите, пока хост сохраняет игру + + + Вход на Край + + + Сохранение игроков + + + Подключение к хосту + + + Загрузка поверхности + + + Выход с Края + + + В вашем доме не было кровати, или путь к ней был заблокирован + + + Вы не можете отдыхать, рядом монстры + + + Вы спите на кровати. Чтобы пропустить время до утра, все игроки должны спать на кроватях одновременно. + + + Кровать занята + + + Спать можно только ночью + + + %s спит на кровати. Чтобы пропустить время до утра, все игроки должны спать на кроватях одновременно. + + + Загрузка уровня + + + Завершение... + + + Создание поверхности + + + Короткая симуляция мира + + + Ранг + + + Подготовка к сохранению уровня + + + Подготовка фрагментов... + + + Инициализация сервера + + + Выход из преисподней + + + Возрождение + + + Создание уровня + + + Создание зоны возрождения + + + Загрузка зоны возрождения + + + Вход в преисподнюю + + + Инструменты и оружие + + + Гамма + + + В игре + + + В интерфейсе + + + Уровень сложности + + + Музыка + + + Звук + + + Мирный + + + В этом режиме здоровье игрока постепенно восстанавливается, а врагов в мире нет. + + + В этом режиме в мире появляются враги, но они наносят игроку меньше урона, чем на обычном уровне сложности. + + + В этом режиме в мире появляются враги, наносящие игрокам стандартные повреждения. + + + Легкий + + + Обычный + + + Высокий + + + Пользователь вышел из игры + + + Доспехи + + + Механизмы + + + Транспорт + + + Оружие + + + Пища + + + Здания + + + Украшения + + + Создание зелья + + + Инструменты, оружие и доспехи + + + Материалы + + + Строительные блоки + + + Красный камень и транспорт + + + Другое + + + Записи: + + + Выйти без сохранения + + + Выйти в главное меню? Все несохраненные данные будут потеряны. + + + Выйти в главное меню? Несохраненные данные будут потеряны! + + + Файл поврежден. Удалить? + + + Выйти в главное меню и отключить от игры всех пользователей? Все несохраненные данные будут потеряны. + + + Выйти и сохранить + + + Создать новый мир + + + Введите имя мира + + + Введите число-затравку для создания мира + + + Загрузить мир + + + Пройти обучение + + + Обучение + + + Назвать новый мир + + + Поврежденное сохранение + + + ОК + + + Отмена + + + Магазин Minecraft + + + Повернуть + + + Скрыть + + + Очистить все ячейки + + + Выйти из текущей игры и присоединиться к новой? Все несохраненные данные будут утеряны. + + + Переписать все прежние сохранения данной версией? + + + Выйти без сохранения? Все, чего вы добились в этом мире, будет утеряно! + + + Начать игру + + + Выйти из игры + + + Сохранить игру + + + Выйти без сохранения + + + START - присоединиться + + + Ура! Вы получили в награду картинку с изображением Стива из Minecraft! + + + Ура! Вы получили в награду картинку с изображением крипера! + + + Получить доступ к полной версии + + + Вы не можете присоединиться к этой игре, так как игрок, к которому вы хотите подключиться использует более новую версию игры. + + + Новый мир + + + Доступна награда! + + + Вы играете в пробную версию, но сохранить игру можно только в полной версии. +Получить доступ к полной версии игры? + + + Друзья + + + Мой счет + + + Всего + + + Пожалуйста, подождите... + + + Нет результатов + + + Фильтр: + + + Вы не можете присоединиться к этой игре, так как игрок, к которому вы хотите подключиться использует более старую версию игры. + + + Соединение разорвано + + + Утрачено соединение с сервером. Сейчас вы вернетесь в главное меню. + + + Сервер разорвал соединение + + + Выход из игры + + + Произошла ошибка. Сейчас вы вернетесь в главное меню. + + + Не удалось установить соединение + + + Вас исключили из игры + + + Хост вышел из игры. + + + Вы не можете присоединиться к этой игре, так как в ней не участвуют ваши друзья. + + + Вы не можете присоединиться к этой игре, так как вас исключил хост. + + + Вас исключили из игры за полеты + + + Попытка подключения длилась слишком долго + + + Сервер переполнен + + + В этом режиме в мире появляются враги, наносящие игрокам серьезные повреждения. Остерегайтесь криперов: они могут начать атаку-взрыв, даже если вы отойдете от них! + + + Темы + + + Наборы скинов + + + Пускать друзей друзей + + + Исключить игрока + + + Исключить игрока из игры? Он не сможет присоединиться до тех пор, пока вы не перегрузите мир заново. + + + Наборы картинок игрока + + + Вы не можете присоединиться к игре, так как в ней могут участвовать только друзья хоста. + + + Загружаемый контент поврежден + + + Этот загружаемый контент поврежден, использовать его невозможно. Удалите его и заново установите из меню магазина Minecraft. + + + Часть загружаемого контента повреждена и не может быть использована. Удалите этот загружаемый контент, а затем заново установите из меню магазина Minecraft. + + + Невозможно присоединиться к игре + + + Выбрано + + + Выбранный скин: + + + Получить полную версию + + + Получить доступ к набору текстур + + + Прежде чем использовать этот набор текстур, необходимо получить к нему доступ. +Получить к нему доступ сейчас? + + + Набор текстур пробной версии + + + Число-затравка + + + Получить доступ к набору скинов + + + Прежде чем использовать этот набор скинов, необходимо получить к нему доступ. +Получить к нему доступ сейчас? + + + Вы используете набор текстур пробной версии. Вы не сможете сохранить этот мир, пока не получите доступ к полной версии. +Получить доступ к полной версии набора текстур? + + + Загрузить полную версию + + + В этом мире использован смешанный набор или набор текстур, которого у вас нет! +Установить смешанный набор или набор текстур? + + + Получить пробную версию + + + Нет набора текстур + + + Получить доступ к полной версии + + + Загрузить пробную версию + + + Режим игры изменен + + + Выберите, чтобы к игре могли присоединиться только приглашенные. + + + Выберите, чтобы к игре могли присоединиться друзья ваших друзей. + + + Выберите, чтобы игроки могли причинять урон друг другу. Действует только в режиме "Выживание". + + + Нормальный + + + Суперплоский + + + Выберите, чтобы игра была сетевой. + + + Отключите, и игроки не смогут строить или добывать руду без разрешения. + + + Выберите, чтобы в мире появились такие структуры, как деревни и крепости. + + + Выберите, чтобы и верхний мир, и преисподняя были совершенно плоскими. + + + Выберите, чтобы рядом с точкой спауна игроков появился сундук с полезными предметами. + + + Выберите, чтобы огонь распространялся на соседние горючие блоки. + + + Выберите, чтобы после активации тротил взрывался. + + + Выберите, чтобы создать преисподнюю заново. Это полезно, если у вас старое сохранение, в котором нет адских крепостей. + + + Выкл. + + + Режим игры: Творчество + + + Выживание + + + Творчество + + + Изменить название мира + + + Введите новое название мира + + + Режим игры: Выживание + + + Создано в режиме "Выживание" + + + Переименовать файл + + + Автосохранение через %d... + + + Вкл. + + + Создано в режиме "Творчество" + + + Отображать облака + + + Что вы хотите сделать с этим сохранением? + + + Размер и-фейса (разд. экран) + + + Ингредиент + + + Топливо + + + Распределитель + + + Сундук + + + Зачаровать + + + Печь + + + Для этой игры сейчас нет загружаемого контента данного типа. + + + Удалить эту сохраненную игру? + + + Ожидает проверки + + + Отклонено + + + %s присоединяется к игре. + + + %s покидает игру. + + + %s исключается из игры. + + + Варочная стойка + + + Текст на табличке + + + Введите текст вашей таблички + + + Заголовок + + + Тайм-аут пробной версии + + + Игра переполнена + + + Не удалось присоединиться к игре, так как в ней нет свободных мест + + + Введите заголовок вашего сообщения + + + Введите описание вашего сообщение + + + Инвентарь + + + Ингредиенты + + + Подпись + + + Введите подпись вашего сообщения + + + Описание + + + Играет: + + + Добавить этот уровень к списку запрещенных? +Выбрав "ОК", вы, кроме того, выйдете из игры. + + + Удалить из черного списка + + + Сохранять каждые + + + Запрещенный уровень + + + Игра, к которой вы присоединяетесь, находится в вашем списке запрещенных уровней. Если вы к ней присоединитесь, она будет удалена из списка запрещенных. + + + Запретить этот уровень? + + + Автосохранение: выкл. + + + Прозрач. интерфейса + + + Подготовка к автосохранению уровня + + + Размер интерфейса + + + мин. + + + Здесь нельзя! + + + Размещать лаву рядом с точкой возрождения не разрешается, так как в этом случае высока вероятность мгновенной гибели возрождающихся игроков. + + + Любимые скины + + + Игра пользователя %s + + + Игра неизвестного хоста + + + Гость вышел + + + Сбросить настройки + + + Вернуть настройки к значениям по умолчанию? + + + Ошибка при загрузке + + + Игрок-гость вышел из игры, в результате чего все игроки-гости удалены из игры. + + + Не удалось создать игру + + + Автовыбор + + + Стандартные скины + + + Войти + + + В эту игру невозможно играть, не войдя в систему. Войти? + + + Сетевая игра не разрешена + + + Выпить + + + + Здесь находится ферма. Фермы позволяют создавать возобновляемый источник пищи и других предметов. + + + + + {*B*} + Нажмите{*CONTROLLER_VK_A*}, чтобы узнать больше о фермах.{*B*} + Нажмите{*CONTROLLER_VK_B*}, если вы все уже знаете о фермах. + + + + Пшеницу, тыквы и дыни выращивают из семян. Чтобы добыть семена пшеницы, разбивайте блоки высокой травы или собирайте урожай пшеницы. Семена тыквы и дыни делаются из тыкв и дынь соответственно. + + + Нажмите{*CONTROLLER_ACTION_CRAFTING*}, чтобы открыть инвентарь в режиме "Творчество". + + + Чтобы продолжить, доберитесь до противоположной стороны этой дыры. + + + Вы прошли курс обучения, посвященный режиму "Творчество". + + + Прежде чем сажать семена, превратите блок земли в грядку, обработав его с помощью мотыги. Если рядом находятся источники воды и/или света, посевы будут расти быстрее. + + + Кактусы нужно сажать на песке, и они вырастают на 3 блока в высоту. Срубив блок кактуса, вы обрушите все блоки, которые находятся над ним.{*ICON*}81{*/ICON*} + + + Грибы нужно сажать в местах со слабым освещением. Грибница разрастется на другие плохо освещенные блоки.{*ICON*}39{*/ICON*} + + + Костная мука заставляет урожай сразу же созреть, а грибы превращает в огромные грибы.{*ICON*}351:15{*/ICON*} + + + Пшеница по мере роста проходит через несколько этапов. Когда она потемнеет, урожай можно собирать.{*ICON*}59:7{*/ICON*} + + + Рядом с тыквой или дыней должен быть еще один блок, чтобы стеблю было куда расти. + + + Сахарный тростник нужно сажать на блок травы, земли или песка, находящийся рядом с блоком воды. Срубив блок сахарного песка, вы обрушите все блоки, которые находятся над ним.{*ICON*}83{*/ICON*} + + + В режиме "Творчество" у вас бесконечное число всех доступных предметов и блоков, вы можете уничтожать блоки одним щелчком без помощи инструментов. Кроме того, вы неуязвимы и можете летать. + + + + Здесь в сундуке лежат компоненты для схем и поршней. Попробуйте воспользоваться схемами, которые находятся поблизости, расширить их или сделать собственные. За границами зоны обучения есть и другие схемы. + + + + + Здесь находится портал в преисподнюю! + + + + + {*B*} + Нажмите{*CONTROLLER_VK_A*}, чтобы узнать о порталах и преисподней.{*B*} + Нажмите{*CONTROLLER_VK_B*}, если вы уже все знаете о порталах и преисподней. + + + + + Красную пыль можно получить, добывая красную руду с помощью железной, алмазной или золотой кирки. С помощью пыли можно передавать энергию на расстояние до 15 блоков, и она может сдвигаться на 1 блок вверх или вниз. + {*ICON*}331{*/ICON*} + + + + + Красные ретрансляторы можно использовать для передачи энергии на большие расстояния или для того, чтобы задержать прохождение сигнала по схеме. + {*ICON*}356{*/ICON*} + + + + + Поршень, соединенный с источником энергии, выдвигается, толкая до 12 блоков. Липкий поршень, втягиваясь, может тянуть за собой один блок почти любого вида. + {*ICON*}33{*/ICON*} + + + + + Чтобы создать портал, необходимо построить обсидиановую раму - 4 блока в ширину и 5 в высоту. Угловые блоки не требуются. + + + + + Путешествия по преисподней - хороший способ быстро преодолеть расстояние в наземном мире: 1 блок в преисподней равен 3 в наземном мире. + + + + + Вы в режиме "Творчество". + + + + + {*B*} + Нажмите{*CONTROLLER_VK_A*}, чтобы узнать больше о режиме "Творчество".{*B*} + Нажмите{*CONTROLLER_VK_B*}, если вы уже все знаете о режиме "Творчество". + + + + + Чтобы активировать портал в преисподнюю, подожгите обсидиановые блоки, находясь внутри портала, с помощью кремня и огнива. Порталы деактивируются только в том случае, если одна из стен разрушена, если рядом произошел взрыв или если через них протекла жидкость. + + + + + Чтобы воспользоваться порталом в преисподнюю, зайдите в него. Экран окрасится в лиловый цвет, и прозвучит определенный звук. Через несколько мгновений вы окажетесь в другом измерении. + + + + + + Преисподняя - опасное место, здесь много лавы, зато здесь можно добыть адский камень, который горит вечно, если его поджечь, а также сияющий камень - источник света. + + + + Вы прошли курс обучения, посвященный посадкам. + + + Для каждой задачи есть свои инструменты. Рубить деревья следует топором. + + + Для каждой задачи есть свои инструменты. Добывать камень и руду следует киркой. Для некоторых материалов необходимы более прочные кирки. + + + Некоторые инструменты предназначены для борьбы с врагами. Советуем использовать в бою меч. + + + Железные големы также появляются сами по себе, чтобы защищать деревни. Они нападут на вас, если вы будете нападать на крестьян. + + + Вы не сможете покинуть эту зону, пока не завершите курс обучения. + + + Для каждой задачи есть свои инструменты. Копать мягкие материалы, например землю и песок, следует лопатой. + + + Подсказка: зажмите{*CONTROLLER_ACTION_ACTION*}, чтобы добывать руду или рубить - руками или предметом, который вы держите в руках. Некоторые блоки можно добыть только с помощью определенных инструментов... + + + В сундуке на берегу реки лежит лодка. Чтобы использовать ее, наведите курсор на воду и нажмите{*CONTROLLER_ACTION_USE*}. Чтобы сесть в нее, используйте{*CONTROLLER_ACTION_USE*}, наведя курсор на лодку. + + + В сундуке на берегу пруда лежит удочка. Достаньте ее и возьмите в руки, чтобы использовать ее. + + + Этот более сложный поршневой механизм создает саморемонтирующийся мост! Нажмите кнопку, чтобы включить его, и посмотрите, как взаимодействуют его части. + + + Ваш инструмент поврежден. При каждом использовании инструмент получает повреждения и в конце концов ломается. Когда предмет находится в инвентаре, цветная полоска внизу отражает его состояние. + + + Зажмите{*CONTROLLER_ACTION_JUMP*}, чтобы плыть вверх. + + + В этой зоне находится вагонетка на рельсах. Чтобы сесть в нее, наведите курсор на вагонетку и нажмите{*CONTROLLER_ACTION_USE*}. Чтобы привести ее в движение, используйте{*CONTROLLER_ACTION_USE*}. + + + Железные големы состоят из 4 железных блоков, составленных так, как показано на рисунке. Наверху среднего блока должна стоять тыква. Железные големы атакуют ваших врагов. + + + Кормите пшеницей коров, гриборов и овец. Морковку давайте свиньям. Кур кормите семенами пшеницы или адскими бородавками. Волков - любым видом мяса. И тогда они начнут искать другое животное своего вида, которое также находится в режиме любви. + + + Когда встречаются две особи одного вида, которые находятся в режиме любви, несколько секунд они будут целоваться, а потом появится детеныш. Некоторое время малыш будет следовать за родителями, а затем превратится во взрослую особь. + + + Побывав в режиме любви, животное не сможет войти в него повторно около 5 минут. + + + + Здесь находится загон с животными. Разводите животных, чтобы получить детенышей их вида. + + + + + {*B*} + Нажмите{*CONTROLLER_VK_A*}, чтобы узнать о животных и их разведении.{*B*} + Нажмите{*CONTROLLER_VK_B*}, если вы уже все знаете о животных и их разведении. + + + + Чтобы животные размножались, они должны перейти в "Режим любви". Для этого их нужно кормить подходящими продуктами. + + + Некоторые животные будут следовать за вами, если вы держите в руке их пищу. Так вам будет проще собрать их вместе для разведения.{*ICON*}296{*/ICON*} + + + + {*B*} + Нажмите{*CONTROLLER_VK_A*}, чтобы узнать о големах.{*B*} + Нажмите{*CONTROLLER_VK_B*}, если вы уже все знаете о големах. + + + + Чтобы создать голема, необходимо поставить тыкву на штабель блоков. + + + Снежный голем состоит из двух блоков снега, поставленных один на другой, наверху которых стоит тыква. Снежные големы бросают снежки в ваших врагов. + + + +Диких волков можно приручить, давая им кости. Над прирученным волком появляются сердечки. Такой волк будет следовать за игроком и защищать его, если только ему не была дана команда сидеть. + + + + Вы прошли курс обучения, посвященный животным и их разведению. + + + + Здесь находятся тыквы и блоки, из которых можно сделать снежного и железного голема. + + + + + Эффект, который источник энергии оказывает на окружающие блоки, зависит от его положения и ориентации. Например, факел рядом с блоком, может погаснуть, если блок получает энергию из другого источника. + + + + + Если котел опустеет, долейте в него воды из ведра. + + + + + Создайте зелье устойчивости к огню, используя варочную стойку. Вам понадобится бутылка с водой, адская бородавка и сливки магмы. + + + + + Чтобы использовать зелье, возьмите его в руку и зажмите{*CONTROLLER_ACTION_USE*}. Обычное зелье вы выпьете, и его эффект подействует на вас, а разрывное - бросите, и оно подействует на существ, которые окажутся в зоне поражения. + Чтобы превратить обычное зелье в разрывное, добавьте в него порох. + + + + {*B*} + Нажмите{*CONTROLLER_VK_A*}, чтобы узнать больше о зельях и том, как их варить.{*B*} + Нажмите{*CONTROLLER_VK_B*}, если вы уже достаточно знаете о зельеварении. + + + + + Чтобы сварить зелье, для начала получите бутылку с водой. Для этого возьмите из сундука стеклянную бутылку. + + + + + Наполнить бутылку можно из котла, в котором есть вода, или из блока воды. Наполните бутылку, указав на источник воды и нажав{*CONTROLLER_ACTION_USE*}. + + + + + Выпейте зелье устойчивости к огню. + + + + + Чтобы зачаровать предмет, прежде всего положите его в ячейку для зачаровывания. Зачарованные предметы приобретают особые свойства: например, увеличивается их уровень защиты или число предметов, получаемых при разработке блока. + + + + + Если поместить предмет в ячейку, на кнопке справа появятся различные случайно выбранные чары. + + + + + Число на кнопке соответствует уровням опыта, которые нужно потратить. Если вашего уровня недостаточно, кнопка будет неактивной. + + + + + Вы приобрели устойчивость к воздействию огня и лавы. Теперь попробуйте пройти там, куда не могли пробраться раньше. + + + + + В этом окне вы сможете накладывать чары на оружие, доспехи и инструменты. + + + + {*B*} + Нажмите{*CONTROLLER_VK_A*}, чтобы узнать больше об окне зачаровывания.{*B*} + Нажмите{*CONTROLLER_VK_B*}, если вы уже знакомы с окном зачаровывания. + + + + + Здесь находятся варочная стойка, котел и сундук с ингредиентами. + + + + + Древесный уголь - один из видов топлива. Кроме того, если насадить уголь на палку, получится факел. + + + + + Поместив песок в ячейку ингредиента, вы сделаете стекло. Создайте несколько стеклянных блоков, чтобы сделать из них окна в вашем убежище. + + + + + Это интерфейс создания зелий. Здесь можно создать зелья, обладающие различными эффектами. + + + + + Многие деревянные предметы можно использовать в качестве топлива, но не все они горят одинаково долго. Кроме того, есть и другие предметы, которые можно жечь. + + + + + После обжига вы можете переместить предметы в инвентарь. Экспериментируйте с разными ингредиентами, чтобы узнать, что еще можно сделать. + + + + + Возьмите в качестве ингредиента древесину, чтобы приготовить древесный уголь. Положите в печь топливо, а древесину - в ячейку ингредиента. На приготовление уйдет некоторое время, так что можете заняться другими делами, а потом вернуться к печи. + + + + {*B*} + Нажмите{*CONTROLLER_VK_A*}, чтобы продолжить.{*B*} + Нажмите{*CONTROLLER_VK_B*}, если вы уже знаете, как использовать варочную стойку. + + + + + Ферментированный глаз паука оскверняет зелье и может изменить его эффект на противоположный, а порох превращает зелье в разрывное, которое можно бросить, чтобы оно подействовало на все объекты, находящиеся в определенной области. + + + + + Создайте зелье устойчивости к огню, сначала положив в бутылку с водой адскую бородавку, а затем добавив сливки магмы. + + + + + Нажмите{*CONTROLLER_VK_B*}, чтобы закрыть экран создания зелий. + + + + + Чтобы сварить зелье, поместите в верхнюю ячейку ингредиент, а в нижние - зелья или бутылки с водой (одновременно можно создавать до 3 зелий). Если получилась допустимая комбинация, начнется процесс зельеварения, и через некоторое время зелье будет готово. + + + + + Для каждого зелья нужна бутылка с водой. Приготовление большинства зелий можно начать с создания "Неудобоваримого зелья" из адской бородавки, а затем добавить к нему еще хотя бы один ингредиент. + + + + + Сварив зелье, вы можете изменить его эффект. Добавив красную пыль, вы увеличите время действия зелья, а сияющая пыль сделает его более мощным. + + + + + Выберите чары и нажмите{*CONTROLLER_VK_A*}, чтобы зачаровать предмет. Ваш уровень опыта уменьшится на сумму, необходимую для зачаровывания. + + + + + Нажмите{*CONTROLLER_ACTION_USE*}, чтобы закинуть удочку и начать удить рыбу. Нажмите{*CONTROLLER_ACTION_USE*}, чтобы выбрать леску. + {*FishingRodIcon*} + + + + + Вы поймаете рыбу, вытащив леску после того, как поплавок погрузится в воду. Рыбу - сырую или жареную в печи - можно съесть, чтобы восстановить уровень здоровья. + {*FishIcon*} + + + + + Удочка, как и многие другие инструменты, ломается после определенного числа применений, однако ее можно использовать не только на рыбалке. Экспериментируйте, и вы узнаете, что еще можно поймать или активировать с ее помощью... + {*FishingRodIcon*} + + + + + Лодка позволяет быстрее плыть по воде. Чтобы управлять ею, используйте{*CONTROLLER_ACTION_MOVE*} и{*CONTROLLER_ACTION_LOOK*}. + {*BoatIcon*} + + + + + Вы удите рыбу удочкой. Чтобы использовать удочку, нажмите{*CONTROLLER_ACTION_USE*}.{*FishingRodIcon*} + + + + + {*B*} + Нажмите{*CONTROLLER_VK_A*}, чтобы узнать, как ловить рыбу.{*B*} + Нажмите{*CONTROLLER_VK_B*}, если вы уже умеете ловить рыбу. + + + + + Это кровать. Нажмите{*CONTROLLER_ACTION_USE*}, наведя на нее курсор, чтобы заснуть ночью и проснуться утром.{*ICON*}355{*/ICON*} + + + + + Здесь есть несколько простых схем с красным камнем и поршнями, а также сундук с предметами, которые позволят усложнить эти схемы. + + + + + {*B*} + Нажмите{*CONTROLLER_VK_A*}, чтобы узнать о схемах с красным камнем и поршнями.{*B*} + Нажмите{*CONTROLLER_VK_B*}, если вы уже знаете про схемы с красным камнем и поршнями. + + + + + Рычаги, кнопки, нажимные пластины и факелы из красного камня могут питать схемы энергией. Для этого либо прикрепите их к предмету или соедините источник энергии и предмет с помощью красной пыли. + + + + + {*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*}, если вы уже знаете все о шкале пищи и употреблении продуктов. + + + + Выбрать + + + Использовать + + + В этой зоне вы сможете узнать о том, как ловить рыбу, плавать на лодках, использовать поршни и красный камень. + + + За пределами этой зоны вы познакомитесь со зданиями, научитесь основам сельского хозяйства, узнаете, как ездить на вагонетках, зачаровывать предметы, варить зелья, торговать, ковать предметы и многое другое! + + + + Шкала пищи находится на таком уровне, что вы уже не сможете улучшить здоровье. + + + + Взять + + + Вперед + + + Назад + + + Исключить игрока + + + Предложить дружбу + + + Следующая страница + + + Предыдущая страница + + + Покрасить + + + Вылечить + + + Сидеть + + + Следуй за мной + + + Добыть + + + Кормить + + + Приручить + + + Изменить фильтр + + + Положить все + + + Положить 1 + + + Выбросить + + + Взять все + + + Взять половину + + + Положить + + + Выбросить все + + + Очистить ячейку быстрого выбора + + + Что это? + + + Поделиться в Facebook + + + Выбросить 1 + + + Поменять + + + Быстрое перемещение + + + Наборы скинов + + + Красная окрашенная стеклянная панель + + + Зеленая окрашенная стеклянная панель + + + Коричневая окрашенная стеклянная панель + + + Белое окрашенное стекло + + + Окрашенная стеклянная панель + + + Черная окрашенная стеклянная панель + + + Синяя окрашенная стеклянная панель + + + Серая окрашенная стеклянная панель + + + Розовая окрашенная стеклянная панель + + + Светло-зеленая окрашенная стеклянная панель + + + Фиолетовая окрашенная стеклянная панель + + + Бирюзовая окрашенная стеклянная панель + + + Светло-серая окрашенная стеклянная панель + + + Оранжевое окрашенное стекло + + + Синее окрашенное стекло + + + Фиолетовое окрашенное стекло + + + Бирюзовое окрашенное стекло + + + Красное окрашенное стекло + + + Зеленое окрашенное стекло + + + Коричневое окрашенное стекло + + + Светло-серое окрашенное стекло + + + Желтое окрашенное стекло + + + Голубое окрашенное стекло + + + Пурпурное окрашенное стекло + + + Серое окрашенное стекло + + + Розовое окрашенное стекло + + + Светло-зеленое окрашенное стекло + + + Желтая окрашенная стеклянная панель + + + Светло-серый + + + Серый + + + Розовый + + + Синий + + + Фиолетовый + + + Бирюзовый + + + Светло-зеленый + + + Оранжевый + + + Белый + + + Свой + + + Желтый + + + Светло-синий + + + Пурпурный + + + Коричневый + + + Белая окрашенная стеклянная панель + + + Маленький шар + + + Большой шар + + + Голубая окрашенная стеклянная панель + + + Пурпурная окрашенная стеклянная панель + + + Оранжевая окрашенная стеклянная панель + + + Звезда + + + Черный + + + Красный + + + Зеленый + + + Крипер + + + Взрыв + + + Непонятная форма + + + Черное окрашенное стекло + + + Железная броня для лошади + + + Золотая броня для лошади + + + Алмазная броня для лошади + + + Компаратор + + + Вагонетка с тротилом + + + Вагонетка с воронкой + + + Вести + + + Маяк + + + Сундук с ловушкой + + + Утяжеленная нажимная пластина (легкая) + + + Бирка + + + Доски (любого типа) + + + Командный блок + + + Звездочка + + + Этих животных можно приручить. Кроме того, можно ездить на них верхом и прикрепить к ним сундук. + + + Мул + + + Рождается при скрещивании лошади и осла. Можно приручить, ездить верхом и прикрепить сундук. + + + Лошадь + + + Этих животных можно приручить. На них также можно ездить верхом. + + + Осел + + + Лошадь-зомби + + + Пустая карта + + + Звезда Нижнего мира + + + Ракета + + + Лошадь-скелет + + + Иссушение + + + Создается из черепа осушителя и песка души. Кидает в вас взрывающиеся черепа. + + + Утяжеленная нажимная пластина (тяжелая) + + + Светло-серая окрашенная глина + + + Серая окрашенная глина + + + Розовая окрашенная глина + + + Синяя окрашенная глина + + + Лиловая окрашенная глина + + + Бирюзовая окрашенная глина + + + Светло-зеленая окрашенная глина + + + Оранжевая окрашенная глина + + + Белая окрашенная глина + + + Окрашенное стекло + + + Желтая окрашенная глина + + + Светло-синяя окрашенная глина + + + Пурпурная окрашенная глина + + + Коричневая окрашенная глина + + + Загрузочная воронка + + + Активирующие рельсы + + + Выбрасыватель + + + Компаратор + + + Датчик дневного света + + + Блок красного камня + + + Окрашенная глина + + + Черная окрашенная глина + + + Красная окрашенная глина + + + Зеленая окрашенная глина + + + Сноп сена + + + Обожженная глина + + + Блок угля + + + Угасание: + + + При отключении не дает монстрам и животным изменять блоки (например, взрыв крипера не уничтожит блоки, а овцы не съедят траву) и поднимать предметы. + + + Если включено, игроки будут сохранять свои пожитки после смерти. + + + При отключении монстры не будут возрождаться естественным образом. + + + Режим игры: Приключение + + + Приключение + + + Введите число-семя для воссоздания мира. Оставьте поле пустым, если хотите создать случайный мир. + + + Если отключено, из монстров и животных не будет ничего выпадать после смерти (например, из криперов не будет выпадать порох). + + + {*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*}, если уже знаете, как пользоваться экраном фейерверков. + + + + +Воронки постоянно пытаются втащить в себя предметы из всех подходящих контейнеров, находящихся над ними. Они также пытаются разместить сохраненные предметы в выходной контейнер. + + + + +Если воронка находится под напряжением, она деактивируется и перестает перемещать предметы. + + + + +Воронка направлена в сторону перемещения предметов. Если вы хотите повернуть воронку в нужном вам направлении, ставьте ее напротив нужного блока в режиме подкрадывания. + + + + Эти враги живут на болотах. Они атакуют, кидаясь в вас зельями. После смерти из них выпадают зелья. + + + Достигнуто максимальное число картин/рамок. + + + Вы не можете создавать врагов в мирном режиме. + + + Это животное не может перейти в режим любви. Достигнуто максимальное число размножающихся свиней, овец, коров, кошек и лошадей. + + + Невозможно использовать яйцо возрождения. Достигнуто максимальное число кальмаров. + + + Невозможно использовать яйцо возрождения. Достигнуто максимальное число врагов. + + + Невозможно использовать яйцо возрождения. Достигнуто максимальное число крестьян. + + + Это животное не может перейти в режим любви. Достигнуто максимальное число размножающихся волков. + + + Достигнуто максимальное число голов мобов. + + + Инверт. обзор + + + Левша + + + Это животное не может перейти в режим любви. Достигнуто максимальное число размножающихся кур. + + + Это животное не может перейти в режим любви. Достигнуто максимальное число размножающихся гриборов. + + + Достигнуто максимальное число лодок. + + + Невозможно использовать яйцо возрождения. Достигнуто максимальное число кур. + + + {*C2*}Сделай вдох. Еще один. Почувствуй воздух в легких. Ты снова можешь управлять своими конечностями. Да, подвигай пальцами. У тебя снова есть тело - оно в воздухе, на него действует сила тяжести. Возродись в долгом сне. Вот так. Твое тело снова касается вселенной, словно вы с ней разделены. Словно мы с тобой разделены.{*EF*}{*B*}{*B*} +{*C3*}Кто мы? Когда-то нас называли духами горы. Отец- Солнце, Мать-Луна. Духи предков, духи животных. Джинны. Призраки. Лесовики. Затем нас называли богами, демонами, ангелами. Полтергейстом. Чужими, инопланетянами, лептонами, кварками. Слова меняются. Мы неизменны.{*EF*}{*B*}{*B*} +{*C2*}Мы - вселенная. Мы все, что, по-твоему, находится вне тебя. Сейчас ты смотришь на нас - и кожей, и глазами. А зачем вселенная касается твоей кожи и светит на тебя? Чтобы увидеть тебя, игрок. Чтобы узнать тебя. И чтобы ты узнал ее. Я расскажу тебе историю.{*EF*}{*B*}{*B*} +{*C2*}Жил да был один игрок.{*EF*}{*B*}{*B*} +{*C3*}И этот игрок - ты, {*PLAYER*}.{*EF*}{*B*}{*B*} +{*C2*}Иногда ему казалось, что он человек, живущий на тонкой корочке вращающегося шарика из расплавленной лавы. Этот шар из расплавленной лавы летал вокруг шара из раскаленного газа, который был в триста пятьдесят тысяч раз тяжелее его. Они были так далеко друг от друга, что свету требовалось восемь минут на то, чтобы преодолеть это расстояние. Этот свет был информацией, которую посылала звезда, и она могла прожечь кожу с расстояния в сто пятьдесят миллионов километров.{*EF*}{*B*}{*B*} +{*C2*}Иногда игроку снилось, что он - шахтер на поверхности плоского, бесконечного мира. Солнце там было белым квадратом. День там длился недолго, дел было много, а смерть представляла собой всего лишь временное неудобство.{*EF*}{*B*}{*B*} +{*C3*}Иногда игроку снилось, что он погрузился в историю.{*EF*}{*B*}{*B*} +{*C2*}Иногда игроку снилось, что он - что-то другое и находится в другом месте. Иногда это были тревожные сны, а иногда - прекрасные. Иногда игрок, проснувшись, оказывался в другом сне, а после него - в третьем.{*EF*}{*B*}{*B*} +{*C3*}Иногда игроку снилось, что он смотрит на слова на экране.{*EF*}{*B*}{*B*} +{*C2*}Давай вернемся.{*EF*}{*B*}{*B*} +{*C2*}Атомы игрока были рассеяны в траве, в реках, в воздухе, в земле. Одна женщина собрала эти атомы, выпила их, съела и вдохнула, а затем собрала игрока внутри своего тела.{*EF*}{*B*}{*B*} +{*C2*}Игрок жил в теплом, темном мире тела своей матери, а затем проснулся - и попал в долгий сон.{*EF*}{*B*}{*B*} +{*C2*}И игрок стал новой историей, еще не рассказанной, которая была записана буквами ДНК. И игрок был новой программой, которую еще никогда не запускали - ее создал код, которому уже миллиард лет. И игрок стал новым человеком, который еще никогда не жил, он был сделан из молока и любви.{*EF*}{*B*}{*B*} +{*C3*}Этот игрок - ты. История. Программа. Человек. Сделанный из молока и любви.{*EF*}{*B*}{*B*} +{*C2*}Давай вернемся еще дальше назад.{*EF*}{*B*}{*B*} +{*C2*}Семь миллиардов миллиардов миллиардов атомов тела игрока были созданы задолго до этой игры в сердце звезды. Поэтому игрок - тоже информация звезды. И игрок движется по сюжету истории, которая представляет собой лес информации, который посадил человек по имени Джулиан на плоском, бесконечном мире, созданном человеком по имени Маркус, и этот мир находится внутри маленького, личного мира, созданного игроком, который живет во вселенной, созданной...{*EF*}{*B*}{*B*} +{*C3*}Тише. Иногда игрок создавал теплый, мягкий и простой мир. А иногда твердый, холодный и сложный. Иногда он создавал в своей голове модель вселенной - крупицы энергии, движущиеся в огромном пустом пространстве. Иногда он называл эти крупицы "электронами" и "протонами".{*EF*}{*B*}{*B*} + + + + {*C2*}Иногда он называл их "планетами" и "звездами".{*EF*}{*B*}{*B*} +{*C2*}Иногда игрок верил, что он находится во вселенной, сделанной из энергии, которая состоит из включений и выключений, нулей и единиц и строк кода. Иногда ему казалось, что он играет в игру. Иногда ему казалось, что он читает слова на экране.{*EF*}{*B*}{*B*} +{*C3*}Игрок, читающий слова, - это ты...{*EF*}{*B*}{*B*} +{*C2*}Тише... И однажды игрок прочитал на экране строки кода. Он расшифровал их, превращая в слова, расшифровал слова, извлекая из них смысл, расшифровал смысл, превращая его в чувства, эмоции, теории и идеи. И тогда игрок начал дышать быстрее и глубже, он понял, что он живет. Он живет, все эти тысячи смертей были не настоящими, что он жив. {*EF*}{*B*}{*B*} +{*C3*}Ты. Ты. Ты живешь.{*EF*}{*B*}{*B*} +{*C2*}А иногда игроку казалось, что вселенная говорит с ним с помощью солнечного света, который проник сквозь шелестящую листву летнего леса.{*EF*}{*B*}{*B*} +{*C3*}А иногда игроку казалось, что вселенная говорит с ним с помощью света, упавшего с ночного зимнего неба, где еле заметное пятнышко света может быть звездой в миллион раз больше Солнца, которая превращает свои планеты в плазму, чтобы на секунду быть замеченной игроком: тот идет домой в дальнем краю вселенной, чувствует запах еды, стоит уже почти у знакомой двери и готов снова погрузиться в сон.{*EF*}{*B*}{*B*} +{*C2*}А иногда игрок верил, что вселенная говорит с ним с помощью нулей и единиц, с помощью электричества, с помощью слов, которые плывут по экрану в конце сна.{*EF*}{*B*}{*B*} +{*C3*}И вселенная сказала: "Я люблю тебя". {*EF*}{*B*}{*B*} +{*C2*}И вселенная сказала: "Ты хорошо играешь".{*EF*}{*B*}{*B*} +{*C3*}И вселенная сказала: "Все, что тебе нужно, находится внутри тебя".{*EF*}{*B*}{*B*} +{*C2*}И вселенная сказала: "Ты сильнее, чем ты думаешь".{*EF*}{*B*}{*B*} +{*C3*}И вселенная сказала: "Ты - дневной свет". {*EF*}{*B*}{*B*} +{*C2*}И вселенная сказала: "Ты - ночь".{*EF*}{*B*}{*B*} +{*C3*} И вселенная сказала: "Тьма, с которой ты борешься, - внутри тебя". {*EF*}{*B*}{*B*} +{*C2*} И вселенная сказала: "Свет, который ты ищешь, - внутри тебя".{*EF*}{*B*}{*B*} +{*C3*} И вселенная сказала: "Ты не одинок". {*EF*}{*B*}{*B*} +{*C2*} И вселенная сказала: "Ты и весь мир - единое целое". {*EF*}{*B*}{*B*} +{*C3*} И вселенная сказала: "Ты - вселенная, которая пробует себя на вкус, говорит сама с собой, читает свой собственный код".{*EF*}{*B*}{*B*} +{*C2*} И вселенная сказала: "Я люблю тебя, потому что ты - любовь".{*EF*}{*B*}{*B*} +{*C3*}И тогда игра закончилась, и игрок проснулся. И начал новый сон. И этот сон стал лучше. И игрок был вселенной. И игрок был любовью.{*EF*}{*B*}{*B*} +{*C3*}Этот игрок - ты.{*EF*}{*B*}{*B*} +{*C2*}Просыпайся.{*EF*} + + + + Перегрузить преисподнюю + + + %s выходит на Край + + + %s покидает Край + + + +{*C3*}Я вижу этого игрока.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}?{*EF*}{*B*}{*B*} +{*C3*}Да. Осторожней. Он вышел на новый уровень. Теперь он может читать наши мысли.{*EF*}{*B*}{*B*} +{*C2*}Это не важно. Он думает, что мы - часть игры.{*EF*}{*B*}{*B*} +{*C3*}Мне нравится этот игрок. Он хорошо играл. Не сдавался.{*EF*}{*B*}{*B*} +{*C2*}Он читает наши мысли, как слова на экране.{*EF*}{*B*}{*B*} +{*C3*}Когда он погружен в сон об игре, именно так он представляет себе многие вещи.{*EF*}{*B*}{*B*} +{*C2*}Слова - замечательный посредник. Они такие гибкие. И совсем не такие страшные, как реальность по ту сторону экрана.{*EF*}{*B*}{*B*} +{*C3*}Раньше, когда игроки еще не умели читать, они слышали голоса. В те времена люди, которые не играли, называли игроков ведьмами и колдунами. А игрокам снилось, что они летают по воздуху на палках, которые приводят в действие демоны.{*EF*}{*B*}{*B*} +{*C2*}А что снилось этому игроку?{*EF*}{*B*}{*B*} +{*C3*}Ему снился солнечный свет и деревья. Огонь и вода. Ему снилось, будто он творит. И уничтожает. Ему снилось, что он охотится и спасается от охотников. Ему снилось убежище.{*EF*}{*B*}{*B*} +{*C2*}А, ты про первый интерфейс. Ему миллион лет, но он до сих пор работает. Но что создал игрок на самом деле - в реальности по ту сторону экрана?{*EF*}{*B*}{*B*} +{*C3*}Он вместе с миллионами таких же, как он, работал над тем, чтобы создать настоящий мир наподобие {*EF*}{*NOISE*}{*C3*}, и создал {*EF*}{*NOISE*}{*C3*} для {*EF*}{*NOISE*}{*C3*}, в {*EF*}{*NOISE*}{*C3*}.{*EF*}{*B*}{*B*} +{*C2*}Он не может прочитать эту мысль.{*EF*}{*B*}{*B*} +{*C3*}Да, он еще не вышел на нужный уровень. Это он должен сделать в длинном сне жизни, а не в коротком сне игры.{*EF*}{*B*}{*B*} +{*C2*}А он знает, что мы любим его? И что вселенная добра?{*EF*}{*B*}{*B*} +{*C3*}Да, время от времени голос вселенной пробивается к нему сквозь шум его мыслей.{*EF*}{*B*}{*B*} +{*C2*}Но иногда в своем длинном сне он грустит. Он создает миры, в которых нет лета, и дрожит под черным солнцем, и принимает свое печальное творение за реальность.{*EF*}{*B*}{*B*} +{*C3*}Если исцелить его от печали, он погибнет. Печаль - это его личное дело. Мы не должны вмешиваться.{*EF*}{*B*}{*B*} +{*C2*}Иногда, когда игроки погружаются в сон, я хочу сказать им, что на самом деле они строят реальные миры. Я хочу сказать им, что они играют важную роль во вселенной. Иногда, когда им долго не удается установить связь, я хочу помочь им произнести слово, которое их пугает.{*EF*}{*B*}{*B*} +{*C3*}Игрок читает наши мысли.{*EF*}{*B*}{*B*} +{*C2*}Иногда мне все равно. Иногда я хочу сказать им: этот мир, который вы считаете настоящим, всего лишь {*EF*}{*NOISE*}{*C2*} и {*EF*}{*NOISE*}{*C2*}, я хочу сказать им, что они - {*EF*}{*NOISE*}{*C2*} в {*EF*}{*NOISE*}{*C2*}. В своем долгом сне они так редко видят реальность.{*EF*}{*B*}{*B*} +{*C3*}И все-таки играют.{*EF*}{*B*}{*B*} +{*C2*}Но это было бы так просто - сказать им...{*EF*}{*B*}{*B*} +{*C3*}Для такого сна это слишком сильно. Научить их, как нужно жить, - значит помешать им жить.{*EF*}{*B*}{*B*} +{*C2*}Я не буду учить игрока жить.{*EF*}{*B*}{*B*} +{*C3*}Игрок теряет терпение.{*EF*}{*B*}{*B*} +{*C2*}Я расскажу игроку историю.{*EF*}{*B*}{*B*} +{*C3*}Но не правду.{*EF*}{*B*}{*B*} +{*C2*}Да. Историю, в которой правда надежно спрятана в клетке из слов. Но не чистую правду, которая преодолеет все.{*EF*}{*B*}{*B*} +{*C3*}Тогда снова придай ему форму.{*EF*}{*B*}{*B*} +{*C2*}Да. Игрок...{*EF*}{*B*}{*B*} +{*C3*}Зови его по имени.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}. Человек, который играет.{*EF*}{*B*}{*B*} +{*C3*}Хорошо.{*EF*}{*B*}{*B*} + + + + Вернуть преисподнюю в этом сохранении к исходному состоянию? Вы потеряете все, что в ней построили! + + + Невозможно использовать яйцо возрождения. Достигнуто максимальное число свиней, овец, коров, кошек и лошадей. + + + Невозможно использовать яйцо возрождения. Достигнуто максимальное число гриборов. + + + Невозможно использовать яйцо возрождения. Достигнуто максимальное число волков. + + + Перегрузить преисподнюю + + + Не перегружать преисподнюю + + + Сейчас нельзя подстричь эту гриборову. Достигнуто максимальное число свиней, овец, гриборов, кошек и лошадей. + + + Вы умерли! + + + Настройки мира + + + Можно строить и добывать руду + + + Можно ис-ть двери и переключатели + + + Создавать структуры + + + Суперплоский мир + + + Дополнительный сундук + + + Можно открывать контейнеры + + + Исключить игрока + + + Можно летать + + + Отключить утомление + + + Можно атаковать игроков + + + Можно атаковать животных + + + Модератор + + + Привилегии хоста + + + Обучение + + + Управление + + + Настройки + + + Возродиться! + + + Загружаемый контент - предложения + + + Изменить скин + + + Авторы + + + Тротил взрывается + + + Дуэль + + + Доверять игрокам + + + Переустановить контент + + + Настройки поиска неисправностей + + + Огонь распространяется + + + Дракон Края + + + Игрок {*PLAYER*} убит дыханием дракона Края + + + Игрока {*PLAYER*} убил {*SOURCE*} + + + Игрока {*PLAYER*} убил {*SOURCE*} + + + Игрок {*PLAYER*} умер + + + Игрок {*PLAYER*} взорвался + + + Игрок {*PLAYER*} убит магией + + + Игрока {*PLAYER*} застрелил {*SOURCE*} + + + Скрыть коренную породу + + + Показать интерфейс + + + Показать руку + + + {*SOURCE*} убил {*PLAYER*} с помощью огненного шара + + + {*SOURCE*} убивает игрока {*PLAYER*} в рукопашной + + + Игрока {*PLAYER*} убивает {*SOURCE*} с помощью магии + + + Игрок {*PLAYER*} выпал за пределы мира + + + Наборы текстур + + + Смешанные наборы + + + Игрок {*PLAYER*} вспыхнул + + + Темы + + + Картинки игрока + + + Предметы аватара + + + Игрок {*PLAYER*} сгорел + + + Игрок {*PLAYER*} умер с голода + + + Игрок {*PLAYER*} был заколот до смерти + + + Игрок {*PLAYER*} плохо приземлился + + + Игрок {*PLAYER*} пытался плавать в лаве + + + Игрок {*PLAYER*} задохнулся в стене + + + Игрок {*PLAYER*} утонул + + + Сообщения о гибели + + + Вы больше не модератор + + + Теперь вы можете летать + + + Вы больше не можете летать + + + Вы больше не можете нападать на животных + + + Теперь вы можете нападать на животных + + + Теперь вы модератор + + + Вы больше не устаете + + + Вы неуязвимы + + + Вы утратили неуязвимость + + + %d MSP + + + Теперь вы будете уставать + + + Вы невидимы + + + Вы больше не невидимы + + + Теперь вы можете нападать на других игроков + + + Теперь вы можете добывать породу или использовать предметы + + + Вы больше не можете расставлять блоки + + + Теперь вы можете расставлять блоки + + + Анимация персонажа + + + Анимация скина + + + Вы больше не можете добывать породу или использовать предметы + + + Теперь вы можете использовать двери и выключатели + + + Вы больше не можете нападать на мобов + + + Теперь вы можете нападать на монстров + + + Вы больше не можете нападать на других игроков + + + Вы больше не можете использовать двери и выключатели + + + Теперь вы можете использовать контейнеры (например, сундуки) + + + Вы больше не можете использовать контейнеры (например, сундуки) + + + Невидимость + + + Маяки + + + {*T3*}ОБУЧЕНИЕ: МАЯКИ{*ETW*}{*B*}{*B*} +Активированные маяки испускают в небо луч света и накладывают полезные эффекты на ближайших игроков.{*B*} +Чтобы их создать, вам понадобится стекло, обсидиан и звезда Нижнего мира, которую можно получить за победу над Иссушителем.{*B*}{*B*} +Маяки нужно устанавливать таким образом, чтобы днем они оказывались на солнце. Кроме того, они должны стоять на пирамидах из железа, золота, изумруда или алмаза.{*B*} +Материал пирамиды не влияет на эффекты, накладываемые маяком.{*B*}{*B*} +В меню маяка вы можете выбрать 1 основной эффект. Чем выше ваша пирамида, тем больше список доступных эффектов.{*B*} +Маяк на пирамиде минимум из 4 слоев дает либо побочный эффект восстановления, либо усиленный основной эффект.{*B*}{*B*} +Чтобы активировать силу маяка, вы должны пожертвовать изумруд, алмаз, золотой или железный слиток. Положите его в соответствующую ячейку.{*B*} +После этого маяк будет действовать неограниченно долго.{*B*} + + + + Фейерверки + + + Языки + + + Лошади + + + {*T3*}ОБУЧЕНИЕ: ЛОШАДИ{*ETW*}{*B*}{*B*} +Лошадей и ослов можно найти в основном на равнинах. Мулы получаются путем скрещивания ослов и лошадей. Сами мулы не могут размножаться.{*B*} +Взрослых лошадей, ослов и мулов можно оседлать и ехать на них верхом. Однако только лошади могут иметь броню, и только на мулов и ослов можно повесить седельные сумки для транспортировки предметов.{*B*}{*B*} +Лошадей, ослов и мулов нужно сначала приручить. Чтобы приручить лошадь, оседлайте ее и не дайте ей себя сбросить.{*B*} +Как только вокруг лошади появятся сердечки, она станет ручной и больше не будет пытаться сбросить седока. Чтобы управлять лошадью, на нее нужно сначала надеть седло.{*B*}{*B*} +Седла можно купить у крестьян или найти в спрятанных сундуках.{*B*} +На прирученных ослов и мулов можно повесить седельные сумки, прикрепив сундук. Чтобы открыть седельную сумку, оседлайте животное или подкрадитесь к нему.{*B*}{*B*} +Лошадей и ослов (но не мулов) можно разводить, используя золотые яблоки и золотые морковки.{*B*} +Жеребята со временем вырастают во взрослых лошадей. Этот процесс можно ускорить, подкармливая их пшеницей или сеном.{*B*} + + + + {*T3*}ОБУЧЕНИЕ: ФЕЙЕРВЕРКИ{*ETW*}{*B*}{*B*} +Фейерверки - это декоративные предметы. Их можно запускать, держа в руках или пользуясь раздатчиками. Они создаются из бумаги и пороха; можно также добавить одну или несколько звездочек.{*B*} +Цвет и изменение цветов, форма, размер и эффекты (такие как след и мерцание) звездочек можно настраивать, добавляя при создании дополнительные ингредиенты.{*B*}{*B*} +Чтобы создать фейерверк, разложите порох и бумагу в сетке 3x3 над вашим инвентарем.{*B*} +Вы также можете положить несколько звездочек, чтобы добавить их в фейерверк.{*B*} +Чем больше ячеек сетки заполнено порохом, тем выше взлетит фейерверк, прежде чем взорвутся звездочки.{*B*}{*B*} +После этого вы можете забрать готовый фейерверк.{*B*}{*B*} +Чтобы создать звездочку, разложите в сетке порох и соответствующий краситель.{*B*} +- Краситель определяет цвет взрыва звездочки.{*B*} +- Форма звездочки задается путем добавления огненного заряда, золотого самородка, пера или головы.{*B*} +- След или мерцание можно добавить при помощи алмаза или сияющей пыли.{*B*}{*B*} +Создав звездочку, вы можете добавить ей второй цвет с помощью красителя. + + + {*T3*}ОБУЧЕНИЕ: ВЫБРАСЫВАТЕЛИ{*ETW*}{*B*}{*B*} +Находясь под напряжением, выбрасыватели выбрасывают на землю один из находящихся в них предметов. Выбор предмета производится случайным образом. Используйте {*CONTROLLER_ACTION_USE*}, чтобы открыть выбрасыватель и положить в него предметы из своего инвентаря.{*B*} +Если перед выбрасывателем стоит сундук или контейнер другого типа, выброшенный предмет попадет в него. Вы можете создавать длинные цепочки выбрасывателей, чтобы перемещать предметы на большие расстояния. Для этого вам нужно будет создать схему для попеременного включения и выключения выбрасывателей. + + + + При использовании становится картой той части мира, где вы находитесь. Заполняется по мере того, как вы исследуете мир. + + + Выпадает из иссушителей, используется для создания маяков. + + + Воронки + + + {*T3*}ОБУЧЕНИЕ: ВОРОНКИ{*ETW*}{*B*}{*B*} +Воронки нужны для того, чтобы класть предметы в контейнеры и доставать их оттуда. Кроме того, они могут автоматически ловить брошенные в них предметы.{*B*} +Они влияют на варочные стойки, сундуки, распределители, выбрасыватели, вагонетки с воронками и на другие воронки.{*B*}{*B*} +Воронки постоянно пытаются втащить в себя предметы из всех подходящих контейнеров, находящихся над ними. Они также пытаются разместить сохраненные предметы в выходной контейнер.{*B*} +Если воронка находится под напряжением, она деактивируется и перестает перемещать предметы.{*B*}{*B*} +Воронка направлена в сторону перемещения предметов. Если вы хотите повернуть воронку в нужном вам направлении, ставьте ее напротив нужного блока в режиме подкрадывания.{*B*} + + + + Выбрасыватели + + + НЕ ИСПОЛЬЗУЕТСЯ + + + Мгновенное здоровье + + + Мгновенный урон + + + Мощные прыжки + + + Усталость при добыче руды + + + Сила + + + Слабость + + + Тошнота + + + НЕ ИСПОЛЬЗУЕТСЯ + + + НЕ ИСПОЛЬЗУЕТСЯ + + + НЕ ИСПОЛЬЗУЕТСЯ + + + Регенерация + + + Сопротивление + + + Поиск начального значения для генератора мира + + + Создает цветные взрывы при активации. Цвет, эффект, форма и затухание определяются звездочкой, использованной для создания фейерверка. + + + Тип рельсов, которые могут включать или выключать вагонетки с воронками, а также активировать вагонетки с тротилом. + + + Может содержать и ронять предметы или выталкивать их в другие контейнеры при наличии красного заряда. + + + Разноцветные блоки. Получаются окрашиванием обожженной глины. + + + Производит красный заряд. Чем больше предметов лежит на плите, тем сильнее заряд. Ее необходимо нагружать сильнее, чем легкую пластину. + + + Используется как источник красной энергии. Из него можно обратно получить красный камень. + + + Используется для ловли предметов или переноса их в контейнер и наружу. + + + Можно скармливать лошадям, ослам и мулам. Восстанавливает до 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 + + + Голова крипера + + + Череп скелета + + + Череп иссушенного скелета + + + Голова зомби + + + Способ компактно хранить уголь. Можно использовать в качестве топлива в печи. + + + Яд + + + Голод + + + медлительности + + + стремительности + + + Невидимость + + + Дыхание под водой + + + Ночное зрение + + + Слепота + + + урона + + + исцеления + + + тошноты + + + регенерации + + + тупости + + + ускорения + + + слабости + + + силы + + + Устойчивость к огню + + + Насыщение + + + сопротивления + + + прыгучести + + + Иссушение + + + Пополнение здоровья + + + Поглощение + + + + + + II + + + III + + + невидимости + + + IV + + + дыхания под водой + + + устойчив. к огню + + + ночного зрения + + + яда + + + голода + + + Поглощения + + + насыщения + + + пополнения здоровья + + + слепоты + + + гниения + + + Простое + + + Разбавленное + + + Разведенное + + + Прозрачное + + + Мутное + + + Неудобоваримое + + + Жирное + + + Однородное + + + Скверное + + + Безвкусное + + + Громоздкое + + + Слабое + + + Разрывное + + + Обычное + + + Неинтересное + + + Потрясающее + + + Крепкое + + + Очаровательное + + + Элегантное + + + Замысловатое + + + Игристое + + + Противное + + + Грубое + + + Лишенное запаха + + + Мощное + + + Мерзкое + + + Бархатистое + + + Изысканное + + + Густое + + + Веселящее + + + Постепенно восстанавливает здоровье игроков, животных и монстров. + + + Мгновенно уменьшает здоровье игроков, животных и монстров. + + + Делает игроков, животных и монстров неуязвимыми к огню, лаве и дистанционным атакам сполохов. + + + Не обладает собственным эффектом. Используйте в варочной стойке, чтобы создать зелье из нескольких ингредиентов. + + + Едкое + + + Уменьшает скорость игроков, животных и монстров, а также ускорение, длину прыжка и поле зрения игроков. + + + Увеличивает скорость игроков, животных и монстров, а также ускорение, длину прыжка и поле зрения игроков. + + + Увеличивает урон, который наносят игроки и монстры. + + + Мгновенно увеличивает здоровье игроков, животных и монстров. + + + Уменьшает урон, который наносят игроки и монстры. + + + Основной ингредиент всех зелий. Используйте его в варочной стойке, чтобы создать зелье. + + + Отвратительное + + + Вонючее + + + Сокрушение + + + Острота + + + Постепенно уменьшает здоровье игроков, животных и монстров. + + + Урон при атаке + + + Ударная волна + + + Гроза членистоногих + + + Скорость + + + Подкрепления зомби + + + Сила прыжка лошади + + + При применении: + + + Сопротивление отбрасыванию + + + Дистанция следования монстров + + + Максимум здоровья + + + Легкое прикосновение + + + Эффективность + + + Сродство с водой + + + Удача + + + Грабеж + + + Прочность + + + Защита от огня + + + Защита + + + Огонь + + + Падающее перо + + + Дыхание + + + Защита от стрел + + + Защита от взрывов + + + IV + + + V + + + VI + + + Удар + + + VII + + + III + + + Пламя + + + Сила + + + Бесконечность + + + II + + + I + + + Активируется, когда движущийся объект задевает присоединенную нить. + + + Активирует присоединенный натяжной переключатель, когда ее задевает движущийся объект. + + + Компактный вариант хранения изумрудов. + + + Похож на обычный сундук, но с одним исключением: все вещи, положенные в сундук Края, можно достать из любого другого сундука Края, принадлежащего игроку - даже если они находятся в разных измерениях. + + + IX + + + VIII + + + Можно добыть железной или более прочной киркой, чтобы получить изумруды. + + + X + + + Восстанавливает 2{*ICON_SHANK_01*}, можно превратить в золотую морковку. Можно высаживать на грядки. + + + Используется как украшение. В него можно сажать цветы, саженцы, кактусы и грибы. + + + Стена из булыжника. + + + Восстанавливает 0,5{*ICON_SHANK_01*}. Можно запечь в печи или высадить на грядку. + + + Можно расплавить в печи, чтобы получить адский кварц. + + + С ее помощью можно чинить оружие, инструменты и доспехи. + + + Можно использовать для торговли с крестьянами. + + + Используется как украшение. + + + Восстанавливает 4{*ICON_SHANK_01*}. + + + Восстанавливает 1{*ICON_SHANK_01*}. Этой едой можно отравиться. + + + Используется для управления свиньей при езде верхом. + + + Восстанавливает 3{*ICON_SHANK_01*}. Готовится из картошки в печи. + + + Восстанавливает 3{*ICON_SHANK_01*}. Создается из морковки и золотых самородков. + + + Используется при зачаровывании оружия, инструментов или доспехов на наковальне. + + + Добывается из руды адского кварца. Может использоваться для создания кварцевого блока. + + + Картошка + + + Печеная картошка + + + Морковка + + + Создается из шерсти, служит украшением. + + + Изумруд + + + Цветочный горшок + + + Тыквенный пирог + + + Зачарованная книга + + + Ядовитая картошка + + + Золотая морковка + + + Морковка на палке + + + Натяжной переключатель + + + Нить + + + Адский кварц + + + Изумрудная руда + + + Сундук Края + + + Стена из замш. булыжника + + + Изумрудный блок + + + Стена из булыжника + + + Картошка + + + Цветочный горшок + + + Морковки + + + Слегка поврежденная наковальня + + + Наковальня + + + Наковальня + + + Кварцевый блок + + + Почти сломанная наковальня + + + Руда адского кварца + + + Кварцевая лестница + + + Резной кварц. блок + + + Кварцевый столб + + + Красный ковер + + + Ковер + + + Черный ковер + + + Синий ковер + + + Зеленый ковер + + + Коричневый ковер + + + Фиолетовый ковер + + + Бирюзовый ковер + + + Светло-серый ковер + + + Серый ковер + + + Светло-зеленый ковер + + + Розовый ковер + + + Голубой ковер + + + Желтый ковер + + + Пурпурный ковер + + + Оранжевый ковер + + + Белый ковер + + + Резной песчаник + + + {*PLAYER*} погиб, пытаясь нанести урон игроку {*SOURCE*} + + + Гладкий песчаник + + + {*PLAYER*} был раздавлен упавшей наковальней. + + + {*PLAYER*} был раздавлен упавшим блоком. + + + {*PLAYER*} телепортировал вас к себе + + + {*PLAYER*} был телепортирован к игроку {*DESTINATION*} + + + Шипы + + + {*PLAYER*} телепортировался к вам + + + Делает темные места светлыми, даже под водой. + + + Плита из кварца + + + Делает игроков, животных и монстров невидимыми. + + + Ремонт и переименов. + + + Слишком дорого! + + + Стоимость зачаровывания: %d + + + У вас есть: + + + Переименовать + + + {*VILLAGER_TYPE*} предлагает %s + + + Нуж. для торговли + + + Торговля + + + Ремонт + + + + Это окно наковальни. Здесь вы можете чинить и присваивать имена оружию, доспехам или инструментам, а также накладывать на них чары. Все это делается за счет уровней опыта. + + + + Окраска ошейника + + + + Чтобы начать работать с предметом, положите его в первую ячейку. + + + + +{*B*} + Нажмите{*CONTROLLER_VK_A*}, чтобы узнать больше о том, как использовать наковальню.{*B*} + Нажмите{*CONTROLLER_VK_B*}, если вы уже знаете, как использовать наковальню. + + + + + Кроме того, во вторую ячейку можно положить точно такой же предмет - это позволит скомбинировать два предмета. + + + + + Если во вторую ячейку положить правильный материал (например, железные слитки для поврежденного железного меча), то в третьей появится отремонтированный предмет. + + + + + Под третьей ячейкой вы увидите, сколько уровней опыта вам придется потратить. Если у вас нет достаточного количества уровней, вы не сможете произвести ремонт. + + + + + Чтобы зачаровать предмет с помощью наковальни, положите зачарованную книгу во вторую ячейку. + + + + + Если вы заберете отремонтированный предмет из третьей ячейки, ваш уровень опыта уменьшится на соответствующее значение, а предметы из первой и второй ячеек пропадут из вашего инвентаря. + + + + + Чтобы переименовать предмет, измените текст в соответствующем поле. + + + + +{*B*} + Нажмите{*CONTROLLER_VK_A*}, чтобы узнать больше о наковальне.{*B*} + Нажмите{*CONTROLLER_VK_B*}, если вы уже все знаете о наковальне. + + + + + Здесь расположена наковальня и сундук, в котором лежат инструменты и оружие. Вы можете поработать над ними. + + + + + Зачарованные книги можно найти в сундуках в подземельях. Кроме того, их можно создать из обычных книг с помощью колдовского стола. + + + + + С помощью наковальни вы можете ремонтировать оружие и предметы, восстанавливая их прочность. Кроме того, вы можете переименовать их или наложить чары с помощью зачарованных книг. + + + + + Тип необходимой работы, ценность предмета, количество наложенных чар, количество предыдущей работы - все это влияет на стоимость ремонта. + + + + + Пользуясь наковальней, вы теряете уровни опыта, а также можете повредить ее. + + + + + В сундуке неподалеку вы найдете поврежденные кирки, материалы, бутыли зачаровывания и зачарованные книги. Поэкспериментируйте с ними. + + + + + Переименование предмета меняет его название, которое видят все игроки, и также навсегда уменьшает затраты, связанные с предыдущей работой. + + + + +{*B*} + Нажмите{*CONTROLLER_VK_A*}, чтобы узнать больше о том, как торговать.{*B*} + Нажмите{*CONTROLLER_VK_B*}, если вы уже знаете, как торговать. + + + + + Это окно торговли. Здесь можно обмениваться товарами с крестьянином. + + + + + Если у вас нет необходимых предметов, товары будут отображаться красными. + + + + + Все варианты торговли, интересные крестьянину, показаны в верхней части окна. + + + + + Вы можете увидеть, сколько предметов необходимо для совершения сделки, в двух ячейках слева. + + + + + Количество и тип предметов, которые вы отдаете крестьянину, показаны в двух ячейках слева. + + + + + Здесь неподалеку живет крестьянин и стоит сундук. В сундуке вы найдете бумагу, которую сможете обменять на другие предметы. + + + + + Нажмите{*CONTROLLER_VK_A*}, чтобы обменять предметы, нужные крестьянину, на то, что он предлагает. + + + + + Игроки могут продавать предметы из инвентаря крестьянам. + + + + +{*B*} + Нажмите{*CONTROLLER_VK_A*}, чтобы узнать больше о торговле.{*B*} + Нажмите{*CONTROLLER_VK_B*}, если вы уже все знаете о торговле. + + + + + После нескольких сделок набор товаров у крестьянина случайным образом обновится. + + + + + От профессии крестьянина зависит список товаров, которые он выставляет на продажу. + + + + + Часто продаваемые товары могут на время исчезнуть, но крестьянин всегда будет готов совершить как минимум одну сделку. + + + + + Возьмите бумагу из сундука и попробуйте поторговать с крестьянином. + + + + + Здесь неподалеку есть два сундука Края. + + + + +{*B*} + Нажмите{*CONTROLLER_VK_A*}, чтобы узнать больше о сундуках Края.{*B*} + Нажмите{*CONTROLLER_VK_B*}, если вы уже знаете, что такое сундуки Края. + + + + + Все сундуки Края в мире соединены между собой, даже если они находятся в разных измерениях. Предметы, положенные в один сундук Края, можно достать из другого такого сундука. + + + + + Впрочем, содержимое сундука Края для каждого игрока свое. + + + + + Игроки могут хранить предметы в сундуке Края и доставать их из других сундуков Края в разных концах света. Попробуйте положить какие-нибудь предметы в любой сундук Края. + + + + Восстанавливает 2{*ICON_SHANK_01*}, дает регенерацию здоровья на 30 секунд и на 5 минут дает устойчивость к огню и сопротивляемость урону. Создается из яблока и золотых блоков. + + + Можно телепортироваться + + + Телепортация + + + Телепортировать к игроку + + + Телепортировать ко мне + + + Можно отключить утомление + + + Можно стать невидимым + + + Теперь вы можете стать невидимым + + + Вы больше не можете становиться невидимым + + + Теперь вы можете летать + + + Вы больше не можете летать + + + Теперь вы можете отключить утомление + + + Вы больше не можете отключать утомление + + + Теперь вы можете телепортироваться + + + Вы больше не можете телепортироваться + + + {*T3*}ОБУЧЕНИЕ: НАКОВАЛЬНЯ{*ETW*}{*B*}{*B*} +На наковальне вы можете починить, зачаровать или переименовать предмет, потратив на это очки опыта.{*B*} +Можно поменять название любого предмета, однако починить или наложить чары с помощью зачарованной книги можно только на предметы, имеющие прочность.{*B*} +Чтобы починить предмет, положите его в первую ячейку слева. Во вторую ячейку вы должны положить правильные материалы (например, железные слитки для ремонта железного меча) или другой такой же предмет.{*B*} +Комбинировать предметы эффективнее с помощью наковальни. Кроме того, если на любой из первоначальных предметов были наложены чары, они могут перенестись на конечный предмет.{*B*} +На предметы можно накладывать чары, комбинируя их с зачарованными книгами на наковальне (но только если чары в книге подходят для данного предмета). Зачарованные книги можно найти в сундуках в подземельях. Кроме того, их можно создать из обычных книг с помощью колдовского стола.{*B*} +При каждом использовании с некоторой вероятностью наковальня может получить повреждения. Со временем она может разрушиться целиком.{*B*} + + + {*T3*}ОБУЧЕНИЕ: ТОРГОВЛЯ{*ETW*}{*B*}{*B*} +Вы можете обмениваться товарами с крестьянами. У каждого из крестьян есть профессия: они могут быть фермерами, мясниками, кузнецами, библиотекарями или священниками. От профессии зависит список товаров, которые они готовы будут предложить.{*B*} +В окне торговли вы можете увидеть все возможные варианты сделок, предлагаемые крестьянином. Эти варианты меняются после каждой сделки. Если вы будете покупать какой-то товар слишком часто, то он может на время оказаться недоступным.{*B*} +Как правило, торговля - это покупка или продажа некоторого количества вещей за изумруды.{*B*} +Если у вас нет необходимых для сделки предметов, они будут отображаться красными.{*B*} + + + + {*T3*}ОБУЧЕНИЕ: СУНДУК КРАЯ{*ETW*}{*B*}{*B*} +Все сундуки Края в мире соединены между собой. Предметы, положенные в один из таких сундуков, можно достать из любого другого - впрочем, игроки могут видеть только те предметы, которые сами туда положили. Сундуки Края позволяют игрокам хранить предметы в одном месте и иметь к ним доступ из разных концов света. + + + + Фермер + + + Библиотекарь + + + Священник + + + Кузнец + + + Мясник + + + Крестьяне обычно живут в деревнях. Они могут предложить игроку товары на продажу, соответствующие их профессии. + + + Большой сундук + + + + Вы также можете создавать зачарованные книги на колдовском столе. Впоследствии с помощью этих книг можно наложить чары на предмет - для этого вам пригодится наковальня. + + + + + Натяжные переключатели будут снабжать сеть питанием, пока что-нибудь задевает присоединенную к ним нить. + + + + + У прирученного волка на шее всегда будет находиться ошейник. Его цвет можно сменить с помощью красителя. + + + + Вы можете выращивать морковку и картошку, высаживая их в землю. Собирать их следует после того, как они становятся видны над землей. + + + + Кроме того, свинью можно оседлать, после чего на ней смогут ездить игроки. Чтобы управлять свиньей, вам понадобится морковка на палке. + + + + + При необходимости вы можете медленно двигать вагонетку с помощью {*CONTROLLER_ACTION_MOVE*}. Это поможет вам добраться до рельсов под напряжением и запустить вагонетку. + + + + Вы не можете присоединиться к этой игре: режим разделенного экрана поддерживается только при запуске игры в высоком разрешении. Если хотите присоединиться, отключите всех остальных игроков. + + + Вылечить + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/ru-RU/stringsLeaderboards.xml b/Minecraft.Client/PSVitaMedia/loc/ru-RU/stringsLeaderboards.xml new file mode 100644 index 00000000..6ce7b6c0 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/ru-RU/stringsLeaderboards.xml @@ -0,0 +1,48 @@ + + + + Убийства (легкий ур. сложности) + + + Убийства (обычный ур. сложности) + + + Убийства (высокий ур. сложности) + + + Добытые блоки (мирный ур. сложн.) + + + Добытые блоки (легкий ур. сложн.) + + + Добытые блоки (обычн. ур. сложн.) + + + Добытые блоки (высокий ур. сложн.) + + + Фермерство (мирный ур. сложн.) + + + Фермерство (легкий ур. сложности) + + + Фермерство (обычный ур. сложн.) + + + Фермерство (высокий ур. сложн.) + + + Путешествия (мирный ур. сложн.) + + + Путешествия (легкий ур. сложн.) + + + Путешествия (обычный ур. сложн.) + + + Путешествия (высокий ур. сложн.) + + \ 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 new file mode 100644 index 00000000..1eb76160 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/ru-RU/stringsPlatformSpecific.xml @@ -0,0 +1,245 @@ + + + + Вы хотите войти в "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 + + + NOT USED + + + {*T3*}ОБУЧЕНИЕ: ТВОРЧЕСТВО{*ETW*}{*B*}{*B*} +Интерфейс режима "Творчество" позволяет поместить в инвентарь любой объект в игре, избавляя от необходимости добывать или создавать его. +Предмет в инвентаре не исчезнет, если его разместят в игровом мире или используют. Это позволяет сосредоточиться на строительстве, а не на добыче ресурсов.{*B*} +Если вы создаете, сохраняете или загружаете мир в режиме "Творчество", в нем будут отключены призы и обновления списка лидеров, даже если затем вы снова загрузите мир в режиме "Выживание".{*B*} +Чтобы летать в режиме "Творчество", быстро дважды нажмите{*CONTROLLER_ACTION_JUMP*}. Чтобы выйти из режима полета, повторите это действие. Чтобы ускориться в полете, быстро дважды наклоните вперед {*CONTROLLER_ACTION_MOVE*}. В полете удерживайте{*CONTROLLER_ACTION_JUMP*}, чтобы лететь вверх, {*CONTROLLER_ACTION_SNEAK*}, чтобы лететь вниз, или используйте{*CONTROLLER_ACTION_DPAD_UP*}, чтобы лететь вверх, и{*CONTROLLER_ACTION_DPAD_DOWN*}, чтобы лететь вниз, +{*CONTROLLER_ACTION_DPAD_LEFT*}, чтобы двигаться влево, и {*CONTROLLER_ACTION_DPAD_RIGHT*}, чтобы двигаться вправо. + + + Чтобы летать, быстро дважды нажмите{*CONTROLLER_ACTION_JUMP*}. Если нужно выйти из режима полета, повторите это действие. Чтобы ускориться в полете, быстро дважды наклоните вперед {*CONTROLLER_ACTION_MOVE*}. +Во время полета наклоните вниз и удерживайте{*CONTROLLER_ACTION_JUMP*}, чтобы лететь вверх, {*CONTROLLER_ACTION_SNEAK*}, чтобы лететь вниз, или используйте кнопки направлений, чтобы лететь вверх, вниз, вправо или влево. + + + "NOT USED" + + + Если создать, загрузить или сохранить мир в режиме "Творчество", призы и обновления списка лидеров в нем будут отключены, даже если затем загрузить мир в режиме "Выживание". Продолжить? + + + Этот мир был сохранен в режиме "Творчество", поэтому призы и обновления списка лидеров в нем будут отключены. Продолжить? + + + "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" потеряно. Сейчас вы вернетесь в главное меню. + + + Соединение с "PSN" потеряно. + + + Этот мир был сохранен в режиме "Творчество", поэтому призы и обновления списка лидеров в нем будут отключены. + + + Если создать, загрузить или сохранить мир со включенными привилегиями хоста, призы и обновления списка лидеров в нем будут отключены, даже если затем загрузить игру, отключив эти параметры. Продолжить? + + + Это пробная версия игры Minecraft: PlayStation®Vita Edition. Будь у вас полная версия, вы бы только что получили приз! +Получите доступ к полной версии, чтобы наслаждаться Minecraft: PlayStation®Vita Edition и играть с друзьями со всего мира посредством "PSN". +Получить доступ к полной версии игры? + + + Игроки-гости не могут получить доступ к полной версии игры. Пожалуйста, зайдите под своей учетной записью в Sony Entertainment Network. + + + Сетевой идентификатор + + + Это пробная версия игры Minecraft: PlayStation®Vita Edition. Будь у вас полная версия, вы бы только что получили тему! +Получите доступ к полной версии, чтобы наслаждаться Minecraft: PlayStation®Vita Edition и играть с друзьями со всего мира посредством "PSN". +Получить доступ к полной версии игры? + + + Это пробная версия игры Minecraft: PlayStation®Vita Edition. Если вы хотите принять это приглашение, необходимо получить доступ к полной версии. +Получить доступ к полной версии игры? + + + Версия файла сохранения в области переноса сохранений пока не поддерживается Minecraft: PlayStation®Vita Edition. + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/ru-RU/stringsRichPresence.xml b/Minecraft.Client/PSVitaMedia/loc/ru-RU/stringsRichPresence.xml new file mode 100644 index 00000000..923cf53e --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/ru-RU/stringsRichPresence.xml @@ -0,0 +1,66 @@ + + + + {GAME_STATE} + + + Бездействует + + + В меню + + + Играет с друзьями - {GAME_STATE} + + + С друзьями офлайн - {GAME_STATE} + + + Играет один - {GAME_STATE} + + + Играет один вне сети - {GAME_STATE} + + + Наслаждается видом! + + + Едет на свинье + + + В вагонетке + + + В лодке + + + Ловит рыбу + + + Создает предметы + + + Кует + + + В преисподней + + + Слушает музыку + + + Изучает карту + + + Накладывает чары + + + Варит зелье + + + Работает с наковальней + + + Встречается с соседями + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/stringsDynafont.xml b/Minecraft.Client/PSVitaMedia/loc/stringsDynafont.xml new file mode 100644 index 00000000..dca31ec2 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/stringsDynafont.xml @@ -0,0 +1,7 @@ + + + + DynaFont developed by DynaComware. + + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/stringsGeneric.xml b/Minecraft.Client/PSVitaMedia/loc/stringsGeneric.xml new file mode 100644 index 00000000..36b521dd --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/stringsGeneric.xml @@ -0,0 +1,8814 @@ + + + New Downloadable Content is available! Access it from the Minecraft Store button on the Main Menu. + + + + You can change the look of your character with a Skin Pack from the Minecraft Store. Select 'Minecraft Store' on the Main Menu to see what's available. + + + + Alter the gamma settings to make the game brighter or darker. + + + + If you set the game difficulty to Peaceful, your health will automatically regenerate, and no monsters will come out at night! + + + + Feed a bone to a wolf to tame it. You can then make it sit or follow you. + + + + You can drop items when in the Inventory menu by moving the cursor off the menu and pressing{*CONTROLLER_VK_A*} + + + + Sleeping in a bed at night will fast forward the game to dawn, but all players in a multiplayer game need to sleep in beds at the same time. + + + + Harvest pork chops from pigs, and cook and eat them to regain health. + + + + Harvest leather from cows, and use it to make armor. + + + + If you have an empty bucket, you can fill it with milk from a cow, or water, or lava! + + + + Use a hoe to prepare areas of ground for planting. + + + + Spiders won't attack you during the day - unless you attack them. + + + + Digging soil or sand with a spade is faster than with your hand! + + + + Eating cooked pork chops gives more health than eating raw pork chops. + + + + Make some torches to light up areas at night. Monsters will avoid the areas around these torches. + + + + Get to destinations faster with a minecart and rail! + + + + Plant some saplings and they'll grow into trees. + + + + Pigmen won't attack you, unless you attack them. + + + + You can change your game spawn point and skip to dawn by sleeping in a bed. + + + + Hit those fireballs back at the Ghast! + + + + Building a portal will allow you to travel to another dimension - The Nether. + + + + Press{*CONTROLLER_VK_B*} to drop the item currently in your hand! + + + + Use the right tool for the job! + + + + If you can't find any coal for your torches, you can always make charcoal from trees in a furnace. + + + + Digging straight down or straight up is not a great idea. + + + + Bonemeal (crafted from a Skeleton bone) can be used as a fertilizer, and can make things grow instantly! + + + + Creepers explode when they get close to you! + + + + Obsidian is created when water hits a lava source block. + + + + Lava can take minutes to disappear COMPLETELY when the source block is removed. + + + + Cobblestone is resistant to Ghast fireballs, making it useful for guarding portals. + + + + Blocks that can be used as a light source will melt snow and ice. This includes torches, glowstone, and Jack-O-Lanterns. + + + + Take caution when building structures made of wool in open air, as lightning from thunderstorms can set wool on fire. + + + + A single bucket of lava can be used in a furnace to smelt 100 blocks. + + + + The instrument played by a note block depends on the material beneath it. + + + + Zombies and Skeletons can survive daylight if they are in water. + + + + Attacking a wolf will cause any wolves in the immediate vicinity to turn hostile and attack you. This trait is also shared by Zombie Pigmen. + + + + Wolves cannot enter the Nether. + + + + Wolves won't attack Creepers. + + + + Chickens lay an egg every 5 to 10 minutes. + + + + Obsidian can only be mined with a diamond pickaxe. + + + + Creepers are the easiest obtainable source of gunpowder. + + + + Placing two chests side by side will make one large chest. + + + + Tame wolves show their health with the position of their tail. Feed them meat to heal them. + + + + Cook cactus in a furnace to get green dye. + + + + Read the What's New section in the How To Play menus to see the latest update information about the game. + + + + Stackable fences are in the game now! + + + + Some animals will follow you if you have wheat in your hand. + + + + If an animal can't move more than 20 blocks in any direction, it won't despawn. + + + + Music by C418! + + + + Notch has over a million followers on twitter! + + + + Not all Swedish people have blonde hair. Some, like Jens from Mojang, even have ginger hair! + + + + There will be an update to this game eventually! + + + + Who is Notch? + + + + Mojang has more awards than staff! + + + + Some famous people play Minecraft! + + + + deadmau5 likes Minecraft! + + + + Do not look directly at the bugs. + + + + Creepers were born from a coding bug. + + + + Is it a chicken or is it a duck? + + + + Were you at Minecon? + + + + No-one at Mojang has ever seen junkboy's face. + + + + Did you know there's a Minecraft Wiki? + + + + Mojang's new office is cool! + + + + Minecon 2013 was in Orlando, Florida, USA! + + + + .party() was excellent! + + + + Always assume rumors are false, rather than assuming they're true! + + + + {*T3*}HOW TO PLAY : BASICS{*ETW*}{*B*}{*B*} +Minecraft is a game about placing blocks to build anything you can imagine. At night monsters come out, make sure to build a shelter before that happens.{*B*}{*B*} +Use{*CONTROLLER_ACTION_LOOK*} to look around.{*B*}{*B*} +Use{*CONTROLLER_ACTION_MOVE*} to move around.{*B*}{*B*} +Press{*CONTROLLER_ACTION_JUMP*} to jump.{*B*}{*B*} +Push{*CONTROLLER_ACTION_MOVE*} forward twice in rapid succession to sprint. While you hold {*CONTROLLER_ACTION_MOVE*} forward, the character will continue to sprint unless they run out of sprint time or the Food Bar has less than{*ICON_SHANK_03*}.{*B*}{*B*} +Hold{*CONTROLLER_ACTION_ACTION*} to mine and chop using your hand or whatever you are holding. You may need to craft a tool to mine some blocks.{*B*}{*B*} +If you are holding an item in your hand, use{*CONTROLLER_ACTION_USE*} to use that item, or press{*CONTROLLER_ACTION_DROP*} to drop that item. + + + + {*T3*}HOW TO PLAY : HUD{*ETW*}{*B*}{*B*} +The HUD shows information about your status; your health, your remaining oxygen when you are under water, your hunger level (you need to eat to replenish this), and your armor if you are wearing any. If you lose some health, but have a food bar with 9 or more{*ICON_SHANK_01*} in it, your health will automatically replenish. Eating food will replenish your food bar.{*B*} +The Experience Bar is also shown here, with a numeric value to show your Experience Level, and the bar indicating how many Experience Points are required to increase your Experience Level. Experience Points are gained by collecting the Experience Orbs dropped by mobs when they die, mining certain block types, breeding animals, fishing, and smelting ores in a furnace.{*B*}{*B*} +It also shows the items that are available to use. Use{*CONTROLLER_ACTION_LEFT_SCROLL*} and{*CONTROLLER_ACTION_RIGHT_SCROLL*} to change the item in your hand. + + + + {*T3*}HOW TO PLAY : INVENTORY{*ETW*}{*B*}{*B*} +Use{*CONTROLLER_ACTION_INVENTORY*} to view your inventory.{*B*}{*B*} +This screen shows items available for use in your hand, and all the other items that you are carrying. Your armor is also shown here.{*B*}{*B*} +Use{*CONTROLLER_MENU_NAVIGATE*} to move the pointer. Use{*CONTROLLER_VK_A*} to pick an item under the pointer. If there is more than one item here this will pick them all up, or you can use{*CONTROLLER_VK_X*} to pick up just half of them.{*B*}{*B*} +Move the item with the pointer over another space in the inventory and place it there using{*CONTROLLER_VK_A*}. With multiple items on the pointer, use{*CONTROLLER_VK_A*} to place them all, or{*CONTROLLER_VK_X*} to place just one.{*B*}{*B*} +If an item you are over is armor, you will be shown a tooltip to enable a quick move of this to the right armor slot in the inventory.{*B*}{*B*} +It is possible to change the color of your Leather Armor by dying it, you can do this in the inventory menu by holding the dye in your pointer, then pressing{*CONTROLLER_VK_X*} whilst the pointer is over the piece you wish to dye. + + + + + {*T3*}HOW TO PLAY : CHEST{*ETW*}{*B*}{*B*} +Once you have crafted a Chest, you can place this in the world and then use it with{*CONTROLLER_ACTION_USE*} to store items from your inventory.{*B*}{*B*} +Use the pointer to move items between your inventory and the chest.{*B*}{*B*} +Items in the chest will be stored there for you to swap back into your inventory again later. + + + + + {*T3*}HOW TO PLAY : LARGE CHEST{*ETW*}{*B*}{*B*} +Two chests placed next to each other will be combined to form a Large Chest. This can store even more items.{*B*}{*B*} +It is used in the same way as a normal chest. + + + + + {*T3*}HOW TO PLAY : CRAFTING{*ETW*}{*B*}{*B*} +In the Crafting interface, you can combine items from your inventory to create new types of items. Use{*CONTROLLER_ACTION_CRAFTING*} to open the crafting interface.{*B*}{*B*} +Scroll through the tabs at the top using{*CONTROLLER_VK_LB*} and{*CONTROLLER_VK_RB*} to select the type of item you wish to craft, then use{*CONTROLLER_MENU_NAVIGATE*} to select the item to craft.{*B*}{*B*} +The crafting area shows the items required to craft the new item. Press{*CONTROLLER_VK_A*} to craft the item and place it in your inventory. + + + + + {*T3*}HOW TO PLAY : CRAFTING TABLE{*ETW*}{*B*}{*B*} +You can craft larger items using a Crafting Table.{*B*}{*B*} +Place the table in the world and press{*CONTROLLER_ACTION_USE*} to use it.{*B*}{*B*} +Crafting on a table works in the same way as basic crafting, but you have a larger crafting area, and a more varied selection of items to craft. + + + + + {*T3*}HOW TO PLAY : FURNACE{*ETW*}{*B*}{*B*} +A Furnace allows you to change items by firing them. For example, you can turn iron ore into iron ingots in the furnace.{*B*}{*B*} +Place the furnace in the world and press{*CONTROLLER_ACTION_USE*} to use it.{*B*}{*B*} +You need to put some fuel into the bottom of the furnace, and the item to be fired in the top. The furnace will then fire up and start working.{*B*}{*B*} +When your items have been fired, you can move them from the output area into your inventory.{*B*}{*B*} +If an item you are over is an ingredient or fuel for the furnace, you will be shown tooltips to enable a quick move of this to the furnace. + + + + + {*T3*}HOW TO PLAY : DISPENSER{*ETW*}{*B*}{*B*} +A Dispenser is used to shoot out items. You will need to place a switch, for example a lever, next to the dispenser to trigger it.{*B*}{*B*} +To fill the dispenser with items press{*CONTROLLER_ACTION_USE*}, then move the items that you want to dispense from your inventory into the dispenser.{*B*}{*B*} +Now when you use the switch, the dispenser will shoot out an item. + + + + + {*T3*}HOW TO PLAY : BREWING{*ETW*}{*B*}{*B*} +Brewing potions requires a Brewing Stand, which can be built at a crafting table. Every potion starts off with a bottle of water, which is made by filling a Glass Bottle with water from a Cauldron, or a water source.{*B*} +A Brewing Stand has three slots for bottles, so can make three potions at the same time. One ingredient can be used over all three bottles, so always brew three potions at the same time to best use your resources.{*B*} +Putting a potion ingredient in the top position at the Brewing Stand will make a base potion after a short time. This doesn't have any effect by itself, but brewing another ingredient with this base potion will give you a potion with an effect.{*B*} +Once you have this potion you can add a third ingredient to make the effect last longer (using Redstone Dust), be more intense (using Glowstone Dust), or turn into a harmful potion (using a Fermented Spider Eye).{*B*} +You can also add gunpowder to any potion to turn it into a Splash Potion, which can then be thrown. The thrown Splash Potion will cause the potion effect to apply over the area it lands in.{*B*} + +The source ingredients for potions are :-{*B*}{*B*} +* {*T2*}Nether Wart{*ETW*}{*B*} +* {*T2*}Spider Eye{*ETW*}{*B*} +* {*T2*}Sugar{*ETW*}{*B*} +* {*T2*}Ghast Tear{*ETW*}{*B*} +* {*T2*}Blaze Powder{*ETW*}{*B*} +* {*T2*}Magma Cream{*ETW*}{*B*} +* {*T2*}Glistering Melon{*ETW*}{*B*} +* {*T2*}Redstone Dust{*ETW*}{*B*} +* {*T2*}Glowstone Dust{*ETW*}{*B*} +* {*T2*}Fermented Spider Eye{*ETW*}{*B*}{*B*} + +You'll need to experiment with combinations of ingredients in order to find out all the different potions you can make. + + + + + {*T3*}HOW TO PLAY : ENCHANTING{*ETW*}{*B*}{*B*} +The Experience Points collected when a mob dies, or when certain blocks are mined or smelted in a furnace, can be used to enchant some tools, weapons, armor and books.{*B*} +When a Sword, Bow, Axe, Pickaxe, Shovel, Armor or Book is placed in the slot below the book in the Enchantment Table, the three buttons to the right of the slot will display some enchantments and their Experience Levels costs.{*B*} +If you do not have enough Experience Levels to use some of these, the cost will appear in red, otherwise it will be shown in green.{*B*}{*B*} +The actual enchantment applied is randomly selected based on the cost displayed.{*B*}{*B*} +If the Enchantment Table is surrounded by Bookshelves (up to a maximum of 15 Bookshelves), with a one block gap between the Bookcase and the Enchantment Table, the potency of the enchantments will be increased, and arcane glyphs will be seen coming from the book on the Enchantment Table.{*B*}{*B*} +All the ingredients for an Enchantment Table can be found within the villages in a world, or by mining and cultivation of the world.{*B*}{*B*} +Enchanted Books are used at the Anvil to apply enchantments to items. This gives you more control over which enchantments you would like on your items.{*B*} + + + + + {*T3*}HOW TO PLAY : FARMING ANIMALS{*ETW*}{*B*}{*B*} +If you want to keep your animals in the one place, build a fenced area of less than 20x20 blocks and have your animals inside it. This ensures they will still be there when you come back to see them. + + + + + {*T3*}HOW TO PLAY : BREEDING ANIMALS{*ETW*}{*B*}{*B*} +The animals in Minecraft can breed, and will produce baby versions of themselves!{*B*} +To get the animals to breed, you will need to feed them with the right food to get them to go into 'Love Mode'.{*B*} +Feed Wheat to a cow, mooshroom or sheep, Carrots to a pig, Wheat Seeds or Nether Wart to a chicken, or any kind of meat to a wolf, and they'll start looking for another animal of the same species near them that is also in Love Mode.{*B*} +When two animals of the same species meet, and both are in Love Mode, they will kiss for a few seconds, and then a baby animal will appear. The baby animal will follow their parents for a while before growing into a full sized animal itself.{*B*} +After being in Love Mode, an animal will not be able to enter it again for about five minutes.{*B*} +There is a limit on the number of animals it is possible to have in a world, so you may find the animals don't breed when you have a lot of them. + + + + {*T3*}HOW TO PLAY : NETHER PORTAL{*ETW*}{*B*}{*B*} +A Nether Portal allows the player to travel between the Overworld and the Nether world. The Nether world can be used to fast-travel in the Overworld - traveling one block distance in the Nether is equivalent to traveling 3 blocks in the Overworld, so when you build a portal in the Nether world and exit through it, you will be 3 times further away from your entry point.{*B*}{*B*} +A minimum of 10 Obsidian blocks are required to build the portal, and the portal needs to be 5 blocks high by 4 blocks wide by 1 block deep. Once the portal frame is built, the space inside the frame needs to be set on fire to activate it. This can be done using the Flint and Steel item, or the Fire Charge item.{*B*}{*B*} +Examples of portal construction are shown in the picture to the right. + + + + + {*T3*}HOW TO PLAY : BANNING LEVELS{*ETW*}{*B*}{*B*} +If you find offensive content within a level you are playing, you can choose to add the level to your Banned Levels list. +If you would like to do this, bring up the Pause menu, then press{*CONTROLLER_VK_RB*} to select the Ban Level tooltip. +When you attempt to join this level in future, you will be notified that the level is in your Banned Levels list, and given the option to remove it from the list and continue into the level, or back out. + + + + {*T3*}HOW TO PLAY : HOST AND PLAYER OPTIONS{*ETW*}{*B*}{*B*} + +{*T1*}Game Options{*ETW*}{*B*} +When loading or creating a world, you can press the "More Options" button to enter a menu that allows more control over your game.{*B*}{*B*} + + {*T2*}Player vs Player{*ETW*}{*B*} + When enabled, players can inflict damage on other players. This option only affects Survival mode.{*B*}{*B*} + + {*T2*}Trust Players{*ETW*}{*B*} + When disabled, players joining the game are restricted in what they can do. They are not able to mine or use items, place blocks, use doors and switches, use containers, attack players or attack animals. You can change these options for a specific player using the in-game menu.{*B*}{*B*} + + {*T2*}Fire Spreads{*ETW*}{*B*} + When enabled, fire may spread to nearby flammable blocks. This option can also be changed from within the game.{*B*}{*B*} + + {*T2*}TNT Explodes{*ETW*}{*B*} + When enabled, TNT will explode when detonated. This option can also be changed from within the game.{*B*}{*B*} + + {*T2*}Host Privileges{*ETW*}{*B*} + When enabled, the host can toggle their ability to fly, disable exhaustion, and make themselves invisible from the in-game menu. {*DISABLES_ACHIEVEMENTS*}{*B*}{*B*} + + {*T2*}Daylight Cycle{*ETW*}{*B*} + When disabled, the time of day will not change.{*B*}{*B*} + + {*T2*}Keep Inventory{*ETW*}{*B*} + When enabled, players will keep their inventory when they die.{*B*}{*B*} + + {*T2*}Mob Spawning{*ETW*}{*B*} + When disabled, mobs will not spawn naturally.{*B*}{*B*} + + {*T2*}Mob Griefing{*ETW*}{*B*} + When disabled, prevents monsters and animals from changing blocks (for example, Creeper explosions won't destroy blocks and Sheep won't remove Grass) or picking up items.{*B*}{*B*} + + {*T2*}Mob Loot{*ETW*}{*B*} + When disabled, monsters and animals will not drop loot (for example, Creepers won't drop gunpowder).{*B*}{*B*} + + {*T2*}Tile Drops{*ETW*}{*B*} + When disabled, blocks will not drop items when destroyed (for example, Stone blocks won't drop Cobblestone).{*B*}{*B*} + + {*T2*}Natural Regeneration{*ETW*}{*B*} + When disabled, players will not regenerate health naturally.{*B*}{*B*} + +{*T1*}World Generation Options{*ETW*}{*B*} +When creating a new world there are some additional options.{*B*}{*B*} + + {*T2*}Generate Structures{*ETW*}{*B*} + When enabled, structures such as Villages and Strongholds will generate in the world.{*B*}{*B*} + + {*T2*}Superflat World{*ETW*}{*B*} + When enabled, a completely flat world will be generated in the Overworld and in the Nether.{*B*}{*B*} + + {*T2*}Bonus Chest{*ETW*}{*B*} + When enabled, a chest containing some useful items will be created near the player spawn point.{*B*}{*B*} + + {*T2*}Reset Nether{*ETW*}{*B*} + When enabled, the Nether will be re-generated. This is useful if you have an older save where Nether Fortresses were not present.{*B*}{*B*} + + {*T1*}In-Game Options{*ETW*}{*B*} + While in the game a number of options can be accessed by pressing {*BACK_BUTTON*} to bring up the in-game menu.{*B*}{*B*} + + {*T2*}Host Options{*ETW*}{*B*} + The host player, and any players set as moderators can access the "Host Option" menu. In this menu they can enable and disable fire spreading and TNT exploding.{*B*}{*B*} + +{*T1*}Player Options{*ETW*}{*B*} +To modify the privileges for a player, select their name and press{*CONTROLLER_VK_A*} to bring up the player privileges menu where you can use the following options.{*B*}{*B*} + + {*T2*}Can Build And Mine{*ETW*}{*B*} + This option is only available when "Trust Players" is turned off. When this option is enabled, the player is able to interact with the world as normal. When disabled the player will not be able to place or destroy blocks, or interact with many items and blocks.{*B*}{*B*} + + {*T2*}Can Use Doors and Switches{*ETW*}{*B*} + This option is only available when "Trust Players" is turned off. When this option is disabled, the player will not be able to use doors and switches.{*B*}{*B*} + + {*T2*}Can Open Containers{*ETW*}{*B*} + This option is only available when "Trust Players" is turned off. When this option is disabled, the player will not be able to open containers, such as chests.{*B*}{*B*} + + {*T2*}Can Attack Players{*ETW*}{*B*} + This option is only available when "Trust Players" is turned off. When this option is disabled the player will not be able to cause damage to other players.{*B*}{*B*} + + {*T2*}Can Attack Animals{*ETW*}{*B*} + This option is only available when "Trust Players" is turned off. When this option is disabled the player will not be able to cause damage to animals.{*B*}{*B*} + + {*T2*}Moderator{*ETW*}{*B*} + When this option is enabled, the player is able to change privileges for other players (except the host) if "Trust Players" is turned off, kick players and they can enable and disable fire spreading and TNT exploding.{*B*}{*B*} + + {*T2*}Kick Player{*ETW*}{*B*} + {*KICK_PLAYER_DESCRIPTION*}{*B*}{*B*} + +{*T1*}Host Player Options{*ETW*}{*B*} +If "Host Privileges" is enabled the host player can modify some privileges for themselves. To modify the privileges for a player, select their name and press{*CONTROLLER_VK_A*} to bring up the player privileges menu where you can use the following options.{*B*}{*B*} + + {*T2*}Can Fly{*ETW*}{*B*} + When this option is enabled, the player is able to fly. This option is only relevant to Survival mode, as flying is enabled for all players in Creative mode.{*B*}{*B*} + + {*T2*}Disable Exhaustion{*ETW*}{*B*} + This option only affects Survival mode. When enabled, physical activities (walking/sprinting/jumping etc.) do not decrease the food bar. However, if the player becomes injured, the food bar will slowly decrease while the player is healing.{*B*}{*B*} + + {*T2*}Invisible{*ETW*}{*B*} + When this option is enabled, the player is not visible to other players and is invulnerable.{*B*}{*B*} + + {*T2*}Can Teleport{*ETW*}{*B*} + This allows the player to move players or themselves to other players in the world. + + + + + Next Page + + + + Previous Page + + + + Basics + + + + HUD + + + + Inventory + + + + Chests + + + + Crafting + + + + Furnace + + + + Dispenser + + + + Farming Animals + + + + Breeding Animals + + + + Brewing + + + + Enchantment + + + + Nether Portal + + + + Multiplayer + + + + Sharing Screenshots + + + + Banning Levels + + + + Creative Mode + + + + Host and Player Options + + + + Trading + + + + Anvil + + + + The End + + + + {*T3*}HOW TO PLAY : THE END{*ETW*}{*B*}{*B*} +The End is another dimension in the game, which is reached through an active End Portal. The End Portal can be found in a Stronghold, which is deep underground in the Overworld.{*B*} +To activate the End Portal, you'll need to put an Eye of Ender into any End Portal Frame without one.{*B*} +Once the portal is active, jump in to it to go to The End.{*B*}{*B*} +In The End you will meet the Ender Dragon, a fierce and powerful enemy, along with many Enderman, so you will have to be well prepared for the battle before going there!{*B*}{*B*} +You'll find that there are Ender Crystals on top of eight Obsidian spikes that the Ender Dragon uses to heal itself, +so the first step in the battle is to destroy each of these.{*B*} +The first few can be reached with arrows, but the later ones are protected by an Iron Fence cage, and you will need to build up to them.{*B*}{*B*} +While you are doing this, the Ender Dragon will be attacking you by flying at you and spitting Ender acid balls!{*B*} +If you approach the Egg Podium in the centre of the spikes, the Ender Dragon will fly down and attack you and this is where you can really do some damage to it!{*B*} +Avoid the acid breath, and target the Ender Dragon's eyes for the best results. If possible, bring some friends in to The End to help you with the battle!{*B*}{*B*} +Once you are in The End, your friends will be able to see the location of the End Portal within the Stronghold on their maps, +so they can easily join you. + + + + + Sprint + + + + What's New + + + + {*T3*}Changes and Additions{*ETW*}{*B*}{*B*} +- Added new items - 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*} - 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. + + + + Used to dig dirt, grass, sand, gravel and snow faster than by hand. Shovels are required to dig snowballs. + + + + Required to mine stone-related blocks and ore. + + + + Used to chop wood-related blocks faster than by hand. + + + + Used to till dirt and grass blocks to prepare for crops. + + + + Wooden doors are activated by using, hitting them or with Redstone. + + + + Iron doors can only be opened by Redstone, buttons or switches. + + + + NOT USED + + + + NOT USED + + + + NOT USED + + + + NOT USED + + + + Gives the user 1 Armor when worn. + + + + Gives the user 3 Armor when worn. + + + + Gives the user 2 Armor when worn. + + + + Gives the user 1 Armor when worn. + + + + Gives the user 2 Armor when worn. + + + + Gives the user 5 Armor when worn. + + + + Gives the user 4 Armor when worn. + + + + Gives the user 1 Armor when worn. + + + + Gives the user 2 Armor when worn. + + + + Gives the user 6 Armor when worn. + + + + Gives the user 5 Armor when worn. + + + + Gives the user 2 Armor when worn. + + + + Gives the user 2 Armor when worn. + + + + Gives the user 5 Armor when worn. + + + + Gives the user 3 Armor when worn. + + + + Gives the user 1 Armor when worn. + + + + Gives the user 3 Armor when worn. + + + + Gives the user 8 Armor when worn. + + + + Gives the user 6 Armor when worn. + + + + Gives the user 3 Armor when worn. + + + + A shiny ingot which can be used to craft tools made from this material. Created by smelting ore in a furnace. + + + + Allows ingots, gems, or dyes to be crafted into placeable blocks. Can be used as an expensive building block or compact storage of the ore. + + + + Used to send an electrical charge when stepped on by a player, an animal, or a monster. Wooden Pressure Plates can also be activated by dropping something on them. + + + + Used for compact staircases. + + + + Used for making long staircases. Two slabs placed on top of each other will create a normal-sized double slab block. + + + + Used for making long staircases. Two slabs placed on top of each other will create a normal-sized double slab block. + + + + Used to create light. Torches also melt snow and ice. + + + + Used as a building material and can be crafted into many things. Can be crafted from any form of wood. + + + + Used as a building material. Is not influenced by gravity like normal Sand. + + + + Used as a building material. + + + + Used to craft torches, arrows, signs, ladders, fences and as handles for tools and weapons. + + + + Used to forward time from any time at night to morning if all the players in the world are in bed, and changes the spawn point of the player. +The colors of the bed are always the same, regardless of the colors of wool used. + + + + Allows you to craft a more varied selection of items than the normal crafting. + + + + Allows you to smelt ore, create charcoal and glass, and cook fish and porkchops. + + + + Stores blocks and items inside. Place two chests side by side to create a larger chest with double the capacity. + + + + Used as a barrier that cannot be jumped over. Counts as 1.5 blocks high for players, animals and monsters, but 1 block high for other blocks. + + + + Used to climb vertically. + + + + Activated by using, hitting them or with redstone. They function as normal doors, but are a one by one block and lay flat on the ground. + + + + Shows text entered by you or other players. + + + + Used to create brighter light than torches. Melts snow/ice and can be used underwater. + + + + Used to cause explosions. Activated after placing by igniting with Flint and Steel item, or with an electrical charge. + + + + Used to hold mushroom stew. You keep the bowl when the stew has been eaten. + + + + Used to hold and transport water, lava and milk. + + + + Used to hold and transport water. + + + + Used to hold and transport lava. + + + + Used to hold and transport milk. + + + + Used to create fire, ignite TNT, and open a portal once it has been built. + + + + Used to catch fish. + + + + Displays positions of the Sun and Moon. + + + + Points to your start point. + + + + Will create an image of an area explored while held. This can be used for path-finding. + + + + 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. + + + + 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 1{*ICON_SHANK_01*}. Can be used 6 times. + + + + Restores 1{*ICON_SHANK_01*}. + + + + Restores 1{*ICON_SHANK_01*}. + + + + Restores 3{*ICON_SHANK_01*}. + + + + Restores 1{*ICON_SHANK_01*}, or can be cooked in a furnace. Eating this can cause you to be poisoned. + + + + Restores 3{*ICON_SHANK_01*}. Created by cooking raw chicken in a furnace. + + + + Restores 1.5{*ICON_SHANK_01*}, or can be cooked in a furnace. + + + + Restores 4{*ICON_SHANK_01*}. Created by cooking raw beef in a furnace. + + + + Restores 1.5{*ICON_SHANK_01*}, or can be cooked in a furnace. + + + + Restores 4{*ICON_SHANK_01*}. Created by cooking a raw porkchop in a furnace. + + + + Restores 1{*ICON_SHANK_01*}, or can be cooked in a furnace. Can be fed to an Ocelot to tame it. + + + + Restores 2.5{*ICON_SHANK_01*}. Created by cooking a raw fish in a furnace. + + + + Restores 2{*ICON_SHANK_01*}, and can be crafted into a golden apple. + + + + Restores 2{*ICON_SHANK_01*}, and regenerates health for 4 seconds. Crafted from an apple and gold nuggets. + + + + Restores 2{*ICON_SHANK_01*}. Eating this can cause you to be poisoned. + + + + Used in the cake recipe, and as an ingredient for brewing potions. + + + + Used to send an electrical charge by being turned on or off. Stays in the on or off state until pressed again. + + + + Constantly sends an electrical charge, or can be used as a receiver/transmitter when connected to the side of a block. +Can also be used for low-level lighting. + + + + Used in Redstone circuits as repeater, a delayer, and/or a diode. + + + + Used to send an electrical charge by being pressed. Stays activated for approximately a second before shutting off again. + + + + Used to hold and shoot out items in a random order when given a Redstone charge. + + + + Plays a note when triggered. Hit it to change the pitch of the note. Placing this on top of different blocks will change the type of instrument. + + + + Used to guide minecarts. + + + + When powered, accelerates minecarts that pass over it. When unpowered, causes minecarts to stop on it. + + + + Functions like a Pressure Plate (sends a Redstone signal when powered) but can only be activated by a Minecart. + + + + Used to transport you, an animal, or a monster along rails. + + + + Used to transport goods along rails. + + + + Will move along rails and can push other minecarts when coal is put in it. + + + + Used to travel in water more quickly than swimming. + + + + Collected from sheep, and can be colored with dyes. + + + + Used as a building material and can be colored with dyes. This recipe is not recommended because Wool can be easily obtained from Sheep. + + + + Used as a dye to create black wool. + + + + Used as a dye to create green wool. + + + + Used as a dye to create brown wool, as an ingredient in cookies, or to grow Cocoa Pods. + + + + Used as a dye to create silver wool. + + + + Used as a dye to create yellow wool. + + + + Used as a dye to create red wool. + + + + Used to instantly grow crops, trees, tall grass, huge mushrooms and flowers, and can be used in dye recipes. + + + + Used as a dye to create pink wool. + + + + Used as a dye to create orange wool. + + + + Used as a dye to create lime wool. + + + + Used as a dye to create gray wool. + + + + Used as a dye to create light gray wool. +(Note: light gray dye can also be made by combining gray dye with bone meal, letting you make four light gray dyes from every ink sac instead of three.) + + + + Used as a dye to create light blue wool. + + + + Used as a dye to create cyan wool. + + + + Used as a dye to create purple wool. + + + + Used as a dye to create magenta wool. + + + + Used as dye to create Blue Wool. + + + + Plays Music Discs. + + + + Use these to create very strong tools, weapons or armor. + + + + Used to create brighter light than torches. Melts snow/ice and can be used underwater. + + + + Used to create books and maps. + + + + Can be used to create bookshelves or enchanted to make Enchanted Books. + + + + Allows the creation of more powerful enchantments when placed around the Enchantment Table. + + + + Used as decoration. + + + + Can be mined with an iron pickaxe or better, then smelted in a furnace to produce gold ingots. + + + + Can be mined with a stone pickaxe or better, then smelted in a furnace to produce iron ingots. + + + + Can be mined with a pickaxe to collect coal. + + + + Can be mined with a stone pickaxe or better to collect lapis lazuli. + + + + Can be mined with an iron pickaxe or better to collect diamonds. + + + + Can be mined with an iron pickaxe or better to collect redstone dust. + + + + Can be mined with a pickaxe to collect cobblestone. + + + + Collected using a shovel. Can be used for construction. + + + + Can be planted and it will eventually grow into a tree. + + + + This cannot be broken. + + + + Sets fire to anything that touches it. Can be collected in a bucket. + + + + Collected using a shovel. Can be smelted into glass using the furnace. Is affected by gravity if there is no other tile underneath it. + + + + Collected using a shovel. Sometimes produces flint when dug up. Is affected by gravity if there is no other tile underneath it. + + + + Chopped using an axe, and can be crafted into planks or used as a fuel. + + + + Created in a furnace by smelting sand. Can be used for construction, but will break if you try to mine it. + + + + Mined from stone using a pickaxe. Can be used to construct a furnace or stone tools. + + + + Baked from clay in a furnace. + + + + Can be baked into bricks in a furnace. + + + + When broken drops clay balls which can be baked into bricks in a furnace. + + + + A compact way to store snowballs. + + + + Can be dug with a shovel to create snowballs. + + + + Sometimes produces wheat seeds when broken. + + + + Can be crafted into a dye. + + + + Can be crafted with a bowl to make stew. + + + + Can only be mined with a diamond pickaxe. Is produced by the meeting of water and still lava, and is used to build a portal. + + + + Spawns monsters into the world. + + + + Is placed on the ground to carry an electrical charge. When brewed with a potion it will increase the duration of the effect. + + + + When fully grown, crops can be harvested to collect wheat. + + + + Ground that has been prepared ready to plant seeds. + + + + Can be cooked in a furnace to create a green dye. + + + + Can be crafted to create sugar. + + + + Can be worn as a helmet or crafted with a torch to create a Jack-O-Lantern. It is also the main ingredient in Pumpkin Pie. + + + + Burns forever if set alight. + + + + Slows the movement of anything walking over it. + + + + Standing in the portal allows you to pass between the Overworld and the Nether. + + + + Used as a fuel in a furnace, or crafted to make a torch. + + + + Collected by killing a spider, and can be crafted into a Bow or Fishing Rod, or placed on the ground to create Tripwire. + + + + Collected by killing a chicken, and can be crafted into an arrow. + + + + Collected by killing a Creeper, and can be crafted into TNT or used as an ingredient for brewing potions. + + + + Can be planted in farmland to grow crops. Make sure there's enough light for the seeds to grow! + + + + Harvested from crops, and can be used to craft food items. + + + + Collected by digging gravel, and can be used to craft a flint and steel. + + + + When used on a pig it allows you to ride the pig. The pig can then be steered using a Carrot on a Stick. + + + + Collected by digging snow, and can be thrown. + + + + Collected by killing a cow, and can be crafted into armor or used to make Books. + + + + Collected by killing a Slime, and used as an ingredient for brewing potions or crafted to make Sticky Pistons. + + + + Dropped randomly by chickens, and can be crafted into food items. + + + + Collected by mining Glowstone, and can be crafted to make Glowstone blocks again or brewed with a potion to increase the potency of the effect. + + + + Collected by killing a Skeleton. Can be crafted into bone meal. Can be fed to a wolf to tame it. + + + + Collected by getting a Skeleton to kill a Creeper. Can be played in a jukebox. + + + + Extinguishes fire and helps crops grow. Can be collected in a bucket. + + + + When broken sometimes drops a sapling which can then be replanted to grow into a tree. + + + + Found in dungeons, can be used for construction and decoration. + + + + Used to obtain wool from sheep and harvest leaf blocks. + + + + When powered (using a button, a lever, a pressure plate, a redstone torch, or redstone with any one of these), a piston extends if it can and pushes blocks. + + + + When powered (using a button, a lever, a pressure plate, a redstone torch, or redstone with any one of these), a piston extends if it can and pushes blocks. When it retracts it pulls back the block touching the extended part of the piston. + + + + Made from Stone blocks, and commonly found in Strongholds. + + + + Used as a barrier, similar to fences. + + + + Similar to a door, but used primarily with fences. + + + + Can be crafted from Melon Slices. + + + + Transparent blocks that can be used as an alternative to Glass Blocks. + + + + Can be planted to grow pumpkins. + + + + Can be planted to grow melons. + + + + Dropped by Enderman when they die. When thrown, the player will be teleported to the position the Ender Pearl lands at, and will lose some health. + + + + A block of dirt with grass growing on top. Collected using a shovel. Can be used for construction. + + + + Can be used for construction and decoration. + + + + Slows movement when walking through it. Can be destroyed using shears to collect string. + + + + Spawns a Silverfish when destroyed. May also spawn Silverfish if nearby to another Silverfish being attacked. + + + + Grows over time when placed. Can be collected using shears. Can be climbed like a ladder. + + + + Slippery when walked on. Turns into water if above another block when destroyed. Melts if close enough to a light source or when placed in The Nether. + + + + Can be used as decoration. + + + + Used in potion brewing, and for locating Strongholds. Dropped by Blazes who tend to be found near or in Nether Fortresses. + + + + Used in potion brewing. Dropped by Ghasts when they die. + + + + Dropped by Zombie Pigmen when they die. Zombie Pigmen can be found in the Nether. Used as an ingredient for brewing potions. + + + + Used in potion brewing. This can be found naturally growing in Nether Fortresses. It can also be planted on Soul Sand. + + + + When used, can have various effects, depending on what it is used on. + + + + Can be filled with water, and used as the starting ingredient for a potion in the Brewing Stand. + + + + This is a poisonous food and brewing item. Dropped when a Spider or Cave Spider is killed by a player. + + + + Used in potion brewing, mainly to create potions with a negative effect. + + + + Used in potion brewing, or crafted with other items to make Eye of Ender or Magma Cream. + + + + Used in potion brewing. + + + + Used for making Potions and Splash Potions. + + + + Filled with water by rain or with a bucket of water, and can then be used to fill Glass Bottles with water. + + + + When thrown, will show the direction to an End Portal. When twelve of these are placed in the End Portal Frames, the End Portal will be activated. + + + + Used in potion brewing. + + + + Similar to Grass Blocks, but very good for growing mushrooms on. + + + + Floats on water, and can be walked on. + + + + Used to build Nether Fortresses. Immune to Ghast's fireballs. + + + + Used in Nether Fortresses. + + + + Found in Nether Fortresses, and will drop Nether Wart when broken. + + + + This allows players to enchant Swords, Pickaxes, Axes, Shovels, Bows and Armor, using the player's Experience Points. + + + + This can be activated using twelve Eye of Ender, and will allow the player to travel to The End dimension. + + + + Used to form an End Portal. + + + + A block type found in The End. It has a very high blast resistance, so is useful for building with. + + + + This block is created by the defeat of the Dragon in The End. + + + + When thrown, it drops Experience Orbs which increase your experience points when collected. + + + + Useful for setting things on fire, or for indiscriminately starting fires when fired from a Dispenser. + + + + These are similar to a display case, and will display the item or block placed in it. + + + + When thrown can spawn a creature of the type indicated. + + + + Used for making long staircases. Two slabs placed on top of each other will create a normal-sized double slab block. + + + + Used for making long staircases. Two slabs placed on top of each other will create a normal-sized double slab block. + + + + Created by smelting Netherrack in a furnace. Can be crafted into Nether Brick blocks. + + + + When powered they emit light. + + + + Can be farmed to collect Cocoa Beans. + + + + Mob Heads can be placed as a decoration, or worn as a mask in the helmet slot. + + + + 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. + + + + 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 + + + + Concept Artist + + + + Number Crunching and Statistics + + + + Bully Coordinator + + + + Original Design and Code by + + + + Project Manager/Producer + + + + Rest of Mojang Office + + + + Lead Game Programmer Minecraft PC + + + + Ninja Coder + + + + CEO + + + + White Collar Worker + + + + Customer Support + + + + Office DJ + + + + Designer/Programmer Minecraft - Pocket Edition + + + + Developer + + + + Chief Architect + + + + Art Developer + + + + Game Crafter + + + + Director of Fun + + + + Music and Sounds + + + + Programming + + + + Art + + + + QA + + + + Executive Producer + + + + Lead Producer + + + + Producer + + + + Test Lead + + + + Lead Tester + + + + Design Team + + + + Development Team + + + + Release Management + + + + Director, XBLA Publishing + + + + Business Development + + + + Portfolio Director + + + + Product Manager + + + + Marketing + + + + Community Manager + + + + Europe Localization Team + + + + Redmond Localization Team + + + + Asia Localization Team + + + + User Research Team + + + + MGS Central Teams + + + + Milestone Acceptance Tester + + + + Special Thanks + + + + Test Manager + + + + Senior Test Lead + + + + SDET + + + + Project STE + + + + Additional STE + + + + Test Associates + + + + Jon Kågström + + + + Tobias Möllstam + + + + Risë Lugo + + + + Wooden Sword + + + + Stone Sword + + + + Iron Sword + + + + Diamond Sword + + + + Golden Sword + + + + Wooden Shovel + + + + Stone Shovel + + + + Iron Shovel + + + + Diamond Shovel + + + + Golden Shovel + + + + Wooden Pickaxe + + + + Stone Pickaxe + + + + Iron Pickaxe + + + + Diamond Pickaxe + + + + Golden Pickaxe + + + + Wooden Axe + + + + Stone Axe + + + + Iron Axe + + + + Diamond Axe + + + + Golden Axe + + + + Wooden Hoe + + + + Stone Hoe + + + + Iron Hoe + + + + Diamond Hoe + + + + Golden Hoe + + + + Wooden Door + + + + Iron Door + + + + Chain Helmet + + + + Chain Chestplate + + + + Chain Leggings + + + + Chain Boots + + + + Leather Cap + + + + Iron Helmet + + + + Diamond Helmet + + + + Golden Helmet + + + + Leather Tunic + + + + Iron Chestplate + + + + Diamond Chestplate + + + + Golden Chestplate + + + + Leather Pants + + + + Iron Leggings + + + + Diamond Leggings + + + + Golden Leggings + + + + Leather Boots + + + + Iron Boots + + + + Diamond Boots + + + + Golden Boots + + + + Iron Ingot + + + + Gold Ingot + + + + Bucket + + + + Water Bucket + + + + Lava Bucket + + + + Flint and Steel + + + + Apple + + + + Bow + + + + Arrow + + + + Coal + + + + Charcoal + + + + Diamond + + + + Stick + + + + Bowl + + + + Mushroom Stew + + + + String + + + + Feather + + + + Gunpowder + + + + Wheat Seeds + + + + Wheat + + + + Bread + + + + Flint + + + + Raw Porkchop + + + + Cooked Porkchop + + + + Painting + + + + Golden Apple + + + + Sign + + + + Minecart + + + + Saddle + + + + Redstone + + + + Snowball + + + + Boat + + + + Leather + + + + Milk Bucket + + + + Brick + + + + Clay + + + + Sugar Canes + + + + Paper + + + + Book + + + + Slimeball + + + + Minecart with Chest + + + + Minecart with Furnace + + + + Egg + + + + Compass + + + + Fishing Rod + + + + Clock + + + + Glowstone Dust + + + + Raw Fish + + + + Cooked Fish + + + + Dye Powder + + + + Ink Sac + + + + Rose Red + + + + Cactus Green + + + + Cocoa Beans + + + + Lapis Lazuli + + + + Purple Dye + + + + Cyan Dye + + + + Light Gray Dye + + + + Gray Dye + + + + Pink Dye + + + + Lime Dye + + + + Dandelion Yellow + + + + Light Blue Dye + + + + Magenta Dye + + + + Orange Dye + + + + Bone Meal + + + + Bone + + + + Sugar + + + + Cake + + + + Bed + + + + Redstone Repeater + + + + Cookie + + + + Map + + + + Empty Map + + + + Music Disc - "13" + + + + Music Disc - "cat" + + + + Music Disc - "blocks" + + + + Music Disc - "chirp" + + + + Music Disc - "far" + + + + Music Disc - "mall" + + + + Music Disc - "mellohi" + + + + Music Disc - "stal" + + + + Music Disc - "strad" + + + + Music Disc - "ward" + + + + Music Disc - "11" + + + + Music Disc - "where are we now" + + + + Shears + + + + Pumpkin Seeds + + + + Melon Seeds + + + + Raw Chicken + + + + Cooked Chicken + + + + Raw Beef + + + + Steak + + + + Rotten Flesh + + + + Ender Pearl + + + + Melon Slice + + + + Blaze Rod + + + + Ghast Tear + + + + Gold Nugget + + + + Nether Wart + + + + {*splash*}{*prefix*}Potion {*postfix*} + + + + Glass Bottle + + + + Water Bottle + + + + Spider Eye + + + + Fermented Spider Eye + + + + Blaze Powder + + + + Magma Cream + + + + Brewing Stand + + + + Cauldron + + + + Eye of Ender + + + + Glistering Melon + + + + Bottle o' Enchanting + + + + Fire Charge + + + + Fire Charge (Charcoal) + + + + Fire Charge (Coal) + + + + Item Frame + + + + Spawn {*CREATURE*} + + + + Nether Brick + + + + Skull + + + + Skeleton Skull + + + + Wither Skeleton Skull + + + + Zombie Head + + + + Head + + + + %s's Head + + + + Creeper Head + + + + 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 + + + + Grass Block + + + + Dirt + + + + Cobblestone + + + + Oak Wood Planks + + + + Spruce Wood Planks + + + + Birch Wood Planks + + + + Jungle Wood Planks + + + + Wood Planks (any type) + + + + Sapling + + + + Oak Sapling + + + + Spruce Sapling + + + + Birch Sapling + + + + Jungle Tree Sapling + + + + Bedrock + + + + Water + + + + Lava + + + + Sand + + + + Sandstone + + + + Gravel + + + + Gold Ore + + + + Iron Ore + + + + Coal Ore + + + + Wood + + + + Oak Wood + + + + Spruce Wood + + + + Birch Wood + + + + Jungle Wood + + + + Oak + + + + Spruce + + + + Birch + + + + Leaves + + + + Oak Leaves + + + + Spruce Leaves + + + + Birch Leaves + + + + Jungle Leaves + + + + Sponge + + + + Glass + + + + Wool + + + + Black Wool + + + + Red Wool + + + + Green Wool + + + + Brown Wool + + + + Blue Wool + + + + Purple Wool + + + + Cyan Wool + + + + Light Gray Wool + + + + Gray Wool + + + + Pink Wool + + + + Lime Wool + + + + Yellow Wool + + + + Light Blue Wool + + + + Magenta Wool + + + + Orange Wool + + + + White Wool + + + + Flower + + + + Rose + + + + Mushroom + + + + Block of Gold + + + + A compact way of storing Gold. + + + + A compact way of storing Iron. + + + + Block of Iron + + + + Stone Slab + + + + Stone Slab + + + + Sandstone Slab + + + + Oak Wood Slab + + + + Cobblestone Slab + + + + Bricks Slab + + + + Stone Bricks Slab + + + + Oak Wood Slab + + + + Spruce Wood Slab + + + + Birch Wood Slab + + + + Jungle Wood Slab + + + + Nether Brick Slab + + + + Bricks + + + + TNT + + + + Bookshelf + + + + Moss Stone + + + + Obsidian + + + + Torch + + + + Torch (Coal) + + + + Torch (Charcoal) + + + + Fire + + + + Monster Spawner + + + + Oak Wood Stairs + + + + Chest + + + + Redstone Dust + + + + Diamond Ore + + + + Block of Diamond + + + + A compact way of storing Diamonds. + + + + Crafting Table + + + + Crops + + + + Farmland + + + + Furnace + + + + Sign + + + + Wooden Door + + + + Ladder + + + + Rail + + + + Powered Rail + + + + Detector Rail + + + + Stone Stairs + + + + Lever + + + + Pressure Plate + + + + Iron Door + + + + Redstone Ore + + + + Redstone Torch + + + + Button + + + + Snow + + + + Ice + + + + Cactus + + + + Clay + + + + Sugar Cane + + + + Jukebox + + + + Fence + + + + Pumpkin + + + + Jack-O-Lantern + + + + Netherrack + + + + Soul Sand + + + + Glowstone + + + + Portal + + + + Lapis Lazuli Ore + + + + Lapis Lazuli Block + + + + A compact way of storing Lapis Lazuli. + + + + Dispenser + + + + Note Block + + + + Cake + + + + Bed + + + + Web + + + + Tall Grass + + + + Dead Bush + + + + Diode + + + + Locked Chest + + + + Trapdoor + + + + Wool (any color) + + + + Piston + + + + Sticky Piston + + + + Silverfish Block + + + + Stone Bricks + + + + Mossy Stone Bricks + + + + Cracked Stone Bricks + + + + Chiseled Stone Bricks + + + + Mushroom + + + + Mushroom + + + + Iron Bars + + + + Glass Pane + + + + Melon + + + + Pumpkin Stem + + + + Melon Stem + + + + Vines + + + + Fence Gate + + + + Brick Stairs + + + + Stone Brick Stairs + + + + Silverfish Stone + + + + Silverfish Cobblestone + + + + Silverfish Stone Brick + + + + Mycelium + + + + Lily Pad + + + + Nether Brick + + + + Nether Brick Fence + + + + Nether Brick Stairs + + + + Nether Wart + + + + Enchantment Table + + + + Brewing Stand + + + + Cauldron + + + + End Portal + + + + End Portal Frame + + + + End Stone + + + + Dragon Egg + + + + Shrub + + + + Fern + + + + Sandstone Stairs + + + + Spruce Wood Stairs + + + + Birch Wood Stairs + + + + Jungle Wood Stairs + + + + Redstone Lamp + + + + Cocoa + + + + Skull + + + + 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 + + + + Layout + + + + Move/Sprint + + + + Look + + + + Pause + + + + Jump + + + + Jump/Fly Up + + + + Inventory + + + + Cycle Held Item + + + + Action + + + + Use + + + + Crafting + + + + Drop + + + + Sneak + + + + Sneak/Fly Down + + + + Change Camera Mode + + + + Players/Invite + + + + Movement (When Flying) + + + + Layout 1 + + + + Layout 2 + + + + Layout 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {*B*}Press{*CONTROLLER_VK_A*} to continue. + + + + {*B*}Press{*CONTROLLER_VK_A*} to start the tutorial.{*B*} +Press{*CONTROLLER_VK_B*} if you think you are ready to play on your own. + + + + Minecraft is a game about placing blocks to build anything you can imagine. +At night monsters come out, make sure to build a shelter before that happens. + + + + Use{*CONTROLLER_ACTION_LOOK*} to look up, down and around. + + + + Use{*CONTROLLER_ACTION_MOVE*} to move around. + + + + To sprint, push{*CONTROLLER_ACTION_MOVE*} forward twice quickly. While you hold{*CONTROLLER_ACTION_MOVE*} forward, the character will continue to sprint unless they run out of sprint time or food. + + + + Press{*CONTROLLER_ACTION_JUMP*} to jump. + + + + Hold{*CONTROLLER_ACTION_ACTION*} to mine and chop using your hand or whatever you are holding. You may need to craft a tool to mine some blocks... + + + + Hold{*CONTROLLER_ACTION_ACTION*} to chop down 4 blocks of wood (tree trunks).{*B*}When a block breaks you can pick it up by standing near to the floating item that appears, causing it to appear in your inventory. + + + + Press{*CONTROLLER_ACTION_CRAFTING*} to open the crafting interface. + + + + As you collect and craft more items, your inventory will fill up.{*B*} +Press{*CONTROLLER_ACTION_INVENTORY*} to open the inventory. + + + + As you move around, mine and attack, you will deplete your food bar{*ICON_SHANK_01*}. Sprinting and sprint jumping use a lot more food than walking and jumping normally. + + + + If you lose some health, but have a food bar with 9 or more{*ICON_SHANK_01*} in it, your health will automatically replenish. Eating food will replenish your food bar. + + + + With a food item in your hand, hold{*CONTROLLER_ACTION_USE*} to eat it and replenish your food bar. You cannot eat if your food bar is full. + + + + Your food bar is low, and you have lost some health. Eat the steak in your inventory to replenish your food bar and start healing.{*ICON*}364{*/ICON*} + + + + The wood that you have collected can be crafted into planks. Open the crafting interface to craft them.{*PlanksIcon*} + + + + A lot of crafting can involve multiple steps. Now that you have some planks there are more items that you can craft. Create a crafting table.{*CraftingTableIcon*} + + + + To make collecting blocks faster you can build tools designed for the job. Some tools have a handle made of sticks. Craft some sticks now.{*SticksIcon*} + + + + Use{*CONTROLLER_ACTION_LEFT_SCROLL*} and{*CONTROLLER_ACTION_RIGHT_SCROLL*} to change the current held item. + + + + Use{*CONTROLLER_ACTION_USE*} to use items, interact with objects and place some items. Items that have been placed can be picked up again by mining them with the right tool. + + + + With the crafting table selected, point the crosshair where you want it and use{*CONTROLLER_ACTION_USE*} to place a crafting table. + + + + Point the crosshair at the crafting table and press{*CONTROLLER_ACTION_USE*} to open it. + + + + A shovel helps dig soft blocks, like dirt and snow, faster. As you collect more materials you can craft tools that work faster and last longer. Create a wooden shovel.{*WoodenShovelIcon*} + + + + An axe helps chop wood and wooden tiles, faster. As you collect more materials you can craft tools that work faster and last longer. Create a wooden axe.{*WoodenHatchetIcon*} + + + + A pickaxe helps dig hard blocks, like stone and ore, faster. As you collect more materials you can craft tools that work faster and last longer, and allow you to mine harder materials. Create a wooden pickaxe.{*WoodenPickaxeIcon*} + + + + Open the container + + + + Night time can approach quickly, and it is dangerous to be outside unprepared. You can craft armor and weapons, but it is sensible to have a safe shelter. + + + + Nearby there is an abandoned Miner's shelter that you can complete to be safe overnight. + + + + You will need to collect the resources to complete the shelter. Walls and roof can be made of any tile type, but you will want to create a door, some windows and lighting. + + + + Use your pickaxe to mine some stone blocks. Stone blocks will produce cobblestone when mined. If you collect 8 cobblestone blocks you can build a furnace. You may need to dig through some dirt to reach the stone, so use your shovel for this.{*StoneIcon*} + + + + You have collected enough cobblestone to build a furnace. Use your crafting table to create one. + + + + Use{*CONTROLLER_ACTION_USE*} to place the furnace in the world, and then open it. + + + + Use the furnace to create some charcoal. If you are waiting for it to finish how about using the time to collect more materials to finish the shelter? + + + + Use the furnace to create some glass. If you are waiting for it to finish how about using the time to collect more materials to finish the shelter? + + + + A good shelter will have a door so that you can easily go in and out without having to mine and replace the walls. Craft a wooden door now.{*WoodenDoorIcon*} + + + + Use{*CONTROLLER_ACTION_USE*} to place the door. You can use{*CONTROLLER_ACTION_USE*} to open and close a wooden door in the world. + + + + It can get very dark at night, so you will want some lighting inside your shelter so that you can see. Craft a torch now from sticks and charcoal using the crafting interface.{*TorchIcon*} + + + + You have completed the first part of the tutorial. + + + + {*B*} +Press{*CONTROLLER_VK_A*} to continue with the tutorial.{*B*} +Press{*CONTROLLER_VK_B*} if you think you are ready to play on your own. + + + + This is your inventory. It shows items available for use in your hand, and all the other items that you are carrying. Your armor is also shown here. + + + + {*B*} +Press{*CONTROLLER_VK_A*} to continue.{*B*} +Press{*CONTROLLER_VK_B*} if you already know how to use the inventory. + + + + Use{*CONTROLLER_MENU_NAVIGATE*} to move the pointer. Use{*CONTROLLER_VK_A*} to pick an item under the pointer. +If there is more than one item here this will pick them all up, or you can use{*CONTROLLER_VK_X*} to pick up just half of them. + + + + Move this item with the pointer over another space in the inventory and place it down using{*CONTROLLER_VK_A*}. +With multiple items on the pointer, use{*CONTROLLER_VK_A*} to place them all, or{*CONTROLLER_VK_X*} to place just one. + + + + If you move the pointer outside the edge of the interface with an item on the pointer, you can drop the item. + + + + If you want more information about an item, move the pointer over the item and press{*CONTROLLER_ACTION_MENU_PAGEDOWN*} . + + + + Press{*CONTROLLER_VK_B*} now to exit the inventory. + + + + This is the creative mode inventory. It shows items available for use in your hand, and all the other items that you can choose from. + + + + {*B*} +Press{*CONTROLLER_VK_A*} to continue.{*B*} +Press{*CONTROLLER_VK_B*} if you already know how to use the creative mode inventory. + + + + Use{*CONTROLLER_MENU_NAVIGATE*} to move the pointer. +When on the item list, use{*CONTROLLER_VK_A*} to pick an item under the pointer, and use{*CONTROLLER_VK_Y*} to pick up a full stack of that item. + + + + The pointer will automatically move over a space in the use row. You can place it down using{*CONTROLLER_VK_A*}. Once you have placed the item, the pointer will return to the item list where you can select another item. + + + + If you move the pointer outside the edge of the interface with an item on the pointer, you can drop the item into the world. To clear all items in the quick select bar, press{*CONTROLLER_VK_X*}. + + + + Scroll through the Group Type tabs at the top using{*CONTROLLER_VK_LB*} and{*CONTROLLER_VK_RB*} to select the group type of the item you wish to pickup. + + + + If you want more information about an item, move the pointer over the item and press{*CONTROLLER_ACTION_MENU_PAGEDOWN*} . + + + + Press{*CONTROLLER_VK_B*} now to exit the creative mode inventory. + + + + This is the crafting interface. This interface allows you to combine the items you've collected to make new items. + + + + {*B*}Press{*CONTROLLER_VK_A*} to continue.{*B*} +Press{*CONTROLLER_VK_B*} if you already know how to craft. + + + + {*B*} +Press{*CONTROLLER_VK_X*} to show the item description. + + + + {*B*} +Press{*CONTROLLER_VK_X*} to show the ingredients required to make the current item. + + + + {*B*} +Press{*CONTROLLER_VK_X*} to show the inventory again. + + + + Scroll through the Group Type tabs at the top using{*CONTROLLER_VK_LB*} and{*CONTROLLER_VK_RB*} to select the group type of the item you wish to craft, then use{*CONTROLLER_MENU_NAVIGATE*} to select the item to craft. + + + + The crafting area shows the items you require in order to craft the new item. Press{*CONTROLLER_VK_A*} to craft the item and place it in your inventory. + + + + You can craft a larger selection of items using a crafting table. Crafting on a table works in the same way as basic crafting, but you have a larger crafting area allowing more combinations of ingredients. + + + + The bottom right part of the crafting interface shows your inventory. This area can also show a description of the currently selected item, and the ingredients required to craft it. + + + + The description of the currently selected item is now displayed. The description can give you an idea of what the item can be used for. + + + + The list of ingredients required to craft the selected item are now displayed. + + + + The wood that you have collected can be crafted into planks. Select the planks icon and press{*CONTROLLER_VK_A*} to create them.{*PlanksIcon*} + + + + Now you have built a crafting table you should place it in the world to enable you to build a larger selection of items.{*B*} +Press{*CONTROLLER_VK_B*} now to exit the crafting interface. + + + + Press{*CONTROLLER_VK_LB*} and{*CONTROLLER_VK_RB*} to change to the group type of the items you wish to craft. Select the tools group.{*ToolsIcon*} + + + + Press{*CONTROLLER_VK_LB*} and{*CONTROLLER_VK_RB*} to change to the group type of the items you wish to craft. Select the structures group.{*StructuresIcon*} + + + + Use{*CONTROLLER_MENU_NAVIGATE*} to change to the item you wish to craft. Some items have multiple versions depending on the materials used. Select the wooden shovel.{*WoodenShovelIcon*} + + + + A lot of crafting can involve multiple steps. Now that you have some planks there are more items that you can craft. Use{*CONTROLLER_MENU_NAVIGATE*} to change to the item you wish to craft. Select the crafting table.{*CraftingTableIcon*} + + + + With the tools you have built you are off to a great start, and are able to collect a variety of different materials more efficiently.{*B*} +Press{*CONTROLLER_VK_B*} now to exit the crafting interface. + + + + Some items can not be created using the crafting table, but require a furnace. Craft a furnace now.{*FurnaceIcon*} + + + + Place the furnace you have crafted in the world. You will want to put this inside your shelter.{*B*} +Press{*CONTROLLER_VK_B*} now to exit the crafting interface. + + + + This is the furnace interface. A furnace allows you to change items by firing them. For example, you can turn iron ore into iron ingots in the furnace. + + + + {*B*} +Press{*CONTROLLER_VK_A*} to continue.{*B*} +Press{*CONTROLLER_VK_B*} if you already know how to use a furnace. + + + + You need to put some fuel into the bottom slot of the furnace, and the item to be changed in the top slot. The furnace will then fire up and start working, putting the result in the right-hand slot. + + + + Many wooden items can be used as fuels, but not everything burns for the same time. You may also discover other items in the world that can be used as a fuel. + + + + When your items have been fired, you can move them from the output area into your inventory. You should experiment with different ingredients to see what you can make. + + + + If you use wood as the ingredient then you can make charcoal. Put some fuel in the furnace and wood in the ingredient slot. It can take some time for the furnace to create the charcoal, so feel free to do something else and come back to check the progress. + + + + Charcoal can be used as a fuel, as well as being crafted into a torch with a stick. + + + + Placing sand in the ingredient slot allows you to make glass. Create some glass blocks to use as windows in your shelter. + + + + This is the brewing interface. You can use this to create potions that have a variety of different effects. + + + + {*B*} +Press{*CONTROLLER_VK_A*} to continue.{*B*} +Press{*CONTROLLER_VK_B*} if you already know how to use the brewing stand. + + + + You brew potions by placing an ingredient in the top slot, and a potion or water bottle in the bottom slots (up to 3 can be brewed at one time). Once a valid combination is entered the brewing process will start and create the potion after a short time. + + + + All potions start with a Water Bottle. Most potions are created by first using a Nether Wart to make an Awkward Potion, and will require at least one more ingredient to make the final potion. + + + + Once you have a potion you can modify its effects. Adding Redstone Dust increases the duration of its effect and adding Glowstone Dust can make its effect more powerful. + + + + Adding Fermented Spider Eye corrupts the potion and can turn it into a potion with the opposite effect, and adding Gunpowder turns the potion into a Splash Potion which can be thrown to apply its affect to a nearby area. + + + + Create a Potion of Fire Resistance by first adding Nether Wart to a Water Bottle, and then adding Magma Cream. + + + + Press{*CONTROLLER_VK_B*} now to exit the brewing interface. + + + + In this area there is a Brewing Stand, a Cauldron and a chest full of items for brewing. + + + + {*B*} +Press{*CONTROLLER_VK_A*} to learn more about brewing and potions.{*B*} +Press{*CONTROLLER_VK_B*} if you already know about brewing and potions. + + + + The first step in brewing a potion is to create a Water Bottle. Take a Glass Bottle from the chest. + + + + You can fill a glass bottle from a Cauldron that has water in it, or from a block of water. Fill your glass bottle now by pointing at a water source and pressing{*CONTROLLER_ACTION_USE*}. + + + + If a cauldron becomes empty, you can refill it with a Water Bucket. + + + + Use the Brewing Stand to create a Potion of Fire Resistance. You will need a Water Bottle, Nether Wart and Magma Cream. + + + + With a potion in your hand, hold{*CONTROLLER_ACTION_USE*} to use it. For a normal potion you will drink it and apply the effect to yourself, and for a Splash potion you will throw it and apply the effect to creatures near where it hits. +Splash potions can be created by adding gunpowder to normal potions. + + + + Use your Potion of Fire Resistance on yourself. + + + + Now that you are resistant to fire and lava, you should see if there are places you can get to that you couldn't before. + + + + This is the enchanting interface which you can use to add enchantments to weapons, armor and some tools. + + + + {*B*} +Press{*CONTROLLER_VK_A*} to learn more about the enchanting interface.{*B*} +Press{*CONTROLLER_VK_B*} if you already know about the enchanting interface. + + + + To enchant an item, first place it in the enchanting slot. Weapons, armor and some tools can be enchanted to add special effects such as improved damage resistance or increasing the number of items produced when mining a block. + + + + When an item is placed in the enchanting slot, the buttons on the right will change to show a selection of random enchantments. + + + + The number on the button represents the cost in experience levels to apply that enchantment to the item. If you do not have a high enough level the button will be disabled. + + + + Select an enchantment and press{*CONTROLLER_VK_A*} to enchant the item. This will decrease your experience level by the cost of the enchantment. + + + + Although the enchantments are all random, some of the better enchantments are only available when you have a high experience level and have lots of bookcases around the Enchantment Table to increase its power. + + + + In this area there is an Enchantment Table and some other items to help you learn about enchanting. + + + + {*B*} +Press{*CONTROLLER_VK_A*} to learn more about enchanting.{*B*} +Press{*CONTROLLER_VK_B*} if you already know about enchanting. + + + + Using an Enchantment Table allows you to add special effects such as increasing the number of items produced when mining a block, or improved damage resistance for weapons, armor and some tools. + + + + Placing bookcases around the Enchantment Table increases its power and allows access to higher level enchantments. + + + + Enchanting items costs Experience Levels, which can be built up by collecting Experience Orbs which are produced by killing monsters and animals, mining ores, breeding animals, fishing and smelting/cooking some things in a furnace. + + + + You can also build experience levels using a Bottle O' Enchanting, which, when thrown, creates Experience Orbs around where it lands. These orbs can then be collected. + + + + In the chests in this area you can find some enchanted items, Bottles O' Enchanting, and some items that have yet to be enchanted for you to experiment with at the Enchantment Table. + + + + You are now riding in a minecart. To exit the minecart, point the cursor at it and press{*CONTROLLER_ACTION_USE*} .{*MinecartIcon*} + + + + {*B*} +Press{*CONTROLLER_VK_A*} to learn more about minecarts.{*B*} +Press{*CONTROLLER_VK_B*} if you already know about minecarts. + + + + A minecart runs on rails. You can also craft a powered minecart with a furnace and a minecart with a chest in it.{*RailIcon*} + + + + You can also craft powered rails, which take power from redstone torches and circuits to accelerate the cart. These can be connected to switches, levers and pressure plates to make complex systems.{*PoweredRailIcon*} + + + + You are now sailing a boat. To exit the boat, point the cursor at it and press{*CONTROLLER_ACTION_USE*} .{*BoatIcon*} + + + + {*B*} +Press{*CONTROLLER_VK_A*} to learn more about boats.{*B*} +Press{*CONTROLLER_VK_B*} if you already know about boats. + + + + A boat allows you to travel quicker over water. You can steer it using{*CONTROLLER_ACTION_MOVE*} and{*CONTROLLER_ACTION_LOOK*}.{*BoatIcon*} + + + + You are now using a fishing rod. Press{*CONTROLLER_ACTION_USE*} to use it.{*FishingRodIcon*} + + + + {*B*} +Press{*CONTROLLER_VK_A*} to learn more about fishing.{*B*} +Press{*CONTROLLER_VK_B*} if you already know about fishing. + + + + Press{*CONTROLLER_ACTION_USE*} to cast your line and start fishing. Press{*CONTROLLER_ACTION_USE*} again to reel in the fishing line.{*FishingRodIcon*} + + + + If you wait until the float sinks below the surface of the water before reeling in you can catch a fish. Fish can be eaten raw, or cooked by a furnace, to restore health.{*FishIcon*} + + + + As with many other tools a fishing rod has a fixed number of uses. Those uses are not limited to catching fish though. You should experiment with it to see what else can be caught or activated...{*FishingRodIcon*} + + + + This is a bed. Press{*CONTROLLER_ACTION_USE*} while pointing at it at night to sleep through the night and awake in the morning.{*ICON*}355{*/ICON*} + + + + {*B*} +Press{*CONTROLLER_VK_A*} to learn more about beds.{*B*} +Press{*CONTROLLER_VK_B*} if you already know about beds. + + + + A bed should be placed in a safe, well-lit place so that monsters do not wake you in the middle of the night. Once you have used a bed, if you die you will respawn at that bed. +{*ICON*}355{*/ICON*} + + + + If there are other players in your game, everyone must be in a bed at the same time to be able to sleep. +{*ICON*}355{*/ICON*} + + + + In this area there are some simple Redstone and Piston circuits, and a chest with more items to extend these circuits. + + + + {*B*} +Press{*CONTROLLER_VK_A*} to learn more about Redstone circuits and Pistons.{*B*} +Press{*CONTROLLER_VK_B*} if you already know about Redstone circuits and Pistons. + + + + Levers, Buttons, Pressure Plates and Redstone Torches can all provide power to circuits, either by directly attaching them to the item you want to activate or by connecting them with Redstone dust. + + + + The position and direction that you place a power source can change how it affects the surrounding blocks. For example a Redstone torch on the side of a block can be turned off if the block is powered by another source. + + + + Redstone dust is collected by mining redstone ore with a pickaxe made of Iron, Diamond or Gold. You can use it to carry power up to 15 blocks, and it can travel up or down one block in height. +{*ICON*}331{*/ICON*} + + + + Redstone repeaters can be used to extend the distance that the power is carried, or put a delay in a circuit. +{*ICON*}356{*/ICON*} + + + + When powered, a Piston will extend, pushing up to 12 blocks. When they retract, Sticky Pistons can pull back one block of most types. +{*ICON*}33{*/ICON*} + + + + In the chest in this area there are some components for making circuits with pistons. Try using or completing the circuits in this area, or put together your own. There are more examples outside the tutorial area. + + + + In this area there is a Portal to the Nether! + + + + {*B*} +Press{*CONTROLLER_VK_A*} to learn more about Portals and The Nether.{*B*} +Press{*CONTROLLER_VK_B*} if you already know about Portals and The Nether. + + + + Portals are created by placing Obsidian blocks into a frame four blocks wide and five blocks tall. The corner blocks are not required. + + + + To activate a Nether Portal, set fire to the 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. + + + + The Nether can be a dangerous place, full of lava, but can be useful to collect Netherrack which burns forever when lit, and Glowstone which produces light. + + + + The Nether world can be used to fast-travel in the Overworld - traveling one block distance in the Nether is equivalent to traveling 3 blocks in the Overworld. + + + + You are now in Creative mode. + + + + {*B*} +Press{*CONTROLLER_VK_A*} to learn more about Creative mode.{*B*} +Press{*CONTROLLER_VK_B*} if you already know about Creative mode. + + + + When in Creative mode you have in infinite number of all available items and blocks, you can destroy blocks with one click without a tool, you are invulnerable and you can fly. + + + + Press{*CONTROLLER_ACTION_CRAFTING*} to open the creative inventory interface. + + + + Make your way to the opposite side of this hole to continue. + + + + You have now completed the Creative mode tutorial. + + + + In this area a farm has been set up. Farming enables you to create a renewable source of food and other items. + + + + {*B*} +Press{*CONTROLLER_VK_A*} to learn more about farming.{*B*} +Press{*CONTROLLER_VK_B*} if you already know about farming. + + + + Wheat, Pumpkins and Melons are grown from seeds. Wheat seeds are collected by breaking Tall Grass or harvesting wheat, and Pumpkin and Melon seeds are crafted from Pumpkins and Melons respectively. + + + + Before planting seeds the dirt blocks need to be turned into Farmland by using a Hoe. A nearby source of water will help keep the Farmland hydrated and make the crops grow faster, as will keeping the area lit. + + + + Wheat goes through several stages when growing, and is ready to be harvested when it appears darker.{*ICON*}59:7{*/ICON*} + + + + Pumpkins and Melons also need a block next to where you planted the seed for the fruit to grow once the stem has fully grown. + + + + Sugarcane must be planted on a Grass, Dirt or Sand block that is right next to water block. Chopping a Sugarcane block will also drop all blocks that are above it.{*ICON*}83{*/ICON*} + + + + Cacti must be planted on Sand, and will grow up to three blocks high. Like Sugarcane, destroying the lowest block will also allow you to collect the blocks that are above it.{*ICON*}81{*/ICON*} + + + + Mushrooms should be planted in a dimly lit area, and will spread to nearby dimly lit blocks.{*ICON*}39{*/ICON*} + + + + Bonemeal can be used to grow crops to their fully grown state, or grow Mushrooms into Huge Mushrooms.{*ICON*}351:15{*/ICON*} + + + + You have now completed the farming tutorial. + + + + In this area animals have been penned in. You can breed animals to produce baby versions of themselves. + + + + {*B*} +Press{*CONTROLLER_VK_A*} to learn more about animals and breeding.{*B*} +Press{*CONTROLLER_VK_B*} if you already know about animals and breeding. + + + + To get the animals to breed, you will need to feed them with the right food to get them to go into 'Love Mode'. + + + + Feed Wheat to a cow, mooshroom or sheep, Carrots to pigs, Wheat Seeds or Nether Wart to a chicken, or any kind of meat to a wolf, and they'll start looking for another animal of the same species near them that is also in Love Mode. + + + + When two animals of the same species meet, and both are in Love Mode, they will kiss for a few seconds, and then a baby animal will appear. The baby animal will follow their parents for a while before growing into a full sized animal itself. + + + + After being in Love Mode, an animal will not be able to enter it again for about five minutes. + + + + Some animals will follow you if you are holding their food in your hand. This makes it easier to group animals together to breed them.{*ICON*}296{*/ICON*} + + + + Wild wolves can be tamed by giving them bones. Once tamed Love Hearts will appear around them. Tamed wolves will follow the player and defend them if they haven't been commanded to sit. + + + + You have now completed the animal and breeding tutorial. + + + + In this area are some pumpkins and blocks to make a Snow Golem and an Iron Golem. + + + + {*B*} +Press{*CONTROLLER_VK_A*} to learn more about Golems.{*B*} +Press{*CONTROLLER_VK_B*} if you already know about Golems. + + + + Golems are created by placing a pumpkin on top of a stack of blocks. + + + + Snow Golems are created with two Snow Blocks, one of top of the other, with a pumpkin on top. Snow Golems throw snowballs at your enemies. + + + + Iron Golems are created with four Iron Blocks in the pattern shown, with a pumpkin on top of the middle block. Iron Golems attack your enemies. + + + + Iron Golems also appear naturally to protect villages, and will attack you if you attack any villagers. + + + + You cannot leave this area until you have completed the tutorial. + + + + Different tools are better for different materials. You should use a shovel to mine soft materials like earth and sand. + + + + Different tools are better for different materials. You should use an axe to chop tree trunks. + + + + Different tools are better for different materials. You should use a pickaxe to mine stone and ore. You may need to make your pickaxe from better materials to get resources from some blocks. + + + + Certain tools are better for attacking enemies. Consider using a sword to attack. + + + + Hint: Hold {*CONTROLLER_ACTION_ACTION*}to mine and chop using your hand or whatever you are holding. You may need to craft a tool to mine some blocks... + + + + The tool you are using has become damaged. Every time you use a tool it becomes damaged, and will eventually break. The colored bar below the item in your inventory shows the current damage state. + + + + Hold{*CONTROLLER_ACTION_JUMP*} to swim up. + + + + In this area there is a minecart on a track. To enter the minecart, point the cursor at it and press{*CONTROLLER_ACTION_USE*}. Use{*CONTROLLER_ACTION_USE*} on the button to make the minecart move. + + + + In the chest beside the river there is a boat. To use the boat, point the cursor at water and press{*CONTROLLER_ACTION_USE*}. Use{*CONTROLLER_ACTION_USE*} while pointing at the boat to enter it. + + + + In the chest beside the pond there is a fishing rod. Take the fishing rod from the chest and select it as the current item in your hand to use it. + + + + This more advanced piston mechanism creates a self-repairing bridge! Push the button to activate, then investigate how the components interact to learn more. + + + + If you move the pointer outside of the interface while carrying an item, you can drop that item. + + + + You do not have all the ingredients required to make this item. The box on the bottom left shows the ingredients required to craft this. + + + + Congratulations, you have completed the tutorial. Time in the game is now passing normally, and you don't have long until night time and the monsters come out! Finish your shelter! + + + + {*EXIT_PICTURE*} When you are ready to explore further, there is a stairway in this area near the Miner's shelter that leads to a small castle. + + + + Reminder: + + + + + + + + New features have been added to the game in the latest version, including new areas in the tutorial world. + + + + {*B*}Press{*CONTROLLER_VK_A*} to play through the tutorial as normal.{*B*} +Press{*CONTROLLER_VK_B*} to skip the main tutorial. + + + + In this area you will find areas setup to help you learn about fishing, boats, pistons and redstone. + + + + Outside of this area you will find examples of buildings, farming, minecarts and tracks, enchanting, brewing, trading, smithing and more! + + + + Your food bar has depleted to a level where you will no longer heal. + + + + {*B*} +Press{*CONTROLLER_VK_A*} to learn more about the food bar and eating food.{*B*} +Press{*CONTROLLER_VK_B*} if you already know about the food bar and eating food. + + + + 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 + + + + Use + + + + Back + + + + Exit + + + + Cancel + + + + Cancel Join + + + + Refresh Online Games List + + + + Party Games + + + + All Games + + + + Change Group + + + + Show Inventory + + + + Show Description + + + + Show Ingredients + + + + Crafting + + + + Create + + + + Take/Place + + + + Take + + + + Take All + + + + Take Half + + + + Place + + + + Place All + + + + Place One + + + + Drop + + + + Drop All + + + + Drop One + + + + Swap + + + + Quick Move + + + + Clear Quick Select + + + + What's This? + + + + Share To Facebook + + + + Change Filter + + + + Send Friend Request + + + + Page Down + + + + Page Up + + + + Next + + + + Previous + + + + Kick Player + + + + Dye + + + + Mine + + + + Feed + + + + Tame + + + + Heal + + + + Sit + + + + Follow Me + + + + Eject + + + + Empty + + + + Saddle + + + + Place + + + + Hit + + + + Milk + + + + Collect + + + + Eat + + + + Sleep + + + + Wake Up + + + + Play + + + + Ride + + + + Sail + + + + Grow + + + + Swim Up + + + + Open + + + + Change Pitch + + + + Detonate + + + + Read + + + + Hang + + + + Throw + + + + Plant + + + + Till + + + + Harvest + + + + Continue + + + + Unlock Full Game + + + + Delete Save + + + + Delete + + + + Options + + + + Invite Friends + + + + Accept + + + + Shear + + + + Ban Level + + + + Select Skin + + + + Ignite + + + + Navigate + + + + Install Full Version + + + + Install Trial Version + + + + Install + + + + Reinstall + + + + Save Options + + + + Execute Command + + + + Creative + + + + Move Ingredient + + + + Move Fuel + + + + Move Tool + + + + Move Armor + + + + Move Weapon + + + + Equip + + + + Draw + + + + Release + + + + Privileges + + + + Block + + + + Page Up + + + + Page Down + + + + Love Mode + + + + Drink + + + + Rotate + + + + Hide + + + + Clear All Slots + + + + Mount + + + + Dismount + + + + Attach Chest + + + + Launch + + + + Leash + + + + Release + + + + Attach + + + + Name + + + + OK + + + + Cancel + + + + Minecraft Store + + + + Are you sure you want to leave your current game and join the new one? Any unsaved progress will be lost. + + + + Exit Game + + + + Save Game + + + + Exit Without Saving + + + + Are you sure you want to overwrite any previous save for this world with the current version of this world? + + + + Are you sure you want to exit without saving? You will lose all progress in this world! + + + + Start Game + + + + Damaged Save + + + + This save is corrupt or damaged. Would you like to delete it? + + + + Are you sure you want to exit to the main menu and disconnect all players from the game? Any unsaved progress will be lost. + + + + Exit and save + + + + Exit without saving + + + + Are you sure you want to exit to the main menu? Any unsaved progress will be lost. + + + + Are you sure you want to exit to the main menu? Your progress will be lost! + + + + Create New World + + + + Play Tutorial + + + + Tutorial + + + + Name Your World + + + + Enter a name for your world + + + + Input the seed for your world generation + + + + Load Saved World + + + + Press START to join game + + + + Exiting the game + + + + An error occurred. Exiting to the main menu. + + + + Connection failed + + + + Connection lost + + + + Connection to the server was lost. Exiting to the main menu. + + + + Disconnected by the server + + + + You were kicked from the game + + + + You were kicked from the game for flying + + + + Connection attempt took too long + + + + The server is full + + + + The host has exited the game. + + + + You cannot join this game as you are not friends with anybody in the game. + + + + You cannot join this game as you have previously been kicked by the host. + + + + You cannot join this game as the player you are trying to join is running an older version of the game. + + + + You cannot join this game as the player you are trying to join is running a newer version of the game. + + + + New World + + + + Award Unlocked! + + + + Hurray - you've been awarded a gamerpic featuring Steve from Minecraft! + + + + Hurray - you've been awarded a gamerpic featuring a Creeper! + + + + Unlock Full Game + + + + You're playing the trial game, but you'll need the full game to be able to save your game. +Would you like to unlock the full game now? + + + + Please wait + + + + No results + + + + Filter: + + + + Friends + + + + My Score + + + + Overall + + + + Entries: + + + + Rank + + + + Preparing to Save Level + + + + Preparing Chunks... + + + + Finalizing... + + + + Building Terrain + + + + Simulating world for a bit + + + + Initializing server + + + + Generating spawn area + + + + Loading spawn area + + + + Entering The Nether + + + + Leaving The Nether + + + + Respawning + + + + Generating level + + + + Loading level + + + + Saving players + + + + Connecting to host + + + + Downloading terrain + + + + Switching to offline game + + + + Please wait while the host saves the game + + + + Entering The END + + + + Leaving The END + + + + Finding Seed for the World Generator + + + + This bed is occupied + + + + You can only sleep at night + + + + %s is sleeping in a bed. To skip to dawn, all players need to sleep in beds at the same time. + + + + Your home bed was missing or obstructed + + + + You may not rest now, there are monsters nearby + + + + You are sleeping in a bed. To skip to dawn, all players need to sleep in beds at the same time. + + + + Tools and Weapons + + + + Weapons + + + + Food + + + + Structures + + + + Armor + + + + Mechanisms + + + + Transport + + + + Decorations + + + + Building Blocks + + + + Redstone & Transportation + + + + Miscellaneous + + + + Brewing + + + + Tools, Weapons & Armor + + + + Materials + + + + Signed out + + + + Difficulty + + + + Music + + + + Sound + + + + Gamma + + + + Game Sensitivity + + + + Interface Sensitivity + + + + Peaceful + + + + Easy + + + + Normal + + + + Hard + + + + In this mode, the player regains health over time, and there are no enemies in the environment. + + + + In this mode, enemies spawn in the environment, but will do less damage to the player than in the Normal mode. + + + + In this mode, enemies spawn in the environment and will do a standard amount of damage to the player. + + + + In this mode, enemies will spawn in the environment, and will do a great deal of damage to the player. Watch out for the Creepers too, since they are unlikely to cancel their exploding attack when you move away from them! + + + + Trial Timeout + + + + Game full + + + + Failed to join game as there are no spaces left + + + + Enter Sign Text + + + + Enter a line of text for your sign + + + + Enter Title + + + + Enter a title for your post + + + + Enter Caption + + + + Enter a caption for your post + + + + Enter Description + + + + Enter a description for your post + + + + Inventory + + + + Ingredients + + + + Brewing Stand + + + + Chest + + + + Enchant + + + + Furnace + + + + Ingredient + + + + Fuel + + + + Dispenser + + + + 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. + + + + %s has joined the game. + + + + %s has left the game. + + + + %s was kicked from the game. + + + + Are you sure you want to delete this save game? + + + + Awaiting approval + + + + Censored + + + + Now playing: + + + + Reset Settings + + + + Are you sure you would like to reset your settings to their default values? + + + + Loading Error + + + + %s's Game + + + + Unknown host game + + + + Guest signed out + + + + A guest player has signed out causing all guest players to be removed from the game. + + + + Sign in + + + + You are not signed in. In order to play this game, you will need to be signed in. Do you want to sign in now? + + + + Multiplayer not allowed + + + + Failed to create game + + + + Auto Selected + + + + No Pack: Default Skins + + + + Favorite Skins + + + + Banned Level + + + + The game you are joining is in your banned level list. +If you choose to join this game, the level will be removed from your banned level list. + + + + Ban This Level? + + + + Are you sure you want to add this level to your banned level list? +Selecting OK will also exit this game. + + + + Remove from Banned List + + + + Autosave Interval + + + + Autosave Interval: OFF + + + + Mins + + + + Can't Place Here! + + + + Placing lava close to the level spawn point is not allowed due to the possibility of instant death for spawning players. + + + + Interface Opacity + + + + Preparing to Autosave Level + + + + HUD Size + + + + HUD Size (Splitscreen) + + + + Seed + + + + Unlock Skin Pack + + + + To use the skin you have selected, you need to unlock this skin pack. +Would you like to unlock this skin pack now? + + + + Unlock Texture Pack + + + + To use this texture pack for your world, you need to unlock it. +Would you like to unlock it now? + + + + Trial Texture Pack + + + + You are using a trial version of the texture pack. You will not be able to save this world unless you unlock the full version. +Would you like to unlock the full version of the texture pack? + + + + Texture Pack Not Present + + + + Unlock Full Version + + + + Download Trial Version + + + + Download Full Version + + + + This world uses a mash-up pack or texture pack you don't have! +Would you like to install the mash-up pack or texture pack now? + + + + Get Trial Version + + + + Get Full Version + + + + Kick player + + + + Are you sure you want to kick this player from the game? They will not be able to rejoin until you restart the world. + + + + Gamerpics Packs + + + + Themes + + + + Skins Packs + + + + Allow friends of friends + + + + You cannot join this game because it has been limited to players who are friends of the host. + + + + Can't Join Game + + + + Selected + + + + Selected skin: + + + + Corrupt Downloadable Content + + + + This downloadable content is corrupt and cannot be used. You need to delete it, then re-install it from the Minecraft Store menu. + + + + Some of your downloadable content is corrupt and cannot be used. You need to delete them, then re-install them from the Minecraft Store menu. + + + + Your game mode has been changed + + + + Rename Your World + + + + Enter the new name for your world + + + + Game Mode: Survival + + + + Game Mode: Creative + + + + Game Mode: Adventure + + + + Survival + + + + Creative + + + + Adventure + + + + Created in Survival Mode + + + + Created in Creative Mode + + + + Render Clouds + + + + What would you like to do with this save game? + + + + Rename Save + + + + Autosaving in %d... + + + + On + + + + Off + + + + Normal + + + + Superflat + + + + Enter a seed to generate the same terrain again. Leave blank for a random world. + + + + When enabled, the game will be an online game. + + + + When enabled, only invited players can join. + + + + When enabled, friends of people on your Friends List can join the game. + + + + When enabled, players can inflict damage on other players. Only affects Survival mode. + + + + When disabled, players joining the game cannot build or mine until authorised. + + + + When enabled, fire may spread to nearby flammable blocks. + + + + When enabled, TNT will explode when activated. + + + + When enabled, the Nether world will be re-generated. This is useful if you have an older save where Nether Fortresses were not present. + + + + When enabled, structures such as Villages and Strongholds will generate in the world. + + + + When enabled, a completely flat world will be generated in the Overworld and in the Nether. + + + + When enabled, a chest containing some useful items will be created near the player spawn point. + + + + 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 + + + + Themes + + + + Gamerpics + + + + Avatar Items + + + + Texture Packs + + + + Mash-Up Packs + + + + {*PLAYER*} went up in flames + + + + {*PLAYER*} burned to death + + + + {*PLAYER*} tried to swim in lava + + + + {*PLAYER*} suffocated in a wall + + + + {*PLAYER*} drowned + + + + {*PLAYER*} starved to death + + + + {*PLAYER*} was pricked to death + + + + {*PLAYER*} hit the ground too hard + + + + {*PLAYER*} fell out of the world + + + + {*PLAYER*} died + + + + {*PLAYER*} blew up + + + + {*PLAYER*} was killed by magic + + + + {*PLAYER*} was killed by Ender Dragon breath + + + + {*PLAYER*} was slain by {*SOURCE*} + + + + {*PLAYER*} was slain by {*SOURCE*} + + + + {*PLAYER*} was shot by {*SOURCE*} + + + + {*PLAYER*} was fireballed by {*SOURCE*} + + + + {*PLAYER*} was pummeled by {*SOURCE*} + + + + {*PLAYER*} was killed by {*SOURCE*} 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*} + + + + Bedrock Fog + + + + Display HUD + + + + Display Hand + + + + Death Messages + + + + Animated Character + + + + Custom Skin Animation + + + + You can no longer mine or use items + + + + You can now mine and use items + + + + You can no longer place blocks + + + + You can now place blocks + + + + You can now use doors and switches + + + + You can no longer use doors and switches + + + + You can now use containers (e.g. chests) + + + + You can no longer use containers (e.g. chests) + + + + You can no longer attack mobs + + + + You can now attack mobs + + + + You can no longer attack players + + + + You can now attack players + + + + You can no longer attack animals + + + + You can now attack animals + + + + You are now a moderator + + + + You are no longer a moderator + + + + You can now fly + + + + You can no longer fly + + + + You will no longer get exhausted + + + + You will now get exhausted + + + + You are now invisible + + + + You are no longer invisible + + + + You are now invulnerable + + + + You are no longer invulnerable + + + + %d MSP + + + + Ender Dragon + + + + %s has entered The End + + + + %s has left The End + + + + +{*C3*}I see the player you mean.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}?{*EF*}{*B*}{*B*} +{*C3*}Yes. Take care. It has reached a higher level now. It can read our thoughts.{*EF*}{*B*}{*B*} +{*C2*}That doesn't matter. It thinks we are part of the game.{*EF*}{*B*}{*B*} +{*C3*}I like this player. It played well. It did not give up.{*EF*}{*B*}{*B*} +{*C2*}It is reading our thoughts as though they were words on a screen.{*EF*}{*B*}{*B*} +{*C3*}That is how it chooses to imagine many things, when it is deep in the dream of a game.{*EF*}{*B*}{*B*} +{*C2*}Words make a wonderful interface. Very flexible. And less terrifying than staring at the reality behind the screen.{*EF*}{*B*}{*B*} +{*C3*}They used to hear voices. Before players could read. Back in the days when those who did not play called the players witches, and warlocks. And players dreamed they flew through the air, on sticks powered by demons.{*EF*}{*B*}{*B*} +{*C2*}What did this player dream?{*EF*}{*B*}{*B*} +{*C3*}This player dreamed of sunlight and trees. Of fire and water. It dreamed it created. And it dreamed it destroyed. It dreamed it hunted, and was hunted. It dreamed of shelter.{*EF*}{*B*}{*B*} +{*C2*}Hah, the original interface. A million years old, and it still works. But what true structure did this player create, in the reality behind the screen?{*EF*}{*B*}{*B*} +{*C3*}It worked, with a million others, to sculpt a true world in a fold of the {*EF*}{*NOISE*}{*C3*}, and created a {*EF*}{*NOISE*}{*C3*} for {*EF*}{*NOISE*}{*C3*}, in the {*EF*}{*NOISE*}{*C3*}.{*EF*}{*B*}{*B*} +{*C2*}It cannot read that thought.{*EF*}{*B*}{*B*} +{*C3*}No. It has not yet achieved the highest level. That, it must achieve in the long dream of life, not the short dream of a game.{*EF*}{*B*}{*B*} +{*C2*}Does it know that we love it? That the universe is kind?{*EF*}{*B*}{*B*} +{*C3*}Sometimes, through the noise of its thoughts, it hears the universe, yes.{*EF*}{*B*}{*B*} +{*C2*}But there are times it is sad, in the long dream. It creates worlds that have no summer, and it shivers under a black sun, and it takes its sad creation for reality.{*EF*}{*B*}{*B*} +{*C3*}To cure it of sorrow would destroy it. The sorrow is part of its own private task. We cannot interfere.{*EF*}{*B*}{*B*} +{*C2*}Sometimes when they are deep in dreams, I want to tell them, they are building true worlds in reality. Sometimes I want to tell them of their importance to the universe. Sometimes, when they have not made a true connection in a while, I want to help them to speak the word they fear.{*EF*}{*B*}{*B*} +{*C3*}It reads our thoughts.{*EF*}{*B*}{*B*} +{*C2*}Sometimes I do not care. Sometimes I wish to tell them, this world you take for truth is merely {*EF*}{*NOISE*}{*C2*} and {*EF*}{*NOISE*}{*C2*}, I wish to tell them that they are {*EF*}{*NOISE*}{*C2*} in the {*EF*}{*NOISE*}{*C2*}. They see so little of reality, in their long dream.{*EF*}{*B*}{*B*} +{*C3*}And yet they play the game.{*EF*}{*B*}{*B*} +{*C2*}But it would be so easy to tell them...{*EF*}{*B*}{*B*} +{*C3*}Too strong for this dream. To tell them how to live is to prevent them living.{*EF*}{*B*}{*B*} +{*C2*}I will not tell the player how to live.{*EF*}{*B*}{*B*} +{*C3*}The player is growing restless.{*EF*}{*B*}{*B*} +{*C2*}I will tell the player a story.{*EF*}{*B*}{*B*} +{*C3*}But not the truth.{*EF*}{*B*}{*B*} +{*C2*}No. A story that contains the truth safely, in a cage of words. Not the naked truth that can burn over any distance.{*EF*}{*B*}{*B*} +{*C3*}Give it a body, again.{*EF*}{*B*}{*B*} +{*C2*}Yes. Player...{*EF*}{*B*}{*B*} +{*C3*}Use its name.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}. Player of games.{*EF*}{*B*}{*B*} +{*C3*}Good.{*EF*}{*B*}{*B*} + + + + + +{*C2*}Take a breath, now. Take another. Feel air in your lungs. Let your limbs return. Yes, move your fingers. Have a body again, under gravity, in air. Respawn in the long dream. There you are. Your body touching the universe again at every point, as though you were separate things. As though we were separate things.{*EF*}{*B*}{*B*} +{*C3*}Who are we? Once we were called the spirit of the mountain. Father sun, mother moon. Ancestral spirits, animal spirits. Jinn. Ghosts. The green man. Then gods, demons. Angels. Poltergeists. Aliens, extraterrestrials. Leptons, quarks. The words change. We do not change.{*EF*}{*B*}{*B*} +{*C2*}We are the universe. We are everything you think isn't you. You are looking at us now, through your skin and your eyes. And why does the universe touch your skin, and throw light on you? To see you, player. To know you. And to be known. I shall tell you a story.{*EF*}{*B*}{*B*} +{*C2*}Once upon a time, there was a player.{*EF*}{*B*}{*B*} +{*C3*}The player was you, {*PLAYER*}.{*EF*}{*B*}{*B*} +{*C2*}Sometimes it thought itself human, on the thin crust of a spinning globe of molten rock. The ball of molten rock circled a ball of blazing gas that was three hundred and thirty thousand times more massive than it. They were so far apart that light took eight minutes to cross the gap. The light was information from a star, and it could burn your skin from a hundred and fifty million kilometres away.{*EF*}{*B*}{*B*} +{*C2*}Sometimes the player dreamed it was a miner, on the surface of a world that was flat, and infinite. The sun was a square of white. The days were short; there was much to do; and death was a temporary inconvenience.{*EF*}{*B*}{*B*} +{*C3*}Sometimes the player dreamed it was lost in a story.{*EF*}{*B*}{*B*} +{*C2*}Sometimes the player dreamed it was other things, in other places. Sometimes these dreams were disturbing. Sometimes very beautiful indeed. Sometimes the player woke from one dream into another, then woke from that into a third.{*EF*}{*B*}{*B*} +{*C3*}Sometimes the player dreamed it watched words on a screen.{*EF*}{*B*}{*B*} +{*C2*}Let's go back.{*EF*}{*B*}{*B*} +{*C2*}The atoms of the player were scattered in the grass, in the rivers, in the air, in the ground. A woman gathered the atoms; she drank and ate and inhaled; and the woman assembled the player, in her body.{*EF*}{*B*}{*B*} +{*C2*}And the player awoke, from the warm, dark world of its mother's body, into the long dream.{*EF*}{*B*}{*B*} +{*C2*}And the player was a new story, never told before, written in letters of DNA. And the player was a new program, never run before, generated by a sourcecode a billion years old. And the player was a new human, never alive before, made from nothing but milk and love.{*EF*}{*B*}{*B*} +{*C3*}You are the player. The story. The program. The human. Made from nothing but milk and love.{*EF*}{*B*}{*B*} +{*C2*}Let's go further back.{*EF*}{*B*}{*B*} +{*C2*}The seven billion billion billion atoms of the player's body were created, long before this game, in the heart of a star. So the player, too, is information from a star. And the player moves through a story, which is a forest of information planted by a man called Julian, on a flat, infinite world created by a man called Markus, that exists inside a small, private world created by the player, who inhabits a universe created by...{*EF*}{*B*}{*B*} +{*C3*}Shush. Sometimes the player created a small, private world that was soft and warm and simple. Sometimes hard, and cold, and complicated. Sometimes it built a model of the universe in its head; flecks of energy, moving through vast empty spaces. Sometimes it called those flecks "electrons" and "protons".{*EF*}{*B*}{*B*} + + + + + +{*C2*}Sometimes it called them "planets" and "stars".{*EF*}{*B*}{*B*} +{*C2*}Sometimes it believed it was in a universe that was made of energy that was made of offs and ons; zeros and ones; lines of code. Sometimes it believed it was playing a game. Sometimes it believed it was reading words on a screen.{*EF*}{*B*}{*B*} +{*C3*}You are the player, reading words...{*EF*}{*B*}{*B*} +{*C2*}Shush... Sometimes the player read lines of code on a screen. Decoded them into words; decoded words into meaning; decoded meaning into feelings, emotions, theories, ideas, and the player started to breathe faster and deeper and realised it was alive, it was alive, those thousand deaths had not been real, the player was alive{*EF*}{*B*}{*B*} +{*C3*}You. You. You are alive.{*EF*}{*B*}{*B*} +{*C2*}and sometimes the player believed the universe had spoken to it through the sunlight that came through the shuffling leaves of the summer trees{*EF*}{*B*}{*B*} +{*C3*}and sometimes the player believed the universe had spoken to it through the light that fell from the crisp night sky of winter, where a fleck of light in the corner of the player's eye might be a star a million times as massive as the sun, boiling its planets to plasma in order to be visible for a moment to the player, walking home at the far side of the universe, suddenly smelling food, almost at the familiar door, about to dream again{*EF*}{*B*}{*B*} +{*C2*}and sometimes the player believed the universe had spoken to it through the zeros and ones, through the electricity of the world, through the scrolling words on a screen at the end of a dream{*EF*}{*B*}{*B*} +{*C3*}and the universe said I love you{*EF*}{*B*}{*B*} +{*C2*}and the universe said you have played the game well{*EF*}{*B*}{*B*} +{*C3*}and the universe said everything you need is within you{*EF*}{*B*}{*B*} +{*C2*}and the universe said you are stronger than you know{*EF*}{*B*}{*B*} +{*C3*}and the universe said you are the daylight{*EF*}{*B*}{*B*} +{*C2*}and the universe said you are the night{*EF*}{*B*}{*B*} +{*C3*}and the universe said the darkness you fight is within you{*EF*}{*B*}{*B*} +{*C2*}and the universe said the light you seek is within you{*EF*}{*B*}{*B*} +{*C3*}and the universe said you are not alone{*EF*}{*B*}{*B*} +{*C2*}and the universe said you are not separate from every other thing{*EF*}{*B*}{*B*} +{*C3*}and the universe said you are the universe tasting itself, talking to itself, reading its own code{*EF*}{*B*}{*B*} +{*C2*}and the universe said I love you because you are love.{*EF*}{*B*}{*B*} +{*C3*}And the game was over and the player woke up from the dream. And the player began a new dream. And the player dreamed again, dreamed better. And the player was the universe. And the player was love.{*EF*}{*B*}{*B*} +{*C3*}You are the player.{*EF*}{*B*}{*B*} +{*C2*}Wake up.{*EF*} + + + + + Reset Nether + + + + Are you sure you want to reset the Nether in this savegame to its default state? You will lose anything you have built in the Nether! + + + + Reset Nether + + + + Don't Reset Nether + + + + Can't shear this Mooshroom at the moment. The maximum number of Pigs, Sheep, Cows, Cats and Horses 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 Wolves in a world has been reached. + + + + Can't use Spawn Egg at the moment. The maximum number of Chickens in a world has been reached. + + + + Can't use Spawn Egg at the moment. The maximum number of Squid in a world has been reached. + + + + Can't use Spawn Egg at the moment. The maximum number of 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 villagers in a world has been reached. + + + + The maximum number of Paintings/Item Frames in a world has been reached. + + + + You can't spawn enemies in Peaceful mode. + + + + This animal can't enter Love Mode. The maximum number of breeding Pigs, Sheep, Cows, 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 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. + + + + The maximum number of Boats in a world has been reached. + + + + The maximum number of Mob Heads in a world has been reached. + + + + Invert Look + + + + Southpaw + + + + You Died! + + + + Respawn + + + + Downloadable Content Offers + + + + Change Skin + + + + How To Play + + + + Controls + + + + Settings + + + + Languages + + + + Credits + + + + Reinstall Content + + + + Debug Settings + + + + Fire Spreads + + + + TNT Explodes + + + + Player vs Player + + + + Trust Players + + + + Host Privileges + + + + Generate Structures + + + + Superflat World + + + + Bonus Chest + + + + World Options + + + + Game Options + + + + Mob Griefing + + + + Keep Inventory + + + + Mob Spawning + + + + Mob Loot + + + + Tile Drops + + + + Natural Regeneration + + + + Daylight Cycle + + + + Can Build and Mine + + + + Can Use Doors and Switches + + + + Can Open Containers + + + + Can Attack Players + + + + Can Attack Animals + + + + Moderator + + + + Kick Player + + + + Can Fly + + + + Disable Exhaustion + + + + Invisible + + + + Host Options + + + + Players/Invite + + + + Online Game + + + + Invite Only + + + + More Options + + + + Load + + + + New World + + + + World Name + + + + Seed for the World Generator + + + + Leave blank for a random seed + + + + Players + + + + Join Game + + + + Start Game + + + + No Games Found + + + + Play Game + + + + Leaderboards + + + + Help & Options + + + + Unlock Full Game + + + + Resume Game + + + + Save Game + + + + Difficulty: + + + + Game Type: + + + + Structures: + + + + Level Type: + + + + PvP: + + + + Trust Players: + + + + TNT: + + + + Fire Spreads: + + + + Reinstall Theme + + + + Reinstall Gamerpic 1 + + + + Reinstall Gamerpic 2 + + + + Reinstall Avatar Item 1 + + + + Reinstall Avatar Item 2 + + + + Reinstall Avatar Item 3 + + + + Options + + + + Audio + + + + Control + + + + Graphics + + + + User Interface + + + + Reset to Defaults + + + + View Bobbing + + + + Hints + + + + In-Game Tooltips + + + + 2 Player Split-screen Vertical + + + + Done + + + + Edit sign message: + + + + Fill in the details to accompany your screenshot + + + + Caption + + + + Screenshot from in-game + + + + Edit sign message: + + + + The classic Minecraft textures, icons and user interface! + + + + Show all Mash-up Worlds + + + + No Effects + + + + Speed + + + + Slowness + + + + Haste + + + + Mining Fatigue + + + + Strength + + + + Weakness + + + + Instant Health + + + + Instant Damage + + + + Jump Boost + + + + Nausea + + + + Regeneration + + + + Resistance + + + + Fire Resistance + + + + Water Breathing + + + + Invisibility + + + + Blindness + + + + Night Vision + + + + Hunger + + + + Poison + + + + Wither + + + + Health Boost + + + + Absorption + + + + Saturation + + + + of Swiftness + + + + of Slowness + + + + of Haste + + + + of Dullness + + + + of Strength + + + + of Weakness + + + + of Healing + + + + of Harming + + + + of Leaping + + + + of Nausea + + + + of Regeneration + + + + of Resistance + + + + of Fire Resistance + + + + of Water Breathing + + + + of Invisibility + + + + of Blindness + + + + of Night Vision + + + + of Hunger + + + + of Poison + + + + of Decay + + + + of Health Boost + + + + of Absorption + + + + of Saturation + + + + + + + + + II + + + + III + + + + IV + + + + Splash + + + + Mundane + + + + Uninteresting + + + + Bland + + + + Clear + + + + Milky + + + + Diffuse + + + + Artless + + + + Thin + + + + Awkward + + + + Flat + + + + Bulky + + + + Bungling + + + + Buttered + + + + Smooth + + + + Suave + + + + Debonair + + + + Thick + + + + Elegant + + + + Fancy + + + + Charming + + + + Dashing + + + + Refined + + + + Cordial + + + + Sparkling + + + + Potent + + + + Foul + + + + Odorless + + + + Rank + + + + Harsh + + + + Acrid + + + + Gross + + + + Stinky + + + + Used as the base of all potions. Use in a brewing stand to create potions. + + + + Has no effects, can be used in a brewing stand to create potions by adding more ingredients. + + + + Increases affected players, animals and monsters movement speed, and players sprinting speed, jumping length and field of view. + + + + Reduces affected players, animals and monsters movement speed, and players sprinting speed, jumping length and field of view. + + + + Increase the damage caused by affected players and monsters when attacking. + + + + Reduces the damage cause by affected players and monsters when attacking. + + + + Instantly increases the affected players, animals and monsters health. + + + + Instantly reduces the affected players, animals and monsters health. + + + + Restores health to the affected players, animals and monsters over time. + + + + Makes the affected players, animals and monsters immune to damage from fire, lava, and ranged Blaze attacks. + + + + Reduces health of the affected players, animals and monsters over time. + + + + When Applied: + + + + Horse Jump Strength + + + + Zombie Reinforcements + + + + Max Health + + + + Mob Follow Range + + + + Knockback Resistance + + + + Speed + + + + Attack Damage + + + + Sharpness + + + + Smite + + + + Bane of Arthropods + + + + Knockback + + + + Fire Aspect + + + + Protection + + + + Fire Protection + + + + Feather Falling + + + + Blast Protection + + + + Projectile Protection + + + + Respiration + + + + Aqua Affinity + + + + Efficiency + + + + Silk Touch + + + + Unbreaking + + + + Looting + + + + Fortune + + + + Power + + + + Flame + + + + Punch + + + + Infinity + + + + I + + + + II + + + + III + + + + IV + + + + V + + + + VI + + + + VII + + + + VIII + + + + IX + + + + X + + + + Can be mined with an Iron pickaxe or better to collect Emeralds. + + + + Similar to a Chest except that items placed in an Ender Chest are available in every one of the player's Ender Chests, even in different dimensions. + + + + Is activated when an entity passes through a connected Tripwire. + + + + Activates a connected Tripwire Hook when an entity passes through it. + + + + A compact way of storing Emeralds. + + + + A wall made of Cobblestone. + + + + Can be used to repair weapons, tools and armor. + + + + Smelted in a furnace to produce Nether Quartz. + + + + Used as a decoration. + + + + Can be traded with villagers. + + + + Used as a decoration. Flowers, Saplings, Cacti and Mushrooms can be planted in it. + + + + Restores 2{*ICON_SHANK_01*}, and can be crafted into a golden carrot. Can be planted in farmland. + + + + Restores 0.5{*ICON_SHANK_01*}, or can be cooked in a furnace. This can be planted in farmland. + + + + Restores 3{*ICON_SHANK_01*}. Created by cooking a potato in a furnace. + + + + Restores 1{*ICON_SHANK_01*}. Eating this can cause you to become poisoned. + + + + Restores 3{*ICON_SHANK_01*}. Crafted from a carrot and gold nuggets. + + + + Used to control a saddled pig when riding on it. + + + + Restores 4{*ICON_SHANK_01*}. + + + + Used with an Anvil to enchant weapons, tools or armor. + + + + Created by mining Nether Quartz Ore. Can be crafted into a Block of Quartz. + + + + Crafted from Wool. Used as a decoration. + + + + Emerald + + + + Flower Pot + + + + Carrot + + + + Potato + + + + Baked Potato + + + + Poisonous Potato + + + + Golden Carrot + + + + Carrot on a Stick + + + + Pumpkin Pie + + + + Enchanted Book + + + + Nether Quartz + + + + Emerald Ore + + + + Ender Chest + + + + Tripwire Hook + + + + Tripwire + + + + Block of Emerald + + + + Cobblestone Wall + + + + Mossy Cobblestone Wall + + + + Flower Pot + + + + Carrots + + + + Potatoes + + + + Anvil + + + + Anvil + + + + Slightly Damaged Anvil + + + + Very Damaged Anvil + + + + Nether Quartz Ore + + + + Block of Quartz + + + + Chiseled Quartz Block + + + + Pillar Quartz Block + + + + Quartz Stairs + + + + Carpet + + + + Black Carpet + + + + Red Carpet + + + + Green Carpet + + + + Brown Carpet + + + + Blue Carpet + + + + Purple Carpet + + + + Cyan Carpet + + + + Light Gray Carpet + + + + Gray Carpet + + + + Pink Carpet + + + + Lime Carpet + + + + Yellow Carpet + + + + Light Blue Carpet + + + + Magenta Carpet + + + + Orange Carpet + + + + White Carpet + + + + Chiseled Sandstone + + + + Smooth Sandstone + + + + {*PLAYER*} was killed trying to hurt {*SOURCE*} + + + + {*PLAYER*} was squashed by a falling Anvil. + + + + {*PLAYER*} was squashed by a falling block. + + + + Teleported {*PLAYER*} to {*DESTINATION*} + + + + {*PLAYER*} teleported you to their position + + + + {*PLAYER*} teleported to you + + + + Thorns + + + + Quartz Slab + + + + Makes dark areas appear as if in daylight, even under water. + + + + Makes affected players, animals and monsters invisible. + + + + Repair & Name + + + + Enchantment Cost: %d + + + + Too Expensive! + + + + Rename + + + + You have: + + + + Required Items For Trade + + + + {*VILLAGER_TYPE*} offers %s + + + + Repair + + + + Trade + + + + Dye collar + + + + + This is the Anvil interface, which you can use to rename, repair and apply enchantments to weapons, armor, or tools, at the cost of Experience Levels. + + + + + + {*B*} + Press{*CONTROLLER_VK_A*} to learn more about the Anvil interface.{*B*} + Press{*CONTROLLER_VK_B*} if you already know the Anvil interface. + + + + + + To begin working on an item, place it in the first input slot. + + + + + + When the correct raw material is placed in the second input slot (e.g. Iron Ingots for a damaged Iron Sword), the proposed repair appears in the output slot. + + + + + + Alternatively, a second identical item can be placed into the second slot to combine the two items. + + + + + + To enchant items on the Anvil, place an Enchanted Book in the second input slot. + + + + + + The number of Experience Levels that the work will cost is shown beneath the output. If you do not have enough Experience Levels, the repair cannot be completed. + + + + + + It is possible to rename the item by editing the name shown in the textbox. + + + + + + Picking up the repaired item will consume both items used by the Anvil and decrease your Experience Level by the given amount. + + + + + + In this area there is an Anvil and a Chest containing tools and weapons to work on. + + + + + + {*B*} + Press{*CONTROLLER_VK_A*} to learn more about the Anvil.{*B*} + Press{*CONTROLLER_VK_B*} if you already know about the Anvil. + + + + + + Using an Anvil, weapons and tools can be repaired to restore their durability, renamed, or enchanted with Enchanted Books. + + + + + + Enchanted Books can be found inside Chests within dungeons, or enchanted from normal Books at the Enchantment Table. + + + + + + Using the Anvil costs Experience Levels, and each use has a chance to damage the Anvil. + + + + + + The type of work to be done, value of the item, number of enchantments, and amount of prior work all affect the cost of repair. + + + + + + Renaming an item changes the displayed name for all players and permanently reduces the prior work cost. + + + + + + In the Chest in this area you will find damaged Pickaxes, raw materials, Bottles O' Enchanting, and Enchanted Books to experiment with. + + + + + + This is the trading interface which displays trades that can be made with a villager. + + + + + + {*B*} + Press{*CONTROLLER_VK_A*} to learn more about the trading interface.{*B*} + Press{*CONTROLLER_VK_B*} if you already know the trading interface. + + + + + + All trades that the villager is willing to make at the moment are displayed along the top. + + + + + + Trades will appear red and be unavailable if you do not have the required items. + + + + + + The amount and type of items you are giving to the villager are shown in the two boxes on the left. + + + + + + You can see the total number of the items required for the trade in the two boxes on the left. + + + + + + Press{*CONTROLLER_VK_A*} to trade the items the villager requires for the item on offer. + + + + + + In this area there is a villager and a Chest containing Paper to purchase items. + + + + + + {*B*} + Press{*CONTROLLER_VK_A*} to learn more about trading.{*B*} + Press{*CONTROLLER_VK_B*} if you already know about trading. + + + + + + Players can trade items from their inventory with villagers. + + + + + + The trades a villager is likely to offer depends on their profession. + + + + + + Performing a mix of trades will randomly add to or update the villager's available trades. + + + + + + Trades that have been used frequently may be removed temporarily, but the villager will always offer at least one trade. + + + + + + Take some Paper from the Chest and try trading with the villager here. + + + + + + In this area there are two Ender Chests. + + + + + + {*B*} + Press{*CONTROLLER_VK_A*} to learn more about Ender Chests.{*B*} + Press{*CONTROLLER_VK_B*} if you already know about Ender Chests. + + + + + + All Ender Chests in a world are linked, even across dimensions. Items placed into an Ender Chest are accessible in any other Ender Chest. + + + + + + However, the contents of the Ender Chests are different for each player. + + + + + + This allows players to store items in any Ender Chest, and retrieve them from other Ender Chests in different positions in the world. You can try this now by placing items in either Ender Chest. + + + + + Restores 2{*ICON_SHANK_01*}, regenerates health for 30 seconds, and grants fire resistance and damage resistance for 5 minutes. Crafted from an apple and gold blocks. + + + + Can Teleport + + + + Teleport + + + + Teleport To Player + + + + Teleport To Me + + + + Can Disable Exhaustion + + + + Can Become Invisible + + + + You can now enable invisibility + + + + You can no longer enable invisibility + + + + You can now enable flying + + + + You can no longer enable flying + + + + You can now disable exhaustion + + + + You can no longer disable exhaustion + + + + You can now teleport + + + + You can no longer teleport + + + + {*T3*}HOW TO PLAY : ANVIL{*ETW*}{*B*}{*B*} +Experience Levels can be used to repair, enchant or rename items with the Anvil.{*B*} +All items can be renamed, although only items with durability can be repaired or have enchantments from Enchanted Books applied to them.{*B*} +An item can be repaired by placing it in one of the input slots on the left, along with either some raw materials of the item, like Iron Ingots for an Iron Sword, or combined with another item of the same type.{*B*} +Combining items is more efficient when done with an Anvil, and additionally, if either of the items were enchanted, the finished product may have enchantments from either of the inputs.{*B*} +Enchanted Books can apply enchantments to items by combining them at an Anvil if the Book's enchantment is suitable. Enchanted Books can be found in Chests within dungeons, or enchanted from normal Books at the Enchantment Table.{*B*} +There is a chance that the Anvil will be damaged with each use and after enough punishment it will be destroyed.{*B*} + + + + + {*T3*}HOW TO PLAY : TRADING{*ETW*}{*B*}{*B*} +It is possible to trade items with villagers. Each villager has a profession; they can be Farmers, Butchers, Blacksmiths, Librarians or Priests, and this affects the type of items they might trade.{*B*} +You can find a list of all the trades a villager is offering in the trading menu. A villager may modify or add to its trades whenever a player trades with it, although a trade might become temporarily disabled if it is used too frequently.{*B*} +Trades usually involve buying or selling a number of items for emeralds.{*B*} +If you do not have the items required for a trade, the items are shown in red.{*B*} + + + + + {*T3*}HOW TO PLAY : ENDER CHEST {*ETW*}{*B*}{*B*} +All Ender Chests in a world are linked. Items placed into an Ender Chest are accessible in any other. However, the contents of the Ender Chests are different for each player. This allows players to store items in any Ender Chest, and retrieve them from other Ender Chests in different positions in the world. + + + + + Farmer + + + + Librarian + + + + Priest + + + + Blacksmith + + + + Butcher + + + + Found in villages, villagers will offer to sell items to the player depending on their profession. + + + + Large Chest + + + + + You can also create Enchanted Books at the Enchantment Table, which can be used later at the Anvil to apply their enchantment to an item. + + + + + + Tripwire Hooks will also provide constant power to a circuit while something is triggering the string between them. + + + + + + Once tamed, a wolf will always have its collar on. The color of their collar can be changed by dying it. + + + + + Carrots and Potatoes are farmed by planting Carrots or Potatoes, and are ready for harvesting when the vegetable is visible above the ground. + + + + + Additionally, pigs can be saddled and then ridden by players. They are controlled by tempting them with a Carrot on a Stick. + + + + + + If necessary you can slowly move your minecart along using {*CONTROLLER_ACTION_MOVE*}. This helps to start the minecart by getting it onto a powered rail. + + + + + You cannot join this game as split-screen is only supported when in High Definition mode. Sign out all other players if you wish to join. + + + + Cure + + \ 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/stringsLeaderboards.xml b/Minecraft.Client/PSVitaMedia/loc/stringsLeaderboards.xml new file mode 100644 index 00000000..233f3fa4 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/stringsLeaderboards.xml @@ -0,0 +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 + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/stringsPlatformSpecific.xml b/Minecraft.Client/PSVitaMedia/loc/stringsPlatformSpecific.xml new file mode 100644 index 00000000..91ca95b5 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/stringsPlatformSpecific.xml @@ -0,0 +1,298 @@ + + + NOT USED + + + + You can use the touchscreen on the PlayStation®Vita system to navigate menus! + + + + minecraftforum has a section dedicated to the PlayStation®Vita Edition. + + + + You'll get the latest info on this game from @4JStudios and @Kappische on twitter! + + + + Don't look an Enderman in the eye! + + + + We think 4J Studios has removed Herobrine from the PlayStation®Vita system game, but we're not too sure. + + + + Minecraft: PlayStation®Vita Edition broke lots of records! + + + + {*T3*}HOW TO PLAY : MULTIPLAYER{*ETW*}{*B*}{*B*} +Minecraft on the PlayStation®Vita system is a multiplayer game by default.{*B*}{*B*} +When you start or join an online game, it will be visible to people in your friends list (unless you've selected Invite Only when hosting the game), and if they join the game, it will also be visible to people in their friends list (if you have selected the Allow Friends of Friends option).{*B*} +When you are in a game, you can press the SELECT button to bring up a list of all other players in the game, and Kick players from the game. + + + + {*T3*}HOW TO PLAY : SHARING SCREENSHOTS{*ETW*}{*B*}{*B*} +You can capture a screenshot from your game by bringing up the Pause Menu, and pressing{*CONTROLLER_VK_Y*} to Share to Facebook. You'll be presented with a miniature version of your screenshot, and can edit the text associated with the Facebook post.{*B*}{*B*} +There's a camera mode especially for taking these screenshots, so that you can see the front of your character in the shot - press{*CONTROLLER_ACTION_CAMERA*} until you can see the front view of your character before pressing{*CONTROLLER_VK_Y*} to Share.{*B*}{*B*} +Online ID's will not be displayed in the screenshot. + + + + {*T3*}HOW TO PLAY : CREATIVE MODE{*ETW*}{*B*}{*B*} +The creative mode interface allows any item in the game to be moved into the player’s inventory without the need for mining or crafting the item. +The items in the player's inventory will not be removed when they are placed or used in the world, and this allows the player to focus on building rather than resource gathering.{*B*} +If you create, load or save a world in Creative Mode, that world will have trophies and leaderboard updates disabled, even if it is then loaded in Survival Mode.{*B*} +To fly when in Creative Mode, press{*CONTROLLER_ACTION_JUMP*} twice quickly. To exit flying, repeat the action. To fly faster, push{*CONTROLLER_ACTION_MOVE*} forward twice in rapid succession while flying. +When in flying mode, you can hold down{*CONTROLLER_ACTION_JUMP*} to move up and{*CONTROLLER_ACTION_SNEAK*} to move down, or use{*CONTROLLER_ACTION_DPAD_UP*} to move up, {*CONTROLLER_ACTION_DPAD_DOWN*} to move down, +{*CONTROLLER_ACTION_DPAD_LEFT*} to move left, and {*CONTROLLER_ACTION_DPAD_RIGHT*} to move right. + + + + Pressing{*CONTROLLER_ACTION_JUMP*} twice quickly will allow you to fly. To exit flying, repeat the action. To fly faster, push{*CONTROLLER_ACTION_MOVE*} forward twice in rapid succession while flying. +When in flying mode, you can hold down{*CONTROLLER_ACTION_JUMP*} to move up and{*CONTROLLER_ACTION_SNEAK*} to move down, or use the directional buttons to move up, down, left or right. + + + + NOT USED + + + + NOT USED + + + + "NOT USED" + + + + "NOT USED" + + + + Invite Friends + + + + If you create, load or save a world in Creative Mode, that world will have trophies 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 trophies and leaderboard updates disabled. Are you sure you want to continue? + + + + This world has previously been saved in Creative Mode, and it will have trophies and leaderboard updates disabled. + + + + If you create, load or save a world with Host Privileges enabled, that world will have trophies and leaderboard updates disabled, even if it is then loaded with those options off. Are you sure you want to continue? + + + + Connection to "PSN" was lost. Exiting to the main menu. + + + + Connection to "PSN" was lost. + + + + This is the Minecraft: PlayStation®Vita Edition trial game. If you had the full game, you would just have earned a trophy! +Unlock the full game to experience the joy of Minecraft: PlayStation®Vita Edition and to play with your friends across the globe through "PSN". +Would you like to unlock the full game? + + + + This is the Minecraft: PlayStation®Vita Edition trial game. If you had the full game, you would just have earned a theme! +Unlock the full game to experience the joy of Minecraft: PlayStation®Vita Edition and to play with your friends across the globe through "PSN". +Would you like to unlock the full game? + + + + This is the Minecraft: PlayStation®Vita 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 a Sony Entertainment Network account. + + + + Online ID + + + + Brewing + + + + You have been returned to the title screen because you have been signed out of the "PSN". + + + + + You've been playing the Minecraft: PlayStation®Vita Edition Trial Game for the maximum time allowed! To continue the fun, would you like to unlock the full game? + + + + "Minecraft: PlayStation®Vita Edition" has failed to load, and cannot continue. + + + + Failed to join the game as one or more players are not allowed to play Online due to their Sony Entertainment Network account chat restrictions. + + + + Failed to create an online game as one or more players are not allowed to play Online due to their Sony Entertainment Network account chat restrictions. Uncheck the "Online Game" box in "More Options" to start an offline game. + + + + You are not allowed to join this game session because Online is disabled on your Sony Entertainment Network account due to chat restrictions. + + + + You are not allowed to join this game session because one of your local players has Online disabled on their Sony Entertainment Network account due to chat restrictions. Uncheck the "Online Game" box in "More Options" to start an offline game. + + + + You are not allowed to create this game session because one of your local players has Online disabled on their Sony Entertainment Network account due to chat restrictions. Uncheck the "Online Game" box in "More Options" to start an offline game. + + + + This game has a level autosave feature. When you see the icon above displayed, the game is saving your data. +Please do not turn off your PlayStation®Vita system while this icon is on-screen. + + + + When enabled, the host can toggle their ability to fly, disable exhaustion, and make themselves invisible from the in-game menu. Disables trophies and leaderboard updates. + + + + Splitscreen Online ID's + + + + Trophies + + + + Online ID's: + + + + In-Game Online ID's + + + + Look what I made in Minecraft: PlayStation®Vita Edition! + + + + You are using the trial version of a texture pack. You will have access to the full contents of the texture pack, but you will not be able to save your progress. +If you try to save while using the trial version, you will be given the option to purchase the full version. + + + Patch 1.04 (Title Update 14) + + + SELECT + + + This option disables trophies and leaderboard updates for this world while playing, and if loading it again after saving with this option on. + + + Would you like to sign in to the "PSN"? + + + For players that are not on the same PlayStation®Vita system as the host player, selecting this option will kick the player from the game and any other players on their PlayStation®Vita system. This player will not be able to rejoin the game until it is restarted. + + + PlayStation®Vita + + + Change Network Mode + + + Select Network Mode + + + Choose Ad Hoc Network to connect with other PlayStation®Vita systems nearby, or "PSN" to connect with friends all over the world. + + + Ad Hoc Network + + + "PSN" + + + Download PS3™ Save + + + Upload Save for PS3™/PS4™ + + + Upload Canceled + + + You have canceled uploading this save to the save transfer area. + + + Uploading data : %d%% + + + Downloading data : %d%% + + + Are you sure you would like to upload this save, and overwrite any current save held in the save transfer area? + + + Converting Data + + + Saving + + + Upload Complete! + + + + Upload Failed. Please try again later. + + + + Download Complete! + + + + Download Failed. Please try again later. + + + + + Failed to join the game due to a restrictive NAT type. Please check your network settings. + + + + +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 + + + + Minecraft: PlayStation®Vita Edition is out of space for save data. To make room, delete other Minecraft: PlayStation®Vita Edition saves. + + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/stringsRichPresence.xml b/Minecraft.Client/PSVitaMedia/loc/stringsRichPresence.xml new file mode 100644 index 00000000..22f550b1 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/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/PSVitaMedia/loc/sv-SV/4J_stringsGeneric.xml b/Minecraft.Client/PSVitaMedia/loc/sv-SV/4J_stringsGeneric.xml new file mode 100644 index 00000000..02fa8801 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/sv-SV/4J_stringsGeneric.xml @@ -0,0 +1,87 @@ + + + + OK + + + Tillbaka + + + Avbryt + + + Ja + + + Nej + + + Korrupt sparfil + + + Dina spardata är korrupta. Vill du skapa en ny sparfil och skriva över den korrupta? + + + Inget ledigt utrymme + + + Välj igen + + + Spela utan att spara + + + Skapa en ny sparfil + + + Vill du skriva över sparfilen? + + + Nej - skriv inte över + + + Skriv över och spara + + + Sparningen misslyckades + + + Fortsätt utan att spara + + + Laddningen misslyckades + + + Döp sparfilen + + + Ge din sparfil ett namn + + + Vill du avsluta spelet? + + + Utloggad + + + Fortsätt spela + + + Fortsätt spela offline + + + Gästspelare + + + Gästspelare kommer inte åt "PSN". + + + Sparar ... + + + Sparar innehåll. Stäng inte av systemet. + + + Lås upp fullversion + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/sv-SV/4J_stringsPlatformSpecific.xml b/Minecraft.Client/PSVitaMedia/loc/sv-SV/4J_stringsPlatformSpecific.xml new file mode 100644 index 00000000..4f861192 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/sv-SV/4J_stringsPlatformSpecific.xml @@ -0,0 +1,52 @@ + + + + Det gick inte att spara inställningar till ditt Sony Entertainment Network-konto. + + + Problem med Sony Entertainment Network-kontot + + + 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 new file mode 100644 index 00000000..54660f0b --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/sv-SV/AdditionalStrings.xml @@ -0,0 +1,96 @@ + + + + Visa alla kombinationsvärldar + + + Dölj + + + Minecraft: PlayStation®3 Edition + + + Alternativ + + + Sparcache + + + Ett nätverksfel har inträffat. + + + Nätverksfel + + + Ett nätverksfel har inträffat. Avslutar till huvudmenyn. + + + Onlinetjänsten är avstängd för ditt Sony Entertainment Network-konto på grund av chattbegränsningar. + + + Onlinetjänsten är avstängd för ditt Sony Entertainment Network-konto på grund av föräldrakontrollsinställningar. + + + Onlinetjänst + + + Du har loggats ut från "PSN". Spelets onlinefunktioner är inte tillgängliga förrän du loggar in på "PSN" igen. + + + Du har loggats ut från "PSN". Spelets onlinefunktioner är inte tillgängliga förrän du loggar in på "PSN" igen. Avslutar till huvudmenyn. + + + Välj användare för spelare %d (eller avbryt för att spela som gäst) + + + Gratis + + + 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. + + + Trophies har avaktiverats + + + Trophies kommer att vara avaktiverade för att den här sparfilen tillhör en annan användare. + + + Kritiskt fel: Inläsningen av trophies misslyckades. Avsluta spelet. + + + Inbjudningar + + + Korrupt fil + + + Handkontrollen har kopplats ifrån + + + Din handkontroll har kopplats ifrån. Återanslut handkontrollen. + + + 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. + + + Inbjudan + + + Kom och spela Minecraft: PlayStation®Vita Edition! + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/sv-SV/EULA.xml b/Minecraft.Client/PSVitaMedia/loc/sv-SV/EULA.xml new file mode 100644 index 00000000..a0f06c0e --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/sv-SV/EULA.xml @@ -0,0 +1,99 @@ + + + + Minecraft: PlayStation®Vita Edition - ANVÄNDARVILLKOR + De här villkoren upprättar några regler för hur Minecraft: PlayStation®Vita Edition ("Minecraft") får användas. För att skydda Minecraft och våra communitymedlemmar behöver vi regler för hur Minecraft laddas ned och används. Vi är ungefär lika peppade på regler som du är, så vi har försökt att hålla oss så kortfattade som möjligt. Summa summarum: om du köper, laddar ned, använder eller spelar Minecraft så går du med på att följa dessa villkor ("Villkoren"). + Innan vi sätter igång vill vi klargöra en sak. Minecraft är ett spel som låter spelare bygga och ha sönder saker. Om du spelar med andra (via flerspelarläget) kan du bygga med dem eller så kan du förstöra vad de har byggt – och de kan göra samma sak mot dig. Spela inte med andra om de inte beter sig som du vill. Ibland gör folk saker de inte borde göra. Vi tycker inte om det, men det finns inte mycket vi kan göra åt saken – vi kan bara be alla att bete sig. Vi litar på att du och sådana som du i communityn meddelar oss om ni tycker att någon uppför sig dåligt, bryter mot Villkoren eller använder Minecraft på ett felaktigt sätt. Vi har ett rapporteringssystem för det, så se till att utnyttja det så kommer vi att göra vad som krävs för att ta hand om saken. + Kontakta oss via e-post på support@mojang.com för att flagga eller rapportera problem. Ge oss så mycket information som möjligt om användaren och om vad som har hänt. + Nu tillbaka till Villkoren: + EN VIKTIG REGEL + Den viktigaste regeln är att du inte får distribuera någonting vi har skapat. Med "distribuera någonting vi har skapat" menar vi "ge bort kopior av Minecraft, använda Minecraft i kommersiellt syfte, försöka tjäna pengar på Minecraft, eller låta andra personer få åtkomst till Minecraft och dess delar på ett sätt som är orättvist eller orimligt". Så den viktiga regeln är (såvida vi inte ger vårt medgivande – exempelvis genom våra riktlinjer för användning av varumärken och tillgångar) att du inte får: + • ge kopior av Minecraft till någon annan; + • använda någonting som vi har skapat i kommersiellt syfte; + • försöka tjäna pengar på någonting som vi har skapat; eller + • låta andra få åtkomst till någonting vi har skapat på ett sätt som är orättvist eller orimligt. + ... och bara så att det är glasklart: vad vi har skapat är, men är inte nödvändigtvis begränsat till, klient- och servermjukvaran till Minecraft. Det inkluderar även modifierade versioner av spelet, delar av det eller någonting annat som vi har skapat. + I övrigt har vi inte så mycket att säga om vad du gör – faktum är att vi uppmuntrar dig att göra coola saker (se nedan) – se bara till att inte göra sådant som vi säger att du inte får. + ANVÄNDA MINECRAFT + • Du har köpt Minecraft, så du, och då menar vi dig, får använda det på ditt PlayStation®Vita-system. + • Här nedanför ger vi dig begränsad rätt att göra andra saker, men vi måste dra en gräns någonstans, annars går folk för långt. Om du vill göra någonting relaterat till vad vi har skapat så känner vi oss ärade, men se bara till att det inte kan tolkas som någonting officiellt, att det följer Villkoren och viktigast av allt, att det inte nyttjar någonting som vi har skapat i kommersiellt syfte. + • Det tillstånd som vi ger dig att spela och använda Minecraft kan dras tillbaka om du bryter mot Villkoren. + • När du köper Minecraft ger vi dig tillstånd att installera Minecraft på ditt eget PlayStation®Vita-system och att använda och spela det på det PlayStation®Vita-systemet enligt Villkoren. Tillståndet gäller dig personligen, så du får inte distribuera Minecraft (eller någon del av det) till någon annan (om inte vi medger någonting annat, naturligtvis). + • Du får, inom rimliga gränser, göra vad du vill med skärmbilder och videor av Minecraft. Med "inom rimliga gränser" menar vi att du inte får använda dem i kommersiellt syfte, göra saker som är orättvisa eller nyttja dem på ett sätt som negativt påverkar våra rättigheter. Och snälla, kopiera inte spelets grafik och sprid den, det är inte schyst. + • Kort och gott, regeln är att du inte får använda någonting som vi har skapat i kommersiellt syfte utan vårt medgivande, antingen via våra riktlinjer för användning av varumärken och tillgångar eller via Villkoren. Skulle det vara så att lagen tillåter det, exempelvis genom "skälig användning" eller liknande bestämmelser, så är det också okej – men bara inom lagens ramar. +ÄGANDERÄTT ÖVER MINECRAFT OCH ANDRA SAKER + • Vi ger dig tillstånd att spela Minecraft, men det är fortfarande vi som äger det. Det är även vi som äger våra varumärken och allt innehåll i Minecraft, vilket består av vår mjukvara och infrastruktur, våra texturer, tillgångar, verktyg och massa andra smarta (och mindre smarta) saker vi äger. All vår rätt till de sakerna är fastställd, men du får använda dem enligt Villkoren. + • Det betyder inte att vi äger de coola saker du skapar i Minecraft – du måste bara acceptera att vi äger alla delar av Minecraft och av Minecraft som en produkt och tjänst och allt annat som nämndes i den föregående meningen. Dessutom har vi copyright och annan så kallad "intellektuell egendomsrättighet" associerad med de sakerna och med namnen och varumärkena som är associerade med Minecraft. + • Naturligtvis kommer du att bygga dina egna saker med Minecraft. Vi äger inte de originella saker du skapar och vi hävdar inte att vi äger saker som vi inte äger. Vi kommer dock att äga saker som är kopior (eller till stor del kopior) eller verk som kan härledas till våra egendomar och skapelser (enligt ovan) – men om du skapar originella saker är de inte våra. Vi kan dra ett exempel: + - ett enskilt block – vi äger det; + - en gotisk katedral med en bergochdalbana som går rakt igenom den – vi äger inte den. + • Därmed köper du bara ett tillstånd att använda Minecraftprodukten i enlighet med Villkoren när du betalar för att använda Minecraft. De enda tillstånd du har rörande Minecraft är de tillstånd som definieras i Villkoren. + INNEHÅLL + • Om du gör något innehåll tillgängligt i eller via Minecraft, måste du ge oss tillstånd att använda, kopiera, modifiera och anpassa det innehållet. Detta tillstånd måste vara oåterkalleligt och obegränsat. Du måste också låta oss ge andra tillstånd att använda ditt innehåll, och du måste låta de andra som du låter komma åt innehållet (exempelvis de du spelar med) använda det. + • Tänk dig för noggrant innan du gör något innehåll tillgängligt, för det kan bli offentligt och kan då användas av andra på sätt som du inte uppskattar. + • Om du gör någonting tillgängligt i eller via Minecraft, får det inte vara stötande eller olagligt, det måste vara ärligt och det måste vara din egen skapelse. De sorters saker du inte får göra tillgängliga med Minecraft är bland annat: inlägg med rasistiskt eller homofobiskt språk; inlägg som mobbar eller trakasserar; inlägg som kan skada vårt eller någon annans rykte; inlägg med porr, reklam eller någon annans skapelse eller bild; eller inlägg som utgör sig för att tillhöra en moderator eller som försöker lura eller utnyttja andra. + • Allt innehåll som du gör tillgängligt i Minecraft måste vara skapat av dig. Du får inte göra innehåll tillgängligt, med Minecraft, som inkräktar på andras rättigheter. Om du lägger upp innehåll i Minecraft, och vi anmäls, hotas eller stäms av någon för att det innehållet inkräktar på den personens rättigheter, så kan vi hålla dig ansvarig. Det betyder att du kan få betala för alla eventuella resulterande skador. Därför är det väldigt viktigt att du bara tillgängliggör innehåll som du har skapat och att du inte gör det med innehåll som har skapats av någon annan. + • Var försiktig vem du spelar med. Det är svårt för både dig och oss att avgöra om folk talar sanning, eller om andra verkligen är den de uppger sig för att vara. Lämna inte ut någon information om dig själv genom Minecraft. + Om du tänker göra innehåll ("Ditt innehåll") tillgängligt genom Minecraft ska det: + - följa alla Sony Computer Entertainments regler, inklusive "PSN":s tjänstevillkor och användaravtal, samt alla övriga riktlinjer som du måste godkänna för att använda ditt PlayStation®Vita-system och "PSN"; + - inte vara stötande; + - inte vara olagligt eller olovligt; + - vara ärligt och får inte vilseleda, lura eller utnyttja andra eller utgöra sig för att vara någon annan; + - inte inkräkta på någons copyright eller andra rättigheter; + - inte vara rasistiskt, sexistiskt eller homofobiskt; + - inte vara mobbande eller trakasserande; + - inte skada vårt eller någon annans rykte; + - inte innehålla pornografi; + - inte innehålla reklam. + - Du får inte göra innehåll tillgängligt genom Minecraft som inkräktar på någon annans rättigheter. + • Du ansvarar för allt Ditt innehåll som du gör tillgängligt genom Minecraft. + • Genom att göra Ditt innehåll tillgängligt garanterar och bekräftar du för oss att du har rätten att göra det under Villkoren, och att vi har rätten att tillämpa de rättigheter som du ger oss genom Villkoren. + • Om vi anmäls, hotas eller stäms av någon på grund av innehåll som du har gjort tillgängligt genom Minecraft, eller om någon annan gör det tillgängligt i eller genom Minecraft, kan det komma att tas bort, och du kan hållas ansvarig och bli betalningsskyldig för eventuella resulterande skador. Din åtkomst till vissa delar av Minecraft kan också komma att dras in. + ANVÄNDARINNEHÅLL + Följande stycke redogör för villkor gällande både Ditt innehåll och innehåll som skapas andra ("Användarinnehåll"). Minecraft är en underhållningstjänst och för att den ska fungera måste vi (och våra licensinnehavare, som Sony Computer Entertainment) sköta överföring, distribution, lagring och hämtning av Användarinnehåll utan någon granskning, urvalsprocess eller modifiering av innehållet. Det betyder att vi inte granskar Användarinnehåll, alltså vet vi inte vad som cirkuleras av dig eller andra. Vi har de här reglerna i Villkoren som du och alla andra måste följa, men det är omöjligt för oss att veta allt som pågår. + Tänk alltså på att: + • de åsikter som uttrycks i Användarinnehåll tillhör de individuella skaparna, de tillhör inte oss eller någon med anknytning till oss om ingenting annat anges; + • vi ansvarar inte för (och avsäger oss allt ansvar för) allt Användarinnehåll, vare sig för kommentarer, åsikter eller synpunkter som uttrycks i det; + • genom att använda Minecraft samtycker du till att vi inte har något som helst ansvar att granska innehållet i något Användarinnehåll och att allt Användarinnehåll görs tillgängligt på villkoret att vi varken kontrollerar eller bedömer det. + DÄREMOT kan vi (eller våra licensinnehavare, som Sony Computer Entertainment) ta bort, neka eller stänga av åtkomst till Användarinnehåll, och ta bort eller stänga av din förmåga att skicka in, tillgängliggöra och komma åt Användarinnehåll – inklusive att ta bort eller stänga av åtkomst till Minecraft eller "PSN" om vi bedömer att det är rimligt at göra det, exempelvis om du bryter mot Villkoren eller om vi tar emot klagomål om dig. Vi kommer även att göra vårt yttersta för att ta bort eller stänga av åtkomst till Användarinnehåll när vi får kännedom om att det bryter mot lagen. + UPPGRADERINGAR + • Vi kan komma att göra uppdateringar och uppgraderingar tillgängliga då och då, men det är inget vi behöver göra. Vi har inte heller någon skyldighet att erbjuda support eller underhåll för något spel. Vi hoppas naturligtvis att fortsättningsvis kunna släppa nya uppdateringar till Minecraft, men vi kan inte garantera något. + VÅRT ANSVAR + • När du får ett exemplar av Minecraft ger vi dig det "i befintligt skick". Uppdateringar och uppgraderingar ges också "i befintligt skick". Det betyder att vi inte lovar någonting om kvaliteten på Minecraft, att Minecraft kan spelas utan avbrott eller problem eller vi tar något ansvar för förluster eller skador som det orsakar. Vårt enda löfte är att erbjuda Minecraft och eventuella tjänster inom en rimlig professionalism och omsorg. Lagen i de flesta länderna säger att vi inte kan avsäga oss ansvaret vid dödsfall eller personskada som orsakas av vår försumlighet, så om din dator kastar sig över dig och hugger dig på grund av något vi har gjort så får vi ta smällen för det. + VI TAR INTE ANSVAR FÖR: + • BRUK ELLER MISSBRUK AV MINECRAFT AV DIG ELLER NÅGON ANNAN PERSON; + • INNEHÅLL SOM GÖRS TILLGÄNGLIGT AV DIG GENOM MINECRAFT; + • VILLKORSBROTT AV DIG; + • VILLKORSBROTT AV NÅGON ANNAN PERSON. + UPPSÄGNING + • Om vi vill kan vi säga upp din rätt att använda Minecraft om du bryter mot Villkoren. Du kan också säga upp det när du vill – allt du behöver göra är att avinstallera Minecraft från ditt PlayStation®Vita-system. Oavsett så fortsätter paragraferna "Äganderätt över Minecraft", "Vårt ansvar" och "Allmänt" att gälla även efter uppsägningen. + ALLMÄNT + • Villkoren är underordnade dina lagliga rättigheter. Ingenting i Villkoren begränsar dina rättigheter som enligt lag inte får begränsas, inte heller åsidosätts eller begränsas vårt ansvar vid dödsfall, personskada till följd av försummelse från vår sida eller missvisande påståenden. + • Vi kan komma att ändra dessa Villkor då och då, men de ändringarna gäller bara till den grad som de gäller enligt lag. Om du bara spelar Minecrafts enspelarläge och inte använder uppdateringarna som vi släpper, då gäller det gamla slutanvändaravtalet. Om du däremot använder uppdateringarna eller delar av Minecraft som nyttjar våra onlinetjänster, då gäller det nya slutanvändaravtalet. I så fall kan det vara så att vi inte kan/inte behöver berätta om förändringarna för att de ska gälla, så det kan vara klokt att läsa avtalet då och då för att bli varse om eventuella ändringar. Vi tänker inte göra någonting dumt, men ibland ändras lagar och ibland gör folk saker som påverkar andra Minecraftspelare till den grad att vi måste sätta stopp för det. + • Om du kommer till oss med förslag om Minecraft, eller något annat av våra spel, så lämnas det förslaget gratis. Det betyder att vi kan använda förslaget hur vi vill och vi behöver inte betala dig för det. Om du tror att du har ett förslag som vi är redo att betala för, så måste du säga att du förväntar dig betalning innan du lämnar förslaget. + • Utöver Villkoren har vi även riktlinjer för användning av varumärken och tillgångar som du kan läsa online. + • Om du bryter mot dessa regler kan vi (eller Sony Computer Entertainment) stoppa dig från att använda Minecraft. Om du inte vill eller kan godkänna dessa regler ska du inte köpa, ladda ned, använda eller spela Minecraft. + Om det är någonting juridiskt som du tvekar över och som inte svaras på här, se då till att fråga oss först innan du gör något. Kort och gott, gör ingenting dumt så gör inte vi det. + Vi är: + Mojang AB + Maria Skolgata 83, + SE-11853 + Stockholm + Sverige + Organisationsnummer: 556819-2388 + + + + + Allt innehåll som köps genom en butik i spelet köps från Sony Network Entertainment Europe Limited ("SNEE") och lyder under Sony Entertainment Networks tjänstevillkor och användaravtal, vilket finns att läsa på PlayStation®Store. Läs användningsrättigheterna för varje inköp, då dessa kan skilja sig från sak till sak. Innehåll som fins tillgängligt i butiker i spelet har samma åldersmärkning som spelet, såvida ingenting annat anges. + + + + + Köp och användning av föremål lyder under nätverkets tjänstevillkor och användaravtal. Den här onlinetjänsten har underlicensierats till dig av Sony Computer Entertainment America. + + + + Användning av denna mjukvara omfattas av användarvillkoren på eu.playstation.com/legal. + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/sv-SV/stringsDynafont.xml b/Minecraft.Client/PSVitaMedia/loc/sv-SV/stringsDynafont.xml new file mode 100644 index 00000000..dca31ec2 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/sv-SV/stringsDynafont.xml @@ -0,0 +1,7 @@ + + + + DynaFont developed by DynaComware. + + + \ 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 new file mode 100644 index 00000000..a81cdf09 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/sv-SV/stringsGeneric.xml @@ -0,0 +1,7030 @@ + + + + Växlar till offlinespel + + + Vänta medan värden sparar spelet + + + Färdas till världens ände + + + Sparar spelare + + + Ansluter till värden + + + Laddar ned terräng + + + Lämnar världens ände + + + 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. + + + 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. + + + Laddar värld + + + Slutställer ... + + + Genererar terräng + + + Simulerar världen lite grand + + + Rang + + + Förbereder att spara världen + + + Förbereder segment ... + + + Startar server + + + Lämnar Nedervärlden + + + Spawnar på nytt + + + Genererar värld + + + Genererar spawnområde + + + Laddar spawnområde + + + Färdas till Nedervärlden + + + Verktyg och vapen + + + Ljusstyrka + + + Känslighet - spelet + + + Känslighet - gränssnittet + + + Svårighetsgrad + + + Musik + + + Ljud + + + Fridfullt + + + 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. + + + Lätt + + + Normalt + + + Svårt + + + Loggade ut + + + Rustningsdelar + + + Mekanismer + + + Färdmedel + + + Vapen + + + Mat + + + Strukturer + + + Dekorationer + + + Bryggning + + + Verktyg, vapen och rustningsdelar + + + Material + + + Byggblock + + + Rödsten och transport + + + Diverse + + + Poster: + + + 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! + + + 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 + + + Skapa ny värld + + + Ge din värld ett namn + + + Ange ett frö som lägger grunden för din värld + + + Ladda sparad värld + + + Spela övningen + + + Övning + + + Döp din värld + + + Skadad sparfil + + + OK + + + Avbryt + + + Minecraftbutiken + + + Rotera + + + Dölj + + + Töm alla platser + + + Vill du lämna det pågående spelet och ansluta till det nya? Osparade framsteg kommer att gå förlorade. + + + Vill du skriva över den befintliga sparfilen för den här världen med den nuvarande versionen av den här världen? + + + Vill du avsluta utan att spara? Du kommer att förlora alla framsteg i den här världen! + + + Starta spelet + + + Avsluta + + + Spara spelet + + + Avsluta utan att spara + + + Tryck START för att ansluta + + + Hurra! Du har belönats med en spelarbild med Steve från Minecraft! + + + Hurra! Du har belönats med en spelarbild med en smygare! + + + Lås upp fullständiga spelet + + + Du kan inte ansluta till det här spelet. Spelaren som du försöker att ansluta till kör en nyare version av spelet. + + + Ny värld + + + Belöning upplåst! + + + Du spelar demoversionen av spelet, men du behöver den fullständiga versionen för att kunna spara. +Vill du låsa upp det fullständiga spelet nu? + + + Vänner + + + Min poäng + + + Totalt + + + Vänta + + + Inga resultat + + + Filter: + + + Du kan inte ansluta till det här spelet. Spelaren som du försöker att ansluta till kör en äldre version av spelet. + + + Anslutningen tappades + + + Anslutningen till servern bröts. Avslutar till huvudmenyn. + + + Kopplades ned av servern + + + Avslutar spelet + + + Ett fel uppstod. Avslutar till huvudmenyn. + + + Anslutningen misslyckades + + + Du sparkades från spelet + + + Värden har lämnat spelet. + + + Du kan inte ansluta till det här spelet. Ingen av spelarna är dina vänner. + + + Du kan inte ansluta till det här spelet. Värden har sparkat dig förut. + + + Du sparkades från spelet för att du flög + + + Anslutningsförsöket tog för lång tid + + + Servern är full + + + I det här läget finns det monster i världen, och de gör stor skada. Se upp för smygare också, för de är mindre benägna att avbryta sina explosiva attacker om du springer ifrån dem! + + + Teman + + + Utseendepaket + + + Tillåt vänners vänner + + + Sparka spelare + + + Vill du sparka den här spelaren från spelet? Spelaren kan inte ansluta på nytt förrän du startar om världen. + + + Spelarbildspaket + + + Du kan inte ansluta till det här spelet. Det har begränsats till spelare som är vänner till värden. + + + Korrupt nedladdningsbart innehåll + + + Det här nedladdningsbara innehållet är korrupt och kan inte användas. Du måste radera det och sedan installera det på nytt från Minecraftbutiken. + + + Delar av ditt nedladdningsbara innehåll är korrupt och kan inte användas. Du måste radera det och sedan installera det på nytt från Minecraftbutiken. + + + Kan inte ansluta till spelet + + + Valt + + + Valt utseende: + + + Skaffa fullversion + + + Lås upp texturpaket + + + För att använda det här texturpaketet i din värld måste du låsa upp det. +Vill du låsa upp det nu? + + + Demonstration av texturpaket + + + Frö + + + Lås upp utseendepaket + + + För att använda det valda utseendet måste du låsa upp det här utseendepaketet. +Vill du låsa upp utseendepaketet nu? + + + Du använder en demoversion av texturpaketet. Du kan inte spara världen om du inte låser upp fullversionen. +Vill du låsa upp fullversionen av texturpaketet? + + + Ladda ned fullversion + + + Den här världen använder ett kombinations- eller texturpaket som du inte har! +Vill du installera kombinations- eller texturpaketet nu? + + + Skaffa demoversion + + + Texturpaket saknas + + + Lås upp fullversion + + + Ladda ned demoversion + + + Ditt spelläge har ändrats + + + När det här alternativet är valt kan bara inbjudna spelare ansluta. + + + När det här alternativet är valt kan vänner till folk på din vänlista ansluta. + + + När det här alternativet är valt kan spelare skada andra spelare. Påverkar bara överlevnadsläget. + + + Normal + + + Platt + + + När det här alternativet är valt spelas spelet i onlineläge. + + + När det här alternativet är avstängt måste spelare godkännas innan de kan bygga eller bryta block. + + + När det här alternativet är valt kommer byar och fästningar att genereras i världen. + + + När det här alternativet är valt kommer den vanliga världen och Nedervärlden att vara helt platta. + + + När det här alternativet är valt kommer en kista med användbara föremål att skapas nära spelarens spawnplats. + + + När det här alternativet är valt kan eld sprida sig till närliggande brännbara block. + + + När det här alternativet är aktiverat exploderar dynamit när den aktiveras. + + + När det här alternativet är valt byggs Nedervärlden upp på nytt. Det är användbart om du har en gammal sparfil utan fästningar i Nedervärlden. + + + Av + + + Spelläge: Kreativt + + + Överlevnad + + + Kreativt + + + Döp om din värld + + + Ange världens nya namn + + + Spelläge: Överlevnad + + + Skapad i överlevnadsläget + + + Byt namn på sparfilen + + + Sparar automatiskt om %d ... + + + + + + Skapad i det kreativa läget + + + Visa moln + + + Vad vill du göra med den här sparfilen? + + + Gränssnittets storlek (delad skärm) + + + Ingrediens + + + Bränsle + + + Automat + + + Kista + + + Förtrolla + + + Ugn + + + Det finns inga erbjudanden på nedladdningsbart innehåll av den här typen för tillfället. + + + Vill du radera den här sparfilen? + + + Väntar på godkännande + + + Censurerad + + + %s har anslutit till spelet. + + + %s har lämnat spelet. + + + %s har sparkats från spelet. + + + Brygdställ + + + Ange skylttext + + + Skriv vad som ska stå på din skylt + + + Ange namn + + + Demotiden slut + + + Spelet är fullt + + + Kunde inte ansluta till spelet. Det finns inga lediga platser. + + + Ge din post ett namn + + + Ge din post en beskrivning + + + Inventarie + + + Ingredienser + + + Ange bildtext + + + Ge din post en bildtext + + + Ange beskrivning + + + Spelar: + + + Vill du lägga till den här världen på listan med blockerade världar? +Om du väljer OK avslutas spelet. + + + Häv blockering + + + Automatisk sparfrekvens + + + Blockerad värld + + + Spelet som du ansluter till är med på listan över blockerade världar. +Om du väljer att ansluta till spelet hävs blockeringen av världen. + + + Blockera den här världen? + + + Automatisk sparfrekvens: AV + + + Gränssnittets opacitet + + + Förbereder automatisk sparning av världen + + + Gränssnittets storlek + + + Minuter + + + Kan inte placeras här! + + + Det är inte tillåtet att placera lava för nära världens spawnplats. Det vore för lätt för spawnande spelare att dö. + + + Favoritutseenden + + + Spel skapat av %s + + + Okänd värds spel + + + Gästen loggade ut + + + Återställ inställningar + + + Vill du återställa alla inställningar till deras standardvärden? + + + Laddningsfel + + + En gästspelare har loggat ut, vilket har fått alla gäster att loggas ut från spelet. + + + Kunde inte skapa spel + + + Valt automatiskt + + + Inget paket: standardutseende + + + Logga in + + + Du är inte inloggad. För att spela det här spelet måste du vara inloggad. Vill du logga in nu? + + + Flera spelare tillåts inte + + + Drick + + + + Det här området har en gård. Att driva en gård ger dig förnybara källor för mat och andra saker. + + + + + {*B*} + Tryck på{*CONTROLLER_VK_A*} för att lära dig mer om hur man skördar.{*B*} + Tryck på{*CONTROLLER_VK_B*} om du redan vet hur man skördar. + + + + Vete, pumpor och meloner odlas från ax och frön. Du hittar veteax genom att slå sönder högt gräs eller skörda vete, och pumpa- och melonfrön kan skaffas från pumpor och meloner. + + + Tryck på{*CONTROLLER_ACTION_CRAFTING*} för att öppna det kreativa lägets inventariegränssnitt. + + + Ta dig till andra sidan av det här hålet för att fortsätta. + + + Nu har du klarat det kreativa lägets övning. + + + Innan du kan plantera något måste du göra marken till åkermark med hjälp av en skyffel. En nära vattenkälla hjälper till att hålla åkermarken bördig så att grödorna växer snabbare. Ordentligt med ljus hjälper också till med det. + + + Kaktusar måste planteras på sand och kan växa sig tre block höga. Precis som sockerrör kollapsar hela kaktusen om det nedersta blocket förstörs.{*ICON*}81{*/ICON*} + + + Svampar ska planteras i dunkla miljöer och sprider sig till närliggande block med dunkelt ljus.{*ICON*}39{*/ICON*} + + + Benmjöl kan användas för att få grödorna att bli fullvuxna, eller för att göra svampar till stora svampar.{*ICON*}351:15{*/ICON*} + + + Vete passerar flera olika stadier medan det växer. Det kan skördas när det får en mörk färg.{*ICON*}59:7{*/ICON*} + + + Pumpor och meloner behöver ett ledigt block bredvid blocket där fröet planterades, annars får inte frukten plats när stjälken har växt ut. + + + Sockerrör måste planteras på gräs, jord eller sand som ligger bredvid ett vattenblock. Att hugga av botten av ett sockerrör får hela sockerröret att kollapsa.{*ICON*}83{*/ICON*} + + + I det kreativa läget har du obegränsat med alla föremål och block, du kan förstöra block med en enda knapptryckning utan verktyg, och du är odödlig och kan flyga. + + + + Kistan i det här området innehåller några komponenter för att skapa kretsar med kolvar. Försök att färdigställa kretsarna i området, eller skapa dina egna. Det finns fler exempel utanför övningsområdet. + + + + + I det här området finns en portal till Nedervärlden! + + + + + {*B*} + Tryck på{*CONTROLLER_VK_A*} för att lära dig mer om portaler och Nedervärlden.{*B*} + Tryck på{*CONTROLLER_VK_B*} om du redan känner till portaler och Nedervärlden. + + + + + Du skaffar rödstensstoft genom att bryta rödstensmalm med en hacka gjord av järn, diamant eller guld. Längdmässigt kan det användas för att ge ström från ett avstånd på femton block, och höjdmässigt kan det kan färdas upp eller ned ett helt block. + {*ICON*}331{*/ICON*} + + + + + Rödstensförstärkare kan användas för att förlänga sträckan som strömmen bärs, eller för att lägga in en fördröjning i en krets. + {*ICON*}356{*/ICON*} + + + + + När en kolv matas med ström fälls den ut och kan knuffa upp till tolv block. Klibbiga kolvar kan dra tillbaka ett block av nästan vilket slag som helst när de fälls in igen. + {*ICON*}33{*/ICON*} + + + + + Portaler skapas genom att bygga en ram som är fyra block bred och fem block hög av obsidianblock. Hörnblocken behövs inte. + + + + + Nedervärlden kan användas för att ta dig fram stora sträckor i den vanliga världen. Att gå ett block i Nedervärlden är som att gå tre block i den vanliga. + + + + + Nu befinner du dig i det kreativa läget. + + + + + {*B*} + Tryck på{*CONTROLLER_VK_A*} för att lära dig mer om det kreativa läget.{*B*} + Tryck på{*CONTROLLER_VK_B*} om du redan vet hur det kreativa läget fungerar. + + + + + För att aktivera portalen till Nedervärlden måste du tända eld på obsidianblocken på insidan av ramen med ett tändstål. Portaler stängs om ramen går sönder, om någonting exploderar i närheten eller om det passerar vätska genom dem. + + + + + Ställ dig i en portal till Nedervärlden för att använda den. Skärmen blir lila och ett ljud spelas upp. Efter några sekunder förflyttas du till en annan dimension. + + + + + Nedervärlden kan vara mycket farlig. Det kan dock vara värt att navigera dess glödheta lava, för där finns nedersten som aldrig slocknar när den antänds, och glödsten som producerar ljus. + + + + Nu har du klarat övningen om hur man skördar. + + + Olika verktyg passar till olika material. Använd en yxa för att hugga trädstammar. + + + Olika verktyg passar till olika material. Använd en hacka för att bryta sten och malm. Du kan behöva en hacka av bättre material för att få resurser från vissa block. + + + Vissa verktyg är bättre lämpade att anfalla fiender med. Du bör använda ett svärd när du anfaller. + + + Vissa byar har en järngolem som skyddar byborna. Om du anfaller dem går den till angrepp. + + + Du kan inte lämna det här området innan du är klar med övningen. + + + Olika verktyg passar till olika material. Använd en spade för att gräva i mjuka material som jord och sand. + + + Tips: Håll in {*CONTROLLER_ACTION_ACTION*} för att bryta eller hugga med handen eller vad du än håller i. Du måste tillverka verktyg för att kunna bryta vissa block. + + + I kistan bredvid floden finns en båt. Peka markören på vattnet och tryck på{*CONTROLLER_ACTION_USE*} för att använda båten. Använd{*CONTROLLER_ACTION_USE*} medan du pekar markören på båten för att gå ombord. + + + I kistan bredvid dammen finns ett fiskespö. Ta fiskespöet från kistan och sätt det i handen för att använda det. + + + Den här avancerade kolvmekanismen skapar en självreparerande bro! Tryck på knappen för att aktivera den, undersök sedan hur de olika komponenterna interagerar för att lära dig mer. + + + Det verktyg du använder har skadats. Varje gång du använder ett verktyg skadas det, och till slut går det sönder. Den färgade mätaren under föremålet i inventariet visar verktygets tillstånd. + + + Håll in{*CONTROLLER_ACTION_JUMP*} för att simma upp. + + + I det här området finns det en gruvvagn på räls. Sätt dig i gruvvagnen genom att peka markören på den och trycka på{*CONTROLLER_ACTION_USE*}. Använd{*CONTROLLER_ACTION_USE*} på knappen för att sätta gruvvagnen i rörelse. + + + En järngolem består av fyra järnblock i det mönster som visas och en pumpa på blocket i mitten. De anfaller dina fiender. + + + Ge vete till en kor, svampkor eller får; morötter till grisar; veteax eller nedervårtor till höns; eller valfritt kött till vargar, så börjar de leta efter ett annat djur av samma art som också är brunstigt. + + + När två brunstiga djur av samma art träffas börjar de pussas i några sekunder, sedan dyker en unge upp. Ungen följer efter sina föräldrar till dess att den är fullvuxen. + + + Efter att ha varit brunstigt kan ett djur inte bli brunstigt igen på ungefär fem minuter. + + + + I det här området finns en inhägnad med djur. Du kan avla djur för att skaffa bebisversioner av djuren. + + + + + {*B*} + Tryck på{*CONTROLLER_VK_A*} för att lära dig mer om djur och avel.{*B*} + Tryck på{*CONTROLLER_VK_B*} om du redan känner till djur och avel. + + + + För att avla djuren måste du mata dem med rätt mat för att göra dem brunstiga. + + + Vissa djur följer efter dig om du håller rätt mat i handen. Det gör det lättare att föra samman djur så att de parar sig.{*ICON*}296{*/ICON*} + + + + {*B*} + Tryck på{*CONTROLLER_VK_A*} för att lära dig mer om hur man bygger en golem.{*B*} + Tryck på{*CONTROLLER_VK_B*} om du redan vet hur man bygger en golem. + + + + Du bygger en golem genom att placera en pumpa på en hög med block. + + + En snögolem består av en stapel med två snöblock och en pumpa ovanpå. De kastar snöbollar på dina fiender. + + + + Vilda vargar kan tämjas genom att ge ben till dem. När de har tämjts dyker det upp hjärtan runtomkring dem. Tämjda vargar följer efter spelare och försvarar dem så länge de inte har fått order att sitta. + + + + Nu har du klarat övningen om djur och avel. + + + + I det här området finns några pumpor och block som låter dig bygga en snö- eller järngolem. + + + + + En strömkällas position och riktning avgör hur den påverkar blocken i direkt anslutning. Exempelvis kan en rödstensfackla på sidan av ett block stängas av om blocket får ström från en annan källa. + + + + + Om kitteln blir tom kan du fylla den med en vattenhink. + + + + + Använd brygdstället för att brygga en brygd för eldmotstånd. Du behöver en vattenflaska, en nedervårta och magmasalva. + + + + + Håll in{*CONTROLLER_ACTION_USE*} när du håller en brygd i handen för att använda den. Normala brygder dricks och effekten påverkar bara dig. Explosiva brygder kastas och effekten drabbar alla varelser som träffas. + Explosiva brygder kan tillverkas genom att tillsätta krut till normala brygder. + + + + {*B*} + Tryck på{*CONTROLLER_VK_A*} för att lära dig mer om bryggning och brygder.{*B*} + Tryck på{*CONTROLLER_VK_B*} om du redan kan bryggning och känner till brygder. + + + + + Första steget när man brygger en brygd är att skapa en vattenflaska. Ta en glasflaska från kistan. + + + + + Du kan fylla flaskan från en kittel med vatten i eller från ett vattenblock. Fyll flaskan nu genom att peka den mot en vattenkälla, tryck sedan på{*CONTROLLER_ACTION_USE*}. + + + + + Använd din brygd för eldmotstånd på dig själv. + + + + + För att förtrolla ett föremål ska du först placera det i förtrollningsrutan. Vapen, rustningsdelar och vissa verktyg kan förtrollas för att ge dem specialeffekter. Exempelvis kan de bli mer tåliga, eller så kan de producera fler resurser när du bryter block. + + + + + När ett föremål har placerats i förtrollningsrutan kommer knapparna till höger att visa ett antal slumpmässiga förtrollningar. + + + + + Siffran på knappen visar hur många erfarenhetsnivåer det kostar att använda den förtrollningen på föremålet. Om din nivå inte är tillräckligt hög kommer knappen att vara avaktiverad. + + + + + Nu när du kan stå emot eld och lava borde du se om du kan ta dig till platser som du inte kunde nå förut. + + + + + Det här är förtrollningsgränssnittet. Du kan använda det för att förtrolla vapen, rustningsdelar och vissa verktyg. + + + + {*B*} + Tryck på{*CONTROLLER_VK_A*} för att lära dig mer om förtrollningsgränssnittet.{*B*} + Tryck på{*CONTROLLER_VK_B*} om du redan vet hur man använder förtrollningsgränssnittet. + + + + + I det här området finns ett brygdställ, en kittel och en kista full med brygdingredienser. + + + + + Träkol kan användas som bränsle, eller användas i kombination med en stav för att tillverka en fackla. + + + + + Om du använder sand som resurs kan du tillverka glas. Tillverka några glasblock att använda som fönster i ditt skydd. + + + + + Det här är bryggningsgränssnittet. Du kan använda det för att skapa brygder med många olika effekter. + + + + + Många saker av trä kan användas som bränsle, men inte alla brinner lika länge. Du kan även hitta andra saker i världen som kan användas som bränsle. + + + + + När dina saker har behandlats i ugnen kan du flytta dem från resultatrutan till ditt inventarie. Experimentera med olika saker för att se vad du kan tillverka. + + + + + Om du bränner trä kan du tillverka träkol. Lägg bränsle i ugnen och använd trä som resurs att bränna. Det kan ta ett tag innan ugnen börjar producera träkol, så gör någonting annat under tiden och återvänd senare för att se hur det går. + + + + {*B*} + Tryck på{*CONTROLLER_VK_A*} för att fortsätta.{*B*} + Tryck på{*CONTROLLER_VK_B*} om du redan vet hur man använder brygdstället. + + + + + Att tillsätta ett fermenterat spindelöga fördärvar brygden och gör att den får motsatt effekt. Krut gör att brygden blir explosiv, vilket gör att effekten påverkar allt som träffas när brygden kastas. + + + + + Skapa en brygd för eldmotstånd genom att först tillsätta en nedervårta i en vattenflaska, och sedan tillsätta magmasalva. + + + + + Tryck på{*CONTROLLER_VK_B*} nu för att lämna brygdgränssnittet. + + + + + Brygg brygder genom att placera en ingrediens i den översta rutan och en brygd eller vattenflaska i de nedre rutorna. Du kan brygga upp till tre stycken samtidigt. När du har hittat en giltig kombination inleds bryggandet och resultatet blir klart kort efter det. + + + + + Alla brygder börjar med en vattenflaska. De flesta brygderna skapas genom att först tillsätta en nedervårta - då får man en basal brygd. Sedan krävs minst en ingrediens till för att framställa den slutgiltiga brygden. + + + + + När du väl har en brygd kan du modifiera dess effekter. Om du tillsätter rödstensstoft förlängs effekten, medan glödstenstoft gör effekten mer kraftfull. + + + + + Välj en förtrollning och tryck på{*CONTROLLER_VK_A*} för att förtrolla föremålet. Det här sänker din erfarenhetsnivå med förtrollningens kostnad. + + + + + Tryck på{*CONTROLLER_ACTION_USE*} för att kasta ut linan och börja fiska. Tryck på{*CONTROLLER_ACTION_USE*} igen för att dra in fiskelinan. + {*FishingRodIcon*} + + + + + För att fånga fisk måste du vänta till dess att flötet dras ned under ytan innan du drar in linan. Fisk kan ätas rå eller tillagad (med hjälp av en ugn) för att återställa hälsa. + {*FishIcon*} + + + + + Precis som många andra verktyg har fiskespöet ett begränsat antal användningar. Det finns dock inget som säger att du måste lägga de användningarna på att fånga fisk. Experimentera för att se vad du kan fånga eller aktivera ... + {*FishingRodIcon*} + + + + + En båt låter dig ta dig fram över vattnet snabbt. Du kan styra båten med{*CONTROLLER_ACTION_MOVE*} och{*CONTROLLER_ACTION_LOOK*}. + {*BoatIcon*} + + + + + Nu använder du ett fiskespö. Tryck på{*CONTROLLER_ACTION_USE*} för att använda det.{*FishingRodIcon*} + + + + + {*B*} + Tryck på{*CONTROLLER_VK_A*} för att lära dig mer om fiske.{*B*} + Tryck på{*CONTROLLER_VK_B*} om du redan vet hur man fiskar. + + + + + Det här är en säng. Peka på den när det är natt och tryck på{*CONTROLLER_ACTION_USE*} för att sova hela natten och vakna nästa morgon.{*ICON*}355{*/ICON*} + + + + + I det här området finns enkla rödstens- och kolvkretsar, samt en kista med saker som låter dig bygga ut de kretsarna. + + + + + {*B*} + Tryck på{*CONTROLLER_VK_A*} för att lära dig mer om rödstenskretsar och kolvar.{*B*} + Tryck på{*CONTROLLER_VK_B*} om du redan vet hur rödstenskretsar och kolvar fungerar. + + + + + Spakar, knappar, tryckplattor och rödstensfacklor kan alla ge ström till kretsar, antingen genom att ansluta dem direkt till saken som behöver ström, eller med hjälp av rödstensstoft. + + + + + {*B*} + Tryck på{*CONTROLLER_VK_A*} för att lära dig mer om sängar.{*B*} + Tryck på{*CONTROLLER_VK_B*} om du redan vet hur man använder sängar. + + + + + En säng bör stå på en säker och upplyst plats, annars kommer du att bli störd av monster mitt i natten. När du har använt en säng blir den till din spawnplats, och skulle du råka dö får du börja från den igen. + {*ICON*}355{*/ICON*} + + + + + Om du spelar tillsammans med andra spelare måste alla gå och lägga sig samtidigt för att kunna sova. + {*ICON*}355{*/ICON*} + + + + + {*B*} + Tryck på{*CONTROLLER_VK_A*} för att lära dig mer om båtar.{*B*} + Tryck på{*CONTROLLER_VK_B*} om du redan vet hur man använder båtar. + + + + + Med hjälp av ett förtrollningsbord kan du lägga till specialeffekter, exempelvis att du får fler resurser när du bryter block eller att dina vapen, rustningsdelar och verktyg blir mer stryktåliga. + + + + + Om du ställer bokhyllor runt förtrollningsbordet får det mer kraft, och då kan du använda bättre förtrollningar. + + + + + Det kostar erfarenhetsnivåer att förtrolla föremål. Du höjer din nivå genom att plocka upp erfarenhetsklot som bildas när du dödar monster och djur, när du bryter malm, avlar djur, fiskar eller behandlar vissa saker i ugnen. + + + + + Alla förtrollningar är slumpmässiga, men några av de bättre förtrollningarna är bara tillgängliga när du har en hög erfarenhetsnivå, och när det står många bokhyllor runt förtrollningsbordet för att ge det mer kraft. + + + + + I det här området finns ett förtrollningsbord och några andra föremål som ska lära dig grunderna om förtrollning. + + + + {*B*} + Tryck på{*CONTROLLER_VK_A*} för att lära dig mer om förtrollning.{*B*} + Tryck på{*CONTROLLER_VK_B*} om du redan kan förtrollning. + + + + + Du kan även höja din erfarenhetsnivå med hjälp av förtrollningsflaskor. När en sådan kastas sprider den erfarenhetsklot där den landar. Du kan sedan plocka upp kloten. + + + + + En gruvvagn åker på räls. Det går även att tillverka en värmedriven gruvvagn med ugn och en gruvvagn med en kista i. + {*RailIcon*} + + + + + Det går även att tillverka en rödstensräls som drar kraft från rödstensfacklor och -kretsar för att driva gruvvagnen framåt. Dessa kan anslutas till kopplare, spakar och tryckplattor för att skapa avancerade system. + {*PoweredRailIcon*} + + + + + Nu seglar du med en båt. För att lämna båten pekar du på den med markören och trycker på{*CONTROLLER_ACTION_USE*}.{*BoatIcon*} + + + + + Kistan i det här området innehåller några förtrollade saker, förtrollningsflaskor och några saker som inte har förtrollats ännu som du kan experimentera med vid förtrollningsbordet. + + + + + Nu åker du i en gruvvagn. Om du vill kliva ur den pekar du på den med markören och trycker på{*CONTROLLER_ACTION_USE*}.{*MinecartIcon*} + + + + {*B*} + Tryck på{*CONTROLLER_VK_A*} för att lära dig mer om gruvvagnar.{*B*} + Tryck på{*CONTROLLER_VK_B*} om du redan vet hur gruvvagnar fungerar. + + + + Om du flyttar markören utanför gränssnittet medan du bär på ett föremål, kan du släppa föremålet. + + + Läs + + + Häng + + + Kasta + + + Öppna + + + Byt tonart + + + Detonera + + + Plantera + + + Lås upp fullständiga spelet + + + Radera sparfil + + + Radera + + + Plöj + + + Skörda + + + Fortsätt + + + Simma upp + + + Slå + + + Mjölka + + + Plocka upp + + + Töm + + + Rid + + + Placera + + + Ät + + + Rid + + + Segla + + + Odla + + + Sov + + + Vakna + + + Spela + + + Alternativ + + + Flytta rustningsdel + + + Flytta vapen + + + Välj + + + Flytta ingrediens + + + Flytta bränsle + + + Flytta verktyg + + + Dra + + + Sida upp + + + Sida ned + + + Brunstig + + + Släpp + + + Privilegier + + + Blockera + + + Kreativt + + + Blockera värld + + + Välj utseende + + + Antänd + + + Bjud in vänner + + + Acceptera + + + Klipp + + + Navigera + + + Ominstallera + + + Sparalt. + + + Verkställ kommando + + + Installera fullständiga versionen + + + Installera demo + + + Installera + + + Skjut ut + + + Uppdatera spellistan + + + Festspel + + + Alla spel + + + Stäng + + + Avbryt + + + Avbryt anslutningen + + + Byt grupp + + + Tillverkning + + + Tillverka + + + Plocka upp/placera + + + Visa inventariet + + + Visa beskrivning + + + Visa ingredienser + + + Tillbaka + + + Påminnelse: + + + + + + Nya funktioner har lagts till i den senaste versionen, bland annat nya områden i övningsvärlden. + + + Du har inte alla ingredienser som behövs för att tillverka den här saken. Rutan nere till vänster visar vilka ingredienser som behövs. + + + + Grattis, du är klar med övningen. Nu passerar tiden i spelet i normal hastighet, och det dröjer inte länge innan det blir natt och monster kommer ut! Bygg färdigt skyddet! + + + + {*EXIT_PICTURE*} När du är redo att utforska mer kan du leta upp trappan som leder till ett litet slott. Den ligger nära gruvarbetarens skydd. + + + {*B*}Tryck på{*CONTROLLER_VK_A*} för att spela övningen som vanligt.{*B*} + Tryck på{*CONTROLLER_VK_B*} för att hoppa över den huvudsakliga övningen. + + + + {*B*} + Tryck på{*CONTROLLER_VK_A*} för att lära dig mer om hungermätaren och mat.{*B*} + Tryck på{*CONTROLLER_VK_B*} om du redan vet hur hungermätaren fungerar och hur man äter mat. + + + + Välj + + + Använd + + + I det här området finns platser där du kan lära dig om fiske, båtar, kolvar och rödsten. + + + Utanför det här området finns exempel på byggnader, gårdar, gruvvagnar med räls, förtrollning, bryggning, byteshandel, smide och mycket mer! + + + + Din hungermätare ligger på en nivå där du inte längre återfår hälsa. + + + + Plocka upp + + + Nästa + + + Föregående + + + Sparka spelare + + + Skicka vänförfrågan + + + Sida ned + + + Sida upp + + + Färga + + + Läk + + + Sitt + + + Följ mig + + + Bryt + + + Mata + + + Tämj + + + Byt filter + + + Placera alla + + + Placera en + + + Släpp + + + Plocka upp alla + + + Plocka upp hälften + + + Placera + + + Släpp alla + + + Rensa snabbval + + + Vad är det här? + + + Dela på Facebook + + + Släpp en + + + Byt grupp + + + Snabbval + + + Utseendepaket + + + Rödmålad glasruta + + + Grönmålad glasruta + + + Brunmålad glasruta + + + Vitmålat glas + + + Målad glasruta + + + Svartmålad glasruta + + + Blåmålad glasruta + + + Gråmålad glasruta + + + Rosamålad glasruta + + + Limemålad glasruta + + + Lilamålad glasruta + + + Cyanmålad glasruta + + + Ljusgråmålad glasruta + + + Orangemålat glas + + + Blåmålat glas + + + Lilamålat glas + + + Cyanmålat glas + + + Rödmålat glas + + + Grönmålat glas + + + Brunmålat glas + + + Ljusgråmålat glas + + + Gulmålat glas + + + Ljusblåmålat glas + + + Magentamålat glas + + + Gråmålat glas + + + Rosamålat glas + + + Limemålat glas + + + Gulmålad glasruta + + + Ljusgrått + + + Grått + + + Rosa + + + Blått + + + Lila + + + Cyanfärgat + + + Limefärgat + + + Orange + + + Vitt + + + Anpassat + + + Gult + + + Ljusblått + + + Magentafärgat + + + Brunt + + + Vitmålad glasruta + + + Liten boll + + + Stor boll + + + Ljusblåmålad glasruta + + + Magentamålad glasruta + + + Orangemålad glasruta + + + Stjärnformat + + + Svart + + + Rött + + + Grönt + + + Smygarformat + + + Explosion + + + Okänd form + + + Svartmålat glas + + + Hästrustning i järn + + + Hästrustning i guld + + + Hästrustning i diamant + + + Rödstensjämförare + + + Gruvvagn med dynamit + + + Gruvvagn med tratt + + + Koppel + + + Fyrljus + + + Kistfälla + + + Viktplatta (lätt) + + + Namnskylt + + + Träplankor (alla sorter) + + + Kommandoblock + + + Fyrverkeristjärna + + + De här djuren kan tämjas och sedan ridas. De kan utrustas med en kista. + + + Mula + + + Föds när en häst parar sig med en åsna. De här djuren kan tämjas och sedan ridas, och kan bära kistor. + + + Häst + + + De här djuren kan tämjas och sedan ridas. + + + Åsna + + + Zombiehäst + + + Tom karta + + + Nederstjärna + + + Fyrverkeriraket + + + Skeletthäst + + + Wither + + + De här tillverkas av witherskallar och själsand. De skjuter exploderande döskallar mot dig. + + + Viktplatta (tung) + + + Ljusgråfärgad lera + + + Gråfärgad lera + + + Rosafärgad lera + + + Blåfärgad lera + + + Lilafärgad lera + + + Cyanfärgad lera + + + Limefärgad lera + + + Orangefärgad lera + + + Vitfärgad lera + + + Målat glas + + + Gulfärgad lera + + + Ljusblåfärgad lera + + + Magentafärgad lera + + + Brunfärgad lera + + + Tratt + + + Aktiveringsräls + + + Utmatare + + + Rödstensjämförare + + + Dagsljussensor + + + Rödstensblock + + + Färgad lera + + + Svartfärgad lera + + + Rödfärgad lera + + + Grönfärgad lera + + + Höbal + + + Härdad lera + + + Kolblock + + + Tona till + + + När det här alternativet är avstängt kan varken monster eller djur förändra block, eller plocka upp föremål. Exempelvis förstörs inga block av exploderande smygare, och får kan inte äta gräs. + + + När det här alternativet är aktiverat får spelare behålla allt i sin inventarie när de dör. + + + När det här alternativet är avstängt spawnar inga varelser naturligt. + + + Spelläge: Äventyr + + + Äventyr + + + Skriv in ett frö för att skapa samma terräng på nytt. Lämna tomt för en slumpmässig värld. + + + När det här alternativet är avstängt kommer varken monster eller djur att släppa föremål (exempelvis tappar inte smygare något krut). + + + {*PLAYER*} föll av en stege + + + {*PLAYER*} föll av några vinrankor + + + {*PLAYER*} föll ut ur vattnet + + + När det här alternativet är avstängt släpps inga föremål när block förstörs (exempelvis släpper inte stenblock någon kullersten). + + + När det här alternativet är avstängt kommer inte spelare att återställa hälsa automatiskt. + + + När det här alternativet är avstängt ändras inte tiden på dygnet. + + + Gruvvagn + + + Koppla + + + Släpp + + + Fäst + + + Kliv av + + + Fäst kista + + + Avfyra + + + Namnge + + + Fyrljus + + + Primär kraft + + + Sekundär kraft + + + Häst + + + Utmatare + + + Tratt + + + {*PLAYER*} föll från en hög plats + + + Du kan inte använda ägget för tillfället. Det maximala antalet fladdermöss har uppnåtts. + + + Det här djuret kan inte bli brunstigt. Det maximala antalet brunstiga hästar har uppnåtts. + + + Spelalternativ + + + {*PLAYER*} sveddes av {*SOURCE*} som använde {*ITEM*} + + + {*PLAYER*} mörbultades av {*SOURCE*} som använde {*ITEM*} + + + {*PLAYER*} dödades av {*SOURCE*} som använde {*ITEM*} + + + Destruktiva varelser + + + Föremål från block + + + Naturlig återställning + + + Dagsljuscykel + + + Behåll inventarie + + + Varelsespawn + + + Föremål från varelser + + + {*PLAYER*} sköts av {*SOURCE*} som använde {*ITEM*} + + + {*PLAYER*} föll för långt och dödades av {*SOURCE*} + + + {*PLAYER*} föll till sin död på grund av att {*SOURCE*} använde {*ITEM*} + + + {*PLAYER*} gick in i eld i strid mot {*SOURCE*} + + + {*PLAYER*} föll till sin död på grund av {*SOURCE*} + + + {*PLAYER*} föll till sin död på grund av {*SOURCE*} + + + {*PLAYER*} föll till sin död på grund av att {*SOURCE*} använde {*ITEM*} + + + {*PLAYER*} brändes till aska i strid mot {*SOURCE*} + + + {*PLAYER*} sprängdes av {*SOURCE*} + + + {*PLAYER*} förmultnade + + + {*PLAYER*} dödades av {*SOURCE*} som använde {*ITEM*} + + + {*PLAYER*} försökte att simma i lava för att fly från {*SOURCE*} + + + {*PLAYER*} drunknade i försöket att fly från {*SOURCE*} + + + {*PLAYER*} gick in i en kaktus i försöket att fly från {*SOURCE*} + + + Kliv på + + + +För att styra en häst måste den vara utrustad med en sadel. De kan köpas från bybor eller hittas i kistor som finns utspridda i världen. + + + + +Tama åsnor och mulor kan utrustas med sadelväskor genom att fästa en kista. Du kan titta i väskorna medan du rider eller när du smyger. + + + + +Hästar och åsnor (men inte mulor) kan avlas med hjälp av gyllene äpplen eller gyllene morötter, precis som andra djur. Föl växer upp till vuxna hästar med tiden, men mognadsprocessen kan påskyndas genom att mata dem med vete eller hö. + + + + +Hästar, åsnor och mulor måste tämjas innan de kan användas. Tämj en häst genom att sätta dig på den och hålla dig kvar medan den försöker skaka av sig dig. + + + + +När den har tämjts dyker det upp hjärtan, och den försöker inte längre kasta av sig dig. + + + + +Pröva att rida på hästen nu. Använd {*CONTROLLER_ACTION_USE*} utan föremål eller verktyg i handen för att kliva på. + + + + +Du kan försöka dig på att tämja hästarna och åsnorna här, och det finns sadlar, hästrustningar och andra praktiska föremål i kistorna i närheten också. + + + + +Ett fyrljus på en pyramid bestående av minst fyra lager låter dig välja mellan en sekundär kraft som återställer hälsa eller en starkare primär kraft. + + + + +För att ställa in fyrljusets krafter måste du offra en smaragd, diamant, guld- eller järntacka i betalningsinkastet. När krafterna har ställts in utstrålas de från fyrljuset för alltid. + + + + Högst upp på pyramiden finns ett inaktivt fyrljus. + + + +Det här är gränssnittet för fyrljus, vilket du kan använda för att välja fyrljusets krafter. + + + + +{*B*}Tryck på{*CONTROLLER_VK_A*} för att fortsätta. +{*B*}Tryck på{*CONTROLLER_VK_B*} om du redan vet hur man använder fyrljusets gränssnitt. + + + + +Fyrljusmenyn låter dig välja en primär kraft till ditt fyrljus. Ju fler lager din pyramid består av, desto fler krafter kan du välja mellan. + + + + +Alla vuxna hästar, åsnor och mulor kan ridas. Hästar kan ges rustning, medan mulor och åsnor kan ges sadelväskor för att underlätta vid transport av föremål. + + + + +Det här är hästinventariets gränssnitt. + + + + +{*B*}Tryck på{*CONTROLLER_VK_A*} för att fortsätta. +{*B*}Tryck på{*CONTROLLER_VK_B*} om du redan vet hur man använder hästars inventarie. + + + + +Hästinventariet låter dig ge föremål till din häst, åsna eller mula. Det låter dig även utrusta dem med föremål. + + + + Tindra + + + Svans + + + Flygtid: + + + +Sadla din häst genom att sätta en sadel i sadelrutan. Hästar kan ges rustning genom att placera hästrustning i rustningsrutan. + + + + Du har hittat en mula. + + + + {*B*}Tryck på{*CONTROLLER_VK_A*} för att lära dig mer om hästar, åsnor och mulor. + {*B*}Tryck på{*CONTROLLER_VK_B*} om du redan vet hur man använder hästar, åsnor och mulor. + + + + +Hästar och åsnor hittas mestadels på öppna fält. Mulor är en blandras mellan åsnor och hästar, men de är själva infertila. + + + + +Du kan även flytta föremål mellan dig själv och sadelväskor som sitter på åsnor och mulor i den här menyn. + + + + Du har hittat en häst. + + + Du har hittat en åsna. + + + + {*B*}Tryck på{*CONTROLLER_VK_A*} för att lära dig mer om fyrljus. + {*B*}Tryck på{*CONTROLLER_VK_B*} om du redan vet hur man använder fyrljus. + + + + +Fyrverkeristjärnor kan tillverkas genom att placera krut och färgämnen i tillverkningsrutorna. + + + + +Färgämnet bestämmer färgen på fyrverkeristjärnans explosion. + + + + +Fyrverkeristjärnans form kan bestämmas genom att lägga till en eldladdning, guldklimp, fjäder eller ett fiendehuvud. + + + + +Om du vill kan du placera flera fyrverkeristjärnor i tillverkningsrutorna för att lägga till dem i fyrverkerierna. + + + + +Ju fler rutor du fyller med krut, desto högre upp exploderar fyrverkeristjärnorna. + + + + +Du kan sedan ta de tillverkade fyrverkerierna ur resultatfacket. + + + + +Den kan tindra eller ges en svans genom att lägga till glödstensstoft eller diamanter. + + + + +Fyrverkerier är dekorativa föremål som kan avfyras manuellt eller från automater. De tillverkas av papper, krut och ett valfritt antal fyrverkeristjärnor. + + + + +Fyrverkeristjärnornas färg, toning, form, storlek och effekter (som att de har svans eller tindrar) kan anpassas genom att lägga till fler ingredienser vid tillverkningen. + + + + +Pröva att tillverka fyrverkerier vid arbetsbänken med hjälp av ingredienserna i kistorna. + + + + +När en fyrverkeristjärna har tillverkats kan den ges en toningsfärg genom att tillverkas tillsammans med ett färgämne. + + + + +I kistorna här finns diverse föremål som används vid tillverkningen av FYRVERKERIER! + + + + +{*B*}Tryck på{*CONTROLLER_VK_A*} för att lära dig mer om fyrverkerier. +{*B*}Tryck på{*CONTROLLER_VK_B*} om du redan vet hur man använder fyrverkerier. + + + + +För att tillverka fyrverkerier, placera krut och papper i 3x3-tillverkningsrutorna ovanför din inventarie. + + + + Det här rummet innehåller trattar + + + + {*B*}Tryck på{*CONTROLLER_VK_A*} för att lära dig mer om trattar. + {*B*}Tryck på{*CONTROLLER_VK_B*} om du redan vet hur man använder trattar. + + + + +Trattar används för att stoppa i eller ta ut föremål från behållare, och för att automatiskt plocka upp föremål som kastas i dem. + + + + +Aktiva fyrljus skickar upp en ljusstråle i himlen och ger spelare i närheten krafter. De tillverkas av glas, obsidian och nederstjärnor, vilka kan fås genom att besegra Wither. + + + + +Fyrljus måste placeras så att de står i solljus under dagtid. De måste även placeras på pyramider av järn, guld, smaragd eller diamant. Materialet som fyrljuset ställs på har ingen effekt på fyrljusets kraft. + + + + +Pröva att använda fyrljuset för att ställa in vilka krafter det ger. Du kan använda järntackorna som betalning. + + + + +De kan användas med brygdställ, kistor, automater, gruvvagnar med kistor, gruvvagnar med trattar samt med andra trattar. + + + + +Det finns diverse praktiska trattlayouter i det här rummet som du kan experimentera med. + + + + +Det här är fyrverkerigränssnittet. Här kan du tillverka fyrverkerier och fyrverkeristjärnor. + + + + +{*B*}Tryck på{*CONTROLLER_VK_A*} för att fortsätta. +{*B*}Tryck på{*CONTROLLER_VK_B*} om du redan vet hur man använder fyrverkerigränssnittet. + + + + +Trattar flyttar kontinuerligt föremål från behållare placerade ovanför dem. De försöker även stoppa lagrade föremål i en annan behållare. + + + + +Om en tratt drivs av rödsten blir den inaktiv och slutar med uppsamlingen och insättningen av föremål. + + + + +Trattar pekar i den riktning de försöker mata ut föremål. För att peka en tratt mot ett visst block, placera tratten mot det blocket medan du smyger. + + + + De här fienderna finns i träsk och attackerar genom att kasta brygder. De tappar brygder när de dödas. + + + Det maximala antalet tavlor/uppvisningsboxar i en värld har uppnåtts. + + + Du kan inte spawna fiender i det fridfulla läget. + + + Det här djuret kan inte bli brunstigt. Det maximala antalet brunstiga grisar, får, kor, katter och hästar har uppnåtts. + + + Du kan inte använda ägget för tillfället. Det maximala antalet bläckfiskar i en värld har uppnåtts. + + + Du kan inte använda ägget för tillfället. Det maximala antalet fiender i en värld har uppnåtts. + + + Du kan inte använda ägget för tillfället. Det maximala antalet bybor i en värld har uppnåtts. + + + Det här djuret kan inte bli brunstigt. Det maximala antalet brunstiga vargar har uppnåtts. + + + Det maximala antalet varelsehuvuden i en värld har uppnåtts. + + + Omvänd Y-axel + + + Vänsterhänt + + + Det här djuret kan inte bli brunstigt. Det maximala antalet brunstiga höns har uppnåtts. + + + Det här djuret kan inte bli brunstigt. Det maximala antalet brunstiga svampkor har uppnåtts. + + + Det maximala antalet båtar i en värld har uppnåtts. + + + Du kan inte använda ägget för tillfället. Det maximala antalet höns i en värld har uppnåtts. + + + +{*C2*}Ta ett djupt andetag. Ta ett till. Känn luften i lungorna. Låt dina kroppsdelar vakna. Ja, rör på fingrarna. Ha en kropp igen, känn gravitationen, känn luften. Återgå till den långa drömmen. Där är du. Hela din kropp vidrör universum, som om ni var två skilda saker. Som om vi var skilda saker.{*EF*}{*B*}{*B*} +{*C3*}Vilka är vi? För länge sedan kallades vi för bergets ande. Fader sol, moder måne. Förfädernas andar, djurens andar. Djinn. Spöken. Den gröne mannen. Sedan gudar och demoner. Änglar. Poltergeister. Rymdvarelser, utomjordingar. Leptoner, kvarkar. Orden förändras. Vi förändras inte.{*EF*}{*B*}{*B*} +{*C2*}Vi är universum. Vi är allt du tror inte är du. Du ser på oss nu, genom huden och ögonen. Varför tror du att universum vidrör dig och kastar ljus på dig? För att se dig, spelare. För att lära känna dig. Och för att bli känt. Jag ska berätta en historia för dig.{*EF*}{*B*}{*B*} +{*C2*}Det var en gång en spelare.{*EF*}{*B*}{*B*} +{*C3*}Spelaren var du, {*PLAYER*}.{*EF*}{*B*}{*B*} +{*C2*}Ibland såg den sig som en människa på skorpan av ett klot som bestod av smält sten. Klotet av smält sten låg i omlopp runt ett klot av brinnande gas som var 330.000 gånger större än det. De var så långt ifrån varandra att det tog åtta minuter för ljuset att ta sig från det ena klotet till det andra. Ljuset var information från en stjärna, och det kunde bränna dig från ett avstånd på 150 miljoner kilometer.{*EF*}{*B*}{*B*} +{*C2*}Ibland drömde spelaren att den var en gruvarbetare på ytan av en planet som var platt och oändlig. Solen var en vit fyrkant. Dagarna var korta – det fanns mycket att göra och döden var bara en tillfällig obekvämlighet.{*EF*}{*B*}{*B*} +{*C3*}Ibland drömde spelaren att den tappade bort sig i en berättelse.{*EF*}{*B*}{*B*} +{*C2*}Ibland drömde spelaren att den var andra saker, på andra platser. Ibland var drömmarna skrämmande. Ibland var de vackra. Ibland kunde spelaren gå från en dröm till en annan, och sedan vakna från den in i en tredje.{*EF*}{*B*}{*B*} +{*C3*}Ibland drömde spelaren att den läste ord på en skärm.{*EF*}{*B*}{*B*} +{*C2*}Låt oss backa en bit.{*EF*}{*B*}{*B*} +{*C2*}Spelarens atomer låg utspridda i gräset, i floderna, i luften, i marken. En kvinna samlade atomerna – hon drack, åt och andades – och kvinnan satte ihop spelaren i sin kropp.{*EF*}{*B*}{*B*} +{*C2*}Till slut vaknade spelaren. Från den varma, mörka världen i modern och ut i den långa drömmen.{*EF*}{*B*}{*B*} +{*C2*}Spelaren var en ny historia, en som aldrig hade berättats förut, skriven med alfabetet vi kallar för DNA. Spelaren var ett nytt program som aldrig hade körts förut, genererad av en källkod som är över en miljard år gammal. Spelaren var en ny människa som aldrig hade levt förut. En spelare gjord på inget annat än mjölk och kärlek.{*EF*}{*B*}{*B*} +{*C3*}Du är spelaren. Historien. Programmet. Människan. Gjord på inget annat än mjölk och kärlek.{*EF*}{*B*}{*B*} +{*C2*}Låt oss backa ännu längre.{*EF*}{*B*}{*B*} +{*C2*}De sju miljarders miljarders miljarder atomer i spelarens kropp skapades, långt innan spelets skapelse, i hjärtat av en stjärna. Alltså är även spelaren information från en stjärna. Spelaren rör sig genom en berättelse, vilken är en informationsdjungel planterad av en man som heter Julian, på en platt och oändlig värld skapad av en man som heter Markus. Den existerar inuti en liten, privat värld som har skapats av spelaren, som lever i ett universum skapat av...{*EF*}{*B*}{*B*} +{*C3*}Shhhh. Ibland skapade spelaren en liten, privat värld som var mjuk, varm och enkel. Andra gånger var den hård, kall och komplicerad. Ibland byggde den upp en bild av universum i sitt huvud – små energipartiklar som rörde sig genom enorma, tomma ytor. Ibland kallade den partiklarna för "elektroner" och "protoner".{*EF*}{*B*}{*B*} + + + + {*C2*}Ibland kallade den dem för "planeter" och "stjärnor".{*EF*}{*B*}{*B*} {*C2*}Ibland trodde den att den befann sig i ett universum som bestod av "av" och "på", av ettor och nollor, av rader med kod. Ibland trodde den att den spelade ett spel. Ibland trodde den att den läste ord på en skärm.{*EF*}{*B*}{*B*} {*C3*}Du är spelaren som läser ord...{*EF*}{*B*}{*B*} {*C2*}Shhh. Ibland läste spelaren rader med kod på skärmen. Omvandlade dem till ord, omvandlade orden till mening, omvandlade mening till känslor, teorier och idéer. Spelaren började andas snabbare och djupare och insåg att den var vid liv, den var vid liv, de där tusentals dödsfallen var inte på riktigt, spelaren var vid liv.{*EF*}{*B*}{*B*} {*C3*}Du. Du. Du lever.{*EF*}{*B*}{*B*} {*C2*}Ibland trodde spelaren att universum hade talat till den genom solljuset som föll genom sommarträdens rasslande löv.{*EF*}{*B*}{*B*} {*C3*}Ibland trodde spelaren att universum hade talat till den genom ljuset som föll från den iskalla natthimlen, där en ljusprick i hörnet av spelarens synfält kan vara en stjärna som är miljoner gånger så stor som solen, och så varm att den kokar planeter till plasma bara för att vara synlig för spelaren för ett kort ögonblick – spelaren som är på väg hem på andra sidan universum och helt plötsligt känner doften av mat, som närmar sig den bekanta dörren och är på väg in i drömmen igen.{*EF*}{*B*}{*B*} {*C2*}Ibland trodde spelaren att universum hade talat till den genom ettor och nollor, genom världens elektricitet, genom ord som rullar fram över skärmen vid slutet av en dröm.{*EF*}{*B*}{*B*} {*C3*}Och universum sade "jag älskar dig".{*EF*}{*B*}{*B*} {*C2*}Och universum sade "du har spelat spelet väl".{*EF*}{*B*}{*B*} {*C3*}Och universum sade "allt du behöver finns inom dig".{*EF*}{*B*}{*B*} {*C2*}Och universum sade "du är starkare än vad du tror".{*EF*}{*B*}{*B*} {*C3*}Och universum sade "du är dagsljuset".{*EF*}{*B*}{*B*} {*C2*}Och universum sade "du är natten".{*EF*}{*B*}{*B*} {*C3*}Och universum sade "mörkret du kämpar mot finns inom dig".{*EF*}{*B*}{*B*} {*C2*}Och universum sade "ljuset du söker finns inom dig".{*EF*}{*B*}{*B*} {*C3*}Och universum sade "du är inte ensam".{*EF*}{*B*}{*B*} {*C2*}Och universum sade "du är inte separerad från allt annat".{*EF*}{*B*}{*B*} {*C3*}Och universum sade "du är universum som smakar sig själv, pratar med sig själv och läser sin egen kod".{*EF*}{*B*}{*B*} {*C2*}Och universum sade "jag älskar dig, för du är kärlek".{*EF*}{*B*}{*B*} {*C3*}Sedan var spelet över och spelaren vaknade från drömmen. Spelaren drömde sedan en annan dröm. Om och om igen, bättre och bättre. Spelaren var universum, och spelaren var kärlek.{*EF*}{*B*}{*B*} {*C3*}Du är spelaren.{*EF*}{*B*}{*B*} {*C2*}Vakna.{*EF*} + + + Återställ Nedervärlden + + + %s har nått världens ände + + + %s har lämnat världens ände + + + +{*C3*}Jag ser spelaren du menar.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}?{*EF*}{*B*}{*B*} +{*C3*}Ja. Var försiktig. Den har nått en högre nivå nu. Den kan läsa våra tankar.{*EF*}{*B*}{*B*} +{*C2*}Det spelar ingen roll. Den tror att vi är en del av spelet.{*EF*}{*B*}{*B*} +{*C3*}Jag gillar den här spelaren. Den spelade bra. Den gav inte upp.{*EF*}{*B*}{*B*} +{*C2*}Den läser våra tankar som om de vore ord på skärmen.{*EF*}{*B*}{*B*} +{*C3*}Det är så den manifesterar många saker när den befinner sig djupt ned i spelandets drömmar.{*EF*}{*B*}{*B*} +{*C2*}Ord fungerar som ett underbart gränssnitt. De är väldigt flexibla. Inte alls lika läskiga som att möta verkligheten bakom skärmen.{*EF*}{*B*}{*B*} +{*C3*}De brukade höra röster. Innan spelare kunde läsa. På den tiden då de som inte spelade kallade spelare för häxor och trollkarlar. När spelare drömde att de flög fram genom luften på stavar med hjälp av demoners kraft.{*EF*}{*B*}{*B*} +{*C2*}Vad drömde den här spelaren?{*EF*}{*B*}{*B*} +{*C3*}Den här spelaren drömde om solljus och träd. Om eld och vatten. Den drömde att den skapade, och den drömde att den förstörde. Den drömde att den jagade och jagades. Den drömde om skydd.{*EF*}{*B*}{*B*} +{*C2*}Hah, det ursprungliga gränssnittet. En miljon år gammalt, och det fungerar fortfarande. Men vilka riktiga strukturer skapade den här spelaren i verkligheten bortom skärmen?{*EF*}{*B*}{*B*} +{*C3*}Den slet, med miljontals som den, för att skapa en riktig värld i {*EF*}{*NOISE*}{*C3*}, och skapade en {*EF*}{*NOISE*}{*C3*} åt {*EF*}{*NOISE*}{*C3*}, i {*EF*}{*NOISE*}{*C3*}.{*EF*}{*B*}{*B*} +{*C2*}Den kan inte läsa den tanken.{*EF*}{*B*}{*B*} +{*C3*}Nej. Den har inte nått den högsta nivån. Det kan den bara göra i livets långa dröm, inte i spelets korta dröm.{*EF*}{*B*}{*B*} +{*C2*}Vet den att vi älskar den? Att universum är givmilt?{*EF*}{*B*}{*B*} +{*C3*}Ja. Ibland kan den, genom oväsendet i alla tankar, höra universum.{*EF*}{*B*}{*B*} +{*C2*}Men då och då är den ledsen, i den långa drömmen. Den skapar världar utan somrar, den huttrar under en svart sol och den tar sin dystra skapelse för verklighet.{*EF*}{*B*}{*B*} +{*C3*}Att bota dess sorg skulle förgöra den. Sorgen fyller en funktion. Vi får inte komma i vägen för den.{*EF*}{*B*}{*B*} +{*C2*}Ibland, när de är djupt inne i en dröm, vill jag berätta för dem att de bygger riktiga världar i verkligheten. Ibland vill jag berätta hur viktiga de är för universum. Ibland, när de inte har gjort en riktig koppling på länge, vill jag hjälpa dem att säga ordet de fruktar.{*EF*}{*B*}{*B*} +{*C3*}Den läser våra tankar{*EF*}{*B*}{*B*} +{*C2*}Ibland bryr jag mig inte. Ibland vill jag berätta för dem att världen de tar för given bara är {*EF*}{*NOISE*}{*C2*} och {*EF*}{*NOISE*}{*C2*}, jag vill berätta att de är {*EF*}{*NOISE*}{*C2*} i {*EF*}{*NOISE*}{*C2*}. De ser så lite av verkligheten i den långa drömmen.{*EF*}{*B*}{*B*} +{*C3*}Ändå spelar de spelet.{*EF*}{*B*}{*B*} +{*C2*}Men det skulle vara så lätt att berätta för dem ...{*EF*}{*B*}{*B*} +{*C3*}Det vore för mycket för den här drömmen. Att säga hur de ska leva skulle förhindra dem från att leva.{*EF*}{*B*}{*B*} +{*C2*}Jag ska inte säga åt den här spelaren hur den ska leva.{*EF*}{*B*}{*B*} +{*C3*}Spelaren börjar bli otålig.{*EF*}{*B*}{*B*} +{*C2*}Jag ska berätta en historia för spelaren.{*EF*}{*B*}{*B*} +{*C3*}Men inte sanningen.{*EF*}{*B*}{*B*} +{*C2*}Nej. En historia där sanningen är inlåst i en bur av ord. Inte den nakna sanningen som svider oavsett avstånd.{*EF*}{*B*}{*B*} +{*C3*}Ge den en kropp igen.{*EF*}{*B*}{*B*} +{*C2*}Ja. Spelare ...{*EF*}{*B*}{*B*} +{*C3*}Använd dess namn.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}. Spelare av spel.{*EF*}{*B*}{*B*} +{*C3*}Bra.{*EF*}{*B*}{*B*} + + + Vill du återställa den här sparfilens Nedervärld till dess ursprungliga tillstånd? Du kommer att förlora allt som har byggts i Nedervärlden? + + + Du kan inte använda ägget för tillfället. Det maximala antalet grisar, får, kor, katter och hästar har uppnåtts. + + + Du kan inte använda ägget för tillfället. Det maximala antalet svampkor har uppnåtts. + + + Du kan inte använda ägget för tillfället. Det maximala antalet vargar i en värld har uppnåtts. + + + Återställ Nedervärlden + + + Återställ inte Nedervärlden + + + Du kan inte klippa den här svampkon för tillfället. Det maximala antalet grisar, får, kor, katter och hästar har uppnåtts. + + + Du dog! + + + Världsalternativ + + + Kan bygga och bryta block + + + Kan använda dörrar och kopplare + + + Generera strukturer + + + Platt värld + + + Bonuskista + + + Kan öppna behållare + + + Sparka spelare + + + Kan flyga + + + Stäng av utmattning + + + Kan anfalla spelare + + + Kan anfalla djur + + + Moderator + + + Värdprivilegier + + + Instruktioner + + + Kontrollinställningar + + + Inställningar + + + Spawna + + + Erbjudanden på nedladdningsbart innehåll + + + Ändra utseende + + + Medverkande + + + Dynamit exploderar + + + Spelare mot spelare + + + Lita på spelare + + + Installera om innehåll + + + Debuginställningar + + + Eld sprider sig + + + Enderdrake + + + {*PLAYER*} dödades av enderdrakens eld + + + {*PLAYER*} dödades av {*SOURCE*} + + + {*PLAYER*} dödades av {*SOURCE*} + + + {*PLAYER*} dog + + + {*PLAYER*} sprängdes + + + {*PLAYER*} dödades av magi + + + {*PLAYER*} sköts av {*SOURCE*} + + + Berggrundsdimma + + + Visa gränssnittet + + + Visa handen + + + {*PLAYER*} träffades av ett eldklot från {*SOURCE*} + + + {*PLAYER*} mörbultades av {*SOURCE*} + + + {*PLAYER*} dödades av {*SOURCE*} som använde magi + + + {*PLAYER*} föll av världen + + + Texturpaket + + + Kombinationspaket + + + {*PLAYER*} brann upp + + + Teman + + + Spelarbilder + + + Avatarföremål + + + {*PLAYER*} brann ihjäl + + + {*PLAYER*} svalt ihjäl + + + {*PLAYER*} stacks ihjäl + + + {*PLAYER*} träffade backen för hårt + + + {*PLAYER*} försökte sig på att simma i lava + + + {*PLAYER*} kvävdes i en vägg + + + {*PLAYER*} drunknade + + + Dödsmeddelanden + + + Du är inte längre moderator + + + Du kan flyga + + + Du kan inte längre flyga + + + Du kan inte längre anfalla djur + + + Nu kan du anfalla djur + + + Du har blivit till moderator + + + Du blir inte längre utmattad + + + Nu är du odödlig + + + Du är inte längre odödlig + + + %d MSP + + + Nu kan du bli utmattad + + + Nu är du osynlig + + + Du är inte längre osynlig + + + Nu kan du anfalla spelare + + + Nu kan du bryta block och använda föremål + + + Du kan inte längre placera block + + + Nu kan du placera block + + + Animerad spelfigur + + + Anpassad utseendeanimation + + + Du kan inte längre bryta block eller använda föremål + + + Nu kan du använda dörrar och kopplare + + + Du kan inte längre anfalla varelser + + + Nu kan du anfalla varelser + + + Du kan inte längre anfalla spelare + + + Du kan inte längre använda dörrar eller kopplare + + + Nu kan du använda behållare (exempelvis kistor) + + + Du kan inte längre använda behållare (exempelvis kistor) + + + Osynlig + + + Fyrljus + + + {*T3*}INSTRUKTIONER: FYRLJUS{*ETW*}{*B*}{*B*} +Aktiva fyrljus skickar upp en ljusstråle i himlen och ger spelare i närheten krafter.{*B*} +De tillverkas av glas, obsidian och nederstjärnor, vilka kan fås genom att besegra Wither.{*B*}{*B*} +Fyrljus måste placeras så att de står i solljus under dagtid. De måste även placeras på pyramider av järn, guld, smaragd eller diamant.{*B*} +Materialet som fyrljuset ställs på har ingen effekt på fyrljusets kraft.{*B*}{*B*} +Fyrljusmenyn låter dig bestämma vilken primär kraft ditt fyrljus har. Ju fler lager pyramiden består av, desto fler krafter kan du välja mellan.{*B*} +Ett fyrljus på en pyramid med minst fyra lager låter dig även välja mellan att ha regenerering som sekundär kraft, eller att ha en starkare primär kraft.{*B*}{*B*} +För att ställa in fyrljusets krafter måste du offra en smaragd, diamant, guld- eller järntacka i betalningsinkastet.{*B*} +När krafterna har ställts in strålar de ut från fyrljuset för alltid.{*B*} + + + + Fyrverkerier + + + Språk + + + Hästar + + + {*T3*}INSTRUKTIONER: HÄSTAR{*ETW*}{*B*}{*B*} +Hästar och åsnor hittas på öppna fält. Mulor är en blandras mellan åsnor och hästar, men de är själva infertila.{*B*} +Alla vuxna hästar, åsnor och mulor kan ridas. Hästar kan utrustas med rustning, medan mulor och åsnor kan förses med sadelväskor för att underlätta vid transport av föremål.{*B*}{*B*} +Hästar, åsnor och mulor måste tämjas innan de kan användas. För att tämja en häst måste du sätta dig på den och hålla dig kvar medan den försöker skaka av sig dig.{*B*} +När hjärtan dyker upp runt hästen är den tam, och den kommer inte längre att försöka kasta av sig dig. För att styra hästen måste du sätta på den en sadel.{*B*}{*B*} +Sadlar kan köpas från bybor eller upptäckas i kistor som finns utspridda i världen.{*B*} +Tama åsnor och mulor kan utrustas med sadelväskor genom att sätta på dem en kista. De här sadelväskorna kan sedan öppnas medan du rider eller smyger.{*B*}{*B*} +Hästar och åsnor (men inte mulor) kan avlas genom att använda gyllene äpplen eller gyllene morötter, precis som andra djur.{*B*} +Föl växer upp till vuxna hästar med tiden. Mognadsprocessen kan påskyndas genom att mata dem med vete eller hö.{*B*} + + + + {*T3*}INSTRUKTIONER: FYRVERKERIER{*ETW*}{*B*}{*B*} +Fyrverkerier är dekorativa föremål som kan avfyras manuellt eller från automater. De tillverkas av papper, krut och ett valfritt antal fyrverkeristjärnor.{*B*} +Fyrverkeristjärnornas färg, toning, form, storlek och effekter (som att de har svans eller tindrar) kan anpassas genom att lägga till fler ingredienser vid tillverkningen.{*B*}{*B*} +För att tillverka fyrverkerier, placera krut och papper i 3x3-tillverkningsrutorna ovanför din inventarie.{*B*} +Om du vill kan du placera flera fyrverkeristjärnor i tillverkningsrutorna för att lägga till dem i fyrverkerierna.{*B*} +Ju fler rutor du fyller med krut, desto högre upp exploderar fyrverkeristjärnorna.{*B*}{*B*} +Du kan sedan ta de tillverkade fyrverkerierna ur resultatfacket.{*B*}{*B*} +Fyrverkeristjärnor kan tillverkas genom att placera krut och färgämnen i tillverkningsrutorna.{*B*} +- Färgämnet bestämmer färgen på fyrverkeristjärnans explosion.{*B*} +- Fyrverkeristjärnans form kan bestämmas genom att lägga till en eldladdning, guldklimp, fjäder eller ett fiendehuvud.{*B*} +- Den kan tindra eller ges en svans genom att lägga till glödstensstoft eller diamanter.{*B*}{*B*} +När en fyrverkeristjärna har tillverkats kan den ges en toningsfärg genom att tillverkas tillsammans med ett färgämne. + + + + {*T3*}INSTRUKTIONER: UTMATARE{*ETW*}{*B*}{*B*} +När en utmatare får en rödstenssignal matar den ut ett av sina föremål framför sig. Använd {*CONTROLLER_ACTION_USE*} för att öppna utmataren, sedan kan du ladda utmataren med föremål från din inventarie.{*B*} +Om utmataren är vänd mot en kista eller mot någon annan behållare kommer föremålet att placeras i kistan i stället. Långa kedjor med utmatare kan byggas för att transportera föremål långa sträckor. För att det ska fungera måste de slås av och på upprepade gånger. + + + + När den används blir den till en karta över världen du befinner dig i, och fylls i när du utforskar. + + + Tappas av Wither, används vid tillverkning av fyrljus. + + + Trattar + + + {*T3*}INSTRUKTIONER: TRATTAR{*ETW*}{*B*}{*B*} +Trattar används för att stoppa i eller ta ut föremål från behållare, och för att automatiskt plocka upp föremål som kastas i dem.{*B*} +De kan användas med brygdställ, kistor, automater, gruvvagnar med kistor, gruvvagnar med trattar samt med andra trattar.{*B*}{*B*} +Trattar flyttar kontinuerligt föremål från behållare placerade ovanför dem. De försöker även stoppa lagrade föremål i en annan behållare.{*B*} +Om en tratt drivs av rödsten blir den inaktiv och slutar med uppsamlingen och utmatningen av föremål.{*B*}{*B*} +Trattar pekar i den riktning de försöker mata ut föremål. För att peka en tratt mot ett visst block, placera tratten mot det blocket medan du är hukad.{*B*} + + + + Utmatare + + + NOT USED + + + Hälsa direkt + + + Skada direkt + + + Högre hopp + + + Lathet + + + Styrka + + + Svaghet + + + Illamående + + + NOT USED + + + NOT USED + + + NOT USED + + + Regenerering + + + Motstånd + + + Söker frö till världsgeneratorn + + + Exploderar i ett fyrverkeri av färger när den aktiveras. Färg, effekt, form och toning bestäms av fyrverkeristjärnan som används när fyrverkeriet tillverkas. + + + En sorts räls som kan aktivera eller inaktivera gruvvagnar med trattar och aktivera gruvvagnar med dynamit. + + + Används för att förvara och mata ut föremål, eller för att stoppa föremål i en annan behållare när den matas med en rödstenssignal. + + + Färggranna block som tillverkas genom att färga härdad lera. + + + Skickar en rödstenssignal. Signalen blir starkare ju fler föremål står på plattan. Kräver mer vikt än den lätta plattan. + + + Används som rödstenskraftkälla. Kan göras om till rödsten igen. + + + Används för att fånga upp föremål eller för att skicka föremål mellan behållare. + + + Kan ges till hästar, åsnor eller mulor för att läka upp till 10 hjärtan. Gör att föl växer snabbare. + + + Fladdermus + + + De här flygande varelserna finns i grottor och i andra stora omslutna områden. + + + Häxa + + + Tillverkas genom att härda lera i en ugn. + + + Tillverkas av glas och färgämne. + + + Tillverkas av målat glas + + + Skickar en rödstenssignal. Signalen blir starkare ju fler föremål står på plattan. + + + Ett block som skickar en rödstenssignal baserad på solljus (eller bristen på solljus). + + + En speciell sorts gruvvagn som fungerar som en tratt. Den samlar upp föremål som ligger på spår och från behållare ovanför den. + + + En särskild sorts rustning som kan ges till hästar. Ger 5 rustning. + + + Använd för att bestämma färg, effekt och form på en fyrverkeripjäs. + + + Används i rödstenskretsar för att bibehålla, jämföra eller försvaga signalstyrka, eller för att läsa av vissa blocks status. + + + En sorts gruvvagn som fungerar som ett rörligt dynamitblock. + + + En särskild sorts rustning som kan ges till hästar. Ger 7 rustning. + + + Används för att köra kommandon. + + + Skickar upp en stråle av ljus i himlen och kan ge spelare i närheten statuseffekter. + + + Förvarar block och föremål. Ställ två kistor bredvid varandra för att skapa en större kista med dubbel kapacitet. Kistfällan skickar en rödstenssignal när den öppnas. + + + En särskild sorts rustning som kan ges till hästar. Ger 11 rustning. + + + Används för att koppla varelser till spelare eller stolpar + + + Används för att namnge varelser i världen. + + + Flitighet + + + Lås upp fullversion + + + Återgå till spelet + + + Spara + + + Spela + + + Rankningslistor + + + Hjälp och alternativ + + + Svårighetsgrad: + + + Spelare mot spelare: + + + Lita på spelare: + + + Dynamit: + + + Speltyp: + + + Strukturer: + + + Nivåtyp: + + + Inga spel hittades + + + Endast inbjudan + + + Fler alternativ + + + Ladda + + + Värdalternativ + + + Spelare/bjud in + + + Onlinespel + + + Ny värld + + + Spelare + + + Anslut till spel + + + Starta + + + Världens namn + + + Frö till världsskaparen + + + Lämna blankt för ett slumpmässigt frö + + + Eld sprider sig: + + + Redigera skylttext: + + + Fyll i uppgifterna som följer med din skärmbild + + + Bildtext + + + Verktygstips + + + Lodrät skärmdelning för 2 spelare + + + Färdig + + + Skärmbild från spelet + + + Inga effekter + + + Snabbhet + + + Slöhet + + + Redigera skylttext: + + + Minecrafts klassiska texturer, ikoner och gränssnitt! + + + Visa alla kombinationsvärldar + + + Tips + + + Installera om avatarföremål 1 + + + Installera om avatarföremål 2 + + + Installera om avatarföremål 3 + + + Installera om tema + + + Installera om spelarbild 1 + + + Installera om spelarbild 2 + + + Alternativ + + + Gränssnitt + + + Återställ standardvärden + + + Guppande kamera + + + Ljud + + + Känslighet + + + Bild + + + Används vid bryggning. Tappas av spöken när de dör. + + + Tappas av zombiefierade grismän när de dör. Zombiefierade grismän kan hittas i Nedervärlden. Kan användas som ingrediens vid bryggning. + + + Används vid bryggning. Växer naturligt vid fästningar i Nedervärlden. Kan även planteras på själsand. + + + Halt att gå på. Förvandlas till vatten om den ligger ovanpå ett annat block som förstörs. Smälter om den befinner sig nära en ljuskälla eller om den placeras i Nedervärlden. + + + Kan användas som dekoration. + + + Används vid bryggning och för att hitta fästningar. Tappas av brännare, som brukar befinna sig nära fästningar i Nedervärlden. + + + Har olika effekter beroende på vad den används på. + + + Används vid bryggning eller kombineras med andra föremål för att skapa enderögon och magmasalva. + + + Används vid bryggning. + + + Används för att koka normala och explosiva brygder. + + + Kan fyllas med vatten och användas som basingrediens i brygdstället. + + + En giftig ingrediens som kan användas vid matlagning och bryggning. Tappas av spindlar och grottspindlar när de dödas av spelaren. + + + Används vid bryggning, främst för att koka brygder med negativa effekter. + + + Växer med tiden när de placeras ut. Kan klippas med sax. Kan klättras, precis som en stege. + + + Liknar en dörr, men används primärt tillsammans med staket. + + + Kan tillverkas med melonskivor. + + + Genomskinliga block som kan användas som ett alternativ till glasblock. + + + Ge den ström (med hjälp av en knapp, spak, tryckplatta, rödstensfackla eller med en kombination av dessa och rödsten) så kommer, om möjligt, en kolv ut som knuffar block. När den fälls in drar den med sig det block som kolven nuddade. + + + Tillverkas med stenblock och återfinns ofta i fästningar. + + + Används som en barriär, precis som staket. + + + Kan planteras för att odla pumpor. + + + Kan användas som byggmaterial och som dekoration. + + + Gör dig långsammare när du står på det. Kan klippas med sax för att få tråd. + + + Spawnar en silverfisk när den förstörs. Kan även spawna en silverfisk om den befinner sig nära en annan silverfisk under angrepp. + + + Kan planteras för att odla meloner. + + + Släpps av endermän när de dör. Om du kastar en teleporteras du till platsen där pärlan landar och förlorar lite hälsa. + + + Ett jordblock med gräs som växer på ovansidan. Grävs upp med spade. Kan användas som byggmaterial. + + + Kan fyllas med regnvatten eller med en hink, och kan sedan användas för att fylla glasflaskor med vatten. + + + Används för att bygga långa trappor. Två plattor ovanpå varandra skapar en normalstor dubbelplatta. + + + Skapas genom att smälta nedersten i en ugn. Kan användas för att tillverka nedermursten. + + + Lyser när de får ström. + + + Fungerar som ett vitrinskåp - det visar upp det föremål eller block du placerar i det. + + + Spawnar den varelse som indikeras när den kastas. + + + Används för att bygga långa trappor. Två plattor ovanpå varandra skapar en normalstor dubbelplatta. + + + Kan odlas för att få kakaobönor. + + + Ko + + + Släpper läder när den dödas. Kan mjölkas med en hink. + + + Får + + + Varelsehuvuden kan placeras som dekorationer eller bäras som masker genom att bära dem som hjälmar. + + + Bläckfisk + + + Släpper en bläcksäck när den dödas. + + + Användbar när du vill tända eld på saker. Kan även placeras i en automat för att starta bränder på måfå. + + + Flyter på vatten och kan användas som klivsten. + + + Används för att bygga fästningar i Nedervärlden. Immuna mot spökens eldklot. + + + Används i fästningar i Nedervärlden. + + + När de kastas visar de i vilken riktning portalen till världens ände ligger. När tolv av dessa har placerats i portalen till världens ände kommer portalen att aktiveras. + + + Används vid bryggning. + + + Liknar gräsblock, men är väldigt bra att odla svamp på. + + + Hittas i fästningar i Nedervärlden. Släpper nedervårtor när de går sönder. + + + Ett block som finns i världens ände. Det är väldigt stryktåligt och fungerar därför utmärkt som byggmaterial. + + + Det här blocket skapas genom att besegra draken i världens ände. + + + Släpper erfarenhetsklot när den kastas, som ger dig erfarenhetspoäng när du plockar upp dem. + + + Låter dig förtrolla svärd, hackor, yxor, spadar, pilbågar och rustningsdelar genom att betala erfarenhetspoäng. + + + Kan aktiveras med hjälp av tolv enderögon. Låter dig resa till världens ände. + + + Används för att bygga en portal till världens ände. + + + Ge den ström (med hjälp av en knapp, spak, tryckplatta, rödstensfackla eller med en kombination av dessa och rödsten) så kommer, om möjligt, en kolv ut som knuffar block. + + + Bakas med lera i en ugn. + + + Kan härdas till tegelsten i en ugn. + + + Bryts ned till lerbollar som kan härdas till tegelsten i en ugn. + + + Huggs med yxa och kan göras till plankor, eller användas som bränsle. + + + Tillverkas i en ugn genom att smälta sand. Kan användas som byggmaterial, men går sönder om du slår på det. + + + Bryts från sten med en hacka. Kan användas för att bygga en ugn eller stenverktyg. + + + Ett kompakt sätt att förvara snöbollar. + + + Kan kombineras med en skål för att göra en stuvning. + + + Kan endast brytas med en diamanthacka. Uppstår när vatten kolliderar med lava, och används vid portalbyggen. + + + Spawnar monster i världen. + + + Kan grävas med spade för att skapa snöbollar. + + + Lämnar ibland efter sig veteax när det slås sönder. + + + Kan göras till ett färgämne. + + + Grävs med spade. Kan ibland lämna efter sig flintsten när det grävs upp. Påverkas av gravitation om det inte finns någonting under det. + + + Kan brytas med en hacka för att få kol. + + + Kan brytas med en stenhacka eller bättre för att få lasursten. + + + Kan brytas med en järnhacka eller bättre för att få diamanter. + + + Används som dekoration. + + + Kan brytas med järnhackor eller bättre, och sedan smältas i en ugn för att skapa guldtackor. + + + Kan brytas med stenhackor eller bättre, sedan smältas i en ugn för att skapa järntackor. + + + Kan brytas med en järnhacka eller bättre för att få rödstensstoft. + + + Kan inte brytas. + + + Antänder allt det vidrör. Kan plockas upp med en hink. + + + Grävs med spade. Kan smältas till glas i en ugn. Påverkas av gravitation om det inte finns någonting under den. + + + Kan brytas med en hacka för att få kullersten. + + + Grävs med spade. Kan användas som byggmaterial. + + + Kan planteras och växer efter en tid till ett träd. + + + Läggs på backen för att skicka vidare en elektrisk laddning. När det används vid bryggning förlänger det brygdens effekt. + + + Hittas genom att döda kor, och kan bearbetas till rustningsdelar eller användas för att tillverka böcker. + + + Hittas genom att döda slemkuber, och kan användas vid bryggning eller för att tillverka klibbiga kolvar. + + + Läggs slumpmässigt av höns, och kan användas för att laga vissa maträtter. + + + Hittas genom att gräva i grus, och kan användas för att tillverka tändstål. + + + Använd den på en gris för att kunna rida på grisen. Grisen kan sedan styras med hjälp av en morot på en pinne. + + + Skaffas genom att gräva i snö, och kan kastas. + + + Skaffas genom att bryta glödsten, och kan användas för att tillverka nya glödstensblock. Kan även användas vid bryggning för att göra brygden starkare. + + + Släpper ibland skott när de går sönder. Skotten kan planteras om för att odla nya träd. + + + Hittas i grottor, och kan användas som byggmaterial eller dekoration. + + + Används för att klippa ull från får och för att skörda lövblock. + + + Hittas genom att döda skelett. Kan göras om till benmjöl. Kan ges till en varg för att tämja den. + + + Skaffas genom att få ett skelett att döda en smygare. Kan spelas i en jukebox. + + + Släcker eldar och gör att grödor växer snabbare. Kan plockas upp i en hink. + + + Skördas från grödor, och kan användas för att laga vissa maträtter. + + + Kan göras om till socker. + + + Kan bäras som en hjälm eller kombineras med en fackla för att skapa en pumpalykta. Används även som huvudingrediens i pumpapaj. + + + Brinner i all evighet om den antänds. + + + Vete kan skördas från fullvuxna grödor. + + + Mark som har förberetts för frön. + + + Kan tillagas i en ugn för att skapa ett grönt färgämne. + + + Gör den, eller det, som går på den långsammare. + + + Hittas genom att döda höns, och kan användas för att tillverka pilar. + + + Hittas genom att döda smygare, och kan användas för att tillverka dynamit. Fungerar även som ingrediens vid bryggning. + + + Kan planteras på åkrar för att odla grödor. Se till att det finns tillräckligt med ljus! + + + Att stå i portalen låter dig passera mellan den vanliga världen och Nedervärlden. + + + Används som bränsle i ugnar och för att skapa facklor. + + + Hittas genom att döda spindlar, och kan användas för att tillverka pilbågar och fiskespön. Kan placeras på backen för att användas som snubbeltråd. + + + Släpper ull när den klipps (om den inte redan har klippts). Kan färgas för att producera ull med en annan färg. + + + Business Development + + + Portfolio Director + + + Product Manager + + + Development Team + + + Release Management + + + Director, XBLA Publishing + + + Marketing + + + Asia Localization Team + + + User Research Team + + + MGS Central Teams + + + Community Manager + + + Europe Localization Team + + + Redmond Localization Team + + + Design Team + + + Director of Fun + + + Music and Sounds + + + Programming + + + Chief Architect + + + Art Developer + + + Game Crafter + + + Art + + + Producer + + + Test Lead + + + Lead Tester + + + QA + + + Executive Producer + + + Lead Producer + + + Milestone Acceptance Tester + + + Järnspade + + + Diamantspade + + + Guldspade + + + Guldsvärd + + + Träspade + + + Stenspade + + + Trähacka + + + Guldhacka + + + Träyxa + + + Stenyxa + + + Stenhacka + + + Järnhacka + + + Diamanthacka + + + Diamantsvärd + + + SDET + + + Project STE + + + Additional STE + + + Special Thanks + + + Test Manager + + + Senior Test Lead + + + Test Associates + + + Träsvärd + + + Stensvärd + + + Järnsvärd + + + Jon Kågström + + + Tobias Möllstam + + + Risë Lugo + + + Developer + + + Skjuter eldklot som exploderar vid kontakt. + + + Slemkub + + + Delas upp i mindre slemkuber när den skadas. + + + Zombiefierad grisman + + + Vanligtvis fridfull, men anfaller i grupp om du anfaller en av dem. + + + Spöke + + + Enderman + + + Grottspindel + + + Har ett giftigt bett. + + + Svampko + + + Anfaller om du tittar på honom. Kan även flytta på block. + + + Silverfisk + + + Attraherar andra silverfiskar som gömmer sig när den blir anfallen. Gömmer sig i stenblock. + + + Anfaller om du kommer nära. + + + Släpper fläskkotletter när den dödas. Kan ridas med hjälp av en sadel. + + + Varg + + + Anfaller bara om du anfaller den. Kan tämjas med hjälp av ben, vilket får vargen att följa efter dig och gå till angrepp mot allt som anfaller dig. + + + Höna + + + Släpper fjädrar när den dödas, kan även lägga ägg slumpmässigt. + + + Gris + + + Smygare + + + Spindel + + + Anfaller om du kommer nära. Kan klättra upp för väggar. Släpper tråd när den dödas. + + + Zombie + + + Exploderar om du kommer för nära! + + + Skelett + + + Skjuter pilar på dig. Släpper pilar när det dödas. + + + Producerar en svampstuvning om du använder en skål på den. Släpper svampar och blir till en normal ko om den klipps. + + + Original Design and Code by + + + Project Manager/Producer + + + Rest of Mojang Office + + + Concept Artist + + + Number Crunching and Statistics + + + Bully Coordinator + + + Lead Game Programmer Minecraft PC + + + Customer Support + + + Office DJ + + + Designer/Programmer Minecraft - Pocket Edition + + + Ninja Coder + + + CEO + + + White Collar Worker + + + Explosives Animator + + + Den här stora, svarta draken finns i världens ände. + + + Brännare + + + De här fienderna finns i Nedervärlden, mestadels inne i fästningar. De släpper brännstavar när de dödas. + + + Snögolem + + + Man kan skapa en snögolem med hjälp av snöblock och en pumpa. De kastar snöbollar på sina skapares fiender. + + + Enderdrake + + + Magmakub + + + Lever i djungeln. Du kan tämja dem med rå fisk. Tänk på att du måste låta ozeloten närma sig dig, för plötsliga rörelser skrämmer bort den. + + + Järngolem + + + Finns i byar för att skydda dem. Kan byggas med hjälp av järnblock och pumpor. + + + Finns i Nedervärlden. De bryts ned till mindre versioner när de angrips, precis som slemkuber. + + + Bybo + + + Ozelot + + + Kan placeras runtomkring ett förtrollningsbord för att möjliggöra mer kraftfulla förtrollningar. + + + {*T3*}INSTRUKTIONER: UGNAR{*ETW*}{*B*}{*B*} +En ugn låter dig förändra föremål genom att bränna eller smälta dem. Exempelvis kan du använda ugnen för att göra järnmalm till järntackor.{*B*}{*B*} +Placera ugnen i världen och tryck på{*CONTROLLER_ACTION_USE*} för att använda den.{*B*}{*B*} +Stoppa bränsle i botten av ugnen och föremålet som ska behandlas högst upp. Ugnen aktiveras sedan och processen påbörjas.{*B*}{*B*} +När dina föremål har behandlats kan du flytta dem från resultatområdet till ditt inventarie.{*B*}{*B*} +Om du för markören över ett föremål som är en ingrediens eller bränsle till ugnen, öppnas ett verktygstips som låter dig flytta det till ugnen. + + + {*T3*}INSTRUKTIONER: AUTOMATER{*ETW*}{*B*}{*B*} +En automat används för att skjuta ut föremål. Du måste placera en kopplare, exempelvis en spak, bredvid automaten för att aktivera den.{*B*}{*B*} +För att fylla automaten med föremål trycker du på{*CONTROLLER_ACTION_USE*}, sedan flyttar du föremålen som du vill ladda automaten med till automaten.{*B*}{*B*} +Efter det kommer automaten att skjuta ut ett föremål varje gång du använder kopplaren. + + + {*T3*}INSTRUKTIONER: BRYGGNING{*ETW*}{*B*}{*B*} +För att brygga brygder krävs ett brygdställ, vilket kan tillverkas vid en arbetsbänk. Varje brygd börjar med en flaska vatten, som skapas genom att fylla en glasflaska med vatten från en kittel eller vattenkälla.{*B*} +Ett brygdställ har tre platser för flaskor, alltså kan tre brygder tillverkas åt gången. En ingrediens kan användas till alla tre flaskor, så se till att alltid brygga tre brygder åt gången för att utnyttja dina resurser på bästa sätt.{*B*} +Om du lägger en ingrediens i brygdställets översta plats kommer du att få en grundbrygd efter en kort tid. Grundbrygden är verkningslös, men om du tillsätter en till ingrediens i den får brygden särskilda egenskaper.{*B*} +När du väl har skapat den brygden kan du tillsätta en tredje ingrediens för att förlänga egenskapens effekt (med hjälp av rödstensstoft), ha en starkare effekt (med glödstensstoft) eller förvandlas till en skadlig brygd (med ett fermenterat spindelöga).{*B*} +Det går även att tillsätta krut i dina brygder för att göra dem explosiva. Explosiva brygder kan kastas, och när de exploderar appliceras brygdens egenskap på allt i området som träffas.{*B*} + +Basingredienserna är:{*B*}{*B*} +* {*T2*}Nedervårtor{*ETW*}{*B*} +* {*T2*}Spindelögon{*ETW*}{*B*} +* {*T2*}Socker{*ETW*}{*B*} +* {*T2*}Spöktårar{*ETW*}{*B*} +* {*T2*}Brännpulver{*ETW*}{*B*} +* {*T2*}Magmasalva{*ETW*}{*B*} +* {*T2*}Glimmande meloner{*ETW*}{*B*} +* {*T2*}Rödstensstoft{*ETW*}{*B*} +* {*T2*}Glödstensstoft{*ETW*}{*B*} +* {*T2*}Fermenterade spindelögon{*ETW*}{*B*}{*B*} + +Experimentera med olika kombinationer av ingredienser för att hitta alla brygder som kan bryggas. + + + {*T3*}INSTRUKTIONER: STORA KISTOR{*ETW*}{*B*}{*B*} +När man placerar två kistor bredvid varandra kombineras de till en stor kista. Den kan lagra ännu fler föremål.{*B*}{*B*} +Den används på precis samma sätt som en vanlig kista. + + + {*T3*}INSTRUKTIONER: TILLVERKNING{*ETW*}{*B*}{*B*} +Tillverkningsgränssnittet låter dig kombinera föremål i ditt inventarie för att skapa nya slags föremål. Använd{*CONTROLLER_ACTION_CRAFTING*} för att öppna tillverkningsgränssnittet.{*B*}{*B*} +Bläddra mellan flikarna högst upp med{*CONTROLLER_VK_LB*} och{*CONTROLLER_VK_RB*} för att välja vilket slags föremål du vill tillverka, använd sedan{*CONTROLLER_MENU_NAVIGATE*} för att välja vad du vill tillverka.{*B*}{*B*} +Tillverkningsområdet visar vilka föremål som krävs för att tillverka det nya föremålet. Tryck på{*CONTROLLER_VK_A*} för att tillverka föremålet och lägga det i ditt inventarie. + + + {*T3*}INSTRUKTIONER: ARBETSBÄNKAR{*ETW*}{*B*}{*B*} +Du kan tillverka större föremål med hjälp av en arbetsbänk.{*B*}{*B*} +Placera bänken i världen och tryck på{*CONTROLLER_ACTION_USE*} för att använda den.{*B*}{*B*} +Tillverkning på en arbetsbänk fungerar på samma sätt som vid vanlig tillverkning, men tillverkningsområdet och utbudet är större. + + + {*T3*}INSTRUKTIONER: FÖRTROLLNING{*ETW*}{*B*}{*B*} +De erfarenhetspoäng du får när fiender dör, när du bryter vissa block eller smälter dem i en ugn, kan användas för att förtrolla vissa verktyg, vapen, rustningsdelar och böcker.{*B*} +När svärdet, pilbågen, yxan, hackan, spaden, rustningsdelen eller boken placeras i platsen under boken på förtrollningsbordet, kommer de tre knapparna till höger om platsen att visa några förtrollningar och deras erfarenhetskostnader.{*B*} +Om du inte har tillräckligt med erfarenhetsnivåer för att använda dem kommer priset att visas i rött, annars visas det i grönt.{*B*}{*B*} +Den faktiska förtrollningen som används väljs slumpmässigt baserat på kostnaden som visas.{*B*}{*B*} +Om förtrollningsbordet omges av bokhyllor (maximalt femton stycken), med bara ett blocks mellanrum mellan bokhyllorna och förtrollningsbordet, kommer förtrollningarna att stärkas och magiska symboler kan ses komma ur boken på förtrollningsbordet.{*B*}{*B*} +Alla ingredienser till ett förtrollningsbord kan hittas i världens byar, eller brytas eller odlas i världen.{*B*}{*B*} +Förtrollade böcker används med städet för att förtrolla föremål. Det här ger dig mer kontroll över vilka förtrollningar dina föremål har.{*B*} + + + {*T3*}INSTRUKTIONER: BLOCKERA VÄRLDAR{*ETW*}{*B*}{*B*} +Om du finner stötande innehåll i en värld kan du blockera den världen. +Om du vill göra det öppnar du pausmenyn, sedan trycker du på{*CONTROLLER_VK_RB*} för att välja "Blockera värld". +Om du försöker att ansluta till den världen i framtiden kommer du att meddelas att du har blockerat den, sedan får du välja om du vill häva blockeringen och fortsätta till världen, eller gå tillbaka. + + + {*T3*}INSTRUKTIONER: VÄRD- OCH SPELARALTERNATIV{*ETW*}{*B*}{*B*} + +{*T1*}Spelalternativ{*ETW*}{*B*} + När du laddar eller skapar en värld kan du trycka på knappen "Fler alternativ" för att öppna en meny som ger dig mer kontroll över ditt spel.{*B*}{*B*} + + {*T2*}Spelare mot spelare{*ETW*}{*B*} + När det här alternativet är valt kan spelare skada andra spelare. Detta påverkar bara överlevnadsläget.{*B*}{*B*} + + {*T2*}Lita på spelare{*ETW*}{*B*} + När det här alternativet är avstängt begränsas de handlingar som anslutande spelare kan utföra. De kan inte bryta block eller använda föremål, placera ut block, använda dörrar, kopplare eller behållare och de kan inte heller anfalla spelare eller djur. Du kan ändra dessa inställningar för specifika spelare med hjälp av menyn i spelet.{*B*}{*B*} + + {*T2*}Eld sprider sig{*ETW*}{*B*} + När det här alternativet är valt kan eld sprida sig till närliggande brännbara block. Det här alternativet kan även ändras med hjälp av menyn i spelet.{*B*}{*B*} + + {*T2*}Dynamit exploderar{*ETW*}{*B*} + När det här alternativet är aktiverat exploderar dynamit när den aktiveras. Det här alternativet kan även ändras med hjälp av menyn i spelet.{*B*}{*B*} + + {*T2*}Värdprivilegier{*ETW*}{*B*} + När det här alternativet är aktiverat kan värden använda spelets meny för att ge sig själv förmågan att flyga, stänga av sin utmattning och göra sig osynlig. {*DISABLES_ACHIEVEMENTS*}{*B*}{*B*} + +{*T2*}Dagsljuscykel{*ETW*}{*B*} +När det här alternativet är avstängt ändras inte tiden på dygnet.{*B*}{*B*} + +{*T2*}Behåll inventarie{*ETW*}{*B*} +När det här alternativet är aktiverat får spelare behålla allt i sin inventarie när de dör.{*B*}{*B*} + +{*T2*}Varelsespawn{*ETW*}{*B*} +När det här alternativet är avstängt spawnar inga varelser naturligt.{*B*}{*B*} + +{*T2*}Destruktiva fiender{*ETW*}{*B*} +När det här alternativet är avstängt kan varken monster eller djur förändra block, eller plocka upp föremål. Exempelvis förstörs inga block av exploderande smygare, och får kan inte äta gräs.{*B*}{*B*} + +{*T2*}Föremål från varelser{*ETW*}{*B*} +När det här alternativet är avstängt kommer varken monster eller djur att släppa föremål (exempelvis tappar inte smygare något krut).{*B*}{*B*} + +{*T2*}Föremål från block{*ETW*}{*B*} +När det här alternativet är avstängt släpps inga föremål när block förstörs (exempelvis släpper inte stenblock någon kullersten).{*B*}{*B*} + +{*T2*}Naturlig återställning{*ETW*}{*B*} +När det här alternativet är avstängt kommer inte spelare att återställa hälsa automatiskt.{*B*}{*B*} + +{*T1*}Alternativ för generering av världar{*ETW*}{*B*} +Det finns några extraalternativ att välja mellan när nya världar skapas.{*B*}{*B*} + + {*T2*}Generera strukturer{*ETW*}{*B*} + När det här alternativet är valt kommer byar och fästningar att genereras i världen.{*B*}{*B*} + + {*T2*}Platt värld{*ETW*}{*B*} + När det här alternativet är valt kommer den vanliga världen och Nedervärlden att vara helt platta.{*B*}{*B*} + + {*T2*}Bonuskista{*ETW*}{*B*} + När det här alternativet är valt kommer en kista med användbara föremål att skapas nära spelarens spawnplats.{*B*}{*B*} + +{*T2*}Återställ Nedervärlden{*ETW*}{*B*} + När det här alternativet är valt byggs Nedervärlden upp på nytt. Det är användbart om du har en gammal sparfil utan fästningar i Nedervärlden.{*B*}{*B*} + + {*T1*}Alternativ i spelet{*ETW*}{*B*} +Tryck på {*BACK_BUTTON*} medan du spelar för att öppna en meny med ett antal olika alternativ.{*B*}{*B*} + + {*T2*}Värdalternativ{*ETW*}{*B*} + Värdspelaren, och alla spelare som har angetts som moderatorer, har tillgäng till menyn "Värdalternativ". Med hjälp av den här menyn kan de kontrollera om eld kan sprida sig eller om dynamit kan explodera.{*B*}{*B*} + +{*T1*}Spelaralternativ{*ETW*}{*B*} +Välj en spelares namn och tryck på{*CONTROLLER_VK_A*} för att öppna menyn för spelarprivilegier. Där kan du välja mellan följande alternativ:{*B*}{*B*} + + {*T2*}Kan bygga och bryta block{*ETW*}{*B*} + Det här alternativet är bara tillgängligt när "Lita på spelare" är avstängt. Det låter spelare interagera med världen som vanligt. Om det stängs av kan inte spelare placera eller förstöra block, de kan inte heller interagera med många av föremålen och blocken.{*B*}{*B*} + + {*T2*}Kan använda dörrar och kopplare{*ETW*}{*B*} + Det här alternativet är bara tillgängligt när "Lita på spelare" är avstängt. Om det stängs av kan inte spelare använda dörrar eller kopplare.{*B*}{*B*} + + {*T2*}Kan öppna behållare{*ETW*}{*B*} + Det här alternativet är bara tillgängligt när "Lita på spelare" är avstängt. Om det stängs av kan inte spelare öppna behållare, exempelvis kistor.{*B*}{*B*} + + {*T2*}Kan anfalla spelare{*ETW*}{*B*} + Det här alternativet är bara tillgängligt när "Lita på spelare" är avstängt. Om det stängs av kan inte spelaren skada andra spelare.{*B*}{*B*} + + {*T2*}Kan anfalla djur{*ETW*}{*B*} + Det här alternativet är bara tillgängligt när "Lita på spelare" är avstängt. Om det stängs av kan inte spelaren skada djur.{*B*}{*B*} + + {*T2*}Moderator{*ETW*}{*B*} + När det här alternativet är aktiverat kan spelaren ge privilegier till andra spelare (förutom till värden) om "Lita på spelare" är avstängt. De kan även sparka spelare och kontrollera om eld kan sprida sig eller om dynamit kan explodera.{*B*}{*B*} + + {*T2*}Sparka spelare{*ETW*}{*B*} + {*KICK_PLAYER_DESCRIPTION*}{*B*}{*B*} + +{*T1*}Alternativ för värdspelare{*ETW*}{*B*} +Om "Värdprivilegier" är aktiverat kan värdspelaren modifiera vissa privilegier. Välj en spelares namn och tryck på{*CONTROLLER_VK_A*} för att öppna menyn för spelarprivilegier. Där kan du välja mellan följande alternativ:{*B*}{*B*} + + {*T2*}Kan flyga{*ETW*}{*B*} + När det här alternativet är aktiverat kan spelaren flyga. Det fyller ingen funktion utanför överlevnadsläget, eftersom alla spelare kan flyga i det kreativa läget.{*B*}{*B*} + + {*T2*}Stäng av utmattning{*ETW*}{*B*} + Det här alternativet påverkar bara överlevnadsläget. När det är aktiverat har fysisk aktivitet (att gå, springa, hoppa o.s.v.) ingen effekt på hungermätaren. Om spelaren skadar sig kommer dock hungermätaren att långsamt tömmas medan spelaren återhämtar sin hälsa.{*B*}{*B*} + + {*T2*}Osynlig{*ETW*}{*B*} + När det här alternativet är aktiverat är spelaren osynlig för andra spelare och kan inte dö.{*B*}{*B*} + + {*T2*}Kan teleportera{*ETW*}{*B*} + Det här alternativet låter spelaren flytta andra spelare eller sig själva till andra spelare i världen. + + + + Nästa sida + + + {*T3*}INSTRUKTIONER: BOSKAP{*ETW*}{*B*}{*B*} +Om du vill behålla dina djur på en och samma plats måste du bygga ett inhägnat område som är mindre än 20 x 20 block och föra in dina djur där. Det garanterar att de är kvar när du återvänder till dem. + + + {*T3*}INSTRUKTIONER: AVLA DJUR{*ETW*}{*B*}{*B*} +Djuren i Minecraft kan föröka sig och föda bebisversioner av sig själva!{*B*} +För att avla djuren måste du mata dem med rätt mat för att göra dem brunstiga.{*B*} +Ge vete till en ko, svampko eller till ett får, morötter till en gris; veteax eller nedervårtor till en höna; eller valfritt kött till en varg, så börjar de leta efter ett annat djur av samma art som också är brunstigt.{*B*} +När två brunstiga djur av samma art träffas börjar de pussas i några sekunder, sedan dyker en unge upp. Ungen följer efter sina föräldrar till dess att den är fullvuxen.{*B*} +Efter att ha varit brunstigt kan ett djur inte bli brunstigt igen på ungefär fem minuter.{*B*} +Det finns en gräns på hur många djur som kan finnas i världen, så det kan hända att djuren inte parar sig om du har väldigt många. + + + {*T3*}INSTRUKTIONER: NEDERPORTALER{*ETW*}{*B*}{*B*} +En Nederportal låter spelaren resa mellan den vanliga världen och Nedervärlden. Nedervärlden kan användas för att korsa långa sträckor i den vanliga världen - att färdas ett block i Nedervärlden är som att färdas tre block i den vanliga, så när du bygger en portal i Nedervärlden och färdas genom den, kommer du att befinna dig tre gånger längre bort ifrån platsen där du klev in i den första portalen.{*B*}{*B*} +Det krävs minst tio obsidianblock för att bygga portalen, och portalen måste vara fem block hög, fyra block bred och ett block djup. När ramen till portalen har byggts måste öppningen antändas för att portalen ska aktiveras. Det kan göras med tändstålet eller med en eldladdning.{*B*}{*B*} +Exempel på hur man bygger en portal visas i bilden till höger. + + + + {*T3*}INSTRUKTIONER: KISTOR{*ETW*}{*B*}{*B*} +När du har tillverkat en kista kan du placera ut den i världen och använda den med{*CONTROLLER_ACTION_USE*} för att lagra saker från ditt inventarie.{*B*}{*B*} +Använd markören för att flytta saker mellan ditt inventarie och kistan.{*B*}{*B*} +Saker i kistan lagras till dess att du behöver dem i ditt inventarie igen. + + + Besökte du Minecon? + + + Ingen på Mojang har sett junkboys ansikte. + + + 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 + + + Byteshandel + + + Städ + + + 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. +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. + + + + {*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 + + + Nyheter + + + {*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*} + + + Dela skärmbilder + + + Kistor + + + 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 baka tårta och som en ingrediens vid bryggning. + + + Används för att skicka en elektrisk laddning genom att slås av eller på. Förblir av- eller påslagen till dess att den används igen. + + + 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 leda gruvvagnar. + + + När strömmen är på accelererar gruvvagnar som åker på rälsen. När strömmen är av stannar gruvvagnar på den. + + + 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 skapa ljusblå ull. + + + Används för att skapa cyanfärgad ull. + + + 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 lyktor som lyser starkare än facklor. Smälter snö/is och kan användas under vatten. + + + Används för att skapa böcker och kartor. + + + Kan användas för att skapa bokhyllor, eller förtrollas för att skapa förtrollade böcker. + + + 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 orangefärgad ull. + + + 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 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. + + + Används för att skapa grön 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 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. + + + Låter dig skjuta pilar för att anfalla på avstånd. + + + 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 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 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. + + + 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. + + + Ger bäraren 6 i skydd när den bärs. + + + Järndörrar kan öppnas och stängas med hjälp av rödsten, knappar och kopplare. + + + Ger bäraren 1 i skydd när den bärs. + + + Ger bäraren 3 i skydd när den bärs. + + + 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. + + + Ger bäraren 2 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 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. + + + Används för kompakta trappor. + + + 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. + + + 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 och transportera lava. + + + 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. + + + 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. + + + 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. + + + 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 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 för att tillverka facklor, pilar, skyltar, stegar, staket och som handtag till verktyg och vapen. + + + 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. + + + 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. + + + Järnyxa + + + Rödstensbelysning + + + Djungelträtrappor + + + Björktrappor + + + Nuvarande kontrollinställningar + + + Dödskalle + + + Kakao + + + Grantrappor + + + Drakägg + + + Endersten + + + Ram för portal till världens ände + + + Sandstenstrappor + + + Ormbunke + + + Buske + + + Layout + + + Tillverkning + + + Använd + + + Handling + + + Smyg/flyg gned + + + Smyg + + + Släpp + + + Byt föremål i handen + + + Pausa + + + Titta + + + Gå/spring + + + Inventarie + + + Hoppa/flyg upp + + + Hoppa + + + Portal till världens ände + + + Pumpastjälk + + + Melon + + + Glasskiva + + + Grind + + + Rankor + + + Melonstjälk + + + Järnstänger + + + Sprucken mursten + + + Mossig mursten + + + 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 + + + Gran + + + Björk + + + Granträ + + + Björkträ + + + Djungelträ + + + Ull + + + Rosa ull + + + Grå ull + + + Ljusgrå ull + + + Ljusblå ull + + + Gul ull + + + Limegrön ull + + + Cyanfärgad ull + + + Grön ull + + + Röd ull + + + Svart ull + + + Lila ull + + + Blå ull + + + Brun ull + + + Fackla (kol) + + + Glödsten + + + Själsand + + + Nedersten + + + Lasurstensblock + + + Lasurstensmalm + + + Portal + + + Pumpalykta + + + Sockerrör + + + Lera + + + Kaktus + + + Pumpa + + + Staket + + + Jukebox + + + Ett kompakt sätt att förvara lasursten. + + + Fallucka + + + Låst kista + + + Diod + + + Klibbig kolv + + + Kolv + + + Ull (vilken färg som helst) + + + Död buske + + + Tårta + + + Musikblock + + + Automat + + + Högt gräs + + + Nät + + + Säng + + + Is + + + Arbetsbänk + + + Ett kompakt sätt att förvara diamanter. + + + Diamantblock + + + Ugn + + + Åkermark + + + Grödor + + + Diamantmalm + + + Monsterspawnare + + + Eld + + + Fackla (träkol) + + + Rödstensstoft + + + Kista + + + Ektrappor + + + Skylt + + + Rödstensmalm + + + Järndörr + + + Tryckplatta + + + Snö + + + Knapp + + + Rödstensfackla + + + Spak + + + Räls + + + Stege + + + Trädörr + + + Stentrappor + + + Sensorräls + + + 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. + + + Fiskespö + + + Klocka + + + Glödstensstoft + + + Gruvvagn med ugn + + + Ägg + + + 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" + + + + 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. + + + + + {*B*} + Tryck på{*CONTROLLER_VK_A*} för att fortsätta med övningen.{*B*} + Tryck på{*CONTROLLER_VK_B*} om du tycker att du är redo att fortsätta på egen hand. + + + + + 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 markören för att flytta det här föremålet till en annan plats i inventariet. Tryck på{*CONTROLLER_VK_A*} för att lägga det där. + När markören bär på flera föremål trycker du på{*CONTROLLER_VK_A*} för att lägga undan alla, eller på{*CONTROLLER_VK_X*} för att bara lägga undan ett av dem. + + + + + 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_ACTION_MENU_PAGEDOWN*}. + + + + + Det här är tillverkningsgränssnittet. Det låter dig kombinera dina resurser för att tillverka nya saker. + + + + + Tryck på{*CONTROLLER_VK_B*} nu för att lämna det kreativa lägets inventarie. + + + + + 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. + + + + {*B*} + Tryck på{*CONTROLLER_VK_A*} för att fortsätta.{*B*} + Tryck på{*CONTROLLER_VK_B*} om du redan vet hur man tillverkar saker. + + + + + 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. + + + + {*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. + + + + + 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. + + + + + Tryck på{*CONTROLLER_VK_B*} nu för att stänga inventariet. + + + + + 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. + + + + + 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. + + + + + 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. + + + + Vatten + + + Glasflaska + + + Vattenflaska + + + Spindelöga + + + Guldklimp + + + Nedervårta + + + {*prefix*}Brygd{*postfix*}{*splash*} + + + Fermenterat spindelöga + + + Kittel + + + Enderöga + + + Glimmande melon + + + Brännpulver + + + Magmasalva + + + Brygdställ + + + Spöktår + + + Pumpafrön + + + Melonfrön + + + Rå kyckling + + + Musikskiva - "11" + + + Musikskiva - "where are we now" + + + Sax + + + Tillagad kyckling + + + Enderpärla + + + Melonskiva + + + Brännstav + + + Rått nötkött + + + Biffstek + + + Ruttet kött + + + Förtrollningsflaska + + + Ekträplankor + + + Granträplankor + + + Björkträplankor + + + Gräsblock + + + Jord + + + Kullersten + + + Djungelträplankor + + + Björkskott + + + Djungelträdskott + + + Berggrund + + + Skott + + + Ekskott + + + Granskott + + + Sten + + + Uppvisningsbox + + + Spawna {*CREATURE*} + + + Nedermursten + + + Eldladdning + + + Eldladdning (träkol) + + + Eldladdning (kol) + + + Dödskalle + + + Huvud + + + Huvud från %s + + + Smygarhuvud + + + Skelettskalle + + + Witherskelettskalle + + + Zombiehuvud + + + Ett kompakt sätt att förvara kol. Kan användas som bränsle i en ugn. + + + Gift + + + Hunger + + + för slöhet + + + för snabbhet + + + Osynlighet + + + Vattenandning + + + Mörkersyn + + + Blindhet + + + som skadar + + + som läker + + + för illamående + + + 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 högre hopp + + + Wither + + + Hälsobonus + + + Absorbering + + + + + + II + + + 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) + + + Banal + + + Ointressant + + + Ståtlig + + + Hjärtlig + + + Charmig + + + Elegant + + + Utsökt + + + Bubblig + + + 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 + + + Heligt + + + Skärpa + + + Åsamkar skada över tiden för påverkade spelare, djur och monster. + + + Attackskada + + + Knuff + + + Leddjurens bane + + + Snabbhet + + + Zombieförstärkningar + + + Hästars hoppstyrka + + + Vid användning: + + + Knuffmotstånd + + + Varelserevir + + + Maximal hälsa + + + Silkesvante + + + Effektivitet + + + Vattuman + + + Rikedom + + + Plundring + + + Oförstörbar + + + Eldskydd + + + Skydd + + + Eldkraft + + + Fallskydd + + + Andning + + + Projektilskydd + + + Explosionsskydd + + + IV + + + V + + + VI + + + Slag + + + VII + + + III + + + Flamma + + + Kraft + + + Oändlig + + + II + + + I + + + Aktiveras när en varelse vidrör den anslutna snubbeltråden. + + + Aktiverar en ansluten snubbeltrådskrok när en varelse vidrör tråden. + + + Ett kompakt sätt att förvara smaragder. + + + Fungerar som kistor, med skillnaden att saker som placeras i enderkistor blir tillgängliga i alla spelarens enderkistor, oavsett vilken dimension de står i. + + + IX + + + VIII + + + Kan brytas med en järnhacka eller bättre för att få smaragder. + + + 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. + + + 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*}. Du riskerar att bli förgiftad om du äter den. + + + Används för att kontrollera en sadlad gris när du rider på den. + + + Återställer 3{*ICON_SHANK_01*}. Skapad genom att baka en potatis i en ugn. + + + Återställer 3{*ICON_SHANK_01*}. Tillverkas med en morot och guldtackor. + + + Används med städ för att förtrolla vapen, verktyg och rustningsdelar. + + + Tillverkas genom att bryta nederkvartsmalm. Kan bearbetas till kvartsblock. + + + Potatis + + + Bakad potatis + + + Morot + + + Tillverkas av ull. Används som dekoration. + + + Smaragd + + + Blomkruka + + + Pumpapaj + + + Förtrollad bok + + + Giftig potatis + + + Gyllene morot + + + Morot på en pinne + + + Snubbeltrådskrok + + + Snubbeltråd + + + Nederkvarts + + + Smaragdmalm + + + Enderkista + + + Mossig kullerstensvägg + + + Smaragdblock + + + Kullerstensvägg + + + Potatisar + + + Blomkruka + + + Morötter + + + Lite skadat städ + + + Städ + + + Städ + + + Kvartsblock + + + Väldigt skadat städ + + + Nederkvartsmalm + + + Kvartstrappor + + + Mejslat kvartsblock + + + Pelarkvartsblock + + + Röd matta + + + Matta + + + Svart matta + + + Blå matta + + + Grön matta + + + Brun matta + + + Lila matta + + + Cyanfärgad matta + + + Ljusgrå matta + + + Grå matta + + + Limegrön matta + + + Rosa matta + + + Ljusblå matta + + + Gul matta + + + Magentafärgad matta + + + Orange matta + + + Vit matta + + + Mejslad 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. + + + {*PLAYER*} teleporterade dig till sin position + + + Teleporterade {*PLAYER*} till {*DESTINATION*} + + + Törn + + + {*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ör dyr! + + + Förtrollningskostnad: %d + + + Du har: + + + Döp om + + + {*VILLAGER_TYPE*} erbjuder %s + + + Krävs för byteshandel: + + + Byteshandla + + + 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. + + + + + {*B*} + Tryck på{*CONTROLLER_VK_A*} för att lära dig mer om städets gränssnitt.{*B*} + Tryck på{*CONTROLLER_VK_B*} om du redan vet hur man använder städets gränssnitt. + + + + + Det går även att placera ett identiskt föremål på den andra platsen för att kombinera de två föremålen. + + + + + 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. + + + + + 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. + + + + + 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. + + + + + Det går att döpa om föremålet genom att redigera namnet som visas i textrutan. + + + + + {*B*} + Tryck på{*CONTROLLER_VK_A*} för att lära dig mer om städet.{*B*} + Tryck på{*CONTROLLER_VK_B*} om du redan vet hur man använder städet. + + + + + I det här området finns ett städ och en kista med verktyg och vapen att bearbeta. + + + + + 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. + + + + + Med hjälp av ett städ kan vapen och verktyg repareras, döpas om eller förtrollas med förtrollade böcker. + + + + + Sorten av arbete, föremålets värde, antalet förtrollningar och mängden tidigare arbete påverkar reparationskostnaden. + + + + + Det kostar erfarenhetsnivåer att använda städet, och varje gång det används finns risken att det skadas. + + + + + Kistan i det här området innehåller skadade hackor, råmaterial, förtrollningsflaskor och förtrollade böcker att experimentera med. + + + + + 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. + + + + + {*B*} + Tryck på{*CONTROLLER_VK_A*} för att lära dig mer om gränssnittet för byteshandel.{*B*} + Tryck på{*CONTROLLER_VK_B*} om du redan vet hur man använder gränssnittet för byteshandel. + + + + + Det här är gränssnittet för byteshandel. Det använder du för att byteshandla med bybor. + + + + + Byten markeras i rött och är otillgängliga om du inte har sakerna som krävs. + + + + + Alla byten som en bybo är villig att göra visas högst upp. + + + + + De två rutorna på vänster sida visar hur många saker som krävs för att utföra bytet. + + + + + 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. + + + + + {*B*} + Tryck på{*CONTROLLER_VK_A*} för att lära dig mer om byteshandel.{*B*} + Tryck på{*CONTROLLER_VK_B*} om du redan vet hur man byteshandlar. + + + + + Genom att utföra diverse byten kommer bybons möjliga byten att uppdateras slumpmässigt. + + + + + Bybornas yrke avgör vilka saker de vill byteshandla. + + + + + Om du byter till dig samma sak ofta kan den saken tas bort temporärt, men bybon kommer alltid att erbjuda minst en sak som du kan byta till dig. + + + + + Ta lite papper från kistan och se vad du kan byta till dig från bybon här. + + + + + I det här området finns det två enderkistor. + + + + + {*B*} + Tryck på{*CONTROLLER_VK_A*} för att lära dig mer om enderkistor.{*B*} + Tryck på{*CONTROLLER_VK_B*} om du redan vet hur man använder enderkistor. + + + + + Alla enderkistor i en värld är kopplade till varandra, även mellan olika dimensioner. Saker som placeras i en enderkista är tillgängliga i alla andra enderkistor. + + + + + Innehållet i enderkistorna skiljer sig dock för alla spelare. + + + + + Det här låter spelare förvara saker i valfri enderkista, sedan kan de hämta sakerna ur vilken annan enderkista som helst. Pröva det nu genom att placera saker i någon av enderkistorna. + + + + Återställer 2{*ICON_SHANK_01*}, regenererar hälsa i 30 sekunder och ger både eld- och skademotstånd i 5 minuter. Tillverkas med ett äpple och flera guldblock. + + + Kan teleportera + + + Teleportera + + + Teleportera till spelare + + + Teleportera till mig + + + Kan stänga av utmattning + + + Kan bli osynlig + + + Nu kan du aktivera osynlighet + + + Du kan inte längre aktivera osynlighet + + + Nu kan du aktivera flygning + + + Du kan inte längre aktivera flygning + + + Nu kan du stänga av utmattning + + + Du kan inte längre stänga av utmattning + + + Nu kan du teleportera + + + Du kan inte längre teleportera + + + {*T3*}INSTRUKTIONER: STÄD{*ETW*}{*B*}{*B*} +Erfarenhetsnivåer kan användas för att reparera, förtrolla och döpa om föremål på ett städ.{*B*} +Alla saker kan döpas om, men det är bara föremål med hållbarhet som kan repareras eller förtrollas med förtrollade böcker.{*B*} +Ett föremål kan repareras genom att placera det på en av platserna till vänster. För att reparationen ska lyckas ska den andra platsen fyllas med föremålets råmaterial, exempelvis en järntacka till ett järnsvärd, eller med ett föremål av samma slag som det kan kombineras med.{*B*} +Att kombinera två föremål är mer effektivt när det görs med städet, och om något av föremålen är förtrollat kan slutprodukten bära med sig någon av dessa förtrollningar.{*B*} +Förtrollade böcker kan kombineras med föremål på städet för att föra över förtrollningen (förutsatt att förtrollningen är lämplig för föremålet). Förtrollade böcker kan hittas i kistor i grottor, eller så kan de tillverkas genom att förtrolla vanliga böcker med ett förtrollningsbord.{*B*} +Varje gång städet används riskerar det att skadas. När det har fått utstå tillräckligt mycket stryk går det sönder.{*B*} + + + {*T3*}INSTRUKTIONER: BYTESHANDEL{*ETW*}{*B*}{*B*} +Det går att byteshandla med bybor. Alla bybor har ett yrke - de kan vara bönder, slaktare, smeder, bibliotekarier eller präster, och det här påverkar vilka sorters föremål de har att byteshandla med.{*B*} +I menyn för byteshandel visas vilka föremål en bybo har att erbjuda. Den här listan kan uppdateras när en spelare byteshandlar med bybon, och vissa byten kan blockeras temporärt om de utnyttjas för ofta.{*B*} +Byten innefattar ofta att man köper eller säljer ett antal föremål för smaragder.{*B*} +Om du inte har vad som krävs för ett byte visas föremålet i rött.{*B*} + + + + {*T3*}INSTRUKTIONER: ENDERKISTOR {*ETW*}{*B*}{*B*} +Alla enderkistor i en värld är kopplade till varandra. Saker som placeras i en enderkista är tillgängliga i alla andra. Enderkistornas innehåll skiljer sig dock mellan alla spelare. Det här låter spelare förvara saker i valfri enderkista, sedan kan de hämta sakerna ur vilken annan enderkista som helst. + + + + Bonde + + + Bibliotekarie + + + Präst + + + Smed + + + Slaktare + + + Bybor finns i byar och kan sälja saker till spelaren som har med bybons yrke att göra. + + + Stor kista + + + + Det går även att tillverka förtrollade böcker med ett förtrollningsbord. Använd dessa med ett städ för att förtrolla din utrustning. + + + + + Snubbeltrådskrokar ger konstant ström till en krets så länge någonting aktiverar tråden som kopplar samman dem. + + + + + När en varg har tämjts får den ett halsband. Färgen på halsbandet kan färgas om. + + + + Det går att odla morötter och potatis genom att plantera dem. De går att skörda när grönsaken är synlig ovanför marken. + + + + Utöver det kan grisar sadlas och ridas av spelare. De kontrolleras genom att fresta dem med en morot på en pinne. + + + + + Du kan långsamt styra gruvvagnen med hjälp av {*CONTROLLER_ACTION_MOVE*}. Det här kommer till nytta om du behöver få ut gruvvagnen på en rödstensräls. + + + + Du kan inte ansluta till det här spelet eftersom att delad skärm bara stöds i högdefinitionsläge. Logga ut alla andra spelare om du vill ansluta. + + + Läk + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/sv-SV/stringsLeaderboards.xml b/Minecraft.Client/PSVitaMedia/loc/sv-SV/stringsLeaderboards.xml new file mode 100644 index 00000000..68bf2657 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/sv-SV/stringsLeaderboards.xml @@ -0,0 +1,48 @@ + + + + Fiender dödade - lätt + + + Fiender dödade - normalt + + + Fiender dödade - svårt + + + Block brutna - fridfullt + + + Block brutna - lätt + + + Block brutna - normalt + + + Block brutna - svårt + + + Odling - fridfullt + + + Odling - lätt + + + Odling - normalt + + + Odling - svårt + + + Färddistans - fridfullt + + + Färddistans - lätt + + + Färddistans - normalt + + + Färddistans - svårt + + \ 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 new file mode 100644 index 00000000..2521dca2 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/sv-SV/stringsPlatformSpecific.xml @@ -0,0 +1,245 @@ + + + + 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. + + + 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. + + + PlayStation®Vita-system + + + 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 + + + Byt nätverksläge + + + 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*} +Det kreativa lägets gränssnitt låter dig lägga vad du vill i spelarens inventarie utan att först behöva bryta eller tillverka saken. +Sakerna i spelarens inventarie tar inte slut när de placeras eller används i världen. Det låter spelaren fokusera på att bygga i stället för att behöva samla resurser.{*B*} +Om du skapar, laddar eller sparar en värld i det kreativa läget kommer den världen inte att ha något stöd för trophies eller rankningslistor, inte ens om den senare laddas i överlevnadsläget.{*B*} +Tryck på{*CONTROLLER_ACTION_JUMP*} två gånger för att flyga i det kreativa läget. Gör om det för att sluta flyga. Flyg snabbare genom att snabbt trycka framåt två gånger med{*CONTROLLER_ACTION_MOVE*} medan du flyger. +När du flyger kan du hålla in {*CONTROLLER_ACTION_JUMP*} för att flyga uppåt och{*CONTROLLER_ACTION_SNEAK*} för att flyga nedåt. Det går även att använda{*CONTROLLER_ACTION_DPAD_UP*} för att förflytta dig uppåt, {*CONTROLLER_ACTION_DPAD_DOWN*} för att förflytta dig nedåt, +{*CONTROLLER_ACTION_DPAD_LEFT*} för att förflytta dig åt vänster och{*CONTROLLER_ACTION_DPAD_RIGHT*} för att förflytta dig åt höger. + + + 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" + + + 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? + + + "ANVÄNDS INTE" + + + 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. + + + 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". +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? + + + 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/sv-SV/stringsRichPresence.xml b/Minecraft.Client/PSVitaMedia/loc/sv-SV/stringsRichPresence.xml new file mode 100644 index 00000000..49de3a62 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/sv-SV/stringsRichPresence.xml @@ -0,0 +1,66 @@ + + + + {GAME_STATE} + + + Passiv + + + I menyerna + + + Spelar med flera spelare - {GAME_STATE} + + + Flera spelare offline - {GAME_STATE} + + + Spelar ensam - {GAME_STATE} + + + Ensam offline - {GAME_STATE} + + + Njuter av utsikten! + + + Rider på en gris + + + Åker i en gruvvagn + + + Sitter i en båt + + + Fiskar + + + Tillverkar + + + Smider + + + Mot Nedervärlden + + + Lyssnar på en skiva + + + Tittar på en karta + + + Förtrollar + + + Brygger en brygd + + + Arbetar med städet + + + Träffar grannarna + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/tr-TR/4J_stringsGeneric.xml b/Minecraft.Client/PSVitaMedia/loc/tr-TR/4J_stringsGeneric.xml new file mode 100644 index 00000000..8b4f7992 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/tr-TR/4J_stringsGeneric.xml @@ -0,0 +1,87 @@ + + + + Tamam + + + Geri + + + İptal + + + Evet + + + Hayır + + + Bozuk Kayıt + + + Kayıt verin bozulmuş gibi. Yeni bir kayıt oluşturup bozuk olanın üstüne yazmak istiyor musun? + + + Boş Alan Yok + + + Tekrar seçiliyor + + + Kaydetmeden oyna + + + Yeni kayıt oluştur + + + Kaydın üstüne yaz? + + + Hayır - üstüne yazma + + + Üstüne yaz ve kaydet + + + Kayıt başarısız + + + Kaydetmeden devam et + + + Yükleme başarısız + + + Kayda ad koy + + + Oyun kaydına bir ad ver + + + Oyundan çıkmak istediğinden emin misin? + + + Oturup kapatıldı + + + Oynamaya devam et + + + Çevrimdışı oynamaya devam et + + + Misafir Oyuncu + + + Misafir oyuncu "PSN" hesabına giremez. + + + Kaydediliyor... + + + İçerik kaydediliyor. Lütfen sistemi kapatma. + + + Tam Oyunu Aç + + \ 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 new file mode 100644 index 00000000..baec4439 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/tr-TR/4J_stringsPlatformSpecific.xml @@ -0,0 +1,48 @@ + + + + Ayarları Sony Entertainment Network hesabına kaydetme başarısız oldu. + + + Sony Entertainment Network hesabı sorunu + + + 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 new file mode 100644 index 00000000..97177bfe --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/tr-TR/AdditionalStrings.xml @@ -0,0 +1,96 @@ + + + + Tüm Uyarlama Dünyaları Göster + + + Gizle + + + Minecraft: PlayStation®3 Edition + + + Seçenekler + + + Kayıt Önbelleği + + + Bir ağ hatası meydana geldi. + + + Ağ Hatası + + + Bir ağ hatası meydana geldi. Ana Menüye dönülüyor. + + + Sohbet kısıtlamalarından dolayı Sony Entertainment Network hesabınızda çevrimiçi hizmet devre dışı bırakıldı. + + + Ebeveyn kontrol ayarlarından dolayı Sony Entertainment Network hesabınızda çevrimiçi hizmet devre dışı bırakıldı. + + + Çevrimiçi Hizmet + + + "PSN" üzerinden çıkış yaptınız. "PSN" üzerinde tekrar çevrimiçi olana dek bu oyunun çevrimiçi özelliklerini kullanamayacaksınız. + + + "PSN" üzerinden çıkış yaptınız. "PSN" üzerinde tekrar çevrimiçi olana dek bu oyunun çevrimiçi özelliklerini kullanamayacaksınız. Ana Menüye dönülüyor. + + + %d oyuncusu için kullanıcı seçin (veya misafir olarak oynamak için iptal edin) + + + Ücretsiz + + + 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. + + + Kupalar Devre Dışı + + + Bu oyun kaydı başka bir kullanıcıya ait olduğu için kupalar devre dışı bırakıldı. + + + Kritik hata: Kupalar başlatılamadı. Lütfen oyundan çıkın. + + + Oyun Davetleri + + + Bozulmuş Dosya + + + Kontrol Cihazı Çıkartıldı + + + Kontrol cihazınız çıkartıldı. Lütfen kontrol cihazını bağlayın. + + + 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. + + + Davetiye + + + Lütfen buyurun ve biraz Minecraft: PlayStation®Vita Edition oynayın! + + \ 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 new file mode 100644 index 00000000..de762a9f --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/tr-TR/EULA.xml @@ -0,0 +1,99 @@ + + + + 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. + Koşullara dönecek olursak: + TEK ANA KURAL + Ana kural, bizim yaptığımız hiçbir şeyi dağıtmamanız gerektiğidir. "Yaptığımız şeyi dağıtmak" derken, "Minecraft kopyalarını dağıtmak, ticari bir şekilde kullanmak, para kazanmaya çalışmak, diğer insanlara adil olmayan bir şekilde Minecraft erişimi sağlamak" demek istiyoruz. Bu yüzden ana kuralımıza göre (biz Marka ve Mülk Kullanım Yönetmeliği'nde olduğu gibi aksini kabul etmediğimiz sürece ) şunları yapmamalısınız: + • Minecraft kopyalarını başkalarına dağıtmak; + • yaptığımız herhangi bir şeyin ticari kullanımını yapmak; + • yaptığımız şeylerden para kazanmaya çalışmak; ve + • adil olmayan ve mantıksız bir şekilde diğer insanların yaptığımız şeye erişebilmelerini sağlamak. + …ve artık kendimizi iyice belli ettiğimize göre, kurallarımız Minecraft için istemci ve sunucu yazılımlarını kapsamı içine alır ancak bunlarla sınırlı değildir. Oyunun modifiye edilmiş versiyonlarını, herhangi bir bölümünü ve yaptığımız diğer her şeyi de kapsamaktadır. + Bunun dışında yaptığınız işlerden dolayı oldukça rahatız, aslına bakarsanız farklı ve güzel şeyler yapmanızı teşvik ediyoruz (aşağıya bakın). Ancak yapmanızı istemediğimiz şeyleri yapmayın, yeter. + MINECRAFT'I KULLANMAK + • Minecraft'ı satın aldığınızdan dolayı kendiniz PlayStation®Vita sisteminizde oyunu kullanabilirsiniz. + • Aşağıda, size bazı durumlar için sınırlı haklar tanımaktayız ancak sınırlarımızı belirlememiz gerekiyor. Aksi halde insanlar bu hakları suistimal edebilirler. Eğer bizim ürettiğimiz herhangi bir şeye dair bir şeyler yapmak istiyorsanız sizi destekliyoruz, ancak yaptığınız şeyin resmî olarak nitelendirilmediğinden ve burada ve yukarıda belirlediğimiz tüm Koşullara uyduğundan emin olun ve asla bizim ürettiğimiz bir şeyin ticari kullanımını yapmayın. + • Minecraft'ı kullanmanız ve oynamanız için verdiğimiz izin, eğer bu Koşulları ihlâl ederseniz geri alınacaktır. + • Minecraft'ı satın aldığınızda, bu Koşullarda da belirtildiği üzere size Minecraft'ı kendi PlayStation®Vita sisteminize yüklemeniz ve bu PlayStation®Vita sisteminde oynamanız için izin veriyoruz. Bu izin size özeldir, bu yüzden Minecraft'ı (veya herhangi bir bölümünü) başka hiç kimseye (bizim tarafımızdan izin verilmediği sürece) dağıtamazsınız. + • Minecraft'a ait ekran görüntüleri ve videolar ile makul ölçülerde istediğinizi yapmakta serbestsiniz. "Makul ölçülerde" diyerek, haklarımızı ihlâl edecek veya adil olmayacak şekilde ticari kullanımlarınızı yasaklıyoruz. Ayrıca, sanat kaynaklarını çalıp etrafta dağıtmayın, bu hiç hoş değil. + • Özetle, en basit kural, bizim ürettiğimiz hiçbir şeyi, biz marka yönetmeliğimizde veya kullanım koşullarında izin vermediğimiz sürece ticari amaçlarla kullanmamanız gerektiğidir. Bir de, eğer yasalar "adil kullanım" veya "dürüst iş yapma" ilkelerinde olduğu gibi size bir izin tanırsa, bu da kabulümüzdür. Tabii ki yasaların izin verdiği ölçüde. + MINECRAFT SAHİPLİĞİ VE DİĞER NOKTALAR + • Size Minecraft'ı oynama izni veriyor olsak da, oyunun sahibi biziz. Aynı zamanda markalarımız ve bizim yazılımımız, dokularımız, varlıklarımız, araçlarımız, altyapı ve bir sürü akıllıca (veya olmayan) koyduğumuz Minecraft'ta yer alan her türlü içeriğin de sahibi biziz. Bunlarla ilgili tüm haklarımız yerinde ve saklıdır ancak şu Koşullara tabi olarak onları kullanabilirsiniz. + • Bu, Minecraft'ı kullanarak yaptığınız havalı şeylerin sahibinin biz olduğu anlamına gelmiyor, ancak Minecraft'ın her parçasının bize ait olduğunu ve Mincraft'ın bir ürün ve hizmet, aynı zamanda önceki cümlede sözü geçen diğer şeyler olduğunu kabul etmeniz gerekiyor. Aynı zamanda bunlarla ve Minecraft ile ilişkili isim ve markaların telif hakları ve diğer fikri mülkiyet hakları da ("FMH") bize aittir. + • Elbette Minecraft ile kendiniz bir şeyler üreteceksiniz. Ürettiğiniz orijinal şeyler bize ait değildir ve bizi ilgilendirmeyen hiçbir şey üzerinde hak iddia etmeyiz. Ancak bizim mülklerimiz ve ürünlerimizin (yukarıda sözü geçen) kopyalarının (veya neredeyse kopyaları) sahibi yine biziz. Orijinal ürünler üretirseniz onlar bize ait değildir. Örneğin: + - bir blok – bu bizim; + - içinden lunapark treni geçen Gotik bir Katedral - bu bizim değil. + • Dolayısıyla, Minecraft'ı satın aldığınızda, sadece bu Koşullar dahilinde Minecraft'ı kullanma izni alıyorsunuz. Minecraft ile bağlantılı olan sahip olduğunuz izinler sadece bu Koşullarda sözü geçen izinlerdir. + İÇERİK + • Minecraft üzerinden veya yoluyla bir içeriği kullanılabilir yaparsanız, bize içeriği kullanma, kopyalama, değiştirme ve uyarlama izni vermelisiniz. Bu izin geri alınamaz ve sınırlanamaz bir biçimde olmalıdır. Aynı zamanda başkalarının içeriğinizi kullanmasına ve sizin içeriğinize erişebilen (çok oyunculu oynadığınız kişiler gibi) başkalarının onları kullanmasına izin vermelisiniz. + • İçeriği kullanıma açmadan önce lütfen dikkatle düşünün çünkü halka açık hale gelebilir ve başkaları tarafından hoşunuza gitmeyen şekillerde kullanılabilir. + • Minecraft üzerinden veya yoluyla bir içeriği kullanılabilir yapacaksanız, bunlar başkalarını incitecek veya yasadışı bir şey olmamalı, dürüst ve size ait bir şey olmalıdır. Minecraft yoluyla kullanılabilir yapmamanız gereken şeyler arasında: ırkçı ve homofobik söylemler; kabadayılık taslayan veya trolleyen gönderiler; bizim veya başka bir kişinin ismine leke sürebilecek gönderiler; porno içerikli gönderiler; başka birinin yaptıklarının veya profilinin reklamını yapmak; veya bir yöneticiyi taklit eden ya da insanları kandırıp kötüye kullanmaya çalışan gönderilerdir. + • Minecraft'ta yaptığınız her şey sizin eseriniz olmalıdır. Minecraft'ı kullanarak başkalarının haklarını çiğneyen hiçbir içeriği kullanılabilir yapmamalısınız. Minecraft'ta yayınladığınız içerik nedeniyle içerik hakları ihlal edilen biri bize itiraz eder, tehdit eder veya dava açarsa, sizi sorumlu tutabiliriz ve bu nedenle aldığımız hasarların bedelini bize ödemeniz gerekir. O yüzden sadece kendi eseriniz olan içerikleri yayınlamanız ve başkaları tarafından üretilen eserler ile bunu yapmamış olmanız gerekmektedir. + • Lütfen kiminle oynadığınıza dikkat edin. Başkalarının dediklerinin doğru olup olmadığını veya gerçekten söyledikleri kişi olup olmadıklarını anlamak bizim için de sizin için de zordur. Ayrıca Minecraft yoluyla kişisel bilgilerinizi de paylaşmamalısınız. + Minecraft yoluyla bir içeriği ("Sizin Eserinizi") kullanılabilir yapacaksınız: + - Sony Computer Entertainment ’ın "PSN" Hizmet Koşulları ve Kullanıcı Sözleşmesi olan ToSUA da dahil tüm kurallarına ve PlayStation®Vita sistemi ile "PSN"i kullanabilmek için uymanız gereken tüm kurallara uyun; + - başkalarına hakaret etmeyin; + - yasadışı veya kanunsuz olmayın; + - dürüst olun, başkalarını yanıltmayın, kandırmayın veya kötüye kullanmayın, yahut başkasıymış gibi davranmayın; + - başkasının telif haklarını veya diğer haklarını ihlal etmeyin; + - ırkçı, seksist veya homofobik olmayın; + - kabadayılık taslamayın veya trollük yapmayın; + - bizim veya başkalarının ismini lekelemeyin; + - pornografik içerik kullanmayın; + - reklam yapmayın. + - Başkalarının haklarını çiğneyen hiçbir içeriği Minecraft yoluyla kullanılabilir yapmamalısınız. + • Minecraft yoluyla kullanılabilir hale getirdiğiniz tüm Eserlerinizden siz sorumlusunuz. + • Eserlerinizi kullanılabilir yaparak bu Koşullara tamamen bağlı olduğunuzu ve bize bu Koşullar altında verdiğiniz haklarımızı kullanma hakkı verdiğinizi kabul ediyorsunuz. + • Minecraft'ta yayınlanan bir içerik nedeniyle içerik hakları ihlal edilen biri bize itiraz eder, tehdit eder veya dava açarsa, içerik kaldırılabilir, siz sorumlu tutulabilirsiniz ve bize aldığımız hasarların bedelini ödemeniz gerekebilir. Minecraft'ın belirli kısımlarına olan erişiminiz kaldırılabilir veya dondurulabilir. + KULLANICI İÇERİĞİ + Bu bölüm hem Sizin İçeriğinizi, hem de "Kullanıcı İçeriği" olarak belirtilen ve başkaları tarafından hazırlanmış olan içerikleri bağlayan maddeleri belirtir. Minecraft bir eğlence hizmetidir ve buna bağlı olarak biz (ve lisansörlerimiz (Sony Computer Entertainment gibi) Kullanıcı İçeriğinin incelenmeden, seçilmeden ve değiştirilmeden aktarılması, dağıtılması, depolanması ve elde edilmesinden sorumluyuz. Bunun anlamı şudur: Biz Kullanıcı İçeriği'ni incelemiyoruz, bu yüzden de başka insanların veya sizin neyi dağıttığınızdan haberimiz yok. Sizin ve diğer insanların uyması gereken kurallarımız var ama her şeyi bilmemizin imkanı yok. + Bu yüzden şu hususlara dikkat edin: + •bir Kullanıcı İçeriği'ndeki görüşler bu içeriğin sahiplerinin görüşleridir, tersi belirtilmediği sürece bize veya bize bağlı olan kişilere ait değildir; + • içinde yorum veya görüş bulunan Kullanıcı İçeriği'nden biz sorumlu değiliz (ve bunlar ile ilgili garanti vermiyoruz, sorumluluk kabul etmiyoruz); + • Minecraft'ı kullanarak Kullanıcı İçeriği'ni incelemek gibi bir sorumluluğumuz olmadığını, bütün Kullanıcı İçeriği'nin bizim gerekli olmadığımız ve üzerinde kontrol veya hüküm hakkımızın olmadığını bir süreçten geçerek mevcut hale geldiğini kabul etmiş olursunuz. + ANCAK biz (veya Sony Computer Entertainment gibi lisansörlerimiz) bir Kullanıcı İçeriği'ni kaldırabilir, reddedebilir ve erişimi askıya alabilir ve Kullanıcı İçeriği gönderme veya erişim imkanınızı elinizden alabiliriz; bir kuralı çiğnediğinizde veya bir şikayet alırsak, gerekli gördüğümüzde Minecraft veya "PSN" e erişiminizi kaldırabilir veya askıya alabiliriz. Ayrıca bir Kullanıcı İçeriği'nin kanunlara aykırı olduğu bilgisine sahip olduğumuzda bu içeriği kaldırmak veya erişimini engellemek için hemen harekete geçeceğiz. + GELİŞTİRMELER + •Zaman zaman geliştirmeler ve güncellemeler piyasaya sürebiliriz ama bunu yapmak zorunda değiliz. Ayrıca hiçbir oyun için sürekli destek ve bakım hizmeti vermek zorunda değiliz. Tabii ki, Minecraft için yeni güncellemeler yayınlamak isteriz, sadece bunu yapacağımızı garanti edemeyiz. + YÜKÜMLÜLÜKLERİMİZ + • Minecraft'ın bir kopyasını aldığınızda, onu 'olduğu gibi' tedarik ederiz. Güncellemeler ve geliştirmeler de 'olduğu gibi' tedarik edilir. Bunun anlamı, size Minecraft'ın kalitesini veya hatasız çalışacağını veya hiçbir hasar vermeyeceğini garanti etmediğimizdir. Biz sadece Minecraft'ı ve verebildiğimiz kadar hizmeti sağlamaya söz veriyoruz. Birçok ülkedeki kanunlara göre bizim ürünümüzden kaynaklı ölüm veya yaralanmalardan sorumlu tutulamayacağımızı söyleyemiyoruz, bu yüzden eğer yanlış yaptığımız bir şeyden dolayı bilgisayarınız kalkıp sizi bıçaklarsa sorumlusu biziz. + ŞUNLARDAN SORUMLU TUTULAMAYIZ: + • SİZ VEYA BAŞKA BİRİ TARAFINDAN MINECRAFT'IN DOĞRU VEYA YANLIŞ KULLANIMI; + • MINECRAFT KULLANILARAK ÜRETİLEN HERHANGİ BİR İÇERİK; + • SİZİN YAPTIĞINIZ BİR KURAL İHLALİ; + • BAŞKA BİRİNİN YAPTIĞI BİR KURAL İHLALİ. + FESİH + • Bu kuralları çiğnerseniz Minecraft'ı kullanma hakkınızı feshedebiliriz. İstediğiniz zaman Minecraft'ı PlayStation®Vita sisteminizden silerek siz de feshedebilirsiniz. Ne olursa olsun, "Minecraft'ın Sahipliği", "Yükümlülüklerimiz" ve "Genel Şeyler" altındaki paragraflar fesihten sonra bile geçerliliğini korur. + GENEL ŞEYLER + • Bu Koşullar sahip olabileceğiniz kanuni haklara tabidir. Bu Koşullardaki hiçbir şey kanun dışında bırakılmamış hiçbir hakkınızı kısıtlayamaz, bizim ürünümüzden ortaya çıkacak ölüm veya yaralamalardan gelen sorumluluğumuzu da kısıtlayamaz. + • Zaman zaman bu Koşulları değiştirebiliriz, ancak bu değişiklikler ancak yasal olarak yürürlüğe girdikten sonra etkili olur. Örneğin, eğer Minecraft'ı tek olarak oynuyor ve güncellemeleri kullanmıyorsanız eski SKLS; ama çok oyunculu veya çevrim içi hizmetleri kullanan Minecraft bölümlerini kullanıyorsanız yeni SKLS geçerli olur. Bu durumda size bu Koşullarda değişiklik olduğunu söylemeyebiliriz / söylemek zorunda değiliz. Bu yüzden Koşulların değişip değişmediğinden haberdar olmak için arada sırada buraya göz atmalısınız. Yine de adaletsizlik yapacak değiliz ama bazen kanun değişiyor veya birileri diğer Minecraft oyuncularını etkileyecek bir şey yapıyor bu yüzden engellememiz gerekiyor. + • Bize Minecraft veya oyunlarımızdan herhangi biri için bir öneriyle gelirseniz, bu öneri karşılıksız olacaktır. Bu demek oluyor ki önerinizi istediğimiz şekilde kullanabiliriz ve bunun için de size bir ödeme yapmamız gerekmez. Ödeme yapmak isteyeceğimiz bir öneriniz olduğunu düşünüyorsanız, öneriyi söylemeden önce ödeme beklediğinizi bize bildirmelisiniz. + • Bu Koşullara ek olarak, internet üzerinden ulaşabileceğiniz bazı Marka ve Mülk Kullanım Yönetmeliğimiz de bulunmaktadır. + • Bu kuralları çiğnerseniz, biz (veya Sony Computer Entertainment) Minecraft'ı kullanmanızı engelleyebilir. Bu kuralları kabul edemezseniz veya etmek istemiyorsanız, bu durumda Minecraft'ı satın almamalı, indirmemeli, kullanmamalı ya da oynamamalısınız. + Bu sayfada yanıtlanmayan, merak ettiğiniz hukuki bir husus bulunuyor ise bir şey yapmadan önce bu konuyu bize sorun. Basitçe açıklamak gerekirse, anlamsızca hareket ederseniz geri dönüşü olmayacak. + Biz: + Mojang AB + Maria Skolgata 83, + SE-11853 + Stockholm + İsveç + Kuruluş numarası: 556819-2388 + + + + + Oyun içi bir mağazasından satın alınan her içerik, Sony Network Entertainment Europe Limited ("SNEE") üzerinden satın alınmış olacaktır ve PlayStation®Store 'da mevcut olan Sony Entertainment Network Hizmet Koşulları ile Kullanıcı Sözleşmesi'ne tabi olacaktır. Bu durumlar öğeden öğeye farklılık gösterebileceğinden dolayı lütfen her satın alım işleminiz için kullanım haklarını kontrol ediniz. Aksi gösterilmediği sürece, bütün oyun içi mağazalarda yer alan içerik, oyun ile aynı yaş sınırlandırmasına sahiptir. + + + + + Öğelerin satın alımı ve kullanımı, Ağ Hizmet Koşulları ve Kullanıcı Sözleşmesi'ne tabidir. Bu çevrim içi hizmet Sony Computer Entertainment America tarafından alt lisans vasıtasıyla tarafınıza sunulmuştur. + + + + Uyarı: Bu oyunu kullananlar, eu.playstation.com/legal Yazılım Kullanma Koşulları’na tabidir. + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/tr-TR/stringsDynafont.xml b/Minecraft.Client/PSVitaMedia/loc/tr-TR/stringsDynafont.xml new file mode 100644 index 00000000..dca31ec2 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/tr-TR/stringsDynafont.xml @@ -0,0 +1,7 @@ + + + + DynaFont developed by DynaComware. + + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/tr-TR/stringsGeneric.xml b/Minecraft.Client/PSVitaMedia/loc/tr-TR/stringsGeneric.xml new file mode 100644 index 00000000..92dc7c54 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/tr-TR/stringsGeneric.xml @@ -0,0 +1,6933 @@ + + + + Çevrimdışı oyuna geçiliyor + + + Kurucu oyunu kaydederken beklemede kal + + + SON'a giriliyor + + + Oyuncular kaydediliyor + + + Kurucuya bağlanılıyor + + + Arazi indiriliyor + + + SON terk ediliyor + + + 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. + + + 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. + + + Seviye yükleniyor + + + Sonuçlandırılıyor… + + + Arazi inşa ediliyor + + + Dünya simüle ediliyor + + + Sıra + + + Seviye kaydedilmeye hazırlanıyor + + + Parçalar hazırlanıyor… + + + Sunucu başlatılıyor + + + Dip Alem terk ediliyor + + + Yeniden canlandırılıyor + + + Seviye oluşturuluyor + + + Canlanma bölgesi oluşturuluyor + + + Canlanma bölgesi yükleniyor + + + Dip Alem'e giriliyor + + + Aletler ve Silahlar + + + Gama + + + Oyun Duyarlılığı + + + Arabirim Duyarlılığı + + + Zorluk + + + Müzik + + + Ses + + + Huzurlu + + + 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. + + + Kolay + + + Normal + + + Zor + + + Çıkış yapıldı + + + Zırh + + + Düzenekler + + + Nakliye + + + Silahlar + + + Gıda + + + Yapılar + + + Dekorasyonlar + + + Simya + + + Aletler, Silahlar ve Zırhlar + + + Malzemeler + + + İnşa Blokları + + + Kızıltaş ve Nakliyat + + + Çeşitli + + + Kayıtlar: + + + 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! + + + 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! + + + + Tam Oyunun Kilidini Aç + + + 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ı! + + + Deneme oyununu oynuyorsun ancak oyunu kaydedebilmen için tam oyuna sahip olmalısın. +Tam oyunun kilidini şimdi açmak ister misin? + + + Arkadaşlar + + + Skorum + + + Genel + + + Lütfen bekle + + + Sonuç bulunamadı + + + Filtre: + + + 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ı + + + Sandık + + + Büyüle + + + Ocak + + + Şu an için bu başlıkta bu türe ait bir indirilebilir içerik sunumu bulunmuyor. + + + Bu kayıtlı oyunu silmek istediğinden emin misin? + + + Onay bekleniyor + + + Sansürlü + + + %s oyuna katıldı. + + + %s oyundan ayrıldı. + + + %s oyundan atıldı. + + + Simya Standı + + + Tabela Yazısı Gir + + + Tabelana bir bilgi ya da metin gir + + + Başlık Gir + + + Deneme Süresi Doldu + + + Oyun dolu + + + Yer olmadığından dolayı oyuna katılım başarısız + + + Mesajına bir başlık gir + + + Mesajına bir açıklama gir + + + Envanter + + + Bileşenler + + + Alt Başlık Gir + + + Mesajına bir alt başlık gir + + + Açıklama Gir + + + Şu an oynanan: + + + 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ı + + + 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ı? + + + Otomatik Kayıt Arası: Kapalı + + + Arabirim Saydamlığı + + + Seviyeyi Otomatik Kaydetmeye Hazırlanılıyor + + + Gösterge Boyutu + + + 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. + + + Favori Görünümler + + + %s Oyunu + + + Bilinmeyen kurucu oyunu + + + Misafir çıkış yaptı + + + Ayarları Sıfırla + + + Ayarlarını sıfırlayarak başlangıç değerlerine döndürmek istediğinden emin misin? + + + Yükleme Hatası + + + Misafir bir oyuncu oyundan çıktığından dolayı bütün misafir oyuncular oyundan çıkarıldı. + + + Oyun oluşturulamadı + + + Otomatik Seçilen + + + Paketsiz: Başlangıç Görünümleri + + + Giriş yap + + + Giriş yapmadın. Bu oyunu oynamak için giriş yapman gerekiyor. Şimdi giriş yapmak istiyor musun? + + + Çok oyunculu oyuna izin verilmedi + + + İç + + + + 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. + + + 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 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. + + + + + Bu bölgede Dip Aleme açılan bir Portal var! + + + + + {*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ş 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*} + + + + + Kızıltaş yineleyicileri enerjinin taşınacağı mesafeyi artırmak veya devreye bir geciktirici eklemek için kullanılabilir. + {*ICON*}356{*/ICON*} + + + + + 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*} + + + + + 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. + + + + + 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. + + + + + 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 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. + + + + + 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. + + + + 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. + + + 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*} + + + + {*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. + + + + 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. + + + + + 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. + + + + + Kazan boşalacak olursa, bir Su Kovası ile tekrar doldurabilirsin. + + + + + Simya Standını kullanarak bir Ateş Direnci İksiri üret. Bir Su Şişesi, Dip Alem Yumrusu ve Magma Özüne ihtiyacın olacak. + + + + + 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. + + + + + Artık ateş ve lavlara karşı dirençli olduğuna göre, önceden gidemeyeceğin bazı yerlere gidebilirsin. + + + + + Burası silah, zırh ve bazı aletlere efsun eklemek için kullanabileceğin efsunlama arabirimidir. + + + + {*B*} + Efsun arabirimi hakkında daha fazla bilgi almak için {*CONTROLLER_VK_A*} düğmesine bas.{*B*} + Efsun arabirimini zaten biliyorsan {*CONTROLLER_VK_B*} düğmesine bas. + + + + + Bu bölgede bir Simya Standı, bir Kazan ve iksir üretmek için eşyalarla dolu olan bir sandık var. + + + + + 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. + + + + + 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. + + + + + Oltanı atıp balık tutmaya başlamak için {*CONTROLLER_ACTION_USE*} düğmesine bas. Tekrar {*CONTROLLER_ACTION_USE*} düğmesine basarak oltayı çek. + {*FishingRodIcon*} + + + + + Olta mantarının suyun altına batmasını bekleyip ipi çekersen bir balık yakalayabilirsin. Balıklar ham veya ocakta pişirilip yenilebilir ve sağlığı yenilerler. + {*FishIcon*} + + + + + 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. + + + + + {*B*} + Yataklar hakkında daha fazla bilgi almak için {*CONTROLLER_VK_A*} düğmesine bas.{*B*} + Yataklar hakkında zaten bilgi sahibiysen {*CONTROLLER_VK_B*} düğmesine bas. + + + + + Yatak, güvenli ve iyi aydınlatılmış bir yere yerleştirilmelidir, böylece canavarlar seni gece yarısında uyandıramaz. Bir yatağı kullandıktan sonra ölürsen, tekrar yatakta doğacaksın. + {*ICON*}355{*/ICON*} + + + + + Oyununda başka oyuncular varsa, uyuyabilmek için herkesin aynı anda yataklarında olmaları gerekir. + {*ICON*}355{*/ICON*} + + + + + {*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. + + + + + 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. + + + + + 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. + + + + + 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. + + + + + 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*} + + + + + 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. + + + + Bir eşyayı taşırken imleci arabirimin dışına götürürsen o eşyayı bırakabilirsin. + + + Oku + + + Tutun + + + Fırlat + + + + + + Ses Perdesini Değiştir + + + Patlat + + + Ek + + + Tam Oyunun Kilidini Aç + + + Kaydı Sil + + + Sil + + + Toprağı Sür + + + Hasat Et + + + Devam Et + + + Yukarı Yüz + + + Vur + + + Süt Sağ + + + Topla + + + Boşalt + + + Eyerle + + + Yerleştir + + + Ye + + + Bin + + + Kayık Kullan + + + Yetiştir + + + Uyu + + + Uyan + + + Oynat + + + Seçenekler + + + Zırh Taşı + + + Silah Taşı + + + Kuşan + + + Bileşen Taşı + + + Yakacak Taşı + + + Alet Taşı + + + Çek + + + Üst Sayfa + + + Alt Sayfa + + + Aşk Modu + + + Bırak + + + Ayrıcalıklar + + + Engelle + + + Yaratıcılık + + + Seviyeyi Yasakla + + + Görünüm Seç + + + Tutuştur + + + Arkadaş Davet Et + + + Kabul Et + + + Kırp + + + Dolaş + + + Yeniden Yükle + + + Seçenekleri Kaydet + + + Komut Çalıştır + + + Tam Sürümü Yükle + + + Deneme Sürümünü Yükle + + + Yükle + + + Çıkar + + + Çevrimiçi Oyunlar Listesini Yenile + + + Parti Oyunları + + + Tüm Oyunlar + + + Çıkış + + + İptal + + + Katılmayı İptal Et + + + Grup Değiştir + + + Üretim + + + Oluştur + + + Al/Yerleştir + + + Envanteri Göster + + + Açıklamayı Göster + + + Bileşenleri Göster + + + Geri + + + Hatırlatma: + + + + + + Son sürümde oyuna eğitim dünyasındaki yeni alanlar gibi yeni özellikler eklendi. + + + Bu eşyayı yapmak için gereken tüm bileşenlere sahip değilsin. Sol alt köşedeki kutu bunu üretmek için gereken bileşenleri gösterir. + + + + Tebrikler, eğitimi tamamladın. Oyunda zaman artık normal hızda akacak, gecenin çöküp canavarların çıkması için fazla beklemen gerekemeyecek! Sığınağını tamamla! + + + + {*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. + + + {*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. + + + + {*B*} + Yiyecek çubuğu ve yemek yeme hakkında daha fazla bilgi almak için {*CONTROLLER_VK_A*} düğmesine bas.{*B*} + Yiyecek çubuğu ve yemek yeme hakkında zaten bilgi sahibiysen {*CONTROLLER_VK_B*} düğmesine bas. + + + + Seç + + + Kullan + + + 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. + + + + Al + + + Sonraki + + + Önceki + + + Oyuncu At + + + Arkadaşlık İsteği Gönder + + + Alt Sayfa + + + Üst Sayfa + + + Boya + + + İyileştir + + + Otur + + + Takip Et + + + Kaz + + + Besle + + + Evcilleştir + + + Filtreyi Değiştir + + + Tümünü Yerleştir + + + Birini Yerleştir + + + Bırak + + + Tümünü Al + + + Yarısını Al + + + Yerleştir + + + Tümünü Bırak + + + Hızlı Seçimi Temizle + + + Bu Nedir? + + + Facebook'ta Paylaş + + + Birini Bırak + + + Takas Et + + + Hızlı Taşı + + + Görünüm Paketleri + + + Kırmızı Lekeli İnce Cam + + + Yeşil Lekeli İnce Cam + + + Kahverengi Lekeli İnce Cam + + + Beyaz Lekeli İnce Cam + + + Lekeli İnce Cam + + + Siyah Lekeli İnce Cam + + + Mavi Lekeli İnce Cam + + + Gri Lekeli İnce Cam + + + Pembe Lekeli İnce Cam + + + Açık Yeşil Lekeli İnce Cam + + + Mor Lekeli İnce Cam + + + Camgöbeği Lekeli İnce Cam + + + Açık Gri Lekeli İnce Cam + + + Turuncu Lekeli İnce Cam + + + Mavi Lekeli İnce Cam + + + Mor Lekeli İnce Cam + + + Camgöbeği Lekeli İnce Cam + + + Kırmızı Lekeli Cam + + + Yeşil Lekeli Cam + + + Kahverengi Lekeli Cam + + + Açık Gri Lekeli İnce Cam + + + Sarı Lekeli İnce Cam + + + Açık Mavi Lekeli İnce Cam + + + Galibarda Lekeli İnce Cam + + + Gri Lekeli İnce Cam + + + Pembe Lekeli İnce Cam + + + Açık Yeşil Lekeli İnce Cam + + + Sarı Lekeli İnce Cam + + + Açık Gri + + + Gri + + + Pembe + + + Mavi + + + Mor + + + Camgöbeği + + + Açık Yeşil + + + Turuncu + + + Beyaz + + + Özel + + + Sarı + + + Açık Mavi + + + Galibarda + + + Kahverengi + + + Beyaz Lekeli İnce Cam + + + Küçük Top + + + Büyük Top + + + Açık Mavi Lekeli İnce Cam + + + Galibarda Lekeli İnce Cam + + + Turuncu Lekeli İnce Cam + + + Yıldız biçimli + + + Siyah + + + Kırmızı + + + Yeşil + + + Ürperten biçimli + + + İnfilak + + + Bilinmeyen Şekil + + + Siyah Lekeli Cam + + + Demir At Zırhı + + + Altın At Zırhı + + + 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*} +{*C3*}Biz kimiz? Önceleri bize dağın ruhu denirdi. Güneş baba, ay ana. Ataların ruhları, hayvanların ruhları. Cin. Hayalet. Yeşil adam. Tanrılar, iblisler. Melekler. Öcüler. Uzaylılar, dünya dışı canlılar. Leptonlar, kuraklar. Kelimeler değişiyor. Biz değişmiyoruz.{*EF*}{*B*}{*B*} +{*C2*}Biz kainatız. Biz sen olmadığını düşündüğün her şeyiz. Şu an bize bakıyorsun, derin ve gözlerinle. Neden kainat derine dokunuyor ve sana ışık gönderiyor? Seni görmek için, oyuncu. Seni tanımak için ve tanınmak için. Sana bir hikaye anlatacağım.{*EF*}{*B*}{*B*} +{*C2*}Bir zamanlar bir oyuncu varmış.{*EF*}{*B*}{*B*} +{*C3*}Bu oyuncu sendin, {*PLAYER*}.{*EF*}{*B*}{*B*} +{*C2*}Bazen kendisinin erimiş taştan oluşan dönen bir kürenin üstündeki ince bir kabukta yaşayan bir insan olduğunu sanıyor. Erimiş kaya küresi kendinden üç yüz otuz bin kez büyük yanan bir gaz topunun etrafında dönüyormuş. Birbirlerinden o kadar uzaklarmış ki ışığın arada gitmesi sekiz dakika sürüyormuş. Işık yıldızdan gelen bir malumatmış ve yüz elli milyon kilometre öteden cildini yakabilirmiş.{*EF*}{*B*}{*B*} +{*C2*}Bazen oyuncu bir madenci olduğunu hayal ediyor, düz ve sonsuz bir dünyanın yüzeyinde. Güneş beyaz bir kareden ibaret. Günler kısa; yapacak çok iş var ve ölüm sadece geçici bir rahatsızlık.{*EF*}{*B*}{*B*} +{*C3*}Bazen oyuncu bir hikayenin içinde kaybolduğunu hayal ediyor.{*EF*}{*B*}{*B*} +{*C2*}Bazen oyuncu başka yerlerdeki başka şeyler olduğunu hayal ediyor. Bazen bu hayaller rahatsız edici olur. Bazen de çok güzel olur. Bazen oyuncu bir rüyadan diğerine oradan da üçüncü bir rüyanın içine uyanır.{*EF*}{*B*}{*B*} +{*C3*}Bazen oyuncu bir ekran ile dünyaları izlediğini hayal eder.{*EF*}{*B*}{*B*} +{*C2*}Geriye dönelim.{*EF*}{*B*}{*B*} +{*C2*}Oyuncunun atomları çimenlere, nehirlere, havaya, yere saçılmıştı. Bir kadın atomları topladı; içti yedi ve ciğerlerine çekti ve kadın oyuncuyu kendi bedeninde birleştirdi.{*EF*}{*B*}{*B*} +{*C2*}Ve oyuncu uyandı, annesinin bedeninin sıcak ve karanlık dünyasından uzun bir rüyaya uyandı.{*EF*}{*B*}{*B*} +{*C2*}Ve oyuncu yeni bir hikaye oldu, daha önce anlatılmamış, DNA ile yazılmış. Oyuncu yeni bir programdı, daha önce hiç çalışmamış, bir milyar yıllık bir kaynak koddan üretilmiş. Ve oyuncu yeni bir insandı, daha önce yaşamamış, sadece süt ve sevgiden yapılmış.{*EF*}{*B*}{*B*} +{*C3*}Sen oyuncusun. Hikayesin. Programsın. İnsansın. Sadece süt ve sevgiden yapılmış.{*EF*}{*B*}{*B*} +{*C2*}Daha da geriye gidelim.{*EF*}{*B*}{*B*} +{*C2*}Oyuncunun bedeninin yedi milyar çarpı milyar çarpı milyar atomu bu oyundan çok önce, bir yıldızın kalbinde yaratıldı. Bu yüzden oyuncu da bir yıldızdan gelen bir malumattır. Ve oyuncu bir hikayenin içinde hareket eder, Julian diye birinin diktiği bilgi ormanında ve Markus diye birinin yarattığı düz sonsuz bir dünyada, bunlar oyuncunun yarattığı küçük ve özel bir dünyada bulunur, oyuncu da şu kişi tarafından yaratılan kainata yaşar...{*EF*}{*B*}{*B*} +{*C3*}Şşt. Bazen oyuncu yumuşak sıcak ve basit olan küçük, özel bir dünya yaratır. Bazen zor, soğuk ve karmaşık. Bazen kafasında kainatın bir modelini kurar; devasa boş bir alanda gezen enerji zerreleri. Bazen bu zerrelere "elektron" ve "proton" der.{*EF*}{*B*}{*B*} + + + + {*C2*}Bazen onlara "gezegenler" ve "yıldızlar" der.{*EF*}{*B*}{*B*} +{*C2*}Bazen enerjiden yapılmış, açık ve kapalıdan yapılmış; sıfır ve birden yapılmış; kod satırlarından yapılmış bir kainatta yaşadığına inanır. Bazen bir oyun oynadığına inanır. Bazen ekrandaki kelimeleri okuduğuna inanır.{*EF*}{*B*}{*B*} +{*C3*}Sen oyuncusun, kelimeleri okuyorsun...{*EF*}{*B*}{*B*} +{*C2*}Şşt... Bazen oyuncu ekranda kod satırlarını okur. Onları kelimelere çevirir; kelimeleri manaya çevirir; manayı hislere, duygulara, teorilere, fikirlere çevirir ve oyuncu derin ve hızlı nefes almaya başlar, yaşadığını fark eder, yaşadığını, o binlerce ölüm gerçek değildir, oyuncu yaşıyordur{*EF*}{*B*}{*B*} +{*C3*}Sen. Sen. Sen yaşıyorsun.{*EF*}{*B*}{*B*} +{*C2*}ve bazen oyuncu kainatın onunla yaz ağaçlarının titreyen yapraklarının arasından sızan gün ışığı vasıtasıyla konuştuğuna inanır{*EF*}{*B*}{*B*} +{*C3*}ve bazen oyuncu kainatın onunla kışın gevrek gece semasından sızan ışık vasıtasıyla konuştuğuna inanır, oyuncunun gözünün kenarındaki bir ışık zerresi güneşten milyar kat büyük bir yıldız olabilir, o an oyuncuya görünebilmek için gezegenlerini plazmaya çevirmiştir, kainatın uzak bir köşesindeki evine yürürken, birden yemek kokusu alır, tanıdık bir kapının önünde, tekrar rüyaya dalmak üzereyken{*EF*}{*B*}{*B*} +{*C2*}ve bazen oyuncu kainatın onunla sıfırlar ve birler, dünyanın elektriği, bir rüyanın sonundaki ekranda kayan yazılar vasıtasıyla konuştuğuna inanır{*EF*}{*B*}{*B*} +{*C3*}ve kainat seni seviyorum dedi{*EF*}{*B*}{*B*} +{*C2*}ve kainat oyunu iyi oynadın dedi{*EF*}{*B*}{*B*} +{*C3*}ve kainat ihtiyacın olan her şey içinde dedi{*EF*}{*B*}{*B*} +{*C2*}ve kainat düşündüğünden daha güçlüsün dedi{*EF*}{*B*}{*B*} +{*C3*}ve kainat sen gün ışığısın dedi{*EF*}{*B*}{*B*} +{*C2*}ve kainat sen gecesin dedi{*EF*}{*B*}{*B*} +{*C3*}ve kainat savaştığın karanlık senin içinde dedi{*EF*}{*B*}{*B*} +{*C2*}ve kainat aradığın ışık senin içinde dedi{*EF*}{*B*}{*B*} +{*C3*}ve kainat yalnız değilsin dedi{*EF*}{*B*}{*B*} +{*C2*}ve kainat sen diğer şeylerden ayrı değilsin dedi{*EF*}{*B*}{*B*} +{*C3*}ve kainat sen kainatsın, kendini tadıyorsun, kendinle konuşuyorsun, kendi kodunu okuyorsun dedi{*EF*}{*B*}{*B*} +{*C2*}ve kainat seni seviyorum dedi çünkü sevgi sensin.{*EF*}{*B*}{*B*} +{*C3*}Ve oyun bitti ve oyuncu rüyadan uyandı. Ve oyuncu yeni bir rüyaya daldı. Ve oyuncu tekrar hayal etti, daha iyi hayal etti. Ve oyuncu kainatın kendisiydi. Ve oyuncu sevgiydi.{*EF*}{*B*}{*B*} +{*C3*}Oyuncu sensin.{*EF*}{*B*}{*B*} +{*C2*}Uyan.{*EF*} + + + + 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 + + + Dip Alem'i Sıfırlama + + + Şu an bu Möntar biçilemez. Maksimum Domuz, Koyun, İnek, Kedi ve At sayısına ulaşıldı. + + + Öldün! + + + Dünya Seçenekleri + + + İnşa Edebilir ve Kazabilir + + + Kapıları ve Düğmeleri Kullanabilir + + + Yapı Üret + + + Aşırı Düz Dünya + + + Bonus Sandık + + + Konteynerleri Açabilir + + + Oyuncuyu At + + + Uçabilir + + + 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 + + + Fenerler + + + {*T3*}NASIL OYNANIR : FENERLER{*ETW*}{*B*}{*B*} +Etkin Fenerler, gökyüzüne parlak bir ışın yansıtır ve yakındaki oyunculara güç verir.{*B*} +Cam, Obsidiyen ve Solgunu yok ederek ele geçirilebilecek Dip Yıldızı ile yapılırlar.{*B*}{*B*} +Fenerlerin gün boyunca güneş ışığı alacak şekilde Demir Piramitlerin, Altınların, Zümrütlerin ya da Elmasların üzerine yerleştirilmeleri gerekir.{*B*} +Fenerin üzerine yerleştirildiği malzemenin Fenerin gücüne etkisi yoktur.{*B*}{*B*} +Fener menüsünden Fenerin için bir adet birincil güç seçebilirsin. Piramidinin ne kadar katı varsa, o kadar fazla güç seçmen gerekir.{*B*} +En az dört katlı bir piramidin üzerindeki bir fener ayrıca, ikincil gücün yenilenmesi ya da birincil gücün daha da güçlendirilmesi seçeneklerini sunar.{*B*}{*B*} +Fenerinin güçlerini belirlerken, ödeme yuvasına bir Zümrüt, Elmas, Altın ya da Demir Külçe yerleştirmen gerekir. {*B*} +Ayarlandıktan sonra güçler süresiz şekilde Fenerden çıkmaya başlayacaktır.{*B*} + + + + Havai Fişekler + + + Diller + + + Atlar + + + {*T3*}NASIL OYNANIR : ATLAR {*ETW*}{*B*}{*B*} +Atlar ve Eşekler, açık düzlüklerde bulunurlar. Katırlar, bir Eşek ve bir Attan meydana gelirler ancak kısırdırlar.{*B*} +Bütün yetişkin Atlara, Eşeklere ve Katırlara binilebilir. Buna karşın yalnızca Atlara zırh takılabilir ve yalnızca Katırlara ve Eşeklere eşya taşımaları için heybe takılabilir. {*B*}{*B*} +Atların, Eşeklerin ve Katırların, kullanılmadan önce evcilleştirilmeleri gerekir. Bir at, onu sürmeye çalışarak ve o sürücüsünü üzerinden atmaya çalışırken üzerinde kalmayı başararak evcilleştirilebilir.{*B*} +Atın etrafında Kalpler belirdiğinde evcilleştirilmiş demektir ve artık oyuncuyu üzerinden atmaya çalışmaz. Oyuncunun, atı yönlendirmek için ona bir Eyer takması gerekir.{*B*}{*B*} +Eyerler köylülerden alınabilir ya da dünyada saklı Sandıklarda bulunabilir.{*B*} +Evcilleştirilmiş Eşeklere ve Katırlara, çömelip bir Sandık takılarak Heybe verilebilir. Bunun ardından Heybelere bineği sürerken ya da çömelirken ulaşılabilir.{*B*}{*B*} +Atlar ve Eşekler (Katırlar hariç), Altın Elmalar ya da Altın Havuçlar kullanılarak beslenebilirler.{*B*} +Taylar, bir süre sonra yetişkin Atlara dönüşürler ancak onları Buğday veya Saman ile beslemek, daha hızlı büyümelerini sağlar.{*B*} + + + + {*T3*}NASIL OYNANIR : HAVAİ FİŞEKLER{*ETW*}{*B*}{*B*} +Havai Fişekler, el ile ya da Fırlatıcılardan fırlatılabilen dekoratif eşyalardır. Kağıt, Barut ve isteğe bağlı olarak bir miktar Havai Fişek Yıldızı kullanılarak üretilirler.{*B*} +Üretim sırasında ek bileşenler de katılarak bir Havai Fişeğin renkleri, ortadan kaybolması, şekli, boyutu ve efektleri (izler ve patlamalar gibi) özelleştirilebilir.{*B*}{*B*} +Bir Havai Fişek üretmek için envanterinin üzerinde bulunan 3x3'lük üretim örgüsüne Barut ve Kağıt yerleştir.{*B*} +İsteğe bağlı olarak, Havai Fişeğe eklemek için üretim örgüsüne birden fazla Havai Fişek Yıldızı yerleştirebilirsin.{*B*} +Üretim örgüsündeki bölmelerden daha fazlasını Barut ile doldurmak, Havai Fişek Yıldızlarının patlayacağı yüksekliği artıracaktır.{*B*}{*B*} +Ardından üretilen Havai Fişeği çıkış bölmesinden alabilirsin.{*B*}{*B*} +Havai Fişek Yıldızları, üretim örgüsüne Barut ve Boya koyularak üretilebilir.{*B*} +- Boya, Havai Fişek Yıldızının patlama rengini belirler.{*B*} +- Bir Kor, Altın Külçe, Tüy ya da Yaratık Kellesi eklenerek Havai Fişek Yıldızının şekli ayarlanabilir.{*B*} +- Elmaslar ve Parıltı Taşı Tozu kullanılarak parıltı izi eklenebilir.{*B*}{*B*} +Bir Havai Fişek Yıldızı üretildikten sonra, Boya da katarak bir Havai Fişek Yıldızının ortadan kaybolma rengini belirleyebilirsin. + + + {*T3*}NASIL OYNANIR : DÜŞÜRÜCÜLER{*ETW*}{*B*}{*B*} +Kızıltaş ile güçlendirildiğinde Düşürücüler, içlerinde bulundurdukları rastgele bir eşyayı yere düşürürler. Düşürücüyü açmak için {*CONTROLLER_ACTION_USE*} düğmesini kullan ve ardından envanterindeki eşyalarla Düşürücüyü doldurabilirsin.{*B*} +Düşürücünün yönü bir Sandığa ya da başka türlü bir Konteynere doğruysa, eşya yere değil bunların içine düşecektir. Eşyaları belirli bir mesafenin uzağına iletmek için uzun Düşürücü zincirleri kurulabilir. Bu durumda alternatif olarak güç verilmeli ya da kesilmelidir. + + + Kullanıldığı zaman içinde bulunduğun dünyanın parçasının bir haritası halini alır ve sen keşfettikçe dolar. + + + Solgundan düşerler ve Fenerlerin yapımında kullanılırlar. + + + Huniler + + + {*T3*}NASIL OYNANIR: HUNİLER{*ETW*}{*B*}{*B*} +Huniler konteynerlere eşya yerleştirmek veya konteynerlerden eşya çıkarmak için ve içlerine atılan eşyaları otomatik olarak almak için kullanılır.{*B*} +Simya Stantlarının, Sandıkların, Fırlatıcıların, Düşürücülerin, Sandıklı Maden Arabalarının, Hunili Maden Arabalarının ve diğer Hunilerin üzerinde etkili olabilirler.{*B*}{*B*} +Huniler devamlı olarak üzerlerine yerleştirilmiş olan uygun konteynerlerden eşya çekmeyi denerler. Ayrıca depolanmış eşyaları bir çıkış konteynerine yerleştirmeye çalışırlar.{*B*} +Eğer bir Huni, Kızıltaşla güçlendirilirse, etkisiz hale gelir ve hem eşyaları çekmeyi hem de yerleştirmeyi durdurur.{*B*}{*B*} +Bir Huni eşyaları çıkarmaya çalıştığı yönü işaret eder. Bir Huniyi belli bir bloğa yönlendirmek istersen, gizlice ilerlerken Huniyi o bloğa karşı yerleştir.{*B*} + + + Düşürücüler + + + KULLANILMADI + + + Anında Sağlık + + + Anında Hasar + + + Zıplama Güçlendirici + + + Kazı Yorgunluğu + + + Kuvvet + + + Zayıflık + + + Bulantı + + + KULLANILMADI + + + KULLANILMADI + + + KULLANILMADI + + + Yenilenme + + + Direnç + + + Dünya Üretimi için Oluşum bulunuyor. + + + 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. + + + 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ızıltaş yükü verildiğinde, eşyaları tutup bırakmayı veya başka bir konteynere aktarmak için kullanılır. + + + Sertleştirilmiş Kil kullanılarak yapılan renkli bloklar. + + + Bir Kızıltaş gücü sağlar. Bu güç, plakada daha fazla eşya varsa daha da güçlenir. Hafif plakadan daha fazla ağırlık gerektirir. + + + Bir kızıltaş güç kaynağı olarak kullanılır. Tekrar Kızıltaş haline getirilebilir. + + + Eşyaları yakalamak ve konteynerlere ya da konteynerlerden eşya aktarması yapmak için kullanılır. + + + Atlara, Eşeklere ve Katırlara yedirilerek 10 kalp sağlık kazanmalarını sağlar. Sıpaların büyümesini hızlandırır. + + + Yarasa + + + Uçan yaratıklar mağaralarda veya diğer geniş ve kapalı alanlarda bulunurlar. + + + Cadı + + + Ocakta Kil eritilerek yapıldı. + + + Cam ve boyadan yapıldı. + + + Lekeli Camdan yapıldı + + + Bir Kızıltaş gücü sağlar. Bu güç, plakada daha fazla eşya varsa daha da güçlenir. + + + Güneş ışığına (ya da güneş ışığının eksikliğine) bağlı olarak bir Kızıltaş sinyali çıkışı veren bir blok. + + + Bir Huni ile benzer işlevlere sahip özel bir Maden Arabası türü. Raylardaki ve üzerinde bulunan Konteynerlerden eşya alır. + + + Bir ata kuşatılabilen özel bir zırh türü. 5 Zırh sağlar. + + + Bir havai fişeğin rengini, etkisini ve şeklini belirlemede kullanılır. + + + Sinyal kuvvetini sürdürmek, kıyaslamak ya da eksiltmek için, veya belirli blokları ölçmek için Kızıltaş devrelerinde kullanılır. + + + Hareket eden bir TNT bloğu gibi işlev gören bir Maden Arabası türüdür. + + + Bir ata kuşatılabilen özel bir Zırh türü. 7 Zırh Sağlar. + + + Komutların çalıştırılmasında kullanılırlar. + + + Gökyüzüne bir ışın yansıtır ve yakındaki oyunculara Durum Etkilerini gösterir. + + + İçinde blok ve eşya depolar. İki katı kapasiteye sahip daha büyük bir sandık oluşturmak için iki sandığı yan yana yerleştir. Ayrıca kilitli sandıklar açıldıklarında bir Kızıltaş gücü oluştururlar. + + + Bir ata kuşatılabilen özel bir Zırh türü. 11 Zırh Sağlar. + + + Yaratıkları oyuncuya veya çitli noktalara bağlamak için kullanılır + + + Dünyadaki yaratıkları isimlendirmek için kullanılır. + + + Çabukluk + + + Tüm Oyunun Kilidini Aç + + + Oyuna Devam Et + + + Oyunu Kaydet + + + Oyun Oyna + + + Sıralama Tablosu + + + Yardım & Seçenekler + + + Zorluk: + + + PvP: + + + Oyunculara Güven: + + + TNT: + + + Oyun Türü: + + + Yapılar: + + + Seviye Türü: + + + Oyun Bulunamadı + + + Sadece Davetle + + + Daha Fazla Seçenek + + + Yükle + + + Kurucu Seçenekleri + + + Oyuncular/Davet + + + Çevrimiçi Oyun + + + Yeni Dünya + + + Oyuncular + + + Oyuna Katıl + + + Oyuna Başla + + + Dünya Adı + + + Dünya Üreteci Tohumu + + + Rastgele bir tohum için boş bırak + + + Yangın Yayılır: + + + İmza mesajını düzenle: + + + Ekran görüntüsüne eklenecek detayları gir + + + Yazı + + + Oyun İçi Araç İpucu + + + 2 Oyunculu Yatay Kesilmiş Ekran + + + Tamam + + + Oyun için ekran görüntüsü + + + Etki Yok + + + Hız + + + Yavaşlık + + + İmza mesajını düzenle: + + + Klasik Minecraft kaplamaları, simgeleri ve kullanıcı arabirimi! + + + Tüm Birleşik Dünyaları Göster + + + İpuçları + + + Avatar Eşyası 1'i Yeniden Yükle + + + Avatar Eşyası 2'yi Yeniden Yükle + + + Avatar Eşyası 3'ü Yeniden Yükle + + + Temayı Baştan Yükle + + + Oyuncu Resmi 1'i Yeniden Yükle + + + Oyuncu Resmi 2'yi Yeniden Yükle + + + Seçenekler + + + Kullanıcı Arabirimi + + + Başlangıç Ayarlarına Dön + + + Sallantıyı Görüntüle + + + Ses + + + Kontrol + + + Görsel + + + İksir yapımında kullanılır. Öldüklerinde Fersizlerden düşer. + + + Öldüklerinde Zombi Domuzadamlardan düşer. Zombi Domuzadamlar, Dip Alem'de bulunabilir. İksir pişirmek için kullanılabilir. + + + İksir yapımında kullanılır. Bu, Dip Alem Kalelerinde doğal şekilde yetişirken bulunabilir. Ayrıca Ruh Kumunda da yetiştirilebilir. + + + Üzerinde yürürken kaydırır. Yok edildiğinde başka bir bloğun üstündeyse suya dönüşür. Bir ışık kaynağına yeterince yakınsa ya da Dip Alem'e yerleştirilirse erir. + + + Dekorasyon olarak kullanılabilir. + + + İksir yapımında ve Kalelerin yerini belirlemek için kullanılır. Dip Alem Kalelerinde ya da yakınlarında bulunma eğiliminde olan Alazlardan düşer. + + + Kullanıldığında, ne üzerinde kullanıldığına bağlı olarak, çeşitli etkiler gösterebilir. + + + İksir yapımında ya da Sonveren Gözü ve Magma Özü yapmak için diğer eşyalarla birlikte kullanılır. + + + İksir yapımında kullanılır. + + + İksirler ya da Atılabilen İksirler yapmak için kullanılır. + + + Suyla doldurulabilir ve Simya Standında iksir için başlangıç bileşeni olarak kullanılır. + + + Bu zehirli bir gıda ve simya eşyasıdır. Örümcek ya da Mağara Örümceği bir oyuncu tarafından öldürüldüğünde düşer. + + + Temel olarak olumsuz etkili iksirler yapmak için iksir yapımında kullanılır. + + + Yerleştirildiğinde zamanla büyür. Makas kullanarak toplanabilir. Merdiven gibi tırmanılabilir. + + + Kapıya benzer ancak esasen çitlerle kullanılır. + + + Kavun Dilimlerinden elde edilebilir. + + + Cam Bloklarına alternatif olarak kullanılabilecek saydam bloklar. + + + (Düğme, şalter, basınç levhası, kızıltaş meşalesi ya da kızıltaşlı başka bir eşya aracılığıyla) Enerji verildiğinde, önündeki blokları itebilecek durumdaysa piston dışarıya çıkar. Pistonun uzanan parçası geri gittiğinde beraberinde temas ettiği bloğu da çeker. + + + Taş bloklarından yapılmıştır ve genellikle Kalelerde bulunur. + + + Çitlere benzer şekilde engel olarak kullanılır. + + + Bal kabağı yetiştirmek için ekilebilir. + + + İnşa ve dekorasyon için kullanılabilir. + + + İçinden geçerken hareketi yavaşlatır. İp toplamak için makas kullanarak yok edilebilir. + + + Yok edildiğinde bir Gümüşçün canlandırır. Ayrıca saldırıya uğrayan başka bir Gümüşçünün yakınındaysa da Gümüşçün canlandırabilir. + + + Kavun yetiştirmek için ekilebilir. + + + Öldüğünde Sonveren Adamdan düşer. Fırlatıldığında oyuncuyu Sonveren İncisinin düştüğü konuma ışınlar ve sağlığının bir kısmını kaybettirir. + + + Üzerinde çimen yetişen bir toprak bloğu. Kürek kullanılarak toplanır. İnşa için kullanılabilir. + + + Su kovası kullanılarak ya da yağmur yağınca suyla doldurulabilir ve ardından Cam Şişeleri suyla doldurmak için kullanılabilir. + + + Uzun merdivenler yapmak için kullanılır. İki levha üst üste yerleştirildiğinde, normal boyutta iki levhalı blok meydana getirir. + + + Dip Alem Kütlesinin ocakta eritilmesiyle elde edilir. Dip Alem Tuğlası blokları yapımında kullanılabilir. + + + Enerji verildiğinde ışığı emer. + + + Vitrine benzer ve içine yerleştirilen bloğu veya eşyayı gösterir. + + + Fırlatıldığında, adı geçen türdeki bir yaratığı canlandırabilir. + + + Uzun merdivenler yapmak için kullanılır. İki levha üst üste yerleştirildiğinde, normal boyutta iki levhalı blok meydana getirir. + + + Kakao Çekirdekleri toplamak için ekilebilir. + + + İnek + + + Öldürüldüğünde deri bırakır. Ayrıca kovayla süt sağılabilir. + + + Koyun + + + Yaratık Kafaları dekorasyon amacıyla yerleştirilebilir ya da başlık yuvasında maske olarak kullanılabilir. + + + Kalamar + + + Öldürüldüğünde mürekkep keseleri bırakır. + + + Nesneleri tutuşturmak veya Fırlatıcıdan atılarak rastgele ateş yakmak için kullanılabilir. + + + Suda yüzer ve üzerinde yürünebilir. + + + Dip Alem Kaleleri inşa etmek için kullanılır. Fersizin ateş toplarından etkilenmez. + + + Dip Alem Kalelerinde kullanılır. + + + Fırlatıldığında Son Portalının yönünü gösterir. Bundan on iki tanesi Son Portalı Çerçevelerine yerleştirildiğinde Son Portalı etkinleşecektir. + + + İksir yapımında kullanılır. + + + Çimen Bloklarına benzer ancak üzerinde mantar yetiştirmeye çok uygundur. + + + Dip Alem Kalelerinde bulunur ve kırıldığında Dip Alem Yumrusu düşer. + + + Son'da bulunan bir blok türü. Çok yüksek bir patlama direncine sahip olduğundan inşa için kullanışlıdır. + + + Bu blok, Son'daki Ejderhanın yenilmesiyle oluşur. + + + Fırlatıldığında, toplanarak tecrübe puanı kazandıran Tecrübe Küreleri bırakır. + + + Oyuncuların Tecrübe Puanlarını kullanarak Kılıçları, Kazmaları, Baltaları, Kürekleri, Yayları ve Zırhları efsunlamalarını sağlar. + + + On iki adet Sonveren Gözü kullanılarak etkinleştirilebilir ve oyuncunun Son boyutuna gitmesini sağlar. + + + Son Portalını oluşturmak için kullanılır. + + + (Düğme, şalter, basınç levhası, kızıltaş meşalesi ya da kızıltaşlı başka bir eşya aracılığıyla) Enerji verildiğinde, önündeki blokları itebilecek durumdaysa piston dışarıya çıkar. + + + Ocakta kilden yapıldı. + + + Bir ocakta tuğla yapmak için kullanılabilir. + + + Kırıldığı zaman, ocakta pişirilerek tuğlaya dönüşen kil topları çıkartır. + + + Balta kullanılarak kesilir ve kereste haline getirilebilir veya yakacak olarak kullanılabilir. + + + Kumun ocakta eritilmesiyle elde edilir. İnşaat için kullanılabilir ancak kazmaya çalışırsan kırılacaktır. + + + Kazma ile taştan çıkartıldı. Taştan araçlar veya ocak yapmak için kullanılabilir. + + + Kartoplarını saklamanın kompakt yolu. + + + Yahni yapmak için kase ile birleştirilebilir. + + + Sadece elmastan bir kazma ile çıkartılabilir. Lav ve suyun birleşimiyle ortaya çıkar ve bir portal üretmek için kullanılabilir. + + + Dünyaya canavarlar çıkartır. + + + Kartopu yapmak için bir kürekle kazılabilir. + + + Kırıldığı zaman bazen buğday tohumu üretir. + + + Bir boya üretiminde kullanılabilir. + + + Bir kürek ile toplanır. Kazıldığı zaman bazen çakmak taşı üretir. Eğer altında başka bir blok yoksa yer çekiminden etkilenmektedir. + + + Kömür toplamak için bir kazma ile kazılabilir. + + + Laciverttaş toplamak için taş kazma veya daha iyisi ile kazılabilir. + + + Elmas toplamak için demir kazma veya daha iyisi ile kazılabilir. + + + Dekorasyon olarak kullanılır. + + + Demir kazma veya daha iyisi ile kazılabilir ve sonra ocakta eritilerek altın külçe yapılabilir. + + + Taş kazma veya daha iyisi ile kazılabilir ve sonra ocakta eritilerek demir külçe yapılabilir. + + + Kızıltaş tozu toplamak için demir kazma veya daha iyisi ile kazılabilir. + + + Bu kırılamaz. + + + Dokunduğu her şeyi ateşe verir. Bir kova içerisinde toplanabilir. + + + Bir kürek ile toplanır. Ocakta eritilerek cam yapılabilir. Eğer altında başka bir blok yoksa yer çekiminden etkilenmektedir. + + + Parke taşı toplamak için bir kazma ile kazılabilir. + + + Bir kürek ile toplanır. İnşaat için kullanılabilir. + + + Ekilebilir ve sonunda bir ağaca dönüşür. + + + Elektrik yükü taşıması için toprağa yerleştirilir. İksirle kaynatıldığı zaman etki süresini artırır. + + + İnek öldürerek toplanır ve zırh ya da kitap yapımında kullanılabilir. + + + Balçık öldürerek toplanır ve iksir pişirmek ya da Yapışkan Piston üretmek için kullanılabilir. + + + Tavuklardan rastgele olarak düşer ve gıda mamülleri yapımında kullanılabilir. + + + Çakıl taşı kazarak toplanır ve çakmaktaşı ile çelik yapımında kullanılabilir. + + + Bir domuz üstünde kullanıldığında domuza binmeni sağlar. Sonrasında da domuz Havuçlu Değnek kullanılarak yönlendirilebilir. + + + Kar kazarak toplanır ve fırlatılabilir. + + + Parıltı Taşı kazarak toplanır ve yine Parıltı Taşı blokları yapımında veya etkiyi artırmak üzere bir iksirle pişirmek için kullanılabilir. + + + Kimi zaman kırıldığında, yeniden ekilerek ağaç yetiştirmeyi sağlayan bir fidan düşebilir. + + + Zindanlarda bulunur, inşa ve dekorasyon için kullanılabilir. + + + Koyunun yününü kırpmak ve yaprak blokları toplamak için kullanılabilir. + + + İskelet öldürerek toplanır. Kemik tozu yapımında kullanılabilir. Evcilleştirmek amacıyla bir kurdu beslemek için kullanılabilir. + + + Bir İskeletin, Ürperten öldürmesini sağlayarak toplanır. Müzik kutusunda çalınabilir. + + + Ateşi söndürür ve mahsullerin büyümesine yardım eder. Kova ile toplanabilir. + + + Mahsullerden hasat edilir ve gıda eşyaları yapımında kullanılabilir. + + + Şeker üretmek için kullanılabilir. + + + Miğfer olarak giyilebilir veya Cadılar Bayramı Kabağı üretmek için bir meşale ile birleştirilebilir. Ayrıca Bal Kabağı Kekinin ana malzemesidir. + + + Ateşe verilirse sonsuza dek yanar. + + + Ekinler, tam olarak büyüyünce buğday toplamak için hasat edilebilir. + + + Tohum ekmek için hazırlanmış toprak. + + + Yeşil boya üretmek için ocakta pişirilebilir. + + + Üzerinden geçen her şeyin hareketini yavaşlatır. + + + Tavuk öldürerek toplanır ve ok yapımında kullanılabilir. + + + Ürperten öldürerek toplanır ve TNT yapımında ya da iksir pişirmede malzeme olarak kullanılabilir. + + + Mahsul yetiştirmek için ekim toprağına ekilebilir. Tohumların büyümesine yetecek kadar ışık olduğundan emin ol. + + + Portala girmek, Üstdünya ile Dip Alem arasında geçiş yapmanı sağlar. + + + Ocakta yakacak olarak ya da meşale yapımında kullanılır. + + + Örümcek öldürerek toplanır ve Yay ya da Olta yapımında kullanılabilir veya Tetikleyici Mekanizma yapmak için yere yerleştirilebilir. + + + Kırpıldığında (şayet önceden kırpılmamışsa) yün bırakır. Yününün farklı bir renk olması için boyanabilir. + + + İş Geliştirme + + + Portföy Yöneticisi + + + Ürün Müdürü + + + Geliştirme Ekibi + + + Oyun Çıkışı Yönetimi + + + Yönetmen, XBLA Yayıncılık + + + Pazarlama + + + Asya Yerelleştirme Ekibi + + + Kullanıcı Araştırma Ekibi + + + MGS Central Ekipleri + + + Topluluk Yöneticisi + + + Avrupa Yerelleştirme Ekibi + + + Redmond Yerelleştirme Ekibi + + + Tasarım Ekibi + + + Eğlence Yönetmeni + + + Müzik ve Sesler + + + Programlama + + + Baş Mimar + + + Sanat Geliştiricisi + + + Oyun Zanaatkarı + + + Sanat + + + Yapımcı + + + Test Yöneticisi + + + Baş Test Sorumlusu + + + Kalite Kontrol + + + Yönetici Yapımcı + + + Baş Yapımcı + + + Ara Hedef Kabulü Test Sorumlusu + + + Demir Kürek + + + Elmas Kürek + + + Altın Kürek + + + Altın Kılıç + + + Ahşap Kürek + + + Taş Kürek + + + Ahşap Kazma + + + Altın Kazma + + + Ahşap Balta + + + Taş Balta + + + Taş Kazma + + + Demir Kazma + + + Elmas Kazma + + + Elmas Kılıç + + + SDET + + + Proje STE + + + İlave STE + + + Özel Teşekkürler + + + Test Müdürü + + + Yardımcı Test Yöneticisi + + + Test Ortakları + + + Ahşap Kılıç + + + Taş Kılıç + + + Demir Kılıç + + + Jon Kågström + + + Tobias Möllstam + + + Risë Lugo + + + Geliştirici + + + Çarptığında patlayan alevli toplar atarlar. + + + Balçık + + + Hasar aldığında daha ufak Balçıklara bölünür. + + + Zombi Domuzadam + + + Başlangıçta uysaldır ancak birine saldırırsan grup olarak saldırırlar. + + + Fersiz + + + Sonveren Adam + + + Mağara Örümceği + + + Isırığı zehirlidir. + + + Möntar + + + Ona bakacak olursan sana saldırır. Ayrıca blokları başka yerlere taşır. + + + Gümüşçün + + + Saldırıya uğradığında yakında saklanan Gümüşçünleri çeker. Taş bloklarda saklanır. + + + Yakınında olduğunda saldırır. + + + Öldürüldüğünde domuz pirzolası bırakır. Eyer kullanılarak binilebilir. + + + Kurt + + + Uysaldır ancak saldırıya uğradığında karşılık verir. Kemik kullanılarak evcilleştirilebilir; böylelikle kurt gittiğin yerlere peşinden gelir ve saldırdığın her şeye o da saldırır. + + + Tavuk + + + Öldürüldüğünde tüy bırakır ve ayrıca rasgele olarak yumurtlar. + + + Domuz + + + Ürperten + + + Örümcek + + + Yakınında olduğunda saldırır. Duvarlara tırmanabilir. Öldürüldüğünde ip bırakır. + + + Zombi + + + Çok yaklaşırsan patlar! + + + İskelet + + + Sana ok atar. Öldürüldüğünde oklar bırakır. + + + Kaseyle kullanıldığında mantar yahnisi meydana getirir. Mantar bırakır ve kırpıldığında normal inek haline gelir. + + + Orijinal Tasarım ve Kodlama + + + Proje Müdürü/Yapımcısı + + + Mojang Ofisinin Kalanı + + + Konsept Sanatçısı + + + Hesaplamalar ve İstatistikler + + + Zalim Koordinatör + + + Baş Oyun Programcısı Minecraft PC + + + Müşteri Desteği + + + Ofis DJ'i + + + Tasarımcı/Programcı Minecraft - Cep Sürümü + + + Ninja Kodlayıcı + + + CEO + + + Beyaz Yakalı İşçi + + + Patlayıcı Animatörü + + + Son'da bulunan büyük siyah bir ejderhadır. + + + Alaz + + + Dip Alem'de bulunan bu düşmanlar çoğunlukla Dip Alem Kalelerinin içindedir. Öldürüldüklerinde Alaz Çubukları bırakırlar. + + + Kar Golemi + + + Kar Golemi oyuncular tarafından kar blokları ile bal kabağı kullanılarak yapılır. Yaratıcısının düşmanlarına kartopu fırlatır. + + + Sonveren Ejderha + + + Magma Küpü + + + Ormanlarda bulunabilir. Çiğ Balıkla beslenerek evcilleştirilebilir ama yanına gitmek yerine Oselonun sana yaklaşmasına izin vermelisin. Yapacağın ani bir hareket onu korkutup kaçıracaktır. + + + Demir Golem + + + Koruma amacıyla Köyde ortaya çıkar ve Demir Bloklar ile Bal Kabakları kullanılarak oluşturulabilir. + + + Dip Alem'de bulunur. Balçığa benzer şekilde öldürüldüğünde daha ufak türlerine ayrılır. + + + Köylü + + + Oselo + + + Efsun Masasının etrafına yerleştirildiği zaman daha güçlü efsunların yaratılmasına imkan tanır. + + + {*T3*}NASIL OYNANIR : OCAK{*ETW*}{*B*}{*B*} +Ocak, eşyaları ısıtarak değiştirmeni sağlar. Örneğin, ocak kullanarak demir cevherini demir külçelere dönüştürebilirsin.{*B*}{*B*} +Ocağı yerleştirip kullanmak için {*CONTROLLER_ACTION_USE*} düğmesine bas.{*B*}{*B*} +Ocağın altına bir miktar yakacak, üstüne de ısıtılacak eşyayı koymalısın. Bunları yaptıktan sonra ocak alev alacak ve çalışmaya başlayacak.{*B*}{*B*} +Eşyalar son halini aldığında, onları çıktı bölümünden alarak envanterine yerleştirebilirsin.{*B*}{*B*} +İmlecin ucundaki eşya bir bileşen ya da yakacak ise, o eşyayı hızlıca ocağa taşımanı sağlayan bir araç ipucu gösterilecektir. + + + + {*T3*}NASIL OYNANIR : FIRLATICI{*ETW*}{*B*}{*B*} +Fırlatıcı, eşyaları fırlatmak için kullanılır. Fırlatıcıyı tetiklemek için yanına bir devre anahtarı, örneğin bir şalter yerleştirilmesi gerekmektedir.{*B*}{*B*} +Fırlatıcıyı eşya ile doldurmak için {*CONTROLLER_ACTION_USE*} düğmesine bas, sonra fırlatmak istediğin eşyaları envanterinden alarak fırlatıcıya ekle.{*B*}{*B*} +Bundan sonra devre anahtarını kullandığında, fırlatıcı eşyayı fırlatacaktır. + + + + {*T3*}NASIL OYNANIR : İKSİR YAPIMI{*ETW*}{*B*}{*B*} +İksir yapımı için, üretim masasından üretilebilen bir Simya Standı gerekmektedir. Her iksirin yapımına, Cam Şişenin bir Kazandan veya bir su kaynağından doldurulmasıyla elde edilen bir şişe su ile başlanır.{*B*} +Simya Standının şişeler için üç yuvası bulunmaktadır, böylece aynı anda üç iksir yapılabilir. Tek bir malzeme üç şişe için de kullanılabilir, yani kaynaklarını en iyi şekilde kullanmak için aynı anda üç iksir üretmeye bak.{*B*} +Simya Standının en üstüne bir iksir malzemesi koymak, kısa bir süre sonra iksirin temelinin oluşmasını sağlar. Bunun tek başına bir etkisi yoktur ancak iksir temeliyle başka bir malzemeyi karıştırmak, iksire bir etki kazandırır.{*B*} +İksiri hazırladıktan sonra, üçüncü bir malzeme ekleyerek iksirin daha uzun ömürlü (Kızıltaş Tozuyla), daha yoğun (Parıltı Taşı Tozuyla) ya da zararlı (Mayalanmış Örümcek Gözüyle) olmasını sağlayabilirsin.{*B*} +Ayrıca herhangi bir iksire barut ekleyerek onu Fırlatılabilir İksire dönüştürebilirsin. Fırlatılabilir İksir, fırlatıldığı zaman çarptığı noktada etkisini belirli bir alana yayar.{*B*} + +İksirler için gereken temel malzemeler şunlardır:{*B*}{*B*} +* {*T2*}Dip Alem Yumrusu{*ETW*}{*B*} +* {*T2*}Örümcek Gözü{*ETW*}{*B*} +* {*T2*}Şeker{*ETW*}{*B*} +* {*T2*}Fersiz Gözyaşı{*ETW*}{*B*} +* {*T2*}Alaz Tozu{*ETW*}{*B*} +* {*T2*}Magma Özü{*ETW*}{*B*} +* {*T2*}Parıldayan Kavun{*ETW*}{*B*} +* {*T2*}Kızıltaş Tozu{*ETW*}{*B*} +* {*T2*}Parıltı Taşı Tozu{*ETW*}{*B*} +* {*T2*}Mayalanmış Örümcek Gözü{*ETW*}{*B*}{*B*} + +Yapabileceğin bütün farklı iksirleri öğrenmek için bileşenlerle çeşitli kombinasyonlar denemelisin. + + + + + {*T3*}NASIL OYNANIR : GENİŞ SANDIK{*ETW*}{*B*}{*B*} +Yan yana yerleştirilen iki sandık, tek bir Geniş Sandık oluşturur. Bu sandık çok daha fazla eşya alabilir.{*B*}{*B*} +Normal sandıkla aynı şekilde kullanılır. + + + + {*T3*}NASIL OYNANIR : ÜRETİM{*ETW*}{*B*}{*B*} +Üretim arabiriminde, yeni eşyalar üretmek için envanterindeki eşyaları birleştirebilirsin. Üretim arabirimini açmak için {*CONTROLLER_ACTION_CRAFTING*} düğmesini kullan.{*B*}{*B*} +{*CONTROLLER_VK_LB*} tuşuyla sekmeler arasında gezin ve {*CONTROLLER_VK_RB*} tuşuyla üretimde kullanmak istediğin eşya türünü, {*CONTROLLER_MENU_NAVIGATE*} çubuğuyla da eşyayı seç.{*B*}{*B*} +Üretim alanı, yeni eşyayı üretebilmek için gereken eşyaları gösterir. Eşyayı üretmek ve envanterine koymak için {*CONTROLLER_VK_A*} düğmesine bas. + + + + {*T3*}NASIL OYNANIR : ÜRETİM MASASI{*ETW*}{*B*}{*B*} +Üretim Masası kullanarak daha büyük eşyalar üretebilirsin.{*B*}{*B*} +Masayı yerleştir ve kullanmak için {*CONTROLLER_ACTION_USE*} düğmesine bas.{*B*}{*B*} +Masa üzerinde üretim, basit üretim ile aynı şekilde çalışır ama daha geniş bir üretim alanına ve eşya yelpazesine sahip olursun. + + + {*T3*}NASIL OYNANIR : EFSUN{*ETW*}{*B*}{*B*} +Tecrübe Puanları, yaratıkların öldürülmesiyle, belirli blokların kazılmasıyla veya ocakta eritilmesiyle kazanılır ve bazı araçlar, silahlar, zırhlar ve kitaplar efsunlamak için kullanılabilir.{*B*} +Bir Kılıç, Yay, Balta, Kazma, Kürek, Zırh veya Kitap, Efsun Masasında kitabın altındaki yuvaya yerleştirildiğinde, yuvanın sağındaki üç düğme bir takım efsunlar ve gereken Tecrübe Seviyelerini gösterecektir.{*B*} +Eğer bu efsunları kullanmak için yeterli Tecrübe Seviyen yoksa düğmeler kırmızı, varsa yeşil yanacaktır.{*B*}{*B*} +Uygulanan asıl efsun, gösterilen bedele bağlı olarak rastgele seçilir.{*B*}{*B*} +Eğer Efsun Masasının etrafında Kitap Rafları bulunuyorsa (maksimum 15 Kitap Rafı) ve Kitaplık ile Efsun Masasının arasında bir blokluk boşluk varsa, efsunların etkisi artacaktır ve Efsun Masasındaki kitaptan büyülü gliflerin çıktığı görülecektir.{*B*}{*B*} +Efsun masası için gereken tüm malzemeler dünyadaki köylerde halihazırda veya kazı ya da keşif yaparak bulunabilir.{*B*}{*B*} +Efsunlu Kitaplar, eşyalara efsun uygulamak üzere örste kullanılır. Bu sayede eşyalarına uygulamak istediğin efsunlar üzerinde daha fazla kontrolün olur.{*B*} + + + {*T3*}NASIL OYNANIR : BÖLÜM YASAKLAMAK{*ETW*}{*B*}{*B*} +Eğer oynadığın bölümde rahatsız edici bir içerikle karşılaşırsan, o bölümü Yasaklı Bölümler listene ekleyebilirsin. +Bunu yapmak için Duraklatma menüsünü açın ve {*CONTROLLER_VK_RB*} düğmesine basarak Bölüm Yasaklamayı seçin. +İleride bu bölüme tekrar girmek isterseniz, bölümün Yasaklı Bölümler listenizde olduğuna dair bir uyarı alacaksınız ve dilerseniz bölümü listeden kaldırıp devam edebilecek ya da bölüme girmekten vazgeçebileceksiniz. + + + {*T3*}NASIL OYNANIR : KURUCU VE OYUNCU SEÇENEKLERİ{*ETW*}{*B*}{*B*} +{*T1*}Oyun Seçenekleri{*ETW*}{*B*} +Bir dünyayı yüklerken veya oluştururken, oyun üzerindeki hakimiyetinizi artıracak bir menüye "Daha Fazla Seçenek" düğmesine basarak ulaşabilirsin.{*B*}{*B*} + {*T2*}Oyuncuya Karşı Oyuncu{*ETW*}{*B*} + Bu seçenek etkinleştirildiğinde, oyuncular diğer oyunculara hasar verebilir. Bu seçenek sadece Sağ Kalma Modunda etkilidir.{*B*}{*B*} + {*T2*}Oyunculara Güven{*ETW*}{*B*} + Bu seçenek kapatılınca, oyuna katılan oyuncuların yapabileceği şeyler kısıtlanır. Kazamaz veya eşya kullanamaz, blok yerleştiremez, kapı ve düğmeleri kullanamaz, konteynerleri kullanamaz, oyunculara veya hayvanlara saldıramazlar. Bu seçeneği belli bir oyuncu üstünde oyun içi menüsünü kullanarak değiştirebilirsin.{*B*}{*B*} + {*T2*}Ateş Yayılması{*ETW*}{*B*} + Etkinleştirildiğinde, ateş yakındaki yanıcı bloklara sıçrayabilir. Bu seçenek oyun içindeyken de değiştirilebilir.{*B*}{*B*} + + {*T2*}TNT Patlaması{*ETW*}{*B*} + Etkinleştirildiğinde, TNT patlatıldığında infilak eder. Bu seçenek oyun içindeyken de değiştirilebilir.{*B*}{*B*} + {*T2*}Kurucu Ayrıcalıkları{*ETW*}{*B*} + Etkinleştirildiğinde, oyun kurucusu uçabilir, yorgunluğu kaldırabilir ve kendisini görünmez yapabilir. Bu seçenek kupaları ve sıralama tablosu güncellemelerini iptal eder, bu seçenek açıkken kaydedilirse tekrar yüklendiğinde de bu böyle devam eder. {*DISABLES_ACHIEVEMENTS*}{*B*}{*B*} + {*T2*}Gün Işığı Döngüsü{*ETW*}{*B*} + Kapatıldığında günün vakti değişmez.{*B*}{*B*} + {*T2*}Envanteri Koru{*ETW*}{*B*} + Açıldığında oyuncular öldükleri zaman envanterlerini korurlar.{*B*}{*B*} + {*T2*}Yaratık Canlanması{*ETW*}{*B*} + Kapatıldığında, yaratıklar doğal şekilde canlanmazlar.{*B*}{*B*} + {*T2*}Yaratık Hasarı{*ETW*}{*B*} + Kapatıldığında, canavarların ve hayvanların blokları değiştirmesini (örneğin Ürperten patlayınca bloklar zarar görmez ve Koyun çimenleri yok etmez) ya da eşyaları almasını engeller.{*B*}{*B*} + {*T2*}Yaratık Ganimetleri{*ETW*}{*B*} + Kapatıldığında canavarlar ve hayvanlar ganimet düşürmezler (örneğin Ürpertenler barut düşürmezler).{*B*}{*B*} + {*T2*}Döşeme Parçaları{*ETW*}{*B*} + Kapatıldığında bloklar yok oldukları zaman eşya düşürmezler (örneğin Taş bloklar parke taşı düşürmezler).{*B*}{*B*} + {*T2*}Doğal Yenilenme{*ETW*}{*B*} + Kapatıldığında oyuncular sağlıklarını doğal olarak yenileyemezler.{*B*}{*B*} +{*T1*}Dünya Üretme Seçenekleri{*ETW*}{*B*} +Yeni bir dünya oluştururken bazı ek seçenekler vardır.{*B*}{*B*} + {*T2*}Yapı Üret{*ETW*}{*B*} + Etkinleştirildiğinde, dünyada Köyler ve Kaleler gibi yapılar üretilir.{*B*}{*B*} + {*T2*}Aşırı Düz Dünya{*ETW*}{*B*} + Etkinleştirildiğinde, Üstdünya ve Dip Alem'de tamamen düz bir dünya üretilir.{*B*}{*B*} + {*T2*}Bonus Sandık{*ETW*}{*B*} + Etkinleştirildiğinde, oyuncu canlanma noktalarının yakınında faydalı eşyalar içeren bir sandık meydana gelir.{*B*}{*B*} + {*T2*}Dip Alemi Sıfırla{*ETW*}{*B*} + Etkinleştirildiğinde, Dip Alem yeniden yaratılacaktır. Dip Alem Kalelerinin yer almadığı eski kayıtlara sahipsen, bu seçenek faydalıdır.{*B*}{*B*} +{*T1*}Oyun İçi Seçenekleri{*ETW*}{*B*} +Oyundayken bir dizi seçeneği içeren oyun içi menüsüne {*BACK_BUTTON*} düğmesine basarak erişebilirsin.{*B*}{*B*} + {*T2*}Oyun Kurucusu Seçenekleri{*ETW*}{*B*} + Oyun kurucu oyuncu veya denetleyici olarak atanan oyuncular "Oyun Kurucusu Seçenekleri" menüsüne ulaşabilir. Bu menüden ateşin yayılması ve TNT paylaması açılıp kapatılabilir.{*B*}{*B*} +{*T1*}Oyuncu Seçenekleri{*ETW*}{*B*} +Bir oyuncunun ayrıcalıklarını değiştirmek için, adını seçin ve oyuncu ayrıcalıkları menüsünü açmak için {*CONTROLLER_VK_A*} düğmesine basın. Buradan aşağıdaki seçenekler kullanılabilir.{*B*}{*B*} + {*T2*}İnşa Edebilir ve Kazabilir{*ETW*}{*B*} + Bu seçenek sadece "Oyunculara Güven" kapalıyken mevcuttur. Bu seçenek açıkken, oyuncu dünyayla normal bir etkileşim halindedir. Devre dışı bırakıldığında, oyuncu blok yerleştiremez veya yok edemez veya birçok eşya ve blokla etkileşime geçemez.{*B*}{*B*} + {*T2*}Kapıları ve Düğmeleri Kullanabilir{*ETW*}{*B*} + Bu seçenek sadece "Oyunculara Güven" kapalıyken mevcuttur. Bu seçenek kapalıyken, oyuncu kapıları ve düğmeleri kullanamaz.{*B*}{*B*} + {*T2*}Konteynerleri Açabilir{*ETW*}{*B*} + Bu seçenek sadece "Oyunculara Güven" kapalıyken mevcuttur. Bu seçenek kapalıyken, oyuncu sandıklar gibi konteynerleri açamaz.{*B*}{*B*} + {*T2*}Oyunculara Saldırabilir{*ETW*}{*B*} + Bu seçenek sadece "Oyunculara Güven" kapalıyken mevcuttur. Bu seçenek kapalıyken, oyuncu diğer oyunculara hasar veremez.{*B*}{*B*} + {*T2*}Hayvanlara Saldırabilir{*ETW*}{*B*} + Bu seçenek sadece "Oyunculara Güven" kapalıyken mevcuttur. Bu seçenek devre dışı iken, oyuncu hayvanlara hasar veremez.{*B*}{*B*} + {*T2*}Denetleyici{*ETW*}{*B*} + Bu seçenek etkinken, oyuncu diğer oyuncuların ayrıcalıklarını değiştirebilir (oyun kurucusu hariç) eğer "Oyunculara Güven" kapalıysa, oyuncuları atabilir veya ateşin yayılması ve TNT patlaması seçeneklerini açıp kapatabilir.{*B*}{*B*} + {*T2*}Oyuncuyu At{*ETW*}{*B*} + {*KICK_PLAYER_DESCRIPTION*}{*B*}{*B*} +{*T1*}Oyun Kurucusu Seçenekleri{*ETW*}{*B*} +Eğer "Oyun Kurucusu Ayrıcalıkları" açıksa oyuncu kendisi için bazı ayrıcalıkları değiştirebilir. Bir oyuncunun ayrıcalıklarını değiştirmek için, onun adını seç ve oyuncu ayrıcalıkları menüsünü açmak için {*CONTROLLER_VK_A*} düğmesine bas. Buradan aşağıdaki seçenekleri değiştirebilirsin.{*B*}{*B*} + {*T2*}Uçabilir{*ETW*}{*B*} + Bu seçenek açıkken, oyuncu uçabilir. Bu seçenek sadece Sağ Kalma Modunda vardır, çünkü Yaratıcılık Modunda tüm oyuncular uçabilir.{*B*}{*B*} + {*T2*}Yorulmayı Kaldır{*ETW*}{*B*} + Bu seçenek sadece Sağ Kalma Modunu etkiler. Açıkken, fiziksel etkinlikler (yürüme/koşma/zıplama vs.) yiyecek çubuğunu azaltmaz. Ancak, oyuncu yaralanınca, yiyecek çubuğu oyuncu iyileştiği sürece azalır.{*B*}{*B*} + {*T2*}Görünmez{*ETW*}{*B*} + Bu seçenek açıkken oyuncu diğer oyunculara görünmez olur ve hasar almaz.{*B*}{*B*} + {*T2*}Işınlanabilir{*ETW*}{*B*} + Bu seçenek oyuncuların diğerlerini ya da kendilerini dünyadaki diğer oyunculara taşımasını sağlar. + + + Sonraki Sayfa + + + {*T3*}NASIL OYNANIR : ÇİFTLİK HAYVANLARI{*ETW*}{*B*}{*B*} +Eğer hayvanlarını tek bir yerde tutmak istiyorsan, 20x20 bloktan daha ufak bir alanı çitle kapat ve hayvanlarını içine sok. Böylece geri geldiğinde hayvanların hâlâ orada olacak. + + + + {*T3*}NASIL OYNANIR : DAMIZLIK HAYVANLAR{*ETW*}{*B*}{*B*} +Minecraft'taki hayvanlar çoğalabilir ve kendilerine benzeyen yavrular yapabilir!{*B*} +Hayvanların yavrulamasını sağlamak için, onları 'Aşk Moduna' sokacak doğru yiyecekle beslemen gerekiyor.{*B*} +İneğe, möntara veya koyuna buğday verirsen, domuza havuç verirsen; tavuğa Buğday Tohumu veya Dip Alem Yumrusu; kurda ise herhangi bir et verirsen, yakınlarda Aşk Modunda olan aynı türden başka bir hayvan aramaya başlayacaktır.{*B*} +Aynı türdeki iki hayvan bir araya gelince, eğer Aşk Modundalarsa, birkaç saniyeliğine öpüştükten sonra ortaya bir yavru çıkacaktır. Yavru hayvan, büyüyüp gerçek boyutlarda bir hayvan olana kadar anne babasını takip eder.{*B*} +Aşk Modundaki bir hayvanın, tekrar Aşk Moduna girebilmesi için en az beş dakika beklemesi gerekmektedir.{*B*} +Her dünya için belirli bir hayvan sınırı vardır, bu yüzden çok sayıda hayvana ulaşınca hayvanların artık yavrulamazlar. + + + {*T3*}NASIL OYNANIR : DİP ALEM PORTALI{*ETW*}{*B*}{*B*} +Dip Alem Portalı, oyuncunun Üstdünya ve Dip Alem arasında gezinebilmesini sağlar. Dip Alem, Üstdünya'da daha hızlı hareket edebilmek için kullanılabilir. Dip Alem'de gidilen 1 blok, Üstdünya'da 3 bloğa eşittir, yani Dip Alem'de inşa ettiğin bir portaldan çıkarsan, kendini giriş noktana göre üç katı uzakta bulursun.{*B*}{*B*} +Portalı inşa edebilmek için en az 10 Obsidiyen bloğu gerekmektedir. Portal 5 blok yüksekliğinde, 4 blok genişliğinde ve 1 blok derinliğinde olmalıdır. Portal Çerçevesi yapıldıktan sonra, çerçevenin içerisindeki boşluk, aktifleşebilmesi için yakılmalıdır. Bu işlem, Çakmak Taşı ve Çelik eşyası ya da Kor ile gerçekleştirilebilir.{*B*}{*B*} +Portal inşasına ait örnek resimler sağ tarafta bulunabilir. + + + {*T3*}NASIL OYNANIR : SANDIK{*ETW*}{*B*}{*B*} +Bir Sandık ürettiğin zaman, onu bu dünyaya yerleştirebilir ve envanterindeki eşyaları depolamak üzere {*CONTROLLER_ACTION_USE*} düğmesine basarak kullanabilirsin.{*B*}{*B*} +Envanterin ve sandık arasında eşyaları taşımak için imlecini kullan.{*B*}{*B*} +Sandıktaki eşyalar, sen onları tekrar envanterine geçirene kadar orada saklanır. + + + Minecon'a geldin mi? + + + Mojang'ta hiç kimse daha önce Junkboy'un yüzünü görmedi. + + + Bir Minecraft Viki'sinin olduğunu biliyor muydun? + + + Böceklere doğrudan bakma. + + + Ürpertenler, bir kodlama hatası sonucu ortaya çıktı. + + + Bu bir tavuk mu yoksa bir ördek mi? + + + Mojang'ın yeni ofisi oldukça havalı! + + + {*T3*}NASIL OYNANIR : TEMEL ÖĞELER{*ETW*}{*B*}{*B*} +Minecraft, aklınıza gelen her şeyi bloklarla inşa edebileceğiniz bir oyundur. Geceleri canavarlar ortaya çıkarlar ve onlardan korunmak için barınak inşa etmeniz gerekmektedir.{*B*}{*B*} +Etrafa bakınmak için {*CONTROLLER_ACTION_LOOK*} düğmesini kullan.{*B*}{*B*} +Etrafta dolaşmak için {*CONTROLLER_ACTION_MOVE*} çubuğunu kullan.{*B*}{*B*} +Zıplamak için {*CONTROLLER_ACTION_JUMP*} düğmesini kullan.{*B*}{*B*} +Koşmak için hızlıca {*CONTROLLER_ACTION_MOVE*} çubuğunu iki defa ileri it. {*CONTROLLER_ACTION_MOVE*} çubuğunu iterken karakter, koşma süresi sona erene veya Yiyecek Göstergesi {*ICON_SHANK_03*} değerinden az gösterene dek koşmaya devam edecektir.{*B*}{*B*} +Çıplak elinle veya elindeki aletle kazı yapmak için {*CONTROLLER_ACTION_ACTION*} düğmesini basılı tut. Bazı blokları kazabilmek için belirli aletlere ihtiyacın olabilir.{*B*}{*B*} +Eğer elinde bir eşya tutuyorsan, o eşyayı kullanmak için {*CONTROLLER_ACTION_USE*} düğmesine, yere bırakmak için {*CONTROLLER_ACTION_DROP*} düğmesine bas. + + + {*T3*}NASIL OYNANIR : GÖSTERGE{*ETW*}{*B*}{*B*} +Gösterge, durumun hakkında bilgileri gösterir: sağlığın, su altındayken kalan oksijen miktarın, açlık seviyen (bunu yenilemek için bir şeyler yemelisin) ve eğer giymişsen zırhın. Eğer sağlığından biraz kaybedersen ama yiyecek çubuğunda 9 veya daha fazla {*ICON_SHANK_01*} varsa, sağlığın otomatik olarak yenilenecektir. Yiyecek tüketmek ise yiyecek çubuğunu yeniler.{*B*} +Tecrübe çubuğu da burada yer alır, üzerinde Tecrübe Seviyeni gösteren numaralar vardır ve bir sonraki Tecrübe Seviyesi için ne kadar Tecrübe Puanına ihtiyaç duyduğun da burada gösterilir. Tecrübe Puanları, yaratıkların öldükleri zaman düşürdükleri Tecrübe Kürelerinin toplanmasıyla, belirli blokların kazılmasıyla, hayvanların yetiştirilmesiyle, balıkçılıkla ve ocakta cevherlerin eritilmesiyle kazanılır.{*B*}{*B*} +Gösterge ayrıca kullanılabilir eşyaları gösterir. Elindeki eşyayı değiştirmek için {*CONTROLLER_ACTION_LEFT_SCROLL*} ve {*CONTROLLER_ACTION_RIGHT_SCROLL*} tuşlarını kullan. + + + {*T3*}NASIL OYNANIR : ENVANTER{*ETW*}{*B*}{*B*} +Envanterine bakmak için {*CONTROLLER_ACTION_INVENTORY*} düğmesini kullan.{*B*}{*B*} +Bu ekran, elindeki kullanılabilir eşyaları ve taşıdığın diğer tüm eşyaları göstermektedir. Ayrıca zırhın da burada gösterilir.{*B*}{*B*} +İmleci hareket ettirmek için {*CONTROLLER_MENU_NAVIGATE*} çubuğunu kullan. İmlecin ucundaki eşyayı almak için {*CONTROLLER_VK_A*} düğmesine bas. Eğer birden fazla eşya bulunuyorsa, bu eylem hepsini birden almanı sağlar. Sadece yarısını almak istiyorsan {*CONTROLLER_VK_X*} düğmesini kullan.{*B*}{*B*} +Eşyayı imleçle envanterdeki başka bir boşluğa götürerek oraya yerleştirmek için {*CONTROLLER_VK_A*} düğmesini kullan. İmlecin ucunda birden fazla eşya varsa, hepsini yerleştirmek için {*CONTROLLER_VK_A*}, sadece bir tanesini yerleştirmek için {*CONTROLLER_VK_X*} düğmesine bas.{*B*}{*B*} +Eğer bu eşya bir zırh ise, onu hızlıca envanterdeki zırh yuvasına taşımanı sağlayan bir araç ipucu gösterilecektir.{*B*}{*B*} +Deri Zırhının rengini, onu boyayarak değiştirmen mümkündür. Envanter menüsünde, imlecin ucunda boyayı tutup, boyamak istediğin şeyin üzerine getirip {*CONTROLLER_VK_X*} düğmesine basarak bu işlemi gerçekleştirebilirsin. + + + Minecon 2013, Orlando, Florida, ABD'de gerçekleştirildi! + + + .party() mükemmeldi! + + + Söylentilere her zaman yalan oldukları gözüyle bakın, doğru oldukları değil! + + + Önceki Sayfa + + + Ticaret + + + Örs + + + Son + + + Bölüm Yasaklamak + + + Yaratıcılık Modu + + + Kurucu ve Oyuncu Seçenekleri + + + {*T3*}NASIL OYNANIR : SON{*ETW*}{*B*}{*B*} +Son, oyundaki boyutlardan biridir ve aktif bir Son Portalı ile ulaşılabilir. Son Portalı, Üstdünya'nın derinliklerinde yer alan bir Kalenin içinde bulunabilir.{*B*} +Son Portalını aktifleştirmek için, herhangi bir Son Portalı Çerçevesinin içine Sonveren Gözü koyman gerekir.{*B*} +Portal aktifleştirildiği zaman içine girerek Son boyutuna geçebilirsin.{*B*}{*B*} +Son boyutunda, vahşi ve güçlü bir düşman olan Sonveren Ejderha ve bir sürü Sonveren Adam ile karşılaşacaksın, bu yüzden oraya gitmeden önce iyice hazırlansan iyi edersin!{*B*}{*B*} +Ayrıca, sekiz Obsidiyen dikeninin üzerinde, Sonveren Ejderhanın kendisini iyileştirmek için kullandığı Sonveren Kristallerinden bulacaksın +yani savaştaki öncelikli amacın, bunların her birini yok etmek olmalı.{*B*} +İlk birkaç tanesi ok ile vurulabilir, ancak diğerleri Demir Çit kafeslerle korunduğu için onlara ulaşana kadar bir şeyler inşa etmen gerekiyor.{*B*}{*B*} +Bunu yaparken Sonveren Ejderha sana doğru uçarak sana saldıracak ve Sonveren asit toplarını püskürtecek!{*B*} +Eğer dikenlerin merkezindeki Yumurta Platformuna yaklaşacak olursan, Sonveren Ejderha aşağı uçarak sana saldıracak. İşte tam bu noktada ona çok fazla hasar verebilirsin!{*B*} +Sonveren Ejderha'nın asitli nefesinden kaçın ve en iyi sonuç için gözlerini hedef al. Mümkünse, seninle birlikte savaşmaları için Son boyutuna birkaç arkadaşını getir!{*B*}{*B*} +Son boyutuna geçtiğin zaman, arkadaşların haritalarında Kalelerin içindeki Son Portalının yerini görebilecekler, +böylece kolayca yardımına koşabilirler. + + + + {*ETB*}Tekrar hoş geldin! Belki fark etmemiş olabilirsin ama Minecraft'ın güncellendi.{*B*}{*B*} +Sen ve arkadaşların için birçok yeni özellik bulunuyor ama aşağıya bazı önemli olanları yazdık. Oku ve sonra bu yeniliklerin tadını çıkarmaya başla!{*B*}{*B*} +{*T1*}Yeni Eşyalar{*ETB*} - Sertleştirilmiş Kil, Lekeli Kil, Kömür Bloğu, Saman Balyası, Etkinleştirici Ray, Kızıltaş Bloğu, Günışığı Sensörü, Düşürücü, Huni, Hunili Maden Arabası, TNT'li Maden Arabası, Kızıltaş Karşılaştırıcısı, Tartılı Basınç Plakası, Fener, Kilitli Sandık, Havai Fişek Roketi, Havai Fişek Yıldızı, Dip Yıldızı, Tasma, At Zırhı, İsim Etiketi, At Canlandırma Yumurtası{*B*}{*B*} +{*T1*}Yeni Yaratıklar{*ETB*} - Solgun, Solgun İskeletleri, Cadılar, Yarasalar, Atlar, Eşekler ve Katırlar{*B*}{*B*} +{*T1*}Yeni Özellikler{*ETB*} – Bir atı evcilleştir ve sür, havai fişekler üretip kullan, İsim Etiketi ile hayvanlara ve canavarlara isim ver, daha gelişmiş Kızıltaş devreleri oluşturve dünyandaki misafirlerin neler yapabileceğini kontrol etmene yardımcı olacak Ev Sahibi Seçeneklerine göz at!{*B*}{*B*} +{*T1*}Yeni Eğitim Dünyası{*ETB*} – Yeni ve eski özellikleri nasıl kullanacağını Eğitim Dünyasında öğren. Dünyada saklı olan Müzik CD’lerini bulabilecek misin bir bak!{*B*}{*B*} + + + Ele göre daha fazla hasar verir. + + + Toprağı, çimeni, kumu, çakılı ve karı, ele göre daha hızlı bir şekilde kazmak için kullanılır. Kartopu yapmak için kürek gerekmektedir. + + + Koşma + + + Yeni Ne Var + + + {*T3*}Değişiklikler ve Eklemeler{*ETW*}{*B*}{*B*} +- Yeni eşyalar eklendi - Sertleştirilmiş Kil, Lekeli Kil, Kömür Bloğu, Saman Balyası, Etkinleştirici Ray, Kızıltaş Bloğu, Günışığı Sensörü, Düşürücü, Huni, Hunili Maden Arabası, TNT'li Maden Arabası, Kızıltaş Karşılaştırıcısı, Tartılı Basınç Plakası, Fener, Kilitli Sandık, Havai Fişek Roketi, Havai Fişek Yıldızı, Dip Yıldızı, Tasma, At Zırhı, İsim Etiketi, At Canlandırma Yumurtası.{*B*} +- Yeni yaratıklar eklendi - Solgun, Solgun İskeletleri, Cadılar, Yarasalar, Atlar, Eşekler ve Katırlar.{*B*} +- Yeni arazi yaratma özellikleri eklendi – Cadı Barakaları.{*B*} +- Fener arayüzü eklendi.{*B*} +- At arayüzü eklendi.{*B*} +- Huni arayüzü eklendi.{*B*} +- Havai Fişekler eklendi – Elinde bir Havai Fişek Yıldızı ya da Havai Fişek Roketi yapacak bileşenler varsa Havai Fişeklerin arayüzüne, Üretim Masasından erişebilirsin.{*B*} +- ‘Macera Modu’ eklendi – Blokları yalnızca doğru aletlerle kırabilirsin.{*B*} +- Birçok yeni ses eklendi.{*B*} +- Yaratıklar, eşyalar ve mermiler artık portalların içinden geçebiliyor.{*B*} +- Yineleyiciler artık başka bir Yineleyici ile güçlendirilerek kilitlenebilirler.{*B*} +- Zombiler ve İskeletler artık farklı silah ve zırhlar ile canlanabilirler.{*B*} +- Yeni ölüm mesajları.{*B*} +- İsim Etiketi ile yaratıkları isimlendir ve menü açılınca çıkan başlığı değiştirmek için konteynerleri yeniden adlandır.{*B*} +- Kemik Tozu artık her şeyi anında tam boyutuna getirmiyor, bunun yerine rastgele olarak kademeli şekilde büyütüyor.{*B*} +- Sandıkların, Pişirme Standlarının,Fırlatıcıların ve Müzik Kutularının içeriklerini tanımlayan bir Kızıltaş sinyali, artık doğrudan onlara karşı bir Kızıltaş Karşılaştırıcısı yerleştirilerek tespit edilebilir.{*B*} +- Fırlatıcılar her yöne çevrilebilir.{*B*} +- Bir Altın Elma yemek, oyuncuya kısa süreliğine ekstra ‘soğurum’ kazandırıyor.{*B*} +- Bir bölgede ne kadar uzun kalırsan, canavarların o bölgede canlanması o kadar zor hale geliyor.{*B*} + + + Ekran Görüntüsü Paylaşmak + + + Sandıklar + + + Üretim + + + Ocak + + + Temel Öğeler + + + Gösterge + + + Envanter + + + Fırlatıcı + + + Efsun + + + Dip Alem Portalı + + + Çok Oyunculu + + + Çiftlik Hayvanları + + + Damızlık Hayvanlar + + + İksir Yapımı + + + deadmau5, Minecraft'ı çok seviyor! + + + Domuzadamlar, sen onlara saldırmadığın sürece sana saldırmazlar. + + + Yatakta uyuyarak oyun canlanma noktanı değiştirebilir ve gündüz olmasını sağlayabilirsin. + + + Ateş toplarını Fersiz'e geri gönder! + + + Geceleri etrafı aydınlatmak için meşale yap. Canavarlar, meşale ile aydınlatılan yerlerden uzak duracaktır. + + + Maden arabası ve raylar ile istediğin yere hızlıca git! + + + Ağaç olması için birkaç fidan dik. + + + Portal inşa ederek başka bir boyuta, Dip Alem'e geçebilirsin. + + + Dümdüz aşağı veya yukarı kazmak iyi bir fikir değildir. + + + Kemik Tozu (İskelet kemiğinden üretilen), gübre olarak kullanılabilir ve ürünlerin çok hızlı bir şekilde büyümesini sağlar! + + + Ürpertenler, sana çok yaklaşırlarsa patlarlar! + + + Elindeki eşyayı yere bırakmak için {*CONTROLLER_VK_B*} düğmesine bas! + + + İşe uygun araç gereçler kullan! + + + Meşale yapmak için hiç kömür bulamıyorsan, ocak kullanarak ağaçlardan odun kömürü yapabilirsin. + + + Pişmiş domuz pirzolası, çiğ domuz pirzolasından daha fazla sağlık verir. + + + Eğer oyun zorluğunu Huzurlu olarak ayarlarsan, sağlığın otomatik olarak dolacak ve geceleri canavarlar gelmeyecek! + + + Bir kurdu evcilleştirmek için ona bir kemik ver. Böylece oturmasını veya seni takip etmesini sağlayabilirsin. + + + Envanter menüsündeyken, imleci menüden dışarı kaydırıp {*CONTROLLER_VK_A*} düğmesine basarak eşyaları yere bırakabilirsin. + + + Yeni bir İndirilebilir İçerik var! Ana Menüdeki Minecraft Mağazası düğmesinden ulaşabilirsin. + + + Karakterinin görünümünü, Minecraft Mağazasındaki Görünüm Paketleri ile değiştirebilirsin. Mevcut paketlere bakmak için Ana Menüden 'Minecraft Mağazasını' seç. + + + Oyunu daha aydınlık ya da karanlık yapmak için gamma ayarını değiştir. + + + Geceleri bir yatakta uyumak gün doğumunu hızlandırır. Fakat çok oyunculu bir oyunda, tüm oyuncuların yataklarında aynı anda uyumaları gerekiyor. + + + Toprağı ekim yapmak üzere hazırlamak için çapa kullan. + + + Örümcekler, sen onlara saldırmadığın sürece gündüz vakti sana saldırmazlar. + + + Toprağı veya kumu bahçıvan küreği ile kazmak, elinle kazmaktan daha kolaydır! + + + Domuzlardan domuz pirzolası elde et ve sağlığını kazanmak için pişirip ye. + + + İneklerden deri elde et ve zırh yapmak için kullan. + + + Eğer boş bir kovan varsa su, lav ya da inek sütü ile doldurabilirsin! + + + Obsidiyen, lav ile suyun birbirine temas etmesiyle oluşur. + + + İstiflenebilir çitler oyuna eklendi! + + + Eğer elinde buğday varsa bazı hayvanlar seni takip edecektir. + + + Eğer bir hayvan, herhangi bir yönde 20 bloktan fazla uzaklaşamazsa, ortadan kaybolmayacaktır. + + + Evcil kurtlar, sağlığını kuyruklarının pozisyonu ile gösterir. Onları iyileştirmek için etle besle. + + + Yeşil boya elde etmek için ocakta kaktüs pişir. + + + Nasıl Oynanır menülerindeki Neler Yeni kısmını okuyarak oyun hakkındaki son güncellemeleri öğrenebilirsin. + + + Müzik: C418 + + + Notch kimdir? + + + Mojang'ın, çalışanlarından daha fazla ödülü var! + + + Bazı ünlü insanlar Minecraft oynuyor! + + + Notch'un Twitter'da bir milyondan fazla takipçisi bulunuyor! + + + Tüm İsveçliler sarışın değildir. Hatta Mojang'tan Jens gibi bazıları kızıldır! + + + Bir gün bu oyuna bir güncelleme gelecek! + + + Yan yana iki sandık koyarak tek bir geniş sandık oluşturabilirsin. + + + Açık havada yün kullanarak yapı inşa ederken dikkatli ol. Fırtına sırasında yıldırımlar yünü tutuşturabilir. + + + Sadece bir kova lav, ocak içerisinde 100 bloğu eritmek için kullanılabilir. + + + Nota bloğu tarafından çalınan enstrüman, altındaki malzemeye bağlı olarak değişebilir. + + + Kaynak blok yok edildiği zaman lavın ortadan TAMAMEN kaybolması dakikalar alabilir. + + + Parke taşı, Fersiz ateş toplarına karşı dayanıklıdır. Bu yüzden portal savunması için kullanışlıdır. + + + Işık kaynağı olarak kullanılabilen bloklar karı ve buzu eritir. Buna meşaleler, parıltı taşı ve Cadılar Bayramı Kabağı dahildir. + + + Zombiler ve İskeletler, eğer suyun altındalarsa gündüzleri de hayatta kalabilirler. + + + Tavuklar, her 5 veya 10 dakikada bir yumurtlarlar. + + + Obsidiyen, sadece elmastan bir kazma ile çıkartılabilir. + + + Ürpertenler, en kolay erişilebilen barut kaynağıdır. + + + Bir kurda saldırmak, yakın çevredeki tüm kurtların sana saldırmasına sebep olur. Bu durum Zombi Domuzadamlar için de geçerlidir. + + + Kurtlar Dip Alem'e geçemezler. + + + Kurtlar Ürpertenlere saldırmazlar. + + + Taş blokları ve cevherleri kazmak için gereklidir. + + + Kek tarifinde ve iksir yapımında malzeme olarak kullanılır. + + + Açılıp kapatılarak elektrik yükü göndermesi için kullanılır. Tekrar basılana dek açık veya kapalı durumda bekler. + + + Sabit bir şekilde elektrik yükü gönderir veya bir bloğun yanına bağlandığında alıcı/verici olarak kullanılabilir. +Alt seviyelerdeki ışıklandırma için de kullanılabilir. + + + 2 {*ICON_SHANK_01*} yeniler ve altından bir elma yapılabilir. + + + 2 {*ICON_SHANK_01*} yeniler ve 4 saniye boyunca sağlık verir. Bir elmadan veya altın külçelerinden üretilir. + + + 2 {*ICON_SHANK_01*} yeniler. Bunu yemek zehirlenmene neden olabilir. + + + Kızıltaş devrelerinde yineleyici, geciktirici ve/veya diyot olarak kullanılır. + + + Maden arabalarını yönlendirmek için kullanılır. + + + Enerji aldığında, üzerinden geçen maden arabalarını hızlandırır. Enerji kesildiğinde ise maden arabalarının tam üzerinde durmasını sağlar. + + + Basınç Plakası gibi işler (enerji aldığında bir Kızıltaş sinyali gönderir) ama sadece bir maden arabası ile çalıştırılabilir. + + + Basıldığı zaman bir elektrik yükü göndermek için kullanılır. Kapanmadan önce yaklaşık olarak bir saniye açık kalır. + + + Kızıltaş yükü verildiği zaman eşyaları rastgele fırlatmak için kullanılır. + + + Tetiklendiği zaman bir nota çalar. Notanın perdesini değiştirmek için ona dokun. Bunu farklı blokların üzerine yerleştirmek enstrümanı değiştirir. + + + 2.5 {*ICON_SHANK_01*} yeniler. Ocakta çiğ balığın pişirilmesiyle yapılır. + + + 1 {*ICON_SHANK_01*} yeniler. + + + 1 {*ICON_SHANK_01*} yeniler. + + + 3 {*ICON_SHANK_01*} yeniler. + + + Yay için cephane olarak kullanılır. + + + 2.5 {*ICON_SHANK_01*} yeniler. + + + 1 {*ICON_SHANK_01*} yeniler. 6 defa kullanılabilir. + + + 1 {*ICON_SHANK_01*} yeniler veya ocakta pişirilebilir. Bunu yemek zehirlenmene neden olabilir. + + + 1.5 {*ICON_SHANK_01*} yeniler veya ocakta pişirilebilir. + + + 4 {*ICON_SHANK_01*} yeniler. Çiğ domuz pirzolasının ocakta pişirilmesiyle yapılır. + + + 1 {*ICON_SHANK_01*} yeniler veya ocakta pişirilebilir. Evcilleştirmek için bir Oseloya da verilebilir. + + + 3 {*ICON_SHANK_01*} yeniler. Çiğ tavuğun ocakta pişirilmesiyle yapılır. + + + 1.5 {*ICON_SHANK_01*} yeniler veya ocakta pişirilebilir. + + + 4 {*ICON_SHANK_01*} yeniler. Çiğ etin ocakta pişirilmesiyle yapılır. + + + Raylar boyunca seni, bir hayvanı veya bir canavarı taşımak için kullanılır. + + + Açık mavi yün yapmak için boya olarak kullanılır. + + + Camgöbeği yün yapmak için boya olarak kullanılır. + + + Mor yün yapmak için boya olarak kullanılır. + + + Açık yeşil yün yapmak için boya olarak kullanılır. + + + Gri yün yapmak için boya olarak kullanılır. + + + Açık gri yün yapmak için boya olarak kullanılır. +(Not: Açık gri boya, gri boya ile kemik tozunun karıştırılmasıyla da üretilebilir. Böylece her bir mürekkep kesesinden üç yerine dört adet açık gri boya üretilebilir.) + + + Galibarda yün yapmak için boya olarak kullanılır. + + + Meşalelerden daha parlak ışık üretmek için kullanılır. Karı ve buzu eritir ve su altında kullanılabilir. + + + Kitaplar ve haritalar yapmak için kullanılır. + + + Kitap rafı oluşturmak veya efsunlanarak Efsunlu Kitap yapmak için kullanılabilir. + + + Mavi yün yapmak için boya olarak kullanılır. + + + Müzik CDleri çalar. + + + Dayanıklı araçlar, silahlar veya zırh yapmak için bunları kullan. + + + Turuncu yün yapmak için boya olarak kullanılır. + + + Koyunlardan toplanır ve boyalar ile renklendirilebilir. + + + İnşaat malzemesi olarak kullanılabilir ve boyanabilir. Bu tarif tavsiye edilmez çünkü Yün, Koyunlardan kolayca elde edilebilmektedir. + + + Siyah yün yapmak için boya olarak kullanılır. + + + Raylar boyunca mal taşımak için kullanılır. + + + İçine kömür konulduğunda raylar boyunca hareket eder ve diğer maden arabalarını iter. + + + Suda, yüzmekten daha hızlı hareket edebilmek için kullanılır. + + + Yeşil yün yapmak için boya olarak kullanılır. + + + Kırmızı yün yapmak için boya olarak kullanılır. + + + Ekinleri, ağaçları, uzun çimenleri, dev mantarları ve çiçekleri anında büyütmek için kullanılır ve boya tariflerinde yer alır. + + + Pembe yün yapmak için boya olarak kullanılır. + + + Kahverengi yün yapmak için boya olarak, kurabiyede malzeme olarak veya Kakao Tohumları yetiştirmek için kullanılır. + + + Gümüş rengi yün yapmak için boya olarak kullanılır. + + + Sarı yün yapmak için boya olarak kullanılır. + + + Ok ile mesafeli saldırılara imkan tanır. + + + Giyildiği zaman giyen kişiye 5 Zırh verir. + + + Giyildiği zaman giyen kişiye 3 Zırh verir. + + + Giyildiği zaman giyen kişiye 1 Zırh verir. + + + Giyildiği zaman giyen kişiye 5 Zırh verir. + + + Giyildiği zaman giyen kişiye 2 Zırh verir. + + + Giyildiği zaman giyen kişiye 2 Zırh verir. + + + Giyildiği zaman giyen kişiye 3 Zırh verir. + + + Bu malzemeden yapılmış araçlar üretmek için kullanılabilen, parlak bir külçe. Ocakta cevherin eritilmesiyle üretilmiştir. + + + Külçelerin, mücevherlerin veya boyaların, yerleştirilebilir bloklara dönüştürülmesini sağlar. Pahalı bir bina bloğu veya gelişmiş bir cevher deposu olarak kullanılabilir. + + + Bir oyuncu, bir hayvan veya bir canavar üstüne bastığı zaman bir elektrik yükü göndermesi için kullanılır. Ahşap Basınç Plakaları, üstlerine bir şey konulduğu zaman da çalışırlar. + + + Giyildiği zaman giyen kişiye 8 Zırh verir. + + + Giyildiği zaman giyen kişiye 6 Zırh verir. + + + Giyildiği zaman giyen kişiye 3 Zırh verir. + + + Giyildiği zaman giyen kişiye 6 Zırh verir. + + + Demir kapılar sadece Kızıltaş, düğmeler veya devre anahtarları ile açılabilir. + + + Giyildiği zaman giyen kişiye 1 Zırh verir. + + + Giyildiği zaman giyen kişiye 3 Zırh verir. + + + Odun blokları, ele göre daha hızlı bir şekilde kesmek için kullanılır. + + + Ekinler için hazırlamak üzere toprak ve çim blokları sürmek için kullanılır. + + + Ahşap kapılar, kullanarak, üzerlerine vurarak veya Kızıltaş ile açılır. + + + Giyildiği zaman giyen kişiye 2 Zırh verir. + + + Giyildiği zaman giyen kişiye 4 Zırh verir. + + + Giyildiği zaman giyen kişiye 1 Zırh verir. + + + Giyildiği zaman giyen kişiye 2 Zırh verir. + + + Giyildiği zaman giyen kişiye 1 Zırh verir. + + + Giyildiği zaman giyen kişiye 2 Zırh verir. + + + Giyildiği zaman giyen kişiye 5 Zırh verir. + + + Kompakt merdivenler yapmak için kullanılır. + + + Mantar yahnisi koymak için kullanılır. Yahni yenildiği zaman kase kaybolmaz. + + + Su, lav ve süt koymak ve taşımak için kullanılır. + + + Su koymak ve taşımak için kullanılır. + + + Senin veya diğer oyuncular tarafından yazılan metni gösterir. + + + Meşalelerden daha parlak ışık üretmek için kullanılır. Karı ve buzu eritir ve su altında kullanılabilir. + + + Patlama yaratmak için kullanılır. Yerleştirildikten sonra Çakmak taşı ve Çelik ya da elektrik yükü ile tutuşturularak başlatılır. + + + Lav koymak ve taşımak için kullanılır. + + + Güneş'in ve Ay'ın konumlarını gösterir. + + + Başlangıç noktanı gösterir. + + + Elindeyken keşfedilen bölgenin resmini oluşturur. Bu, yol bulmak için kullanılabilir. + + + Süt koymak ve taşımak için kullanılır. + + + Ateş yakmak, TNT'yi tutuşturmak ve inşa edildiği zaman portalı açmak için kullanılır. + + + Balık yakalamak için kullanılır. + + + Kullanarak, üzerine vurarak ya da kızıltaş ile başlatılır. Normal kapı gibi işlerler ama sıra sıra bloklardan oluşurlar ve yerde düz dururlar. + + + İnşaat malzemesi olarak kullanılır ve birçok şeyin üretiminde de kullanılabilir. Herhangi bir tip odundan üretilebilir. + + + İnşaat malzemesi olarak kullanılır. Normal kum gibi yer çekiminden etkilenmez. + + + İnşaat malzemesi olarak kullanılır. + + + Uzun merdivenler yapmak için kullanılır. İki levha üst üste yerleştirildiğinde, normal boyutta iki levhalı blok meydana getirir. + + + Uzun merdivenler yapmak için kullanılır. Birbirinin üstüne yerleştirilen iki levha, normal boyutta ikili levha bloğu oluşturur. + + + Işık çıkarmak için kullanılır. Meşaleler ayrıca karı ve buzu eritir. + + + Meşale, ok, tabela, merdiven, çit üretmek amacıyla ve araçlar ile silahlar için de sap olarak kullanılır. + + + İçerisine blok ve eşya konulabilir. İki katı kapasiteye sahip daha geniş bir sandık oluşturmak için iki sandığı yan yana yerleştir. + + + Üzerinden atlanamayan bir duvar olarak kullanılır. Oyuncular, hayvanlar ve canavarlar için 1.5, diğer bloklar için 1 blok uzundur. + + + Dikine tırmanmak için kullanılır. + + + Haritadaki herkes yataktaysa, gecenin herhangi bir anından zamanı gündüze çevirmek için kullanılır ve oyuncunun canlanma noktasını değiştirir. +Kullanılan yünün rengi ne olursa olsun yatak her zaman aynı renktir. + + + Normal üretime göre daha fazla eşya üretebilmene imkan tanır. + + + Cevher eritmeni, odun kömürü ve cam yapmanı, balık ve pirzola pişirmeni sağlar. + + + Demir Balta + + + Kızıltaş Lambası + + + Orman Odunu Basamak + + + Huş Odunu Basamak + + + Geçerli Kontroller + + + Kafatası + + + Kakao + + + Ladin Odunu Basamak + + + Ejderha Yumurtası + + + Son Taşı + + + Son Portalı Çerçevesi + + + Kum Taşı Basamak + + + Eğrelti Otu + + + Çalı + + + Dizilim + + + Üretim + + + Kullan + + + Eylem + + + Sessizce İlerle/Alçal + + + Sessizce İlerle + + + Bırak + + + Elindeki Eşyayı Değiştir + + + Duraklat + + + Bak + + + Hareket Et/Koş + + + Envanter + + + Zıpla/Yüksel + + + Zıpla + + + Son Portalı + + + Bal Kabağı Sapı + + + Kavun + + + İnce Cam + + + Çit Kapısı + + + Sarmaşık + + + Kavun Sapı + + + Demir Parmaklık + + + Çatlak Taş Tuğlalar + + + Yosunlu Taş Tuğlalar + + + Taş Tuğlalar + + + Mantar + + + Mantar + + + Yontma Taş Tuğlalar + + + Tuğla Basamak + + + Dip Alem Yumrusu + + + Dip Alem Tuğlası Basamağı + + + Dip Alem Tuğlası Çiti + + + Kazan + + + Simya Standı + + + Efsun Masası + + + Dip Alem Tuğlası + + + Gümüşçün Parke Taşı + + + Gümüşçün Taşı + + + Taş Tuğla Basamak + + + Nilüfer Yaprağı + + + Miselyum + + + Gümüşçün Taşı Tuğlası + + + Kamera Modunu Değiştir + + + Sağlığının bir kısmını kaybedersen fakat gıda çubuğunda 9 ya da daha fazla{*ICON_SHANK_01*} varsa, sağlığın otomatik olarak dolacaktır. Gıda tüketmek gıda çubuğunu doldurur. + + + Etrafta dolaştıkça, kazdıkça ve saldırdıkça gıda çubuğunu{*ICON_SHANK_01*} tüketirsin. Koşmak ve koşarken zıplamak normal şekilde yürümekten ve zıplamaktan çok daha fazla gıda harcar. + + + Daha çok eşya toplayıp ürettikçe envanterin dolacaktır.{*B*} + Envanterini açmak için{*CONTROLLER_ACTION_INVENTORY*} düğmesine bas. + + + Topladığın odundan keresteler üretilebilir. Bunun için üretim arabirimini aç.{*PlanksIcon*} + + + Gıda seviyen düşük ve sağlık kaybettin. Gıda çubuğunu doldurup iyileşmeye başlamak için envanterindeki bifteği ye.{*ICON*}364{*/ICON*} + + + Elinde gıda eşyası varken, onu yiyip gıda çubuğunu doldurmak için{*CONTROLLER_ACTION_USE*} düğmesini basılı tut. Gıda çubuğun doluysa yiyemezsin. + + + Üretim arabirimini açmak için{*CONTROLLER_ACTION_CRAFTING*} düğmesine bas. + + + Koşmak için, {*CONTROLLER_ACTION_MOVE*} çubuğu hızlıca iki kez ileriye ittir. {*CONTROLLER_ACTION_MOVE*} çubuğu ileride tutarken, karakter koşma süresi ya da gıdası tükenene dek koşmaya devam edecektir. + + + Hareket etmek için{*CONTROLLER_ACTION_MOVE*} çubuğu kullan. + + + Yukarıya, aşağıya ve etrafa bakmak için{*CONTROLLER_ACTION_LOOK*} çubuğu kullan. + + + 4 odun bloğu (ağaç gövdeleri) kırmak için{*CONTROLLER_ACTION_ACTION*} düğmesini basılı tut.{*B*}Bir blok kırıldığında ortaya çıkan süzülen eşyanın yakınında durarak alırsan, envanterinde görünecektir. + + + Elini ya da elinde tuttuğun şeyi kullanarak kazmak ve kırmak için{*CONTROLLER_ACTION_ACTION*} düğmesini basılı tut. Bazı blokları kazmak için alet üretmen gerekebilir... + + + Zıplamak için{*CONTROLLER_ACTION_JUMP*} düğmesine bas. + + + Pek çok üretim birkaç aşamadan meydana gelebilir. Artık elinde kereste olduğuna göre bununla daha çok eşya üretebilirsin. Üretim masası yap.{*CraftingTableIcon*} + + + + Çabucak gece olabilir ve hazırlıksız şekilde dışarıda olmak tehlikeli olacaktır. Zırh ve silahlar üretebilirsin ancak güvenli bir barınağa sahip olmak daha mantıklıdır. + + + + Konteyneri aç + + + Kazma, taş ve cevher gibi sert blokları daha hızlı kazmana yardım eder. Daha çok malzeme topladıkça, hızlı çalışan ve uzun dayanan aletler üretebilirsin. Ahşap bir kazma yap.{*WoodenPickaxeIcon*} + + + Taş blok kazmak için kazmanı kullan. Taş bloklar kazıldığında parke taşı meydana getirir. 8 parke taşı toplarsan bir ocak yapabilirsin. Taşa ulaşmak için bir miktar toprak kazman gerekebilir, bunun için de küreğini kullan.{*StoneIcon*} + + + + Barınağı tamamlamak için kaynaklar toplamalısın. Duvarlar ve çatı her döşeme türü bloktan yapılabilir ancak kapı, birkaç pencere ve ışıklandırma da yerleştirmek isteyebilirsin. + + + + + Yakınlarda geceyi güvenli şekilde geçirmen için tamamlayabileceğin terk edilmiş bir Madenci barınağı var. + + + + Balta, odun ile ahşap nesneleri daha hızlı kesmene yardım eder. Daha çok malzeme topladıkça, hızlı çalışan ve uzun dayanan aletler üretebilirsin. Ahşap bir balta yap.{*WoodenHatchetIcon*} + + + Eşyaları kullanmak, nesnelerle etkileşime geçmek ve eşyaları yerleştirmek için{*CONTROLLER_ACTION_USE*} düğmesini kullan. Yerleştirilen eşyalar doğru aletle kazılarak yeniden alınabilir. + + + Elinde tuttuğun eşyayı değiştirmek için{*CONTROLLER_ACTION_LEFT_SCROLL*} ile{*CONTROLLER_ACTION_RIGHT_SCROLL*} düğmelerini kullan. + + + Blokları daha hızlı toplamak için işe uygun aletler yapabilirsin. Bazı aletlerin sopadan yapılma tutacakları vardır. Şimdi birkaç sopa üret.{*SticksIcon*} + + + Kürek, toprak ile kar gibi yumuşak blokları daha hızlı kazmana yardım eder. Daha çok malzeme topladıkça, hızlı çalışan ve uzun dayanan aletler üretebilirsin. Ahşap bir kürek yap.{*WoodenShovelIcon*} + + + Artı imlecini üretim masasına doğrultup{*CONTROLLER_ACTION_USE*} düğmesine basarak aç. + + + Üretim masası seçiliyken, artı imlecini istediğin yere doğrult ve{*CONTROLLER_ACTION_USE*} düğmesini kullanarak üretim masasını yerleştir. + + + Minecraft, hayal edebileceğin her şeyi inşa etmek amacıyla bloklar yerleştirmeye dayalı bir oyundur. Geceleri canavarlar ortaya çıkar, bu olmadan önce bir barınak inşa ettiğinden emin ol. + + + + + + + + + + + + + + + + + + + + + + + + 1. Dizilim + + + Hareket (Uçarken) + + + Oyuncular/Davet Et + + + + + + 3. Dizilim + + + 2. Dizilim + + + + + + + + + + + + + + + {*B*}Eğitim bölümünü başlatmak için{*CONTROLLER_VK_A*} düğmesine bas.{*B*} + Kendi başına oynamaya hazır olduğunu düşünüyorsan{*CONTROLLER_VK_B*} düğmesine bas. + + + {*B*}Devam etmek için{*CONTROLLER_VK_A*} düğmesine bas. + + + + + + + + + + + + + + + + + + + + + + + + + + + Gümüşçün Bloğu + + + Taş Levha + + + Demir depolamanın kompakt bir yolu. + + + Demir Bloğu + + + Meşe Odunu Levha + + + Kum Taşı Levha + + + Taş Levha + + + Altın depolamanın kompakt bir yolu. + + + Çiçek + + + Beyaz Yün + + + Turuncu Yün + + + Altın Bloğu + + + Mantar + + + Gül + + + Parke Taşı Levha + + + Kitap Rafı + + + TNT + + + Tuğlalar + + + Meşale + + + Obsidiyen + + + Yosunlu Taş + + + Dip Alem Tuğlası Levha + + + Meşe Odunu Levha + + + Taş Tuğla Levha + + + Tuğla Levha + + + Orman Odunu Levha + + + Huş Odunu Levha + + + Ladin Odunu Levha + + + Galibarda Yün + + + Huş Yaprakları + + + Ladin Yaprakları + + + Meşe Yaprakları + + + Cam + + + Sünger + + + Orman Yaprakları + + + Yapraklar + + + Meşe + + + Ladin + + + Huş + + + Ladin Odunu + + + Huş Odunu + + + Orman Odunu + + + Yün + + + Pembe Yün + + + Gri Yün + + + Açık Gri Yün + + + Açık Mavi Yün + + + Sarı Yün + + + Limon Yeşili Yün + + + Camgöbeği Yün + + + Yeşil Yün + + + Kırmızı Yün + + + Siyah Yün + + + Mor Yün + + + Mavi Yün + + + Kahverengi Yün + + + Meşale (Kömür) + + + Parıltı Taşı + + + Ruh Kumu + + + Dip Alem Kütlesi + + + Laciverttaş Bloğu + + + Laciverttaş Cevheri + + + Portal + + + Cadılar Bayramı Kabağı + + + Şeker Kamışı + + + Kil + + + Kaktüs + + + Bal Kabağı + + + Çit + + + Müzik Kutusu + + + Laciverttaş depolamanın kompakt bir yolu. + + + Yatay Kapı + + + Kilitli Sandık + + + Diyot + + + Yapışkan Piston + + + Piston + + + Yün (herhangi bir renk) + + + Ölü Çalı + + + Pasta + + + Nota Bloğu + + + Fırlatıcı + + + Uzun Çimen + + + + + + Yatak + + + Buz + + + Üretim Masası + + + Elmas depolamanın kompakt bir yolu. + + + Elmas Bloğu + + + Ocak + + + Ekim Toprağı + + + Mahsul + + + Elmas Cevheri + + + Canavar Canlandırıcı + + + Ateş + + + Meşale (Odun Kömürü) + + + Kızıltaş Tozu + + + Sandık + + + Meşe Odunu Basamak + + + Tabela + + + Kızıltaş Cevheri + + + Demir Kapı + + + Basınç Plakası + + + Kar + + + Düğme + + + Kızıltaş Meşalesi + + + Şalter + + + Ray + + + Merdiven + + + Ahşap Kapı + + + Taş Basamak + + + Dedektörlü Ray + + + Enerjili Ray + + + Ocak yapmaya yetecek kadar parke taşı topladın. Şimdi üretim masanı kullanarak bir ocak üret. + + + Olta + + + Saat + + + Parıltı Taşı Tozu + + + Ocaklı Maden Arabası + + + Yumurta + + + Pusula + + + Çiğ Balık + + + Gül Kırmızısı + + + Kaktüs Yeşili + + + Kakao Çekirdekleri + + + Pişmiş Balık + + + Boya Tozu + + + Mürekkep Kesesi + + + Sandıklı Maden Arabası + + + Kartopu + + + Kayık + + + Deri + + + Maden Arabası + + + Eyer + + + Kızıltaş + + + Süt Kovası + + + Kağıt + + + Kitap + + + Balçık Topu + + + Tuğla + + + Kil + + + Şeker Kamışları + + + Laciverttaş + + + Harita + + + Müzik Plağı - "13" + + + Müzik Plağı - "kedi" + + + Yatak + + + Kızıltaş Yineleyici + + + Kurabiye + + + Müzik Plağı - "bloklar" + + + Müzik Plağı - "mellohi" + + + Müzik Plağı - "stal" + + + Müzik Plağı - "strad" + + + Müzik Plağı - "cıvıltı" + + + Müzik Plağı - "uzak" + + + Müzik Plağı - "AVM" + + + Pasta + + + Gri Boya + + + Pembe Boya + + + Limon Yeşili Boya + + + Mor Boya + + + Camgöbeği Boya + + + Açık Gri Boya + + + Karahindiba Sarısı + + + Kemik Tozu + + + Kemik + + + Şeker + + + Açık Mavi Boya + + + Galibarda Boya + + + Turuncu Boya + + + Tabela + + + Deri Tunik + + + Demir Göğüs Zırhı + + + Elmas Göğüs Zırhı + + + Demir Miğfer + + + Elmas Miğfer + + + Altın Miğfer + + + Altın Göğüs Zırhı + + + Altın Pantolon + + + Deri Çizmeler + + + Demir Çizmeler + + + Deri Pantolon + + + Demir Pantolon + + + Elmas Pantolon + + + Deri Başlık + + + Taş Çapa + + + Demir Çapa + + + Elmas Çapa + + + Elmas Balta + + + Altın Balta + + + Ahşap Çapa + + + Altın Çapa + + + Zincir Göğüs Zırhı + + + Zincir Pantolon + + + Zincir Çizmeler + + + Ahşap Kapı + + + Demir Kapı + + + Zincir Miğfer + + + Elmas Çizmeler + + + Tüy + + + Barut + + + Buğday Tohumu + + + Kase + + + Mantar Yahnisi + + + İp + + + Buğday + + + Pişmiş Domuz Pirzolası + + + Tablo + + + Altın Elma + + + Ekmek + + + Çakmak Taşı + + + Çiğ Domuz Pirzolası + + + Sopa + + + Kova + + + Su Kovası + + + Lav Kovası + + + Altın Çizmeler + + + Demir Külçe + + + Altın Külçe + + + Çakmak Taşı ve Çelik + + + Kömür + + + Odun Kömürü + + + Elmas + + + Elma + + + Yay + + + Ok + + + Müzik Plağı - "koruma" + + + + Üretmek istediğin eşyaların grup tipini değiştirmek için {*CONTROLLER_VK_LB*} ve {*CONTROLLER_VK_RB*} düğmesine bas. Yapının grubunu seç.{*StructuresIcon*} + + + + + Üretmek istediğin eşyaların grup tiplerini değiştirmek için {*CONTROLLER_VK_LB*} ve {*CONTROLLER_VK_RB*} düğmesine bas. Araçlar grubunu seç.{*ToolsIcon*} + + + + + Artık bir üretim masan olduğuna göre onu dünyaya yerleştirip daha fazla eşya üretmeye başlayabilirsin.{*B*} + Üretim arabiriminden çıkmak için {*CONTROLLER_VK_B*} düğmesine bas. + + + + + Yaptığın aletler sayesinde iyi bir başlangıç yaptın ve çeşitli birçok malzemeyi daha etkili bir şekilde toplayabileceksin.{*B*} + Üretim arabiriminden çıkmak için şimdi {*CONTROLLER_VK_B*} bas. + + + + + Birçok üretim için birçok adım gerekir. Artık biraz keresten olduğuna göre üretebileceğin daha çok eşya var. Üretmek istediğin eşyayı değiştirmek için {*CONTROLLER_MENU_NAVIGATE*} kullan. Üretim masasını seç.{*CraftingTableIcon*} + + + + + Üretmek istediğin eşyayı değiştirmek için {*CONTROLLER_MENU_NAVIGATE*} kullan. Bazı eşyaların kullanılan malzemeye göre değişen farklı türleri vardır. Ahşap küreği seç.{*WoodenShovelIcon*} + + + + Topladığın odunlardan kalas üretilebilir. Kalas simgesini seç ve {*CONTROLLER_VK_A*} düğmesine basarak üret.{*PlanksIcon*} + + + + Bir üretim masası kullanarak daha çok eşya üretebilirsin. Masada üretim yapmak normal üretim ile benzerdir ama daha geniş bir üretim alanın olduğu için daha çok bileşen kombinasyonu deneyebilirsin. + + + + + Üretim alanı, yeni eşyalar üretmek için gereken bileşenleri gösterir. Eşyayı üretip envanterine yerleştirmek için {*CONTROLLER_VK_A*} düğmesine bas. + + + + + {*CONTROLLER_VK_LB*} ve {*CONTROLLER_VK_RB*} kullanarak yukarıdaki Grup Tipleri sekmelerine bak ve üretmek istediğin eşyanın grup tipini seç, sonra da üretmek istediğin eşyayı {*CONTROLLER_MENU_NAVIGATE*} ile seç. + + + + + Seçili eşyayı üretmek için gerekli bileşenler gösteriliyor. + + + + + Seçili olan eşyanın açıklaması gösteriliyor. Açıklama eşyanın ne amaçla kullanılabileceğine dair bir fikir verebilir. + + + + + Üretim arabiriminin sağ alt kısmı envanterini gösterir. Bu alan aynı zamanda şu an seçili olan eşyanın açıklamasını ve onu üretmek için gereken bileşenleri belirtir. + + + + + Bazı eşyalar üretim masası kullanılarak üretilemez, bunlar için ocak gerekir. Şimdi bir ocak yapın.{*FurnaceIcon*} + + + + Çakıl Taşı + + + Altın Cevheri + + + Demir Cevheri + + + Lav + + + Kum + + + Kum Taşı + + + Kömür Cevheri + + + {*B*} + Devam etmek için {*CONTROLLER_VK_A*} düğmesine bas.{*B*} + Ocağı nasıl kullanacağını zaten biliyorsan {*CONTROLLER_VK_B*} düğmesine bas. + + + + + Burası ocak arabirimi. Ocak sayesinde eşyaları eriterek değiştirebilirsin. Örneğin, ocakta demir cevheri eritip onları demir külçelerine çevirebilirsin. + + + + + Ürettiğin ocağı dünyaya yerleştir. Bunu sığınağının içine koysan iyi olur.{*B*} + Üretim arabiriminden çıkmak için şimdi {*CONTROLLER_VK_B*} düğmesine bas. + + + + Odun + + + Meşe Odunu + + + + Ocağın alttaki yuvasına biraz yakacak, üstteki yuvaya da değiştirilecek eşyayı koymalısın. Ocak o zaman yanmaya ve çalışmaya başlayacak, yeni eşyalar ise sağdaki yuvaya yerleştirilecek. + + + + {*B*} + Envanteri tekrar görmek için {*CONTROLLER_VK_X*} düğmesine bas. + + + + {*B*} + Devam etmek için {*CONTROLLER_VK_A*} düğmesine bas.{*B*} + Envanteri nasıl kullanacağını biliyorsan {*CONTROLLER_VK_B*} düğmesine bas. + + + + + Bu senin envanterin. Elinde kullanılabilen eşyaları ve taşıdığın diğer her şeyi gösterir. Zırhın da burada gösterilir. + + + + + {*B*} + Eğitime devam etmek için {*CONTROLLER_VK_A*} düğmesine bas.{*B*} + Tek başına oynamak için hazır olduğunu düşünüyorsan {*CONTROLLER_VK_B*} düğmesine bas. + + + + + İmleçte bir eşya varken imleci arabirimin dışına çıkarırsan, eşyayı bırakabilirsin. + + + + + Bu eşyayı imleç ile envanterdeki başka bir boşluğa taşı ve {*CONTROLLER_VK_A*} ile yerleştir. + İmleçte birden fazla eşya varsa, {*CONTROLLER_VK_A*} ile hepsini yerleştir veya {*CONTROLLER_VK_X*} ile sadece birini yerleştir. + + + + + İmleci hareket ettirmek için {*CONTROLLER_MENU_NAVIGATE*} kullan. İmlecin altındaki bir eşyayı almak için {*CONTROLLER_VK_A*} kullan. + Orada birden çok eşya varsa bu işlem hepsini alacaktır, {*CONTROLLER_VK_X*} ile sadece yarısını da alabilirsin. + + + + Eğitimin ilk aşamasını tamamladın. + + + + Cam yapmak için ocağı kullan. Onu beklerken barınağı tamamlamak için daha çok malzeme toplayarak zamandan tasarruf etmeye ne dersin? + + + Bir miktar odun kömürü yapmak için ocağı kullan. Onu beklerken barınağı tamamlamak için daha çok malzeme toplayarak zamandan tasarruf etmeye ne dersin? + + + Dünya üzerinde bir yere ocağı yerleştirmek için{*CONTROLLER_ACTION_USE*} düğmesini kullanıp ardından da ocağı aç. + + + Geceleri çok karanlık olabileceğinden dolayı etrafını görebilmen için barınağının içine birkaç ışıklandırma yapman gerekecek. Şimdi sopalarla odun kömürünü kullanarak üretim arabiriminde bir meşale üret.{*TorchIcon*} + + + Kapıyı yerleştirmek için{*CONTROLLER_ACTION_USE*} düğmesini kullan. Dünyadaki ahşap bir kapıyı açıp kapatmak için{*CONTROLLER_ACTION_USE*} düğmesini kullanabilirsin. + + + İyi bir barınağın bir de kapısı olur, bu sayede duvarları kazıp geri yerleştirmeden kolayca girip çıkabilirsin. Şimdi ahşap bir kapı üret.{*WoodenDoorIcon*} + + + + Bir eşya hakkında daha fazla bilgi istiyorsan, imleci eşyanın üzerine getir ve {*CONTROLLER_ACTION_MENU_PAGEDOWN*} düğmesine bas. + + + + + Burası üretim arabirimidir. Bu arabirim topladığın eşyaları birleştirip yeni eşyalar üretebilmeni sağlar. + + + + + Yaratıcılık modu envanterinden çıkmak için şimdi {*CONTROLLER_VK_B*} düğmesine bas. + + + + + Bir eşya hakkında daha fazla bilgi istiyorsan, imleci eşyanın üzerine getir ve {*CONTROLLER_ACTION_MENU_PAGEDOWN*} düğmesine bas. + + + + {*B*} + Geçerli eşyayı yapmak için gereken bileşenleri görmek için {*CONTROLLER_VK_X*} düğmesine bas. + + + + {*B*} + Eşya açıklamasını göstermek için {*CONTROLLER_VK_X*} düğmesine bas. + + + + {*B*} + Devam etmek için {*CONTROLLER_VK_A*} düğmesine bas.{*B*} + Üretimi nasıl yapacağını biliyorsan {*CONTROLLER_VK_B*} düğmesine bas. + + + + + {*CONTROLLER_VK_LB*} ve {*CONTROLLER_VK_RB*} ile Grup Tipi sekmeleri arasından almak istediğin eşyanın grup tipini seç. + + + + {*B*} + Devam etmek için {*CONTROLLER_VK_A*} düğmesine bas.{*B*} + Yaratıcılık modu envanterini nasıl kullanacağını zaten biliyorsan {*CONTROLLER_VK_B*} düğmesine bas. + + + + + Burası yaratıcılık modu envanteridir. Elinde kullanılabilir olan eşyaları ve seçebileceğin diğer tüm eşyaları gösterir. + + + + + Envanterden çıkmak için şimdi {*CONTROLLER_VK_B*} düğmesine bas. + + + + + İmlecin üzerinde bir eşya varken imleci arabirimin dışına götürürsen, eşyayı dünyaya bırakabilirsin. Hızlı seçim çubuğundaki tüm eşyaları temizlemek için {*CONTROLLER_VK_X*} düğmesine bas. + + + + + İmleç, otomatik olarak kullanım sırasındaki bir boşluğa geçecek. {*CONTROLLER_VK_A*} kullanarak eşyayı yerleştirebilirsin. Eşyayı yerleştirdikten sonra, imleç başka bir tane seçebilmen için eşya listesine dönecek. + + + + + İmleci hareket ettirmek için {*CONTROLLER_MENU_NAVIGATE*} kullan. + Eşya listesindeyken, imlecin altındaki bir eşyayı almak için {*CONTROLLER_VK_A*} düğmesine bas, istif halinde almak için ise {*CONTROLLER_VK_Y*} kullan. + + + + Su + + + Cam Şişe + + + Su Şişesi + + + Örümcek Gözü + + + Altın Keseği + + + Dip Alem Yumrusu + + + {*splash*}{*prefix*}{*postfix*}İksiri + + + Mayalı Örümcek Gözü + + + Kazan + + + Sonveren Gözü + + + Parıldayan Kavun + + + Alaz Tozu + + + Magma Özü + + + Simya Standı + + + Fersiz Gözyaşı + + + Bal Kabağı Çekirdekleri + + + Kavun Çekirdekleri + + + Çiğ Tavuk Eti + + + Müzik Plağı - "11" + + + Müzik Plağı - "neredeyiz şimdi" + + + Makas + + + Pişmiş Tavuk Eti + + + Sonveren İncisi + + + Kavun Dilimi + + + Alaz Çubuğu + + + Çiğ Sığır Eti + + + Biftek + + + Çürümüş Et + + + Efsunlu Şişe + + + Meşe Kerestesi + + + Ladin Kerestesi + + + Huş Kerestesi + + + Çimen Bloğu + + + Toprak + + + Parke Taşı + + + Orman Kerestesi + + + Huş Fidanı + + + Orman Ağacı Fidanı + + + Taban Kayası + + + Fidan + + + Meşe Fidanı + + + Ladin Fidanı + + + Taş + + + Eşya Çerçevesi + + + {*CREATURE*} Canlandır + + + Dip Alem Tuğlası + + + Kor + + + Kor (Odun Kömürü) + + + Kor (Kömür) + + + Kafatası + + + Kafa + + + %s Kafası + + + Ürperten Kafası + + + İskelet Kafatası + + + Soluk İskelet Kafatası + + + Zombi Kafası + + + Kömür depolamak için kompakt bir yöntem. Bir Ocakta yakıt olarak kullanılabilir. + + + Zehir + + + Açlık + + + Yavaşlık + + + Sürat + + + Görünmezlik + + + Suda Soluma + + + Gece Görüşü + + + Körlük + + + Anında Hasar + + + Anında Sağlık + + + Bulantı + + + Yenilenme + + + Kazı Yorgunluğu + + + Çabukluk + + + Zayıflık + + + Kuvvet + + + Ateş Direnci + + + Doygunluk + + + Direnç + + + Zıplama Güçlendirici + + + Solgun + + + Sağlık Güçlendirici + + + Soğurum + + + + + + II + + + 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 + + + Sıradan + + + Yavan + + + Gösterişli + + + Ferahlatıcı + + + Alımlı + + + Zarif + + + Havalı + + + Işıltılı + + + 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 + + + Vuruş + + + Keskinlik + + + İksirden etkilenen oyuncuların, hayvanların ve canavarların sağlığını zamanla azaltır. + + + Saldırı Hasarı + + + Geri Fırlatma + + + Eklembacaklı Felaketi + + + Hız + + + Zombi Takviyeleri + + + Atın Zıplama Kuvveti + + + Uygulandığında: + + + Geri Fırlatma Direnci + + + Yaratık Takip Menzili + + + Maksimum Sağlık + + + İpeksi Dokunuş + + + Etkinlik + + + Suya Yakınlık + + + Talih + + + Yağma + + + Kırılmaz + + + Ateşten Koruma + + + Koruma + + + Ateş Nazarı + + + Hafif Düşüş + + + Solunum + + + Mermiden Koruma + + + Patlamadan Koruma + + + IV + + + V + + + VI + + + Yumruk + + + VII + + + III + + + Alev + + + Güç + + + Sonsuzluk + + + II + + + I + + + Bağlı tetikleyiciden bir canlı geçtiği zaman etkinleşir. + + + İçinden bir canlı geçtiğinde bağlı bir Tetikleyici Kancayı etkinleştirir. + + + Zümrütleri derli toplu depolama yolu. + + + Sandığa benzer ancak Sonveren Sandığına koyulan eşyalar oyuncunun tüm Sonveren Sandıklarında belirecektir, oyuncu farklı boyutlarda bile olsa. + + + IX + + + VIII + + + Zümrüt toplamak için Demir Kazma veya daha iyisi ile kazılabilir. + + + 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. + + + 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. Bunu yemek zehirlenmene neden olabilir. + + + Eyerlenmiş bir domuzu sürerken onu kontrol etmeyi sağlar. + + + 3 {*ICON_SHANK_01*} yeniler. Ocakta patates pişirilerek üretilir. + + + 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. + + + 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. + + + Zümrüt + + + Çiçek Saksısı + + + Balkabağı Turtası + + + Efsunlu Kitap + + + Zehirli Patates + + + Altın Havuç + + + Havuçlu Değnek + + + Tetikleyicili Kanca + + + Tetikleyici + + + Dip Alem Kuvarsı + + + Zümrüt Cevheri + + + Sonveren Sandığı + + + Yosunlu Parketaşı Duvar + + + Zümrüt Bloğu + + + Parketaşı Duvar + + + Patatesler + + + Çiçek Saksısı + + + Havuçlar + + + Az Hasarlı Örs + + + Örs + + + Örs + + + Kuvars Bloğu + + + Çok Hasarlı Örs + + + Dip Alem Kuvars Cevheri + + + Kuvars Merdivenler + + + Yontma Kuvars Bloğu + + + Sütun Kuvars Bloğu + + + Kırmızı Halı + + + Halı + + + Siyah Halı + + + Mavi Halı + + + Yeşil Halı + + + Kahverengi Halı + + + Mor Halı + + + Camgöbeği Halı + + + Açık Gri Halı + + + Gri Halı + + + Limon Yeşili Halı + + + Pembe Halı + + + Açık Mavi Halı + + + Sarı Halı + + + Galibarda Halı + + + Turuncu Halı + + + Beyaz Halı + + + Yontma 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*} seni kendi yanına ışınladı + + + {*PLAYER*} şuraya ışınlandı: {*DESTINATION*} + + + Dikenler + + + {*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 + + + Çok Pahalı! + + + Efsunlama Bedeli: %d + + + Sendekiler: + + + Yeniden İsimlendir + + + {*VILLAGER_TYPE*} teklifi %s + + + Takas için Gereken Eşyalar + + + Takas Et + + + 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. + + + + + {*B*} + Örs arabirimi hakkında daha fazla bilgi almak için {*CONTROLLER_VK_A*} düğmesine bas.{*B*} + Örs arabirimini zaten biliyorsan {*CONTROLLER_VK_B*} düğmesine bas. + + + + + Ayrıca, ikinci yuvaya aynı eşyadan bir tane daha yerleştirilirse, ikisi birleştirilebilir. + + + + + İkinci girdi yuvasına doğru hammadde yerleştirilince, (örneğin hasarlı bir Demir Kılıç için Demir Külçeler gibi), önerilen onarım çıktı yuvasında belirecektir. + + + + İşin ne kadar Tecrübe Seviyesine mal olacağı çıktının altında gösterilir. Yeterli Tecrübe Seviyen yoksa, tamir tamamlanamaz. + + + + + Örste eşya efsunlamak için, ikinci girdi yuvasına bir Efsunlu Kitap yerleştir. + + + + + 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. + + + + + Metin kutusunda gösterilen ismi değiştirerek eşyanın adını değiştirmek mümkündür. + + + + + {*B*} + Örs hakkında daha fazla bilgi almak için {*CONTROLLER_VK_A*} düğmesine bas.{*B*} + Örs hakkında zaten bilgi sahibiysen {*CONTROLLER_VK_B*} düğmesine bas. + + + + + Bu alanda bir Örs ve onu kullanabileceğin alet ve silahları içeren bir Sandık var. + + + + + Efsunlu Kitaplar, zindanlardaki Sandıklarda bulunabilir veya Efsun Masasında normal kitapların efsunlanması ile üretilebilir. + + + + + Örs kullanılarak silah ve aletlerin dayanıklılığı yenilenebilir, isimleri değiştirilebilir veya Efsunlu Kitaplarla efsunlanabilirler. + + + + + 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. + + + + + Örsü kullanmak Tecrübe Seviyesine mal olur ve her kullanım sırasında Örs hasar alabilir. + + + + + Bu bölgedeki Sandıkta, deneme yapman için hasarlı Kazmalar, hammaddeler, Efsunlu Şişeler ve Efsunlu Kitaplar bulacaksın. + + + + + 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. + + + + + {*B*} + Takas arabirimi hakkında daha fazla bilgi almak istiyorsan {*CONTROLLER_VK_A*} düğmesine bas.{*B*} + Takas arabirimini hakkında zaten bilgi sahibiysen {*CONTROLLER_VK_B*} düğmesine bas. + + + + + 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ünün şu anda yapabileceği tüm takas seçenekleri yukarıda gösterilir. + + + + + Gereken toplam eşya sayısını soldaki iki kutuda görebilirsin. + + + + + 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. + + + + + {*B*} + Takas hakkında daha fazla bilgi almak için {*CONTROLLER_VK_A*} düğmesine bas.{*B*} + Takas hakkında zaten bilgi sahibiysen {*CONTROLLER_VK_B*} düğmesine bas. + + + + + Çeşitli takas işlemleri yapmak köylünün mevcut takas seçeneklerine rastgele eklemeler yapar veya teklif listesini yeniler. + + + + + Bir köylünün yapacağı teklifler, onun mesleğine bağlıdır. + + + + + Sürekli takaslamalar sonucu o eşyalar geçici olarak kaldırılabilir ancak köylü her zaman en az bir tane takas teklifi yapacaktır. + + + + + Sandıktan biraz Kağıt al ve buradaki köylülerle takas yapmayı dene. + + + + + Bu bölgede iki tane Sonveren Sandığı var. + + + + + {*B*} + Sonveren Sandıkları hakkında daha fazla bilgi almak için {*CONTROLLER_VK_A*} düğmesine bas.{*B*} + Sonveren Sandıkları hakkında zaten bilgi sahibiysen {*CONTROLLER_VK_B*} düğmesine bas. + + + + + Dünyadaki tüm Sonveren Sandıkları farklı boyutlarda bile birbirine bağlıdır. Bir Sonveren Sandığına yerleştirilen eşyalara tüm Sonveren Sandıklarından erişilebilir. + + + + + Ancak, Sonveren Sandıklarının içeriği her oyuncu için farklıdır. + + + + + Bu sayede oyuncular herhangi bir Sonveren Sandığına eşya yerleştirebilir ve bunlara dünyanın farklı yerlerindeki Sonveren Sandıklarından erişebilir. İki Sonveren Sandığından birine eşya yerleştirerek bunu deneyebilirsin. + + + + 2 {*ICON_SHANK_01*} yeniler, 30 saniye boyunca sağlığı yeniler ve 5 dakika boyunca ateş ve hasar direnci verir. Bir elma ve altın bloklardan yapılır. + + + Işınlanabilir + + + Işınlan + + + Oyuncuya Işınla + + + Bana Işınla + + + Yorgunluğu Etkisizleştirebilir + + + Görünmez Olabilir + + + Artık görünmezliği açabilirsin + + + Artık görünmezliği açamazsın + + + Artık uçmayı açabilirsin + + + Artık uçmayı açamazsın + + + Artık yorgunluğu kapatabilirsin + + + Artık yorgunluğu kapatamazsın + + + Artık ışınlanabilirsin + + + Artık ışınlanamazsın + + + {*T3*}NASIL OYNANIR : ÖRSLER{*ETW*}{*B*}{*B*} +Tecrübe puanları kullanılarak eşyalar Örste tamir edilebilir, efsunlanabilir veya isimleri değiştirilebilir.{*B*} +Her türlü eşyanın adı değiştirilebilir ancak sadece dayanıklılığı olan eşyalar tamir edilebilir veya Efsunlu Kitaplar sayesinde efsunlanabilir.{*B*} +Bir eşya soldaki girdi yuvalarına, Demir Kılıçlar için Demir Külçeler gibi eşyanın hammaddesi olan eşyalarla birlikte yerleştirilerek veya aynı tipten başka bir eşya ile birleştirilerek onarılabilir.{*B*} +Örste eşyaları birleştirmek daha etkili bir yoldur, ayrıca eşyalardan biri efsunluysa, son ürün de girdilerden birinden gelen bir efsun barındırabilir.{*B*} +Efsunlu Kitaplar, Kitabın efsunu da uygunsa bir Örste eşyalarla birleştirilerek eşyaların efsunlanmasını sağlayabilirler. Efsunlu Kitaplar zindanlardaki Sandıklarda bulunabilir veya Efsun Masasında normal kitaplardan efsunlanarak üretilebilir.{*B*} +Her kullanımdan sonra Örs biraz hasar alabilir ve çok fazla kullanılırsa fazla hasar nedeniyle yok olabilir.{*B*} + + + + {*T3*}NASIL OYNANIR : TAKAS{*ETW*}{*B*}{*B*} +Köylülerle takas yapmak mümkündür. Her köylünün belirli bir mesleği vardır, köylüler Çiftçi, Kasap, Demirci, Kütüphaneci veya Din Adamı olabilir ve bu da takas yapabilecekleri eşyaları belirler.{*B*} +Bir köylünün sunduğu tüm takas tekliflerini takas menüsünden görebilirsin. Bir oyuncuyla takas yaptığında köylü eşyalarına eklemeler veya değişiklikler yapabilir ancak bir takas sıklıkla yapılırsa bir süreliğine kullanılamaz hale gelebilir.{*B*} +Takaslar genelde zümrüt karşılığında çeşitli eşya alınıp satılmasından ibarettir.{*B*} +Bir takas için gereken eşyalara sahip değilsen, eşyalar kırmızı olarak gösterilir.{*B*} + + + + {*T3*}NASIL OYNANIR : SONVEREN SANDIĞI {*ETW*}{*B*}{*B*} +Dünyadaki tüm Sonveren Sandıkları birbirine bağlıdır. Bir Sonveren Sandığına yerleştirilen eşyalara tüm Sonveren Sandıklarından erişilebilir. Ancak, Sonveren Sandıklarının içeriği her oyuncu için farklıdır. Bu sayede oyuncular herhangi bir Sonveren Sandığına eşya yerleştirebilir ve bunlara dünyanın farklı yerlerindeki Sonveren Sandıklarından erişebilir. + + + + Çiftçi + + + Kütüphaneci + + + Din Adamı + + + Demirci + + + Kasap + + + Köylerde bulunan köylüler mesleklerine bağlı olarak oyunculara satılık eşyalar sunar. + + + Büyük Sandık + + + + Aynı zamanda Efsun Masasında Efsunlu Kitaplar üretebilirsin, bunlar da daha sonra Örste kullanılarak eşyaların efsunlanması sağlanabilir. + + + + + Tetikleyicili Kancalar, aralarındaki sicim tetiklendiği sürece devreye sürekli güç sağlayabilir. + + + + + Evcilleştirilen kurtlar her zaman tasmalı olur. Tasmalarının rengi boyanarak değiştirilebilir. + + + + Havuç ve Patates, Havuç veya Patateslerin ekilip, sonra da toprak üstünde görünür olan sebzenin toplanmasıyla elde edilebilir. + + + + Ayrıca, domuzlar eyerlenip oyuncular tarafından sürülebilir. Havuçlu Değnekle yönlendirilebilirler. + + + + + Eğer gerekirse {*CONTROLLER_ACTION_MOVE*} ile maden arabanı yavaşça hareket ettirebilirsin. Bu, maden arabasını enerjili raylara getirerek çalıştırmanı sağlar. + + + + Bölünmüş Ekran sadece Yüksek Çözünürlük modunda desteklendiği için bu oyuna katılamazsın. Katılmak istiyorsan diğer oyuncuların çıkması gerekecek. + + + Tedavi + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/tr-TR/stringsLeaderboards.xml b/Minecraft.Client/PSVitaMedia/loc/tr-TR/stringsLeaderboards.xml new file mode 100644 index 00000000..7aeeb098 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/tr-TR/stringsLeaderboards.xml @@ -0,0 +1,48 @@ + + + + Öldürmeler Kolay + + + Öldürmeler Normal + + + Öldürmeler Zor + + + Kazılan Bloklar Huzurlu + + + Kazılan Bloklar Kolay + + + Kazılan Bloklar Normal + + + Kazılan Bloklar Zor + + + Çiftçilik Huzurlu + + + Çiftçilik Kolay + + + Çiftçilik Normal + + + Çiftçilik Zor + + + Seyahat Huzurlu + + + Seyahat Kolay + + + Seyahat Normal + + + Seyahat Zor + + \ 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 new file mode 100644 index 00000000..b31be443 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/tr-TR/stringsPlatformSpecific.xml @@ -0,0 +1,243 @@ + + + + "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. + + + SELECT + + + 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. + + + PlayStation®Vita sistemi + + + 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ğı + + + Ağ Modunu Değiştir + + + 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*} +Yaratıcılık modu arabirimi oyundaki her eşyanın kazma veya üretime gerek kalmadan oyuncunun envanterine eklenmesini sağlar. +Oyuncunun envanterindeki eşyalar, dünyaya yerleştirildiklerinde veya kullanıldığında yok olmaz ve bu da oyuncunun kaynak toplamaktan çok inşa etmeye odaklanmasını sağlar.{*B*} +Eğer Yaratıcılık Modunda bir dünyayı oluşturur, kaydeder veya yüklerseniz, o dünyanın kupaları ve sıralama tablosu güncellemeleri devre dışı kalır, Sağ Kalma Modunda tekrar yüklenseler bile.{*B*} +Yaratıcılık Modunda uçmak için, {*CONTROLLER_ACTION_JUMP*} düğmesine iki kere hızlıca basın. Uçuştan çıkmak için aynı şeyi tekrarlayın. Daha hızlı uçmak için, uçarken hızlıca {*CONTROLLER_ACTION_MOVE*} çubuğunu iki kere ileri itin. +Uçuş modunda, yukarı çıkmak için {*CONTROLLER_ACTION_JUMP*} düğmesini basılı tutabilir ve aşağı inmek için {*CONTROLLER_ACTION_SNEAK*} düğmesini basılı tutabilir veya yukarı hareket etmek için {*CONTROLLER_ACTION_DPAD_UP*} düğmesini, aşağı hareket etmek için {*CONTROLLER_ACTION_DPAD_DOWN*} düğmesini, sola hareket etmek için {*CONTROLLER_ACTION_DPAD_LEFT*} düğmesini, sağa hareket etmek için {*CONTROLLER_ACTION_DPAD_RIGHT*} düğmesini kullanabilirsiniz. + + + + {*CONTROLLER_ACTION_JUMP*} düğmesine iki kere hızlıca basarak uçabilirsiniz. Uçuştan çıkmak için aynı şeyi tekrarlayın. Daha hızlı uçmak için, uçarken hızlıca {*CONTROLLER_ACTION_MOVE*} çubuğunu iki kere ileri itin. + +Uçuş modunda, yukarı çıkmak için {*CONTROLLER_ACTION_JUMP*} düğmesini basılı tutabilir ve aşağı inmek için {*CONTROLLER_ACTION_SNEAK*} düğmesini basılı tutabilir veya yukarı, aşağı, sola veya sağa hareket etmek için yön düğmeleri kullanabilirsiniz. + + + "KULLANILMIYOR" + + + 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? + + + "KULLANILMIYOR" + + + Arkadaş Davet Et + + + minecraftforum'da PlayStation®Vita Edition için bir bölüm bulunmaktadır. + + + Bu oyun hakkındaki en son haberlere @4JStudios ve @Kappische ile Twitter'dan ulaşabilirsin! + + + NOT USED + + + PlayStation®Vita sisteminde menüler arasında geçiş yapmak için dokunmatik ekranı kullanabilirsiniz! + + + Bir Sonveren Adam'ın gözlerinin içine bakma! + + + {*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. + + + {*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. + + + 4J Studios'un Herobrine'ı PlayStation®4 sistemi oyunundan çıkardığını düşünüyoruz ama emin değiliz. + + + 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? + + + "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. + + + Bu oyuna katılamazsınız çünkü sohbet kısıtlamalarından dolayı bir yerel oyuncunuzun Sony Entertainment Network hesabı Çevrimiçi oyunlara giremiyor. "Daha Fazla Seçenek" bölümündeki "Çevrimiçi Oyun" seçimini kaldırarak çevrimdışı bir oyun başlatın. + + + + Bu 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. + + + Ç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. + + + "PSN" bağlantısı koptu. Ana menüye dönülüyor. + + + "PSN" bağlantısı koptu. + + + Bu dünya daha önce Yaratıcılık Modunda kaydedilmiş ve kupalar ile sıralama tablosu güncellemesi devre dışı. + + + 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? + + + 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? + + + Misafir oyuncular tam sürüm oyunu açamaz. Lütfen Sony Entertainment Network hesabınız ile giriş yapın. + + + Çevrimiçi Kimlik + + + 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 oyun Minecraft: PlayStation®Vita Edition deneme oyunudur. Bu daveti kabul edebilmek için tam sürüm oyun gerekmektedir. Tam sürüm oyunu açmak ister misiniz? + + + Kayıt aktarım alanındaki kayıt dosyası, Minecraft: PlayStation®Vita Edition'ın henüz desteklemediği bir versiyon numarasına sahip. + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/tr-TR/stringsRichPresence.xml b/Minecraft.Client/PSVitaMedia/loc/tr-TR/stringsRichPresence.xml new file mode 100644 index 00000000..8ce3c783 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/tr-TR/stringsRichPresence.xml @@ -0,0 +1,66 @@ + + + + {GAME_STATE} + + + Boş + + + Menülerde + + + Çok Oyunculu Oynanıyor - {GAME_STATE} + + + Çevrimdışı Çok Oyunculu - {GAME_STATE} + + + Tek Başına Oynanıyor - {GAME_STATE} + + + Çevrimdışı Tek Başına - {GAME_STATE} + + + Manzaranın keyfini çıkarıyorum! + + + Domuza biniyor + + + Maden arabasına biniyor + + + Kayıkta + + + Balık tutuyor + + + Üretiyor + + + Dövüm yapıyor + + + Dip Alem'e Doğru + + + Bir plak dinleniyor + + + Haritaya bakılıyor + + + Efsunluyor + + + İksir Yapıyor + + + Örste Çalışıyor + + + Komşularla Buluşuyor + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/zh-CHT/4J_stringsGeneric.xml b/Minecraft.Client/PSVitaMedia/loc/zh-CHT/4J_stringsGeneric.xml new file mode 100644 index 00000000..ca9ab242 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/zh-CHT/4J_stringsGeneric.xml @@ -0,0 +1,87 @@ + + + + 確定 + + + 返回 + + + 取消 + + + + + + + + + 存檔已損毀 + + + 您的遊戲存檔似乎已損毀。要建立新的存檔,並覆寫損毀的存檔嗎? + + + 沒有可用空間 + + + 再選取一次 + + + 進行遊戲且不儲存進度 + + + 建立新存檔 + + + 要覆寫存檔嗎? + + + 否:不要覆寫 + + + 覆寫並存檔 + + + 存檔失敗 + + + 不存檔即繼續 + + + 載入失敗 + + + 為存檔命名 + + + 請為遊戲存檔輸入名稱 + + + 確定要離開遊戲嗎? + + + 已經登出 + + + 繼續進行遊戲 + + + 繼續離線進行遊戲 + + + 訪客玩家 + + + 訪客玩家不能使用 "PSN"。 + + + 正在存檔... + + + 正在儲存遊戲內容,請勿關閉主機。 + + + 解除完整版遊戲鎖定 + + \ 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 new file mode 100644 index 00000000..074621aa --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/zh-CHT/4J_stringsPlatformSpecific.xml @@ -0,0 +1,51 @@ + + + + 無法將設定儲存至 Sony Entertainment Network 帳戶。 + + + Sony Entertainment Network 帳戶疑難 + + + 系統在存取您的 Sony Entertainment Network 帳戶時發生問題,因此您目前無法獲得獎盃。 + + + 這是 Minecraft: "PlayStation 3" Edition 試玩版遊戲。如果您擁有完整版遊戲,那您剛剛會獲得 1 個獎盃! +解除完整版遊戲鎖定即可享受 Minecraft: "PlayStation 3" Edition 的完整樂趣,而且還能透過 "PSN" 與世界各地的好友一起玩遊戲。 +您想要解除完整版遊戲鎖定嗎? + + + 連線至無線隨意網路 + + + 這個遊戲有某些功能需要無線隨意網路連線,但您目前處於離線狀態。 + + + 無線隨意網路現處於離線狀態。 + + + 獎盃疑難 + + + 您已經登出 "PSN",因此配對遊戲已結束" + + + + 您已經登出 "PSN",因此返回標題畫面 + + + 主機儲存空間沒有足夠的可用空間來建立遊戲存檔。 + + + 目前未登入。 + + + 連線至 "PSN" + + + 這個功能需要登入 "PSN" 才能使用。 + + + 這個遊戲有某些功能需要連線至 "PSN" 才能使用,但您目前處於離線狀態。 + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/zh-CHT/AdditionalStrings.xml b/Minecraft.Client/PSVitaMedia/loc/zh-CHT/AdditionalStrings.xml new file mode 100644 index 00000000..e8cf3447 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/zh-CHT/AdditionalStrings.xml @@ -0,0 +1,103 @@ + + + + 顯示所有混搭的遊戲世界 + + + 隱藏 + + + Minecraft: "PlayStation 3" Edition + + + 選項 + + + + 緩存 + + + 發生網路錯誤。 + + + + 網路錯誤 + + + 發生網路錯誤。正在返回主選單。 + + + 您的 Sony Entertainment Network 帳戶因受到交談限制而無法使用線上功能。 + + + 您的 Sony Entertainment Network 帳戶因受到副帳戶的使用限制而無法使用線上功能。 + + + + 線上功能 + + + + 您已登出 "PSN"。您必須再次登入 "PSN" 才能使用本遊戲的線上功能。 + + + 您已登出 "PSN"。您必須再次登入 "PSN" 才能使用本遊戲的線上功能。正在返回主選單。 + + + + 請為玩家 %d 選擇使用者 (或選擇取消,以訪客身分進行遊戲) + + + 免費 + + + 您的選項檔已損毀,必須刪除。 + + + + 刪除選項檔。 + + + 重試載入選項檔。 + + + 您的緩存檔已損毀,必須刪除。 + + + 已停用獎盃 + + + 系統將停用獎盃,因為此存檔屬於另一個使用者。 + + + 發生重大錯誤:無法開啟獎盃資料。請退出遊戲。 + + + 檢視遊戲邀請 + + + 檔案損毀 + + + 控制器連線中斷 + + + 你的控制器連線中斷。請重新連接控制器。 + + + 您的 Sony Entertainment Network 帳戶因受到一個本地用戶的副帳戶的使用限制而無法使用線上功能。 + + + + 因為遊戲更新的推出,線上功能已停用。 + + + 這款遊戲目前沒有可下載內容。 + + + 邀請 + + + 快來玩 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 new file mode 100644 index 00000000..88de8d96 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/zh-CHT/EULA.xml @@ -0,0 +1,99 @@ + + + + Minecraft: "PlayStation Vita" Edition - 使用條款 + 這些條款列出使用 Minecraft: "PlayStation Vita" Edition (以下稱「Minecraft」) 時需遵守的規則。為了保護 Minecraft 及我們社群的成員,我們需利用這些條款列出下載及使用 Minecraft 時需遵守的規則。我們也跟您一樣不喜歡繁瑣的規則,所以會盡量簡短描述,但如果您要購買、下載、使用或遊玩 Minecraft,就必須同意並遵守這些條款 (以下稱「條款」)。 + 在我們正式進入條款部分前,需要先澄清一個概念,Minecraft 是一個允許玩家建造及破壞物品的遊戲,如果您與其他人 (多人遊戲) 一起進行遊戲,可以與這些玩家一起建造物品,或破壞其他人所建造的物品,而他們也一樣可以這麼做。因此,若其他玩家的行為不符合您的期望,請不要與他們一起進行遊戲。此外,有時候玩家也可能做出不當的行為,我們當然不希望發生這種情況,但我們除了要求所有玩家自律,其他能做的並不多,並無法確實地阻止這些行為出現。若有人行為失當,我們仰賴您及您社群中的同伴通知我們;而若發生這種情況且/或您認為某人違反規則或這些條款,或是有不當使用 Minecraft 的情形,也請通報我們。我們的標記 / 回報系統可讓您完成上述動作,請充分利用。我們將會針對任何不當行為採取必要行動。 + 若要標記或回報任何問題,請寄送電子郵件至 support@mojang.com,內容請提供盡可能詳細的資訊 (例如使用者的詳細資料以及發生的事件)。 + 現在正式進入條款部分: + 重大原則 + 重大原則是不得散佈我們所製作的任何內容。「散佈我們所製作的任何內容」指的是「轉送 Minecraft 複本、用於商業用途、企圖從中賺取利益,或是讓他人以不公平或不合理方式取用 Minecraft 及其部分內容」。故除非我們明確同意 (例如在「品牌與資產使用準則 (Brand and Asset Usage Guidelines)」中),重大原則即為您不得: + • 轉送 Minecraft 複本給他人; + • 將我們所製作的內容用於商業用途; + • 企圖從我們所製作的內容中賺取利益;或 + • 讓他人以不公平或不合理方式取用 Minecraft 及其部分內容。 + ...故我們的規則完全透明,我們所製作的內容包含但不限於 Minecraft 的用戶端或伺服器軟體,也包含遊戲的修正版本、其中的部分內容或我們所製作的任何其他內容。 + 除此之外,我們對於您其他方面的行為並無嚴格限制,事實上,只要不違反我們所列出的禁止事項,我們相當鼓勵您做些很酷的事 (請見以下內容)。 + 使用 Minecraft + • 如果您購買了 Minecraft,就可以在您的 "PlayStation Vita" 主機上自行使用這款遊戲。 + • 我們也在下方列出您從事其他事項時的有限權利,但我們必須界定出合理範圍,以免有人做出過分行為。如果您希望製作任何與我們所製作內容相關的東西,我們備感榮幸,但請確認您所製作的內容不能冠上官方名義,且必須遵守這些條款,最重要的是不得將我們所製作的任何內容用於商業用途。 + • 如果您違反這些條款,我們可能會撤銷您使用及玩 Minecraft 遊戲的權限。 + • 當您購買了 Minecraft,我們即授予您的 "PlayStation Vita" 主機上安裝 Minecraft 的權限,並可如這些條款所述在該 "PlayStation Vita" 主機上進行遊戲。這個權限僅適用於您個人,所以您不可以散佈 Minecraft (或其任何部分) 給任何人 (除非經我們明確允許)。 + • 您可以在合理範圍內盡情使用 Minecraft 的螢幕擷取畫面和視訊。「合理範圍內」指的是不得將其用於商業用途,或是做出任何不公平或對我們的權利造成不利影響的行為。此外,請勿任意擷取美術圖檔資源並加以散發,這樣做並不有趣。 + • 簡單規則的本質就是不得將我們所製作的任何內容用於商業用途,除非我們在「品牌與資產使用準則 (Brand and Asset Usage Guidelines)」中或根據這些條款明確表示同意 。此外,在法律明確允許 (例如在「公平使用」或「公平交易」原則之下) 的情況下也適用,但僅限於該法律提及的範圍之內。 + Minecraft 的所有權及其他事項 + • 雖然我們授予您遊玩 Minecraft 的權限,其所有者仍是我們。我們也是品牌和 Minecraft 中所含全部內容的所有者,這些內容是由我們的軟體、結構、資產、工具、基礎設施和大量我們所擁有的其他巧妙 (或許有些不太巧妙) 的內容集結而成。我們維護並保留所有針對這些內容的權利,但您可以在條款允許範圍內使用。 + • 這並不是指我們擁有您使用 Minecraft 所創作出的酷玩意,但您必須接受我們將 Minecraft 的每一部分內容及 Minecraft 做為一項產品和服務來擁有,並擁有前句中所述的內容,此外也擁有版權、與那些內容相關的其他智慧財產權 (簡稱「IPR」) 和與 Minecraft 相關的名稱與品牌。 + • 您當然可以使用 Minecraft 並在當中製作屬於自己的內容。我們並不擁有您所創作的原創內容,也不會對任何不應屬於我們的內容宣示所有權。不過,如果您創作出不屬於我們的原創內容,我們仍將擁有內容複本 (或實質複本) 或是由我們的資產與創作內容 (上述所列) 所衍生出的內容的所有權。舉例來說: + - 一個單一方塊 – 所有權歸我們; + - 有雲霄飛車從中穿越的哥德式教堂 – 所有權不歸我們。 + • 因此,當您付費使用 Minecraft,您等於僅購買了在遵守這些條款的情況下使用 Minecraft 產品的權限。您所擁有的 Minecraft 相關權限,僅限於我們在這些條款中所列出的權限。 + 內容 + • 如果您要在 Minecraft 上或透過 Minecraft 發表任何內容,必須給我們使用、複製、修改和調整該內容的權限,此權限必須為不可撤銷且不受限制。您也必須讓我們擁有授權他人使用您內容的權限,並讓其他經過您允許的人 (例如跟您一起玩多人遊戲的夥伴) 取用該內容。 + • 發表任何內容前請先謹慎考慮,因為這可能會使該內容向大眾公開,且可能被他人以您不喜歡的方式使用。 + • 如果您要在 Minecraft 上或透過 Minecraft 發表某項內容,該內容不得冒犯任何人或違法,內容必須正當且確實是由您自行創作。不得使用 Minecraft 來發表的內容類型包含:含有種族或同性戀歧視字眼的文章、霸凌或攻擊性文章、可能有損我們或他人名譽的文章、含有色情、廣告或他人創作或影像的文章、冒充版主身分或嘗試欺騙或利用他人的文章。 + • 在 Minecraft 上發表的所有內容皆必須是您自己的創作。不得使用 Minecraft 發表會侵犯他人權利之任何內容。如果您在 Minecraft 上發佈的內容侵犯了他人權利,使我們遭受他人挑戰、威脅或控告,我們可能會要求您負起責任,這表示您可能需要賠償我們因該事件所受到的損失。因此,您只能發表自己創作的內容,而不能對他人創作的內容進行同樣動作,這點非常重要。 + • 請謹慎挑選玩家夥伴。不論是您還是我們,都很難確定他人所說的話是真是假,甚至沒辦法判斷他們自稱的身分是否屬實。您也不應透過 Minecraft 透漏自己的相關資訊。 + 如果您要使用 Minecraft 發表內容 (以下稱「您的內容」),必須: + - 遵守 Sony Computer Entertainment 的所有規則,包含 ToSUA,即為 "PSN" 使用條款及用戶合約,以及您必須同意才能使用您的 "PlayStation Vita" 主機和 "PSN" 的所有其他準則; + - 不可冒犯他人; + - 不可違規或違法; + - 內容正當且不誤導、欺騙或利用他人,也不可冒充他人身分; + - 不侵犯任何人的版權或其他權利; + - 無種族、性別或同性戀歧視; + - 不具霸凌或攻擊性; + - 不損害我們或他人名譽; + - 不含色情內容; + - 不含廣告內容。 + - 不得使用 Minecraft 發表會侵犯他人權利之任何內容。 + • 您需對使用 Minecraft 發表之所有內容負責。 + • 發表您的內容即代表您保證且表示您根據這些條款擁有完整資格進行此行為,且我們有資格實行您根據這些條款授予我們的權限。 + • 如果您使用 Minecraft 發表任何內容或在 Minecraft 上的任何人引用或透過 Minecraft 發表的任何內容使我們遭受他人挑戰、威脅或控告,該內容可能會遭到移除,而我們可能會要求您負起責任,且您可能需要賠償我們因該事件所受到的損失。您對 Minecraft 特定方面的存取權也可能遭到移除或暫停。 + 使用者內容 + 以下列出的條款是關於您的內容及其他使用者引用你的內容 (簡稱為「使用者內容」)。Minecraft 為一項娛樂服務及其輔助內容,我們 (和 Sony Computer Entertainment 等獲授權者) 得以傳輸、散佈、儲存和檢索使用者內容,而不會檢閱、挑選或變更該內容。這表示我們不會檢閱使用者內容,所以不會知道您或其他玩家之間流通的內容為何。您與其他玩家必須遵守我們在條款中列出的這些規則,但我們並非無所不知。 + 因此,請注意: + • 使用者內容中所呈現的觀點,皆為個人撰寫者或創作者的觀點,並非我們或與我們相關之任何人士的觀點,除非我們明確指出; + • 我們無需對所有使用者內容 (包含其中表達的任何評論、觀點和言辭) 負責 (且不做出任何相關或免除所有責任的保證或陳述); + • 如果使用了 Minecraft,就代表您瞭解我們不負責檢閱任何使用者內容,且所有使用者內容取用權的開放基礎是,我們無需也不會對該內容實行任何控制或評判。 + 但是,我們 (或 Sony Computer Entertainment 等獲授權者) 可能會移除、拒絕或暫停存取任何使用者內容的權利,並移除或暫停您發佈、開放或存取使用者內容的權利,包含視情況 (例如您違反這些條款且我們收到抱怨) 移除或暫停存取 Minecraft 或 "PSN" 的權利。如果我們察覺到使用者內容確實違法,我們也會迅速採取行動,移除或停用該使用者內容的存取權。 + 升級 + • 我們不定時會提供升級和更新,但並沒有這麼做的義務。我們也沒有義務對任何遊戲持續提供支援或維護。當然,我們希望能持續發佈 Minecraft 的更新,只是無法保證如預期提供。 + 我們的責任 + • 若您取得 Minecraft 的複本,我們是以「原樣」提供,更新和升級也是以「原樣」提供。這表示我們不向您做出任何承諾,不保證標準或 Minecraft 的品質,也不保證 Minecraft 將不會出現任何中斷情形或錯誤,或是任何可能造成的損失或損害。我們只承諾提供 Minecraft 和任何具備合理技能與支援的服務。大多數國家/地區的法律皆指出,我們無法對於因我們的疏忽所導致的死亡或個人傷害情形免除責任,所以如果您的電腦因為我們做錯了什麼而跳起來刺傷了您,我們就得負起責任。 + 我們對於以下情形不需擔負責任: + • 您或他人的 Minecraft 使用或錯誤使用情形; + • 您使用 Minecraft 發表的任何內容; + • 您對於這些條款的任何違反情形; + • 他人對任何條款的任何違反情形。 + 終止 + • 如果您違反這些條款,我們可以視情況終止您的 Minecraft 使用權利。您也可以隨時自行終止此權利,只需要將 Minecraft 從您的 "PlayStation Vita" 主機上解除安裝即可。無論發生任何情況,「MINECRAFT 的所有權」、「我們的責任」和「一般事項」在終止後仍持續適用。 + 一般事項 + • 這些條款會依您可能擁有的法律權利而變動。這些條款不會限制您根據法律可能未排除的任何權利,也不會排除或限制我們因我們的疏忽所導致的死亡或個人傷害情形、以及欺騙性陳述所需擔負的責任。 + • 我們可能會偶爾變更這些條款,但任何變更僅會在法律適用範圍內生效。例如,如果您僅於單人遊戲模式中使用 Minecraft,且未使用我們開放取用的更新,則適用舊版 EULA;但如果您確實使用更新或藉由我們持續提供的線上服務使用 Minecraft 的部分內容,則適用新 EULA。在這種情況下,我們可能無法 / 無需通知您變更來使其生效,所以您應該偶爾回來這裡確認,瞭解這些條款是否有任何變更。雖然我們不會以不公平的方法處理這種情況,但有時法律會有所變更,或有人會做出影響其他 Minecraft 使用者的行為,所以我們必須採取行動來防止情況惡化。 + • 如果您向我們提出有關 Minecraft 或我們任何其他遊戲的建議,該建議為無償提出。這表示我們可以用任何方式採取您的建議,且不需要向您支付任何費用。如果您認為您的建議值得讓我們產生支付費用的意願,請務必在提出建議之前告知我們您希望收取費用。 + • 除了這些條款之外,我們還有一些「品牌與資產使用準則 (Brand and Asset Usage Guidelines)」可供您在線上取得。 + • 如果您違反這些規則,我們 (或 Sony Computer Entertainment) 可能會阻止您使用 Minecraft。如果您不想或是無法同意這些規則,則請勿購買、下載、使用或遊玩 Minecraft。 + 如果您所抱持的任何法律疑慮無法在此頁面獲得解答,請立即詢問我們。基本上,只要內容合理,我們都能給予適當回覆。 + 我們是: + Mojang AB + Maria Skolgata 83, + SE-11853 + Stockholm + Sweden + 組織編號:556819-2388 + + + + + 在商店以及遊戲內商店購買的任何內容都將從 Sony Network Entertainment Europe Limited (簡稱「SNEE」) 購得,且需遵守 Sony Entertainment Network 使用條款及用戶合約 (可於 "PlayStation Store" 取得)。請確認每個購買項目的使用權利,因為不同項目的權利可能有所差異。除非有特別說明,否則在任何遊戲內商店中可取用之內容的年齡分級與遊戲相同。 + + + + 項目的購買與使用需遵守 Sony Entertainment Network 使用條款及用戶合約。此線上服務已由 Sony Computer Entertainment America 再授權予您。 + + + + 請記住:使用此軟體須遵守 eu.playstation.com/legal 網頁上所述的軟體使用條款。 + + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/zh-CHT/stringsDynafont.xml b/Minecraft.Client/PSVitaMedia/loc/zh-CHT/stringsDynafont.xml new file mode 100644 index 00000000..dca31ec2 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/zh-CHT/stringsDynafont.xml @@ -0,0 +1,7 @@ + + + + DynaFont developed by DynaComware. + + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/zh-CHT/stringsGeneric.xml b/Minecraft.Client/PSVitaMedia/loc/zh-CHT/stringsGeneric.xml new file mode 100644 index 00000000..bf215fe1 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/zh-CHT/stringsGeneric.xml @@ -0,0 +1,6877 @@ + + + + 正在切換至離線遊戲 + + + 伺服器正在儲存遊戲資料,請稍候 + + + 正在進入終界 + + + 正在儲存玩家資料 + + + 正在與主持人連線 + + + 正在下載地形 + + + 正在離開終界 + + + 您家中的床舖已消失,或是被擋住了 + + + 附近有怪物,您不能休息 + + + 您正在床舖上睡覺。如要讓遊戲時間快轉至日出,所有玩家都必須同時睡在床舖上。 + + + 這張床已經有人佔據了 + + + 您只能在夜晚睡覺 + + + %s 正在床舖上睡覺。如要讓遊戲時間快轉至日出,所有玩家都必須同時睡在床舖上。 + + + 正在載入關卡 + + + 正在完成... + + + 正在建造地形 + + + 正在模擬世界 + + + 排名 + + + 正在準備儲存關卡資料 + + + 正在準備區塊... + + + 正在啟動伺服器 + + + 正在離開地獄 + + + 再生中 + + + 正在產生關卡 + + + 正在產生再生區域 + + + 正在載入再生區域 + + + 正在進入地獄 + + + 工具與武器 + + + 色差補正 + + + 遊戲靈敏度 + + + 介面靈敏度 + + + 困難度 + + + 音樂 + + + 音效 + + + 和平 + + + 在這個模式中,玩家的生命值會隨時間自動回復,且遊戲環境中不會出現敵人。 + + + 在這個模式中,遊戲世界會出現敵人,但敵人只會對玩家造成少量的傷害。 + + + 在這個模式中,遊戲世界會出現敵人,且敵人會對玩家造成普通的傷害。 + + + 容易 + + + 普通 + + + 困難 + + + 已經登出 + + + 護甲 + + + 機械 + + + 運送 + + + 武器 + + + 食物 + + + 建築 + + + 裝飾 + + + 釀製 + + + 工具、武器與護甲 + + + 材料 + + + 建築材料 + + + 紅石與運送方式 + + + 雜項 + + + 項目: + + + 不存檔即離開 + + + 確定要離開並返回主畫面嗎?您將因此失去尚未儲存的遊戲進度。 + + + 確定要離開並返回主畫面嗎?您將因此失去遊戲進度! + + + 這個存檔已損毀。想要刪除這個存檔嗎? + + + 確定要離開並返回主畫面,同時中斷遊戲中所有玩家的連線嗎?您將因此失去尚未儲存的遊戲進度。 + + + 離開並存檔 + + + 建立新世界 + + + 請為您的世界輸入一個名稱 + + + 輸入用來產生新世界的種子 + + + 載入已存檔的世界 + + + 進行教學課程 + + + 教學課程 + + + 為您的世界命名 + + + 損毀的存檔 + + + 確定 + + + 取消 + + + Minecraft 商店 + + + 旋轉 + + + 隱藏 + + + 清除所有空格 + + + 確定要離開目前的遊戲,並加入新的遊戲嗎?您將因此失去尚未儲存的遊戲進度。 + + + 確定要用這個世界目前的存檔,來覆寫同一世界之前的存檔嗎? + + + 確定要不儲存即離開嗎?您將因此失去在這個世界的所有遊戲進度! + + + 開始遊戲 + + + 離開遊戲 + + + 儲存遊戲 + + + 不儲存即離開 + + + 按下 START 按鈕來加入遊戲 + + + 太棒了!您獲得 1 個玩家圖示,主角就是 Minecraft 裡的 Steve! + + + 太棒了!您獲得 1 個玩家圖示,主角就是 Creeper! + + + 解除完整版遊戲鎖定 + + + 由於您嘗試加入的玩家執行的遊戲版本較新,所以您無法加入此遊戲。 + + + 新世界 + + + 已解除獎項鎖定! + + + 您正在玩試玩版遊戲,但您必須擁有完整版遊戲才能儲存遊戲進度。 +想要立刻解除完整版遊戲鎖定嗎? + + + 好友 + + + 我的分數 + + + 整體 + + + 請稍候 + + + 沒有搜尋結果 + + + 篩選條件: + + + 由於您嘗試加入的玩家執行的遊戲版本較舊,所以您無法加入此遊戲。 + + + 連線中斷 + + + 與伺服器的連線中斷。即將離開遊戲並返回主畫面。 + + + 伺服器中斷連線 + + + 正在離開遊戲 + + + 發生錯誤,即將離開遊戲並返回主畫面。 + + + 連線失敗 + + + 您被踢出遊戲 + + + 主持人已經離開遊戲。 + + + 您無法加入這個遊戲,因為該遊戲中沒有任何玩家是您的好友。 + + + 您無法加入這個遊戲,因為您之前已經被主持人踢出遊戲。 + + + 您因為飛翔而被踢出遊戲 + + + 嘗試連線的時間太久 + + + 伺服器人數已滿 + + + 在這個模式中,遊戲世界會出現敵人,且敵人會對玩家造成嚴重的傷害。千萬要留意 Creeper,因為當您嘗試遠離時,Creeper 可不會取消爆炸攻擊! + + + 主題 + + + 角色外觀套件 + + + 允許好友的好友加入 + + + 踢除玩家 + + + 確定要將該玩家踢出這個遊戲嗎?除非您讓這個世界重新開始,該玩家才能重新加入遊戲。 + + + 玩家圖示套件 + + + 您無法加入這個遊戲,因為只有主持人的好友才能加入。 + + + 損毀的下載內容 + + + 這個下載內容已經損毀,因此無法使用。您必須刪除該下載內容,然後從 [Minecraft 商店] 選單重新安裝。 + + + 您有部分的下載內容已經損毀,因此無法使用。您必須刪除這些下載內容,然後從 [Minecraft 商店] 選單重新安裝。 + + + 無法加入遊戲 + + + 已選取 + + + 已選取的角色外觀: + + + 取得完整版 + + + 解除材質套件鎖定 + + + 您必須先解除這個材質套件的鎖定才能在您的世界中使用。 +您想要立刻解除這個材質套件的鎖定嗎? + + + 試用版材質套件 + + + 種子 + + + 解除角色外觀套件鎖定 + + + 如要使用您選取的角色外觀,您必須先解除這個角色外觀套件的鎖定。 +您想要立刻解除這個角色外觀套件的鎖定嗎? + + + 您目前所使用的是試用版的材質套件。只有解除完整版鎖定才能將這個世界存檔。 +您想要解除完整版材質套件的鎖定嗎? + + + 下載完整版 + + + 您沒有這個世界所使用的混搭套件或材質套件! +您想要立刻安裝混搭套件或材質套件嗎? + + + 取得試用版 + + + 沒有材質套件 + + + 解除完整版鎖定 + + + 下載試用版 + + + 遊戲模式已經變更 + + + 啟用此選項時,只限被邀請的玩家才能加入。 + + + 啟用此選項時,您好友的朋友便可以加入遊戲。 + + + 啟用此選項時,玩家可以對其他玩家造成傷害。只有在生存模式才會生效。 + + + 普通 + + + 非常平坦 + + + 啟用此選項時,本遊戲將成為線上遊戲。 + + + 停用此選項時,加入遊戲的玩家需要取得同意才能建造或開採。 + + + 啟用此選項時,會在遊戲世界中產生村落和地下要塞等建築。 + + + 啟用此選項時,會在地上世界與地獄世界中產生地形完全平坦的世界。 + + + 啟用此選項時,玩家的再生點附近會產生一個裝著有用物品的箱子。 + + + 啟用此選項時,火可能會蔓延到鄰近的易燃方塊。 + + + 啟用此選項時,炸藥會在點燃後爆炸。 + + + 啟用此選項時,會重新產生地獄世界。如果您的舊存檔中沒有地獄要塞,這將會很有用。 + + + 關閉 + + + 遊戲模式:創造 + + + 生存 + + + 創造 + + + 重新為您的世界命名 + + + 請為您的世界輸入新的名稱 + + + 遊戲模式:生存 + + + 在生存模式中建立 + + + 重新為存檔命名 + + + 自動存檔倒數 %d... + + + 開啟 + + + 在創造模式中建立 + + + 產生雲朵 + + + 您要如何處理這個遊戲存檔? + + + 平行顯示器大小 (分割畫面) + + + 材料 + + + 燃料 + + + 分發器 + + + 箱子 + + + 附加能力 + + + 熔爐 + + + 這款遊戲目前沒有此類型的下載內容。 + + + 確定要刪除這個遊戲存檔嗎? + + + 正在等待核准 + + + 已審查 + + + %s 已經加入遊戲。 + + + %s 已經離開遊戲。 + + + %s 已被踢出遊戲。 + + + 釀製台 + + + 輸入牌子的文字 + + + 請輸入牌子上的文字 + + + 輸入標題 + + + 試玩版遊戲時間結束 + + + 遊戲人數已滿 + + + 已無空位,因此無法加入遊戲 + + + 請輸入文章的標題 + + + 請輸入文章的描述 + + + 物品欄 + + + 材料 + + + 輸入說明 + + + 請輸入文章的說明 + + + 輸入描述 + + + 現在正在播放: + + + 確定要把這個關卡加入禁用關卡清單嗎? +如果您選取 [確定],將會離開這個遊戲。 + + + 從禁用清單中移除 + + + 自動存檔時間間隔 + + + 已禁用的關卡 + + + 您要加入的遊戲已經列在您的禁用關卡清單中。 +如果您要加入這個遊戲,系統會把這個關卡從禁用關卡清單中移除。 + + + 要禁用這個關卡嗎? + + + 自動存檔時間間隔:關閉 + + + 介面透明度 + + + 正在準備自動儲存關卡資料 + + + 平行顯示器大小 + + + 分鐘 + + + 不能放置在這裡! + + + 您無法在關卡再生點附近放置熔岩,以避免讓再生的玩家立刻死亡。 + + + 最愛的角色外觀 + + + %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 個方塊高的框架,就能製造傳送門。框架的 4 個邊角不需要放置方塊。 + + + 您可以利用地獄世界在地上世界中快速移動,因為在地獄世界移動 1 個方塊的距離,就等於在地上世界移動 3 個方塊的距離。 + + + 您正以創造模式進行遊戲。 + + + {*B*} + 按下 {*CONTROLLER_VK_A*} 即可進一步了解創造模式的相關知識。{*B*} + 如果您已經了解創造模式的相關知識,請按下 {*CONTROLLER_VK_B*}。 + + + + 如要啟動地獄傳送門,只要用打火鐮點燃框架內側的黑曜石方塊即可。當傳送門的框架損壞、附近發生爆炸,或是有液體流過傳送門時,傳送門就會失效。 + + + + 如要使用地獄傳送門,請站在傳送門裡面。此時您會看到畫面變成紫色,還會聽到某種聲音。幾秒鐘後,您就會被傳送到地獄。 + + + 地獄是個危險的地方,到處都是熔岩,但也是收集地獄血石和閃石的好地方。地獄血石只要一點燃就會永遠燃燒,而閃石則可作為光源。 + + + 您已完成耕種的教學課程。 + + + 不同材質的方塊,就應該要用適合的工具進行開採。建議您使用斧頭來劈砍樹幹。 + + + 不同材質的方塊,就應該要用適合的工具進行開採。建議您使用十字鎬來開採石頭及礦石,但您可能需要用更好的材料來製造十字鎬,才能開採某些較硬的方塊。 + + + 某些工具比較適合用來攻擊敵人。請考慮使用劍來攻擊。 + + + 鐵傀儡還會自然出現來保護村落,如果您攻擊村民,就會遭到鐵傀儡的攻擊。 + + + 您必須完成教學課程,才能離開這個地區。 + + + 不同材質的方塊,就應該要用適合的工具進行開採。建議您使用鏟子來開採材質較軟的方塊,例如泥土和沙子。 + + + 提示:按住 {*CONTROLLER_ACTION_ACTION*} 即可用您的手或是手中握住的東西來開採及劈砍資源。但您可能需要精製出工具來開採某些方塊… + + + 河邊的箱子中有艘小船。如要放置小船,請把游標指向水面,然後按下 {*CONTROLLER_ACTION_USE*} 即可。當您把游標指向小船時,使用 {*CONTROLLER_ACTION_USE*} 即可上船。 + + + 池塘邊的箱子中有根釣魚竿。請把釣魚竿拿出箱子,然後選取它作為您手中握住的物品來使用。 + + + 這個更進階的活塞機械系統可產生會自行修復的橋樑喔!請按下按鈕啟動,然後觀察各個零件的互動方式,了解更多資訊。 + + + 您正在使用的工具受損了。工具每次使用時都會受損,到最後就會完全損壞。在物品欄中,物品下方的色彩列即為目前的損害狀態。 + + + 按住 {*CONTROLLER_ACTION_JUMP*} 即可往上游。 + + + 這個地區的軌道上有台礦車。如要坐上礦車,請把游標指向礦車,然後按下 {*CONTROLLER_ACTION_USE*} 即可。對按鈕使用 {*CONTROLLER_ACTION_USE*} 即可讓礦車移動。 + + + 製作鐵傀儡需要 4 個帶有指定圖案的鐵方塊,在中間的方塊上方放 1 個南瓜。鐵傀儡會攻擊您的敵人。 + + + 餵乳牛、Mooshroom 或綿羊吃小麥,餵豬吃胡蘿蔔,餵雞吃小麥種子或地獄結節,餵狼吃肉,然後這些動物就會開始尋找周遭也處於戀愛模式中的同種類動物。 + + + 當同在戀愛模式中的兩隻同種類動物相遇,牠們會先親吻數秒,然後就會出現剛出生的小動物。小動物一開始會跟在父母身旁,之後就會長成一般成年動物的大小。 + + + 剛結束戀愛模式的動物必須等待大約五分鐘後,才能再次進入戀愛模式。 + + + 這個地區已經豢養數隻動物。您可以開始讓動物繁殖,培育小動物。 + + + + {*B*} + 按下 {*CONTROLLER_VK_A*} 即可進一步了解動物與繁殖的相關知識。{*B*} + 如果您已經了解動物與繁殖的相關知識,請按下 {*CONTROLLER_VK_B*}。 + + + + 您必須餵動物吃特定的食物,讓動物進入「戀愛模式」,動物才能繁殖。 + + + 當您手中握著動物的食物時,有些動物會跟著您,這可以協助您將一群動物聚集起來繁殖。{*ICON*}296{*/ICON*} + + + {*B*} + 按下 {*CONTROLLER_VK_A*} 即可進一步了解雪人和鐵傀儡的相關知識。{*B*} + 如果您已經了解雪人和鐵傀儡的相關知識,請按下{*CONTROLLER_VK_B*}。 + + + 放 1 個南瓜在方塊堆頂端就可以製作出傀儡。 + + + 製作雪人需要將 2 個白雪方塊疊在一起,最頂端放 1 個南瓜。雪人會向您的敵人丟雪球。 + + + + 您可以給野狼提供骨頭來馴服牠們。馴服成功後,狼的周圍會出現一些愛心。經過馴服的狼若沒有收到坐下的指示,會一直跟在玩家身邊並保護玩家。 + + + + 您已完成動物與繁殖的教學課程。 + + + 這個地區有一些南瓜和方塊可以用來製作雪人和鐵傀儡。 + + + 動力來源的放置位置和方向,會改變它對周遭方塊的影響方式。舉例來說,如果您把紅石火把連接到方塊側邊,當這個方塊從其他來源獲得動力時,紅石火把就會熄滅。 + + + 如果水槽空了,您可以用水桶幫水槽加水。 + + + 在釀製台上使用水瓶、地獄結節和熔岩球,即可製造防火藥水。 + + + + 手中持有藥水時,只要按住 {*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*} 。 + + + 選取 + + + 使用 + + + 在這個地區裡,有幾個可協助您了解釣魚、小船、活塞和紅石等相關知識的區域。 + + + 在這個地區外,您會發現有關建築物、耕種、礦車和軌道、附加能力、釀製、交易、鍛造等知識的範例! + + + 您的食物列已消耗到無法讓生命值自動回復的程度。 + + + 撿起 + + + 下一個 + + + 上一個 + + + 踢除玩家 + + + 傳送好友請求 + + + 下一頁 + + + 上一頁 + + + 染色 + + + 治療 + + + 坐下 + + + 跟著我 + + + 開採 + + + 餵食 + + + 馴服 + + + 變更篩選條件 + + + 全部放置 + + + 放置 1 個 + + + 丟棄 + + + 全部撿起 + + + 撿起一半 + + + 放置 + + + 全部丟棄 + + + 清除快速選取 + + + 這是什麼? + + + 分享至 Facebook + + + 丟棄 1 個 + + + 交換 + + + 快速移動 + + + 角色外觀套件 + + + 紅色玻璃片 + + + 綠色玻璃片 + + + 棕色玻璃片 + + + 白色玻璃 + + + 染色玻璃片 + + + 黑色玻璃片 + + + 藍色玻璃片 + + + 灰色玻璃片 + + + 粉紅玻璃片 + + + 淺綠色玻璃片 + + + 紫色玻璃片 + + + 青色玻璃片 + + + 淡灰色玻璃片 + + + 橘色玻璃 + + + 藍色玻璃 + + + 紫色玻璃 + + + 青色玻璃 + + + 紅色玻璃 + + + 綠色玻璃 + + + 棕色玻璃 + + + 淺灰色玻璃 + + + 黃色玻璃 + + + 淺藍色玻璃 + + + 桃紅色玻璃 + + + 灰色玻璃 + + + 粉紅色玻璃 + + + 淺綠色玻璃 + + + 黃色玻璃片 + + + 淺灰色 + + + 灰色 + + + 粉紅色 + + + 藍色 + + + 紫色 + + + 青色 + + + 淺綠色 + + + 橘色 + + + 白色 + + + 自訂 + + + 黃色 + + + 淺藍色 + + + 洋紅色 + + + 棕色 + + + 白色玻璃片 + + + 小型球狀 + + + 大型球狀 + + + 淺藍色玻璃片 + + + 洋紅玻璃片 + + + 橘色玻璃片 + + + 星狀 + + + 黑色 + + + 紅色 + + + 綠色 + + + Creeper 形 + + + 爆裂 + + + 未知形狀 + + + 黑色玻璃 + + + 鐵製馬鎧 + + + 黃金製馬鎧 + + + 鑽石製馬鎧 + + + 紅石比較器 + + + 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*} +{*C3*}我們是誰?我們曾被稱為山神、陽父、月母、祖靈、獸靈、神仙、神靈、天地精華。又被稱為神明、魔鬼、天使、鬼、外星人、輕子、夸克。文字會改變,我們從未改變。{*EF*}{*B*}{*B*} +{*C2*}我們是宇宙。所有你認為不是你的一切都是我們。你正在透過你的皮膚和雙眼看著我們。宇宙為何要觸碰你的皮膚,將光投向你?玩家,是為了要看你。我們想認識你,想要你認識我們。我將告訴你一個故事。{*EF*}{*B*}{*B*} +{*C2*}很久很久以前,有一位玩家。{*EF*}{*B*}{*B*} +{*C3*}那位玩家就是你,{*PLAYER*}。{*EF*}{*B*}{*B*} +{*C2*}有的時候他認為自己是人類,處在一顆自轉熔岩球體的薄薄地殼上。這顆熔岩球體繞行著一顆比自己大 33 萬倍的炙熱氣體球。「光」需要 8 分鐘才能橫渡這兩者之間的距離。「光」是來自恆星的訊息,能在一億五千萬公里之外灼傷你的皮膚。{*EF*}{*B*}{*B*} +{*C2*}有時候,那位玩家夢見自己是採礦人,所處的世界有著平坦無盡的地表。太陽是一個白色方塊。一天很短暫,要做的事情卻很多,而死亡只不過是一時的小小不便。{*EF*}{*B*}{*B*} +{*C3*}有時候,玩家夢見自己迷失在故事裡。{*EF*}{*B*}{*B*} +{*C2*}有時候,玩家夢見自己是別的東西、身在其他場所。有時這些夢境令人不安,有時卻極其美麗。有時候玩家會從一個夢中甦醒至下一個夢中,然後再進入第三個夢。{*EF*}{*B*}{*B*} +{*C3*}有時玩家夢見自己看著螢幕上的字。{*EF*}{*B*}{*B*} +{*C2*}讓我們回溯一下。{*EF*}{*B*}{*B*} +{*C2*}玩家的原子分散在草地、河流、空氣和土壤中。一位女性蒐集這些原子,她吃下、飲用、吸入它們,然後在她的體內組織成玩家。{*EF*}{*B*}{*B*} +{*C2*}然後玩家從母親體內那溫暖黑暗的世界中甦醒過來,甦醒至一場長夢當中。{*EF*}{*B*}{*B*} +{*C2*}玩家被寫成 DNA,成為一個不曾被訴說過的新故事。玩家成為一個以具有十億年歷史的原始碼所寫成的新程式,從未執行過。玩家成為一個以乳水與愛所孕育而成的新人類,在此之前不曾活過。{*EF*}{*B*}{*B*} +{*C3*}你就是那位玩家。那個故事。那個程式。那個人類。以乳水和愛孕育而成。{*EF*}{*B*}{*B*} +{*C2*}讓我們再回溯得遠一點。{*EF*}{*B*}{*B*} +{*C2*}組成玩家身體的這七千萬億顆原子,早在遊戲存在之前,就已在恆星的中心被創造出來。因此,玩家也是來自恆星的訊息。玩家所通過的故事,就是訊息所組成的叢林,這個訊息叢林由一位名為 Julian 的人所種下,在名為 Markus 的人所創造的平坦無盡世界上滋生,並在玩家所創造的小小私人世界中存在著。創造玩家所居住的這個宇宙的人是...{*EF*}{*B*}{*B*} +{*C3*}噓。玩家所創造的小小私人世界有時輕鬆、溫暖而單純,有時則艱險、寒冷而複雜。有時他會在腦中建造宇宙模型;那些穿越龐大空間的能量微粒,有時候會被他稱為「電子」和「質子」。{*EF*}{*B*}{*B*} + + + {*C2*}有時候,他稱它們為「行星」和「恆星」。{*EF*}{*B*}{*B*} +{*C2*}有時候,他相信自己所處的宇宙由能量組成,而這能量又由關與開、0 與 1、一行又一行的程式碼所組成。有時候,他相信自己正在進行一場遊戲。有時候,他相信自己正在閱讀螢幕上的文字。{*EF*}{*B*}{*B*} +{*C3*}你就是那位玩家,讀著文字...{*EF*}{*B*}{*B*} +{*C2*}噓... 有時候,玩家讀著螢幕上的程式碼,將程式碼解讀成文字、將文字解讀成意義、將意義解讀成感覺、情緒、理論、思想。然後玩家的呼吸變得越來越快、越來越沈重,他發現自己活著,真正活著;那數千次的死亡都不是真的,玩家還活著。{*EF*}{*B*}{*B*} +{*C3*}你。就是你。你還活著。{*EF*}{*B*}{*B*} +{*C2*}有時候,玩家相信自己聽到宇宙透過夏季綠葉間流瀉的陽光和他說話。{*EF*}{*B*}{*B*} +{*C3*}有時候,玩家相信自己聽到宇宙在冷冽冬夜中射下光芒和他說話。那閃現在玩家眼角的微光,可能是一顆比太陽大百萬倍的恆星,為了在那一瞬間讓玩家看到,而驟燒化為離子,好讓在宇宙遠端漫步回家的玩家,突然間聞到食物的香氣,感覺自己幾乎就要抵達那道熟悉的門前,準備好再度入夢。{*EF*}{*B*}{*B*} +{*C2*}有時候,玩家相信宇宙透過 0 和 1、透過世上的電流、透過夢境結束時在螢幕上捲動的文字和他說話。{*EF*}{*B*}{*B*} +{*C3*}而宇宙說「我愛你」。{*EF*}{*B*}{*B*} +{*C2*}宇宙說你在遊戲中表現得很好。{*EF*}{*B*}{*B*} +{*C3*}宇宙說你已具備你所需的一切。{*EF*}{*B*}{*B*} +{*C2*}宇宙說你比自己所想的還要堅強。{*EF*}{*B*}{*B*} +{*C3*}宇宙說你就是白晝。{*EF*}{*B*}{*B*} +{*C2*}宇宙說你就是黑夜。{*EF*}{*B*}{*B*} +{*C3*}宇宙說你所抵抗的黑暗來自你的內心。{*EF*}{*B*}{*B*} +{*C2*}宇宙說你所追尋的光就在你自己心中。{*EF*}{*B*}{*B*} +{*C3*}宇宙說你不孤單。{*EF*}{*B*}{*B*} +{*C2*}宇宙說你和一切都是一體。{*EF*}{*B*}{*B*} +{*C3*}宇宙說你就是宇宙,正在認識自己、和自己對話、讀著自己編寫的程式碼。{*EF*}{*B*}{*B*} +{*C2*}宇宙說我愛你,因為你就是愛。{*EF*}{*B*}{*B*} +{*C3*}遊戲已經結束,玩家已從夢境中甦醒。玩家開始一段新的夢境。玩家又再度做夢,做一場更好的夢。玩家就是宇宙。玩家就是愛。{*EF*}{*B*}{*B*} +{*C3*}你就是玩家。{*EF*}{*B*}{*B*} +{*C2*}醒過來吧。{*EF*} + + + 重設地獄 + + + %s 已經進入終界 + + + %s 已經離開終界 + + + {*C3*}我看到你所指的玩家了。{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}?{*EF*}{*B*}{*B*} +{*C3*}是的。小心,他的層次現在提高了。他能讀取我們的心思。{*EF*}{*B*}{*B*} +{*C2*}沒關係。他認為我們是遊戲的一部分。{*EF*}{*B*}{*B*} +{*C3*}我喜歡這個玩家,他表現得很好,一直玩到最後。{*EF*}{*B*}{*B*} +{*C2*}他現在正如閱讀螢幕上的文字般讀著我們的心思。{*EF*}{*B*}{*B*} +{*C3*}他在深入遊戲的夢境時,一向選擇以這種方式想像許多事情。{*EF*}{*B*}{*B*} +{*C2*}文字是很美妙的介面,靈活又易變,比直視螢幕背後的真相要安全得多。{*EF*}{*B*}{*B*} +{*C3*}他們之前是聽話語。在玩家能夠閱讀之前,那是玩家被那些不玩遊戲的人稱呼為女巫或巫師的過去那段日子。玩家想像自己乘坐具有魔鬼力量的木棍騰空翱翔。{*EF*}{*B*}{*B*} +{*C2*}這位玩家夢到了什麼?{*EF*}{*B*}{*B*} +{*C3*}這位玩家夢到陽光與樹木、火與水。他夢見自己造物,也夢見自己破壞。他夢見自己打獵,同時也是獵物。他夢到了庇護所。{*EF*}{*B*}{*B*} +{*C2*}哈,這是原型介面。經過了百萬年,還是奏效。不過這位玩家在螢幕背後的真相中創造了什麼結構?{*EF*}{*B*}{*B*} +{*C3*}他和百萬名其他玩家在 {*EF*}{*NOISE*}{*C3*} 的皺摺中塑造出一個真實世界,並在 {*EF*}{*NOISE*}{*C3*} 中為 {*EF*}{*NOISE*}{*C3*} 建造了 {*EF*}{*NOISE*}{*C3*}。{*EF*}{*B*}{*B*} +{*C2*}他讀不出那幾個心思。{*EF*}{*B*}{*B*} +{*C3*}沒錯。他還未達到最高層次。他必須先在人生的長夢中開悟,這場遊戲的短夢尚不足以成就這一點。{*EF*}{*B*}{*B*} +{*C2*}他是否知道我們愛他?是否知道宇宙是仁慈的?{*EF*}{*B*}{*B*} +{*C3*}有時候。穿越他那些思考的雜訊,他的確能聽到宇宙。{*EF*}{*B*}{*B*} +{*C2*}不過有時候他會在長夢中悲傷;他創造出沒有夏天的世界,讓自己在黑暗的太陽下發抖,並認為他所創造出的產物就是真相。{*EF*}{*B*}{*B*} +{*C3*}治好他的悲傷會毀掉他。悲傷是他自身的業,我們無法干涉。{*EF*}{*B*}{*B*} +{*C2*}有時當他們沈溺於夢境時,我想告訴他們,他們是在真相中建立真實的世界。有時候我想讓他們了解他們對宇宙的重要性。有時候,在他們封閉自我一段時間後,我想幫助他們說出他們害怕的文字。{*EF*}{*B*}{*B*} +{*C3*}他能讀取我們的心思。{*EF*}{*B*}{*B*} +{*C2*}有時候我不在乎。有時我想告訴他們,你所以為的真實世界不過是 {*EF*}{*NOISE*}{*C2*} 和 {*EF*}{*NOISE*}{*C2*},我想告訴他們,他們是 {*EF*}{*NOISE*}{*C2*} 中的 {*EF*}{*NOISE*}{*C2*}。他們在自己的長夢中幾乎察覺不到真相。{*EF*}{*B*}{*B*} +{*C3*}但他們還是玩著遊戲。{*EF*}{*B*}{*B*} +{*C2*}告訴他們會讓一切變得好簡單...{*EF*}{*B*}{*B*} +{*C3*}對這場夢而言,真相太過刺激。告訴他們如何去活就是阻止他們去活。{*EF*}{*B*}{*B*} +{*C2*}我不會告訴玩家如何去活。{*EF*}{*B*}{*B*} +{*C3*}玩家開始蠢蠢欲動了。{*EF*}{*B*}{*B*} +{*C2*}我會告訴那位玩家一個故事。{*EF*}{*B*}{*B*} +{*C3*}但不說真相。{*EF*}{*B*}{*B*} +{*C2*}沒錯。那是一個包含真相的故事,被文字安全地包裝起來。我不會赤裸裸地說出他所無法接受的真相。{*EF*}{*B*}{*B*} +{*C3*}再一次賦予他身體。{*EF*}{*B*}{*B*} +{*C2*}沒錯。玩家...{*EF*}{*B*}{*B*} +{*C3*}喚他的名字。{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}。遊戲的玩家。{*EF*}{*B*}{*B*} +{*C3*}很好。{*EF*}{*B*}{*B*} + + + 確定要將此遊戲存檔中的地獄重設成預設狀態嗎?這將會失去地獄內的所有建設進度! + + + 現在無法使用角色蛋。豬、 綿羊、乳牛、貓和馬已達到數量上限。 + + + Mooshroom 已達到數量上限,目前無法使用角色蛋。 + + + 遊戲世界裡的狼已達到數量上限,目前無法使用角色蛋。 + + + 重設地獄 + + + 不要重設地獄 + + + 目前無法為這頭 Mooshroom 剪毛。豬、 綿羊、乳牛、貓和馬已達到數量上限。 + + + 您死亡了! + + + 世界選項 + + + 可以建造和開採 + + + 可以使用門與開關 + + + 產生建築 + + + 非常平坦的世界 + + + 贈品箱 + + + 可以開啟容器 + + + 踢除玩家 + + + 可以飛翔 + + + 不會疲勞 + + + 可以攻擊玩家 + + + 可以攻擊動物 + + + 管理員 + + + 主持人特權 + + + 遊戲方式 + + + 控制設定 + + + 設定 + + + 再生 + + + 下載內容 + + + 變更角色外觀 + + + 製作群 + + + 炸藥會爆炸 + + + 玩家對戰 + + + 信任玩家 + + + 重新安裝內容 + + + 偵錯設定 + + + 火會蔓延 + + + 終界龍 + + + {*PLAYER*} 被終界龍噴出的氣息殺死了 + + + + {*PLAYER*} 被 {*SOURCE*} 殺死了 + + + {*PLAYER*} 被 {*SOURCE*} 殺死了 + + + {*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*} + + + + 投擲器 + + + NOT USED + + + 立即回復生命值 + + + 立即造成傷害 + + + 增強跳躍 + + + 開採造成的疲勞 + + + 力量 + + + 虛弱 + + + 噁心 + + + 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 頭顱 + + + 骷髏頭 + + + 凋零骷髏 + + + 殭屍頭顱 + + + 煤炭的緊湊存放方式。可以在熔爐中用作燃料。 + + + 巨毒 + + + 飢餓 + + + 緩慢 + + + 敏捷 + + + 隱形 + + + 水中呼吸 + + + 夜視 + + + 眼盲 + + + 傷害 + + + 治療 + + + 噁心 + + + 復原 + + + 遲鈍 + + + 快速 + + + 虛弱 + + + 力量 + + + 防火 + + + 飽和 + + + 抗性 + + + 跳躍 + + + 凋零怪 + + + 提升生命 + + + 吸收 + + + + + + 2 + + + 3 + + + 隱形 + + + 4 + + + 水中呼吸 + + + 防火 + + + 夜視 + + + 巨毒 + + + 飢餓 + + + 吸收 + + + 飽和 + + + 生命提升 + + + 眼盲 + + + 腐朽 + + + 拙劣 + + + 稀薄 + + + 擴散 + + + 清澈 + + + 乳狀 + + + 粗劣 + + + 奶油 + + + 滑順 + + + 粗製 + + + 走味 + + + 巨大 + + + 平淡 + + + 噴濺 + + + 平庸 + + + 無趣 + + + 華麗 + + + 強烈 + + + 魅力 + + + 高雅 + + + 高貴 + + + 閃光 + + + 惡臭 + + + 刺鼻 + + + 無臭 + + + 強效 + + + 混濁 + + + 柔順 + + + 極緻 + + + 濃郁 + + + 精緻 + + + 隨著時間自動回復受影響玩家、動物和怪物的生命值。 + + + 立即減少受影響玩家、動物和怪物的生命值。 + + + 讓受影響玩家、動物和怪物不受火、熔岩和 Blaze 遠距攻擊的傷害。 + + + 本身不具備任何效果,藉由在釀製台中添加其他材料來製造藥水。 + + + 刺激 + + + 減少受影響玩家、動物和怪物的移動速度,以及玩家的奔跑速度、跳躍距離和視野。 + + + 增加受影響玩家、動物和怪物的移動速度,以及玩家的奔跑速度、跳躍距離和視野。 + + + 增加受影響玩家和怪物攻擊時所造成的傷害。 + + + 立即增加受影響玩家、動物和怪物的生命值。 + + + 減少受影響玩家和怪物攻擊時所造成的傷害。 + + + 所有藥水的基本配方,用來在釀製台中製造藥水。 + + + 濃稠 + + + 臭的 + + + 重擊 + + + 鋒利 + + + 隨著時間自動減少受影響玩家、動物和怪物的生命值。 + + + 攻擊傷害 + + + 擊退 + + + 節足剋星 + + + 速度 + + + 僵屍強化 + + + 馬匹跳躍強度 + + + 應用後: + + + 擊退抵抗 + + + 怪物跟隨範圍 + + + 最大生命 + + + 聚寶 + + + 效率 + + + 水中挖掘 + + + 財富 + + + 奪寶 + + + 耐力 + + + 防火 + + + 防護 + + + 烈火 + + + 輕盈 + + + 水中呼吸 + + + 防彈 + + + 防爆 + + + 4 + + + 5 + + + 6 + + + 猛擊 + + + 7 + + + 3 + + + 火焰 + + + 力量 + + + 無限 + + + 2 + + + 1 + + + 任何實體走過連接好的絆索後就會將其啟動。 + + + 走過連接好的絆索鉤即可將其啟動。 + + + 壓縮存放翡翠的方式。 + + + 與箱子類似,不過玩家從任何一個終界箱都可以拿取存放在其他終界箱裡的物品,即使處在不同的世界也沒有問題。 + + + 9 + + + 8 + + + 可用鐵鎬或材質更堅硬的十字鎬開採來收集翡翠。 + + + 10 + + + 可回復 2 個 {*ICON_SHANK_01*},還能精製成黃金胡蘿蔔。可以種在農地上。 + + + 可當做裝飾品。裡面可以種花朵、樹苗、仙人掌和蘑菇。 + + + 由鵝卵石建造而成的牆。 + + + 可回復 0.5 個 {*ICON_SHANK_01*},或可用熔爐烹煮。可以種在農地上。 + + + 在熔爐中熔煉成地獄石英。 + + + 可用來維修武器、工具和護甲。 + + + 可和村民進行交易。 + + + 可當做裝飾品。 + + + 可回復 4 個 {*ICON_SHANK_01*}。 + + + 可回復 1 個 {*ICON_SHANK_01*},食用這個物品可能會讓你中毒。 + + + 騎在裝有豬鞍的豬身上時,可用來控制方向。 + + + 可回復 3 個 {*ICON_SHANK_01*}。在熔爐烹煮馬鈴薯即可獲得。 + + + 可回復 3 個 {*ICON_SHANK_01*}。由胡蘿蔔和碎金塊製作而成。 + + + 搭配鐵砧使用可為武器、工具或護甲附加能力。 + + + 透過開凱地獄石英礦石所製作而成。可精製成石英方塊。 + + + 馬鈴薯 + + + 烤馬鈴薯 + + + 胡蘿蔔 + + + 由羊毛製作而成。可當做裝飾品。 + + + 翡翠 + + + 花盆 + + + 南瓜派 + + + 已附加能力的書本 + + + 有毒的馬鈴薯 + + + 黃金胡蘿蔔 + + + 木棍上的胡蘿蔔 + + + 絆索鉤 + + + 絆索 + + + 地獄石英 + + + 翡翠礦石 + + + 終界箱 + + + 長滿青苔的鵝卵石牆 + + + 翡翠方塊 + + + 鵝卵石牆 + + + 馬鈴薯 + + + 花盆 + + + 胡蘿蔔 + + + 輕微損壞的鐵砧 + + + 鐵砧 + + + 鐵砧 + + + 石英方塊 + + + 嚴重損壞的鐵砧 + + + 地獄石英礦石 + + + 石英梯 + + + 鑿刻石英方塊 + + + 石英柱方塊 + + + 紅色地毯 + + + 地毯 + + + 黑色地毯 + + + 藍色地毯 + + + 綠色地毯 + + + 棕色地毯 + + + 紫色地毯 + + + 水藍色地毯 + + + 淺灰色地毯 + + + 灰色地毯 + + + 亮綠色地毯 + + + 粉紅色地毯 + + + 淺藍色地毯 + + + 黃色地毯 + + + 紫紅色地毯 + + + 橘色地毯 + + + 白色地毯 + + + 鑿刻沙岩 + + + {*PLAYER*} 在嘗試傷害 {*SOURCE*} 的時候被殺死了 + + + 滑順沙岩 + + + {*PLAYER*} 被掉落的鐵砧壓扁了。 + + + {*PLAYER*} 被掉落的方塊壓扁了。 + + + {*PLAYER*} 將您傳送到他們的所在位置了 + + + 將 {*PLAYER*} 傳送到 {*DESTINATION*} 了 + + + 荊棘 + + + {*PLAYER*} 被傳送到您的所在位置了 + + + 讓黑暗的地區看起來像在白天一樣,即使在水面下也可以作用。 + + + 石英板 + + + 讓作用範圍內的玩家、動物和怪物隱形。 + + + 維修並命名 + + + 太貴了! + + + 附加能力費用:%d + + + 您有: + + + 重新命名 + + + {*VILLAGER_TYPE*} 提供 %s + + + 交易的所需物品 + + + 交易 + + + 維修 + + + + 這是鐵砧介面,可讓您花費經驗等級點數來幫武器、護甲或工具重新命名、維修並附加特殊能力。 + + + + 幫項圈染色 + + + + 若要開始處理物品,請將物品放在第一個輸入格。 + + + + + {*B*} + 按下 {*CONTROLLER_VK_A*} 即可進一步了解鐵砧介面的相關知識。{*B*} + 如果您已經了解鐵砧介面的相關知識,請按下 {*CONTROLLER_VK_B*}。 + + + + + 此外,您也可以將第二個相同的物品放在第二個空格中來結合這兩樣物品。 + + + + + 將正確的原料放在第二個輸入格 (例如,損壞的鐵劍需要鐵錠塊) 後,輸出格中就會顯示建議的維修結果。 + + + + + 完成工作所需的經驗等級點數會顯示在輸出結果的下方。如果您的經驗等級不足,便無法完成維修工作。 + + + + + 若要在鐵砧上為物品附加能力,請將已附加能力的書本放在第二個輸入格中。 + + + + + 撿起維修完成的物品將消耗鐵砧所用掉的兩個物品,同時扣除指定的經驗等級點數。 + + + + + 您可編輯文字方塊中顯示的物品名稱來幫物品重新命名。 + + + + + {*B*} + 按下 {*CONTROLLER_VK_A*} 即可進一步了解鐵砧的相關知識。{*B*} + 如果您已經了解鐵砧的相關知識,請按下 {*CONTROLLER_VK_B*}。 + + + + + 在這個地區有一面鐵砧和一個箱子,箱子裡有工具和武器可供您使用。 + + + + + 您可以從地城裡的箱子找到已附加能力的書本,或是在附加能力台上幫普通書本附加能力來取得。 + + + + + 鐵砧可讓您維修武器和工具來回復它們的耐用度、幫它們重新命名,或是使用已附加能力的書本來幫它們附加能力。 + + + + + 待完成的工作類型、物品價值、附加能力數量以及前期工作量等都是影響維修費用的要素。 + + + + + 使用鐵砧需花費經驗等級點數,而每次使用鐵砧時都有一定的損壞機率。 + + + + + 您可以在這個地區的寶箱中找到損壞的鎬、原料、附加能力藥水瓶及已附加能力的書本來實地操作。 + + + + + 幫物品重新命名將會修改對所有玩家顯示的名稱,並將永久減少前期工作費用。 + + + + + {*B*} + 按下 {*CONTROLLER_VK_A*} 即可進一步了解交易介面的相關知識。{*B*} + 如果您已經了解交易介面的相關知識,請按下 {*CONTROLLER_VK_B*}。 + + + + + 這是交易介面,其中會顯示可與村民進行的交易項目。 + + + + + 如果您沒有所需的物品,那麼這些交易項目會以紅色顯示且無法利用。 + + + + + 村民目前願意提供的所有交易都會顯示在上方。 + + + + + 您可以在畫面左側的兩個方塊中查看交易所需的物品總數。 + + + + + 您提供給村民的物品數量和類型會顯示在畫面左側的兩個方塊中。 + + + + + 在這個地區有一位村民和一個箱子,箱子裡有紙張讓您購買物品。 + + + + + 按下 {*CONTROLLER_VK_A*} 即可與村民交換此次交易所指定的物品。 + + + + + 玩家也可以拿物品欄中的物品與村民交易。 + + + + + {*B*} + 按下 {*CONTROLLER_VK_A*} 即可進一步了解交易的相關知識。{*B*} + 如果您已經了解交易的相關知識,請按下{*CONTROLLER_VK_B*}。 + + + + + 同時交易多種物品時將隨機新增或更新村民提供的交易內容。 + + + + + 村民願意拿出來交換的物品視他們的職業而定。 + + + + + 交易過於頻繁的物品可能會暫時斷貨,不過村民至少會提供一種交易選項。 + + + + + 從箱子中取出一些紙張,然後試著與這位村民進行交易。 + + + + + 在這個地區中有兩個終界箱。 + + + + + {*B*} + 按下 {*CONTROLLER_VK_A*} 即可進一步了解終界箱的相關知識。{*B*} + 如果您已經了解終界箱相關知識,請按下{*CONTROLLER_VK_B*}。 + + + + + 在同一個世界裡的所有終界箱會相互連結,並可橫跨不同世界。您可以在任何一個終界箱裡拿取您存放在其他終界箱裡的物品。 + + + + + 不過,每位玩家在終界箱中存放的內容各不相同。 + + + + + 這種方式可讓玩家將物品存放在任一個終界箱中,然後在世界裡的其他位置從不同的終界箱中拿取物品。您現在可以將物品放在其中一個終界箱來試試看。 + + + + 可回復 2 個 {*ICON_SHANK_01*},並自動回復生命值 30 秒鐘,可防火和抵抗傷害 5 分鐘。由蘋果和黃金方塊製作而成。 + + + 可以傳送 + + + 傳送 + + + 傳送到玩家 + + + 傳送到我 + + + 可以停用疲勞 + + + 可以隱形 + + + 您現在可以啟用隱形 + + + 您已無法啟用隱形 + + + 您現在可以啟用飛翔 + + + 您已無法啟用飛翔 + + + 您現在可以停用疲勞 + + + 您已無法停用疲勞 + + + 您現在可以傳送 + + + 您已無法傳送 + + + {*T3*}遊戲方式:鐵砧{*ETW*}{*B*}{*B*} +耗費經驗等級即可使用鐵砧來為物品進行維修、附加能力或重新命名。{*B*} +您可以為所有的物品重新命名,不過只有具備耐用度的物品才能進行維修或從已附加能力的書本取得其附加能力。{*B*} +維修物品的方式是將它放在介面左側的其中一個輸入格,再加上該物品的一些原料 (例如,鐵劍需要鐵錠塊),或是結合另一個相同類型的物品。{*B*} +使用鐵砧來結合物品的效率會比較高,而且如果其中有物品已附加能力,那麼產生的成品可能會獲得其中一個輸入物品的附加能力。{*B*} +如果已附加能力的書本擁有適合的附加能力,便可以透過在鐵砧上將物品與該書本結合,讓物品獲得書本的附加能力。您可以從地城裡的箱子找到已附加能力的書本,或是在附加能力台上幫普通書本附加能力來取得。{*B*} +每次使用鐵砧時都有一定機率將它損壞,並在次數達到臨界點時摧毀。{*B*} + + + {*T3*}遊戲方式:交易{*ETW*}{*B*}{*B*} +您可以和村民進行交易。每位村民的職業各不相同,可能會是農夫、屠夫、鐵匠、圖書館員或牧師,而職業種類會影響到他們與您交換的物品類型。{*B*} +您可以在交易選單中查看村民願意與您交易的物品清單。村民在與玩家進行交易時,可能會修改或添加交易內容,不過物品的交易次數若太過頻繁便可能暫時斷貨。{*B*} +交易內容通常會與購買或銷售物品來換取翡翠有關。{*B*} +如果您沒有交易所需的物品,這些物品會以紅色顯示。{*B*} + + + + {*T3*}遊戲方式:終界箱{*ETW*}{*B*}{*B*} +在同一個世界裡的所有終界箱會相互連結。您可以在任何一個終界箱裡拿取您存放在其他終界箱裡的物品。不過,每位玩家在終界箱中存放的內容各不相同。這種方式可讓玩家將物品存放在任一個終界箱中,然後在世界裡的其他位置從不同的終界箱中拿取物品。 + + + + 農夫 + + + 圖書館員 + + + 牧師 + + + 鐵匠 + + + 屠夫 + + + 村落裡的村民會根據他們的職業向玩家推銷物品。 + + + 大型箱子 + + + + 您也可以在附加能力台上製作已附加能力的書本,之後便可以用在鐵砧上將其附加能力轉移給其他物品。 + + + + + 若觸發絆索鉤之間的接線,絆索鉤也能夠為電路提供穩定的電力。 + + + + + 狼被馴服之後將會一直戴著項圈。您可以幫項圈染色來改變它的顏色。 + + + + 胡蘿蔔和馬鈴薯是透過種植後收成所得,只要看到它們長出地面便可進行收割。 + + + + + 此外,玩家為豬裝上豬鞍後便可騎在豬身上。只要用木棍上的胡蘿蔔吸引豬的注意力便可控制行進方向。 + + + + 必要時,您可以用 {*CONTROLLER_ACTION_MOVE*} 來緩緩移動礦車,將礦車推上動力軌道有助於發動礦車。 + + + 您無法加入這個遊戲,因為只有高畫質模式才支援分割畫面功能。如果您想要加入,請將所有其他玩家登出。 + + + + 治癒 + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/zh-CHT/stringsLeaderboards.xml b/Minecraft.Client/PSVitaMedia/loc/zh-CHT/stringsLeaderboards.xml new file mode 100644 index 00000000..d791409b --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/zh-CHT/stringsLeaderboards.xml @@ -0,0 +1,48 @@ + + + + 殺敵數 (容易) + + + 殺敵數 (普通) + + + 殺敵數 (困難) + + + 開採方塊數 (和平) + + + 開採方塊數 (容易) + + + 開採方塊數 (普通) + + + 開採方塊數 (困難) + + + 耕種 (和平) + + + 耕種 (容易) + + + 耕種 (普通) + + + 耕種 (困難) + + + 移動距離 (和平) + + + 移動距離 (容易) + + + 移動距離 (普通) + + + 移動距離 (困難) + + \ 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 new file mode 100644 index 00000000..bbce63d5 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/zh-CHT/stringsPlatformSpecific.xml @@ -0,0 +1,247 @@ + + + + 想要登入 "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 + + + NOT USED + + + {*T3*}遊戲方式:創造模式{*ETW*}{*B*}{*B*} +創造模式的介面可讓玩家把遊戲中的物品移動到自己的物品欄,不需要先開採或是精製物品。 +當玩家在遊戲世界中放置或使用這些物品時,這些物品並不會從玩家的物品欄中消失,讓玩家可專心從事建造,而不需要採集物品。{*B*} +如果您在創造模式中建立、載入或儲存世界資料,該世界的獎盃及排行榜更新功能將無法使用,即使您之後以生存模式載入該世界,也無法改變這個情況。{*B*} +在創造模式中,快速按兩下 {*CONTROLLER_ACTION_JUMP*} 即可飛翔。如要停止飛翔,只要重複這個動作即可。飛行時,快速往前按兩下 {*CONTROLLER_ACTION_MOVE*} 即可加快飛行速度。 +在飛翔模式時,按住 {*CONTROLLER_ACTION_JUMP*} 即可往上飛,按住 {*CONTROLLER_ACTION_SNEAK*} 即可往下飛。您也可以使用 {*CONTROLLER_ACTION_DPAD_UP*} 來往上飛,以及使用 {*CONTROLLER_ACTION_DPAD_DOWN*} 來往下飛, +使用 {*CONTROLLER_ACTION_DPAD_LEFT*} 來往左飛,使用 {*CONTROLLER_ACTION_DPAD_RIGHT*} 來往右飛。 + + + 快速按兩下 {*CONTROLLER_ACTION_JUMP*} 即可飛翔,重複這個動作則可結束飛翔。飛翔時,往前快速按兩下 {*CONTROLLER_ACTION_MOVE*} 即可加快飛行的速度。 +在飛翔模式下,只要按住 {*CONTROLLER_ACTION_JUMP*} 即可往上飛,按住 {*CONTROLLER_ACTION_SNEAK*} 則可往下飛。您也可用方向鍵操控方向,往上、下、左或右飛。 + + + 檢視玩家卡 + + + + 如果您在創造模式中建立、載入或儲存世界資料,該世界的獎盃及排行榜更新功能將無法使用,即使您之後以生存模式載入該世界,也無法改變這個情況。確定要繼續嗎? + + + 您已經在創造模式中將這個世界存檔,因此其獎盃及排行榜更新功能將無法使用。確定要繼續嗎? + + + 檢視玩家個人資料 + + + + 邀請好友 + + + 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" 的連線中斷。即將離開遊戲並返回主畫面。 + + + 與 "PSN" 的連線中斷。 + + + 您已經在創造模式中將這個世界存檔,因此其獎盃及排行榜更新功能將無法使用。 + + + 如果您在啟用主持人特權的情況下建立、載入或儲存世界資料,該世界的獎盃及排行榜更新功能將無法使用,即使您之後關閉那些選項並再次載入該世界,也無法改變這個情況。確定要繼續嗎? + + + 這是 Minecraft: "PlayStation Vita" Edition 試玩版遊戲。如果您擁有完整版遊戲,那您剛剛會獲得 1 個獎盃! +解除完整版遊戲鎖定即可享受 Minecraft: "PlayStation Vita" Edition 的完整樂趣,而且還能透過 "PSN" 與世界各地的好友一起玩遊戲。 +您想要解除完整版遊戲鎖定嗎? + + + 訪客玩家無法解除完整版遊戲鎖定,請使用 Sony Entertainment Network 帳戶登入。 + + + 線上 ID + + + 這是 Minecraft: "PlayStation Vita" Edition 試玩版遊戲。如果您擁有完整版遊戲,那您剛剛會獲得 1 個主題! +解除完整版遊戲鎖定即可享受 Minecraft: "PlayStation Vita" Edition 的完整樂趣,而且還能透過 "PSN" 與世界各地的好友一起玩遊戲。 +您想要解除完整版遊戲鎖定嗎? + + + 這是 Minecraft: "PlayStation Vita" Edition 試玩版遊戲。您必須擁有完整版遊戲才能接受這個邀請。 +您想要解除完整版遊戲鎖定嗎? + + + Minecraft: PlayStation(R)Vita Edition 不支援位於存檔傳輸區域中的存檔文件的版本號。 + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/zh-CHT/stringsRichPresence.xml b/Minecraft.Client/PSVitaMedia/loc/zh-CHT/stringsRichPresence.xml new file mode 100644 index 00000000..8405352b --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/zh-CHT/stringsRichPresence.xml @@ -0,0 +1,66 @@ + + + + {GAME_STATE} + + + 閒置 + + + 檢視選單中 + + + 正在進行多人遊戲 - {GAME_STATE} + + + 離線多人遊戲 - {GAME_STATE} + + + 正在進行單人遊戲 - {GAME_STATE} + + + 離線單人遊戲 - {GAME_STATE} + + + 正在欣賞風景! + + + 正騎在豬上 + + + 正在搭乘礦車 + + + 正在搭乘小船 + + + 正在釣魚 + + + 正在精製物品 + + + 正在鍛造物品 + + + 正在進入地獄 + + + 正在聽唱片 + + + 正在觀看地圖 + + + 正在附加能力 + + + 正在釀製藥水 + + + 正在使用鐵砧 + + + 正在拜訪鄰居 + + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/strings.h b/Minecraft.Client/PSVitaMedia/strings.h new file mode 100644 index 00000000..cae249bf --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/strings.h @@ -0,0 +1,2282 @@ +#pragma once +#define IDS__NETWORK_PSN 0 +#define IDS_ACHIEVEMENTS 1 +#define IDS_ACTION_BAN_LEVEL_DESCRIPTION 2 +#define IDS_ACTION_BAN_LEVEL_TITLE 3 +#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 new file mode 100644 index 00000000..f5e09dbd --- /dev/null +++ b/Minecraft.Client/PaintingRenderer.cpp @@ -0,0 +1,141 @@ +#include "stdafx.h" +#include "PaintingRenderer.h" +#include "entityRenderDispatcher.h" +#include "..\Minecraft.World\net.minecraft.world.entity.h" +#include "..\Minecraft.World\net.minecraft.world.level.h" +#include "..\Minecraft.World\Random.h" +#include "..\Minecraft.World\Mth.h" + +ResourceLocation PaintingRenderer::PAINTING_LOCATION(TN_ART_KZ); + +PaintingRenderer::PaintingRenderer() +{ + random = new Random(); +} + +void PaintingRenderer::render(shared_ptr _painting, double x, double y, double z, float rot, float a) +{ + // 4J - dynamic cast required because we aren't using templates/generics in our version + shared_ptr painting = dynamic_pointer_cast(_painting); + + random->setSeed(187); + + glPushMatrix(); + glTranslatef((float)x, (float)y, (float)z); + glRotatef(rot, 0, 1, 0); + glEnable(GL_RESCALE_NORMAL); + bindTexture(painting); // 4J was L"/art/kz.png" + + Painting::Motive *motive = painting->motive; + + float s = 1 / 16.0f; + glScalef(s, s, s); + renderPainting(painting, motive->w, motive->h, motive->uo, motive->vo); + glDisable(GL_RESCALE_NORMAL); + glPopMatrix(); +} + +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 edgeWidth = 0.5f; + + // Back + float bu0 = (12 * 16) / 256.0f; + float bu1 = (12 * 16 + 16) / 256.0f; + float bv0 = (0) / 256.0f; + float bv1 = (0 + 16) / 256.0f; + + // Border + float uu0 = (12 * 16) / 256.0f; + float uu1 = (12 * 16 + 16) / 256.0f; + float uv0 = (0.5f) / 256.0f; + float uv1 = (0.5f) / 256.0f; + + // Border + float su0 = (12 * 16 + 0.5f) / 256.0f; + float su1 = (12 * 16 + 0.5f) / 256.0f; + float sv0 = (0) / 256.0f; + float sv1 = (0 + 16) / 256.0f; + + for (int xs = 0; xs < w / 16; xs++) + { + for (int ys = 0; ys < h / 16; ys++) { + float x0 = xx0 + (xs + 1) * 16; + float x1 = xx0 + (xs) * 16; + float y0 = yy0 + (ys + 1) * 16; + float y1 = yy0 + (ys) * 16; + + setBrightness(painting, (x0 + x1) / 2, (y0 + y1) / 2); + + // Painting + float fu0 = (uo + w - (xs) * 16) / 256.0f; + float fu1 = (uo + w - (xs + 1) * 16) / 256.0f; + float fv0 = (vo + h - (ys) * 16) / 256.0f; + float fv1 = (vo + h - (ys + 1) * 16) / 256.0f; + + Tesselator *t = Tesselator::getInstance(); + t->begin(); + t->normal(0, 0, -1); + t->vertexUV(x0, y1, -edgeWidth, fu1, fv0); + t->vertexUV(x1, y1, -edgeWidth, fu0, fv0); + t->vertexUV(x1, y0, -edgeWidth, fu0, fv1); + t->vertexUV(x0, y0, -edgeWidth, fu1, fv1); + + t->normal(0, 0, 1); + t->vertexUV(x0, y0, edgeWidth, bu0, bv0); + t->vertexUV(x1, y0, edgeWidth, bu1, bv0); + t->vertexUV(x1, y1, edgeWidth, bu1, bv1); + t->vertexUV(x0, y1, edgeWidth, bu0, bv1); + + t->normal(0, 1, 0); + t->vertexUV(x0, y0, -edgeWidth, uu0, uv0); + t->vertexUV(x1, y0, -edgeWidth, uu1, uv0); + t->vertexUV(x1, y0, edgeWidth, uu1, uv1); + t->vertexUV(x0, y0, edgeWidth, uu0, uv1); + + t->normal(0, -1, 0); + t->vertexUV(x0, y1, edgeWidth, uu0, uv0); + t->vertexUV(x1, y1, edgeWidth, uu1, uv0); + t->vertexUV(x1, y1, -edgeWidth, uu1, uv1); + t->vertexUV(x0, y1, -edgeWidth, uu0, uv1); + + t->normal(-1, 0, 0); + t->vertexUV(x0, y0, edgeWidth, su1, sv0); + t->vertexUV(x0, y1, edgeWidth, su1, sv1); + t->vertexUV(x0, y1, -edgeWidth, su0, sv1); + t->vertexUV(x0, y0, -edgeWidth, su0, sv0); + + t->normal(1, 0, 0); + t->vertexUV(x1, y0, -edgeWidth, su1, sv0); + t->vertexUV(x1, y1, -edgeWidth, su1, sv1); + t->vertexUV(x1, y1, edgeWidth, su0, sv1); + t->vertexUV(x1, y0, edgeWidth, su0, sv0); + t->end(); + } + } +} + +void PaintingRenderer::setBrightness(shared_ptr painting, float ss, float ya) +{ + int x = Mth::floor(painting->x); + int y = Mth::floor(painting->y + ya/16.0f); + int z = Mth::floor(painting->z); + if (painting->dir == 0) x = Mth::floor(painting->x + ss/16.0f); + if (painting->dir == 1) z = Mth::floor(painting->z - ss/16.0f); + if (painting->dir == 2) x = Mth::floor(painting->x - ss/16.0f); + if (painting->dir == 3) z = Mth::floor(painting->z + ss/16.0f); + + int col = this->entityRenderDispatcher->level->getLightColor(x, y, z, 0); + int u = col % 65536; + 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 new file mode 100644 index 00000000..42dacd01 --- /dev/null +++ b/Minecraft.Client/PaintingRenderer.h @@ -0,0 +1,21 @@ +#pragma once +#include "EntityRenderer.h" + +class Painting; +class Random; + +class PaintingRenderer : public EntityRenderer +{ +private: + Random *random; + static ResourceLocation PAINTING_LOCATION; + +public: + PaintingRenderer(); // 4J -added + virtual void render(shared_ptr _painting, double x, double y, double z, float rot, float a); + +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 new file mode 100644 index 00000000..1091a26a --- /dev/null +++ b/Minecraft.Client/Particle.cpp @@ -0,0 +1,255 @@ +#include "stdafx.h" +#include "Particle.h" +#include "Tesselator.h" +#include "..\Minecraft.World\Random.h" +#include "..\Minecraft.World\Mth.h" +#include "..\Minecraft.World\JavaMath.h" +#include "..\Minecraft.World\net.minecraft.world.h" + +/* + protected int tex; + protected float gravity; + */ + +double Particle::xOff = 0; +double Particle::yOff = 0; +double Particle::zOff = 0; + +void Particle::_init(Level *level, double x, double y, double z) +{ + // 4J - added these initialisers + alpha = 1.0f; + tex = NULL; + gravity = 0.0f; + + setSize(0.2f, 0.2f); + heightOffset = bbHeight / 2.0f; + setPos(x, y, z); + xo = xOld = x; + yo = yOld = y; + zo = zOld = z; + rCol = gCol = bCol = 1.0f; + + uo = random->nextFloat() * 3; + vo = random->nextFloat() * 3; + + size = (random->nextFloat() * 0.5f + 0.5f) * 2; + + lifetime = (int) (4 / (random->nextFloat() * 0.9f + 0.1f)); + age = 0; + + texX = 0; + texY = 0; +} + +Particle::Particle(Level *level, double x, double y, double z) : Entity(level, false) +{ + _init(level,x,y,z); +} + +Particle::Particle(Level *level, double x, double y, double z, double xa, double ya, double za) : Entity(level, false) +{ + _init(level,x,y,z); + + xd = xa + (float) (Math::random() * 2 - 1) * 0.4f; + yd = ya + (float) (Math::random() * 2 - 1) * 0.4f; + zd = za + (float) (Math::random() * 2 - 1) * 0.4f; + float speed = (float) (Math::random() + Math::random() + 1) * 0.15f; + + float dd = (float) (Mth::sqrt(xd * xd + yd * yd + zd * zd)); + xd = xd / dd * speed * 0.4f; + yd = yd / dd * speed * 0.4f + 0.1f; + zd = zd / dd * speed * 0.4f;} + +shared_ptr Particle::setPower(float power) +{ + xd *= power; + yd = (yd - 0.1f) * power + 0.1f; + zd *= power; + return dynamic_pointer_cast( shared_from_this() ); +} + +shared_ptr Particle::scale(float scale) +{ + setSize(0.2f * scale, 0.2f * scale); + size *= scale; + return dynamic_pointer_cast( shared_from_this() ); +} + +void Particle::setColor(float r, float g, float b) +{ + this->rCol = r; + this->gCol = g; + this->bCol = 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; +} + +float Particle::getRedCol() +{ + return rCol; +} + +float Particle::getGreenCol() +{ + return gCol; +} + +float Particle::getBlueCol() +{ + return bCol; +} + +float Particle::getAlpha() +{ + return alpha; +} + +bool Particle::makeStepSound() +{ + return false; +} + +void Particle::defineSynchedData() +{ +} + +void Particle::tick() +{ + xo = x; + yo = y; + zo = z; + + if (age++ >= lifetime) remove(); + + yd -= 0.04 * gravity; + move(xd, yd, zd); + xd *= 0.98f; + yd *= 0.98f; + zd *= 0.98f; + + if (onGround) + { + xd *= 0.7f; + zd *= 0.7f; + } + +} + +void Particle::render(Tesselator *t, float a, float xa, float ya, float za, float xa2, float za2) +{ + float u0 = texX / 16.0f; + float u1 = u0 + 0.999f / 16.0f; + float v0 = texY / 16.0f; + float v1 = v0 + 0.999f / 16.0f; + float r = 0.1f * size; + + if (tex != NULL) + { + u0 = tex->getU0(); + u1 = tex->getU1(); + v0 = tex->getV0(); + v1 = tex->getV1(); + } + + 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); + + float br = 1.0f; // 4J - change brought forward from 1.8.2 + if( !SharedConstants::TEXTURE_LIGHTING ) + { + br = getBrightness(a); + } + +#ifdef __PSVITA__ + // AP - this will set up the 4 vertices in half the time. + t->tileParticleQuad((float)(x - xa * r - xa2 * r), (float)( y - ya * r), (float)( z - za * r - za2 * r), (float)( u1), (float)( v1), + (float)(x - xa * r + xa2 * r), (float)( y + ya * r), (float)( z - za * r + za2 * r), (float)( u1), (float)( v0), + (float)(x + xa * r + xa2 * r), (float)( y + ya * r), (float)( z + za * r + za2 * r), (float)( u0), (float)( v0), + (float)(x + xa * r - xa2 * r), (float)( y - ya * r), (float)( z + za * r - za2 * r), (float)( u0), (float)( v1), + rCol * br, gCol * br, bCol * br, alpha); +#else + t->color(rCol * br, gCol * br, bCol * br, alpha); + + t->vertexUV((float)(x - xa * r - xa2 * r), (float)( y - ya * r), (float)( z - za * r - za2 * r), (float)( u1), (float)( v1)); + t->vertexUV((float)(x - xa * r + xa2 * r), (float)( y + ya * r), (float)( z - za * r + za2 * r), (float)( u1), (float)( v0)); + t->vertexUV((float)(x + xa * r + xa2 * r), (float)( y + ya * r), (float)( z + za * r + za2 * r), (float)( u0), (float)( v0)); + t->vertexUV((float)(x + xa * r - xa2 * r), (float)( y - ya * r), (float)( z + za * r - za2 * r), (float)( u0), (float)( v1)); +#endif +} + +int Particle::getParticleTexture() +{ + return ParticleEngine::MISC_TEXTURE; +} + +void Particle::addAdditonalSaveData(CompoundTag *entityTag) +{ +} + +void Particle::readAdditionalSaveData(CompoundTag *tag) +{ +} + +void Particle::setTex(Textures *textures, Icon *icon) +{ + if (getParticleTexture() == ParticleEngine::TERRAIN_TEXTURE) + { + tex = icon; + } + else if (getParticleTexture() == ParticleEngine::ITEM_TEXTURE) + { + tex = icon; + } + else + { +#ifndef _CONTENT_PACKAGE + printf("Invalid call to Particle.setTex, use coordinate methods\n"); + __debugbreak(); +#endif + //throw new RuntimeException("Invalid call to Particle.setTex, use coordinate methods"); + } +} + +void Particle::setMiscTex(int slotIndex) +{ + if (getParticleTexture() != ParticleEngine::MISC_TEXTURE && getParticleTexture() != ParticleEngine::DRAGON_BREATH_TEXTURE) + { +#ifndef _CONTENT_PACKAGE + printf("Invalid call to Particle.setMixTex\n"); + __debugbreak(); + //throw new RuntimeException("Invalid call to Particle.setMiscTex"); +#endif + } + texX = slotIndex % 16; + texY = slotIndex / 16; +} + +void Particle::setNextMiscAnimTex() +{ + texX++; +} + +bool Particle::isAttackable() +{ + return false; +} + +//@Override +wstring Particle::toString() +{ + return L"A particle"; //getClass()->getSimpleName() + ", Pos (" + x + "," + y + "," + z + "), RGBA (" + rCol + "," + gCol + "," + bCol + "," + alpha + "), Age " + age; +} \ No newline at end of file diff --git a/Minecraft.Client/Particle.h b/Minecraft.Client/Particle.h new file mode 100644 index 00000000..d9b0ba3a --- /dev/null +++ b/Minecraft.Client/Particle.h @@ -0,0 +1,53 @@ +#pragma once +using namespace std; + +#include "..\Minecraft.World\Entity.h" +#include "..\Minecraft.World\ParticleTypes.h" +#include "ParticleEngine.h" +class Tesselator; +class CompoundTag; +class Icon; + +class Particle : public Entity +{ +protected: + int texX, texY; + float uo, vo; + int age; + int lifetime; + float size; + float gravity; + float rCol, gCol, bCol; + float alpha; + Icon *tex; +public: + static double xOff, yOff, zOff; +private: + void _init(Level *level, double x, double y, double z); +protected: + Particle(Level *level, double x, double y, double z); +public: + Particle(Level *level, double x, double y, double z, double xa, double ya, double za); + virtual shared_ptr setPower(float power); + virtual shared_ptr scale(float scale); + void setColor(float r, float g, float b); + void setAlpha(float alpha); + float getRedCol(); + float getGreenCol(); + float getBlueCol(); + float getAlpha(); +protected: + virtual bool makeStepSound(); + virtual void defineSynchedData(); +public: + virtual void tick(); + virtual void render(Tesselator *t, float a, float xa, float ya, float za, float xa2, float za2); + virtual int getParticleTexture(); + virtual void addAdditonalSaveData(CompoundTag *entityTag); + virtual void readAdditionalSaveData(CompoundTag *tag); + virtual void setTex(Textures *textures, Icon *icon); + virtual void setMiscTex(int slotIndex); + virtual void setNextMiscAnimTex(); + virtual bool isAttackable(); + virtual wstring toString(); +}; \ No newline at end of file diff --git a/Minecraft.Client/ParticleEngine.cpp b/Minecraft.Client/ParticleEngine.cpp new file mode 100644 index 00000000..a6f65fa6 --- /dev/null +++ b/Minecraft.Client/ParticleEngine.cpp @@ -0,0 +1,281 @@ +#include "stdafx.h" +#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" +#include "..\Minecraft.World\net.minecraft.world.level.h" +#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* + { + this->level = level; + } + this->textures = textures; + + this->random = new Random(); +} + +ParticleEngine::~ParticleEngine() +{ + delete random; +} + +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); + 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() +{ + for( int l = 0; l < 3; l++ ) + { + for (int tt = 0; tt < TEXTURE_COUNT; tt++) + { + for( int list = 0; list < LIST_COUNT; list++ ) // 4J - Brought forward from Java 1.8 + { + for (unsigned int i = 0; i < particles[l][tt][list].size(); 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, int list) +{ + // 4J - change brought forward from 1.2.3 + float xa = Camera::xa; + float za = Camera::za; + + float xa2 = Camera::xa2; + float za2 = Camera::za2; + float ya = Camera::ya; + + Particle::xOff = (player->xOld + (player->x - player->xOld) * 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 ); + + 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][list].empty()) + { + switch (list) + { + case TRANSLUCENT_LIST: + glDepthMask(false); + break; + case OPAQUE_LIST: + glDepthMask(true); + break; + } + + MemSect(31); + if (tt == MISC_TEXTURE || tt == DRAGON_BREATH_TEXTURE) textures->bindTexture(&PARTICLES_LOCATION); + if (tt == TERRAIN_TEXTURE) textures->bindTexture(&TextureAtlas::LOCATION_BLOCKS); + if (tt == ITEM_TEXTURE) textures->bindTexture(&TextureAtlas::LOCATION_ITEMS); + MemSect(0); + Tesselator *t = Tesselator::getInstance(); + glColor4f(1.0f, 1.0f, 1.0f, 1); + + 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, 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 + // java game, or totally incorrect placement of things for split screen. + Particle::xOff = (player->xOld + (player->x - player->xOld) * a); + Particle::yOff = (player->yOld + (player->y - player->yOld) * a); + Particle::zOff = (player->zOld + (player->z - player->zOld) * a); + + float RAD = PI / 180; + float xa = (float) Mth::cos(player->yRot * RAD); + float za = (float) Mth::sin(player->yRot * RAD); + + float xa2 = -za * (float) Mth::sin(player->xRot * RAD); + float za2 = xa * (float) Mth::sin(player->xRot * RAD); + float ya = (float) Mth::cos(player->xRot * RAD); + + int l = level->dimension->id == 0 ? 0 : ( level->dimension->id == -1 ? 1 : 2 ); + int tt = ENTITY_PARTICLE_TEXTURE; + + if( !particles[l][tt][list].empty() ) + { + Tesselator *t = Tesselator::getInstance(); + for (unsigned int i = 0; i < particles[l][tt][list].size(); i++) + { + 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) +{ + this->level = level; + // 4J - we've now got a set of particle vectors for each dimension, and only clearing them when its game over & the level is set to NULL + if( level == NULL ) + { + for( int l = 0; l < 3; l++ ) + { + for (int tt = 0; tt < TEXTURE_COUNT; tt++) + { + for( int list = 0; list < LIST_COUNT; list++ ) + { + particles[l][tt][list].clear(); + } + } + } + } +} + +void ParticleEngine::destroy(int x, int y, int z, int tid, int data) +{ + if (tid == 0) return; + + Tile *tile = Tile::tiles[tid]; + int SD = 4; + for (int xx = 0; xx < SD; xx++) + for (int yy = 0; yy < SD; yy++) + for (int zz = 0; zz < SD; zz++) + { + double xp = x + (xx + 0.5) / SD; + double yp = y + (yy + 0.5) / SD; + double zp = z + (zz + 0.5) / SD; + int face = random->nextInt(6); + add(( shared_ptr(new TerrainParticle(level, xp, yp, zp, xp - x - 0.5f, yp - y - 0.5f, zp - z - 0.5f, tile, face, data, textures) ) )->init(x, y, z, data)); + } +} + +void ParticleEngine::crack(int x, int y, int z, int face) +{ + int tid = level->getTile(x, y, z); + if (tid == 0) return; + Tile *tile = Tile::tiles[tid]; + float r = 0.10f; + double xp = x + random->nextDouble() * ((tile->getShapeX1() - tile->getShapeX0()) - r * 2) + r + tile->getShapeX0(); + double yp = y + random->nextDouble() * ((tile->getShapeY1() - tile->getShapeY0()) - r * 2) + r + tile->getShapeY0(); + double zp = z + random->nextDouble() * ((tile->getShapeZ1() - tile->getShapeZ0()) - r * 2) + r + tile->getShapeZ0(); + if (face == 0) yp = y + tile->getShapeY0() - r; + if (face == 1) yp = y + tile->getShapeY1() + r; + if (face == 2) zp = z + tile->getShapeZ0() - r; + if (face == 3) zp = z + tile->getShapeZ1() + r; + if (face == 4) xp = x + tile->getShapeX0() - r; + if (face == 5) xp = x + tile->getShapeX1() + r; + add(( shared_ptr(new TerrainParticle(level, xp, yp, zp, 0, 0, 0, tile, face, level->getData(x, y, z), textures) ) )->init(x, y, z, level->getData(x, y, z))->setPower(0.2f)->scale(0.6f)); + +} + +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 ); + 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 new file mode 100644 index 00000000..2a9aa058 --- /dev/null +++ b/Minecraft.Client/ParticleEngine.h @@ -0,0 +1,56 @@ +#pragma once +using namespace std; + +class Particle; +class Level; +class Textures; +class Entity; +class Random; +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; + static const int TERRAIN_TEXTURE = 1; + 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][LIST_COUNT]; // 4J made three arrays to cope with simultaneous two dimensions + Textures *textures; + Random *random; + +public: + ParticleEngine(Level *level, Textures *textures); + ~ParticleEngine(); + void add(shared_ptr p); + void tick(); + 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); + + // 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/PauseScreen.cpp b/Minecraft.Client/PauseScreen.cpp new file mode 100644 index 00000000..18d066b5 --- /dev/null +++ b/Minecraft.Client/PauseScreen.cpp @@ -0,0 +1,99 @@ +#include "stdafx.h" +#include "PauseScreen.h" +#include "Button.h" +#include "StatsCounter.h" +#include "OptionsScreen.h" +#include "TitleScreen.h" +#include "MultiPlayerLevel.h" +#include "..\Minecraft.World\net.minecraft.locale.h" +#include "..\Minecraft.World\net.minecraft.world.level.h" +#include "..\Minecraft.World\net.minecraft.stats.h" +#include "..\Minecraft.Client\LocalPlayer.h" + +PauseScreen::PauseScreen() +{ + saveStep = 0; + visibleTime = 0; +} + +void PauseScreen::init() +{ + saveStep = 0; + buttons.clear(); + int yo = -16; + buttons.push_back(new Button(1, width / 2 - 100, height / 4 + 24 * 5 + yo, L"Save and quit to title")); + if (minecraft->isClientSide()) + { + buttons[0]->msg = L"Disconnect"; + } + + + buttons.push_back(new Button(4, width / 2 - 100, height / 4 + 24 * 1 + yo, L"LBack to game")); + buttons.push_back(new Button(0, width / 2 - 100, height / 4 + 24 * 4 + yo, L"LOptions...")); + + buttons.push_back(new Button(5, width / 2 - 100, height / 4 + 24 * 2 + yo, 98, 20, I18n::get(L"gui.achievements"))); + buttons.push_back(new Button(6, width / 2 + 2, height / 4 + 24 * 2 + yo, 98, 20, I18n::get(L"gui.stats"))); + /* + * if (minecraft->serverConnection!=null) { buttons.get(1).active = + * false; buttons.get(2).active = false; buttons.get(3).active = false; + * } + */ + +} + +void PauseScreen::buttonClicked(Button button) +{ + if (button.id == 0) + { + minecraft->setScreen(new OptionsScreen(this, minecraft->options)); + } + if (button.id == 1) + { + if (minecraft->isClientSide()) + { + minecraft->level->disconnect(); + } + + minecraft->setLevel(NULL); + minecraft->setScreen(new TitleScreen()); + } + if (button.id == 4) + { + minecraft->setScreen(NULL); + // minecraft->grabMouse(); // 4J - removed + } + + if (button.id == 5) + { +// minecraft->setScreen(new AchievementScreen(minecraft->stats)); // 4J TODO - put back + } + if (button.id == 6) + { +// minecraft->setScreen(new StatsScreen(this, minecraft->stats)); // 4J TODO - put back + } +} + +void PauseScreen::tick() +{ + Screen::tick(); + visibleTime++; +} + +void PauseScreen::render(int xm, int ym, float a) +{ + renderBackground(); + + bool isSaving = false; //!minecraft->level->pauseSave(saveStep++); + if (isSaving || visibleTime < 20) + { + float col = ((visibleTime % 10) + a) / 10.0f; + col = Mth::sin(col * PI * 2) * 0.2f + 0.8f; + int br = (int) (255 * col); + + drawString(font, L"Saving level..", 8, height - 16, br << 16 | br << 8 | br); + } + + drawCenteredString(font, L"Game menu", width / 2, 40, 0xffffff); + + Screen::render(xm, ym, a); +} \ No newline at end of file diff --git a/Minecraft.Client/PauseScreen.h b/Minecraft.Client/PauseScreen.h new file mode 100644 index 00000000..8d1c8f00 --- /dev/null +++ b/Minecraft.Client/PauseScreen.h @@ -0,0 +1,18 @@ +#pragma once +#include "Screen.h" + +class PauseScreen : public Screen +{ +private: + int saveStep; + int visibleTime; +public: + PauseScreen(); // 4J added + virtual void init(); +protected:using Screen::buttonClicked; + + virtual void buttonClicked(Button button); +public: + virtual void tick(); + virtual void render(int xm, int ym, float a); +}; diff --git a/Minecraft.Client/PendingConnection.cpp b/Minecraft.Client/PendingConnection.cpp new file mode 100644 index 00000000..e9b37fc6 --- /dev/null +++ b/Minecraft.Client/PendingConnection.cpp @@ -0,0 +1,274 @@ +#include "stdafx.h" +#include "PendingConnection.h" +#include "PlayerConnection.h" +#include "ServerConnection.h" +#include "ServerPlayer.h" +#include "ServerPlayerGameMode.h" +#include "ServerLevel.h" +#include "PlayerList.h" +#include "MinecraftServer.h" +#include "..\Minecraft.World\net.minecraft.network.h" +#include "..\Minecraft.World\pos.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.item.h" +#include "..\Minecraft.World\SharedConstants.h" +#include "Settings.h" +// #ifdef __PS3__ +// #include "PS3\Network\NetworkPlayerSony.h" +// #endif + +Random *PendingConnection::random = new Random(); + +PendingConnection::PendingConnection(MinecraftServer *server, Socket *socket, const wstring& id) +{ + // 4J - added initialisers + done = false; + _tick = 0; + name = L""; + acceptedLogin = nullptr; + loginKey = L""; + + this->server = server; + connection = new Connection(socket, id, this); + connection->fakeLag = FAKE_LAG; +} + +PendingConnection::~PendingConnection() +{ + delete connection; +} + +void PendingConnection::tick() +{ + if (acceptedLogin != NULL) + { + this->handleAcceptedLogin(acceptedLogin); + acceptedLogin = nullptr; + } + if (_tick++ == MAX_TICKS_BEFORE_LOGIN) + { + disconnect(DisconnectPacket::eDisconnect_LoginTooLong); + } + else + { + 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(); + // } +} + +void PendingConnection::handlePreLogin(shared_ptr packet) +{ + 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) + { + disconnect(DisconnectPacket::eDisconnect_OutdatedServer); + } + else + { + 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(); +} + +void PendingConnection::sendPreLoginResponse() +{ + // 4J Stu - Calculate the players with UGC privileges set + PlayerUID *ugcXuids = new PlayerUID[MINECRAFT_NET_MAX_PLAYERS]; + DWORD ugcXuidCount = 0; + DWORD hostIndex = 0; + BYTE ugcFriendsOnlyBits = 0; + char szUniqueMapName[14]; + + StorageManager.GetSaveUniqueFilename(szUniqueMapName); + + PlayerList *playerList = MinecraftServer::getInstance()->getPlayers(); + for(AUTO_VAR(it, playerList->players.begin()); it != playerList->players.end(); ++it) + { + shared_ptr player = *it; + // If the offline Xuid is invalid but the online one is not then that's guest which we should ignore + // If the online Xuid is invalid but the offline one is not then we are definitely an offline game so dont care about UGC + + // PADDY - this is failing when a local player with chat restrictions joins an online game + + if( player != NULL && player->connection->m_offlineXUID != INVALID_XUID && player->connection->m_onlineXUID != INVALID_XUID ) + { + if( player->connection->m_friendsOnlyUGC ) + { + ugcFriendsOnlyBits |= (1<connection->m_onlineXUID; + + if( player->connection->getNetworkPlayer() != NULL && player->connection->getNetworkPlayer()->IsHost() ) hostIndex = ugcXuidCount; + + ++ugcXuidCount; + } + } + +#if 0 + 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) ) ); + } + else +#endif + { + 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) + { + app.DebugPrintf("Client version is %d not equal to %d\n", packet->clientVersion, SharedConstants::NETWORK_PROTOCOL_VERSION); + if (packet->clientVersion > SharedConstants::NETWORK_PROTOCOL_VERSION) + { + disconnect(DisconnectPacket::eDisconnect_OutdatedServer); + } + else + { + disconnect(DisconnectPacket::eDisconnect_OutdatedClient); + } + return; + } + + //if (true)// 4J removed !server->onlineMode) + bool sentDisconnect = false; + + if( sentDisconnect ) + { + // Do nothing + } + else if( server->getPlayers()->isXuidBanned( packet->m_onlineXuid ) ) + { + disconnect(DisconnectPacket::eDisconnect_Banned); + } + else + { + 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(); +#endif + } + +} + +void PendingConnection::handleAcceptedLogin(shared_ptr packet) +{ + if(packet->m_ugcPlayersVersion != server->m_ugcPlayersVersion) + { + // Send the pre-login packet again with the new list of players + sendPreLoginResponse(); + return; + } + + // Guests use the online xuid, everyone else uses the offline one + 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) + { + 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; + +} + +void PendingConnection::onDisconnect(DisconnectPacket::eDisconnectReason reason, void *reasonObjects) +{ + // logger.info(getName() + " lost connection"); + done = true; +} + +void PendingConnection::handleGetInfo(shared_ptr packet) +{ + //try { + //String message = server->motd + "" + server->players->getPlayerCount() + "" + server->players->getMaxPlayers(); + //connection->send(new DisconnectPacket(message)); + connection->send(shared_ptr(new DisconnectPacket(DisconnectPacket::eDisconnect_ServerFull) ) ); + connection->sendAndQuit(); + server->connection->removeSpamProtection(connection->getSocket()); + done = true; + //} catch (Exception e) { + // e.printStackTrace(); + //} +} + +void PendingConnection::handleKeepAlive(shared_ptr packet) +{ + // Ignore +} + +void PendingConnection::onUnhandledPacket(shared_ptr packet) +{ + disconnect(DisconnectPacket::eDisconnect_UnexpectedPacket); +} + +void PendingConnection::send(shared_ptr packet) +{ + connection->send(packet); +} + +wstring PendingConnection::getName() +{ + return L"Unimplemented"; + // 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 new file mode 100644 index 00000000..e8a493b0 --- /dev/null +++ b/Minecraft.Client/PendingConnection.h @@ -0,0 +1,49 @@ +#pragma once +#include "..\Minecraft.World\PacketListener.h" +class MinecraftServer; +class Socket; +class LoginPacket; +class Connection; +class Random; +using namespace std; + +class PendingConnection : public PacketListener +{ +private: + static const int FAKE_LAG = 0; + static const int MAX_TICKS_BEFORE_LOGIN = 20 * 30; + + // public static Logger logger = Logger.getLogger("Minecraft"); + static Random *random; + +public: + Connection *connection; +public: + bool done; +private: + MinecraftServer *server; + int _tick; + wstring name; + shared_ptr acceptedLogin; + wstring loginKey; + +public: + 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); + 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 bool isDisconnected(); + +private: + void sendPreLoginResponse(); +}; \ No newline at end of file diff --git a/Minecraft.Client/PigModel.cpp b/Minecraft.Client/PigModel.cpp new file mode 100644 index 00000000..771d91ba --- /dev/null +++ b/Minecraft.Client/PigModel.cpp @@ -0,0 +1,20 @@ +#include "stdafx.h" +#include "PigModel.h" +#include "ModelPart.h" + +PigModel::PigModel() : QuadrupedModel(6, 0) +{ + head->texOffs(16, 16)->addBox(-2.0f, 0.0f, -9.0f, 4, 3, 1, 0.0f); + yHeadOffs = 4; + + head->compile(1.0f/16.0f); +} + +PigModel::PigModel(float grow) : QuadrupedModel(6, grow) +{ + head->texOffs(16, 16)->addBox(-2.0f, 0.0f, -9.0f, 4, 3, 1, grow); + yHeadOffs = 4; + + head->compile(1.0f/16.0f); +} + diff --git a/Minecraft.Client/PigModel.h b/Minecraft.Client/PigModel.h new file mode 100644 index 00000000..c443115d --- /dev/null +++ b/Minecraft.Client/PigModel.h @@ -0,0 +1,10 @@ +#pragma once +#include "QuadrupedModel.h" + +class PigModel : public QuadrupedModel +{ +public: + + PigModel(); + PigModel(float grow); +}; \ No newline at end of file diff --git a/Minecraft.Client/PigRenderer.cpp b/Minecraft.Client/PigRenderer.cpp new file mode 100644 index 00000000..7425889d --- /dev/null +++ b/Minecraft.Client/PigRenderer.cpp @@ -0,0 +1,38 @@ +#include "stdafx.h" +#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) +{ + // 4J - dynamic cast required because we aren't using templates/generics in our version + shared_ptr pig = dynamic_pointer_cast(_pig); + + 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); +} + +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 new file mode 100644 index 00000000..b089b6bd --- /dev/null +++ b/Minecraft.Client/PigRenderer.h @@ -0,0 +1,19 @@ +#pragma once +#include "MobRenderer.h" + +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); + +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 new file mode 100644 index 00000000..c51d2e0f --- /dev/null +++ b/Minecraft.Client/PistonPieceRenderer.cpp @@ -0,0 +1,71 @@ +#include "stdafx.h" +#include "PistonPieceRenderer.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; +} + +void PistonPieceRenderer::render(shared_ptr _entity, double x, double y, double z, float a, bool setColor, float alpha, bool useCompiled) +{ + // 4J - dynamic cast required because we aren't using templates/generics in our version + shared_ptr entity = dynamic_pointer_cast(_entity); + + Tile *tile = Tile::tiles[entity->getId()]; + if (tile != NULL && entity->getProgress(a) <= 1) // 4J - changed condition from < to <= as our chunk update is async to main thread and so we can have to render these with progress of 1 + { + Tesselator *t = Tesselator::getInstance(); + 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 + + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_BLEND); + glDisable(GL_CULL_FACE); + + t->begin(); + + t->offset((float) x - entity->x + entity->getXOff(a), (float) y - entity->y + entity->getYOff(a), (float) z - entity->z + entity->getZOff(a)); + t->color(1, 1, 1); + if (tile == Tile::pistonExtension && entity->getProgress(a) < 0.5f) + { + // extending arms may appear through the base block + tileRenderer->tesselatePistonArmNoCulling(tile, entity->x, entity->y, entity->z, false, entity->getData()); + } + else if (entity->isSourcePiston() && !entity->isExtending()) + { + // special case for withdrawing the arm back into the base + Tile::pistonExtension->setOverrideTopTexture(((PistonBaseTile *) tile)->getPlatformTexture()); + tileRenderer->tesselatePistonArmNoCulling(Tile::pistonExtension, entity->x, entity->y, entity->z, entity->getProgress(a) < 0.5f, entity->getData()); + Tile::pistonExtension->clearOverrideTopTexture(); + + t->offset((float) x - entity->x, (float) y - entity->y, (float) z - entity->z); + tileRenderer->tesselatePistonBaseForceExtended(tile, entity->x, entity->y, entity->z, entity->getData()); + } + else + { + tileRenderer->tesselateInWorldNoCulling(tile, entity->x, entity->y, entity->z, entity->getData(), entity); + } + t->offset(0, 0, 0); + t->end(); + + Lighting::turnOn(); + } + +} + +void PistonPieceRenderer::onNewLevel(Level *level) +{ + delete tileRenderer; + tileRenderer = new TileRenderer(level); +} diff --git a/Minecraft.Client/PistonPieceRenderer.h b/Minecraft.Client/PistonPieceRenderer.h new file mode 100644 index 00000000..9e4e229b --- /dev/null +++ b/Minecraft.Client/PistonPieceRenderer.h @@ -0,0 +1,16 @@ +#include "TileEntityRenderer.h" + +class PistonPieceEntity; +class TileRenderer; + +class PistonPieceRenderer : public TileEntityRenderer +{ +private: + static ResourceLocation SIGN_LOCATION; + TileRenderer *tileRenderer; + +public: + PistonPieceRenderer(); + virtual void render(shared_ptr _entity, double x, double y, double z, float a, bool setColor, float alpha=1.0f, bool useCompiled = true); // 4J added setColor param + virtual void onNewLevel(Level *level); +}; diff --git a/Minecraft.Client/PlayerChunkMap.cpp b/Minecraft.Client/PlayerChunkMap.cpp new file mode 100644 index 00000000..acf6edc3 --- /dev/null +++ b/Minecraft.Client/PlayerChunkMap.cpp @@ -0,0 +1,861 @@ +#include "stdafx.h" +#include "PlayerChunkMap.h" +#include "PlayerConnection.h" +#include "ServerLevel.h" +#include "ServerChunkCache.h" +#include "ServerPlayer.h" +#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" +#include "PlayerList.h" + +PlayerChunkMap::PlayerChunk::PlayerChunk(int x, int z, PlayerChunkMap *pcm) : pos(x,z) +{ + // 4J - added initialisers + changes = 0; + changedTiles = shortArray(MAX_CHANGES_BEFORE_RESEND); + xChangeMin = xChangeMax = 0; + yChangeMin = yChangeMax = 0; + zChangeMin = zChangeMax = 0; + parent = pcm; // 4J added + ticksToNextRegionUpdate = 0; // 4J added + prioritised = false; // 4J added + firstInhabitedTime = 0; + + parent->getLevel()->cache->create(x, z); +} + +PlayerChunkMap::PlayerChunk::~PlayerChunk() +{ + delete changedTiles.data; +} + +// 4J added - construct an an array of flags that indicate which entities are still waiting to have network packets sent out to say that they have been removed +// If there aren't any entities to be flagged, this function does nothing. If there *are* entities to be added, uses the removedFound as an input to +// determine if the flag array has already been initialised at all - if it has been, then just adds flags to it; if it hasn't, then memsets the output +// flag array and adds to it for this ServerPlayer. +void PlayerChunkMap::flagEntitiesToBeRemoved(unsigned int *flags, bool *flagToBeRemoved) +{ + for(AUTO_VAR(it,players.begin()); it != players.end(); it++) + { + shared_ptr serverPlayer = *it; + serverPlayer->flagEntitiesToBeRemoved(flags, flagToBeRemoved); + } +} + +void PlayerChunkMap::PlayerChunk::add(shared_ptr player, bool sendPacket /*= true*/) +{ + //app.DebugPrintf("--- Adding player to chunk x=%d\tz=%d\n",x, z); + if (find(players.begin(),players.end(),player) != players.end()) + { + // 4J-PB - At the start of the game, lots of chunks are added, and we can then move into an area that is outside the diameter of our starting area, + // but is inside the area loaded at the start. + app.DebugPrintf("--- Adding player to chunk x=%d\t z=%d, but they are already in there!\n",pos.x, pos.z); + return; + + //assert(false); +// 4J - was throw new IllegalStateException("Failed to add player. " + player + " already is in chunk " + x + ", " + z); + } + + player->seenChunks.insert(pos); + + // 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); + +#ifdef _LARGE_WORLDS + parent->getLevel()->cache->dontDrop(pos.x, pos.z); // 4J Added; +#endif +} + +void PlayerChunkMap::PlayerChunk::remove(shared_ptr player) +{ + PlayerChunkMap::PlayerChunk *toDelete = NULL; + + //app.DebugPrintf("--- PlayerChunkMap::PlayerChunk::remove x=%d\tz=%d\n",x,z); + AUTO_VAR(it, find(players.begin(),players.end(),player)); + if ( it == players.end()) + { + app.DebugPrintf("--- INFO - Removing player from chunk x=%d\t z=%d, but they are not in that chunk!\n",pos.x, pos.z); + + return; + } + + 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() ) + { + toDelete = it->second; // Don't delete until the end of the function, as this might be this instance + parent->chunks.erase(it); + } + if (changes > 0) + { + AUTO_VAR(it, find(parent->changedChunks.begin(),parent->changedChunks.end(),this)); + parent->changedChunks.erase(it); + } + parent->getLevel()->cache->drop(pos.x, pos.z); + } + + player->chunksToSend.remove(pos); + // 4J - I don't think there's any point sending these anymore, as we don't need to unload chunks with fixed sized maps + // 4J - We do need to send these to unload entities in chunks when players are dead. If we do not and the entity is removed + // while they are dead, that entity will remain in the clients world + if (player->connection != NULL && player->seenChunks.find(pos) != player->seenChunks.end()) + { + INetworkPlayer *thisNetPlayer = player->connection->getNetworkPlayer(); + bool noOtherPlayersFound = true; + + if( thisNetPlayer != NULL ) + { + for( AUTO_VAR(it, players.begin()); it < players.end(); ++it ) + { + shared_ptr currPlayer = *it; + INetworkPlayer *currNetPlayer = currPlayer->connection->getNetworkPlayer(); + if( currNetPlayer != NULL && currNetPlayer->IsSameSystem( thisNetPlayer ) && currPlayer->seenChunks.find(pos) != currPlayer->seenChunks.end() ) + { + noOtherPlayersFound = false; + break; + } + } + if(noOtherPlayersFound) + { + //wprintf(L"Sending ChunkVisiblity packet false for chunk (%d,%d) to player %ls\n", x, z, player->name.c_str() ); + player->connection->send( shared_ptr( new ChunkVisibilityPacket(pos.x, pos.z, false) ) ); + } + } + else + { + //app.DebugPrintf("PlayerChunkMap::PlayerChunk::remove - QNetPlayer is NULL\n"); + } + } + + 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) + { + parent->changedChunks.push_back(this); + xChangeMin = xChangeMax = x; + yChangeMin = yChangeMax = y; + zChangeMin = zChangeMax = z; + } + if (xChangeMin > x) xChangeMin = x; + if (xChangeMax < x) xChangeMax = x; + + if (yChangeMin > y) yChangeMin = y; + if (yChangeMax < y) yChangeMax = y; + + if (zChangeMin > z) zChangeMin = z; + if (zChangeMax < z) zChangeMax = z; + + if (changes < MAX_CHANGES_BEFORE_RESEND) + { + short id = (short) ((x << 12) | (z << 8) | (y)); + + for (int i = 0; i < changes; i++) + { + if (changedTiles[i] == id) return; + } + + changedTiles[changes++] = id; + } +} + +// 4J added - make sure that any tile updates for the chunk at this location get prioritised for sending +void PlayerChunkMap::PlayerChunk::prioritiseTileChanges() +{ + prioritised = true; +} + +void PlayerChunkMap::PlayerChunk::broadcast(shared_ptr packet) +{ + vector< shared_ptr > sentTo; + for (unsigned int i = 0; i < players.size(); i++) + { + shared_ptr player = players[i]; + + // 4J - don't send to a player we've already sent this data to that shares the same machine. TileUpdatePacket, + // ChunkTilesUpdatePacket and SignUpdatePacket all used to limit themselves to sending once to each machine + // by only sending to the primary player on each machine. This was causing trouble for split screen + // as updates were only coming in for the region round this one player. Now these packets can be sent to any + // player, but we try to restrict the network impact this has by not resending to the one machine + bool dontSend = false; + if( sentTo.size() ) + { + INetworkPlayer *thisPlayer = player->connection->getNetworkPlayer(); + if( thisPlayer == NULL ) + { + dontSend = true; + } + else + { + for(unsigned int j = 0; j < sentTo.size(); j++ ) + { + shared_ptr player2 = sentTo[j]; + INetworkPlayer *otherPlayer = player2->connection->getNetworkPlayer(); + if( otherPlayer != NULL && thisPlayer->IsSameSystem(otherPlayer) ) + { + dontSend = true; + } + } + } + } + if( dontSend ) + { + continue; + } + + // 4J Changed to get the flag index for the player before we send a packet. This flag is updated when we queue + // for send the first BlockRegionUpdatePacket for this chunk to that player/players system. Therefore there is no need to + // send tile updates or other updates until that has been sent + int flagIndex = ServerPlayer::getFlagIndexForChunk(pos, parent->dimension); + if (player->seenChunks.find(pos) != player->seenChunks.end() && (player->connection->isLocal() || g_NetworkManager.SystemFlagGet(player->connection->getNetworkPlayer(),flagIndex) )) + { + player->connection->send(packet); + sentTo.push_back(player); + } + } + // Now also check round all the players that are involved in this game. We also want to send the packet + // to them if their system hasn't received it already, but they have received the first BlockRegionUpdatePacket for this + // chunk + + // Make sure we are only doing this for BlockRegionUpdatePacket, ChunkTilesUpdatePacket and TileUpdatePacket. + // We'll be potentially sending to players who aren't on the same level as this packet is intended for, + // and only these 3 packets have so far been updated to be able to encode the level so they are robust + // enough to cope with this + if(!( ( packet->getId() == 51 ) || ( packet->getId() == 52 ) || ( packet->getId() == 53 ) ) ) + { + return; + } + + for( int i = 0; i < parent->level->getServer()->getPlayers()->players.size(); i++ ) + { + shared_ptr player = parent->level->getServer()->getPlayers()->players[i]; + // Don't worry about local players, they get all their updates through sharing level with the server anyway + if ( player->connection == NULL ) continue; + if( player->connection->isLocal() ) continue; + + // Don't worry about this player if they haven't had this chunk yet (this flag will be the + // same for all players on the same system) + int flagIndex = ServerPlayer::getFlagIndexForChunk(pos,parent->dimension); + if(!g_NetworkManager.SystemFlagGet(player->connection->getNetworkPlayer(),flagIndex)) continue; + + // From here on the same rules as in the loop above - don't send it if we've already sent to the same system + bool dontSend = false; + if( sentTo.size() ) + { + INetworkPlayer *thisPlayer = player->connection->getNetworkPlayer(); + if( thisPlayer == NULL ) + { + dontSend = true; + } + else + { + for(unsigned int j = 0; j < sentTo.size(); j++ ) + { + shared_ptr player2 = sentTo[j]; + INetworkPlayer *otherPlayer = player2->connection->getNetworkPlayer(); + if( otherPlayer != NULL && thisPlayer->IsSameSystem(otherPlayer) ) + { + dontSend = true; + } + } + } + } + if( !dontSend ) + { + player->connection->send(packet); + sentTo.push_back(player); + } + } +} + +bool PlayerChunkMap::PlayerChunk::broadcastChanges(bool allowRegionUpdate) +{ + bool didRegionUpdate = false; + ServerLevel *level = parent->getLevel(); + if( ticksToNextRegionUpdate > 0 ) ticksToNextRegionUpdate--; + if (changes == 0) + { + prioritised = false; + return false; + } + if (changes == 1) + { + int x = pos.x * 16 + xChangeMin; + int y = yChangeMin; + int z = pos.z * 16 + zChangeMin; + broadcast( shared_ptr( new TileUpdatePacket(x, y, z, level) ) ); + if (level->isEntityTile(x, y, z)) + { + broadcast(level->getTileEntity(x, y, z)); + } + } + else if (changes == MAX_CHANGES_BEFORE_RESEND) + { + // 4J added, to allow limiting of region update packets created + if( !prioritised ) + { + if( !allowRegionUpdate || ( ticksToNextRegionUpdate > 0 ) ) + { + return false; + } + } + + yChangeMin = yChangeMin / 2 * 2; + yChangeMax = (yChangeMax / 2 + 1) * 2; + int xp = xChangeMin + pos.x * 16; + int yp = yChangeMin; + int zp = zChangeMin + pos.z * 16; + int xs = xChangeMax - xChangeMin + 1; + int ys = yChangeMax - yChangeMin + 2; + int zs = zChangeMax - zChangeMin + 1; + + // Fix for buf #95007 : TCR #001 BAS Game Stability: TU12: Code: Compliance: More than 192 dropped items causes game to freeze or crash. + // Block region update packets can only encode ys in a range of 1 - 256 + if( ys > 256 ) ys = 256; + + broadcast( shared_ptr( new BlockRegionUpdatePacket(xp, yp, zp, xs, ys, zs, level) ) ); + vector > *tes = level->getTileEntitiesInRegion(xp, yp, zp, xp + xs, yp + ys, zp + zs); + for (unsigned int i = 0; i < tes->size(); i++) + { + broadcast(tes->at(i)); + } + delete tes; + ticksToNextRegionUpdate = MIN_TICKS_BETWEEN_REGION_UPDATE; + didRegionUpdate = true; + } + else + { + // 4J As we only get here if changes is less than MAX_CHANGES_BEFORE_RESEND (10) we only need to send a byte value in the packet + broadcast( shared_ptr( new ChunkTilesUpdatePacket(pos.x, pos.z, changedTiles, (byte)changes, level) ) ); + for (int i = 0; i < changes; i++) + { + int x = pos.x * 16 + ((changedTiles[i] >> 12) & 15); + int y = ((changedTiles[i]) & 255); + int z = pos.z * 16 + ((changedTiles[i] >> 8) & 15); + + if (level->isEntityTile(x, y, z)) + { +// System.out.println("Sending!"); + broadcast(level->getTileEntity(x, y, z)); + } + } + } + changes = 0; + prioritised = false; + return didRegionUpdate; +} + +void PlayerChunkMap::PlayerChunk::broadcast(shared_ptr te) +{ + if (te != NULL) + { + shared_ptr p = te->getUpdatePacket(); + if (p != NULL) + { + broadcast(p); + } + } +} + +PlayerChunkMap::PlayerChunkMap(ServerLevel *level, int dimension, int radius) +{ + assert(radius <= MAX_VIEW_DISTANCE); + assert(radius >= MIN_VIEW_DISTANCE); + this->radius = radius; + this->level = level; + this->dimension = dimension; + lastInhabitedUpdate = 0; +} + +PlayerChunkMap::~PlayerChunkMap() +{ + for( AUTO_VAR(it, chunks.begin()); it != chunks.end(); it++ ) + { + delete it->second; + } +} + +ServerLevel *PlayerChunkMap::getLevel() +{ + return level; +} + +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; + for (unsigned int i = 0; i < changedChunks.size();) + { + regionUpdateSent |= changedChunks[i]->broadcastChanges(!regionUpdateSent); + // Changes will be 0 if the chunk actually sent something, in which case we can delete it from this array + if( changedChunks[i]->changes == 0 ) + { + changedChunks[i] = changedChunks.back(); + changedChunks.pop_back(); + } + else + { + // Limiting of some kind means we didn't send this chunk so move onto the next + i++; + } + } + + for( unsigned int i = 0; i < players.size(); i++ ) + { + tickAddRequests(players[i]); + } + + // 4J Stu - Added 1.1 but not relevant to us as we never no 0 players anyway, and don't think we should be dropping stuff + //if (players.isEmpty()) { + // ServerLevel level = server.getLevel(this.dimension); + // Dimension dimension = level.dimension; + // if (!dimension.mayRespawn()) { + // level.cache.dropAll(); + // } + //} +} + +bool PlayerChunkMap::hasChunk(int x, int z) +{ + __int64 id = (x + 0x7fffffffLL) | ((z + 0x7fffffffLL) << 32); + return chunks.find(id) != chunks.end(); +} + +PlayerChunkMap::PlayerChunk *PlayerChunkMap::getChunk(int x, int z, bool create) +{ + __int64 id = (x + 0x7fffffffLL) | ((z + 0x7fffffffLL) << 32); + AUTO_VAR(it, chunks.find(id)); + + PlayerChunk *chunk = NULL; + if( it != chunks.end() ) + { + chunk = it->second; + } + else if ( create) + { + chunk = new PlayerChunk(x, z, this); + chunks[id] = chunk; + knownChunks.push_back(chunk); + } + + return chunk; +} + +// 4J - added. If a chunk exists, add a player to it straight away. If it doesn't exist, +// queue a request for it to be created. +void PlayerChunkMap::getChunkAndAddPlayer(int x, int z, shared_ptr player) +{ + __int64 id = (x + 0x7fffffffLL) | ((z + 0x7fffffffLL) << 32); + AUTO_VAR(it, chunks.find(id)); + + if( it != chunks.end() ) + { + it->second->add(player); + } + else + { + addRequests.push_back(PlayerChunkAddRequest(x,z,player)); + } +} + +// 4J - added. If the chunk and player are in the queue to be added, remove from there. Otherwise +// attempt to remove from main chunk map. +void PlayerChunkMap::getChunkAndRemovePlayer(int x, int z, shared_ptr player) +{ + for( AUTO_VAR(it, addRequests.begin()); it != addRequests.end(); it++ ) + { + if( ( it->x == x ) && + ( it->z == z ) && + ( it->player == player ) ) + { + addRequests.erase(it); + return; + } + } + __int64 id = (x + 0x7fffffffLL) | ((z + 0x7fffffffLL) << 32); + AUTO_VAR(it, chunks.find(id)); + + if( it != chunks.end() ) + { + it->second->remove(player); + } +} + +// 4J - added - actually create & add player to a playerchunk, if there is one queued for this player. +void PlayerChunkMap::tickAddRequests(shared_ptr player) +{ + if( addRequests.size() ) + { + // Find the nearest chunk request to the player + int px = (int)player->x; + int pz = (int)player->z; + int minDistSq = -1; + + AUTO_VAR(itNearest, addRequests.end()); + for( AUTO_VAR(it, addRequests.begin()); it != addRequests.end(); it++ ) + { + if( it->player == player ) + { + int xm = ( it->x * 16 ) + 8; + int zm = ( it->z * 16 ) + 8; + int distSq = (xm - px) * (xm - px) + + (zm - pz) * (zm - pz); + if( ( minDistSq == -1 ) || ( distSq < minDistSq ) ) + { + minDistSq = distSq; + itNearest = it; + } + } + } + + // If we found one at all, then do this one + if( itNearest != addRequests.end() ) + { + getChunk(itNearest->x, itNearest->z, true)->add(itNearest->player); + addRequests.erase(itNearest); + } + } +} + +void PlayerChunkMap::broadcastTileUpdate(shared_ptr packet, int x, int y, int z) +{ + int xc = x >> 4; + int zc = z >> 4; + PlayerChunk *chunk = getChunk(xc, zc, false); + if (chunk != NULL) + { + chunk->broadcast(packet); + } +} + +void PlayerChunkMap::tileChanged(int x, int y, int z) +{ + int xc = x >> 4; + int zc = z >> 4; + PlayerChunk *chunk = getChunk(xc, zc, false); + if (chunk != NULL) + { + chunk->tileChanged(x & 15, y, z & 15); + } +} + +bool PlayerChunkMap::isTrackingTile(int x, int y, int z) +{ + int xc = x >> 4; + int zc = z >> 4; + PlayerChunk *chunk = getChunk(xc, zc, false); + if( chunk ) return true; + return false; +} + +// 4J added - make sure that any tile updates for the chunk at this location get prioritised for sending +void PlayerChunkMap::prioritiseTileChanges(int x, int y, int z) +{ + int xc = x >> 4; + int zc = z >> 4; + PlayerChunk *chunk = getChunk(xc, zc, false); + if (chunk != NULL) + { + chunk->prioritiseTileChanges(); + } +} + +void PlayerChunkMap::add(shared_ptr player) +{ + static int direction[4][2] = { { 1, 0 }, { 0, 1 }, { -1, 0 }, {0, -1} }; + + int xc = (int) player->x >> 4; + int zc = (int) player->z >> 4; + + player->lastMoveX = player->x; + player->lastMoveZ = player->z; + +// for (int x = xc - radius; x <= xc + radius; x++) +// for (int z = zc - radius; z <= zc + radius; z++) { +// getChunk(x, z, true).add(player); +// } + + // CraftBukkit start + int facing = 0; + int size = radius; + int dx = 0; + int dz = 0; + + // Origin + getChunk(xc, zc, true)->add(player, false); + + // 4J Added so we send an area packet rather than one visibility packet per chunk + int minX, maxX, minZ, maxZ; + 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++) + { + for (int leg = 0; leg < 2; leg++) + { + int *dir = direction[facing++ % 4]; + + for (int k = 0; k < legSize; k++) + { + dx += dir[0]; + dz += dir[1]; + + int targetX, targetZ; + targetX = xc + dx; + targetZ = zc + dz; + + 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); + } + } + } + } + + // Final leg + facing %= 4; + for (int k = 0; k < size * 2; k++) + { + dx += direction[facing][0]; + dz += direction[facing][1]; + + int targetX, targetZ; + targetX = xc + dx; + targetZ = zc + dz; + 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); + } + else + { + getChunkAndAddPlayer(targetX, targetZ, player); + } + } + // CraftBukkit end + + player->connection->send( shared_ptr( new ChunkVisibilityAreaPacket(minX, maxX, minZ, maxZ) ) ); + +#ifdef _LARGE_WORLDS + getLevel()->cache->dontDrop(xc,zc); +#endif + + players.push_back(player); + +} + +void PlayerChunkMap::remove(shared_ptr player) +{ + int xc = ((int) player->lastMoveX) >> 4; + int zc = ((int) player->lastMoveZ) >> 4; + + for (int x = xc - radius; x <= xc + radius; x++) + for (int z = zc - radius; z <= zc + radius; z++) + { + PlayerChunk *playerChunk = getChunk(x, z, false); + if (playerChunk != NULL) playerChunk->remove(player); + } + + AUTO_VAR(it, find(players.begin(),players.end(),player)); + if( players.size() > 0 && it != players.end() ) + players.erase(find(players.begin(),players.end(),player)); + + // 4J - added - also remove any queued requests to be added to playerchunks here + for( AUTO_VAR(it, addRequests.begin()); it != addRequests.end(); ) + { + if( it->player == player ) + { + it = addRequests.erase(it); + } + else + { + ++it; + } + } + +} + +bool PlayerChunkMap::chunkInRange(int x, int z, int xc, int zc) +{ + // If the distance between x and xc + int xd = x - xc; + int zd = z - zc; + if (xd < -radius || xd > radius) return false; + if (zd < -radius || zd > radius) return false; + return true; +} + +// 4J - have changed this so that we queue requests to add the player to chunks if they +// need to be created, so that we aren't creating potentially 20 chunks per player per tick +void PlayerChunkMap::move(shared_ptr player) +{ + int xc = ((int) player->x) >> 4; + int zc = ((int) player->z) >> 4; + + double _xd = player->lastMoveX - player->x; + double _zd = player->lastMoveZ - player->z; + double dist = _xd * _xd + _zd * _zd; + if (dist < 8 * 8) return; + + int last_xc = ((int) player->lastMoveX) >> 4; + int last_zc = ((int) player->lastMoveZ) >> 4; + + int xd = xc - last_xc; + int zd = zc - last_zc; + if (xd == 0 && zd == 0) return; + + for (int x = xc - radius; x <= xc + radius; x++) + for (int z = zc - radius; z <= zc + radius; z++) + { + if (!chunkInRange(x, z, last_xc, last_zc)) + { + // 4J - changed from separate getChunk & add so we can wrap these operations up and queue + getChunkAndAddPlayer(x, z, player); + } + + if (!chunkInRange(x - xd, z - zd, xc, zc)) + { + // 4J - changed from separate getChunk & remove so we can wrap these operations up and queue + getChunkAndRemovePlayer(x - xd, z - zd, player); + } + } + + player->lastMoveX = player->x; + player->lastMoveZ = player->z; +} + +int PlayerChunkMap::getMaxRange() +{ + return radius * 16 - 16; +} + +bool PlayerChunkMap::isPlayerIn(shared_ptr player, int xChunk, int zChunk) +{ + PlayerChunk *chunk = getChunk(xChunk, zChunk, false); + + if(chunk == NULL) + { + return false; + } + else + { + AUTO_VAR(it1, find(chunk->players.begin(), chunk->players.end(), player)); + AUTO_VAR(it2, find(player->chunksToSend.begin(), player->chunksToSend.end(), chunk->pos)); + return it1 != chunk->players.end() && it2 == player->chunksToSend.end(); + } + + //return chunk == NULL ? false : chunk->players->contains(player) && !player->chunksToSend->contains(chunk->pos); +} + +int PlayerChunkMap::convertChunkRangeToBlock(int radius) +{ + return radius * 16 - 16; +} + +// AP added for Vita so the range can be increased once the level starts +void PlayerChunkMap::setRadius(int newRadius) +{ + if( radius != newRadius ) + { + PlayerList* players = level->getServer()->getPlayerList(); + for( int i = 0;i < players->players.size();i += 1 ) + { + shared_ptr player = players->players[i]; + if( player->level == level ) + { + int xc = ((int) player->x) >> 4; + int zc = ((int) player->z) >> 4; + + for (int x = xc - newRadius; x <= xc + newRadius; x++) + for (int z = zc - newRadius; z <= zc + newRadius; z++) + { + // check if this chunk is outside the old radius area + if ( x < xc - radius || x > xc + radius || z < zc - radius || z > zc + radius ) + { + getChunkAndAddPlayer(x, z, player); + } + } + } + } + + assert(radius <= MAX_VIEW_DISTANCE); + assert(radius >= MIN_VIEW_DISTANCE); + this->radius = newRadius; + } +} \ No newline at end of file diff --git a/Minecraft.Client/PlayerChunkMap.h b/Minecraft.Client/PlayerChunkMap.h new file mode 100644 index 00000000..9d1ab1b5 --- /dev/null +++ b/Minecraft.Client/PlayerChunkMap.h @@ -0,0 +1,114 @@ +#pragma once +#include "..\Minecraft.World\JavaIntHash.h" +#include "..\Minecraft.World\ChunkPos.h" +class ServerPlayer; +class ServerLevel; +class MinecraftServer; +class Packet; +class TileEntity; +using namespace std; + +class PlayerChunkMap +{ +public: +#ifdef _LARGE_WORLDS + static const int MAX_VIEW_DISTANCE = 30; +#else + static const int MAX_VIEW_DISTANCE = 15; +#endif + static const int MIN_VIEW_DISTANCE = 3; + static const int MAX_CHANGES_BEFORE_RESEND = 10; + static const int MIN_TICKS_BETWEEN_REGION_UPDATE = 10; + + // 4J - added + class PlayerChunkAddRequest + { + public: + int x,z; + shared_ptr player; + PlayerChunkAddRequest(int x, int z, shared_ptr player ) : x(x), z(z), player(player) {} + }; + + class PlayerChunk + { + friend class PlayerChunkMap; + private: + PlayerChunkMap *parent; // 4J added + vector > players; + //int x, z; + ChunkPos pos; + + shortArray changedTiles; + int changes; + int xChangeMin, xChangeMax; + int yChangeMin, yChangeMax; + int zChangeMin, zChangeMax; + int ticksToNextRegionUpdate; // 4J added + bool prioritised; // 4J added + __int64 firstInhabitedTime; + + public: + PlayerChunk(int x, int z, PlayerChunkMap *pcm); + ~PlayerChunk(); + + // 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); + bool broadcastChanges(bool allowRegionUpdate); // 4J - added parm + + private: + void broadcast(shared_ptr te); + }; + +public: + vector > players; + void flagEntitiesToBeRemoved(unsigned int *flags, bool *removedFound); // 4J added +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); + ~PlayerChunkMap(); + ServerLevel *getLevel(); + void tick(); + bool hasChunk(int x, int z); +private: + PlayerChunk *getChunk(int x, int z, bool create); + void getChunkAndAddPlayer(int x, int z, shared_ptr player); // 4J added + void getChunkAndRemovePlayer(int x, int z, shared_ptr player); // 4J added +public: + void broadcastTileUpdate(shared_ptr packet, int x, int y, int z); + void tileChanged(int x, int y, int z); + bool isTrackingTile(int x, int y, int z); // 4J added + void prioritiseTileChanges(int x, int y, int z); // 4J added + void add(shared_ptr player); + void remove(shared_ptr player); +private: + bool chunkInRange(int x, int z, int xc, int zc); +public: + void move(shared_ptr player); + int getMaxRange(); + bool isPlayerIn(shared_ptr player, int xChunk, int zChunk); + static int convertChunkRangeToBlock(int radius); + + // AP added for Vita + void setRadius(int newRadius); +}; diff --git a/Minecraft.Client/PlayerCloudParticle.cpp b/Minecraft.Client/PlayerCloudParticle.cpp new file mode 100644 index 00000000..6976fbab --- /dev/null +++ b/Minecraft.Client/PlayerCloudParticle.cpp @@ -0,0 +1,68 @@ +#include "stdafx.h" +#include "PlayerCloudParticle.h" +#include "..\Minecraft.World\JavaMath.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" + +PlayerCloudParticle::PlayerCloudParticle(Level *level, double x, double y, double z, double xa, double ya, double za) : Particle(level,x,y,z,0,0,0) +{ + float scale = 2.5f; + xd *= 0.1f; + yd *= 0.1f; + zd *= 0.1f; + xd += xa; + yd += ya; + zd += za; + + rCol = gCol = bCol = 1 - (float) (Math::random() * 0.3f); + size *= 0.75f; + size *= scale; + oSize = size; + + lifetime = (int) (8 / (Math::random() * 0.8 + 0.3)); + lifetime *= scale; + noPhysics = false; +} + +void PlayerCloudParticle::render(Tesselator *t, float a, float xa, float ya, float za, float xa2, float za2) +{ + float l = ((age + a) / lifetime) * 32; + if (l < 0) l = 0; + if (l > 1) l = 1; + + size = oSize * l; + Particle::render(t, a, xa, ya, za, xa2, za2); +} + +void PlayerCloudParticle::tick() +{ + xo = x; + yo = y; + zo = z; + + if (age++ >= lifetime) remove(); + + setMiscTex(7 - age * 8 / lifetime); + + move(xd, yd, zd); + xd *= 0.96f; + yd *= 0.96f; + zd *= 0.96f; + shared_ptr p = level->getNearestPlayer(shared_from_this(), 2); + if (p != NULL) + { + if (y > p->bb->y0) + { + y+=(p->bb->y0-y)*0.2; + yd += (p->yd-yd)*0.2; + setPos(x, y, z); + } + } + + if (onGround) + { + xd *= 0.7f; + zd *= 0.7f; + } +} \ No newline at end of file diff --git a/Minecraft.Client/PlayerCloudParticle.h b/Minecraft.Client/PlayerCloudParticle.h new file mode 100644 index 00000000..41002017 --- /dev/null +++ b/Minecraft.Client/PlayerCloudParticle.h @@ -0,0 +1,15 @@ +#pragma once + +#include "Particle.h" + +class PlayerCloudParticle : public Particle +{ +private: + float oSize; + +public: + virtual eINSTANCEOF GetType() { return eType_PLAYERCLOUDPARTICLEPARTICLE; } + PlayerCloudParticle(Level *level, double x, double y, double z, double xa, double ya, double za); + void render(Tesselator *t, float a, float xa, float ya, float za, float xa2, float za2); + void tick(); +}; \ No newline at end of file diff --git a/Minecraft.Client/PlayerConnection.cpp b/Minecraft.Client/PlayerConnection.cpp new file mode 100644 index 00000000..4928f65b --- /dev/null +++ b/Minecraft.Client/PlayerConnection.cpp @@ -0,0 +1,1786 @@ +#include "stdafx.h" +#include "PlayerConnection.h" +#include "ServerPlayer.h" +#include "ServerLevel.h" +#include "ServerPlayerGameMode.h" +#include "PlayerList.h" +#include "MinecraftServer.h" +#include "..\Minecraft.World\net.minecraft.commands.h" +#include "..\Minecraft.World\net.minecraft.network.h" +#include "..\Minecraft.World\net.minecraft.world.entity.item.h" +#include "..\Minecraft.World\net.minecraft.world.level.h" +#include "..\Minecraft.World\net.minecraft.world.level.dimension.h" +#include "..\Minecraft.World\net.minecraft.world.item.h" +#include "..\Minecraft.World\net.minecraft.world.item.trading.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.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" +#include "..\Minecraft.World\Pos.h" +#include "..\Minecraft.World\SharedConstants.h" +#include "..\Minecraft.World\Socket.h" +#include "..\Minecraft.World\Achievements.h" +#include "..\Minecraft.World\net.minecraft.h" +#include "EntityTracker.h" +#include "ServerConnection.h" +#include "..\Minecraft.World\GenericStats.h" +#include "..\Minecraft.World\JavaMath.h" + +// 4J Added +#include "..\Minecraft.World\net.minecraft.world.item.crafting.h" +#include "Options.h" + +Random PlayerConnection::random; + +PlayerConnection::PlayerConnection(MinecraftServer *server, Connection *connection, shared_ptr player) +{ + // 4J - added initialisers + done = false; + tickCount = 0; + aboveGroundTickCount = 0; + xLastOk = yLastOk = zLastOk = 0; + synched = true; + didTick = false; + lastKeepAliveId = 0; + lastKeepAliveTime = 0; + lastKeepAliveTick = 0; + chatSpamTickCount = 0; + dropSpamTickCount = 0; + + this->server = server; + this->connection = connection; + connection->setListener(this); + this->player = player; + // player->connection = this; // 4J - moved out as we can't assign in a ctor + InitializeCriticalSection(&done_cs); + + m_bCloseOnTick = false; + m_bWasKicked = false; + + m_friendsOnlyUGC = false; + m_offlineXUID = INVALID_XUID; + m_onlineXUID = INVALID_XUID; + m_bHasClientTickedOnce = false; + + setShowOnMaps(app.GetGameHostOption(eGameHostOption_Gamertags)!=0?true:false); +} + +PlayerConnection::~PlayerConnection() +{ + delete connection; + DeleteCriticalSection(&done_cs); +} + +void PlayerConnection::tick() +{ + if( done ) return; + + if( m_bCloseOnTick ) + { + disconnect( DisconnectPacket::eDisconnect_Closed ); + return; + } + + didTick = false; + tickCount++; + connection->tick(); + if(done) return; + + if ((tickCount - lastKeepAliveTick) > 20 * 1) + { + lastKeepAliveTick = tickCount; + lastKeepAliveTime = System::nanoTime() / 1000000; + lastKeepAliveId = random.nextInt(); + send( shared_ptr( new KeepAlivePacket(lastKeepAliveId) ) ); + } + + if (chatSpamTickCount > 0) + { + chatSpamTickCount--; + } + if (dropSpamTickCount > 0) + { + dropSpamTickCount--; + } +} + +void PlayerConnection::disconnect(DisconnectPacket::eDisconnectReason reason) +{ + EnterCriticalSection(&done_cs); + if( done ) + { + LeaveCriticalSection(&done_cs); + return; + } + + app.DebugPrintf("PlayerConnection disconect reason: %d\n", reason ); + player->disconnect(); + + // 4J Stu - Need to remove the player from the receiving list before their socket is NULLed so that we can find another player on their system + server->getPlayers()->removePlayerFromReceiving( player ); + send( shared_ptr( new DisconnectPacket(reason) )); + connection->sendAndQuit(); + // 4J-PB - removed, since it needs to be localised in the language the client is in + //server->players->broadcastAll( shared_ptr( new ChatPacket(L"e" + player->name + L" left the game.") ) ); + if(getWasKicked()) + { + server->getPlayers()->broadcastAll( shared_ptr( new ChatPacket(player->name, ChatPacket::e_ChatPlayerKickedFromGame) ) ); + } + else + { + server->getPlayers()->broadcastAll( shared_ptr( new ChatPacket(player->name, ChatPacket::e_ChatPlayerLeftGame) ) ); + } + + server->getPlayers()->remove(player); + done = true; + LeaveCriticalSection(&done_cs); +} + +void PlayerConnection::handlePlayerInput(shared_ptr packet) +{ + player->setPlayerInput(packet->getXxa(), packet->getYya(), packet->isJumping(), packet->isSneaking()); +} + +void PlayerConnection::handleMovePlayer(shared_ptr packet) +{ + ServerLevel *level = server->getLevel(player->dimension); + + didTick = true; + if(synched) m_bHasClientTickedOnce = true; + + if (player->wonGame) return; + + if (!synched) + { + double yDiff = packet->y - yLastOk; + if (packet->x == xLastOk && yDiff * yDiff < 0.01 && packet->z == zLastOk) + { + synched = true; + } + } + + if (synched) + { + if (player->riding != NULL) + { + + float yRotT = player->yRot; + float xRotT = player->xRot; + player->riding->positionRider(); + double xt = player->x; + double yt = player->y; + double zt = player->z; + + if (packet->hasRot) + { + yRotT = packet->yRot; + xRotT = packet->xRot; + } + + player->onGround = packet->onGround; + + player->doTick(false); + player->ySlideOffset = 0; + player->absMoveTo(xt, yt, zt, yRotT, xRotT); + if (player->riding != NULL) player->riding->positionRider(); + server->getPlayers()->move(player); + + // 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; + } + + if (player->isSleeping()) + { + player->doTick(false); + player->absMoveTo(xLastOk, yLastOk, zLastOk, player->yRot, player->xRot); + ((Level *)level)->tick(player); + return; + } + + double startY = player->y; + xLastOk = player->x; + yLastOk = player->y; + zLastOk = player->z; + + + double xt = player->x; + double yt = player->y; + double zt = player->z; + + float yRotT = player->yRot; + float xRotT = player->xRot; + + if (packet->hasPos && packet->y == -999 && packet->yView == -999) + { + packet->hasPos = false; + } + + if (packet->hasPos) + { + xt = packet->x; + yt = packet->y; + zt = packet->z; + double yd = packet->yView - packet->y; + if (!player->isSleeping() && (yd > 1.65 || yd < 0.1)) + { + disconnect(DisconnectPacket::eDisconnect_IllegalStance); + // logger.warning(player->name + " had an illegal stance: " + yd); + return; + } + if (abs(packet->x) > 32000000 || abs(packet->z) > 32000000) + { + disconnect(DisconnectPacket::eDisconnect_IllegalPosition); + return; + } + } + if (packet->hasRot) + { + yRotT = packet->yRot; + xRotT = packet->xRot; + } + + // 4J Stu Added to stop server player y pos being different than client when flying + if(player->abilities.mayfly || player->isAllowedToFly() ) + { + player->abilities.flying = packet->isFlying; + } + else player->abilities.flying = false; + + player->doTick(false); + player->ySlideOffset = 0; + player->absMoveTo(xLastOk, yLastOk, zLastOk, yRotT, xRotT); + + if (!synched) return; + + double xDist = xt - player->x; + double yDist = yt - player->y; + double zDist = zt - player->z; + + double dist = xDist * xDist + yDist * yDist + zDist * zDist; + + // 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; + } + */ + + float r = 1 / 16.0f; + bool oldOk = level->getCubes(player, player->bb->copy()->shrink(r, r, r))->empty(); + + if (player->onGround && !packet->onGround && yDist > 0) + { + // assume the player made a jump + player->causeFoodExhaustion(FoodConstants::EXHAUSTION_JUMP); + } + + player->move(xDist, yDist, zDist); + + // 4J Stu - It is possible that we are no longer synched (eg By moving into an End Portal), so we should stop any further movement based on this packet + // Fix for #87764 - Code: Gameplay: Host cannot move and experiences End World Chunks flickering, while in Splitscreen Mode + // and Fix for #87788 - Code: Gameplay: Client cannot move and experiences End World Chunks flickering, while in Splitscreen Mode + if (!synched) return; + + player->onGround = packet->onGround; + // Since server players don't call travel we check food exhaustion + // here + player->checkMovementStatistiscs(xDist, yDist, zDist); + + double oyDist = yDist; + + xDist = xt - player->x; + yDist = yt - player->y; + + // 4J-PB - line below will always be true! + if (yDist > -0.5 || yDist < 0.5) + { + yDist = 0; + } + zDist = zt - player->z; + dist = xDist * xDist + yDist * yDist + zDist * zDist; + bool fail = false; + 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); +#ifndef _CONTENT_PACKAGE + wprintf(L"%ls moved wrongly!\n",player->name.c_str()); + app.DebugPrintf("Got position %f, %f, %f\n", xt,yt,zt); + app.DebugPrintf("Expected %f, %f, %f\n", player->x, player->y, player->z); +#endif + } + player->absMoveTo(xt, yt, zt, yRotT, xRotT); + + bool newOk = level->getCubes(player, player->bb->copy()->shrink(r, r, r))->empty(); + if (oldOk && (fail || !newOk) && !player->isSleeping()) + { + teleport(xLastOk, yLastOk, zLastOk, yRotT, xRotT); + return; + } + AABB *testBox = player->bb->copy()->grow(r, r, r)->expand(0, -0.55, 0); + // && server.level.getCubes(player, testBox).size() == 0 + if (!server->isFlightAllowed() && !player->gameMode->isCreative() && !level->containsAnyBlocks(testBox) && !player->isAllowedToFly() ) + { + if (oyDist >= (-0.5f / 16.0f)) + { + aboveGroundTickCount++; + if (aboveGroundTickCount > 80) + { + // 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 + disconnect(DisconnectPacket::eDisconnect_NoFlying); + return; + } + } + } + else + { + aboveGroundTickCount = 0; + } + + player->onGround = packet->onGround; + 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*/) +{ + synched = false; + xLastOk = x; + yLastOk = y; + zLastOk = z; + player->absMoveTo(x, y, z, yRot, xRot); + // 4J - note that 1.62 is added to the height here as the client connection that receives this will presume it represents y + heightOffset at that end + // This is different to the way that height is sent back to the server, where it represents the bottom of the player bounding volume + if(sendPacket) player->connection->send( shared_ptr( new MovePlayerPacket::PosRot(x, y + 1.62f, y, z, yRot, xRot, false, false) ) ); +} + +void PlayerConnection::handlePlayerAction(shared_ptr packet) +{ + ServerLevel *level = server->getLevel(player->dimension); + player->resetLastActionTime(); + + if (packet->action == PlayerActionPacket::DROP_ITEM) + { + player->drop(false); + return; + } + else if (packet->action == PlayerActionPacket::DROP_ALL_ITEMS) + { + player->drop(true); + return; + } + else if (packet->action == PlayerActionPacket::RELEASE_USE_ITEM) + { + player->releaseUsingItem(); + return; + } + + 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; + int y = packet->y; + int z = packet->z; + if (shouldVerifyLocation) + { + double xDist = player->x - (x + 0.5); + // there is a mismatch between the player's camera and the player's + // position, so add 1.5 blocks + double yDist = player->y - (y + 0.5) + 1.5; + double zDist = player->z - (z + 0.5); + double dist = xDist * xDist + yDist * yDist + zDist * zDist; + if (dist > 6 * 6) + { + return; + } + if (y >= server->getMaxBuildHeight()) + { + return; + } + } + + if (packet->action == PlayerActionPacket::START_DESTROY_BLOCK) + { + 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) ) ); + + } + else if (packet->action == PlayerActionPacket::STOP_DESTROY_BLOCK) + { + player->gameMode->stopDestroyBlock(x, y, z); + server->getPlayers()->prioritiseTileChanges(x, y, z, level->dimension->id); // 4J added - make sure that the update packets for this get prioritised over other general world updates + if (level->getTile(x, y, z) != 0) player->connection->send( shared_ptr( new TileUpdatePacket(x, y, z, level) ) ); + } + else if (packet->action == PlayerActionPacket::ABORT_DESTROY_BLOCK) + { + player->gameMode->abortDestroyBlock(x, y, z); + if (level->getTile(x, y, z) != 0) player->connection->send(shared_ptr( new TileUpdatePacket(x, y, z, level))); + } +} + +void PlayerConnection::handleUseItem(shared_ptr packet) +{ + ServerLevel *level = server->getLevel(player->dimension); + shared_ptr item = player->inventory->getSelected(); + bool informClient = false; + int x = packet->getX(); + int y = packet->getY(); + int z = packet->getZ(); + int face = packet->getFace(); + 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) + { + if (item == NULL) return; + player->gameMode->useItem(player, level, item); + } + else if ((packet->getY() < server->getMaxBuildHeight() - 1) || (packet->getFace() != Facing::UP && packet->getY() < server->getMaxBuildHeight())) + { + if (synched && player->distanceToSqr(x + 0.5, y + 0.5, z + 0.5) < 8 * 8) + { + 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()); + } + } + + informClient = true; + } + else + { + //player->connection->send(shared_ptr(new ChatPacket("\u00A77Height limit for building is " + server->maxBuildHeight))); + informClient = true; + } + + if (informClient) + { + + player->connection->send( shared_ptr( new TileUpdatePacket(x, y, z, level) ) ); + + if (face == 0) y--; + if (face == 1) y++; + if (face == 2) z--; + 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 + // to the client, and this packet is received before the piston retract action happens - when the piston retract then occurs, it doesn't work properly because the piston tile + // isn't what it is expecting. + if( level->getTile(x,y,z) != Tile::pistonMovingPiece_Id ) + { + player->connection->send( shared_ptr( new TileUpdatePacket(x, y, z, level) ) ); + } + + } + + 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; + item = nullptr; + } + + if (item == NULL || item->getUseDuration() == 0) + { + player->ignoreSlotUpdateHack = true; + player->inventory->items[player->inventory->selected] = ItemInstance::clone(player->inventory->items[player->inventory->selected]); + Slot *s = player->containerMenu->getSlotFor(player->inventory, player->inventory->selected); + player->containerMenu->broadcastChanges(); + player->ignoreSlotUpdateHack = false; + + if (forceClientUpdate || !ItemInstance::matches(player->inventory->getSelected(), packet->getItem())) + { + send( shared_ptr( new ContainerSetSlotPacket(player->containerMenu->containerId, s->index, player->inventory->getSelected()) ) ); + } + } +} + +void PlayerConnection::onDisconnect(DisconnectPacket::eDisconnectReason reason, void *reasonObjects) +{ + EnterCriticalSection(&done_cs); + if( done ) return; + // logger.info(player.name + " lost connection: " + reason); + // 4J-PB - removed, since it needs to be localised in the language the client is in + //server->players->broadcastAll( shared_ptr( new ChatPacket(L"e" + player->name + L" left the game.") ) ); + if(getWasKicked()) + { + server->getPlayers()->broadcastAll( shared_ptr( new ChatPacket(player->name, ChatPacket::e_ChatPlayerKickedFromGame) ) ); + } + else + { + server->getPlayers()->broadcastAll( shared_ptr( new ChatPacket(player->name, ChatPacket::e_ChatPlayerLeftGame) ) ); + } + server->getPlayers()->remove(player); + done = true; + LeaveCriticalSection(&done_cs); +} + +void PlayerConnection::onUnhandledPacket(shared_ptr packet) +{ + // logger.warning(getClass() + " wasn't prepared to deal with a " + packet.getClass()); + disconnect(DisconnectPacket::eDisconnect_UnexpectedPacket); +} + +void PlayerConnection::send(shared_ptr packet) +{ + if( connection->getSocket() != NULL ) + { + if( !server->getPlayers()->canReceiveAllPackets( player ) ) + { + // Check if we are allowed to send this packet type + if( !Packet::canSendToAnyClient(packet) ) + { + //wprintf(L"Not the systems primary player, so not sending them a packet : %ls / %d\n", player->name.c_str(), packet->getId() ); + return; + } + } + connection->send(packet); + } +} + +// 4J Added +void PlayerConnection::queueSend(shared_ptr packet) +{ + if( connection->getSocket() != NULL ) + { + if( !server->getPlayers()->canReceiveAllPackets( player ) ) + { + // Check if we are allowed to send this packet type + if( !Packet::canSendToAnyClient(packet) ) + { + //wprintf(L"Not the systems primary player, so not queueing them a packet : %ls\n", connection->getSocket()->getPlayer()->GetGamertag() ); + return; + } + } + connection->queueSend(packet); + } +} + +void PlayerConnection::handleSetCarriedItem(shared_ptr packet) +{ + if (packet->slot < 0 || packet->slot >= Inventory::getSelectionSize()) + { + // 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) +{ + // 4J - TODO +#if 0 + wstring message = packet->message; + if (message.length() > SharedConstants::maxChatLength) + { + disconnect(L"Chat message too long"); + return; + } + message = message.trim(); + for (int i = 0; i < message.length(); i++) + { + if (SharedConstants.acceptableLetters.indexOf(message.charAt(i)) < 0 && (int) message.charAt(i) < 32) + { + disconnect(L"Illegal characters in chat"); + return; + } + } + + if (message.startsWith("/")) + { + handleCommand(message); + } else { + message = "<" + player.name + "> " + message; + logger.info(message); + server.players.broadcastAll(new ChatPacket(message)); + } + chatSpamTickCount += SharedConstants::TICKS_PER_SECOND; + if (chatSpamTickCount > SharedConstants::TICKS_PER_SECOND * 10) + { + disconnect("disconnect.spam"); + } +#endif +} + +void PlayerConnection::handleCommand(const wstring& message) +{ + // 4J - TODO +#if 0 + server.getCommandDispatcher().performCommand(player, message); +#endif +} + +void PlayerConnection::handleAnimate(shared_ptr packet) +{ + player->resetLastActionTime(); + if (packet->action == AnimatePacket::SWING) + { + player->swing(); + } +} + +void PlayerConnection::handlePlayerCommand(shared_ptr packet) +{ + player->resetLastActionTime(); + if (packet->action == PlayerCommandPacket::START_SNEAKING) + { + player->setSneaking(true); + } + else if (packet->action == PlayerCommandPacket::STOP_SNEAKING) + { + player->setSneaking(false); + } + else if (packet->action == PlayerCommandPacket::START_SPRINTING) + { + player->setSprinting(true); + } + else if (packet->action == PlayerCommandPacket::STOP_SPRINTING) + { + player->setSprinting(false); + } + else if (packet->action == PlayerCommandPacket::STOP_SLEEPING) + { + 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); + } + else if (packet->action == PlayerCommandPacket::STOP_IDLEANIM) + { + player->setIsIdle(false); + } +} + +void PlayerConnection::setShowOnMaps(bool bVal) +{ + player->setShowOnMaps(bVal); +} + +void PlayerConnection::handleDisconnect(shared_ptr packet) +{ + // 4J Stu - Need to remove the player from the receiving list before their socket is NULLed so that we can find another player on their system + server->getPlayers()->removePlayerFromReceiving( player ); + connection->close(DisconnectPacket::eDisconnect_Quitting); +} + +int PlayerConnection::countDelayedPackets() +{ + return connection->countDelayedPackets(); +} + +void PlayerConnection::info(const wstring& string) +{ + // 4J-PB - removed, since it needs to be localised in the language the client is in + //send( shared_ptr( new ChatPacket(L"7" + string) ) ); +} + +void PlayerConnection::warn(const wstring& string) +{ + // 4J-PB - removed, since it needs to be localised in the language the client is in + //send( shared_ptr( new ChatPacket(L"9" + string) ) ); +} + +wstring PlayerConnection::getConsoleName() +{ + 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 + // a ray from head->head, but we may actually be looking at a different part of the entity that can be seen + // even though the ray is blocked. + if (target != NULL) // && player->canSee(target) && player->distanceToSqr(target) < 6 * 6) + { + //boole canSee = player->canSee(target); + //double maxDist = 6 * 6; + //if (!canSee) + //{ + // maxDist = 3 * 3; + //} + + //if (player->distanceToSqr(target) < maxDist) + //{ + 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) + { + //disconnect("Attempting to attack an invalid entity"); + //server.warn("Player " + player.getName() + " tried to attack an invalid entity"); + return; + } + player->attack(target); + } + //} + } + +} + +bool PlayerConnection::canHandleAsyncPackets() +{ + return true; +} + +void PlayerConnection::handleTexture(shared_ptr packet) +{ + // Both PlayerConnection and ClientConnection should handle this mostly the same way + + if(packet->dwBytes==0) + { + // Request for texture +#ifndef _CONTENT_PACKAGE + wprintf(L"Server received request for custom texture %ls\n",packet->textureName.c_str()); +#endif + PBYTE pbData=NULL; + DWORD dwBytes=0; + app.GetMemFileDetails(packet->textureName,&pbData,&dwBytes); + + if(dwBytes!=0) + { + send( shared_ptr( new TexturePacket(packet->textureName,pbData,dwBytes) ) ); + } + else + { + m_texturesRequested.push_back( packet->textureName ); + } + } + else + { + // Response with texture data +#ifndef _CONTENT_PACKAGE + 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); + } +} + +void PlayerConnection::handleTextureAndGeometry(shared_ptr packet) +{ + // Both PlayerConnection and ClientConnection should handle this mostly the same way + + if(packet->dwTextureBytes==0) + { + // Request for texture and geometry +#ifndef _CONTENT_PACKAGE + wprintf(L"Server received request for custom texture %ls\n",packet->textureName.c_str()); +#endif + PBYTE pbData=NULL; + DWORD dwTextureBytes=0; + app.GetMemFileDetails(packet->textureName,&pbData,&dwTextureBytes); + DLCSkinFile *pDLCSkinFile = app.m_dlcManager.getSkinFile(packet->textureName); + + if(dwTextureBytes!=0) + { + + if(pDLCSkinFile) + { + if(pDLCSkinFile->getAdditionalBoxesCount()!=0) + { + send( shared_ptr( new TextureAndGeometryPacket(packet->textureName,pbData,dwTextureBytes,pDLCSkinFile) ) ); + } + else + { + send( shared_ptr( new TextureAndGeometryPacket(packet->textureName,pbData,dwTextureBytes) ) ); + } + } + else + { + // we don't have the dlc skin, so retrieve the data from the app store + vector *pvSkinBoxes = app.GetAdditionalSkinBoxes(packet->dwSkinID); + unsigned int uiAnimOverrideBitmask= app.GetAnimOverrideBitmask(packet->dwSkinID); + + send( shared_ptr( new TextureAndGeometryPacket(packet->textureName,pbData,dwTextureBytes,pvSkinBoxes,uiAnimOverrideBitmask) ) ); + } + } + else + { + m_texturesRequested.push_back( packet->textureName ); + } + } + else + { + // Response with texture and geometry data +#ifndef _CONTENT_PACKAGE + wprintf(L"Server received custom texture %ls and geometry\n",packet->textureName.c_str()); +#endif + app.AddMemoryTextureFile(packet->textureName,packet->pbData,packet->dwTextureBytes); + + // add the geometry to the app list + if(packet->dwBoxC!=0) + { +#ifndef _CONTENT_PACKAGE + wprintf(L"Adding skin boxes for skin id %X, box count %d\n",packet->dwSkinID,packet->dwBoxC); +#endif + app.SetAdditionalSkinBoxes(packet->dwSkinID,packet->BoxDataA,packet->dwBoxC); + } + // Add the anim override + app.SetAnimOverrideBitmask(packet->dwSkinID,packet->uiAnimOverrideBitmask); + + player->setCustomSkin(packet->dwSkinID); + + server->connection->handleTextureAndGeometryReceived(packet->textureName); + } +} + +void PlayerConnection::handleTextureReceived(const wstring &textureName) +{ + // This sends the server received texture out to any other players waiting for the data + AUTO_VAR(it, find( m_texturesRequested.begin(), m_texturesRequested.end(), textureName )); + if( it != m_texturesRequested.end() ) + { + PBYTE pbData=NULL; + DWORD dwBytes=0; + app.GetMemFileDetails(textureName,&pbData,&dwBytes); + + if(dwBytes!=0) + { + send( shared_ptr( new TexturePacket(textureName,pbData,dwBytes) ) ); + m_texturesRequested.erase(it); + } + } +} + +void PlayerConnection::handleTextureAndGeometryReceived(const wstring &textureName) +{ + // This sends the server received texture out to any other players waiting for the data + AUTO_VAR(it, find( m_texturesRequested.begin(), m_texturesRequested.end(), textureName )); + if( it != m_texturesRequested.end() ) + { + PBYTE pbData=NULL; + DWORD dwTextureBytes=0; + app.GetMemFileDetails(textureName,&pbData,&dwTextureBytes); + DLCSkinFile *pDLCSkinFile=app.m_dlcManager.getSkinFile(textureName); + + if(dwTextureBytes!=0) + { + if(pDLCSkinFile && (pDLCSkinFile->getAdditionalBoxesCount()!=0)) + { + send( shared_ptr( new TextureAndGeometryPacket(textureName,pbData,dwTextureBytes,pDLCSkinFile) ) ); + } + else + { + // get the data from the app + DWORD dwSkinID = app.getSkinIdFromPath(textureName); + vector *pvSkinBoxes = app.GetAdditionalSkinBoxes(dwSkinID); + unsigned int uiAnimOverrideBitmask= app.GetAnimOverrideBitmask(dwSkinID); + + send( shared_ptr( new TextureAndGeometryPacket(textureName,pbData,dwTextureBytes, pvSkinBoxes, uiAnimOverrideBitmask) ) ); + } + m_texturesRequested.erase(it); + } + } +} + +void PlayerConnection::handleTextureChange(shared_ptr packet) +{ + switch(packet->action) + { + 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() ); +#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() ); +#endif + break; + } + if(!packet->path.empty() && packet->path.substr(0,3).compare(L"def") != 0 && !app.IsFileInMemoryTextures(packet->path)) + { + if( server->connection->addPendingTextureRequest(packet->path)) + { +#ifndef _CONTENT_PACKAGE + wprintf(L"Sending texture packet to get custom skin %ls from player %ls\n",packet->path.c_str(), player->name.c_str()); +#endif + send(shared_ptr( new TexturePacket(packet->path,NULL,0) ) ); + } + } + else if(!packet->path.empty() && app.IsFileInMemoryTextures(packet->path)) + { + // Update the ref count on the memory texture data + app.AddMemoryTextureFile(packet->path,NULL,0); + } + server->getPlayers()->broadcastAll( shared_ptr( new TextureChangePacket(player,packet->action,packet->path) ), player->dimension ); +} + +void PlayerConnection::handleTextureAndGeometryChange(shared_ptr packet) +{ + + player->setCustomSkin( app.getSkinIdFromPath( packet->path ) ); +#ifndef _CONTENT_PACKAGE + wprintf(L"PlayerConnection::handleTextureAndGeometryChange - Skin for server player %ls has changed to %ls (%d)\n", player->name.c_str(), player->customTextureUrl.c_str(), player->getPlayerDefaultSkin() ); +#endif + + + if(!packet->path.empty() && packet->path.substr(0,3).compare(L"def") != 0 && !app.IsFileInMemoryTextures(packet->path)) + { + if( server->connection->addPendingTextureRequest(packet->path)) + { +#ifndef _CONTENT_PACKAGE + wprintf(L"Sending texture packet to get custom skin %ls from player %ls\n",packet->path.c_str(), player->name.c_str()); +#endif + send(shared_ptr( new TextureAndGeometryPacket(packet->path,NULL,0) ) ); + } + } + else if(!packet->path.empty() && app.IsFileInMemoryTextures(packet->path)) + { + // Update the ref count on the memory texture data + app.AddMemoryTextureFile(packet->path,NULL,0); + + player->setCustomSkin(packet->dwSkinID); + + // If we already have the texture, then we already have the model parts too + //app.SetAdditionalSkinBoxes(packet->dwSkinID,) + //DebugBreak(); + } + server->getPlayers()->broadcastAll( shared_ptr( new TextureAndGeometryChangePacket(player,packet->path) ), player->dimension ); +} + +void PlayerConnection::handleServerSettingsChanged(shared_ptr packet) +{ + if(packet->action==ServerSettingsChangedPacket::HOST_IN_GAME_SETTINGS) + { + // Need to check that this player has permission to change each individual setting? + + INetworkPlayer *networkPlayer = getNetworkPlayer(); + if( (networkPlayer != NULL && networkPlayer->IsHost()) || 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_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) ) ) ); + + // Update the QoS data + g_NetworkManager.UpdateAndSetGameSessionData(); + } + } +} + +void PlayerConnection::handleKickPlayer(shared_ptr packet) +{ + INetworkPlayer *networkPlayer = getNetworkPlayer(); + if( (networkPlayer != NULL && networkPlayer->IsHost()) || player->isModerator()) + { + server->getPlayers()->kickPlayerByShortId(packet->m_networkSmallId); + } +} + +void PlayerConnection::handleGameCommand(shared_ptr packet) +{ + MinecraftServer::getInstance()->getCommandDispatcher()->performCommand(player, packet->command, packet->data); +} + +void PlayerConnection::handleClientCommand(shared_ptr packet) +{ + player->resetLastActionTime(); + if (packet->action == ClientCommandPacket::PERFORM_RESPAWN) + { + if (player->wonGame) + { + player = server->getPlayers()->respawn(player, player->m_enteredEndExitPortal?0:player->dimension, true); + } + //else if (player.getLevel().getLevelData().isHardcore()) + //{ + // if (server.isSingleplayer() && player.name.equals(server.getSingleplayerName())) + // { + // player.connection.disconnect("You have died. Game over, man, it's game over!"); + // server.selfDestruct(); + // } + // else + // { + // BanEntry ban = new BanEntry(player.name); + // ban.setReason("Death in Hardcore"); + + // server.getPlayers().getBans().add(ban); + // player.connection.disconnect("You have died. Game over, man, it's game over!"); + // } + //} + else + { + if (player->getHealth() > 0) return; + player = server->getPlayers()->respawn(player, 0, false); + } + } +} + +void PlayerConnection::handleRespawn(shared_ptr packet) +{ +} + +void PlayerConnection::handleContainerClose(shared_ptr packet) +{ + player->doCloseContainer(); +} + +#ifndef _CONTENT_PACKAGE +void PlayerConnection::handleContainerSetSlot(shared_ptr packet) +{ + if (packet->containerId == AbstractContainerMenu::CONTAINER_ID_CARRIED ) + { + player->inventory->setCarried(packet->item); + } + else + { + 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) + { + if (lastItem == NULL || lastItem->count < packet->item->count) + { + 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->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->clickType, player); + + if (ItemInstance::matches(packet->item, clicked)) + { + // Yep, you sure did click what you claimed to click! + player->connection->send( shared_ptr( new ContainerAckPacket(packet->containerId, packet->uid, true) ) ); + player->ignoreSlotUpdateHack = true; + player->containerMenu->broadcastChanges(); + player->broadcastCarriedItem(); + player->ignoreSlotUpdateHack = false; + } + else + { + // No, you clicked the wrong thing! + expectedAcks[player->containerMenu->containerId] = packet->uid; + player->connection->send( shared_ptr( new ContainerAckPacket(packet->containerId, packet->uid, false) ) ); + player->containerMenu->setSynched(player, false); + + vector > items; + for (unsigned int i = 0; i < player->containerMenu->slots.size(); i++) + { + items.push_back(player->containerMenu->slots.at(i)->getItem()); + } + player->refreshContainer(player->containerMenu, &items); + + // player.containerMenu.broadcastChanges(); + } + } + +} + +void PlayerConnection::handleContainerButtonClick(shared_ptr packet) +{ + player->resetLastActionTime(); + if (player->containerMenu->containerId == packet->containerId && player->containerMenu->isSynched(player)) + { + player->containerMenu->clickMenuButton(player, packet->buttonId); + player->containerMenu->broadcastChanges(); + } +} + +void PlayerConnection::handleSetCreativeModeSlot(shared_ptr packet) +{ + if (player->gameMode->isCreative()) + { + bool drop = packet->slotNum < 0; + shared_ptr item = packet->item; + + if(item != NULL && item->id == Item::map_Id) + { + 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); +#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; +#endif + item->setAuxValue( player->level->getAuxValueForMap(player->getXuid(), player->dimension, centreXC, centreZC, mapScale) ); + + shared_ptr data = MapItem::getSavedData(item->getAuxValue(), player->level); + // 4J Stu - We only have one map per player per dimension, so don't reset the one that they have + // when a new one is created + wchar_t buf[64]; + swprintf(buf,64,L"map_%d", item->getAuxValue()); + std::wstring id = wstring(buf); + if( data == NULL ) + { + data = shared_ptr( new MapItemSavedData(id) ); + } + player->level->setSavedData(id, (shared_ptr ) data); + + data->scale = mapScale; + // 4J-PB - for Xbox maps, we'll centre them on the origin of the world, since we can fit the whole world in our map + data->x = centreXC; + data->z = centreZC; + data->dimension = (byte) player->level->dimension->id; + data->setDirty(); + } + + bool validSlot = (packet->slotNum >= InventoryMenu::CRAFT_SLOT_START && packet->slotNum < (InventoryMenu::USE_ROW_SLOT_START + Inventory::getSelectionSize())); + bool validItem = item == NULL || (item->id < Item::items.length && item->id >= 0 && Item::items[item->id] != NULL); + bool validData = item == NULL || (item->getAuxValue() >= 0 && item->count > 0 && item->count <= 64); + + if (validSlot && validItem && validData) + { + if (item == NULL) + { + player->inventoryMenu->setItem(packet->slotNum, nullptr); + } + else + { + player->inventoryMenu->setItem(packet->slotNum, item ); + } + player->inventoryMenu->setSynched(player, true); + // player.slotChanged(player.inventoryMenu, packet.slotNum, player.inventoryMenu.getSlot(packet.slotNum).getItem()); + } + else if (drop && validItem && validData) + { + if (dropSpamTickCount < SharedConstants::TICKS_PER_SECOND * 10) + { + dropSpamTickCount += SharedConstants::TICKS_PER_SECOND; + // drop item + shared_ptr dropped = player->drop(item); + if (dropped != NULL) + { + dropped->setShortLifeTime(); + } + } + } + + if( item != NULL && item->id == Item::map_Id ) + { + // 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->inventoryMenu->slots.size(); i++) + { + items.push_back(player->inventoryMenu->slots.at(i)->getItem()); + } + player->refreshContainer(player->inventoryMenu, &items); + } + } +} + +void PlayerConnection::handleContainerAck(shared_ptr packet) +{ + AUTO_VAR(it, expectedAcks.find(player->containerMenu->containerId)); + + if (it != expectedAcks.end() && packet->uid == it->second && player->containerMenu->containerId == packet->containerId && !player->containerMenu->isSynched(player)) + { + player->containerMenu->setSynched(player, true); + } +} + +void PlayerConnection::handleSignUpdate(shared_ptr packet) +{ + player->resetLastActionTime(); + app.DebugPrintf("PlayerConnection::handleSignUpdate\n"); + + ServerLevel *level = server->getLevel(player->dimension); + if (level->hasChunkAt(packet->x, packet->y, packet->z)) + { + shared_ptr te = level->getTileEntity(packet->x, packet->y, packet->z); + + if (dynamic_pointer_cast(te) != NULL) + { + shared_ptr ste = dynamic_pointer_cast(te); + if (!ste->isEditable() || ste->getPlayerWhoMayEdit() != player) + { + server->warn(L"Player " + player->getName() + L" just tried to change non-editable sign"); + return; + } + } + + // 4J-JEV: Changed to allow characters to display as a []. + if (dynamic_pointer_cast(te) != NULL) + { + int x = packet->x; + int y = packet->y; + int z = packet->z; + shared_ptr ste = dynamic_pointer_cast(te); + for (int i = 0; i < 4; i++) + { + wstring lineText = packet->lines[i].substr(0,15); + ste->SetMessage( i, lineText ); + } + ste->SetVerified(false); + ste->setChanged(); + level->sendTileUpdated(x, y, z); + } + } + +} + +void PlayerConnection::handleKeepAlive(shared_ptr packet) +{ + if (packet->id == lastKeepAliveId) + { + int time = (int) (System::nanoTime() / 1000000 - lastKeepAliveTime); + player->latency = (player->latency * 3 + time) / 4; + } +} + +void PlayerConnection::handlePlayerInfo(shared_ptr packet) +{ + // Need to check that this player has permission to change each individual setting? + + INetworkPlayer *networkPlayer = getNetworkPlayer(); + if( (networkPlayer != NULL && networkPlayer->IsHost()) || player->isModerator() ) + { + shared_ptr serverPlayer; + // Find the player being edited + for(AUTO_VAR(it, server->getPlayers()->players.begin()); it != server->getPlayers()->players.end(); ++it) + { + shared_ptr checkingPlayer = *it; + if(checkingPlayer->connection->getNetworkPlayer() != NULL && checkingPlayer->connection->getNetworkPlayer()->GetSmallId() == packet->m_networkSmallId) + { + serverPlayer = checkingPlayer; + break; + } + } + + if(serverPlayer != NULL) + { + unsigned int origPrivs = serverPlayer->getAllPlayerGamePrivileges(); + + bool trustPlayers = app.GetGameHostOption(eGameHostOption_TrustPlayers) != 0; + bool cheats = app.GetGameHostOption(eGameHostOption_CheatsEnabled) != 0; + if(serverPlayer == player) + { + GameType *gameType = Player::getPlayerGamePrivilege(packet->m_playerPrivileges,Player::ePlayerGamePrivilege_CreativeMode) ? GameType::CREATIVE : GameType::SURVIVAL; + gameType = LevelSettings::validateGameType(gameType->getId()); + if (serverPlayer->gameMode->getGameModeForPlayer() != gameType) + { +#ifndef _CONTENT_PACKAGE + wprintf(L"Setting %ls to game mode %d\n", serverPlayer->name.c_str(), gameType); +#endif + serverPlayer->setPlayerGamePrivilege(Player::ePlayerGamePrivilege_CreativeMode,Player::getPlayerGamePrivilege(packet->m_playerPrivileges,Player::ePlayerGamePrivilege_CreativeMode) ); + serverPlayer->gameMode->setGameModeForPlayer(gameType); + serverPlayer->connection->send( shared_ptr( new GameEventPacket(GameEventPacket::CHANGE_GAME_MODE, gameType->getId()) )); + } + else + { +#ifndef _CONTENT_PACKAGE + wprintf(L"%ls already has game mode %d\n", serverPlayer->name.c_str(), gameType); +#endif + } + if(cheats) + { + // Editing self + bool canBeInvisible = Player::getPlayerGamePrivilege(origPrivs, Player::ePlayerGamePrivilege_CanToggleInvisible) != 0; + if(canBeInvisible)serverPlayer->setPlayerGamePrivilege(Player::ePlayerGamePrivilege_Invisible,Player::getPlayerGamePrivilege(packet->m_playerPrivileges,Player::ePlayerGamePrivilege_Invisible) ); + if(canBeInvisible)serverPlayer->setPlayerGamePrivilege(Player::ePlayerGamePrivilege_Invulnerable,Player::getPlayerGamePrivilege(packet->m_playerPrivileges,Player::ePlayerGamePrivilege_Invulnerable) ); + + bool inCreativeMode = Player::getPlayerGamePrivilege(origPrivs,Player::ePlayerGamePrivilege_CreativeMode) != 0; + if(!inCreativeMode) + { + bool canFly = Player::getPlayerGamePrivilege(origPrivs,Player::ePlayerGamePrivilege_CanToggleFly); + bool canChangeHunger = Player::getPlayerGamePrivilege(origPrivs,Player::ePlayerGamePrivilege_CanToggleClassicHunger); + + if(canFly)serverPlayer->setPlayerGamePrivilege(Player::ePlayerGamePrivilege_CanFly,Player::getPlayerGamePrivilege(packet->m_playerPrivileges,Player::ePlayerGamePrivilege_CanFly) ); + if(canChangeHunger)serverPlayer->setPlayerGamePrivilege(Player::ePlayerGamePrivilege_ClassicHunger,Player::getPlayerGamePrivilege(packet->m_playerPrivileges,Player::ePlayerGamePrivilege_ClassicHunger) ); + } + } + } + else + { + // Editing someone else + if(!trustPlayers && !serverPlayer->connection->getNetworkPlayer()->IsHost()) + { + serverPlayer->setPlayerGamePrivilege(Player::ePlayerGamePrivilege_CannotMine,Player::getPlayerGamePrivilege(packet->m_playerPrivileges,Player::ePlayerGamePrivilege_CannotMine) ); + serverPlayer->setPlayerGamePrivilege(Player::ePlayerGamePrivilege_CannotBuild,Player::getPlayerGamePrivilege(packet->m_playerPrivileges,Player::ePlayerGamePrivilege_CannotBuild) ); + serverPlayer->setPlayerGamePrivilege(Player::ePlayerGamePrivilege_CannotAttackPlayers,Player::getPlayerGamePrivilege(packet->m_playerPrivileges,Player::ePlayerGamePrivilege_CannotAttackPlayers) ); + serverPlayer->setPlayerGamePrivilege(Player::ePlayerGamePrivilege_CannotAttackAnimals,Player::getPlayerGamePrivilege(packet->m_playerPrivileges,Player::ePlayerGamePrivilege_CannotAttackAnimals) ); + serverPlayer->setPlayerGamePrivilege(Player::ePlayerGamePrivilege_CanUseDoorsAndSwitches,Player::getPlayerGamePrivilege(packet->m_playerPrivileges,Player::ePlayerGamePrivilege_CanUseDoorsAndSwitches) ); + serverPlayer->setPlayerGamePrivilege(Player::ePlayerGamePrivilege_CanUseContainers,Player::getPlayerGamePrivilege(packet->m_playerPrivileges,Player::ePlayerGamePrivilege_CanUseContainers) ); + } + + if(networkPlayer->IsHost()) + { + if(cheats) + { + serverPlayer->setPlayerGamePrivilege(Player::ePlayerGamePrivilege_CanToggleInvisible,Player::getPlayerGamePrivilege(packet->m_playerPrivileges,Player::ePlayerGamePrivilege_CanToggleInvisible) ); + serverPlayer->setPlayerGamePrivilege(Player::ePlayerGamePrivilege_CanToggleFly,Player::getPlayerGamePrivilege(packet->m_playerPrivileges,Player::ePlayerGamePrivilege_CanToggleFly) ); + serverPlayer->setPlayerGamePrivilege(Player::ePlayerGamePrivilege_CanToggleClassicHunger,Player::getPlayerGamePrivilege(packet->m_playerPrivileges,Player::ePlayerGamePrivilege_CanToggleClassicHunger) ); + serverPlayer->setPlayerGamePrivilege(Player::ePlayerGamePrivilege_CanTeleport,Player::getPlayerGamePrivilege(packet->m_playerPrivileges,Player::ePlayerGamePrivilege_CanTeleport) ); + } + serverPlayer->setPlayerGamePrivilege(Player::ePlayerGamePrivilege_Op,Player::getPlayerGamePrivilege(packet->m_playerPrivileges,Player::ePlayerGamePrivilege_Op) ); + } + } + + server->getPlayers()->broadcastAll( shared_ptr( new PlayerInfoPacket( serverPlayer ) ) ); + } + } +} + +bool PlayerConnection::isServerPacketListener() +{ + return true; +} + +void PlayerConnection::handlePlayerAbilities(shared_ptr playerAbilitiesPacket) +{ + player->abilities.flying = playerAbilitiesPacket->isFlying() && player->abilities.mayfly; +} + +//void handleChatAutoComplete(ChatAutoCompletePacket packet) { +// StringBuilder result = new StringBuilder(); + +// for (String candidate : server.getAutoCompletions(player, packet.getMessage())) { +// if (result.length() > 0) result.append("\0"); + +// result.append(candidate); +// } + +// player.connection.send(new ChatAutoCompletePacket(result.toString())); +//} + +//void handleClientInformation(shared_ptr packet) +//{ +// player->updateOptions(packet); +//} + +void PlayerConnection::handleCustomPayload(shared_ptr customPayloadPacket) +{ +#if 0 + if (CustomPayloadPacket.CUSTOM_BOOK_PACKET.equals(customPayloadPacket.identifier)) + { + ByteArrayInputStream bais(customPayloadPacket->data); + DataInputStream input(&bais); + shared_ptr sentItem = Packet::readItem(input); + + if (!WritingBookItem.makeSureTagIsValid(sentItem.getTag())) + { + throw new IOException("Invalid book tag!"); + } + + // make sure the sent item is the currently carried item + ItemInstance carried = player.inventory.getSelected(); + if (sentItem != null && sentItem.id == Item.writingBook.id && sentItem.id == carried.id) + { + carried.addTagElement(WrittenBookItem.TAG_PAGES, sentItem.getTag().getList(WrittenBookItem.TAG_PAGES)); + } + } + else if (CustomPayloadPacket.CUSTOM_BOOK_SIGN_PACKET.equals(customPayloadPacket.identifier)) + { + DataInputStream input = new DataInputStream(new ByteArrayInputStream(customPayloadPacket.data)); + ItemInstance sentItem = Packet.readItem(input); + + if (!WrittenBookItem.makeSureTagIsValid(sentItem.getTag())) + { + throw new IOException("Invalid book tag!"); + } + + // make sure the sent item is the currently carried item + ItemInstance carried = player.inventory.getSelected(); + if (sentItem != null && sentItem.id == Item.writtenBook.id && carried.id == Item.writingBook.id) + { + 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; + } + } + else +#endif + if (CustomPayloadPacket::TRADER_SELECTION_PACKET.compare(customPayloadPacket->identifier) == 0) + { + ByteArrayInputStream bais(customPayloadPacket->data); + DataInputStream input(&bais); + int selection = input.readInt(); + + AbstractContainerMenu *menu = player->containerMenu; + if (dynamic_cast(menu)) + { + ((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) + { + AnvilMenu *menu = dynamic_cast( player->containerMenu); + if (menu) + { + if (customPayloadPacket->data.data == NULL || customPayloadPacket->data.length < 1) + { + menu->setItemName(L""); + } + else + { + ByteArrayInputStream bais(customPayloadPacket->data); + DataInputStream dis(&bais); + wstring name = dis.readUTF(); + if (name.length() <= 30) + { + menu->setItemName(name); + } + } + } + } +} + +bool PlayerConnection::isDisconnected() +{ + return done; +} + +// 4J Added + +void PlayerConnection::handleDebugOptions(shared_ptr packet) +{ + //Player player = dynamic_pointer_cast( player->shared_from_this() ); + player->SetDebugOptions(packet->m_uiVal); +} + +void PlayerConnection::handleCraftItem(shared_ptr packet) +{ + int iRecipe = packet->recipe; + + if(iRecipe == -1) + return; + + Recipy::INGREDIENTS_REQUIRED *pRecipeIngredientsRequired=Recipes::getInstance()->getRecipeIngredientsArray(); + shared_ptr pTempItemInst=pRecipeIngredientsRequired[iRecipe].pRecipy->assemble(nullptr); + + if(app.DebugSettingsOn() && (player->GetDebugOptions()&(1L<onCraftedBy(player->level, dynamic_pointer_cast( player->shared_from_this() ), pTempItemInst->count ); + if(player->inventory->add(pTempItemInst)==false ) + { + // no room in inventory, so throw it down + 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) + //{ + pTempItemInst->onCraftedBy(player->level, dynamic_pointer_cast( player->shared_from_this() ), pTempItemInst->count ); + + // and remove those resources from your inventory + for(int i=0;i ingItemInst = nullptr; + // do we need to remove a specific aux value? + if(pRecipeIngredientsRequired[iRecipe].iIngAuxValA[i]!=Recipes::ANY_AUX_VALUE) + { + ingItemInst = player->inventory->getResourceItem( pRecipeIngredientsRequired[iRecipe].iIngIDA[i],pRecipeIngredientsRequired[iRecipe].iIngAuxValA[i] ); + player->inventory->removeResource(pRecipeIngredientsRequired[iRecipe].iIngIDA[i],pRecipeIngredientsRequired[iRecipe].iIngAuxValA[i]); + } + else + { + ingItemInst = player->inventory->getResourceItem( pRecipeIngredientsRequired[iRecipe].iIngIDA[i] ); + player->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 + player->inventory->add( shared_ptr( new ItemInstance(ingItemInst->getItem()->getCraftingRemainingItem()) ) ); + } + + } + } + } + + // 4J Stu - Fix for #13119 - We should add the item after we remove the ingredients + if(player->inventory->add(pTempItemInst)==false ) + { + // no room in inventory, so throw it down + player->drop(pTempItemInst); + } + + if( pTempItemInst->id == Item::map_Id ) + { + // 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++) + { + items.push_back(player->containerMenu->slots.at(i)->getItem()); + } + player->refreshContainer(player->containerMenu, &items); + } + else + { + // Do same hack as PlayerConnection::handleContainerClick does - do our broadcast of changes just now, but with a hack so it just thinks it has sent + // things but hasn't really. This will stop the client getting a message back confirming the current inventory items, which might then arrive + // after another local change has been made on the client and be stale. + player->ignoreSlotUpdateHack = true; + player->containerMenu->broadcastChanges(); + player->broadcastCarriedItem(); + player->ignoreSlotUpdateHack = false; + } + } + + // 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; + } + //} + // ELSE The server thinks the client was wrong... +} + + +void PlayerConnection::handleTradeItem(shared_ptr packet) +{ + if (player->containerMenu->containerId == packet->containerId) + { + MerchantMenu *menu = (MerchantMenu *)player->containerMenu; + + MerchantRecipeList *offers = menu->getMerchant()->getOffers(player); + + if(offers) + { + int selectedShopItem = packet->offer; + if( selectedShopItem < offers->size() ) + { + MerchantRecipe *activeRecipe = offers->at(selectedShopItem); + if(!activeRecipe->isDeprecated()) + { + // Do we have the ingredients? + shared_ptr buyAItem = activeRecipe->getBuyAItem(); + shared_ptr buyBItem = activeRecipe->getBuyBItem(); + + int buyAMatches = player->inventory->countMatches(buyAItem); + int buyBMatches = player->inventory->countMatches(buyBItem); + if( (buyAItem != NULL && buyAMatches >= buyAItem->count) && (buyBItem == NULL || buyBMatches >= buyBItem->count) ) + { + menu->getMerchant()->notifyTrade(activeRecipe); + + // Remove the items we are purchasing with + player->inventory->removeResources(buyAItem); + player->inventory->removeResources(buyBItem); + + // Add the item we have purchased + shared_ptr result = activeRecipe->getSellItem()->copy(); + + // 4J JEV - Award itemsBought stat. + player->awardStat( + GenericStats::itemsBought(result->getItem()->id), + GenericStats::param_itemsBought( + result->getItem()->id, + result->getAuxValue(), + result->GetCount() + ) + ); + + if (!player->inventory->add(result)) + { + player->drop(result); + } + } + } + } + } + } +} + +INetworkPlayer *PlayerConnection::getNetworkPlayer() +{ + if( connection != NULL && connection->getSocket() != NULL) return connection->getSocket()->getPlayer(); + else return NULL; +} + +bool PlayerConnection::isLocal() +{ + if( connection->getSocket() == NULL ) + { + return false; + } + else + { + bool isLocal = connection->getSocket()->isLocal(); + return connection->getSocket()->isLocal(); + } +} + +bool PlayerConnection::isGuest() +{ + if( connection->getSocket() == NULL ) + { + return false; + } + else + { + INetworkPlayer *networkPlayer = connection->getSocket()->getPlayer(); + bool isGuest = false; + if(networkPlayer != NULL) + { + isGuest = networkPlayer->IsGuest() == TRUE; + } + return isGuest; + } +} diff --git a/Minecraft.Client/PlayerConnection.h b/Minecraft.Client/PlayerConnection.h new file mode 100644 index 00000000..c691e6f5 --- /dev/null +++ b/Minecraft.Client/PlayerConnection.h @@ -0,0 +1,139 @@ +#include "ConsoleInputSource.h" +#include "..\Minecraft.World\PacketListener.h" +#include "..\Minecraft.World\JavaIntHash.h" + +class MinecraftServer; +class Connection; +class ServerPlayer; +class INetworkPlayer; + +using namespace std; + +class PlayerConnection : public PacketListener, public ConsoleInputSource +{ +// public static Logger logger = Logger.getLogger("Minecraft"); + +public: + Connection *connection; + bool done; + CRITICAL_SECTION done_cs; + + // 4J Stu - Added this so that we can manage UGC privileges + PlayerUID m_offlineXUID, m_onlineXUID; + bool m_friendsOnlyUGC; + +private: + MinecraftServer *server; + shared_ptr player; + int tickCount; + int aboveGroundTickCount; + + bool didTick; + int lastKeepAliveId; + __int64 lastKeepAliveTime; + static Random random; + __int64 lastKeepAliveTick; + int chatSpamTickCount; + int dropSpamTickCount; + + bool m_bHasClientTickedOnce; + +public: + PlayerConnection(MinecraftServer *server, Connection *connection, shared_ptr player); + ~PlayerConnection(); + void tick(); + void disconnect(DisconnectPacket::eDisconnectReason reason); + +private: + double xLastOk, yLastOk, zLastOk; + bool synched; + +public: + virtual void handlePlayerInput(shared_ptr packet); + virtual void handleMovePlayer(shared_ptr packet); + void teleport(double x, double y, double z, float yRot, float xRot, bool sendPacket = true); // 4J Added sendPacket param + virtual void handlePlayerAction(shared_ptr packet); + virtual void handleUseItem(shared_ptr packet); + virtual void onDisconnect(DisconnectPacket::eDisconnectReason reason, void *reasonObjects); + virtual void onUnhandledPacket(shared_ptr packet); + void send(shared_ptr packet); + void queueSend(shared_ptr packet); // 4J Added + virtual void handleSetCarriedItem(shared_ptr packet); + virtual void handleChat(shared_ptr packet); +private: + void handleCommand(const wstring& message); +public: + virtual void handleAnimate(shared_ptr packet); + virtual void handlePlayerCommand(shared_ptr packet); + virtual void handleDisconnect(shared_ptr packet); + int countDelayedPackets(); + virtual void info(const wstring& string); + virtual void warn(const wstring& string); + virtual wstring getConsoleName(); + virtual void handleInteract(shared_ptr packet); + bool canHandleAsyncPackets(); + virtual void handleClientCommand(shared_ptr packet); + virtual void handleRespawn(shared_ptr packet); + virtual void handleContainerClose(shared_ptr packet); + +private: + unordered_map expectedAcks; + +public: + // 4J Stu - Handlers only valid in debug mode +#ifndef _CONTENT_PACKAGE + virtual void handleContainerSetSlot(shared_ptr packet); +#endif + virtual void handleContainerClick(shared_ptr packet); + virtual void handleContainerButtonClick(shared_ptr packet); + virtual void handleSetCreativeModeSlot(shared_ptr packet); + virtual void handleContainerAck(shared_ptr packet); + virtual void handleSignUpdate(shared_ptr packet); + virtual void handleKeepAlive(shared_ptr packet); + virtual void handlePlayerInfo(shared_ptr packet); // 4J Added + virtual bool isServerPacketListener(); + virtual void handlePlayerAbilities(shared_ptr playerAbilitiesPacket); + virtual void handleCustomPayload(shared_ptr customPayloadPacket); + virtual bool isDisconnected(); + + // 4J Added + virtual void handleCraftItem(shared_ptr packet); + virtual void handleTradeItem(shared_ptr packet); + virtual void handleDebugOptions(shared_ptr packet); + virtual void handleTexture(shared_ptr packet); + virtual void handleTextureAndGeometry(shared_ptr packet); + virtual void handleTextureChange(shared_ptr packet); + virtual void handleTextureAndGeometryChange(shared_ptr packet); + virtual void handleServerSettingsChanged(shared_ptr packet); + virtual void handleKickPlayer(shared_ptr packet); + virtual void handleGameCommand(shared_ptr packet); + + INetworkPlayer *getNetworkPlayer(); + bool isLocal(); + bool isGuest(); + + // 4J Added as we need to set this from outside sometimes + void setPlayer(shared_ptr player) { this->player = player; } + shared_ptr getPlayer() { return player; } + + // 4J Added to signal a disconnect from another thread + void closeOnTick() { m_bCloseOnTick = true; } + + // 4J Added so that we can send on textures that get received after this connection requested them + void handleTextureReceived(const wstring &textureName); + void handleTextureAndGeometryReceived(const wstring &textureName); + + void setShowOnMaps(bool bVal); + + void setWasKicked() { m_bWasKicked = true; } + bool getWasKicked() { return m_bWasKicked; } + + // 4J Added + bool hasClientTickedOnce() { return m_bHasClientTickedOnce; } + +private: + bool m_bCloseOnTick; + vector m_texturesRequested; + + bool m_bWasKicked; +}; \ No newline at end of file diff --git a/Minecraft.Client/PlayerInfo.h b/Minecraft.Client/PlayerInfo.h new file mode 100644 index 00000000..427c78d8 --- /dev/null +++ b/Minecraft.Client/PlayerInfo.h @@ -0,0 +1,15 @@ +#pragma once +using namespace std; + +class PlayerInfo +{ +public: + wstring name; + int latency; + + PlayerInfo(const wstring &name) + { + this->name = name; + latency = 0; + } +}; \ No newline at end of file diff --git a/Minecraft.Client/PlayerList.cpp b/Minecraft.Client/PlayerList.cpp new file mode 100644 index 00000000..9fbef2a2 --- /dev/null +++ b/Minecraft.Client/PlayerList.cpp @@ -0,0 +1,1617 @@ +#include "stdafx.h" +#include "PlayerList.h" +#include "PlayerChunkMap.h" +#include "MinecraftServer.h" +#include "Settings.h" +#include "ServerLevel.h" +#include "ServerChunkCache.h" +#include "ServerPlayer.h" +#include "ServerPlayerGameMode.h" +#include "ServerConnection.h" +#include "PendingConnection.h" +#include "PlayerConnection.h" +#include "EntityTracker.h" +#include "..\Minecraft.World\net.minecraft.world.level.storage.h" +#include "..\Minecraft.World\net.minecraft.world.level.dimension.h" +#include "..\Minecraft.World\ArrayWithLength.h" +#include "..\Minecraft.World\net.minecraft.network.packet.h" +#include "..\Minecraft.World\net.minecraft.network.h" +#include "..\Minecraft.World\Pos.h" +#include "..\Minecraft.World\ProgressListener.h" +#include "..\Minecraft.World\HellRandomLevelSource.h" +#include "..\Minecraft.World\net.minecraft.world.phys.h" +#include "..\Minecraft.World\net.minecraft.world.item.h" +#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__) +#include "Common\Network\Sony\NetworkPlayerSony.h" +#endif + +// 4J - this class is fairly substantially altered as there didn't seem any point in porting code for banning, whitelisting, ops etc. + +PlayerList::PlayerList(MinecraftServer *server) +{ + playerIo = NULL; + + this->server = server; + + sendAllPlayerInfoIn = 0; + overrideGameMode = NULL; + allowCheatsForAllPlayers = false; + +#ifdef __PSVITA__ + viewDistance = 3; +#elif defined _LARGE_WORLDS + viewDistance = 16; +#else + viewDistance = 10; +#endif + + //int viewDistance = server->settings->getInt(L"view-distance", 10); + + maxPlayers = server->settings->getInt(L"max-players", 20); + doWhiteList = false; + + InitializeCriticalSection(&m_kickPlayersCS); + InitializeCriticalSection(&m_closePlayersCS); +} + +PlayerList::~PlayerList() +{ + for( AUTO_VAR(it, players.begin()); it < players.end(); it++ ) + { + (*it)->connection = nullptr; // Must remove reference to connection, or else there is a circular dependency + delete (*it)->gameMode; // Gamemode also needs deleted as it references back to this player + (*it)->gameMode = NULL; + } + + DeleteCriticalSection(&m_kickPlayersCS); + DeleteCriticalSection(&m_closePlayersCS); +} + +void PlayerList::placeNewPlayer(Connection *connection, shared_ptr player, shared_ptr packet) +{ + CompoundTag *playerTag = load(player); + + 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() ) + { + if( networkPlayer != NULL ) + { + ((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); + + // logger.info(getName() + " logged in with entity id " + playerEntity.entityId + " at (" + playerEntity.x + ", " + playerEntity.y + ", " + playerEntity.z + ")"); + + ServerLevel *level = server->getLevel(player->dimension); + + 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) + { + usedIndexes[ (int)(*it)->getPlayerIndex() ] = true; + } + for(unsigned int i = 0; i < MINECRAFT_NET_MAX_PLAYERS; ++i) + { + if(!usedIndexes[i]) + { + playerIndex = i; + break; + } + } + } + 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 + + 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); +#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; +#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)) + { + 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()); +#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); + } + + if(!player->customTextureUrl2.empty() && player->customTextureUrl2.substr(0,3).compare(L"def") != 0 && !app.IsFileInMemoryTextures(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()); +#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); + } + + player->setIsGuest( packet->m_isGuest ); + + Pos *spawnPos = level->getSharedSpawnPos(); + + updatePlayerGameMode(player, nullptr, level); + + // Update the privileges with the correct game mode + GameType *gameType = Player::getPlayerGamePrivilege(player->getAllPlayerGamePrivileges(),Player::ePlayerGamePrivilege_CreativeMode) ? GameType::CREATIVE : GameType::SURVIVAL; + gameType = LevelSettings::validateGameType(gameType->getId()); + if (player->gameMode->getGameModeForPlayer() != gameType) + { + player->setPlayerGamePrivilege(Player::ePlayerGamePrivilege_CreativeMode,player->gameMode->getGameModeForPlayer()->getId() ); + } + + //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) + { + mount->forcedLoading = true; + level->addEntity(mount); + player->ride(mount); + mount->forcedLoading = false; + } + } + + // 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 ) + { + 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) +{ + playerIo = levels[0]->getLevelStorage()->getPlayerIO(); +} + +void PlayerList::changeDimension(shared_ptr player, ServerLevel *from) +{ + ServerLevel *to = player->getLevel(); + + if (from != NULL) from->getChunkMap()->remove(player); + to->getChunkMap()->add(player); + + to->cache->create(((int) player->x) >> 4, ((int) player->z) >> 4); +} + +int PlayerList::getMaxRange() +{ + return PlayerChunkMap::convertChunkRangeToBlock(getViewDistance()); +} + +CompoundTag *PlayerList::load(shared_ptr player) +{ + return playerIo->load(player); +} + +void PlayerList::save(shared_ptr player) +{ + playerIo->save(player); +} + +// 4J Stu - TU-1 hotifx +// Add this function to take some of the code from the PlayerList::add function with the fixes +// for checking spawn area, especially in the nether. These needed to be done in a different order from before +// Fix for #13150 - When a player loads/joins a game after saving/leaving in the nether, sometimes they are spawned on top of the nether and cannot mine down +void PlayerList::validatePlayerSpawnPosition(shared_ptr player) +{ + // 4J Stu - Some adjustments to make sure the current players position is correct + // Make sure that the player is on the ground, and in the centre x/z of the current column + 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; + + double targetY = floor(player->y); + + double targetZ = 0; + if(player->z < 0) targetZ = Mth::ceil(player->z) - 0.5; + else targetZ = Mth::floor(player->z) + 0.5; + + player->setPos(targetX, targetY, targetZ); + + 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) + { + 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 + // Finding a valid, safe spawn point is potentially computationally expensive (may have to hunt through a large part + // of the nether) so move the player to their spawn position in the overworld so that they do not lose their inventory + // 4J Stu - We also use this mechanism to force a spawn point in the overworld for players who were in the save when the reset nether option was applied + if(level->dimension->id == -1 && player->y > 125) + { + app.DebugPrintf("Player in the nether tried to spawn at y = %f, moving to overworld\n", player->y); + player->setLevel(server->getLevel(0)); + player->gameMode->setLevel(server->getLevel(0)); + player->dimension = 0; + + level = server->getLevel(player->dimension); + + Pos *levelSpawn = level->getSharedSpawnPos(); + player->setPos(levelSpawn->x, levelSpawn->y, levelSpawn->z); + delete levelSpawn; + + Pos *bedPosition = player->getRespawnPosition(); + if (bedPosition != NULL) + { + 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, spawnForced); + } + delete bedPosition; + } + while (level->getCubes(player, player->bb)->size() != 0) + { + player->setPos(player->x, player->y + 1, player->z); + } + + app.DebugPrintf("Updated pos is %f, %f, %f in dimension %d\n", player->x, player->y, player->z, player->dimension); + } +} + +void PlayerList::add(shared_ptr player) +{ + //broadcastAll(shared_ptr( new PlayerInfoPacket(player->name, true, 1000) ) ); + if( player->connection->getNetworkPlayer() ) + { + broadcastAll(shared_ptr( new PlayerInfoPacket( player ) ) ); + } + + players.push_back(player); + + // 4J Added + addPlayerToReceiving(player); + + // Ensure the area the player is spawning in is loaded! + ServerLevel *level = server->getLevel(player->dimension); + + // 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 + // Some code from here has been moved to the above validatePlayerSpawnPosition function + + // 4J Stu - Swapped these lines about so that we get the chunk visiblity packet way ahead of all the add tracked entity packets + // Fix for #9169 - ART : Sign text is replaced with the words Awaiting approval. + changeDimension(player, NULL); + level->addEntity(player); + + for (int i = 0; i < players.size(); i++) + { + shared_ptr op = players.at(i); + //player->connection->send(shared_ptr( new PlayerInfoPacket(op->name, true, op->latency) ) ); + if( op->connection->getNetworkPlayer() ) + { + player->connection->send(shared_ptr( new PlayerInfoPacket( op ) ) ); + } + } + + if(level->isAtLeastOnePlayerSleeping()) + { + shared_ptr firstSleepingPlayer = nullptr; + for (unsigned int i = 0; i < players.size(); i++) + { + shared_ptr thisPlayer = players[i]; + if(thisPlayer->isSleeping()) + { + if(firstSleepingPlayer == NULL) firstSleepingPlayer = thisPlayer; + thisPlayer->connection->send(shared_ptr( new ChatPacket(thisPlayer->name, ChatPacket::e_ChatBedMeSleep))); + } + } + player->connection->send(shared_ptr( new ChatPacket(firstSleepingPlayer->name, ChatPacket::e_ChatBedPlayerSleep))); + } +} + +void PlayerList::move(shared_ptr player) +{ + player->getLevel()->getChunkMap()->move(player); +} + +void PlayerList::remove(shared_ptr player) +{ + save(player); + //4J Stu - We don't want to save the map data for guests, so when we are sure that the player is gone delete the map + if(player->isGuest()) playerIo->deleteMapFilesForPlayer(player); + ServerLevel *level = player->getLevel(); + 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() ) + { + players.erase(it); + } + //broadcastAll(shared_ptr( new PlayerInfoPacket(player->name, false, 9999) ) ); + + removePlayerFromReceiving(player); + player->connection = nullptr; // Must remove reference to connection, or else there is a circular dependency + delete player->gameMode; // Gamemode also needs deleted as it references back to this player + player->gameMode = NULL; + + // 4J Stu - Save all the players currently in the game, which will also free up unused map id slots if required, and remove old players + saveAll(NULL,false); +} + +shared_ptr PlayerList::getPlayerForLogin(PendingConnection *pendingConnection, const wstring& userName, PlayerUID xuid, PlayerUID onlineXuid) +{ + if (players.size() >= maxPlayers) + { + pendingConnection->disconnect(DisconnectPacket::eDisconnect_ServerFull); + return shared_ptr(); + } + + shared_ptr player = shared_ptr(new ServerPlayer(server, server->getLevel(0), userName, new ServerPlayerGameMode(server->getLevel(0)) )); + player->gameMode->player = player; // 4J added as had to remove this assignment from ServerPlayer ctor + player->setXuid( xuid ); // 4J Added + player->setOnlineXuid( onlineXuid ); // 4J Added + + // Work out the base server player settings + INetworkPlayer *networkPlayer = pendingConnection->connection->getSocket()->getPlayer(); + if(networkPlayer != NULL && !networkPlayer->IsHost()) + { + player->enableAllPlayerPrivileges( app.GetGameHostOption(eGameHostOption_TrustPlayers)>0 ); + } + + // 4J Added + LevelRuleset *serverRuleDefs = app.getGameRuleDefinitions(); + if(serverRuleDefs != NULL) + { + player->gameMode->setGameRules( GameRuleDefinition::generateNewGameRulesInstance(GameRulesInstance::eGameRulesInstanceType_ServerPlayer, serverRuleDefs, pendingConnection->connection) ); + } + + return player; +} + +shared_ptr PlayerList::respawn(shared_ptr serverPlayer, int targetDimension, bool keepAllPlayerData) +{ + // How we handle the entity tracker depends on whether we are the primary player currently, and whether there will be any player in the same system in the same dimension once we finish respawning. + bool isPrimary = canReceiveAllPackets(serverPlayer); // Is this the primary player in its current dimension? + int oldDimension = serverPlayer->dimension; + bool isEmptying = ( targetDimension != oldDimension); // We're not emptying this dimension on this machine if this player is going back into the same dimension + + // Also consider if there is another player on this machine which is in the same dimension and can take over as primary player + if( isEmptying ) + { + INetworkPlayer *thisPlayer = serverPlayer->connection->getNetworkPlayer(); + + for( unsigned int i = 0; i < players.size(); i++ ) + { + shared_ptr ep = players[i]; + if( ep == serverPlayer ) continue; + if( ep->dimension != oldDimension ) continue; + + INetworkPlayer * otherPlayer = ep->connection->getNetworkPlayer(); + if( otherPlayer != NULL && thisPlayer->IsSameSystem(otherPlayer) ) + { + // There's another player here in the same dimension - we're not the last one out + isEmptying = false; + } + } + } + + // Now we know where we stand, the actions to take are as follows: + // (1) if this isn't the primary player, then we just need to remove it from the entity tracker + // (2) if this Is the primary player then: + // (a) if isEmptying is true, then remove the player from the tracker, and send "remove entity" packets for anything seen (this is the original behaviour of the code) + // (b) if isEmptying is false, then we'll be transferring control of entity tracking to another player + + if( isPrimary ) + { + if( isEmptying ) + { + app.DebugPrintf("Emptying this dimension\n"); + serverPlayer->getLevel()->getTracker()->clear(serverPlayer); + } + else + { + app.DebugPrintf("Transferring... storing flags\n"); + serverPlayer->getLevel()->getTracker()->removeEntity(serverPlayer); + } + } + else + { + app.DebugPrintf("Not primary player\n"); + serverPlayer->getLevel()->getTracker()->removeEntity(serverPlayer); + } + + serverPlayer->getLevel()->getChunkMap()->remove(serverPlayer); + AUTO_VAR(it, find(players.begin(),players.end(),serverPlayer)); + if( it != players.end() ) + { + players.erase(it); + } + server->getLevel(serverPlayer->dimension)->removeEntityImmediately(serverPlayer); + + Pos *bedPosition = serverPlayer->getRespawnPosition(); + bool spawnForced = serverPlayer->isRespawnForced(); + + removePlayerFromReceiving(serverPlayer); + 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->getName(), new ServerPlayerGameMode(server->getLevel(serverPlayer->dimension)))); + player->connection = serverPlayer->connection; + player->restoreFrom(serverPlayer, keepAllPlayerData); + if (keepAllPlayerData) + { + // 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; + } + player->gameMode->player = player; // 4J added as had to remove this assignment from ServerPlayer ctor + player->setXuid( playerXuid ); // 4J Added + 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->setPlayerDefaultSkin( skin ); + player->setIsGuest( serverPlayer->isGuest() ); + player->setPlayerIndex( playerIndex ); + player->setCustomSkin( serverPlayer->getCustomSkin() ); + player->setCustomCape( serverPlayer->getCustomCape() ); + player->setPlayerGamePrivilege(Player::ePlayerGamePrivilege_All, serverPlayer->getAllPlayerGamePrivileges()); + player->gameMode->setGameRules( serverPlayer->gameMode->getGameRules() ); + player->dimension = targetDimension; + + // 4J Stu - Added this as we need to know earlier if the player is the player for this connection so that + // we can work out if they are the primary for the system and can receive all packets + player->connection->setPlayer( player ); + + addPlayerToReceiving(player); + + ServerLevel *level = server->getLevel(serverPlayer->dimension); + + // reset the player's game mode (first pick from old, then copy level if + // necessary) + updatePlayerGameMode(player, serverPlayer, level); + + if(serverPlayer->wonGame && targetDimension == oldDimension && serverPlayer->getHealth() > 0) + { + // If the player is still alive and respawning to the same dimension, they are just being added back from someone else viewing the Win screen + player->moveTo(serverPlayer->x, serverPlayer->y, serverPlayer->z, serverPlayer->yRot, serverPlayer->xRot); + if(bedPosition != NULL) + { + 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) + { + 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, spawnForced); + } + else + { + 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); + + while (!level->getCubes(player, player->bb)->empty()) + { + 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->connection->send( shared_ptr( new SetExperiencePacket(player->experienceProgress, player->totalExperience, player->experienceLevel)) ); + + if(keepAllPlayerData) + { + vector *activeEffects = player->getActiveEffects(); + for(AUTO_VAR(it, activeEffects->begin()); it != activeEffects->end(); ++it) + { + MobEffectInstance *effect = *it; + + player->connection->send(shared_ptr( new UpdateMobEffectPacket(player->entityId, effect) ) ); + } + delete activeEffects; + player->getEntityData()->markDirty(Mob::DATA_EFFECT_COLOR_ID); + } + + sendLevelInfo(player, level); + + level->getChunkMap()->add(player); + level->addEntity(player); + players.push_back(player); + + 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. + if( Minecraft::GetInstance()->isTutorial() + && (!Minecraft::GetInstance()->gameMode->getTutorial()->isStateCompleted(e_Tutorial_State_Food_Bar)) ) + { + app.getGameRuleDefinitions()->postProcessPlayer(player); + } + + if( oldDimension == 1 && player->dimension != 1 ) + { + player->displayClientMessage(IDS_PLAYER_LEFT_END); + } + + return player; + +} + +void PlayerList::toggleDimension(shared_ptr player, int targetDimension) +{ + int lastDimension = player->dimension; + // How we handle the entity tracker depends on whether we are the primary player currently, and whether there will be any player in the same system in the same dimension once we finish respawning. + bool isPrimary = canReceiveAllPackets(player); // Is this the primary player in its current dimension? + bool isEmptying = true; + + // Also consider if there is another player on this machine which is in the same dimension and can take over as primary player + INetworkPlayer *thisPlayer = player->connection->getNetworkPlayer(); + + for( unsigned int i = 0; i < players.size(); i++ ) + { + shared_ptr ep = players[i]; + if( ep == player ) continue; + if( ep->dimension != lastDimension ) continue; + + INetworkPlayer * otherPlayer = ep->connection->getNetworkPlayer(); + if( otherPlayer != NULL && thisPlayer->IsSameSystem(otherPlayer) ) + { + // There's another player here in the same dimension - we're not the last one out + isEmptying = false; + } + } + + + // Now we know where we stand, the actions to take are as follows: + // (1) if this isn't the primary player, then we just need to remove it from the entity tracker + // (2) if this Is the primary player then: + // (a) if isEmptying is true, then remove the player from the tracker, and send "remove entity" packets for anything seen (this is the original behaviour of the code) + // (b) if isEmptying is false, then we'll be transferring control of entity tracking to another player + + if( isPrimary ) + { + if( isEmptying ) + { + app.DebugPrintf("Toggle... Emptying this dimension\n"); + player->getLevel()->getTracker()->clear(player); + } + else + { + app.DebugPrintf("Toggle... transferring\n"); + player->getLevel()->getTracker()->removeEntity(player); + } + } + else + { + app.DebugPrintf("Toggle... Not primary player\n"); + player->getLevel()->getTracker()->removeEntity(player); + } + + 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); + + if(player->dimension != 1 && targetDimension == 1) + { + player->displayClientMessage(IDS_PLAYER_ENTERED_END); + } + else if( player->dimension == 1 ) + { + player->displayClientMessage(IDS_PLAYER_LEFT_END); + } + + player->dimension = targetDimension; + + 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 + + // 4J Stu Added so that we remove entities from the correct level, after the respawn packet we will be in the wrong level + player->flushEntitiesToRemove(); + + player->connection->send( 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()) ) ); + + oldLevel->removeEntityImmediately(player); + player->removed = false; + + repositionAcrossDimension(player, lastDimension, oldLevel, newLevel); + changeDimension(player, oldLevel); + + player->gameMode->setLevel(newLevel); + + // Resend the teleport if we haven't yet sent the chunk they will land on + if( !g_NetworkManager.SystemFlagGet(player->connection->getNetworkPlayer(),ServerPlayer::getFlagIndexForChunk( ChunkPos(player->xChunk,player->zChunk), player->level->dimension->id ) ) ) + { + player->connection->teleport(player->x, player->y, player->z, player->yRot, player->xRot, false); + // Force sending of the current chunk + player->doTick(true, true, true); + } + + player->connection->teleport(player->x, player->y, player->z, player->yRot, player->xRot); + + // 4J Stu - Fix for #64683 - Customer Encountered: TU7: Content: Gameplay: Potion effects are removed after using the Nether Portal + vector *activeEffects = player->getActiveEffects(); + for(AUTO_VAR(it, activeEffects->begin()); it != activeEffects->end(); ++it) + { + MobEffectInstance *effect = *it; + + player->connection->send(shared_ptr( new UpdateMobEffectPacket(player->entityId, effect) ) ); + } + delete activeEffects; + player->getEntityData()->markDirty(Mob::DATA_EFFECT_COLOR_ID); + + sendLevelInfo(player, newLevel); + sendAllPlayerInfo(player); +} + +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) + { + sendAllPlayerInfoIn = 0; + } + + if (sendAllPlayerInfoIn < players.size()) + { + shared_ptr op = players[sendAllPlayerInfoIn]; + //broadcastAll(shared_ptr( new PlayerInfoPacket(op->name, true, op->latency) ) ); + if( op->connection->getNetworkPlayer() ) + { + broadcastAll(shared_ptr( new PlayerInfoPacket( op ) ) ); + } + } + + EnterCriticalSection(&m_closePlayersCS); + while(!m_smallIdsToClose.empty()) + { + BYTE smallId = m_smallIdsToClose.front(); + m_smallIdsToClose.pop_front(); + + shared_ptr player = nullptr; + + for(unsigned int i = 0; i < players.size(); i++) + { + shared_ptr p = players.at(i); + // 4J Stu - May be being a bit overprotective with all the NULL checks, but adding late in TU7 so want to be safe + if (p != NULL && p->connection != NULL && p->connection->connection != NULL && p->connection->connection->getSocket() != NULL && p->connection->connection->getSocket()->getSmallId() == smallId ) + { + player = p; + break; + } + } + + if (player != NULL) + { + player->connection->disconnect( DisconnectPacket::eDisconnect_Closed ); + } + } + LeaveCriticalSection(&m_closePlayersCS); + + EnterCriticalSection(&m_kickPlayersCS); + while(!m_smallIdsToKick.empty()) + { + BYTE smallId = m_smallIdsToKick.front(); + m_smallIdsToKick.pop_front(); + INetworkPlayer *selectedPlayer = g_NetworkManager.GetPlayerBySmallId(smallId); + if( selectedPlayer != NULL ) + { + if( selectedPlayer->IsLocal() != TRUE ) + { + //#ifdef _XBOX + PlayerUID xuid = selectedPlayer->GetUID(); + // Kick this player from the game + shared_ptr player = nullptr; + + for(unsigned int i = 0; i < players.size(); i++) + { + shared_ptr p = players.at(i); + PlayerUID playersXuid = p->getOnlineXuid(); + if (p != NULL && ProfileManager.AreXUIDSEqual(playersXuid, xuid ) ) + { + player = p; + break; + } + } + + if (player != NULL) + { + m_bannedXuids.push_back( player->getOnlineXuid() ); + // 4J Stu - If we have kicked a player, make sure that they have no privileges if they later try to join the world when trust players is off + player->enableAllPlayerPrivileges( false ); + player->connection->setWasKicked(); + player->connection->send( shared_ptr( new DisconnectPacket(DisconnectPacket::eDisconnect_Kicked) )); + } + //#endif + } + } + } + LeaveCriticalSection(&m_kickPlayersCS); + + // Check our receiving players, and if they are dead see if we can replace them + for(unsigned int dim = 0; dim < 2; ++dim) + { + for(unsigned int i = 0; i < receiveAllPlayers[dim].size(); ++i) + { + shared_ptr currentPlayer = receiveAllPlayers[dim][i]; + if(currentPlayer->removed) + { + shared_ptr newPlayer = findAlivePlayerOnSystem(currentPlayer); + if(newPlayer != NULL) + { + receiveAllPlayers[dim][i] = newPlayer; + app.DebugPrintf("Replacing primary player %ls with %ls in dimension %d\n", currentPlayer->name.c_str(), newPlayer->name.c_str(), dim); + } + } + } + } +} + +bool PlayerList::isTrackingTile(int x, int y, int z, int dimension) +{ + return server->getLevel(dimension)->getChunkMap()->isTrackingTile(x, y, z); +} + +// 4J added - make sure that any tile updates for the chunk at this location get prioritised for sending +void PlayerList::prioritiseTileChanges(int x, int y, int z, int dimension) +{ + server->getLevel(dimension)->getChunkMap()->prioritiseTileChanges(x, y, z); +} + +void PlayerList::broadcastAll(shared_ptr packet) +{ + for (unsigned int i = 0; i < players.size(); i++) + { + 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++) + { + 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++) + { + if (i > 0) msg += L", "; + msg += players[i]->name; + } + return msg; +} + +bool PlayerList::isWhiteListed(const wstring& name) +{ + return true; +} + +bool PlayerList::isOp(const wstring& name) +{ + return false; +} + +bool PlayerList::isOp(shared_ptr player) +{ + bool cheatsEnabled = app.GetGameHostOption(eGameHostOption_CheatsEnabled); +#ifdef _DEBUG_MENUS_ENABLED + cheatsEnabled = cheatsEnabled || app.GetUseDPadForDebug(); +#endif + INetworkPlayer *networkPlayer = player->connection->getNetworkPlayer(); + bool isOp = cheatsEnabled && (player->isModerator() || (networkPlayer != NULL && networkPlayer->IsHost())); + return isOp; +} + +shared_ptr PlayerList::getPlayer(const wstring& name) +{ + 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 + { + return p; + } + } + return nullptr; +} + +// 4J Added +shared_ptr PlayerList::getPlayer(PlayerUID uid) +{ + 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 + { + 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) + { + player->connection->send( shared_ptr( new ChatPacket(message) ) ); + } +} + +void PlayerList::broadcast(double x, double y, double z, double range, int dimension, shared_ptr packet) +{ + broadcast(nullptr, x, y, z, range, dimension, packet); +} + +void PlayerList::broadcast(shared_ptr except, double x, double y, double z, double range, int dimension, shared_ptr packet) +{ + // 4J - altered so that we don't send to the same machine more than once. Add the source player to the machines we have "sent" to as it doesn't need to go to that + // machine either + vector< shared_ptr > sentTo; + if( except != NULL ) + { + sentTo.push_back(dynamic_pointer_cast(except)); + } + + for (unsigned int i = 0; i < players.size(); i++) + { + 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; + if( sentTo.size() ) + { + INetworkPlayer *thisPlayer = p->connection->getNetworkPlayer(); + if( thisPlayer == NULL ) + { + dontSend = true; + } + else + { + for(unsigned int j = 0; j < sentTo.size(); j++ ) + { + shared_ptr player2 = sentTo[j]; + INetworkPlayer *otherPlayer = player2->connection->getNetworkPlayer(); + if( otherPlayer != NULL && thisPlayer->IsSameSystem(otherPlayer) ) + { + dontSend = true; + } + } + } + } + if( dontSend ) + { + continue; + } + + + 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); + + if(SoundPacket) + { + + app.DebugPrintf("---broadcast - eSoundType_[%d] ",SoundPacket->getSound()); + OutputDebugStringW(ConsoleSoundEngine::wchSoundNames[SoundPacket->getSound()]); + app.DebugPrintf("\n"); + } +#endif + p->connection->send(packet); + sentTo.push_back( p ); + } + } + +} + +void PlayerList::saveAll(ProgressListener *progressListener, bool bDeleteGuestMaps /*= false*/) +{ + if(progressListener != NULL) progressListener->progressStart(IDS_PROGRESS_SAVING_PLAYERS); + // 4J - playerIo can be NULL if we have have to exit a game really early on due to network failure + if(playerIo) + { + playerIo->saveAllCachedData(); + 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]); + + if(progressListener != NULL) progressListener->progressStagePercentage((i * 100)/ ((int)players.size())); + } + playerIo->clearOldPlayerFiles(); + playerIo->saveMapIdLookup(); + } +} + +void PlayerList::whiteList(const wstring& playerName) +{ +} + +void PlayerList::blackList(const wstring& playerName) +{ +} + +void PlayerList::reloadWhitelist() +{ +} + +void PlayerList::sendLevelInfo(shared_ptr player, ServerLevel *level) +{ + 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) ) ); + } + 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) ) ); + } + + // send the stronghold position if there is one + if((level->dimension->id==0) && level->getLevelData()->getHasStronghold()) + { + player->connection->send( shared_ptr( new XZPacket(XZPacket::STRONGHOLD,level->getLevelData()->getXStronghold(),level->getLevelData()->getZStronghold()) ) ); + } +} + +void PlayerList::sendAllPlayerInfo(shared_ptr player) +{ + player->refreshContainer(player->inventoryMenu); + player->resetSentInfo(); + player->connection->send( shared_ptr( new SetCarriedItemPacket(player->inventory->selected)) ); +} + +int PlayerList::getPlayerCount() +{ + return (int)players.size(); +} + +int PlayerList::getPlayerCount(ServerLevel *level) +{ + int count = 0; + + for(AUTO_VAR(it, players.begin()); it != players.end(); ++it) + { + if( (*it)->level == level ) ++count; + } + + return count; +} + +int PlayerList::getMaxPlayers() +{ + return maxPlayers; +} + +MinecraftServer *PlayerList::getServer() +{ + return server; +} + +int PlayerList::getViewDistance() +{ + return viewDistance; +} + +void PlayerList::setOverrideGameMode(GameType *gameMode) +{ + overrideGameMode = gameMode; +} + +void PlayerList::updatePlayerGameMode(shared_ptr newPlayer, shared_ptr oldPlayer, Level *level) +{ + + // reset the player's game mode (first pick from old, then copy level if + // necessary) + if (oldPlayer != NULL) + { + newPlayer->gameMode->setGameModeForPlayer(oldPlayer->gameMode->getGameModeForPlayer()); + } + else if (overrideGameMode != NULL) + { + newPlayer->gameMode->setGameModeForPlayer(overrideGameMode); + } + newPlayer->gameMode->updateGameMode(level->getLevelData()->getGameType()); +} + +void PlayerList::setAllowCheatsForAllPlayers(bool allowCommands) +{ + this->allowCheatsForAllPlayers = allowCommands; +} + +shared_ptr PlayerList::findAlivePlayerOnSystem(shared_ptr player) +{ + int dimIndex, playerDim; + dimIndex = playerDim = player->dimension; + if( dimIndex == -1 ) dimIndex = 1; + else if( dimIndex == 1) dimIndex = 2; + + INetworkPlayer *thisPlayer = player->connection->getNetworkPlayer(); + if( thisPlayer != NULL ) + { + for(AUTO_VAR(itP, players.begin()); itP != players.end(); ++itP) + { + shared_ptr newPlayer = *itP; + + INetworkPlayer *otherPlayer = newPlayer->connection->getNetworkPlayer(); + + if( !newPlayer->removed && + newPlayer != player && + newPlayer->dimension == playerDim && + otherPlayer != NULL && + otherPlayer->IsSameSystem( thisPlayer ) + ) + { + return newPlayer; + } + } + } + + return nullptr; +} + +void PlayerList::removePlayerFromReceiving(shared_ptr player, bool usePlayerDimension /*= true*/, int dimension /*= 0*/) +{ + int dimIndex, playerDim; + dimIndex = playerDim = usePlayerDimension ? player->dimension : dimension; + if( dimIndex == -1 ) dimIndex = 1; + else if( dimIndex == 1) dimIndex = 2; + +#ifndef _CONTENT_PACKAGE + app.DebugPrintf("Requesting remove player %ls as primary in dimension %d\n", player->name.c_str(), dimIndex); +#endif + bool playerRemoved = false; + + AUTO_VAR(it, find( receiveAllPlayers[dimIndex].begin(), receiveAllPlayers[dimIndex].end(), player)); + if( it != receiveAllPlayers[dimIndex].end() ) + { +#ifndef _CONTENT_PACKAGE + app.DebugPrintf("Remove: Removing player %ls as primary in dimension %d\n", player->name.c_str(), dimIndex); +#endif + receiveAllPlayers[dimIndex].erase(it); + playerRemoved = true; + } + + INetworkPlayer *thisPlayer = player->connection->getNetworkPlayer(); + if( thisPlayer != NULL && playerRemoved ) + { + for(AUTO_VAR(itP, players.begin()); itP != players.end(); ++itP) + { + shared_ptr newPlayer = *itP; + + INetworkPlayer *otherPlayer = newPlayer->connection->getNetworkPlayer(); + + if( newPlayer != player && + newPlayer->dimension == playerDim && + otherPlayer != NULL && + otherPlayer->IsSameSystem( thisPlayer ) + ) + { +#ifndef _CONTENT_PACKAGE + app.DebugPrintf("Remove: Adding player %ls as primary in dimension %d\n", newPlayer->name.c_str(), dimIndex); +#endif + receiveAllPlayers[dimIndex].push_back( newPlayer ); + break; + } + } + } + else if( thisPlayer == NULL ) + { +#ifndef _CONTENT_PACKAGE + app.DebugPrintf("Remove: Qnet player for %ls was NULL so re-checking all players\n", player->name.c_str() ); +#endif + // 4J Stu - Something went wrong, or possibly the QNet player left before we got here. + // Re-check all active players and make sure they have someone on their system to receive all packets + for(AUTO_VAR(itP, players.begin()); itP != players.end(); ++itP) + { + shared_ptr newPlayer = *itP; + INetworkPlayer *checkingPlayer = newPlayer->connection->getNetworkPlayer(); + + if( checkingPlayer != NULL ) + { + int newPlayerDim = 0; + if( newPlayer->dimension == -1 ) newPlayerDim = 1; + else if( newPlayer->dimension == 1) newPlayerDim = 2; + bool foundPrimary = false; + for(AUTO_VAR(it, receiveAllPlayers[newPlayerDim].begin()); it != receiveAllPlayers[newPlayerDim].end(); ++it) + { + shared_ptr primaryPlayer = *it; + INetworkPlayer *primPlayer = primaryPlayer->connection->getNetworkPlayer(); + if(primPlayer != NULL && checkingPlayer->IsSameSystem( primPlayer ) ) + { + foundPrimary = true; + break; + } + } + if(!foundPrimary) + { +#ifndef _CONTENT_PACKAGE + app.DebugPrintf("Remove: Adding player %ls as primary in dimension %d\n", newPlayer->name.c_str(), newPlayerDim); +#endif + receiveAllPlayers[newPlayerDim].push_back( newPlayer ); + } + } + } + } +} + +void PlayerList::addPlayerToReceiving(shared_ptr player) +{ + int playerDim = 0; + if( player->dimension == -1 ) playerDim = 1; + else if( player->dimension == 1) playerDim = 2; + +#ifndef _CONTENT_PACKAGE + app.DebugPrintf("Requesting add player %ls as primary in dimension %d\n", player->name.c_str(), playerDim); +#endif + + bool shouldAddPlayer = true; + + INetworkPlayer *thisPlayer = player->connection->getNetworkPlayer(); + + if( thisPlayer == NULL ) + { +#ifndef _CONTENT_PACKAGE + app.DebugPrintf("Add: Qnet player for player %ls is NULL so not adding them\n", player->name.c_str() ); +#endif + shouldAddPlayer = false; + } + else + { + for(AUTO_VAR(it, receiveAllPlayers[playerDim].begin()); it != receiveAllPlayers[playerDim].end(); ++it) + { + shared_ptr oldPlayer = *it; + INetworkPlayer *checkingPlayer = oldPlayer->connection->getNetworkPlayer(); + if(checkingPlayer != NULL && checkingPlayer->IsSameSystem( thisPlayer ) ) + { + shouldAddPlayer = false; + break; + } + } + } + + if( shouldAddPlayer ) + { +#ifndef _CONTENT_PACKAGE + app.DebugPrintf("Add: Adding player %ls as primary in dimension %d\n", player->name.c_str(), playerDim); +#endif + receiveAllPlayers[playerDim].push_back( player ); + } +} + +bool PlayerList::canReceiveAllPackets(shared_ptr player) +{ + int playerDim = 0; + if( player->dimension == -1 ) playerDim = 1; + else if( player->dimension == 1) playerDim = 2; + for(AUTO_VAR(it, receiveAllPlayers[playerDim].begin()); it != receiveAllPlayers[playerDim].end(); ++it) + { + shared_ptr newPlayer = *it; + if(newPlayer == player) + { + return true; + } + } + return false; +} + +void PlayerList::kickPlayerByShortId(BYTE networkSmallId) +{ + EnterCriticalSection(&m_kickPlayersCS); + m_smallIdsToKick.push_back(networkSmallId); + LeaveCriticalSection(&m_kickPlayersCS); +} + +void PlayerList::closePlayerConnectionBySmallId(BYTE networkSmallId) +{ + EnterCriticalSection(&m_closePlayersCS); + m_smallIdsToClose.push_back(networkSmallId); + LeaveCriticalSection(&m_closePlayersCS); +} + +bool PlayerList::isXuidBanned(PlayerUID xuid) +{ + if( xuid == INVALID_XUID ) return false; + + bool banned = false; + + for( AUTO_VAR(it, m_bannedXuids.begin()); it != m_bannedXuids.end(); ++it ) + { + if( ProfileManager.AreXUIDSEqual( xuid, *it ) ) + { + banned = true; + break; + } + } + + return banned; +} + +// AP added for Vita so the range can be increased once the level starts +void PlayerList::setViewDistance(int newViewDistance) +{ + viewDistance = newViewDistance; +} diff --git a/Minecraft.Client/PlayerList.h b/Minecraft.Client/PlayerList.h new file mode 100644 index 00000000..6a6ee94c --- /dev/null +++ b/Minecraft.Client/PlayerList.h @@ -0,0 +1,139 @@ +#pragma once +#include +#include "..\Minecraft.World\ArrayWithLength.h" + +class ServerPlayer; +class PlayerChunkMap; +class MinecraftServer; +class PlayerIO; +class PendingConnection; +class Packet; +class ServerLevel; +class TileEntity; +class ProgressListener; +class GameType; +class LoginPacket; +class ServerScoreboard; + +using namespace std; + +class PlayerList +{ +private: + static const int SEND_PLAYER_INFO_INTERVAL = 20 * 10; // 4J - brought forward from 1.2.3 +// public static Logger logger = Logger.getLogger("Minecraft"); +public: + vector > players; + +private: + MinecraftServer *server; + unsigned int maxPlayers; + + // 4J Added + vector m_bannedXuids; + deque m_smallIdsToKick; + CRITICAL_SECTION m_kickPlayersCS; + deque m_smallIdsToClose; + CRITICAL_SECTION m_closePlayersCS; +/* 4J - removed + Set bans = new HashSet(); + Set ipBans = new HashSet(); + Set ops = new HashSet(); + Set whitelist = new HashSet(); + File banFile, ipBanFile, opFile, whiteListFile; + */ + PlayerIO *playerIo; + bool doWhiteList; + + GameType *overrideGameMode; + bool allowCheatsForAllPlayers; + int viewDistance; + + int sendAllPlayerInfoIn; + + // 4J Added to maintain which players in which dimensions can receive all packet types + vector > receiveAllPlayers[3]; +private: + shared_ptr findAlivePlayerOnSystem(shared_ptr currentPlayer); + +public: + void removePlayerFromReceiving(shared_ptr player, bool usePlayerDimension = true, int dimension = 0); + void addPlayerToReceiving(shared_ptr player); + bool canReceiveAllPackets(shared_ptr player); + +public: + PlayerList(MinecraftServer *server); + ~PlayerList(); + void placeNewPlayer(Connection *connection, 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(); + CompoundTag *load(shared_ptr player); +protected: + void save(shared_ptr player); +public: + void validatePlayerSpawnPosition(shared_ptr player); // 4J Added + void add(shared_ptr player); + void move(shared_ptr player); + void remove(shared_ptr player); + shared_ptr getPlayerForLogin(PendingConnection *pendingConnection, const wstring& userName, PlayerUID xuid, PlayerUID OnlineXuid); + shared_ptr respawn(shared_ptr serverPlayer, int targetDimension, bool keepAllPlayerData); + void toggleDimension(shared_ptr player, int targetDimension); + void 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 + void broadcastAll(shared_ptr packet); + void broadcastAll(shared_ptr packet, int dimension); + + wstring getPlayerNames(); + +public: + bool isWhiteListed(const wstring& name); + bool isOp(const wstring& name); + bool isOp(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); + // 4J Added ProgressListener *progressListener param and bDeleteGuestMaps param + void saveAll(ProgressListener *progressListener, bool bDeleteGuestMaps = false); + void whiteList(const wstring& playerName); + void blackList(const wstring& playerName); +// Set getWhiteList(); / 4J removed + void reloadWhitelist(); + void sendLevelInfo(shared_ptr player, ServerLevel *level); + void sendAllPlayerInfo(shared_ptr player); + int getPlayerCount(); + int getPlayerCount(ServerLevel *level); // 4J Added + int getMaxPlayers(); + MinecraftServer *getServer(); + int getViewDistance(); + void setOverrideGameMode(GameType *gameMode); + +private: + void updatePlayerGameMode(shared_ptr newPlayer, shared_ptr oldPlayer, Level *level); + +public: + void setAllowCheatsForAllPlayers(bool allowCommands); + + // 4J Added + void kickPlayerByShortId(BYTE networkSmallId); + void closePlayerConnectionBySmallId(BYTE networkSmallId); + bool isXuidBanned(PlayerUID xuid); + // AP added for Vita so the range can be increased once the level starts + void setViewDistance(int newViewDistance); +}; diff --git a/Minecraft.Client/PlayerRenderer.cpp b/Minecraft.Client/PlayerRenderer.cpp new file mode 100644 index 00000000..7d135c2b --- /dev/null +++ b/Minecraft.Client/PlayerRenderer.cpp @@ -0,0 +1,558 @@ +#include "stdafx.h" +#include "PlayerRenderer.h" +#include "SkullTileRenderer.h" +#include "HumanoidMobRenderer.h" +#include "HumanoidModel.h" +#include "ModelPart.h" +#include "LocalPlayer.h" +#include "MultiPlayerLocalPlayer.h" +#include "entityRenderDispatcher.h" +#include "..\Minecraft.World\net.minecraft.world.entity.h" +#include "..\Minecraft.World\net.minecraft.world.entity.player.h" +#include "..\Minecraft.World\net.minecraft.world.item.h" +#include "..\Minecraft.World\net.minecraft.world.level.tile.h" +#include "..\Minecraft.World\net.minecraft.h" +#include "..\Minecraft.World\StringHelpers.h" + +const unsigned int PlayerRenderer::s_nametagColors[MINECRAFT_NET_MAX_PLAYERS] = +{ + 0xff000000, // WHITE (represents the "white" player, but using black as the colour) + 0xff33cc33, // GREEN + 0xffcc3333, // RED + 0xff3333cc, // BLUE +#ifndef __PSVITA__ // only 4 player on Vita + 0xffcc33cc, // PINK + 0xffcc6633, // ORANGE + 0xffcccc33, // YELLOW + 0xff33dccc, // TURQUOISE +#endif +}; + +ResourceLocation PlayerRenderer::DEFAULT_LOCATION = ResourceLocation(TN_MOB_CHAR); + +PlayerRenderer::PlayerRenderer() : LivingEntityRenderer( new HumanoidModel(0), 0.5f ) +{ + humanoidModel = (HumanoidModel *) model; + + armorParts1 = new HumanoidModel(1.0f); + armorParts2 = new HumanoidModel(0.5f); +} + +unsigned int PlayerRenderer::getNametagColour(int index) +{ + if( index >= 0 && index < MINECRAFT_NET_MAX_PLAYERS) + { + return s_nametagColors[index]; + } + return 0xFF000000; +} + +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); + + // 4J-PB - need to disable rendering armour for some special skins (Daleks) + unsigned int uiAnimOverrideBitmask=player->getAnimOverrideBitmask(); + if(uiAnimOverrideBitmask&(1< itemInstance = player->inventory->getArmor(3 - layer); + if (itemInstance != NULL) + { + Item *item = itemInstance->getItem(); + if (dynamic_cast(item)) + { + ArmorItem *armorItem = dynamic_cast(item); + bindTexture(HumanoidMobRenderer::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); + if (armor != NULL) armor->attackTime = model->attackTime; + if (armor != NULL) armor->riding = model->riding; + if (armor != NULL) armor->young = model->young; + + float brightness = SharedConstants::TEXTURE_LIGHTING ? 1 : player->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 0xf; + + return 1; + } + } + return -1; + +} + +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); + shared_ptr itemInstance = player->inventory->getArmor(3 - layer); + if (itemInstance != NULL) + { + Item *item = itemInstance->getItem(); + if (dynamic_cast(item)) + { + ArmorItem *armorItem = dynamic_cast(item); + bindTexture(HumanoidMobRenderer::getArmorLocation((ArmorItem *)item, layer, true)); + + float brightness = SharedConstants::TEXTURE_LIGHTING ? 1 : player->getBrightness(a); + glColor3f(brightness, brightness, brightness); + } + } +} + +void PlayerRenderer::render(shared_ptr _mob, double x, double y, double z, float rot, float a) +{ + // 4J - dynamic cast required because we aren't using templates/generics in our version + shared_ptr mob = dynamic_pointer_cast(_mob); + + if(mob->hasInvisiblePrivilege()) return; + + shared_ptr item = mob->inventory->getSelected(); + armorParts1->holdingRightHand = armorParts2->holdingRightHand = humanoidModel->holdingRightHand = item != NULL ? 1 : 0; + if (item != NULL) + { + if (mob->getUseItemDuration() > 0) + { + UseAnim anim = item->getUseAnimation(); + if (anim == UseAnim_block) + { + armorParts1->holdingRightHand = armorParts2->holdingRightHand = humanoidModel->holdingRightHand = 3; + } + else if (anim == UseAnim_bow) + { + armorParts1->bowAndArrow = armorParts2->bowAndArrow = humanoidModel->bowAndArrow = true; + } + } + } + // 4J added, for 3rd person view of eating + if( item != NULL && mob->getUseItemDuration() > 0 && item->getUseAnimation() == UseAnim_eat ) + { + // These factors are largely lifted from ItemInHandRenderer to try and keep the 3rd person eating animation as similar as possible + float t = (mob->getUseItemDuration() - a + 1); + float swing = 1 - (t / item->getUseDuration()); + armorParts1->eating = armorParts2->eating = humanoidModel->eating = true; + armorParts1->eating_t = armorParts2->eating_t = humanoidModel->eating_t = t; + armorParts1->eating_swing = armorParts2->eating_swing = humanoidModel->eating_swing = swing; + } + else + { + armorParts1->eating = armorParts2->eating = humanoidModel->eating = false; + } + + armorParts1->sneaking = armorParts2->sneaking = humanoidModel->sneaking = mob->isSneaking(); + + double yp = y - mob->heightOffset; + if (mob->isSneaking() && !mob->instanceof(eTYPE_LOCALPLAYER)) + { + yp -= 2 / 16.0f; + } + + // Check if an idle animation is needed + if(mob->getAnimOverrideBitmask()&(1<isIdle()) + { + humanoidModel->idle=true; + armorParts1->idle=true; + armorParts2->idle=true; + } + else + { + humanoidModel->idle=false; + armorParts1->idle=false; + armorParts2->idle=false; + } + } + else + { + humanoidModel->idle=false; + armorParts1->idle=false; + armorParts2->idle=false; + } + + // 4J-PB - any additional parts to turn on for this player (skin dependent) + vector *pAdditionalModelParts=mob->GetAdditionalModelParts(); + //turn them on + if(pAdditionalModelParts!=NULL) + { + for(AUTO_VAR(it, pAdditionalModelParts->begin()); it != pAdditionalModelParts->end(); ++it) + { + ModelPart *pModelPart=*it; + + pModelPart->visible=true; + } + } + + LivingEntityRenderer::render(mob, x, yp, z, rot, a); + + // turn them off again + if(pAdditionalModelParts && pAdditionalModelParts->size()!=0) + { + for(AUTO_VAR(it, pAdditionalModelParts->begin()); it != pAdditionalModelParts->end(); ++it) + { + ModelPart *pModelPart=*it; + + pModelPart->visible=false; + } + } + armorParts1->bowAndArrow = armorParts2->bowAndArrow = humanoidModel->bowAndArrow = false; + armorParts1->sneaking = armorParts2->sneaking = humanoidModel->sneaking = false; + armorParts1->holdingRightHand = armorParts2->holdingRightHand = humanoidModel->holdingRightHand = 0; + +} + +void PlayerRenderer::additionalRendering(shared_ptr _mob, float a) +{ + float brightness = SharedConstants::TEXTURE_LIGHTING ? 1 : _mob->getBrightness(a); + glColor3f(brightness, brightness, brightness); + + 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); + + shared_ptr headGear = mob->inventory->getArmor(3); + if (headGear != NULL) + { + // don't render the pumpkin for the skins + unsigned int uiAnimOverrideBitmask = mob->getSkinAnimOverrideBitmask( mob->getCustomSkin()); + + if((uiAnimOverrideBitmask&(1<head->translateTo(1 / 16.0f); + + if(headGear->getItem()->id < 256) + { + if (TileRenderer::canRender(Tile::tiles[headGear->id]->getRenderShape())) + { + float s = 10 / 16.0f; + glTranslatef(-0 / 16.0f, -4 / 16.0f, 0 / 16.0f); + glRotatef(90, 0, 1, 0); + glScalef(s, -s, s); + } + + entityRenderDispatcher->itemInHandRenderer->renderItem(mob, headGear, 0); + } + else if (headGear->getItem()->id == Item::skull_Id) + { + float s = 17 / 16.0f; + glScalef(s, -s, -s); + + wstring extra = L""; + if (headGear->hasTag() && headGear->getTag()->contains(L"SkullOwner")) + { + extra = headGear->getTag()->getString(L"SkullOwner"); + } + SkullTileRenderer::instance->renderSkull(-0.5f, 0, -0.5f, Facing::UP, 180, headGear->getAuxValue(), extra); + } + + glPopMatrix(); + } + } + + // need to add a custom texture for deadmau5 + if (mob != NULL && app.isXuidDeadmau5( mob->getXuid() ) && bindTexture(mob->customTextureUrl, L"" )) + { + for (int i = 0; i < 2; i++) + { + float yr = (mob->yRotO + (mob->yRot - mob->yRotO) * a) - (mob->yBodyRotO + (mob->yBodyRot - mob->yBodyRotO) * a); + float xr = mob->xRotO + (mob->xRot - mob->xRotO) * a; + glPushMatrix(); + glRotatef(yr, 0, 1, 0); + glRotatef(xr, 1, 0, 0); + glTranslatef((6 / 16.0f) * (i * 2 - 1), 0, 0); + glTranslatef(0, -6 / 16.0f, 0); + glRotatef(-xr, 1, 0, 0); + glRotatef(-yr, 0, 1, 0); + + float s = 8 / 6.0f; + glScalef(s, s, s); + humanoidModel->renderEars(1 / 16.0f,true); + glPopMatrix(); + } + } + + // 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); + + double xd = (mob->xCloakO + (mob->xCloak - mob->xCloakO) * a) - (mob->xo + (mob->x - mob->xo) * a); + double yd = (mob->yCloakO + (mob->yCloak - mob->yCloakO) * a) - (mob->yo + (mob->y - mob->yo) * a); + double zd = (mob->zCloakO + (mob->zCloak - mob->zCloakO) * a) - (mob->zo + (mob->z - mob->zo) * a); + + float yr = mob->yBodyRotO + (mob->yBodyRot - mob->yBodyRotO) * a; + + double xa = Mth::sin(yr * PI / 180); + double za = -Mth::cos(yr * PI / 180); + + float flap = (float) yd * 10; + if (flap < -6) flap = -6; + if (flap > 32) flap = 32; + float lean = (float) (xd * xa + zd * za) * 100; + float lean2 = (float) (xd * za - zd * xa) * 100; + if (lean < 0) lean = 0; + + float pow = mob->oBob + (mob->bob - mob->oBob) * a; + + flap += sin((mob->walkDistO + (mob->walkDist - mob->walkDistO) * a) * 6) * 32 * pow; + if (mob->isSneaking()) + { + flap += 25; + } + + // 4J Stu - Fix for sprint-flying causing the cape to rotate up by 180 degrees or more + float xRot = 6.0f + lean / 2 + flap; + if(xRot > 64.0f) xRot = 64.0f; + + glRotatef(xRot, 1, 0, 0); + glRotatef(lean2 / 2, 0, 0, 1); + glRotatef(-lean2 / 2, 0, 1, 0); + glRotatef(180, 0, 1, 0); + humanoidModel->renderCloak(1 / 16.0f,true); + glPopMatrix(); + } + + shared_ptr item = mob->inventory->getSelected(); + + if (item != NULL) + { + glPushMatrix(); + humanoidModel->arm0->translateTo(1 / 16.0f); + glTranslatef(-1 / 16.0f, 7 / 16.0f, 1 / 16.0f); + + if (mob->fishing != NULL) + { + item = shared_ptr( new ItemInstance(Item::stick) ); + } + + UseAnim anim = UseAnim_none;//null; + if (mob->getUseItemDuration() > 0) + { + anim = item->getUseAnimation(); + } + + 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); + } + if (mob->getUseItemDuration() > 0) + { + if (anim == UseAnim_block) + { + glTranslatef(0.05f, 0, -0.1f); + glRotatef(-50, 0, 1, 0); + glRotatef(-10, 1, 0, 0); + glRotatef(-60, 0, 0, 1); + } + } + 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); + } + + if (item->getItem()->hasMultipleSpriteLayers()) + { + for (int layer = 0; layer <= 1; layer++) + { + int col = item->getItem()->getColor(item,layer); + 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, layer, false); + } + } + else + { + int col = item->getItem()->getColor(item, 0); + float red = ((col >> 16) & 0xff) / 255.0f; + float g = ((col >> 8) & 0xff) / 255.0f; + float b = ((col) & 0xff) / 255.0f; + + glColor4f(red, g, b, 1); + this->entityRenderDispatcher->itemInHandRenderer->renderItem(mob, item, 0); + } + + glPopMatrix(); + } +} + +void PlayerRenderer::renderNameTags(shared_ptr player, double x, double y, double z, wstring msg, float scale, double dist) +{ +#if 0 + if (dist < 10 * 10) + { + Scoreboard *scoreboard = player->getScoreboard(); + Objective *objective = scoreboard->getDisplayObjective(Scoreboard::DISPLAY_SLOT_BELOW_NAME); + + if (objective != NULL) + { + Score *score = scoreboard->getPlayerScore(player->getAName(), objective); + + if (player->isSleeping()) + { + renderNameTag(player, score->getScore() + " " + objective->getDisplayName(), x, y - 1.5f, z, 64); + } + else + { + renderNameTag(player, score->getScore() + " " + objective->getDisplayName(), x, y, z, 64); + } + + y += getFont()->lineHeight * 1.15f * scale; + } + } +#endif + + LivingEntityRenderer::renderNameTags(player, x, y, z, msg, scale, dist); +} + +void PlayerRenderer::scale(shared_ptr player, float a) +{ + float s = 15 / 16.0f; + glScalef(s, s, s); +} + +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, Minecraft::GetInstance()->player); + // 4J-PB - does this skin have its arm0 disabled? (Dalek, etc) + if((humanoidModel->m_uiAnimOverrideBitmask&(1<arm0->render(1 / 16.0f,true); + } +} + +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()) + { + LivingEntityRenderer::setupPosition(mob, x + mob->bedOffsetX, y + mob->bedOffsetY, z + mob->bedOffsetZ); + + } + else + { + if(mob->isRiding() && (mob->getAnimOverrideBitmask()&(1< _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); + + if (mob->isAlive() && mob->isSleeping()) + { + glRotatef(mob->getSleepRotation(), 0, 1, 0); + glRotatef(getFlipDegrees(mob), 0, 0, 1); + glRotatef(270, 0, 1, 0); + } + else + { + LivingEntityRenderer::setupRotations(mob, bob, bodyRot, a); + } +} + +// 4J Added override to stop rendering shadow if player is invisible +void PlayerRenderer::renderShadow(shared_ptr e, double x, double y, double z, float pow, float a) +{ + if(app.GetGameHostOption(eGameHostOption_HostCanBeInvisible) > 0) + { + shared_ptr player = dynamic_pointer_cast(e); + if(player != NULL && player->hasInvisiblePrivilege()) return; + } + 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 new file mode 100644 index 00000000..25c32a30 --- /dev/null +++ b/Minecraft.Client/PlayerRenderer.h @@ -0,0 +1,58 @@ +#pragma once +#include "MobRenderer.h" +#include "..\Minecraft.World\Player.h" + +class HumanoidModel; + +using namespace std; + +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]; + + HumanoidModel *humanoidModel; + HumanoidModel *armorParts1; + HumanoidModel *armorParts2; + +public: + PlayerRenderer(); + + static unsigned int getNametagColour(int index); + +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); + +public: + 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); + 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); + +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/Polygon.cpp b/Minecraft.Client/Polygon.cpp new file mode 100644 index 00000000..00176511 --- /dev/null +++ b/Minecraft.Client/Polygon.cpp @@ -0,0 +1,80 @@ +#include "stdafx.h" +#include "Polygon.h" + +// 4J added for common init code +void _Polygon::_init(VertexArray vertices) +{ + vertexCount = 0; + _flipNormal = false; + + this->vertices = vertices; + vertexCount = vertices.length; +} + +_Polygon::_Polygon(VertexArray vertices) +{ + _init(vertices); +} + +_Polygon::_Polygon(VertexArray vertices, int u0, int v0, int u1, int v1, float xTexSize, float yTexSize) +{ + _init(vertices); + + // 4J - added - don't assume that u1 > u0, v1 > v0 + float us = ( u1 > u0 ) ? ( 0.1f / xTexSize ) : ( -0.1f / xTexSize ); + float vs = ( v1 > v0 ) ? ( 0.1f / yTexSize ) : ( -0.1f / yTexSize ); + + vertices[0] = vertices[0]->remap(u1 / xTexSize - us, v0 / yTexSize + vs); + vertices[1] = vertices[1]->remap(u0 / xTexSize + us, v0 / yTexSize + vs); + vertices[2] = vertices[2]->remap(u0 / xTexSize + us, v1 / yTexSize - vs); + vertices[3] = vertices[3]->remap(u1 / xTexSize - us, v1 / yTexSize - vs); +} + +_Polygon::_Polygon(VertexArray vertices, float u0, float v0, float u1, float v1) +{ + _init(vertices); + + vertices[0] = vertices[0]->remap(u1, v0); + vertices[1] = vertices[1]->remap(u0, v0); + vertices[2] = vertices[2]->remap(u0, v1); + vertices[3] = vertices[3]->remap(u1, v1); +} + +void _Polygon::mirror() +{ + VertexArray newVertices = VertexArray(vertices.length); + for (unsigned int i = 0; i < vertices.length; i++) + newVertices[i] = vertices[vertices.length - i - 1]; + delete [] vertices.data; + vertices = newVertices; +} + +void _Polygon::render(Tesselator *t, float scale) +{ + Vec3 *v0 = vertices[1]->pos->vectorTo(vertices[0]->pos); + Vec3 *v1 = vertices[1]->pos->vectorTo(vertices[2]->pos); + Vec3 *n = v1->cross(v0)->normalize(); + + t->begin(); + if (_flipNormal) + { + t->normal(-(float)n->x, -(float)n->y, -(float)n->z); + } + else + { + t->normal((float)n->x, (float)n->y, (float)n->z); + } + + for (int i = 0; i < 4; i++) + { + Vertex *v = vertices[i]; + t->vertexUV((float)(v->pos->x * scale), (float)( v->pos->y * scale), (float)( v->pos->z * scale), (float)( v->u), (float)( v->v)); + } + t->end(); +} + +_Polygon *_Polygon::flipNormal() +{ + _flipNormal = true; + return this; +} \ No newline at end of file diff --git a/Minecraft.Client/Polygon.h b/Minecraft.Client/Polygon.h new file mode 100644 index 00000000..24cb2218 --- /dev/null +++ b/Minecraft.Client/Polygon.h @@ -0,0 +1,22 @@ +#pragma once +#include "Vertex.h" +#include "Tesselator.h" +#include "..\Minecraft.World\ArrayWithLength.h" + +class _Polygon +{ +public: + VertexArray vertices; + int vertexCount; +private: + bool _flipNormal; + +public: + void _init(VertexArray vertices); // 4J added for common init code + _Polygon(VertexArray vertices); + _Polygon(VertexArray vertices, int u0, int v0, int u1, int v1, float xTexSize, float yTexSize); + _Polygon(VertexArray vertices, float u0, float v0, float u1, float v1); + void mirror(); + void render(Tesselator *t, float scale); + _Polygon *flipNormal(); +}; diff --git a/Minecraft.Client/PreStitchedTextureMap.cpp b/Minecraft.Client/PreStitchedTextureMap.cpp new file mode 100644 index 00000000..68309b63 --- /dev/null +++ b/Minecraft.Client/PreStitchedTextureMap.cpp @@ -0,0 +1,993 @@ +#include "stdafx.h" +#include "..\Minecraft.World\net.minecraft.world.h" +#include "..\Minecraft.World\net.minecraft.world.level.tile.h" +#include "..\Minecraft.World\net.minecraft.world.item.h" +#include "..\Minecraft.World\ByteBuffer.h" +#include "Minecraft.h" +#include "LevelRenderer.h" +#include "EntityRenderDispatcher.h" +#include "Stitcher.h" +#include "StitchSlot.h" +#include "StitchedTexture.h" +#include "Texture.h" +#include "TextureHolder.h" +#include "TextureManager.h" +#include "TexturePack.h" +#include "TexturePackRepository.h" +#include "PreStitchedTextureMap.h" +#include "SimpleIcon.h" +#include "CompassTexture.h" +#include "ClockTexture.h" + +const wstring PreStitchedTextureMap::NAME_MISSING_TEXTURE = L"missingno"; + +PreStitchedTextureMap::PreStitchedTextureMap(int type, const wstring &name, const wstring &path, BufferedImage *missingTexture, bool mipmap) : iconType(type), name(name), path(path), extension(L".png") +{ + this->missingTexture = missingTexture; + + // 4J Initialisers + missingPosition = NULL; + stitchResult = NULL; + + m_mipMap = mipmap; + 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, animatedTextures.begin()); it != animatedTextures.end(); ++it) + { + StitchedTexture *animatedStitchedTexture = *it; + animatedStitchedTexture->freeFrameTextures(); + } + + loadUVs(); + + if (iconType == Icon::TYPE_TERRAIN) + { + //for (Tile tile : Tile.tiles) + for(unsigned int i = 0; i < Tile::TILE_NUM_COUNT; ++i) + { + if (Tile::tiles[i] != NULL) + { + Tile::tiles[i]->registerIcons(this); + } + } + + Minecraft::GetInstance()->levelRenderer->registerTextures(this); + EntityRenderDispatcher::instance->registerTerrainTextures(this); + } + + //for (Item item : Item.items) + for(unsigned int i = 0; i < Item::ITEM_NUM_COUNT; ++i) + { + Item *item = Item::items[i]; + if (item != NULL && item->getIconType() == iconType) + { + item->registerIcons(this); + } + } + + // Collection bucket for multiple frames per texture + unordered_map * > textures; // = new HashMap>(); + + Stitcher *stitcher = TextureManager::getInstance()->createStitcher(name); + + animatedTextures.clear(); + + // Create the final image + wstring filename = name + extension; + + TexturePack *texturePack = Minecraft::GetInstance()->skins->getSelected(); + //try { + int mode = Texture::TM_DYNAMIC; + int clamp = Texture::WM_WRAP; // 4J Stu - Don't clamp as it causes issues with how we signal non-mipmmapped textures to the pixel shader //Texture::WM_CLAMP; + int minFilter = Texture::TFLT_NEAREST; + int magFilter = Texture::TFLT_NEAREST; + + 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); + } + else + { + 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); + int height = image->getHeight(); + int width = image->getWidth(); + + if(stitchResult != NULL) + { + TextureManager::getInstance()->unregisterTexture(name, stitchResult); + delete stitchResult; + } + stitchResult = TextureManager::getInstance()->createTexture(name, Texture::TM_DYNAMIC, width, height, Texture::TFMT_RGBA, m_mipMap); + stitchResult->transferFromImage(image); + delete image; + TextureManager::getInstance()->registerName(name, stitchResult); + //stitchResult = stitcher->constructTexture(m_mipMap); + + for(AUTO_VAR(it, texturesByName.begin()); it != texturesByName.end(); ++it) + { + StitchedTexture *preStitched = (StitchedTexture *)it->second; + + int x = preStitched->getU0() * stitchResult->getWidth(); + int y = preStitched->getV0() * stitchResult->getHeight(); + int width = (preStitched->getU1() * stitchResult->getWidth()) - x; + int height = (preStitched->getV1() * stitchResult->getHeight()) - y; + + preStitched->init(stitchResult, NULL, x, y, width, height, false); + } + + MemSect(52); + for(AUTO_VAR(it, texturesByName.begin()); it != texturesByName.end(); ++it) + { + StitchedTexture *preStitched = (StitchedTexture *)(it->second); + + makeTextureAnimated(texturePack, preStitched); + } + MemSect(0); + //missingPosition = (StitchedTexture *)texturesByName.find(NAME_MISSING_TEXTURE)->second; + + stitchResult->writeAsPNG(L"debug.stitched_" + name + L".png"); + stitchResult->updateOnGPU(); + + +#ifdef __PSVITA__ + // AP - alpha cut out is expensive on vita so we mark which icons actually require it + DWORD *data = (DWORD*) this->getStitchedTexture()->getData()->getBuffer(); + int Width = this->getStitchedTexture()->getWidth(); + int Height = this->getStitchedTexture()->getHeight(); + for(AUTO_VAR(it, texturesByName.begin()); it != texturesByName.end(); ++it) + { + StitchedTexture *preStitched = (StitchedTexture *)it->second; + + bool Found = false; + int u0 = preStitched->getU0() * Width; + int u1 = preStitched->getU1() * Width; + int v0 = preStitched->getV0() * Height; + int v1 = preStitched->getV1() * Height; + + // check all the texels for this icon. If ANY are transparent we mark it as 'cut out' + for( int v = v0;v < v1; v+= 1 ) + { + for( int u = u0;u < u1; u+= 1 ) + { + // is this texel alpha value < 0.1 + if( (data[v * Width + u] & 0xff000000) < 0x20000000 ) + { + // this texel is transparent. Mark the icon as such and bail + preStitched->setFlags(Icon::IS_ALPHA_CUT_OUT); + Found = true; + break; + } + } + + if( Found ) + { + // move onto the next icon + break; + } + } + } +#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 + app.DebugPrintf("Not implemented!\n"); + __debugbreak(); +#endif + return NULL; +#if 0 + StitchedTexture *result = texturesByName.find(name)->second; + if (result == NULL) result = missingPosition; + return result; +#endif +} + +void PreStitchedTextureMap::cycleAnimationFrames() +{ + //for (StitchedTexture texture : animatedTextures) + for(AUTO_VAR(it, animatedTextures.begin() ); it != animatedTextures.end(); ++it) + { + StitchedTexture *texture = *it; + texture->cycleFrames(); + } +} + +Texture *PreStitchedTextureMap::getStitchedTexture() +{ + return stitchResult; +} + +// 4J Stu - register is a reserved keyword in C++ +Icon *PreStitchedTextureMap::registerIcon(const wstring &name) +{ + Icon *result = NULL; + if (name.empty()) + { + app.DebugPrintf("Don't register NULL\n"); +#ifndef _CONTENT_PACKAGE + __debugbreak(); +#endif + result = missingPosition; + //new RuntimeException("Don't register null!").printStackTrace(); + } + + AUTO_VAR(it, texturesByName.find(name)); + if(it != texturesByName.end()) result = it->second; + + if (result == NULL) + { +#ifndef _CONTENT_PACKAGE + app.DebugPrintf("Could not find uv data for icon %ls\n", name.c_str() ); + __debugbreak(); +#endif + result = missingPosition; + } + + return result; +} + +int PreStitchedTextureMap::getIconType() +{ + return iconType; +} + +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()) + { + // 4J Stu - We only need to populate this once at the moment as we have hardcoded positions for each texture + // If we ever load that dynamically, be aware that the Icon objects could currently be being used by the + // GameRenderer::runUpdate thread + return; + } + + for(AUTO_VAR(it, texturesByName.begin()); it != texturesByName.end(); ++it) + { + delete it->second; + } + texturesByName.clear(); + + if(iconType != Icon::TYPE_TERRAIN) + { + 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(); + Icon *oldClock = texturesByName[L"clock"]; + dataClock->initUVs(oldClock->getU0(), oldClock->getV0(), oldClock->getU1(), oldClock->getV1() ); + delete oldClock; + texturesByName[L"clock"] = dataClock; + + ClockTexture *clock = new ClockTexture(0, dataClock); + oldClock = texturesByName[L"clockP0"]; + clock->initUVs(oldClock->getU0(), oldClock->getV0(), oldClock->getU1(), oldClock->getV1() ); + delete oldClock; + texturesByName[L"clockP0"] = clock; + + clock = new ClockTexture(1, dataClock); + oldClock = texturesByName[L"clockP1"]; + clock->initUVs(oldClock->getU0(), oldClock->getV0(), oldClock->getU1(), oldClock->getV1() ); + delete oldClock; + texturesByName[L"clockP1"] = clock; + + clock = new ClockTexture(2, dataClock); + oldClock = texturesByName[L"clockP2"]; + clock->initUVs(oldClock->getU0(), oldClock->getV0(), oldClock->getU1(), oldClock->getV1() ); + delete oldClock; + texturesByName[L"clockP2"] = clock; + + clock = new ClockTexture(3, dataClock); + oldClock = texturesByName[L"clockP3"]; + clock->initUVs(oldClock->getU0(), oldClock->getV0(), oldClock->getU1(), oldClock->getV1() ); + delete oldClock; + texturesByName[L"clockP3"] = clock; + + CompassTexture *dataCompass = new CompassTexture(); + Icon *oldCompass = texturesByName[L"compass"]; + dataCompass->initUVs(oldCompass->getU0(), oldCompass->getV0(), oldCompass->getU1(), oldCompass->getV1() ); + delete oldCompass; + texturesByName[L"compass"] = dataCompass; + + CompassTexture *compass = new CompassTexture(0, dataCompass); + oldCompass = texturesByName[L"compassP0"]; + compass->initUVs(oldCompass->getU0(), oldCompass->getV0(), oldCompass->getU1(), oldCompass->getV1() ); + delete oldCompass; + texturesByName[L"compassP0"] = compass; + + compass = new CompassTexture(1, dataCompass); + oldCompass = texturesByName[L"compassP1"]; + compass->initUVs(oldCompass->getU0(), oldCompass->getV0(), oldCompass->getU1(), oldCompass->getV1() ); + delete oldCompass; + texturesByName[L"compassP1"] = compass; + + compass = new CompassTexture(2, dataCompass); + oldCompass = texturesByName[L"compassP2"]; + compass->initUVs(oldCompass->getU0(), oldCompass->getV0(), oldCompass->getU1(), oldCompass->getV1() ); + delete oldCompass; + texturesByName[L"compassP2"] = compass; + + compass = new CompassTexture(3, dataCompass); + oldCompass = texturesByName[L"compassP3"]; + compass->initUVs(oldCompass->getU0(), oldCompass->getV0(), oldCompass->getU1(), oldCompass->getV1() ); + delete oldCompass; + texturesByName[L"compassP3"] = compass; + } + else + { + 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 + 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 + 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 new file mode 100644 index 00000000..882a7eae --- /dev/null +++ b/Minecraft.Client/PreStitchedTextureMap.h @@ -0,0 +1,54 @@ +#pragma once +using namespace std; + +#include "..\Minecraft.World\IconRegister.h" + +class Icon; +class StitchedTexture; +class Texture; +class BufferedImage; + +// 4J Added this class to stop having to do texture stitching at runtime +class PreStitchedTextureMap : public IconRegister +{ +public: + static const wstring NAME_MISSING_TEXTURE; + +private: + const int iconType; + + const wstring name; + const wstring path; + const wstring extension; + + bool m_mipMap; + + typedef unordered_map stringIconMap; + stringIconMap texturesByName; // = new HashMap(); + BufferedImage *missingTexture; // = new BufferedImage(64, 64, BufferedImage.TYPE_INT_ARGB); + StitchedTexture *missingPosition; + Texture *stitchResult; + vector animatedTextures; // = new ArrayList(); + + 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(); + + // 4J Stu - register is a reserved keyword in C++ + Icon *registerIcon(const wstring &name); + + int getIconType(); + Icon *getMissingIcon(); + + int getFlags() const; +}; \ No newline at end of file diff --git a/Minecraft.Client/ProgressRenderer.cpp b/Minecraft.Client/ProgressRenderer.cpp new file mode 100644 index 00000000..a7c3fd30 --- /dev/null +++ b/Minecraft.Client/ProgressRenderer.cpp @@ -0,0 +1,214 @@ +#include "stdafx.h" +#include "Tesselator.h" +#include "Textures.h" +#include "ProgressRenderer.h" +#include "..\Minecraft.World\System.h" + +CRITICAL_SECTION ProgressRenderer::s_progress; + +ProgressRenderer::ProgressRenderer(Minecraft *minecraft) +{ + status = -1; + title = -1; + lastTime = System::currentTimeMillis(); + noAbort = false; + this->minecraft = minecraft; + this->m_eType=eProgressStringType_ID; +} + +void ProgressRenderer::progressStart(int title) +{ + noAbort = false; + _progressStart(title); +} + +void ProgressRenderer::progressStartNoAbort(int string) +{ + noAbort = true; + _progressStart(string); +} + +void ProgressRenderer::_progressStart(int title) +{ + // 4J Stu - Removing all progressRenderer rendering. This will be replaced on the xbox + if (!minecraft->running) + { + if (noAbort) return; +// throw new StopGameException(); // 4J - removed + } + + EnterCriticalSection( &ProgressRenderer::s_progress ); + lastPercent = 0; + this->title = title; + LeaveCriticalSection( &ProgressRenderer::s_progress ); + +#if 0 + ScreenSizeCalculator ssc(minecraft->options, minecraft->width, minecraft->height); + + glClear(GL_DEPTH_BUFFER_BIT); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho(0, (float)ssc.rawWidth, (float)ssc.rawHeight, 0, 100, 300); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glTranslatef(0, 0, -200); +#endif +} + +void ProgressRenderer::progressStage(int status) +{ + if (!minecraft->running) + { + if (noAbort) return; +// throw new StopGameException(); // 4J - removed + } + + + lastTime = 0; + EnterCriticalSection( &ProgressRenderer::s_progress ); + setType(eProgressStringType_ID); + this->status = status; + LeaveCriticalSection( &ProgressRenderer::s_progress ); + progressStagePercentage(-1); + lastTime = 0; +} + +void ProgressRenderer::progressStagePercentage(int i) +{ + // 4J Stu - Removing all progressRenderer rendering. This will be replaced on the xbox + EnterCriticalSection( &ProgressRenderer::s_progress ); + lastPercent = i; + LeaveCriticalSection( &ProgressRenderer::s_progress ); + +#if 0 + if (!minecraft->running) + { + if (noAbort) return; +// throw new StopGameException(); // 4J - removed + } + + + __int64 now = System::currentTimeMillis(); + if (now - lastTime < 20) return; + lastTime = now; + + ScreenSizeCalculator ssc(minecraft->options, minecraft->width, minecraft->height); + int screenWidth = ssc.getWidth(); + int screenHeight = ssc.getHeight(); + + glClear(GL_DEPTH_BUFFER_BIT); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho(0, (float)ssc.rawWidth, (float)ssc.rawHeight, 0, 100, 300); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glTranslatef(0, 0, -200); + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + Tesselator *t = Tesselator::getInstance(); + int id = minecraft->textures->loadTexture(L"/gui/background.png"); + glBindTexture(GL_TEXTURE_2D, id); + float s = 32; + t->begin(); + t->color(0x404040); + t->vertexUV((float)(0), (float)( screenHeight), (float)( 0), (float)( 0), (float)( screenHeight / s)); + t->vertexUV((float)(screenWidth), (float)( screenHeight), (float)( 0), (float)( screenWidth / s), (float)( screenHeight / s)); + t->vertexUV((float)(screenWidth), (float)( 0), (float)( 0), (float)( screenWidth / s), (float)( 0)); + t->vertexUV((float)(0), (float)( 0), (float)( 0), (float)( 0), (float)( 0)); + t->end(); + + if (i >= 0) + { + int w = 100; + int h = 2; + int x = screenWidth / 2 - w / 2; + int y = screenHeight / 2 + 16; + + glDisable(GL_TEXTURE_2D); + t->begin(); + t->color(0x808080); + t->vertex((float)(x), (float)( y), (float)( 0)); + t->vertex((float)(x), (float)( y + h), (float)( 0)); + t->vertex((float)(x + w), (float)( y + h), (float)( 0)); + t->vertex((float)(x + w), (float)( y), (float)( 0)); + + t->color(0x80ff80); + t->vertex((float)(x), (float)( y), (float)( 0)); + t->vertex((float)(x), (float)( y + h), (float)( 0)); + t->vertex((float)(x + i), (float)( y + h), (float)( 0)); + t->vertex((float)(x + i), (float)( y), (float)( 0)); + t->end(); + glEnable(GL_TEXTURE_2D); + } + + minecraft->font->drawShadow(title, (screenWidth - minecraft->font->width(title)) / 2, screenHeight / 2 - 4 - 16, 0xffffff); + minecraft->font->drawShadow(status, (screenWidth - minecraft->font->width(status)) / 2, screenHeight / 2 - 4 + 8, 0xffffff); + Display::update(); + + /* // 4J - removed + try { + Thread.yield(); + } catch (Exception e) { + } + */ +#endif +} + +int ProgressRenderer::getCurrentPercent() +{ + int returnValue = 0; + EnterCriticalSection( &ProgressRenderer::s_progress ); + returnValue = lastPercent; + LeaveCriticalSection( &ProgressRenderer::s_progress ); + return returnValue; +} + +int ProgressRenderer::getCurrentTitle() +{ + EnterCriticalSection( &ProgressRenderer::s_progress ); + int returnValue = title; + LeaveCriticalSection( &ProgressRenderer::s_progress ); + return returnValue; +} + +int ProgressRenderer::getCurrentStatus() +{ + EnterCriticalSection( &ProgressRenderer::s_progress ); + int returnValue = status; + LeaveCriticalSection( &ProgressRenderer::s_progress ); + return returnValue; +} + +ProgressRenderer::eProgressStringType ProgressRenderer::getType() +{ + EnterCriticalSection( &ProgressRenderer::s_progress ); + eProgressStringType returnValue = m_eType; + LeaveCriticalSection( &ProgressRenderer::s_progress ); + return returnValue; +} + +void ProgressRenderer::setType(eProgressStringType eType) +{ + EnterCriticalSection( &ProgressRenderer::s_progress ); + m_eType=eType; + LeaveCriticalSection( &ProgressRenderer::s_progress ); +} + +void ProgressRenderer::progressStage(wstring &wstrText) +{ + EnterCriticalSection( &ProgressRenderer::s_progress ); + m_wstrText=wstrText; + setType(eProgressStringType_String); + LeaveCriticalSection( &ProgressRenderer::s_progress ); +} + +wstring& ProgressRenderer::getProgressString(void) +{ + EnterCriticalSection( &ProgressRenderer::s_progress ); + wstring &temp=m_wstrText; + LeaveCriticalSection( &ProgressRenderer::s_progress ); + return temp; +} + + diff --git a/Minecraft.Client/ProgressRenderer.h b/Minecraft.Client/ProgressRenderer.h new file mode 100644 index 00000000..29c847d0 --- /dev/null +++ b/Minecraft.Client/ProgressRenderer.h @@ -0,0 +1,43 @@ +#pragma once +#include "..\Minecraft.World\ProgressListener.h" + +class ProgressRenderer : public ProgressListener +{ +public: + enum eProgressStringType + { + eProgressStringType_ID, + eProgressStringType_String, // 4J-PB added for updating the bytes read on a save transfer + }; + + static CRITICAL_SECTION s_progress; + + int getCurrentPercent(); + int getCurrentTitle(); + int getCurrentStatus(); + wstring& getProgressString(void); + ProgressRenderer::eProgressStringType getType(); + +private: + int lastPercent; + +private: + int status; + Minecraft *minecraft; + int title; + __int64 lastTime; + bool noAbort; + wstring m_wstrText; + eProgressStringType m_eType; + + void setType(eProgressStringType eType); + +public: + ProgressRenderer(Minecraft *minecraft); + virtual void progressStart(int title); + virtual void progressStartNoAbort(int string); + void _progressStart(int title); + virtual void progressStage(int status); + virtual void progressStage(wstring &wstrText); + virtual void progressStagePercentage(int i); +}; \ No newline at end of file diff --git a/Minecraft.Client/QuadrupedModel.cpp b/Minecraft.Client/QuadrupedModel.cpp new file mode 100644 index 00000000..ea041910 --- /dev/null +++ b/Minecraft.Client/QuadrupedModel.cpp @@ -0,0 +1,131 @@ +#include "stdafx.h" +#include "QuadrupedModel.h" +#include "..\Minecraft.World\Mth.h" +#include "ModelPart.h" + +QuadrupedModel::QuadrupedModel(int legSize, float g) : Model() +{ + yHeadOffs = 8; + zHeadOffs = 4; + + head = new ModelPart(this, 0, 0); + head->addBox(-4, -4, -8, 8, 8, 8, g); // Head + head->setPos(0, (float)(12 + 6 - legSize), -6); + + body = new ModelPart(this, 28, 8); + body->addBox(-5, -10, -7, 10, 16, 8, g); // Body + body->setPos(0, (float)(11 + 6 - legSize), 2); + + leg0 = new ModelPart(this, 0, 16); + leg0->addBox(-2, 0, -2, 4, legSize, 4, g); // Leg0 + leg0->setPos(-3, (float)(18 + 6 - legSize), 7); + + leg1 = new ModelPart(this, 0, 16); + leg1->addBox(-2, 0, -2, 4, legSize, 4, g); // Leg1 + leg1->setPos(3, (float)(18 + 6 - legSize), 7); + + leg2 = new ModelPart(this, 0, 16); + leg2->addBox(-2, 0, -2, 4, legSize, 4, g); // Leg2 + leg2->setPos(-3, (float)(18 + 6 - legSize), -5); + + leg3 = new ModelPart(this, 0, 16); + leg3->addBox(-2, 0, -2, 4, legSize, 4, g); // Leg3 + leg3->setPos(3, (float)(18 + 6 - legSize), -5); + + // 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); + leg0->compile(1.0f/16.0f); + leg1->compile(1.0f/16.0f); + leg2->compile(1.0f/16.0f); + leg3->compile(1.0f/16.0f); +} + +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, entity); + + if (young) + { + float ss = 2.0f; + glPushMatrix(); + glTranslatef(0, yHeadOffs * scale, zHeadOffs * scale); + head->render(scale,usecompiled); + glPopMatrix(); + glPushMatrix(); + glScalef(1 / ss, 1 / ss, 1 / ss); + glTranslatef(0, 24 * scale, 0); + body->render(scale, usecompiled); + leg0->render(scale, usecompiled); + leg1->render(scale, usecompiled); + leg2->render(scale, usecompiled); + leg3->render(scale, usecompiled); + glPopMatrix(); + } + else + { + head->render(scale, usecompiled); + body->render(scale, usecompiled); + leg0->render(scale, usecompiled); + leg1->render(scale, usecompiled); + leg2->render(scale, usecompiled); + leg3->render(scale, usecompiled); + } +} + +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; + head->yRot = yRot / rad; + body->xRot = 90 / rad; + + leg0->xRot = (Mth::cos(time * 0.6662f) * 1.4f) * r; + leg1->xRot = (Mth::cos(time * 0.6662f + PI) * 1.4f) * r; + leg2->xRot = (Mth::cos(time * 0.6662f + PI) * 1.4f) * r; + leg3->xRot = (Mth::cos(time * 0.6662f) * 1.4f) * r; +} + +void QuadrupedModel::render(QuadrupedModel *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; + + leg0->xRot = model->leg0->xRot; + leg1->xRot = model->leg1->xRot; + leg2->xRot = model->leg2->xRot; + leg3->xRot = model->leg3->xRot; + + if (young) + { + float ss = 2.0f; + glPushMatrix(); + glTranslatef(0, 8 * 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); + leg0->render(scale, usecompiled); + leg1->render(scale, usecompiled); + leg2->render(scale, usecompiled); + leg3->render(scale, usecompiled); + glPopMatrix(); + } + else + { + head->render(scale, usecompiled); + body->render(scale, usecompiled); + leg0->render(scale, usecompiled); + leg1->render(scale, usecompiled); + leg2->render(scale, usecompiled); + leg3->render(scale, usecompiled); + } +} diff --git a/Minecraft.Client/QuadrupedModel.h b/Minecraft.Client/QuadrupedModel.h new file mode 100644 index 00000000..a497b109 --- /dev/null +++ b/Minecraft.Client/QuadrupedModel.h @@ -0,0 +1,13 @@ +#pragma once +#include "Model.h" + +class QuadrupedModel : public Model +{ +public: + ModelPart *head, *body, *leg0, *leg1, *leg2, *leg3; + + 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, 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/ReadMe.txt b/Minecraft.Client/ReadMe.txt new file mode 100644 index 00000000..f5f0faa1 --- /dev/null +++ b/Minecraft.Client/ReadMe.txt @@ -0,0 +1,27 @@ +======================================================================== + Xbox 360 APPLICATION : Minecraft.Client Project Overview +======================================================================== + +AppWizard has created this Minecraft.Client application for you. + +This file contains a summary of what you will find in each of the files that +make up your Minecraft.Client application. + +Minecraft.Client.vcxproj + This is the main project file for VC++ projects generated using an Application Wizard. + It contains information about the version of Visual C++ that generated the file, and + information about the platforms, configurations, and project features selected with the + Application Wizard. + +Minecraft.Client.cpp + This is the main application source file. + + + +///////////////////////////////////////////////////////////////////////////// +Other notes: + +AppWizard uses "TODO:" comments to indicate parts of the source code you +should add to or customize. + +///////////////////////////////////////////////////////////////////////////// diff --git a/Minecraft.Client/ReceivingLevelScreen.cpp b/Minecraft.Client/ReceivingLevelScreen.cpp new file mode 100644 index 00000000..0e9fe3ec --- /dev/null +++ b/Minecraft.Client/ReceivingLevelScreen.cpp @@ -0,0 +1,47 @@ +#include "stdafx.h" +#include "ReceivingLevelScreen.h" +#include "ClientConnection.h" +#include "..\Minecraft.World\net.minecraft.locale.h" + +ReceivingLevelScreen::ReceivingLevelScreen(ClientConnection *connection) +{ + tickCount = 0; + this->connection = connection; +} + +void ReceivingLevelScreen::keyPressed(char eventCharacter, int eventKey) +{ +} + +void ReceivingLevelScreen::init() +{ + buttons.clear(); +} + +void ReceivingLevelScreen::tick() +{ + tickCount++; + if (tickCount % 20 == 0) + { + connection->send( shared_ptr( new KeepAlivePacket() ) ); + } + if (connection != NULL) + { + connection->tick(); + } +} + +void ReceivingLevelScreen::buttonClicked(Button *button) +{ +} + +void ReceivingLevelScreen::render(int xm, int ym, float a) +{ + renderDirtBackground(0); + + Language *language = Language::getInstance(); + + drawCenteredString(font, language->getElement(L"multiplayer.downloadingTerrain"), width / 2, height / 2 - 50, 0xffffff); + + Screen::render(xm, ym, a); +} \ No newline at end of file diff --git a/Minecraft.Client/ReceivingLevelScreen.h b/Minecraft.Client/ReceivingLevelScreen.h new file mode 100644 index 00000000..e5a6ca8e --- /dev/null +++ b/Minecraft.Client/ReceivingLevelScreen.h @@ -0,0 +1,24 @@ +#pragma once +#include "Screen.h" +class ClientConnection; + +class ReceivingLevelScreen : public Screen +{ +private: + ClientConnection *connection; + int tickCount; + +public: + ReceivingLevelScreen(ClientConnection *connection); +protected: + using Screen::keyPressed; + + virtual void keyPressed(char eventCharacter, int eventKey); +public: + virtual void init(); + virtual void tick(); +protected: + virtual void buttonClicked(Button *button); +public: + virtual void render(int xm, int ym, float a); +}; diff --git a/Minecraft.Client/Rect2i.cpp b/Minecraft.Client/Rect2i.cpp new file mode 100644 index 00000000..7cd208ad --- /dev/null +++ b/Minecraft.Client/Rect2i.cpp @@ -0,0 +1,76 @@ +#include "stdafx.h" +#include "Rect2i.h" + +Rect2i::Rect2i(int x, int y, int width, int height) +{ + xPos = x; + yPos = y; + this->width = width; + this->height = height; +} + +Rect2i *Rect2i::intersect(const Rect2i *other) +{ + int x0 = xPos; + int y0 = yPos; + int x1 = xPos + width; + int y1 = yPos + height; + + int x2 = other->getX(); + int y2 = other->getY(); + int x3 = x2 + other->getWidth(); + int y3 = y2 + other->getHeight(); + + xPos = max(x0, x2); + yPos = max(y0, y2); + width = max(0, min(x1, x3) - xPos); + height = max(0, min(y1, y3) - yPos); + + return this; +} + +int Rect2i::getX() const +{ + return xPos; +} + +int Rect2i::getY() const +{ + return yPos; +} + +void Rect2i::setX(int x) +{ + xPos = x; +} + +void Rect2i::setY(int y) +{ + yPos = y; +} + +int Rect2i::getWidth() const +{ + return width; +} + +int Rect2i::getHeight() const +{ + return height; +} + +void Rect2i::setWidth(int width) +{ + this->width = width; +} + +void Rect2i::setHeight(int height) +{ + this->height = height; +} + +void Rect2i::setPosition(int x, int y) +{ + xPos = x; + yPos = y; +} \ No newline at end of file diff --git a/Minecraft.Client/Rect2i.h b/Minecraft.Client/Rect2i.h new file mode 100644 index 00000000..cb9471a0 --- /dev/null +++ b/Minecraft.Client/Rect2i.h @@ -0,0 +1,24 @@ +#pragma once + +class Rect2i +{ +private: + int xPos; + int yPos; + int width; + int height; + +public: + Rect2i(int x, int y, int width, int height); + + Rect2i *intersect(const Rect2i *other); + int getX() const; + int getY() const; + void setX(int x); + void setY(int y); + int getWidth() const; + int getHeight() const; + void setWidth(int width); + void setHeight(int height); + void setPosition(int x, int y); +}; \ No newline at end of file diff --git a/Minecraft.Client/RedDustParticle.cpp b/Minecraft.Client/RedDustParticle.cpp new file mode 100644 index 00000000..6a6ad1e1 --- /dev/null +++ b/Minecraft.Client/RedDustParticle.cpp @@ -0,0 +1,75 @@ +#include "stdafx.h" +#include "..\Minecraft.World\JavaMath.h" +#include "RedDustParticle.h" + +void RedDustParticle::init(Level *level, double x, double y, double z, float scale, float rCol, float gCol, float bCol) +{ + xd *= 0.1f; + yd *= 0.1f; + zd *= 0.1f; + + // 4J Stu - If they are all 0 then this particle has been created differently + // If just red is 0 it could be because we have made redstone a completely different colour (eg blue) + if (rCol == 0 && gCol == 0 && bCol == 0) + { + rCol = 1; + } + float brr = (float) Math::random() * 0.4f + 0.6f; + this->rCol = ((float) (Math::random() * 0.2f) + 0.8f) * rCol * brr; + this->gCol = ((float) (Math::random() * 0.2f) + 0.8f) * gCol * brr; + this->bCol = ((float) (Math::random() * 0.2f) + 0.8f) * bCol * brr; + size *= 0.75f; + size *= scale; + oSize = size; + + lifetime = (int) (8 / (Math::random() * 0.8 + 0.2)); + lifetime = (int)(lifetime * scale); + noPhysics = false; +} + +RedDustParticle::RedDustParticle(Level *level, double x, double y, double z, float rCol, float gCol, float bCol) : Particle(level, x, y, z, 0, 0, 0) +{ + init(level, x, y, z, 1, rCol, gCol, bCol); +} + +RedDustParticle::RedDustParticle(Level *level, double x, double y, double z, float scale, float rCol, float gCol, float bCol) : Particle(level, x, y, z, 0, 0, 0) +{ + init(level, x, y, z, scale, rCol, gCol, bCol); +} + +void RedDustParticle::render(Tesselator *t, float a, float xa, float ya, float za, float xa2, float za2) +{ + float l = ((age + a) / lifetime) * 32; + if (l < 0) l = 0; + if (l > 1) l = 1; + + size = oSize * l; + Particle::render(t, a, xa, ya, za, xa2, za2); +} + +void RedDustParticle::tick() +{ + xo = x; + yo = y; + zo = z; + + if (age++ >= lifetime) remove(); + + setMiscTex(7 - age * 8 / lifetime); + + move(xd, yd, zd); + if (y == yo) + { + xd *= 1.1; + zd *= 1.1; + } + xd *= 0.96f; + yd *= 0.96f; + zd *= 0.96f; + + if (onGround) + { + xd *= 0.7f; + zd *= 0.7f; + } +} diff --git a/Minecraft.Client/RedDustParticle.h b/Minecraft.Client/RedDustParticle.h new file mode 100644 index 00000000..b1903b6e --- /dev/null +++ b/Minecraft.Client/RedDustParticle.h @@ -0,0 +1,17 @@ +#pragma once +#include "Particle.h" + +class RedDustParticle : public Particle +{ +public: + virtual eINSTANCEOF GetType() { return eType_REDDUSTPARTICLE; } +private: + void init(Level *level, double x, double y, double z, float scale, float rCol, float gCol, float bCol); // 4J - added +public: + RedDustParticle(Level *level, double x, double y, double z, float rCol, float gCol, float bCol); + float oSize; + + RedDustParticle(Level *level, double x, double y, double z, float scale, float rCol, float gCol, float bCol); + virtual void render(Tesselator *t, float a, float xa, float ya, float za, float xa2, float za2); + virtual void tick(); +}; \ No newline at end of file diff --git a/Minecraft.Client/RemotePlayer.cpp b/Minecraft.Client/RemotePlayer.cpp new file mode 100644 index 00000000..bea12842 --- /dev/null +++ b/Minecraft.Client/RemotePlayer.cpp @@ -0,0 +1,151 @@ +#include "stdafx.h" +#include "RemotePlayer.h" +#include "..\Minecraft.World\net.minecraft.world.item.h" +#include "..\Minecraft.World\Mth.h" + +RemotePlayer::RemotePlayer(Level *level, const wstring& name) : Player(level, name) +{ + // 4J - added initialisers + hasStartedUsingItem = false; + lSteps = 0; + lx = ly = lz = lyr = lxr = 0.0; + fallTime = 0.0f; + + app.DebugPrintf("Created RemotePlayer with name %ls\n", name.c_str() ); + + heightOffset = 0; + footSize = 0; + + noPhysics = true; + + bedOffsetY = 4 / 16.0f; + + viewScale = 10; +} + +void RemotePlayer::setDefaultHeadHeight() +{ + heightOffset = 0; +} + +bool RemotePlayer::hurt(DamageSource *source, float dmg) +{ + return true; +} + +void RemotePlayer::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 RemotePlayer::tick() +{ + bedOffsetY = 0 / 16.0f; + Player::tick(); + + 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; + + if (!hasStartedUsingItem && isUsingItemFlag() && inventory->items[inventory->selected] != NULL) + { + shared_ptr item = inventory->items[inventory->selected]; + startUsingItem(inventory->items[inventory->selected], Item::items[item->id]->getUseDuration(item)); + hasStartedUsingItem = true; + } + else if (hasStartedUsingItem && !isUsingItemFlag()) + { + stopUsingItem(); + hasStartedUsingItem = false; + } + + // if (eatItem != null) { + // if (eatItemTickCount <= 25 && eatItemTickCount % 4 == 0) { + // spawnEatParticles(eatItem, 5); + // } + // eatItemTickCount--; + // if (eatItemTickCount <= 0) { + // spawnEatParticles(eatItem, 16); + // swing(); + // eatItem = null; + // } + // } +} + +float RemotePlayer::getShadowHeightOffs() +{ + return 0; +} + +void RemotePlayer::aiStep() +{ + Player::serverAiStep(); + if (lSteps > 0) + { + double xt = x + (lx - x) / lSteps; + double yt = y + (ly - y) / lSteps; + double zt = z + (lz - z) / lSteps; + + double yrd = lyr - yRot; + while (yrd < -180) + yrd += 360; + while (yrd >= 180) + yrd -= 360; + + yRot += (float)((yrd) / lSteps); + xRot += (float)((lxr - xRot) / lSteps); + + lSteps--; + setPos(xt, yt, zt); + setRot(yRot, xRot); + } + oBob = bob; + + float tBob = (float) Mth::sqrt(xd * xd + zd * zd); + float tTilt = (float) atan(-yd * 0.2f) * 15.0f; + if (tBob > 0.1f) tBob = 0.1f; + if (!onGround || getHealth() <= 0) tBob = 0; + if (onGround || getHealth() <= 0) tTilt = 0; + bob += (tBob - bob) * 0.4f; + tilt += (tTilt - tilt) * 0.8f; + +} + +// 4J Stu - Brought forward change from 1.3 to fix #64688 - Customer Encountered: TU7: Content: Art: Aura of enchanted item is not displayed for other players in online game +void RemotePlayer::setEquippedSlot(int slot, shared_ptr item) +{ + if (slot == 0) + { + inventory->items[inventory->selected] = item; + } + else + { + inventory->armor[slot - 1] = item; + } +} + +void RemotePlayer::animateRespawn() +{ +// Player.animateRespawn(this, level); +} + +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 new file mode 100644 index 00000000..3fab1dde --- /dev/null +++ b/Minecraft.Client/RemotePlayer.h @@ -0,0 +1,37 @@ +#pragma once +#include "..\Minecraft.World\SmoothFloat.h" +#include "..\Minecraft.World\net.minecraft.world.entity.player.h" + +class Input; + +class RemotePlayer : public Player +{ +public: + eINSTANCEOF GetType() { return eTYPE_REMOTEPLAYER; } + +private: + bool hasStartedUsingItem; +public: + Input *input; + RemotePlayer(Level *level, const wstring& name); +protected: + virtual void setDefaultHeadHeight(); +public: + virtual bool hurt(DamageSource *source, float dmg); +private: + int lSteps; + double lx, ly, lz, lyr, lxr; + +public: + virtual void lerpTo(double x, double y, double z, float yRot, float xRot, int steps); + float fallTime; + + virtual void tick(); + virtual float getShadowHeightOffs(); + virtual void aiStep(); + virtual void setEquippedSlot(int slot, shared_ptr item);// 4J Stu - Brought forward change from 1.3 to fix #64688 - Customer Encountered: TU7: Content: Art: Aura of enchanted item is not displayed for other players in online game + virtual void animateRespawn(); + virtual float getHeadHeight(); + bool hasPermission(EGameCommand command) { return false; } + virtual Pos getCommandSenderWorldPosition(); +}; \ No newline at end of file diff --git a/Minecraft.Client/RenameWorldScreen.cpp b/Minecraft.Client/RenameWorldScreen.cpp new file mode 100644 index 00000000..ea05039a --- /dev/null +++ b/Minecraft.Client/RenameWorldScreen.cpp @@ -0,0 +1,96 @@ +#include "stdafx.h" +#include "RenameWorldScreen.h" +#include "EditBox.h" +#include "Button.h" +#include "..\Minecraft.World\net.minecraft.locale.h" +#include "..\Minecraft.World\net.minecraft.world.level.h" +#include "..\Minecraft.World\net.minecraft.world.level.storage.h" + +RenameWorldScreen::RenameWorldScreen(Screen *lastScreen, const wstring& levelId) +{ + nameEdit = NULL; + this->lastScreen = lastScreen; + this->levelId = levelId; +} + +void RenameWorldScreen::tick() +{ + nameEdit->tick(); +} + +void RenameWorldScreen::init() +{ + // 4J Stu - Removed this as we don't need the screen. Changed to how we pass save data around stopped this compiling +#if 0 + Language *language = Language::getInstance(); + + Keyboard::enableRepeatEvents(true); + buttons.clear(); + buttons.push_back(new Button(0, width / 2 - 100, height / 4 + 24 * 4 + 12, language->getElement(L"selectWorld.renameButton"))); + buttons.push_back(new Button(1, width / 2 - 100, height / 4 + 24 * 5 + 12, language->getElement(L"gui.cancel"))); + + LevelStorageSource *levelSource = minecraft->getLevelSource(); + LevelData *levelData = levelSource->getDataTagFor(levelId); + wstring currentName = levelData->getLevelName(); + + nameEdit = new EditBox(this, font, width / 2 - 100, 60, 200, 20, currentName); + nameEdit->inFocus = true; + nameEdit->setMaxLength(32); +#endif +} + +void RenameWorldScreen::removed() +{ + Keyboard::enableRepeatEvents(false); +} + +void RenameWorldScreen::buttonClicked(Button *button) +{ + if (!button->active) return; + if (button->id == 1) + { + minecraft->setScreen(lastScreen); + } + else if (button->id == 0) + { + + LevelStorageSource *levelSource = minecraft->getLevelSource(); + levelSource->renameLevel(levelId, trimString(nameEdit->getValue())); + + minecraft->setScreen(lastScreen); + } +} + +void RenameWorldScreen::keyPressed(wchar_t ch, int eventKey) +{ + nameEdit->keyPressed(ch, eventKey); + buttons[0]->active = trimString(nameEdit->getValue()).length() > 0; + + if (ch == 13) + { + buttonClicked(buttons[0]); + } +} + +void RenameWorldScreen::mouseClicked(int x, int y, int buttonNum) +{ + Screen::mouseClicked(x, y, buttonNum); + + nameEdit->mouseClicked(x, y, buttonNum); +} + +void RenameWorldScreen::render(int xm, int ym, float a) +{ + Language *language = Language::getInstance(); + + // fill(0, 0, width, height, 0x40000000); + renderBackground(); + + drawCenteredString(font, language->getElement(L"selectWorld.renameTitle"), width / 2, height / 4 - 60 + 20, 0xffffff); + drawString(font, language->getElement(L"selectWorld.enterName"), width / 2 - 100, 47, 0xa0a0a0); + + nameEdit->render(); + + Screen::render(xm, ym, a); + +} \ No newline at end of file diff --git a/Minecraft.Client/RenameWorldScreen.h b/Minecraft.Client/RenameWorldScreen.h new file mode 100644 index 00000000..36addf72 --- /dev/null +++ b/Minecraft.Client/RenameWorldScreen.h @@ -0,0 +1,25 @@ +#pragma once +#include "Screen.h" +class Button; +class EditBox; +using namespace std; + +class RenameWorldScreen : public Screen +{ +private: + Screen *lastScreen; + EditBox *nameEdit; + wstring levelId; + +public: + RenameWorldScreen(Screen *lastScreen, const wstring& levelId); + virtual void tick(); + virtual void init() ; + virtual void removed(); +protected: + virtual void buttonClicked(Button *button); + virtual void keyPressed(wchar_t ch, int eventKey); + virtual void mouseClicked(int x, int y, int buttonNum); +public: + virtual void render(int xm, int ym, float a); +}; \ 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/Screen.cpp b/Minecraft.Client/Screen.cpp new file mode 100644 index 00000000..0019b54d --- /dev/null +++ b/Minecraft.Client/Screen.cpp @@ -0,0 +1,202 @@ +#include "stdafx.h" +#include "Screen.h" +#include "Button.h" +#include "GuiParticles.h" +#include "Tesselator.h" +#include "Textures.h" +#include "..\Minecraft.World\SoundTypes.h" + + + +Screen::Screen() // 4J added +{ + minecraft = NULL; + width = 0; + height = 0; + passEvents = false; + font = NULL; + particles = NULL; + clickedButton = NULL; +} + +void Screen::render(int xm, int ym, float a) +{ + AUTO_VAR(itEnd, buttons.end()); + for (AUTO_VAR(it, buttons.begin()); it != itEnd; it++) + { + Button *button = *it; //buttons[i]; + button->render(minecraft, xm, ym); + } +} + +void Screen::keyPressed(wchar_t eventCharacter, int eventKey) +{ + if (eventKey == Keyboard::KEY_ESCAPE) + { + minecraft->setScreen(NULL); +// minecraft->grabMouse(); // 4J - removed + } +} + +wstring Screen::getClipboard() +{ + // 4J - removed + return NULL; +} + +void Screen::setClipboard(const wstring& str) +{ + // 4J - removed +} + +void Screen::mouseClicked(int x, int y, int buttonNum) +{ + if (buttonNum == 0) + { + AUTO_VAR(itEnd, buttons.end()); + for (AUTO_VAR(it, buttons.begin()); it != itEnd; it++) + { + Button *button = *it; //buttons[i]; + if (button->clicked(minecraft, x, y)) + { + clickedButton = button; + minecraft->soundEngine->playUI(eSoundType_RANDOM_CLICK, 1, 1); + buttonClicked(button); + } + } + } +} + +void Screen::mouseReleased(int x, int y, int buttonNum) +{ + if (clickedButton!=NULL && buttonNum==0) + { + clickedButton->released(x, y); + clickedButton = NULL; + } +} + +void Screen::buttonClicked(Button *button) +{ +} + +void Screen::init(Minecraft *minecraft, int width, int height) +{ + particles = new GuiParticles(minecraft); + this->minecraft = minecraft; + this->font = minecraft->font; + this->width = width; + this->height = height; + buttons.clear(); + init(); +} + +void Screen::setSize(int width, int height) +{ + this->width = width; + this->height = height; +} + +void Screen::init() +{ +} + +void Screen::updateEvents() +{ + /* 4J - TODO + while (Mouse.next()) { + mouseEvent(); + } + + while (Keyboard.next()) { + keyboardEvent(); + } + */ + +} + +void Screen::mouseEvent() +{ + /* 4J - TODO + if (Mouse.getEventButtonState()) { + int xm = Mouse.getEventX() * width / minecraft.width; + int ym = height - Mouse.getEventY() * height / minecraft.height - 1; + mouseClicked(xm, ym, Mouse.getEventButton()); + } else { + int xm = Mouse.getEventX() * width / minecraft.width; + int ym = height - Mouse.getEventY() * height / minecraft.height - 1; + mouseReleased(xm, ym, Mouse.getEventButton()); + } + */ +} + +void Screen::keyboardEvent() +{ + /* 4J - TODO + if (Keyboard.getEventKeyState()) { + if (Keyboard.getEventKey() == Keyboard.KEY_F11) { + minecraft.toggleFullScreen(); + return; + } + keyPressed(Keyboard.getEventCharacter(), Keyboard.getEventKey()); + } + */ +} + +void Screen::tick() +{ +} + +void Screen::removed() +{ +} + +void Screen::renderBackground() +{ + renderBackground(0); +} + +void Screen::renderBackground(int vo) +{ + if (minecraft->level != NULL) + { + fillGradient(0, 0, width, height, 0xc0101010, 0xd0101010); + } + else + { + renderDirtBackground(vo); + } +} + +void Screen::renderDirtBackground(int vo) +{ + // 4J Unused +#if 0 + glDisable(GL_LIGHTING); + glDisable(GL_FOG); + Tesselator *t = Tesselator::getInstance(); + glBindTexture(GL_TEXTURE_2D, minecraft->textures->loadTexture(L"/gui/background.png")); + glColor4f(1, 1, 1, 1); + float s = 32; + t->begin(); + t->color(0x404040); + t->vertexUV((float)(0), (float)( height), (float)( 0), (float)( 0), (float)( height / s + vo)); + t->vertexUV((float)(width), (float)( height), (float)( 0), (float)( width / s), (float)( height / s + vo)); + t->vertexUV((float)(width), (float)( 0), (float)( 0), (float)( width / s), (float)( 0 + vo)); + t->vertexUV((float)(0), (float)( 0), (float)( 0), (float)( 0), (float)( 0 + vo)); + t->end(); +#endif +} + +bool Screen::isPauseScreen() +{ + return true; +} + +void Screen::confirmResult(bool result, int id) +{ +} + +void Screen::tabPressed() +{ +} diff --git a/Minecraft.Client/Screen.h b/Minecraft.Client/Screen.h new file mode 100644 index 00000000..50deb1d0 --- /dev/null +++ b/Minecraft.Client/Screen.h @@ -0,0 +1,54 @@ +#pragma once +#include "GuiComponent.h" +class Button; +class GuiParticles; +class Minecraft; +using namespace std; + +class Screen : public GuiComponent +{ +protected: + Minecraft *minecraft; +public: + int width; + int height; +protected: + vector